webcodecs-utils 0.2.0 → 0.2.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.cjs +21 -21
- package/dist/index.js +839 -806
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
1
|
+
import Fn from "lamejs";
|
|
2
|
+
import Jn, { DataStream as bs } from "mp4box";
|
|
3
3
|
function G1(t, e, i = 30, n = "good") {
|
|
4
4
|
const d = t * e, o = {
|
|
5
5
|
low: 0.05,
|
|
@@ -9,7 +9,7 @@ function G1(t, e, i = 30, n = "good") {
|
|
|
9
9
|
}, m = o[n] || o.good;
|
|
10
10
|
return d * i * m;
|
|
11
11
|
}
|
|
12
|
-
function
|
|
12
|
+
function v1(t, e, i, n) {
|
|
13
13
|
const d = [
|
|
14
14
|
{ maxMacroblocks: 99, maxBitrate: 64e3, level: 10 },
|
|
15
15
|
// Level 1
|
|
@@ -171,18 +171,18 @@ function S1(t, e, i, n) {
|
|
|
171
171
|
{ maxPictureSize: 35651584, maxBitrate: 8e8, tier: "H", level: 19 }
|
|
172
172
|
// Level 6.3 (High Tier)
|
|
173
173
|
];
|
|
174
|
-
function
|
|
174
|
+
function S(W) {
|
|
175
175
|
return W ? W[W.length - 1] : void 0;
|
|
176
176
|
}
|
|
177
177
|
if (t === "avc") {
|
|
178
178
|
const v = Math.ceil(e / 16) * Math.ceil(i / 16), Z = d.find(
|
|
179
179
|
(U) => v <= U.maxMacroblocks && n <= U.maxBitrate
|
|
180
|
-
) ??
|
|
180
|
+
) ?? S(d), O = Z ? Z.level : 0, w = "64".padStart(2, "0"), N = "00", J = O.toString(16).padStart(2, "0");
|
|
181
181
|
return `avc1.${w}${N}${J}`;
|
|
182
182
|
} else if (t === "hevc") {
|
|
183
183
|
const W = "", Z = "6", O = e * i, w = o.find(
|
|
184
184
|
(J) => O <= J.maxPictureSize && n <= J.maxBitrate
|
|
185
|
-
) ??
|
|
185
|
+
) ?? S(o);
|
|
186
186
|
return `hev1.${W}1.${Z}.${w.tier}${w.level}.B0`;
|
|
187
187
|
} else {
|
|
188
188
|
if (t === "vp8")
|
|
@@ -190,18 +190,18 @@ function S1(t, e, i, n) {
|
|
|
190
190
|
if (t === "vp9") {
|
|
191
191
|
const W = "00", v = e * i, Z = m.find(
|
|
192
192
|
(w) => v <= w.maxPictureSize && n <= w.maxBitrate
|
|
193
|
-
) ??
|
|
193
|
+
) ?? S(m);
|
|
194
194
|
return `vp09.${W}.${Z.level.toString().padStart(2, "0")}.08`;
|
|
195
195
|
} else if (t === "av1") {
|
|
196
196
|
const v = e * i, Z = h.find(
|
|
197
197
|
(N) => v <= N.maxPictureSize && n <= N.maxBitrate
|
|
198
|
-
) ??
|
|
198
|
+
) ?? S(h);
|
|
199
199
|
return `av01.0.${Z.level.toString().padStart(2, "0")}${Z.tier}.08`;
|
|
200
200
|
}
|
|
201
201
|
}
|
|
202
202
|
throw new TypeError(`Unhandled codec '${t}'.`);
|
|
203
203
|
}
|
|
204
|
-
class
|
|
204
|
+
class I1 {
|
|
205
205
|
/**
|
|
206
206
|
* Create a new GPUFrameRenderer.
|
|
207
207
|
*
|
|
@@ -420,7 +420,7 @@ class v1 {
|
|
|
420
420
|
const o = this.device.createBindGroup({
|
|
421
421
|
layout: i.getBindGroupLayout(0),
|
|
422
422
|
entries: d
|
|
423
|
-
}), m = this.device.createCommandEncoder(), h = this.context.getCurrentTexture().createView(),
|
|
423
|
+
}), m = this.device.createCommandEncoder(), h = this.context.getCurrentTexture().createView(), S = m.beginRenderPass({
|
|
424
424
|
colorAttachments: [{
|
|
425
425
|
view: h,
|
|
426
426
|
clearValue: { r: 0, g: 0, b: 0, a: 1 },
|
|
@@ -428,7 +428,7 @@ class v1 {
|
|
|
428
428
|
storeOp: "store"
|
|
429
429
|
}]
|
|
430
430
|
});
|
|
431
|
-
|
|
431
|
+
S.setPipeline(i), S.setBindGroup(0, o), S.draw(6), S.end(), this.device.queue.submit([m.finish()]);
|
|
432
432
|
}
|
|
433
433
|
async drawImageBitmap(e) {
|
|
434
434
|
const i = await createImageBitmap(e);
|
|
@@ -464,7 +464,7 @@ class v1 {
|
|
|
464
464
|
this.device && this.device.destroy();
|
|
465
465
|
}
|
|
466
466
|
}
|
|
467
|
-
function
|
|
467
|
+
function En(t) {
|
|
468
468
|
var i;
|
|
469
469
|
const e = [];
|
|
470
470
|
if ((i = t.format) != null && i.includes("planar"))
|
|
@@ -501,11 +501,11 @@ Ut.DUAL_CHANNEL = new Ut(2);
|
|
|
501
501
|
Ut.MONO = new Ut(3);
|
|
502
502
|
Ut.NOT_SET = new Ut(4);
|
|
503
503
|
var As = Ut;
|
|
504
|
-
const
|
|
505
|
-
function
|
|
504
|
+
const Nn = /* @__PURE__ */ bi(As);
|
|
505
|
+
function Pn(t) {
|
|
506
506
|
return new Int8Array(t);
|
|
507
507
|
}
|
|
508
|
-
function
|
|
508
|
+
function Un(t) {
|
|
509
509
|
return new Int16Array(t);
|
|
510
510
|
}
|
|
511
511
|
function Os(t) {
|
|
@@ -514,7 +514,7 @@ function Os(t) {
|
|
|
514
514
|
function js(t) {
|
|
515
515
|
return new Float32Array(t);
|
|
516
516
|
}
|
|
517
|
-
function
|
|
517
|
+
function zn(t) {
|
|
518
518
|
return new Float64Array(t);
|
|
519
519
|
}
|
|
520
520
|
function Qs(t) {
|
|
@@ -537,7 +537,7 @@ function Ds(t) {
|
|
|
537
537
|
}
|
|
538
538
|
function $s(t) {
|
|
539
539
|
if (t.length == 1)
|
|
540
|
-
return
|
|
540
|
+
return Un(t[0]);
|
|
541
541
|
var e = t[0];
|
|
542
542
|
t = t.slice(1);
|
|
543
543
|
for (var i = [], n = 0; n < e; n++)
|
|
@@ -600,7 +600,7 @@ Kt.vbr_rh = new Kt(2);
|
|
|
600
600
|
Kt.vbr_abr = new Kt(3);
|
|
601
601
|
Kt.vbr_mtrh = new Kt(4);
|
|
602
602
|
Kt.vbr_default = Kt.vbr_mtrh;
|
|
603
|
-
var
|
|
603
|
+
var An = function(t) {
|
|
604
604
|
}, it = {
|
|
605
605
|
System: j0,
|
|
606
606
|
VbrMode: Kt,
|
|
@@ -609,16 +609,16 @@ var zn = function(t) {
|
|
|
609
609
|
Util: pi,
|
|
610
610
|
Arrays: en,
|
|
611
611
|
new_array_n: qs,
|
|
612
|
-
new_byte:
|
|
613
|
-
new_double:
|
|
612
|
+
new_byte: Pn,
|
|
613
|
+
new_double: zn,
|
|
614
614
|
new_float: js,
|
|
615
615
|
new_float_n: Qs,
|
|
616
616
|
new_int: Os,
|
|
617
617
|
new_int_n: Ds,
|
|
618
618
|
new_short_n: $s,
|
|
619
|
-
assert:
|
|
619
|
+
assert: An
|
|
620
620
|
}, Wi, ps;
|
|
621
|
-
function
|
|
621
|
+
function On() {
|
|
622
622
|
if (ps) return Wi;
|
|
623
623
|
ps = 1;
|
|
624
624
|
var t = it, e = t.System;
|
|
@@ -929,7 +929,7 @@ function An() {
|
|
|
929
929
|
9.000838926174497,
|
|
930
930
|
-29.20218120805369
|
|
931
931
|
/* 2.384e-06/2.384e-06 */
|
|
932
|
-
],
|
|
932
|
+
], S = [
|
|
933
933
|
[
|
|
934
934
|
2382191739347913e-28,
|
|
935
935
|
6423305872147834e-28,
|
|
@@ -1087,7 +1087,7 @@ function An() {
|
|
|
1087
1087
|
-6423305872147841e-28,
|
|
1088
1088
|
-2382191739347918e-28
|
|
1089
1089
|
]
|
|
1090
|
-
], W =
|
|
1090
|
+
], W = S[o.SHORT_TYPE], v = S[o.SHORT_TYPE], Z = S[o.SHORT_TYPE], O = S[o.SHORT_TYPE], w = [
|
|
1091
1091
|
0,
|
|
1092
1092
|
1,
|
|
1093
1093
|
16,
|
|
@@ -1138,7 +1138,7 @@ function An() {
|
|
|
1138
1138
|
function J(k, I) {
|
|
1139
1139
|
for (var r = 0; r < 3; r++) {
|
|
1140
1140
|
var K, X, A, T, H, p;
|
|
1141
|
-
T = k[I + 2 * 3] *
|
|
1141
|
+
T = k[I + 2 * 3] * S[o.SHORT_TYPE][0] - k[I + 5 * 3], K = k[I + 0 * 3] * S[o.SHORT_TYPE][2] - k[I + 3 * 3], X = T + K, A = T - K, T = k[I + 5 * 3] * S[o.SHORT_TYPE][0] + k[I + 2 * 3], K = k[I + 3 * 3] * S[o.SHORT_TYPE][2] + k[I + 0 * 3], H = T + K, p = -T + K, K = (k[I + 1 * 3] * S[o.SHORT_TYPE][1] - k[I + 4 * 3]) * 2069978111953089e-26, T = (k[I + 4 * 3] * S[o.SHORT_TYPE][1] + k[I + 1 * 3]) * 2069978111953089e-26, k[I + 3 * 0] = X * 190752519173728e-25 + K, k[I + 3 * 5] = -H * 190752519173728e-25 + T, A = A * 0.8660254037844387 * 1907525191737281e-26, H = H * 0.5 * 1907525191737281e-26 + T, k[I + 3 * 1] = A - H, k[I + 3 * 2] = A + H, X = X * 0.5 * 1907525191737281e-26 - K, p = p * 0.8660254037844387 * 1907525191737281e-26, k[I + 3 * 3] = X + p, k[I + 3 * 4] = X - p, I++;
|
|
1142
1142
|
}
|
|
1143
1143
|
}
|
|
1144
1144
|
function U(k, I, r) {
|
|
@@ -1173,14 +1173,14 @@ function An() {
|
|
|
1173
1173
|
j[_][w[H]] *= k.amp_filter[H];
|
|
1174
1174
|
if (R == o.SHORT_TYPE) {
|
|
1175
1175
|
for (var _ = -12 / 4; _ < 0; _++) {
|
|
1176
|
-
var g =
|
|
1176
|
+
var g = S[o.SHORT_TYPE][_ + 3];
|
|
1177
1177
|
u[l + _ * 3 + 9] = f[9 + _][w[H]] * g - f[8 - _][w[H]], u[l + _ * 3 + 18] = f[14 - _][w[H]] * g + f[15 + _][w[H]], u[l + _ * 3 + 10] = f[15 + _][w[H]] * g - f[14 - _][w[H]], u[l + _ * 3 + 19] = j[2 - _][w[H]] * g + j[3 + _][w[H]], u[l + _ * 3 + 11] = j[3 + _][w[H]] * g - j[2 - _][w[H]], u[l + _ * 3 + 20] = j[8 - _][w[H]] * g + j[9 + _][w[H]];
|
|
1178
1178
|
}
|
|
1179
1179
|
J(u, l);
|
|
1180
1180
|
} else {
|
|
1181
1181
|
for (var P = d(18), _ = -36 / 4; _ < 0; _++) {
|
|
1182
1182
|
var a, c;
|
|
1183
|
-
a =
|
|
1183
|
+
a = S[R][_ + 27] * j[_ + 9][w[H]] + S[R][_ + 36] * j[8 - _][w[H]], c = S[R][_ + 9] * f[_ + 9][w[H]] - S[R][_ + 18] * f[8 - _][w[H]], P[_ + 9] = a - c * W[3 + _ + 9], P[_ + 18] = a * W[3 + _ + 9] + c;
|
|
1184
1184
|
}
|
|
1185
1185
|
U(u, l, P);
|
|
1186
1186
|
}
|
|
@@ -1219,15 +1219,15 @@ function sn() {
|
|
|
1219
1219
|
var m = this;
|
|
1220
1220
|
this.assign = function(h) {
|
|
1221
1221
|
i.arraycopy(h.l, 0, m.l, 0, t.SBMAX_l);
|
|
1222
|
-
for (var
|
|
1222
|
+
for (var S = 0; S < t.SBMAX_s; S++)
|
|
1223
1223
|
for (var W = 0; W < 3; W++)
|
|
1224
|
-
m.s[
|
|
1224
|
+
m.s[S][W] = h.s[S][W];
|
|
1225
1225
|
};
|
|
1226
1226
|
}
|
|
1227
1227
|
return Li = o, Li;
|
|
1228
1228
|
}
|
|
1229
1229
|
var xi, fs;
|
|
1230
|
-
function
|
|
1230
|
+
function jn() {
|
|
1231
1231
|
if (fs) return xi;
|
|
1232
1232
|
fs = 1;
|
|
1233
1233
|
var t = sn();
|
|
@@ -1247,7 +1247,7 @@ function bt() {
|
|
|
1247
1247
|
var d = t.new_float, o = t.new_float_n, m = t.new_int;
|
|
1248
1248
|
t.new_int_n;
|
|
1249
1249
|
var h = t.assert;
|
|
1250
|
-
|
|
1250
|
+
S.ENCDELAY = 576, S.POSTDELAY = 1152, S.MDCTDELAY = 48, S.FFTOFFSET = 224 + S.MDCTDELAY, S.DECDELAY = 528, S.SBLIMIT = 32, S.CBANDS = 64, S.SBPSY_l = 21, S.SBPSY_s = 12, S.SBMAX_l = 22, S.SBMAX_s = 13, S.PSFB21 = 6, S.PSFB12 = 6, S.BLKSIZE = 1024, S.HBLKSIZE = S.BLKSIZE / 2 + 1, S.BLKSIZE_s = 256, S.HBLKSIZE_s = S.BLKSIZE_s / 2 + 1, S.NORM_TYPE = 0, S.START_TYPE = 1, S.SHORT_TYPE = 2, S.STOP_TYPE = 3, S.MPG_MD_LR_LR = 0, S.MPG_MD_LR_I = 1, S.MPG_MD_MS_LR = 2, S.MPG_MD_MS_I = 3, S.fircoef = [
|
|
1251
1251
|
-0.0207887 * 5,
|
|
1252
1252
|
-0.0378413 * 5,
|
|
1253
1253
|
-0.0432472 * 5,
|
|
@@ -1258,8 +1258,8 @@ function bt() {
|
|
|
1258
1258
|
0.151365 * 5,
|
|
1259
1259
|
0.187098 * 5
|
|
1260
1260
|
];
|
|
1261
|
-
function
|
|
1262
|
-
var W =
|
|
1261
|
+
function S() {
|
|
1262
|
+
var W = On(), v = jn(), Z = S.FFTOFFSET, O = S.MPG_MD_MS_LR, w = null;
|
|
1263
1263
|
this.psy = null;
|
|
1264
1264
|
var N = null, J = null, U = null;
|
|
1265
1265
|
this.setModules = function(X, A, T, H) {
|
|
@@ -1295,8 +1295,8 @@ function bt() {
|
|
|
1295
1295
|
u < 576 * T.mode_gr ? (s[u] = 0, T.channels_out == 2 && (V[u] = 0)) : (s[u] = A[0][l], T.channels_out == 2 && (V[u] = A[1][l]), ++l);
|
|
1296
1296
|
for (p = 0; p < T.mode_gr; p++)
|
|
1297
1297
|
for (H = 0; H < T.channels_out; H++)
|
|
1298
|
-
T.l3_side.tt[p][H].block_type =
|
|
1299
|
-
k.mdct_sub48(T, s, V), h(576 >=
|
|
1298
|
+
T.l3_side.tt[p][H].block_type = S.SHORT_TYPE;
|
|
1299
|
+
k.mdct_sub48(T, s, V), h(576 >= S.FFTOFFSET), h(T.mf_size >= S.BLKSIZE + X.framesize - S.FFTOFFSET), h(T.mf_size >= 512 + X.framesize - 32);
|
|
1300
1300
|
}
|
|
1301
1301
|
}
|
|
1302
1302
|
this.lame_encode_mp3_frame = function(X, A, T, H, p, u) {
|
|
@@ -1309,7 +1309,7 @@ function bt() {
|
|
|
1309
1309
|
var ee, ae = [null, null], le = 0, re = m(2);
|
|
1310
1310
|
for (L = 0; L < f.mode_gr; L++) {
|
|
1311
1311
|
for (M = 0; M < f.channels_out; M++)
|
|
1312
|
-
ae[M] = R[M], le = 576 + L * 576 -
|
|
1312
|
+
ae[M] = R[M], le = 576 + L * 576 - S.FFTOFFSET;
|
|
1313
1313
|
if (X.VBR == i.vbr_mtrh || X.VBR == i.vbr_mt ? ee = N.L3psycho_anal_vbr(
|
|
1314
1314
|
X,
|
|
1315
1315
|
ae,
|
|
@@ -1342,9 +1342,9 @@ function bt() {
|
|
|
1342
1342
|
} else
|
|
1343
1343
|
for (L = 0; L < f.mode_gr; L++)
|
|
1344
1344
|
for (M = 0; M < f.channels_out; M++)
|
|
1345
|
-
f.l3_side.tt[L][M].block_type =
|
|
1346
|
-
if (I(f), k.mdct_sub48(f, R[0], R[1]), f.mode_ext =
|
|
1347
|
-
f.mode_ext =
|
|
1345
|
+
f.l3_side.tt[L][M].block_type = S.NORM_TYPE, f.l3_side.tt[L][M].mixed_block_flag = 0, a[L][M] = P[L][M] = 700;
|
|
1346
|
+
if (I(f), k.mdct_sub48(f, R[0], R[1]), f.mode_ext = S.MPG_MD_LR_LR, X.force_ms)
|
|
1347
|
+
f.mode_ext = S.MPG_MD_MS_LR;
|
|
1348
1348
|
else if (X.mode == MPEGMode.JOINT_STEREO) {
|
|
1349
1349
|
var he = 0, oe = 0;
|
|
1350
1350
|
for (L = 0; L < f.mode_gr; L++)
|
|
@@ -1352,7 +1352,7 @@ function bt() {
|
|
|
1352
1352
|
he += a[L][M], oe += P[L][M];
|
|
1353
1353
|
if (he <= 1 * oe) {
|
|
1354
1354
|
var Le = f.l3_side.tt[0], ze = f.l3_side.tt[f.mode_gr - 1];
|
|
1355
|
-
Le[0].block_type == Le[1].block_type && ze[0].block_type == ze[1].block_type && (f.mode_ext =
|
|
1355
|
+
Le[0].block_type == Le[1].block_type && ze[0].block_type == ze[1].block_type && (f.mode_ext = S.MPG_MD_MS_LR);
|
|
1356
1356
|
}
|
|
1357
1357
|
}
|
|
1358
1358
|
if (f.mode_ext == O ? (_ = V, c = a) : (_ = s, c = P), X.analysis && f.pinfo != null)
|
|
@@ -1379,7 +1379,7 @@ function bt() {
|
|
|
1379
1379
|
for (M = 0; M < f.channels_out; M++)
|
|
1380
1380
|
we += c[L][M];
|
|
1381
1381
|
for (f.nsPsy.pefirbuf[18] = we, we = f.nsPsy.pefirbuf[9], We = 0; We < 9; We++)
|
|
1382
|
-
we += (f.nsPsy.pefirbuf[We] + f.nsPsy.pefirbuf[18 - We]) *
|
|
1382
|
+
we += (f.nsPsy.pefirbuf[We] + f.nsPsy.pefirbuf[18 - We]) * S.fircoef[We];
|
|
1383
1383
|
for (we = 670 * 5 * f.mode_gr * f.channels_out / we, L = 0; L < f.mode_gr; L++)
|
|
1384
1384
|
for (M = 0; M < f.channels_out; M++)
|
|
1385
1385
|
c[L][M] *= we;
|
|
@@ -1397,7 +1397,7 @@ function bt() {
|
|
|
1397
1397
|
return r(f), l;
|
|
1398
1398
|
};
|
|
1399
1399
|
}
|
|
1400
|
-
return Hi =
|
|
1400
|
+
return Hi = S, Hi;
|
|
1401
1401
|
}
|
|
1402
1402
|
var pt = it;
|
|
1403
1403
|
pt.System;
|
|
@@ -1415,7 +1415,7 @@ pt.new_int;
|
|
|
1415
1415
|
pt.new_int_n;
|
|
1416
1416
|
pt.assert;
|
|
1417
1417
|
var Oe = bt();
|
|
1418
|
-
function
|
|
1418
|
+
function Qn() {
|
|
1419
1419
|
var t = _s(Oe.BLKSIZE), e = _s(Oe.BLKSIZE_s / 2), i = [
|
|
1420
1420
|
0.9238795325112867,
|
|
1421
1421
|
0.3826834323650898,
|
|
@@ -1427,7 +1427,7 @@ function jn() {
|
|
|
1427
1427
|
0.006135884649154475
|
|
1428
1428
|
];
|
|
1429
1429
|
function n(o, m, h) {
|
|
1430
|
-
var
|
|
1430
|
+
var S = 0, W, v, Z;
|
|
1431
1431
|
h <<= 1;
|
|
1432
1432
|
var O = m + h;
|
|
1433
1433
|
W = 4;
|
|
@@ -1438,16 +1438,16 @@ function jn() {
|
|
|
1438
1438
|
var K, X, A, T;
|
|
1439
1439
|
X = o[v + 0] - o[v + U], K = o[v + 0] + o[v + U], T = o[v + k] - o[v + I], A = o[v + k] + o[v + I], o[v + k] = K - A, o[v + 0] = K + A, o[v + I] = X - T, o[v + U] = X + T, X = o[Z + 0] - o[Z + U], K = o[Z + 0] + o[Z + U], T = Xs.SQRT2 * o[Z + I], A = Xs.SQRT2 * o[Z + k], o[Z + k] = K - A, o[Z + 0] = K + A, o[Z + I] = X - T, o[Z + U] = X + T, Z += W, v += W;
|
|
1440
1440
|
} while (v < O);
|
|
1441
|
-
for (N = i[
|
|
1441
|
+
for (N = i[S + 0], w = i[S + 1], J = 1; J < r; J++) {
|
|
1442
1442
|
var H, p;
|
|
1443
1443
|
H = 1 - 2 * w * w, p = 2 * w * N, v = m + J, Z = m + U - J;
|
|
1444
1444
|
do {
|
|
1445
1445
|
var u, l, s, K, X, V, A, _, T, R;
|
|
1446
1446
|
l = p * o[v + U] - H * o[Z + U], u = H * o[v + U] + p * o[Z + U], X = o[v + 0] - u, K = o[v + 0] + u, V = o[Z + 0] - l, s = o[Z + 0] + l, l = p * o[v + I] - H * o[Z + I], u = H * o[v + I] + p * o[Z + I], T = o[v + k] - u, A = o[v + k] + u, R = o[Z + k] - l, _ = o[Z + k] + l, l = w * A - N * R, u = N * A + w * R, o[v + k] = K - u, o[v + 0] = K + u, o[Z + I] = V - l, o[Z + U] = V + l, l = N * _ - w * T, u = w * _ + N * T, o[Z + k] = s - u, o[Z + 0] = s + u, o[v + I] = X - l, o[v + U] = X + l, Z += W, v += W;
|
|
1447
1447
|
} while (v < O);
|
|
1448
|
-
H = N, N = H * i[
|
|
1448
|
+
H = N, N = H * i[S + 0] - w * i[S + 1], w = H * i[S + 1] + w * i[S + 0];
|
|
1449
1449
|
}
|
|
1450
|
-
|
|
1450
|
+
S += 2;
|
|
1451
1451
|
} while (W < h);
|
|
1452
1452
|
}
|
|
1453
1453
|
var d = [
|
|
@@ -1580,20 +1580,20 @@ function jn() {
|
|
|
1580
1580
|
126,
|
|
1581
1581
|
254
|
|
1582
1582
|
];
|
|
1583
|
-
this.fft_short = function(o, m, h,
|
|
1583
|
+
this.fft_short = function(o, m, h, S, W) {
|
|
1584
1584
|
for (var v = 0; v < 3; v++) {
|
|
1585
1585
|
var Z = Oe.BLKSIZE_s / 2, O = 65535 & 576 / 3 * (v + 1), w = Oe.BLKSIZE_s / 8 - 1;
|
|
1586
1586
|
do {
|
|
1587
1587
|
var N, J, U, k, I, r = d[w << 2] & 255;
|
|
1588
|
-
N = e[r] *
|
|
1588
|
+
N = e[r] * S[h][W + r + O], I = e[127 - r] * S[h][W + r + O + 128], J = N - I, N = N + I, U = e[r + 64] * S[h][W + r + O + 64], I = e[63 - r] * S[h][W + r + O + 192], k = U - I, U = U + I, Z -= 4, m[v][Z + 0] = N + U, m[v][Z + 2] = N - U, m[v][Z + 1] = J + k, m[v][Z + 3] = J - k, N = e[r + 1] * S[h][W + r + O + 1], I = e[126 - r] * S[h][W + r + O + 129], J = N - I, N = N + I, U = e[r + 65] * S[h][W + r + O + 65], I = e[62 - r] * S[h][W + r + O + 193], k = U - I, U = U + I, m[v][Z + Oe.BLKSIZE_s / 2 + 0] = N + U, m[v][Z + Oe.BLKSIZE_s / 2 + 2] = N - U, m[v][Z + Oe.BLKSIZE_s / 2 + 1] = J + k, m[v][Z + Oe.BLKSIZE_s / 2 + 3] = J - k;
|
|
1589
1589
|
} while (--w >= 0);
|
|
1590
1590
|
n(m[v], Z, Oe.BLKSIZE_s / 2);
|
|
1591
1591
|
}
|
|
1592
|
-
}, this.fft_long = function(o, m, h,
|
|
1592
|
+
}, this.fft_long = function(o, m, h, S, W) {
|
|
1593
1593
|
var v = Oe.BLKSIZE / 8 - 1, Z = Oe.BLKSIZE / 2;
|
|
1594
1594
|
do {
|
|
1595
1595
|
var O, w, N, J, U, k = d[v] & 255;
|
|
1596
|
-
O = t[k] *
|
|
1596
|
+
O = t[k] * S[h][W + k], U = t[k + 512] * S[h][W + k + 512], w = O - U, O = O + U, N = t[k + 256] * S[h][W + k + 256], U = t[k + 768] * S[h][W + k + 768], J = N - U, N = N + U, Z -= 4, m[Z + 0] = O + N, m[Z + 2] = O - N, m[Z + 1] = w + J, m[Z + 3] = w - J, O = t[k + 1] * S[h][W + k + 1], U = t[k + 513] * S[h][W + k + 513], w = O - U, O = O + U, N = t[k + 257] * S[h][W + k + 257], U = t[k + 769] * S[h][W + k + 769], J = N - U, N = N + U, m[Z + Oe.BLKSIZE / 2 + 0] = O + N, m[Z + Oe.BLKSIZE / 2 + 2] = O - N, m[Z + Oe.BLKSIZE / 2 + 1] = w + J, m[Z + Oe.BLKSIZE / 2 + 3] = w - J;
|
|
1597
1597
|
} while (--v >= 0);
|
|
1598
1598
|
n(m, Z, Oe.BLKSIZE / 2);
|
|
1599
1599
|
}, this.init_fft = function(o) {
|
|
@@ -1603,17 +1603,17 @@ function jn() {
|
|
|
1603
1603
|
e[m] = 0.5 * (1 - Math.cos(2 * Math.PI * (m + 0.5) / Oe.BLKSIZE_s));
|
|
1604
1604
|
};
|
|
1605
1605
|
}
|
|
1606
|
-
var
|
|
1606
|
+
var Dn = Qn, yt = it;
|
|
1607
1607
|
yt.System;
|
|
1608
|
-
var W0 = yt.VbrMode,
|
|
1608
|
+
var W0 = yt.VbrMode, Ss = yt.Float, L0 = yt.ShortBlock, mt = yt.Util, $n = yt.Arrays;
|
|
1609
1609
|
yt.new_array_n;
|
|
1610
1610
|
yt.new_byte;
|
|
1611
1611
|
yt.new_double;
|
|
1612
1612
|
var je = yt.new_float, kt = yt.new_float_n, h0 = yt.new_int;
|
|
1613
1613
|
yt.new_int_n;
|
|
1614
|
-
var ue = yt.assert,
|
|
1615
|
-
function
|
|
1616
|
-
var t = new
|
|
1614
|
+
var ue = yt.assert, qn = Dn, D = bt();
|
|
1615
|
+
function er() {
|
|
1616
|
+
var t = new qn(), e = 2.302585092994046, i = 2, n = 16, d = 2, o = 16, m = 0.34, h = 1 / (14752 * 14752) / (D.BLKSIZE / 2), S = 0.01, W = 0.8, v = 0.6, Z = 0.3, O = 3.5, w = 21, N = 0.2302585093;
|
|
1617
1617
|
function J(b) {
|
|
1618
1618
|
return b;
|
|
1619
1619
|
}
|
|
@@ -1622,10 +1622,10 @@ function qn() {
|
|
|
1622
1622
|
x += b[Y] * y.ATH.eql_w[Y];
|
|
1623
1623
|
return x *= h, x;
|
|
1624
1624
|
}
|
|
1625
|
-
function k(b, y, x, Y, F,
|
|
1625
|
+
function k(b, y, x, Y, F, G, C, E, B, $, z) {
|
|
1626
1626
|
var q = b.internal_flags;
|
|
1627
1627
|
if (B < 2)
|
|
1628
|
-
t.fft_long(q, Y[F], B, $, z), t.fft_short(q,
|
|
1628
|
+
t.fft_long(q, Y[F], B, $, z), t.fft_short(q, G[C], B, $, z);
|
|
1629
1629
|
else if (B == 2) {
|
|
1630
1630
|
for (var ce = D.BLKSIZE - 1; ce >= 0; --ce) {
|
|
1631
1631
|
var Ze = Y[F + 0][ce], ie = Y[F + 1][ce];
|
|
@@ -1633,8 +1633,8 @@ function qn() {
|
|
|
1633
1633
|
}
|
|
1634
1634
|
for (var fe = 2; fe >= 0; --fe)
|
|
1635
1635
|
for (var ce = D.BLKSIZE_s - 1; ce >= 0; --ce) {
|
|
1636
|
-
var Ze =
|
|
1637
|
-
|
|
1636
|
+
var Ze = G[C + 0][fe][ce], ie = G[C + 1][fe][ce];
|
|
1637
|
+
G[C + 0][fe][ce] = (Ze + ie) * mt.SQRT2 * 0.5, G[C + 1][fe][ce] = (Ze - ie) * mt.SQRT2 * 0.5;
|
|
1638
1638
|
}
|
|
1639
1639
|
}
|
|
1640
1640
|
y[0] = Y[F + 0][0], y[0] *= y[0];
|
|
@@ -1643,9 +1643,9 @@ function qn() {
|
|
|
1643
1643
|
y[D.BLKSIZE / 2 - ce] = (Q * Q + be * be) * 0.5;
|
|
1644
1644
|
}
|
|
1645
1645
|
for (var fe = 2; fe >= 0; --fe) {
|
|
1646
|
-
x[fe][0] =
|
|
1646
|
+
x[fe][0] = G[C + 0][fe][0], x[fe][0] *= x[fe][0];
|
|
1647
1647
|
for (var ce = D.BLKSIZE_s / 2 - 1; ce >= 0; --ce) {
|
|
1648
|
-
var Q =
|
|
1648
|
+
var Q = G[C + 0][fe][D.BLKSIZE_s / 2 - ce], be = G[C + 0][fe][D.BLKSIZE_s / 2 + ce];
|
|
1649
1649
|
x[fe][D.BLKSIZE_s / 2 - ce] = (Q * Q + be * be) * 0.5;
|
|
1650
1650
|
}
|
|
1651
1651
|
}
|
|
@@ -1728,7 +1728,7 @@ function qn() {
|
|
|
1728
1728
|
1.11084 * 1.11084,
|
|
1729
1729
|
1.03826 * 1.03826
|
|
1730
1730
|
];
|
|
1731
|
-
function V(b, y, x, Y, F,
|
|
1731
|
+
function V(b, y, x, Y, F, G) {
|
|
1732
1732
|
var C;
|
|
1733
1733
|
if (y > b)
|
|
1734
1734
|
if (y < b * A)
|
|
@@ -1786,13 +1786,13 @@ function qn() {
|
|
|
1786
1786
|
var x = b.internal_flags;
|
|
1787
1787
|
if (x.channels_out > 1) {
|
|
1788
1788
|
for (var Y = 0; Y < D.SBMAX_l; Y++) {
|
|
1789
|
-
var F = x.thm[0].l[Y],
|
|
1790
|
-
x.thm[0].l[Y] +=
|
|
1789
|
+
var F = x.thm[0].l[Y], G = x.thm[1].l[Y];
|
|
1790
|
+
x.thm[0].l[Y] += G * y, x.thm[1].l[Y] += F * y;
|
|
1791
1791
|
}
|
|
1792
1792
|
for (var Y = 0; Y < D.SBMAX_s; Y++)
|
|
1793
1793
|
for (var C = 0; C < 3; C++) {
|
|
1794
|
-
var F = x.thm[0].s[Y][C],
|
|
1795
|
-
x.thm[0].s[Y][C] +=
|
|
1794
|
+
var F = x.thm[0].s[Y][C], G = x.thm[1].s[Y][C];
|
|
1795
|
+
x.thm[0].s[Y][C] += G * y, x.thm[1].s[Y][C] += F * y;
|
|
1796
1796
|
}
|
|
1797
1797
|
}
|
|
1798
1798
|
}
|
|
@@ -1811,95 +1811,95 @@ function qn() {
|
|
|
1811
1811
|
b.thm[2].l[y] = Y, b.thm[3].l[y] = F;
|
|
1812
1812
|
}
|
|
1813
1813
|
for (var y = 0; y < D.SBMAX_s; y++)
|
|
1814
|
-
for (var
|
|
1815
|
-
if (!(b.thm[0].s[y][
|
|
1816
|
-
var x = b.mld_s[y] * b.en[3].s[y][
|
|
1817
|
-
b.thm[2].s[y][
|
|
1818
|
-
Math.min(b.thm[3].s[y][
|
|
1814
|
+
for (var G = 0; G < 3; G++)
|
|
1815
|
+
if (!(b.thm[0].s[y][G] > 1.58 * b.thm[1].s[y][G] || b.thm[1].s[y][G] > 1.58 * b.thm[0].s[y][G])) {
|
|
1816
|
+
var x = b.mld_s[y] * b.en[3].s[y][G], Y = Math.max(
|
|
1817
|
+
b.thm[2].s[y][G],
|
|
1818
|
+
Math.min(b.thm[3].s[y][G], x)
|
|
1819
1819
|
);
|
|
1820
|
-
x = b.mld_s[y] * b.en[2].s[y][
|
|
1820
|
+
x = b.mld_s[y] * b.en[2].s[y][G];
|
|
1821
1821
|
var F = Math.max(
|
|
1822
|
-
b.thm[3].s[y][
|
|
1823
|
-
Math.min(b.thm[2].s[y][
|
|
1822
|
+
b.thm[3].s[y][G],
|
|
1823
|
+
Math.min(b.thm[2].s[y][G], x)
|
|
1824
1824
|
);
|
|
1825
|
-
b.thm[2].s[y][
|
|
1825
|
+
b.thm[2].s[y][G] = Y, b.thm[3].s[y][G] = F;
|
|
1826
1826
|
}
|
|
1827
1827
|
}
|
|
1828
1828
|
function g(b, y, x) {
|
|
1829
1829
|
var Y = y, F = Math.pow(10, x);
|
|
1830
1830
|
y *= 2, Y *= 2;
|
|
1831
|
-
for (var
|
|
1831
|
+
for (var G = 0; G < D.SBMAX_l; G++) {
|
|
1832
1832
|
var C, E, B, $;
|
|
1833
|
-
if ($ = b.ATH.cb_l[b.bm_l[
|
|
1834
|
-
Math.max(b.thm[0].l[
|
|
1835
|
-
Math.max(b.thm[1].l[
|
|
1836
|
-
), E = Math.max(b.thm[2].l[
|
|
1833
|
+
if ($ = b.ATH.cb_l[b.bm_l[G]] * F, C = Math.min(
|
|
1834
|
+
Math.max(b.thm[0].l[G], $),
|
|
1835
|
+
Math.max(b.thm[1].l[G], $)
|
|
1836
|
+
), E = Math.max(b.thm[2].l[G], $), B = Math.max(b.thm[3].l[G], $), C * y < E + B) {
|
|
1837
1837
|
var z = C * Y / (E + B);
|
|
1838
1838
|
E *= z, B *= z, ue(E + B > 0);
|
|
1839
1839
|
}
|
|
1840
|
-
b.thm[2].l[
|
|
1840
|
+
b.thm[2].l[G] = Math.min(E, b.thm[2].l[G]), b.thm[3].l[G] = Math.min(B, b.thm[3].l[G]);
|
|
1841
1841
|
}
|
|
1842
1842
|
F *= D.BLKSIZE_s / D.BLKSIZE;
|
|
1843
|
-
for (var
|
|
1843
|
+
for (var G = 0; G < D.SBMAX_s; G++)
|
|
1844
1844
|
for (var q = 0; q < 3; q++) {
|
|
1845
1845
|
var C, E, B, $;
|
|
1846
|
-
if ($ = b.ATH.cb_s[b.bm_s[
|
|
1847
|
-
Math.max(b.thm[0].s[
|
|
1848
|
-
Math.max(b.thm[1].s[
|
|
1849
|
-
), E = Math.max(b.thm[2].s[
|
|
1846
|
+
if ($ = b.ATH.cb_s[b.bm_s[G]] * F, C = Math.min(
|
|
1847
|
+
Math.max(b.thm[0].s[G][q], $),
|
|
1848
|
+
Math.max(b.thm[1].s[G][q], $)
|
|
1849
|
+
), E = Math.max(b.thm[2].s[G][q], $), B = Math.max(b.thm[3].s[G][q], $), C * y < E + B) {
|
|
1850
1850
|
var z = C * y / (E + B);
|
|
1851
1851
|
E *= z, B *= z, ue(E + B > 0);
|
|
1852
1852
|
}
|
|
1853
|
-
b.thm[2].s[
|
|
1854
|
-
b.thm[2].s[
|
|
1853
|
+
b.thm[2].s[G][q] = Math.min(
|
|
1854
|
+
b.thm[2].s[G][q],
|
|
1855
1855
|
E
|
|
1856
|
-
), b.thm[3].s[
|
|
1857
|
-
b.thm[3].s[
|
|
1856
|
+
), b.thm[3].s[G][q] = Math.min(
|
|
1857
|
+
b.thm[3].s[G][q],
|
|
1858
1858
|
B
|
|
1859
1859
|
);
|
|
1860
1860
|
}
|
|
1861
1861
|
}
|
|
1862
1862
|
function P(b, y, x, Y, F) {
|
|
1863
|
-
var
|
|
1864
|
-
for (
|
|
1865
|
-
for (var $ = b.bo_s[
|
|
1863
|
+
var G, C, E = 0, B = 0;
|
|
1864
|
+
for (G = C = 0; G < D.SBMAX_s; ++C, ++G) {
|
|
1865
|
+
for (var $ = b.bo_s[G], z = b.npart_s, q = $ < z ? $ : z; C < q; )
|
|
1866
1866
|
ue(y[C] >= 0), ue(x[C] >= 0), E += y[C], B += x[C], C++;
|
|
1867
|
-
if (b.en[Y].s[
|
|
1868
|
-
++
|
|
1867
|
+
if (b.en[Y].s[G][F] = E, b.thm[Y].s[G][F] = B, C >= z) {
|
|
1868
|
+
++G;
|
|
1869
1869
|
break;
|
|
1870
1870
|
}
|
|
1871
1871
|
ue(y[C] >= 0), ue(x[C] >= 0);
|
|
1872
1872
|
{
|
|
1873
|
-
var ce = b.PSY.bo_s_weight[
|
|
1874
|
-
E = ce * y[C], B = ce * x[C], b.en[Y].s[
|
|
1873
|
+
var ce = b.PSY.bo_s_weight[G], Ze = 1 - ce;
|
|
1874
|
+
E = ce * y[C], B = ce * x[C], b.en[Y].s[G][F] += E, b.thm[Y].s[G][F] += B, E = Ze * y[C], B = Ze * x[C];
|
|
1875
1875
|
}
|
|
1876
1876
|
}
|
|
1877
|
-
for (;
|
|
1878
|
-
b.en[Y].s[
|
|
1877
|
+
for (; G < D.SBMAX_s; ++G)
|
|
1878
|
+
b.en[Y].s[G][F] = 0, b.thm[Y].s[G][F] = 0;
|
|
1879
1879
|
}
|
|
1880
1880
|
function a(b, y, x, Y) {
|
|
1881
|
-
var F,
|
|
1882
|
-
for (F =
|
|
1883
|
-
for (var B = b.bo_l[F], $ = b.npart_l, z = B < $ ? B : $;
|
|
1884
|
-
ue(y[
|
|
1885
|
-
if (b.en[Y].l[F] = C, b.thm[Y].l[F] = E,
|
|
1881
|
+
var F, G, C = 0, E = 0;
|
|
1882
|
+
for (F = G = 0; F < D.SBMAX_l; ++G, ++F) {
|
|
1883
|
+
for (var B = b.bo_l[F], $ = b.npart_l, z = B < $ ? B : $; G < z; )
|
|
1884
|
+
ue(y[G] >= 0), ue(x[G] >= 0), C += y[G], E += x[G], G++;
|
|
1885
|
+
if (b.en[Y].l[F] = C, b.thm[Y].l[F] = E, G >= $) {
|
|
1886
1886
|
++F;
|
|
1887
1887
|
break;
|
|
1888
1888
|
}
|
|
1889
|
-
ue(y[
|
|
1889
|
+
ue(y[G] >= 0), ue(x[G] >= 0);
|
|
1890
1890
|
{
|
|
1891
1891
|
var q = b.PSY.bo_l_weight[F], ce = 1 - q;
|
|
1892
|
-
C = q * y[
|
|
1892
|
+
C = q * y[G], E = q * x[G], b.en[Y].l[F] += C, b.thm[Y].l[F] += E, C = ce * y[G], E = ce * x[G];
|
|
1893
1893
|
}
|
|
1894
1894
|
}
|
|
1895
1895
|
for (; F < D.SBMAX_l; ++F)
|
|
1896
1896
|
b.en[Y].l[F] = 0, b.thm[Y].l[F] = 0;
|
|
1897
1897
|
}
|
|
1898
|
-
function c(b, y, x, Y, F,
|
|
1898
|
+
function c(b, y, x, Y, F, G) {
|
|
1899
1899
|
var C = b.internal_flags, E, B;
|
|
1900
1900
|
for (B = E = 0; B < C.npart_s; ++B) {
|
|
1901
1901
|
for (var $ = 0, z = C.numlines_s[B], q = 0; q < z; ++q, ++E) {
|
|
1902
|
-
var ce = y[
|
|
1902
|
+
var ce = y[G][E];
|
|
1903
1903
|
$ += ce;
|
|
1904
1904
|
}
|
|
1905
1905
|
x[B] = $;
|
|
@@ -1924,8 +1924,8 @@ function qn() {
|
|
|
1924
1924
|
function M(b, y, x, Y) {
|
|
1925
1925
|
var F = b.internal_flags;
|
|
1926
1926
|
b.short_blocks == L0.short_block_coupled && !(y[0] != 0 && y[1] != 0) && (y[0] = y[1] = 0);
|
|
1927
|
-
for (var
|
|
1928
|
-
Y[
|
|
1927
|
+
for (var G = 0; G < F.channels_out; G++)
|
|
1928
|
+
Y[G] = D.NORM_TYPE, b.short_blocks == L0.short_block_dispensed && (y[G] = 1), b.short_blocks == L0.short_block_forced && (y[G] = 0), y[G] != 0 ? (ue(F.blocktype_old[G] != D.START_TYPE), F.blocktype_old[G] == D.SHORT_TYPE && (Y[G] = D.STOP_TYPE)) : (Y[G] = D.SHORT_TYPE, F.blocktype_old[G] == D.NORM_TYPE && (F.blocktype_old[G] = D.START_TYPE), F.blocktype_old[G] == D.STOP_TYPE && (F.blocktype_old[G] = D.SHORT_TYPE)), x[G] = F.blocktype_old[G], F.blocktype_old[G] = Y[G];
|
|
1929
1929
|
}
|
|
1930
1930
|
function L(b, y, x) {
|
|
1931
1931
|
return x >= 1 ? b : x <= 0 ? y : y > 0 ? Math.pow(b / y, x) * y : 0;
|
|
@@ -1948,9 +1948,9 @@ function qn() {
|
|
|
1948
1948
|
function ae(b, y) {
|
|
1949
1949
|
for (var x = 309.07, Y = 0; Y < D.SBMAX_s - 1; Y++)
|
|
1950
1950
|
for (var F = 0; F < 3; F++) {
|
|
1951
|
-
var
|
|
1952
|
-
if (ue(Y < ee.length),
|
|
1953
|
-
var C =
|
|
1951
|
+
var G = b.thm.s[Y][F];
|
|
1952
|
+
if (ue(Y < ee.length), G > 0) {
|
|
1953
|
+
var C = G * y, E = b.en.s[Y][F];
|
|
1954
1954
|
E > C && (E > C * 1e10 ? x += ee[Y] * (10 * e) : (ue(C > 0), x += ee[Y] * mt.FAST_LOG10(E / C)));
|
|
1955
1955
|
}
|
|
1956
1956
|
}
|
|
@@ -1984,48 +1984,48 @@ function qn() {
|
|
|
1984
1984
|
for (var x = 281.0575, Y = 0; Y < D.SBMAX_l - 1; Y++) {
|
|
1985
1985
|
var F = b.thm.l[Y];
|
|
1986
1986
|
if (ue(Y < le.length), F > 0) {
|
|
1987
|
-
var
|
|
1988
|
-
C >
|
|
1987
|
+
var G = F * y, C = b.en.l[Y];
|
|
1988
|
+
C > G && (C > G * 1e10 ? x += le[Y] * (10 * e) : (ue(G > 0), x += le[Y] * mt.FAST_LOG10(C / G)));
|
|
1989
1989
|
}
|
|
1990
1990
|
}
|
|
1991
1991
|
return x;
|
|
1992
1992
|
}
|
|
1993
1993
|
function _e(b, y, x, Y, F) {
|
|
1994
|
-
var
|
|
1995
|
-
for (
|
|
1994
|
+
var G, C;
|
|
1995
|
+
for (G = C = 0; G < b.npart_l; ++G) {
|
|
1996
1996
|
var E = 0, B = 0, $;
|
|
1997
|
-
for ($ = 0; $ < b.numlines_l[
|
|
1997
|
+
for ($ = 0; $ < b.numlines_l[G]; ++$, ++C) {
|
|
1998
1998
|
var z = y[C];
|
|
1999
1999
|
ue(z >= 0), E += z, B < z && (B = z);
|
|
2000
2000
|
}
|
|
2001
|
-
x[
|
|
2001
|
+
x[G] = E, Y[G] = B, F[G] = E * b.rnumlines_l[G], ue(b.rnumlines_l[G] >= 0), ue(E >= 0), ue(x[G] >= 0), ue(Y[G] >= 0), ue(F[G] >= 0);
|
|
2002
2002
|
}
|
|
2003
2003
|
}
|
|
2004
2004
|
function he(b, y, x, Y) {
|
|
2005
|
-
var F = H.length - 1,
|
|
2005
|
+
var F = H.length - 1, G = 0, C = x[G] + x[G + 1];
|
|
2006
2006
|
if (ue(C >= 0), C > 0) {
|
|
2007
|
-
var E = y[
|
|
2008
|
-
E < y[
|
|
2007
|
+
var E = y[G];
|
|
2008
|
+
E < y[G + 1] && (E = y[G + 1]), ue(b.numlines_l[G] + b.numlines_l[G + 1] - 1 > 0), C = 20 * (E * 2 - C) / (C * (b.numlines_l[G] + b.numlines_l[G + 1] - 1));
|
|
2009
2009
|
var B = 0 | C;
|
|
2010
|
-
B > F && (B = F), Y[
|
|
2010
|
+
B > F && (B = F), Y[G] = B;
|
|
2011
2011
|
} else
|
|
2012
|
-
Y[
|
|
2013
|
-
for (
|
|
2014
|
-
if (C = x[
|
|
2015
|
-
var E = y[
|
|
2016
|
-
E < y[
|
|
2012
|
+
Y[G] = 0;
|
|
2013
|
+
for (G = 1; G < b.npart_l - 1; G++)
|
|
2014
|
+
if (C = x[G - 1] + x[G] + x[G + 1], ue(C >= 0), C > 0) {
|
|
2015
|
+
var E = y[G - 1];
|
|
2016
|
+
E < y[G] && (E = y[G]), E < y[G + 1] && (E = y[G + 1]), ue(b.numlines_l[G - 1] + b.numlines_l[G] + b.numlines_l[G + 1] - 1 > 0), C = 20 * (E * 3 - C) / (C * (b.numlines_l[G - 1] + b.numlines_l[G] + b.numlines_l[G + 1] - 1));
|
|
2017
2017
|
var B = 0 | C;
|
|
2018
|
-
B > F && (B = F), Y[
|
|
2018
|
+
B > F && (B = F), Y[G] = B;
|
|
2019
2019
|
} else
|
|
2020
|
-
Y[
|
|
2021
|
-
if (ue(
|
|
2022
|
-
var E = y[
|
|
2023
|
-
E < y[
|
|
2020
|
+
Y[G] = 0;
|
|
2021
|
+
if (ue(G > 0), ue(G == b.npart_l - 1), C = x[G - 1] + x[G], ue(C >= 0), C > 0) {
|
|
2022
|
+
var E = y[G - 1];
|
|
2023
|
+
E < y[G] && (E = y[G]), ue(b.numlines_l[G - 1] + b.numlines_l[G] - 1 > 0), C = 20 * (E * 2 - C) / (C * (b.numlines_l[G - 1] + b.numlines_l[G] - 1));
|
|
2024
2024
|
var B = 0 | C;
|
|
2025
|
-
B > F && (B = F), Y[
|
|
2025
|
+
B > F && (B = F), Y[G] = B;
|
|
2026
2026
|
} else
|
|
2027
|
-
Y[
|
|
2028
|
-
ue(
|
|
2027
|
+
Y[G] = 0;
|
|
2028
|
+
ue(G == b.npart_l - 1);
|
|
2029
2029
|
}
|
|
2030
2030
|
var oe = [
|
|
2031
2031
|
-865163e-23 * 2,
|
|
@@ -2039,9 +2039,9 @@ function qn() {
|
|
|
2039
2039
|
-552212e-22 * 2,
|
|
2040
2040
|
-0.313819 * 2
|
|
2041
2041
|
];
|
|
2042
|
-
this.L3psycho_anal_ns = function(b, y, x, Y, F,
|
|
2042
|
+
this.L3psycho_anal_ns = function(b, y, x, Y, F, G, C, E, B, $) {
|
|
2043
2043
|
var z = b.internal_flags, q = kt([2, D.BLKSIZE]), ce = kt([2, 3, D.BLKSIZE_s]), Ze = je(D.CBANDS + 1), ie = je(D.CBANDS + 1), fe = je(D.CBANDS + 2), Q = h0(2), be = h0(2), Re, se, pe, te, Xe, ke, de, Ie, Te = kt([2, 576]), ge, Lt = h0(D.CBANDS + 2), Ae = h0(D.CBANDS + 2);
|
|
2044
|
-
for (
|
|
2044
|
+
for ($n.fill(Ae, 0), Re = z.channels_out, b.mode == MPEGMode.JOINT_STEREO && (Re = 4), b.VBR == W0.vbr_off ? ge = z.ResvMax == 0 ? 0 : z.ResvSize / z.ResvMax * 0.5 : b.VBR == W0.vbr_rh || b.VBR == W0.vbr_mtrh || b.VBR == W0.vbr_mt ? ge = 0.6 : ge = 1, se = 0; se < z.channels_out; se++) {
|
|
2045
2045
|
var Be = y[se], ct = x + 576 - 350 - w + 192;
|
|
2046
2046
|
for (ue(oe.length == (w - 1) / 2), te = 0; te < 576; te++) {
|
|
2047
2047
|
var xt, Ht;
|
|
@@ -2049,7 +2049,7 @@ function qn() {
|
|
|
2049
2049
|
xt += oe[Xe] * (Be[ct + te + Xe] + Be[ct + te + w - Xe]), Ht += oe[Xe + 1] * (Be[ct + te + Xe + 1] + Be[ct + te + w - Xe - 1]);
|
|
2050
2050
|
Te[se][te] = xt + Ht;
|
|
2051
2051
|
}
|
|
2052
|
-
F[Y][se].en.assign(z.en[se]), F[Y][se].thm.assign(z.thm[se]), Re > 2 && (
|
|
2052
|
+
F[Y][se].en.assign(z.en[se]), F[Y][se].thm.assign(z.thm[se]), Re > 2 && (G[Y][se].en.assign(z.en[se + 2]), G[Y][se].thm.assign(z.thm[se + 2]));
|
|
2053
2053
|
}
|
|
2054
2054
|
for (se = 0; se < Re; se++) {
|
|
2055
2055
|
var Jt, Et, nt = je(12), zt = [0, 0, 0, 0], T0 = je(12), _i = 1, os, cs = je(D.CBANDS), ds = je(D.CBANDS), Fe = [0, 0, 0, 0], ms = je(D.HBLKSIZE), us = kt([3, D.HBLKSIZE_s]);
|
|
@@ -2057,13 +2057,13 @@ function qn() {
|
|
|
2057
2057
|
nt[te] = z.nsPsy.last_en_subshort[se][te + 6], ue(z.nsPsy.last_en_subshort[se][te + 4] > 0), T0[te] = nt[te] / z.nsPsy.last_en_subshort[se][te + 4], zt[0] += nt[te];
|
|
2058
2058
|
if (se == 2)
|
|
2059
2059
|
for (te = 0; te < 576; te++) {
|
|
2060
|
-
var
|
|
2061
|
-
|
|
2060
|
+
var Si, Gi;
|
|
2061
|
+
Si = Te[0][te], Gi = Te[1][te], Te[0][te] = Si + Gi, Te[1][te] = Si - Gi;
|
|
2062
2062
|
}
|
|
2063
2063
|
{
|
|
2064
2064
|
var hs = Te[se & 1], g0 = 0;
|
|
2065
2065
|
for (te = 0; te < 9; te++) {
|
|
2066
|
-
for (var
|
|
2066
|
+
for (var gn = g0 + 64, $e = 1; g0 < gn; g0++)
|
|
2067
2067
|
$e < Math.abs(hs[g0]) && ($e = Math.abs(hs[g0]));
|
|
2068
2068
|
z.nsPsy.last_en_subshort[se][te] = nt[te + 3] = $e, zt[1 + te / 3] += $e, $e > nt[te + 3 - 2] ? (ue(nt[te + 3 - 2] > 0), $e = $e / nt[te + 3 - 2]) : nt[te + 3 - 2] > $e * 10 ? (ue($e > 0), $e = nt[te + 3 - 2] / ($e * 10)) : $e = 0, T0[te + 3] = $e;
|
|
2069
2069
|
}
|
|
@@ -2146,11 +2146,11 @@ function qn() {
|
|
|
2146
2146
|
}
|
|
2147
2147
|
for (M(b, be, $, Q), se = 0; se < Re; se++) {
|
|
2148
2148
|
var J0, E0 = 0, ei, ti;
|
|
2149
|
-
se > 1 ? (J0 = E, E0 = -2, ei = D.NORM_TYPE, ($[0] == D.SHORT_TYPE || $[1] == D.SHORT_TYPE) && (ei = D.SHORT_TYPE), ti =
|
|
2149
|
+
se > 1 ? (J0 = E, E0 = -2, ei = D.NORM_TYPE, ($[0] == D.SHORT_TYPE || $[1] == D.SHORT_TYPE) && (ei = D.SHORT_TYPE), ti = G[Y][se - 2]) : (J0 = C, E0 = 0, ei = $[se], ti = F[Y][se]), ei == D.SHORT_TYPE ? J0[E0 + se] = ae(ti, z.masking_lower) : J0[E0 + se] = re(ti, z.masking_lower), b.analysis && (z.pinfo.pe[Y][se] = J0[E0 + se]);
|
|
2150
2150
|
}
|
|
2151
2151
|
return 0;
|
|
2152
2152
|
};
|
|
2153
|
-
function Le(b, y, x, Y, F,
|
|
2153
|
+
function Le(b, y, x, Y, F, G, C, E) {
|
|
2154
2154
|
var B = b.internal_flags;
|
|
2155
2155
|
if (Y < 2)
|
|
2156
2156
|
t.fft_long(B, C[E], Y, y, x);
|
|
@@ -2159,33 +2159,33 @@ function qn() {
|
|
|
2159
2159
|
var z = C[E + 0][$], q = C[E + 1][$];
|
|
2160
2160
|
C[E + 0][$] = (z + q) * mt.SQRT2 * 0.5, C[E + 1][$] = (z - q) * mt.SQRT2 * 0.5;
|
|
2161
2161
|
}
|
|
2162
|
-
|
|
2162
|
+
G[0] = C[E + 0][0], G[0] *= G[0];
|
|
2163
2163
|
for (var $ = D.BLKSIZE / 2 - 1; $ >= 0; --$) {
|
|
2164
2164
|
var ce = C[E + 0][D.BLKSIZE / 2 - $], Ze = C[E + 0][D.BLKSIZE / 2 + $];
|
|
2165
|
-
|
|
2165
|
+
G[D.BLKSIZE / 2 - $] = (ce * ce + Ze * Ze) * 0.5;
|
|
2166
2166
|
}
|
|
2167
2167
|
{
|
|
2168
2168
|
for (var ie = 0, $ = 11; $ < D.HBLKSIZE; $++)
|
|
2169
|
-
ie +=
|
|
2169
|
+
ie += G[$];
|
|
2170
2170
|
B.tot_ener[Y] = ie;
|
|
2171
2171
|
}
|
|
2172
2172
|
if (b.analysis) {
|
|
2173
2173
|
for (var $ = 0; $ < D.HBLKSIZE; $++)
|
|
2174
|
-
B.pinfo.energy[F][Y][$] = B.pinfo.energy_save[Y][$], B.pinfo.energy_save[Y][$] =
|
|
2174
|
+
B.pinfo.energy[F][Y][$] = B.pinfo.energy_save[Y][$], B.pinfo.energy_save[Y][$] = G[$];
|
|
2175
2175
|
B.pinfo.pe[F][Y] = B.pe[Y];
|
|
2176
2176
|
}
|
|
2177
2177
|
}
|
|
2178
|
-
function ze(b, y, x, Y, F,
|
|
2178
|
+
function ze(b, y, x, Y, F, G, C, E) {
|
|
2179
2179
|
var B = b.internal_flags;
|
|
2180
2180
|
if (F == 0 && Y < 2 && t.fft_short(B, C[E], Y, y, x), Y == 2)
|
|
2181
2181
|
for (var $ = D.BLKSIZE_s - 1; $ >= 0; --$) {
|
|
2182
2182
|
var z = C[E + 0][F][$], q = C[E + 1][F][$];
|
|
2183
2183
|
C[E + 0][F][$] = (z + q) * mt.SQRT2 * 0.5, C[E + 1][F][$] = (z - q) * mt.SQRT2 * 0.5;
|
|
2184
2184
|
}
|
|
2185
|
-
|
|
2185
|
+
G[F][0] = C[E + 0][F][0], G[F][0] *= G[F][0];
|
|
2186
2186
|
for (var $ = D.BLKSIZE_s / 2 - 1; $ >= 0; --$) {
|
|
2187
2187
|
var ce = C[E + 0][F][D.BLKSIZE_s / 2 - $], Ze = C[E + 0][F][D.BLKSIZE_s / 2 + $];
|
|
2188
|
-
|
|
2188
|
+
G[F][D.BLKSIZE_s / 2 - $] = (ce * ce + Ze * Ze) * 0.5;
|
|
2189
2189
|
}
|
|
2190
2190
|
}
|
|
2191
2191
|
function We(b, y, x, Y) {
|
|
@@ -2204,7 +2204,7 @@ function qn() {
|
|
|
2204
2204
|
-552212e-22 * 2,
|
|
2205
2205
|
-0.313819 * 2
|
|
2206
2206
|
];
|
|
2207
|
-
function Ke(b, y, x, Y, F,
|
|
2207
|
+
function Ke(b, y, x, Y, F, G, C, E, B, $) {
|
|
2208
2208
|
for (var z = kt([2, 576]), q = b.internal_flags, ce = q.channels_out, Ze = b.mode == MPEGMode.JOINT_STEREO ? 4 : ce, ie = 0; ie < ce; ie++) {
|
|
2209
2209
|
firbuf = y[ie];
|
|
2210
2210
|
var fe = x + 576 - 350 - w + 192;
|
|
@@ -2216,7 +2216,7 @@ function qn() {
|
|
|
2216
2216
|
be += we[se] * (firbuf[fe + Q + se] + firbuf[fe + Q + w - se]), Re += we[se + 1] * (firbuf[fe + Q + se + 1] + firbuf[fe + Q + w - se - 1]);
|
|
2217
2217
|
z[ie][Q] = be + Re;
|
|
2218
2218
|
}
|
|
2219
|
-
F[Y][ie].en.assign(q.en[ie]), F[Y][ie].thm.assign(q.thm[ie]), Ze > 2 && (
|
|
2219
|
+
F[Y][ie].en.assign(q.en[ie]), F[Y][ie].thm.assign(q.thm[ie]), Ze > 2 && (G[Y][ie].en.assign(q.en[ie + 2]), G[Y][ie].thm.assign(q.thm[ie + 2]));
|
|
2220
2220
|
}
|
|
2221
2221
|
for (var ie = 0; ie < Ze; ie++) {
|
|
2222
2222
|
var pe = je(12), te = je(12), Xe = [0, 0, 0, 0], ke = z[ie & 1], de = 0, Ie = ie == 3 ? q.nsPsy.attackthre_s : q.nsPsy.attackthre, Te = 1;
|
|
@@ -2260,37 +2260,37 @@ function qn() {
|
|
|
2260
2260
|
b.nb_2[y][x] = b.nb_1[y][x], b.nb_1[y][x] = 0;
|
|
2261
2261
|
}
|
|
2262
2262
|
function a0(b, y, x, Y) {
|
|
2263
|
-
var F = H.length - 1,
|
|
2263
|
+
var F = H.length - 1, G = 0, C = x[G] + x[G + 1];
|
|
2264
2264
|
if (ue(C >= 0), C > 0) {
|
|
2265
|
-
var E = y[
|
|
2266
|
-
E < y[
|
|
2265
|
+
var E = y[G];
|
|
2266
|
+
E < y[G + 1] && (E = y[G + 1]), ue(b.numlines_s[G] + b.numlines_s[G + 1] - 1 > 0), C = 20 * (E * 2 - C) / (C * (b.numlines_s[G] + b.numlines_s[G + 1] - 1));
|
|
2267
2267
|
var B = 0 | C;
|
|
2268
|
-
B > F && (B = F), Y[
|
|
2268
|
+
B > F && (B = F), Y[G] = B;
|
|
2269
2269
|
} else
|
|
2270
|
-
Y[
|
|
2271
|
-
for (
|
|
2272
|
-
if (C = x[
|
|
2273
|
-
var E = y[
|
|
2274
|
-
E < y[
|
|
2270
|
+
Y[G] = 0;
|
|
2271
|
+
for (G = 1; G < b.npart_s - 1; G++)
|
|
2272
|
+
if (C = x[G - 1] + x[G] + x[G + 1], ue(G + 1 < b.npart_s), ue(C >= 0), C > 0) {
|
|
2273
|
+
var E = y[G - 1];
|
|
2274
|
+
E < y[G] && (E = y[G]), E < y[G + 1] && (E = y[G + 1]), ue(b.numlines_s[G - 1] + b.numlines_s[G] + b.numlines_s[G + 1] - 1 > 0), C = 20 * (E * 3 - C) / (C * (b.numlines_s[G - 1] + b.numlines_s[G] + b.numlines_s[G + 1] - 1));
|
|
2275
2275
|
var B = 0 | C;
|
|
2276
|
-
B > F && (B = F), Y[
|
|
2276
|
+
B > F && (B = F), Y[G] = B;
|
|
2277
2277
|
} else
|
|
2278
|
-
Y[
|
|
2279
|
-
if (ue(
|
|
2280
|
-
var E = y[
|
|
2281
|
-
E < y[
|
|
2278
|
+
Y[G] = 0;
|
|
2279
|
+
if (ue(G > 0), ue(G == b.npart_s - 1), C = x[G - 1] + x[G], ue(C >= 0), C > 0) {
|
|
2280
|
+
var E = y[G - 1];
|
|
2281
|
+
E < y[G] && (E = y[G]), ue(b.numlines_s[G - 1] + b.numlines_s[G] - 1 > 0), C = 20 * (E * 2 - C) / (C * (b.numlines_s[G - 1] + b.numlines_s[G] - 1));
|
|
2282
2282
|
var B = 0 | C;
|
|
2283
|
-
B > F && (B = F), Y[
|
|
2283
|
+
B > F && (B = F), Y[G] = B;
|
|
2284
2284
|
} else
|
|
2285
|
-
Y[
|
|
2286
|
-
ue(
|
|
2285
|
+
Y[G] = 0;
|
|
2286
|
+
ue(G == b.npart_s - 1);
|
|
2287
2287
|
}
|
|
2288
|
-
function gt(b, y, x, Y, F,
|
|
2288
|
+
function gt(b, y, x, Y, F, G) {
|
|
2289
2289
|
var C = b.internal_flags, E = new float[D.CBANDS](), B = je(D.CBANDS), $, z, q, ce = new int[D.CBANDS]();
|
|
2290
2290
|
for (q = z = 0; q < C.npart_s; ++q) {
|
|
2291
2291
|
var Ze = 0, ie = 0, fe = C.numlines_s[q];
|
|
2292
2292
|
for ($ = 0; $ < fe; ++$, ++z) {
|
|
2293
|
-
var Q = y[
|
|
2293
|
+
var Q = y[G][z];
|
|
2294
2294
|
Ze += Q, ie < Q && (ie = Q);
|
|
2295
2295
|
}
|
|
2296
2296
|
x[q] = Ze, ue(Ze >= 0), E[q] = ie, ue(fe > 0), B[q] = Ze / fe, ue(B[q] >= 0);
|
|
@@ -2307,8 +2307,8 @@ function qn() {
|
|
|
2307
2307
|
x[q] = 0, Y[q] = 0;
|
|
2308
2308
|
}
|
|
2309
2309
|
function Ft(b, y, x, Y, F) {
|
|
2310
|
-
var
|
|
2311
|
-
_e(b, y, x,
|
|
2310
|
+
var G = je(D.CBANDS), C = je(D.CBANDS), E = h0(D.CBANDS + 2), B;
|
|
2311
|
+
_e(b, y, x, G, C), he(b, G, C, E);
|
|
2312
2312
|
var $ = 0;
|
|
2313
2313
|
for (B = 0; B < b.npart_l; B++) {
|
|
2314
2314
|
var z, q, ce, Ze, ie = b.s3ind[B][0], fe = b.s3ind[B][1], Q = 0, be = 0;
|
|
@@ -2321,7 +2321,7 @@ function qn() {
|
|
|
2321
2321
|
var se = n * b.nb_2[F][B], pe = i * b.nb_1[F][B], Re;
|
|
2322
2322
|
se <= 0 && (se = q), pe <= 0 && (pe = q), b.blocktype_old[F & 1] == D.NORM_TYPE ? Re = Math.min(pe, se) : Re = pe, Y[B] = Math.min(q, Re);
|
|
2323
2323
|
}
|
|
2324
|
-
b.nb_2[F][B] = b.nb_1[F][B], b.nb_1[F][B] = q, z =
|
|
2324
|
+
b.nb_2[F][B] = b.nb_1[F][B], b.nb_1[F][B] = q, z = G[B], z *= b.minval_l[B], z *= ce, Y[B] > z && (Y[B] = z), b.masking_lower > 1 && (Y[B] *= b.masking_lower), Y[B] > x[B] && (Y[B] = x[B]), b.masking_lower < 1 && (Y[B] *= b.masking_lower), ue(Y[B] >= 0);
|
|
2325
2325
|
}
|
|
2326
2326
|
for (; B < D.CBANDS; ++B)
|
|
2327
2327
|
x[B] = 0, Y[B] = 0;
|
|
@@ -2334,19 +2334,19 @@ function qn() {
|
|
|
2334
2334
|
}
|
|
2335
2335
|
function $0(b, y, x) {
|
|
2336
2336
|
for (var Y = b.internal_flags, F = 0; F < Y.channels_out; F++) {
|
|
2337
|
-
var
|
|
2338
|
-
y[F] != 0 ? (ue(Y.blocktype_old[F] != D.START_TYPE), Y.blocktype_old[F] == D.SHORT_TYPE && (
|
|
2337
|
+
var G = D.NORM_TYPE;
|
|
2338
|
+
y[F] != 0 ? (ue(Y.blocktype_old[F] != D.START_TYPE), Y.blocktype_old[F] == D.SHORT_TYPE && (G = D.STOP_TYPE)) : (G = D.SHORT_TYPE, Y.blocktype_old[F] == D.NORM_TYPE && (Y.blocktype_old[F] = D.START_TYPE), Y.blocktype_old[F] == D.STOP_TYPE && (Y.blocktype_old[F] = D.SHORT_TYPE)), x[F] = Y.blocktype_old[F], Y.blocktype_old[F] = G;
|
|
2339
2339
|
}
|
|
2340
2340
|
}
|
|
2341
|
-
function C0(b, y, x, Y, F,
|
|
2342
|
-
for (var E =
|
|
2341
|
+
function C0(b, y, x, Y, F, G, C) {
|
|
2342
|
+
for (var E = G * 2, B = G > 0 ? Math.pow(10, F) : 1, $, z, q = 0; q < C; ++q) {
|
|
2343
2343
|
var ce = b[2][q], Ze = b[3][q], ie = y[0][q], fe = y[1][q], Q = y[2][q], be = y[3][q];
|
|
2344
2344
|
if (ie <= 1.58 * fe && fe <= 1.58 * ie) {
|
|
2345
2345
|
var Re = x[q] * Ze, se = x[q] * ce;
|
|
2346
2346
|
z = Math.max(Q, Math.min(be, Re)), $ = Math.max(be, Math.min(Q, se));
|
|
2347
2347
|
} else
|
|
2348
2348
|
z = Q, $ = be;
|
|
2349
|
-
if (
|
|
2349
|
+
if (G > 0) {
|
|
2350
2350
|
var pe, te, Xe = Y[q] * B;
|
|
2351
2351
|
if (pe = Math.min(Math.max(ie, Xe), Math.max(fe, Xe)), Q = Math.max(z, Xe), be = Math.max($, Xe), te = Q + be, te > 0 && pe * E < te) {
|
|
2352
2352
|
var ke = pe * E / te;
|
|
@@ -2357,7 +2357,7 @@ function qn() {
|
|
|
2357
2357
|
z > ce && (z = ce), $ > Ze && ($ = Ze), y[2][q] = z, y[3][q] = $;
|
|
2358
2358
|
}
|
|
2359
2359
|
}
|
|
2360
|
-
this.L3psycho_anal_vbr = function(b, y, x, Y, F,
|
|
2360
|
+
this.L3psycho_anal_vbr = function(b, y, x, Y, F, G, C, E, B, $) {
|
|
2361
2361
|
var z = b.internal_flags, q, ce, Ze = je(D.HBLKSIZE), ie = kt([3, D.HBLKSIZE_s]), fe = kt([2, D.BLKSIZE]), Q = kt([2, 3, D.BLKSIZE_s]), be = kt([4, D.CBANDS]), Re = kt([4, D.CBANDS]), se = kt([4, 3]), pe = 0.6, te = [
|
|
2362
2362
|
[0, 0, 0, 0],
|
|
2363
2363
|
[0, 0, 0, 0],
|
|
@@ -2370,7 +2370,7 @@ function qn() {
|
|
|
2370
2370
|
x,
|
|
2371
2371
|
Y,
|
|
2372
2372
|
F,
|
|
2373
|
-
|
|
2373
|
+
G,
|
|
2374
2374
|
B,
|
|
2375
2375
|
se,
|
|
2376
2376
|
te,
|
|
@@ -2497,7 +2497,7 @@ function qn() {
|
|
|
2497
2497
|
$0(b, Xe, $);
|
|
2498
2498
|
for (var de = 0; de < ke; de++) {
|
|
2499
2499
|
var xt, Ht, Jt, Et;
|
|
2500
|
-
de > 1 ? (xt = E, Ht = -2, Jt = D.NORM_TYPE, ($[0] == D.SHORT_TYPE || $[1] == D.SHORT_TYPE) && (Jt = D.SHORT_TYPE), Et =
|
|
2500
|
+
de > 1 ? (xt = E, Ht = -2, Jt = D.NORM_TYPE, ($[0] == D.SHORT_TYPE || $[1] == D.SHORT_TYPE) && (Jt = D.SHORT_TYPE), Et = G[Y][de - 2]) : (xt = C, Ht = 0, Jt = $[de], Et = F[Y][de]), Jt == D.SHORT_TYPE ? xt[Ht + de] = ae(Et, z.masking_lower) : xt[Ht + de] = re(Et, z.masking_lower), b.analysis && (z.pinfo.pe[Y][de] = xt[Ht + de]);
|
|
2501
2501
|
}
|
|
2502
2502
|
return 0;
|
|
2503
2503
|
};
|
|
@@ -2508,20 +2508,20 @@ function qn() {
|
|
|
2508
2508
|
function q0(b) {
|
|
2509
2509
|
var y = 0, x = 0;
|
|
2510
2510
|
{
|
|
2511
|
-
var Y = 0, F,
|
|
2511
|
+
var Y = 0, F, G;
|
|
2512
2512
|
for (Y = 0; Mt(Y, b) > 1e-20; Y -= 1)
|
|
2513
2513
|
;
|
|
2514
|
-
for (F = Y,
|
|
2515
|
-
Y = (
|
|
2514
|
+
for (F = Y, G = 0; Math.abs(G - F) > 1e-12; )
|
|
2515
|
+
Y = (G + F) / 2, Mt(Y, b) > 0 ? G = Y : F = Y;
|
|
2516
2516
|
y = F;
|
|
2517
2517
|
}
|
|
2518
2518
|
{
|
|
2519
|
-
var Y = 0, F,
|
|
2519
|
+
var Y = 0, F, G;
|
|
2520
2520
|
for (Y = 0; Mt(Y, b) > 1e-20; Y += 1)
|
|
2521
2521
|
;
|
|
2522
|
-
for (F = 0,
|
|
2523
|
-
Y = (
|
|
2524
|
-
x =
|
|
2522
|
+
for (F = 0, G = Y; Math.abs(G - F) > 1e-12; )
|
|
2523
|
+
Y = (G + F) / 2, Mt(Y, b) > 0 ? F = Y : G = Y;
|
|
2524
|
+
x = G;
|
|
2525
2525
|
}
|
|
2526
2526
|
{
|
|
2527
2527
|
var C = 0, E = 1e3, B;
|
|
@@ -2542,7 +2542,7 @@ function qn() {
|
|
|
2542
2542
|
function o0(b) {
|
|
2543
2543
|
return b < 0 && (b = 0), b = b * 1e-3, 13 * Math.atan(0.76 * b) + 3.5 * Math.atan(b * b / (7.5 * 7.5));
|
|
2544
2544
|
}
|
|
2545
|
-
function rs(b, y, x, Y, F,
|
|
2545
|
+
function rs(b, y, x, Y, F, G, C, E, B, $, z, q) {
|
|
2546
2546
|
var ce = je(D.CBANDS + 1), Ze = E / (q > 15 ? 2 * 576 : 2 * 192), ie = h0(D.HBLKSIZE), fe;
|
|
2547
2547
|
E /= B;
|
|
2548
2548
|
var Q = 0, be = 0;
|
|
@@ -2562,7 +2562,7 @@ function qn() {
|
|
|
2562
2562
|
var te, Xe, ke, de, Ie;
|
|
2563
2563
|
ke = $[pe], de = $[pe + 1], te = 0 | Math.floor(0.5 + z * (ke - 0.5)), te < 0 && (te = 0), Xe = 0 | Math.floor(0.5 + z * (de - 0.5)), Xe > B / 2 && (Xe = B / 2), x[pe] = (ie[te] + ie[Xe]) / 2, y[pe] = ie[Xe];
|
|
2564
2564
|
var Te = Ze * de;
|
|
2565
|
-
C[pe] = (Te - ce[y[pe]]) / (ce[y[pe] + 1] - ce[y[pe]]), C[pe] < 0 ? C[pe] = 0 : C[pe] > 1 && (C[pe] = 1), Ie = o0(E * $[pe] * z), Ie = Math.min(Ie, 15.5) / 15.5,
|
|
2565
|
+
C[pe] = (Te - ce[y[pe]]) / (ce[y[pe] + 1] - ce[y[pe]]), C[pe] < 0 ? C[pe] = 0 : C[pe] > 1 && (C[pe] = 1), Ie = o0(E * $[pe] * z), Ie = Math.min(Ie, 15.5) / 15.5, G[pe] = Math.pow(
|
|
2566
2566
|
10,
|
|
2567
2567
|
1.25 * (1 - Math.cos(Math.PI * Ie)) - 2.5
|
|
2568
2568
|
);
|
|
@@ -2574,9 +2574,9 @@ function qn() {
|
|
|
2574
2574
|
}
|
|
2575
2575
|
return be;
|
|
2576
2576
|
}
|
|
2577
|
-
function as(b, y, x, Y, F,
|
|
2577
|
+
function as(b, y, x, Y, F, G) {
|
|
2578
2578
|
var C = kt([D.CBANDS, D.CBANDS]), E, B = 0;
|
|
2579
|
-
if (
|
|
2579
|
+
if (G)
|
|
2580
2580
|
for (var $ = 0; $ < y; $++)
|
|
2581
2581
|
for (E = 0; E < y; E++) {
|
|
2582
2582
|
var z = Xi(x[$] - x[E]) * Y[E];
|
|
@@ -2608,7 +2608,7 @@ function qn() {
|
|
|
2608
2608
|
);
|
|
2609
2609
|
}
|
|
2610
2610
|
this.psymodel_init = function(b) {
|
|
2611
|
-
var y = b.internal_flags, x, Y = !0, F = 13,
|
|
2611
|
+
var y = b.internal_flags, x, Y = !0, F = 13, G = 24, C = 0, E = 0, B = -8.25, $ = -4.5, z = je(D.CBANDS), q = je(D.CBANDS), ce = je(D.CBANDS), Ze = b.out_samplerate;
|
|
2612
2612
|
switch (b.experimentalZ) {
|
|
2613
2613
|
default:
|
|
2614
2614
|
case 0:
|
|
@@ -2652,7 +2652,7 @@ function qn() {
|
|
|
2652
2652
|
D.SBMAX_l
|
|
2653
2653
|
), ue(y.npart_l < D.CBANDS), x = 0; x < y.npart_l; x++) {
|
|
2654
2654
|
var fe = C;
|
|
2655
|
-
z[x] >= F && (fe = E * (z[x] - F) / (
|
|
2655
|
+
z[x] >= F && (fe = E * (z[x] - F) / (G - F) + C * (G - z[x]) / (G - F)), ce[x] = Math.pow(10, fe / 10), y.numlines_l[x] > 0 ? y.rnumlines_l[x] = 1 / y.numlines_l[x] : y.rnumlines_l[x] = 0;
|
|
2656
2656
|
}
|
|
2657
2657
|
y.s3_ll = as(
|
|
2658
2658
|
y.s3ind,
|
|
@@ -2665,7 +2665,7 @@ function qn() {
|
|
|
2665
2665
|
var Q = 0;
|
|
2666
2666
|
for (x = 0; x < y.npart_l; x++) {
|
|
2667
2667
|
var be;
|
|
2668
|
-
be =
|
|
2668
|
+
be = Ss.MAX_VALUE;
|
|
2669
2669
|
for (var Re = 0; Re < y.numlines_l[x]; Re++, Q++) {
|
|
2670
2670
|
var se = Ze * Q / (1e3 * D.BLKSIZE), pe;
|
|
2671
2671
|
pe = this.ATHformula(se * 1e3, b) - 20, pe = Math.pow(10, 0.1 * pe), pe *= y.numlines_l[x], be > pe && (be = pe);
|
|
@@ -2687,7 +2687,7 @@ function qn() {
|
|
|
2687
2687
|
D.SBMAX_s
|
|
2688
2688
|
), ue(y.npart_s < D.CBANDS), Q = 0, x = 0; x < y.npart_s; x++) {
|
|
2689
2689
|
var be, fe = B;
|
|
2690
|
-
z[x] >= F && (fe = $ * (z[x] - F) / (
|
|
2690
|
+
z[x] >= F && (fe = $ * (z[x] - F) / (G - F) + B * (G - z[x]) / (G - F)), ce[x] = Math.pow(10, fe / 10), be = Ss.MAX_VALUE;
|
|
2691
2691
|
for (var Re = 0; Re < y.numlines_s[x]; Re++, Q++) {
|
|
2692
2692
|
var se = Ze * Q / (1e3 * D.BLKSIZE_s), pe;
|
|
2693
2693
|
pe = this.ATHformula(se * 1e3, b) - 20, pe = Math.pow(10, 0.1 * pe), pe *= y.numlines_s[x], be > pe && (be = pe);
|
|
@@ -2701,7 +2701,7 @@ function qn() {
|
|
|
2701
2701
|
q,
|
|
2702
2702
|
ce,
|
|
2703
2703
|
Y
|
|
2704
|
-
), p(), t.init_fft(y), y.decay = Math.exp(-1 * e / (
|
|
2704
|
+
), p(), t.init_fft(y), y.decay = Math.exp(-1 * e / (S * Ze / 192));
|
|
2705
2705
|
{
|
|
2706
2706
|
var te;
|
|
2707
2707
|
te = O, b.exp_nspsytune & 2 && (te = 1), Math.abs(b.msfix) > 0 && (te = b.msfix), b.msfix = te;
|
|
@@ -2770,12 +2770,12 @@ function qn() {
|
|
|
2770
2770
|
return x;
|
|
2771
2771
|
};
|
|
2772
2772
|
}
|
|
2773
|
-
var
|
|
2774
|
-
function
|
|
2775
|
-
this.class_id = 0, this.num_samples = 0, this.num_channels = 0, this.in_samplerate = 0, this.out_samplerate = 0, this.scale = 0, this.scale_left = 0, this.scale_right = 0, this.analysis = !1, this.bWriteVbrTag = !1, this.decode_only = !1, this.quality = 0, this.mode =
|
|
2773
|
+
var tr = er, ir = As;
|
|
2774
|
+
function sr() {
|
|
2775
|
+
this.class_id = 0, this.num_samples = 0, this.num_channels = 0, this.in_samplerate = 0, this.out_samplerate = 0, this.scale = 0, this.scale_left = 0, this.scale_right = 0, this.analysis = !1, this.bWriteVbrTag = !1, this.decode_only = !1, this.quality = 0, this.mode = ir.STEREO, this.force_ms = !1, this.free_format = !1, this.findReplayGain = !1, this.decode_on_the_fly = !1, this.write_id3tag_automatic = !1, this.brate = 0, this.compression_ratio = 0, this.copyright = 0, this.original = 0, this.extension = 0, this.emphasis = 0, this.error_protection = 0, this.strict_ISO = !1, this.disable_reservoir = !1, this.quant_comp = 0, this.quant_comp_short = 0, this.experimentalY = !1, this.experimentalZ = 0, this.exp_nspsytune = 0, this.preset = 0, this.VBR = null, this.VBR_q_frac = 0, this.VBR_q = 0, this.VBR_mean_bitrate_kbps = 0, this.VBR_min_bitrate_kbps = 0, this.VBR_max_bitrate_kbps = 0, this.VBR_hard_min = 0, this.lowpassfreq = 0, this.highpassfreq = 0, this.lowpasswidth = 0, this.highpasswidth = 0, this.maskingadjust = 0, this.maskingadjust_short = 0, this.ATHonly = !1, this.ATHshort = !1, this.noATH = !1, this.ATHtype = 0, this.ATHcurve = 0, this.ATHlower = 0, this.athaa_type = 0, this.athaa_loudapprox = 0, this.athaa_sensitivity = 0, this.short_blocks = null, this.useTemporal = !1, this.interChRatio = 0, this.msfix = 0, this.tune = !1, this.tune_value_a = 0, this.version = 0, this.encoder_delay = 0, this.encoder_padding = 0, this.framesize = 0, this.frameNum = 0, this.lame_allocated_gfp = 0, this.internal_flags = null;
|
|
2776
2776
|
}
|
|
2777
|
-
var
|
|
2778
|
-
nn.SFBMAX =
|
|
2777
|
+
var nr = sr, rr = bt(), nn = {};
|
|
2778
|
+
nn.SFBMAX = rr.SBMAX_s * 3;
|
|
2779
2779
|
var Qi = nn, ft = it;
|
|
2780
2780
|
ft.System;
|
|
2781
2781
|
ft.VbrMode;
|
|
@@ -2786,14 +2786,14 @@ ft.Arrays;
|
|
|
2786
2786
|
ft.new_array_n;
|
|
2787
2787
|
ft.new_byte;
|
|
2788
2788
|
ft.new_double;
|
|
2789
|
-
var
|
|
2789
|
+
var ar = ft.new_float;
|
|
2790
2790
|
ft.new_float_n;
|
|
2791
2791
|
var b0 = ft.new_int;
|
|
2792
2792
|
ft.new_int_n;
|
|
2793
2793
|
ft.assert;
|
|
2794
2794
|
var Yi = Qi;
|
|
2795
|
-
function
|
|
2796
|
-
this.xr =
|
|
2795
|
+
function lr() {
|
|
2796
|
+
this.xr = ar(576), this.l3_enc = b0(576), this.scalefac = b0(Yi.SFBMAX), this.xrpow_max = 0, this.part2_3_length = 0, this.big_values = 0, this.count1 = 0, this.global_gain = 0, this.scalefac_compress = 0, this.block_type = 0, this.mixed_block_flag = 0, this.table_select = b0(3), this.subblock_gain = b0(4), this.region0_count = 0, this.region1_count = 0, this.preflag = 0, this.scalefac_scale = 0, this.count1table_select = 0, this.part2_length = 0, this.sfb_lmax = 0, this.sfb_smin = 0, this.psy_lmax = 0, this.sfbmax = 0, this.psymax = 0, this.sfbdivide = 0, this.width = b0(Yi.SFBMAX), this.window = b0(Yi.SFBMAX), this.count1bits = 0, this.sfb_partition_table = null, this.slen = b0(4), this.max_nonzero_coeff = 0;
|
|
2797
2797
|
var t = this;
|
|
2798
2798
|
function e(n) {
|
|
2799
2799
|
return new Int32Array(n);
|
|
@@ -2805,7 +2805,7 @@ function ar() {
|
|
|
2805
2805
|
t.xr = i(n.xr), t.l3_enc = e(n.l3_enc), t.scalefac = e(n.scalefac), t.xrpow_max = n.xrpow_max, t.part2_3_length = n.part2_3_length, t.big_values = n.big_values, t.count1 = n.count1, t.global_gain = n.global_gain, t.scalefac_compress = n.scalefac_compress, t.block_type = n.block_type, t.mixed_block_flag = n.mixed_block_flag, t.table_select = e(n.table_select), t.subblock_gain = e(n.subblock_gain), t.region0_count = n.region0_count, t.region1_count = n.region1_count, t.preflag = n.preflag, t.scalefac_scale = n.scalefac_scale, t.count1table_select = n.count1table_select, t.part2_length = n.part2_length, t.sfb_lmax = n.sfb_lmax, t.sfb_smin = n.sfb_smin, t.psy_lmax = n.psy_lmax, t.sfbmax = n.sfbmax, t.psymax = n.psymax, t.sfbdivide = n.sfbdivide, t.width = e(n.width), t.window = e(n.window), t.count1bits = n.count1bits, t.sfb_partition_table = n.sfb_partition_table.slice(0), t.slen = e(n.slen), t.max_nonzero_coeff = n.max_nonzero_coeff;
|
|
2806
2806
|
};
|
|
2807
2807
|
}
|
|
2808
|
-
var rn =
|
|
2808
|
+
var rn = lr, Zt = it;
|
|
2809
2809
|
Zt.System;
|
|
2810
2810
|
Zt.VbrMode;
|
|
2811
2811
|
Zt.Float;
|
|
@@ -2817,17 +2817,17 @@ Zt.new_byte;
|
|
|
2817
2817
|
Zt.new_double;
|
|
2818
2818
|
Zt.new_float;
|
|
2819
2819
|
Zt.new_float_n;
|
|
2820
|
-
var
|
|
2820
|
+
var Gs = Zt.new_int;
|
|
2821
2821
|
Zt.new_int_n;
|
|
2822
2822
|
Zt.assert;
|
|
2823
|
-
var
|
|
2824
|
-
function
|
|
2825
|
-
this.tt = [[null, null], [null, null]], this.main_data_begin = 0, this.private_bits = 0, this.resvDrain_pre = 0, this.resvDrain_post = 0, this.scfsi = [
|
|
2823
|
+
var or = rn;
|
|
2824
|
+
function cr() {
|
|
2825
|
+
this.tt = [[null, null], [null, null]], this.main_data_begin = 0, this.private_bits = 0, this.resvDrain_pre = 0, this.resvDrain_post = 0, this.scfsi = [Gs(4), Gs(4)];
|
|
2826
2826
|
for (var t = 0; t < 2; t++)
|
|
2827
2827
|
for (var e = 0; e < 2; e++)
|
|
2828
|
-
this.tt[t][e] = new
|
|
2828
|
+
this.tt[t][e] = new or();
|
|
2829
2829
|
}
|
|
2830
|
-
var
|
|
2830
|
+
var dr = cr, Xt = it, ii = Xt.System;
|
|
2831
2831
|
Xt.VbrMode;
|
|
2832
2832
|
Xt.Float;
|
|
2833
2833
|
Xt.ShortBlock;
|
|
@@ -2842,12 +2842,12 @@ var si = Xt.new_int;
|
|
|
2842
2842
|
Xt.new_int_n;
|
|
2843
2843
|
Xt.assert;
|
|
2844
2844
|
var ni = bt();
|
|
2845
|
-
function
|
|
2845
|
+
function mr(t, e, i, n) {
|
|
2846
2846
|
this.l = si(1 + ni.SBMAX_l), this.s = si(1 + ni.SBMAX_s), this.psfb21 = si(1 + ni.PSFB21), this.psfb12 = si(1 + ni.PSFB12);
|
|
2847
2847
|
var d = this.l, o = this.s;
|
|
2848
2848
|
arguments.length == 4 && (this.arrL = arguments[0], this.arrS = arguments[1], this.arr21 = arguments[2], this.arr12 = arguments[3], ii.arraycopy(this.arrL, 0, d, 0, Math.min(this.arrL.length, this.l.length)), ii.arraycopy(this.arrS, 0, o, 0, Math.min(this.arrS.length, this.s.length)), ii.arraycopy(this.arr21, 0, this.psfb21, 0, Math.min(this.arr21.length, this.psfb21.length)), ii.arraycopy(this.arr12, 0, this.psfb12, 0, Math.min(this.arr12.length, this.psfb12.length)));
|
|
2849
2849
|
}
|
|
2850
|
-
var an =
|
|
2850
|
+
var an = mr, _t = it;
|
|
2851
2851
|
_t.System;
|
|
2852
2852
|
_t.VbrMode;
|
|
2853
2853
|
_t.Float;
|
|
@@ -2857,28 +2857,28 @@ _t.Arrays;
|
|
|
2857
2857
|
_t.new_array_n;
|
|
2858
2858
|
_t.new_byte;
|
|
2859
2859
|
_t.new_double;
|
|
2860
|
-
var wi = _t.new_float,
|
|
2860
|
+
var wi = _t.new_float, ur = _t.new_float_n, hr = _t.new_int;
|
|
2861
2861
|
_t.new_int_n;
|
|
2862
2862
|
_t.assert;
|
|
2863
2863
|
var vs = bt();
|
|
2864
|
-
function
|
|
2865
|
-
this.last_en_subshort =
|
|
2864
|
+
function br() {
|
|
2865
|
+
this.last_en_subshort = ur([4, 9]), this.lastAttacks = hr(4), this.pefirbuf = wi(19), this.longfact = wi(vs.SBMAX_l), this.shortfact = wi(vs.SBMAX_s), this.attackthre = 0, this.attackthre_s = 0;
|
|
2866
2866
|
}
|
|
2867
|
-
var
|
|
2868
|
-
function
|
|
2867
|
+
var pr = br;
|
|
2868
|
+
function yr() {
|
|
2869
2869
|
this.sum = 0, this.seen = 0, this.want = 0, this.pos = 0, this.size = 0, this.bag = null, this.nVbrNumFrames = 0, this.nBytesWritten = 0, this.TotalFrameSize = 0;
|
|
2870
2870
|
}
|
|
2871
|
-
var
|
|
2872
|
-
|
|
2873
|
-
|
|
2874
|
-
|
|
2875
|
-
|
|
2876
|
-
|
|
2877
|
-
|
|
2878
|
-
|
|
2879
|
-
var
|
|
2880
|
-
|
|
2881
|
-
var
|
|
2871
|
+
var fr = yr, St = it;
|
|
2872
|
+
St.System;
|
|
2873
|
+
St.VbrMode;
|
|
2874
|
+
St.Float;
|
|
2875
|
+
St.ShortBlock;
|
|
2876
|
+
St.Util;
|
|
2877
|
+
St.Arrays;
|
|
2878
|
+
St.new_array_n;
|
|
2879
|
+
var Zr = St.new_byte, Xr = St.new_double, Bt = St.new_float, p0 = St.new_float_n, Nt = St.new_int, ri = St.new_int_n;
|
|
2880
|
+
St.assert;
|
|
2881
|
+
var _r = dr, Sr = an, Gr = pr, vr = fr, Is = sn(), Pe = bt(), Ir = Qi;
|
|
2882
2882
|
n0.MFSIZE = 3 * 1152 + Pe.ENCDELAY - Pe.MDCTDELAY;
|
|
2883
2883
|
n0.MAX_HEADER_BUF = 256;
|
|
2884
2884
|
n0.MAX_BITS_PER_CHANNEL = 4095;
|
|
@@ -2886,11 +2886,11 @@ n0.MAX_BITS_PER_GRANULE = 7680;
|
|
|
2886
2886
|
n0.BPC = 320;
|
|
2887
2887
|
function n0() {
|
|
2888
2888
|
var t = 40;
|
|
2889
|
-
this.Class_ID = 0, this.lame_encode_frame_init = 0, this.iteration_init_init = 0, this.fill_buffer_resample_init = 0, this.mfbuf = p0([2, n0.MFSIZE]), this.mode_gr = 0, this.channels_in = 0, this.channels_out = 0, this.resample_ratio = 0, this.mf_samples_to_encode = 0, this.mf_size = 0, this.VBR_min_bitrate = 0, this.VBR_max_bitrate = 0, this.bitrate_index = 0, this.samplerate_index = 0, this.mode_ext = 0, this.lowpass1 = 0, this.lowpass2 = 0, this.highpass1 = 0, this.highpass2 = 0, this.noise_shaping = 0, this.noise_shaping_amp = 0, this.substep_shaping = 0, this.psymodel = 0, this.noise_shaping_stop = 0, this.subblock_gain = 0, this.use_best_huffman = 0, this.full_outer_loop = 0, this.l3_side = new
|
|
2889
|
+
this.Class_ID = 0, this.lame_encode_frame_init = 0, this.iteration_init_init = 0, this.fill_buffer_resample_init = 0, this.mfbuf = p0([2, n0.MFSIZE]), this.mode_gr = 0, this.channels_in = 0, this.channels_out = 0, this.resample_ratio = 0, this.mf_samples_to_encode = 0, this.mf_size = 0, this.VBR_min_bitrate = 0, this.VBR_max_bitrate = 0, this.bitrate_index = 0, this.samplerate_index = 0, this.mode_ext = 0, this.lowpass1 = 0, this.lowpass2 = 0, this.highpass1 = 0, this.highpass2 = 0, this.noise_shaping = 0, this.noise_shaping_amp = 0, this.substep_shaping = 0, this.psymodel = 0, this.noise_shaping_stop = 0, this.subblock_gain = 0, this.use_best_huffman = 0, this.full_outer_loop = 0, this.l3_side = new _r(), this.ms_ratio = Bt(2), this.padding = 0, this.frac_SpF = 0, this.slot_lag = 0, this.tag_spec = null, this.nMusicCRC = 0, this.OldValue = Nt(2), this.CurrentStep = Nt(2), this.masking_lower = 0, this.bv_scf = Nt(576), this.pseudohalf = Nt(Ir.SFBMAX), this.sfb21_extra = !1, this.inbuf_old = new Array(2), this.blackfilt = new Array(2 * n0.BPC + 1), this.itime = Xr(2), this.sideinfo_len = 0, this.sb_sample = p0([2, 2, 18, Pe.SBLIMIT]), this.amp_filter = Bt(32);
|
|
2890
2890
|
function e() {
|
|
2891
|
-
this.write_timing = 0, this.ptr = 0, this.buf =
|
|
2891
|
+
this.write_timing = 0, this.ptr = 0, this.buf = Zr(t);
|
|
2892
2892
|
}
|
|
2893
|
-
this.header = new Array(n0.MAX_HEADER_BUF), this.h_ptr = 0, this.w_ptr = 0, this.ancillary_flag = 0, this.ResvSize = 0, this.ResvMax = 0, this.scalefac_band = new
|
|
2893
|
+
this.header = new Array(n0.MAX_HEADER_BUF), this.h_ptr = 0, this.w_ptr = 0, this.ancillary_flag = 0, this.ResvSize = 0, this.ResvMax = 0, this.scalefac_band = new Sr(), this.minval_l = Bt(Pe.CBANDS), this.minval_s = Bt(Pe.CBANDS), this.nb_1 = p0([4, Pe.CBANDS]), this.nb_2 = p0([4, Pe.CBANDS]), this.nb_s1 = p0([4, Pe.CBANDS]), this.nb_s2 = p0([4, Pe.CBANDS]), this.s3_ss = null, this.s3_ll = null, this.decay = 0, this.thm = new Array(4), this.en = new Array(4), this.tot_ener = Bt(4), this.loudness_sq = p0([2, 2]), this.loudness_sq_save = Bt(2), this.mld_l = Bt(Pe.SBMAX_l), this.mld_s = Bt(Pe.SBMAX_s), this.bm_l = Nt(Pe.SBMAX_l), this.bo_l = Nt(Pe.SBMAX_l), this.bm_s = Nt(Pe.SBMAX_s), this.bo_s = Nt(Pe.SBMAX_s), this.npart_l = 0, this.npart_s = 0, this.s3ind = ri([Pe.CBANDS, 2]), this.s3ind_s = ri([Pe.CBANDS, 2]), this.numlines_s = Nt(Pe.CBANDS), this.numlines_l = Nt(Pe.CBANDS), this.rnumlines_l = Bt(Pe.CBANDS), this.mld_cb_l = Bt(Pe.CBANDS), this.mld_cb_s = Bt(Pe.CBANDS), this.numlines_s_num1 = 0, this.numlines_l_num1 = 0, this.pe = Bt(4), this.ms_ratio_s_old = 0, this.ms_ratio_l_old = 0, this.ms_ener_ratio_old = 0, this.blocktype_old = Nt(2), this.nsPsy = new Gr(), this.VBR_seek_table = new vr(), this.ATH = null, this.PSY = null, this.nogap_total = 0, this.nogap_current = 0, this.decode_on_the_fly = !0, this.findReplayGain = !0, this.findPeakSample = !0, this.PeakSample = 0, this.RadioGain = 0, this.AudiophileGain = 0, this.rgdata = null, this.noclipGainChange = 0, this.noclipScale = 0, this.bitrate_stereoMode_Hist = ri([16, 5]), this.bitrate_blockType_Hist = ri([16, 6]), this.pinfo = null, this.hip = null, this.in_buffer_nsamples = 0, this.in_buffer_0 = null, this.in_buffer_1 = null, this.iteration_loop = null;
|
|
2894
2894
|
for (var i = 0; i < this.en.length; i++)
|
|
2895
2895
|
this.en[i] = new Is();
|
|
2896
2896
|
for (var i = 0; i < this.thm.length; i++)
|
|
@@ -2898,26 +2898,26 @@ function n0() {
|
|
|
2898
2898
|
for (var i = 0; i < this.header.length; i++)
|
|
2899
2899
|
this.header[i] = new e();
|
|
2900
2900
|
}
|
|
2901
|
-
var yi = n0,
|
|
2902
|
-
|
|
2903
|
-
|
|
2904
|
-
|
|
2905
|
-
|
|
2906
|
-
|
|
2907
|
-
|
|
2908
|
-
|
|
2909
|
-
|
|
2910
|
-
|
|
2911
|
-
var y0 =
|
|
2912
|
-
|
|
2913
|
-
|
|
2914
|
-
|
|
2915
|
-
|
|
2901
|
+
var yi = n0, Gt = it;
|
|
2902
|
+
Gt.System;
|
|
2903
|
+
Gt.VbrMode;
|
|
2904
|
+
Gt.Float;
|
|
2905
|
+
Gt.ShortBlock;
|
|
2906
|
+
Gt.Util;
|
|
2907
|
+
Gt.Arrays;
|
|
2908
|
+
Gt.new_array_n;
|
|
2909
|
+
Gt.new_byte;
|
|
2910
|
+
Gt.new_double;
|
|
2911
|
+
var y0 = Gt.new_float;
|
|
2912
|
+
Gt.new_float_n;
|
|
2913
|
+
Gt.new_int;
|
|
2914
|
+
Gt.new_int_n;
|
|
2915
|
+
Gt.assert;
|
|
2916
2916
|
var f0 = bt();
|
|
2917
|
-
function
|
|
2917
|
+
function Vr() {
|
|
2918
2918
|
this.useAdjust = 0, this.aaSensitivityP = 0, this.adjust = 0, this.adjustLimit = 0, this.decay = 0, this.floor = 0, this.l = y0(f0.SBMAX_l), this.s = y0(f0.SBMAX_s), this.psfb21 = y0(f0.PSFB21), this.psfb12 = y0(f0.PSFB12), this.cb_l = y0(f0.CBANDS), this.cb_s = y0(f0.CBANDS), this.eql_w = y0(f0.BLKSIZE / 2);
|
|
2919
2919
|
}
|
|
2920
|
-
var
|
|
2920
|
+
var Rr = Vr, vt = it, ut = vt.System;
|
|
2921
2921
|
vt.VbrMode;
|
|
2922
2922
|
vt.Float;
|
|
2923
2923
|
vt.ShortBlock;
|
|
@@ -3232,7 +3232,7 @@ function Ce() {
|
|
|
3232
3232
|
for (; J-- != 0; )
|
|
3233
3233
|
w[N] = Z[O + 0] * U[0] - w[N - 1] * U[1] + Z[O - 1] * U[2] - w[N - 2] * U[3] + Z[O - 2] * U[4], ++N, ++O;
|
|
3234
3234
|
}
|
|
3235
|
-
function
|
|
3235
|
+
function S(Z, O) {
|
|
3236
3236
|
for (var w = 0; w < MAX_ORDER; w++)
|
|
3237
3237
|
Z.linprebuf[w] = Z.lstepbuf[w] = Z.loutbuf[w] = Z.rinprebuf[w] = Z.rstepbuf[w] = Z.routbuf[w] = 0;
|
|
3238
3238
|
switch (0 | O) {
|
|
@@ -3269,7 +3269,7 @@ function Ce() {
|
|
|
3269
3269
|
return Z.sampleWindow = 0 | (O * i + n - 1) / n, Z.lsum = 0, Z.rsum = 0, Z.totsamp = 0, Vs.ill(Z.A, 0), INIT_GAIN_ANALYSIS_OK;
|
|
3270
3270
|
}
|
|
3271
3271
|
this.InitGainAnalysis = function(Z, O) {
|
|
3272
|
-
return
|
|
3272
|
+
return S(Z, O) != INIT_GAIN_ANALYSIS_OK ? INIT_GAIN_ANALYSIS_ERROR : (Z.linpre = MAX_ORDER, Z.rinpre = MAX_ORDER, Z.lstep = MAX_ORDER, Z.rstep = MAX_ORDER, Z.lout = MAX_ORDER, Z.rout = MAX_ORDER, Vs.fill(Z.B, 0), INIT_GAIN_ANALYSIS_OK);
|
|
3273
3273
|
};
|
|
3274
3274
|
function W(Z) {
|
|
3275
3275
|
return Z * Z;
|
|
@@ -3407,7 +3407,7 @@ function Ce() {
|
|
|
3407
3407
|
return Z.totsamp = 0, Z.lsum = Z.rsum = 0, O;
|
|
3408
3408
|
};
|
|
3409
3409
|
}
|
|
3410
|
-
var
|
|
3410
|
+
var Tr = Ce, It = it;
|
|
3411
3411
|
It.System;
|
|
3412
3412
|
It.VbrMode;
|
|
3413
3413
|
It.Float;
|
|
@@ -3422,15 +3422,15 @@ It.new_float_n;
|
|
|
3422
3422
|
var Rs = It.new_int;
|
|
3423
3423
|
It.new_int_n;
|
|
3424
3424
|
It.assert;
|
|
3425
|
-
var ht =
|
|
3426
|
-
function
|
|
3425
|
+
var ht = Tr;
|
|
3426
|
+
function Wr() {
|
|
3427
3427
|
this.linprebuf = x0(ht.MAX_ORDER * 2), this.linpre = 0, this.lstepbuf = x0(ht.MAX_SAMPLES_PER_WINDOW + ht.MAX_ORDER), this.lstep = 0, this.loutbuf = x0(ht.MAX_SAMPLES_PER_WINDOW + ht.MAX_ORDER), this.lout = 0, this.rinprebuf = x0(ht.MAX_ORDER * 2), this.rinpre = 0, this.rstepbuf = x0(ht.MAX_SAMPLES_PER_WINDOW + ht.MAX_ORDER), this.rstep = 0, this.routbuf = x0(ht.MAX_SAMPLES_PER_WINDOW + ht.MAX_ORDER), this.rout = 0, this.sampleWindow = 0, this.totsamp = 0, this.lsum = 0, this.rsum = 0, this.freqindex = 0, this.first = 0, this.A = Rs(0 | ht.STEPS_per_dB * ht.MAX_dB), this.B = Rs(0 | ht.STEPS_per_dB * ht.MAX_dB);
|
|
3428
3428
|
}
|
|
3429
|
-
var
|
|
3430
|
-
function
|
|
3429
|
+
var Lr = Wr;
|
|
3430
|
+
function xr(t) {
|
|
3431
3431
|
this.bits = t;
|
|
3432
3432
|
}
|
|
3433
|
-
var ln =
|
|
3433
|
+
var ln = xr, Vt = it;
|
|
3434
3434
|
Vt.System;
|
|
3435
3435
|
Vt.VbrMode;
|
|
3436
3436
|
Vt.Float;
|
|
@@ -3442,13 +3442,13 @@ Vt.new_byte;
|
|
|
3442
3442
|
Vt.new_double;
|
|
3443
3443
|
var Ts = Vt.new_float;
|
|
3444
3444
|
Vt.new_float_n;
|
|
3445
|
-
var
|
|
3445
|
+
var Hr = Vt.new_int;
|
|
3446
3446
|
Vt.new_int_n;
|
|
3447
|
-
var Ws = Vt.assert,
|
|
3448
|
-
function
|
|
3447
|
+
var Ws = Vt.assert, Yr = ln, Ls = bt(), wr = Qi, Kr = yi;
|
|
3448
|
+
function Mr(t) {
|
|
3449
3449
|
var e = t;
|
|
3450
3450
|
this.quantize = e, this.iteration_loop = function(i, n, d, o) {
|
|
3451
|
-
var m = i.internal_flags, h = Ts(
|
|
3451
|
+
var m = i.internal_flags, h = Ts(wr.SFBMAX), S = Ts(576), W = Hr(2), v = 0, Z, O = m.l3_side, w = new Yr(v);
|
|
3452
3452
|
this.quantize.rv.ResvFrameBegin(i, w), v = w.bits;
|
|
3453
3453
|
for (var N = 0; N < m.mode_gr; N++) {
|
|
3454
3454
|
Z = this.quantize.qupvt.on_pe(
|
|
@@ -3469,7 +3469,7 @@ function Kr(t) {
|
|
|
3469
3469
|
I.block_type != Ls.SHORT_TYPE ? (U = 0, k = m.PSY.mask_adjust - U) : (U = 0, k = m.PSY.mask_adjust_short - U), m.masking_lower = Math.pow(
|
|
3470
3470
|
10,
|
|
3471
3471
|
k * 0.1
|
|
3472
|
-
), this.quantize.init_outer_loop(m, I), this.quantize.init_xrpow(m, I,
|
|
3472
|
+
), this.quantize.init_outer_loop(m, I), this.quantize.init_xrpow(m, I, S) && (this.quantize.qupvt.calc_xmin(
|
|
3473
3473
|
i,
|
|
3474
3474
|
o[N][J],
|
|
3475
3475
|
I,
|
|
@@ -3478,16 +3478,16 @@ function Kr(t) {
|
|
|
3478
3478
|
i,
|
|
3479
3479
|
I,
|
|
3480
3480
|
h,
|
|
3481
|
-
|
|
3481
|
+
S,
|
|
3482
3482
|
J,
|
|
3483
3483
|
W[J]
|
|
3484
|
-
)), this.quantize.iteration_finish_one(m, N, J), Ws(I.part2_3_length <=
|
|
3484
|
+
)), this.quantize.iteration_finish_one(m, N, J), Ws(I.part2_3_length <= Kr.MAX_BITS_PER_CHANNEL), Ws(I.part2_3_length <= W[J]);
|
|
3485
3485
|
}
|
|
3486
3486
|
}
|
|
3487
3487
|
this.quantize.rv.ResvFrameEnd(m, v);
|
|
3488
3488
|
};
|
|
3489
3489
|
}
|
|
3490
|
-
var
|
|
3490
|
+
var kr = Mr;
|
|
3491
3491
|
function xe(t, e, i, n) {
|
|
3492
3492
|
this.xlen = t, this.linmax = e, this.table = i, this.hlen = n;
|
|
3493
3493
|
}
|
|
@@ -6989,9 +6989,9 @@ Rt.new_byte;
|
|
|
6989
6989
|
Rt.new_double;
|
|
6990
6990
|
var X0 = Rt.new_float;
|
|
6991
6991
|
Rt.new_float_n;
|
|
6992
|
-
var
|
|
6992
|
+
var Br = Rt.new_int;
|
|
6993
6993
|
Rt.new_int_n;
|
|
6994
|
-
var t0 = Rt.assert, et = bt(),
|
|
6994
|
+
var t0 = Rt.assert, et = bt(), Cr = ln, lt = yi;
|
|
6995
6995
|
wt.Q_MAX = 257;
|
|
6996
6996
|
wt.Q_MAX2 = 116;
|
|
6997
6997
|
wt.LARGE_BITS = 1e5;
|
|
@@ -7007,7 +7007,7 @@ function wt() {
|
|
|
7007
7007
|
this.IPOW20 = function(I) {
|
|
7008
7008
|
return t0(0 <= I && I < wt.Q_MAX), O[I];
|
|
7009
7009
|
};
|
|
7010
|
-
var d = 2220446049250313e-31, o = wt.IXMAX_VAL, m = o + 2, h = wt.Q_MAX,
|
|
7010
|
+
var d = 2220446049250313e-31, o = wt.IXMAX_VAL, m = o + 2, h = wt.Q_MAX, S = wt.Q_MAX2;
|
|
7011
7011
|
wt.LARGE_BITS;
|
|
7012
7012
|
var W = 100;
|
|
7013
7013
|
this.nr_of_sfb_block = [
|
|
@@ -7378,7 +7378,7 @@ function wt() {
|
|
|
7378
7378
|
/* sfb12 pseudo sub bands */
|
|
7379
7379
|
)
|
|
7380
7380
|
];
|
|
7381
|
-
var Z = X0(h +
|
|
7381
|
+
var Z = X0(h + S + 1), O = X0(h), w = X0(m), N = X0(m);
|
|
7382
7382
|
this.adj43 = N;
|
|
7383
7383
|
function J(I, r) {
|
|
7384
7384
|
var K = i.ATHformula(r, I);
|
|
@@ -7443,8 +7443,8 @@ function wt() {
|
|
|
7443
7443
|
);
|
|
7444
7444
|
for (N[X] = 0.5, X = 0; X < h; X++)
|
|
7445
7445
|
O[X] = Math.pow(2, (X - 210) * -0.1875);
|
|
7446
|
-
for (X = 0; X <= h +
|
|
7447
|
-
Z[X] = Math.pow(2, (X - 210 -
|
|
7446
|
+
for (X = 0; X <= h + S; X++)
|
|
7447
|
+
Z[X] = Math.pow(2, (X - 210 - S) * 0.25);
|
|
7448
7448
|
t.huffman_init(r);
|
|
7449
7449
|
{
|
|
7450
7450
|
var A, T, H, p;
|
|
@@ -7459,7 +7459,7 @@ function wt() {
|
|
|
7459
7459
|
}
|
|
7460
7460
|
}
|
|
7461
7461
|
}, this.on_pe = function(I, r, K, X, A, T) {
|
|
7462
|
-
var H = I.internal_flags, p = 0, u, l =
|
|
7462
|
+
var H = I.internal_flags, p = 0, u, l = Br(2), s, V = new Cr(p), _ = e.ResvMaxBits(I, X, V, T);
|
|
7463
7463
|
p = V.bits;
|
|
7464
7464
|
var R = p + _;
|
|
7465
7465
|
for (R > lt.MAX_BITS_PER_GRANULE && (R = lt.MAX_BITS_PER_GRANULE), u = 0, s = 0; s < H.channels_out; ++s)
|
|
@@ -7613,12 +7613,12 @@ function wt() {
|
|
|
7613
7613
|
T.pinfo.LAMEqss[X][A] = r.global_gain, T.pinfo.LAMEmainbits[X][A] = r.part2_3_length + r.part2_length, T.pinfo.LAMEsfbits[X][A] = r.part2_length, T.pinfo.over[X][A] = j.over_count, T.pinfo.max_noise[X][A] = j.max_noise * 10, T.pinfo.over_noise[X][A] = j.over_noise * 10, T.pinfo.tot_noise[X][A] = j.tot_noise * 10, T.pinfo.over_SSD[X][A] = j.over_SSD;
|
|
7614
7614
|
};
|
|
7615
7615
|
}
|
|
7616
|
-
var
|
|
7616
|
+
var gr = wt, Tt = it, Fr = Tt.System;
|
|
7617
7617
|
Tt.VbrMode;
|
|
7618
7618
|
Tt.Float;
|
|
7619
7619
|
Tt.ShortBlock;
|
|
7620
7620
|
Tt.Util;
|
|
7621
|
-
var
|
|
7621
|
+
var Jr = Tt.Arrays;
|
|
7622
7622
|
Tt.new_array_n;
|
|
7623
7623
|
Tt.new_byte;
|
|
7624
7624
|
Tt.new_double;
|
|
@@ -7626,7 +7626,7 @@ Tt.new_float;
|
|
|
7626
7626
|
Tt.new_float_n;
|
|
7627
7627
|
var N0 = Tt.new_int;
|
|
7628
7628
|
Tt.new_int_n;
|
|
7629
|
-
var Ct = Tt.assert, Je = bt(), Ee = Di,
|
|
7629
|
+
var Ct = Tt.assert, Je = bt(), Ee = Di, Er = rn, _0 = gr;
|
|
7630
7630
|
function Ai() {
|
|
7631
7631
|
var t = null;
|
|
7632
7632
|
this.qupvt = null, this.setModules = function(u) {
|
|
@@ -7724,7 +7724,7 @@ function Ai() {
|
|
|
7724
7724
|
var he = V.width[R];
|
|
7725
7725
|
if (j + V.width[R] > V.max_nonzero_coeff) {
|
|
7726
7726
|
var oe;
|
|
7727
|
-
oe = V.max_nonzero_coeff - j + 1,
|
|
7727
|
+
oe = V.max_nonzero_coeff - j + 1, Jr.fill(l, V.max_nonzero_coeff, 576, 0), he = oe, he < 0 && (he = 0), R = f + 1;
|
|
7728
7728
|
}
|
|
7729
7729
|
if (P == 0 && a == 0 && (ee = M, ae = L, le = u, re = c), _ != null && _.sfb_count1 > 0 && R >= _.sfb_count1 && _.step[R] > 0 && _e >= _.step[R] ? (P != 0 && (d(
|
|
7730
7730
|
P,
|
|
@@ -7793,7 +7793,7 @@ function Ai() {
|
|
|
7793
7793
|
} while (l < s);
|
|
7794
7794
|
return g = j & 65535, j >>= 16, j > g && (j = g, V = _), R.bits += j, V;
|
|
7795
7795
|
}
|
|
7796
|
-
function
|
|
7796
|
+
function S(u, l, s, V) {
|
|
7797
7797
|
var _ = 0, R = Ee.ht[1].hlen;
|
|
7798
7798
|
do {
|
|
7799
7799
|
var f = u[l + 0] * 2 + u[l + 1];
|
|
@@ -7842,7 +7842,7 @@ function Ai() {
|
|
|
7842
7842
|
case 0:
|
|
7843
7843
|
return _;
|
|
7844
7844
|
case 1:
|
|
7845
|
-
return
|
|
7845
|
+
return S(u, l, s, V);
|
|
7846
7846
|
case 2:
|
|
7847
7847
|
case 3:
|
|
7848
7848
|
return W(
|
|
@@ -7971,7 +7971,7 @@ function Ai() {
|
|
|
7971
7971
|
}
|
|
7972
7972
|
}
|
|
7973
7973
|
this.best_huffman_divide = function(u, l) {
|
|
7974
|
-
var s = new
|
|
7974
|
+
var s = new Er(), V = l.l3_enc, _ = N0(23), R = N0(23), f = N0(23), j = N0(23);
|
|
7975
7975
|
if (!(l.block_type == Je.SHORT_TYPE && u.mode_gr == 1)) {
|
|
7976
7976
|
s.assign(l), l.block_type == Je.NORM_TYPE && (w(u, l, V, _, R, f, j), N(
|
|
7977
7977
|
u,
|
|
@@ -8192,7 +8192,7 @@ function Ai() {
|
|
|
8192
8192
|
l.scalefac_compress = 500 + L * 3 + ee;
|
|
8193
8193
|
break;
|
|
8194
8194
|
default:
|
|
8195
|
-
|
|
8195
|
+
Fr.err.printf(`intensity stereo not implemented yet
|
|
8196
8196
|
`);
|
|
8197
8197
|
break;
|
|
8198
8198
|
}
|
|
@@ -8232,19 +8232,19 @@ function Ai() {
|
|
|
8232
8232
|
}
|
|
8233
8233
|
};
|
|
8234
8234
|
}
|
|
8235
|
-
var
|
|
8235
|
+
var Nr = Ai, Wt = it, At = Wt.System;
|
|
8236
8236
|
Wt.VbrMode;
|
|
8237
8237
|
Wt.Float;
|
|
8238
8238
|
Wt.ShortBlock;
|
|
8239
8239
|
Wt.Util;
|
|
8240
|
-
var
|
|
8240
|
+
var Pr = Wt.Arrays;
|
|
8241
8241
|
Wt.new_array_n;
|
|
8242
|
-
var
|
|
8242
|
+
var Ur = Wt.new_byte;
|
|
8243
8243
|
Wt.new_double;
|
|
8244
8244
|
Wt.new_float;
|
|
8245
|
-
var
|
|
8245
|
+
var zr = Wt.new_float_n, Ar = Wt.new_int;
|
|
8246
8246
|
Wt.new_int_n;
|
|
8247
|
-
var Ve = Wt.assert, xs =
|
|
8247
|
+
var Ve = Wt.assert, xs = Nr, Mi = Di, li = bt(), S0 = yi;
|
|
8248
8248
|
mi.EQ = function(t, e) {
|
|
8249
8249
|
return Math.abs(t) > Math.abs(e) ? Math.abs(t - e) <= Math.abs(t) * 1e-6 : Math.abs(t - e) <= Math.abs(e) * 1e-6;
|
|
8250
8250
|
};
|
|
@@ -8256,7 +8256,7 @@ function mi() {
|
|
|
8256
8256
|
this.setModules = function(p, u, l, s) {
|
|
8257
8257
|
n = p, d = u, o = l, m = s;
|
|
8258
8258
|
};
|
|
8259
|
-
var h = null,
|
|
8259
|
+
var h = null, S = 0, W = 0, v = 0;
|
|
8260
8260
|
this.getframebits = function(p) {
|
|
8261
8261
|
var u = p.internal_flags, l;
|
|
8262
8262
|
u.bitrate_index != 0 ? l = Mi.bitrate_table[p.version][u.bitrate_index] : l = p.brate, Ve(8 <= l && l <= 640);
|
|
@@ -8264,18 +8264,18 @@ function mi() {
|
|
|
8264
8264
|
return 8 * s;
|
|
8265
8265
|
};
|
|
8266
8266
|
function Z(p) {
|
|
8267
|
-
At.arraycopy(p.header[p.w_ptr].buf, 0, h, W, p.sideinfo_len), W += p.sideinfo_len,
|
|
8267
|
+
At.arraycopy(p.header[p.w_ptr].buf, 0, h, W, p.sideinfo_len), W += p.sideinfo_len, S += p.sideinfo_len * 8, p.w_ptr = p.w_ptr + 1 & S0.MAX_HEADER_BUF - 1;
|
|
8268
8268
|
}
|
|
8269
8269
|
function O(p, u, l) {
|
|
8270
8270
|
for (Ve(l < i - 2); l > 0; ) {
|
|
8271
8271
|
var s;
|
|
8272
|
-
v == 0 && (v = 8, W++, Ve(W < Lame.LAME_MAXMP3BUFFER), Ve(p.header[p.w_ptr].write_timing >=
|
|
8272
|
+
v == 0 && (v = 8, W++, Ve(W < Lame.LAME_MAXMP3BUFFER), Ve(p.header[p.w_ptr].write_timing >= S), p.header[p.w_ptr].write_timing == S && Z(p), h[W] = 0), s = Math.min(l, v), l -= s, v -= s, Ve(l < i), Ve(v < i), h[W] |= u >> l << v, S += s;
|
|
8273
8273
|
}
|
|
8274
8274
|
}
|
|
8275
8275
|
function w(p, u, l) {
|
|
8276
8276
|
for (Ve(l < i - 2); l > 0; ) {
|
|
8277
8277
|
var s;
|
|
8278
|
-
v == 0 && (v = 8, W++, Ve(W < Lame.LAME_MAXMP3BUFFER), h[W] = 0), s = Math.min(l, v), l -= s, v -= s, Ve(l < i), Ve(v < i), h[W] |= u >> l << v,
|
|
8278
|
+
v == 0 && (v = 8, W++, Ve(W < Lame.LAME_MAXMP3BUFFER), h[W] = 0), s = Math.min(l, v), l -= s, v -= s, Ve(l < i), Ve(v < i), h[W] |= u >> l << v, S += s;
|
|
8279
8279
|
}
|
|
8280
8280
|
}
|
|
8281
8281
|
function N(p, u) {
|
|
@@ -8312,7 +8312,7 @@ function mi() {
|
|
|
8312
8312
|
};
|
|
8313
8313
|
function k(p, u) {
|
|
8314
8314
|
var l = p.internal_flags, s, V, _;
|
|
8315
|
-
if (s = l.l3_side, l.header[l.h_ptr].ptr = 0,
|
|
8315
|
+
if (s = l.l3_side, l.header[l.h_ptr].ptr = 0, Pr.fill(l.header[l.h_ptr].buf, 0, l.sideinfo_len, 0), p.out_samplerate < 16e3 ? J(l, 4094, 12) : J(l, 4095, 12), J(l, p.version, 1), J(l, 1, 2), J(l, p.error_protection ? 0 : 1, 1), J(l, l.bitrate_index, 4), J(l, l.samplerate_index, 2), J(l, l.padding, 1), J(l, p.extension, 1), J(l, p.mode.ordinal(), 2), J(l, l.mode_ext, 2), J(l, p.copyright, 1), J(l, p.original, 1), J(l, p.emphasis, 2), p.error_protection && J(l, 0, 16), p.version == 1) {
|
|
8316
8316
|
for (Ve(s.main_data_begin >= 0), J(l, s.main_data_begin, 9), l.channels_out == 2 ? J(l, s.private_bits, 3) : J(l, s.private_bits, 5), _ = 0; _ < l.channels_out; _++) {
|
|
8317
8317
|
var R;
|
|
8318
8318
|
for (R = 0; R < 4; R++)
|
|
@@ -8331,7 +8331,7 @@ function mi() {
|
|
|
8331
8331
|
p.error_protection && CRC_writeheader(l, l.header[l.h_ptr].buf);
|
|
8332
8332
|
{
|
|
8333
8333
|
var j = l.h_ptr;
|
|
8334
|
-
Ve(l.header[j].ptr == l.sideinfo_len * 8), l.h_ptr = j + 1 &
|
|
8334
|
+
Ve(l.header[j].ptr == l.sideinfo_len * 8), l.h_ptr = j + 1 & S0.MAX_HEADER_BUF - 1, l.header[l.h_ptr].write_timing = l.header[j].write_timing + u, l.h_ptr == l.w_ptr && At.err.println(`Error: MAX_HEADER_BUF too small in bitstream.c
|
|
8335
8335
|
`);
|
|
8336
8336
|
}
|
|
8337
8337
|
}
|
|
@@ -8445,13 +8445,13 @@ function mi() {
|
|
|
8445
8445
|
}
|
|
8446
8446
|
function H(p, u) {
|
|
8447
8447
|
var l = p.internal_flags, s, V, _, R, f;
|
|
8448
|
-
return f = l.w_ptr, R = l.h_ptr - 1, R == -1 && (R =
|
|
8448
|
+
return f = l.w_ptr, R = l.h_ptr - 1, R == -1 && (R = S0.MAX_HEADER_BUF - 1), s = l.header[R].write_timing - S, u.total = s, s >= 0 && (V = 1 + R - f, R < f && (V = 1 + R - f + S0.MAX_HEADER_BUF), s -= V * 8 * l.sideinfo_len), _ = t.getframebits(p), s += _, u.total += _, u.total % 8 != 0 ? u.total = 1 + u.total / 8 : u.total = u.total / 8, u.total += W + 1, s < 0 && At.err.println(`strange error flushing buffer ...
|
|
8449
8449
|
`), s;
|
|
8450
8450
|
}
|
|
8451
8451
|
this.flush_bitstream = function(p) {
|
|
8452
8452
|
var u = p.internal_flags, l, s, V = u.h_ptr - 1;
|
|
8453
|
-
if (V == -1 && (V =
|
|
8454
|
-
if (N(p, s), Ve(u.header[V].write_timing + this.getframebits(p) ==
|
|
8453
|
+
if (V == -1 && (V = S0.MAX_HEADER_BUF - 1), l = u.l3_side, !((s = H(p, new T())) < 0)) {
|
|
8454
|
+
if (N(p, s), Ve(u.header[V].write_timing + this.getframebits(p) == S), u.ResvSize = 0, l.main_data_begin = 0, u.findReplayGain) {
|
|
8455
8455
|
var _ = n.GetTitleGain(u.rgdata);
|
|
8456
8456
|
Ve(NEQ(_, GainAnalysis.GAIN_NOT_ENOUGH_SAMPLES)), u.RadioGain = Math.floor(_ * 10 + 0.5) | 0;
|
|
8457
8457
|
}
|
|
@@ -8459,7 +8459,7 @@ function mi() {
|
|
|
8459
8459
|
}
|
|
8460
8460
|
}, this.add_dummy_byte = function(p, u, l) {
|
|
8461
8461
|
for (var s = p.internal_flags, V; l-- > 0; )
|
|
8462
|
-
for (w(s, u, 8), V = 0; V <
|
|
8462
|
+
for (w(s, u, 8), V = 0; V < S0.MAX_HEADER_BUF; ++V)
|
|
8463
8463
|
s.header[V].write_timing += 8;
|
|
8464
8464
|
}, this.format_bitstream = function(p) {
|
|
8465
8465
|
var u = p.internal_flags, l;
|
|
@@ -8487,11 +8487,11 @@ bitsperframe: %d
|
|
|
8487
8487
|
V,
|
|
8488
8488
|
V % 8,
|
|
8489
8489
|
s
|
|
8490
|
-
), At.err.println("This is a fatal error. It has several possible causes:"), At.err.println("90%% LAME compiled with buggy version of gcc using advanced optimizations"), At.err.println(" 9%% Your system is overclocked"), At.err.println(" 1%% bug in LAME encoding library"), u.ResvSize = l.main_data_begin * 8), Ve(
|
|
8490
|
+
), At.err.println("This is a fatal error. It has several possible causes:"), At.err.println("90%% LAME compiled with buggy version of gcc using advanced optimizations"), At.err.println(" 9%% Your system is overclocked"), At.err.println(" 1%% bug in LAME encoding library"), u.ResvSize = l.main_data_begin * 8), Ve(S % 8 == 0), S > 1e9) {
|
|
8491
8491
|
var _;
|
|
8492
|
-
for (_ = 0; _ <
|
|
8493
|
-
u.header[_].write_timing -=
|
|
8494
|
-
|
|
8492
|
+
for (_ = 0; _ < S0.MAX_HEADER_BUF; ++_)
|
|
8493
|
+
u.header[_].write_timing -= S;
|
|
8494
|
+
S = 0;
|
|
8495
8495
|
}
|
|
8496
8496
|
return 0;
|
|
8497
8497
|
}, this.copy_buffer = function(p, u, l, s, V) {
|
|
@@ -8501,9 +8501,9 @@ bitsperframe: %d
|
|
|
8501
8501
|
if (s != 0 && _ > s)
|
|
8502
8502
|
return -1;
|
|
8503
8503
|
if (At.arraycopy(h, 0, u, l, _), W = -1, v = 0, V != 0) {
|
|
8504
|
-
var R =
|
|
8504
|
+
var R = Ar(1);
|
|
8505
8505
|
if (R[0] = p.nMusicCRC, m.updateMusicCRC(R, u, l, _), p.nMusicCRC = R[0], _ > 0 && (p.VBR_seek_table.nBytesWritten += _), p.decode_on_the_fly) {
|
|
8506
|
-
for (var f =
|
|
8506
|
+
for (var f = zr([2, 1152]), j = _, g = -1, P; g != 0; )
|
|
8507
8507
|
if (g = d.hip_decode1_unclipped(
|
|
8508
8508
|
p.hip,
|
|
8509
8509
|
u,
|
|
@@ -8534,12 +8534,12 @@ bitsperframe: %d
|
|
|
8534
8534
|
}
|
|
8535
8535
|
return _;
|
|
8536
8536
|
}, this.init_bit_stream_w = function(p) {
|
|
8537
|
-
h =
|
|
8537
|
+
h = Ur(Lame.LAME_MAXMP3BUFFER), p.h_ptr = p.w_ptr = 0, p.header[p.h_ptr].write_timing = 0, W = -1, v = 0, S = 0;
|
|
8538
8538
|
};
|
|
8539
8539
|
}
|
|
8540
8540
|
var on = mi;
|
|
8541
|
-
const
|
|
8542
|
-
var ot = it,
|
|
8541
|
+
const Or = /* @__PURE__ */ bi(on);
|
|
8542
|
+
var ot = it, jr = ot.System, Me = ot.VbrMode;
|
|
8543
8543
|
ot.Float;
|
|
8544
8544
|
var ki = ot.ShortBlock;
|
|
8545
8545
|
ot.Util;
|
|
@@ -8547,21 +8547,21 @@ ot.Arrays;
|
|
|
8547
8547
|
ot.new_array_n;
|
|
8548
8548
|
ot.new_byte;
|
|
8549
8549
|
ot.new_double;
|
|
8550
|
-
var
|
|
8550
|
+
var G0 = ot.new_float;
|
|
8551
8551
|
ot.new_float_n;
|
|
8552
8552
|
ot.new_int;
|
|
8553
|
-
var Hs = ot.new_int_n,
|
|
8553
|
+
var Hs = ot.new_int_n, Qr = ot.new_short_n, Yt = ot.assert, Bi = tr, Dr = nr, P0 = yi, $r = Rr, qr = Lr, ea = kr, v0 = on, Ot = Di, Ne = bt();
|
|
8554
8554
|
function Qe() {
|
|
8555
8555
|
var t = this, e = 128 * 1024;
|
|
8556
8556
|
Qe.V9 = 410, Qe.V8 = 420, Qe.V7 = 430, Qe.V6 = 440, Qe.V5 = 450, Qe.V4 = 460, Qe.V3 = 470, Qe.V2 = 480, Qe.V1 = 490, Qe.V0 = 500, Qe.R3MIX = 1e3, Qe.STANDARD = 1001, Qe.EXTREME = 1002, Qe.INSANE = 1003, Qe.STANDARD_FAST = 1004, Qe.EXTREME_FAST = 1005, Qe.MEDIUM = 1006, Qe.MEDIUM_FAST = 1007;
|
|
8557
8557
|
var i = 16384 + e;
|
|
8558
8558
|
Qe.LAME_MAXMP3BUFFER = i;
|
|
8559
|
-
var n, d, o, m, h,
|
|
8559
|
+
var n, d, o, m, h, S = new Bi(), W, v, Z;
|
|
8560
8560
|
this.enc = new Ne(), this.setModules = function(a, c, M, L, ee, ae, le, re, _e) {
|
|
8561
|
-
n = a, d = c, o = M, m = L, h = ee, W = ae, v = re, Z = _e, this.enc.setModules(d,
|
|
8561
|
+
n = a, d = c, o = M, m = L, h = ee, W = ae, v = re, Z = _e, this.enc.setModules(d, S, m, W);
|
|
8562
8562
|
};
|
|
8563
8563
|
function O() {
|
|
8564
|
-
this.mask_adjust = 0, this.mask_adjust_short = 0, this.bo_l_weight =
|
|
8564
|
+
this.mask_adjust = 0, this.mask_adjust_short = 0, this.bo_l_weight = G0(Ne.SBMAX_l), this.bo_s_weight = G0(Ne.SBMAX_s);
|
|
8565
8565
|
}
|
|
8566
8566
|
function w() {
|
|
8567
8567
|
this.lowerlimit = 0;
|
|
@@ -8575,7 +8575,7 @@ function Qe() {
|
|
|
8575
8575
|
return a.class_id = J, c = a.internal_flags = new P0(), a.mode = MPEGMode.NOT_SET, a.original = 1, a.in_samplerate = 44100, a.num_channels = 2, a.num_samples = -1, a.bWriteVbrTag = !0, a.quality = -1, a.short_blocks = null, c.subblock_gain = -1, a.lowpassfreq = 0, a.highpassfreq = 0, a.lowpasswidth = -1, a.highpasswidth = -1, a.VBR = Me.vbr_off, a.VBR_q = 4, a.ATHcurve = -1, a.VBR_mean_bitrate_kbps = 128, a.VBR_min_bitrate_kbps = 0, a.VBR_max_bitrate_kbps = 0, a.VBR_hard_min = 0, c.VBR_min_bitrate = 1, c.VBR_max_bitrate = 13, a.quant_comp = -1, a.quant_comp_short = -1, a.msfix = -1, c.resample_ratio = 1, c.OldValue[0] = 180, c.OldValue[1] = 180, c.CurrentStep[0] = 4, c.CurrentStep[1] = 4, c.masking_lower = 1, c.nsPsy.attackthre = -1, c.nsPsy.attackthre_s = -1, a.scale = -1, a.athaa_type = -1, a.ATHtype = -1, a.athaa_loudapprox = -1, a.athaa_sensitivity = 0, a.useTemporal = null, a.interChRatio = -1, c.mf_samples_to_encode = Ne.ENCDELAY + Ne.POSTDELAY, a.encoder_padding = 0, c.mf_size = Ne.ENCDELAY - Ne.MDCTDELAY, a.findReplayGain = !1, a.decode_on_the_fly = !1, c.decode_on_the_fly = !1, c.findReplayGain = !1, c.findPeakSample = !1, c.RadioGain = 0, c.AudiophileGain = 0, c.noclipGainChange = 0, c.noclipScale = -1, a.preset = 0, a.write_id3tag_automatic = !0, 0;
|
|
8576
8576
|
}
|
|
8577
8577
|
this.lame_init = function() {
|
|
8578
|
-
var a = new
|
|
8578
|
+
var a = new Dr();
|
|
8579
8579
|
return U(a), a.lame_allocated_gfp = 1, a;
|
|
8580
8580
|
};
|
|
8581
8581
|
function k(a) {
|
|
@@ -8681,7 +8681,7 @@ function Qe() {
|
|
|
8681
8681
|
}
|
|
8682
8682
|
ee == 999 ? c.lowpass1 = (M - 0.75) / 31 : c.lowpass1 = (ee - 0.75) / 31, c.lowpass2 = M / 31;
|
|
8683
8683
|
}
|
|
8684
|
-
if (c.highpass2 > 0 && c.highpass2 < 0.9 * (0.75 / 31) && (c.highpass1 = 0, c.highpass2 = 0,
|
|
8684
|
+
if (c.highpass2 > 0 && c.highpass2 < 0.9 * (0.75 / 31) && (c.highpass1 = 0, c.highpass2 = 0, jr.err.println(`Warning: highpass filter disabled. highpass frequency too small
|
|
8685
8685
|
`)), c.highpass2 > 0) {
|
|
8686
8686
|
for (var re = -1, ae = 0; ae <= 31; ae++) {
|
|
8687
8687
|
var le = ae / 31;
|
|
@@ -8735,7 +8735,7 @@ function Qe() {
|
|
|
8735
8735
|
}
|
|
8736
8736
|
this.lame_init_params = function(a) {
|
|
8737
8737
|
var c = a.internal_flags;
|
|
8738
|
-
if (c.Class_ID = 0, c.ATH == null && (c.ATH = new
|
|
8738
|
+
if (c.Class_ID = 0, c.ATH == null && (c.ATH = new $r()), c.PSY == null && (c.PSY = new O()), c.rgdata == null && (c.rgdata = new qr()), c.channels_in = a.num_channels, c.channels_in == 1 && (a.mode = MPEGMode.MONO), c.channels_out = a.mode == MPEGMode.MONO ? 1 : 2, c.mode_ext = Ne.MPG_MD_MS_LR, a.mode == MPEGMode.MONO && (a.force_ms = !1), a.VBR == Me.vbr_off && a.VBR_mean_bitrate_kbps != 128 && a.brate == 0 && (a.brate = a.VBR_mean_bitrate_kbps), a.VBR == Me.vbr_off || a.VBR == Me.vbr_mtrh || a.VBR == Me.vbr_mt || (a.free_format = !1), a.VBR == Me.vbr_off && a.brate == 0 && v0.EQ(a.compression_ratio, 0) && (a.compression_ratio = 11.025), a.VBR == Me.vbr_off && a.compression_ratio > 0 && (a.out_samplerate == 0 && (a.out_samplerate = map2MP3Frequency(int(0.97 * a.in_samplerate))), a.brate = 0 | a.out_samplerate * 16 * c.channels_out / (1e3 * a.compression_ratio), c.samplerate_index = r(a.out_samplerate, a), a.free_format || (a.brate = K(
|
|
8739
8739
|
a.brate,
|
|
8740
8740
|
a.version,
|
|
8741
8741
|
a.out_samplerate
|
|
@@ -8897,7 +8897,7 @@ function Qe() {
|
|
|
8897
8897
|
}
|
|
8898
8898
|
default: {
|
|
8899
8899
|
var we;
|
|
8900
|
-
c.sfb21_extra = !1, a.quality < 0 && (a.quality = LAME_DEFAULT_QUALITY), we = a.VBR, we == Me.vbr_off && (a.VBR_mean_bitrate_kbps = a.brate), o.apply_preset(a, a.VBR_mean_bitrate_kbps, 0), a.VBR = we, c.PSY.mask_adjust = a.maskingadjust, c.PSY.mask_adjust_short = a.maskingadjust_short, we == Me.vbr_off ? c.iteration_loop = new
|
|
8900
|
+
c.sfb21_extra = !1, a.quality < 0 && (a.quality = LAME_DEFAULT_QUALITY), we = a.VBR, we == Me.vbr_off && (a.VBR_mean_bitrate_kbps = a.brate), o.apply_preset(a, a.VBR_mean_bitrate_kbps, 0), a.VBR = we, c.PSY.mask_adjust = a.maskingadjust, c.PSY.mask_adjust_short = a.maskingadjust_short, we == Me.vbr_off ? c.iteration_loop = new ea(h) : c.iteration_loop = new ABRIterationLoop(h);
|
|
8901
8901
|
break;
|
|
8902
8902
|
}
|
|
8903
8903
|
}
|
|
@@ -8928,13 +8928,13 @@ function Qe() {
|
|
|
8928
8928
|
a.VBR_mean_bitrate_kbps
|
|
8929
8929
|
);
|
|
8930
8930
|
}
|
|
8931
|
-
return a.tune && (c.PSY.mask_adjust += a.tune_value_a, c.PSY.mask_adjust_short += a.tune_value_a), H(a), Yt(a.scale >= 0), a.athaa_type < 0 ? c.ATH.useAdjust = 3 : c.ATH.useAdjust = a.athaa_type, c.ATH.aaSensitivityP = Math.pow(10, a.athaa_sensitivity / -10), a.short_blocks == null && (a.short_blocks = ki.short_block_allowed), a.short_blocks == ki.short_block_allowed && (a.mode == MPEGMode.JOINT_STEREO || a.mode == MPEGMode.STEREO) && (a.short_blocks = ki.short_block_coupled), a.quant_comp < 0 && (a.quant_comp = 1), a.quant_comp_short < 0 && (a.quant_comp_short = 0), a.msfix < 0 && (a.msfix = 0), a.exp_nspsytune = a.exp_nspsytune | 1, a.internal_flags.nsPsy.attackthre < 0 && (a.internal_flags.nsPsy.attackthre = Bi.NSATTACKTHRE), a.internal_flags.nsPsy.attackthre_s < 0 && (a.internal_flags.nsPsy.attackthre_s = Bi.NSATTACKTHRE_S), Yt(a.scale >= 0), a.scale < 0 && (a.scale = 1), a.ATHtype < 0 && (a.ATHtype = 4), a.ATHcurve < 0 && (a.ATHcurve = 4), a.athaa_loudapprox < 0 && (a.athaa_loudapprox = 2), a.interChRatio < 0 && (a.interChRatio = 0), a.useTemporal == null && (a.useTemporal = !0), c.slot_lag = c.frac_SpF = 0, a.VBR == Me.vbr_off && (c.slot_lag = c.frac_SpF = (a.version + 1) * 72e3 * a.brate % a.out_samplerate | 0), m.iteration_init(a),
|
|
8931
|
+
return a.tune && (c.PSY.mask_adjust += a.tune_value_a, c.PSY.mask_adjust_short += a.tune_value_a), H(a), Yt(a.scale >= 0), a.athaa_type < 0 ? c.ATH.useAdjust = 3 : c.ATH.useAdjust = a.athaa_type, c.ATH.aaSensitivityP = Math.pow(10, a.athaa_sensitivity / -10), a.short_blocks == null && (a.short_blocks = ki.short_block_allowed), a.short_blocks == ki.short_block_allowed && (a.mode == MPEGMode.JOINT_STEREO || a.mode == MPEGMode.STEREO) && (a.short_blocks = ki.short_block_coupled), a.quant_comp < 0 && (a.quant_comp = 1), a.quant_comp_short < 0 && (a.quant_comp_short = 0), a.msfix < 0 && (a.msfix = 0), a.exp_nspsytune = a.exp_nspsytune | 1, a.internal_flags.nsPsy.attackthre < 0 && (a.internal_flags.nsPsy.attackthre = Bi.NSATTACKTHRE), a.internal_flags.nsPsy.attackthre_s < 0 && (a.internal_flags.nsPsy.attackthre_s = Bi.NSATTACKTHRE_S), Yt(a.scale >= 0), a.scale < 0 && (a.scale = 1), a.ATHtype < 0 && (a.ATHtype = 4), a.ATHcurve < 0 && (a.ATHcurve = 4), a.athaa_loudapprox < 0 && (a.athaa_loudapprox = 2), a.interChRatio < 0 && (a.interChRatio = 0), a.useTemporal == null && (a.useTemporal = !0), c.slot_lag = c.frac_SpF = 0, a.VBR == Me.vbr_off && (c.slot_lag = c.frac_SpF = (a.version + 1) * 72e3 * a.brate % a.out_samplerate | 0), m.iteration_init(a), S.psymodel_init(a), Yt(a.scale >= 0), 0;
|
|
8932
8932
|
};
|
|
8933
8933
|
function u(a, c) {
|
|
8934
|
-
(a.in_buffer_0 == null || a.in_buffer_nsamples < c) && (a.in_buffer_0 =
|
|
8934
|
+
(a.in_buffer_0 == null || a.in_buffer_nsamples < c) && (a.in_buffer_0 = G0(c), a.in_buffer_1 = G0(c), a.in_buffer_nsamples = c);
|
|
8935
8935
|
}
|
|
8936
8936
|
this.lame_encode_flush = function(a, c, M, L) {
|
|
8937
|
-
var ee = a.internal_flags, ae =
|
|
8937
|
+
var ee = a.internal_flags, ae = Qr([2, 1152]), le = 0, re, _e, he, oe, Le = ee.mf_samples_to_encode - Ne.POSTDELAY, ze = l(a);
|
|
8938
8938
|
if (ee.mf_samples_to_encode < 1)
|
|
8939
8939
|
return 0;
|
|
8940
8940
|
for (re = 0, a.in_samplerate != a.out_samplerate && (Le += 16 * a.out_samplerate / a.in_samplerate), he = a.framesize - Le % a.framesize, he < 576 && (he += a.framesize), a.encoder_padding = he, oe = (Le + he) / a.framesize; oe > 0 && le >= 0; ) {
|
|
@@ -9087,8 +9087,8 @@ function Qe() {
|
|
|
9087
9087
|
De % 2 == 0 && --De, De += we;
|
|
9088
9088
|
var st = De + 1;
|
|
9089
9089
|
if (he.fill_buffer_resample_init == 0) {
|
|
9090
|
-
for (he.inbuf_old[0] =
|
|
9091
|
-
he.blackfilt[oe] =
|
|
9090
|
+
for (he.inbuf_old[0] = G0(st), he.inbuf_old[1] = G0(st), oe = 0; oe <= 2 * We; ++oe)
|
|
9091
|
+
he.blackfilt[oe] = G0(st);
|
|
9092
9092
|
for (he.itime[0] = 0, he.itime[1] = 0, Le = 0; Le <= 2 * We; Le++) {
|
|
9093
9093
|
var a0 = 0, gt = (Le - We) / (2 * We);
|
|
9094
9094
|
for (oe = 0; oe <= De; oe++)
|
|
@@ -9153,8 +9153,8 @@ function Qe() {
|
|
|
9153
9153
|
}
|
|
9154
9154
|
}
|
|
9155
9155
|
}
|
|
9156
|
-
var
|
|
9157
|
-
const
|
|
9156
|
+
var ta = Qe;
|
|
9157
|
+
const ia = /* @__PURE__ */ bi(ta), sa = (t, e = 4294967295, i = 79764919) => {
|
|
9158
9158
|
const n = new Int32Array(256);
|
|
9159
9159
|
let d, o, m, h = e;
|
|
9160
9160
|
for (d = 0; d < 256; d++) {
|
|
@@ -9163,12 +9163,12 @@ const ta = /* @__PURE__ */ bi(ea), ia = (t, e = 4294967295, i = 79764919) => {
|
|
|
9163
9163
|
}
|
|
9164
9164
|
for (d = 0; d < t.length; d++) h = h << 8 ^ n[255 & (h >> 24 ^ t[d])];
|
|
9165
9165
|
return h;
|
|
9166
|
-
}, Ys = (t, e =
|
|
9166
|
+
}, Ys = (t, e = sa) => {
|
|
9167
9167
|
const i = (U) => new Uint8Array(U.length / 2).map((k, I) => parseInt(U.substring(2 * I, 2 * (I + 1)), 16)), n = (U) => i(U)[0], d = /* @__PURE__ */ new Map();
|
|
9168
9168
|
[, 8364, , 8218, 402, 8222, 8230, 8224, 8225, 710, 8240, 352, 8249, 338, , 381, , , 8216, 8217, 8220, 8221, 8226, 8211, 8212, 732, 8482, 353, 8250, 339, , 382, 376].forEach((U, k) => d.set(U, k));
|
|
9169
9169
|
const o = new Uint8Array(t.length);
|
|
9170
|
-
let m, h,
|
|
9171
|
-
O && (w = 11, h = n(t.substring(9, w)), h <= 1 && (w += 2, Z = n(t.substring(11, w))), h === 1 && (w += 8,
|
|
9170
|
+
let m, h, S, W = !1, v = 0, Z = 42, O = t.length > 13 && t.substring(0, 9) === "dynEncode", w = 0;
|
|
9171
|
+
O && (w = 11, h = n(t.substring(9, w)), h <= 1 && (w += 2, Z = n(t.substring(11, w))), h === 1 && (w += 8, S = ((U) => new DataView(i(U).buffer).getInt32(0, !0))(t.substring(13, w))));
|
|
9172
9172
|
const N = 256 - Z;
|
|
9173
9173
|
for (let U = w; U < t.length; U++) if (m = t.charCodeAt(U), m !== 61 || W) {
|
|
9174
9174
|
if (m === 92 && U < t.length - 5 && O) {
|
|
@@ -9184,10 +9184,10 @@ const ta = /* @__PURE__ */ bi(ea), ia = (t, e = 4294967295, i = 79764919) => {
|
|
|
9184
9184
|
const J = o.subarray(0, v);
|
|
9185
9185
|
if (O && h === 1) {
|
|
9186
9186
|
const U = e(J);
|
|
9187
|
-
if (U !==
|
|
9187
|
+
if (U !== S) {
|
|
9188
9188
|
const k = "Decode failed crc32 validation";
|
|
9189
9189
|
throw console.error("`simple-yenc`\n", k + `
|
|
9190
|
-
`, "Expected: " +
|
|
9190
|
+
`, "Expected: " + S + "; Got: " + U + `
|
|
9191
9191
|
`, "Visit https://github.com/eshaz/simple-yenc for more information"), Error(k);
|
|
9192
9192
|
}
|
|
9193
9193
|
}
|
|
@@ -9231,17 +9231,17 @@ function qe() {
|
|
|
9231
9231
|
},
|
|
9232
9232
|
getDecodedAudioMultiChannel: {
|
|
9233
9233
|
value(i, n, d, o, m, h) {
|
|
9234
|
-
let
|
|
9234
|
+
let S = [], W, v;
|
|
9235
9235
|
for (W = 0; W < d; W++) {
|
|
9236
9236
|
const Z = [];
|
|
9237
9237
|
for (v = 0; v < n.length; ) Z.push(n[v++][W] || []);
|
|
9238
|
-
|
|
9238
|
+
S.push(
|
|
9239
9239
|
qe.concatFloat32(Z, o)
|
|
9240
9240
|
);
|
|
9241
9241
|
}
|
|
9242
9242
|
return qe.getDecodedAudio(
|
|
9243
9243
|
i,
|
|
9244
|
-
|
|
9244
|
+
S,
|
|
9245
9245
|
o,
|
|
9246
9246
|
m,
|
|
9247
9247
|
h
|
|
@@ -9258,7 +9258,7 @@ function qe() {
|
|
|
9258
9258
|
return i = Ys(i), new Promise((n) => {
|
|
9259
9259
|
const d = String.raw`dynEncode012804c7886d()((()>+*§§)§,§§§§)§+§§§)§+.-()(*)-+)(.7*§)i¸¸,3§(i¸¸,3/G+.¡*(,(,3+)2å:-),§H(P*DI*H(P*@I++hH)H*r,hH(H(P*<J,i)^*<H,H(P*4U((I-H(H*i0J,^*DH+H-H*I+H,I*4)33H(H*H)^*DH(H+H)^*@H+i§H)i§3æ*).§K(iHI/+§H,iHn,§H+i(H+i(rCJ0I,H*I-+hH,,hH(H-V)(i)J.H.W)(i)c)(H,i)I,H-i*I-4)33i(I.*hH(V)(H+n5(H(i*I-i(I,i)I.+hH,i*J+iHn,hi(I-i*I,+hH,H/H-c)(H,iFn,hi(I,+hH,H0n5-H*V)(J(,hH/H(i)J(H(V)(J(i)c)(H)H(i)H,c)(3H*i*I*H,i)I,4(3(-H(H,W)(H-I-H,i*I,4)3(3(3H,H-I1H+I,H.i)H1V)(J.i(v5(33H.-H(H,i(c)(H,i*I,4)333)-§i*I*+§H*iHn,hi73H,H(i)8(H+J+H)P*(H*V)(J-r,§H)P*,H.i)H+H,i)V)(-H*i*I*H+i)I+H-H.I.H,H-i)I,4)333Ã+)-§iø7i(^*(iü7I,*h+hH+iDn,h*hilI+i)I,+hH+,hH+iô7H,c)(i)H+i´8W)(H,I,H+i*I+4)-+hH(H)8*J-i(p5.*h*h*hH-i')u,hH(P*(J+,hH(P*0J,H(P*,n50H+H,H-b((3H(P*0i)I.4)3H-i¨*n5*H-iÅ*s,hi73H-i)J+V)&+I,H(H+V)æ,8(I.H(H*8*J-i(p51H-i)J+i¸7V)(H(H+iø7V)(8(J/H(P*0J+s,hi73H+H,H.J,I.H(P*(m5(H.H(P*,s5.+hH,m5*H(P*(J.H+H.H+H/U((b((H(H(P*0i)J+^*0H,i)I,4(3(3H(H.^*03H-i¨*o5)33i(73(3(3-H,H+i)c)(H,i*I,H+i)I+4)33i)I-3H-3!2)0§K(i2J,L(H,H(^*(H,H*^*4H,i(^*0H,i(^*DH,j(_*<H,H)P*(^*,H,H+P*(^*8*h*h+hH,i)8(I3i§I**h*h*h*h*h*h*hH,i*8(6+(),03H,j(_*@i*I-H,P*<J.i,J(H,P*8J/s50H,H.i+J0^*<i¦I*H.H,P*4J1J.U(*H.U((J2i')o5/H.U()I.H,H(^*<H0H1U((H.i0J.i§i0i')o5/H/H.H2J*H(J.q50H,P*0J/H*I-H,P*(J0,hH,P*,H-q,hi)I-423+hH*m5+H/H0H(H1U((b((H/i)I/H(i)I(H*i)I*4(3(3H,H.^*<H,H-^*04*3iØ1U((5+i(I(i¨7i1^*(i$6iè1^*(i°7iè6^*(i¬7iÈ6^*(+hH(iÈ*n,hiÈ*I(+hH(i¨,n,hi¨,I(+hH(iØ,n,hiØ,I(+hH(iè,o,hH,i-H(i0c)(H(i*I(4)33iè1i1H,i-iÈ*8)Bi(I(+hH(ido,hH,i-H(i-c)(H(i*I(4)33iÈ6iè6H,i-iF8)BiØ1i)b((41-H,i-H(i/c)(H(i*I(4)3(3(-H,i-H(i1c)(H(i*I(4)3(3(-H,i-H(i0c)(H(i*I(4)3(3(3H,H/^*0H,H(^*<3i(I*4*3H,H,i¸)^*TH,H,iø-^*PH,H,iX^*LH,H,i(^*HH,i-8(I(H,i-8(I-i¥I*H,i,8(I.H(iErH-iEr5)H(i©*I1H-i)I0i(i;H.i,J(i(H(i(rCJ(J*H*i;sCI*i¨1I-H(I/+hH/,hH,i-H-V)(i)H,i+8(c)(H/i)I/H-i*I-H*i)I*4)-H(i)i¨1I/+hH(H*o,hH,i-H/V)(i)i(c)(H/i*I/H(i)I(4)33i¤I*H,iø-H,i¸)H,i-i;8)5+H0H1I2i(I-+hH-H2p,hH,H,iP8*J*i(p5-H*i7u,hH,i-H-i)H*c)(H-i)I-4*3i(I/i+I.i+I(*h*h*hH*i86*(*)3H-m,hi£I*403H-i)H,W)-I/i*I(4)3i3I.i/I(3H2H,H(8(H.J(H-J.p,hi¢I*4.3H,i-H-i)I*+hH(,hH*H/c)(H*i*I*H(i)I(4)-H.I-4+3(3(33H,W)1m,hiI*4,3H,iø-H,i¸)H,i-H18)J(,hi¡I*H(i(p5,H1H,V)ú-H,V)ø-o5,3H,i(H,iXH,i-H1i)H08)J(,hi I*H(i(p5,H0H,V)H,V)o5,3H,H,iPH,iH8+I*4+3(3(3H,i$6i¬78+I*3H*H3m5(3i)I-H*i(r5)3H)H,P*0^*(H+H,P*<^*(H*I-3H,i2L(H-33Á)+(i¨03b+(,(-(.(/(0(1(2(3(5(7(9(;(?(C(G(K(S([(c(k({(((«(Ë(ë((*)(iø03O)()()()(*(*(*(*(+(+(+(+(,(,(,(,(-(-(-(-(i¨13M8(9(:(((0(/(1(.(2(-(3(,(4(+(5(*(6()(7(T7*S7US0U `;
|
|
9260
9260
|
qe.getModule(qe, d).then((o) => WebAssembly.instantiate(o, {})).then(({ exports: o }) => {
|
|
9261
|
-
const m = new Map(Object.entries(o)), h = m.get("puff"),
|
|
9261
|
+
const m = new Map(Object.entries(o)), h = m.get("puff"), S = m.get("memory").buffer, W = new t(S), v = new DataView(S);
|
|
9262
9262
|
let Z = m.get("__heap_base");
|
|
9263
9263
|
const O = i.length, w = Z;
|
|
9264
9264
|
Z += 4, v.setInt32(w, O, !0);
|
|
@@ -9318,14 +9318,14 @@ function qe() {
|
|
|
9318
9318
|
});
|
|
9319
9319
|
}, this.instantiate = (i, n) => (n && qe.setModule(i, n), this._wasm = new i(qe).instantiate(), this._pointers = /* @__PURE__ */ new Set(), this._wasm.ready.then(() => this));
|
|
9320
9320
|
}
|
|
9321
|
-
var
|
|
9322
|
-
const
|
|
9323
|
-
class
|
|
9321
|
+
var na = Worker;
|
|
9322
|
+
const ra = /* @__PURE__ */ bi(na), aa = () => globalThis.Worker || ra;
|
|
9323
|
+
class la extends aa() {
|
|
9324
9324
|
constructor(e, i, n, d) {
|
|
9325
9325
|
qe.modules || new qe();
|
|
9326
9326
|
let o = qe.modules.get(n);
|
|
9327
9327
|
if (!o) {
|
|
9328
|
-
let m = "text/javascript", h,
|
|
9328
|
+
let m = "text/javascript", h, S = `'use strict';(${((W, v, Z) => {
|
|
9329
9329
|
let O, w, N = new Promise((J) => {
|
|
9330
9330
|
w = J;
|
|
9331
9331
|
});
|
|
@@ -9351,13 +9351,13 @@ class aa extends ra() {
|
|
|
9351
9351
|
h = typeof process.versions.node < "u";
|
|
9352
9352
|
} catch {
|
|
9353
9353
|
}
|
|
9354
|
-
o = h ? `data:${m};base64,${Buffer.from(
|
|
9354
|
+
o = h ? `data:${m};base64,${Buffer.from(S).toString(
|
|
9355
9355
|
"base64"
|
|
9356
|
-
)}` : URL.createObjectURL(new Blob([
|
|
9356
|
+
)}` : URL.createObjectURL(new Blob([S], { type: m })), qe.modules.set(n, o);
|
|
9357
9357
|
}
|
|
9358
9358
|
super(o, { name: i }), this._id = Number.MIN_SAFE_INTEGER, this._enqueuedOperations = /* @__PURE__ */ new Map(), this.onmessage = ({ data: m }) => {
|
|
9359
|
-
const { id: h, ...
|
|
9360
|
-
this._enqueuedOperations.get(h)(
|
|
9359
|
+
const { id: h, ...S } = m;
|
|
9360
|
+
this._enqueuedOperations.get(h)(S), this._enqueuedOperations.delete(h);
|
|
9361
9361
|
}, new d(qe).getModule().then((m) => {
|
|
9362
9362
|
this.postToDecoder("init", { module: m, options: e });
|
|
9363
9363
|
});
|
|
@@ -9394,7 +9394,7 @@ function w0(t) {
|
|
|
9394
9394
|
throw L;
|
|
9395
9395
|
}
|
|
9396
9396
|
var o, m, h;
|
|
9397
|
-
function
|
|
9397
|
+
function S() {
|
|
9398
9398
|
var L = h.buffer;
|
|
9399
9399
|
o = new Uint8Array(L), m = new Uint32Array(L), new BigInt64Array(L), new BigUint64Array(L);
|
|
9400
9400
|
}
|
|
@@ -9655,7 +9655,7 @@ r÷|ú
|
|
|
9655
9655
|
t.setModule(w0, L);
|
|
9656
9656
|
}, this.getModule = () => t.getModule(w0), this.instantiate = () => (this.getModule().then((L) => WebAssembly.instantiate(L, M)).then((L) => {
|
|
9657
9657
|
const ee = L.exports;
|
|
9658
|
-
V(ee), h = ee.k,
|
|
9658
|
+
V(ee), h = ee.k, S(), c(ee), n();
|
|
9659
9659
|
}), this.ready = new Promise((L) => {
|
|
9660
9660
|
n = L;
|
|
9661
9661
|
}).then(() => {
|
|
@@ -9698,15 +9698,15 @@ function K0(t = {}) {
|
|
|
9698
9698
|
e: for (let o = 0, m = 0; o < e.length; o += m) {
|
|
9699
9699
|
const h = e.subarray(o, this._input.len + o);
|
|
9700
9700
|
m = h.length, this._inputBytes += m, this._input.buf.set(h);
|
|
9701
|
-
let
|
|
9701
|
+
let S = this._common.wasm.mpeg_decoder_feed(
|
|
9702
9702
|
this._decoder,
|
|
9703
9703
|
this._input.ptr,
|
|
9704
9704
|
m
|
|
9705
9705
|
);
|
|
9706
|
-
if (
|
|
9706
|
+
if (S === -10)
|
|
9707
9707
|
continue e;
|
|
9708
9708
|
t: for (; ; ) {
|
|
9709
|
-
this._samplesDecodedPtr.buf[0] = 0,
|
|
9709
|
+
this._samplesDecodedPtr.buf[0] = 0, S = this._common.wasm.mpeg_decoder_read(
|
|
9710
9710
|
this._decoder,
|
|
9711
9711
|
this._output.ptr,
|
|
9712
9712
|
this._output.len,
|
|
@@ -9718,12 +9718,12 @@ function K0(t = {}) {
|
|
|
9718
9718
|
if (this._outputSamples += W, W && (d += W, i.push([
|
|
9719
9719
|
this._output.buf.slice(0, W),
|
|
9720
9720
|
this._output.buf.slice(W, W * 2)
|
|
9721
|
-
])),
|
|
9721
|
+
])), S == -11)
|
|
9722
9722
|
continue t;
|
|
9723
|
-
if (
|
|
9723
|
+
if (S === -10)
|
|
9724
9724
|
continue e;
|
|
9725
|
-
if (
|
|
9726
|
-
const v = this._getErrorMessage(
|
|
9725
|
+
if (S) {
|
|
9726
|
+
const v = this._getErrorMessage(S);
|
|
9727
9727
|
console.error("mpg123-decoder: " + v), this._common.addError(
|
|
9728
9728
|
n,
|
|
9729
9729
|
v,
|
|
@@ -9760,7 +9760,7 @@ function K0(t = {}) {
|
|
|
9760
9760
|
);
|
|
9761
9761
|
}, this._isWebWorker = K0.isWebWorker, this._WASMAudioDecoderCommon = K0.WASMAudioDecoderCommon || qe, this._EmscriptenWASM = K0.EmscriptenWASM || w0, this._module = K0.module, this._inputSize = 2 ** 16, this._outputSize = 2889 * 16 * 2, this._ready = this._init(), this;
|
|
9762
9762
|
}
|
|
9763
|
-
class dn extends
|
|
9763
|
+
class dn extends la {
|
|
9764
9764
|
constructor(e) {
|
|
9765
9765
|
super(e, "mpg123-decoder", K0, w0);
|
|
9766
9766
|
}
|
|
@@ -9776,10 +9776,10 @@ class dn extends aa {
|
|
|
9776
9776
|
}
|
|
9777
9777
|
cn(K0, "MPEGDecoder");
|
|
9778
9778
|
cn(dn, "MPEGDecoderWebWorker");
|
|
9779
|
-
globalThis.MPEGMode =
|
|
9780
|
-
globalThis.Lame =
|
|
9781
|
-
globalThis.BitStream =
|
|
9782
|
-
class
|
|
9779
|
+
globalThis.MPEGMode = Nn;
|
|
9780
|
+
globalThis.Lame = ia;
|
|
9781
|
+
globalThis.BitStream = Or;
|
|
9782
|
+
class V1 {
|
|
9783
9783
|
/**
|
|
9784
9784
|
* Create a new MP3Encoder.
|
|
9785
9785
|
*
|
|
@@ -9789,7 +9789,7 @@ class I1 {
|
|
|
9789
9789
|
* @param config.channels - Number of audio channels (1 = mono, 2 = stereo)
|
|
9790
9790
|
*/
|
|
9791
9791
|
constructor(e) {
|
|
9792
|
-
this.config = e, this.mp3encoder = new
|
|
9792
|
+
this.config = e, this.mp3encoder = new Fn.Mp3Encoder(
|
|
9793
9793
|
e.channels,
|
|
9794
9794
|
e.sampleRate,
|
|
9795
9795
|
e.bitRate
|
|
@@ -9797,11 +9797,11 @@ class I1 {
|
|
|
9797
9797
|
}
|
|
9798
9798
|
// Convert AudioData to interleaved Int16 samples
|
|
9799
9799
|
convertAudioDataToInt16(e) {
|
|
9800
|
-
const i = e.numberOfChannels, n = e.numberOfFrames, d =
|
|
9800
|
+
const i = e.numberOfChannels, n = e.numberOfFrames, d = En(e), o = new Int16Array(n * i);
|
|
9801
9801
|
for (let m = 0; m < n; m++)
|
|
9802
9802
|
for (let h = 0; h < i; h++) {
|
|
9803
|
-
const
|
|
9804
|
-
o[m * i + h] =
|
|
9803
|
+
const S = Math.max(-1, Math.min(1, d[h][m]));
|
|
9804
|
+
o[m * i + h] = S * 32767;
|
|
9805
9805
|
}
|
|
9806
9806
|
return o;
|
|
9807
9807
|
}
|
|
@@ -9845,7 +9845,7 @@ class I1 {
|
|
|
9845
9845
|
return this.encodedData.reduce((e, i) => e + i.length, 0);
|
|
9846
9846
|
}
|
|
9847
9847
|
}
|
|
9848
|
-
class
|
|
9848
|
+
class R1 {
|
|
9849
9849
|
/**
|
|
9850
9850
|
* Create a new MP3Decoder.
|
|
9851
9851
|
*
|
|
@@ -9877,10 +9877,10 @@ class V1 {
|
|
|
9877
9877
|
const i = await this.decoder.decode(new Uint8Array(e)), { channelData: n, sampleRate: d } = i, o = n.length;
|
|
9878
9878
|
return {
|
|
9879
9879
|
channels: n.map((h) => {
|
|
9880
|
-
const
|
|
9880
|
+
const S = new Float32Array(h.length);
|
|
9881
9881
|
for (let W = 0; W < h.length; W++)
|
|
9882
|
-
|
|
9883
|
-
return
|
|
9882
|
+
S[W] = h[W];
|
|
9883
|
+
return S;
|
|
9884
9884
|
}),
|
|
9885
9885
|
sampleRate: d,
|
|
9886
9886
|
numberOfChannels: o
|
|
@@ -9913,14 +9913,14 @@ class V1 {
|
|
|
9913
9913
|
async toAudioData(e) {
|
|
9914
9914
|
const { channels: i, sampleRate: n, numberOfChannels: d } = await this.toSamples(e), o = 1024, m = i[0].length, h = [];
|
|
9915
9915
|
console.log("Samples", m);
|
|
9916
|
-
for (let
|
|
9917
|
-
const W = m -
|
|
9918
|
-
(J) => J.slice(
|
|
9916
|
+
for (let S = 0; S < m; S += o) {
|
|
9917
|
+
const W = m - S, v = Math.min(o, W), Z = i.map(
|
|
9918
|
+
(J) => J.slice(S, S + v)
|
|
9919
9919
|
), O = new Float32Array(v * d);
|
|
9920
9920
|
for (let J = 0; J < v; J++)
|
|
9921
9921
|
for (let U = 0; U < d; U++)
|
|
9922
9922
|
O[J * d + U] = Z[U][J];
|
|
9923
|
-
const w =
|
|
9923
|
+
const w = S / n * 1e6, N = new AudioData({
|
|
9924
9924
|
format: "f32",
|
|
9925
9925
|
sampleRate: n,
|
|
9926
9926
|
numberOfFrames: v,
|
|
@@ -9939,8 +9939,8 @@ class V1 {
|
|
|
9939
9939
|
this.decoder && (await this.decoder.free(), this.decoder = null, this.isReady = !1);
|
|
9940
9940
|
}
|
|
9941
9941
|
}
|
|
9942
|
-
const
|
|
9943
|
-
function
|
|
9942
|
+
const oa = 100, ca = 0.5, da = 0.1;
|
|
9943
|
+
function ma(t, e) {
|
|
9944
9944
|
const i = t.getTrackById(e.id);
|
|
9945
9945
|
for (const n of i.mdia.minf.stbl.stsd.entries) {
|
|
9946
9946
|
const d = n.avcC || n.hvcC || n.vpcC || n.av1C;
|
|
@@ -9953,7 +9953,7 @@ function da(t, e) {
|
|
|
9953
9953
|
"Codec description box (avcC, hvcC, vpcC, or av1C) not found"
|
|
9954
9954
|
);
|
|
9955
9955
|
}
|
|
9956
|
-
function
|
|
9956
|
+
function ua(t, e) {
|
|
9957
9957
|
var n, d;
|
|
9958
9958
|
const i = {
|
|
9959
9959
|
duration: e.duration / e.timescale
|
|
@@ -9964,7 +9964,7 @@ function ma(t, e) {
|
|
|
9964
9964
|
codec: o.codec,
|
|
9965
9965
|
codedHeight: o.video.height,
|
|
9966
9966
|
codedWidth: o.video.width,
|
|
9967
|
-
description:
|
|
9967
|
+
description: ma(t, o),
|
|
9968
9968
|
frameRate: o.nb_samples / m
|
|
9969
9969
|
};
|
|
9970
9970
|
}
|
|
@@ -9978,15 +9978,15 @@ function ma(t, e) {
|
|
|
9978
9978
|
}
|
|
9979
9979
|
return i;
|
|
9980
9980
|
}
|
|
9981
|
-
function
|
|
9981
|
+
function ha(t, e) {
|
|
9982
9982
|
return new Promise((i, n) => {
|
|
9983
9983
|
const d = t.stream().getReader();
|
|
9984
9984
|
let o = 0;
|
|
9985
|
-
const m =
|
|
9985
|
+
const m = Jn.createFile(!1);
|
|
9986
9986
|
let h = !1;
|
|
9987
9987
|
m.onReady = (W) => {
|
|
9988
9988
|
h = !0;
|
|
9989
|
-
const v =
|
|
9989
|
+
const v = ua(m, W);
|
|
9990
9990
|
i({ info: W, trackData: v, mp4: m });
|
|
9991
9991
|
}, m.onError = (W) => {
|
|
9992
9992
|
n(
|
|
@@ -9995,7 +9995,7 @@ function ua(t, e) {
|
|
|
9995
9995
|
)
|
|
9996
9996
|
);
|
|
9997
9997
|
};
|
|
9998
|
-
const
|
|
9998
|
+
const S = async () => {
|
|
9999
9999
|
try {
|
|
10000
10000
|
const { done: W, value: v } = await d.read();
|
|
10001
10001
|
if (W) {
|
|
@@ -10010,19 +10010,19 @@ function ua(t, e) {
|
|
|
10010
10010
|
}
|
|
10011
10011
|
const Z = v.buffer;
|
|
10012
10012
|
if (Z.fileStart = o, o += v.length, e && e(o / t.size), m.appendBuffer(Z), o < t.size)
|
|
10013
|
-
return
|
|
10013
|
+
return S();
|
|
10014
10014
|
if (m.flush(), !h)
|
|
10015
10015
|
throw new Error("Invalid MP4 file: metadata not available");
|
|
10016
10016
|
} catch (W) {
|
|
10017
10017
|
n(W);
|
|
10018
10018
|
}
|
|
10019
10019
|
};
|
|
10020
|
-
|
|
10020
|
+
S().catch(n);
|
|
10021
10021
|
});
|
|
10022
10022
|
}
|
|
10023
|
-
function
|
|
10023
|
+
function ba(t, e, i, n, d) {
|
|
10024
10024
|
const { mp4: o, info: m } = e;
|
|
10025
|
-
return new Promise((h,
|
|
10025
|
+
return new Promise((h, S) => {
|
|
10026
10026
|
let W = 0, v = !1, Z = 0;
|
|
10027
10027
|
const O = i === "audio" ? EncodedAudioChunk : EncodedVideoChunk, w = [], N = i === "audio" ? m.audioTracks[0] ?? null : m.videoTracks[0] ?? null;
|
|
10028
10028
|
if (!N) {
|
|
@@ -10030,7 +10030,7 @@ function ha(t, e, i, n, d) {
|
|
|
10030
10030
|
return;
|
|
10031
10031
|
}
|
|
10032
10032
|
Z = N.id;
|
|
10033
|
-
const J = m.duration / m.timescale -
|
|
10033
|
+
const J = m.duration / m.timescale - da, U = Math.min(d || J, J);
|
|
10034
10034
|
for (const K in m.tracks) {
|
|
10035
10035
|
const X = m.tracks[K];
|
|
10036
10036
|
o.unsetExtractionOptions(X.id);
|
|
@@ -10051,15 +10051,15 @@ function ha(t, e, i, n, d) {
|
|
|
10051
10051
|
}
|
|
10052
10052
|
if (A.length > 0 && o.releaseUsedSamples(Z, A[A.length - 1].number), w.length > 0) {
|
|
10053
10053
|
const H = w[w.length - 1].timestamp / 1e6;
|
|
10054
|
-
(Math.abs(H - U) <
|
|
10054
|
+
(Math.abs(H - U) < ca || H > U) && (v = !0, o.stop(), o.flush(), h(w));
|
|
10055
10055
|
}
|
|
10056
10056
|
}, o.onError = (K) => {
|
|
10057
|
-
|
|
10057
|
+
S(
|
|
10058
10058
|
new Error(
|
|
10059
10059
|
`Extraction error: ${K instanceof Error ? K.message : String(K)}`
|
|
10060
10060
|
)
|
|
10061
10061
|
);
|
|
10062
|
-
}, o.setExtractionOptions(Z, null, { nbSamples:
|
|
10062
|
+
}, o.setExtractionOptions(Z, null, { nbSamples: oa });
|
|
10063
10063
|
const k = o.seek(n, !0), I = t.slice(k.offset).stream().getReader();
|
|
10064
10064
|
W = k.offset;
|
|
10065
10065
|
const r = async () => {
|
|
@@ -10072,13 +10072,13 @@ function ha(t, e, i, n, d) {
|
|
|
10072
10072
|
const A = X.buffer;
|
|
10073
10073
|
return A.fileStart = W, W += X.length, o.appendBuffer(A), r();
|
|
10074
10074
|
} catch (K) {
|
|
10075
|
-
|
|
10075
|
+
S(K);
|
|
10076
10076
|
}
|
|
10077
10077
|
};
|
|
10078
|
-
o.start(), r().catch(
|
|
10078
|
+
o.start(), r().catch(S);
|
|
10079
10079
|
});
|
|
10080
10080
|
}
|
|
10081
|
-
class
|
|
10081
|
+
class T1 {
|
|
10082
10082
|
/**
|
|
10083
10083
|
* Create a new MP4Demuxer instance.
|
|
10084
10084
|
* @param file - The MP4 file to demux
|
|
@@ -10092,7 +10092,7 @@ class R1 {
|
|
|
10092
10092
|
* Must be called before extracting segments.
|
|
10093
10093
|
*/
|
|
10094
10094
|
async load(e) {
|
|
10095
|
-
this.mp4Data = await
|
|
10095
|
+
this.mp4Data = await ha(this.file, e);
|
|
10096
10096
|
}
|
|
10097
10097
|
/**
|
|
10098
10098
|
* Get track information from the loaded MP4 file.
|
|
@@ -10137,7 +10137,7 @@ class R1 {
|
|
|
10137
10137
|
async extractSegment(e, i, n) {
|
|
10138
10138
|
if (!this.mp4Data)
|
|
10139
10139
|
throw new Error("MP4Demuxer: Must call load() before extractSegment()");
|
|
10140
|
-
return
|
|
10140
|
+
return ba(this.file, this.mp4Data, e, i, n);
|
|
10141
10141
|
}
|
|
10142
10142
|
/**
|
|
10143
10143
|
* Get the full MP4 info object from MP4Box.
|
|
@@ -10150,7 +10150,7 @@ class R1 {
|
|
|
10150
10150
|
return this.mp4Data.info;
|
|
10151
10151
|
}
|
|
10152
10152
|
}
|
|
10153
|
-
class
|
|
10153
|
+
class W1 {
|
|
10154
10154
|
/**
|
|
10155
10155
|
* Create a new InMemoryStorage instance
|
|
10156
10156
|
* @param chunkSize Size of each chunk in bytes (default: 10MB)
|
|
@@ -10167,11 +10167,11 @@ class T1 {
|
|
|
10167
10167
|
this._size = Math.max(this._size, i + e.byteLength);
|
|
10168
10168
|
const n = Math.floor(i / this._chunkSize), d = Math.floor((i + e.byteLength - 1) / this._chunkSize);
|
|
10169
10169
|
for (let o = n; o <= d; o++) {
|
|
10170
|
-
const m = o * this._chunkSize, h = m + this._chunkSize,
|
|
10170
|
+
const m = o * this._chunkSize, h = m + this._chunkSize, S = Math.max(i, m), v = Math.min(i + e.byteLength, h) - S;
|
|
10171
10171
|
if (v <= 0) continue;
|
|
10172
10172
|
let Z;
|
|
10173
10173
|
this.chunks.has(o) ? Z = this.chunks.get(o) : (Z = new Uint8Array(this._chunkSize), this.chunks.set(o, Z));
|
|
10174
|
-
const O =
|
|
10174
|
+
const O = S - m, w = S - i;
|
|
10175
10175
|
for (let N = 0; N < v; N++)
|
|
10176
10176
|
Z[O + N] = e[w + N];
|
|
10177
10177
|
}
|
|
@@ -10193,25 +10193,57 @@ class T1 {
|
|
|
10193
10193
|
for (let o = 0; o < i.length; o++) {
|
|
10194
10194
|
const m = i[o], h = this.chunks.get(m);
|
|
10195
10195
|
if (o === i.length - 1) {
|
|
10196
|
-
const
|
|
10197
|
-
|
|
10196
|
+
const S = this._size - m * this._chunkSize;
|
|
10197
|
+
S < this._chunkSize ? n.push(h.slice(0, S)) : n.push(h);
|
|
10198
10198
|
} else
|
|
10199
10199
|
n.push(h);
|
|
10200
10200
|
}
|
|
10201
10201
|
return new Blob(n, { type: e });
|
|
10202
10202
|
}
|
|
10203
10203
|
}
|
|
10204
|
-
|
|
10205
|
-
|
|
10206
|
-
|
|
10204
|
+
class mn {
|
|
10205
|
+
constructor({ track: e }) {
|
|
10206
|
+
const i = e.getSettings();
|
|
10207
|
+
if (!i)
|
|
10208
|
+
throw new Error("track has no settings");
|
|
10209
|
+
let n, d;
|
|
10210
|
+
const o = i.frameRate ?? 30;
|
|
10211
|
+
this.readable = new ReadableStream({
|
|
10212
|
+
async start() {
|
|
10213
|
+
n = document.createElement("video"), n.srcObject = new MediaStream([e]), await Promise.all([
|
|
10214
|
+
n.play(),
|
|
10215
|
+
new Promise((m) => {
|
|
10216
|
+
n.onloadedmetadata = m;
|
|
10217
|
+
})
|
|
10218
|
+
]), d = performance.now();
|
|
10219
|
+
},
|
|
10220
|
+
async pull(m) {
|
|
10221
|
+
for (; ; ) {
|
|
10222
|
+
const h = performance.now();
|
|
10223
|
+
if (h - d < 1e3 / o) {
|
|
10224
|
+
await new Promise((S) => requestAnimationFrame(S));
|
|
10225
|
+
continue;
|
|
10226
|
+
}
|
|
10227
|
+
d = h, m.enqueue(new VideoFrame(n, { timestamp: d * 1e3 }));
|
|
10228
|
+
break;
|
|
10229
|
+
}
|
|
10230
|
+
}
|
|
10231
|
+
});
|
|
10232
|
+
}
|
|
10233
|
+
}
|
|
10234
|
+
self.MediaStreamTrackProcessor || (self.MediaStreamTrackProcessor = mn);
|
|
10235
|
+
const L1 = self.MediaStreamTrackProcessor || mn;
|
|
10236
|
+
var pa = Object.defineProperty, ya = (t, e, i) => e in t ? pa(t, e, { enumerable: !0, configurable: !0, writable: !0, value: i }) : t[e] = i, oi = (t, e, i) => (ya(t, typeof e != "symbol" ? e + "" : e, i), i), I0 = /* @__PURE__ */ ((t) => (t[t.AVMEDIA_TYPE_UNKNOWN = -1] = "AVMEDIA_TYPE_UNKNOWN", t[t.AVMEDIA_TYPE_VIDEO = 0] = "AVMEDIA_TYPE_VIDEO", t[t.AVMEDIA_TYPE_AUDIO = 1] = "AVMEDIA_TYPE_AUDIO", t[t.AVMEDIA_TYPE_DATA = 2] = "AVMEDIA_TYPE_DATA", t[t.AVMEDIA_TYPE_SUBTITLE = 3] = "AVMEDIA_TYPE_SUBTITLE", t[t.AVMEDIA_TYPE_ATTACHMENT = 4] = "AVMEDIA_TYPE_ATTACHMENT", t[t.AVMEDIA_TYPE_NB = 5] = "AVMEDIA_TYPE_NB", t))(I0 || {}), di = /* @__PURE__ */ ((t) => (t[t.AVSEEK_FLAG_BACKWARD = 1] = "AVSEEK_FLAG_BACKWARD", t[t.AVSEEK_FLAG_BYTE = 2] = "AVSEEK_FLAG_BYTE", t[t.AVSEEK_FLAG_ANY = 4] = "AVSEEK_FLAG_ANY", t[t.AVSEEK_FLAG_FRAME = 8] = "AVSEEK_FLAG_FRAME", t))(di || {}), rt = /* @__PURE__ */ ((t) => (t.WasmWorkerLoaded = "WasmWorkerLoaded", t.WASMRuntimeInitialized = "WASMRuntimeInitialized", t.LoadWASM = "LoadWASM", t.GetAVPacket = "GetAVPacket", t.GetAVPackets = "GetAVPackets", t.GetAVStream = "GetAVStream", t.GetAVStreams = "GetAVStreams", t.GetMediaInfo = "GetMediaInfo", t.ReadAVPacket = "ReadAVPacket", t.AVPacketStream = "AVPacketStream", t.ReadNextAVPacket = "ReadNextAVPacket", t.StopReadAVPacket = "StopReadAVPacket", t.SetAVLogLevel = "SetAVLogLevel", t))(rt || {});
|
|
10237
|
+
const un = "video", fa = "audio", Za = "subtitle", ws = {
|
|
10238
|
+
VIDEO: un
|
|
10207
10239
|
}, Ci = {
|
|
10208
|
-
[
|
|
10209
|
-
[
|
|
10210
|
-
[
|
|
10211
|
-
}, un = "KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciBBZT0oRT0+KEVbRS5BVk1FRElBX1RZUEVfVU5LTk9XTj0tMV09IkFWTUVESUFfVFlQRV9VTktOT1dOIixFW0UuQVZNRURJQV9UWVBFX1ZJREVPPTBdPSJBVk1FRElBX1RZUEVfVklERU8iLEVbRS5BVk1FRElBX1RZUEVfQVVESU89MV09IkFWTUVESUFfVFlQRV9BVURJTyIsRVtFLkFWTUVESUFfVFlQRV9EQVRBPTJdPSJBVk1FRElBX1RZUEVfREFUQSIsRVtFLkFWTUVESUFfVFlQRV9TVUJUSVRMRT0zXT0iQVZNRURJQV9UWVBFX1NVQlRJVExFIixFW0UuQVZNRURJQV9UWVBFX0FUVEFDSE1FTlQ9NF09IkFWTUVESUFfVFlQRV9BVFRBQ0hNRU5UIixFW0UuQVZNRURJQV9UWVBFX05CPTVdPSJBVk1FRElBX1RZUEVfTkIiLEUpKShBZXx8e30pLEc9KEU9PihFLldhc21Xb3JrZXJMb2FkZWQ9Ildhc21Xb3JrZXJMb2FkZWQiLEUuV0FTTVJ1bnRpbWVJbml0aWFsaXplZD0iV0FTTVJ1bnRpbWVJbml0aWFsaXplZCIsRS5Mb2FkV0FTTT0iTG9hZFdBU00iLEUuR2V0QVZQYWNrZXQ9IkdldEFWUGFja2V0IixFLkdldEFWUGFja2V0cz0iR2V0QVZQYWNrZXRzIixFLkdldEFWU3RyZWFtPSJHZXRBVlN0cmVhbSIsRS5HZXRBVlN0cmVhbXM9IkdldEFWU3RyZWFtcyIsRS5HZXRNZWRpYUluZm89IkdldE1lZGlhSW5mbyIsRS5SZWFkQVZQYWNrZXQ9IlJlYWRBVlBhY2tldCIsRS5BVlBhY2tldFN0cmVhbT0iQVZQYWNrZXRTdHJlYW0iLEUuUmVhZE5leHRBVlBhY2tldD0iUmVhZE5leHRBVlBhY2tldCIsRS5TdG9wUmVhZEFWUGFja2V0PSJTdG9wUmVhZEFWUGFja2V0IixFLlNldEFWTG9nTGV2ZWw9IlNldEFWTG9nTGV2ZWwiLEUpKShHfHx7fSk7InZpZGVvIisiIixBZS5BVk1FRElBX1RZUEVfVklERU8sImF1ZGlvIisiIixBZS5BVk1FRElBX1RZUEVfQVVESU8sInN1YnRpdGxlIisiIixBZS5BVk1FRElBX1RZUEVfU1VCVElUTEU7dmFyIGl0PSgoKT0+e3ZhciBFPXNlbGYubG9jYXRpb24uaHJlZjtyZXR1cm4gZnVuY3Rpb24oUj17fSl7dmFyIEMsZj1PYmplY3QuYXNzaWduKHt9LFIpLFUsSCxuZT1uZXcgUHJvbWlzZSgoZSxyKT0+e1U9ZSxIPXJ9KSxhZT0hMCxEZT1PYmplY3QuYXNzaWduKHt9LGYpLGhyPSIuL3RoaXMucHJvZ3JhbSIscT0iIjtmdW5jdGlvbiBtdChlKXtyZXR1cm4gZi5sb2NhdGVGaWxlP2YubG9jYXRlRmlsZShlLHEpOnErZX12YXIgWWUsbXIsR2U7cT1zZWxmLmxvY2F0aW9uLmhyZWYsRSYmKHE9RSkscS5zdGFydHNXaXRoKCJibG9iOiIpP3E9IiI6cT1xLnN1YnN0cigwLHEucmVwbGFjZSgvWz8jXS4qLywiIikubGFzdEluZGV4T2YoIi8iKSsxKSxZZT1lPT57dmFyIHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3JldHVybiByLm9wZW4oIkdFVCIsZSwhMSksci5zZW5kKG51bGwpLHIucmVzcG9uc2VUZXh0fSxHZT1lPT57dmFyIHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3JldHVybiByLm9wZW4oIkdFVCIsZSwhMSksci5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIixyLnNlbmQobnVsbCksbmV3IFVpbnQ4QXJyYXkoci5yZXNwb25zZSl9LG1yPShlLHIsdCk9Pnt2YXIgbj1uZXcgWE1MSHR0cFJlcXVlc3Q7bi5vcGVuKCJHRVQiLGUsITApLG4ucmVzcG9uc2VUeXBlPSJhcnJheWJ1ZmZlciIsbi5vbmxvYWQ9KCk9PntpZihuLnN0YXR1cz09MjAwfHxuLnN0YXR1cz09MCYmbi5yZXNwb25zZSl7cihuLnJlc3BvbnNlKTtyZXR1cm59dCgpfSxuLm9uZXJyb3I9dCxuLnNlbmQobnVsbCl9O3ZhciBxZT1mLnByaW50fHxjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLGVlPWYucHJpbnRFcnJ8fGNvbnNvbGUuZXJyb3IuYmluZChjb25zb2xlKTtPYmplY3QuYXNzaWduKGYsRGUpLERlPW51bGwsZi5hcmd1bWVudHMmJmYuYXJndW1lbnRzLGYudGhpc1Byb2dyYW0mJihocj1mLnRoaXNQcm9ncmFtKSxmLnF1aXQmJmYucXVpdDt2YXIgX2U7Zi53YXNtQmluYXJ5JiYoX2U9Zi53YXNtQmluYXJ5KTt2YXIgJGUscHI9ITE7ZnVuY3Rpb24gX3IoZSxyKXtlfHxpZShyKX12YXIgSSx4LFksQ2UsZyxBLGdyLHlyO2Z1bmN0aW9uIHdyKCl7dmFyIGU9JGUuYnVmZmVyO2YuSEVBUDg9ST1uZXcgSW50OEFycmF5KGUpLGYuSEVBUDE2PVk9bmV3IEludDE2QXJyYXkoZSksZi5IRUFQVTg9eD1uZXcgVWludDhBcnJheShlKSxmLkhFQVBVMTY9Q2U9bmV3IFVpbnQxNkFycmF5KGUpLGYuSEVBUDMyPWc9bmV3IEludDMyQXJyYXkoZSksZi5IRUFQVTMyPUE9bmV3IFVpbnQzMkFycmF5KGUpLGYuSEVBUEYzMj1ncj1uZXcgRmxvYXQzMkFycmF5KGUpLGYuSEVBUEY2ND15cj1uZXcgRmxvYXQ2NEFycmF5KGUpfXZhciBFcj1bXSxicj1bXSxrcj1bXTtmdW5jdGlvbiBwdCgpe2lmKGYucHJlUnVuKWZvcih0eXBlb2YgZi5wcmVSdW49PSJmdW5jdGlvbiImJihmLnByZVJ1bj1bZi5wcmVSdW5dKTtmLnByZVJ1bi5sZW5ndGg7KXl0KGYucHJlUnVuLnNoaWZ0KCkpO0tlKEVyKX1mdW5jdGlvbiBfdCgpeyFmLm5vRlNJbml0JiYhby5pbml0LmluaXRpYWxpemVkJiZvLmluaXQoKSxvLmlnbm9yZVBlcm1pc3Npb25zPSExLEtlKGJyKX1mdW5jdGlvbiBndCgpe2lmKGYucG9zdFJ1bilmb3IodHlwZW9mIGYucG9zdFJ1bj09ImZ1bmN0aW9uIiYmKGYucG9zdFJ1bj1bZi5wb3N0UnVuXSk7Zi5wb3N0UnVuLmxlbmd0aDspRXQoZi5wb3N0UnVuLnNoaWZ0KCkpO0tlKGtyKX1mdW5jdGlvbiB5dChlKXtFci51bnNoaWZ0KGUpfWZ1bmN0aW9uIHd0KGUpe2JyLnVuc2hpZnQoZSl9ZnVuY3Rpb24gRXQoZSl7a3IudW5zaGlmdChlKX12YXIgb2U9MCxnZT1udWxsO2Z1bmN0aW9uIEhhKGUpe3JldHVybiBlfWZ1bmN0aW9uIFhlKGUpe3ZhciByO29lKyssKHI9Zi5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKT09bnVsbHx8ci5jYWxsKGYsb2UpfWZ1bmN0aW9uIEZlKGUpe3ZhciB0O2lmKG9lLS0sKHQ9Zi5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKT09bnVsbHx8dC5jYWxsKGYsb2UpLG9lPT0wJiZnZSl7dmFyIHI9Z2U7Z2U9bnVsbCxyKCl9fWZ1bmN0aW9uIGllKGUpe3ZhciB0Oyh0PWYub25BYm9ydCk9PW51bGx8fHQuY2FsbChmLGUpLGU9IkFib3J0ZWQoIitlKyIpIixlZShlKSxwcj0hMCxlKz0iLiBCdWlsZCB3aXRoIC1zQVNTRVJUSU9OUyBmb3IgbW9yZSBpbmZvLiI7dmFyIHI9bmV3IFdlYkFzc2VtYmx5LlJ1bnRpbWVFcnJvcihlKTt0aHJvdyBIKHIpLHJ9dmFyIGJ0PSJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsIixQcj1lPT5lLnN0YXJ0c1dpdGgoYnQpO2Z1bmN0aW9uIGt0KCl7aWYoZi5sb2NhdGVGaWxlKXt2YXIgZT0id2ViLWRlbXV4ZXIud2FzbSI7cmV0dXJuIFByKGUpP2U6bXQoZSl9cmV0dXJuIG5ldyBVUkwoIndlYi1kZW11eGVyLndhc20iLHNlbGYubG9jYXRpb24uaHJlZikuaHJlZn12YXIgVGU7ZnVuY3Rpb24gQXIoZSl7aWYoZT09VGUmJl9lKXJldHVybiBuZXcgVWludDhBcnJheShfZSk7aWYoR2UpcmV0dXJuIEdlKGUpO3Rocm93ImJvdGggYXN5bmMgYW5kIHN5bmMgZmV0Y2hpbmcgb2YgdGhlIHdhc20gZmFpbGVkIn1mdW5jdGlvbiBQdChlKXtyZXR1cm4hX2UmJmFlJiZ0eXBlb2YgZmV0Y2g9PSJmdW5jdGlvbiI/ZmV0Y2goZSx7Y3JlZGVudGlhbHM6InNhbWUtb3JpZ2luIn0pLnRoZW4ocj0+e2lmKCFyLm9rKXRocm93YGZhaWxlZCB0byBsb2FkIHdhc20gYmluYXJ5IGZpbGUgYXQgJyR7ZX0nYDtyZXR1cm4gci5hcnJheUJ1ZmZlcigpfSkuY2F0Y2goKCk9PkFyKGUpKTpQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5BcihlKSl9ZnVuY3Rpb24gRHIoZSxyLHQpe3JldHVybiBQdChlKS50aGVuKG49PldlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKG4scikpLnRoZW4odCxuPT57ZWUoYGZhaWxlZCB0byBhc3luY2hyb25vdXNseSBwcmVwYXJlIHdhc206ICR7bn1gKSxpZShuKX0pfWZ1bmN0aW9uIEF0KGUscix0LG4pe3JldHVybiFlJiZ0eXBlb2YgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmc9PSJmdW5jdGlvbiImJiFQcihyKSYmdHlwZW9mIGZldGNoPT0iZnVuY3Rpb24iP2ZldGNoKHIse2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKGE9Pnt2YXIgaT1XZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhhLHQpO3JldHVybiBpLnRoZW4obixmdW5jdGlvbihzKXtyZXR1cm4gZWUoYHdhc20gc3RyZWFtaW5nIGNvbXBpbGUgZmFpbGVkOiAke3N9YCksZWUoImZhbGxpbmcgYmFjayB0byBBcnJheUJ1ZmZlciBpbnN0YW50aWF0aW9uIiksRHIocix0LG4pfSl9KTpEcihyLHQsbil9ZnVuY3Rpb24gRHQoKXtyZXR1cm57YTpDYX19ZnVuY3Rpb24gJHQoKXt2YXIgZT1EdCgpO2Z1bmN0aW9uIHIobixhKXtyZXR1cm4gej1uLmV4cG9ydHMsJGU9ei5iYSx3cigpLGpyPXouZWEsd3Qoei5jYSksRmUoKSx6fVhlKCk7ZnVuY3Rpb24gdChuKXtyKG4uaW5zdGFuY2UpfWlmKGYuaW5zdGFudGlhdGVXYXNtKXRyeXtyZXR1cm4gZi5pbnN0YW50aWF0ZVdhc20oZSxyKX1jYXRjaChuKXtlZShgTW9kdWxlLmluc3RhbnRpYXRlV2FzbSBjYWxsYmFjayBmYWlsZWQgd2l0aCBlcnJvcjogJHtufWApLEgobil9cmV0dXJuIFRlfHwoVGU9a3QoKSksQXQoX2UsVGUsZSx0KS5jYXRjaChIKSx7fX12YXIgeSwkLEtlPWU9Pntmb3IoO2UubGVuZ3RoPjA7KWUuc2hpZnQoKShmKX07Zi5ub0V4aXRSdW50aW1lO3ZhciAkcj10eXBlb2YgVGV4dERlY29kZXI8InUiP25ldyBUZXh0RGVjb2RlcigidXRmOCIpOnZvaWQgMCxjZT0oZSxyLHQpPT57Zm9yKHZhciBuPXIrdCxhPXI7ZVthXSYmIShhPj1uKTspKythO2lmKGEtcj4xNiYmZS5idWZmZXImJiRyKXJldHVybiAkci5kZWNvZGUoZS5zdWJhcnJheShyLGEpKTtmb3IodmFyIGk9IiI7cjxhOyl7dmFyIHM9ZVtyKytdO2lmKCEocyYxMjgpKXtpKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHMpO2NvbnRpbnVlfXZhciBsPWVbcisrXSY2MztpZigocyYyMjQpPT0xOTIpe2krPVN0cmluZy5mcm9tQ2hhckNvZGUoKHMmMzEpPDw2fGwpO2NvbnRpbnVlfXZhciB1PWVbcisrXSY2MztpZigocyYyNDApPT0yMjQ/cz0ocyYxNSk8PDEyfGw8PDZ8dTpzPShzJjcpPDwxOHxsPDwxMnx1PDw2fGVbcisrXSY2MyxzPDY1NTM2KWkrPVN0cmluZy5mcm9tQ2hhckNvZGUocyk7ZWxzZXt2YXIgYz1zLTY1NTM2O2krPVN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTZ8Yz4+MTAsNTYzMjB8YyYxMDIzKX19cmV0dXJuIGl9LHNlPShlLHIpPT5lP2NlKHgsZSxyKToiIixDdD0oZSxyLHQsbik9PntpZShgQXNzZXJ0aW9uIGZhaWxlZDogJHtzZShlKX0sIGF0OiBgK1tyP3NlKHIpOiJ1bmtub3duIGZpbGVuYW1lIix0LG4/c2Uobik6InVua25vd24gZnVuY3Rpb24iXSl9O2NsYXNzIEZ0e2NvbnN0cnVjdG9yKHIpe3RoaXMuZXhjUHRyPXIsdGhpcy5wdHI9ci0yNH1zZXRfdHlwZShyKXtBW3RoaXMucHRyKzQ+PjJdPXJ9Z2V0X3R5cGUoKXtyZXR1cm4gQVt0aGlzLnB0cis0Pj4yXX1zZXRfZGVzdHJ1Y3RvcihyKXtBW3RoaXMucHRyKzg+PjJdPXJ9Z2V0X2Rlc3RydWN0b3IoKXtyZXR1cm4gQVt0aGlzLnB0cis4Pj4yXX1zZXRfY2F1Z2h0KHIpe3I9cj8xOjAsSVt0aGlzLnB0cisxMl09cn1nZXRfY2F1Z2h0KCl7cmV0dXJuIElbdGhpcy5wdHIrMTJdIT0wfXNldF9yZXRocm93bihyKXtyPXI/MTowLElbdGhpcy5wdHIrMTNdPXJ9Z2V0X3JldGhyb3duKCl7cmV0dXJuIElbdGhpcy5wdHIrMTNdIT0wfWluaXQocix0KXt0aGlzLnNldF9hZGp1c3RlZF9wdHIoMCksdGhpcy5zZXRfdHlwZShyKSx0aGlzLnNldF9kZXN0cnVjdG9yKHQpfXNldF9hZGp1c3RlZF9wdHIocil7QVt0aGlzLnB0cisxNj4+Ml09cn1nZXRfYWRqdXN0ZWRfcHRyKCl7cmV0dXJuIEFbdGhpcy5wdHIrMTY+PjJdfWdldF9leGNlcHRpb25fcHRyKCl7dmFyIHI9cnQodGhpcy5nZXRfdHlwZSgpKTtpZihyKXJldHVybiBBW3RoaXMuZXhjUHRyPj4yXTt2YXIgdD10aGlzLmdldF9hZGp1c3RlZF9wdHIoKTtyZXR1cm4gdCE9PTA/dDp0aGlzLmV4Y1B0cn19dmFyIENyPTAsVHQ9KGUscix0KT0+e3ZhciBuPW5ldyBGdChlKTt0aHJvdyBuLmluaXQocix0KSxDcj1lLENyfSxTPXtpc0FiczplPT5lLmNoYXJBdCgwKT09PSIvIixzcGxpdFBhdGg6ZT0+e3ZhciByPS9eKFwvP3wpKFtcc1xTXSo/KSgoPzpcLnsxLDJ9fFteXC9dKz98KShcLlteLlwvXSp8KSkoPzpbXC9dKikkLztyZXR1cm4gci5leGVjKGUpLnNsaWNlKDEpfSxub3JtYWxpemVBcnJheTooZSxyKT0+e2Zvcih2YXIgdD0wLG49ZS5sZW5ndGgtMTtuPj0wO24tLSl7dmFyIGE9ZVtuXTthPT09Ii4iP2Uuc3BsaWNlKG4sMSk6YT09PSIuLiI/KGUuc3BsaWNlKG4sMSksdCsrKTp0JiYoZS5zcGxpY2UobiwxKSx0LS0pfWlmKHIpZm9yKDt0O3QtLSllLnVuc2hpZnQoIi4uIik7cmV0dXJuIGV9LG5vcm1hbGl6ZTplPT57dmFyIHI9Uy5pc0FicyhlKSx0PWUuc3Vic3RyKC0xKT09PSIvIjtyZXR1cm4gZT1TLm5vcm1hbGl6ZUFycmF5KGUuc3BsaXQoIi8iKS5maWx0ZXIobj0+ISFuKSwhcikuam9pbigiLyIpLCFlJiYhciYmKGU9Ii4iKSxlJiZ0JiYoZSs9Ii8iKSwocj8iLyI6IiIpK2V9LGRpcm5hbWU6ZT0+e3ZhciByPVMuc3BsaXRQYXRoKGUpLHQ9clswXSxuPXJbMV07cmV0dXJuIXQmJiFuPyIuIjoobiYmKG49bi5zdWJzdHIoMCxuLmxlbmd0aC0xKSksdCtuKX0sYmFzZW5hbWU6ZT0+e2lmKGU9PT0iLyIpcmV0dXJuIi8iO2U9Uy5ub3JtYWxpemUoZSksZT1lLnJlcGxhY2UoL1wvJC8sIiIpO3ZhciByPWUubGFzdEluZGV4T2YoIi8iKTtyZXR1cm4gcj09PS0xP2U6ZS5zdWJzdHIocisxKX0sam9pbjooLi4uZSk9PlMubm9ybWFsaXplKGUuam9pbigiLyIpKSxqb2luMjooZSxyKT0+Uy5ub3JtYWxpemUoZSsiLyIrcil9LFN0PSgpPT57aWYodHlwZW9mIGNyeXB0bz09Im9iamVjdCImJnR5cGVvZiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzPT0iZnVuY3Rpb24iKXJldHVybiBlPT5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGUpO2llKCJpbml0UmFuZG9tRGV2aWNlIil9LEZyPWU9PihGcj1TdCgpKShlKSxYPXtyZXNvbHZlOiguLi5lKT0+e2Zvcih2YXIgcj0iIix0PSExLG49ZS5sZW5ndGgtMTtuPj0tMSYmIXQ7bi0tKXt2YXIgYT1uPj0wP2Vbbl06by5jd2QoKTtpZih0eXBlb2YgYSE9InN0cmluZyIpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnRzIHRvIHBhdGgucmVzb2x2ZSBtdXN0IGJlIHN0cmluZ3MiKTtpZighYSlyZXR1cm4iIjtyPWErIi8iK3IsdD1TLmlzQWJzKGEpfXJldHVybiByPVMubm9ybWFsaXplQXJyYXkoci5zcGxpdCgiLyIpLmZpbHRlcihpPT4hIWkpLCF0KS5qb2luKCIvIiksKHQ/Ii8iOiIiKStyfHwiLiJ9LHJlbGF0aXZlOihlLHIpPT57ZT1YLnJlc29sdmUoZSkuc3Vic3RyKDEpLHI9WC5yZXNvbHZlKHIpLnN1YnN0cigxKTtmdW5jdGlvbiB0KGMpe2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGgmJmNbZF09PT0iIjtkKyspO2Zvcih2YXIgbT1jLmxlbmd0aC0xO20+PTAmJmNbbV09PT0iIjttLS0pO3JldHVybiBkPm0/W106Yy5zbGljZShkLG0tZCsxKX1mb3IodmFyIG49dChlLnNwbGl0KCIvIikpLGE9dChyLnNwbGl0KCIvIikpLGk9TWF0aC5taW4obi5sZW5ndGgsYS5sZW5ndGgpLHM9aSxsPTA7bDxpO2wrKylpZihuW2xdIT09YVtsXSl7cz1sO2JyZWFrfWZvcih2YXIgdT1bXSxsPXM7bDxuLmxlbmd0aDtsKyspdS5wdXNoKCIuLiIpO3JldHVybiB1PXUuY29uY2F0KGEuc2xpY2UocykpLHUuam9pbigiLyIpfX0sSmU9W10sWmU9ZT0+e2Zvcih2YXIgcj0wLHQ9MDt0PGUubGVuZ3RoOysrdCl7dmFyIG49ZS5jaGFyQ29kZUF0KHQpO248PTEyNz9yKys6bjw9MjA0Nz9yKz0yOm4+PTU1Mjk2JiZuPD01NzM0Mz8ocis9NCwrK3QpOnIrPTN9cmV0dXJuIHJ9LFFlPShlLHIsdCxuKT0+e2lmKCEobj4wKSlyZXR1cm4gMDtmb3IodmFyIGE9dCxpPXQrbi0xLHM9MDtzPGUubGVuZ3RoOysrcyl7dmFyIGw9ZS5jaGFyQ29kZUF0KHMpO2lmKGw+PTU1Mjk2JiZsPD01NzM0Myl7dmFyIHU9ZS5jaGFyQ29kZUF0KCsrcyk7bD02NTUzNisoKGwmMTAyMyk8PDEwKXx1JjEwMjN9aWYobDw9MTI3KXtpZih0Pj1pKWJyZWFrO3JbdCsrXT1sfWVsc2UgaWYobDw9MjA0Nyl7aWYodCsxPj1pKWJyZWFrO3JbdCsrXT0xOTJ8bD4+NixyW3QrK109MTI4fGwmNjN9ZWxzZSBpZihsPD02NTUzNSl7aWYodCsyPj1pKWJyZWFrO3JbdCsrXT0yMjR8bD4+MTIsclt0KytdPTEyOHxsPj42JjYzLHJbdCsrXT0xMjh8bCY2M31lbHNle2lmKHQrMz49aSlicmVhaztyW3QrK109MjQwfGw+PjE4LHJbdCsrXT0xMjh8bD4+MTImNjMsclt0KytdPTEyOHxsPj42JjYzLHJbdCsrXT0xMjh8bCY2M319cmV0dXJuIHJbdF09MCx0LWF9O2Z1bmN0aW9uIFNlKGUscix0KXt2YXIgbj1aZShlKSsxLGE9bmV3IEFycmF5KG4pLGk9UWUoZSxhLDAsYS5sZW5ndGgpO3JldHVybiByJiYoYS5sZW5ndGg9aSksYX12YXIgTXQ9KCk9PntpZighSmUubGVuZ3RoKXt2YXIgZT1udWxsO2lmKCFlKXJldHVybiBudWxsO0plPVNlKGUsITApfXJldHVybiBKZS5zaGlmdCgpfSxsZT17dHR5czpbXSxpbml0KCl7fSxzaHV0ZG93bigpe30scmVnaXN0ZXIoZSxyKXtsZS50dHlzW2VdPXtpbnB1dDpbXSxvdXRwdXQ6W10sb3BzOnJ9LG8ucmVnaXN0ZXJEZXZpY2UoZSxsZS5zdHJlYW1fb3BzKX0sc3RyZWFtX29wczp7b3BlbihlKXt2YXIgcj1sZS50dHlzW2Uubm9kZS5yZGV2XTtpZighcil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQzKTtlLnR0eT1yLGUuc2Vla2FibGU9ITF9LGNsb3NlKGUpe2UudHR5Lm9wcy5mc3luYyhlLnR0eSl9LGZzeW5jKGUpe2UudHR5Lm9wcy5mc3luYyhlLnR0eSl9LHJlYWQoZSxyLHQsbixhKXtpZighZS50dHl8fCFlLnR0eS5vcHMuZ2V0X2NoYXIpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig2MCk7Zm9yKHZhciBpPTAscz0wO3M8bjtzKyspe3ZhciBsO3RyeXtsPWUudHR5Lm9wcy5nZXRfY2hhcihlLnR0eSl9Y2F0Y2h7dGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOSl9aWYobD09PXZvaWQgMCYmaT09PTApdGhyb3cgbmV3IG8uRXJybm9FcnJvcig2KTtpZihsPT1udWxsKWJyZWFrO2krKyxyW3Qrc109bH1yZXR1cm4gaSYmKGUubm9kZS50aW1lc3RhbXA9RGF0ZS5ub3coKSksaX0sd3JpdGUoZSxyLHQsbixhKXtpZighZS50dHl8fCFlLnR0eS5vcHMucHV0X2NoYXIpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig2MCk7dHJ5e2Zvcih2YXIgaT0wO2k8bjtpKyspZS50dHkub3BzLnB1dF9jaGFyKGUudHR5LHJbdCtpXSl9Y2F0Y2h7dGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOSl9cmV0dXJuIG4mJihlLm5vZGUudGltZXN0YW1wPURhdGUubm93KCkpLGl9fSxkZWZhdWx0X3R0eV9vcHM6e2dldF9jaGFyKGUpe3JldHVybiBNdCgpfSxwdXRfY2hhcihlLHIpe3I9PT1udWxsfHxyPT09MTA/KHFlKGNlKGUub3V0cHV0LDApKSxlLm91dHB1dD1bXSk6ciE9MCYmZS5vdXRwdXQucHVzaChyKX0sZnN5bmMoZSl7ZS5vdXRwdXQmJmUub3V0cHV0Lmxlbmd0aD4wJiYocWUoY2UoZS5vdXRwdXQsMCkpLGUub3V0cHV0PVtdKX0saW9jdGxfdGNnZXRzKGUpe3JldHVybntjX2lmbGFnOjI1ODU2LGNfb2ZsYWc6NSxjX2NmbGFnOjE5MSxjX2xmbGFnOjM1Mzg3LGNfY2M6WzMsMjgsMTI3LDIxLDQsMCwxLDAsMTcsMTksMjYsMCwxOCwxNSwyMywyMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXX19LGlvY3RsX3Rjc2V0cyhlLHIsdCl7cmV0dXJuIDB9LGlvY3RsX3Rpb2Nnd2luc3ooZSl7cmV0dXJuWzI0LDgwXX19LGRlZmF1bHRfdHR5MV9vcHM6e3B1dF9jaGFyKGUscil7cj09PW51bGx8fHI9PT0xMD8oZWUoY2UoZS5vdXRwdXQsMCkpLGUub3V0cHV0PVtdKTpyIT0wJiZlLm91dHB1dC5wdXNoKHIpfSxmc3luYyhlKXtlLm91dHB1dCYmZS5vdXRwdXQubGVuZ3RoPjAmJihlZShjZShlLm91dHB1dCwwKSksZS5vdXRwdXQ9W10pfX19LFRyPWU9PntpZSgpfSxiPXtvcHNfdGFibGU6bnVsbCxtb3VudChlKXtyZXR1cm4gYi5jcmVhdGVOb2RlKG51bGwsIi8iLDE2ODk1LDApfSxjcmVhdGVOb2RlKGUscix0LG4pe2lmKG8uaXNCbGtkZXYodCl8fG8uaXNGSUZPKHQpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpO2Iub3BzX3RhYmxlfHwoYi5vcHNfdGFibGU9e2Rpcjp7bm9kZTp7Z2V0YXR0cjpiLm5vZGVfb3BzLmdldGF0dHIsc2V0YXR0cjpiLm5vZGVfb3BzLnNldGF0dHIsbG9va3VwOmIubm9kZV9vcHMubG9va3VwLG1rbm9kOmIubm9kZV9vcHMubWtub2QscmVuYW1lOmIubm9kZV9vcHMucmVuYW1lLHVubGluazpiLm5vZGVfb3BzLnVubGluayxybWRpcjpiLm5vZGVfb3BzLnJtZGlyLHJlYWRkaXI6Yi5ub2RlX29wcy5yZWFkZGlyLHN5bWxpbms6Yi5ub2RlX29wcy5zeW1saW5rfSxzdHJlYW06e2xsc2VlazpiLnN0cmVhbV9vcHMubGxzZWVrfX0sZmlsZTp7bm9kZTp7Z2V0YXR0cjpiLm5vZGVfb3BzLmdldGF0dHIsc2V0YXR0cjpiLm5vZGVfb3BzLnNldGF0dHJ9LHN0cmVhbTp7bGxzZWVrOmIuc3RyZWFtX29wcy5sbHNlZWsscmVhZDpiLnN0cmVhbV9vcHMucmVhZCx3cml0ZTpiLnN0cmVhbV9vcHMud3JpdGUsYWxsb2NhdGU6Yi5zdHJlYW1fb3BzLmFsbG9jYXRlLG1tYXA6Yi5zdHJlYW1fb3BzLm1tYXAsbXN5bmM6Yi5zdHJlYW1fb3BzLm1zeW5jfX0sbGluazp7bm9kZTp7Z2V0YXR0cjpiLm5vZGVfb3BzLmdldGF0dHIsc2V0YXR0cjpiLm5vZGVfb3BzLnNldGF0dHIscmVhZGxpbms6Yi5ub2RlX29wcy5yZWFkbGlua30sc3RyZWFtOnt9fSxjaHJkZXY6e25vZGU6e2dldGF0dHI6Yi5ub2RlX29wcy5nZXRhdHRyLHNldGF0dHI6Yi5ub2RlX29wcy5zZXRhdHRyfSxzdHJlYW06by5jaHJkZXZfc3RyZWFtX29wc319KTt2YXIgYT1vLmNyZWF0ZU5vZGUoZSxyLHQsbik7cmV0dXJuIG8uaXNEaXIoYS5tb2RlKT8oYS5ub2RlX29wcz1iLm9wc190YWJsZS5kaXIubm9kZSxhLnN0cmVhbV9vcHM9Yi5vcHNfdGFibGUuZGlyLnN0cmVhbSxhLmNvbnRlbnRzPXt9KTpvLmlzRmlsZShhLm1vZGUpPyhhLm5vZGVfb3BzPWIub3BzX3RhYmxlLmZpbGUubm9kZSxhLnN0cmVhbV9vcHM9Yi5vcHNfdGFibGUuZmlsZS5zdHJlYW0sYS51c2VkQnl0ZXM9MCxhLmNvbnRlbnRzPW51bGwpOm8uaXNMaW5rKGEubW9kZSk/KGEubm9kZV9vcHM9Yi5vcHNfdGFibGUubGluay5ub2RlLGEuc3RyZWFtX29wcz1iLm9wc190YWJsZS5saW5rLnN0cmVhbSk6by5pc0NocmRldihhLm1vZGUpJiYoYS5ub2RlX29wcz1iLm9wc190YWJsZS5jaHJkZXYubm9kZSxhLnN0cmVhbV9vcHM9Yi5vcHNfdGFibGUuY2hyZGV2LnN0cmVhbSksYS50aW1lc3RhbXA9RGF0ZS5ub3coKSxlJiYoZS5jb250ZW50c1tyXT1hLGUudGltZXN0YW1wPWEudGltZXN0YW1wKSxhfSxnZXRGaWxlRGF0YUFzVHlwZWRBcnJheShlKXtyZXR1cm4gZS5jb250ZW50cz9lLmNvbnRlbnRzLnN1YmFycmF5P2UuY29udGVudHMuc3ViYXJyYXkoMCxlLnVzZWRCeXRlcyk6bmV3IFVpbnQ4QXJyYXkoZS5jb250ZW50cyk6bmV3IFVpbnQ4QXJyYXkoMCl9LGV4cGFuZEZpbGVTdG9yYWdlKGUscil7dmFyIHQ9ZS5jb250ZW50cz9lLmNvbnRlbnRzLmxlbmd0aDowO2lmKCEodD49cikpe3ZhciBuPTEwMjQqMTAyNDtyPU1hdGgubWF4KHIsdCoodDxuPzI6MS4xMjUpPj4+MCksdCE9MCYmKHI9TWF0aC5tYXgociwyNTYpKTt2YXIgYT1lLmNvbnRlbnRzO2UuY29udGVudHM9bmV3IFVpbnQ4QXJyYXkociksZS51c2VkQnl0ZXM+MCYmZS5jb250ZW50cy5zZXQoYS5zdWJhcnJheSgwLGUudXNlZEJ5dGVzKSwwKX19LHJlc2l6ZUZpbGVTdG9yYWdlKGUscil7aWYoZS51c2VkQnl0ZXMhPXIpaWYocj09MCllLmNvbnRlbnRzPW51bGwsZS51c2VkQnl0ZXM9MDtlbHNle3ZhciB0PWUuY29udGVudHM7ZS5jb250ZW50cz1uZXcgVWludDhBcnJheShyKSx0JiZlLmNvbnRlbnRzLnNldCh0LnN1YmFycmF5KDAsTWF0aC5taW4ocixlLnVzZWRCeXRlcykpKSxlLnVzZWRCeXRlcz1yfX0sbm9kZV9vcHM6e2dldGF0dHIoZSl7dmFyIHI9e307cmV0dXJuIHIuZGV2PW8uaXNDaHJkZXYoZS5tb2RlKT9lLmlkOjEsci5pbm89ZS5pZCxyLm1vZGU9ZS5tb2RlLHIubmxpbms9MSxyLnVpZD0wLHIuZ2lkPTAsci5yZGV2PWUucmRldixvLmlzRGlyKGUubW9kZSk/ci5zaXplPTQwOTY6by5pc0ZpbGUoZS5tb2RlKT9yLnNpemU9ZS51c2VkQnl0ZXM6by5pc0xpbmsoZS5tb2RlKT9yLnNpemU9ZS5saW5rLmxlbmd0aDpyLnNpemU9MCxyLmF0aW1lPW5ldyBEYXRlKGUudGltZXN0YW1wKSxyLm10aW1lPW5ldyBEYXRlKGUudGltZXN0YW1wKSxyLmN0aW1lPW5ldyBEYXRlKGUudGltZXN0YW1wKSxyLmJsa3NpemU9NDA5NixyLmJsb2Nrcz1NYXRoLmNlaWwoci5zaXplL3IuYmxrc2l6ZSkscn0sc2V0YXR0cihlLHIpe3IubW9kZSE9PXZvaWQgMCYmKGUubW9kZT1yLm1vZGUpLHIudGltZXN0YW1wIT09dm9pZCAwJiYoZS50aW1lc3RhbXA9ci50aW1lc3RhbXApLHIuc2l6ZSE9PXZvaWQgMCYmYi5yZXNpemVGaWxlU3RvcmFnZShlLHIuc2l6ZSl9LGxvb2t1cChlLHIpe3Rocm93IG8uZ2VuZXJpY0Vycm9yc1s0NF19LG1rbm9kKGUscix0LG4pe3JldHVybiBiLmNyZWF0ZU5vZGUoZSxyLHQsbil9LHJlbmFtZShlLHIsdCl7aWYoby5pc0RpcihlLm1vZGUpKXt2YXIgbjt0cnl7bj1vLmxvb2t1cE5vZGUocix0KX1jYXRjaHt9aWYobilmb3IodmFyIGEgaW4gbi5jb250ZW50cyl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDU1KX1kZWxldGUgZS5wYXJlbnQuY29udGVudHNbZS5uYW1lXSxlLnBhcmVudC50aW1lc3RhbXA9RGF0ZS5ub3coKSxlLm5hbWU9dCxyLmNvbnRlbnRzW3RdPWUsci50aW1lc3RhbXA9ZS5wYXJlbnQudGltZXN0YW1wLGUucGFyZW50PXJ9LHVubGluayhlLHIpe2RlbGV0ZSBlLmNvbnRlbnRzW3JdLGUudGltZXN0YW1wPURhdGUubm93KCl9LHJtZGlyKGUscil7dmFyIHQ9by5sb29rdXBOb2RlKGUscik7Zm9yKHZhciBuIGluIHQuY29udGVudHMpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig1NSk7ZGVsZXRlIGUuY29udGVudHNbcl0sZS50aW1lc3RhbXA9RGF0ZS5ub3coKX0scmVhZGRpcihlKXt2YXIgcj1bIi4iLCIuLiJdO2Zvcih2YXIgdCBvZiBPYmplY3Qua2V5cyhlLmNvbnRlbnRzKSlyLnB1c2godCk7cmV0dXJuIHJ9LHN5bWxpbmsoZSxyLHQpe3ZhciBuPWIuY3JlYXRlTm9kZShlLHIsNDE0NzEsMCk7cmV0dXJuIG4ubGluaz10LG59LHJlYWRsaW5rKGUpe2lmKCFvLmlzTGluayhlLm1vZGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMjgpO3JldHVybiBlLmxpbmt9fSxzdHJlYW1fb3BzOntyZWFkKGUscix0LG4sYSl7dmFyIGk9ZS5ub2RlLmNvbnRlbnRzO2lmKGE+PWUubm9kZS51c2VkQnl0ZXMpcmV0dXJuIDA7dmFyIHM9TWF0aC5taW4oZS5ub2RlLnVzZWRCeXRlcy1hLG4pO2lmKHM+OCYmaS5zdWJhcnJheSlyLnNldChpLnN1YmFycmF5KGEsYStzKSx0KTtlbHNlIGZvcih2YXIgbD0wO2w8cztsKyspclt0K2xdPWlbYStsXTtyZXR1cm4gc30sd3JpdGUoZSxyLHQsbixhLGkpe2lmKHIuYnVmZmVyPT09SS5idWZmZXImJihpPSExKSwhbilyZXR1cm4gMDt2YXIgcz1lLm5vZGU7aWYocy50aW1lc3RhbXA9RGF0ZS5ub3coKSxyLnN1YmFycmF5JiYoIXMuY29udGVudHN8fHMuY29udGVudHMuc3ViYXJyYXkpKXtpZihpKXJldHVybiBzLmNvbnRlbnRzPXIuc3ViYXJyYXkodCx0K24pLHMudXNlZEJ5dGVzPW4sbjtpZihzLnVzZWRCeXRlcz09PTAmJmE9PT0wKXJldHVybiBzLmNvbnRlbnRzPXIuc2xpY2UodCx0K24pLHMudXNlZEJ5dGVzPW4sbjtpZihhK248PXMudXNlZEJ5dGVzKXJldHVybiBzLmNvbnRlbnRzLnNldChyLnN1YmFycmF5KHQsdCtuKSxhKSxufWlmKGIuZXhwYW5kRmlsZVN0b3JhZ2UocyxhK24pLHMuY29udGVudHMuc3ViYXJyYXkmJnIuc3ViYXJyYXkpcy5jb250ZW50cy5zZXQoci5zdWJhcnJheSh0LHQrbiksYSk7ZWxzZSBmb3IodmFyIGw9MDtsPG47bCsrKXMuY29udGVudHNbYStsXT1yW3QrbF07cmV0dXJuIHMudXNlZEJ5dGVzPU1hdGgubWF4KHMudXNlZEJ5dGVzLGErbiksbn0sbGxzZWVrKGUscix0KXt2YXIgbj1yO2lmKHQ9PT0xP24rPWUucG9zaXRpb246dD09PTImJm8uaXNGaWxlKGUubm9kZS5tb2RlKSYmKG4rPWUubm9kZS51c2VkQnl0ZXMpLG48MCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtyZXR1cm4gbn0sYWxsb2NhdGUoZSxyLHQpe2IuZXhwYW5kRmlsZVN0b3JhZ2UoZS5ub2RlLHIrdCksZS5ub2RlLnVzZWRCeXRlcz1NYXRoLm1heChlLm5vZGUudXNlZEJ5dGVzLHIrdCl9LG1tYXAoZSxyLHQsbixhKXtpZighby5pc0ZpbGUoZS5ub2RlLm1vZGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDMpO3ZhciBpLHMsbD1lLm5vZGUuY29udGVudHM7aWYoIShhJjIpJiZsLmJ1ZmZlcj09PUkuYnVmZmVyKXM9ITEsaT1sLmJ5dGVPZmZzZXQ7ZWxzZXtpZigodD4wfHx0K3I8bC5sZW5ndGgpJiYobC5zdWJhcnJheT9sPWwuc3ViYXJyYXkodCx0K3IpOmw9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobCx0LHQrcikpLHM9ITAsaT1UcigpLCFpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDgpO0kuc2V0KGwsaSl9cmV0dXJue3B0cjppLGFsbG9jYXRlZDpzfX0sbXN5bmMoZSxyLHQsbixhKXtyZXR1cm4gYi5zdHJlYW1fb3BzLndyaXRlKGUsciwwLG4sdCwhMSksMH19fSxSdD0oZSxyLHQsbik9Pnt2YXIgYT1gYWwgJHtlfWA7bXIoZSxpPT57cihuZXcgVWludDhBcnJheShpKSksYSYmRmUoKX0saT0+e2lmKHQpdCgpO2Vsc2UgdGhyb3dgTG9hZGluZyBkYXRhIGZpbGUgIiR7ZX0iIGZhaWxlZC5gfSksYSYmWGUoKX0sT3Q9KGUscix0LG4sYSxpKT0+e28uY3JlYXRlRGF0YUZpbGUoZSxyLHQsbixhLGkpfSxJdD1mLnByZWxvYWRQbHVnaW5zfHxbXSxMdD0oZSxyLHQsbik9Pnt0eXBlb2YgQnJvd3NlcjwidSImJkJyb3dzZXIuaW5pdCgpO3ZhciBhPSExO3JldHVybiBJdC5mb3JFYWNoKGk9PnthfHxpLmNhbkhhbmRsZShyKSYmKGkuaGFuZGxlKGUscix0LG4pLGE9ITApfSksYX0sVnQ9KGUscix0LG4sYSxpLHMsbCx1LGMpPT57dmFyIGQ9cj9YLnJlc29sdmUoUy5qb2luMihlLHIpKTplO2Z1bmN0aW9uIG0oaCl7ZnVuY3Rpb24gcCh3KXtjPT1udWxsfHxjKCksbHx8T3QoZSxyLHcsbixhLHUpLGk9PW51bGx8fGkoKSxGZSgpfUx0KGgsZCxwLCgpPT57cz09bnVsbHx8cygpLEZlKCl9KXx8cChoKX1YZSgpLHR5cGVvZiB0PT0ic3RyaW5nIj9SdCh0LG0scyk6bSh0KX0sVXQ9ZT0+e3ZhciByPXtyOjAsInIrIjoyLHc6NTc3LCJ3KyI6NTc4LGE6MTA4OSwiYSsiOjEwOTB9LHQ9cltlXTtpZih0eXBlb2YgdD4idSIpdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGZpbGUgb3BlbiBtb2RlOiAke2V9YCk7cmV0dXJuIHR9LGVyPShlLHIpPT57dmFyIHQ9MDtyZXR1cm4gZSYmKHR8PTM2NSksciYmKHR8PTE0NiksdH0sVj17RElSX01PREU6MTY4OTUsRklMRV9NT0RFOjMzMjc5LHJlYWRlcjpudWxsLG1vdW50KGUpe19yKGFlKSxWLnJlYWRlcnx8KFYucmVhZGVyPW5ldyBGaWxlUmVhZGVyU3luYyk7dmFyIHI9Vi5jcmVhdGVOb2RlKG51bGwsIi8iLFYuRElSX01PREUsMCksdD17fTtmdW5jdGlvbiBuKGkpe2Zvcih2YXIgcz1pLnNwbGl0KCIvIiksbD1yLHU9MDt1PHMubGVuZ3RoLTE7dSsrKXt2YXIgYz1zLnNsaWNlKDAsdSsxKS5qb2luKCIvIik7dFtjXXx8KHRbY109Vi5jcmVhdGVOb2RlKGwsc1t1XSxWLkRJUl9NT0RFLDApKSxsPXRbY119cmV0dXJuIGx9ZnVuY3Rpb24gYShpKXt2YXIgcz1pLnNwbGl0KCIvIik7cmV0dXJuIHNbcy5sZW5ndGgtMV19cmV0dXJuIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZS5vcHRzLmZpbGVzfHxbXSxmdW5jdGlvbihpKXtWLmNyZWF0ZU5vZGUobihpLm5hbWUpLGEoaS5uYW1lKSxWLkZJTEVfTU9ERSwwLGksaS5sYXN0TW9kaWZpZWREYXRlKX0pLChlLm9wdHMuYmxvYnN8fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGkpe1YuY3JlYXRlTm9kZShuKGkubmFtZSksYShpLm5hbWUpLFYuRklMRV9NT0RFLDAsaS5kYXRhKX0pLChlLm9wdHMucGFja2FnZXN8fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGkpe2kubWV0YWRhdGEuZmlsZXMuZm9yRWFjaChmdW5jdGlvbihzKXt2YXIgbD1zLmZpbGVuYW1lLnN1YnN0cigxKTtWLmNyZWF0ZU5vZGUobihsKSxhKGwpLFYuRklMRV9NT0RFLDAsaS5ibG9iLnNsaWNlKHMuc3RhcnQscy5lbmQpKX0pfSkscn0sY3JlYXRlTm9kZShlLHIsdCxuLGEsaSl7dmFyIHM9by5jcmVhdGVOb2RlKGUscix0KTtyZXR1cm4gcy5tb2RlPXQscy5ub2RlX29wcz1WLm5vZGVfb3BzLHMuc3RyZWFtX29wcz1WLnN0cmVhbV9vcHMscy50aW1lc3RhbXA9KGl8fG5ldyBEYXRlKS5nZXRUaW1lKCksX3IoVi5GSUxFX01PREUhPT1WLkRJUl9NT0RFKSx0PT09Vi5GSUxFX01PREU/KHMuc2l6ZT1hLnNpemUscy5jb250ZW50cz1hKToocy5zaXplPTQwOTYscy5jb250ZW50cz17fSksZSYmKGUuY29udGVudHNbcl09cyksc30sbm9kZV9vcHM6e2dldGF0dHIoZSl7cmV0dXJue2RldjoxLGlubzplLmlkLG1vZGU6ZS5tb2RlLG5saW5rOjEsdWlkOjAsZ2lkOjAscmRldjowLHNpemU6ZS5zaXplLGF0aW1lOm5ldyBEYXRlKGUudGltZXN0YW1wKSxtdGltZTpuZXcgRGF0ZShlLnRpbWVzdGFtcCksY3RpbWU6bmV3IERhdGUoZS50aW1lc3RhbXApLGJsa3NpemU6NDA5NixibG9ja3M6TWF0aC5jZWlsKGUuc2l6ZS80MDk2KX19LHNldGF0dHIoZSxyKXtyLm1vZGUhPT12b2lkIDAmJihlLm1vZGU9ci5tb2RlKSxyLnRpbWVzdGFtcCE9PXZvaWQgMCYmKGUudGltZXN0YW1wPXIudGltZXN0YW1wKX0sbG9va3VwKGUscil7dGhyb3cgbmV3IG8uRXJybm9FcnJvcig0NCl9LG1rbm9kKGUscix0LG4pe3Rocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpfSxyZW5hbWUoZSxyLHQpe3Rocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpfSx1bmxpbmsoZSxyKXt0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKX0scm1kaXIoZSxyKXt0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKX0scmVhZGRpcihlKXt2YXIgcj1bIi4iLCIuLiJdO2Zvcih2YXIgdCBvZiBPYmplY3Qua2V5cyhlLmNvbnRlbnRzKSlyLnB1c2godCk7cmV0dXJuIHJ9LHN5bWxpbmsoZSxyLHQpe3Rocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpfX0sc3RyZWFtX29wczp7cmVhZChlLHIsdCxuLGEpe2lmKGE+PWUubm9kZS5zaXplKXJldHVybiAwO3ZhciBpPWUubm9kZS5jb250ZW50cy5zbGljZShhLGErbikscz1WLnJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihpKTtyZXR1cm4gci5zZXQobmV3IFVpbnQ4QXJyYXkocyksdCksaS5zaXplfSx3cml0ZShlLHIsdCxuLGEpe3Rocm93IG5ldyBvLkVycm5vRXJyb3IoMjkpfSxsbHNlZWsoZSxyLHQpe3ZhciBuPXI7aWYodD09PTE/bis9ZS5wb3NpdGlvbjp0PT09MiYmby5pc0ZpbGUoZS5ub2RlLm1vZGUpJiYobis9ZS5ub2RlLnNpemUpLG48MCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtyZXR1cm4gbn19fSxvPXtyb290Om51bGwsbW91bnRzOltdLGRldmljZXM6e30sc3RyZWFtczpbXSxuZXh0SW5vZGU6MSxuYW1lVGFibGU6bnVsbCxjdXJyZW50UGF0aDoiLyIsaW5pdGlhbGl6ZWQ6ITEsaWdub3JlUGVybWlzc2lvbnM6ITAsRXJybm9FcnJvcjpjbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLm5hbWU9IkVycm5vRXJyb3IiLHRoaXMuZXJybm89ZX19LGdlbmVyaWNFcnJvcnM6e30sZmlsZXN5c3RlbXM6bnVsbCxzeW5jRlNSZXF1ZXN0czowLEZTU3RyZWFtOmNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5zaGFyZWQ9e319Z2V0IG9iamVjdCgpe3JldHVybiB0aGlzLm5vZGV9c2V0IG9iamVjdChlKXt0aGlzLm5vZGU9ZX1nZXQgaXNSZWFkKCl7cmV0dXJuKHRoaXMuZmxhZ3MmMjA5NzE1NSkhPT0xfWdldCBpc1dyaXRlKCl7cmV0dXJuKHRoaXMuZmxhZ3MmMjA5NzE1NSkhPT0wfWdldCBpc0FwcGVuZCgpe3JldHVybiB0aGlzLmZsYWdzJjEwMjR9Z2V0IGZsYWdzKCl7cmV0dXJuIHRoaXMuc2hhcmVkLmZsYWdzfXNldCBmbGFncyhlKXt0aGlzLnNoYXJlZC5mbGFncz1lfWdldCBwb3NpdGlvbigpe3JldHVybiB0aGlzLnNoYXJlZC5wb3NpdGlvbn1zZXQgcG9zaXRpb24oZSl7dGhpcy5zaGFyZWQucG9zaXRpb249ZX19LEZTTm9kZTpjbGFzc3tjb25zdHJ1Y3RvcihlLHIsdCxuKXtlfHwoZT10aGlzKSx0aGlzLnBhcmVudD1lLHRoaXMubW91bnQ9ZS5tb3VudCx0aGlzLm1vdW50ZWQ9bnVsbCx0aGlzLmlkPW8ubmV4dElub2RlKyssdGhpcy5uYW1lPXIsdGhpcy5tb2RlPXQsdGhpcy5ub2RlX29wcz17fSx0aGlzLnN0cmVhbV9vcHM9e30sdGhpcy5yZGV2PW4sdGhpcy5yZWFkTW9kZT0zNjUsdGhpcy53cml0ZU1vZGU9MTQ2fWdldCByZWFkKCl7cmV0dXJuKHRoaXMubW9kZSZ0aGlzLnJlYWRNb2RlKT09PXRoaXMucmVhZE1vZGV9c2V0IHJlYWQoZSl7ZT90aGlzLm1vZGV8PXRoaXMucmVhZE1vZGU6dGhpcy5tb2RlJj1+dGhpcy5yZWFkTW9kZX1nZXQgd3JpdGUoKXtyZXR1cm4odGhpcy5tb2RlJnRoaXMud3JpdGVNb2RlKT09PXRoaXMud3JpdGVNb2RlfXNldCB3cml0ZShlKXtlP3RoaXMubW9kZXw9dGhpcy53cml0ZU1vZGU6dGhpcy5tb2RlJj1+dGhpcy53cml0ZU1vZGV9Z2V0IGlzRm9sZGVyKCl7cmV0dXJuIG8uaXNEaXIodGhpcy5tb2RlKX1nZXQgaXNEZXZpY2UoKXtyZXR1cm4gby5pc0NocmRldih0aGlzLm1vZGUpfX0sbG9va3VwUGF0aChlLHI9e30pe2lmKGU9WC5yZXNvbHZlKGUpLCFlKXJldHVybntwYXRoOiIiLG5vZGU6bnVsbH07dmFyIHQ9e2ZvbGxvd19tb3VudDohMCxyZWN1cnNlX2NvdW50OjB9O2lmKHI9T2JqZWN0LmFzc2lnbih0LHIpLHIucmVjdXJzZV9jb3VudD44KXRocm93IG5ldyBvLkVycm5vRXJyb3IoMzIpO2Zvcih2YXIgbj1lLnNwbGl0KCIvIikuZmlsdGVyKG09PiEhbSksYT1vLnJvb3QsaT0iLyIscz0wO3M8bi5sZW5ndGg7cysrKXt2YXIgbD1zPT09bi5sZW5ndGgtMTtpZihsJiZyLnBhcmVudClicmVhaztpZihhPW8ubG9va3VwTm9kZShhLG5bc10pLGk9Uy5qb2luMihpLG5bc10pLG8uaXNNb3VudHBvaW50KGEpJiYoIWx8fGwmJnIuZm9sbG93X21vdW50KSYmKGE9YS5tb3VudGVkLnJvb3QpLCFsfHxyLmZvbGxvdylmb3IodmFyIHU9MDtvLmlzTGluayhhLm1vZGUpOyl7dmFyIGM9by5yZWFkbGluayhpKTtpPVgucmVzb2x2ZShTLmRpcm5hbWUoaSksYyk7dmFyIGQ9by5sb29rdXBQYXRoKGkse3JlY3Vyc2VfY291bnQ6ci5yZWN1cnNlX2NvdW50KzF9KTtpZihhPWQubm9kZSx1Kys+NDApdGhyb3cgbmV3IG8uRXJybm9FcnJvcigzMil9fXJldHVybntwYXRoOmksbm9kZTphfX0sZ2V0UGF0aChlKXtmb3IodmFyIHI7Oyl7aWYoby5pc1Jvb3QoZSkpe3ZhciB0PWUubW91bnQubW91bnRwb2ludDtyZXR1cm4gcj90W3QubGVuZ3RoLTFdIT09Ii8iP2Ake3R9LyR7cn1gOnQrcjp0fXI9cj9gJHtlLm5hbWV9LyR7cn1gOmUubmFtZSxlPWUucGFyZW50fX0saGFzaE5hbWUoZSxyKXtmb3IodmFyIHQ9MCxuPTA7bjxyLmxlbmd0aDtuKyspdD0odDw8NSktdCtyLmNoYXJDb2RlQXQobil8MDtyZXR1cm4oZSt0Pj4+MCklby5uYW1lVGFibGUubGVuZ3RofSxoYXNoQWRkTm9kZShlKXt2YXIgcj1vLmhhc2hOYW1lKGUucGFyZW50LmlkLGUubmFtZSk7ZS5uYW1lX25leHQ9by5uYW1lVGFibGVbcl0sby5uYW1lVGFibGVbcl09ZX0saGFzaFJlbW92ZU5vZGUoZSl7dmFyIHI9by5oYXNoTmFtZShlLnBhcmVudC5pZCxlLm5hbWUpO2lmKG8ubmFtZVRhYmxlW3JdPT09ZSlvLm5hbWVUYWJsZVtyXT1lLm5hbWVfbmV4dDtlbHNlIGZvcih2YXIgdD1vLm5hbWVUYWJsZVtyXTt0Oyl7aWYodC5uYW1lX25leHQ9PT1lKXt0Lm5hbWVfbmV4dD1lLm5hbWVfbmV4dDticmVha310PXQubmFtZV9uZXh0fX0sbG9va3VwTm9kZShlLHIpe3ZhciB0PW8ubWF5TG9va3VwKGUpO2lmKHQpdGhyb3cgbmV3IG8uRXJybm9FcnJvcih0KTtmb3IodmFyIG49by5oYXNoTmFtZShlLmlkLHIpLGE9by5uYW1lVGFibGVbbl07YTthPWEubmFtZV9uZXh0KXt2YXIgaT1hLm5hbWU7aWYoYS5wYXJlbnQuaWQ9PT1lLmlkJiZpPT09cilyZXR1cm4gYX1yZXR1cm4gby5sb29rdXAoZSxyKX0sY3JlYXRlTm9kZShlLHIsdCxuKXt2YXIgYT1uZXcgby5GU05vZGUoZSxyLHQsbik7cmV0dXJuIG8uaGFzaEFkZE5vZGUoYSksYX0sZGVzdHJveU5vZGUoZSl7by5oYXNoUmVtb3ZlTm9kZShlKX0saXNSb290KGUpe3JldHVybiBlPT09ZS5wYXJlbnR9LGlzTW91bnRwb2ludChlKXtyZXR1cm4hIWUubW91bnRlZH0saXNGaWxlKGUpe3JldHVybihlJjYxNDQwKT09PTMyNzY4fSxpc0RpcihlKXtyZXR1cm4oZSY2MTQ0MCk9PT0xNjM4NH0saXNMaW5rKGUpe3JldHVybihlJjYxNDQwKT09PTQwOTYwfSxpc0NocmRldihlKXtyZXR1cm4oZSY2MTQ0MCk9PT04MTkyfSxpc0Jsa2RldihlKXtyZXR1cm4oZSY2MTQ0MCk9PT0yNDU3Nn0saXNGSUZPKGUpe3JldHVybihlJjYxNDQwKT09PTQwOTZ9LGlzU29ja2V0KGUpe3JldHVybihlJjQ5MTUyKT09PTQ5MTUyfSxmbGFnc1RvUGVybWlzc2lvblN0cmluZyhlKXt2YXIgcj1bInIiLCJ3IiwicnciXVtlJjNdO3JldHVybiBlJjUxMiYmKHIrPSJ3Iikscn0sbm9kZVBlcm1pc3Npb25zKGUscil7cmV0dXJuIG8uaWdub3JlUGVybWlzc2lvbnM/MDpyLmluY2x1ZGVzKCJyIikmJiEoZS5tb2RlJjI5Mil8fHIuaW5jbHVkZXMoInciKSYmIShlLm1vZGUmMTQ2KXx8ci5pbmNsdWRlcygieCIpJiYhKGUubW9kZSY3Myk/MjowfSxtYXlMb29rdXAoZSl7aWYoIW8uaXNEaXIoZS5tb2RlKSlyZXR1cm4gNTQ7dmFyIHI9by5ub2RlUGVybWlzc2lvbnMoZSwieCIpO3JldHVybiByfHwoZS5ub2RlX29wcy5sb29rdXA/MDoyKX0sbWF5Q3JlYXRlKGUscil7dHJ5e3ZhciB0PW8ubG9va3VwTm9kZShlLHIpO3JldHVybiAyMH1jYXRjaHt9cmV0dXJuIG8ubm9kZVBlcm1pc3Npb25zKGUsInd4Iil9LG1heURlbGV0ZShlLHIsdCl7dmFyIG47dHJ5e249by5sb29rdXBOb2RlKGUscil9Y2F0Y2goaSl7cmV0dXJuIGkuZXJybm99dmFyIGE9by5ub2RlUGVybWlzc2lvbnMoZSwid3giKTtpZihhKXJldHVybiBhO2lmKHQpe2lmKCFvLmlzRGlyKG4ubW9kZSkpcmV0dXJuIDU0O2lmKG8uaXNSb290KG4pfHxvLmdldFBhdGgobik9PT1vLmN3ZCgpKXJldHVybiAxMH1lbHNlIGlmKG8uaXNEaXIobi5tb2RlKSlyZXR1cm4gMzE7cmV0dXJuIDB9LG1heU9wZW4oZSxyKXtyZXR1cm4gZT9vLmlzTGluayhlLm1vZGUpPzMyOm8uaXNEaXIoZS5tb2RlKSYmKG8uZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmcocikhPT0iciJ8fHImNTEyKT8zMTpvLm5vZGVQZXJtaXNzaW9ucyhlLG8uZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmcocikpOjQ0fSxNQVhfT1BFTl9GRFM6NDA5NixuZXh0ZmQoKXtmb3IodmFyIGU9MDtlPD1vLk1BWF9PUEVOX0ZEUztlKyspaWYoIW8uc3RyZWFtc1tlXSlyZXR1cm4gZTt0aHJvdyBuZXcgby5FcnJub0Vycm9yKDMzKX0sZ2V0U3RyZWFtQ2hlY2tlZChlKXt2YXIgcj1vLmdldFN0cmVhbShlKTtpZighcil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDgpO3JldHVybiByfSxnZXRTdHJlYW06ZT0+by5zdHJlYW1zW2VdLGNyZWF0ZVN0cmVhbShlLHI9LTEpe3JldHVybiBlPU9iamVjdC5hc3NpZ24obmV3IG8uRlNTdHJlYW0sZSkscj09LTEmJihyPW8ubmV4dGZkKCkpLGUuZmQ9cixvLnN0cmVhbXNbcl09ZSxlfSxjbG9zZVN0cmVhbShlKXtvLnN0cmVhbXNbZV09bnVsbH0sZHVwU3RyZWFtKGUscj0tMSl7dmFyIG4sYTt2YXIgdD1vLmNyZWF0ZVN0cmVhbShlLHIpO3JldHVybihhPShuPXQuc3RyZWFtX29wcyk9PW51bGw/dm9pZCAwOm4uZHVwKT09bnVsbHx8YS5jYWxsKG4sdCksdH0sY2hyZGV2X3N0cmVhbV9vcHM6e29wZW4oZSl7dmFyIHQsbjt2YXIgcj1vLmdldERldmljZShlLm5vZGUucmRldik7ZS5zdHJlYW1fb3BzPXIuc3RyZWFtX29wcywobj0odD1lLnN0cmVhbV9vcHMpLm9wZW4pPT1udWxsfHxuLmNhbGwodCxlKX0sbGxzZWVrKCl7dGhyb3cgbmV3IG8uRXJybm9FcnJvcig3MCl9fSxtYWpvcjplPT5lPj44LG1pbm9yOmU9PmUmMjU1LG1ha2VkZXY6KGUscik9PmU8PDh8cixyZWdpc3RlckRldmljZShlLHIpe28uZGV2aWNlc1tlXT17c3RyZWFtX29wczpyfX0sZ2V0RGV2aWNlOmU9Pm8uZGV2aWNlc1tlXSxnZXRNb3VudHMoZSl7Zm9yKHZhciByPVtdLHQ9W2VdO3QubGVuZ3RoOyl7dmFyIG49dC5wb3AoKTtyLnB1c2gobiksdC5wdXNoKC4uLm4ubW91bnRzKX1yZXR1cm4gcn0sc3luY2ZzKGUscil7dHlwZW9mIGU9PSJmdW5jdGlvbiImJihyPWUsZT0hMSksby5zeW5jRlNSZXF1ZXN0cysrLG8uc3luY0ZTUmVxdWVzdHM+MSYmZWUoYHdhcm5pbmc6ICR7by5zeW5jRlNSZXF1ZXN0c30gRlMuc3luY2ZzIG9wZXJhdGlvbnMgaW4gZmxpZ2h0IGF0IG9uY2UsIHByb2JhYmx5IGp1c3QgZG9pbmcgZXh0cmEgd29ya2ApO3ZhciB0PW8uZ2V0TW91bnRzKG8ucm9vdC5tb3VudCksbj0wO2Z1bmN0aW9uIGEocyl7cmV0dXJuIG8uc3luY0ZTUmVxdWVzdHMtLSxyKHMpfWZ1bmN0aW9uIGkocyl7aWYocylyZXR1cm4gaS5lcnJvcmVkP3ZvaWQgMDooaS5lcnJvcmVkPSEwLGEocykpOysrbj49dC5sZW5ndGgmJmEobnVsbCl9dC5mb3JFYWNoKHM9PntpZighcy50eXBlLnN5bmNmcylyZXR1cm4gaShudWxsKTtzLnR5cGUuc3luY2ZzKHMsZSxpKX0pfSxtb3VudChlLHIsdCl7dmFyIG49dD09PSIvIixhPSF0LGk7aWYobiYmby5yb290KXRocm93IG5ldyBvLkVycm5vRXJyb3IoMTApO2lmKCFuJiYhYSl7dmFyIHM9by5sb29rdXBQYXRoKHQse2ZvbGxvd19tb3VudDohMX0pO2lmKHQ9cy5wYXRoLGk9cy5ub2RlLG8uaXNNb3VudHBvaW50KGkpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMTApO2lmKCFvLmlzRGlyKGkubW9kZSkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig1NCl9dmFyIGw9e3R5cGU6ZSxvcHRzOnIsbW91bnRwb2ludDp0LG1vdW50czpbXX0sdT1lLm1vdW50KGwpO3JldHVybiB1Lm1vdW50PWwsbC5yb290PXUsbj9vLnJvb3Q9dTppJiYoaS5tb3VudGVkPWwsaS5tb3VudCYmaS5tb3VudC5tb3VudHMucHVzaChsKSksdX0sdW5tb3VudChlKXt2YXIgcj1vLmxvb2t1cFBhdGgoZSx7Zm9sbG93X21vdW50OiExfSk7aWYoIW8uaXNNb3VudHBvaW50KHIubm9kZSkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOCk7dmFyIHQ9ci5ub2RlLG49dC5tb3VudGVkLGE9by5nZXRNb3VudHMobik7T2JqZWN0LmtleXMoby5uYW1lVGFibGUpLmZvckVhY2gocz0+e2Zvcih2YXIgbD1vLm5hbWVUYWJsZVtzXTtsOyl7dmFyIHU9bC5uYW1lX25leHQ7YS5pbmNsdWRlcyhsLm1vdW50KSYmby5kZXN0cm95Tm9kZShsKSxsPXV9fSksdC5tb3VudGVkPW51bGw7dmFyIGk9dC5tb3VudC5tb3VudHMuaW5kZXhPZihuKTt0Lm1vdW50Lm1vdW50cy5zcGxpY2UoaSwxKX0sbG9va3VwKGUscil7cmV0dXJuIGUubm9kZV9vcHMubG9va3VwKGUscil9LG1rbm9kKGUscix0KXt2YXIgbj1vLmxvb2t1cFBhdGgoZSx7cGFyZW50OiEwfSksYT1uLm5vZGUsaT1TLmJhc2VuYW1lKGUpO2lmKCFpfHxpPT09Ii4ifHxpPT09Ii4uIil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTt2YXIgcz1vLm1heUNyZWF0ZShhLGkpO2lmKHMpdGhyb3cgbmV3IG8uRXJybm9FcnJvcihzKTtpZighYS5ub2RlX29wcy5ta25vZCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtyZXR1cm4gYS5ub2RlX29wcy5ta25vZChhLGkscix0KX0sY3JlYXRlKGUscil7cmV0dXJuIHI9ciE9PXZvaWQgMD9yOjQzOCxyJj00MDk1LHJ8PTMyNzY4LG8ubWtub2QoZSxyLDApfSxta2RpcihlLHIpe3JldHVybiByPXIhPT12b2lkIDA/cjo1MTEsciY9MTAyMyxyfD0xNjM4NCxvLm1rbm9kKGUsciwwKX0sbWtkaXJUcmVlKGUscil7Zm9yKHZhciB0PWUuc3BsaXQoIi8iKSxuPSIiLGE9MDthPHQubGVuZ3RoOysrYSlpZih0W2FdKXtuKz0iLyIrdFthXTt0cnl7by5ta2RpcihuLHIpfWNhdGNoKGkpe2lmKGkuZXJybm8hPTIwKXRocm93IGl9fX0sbWtkZXYoZSxyLHQpe3JldHVybiB0eXBlb2YgdD4idSImJih0PXIscj00MzgpLHJ8PTgxOTIsby5ta25vZChlLHIsdCl9LHN5bWxpbmsoZSxyKXtpZighWC5yZXNvbHZlKGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDQpO3ZhciB0PW8ubG9va3VwUGF0aChyLHtwYXJlbnQ6ITB9KSxuPXQubm9kZTtpZighbil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ0KTt2YXIgYT1TLmJhc2VuYW1lKHIpLGk9by5tYXlDcmVhdGUobixhKTtpZihpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoaSk7aWYoIW4ubm9kZV9vcHMuc3ltbGluayl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtyZXR1cm4gbi5ub2RlX29wcy5zeW1saW5rKG4sYSxlKX0scmVuYW1lKGUscil7dmFyIHQ9Uy5kaXJuYW1lKGUpLG49Uy5kaXJuYW1lKHIpLGE9Uy5iYXNlbmFtZShlKSxpPVMuYmFzZW5hbWUocikscyxsLHU7aWYocz1vLmxvb2t1cFBhdGgoZSx7cGFyZW50OiEwfSksbD1zLm5vZGUscz1vLmxvb2t1cFBhdGgocix7cGFyZW50OiEwfSksdT1zLm5vZGUsIWx8fCF1KXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDQpO2lmKGwubW91bnQhPT11Lm1vdW50KXRocm93IG5ldyBvLkVycm5vRXJyb3IoNzUpO3ZhciBjPW8ubG9va3VwTm9kZShsLGEpLGQ9WC5yZWxhdGl2ZShlLG4pO2lmKGQuY2hhckF0KDApIT09Ii4iKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMjgpO2lmKGQ9WC5yZWxhdGl2ZShyLHQpLGQuY2hhckF0KDApIT09Ii4iKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNTUpO3ZhciBtO3RyeXttPW8ubG9va3VwTm9kZSh1LGkpfWNhdGNoe31pZihjIT09bSl7dmFyIGg9by5pc0RpcihjLm1vZGUpLHA9by5tYXlEZWxldGUobCxhLGgpO2lmKHApdGhyb3cgbmV3IG8uRXJybm9FcnJvcihwKTtpZihwPW0/by5tYXlEZWxldGUodSxpLGgpOm8ubWF5Q3JlYXRlKHUsaSkscCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKHApO2lmKCFsLm5vZGVfb3BzLnJlbmFtZSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtpZihvLmlzTW91bnRwb2ludChjKXx8bSYmby5pc01vdW50cG9pbnQobSkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcigxMCk7aWYodSE9PWwmJihwPW8ubm9kZVBlcm1pc3Npb25zKGwsInciKSxwKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKHApO28uaGFzaFJlbW92ZU5vZGUoYyk7dHJ5e2wubm9kZV9vcHMucmVuYW1lKGMsdSxpKX1jYXRjaCh3KXt0aHJvdyB3fWZpbmFsbHl7by5oYXNoQWRkTm9kZShjKX19fSxybWRpcihlKXt2YXIgcj1vLmxvb2t1cFBhdGgoZSx7cGFyZW50OiEwfSksdD1yLm5vZGUsbj1TLmJhc2VuYW1lKGUpLGE9by5sb29rdXBOb2RlKHQsbiksaT1vLm1heURlbGV0ZSh0LG4sITApO2lmKGkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcihpKTtpZighdC5ub2RlX29wcy5ybWRpcil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtpZihvLmlzTW91bnRwb2ludChhKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDEwKTt0Lm5vZGVfb3BzLnJtZGlyKHQsbiksby5kZXN0cm95Tm9kZShhKX0scmVhZGRpcihlKXt2YXIgcj1vLmxvb2t1cFBhdGgoZSx7Zm9sbG93OiEwfSksdD1yLm5vZGU7aWYoIXQubm9kZV9vcHMucmVhZGRpcil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDU0KTtyZXR1cm4gdC5ub2RlX29wcy5yZWFkZGlyKHQpfSx1bmxpbmsoZSl7dmFyIHI9by5sb29rdXBQYXRoKGUse3BhcmVudDohMH0pLHQ9ci5ub2RlO2lmKCF0KXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDQpO3ZhciBuPVMuYmFzZW5hbWUoZSksYT1vLmxvb2t1cE5vZGUodCxuKSxpPW8ubWF5RGVsZXRlKHQsbiwhMSk7aWYoaSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKGkpO2lmKCF0Lm5vZGVfb3BzLnVubGluayl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtpZihvLmlzTW91bnRwb2ludChhKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDEwKTt0Lm5vZGVfb3BzLnVubGluayh0LG4pLG8uZGVzdHJveU5vZGUoYSl9LHJlYWRsaW5rKGUpe3ZhciByPW8ubG9va3VwUGF0aChlKSx0PXIubm9kZTtpZighdCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ0KTtpZighdC5ub2RlX29wcy5yZWFkbGluayl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtyZXR1cm4gWC5yZXNvbHZlKG8uZ2V0UGF0aCh0LnBhcmVudCksdC5ub2RlX29wcy5yZWFkbGluayh0KSl9LHN0YXQoZSxyKXt2YXIgdD1vLmxvb2t1cFBhdGgoZSx7Zm9sbG93OiFyfSksbj10Lm5vZGU7aWYoIW4pdGhyb3cgbmV3IG8uRXJybm9FcnJvcig0NCk7aWYoIW4ubm9kZV9vcHMuZ2V0YXR0cil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtyZXR1cm4gbi5ub2RlX29wcy5nZXRhdHRyKG4pfSxsc3RhdChlKXtyZXR1cm4gby5zdGF0KGUsITApfSxjaG1vZChlLHIsdCl7dmFyIG47aWYodHlwZW9mIGU9PSJzdHJpbmciKXt2YXIgYT1vLmxvb2t1cFBhdGgoZSx7Zm9sbG93OiF0fSk7bj1hLm5vZGV9ZWxzZSBuPWU7aWYoIW4ubm9kZV9vcHMuc2V0YXR0cil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtuLm5vZGVfb3BzLnNldGF0dHIobix7bW9kZTpyJjQwOTV8bi5tb2RlJi00MDk2LHRpbWVzdGFtcDpEYXRlLm5vdygpfSl9LGxjaG1vZChlLHIpe28uY2htb2QoZSxyLCEwKX0sZmNobW9kKGUscil7dmFyIHQ9by5nZXRTdHJlYW1DaGVja2VkKGUpO28uY2htb2QodC5ub2RlLHIpfSxjaG93bihlLHIsdCxuKXt2YXIgYTtpZih0eXBlb2YgZT09InN0cmluZyIpe3ZhciBpPW8ubG9va3VwUGF0aChlLHtmb2xsb3c6IW59KTthPWkubm9kZX1lbHNlIGE9ZTtpZighYS5ub2RlX29wcy5zZXRhdHRyKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpO2Eubm9kZV9vcHMuc2V0YXR0cihhLHt0aW1lc3RhbXA6RGF0ZS5ub3coKX0pfSxsY2hvd24oZSxyLHQpe28uY2hvd24oZSxyLHQsITApfSxmY2hvd24oZSxyLHQpe3ZhciBuPW8uZ2V0U3RyZWFtQ2hlY2tlZChlKTtvLmNob3duKG4ubm9kZSxyLHQpfSx0cnVuY2F0ZShlLHIpe2lmKHI8MCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTt2YXIgdDtpZih0eXBlb2YgZT09InN0cmluZyIpe3ZhciBuPW8ubG9va3VwUGF0aChlLHtmb2xsb3c6ITB9KTt0PW4ubm9kZX1lbHNlIHQ9ZTtpZighdC5ub2RlX29wcy5zZXRhdHRyKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpO2lmKG8uaXNEaXIodC5tb2RlKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDMxKTtpZighby5pc0ZpbGUodC5tb2RlKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTt2YXIgYT1vLm5vZGVQZXJtaXNzaW9ucyh0LCJ3Iik7aWYoYSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKGEpO3Qubm9kZV9vcHMuc2V0YXR0cih0LHtzaXplOnIsdGltZXN0YW1wOkRhdGUubm93KCl9KX0sZnRydW5jYXRlKGUscil7dmFyIHQ9by5nZXRTdHJlYW1DaGVja2VkKGUpO2lmKCEodC5mbGFncyYyMDk3MTU1KSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtvLnRydW5jYXRlKHQubm9kZSxyKX0sdXRpbWUoZSxyLHQpe3ZhciBuPW8ubG9va3VwUGF0aChlLHtmb2xsb3c6ITB9KSxhPW4ubm9kZTthLm5vZGVfb3BzLnNldGF0dHIoYSx7dGltZXN0YW1wOk1hdGgubWF4KHIsdCl9KX0sb3BlbihlLHIsdCl7aWYoZT09PSIiKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDQpO3I9dHlwZW9mIHI9PSJzdHJpbmciP1V0KHIpOnIsciY2ND8odD10eXBlb2YgdD4idSI/NDM4OnQsdD10JjQwOTV8MzI3NjgpOnQ9MDt2YXIgbjtpZih0eXBlb2YgZT09Im9iamVjdCIpbj1lO2Vsc2V7ZT1TLm5vcm1hbGl6ZShlKTt0cnl7dmFyIGE9by5sb29rdXBQYXRoKGUse2ZvbGxvdzohKHImMTMxMDcyKX0pO249YS5ub2RlfWNhdGNoe319dmFyIGk9ITE7aWYociY2NClpZihuKXtpZihyJjEyOCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDIwKX1lbHNlIG49by5ta25vZChlLHQsMCksaT0hMDtpZighbil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ0KTtpZihvLmlzQ2hyZGV2KG4ubW9kZSkmJihyJj0tNTEzKSxyJjY1NTM2JiYhby5pc0RpcihuLm1vZGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNTQpO2lmKCFpKXt2YXIgcz1vLm1heU9wZW4obixyKTtpZihzKXRocm93IG5ldyBvLkVycm5vRXJyb3Iocyl9ciY1MTImJiFpJiZvLnRydW5jYXRlKG4sMCksciY9LTEzMTcxMzt2YXIgbD1vLmNyZWF0ZVN0cmVhbSh7bm9kZTpuLHBhdGg6by5nZXRQYXRoKG4pLGZsYWdzOnIsc2Vla2FibGU6ITAscG9zaXRpb246MCxzdHJlYW1fb3BzOm4uc3RyZWFtX29wcyx1bmdvdHRlbjpbXSxlcnJvcjohMX0pO3JldHVybiBsLnN0cmVhbV9vcHMub3BlbiYmbC5zdHJlYW1fb3BzLm9wZW4obCksZi5sb2dSZWFkRmlsZXMmJiEociYxKSYmKG8ucmVhZEZpbGVzfHwoby5yZWFkRmlsZXM9e30pLGUgaW4gby5yZWFkRmlsZXN8fChvLnJlYWRGaWxlc1tlXT0xKSksbH0sY2xvc2UoZSl7aWYoby5pc0Nsb3NlZChlKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDgpO2UuZ2V0ZGVudHMmJihlLmdldGRlbnRzPW51bGwpO3RyeXtlLnN0cmVhbV9vcHMuY2xvc2UmJmUuc3RyZWFtX29wcy5jbG9zZShlKX1jYXRjaChyKXt0aHJvdyByfWZpbmFsbHl7by5jbG9zZVN0cmVhbShlLmZkKX1lLmZkPW51bGx9LGlzQ2xvc2VkKGUpe3JldHVybiBlLmZkPT09bnVsbH0sbGxzZWVrKGUscix0KXtpZihvLmlzQ2xvc2VkKGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoOCk7aWYoIWUuc2Vla2FibGV8fCFlLnN0cmVhbV9vcHMubGxzZWVrKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNzApO2lmKHQhPTAmJnQhPTEmJnQhPTIpdGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOCk7cmV0dXJuIGUucG9zaXRpb249ZS5zdHJlYW1fb3BzLmxsc2VlayhlLHIsdCksZS51bmdvdHRlbj1bXSxlLnBvc2l0aW9ufSxyZWFkKGUscix0LG4sYSl7aWYobjwwfHxhPDApdGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOCk7aWYoby5pc0Nsb3NlZChlKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDgpO2lmKChlLmZsYWdzJjIwOTcxNTUpPT09MSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDgpO2lmKG8uaXNEaXIoZS5ub2RlLm1vZGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMzEpO2lmKCFlLnN0cmVhbV9vcHMucmVhZCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTt2YXIgaT10eXBlb2YgYTwidSI7aWYoIWkpYT1lLnBvc2l0aW9uO2Vsc2UgaWYoIWUuc2Vla2FibGUpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig3MCk7dmFyIHM9ZS5zdHJlYW1fb3BzLnJlYWQoZSxyLHQsbixhKTtyZXR1cm4gaXx8KGUucG9zaXRpb24rPXMpLHN9LHdyaXRlKGUscix0LG4sYSxpKXtpZihuPDB8fGE8MCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtpZihvLmlzQ2xvc2VkKGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoOCk7aWYoIShlLmZsYWdzJjIwOTcxNTUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoOCk7aWYoby5pc0RpcihlLm5vZGUubW9kZSkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcigzMSk7aWYoIWUuc3RyZWFtX29wcy53cml0ZSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtlLnNlZWthYmxlJiZlLmZsYWdzJjEwMjQmJm8ubGxzZWVrKGUsMCwyKTt2YXIgcz10eXBlb2YgYTwidSI7aWYoIXMpYT1lLnBvc2l0aW9uO2Vsc2UgaWYoIWUuc2Vla2FibGUpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig3MCk7dmFyIGw9ZS5zdHJlYW1fb3BzLndyaXRlKGUscix0LG4sYSxpKTtyZXR1cm4gc3x8KGUucG9zaXRpb24rPWwpLGx9LGFsbG9jYXRlKGUscix0KXtpZihvLmlzQ2xvc2VkKGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoOCk7aWYocjwwfHx0PD0wKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMjgpO2lmKCEoZS5mbGFncyYyMDk3MTU1KSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDgpO2lmKCFvLmlzRmlsZShlLm5vZGUubW9kZSkmJiFvLmlzRGlyKGUubm9kZS5tb2RlKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQzKTtpZighZS5zdHJlYW1fb3BzLmFsbG9jYXRlKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMTM4KTtlLnN0cmVhbV9vcHMuYWxsb2NhdGUoZSxyLHQpfSxtbWFwKGUscix0LG4sYSl7aWYobiYyJiYhKGEmMikmJihlLmZsYWdzJjIwOTcxNTUpIT09Mil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDIpO2lmKChlLmZsYWdzJjIwOTcxNTUpPT09MSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDIpO2lmKCFlLnN0cmVhbV9vcHMubW1hcCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQzKTtyZXR1cm4gZS5zdHJlYW1fb3BzLm1tYXAoZSxyLHQsbixhKX0sbXN5bmMoZSxyLHQsbixhKXtyZXR1cm4gZS5zdHJlYW1fb3BzLm1zeW5jP2Uuc3RyZWFtX29wcy5tc3luYyhlLHIsdCxuLGEpOjB9LGlvY3RsKGUscix0KXtpZighZS5zdHJlYW1fb3BzLmlvY3RsKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNTkpO3JldHVybiBlLnN0cmVhbV9vcHMuaW9jdGwoZSxyLHQpfSxyZWFkRmlsZShlLHI9e30pe2lmKHIuZmxhZ3M9ci5mbGFnc3x8MCxyLmVuY29kaW5nPXIuZW5jb2Rpbmd8fCJiaW5hcnkiLHIuZW5jb2RpbmchPT0idXRmOCImJnIuZW5jb2RpbmchPT0iYmluYXJ5Iil0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZW5jb2RpbmcgdHlwZSAiJHtyLmVuY29kaW5nfSJgKTt2YXIgdCxuPW8ub3BlbihlLHIuZmxhZ3MpLGE9by5zdGF0KGUpLGk9YS5zaXplLHM9bmV3IFVpbnQ4QXJyYXkoaSk7cmV0dXJuIG8ucmVhZChuLHMsMCxpLDApLHIuZW5jb2Rpbmc9PT0idXRmOCI/dD1jZShzLDApOnIuZW5jb2Rpbmc9PT0iYmluYXJ5IiYmKHQ9cyksby5jbG9zZShuKSx0fSx3cml0ZUZpbGUoZSxyLHQ9e30pe3QuZmxhZ3M9dC5mbGFnc3x8NTc3O3ZhciBuPW8ub3BlbihlLHQuZmxhZ3MsdC5tb2RlKTtpZih0eXBlb2Ygcj09InN0cmluZyIpe3ZhciBhPW5ldyBVaW50OEFycmF5KFplKHIpKzEpLGk9UWUocixhLDAsYS5sZW5ndGgpO28ud3JpdGUobixhLDAsaSx2b2lkIDAsdC5jYW5Pd24pfWVsc2UgaWYoQXJyYXlCdWZmZXIuaXNWaWV3KHIpKW8ud3JpdGUobixyLDAsci5ieXRlTGVuZ3RoLHZvaWQgMCx0LmNhbk93bik7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIGRhdGEgdHlwZSIpO28uY2xvc2Uobil9LGN3ZDooKT0+by5jdXJyZW50UGF0aCxjaGRpcihlKXt2YXIgcj1vLmxvb2t1cFBhdGgoZSx7Zm9sbG93OiEwfSk7aWYoci5ub2RlPT09bnVsbCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ0KTtpZighby5pc0RpcihyLm5vZGUubW9kZSkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig1NCk7dmFyIHQ9by5ub2RlUGVybWlzc2lvbnMoci5ub2RlLCJ4Iik7aWYodCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKHQpO28uY3VycmVudFBhdGg9ci5wYXRofSxjcmVhdGVEZWZhdWx0RGlyZWN0b3JpZXMoKXtvLm1rZGlyKCIvdG1wIiksby5ta2RpcigiL2hvbWUiKSxvLm1rZGlyKCIvaG9tZS93ZWJfdXNlciIpfSxjcmVhdGVEZWZhdWx0RGV2aWNlcygpe28ubWtkaXIoIi9kZXYiKSxvLnJlZ2lzdGVyRGV2aWNlKG8ubWFrZWRldigxLDMpLHtyZWFkOigpPT4wLHdyaXRlOihuLGEsaSxzLGwpPT5zfSksby5ta2RldigiL2Rldi9udWxsIixvLm1ha2VkZXYoMSwzKSksbGUucmVnaXN0ZXIoby5tYWtlZGV2KDUsMCksbGUuZGVmYXVsdF90dHlfb3BzKSxsZS5yZWdpc3RlcihvLm1ha2VkZXYoNiwwKSxsZS5kZWZhdWx0X3R0eTFfb3BzKSxvLm1rZGV2KCIvZGV2L3R0eSIsby5tYWtlZGV2KDUsMCkpLG8ubWtkZXYoIi9kZXYvdHR5MSIsby5tYWtlZGV2KDYsMCkpO3ZhciBlPW5ldyBVaW50OEFycmF5KDEwMjQpLHI9MCx0PSgpPT4ocj09PTAmJihyPUZyKGUpLmJ5dGVMZW5ndGgpLGVbLS1yXSk7by5jcmVhdGVEZXZpY2UoIi9kZXYiLCJyYW5kb20iLHQpLG8uY3JlYXRlRGV2aWNlKCIvZGV2IiwidXJhbmRvbSIsdCksby5ta2RpcigiL2Rldi9zaG0iKSxvLm1rZGlyKCIvZGV2L3NobS90bXAiKX0sY3JlYXRlU3BlY2lhbERpcmVjdG9yaWVzKCl7by5ta2RpcigiL3Byb2MiKTt2YXIgZT1vLm1rZGlyKCIvcHJvYy9zZWxmIik7by5ta2RpcigiL3Byb2Mvc2VsZi9mZCIpLG8ubW91bnQoe21vdW50KCl7dmFyIHI9by5jcmVhdGVOb2RlKGUsImZkIiwxNjg5NSw3Myk7cmV0dXJuIHIubm9kZV9vcHM9e2xvb2t1cCh0LG4pe3ZhciBhPStuLGk9by5nZXRTdHJlYW1DaGVja2VkKGEpLHM9e3BhcmVudDpudWxsLG1vdW50Onttb3VudHBvaW50OiJmYWtlIn0sbm9kZV9vcHM6e3JlYWRsaW5rOigpPT5pLnBhdGh9fTtyZXR1cm4gcy5wYXJlbnQ9cyxzfX0scn19LHt9LCIvcHJvYy9zZWxmL2ZkIil9LGNyZWF0ZVN0YW5kYXJkU3RyZWFtcygpe2Yuc3RkaW4/by5jcmVhdGVEZXZpY2UoIi9kZXYiLCJzdGRpbiIsZi5zdGRpbik6by5zeW1saW5rKCIvZGV2L3R0eSIsIi9kZXYvc3RkaW4iKSxmLnN0ZG91dD9vLmNyZWF0ZURldmljZSgiL2RldiIsInN0ZG91dCIsbnVsbCxmLnN0ZG91dCk6by5zeW1saW5rKCIvZGV2L3R0eSIsIi9kZXYvc3Rkb3V0IiksZi5zdGRlcnI/by5jcmVhdGVEZXZpY2UoIi9kZXYiLCJzdGRlcnIiLG51bGwsZi5zdGRlcnIpOm8uc3ltbGluaygiL2Rldi90dHkxIiwiL2Rldi9zdGRlcnIiKSxvLm9wZW4oIi9kZXYvc3RkaW4iLDApLG8ub3BlbigiL2Rldi9zdGRvdXQiLDEpLG8ub3BlbigiL2Rldi9zdGRlcnIiLDEpfSxzdGF0aWNJbml0KCl7WzQ0XS5mb3JFYWNoKGU9PntvLmdlbmVyaWNFcnJvcnNbZV09bmV3IG8uRXJybm9FcnJvcihlKSxvLmdlbmVyaWNFcnJvcnNbZV0uc3RhY2s9IjxnZW5lcmljIGVycm9yLCBubyBzdGFjaz4ifSksby5uYW1lVGFibGU9bmV3IEFycmF5KDQwOTYpLG8ubW91bnQoYix7fSwiLyIpLG8uY3JlYXRlRGVmYXVsdERpcmVjdG9yaWVzKCksby5jcmVhdGVEZWZhdWx0RGV2aWNlcygpLG8uY3JlYXRlU3BlY2lhbERpcmVjdG9yaWVzKCksby5maWxlc3lzdGVtcz17TUVNRlM6YixXT1JLRVJGUzpWfX0saW5pdChlLHIsdCl7by5pbml0LmluaXRpYWxpemVkPSEwLGYuc3RkaW49ZXx8Zi5zdGRpbixmLnN0ZG91dD1yfHxmLnN0ZG91dCxmLnN0ZGVycj10fHxmLnN0ZGVycixvLmNyZWF0ZVN0YW5kYXJkU3RyZWFtcygpfSxxdWl0KCl7by5pbml0LmluaXRpYWxpemVkPSExO2Zvcih2YXIgZT0wO2U8by5zdHJlYW1zLmxlbmd0aDtlKyspe3ZhciByPW8uc3RyZWFtc1tlXTtyJiZvLmNsb3NlKHIpfX0sZmluZE9iamVjdChlLHIpe3ZhciB0PW8uYW5hbHl6ZVBhdGgoZSxyKTtyZXR1cm4gdC5leGlzdHM/dC5vYmplY3Q6bnVsbH0sYW5hbHl6ZVBhdGgoZSxyKXt0cnl7dmFyIHQ9by5sb29rdXBQYXRoKGUse2ZvbGxvdzohcn0pO2U9dC5wYXRofWNhdGNoe312YXIgbj17aXNSb290OiExLGV4aXN0czohMSxlcnJvcjowLG5hbWU6bnVsbCxwYXRoOm51bGwsb2JqZWN0Om51bGwscGFyZW50RXhpc3RzOiExLHBhcmVudFBhdGg6bnVsbCxwYXJlbnRPYmplY3Q6bnVsbH07dHJ5e3ZhciB0PW8ubG9va3VwUGF0aChlLHtwYXJlbnQ6ITB9KTtuLnBhcmVudEV4aXN0cz0hMCxuLnBhcmVudFBhdGg9dC5wYXRoLG4ucGFyZW50T2JqZWN0PXQubm9kZSxuLm5hbWU9Uy5iYXNlbmFtZShlKSx0PW8ubG9va3VwUGF0aChlLHtmb2xsb3c6IXJ9KSxuLmV4aXN0cz0hMCxuLnBhdGg9dC5wYXRoLG4ub2JqZWN0PXQubm9kZSxuLm5hbWU9dC5ub2RlLm5hbWUsbi5pc1Jvb3Q9dC5wYXRoPT09Ii8ifWNhdGNoKGEpe24uZXJyb3I9YS5lcnJub31yZXR1cm4gbn0sY3JlYXRlUGF0aChlLHIsdCxuKXtlPXR5cGVvZiBlPT0ic3RyaW5nIj9lOm8uZ2V0UGF0aChlKTtmb3IodmFyIGE9ci5zcGxpdCgiLyIpLnJldmVyc2UoKTthLmxlbmd0aDspe3ZhciBpPWEucG9wKCk7aWYoaSl7dmFyIHM9Uy5qb2luMihlLGkpO3RyeXtvLm1rZGlyKHMpfWNhdGNoe31lPXN9fXJldHVybiBzfSxjcmVhdGVGaWxlKGUscix0LG4sYSl7dmFyIGk9Uy5qb2luMih0eXBlb2YgZT09InN0cmluZyI/ZTpvLmdldFBhdGgoZSkscikscz1lcihuLGEpO3JldHVybiBvLmNyZWF0ZShpLHMpfSxjcmVhdGVEYXRhRmlsZShlLHIsdCxuLGEsaSl7dmFyIHM9cjtlJiYoZT10eXBlb2YgZT09InN0cmluZyI/ZTpvLmdldFBhdGgoZSkscz1yP1Muam9pbjIoZSxyKTplKTt2YXIgbD1lcihuLGEpLHU9by5jcmVhdGUocyxsKTtpZih0KXtpZih0eXBlb2YgdD09InN0cmluZyIpe2Zvcih2YXIgYz1uZXcgQXJyYXkodC5sZW5ndGgpLGQ9MCxtPXQubGVuZ3RoO2Q8bTsrK2QpY1tkXT10LmNoYXJDb2RlQXQoZCk7dD1jfW8uY2htb2QodSxsfDE0Nik7dmFyIGg9by5vcGVuKHUsNTc3KTtvLndyaXRlKGgsdCwwLHQubGVuZ3RoLDAsaSksby5jbG9zZShoKSxvLmNobW9kKHUsbCl9fSxjcmVhdGVEZXZpY2UoZSxyLHQsbil7dmFyIGE9Uy5qb2luMih0eXBlb2YgZT09InN0cmluZyI/ZTpvLmdldFBhdGgoZSksciksaT1lcighIXQsISFuKTtvLmNyZWF0ZURldmljZS5tYWpvcnx8KG8uY3JlYXRlRGV2aWNlLm1ham9yPTY0KTt2YXIgcz1vLm1ha2VkZXYoby5jcmVhdGVEZXZpY2UubWFqb3IrKywwKTtyZXR1cm4gby5yZWdpc3RlckRldmljZShzLHtvcGVuKGwpe2wuc2Vla2FibGU9ITF9LGNsb3NlKGwpe3ZhciB1Oyh1PW49PW51bGw/dm9pZCAwOm4uYnVmZmVyKSE9bnVsbCYmdS5sZW5ndGgmJm4oMTApfSxyZWFkKGwsdSxjLGQsbSl7Zm9yKHZhciBoPTAscD0wO3A8ZDtwKyspe3ZhciB3O3RyeXt3PXQoKX1jYXRjaHt0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI5KX1pZih3PT09dm9pZCAwJiZoPT09MCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYpO2lmKHc9PW51bGwpYnJlYWs7aCsrLHVbYytwXT13fXJldHVybiBoJiYobC5ub2RlLnRpbWVzdGFtcD1EYXRlLm5vdygpKSxofSx3cml0ZShsLHUsYyxkLG0pe2Zvcih2YXIgaD0wO2g8ZDtoKyspdHJ5e24odVtjK2hdKX1jYXRjaHt0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI5KX1yZXR1cm4gZCYmKGwubm9kZS50aW1lc3RhbXA9RGF0ZS5ub3coKSksaH19KSxvLm1rZGV2KGEsaSxzKX0sZm9yY2VMb2FkRmlsZShlKXtpZihlLmlzRGV2aWNlfHxlLmlzRm9sZGVyfHxlLmxpbmt8fGUuY29udGVudHMpcmV0dXJuITA7aWYodHlwZW9mIFhNTEh0dHBSZXF1ZXN0PCJ1Iil0aHJvdyBuZXcgRXJyb3IoIkxhenkgbG9hZGluZyBzaG91bGQgaGF2ZSBiZWVuIHBlcmZvcm1lZCAoY29udGVudHMgc2V0KSBpbiBjcmVhdGVMYXp5RmlsZSwgYnV0IGl0IHdhcyBub3QuIExhenkgbG9hZGluZyBvbmx5IHdvcmtzIGluIHdlYiB3b3JrZXJzLiBVc2UgLS1lbWJlZC1maWxlIG9yIC0tcHJlbG9hZC1maWxlIGluIGVtY2Mgb24gdGhlIG1haW4gdGhyZWFkLiIpO2lmKFllKXRyeXtlLmNvbnRlbnRzPVNlKFllKGUudXJsKSwhMCksZS51c2VkQnl0ZXM9ZS5jb250ZW50cy5sZW5ndGh9Y2F0Y2h7dGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOSl9ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBsb2FkIHdpdGhvdXQgcmVhZCgpIG9yIFhNTEh0dHBSZXF1ZXN0LiIpfSxjcmVhdGVMYXp5RmlsZShlLHIsdCxuLGEpe2NsYXNzIGl7Y29uc3RydWN0b3IoKXt0aGlzLmxlbmd0aEtub3duPSExLHRoaXMuY2h1bmtzPVtdfWdldChwKXtpZighKHA+dGhpcy5sZW5ndGgtMXx8cDwwKSl7dmFyIHc9cCV0aGlzLmNodW5rU2l6ZSxEPXAvdGhpcy5jaHVua1NpemV8MDtyZXR1cm4gdGhpcy5nZXR0ZXIoRClbd119fXNldERhdGFHZXR0ZXIocCl7dGhpcy5nZXR0ZXI9cH1jYWNoZUxlbmd0aCgpe3ZhciBwPW5ldyBYTUxIdHRwUmVxdWVzdDtpZihwLm9wZW4oIkhFQUQiLHQsITEpLHAuc2VuZChudWxsKSwhKHAuc3RhdHVzPj0yMDAmJnAuc3RhdHVzPDMwMHx8cC5zdGF0dXM9PT0zMDQpKXRocm93IG5ldyBFcnJvcigiQ291bGRuJ3QgbG9hZCAiK3QrIi4gU3RhdHVzOiAiK3Auc3RhdHVzKTt2YXIgdz1OdW1iZXIocC5nZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1sZW5ndGgiKSksRCxNPShEPXAuZ2V0UmVzcG9uc2VIZWFkZXIoIkFjY2VwdC1SYW5nZXMiKSkmJkQ9PT0iYnl0ZXMiLEY9KEQ9cC5nZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1FbmNvZGluZyIpKSYmRD09PSJnemlwIix2PTEwMjQqMTAyNDtNfHwodj13KTt2YXIgXz0oVCxCKT0+e2lmKFQ+Qil0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgcmFuZ2UgKCIrVCsiLCAiK0IrIikgb3Igbm8gYnl0ZXMgcmVxdWVzdGVkISIpO2lmKEI+dy0xKXRocm93IG5ldyBFcnJvcigib25seSAiK3crIiBieXRlcyBhdmFpbGFibGUhIHByb2dyYW1tZXIgZXJyb3IhIik7dmFyIE89bmV3IFhNTEh0dHBSZXF1ZXN0O2lmKE8ub3BlbigiR0VUIix0LCExKSx3IT09diYmTy5zZXRSZXF1ZXN0SGVhZGVyKCJSYW5nZSIsImJ5dGVzPSIrVCsiLSIrQiksTy5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIixPLm92ZXJyaWRlTWltZVR5cGUmJk8ub3ZlcnJpZGVNaW1lVHlwZSgidGV4dC9wbGFpbjsgY2hhcnNldD14LXVzZXItZGVmaW5lZCIpLE8uc2VuZChudWxsKSwhKE8uc3RhdHVzPj0yMDAmJk8uc3RhdHVzPDMwMHx8Ty5zdGF0dXM9PT0zMDQpKXRocm93IG5ldyBFcnJvcigiQ291bGRuJ3QgbG9hZCAiK3QrIi4gU3RhdHVzOiAiK08uc3RhdHVzKTtyZXR1cm4gTy5yZXNwb25zZSE9PXZvaWQgMD9uZXcgVWludDhBcnJheShPLnJlc3BvbnNlfHxbXSk6U2UoTy5yZXNwb25zZVRleHR8fCIiLCEwKX0sTD10aGlzO0wuc2V0RGF0YUdldHRlcihUPT57dmFyIEI9VCp2LE89KFQrMSkqdi0xO2lmKE89TWF0aC5taW4oTyx3LTEpLHR5cGVvZiBMLmNodW5rc1tUXT4idSImJihMLmNodW5rc1tUXT1fKEIsTykpLHR5cGVvZiBMLmNodW5rc1tUXT4idSIpdGhyb3cgbmV3IEVycm9yKCJkb1hIUiBmYWlsZWQhIik7cmV0dXJuIEwuY2h1bmtzW1RdfSksKEZ8fCF3KSYmKHY9dz0xLHc9dGhpcy5nZXR0ZXIoMCkubGVuZ3RoLHY9dyxxZSgiTGF6eUZpbGVzIG9uIGd6aXAgZm9yY2VzIGRvd25sb2FkIG9mIHRoZSB3aG9sZSBmaWxlIHdoZW4gbGVuZ3RoIGlzIGFjY2Vzc2VkIikpLHRoaXMuX2xlbmd0aD13LHRoaXMuX2NodW5rU2l6ZT12LHRoaXMubGVuZ3RoS25vd249ITB9Z2V0IGxlbmd0aCgpe3JldHVybiB0aGlzLmxlbmd0aEtub3dufHx0aGlzLmNhY2hlTGVuZ3RoKCksdGhpcy5fbGVuZ3RofWdldCBjaHVua1NpemUoKXtyZXR1cm4gdGhpcy5sZW5ndGhLbm93bnx8dGhpcy5jYWNoZUxlbmd0aCgpLHRoaXMuX2NodW5rU2l6ZX19aWYodHlwZW9mIFhNTEh0dHBSZXF1ZXN0PCJ1Iil2YXIgcz1uZXcgaSxsPXtpc0RldmljZTohMSxjb250ZW50czpzfTtlbHNlIHZhciBsPXtpc0RldmljZTohMSx1cmw6dH07dmFyIHU9by5jcmVhdGVGaWxlKGUscixsLG4sYSk7bC5jb250ZW50cz91LmNvbnRlbnRzPWwuY29udGVudHM6bC51cmwmJih1LmNvbnRlbnRzPW51bGwsdS51cmw9bC51cmwpLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHUse3VzZWRCeXRlczp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGVudHMubGVuZ3RofX19KTt2YXIgYz17fSxkPU9iamVjdC5rZXlzKHUuc3RyZWFtX29wcyk7ZC5mb3JFYWNoKGg9Pnt2YXIgcD11LnN0cmVhbV9vcHNbaF07Y1toXT0oLi4udyk9PihvLmZvcmNlTG9hZEZpbGUodSkscCguLi53KSl9KTtmdW5jdGlvbiBtKGgscCx3LEQsTSl7dmFyIEY9aC5ub2RlLmNvbnRlbnRzO2lmKE0+PUYubGVuZ3RoKXJldHVybiAwO3ZhciB2PU1hdGgubWluKEYubGVuZ3RoLU0sRCk7aWYoRi5zbGljZSlmb3IodmFyIF89MDtfPHY7XysrKXBbdytfXT1GW00rX107ZWxzZSBmb3IodmFyIF89MDtfPHY7XysrKXBbdytfXT1GLmdldChNK18pO3JldHVybiB2fXJldHVybiBjLnJlYWQ9KGgscCx3LEQsTSk9PihvLmZvcmNlTG9hZEZpbGUodSksbShoLHAsdyxELE0pKSxjLm1tYXA9KGgscCx3LEQsTSk9PntvLmZvcmNlTG9hZEZpbGUodSk7dmFyIEY9VHIoKTtpZighRil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ4KTtyZXR1cm4gbShoLEksRixwLHcpLHtwdHI6RixhbGxvY2F0ZWQ6ITB9fSx1LnN0cmVhbV9vcHM9Yyx1fX0sUD17REVGQVVMVF9QT0xMTUFTSzo1LGNhbGN1bGF0ZUF0KGUscix0KXtpZihTLmlzQWJzKHIpKXJldHVybiByO3ZhciBuO2lmKGU9PT0tMTAwKW49by5jd2QoKTtlbHNle3ZhciBhPVAuZ2V0U3RyZWFtRnJvbUZEKGUpO249YS5wYXRofWlmKHIubGVuZ3RoPT0wKXtpZighdCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ0KTtyZXR1cm4gbn1yZXR1cm4gUy5qb2luMihuLHIpfSxkb1N0YXQoZSxyLHQpe3ZhciBuPWUocik7Z1t0Pj4yXT1uLmRldixnW3QrND4+Ml09bi5tb2RlLEFbdCs4Pj4yXT1uLm5saW5rLGdbdCsxMj4+Ml09bi51aWQsZ1t0KzE2Pj4yXT1uLmdpZCxnW3QrMjA+PjJdPW4ucmRldiwkPVtuLnNpemU+Pj4wLCh5PW4uc2l6ZSwrTWF0aC5hYnMoeSk+PTE/eT4wPytNYXRoLmZsb29yKHkvNDI5NDk2NzI5Nik+Pj4wOn5+K01hdGguY2VpbCgoeS0rKH5+eT4+PjApKS80Mjk0OTY3Mjk2KT4+PjA6MCldLGdbdCsyND4+Ml09JFswXSxnW3QrMjg+PjJdPSRbMV0sZ1t0KzMyPj4yXT00MDk2LGdbdCszNj4+Ml09bi5ibG9ja3M7dmFyIGE9bi5hdGltZS5nZXRUaW1lKCksaT1uLm10aW1lLmdldFRpbWUoKSxzPW4uY3RpbWUuZ2V0VGltZSgpO3JldHVybiAkPVtNYXRoLmZsb29yKGEvMWUzKT4+PjAsKHk9TWF0aC5mbG9vcihhLzFlMyksK01hdGguYWJzKHkpPj0xP3k+MD8rTWF0aC5mbG9vcih5LzQyOTQ5NjcyOTYpPj4+MDp+fitNYXRoLmNlaWwoKHktKyh+fnk+Pj4wKSkvNDI5NDk2NzI5Nik+Pj4wOjApXSxnW3QrNDA+PjJdPSRbMF0sZ1t0KzQ0Pj4yXT0kWzFdLEFbdCs0OD4+Ml09YSUxZTMqMWUzLCQ9W01hdGguZmxvb3IoaS8xZTMpPj4+MCwoeT1NYXRoLmZsb29yKGkvMWUzKSwrTWF0aC5hYnMoeSk+PTE/eT4wPytNYXRoLmZsb29yKHkvNDI5NDk2NzI5Nik+Pj4wOn5+K01hdGguY2VpbCgoeS0rKH5+eT4+PjApKS80Mjk0OTY3Mjk2KT4+PjA6MCldLGdbdCs1Nj4+Ml09JFswXSxnW3QrNjA+PjJdPSRbMV0sQVt0KzY0Pj4yXT1pJTFlMyoxZTMsJD1bTWF0aC5mbG9vcihzLzFlMyk+Pj4wLCh5PU1hdGguZmxvb3Iocy8xZTMpLCtNYXRoLmFicyh5KT49MT95PjA/K01hdGguZmxvb3IoeS80Mjk0OTY3Mjk2KT4+PjA6fn4rTWF0aC5jZWlsKCh5LSsofn55Pj4+MCkpLzQyOTQ5NjcyOTYpPj4+MDowKV0sZ1t0KzcyPj4yXT0kWzBdLGdbdCs3Nj4+Ml09JFsxXSxBW3QrODA+PjJdPXMlMWUzKjFlMywkPVtuLmlubz4+PjAsKHk9bi5pbm8sK01hdGguYWJzKHkpPj0xP3k+MD8rTWF0aC5mbG9vcih5LzQyOTQ5NjcyOTYpPj4+MDp+fitNYXRoLmNlaWwoKHktKyh+fnk+Pj4wKSkvNDI5NDk2NzI5Nik+Pj4wOjApXSxnW3QrODg+PjJdPSRbMF0sZ1t0KzkyPj4yXT0kWzFdLDB9LGRvTXN5bmMoZSxyLHQsbixhKXtpZighby5pc0ZpbGUoci5ub2RlLm1vZGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDMpO2lmKG4mMilyZXR1cm4gMDt2YXIgaT14LnNsaWNlKGUsZSt0KTtvLm1zeW5jKHIsaSxhLHQsbil9LGdldFN0cmVhbUZyb21GRChlKXt2YXIgcj1vLmdldFN0cmVhbUNoZWNrZWQoZSk7cmV0dXJuIHJ9LHZhcmFyZ3M6dm9pZCAwLGdldFN0cihlKXt2YXIgcj1zZShlKTtyZXR1cm4gcn19O2Z1bmN0aW9uIGp0KGUscix0LG4pe3RyeXtpZihyPVAuZ2V0U3RyKHIpLHI9UC5jYWxjdWxhdGVBdChlLHIpLHQmLTgpcmV0dXJuLTI4O3ZhciBhPW8ubG9va3VwUGF0aChyLHtmb2xsb3c6ITB9KSxpPWEubm9kZTtpZighaSlyZXR1cm4tNDQ7dmFyIHM9IiI7cmV0dXJuIHQmNCYmKHMrPSJyIiksdCYyJiYocys9InciKSx0JjEmJihzKz0ieCIpLHMmJm8ubm9kZVBlcm1pc3Npb25zKGkscyk/LTI6MH1jYXRjaChsKXtpZih0eXBlb2Ygbz4idSJ8fGwubmFtZSE9PSJFcnJub0Vycm9yIil0aHJvdyBsO3JldHVybi1sLmVycm5vfX1mdW5jdGlvbiBNZSgpe3ZhciBlPWdbK1AudmFyYXJncz4+Ml07cmV0dXJuIFAudmFyYXJncys9NCxlfXZhciBkZT1NZTtmdW5jdGlvbiB6dChlLHIsdCl7UC52YXJhcmdzPXQ7dHJ5e3ZhciBuPVAuZ2V0U3RyZWFtRnJvbUZEKGUpO3N3aXRjaChyKXtjYXNlIDA6e3ZhciBhPU1lKCk7aWYoYTwwKXJldHVybi0yODtmb3IoO28uc3RyZWFtc1thXTspYSsrO3ZhciBpO3JldHVybiBpPW8uZHVwU3RyZWFtKG4sYSksaS5mZH1jYXNlIDE6Y2FzZSAyOnJldHVybiAwO2Nhc2UgMzpyZXR1cm4gbi5mbGFncztjYXNlIDQ6e3ZhciBhPU1lKCk7cmV0dXJuIG4uZmxhZ3N8PWEsMH1jYXNlIDEyOnt2YXIgYT1kZSgpLHM9MDtyZXR1cm4gWVthK3M+PjFdPTIsMH1jYXNlIDEzOmNhc2UgMTQ6cmV0dXJuIDB9cmV0dXJuLTI4fWNhdGNoKGwpe2lmKHR5cGVvZiBvPiJ1Inx8bC5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IGw7cmV0dXJuLWwuZXJybm99fWZ1bmN0aW9uIHh0KGUscil7dHJ5e3ZhciB0PVAuZ2V0U3RyZWFtRnJvbUZEKGUpO3JldHVybiBQLmRvU3RhdChvLnN0YXQsdC5wYXRoLHIpfWNhdGNoKG4pe2lmKHR5cGVvZiBvPiJ1Inx8bi5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IG47cmV0dXJuLW4uZXJybm99fXZhciB2ZT0oZSxyLHQpPT5RZShlLHgscix0KTtmdW5jdGlvbiBIdChlLHIsdCl7dHJ5e3ZhciBuPVAuZ2V0U3RyZWFtRnJvbUZEKGUpO24uZ2V0ZGVudHN8fChuLmdldGRlbnRzPW8ucmVhZGRpcihuLnBhdGgpKTtmb3IodmFyIGE9MjgwLGk9MCxzPW8ubGxzZWVrKG4sMCwxKSxsPU1hdGguZmxvb3Iocy9hKTtsPG4uZ2V0ZGVudHMubGVuZ3RoJiZpK2E8PXQ7KXt2YXIgdSxjLGQ9bi5nZXRkZW50c1tsXTtpZihkPT09Ii4iKXU9bi5ub2RlLmlkLGM9NDtlbHNlIGlmKGQ9PT0iLi4iKXt2YXIgbT1vLmxvb2t1cFBhdGgobi5wYXRoLHtwYXJlbnQ6ITB9KTt1PW0ubm9kZS5pZCxjPTR9ZWxzZXt2YXIgaD1vLmxvb2t1cE5vZGUobi5ub2RlLGQpO3U9aC5pZCxjPW8uaXNDaHJkZXYoaC5tb2RlKT8yOm8uaXNEaXIoaC5tb2RlKT80Om8uaXNMaW5rKGgubW9kZSk/MTA6OH0kPVt1Pj4+MCwoeT11LCtNYXRoLmFicyh5KT49MT95PjA/K01hdGguZmxvb3IoeS80Mjk0OTY3Mjk2KT4+PjA6fn4rTWF0aC5jZWlsKCh5LSsofn55Pj4+MCkpLzQyOTQ5NjcyOTYpPj4+MDowKV0sZ1tyK2k+PjJdPSRbMF0sZ1tyK2krND4+Ml09JFsxXSwkPVsobCsxKSphPj4+MCwoeT0obCsxKSphLCtNYXRoLmFicyh5KT49MT95PjA/K01hdGguZmxvb3IoeS80Mjk0OTY3Mjk2KT4+PjA6fn4rTWF0aC5jZWlsKCh5LSsofn55Pj4+MCkpLzQyOTQ5NjcyOTYpPj4+MDowKV0sZ1tyK2krOD4+Ml09JFswXSxnW3IraSsxMj4+Ml09JFsxXSxZW3IraSsxNj4+MV09MjgwLElbcitpKzE4XT1jLHZlKGQscitpKzE5LDI1NiksaSs9YSxsKz0xfXJldHVybiBvLmxsc2VlayhuLGwqYSwwKSxpfWNhdGNoKHApe2lmKHR5cGVvZiBvPiJ1Inx8cC5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IHA7cmV0dXJuLXAuZXJybm99fWZ1bmN0aW9uIFd0KGUscix0KXtQLnZhcmFyZ3M9dDt0cnl7dmFyIG49UC5nZXRTdHJlYW1Gcm9tRkQoZSk7c3dpdGNoKHIpe2Nhc2UgMjE1MDk6cmV0dXJuIG4udHR5PzA6LTU5O2Nhc2UgMjE1MDU6e2lmKCFuLnR0eSlyZXR1cm4tNTk7aWYobi50dHkub3BzLmlvY3RsX3RjZ2V0cyl7dmFyIGE9bi50dHkub3BzLmlvY3RsX3RjZ2V0cyhuKSxpPWRlKCk7Z1tpPj4yXT1hLmNfaWZsYWd8fDAsZ1tpKzQ+PjJdPWEuY19vZmxhZ3x8MCxnW2krOD4+Ml09YS5jX2NmbGFnfHwwLGdbaSsxMj4+Ml09YS5jX2xmbGFnfHwwO2Zvcih2YXIgcz0wO3M8MzI7cysrKUlbaStzKzE3XT1hLmNfY2Nbc118fDA7cmV0dXJuIDB9cmV0dXJuIDB9Y2FzZSAyMTUxMDpjYXNlIDIxNTExOmNhc2UgMjE1MTI6cmV0dXJuIG4udHR5PzA6LTU5O2Nhc2UgMjE1MDY6Y2FzZSAyMTUwNzpjYXNlIDIxNTA4OntpZighbi50dHkpcmV0dXJuLTU5O2lmKG4udHR5Lm9wcy5pb2N0bF90Y3NldHMpe2Zvcih2YXIgaT1kZSgpLGw9Z1tpPj4yXSx1PWdbaSs0Pj4yXSxjPWdbaSs4Pj4yXSxkPWdbaSsxMj4+Ml0sbT1bXSxzPTA7czwzMjtzKyspbS5wdXNoKElbaStzKzE3XSk7cmV0dXJuIG4udHR5Lm9wcy5pb2N0bF90Y3NldHMobi50dHkscix7Y19pZmxhZzpsLGNfb2ZsYWc6dSxjX2NmbGFnOmMsY19sZmxhZzpkLGNfY2M6bX0pfXJldHVybiAwfWNhc2UgMjE1MTk6e2lmKCFuLnR0eSlyZXR1cm4tNTk7dmFyIGk9ZGUoKTtyZXR1cm4gZ1tpPj4yXT0wLDB9Y2FzZSAyMTUyMDpyZXR1cm4gbi50dHk/LTI4Oi01OTtjYXNlIDIxNTMxOnt2YXIgaT1kZSgpO3JldHVybiBvLmlvY3RsKG4scixpKX1jYXNlIDIxNTIzOntpZighbi50dHkpcmV0dXJuLTU5O2lmKG4udHR5Lm9wcy5pb2N0bF90aW9jZ3dpbnN6KXt2YXIgaD1uLnR0eS5vcHMuaW9jdGxfdGlvY2d3aW5zeihuLnR0eSksaT1kZSgpO1lbaT4+MV09aFswXSxZW2krMj4+MV09aFsxXX1yZXR1cm4gMH1jYXNlIDIxNTI0OnJldHVybiBuLnR0eT8wOi01OTtjYXNlIDIxNTE1OnJldHVybiBuLnR0eT8wOi01OTtkZWZhdWx0OnJldHVybi0yOH19Y2F0Y2gocCl7aWYodHlwZW9mIG8+InUifHxwLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgcDtyZXR1cm4tcC5lcnJub319ZnVuY3Rpb24gQnQoZSxyKXt0cnl7cmV0dXJuIGU9UC5nZXRTdHIoZSksUC5kb1N0YXQoby5sc3RhdCxlLHIpfWNhdGNoKHQpe2lmKHR5cGVvZiBvPiJ1Inx8dC5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IHQ7cmV0dXJuLXQuZXJybm99fWZ1bmN0aW9uIE50KGUscix0LG4pe3RyeXtyPVAuZ2V0U3RyKHIpO3ZhciBhPW4mMjU2LGk9biY0MDk2O3JldHVybiBuPW4mLTY0MDEscj1QLmNhbGN1bGF0ZUF0KGUscixpKSxQLmRvU3RhdChhP28ubHN0YXQ6by5zdGF0LHIsdCl9Y2F0Y2gocyl7aWYodHlwZW9mIG8+InUifHxzLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgcztyZXR1cm4tcy5lcnJub319ZnVuY3Rpb24gWXQoZSxyLHQsbil7UC52YXJhcmdzPW47dHJ5e3I9UC5nZXRTdHIocikscj1QLmNhbGN1bGF0ZUF0KGUscik7dmFyIGE9bj9NZSgpOjA7cmV0dXJuIG8ub3BlbihyLHQsYSkuZmR9Y2F0Y2goaSl7aWYodHlwZW9mIG8+InUifHxpLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgaTtyZXR1cm4taS5lcnJub319ZnVuY3Rpb24gR3QoZSxyLHQsbil7dHJ5e3JldHVybiByPVAuZ2V0U3RyKHIpLG49UC5nZXRTdHIobikscj1QLmNhbGN1bGF0ZUF0KGUsciksbj1QLmNhbGN1bGF0ZUF0KHQsbiksby5yZW5hbWUocixuKSwwfWNhdGNoKGEpe2lmKHR5cGVvZiBvPiJ1Inx8YS5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IGE7cmV0dXJuLWEuZXJybm99fWZ1bmN0aW9uIHF0KGUpe3RyeXtyZXR1cm4gZT1QLmdldFN0cihlKSxvLnJtZGlyKGUpLDB9Y2F0Y2gocil7aWYodHlwZW9mIG8+InUifHxyLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgcjtyZXR1cm4tci5lcnJub319ZnVuY3Rpb24gWHQoZSxyKXt0cnl7cmV0dXJuIGU9UC5nZXRTdHIoZSksUC5kb1N0YXQoby5zdGF0LGUscil9Y2F0Y2godCl7aWYodHlwZW9mIG8+InUifHx0Lm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgdDtyZXR1cm4tdC5lcnJub319ZnVuY3Rpb24gS3QoZSxyLHQpe3RyeXtyZXR1cm4gcj1QLmdldFN0cihyKSxyPVAuY2FsY3VsYXRlQXQoZSxyKSx0PT09MD9vLnVubGluayhyKTp0PT09NTEyP28ucm1kaXIocik6aWUoIkludmFsaWQgZmxhZ3MgcGFzc2VkIHRvIHVubGlua2F0IiksMH1jYXRjaChuKXtpZih0eXBlb2Ygbz4idSJ8fG4ubmFtZSE9PSJFcnJub0Vycm9yIil0aHJvdyBuO3JldHVybi1uLmVycm5vfX12YXIgSnQ9KCk9PntpZSgiIil9LFJlPXt9LHJyPWU9Pntmb3IoO2UubGVuZ3RoOyl7dmFyIHI9ZS5wb3AoKSx0PWUucG9wKCk7dChyKX19O2Z1bmN0aW9uIHllKGUpe3JldHVybiB0aGlzLmZyb21XaXJlVHlwZShBW2U+PjJdKX12YXIgaGU9e30sdWU9e30sT2U9e30sU3IsSWU9ZT0+e3Rocm93IG5ldyBTcihlKX0sTj0oZSxyLHQpPT57ZS5mb3JFYWNoKGZ1bmN0aW9uKGwpe09lW2xdPXJ9KTtmdW5jdGlvbiBuKGwpe3ZhciB1PXQobCk7dS5sZW5ndGghPT1lLmxlbmd0aCYmSWUoIk1pc21hdGNoZWQgdHlwZSBjb252ZXJ0ZXIgY291bnQiKTtmb3IodmFyIGM9MDtjPGUubGVuZ3RoOysrYylLKGVbY10sdVtjXSl9dmFyIGE9bmV3IEFycmF5KHIubGVuZ3RoKSxpPVtdLHM9MDtyLmZvckVhY2goKGwsdSk9Pnt1ZS5oYXNPd25Qcm9wZXJ0eShsKT9hW3VdPXVlW2xdOihpLnB1c2gobCksaGUuaGFzT3duUHJvcGVydHkobCl8fChoZVtsXT1bXSksaGVbbF0ucHVzaCgoKT0+e2FbdV09dWVbbF0sKytzLHM9PT1pLmxlbmd0aCYmbihhKX0pKX0pLGkubGVuZ3RoPT09MCYmbihhKX0sWnQ9ZT0+e3ZhciByPVJlW2VdO2RlbGV0ZSBSZVtlXTt2YXIgdD1yLnJhd0NvbnN0cnVjdG9yLG49ci5yYXdEZXN0cnVjdG9yLGE9ci5maWVsZHMsaT1hLm1hcChzPT5zLmdldHRlclJldHVyblR5cGUpLmNvbmNhdChhLm1hcChzPT5zLnNldHRlckFyZ3VtZW50VHlwZSkpO04oW2VdLGkscz0+e3ZhciBsPXt9O3JldHVybiBhLmZvckVhY2goKHUsYyk9Pnt2YXIgZD11LmZpZWxkTmFtZSxtPXNbY10saD11LmdldHRlcixwPXUuZ2V0dGVyQ29udGV4dCx3PXNbYythLmxlbmd0aF0sRD11LnNldHRlcixNPXUuc2V0dGVyQ29udGV4dDtsW2RdPXtyZWFkOkY9Pm0uZnJvbVdpcmVUeXBlKGgocCxGKSksd3JpdGU6KEYsdik9Pnt2YXIgXz1bXTtEKE0sRix3LnRvV2lyZVR5cGUoXyx2KSkscnIoXyl9fX0pLFt7bmFtZTpyLm5hbWUsZnJvbVdpcmVUeXBlOnU9Pnt2YXIgYz17fTtmb3IodmFyIGQgaW4gbCljW2RdPWxbZF0ucmVhZCh1KTtyZXR1cm4gbih1KSxjfSx0b1dpcmVUeXBlOih1LGMpPT57Zm9yKHZhciBkIGluIGwpaWYoIShkIGluIGMpKXRocm93IG5ldyBUeXBlRXJyb3IoYE1pc3NpbmcgZmllbGQ6ICIke2R9ImApO3ZhciBtPXQoKTtmb3IoZCBpbiBsKWxbZF0ud3JpdGUobSxjW2RdKTtyZXR1cm4gdSE9PW51bGwmJnUucHVzaChuLG0pLG19LGFyZ1BhY2tBZHZhbmNlOkoscmVhZFZhbHVlRnJvbVBvaW50ZXI6eWUsZGVzdHJ1Y3RvckZ1bmN0aW9uOm59XX0pfSxRdD0oZSxyLHQsbixhKT0+e30sZW49KCk9Pntmb3IodmFyIGU9bmV3IEFycmF5KDI1Nikscj0wO3I8MjU2OysrcillW3JdPVN0cmluZy5mcm9tQ2hhckNvZGUocik7TXI9ZX0sTXIsaj1lPT57Zm9yKHZhciByPSIiLHQ9ZTt4W3RdOylyKz1Nclt4W3QrK11dO3JldHVybiByfSxtZSxrPWU9Pnt0aHJvdyBuZXcgbWUoZSl9O2Z1bmN0aW9uIHJuKGUscix0PXt9KXt2YXIgbj1yLm5hbWU7aWYoZXx8ayhgdHlwZSAiJHtufSIgbXVzdCBoYXZlIGEgcG9zaXRpdmUgaW50ZWdlciB0eXBlaWQgcG9pbnRlcmApLHVlLmhhc093blByb3BlcnR5KGUpKXtpZih0Lmlnbm9yZUR1cGxpY2F0ZVJlZ2lzdHJhdGlvbnMpcmV0dXJuO2soYENhbm5vdCByZWdpc3RlciB0eXBlICcke259JyB0d2ljZWApfWlmKHVlW2VdPXIsZGVsZXRlIE9lW2VdLGhlLmhhc093blByb3BlcnR5KGUpKXt2YXIgYT1oZVtlXTtkZWxldGUgaGVbZV0sYS5mb3JFYWNoKGk9PmkoKSl9fWZ1bmN0aW9uIEsoZSxyLHQ9e30pe2lmKCEoImFyZ1BhY2tBZHZhbmNlImluIHIpKXRocm93IG5ldyBUeXBlRXJyb3IoInJlZ2lzdGVyVHlwZSByZWdpc3RlcmVkSW5zdGFuY2UgcmVxdWlyZXMgYXJnUGFja0FkdmFuY2UiKTtyZXR1cm4gcm4oZSxyLHQpfXZhciBKPTgsdG49KGUscix0LG4pPT57cj1qKHIpLEsoZSx7bmFtZTpyLGZyb21XaXJlVHlwZTpmdW5jdGlvbihhKXtyZXR1cm4hIWF9LHRvV2lyZVR5cGU6ZnVuY3Rpb24oYSxpKXtyZXR1cm4gaT90Om59LGFyZ1BhY2tBZHZhbmNlOkoscmVhZFZhbHVlRnJvbVBvaW50ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZnJvbVdpcmVUeXBlKHhbYV0pfSxkZXN0cnVjdG9yRnVuY3Rpb246bnVsbH0pfSxubj1lPT4oe2NvdW50OmUuY291bnQsZGVsZXRlU2NoZWR1bGVkOmUuZGVsZXRlU2NoZWR1bGVkLHByZXNlcnZlUG9pbnRlck9uRGVsZXRlOmUucHJlc2VydmVQb2ludGVyT25EZWxldGUscHRyOmUucHRyLHB0clR5cGU6ZS5wdHJUeXBlLHNtYXJ0UHRyOmUuc21hcnRQdHIsc21hcnRQdHJUeXBlOmUuc21hcnRQdHJUeXBlfSksdHI9ZT0+e2Z1bmN0aW9uIHIodCl7cmV0dXJuIHQuJCQucHRyVHlwZS5yZWdpc3RlcmVkQ2xhc3MubmFtZX1rKHIoZSkrIiBpbnN0YW5jZSBhbHJlYWR5IGRlbGV0ZWQiKX0sbnI9ITEsUnI9ZT0+e30sYW49ZT0+e2Uuc21hcnRQdHI/ZS5zbWFydFB0clR5cGUucmF3RGVzdHJ1Y3RvcihlLnNtYXJ0UHRyKTplLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzLnJhd0Rlc3RydWN0b3IoZS5wdHIpfSxPcj1lPT57ZS5jb3VudC52YWx1ZS09MTt2YXIgcj1lLmNvdW50LnZhbHVlPT09MDtyJiZhbihlKX0sSXI9KGUscix0KT0+e2lmKHI9PT10KXJldHVybiBlO2lmKHQuYmFzZUNsYXNzPT09dm9pZCAwKXJldHVybiBudWxsO3ZhciBuPUlyKGUscix0LmJhc2VDbGFzcyk7cmV0dXJuIG49PT1udWxsP251bGw6dC5kb3duY2FzdChuKX0sTHI9e30sb249KCk9Pk9iamVjdC5rZXlzKGJlKS5sZW5ndGgsc249KCk9Pnt2YXIgZT1bXTtmb3IodmFyIHIgaW4gYmUpYmUuaGFzT3duUHJvcGVydHkocikmJmUucHVzaChiZVtyXSk7cmV0dXJuIGV9LHdlPVtdLGFyPSgpPT57Zm9yKDt3ZS5sZW5ndGg7KXt2YXIgZT13ZS5wb3AoKTtlLiQkLmRlbGV0ZVNjaGVkdWxlZD0hMSxlLmRlbGV0ZSgpfX0sRWUsbG49ZT0+e0VlPWUsd2UubGVuZ3RoJiZFZSYmRWUoYXIpfSx1bj0oKT0+e2YuZ2V0SW5oZXJpdGVkSW5zdGFuY2VDb3VudD1vbixmLmdldExpdmVJbmhlcml0ZWRJbnN0YW5jZXM9c24sZi5mbHVzaFBlbmRpbmdEZWxldGVzPWFyLGYuc2V0RGVsYXlGdW5jdGlvbj1sbn0sYmU9e30sZm49KGUscik9Pntmb3Iocj09PXZvaWQgMCYmaygicHRyIHNob3VsZCBub3QgYmUgdW5kZWZpbmVkIik7ZS5iYXNlQ2xhc3M7KXI9ZS51cGNhc3QociksZT1lLmJhc2VDbGFzcztyZXR1cm4gcn0sY249KGUscik9PihyPWZuKGUsciksYmVbcl0pLExlPShlLHIpPT57KCFyLnB0clR5cGV8fCFyLnB0cikmJkllKCJtYWtlQ2xhc3NIYW5kbGUgcmVxdWlyZXMgcHRyIGFuZCBwdHJUeXBlIik7dmFyIHQ9ISFyLnNtYXJ0UHRyVHlwZSxuPSEhci5zbWFydFB0cjtyZXR1cm4gdCE9PW4mJkllKCJCb3RoIHNtYXJ0UHRyVHlwZSBhbmQgc21hcnRQdHIgbXVzdCBiZSBzcGVjaWZpZWQiKSxyLmNvdW50PXt2YWx1ZToxfSxrZShPYmplY3QuY3JlYXRlKGUseyQkOnt2YWx1ZTpyLHdyaXRhYmxlOiEwfX0pKX07ZnVuY3Rpb24gZG4oZSl7dmFyIHI9dGhpcy5nZXRQb2ludGVlKGUpO2lmKCFyKXJldHVybiB0aGlzLmRlc3RydWN0b3IoZSksbnVsbDt2YXIgdD1jbih0aGlzLnJlZ2lzdGVyZWRDbGFzcyxyKTtpZih0IT09dm9pZCAwKXtpZih0LiQkLmNvdW50LnZhbHVlPT09MClyZXR1cm4gdC4kJC5wdHI9cix0LiQkLnNtYXJ0UHRyPWUsdC5jbG9uZSgpO3ZhciBuPXQuY2xvbmUoKTtyZXR1cm4gdGhpcy5kZXN0cnVjdG9yKGUpLG59ZnVuY3Rpb24gYSgpe3JldHVybiB0aGlzLmlzU21hcnRQb2ludGVyP0xlKHRoaXMucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHtwdHJUeXBlOnRoaXMucG9pbnRlZVR5cGUscHRyOnIsc21hcnRQdHJUeXBlOnRoaXMsc21hcnRQdHI6ZX0pOkxlKHRoaXMucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHtwdHJUeXBlOnRoaXMscHRyOmV9KX12YXIgaT10aGlzLnJlZ2lzdGVyZWRDbGFzcy5nZXRBY3R1YWxUeXBlKHIpLHM9THJbaV07aWYoIXMpcmV0dXJuIGEuY2FsbCh0aGlzKTt2YXIgbDt0aGlzLmlzQ29uc3Q/bD1zLmNvbnN0UG9pbnRlclR5cGU6bD1zLnBvaW50ZXJUeXBlO3ZhciB1PUlyKHIsdGhpcy5yZWdpc3RlcmVkQ2xhc3MsbC5yZWdpc3RlcmVkQ2xhc3MpO3JldHVybiB1PT09bnVsbD9hLmNhbGwodGhpcyk6dGhpcy5pc1NtYXJ0UG9pbnRlcj9MZShsLnJlZ2lzdGVyZWRDbGFzcy5pbnN0YW5jZVByb3RvdHlwZSx7cHRyVHlwZTpsLHB0cjp1LHNtYXJ0UHRyVHlwZTp0aGlzLHNtYXJ0UHRyOmV9KTpMZShsLnJlZ2lzdGVyZWRDbGFzcy5pbnN0YW5jZVByb3RvdHlwZSx7cHRyVHlwZTpsLHB0cjp1fSl9dmFyIGtlPWU9PnR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT4idSI/KGtlPXI9PnIsZSk6KG5yPW5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeShyPT57T3Ioci4kJCl9KSxrZT1yPT57dmFyIHQ9ci4kJCxuPSEhdC5zbWFydFB0cjtpZihuKXt2YXIgYT17JCQ6dH07bnIucmVnaXN0ZXIocixhLHIpfXJldHVybiByfSxScj1yPT5uci51bnJlZ2lzdGVyKHIpLGtlKGUpKSx2bj0oKT0+e09iamVjdC5hc3NpZ24oVmUucHJvdG90eXBlLHtpc0FsaWFzT2YoZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgVmUpfHwhKGUgaW5zdGFuY2VvZiBWZSkpcmV0dXJuITE7dmFyIHI9dGhpcy4kJC5wdHJUeXBlLnJlZ2lzdGVyZWRDbGFzcyx0PXRoaXMuJCQucHRyO2UuJCQ9ZS4kJDtmb3IodmFyIG49ZS4kJC5wdHJUeXBlLnJlZ2lzdGVyZWRDbGFzcyxhPWUuJCQucHRyO3IuYmFzZUNsYXNzOyl0PXIudXBjYXN0KHQpLHI9ci5iYXNlQ2xhc3M7Zm9yKDtuLmJhc2VDbGFzczspYT1uLnVwY2FzdChhKSxuPW4uYmFzZUNsYXNzO3JldHVybiByPT09biYmdD09PWF9LGNsb25lKCl7aWYodGhpcy4kJC5wdHJ8fHRyKHRoaXMpLHRoaXMuJCQucHJlc2VydmVQb2ludGVyT25EZWxldGUpcmV0dXJuIHRoaXMuJCQuY291bnQudmFsdWUrPTEsdGhpczt2YXIgZT1rZShPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKSx7JCQ6e3ZhbHVlOm5uKHRoaXMuJCQpfX0pKTtyZXR1cm4gZS4kJC5jb3VudC52YWx1ZSs9MSxlLiQkLmRlbGV0ZVNjaGVkdWxlZD0hMSxlfSxkZWxldGUoKXt0aGlzLiQkLnB0cnx8dHIodGhpcyksdGhpcy4kJC5kZWxldGVTY2hlZHVsZWQmJiF0aGlzLiQkLnByZXNlcnZlUG9pbnRlck9uRGVsZXRlJiZrKCJPYmplY3QgYWxyZWFkeSBzY2hlZHVsZWQgZm9yIGRlbGV0aW9uIiksUnIodGhpcyksT3IodGhpcy4kJCksdGhpcy4kJC5wcmVzZXJ2ZVBvaW50ZXJPbkRlbGV0ZXx8KHRoaXMuJCQuc21hcnRQdHI9dm9pZCAwLHRoaXMuJCQucHRyPXZvaWQgMCl9LGlzRGVsZXRlZCgpe3JldHVybiF0aGlzLiQkLnB0cn0sZGVsZXRlTGF0ZXIoKXtyZXR1cm4gdGhpcy4kJC5wdHJ8fHRyKHRoaXMpLHRoaXMuJCQuZGVsZXRlU2NoZWR1bGVkJiYhdGhpcy4kJC5wcmVzZXJ2ZVBvaW50ZXJPbkRlbGV0ZSYmaygiT2JqZWN0IGFscmVhZHkgc2NoZWR1bGVkIGZvciBkZWxldGlvbiIpLHdlLnB1c2godGhpcyksd2UubGVuZ3RoPT09MSYmRWUmJkVlKGFyKSx0aGlzLiQkLmRlbGV0ZVNjaGVkdWxlZD0hMCx0aGlzfX0pfTtmdW5jdGlvbiBWZSgpe312YXIgVWU9KGUscik9Pk9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJuYW1lIix7dmFsdWU6ZX0pLG9yPShlLHIsdCk9PntpZihlW3JdLm92ZXJsb2FkVGFibGU9PT12b2lkIDApe3ZhciBuPWVbcl07ZVtyXT1mdW5jdGlvbiguLi5hKXtyZXR1cm4gZVtyXS5vdmVybG9hZFRhYmxlLmhhc093blByb3BlcnR5KGEubGVuZ3RoKXx8ayhgRnVuY3Rpb24gJyR7dH0nIGNhbGxlZCB3aXRoIGFuIGludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyAoJHthLmxlbmd0aH0pIC0gZXhwZWN0cyBvbmUgb2YgKCR7ZVtyXS5vdmVybG9hZFRhYmxlfSkhYCksZVtyXS5vdmVybG9hZFRhYmxlW2EubGVuZ3RoXS5hcHBseSh0aGlzLGEpfSxlW3JdLm92ZXJsb2FkVGFibGU9W10sZVtyXS5vdmVybG9hZFRhYmxlW24uYXJnQ291bnRdPW59fSxWcj0oZSxyLHQpPT57Zi5oYXNPd25Qcm9wZXJ0eShlKT8oKHQ9PT12b2lkIDB8fGZbZV0ub3ZlcmxvYWRUYWJsZSE9PXZvaWQgMCYmZltlXS5vdmVybG9hZFRhYmxlW3RdIT09dm9pZCAwKSYmayhgQ2Fubm90IHJlZ2lzdGVyIHB1YmxpYyBuYW1lICcke2V9JyB0d2ljZWApLG9yKGYsZSxlKSxmLmhhc093blByb3BlcnR5KHQpJiZrKGBDYW5ub3QgcmVnaXN0ZXIgbXVsdGlwbGUgb3ZlcmxvYWRzIG9mIGEgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSBudW1iZXIgb2YgYXJndW1lbnRzICgke3R9KSFgKSxmW2VdLm92ZXJsb2FkVGFibGVbdF09cik6KGZbZV09cix0IT09dm9pZCAwJiYoZltlXS5udW1Bcmd1bWVudHM9dCkpfSxobj00OCxtbj01Nyxwbj1lPT57aWYoZT09PXZvaWQgMClyZXR1cm4iX3Vua25vd24iO2U9ZS5yZXBsYWNlKC9bXmEtekEtWjAtOV9dL2csIiQiKTt2YXIgcj1lLmNoYXJDb2RlQXQoMCk7cmV0dXJuIHI+PWhuJiZyPD1tbj9gXyR7ZX1gOmV9O2Z1bmN0aW9uIF9uKGUscix0LG4sYSxpLHMsbCl7dGhpcy5uYW1lPWUsdGhpcy5jb25zdHJ1Y3Rvcj1yLHRoaXMuaW5zdGFuY2VQcm90b3R5cGU9dCx0aGlzLnJhd0Rlc3RydWN0b3I9bix0aGlzLmJhc2VDbGFzcz1hLHRoaXMuZ2V0QWN0dWFsVHlwZT1pLHRoaXMudXBjYXN0PXMsdGhpcy5kb3duY2FzdD1sLHRoaXMucHVyZVZpcnR1YWxGdW5jdGlvbnM9W119dmFyIGplPShlLHIsdCk9Pntmb3IoO3IhPT10OylyLnVwY2FzdHx8ayhgRXhwZWN0ZWQgbnVsbCBvciBpbnN0YW5jZSBvZiAke3QubmFtZX0sIGdvdCBhbiBpbnN0YW5jZSBvZiAke3IubmFtZX1gKSxlPXIudXBjYXN0KGUpLHI9ci5iYXNlQ2xhc3M7cmV0dXJuIGV9O2Z1bmN0aW9uIGduKGUscil7aWYocj09PW51bGwpcmV0dXJuIHRoaXMuaXNSZWZlcmVuY2UmJmsoYG51bGwgaXMgbm90IGEgdmFsaWQgJHt0aGlzLm5hbWV9YCksMDtyLiQkfHxrKGBDYW5ub3QgcGFzcyAiJHtscihyKX0iIGFzIGEgJHt0aGlzLm5hbWV9YCksci4kJC5wdHJ8fGsoYENhbm5vdCBwYXNzIGRlbGV0ZWQgb2JqZWN0IGFzIGEgcG9pbnRlciBvZiB0eXBlICR7dGhpcy5uYW1lfWApO3ZhciB0PXIuJCQucHRyVHlwZS5yZWdpc3RlcmVkQ2xhc3Msbj1qZShyLiQkLnB0cix0LHRoaXMucmVnaXN0ZXJlZENsYXNzKTtyZXR1cm4gbn1mdW5jdGlvbiB5bihlLHIpe3ZhciB0O2lmKHI9PT1udWxsKXJldHVybiB0aGlzLmlzUmVmZXJlbmNlJiZrKGBudWxsIGlzIG5vdCBhIHZhbGlkICR7dGhpcy5uYW1lfWApLHRoaXMuaXNTbWFydFBvaW50ZXI/KHQ9dGhpcy5yYXdDb25zdHJ1Y3RvcigpLGUhPT1udWxsJiZlLnB1c2godGhpcy5yYXdEZXN0cnVjdG9yLHQpLHQpOjA7KCFyfHwhci4kJCkmJmsoYENhbm5vdCBwYXNzICIke2xyKHIpfSIgYXMgYSAke3RoaXMubmFtZX1gKSxyLiQkLnB0cnx8ayhgQ2Fubm90IHBhc3MgZGVsZXRlZCBvYmplY3QgYXMgYSBwb2ludGVyIG9mIHR5cGUgJHt0aGlzLm5hbWV9YCksIXRoaXMuaXNDb25zdCYmci4kJC5wdHJUeXBlLmlzQ29uc3QmJmsoYENhbm5vdCBjb252ZXJ0IGFyZ3VtZW50IG9mIHR5cGUgJHtyLiQkLnNtYXJ0UHRyVHlwZT9yLiQkLnNtYXJ0UHRyVHlwZS5uYW1lOnIuJCQucHRyVHlwZS5uYW1lfSB0byBwYXJhbWV0ZXIgdHlwZSAke3RoaXMubmFtZX1gKTt2YXIgbj1yLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzO2lmKHQ9amUoci4kJC5wdHIsbix0aGlzLnJlZ2lzdGVyZWRDbGFzcyksdGhpcy5pc1NtYXJ0UG9pbnRlcilzd2l0Y2goci4kJC5zbWFydFB0cj09PXZvaWQgMCYmaygiUGFzc2luZyByYXcgcG9pbnRlciB0byBzbWFydCBwb2ludGVyIGlzIGlsbGVnYWwiKSx0aGlzLnNoYXJpbmdQb2xpY3kpe2Nhc2UgMDpyLiQkLnNtYXJ0UHRyVHlwZT09PXRoaXM/dD1yLiQkLnNtYXJ0UHRyOmsoYENhbm5vdCBjb252ZXJ0IGFyZ3VtZW50IG9mIHR5cGUgJHtyLiQkLnNtYXJ0UHRyVHlwZT9yLiQkLnNtYXJ0UHRyVHlwZS5uYW1lOnIuJCQucHRyVHlwZS5uYW1lfSB0byBwYXJhbWV0ZXIgdHlwZSAke3RoaXMubmFtZX1gKTticmVhaztjYXNlIDE6dD1yLiQkLnNtYXJ0UHRyO2JyZWFrO2Nhc2UgMjppZihyLiQkLnNtYXJ0UHRyVHlwZT09PXRoaXMpdD1yLiQkLnNtYXJ0UHRyO2Vsc2V7dmFyIGE9ci5jbG9uZSgpO3Q9dGhpcy5yYXdTaGFyZSh0LHRlLnRvSGFuZGxlKCgpPT5hLmRlbGV0ZSgpKSksZSE9PW51bGwmJmUucHVzaCh0aGlzLnJhd0Rlc3RydWN0b3IsdCl9YnJlYWs7ZGVmYXVsdDprKCJVbnN1cHBvcnRpbmcgc2hhcmluZyBwb2xpY3kiKX1yZXR1cm4gdH1mdW5jdGlvbiB3bihlLHIpe2lmKHI9PT1udWxsKXJldHVybiB0aGlzLmlzUmVmZXJlbmNlJiZrKGBudWxsIGlzIG5vdCBhIHZhbGlkICR7dGhpcy5uYW1lfWApLDA7ci4kJHx8ayhgQ2Fubm90IHBhc3MgIiR7bHIocil9IiBhcyBhICR7dGhpcy5uYW1lfWApLHIuJCQucHRyfHxrKGBDYW5ub3QgcGFzcyBkZWxldGVkIG9iamVjdCBhcyBhIHBvaW50ZXIgb2YgdHlwZSAke3RoaXMubmFtZX1gKSxyLiQkLnB0clR5cGUuaXNDb25zdCYmayhgQ2Fubm90IGNvbnZlcnQgYXJndW1lbnQgb2YgdHlwZSAke3IuJCQucHRyVHlwZS5uYW1lfSB0byBwYXJhbWV0ZXIgdHlwZSAke3RoaXMubmFtZX1gKTt2YXIgdD1yLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzLG49amUoci4kJC5wdHIsdCx0aGlzLnJlZ2lzdGVyZWRDbGFzcyk7cmV0dXJuIG59dmFyIEVuPSgpPT57T2JqZWN0LmFzc2lnbih6ZS5wcm90b3R5cGUse2dldFBvaW50ZWUoZSl7cmV0dXJuIHRoaXMucmF3R2V0UG9pbnRlZSYmKGU9dGhpcy5yYXdHZXRQb2ludGVlKGUpKSxlfSxkZXN0cnVjdG9yKGUpe3ZhciByOyhyPXRoaXMucmF3RGVzdHJ1Y3Rvcik9PW51bGx8fHIuY2FsbCh0aGlzLGUpfSxhcmdQYWNrQWR2YW5jZTpKLHJlYWRWYWx1ZUZyb21Qb2ludGVyOnllLGZyb21XaXJlVHlwZTpkbn0pfTtmdW5jdGlvbiB6ZShlLHIsdCxuLGEsaSxzLGwsdSxjLGQpe3RoaXMubmFtZT1lLHRoaXMucmVnaXN0ZXJlZENsYXNzPXIsdGhpcy5pc1JlZmVyZW5jZT10LHRoaXMuaXNDb25zdD1uLHRoaXMuaXNTbWFydFBvaW50ZXI9YSx0aGlzLnBvaW50ZWVUeXBlPWksdGhpcy5zaGFyaW5nUG9saWN5PXMsdGhpcy5yYXdHZXRQb2ludGVlPWwsdGhpcy5yYXdDb25zdHJ1Y3Rvcj11LHRoaXMucmF3U2hhcmU9Yyx0aGlzLnJhd0Rlc3RydWN0b3I9ZCwhYSYmci5iYXNlQ2xhc3M9PT12b2lkIDA/bj8odGhpcy50b1dpcmVUeXBlPWduLHRoaXMuZGVzdHJ1Y3RvckZ1bmN0aW9uPW51bGwpOih0aGlzLnRvV2lyZVR5cGU9d24sdGhpcy5kZXN0cnVjdG9yRnVuY3Rpb249bnVsbCk6dGhpcy50b1dpcmVUeXBlPXlufXZhciBVcj0oZSxyLHQpPT57Zi5oYXNPd25Qcm9wZXJ0eShlKXx8SWUoIlJlcGxhY2luZyBub25leGlzdGVudCBwdWJsaWMgc3ltYm9sIiksZltlXS5vdmVybG9hZFRhYmxlIT09dm9pZCAwJiZ0IT09dm9pZCAwP2ZbZV0ub3ZlcmxvYWRUYWJsZVt0XT1yOihmW2VdPXIsZltlXS5hcmdDb3VudD10KX0sYm49KGUscix0KT0+e2U9ZS5yZXBsYWNlKC9wL2csImkiKTt2YXIgbj1mWyJkeW5DYWxsXyIrZV07cmV0dXJuIG4ociwuLi50KX0seGU9W10sanIsenI9ZT0+e3ZhciByPXhlW2VdO3JldHVybiByfHwoZT49eGUubGVuZ3RoJiYoeGUubGVuZ3RoPWUrMSkseGVbZV09cj1qci5nZXQoZSkpLHJ9LGtuPShlLHIsdD1bXSk9PntpZihlLmluY2x1ZGVzKCJqIikpcmV0dXJuIGJuKGUscix0KTt2YXIgbj16cihyKSguLi50KTtyZXR1cm4gbn0sUG49KGUscik9PiguLi50KT0+a24oZSxyLHQpLFc9KGUscik9PntlPWooZSk7ZnVuY3Rpb24gdCgpe3JldHVybiBlLmluY2x1ZGVzKCJqIik/UG4oZSxyKTp6cihyKX12YXIgbj10KCk7cmV0dXJuIHR5cGVvZiBuIT0iZnVuY3Rpb24iJiZrKGB1bmtub3duIGZ1bmN0aW9uIHBvaW50ZXIgd2l0aCBzaWduYXR1cmUgJHtlfTogJHtyfWApLG59LEFuPShlLHIpPT57dmFyIHQ9VWUocixmdW5jdGlvbihuKXt0aGlzLm5hbWU9cix0aGlzLm1lc3NhZ2U9bjt2YXIgYT1uZXcgRXJyb3Iobikuc3RhY2s7YSE9PXZvaWQgMCYmKHRoaXMuc3RhY2s9dGhpcy50b1N0cmluZygpK2AKYCthLnJlcGxhY2UoL15FcnJvcig6W15cbl0qKT9cbi8sIiIpKX0pO3JldHVybiB0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKSx0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10LHQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWVzc2FnZT09PXZvaWQgMD90aGlzLm5hbWU6YCR7dGhpcy5uYW1lfTogJHt0aGlzLm1lc3NhZ2V9YH0sdH0seHIsSHI9ZT0+e3ZhciByPWV0KGUpLHQ9aihyKTtyZXR1cm4gWihyKSx0fSxmZT0oZSxyKT0+e3ZhciB0PVtdLG49e307ZnVuY3Rpb24gYShpKXtpZighbltpXSYmIXVlW2ldKXtpZihPZVtpXSl7T2VbaV0uZm9yRWFjaChhKTtyZXR1cm59dC5wdXNoKGkpLG5baV09ITB9fXRocm93IHIuZm9yRWFjaChhKSxuZXcgeHIoYCR7ZX06IGArdC5tYXAoSHIpLmpvaW4oWyIsICJdKSl9LERuPShlLHIsdCxuLGEsaSxzLGwsdSxjLGQsbSxoKT0+e2Q9aihkKSxpPVcoYSxpKSxsJiYobD1XKHMsbCkpLGMmJihjPVcodSxjKSksaD1XKG0saCk7dmFyIHA9cG4oZCk7VnIocCxmdW5jdGlvbigpe2ZlKGBDYW5ub3QgY29uc3RydWN0ICR7ZH0gZHVlIHRvIHVuYm91bmQgdHlwZXNgLFtuXSl9KSxOKFtlLHIsdF0sbj9bbl06W10sdz0+e3ZhciBPO3c9d1swXTt2YXIgRCxNO24/KEQ9dy5yZWdpc3RlcmVkQ2xhc3MsTT1ELmluc3RhbmNlUHJvdG90eXBlKTpNPVZlLnByb3RvdHlwZTt2YXIgRj1VZShkLGZ1bmN0aW9uKC4uLnZyKXtpZihPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykhPT12KXRocm93IG5ldyBtZSgiVXNlICduZXcnIHRvIGNvbnN0cnVjdCAiK2QpO2lmKF8uY29uc3RydWN0b3JfYm9keT09PXZvaWQgMCl0aHJvdyBuZXcgbWUoZCsiIGhhcyBubyBhY2Nlc3NpYmxlIGNvbnN0cnVjdG9yIik7dmFyIG90PV8uY29uc3RydWN0b3JfYm9keVt2ci5sZW5ndGhdO2lmKG90PT09dm9pZCAwKXRocm93IG5ldyBtZShgVHJpZWQgdG8gaW52b2tlIGN0b3Igb2YgJHtkfSB3aXRoIGludmFsaWQgbnVtYmVyIG9mIHBhcmFtZXRlcnMgKCR7dnIubGVuZ3RofSkgLSBleHBlY3RlZCAoJHtPYmplY3Qua2V5cyhfLmNvbnN0cnVjdG9yX2JvZHkpLnRvU3RyaW5nKCl9KSBwYXJhbWV0ZXJzIGluc3RlYWQhYCk7cmV0dXJuIG90LmFwcGx5KHRoaXMsdnIpfSksdj1PYmplY3QuY3JlYXRlKE0se2NvbnN0cnVjdG9yOnt2YWx1ZTpGfX0pO0YucHJvdG90eXBlPXY7dmFyIF89bmV3IF9uKGQsRix2LGgsRCxpLGwsYyk7Xy5iYXNlQ2xhc3MmJigoTz1fLmJhc2VDbGFzcykuX19kZXJpdmVkQ2xhc3Nlcz8/KE8uX19kZXJpdmVkQ2xhc3Nlcz1bXSksXy5iYXNlQ2xhc3MuX19kZXJpdmVkQ2xhc3Nlcy5wdXNoKF8pKTt2YXIgTD1uZXcgemUoZCxfLCEwLCExLCExKSxUPW5ldyB6ZShkKyIqIixfLCExLCExLCExKSxCPW5ldyB6ZShkKyIgY29uc3QqIixfLCExLCEwLCExKTtyZXR1cm4gTHJbZV09e3BvaW50ZXJUeXBlOlQsY29uc3RQb2ludGVyVHlwZTpCfSxVcihwLEYpLFtMLFQsQl19KX07ZnVuY3Rpb24gV3IoZSl7Zm9yKHZhciByPTE7cjxlLmxlbmd0aDsrK3IpaWYoZVtyXSE9PW51bGwmJmVbcl0uZGVzdHJ1Y3RvckZ1bmN0aW9uPT09dm9pZCAwKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uICRuKGUscil7aWYoIShlIGluc3RhbmNlb2YgRnVuY3Rpb24pKXRocm93IG5ldyBUeXBlRXJyb3IoYG5ld18gY2FsbGVkIHdpdGggY29uc3RydWN0b3IgdHlwZSAke3R5cGVvZiBlfSB3aGljaCBpcyBub3QgYSBmdW5jdGlvbmApO3ZhciB0PVVlKGUubmFtZXx8InVua25vd25GdW5jdGlvbk5hbWUiLGZ1bmN0aW9uKCl7fSk7dC5wcm90b3R5cGU9ZS5wcm90b3R5cGU7dmFyIG49bmV3IHQsYT1lLmFwcGx5KG4scik7cmV0dXJuIGEgaW5zdGFuY2VvZiBPYmplY3Q/YTpufWZ1bmN0aW9uIENuKGUscix0LG4pe2Zvcih2YXIgYT1XcihlKSxpPWUubGVuZ3RoLHM9IiIsbD0iIix1PTA7dTxpLTI7Kyt1KXMrPSh1IT09MD8iLCAiOiIiKSsiYXJnIit1LGwrPSh1IT09MD8iLCAiOiIiKSsiYXJnIit1KyJXaXJlZCI7dmFyIGM9YAogICAgICAgIHJldHVybiBmdW5jdGlvbiAoJHtzfSkgewogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoICE9PSAke2ktMn0pIHsKICAgICAgICAgIHRocm93QmluZGluZ0Vycm9yKCdmdW5jdGlvbiAnICsgaHVtYW5OYW1lICsgJyBjYWxsZWQgd2l0aCAnICsgYXJndW1lbnRzLmxlbmd0aCArICcgYXJndW1lbnRzLCBleHBlY3RlZCAke2ktMn0nKTsKICAgICAgICB9YDthJiYoYys9YHZhciBkZXN0cnVjdG9ycyA9IFtdOwpgKTt2YXIgZD1hPyJkZXN0cnVjdG9ycyI6Im51bGwiLG09WyJodW1hbk5hbWUiLCJ0aHJvd0JpbmRpbmdFcnJvciIsImludm9rZXIiLCJmbiIsInJ1bkRlc3RydWN0b3JzIiwicmV0VHlwZSIsImNsYXNzUGFyYW0iXTtyJiYoYys9InZhciB0aGlzV2lyZWQgPSBjbGFzc1BhcmFtWyd0b1dpcmVUeXBlJ10oIitkK2AsIHRoaXMpOwpgKTtmb3IodmFyIHU9MDt1PGktMjsrK3UpYys9InZhciBhcmciK3UrIldpcmVkID0gYXJnVHlwZSIrdSsiWyd0b1dpcmVUeXBlJ10oIitkKyIsIGFyZyIrdStgKTsKYCxtLnB1c2goImFyZ1R5cGUiK3UpO2lmKHImJihsPSJ0aGlzV2lyZWQiKyhsLmxlbmd0aD4wPyIsICI6IiIpK2wpLGMrPSh0fHxuPyJ2YXIgcnYgPSAiOiIiKSsiaW52b2tlcihmbiIrKGwubGVuZ3RoPjA/IiwgIjoiIikrbCtgKTsKYCxhKWMrPWBydW5EZXN0cnVjdG9ycyhkZXN0cnVjdG9ycyk7CmA7ZWxzZSBmb3IodmFyIHU9cj8xOjI7dTxlLmxlbmd0aDsrK3Upe3ZhciBoPXU9PT0xPyJ0aGlzV2lyZWQiOiJhcmciKyh1LTIpKyJXaXJlZCI7ZVt1XS5kZXN0cnVjdG9yRnVuY3Rpb24hPT1udWxsJiYoYys9YCR7aH1fZHRvcigke2h9KTsKYCxtLnB1c2goYCR7aH1fZHRvcmApKX1yZXR1cm4gdCYmKGMrPWB2YXIgcmV0ID0gcmV0VHlwZVsnZnJvbVdpcmVUeXBlJ10ocnYpOwpyZXR1cm4gcmV0OwpgKSxjKz1gfQpgLFttLGNdfWZ1bmN0aW9uIEhlKGUscix0LG4sYSxpKXt2YXIgcz1yLmxlbmd0aDtzPDImJmsoImFyZ1R5cGVzIGFycmF5IHNpemUgbWlzbWF0Y2ghIE11c3QgYXQgbGVhc3QgZ2V0IHJldHVybiB2YWx1ZSBhbmQgJ3RoaXMnIHR5cGVzISIpO2Zvcih2YXIgbD1yWzFdIT09bnVsbCYmdCE9PW51bGwsdT1XcihyKSxjPXJbMF0ubmFtZSE9PSJ2b2lkIixkPVtlLGssbixhLHJyLHJbMF0sclsxXV0sbT0wO208cy0yOysrbSlkLnB1c2goclttKzJdKTtpZighdSlmb3IodmFyIG09bD8xOjI7bTxyLmxlbmd0aDsrK20pclttXS5kZXN0cnVjdG9yRnVuY3Rpb24hPT1udWxsJiZkLnB1c2goclttXS5kZXN0cnVjdG9yRnVuY3Rpb24pO2xldFtoLHBdPUNuKHIsbCxjLGkpO2gucHVzaChwKTt2YXIgdz0kbihGdW5jdGlvbixoKSguLi5kKTtyZXR1cm4gVWUoZSx3KX12YXIgV2U9KGUscik9Pntmb3IodmFyIHQ9W10sbj0wO248ZTtuKyspdC5wdXNoKEFbcituKjQ+PjJdKTtyZXR1cm4gdH0saXI9ZT0+e2U9ZS50cmltKCk7Y29uc3Qgcj1lLmluZGV4T2YoIigiKTtyZXR1cm4gciE9PS0xP2Uuc3Vic3RyKDAscik6ZX0sRm49KGUscix0LG4sYSxpLHMsbCk9Pnt2YXIgdT1XZSh0LG4pO3I9aihyKSxyPWlyKHIpLGk9VyhhLGkpLE4oW10sW2VdLGM9PntjPWNbMF07dmFyIGQ9YCR7Yy5uYW1lfS4ke3J9YDtmdW5jdGlvbiBtKCl7ZmUoYENhbm5vdCBjYWxsICR7ZH0gZHVlIHRvIHVuYm91bmQgdHlwZXNgLHUpfXIuc3RhcnRzV2l0aCgiQEAiKSYmKHI9U3ltYm9sW3Iuc3Vic3RyaW5nKDIpXSk7dmFyIGg9Yy5yZWdpc3RlcmVkQ2xhc3MuY29uc3RydWN0b3I7cmV0dXJuIGhbcl09PT12b2lkIDA/KG0uYXJnQ291bnQ9dC0xLGhbcl09bSk6KG9yKGgscixkKSxoW3JdLm92ZXJsb2FkVGFibGVbdC0xXT1tKSxOKFtdLHUscD0+e3ZhciB3PVtwWzBdLG51bGxdLmNvbmNhdChwLnNsaWNlKDEpKSxEPUhlKGQsdyxudWxsLGkscyxsKTtpZihoW3JdLm92ZXJsb2FkVGFibGU9PT12b2lkIDA/KEQuYXJnQ291bnQ9dC0xLGhbcl09RCk6aFtyXS5vdmVybG9hZFRhYmxlW3QtMV09RCxjLnJlZ2lzdGVyZWRDbGFzcy5fX2Rlcml2ZWRDbGFzc2VzKWZvcihjb25zdCBNIG9mIGMucmVnaXN0ZXJlZENsYXNzLl9fZGVyaXZlZENsYXNzZXMpTS5jb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eShyKXx8KE0uY29uc3RydWN0b3Jbcl09RCk7cmV0dXJuW119KSxbXX0pfSxUbj0oZSxyLHQsbixhLGkpPT57dmFyIHM9V2Uocix0KTthPVcobixhKSxOKFtdLFtlXSxsPT57bD1sWzBdO3ZhciB1PWBjb25zdHJ1Y3RvciAke2wubmFtZX1gO2lmKGwucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHk9PT12b2lkIDAmJihsLnJlZ2lzdGVyZWRDbGFzcy5jb25zdHJ1Y3Rvcl9ib2R5PVtdKSxsLnJlZ2lzdGVyZWRDbGFzcy5jb25zdHJ1Y3Rvcl9ib2R5W3ItMV0hPT12b2lkIDApdGhyb3cgbmV3IG1lKGBDYW5ub3QgcmVnaXN0ZXIgbXVsdGlwbGUgY29uc3RydWN0b3JzIHdpdGggaWRlbnRpY2FsIG51bWJlciBvZiBwYXJhbWV0ZXJzICgke3ItMX0pIGZvciBjbGFzcyAnJHtsLm5hbWV9JyEgT3ZlcmxvYWQgcmVzb2x1dGlvbiBpcyBjdXJyZW50bHkgb25seSBwZXJmb3JtZWQgdXNpbmcgdGhlIHBhcmFtZXRlciBjb3VudCwgbm90IGFjdHVhbCB0eXBlIGluZm8hYCk7cmV0dXJuIGwucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHlbci0xXT0oKT0+e2ZlKGBDYW5ub3QgY29uc3RydWN0ICR7bC5uYW1lfSBkdWUgdG8gdW5ib3VuZCB0eXBlc2Ascyl9LE4oW10scyxjPT4oYy5zcGxpY2UoMSwwLG51bGwpLGwucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHlbci0xXT1IZSh1LGMsbnVsbCxhLGkpLFtdKSksW119KX0sU249KGUscix0LG4sYSxpLHMsbCx1KT0+e3ZhciBjPVdlKHQsbik7cj1qKHIpLHI9aXIociksaT1XKGEsaSksTihbXSxbZV0sZD0+e2Q9ZFswXTt2YXIgbT1gJHtkLm5hbWV9LiR7cn1gO3Iuc3RhcnRzV2l0aCgiQEAiKSYmKHI9U3ltYm9sW3Iuc3Vic3RyaW5nKDIpXSksbCYmZC5yZWdpc3RlcmVkQ2xhc3MucHVyZVZpcnR1YWxGdW5jdGlvbnMucHVzaChyKTtmdW5jdGlvbiBoKCl7ZmUoYENhbm5vdCBjYWxsICR7bX0gZHVlIHRvIHVuYm91bmQgdHlwZXNgLGMpfXZhciBwPWQucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHc9cFtyXTtyZXR1cm4gdz09PXZvaWQgMHx8dy5vdmVybG9hZFRhYmxlPT09dm9pZCAwJiZ3LmNsYXNzTmFtZSE9PWQubmFtZSYmdy5hcmdDb3VudD09PXQtMj8oaC5hcmdDb3VudD10LTIsaC5jbGFzc05hbWU9ZC5uYW1lLHBbcl09aCk6KG9yKHAscixtKSxwW3JdLm92ZXJsb2FkVGFibGVbdC0yXT1oKSxOKFtdLGMsRD0+e3ZhciBNPUhlKG0sRCxkLGkscyx1KTtyZXR1cm4gcFtyXS5vdmVybG9hZFRhYmxlPT09dm9pZCAwPyhNLmFyZ0NvdW50PXQtMixwW3JdPU0pOnBbcl0ub3ZlcmxvYWRUYWJsZVt0LTJdPU0sW119KSxbXX0pfSxCcj0oZSxyLHQpPT4oZSBpbnN0YW5jZW9mIE9iamVjdHx8ayhgJHt0fSB3aXRoIGludmFsaWQgInRoaXMiOiAke2V9YCksZSBpbnN0YW5jZW9mIHIucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yfHxrKGAke3R9IGluY29tcGF0aWJsZSB3aXRoICJ0aGlzIiBvZiB0eXBlICR7ZS5jb25zdHJ1Y3Rvci5uYW1lfWApLGUuJCQucHRyfHxrKGBjYW5ub3QgY2FsbCBlbXNjcmlwdGVuIGJpbmRpbmcgbWV0aG9kICR7dH0gb24gZGVsZXRlZCBvYmplY3RgKSxqZShlLiQkLnB0cixlLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzLHIucmVnaXN0ZXJlZENsYXNzKSksTW49KGUscix0LG4sYSxpLHMsbCx1LGMpPT57cj1qKHIpLGE9VyhuLGEpLE4oW10sW2VdLGQ9PntkPWRbMF07dmFyIG09YCR7ZC5uYW1lfS4ke3J9YCxoPXtnZXQoKXtmZShgQ2Fubm90IGFjY2VzcyAke219IGR1ZSB0byB1bmJvdW5kIHR5cGVzYCxbdCxzXSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfTtyZXR1cm4gdT9oLnNldD0oKT0+ZmUoYENhbm5vdCBhY2Nlc3MgJHttfSBkdWUgdG8gdW5ib3VuZCB0eXBlc2AsW3Qsc10pOmguc2V0PXA9PmsobSsiIGlzIGEgcmVhZC1vbmx5IHByb3BlcnR5IiksT2JqZWN0LmRlZmluZVByb3BlcnR5KGQucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHIsaCksTihbXSx1P1t0LHNdOlt0XSxwPT57dmFyIHc9cFswXSxEPXtnZXQoKXt2YXIgRj1Ccih0aGlzLGQsbSsiIGdldHRlciIpO3JldHVybiB3LmZyb21XaXJlVHlwZShhKGksRikpfSxlbnVtZXJhYmxlOiEwfTtpZih1KXt1PVcobCx1KTt2YXIgTT1wWzFdO0Quc2V0PWZ1bmN0aW9uKEYpe3ZhciB2PUJyKHRoaXMsZCxtKyIgc2V0dGVyIiksXz1bXTt1KGMsdixNLnRvV2lyZVR5cGUoXyxGKSkscnIoXyl9fXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZC5yZWdpc3RlcmVkQ2xhc3MuaW5zdGFuY2VQcm90b3R5cGUscixEKSxbXX0pLFtdfSl9LHNyPVtdLHJlPVtdLE5yPWU9PntlPjkmJi0tcmVbZSsxXT09PTAmJihyZVtlXT12b2lkIDAsc3IucHVzaChlKSl9LFJuPSgpPT5yZS5sZW5ndGgvMi01LXNyLmxlbmd0aCxPbj0oKT0+e3JlLnB1c2goMCwxLHZvaWQgMCwxLG51bGwsMSwhMCwxLCExLDEpLGYuY291bnRfZW12YWxfaGFuZGxlcz1Sbn0sdGU9e3RvVmFsdWU6ZT0+KGV8fGsoIkNhbm5vdCB1c2UgZGVsZXRlZCB2YWwuIGhhbmRsZSA9ICIrZSkscmVbZV0pLHRvSGFuZGxlOmU9Pntzd2l0Y2goZSl7Y2FzZSB2b2lkIDA6cmV0dXJuIDI7Y2FzZSBudWxsOnJldHVybiA0O2Nhc2UhMDpyZXR1cm4gNjtjYXNlITE6cmV0dXJuIDg7ZGVmYXVsdDp7Y29uc3Qgcj1zci5wb3AoKXx8cmUubGVuZ3RoO3JldHVybiByZVtyXT1lLHJlW3IrMV09MSxyfX19fSxJbj17bmFtZToiZW1zY3JpcHRlbjo6dmFsIixmcm9tV2lyZVR5cGU6ZT0+e3ZhciByPXRlLnRvVmFsdWUoZSk7cmV0dXJuIE5yKGUpLHJ9LHRvV2lyZVR5cGU6KGUscik9PnRlLnRvSGFuZGxlKHIpLGFyZ1BhY2tBZHZhbmNlOkoscmVhZFZhbHVlRnJvbVBvaW50ZXI6eWUsZGVzdHJ1Y3RvckZ1bmN0aW9uOm51bGx9LFlyPWU9PksoZSxJbiksbHI9ZT0+e2lmKGU9PT1udWxsKXJldHVybiJudWxsIjt2YXIgcj10eXBlb2YgZTtyZXR1cm4gcj09PSJvYmplY3QifHxyPT09ImFycmF5Inx8cj09PSJmdW5jdGlvbiI/ZS50b1N0cmluZygpOiIiK2V9LExuPShlLHIpPT57c3dpdGNoKHIpe2Nhc2UgNDpyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZnJvbVdpcmVUeXBlKGdyW3Q+PjJdKX07Y2FzZSA4OnJldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5mcm9tV2lyZVR5cGUoeXJbdD4+M10pfTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoYGludmFsaWQgZmxvYXQgd2lkdGggKCR7cn0pOiAke2V9YCl9fSxWbj0oZSxyLHQpPT57cj1qKHIpLEsoZSx7bmFtZTpyLGZyb21XaXJlVHlwZTpuPT5uLHRvV2lyZVR5cGU6KG4sYSk9PmEsYXJnUGFja0FkdmFuY2U6SixyZWFkVmFsdWVGcm9tUG9pbnRlcjpMbihyLHQpLGRlc3RydWN0b3JGdW5jdGlvbjpudWxsfSl9LFVuPShlLHIsdCxuLGEsaSxzKT0+e3ZhciBsPVdlKHIsdCk7ZT1qKGUpLGU9aXIoZSksYT1XKG4sYSksVnIoZSxmdW5jdGlvbigpe2ZlKGBDYW5ub3QgY2FsbCAke2V9IGR1ZSB0byB1bmJvdW5kIHR5cGVzYCxsKX0sci0xKSxOKFtdLGwsdT0+e3ZhciBjPVt1WzBdLG51bGxdLmNvbmNhdCh1LnNsaWNlKDEpKTtyZXR1cm4gVXIoZSxIZShlLGMsbnVsbCxhLGkscyksci0xKSxbXX0pfSxqbj0oZSxyLHQpPT57c3dpdGNoKHIpe2Nhc2UgMTpyZXR1cm4gdD9uPT5JW25dOm49Pnhbbl07Y2FzZSAyOnJldHVybiB0P249Pllbbj4+MV06bj0+Q2Vbbj4+MV07Y2FzZSA0OnJldHVybiB0P249Pmdbbj4+Ml06bj0+QVtuPj4yXTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoYGludmFsaWQgaW50ZWdlciB3aWR0aCAoJHtyfSk6ICR7ZX1gKX19LHpuPShlLHIsdCxuLGEpPT57cj1qKHIpO3ZhciBpPWQ9PmQ7aWYobj09PTApe3ZhciBzPTMyLTgqdDtpPWQ9PmQ8PHM+Pj5zfXZhciBsPXIuaW5jbHVkZXMoInVuc2lnbmVkIiksdT0oZCxtKT0+e30sYztsP2M9ZnVuY3Rpb24oZCxtKXtyZXR1cm4gdShtLHRoaXMubmFtZSksbT4+PjB9OmM9ZnVuY3Rpb24oZCxtKXtyZXR1cm4gdShtLHRoaXMubmFtZSksbX0sSyhlLHtuYW1lOnIsZnJvbVdpcmVUeXBlOmksdG9XaXJlVHlwZTpjLGFyZ1BhY2tBZHZhbmNlOkoscmVhZFZhbHVlRnJvbVBvaW50ZXI6am4ocix0LG4hPT0wKSxkZXN0cnVjdG9yRnVuY3Rpb246bnVsbH0pfSx4bj0oZSxyLHQpPT57dmFyIG49W0ludDhBcnJheSxVaW50OEFycmF5LEludDE2QXJyYXksVWludDE2QXJyYXksSW50MzJBcnJheSxVaW50MzJBcnJheSxGbG9hdDMyQXJyYXksRmxvYXQ2NEFycmF5XSxhPW5bcl07ZnVuY3Rpb24gaShzKXt2YXIgbD1BW3M+PjJdLHU9QVtzKzQ+PjJdO3JldHVybiBuZXcgYShJLmJ1ZmZlcix1LGwpfXQ9aih0KSxLKGUse25hbWU6dCxmcm9tV2lyZVR5cGU6aSxhcmdQYWNrQWR2YW5jZTpKLHJlYWRWYWx1ZUZyb21Qb2ludGVyOml9LHtpZ25vcmVEdXBsaWNhdGVSZWdpc3RyYXRpb25zOiEwfSl9LEhuPShlLHIpPT57WXIoZSl9LFduPShlLHIpPT57cj1qKHIpO3ZhciB0PXI9PT0ic3RkOjpzdHJpbmciO0soZSx7bmFtZTpyLGZyb21XaXJlVHlwZShuKXt2YXIgYT1BW24+PjJdLGk9bis0LHM7aWYodClmb3IodmFyIGw9aSx1PTA7dTw9YTsrK3Upe3ZhciBjPWkrdTtpZih1PT1hfHx4W2NdPT0wKXt2YXIgZD1jLWwsbT1zZShsLGQpO3M9PT12b2lkIDA/cz1tOihzKz0iXDAiLHMrPW0pLGw9YysxfX1lbHNle2Zvcih2YXIgaD1uZXcgQXJyYXkoYSksdT0wO3U8YTsrK3UpaFt1XT1TdHJpbmcuZnJvbUNoYXJDb2RlKHhbaSt1XSk7cz1oLmpvaW4oIiIpfXJldHVybiBaKG4pLHN9LHRvV2lyZVR5cGUobixhKXthIGluc3RhbmNlb2YgQXJyYXlCdWZmZXImJihhPW5ldyBVaW50OEFycmF5KGEpKTt2YXIgaSxzPXR5cGVvZiBhPT0ic3RyaW5nIjtzfHxhIGluc3RhbmNlb2YgVWludDhBcnJheXx8YSBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5fHxhIGluc3RhbmNlb2YgSW50OEFycmF5fHxrKCJDYW5ub3QgcGFzcyBub24tc3RyaW5nIHRvIHN0ZDo6c3RyaW5nIiksdCYmcz9pPVplKGEpOmk9YS5sZW5ndGg7dmFyIGw9ZnIoNCtpKzEpLHU9bCs0O2lmKEFbbD4+Ml09aSx0JiZzKXZlKGEsdSxpKzEpO2Vsc2UgaWYocylmb3IodmFyIGM9MDtjPGk7KytjKXt2YXIgZD1hLmNoYXJDb2RlQXQoYyk7ZD4yNTUmJihaKHUpLGsoIlN0cmluZyBoYXMgVVRGLTE2IGNvZGUgdW5pdHMgdGhhdCBkbyBub3QgZml0IGluIDggYml0cyIpKSx4W3UrY109ZH1lbHNlIGZvcih2YXIgYz0wO2M8aTsrK2MpeFt1K2NdPWFbY107cmV0dXJuIG4hPT1udWxsJiZuLnB1c2goWixsKSxsfSxhcmdQYWNrQWR2YW5jZTpKLHJlYWRWYWx1ZUZyb21Qb2ludGVyOnllLGRlc3RydWN0b3JGdW5jdGlvbihuKXtaKG4pfX0pfSxHcj10eXBlb2YgVGV4dERlY29kZXI8InUiP25ldyBUZXh0RGVjb2RlcigidXRmLTE2bGUiKTp2b2lkIDAsQm49KGUscik9Pntmb3IodmFyIHQ9ZSxuPXQ+PjEsYT1uK3IvMjshKG4+PWEpJiZDZVtuXTspKytuO2lmKHQ9bjw8MSx0LWU+MzImJkdyKXJldHVybiBHci5kZWNvZGUoeC5zdWJhcnJheShlLHQpKTtmb3IodmFyIGk9IiIscz0wOyEocz49ci8yKTsrK3Mpe3ZhciBsPVlbZStzKjI+PjFdO2lmKGw9PTApYnJlYWs7aSs9U3RyaW5nLmZyb21DaGFyQ29kZShsKX1yZXR1cm4gaX0sTm49KGUscix0KT0+e2lmKHQ/Pyh0PTIxNDc0ODM2NDcpLHQ8MilyZXR1cm4gMDt0LT0yO2Zvcih2YXIgbj1yLGE9dDxlLmxlbmd0aCoyP3QvMjplLmxlbmd0aCxpPTA7aTxhOysraSl7dmFyIHM9ZS5jaGFyQ29kZUF0KGkpO1lbcj4+MV09cyxyKz0yfXJldHVybiBZW3I+PjFdPTAsci1ufSxZbj1lPT5lLmxlbmd0aCoyLEduPShlLHIpPT57Zm9yKHZhciB0PTAsbj0iIjshKHQ+PXIvNCk7KXt2YXIgYT1nW2UrdCo0Pj4yXTtpZihhPT0wKWJyZWFrO2lmKCsrdCxhPj02NTUzNil7dmFyIGk9YS02NTUzNjtuKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2fGk+PjEwLDU2MzIwfGkmMTAyMyl9ZWxzZSBuKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGEpfXJldHVybiBufSxxbj0oZSxyLHQpPT57aWYodD8/KHQ9MjE0NzQ4MzY0NyksdDw0KXJldHVybiAwO2Zvcih2YXIgbj1yLGE9bit0LTQsaT0wO2k8ZS5sZW5ndGg7KytpKXt2YXIgcz1lLmNoYXJDb2RlQXQoaSk7aWYocz49NTUyOTYmJnM8PTU3MzQzKXt2YXIgbD1lLmNoYXJDb2RlQXQoKytpKTtzPTY1NTM2KygocyYxMDIzKTw8MTApfGwmMTAyM31pZihnW3I+PjJdPXMscis9NCxyKzQ+YSlicmVha31yZXR1cm4gZ1tyPj4yXT0wLHItbn0sWG49ZT0+e2Zvcih2YXIgcj0wLHQ9MDt0PGUubGVuZ3RoOysrdCl7dmFyIG49ZS5jaGFyQ29kZUF0KHQpO24+PTU1Mjk2JiZuPD01NzM0MyYmKyt0LHIrPTR9cmV0dXJuIHJ9LEtuPShlLHIsdCk9Pnt0PWoodCk7dmFyIG4sYSxpLHM7cj09PTI/KG49Qm4sYT1ObixzPVluLGk9bD0+Q2VbbD4+MV0pOnI9PT00JiYobj1HbixhPXFuLHM9WG4saT1sPT5BW2w+PjJdKSxLKGUse25hbWU6dCxmcm9tV2lyZVR5cGU6bD0+e2Zvcih2YXIgdT1BW2w+PjJdLGMsZD1sKzQsbT0wO208PXU7KyttKXt2YXIgaD1sKzQrbSpyO2lmKG09PXV8fGkoaCk9PTApe3ZhciBwPWgtZCx3PW4oZCxwKTtjPT09dm9pZCAwP2M9dzooYys9IlwwIixjKz13KSxkPWgrcn19cmV0dXJuIFoobCksY30sdG9XaXJlVHlwZToobCx1KT0+e3R5cGVvZiB1IT0ic3RyaW5nIiYmayhgQ2Fubm90IHBhc3Mgbm9uLXN0cmluZyB0byBDKysgc3RyaW5nIHR5cGUgJHt0fWApO3ZhciBjPXModSksZD1mcig0K2Mrcik7cmV0dXJuIEFbZD4+Ml09Yy9yLGEodSxkKzQsYytyKSxsIT09bnVsbCYmbC5wdXNoKFosZCksZH0sYXJnUGFja0FkdmFuY2U6SixyZWFkVmFsdWVGcm9tUG9pbnRlcjp5ZSxkZXN0cnVjdG9yRnVuY3Rpb24obCl7WihsKX19KX0sSm49KGUscix0LG4sYSxpKT0+e1JlW2VdPXtuYW1lOmoocikscmF3Q29uc3RydWN0b3I6Vyh0LG4pLHJhd0Rlc3RydWN0b3I6VyhhLGkpLGZpZWxkczpbXX19LFpuPShlLHIsdCxuLGEsaSxzLGwsdSxjKT0+e1JlW2VdLmZpZWxkcy5wdXNoKHtmaWVsZE5hbWU6aihyKSxnZXR0ZXJSZXR1cm5UeXBlOnQsZ2V0dGVyOlcobixhKSxnZXR0ZXJDb250ZXh0Omksc2V0dGVyQXJndW1lbnRUeXBlOnMsc2V0dGVyOlcobCx1KSxzZXR0ZXJDb250ZXh0OmN9KX0sUW49KGUscik9PntyPWoociksSyhlLHtpc1ZvaWQ6ITAsbmFtZTpyLGFyZ1BhY2tBZHZhbmNlOjAsZnJvbVdpcmVUeXBlOigpPT57fSx0b1dpcmVUeXBlOih0LG4pPT57fX0pfSxlYT0xLHJhPSgpPT5lYSx0YT0oZSxyLHQpPT54LmNvcHlXaXRoaW4oZSxyLHIrdCksbmE9KCk9PnRlLnRvSGFuZGxlKHt9KSxhYT0oZSxyLHQpPT57ZT10ZS50b1ZhbHVlKGUpLHI9dGUudG9WYWx1ZShyKSx0PXRlLnRvVmFsdWUodCksZVtyXT10fSxvYT0oZSxyKT0+e3ZhciB0PXVlW2VdO3JldHVybiB0PT09dm9pZCAwJiZrKGAke3J9IGhhcyB1bmtub3duIHR5cGUgJHtIcihlKX1gKSx0fSxpYT0oZSxyKT0+e2U9b2EoZSwiX2VtdmFsX3Rha2VfdmFsdWUiKTt2YXIgdD1lLnJlYWRWYWx1ZUZyb21Qb2ludGVyKHIpO3JldHVybiB0ZS50b0hhbmRsZSh0KX0scXI9KGUscik9PnIrMjA5NzE1Mj4+PjA8NDE5NDMwNS0hIWU/KGU+Pj4wKStyKjQyOTQ5NjcyOTY6TmFOO2Z1bmN0aW9uIHNhKGUscix0KXt2YXIgbj1xcihlLHIpLGE9bmV3IERhdGUobioxZTMpO2dbdD4+Ml09YS5nZXRVVENTZWNvbmRzKCksZ1t0KzQ+PjJdPWEuZ2V0VVRDTWludXRlcygpLGdbdCs4Pj4yXT1hLmdldFVUQ0hvdXJzKCksZ1t0KzEyPj4yXT1hLmdldFVUQ0RhdGUoKSxnW3QrMTY+PjJdPWEuZ2V0VVRDTW9udGgoKSxnW3QrMjA+PjJdPWEuZ2V0VVRDRnVsbFllYXIoKS0xOTAwLGdbdCsyND4+Ml09YS5nZXRVVENEYXkoKTt2YXIgaT1EYXRlLlVUQyhhLmdldFVUQ0Z1bGxZZWFyKCksMCwxLDAsMCwwLDApLHM9KGEuZ2V0VGltZSgpLWkpLygxZTMqNjAqNjAqMjQpfDA7Z1t0KzI4Pj4yXT1zfXZhciBCZT1lPT5lJTQ9PT0wJiYoZSUxMDAhPT0wfHxlJTQwMD09PTApLGxhPShlLHIsdCxuKT0+e3ZhciBhPW5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSxpPW5ldyBEYXRlKGEsMCwxKSxzPW5ldyBEYXRlKGEsNiwxKSxsPWkuZ2V0VGltZXpvbmVPZmZzZXQoKSx1PXMuZ2V0VGltZXpvbmVPZmZzZXQoKSxjPU1hdGgubWF4KGwsdSk7QVtlPj4yXT1jKjYwLGdbcj4+Ml09KyhsIT11KTt2YXIgZD1wPT5wLnRvTG9jYWxlVGltZVN0cmluZyh2b2lkIDAse2hvdXIxMjohMSx0aW1lWm9uZU5hbWU6InNob3J0In0pLnNwbGl0KCIgIilbMV0sbT1kKGkpLGg9ZChzKTt1PGw/KHZlKG0sdCwxNyksdmUoaCxuLDE3KSk6KHZlKG0sbiwxNyksdmUoaCx0LDE3KSl9LHVhPSgpPT5EYXRlLm5vdygpLFhyPSgpPT4yMTQ3NDgzNjQ4LGZhPSgpPT5YcigpLEtyO0tyPSgpPT5wZXJmb3JtYW5jZS5ub3coKTt2YXIgY2E9ZT0+e3ZhciByPSRlLmJ1ZmZlcix0PShlLXIuYnl0ZUxlbmd0aCs2NTUzNSkvNjU1MzY7dHJ5e3JldHVybiAkZS5ncm93KHQpLHdyKCksMX1jYXRjaHt9fSxkYT1lPT57dmFyIHI9eC5sZW5ndGg7ZT4+Pj0wO3ZhciB0PVhyKCk7aWYoZT50KXJldHVybiExO2Zvcih2YXIgbj0odSxjKT0+dSsoYy11JWMpJWMsYT0xO2E8PTQ7YSo9Mil7dmFyIGk9ciooMSsuMi9hKTtpPU1hdGgubWluKGksZSsxMDA2NjMyOTYpO3ZhciBzPU1hdGgubWluKHQsbihNYXRoLm1heChlLGkpLDY1NTM2KSksbD1jYShzKTtpZihsKXJldHVybiEwfXJldHVybiExfSx1cj17fSx2YT0oKT0+aHJ8fCIuL3RoaXMucHJvZ3JhbSIsUGU9KCk9PntpZighUGUuc3RyaW5ncyl7dmFyIGU9KHR5cGVvZiBuYXZpZ2F0b3I9PSJvYmplY3QiJiZuYXZpZ2F0b3IubGFuZ3VhZ2VzJiZuYXZpZ2F0b3IubGFuZ3VhZ2VzWzBdfHwiQyIpLnJlcGxhY2UoIi0iLCJfIikrIi5VVEYtOCIscj17VVNFUjoid2ViX3VzZXIiLExPR05BTUU6IndlYl91c2VyIixQQVRIOiIvIixQV0Q6Ii8iLEhPTUU6Ii9ob21lL3dlYl91c2VyIixMQU5HOmUsXzp2YSgpfTtmb3IodmFyIHQgaW4gdXIpdXJbdF09PT12b2lkIDA/ZGVsZXRlIHJbdF06clt0XT11clt0XTt2YXIgbj1bXTtmb3IodmFyIHQgaW4gciluLnB1c2goYCR7dH09JHtyW3RdfWApO1BlLnN0cmluZ3M9bn1yZXR1cm4gUGUuc3RyaW5nc30saGE9KGUscik9Pntmb3IodmFyIHQ9MDt0PGUubGVuZ3RoOysrdClJW3IrK109ZS5jaGFyQ29kZUF0KHQpO0lbcl09MH0sbWE9KGUscik9Pnt2YXIgdD0wO3JldHVybiBQZSgpLmZvckVhY2goKG4sYSk9Pnt2YXIgaT1yK3Q7QVtlK2EqND4+Ml09aSxoYShuLGkpLHQrPW4ubGVuZ3RoKzF9KSwwfSxwYT0oZSxyKT0+e3ZhciB0PVBlKCk7QVtlPj4yXT10Lmxlbmd0aDt2YXIgbj0wO3JldHVybiB0LmZvckVhY2goYT0+bis9YS5sZW5ndGgrMSksQVtyPj4yXT1uLDB9O2Z1bmN0aW9uIF9hKGUpe3RyeXt2YXIgcj1QLmdldFN0cmVhbUZyb21GRChlKTtyZXR1cm4gby5jbG9zZShyKSwwfWNhdGNoKHQpe2lmKHR5cGVvZiBvPiJ1Inx8dC5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IHQ7cmV0dXJuIHQuZXJybm99fWZ1bmN0aW9uIGdhKGUscil7dHJ5e3ZhciB0PTAsbj0wLGE9MCxpPVAuZ2V0U3RyZWFtRnJvbUZEKGUpLHM9aS50dHk/MjpvLmlzRGlyKGkubW9kZSk/MzpvLmlzTGluayhpLm1vZGUpPzc6NDtyZXR1cm4gSVtyXT1zLFlbcisyPj4xXT1hLCQ9W3Q+Pj4wLCh5PXQsK01hdGguYWJzKHkpPj0xP3k+MD8rTWF0aC5mbG9vcih5LzQyOTQ5NjcyOTYpPj4+MDp+fitNYXRoLmNlaWwoKHktKyh+fnk+Pj4wKSkvNDI5NDk2NzI5Nik+Pj4wOjApXSxnW3IrOD4+Ml09JFswXSxnW3IrMTI+PjJdPSRbMV0sJD1bbj4+PjAsKHk9biwrTWF0aC5hYnMoeSk+PTE/eT4wPytNYXRoLmZsb29yKHkvNDI5NDk2NzI5Nik+Pj4wOn5+K01hdGguY2VpbCgoeS0rKH5+eT4+PjApKS80Mjk0OTY3Mjk2KT4+PjA6MCldLGdbcisxNj4+Ml09JFswXSxnW3IrMjA+PjJdPSRbMV0sMH1jYXRjaChsKXtpZih0eXBlb2Ygbz4idSJ8fGwubmFtZSE9PSJFcnJub0Vycm9yIil0aHJvdyBsO3JldHVybiBsLmVycm5vfX12YXIgeWE9KGUscix0LG4pPT57Zm9yKHZhciBhPTAsaT0wO2k8dDtpKyspe3ZhciBzPUFbcj4+Ml0sbD1BW3IrND4+Ml07cis9ODt2YXIgdT1vLnJlYWQoZSxJLHMsbCxuKTtpZih1PDApcmV0dXJuLTE7aWYoYSs9dSx1PGwpYnJlYWt9cmV0dXJuIGF9O2Z1bmN0aW9uIHdhKGUscix0LG4pe3RyeXt2YXIgYT1QLmdldFN0cmVhbUZyb21GRChlKSxpPXlhKGEscix0KTtyZXR1cm4gQVtuPj4yXT1pLDB9Y2F0Y2gocyl7aWYodHlwZW9mIG8+InUifHxzLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgcztyZXR1cm4gcy5lcnJub319ZnVuY3Rpb24gRWEoZSxyLHQsbixhKXt2YXIgaT1xcihyLHQpO3RyeXtpZihpc05hTihpKSlyZXR1cm4gNjE7dmFyIHM9UC5nZXRTdHJlYW1Gcm9tRkQoZSk7cmV0dXJuIG8ubGxzZWVrKHMsaSxuKSwkPVtzLnBvc2l0aW9uPj4+MCwoeT1zLnBvc2l0aW9uLCtNYXRoLmFicyh5KT49MT95PjA/K01hdGguZmxvb3IoeS80Mjk0OTY3Mjk2KT4+PjA6fn4rTWF0aC5jZWlsKCh5LSsofn55Pj4+MCkpLzQyOTQ5NjcyOTYpPj4+MDowKV0sZ1thPj4yXT0kWzBdLGdbYSs0Pj4yXT0kWzFdLHMuZ2V0ZGVudHMmJmk9PT0wJiZuPT09MCYmKHMuZ2V0ZGVudHM9bnVsbCksMH1jYXRjaChsKXtpZih0eXBlb2Ygbz4idSJ8fGwubmFtZSE9PSJFcnJub0Vycm9yIil0aHJvdyBsO3JldHVybiBsLmVycm5vfX12YXIgYmE9KGUscix0LG4pPT57Zm9yKHZhciBhPTAsaT0wO2k8dDtpKyspe3ZhciBzPUFbcj4+Ml0sbD1BW3IrND4+Ml07cis9ODt2YXIgdT1vLndyaXRlKGUsSSxzLGwsbik7aWYodTwwKXJldHVybi0xO2ErPXV9cmV0dXJuIGF9O2Z1bmN0aW9uIGthKGUscix0LG4pe3RyeXt2YXIgYT1QLmdldFN0cmVhbUZyb21GRChlKSxpPWJhKGEscix0KTtyZXR1cm4gQVtuPj4yXT1pLDB9Y2F0Y2gocyl7aWYodHlwZW9mIG8+InUifHxzLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgcztyZXR1cm4gcy5lcnJub319dmFyIFBhPShlLHIpPT57Zm9yKHZhciB0PTAsbj0wO248PXI7dCs9ZVtuKytdKTtyZXR1cm4gdH0sSnI9WzMxLDI5LDMxLDMwLDMxLDMwLDMxLDMxLDMwLDMxLDMwLDMxXSxacj1bMzEsMjgsMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdLEFhPShlLHIpPT57Zm9yKHZhciB0PW5ldyBEYXRlKGUuZ2V0VGltZSgpKTtyPjA7KXt2YXIgbj1CZSh0LmdldEZ1bGxZZWFyKCkpLGE9dC5nZXRNb250aCgpLGk9KG4/SnI6WnIpW2FdO2lmKHI+aS10LmdldERhdGUoKSlyLT1pLXQuZ2V0RGF0ZSgpKzEsdC5zZXREYXRlKDEpLGE8MTE/dC5zZXRNb250aChhKzEpOih0LnNldE1vbnRoKDApLHQuc2V0RnVsbFllYXIodC5nZXRGdWxsWWVhcigpKzEpKTtlbHNlIHJldHVybiB0LnNldERhdGUodC5nZXREYXRlKCkrciksdH1yZXR1cm4gdH0sRGE9KGUscik9PntJLnNldChlLHIpfSxRcj0oZSxyLHQsbik9Pnt2YXIgYT1BW24rNDA+PjJdLGk9e3RtX3NlYzpnW24+PjJdLHRtX21pbjpnW24rND4+Ml0sdG1faG91cjpnW24rOD4+Ml0sdG1fbWRheTpnW24rMTI+PjJdLHRtX21vbjpnW24rMTY+PjJdLHRtX3llYXI6Z1tuKzIwPj4yXSx0bV93ZGF5OmdbbisyND4+Ml0sdG1feWRheTpnW24rMjg+PjJdLHRtX2lzZHN0OmdbbiszMj4+Ml0sdG1fZ210b2ZmOmdbbiszNj4+Ml0sdG1fem9uZTphP3NlKGEpOiIifSxzPXNlKHQpLGw9eyIlYyI6IiVhICViICVkICVIOiVNOiVTICVZIiwiJUQiOiIlbS8lZC8leSIsIiVGIjoiJVktJW0tJWQiLCIlaCI6IiViIiwiJXIiOiIlSTolTTolUyAlcCIsIiVSIjoiJUg6JU0iLCIlVCI6IiVIOiVNOiVTIiwiJXgiOiIlbS8lZC8leSIsIiVYIjoiJUg6JU06JVMiLCIlRWMiOiIlYyIsIiVFQyI6IiVDIiwiJUV4IjoiJW0vJWQvJXkiLCIlRVgiOiIlSDolTTolUyIsIiVFeSI6IiV5IiwiJUVZIjoiJVkiLCIlT2QiOiIlZCIsIiVPZSI6IiVlIiwiJU9IIjoiJUgiLCIlT0kiOiIlSSIsIiVPbSI6IiVtIiwiJU9NIjoiJU0iLCIlT1MiOiIlUyIsIiVPdSI6IiV1IiwiJU9VIjoiJVUiLCIlT1YiOiIlViIsIiVPdyI6IiV3IiwiJU9XIjoiJVciLCIlT3kiOiIleSJ9O2Zvcih2YXIgdSBpbiBsKXM9cy5yZXBsYWNlKG5ldyBSZWdFeHAodSwiZyIpLGxbdV0pO3ZhciBjPVsiU3VuZGF5IiwiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiXSxkPVsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXTtmdW5jdGlvbiBtKHYsXyxMKXtmb3IodmFyIFQ9dHlwZW9mIHY9PSJudW1iZXIiP3YudG9TdHJpbmcoKTp2fHwiIjtULmxlbmd0aDxfOylUPUxbMF0rVDtyZXR1cm4gVH1mdW5jdGlvbiBoKHYsXyl7cmV0dXJuIG0odixfLCIwIil9ZnVuY3Rpb24gcCh2LF8pe2Z1bmN0aW9uIEwoQil7cmV0dXJuIEI8MD8tMTpCPjA/MTowfXZhciBUO3JldHVybihUPUwodi5nZXRGdWxsWWVhcigpLV8uZ2V0RnVsbFllYXIoKSkpPT09MCYmKFQ9TCh2LmdldE1vbnRoKCktXy5nZXRNb250aCgpKSk9PT0wJiYoVD1MKHYuZ2V0RGF0ZSgpLV8uZ2V0RGF0ZSgpKSksVH1mdW5jdGlvbiB3KHYpe3N3aXRjaCh2LmdldERheSgpKXtjYXNlIDA6cmV0dXJuIG5ldyBEYXRlKHYuZ2V0RnVsbFllYXIoKS0xLDExLDI5KTtjYXNlIDE6cmV0dXJuIHY7Y2FzZSAyOnJldHVybiBuZXcgRGF0ZSh2LmdldEZ1bGxZZWFyKCksMCwzKTtjYXNlIDM6cmV0dXJuIG5ldyBEYXRlKHYuZ2V0RnVsbFllYXIoKSwwLDIpO2Nhc2UgNDpyZXR1cm4gbmV3IERhdGUodi5nZXRGdWxsWWVhcigpLDAsMSk7Y2FzZSA1OnJldHVybiBuZXcgRGF0ZSh2LmdldEZ1bGxZZWFyKCktMSwxMSwzMSk7Y2FzZSA2OnJldHVybiBuZXcgRGF0ZSh2LmdldEZ1bGxZZWFyKCktMSwxMSwzMCl9fWZ1bmN0aW9uIEQodil7dmFyIF89QWEobmV3IERhdGUodi50bV95ZWFyKzE5MDAsMCwxKSx2LnRtX3lkYXkpLEw9bmV3IERhdGUoXy5nZXRGdWxsWWVhcigpLDAsNCksVD1uZXcgRGF0ZShfLmdldEZ1bGxZZWFyKCkrMSwwLDQpLEI9dyhMKSxPPXcoVCk7cmV0dXJuIHAoQixfKTw9MD9wKE8sXyk8PTA/Xy5nZXRGdWxsWWVhcigpKzE6Xy5nZXRGdWxsWWVhcigpOl8uZ2V0RnVsbFllYXIoKS0xfXZhciBNPXsiJWEiOnY9PmNbdi50bV93ZGF5XS5zdWJzdHJpbmcoMCwzKSwiJUEiOnY9PmNbdi50bV93ZGF5XSwiJWIiOnY9PmRbdi50bV9tb25dLnN1YnN0cmluZygwLDMpLCIlQiI6dj0+ZFt2LnRtX21vbl0sIiVDIjp2PT57dmFyIF89di50bV95ZWFyKzE5MDA7cmV0dXJuIGgoXy8xMDB8MCwyKX0sIiVkIjp2PT5oKHYudG1fbWRheSwyKSwiJWUiOnY9Pm0odi50bV9tZGF5LDIsIiAiKSwiJWciOnY9PkQodikudG9TdHJpbmcoKS5zdWJzdHJpbmcoMiksIiVHIjpELCIlSCI6dj0+aCh2LnRtX2hvdXIsMiksIiVJIjp2PT57dmFyIF89di50bV9ob3VyO3JldHVybiBfPT0wP189MTI6Xz4xMiYmKF8tPTEyKSxoKF8sMil9LCIlaiI6dj0+aCh2LnRtX21kYXkrUGEoQmUodi50bV95ZWFyKzE5MDApP0pyOlpyLHYudG1fbW9uLTEpLDMpLCIlbSI6dj0+aCh2LnRtX21vbisxLDIpLCIlTSI6dj0+aCh2LnRtX21pbiwyKSwiJW4iOigpPT5gCmAsIiVwIjp2PT52LnRtX2hvdXI+PTAmJnYudG1faG91cjwxMj8iQU0iOiJQTSIsIiVTIjp2PT5oKHYudG1fc2VjLDIpLCIldCI6KCk9PiIJIiwiJXUiOnY9PnYudG1fd2RheXx8NywiJVUiOnY9Pnt2YXIgXz12LnRtX3lkYXkrNy12LnRtX3dkYXk7cmV0dXJuIGgoTWF0aC5mbG9vcihfLzcpLDIpfSwiJVYiOnY9Pnt2YXIgXz1NYXRoLmZsb29yKCh2LnRtX3lkYXkrNy0odi50bV93ZGF5KzYpJTcpLzcpO2lmKCh2LnRtX3dkYXkrMzcxLXYudG1feWRheS0yKSU3PD0yJiZfKyssXyl7aWYoXz09NTMpe3ZhciBUPSh2LnRtX3dkYXkrMzcxLXYudG1feWRheSklNztUIT00JiYoVCE9M3x8IUJlKHYudG1feWVhcikpJiYoXz0xKX19ZWxzZXtfPTUyO3ZhciBMPSh2LnRtX3dkYXkrNy12LnRtX3lkYXktMSklNzsoTD09NHx8TD09NSYmQmUodi50bV95ZWFyJTQwMC0xKSkmJl8rK31yZXR1cm4gaChfLDIpfSwiJXciOnY9PnYudG1fd2RheSwiJVciOnY9Pnt2YXIgXz12LnRtX3lkYXkrNy0odi50bV93ZGF5KzYpJTc7cmV0dXJuIGgoTWF0aC5mbG9vcihfLzcpLDIpfSwiJXkiOnY9Pih2LnRtX3llYXIrMTkwMCkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMiksIiVZIjp2PT52LnRtX3llYXIrMTkwMCwiJXoiOnY9Pnt2YXIgXz12LnRtX2dtdG9mZixMPV8+PTA7cmV0dXJuIF89TWF0aC5hYnMoXykvNjAsXz1fLzYwKjEwMCtfJTYwLChMPyIrIjoiLSIpKygiMDAwMCIrXykuc2xpY2UoLTQpfSwiJVoiOnY9PnYudG1fem9uZSwiJSUiOigpPT4iJSJ9O3M9cy5yZXBsYWNlKC8lJS9nLCJcMFwwIik7Zm9yKHZhciB1IGluIE0pcy5pbmNsdWRlcyh1KSYmKHM9cy5yZXBsYWNlKG5ldyBSZWdFeHAodSwiZyIpLE1bdV0oaSkpKTtzPXMucmVwbGFjZSgvXDBcMC9nLCIlIik7dmFyIEY9U2UocywhMSk7cmV0dXJuIEYubGVuZ3RoPnI/MDooRGEoRixlKSxGLmxlbmd0aC0xKX0sJGE9KGUscix0LG4sYSk9PlFyKGUscix0LG4pO28uY3JlYXRlUHJlbG9hZGVkRmlsZT1WdCxvLnN0YXRpY0luaXQoKSxTcj1mLkludGVybmFsRXJyb3I9Y2xhc3MgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihyKXtzdXBlcihyKSx0aGlzLm5hbWU9IkludGVybmFsRXJyb3IifX0sZW4oKSxtZT1mLkJpbmRpbmdFcnJvcj1jbGFzcyBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKHIpe3N1cGVyKHIpLHRoaXMubmFtZT0iQmluZGluZ0Vycm9yIn19LHZuKCksdW4oKSxFbigpLHhyPWYuVW5ib3VuZFR5cGVFcnJvcj1BbihFcnJvciwiVW5ib3VuZFR5cGVFcnJvciIpLE9uKCk7dmFyIENhPXtsOkN0LGM6VHQsVTpqdCxzOnp0LFI6eHQsSjpIdCxXOld0LE86QnQsUDpOdCxLOll0LEk6R3QsSDpxdCxROlh0LEU6S3QsVjpKdCxrOlp0LEI6UXQsWjp0bixoOkRuLHk6Rm4sajpUbixiOlNuLGE6TW4sWTpZcix3OlZuLGk6VW4sZjp6bixkOnhuLG06SG4sdjpXbix0OktuLG46Sm4sZTpabixfOlFuLFM6cmEsVDp0YSx4Ok5yLGFhOm5hLCQ6YWEsZzppYSx6OnNhLEY6bGEscDp1YSxHOmZhLG86S3IsRDpkYSxNOm1hLE46cGEscjpfYSxMOmdhLHU6d2EsQTpFYSxxOmthLFg6UXIsQzokYX0sej0kdCgpLGZyPWU9Pihmcj16LmRhKShlKSxldD1lPT4oZXQ9ei5mYSkoZSksWj1lPT4oWj16LmdhKShlKSxydD1lPT4ocnQ9ei5pYSkoZSk7Zi5keW5DYWxsX2ppamk9KGUscix0LG4sYSk9PihmLmR5bkNhbGxfamlqaT16LmphKShlLHIsdCxuLGEpLGYuZHluQ2FsbF9paWlqaT0oZSxyLHQsbixhLGkpPT4oZi5keW5DYWxsX2lpaWppPXoua2EpKGUscix0LG4sYSxpKSxmLmR5bkNhbGxfamlpaWo9KGUscix0LG4sYSxpKT0+KGYuZHluQ2FsbF9qaWlpaj16LmxhKShlLHIsdCxuLGEsaSksZi5keW5DYWxsX2lpaWlpaj0oZSxyLHQsbixhLGkscyk9PihmLmR5bkNhbGxfaWlpaWlqPXoubWEpKGUscix0LG4sYSxpLHMpLGYuZHluQ2FsbF92aWlqaWk9KGUscix0LG4sYSxpLHMpPT4oZi5keW5DYWxsX3ZpaWppaT16Lm5hKShlLHIsdCxuLGEsaSxzKSxmLmR5bkNhbGxfaWlpaWlqaj0oZSxyLHQsbixhLGkscyxsLHUpPT4oZi5keW5DYWxsX2lpaWlpamo9ei5vYSkoZSxyLHQsbixhLGkscyxsLHUpLGYuZHluQ2FsbF9paWlpaWlqaj0oZSxyLHQsbixhLGkscyxsLHUsYyk9PihmLmR5bkNhbGxfaWlpaWlpamo9ei5wYSkoZSxyLHQsbixhLGkscyxsLHUsYyksZi5fZmZfaDI2NF9jYWJhY190YWJsZXM9MjA2ODEyO3ZhciBOZTtnZT1mdW5jdGlvbiBlKCl7TmV8fHR0KCksTmV8fChnZT1lKX07ZnVuY3Rpb24gdHQoKXtpZihvZT4wfHwocHQoKSxvZT4wKSlyZXR1cm47ZnVuY3Rpb24gZSgpe05lfHwoTmU9ITAsZi5jYWxsZWRSdW49ITAsIXByJiYoX3QoKSxVKGYpLGYub25SdW50aW1lSW5pdGlhbGl6ZWQmJmYub25SdW50aW1lSW5pdGlhbGl6ZWQoKSxndCgpKSl9Zi5zZXRTdGF0dXM/KGYuc2V0U3RhdHVzKCJSdW5uaW5nLi4uIiksc2V0VGltZW91dChmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtmLnNldFN0YXR1cygiIil9LDEpLGUoKX0sMSkpOmUoKX1pZihmLnByZUluaXQpZm9yKHR5cGVvZiBmLnByZUluaXQ9PSJmdW5jdGlvbiImJihmLnByZUluaXQ9W2YucHJlSW5pdF0pO2YucHJlSW5pdC5sZW5ndGg+MDspZi5wcmVJbml0LnBvcCgpKCk7dHQoKTtsZXQgbnQ9MzI7ZnVuY3Rpb24gYXQoZSxyPTMsdD01MDApe2xldCBuPTA7Zm9yKDtuPHI7KXRyeXtyZXR1cm4gZSgpfWNhdGNoKGEpe2lmKG50Pj0yNCYmY29uc29sZS53YXJuKGBBdHRlbXB0ICR7bisxfSBmYWlsZWQ6ICR7YS5tZXNzYWdlfWApLG4rKyxuPj1yKXRocm93IG5ldyBFcnJvcihgRmFpbGVkIGFmdGVyICR7cn0gYXR0ZW1wdHNgKX19ZnVuY3Rpb24gRmEoZSl7Y29uc3Qgcj1uZXcgWE1MSHR0cFJlcXVlc3Q7aWYoci5vcGVuKCJIRUFEIixlLCExKSxyLnNlbmQoKSxyLnN0YXR1cyE9PTIwMCl0aHJvdyBuZXcgRXJyb3IoYGdldEZpbGVTaXplIHJlcXVlc3QgZmFpbGVkOiAke2V9YCk7cmV0dXJuIHBhcnNlSW50KHIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtTGVuZ3RoIikpfWZ1bmN0aW9uIFRhKGUscix0KXtjb25zdCBuPW5ldyBYTUxIdHRwUmVxdWVzdDtpZihuLm9wZW4oIkdFVCIsZSwhMSksbi5zZXRSZXF1ZXN0SGVhZGVyKCJSYW5nZSIsYGJ5dGVzPSR7cn0tJHtyK3QtMX1gKSxuLnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIiLG4uc2VuZCgpLG4uc3RhdHVzIT09MjA2JiZuLnN0YXR1cyE9PTIwMCl0aHJvdyBuZXcgRXJyb3IoYGZldGNoQXJyYXlCdWZmZXIgcmVxdWVzdCBmYWlsZWQ6ICR7ZX1gKTtyZXR1cm4gbi5yZXNwb25zZX1jbGFzcyBwZXtjb25zdHJ1Y3RvcihyKXtsZXQgdDt0eXBlb2Ygcj09InN0cmluZyI/KHQ9bmV3IEZpbGUoW10sZW5jb2RlVVJJQ29tcG9uZW50KHIpKSxvLmZpbGVzeXN0ZW1zLldPUktFUkZTLnN0cmVhbV9vcHMucmVhZD1mdW5jdGlvbihhLGkscyxsLHUpe2NvbnN0IGM9ZGVjb2RlVVJJQ29tcG9uZW50KGEubm9kZS5jb250ZW50cy5uYW1lKTtpZihhLm5vZGUuc2l6ZT09PTAmJihhLm5vZGUuc2l6ZT1hdCgoKT0+RmEoYykpKSx1Pj1hLm5vZGUuc2l6ZSlyZXR1cm4gMDtjb25zdCBkPWF0KCgpPT5UYShjLHUsbCkpLG09ZC5ieXRlTGVuZ3RoO3JldHVybiBpLnNldChuZXcgVWludDhBcnJheShkKSxzKSxtfSk6dD1yLHRoaXMubW91bnRQb2ludD0iL2RhdGEiLHRoaXMubW91bnRPcHRzPXtmaWxlczpbdF19LHRoaXMuZmlsZVBhdGg9dGhpcy5tb3VudFBvaW50KyIvIit0Lm5hbWV9bW91bnQoKXtvLm1rZGlyKHRoaXMubW91bnRQb2ludCksby5tb3VudChvLmZpbGVzeXN0ZW1zLldPUktFUkZTLHRoaXMubW91bnRPcHRzLHRoaXMubW91bnRQb2ludCl9dW5tb3VudCgpe28udW5tb3VudCh0aGlzLm1vdW50UG9pbnQpLG8ucm1kaXIodGhpcy5tb3VudFBvaW50KX19ZnVuY3Rpb24gY3IoZSl7Y29uc3Qgcj1uZXcgVWludDhBcnJheShlLmV4dHJhZGF0YSksdD17aWQ6ZS5pZCxpbmRleDplLmluZGV4LGNvZGVjX3R5cGU6ZS5jb2RlY190eXBlLGNvZGVjX3R5cGVfc3RyaW5nOmUuY29kZWNfdHlwZV9zdHJpbmcsY29kZWNfbmFtZTplLmNvZGVjX25hbWUsY29kZWNfc3RyaW5nOmUuY29kZWNfc3RyaW5nLGNvbG9yX3ByaW1hcmllczplLmNvbG9yX3ByaW1hcmllcyxjb2xvcl90cmFuc2ZlcjplLmNvbG9yX3RyYW5zZmVyLGNvbG9yX3NwYWNlOmUuY29sb3Jfc3BhY2UsY29sb3JfcmFuZ2U6ZS5jb2xvcl9yYW5nZSxwcm9maWxlOmUucHJvZmlsZSxwaXhfZm10OmUucGl4X2ZtdCxsZXZlbDplLmxldmVsLHdpZHRoOmUud2lkdGgsaGVpZ2h0OmUuaGVpZ2h0LGNoYW5uZWxzOmUuY2hhbm5lbHMsc2FtcGxlX3JhdGU6ZS5zYW1wbGVfcmF0ZSxzYW1wbGVfZm10OmUuc2FtcGxlX2ZtdCxiaXRfcmF0ZTplLmJpdF9yYXRlLGV4dHJhZGF0YV9zaXplOmUuZXh0cmFkYXRhX3NpemUsZXh0cmFkYXRhOnIscl9mcmFtZV9yYXRlOmUucl9mcmFtZV9yYXRlLGF2Z19mcmFtZV9yYXRlOmUuYXZnX2ZyYW1lX3JhdGUsc2FtcGxlX2FzcGVjdF9yYXRpbzplLnNhbXBsZV9hc3BlY3RfcmF0aW8sZGlzcGxheV9hc3BlY3RfcmF0aW86ZS5kaXNwbGF5X2FzcGVjdF9yYXRpbyxzdGFydF90aW1lOmUuc3RhcnRfdGltZSxkdXJhdGlvbjplLmR1cmF0aW9uLHJvdGF0aW9uOmUucm90YXRpb24sZmxpcDplLmZsaXAsbmJfZnJhbWVzOmUubmJfZnJhbWVzLHRhZ3M6ZS50YWdzfTtyZXR1cm4gZS5kZWxldGUoKSx0fWZ1bmN0aW9uIGRyKGUpe2NvbnN0IHI9bmV3IFVpbnQ4QXJyYXkoZS5kYXRhKSx0PXtrZXlmcmFtZTplLmtleWZyYW1lLHRpbWVzdGFtcDplLnRpbWVzdGFtcCxkdXJhdGlvbjplLmR1cmF0aW9uLHNpemU6ZS5zaXplLGRhdGE6cn07cmV0dXJuIGUuZGVsZXRlKCksdH1mdW5jdGlvbiBTYShlLHI9MCx0PS0xKXtjb25zdCBuPW5ldyBwZShlKTtuLm1vdW50KCk7dHJ5e2NvbnN0IGE9Zi5nZXRfYXZfc3RyZWFtKG4uZmlsZVBhdGgscix0KTtyZXR1cm4gY3IoYSl9Y2F0Y2goYSl7dGhyb3cgbmV3IEVycm9yKCJnZXRfYXZfc3RyZWFtIGZhaWxlZDogIithLm1lc3NhZ2UpfWZpbmFsbHl7bi51bm1vdW50KCl9fWZ1bmN0aW9uIE1hKGUpe2NvbnN0IHI9bmV3IHBlKGUpO3IubW91bnQoKTt0cnl7Y29uc3QgdD1mLmdldF9hdl9zdHJlYW1zKHIuZmlsZVBhdGgpLG49W107Zm9yKGxldCBhPTA7YTx0LnN0cmVhbXMuc2l6ZSgpO2ErKyluLnB1c2goY3IodC5zdHJlYW1zLmdldChhKSkpO3JldHVybiB0LnN0cmVhbXMuZGVsZXRlKCksbn1jYXRjaCh0KXt0aHJvdyBuZXcgRXJyb3IoImdldF9hdl9zdHJlYW1zIGZhaWxlZDogIit0Lm1lc3NhZ2UpfWZpbmFsbHl7ci51bm1vdW50KCl9fWZ1bmN0aW9uIFJhKGUpe2NvbnN0IHI9bmV3IHBlKGUpO3IubW91bnQoKTt0cnl7Y29uc3QgdD1mLmdldF9tZWRpYV9pbmZvKHIuZmlsZVBhdGgpLG49e2Zvcm1hdF9uYW1lOnQuZm9ybWF0X25hbWUsZHVyYXRpb246dC5kdXJhdGlvbixiaXRfcmF0ZTp0LmJpdF9yYXRlLHN0YXJ0X3RpbWU6dC5zdGFydF90aW1lLG5iX3N0cmVhbXM6dC5uYl9zdHJlYW1zLHN0cmVhbXM6W119O2ZvcihsZXQgYT0wO2E8dC5zdHJlYW1zLnNpemUoKTthKyspbi5zdHJlYW1zLnB1c2goY3IodC5zdHJlYW1zLmdldChhKSkpO3JldHVybiB0LnN0cmVhbXMuZGVsZXRlKCksbn1jYXRjaCh0KXt0aHJvdyBuZXcgRXJyb3IoImdldF9tZWRpYV9pbmZvIGZhaWxlZDogIit0Lm1lc3NhZ2UpfWZpbmFsbHl7ci51bm1vdW50KCl9fWZ1bmN0aW9uIE9hKGUscix0PTAsbj0tMSxhPTEpe2NvbnN0IGk9bmV3IHBlKGUpO2kubW91bnQoKTt0cnl7Y29uc3Qgcz1mLmdldF9hdl9wYWNrZXQoaS5maWxlUGF0aCxyLHQsbixhKTtyZXR1cm4gZHIocyl9Y2F0Y2gocyl7dGhyb3cgbmV3IEVycm9yKCJnZXRfYXZfcGFja2V0IGZhaWxlZDogIitzLm1lc3NhZ2UpfWZpbmFsbHl7aS51bm1vdW50KCl9fWZ1bmN0aW9uIElhKGUscix0PTEpe2NvbnN0IG49bmV3IHBlKGUpO24ubW91bnQoKTt0cnl7Y29uc3QgYT1mLmdldF9hdl9wYWNrZXRzKG4uZmlsZVBhdGgscix0KSxpPVtdO2ZvcihsZXQgcz0wO3M8YS5wYWNrZXRzLnNpemUoKTtzKyspaS5wdXNoKGRyKGEucGFja2V0cy5nZXQocykpKTtyZXR1cm4gYS5wYWNrZXRzLmRlbGV0ZSgpLGl9Y2F0Y2goYSl7dGhyb3cgbmV3IEVycm9yKCJnZXRfYXZfcGFja2V0cyBmYWlsZWQ6ICIrYS5tZXNzYWdlKX1maW5hbGx5e24udW5tb3VudCgpfX1hc3luYyBmdW5jdGlvbiBMYShlLHIsdD0wLG49MCxhPTAsaT0tMSxzPTEpe2NvbnN0IGw9bmV3IHBlKHIpO2wubW91bnQoKTtsZXQgdT1udWxsO3RyeXtpZih1PWYuQVZQYWNrZXRSZWFkZXIuY3JlYXRlKGwuZmlsZVBhdGgsdCxuLGEsaSxzKSwhdSl0aHJvdyBuZXcgRXJyb3IoIkFWUGFja2V0UmVhZGVyLmNyZWF0ZSBmYWlsZWQgKG51bGwgcmVhZGVyKSIpO2NvbnN0IGM9VmEoZSk7Zm9yKDs7KXtjb25zdCBkPXUucmVhZF9uZXh0X2F2X3BhY2tldCgpO2lmKHUuaGFzX2Vycm9yKCkpdGhyb3cgbmV3IEVycm9yKCJBVlBhY2tldFJlYWRlciByZWFkX25leHRfYXZfcGFja2V0IGVycm9yIik7aWYodS5pc19maW5pc2hlZCgpKXthd2FpdCBjKDApO2JyZWFrfWlmKGF3YWl0IGMoZCk9PT0wKWJyZWFrfX1jYXRjaChjKXt0aHJvdyBuZXcgRXJyb3IoInJlYWRBVlBhY2tldCBwaXBlbGluZSBmYWlsZWQ6ICIrYy5tZXNzYWdlKX1maW5hbGx5e3UmJnUuZGVsZXRlKCksbC51bm1vdW50KCl9cmV0dXJuIDF9ZnVuY3Rpb24gVmEoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBuZXcgUHJvbWlzZShuPT57Y29uc3QgYT17dHlwZToiQVZQYWNrZXRTdHJlYW0iLG1zZ0lkOmUscmVzdWx0Om51bGx9O2lmKHQ9PT0wKXtzZWxmLnBvc3RNZXNzYWdlKGEpLG4oMSk7cmV0dXJufWNvbnN0IGk9ZHIodCk7YS5yZXN1bHQ9aSxzZWxmLnBvc3RNZXNzYWdlKGEsW2kuZGF0YS5idWZmZXJdKTtjb25zdCBzPWw9Pntjb25zdHt0eXBlOnUsbXNnSWQ6Y309bC5kYXRhO2M9PT1lJiYodT09PSJSZWFkTmV4dEFWUGFja2V0Ij8oc2VsZi5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixzKSxuKDEpKTp1PT09IlN0b3BSZWFkQVZQYWNrZXQiJiYoc2VsZi5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixzKSxuKDApKSl9O3NlbGYuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIscyl9KX19ZnVuY3Rpb24gVWEoZSl7bnQ9ZSxmLnNldF9hdl9sb2dfbGV2ZWwoZSl9cmV0dXJuIGYuZ2V0QVZTdHJlYW09U2EsZi5nZXRBVlN0cmVhbXM9TWEsZi5nZXRNZWRpYUluZm89UmEsZi5nZXRBVlBhY2tldD1PYSxmLmdldEFWUGFja2V0cz1JYSxmLnJlYWRBVlBhY2tldD1MYSxmLnNldEFWTG9nTGV2ZWw9VWEsQz1uZSxDfX0pKCk7bGV0IFE7c2VsZi5wb3N0TWVzc2FnZSh7dHlwZTpHLldhc21Xb3JrZXJMb2FkZWR9KSxzZWxmLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGFzeW5jIGZ1bmN0aW9uKEUpe2NvbnN0e3R5cGU6UixkYXRhOkMsbXNnSWQ6Zn09RS5kYXRhO3RyeXtzd2l0Y2goUil7Y2FzZSJMb2FkV0FTTSI6cmV0dXJuIGF3YWl0IHN0KEMpO2Nhc2UiR2V0QVZTdHJlYW0iOnJldHVybiBsdChDLGYpO2Nhc2UiR2V0QVZTdHJlYW1zIjpyZXR1cm4gdXQoQyxmKTtjYXNlIkdldE1lZGlhSW5mbyI6cmV0dXJuIGZ0KEMsZik7Y2FzZSJHZXRBVlBhY2tldCI6cmV0dXJuIGN0KEMsZik7Y2FzZSJHZXRBVlBhY2tldHMiOnJldHVybiBkdChDLGYpO2Nhc2UiUmVhZEFWUGFja2V0IjpyZXR1cm4gYXdhaXQgdnQoQyxmKTtjYXNlIlNldEFWTG9nTGV2ZWwiOnJldHVybiBodChDLGYpO2RlZmF1bHQ6cmV0dXJufX1jYXRjaChVKXtzZWxmLnBvc3RNZXNzYWdlKHt0eXBlOlIsbXNnSWQ6ZixlcnJNc2c6VSBpbnN0YW5jZW9mIEVycm9yP1UubWVzc2FnZToiVW5rbm93biBFcnJvciJ9KX19KTthc3luYyBmdW5jdGlvbiBzdChFKXtjb25zdHt3YXNtRmlsZVBhdGg6Un09RXx8e307UT1hd2FpdCBpdCh7bG9jYXRlRmlsZTooQyxmKT0+Qy5lbmRzV2l0aCgiLndhc20iKSYmUj9SOmYrQyxvblJ1bnRpbWVJbml0aWFsaXplZDooKT0+e3NlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6Ry5XQVNNUnVudGltZUluaXRpYWxpemVkfSl9fSl9ZnVuY3Rpb24gbHQoRSxSKXtjb25zdHtzb3VyY2U6QyxzdHJlYW1UeXBlOmYsc3RyZWFtSW5kZXg6VX09RSxIPVEuZ2V0QVZTdHJlYW0oQyxmLFUpO3NlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6Ry5HZXRBVlN0cmVhbSxtc2dJZDpSLHJlc3VsdDpIfSxbSC5leHRyYWRhdGEuYnVmZmVyXSl9ZnVuY3Rpb24gdXQoRSxSKXtjb25zdHtzb3VyY2U6Q309RSxmPVEuZ2V0QVZTdHJlYW1zKEMpO3NlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6Ry5HZXRBVlN0cmVhbXMsbXNnSWQ6UixyZXN1bHQ6Zn0sZi5tYXAoVT0+VS5leHRyYWRhdGEuYnVmZmVyKSl9ZnVuY3Rpb24gZnQoRSxSKXtjb25zdHtzb3VyY2U6Q309RSxmPVEuZ2V0TWVkaWFJbmZvKEMpO3NlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6Ry5HZXRNZWRpYUluZm8sbXNnSWQ6UixyZXN1bHQ6Zn0sZi5zdHJlYW1zLm1hcChVPT5VLmV4dHJhZGF0YS5idWZmZXIpKX1mdW5jdGlvbiBjdChFLFIpe2NvbnN0e3NvdXJjZTpDLHRpbWU6ZixzdHJlYW1UeXBlOlUsc3RyZWFtSW5kZXg6SCxzZWVrRmxhZzpuZX09RSxhZT1RLmdldEFWUGFja2V0KEMsZixVLEgsbmUpO3NlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6Ry5HZXRBVlBhY2tldCxtc2dJZDpSLHJlc3VsdDphZX0sW2FlLmRhdGEuYnVmZmVyXSl9ZnVuY3Rpb24gZHQoRSxSKXtjb25zdHtzb3VyY2U6Qyx0aW1lOmYsc2Vla0ZsYWc6VX09RSxIPVEuZ2V0QVZQYWNrZXRzKEMsZixVKTtzZWxmLnBvc3RNZXNzYWdlKHt0eXBlOkcuR2V0QVZQYWNrZXRzLG1zZ0lkOlIscmVzdWx0Okh9LEgubWFwKG5lPT5uZS5kYXRhLmJ1ZmZlcikpfWFzeW5jIGZ1bmN0aW9uIHZ0KEUsUil7Y29uc3R7c291cmNlOkMsc3RhcnQ6ZixlbmQ6VSxzdHJlYW1UeXBlOkgsc3RyZWFtSW5kZXg6bmUsc2Vla0ZsYWc6YWV9PUUsRGU9YXdhaXQgUS5yZWFkQVZQYWNrZXQoUixDLGYsVSxILG5lLGFlKTtzZWxmLnBvc3RNZXNzYWdlKHt0eXBlOkcuUmVhZEFWUGFja2V0LG1zZ0lkOlIscmVzdWx0OkRlfSl9ZnVuY3Rpb24gaHQoRSxSKXtjb25zdHtsZXZlbDpDfT1FO1Euc2V0QVZMb2dMZXZlbChDKSxzZWxmLnBvc3RNZXNzYWdlKHt0eXBlOiJTZXRBVkxvZ0xldmVsIixtc2dJZDpSfSl9fSkoKTsK", Za = (t) => Uint8Array.from(atob(t), (e) => e.charCodeAt(0)), Ks = typeof window < "u" && window.Blob && new Blob([Za(un)], {
|
|
10240
|
+
[un]: I0.AVMEDIA_TYPE_VIDEO,
|
|
10241
|
+
[fa]: I0.AVMEDIA_TYPE_AUDIO,
|
|
10242
|
+
[Za]: I0.AVMEDIA_TYPE_SUBTITLE
|
|
10243
|
+
}, hn = "KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciBBZT0oRT0+KEVbRS5BVk1FRElBX1RZUEVfVU5LTk9XTj0tMV09IkFWTUVESUFfVFlQRV9VTktOT1dOIixFW0UuQVZNRURJQV9UWVBFX1ZJREVPPTBdPSJBVk1FRElBX1RZUEVfVklERU8iLEVbRS5BVk1FRElBX1RZUEVfQVVESU89MV09IkFWTUVESUFfVFlQRV9BVURJTyIsRVtFLkFWTUVESUFfVFlQRV9EQVRBPTJdPSJBVk1FRElBX1RZUEVfREFUQSIsRVtFLkFWTUVESUFfVFlQRV9TVUJUSVRMRT0zXT0iQVZNRURJQV9UWVBFX1NVQlRJVExFIixFW0UuQVZNRURJQV9UWVBFX0FUVEFDSE1FTlQ9NF09IkFWTUVESUFfVFlQRV9BVFRBQ0hNRU5UIixFW0UuQVZNRURJQV9UWVBFX05CPTVdPSJBVk1FRElBX1RZUEVfTkIiLEUpKShBZXx8e30pLEc9KEU9PihFLldhc21Xb3JrZXJMb2FkZWQ9Ildhc21Xb3JrZXJMb2FkZWQiLEUuV0FTTVJ1bnRpbWVJbml0aWFsaXplZD0iV0FTTVJ1bnRpbWVJbml0aWFsaXplZCIsRS5Mb2FkV0FTTT0iTG9hZFdBU00iLEUuR2V0QVZQYWNrZXQ9IkdldEFWUGFja2V0IixFLkdldEFWUGFja2V0cz0iR2V0QVZQYWNrZXRzIixFLkdldEFWU3RyZWFtPSJHZXRBVlN0cmVhbSIsRS5HZXRBVlN0cmVhbXM9IkdldEFWU3RyZWFtcyIsRS5HZXRNZWRpYUluZm89IkdldE1lZGlhSW5mbyIsRS5SZWFkQVZQYWNrZXQ9IlJlYWRBVlBhY2tldCIsRS5BVlBhY2tldFN0cmVhbT0iQVZQYWNrZXRTdHJlYW0iLEUuUmVhZE5leHRBVlBhY2tldD0iUmVhZE5leHRBVlBhY2tldCIsRS5TdG9wUmVhZEFWUGFja2V0PSJTdG9wUmVhZEFWUGFja2V0IixFLlNldEFWTG9nTGV2ZWw9IlNldEFWTG9nTGV2ZWwiLEUpKShHfHx7fSk7InZpZGVvIisiIixBZS5BVk1FRElBX1RZUEVfVklERU8sImF1ZGlvIisiIixBZS5BVk1FRElBX1RZUEVfQVVESU8sInN1YnRpdGxlIisiIixBZS5BVk1FRElBX1RZUEVfU1VCVElUTEU7dmFyIGl0PSgoKT0+e3ZhciBFPXNlbGYubG9jYXRpb24uaHJlZjtyZXR1cm4gZnVuY3Rpb24oUj17fSl7dmFyIEMsZj1PYmplY3QuYXNzaWduKHt9LFIpLFUsSCxuZT1uZXcgUHJvbWlzZSgoZSxyKT0+e1U9ZSxIPXJ9KSxhZT0hMCxEZT1PYmplY3QuYXNzaWduKHt9LGYpLGhyPSIuL3RoaXMucHJvZ3JhbSIscT0iIjtmdW5jdGlvbiBtdChlKXtyZXR1cm4gZi5sb2NhdGVGaWxlP2YubG9jYXRlRmlsZShlLHEpOnErZX12YXIgWWUsbXIsR2U7cT1zZWxmLmxvY2F0aW9uLmhyZWYsRSYmKHE9RSkscS5zdGFydHNXaXRoKCJibG9iOiIpP3E9IiI6cT1xLnN1YnN0cigwLHEucmVwbGFjZSgvWz8jXS4qLywiIikubGFzdEluZGV4T2YoIi8iKSsxKSxZZT1lPT57dmFyIHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3JldHVybiByLm9wZW4oIkdFVCIsZSwhMSksci5zZW5kKG51bGwpLHIucmVzcG9uc2VUZXh0fSxHZT1lPT57dmFyIHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3JldHVybiByLm9wZW4oIkdFVCIsZSwhMSksci5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIixyLnNlbmQobnVsbCksbmV3IFVpbnQ4QXJyYXkoci5yZXNwb25zZSl9LG1yPShlLHIsdCk9Pnt2YXIgbj1uZXcgWE1MSHR0cFJlcXVlc3Q7bi5vcGVuKCJHRVQiLGUsITApLG4ucmVzcG9uc2VUeXBlPSJhcnJheWJ1ZmZlciIsbi5vbmxvYWQ9KCk9PntpZihuLnN0YXR1cz09MjAwfHxuLnN0YXR1cz09MCYmbi5yZXNwb25zZSl7cihuLnJlc3BvbnNlKTtyZXR1cm59dCgpfSxuLm9uZXJyb3I9dCxuLnNlbmQobnVsbCl9O3ZhciBxZT1mLnByaW50fHxjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLGVlPWYucHJpbnRFcnJ8fGNvbnNvbGUuZXJyb3IuYmluZChjb25zb2xlKTtPYmplY3QuYXNzaWduKGYsRGUpLERlPW51bGwsZi5hcmd1bWVudHMmJmYuYXJndW1lbnRzLGYudGhpc1Byb2dyYW0mJihocj1mLnRoaXNQcm9ncmFtKSxmLnF1aXQmJmYucXVpdDt2YXIgX2U7Zi53YXNtQmluYXJ5JiYoX2U9Zi53YXNtQmluYXJ5KTt2YXIgJGUscHI9ITE7ZnVuY3Rpb24gX3IoZSxyKXtlfHxpZShyKX12YXIgSSx4LFksQ2UsZyxBLGdyLHlyO2Z1bmN0aW9uIHdyKCl7dmFyIGU9JGUuYnVmZmVyO2YuSEVBUDg9ST1uZXcgSW50OEFycmF5KGUpLGYuSEVBUDE2PVk9bmV3IEludDE2QXJyYXkoZSksZi5IRUFQVTg9eD1uZXcgVWludDhBcnJheShlKSxmLkhFQVBVMTY9Q2U9bmV3IFVpbnQxNkFycmF5KGUpLGYuSEVBUDMyPWc9bmV3IEludDMyQXJyYXkoZSksZi5IRUFQVTMyPUE9bmV3IFVpbnQzMkFycmF5KGUpLGYuSEVBUEYzMj1ncj1uZXcgRmxvYXQzMkFycmF5KGUpLGYuSEVBUEY2ND15cj1uZXcgRmxvYXQ2NEFycmF5KGUpfXZhciBFcj1bXSxicj1bXSxrcj1bXTtmdW5jdGlvbiBwdCgpe2lmKGYucHJlUnVuKWZvcih0eXBlb2YgZi5wcmVSdW49PSJmdW5jdGlvbiImJihmLnByZVJ1bj1bZi5wcmVSdW5dKTtmLnByZVJ1bi5sZW5ndGg7KXl0KGYucHJlUnVuLnNoaWZ0KCkpO0tlKEVyKX1mdW5jdGlvbiBfdCgpeyFmLm5vRlNJbml0JiYhby5pbml0LmluaXRpYWxpemVkJiZvLmluaXQoKSxvLmlnbm9yZVBlcm1pc3Npb25zPSExLEtlKGJyKX1mdW5jdGlvbiBndCgpe2lmKGYucG9zdFJ1bilmb3IodHlwZW9mIGYucG9zdFJ1bj09ImZ1bmN0aW9uIiYmKGYucG9zdFJ1bj1bZi5wb3N0UnVuXSk7Zi5wb3N0UnVuLmxlbmd0aDspRXQoZi5wb3N0UnVuLnNoaWZ0KCkpO0tlKGtyKX1mdW5jdGlvbiB5dChlKXtFci51bnNoaWZ0KGUpfWZ1bmN0aW9uIHd0KGUpe2JyLnVuc2hpZnQoZSl9ZnVuY3Rpb24gRXQoZSl7a3IudW5zaGlmdChlKX12YXIgb2U9MCxnZT1udWxsO2Z1bmN0aW9uIEhhKGUpe3JldHVybiBlfWZ1bmN0aW9uIFhlKGUpe3ZhciByO29lKyssKHI9Zi5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKT09bnVsbHx8ci5jYWxsKGYsb2UpfWZ1bmN0aW9uIEZlKGUpe3ZhciB0O2lmKG9lLS0sKHQ9Zi5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKT09bnVsbHx8dC5jYWxsKGYsb2UpLG9lPT0wJiZnZSl7dmFyIHI9Z2U7Z2U9bnVsbCxyKCl9fWZ1bmN0aW9uIGllKGUpe3ZhciB0Oyh0PWYub25BYm9ydCk9PW51bGx8fHQuY2FsbChmLGUpLGU9IkFib3J0ZWQoIitlKyIpIixlZShlKSxwcj0hMCxlKz0iLiBCdWlsZCB3aXRoIC1zQVNTRVJUSU9OUyBmb3IgbW9yZSBpbmZvLiI7dmFyIHI9bmV3IFdlYkFzc2VtYmx5LlJ1bnRpbWVFcnJvcihlKTt0aHJvdyBIKHIpLHJ9dmFyIGJ0PSJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsIixQcj1lPT5lLnN0YXJ0c1dpdGgoYnQpO2Z1bmN0aW9uIGt0KCl7aWYoZi5sb2NhdGVGaWxlKXt2YXIgZT0id2ViLWRlbXV4ZXIud2FzbSI7cmV0dXJuIFByKGUpP2U6bXQoZSl9cmV0dXJuIG5ldyBVUkwoIndlYi1kZW11eGVyLndhc20iLHNlbGYubG9jYXRpb24uaHJlZikuaHJlZn12YXIgVGU7ZnVuY3Rpb24gQXIoZSl7aWYoZT09VGUmJl9lKXJldHVybiBuZXcgVWludDhBcnJheShfZSk7aWYoR2UpcmV0dXJuIEdlKGUpO3Rocm93ImJvdGggYXN5bmMgYW5kIHN5bmMgZmV0Y2hpbmcgb2YgdGhlIHdhc20gZmFpbGVkIn1mdW5jdGlvbiBQdChlKXtyZXR1cm4hX2UmJmFlJiZ0eXBlb2YgZmV0Y2g9PSJmdW5jdGlvbiI/ZmV0Y2goZSx7Y3JlZGVudGlhbHM6InNhbWUtb3JpZ2luIn0pLnRoZW4ocj0+e2lmKCFyLm9rKXRocm93YGZhaWxlZCB0byBsb2FkIHdhc20gYmluYXJ5IGZpbGUgYXQgJyR7ZX0nYDtyZXR1cm4gci5hcnJheUJ1ZmZlcigpfSkuY2F0Y2goKCk9PkFyKGUpKTpQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5BcihlKSl9ZnVuY3Rpb24gRHIoZSxyLHQpe3JldHVybiBQdChlKS50aGVuKG49PldlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKG4scikpLnRoZW4odCxuPT57ZWUoYGZhaWxlZCB0byBhc3luY2hyb25vdXNseSBwcmVwYXJlIHdhc206ICR7bn1gKSxpZShuKX0pfWZ1bmN0aW9uIEF0KGUscix0LG4pe3JldHVybiFlJiZ0eXBlb2YgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmc9PSJmdW5jdGlvbiImJiFQcihyKSYmdHlwZW9mIGZldGNoPT0iZnVuY3Rpb24iP2ZldGNoKHIse2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKGE9Pnt2YXIgaT1XZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhhLHQpO3JldHVybiBpLnRoZW4obixmdW5jdGlvbihzKXtyZXR1cm4gZWUoYHdhc20gc3RyZWFtaW5nIGNvbXBpbGUgZmFpbGVkOiAke3N9YCksZWUoImZhbGxpbmcgYmFjayB0byBBcnJheUJ1ZmZlciBpbnN0YW50aWF0aW9uIiksRHIocix0LG4pfSl9KTpEcihyLHQsbil9ZnVuY3Rpb24gRHQoKXtyZXR1cm57YTpDYX19ZnVuY3Rpb24gJHQoKXt2YXIgZT1EdCgpO2Z1bmN0aW9uIHIobixhKXtyZXR1cm4gej1uLmV4cG9ydHMsJGU9ei5iYSx3cigpLGpyPXouZWEsd3Qoei5jYSksRmUoKSx6fVhlKCk7ZnVuY3Rpb24gdChuKXtyKG4uaW5zdGFuY2UpfWlmKGYuaW5zdGFudGlhdGVXYXNtKXRyeXtyZXR1cm4gZi5pbnN0YW50aWF0ZVdhc20oZSxyKX1jYXRjaChuKXtlZShgTW9kdWxlLmluc3RhbnRpYXRlV2FzbSBjYWxsYmFjayBmYWlsZWQgd2l0aCBlcnJvcjogJHtufWApLEgobil9cmV0dXJuIFRlfHwoVGU9a3QoKSksQXQoX2UsVGUsZSx0KS5jYXRjaChIKSx7fX12YXIgeSwkLEtlPWU9Pntmb3IoO2UubGVuZ3RoPjA7KWUuc2hpZnQoKShmKX07Zi5ub0V4aXRSdW50aW1lO3ZhciAkcj10eXBlb2YgVGV4dERlY29kZXI8InUiP25ldyBUZXh0RGVjb2RlcigidXRmOCIpOnZvaWQgMCxjZT0oZSxyLHQpPT57Zm9yKHZhciBuPXIrdCxhPXI7ZVthXSYmIShhPj1uKTspKythO2lmKGEtcj4xNiYmZS5idWZmZXImJiRyKXJldHVybiAkci5kZWNvZGUoZS5zdWJhcnJheShyLGEpKTtmb3IodmFyIGk9IiI7cjxhOyl7dmFyIHM9ZVtyKytdO2lmKCEocyYxMjgpKXtpKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHMpO2NvbnRpbnVlfXZhciBsPWVbcisrXSY2MztpZigocyYyMjQpPT0xOTIpe2krPVN0cmluZy5mcm9tQ2hhckNvZGUoKHMmMzEpPDw2fGwpO2NvbnRpbnVlfXZhciB1PWVbcisrXSY2MztpZigocyYyNDApPT0yMjQ/cz0ocyYxNSk8PDEyfGw8PDZ8dTpzPShzJjcpPDwxOHxsPDwxMnx1PDw2fGVbcisrXSY2MyxzPDY1NTM2KWkrPVN0cmluZy5mcm9tQ2hhckNvZGUocyk7ZWxzZXt2YXIgYz1zLTY1NTM2O2krPVN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTZ8Yz4+MTAsNTYzMjB8YyYxMDIzKX19cmV0dXJuIGl9LHNlPShlLHIpPT5lP2NlKHgsZSxyKToiIixDdD0oZSxyLHQsbik9PntpZShgQXNzZXJ0aW9uIGZhaWxlZDogJHtzZShlKX0sIGF0OiBgK1tyP3NlKHIpOiJ1bmtub3duIGZpbGVuYW1lIix0LG4/c2Uobik6InVua25vd24gZnVuY3Rpb24iXSl9O2NsYXNzIEZ0e2NvbnN0cnVjdG9yKHIpe3RoaXMuZXhjUHRyPXIsdGhpcy5wdHI9ci0yNH1zZXRfdHlwZShyKXtBW3RoaXMucHRyKzQ+PjJdPXJ9Z2V0X3R5cGUoKXtyZXR1cm4gQVt0aGlzLnB0cis0Pj4yXX1zZXRfZGVzdHJ1Y3RvcihyKXtBW3RoaXMucHRyKzg+PjJdPXJ9Z2V0X2Rlc3RydWN0b3IoKXtyZXR1cm4gQVt0aGlzLnB0cis4Pj4yXX1zZXRfY2F1Z2h0KHIpe3I9cj8xOjAsSVt0aGlzLnB0cisxMl09cn1nZXRfY2F1Z2h0KCl7cmV0dXJuIElbdGhpcy5wdHIrMTJdIT0wfXNldF9yZXRocm93bihyKXtyPXI/MTowLElbdGhpcy5wdHIrMTNdPXJ9Z2V0X3JldGhyb3duKCl7cmV0dXJuIElbdGhpcy5wdHIrMTNdIT0wfWluaXQocix0KXt0aGlzLnNldF9hZGp1c3RlZF9wdHIoMCksdGhpcy5zZXRfdHlwZShyKSx0aGlzLnNldF9kZXN0cnVjdG9yKHQpfXNldF9hZGp1c3RlZF9wdHIocil7QVt0aGlzLnB0cisxNj4+Ml09cn1nZXRfYWRqdXN0ZWRfcHRyKCl7cmV0dXJuIEFbdGhpcy5wdHIrMTY+PjJdfWdldF9leGNlcHRpb25fcHRyKCl7dmFyIHI9cnQodGhpcy5nZXRfdHlwZSgpKTtpZihyKXJldHVybiBBW3RoaXMuZXhjUHRyPj4yXTt2YXIgdD10aGlzLmdldF9hZGp1c3RlZF9wdHIoKTtyZXR1cm4gdCE9PTA/dDp0aGlzLmV4Y1B0cn19dmFyIENyPTAsVHQ9KGUscix0KT0+e3ZhciBuPW5ldyBGdChlKTt0aHJvdyBuLmluaXQocix0KSxDcj1lLENyfSxTPXtpc0FiczplPT5lLmNoYXJBdCgwKT09PSIvIixzcGxpdFBhdGg6ZT0+e3ZhciByPS9eKFwvP3wpKFtcc1xTXSo/KSgoPzpcLnsxLDJ9fFteXC9dKz98KShcLlteLlwvXSp8KSkoPzpbXC9dKikkLztyZXR1cm4gci5leGVjKGUpLnNsaWNlKDEpfSxub3JtYWxpemVBcnJheTooZSxyKT0+e2Zvcih2YXIgdD0wLG49ZS5sZW5ndGgtMTtuPj0wO24tLSl7dmFyIGE9ZVtuXTthPT09Ii4iP2Uuc3BsaWNlKG4sMSk6YT09PSIuLiI/KGUuc3BsaWNlKG4sMSksdCsrKTp0JiYoZS5zcGxpY2UobiwxKSx0LS0pfWlmKHIpZm9yKDt0O3QtLSllLnVuc2hpZnQoIi4uIik7cmV0dXJuIGV9LG5vcm1hbGl6ZTplPT57dmFyIHI9Uy5pc0FicyhlKSx0PWUuc3Vic3RyKC0xKT09PSIvIjtyZXR1cm4gZT1TLm5vcm1hbGl6ZUFycmF5KGUuc3BsaXQoIi8iKS5maWx0ZXIobj0+ISFuKSwhcikuam9pbigiLyIpLCFlJiYhciYmKGU9Ii4iKSxlJiZ0JiYoZSs9Ii8iKSwocj8iLyI6IiIpK2V9LGRpcm5hbWU6ZT0+e3ZhciByPVMuc3BsaXRQYXRoKGUpLHQ9clswXSxuPXJbMV07cmV0dXJuIXQmJiFuPyIuIjoobiYmKG49bi5zdWJzdHIoMCxuLmxlbmd0aC0xKSksdCtuKX0sYmFzZW5hbWU6ZT0+e2lmKGU9PT0iLyIpcmV0dXJuIi8iO2U9Uy5ub3JtYWxpemUoZSksZT1lLnJlcGxhY2UoL1wvJC8sIiIpO3ZhciByPWUubGFzdEluZGV4T2YoIi8iKTtyZXR1cm4gcj09PS0xP2U6ZS5zdWJzdHIocisxKX0sam9pbjooLi4uZSk9PlMubm9ybWFsaXplKGUuam9pbigiLyIpKSxqb2luMjooZSxyKT0+Uy5ub3JtYWxpemUoZSsiLyIrcil9LFN0PSgpPT57aWYodHlwZW9mIGNyeXB0bz09Im9iamVjdCImJnR5cGVvZiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzPT0iZnVuY3Rpb24iKXJldHVybiBlPT5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGUpO2llKCJpbml0UmFuZG9tRGV2aWNlIil9LEZyPWU9PihGcj1TdCgpKShlKSxYPXtyZXNvbHZlOiguLi5lKT0+e2Zvcih2YXIgcj0iIix0PSExLG49ZS5sZW5ndGgtMTtuPj0tMSYmIXQ7bi0tKXt2YXIgYT1uPj0wP2Vbbl06by5jd2QoKTtpZih0eXBlb2YgYSE9InN0cmluZyIpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnRzIHRvIHBhdGgucmVzb2x2ZSBtdXN0IGJlIHN0cmluZ3MiKTtpZighYSlyZXR1cm4iIjtyPWErIi8iK3IsdD1TLmlzQWJzKGEpfXJldHVybiByPVMubm9ybWFsaXplQXJyYXkoci5zcGxpdCgiLyIpLmZpbHRlcihpPT4hIWkpLCF0KS5qb2luKCIvIiksKHQ/Ii8iOiIiKStyfHwiLiJ9LHJlbGF0aXZlOihlLHIpPT57ZT1YLnJlc29sdmUoZSkuc3Vic3RyKDEpLHI9WC5yZXNvbHZlKHIpLnN1YnN0cigxKTtmdW5jdGlvbiB0KGMpe2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGgmJmNbZF09PT0iIjtkKyspO2Zvcih2YXIgbT1jLmxlbmd0aC0xO20+PTAmJmNbbV09PT0iIjttLS0pO3JldHVybiBkPm0/W106Yy5zbGljZShkLG0tZCsxKX1mb3IodmFyIG49dChlLnNwbGl0KCIvIikpLGE9dChyLnNwbGl0KCIvIikpLGk9TWF0aC5taW4obi5sZW5ndGgsYS5sZW5ndGgpLHM9aSxsPTA7bDxpO2wrKylpZihuW2xdIT09YVtsXSl7cz1sO2JyZWFrfWZvcih2YXIgdT1bXSxsPXM7bDxuLmxlbmd0aDtsKyspdS5wdXNoKCIuLiIpO3JldHVybiB1PXUuY29uY2F0KGEuc2xpY2UocykpLHUuam9pbigiLyIpfX0sSmU9W10sWmU9ZT0+e2Zvcih2YXIgcj0wLHQ9MDt0PGUubGVuZ3RoOysrdCl7dmFyIG49ZS5jaGFyQ29kZUF0KHQpO248PTEyNz9yKys6bjw9MjA0Nz9yKz0yOm4+PTU1Mjk2JiZuPD01NzM0Mz8ocis9NCwrK3QpOnIrPTN9cmV0dXJuIHJ9LFFlPShlLHIsdCxuKT0+e2lmKCEobj4wKSlyZXR1cm4gMDtmb3IodmFyIGE9dCxpPXQrbi0xLHM9MDtzPGUubGVuZ3RoOysrcyl7dmFyIGw9ZS5jaGFyQ29kZUF0KHMpO2lmKGw+PTU1Mjk2JiZsPD01NzM0Myl7dmFyIHU9ZS5jaGFyQ29kZUF0KCsrcyk7bD02NTUzNisoKGwmMTAyMyk8PDEwKXx1JjEwMjN9aWYobDw9MTI3KXtpZih0Pj1pKWJyZWFrO3JbdCsrXT1sfWVsc2UgaWYobDw9MjA0Nyl7aWYodCsxPj1pKWJyZWFrO3JbdCsrXT0xOTJ8bD4+NixyW3QrK109MTI4fGwmNjN9ZWxzZSBpZihsPD02NTUzNSl7aWYodCsyPj1pKWJyZWFrO3JbdCsrXT0yMjR8bD4+MTIsclt0KytdPTEyOHxsPj42JjYzLHJbdCsrXT0xMjh8bCY2M31lbHNle2lmKHQrMz49aSlicmVhaztyW3QrK109MjQwfGw+PjE4LHJbdCsrXT0xMjh8bD4+MTImNjMsclt0KytdPTEyOHxsPj42JjYzLHJbdCsrXT0xMjh8bCY2M319cmV0dXJuIHJbdF09MCx0LWF9O2Z1bmN0aW9uIFNlKGUscix0KXt2YXIgbj1aZShlKSsxLGE9bmV3IEFycmF5KG4pLGk9UWUoZSxhLDAsYS5sZW5ndGgpO3JldHVybiByJiYoYS5sZW5ndGg9aSksYX12YXIgTXQ9KCk9PntpZighSmUubGVuZ3RoKXt2YXIgZT1udWxsO2lmKCFlKXJldHVybiBudWxsO0plPVNlKGUsITApfXJldHVybiBKZS5zaGlmdCgpfSxsZT17dHR5czpbXSxpbml0KCl7fSxzaHV0ZG93bigpe30scmVnaXN0ZXIoZSxyKXtsZS50dHlzW2VdPXtpbnB1dDpbXSxvdXRwdXQ6W10sb3BzOnJ9LG8ucmVnaXN0ZXJEZXZpY2UoZSxsZS5zdHJlYW1fb3BzKX0sc3RyZWFtX29wczp7b3BlbihlKXt2YXIgcj1sZS50dHlzW2Uubm9kZS5yZGV2XTtpZighcil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQzKTtlLnR0eT1yLGUuc2Vla2FibGU9ITF9LGNsb3NlKGUpe2UudHR5Lm9wcy5mc3luYyhlLnR0eSl9LGZzeW5jKGUpe2UudHR5Lm9wcy5mc3luYyhlLnR0eSl9LHJlYWQoZSxyLHQsbixhKXtpZighZS50dHl8fCFlLnR0eS5vcHMuZ2V0X2NoYXIpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig2MCk7Zm9yKHZhciBpPTAscz0wO3M8bjtzKyspe3ZhciBsO3RyeXtsPWUudHR5Lm9wcy5nZXRfY2hhcihlLnR0eSl9Y2F0Y2h7dGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOSl9aWYobD09PXZvaWQgMCYmaT09PTApdGhyb3cgbmV3IG8uRXJybm9FcnJvcig2KTtpZihsPT1udWxsKWJyZWFrO2krKyxyW3Qrc109bH1yZXR1cm4gaSYmKGUubm9kZS50aW1lc3RhbXA9RGF0ZS5ub3coKSksaX0sd3JpdGUoZSxyLHQsbixhKXtpZighZS50dHl8fCFlLnR0eS5vcHMucHV0X2NoYXIpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig2MCk7dHJ5e2Zvcih2YXIgaT0wO2k8bjtpKyspZS50dHkub3BzLnB1dF9jaGFyKGUudHR5LHJbdCtpXSl9Y2F0Y2h7dGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOSl9cmV0dXJuIG4mJihlLm5vZGUudGltZXN0YW1wPURhdGUubm93KCkpLGl9fSxkZWZhdWx0X3R0eV9vcHM6e2dldF9jaGFyKGUpe3JldHVybiBNdCgpfSxwdXRfY2hhcihlLHIpe3I9PT1udWxsfHxyPT09MTA/KHFlKGNlKGUub3V0cHV0LDApKSxlLm91dHB1dD1bXSk6ciE9MCYmZS5vdXRwdXQucHVzaChyKX0sZnN5bmMoZSl7ZS5vdXRwdXQmJmUub3V0cHV0Lmxlbmd0aD4wJiYocWUoY2UoZS5vdXRwdXQsMCkpLGUub3V0cHV0PVtdKX0saW9jdGxfdGNnZXRzKGUpe3JldHVybntjX2lmbGFnOjI1ODU2LGNfb2ZsYWc6NSxjX2NmbGFnOjE5MSxjX2xmbGFnOjM1Mzg3LGNfY2M6WzMsMjgsMTI3LDIxLDQsMCwxLDAsMTcsMTksMjYsMCwxOCwxNSwyMywyMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXX19LGlvY3RsX3Rjc2V0cyhlLHIsdCl7cmV0dXJuIDB9LGlvY3RsX3Rpb2Nnd2luc3ooZSl7cmV0dXJuWzI0LDgwXX19LGRlZmF1bHRfdHR5MV9vcHM6e3B1dF9jaGFyKGUscil7cj09PW51bGx8fHI9PT0xMD8oZWUoY2UoZS5vdXRwdXQsMCkpLGUub3V0cHV0PVtdKTpyIT0wJiZlLm91dHB1dC5wdXNoKHIpfSxmc3luYyhlKXtlLm91dHB1dCYmZS5vdXRwdXQubGVuZ3RoPjAmJihlZShjZShlLm91dHB1dCwwKSksZS5vdXRwdXQ9W10pfX19LFRyPWU9PntpZSgpfSxiPXtvcHNfdGFibGU6bnVsbCxtb3VudChlKXtyZXR1cm4gYi5jcmVhdGVOb2RlKG51bGwsIi8iLDE2ODk1LDApfSxjcmVhdGVOb2RlKGUscix0LG4pe2lmKG8uaXNCbGtkZXYodCl8fG8uaXNGSUZPKHQpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpO2Iub3BzX3RhYmxlfHwoYi5vcHNfdGFibGU9e2Rpcjp7bm9kZTp7Z2V0YXR0cjpiLm5vZGVfb3BzLmdldGF0dHIsc2V0YXR0cjpiLm5vZGVfb3BzLnNldGF0dHIsbG9va3VwOmIubm9kZV9vcHMubG9va3VwLG1rbm9kOmIubm9kZV9vcHMubWtub2QscmVuYW1lOmIubm9kZV9vcHMucmVuYW1lLHVubGluazpiLm5vZGVfb3BzLnVubGluayxybWRpcjpiLm5vZGVfb3BzLnJtZGlyLHJlYWRkaXI6Yi5ub2RlX29wcy5yZWFkZGlyLHN5bWxpbms6Yi5ub2RlX29wcy5zeW1saW5rfSxzdHJlYW06e2xsc2VlazpiLnN0cmVhbV9vcHMubGxzZWVrfX0sZmlsZTp7bm9kZTp7Z2V0YXR0cjpiLm5vZGVfb3BzLmdldGF0dHIsc2V0YXR0cjpiLm5vZGVfb3BzLnNldGF0dHJ9LHN0cmVhbTp7bGxzZWVrOmIuc3RyZWFtX29wcy5sbHNlZWsscmVhZDpiLnN0cmVhbV9vcHMucmVhZCx3cml0ZTpiLnN0cmVhbV9vcHMud3JpdGUsYWxsb2NhdGU6Yi5zdHJlYW1fb3BzLmFsbG9jYXRlLG1tYXA6Yi5zdHJlYW1fb3BzLm1tYXAsbXN5bmM6Yi5zdHJlYW1fb3BzLm1zeW5jfX0sbGluazp7bm9kZTp7Z2V0YXR0cjpiLm5vZGVfb3BzLmdldGF0dHIsc2V0YXR0cjpiLm5vZGVfb3BzLnNldGF0dHIscmVhZGxpbms6Yi5ub2RlX29wcy5yZWFkbGlua30sc3RyZWFtOnt9fSxjaHJkZXY6e25vZGU6e2dldGF0dHI6Yi5ub2RlX29wcy5nZXRhdHRyLHNldGF0dHI6Yi5ub2RlX29wcy5zZXRhdHRyfSxzdHJlYW06by5jaHJkZXZfc3RyZWFtX29wc319KTt2YXIgYT1vLmNyZWF0ZU5vZGUoZSxyLHQsbik7cmV0dXJuIG8uaXNEaXIoYS5tb2RlKT8oYS5ub2RlX29wcz1iLm9wc190YWJsZS5kaXIubm9kZSxhLnN0cmVhbV9vcHM9Yi5vcHNfdGFibGUuZGlyLnN0cmVhbSxhLmNvbnRlbnRzPXt9KTpvLmlzRmlsZShhLm1vZGUpPyhhLm5vZGVfb3BzPWIub3BzX3RhYmxlLmZpbGUubm9kZSxhLnN0cmVhbV9vcHM9Yi5vcHNfdGFibGUuZmlsZS5zdHJlYW0sYS51c2VkQnl0ZXM9MCxhLmNvbnRlbnRzPW51bGwpOm8uaXNMaW5rKGEubW9kZSk/KGEubm9kZV9vcHM9Yi5vcHNfdGFibGUubGluay5ub2RlLGEuc3RyZWFtX29wcz1iLm9wc190YWJsZS5saW5rLnN0cmVhbSk6by5pc0NocmRldihhLm1vZGUpJiYoYS5ub2RlX29wcz1iLm9wc190YWJsZS5jaHJkZXYubm9kZSxhLnN0cmVhbV9vcHM9Yi5vcHNfdGFibGUuY2hyZGV2LnN0cmVhbSksYS50aW1lc3RhbXA9RGF0ZS5ub3coKSxlJiYoZS5jb250ZW50c1tyXT1hLGUudGltZXN0YW1wPWEudGltZXN0YW1wKSxhfSxnZXRGaWxlRGF0YUFzVHlwZWRBcnJheShlKXtyZXR1cm4gZS5jb250ZW50cz9lLmNvbnRlbnRzLnN1YmFycmF5P2UuY29udGVudHMuc3ViYXJyYXkoMCxlLnVzZWRCeXRlcyk6bmV3IFVpbnQ4QXJyYXkoZS5jb250ZW50cyk6bmV3IFVpbnQ4QXJyYXkoMCl9LGV4cGFuZEZpbGVTdG9yYWdlKGUscil7dmFyIHQ9ZS5jb250ZW50cz9lLmNvbnRlbnRzLmxlbmd0aDowO2lmKCEodD49cikpe3ZhciBuPTEwMjQqMTAyNDtyPU1hdGgubWF4KHIsdCoodDxuPzI6MS4xMjUpPj4+MCksdCE9MCYmKHI9TWF0aC5tYXgociwyNTYpKTt2YXIgYT1lLmNvbnRlbnRzO2UuY29udGVudHM9bmV3IFVpbnQ4QXJyYXkociksZS51c2VkQnl0ZXM+MCYmZS5jb250ZW50cy5zZXQoYS5zdWJhcnJheSgwLGUudXNlZEJ5dGVzKSwwKX19LHJlc2l6ZUZpbGVTdG9yYWdlKGUscil7aWYoZS51c2VkQnl0ZXMhPXIpaWYocj09MCllLmNvbnRlbnRzPW51bGwsZS51c2VkQnl0ZXM9MDtlbHNle3ZhciB0PWUuY29udGVudHM7ZS5jb250ZW50cz1uZXcgVWludDhBcnJheShyKSx0JiZlLmNvbnRlbnRzLnNldCh0LnN1YmFycmF5KDAsTWF0aC5taW4ocixlLnVzZWRCeXRlcykpKSxlLnVzZWRCeXRlcz1yfX0sbm9kZV9vcHM6e2dldGF0dHIoZSl7dmFyIHI9e307cmV0dXJuIHIuZGV2PW8uaXNDaHJkZXYoZS5tb2RlKT9lLmlkOjEsci5pbm89ZS5pZCxyLm1vZGU9ZS5tb2RlLHIubmxpbms9MSxyLnVpZD0wLHIuZ2lkPTAsci5yZGV2PWUucmRldixvLmlzRGlyKGUubW9kZSk/ci5zaXplPTQwOTY6by5pc0ZpbGUoZS5tb2RlKT9yLnNpemU9ZS51c2VkQnl0ZXM6by5pc0xpbmsoZS5tb2RlKT9yLnNpemU9ZS5saW5rLmxlbmd0aDpyLnNpemU9MCxyLmF0aW1lPW5ldyBEYXRlKGUudGltZXN0YW1wKSxyLm10aW1lPW5ldyBEYXRlKGUudGltZXN0YW1wKSxyLmN0aW1lPW5ldyBEYXRlKGUudGltZXN0YW1wKSxyLmJsa3NpemU9NDA5NixyLmJsb2Nrcz1NYXRoLmNlaWwoci5zaXplL3IuYmxrc2l6ZSkscn0sc2V0YXR0cihlLHIpe3IubW9kZSE9PXZvaWQgMCYmKGUubW9kZT1yLm1vZGUpLHIudGltZXN0YW1wIT09dm9pZCAwJiYoZS50aW1lc3RhbXA9ci50aW1lc3RhbXApLHIuc2l6ZSE9PXZvaWQgMCYmYi5yZXNpemVGaWxlU3RvcmFnZShlLHIuc2l6ZSl9LGxvb2t1cChlLHIpe3Rocm93IG8uZ2VuZXJpY0Vycm9yc1s0NF19LG1rbm9kKGUscix0LG4pe3JldHVybiBiLmNyZWF0ZU5vZGUoZSxyLHQsbil9LHJlbmFtZShlLHIsdCl7aWYoby5pc0RpcihlLm1vZGUpKXt2YXIgbjt0cnl7bj1vLmxvb2t1cE5vZGUocix0KX1jYXRjaHt9aWYobilmb3IodmFyIGEgaW4gbi5jb250ZW50cyl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDU1KX1kZWxldGUgZS5wYXJlbnQuY29udGVudHNbZS5uYW1lXSxlLnBhcmVudC50aW1lc3RhbXA9RGF0ZS5ub3coKSxlLm5hbWU9dCxyLmNvbnRlbnRzW3RdPWUsci50aW1lc3RhbXA9ZS5wYXJlbnQudGltZXN0YW1wLGUucGFyZW50PXJ9LHVubGluayhlLHIpe2RlbGV0ZSBlLmNvbnRlbnRzW3JdLGUudGltZXN0YW1wPURhdGUubm93KCl9LHJtZGlyKGUscil7dmFyIHQ9by5sb29rdXBOb2RlKGUscik7Zm9yKHZhciBuIGluIHQuY29udGVudHMpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig1NSk7ZGVsZXRlIGUuY29udGVudHNbcl0sZS50aW1lc3RhbXA9RGF0ZS5ub3coKX0scmVhZGRpcihlKXt2YXIgcj1bIi4iLCIuLiJdO2Zvcih2YXIgdCBvZiBPYmplY3Qua2V5cyhlLmNvbnRlbnRzKSlyLnB1c2godCk7cmV0dXJuIHJ9LHN5bWxpbmsoZSxyLHQpe3ZhciBuPWIuY3JlYXRlTm9kZShlLHIsNDE0NzEsMCk7cmV0dXJuIG4ubGluaz10LG59LHJlYWRsaW5rKGUpe2lmKCFvLmlzTGluayhlLm1vZGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMjgpO3JldHVybiBlLmxpbmt9fSxzdHJlYW1fb3BzOntyZWFkKGUscix0LG4sYSl7dmFyIGk9ZS5ub2RlLmNvbnRlbnRzO2lmKGE+PWUubm9kZS51c2VkQnl0ZXMpcmV0dXJuIDA7dmFyIHM9TWF0aC5taW4oZS5ub2RlLnVzZWRCeXRlcy1hLG4pO2lmKHM+OCYmaS5zdWJhcnJheSlyLnNldChpLnN1YmFycmF5KGEsYStzKSx0KTtlbHNlIGZvcih2YXIgbD0wO2w8cztsKyspclt0K2xdPWlbYStsXTtyZXR1cm4gc30sd3JpdGUoZSxyLHQsbixhLGkpe2lmKHIuYnVmZmVyPT09SS5idWZmZXImJihpPSExKSwhbilyZXR1cm4gMDt2YXIgcz1lLm5vZGU7aWYocy50aW1lc3RhbXA9RGF0ZS5ub3coKSxyLnN1YmFycmF5JiYoIXMuY29udGVudHN8fHMuY29udGVudHMuc3ViYXJyYXkpKXtpZihpKXJldHVybiBzLmNvbnRlbnRzPXIuc3ViYXJyYXkodCx0K24pLHMudXNlZEJ5dGVzPW4sbjtpZihzLnVzZWRCeXRlcz09PTAmJmE9PT0wKXJldHVybiBzLmNvbnRlbnRzPXIuc2xpY2UodCx0K24pLHMudXNlZEJ5dGVzPW4sbjtpZihhK248PXMudXNlZEJ5dGVzKXJldHVybiBzLmNvbnRlbnRzLnNldChyLnN1YmFycmF5KHQsdCtuKSxhKSxufWlmKGIuZXhwYW5kRmlsZVN0b3JhZ2UocyxhK24pLHMuY29udGVudHMuc3ViYXJyYXkmJnIuc3ViYXJyYXkpcy5jb250ZW50cy5zZXQoci5zdWJhcnJheSh0LHQrbiksYSk7ZWxzZSBmb3IodmFyIGw9MDtsPG47bCsrKXMuY29udGVudHNbYStsXT1yW3QrbF07cmV0dXJuIHMudXNlZEJ5dGVzPU1hdGgubWF4KHMudXNlZEJ5dGVzLGErbiksbn0sbGxzZWVrKGUscix0KXt2YXIgbj1yO2lmKHQ9PT0xP24rPWUucG9zaXRpb246dD09PTImJm8uaXNGaWxlKGUubm9kZS5tb2RlKSYmKG4rPWUubm9kZS51c2VkQnl0ZXMpLG48MCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtyZXR1cm4gbn0sYWxsb2NhdGUoZSxyLHQpe2IuZXhwYW5kRmlsZVN0b3JhZ2UoZS5ub2RlLHIrdCksZS5ub2RlLnVzZWRCeXRlcz1NYXRoLm1heChlLm5vZGUudXNlZEJ5dGVzLHIrdCl9LG1tYXAoZSxyLHQsbixhKXtpZighby5pc0ZpbGUoZS5ub2RlLm1vZGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDMpO3ZhciBpLHMsbD1lLm5vZGUuY29udGVudHM7aWYoIShhJjIpJiZsLmJ1ZmZlcj09PUkuYnVmZmVyKXM9ITEsaT1sLmJ5dGVPZmZzZXQ7ZWxzZXtpZigodD4wfHx0K3I8bC5sZW5ndGgpJiYobC5zdWJhcnJheT9sPWwuc3ViYXJyYXkodCx0K3IpOmw9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobCx0LHQrcikpLHM9ITAsaT1UcigpLCFpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDgpO0kuc2V0KGwsaSl9cmV0dXJue3B0cjppLGFsbG9jYXRlZDpzfX0sbXN5bmMoZSxyLHQsbixhKXtyZXR1cm4gYi5zdHJlYW1fb3BzLndyaXRlKGUsciwwLG4sdCwhMSksMH19fSxSdD0oZSxyLHQsbik9Pnt2YXIgYT1gYWwgJHtlfWA7bXIoZSxpPT57cihuZXcgVWludDhBcnJheShpKSksYSYmRmUoKX0saT0+e2lmKHQpdCgpO2Vsc2UgdGhyb3dgTG9hZGluZyBkYXRhIGZpbGUgIiR7ZX0iIGZhaWxlZC5gfSksYSYmWGUoKX0sT3Q9KGUscix0LG4sYSxpKT0+e28uY3JlYXRlRGF0YUZpbGUoZSxyLHQsbixhLGkpfSxJdD1mLnByZWxvYWRQbHVnaW5zfHxbXSxMdD0oZSxyLHQsbik9Pnt0eXBlb2YgQnJvd3NlcjwidSImJkJyb3dzZXIuaW5pdCgpO3ZhciBhPSExO3JldHVybiBJdC5mb3JFYWNoKGk9PnthfHxpLmNhbkhhbmRsZShyKSYmKGkuaGFuZGxlKGUscix0LG4pLGE9ITApfSksYX0sVnQ9KGUscix0LG4sYSxpLHMsbCx1LGMpPT57dmFyIGQ9cj9YLnJlc29sdmUoUy5qb2luMihlLHIpKTplO2Z1bmN0aW9uIG0oaCl7ZnVuY3Rpb24gcCh3KXtjPT1udWxsfHxjKCksbHx8T3QoZSxyLHcsbixhLHUpLGk9PW51bGx8fGkoKSxGZSgpfUx0KGgsZCxwLCgpPT57cz09bnVsbHx8cygpLEZlKCl9KXx8cChoKX1YZSgpLHR5cGVvZiB0PT0ic3RyaW5nIj9SdCh0LG0scyk6bSh0KX0sVXQ9ZT0+e3ZhciByPXtyOjAsInIrIjoyLHc6NTc3LCJ3KyI6NTc4LGE6MTA4OSwiYSsiOjEwOTB9LHQ9cltlXTtpZih0eXBlb2YgdD4idSIpdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGZpbGUgb3BlbiBtb2RlOiAke2V9YCk7cmV0dXJuIHR9LGVyPShlLHIpPT57dmFyIHQ9MDtyZXR1cm4gZSYmKHR8PTM2NSksciYmKHR8PTE0NiksdH0sVj17RElSX01PREU6MTY4OTUsRklMRV9NT0RFOjMzMjc5LHJlYWRlcjpudWxsLG1vdW50KGUpe19yKGFlKSxWLnJlYWRlcnx8KFYucmVhZGVyPW5ldyBGaWxlUmVhZGVyU3luYyk7dmFyIHI9Vi5jcmVhdGVOb2RlKG51bGwsIi8iLFYuRElSX01PREUsMCksdD17fTtmdW5jdGlvbiBuKGkpe2Zvcih2YXIgcz1pLnNwbGl0KCIvIiksbD1yLHU9MDt1PHMubGVuZ3RoLTE7dSsrKXt2YXIgYz1zLnNsaWNlKDAsdSsxKS5qb2luKCIvIik7dFtjXXx8KHRbY109Vi5jcmVhdGVOb2RlKGwsc1t1XSxWLkRJUl9NT0RFLDApKSxsPXRbY119cmV0dXJuIGx9ZnVuY3Rpb24gYShpKXt2YXIgcz1pLnNwbGl0KCIvIik7cmV0dXJuIHNbcy5sZW5ndGgtMV19cmV0dXJuIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZS5vcHRzLmZpbGVzfHxbXSxmdW5jdGlvbihpKXtWLmNyZWF0ZU5vZGUobihpLm5hbWUpLGEoaS5uYW1lKSxWLkZJTEVfTU9ERSwwLGksaS5sYXN0TW9kaWZpZWREYXRlKX0pLChlLm9wdHMuYmxvYnN8fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGkpe1YuY3JlYXRlTm9kZShuKGkubmFtZSksYShpLm5hbWUpLFYuRklMRV9NT0RFLDAsaS5kYXRhKX0pLChlLm9wdHMucGFja2FnZXN8fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGkpe2kubWV0YWRhdGEuZmlsZXMuZm9yRWFjaChmdW5jdGlvbihzKXt2YXIgbD1zLmZpbGVuYW1lLnN1YnN0cigxKTtWLmNyZWF0ZU5vZGUobihsKSxhKGwpLFYuRklMRV9NT0RFLDAsaS5ibG9iLnNsaWNlKHMuc3RhcnQscy5lbmQpKX0pfSkscn0sY3JlYXRlTm9kZShlLHIsdCxuLGEsaSl7dmFyIHM9by5jcmVhdGVOb2RlKGUscix0KTtyZXR1cm4gcy5tb2RlPXQscy5ub2RlX29wcz1WLm5vZGVfb3BzLHMuc3RyZWFtX29wcz1WLnN0cmVhbV9vcHMscy50aW1lc3RhbXA9KGl8fG5ldyBEYXRlKS5nZXRUaW1lKCksX3IoVi5GSUxFX01PREUhPT1WLkRJUl9NT0RFKSx0PT09Vi5GSUxFX01PREU/KHMuc2l6ZT1hLnNpemUscy5jb250ZW50cz1hKToocy5zaXplPTQwOTYscy5jb250ZW50cz17fSksZSYmKGUuY29udGVudHNbcl09cyksc30sbm9kZV9vcHM6e2dldGF0dHIoZSl7cmV0dXJue2RldjoxLGlubzplLmlkLG1vZGU6ZS5tb2RlLG5saW5rOjEsdWlkOjAsZ2lkOjAscmRldjowLHNpemU6ZS5zaXplLGF0aW1lOm5ldyBEYXRlKGUudGltZXN0YW1wKSxtdGltZTpuZXcgRGF0ZShlLnRpbWVzdGFtcCksY3RpbWU6bmV3IERhdGUoZS50aW1lc3RhbXApLGJsa3NpemU6NDA5NixibG9ja3M6TWF0aC5jZWlsKGUuc2l6ZS80MDk2KX19LHNldGF0dHIoZSxyKXtyLm1vZGUhPT12b2lkIDAmJihlLm1vZGU9ci5tb2RlKSxyLnRpbWVzdGFtcCE9PXZvaWQgMCYmKGUudGltZXN0YW1wPXIudGltZXN0YW1wKX0sbG9va3VwKGUscil7dGhyb3cgbmV3IG8uRXJybm9FcnJvcig0NCl9LG1rbm9kKGUscix0LG4pe3Rocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpfSxyZW5hbWUoZSxyLHQpe3Rocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpfSx1bmxpbmsoZSxyKXt0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKX0scm1kaXIoZSxyKXt0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKX0scmVhZGRpcihlKXt2YXIgcj1bIi4iLCIuLiJdO2Zvcih2YXIgdCBvZiBPYmplY3Qua2V5cyhlLmNvbnRlbnRzKSlyLnB1c2godCk7cmV0dXJuIHJ9LHN5bWxpbmsoZSxyLHQpe3Rocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpfX0sc3RyZWFtX29wczp7cmVhZChlLHIsdCxuLGEpe2lmKGE+PWUubm9kZS5zaXplKXJldHVybiAwO3ZhciBpPWUubm9kZS5jb250ZW50cy5zbGljZShhLGErbikscz1WLnJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihpKTtyZXR1cm4gci5zZXQobmV3IFVpbnQ4QXJyYXkocyksdCksaS5zaXplfSx3cml0ZShlLHIsdCxuLGEpe3Rocm93IG5ldyBvLkVycm5vRXJyb3IoMjkpfSxsbHNlZWsoZSxyLHQpe3ZhciBuPXI7aWYodD09PTE/bis9ZS5wb3NpdGlvbjp0PT09MiYmby5pc0ZpbGUoZS5ub2RlLm1vZGUpJiYobis9ZS5ub2RlLnNpemUpLG48MCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtyZXR1cm4gbn19fSxvPXtyb290Om51bGwsbW91bnRzOltdLGRldmljZXM6e30sc3RyZWFtczpbXSxuZXh0SW5vZGU6MSxuYW1lVGFibGU6bnVsbCxjdXJyZW50UGF0aDoiLyIsaW5pdGlhbGl6ZWQ6ITEsaWdub3JlUGVybWlzc2lvbnM6ITAsRXJybm9FcnJvcjpjbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLm5hbWU9IkVycm5vRXJyb3IiLHRoaXMuZXJybm89ZX19LGdlbmVyaWNFcnJvcnM6e30sZmlsZXN5c3RlbXM6bnVsbCxzeW5jRlNSZXF1ZXN0czowLEZTU3RyZWFtOmNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5zaGFyZWQ9e319Z2V0IG9iamVjdCgpe3JldHVybiB0aGlzLm5vZGV9c2V0IG9iamVjdChlKXt0aGlzLm5vZGU9ZX1nZXQgaXNSZWFkKCl7cmV0dXJuKHRoaXMuZmxhZ3MmMjA5NzE1NSkhPT0xfWdldCBpc1dyaXRlKCl7cmV0dXJuKHRoaXMuZmxhZ3MmMjA5NzE1NSkhPT0wfWdldCBpc0FwcGVuZCgpe3JldHVybiB0aGlzLmZsYWdzJjEwMjR9Z2V0IGZsYWdzKCl7cmV0dXJuIHRoaXMuc2hhcmVkLmZsYWdzfXNldCBmbGFncyhlKXt0aGlzLnNoYXJlZC5mbGFncz1lfWdldCBwb3NpdGlvbigpe3JldHVybiB0aGlzLnNoYXJlZC5wb3NpdGlvbn1zZXQgcG9zaXRpb24oZSl7dGhpcy5zaGFyZWQucG9zaXRpb249ZX19LEZTTm9kZTpjbGFzc3tjb25zdHJ1Y3RvcihlLHIsdCxuKXtlfHwoZT10aGlzKSx0aGlzLnBhcmVudD1lLHRoaXMubW91bnQ9ZS5tb3VudCx0aGlzLm1vdW50ZWQ9bnVsbCx0aGlzLmlkPW8ubmV4dElub2RlKyssdGhpcy5uYW1lPXIsdGhpcy5tb2RlPXQsdGhpcy5ub2RlX29wcz17fSx0aGlzLnN0cmVhbV9vcHM9e30sdGhpcy5yZGV2PW4sdGhpcy5yZWFkTW9kZT0zNjUsdGhpcy53cml0ZU1vZGU9MTQ2fWdldCByZWFkKCl7cmV0dXJuKHRoaXMubW9kZSZ0aGlzLnJlYWRNb2RlKT09PXRoaXMucmVhZE1vZGV9c2V0IHJlYWQoZSl7ZT90aGlzLm1vZGV8PXRoaXMucmVhZE1vZGU6dGhpcy5tb2RlJj1+dGhpcy5yZWFkTW9kZX1nZXQgd3JpdGUoKXtyZXR1cm4odGhpcy5tb2RlJnRoaXMud3JpdGVNb2RlKT09PXRoaXMud3JpdGVNb2RlfXNldCB3cml0ZShlKXtlP3RoaXMubW9kZXw9dGhpcy53cml0ZU1vZGU6dGhpcy5tb2RlJj1+dGhpcy53cml0ZU1vZGV9Z2V0IGlzRm9sZGVyKCl7cmV0dXJuIG8uaXNEaXIodGhpcy5tb2RlKX1nZXQgaXNEZXZpY2UoKXtyZXR1cm4gby5pc0NocmRldih0aGlzLm1vZGUpfX0sbG9va3VwUGF0aChlLHI9e30pe2lmKGU9WC5yZXNvbHZlKGUpLCFlKXJldHVybntwYXRoOiIiLG5vZGU6bnVsbH07dmFyIHQ9e2ZvbGxvd19tb3VudDohMCxyZWN1cnNlX2NvdW50OjB9O2lmKHI9T2JqZWN0LmFzc2lnbih0LHIpLHIucmVjdXJzZV9jb3VudD44KXRocm93IG5ldyBvLkVycm5vRXJyb3IoMzIpO2Zvcih2YXIgbj1lLnNwbGl0KCIvIikuZmlsdGVyKG09PiEhbSksYT1vLnJvb3QsaT0iLyIscz0wO3M8bi5sZW5ndGg7cysrKXt2YXIgbD1zPT09bi5sZW5ndGgtMTtpZihsJiZyLnBhcmVudClicmVhaztpZihhPW8ubG9va3VwTm9kZShhLG5bc10pLGk9Uy5qb2luMihpLG5bc10pLG8uaXNNb3VudHBvaW50KGEpJiYoIWx8fGwmJnIuZm9sbG93X21vdW50KSYmKGE9YS5tb3VudGVkLnJvb3QpLCFsfHxyLmZvbGxvdylmb3IodmFyIHU9MDtvLmlzTGluayhhLm1vZGUpOyl7dmFyIGM9by5yZWFkbGluayhpKTtpPVgucmVzb2x2ZShTLmRpcm5hbWUoaSksYyk7dmFyIGQ9by5sb29rdXBQYXRoKGkse3JlY3Vyc2VfY291bnQ6ci5yZWN1cnNlX2NvdW50KzF9KTtpZihhPWQubm9kZSx1Kys+NDApdGhyb3cgbmV3IG8uRXJybm9FcnJvcigzMil9fXJldHVybntwYXRoOmksbm9kZTphfX0sZ2V0UGF0aChlKXtmb3IodmFyIHI7Oyl7aWYoby5pc1Jvb3QoZSkpe3ZhciB0PWUubW91bnQubW91bnRwb2ludDtyZXR1cm4gcj90W3QubGVuZ3RoLTFdIT09Ii8iP2Ake3R9LyR7cn1gOnQrcjp0fXI9cj9gJHtlLm5hbWV9LyR7cn1gOmUubmFtZSxlPWUucGFyZW50fX0saGFzaE5hbWUoZSxyKXtmb3IodmFyIHQ9MCxuPTA7bjxyLmxlbmd0aDtuKyspdD0odDw8NSktdCtyLmNoYXJDb2RlQXQobil8MDtyZXR1cm4oZSt0Pj4+MCklby5uYW1lVGFibGUubGVuZ3RofSxoYXNoQWRkTm9kZShlKXt2YXIgcj1vLmhhc2hOYW1lKGUucGFyZW50LmlkLGUubmFtZSk7ZS5uYW1lX25leHQ9by5uYW1lVGFibGVbcl0sby5uYW1lVGFibGVbcl09ZX0saGFzaFJlbW92ZU5vZGUoZSl7dmFyIHI9by5oYXNoTmFtZShlLnBhcmVudC5pZCxlLm5hbWUpO2lmKG8ubmFtZVRhYmxlW3JdPT09ZSlvLm5hbWVUYWJsZVtyXT1lLm5hbWVfbmV4dDtlbHNlIGZvcih2YXIgdD1vLm5hbWVUYWJsZVtyXTt0Oyl7aWYodC5uYW1lX25leHQ9PT1lKXt0Lm5hbWVfbmV4dD1lLm5hbWVfbmV4dDticmVha310PXQubmFtZV9uZXh0fX0sbG9va3VwTm9kZShlLHIpe3ZhciB0PW8ubWF5TG9va3VwKGUpO2lmKHQpdGhyb3cgbmV3IG8uRXJybm9FcnJvcih0KTtmb3IodmFyIG49by5oYXNoTmFtZShlLmlkLHIpLGE9by5uYW1lVGFibGVbbl07YTthPWEubmFtZV9uZXh0KXt2YXIgaT1hLm5hbWU7aWYoYS5wYXJlbnQuaWQ9PT1lLmlkJiZpPT09cilyZXR1cm4gYX1yZXR1cm4gby5sb29rdXAoZSxyKX0sY3JlYXRlTm9kZShlLHIsdCxuKXt2YXIgYT1uZXcgby5GU05vZGUoZSxyLHQsbik7cmV0dXJuIG8uaGFzaEFkZE5vZGUoYSksYX0sZGVzdHJveU5vZGUoZSl7by5oYXNoUmVtb3ZlTm9kZShlKX0saXNSb290KGUpe3JldHVybiBlPT09ZS5wYXJlbnR9LGlzTW91bnRwb2ludChlKXtyZXR1cm4hIWUubW91bnRlZH0saXNGaWxlKGUpe3JldHVybihlJjYxNDQwKT09PTMyNzY4fSxpc0RpcihlKXtyZXR1cm4oZSY2MTQ0MCk9PT0xNjM4NH0saXNMaW5rKGUpe3JldHVybihlJjYxNDQwKT09PTQwOTYwfSxpc0NocmRldihlKXtyZXR1cm4oZSY2MTQ0MCk9PT04MTkyfSxpc0Jsa2RldihlKXtyZXR1cm4oZSY2MTQ0MCk9PT0yNDU3Nn0saXNGSUZPKGUpe3JldHVybihlJjYxNDQwKT09PTQwOTZ9LGlzU29ja2V0KGUpe3JldHVybihlJjQ5MTUyKT09PTQ5MTUyfSxmbGFnc1RvUGVybWlzc2lvblN0cmluZyhlKXt2YXIgcj1bInIiLCJ3IiwicnciXVtlJjNdO3JldHVybiBlJjUxMiYmKHIrPSJ3Iikscn0sbm9kZVBlcm1pc3Npb25zKGUscil7cmV0dXJuIG8uaWdub3JlUGVybWlzc2lvbnM/MDpyLmluY2x1ZGVzKCJyIikmJiEoZS5tb2RlJjI5Mil8fHIuaW5jbHVkZXMoInciKSYmIShlLm1vZGUmMTQ2KXx8ci5pbmNsdWRlcygieCIpJiYhKGUubW9kZSY3Myk/MjowfSxtYXlMb29rdXAoZSl7aWYoIW8uaXNEaXIoZS5tb2RlKSlyZXR1cm4gNTQ7dmFyIHI9by5ub2RlUGVybWlzc2lvbnMoZSwieCIpO3JldHVybiByfHwoZS5ub2RlX29wcy5sb29rdXA/MDoyKX0sbWF5Q3JlYXRlKGUscil7dHJ5e3ZhciB0PW8ubG9va3VwTm9kZShlLHIpO3JldHVybiAyMH1jYXRjaHt9cmV0dXJuIG8ubm9kZVBlcm1pc3Npb25zKGUsInd4Iil9LG1heURlbGV0ZShlLHIsdCl7dmFyIG47dHJ5e249by5sb29rdXBOb2RlKGUscil9Y2F0Y2goaSl7cmV0dXJuIGkuZXJybm99dmFyIGE9by5ub2RlUGVybWlzc2lvbnMoZSwid3giKTtpZihhKXJldHVybiBhO2lmKHQpe2lmKCFvLmlzRGlyKG4ubW9kZSkpcmV0dXJuIDU0O2lmKG8uaXNSb290KG4pfHxvLmdldFBhdGgobik9PT1vLmN3ZCgpKXJldHVybiAxMH1lbHNlIGlmKG8uaXNEaXIobi5tb2RlKSlyZXR1cm4gMzE7cmV0dXJuIDB9LG1heU9wZW4oZSxyKXtyZXR1cm4gZT9vLmlzTGluayhlLm1vZGUpPzMyOm8uaXNEaXIoZS5tb2RlKSYmKG8uZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmcocikhPT0iciJ8fHImNTEyKT8zMTpvLm5vZGVQZXJtaXNzaW9ucyhlLG8uZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmcocikpOjQ0fSxNQVhfT1BFTl9GRFM6NDA5NixuZXh0ZmQoKXtmb3IodmFyIGU9MDtlPD1vLk1BWF9PUEVOX0ZEUztlKyspaWYoIW8uc3RyZWFtc1tlXSlyZXR1cm4gZTt0aHJvdyBuZXcgby5FcnJub0Vycm9yKDMzKX0sZ2V0U3RyZWFtQ2hlY2tlZChlKXt2YXIgcj1vLmdldFN0cmVhbShlKTtpZighcil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDgpO3JldHVybiByfSxnZXRTdHJlYW06ZT0+by5zdHJlYW1zW2VdLGNyZWF0ZVN0cmVhbShlLHI9LTEpe3JldHVybiBlPU9iamVjdC5hc3NpZ24obmV3IG8uRlNTdHJlYW0sZSkscj09LTEmJihyPW8ubmV4dGZkKCkpLGUuZmQ9cixvLnN0cmVhbXNbcl09ZSxlfSxjbG9zZVN0cmVhbShlKXtvLnN0cmVhbXNbZV09bnVsbH0sZHVwU3RyZWFtKGUscj0tMSl7dmFyIG4sYTt2YXIgdD1vLmNyZWF0ZVN0cmVhbShlLHIpO3JldHVybihhPShuPXQuc3RyZWFtX29wcyk9PW51bGw/dm9pZCAwOm4uZHVwKT09bnVsbHx8YS5jYWxsKG4sdCksdH0sY2hyZGV2X3N0cmVhbV9vcHM6e29wZW4oZSl7dmFyIHQsbjt2YXIgcj1vLmdldERldmljZShlLm5vZGUucmRldik7ZS5zdHJlYW1fb3BzPXIuc3RyZWFtX29wcywobj0odD1lLnN0cmVhbV9vcHMpLm9wZW4pPT1udWxsfHxuLmNhbGwodCxlKX0sbGxzZWVrKCl7dGhyb3cgbmV3IG8uRXJybm9FcnJvcig3MCl9fSxtYWpvcjplPT5lPj44LG1pbm9yOmU9PmUmMjU1LG1ha2VkZXY6KGUscik9PmU8PDh8cixyZWdpc3RlckRldmljZShlLHIpe28uZGV2aWNlc1tlXT17c3RyZWFtX29wczpyfX0sZ2V0RGV2aWNlOmU9Pm8uZGV2aWNlc1tlXSxnZXRNb3VudHMoZSl7Zm9yKHZhciByPVtdLHQ9W2VdO3QubGVuZ3RoOyl7dmFyIG49dC5wb3AoKTtyLnB1c2gobiksdC5wdXNoKC4uLm4ubW91bnRzKX1yZXR1cm4gcn0sc3luY2ZzKGUscil7dHlwZW9mIGU9PSJmdW5jdGlvbiImJihyPWUsZT0hMSksby5zeW5jRlNSZXF1ZXN0cysrLG8uc3luY0ZTUmVxdWVzdHM+MSYmZWUoYHdhcm5pbmc6ICR7by5zeW5jRlNSZXF1ZXN0c30gRlMuc3luY2ZzIG9wZXJhdGlvbnMgaW4gZmxpZ2h0IGF0IG9uY2UsIHByb2JhYmx5IGp1c3QgZG9pbmcgZXh0cmEgd29ya2ApO3ZhciB0PW8uZ2V0TW91bnRzKG8ucm9vdC5tb3VudCksbj0wO2Z1bmN0aW9uIGEocyl7cmV0dXJuIG8uc3luY0ZTUmVxdWVzdHMtLSxyKHMpfWZ1bmN0aW9uIGkocyl7aWYocylyZXR1cm4gaS5lcnJvcmVkP3ZvaWQgMDooaS5lcnJvcmVkPSEwLGEocykpOysrbj49dC5sZW5ndGgmJmEobnVsbCl9dC5mb3JFYWNoKHM9PntpZighcy50eXBlLnN5bmNmcylyZXR1cm4gaShudWxsKTtzLnR5cGUuc3luY2ZzKHMsZSxpKX0pfSxtb3VudChlLHIsdCl7dmFyIG49dD09PSIvIixhPSF0LGk7aWYobiYmby5yb290KXRocm93IG5ldyBvLkVycm5vRXJyb3IoMTApO2lmKCFuJiYhYSl7dmFyIHM9by5sb29rdXBQYXRoKHQse2ZvbGxvd19tb3VudDohMX0pO2lmKHQ9cy5wYXRoLGk9cy5ub2RlLG8uaXNNb3VudHBvaW50KGkpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMTApO2lmKCFvLmlzRGlyKGkubW9kZSkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig1NCl9dmFyIGw9e3R5cGU6ZSxvcHRzOnIsbW91bnRwb2ludDp0LG1vdW50czpbXX0sdT1lLm1vdW50KGwpO3JldHVybiB1Lm1vdW50PWwsbC5yb290PXUsbj9vLnJvb3Q9dTppJiYoaS5tb3VudGVkPWwsaS5tb3VudCYmaS5tb3VudC5tb3VudHMucHVzaChsKSksdX0sdW5tb3VudChlKXt2YXIgcj1vLmxvb2t1cFBhdGgoZSx7Zm9sbG93X21vdW50OiExfSk7aWYoIW8uaXNNb3VudHBvaW50KHIubm9kZSkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOCk7dmFyIHQ9ci5ub2RlLG49dC5tb3VudGVkLGE9by5nZXRNb3VudHMobik7T2JqZWN0LmtleXMoby5uYW1lVGFibGUpLmZvckVhY2gocz0+e2Zvcih2YXIgbD1vLm5hbWVUYWJsZVtzXTtsOyl7dmFyIHU9bC5uYW1lX25leHQ7YS5pbmNsdWRlcyhsLm1vdW50KSYmby5kZXN0cm95Tm9kZShsKSxsPXV9fSksdC5tb3VudGVkPW51bGw7dmFyIGk9dC5tb3VudC5tb3VudHMuaW5kZXhPZihuKTt0Lm1vdW50Lm1vdW50cy5zcGxpY2UoaSwxKX0sbG9va3VwKGUscil7cmV0dXJuIGUubm9kZV9vcHMubG9va3VwKGUscil9LG1rbm9kKGUscix0KXt2YXIgbj1vLmxvb2t1cFBhdGgoZSx7cGFyZW50OiEwfSksYT1uLm5vZGUsaT1TLmJhc2VuYW1lKGUpO2lmKCFpfHxpPT09Ii4ifHxpPT09Ii4uIil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTt2YXIgcz1vLm1heUNyZWF0ZShhLGkpO2lmKHMpdGhyb3cgbmV3IG8uRXJybm9FcnJvcihzKTtpZighYS5ub2RlX29wcy5ta25vZCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtyZXR1cm4gYS5ub2RlX29wcy5ta25vZChhLGkscix0KX0sY3JlYXRlKGUscil7cmV0dXJuIHI9ciE9PXZvaWQgMD9yOjQzOCxyJj00MDk1LHJ8PTMyNzY4LG8ubWtub2QoZSxyLDApfSxta2RpcihlLHIpe3JldHVybiByPXIhPT12b2lkIDA/cjo1MTEsciY9MTAyMyxyfD0xNjM4NCxvLm1rbm9kKGUsciwwKX0sbWtkaXJUcmVlKGUscil7Zm9yKHZhciB0PWUuc3BsaXQoIi8iKSxuPSIiLGE9MDthPHQubGVuZ3RoOysrYSlpZih0W2FdKXtuKz0iLyIrdFthXTt0cnl7by5ta2RpcihuLHIpfWNhdGNoKGkpe2lmKGkuZXJybm8hPTIwKXRocm93IGl9fX0sbWtkZXYoZSxyLHQpe3JldHVybiB0eXBlb2YgdD4idSImJih0PXIscj00MzgpLHJ8PTgxOTIsby5ta25vZChlLHIsdCl9LHN5bWxpbmsoZSxyKXtpZighWC5yZXNvbHZlKGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDQpO3ZhciB0PW8ubG9va3VwUGF0aChyLHtwYXJlbnQ6ITB9KSxuPXQubm9kZTtpZighbil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ0KTt2YXIgYT1TLmJhc2VuYW1lKHIpLGk9by5tYXlDcmVhdGUobixhKTtpZihpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoaSk7aWYoIW4ubm9kZV9vcHMuc3ltbGluayl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtyZXR1cm4gbi5ub2RlX29wcy5zeW1saW5rKG4sYSxlKX0scmVuYW1lKGUscil7dmFyIHQ9Uy5kaXJuYW1lKGUpLG49Uy5kaXJuYW1lKHIpLGE9Uy5iYXNlbmFtZShlKSxpPVMuYmFzZW5hbWUocikscyxsLHU7aWYocz1vLmxvb2t1cFBhdGgoZSx7cGFyZW50OiEwfSksbD1zLm5vZGUscz1vLmxvb2t1cFBhdGgocix7cGFyZW50OiEwfSksdT1zLm5vZGUsIWx8fCF1KXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDQpO2lmKGwubW91bnQhPT11Lm1vdW50KXRocm93IG5ldyBvLkVycm5vRXJyb3IoNzUpO3ZhciBjPW8ubG9va3VwTm9kZShsLGEpLGQ9WC5yZWxhdGl2ZShlLG4pO2lmKGQuY2hhckF0KDApIT09Ii4iKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMjgpO2lmKGQ9WC5yZWxhdGl2ZShyLHQpLGQuY2hhckF0KDApIT09Ii4iKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNTUpO3ZhciBtO3RyeXttPW8ubG9va3VwTm9kZSh1LGkpfWNhdGNoe31pZihjIT09bSl7dmFyIGg9by5pc0RpcihjLm1vZGUpLHA9by5tYXlEZWxldGUobCxhLGgpO2lmKHApdGhyb3cgbmV3IG8uRXJybm9FcnJvcihwKTtpZihwPW0/by5tYXlEZWxldGUodSxpLGgpOm8ubWF5Q3JlYXRlKHUsaSkscCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKHApO2lmKCFsLm5vZGVfb3BzLnJlbmFtZSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtpZihvLmlzTW91bnRwb2ludChjKXx8bSYmby5pc01vdW50cG9pbnQobSkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcigxMCk7aWYodSE9PWwmJihwPW8ubm9kZVBlcm1pc3Npb25zKGwsInciKSxwKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKHApO28uaGFzaFJlbW92ZU5vZGUoYyk7dHJ5e2wubm9kZV9vcHMucmVuYW1lKGMsdSxpKX1jYXRjaCh3KXt0aHJvdyB3fWZpbmFsbHl7by5oYXNoQWRkTm9kZShjKX19fSxybWRpcihlKXt2YXIgcj1vLmxvb2t1cFBhdGgoZSx7cGFyZW50OiEwfSksdD1yLm5vZGUsbj1TLmJhc2VuYW1lKGUpLGE9by5sb29rdXBOb2RlKHQsbiksaT1vLm1heURlbGV0ZSh0LG4sITApO2lmKGkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcihpKTtpZighdC5ub2RlX29wcy5ybWRpcil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtpZihvLmlzTW91bnRwb2ludChhKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDEwKTt0Lm5vZGVfb3BzLnJtZGlyKHQsbiksby5kZXN0cm95Tm9kZShhKX0scmVhZGRpcihlKXt2YXIgcj1vLmxvb2t1cFBhdGgoZSx7Zm9sbG93OiEwfSksdD1yLm5vZGU7aWYoIXQubm9kZV9vcHMucmVhZGRpcil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDU0KTtyZXR1cm4gdC5ub2RlX29wcy5yZWFkZGlyKHQpfSx1bmxpbmsoZSl7dmFyIHI9by5sb29rdXBQYXRoKGUse3BhcmVudDohMH0pLHQ9ci5ub2RlO2lmKCF0KXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDQpO3ZhciBuPVMuYmFzZW5hbWUoZSksYT1vLmxvb2t1cE5vZGUodCxuKSxpPW8ubWF5RGVsZXRlKHQsbiwhMSk7aWYoaSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKGkpO2lmKCF0Lm5vZGVfb3BzLnVubGluayl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtpZihvLmlzTW91bnRwb2ludChhKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDEwKTt0Lm5vZGVfb3BzLnVubGluayh0LG4pLG8uZGVzdHJveU5vZGUoYSl9LHJlYWRsaW5rKGUpe3ZhciByPW8ubG9va3VwUGF0aChlKSx0PXIubm9kZTtpZighdCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ0KTtpZighdC5ub2RlX29wcy5yZWFkbGluayl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtyZXR1cm4gWC5yZXNvbHZlKG8uZ2V0UGF0aCh0LnBhcmVudCksdC5ub2RlX29wcy5yZWFkbGluayh0KSl9LHN0YXQoZSxyKXt2YXIgdD1vLmxvb2t1cFBhdGgoZSx7Zm9sbG93OiFyfSksbj10Lm5vZGU7aWYoIW4pdGhyb3cgbmV3IG8uRXJybm9FcnJvcig0NCk7aWYoIW4ubm9kZV9vcHMuZ2V0YXR0cil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtyZXR1cm4gbi5ub2RlX29wcy5nZXRhdHRyKG4pfSxsc3RhdChlKXtyZXR1cm4gby5zdGF0KGUsITApfSxjaG1vZChlLHIsdCl7dmFyIG47aWYodHlwZW9mIGU9PSJzdHJpbmciKXt2YXIgYT1vLmxvb2t1cFBhdGgoZSx7Zm9sbG93OiF0fSk7bj1hLm5vZGV9ZWxzZSBuPWU7aWYoIW4ubm9kZV9vcHMuc2V0YXR0cil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtuLm5vZGVfb3BzLnNldGF0dHIobix7bW9kZTpyJjQwOTV8bi5tb2RlJi00MDk2LHRpbWVzdGFtcDpEYXRlLm5vdygpfSl9LGxjaG1vZChlLHIpe28uY2htb2QoZSxyLCEwKX0sZmNobW9kKGUscil7dmFyIHQ9by5nZXRTdHJlYW1DaGVja2VkKGUpO28uY2htb2QodC5ub2RlLHIpfSxjaG93bihlLHIsdCxuKXt2YXIgYTtpZih0eXBlb2YgZT09InN0cmluZyIpe3ZhciBpPW8ubG9va3VwUGF0aChlLHtmb2xsb3c6IW59KTthPWkubm9kZX1lbHNlIGE9ZTtpZighYS5ub2RlX29wcy5zZXRhdHRyKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpO2Eubm9kZV9vcHMuc2V0YXR0cihhLHt0aW1lc3RhbXA6RGF0ZS5ub3coKX0pfSxsY2hvd24oZSxyLHQpe28uY2hvd24oZSxyLHQsITApfSxmY2hvd24oZSxyLHQpe3ZhciBuPW8uZ2V0U3RyZWFtQ2hlY2tlZChlKTtvLmNob3duKG4ubm9kZSxyLHQpfSx0cnVuY2F0ZShlLHIpe2lmKHI8MCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTt2YXIgdDtpZih0eXBlb2YgZT09InN0cmluZyIpe3ZhciBuPW8ubG9va3VwUGF0aChlLHtmb2xsb3c6ITB9KTt0PW4ubm9kZX1lbHNlIHQ9ZTtpZighdC5ub2RlX29wcy5zZXRhdHRyKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpO2lmKG8uaXNEaXIodC5tb2RlKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDMxKTtpZighby5pc0ZpbGUodC5tb2RlKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTt2YXIgYT1vLm5vZGVQZXJtaXNzaW9ucyh0LCJ3Iik7aWYoYSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKGEpO3Qubm9kZV9vcHMuc2V0YXR0cih0LHtzaXplOnIsdGltZXN0YW1wOkRhdGUubm93KCl9KX0sZnRydW5jYXRlKGUscil7dmFyIHQ9by5nZXRTdHJlYW1DaGVja2VkKGUpO2lmKCEodC5mbGFncyYyMDk3MTU1KSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtvLnRydW5jYXRlKHQubm9kZSxyKX0sdXRpbWUoZSxyLHQpe3ZhciBuPW8ubG9va3VwUGF0aChlLHtmb2xsb3c6ITB9KSxhPW4ubm9kZTthLm5vZGVfb3BzLnNldGF0dHIoYSx7dGltZXN0YW1wOk1hdGgubWF4KHIsdCl9KX0sb3BlbihlLHIsdCl7aWYoZT09PSIiKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDQpO3I9dHlwZW9mIHI9PSJzdHJpbmciP1V0KHIpOnIsciY2ND8odD10eXBlb2YgdD4idSI/NDM4OnQsdD10JjQwOTV8MzI3NjgpOnQ9MDt2YXIgbjtpZih0eXBlb2YgZT09Im9iamVjdCIpbj1lO2Vsc2V7ZT1TLm5vcm1hbGl6ZShlKTt0cnl7dmFyIGE9by5sb29rdXBQYXRoKGUse2ZvbGxvdzohKHImMTMxMDcyKX0pO249YS5ub2RlfWNhdGNoe319dmFyIGk9ITE7aWYociY2NClpZihuKXtpZihyJjEyOCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDIwKX1lbHNlIG49by5ta25vZChlLHQsMCksaT0hMDtpZighbil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ0KTtpZihvLmlzQ2hyZGV2KG4ubW9kZSkmJihyJj0tNTEzKSxyJjY1NTM2JiYhby5pc0RpcihuLm1vZGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNTQpO2lmKCFpKXt2YXIgcz1vLm1heU9wZW4obixyKTtpZihzKXRocm93IG5ldyBvLkVycm5vRXJyb3Iocyl9ciY1MTImJiFpJiZvLnRydW5jYXRlKG4sMCksciY9LTEzMTcxMzt2YXIgbD1vLmNyZWF0ZVN0cmVhbSh7bm9kZTpuLHBhdGg6by5nZXRQYXRoKG4pLGZsYWdzOnIsc2Vla2FibGU6ITAscG9zaXRpb246MCxzdHJlYW1fb3BzOm4uc3RyZWFtX29wcyx1bmdvdHRlbjpbXSxlcnJvcjohMX0pO3JldHVybiBsLnN0cmVhbV9vcHMub3BlbiYmbC5zdHJlYW1fb3BzLm9wZW4obCksZi5sb2dSZWFkRmlsZXMmJiEociYxKSYmKG8ucmVhZEZpbGVzfHwoby5yZWFkRmlsZXM9e30pLGUgaW4gby5yZWFkRmlsZXN8fChvLnJlYWRGaWxlc1tlXT0xKSksbH0sY2xvc2UoZSl7aWYoby5pc0Nsb3NlZChlKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDgpO2UuZ2V0ZGVudHMmJihlLmdldGRlbnRzPW51bGwpO3RyeXtlLnN0cmVhbV9vcHMuY2xvc2UmJmUuc3RyZWFtX29wcy5jbG9zZShlKX1jYXRjaChyKXt0aHJvdyByfWZpbmFsbHl7by5jbG9zZVN0cmVhbShlLmZkKX1lLmZkPW51bGx9LGlzQ2xvc2VkKGUpe3JldHVybiBlLmZkPT09bnVsbH0sbGxzZWVrKGUscix0KXtpZihvLmlzQ2xvc2VkKGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoOCk7aWYoIWUuc2Vla2FibGV8fCFlLnN0cmVhbV9vcHMubGxzZWVrKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNzApO2lmKHQhPTAmJnQhPTEmJnQhPTIpdGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOCk7cmV0dXJuIGUucG9zaXRpb249ZS5zdHJlYW1fb3BzLmxsc2VlayhlLHIsdCksZS51bmdvdHRlbj1bXSxlLnBvc2l0aW9ufSxyZWFkKGUscix0LG4sYSl7aWYobjwwfHxhPDApdGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOCk7aWYoby5pc0Nsb3NlZChlKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDgpO2lmKChlLmZsYWdzJjIwOTcxNTUpPT09MSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDgpO2lmKG8uaXNEaXIoZS5ub2RlLm1vZGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMzEpO2lmKCFlLnN0cmVhbV9vcHMucmVhZCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTt2YXIgaT10eXBlb2YgYTwidSI7aWYoIWkpYT1lLnBvc2l0aW9uO2Vsc2UgaWYoIWUuc2Vla2FibGUpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig3MCk7dmFyIHM9ZS5zdHJlYW1fb3BzLnJlYWQoZSxyLHQsbixhKTtyZXR1cm4gaXx8KGUucG9zaXRpb24rPXMpLHN9LHdyaXRlKGUscix0LG4sYSxpKXtpZihuPDB8fGE8MCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtpZihvLmlzQ2xvc2VkKGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoOCk7aWYoIShlLmZsYWdzJjIwOTcxNTUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoOCk7aWYoby5pc0RpcihlLm5vZGUubW9kZSkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcigzMSk7aWYoIWUuc3RyZWFtX29wcy53cml0ZSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtlLnNlZWthYmxlJiZlLmZsYWdzJjEwMjQmJm8ubGxzZWVrKGUsMCwyKTt2YXIgcz10eXBlb2YgYTwidSI7aWYoIXMpYT1lLnBvc2l0aW9uO2Vsc2UgaWYoIWUuc2Vla2FibGUpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig3MCk7dmFyIGw9ZS5zdHJlYW1fb3BzLndyaXRlKGUscix0LG4sYSxpKTtyZXR1cm4gc3x8KGUucG9zaXRpb24rPWwpLGx9LGFsbG9jYXRlKGUscix0KXtpZihvLmlzQ2xvc2VkKGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoOCk7aWYocjwwfHx0PD0wKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMjgpO2lmKCEoZS5mbGFncyYyMDk3MTU1KSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDgpO2lmKCFvLmlzRmlsZShlLm5vZGUubW9kZSkmJiFvLmlzRGlyKGUubm9kZS5tb2RlKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQzKTtpZighZS5zdHJlYW1fb3BzLmFsbG9jYXRlKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMTM4KTtlLnN0cmVhbV9vcHMuYWxsb2NhdGUoZSxyLHQpfSxtbWFwKGUscix0LG4sYSl7aWYobiYyJiYhKGEmMikmJihlLmZsYWdzJjIwOTcxNTUpIT09Mil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDIpO2lmKChlLmZsYWdzJjIwOTcxNTUpPT09MSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDIpO2lmKCFlLnN0cmVhbV9vcHMubW1hcCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQzKTtyZXR1cm4gZS5zdHJlYW1fb3BzLm1tYXAoZSxyLHQsbixhKX0sbXN5bmMoZSxyLHQsbixhKXtyZXR1cm4gZS5zdHJlYW1fb3BzLm1zeW5jP2Uuc3RyZWFtX29wcy5tc3luYyhlLHIsdCxuLGEpOjB9LGlvY3RsKGUscix0KXtpZighZS5zdHJlYW1fb3BzLmlvY3RsKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNTkpO3JldHVybiBlLnN0cmVhbV9vcHMuaW9jdGwoZSxyLHQpfSxyZWFkRmlsZShlLHI9e30pe2lmKHIuZmxhZ3M9ci5mbGFnc3x8MCxyLmVuY29kaW5nPXIuZW5jb2Rpbmd8fCJiaW5hcnkiLHIuZW5jb2RpbmchPT0idXRmOCImJnIuZW5jb2RpbmchPT0iYmluYXJ5Iil0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZW5jb2RpbmcgdHlwZSAiJHtyLmVuY29kaW5nfSJgKTt2YXIgdCxuPW8ub3BlbihlLHIuZmxhZ3MpLGE9by5zdGF0KGUpLGk9YS5zaXplLHM9bmV3IFVpbnQ4QXJyYXkoaSk7cmV0dXJuIG8ucmVhZChuLHMsMCxpLDApLHIuZW5jb2Rpbmc9PT0idXRmOCI/dD1jZShzLDApOnIuZW5jb2Rpbmc9PT0iYmluYXJ5IiYmKHQ9cyksby5jbG9zZShuKSx0fSx3cml0ZUZpbGUoZSxyLHQ9e30pe3QuZmxhZ3M9dC5mbGFnc3x8NTc3O3ZhciBuPW8ub3BlbihlLHQuZmxhZ3MsdC5tb2RlKTtpZih0eXBlb2Ygcj09InN0cmluZyIpe3ZhciBhPW5ldyBVaW50OEFycmF5KFplKHIpKzEpLGk9UWUocixhLDAsYS5sZW5ndGgpO28ud3JpdGUobixhLDAsaSx2b2lkIDAsdC5jYW5Pd24pfWVsc2UgaWYoQXJyYXlCdWZmZXIuaXNWaWV3KHIpKW8ud3JpdGUobixyLDAsci5ieXRlTGVuZ3RoLHZvaWQgMCx0LmNhbk93bik7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIGRhdGEgdHlwZSIpO28uY2xvc2Uobil9LGN3ZDooKT0+by5jdXJyZW50UGF0aCxjaGRpcihlKXt2YXIgcj1vLmxvb2t1cFBhdGgoZSx7Zm9sbG93OiEwfSk7aWYoci5ub2RlPT09bnVsbCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ0KTtpZighby5pc0RpcihyLm5vZGUubW9kZSkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig1NCk7dmFyIHQ9by5ub2RlUGVybWlzc2lvbnMoci5ub2RlLCJ4Iik7aWYodCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKHQpO28uY3VycmVudFBhdGg9ci5wYXRofSxjcmVhdGVEZWZhdWx0RGlyZWN0b3JpZXMoKXtvLm1rZGlyKCIvdG1wIiksby5ta2RpcigiL2hvbWUiKSxvLm1rZGlyKCIvaG9tZS93ZWJfdXNlciIpfSxjcmVhdGVEZWZhdWx0RGV2aWNlcygpe28ubWtkaXIoIi9kZXYiKSxvLnJlZ2lzdGVyRGV2aWNlKG8ubWFrZWRldigxLDMpLHtyZWFkOigpPT4wLHdyaXRlOihuLGEsaSxzLGwpPT5zfSksby5ta2RldigiL2Rldi9udWxsIixvLm1ha2VkZXYoMSwzKSksbGUucmVnaXN0ZXIoby5tYWtlZGV2KDUsMCksbGUuZGVmYXVsdF90dHlfb3BzKSxsZS5yZWdpc3RlcihvLm1ha2VkZXYoNiwwKSxsZS5kZWZhdWx0X3R0eTFfb3BzKSxvLm1rZGV2KCIvZGV2L3R0eSIsby5tYWtlZGV2KDUsMCkpLG8ubWtkZXYoIi9kZXYvdHR5MSIsby5tYWtlZGV2KDYsMCkpO3ZhciBlPW5ldyBVaW50OEFycmF5KDEwMjQpLHI9MCx0PSgpPT4ocj09PTAmJihyPUZyKGUpLmJ5dGVMZW5ndGgpLGVbLS1yXSk7by5jcmVhdGVEZXZpY2UoIi9kZXYiLCJyYW5kb20iLHQpLG8uY3JlYXRlRGV2aWNlKCIvZGV2IiwidXJhbmRvbSIsdCksby5ta2RpcigiL2Rldi9zaG0iKSxvLm1rZGlyKCIvZGV2L3NobS90bXAiKX0sY3JlYXRlU3BlY2lhbERpcmVjdG9yaWVzKCl7by5ta2RpcigiL3Byb2MiKTt2YXIgZT1vLm1rZGlyKCIvcHJvYy9zZWxmIik7by5ta2RpcigiL3Byb2Mvc2VsZi9mZCIpLG8ubW91bnQoe21vdW50KCl7dmFyIHI9by5jcmVhdGVOb2RlKGUsImZkIiwxNjg5NSw3Myk7cmV0dXJuIHIubm9kZV9vcHM9e2xvb2t1cCh0LG4pe3ZhciBhPStuLGk9by5nZXRTdHJlYW1DaGVja2VkKGEpLHM9e3BhcmVudDpudWxsLG1vdW50Onttb3VudHBvaW50OiJmYWtlIn0sbm9kZV9vcHM6e3JlYWRsaW5rOigpPT5pLnBhdGh9fTtyZXR1cm4gcy5wYXJlbnQ9cyxzfX0scn19LHt9LCIvcHJvYy9zZWxmL2ZkIil9LGNyZWF0ZVN0YW5kYXJkU3RyZWFtcygpe2Yuc3RkaW4/by5jcmVhdGVEZXZpY2UoIi9kZXYiLCJzdGRpbiIsZi5zdGRpbik6by5zeW1saW5rKCIvZGV2L3R0eSIsIi9kZXYvc3RkaW4iKSxmLnN0ZG91dD9vLmNyZWF0ZURldmljZSgiL2RldiIsInN0ZG91dCIsbnVsbCxmLnN0ZG91dCk6by5zeW1saW5rKCIvZGV2L3R0eSIsIi9kZXYvc3Rkb3V0IiksZi5zdGRlcnI/by5jcmVhdGVEZXZpY2UoIi9kZXYiLCJzdGRlcnIiLG51bGwsZi5zdGRlcnIpOm8uc3ltbGluaygiL2Rldi90dHkxIiwiL2Rldi9zdGRlcnIiKSxvLm9wZW4oIi9kZXYvc3RkaW4iLDApLG8ub3BlbigiL2Rldi9zdGRvdXQiLDEpLG8ub3BlbigiL2Rldi9zdGRlcnIiLDEpfSxzdGF0aWNJbml0KCl7WzQ0XS5mb3JFYWNoKGU9PntvLmdlbmVyaWNFcnJvcnNbZV09bmV3IG8uRXJybm9FcnJvcihlKSxvLmdlbmVyaWNFcnJvcnNbZV0uc3RhY2s9IjxnZW5lcmljIGVycm9yLCBubyBzdGFjaz4ifSksby5uYW1lVGFibGU9bmV3IEFycmF5KDQwOTYpLG8ubW91bnQoYix7fSwiLyIpLG8uY3JlYXRlRGVmYXVsdERpcmVjdG9yaWVzKCksby5jcmVhdGVEZWZhdWx0RGV2aWNlcygpLG8uY3JlYXRlU3BlY2lhbERpcmVjdG9yaWVzKCksby5maWxlc3lzdGVtcz17TUVNRlM6YixXT1JLRVJGUzpWfX0saW5pdChlLHIsdCl7by5pbml0LmluaXRpYWxpemVkPSEwLGYuc3RkaW49ZXx8Zi5zdGRpbixmLnN0ZG91dD1yfHxmLnN0ZG91dCxmLnN0ZGVycj10fHxmLnN0ZGVycixvLmNyZWF0ZVN0YW5kYXJkU3RyZWFtcygpfSxxdWl0KCl7by5pbml0LmluaXRpYWxpemVkPSExO2Zvcih2YXIgZT0wO2U8by5zdHJlYW1zLmxlbmd0aDtlKyspe3ZhciByPW8uc3RyZWFtc1tlXTtyJiZvLmNsb3NlKHIpfX0sZmluZE9iamVjdChlLHIpe3ZhciB0PW8uYW5hbHl6ZVBhdGgoZSxyKTtyZXR1cm4gdC5leGlzdHM/dC5vYmplY3Q6bnVsbH0sYW5hbHl6ZVBhdGgoZSxyKXt0cnl7dmFyIHQ9by5sb29rdXBQYXRoKGUse2ZvbGxvdzohcn0pO2U9dC5wYXRofWNhdGNoe312YXIgbj17aXNSb290OiExLGV4aXN0czohMSxlcnJvcjowLG5hbWU6bnVsbCxwYXRoOm51bGwsb2JqZWN0Om51bGwscGFyZW50RXhpc3RzOiExLHBhcmVudFBhdGg6bnVsbCxwYXJlbnRPYmplY3Q6bnVsbH07dHJ5e3ZhciB0PW8ubG9va3VwUGF0aChlLHtwYXJlbnQ6ITB9KTtuLnBhcmVudEV4aXN0cz0hMCxuLnBhcmVudFBhdGg9dC5wYXRoLG4ucGFyZW50T2JqZWN0PXQubm9kZSxuLm5hbWU9Uy5iYXNlbmFtZShlKSx0PW8ubG9va3VwUGF0aChlLHtmb2xsb3c6IXJ9KSxuLmV4aXN0cz0hMCxuLnBhdGg9dC5wYXRoLG4ub2JqZWN0PXQubm9kZSxuLm5hbWU9dC5ub2RlLm5hbWUsbi5pc1Jvb3Q9dC5wYXRoPT09Ii8ifWNhdGNoKGEpe24uZXJyb3I9YS5lcnJub31yZXR1cm4gbn0sY3JlYXRlUGF0aChlLHIsdCxuKXtlPXR5cGVvZiBlPT0ic3RyaW5nIj9lOm8uZ2V0UGF0aChlKTtmb3IodmFyIGE9ci5zcGxpdCgiLyIpLnJldmVyc2UoKTthLmxlbmd0aDspe3ZhciBpPWEucG9wKCk7aWYoaSl7dmFyIHM9Uy5qb2luMihlLGkpO3RyeXtvLm1rZGlyKHMpfWNhdGNoe31lPXN9fXJldHVybiBzfSxjcmVhdGVGaWxlKGUscix0LG4sYSl7dmFyIGk9Uy5qb2luMih0eXBlb2YgZT09InN0cmluZyI/ZTpvLmdldFBhdGgoZSkscikscz1lcihuLGEpO3JldHVybiBvLmNyZWF0ZShpLHMpfSxjcmVhdGVEYXRhRmlsZShlLHIsdCxuLGEsaSl7dmFyIHM9cjtlJiYoZT10eXBlb2YgZT09InN0cmluZyI/ZTpvLmdldFBhdGgoZSkscz1yP1Muam9pbjIoZSxyKTplKTt2YXIgbD1lcihuLGEpLHU9by5jcmVhdGUocyxsKTtpZih0KXtpZih0eXBlb2YgdD09InN0cmluZyIpe2Zvcih2YXIgYz1uZXcgQXJyYXkodC5sZW5ndGgpLGQ9MCxtPXQubGVuZ3RoO2Q8bTsrK2QpY1tkXT10LmNoYXJDb2RlQXQoZCk7dD1jfW8uY2htb2QodSxsfDE0Nik7dmFyIGg9by5vcGVuKHUsNTc3KTtvLndyaXRlKGgsdCwwLHQubGVuZ3RoLDAsaSksby5jbG9zZShoKSxvLmNobW9kKHUsbCl9fSxjcmVhdGVEZXZpY2UoZSxyLHQsbil7dmFyIGE9Uy5qb2luMih0eXBlb2YgZT09InN0cmluZyI/ZTpvLmdldFBhdGgoZSksciksaT1lcighIXQsISFuKTtvLmNyZWF0ZURldmljZS5tYWpvcnx8KG8uY3JlYXRlRGV2aWNlLm1ham9yPTY0KTt2YXIgcz1vLm1ha2VkZXYoby5jcmVhdGVEZXZpY2UubWFqb3IrKywwKTtyZXR1cm4gby5yZWdpc3RlckRldmljZShzLHtvcGVuKGwpe2wuc2Vla2FibGU9ITF9LGNsb3NlKGwpe3ZhciB1Oyh1PW49PW51bGw/dm9pZCAwOm4uYnVmZmVyKSE9bnVsbCYmdS5sZW5ndGgmJm4oMTApfSxyZWFkKGwsdSxjLGQsbSl7Zm9yKHZhciBoPTAscD0wO3A8ZDtwKyspe3ZhciB3O3RyeXt3PXQoKX1jYXRjaHt0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI5KX1pZih3PT09dm9pZCAwJiZoPT09MCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYpO2lmKHc9PW51bGwpYnJlYWs7aCsrLHVbYytwXT13fXJldHVybiBoJiYobC5ub2RlLnRpbWVzdGFtcD1EYXRlLm5vdygpKSxofSx3cml0ZShsLHUsYyxkLG0pe2Zvcih2YXIgaD0wO2g8ZDtoKyspdHJ5e24odVtjK2hdKX1jYXRjaHt0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI5KX1yZXR1cm4gZCYmKGwubm9kZS50aW1lc3RhbXA9RGF0ZS5ub3coKSksaH19KSxvLm1rZGV2KGEsaSxzKX0sZm9yY2VMb2FkRmlsZShlKXtpZihlLmlzRGV2aWNlfHxlLmlzRm9sZGVyfHxlLmxpbmt8fGUuY29udGVudHMpcmV0dXJuITA7aWYodHlwZW9mIFhNTEh0dHBSZXF1ZXN0PCJ1Iil0aHJvdyBuZXcgRXJyb3IoIkxhenkgbG9hZGluZyBzaG91bGQgaGF2ZSBiZWVuIHBlcmZvcm1lZCAoY29udGVudHMgc2V0KSBpbiBjcmVhdGVMYXp5RmlsZSwgYnV0IGl0IHdhcyBub3QuIExhenkgbG9hZGluZyBvbmx5IHdvcmtzIGluIHdlYiB3b3JrZXJzLiBVc2UgLS1lbWJlZC1maWxlIG9yIC0tcHJlbG9hZC1maWxlIGluIGVtY2Mgb24gdGhlIG1haW4gdGhyZWFkLiIpO2lmKFllKXRyeXtlLmNvbnRlbnRzPVNlKFllKGUudXJsKSwhMCksZS51c2VkQnl0ZXM9ZS5jb250ZW50cy5sZW5ndGh9Y2F0Y2h7dGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOSl9ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBsb2FkIHdpdGhvdXQgcmVhZCgpIG9yIFhNTEh0dHBSZXF1ZXN0LiIpfSxjcmVhdGVMYXp5RmlsZShlLHIsdCxuLGEpe2NsYXNzIGl7Y29uc3RydWN0b3IoKXt0aGlzLmxlbmd0aEtub3duPSExLHRoaXMuY2h1bmtzPVtdfWdldChwKXtpZighKHA+dGhpcy5sZW5ndGgtMXx8cDwwKSl7dmFyIHc9cCV0aGlzLmNodW5rU2l6ZSxEPXAvdGhpcy5jaHVua1NpemV8MDtyZXR1cm4gdGhpcy5nZXR0ZXIoRClbd119fXNldERhdGFHZXR0ZXIocCl7dGhpcy5nZXR0ZXI9cH1jYWNoZUxlbmd0aCgpe3ZhciBwPW5ldyBYTUxIdHRwUmVxdWVzdDtpZihwLm9wZW4oIkhFQUQiLHQsITEpLHAuc2VuZChudWxsKSwhKHAuc3RhdHVzPj0yMDAmJnAuc3RhdHVzPDMwMHx8cC5zdGF0dXM9PT0zMDQpKXRocm93IG5ldyBFcnJvcigiQ291bGRuJ3QgbG9hZCAiK3QrIi4gU3RhdHVzOiAiK3Auc3RhdHVzKTt2YXIgdz1OdW1iZXIocC5nZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1sZW5ndGgiKSksRCxNPShEPXAuZ2V0UmVzcG9uc2VIZWFkZXIoIkFjY2VwdC1SYW5nZXMiKSkmJkQ9PT0iYnl0ZXMiLEY9KEQ9cC5nZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1FbmNvZGluZyIpKSYmRD09PSJnemlwIix2PTEwMjQqMTAyNDtNfHwodj13KTt2YXIgXz0oVCxCKT0+e2lmKFQ+Qil0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgcmFuZ2UgKCIrVCsiLCAiK0IrIikgb3Igbm8gYnl0ZXMgcmVxdWVzdGVkISIpO2lmKEI+dy0xKXRocm93IG5ldyBFcnJvcigib25seSAiK3crIiBieXRlcyBhdmFpbGFibGUhIHByb2dyYW1tZXIgZXJyb3IhIik7dmFyIE89bmV3IFhNTEh0dHBSZXF1ZXN0O2lmKE8ub3BlbigiR0VUIix0LCExKSx3IT09diYmTy5zZXRSZXF1ZXN0SGVhZGVyKCJSYW5nZSIsImJ5dGVzPSIrVCsiLSIrQiksTy5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIixPLm92ZXJyaWRlTWltZVR5cGUmJk8ub3ZlcnJpZGVNaW1lVHlwZSgidGV4dC9wbGFpbjsgY2hhcnNldD14LXVzZXItZGVmaW5lZCIpLE8uc2VuZChudWxsKSwhKE8uc3RhdHVzPj0yMDAmJk8uc3RhdHVzPDMwMHx8Ty5zdGF0dXM9PT0zMDQpKXRocm93IG5ldyBFcnJvcigiQ291bGRuJ3QgbG9hZCAiK3QrIi4gU3RhdHVzOiAiK08uc3RhdHVzKTtyZXR1cm4gTy5yZXNwb25zZSE9PXZvaWQgMD9uZXcgVWludDhBcnJheShPLnJlc3BvbnNlfHxbXSk6U2UoTy5yZXNwb25zZVRleHR8fCIiLCEwKX0sTD10aGlzO0wuc2V0RGF0YUdldHRlcihUPT57dmFyIEI9VCp2LE89KFQrMSkqdi0xO2lmKE89TWF0aC5taW4oTyx3LTEpLHR5cGVvZiBMLmNodW5rc1tUXT4idSImJihMLmNodW5rc1tUXT1fKEIsTykpLHR5cGVvZiBMLmNodW5rc1tUXT4idSIpdGhyb3cgbmV3IEVycm9yKCJkb1hIUiBmYWlsZWQhIik7cmV0dXJuIEwuY2h1bmtzW1RdfSksKEZ8fCF3KSYmKHY9dz0xLHc9dGhpcy5nZXR0ZXIoMCkubGVuZ3RoLHY9dyxxZSgiTGF6eUZpbGVzIG9uIGd6aXAgZm9yY2VzIGRvd25sb2FkIG9mIHRoZSB3aG9sZSBmaWxlIHdoZW4gbGVuZ3RoIGlzIGFjY2Vzc2VkIikpLHRoaXMuX2xlbmd0aD13LHRoaXMuX2NodW5rU2l6ZT12LHRoaXMubGVuZ3RoS25vd249ITB9Z2V0IGxlbmd0aCgpe3JldHVybiB0aGlzLmxlbmd0aEtub3dufHx0aGlzLmNhY2hlTGVuZ3RoKCksdGhpcy5fbGVuZ3RofWdldCBjaHVua1NpemUoKXtyZXR1cm4gdGhpcy5sZW5ndGhLbm93bnx8dGhpcy5jYWNoZUxlbmd0aCgpLHRoaXMuX2NodW5rU2l6ZX19aWYodHlwZW9mIFhNTEh0dHBSZXF1ZXN0PCJ1Iil2YXIgcz1uZXcgaSxsPXtpc0RldmljZTohMSxjb250ZW50czpzfTtlbHNlIHZhciBsPXtpc0RldmljZTohMSx1cmw6dH07dmFyIHU9by5jcmVhdGVGaWxlKGUscixsLG4sYSk7bC5jb250ZW50cz91LmNvbnRlbnRzPWwuY29udGVudHM6bC51cmwmJih1LmNvbnRlbnRzPW51bGwsdS51cmw9bC51cmwpLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHUse3VzZWRCeXRlczp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGVudHMubGVuZ3RofX19KTt2YXIgYz17fSxkPU9iamVjdC5rZXlzKHUuc3RyZWFtX29wcyk7ZC5mb3JFYWNoKGg9Pnt2YXIgcD11LnN0cmVhbV9vcHNbaF07Y1toXT0oLi4udyk9PihvLmZvcmNlTG9hZEZpbGUodSkscCguLi53KSl9KTtmdW5jdGlvbiBtKGgscCx3LEQsTSl7dmFyIEY9aC5ub2RlLmNvbnRlbnRzO2lmKE0+PUYubGVuZ3RoKXJldHVybiAwO3ZhciB2PU1hdGgubWluKEYubGVuZ3RoLU0sRCk7aWYoRi5zbGljZSlmb3IodmFyIF89MDtfPHY7XysrKXBbdytfXT1GW00rX107ZWxzZSBmb3IodmFyIF89MDtfPHY7XysrKXBbdytfXT1GLmdldChNK18pO3JldHVybiB2fXJldHVybiBjLnJlYWQ9KGgscCx3LEQsTSk9PihvLmZvcmNlTG9hZEZpbGUodSksbShoLHAsdyxELE0pKSxjLm1tYXA9KGgscCx3LEQsTSk9PntvLmZvcmNlTG9hZEZpbGUodSk7dmFyIEY9VHIoKTtpZighRil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ4KTtyZXR1cm4gbShoLEksRixwLHcpLHtwdHI6RixhbGxvY2F0ZWQ6ITB9fSx1LnN0cmVhbV9vcHM9Yyx1fX0sUD17REVGQVVMVF9QT0xMTUFTSzo1LGNhbGN1bGF0ZUF0KGUscix0KXtpZihTLmlzQWJzKHIpKXJldHVybiByO3ZhciBuO2lmKGU9PT0tMTAwKW49by5jd2QoKTtlbHNle3ZhciBhPVAuZ2V0U3RyZWFtRnJvbUZEKGUpO249YS5wYXRofWlmKHIubGVuZ3RoPT0wKXtpZighdCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ0KTtyZXR1cm4gbn1yZXR1cm4gUy5qb2luMihuLHIpfSxkb1N0YXQoZSxyLHQpe3ZhciBuPWUocik7Z1t0Pj4yXT1uLmRldixnW3QrND4+Ml09bi5tb2RlLEFbdCs4Pj4yXT1uLm5saW5rLGdbdCsxMj4+Ml09bi51aWQsZ1t0KzE2Pj4yXT1uLmdpZCxnW3QrMjA+PjJdPW4ucmRldiwkPVtuLnNpemU+Pj4wLCh5PW4uc2l6ZSwrTWF0aC5hYnMoeSk+PTE/eT4wPytNYXRoLmZsb29yKHkvNDI5NDk2NzI5Nik+Pj4wOn5+K01hdGguY2VpbCgoeS0rKH5+eT4+PjApKS80Mjk0OTY3Mjk2KT4+PjA6MCldLGdbdCsyND4+Ml09JFswXSxnW3QrMjg+PjJdPSRbMV0sZ1t0KzMyPj4yXT00MDk2LGdbdCszNj4+Ml09bi5ibG9ja3M7dmFyIGE9bi5hdGltZS5nZXRUaW1lKCksaT1uLm10aW1lLmdldFRpbWUoKSxzPW4uY3RpbWUuZ2V0VGltZSgpO3JldHVybiAkPVtNYXRoLmZsb29yKGEvMWUzKT4+PjAsKHk9TWF0aC5mbG9vcihhLzFlMyksK01hdGguYWJzKHkpPj0xP3k+MD8rTWF0aC5mbG9vcih5LzQyOTQ5NjcyOTYpPj4+MDp+fitNYXRoLmNlaWwoKHktKyh+fnk+Pj4wKSkvNDI5NDk2NzI5Nik+Pj4wOjApXSxnW3QrNDA+PjJdPSRbMF0sZ1t0KzQ0Pj4yXT0kWzFdLEFbdCs0OD4+Ml09YSUxZTMqMWUzLCQ9W01hdGguZmxvb3IoaS8xZTMpPj4+MCwoeT1NYXRoLmZsb29yKGkvMWUzKSwrTWF0aC5hYnMoeSk+PTE/eT4wPytNYXRoLmZsb29yKHkvNDI5NDk2NzI5Nik+Pj4wOn5+K01hdGguY2VpbCgoeS0rKH5+eT4+PjApKS80Mjk0OTY3Mjk2KT4+PjA6MCldLGdbdCs1Nj4+Ml09JFswXSxnW3QrNjA+PjJdPSRbMV0sQVt0KzY0Pj4yXT1pJTFlMyoxZTMsJD1bTWF0aC5mbG9vcihzLzFlMyk+Pj4wLCh5PU1hdGguZmxvb3Iocy8xZTMpLCtNYXRoLmFicyh5KT49MT95PjA/K01hdGguZmxvb3IoeS80Mjk0OTY3Mjk2KT4+PjA6fn4rTWF0aC5jZWlsKCh5LSsofn55Pj4+MCkpLzQyOTQ5NjcyOTYpPj4+MDowKV0sZ1t0KzcyPj4yXT0kWzBdLGdbdCs3Nj4+Ml09JFsxXSxBW3QrODA+PjJdPXMlMWUzKjFlMywkPVtuLmlubz4+PjAsKHk9bi5pbm8sK01hdGguYWJzKHkpPj0xP3k+MD8rTWF0aC5mbG9vcih5LzQyOTQ5NjcyOTYpPj4+MDp+fitNYXRoLmNlaWwoKHktKyh+fnk+Pj4wKSkvNDI5NDk2NzI5Nik+Pj4wOjApXSxnW3QrODg+PjJdPSRbMF0sZ1t0KzkyPj4yXT0kWzFdLDB9LGRvTXN5bmMoZSxyLHQsbixhKXtpZighby5pc0ZpbGUoci5ub2RlLm1vZGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDMpO2lmKG4mMilyZXR1cm4gMDt2YXIgaT14LnNsaWNlKGUsZSt0KTtvLm1zeW5jKHIsaSxhLHQsbil9LGdldFN0cmVhbUZyb21GRChlKXt2YXIgcj1vLmdldFN0cmVhbUNoZWNrZWQoZSk7cmV0dXJuIHJ9LHZhcmFyZ3M6dm9pZCAwLGdldFN0cihlKXt2YXIgcj1zZShlKTtyZXR1cm4gcn19O2Z1bmN0aW9uIGp0KGUscix0LG4pe3RyeXtpZihyPVAuZ2V0U3RyKHIpLHI9UC5jYWxjdWxhdGVBdChlLHIpLHQmLTgpcmV0dXJuLTI4O3ZhciBhPW8ubG9va3VwUGF0aChyLHtmb2xsb3c6ITB9KSxpPWEubm9kZTtpZighaSlyZXR1cm4tNDQ7dmFyIHM9IiI7cmV0dXJuIHQmNCYmKHMrPSJyIiksdCYyJiYocys9InciKSx0JjEmJihzKz0ieCIpLHMmJm8ubm9kZVBlcm1pc3Npb25zKGkscyk/LTI6MH1jYXRjaChsKXtpZih0eXBlb2Ygbz4idSJ8fGwubmFtZSE9PSJFcnJub0Vycm9yIil0aHJvdyBsO3JldHVybi1sLmVycm5vfX1mdW5jdGlvbiBNZSgpe3ZhciBlPWdbK1AudmFyYXJncz4+Ml07cmV0dXJuIFAudmFyYXJncys9NCxlfXZhciBkZT1NZTtmdW5jdGlvbiB6dChlLHIsdCl7UC52YXJhcmdzPXQ7dHJ5e3ZhciBuPVAuZ2V0U3RyZWFtRnJvbUZEKGUpO3N3aXRjaChyKXtjYXNlIDA6e3ZhciBhPU1lKCk7aWYoYTwwKXJldHVybi0yODtmb3IoO28uc3RyZWFtc1thXTspYSsrO3ZhciBpO3JldHVybiBpPW8uZHVwU3RyZWFtKG4sYSksaS5mZH1jYXNlIDE6Y2FzZSAyOnJldHVybiAwO2Nhc2UgMzpyZXR1cm4gbi5mbGFncztjYXNlIDQ6e3ZhciBhPU1lKCk7cmV0dXJuIG4uZmxhZ3N8PWEsMH1jYXNlIDEyOnt2YXIgYT1kZSgpLHM9MDtyZXR1cm4gWVthK3M+PjFdPTIsMH1jYXNlIDEzOmNhc2UgMTQ6cmV0dXJuIDB9cmV0dXJuLTI4fWNhdGNoKGwpe2lmKHR5cGVvZiBvPiJ1Inx8bC5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IGw7cmV0dXJuLWwuZXJybm99fWZ1bmN0aW9uIHh0KGUscil7dHJ5e3ZhciB0PVAuZ2V0U3RyZWFtRnJvbUZEKGUpO3JldHVybiBQLmRvU3RhdChvLnN0YXQsdC5wYXRoLHIpfWNhdGNoKG4pe2lmKHR5cGVvZiBvPiJ1Inx8bi5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IG47cmV0dXJuLW4uZXJybm99fXZhciB2ZT0oZSxyLHQpPT5RZShlLHgscix0KTtmdW5jdGlvbiBIdChlLHIsdCl7dHJ5e3ZhciBuPVAuZ2V0U3RyZWFtRnJvbUZEKGUpO24uZ2V0ZGVudHN8fChuLmdldGRlbnRzPW8ucmVhZGRpcihuLnBhdGgpKTtmb3IodmFyIGE9MjgwLGk9MCxzPW8ubGxzZWVrKG4sMCwxKSxsPU1hdGguZmxvb3Iocy9hKTtsPG4uZ2V0ZGVudHMubGVuZ3RoJiZpK2E8PXQ7KXt2YXIgdSxjLGQ9bi5nZXRkZW50c1tsXTtpZihkPT09Ii4iKXU9bi5ub2RlLmlkLGM9NDtlbHNlIGlmKGQ9PT0iLi4iKXt2YXIgbT1vLmxvb2t1cFBhdGgobi5wYXRoLHtwYXJlbnQ6ITB9KTt1PW0ubm9kZS5pZCxjPTR9ZWxzZXt2YXIgaD1vLmxvb2t1cE5vZGUobi5ub2RlLGQpO3U9aC5pZCxjPW8uaXNDaHJkZXYoaC5tb2RlKT8yOm8uaXNEaXIoaC5tb2RlKT80Om8uaXNMaW5rKGgubW9kZSk/MTA6OH0kPVt1Pj4+MCwoeT11LCtNYXRoLmFicyh5KT49MT95PjA/K01hdGguZmxvb3IoeS80Mjk0OTY3Mjk2KT4+PjA6fn4rTWF0aC5jZWlsKCh5LSsofn55Pj4+MCkpLzQyOTQ5NjcyOTYpPj4+MDowKV0sZ1tyK2k+PjJdPSRbMF0sZ1tyK2krND4+Ml09JFsxXSwkPVsobCsxKSphPj4+MCwoeT0obCsxKSphLCtNYXRoLmFicyh5KT49MT95PjA/K01hdGguZmxvb3IoeS80Mjk0OTY3Mjk2KT4+PjA6fn4rTWF0aC5jZWlsKCh5LSsofn55Pj4+MCkpLzQyOTQ5NjcyOTYpPj4+MDowKV0sZ1tyK2krOD4+Ml09JFswXSxnW3IraSsxMj4+Ml09JFsxXSxZW3IraSsxNj4+MV09MjgwLElbcitpKzE4XT1jLHZlKGQscitpKzE5LDI1NiksaSs9YSxsKz0xfXJldHVybiBvLmxsc2VlayhuLGwqYSwwKSxpfWNhdGNoKHApe2lmKHR5cGVvZiBvPiJ1Inx8cC5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IHA7cmV0dXJuLXAuZXJybm99fWZ1bmN0aW9uIFd0KGUscix0KXtQLnZhcmFyZ3M9dDt0cnl7dmFyIG49UC5nZXRTdHJlYW1Gcm9tRkQoZSk7c3dpdGNoKHIpe2Nhc2UgMjE1MDk6cmV0dXJuIG4udHR5PzA6LTU5O2Nhc2UgMjE1MDU6e2lmKCFuLnR0eSlyZXR1cm4tNTk7aWYobi50dHkub3BzLmlvY3RsX3RjZ2V0cyl7dmFyIGE9bi50dHkub3BzLmlvY3RsX3RjZ2V0cyhuKSxpPWRlKCk7Z1tpPj4yXT1hLmNfaWZsYWd8fDAsZ1tpKzQ+PjJdPWEuY19vZmxhZ3x8MCxnW2krOD4+Ml09YS5jX2NmbGFnfHwwLGdbaSsxMj4+Ml09YS5jX2xmbGFnfHwwO2Zvcih2YXIgcz0wO3M8MzI7cysrKUlbaStzKzE3XT1hLmNfY2Nbc118fDA7cmV0dXJuIDB9cmV0dXJuIDB9Y2FzZSAyMTUxMDpjYXNlIDIxNTExOmNhc2UgMjE1MTI6cmV0dXJuIG4udHR5PzA6LTU5O2Nhc2UgMjE1MDY6Y2FzZSAyMTUwNzpjYXNlIDIxNTA4OntpZighbi50dHkpcmV0dXJuLTU5O2lmKG4udHR5Lm9wcy5pb2N0bF90Y3NldHMpe2Zvcih2YXIgaT1kZSgpLGw9Z1tpPj4yXSx1PWdbaSs0Pj4yXSxjPWdbaSs4Pj4yXSxkPWdbaSsxMj4+Ml0sbT1bXSxzPTA7czwzMjtzKyspbS5wdXNoKElbaStzKzE3XSk7cmV0dXJuIG4udHR5Lm9wcy5pb2N0bF90Y3NldHMobi50dHkscix7Y19pZmxhZzpsLGNfb2ZsYWc6dSxjX2NmbGFnOmMsY19sZmxhZzpkLGNfY2M6bX0pfXJldHVybiAwfWNhc2UgMjE1MTk6e2lmKCFuLnR0eSlyZXR1cm4tNTk7dmFyIGk9ZGUoKTtyZXR1cm4gZ1tpPj4yXT0wLDB9Y2FzZSAyMTUyMDpyZXR1cm4gbi50dHk/LTI4Oi01OTtjYXNlIDIxNTMxOnt2YXIgaT1kZSgpO3JldHVybiBvLmlvY3RsKG4scixpKX1jYXNlIDIxNTIzOntpZighbi50dHkpcmV0dXJuLTU5O2lmKG4udHR5Lm9wcy5pb2N0bF90aW9jZ3dpbnN6KXt2YXIgaD1uLnR0eS5vcHMuaW9jdGxfdGlvY2d3aW5zeihuLnR0eSksaT1kZSgpO1lbaT4+MV09aFswXSxZW2krMj4+MV09aFsxXX1yZXR1cm4gMH1jYXNlIDIxNTI0OnJldHVybiBuLnR0eT8wOi01OTtjYXNlIDIxNTE1OnJldHVybiBuLnR0eT8wOi01OTtkZWZhdWx0OnJldHVybi0yOH19Y2F0Y2gocCl7aWYodHlwZW9mIG8+InUifHxwLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgcDtyZXR1cm4tcC5lcnJub319ZnVuY3Rpb24gQnQoZSxyKXt0cnl7cmV0dXJuIGU9UC5nZXRTdHIoZSksUC5kb1N0YXQoby5sc3RhdCxlLHIpfWNhdGNoKHQpe2lmKHR5cGVvZiBvPiJ1Inx8dC5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IHQ7cmV0dXJuLXQuZXJybm99fWZ1bmN0aW9uIE50KGUscix0LG4pe3RyeXtyPVAuZ2V0U3RyKHIpO3ZhciBhPW4mMjU2LGk9biY0MDk2O3JldHVybiBuPW4mLTY0MDEscj1QLmNhbGN1bGF0ZUF0KGUscixpKSxQLmRvU3RhdChhP28ubHN0YXQ6by5zdGF0LHIsdCl9Y2F0Y2gocyl7aWYodHlwZW9mIG8+InUifHxzLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgcztyZXR1cm4tcy5lcnJub319ZnVuY3Rpb24gWXQoZSxyLHQsbil7UC52YXJhcmdzPW47dHJ5e3I9UC5nZXRTdHIocikscj1QLmNhbGN1bGF0ZUF0KGUscik7dmFyIGE9bj9NZSgpOjA7cmV0dXJuIG8ub3BlbihyLHQsYSkuZmR9Y2F0Y2goaSl7aWYodHlwZW9mIG8+InUifHxpLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgaTtyZXR1cm4taS5lcnJub319ZnVuY3Rpb24gR3QoZSxyLHQsbil7dHJ5e3JldHVybiByPVAuZ2V0U3RyKHIpLG49UC5nZXRTdHIobikscj1QLmNhbGN1bGF0ZUF0KGUsciksbj1QLmNhbGN1bGF0ZUF0KHQsbiksby5yZW5hbWUocixuKSwwfWNhdGNoKGEpe2lmKHR5cGVvZiBvPiJ1Inx8YS5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IGE7cmV0dXJuLWEuZXJybm99fWZ1bmN0aW9uIHF0KGUpe3RyeXtyZXR1cm4gZT1QLmdldFN0cihlKSxvLnJtZGlyKGUpLDB9Y2F0Y2gocil7aWYodHlwZW9mIG8+InUifHxyLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgcjtyZXR1cm4tci5lcnJub319ZnVuY3Rpb24gWHQoZSxyKXt0cnl7cmV0dXJuIGU9UC5nZXRTdHIoZSksUC5kb1N0YXQoby5zdGF0LGUscil9Y2F0Y2godCl7aWYodHlwZW9mIG8+InUifHx0Lm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgdDtyZXR1cm4tdC5lcnJub319ZnVuY3Rpb24gS3QoZSxyLHQpe3RyeXtyZXR1cm4gcj1QLmdldFN0cihyKSxyPVAuY2FsY3VsYXRlQXQoZSxyKSx0PT09MD9vLnVubGluayhyKTp0PT09NTEyP28ucm1kaXIocik6aWUoIkludmFsaWQgZmxhZ3MgcGFzc2VkIHRvIHVubGlua2F0IiksMH1jYXRjaChuKXtpZih0eXBlb2Ygbz4idSJ8fG4ubmFtZSE9PSJFcnJub0Vycm9yIil0aHJvdyBuO3JldHVybi1uLmVycm5vfX12YXIgSnQ9KCk9PntpZSgiIil9LFJlPXt9LHJyPWU9Pntmb3IoO2UubGVuZ3RoOyl7dmFyIHI9ZS5wb3AoKSx0PWUucG9wKCk7dChyKX19O2Z1bmN0aW9uIHllKGUpe3JldHVybiB0aGlzLmZyb21XaXJlVHlwZShBW2U+PjJdKX12YXIgaGU9e30sdWU9e30sT2U9e30sU3IsSWU9ZT0+e3Rocm93IG5ldyBTcihlKX0sTj0oZSxyLHQpPT57ZS5mb3JFYWNoKGZ1bmN0aW9uKGwpe09lW2xdPXJ9KTtmdW5jdGlvbiBuKGwpe3ZhciB1PXQobCk7dS5sZW5ndGghPT1lLmxlbmd0aCYmSWUoIk1pc21hdGNoZWQgdHlwZSBjb252ZXJ0ZXIgY291bnQiKTtmb3IodmFyIGM9MDtjPGUubGVuZ3RoOysrYylLKGVbY10sdVtjXSl9dmFyIGE9bmV3IEFycmF5KHIubGVuZ3RoKSxpPVtdLHM9MDtyLmZvckVhY2goKGwsdSk9Pnt1ZS5oYXNPd25Qcm9wZXJ0eShsKT9hW3VdPXVlW2xdOihpLnB1c2gobCksaGUuaGFzT3duUHJvcGVydHkobCl8fChoZVtsXT1bXSksaGVbbF0ucHVzaCgoKT0+e2FbdV09dWVbbF0sKytzLHM9PT1pLmxlbmd0aCYmbihhKX0pKX0pLGkubGVuZ3RoPT09MCYmbihhKX0sWnQ9ZT0+e3ZhciByPVJlW2VdO2RlbGV0ZSBSZVtlXTt2YXIgdD1yLnJhd0NvbnN0cnVjdG9yLG49ci5yYXdEZXN0cnVjdG9yLGE9ci5maWVsZHMsaT1hLm1hcChzPT5zLmdldHRlclJldHVyblR5cGUpLmNvbmNhdChhLm1hcChzPT5zLnNldHRlckFyZ3VtZW50VHlwZSkpO04oW2VdLGkscz0+e3ZhciBsPXt9O3JldHVybiBhLmZvckVhY2goKHUsYyk9Pnt2YXIgZD11LmZpZWxkTmFtZSxtPXNbY10saD11LmdldHRlcixwPXUuZ2V0dGVyQ29udGV4dCx3PXNbYythLmxlbmd0aF0sRD11LnNldHRlcixNPXUuc2V0dGVyQ29udGV4dDtsW2RdPXtyZWFkOkY9Pm0uZnJvbVdpcmVUeXBlKGgocCxGKSksd3JpdGU6KEYsdik9Pnt2YXIgXz1bXTtEKE0sRix3LnRvV2lyZVR5cGUoXyx2KSkscnIoXyl9fX0pLFt7bmFtZTpyLm5hbWUsZnJvbVdpcmVUeXBlOnU9Pnt2YXIgYz17fTtmb3IodmFyIGQgaW4gbCljW2RdPWxbZF0ucmVhZCh1KTtyZXR1cm4gbih1KSxjfSx0b1dpcmVUeXBlOih1LGMpPT57Zm9yKHZhciBkIGluIGwpaWYoIShkIGluIGMpKXRocm93IG5ldyBUeXBlRXJyb3IoYE1pc3NpbmcgZmllbGQ6ICIke2R9ImApO3ZhciBtPXQoKTtmb3IoZCBpbiBsKWxbZF0ud3JpdGUobSxjW2RdKTtyZXR1cm4gdSE9PW51bGwmJnUucHVzaChuLG0pLG19LGFyZ1BhY2tBZHZhbmNlOkoscmVhZFZhbHVlRnJvbVBvaW50ZXI6eWUsZGVzdHJ1Y3RvckZ1bmN0aW9uOm59XX0pfSxRdD0oZSxyLHQsbixhKT0+e30sZW49KCk9Pntmb3IodmFyIGU9bmV3IEFycmF5KDI1Nikscj0wO3I8MjU2OysrcillW3JdPVN0cmluZy5mcm9tQ2hhckNvZGUocik7TXI9ZX0sTXIsaj1lPT57Zm9yKHZhciByPSIiLHQ9ZTt4W3RdOylyKz1Nclt4W3QrK11dO3JldHVybiByfSxtZSxrPWU9Pnt0aHJvdyBuZXcgbWUoZSl9O2Z1bmN0aW9uIHJuKGUscix0PXt9KXt2YXIgbj1yLm5hbWU7aWYoZXx8ayhgdHlwZSAiJHtufSIgbXVzdCBoYXZlIGEgcG9zaXRpdmUgaW50ZWdlciB0eXBlaWQgcG9pbnRlcmApLHVlLmhhc093blByb3BlcnR5KGUpKXtpZih0Lmlnbm9yZUR1cGxpY2F0ZVJlZ2lzdHJhdGlvbnMpcmV0dXJuO2soYENhbm5vdCByZWdpc3RlciB0eXBlICcke259JyB0d2ljZWApfWlmKHVlW2VdPXIsZGVsZXRlIE9lW2VdLGhlLmhhc093blByb3BlcnR5KGUpKXt2YXIgYT1oZVtlXTtkZWxldGUgaGVbZV0sYS5mb3JFYWNoKGk9PmkoKSl9fWZ1bmN0aW9uIEsoZSxyLHQ9e30pe2lmKCEoImFyZ1BhY2tBZHZhbmNlImluIHIpKXRocm93IG5ldyBUeXBlRXJyb3IoInJlZ2lzdGVyVHlwZSByZWdpc3RlcmVkSW5zdGFuY2UgcmVxdWlyZXMgYXJnUGFja0FkdmFuY2UiKTtyZXR1cm4gcm4oZSxyLHQpfXZhciBKPTgsdG49KGUscix0LG4pPT57cj1qKHIpLEsoZSx7bmFtZTpyLGZyb21XaXJlVHlwZTpmdW5jdGlvbihhKXtyZXR1cm4hIWF9LHRvV2lyZVR5cGU6ZnVuY3Rpb24oYSxpKXtyZXR1cm4gaT90Om59LGFyZ1BhY2tBZHZhbmNlOkoscmVhZFZhbHVlRnJvbVBvaW50ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZnJvbVdpcmVUeXBlKHhbYV0pfSxkZXN0cnVjdG9yRnVuY3Rpb246bnVsbH0pfSxubj1lPT4oe2NvdW50OmUuY291bnQsZGVsZXRlU2NoZWR1bGVkOmUuZGVsZXRlU2NoZWR1bGVkLHByZXNlcnZlUG9pbnRlck9uRGVsZXRlOmUucHJlc2VydmVQb2ludGVyT25EZWxldGUscHRyOmUucHRyLHB0clR5cGU6ZS5wdHJUeXBlLHNtYXJ0UHRyOmUuc21hcnRQdHIsc21hcnRQdHJUeXBlOmUuc21hcnRQdHJUeXBlfSksdHI9ZT0+e2Z1bmN0aW9uIHIodCl7cmV0dXJuIHQuJCQucHRyVHlwZS5yZWdpc3RlcmVkQ2xhc3MubmFtZX1rKHIoZSkrIiBpbnN0YW5jZSBhbHJlYWR5IGRlbGV0ZWQiKX0sbnI9ITEsUnI9ZT0+e30sYW49ZT0+e2Uuc21hcnRQdHI/ZS5zbWFydFB0clR5cGUucmF3RGVzdHJ1Y3RvcihlLnNtYXJ0UHRyKTplLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzLnJhd0Rlc3RydWN0b3IoZS5wdHIpfSxPcj1lPT57ZS5jb3VudC52YWx1ZS09MTt2YXIgcj1lLmNvdW50LnZhbHVlPT09MDtyJiZhbihlKX0sSXI9KGUscix0KT0+e2lmKHI9PT10KXJldHVybiBlO2lmKHQuYmFzZUNsYXNzPT09dm9pZCAwKXJldHVybiBudWxsO3ZhciBuPUlyKGUscix0LmJhc2VDbGFzcyk7cmV0dXJuIG49PT1udWxsP251bGw6dC5kb3duY2FzdChuKX0sTHI9e30sb249KCk9Pk9iamVjdC5rZXlzKGJlKS5sZW5ndGgsc249KCk9Pnt2YXIgZT1bXTtmb3IodmFyIHIgaW4gYmUpYmUuaGFzT3duUHJvcGVydHkocikmJmUucHVzaChiZVtyXSk7cmV0dXJuIGV9LHdlPVtdLGFyPSgpPT57Zm9yKDt3ZS5sZW5ndGg7KXt2YXIgZT13ZS5wb3AoKTtlLiQkLmRlbGV0ZVNjaGVkdWxlZD0hMSxlLmRlbGV0ZSgpfX0sRWUsbG49ZT0+e0VlPWUsd2UubGVuZ3RoJiZFZSYmRWUoYXIpfSx1bj0oKT0+e2YuZ2V0SW5oZXJpdGVkSW5zdGFuY2VDb3VudD1vbixmLmdldExpdmVJbmhlcml0ZWRJbnN0YW5jZXM9c24sZi5mbHVzaFBlbmRpbmdEZWxldGVzPWFyLGYuc2V0RGVsYXlGdW5jdGlvbj1sbn0sYmU9e30sZm49KGUscik9Pntmb3Iocj09PXZvaWQgMCYmaygicHRyIHNob3VsZCBub3QgYmUgdW5kZWZpbmVkIik7ZS5iYXNlQ2xhc3M7KXI9ZS51cGNhc3QociksZT1lLmJhc2VDbGFzcztyZXR1cm4gcn0sY249KGUscik9PihyPWZuKGUsciksYmVbcl0pLExlPShlLHIpPT57KCFyLnB0clR5cGV8fCFyLnB0cikmJkllKCJtYWtlQ2xhc3NIYW5kbGUgcmVxdWlyZXMgcHRyIGFuZCBwdHJUeXBlIik7dmFyIHQ9ISFyLnNtYXJ0UHRyVHlwZSxuPSEhci5zbWFydFB0cjtyZXR1cm4gdCE9PW4mJkllKCJCb3RoIHNtYXJ0UHRyVHlwZSBhbmQgc21hcnRQdHIgbXVzdCBiZSBzcGVjaWZpZWQiKSxyLmNvdW50PXt2YWx1ZToxfSxrZShPYmplY3QuY3JlYXRlKGUseyQkOnt2YWx1ZTpyLHdyaXRhYmxlOiEwfX0pKX07ZnVuY3Rpb24gZG4oZSl7dmFyIHI9dGhpcy5nZXRQb2ludGVlKGUpO2lmKCFyKXJldHVybiB0aGlzLmRlc3RydWN0b3IoZSksbnVsbDt2YXIgdD1jbih0aGlzLnJlZ2lzdGVyZWRDbGFzcyxyKTtpZih0IT09dm9pZCAwKXtpZih0LiQkLmNvdW50LnZhbHVlPT09MClyZXR1cm4gdC4kJC5wdHI9cix0LiQkLnNtYXJ0UHRyPWUsdC5jbG9uZSgpO3ZhciBuPXQuY2xvbmUoKTtyZXR1cm4gdGhpcy5kZXN0cnVjdG9yKGUpLG59ZnVuY3Rpb24gYSgpe3JldHVybiB0aGlzLmlzU21hcnRQb2ludGVyP0xlKHRoaXMucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHtwdHJUeXBlOnRoaXMucG9pbnRlZVR5cGUscHRyOnIsc21hcnRQdHJUeXBlOnRoaXMsc21hcnRQdHI6ZX0pOkxlKHRoaXMucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHtwdHJUeXBlOnRoaXMscHRyOmV9KX12YXIgaT10aGlzLnJlZ2lzdGVyZWRDbGFzcy5nZXRBY3R1YWxUeXBlKHIpLHM9THJbaV07aWYoIXMpcmV0dXJuIGEuY2FsbCh0aGlzKTt2YXIgbDt0aGlzLmlzQ29uc3Q/bD1zLmNvbnN0UG9pbnRlclR5cGU6bD1zLnBvaW50ZXJUeXBlO3ZhciB1PUlyKHIsdGhpcy5yZWdpc3RlcmVkQ2xhc3MsbC5yZWdpc3RlcmVkQ2xhc3MpO3JldHVybiB1PT09bnVsbD9hLmNhbGwodGhpcyk6dGhpcy5pc1NtYXJ0UG9pbnRlcj9MZShsLnJlZ2lzdGVyZWRDbGFzcy5pbnN0YW5jZVByb3RvdHlwZSx7cHRyVHlwZTpsLHB0cjp1LHNtYXJ0UHRyVHlwZTp0aGlzLHNtYXJ0UHRyOmV9KTpMZShsLnJlZ2lzdGVyZWRDbGFzcy5pbnN0YW5jZVByb3RvdHlwZSx7cHRyVHlwZTpsLHB0cjp1fSl9dmFyIGtlPWU9PnR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT4idSI/KGtlPXI9PnIsZSk6KG5yPW5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeShyPT57T3Ioci4kJCl9KSxrZT1yPT57dmFyIHQ9ci4kJCxuPSEhdC5zbWFydFB0cjtpZihuKXt2YXIgYT17JCQ6dH07bnIucmVnaXN0ZXIocixhLHIpfXJldHVybiByfSxScj1yPT5uci51bnJlZ2lzdGVyKHIpLGtlKGUpKSx2bj0oKT0+e09iamVjdC5hc3NpZ24oVmUucHJvdG90eXBlLHtpc0FsaWFzT2YoZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgVmUpfHwhKGUgaW5zdGFuY2VvZiBWZSkpcmV0dXJuITE7dmFyIHI9dGhpcy4kJC5wdHJUeXBlLnJlZ2lzdGVyZWRDbGFzcyx0PXRoaXMuJCQucHRyO2UuJCQ9ZS4kJDtmb3IodmFyIG49ZS4kJC5wdHJUeXBlLnJlZ2lzdGVyZWRDbGFzcyxhPWUuJCQucHRyO3IuYmFzZUNsYXNzOyl0PXIudXBjYXN0KHQpLHI9ci5iYXNlQ2xhc3M7Zm9yKDtuLmJhc2VDbGFzczspYT1uLnVwY2FzdChhKSxuPW4uYmFzZUNsYXNzO3JldHVybiByPT09biYmdD09PWF9LGNsb25lKCl7aWYodGhpcy4kJC5wdHJ8fHRyKHRoaXMpLHRoaXMuJCQucHJlc2VydmVQb2ludGVyT25EZWxldGUpcmV0dXJuIHRoaXMuJCQuY291bnQudmFsdWUrPTEsdGhpczt2YXIgZT1rZShPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKSx7JCQ6e3ZhbHVlOm5uKHRoaXMuJCQpfX0pKTtyZXR1cm4gZS4kJC5jb3VudC52YWx1ZSs9MSxlLiQkLmRlbGV0ZVNjaGVkdWxlZD0hMSxlfSxkZWxldGUoKXt0aGlzLiQkLnB0cnx8dHIodGhpcyksdGhpcy4kJC5kZWxldGVTY2hlZHVsZWQmJiF0aGlzLiQkLnByZXNlcnZlUG9pbnRlck9uRGVsZXRlJiZrKCJPYmplY3QgYWxyZWFkeSBzY2hlZHVsZWQgZm9yIGRlbGV0aW9uIiksUnIodGhpcyksT3IodGhpcy4kJCksdGhpcy4kJC5wcmVzZXJ2ZVBvaW50ZXJPbkRlbGV0ZXx8KHRoaXMuJCQuc21hcnRQdHI9dm9pZCAwLHRoaXMuJCQucHRyPXZvaWQgMCl9LGlzRGVsZXRlZCgpe3JldHVybiF0aGlzLiQkLnB0cn0sZGVsZXRlTGF0ZXIoKXtyZXR1cm4gdGhpcy4kJC5wdHJ8fHRyKHRoaXMpLHRoaXMuJCQuZGVsZXRlU2NoZWR1bGVkJiYhdGhpcy4kJC5wcmVzZXJ2ZVBvaW50ZXJPbkRlbGV0ZSYmaygiT2JqZWN0IGFscmVhZHkgc2NoZWR1bGVkIGZvciBkZWxldGlvbiIpLHdlLnB1c2godGhpcyksd2UubGVuZ3RoPT09MSYmRWUmJkVlKGFyKSx0aGlzLiQkLmRlbGV0ZVNjaGVkdWxlZD0hMCx0aGlzfX0pfTtmdW5jdGlvbiBWZSgpe312YXIgVWU9KGUscik9Pk9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJuYW1lIix7dmFsdWU6ZX0pLG9yPShlLHIsdCk9PntpZihlW3JdLm92ZXJsb2FkVGFibGU9PT12b2lkIDApe3ZhciBuPWVbcl07ZVtyXT1mdW5jdGlvbiguLi5hKXtyZXR1cm4gZVtyXS5vdmVybG9hZFRhYmxlLmhhc093blByb3BlcnR5KGEubGVuZ3RoKXx8ayhgRnVuY3Rpb24gJyR7dH0nIGNhbGxlZCB3aXRoIGFuIGludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyAoJHthLmxlbmd0aH0pIC0gZXhwZWN0cyBvbmUgb2YgKCR7ZVtyXS5vdmVybG9hZFRhYmxlfSkhYCksZVtyXS5vdmVybG9hZFRhYmxlW2EubGVuZ3RoXS5hcHBseSh0aGlzLGEpfSxlW3JdLm92ZXJsb2FkVGFibGU9W10sZVtyXS5vdmVybG9hZFRhYmxlW24uYXJnQ291bnRdPW59fSxWcj0oZSxyLHQpPT57Zi5oYXNPd25Qcm9wZXJ0eShlKT8oKHQ9PT12b2lkIDB8fGZbZV0ub3ZlcmxvYWRUYWJsZSE9PXZvaWQgMCYmZltlXS5vdmVybG9hZFRhYmxlW3RdIT09dm9pZCAwKSYmayhgQ2Fubm90IHJlZ2lzdGVyIHB1YmxpYyBuYW1lICcke2V9JyB0d2ljZWApLG9yKGYsZSxlKSxmLmhhc093blByb3BlcnR5KHQpJiZrKGBDYW5ub3QgcmVnaXN0ZXIgbXVsdGlwbGUgb3ZlcmxvYWRzIG9mIGEgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSBudW1iZXIgb2YgYXJndW1lbnRzICgke3R9KSFgKSxmW2VdLm92ZXJsb2FkVGFibGVbdF09cik6KGZbZV09cix0IT09dm9pZCAwJiYoZltlXS5udW1Bcmd1bWVudHM9dCkpfSxobj00OCxtbj01Nyxwbj1lPT57aWYoZT09PXZvaWQgMClyZXR1cm4iX3Vua25vd24iO2U9ZS5yZXBsYWNlKC9bXmEtekEtWjAtOV9dL2csIiQiKTt2YXIgcj1lLmNoYXJDb2RlQXQoMCk7cmV0dXJuIHI+PWhuJiZyPD1tbj9gXyR7ZX1gOmV9O2Z1bmN0aW9uIF9uKGUscix0LG4sYSxpLHMsbCl7dGhpcy5uYW1lPWUsdGhpcy5jb25zdHJ1Y3Rvcj1yLHRoaXMuaW5zdGFuY2VQcm90b3R5cGU9dCx0aGlzLnJhd0Rlc3RydWN0b3I9bix0aGlzLmJhc2VDbGFzcz1hLHRoaXMuZ2V0QWN0dWFsVHlwZT1pLHRoaXMudXBjYXN0PXMsdGhpcy5kb3duY2FzdD1sLHRoaXMucHVyZVZpcnR1YWxGdW5jdGlvbnM9W119dmFyIGplPShlLHIsdCk9Pntmb3IoO3IhPT10OylyLnVwY2FzdHx8ayhgRXhwZWN0ZWQgbnVsbCBvciBpbnN0YW5jZSBvZiAke3QubmFtZX0sIGdvdCBhbiBpbnN0YW5jZSBvZiAke3IubmFtZX1gKSxlPXIudXBjYXN0KGUpLHI9ci5iYXNlQ2xhc3M7cmV0dXJuIGV9O2Z1bmN0aW9uIGduKGUscil7aWYocj09PW51bGwpcmV0dXJuIHRoaXMuaXNSZWZlcmVuY2UmJmsoYG51bGwgaXMgbm90IGEgdmFsaWQgJHt0aGlzLm5hbWV9YCksMDtyLiQkfHxrKGBDYW5ub3QgcGFzcyAiJHtscihyKX0iIGFzIGEgJHt0aGlzLm5hbWV9YCksci4kJC5wdHJ8fGsoYENhbm5vdCBwYXNzIGRlbGV0ZWQgb2JqZWN0IGFzIGEgcG9pbnRlciBvZiB0eXBlICR7dGhpcy5uYW1lfWApO3ZhciB0PXIuJCQucHRyVHlwZS5yZWdpc3RlcmVkQ2xhc3Msbj1qZShyLiQkLnB0cix0LHRoaXMucmVnaXN0ZXJlZENsYXNzKTtyZXR1cm4gbn1mdW5jdGlvbiB5bihlLHIpe3ZhciB0O2lmKHI9PT1udWxsKXJldHVybiB0aGlzLmlzUmVmZXJlbmNlJiZrKGBudWxsIGlzIG5vdCBhIHZhbGlkICR7dGhpcy5uYW1lfWApLHRoaXMuaXNTbWFydFBvaW50ZXI/KHQ9dGhpcy5yYXdDb25zdHJ1Y3RvcigpLGUhPT1udWxsJiZlLnB1c2godGhpcy5yYXdEZXN0cnVjdG9yLHQpLHQpOjA7KCFyfHwhci4kJCkmJmsoYENhbm5vdCBwYXNzICIke2xyKHIpfSIgYXMgYSAke3RoaXMubmFtZX1gKSxyLiQkLnB0cnx8ayhgQ2Fubm90IHBhc3MgZGVsZXRlZCBvYmplY3QgYXMgYSBwb2ludGVyIG9mIHR5cGUgJHt0aGlzLm5hbWV9YCksIXRoaXMuaXNDb25zdCYmci4kJC5wdHJUeXBlLmlzQ29uc3QmJmsoYENhbm5vdCBjb252ZXJ0IGFyZ3VtZW50IG9mIHR5cGUgJHtyLiQkLnNtYXJ0UHRyVHlwZT9yLiQkLnNtYXJ0UHRyVHlwZS5uYW1lOnIuJCQucHRyVHlwZS5uYW1lfSB0byBwYXJhbWV0ZXIgdHlwZSAke3RoaXMubmFtZX1gKTt2YXIgbj1yLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzO2lmKHQ9amUoci4kJC5wdHIsbix0aGlzLnJlZ2lzdGVyZWRDbGFzcyksdGhpcy5pc1NtYXJ0UG9pbnRlcilzd2l0Y2goci4kJC5zbWFydFB0cj09PXZvaWQgMCYmaygiUGFzc2luZyByYXcgcG9pbnRlciB0byBzbWFydCBwb2ludGVyIGlzIGlsbGVnYWwiKSx0aGlzLnNoYXJpbmdQb2xpY3kpe2Nhc2UgMDpyLiQkLnNtYXJ0UHRyVHlwZT09PXRoaXM/dD1yLiQkLnNtYXJ0UHRyOmsoYENhbm5vdCBjb252ZXJ0IGFyZ3VtZW50IG9mIHR5cGUgJHtyLiQkLnNtYXJ0UHRyVHlwZT9yLiQkLnNtYXJ0UHRyVHlwZS5uYW1lOnIuJCQucHRyVHlwZS5uYW1lfSB0byBwYXJhbWV0ZXIgdHlwZSAke3RoaXMubmFtZX1gKTticmVhaztjYXNlIDE6dD1yLiQkLnNtYXJ0UHRyO2JyZWFrO2Nhc2UgMjppZihyLiQkLnNtYXJ0UHRyVHlwZT09PXRoaXMpdD1yLiQkLnNtYXJ0UHRyO2Vsc2V7dmFyIGE9ci5jbG9uZSgpO3Q9dGhpcy5yYXdTaGFyZSh0LHRlLnRvSGFuZGxlKCgpPT5hLmRlbGV0ZSgpKSksZSE9PW51bGwmJmUucHVzaCh0aGlzLnJhd0Rlc3RydWN0b3IsdCl9YnJlYWs7ZGVmYXVsdDprKCJVbnN1cHBvcnRpbmcgc2hhcmluZyBwb2xpY3kiKX1yZXR1cm4gdH1mdW5jdGlvbiB3bihlLHIpe2lmKHI9PT1udWxsKXJldHVybiB0aGlzLmlzUmVmZXJlbmNlJiZrKGBudWxsIGlzIG5vdCBhIHZhbGlkICR7dGhpcy5uYW1lfWApLDA7ci4kJHx8ayhgQ2Fubm90IHBhc3MgIiR7bHIocil9IiBhcyBhICR7dGhpcy5uYW1lfWApLHIuJCQucHRyfHxrKGBDYW5ub3QgcGFzcyBkZWxldGVkIG9iamVjdCBhcyBhIHBvaW50ZXIgb2YgdHlwZSAke3RoaXMubmFtZX1gKSxyLiQkLnB0clR5cGUuaXNDb25zdCYmayhgQ2Fubm90IGNvbnZlcnQgYXJndW1lbnQgb2YgdHlwZSAke3IuJCQucHRyVHlwZS5uYW1lfSB0byBwYXJhbWV0ZXIgdHlwZSAke3RoaXMubmFtZX1gKTt2YXIgdD1yLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzLG49amUoci4kJC5wdHIsdCx0aGlzLnJlZ2lzdGVyZWRDbGFzcyk7cmV0dXJuIG59dmFyIEVuPSgpPT57T2JqZWN0LmFzc2lnbih6ZS5wcm90b3R5cGUse2dldFBvaW50ZWUoZSl7cmV0dXJuIHRoaXMucmF3R2V0UG9pbnRlZSYmKGU9dGhpcy5yYXdHZXRQb2ludGVlKGUpKSxlfSxkZXN0cnVjdG9yKGUpe3ZhciByOyhyPXRoaXMucmF3RGVzdHJ1Y3Rvcik9PW51bGx8fHIuY2FsbCh0aGlzLGUpfSxhcmdQYWNrQWR2YW5jZTpKLHJlYWRWYWx1ZUZyb21Qb2ludGVyOnllLGZyb21XaXJlVHlwZTpkbn0pfTtmdW5jdGlvbiB6ZShlLHIsdCxuLGEsaSxzLGwsdSxjLGQpe3RoaXMubmFtZT1lLHRoaXMucmVnaXN0ZXJlZENsYXNzPXIsdGhpcy5pc1JlZmVyZW5jZT10LHRoaXMuaXNDb25zdD1uLHRoaXMuaXNTbWFydFBvaW50ZXI9YSx0aGlzLnBvaW50ZWVUeXBlPWksdGhpcy5zaGFyaW5nUG9saWN5PXMsdGhpcy5yYXdHZXRQb2ludGVlPWwsdGhpcy5yYXdDb25zdHJ1Y3Rvcj11LHRoaXMucmF3U2hhcmU9Yyx0aGlzLnJhd0Rlc3RydWN0b3I9ZCwhYSYmci5iYXNlQ2xhc3M9PT12b2lkIDA/bj8odGhpcy50b1dpcmVUeXBlPWduLHRoaXMuZGVzdHJ1Y3RvckZ1bmN0aW9uPW51bGwpOih0aGlzLnRvV2lyZVR5cGU9d24sdGhpcy5kZXN0cnVjdG9yRnVuY3Rpb249bnVsbCk6dGhpcy50b1dpcmVUeXBlPXlufXZhciBVcj0oZSxyLHQpPT57Zi5oYXNPd25Qcm9wZXJ0eShlKXx8SWUoIlJlcGxhY2luZyBub25leGlzdGVudCBwdWJsaWMgc3ltYm9sIiksZltlXS5vdmVybG9hZFRhYmxlIT09dm9pZCAwJiZ0IT09dm9pZCAwP2ZbZV0ub3ZlcmxvYWRUYWJsZVt0XT1yOihmW2VdPXIsZltlXS5hcmdDb3VudD10KX0sYm49KGUscix0KT0+e2U9ZS5yZXBsYWNlKC9wL2csImkiKTt2YXIgbj1mWyJkeW5DYWxsXyIrZV07cmV0dXJuIG4ociwuLi50KX0seGU9W10sanIsenI9ZT0+e3ZhciByPXhlW2VdO3JldHVybiByfHwoZT49eGUubGVuZ3RoJiYoeGUubGVuZ3RoPWUrMSkseGVbZV09cj1qci5nZXQoZSkpLHJ9LGtuPShlLHIsdD1bXSk9PntpZihlLmluY2x1ZGVzKCJqIikpcmV0dXJuIGJuKGUscix0KTt2YXIgbj16cihyKSguLi50KTtyZXR1cm4gbn0sUG49KGUscik9PiguLi50KT0+a24oZSxyLHQpLFc9KGUscik9PntlPWooZSk7ZnVuY3Rpb24gdCgpe3JldHVybiBlLmluY2x1ZGVzKCJqIik/UG4oZSxyKTp6cihyKX12YXIgbj10KCk7cmV0dXJuIHR5cGVvZiBuIT0iZnVuY3Rpb24iJiZrKGB1bmtub3duIGZ1bmN0aW9uIHBvaW50ZXIgd2l0aCBzaWduYXR1cmUgJHtlfTogJHtyfWApLG59LEFuPShlLHIpPT57dmFyIHQ9VWUocixmdW5jdGlvbihuKXt0aGlzLm5hbWU9cix0aGlzLm1lc3NhZ2U9bjt2YXIgYT1uZXcgRXJyb3Iobikuc3RhY2s7YSE9PXZvaWQgMCYmKHRoaXMuc3RhY2s9dGhpcy50b1N0cmluZygpK2AKYCthLnJlcGxhY2UoL15FcnJvcig6W15cbl0qKT9cbi8sIiIpKX0pO3JldHVybiB0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKSx0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10LHQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWVzc2FnZT09PXZvaWQgMD90aGlzLm5hbWU6YCR7dGhpcy5uYW1lfTogJHt0aGlzLm1lc3NhZ2V9YH0sdH0seHIsSHI9ZT0+e3ZhciByPWV0KGUpLHQ9aihyKTtyZXR1cm4gWihyKSx0fSxmZT0oZSxyKT0+e3ZhciB0PVtdLG49e307ZnVuY3Rpb24gYShpKXtpZighbltpXSYmIXVlW2ldKXtpZihPZVtpXSl7T2VbaV0uZm9yRWFjaChhKTtyZXR1cm59dC5wdXNoKGkpLG5baV09ITB9fXRocm93IHIuZm9yRWFjaChhKSxuZXcgeHIoYCR7ZX06IGArdC5tYXAoSHIpLmpvaW4oWyIsICJdKSl9LERuPShlLHIsdCxuLGEsaSxzLGwsdSxjLGQsbSxoKT0+e2Q9aihkKSxpPVcoYSxpKSxsJiYobD1XKHMsbCkpLGMmJihjPVcodSxjKSksaD1XKG0saCk7dmFyIHA9cG4oZCk7VnIocCxmdW5jdGlvbigpe2ZlKGBDYW5ub3QgY29uc3RydWN0ICR7ZH0gZHVlIHRvIHVuYm91bmQgdHlwZXNgLFtuXSl9KSxOKFtlLHIsdF0sbj9bbl06W10sdz0+e3ZhciBPO3c9d1swXTt2YXIgRCxNO24/KEQ9dy5yZWdpc3RlcmVkQ2xhc3MsTT1ELmluc3RhbmNlUHJvdG90eXBlKTpNPVZlLnByb3RvdHlwZTt2YXIgRj1VZShkLGZ1bmN0aW9uKC4uLnZyKXtpZihPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykhPT12KXRocm93IG5ldyBtZSgiVXNlICduZXcnIHRvIGNvbnN0cnVjdCAiK2QpO2lmKF8uY29uc3RydWN0b3JfYm9keT09PXZvaWQgMCl0aHJvdyBuZXcgbWUoZCsiIGhhcyBubyBhY2Nlc3NpYmxlIGNvbnN0cnVjdG9yIik7dmFyIG90PV8uY29uc3RydWN0b3JfYm9keVt2ci5sZW5ndGhdO2lmKG90PT09dm9pZCAwKXRocm93IG5ldyBtZShgVHJpZWQgdG8gaW52b2tlIGN0b3Igb2YgJHtkfSB3aXRoIGludmFsaWQgbnVtYmVyIG9mIHBhcmFtZXRlcnMgKCR7dnIubGVuZ3RofSkgLSBleHBlY3RlZCAoJHtPYmplY3Qua2V5cyhfLmNvbnN0cnVjdG9yX2JvZHkpLnRvU3RyaW5nKCl9KSBwYXJhbWV0ZXJzIGluc3RlYWQhYCk7cmV0dXJuIG90LmFwcGx5KHRoaXMsdnIpfSksdj1PYmplY3QuY3JlYXRlKE0se2NvbnN0cnVjdG9yOnt2YWx1ZTpGfX0pO0YucHJvdG90eXBlPXY7dmFyIF89bmV3IF9uKGQsRix2LGgsRCxpLGwsYyk7Xy5iYXNlQ2xhc3MmJigoTz1fLmJhc2VDbGFzcykuX19kZXJpdmVkQ2xhc3Nlcz8/KE8uX19kZXJpdmVkQ2xhc3Nlcz1bXSksXy5iYXNlQ2xhc3MuX19kZXJpdmVkQ2xhc3Nlcy5wdXNoKF8pKTt2YXIgTD1uZXcgemUoZCxfLCEwLCExLCExKSxUPW5ldyB6ZShkKyIqIixfLCExLCExLCExKSxCPW5ldyB6ZShkKyIgY29uc3QqIixfLCExLCEwLCExKTtyZXR1cm4gTHJbZV09e3BvaW50ZXJUeXBlOlQsY29uc3RQb2ludGVyVHlwZTpCfSxVcihwLEYpLFtMLFQsQl19KX07ZnVuY3Rpb24gV3IoZSl7Zm9yKHZhciByPTE7cjxlLmxlbmd0aDsrK3IpaWYoZVtyXSE9PW51bGwmJmVbcl0uZGVzdHJ1Y3RvckZ1bmN0aW9uPT09dm9pZCAwKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uICRuKGUscil7aWYoIShlIGluc3RhbmNlb2YgRnVuY3Rpb24pKXRocm93IG5ldyBUeXBlRXJyb3IoYG5ld18gY2FsbGVkIHdpdGggY29uc3RydWN0b3IgdHlwZSAke3R5cGVvZiBlfSB3aGljaCBpcyBub3QgYSBmdW5jdGlvbmApO3ZhciB0PVVlKGUubmFtZXx8InVua25vd25GdW5jdGlvbk5hbWUiLGZ1bmN0aW9uKCl7fSk7dC5wcm90b3R5cGU9ZS5wcm90b3R5cGU7dmFyIG49bmV3IHQsYT1lLmFwcGx5KG4scik7cmV0dXJuIGEgaW5zdGFuY2VvZiBPYmplY3Q/YTpufWZ1bmN0aW9uIENuKGUscix0LG4pe2Zvcih2YXIgYT1XcihlKSxpPWUubGVuZ3RoLHM9IiIsbD0iIix1PTA7dTxpLTI7Kyt1KXMrPSh1IT09MD8iLCAiOiIiKSsiYXJnIit1LGwrPSh1IT09MD8iLCAiOiIiKSsiYXJnIit1KyJXaXJlZCI7dmFyIGM9YAogICAgICAgIHJldHVybiBmdW5jdGlvbiAoJHtzfSkgewogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoICE9PSAke2ktMn0pIHsKICAgICAgICAgIHRocm93QmluZGluZ0Vycm9yKCdmdW5jdGlvbiAnICsgaHVtYW5OYW1lICsgJyBjYWxsZWQgd2l0aCAnICsgYXJndW1lbnRzLmxlbmd0aCArICcgYXJndW1lbnRzLCBleHBlY3RlZCAke2ktMn0nKTsKICAgICAgICB9YDthJiYoYys9YHZhciBkZXN0cnVjdG9ycyA9IFtdOwpgKTt2YXIgZD1hPyJkZXN0cnVjdG9ycyI6Im51bGwiLG09WyJodW1hbk5hbWUiLCJ0aHJvd0JpbmRpbmdFcnJvciIsImludm9rZXIiLCJmbiIsInJ1bkRlc3RydWN0b3JzIiwicmV0VHlwZSIsImNsYXNzUGFyYW0iXTtyJiYoYys9InZhciB0aGlzV2lyZWQgPSBjbGFzc1BhcmFtWyd0b1dpcmVUeXBlJ10oIitkK2AsIHRoaXMpOwpgKTtmb3IodmFyIHU9MDt1PGktMjsrK3UpYys9InZhciBhcmciK3UrIldpcmVkID0gYXJnVHlwZSIrdSsiWyd0b1dpcmVUeXBlJ10oIitkKyIsIGFyZyIrdStgKTsKYCxtLnB1c2goImFyZ1R5cGUiK3UpO2lmKHImJihsPSJ0aGlzV2lyZWQiKyhsLmxlbmd0aD4wPyIsICI6IiIpK2wpLGMrPSh0fHxuPyJ2YXIgcnYgPSAiOiIiKSsiaW52b2tlcihmbiIrKGwubGVuZ3RoPjA/IiwgIjoiIikrbCtgKTsKYCxhKWMrPWBydW5EZXN0cnVjdG9ycyhkZXN0cnVjdG9ycyk7CmA7ZWxzZSBmb3IodmFyIHU9cj8xOjI7dTxlLmxlbmd0aDsrK3Upe3ZhciBoPXU9PT0xPyJ0aGlzV2lyZWQiOiJhcmciKyh1LTIpKyJXaXJlZCI7ZVt1XS5kZXN0cnVjdG9yRnVuY3Rpb24hPT1udWxsJiYoYys9YCR7aH1fZHRvcigke2h9KTsKYCxtLnB1c2goYCR7aH1fZHRvcmApKX1yZXR1cm4gdCYmKGMrPWB2YXIgcmV0ID0gcmV0VHlwZVsnZnJvbVdpcmVUeXBlJ10ocnYpOwpyZXR1cm4gcmV0OwpgKSxjKz1gfQpgLFttLGNdfWZ1bmN0aW9uIEhlKGUscix0LG4sYSxpKXt2YXIgcz1yLmxlbmd0aDtzPDImJmsoImFyZ1R5cGVzIGFycmF5IHNpemUgbWlzbWF0Y2ghIE11c3QgYXQgbGVhc3QgZ2V0IHJldHVybiB2YWx1ZSBhbmQgJ3RoaXMnIHR5cGVzISIpO2Zvcih2YXIgbD1yWzFdIT09bnVsbCYmdCE9PW51bGwsdT1XcihyKSxjPXJbMF0ubmFtZSE9PSJ2b2lkIixkPVtlLGssbixhLHJyLHJbMF0sclsxXV0sbT0wO208cy0yOysrbSlkLnB1c2goclttKzJdKTtpZighdSlmb3IodmFyIG09bD8xOjI7bTxyLmxlbmd0aDsrK20pclttXS5kZXN0cnVjdG9yRnVuY3Rpb24hPT1udWxsJiZkLnB1c2goclttXS5kZXN0cnVjdG9yRnVuY3Rpb24pO2xldFtoLHBdPUNuKHIsbCxjLGkpO2gucHVzaChwKTt2YXIgdz0kbihGdW5jdGlvbixoKSguLi5kKTtyZXR1cm4gVWUoZSx3KX12YXIgV2U9KGUscik9Pntmb3IodmFyIHQ9W10sbj0wO248ZTtuKyspdC5wdXNoKEFbcituKjQ+PjJdKTtyZXR1cm4gdH0saXI9ZT0+e2U9ZS50cmltKCk7Y29uc3Qgcj1lLmluZGV4T2YoIigiKTtyZXR1cm4gciE9PS0xP2Uuc3Vic3RyKDAscik6ZX0sRm49KGUscix0LG4sYSxpLHMsbCk9Pnt2YXIgdT1XZSh0LG4pO3I9aihyKSxyPWlyKHIpLGk9VyhhLGkpLE4oW10sW2VdLGM9PntjPWNbMF07dmFyIGQ9YCR7Yy5uYW1lfS4ke3J9YDtmdW5jdGlvbiBtKCl7ZmUoYENhbm5vdCBjYWxsICR7ZH0gZHVlIHRvIHVuYm91bmQgdHlwZXNgLHUpfXIuc3RhcnRzV2l0aCgiQEAiKSYmKHI9U3ltYm9sW3Iuc3Vic3RyaW5nKDIpXSk7dmFyIGg9Yy5yZWdpc3RlcmVkQ2xhc3MuY29uc3RydWN0b3I7cmV0dXJuIGhbcl09PT12b2lkIDA/KG0uYXJnQ291bnQ9dC0xLGhbcl09bSk6KG9yKGgscixkKSxoW3JdLm92ZXJsb2FkVGFibGVbdC0xXT1tKSxOKFtdLHUscD0+e3ZhciB3PVtwWzBdLG51bGxdLmNvbmNhdChwLnNsaWNlKDEpKSxEPUhlKGQsdyxudWxsLGkscyxsKTtpZihoW3JdLm92ZXJsb2FkVGFibGU9PT12b2lkIDA/KEQuYXJnQ291bnQ9dC0xLGhbcl09RCk6aFtyXS5vdmVybG9hZFRhYmxlW3QtMV09RCxjLnJlZ2lzdGVyZWRDbGFzcy5fX2Rlcml2ZWRDbGFzc2VzKWZvcihjb25zdCBNIG9mIGMucmVnaXN0ZXJlZENsYXNzLl9fZGVyaXZlZENsYXNzZXMpTS5jb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eShyKXx8KE0uY29uc3RydWN0b3Jbcl09RCk7cmV0dXJuW119KSxbXX0pfSxUbj0oZSxyLHQsbixhLGkpPT57dmFyIHM9V2Uocix0KTthPVcobixhKSxOKFtdLFtlXSxsPT57bD1sWzBdO3ZhciB1PWBjb25zdHJ1Y3RvciAke2wubmFtZX1gO2lmKGwucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHk9PT12b2lkIDAmJihsLnJlZ2lzdGVyZWRDbGFzcy5jb25zdHJ1Y3Rvcl9ib2R5PVtdKSxsLnJlZ2lzdGVyZWRDbGFzcy5jb25zdHJ1Y3Rvcl9ib2R5W3ItMV0hPT12b2lkIDApdGhyb3cgbmV3IG1lKGBDYW5ub3QgcmVnaXN0ZXIgbXVsdGlwbGUgY29uc3RydWN0b3JzIHdpdGggaWRlbnRpY2FsIG51bWJlciBvZiBwYXJhbWV0ZXJzICgke3ItMX0pIGZvciBjbGFzcyAnJHtsLm5hbWV9JyEgT3ZlcmxvYWQgcmVzb2x1dGlvbiBpcyBjdXJyZW50bHkgb25seSBwZXJmb3JtZWQgdXNpbmcgdGhlIHBhcmFtZXRlciBjb3VudCwgbm90IGFjdHVhbCB0eXBlIGluZm8hYCk7cmV0dXJuIGwucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHlbci0xXT0oKT0+e2ZlKGBDYW5ub3QgY29uc3RydWN0ICR7bC5uYW1lfSBkdWUgdG8gdW5ib3VuZCB0eXBlc2Ascyl9LE4oW10scyxjPT4oYy5zcGxpY2UoMSwwLG51bGwpLGwucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHlbci0xXT1IZSh1LGMsbnVsbCxhLGkpLFtdKSksW119KX0sU249KGUscix0LG4sYSxpLHMsbCx1KT0+e3ZhciBjPVdlKHQsbik7cj1qKHIpLHI9aXIociksaT1XKGEsaSksTihbXSxbZV0sZD0+e2Q9ZFswXTt2YXIgbT1gJHtkLm5hbWV9LiR7cn1gO3Iuc3RhcnRzV2l0aCgiQEAiKSYmKHI9U3ltYm9sW3Iuc3Vic3RyaW5nKDIpXSksbCYmZC5yZWdpc3RlcmVkQ2xhc3MucHVyZVZpcnR1YWxGdW5jdGlvbnMucHVzaChyKTtmdW5jdGlvbiBoKCl7ZmUoYENhbm5vdCBjYWxsICR7bX0gZHVlIHRvIHVuYm91bmQgdHlwZXNgLGMpfXZhciBwPWQucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHc9cFtyXTtyZXR1cm4gdz09PXZvaWQgMHx8dy5vdmVybG9hZFRhYmxlPT09dm9pZCAwJiZ3LmNsYXNzTmFtZSE9PWQubmFtZSYmdy5hcmdDb3VudD09PXQtMj8oaC5hcmdDb3VudD10LTIsaC5jbGFzc05hbWU9ZC5uYW1lLHBbcl09aCk6KG9yKHAscixtKSxwW3JdLm92ZXJsb2FkVGFibGVbdC0yXT1oKSxOKFtdLGMsRD0+e3ZhciBNPUhlKG0sRCxkLGkscyx1KTtyZXR1cm4gcFtyXS5vdmVybG9hZFRhYmxlPT09dm9pZCAwPyhNLmFyZ0NvdW50PXQtMixwW3JdPU0pOnBbcl0ub3ZlcmxvYWRUYWJsZVt0LTJdPU0sW119KSxbXX0pfSxCcj0oZSxyLHQpPT4oZSBpbnN0YW5jZW9mIE9iamVjdHx8ayhgJHt0fSB3aXRoIGludmFsaWQgInRoaXMiOiAke2V9YCksZSBpbnN0YW5jZW9mIHIucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yfHxrKGAke3R9IGluY29tcGF0aWJsZSB3aXRoICJ0aGlzIiBvZiB0eXBlICR7ZS5jb25zdHJ1Y3Rvci5uYW1lfWApLGUuJCQucHRyfHxrKGBjYW5ub3QgY2FsbCBlbXNjcmlwdGVuIGJpbmRpbmcgbWV0aG9kICR7dH0gb24gZGVsZXRlZCBvYmplY3RgKSxqZShlLiQkLnB0cixlLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzLHIucmVnaXN0ZXJlZENsYXNzKSksTW49KGUscix0LG4sYSxpLHMsbCx1LGMpPT57cj1qKHIpLGE9VyhuLGEpLE4oW10sW2VdLGQ9PntkPWRbMF07dmFyIG09YCR7ZC5uYW1lfS4ke3J9YCxoPXtnZXQoKXtmZShgQ2Fubm90IGFjY2VzcyAke219IGR1ZSB0byB1bmJvdW5kIHR5cGVzYCxbdCxzXSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfTtyZXR1cm4gdT9oLnNldD0oKT0+ZmUoYENhbm5vdCBhY2Nlc3MgJHttfSBkdWUgdG8gdW5ib3VuZCB0eXBlc2AsW3Qsc10pOmguc2V0PXA9PmsobSsiIGlzIGEgcmVhZC1vbmx5IHByb3BlcnR5IiksT2JqZWN0LmRlZmluZVByb3BlcnR5KGQucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHIsaCksTihbXSx1P1t0LHNdOlt0XSxwPT57dmFyIHc9cFswXSxEPXtnZXQoKXt2YXIgRj1Ccih0aGlzLGQsbSsiIGdldHRlciIpO3JldHVybiB3LmZyb21XaXJlVHlwZShhKGksRikpfSxlbnVtZXJhYmxlOiEwfTtpZih1KXt1PVcobCx1KTt2YXIgTT1wWzFdO0Quc2V0PWZ1bmN0aW9uKEYpe3ZhciB2PUJyKHRoaXMsZCxtKyIgc2V0dGVyIiksXz1bXTt1KGMsdixNLnRvV2lyZVR5cGUoXyxGKSkscnIoXyl9fXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZC5yZWdpc3RlcmVkQ2xhc3MuaW5zdGFuY2VQcm90b3R5cGUscixEKSxbXX0pLFtdfSl9LHNyPVtdLHJlPVtdLE5yPWU9PntlPjkmJi0tcmVbZSsxXT09PTAmJihyZVtlXT12b2lkIDAsc3IucHVzaChlKSl9LFJuPSgpPT5yZS5sZW5ndGgvMi01LXNyLmxlbmd0aCxPbj0oKT0+e3JlLnB1c2goMCwxLHZvaWQgMCwxLG51bGwsMSwhMCwxLCExLDEpLGYuY291bnRfZW12YWxfaGFuZGxlcz1Sbn0sdGU9e3RvVmFsdWU6ZT0+KGV8fGsoIkNhbm5vdCB1c2UgZGVsZXRlZCB2YWwuIGhhbmRsZSA9ICIrZSkscmVbZV0pLHRvSGFuZGxlOmU9Pntzd2l0Y2goZSl7Y2FzZSB2b2lkIDA6cmV0dXJuIDI7Y2FzZSBudWxsOnJldHVybiA0O2Nhc2UhMDpyZXR1cm4gNjtjYXNlITE6cmV0dXJuIDg7ZGVmYXVsdDp7Y29uc3Qgcj1zci5wb3AoKXx8cmUubGVuZ3RoO3JldHVybiByZVtyXT1lLHJlW3IrMV09MSxyfX19fSxJbj17bmFtZToiZW1zY3JpcHRlbjo6dmFsIixmcm9tV2lyZVR5cGU6ZT0+e3ZhciByPXRlLnRvVmFsdWUoZSk7cmV0dXJuIE5yKGUpLHJ9LHRvV2lyZVR5cGU6KGUscik9PnRlLnRvSGFuZGxlKHIpLGFyZ1BhY2tBZHZhbmNlOkoscmVhZFZhbHVlRnJvbVBvaW50ZXI6eWUsZGVzdHJ1Y3RvckZ1bmN0aW9uOm51bGx9LFlyPWU9PksoZSxJbiksbHI9ZT0+e2lmKGU9PT1udWxsKXJldHVybiJudWxsIjt2YXIgcj10eXBlb2YgZTtyZXR1cm4gcj09PSJvYmplY3QifHxyPT09ImFycmF5Inx8cj09PSJmdW5jdGlvbiI/ZS50b1N0cmluZygpOiIiK2V9LExuPShlLHIpPT57c3dpdGNoKHIpe2Nhc2UgNDpyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZnJvbVdpcmVUeXBlKGdyW3Q+PjJdKX07Y2FzZSA4OnJldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5mcm9tV2lyZVR5cGUoeXJbdD4+M10pfTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoYGludmFsaWQgZmxvYXQgd2lkdGggKCR7cn0pOiAke2V9YCl9fSxWbj0oZSxyLHQpPT57cj1qKHIpLEsoZSx7bmFtZTpyLGZyb21XaXJlVHlwZTpuPT5uLHRvV2lyZVR5cGU6KG4sYSk9PmEsYXJnUGFja0FkdmFuY2U6SixyZWFkVmFsdWVGcm9tUG9pbnRlcjpMbihyLHQpLGRlc3RydWN0b3JGdW5jdGlvbjpudWxsfSl9LFVuPShlLHIsdCxuLGEsaSxzKT0+e3ZhciBsPVdlKHIsdCk7ZT1qKGUpLGU9aXIoZSksYT1XKG4sYSksVnIoZSxmdW5jdGlvbigpe2ZlKGBDYW5ub3QgY2FsbCAke2V9IGR1ZSB0byB1bmJvdW5kIHR5cGVzYCxsKX0sci0xKSxOKFtdLGwsdT0+e3ZhciBjPVt1WzBdLG51bGxdLmNvbmNhdCh1LnNsaWNlKDEpKTtyZXR1cm4gVXIoZSxIZShlLGMsbnVsbCxhLGkscyksci0xKSxbXX0pfSxqbj0oZSxyLHQpPT57c3dpdGNoKHIpe2Nhc2UgMTpyZXR1cm4gdD9uPT5JW25dOm49Pnhbbl07Y2FzZSAyOnJldHVybiB0P249Pllbbj4+MV06bj0+Q2Vbbj4+MV07Y2FzZSA0OnJldHVybiB0P249Pmdbbj4+Ml06bj0+QVtuPj4yXTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoYGludmFsaWQgaW50ZWdlciB3aWR0aCAoJHtyfSk6ICR7ZX1gKX19LHpuPShlLHIsdCxuLGEpPT57cj1qKHIpO3ZhciBpPWQ9PmQ7aWYobj09PTApe3ZhciBzPTMyLTgqdDtpPWQ9PmQ8PHM+Pj5zfXZhciBsPXIuaW5jbHVkZXMoInVuc2lnbmVkIiksdT0oZCxtKT0+e30sYztsP2M9ZnVuY3Rpb24oZCxtKXtyZXR1cm4gdShtLHRoaXMubmFtZSksbT4+PjB9OmM9ZnVuY3Rpb24oZCxtKXtyZXR1cm4gdShtLHRoaXMubmFtZSksbX0sSyhlLHtuYW1lOnIsZnJvbVdpcmVUeXBlOmksdG9XaXJlVHlwZTpjLGFyZ1BhY2tBZHZhbmNlOkoscmVhZFZhbHVlRnJvbVBvaW50ZXI6am4ocix0LG4hPT0wKSxkZXN0cnVjdG9yRnVuY3Rpb246bnVsbH0pfSx4bj0oZSxyLHQpPT57dmFyIG49W0ludDhBcnJheSxVaW50OEFycmF5LEludDE2QXJyYXksVWludDE2QXJyYXksSW50MzJBcnJheSxVaW50MzJBcnJheSxGbG9hdDMyQXJyYXksRmxvYXQ2NEFycmF5XSxhPW5bcl07ZnVuY3Rpb24gaShzKXt2YXIgbD1BW3M+PjJdLHU9QVtzKzQ+PjJdO3JldHVybiBuZXcgYShJLmJ1ZmZlcix1LGwpfXQ9aih0KSxLKGUse25hbWU6dCxmcm9tV2lyZVR5cGU6aSxhcmdQYWNrQWR2YW5jZTpKLHJlYWRWYWx1ZUZyb21Qb2ludGVyOml9LHtpZ25vcmVEdXBsaWNhdGVSZWdpc3RyYXRpb25zOiEwfSl9LEhuPShlLHIpPT57WXIoZSl9LFduPShlLHIpPT57cj1qKHIpO3ZhciB0PXI9PT0ic3RkOjpzdHJpbmciO0soZSx7bmFtZTpyLGZyb21XaXJlVHlwZShuKXt2YXIgYT1BW24+PjJdLGk9bis0LHM7aWYodClmb3IodmFyIGw9aSx1PTA7dTw9YTsrK3Upe3ZhciBjPWkrdTtpZih1PT1hfHx4W2NdPT0wKXt2YXIgZD1jLWwsbT1zZShsLGQpO3M9PT12b2lkIDA/cz1tOihzKz0iXDAiLHMrPW0pLGw9YysxfX1lbHNle2Zvcih2YXIgaD1uZXcgQXJyYXkoYSksdT0wO3U8YTsrK3UpaFt1XT1TdHJpbmcuZnJvbUNoYXJDb2RlKHhbaSt1XSk7cz1oLmpvaW4oIiIpfXJldHVybiBaKG4pLHN9LHRvV2lyZVR5cGUobixhKXthIGluc3RhbmNlb2YgQXJyYXlCdWZmZXImJihhPW5ldyBVaW50OEFycmF5KGEpKTt2YXIgaSxzPXR5cGVvZiBhPT0ic3RyaW5nIjtzfHxhIGluc3RhbmNlb2YgVWludDhBcnJheXx8YSBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5fHxhIGluc3RhbmNlb2YgSW50OEFycmF5fHxrKCJDYW5ub3QgcGFzcyBub24tc3RyaW5nIHRvIHN0ZDo6c3RyaW5nIiksdCYmcz9pPVplKGEpOmk9YS5sZW5ndGg7dmFyIGw9ZnIoNCtpKzEpLHU9bCs0O2lmKEFbbD4+Ml09aSx0JiZzKXZlKGEsdSxpKzEpO2Vsc2UgaWYocylmb3IodmFyIGM9MDtjPGk7KytjKXt2YXIgZD1hLmNoYXJDb2RlQXQoYyk7ZD4yNTUmJihaKHUpLGsoIlN0cmluZyBoYXMgVVRGLTE2IGNvZGUgdW5pdHMgdGhhdCBkbyBub3QgZml0IGluIDggYml0cyIpKSx4W3UrY109ZH1lbHNlIGZvcih2YXIgYz0wO2M8aTsrK2MpeFt1K2NdPWFbY107cmV0dXJuIG4hPT1udWxsJiZuLnB1c2goWixsKSxsfSxhcmdQYWNrQWR2YW5jZTpKLHJlYWRWYWx1ZUZyb21Qb2ludGVyOnllLGRlc3RydWN0b3JGdW5jdGlvbihuKXtaKG4pfX0pfSxHcj10eXBlb2YgVGV4dERlY29kZXI8InUiP25ldyBUZXh0RGVjb2RlcigidXRmLTE2bGUiKTp2b2lkIDAsQm49KGUscik9Pntmb3IodmFyIHQ9ZSxuPXQ+PjEsYT1uK3IvMjshKG4+PWEpJiZDZVtuXTspKytuO2lmKHQ9bjw8MSx0LWU+MzImJkdyKXJldHVybiBHci5kZWNvZGUoeC5zdWJhcnJheShlLHQpKTtmb3IodmFyIGk9IiIscz0wOyEocz49ci8yKTsrK3Mpe3ZhciBsPVlbZStzKjI+PjFdO2lmKGw9PTApYnJlYWs7aSs9U3RyaW5nLmZyb21DaGFyQ29kZShsKX1yZXR1cm4gaX0sTm49KGUscix0KT0+e2lmKHQ/Pyh0PTIxNDc0ODM2NDcpLHQ8MilyZXR1cm4gMDt0LT0yO2Zvcih2YXIgbj1yLGE9dDxlLmxlbmd0aCoyP3QvMjplLmxlbmd0aCxpPTA7aTxhOysraSl7dmFyIHM9ZS5jaGFyQ29kZUF0KGkpO1lbcj4+MV09cyxyKz0yfXJldHVybiBZW3I+PjFdPTAsci1ufSxZbj1lPT5lLmxlbmd0aCoyLEduPShlLHIpPT57Zm9yKHZhciB0PTAsbj0iIjshKHQ+PXIvNCk7KXt2YXIgYT1nW2UrdCo0Pj4yXTtpZihhPT0wKWJyZWFrO2lmKCsrdCxhPj02NTUzNil7dmFyIGk9YS02NTUzNjtuKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2fGk+PjEwLDU2MzIwfGkmMTAyMyl9ZWxzZSBuKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGEpfXJldHVybiBufSxxbj0oZSxyLHQpPT57aWYodD8/KHQ9MjE0NzQ4MzY0NyksdDw0KXJldHVybiAwO2Zvcih2YXIgbj1yLGE9bit0LTQsaT0wO2k8ZS5sZW5ndGg7KytpKXt2YXIgcz1lLmNoYXJDb2RlQXQoaSk7aWYocz49NTUyOTYmJnM8PTU3MzQzKXt2YXIgbD1lLmNoYXJDb2RlQXQoKytpKTtzPTY1NTM2KygocyYxMDIzKTw8MTApfGwmMTAyM31pZihnW3I+PjJdPXMscis9NCxyKzQ+YSlicmVha31yZXR1cm4gZ1tyPj4yXT0wLHItbn0sWG49ZT0+e2Zvcih2YXIgcj0wLHQ9MDt0PGUubGVuZ3RoOysrdCl7dmFyIG49ZS5jaGFyQ29kZUF0KHQpO24+PTU1Mjk2JiZuPD01NzM0MyYmKyt0LHIrPTR9cmV0dXJuIHJ9LEtuPShlLHIsdCk9Pnt0PWoodCk7dmFyIG4sYSxpLHM7cj09PTI/KG49Qm4sYT1ObixzPVluLGk9bD0+Q2VbbD4+MV0pOnI9PT00JiYobj1HbixhPXFuLHM9WG4saT1sPT5BW2w+PjJdKSxLKGUse25hbWU6dCxmcm9tV2lyZVR5cGU6bD0+e2Zvcih2YXIgdT1BW2w+PjJdLGMsZD1sKzQsbT0wO208PXU7KyttKXt2YXIgaD1sKzQrbSpyO2lmKG09PXV8fGkoaCk9PTApe3ZhciBwPWgtZCx3PW4oZCxwKTtjPT09dm9pZCAwP2M9dzooYys9IlwwIixjKz13KSxkPWgrcn19cmV0dXJuIFoobCksY30sdG9XaXJlVHlwZToobCx1KT0+e3R5cGVvZiB1IT0ic3RyaW5nIiYmayhgQ2Fubm90IHBhc3Mgbm9uLXN0cmluZyB0byBDKysgc3RyaW5nIHR5cGUgJHt0fWApO3ZhciBjPXModSksZD1mcig0K2Mrcik7cmV0dXJuIEFbZD4+Ml09Yy9yLGEodSxkKzQsYytyKSxsIT09bnVsbCYmbC5wdXNoKFosZCksZH0sYXJnUGFja0FkdmFuY2U6SixyZWFkVmFsdWVGcm9tUG9pbnRlcjp5ZSxkZXN0cnVjdG9yRnVuY3Rpb24obCl7WihsKX19KX0sSm49KGUscix0LG4sYSxpKT0+e1JlW2VdPXtuYW1lOmoocikscmF3Q29uc3RydWN0b3I6Vyh0LG4pLHJhd0Rlc3RydWN0b3I6VyhhLGkpLGZpZWxkczpbXX19LFpuPShlLHIsdCxuLGEsaSxzLGwsdSxjKT0+e1JlW2VdLmZpZWxkcy5wdXNoKHtmaWVsZE5hbWU6aihyKSxnZXR0ZXJSZXR1cm5UeXBlOnQsZ2V0dGVyOlcobixhKSxnZXR0ZXJDb250ZXh0Omksc2V0dGVyQXJndW1lbnRUeXBlOnMsc2V0dGVyOlcobCx1KSxzZXR0ZXJDb250ZXh0OmN9KX0sUW49KGUscik9PntyPWoociksSyhlLHtpc1ZvaWQ6ITAsbmFtZTpyLGFyZ1BhY2tBZHZhbmNlOjAsZnJvbVdpcmVUeXBlOigpPT57fSx0b1dpcmVUeXBlOih0LG4pPT57fX0pfSxlYT0xLHJhPSgpPT5lYSx0YT0oZSxyLHQpPT54LmNvcHlXaXRoaW4oZSxyLHIrdCksbmE9KCk9PnRlLnRvSGFuZGxlKHt9KSxhYT0oZSxyLHQpPT57ZT10ZS50b1ZhbHVlKGUpLHI9dGUudG9WYWx1ZShyKSx0PXRlLnRvVmFsdWUodCksZVtyXT10fSxvYT0oZSxyKT0+e3ZhciB0PXVlW2VdO3JldHVybiB0PT09dm9pZCAwJiZrKGAke3J9IGhhcyB1bmtub3duIHR5cGUgJHtIcihlKX1gKSx0fSxpYT0oZSxyKT0+e2U9b2EoZSwiX2VtdmFsX3Rha2VfdmFsdWUiKTt2YXIgdD1lLnJlYWRWYWx1ZUZyb21Qb2ludGVyKHIpO3JldHVybiB0ZS50b0hhbmRsZSh0KX0scXI9KGUscik9PnIrMjA5NzE1Mj4+PjA8NDE5NDMwNS0hIWU/KGU+Pj4wKStyKjQyOTQ5NjcyOTY6TmFOO2Z1bmN0aW9uIHNhKGUscix0KXt2YXIgbj1xcihlLHIpLGE9bmV3IERhdGUobioxZTMpO2dbdD4+Ml09YS5nZXRVVENTZWNvbmRzKCksZ1t0KzQ+PjJdPWEuZ2V0VVRDTWludXRlcygpLGdbdCs4Pj4yXT1hLmdldFVUQ0hvdXJzKCksZ1t0KzEyPj4yXT1hLmdldFVUQ0RhdGUoKSxnW3QrMTY+PjJdPWEuZ2V0VVRDTW9udGgoKSxnW3QrMjA+PjJdPWEuZ2V0VVRDRnVsbFllYXIoKS0xOTAwLGdbdCsyND4+Ml09YS5nZXRVVENEYXkoKTt2YXIgaT1EYXRlLlVUQyhhLmdldFVUQ0Z1bGxZZWFyKCksMCwxLDAsMCwwLDApLHM9KGEuZ2V0VGltZSgpLWkpLygxZTMqNjAqNjAqMjQpfDA7Z1t0KzI4Pj4yXT1zfXZhciBCZT1lPT5lJTQ9PT0wJiYoZSUxMDAhPT0wfHxlJTQwMD09PTApLGxhPShlLHIsdCxuKT0+e3ZhciBhPW5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSxpPW5ldyBEYXRlKGEsMCwxKSxzPW5ldyBEYXRlKGEsNiwxKSxsPWkuZ2V0VGltZXpvbmVPZmZzZXQoKSx1PXMuZ2V0VGltZXpvbmVPZmZzZXQoKSxjPU1hdGgubWF4KGwsdSk7QVtlPj4yXT1jKjYwLGdbcj4+Ml09KyhsIT11KTt2YXIgZD1wPT5wLnRvTG9jYWxlVGltZVN0cmluZyh2b2lkIDAse2hvdXIxMjohMSx0aW1lWm9uZU5hbWU6InNob3J0In0pLnNwbGl0KCIgIilbMV0sbT1kKGkpLGg9ZChzKTt1PGw/KHZlKG0sdCwxNyksdmUoaCxuLDE3KSk6KHZlKG0sbiwxNyksdmUoaCx0LDE3KSl9LHVhPSgpPT5EYXRlLm5vdygpLFhyPSgpPT4yMTQ3NDgzNjQ4LGZhPSgpPT5YcigpLEtyO0tyPSgpPT5wZXJmb3JtYW5jZS5ub3coKTt2YXIgY2E9ZT0+e3ZhciByPSRlLmJ1ZmZlcix0PShlLXIuYnl0ZUxlbmd0aCs2NTUzNSkvNjU1MzY7dHJ5e3JldHVybiAkZS5ncm93KHQpLHdyKCksMX1jYXRjaHt9fSxkYT1lPT57dmFyIHI9eC5sZW5ndGg7ZT4+Pj0wO3ZhciB0PVhyKCk7aWYoZT50KXJldHVybiExO2Zvcih2YXIgbj0odSxjKT0+dSsoYy11JWMpJWMsYT0xO2E8PTQ7YSo9Mil7dmFyIGk9ciooMSsuMi9hKTtpPU1hdGgubWluKGksZSsxMDA2NjMyOTYpO3ZhciBzPU1hdGgubWluKHQsbihNYXRoLm1heChlLGkpLDY1NTM2KSksbD1jYShzKTtpZihsKXJldHVybiEwfXJldHVybiExfSx1cj17fSx2YT0oKT0+aHJ8fCIuL3RoaXMucHJvZ3JhbSIsUGU9KCk9PntpZighUGUuc3RyaW5ncyl7dmFyIGU9KHR5cGVvZiBuYXZpZ2F0b3I9PSJvYmplY3QiJiZuYXZpZ2F0b3IubGFuZ3VhZ2VzJiZuYXZpZ2F0b3IubGFuZ3VhZ2VzWzBdfHwiQyIpLnJlcGxhY2UoIi0iLCJfIikrIi5VVEYtOCIscj17VVNFUjoid2ViX3VzZXIiLExPR05BTUU6IndlYl91c2VyIixQQVRIOiIvIixQV0Q6Ii8iLEhPTUU6Ii9ob21lL3dlYl91c2VyIixMQU5HOmUsXzp2YSgpfTtmb3IodmFyIHQgaW4gdXIpdXJbdF09PT12b2lkIDA/ZGVsZXRlIHJbdF06clt0XT11clt0XTt2YXIgbj1bXTtmb3IodmFyIHQgaW4gciluLnB1c2goYCR7dH09JHtyW3RdfWApO1BlLnN0cmluZ3M9bn1yZXR1cm4gUGUuc3RyaW5nc30saGE9KGUscik9Pntmb3IodmFyIHQ9MDt0PGUubGVuZ3RoOysrdClJW3IrK109ZS5jaGFyQ29kZUF0KHQpO0lbcl09MH0sbWE9KGUscik9Pnt2YXIgdD0wO3JldHVybiBQZSgpLmZvckVhY2goKG4sYSk9Pnt2YXIgaT1yK3Q7QVtlK2EqND4+Ml09aSxoYShuLGkpLHQrPW4ubGVuZ3RoKzF9KSwwfSxwYT0oZSxyKT0+e3ZhciB0PVBlKCk7QVtlPj4yXT10Lmxlbmd0aDt2YXIgbj0wO3JldHVybiB0LmZvckVhY2goYT0+bis9YS5sZW5ndGgrMSksQVtyPj4yXT1uLDB9O2Z1bmN0aW9uIF9hKGUpe3RyeXt2YXIgcj1QLmdldFN0cmVhbUZyb21GRChlKTtyZXR1cm4gby5jbG9zZShyKSwwfWNhdGNoKHQpe2lmKHR5cGVvZiBvPiJ1Inx8dC5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IHQ7cmV0dXJuIHQuZXJybm99fWZ1bmN0aW9uIGdhKGUscil7dHJ5e3ZhciB0PTAsbj0wLGE9MCxpPVAuZ2V0U3RyZWFtRnJvbUZEKGUpLHM9aS50dHk/MjpvLmlzRGlyKGkubW9kZSk/MzpvLmlzTGluayhpLm1vZGUpPzc6NDtyZXR1cm4gSVtyXT1zLFlbcisyPj4xXT1hLCQ9W3Q+Pj4wLCh5PXQsK01hdGguYWJzKHkpPj0xP3k+MD8rTWF0aC5mbG9vcih5LzQyOTQ5NjcyOTYpPj4+MDp+fitNYXRoLmNlaWwoKHktKyh+fnk+Pj4wKSkvNDI5NDk2NzI5Nik+Pj4wOjApXSxnW3IrOD4+Ml09JFswXSxnW3IrMTI+PjJdPSRbMV0sJD1bbj4+PjAsKHk9biwrTWF0aC5hYnMoeSk+PTE/eT4wPytNYXRoLmZsb29yKHkvNDI5NDk2NzI5Nik+Pj4wOn5+K01hdGguY2VpbCgoeS0rKH5+eT4+PjApKS80Mjk0OTY3Mjk2KT4+PjA6MCldLGdbcisxNj4+Ml09JFswXSxnW3IrMjA+PjJdPSRbMV0sMH1jYXRjaChsKXtpZih0eXBlb2Ygbz4idSJ8fGwubmFtZSE9PSJFcnJub0Vycm9yIil0aHJvdyBsO3JldHVybiBsLmVycm5vfX12YXIgeWE9KGUscix0LG4pPT57Zm9yKHZhciBhPTAsaT0wO2k8dDtpKyspe3ZhciBzPUFbcj4+Ml0sbD1BW3IrND4+Ml07cis9ODt2YXIgdT1vLnJlYWQoZSxJLHMsbCxuKTtpZih1PDApcmV0dXJuLTE7aWYoYSs9dSx1PGwpYnJlYWt9cmV0dXJuIGF9O2Z1bmN0aW9uIHdhKGUscix0LG4pe3RyeXt2YXIgYT1QLmdldFN0cmVhbUZyb21GRChlKSxpPXlhKGEscix0KTtyZXR1cm4gQVtuPj4yXT1pLDB9Y2F0Y2gocyl7aWYodHlwZW9mIG8+InUifHxzLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgcztyZXR1cm4gcy5lcnJub319ZnVuY3Rpb24gRWEoZSxyLHQsbixhKXt2YXIgaT1xcihyLHQpO3RyeXtpZihpc05hTihpKSlyZXR1cm4gNjE7dmFyIHM9UC5nZXRTdHJlYW1Gcm9tRkQoZSk7cmV0dXJuIG8ubGxzZWVrKHMsaSxuKSwkPVtzLnBvc2l0aW9uPj4+MCwoeT1zLnBvc2l0aW9uLCtNYXRoLmFicyh5KT49MT95PjA/K01hdGguZmxvb3IoeS80Mjk0OTY3Mjk2KT4+PjA6fn4rTWF0aC5jZWlsKCh5LSsofn55Pj4+MCkpLzQyOTQ5NjcyOTYpPj4+MDowKV0sZ1thPj4yXT0kWzBdLGdbYSs0Pj4yXT0kWzFdLHMuZ2V0ZGVudHMmJmk9PT0wJiZuPT09MCYmKHMuZ2V0ZGVudHM9bnVsbCksMH1jYXRjaChsKXtpZih0eXBlb2Ygbz4idSJ8fGwubmFtZSE9PSJFcnJub0Vycm9yIil0aHJvdyBsO3JldHVybiBsLmVycm5vfX12YXIgYmE9KGUscix0LG4pPT57Zm9yKHZhciBhPTAsaT0wO2k8dDtpKyspe3ZhciBzPUFbcj4+Ml0sbD1BW3IrND4+Ml07cis9ODt2YXIgdT1vLndyaXRlKGUsSSxzLGwsbik7aWYodTwwKXJldHVybi0xO2ErPXV9cmV0dXJuIGF9O2Z1bmN0aW9uIGthKGUscix0LG4pe3RyeXt2YXIgYT1QLmdldFN0cmVhbUZyb21GRChlKSxpPWJhKGEscix0KTtyZXR1cm4gQVtuPj4yXT1pLDB9Y2F0Y2gocyl7aWYodHlwZW9mIG8+InUifHxzLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgcztyZXR1cm4gcy5lcnJub319dmFyIFBhPShlLHIpPT57Zm9yKHZhciB0PTAsbj0wO248PXI7dCs9ZVtuKytdKTtyZXR1cm4gdH0sSnI9WzMxLDI5LDMxLDMwLDMxLDMwLDMxLDMxLDMwLDMxLDMwLDMxXSxacj1bMzEsMjgsMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdLEFhPShlLHIpPT57Zm9yKHZhciB0PW5ldyBEYXRlKGUuZ2V0VGltZSgpKTtyPjA7KXt2YXIgbj1CZSh0LmdldEZ1bGxZZWFyKCkpLGE9dC5nZXRNb250aCgpLGk9KG4/SnI6WnIpW2FdO2lmKHI+aS10LmdldERhdGUoKSlyLT1pLXQuZ2V0RGF0ZSgpKzEsdC5zZXREYXRlKDEpLGE8MTE/dC5zZXRNb250aChhKzEpOih0LnNldE1vbnRoKDApLHQuc2V0RnVsbFllYXIodC5nZXRGdWxsWWVhcigpKzEpKTtlbHNlIHJldHVybiB0LnNldERhdGUodC5nZXREYXRlKCkrciksdH1yZXR1cm4gdH0sRGE9KGUscik9PntJLnNldChlLHIpfSxRcj0oZSxyLHQsbik9Pnt2YXIgYT1BW24rNDA+PjJdLGk9e3RtX3NlYzpnW24+PjJdLHRtX21pbjpnW24rND4+Ml0sdG1faG91cjpnW24rOD4+Ml0sdG1fbWRheTpnW24rMTI+PjJdLHRtX21vbjpnW24rMTY+PjJdLHRtX3llYXI6Z1tuKzIwPj4yXSx0bV93ZGF5OmdbbisyND4+Ml0sdG1feWRheTpnW24rMjg+PjJdLHRtX2lzZHN0OmdbbiszMj4+Ml0sdG1fZ210b2ZmOmdbbiszNj4+Ml0sdG1fem9uZTphP3NlKGEpOiIifSxzPXNlKHQpLGw9eyIlYyI6IiVhICViICVkICVIOiVNOiVTICVZIiwiJUQiOiIlbS8lZC8leSIsIiVGIjoiJVktJW0tJWQiLCIlaCI6IiViIiwiJXIiOiIlSTolTTolUyAlcCIsIiVSIjoiJUg6JU0iLCIlVCI6IiVIOiVNOiVTIiwiJXgiOiIlbS8lZC8leSIsIiVYIjoiJUg6JU06JVMiLCIlRWMiOiIlYyIsIiVFQyI6IiVDIiwiJUV4IjoiJW0vJWQvJXkiLCIlRVgiOiIlSDolTTolUyIsIiVFeSI6IiV5IiwiJUVZIjoiJVkiLCIlT2QiOiIlZCIsIiVPZSI6IiVlIiwiJU9IIjoiJUgiLCIlT0kiOiIlSSIsIiVPbSI6IiVtIiwiJU9NIjoiJU0iLCIlT1MiOiIlUyIsIiVPdSI6IiV1IiwiJU9VIjoiJVUiLCIlT1YiOiIlViIsIiVPdyI6IiV3IiwiJU9XIjoiJVciLCIlT3kiOiIleSJ9O2Zvcih2YXIgdSBpbiBsKXM9cy5yZXBsYWNlKG5ldyBSZWdFeHAodSwiZyIpLGxbdV0pO3ZhciBjPVsiU3VuZGF5IiwiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiXSxkPVsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXTtmdW5jdGlvbiBtKHYsXyxMKXtmb3IodmFyIFQ9dHlwZW9mIHY9PSJudW1iZXIiP3YudG9TdHJpbmcoKTp2fHwiIjtULmxlbmd0aDxfOylUPUxbMF0rVDtyZXR1cm4gVH1mdW5jdGlvbiBoKHYsXyl7cmV0dXJuIG0odixfLCIwIil9ZnVuY3Rpb24gcCh2LF8pe2Z1bmN0aW9uIEwoQil7cmV0dXJuIEI8MD8tMTpCPjA/MTowfXZhciBUO3JldHVybihUPUwodi5nZXRGdWxsWWVhcigpLV8uZ2V0RnVsbFllYXIoKSkpPT09MCYmKFQ9TCh2LmdldE1vbnRoKCktXy5nZXRNb250aCgpKSk9PT0wJiYoVD1MKHYuZ2V0RGF0ZSgpLV8uZ2V0RGF0ZSgpKSksVH1mdW5jdGlvbiB3KHYpe3N3aXRjaCh2LmdldERheSgpKXtjYXNlIDA6cmV0dXJuIG5ldyBEYXRlKHYuZ2V0RnVsbFllYXIoKS0xLDExLDI5KTtjYXNlIDE6cmV0dXJuIHY7Y2FzZSAyOnJldHVybiBuZXcgRGF0ZSh2LmdldEZ1bGxZZWFyKCksMCwzKTtjYXNlIDM6cmV0dXJuIG5ldyBEYXRlKHYuZ2V0RnVsbFllYXIoKSwwLDIpO2Nhc2UgNDpyZXR1cm4gbmV3IERhdGUodi5nZXRGdWxsWWVhcigpLDAsMSk7Y2FzZSA1OnJldHVybiBuZXcgRGF0ZSh2LmdldEZ1bGxZZWFyKCktMSwxMSwzMSk7Y2FzZSA2OnJldHVybiBuZXcgRGF0ZSh2LmdldEZ1bGxZZWFyKCktMSwxMSwzMCl9fWZ1bmN0aW9uIEQodil7dmFyIF89QWEobmV3IERhdGUodi50bV95ZWFyKzE5MDAsMCwxKSx2LnRtX3lkYXkpLEw9bmV3IERhdGUoXy5nZXRGdWxsWWVhcigpLDAsNCksVD1uZXcgRGF0ZShfLmdldEZ1bGxZZWFyKCkrMSwwLDQpLEI9dyhMKSxPPXcoVCk7cmV0dXJuIHAoQixfKTw9MD9wKE8sXyk8PTA/Xy5nZXRGdWxsWWVhcigpKzE6Xy5nZXRGdWxsWWVhcigpOl8uZ2V0RnVsbFllYXIoKS0xfXZhciBNPXsiJWEiOnY9PmNbdi50bV93ZGF5XS5zdWJzdHJpbmcoMCwzKSwiJUEiOnY9PmNbdi50bV93ZGF5XSwiJWIiOnY9PmRbdi50bV9tb25dLnN1YnN0cmluZygwLDMpLCIlQiI6dj0+ZFt2LnRtX21vbl0sIiVDIjp2PT57dmFyIF89di50bV95ZWFyKzE5MDA7cmV0dXJuIGgoXy8xMDB8MCwyKX0sIiVkIjp2PT5oKHYudG1fbWRheSwyKSwiJWUiOnY9Pm0odi50bV9tZGF5LDIsIiAiKSwiJWciOnY9PkQodikudG9TdHJpbmcoKS5zdWJzdHJpbmcoMiksIiVHIjpELCIlSCI6dj0+aCh2LnRtX2hvdXIsMiksIiVJIjp2PT57dmFyIF89di50bV9ob3VyO3JldHVybiBfPT0wP189MTI6Xz4xMiYmKF8tPTEyKSxoKF8sMil9LCIlaiI6dj0+aCh2LnRtX21kYXkrUGEoQmUodi50bV95ZWFyKzE5MDApP0pyOlpyLHYudG1fbW9uLTEpLDMpLCIlbSI6dj0+aCh2LnRtX21vbisxLDIpLCIlTSI6dj0+aCh2LnRtX21pbiwyKSwiJW4iOigpPT5gCmAsIiVwIjp2PT52LnRtX2hvdXI+PTAmJnYudG1faG91cjwxMj8iQU0iOiJQTSIsIiVTIjp2PT5oKHYudG1fc2VjLDIpLCIldCI6KCk9PiIJIiwiJXUiOnY9PnYudG1fd2RheXx8NywiJVUiOnY9Pnt2YXIgXz12LnRtX3lkYXkrNy12LnRtX3dkYXk7cmV0dXJuIGgoTWF0aC5mbG9vcihfLzcpLDIpfSwiJVYiOnY9Pnt2YXIgXz1NYXRoLmZsb29yKCh2LnRtX3lkYXkrNy0odi50bV93ZGF5KzYpJTcpLzcpO2lmKCh2LnRtX3dkYXkrMzcxLXYudG1feWRheS0yKSU3PD0yJiZfKyssXyl7aWYoXz09NTMpe3ZhciBUPSh2LnRtX3dkYXkrMzcxLXYudG1feWRheSklNztUIT00JiYoVCE9M3x8IUJlKHYudG1feWVhcikpJiYoXz0xKX19ZWxzZXtfPTUyO3ZhciBMPSh2LnRtX3dkYXkrNy12LnRtX3lkYXktMSklNzsoTD09NHx8TD09NSYmQmUodi50bV95ZWFyJTQwMC0xKSkmJl8rK31yZXR1cm4gaChfLDIpfSwiJXciOnY9PnYudG1fd2RheSwiJVciOnY9Pnt2YXIgXz12LnRtX3lkYXkrNy0odi50bV93ZGF5KzYpJTc7cmV0dXJuIGgoTWF0aC5mbG9vcihfLzcpLDIpfSwiJXkiOnY9Pih2LnRtX3llYXIrMTkwMCkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMiksIiVZIjp2PT52LnRtX3llYXIrMTkwMCwiJXoiOnY9Pnt2YXIgXz12LnRtX2dtdG9mZixMPV8+PTA7cmV0dXJuIF89TWF0aC5hYnMoXykvNjAsXz1fLzYwKjEwMCtfJTYwLChMPyIrIjoiLSIpKygiMDAwMCIrXykuc2xpY2UoLTQpfSwiJVoiOnY9PnYudG1fem9uZSwiJSUiOigpPT4iJSJ9O3M9cy5yZXBsYWNlKC8lJS9nLCJcMFwwIik7Zm9yKHZhciB1IGluIE0pcy5pbmNsdWRlcyh1KSYmKHM9cy5yZXBsYWNlKG5ldyBSZWdFeHAodSwiZyIpLE1bdV0oaSkpKTtzPXMucmVwbGFjZSgvXDBcMC9nLCIlIik7dmFyIEY9U2UocywhMSk7cmV0dXJuIEYubGVuZ3RoPnI/MDooRGEoRixlKSxGLmxlbmd0aC0xKX0sJGE9KGUscix0LG4sYSk9PlFyKGUscix0LG4pO28uY3JlYXRlUHJlbG9hZGVkRmlsZT1WdCxvLnN0YXRpY0luaXQoKSxTcj1mLkludGVybmFsRXJyb3I9Y2xhc3MgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihyKXtzdXBlcihyKSx0aGlzLm5hbWU9IkludGVybmFsRXJyb3IifX0sZW4oKSxtZT1mLkJpbmRpbmdFcnJvcj1jbGFzcyBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKHIpe3N1cGVyKHIpLHRoaXMubmFtZT0iQmluZGluZ0Vycm9yIn19LHZuKCksdW4oKSxFbigpLHhyPWYuVW5ib3VuZFR5cGVFcnJvcj1BbihFcnJvciwiVW5ib3VuZFR5cGVFcnJvciIpLE9uKCk7dmFyIENhPXtsOkN0LGM6VHQsVTpqdCxzOnp0LFI6eHQsSjpIdCxXOld0LE86QnQsUDpOdCxLOll0LEk6R3QsSDpxdCxROlh0LEU6S3QsVjpKdCxrOlp0LEI6UXQsWjp0bixoOkRuLHk6Rm4sajpUbixiOlNuLGE6TW4sWTpZcix3OlZuLGk6VW4sZjp6bixkOnhuLG06SG4sdjpXbix0OktuLG46Sm4sZTpabixfOlFuLFM6cmEsVDp0YSx4Ok5yLGFhOm5hLCQ6YWEsZzppYSx6OnNhLEY6bGEscDp1YSxHOmZhLG86S3IsRDpkYSxNOm1hLE46cGEscjpfYSxMOmdhLHU6d2EsQTpFYSxxOmthLFg6UXIsQzokYX0sej0kdCgpLGZyPWU9Pihmcj16LmRhKShlKSxldD1lPT4oZXQ9ei5mYSkoZSksWj1lPT4oWj16LmdhKShlKSxydD1lPT4ocnQ9ei5pYSkoZSk7Zi5keW5DYWxsX2ppamk9KGUscix0LG4sYSk9PihmLmR5bkNhbGxfamlqaT16LmphKShlLHIsdCxuLGEpLGYuZHluQ2FsbF9paWlqaT0oZSxyLHQsbixhLGkpPT4oZi5keW5DYWxsX2lpaWppPXoua2EpKGUscix0LG4sYSxpKSxmLmR5bkNhbGxfamlpaWo9KGUscix0LG4sYSxpKT0+KGYuZHluQ2FsbF9qaWlpaj16LmxhKShlLHIsdCxuLGEsaSksZi5keW5DYWxsX2lpaWlpaj0oZSxyLHQsbixhLGkscyk9PihmLmR5bkNhbGxfaWlpaWlqPXoubWEpKGUscix0LG4sYSxpLHMpLGYuZHluQ2FsbF92aWlqaWk9KGUscix0LG4sYSxpLHMpPT4oZi5keW5DYWxsX3ZpaWppaT16Lm5hKShlLHIsdCxuLGEsaSxzKSxmLmR5bkNhbGxfaWlpaWlqaj0oZSxyLHQsbixhLGkscyxsLHUpPT4oZi5keW5DYWxsX2lpaWlpamo9ei5vYSkoZSxyLHQsbixhLGkscyxsLHUpLGYuZHluQ2FsbF9paWlpaWlqaj0oZSxyLHQsbixhLGkscyxsLHUsYyk9PihmLmR5bkNhbGxfaWlpaWlpamo9ei5wYSkoZSxyLHQsbixhLGkscyxsLHUsYyksZi5fZmZfaDI2NF9jYWJhY190YWJsZXM9MjA2ODEyO3ZhciBOZTtnZT1mdW5jdGlvbiBlKCl7TmV8fHR0KCksTmV8fChnZT1lKX07ZnVuY3Rpb24gdHQoKXtpZihvZT4wfHwocHQoKSxvZT4wKSlyZXR1cm47ZnVuY3Rpb24gZSgpe05lfHwoTmU9ITAsZi5jYWxsZWRSdW49ITAsIXByJiYoX3QoKSxVKGYpLGYub25SdW50aW1lSW5pdGlhbGl6ZWQmJmYub25SdW50aW1lSW5pdGlhbGl6ZWQoKSxndCgpKSl9Zi5zZXRTdGF0dXM/KGYuc2V0U3RhdHVzKCJSdW5uaW5nLi4uIiksc2V0VGltZW91dChmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtmLnNldFN0YXR1cygiIil9LDEpLGUoKX0sMSkpOmUoKX1pZihmLnByZUluaXQpZm9yKHR5cGVvZiBmLnByZUluaXQ9PSJmdW5jdGlvbiImJihmLnByZUluaXQ9W2YucHJlSW5pdF0pO2YucHJlSW5pdC5sZW5ndGg+MDspZi5wcmVJbml0LnBvcCgpKCk7dHQoKTtsZXQgbnQ9MzI7ZnVuY3Rpb24gYXQoZSxyPTMsdD01MDApe2xldCBuPTA7Zm9yKDtuPHI7KXRyeXtyZXR1cm4gZSgpfWNhdGNoKGEpe2lmKG50Pj0yNCYmY29uc29sZS53YXJuKGBBdHRlbXB0ICR7bisxfSBmYWlsZWQ6ICR7YS5tZXNzYWdlfWApLG4rKyxuPj1yKXRocm93IG5ldyBFcnJvcihgRmFpbGVkIGFmdGVyICR7cn0gYXR0ZW1wdHNgKX19ZnVuY3Rpb24gRmEoZSl7Y29uc3Qgcj1uZXcgWE1MSHR0cFJlcXVlc3Q7aWYoci5vcGVuKCJIRUFEIixlLCExKSxyLnNlbmQoKSxyLnN0YXR1cyE9PTIwMCl0aHJvdyBuZXcgRXJyb3IoYGdldEZpbGVTaXplIHJlcXVlc3QgZmFpbGVkOiAke2V9YCk7cmV0dXJuIHBhcnNlSW50KHIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtTGVuZ3RoIikpfWZ1bmN0aW9uIFRhKGUscix0KXtjb25zdCBuPW5ldyBYTUxIdHRwUmVxdWVzdDtpZihuLm9wZW4oIkdFVCIsZSwhMSksbi5zZXRSZXF1ZXN0SGVhZGVyKCJSYW5nZSIsYGJ5dGVzPSR7cn0tJHtyK3QtMX1gKSxuLnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIiLG4uc2VuZCgpLG4uc3RhdHVzIT09MjA2JiZuLnN0YXR1cyE9PTIwMCl0aHJvdyBuZXcgRXJyb3IoYGZldGNoQXJyYXlCdWZmZXIgcmVxdWVzdCBmYWlsZWQ6ICR7ZX1gKTtyZXR1cm4gbi5yZXNwb25zZX1jbGFzcyBwZXtjb25zdHJ1Y3RvcihyKXtsZXQgdDt0eXBlb2Ygcj09InN0cmluZyI/KHQ9bmV3IEZpbGUoW10sZW5jb2RlVVJJQ29tcG9uZW50KHIpKSxvLmZpbGVzeXN0ZW1zLldPUktFUkZTLnN0cmVhbV9vcHMucmVhZD1mdW5jdGlvbihhLGkscyxsLHUpe2NvbnN0IGM9ZGVjb2RlVVJJQ29tcG9uZW50KGEubm9kZS5jb250ZW50cy5uYW1lKTtpZihhLm5vZGUuc2l6ZT09PTAmJihhLm5vZGUuc2l6ZT1hdCgoKT0+RmEoYykpKSx1Pj1hLm5vZGUuc2l6ZSlyZXR1cm4gMDtjb25zdCBkPWF0KCgpPT5UYShjLHUsbCkpLG09ZC5ieXRlTGVuZ3RoO3JldHVybiBpLnNldChuZXcgVWludDhBcnJheShkKSxzKSxtfSk6dD1yLHRoaXMubW91bnRQb2ludD0iL2RhdGEiLHRoaXMubW91bnRPcHRzPXtmaWxlczpbdF19LHRoaXMuZmlsZVBhdGg9dGhpcy5tb3VudFBvaW50KyIvIit0Lm5hbWV9bW91bnQoKXtvLm1rZGlyKHRoaXMubW91bnRQb2ludCksby5tb3VudChvLmZpbGVzeXN0ZW1zLldPUktFUkZTLHRoaXMubW91bnRPcHRzLHRoaXMubW91bnRQb2ludCl9dW5tb3VudCgpe28udW5tb3VudCh0aGlzLm1vdW50UG9pbnQpLG8ucm1kaXIodGhpcy5tb3VudFBvaW50KX19ZnVuY3Rpb24gY3IoZSl7Y29uc3Qgcj1uZXcgVWludDhBcnJheShlLmV4dHJhZGF0YSksdD17aWQ6ZS5pZCxpbmRleDplLmluZGV4LGNvZGVjX3R5cGU6ZS5jb2RlY190eXBlLGNvZGVjX3R5cGVfc3RyaW5nOmUuY29kZWNfdHlwZV9zdHJpbmcsY29kZWNfbmFtZTplLmNvZGVjX25hbWUsY29kZWNfc3RyaW5nOmUuY29kZWNfc3RyaW5nLGNvbG9yX3ByaW1hcmllczplLmNvbG9yX3ByaW1hcmllcyxjb2xvcl90cmFuc2ZlcjplLmNvbG9yX3RyYW5zZmVyLGNvbG9yX3NwYWNlOmUuY29sb3Jfc3BhY2UsY29sb3JfcmFuZ2U6ZS5jb2xvcl9yYW5nZSxwcm9maWxlOmUucHJvZmlsZSxwaXhfZm10OmUucGl4X2ZtdCxsZXZlbDplLmxldmVsLHdpZHRoOmUud2lkdGgsaGVpZ2h0OmUuaGVpZ2h0LGNoYW5uZWxzOmUuY2hhbm5lbHMsc2FtcGxlX3JhdGU6ZS5zYW1wbGVfcmF0ZSxzYW1wbGVfZm10OmUuc2FtcGxlX2ZtdCxiaXRfcmF0ZTplLmJpdF9yYXRlLGV4dHJhZGF0YV9zaXplOmUuZXh0cmFkYXRhX3NpemUsZXh0cmFkYXRhOnIscl9mcmFtZV9yYXRlOmUucl9mcmFtZV9yYXRlLGF2Z19mcmFtZV9yYXRlOmUuYXZnX2ZyYW1lX3JhdGUsc2FtcGxlX2FzcGVjdF9yYXRpbzplLnNhbXBsZV9hc3BlY3RfcmF0aW8sZGlzcGxheV9hc3BlY3RfcmF0aW86ZS5kaXNwbGF5X2FzcGVjdF9yYXRpbyxzdGFydF90aW1lOmUuc3RhcnRfdGltZSxkdXJhdGlvbjplLmR1cmF0aW9uLHJvdGF0aW9uOmUucm90YXRpb24sZmxpcDplLmZsaXAsbmJfZnJhbWVzOmUubmJfZnJhbWVzLHRhZ3M6ZS50YWdzfTtyZXR1cm4gZS5kZWxldGUoKSx0fWZ1bmN0aW9uIGRyKGUpe2NvbnN0IHI9bmV3IFVpbnQ4QXJyYXkoZS5kYXRhKSx0PXtrZXlmcmFtZTplLmtleWZyYW1lLHRpbWVzdGFtcDplLnRpbWVzdGFtcCxkdXJhdGlvbjplLmR1cmF0aW9uLHNpemU6ZS5zaXplLGRhdGE6cn07cmV0dXJuIGUuZGVsZXRlKCksdH1mdW5jdGlvbiBTYShlLHI9MCx0PS0xKXtjb25zdCBuPW5ldyBwZShlKTtuLm1vdW50KCk7dHJ5e2NvbnN0IGE9Zi5nZXRfYXZfc3RyZWFtKG4uZmlsZVBhdGgscix0KTtyZXR1cm4gY3IoYSl9Y2F0Y2goYSl7dGhyb3cgbmV3IEVycm9yKCJnZXRfYXZfc3RyZWFtIGZhaWxlZDogIithLm1lc3NhZ2UpfWZpbmFsbHl7bi51bm1vdW50KCl9fWZ1bmN0aW9uIE1hKGUpe2NvbnN0IHI9bmV3IHBlKGUpO3IubW91bnQoKTt0cnl7Y29uc3QgdD1mLmdldF9hdl9zdHJlYW1zKHIuZmlsZVBhdGgpLG49W107Zm9yKGxldCBhPTA7YTx0LnN0cmVhbXMuc2l6ZSgpO2ErKyluLnB1c2goY3IodC5zdHJlYW1zLmdldChhKSkpO3JldHVybiB0LnN0cmVhbXMuZGVsZXRlKCksbn1jYXRjaCh0KXt0aHJvdyBuZXcgRXJyb3IoImdldF9hdl9zdHJlYW1zIGZhaWxlZDogIit0Lm1lc3NhZ2UpfWZpbmFsbHl7ci51bm1vdW50KCl9fWZ1bmN0aW9uIFJhKGUpe2NvbnN0IHI9bmV3IHBlKGUpO3IubW91bnQoKTt0cnl7Y29uc3QgdD1mLmdldF9tZWRpYV9pbmZvKHIuZmlsZVBhdGgpLG49e2Zvcm1hdF9uYW1lOnQuZm9ybWF0X25hbWUsZHVyYXRpb246dC5kdXJhdGlvbixiaXRfcmF0ZTp0LmJpdF9yYXRlLHN0YXJ0X3RpbWU6dC5zdGFydF90aW1lLG5iX3N0cmVhbXM6dC5uYl9zdHJlYW1zLHN0cmVhbXM6W119O2ZvcihsZXQgYT0wO2E8dC5zdHJlYW1zLnNpemUoKTthKyspbi5zdHJlYW1zLnB1c2goY3IodC5zdHJlYW1zLmdldChhKSkpO3JldHVybiB0LnN0cmVhbXMuZGVsZXRlKCksbn1jYXRjaCh0KXt0aHJvdyBuZXcgRXJyb3IoImdldF9tZWRpYV9pbmZvIGZhaWxlZDogIit0Lm1lc3NhZ2UpfWZpbmFsbHl7ci51bm1vdW50KCl9fWZ1bmN0aW9uIE9hKGUscix0PTAsbj0tMSxhPTEpe2NvbnN0IGk9bmV3IHBlKGUpO2kubW91bnQoKTt0cnl7Y29uc3Qgcz1mLmdldF9hdl9wYWNrZXQoaS5maWxlUGF0aCxyLHQsbixhKTtyZXR1cm4gZHIocyl9Y2F0Y2gocyl7dGhyb3cgbmV3IEVycm9yKCJnZXRfYXZfcGFja2V0IGZhaWxlZDogIitzLm1lc3NhZ2UpfWZpbmFsbHl7aS51bm1vdW50KCl9fWZ1bmN0aW9uIElhKGUscix0PTEpe2NvbnN0IG49bmV3IHBlKGUpO24ubW91bnQoKTt0cnl7Y29uc3QgYT1mLmdldF9hdl9wYWNrZXRzKG4uZmlsZVBhdGgscix0KSxpPVtdO2ZvcihsZXQgcz0wO3M8YS5wYWNrZXRzLnNpemUoKTtzKyspaS5wdXNoKGRyKGEucGFja2V0cy5nZXQocykpKTtyZXR1cm4gYS5wYWNrZXRzLmRlbGV0ZSgpLGl9Y2F0Y2goYSl7dGhyb3cgbmV3IEVycm9yKCJnZXRfYXZfcGFja2V0cyBmYWlsZWQ6ICIrYS5tZXNzYWdlKX1maW5hbGx5e24udW5tb3VudCgpfX1hc3luYyBmdW5jdGlvbiBMYShlLHIsdD0wLG49MCxhPTAsaT0tMSxzPTEpe2NvbnN0IGw9bmV3IHBlKHIpO2wubW91bnQoKTtsZXQgdT1udWxsO3RyeXtpZih1PWYuQVZQYWNrZXRSZWFkZXIuY3JlYXRlKGwuZmlsZVBhdGgsdCxuLGEsaSxzKSwhdSl0aHJvdyBuZXcgRXJyb3IoIkFWUGFja2V0UmVhZGVyLmNyZWF0ZSBmYWlsZWQgKG51bGwgcmVhZGVyKSIpO2NvbnN0IGM9VmEoZSk7Zm9yKDs7KXtjb25zdCBkPXUucmVhZF9uZXh0X2F2X3BhY2tldCgpO2lmKHUuaGFzX2Vycm9yKCkpdGhyb3cgbmV3IEVycm9yKCJBVlBhY2tldFJlYWRlciByZWFkX25leHRfYXZfcGFja2V0IGVycm9yIik7aWYodS5pc19maW5pc2hlZCgpKXthd2FpdCBjKDApO2JyZWFrfWlmKGF3YWl0IGMoZCk9PT0wKWJyZWFrfX1jYXRjaChjKXt0aHJvdyBuZXcgRXJyb3IoInJlYWRBVlBhY2tldCBwaXBlbGluZSBmYWlsZWQ6ICIrYy5tZXNzYWdlKX1maW5hbGx5e3UmJnUuZGVsZXRlKCksbC51bm1vdW50KCl9cmV0dXJuIDF9ZnVuY3Rpb24gVmEoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBuZXcgUHJvbWlzZShuPT57Y29uc3QgYT17dHlwZToiQVZQYWNrZXRTdHJlYW0iLG1zZ0lkOmUscmVzdWx0Om51bGx9O2lmKHQ9PT0wKXtzZWxmLnBvc3RNZXNzYWdlKGEpLG4oMSk7cmV0dXJufWNvbnN0IGk9ZHIodCk7YS5yZXN1bHQ9aSxzZWxmLnBvc3RNZXNzYWdlKGEsW2kuZGF0YS5idWZmZXJdKTtjb25zdCBzPWw9Pntjb25zdHt0eXBlOnUsbXNnSWQ6Y309bC5kYXRhO2M9PT1lJiYodT09PSJSZWFkTmV4dEFWUGFja2V0Ij8oc2VsZi5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixzKSxuKDEpKTp1PT09IlN0b3BSZWFkQVZQYWNrZXQiJiYoc2VsZi5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixzKSxuKDApKSl9O3NlbGYuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIscyl9KX19ZnVuY3Rpb24gVWEoZSl7bnQ9ZSxmLnNldF9hdl9sb2dfbGV2ZWwoZSl9cmV0dXJuIGYuZ2V0QVZTdHJlYW09U2EsZi5nZXRBVlN0cmVhbXM9TWEsZi5nZXRNZWRpYUluZm89UmEsZi5nZXRBVlBhY2tldD1PYSxmLmdldEFWUGFja2V0cz1JYSxmLnJlYWRBVlBhY2tldD1MYSxmLnNldEFWTG9nTGV2ZWw9VWEsQz1uZSxDfX0pKCk7bGV0IFE7c2VsZi5wb3N0TWVzc2FnZSh7dHlwZTpHLldhc21Xb3JrZXJMb2FkZWR9KSxzZWxmLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGFzeW5jIGZ1bmN0aW9uKEUpe2NvbnN0e3R5cGU6UixkYXRhOkMsbXNnSWQ6Zn09RS5kYXRhO3RyeXtzd2l0Y2goUil7Y2FzZSJMb2FkV0FTTSI6cmV0dXJuIGF3YWl0IHN0KEMpO2Nhc2UiR2V0QVZTdHJlYW0iOnJldHVybiBsdChDLGYpO2Nhc2UiR2V0QVZTdHJlYW1zIjpyZXR1cm4gdXQoQyxmKTtjYXNlIkdldE1lZGlhSW5mbyI6cmV0dXJuIGZ0KEMsZik7Y2FzZSJHZXRBVlBhY2tldCI6cmV0dXJuIGN0KEMsZik7Y2FzZSJHZXRBVlBhY2tldHMiOnJldHVybiBkdChDLGYpO2Nhc2UiUmVhZEFWUGFja2V0IjpyZXR1cm4gYXdhaXQgdnQoQyxmKTtjYXNlIlNldEFWTG9nTGV2ZWwiOnJldHVybiBodChDLGYpO2RlZmF1bHQ6cmV0dXJufX1jYXRjaChVKXtzZWxmLnBvc3RNZXNzYWdlKHt0eXBlOlIsbXNnSWQ6ZixlcnJNc2c6VSBpbnN0YW5jZW9mIEVycm9yP1UubWVzc2FnZToiVW5rbm93biBFcnJvciJ9KX19KTthc3luYyBmdW5jdGlvbiBzdChFKXtjb25zdHt3YXNtRmlsZVBhdGg6Un09RXx8e307UT1hd2FpdCBpdCh7bG9jYXRlRmlsZTooQyxmKT0+Qy5lbmRzV2l0aCgiLndhc20iKSYmUj9SOmYrQyxvblJ1bnRpbWVJbml0aWFsaXplZDooKT0+e3NlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6Ry5XQVNNUnVudGltZUluaXRpYWxpemVkfSl9fSl9ZnVuY3Rpb24gbHQoRSxSKXtjb25zdHtzb3VyY2U6QyxzdHJlYW1UeXBlOmYsc3RyZWFtSW5kZXg6VX09RSxIPVEuZ2V0QVZTdHJlYW0oQyxmLFUpO3NlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6Ry5HZXRBVlN0cmVhbSxtc2dJZDpSLHJlc3VsdDpIfSxbSC5leHRyYWRhdGEuYnVmZmVyXSl9ZnVuY3Rpb24gdXQoRSxSKXtjb25zdHtzb3VyY2U6Q309RSxmPVEuZ2V0QVZTdHJlYW1zKEMpO3NlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6Ry5HZXRBVlN0cmVhbXMsbXNnSWQ6UixyZXN1bHQ6Zn0sZi5tYXAoVT0+VS5leHRyYWRhdGEuYnVmZmVyKSl9ZnVuY3Rpb24gZnQoRSxSKXtjb25zdHtzb3VyY2U6Q309RSxmPVEuZ2V0TWVkaWFJbmZvKEMpO3NlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6Ry5HZXRNZWRpYUluZm8sbXNnSWQ6UixyZXN1bHQ6Zn0sZi5zdHJlYW1zLm1hcChVPT5VLmV4dHJhZGF0YS5idWZmZXIpKX1mdW5jdGlvbiBjdChFLFIpe2NvbnN0e3NvdXJjZTpDLHRpbWU6ZixzdHJlYW1UeXBlOlUsc3RyZWFtSW5kZXg6SCxzZWVrRmxhZzpuZX09RSxhZT1RLmdldEFWUGFja2V0KEMsZixVLEgsbmUpO3NlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6Ry5HZXRBVlBhY2tldCxtc2dJZDpSLHJlc3VsdDphZX0sW2FlLmRhdGEuYnVmZmVyXSl9ZnVuY3Rpb24gZHQoRSxSKXtjb25zdHtzb3VyY2U6Qyx0aW1lOmYsc2Vla0ZsYWc6VX09RSxIPVEuZ2V0QVZQYWNrZXRzKEMsZixVKTtzZWxmLnBvc3RNZXNzYWdlKHt0eXBlOkcuR2V0QVZQYWNrZXRzLG1zZ0lkOlIscmVzdWx0Okh9LEgubWFwKG5lPT5uZS5kYXRhLmJ1ZmZlcikpfWFzeW5jIGZ1bmN0aW9uIHZ0KEUsUil7Y29uc3R7c291cmNlOkMsc3RhcnQ6ZixlbmQ6VSxzdHJlYW1UeXBlOkgsc3RyZWFtSW5kZXg6bmUsc2Vla0ZsYWc6YWV9PUUsRGU9YXdhaXQgUS5yZWFkQVZQYWNrZXQoUixDLGYsVSxILG5lLGFlKTtzZWxmLnBvc3RNZXNzYWdlKHt0eXBlOkcuUmVhZEFWUGFja2V0LG1zZ0lkOlIscmVzdWx0OkRlfSl9ZnVuY3Rpb24gaHQoRSxSKXtjb25zdHtsZXZlbDpDfT1FO1Euc2V0QVZMb2dMZXZlbChDKSxzZWxmLnBvc3RNZXNzYWdlKHt0eXBlOiJTZXRBVkxvZ0xldmVsIixtc2dJZDpSfSl9fSkoKTsK", Xa = (t) => Uint8Array.from(atob(t), (e) => e.charCodeAt(0)), Ks = typeof window < "u" && window.Blob && new Blob([Xa(hn)], {
|
|
10212
10244
|
type: "text/javascript;charset=utf-8"
|
|
10213
10245
|
});
|
|
10214
|
-
function
|
|
10246
|
+
function _a(t) {
|
|
10215
10247
|
let e;
|
|
10216
10248
|
try {
|
|
10217
10249
|
if (e = Ks && (window.URL || window.webkitURL).createObjectURL(Ks), !e)
|
|
@@ -10223,7 +10255,7 @@ function Xa(t) {
|
|
|
10223
10255
|
(window.URL || window.webkitURL).revokeObjectURL(e);
|
|
10224
10256
|
}), i;
|
|
10225
10257
|
} catch {
|
|
10226
|
-
return new Worker("data:text/javascript;base64," +
|
|
10258
|
+
return new Worker("data:text/javascript;base64," + hn, {
|
|
10227
10259
|
name: t == null ? void 0 : t.name
|
|
10228
10260
|
});
|
|
10229
10261
|
} finally {
|
|
@@ -10233,7 +10265,7 @@ function Xa(t) {
|
|
|
10233
10265
|
const Ms = 1e6;
|
|
10234
10266
|
class fi {
|
|
10235
10267
|
constructor(e) {
|
|
10236
|
-
oi(this, "wasmWorker"), oi(this, "wasmWorkerLoadStatus"), oi(this, "msgId"), oi(this, "source"), this.wasmWorker = new
|
|
10268
|
+
oi(this, "wasmWorker"), oi(this, "wasmWorkerLoadStatus"), oi(this, "msgId"), oi(this, "source"), this.wasmWorker = new _a({
|
|
10237
10269
|
name: "web-demuxer"
|
|
10238
10270
|
}), this.wasmWorkerLoadStatus = new Promise((i, n) => {
|
|
10239
10271
|
this.wasmWorker.addEventListener("message", (d) => {
|
|
@@ -10262,9 +10294,9 @@ class fi {
|
|
|
10262
10294
|
}
|
|
10263
10295
|
const o = this.msgId, m = (h) => {
|
|
10264
10296
|
let {
|
|
10265
|
-
data:
|
|
10297
|
+
data: S
|
|
10266
10298
|
} = h;
|
|
10267
|
-
|
|
10299
|
+
S.type === e && S.msgId === o && (S.errMsg ? d(S.errMsg) : n(S.result), this.wasmWorker.removeEventListener("message", m));
|
|
10268
10300
|
};
|
|
10269
10301
|
this.wasmWorker.addEventListener("message", m), this.post(e, i, o);
|
|
10270
10302
|
});
|
|
@@ -10363,7 +10395,7 @@ class fi {
|
|
|
10363
10395
|
const m = new CountQueuingStrategy({
|
|
10364
10396
|
highWaterMark: 1
|
|
10365
10397
|
}), h = this.msgId;
|
|
10366
|
-
let
|
|
10398
|
+
let S = 0, W, v;
|
|
10367
10399
|
return new ReadableStream({
|
|
10368
10400
|
start: (Z) => {
|
|
10369
10401
|
if (!this.source) {
|
|
@@ -10383,7 +10415,7 @@ class fi {
|
|
|
10383
10415
|
});
|
|
10384
10416
|
},
|
|
10385
10417
|
pull: () => {
|
|
10386
|
-
|
|
10418
|
+
S > 0 && this.post(rt.ReadNextAVPacket, void 0, h), S++;
|
|
10387
10419
|
},
|
|
10388
10420
|
cancel: () => new Promise((Z) => {
|
|
10389
10421
|
v = Z, this.post(rt.StopReadAVPacket, void 0, h);
|
|
@@ -10509,7 +10541,7 @@ function Zi() {
|
|
|
10509
10541
|
"⚠️ Demo/Learning Function: This utility is intended for demos and learning purposes only. For production use, please use a proper demuxing library like MediaBunny (https://mediabunny.dev/) or web-demuxer (https://github.com/bilibili/web-demuxer) directly."
|
|
10510
10542
|
), ks = !0);
|
|
10511
10543
|
}
|
|
10512
|
-
async function
|
|
10544
|
+
async function x1(t) {
|
|
10513
10545
|
Zi();
|
|
10514
10546
|
const e = new fi({
|
|
10515
10547
|
wasmFilePath: "https://cdn.jsdelivr.net/npm/web-demuxer@latest/dist/wasm-files/web-demuxer.wasm"
|
|
@@ -10518,12 +10550,12 @@ async function W1(t) {
|
|
|
10518
10550
|
const i = e.read("video", 0).getReader(), n = [];
|
|
10519
10551
|
return new Promise(function(d) {
|
|
10520
10552
|
i.read().then(async function o(m) {
|
|
10521
|
-
const { done: h, value:
|
|
10522
|
-
return
|
|
10553
|
+
const { done: h, value: S } = m;
|
|
10554
|
+
return S && n.push(S), h ? d(n) : i.read().then(o);
|
|
10523
10555
|
});
|
|
10524
10556
|
});
|
|
10525
10557
|
}
|
|
10526
|
-
async function
|
|
10558
|
+
async function H1(t) {
|
|
10527
10559
|
Zi();
|
|
10528
10560
|
const e = new fi({
|
|
10529
10561
|
wasmFilePath: "https://cdn.jsdelivr.net/npm/web-demuxer@latest/dist/wasm-files/web-demuxer.wasm"
|
|
@@ -10531,9 +10563,9 @@ async function L1(t) {
|
|
|
10531
10563
|
await e.load(t);
|
|
10532
10564
|
const i = e.read("audio", 0).getReader(), n = [];
|
|
10533
10565
|
await new Promise(function(h) {
|
|
10534
|
-
i.read().then(async function
|
|
10566
|
+
i.read().then(async function S(W) {
|
|
10535
10567
|
const { done: v, value: Z } = W;
|
|
10536
|
-
return Z && n.push(Z), v ? h(n) : i.read().then(
|
|
10568
|
+
return Z && n.push(Z), v ? h(n) : i.read().then(S);
|
|
10537
10569
|
});
|
|
10538
10570
|
});
|
|
10539
10571
|
const o = (await e.getMediaInfo()).streams.filter((h) => h.codec_type_string === "audio")[0], m = {
|
|
@@ -10546,7 +10578,7 @@ async function L1(t) {
|
|
|
10546
10578
|
config: m
|
|
10547
10579
|
};
|
|
10548
10580
|
}
|
|
10549
|
-
async function
|
|
10581
|
+
async function Y1(t) {
|
|
10550
10582
|
Zi();
|
|
10551
10583
|
const e = new fi({
|
|
10552
10584
|
wasmFilePath: "https://cdn.jsdelivr.net/npm/web-demuxer@latest/dist/wasm-files/web-demuxer.wasm"
|
|
@@ -10554,9 +10586,9 @@ async function x1(t) {
|
|
|
10554
10586
|
await e.load(t);
|
|
10555
10587
|
const i = e.read("video", 0).getReader(), n = [];
|
|
10556
10588
|
await new Promise(function(h) {
|
|
10557
|
-
i.read().then(async function
|
|
10589
|
+
i.read().then(async function S(W) {
|
|
10558
10590
|
const { done: v, value: Z } = W;
|
|
10559
|
-
return Z && n.push(Z), v ? h(n) : i.read().then(
|
|
10591
|
+
return Z && n.push(Z), v ? h(n) : i.read().then(S);
|
|
10560
10592
|
});
|
|
10561
10593
|
});
|
|
10562
10594
|
const o = (await e.getMediaInfo()).streams.filter((h) => h.codec_type_string === "video")[0], m = {
|
|
@@ -10570,7 +10602,7 @@ async function x1(t) {
|
|
|
10570
10602
|
config: m
|
|
10571
10603
|
};
|
|
10572
10604
|
}
|
|
10573
|
-
async function
|
|
10605
|
+
async function w1(t) {
|
|
10574
10606
|
Zi();
|
|
10575
10607
|
const e = new fi({
|
|
10576
10608
|
wasmFilePath: "https://cdn.jsdelivr.net/npm/web-demuxer@latest/dist/wasm-files/web-demuxer.wasm"
|
|
@@ -10579,8 +10611,8 @@ async function H1(t) {
|
|
|
10579
10611
|
const i = e.read("audio", 0).getReader(), n = [];
|
|
10580
10612
|
return new Promise(function(d) {
|
|
10581
10613
|
i.read().then(async function o(m) {
|
|
10582
|
-
const { done: h, value:
|
|
10583
|
-
return
|
|
10614
|
+
const { done: h, value: S } = m;
|
|
10615
|
+
return S && n.push(S), h ? d(n) : i.read().then(o);
|
|
10584
10616
|
});
|
|
10585
10617
|
});
|
|
10586
10618
|
}
|
|
@@ -10652,7 +10684,7 @@ const ye = (t) => {
|
|
|
10652
10684
|
}, s0 = (t) => {
|
|
10653
10685
|
const e = ye(t);
|
|
10654
10686
|
return e & 1 ? e + 1 >> 1 : -(e >> 1);
|
|
10655
|
-
}, Q0 = (t) => t.constructor === Uint8Array ? t : ArrayBuffer.isView(t) ? new Uint8Array(t.buffer, t.byteOffset, t.byteLength) : new Uint8Array(t),
|
|
10687
|
+
}, Q0 = (t) => t.constructor === Uint8Array ? t : ArrayBuffer.isView(t) ? new Uint8Array(t.buffer, t.byteOffset, t.byteLength) : new Uint8Array(t), Sa = (t) => t.constructor === DataView ? t : ArrayBuffer.isView(t) ? new DataView(t.buffer, t.byteOffset, t.byteLength) : new DataView(t), $t = /* @__PURE__ */ new TextEncoder(), $i = {
|
|
10656
10688
|
bt709: 1,
|
|
10657
10689
|
// ITU-R BT.709
|
|
10658
10690
|
bt470bg: 5,
|
|
@@ -10687,8 +10719,8 @@ const ye = (t) => {
|
|
|
10687
10719
|
// SMPTE 170M
|
|
10688
10720
|
"bt2020-ncl": 9
|
|
10689
10721
|
// ITU-R BT.2020-2 (non-constant luminance)
|
|
10690
|
-
}, Ga = (t) => !!t && !!t.primaries && !!t.transfer && !!t.matrix && t.fullRange !== void 0,
|
|
10691
|
-
class
|
|
10722
|
+
}, Ga = (t) => !!t && !!t.primaries && !!t.transfer && !!t.matrix && t.fullRange !== void 0, bn = (t) => t instanceof ArrayBuffer || typeof SharedArrayBuffer < "u" && t instanceof SharedArrayBuffer || ArrayBuffer.isView(t);
|
|
10723
|
+
class pn {
|
|
10692
10724
|
constructor() {
|
|
10693
10725
|
this.currentPromise = Promise.resolve();
|
|
10694
10726
|
}
|
|
@@ -10700,34 +10732,34 @@ class bn {
|
|
|
10700
10732
|
return this.currentPromise = i, await n, e;
|
|
10701
10733
|
}
|
|
10702
10734
|
}
|
|
10703
|
-
const
|
|
10735
|
+
const va = () => {
|
|
10704
10736
|
let t, e;
|
|
10705
10737
|
return { promise: new Promise((n, d) => {
|
|
10706
10738
|
t = n, e = d;
|
|
10707
10739
|
}), resolve: t, reject: e };
|
|
10708
|
-
},
|
|
10740
|
+
}, yn = (t) => {
|
|
10709
10741
|
throw new Error(`Unexpected value: ${t}`);
|
|
10710
|
-
},
|
|
10742
|
+
}, Ia = (t, e, i, n) => {
|
|
10711
10743
|
i = i >>> 0, i = i & 16777215, t.setUint8(e, i >>> 16 & 255), t.setUint8(e + 1, i >>> 8 & 255), t.setUint8(e + 2, i & 255);
|
|
10712
|
-
},
|
|
10744
|
+
}, Va = "und", Ra = /^[a-z]{3}$/, Ta = (t) => Ra.test(t), Bs = 1e6 * (1 + Number.EPSILON), Wa = (t, e) => {
|
|
10713
10745
|
const i = t < 0 ? -1 : 1;
|
|
10714
10746
|
t = Math.abs(t);
|
|
10715
10747
|
let n = 0, d = 1, o = 1, m = 0, h = t;
|
|
10716
10748
|
for (; ; ) {
|
|
10717
|
-
const
|
|
10749
|
+
const S = Math.floor(h), W = S * o + n, v = S * m + d;
|
|
10718
10750
|
if (v > e)
|
|
10719
10751
|
return {
|
|
10720
10752
|
numerator: i * o,
|
|
10721
10753
|
denominator: m
|
|
10722
10754
|
};
|
|
10723
|
-
if (n = o, d = m, o = W, m = v, h = 1 / (h -
|
|
10755
|
+
if (n = o, d = m, o = W, m = v, h = 1 / (h - S), !isFinite(h))
|
|
10724
10756
|
break;
|
|
10725
10757
|
}
|
|
10726
10758
|
return {
|
|
10727
10759
|
numerator: i * o,
|
|
10728
10760
|
denominator: m
|
|
10729
10761
|
};
|
|
10730
|
-
},
|
|
10762
|
+
}, fn = function* (t) {
|
|
10731
10763
|
for (const e in t) {
|
|
10732
10764
|
const i = t[e];
|
|
10733
10765
|
i !== void 0 && (yield { key: e, value: i });
|
|
@@ -10740,7 +10772,7 @@ const Sa = () => {
|
|
|
10740
10772
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
10741
10773
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
10742
10774
|
*/
|
|
10743
|
-
class
|
|
10775
|
+
class Zn {
|
|
10744
10776
|
/** Creates a new {@link RichImageData}. */
|
|
10745
10777
|
constructor(e, i) {
|
|
10746
10778
|
if (this.data = e, this.mimeType = i, !(e instanceof Uint8Array))
|
|
@@ -10749,7 +10781,7 @@ class fn {
|
|
|
10749
10781
|
throw new TypeError("mimeType must be a string.");
|
|
10750
10782
|
}
|
|
10751
10783
|
}
|
|
10752
|
-
class
|
|
10784
|
+
class La {
|
|
10753
10785
|
/** Creates a new {@link AttachedFile}. */
|
|
10754
10786
|
constructor(e, i, n, d) {
|
|
10755
10787
|
if (this.data = e, this.mimeType = i, this.name = n, this.description = d, !(e instanceof Uint8Array))
|
|
@@ -10762,7 +10794,7 @@ class Wa {
|
|
|
10762
10794
|
throw new TypeError("description, when provided, must be a string.");
|
|
10763
10795
|
}
|
|
10764
10796
|
}
|
|
10765
|
-
const
|
|
10797
|
+
const xa = (t) => {
|
|
10766
10798
|
if (!t || typeof t != "object")
|
|
10767
10799
|
throw new TypeError("tags must be an object.");
|
|
10768
10800
|
if (t.title !== void 0 && typeof t.title != "string")
|
|
@@ -10809,10 +10841,10 @@ const La = (t) => {
|
|
|
10809
10841
|
if (!t.raw || typeof t.raw != "object")
|
|
10810
10842
|
throw new TypeError("tags.raw, when provided, must be an object.");
|
|
10811
10843
|
for (const e of Object.values(t.raw))
|
|
10812
|
-
if (e !== null && typeof e != "string" && !(e instanceof Uint8Array) && !(e instanceof
|
|
10844
|
+
if (e !== null && typeof e != "string" && !(e instanceof Uint8Array) && !(e instanceof Zn) && !(e instanceof La))
|
|
10813
10845
|
throw new TypeError("Each value in tags.raw must be a string, Uint8Array, RichImageData, AttachedFile, or null.");
|
|
10814
10846
|
}
|
|
10815
|
-
},
|
|
10847
|
+
}, Ha = (t) => {
|
|
10816
10848
|
if (!t || typeof t != "object")
|
|
10817
10849
|
throw new TypeError("disposition must be an object.");
|
|
10818
10850
|
if (t.default !== void 0 && typeof t.default != "boolean")
|
|
@@ -10857,32 +10889,32 @@ const O0 = [
|
|
|
10857
10889
|
"pcm-s8",
|
|
10858
10890
|
"ulaw",
|
|
10859
10891
|
"alaw"
|
|
10860
|
-
],
|
|
10892
|
+
], Xn = [
|
|
10861
10893
|
"aac",
|
|
10862
10894
|
"opus",
|
|
10863
10895
|
"mp3",
|
|
10864
10896
|
"vorbis",
|
|
10865
10897
|
"flac"
|
|
10866
10898
|
], ui = [
|
|
10867
|
-
...
|
|
10899
|
+
...Xn,
|
|
10868
10900
|
...k0
|
|
10869
10901
|
], hi = [
|
|
10870
10902
|
"webvtt"
|
|
10871
|
-
],
|
|
10872
|
-
const e = t.split("."), d = (1 << 7) + 1, o = Number(e[1]), m = e[2], h = Number(m.slice(0, -1)),
|
|
10873
|
-
return [d,
|
|
10874
|
-
},
|
|
10903
|
+
], Ya = (t) => {
|
|
10904
|
+
const e = t.split("."), d = (1 << 7) + 1, o = Number(e[1]), m = e[2], h = Number(m.slice(0, -1)), S = (o << 5) + h, W = m.slice(-1) === "H" ? 1 : 0, Z = Number(e[3]) === 8 ? 0 : 1, O = 0, w = e[4] ? Number(e[4]) : 0, N = e[5] ? Number(e[5][0]) : 1, J = e[5] ? Number(e[5][1]) : 1, U = e[5] ? Number(e[5][2]) : 0, k = (W << 7) + (Z << 6) + (O << 5) + (w << 4) + (N << 3) + (J << 2) + U;
|
|
10905
|
+
return [d, S, k, 0];
|
|
10906
|
+
}, wa = /^pcm-([usf])(\d+)+(be)?$/, D0 = (t) => {
|
|
10875
10907
|
if (ve(k0.includes(t)), t === "ulaw")
|
|
10876
10908
|
return { dataType: "ulaw", sampleSize: 1, littleEndian: !0, silentValue: 255 };
|
|
10877
10909
|
if (t === "alaw")
|
|
10878
10910
|
return { dataType: "alaw", sampleSize: 1, littleEndian: !0, silentValue: 213 };
|
|
10879
|
-
const e =
|
|
10911
|
+
const e = wa.exec(t);
|
|
10880
10912
|
ve(e);
|
|
10881
10913
|
let i;
|
|
10882
10914
|
e[1] === "u" ? i = "unsigned" : e[1] === "s" ? i = "signed" : i = "float";
|
|
10883
10915
|
const n = Number(e[2]) / 8, d = e[3] !== "be", o = t === "pcm-u8" ? 2 ** 7 : 0;
|
|
10884
10916
|
return { dataType: i, sampleSize: n, littleEndian: d, silentValue: o };
|
|
10885
|
-
},
|
|
10917
|
+
}, Ka = ["avc1", "avc3", "hev1", "hvc1", "vp8", "vp09", "av01"], Ma = /^(avc1|avc3)\.[0-9a-fA-F]{6}$/, ka = /^(hev1|hvc1)\.(?:[ABC]?\d+)\.[0-9a-fA-F]{1,8}\.[LH]\d+(?:\.[0-9a-fA-F]{1,2}){0,6}$/, Ba = /^vp09(?:\.\d{2}){3}(?:(?:\.\d{2}){5})?$/, Ca = /^av01\.\d\.\d{2}[MH]\.\d{2}(?:\.\d\.\d{3}\.\d{2}\.\d{2}\.\d{2}\.\d)?$/, ga = (t) => {
|
|
10886
10918
|
if (!t)
|
|
10887
10919
|
throw new TypeError("Video chunk metadata must be provided.");
|
|
10888
10920
|
if (typeof t != "object")
|
|
@@ -10893,13 +10925,13 @@ const O0 = [
|
|
|
10893
10925
|
throw new TypeError("Video chunk metadata decoder configuration must be an object.");
|
|
10894
10926
|
if (typeof t.decoderConfig.codec != "string")
|
|
10895
10927
|
throw new TypeError("Video chunk metadata decoder configuration must specify a codec string.");
|
|
10896
|
-
if (!
|
|
10928
|
+
if (!Ka.some((e) => t.decoderConfig.codec.startsWith(e)))
|
|
10897
10929
|
throw new TypeError("Video chunk metadata decoder configuration codec string must be a valid video codec string as specified in the WebCodecs Codec Registry.");
|
|
10898
10930
|
if (!Number.isInteger(t.decoderConfig.codedWidth) || t.decoderConfig.codedWidth <= 0)
|
|
10899
10931
|
throw new TypeError("Video chunk metadata decoder configuration must specify a valid codedWidth (positive integer).");
|
|
10900
10932
|
if (!Number.isInteger(t.decoderConfig.codedHeight) || t.decoderConfig.codedHeight <= 0)
|
|
10901
10933
|
throw new TypeError("Video chunk metadata decoder configuration must specify a valid codedHeight (positive integer).");
|
|
10902
|
-
if (t.decoderConfig.description !== void 0 && !
|
|
10934
|
+
if (t.decoderConfig.description !== void 0 && !bn(t.decoderConfig.description))
|
|
10903
10935
|
throw new TypeError("Video chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an ArrayBuffer view.");
|
|
10904
10936
|
if (t.decoderConfig.colorSpace !== void 0) {
|
|
10905
10937
|
const { colorSpace: e } = t.decoderConfig;
|
|
@@ -10918,20 +10950,20 @@ const O0 = [
|
|
|
10918
10950
|
throw new TypeError("Video chunk metadata decoder configuration colorSpace fullRange, when defined, must be a boolean.");
|
|
10919
10951
|
}
|
|
10920
10952
|
if (t.decoderConfig.codec.startsWith("avc1") || t.decoderConfig.codec.startsWith("avc3")) {
|
|
10921
|
-
if (!
|
|
10953
|
+
if (!Ma.test(t.decoderConfig.codec))
|
|
10922
10954
|
throw new TypeError("Video chunk metadata decoder configuration codec string for AVC must be a valid AVC codec string as specified in Section 3.4 of RFC 6381.");
|
|
10923
10955
|
} else if (t.decoderConfig.codec.startsWith("hev1") || t.decoderConfig.codec.startsWith("hvc1")) {
|
|
10924
|
-
if (!
|
|
10956
|
+
if (!ka.test(t.decoderConfig.codec))
|
|
10925
10957
|
throw new TypeError("Video chunk metadata decoder configuration codec string for HEVC must be a valid HEVC codec string as specified in Section E.3 of ISO 14496-15.");
|
|
10926
10958
|
} else if (t.decoderConfig.codec.startsWith("vp8")) {
|
|
10927
10959
|
if (t.decoderConfig.codec !== "vp8")
|
|
10928
10960
|
throw new TypeError('Video chunk metadata decoder configuration codec string for VP8 must be "vp8".');
|
|
10929
10961
|
} else if (t.decoderConfig.codec.startsWith("vp09")) {
|
|
10930
|
-
if (!
|
|
10962
|
+
if (!Ba.test(t.decoderConfig.codec))
|
|
10931
10963
|
throw new TypeError('Video chunk metadata decoder configuration codec string for VP9 must be a valid VP9 codec string as specified in Section "Codecs Parameter String" of https://www.webmproject.org/vp9/mp4/.');
|
|
10932
|
-
} else if (t.decoderConfig.codec.startsWith("av01") && !
|
|
10964
|
+
} else if (t.decoderConfig.codec.startsWith("av01") && !Ca.test(t.decoderConfig.codec))
|
|
10933
10965
|
throw new TypeError('Video chunk metadata decoder configuration codec string for AV1 must be a valid AV1 codec string as specified in Section "Codecs Parameter String" of https://aomediacodec.github.io/av1-isobmff/.');
|
|
10934
|
-
},
|
|
10966
|
+
}, Fa = ["mp4a", "mp3", "opus", "vorbis", "flac", "ulaw", "alaw", "pcm"], Ja = (t) => {
|
|
10935
10967
|
if (!t)
|
|
10936
10968
|
throw new TypeError("Audio chunk metadata must be provided.");
|
|
10937
10969
|
if (typeof t != "object")
|
|
@@ -10942,13 +10974,13 @@ const O0 = [
|
|
|
10942
10974
|
throw new TypeError("Audio chunk metadata decoder configuration must be an object.");
|
|
10943
10975
|
if (typeof t.decoderConfig.codec != "string")
|
|
10944
10976
|
throw new TypeError("Audio chunk metadata decoder configuration must specify a codec string.");
|
|
10945
|
-
if (!
|
|
10977
|
+
if (!Fa.some((e) => t.decoderConfig.codec.startsWith(e)))
|
|
10946
10978
|
throw new TypeError("Audio chunk metadata decoder configuration codec string must be a valid audio codec string as specified in the WebCodecs Codec Registry.");
|
|
10947
10979
|
if (!Number.isInteger(t.decoderConfig.sampleRate) || t.decoderConfig.sampleRate <= 0)
|
|
10948
10980
|
throw new TypeError("Audio chunk metadata decoder configuration must specify a valid sampleRate (positive integer).");
|
|
10949
10981
|
if (!Number.isInteger(t.decoderConfig.numberOfChannels) || t.decoderConfig.numberOfChannels <= 0)
|
|
10950
10982
|
throw new TypeError("Audio chunk metadata decoder configuration must specify a valid numberOfChannels (positive integer).");
|
|
10951
|
-
if (t.decoderConfig.description !== void 0 && !
|
|
10983
|
+
if (t.decoderConfig.description !== void 0 && !bn(t.decoderConfig.description))
|
|
10952
10984
|
throw new TypeError("Audio chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an ArrayBuffer view.");
|
|
10953
10985
|
if (t.decoderConfig.codec.startsWith("mp4a") && t.decoderConfig.codec !== "mp4a.69" && t.decoderConfig.codec !== "mp4a.6B" && t.decoderConfig.codec !== "mp4a.6b") {
|
|
10954
10986
|
if (!["mp4a.40.2", "mp4a.40.02", "mp4a.40.5", "mp4a.40.05", "mp4a.40.29", "mp4a.67"].includes(t.decoderConfig.codec))
|
|
@@ -10975,7 +11007,7 @@ const O0 = [
|
|
|
10975
11007
|
throw new TypeError("Audio chunk metadata decoder configuration for FLAC must include a description, which is expected to adhere to the format described in https://www.w3.org/TR/webcodecs-flac-codec-registration/.");
|
|
10976
11008
|
} else if ((t.decoderConfig.codec.startsWith("pcm") || t.decoderConfig.codec.startsWith("ulaw") || t.decoderConfig.codec.startsWith("alaw")) && !k0.includes(t.decoderConfig.codec))
|
|
10977
11009
|
throw new TypeError(`Audio chunk metadata decoder configuration codec string for PCM must be one of the supported PCM codecs (${k0.join(", ")}).`);
|
|
10978
|
-
},
|
|
11010
|
+
}, Ea = (t) => {
|
|
10979
11011
|
if (!t)
|
|
10980
11012
|
throw new TypeError("Subtitle metadata must be provided.");
|
|
10981
11013
|
if (typeof t != "object")
|
|
@@ -10994,9 +11026,9 @@ const O0 = [
|
|
|
10994
11026
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
10995
11027
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
10996
11028
|
*/
|
|
10997
|
-
class
|
|
11029
|
+
class Na {
|
|
10998
11030
|
constructor(e) {
|
|
10999
|
-
this.mutex = new
|
|
11031
|
+
this.mutex = new pn(), this.firstMediaStreamTimestamp = null, this.trackTimestampInfo = /* @__PURE__ */ new WeakMap(), this.output = e;
|
|
11000
11032
|
}
|
|
11001
11033
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
11002
11034
|
onTrackClose(e) {
|
|
@@ -11067,7 +11099,7 @@ const ts = (t) => {
|
|
|
11067
11099
|
for (let n = 0; n < i; n++)
|
|
11068
11100
|
n + 2 < i && t[n] === 0 && t[n + 1] === 0 && t[n + 2] === 3 ? (e.push(0, 0), n += 2) : e.push(t[n]);
|
|
11069
11101
|
return new Uint8Array(e);
|
|
11070
|
-
},
|
|
11102
|
+
}, Pa = (t, e) => {
|
|
11071
11103
|
const i = t.reduce((o, m) => o + e + m.byteLength, 0), n = new Uint8Array(i);
|
|
11072
11104
|
let d = 0;
|
|
11073
11105
|
for (const o of t) {
|
|
@@ -11080,7 +11112,7 @@ const ts = (t) => {
|
|
|
11080
11112
|
m.setUint16(d, o.byteLength, !1);
|
|
11081
11113
|
break;
|
|
11082
11114
|
case 3:
|
|
11083
|
-
|
|
11115
|
+
Ia(m, d, o.byteLength);
|
|
11084
11116
|
break;
|
|
11085
11117
|
case 4:
|
|
11086
11118
|
m.setUint32(d, o.byteLength, !1);
|
|
@@ -11089,12 +11121,12 @@ const ts = (t) => {
|
|
|
11089
11121
|
d += e, n.set(o, d), d += o.byteLength;
|
|
11090
11122
|
}
|
|
11091
11123
|
return n;
|
|
11092
|
-
}, gi = (t) => t[0] & 31,
|
|
11124
|
+
}, gi = (t) => t[0] & 31, Ua = (t) => {
|
|
11093
11125
|
try {
|
|
11094
|
-
const e = ts(t), i = e.filter((
|
|
11126
|
+
const e = ts(t), i = e.filter((S) => gi(S) === z0.SPS), n = e.filter((S) => gi(S) === z0.PPS), d = e.filter((S) => gi(S) === z0.SPS_EXT);
|
|
11095
11127
|
if (i.length === 0 || n.length === 0)
|
|
11096
11128
|
return null;
|
|
11097
|
-
const o = i[0], m =
|
|
11129
|
+
const o = i[0], m = Aa(o);
|
|
11098
11130
|
ve(m !== null);
|
|
11099
11131
|
const h = m.profileIdc === 100 || m.profileIdc === 110 || m.profileIdc === 122 || m.profileIdc === 144;
|
|
11100
11132
|
return {
|
|
@@ -11114,7 +11146,7 @@ const ts = (t) => {
|
|
|
11114
11146
|
} catch (e) {
|
|
11115
11147
|
return console.error("Error building AVC Decoder Configuration Record:", e), null;
|
|
11116
11148
|
}
|
|
11117
|
-
},
|
|
11149
|
+
}, za = (t) => {
|
|
11118
11150
|
const e = [];
|
|
11119
11151
|
e.push(t.configurationVersion), e.push(t.avcProfileIndication), e.push(t.profileCompatibility), e.push(t.avcLevelIndication), e.push(252 | t.lengthSizeMinusOne & 3), e.push(224 | t.sequenceParameterSets.length & 31);
|
|
11120
11152
|
for (const i of t.sequenceParameterSets) {
|
|
@@ -11140,15 +11172,15 @@ const ts = (t) => {
|
|
|
11140
11172
|
}
|
|
11141
11173
|
}
|
|
11142
11174
|
return new Uint8Array(e);
|
|
11143
|
-
},
|
|
11175
|
+
}, Aa = (t) => {
|
|
11144
11176
|
try {
|
|
11145
11177
|
const e = new A0(Oi(t));
|
|
11146
11178
|
if (e.skipBits(1), e.skipBits(2), e.readBits(5) !== 7)
|
|
11147
11179
|
return null;
|
|
11148
11180
|
const n = e.readAlignedByte(), d = e.readAlignedByte(), o = e.readAlignedByte();
|
|
11149
11181
|
ye(e);
|
|
11150
|
-
let m = null, h = null,
|
|
11151
|
-
if ((n === 100 || n === 110 || n === 122 || n === 244 || n === 44 || n === 83 || n === 86 || n === 118 || n === 128) && (m = ye(e), m === 3 && e.skipBits(1), h = ye(e),
|
|
11182
|
+
let m = null, h = null, S = null;
|
|
11183
|
+
if ((n === 100 || n === 110 || n === 122 || n === 244 || n === 44 || n === 83 || n === 86 || n === 118 || n === 128) && (m = ye(e), m === 3 && e.skipBits(1), h = ye(e), S = ye(e), e.skipBits(1), e.readBits(1))) {
|
|
11152
11184
|
for (let O = 0; O < (m !== 3 ? 8 : 12); O++)
|
|
11153
11185
|
if (e.readBits(1)) {
|
|
11154
11186
|
const N = O < 6 ? 16 : 64;
|
|
@@ -11181,37 +11213,37 @@ const ts = (t) => {
|
|
|
11181
11213
|
frameMbsOnlyFlag: v,
|
|
11182
11214
|
chromaFormatIdc: m,
|
|
11183
11215
|
bitDepthLumaMinus8: h,
|
|
11184
|
-
bitDepthChromaMinus8:
|
|
11216
|
+
bitDepthChromaMinus8: S
|
|
11185
11217
|
};
|
|
11186
11218
|
} catch (e) {
|
|
11187
11219
|
return console.error("Error parsing AVC SPS:", e), null;
|
|
11188
11220
|
}
|
|
11189
|
-
}, H0 = (t) => t[0] >> 1 & 63,
|
|
11221
|
+
}, H0 = (t) => t[0] >> 1 & 63, Oa = (t) => {
|
|
11190
11222
|
try {
|
|
11191
11223
|
const e = ts(t), i = e.filter((u) => H0(u) === Dt.VPS_NUT), n = e.filter((u) => H0(u) === Dt.SPS_NUT), d = e.filter((u) => H0(u) === Dt.PPS_NUT), o = e.filter((u) => H0(u) === Dt.PREFIX_SEI_NUT || H0(u) === Dt.SUFFIX_SEI_NUT);
|
|
11192
11224
|
if (n.length === 0 || d.length === 0)
|
|
11193
11225
|
return null;
|
|
11194
11226
|
const m = n[0], h = new A0(Oi(m));
|
|
11195
11227
|
h.skipBits(16), h.readBits(4);
|
|
11196
|
-
const
|
|
11228
|
+
const S = h.readBits(3), W = h.readBits(1), { general_profile_space: v, general_tier_flag: Z, general_profile_idc: O, general_profile_compatibility_flags: w, general_constraint_indicator_flags: N, general_level_idc: J } = ja(h, S);
|
|
11197
11229
|
ye(h);
|
|
11198
11230
|
const U = ye(h);
|
|
11199
11231
|
U === 3 && h.skipBits(1), ye(h), ye(h), h.readBits(1) && (ye(h), ye(h), ye(h), ye(h));
|
|
11200
11232
|
const k = ye(h), I = ye(h);
|
|
11201
11233
|
ye(h);
|
|
11202
|
-
const K = h.readBits(1) ? 0 :
|
|
11203
|
-
for (let u = K; u <=
|
|
11234
|
+
const K = h.readBits(1) ? 0 : S;
|
|
11235
|
+
for (let u = K; u <= S; u++)
|
|
11204
11236
|
ye(h), ye(h), ye(h);
|
|
11205
|
-
ye(h), ye(h), ye(h), ye(h), ye(h), ye(h), h.readBits(1) && h.readBits(1) &&
|
|
11237
|
+
ye(h), ye(h), ye(h), ye(h), ye(h), ye(h), h.readBits(1) && h.readBits(1) && Qa(h), h.skipBits(1), h.skipBits(1), h.readBits(1) && (h.skipBits(4), h.skipBits(4), ye(h), ye(h), h.skipBits(1));
|
|
11206
11238
|
const X = ye(h);
|
|
11207
|
-
if (
|
|
11239
|
+
if (Da(h, X), h.readBits(1)) {
|
|
11208
11240
|
const u = ye(h);
|
|
11209
11241
|
for (let l = 0; l < u; l++)
|
|
11210
11242
|
ye(h), h.skipBits(1);
|
|
11211
11243
|
}
|
|
11212
11244
|
h.skipBits(1), h.skipBits(1);
|
|
11213
11245
|
let A = 0;
|
|
11214
|
-
h.readBits(1) && (A =
|
|
11246
|
+
h.readBits(1) && (A = qa(h, S));
|
|
11215
11247
|
let T = 0;
|
|
11216
11248
|
if (d.length > 0) {
|
|
11217
11249
|
const u = d[0], l = new A0(Oi(u));
|
|
@@ -11264,7 +11296,7 @@ const ts = (t) => {
|
|
|
11264
11296
|
bitDepthChromaMinus8: I,
|
|
11265
11297
|
avgFrameRate: 0,
|
|
11266
11298
|
constantFrameRate: 0,
|
|
11267
|
-
numTemporalLayers:
|
|
11299
|
+
numTemporalLayers: S + 1,
|
|
11268
11300
|
temporalIdNested: W,
|
|
11269
11301
|
lengthSizeMinusOne: 3,
|
|
11270
11302
|
arrays: H
|
|
@@ -11272,7 +11304,7 @@ const ts = (t) => {
|
|
|
11272
11304
|
} catch (e) {
|
|
11273
11305
|
return console.error("Error building HEVC Decoder Configuration Record:", e), null;
|
|
11274
11306
|
}
|
|
11275
|
-
},
|
|
11307
|
+
}, ja = (t, e) => {
|
|
11276
11308
|
const i = t.readBits(2), n = t.readBits(1), d = t.readBits(5);
|
|
11277
11309
|
let o = 0;
|
|
11278
11310
|
for (let v = 0; v < 32; v++)
|
|
@@ -11280,14 +11312,14 @@ const ts = (t) => {
|
|
|
11280
11312
|
const m = new Uint8Array(6);
|
|
11281
11313
|
for (let v = 0; v < 6; v++)
|
|
11282
11314
|
m[v] = t.readBits(8);
|
|
11283
|
-
const h = t.readBits(8),
|
|
11315
|
+
const h = t.readBits(8), S = [], W = [];
|
|
11284
11316
|
for (let v = 0; v < e; v++)
|
|
11285
|
-
|
|
11317
|
+
S.push(t.readBits(1)), W.push(t.readBits(1));
|
|
11286
11318
|
if (e > 0)
|
|
11287
11319
|
for (let v = e; v < 8; v++)
|
|
11288
11320
|
t.skipBits(2);
|
|
11289
11321
|
for (let v = 0; v < e; v++)
|
|
11290
|
-
|
|
11322
|
+
S[v] && t.skipBits(88), W[v] && t.skipBits(8);
|
|
11291
11323
|
return {
|
|
11292
11324
|
general_profile_space: i,
|
|
11293
11325
|
general_tier_flag: n,
|
|
@@ -11296,7 +11328,7 @@ const ts = (t) => {
|
|
|
11296
11328
|
general_constraint_indicator_flags: m,
|
|
11297
11329
|
general_level_idc: h
|
|
11298
11330
|
};
|
|
11299
|
-
},
|
|
11331
|
+
}, Qa = (t) => {
|
|
11300
11332
|
for (let e = 0; e < 4; e++)
|
|
11301
11333
|
for (let i = 0; i < (e === 3 ? 2 : 6); i++)
|
|
11302
11334
|
if (!t.readBits(1))
|
|
@@ -11307,55 +11339,55 @@ const ts = (t) => {
|
|
|
11307
11339
|
for (let o = 0; o < d; o++)
|
|
11308
11340
|
s0(t);
|
|
11309
11341
|
}
|
|
11310
|
-
},
|
|
11342
|
+
}, Da = (t, e) => {
|
|
11311
11343
|
const i = [];
|
|
11312
11344
|
for (let n = 0; n < e; n++)
|
|
11313
|
-
i[n] =
|
|
11314
|
-
},
|
|
11345
|
+
i[n] = $a(t, n, e, i);
|
|
11346
|
+
}, $a = (t, e, i, n) => {
|
|
11315
11347
|
let d = 0, o = 0, m = 0;
|
|
11316
11348
|
if (e !== 0 && (o = t.readBits(1)), o) {
|
|
11317
11349
|
if (e === i) {
|
|
11318
|
-
const
|
|
11319
|
-
m = e - (
|
|
11350
|
+
const S = ye(t);
|
|
11351
|
+
m = e - (S + 1);
|
|
11320
11352
|
} else
|
|
11321
11353
|
m = e - 1;
|
|
11322
11354
|
t.readBits(1), ye(t);
|
|
11323
11355
|
const h = n[m] ?? 0;
|
|
11324
|
-
for (let
|
|
11356
|
+
for (let S = 0; S <= h; S++)
|
|
11325
11357
|
t.readBits(1) || t.readBits(1);
|
|
11326
11358
|
d = n[m];
|
|
11327
11359
|
} else {
|
|
11328
|
-
const h = ye(t),
|
|
11360
|
+
const h = ye(t), S = ye(t);
|
|
11329
11361
|
for (let W = 0; W < h; W++)
|
|
11330
11362
|
ye(t), t.readBits(1);
|
|
11331
|
-
for (let W = 0; W <
|
|
11363
|
+
for (let W = 0; W < S; W++)
|
|
11332
11364
|
ye(t), t.readBits(1);
|
|
11333
|
-
d = h +
|
|
11365
|
+
d = h + S;
|
|
11334
11366
|
}
|
|
11335
11367
|
return d;
|
|
11336
|
-
},
|
|
11337
|
-
if (t.readBits(1) && t.readBits(8) === 255 && (t.readBits(16), t.readBits(16)), t.readBits(1) && t.readBits(1), t.readBits(1) && (t.readBits(3), t.readBits(1), t.readBits(1) && (t.readBits(8), t.readBits(8), t.readBits(8))), t.readBits(1) && (ye(t), ye(t)), t.readBits(1), t.readBits(1), t.readBits(1), t.readBits(1) && (ye(t), ye(t), ye(t), ye(t)), t.readBits(1) && (t.readBits(32), t.readBits(32), t.readBits(1) && ye(t), t.readBits(1) &&
|
|
11368
|
+
}, qa = (t, e) => {
|
|
11369
|
+
if (t.readBits(1) && t.readBits(8) === 255 && (t.readBits(16), t.readBits(16)), t.readBits(1) && t.readBits(1), t.readBits(1) && (t.readBits(3), t.readBits(1), t.readBits(1) && (t.readBits(8), t.readBits(8), t.readBits(8))), t.readBits(1) && (ye(t), ye(t)), t.readBits(1), t.readBits(1), t.readBits(1), t.readBits(1) && (ye(t), ye(t), ye(t), ye(t)), t.readBits(1) && (t.readBits(32), t.readBits(32), t.readBits(1) && ye(t), t.readBits(1) && el(t, !0, e)), t.readBits(1)) {
|
|
11338
11370
|
t.readBits(1), t.readBits(1), t.readBits(1);
|
|
11339
11371
|
const i = ye(t);
|
|
11340
11372
|
return ye(t), ye(t), ye(t), ye(t), i;
|
|
11341
11373
|
}
|
|
11342
11374
|
return 0;
|
|
11343
|
-
},
|
|
11375
|
+
}, el = (t, e, i) => {
|
|
11344
11376
|
let n = !1, d = !1, o = !1;
|
|
11345
11377
|
n = t.readBits(1) === 1, d = t.readBits(1) === 1, (n || d) && (o = t.readBits(1) === 1, o && (t.readBits(8), t.readBits(5), t.readBits(1), t.readBits(5)), t.readBits(4), t.readBits(4), o && t.readBits(4), t.readBits(5), t.readBits(5), t.readBits(5));
|
|
11346
11378
|
for (let m = 0; m <= i; m++) {
|
|
11347
11379
|
const h = t.readBits(1) === 1;
|
|
11348
|
-
let
|
|
11349
|
-
h || (
|
|
11380
|
+
let S = !0;
|
|
11381
|
+
h || (S = t.readBits(1) === 1);
|
|
11350
11382
|
let W = !1;
|
|
11351
|
-
|
|
11383
|
+
S ? ye(t) : W = t.readBits(1) === 1;
|
|
11352
11384
|
let v = 1;
|
|
11353
11385
|
W || (v = ye(t) + 1), n && Cs(t, v, o), d && Cs(t, v, o);
|
|
11354
11386
|
}
|
|
11355
11387
|
}, Cs = (t, e, i) => {
|
|
11356
11388
|
for (let n = 0; n < e; n++)
|
|
11357
11389
|
ye(t), ye(t), i && (ye(t), ye(t)), t.readBits(1);
|
|
11358
|
-
},
|
|
11390
|
+
}, tl = (t) => {
|
|
11359
11391
|
const e = [];
|
|
11360
11392
|
e.push(t.configurationVersion), e.push((t.generalProfileSpace & 3) << 6 | (t.generalTierFlag & 1) << 5 | t.generalProfileIdc & 31), e.push(t.generalProfileCompatibilityFlags >>> 24 & 255), e.push(t.generalProfileCompatibilityFlags >>> 16 & 255), e.push(t.generalProfileCompatibilityFlags >>> 8 & 255), e.push(t.generalProfileCompatibilityFlags & 255), e.push(...t.generalConstraintIndicatorFlags), e.push(t.generalLevelIdc & 255), e.push(240 | t.minSpatialSegmentationIdc >> 8 & 15), e.push(t.minSpatialSegmentationIdc & 255), e.push(252 | t.parallelismType & 3), e.push(252 | t.chromaFormatIdc & 3), e.push(248 | t.bitDepthLumaMinus8 & 7), e.push(248 | t.bitDepthChromaMinus8 & 7), e.push(t.avgFrameRate >> 8 & 255), e.push(t.avgFrameRate & 255), e.push((t.constantFrameRate & 3) << 6 | (t.numTemporalLayers & 7) << 3 | (t.temporalIdNested & 1) << 2 | t.lengthSizeMinusOne & 3), e.push(t.arrays.length & 255);
|
|
11361
11393
|
for (const i of t.arrays) {
|
|
@@ -11367,8 +11399,8 @@ const ts = (t) => {
|
|
|
11367
11399
|
}
|
|
11368
11400
|
}
|
|
11369
11401
|
return new Uint8Array(e);
|
|
11370
|
-
},
|
|
11371
|
-
const e =
|
|
11402
|
+
}, il = (t) => {
|
|
11403
|
+
const e = Sa(t), i = e.getUint8(9), n = e.getUint16(10, !0), d = e.getUint32(12, !0), o = e.getInt16(16, !0), m = e.getUint8(18);
|
|
11372
11404
|
let h = null;
|
|
11373
11405
|
return m && (h = t.subarray(19, 21 + i)), {
|
|
11374
11406
|
outputChannelCount: i,
|
|
@@ -11510,7 +11542,7 @@ class B0 {
|
|
|
11510
11542
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
11511
11543
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
11512
11544
|
*/
|
|
11513
|
-
const
|
|
11545
|
+
const sl = (t) => {
|
|
11514
11546
|
let i = (t.hasVideo ? "video/" : t.hasAudio ? "audio/" : "application/") + (t.isQuickTime ? "quicktime" : "mp4");
|
|
11515
11547
|
if (t.codecStrings.length > 0) {
|
|
11516
11548
|
const n = [...new Set(t.codecStrings)];
|
|
@@ -11533,7 +11565,7 @@ const Fi = 8, Js = 16;
|
|
|
11533
11565
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
11534
11566
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
11535
11567
|
*/
|
|
11536
|
-
const Es = /<(?:(\d{2}):)?(\d{2}):(\d{2}).(\d{3})>/g,
|
|
11568
|
+
const Es = /<(?:(\d{2}):)?(\d{2}):(\d{2}).(\d{3})>/g, nl = (t) => {
|
|
11537
11569
|
const e = Math.floor(t / 36e5), i = Math.floor(t % (60 * 60 * 1e3) / (60 * 1e3)), n = Math.floor(t % (60 * 1e3) / 1e3), d = t % 1e3;
|
|
11538
11570
|
return e.toString().padStart(2, "0") + ":" + i.toString().padStart(2, "0") + ":" + n.toString().padStart(2, "0") + "." + d.toString().padStart(3, "0");
|
|
11539
11571
|
};
|
|
@@ -11595,7 +11627,7 @@ class Ns {
|
|
|
11595
11627
|
}
|
|
11596
11628
|
}
|
|
11597
11629
|
}
|
|
11598
|
-
const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(He.buffer), Ue = (t) => [(t % 256 + 256) % 256],
|
|
11630
|
+
const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(He.buffer), Ue = (t) => [(t % 256 + 256) % 256], Se = (t) => (qt.setUint16(0, t, !1), [He[0], He[1]]), _n = (t) => (qt.setInt16(0, t, !1), [He[0], He[1]]), Sn = (t) => (qt.setUint32(0, t, !1), [He[1], He[2], He[3]]), me = (t) => (qt.setUint32(0, t, !1), [He[0], He[1], He[2], He[3]]), d0 = (t) => (qt.setInt32(0, t, !1), [He[0], He[1], He[2], He[3]]), V0 = (t) => (qt.setUint32(0, Math.floor(t / 2 ** 32), !1), qt.setUint32(4, t, !1), [He[0], He[1], He[2], He[3], He[4], He[5], He[6], He[7]]), Gn = (t) => (qt.setInt16(0, 2 ** 8 * t, !1), [He[0], He[1]]), i0 = (t) => (qt.setInt32(0, 2 ** 16 * t, !1), [He[0], He[1], He[2], He[3]]), Ji = (t) => (qt.setInt32(0, 2 ** 30 * t, !1), [He[0], He[1], He[2], He[3]]), Ei = (t, e) => {
|
|
11599
11631
|
const i = [];
|
|
11600
11632
|
let n = t;
|
|
11601
11633
|
do {
|
|
@@ -11611,7 +11643,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
11611
11643
|
for (const i of t)
|
|
11612
11644
|
(!e || i.timestamp > e.timestamp) && (e = i);
|
|
11613
11645
|
return e;
|
|
11614
|
-
},
|
|
11646
|
+
}, vn = (t) => {
|
|
11615
11647
|
const e = t * (Math.PI / 180), i = Math.round(Math.cos(e)), n = Math.round(Math.sin(e));
|
|
11616
11648
|
return [
|
|
11617
11649
|
i,
|
|
@@ -11624,7 +11656,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
11624
11656
|
0,
|
|
11625
11657
|
1
|
|
11626
11658
|
];
|
|
11627
|
-
},
|
|
11659
|
+
}, In = /* @__PURE__ */ vn(0), Vn = (t) => [
|
|
11628
11660
|
i0(t[0]),
|
|
11629
11661
|
i0(t[1]),
|
|
11630
11662
|
Ji(t[2]),
|
|
@@ -11634,18 +11666,18 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
11634
11666
|
i0(t[6]),
|
|
11635
11667
|
i0(t[7]),
|
|
11636
11668
|
Ji(t[8])
|
|
11637
|
-
],
|
|
11669
|
+
], Ge = (t, e, i) => ({
|
|
11638
11670
|
type: t,
|
|
11639
11671
|
contents: e && new Uint8Array(e.flat(10)),
|
|
11640
11672
|
children: i
|
|
11641
|
-
}), Ye = (t, e, i, n, d) =>
|
|
11673
|
+
}), Ye = (t, e, i, n, d) => Ge(t, [Ue(e), Sn(i), n ?? []], d), rl = (t) => t.isQuickTime ? Ge("ftyp", [
|
|
11642
11674
|
at("qt "),
|
|
11643
11675
|
// Major brand
|
|
11644
11676
|
me(512),
|
|
11645
11677
|
// Minor version
|
|
11646
11678
|
// Compatible brands
|
|
11647
11679
|
at("qt ")
|
|
11648
|
-
]) : t.fragmented ?
|
|
11680
|
+
]) : t.fragmented ? Ge("ftyp", [
|
|
11649
11681
|
at("iso5"),
|
|
11650
11682
|
// Major brand
|
|
11651
11683
|
me(512),
|
|
@@ -11654,7 +11686,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
11654
11686
|
at("iso5"),
|
|
11655
11687
|
at("iso6"),
|
|
11656
11688
|
at("mp41")
|
|
11657
|
-
]) :
|
|
11689
|
+
]) : Ge("ftyp", [
|
|
11658
11690
|
at("isom"),
|
|
11659
11691
|
// Major brand
|
|
11660
11692
|
me(512),
|
|
@@ -11663,12 +11695,12 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
11663
11695
|
at("isom"),
|
|
11664
11696
|
t.holdsAvc ? at("avc1") : [],
|
|
11665
11697
|
at("mp41")
|
|
11666
|
-
]), ci = (t) => ({ type: "mdat", largeSize: t }),
|
|
11667
|
-
|
|
11668
|
-
...t.trackDatas.map((e) =>
|
|
11669
|
-
t.isFragmented ?
|
|
11670
|
-
|
|
11671
|
-
]),
|
|
11698
|
+
]), ci = (t) => ({ type: "mdat", largeSize: t }), al = (t) => ({ type: "free", size: t }), U0 = (t) => Ge("moov", void 0, [
|
|
11699
|
+
ll(t.creationTime, t.trackDatas),
|
|
11700
|
+
...t.trackDatas.map((e) => ol(e, t.creationTime)),
|
|
11701
|
+
t.isFragmented ? Nl(t.trackDatas) : null,
|
|
11702
|
+
i1(t)
|
|
11703
|
+
]), ll = (t, e) => {
|
|
11672
11704
|
const i = tt(Math.max(0, ...e.filter((m) => m.samples.length > 0).map((m) => {
|
|
11673
11705
|
const h = is(m.samples);
|
|
11674
11706
|
return h.timestamp + h.duration;
|
|
@@ -11688,35 +11720,35 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
11688
11720
|
// Preferred volume
|
|
11689
11721
|
Array(10).fill(0),
|
|
11690
11722
|
// Reserved
|
|
11691
|
-
In
|
|
11723
|
+
Vn(In),
|
|
11692
11724
|
// Matrix
|
|
11693
11725
|
Array(24).fill(0),
|
|
11694
11726
|
// Pre-defined
|
|
11695
11727
|
me(n)
|
|
11696
11728
|
// Next track ID
|
|
11697
11729
|
]);
|
|
11698
|
-
},
|
|
11699
|
-
const i =
|
|
11700
|
-
return
|
|
11701
|
-
ol(t, e),
|
|
11730
|
+
}, ol = (t, e) => {
|
|
11731
|
+
const i = h1(t);
|
|
11732
|
+
return Ge("trak", void 0, [
|
|
11702
11733
|
cl(t, e),
|
|
11703
|
-
|
|
11704
|
-
|
|
11734
|
+
dl(t, e),
|
|
11735
|
+
i.name !== void 0 ? Ge("udta", void 0, [
|
|
11736
|
+
Ge("name", [
|
|
11705
11737
|
...$t.encode(i.name)
|
|
11706
11738
|
])
|
|
11707
11739
|
]) : null
|
|
11708
11740
|
]);
|
|
11709
|
-
},
|
|
11710
|
-
var
|
|
11741
|
+
}, cl = (t, e) => {
|
|
11742
|
+
var S;
|
|
11711
11743
|
const i = is(t.samples), n = tt(i ? i.timestamp + i.duration : 0, ji), d = !M0(e) || !M0(n), o = d ? V0 : me;
|
|
11712
11744
|
let m;
|
|
11713
11745
|
if (t.type === "video") {
|
|
11714
11746
|
const W = t.track.metadata.rotation;
|
|
11715
|
-
m =
|
|
11747
|
+
m = vn(W ?? 0);
|
|
11716
11748
|
} else
|
|
11717
|
-
m =
|
|
11749
|
+
m = In;
|
|
11718
11750
|
let h = 2;
|
|
11719
|
-
return ((
|
|
11751
|
+
return ((S = t.track.metadata.disposition) == null ? void 0 : S.default) !== !1 && (h |= 1), Ye("tkhd", +d, h, [
|
|
11720
11752
|
o(e),
|
|
11721
11753
|
// Creation time
|
|
11722
11754
|
o(e),
|
|
@@ -11729,26 +11761,26 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
11729
11761
|
// Duration
|
|
11730
11762
|
Array(8).fill(0),
|
|
11731
11763
|
// Reserved
|
|
11732
|
-
|
|
11764
|
+
Se(0),
|
|
11733
11765
|
// Layer
|
|
11734
|
-
|
|
11766
|
+
Se(t.track.id),
|
|
11735
11767
|
// Alternate group
|
|
11736
11768
|
Gn(t.type === "audio" ? 1 : 0),
|
|
11737
11769
|
// Volume
|
|
11738
|
-
|
|
11770
|
+
Se(0),
|
|
11739
11771
|
// Reserved
|
|
11740
|
-
|
|
11772
|
+
Vn(m),
|
|
11741
11773
|
// Matrix
|
|
11742
11774
|
i0(t.type === "video" ? t.info.width : 0),
|
|
11743
11775
|
// Track width
|
|
11744
11776
|
i0(t.type === "video" ? t.info.height : 0)
|
|
11745
11777
|
// Track height
|
|
11746
11778
|
]);
|
|
11747
|
-
},
|
|
11748
|
-
|
|
11749
|
-
ss(!0,
|
|
11750
|
-
|
|
11751
|
-
]),
|
|
11779
|
+
}, dl = (t, e) => Ge("mdia", void 0, [
|
|
11780
|
+
ml(t, e),
|
|
11781
|
+
ss(!0, ul[t.type], hl[t.type]),
|
|
11782
|
+
bl(t)
|
|
11783
|
+
]), ml = (t, e) => {
|
|
11752
11784
|
const i = is(t.samples), n = tt(i ? i.timestamp + i.duration : 0, t.timescale), d = !M0(e) || !M0(n), o = d ? V0 : me;
|
|
11753
11785
|
return Ye("mdhd", +d, 0, [
|
|
11754
11786
|
o(e),
|
|
@@ -11759,16 +11791,16 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
11759
11791
|
// Timescale
|
|
11760
11792
|
o(n),
|
|
11761
11793
|
// Duration
|
|
11762
|
-
|
|
11794
|
+
Se(Ln(t.track.metadata.languageCode ?? Va)),
|
|
11763
11795
|
// Language
|
|
11764
|
-
|
|
11796
|
+
Se(0)
|
|
11765
11797
|
// Quality
|
|
11766
11798
|
]);
|
|
11767
|
-
},
|
|
11799
|
+
}, ul = {
|
|
11768
11800
|
video: "vide",
|
|
11769
11801
|
audio: "soun",
|
|
11770
11802
|
subtitle: "text"
|
|
11771
|
-
},
|
|
11803
|
+
}, hl = {
|
|
11772
11804
|
video: "MediabunnyVideoHandler",
|
|
11773
11805
|
audio: "MediabunnySoundHandler",
|
|
11774
11806
|
subtitle: "MediabunnyTextHandler"
|
|
@@ -11785,75 +11817,75 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
11785
11817
|
// Component flags mask
|
|
11786
11818
|
at(i, !0)
|
|
11787
11819
|
// Component name
|
|
11788
|
-
]),
|
|
11789
|
-
|
|
11790
|
-
|
|
11820
|
+
]), bl = (t) => Ge("minf", void 0, [
|
|
11821
|
+
Zl[t.type](),
|
|
11822
|
+
Xl(),
|
|
11791
11823
|
Gl(t)
|
|
11792
|
-
]),
|
|
11793
|
-
|
|
11824
|
+
]), pl = () => Ye("vmhd", 0, 1, [
|
|
11825
|
+
Se(0),
|
|
11794
11826
|
// Graphics mode
|
|
11795
|
-
|
|
11827
|
+
Se(0),
|
|
11796
11828
|
// Opcolor R
|
|
11797
|
-
|
|
11829
|
+
Se(0),
|
|
11798
11830
|
// Opcolor G
|
|
11799
|
-
|
|
11831
|
+
Se(0)
|
|
11800
11832
|
// Opcolor B
|
|
11801
|
-
]),
|
|
11802
|
-
|
|
11833
|
+
]), yl = () => Ye("smhd", 0, 0, [
|
|
11834
|
+
Se(0),
|
|
11803
11835
|
// Balance
|
|
11804
|
-
|
|
11836
|
+
Se(0)
|
|
11805
11837
|
// Reserved
|
|
11806
|
-
]),
|
|
11807
|
-
video:
|
|
11808
|
-
audio:
|
|
11809
|
-
subtitle:
|
|
11810
|
-
},
|
|
11811
|
-
|
|
11812
|
-
]),
|
|
11838
|
+
]), fl = () => Ye("nmhd", 0, 0), Zl = {
|
|
11839
|
+
video: pl,
|
|
11840
|
+
audio: yl,
|
|
11841
|
+
subtitle: fl
|
|
11842
|
+
}, Xl = () => Ge("dinf", void 0, [
|
|
11843
|
+
_l()
|
|
11844
|
+
]), _l = () => Ye("dref", 0, 0, [
|
|
11813
11845
|
me(1)
|
|
11814
11846
|
// Entry count
|
|
11815
11847
|
], [
|
|
11816
|
-
|
|
11817
|
-
]),
|
|
11848
|
+
Sl()
|
|
11849
|
+
]), Sl = () => Ye("url ", 0, 1), Gl = (t) => {
|
|
11818
11850
|
const e = t.compositionTimeOffsetTable.length > 1 || t.compositionTimeOffsetTable.some((i) => i.sampleCompositionTimeOffset !== 0);
|
|
11819
|
-
return
|
|
11820
|
-
|
|
11821
|
-
|
|
11822
|
-
e ? Fl(t) : null,
|
|
11851
|
+
return Ge("stbl", void 0, [
|
|
11852
|
+
vl(t),
|
|
11853
|
+
kl(t),
|
|
11823
11854
|
e ? Jl(t) : null,
|
|
11824
|
-
|
|
11855
|
+
e ? El(t) : null,
|
|
11825
11856
|
Cl(t),
|
|
11826
11857
|
gl(t),
|
|
11827
|
-
|
|
11858
|
+
Fl(t),
|
|
11859
|
+
Bl(t)
|
|
11828
11860
|
]);
|
|
11829
|
-
},
|
|
11861
|
+
}, vl = (t) => {
|
|
11830
11862
|
let e;
|
|
11831
11863
|
if (t.type === "video")
|
|
11832
|
-
e =
|
|
11864
|
+
e = Il(a1(t.track.source._codec, t.info.decoderConfig.codec), t);
|
|
11833
11865
|
else if (t.type === "audio") {
|
|
11834
|
-
const i =
|
|
11835
|
-
ve(i), e =
|
|
11836
|
-
} else t.type === "subtitle" && (e =
|
|
11866
|
+
const i = Wn(t.track.source._codec, t.muxer.isQuickTime);
|
|
11867
|
+
ve(i), e = Ll(i, t);
|
|
11868
|
+
} else t.type === "subtitle" && (e = Kl(c1[t.track.source._codec], t));
|
|
11837
11869
|
return ve(e), Ye("stsd", 0, 0, [
|
|
11838
11870
|
me(1)
|
|
11839
11871
|
// Entry count
|
|
11840
11872
|
], [
|
|
11841
11873
|
e
|
|
11842
11874
|
]);
|
|
11843
|
-
},
|
|
11875
|
+
}, Il = (t, e) => Ge(t, [
|
|
11844
11876
|
Array(6).fill(0),
|
|
11845
11877
|
// Reserved
|
|
11846
|
-
|
|
11878
|
+
Se(1),
|
|
11847
11879
|
// Data reference index
|
|
11848
|
-
|
|
11880
|
+
Se(0),
|
|
11849
11881
|
// Pre-defined
|
|
11850
|
-
|
|
11882
|
+
Se(0),
|
|
11851
11883
|
// Reserved
|
|
11852
11884
|
Array(12).fill(0),
|
|
11853
11885
|
// Pre-defined
|
|
11854
|
-
|
|
11886
|
+
Se(e.info.width),
|
|
11855
11887
|
// Width
|
|
11856
|
-
|
|
11888
|
+
Se(e.info.height),
|
|
11857
11889
|
// Height
|
|
11858
11890
|
me(4718592),
|
|
11859
11891
|
// Horizontal resolution
|
|
@@ -11861,45 +11893,45 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
11861
11893
|
// Vertical resolution
|
|
11862
11894
|
me(0),
|
|
11863
11895
|
// Reserved
|
|
11864
|
-
|
|
11896
|
+
Se(1),
|
|
11865
11897
|
// Frame count
|
|
11866
11898
|
Array(32).fill(0),
|
|
11867
11899
|
// Compressor name
|
|
11868
|
-
|
|
11900
|
+
Se(24),
|
|
11869
11901
|
// Depth
|
|
11870
|
-
|
|
11902
|
+
_n(65535)
|
|
11871
11903
|
// Pre-defined
|
|
11872
11904
|
], [
|
|
11873
|
-
|
|
11874
|
-
Ga(e.info.decoderConfig.colorSpace) ?
|
|
11875
|
-
]),
|
|
11905
|
+
l1[e.track.source._codec](e),
|
|
11906
|
+
Ga(e.info.decoderConfig.colorSpace) ? Vl(e) : null
|
|
11907
|
+
]), Vl = (t) => Ge("colr", [
|
|
11876
11908
|
at("nclx"),
|
|
11877
11909
|
// Colour type
|
|
11878
|
-
|
|
11910
|
+
Se($i[t.info.decoderConfig.colorSpace.primaries]),
|
|
11879
11911
|
// Colour primaries
|
|
11880
|
-
|
|
11912
|
+
Se(qi[t.info.decoderConfig.colorSpace.transfer]),
|
|
11881
11913
|
// Transfer characteristics
|
|
11882
|
-
|
|
11914
|
+
Se(es[t.info.decoderConfig.colorSpace.matrix]),
|
|
11883
11915
|
// Matrix coefficients
|
|
11884
11916
|
Ue((t.info.decoderConfig.colorSpace.fullRange ? 1 : 0) << 7)
|
|
11885
11917
|
// Full range flag
|
|
11886
|
-
]),
|
|
11918
|
+
]), Rl = (t) => t.info.decoderConfig && Ge("avcC", [
|
|
11887
11919
|
// For AVC, description is an AVCDecoderConfigurationRecord, so nothing else to do here
|
|
11888
11920
|
...Q0(t.info.decoderConfig.description)
|
|
11889
|
-
]),
|
|
11921
|
+
]), Tl = (t) => t.info.decoderConfig && Ge("hvcC", [
|
|
11890
11922
|
// For HEVC, description is an HEVCDecoderConfigurationRecord, so nothing else to do here
|
|
11891
11923
|
...Q0(t.info.decoderConfig.description)
|
|
11892
11924
|
]), Ps = (t) => {
|
|
11893
11925
|
var O, w, N, J;
|
|
11894
11926
|
if (!t.info.decoderConfig)
|
|
11895
11927
|
return null;
|
|
11896
|
-
const e = t.info.decoderConfig, i = e.codec.split("."), n = Number(i[1]), d = Number(i[2]), o = Number(i[3]), m = i[4] ? Number(i[4]) : 1, h = i[8] ? Number(i[8]) : Number(((O = e.colorSpace) == null ? void 0 : O.fullRange) ?? 0),
|
|
11928
|
+
const e = t.info.decoderConfig, i = e.codec.split("."), n = Number(i[1]), d = Number(i[2]), o = Number(i[3]), m = i[4] ? Number(i[4]) : 1, h = i[8] ? Number(i[8]) : Number(((O = e.colorSpace) == null ? void 0 : O.fullRange) ?? 0), S = (o << 4) + (m << 1) + h, W = i[5] ? Number(i[5]) : (w = e.colorSpace) != null && w.primaries ? $i[e.colorSpace.primaries] : 2, v = i[6] ? Number(i[6]) : (N = e.colorSpace) != null && N.transfer ? qi[e.colorSpace.transfer] : 2, Z = i[7] ? Number(i[7]) : (J = e.colorSpace) != null && J.matrix ? es[e.colorSpace.matrix] : 2;
|
|
11897
11929
|
return Ye("vpcC", 1, 0, [
|
|
11898
11930
|
Ue(n),
|
|
11899
11931
|
// Profile
|
|
11900
11932
|
Ue(d),
|
|
11901
11933
|
// Level
|
|
11902
|
-
Ue(
|
|
11934
|
+
Ue(S),
|
|
11903
11935
|
// Bit depth, chroma subsampling, full range
|
|
11904
11936
|
Ue(W),
|
|
11905
11937
|
// Colour primaries
|
|
@@ -11907,10 +11939,10 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
11907
11939
|
// Transfer characteristics
|
|
11908
11940
|
Ue(Z),
|
|
11909
11941
|
// Matrix coefficients
|
|
11910
|
-
|
|
11942
|
+
Se(0)
|
|
11911
11943
|
// Codec initialization data size
|
|
11912
11944
|
]);
|
|
11913
|
-
},
|
|
11945
|
+
}, Wl = (t) => Ge("av1C", Ya(t.info.decoderConfig.codec)), Ll = (t, e) => {
|
|
11914
11946
|
var o;
|
|
11915
11947
|
let i = 0, n, d = 16;
|
|
11916
11948
|
if (k0.includes(e.track.source._codec)) {
|
|
@@ -11920,48 +11952,48 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
11920
11952
|
return i === 0 ? n = [
|
|
11921
11953
|
Array(6).fill(0),
|
|
11922
11954
|
// Reserved
|
|
11923
|
-
|
|
11955
|
+
Se(1),
|
|
11924
11956
|
// Data reference index
|
|
11925
|
-
|
|
11957
|
+
Se(i),
|
|
11926
11958
|
// Version
|
|
11927
|
-
|
|
11959
|
+
Se(0),
|
|
11928
11960
|
// Revision level
|
|
11929
11961
|
me(0),
|
|
11930
11962
|
// Vendor
|
|
11931
|
-
|
|
11963
|
+
Se(e.info.numberOfChannels),
|
|
11932
11964
|
// Number of channels
|
|
11933
|
-
|
|
11965
|
+
Se(d),
|
|
11934
11966
|
// Sample size (bits)
|
|
11935
|
-
|
|
11967
|
+
Se(0),
|
|
11936
11968
|
// Compression ID
|
|
11937
|
-
|
|
11969
|
+
Se(0),
|
|
11938
11970
|
// Packet size
|
|
11939
|
-
|
|
11971
|
+
Se(e.info.sampleRate < 2 ** 16 ? e.info.sampleRate : 0),
|
|
11940
11972
|
// Sample rate (upper)
|
|
11941
|
-
|
|
11973
|
+
Se(0)
|
|
11942
11974
|
// Sample rate (lower)
|
|
11943
11975
|
] : n = [
|
|
11944
11976
|
Array(6).fill(0),
|
|
11945
11977
|
// Reserved
|
|
11946
|
-
|
|
11978
|
+
Se(1),
|
|
11947
11979
|
// Data reference index
|
|
11948
|
-
|
|
11980
|
+
Se(i),
|
|
11949
11981
|
// Version
|
|
11950
|
-
|
|
11982
|
+
Se(0),
|
|
11951
11983
|
// Revision level
|
|
11952
11984
|
me(0),
|
|
11953
11985
|
// Vendor
|
|
11954
|
-
|
|
11986
|
+
Se(e.info.numberOfChannels),
|
|
11955
11987
|
// Number of channels
|
|
11956
|
-
|
|
11988
|
+
Se(Math.min(d, 16)),
|
|
11957
11989
|
// Sample size (bits)
|
|
11958
|
-
|
|
11990
|
+
Se(0),
|
|
11959
11991
|
// Compression ID
|
|
11960
|
-
|
|
11992
|
+
Se(0),
|
|
11961
11993
|
// Packet size
|
|
11962
|
-
|
|
11994
|
+
Se(e.info.sampleRate < 2 ** 16 ? e.info.sampleRate : 0),
|
|
11963
11995
|
// Sample rate (upper)
|
|
11964
|
-
|
|
11996
|
+
Se(0),
|
|
11965
11997
|
// Sample rate (lower)
|
|
11966
11998
|
me(1),
|
|
11967
11999
|
// Samples per packet (must be 1 for uncompressed formats)
|
|
@@ -11971,8 +12003,8 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
11971
12003
|
// Bytes per frame
|
|
11972
12004
|
me(2)
|
|
11973
12005
|
// Bytes per sample (constant in FFmpeg)
|
|
11974
|
-
],
|
|
11975
|
-
((o =
|
|
12006
|
+
], Ge(t, n, [
|
|
12007
|
+
((o = o1(e.track.source._codec, e.muxer.isQuickTime)) == null ? void 0 : o(e)) ?? null
|
|
11976
12008
|
]);
|
|
11977
12009
|
}, Ni = (t) => {
|
|
11978
12010
|
let e;
|
|
@@ -11994,7 +12026,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
11994
12026
|
// Object type indication
|
|
11995
12027
|
...Ue(21),
|
|
11996
12028
|
// stream type(6bits)=5 audio, flags(2bits)=1
|
|
11997
|
-
...
|
|
12029
|
+
...Sn(0),
|
|
11998
12030
|
// 24bit buffer size
|
|
11999
12031
|
...me(0),
|
|
12000
12032
|
// max bitrate
|
|
@@ -12012,7 +12044,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12012
12044
|
];
|
|
12013
12045
|
}
|
|
12014
12046
|
return i = [
|
|
12015
|
-
...
|
|
12047
|
+
...Se(1),
|
|
12016
12048
|
// ES_ID = 1
|
|
12017
12049
|
...Ue(0),
|
|
12018
12050
|
// flags etc = 0
|
|
@@ -12032,43 +12064,43 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12032
12064
|
...Ei(i.length),
|
|
12033
12065
|
...i
|
|
12034
12066
|
], Ye("esds", 0, 0, i);
|
|
12035
|
-
}, c0 = (t) =>
|
|
12036
|
-
Ll(t),
|
|
12067
|
+
}, c0 = (t) => Ge("wave", void 0, [
|
|
12037
12068
|
xl(t),
|
|
12038
|
-
|
|
12069
|
+
Hl(t),
|
|
12070
|
+
Ge("\0\0\0\0")
|
|
12039
12071
|
// NULL tag at the end
|
|
12040
|
-
]),
|
|
12041
|
-
at(
|
|
12042
|
-
]),
|
|
12072
|
+
]), xl = (t) => Ge("frma", [
|
|
12073
|
+
at(Wn(t.track.source._codec, t.muxer.isQuickTime))
|
|
12074
|
+
]), Hl = (t) => {
|
|
12043
12075
|
const { littleEndian: e } = D0(t.track.source._codec);
|
|
12044
|
-
return
|
|
12045
|
-
|
|
12076
|
+
return Ge("enda", [
|
|
12077
|
+
Se(+e)
|
|
12046
12078
|
]);
|
|
12047
|
-
},
|
|
12048
|
-
var
|
|
12079
|
+
}, Yl = (t) => {
|
|
12080
|
+
var S;
|
|
12049
12081
|
let e = t.info.numberOfChannels, i = 3840, n = t.info.sampleRate, d = 0, o = 0, m = new Uint8Array(0);
|
|
12050
|
-
const h = (
|
|
12082
|
+
const h = (S = t.info.decoderConfig) == null ? void 0 : S.description;
|
|
12051
12083
|
if (h) {
|
|
12052
12084
|
ve(h.byteLength >= 18);
|
|
12053
|
-
const W = Q0(h), v =
|
|
12085
|
+
const W = Q0(h), v = il(W);
|
|
12054
12086
|
e = v.outputChannelCount, i = v.preSkip, n = v.inputSampleRate, d = v.outputGain, o = v.channelMappingFamily, v.channelMappingTable && (m = v.channelMappingTable);
|
|
12055
12087
|
}
|
|
12056
|
-
return
|
|
12088
|
+
return Ge("dOps", [
|
|
12057
12089
|
Ue(0),
|
|
12058
12090
|
// Version
|
|
12059
12091
|
Ue(e),
|
|
12060
12092
|
// OutputChannelCount
|
|
12061
|
-
|
|
12093
|
+
Se(i),
|
|
12062
12094
|
// PreSkip
|
|
12063
12095
|
me(n),
|
|
12064
12096
|
// InputSampleRate
|
|
12065
|
-
|
|
12097
|
+
_n(d),
|
|
12066
12098
|
// OutputGain
|
|
12067
12099
|
Ue(o),
|
|
12068
12100
|
// ChannelMappingFamily
|
|
12069
12101
|
...m
|
|
12070
12102
|
]);
|
|
12071
|
-
},
|
|
12103
|
+
}, wl = (t) => {
|
|
12072
12104
|
var n;
|
|
12073
12105
|
const e = (n = t.info.decoderConfig) == null ? void 0 : n.description;
|
|
12074
12106
|
ve(e);
|
|
@@ -12082,16 +12114,16 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12082
12114
|
Ue(n),
|
|
12083
12115
|
Ue(8 * i)
|
|
12084
12116
|
]);
|
|
12085
|
-
},
|
|
12117
|
+
}, Kl = (t, e) => Ge(t, [
|
|
12086
12118
|
Array(6).fill(0),
|
|
12087
12119
|
// Reserved
|
|
12088
|
-
|
|
12120
|
+
Se(1)
|
|
12089
12121
|
// Data reference index
|
|
12090
12122
|
], [
|
|
12091
|
-
|
|
12092
|
-
]),
|
|
12123
|
+
d1[e.track.source._codec](e)
|
|
12124
|
+
]), Ml = (t) => Ge("vttC", [
|
|
12093
12125
|
...$t.encode(t.info.config.description)
|
|
12094
|
-
]),
|
|
12126
|
+
]), kl = (t) => Ye("stts", 0, 0, [
|
|
12095
12127
|
me(t.timeToSampleTable.length),
|
|
12096
12128
|
// Number of entries
|
|
12097
12129
|
t.timeToSampleTable.map((e) => [
|
|
@@ -12100,7 +12132,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12100
12132
|
me(e.sampleDelta)
|
|
12101
12133
|
// Sample duration
|
|
12102
12134
|
])
|
|
12103
|
-
]),
|
|
12135
|
+
]), Bl = (t) => {
|
|
12104
12136
|
if (t.samples.every((i) => i.type === "key"))
|
|
12105
12137
|
return null;
|
|
12106
12138
|
const e = [...t.samples.entries()].filter(([, i]) => i.type === "key");
|
|
@@ -12110,7 +12142,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12110
12142
|
e.map(([i]) => me(i + 1))
|
|
12111
12143
|
// Sync sample table
|
|
12112
12144
|
]);
|
|
12113
|
-
},
|
|
12145
|
+
}, Cl = (t) => Ye("stsc", 0, 0, [
|
|
12114
12146
|
me(t.compactlyCodedChunkTable.length),
|
|
12115
12147
|
// Number of entries
|
|
12116
12148
|
t.compactlyCodedChunkTable.map((e) => [
|
|
@@ -12121,7 +12153,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12121
12153
|
me(1)
|
|
12122
12154
|
// Sample description index
|
|
12123
12155
|
])
|
|
12124
|
-
]),
|
|
12156
|
+
]), gl = (t) => {
|
|
12125
12157
|
if (t.type === "audio" && t.info.requiresPcmTransformation) {
|
|
12126
12158
|
const { sampleSize: e } = D0(t.track.source._codec);
|
|
12127
12159
|
return Ye("stsz", 0, 0, [
|
|
@@ -12138,7 +12170,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12138
12170
|
t.samples.map((e) => me(e.size))
|
|
12139
12171
|
// Sample size table
|
|
12140
12172
|
]);
|
|
12141
|
-
},
|
|
12173
|
+
}, Fl = (t) => t.finalizedChunks.length > 0 && Y0(t.finalizedChunks).offset >= 2 ** 32 ? Ye("co64", 0, 0, [
|
|
12142
12174
|
me(t.finalizedChunks.length),
|
|
12143
12175
|
// Number of entries
|
|
12144
12176
|
t.finalizedChunks.map((e) => V0(e.offset))
|
|
@@ -12148,7 +12180,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12148
12180
|
// Number of entries
|
|
12149
12181
|
t.finalizedChunks.map((e) => me(e.offset))
|
|
12150
12182
|
// Chunk offset table
|
|
12151
|
-
]),
|
|
12183
|
+
]), Jl = (t) => Ye("ctts", 1, 0, [
|
|
12152
12184
|
me(t.compositionTimeOffsetTable.length),
|
|
12153
12185
|
// Number of entries
|
|
12154
12186
|
t.compositionTimeOffsetTable.map((e) => [
|
|
@@ -12157,7 +12189,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12157
12189
|
d0(e.sampleCompositionTimeOffset)
|
|
12158
12190
|
// Sample offset
|
|
12159
12191
|
])
|
|
12160
|
-
]),
|
|
12192
|
+
]), El = (t) => {
|
|
12161
12193
|
let e = 1 / 0, i = -1 / 0, n = 1 / 0, d = -1 / 0;
|
|
12162
12194
|
ve(t.compositionTimeOffsetTable.length > 0), ve(t.samples.length > 0);
|
|
12163
12195
|
for (let m = 0; m < t.compositionTimeOffsetTable.length; m++) {
|
|
@@ -12181,7 +12213,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12181
12213
|
d0(d)
|
|
12182
12214
|
// Composition end time
|
|
12183
12215
|
]);
|
|
12184
|
-
},
|
|
12216
|
+
}, Nl = (t) => Ge("mvex", void 0, t.map(Pl)), Pl = (t) => Ye("trex", 0, 0, [
|
|
12185
12217
|
me(t.track.id),
|
|
12186
12218
|
// Track ID
|
|
12187
12219
|
me(1),
|
|
@@ -12192,28 +12224,28 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12192
12224
|
// Default sample size
|
|
12193
12225
|
me(0)
|
|
12194
12226
|
// Default sample flags
|
|
12195
|
-
]), Us = (t, e) =>
|
|
12196
|
-
|
|
12197
|
-
...e.map(
|
|
12198
|
-
]),
|
|
12227
|
+
]), Us = (t, e) => Ge("moof", void 0, [
|
|
12228
|
+
Ul(t),
|
|
12229
|
+
...e.map(zl)
|
|
12230
|
+
]), Ul = (t) => Ye("mfhd", 0, 0, [
|
|
12199
12231
|
me(t)
|
|
12200
12232
|
// Sequence number
|
|
12201
|
-
]),
|
|
12233
|
+
]), Rn = (t) => {
|
|
12202
12234
|
let e = 0, i = 0;
|
|
12203
12235
|
const n = 0, d = 0, o = t.type === "delta";
|
|
12204
12236
|
return i |= +o, o ? e |= 1 : e |= 2, e << 24 | i << 16 | n << 8 | d;
|
|
12205
|
-
},
|
|
12206
|
-
zl(t),
|
|
12237
|
+
}, zl = (t) => Ge("traf", void 0, [
|
|
12207
12238
|
Al(t),
|
|
12208
|
-
Ol(t)
|
|
12209
|
-
|
|
12239
|
+
Ol(t),
|
|
12240
|
+
jl(t)
|
|
12241
|
+
]), Al = (t) => {
|
|
12210
12242
|
ve(t.currentChunk);
|
|
12211
12243
|
let e = 0;
|
|
12212
12244
|
e |= 8, e |= 16, e |= 32, e |= 131072;
|
|
12213
12245
|
const i = t.currentChunk.samples[1] ?? t.currentChunk.samples[0], n = {
|
|
12214
12246
|
duration: i.timescaleUnitsToNextSample,
|
|
12215
12247
|
size: i.size,
|
|
12216
|
-
flags:
|
|
12248
|
+
flags: Rn(i)
|
|
12217
12249
|
};
|
|
12218
12250
|
return Ye("tfhd", 0, e, [
|
|
12219
12251
|
me(t.track.id),
|
|
@@ -12225,12 +12257,12 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12225
12257
|
me(n.flags)
|
|
12226
12258
|
// Default sample flags
|
|
12227
12259
|
]);
|
|
12228
|
-
},
|
|
12260
|
+
}, Ol = (t) => (ve(t.currentChunk), Ye("tfdt", 1, 0, [
|
|
12229
12261
|
V0(tt(t.currentChunk.startTimestamp, t.timescale))
|
|
12230
12262
|
// Base Media Decode Time
|
|
12231
|
-
])),
|
|
12263
|
+
])), jl = (t) => {
|
|
12232
12264
|
ve(t.currentChunk);
|
|
12233
|
-
const e = t.currentChunk.samples.map((J) => J.timescaleUnitsToNextSample), i = t.currentChunk.samples.map((J) => J.size), n = t.currentChunk.samples.map(
|
|
12265
|
+
const e = t.currentChunk.samples.map((J) => J.timescaleUnitsToNextSample), i = t.currentChunk.samples.map((J) => J.size), n = t.currentChunk.samples.map(Rn), d = t.currentChunk.samples.map((J) => tt(J.timestamp - J.decodeTimestamp, t.timescale)), o = new Set(e), m = new Set(i), h = new Set(n), S = new Set(d), W = h.size === 2 && n[0] !== n[1], v = o.size > 1, Z = m.size > 1, O = !W && h.size > 1, w = S.size > 1 || [...S].some((J) => J !== 0);
|
|
12234
12266
|
let N = 0;
|
|
12235
12267
|
return N |= 1, N |= 4 * +W, N |= 256 * +v, N |= 512 * +Z, N |= 1024 * +O, N |= 2048 * +w, Ye("trun", 1, N, [
|
|
12236
12268
|
me(t.currentChunk.samples.length),
|
|
@@ -12249,10 +12281,10 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12249
12281
|
w ? d0(d[U]) : []
|
|
12250
12282
|
])
|
|
12251
12283
|
]);
|
|
12252
|
-
},
|
|
12253
|
-
...t.map(
|
|
12254
|
-
|
|
12255
|
-
]),
|
|
12284
|
+
}, Ql = (t) => Ge("mfra", void 0, [
|
|
12285
|
+
...t.map(Dl),
|
|
12286
|
+
$l()
|
|
12287
|
+
]), Dl = (t, e) => Ye("tfra", 1, 0, [
|
|
12256
12288
|
me(t.track.id),
|
|
12257
12289
|
// Track ID
|
|
12258
12290
|
me(63),
|
|
@@ -12271,29 +12303,29 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12271
12303
|
me(1)
|
|
12272
12304
|
// Sample number
|
|
12273
12305
|
])
|
|
12274
|
-
]),
|
|
12306
|
+
]), $l = () => Ye("mfro", 0, 0, [
|
|
12275
12307
|
// This value needs to be overwritten manually from the outside, where the actual size of the enclosing mfra box
|
|
12276
12308
|
// is known
|
|
12277
12309
|
me(0)
|
|
12278
12310
|
// Size
|
|
12279
|
-
]),
|
|
12280
|
-
d !== null ?
|
|
12281
|
-
i !== null ?
|
|
12282
|
-
e !== null ?
|
|
12283
|
-
n !== null ?
|
|
12284
|
-
|
|
12285
|
-
]),
|
|
12311
|
+
]), ql = () => Ge("vtte"), e1 = (t, e, i, n, d) => Ge("vttc", void 0, [
|
|
12312
|
+
d !== null ? Ge("vsid", [d0(d)]) : null,
|
|
12313
|
+
i !== null ? Ge("iden", [...$t.encode(i)]) : null,
|
|
12314
|
+
e !== null ? Ge("ctim", [...$t.encode(nl(e))]) : null,
|
|
12315
|
+
n !== null ? Ge("sttg", [...$t.encode(n)]) : null,
|
|
12316
|
+
Ge("payl", [...$t.encode(t)])
|
|
12317
|
+
]), t1 = (t) => Ge("vtta", [...$t.encode(t)]), i1 = (t) => {
|
|
12286
12318
|
const e = [], i = t.format._options.metadataFormat ?? "auto", n = t.output._metadataTags;
|
|
12287
12319
|
if (i === "mdir" || i === "auto" && !t.isQuickTime) {
|
|
12288
|
-
const d =
|
|
12320
|
+
const d = n1(n);
|
|
12289
12321
|
d && e.push(d);
|
|
12290
12322
|
} else if (i === "mdta") {
|
|
12291
|
-
const d =
|
|
12323
|
+
const d = r1(n);
|
|
12292
12324
|
d && e.push(d);
|
|
12293
|
-
} else (i === "udta" || i === "auto" && t.isQuickTime) &&
|
|
12294
|
-
return e.length === 0 ? null :
|
|
12295
|
-
},
|
|
12296
|
-
for (const { key: i, value: n } of
|
|
12325
|
+
} else (i === "udta" || i === "auto" && t.isQuickTime) && s1(e, t.output._metadataTags);
|
|
12326
|
+
return e.length === 0 ? null : Ge("udta", void 0, e);
|
|
12327
|
+
}, s1 = (t, e) => {
|
|
12328
|
+
for (const { key: i, value: n } of fn(e))
|
|
12297
12329
|
switch (i) {
|
|
12298
12330
|
case "title":
|
|
12299
12331
|
t.push(Qt("©nam", n));
|
|
@@ -12331,27 +12363,27 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12331
12363
|
case "images":
|
|
12332
12364
|
break;
|
|
12333
12365
|
default:
|
|
12334
|
-
|
|
12366
|
+
yn(i);
|
|
12335
12367
|
}
|
|
12336
12368
|
if (e.raw)
|
|
12337
12369
|
for (const i in e.raw) {
|
|
12338
12370
|
const n = e.raw[i];
|
|
12339
|
-
n == null || i.length !== 4 || t.some((d) => d.type === i) || (typeof n == "string" ? t.push(Qt(i, n)) : n instanceof Uint8Array && t.push(
|
|
12371
|
+
n == null || i.length !== 4 || t.some((d) => d.type === i) || (typeof n == "string" ? t.push(Qt(i, n)) : n instanceof Uint8Array && t.push(Ge(i, Array.from(n))));
|
|
12340
12372
|
}
|
|
12341
12373
|
}, Qt = (t, e) => {
|
|
12342
12374
|
const i = $t.encode(e);
|
|
12343
|
-
return
|
|
12344
|
-
|
|
12345
|
-
|
|
12375
|
+
return Ge(t, [
|
|
12376
|
+
Se(i.length),
|
|
12377
|
+
Se(Ln("und")),
|
|
12346
12378
|
Array.from(i)
|
|
12347
12379
|
]);
|
|
12348
12380
|
}, zs = {
|
|
12349
12381
|
"image/jpeg": 13,
|
|
12350
12382
|
"image/png": 14,
|
|
12351
12383
|
"image/bmp": 27
|
|
12352
|
-
},
|
|
12384
|
+
}, Tn = (t, e) => {
|
|
12353
12385
|
const i = [];
|
|
12354
|
-
for (const { key: n, value: d } of
|
|
12386
|
+
for (const { key: n, value: d } of fn(t))
|
|
12355
12387
|
switch (n) {
|
|
12356
12388
|
case "title":
|
|
12357
12389
|
i.push({ key: e ? "title" : "©nam", value: Pt(d) });
|
|
@@ -12385,7 +12417,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12385
12417
|
break;
|
|
12386
12418
|
case "images":
|
|
12387
12419
|
for (const o of d)
|
|
12388
|
-
o.kind === "coverFront" && i.push({ key: "covr", value:
|
|
12420
|
+
o.kind === "coverFront" && i.push({ key: "covr", value: Ge("data", [
|
|
12389
12421
|
me(zs[o.mimeType] ?? 0),
|
|
12390
12422
|
// Type indicator
|
|
12391
12423
|
me(0),
|
|
@@ -12399,28 +12431,28 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12399
12431
|
const o = t.tracksTotal !== void 0 ? `${d}/${t.tracksTotal}` : d.toString();
|
|
12400
12432
|
i.push({ key: "track", value: Pt(o) });
|
|
12401
12433
|
} else
|
|
12402
|
-
i.push({ key: "trkn", value:
|
|
12434
|
+
i.push({ key: "trkn", value: Ge("data", [
|
|
12403
12435
|
me(0),
|
|
12404
12436
|
// 8 bytes empty
|
|
12405
12437
|
me(0),
|
|
12406
|
-
|
|
12438
|
+
Se(0),
|
|
12407
12439
|
// Empty
|
|
12408
|
-
|
|
12409
|
-
|
|
12410
|
-
|
|
12440
|
+
Se(d),
|
|
12441
|
+
Se(t.tracksTotal ?? 0),
|
|
12442
|
+
Se(0)
|
|
12411
12443
|
// Empty
|
|
12412
12444
|
]) });
|
|
12413
12445
|
break;
|
|
12414
12446
|
case "discNumber":
|
|
12415
|
-
e || i.push({ key: "disc", value:
|
|
12447
|
+
e || i.push({ key: "disc", value: Ge("data", [
|
|
12416
12448
|
me(0),
|
|
12417
12449
|
// 8 bytes empty
|
|
12418
12450
|
me(0),
|
|
12419
|
-
|
|
12451
|
+
Se(0),
|
|
12420
12452
|
// Empty
|
|
12421
|
-
|
|
12422
|
-
|
|
12423
|
-
|
|
12453
|
+
Se(d),
|
|
12454
|
+
Se(t.discsTotal ?? 0),
|
|
12455
|
+
Se(0)
|
|
12424
12456
|
// Empty
|
|
12425
12457
|
]) });
|
|
12426
12458
|
break;
|
|
@@ -12430,18 +12462,18 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12430
12462
|
case "raw":
|
|
12431
12463
|
break;
|
|
12432
12464
|
default:
|
|
12433
|
-
|
|
12465
|
+
yn(n);
|
|
12434
12466
|
}
|
|
12435
12467
|
if (t.raw)
|
|
12436
12468
|
for (const n in t.raw) {
|
|
12437
12469
|
const d = t.raw[n];
|
|
12438
|
-
d == null || !e && n.length !== 4 || i.some((o) => o.key === n) || (typeof d == "string" ? i.push({ key: n, value: Pt(d) }) : d instanceof Uint8Array ? i.push({ key: n, value:
|
|
12470
|
+
d == null || !e && n.length !== 4 || i.some((o) => o.key === n) || (typeof d == "string" ? i.push({ key: n, value: Pt(d) }) : d instanceof Uint8Array ? i.push({ key: n, value: Ge("data", [
|
|
12439
12471
|
me(0),
|
|
12440
12472
|
// Type indicator
|
|
12441
12473
|
me(0),
|
|
12442
12474
|
// Locale indicator
|
|
12443
12475
|
Array.from(d)
|
|
12444
|
-
]) }) : d instanceof
|
|
12476
|
+
]) }) : d instanceof Zn && i.push({ key: n, value: Ge("data", [
|
|
12445
12477
|
me(zs[d.mimeType] ?? 0),
|
|
12446
12478
|
// Type indicator
|
|
12447
12479
|
me(0),
|
|
@@ -12451,36 +12483,36 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12451
12483
|
]) }));
|
|
12452
12484
|
}
|
|
12453
12485
|
return i;
|
|
12454
|
-
},
|
|
12455
|
-
const e =
|
|
12486
|
+
}, n1 = (t) => {
|
|
12487
|
+
const e = Tn(t, !1);
|
|
12456
12488
|
return e.length === 0 ? null : Ye("meta", 0, 0, void 0, [
|
|
12457
12489
|
ss(!1, "mdir", "", "appl"),
|
|
12458
12490
|
// mdir handler
|
|
12459
|
-
|
|
12491
|
+
Ge("ilst", void 0, e.map((i) => Ge(i.key, void 0, [i.value])))
|
|
12460
12492
|
// Item list without keys box
|
|
12461
12493
|
]);
|
|
12462
|
-
},
|
|
12463
|
-
const e =
|
|
12464
|
-
return e.length === 0 ? null :
|
|
12494
|
+
}, r1 = (t) => {
|
|
12495
|
+
const e = Tn(t, !0);
|
|
12496
|
+
return e.length === 0 ? null : Ge("meta", void 0, [
|
|
12465
12497
|
ss(!1, "mdta", ""),
|
|
12466
12498
|
// mdta handler
|
|
12467
12499
|
Ye("keys", 0, 0, [
|
|
12468
12500
|
me(e.length)
|
|
12469
|
-
], e.map((i) =>
|
|
12501
|
+
], e.map((i) => Ge("mdta", [
|
|
12470
12502
|
...$t.encode(i.key)
|
|
12471
12503
|
]))),
|
|
12472
|
-
|
|
12504
|
+
Ge("ilst", void 0, e.map((i, n) => {
|
|
12473
12505
|
const d = String.fromCharCode(...me(n + 1));
|
|
12474
|
-
return
|
|
12506
|
+
return Ge(d, void 0, [i.value]);
|
|
12475
12507
|
}))
|
|
12476
12508
|
]);
|
|
12477
|
-
}, Pt = (t) =>
|
|
12509
|
+
}, Pt = (t) => Ge("data", [
|
|
12478
12510
|
me(1),
|
|
12479
12511
|
// Type indicator (UTF-8)
|
|
12480
12512
|
me(0),
|
|
12481
12513
|
// Locale indicator
|
|
12482
12514
|
...$t.encode(t)
|
|
12483
|
-
]),
|
|
12515
|
+
]), a1 = (t, e) => {
|
|
12484
12516
|
switch (t) {
|
|
12485
12517
|
case "avc":
|
|
12486
12518
|
return e.startsWith("avc3") ? "avc3" : "avc1";
|
|
@@ -12493,13 +12525,13 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12493
12525
|
case "av1":
|
|
12494
12526
|
return "av01";
|
|
12495
12527
|
}
|
|
12496
|
-
},
|
|
12497
|
-
avc:
|
|
12498
|
-
hevc:
|
|
12528
|
+
}, l1 = {
|
|
12529
|
+
avc: Rl,
|
|
12530
|
+
hevc: Tl,
|
|
12499
12531
|
vp8: Ps,
|
|
12500
12532
|
vp9: Ps,
|
|
12501
|
-
av1:
|
|
12502
|
-
},
|
|
12533
|
+
av1: Wl
|
|
12534
|
+
}, Wn = (t, e) => {
|
|
12503
12535
|
switch (t) {
|
|
12504
12536
|
case "aac":
|
|
12505
12537
|
return "mp4a";
|
|
@@ -12566,18 +12598,18 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12566
12598
|
case "pcm-f64be":
|
|
12567
12599
|
return "fpcm";
|
|
12568
12600
|
}
|
|
12569
|
-
},
|
|
12601
|
+
}, o1 = (t, e) => {
|
|
12570
12602
|
switch (t) {
|
|
12571
12603
|
case "aac":
|
|
12572
12604
|
return Ni;
|
|
12573
12605
|
case "mp3":
|
|
12574
12606
|
return Ni;
|
|
12575
12607
|
case "opus":
|
|
12576
|
-
return
|
|
12608
|
+
return Yl;
|
|
12577
12609
|
case "vorbis":
|
|
12578
12610
|
return Ni;
|
|
12579
12611
|
case "flac":
|
|
12580
|
-
return
|
|
12612
|
+
return wl;
|
|
12581
12613
|
}
|
|
12582
12614
|
if (e)
|
|
12583
12615
|
switch (t) {
|
|
@@ -12622,11 +12654,11 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12622
12654
|
return jt;
|
|
12623
12655
|
}
|
|
12624
12656
|
return null;
|
|
12625
|
-
}, o1 = {
|
|
12626
|
-
webvtt: "wvtt"
|
|
12627
12657
|
}, c1 = {
|
|
12628
|
-
webvtt:
|
|
12629
|
-
},
|
|
12658
|
+
webvtt: "wvtt"
|
|
12659
|
+
}, d1 = {
|
|
12660
|
+
webvtt: Ml
|
|
12661
|
+
}, Ln = (t) => {
|
|
12630
12662
|
ve(t.length === 3);
|
|
12631
12663
|
let e = 0;
|
|
12632
12664
|
for (let i = 0; i < 3; i++)
|
|
@@ -12640,7 +12672,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12640
12672
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
12641
12673
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
12642
12674
|
*/
|
|
12643
|
-
class
|
|
12675
|
+
class m1 {
|
|
12644
12676
|
constructor() {
|
|
12645
12677
|
this.ensureMonotonicity = !1, this.trackedWrites = null, this.trackedStart = -1, this.trackedEnd = -1;
|
|
12646
12678
|
}
|
|
@@ -12680,7 +12712,7 @@ class d1 {
|
|
|
12680
12712
|
}
|
|
12681
12713
|
}
|
|
12682
12714
|
const Pi = 2 ** 16, Ui = 2 ** 32;
|
|
12683
|
-
class
|
|
12715
|
+
class xn extends m1 {
|
|
12684
12716
|
constructor(e) {
|
|
12685
12717
|
if (super(), this.pos = 0, this.maxPos = 0, this.target = e, this.supportsResize = "resize" in new ArrayBuffer(0), this.supportsResize)
|
|
12686
12718
|
try {
|
|
@@ -12735,18 +12767,18 @@ class Ln extends d1 {
|
|
|
12735
12767
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
12736
12768
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
12737
12769
|
*/
|
|
12738
|
-
class
|
|
12770
|
+
class Hn {
|
|
12739
12771
|
constructor() {
|
|
12740
12772
|
this._output = null, this.onwrite = null;
|
|
12741
12773
|
}
|
|
12742
12774
|
}
|
|
12743
|
-
class
|
|
12775
|
+
class Yn extends Hn {
|
|
12744
12776
|
constructor() {
|
|
12745
12777
|
super(...arguments), this.buffer = null;
|
|
12746
12778
|
}
|
|
12747
12779
|
/** @internal */
|
|
12748
12780
|
_createWriter() {
|
|
12749
|
-
return new
|
|
12781
|
+
return new xn(this);
|
|
12750
12782
|
}
|
|
12751
12783
|
}
|
|
12752
12784
|
/*!
|
|
@@ -12756,22 +12788,22 @@ class Hn extends xn {
|
|
|
12756
12788
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
12757
12789
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
12758
12790
|
*/
|
|
12759
|
-
const ji = 1e3,
|
|
12791
|
+
const ji = 1e3, u1 = 2082844800, h1 = (t) => {
|
|
12760
12792
|
const e = {}, i = t.track;
|
|
12761
12793
|
return i.metadata.name !== void 0 && (e.name = i.metadata.name), e;
|
|
12762
12794
|
}, tt = (t, e, i = !0) => {
|
|
12763
12795
|
const n = t * e;
|
|
12764
12796
|
return i ? Math.round(n) : n;
|
|
12765
12797
|
};
|
|
12766
|
-
class
|
|
12798
|
+
class b1 extends Na {
|
|
12767
12799
|
constructor(e, i) {
|
|
12768
|
-
super(e), this.auxTarget = new
|
|
12769
|
-
const n = this.writer instanceof
|
|
12800
|
+
super(e), this.auxTarget = new Yn(), this.auxWriter = this.auxTarget._createWriter(), this.auxBoxWriter = new Ns(this.auxWriter), this.mdat = null, this.ftypSize = null, this.trackDatas = [], this.allTracksKnown = va(), this.creationTime = Math.floor(Date.now() / 1e3) + u1, this.finalizedChunks = [], this.nextFragmentNumber = 1, this.maxWrittenTimestamp = -1 / 0, this.format = i, this.writer = e._writer, this.boxWriter = new Ns(this.writer), this.isQuickTime = i instanceof kn;
|
|
12801
|
+
const n = this.writer instanceof xn ? "in-memory" : !1;
|
|
12770
12802
|
this.fastStart = i._options.fastStart ?? n, this.isFragmented = this.fastStart === "fragmented", (this.fastStart === "in-memory" || this.isFragmented) && (this.writer.ensureMonotonicity = !0), this.minimumFragmentDuration = i._options.minimumFragmentDuration ?? 1;
|
|
12771
12803
|
}
|
|
12772
12804
|
async start() {
|
|
12773
12805
|
const e = await this.mutex.acquire(), i = this.output._tracks.some((n) => n.type === "video" && n.source._codec === "avc");
|
|
12774
|
-
if (this.format._options.onFtyp && this.writer.startTrackingWrites(), this.boxWriter.writeBox(
|
|
12806
|
+
if (this.format._options.onFtyp && this.writer.startTrackingWrites(), this.boxWriter.writeBox(rl({
|
|
12775
12807
|
isQuickTime: this.isQuickTime,
|
|
12776
12808
|
holdsAvc: i,
|
|
12777
12809
|
fragmented: this.isFragmented
|
|
@@ -12797,7 +12829,7 @@ class h1 extends Ea {
|
|
|
12797
12829
|
const e = this.trackDatas.map((i) => i.type === "video" || i.type === "audio" ? i.info.decoderConfig.codec : {
|
|
12798
12830
|
webvtt: "wvtt"
|
|
12799
12831
|
}[i.track.source._codec]);
|
|
12800
|
-
return
|
|
12832
|
+
return sl({
|
|
12801
12833
|
isQuickTime: this.isQuickTime,
|
|
12802
12834
|
hasVideo: this.trackDatas.some((i) => i.type === "video"),
|
|
12803
12835
|
hasAudio: this.trackDatas.some((i) => i.type === "audio"),
|
|
@@ -12808,22 +12840,22 @@ class h1 extends Ea {
|
|
|
12808
12840
|
const d = this.trackDatas.find((W) => W.track === e);
|
|
12809
12841
|
if (d)
|
|
12810
12842
|
return d;
|
|
12811
|
-
|
|
12843
|
+
ga(n), ve(n), ve(n.decoderConfig);
|
|
12812
12844
|
const o = { ...n.decoderConfig };
|
|
12813
12845
|
ve(o.codedWidth !== void 0), ve(o.codedHeight !== void 0);
|
|
12814
12846
|
let m = !1;
|
|
12815
12847
|
if (e.source._codec === "avc" && !o.description) {
|
|
12816
|
-
const W =
|
|
12848
|
+
const W = Ua(i.data);
|
|
12817
12849
|
if (!W)
|
|
12818
12850
|
throw new Error("Couldn't extract an AVCDecoderConfigurationRecord from the AVC packet. Make sure the packets are in Annex B format (as specified in ITU-T-REC-H.264) when not providing a description, or provide a description (must be an AVCDecoderConfigurationRecord as specified in ISO 14496-15) and ensure the packets are in AVCC format.");
|
|
12819
|
-
o.description =
|
|
12851
|
+
o.description = za(W), m = !0;
|
|
12820
12852
|
} else if (e.source._codec === "hevc" && !o.description) {
|
|
12821
|
-
const W =
|
|
12853
|
+
const W = Oa(i.data);
|
|
12822
12854
|
if (!W)
|
|
12823
12855
|
throw new Error("Couldn't extract an HEVCDecoderConfigurationRecord from the HEVC packet. Make sure the packets are in Annex B format (as specified in ITU-T-REC-H.265) when not providing a description, or provide a description (must be an HEVCDecoderConfigurationRecord as specified in ISO 14496-15) and ensure the packets are in HEVC format.");
|
|
12824
|
-
o.description =
|
|
12856
|
+
o.description = tl(W), m = !0;
|
|
12825
12857
|
}
|
|
12826
|
-
const h =
|
|
12858
|
+
const h = Wa(1 / (e.metadata.frameRate ?? 57600), 1e6).denominator, S = {
|
|
12827
12859
|
muxer: this,
|
|
12828
12860
|
track: e,
|
|
12829
12861
|
type: "video",
|
|
@@ -12845,13 +12877,13 @@ class h1 extends Ea {
|
|
|
12845
12877
|
currentChunk: null,
|
|
12846
12878
|
compactlyCodedChunkTable: []
|
|
12847
12879
|
};
|
|
12848
|
-
return this.trackDatas.push(
|
|
12880
|
+
return this.trackDatas.push(S), this.trackDatas.sort((W, v) => W.track.id - v.track.id), this.allTracksAreKnown() && this.allTracksKnown.resolve(), S;
|
|
12849
12881
|
}
|
|
12850
12882
|
getAudioTrackData(e, i) {
|
|
12851
12883
|
const n = this.trackDatas.find((o) => o.track === e);
|
|
12852
12884
|
if (n)
|
|
12853
12885
|
return n;
|
|
12854
|
-
|
|
12886
|
+
Ja(i), ve(i), ve(i.decoderConfig);
|
|
12855
12887
|
const d = {
|
|
12856
12888
|
muxer: this,
|
|
12857
12889
|
track: e,
|
|
@@ -12880,7 +12912,7 @@ class h1 extends Ea {
|
|
|
12880
12912
|
const n = this.trackDatas.find((o) => o.track === e);
|
|
12881
12913
|
if (n)
|
|
12882
12914
|
return n;
|
|
12883
|
-
|
|
12915
|
+
Ea(i), ve(i), ve(i.config);
|
|
12884
12916
|
const d = {
|
|
12885
12917
|
muxer: this,
|
|
12886
12918
|
track: e,
|
|
@@ -12916,10 +12948,10 @@ class h1 extends Ea {
|
|
|
12916
12948
|
const W = ts(m);
|
|
12917
12949
|
if (W.length === 0)
|
|
12918
12950
|
throw new Error("Failed to transform packet data. Make sure all packets are provided in Annex B format, as specified in ITU-T-REC-H.264 and ITU-T-REC-H.265.");
|
|
12919
|
-
m =
|
|
12951
|
+
m = Pa(W, 4);
|
|
12920
12952
|
}
|
|
12921
|
-
const h = this.validateAndNormalizeTimestamp(o.track, i.timestamp, i.type === "key"),
|
|
12922
|
-
await this.registerSample(o,
|
|
12953
|
+
const h = this.validateAndNormalizeTimestamp(o.track, i.timestamp, i.type === "key"), S = this.createSampleForTrack(o, m, h, i.duration, i.type);
|
|
12954
|
+
await this.registerSample(o, S);
|
|
12923
12955
|
} finally {
|
|
12924
12956
|
d();
|
|
12925
12957
|
}
|
|
@@ -12936,7 +12968,7 @@ class h1 extends Ea {
|
|
|
12936
12968
|
async maybePadWithSilence(e, i) {
|
|
12937
12969
|
const n = Y0(e.samples), d = n ? n.timestamp + n.duration : 0, o = i - d, m = tt(o, e.timescale);
|
|
12938
12970
|
if (m > 0) {
|
|
12939
|
-
const { sampleSize: h, silentValue:
|
|
12971
|
+
const { sampleSize: h, silentValue: S } = D0(e.info.decoderConfig.codec), W = m * e.info.numberOfChannels, v = new Uint8Array(h * W).fill(S), Z = this.createSampleForTrack(e, new Uint8Array(v.buffer), d, o, "key");
|
|
12940
12972
|
await this.registerSample(e, Z);
|
|
12941
12973
|
}
|
|
12942
12974
|
}
|
|
@@ -12959,7 +12991,7 @@ class h1 extends Ea {
|
|
|
12959
12991
|
break;
|
|
12960
12992
|
if (e.lastCueEndTimestamp < o) {
|
|
12961
12993
|
this.auxWriter.seek(0);
|
|
12962
|
-
const W =
|
|
12994
|
+
const W = ql();
|
|
12963
12995
|
this.auxBoxWriter.writeBox(W);
|
|
12964
12996
|
const v = this.auxWriter.getSlice(0, this.auxWriter.getPos()), Z = this.createSampleForTrack(e, v, e.lastCueEndTimestamp, o - e.lastCueEndTimestamp, "key");
|
|
12965
12997
|
await this.registerSample(e, Z), e.lastCueEndTimestamp = o;
|
|
@@ -12973,14 +13005,14 @@ class h1 extends Ea {
|
|
|
12973
13005
|
const Z = Es.test(v.text), O = v.timestamp + v.duration;
|
|
12974
13006
|
let w = e.cueToSourceId.get(v);
|
|
12975
13007
|
if (w === void 0 && m < O && (w = e.nextSourceId++, e.cueToSourceId.set(v, w)), v.notes) {
|
|
12976
|
-
const J =
|
|
13008
|
+
const J = t1(v.notes);
|
|
12977
13009
|
this.auxBoxWriter.writeBox(J);
|
|
12978
13010
|
}
|
|
12979
|
-
const N =
|
|
13011
|
+
const N = e1(v.text, Z ? o : null, v.identifier ?? null, v.settings ?? null, w ?? null);
|
|
12980
13012
|
this.auxBoxWriter.writeBox(N), O === m && e.cueQueue.splice(W--, 1);
|
|
12981
13013
|
}
|
|
12982
|
-
const h = this.auxWriter.getSlice(0, this.auxWriter.getPos()),
|
|
12983
|
-
await this.registerSample(e,
|
|
13014
|
+
const h = this.auxWriter.getSlice(0, this.auxWriter.getPos()), S = this.createSampleForTrack(e, h, o, m - o, "key");
|
|
13015
|
+
await this.registerSample(e, S), e.lastCueEndTimestamp = m;
|
|
12984
13016
|
}
|
|
12985
13017
|
}
|
|
12986
13018
|
createSampleForTrack(e, i, n, d, o) {
|
|
@@ -13024,7 +13056,7 @@ class h1 extends Ea {
|
|
|
13024
13056
|
const m = tt(o.timestamp - o.decodeTimestamp, e.timescale), h = tt(o.duration, e.timescale);
|
|
13025
13057
|
if (e.lastTimescaleUnits !== null) {
|
|
13026
13058
|
ve(e.lastSample);
|
|
13027
|
-
const
|
|
13059
|
+
const S = tt(o.decodeTimestamp, e.timescale, !1), W = Math.round(S - e.lastTimescaleUnits);
|
|
13028
13060
|
if (ve(W >= 0), e.lastTimescaleUnits += W, e.lastSample.timescaleUnitsToNextSample = W, !this.isFragmented) {
|
|
13029
13061
|
let v = Y0(e.timeToSampleTable);
|
|
13030
13062
|
if (ve(v), v.sampleCount === 1) {
|
|
@@ -13139,12 +13171,12 @@ class h1 extends Ea {
|
|
|
13139
13171
|
}
|
|
13140
13172
|
}
|
|
13141
13173
|
const n = this.trackDatas.filter((w) => w.currentChunk), d = Us(i, n), o = this.writer.getPos(), m = o + this.boxWriter.measureBox(d);
|
|
13142
|
-
let h = m + Fi,
|
|
13174
|
+
let h = m + Fi, S = 1 / 0;
|
|
13143
13175
|
for (const w of n) {
|
|
13144
13176
|
w.currentChunk.offset = h, w.currentChunk.moofOffset = o;
|
|
13145
13177
|
for (const N of w.currentChunk.samples)
|
|
13146
13178
|
h += N.size;
|
|
13147
|
-
|
|
13179
|
+
S = Math.min(S, w.currentChunk.startTimestamp);
|
|
13148
13180
|
}
|
|
13149
13181
|
const W = h - m, v = W >= 2 ** 32;
|
|
13150
13182
|
if (v)
|
|
@@ -13154,7 +13186,7 @@ class h1 extends Ea {
|
|
|
13154
13186
|
const Z = Us(i, n);
|
|
13155
13187
|
if (this.boxWriter.writeBox(Z), this.format._options.onMoof) {
|
|
13156
13188
|
const { data: w, start: N } = this.writer.stopTrackingWrites();
|
|
13157
|
-
this.format._options.onMoof(w, N,
|
|
13189
|
+
this.format._options.onMoof(w, N, S);
|
|
13158
13190
|
}
|
|
13159
13191
|
ve(this.writer.getPos() === m), this.format._options.onMdat && this.writer.startTrackingWrites();
|
|
13160
13192
|
const O = ci(v);
|
|
@@ -13224,9 +13256,9 @@ class h1 extends Ea {
|
|
|
13224
13256
|
const o = U0(this), m = this.boxWriter.measureBox(o);
|
|
13225
13257
|
i = this.boxWriter.measureBox(this.mdat);
|
|
13226
13258
|
let h = this.writer.getPos() + m + i;
|
|
13227
|
-
for (const
|
|
13228
|
-
|
|
13229
|
-
for (const { data: W } of
|
|
13259
|
+
for (const S of this.finalizedChunks) {
|
|
13260
|
+
S.offset = h;
|
|
13261
|
+
for (const { data: W } of S.samples)
|
|
13230
13262
|
ve(W), h += W.byteLength, i += W.byteLength;
|
|
13231
13263
|
}
|
|
13232
13264
|
if (h < 2 ** 32)
|
|
@@ -13248,7 +13280,7 @@ class h1 extends Ea {
|
|
|
13248
13280
|
this.format._options.onMdat(d, o);
|
|
13249
13281
|
}
|
|
13250
13282
|
} else if (this.isFragmented) {
|
|
13251
|
-
const i = this.writer.getPos(), n =
|
|
13283
|
+
const i = this.writer.getPos(), n = Ql(this.trackDatas);
|
|
13252
13284
|
this.boxWriter.writeBox(n);
|
|
13253
13285
|
const d = this.writer.getPos() - i;
|
|
13254
13286
|
this.writer.seek(this.writer.getPos() - 4), this.boxWriter.writeU32(d);
|
|
@@ -13265,7 +13297,7 @@ class h1 extends Ea {
|
|
|
13265
13297
|
if (this.fastStart === "reserve") {
|
|
13266
13298
|
ve(this.ftypSize !== null), this.writer.seek(this.ftypSize), this.format._options.onMoov && this.writer.startTrackingWrites(), this.boxWriter.writeBox(d);
|
|
13267
13299
|
const o = this.boxWriter.offsets.get(this.mdat) - this.writer.getPos();
|
|
13268
|
-
this.boxWriter.writeBox(
|
|
13300
|
+
this.boxWriter.writeBox(al(o));
|
|
13269
13301
|
} else
|
|
13270
13302
|
this.format._options.onMoov && this.writer.startTrackingWrites(), this.boxWriter.writeBox(d);
|
|
13271
13303
|
if (this.format._options.onMoov) {
|
|
@@ -13283,7 +13315,7 @@ class h1 extends Ea {
|
|
|
13283
13315
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
13284
13316
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
13285
13317
|
*/
|
|
13286
|
-
class
|
|
13318
|
+
class wn {
|
|
13287
13319
|
/** Returns a list of video codecs that this output format can contain. */
|
|
13288
13320
|
getSupportedVideoCodecs() {
|
|
13289
13321
|
return this.getSupportedCodecs().filter((e) => O0.includes(e));
|
|
@@ -13302,7 +13334,7 @@ class Yn {
|
|
|
13302
13334
|
return "";
|
|
13303
13335
|
}
|
|
13304
13336
|
}
|
|
13305
|
-
class
|
|
13337
|
+
class Kn extends wn {
|
|
13306
13338
|
/** Internal constructor. */
|
|
13307
13339
|
constructor(e = {}) {
|
|
13308
13340
|
if (!e || typeof e != "object")
|
|
@@ -13337,10 +13369,10 @@ class wn extends Yn {
|
|
|
13337
13369
|
}
|
|
13338
13370
|
/** @internal */
|
|
13339
13371
|
_createMuxer(e) {
|
|
13340
|
-
return new
|
|
13372
|
+
return new b1(e, this);
|
|
13341
13373
|
}
|
|
13342
13374
|
}
|
|
13343
|
-
class
|
|
13375
|
+
class Mn extends Kn {
|
|
13344
13376
|
/** Creates a new {@link Mp4OutputFormat} configured with the specified `options`. */
|
|
13345
13377
|
constructor(e) {
|
|
13346
13378
|
super(e);
|
|
@@ -13358,7 +13390,7 @@ class Kn extends wn {
|
|
|
13358
13390
|
getSupportedCodecs() {
|
|
13359
13391
|
return [
|
|
13360
13392
|
...O0,
|
|
13361
|
-
...
|
|
13393
|
+
...Xn,
|
|
13362
13394
|
// These are supported via ISO/IEC 23003-5
|
|
13363
13395
|
"pcm-s16",
|
|
13364
13396
|
"pcm-s16be",
|
|
@@ -13375,10 +13407,10 @@ class Kn extends wn {
|
|
|
13375
13407
|
}
|
|
13376
13408
|
/** @internal */
|
|
13377
13409
|
_codecUnsupportedHint(e) {
|
|
13378
|
-
return new
|
|
13410
|
+
return new kn().getSupportedCodecs().includes(e) ? " Switching to MOV will grant support for this codec." : "";
|
|
13379
13411
|
}
|
|
13380
13412
|
}
|
|
13381
|
-
class
|
|
13413
|
+
class kn extends Kn {
|
|
13382
13414
|
/** Creates a new {@link MovOutputFormat} configured with the specified `options`. */
|
|
13383
13415
|
constructor(e) {
|
|
13384
13416
|
super(e);
|
|
@@ -13401,7 +13433,7 @@ class Mn extends wn {
|
|
|
13401
13433
|
}
|
|
13402
13434
|
/** @internal */
|
|
13403
13435
|
_codecUnsupportedHint(e) {
|
|
13404
|
-
return new
|
|
13436
|
+
return new Mn().getSupportedCodecs().includes(e) ? " Switching to MP4 will grant support for this codec." : "";
|
|
13405
13437
|
}
|
|
13406
13438
|
}
|
|
13407
13439
|
/*!
|
|
@@ -13457,7 +13489,7 @@ class ns {
|
|
|
13457
13489
|
return this._closingPromise ? this._closingPromise : this._flushAndClose(e);
|
|
13458
13490
|
}
|
|
13459
13491
|
}
|
|
13460
|
-
class
|
|
13492
|
+
class Bn extends ns {
|
|
13461
13493
|
/** Internal constructor. */
|
|
13462
13494
|
constructor(e) {
|
|
13463
13495
|
if (super(), this._connectedTrack = null, !O0.includes(e))
|
|
@@ -13465,7 +13497,7 @@ class kn extends ns {
|
|
|
13465
13497
|
this._codec = e;
|
|
13466
13498
|
}
|
|
13467
13499
|
}
|
|
13468
|
-
class
|
|
13500
|
+
class p1 extends Bn {
|
|
13469
13501
|
/** Creates a new {@link EncodedVideoPacketSource} whose packets are encoded using `codec`. */
|
|
13470
13502
|
constructor(e) {
|
|
13471
13503
|
super(e);
|
|
@@ -13490,7 +13522,7 @@ class b1 extends kn {
|
|
|
13490
13522
|
return this._ensureValidAdd(), this._connectedTrack.output._muxer.addEncodedVideoPacket(this._connectedTrack, e, i);
|
|
13491
13523
|
}
|
|
13492
13524
|
}
|
|
13493
|
-
class
|
|
13525
|
+
class Cn extends ns {
|
|
13494
13526
|
/** Internal constructor. */
|
|
13495
13527
|
constructor(e) {
|
|
13496
13528
|
if (super(), this._connectedTrack = null, !ui.includes(e))
|
|
@@ -13498,7 +13530,7 @@ class Bn extends ns {
|
|
|
13498
13530
|
this._codec = e;
|
|
13499
13531
|
}
|
|
13500
13532
|
}
|
|
13501
|
-
class
|
|
13533
|
+
class y1 extends Cn {
|
|
13502
13534
|
/** Creates a new {@link EncodedAudioPacketSource} whose packets are encoded using `codec`. */
|
|
13503
13535
|
constructor(e) {
|
|
13504
13536
|
super(e);
|
|
@@ -13522,7 +13554,7 @@ class p1 extends Bn {
|
|
|
13522
13554
|
return this._ensureValidAdd(), this._connectedTrack.output._muxer.addEncodedAudioPacket(this._connectedTrack, e, i);
|
|
13523
13555
|
}
|
|
13524
13556
|
}
|
|
13525
|
-
class
|
|
13557
|
+
class f1 extends ns {
|
|
13526
13558
|
/** Internal constructor. */
|
|
13527
13559
|
constructor(e) {
|
|
13528
13560
|
if (super(), this._connectedTrack = null, !hi.includes(e))
|
|
@@ -13537,27 +13569,27 @@ class y1 extends ns {
|
|
|
13537
13569
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
13538
13570
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
13539
13571
|
*/
|
|
13540
|
-
const
|
|
13572
|
+
const Z1 = ["video", "audio", "subtitle"], zi = (t) => {
|
|
13541
13573
|
if (!t || typeof t != "object")
|
|
13542
13574
|
throw new TypeError("metadata must be an object.");
|
|
13543
|
-
if (t.languageCode !== void 0 && !
|
|
13575
|
+
if (t.languageCode !== void 0 && !Ta(t.languageCode))
|
|
13544
13576
|
throw new TypeError("metadata.languageCode, when provided, must be a three-letter, ISO 639-2/T language code.");
|
|
13545
13577
|
if (t.name !== void 0 && typeof t.name != "string")
|
|
13546
13578
|
throw new TypeError("metadata.name, when provided, must be a string.");
|
|
13547
|
-
if (t.disposition !== void 0 &&
|
|
13579
|
+
if (t.disposition !== void 0 && Ha(t.disposition), t.maximumPacketCount !== void 0 && (!Number.isInteger(t.maximumPacketCount) || t.maximumPacketCount < 0))
|
|
13548
13580
|
throw new TypeError("metadata.maximumPacketCount, when provided, must be a non-negative integer.");
|
|
13549
13581
|
};
|
|
13550
|
-
class
|
|
13582
|
+
class X1 {
|
|
13551
13583
|
/**
|
|
13552
13584
|
* Creates a new instance of {@link Output} which can then be used to create a new media file according to the
|
|
13553
13585
|
* specified {@link OutputOptions}.
|
|
13554
13586
|
*/
|
|
13555
13587
|
constructor(e) {
|
|
13556
|
-
if (this.state = "pending", this._tracks = [], this._startPromise = null, this._cancelPromise = null, this._finalizePromise = null, this._mutex = new
|
|
13588
|
+
if (this.state = "pending", this._tracks = [], this._startPromise = null, this._cancelPromise = null, this._finalizePromise = null, this._mutex = new pn(), this._metadataTags = {}, !e || typeof e != "object")
|
|
13557
13589
|
throw new TypeError("options must be an object.");
|
|
13558
|
-
if (!(e.format instanceof
|
|
13590
|
+
if (!(e.format instanceof wn))
|
|
13559
13591
|
throw new TypeError("options.format must be an OutputFormat.");
|
|
13560
|
-
if (!(e.target instanceof
|
|
13592
|
+
if (!(e.target instanceof Hn))
|
|
13561
13593
|
throw new TypeError("options.target must be a Target.");
|
|
13562
13594
|
if (e.target._output)
|
|
13563
13595
|
throw new Error("Target is already used for another output.");
|
|
@@ -13565,7 +13597,7 @@ class Z1 {
|
|
|
13565
13597
|
}
|
|
13566
13598
|
/** Adds a video track to the output with the given source. Can only be called before the output is started. */
|
|
13567
13599
|
addVideoTrack(e, i = {}) {
|
|
13568
|
-
if (!(e instanceof
|
|
13600
|
+
if (!(e instanceof Bn))
|
|
13569
13601
|
throw new TypeError("source must be a VideoSource.");
|
|
13570
13602
|
if (zi(i), i.rotation !== void 0 && ![0, 90, 180, 270].includes(i.rotation))
|
|
13571
13603
|
throw new TypeError(`Invalid video rotation: ${i.rotation}. Has to be 0, 90, 180 or 270.`);
|
|
@@ -13577,13 +13609,13 @@ class Z1 {
|
|
|
13577
13609
|
}
|
|
13578
13610
|
/** Adds an audio track to the output with the given source. Can only be called before the output is started. */
|
|
13579
13611
|
addAudioTrack(e, i = {}) {
|
|
13580
|
-
if (!(e instanceof
|
|
13612
|
+
if (!(e instanceof Cn))
|
|
13581
13613
|
throw new TypeError("source must be an AudioSource.");
|
|
13582
13614
|
zi(i), this._addTrack("audio", e, i);
|
|
13583
13615
|
}
|
|
13584
13616
|
/** Adds a subtitle track to the output with the given source. Can only be called before the output is started. */
|
|
13585
13617
|
addSubtitleTrack(e, i = {}) {
|
|
13586
|
-
if (!(e instanceof
|
|
13618
|
+
if (!(e instanceof f1))
|
|
13587
13619
|
throw new TypeError("source must be a SubtitleSource.");
|
|
13588
13620
|
zi(i), this._addTrack("subtitle", e, i);
|
|
13589
13621
|
}
|
|
@@ -13594,7 +13626,7 @@ class Z1 {
|
|
|
13594
13626
|
* Can only be called before the output is started.
|
|
13595
13627
|
*/
|
|
13596
13628
|
setMetadataTags(e) {
|
|
13597
|
-
if (
|
|
13629
|
+
if (xa(e), this.state !== "pending")
|
|
13598
13630
|
throw new Error("Cannot set metadata tags after output has been started or canceled.");
|
|
13599
13631
|
this._metadataTags = e;
|
|
13600
13632
|
}
|
|
@@ -13610,33 +13642,33 @@ class Z1 {
|
|
|
13610
13642
|
const h = d.total.max;
|
|
13611
13643
|
if (this._tracks.length === h)
|
|
13612
13644
|
throw new Error(`${this.format._name} does not support more than ${h} tracks${h === 1 ? "" : "s"} in total.`);
|
|
13613
|
-
const
|
|
13645
|
+
const S = {
|
|
13614
13646
|
id: this._tracks.length + 1,
|
|
13615
13647
|
output: this,
|
|
13616
13648
|
type: e,
|
|
13617
13649
|
source: i,
|
|
13618
13650
|
metadata: n
|
|
13619
13651
|
};
|
|
13620
|
-
if (
|
|
13652
|
+
if (S.type === "video") {
|
|
13621
13653
|
const W = this.format.getSupportedVideoCodecs();
|
|
13622
13654
|
if (W.length === 0)
|
|
13623
|
-
throw new Error(`${this.format._name} does not support video tracks.` + this.format._codecUnsupportedHint(
|
|
13624
|
-
if (!W.includes(
|
|
13625
|
-
throw new Error(`Codec '${
|
|
13626
|
-
} else if (
|
|
13655
|
+
throw new Error(`${this.format._name} does not support video tracks.` + this.format._codecUnsupportedHint(S.source._codec));
|
|
13656
|
+
if (!W.includes(S.source._codec))
|
|
13657
|
+
throw new Error(`Codec '${S.source._codec}' cannot be contained within ${this.format._name}. Supported video codecs are: ${W.map((v) => `'${v}'`).join(", ")}.` + this.format._codecUnsupportedHint(S.source._codec));
|
|
13658
|
+
} else if (S.type === "audio") {
|
|
13627
13659
|
const W = this.format.getSupportedAudioCodecs();
|
|
13628
13660
|
if (W.length === 0)
|
|
13629
|
-
throw new Error(`${this.format._name} does not support audio tracks.` + this.format._codecUnsupportedHint(
|
|
13630
|
-
if (!W.includes(
|
|
13631
|
-
throw new Error(`Codec '${
|
|
13632
|
-
} else if (
|
|
13661
|
+
throw new Error(`${this.format._name} does not support audio tracks.` + this.format._codecUnsupportedHint(S.source._codec));
|
|
13662
|
+
if (!W.includes(S.source._codec))
|
|
13663
|
+
throw new Error(`Codec '${S.source._codec}' cannot be contained within ${this.format._name}. Supported audio codecs are: ${W.map((v) => `'${v}'`).join(", ")}.` + this.format._codecUnsupportedHint(S.source._codec));
|
|
13664
|
+
} else if (S.type === "subtitle") {
|
|
13633
13665
|
const W = this.format.getSupportedSubtitleCodecs();
|
|
13634
13666
|
if (W.length === 0)
|
|
13635
|
-
throw new Error(`${this.format._name} does not support subtitle tracks.` + this.format._codecUnsupportedHint(
|
|
13636
|
-
if (!W.includes(
|
|
13637
|
-
throw new Error(`Codec '${
|
|
13667
|
+
throw new Error(`${this.format._name} does not support subtitle tracks.` + this.format._codecUnsupportedHint(S.source._codec));
|
|
13668
|
+
if (!W.includes(S.source._codec))
|
|
13669
|
+
throw new Error(`Codec '${S.source._codec}' cannot be contained within ${this.format._name}. Supported subtitle codecs are: ${W.map((v) => `'${v}'`).join(", ")}.` + this.format._codecUnsupportedHint(S.source._codec));
|
|
13638
13670
|
}
|
|
13639
|
-
this._tracks.push(
|
|
13671
|
+
this._tracks.push(S), i._connectedTrack = S;
|
|
13640
13672
|
}
|
|
13641
13673
|
/**
|
|
13642
13674
|
* Starts the creation of the output file. This method should be called after all tracks have been added. Only after
|
|
@@ -13646,7 +13678,7 @@ class Z1 {
|
|
|
13646
13678
|
*/
|
|
13647
13679
|
async start() {
|
|
13648
13680
|
const e = this.format.getSupportedTrackCounts();
|
|
13649
|
-
for (const n of
|
|
13681
|
+
for (const n of Z1) {
|
|
13650
13682
|
const d = this._tracks.reduce((m, h) => m + (h.type === n ? 1 : 0), 0), o = e[n].min;
|
|
13651
13683
|
if (d < o)
|
|
13652
13684
|
throw new Error(o === e[n].max ? `${this.format._name} requires exactly ${o} ${n} track${o === 1 ? "" : "s"}.` : `${this.format._name} requires at least ${o} ${n} track${o === 1 ? "" : "s"}.`);
|
|
@@ -13707,19 +13739,19 @@ class Z1 {
|
|
|
13707
13739
|
})();
|
|
13708
13740
|
}
|
|
13709
13741
|
}
|
|
13710
|
-
class
|
|
13742
|
+
class K1 {
|
|
13711
13743
|
/**
|
|
13712
13744
|
* Create a new ExampleMuxer.
|
|
13713
13745
|
*
|
|
13714
13746
|
* @param type - Track type: 'video' (default) or 'audio'
|
|
13715
13747
|
*/
|
|
13716
13748
|
constructor(e) {
|
|
13717
|
-
this.type = e || "video", this.target = new
|
|
13718
|
-
const i = new
|
|
13719
|
-
format: new
|
|
13749
|
+
this.type = e || "video", this.target = new Yn();
|
|
13750
|
+
const i = new X1({
|
|
13751
|
+
format: new Mn(),
|
|
13720
13752
|
target: this.target
|
|
13721
13753
|
});
|
|
13722
|
-
this.started = !1, this.output = i, this.source = this.type === "video" ? new
|
|
13754
|
+
this.started = !1, this.output = i, this.source = this.type === "video" ? new p1("avc") : new y1("aac"), this.output.addVideoTrack(this.source), console.warn(
|
|
13723
13755
|
"⚠️ Demo/Learning Function: This utility is intended for demos and learning purposes only. For production use, please use a proper muxing library like MediaBunny (https://mediabunny.dev/) "
|
|
13724
13756
|
);
|
|
13725
13757
|
}
|
|
@@ -13744,17 +13776,18 @@ class Y1 {
|
|
|
13744
13776
|
}
|
|
13745
13777
|
}
|
|
13746
13778
|
export {
|
|
13747
|
-
|
|
13748
|
-
|
|
13749
|
-
|
|
13750
|
-
|
|
13751
|
-
|
|
13752
|
-
|
|
13753
|
-
L1 as
|
|
13754
|
-
|
|
13755
|
-
|
|
13756
|
-
|
|
13779
|
+
K1 as ExampleMuxer,
|
|
13780
|
+
I1 as GPUFrameRenderer,
|
|
13781
|
+
W1 as InMemoryStorage,
|
|
13782
|
+
R1 as MP3Decoder,
|
|
13783
|
+
V1 as MP3Encoder,
|
|
13784
|
+
T1 as MP4Demuxer,
|
|
13785
|
+
L1 as MediaStreamTrackProcessor,
|
|
13786
|
+
H1 as demuxAudio,
|
|
13787
|
+
Y1 as demuxVideo,
|
|
13788
|
+
En as extractChannels,
|
|
13789
|
+
w1 as getAudioChunks,
|
|
13757
13790
|
G1 as getBitrate,
|
|
13758
|
-
|
|
13759
|
-
|
|
13791
|
+
v1 as getCodecString,
|
|
13792
|
+
x1 as getVideoChunks
|
|
13760
13793
|
};
|