quickwin 2.0.0 → 2.1.1
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/README.en.md +21 -26
- package/README.md +3 -6
- package/examples/exec_server.js +139 -31
- package/examples/exec_server.tsx +7 -8
- package/examples/exec_server_worker.js +1 -1
- package/examples/exec_server_worker.ts +2 -2
- package/examples/pdf_preview2.js +1 -1
- package/examples/pdf_preview2.ts +1 -1
- package/examples/pdf_viewer.js +132 -28
- package/examples/pdf_viewer.tsx +1 -1
- package/examples/test_gallery.js +131 -27
- package/examples/test_react_lazy.js +131 -27
- package/examples/test_react_listbox.js +131 -27
- package/examples/test_root_window.js +131 -27
- package/examples/test_tab.js +131 -27
- package/lib/certs.js +13 -8
- package/lib/certs.ts +13 -8
- package/lib/fetch.js +51 -3
- package/lib/fetch.ts +38 -3
- package/lib/ffi/bind.js +94 -5
- package/lib/ffi/bind.ts +107 -10
- package/lib/ffi/ctype.js +33 -7
- package/lib/ffi/ctype.ts +48 -10
- package/lib/ffi/struct.js +92 -14
- package/lib/ffi/struct.ts +108 -19
- package/lib/react-qw/components/ListView.js +1 -0
- package/lib/react-qw/components/PathPicker.js +2 -2
- package/lib/react-qw/index.js +1 -1
- package/lib/react-qw/index.ts +4 -1
- package/lib/text-measure.js +3 -1
- package/lib/text-measure.ts +4 -3
- package/lib/websocket.js +32 -2
- package/lib/websocket.ts +25 -2
- package/lib/windows/advapi32.js +53 -0
- package/lib/windows/advapi32.ts +64 -0
- package/lib/windows/comctl32.js +15 -15
- package/lib/windows/comctl32.ts +15 -16
- package/lib/windows/comdlg32.js +3 -2
- package/lib/windows/comdlg32.ts +3 -2
- package/lib/windows/gdi32.js +328 -26
- package/lib/windows/gdi32.ts +349 -26
- package/lib/windows/kernel32.js +206 -10
- package/lib/windows/kernel32.ts +225 -10
- package/lib/windows/msimg32.js +38 -0
- package/lib/windows/msimg32.ts +45 -0
- package/lib/windows/ntdll.js +3 -2
- package/lib/windows/ntdll.ts +3 -2
- package/lib/windows/ole32.js +1 -1
- package/lib/windows/ole32.ts +1 -1
- package/lib/windows/psapi.js +32 -0
- package/lib/windows/psapi.ts +37 -0
- package/lib/windows/shell32.js +5 -3
- package/lib/windows/shell32.ts +5 -3
- package/lib/windows/structs.js +135 -0
- package/lib/windows/structs.ts +144 -0
- package/lib/windows/user32.js +202 -99
- package/lib/windows/user32.ts +204 -99
- package/lib/windows/version.js +29 -0
- package/lib/windows/version.ts +35 -0
- package/lib/windows/winspool.js +71 -0
- package/lib/windows/winspool.ts +80 -0
- package/package.json +1 -1
- package/quickwin.d.ts +11 -5
- package/quickwin_const.d.ts +136 -0
- package/qwin-nowasm-x86.exe +0 -0
- package/qwin-nowasm.exe +0 -0
- package/qwin-x86.exe +0 -0
- package/qwin.exe +0 -0
- package/test/run.js +7 -0
- package/test/run.ts +7 -0
- package/test/test_basic_fetch.js +21 -0
- package/test/test_basic_fetch.ts +17 -0
- package/test/test_ffi.js +6 -6
- package/test/test_ffi.ts +6 -6
- package/test/test_ffi_abi.js +55 -0
- package/test/test_ffi_abi.ts +56 -0
- package/test/test_ffi_array.js +116 -0
- package/test/test_ffi_array.ts +141 -0
- package/test/test_ffi_bind.js +82 -0
- package/test/test_ffi_bind.ts +71 -0
- package/test/test_files.js +102 -0
- package/test/test_files.ts +121 -0
- package/test/test_gdi_draw.js +681 -0
- package/test/test_gdi_draw.ts +725 -0
- package/test/test_net_fetch.js +4 -3
- package/test/test_net_fetch.ts +4 -3
- package/test/test_printer.js +137 -0
- package/test/test_printer.ts +148 -0
- package/test/test_proc.js +141 -0
- package/test/test_proc.ts +163 -0
- package/test/test_react_complex.js +131 -27
- package/test/test_react_counter.js +131 -27
- package/test/test_react_flex.js +131 -27
- package/test/test_react_hidden.js +131 -27
- package/test/test_react_listview_link.js +131 -27
- package/test/test_react_notify.js +131 -27
- package/test/test_react_render.js +131 -27
- package/test/test_registry.js +74 -0
- package/test/test_registry.ts +95 -0
- package/test/test_sysinfo.js +122 -0
- package/test/test_sysinfo.ts +141 -0
- package/test/test_wolfssl_read.js +45 -44
- package/test/test_wolfssl_read.ts +42 -42
package/examples/exec_server.js
CHANGED
|
@@ -19098,10 +19098,18 @@ var C_BASIC_TYPE = [
|
|
|
19098
19098
|
"f64",
|
|
19099
19099
|
"ptr"
|
|
19100
19100
|
];
|
|
19101
|
-
var PTR_TOKEN_RE = /^<([
|
|
19101
|
+
var PTR_TOKEN_RE = /^<([A-Za-z_]\w*|)>ptr(!|@[A-Za-z_]\w*)?$/;
|
|
19102
19102
|
function isCPtrToken(t2) {
|
|
19103
19103
|
return PTR_TOKEN_RE.test(t2);
|
|
19104
19104
|
}
|
|
19105
|
+
var VAL_TOKEN_RE = /^<([A-Za-z_]\w*)>$/;
|
|
19106
|
+
function isCValToken(t2) {
|
|
19107
|
+
return VAL_TOKEN_RE.test(t2);
|
|
19108
|
+
}
|
|
19109
|
+
function valName(t2) {
|
|
19110
|
+
const m2 = VAL_TOKEN_RE.exec(t2);
|
|
19111
|
+
return m2?.[1] || "";
|
|
19112
|
+
}
|
|
19105
19113
|
function ptrName(t2) {
|
|
19106
19114
|
const m2 = PTR_TOKEN_RE.exec(t2);
|
|
19107
19115
|
return m2?.[1] || "";
|
|
@@ -19109,8 +19117,9 @@ function ptrName(t2) {
|
|
|
19109
19117
|
var cTokenToType = (t2) => {
|
|
19110
19118
|
if (isCPtrToken(t2))
|
|
19111
19119
|
return "ptr";
|
|
19112
|
-
|
|
19113
|
-
|
|
19120
|
+
if (isCValToken(t2))
|
|
19121
|
+
throw new Error(`ffi: cTokenToType: by-value token "${t2}" has no scalar slot type`);
|
|
19122
|
+
return t2;
|
|
19114
19123
|
};
|
|
19115
19124
|
var PTR_SIZE = os2.arch === "x64" ? 8 : 4;
|
|
19116
19125
|
var SizeAlign = {
|
|
@@ -19129,8 +19138,12 @@ var NULL = 0;
|
|
|
19129
19138
|
function normToken(t2) {
|
|
19130
19139
|
if (isCPtrToken(t2)) {
|
|
19131
19140
|
const m2 = PTR_TOKEN_RE.exec(t2);
|
|
19132
|
-
|
|
19141
|
+
const name = m2?.[1] || "";
|
|
19142
|
+
const mod = m2?.[2];
|
|
19143
|
+
return mod?.startsWith("@") ? `<${name}>ptr` : t2;
|
|
19133
19144
|
}
|
|
19145
|
+
if (isCValToken(t2))
|
|
19146
|
+
return t2;
|
|
19134
19147
|
const at2 = t2.indexOf("@");
|
|
19135
19148
|
const base = at2 >= 0 ? t2.slice(0, at2) : t2;
|
|
19136
19149
|
const suffixOk = at2 < 0 || /^[A-Za-z_]\w*$/.test(t2.slice(at2 + 1));
|
|
@@ -19226,6 +19239,9 @@ var PtrArrayBuffer = class extends ArrayBuffer {
|
|
|
19226
19239
|
};
|
|
19227
19240
|
|
|
19228
19241
|
// _build/lib/ffi/bind.js
|
|
19242
|
+
function valCodec(name, encoders) {
|
|
19243
|
+
return encoders[name];
|
|
19244
|
+
}
|
|
19229
19245
|
var _dllCache = /* @__PURE__ */ new Map();
|
|
19230
19246
|
function loadDll(dll) {
|
|
19231
19247
|
const cached = _dllCache.get(dll);
|
|
@@ -19251,14 +19267,27 @@ function parseSig(sig) {
|
|
|
19251
19267
|
}
|
|
19252
19268
|
argTokens.push(tok);
|
|
19253
19269
|
}
|
|
19270
|
+
const retToken = normToken(parts[1]);
|
|
19271
|
+
if (isCValToken(retToken))
|
|
19272
|
+
throw new Error(`ffi-bind: "${sig}": by-value struct at the return position (<${valName(retToken)}>) is not supported \u2014 argument positions only; pass a struct out through an out-param slot instead (<N>ptr + caller buffer)`);
|
|
19254
19273
|
return {
|
|
19255
19274
|
argTokens,
|
|
19256
|
-
retToken
|
|
19275
|
+
retToken,
|
|
19257
19276
|
sig
|
|
19258
19277
|
};
|
|
19259
19278
|
}
|
|
19260
19279
|
function makeFn(proc, sig, encoders, decoders) {
|
|
19261
19280
|
const ps = parseSig(sig);
|
|
19281
|
+
for (const t2 of ps.argTokens) {
|
|
19282
|
+
if (!isCValToken(t2))
|
|
19283
|
+
continue;
|
|
19284
|
+
const name = valName(t2);
|
|
19285
|
+
const codec = valCodec(name, encoders);
|
|
19286
|
+
if (!codec || typeof codec.encode !== "function")
|
|
19287
|
+
throw new Error(`ffi-bind: ${sig}: by-value position <${name}> has no registered layout (available: ${Object.keys(encoders).join(", ") || "none"})`);
|
|
19288
|
+
if (typeof codec.size !== "number" || codec.size < 1)
|
|
19289
|
+
throw new Error(`ffi-bind: ${sig}: by-value position <${name}> requires a struct layout with size >= 1 (got ${codec.size}; non-struct codecs expose no size)`);
|
|
19290
|
+
}
|
|
19262
19291
|
return (...a2) => callPacked(proc, ps, a2, encoders, decoders);
|
|
19263
19292
|
}
|
|
19264
19293
|
var IA32_ARG_SIZE = {
|
|
@@ -19278,15 +19307,29 @@ var X64_MIN_SLOTS = 4;
|
|
|
19278
19307
|
function callPacked(proc, { argTokens, retToken, sig }, args, encoders, decoders) {
|
|
19279
19308
|
const is64 = os3.arch === "x64";
|
|
19280
19309
|
const getWidth = (t2, is642) => {
|
|
19310
|
+
if (isCValToken(t2))
|
|
19311
|
+
throw new Error(`ffi-bind: getWidth: by-value token "${t2}" (dispatched by widthOf)`);
|
|
19281
19312
|
if (is642)
|
|
19282
19313
|
return 8;
|
|
19283
19314
|
if (isCPtrToken(t2))
|
|
19284
19315
|
return PTR_SIZE;
|
|
19285
19316
|
return IA32_ARG_SIZE[t2];
|
|
19286
19317
|
};
|
|
19318
|
+
const widthOf = (t2) => {
|
|
19319
|
+
if (isCValToken(t2)) {
|
|
19320
|
+
if (is64)
|
|
19321
|
+
return 8;
|
|
19322
|
+
const layout = valCodec(valName(t2), encoders);
|
|
19323
|
+
if (!layout)
|
|
19324
|
+
throw new Error(`ffi-bind: <${valName(t2)}> by-value position has no registered layout`);
|
|
19325
|
+
const size = layout.size;
|
|
19326
|
+
return size % 4 === 0 ? size : size + 4 - size % 4;
|
|
19327
|
+
}
|
|
19328
|
+
return getWidth(t2, is64);
|
|
19329
|
+
};
|
|
19287
19330
|
let total = 0;
|
|
19288
19331
|
for (const t2 of argTokens)
|
|
19289
|
-
total +=
|
|
19332
|
+
total += widthOf(t2);
|
|
19290
19333
|
if (is64 && argTokens.length < X64_MIN_SLOTS)
|
|
19291
19334
|
total = X64_MIN_SLOTS * 8;
|
|
19292
19335
|
const argFrame = new ArrayBuffer(total);
|
|
@@ -19323,10 +19366,28 @@ function callPacked(proc, { argTokens, retToken, sig }, args, encoders, decoders
|
|
|
19323
19366
|
throw new Error(`ffi-bind: ${sig}: arg#${i2 + 1} <${name}>ptr! encode produced 0 (null pointer forbidden here)`);
|
|
19324
19367
|
writeSlot(dv, off, { k: "ptr", v: p2 });
|
|
19325
19368
|
}
|
|
19369
|
+
} else if (isCValToken(argToken)) {
|
|
19370
|
+
const name = valName(argToken);
|
|
19371
|
+
const codec = valCodec(name, encoders);
|
|
19372
|
+
if (!codec)
|
|
19373
|
+
throw new Error(`ffi-bind: ${sig}: arg#${i2 + 1} <${name}> by-value position has no registered layout`);
|
|
19374
|
+
if (arg === null || arg === void 0)
|
|
19375
|
+
throw new Error(`ffi-bind: <${name}> value position got ${String(arg)}; pass a struct object (use <${name}>ptr to pass a pointer)`);
|
|
19376
|
+
const size = codec.size;
|
|
19377
|
+
if (!is64 || size <= 8 && (size & size - 1) === 0) {
|
|
19378
|
+
codec.encode(arg, argFrame, off);
|
|
19379
|
+
} else {
|
|
19380
|
+
const buf = new ArrayBuffer(size + 15);
|
|
19381
|
+
const base = ffi.bufferPtr(buf);
|
|
19382
|
+
const pad = (16 - base % 16) % 16;
|
|
19383
|
+
codec.encode(arg, buf, pad);
|
|
19384
|
+
held.push(buf);
|
|
19385
|
+
writeSlot(dv, off, { k: "ptr", v: base + pad });
|
|
19386
|
+
}
|
|
19326
19387
|
} else {
|
|
19327
19388
|
writeSlot(dv, off, { k: argToken, v: arg });
|
|
19328
19389
|
}
|
|
19329
|
-
off +=
|
|
19390
|
+
off += widthOf(argToken);
|
|
19330
19391
|
}
|
|
19331
19392
|
const retBuf = new ArrayBuffer(8);
|
|
19332
19393
|
const retIsFp = retToken === "f32" || retToken === "f64";
|
|
@@ -19717,21 +19778,20 @@ function createStruct(t2) {
|
|
|
19717
19778
|
size,
|
|
19718
19779
|
structAlign: maxEffectiveAlign,
|
|
19719
19780
|
decode: (p2) => {
|
|
19720
|
-
if (typeof p2 === "number")
|
|
19721
|
-
|
|
19722
|
-
const u8 = new Uint8Array(buf);
|
|
19723
|
-
for (let i2 = 0; i2 < size; i2++)
|
|
19724
|
-
u8[i2] = ffi2.readByte(p2 + i2);
|
|
19725
|
-
return doDecode(new DataView(buf), 0, fields);
|
|
19726
|
-
}
|
|
19781
|
+
if (typeof p2 === "number")
|
|
19782
|
+
return doDecode(new DataView(ffi2.readBytes(p2, size)), 0, fields);
|
|
19727
19783
|
return doDecode(new DataView(p2), 0, fields);
|
|
19728
19784
|
},
|
|
19729
|
-
alloc: (() =>
|
|
19730
|
-
|
|
19785
|
+
alloc: ((n2) => {
|
|
19786
|
+
if (n2 !== void 0 && (!Number.isInteger(n2) || n2 < 1))
|
|
19787
|
+
throw new Error(`ffi-struct: alloc(n) requires an integer n >= 1 (PAB(0) never escapes \u2014 pass NULL for an empty pointer position)`);
|
|
19788
|
+
return new PtrArrayBuffer(size * (n2 ?? 1));
|
|
19789
|
+
}),
|
|
19790
|
+
encode: ((v2, buf, offset) => {
|
|
19731
19791
|
if (v2 === void 0 || v2 === null)
|
|
19732
19792
|
throw new Error(`ffi-struct: encode(v) requires an argument; use alloc() for a zeroed out-param slot`);
|
|
19733
19793
|
const out = buf ?? new PtrArrayBuffer(size);
|
|
19734
|
-
doEncode(new DataView(out), 0, fields, v2);
|
|
19794
|
+
doEncode(new DataView(out), offset ?? 0, fields, v2);
|
|
19735
19795
|
return out;
|
|
19736
19796
|
}),
|
|
19737
19797
|
offsetOf: (name) => {
|
|
@@ -19751,6 +19811,49 @@ function buildDecl(kind, member, pack) {
|
|
|
19751
19811
|
decl[k2] = v2;
|
|
19752
19812
|
return decl;
|
|
19753
19813
|
}
|
|
19814
|
+
function structArray(def) {
|
|
19815
|
+
const { fields, size } = computeStructLayout(def.__struct);
|
|
19816
|
+
const readN = (dv, n2) => {
|
|
19817
|
+
const out = [];
|
|
19818
|
+
for (let i2 = 0; i2 < n2; i2++)
|
|
19819
|
+
out.push(doDecode(dv, i2 * size, fields));
|
|
19820
|
+
return out;
|
|
19821
|
+
};
|
|
19822
|
+
return {
|
|
19823
|
+
encode: (els) => {
|
|
19824
|
+
if (!Array.isArray(els) || els.length === 0)
|
|
19825
|
+
throw new Error(`ffi-struct: structArray(def).encode(els) requires a non-empty element array (pass NULL for an empty pointer position)`);
|
|
19826
|
+
const out = def.alloc(els.length);
|
|
19827
|
+
for (let i2 = 0; i2 < els.length; i2++)
|
|
19828
|
+
def.encode(els[i2], out, i2 * def.size);
|
|
19829
|
+
return out;
|
|
19830
|
+
},
|
|
19831
|
+
decode: ((p2, count) => {
|
|
19832
|
+
if (count !== void 0 && (!Number.isInteger(count) || count < 0))
|
|
19833
|
+
throw new Error(`ffi-struct: structArray.decode(p, count) requires a non-negative integer count, got ${count}`);
|
|
19834
|
+
if (typeof p2 === "number") {
|
|
19835
|
+
if (count === void 0)
|
|
19836
|
+
throw new Error(`ffi-struct: structArray.decode(address, count) requires an explicit count (a bare address carries no length)`);
|
|
19837
|
+
if (count === 0)
|
|
19838
|
+
return [];
|
|
19839
|
+
return readN(new DataView(ffi2.readBytes(p2, count * size)), count);
|
|
19840
|
+
}
|
|
19841
|
+
let n2;
|
|
19842
|
+
if (count !== void 0) {
|
|
19843
|
+
n2 = count;
|
|
19844
|
+
if (n2 * size > p2.byteLength)
|
|
19845
|
+
throw new Error(`ffi-struct: structArray.decode: count ${n2} \xD7 size ${size} = ${n2 * size} exceeds buffer byteLength ${p2.byteLength}`);
|
|
19846
|
+
} else {
|
|
19847
|
+
if (p2.byteLength % size !== 0)
|
|
19848
|
+
throw new Error(`ffi-struct: structArray.decode: byteLength ${p2.byteLength} is not a multiple of size ${size} (mixed buffer? pass count explicitly)`);
|
|
19849
|
+
n2 = p2.byteLength / size;
|
|
19850
|
+
}
|
|
19851
|
+
if (n2 === 0)
|
|
19852
|
+
return [];
|
|
19853
|
+
return readN(new DataView(p2), n2);
|
|
19854
|
+
})
|
|
19855
|
+
};
|
|
19856
|
+
}
|
|
19754
19857
|
function struct(a2, b7, c2) {
|
|
19755
19858
|
const isNamed = typeof a2 === "string";
|
|
19756
19859
|
const raw = isNamed ? b7 : a2;
|
|
@@ -20000,11 +20103,12 @@ import * as os5 from "os";
|
|
|
20000
20103
|
|
|
20001
20104
|
// _build/lib/windows/gdi32.js
|
|
20002
20105
|
var b3 = (name, sig, encoders) => bind2("gdi32.dll", name, sig, encoders);
|
|
20003
|
-
var
|
|
20106
|
+
var POINTArr = structArray(POINT);
|
|
20107
|
+
var DeleteObject = /* @__PURE__ */ b3("DeleteObject", "<HGDIOBJ>ptr -> i32");
|
|
20004
20108
|
var GetDeviceCaps = /* @__PURE__ */ b3("GetDeviceCaps", "<HDC>ptr! i32@DeviceCap -> i32");
|
|
20005
|
-
var CreateFontIndirect = /* @__PURE__ */ b3("CreateFontIndirectW", "<LOGFONTW>ptr ->
|
|
20006
|
-
var SelectObject = /* @__PURE__ */ b3("SelectObject", "<HDC>ptr!
|
|
20007
|
-
var GetObject = /* @__PURE__ */ b3("GetObjectW", "
|
|
20109
|
+
var CreateFontIndirect = /* @__PURE__ */ b3("CreateFontIndirectW", "<LOGFONTW>ptr -> <HGDIOBJ>ptr", { LOGFONTW });
|
|
20110
|
+
var SelectObject = /* @__PURE__ */ b3("SelectObject", "<HDC>ptr! <HGDIOBJ>ptr -> <HGDIOBJ>ptr");
|
|
20111
|
+
var GetObject = /* @__PURE__ */ b3("GetObjectW", "<HGDIOBJ>ptr i32 <BYTE>ptr -> i32");
|
|
20008
20112
|
|
|
20009
20113
|
// _build/lib/react-qw/props.js
|
|
20010
20114
|
import * as gui from "gui";
|
|
@@ -20151,7 +20255,7 @@ function measureTextForHwnd(hwnd, text) {
|
|
|
20151
20255
|
if (!hdc)
|
|
20152
20256
|
return { width: 0, height: 0 };
|
|
20153
20257
|
const hFont = gui2.SendMessage(hwnd, 49, 0, 0);
|
|
20154
|
-
const oldFont = hFont ? SelectObject(hdc, hFont) :
|
|
20258
|
+
const oldFont = hFont ? SelectObject(hdc, hFont) : NULL;
|
|
20155
20259
|
const result = measureText(hdc, text, 0);
|
|
20156
20260
|
if (hFont)
|
|
20157
20261
|
SelectObject(hdc, oldFont);
|
|
@@ -21536,11 +21640,11 @@ var import_react17 = __toESM(require_react(), 1);
|
|
|
21536
21640
|
|
|
21537
21641
|
// _build/lib/windows/comdlg32.js
|
|
21538
21642
|
var b4 = (name, sig) => bind2("comdlg32.dll", name, sig);
|
|
21539
|
-
var GetOpenFileName = /* @__PURE__ */ b4("GetOpenFileNameW", "<
|
|
21643
|
+
var GetOpenFileName = /* @__PURE__ */ b4("GetOpenFileNameW", "<OPENFILENAMEW>ptr -> u32");
|
|
21540
21644
|
|
|
21541
21645
|
// _build/lib/windows/shell32.js
|
|
21542
21646
|
var b5 = (name, sig) => bind2("shell32.dll", name, sig);
|
|
21543
|
-
var SHBrowseForFolder = /* @__PURE__ */ b5("SHBrowseForFolderW", "<
|
|
21647
|
+
var SHBrowseForFolder = /* @__PURE__ */ b5("SHBrowseForFolderW", "<BROWSEINFOW>ptr -> <>ptr");
|
|
21544
21648
|
var SHGetPathFromIDList = /* @__PURE__ */ b5("SHGetPathFromIDListW", "<>ptr <BYTE>ptr -> u32");
|
|
21545
21649
|
|
|
21546
21650
|
// _build/lib/windows/ole32.js
|
|
@@ -21565,7 +21669,7 @@ function openFileDialog(owner, filter, title, multiple) {
|
|
|
21565
21669
|
lpstrTitle: titleWide?.ptr ?? 0,
|
|
21566
21670
|
Flags: flags
|
|
21567
21671
|
});
|
|
21568
|
-
const ret = GetOpenFileName(ofn);
|
|
21672
|
+
const ret = GetOpenFileName(ofn.ptr);
|
|
21569
21673
|
if (!ret)
|
|
21570
21674
|
return null;
|
|
21571
21675
|
if (!multiple) {
|
|
@@ -21583,7 +21687,7 @@ function openFolderDialog(owner, title) {
|
|
|
21583
21687
|
lpszTitle: titleWide?.ptr ?? 0,
|
|
21584
21688
|
ulFlags: 65
|
|
21585
21689
|
});
|
|
21586
|
-
const pidl = SHBrowseForFolder(bi);
|
|
21690
|
+
const pidl = SHBrowseForFolder(bi.ptr);
|
|
21587
21691
|
if (!pidl)
|
|
21588
21692
|
return null;
|
|
21589
21693
|
const pathBuf = WCHAR.alloc(260);
|
|
@@ -21678,7 +21782,7 @@ function createRoot(container) {
|
|
|
21678
21782
|
} else {
|
|
21679
21783
|
hwnd = container;
|
|
21680
21784
|
}
|
|
21681
|
-
const root = reconciler_default.createContainer(hwnd, 0, null, false, null, "",
|
|
21785
|
+
const root = reconciler_default.createContainer(hwnd, 0, null, false, null, "", (error, info) => console.log("[React uncaught]", error, error.stack, info.componentStack), (error, info) => console.log("[React caught]", error, error.stack, info.componentStack), (error, info) => console.log("[React recoverable]", error, error.stack, info.componentStack), noop);
|
|
21682
21786
|
const rootInst = { hwnd, type: "_root", props: { type: "_root", style: { flexDirection: "column", alignItems: "stretch" } }, children: [] };
|
|
21683
21787
|
instancesByHwnd.set(hwnd, rootInst);
|
|
21684
21788
|
if (typeof container === "object")
|
|
@@ -21700,15 +21804,19 @@ function parseArgs() {
|
|
|
21700
21804
|
let gui19 = true;
|
|
21701
21805
|
let token = null;
|
|
21702
21806
|
const args = typeof scriptArgs === "undefined" ? [] : scriptArgs;
|
|
21807
|
+
const normToken2 = (v2) => v2 === "" ? null : v2;
|
|
21703
21808
|
for (let i2 = 0; i2 < args.length; i2++) {
|
|
21704
21809
|
const a2 = args[i2] ?? "";
|
|
21705
21810
|
if (a2 === "--nogui") {
|
|
21706
21811
|
gui19 = false;
|
|
21812
|
+
} else if (a2 === "--gui") {
|
|
21813
|
+
gui19 = (args[++i2] ?? "") !== "0";
|
|
21707
21814
|
} else if (a2.startsWith("--gui=")) {
|
|
21708
21815
|
gui19 = a2.slice(6) !== "0";
|
|
21816
|
+
} else if (a2 === "--token") {
|
|
21817
|
+
token = normToken2(args[++i2] ?? "");
|
|
21709
21818
|
} else if (a2.startsWith("--token=")) {
|
|
21710
|
-
|
|
21711
|
-
token = v2 === "" ? null : v2;
|
|
21819
|
+
token = normToken2(a2.slice(8));
|
|
21712
21820
|
}
|
|
21713
21821
|
}
|
|
21714
21822
|
return { gui: gui19, token };
|
|
@@ -21806,7 +21914,7 @@ function authCheck(req) {
|
|
|
21806
21914
|
}
|
|
21807
21915
|
function runInWorker(cmd, signal, timeoutMs) {
|
|
21808
21916
|
const spawnCmd = cmd;
|
|
21809
|
-
const worker = new os6.Worker("data:text/javascript;base64,aW1wb3J0KmFzIGllIGZyb20ib3MiO2ltcG9ydCphcyBzZSBmcm9tInN0ZCI7aW1wb3J0KmFzIHkgZnJvbSJmZmkiO2ltcG9ydCphcyBRIGZyb20ib3MiO2ltcG9ydCphcyBZIGZyb20ic3RkIjtpbXBvcnQqYXMgdiBmcm9tIndpbiI7dmFyIGZlPXsidXRmLTgiOiJ1dGYtOCIsdXRmODoidXRmLTgiLCJ1bmljb2RlLTEtMS11dGYtOCI6InV0Zi04IiwidXRmLTE2IjoidXRmLTE2bGUiLCJ1dGYtMTZsZSI6InV0Zi0xNmxlIiwidXRmLTE2YmUiOiJ1dGYtMTZiZSJ9O2Z1bmN0aW9uIFR0KHQpe2lmKCF0KXJldHVybiJ1dGYtOCI7bGV0IGU9ZmVbdC50cmltKCkudG9Mb3dlckNhc2UoKV07aWYoZSlyZXR1cm4gZTt0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVGhlIGVuY29kaW5nIGxhYmVsICIke3R9IiBpcyBub3Qgc3VwcG9ydGVkYCl9ZnVuY3Rpb24gZGUodCxlKXtsZXQgcj0iIjtmb3IobGV0IG49MDtuPHQubGVuZ3RoOyl7bGV0IG89dFtuKytdO2lmKG88MTI4KXtyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG8pO2NvbnRpbnVlfWlmKG88MTkyKXtyKz1lPygoKT0+e3Rocm93IG5ldyBUeXBlRXJyb3IoInVuZXhwZWN0ZWQgY29udGludWF0aW9uIGJ5dGUiKX0pKCk6Ilx1RkZGRCI7Y29udGludWV9bGV0IGksYztpZihvPDIyNCl7aWYobj49dC5sZW5ndGgpe3IrPWU/KCgpPT57dGhyb3cgbmV3IFR5cGVFcnJvcigiaW5jb21wbGV0ZSB1dGYtOCIpfSkoKToiXHVGRkZEIjticmVha31sZXQgcz10W24rK107aWYoKHMmMTkyKSE9PTEyOCl7cis9Ilx1RkZGRCI7Y29udGludWV9aT0obyYzMSk8PDZ8cyY2MyxjPTEyOH1lbHNlIGlmKG88MjQwKXtpZihuKzE+PXQubGVuZ3RoKXtyKz1lPygoKT0+e3Rocm93IG5ldyBUeXBlRXJyb3IoImluY29tcGxldGUgdXRmLTgiKX0pKCk6Ilx1RkZGRCI7YnJlYWt9bGV0IHM9dFtuKytdLHA9dFtuKytdO2lmKChzJjE5MikhPT0xMjh8fChwJjE5MikhPT0xMjgpe3IrPSJcdUZGRkQiO2NvbnRpbnVlfWk9KG8mMTUpPDwxMnwocyY2Myk8PDZ8cCY2MyxjPTIwNDh9ZWxzZSBpZihvPDI0OCl7aWYobisyPj10Lmxlbmd0aCl7cis9ZT8oKCk9Pnt0aHJvdyBuZXcgVHlwZUVycm9yKCJpbmNvbXBsZXRlIHV0Zi04Iil9KSgpOiJcdUZGRkQiO2JyZWFrfWxldCBzPXRbbisrXSxwPXRbbisrXSxhPXRbbisrXTtpZigocyYxOTIpIT09MTI4fHwocCYxOTIpIT09MTI4fHwoYSYxOTIpIT09MTI4KXtyKz0iXHVGRkZEIjtjb250aW51ZX1pPShvJjcpPDwxOHwocyY2Myk8PDEyfChwJjYzKTw8NnxhJjYzLGM9NjU1MzZ9ZWxzZXtyKz1lPygoKT0+e3Rocm93IG5ldyBUeXBlRXJyb3IoImludmFsaWQgdXRmLTggc3RhcnQiKX0pKCk6Ilx1RkZGRCI7Y29udGludWV9aWYoaTxjfHxpPj01NTI5NiYmaTw9NTczNDN8fGk+MTExNDExMSl7cis9ZT8oKCk9Pnt0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnZhbGlkIHV0Zi04IGNvZGVwb2ludCIpfSkoKToiXHVGRkZEIjtjb250aW51ZX1pPD02NTUzNT9yKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGkpOihpLT02NTUzNixyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2fGk+PjEwLDU2MzIwfGkmMTAyMykpfXJldHVybiByfWZ1bmN0aW9uIHdlKHQsZSxyKXtsZXQgbj1uZXcgRGF0YVZpZXcodC5idWZmZXIsdC5ieXRlT2Zmc2V0LHQuYnl0ZUxlbmd0aCksbz0iIjtmb3IobGV0IGk9MDtpKzE8dC5sZW5ndGg7aSs9Mil7bGV0IGM9bi5nZXRVaW50MTYoaSxlKTtpZihjPj01NTI5NiYmYzw9NTYzMTkpe2lmKGkrPTIsaSsxPj10Lmxlbmd0aCl7bys9cj8oKCk9Pnt0aHJvdyBuZXcgVHlwZUVycm9yKCJ0cnVuY2F0ZWQgc3Vycm9nYXRlIHBhaXIiKX0pKCk6Ilx1RkZGRCI7YnJlYWt9bGV0IHM9bi5nZXRVaW50MTYoaSxlKTtzPj01NjMyMCYmczw9NTczNDM/bys9U3RyaW5nLmZyb21DaGFyQ29kZShjLHMpOihvKz1yPygoKT0+e3Rocm93IG5ldyBUeXBlRXJyb3IoImludmFsaWQgc3Vycm9nYXRlIHBhaXIiKX0pKCk6Ilx1RkZGRCIsaS09Mil9ZWxzZSBjPj01NjMyMCYmYzw9NTczNDM/bys9cj8oKCk9Pnt0aHJvdyBuZXcgVHlwZUVycm9yKCJ1bmV4cGVjdGVkIHRyYWlsaW5nIHN1cnJvZ2F0ZSIpfSkoKToiXHVGRkZEIjpvKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGMpfXJldHVybiBvfXZhciBvdD1jbGFzc3tfZW5jb2Rpbmc7X2ZhdGFsO19pZ25vcmVCT007Y29uc3RydWN0b3IoZSxyKXt0aGlzLl9lbmNvZGluZz1UdChlKSx0aGlzLl9mYXRhbD1yPy5mYXRhbD8/ITEsdGhpcy5faWdub3JlQk9NPXI/Lmlnbm9yZUJPTT8/ITF9Z2V0IGVuY29kaW5nKCl7cmV0dXJuIHRoaXMuX2VuY29kaW5nfWdldCBmYXRhbCgpe3JldHVybiB0aGlzLl9mYXRhbH1nZXQgaWdub3JlQk9NKCl7cmV0dXJuIHRoaXMuX2lnbm9yZUJPTX1kZWNvZGUoZSl7aWYoIWUpcmV0dXJuIiI7bGV0IHI9ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXk/ZTplIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI/bmV3IFVpbnQ4QXJyYXkoZSk6bmV3IFVpbnQ4QXJyYXkoZS5idWZmZXIsZS5ieXRlT2Zmc2V0LGUuYnl0ZUxlbmd0aCk7aWYodGhpcy5fZW5jb2Rpbmc9PT0idXRmLTgiKXJldHVybiBkZShyLHRoaXMuX2ZhdGFsKTtsZXQgbj10aGlzLl9lbmNvZGluZz09PSJ1dGYtMTZsZSIsbz0wO2lmKHIubGVuZ3RoPj0yJiYhdGhpcy5faWdub3JlQk9NKXtsZXQgaT1uP3JbMF06clsxXSxzPShuP3JbMV06clswXSk8PDh8aTsocz09PTY1Mjc5fHxzPT09NjU1MzQpJiYobz0yKX1yZXR1cm4gd2Uoci5zbGljZShvKSxuLHRoaXMuX2ZhdGFsKX19LGl0PWNsYXNze19lbmNvZGluZztjb25zdHJ1Y3RvcihlKXt0aGlzLl9lbmNvZGluZz1UdChlKX1nZXQgZW5jb2RpbmcoKXtyZXR1cm4gdGhpcy5fZW5jb2Rpbmd9ZW5jb2RlKGUpe2lmKCFlKXJldHVybiBuZXcgVWludDhBcnJheSgwKTtpZih0aGlzLl9lbmNvZGluZz09PSJ1dGYtOCIpe2xldCBpPVtdO2ZvcihsZXQgYz0wO2M8ZS5sZW5ndGg7YysrKXtsZXQgcz1lLmNoYXJDb2RlQXQoYyk7aWYoczwxMjgpaS5wdXNoKHMpO2Vsc2UgaWYoczwyMDQ4KWkucHVzaCgxOTJ8cz4+NiwxMjh8cyY2Myk7ZWxzZSBpZihzPDU1Mjk2fHxzPj01NzM0NClpLnB1c2goMjI0fHM+PjEyLDEyOHxzPj42JjYzLDEyOHxzJjYzKTtlbHNle2MrKztsZXQgcD1lLmNoYXJDb2RlQXQoYyk7cz02NTUzNisoKHMmMTAyMyk8PDEwKXxwJjEwMjMsaS5wdXNoKDI0MHxzPj4xOCwxMjh8cz4+MTImNjMsMTI4fHM+PjYmNjMsMTI4fHMmNjMpfX1yZXR1cm4gbmV3IFVpbnQ4QXJyYXkoaSl9bGV0IHI9dGhpcy5fZW5jb2Rpbmc9PT0idXRmLTE2bGUiLG49bmV3IEFycmF5QnVmZmVyKGUubGVuZ3RoKjIpLG89bmV3IERhdGFWaWV3KG4pO2ZvcihsZXQgaT0wO2k8ZS5sZW5ndGg7aSsrKW8uc2V0VWludDE2KGkqMixlLmNoYXJDb2RlQXQoaSkscik7cmV0dXJuIG5ldyBVaW50OEFycmF5KG4pfX07dHlwZW9mIGdsb2JhbFRoaXMuVGV4dERlY29kZXI+InUiJiYoZ2xvYmFsVGhpcy5UZXh0RGVjb2Rlcj1vdCk7dHlwZW9mIGdsb2JhbFRoaXMuVGV4dEVuY29kZXI+InUiJiYoZ2xvYmFsVGhpcy5UZXh0RW5jb2Rlcj1pdCk7aW1wb3J0e2J1ZmZlclB0ciBhcyB4ZX1mcm9tImZmaSI7aW1wb3J0KmFzIEl0IGZyb20ib3MiO3ZhciBtZT1bInZvaWQiLCJ1OCIsImk4IiwidTE2IiwiaTE2IiwidTMyIiwiaTMyIiwidTY0IiwiaTY0IiwiZjMyIiwiZjY0IiwicHRyIl0sc3Q9L148KFtePD5cc10qKT5wdHIoIXxAW0EtWmEtel9dXHcqKT8kLztmdW5jdGlvbiBPKHQpe3JldHVybiBzdC50ZXN0KHQpfWZ1bmN0aW9uIGN0KHQpe3JldHVybiBzdC5leGVjKHQpPy5bMV18fCIifXZhciBxPXQ9Pk8odCk/InB0ciI6dCxSPUl0LmFyY2g9PT0ieDY0Ij84OjQsVT17dTg6MSxpODoxLHUxNjoyLGkxNjoyLHUzMjo0LGkzMjo0LHU2NDo4LGk2NDo4LGYzMjo0LGY2NDo4fSxUPTA7ZnVuY3Rpb24gXyh0KXtpZihPKHQpKXtsZXQgbz1zdC5leGVjKHQpO3JldHVybiBvPy5bMl0/LnN0YXJ0c1dpdGgoIkAiKT9gPCR7b1sxXX0+cHRyYDp0fWxldCBlPXQuaW5kZXhPZigiQCIpLHI9ZT49MD90LnNsaWNlKDAsZSk6dDtpZigoZTwwfHwvXltBLVphLXpfXVx3KiQvLnRlc3QodC5zbGljZShlKzEpKSkmJnIhPT0icHRyIiYmbWUuaW5jbHVkZXMocikpcmV0dXJuIHI7dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIHRva2VuOiAiK3QpfWZ1bmN0aW9uIHoodCxlLHIpe3N3aXRjaChyKXtjYXNlInU4IjpyZXR1cm4gdC5nZXRVaW50OChlKTtjYXNlImk4IjpyZXR1cm4gdC5nZXRJbnQ4KGUpO2Nhc2UidTE2IjpyZXR1cm4gdC5nZXRVaW50MTYoZSwhMCk7Y2FzZSJpMTYiOnJldHVybiB0LmdldEludDE2KGUsITApO2Nhc2UidTMyIjpyZXR1cm4gdC5nZXRVaW50MzIoZSwhMCk7Y2FzZSJpMzIiOnJldHVybiB0LmdldEludDMyKGUsITApO2Nhc2UidTY0IjpyZXR1cm4gdC5nZXRCaWdVaW50NjQoZSwhMCk7Y2FzZSJpNjQiOnJldHVybiB0LmdldEJpZ0ludDY0KGUsITApO2Nhc2UiZjMyIjpyZXR1cm4gdC5nZXRGbG9hdDMyKGUsITApO2Nhc2UiZjY0IjpyZXR1cm4gdC5nZXRGbG9hdDY0KGUsITApO2Nhc2UicHRyIjpyZXR1cm4gUj09PTg/TnVtYmVyKHQuZ2V0QmlnSW50NjQoZSwhMCkpOnQuZ2V0SW50MzIoZSwhMCl9fWZ1bmN0aW9uIHB0KHQsZSx7azpyLHY6bn0pe3N3aXRjaChyKXtjYXNlInU4Ijp0LnNldFVpbnQ4KGUsTnVtYmVyKG4pKTticmVhaztjYXNlImk4Ijp0LnNldEludDgoZSxOdW1iZXIobikpO2JyZWFrO2Nhc2UidTE2Ijp0LnNldFVpbnQxNihlLE51bWJlcihuKSwhMCk7YnJlYWs7Y2FzZSJpMTYiOnQuc2V0SW50MTYoZSxOdW1iZXIobiksITApO2JyZWFrO2Nhc2UidTMyIjp0LnNldFVpbnQzMihlLG4+Pj4wLCEwKTticmVhaztjYXNlImkzMiI6dC5zZXRVaW50MzIoZSxuPj4+MCwhMCk7YnJlYWs7Y2FzZSJ1NjQiOnQuc2V0QmlnVWludDY0KGUsbiwhMCk7YnJlYWs7Y2FzZSJpNjQiOnQuc2V0QmlnSW50NjQoZSxuLCEwKTticmVhaztjYXNlImYzMiI6dC5zZXRGbG9hdDMyKGUsbiwhMCk7YnJlYWs7Y2FzZSJmNjQiOnQuc2V0RmxvYXQ2NChlLG4sITApO2JyZWFrO2Nhc2UicHRyIjp7aWYobj09bnVsbCl0aHJvdyBuZXcgRXJyb3IoImZmaTogZ290IG51bGwvdW5kZWZpbmVkIGZvciBhIHB0ciBzbG90OyBwYXNzIHRoZSBpbXBvcnRlZCBOVUxMIGNvbnN0YW50IGZvciBlbXB0eSIpO1I9PT04P3Quc2V0QmlnVWludDY0KGUsQmlnSW50LmFzVWludE4oNjQsQmlnSW50KG4pKSwhMCk6dC5zZXRVaW50MzIoZSxuPj4+MCwhMCk7YnJlYWt9fX1mdW5jdGlvbiBWKHQsZSxyKXtsZXR7azpuLHY6b309cjtpZihuPT09InU4Inx8bj09PSJpOCJ8fG49PT0idTE2Inx8bj09PSJpMTYiKXt0LnNldFVpbnQzMihlLE51bWJlcihvKT4+PjAsITApO3JldHVybn1wdCh0LGUscil9dmFyIEQ9Y2xhc3MgZXh0ZW5kcyBBcnJheUJ1ZmZlcntwdHI7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5wdHI9eGUodGhpcyl9fTt2YXIgTnQ9bmV3IE1hcDtmdW5jdGlvbiBoZSh0KXtsZXQgZT1OdC5nZXQodCk7aWYoZSE9PXZvaWQgMClyZXR1cm4gZTtsZXQgcj12LkxvYWRMaWJyYXJ5KHQpO2lmKCFyKXRocm93IG5ldyBFcnJvcihgZmZpLWJpbmQ6IExvYWRMaWJyYXJ5KCIke3R9IikgZmFpbGVkYCk7cmV0dXJuIE50LnNldCh0LHIpLHJ9ZnVuY3Rpb24gSHQodCl7bGV0IGU9dC5zcGxpdCgiIC0+ICIpO2lmKGUubGVuZ3RoIT09Mil0aHJvdyBuZXcgRXJyb3IoYGZmaS1iaW5kOiBpbnZhbGlkIHNpZ25hdHVyZSAiJHt0fSIgKGV4cGVjdGVkICJhcmcxIGFyZzIgLT4gcmV0IilgKTtsZXQgcj1lWzBdLnNwbGl0KCIgIikuZmlsdGVyKG89Pm8hPT0iIiksbj1bXTtmb3IobGV0IG8gb2Ygcil7bGV0IGk9XyhvKTtpZihpPT09InZvaWQiKXRocm93IG5ldyBFcnJvcigiVm9pZCBjYW4gbm90IGluIGFyZ3MiKTtuLnB1c2goaSl9cmV0dXJue2FyZ1Rva2VuczpuLHJldFRva2VuOl8oZVsxXSksc2lnOnR9fWZ1bmN0aW9uIGdlKHQsZSxyLG4pe2xldCBvPUh0KGUpO3JldHVybiguLi5pKT0+Q2UodCxvLGkscixuKX12YXIgYXQ9e3U4OjQsaTg6NCx1MTY6NCxpMTY6NCx1MzI6NCxpMzI6NCx1NjQ6OCxpNjQ6OCxmMzI6NCxmNjQ6OCxwdHI6Un0seXQ9NDtmdW5jdGlvbiBDZSh0LHthcmdUb2tlbnM6ZSxyZXRUb2tlbjpyLHNpZzpufSxvLGksYyl7bGV0IHM9US5hcmNoPT09Ing2NCIscD0oeCxoKT0+aD84Ok8oeCk/UjphdFt4XSxhPTA7Zm9yKGxldCB4IG9mIGUpYSs9cCh4LHMpO3MmJmUubGVuZ3RoPHl0JiYoYT15dCo4KTtsZXQgdT1uZXcgQXJyYXlCdWZmZXIoYSksZj1uZXcgRGF0YVZpZXcodSksbD1bXSxtPTA7Zm9yKGxldCB4PTA7eDxlLmxlbmd0aDt4Kyspe2xldCBoPWVbeF0sSD1oLmVuZHNXaXRoKCIhIiksZz1vW3hdO2lmKE8oaCkpe2xldCBiPWN0KGgpO2lmKHR5cGVvZiBnPT0ibnVtYmVyIil7aWYoSCYmZz09PTApdGhyb3cgbmV3IEVycm9yKGBmZmktYmluZDogJHtufTogYXJnIyR7eCsxfSA8JHtifT5wdHIhIGdvdCAwIChudWxsIHBvaW50ZXIgZm9yYmlkZGVuIGhlcmU7IHRoZSB0b2tlbiBtYXJrcyB0aGlzIHBvc2l0aW9uIG5vbi1udWxsKWApO1YoZixtLHtrOiJwdHIiLHY6Z30pfWVsc2V7aWYoZz09bnVsbCl0aHJvdyBuZXcgRXJyb3IoYGZmaS1iaW5kOiA8JHtifT5wdHIgZ290ICR7U3RyaW5nKGcpfTsgcGFzcyB0aGUgaW1wb3J0ZWQgTlVMTCBjb25zdGFudCBmb3IgYW4gZW1wdHkgcG9pbnRlcmApO2xldCBXPWlbYl07aWYoIVcpdGhyb3cgbmV3IEVycm9yKGI9PT0iIj9gZmZpLWJpbmQ6IDw+cHRyIGV4cGVjdHMgbnVtYmVyIChOVUxMIHwgUHRyKSwgZ290ICR7dHlwZW9mIGd9OyB1c2UgPEJZVEU+cHRyIHdpdGggYSBQdHJBcnJheUJ1ZmZlciAobmV3IFB0ckFycmF5QnVmZmVyKG4pKSwgb3IgZmZpLmJ1ZmZlclB0cihidWYpIGZvciBhbiBhZGRyZXNzYDpgZmZpLWJpbmQ6IHVua25vd24gbGF5b3V0ICI8JHtifT5wdHIiIChhdmFpbGFibGU6ICR7T2JqZWN0LmtleXMoaSkuam9pbigiLCAiKXx8Im5vbmUifSlgKTtpZighVy5lbmNvZGUpdGhyb3cgbmV3IEVycm9yKGBmZmktYmluZDogPCR7Yn0+cHRyIGhhcyBubyBlbmNvZGVyIChvdXQtb25seSBjb2RlYylgKTtsZXQgTj1XLmVuY29kZShnKTtsLnB1c2goTik7bGV0IEc9Ti5wdHI7aWYodHlwZW9mIEchPSJudW1iZXIiKXRocm93IG5ldyBFcnJvcigiZmZpLWJpbmQ6IGNvZGVjLmVuY29kZSBtdXN0IHJldHVybiBhIFB0ckFycmF5QnVmZmVyLCBnb3QgcGxhaW4gQXJyYXlCdWZmZXIiKTtpZihIJiZHPT09MCl0aHJvdyBuZXcgRXJyb3IoYGZmaS1iaW5kOiAke259OiBhcmcjJHt4KzF9IDwke2J9PnB0ciEgZW5jb2RlIHByb2R1Y2VkIDAgKG51bGwgcG9pbnRlciBmb3JiaWRkZW4gaGVyZSlgKTtWKGYsbSx7azoicHRyIix2Okd9KX19ZWxzZSBWKGYsbSx7azpoLHY6Z30pO20rPXAoaCxzKX1sZXQgZD1uZXcgQXJyYXlCdWZmZXIoOCk7eS5mZmlDYWxsKHQsdSxkLHI9PT0iZjMyInx8cj09PSJmNjQiPzE6MCk7bGV0IHc9U2UocShyKSxkKTtpZihyLmVuZHNXaXRoKCIhIikmJnc9PT0wKXRocm93IG5ldyBFcnJvcihgZmZpLWJpbmQ6ICR7bn06IHJldHVybiAke3J9IGdvdCAwICh0aGUgdG9rZW4gcHJvbWlzZXMgQyBuZXZlciByZXR1cm5zIG51bGwgaGVyZSlgKTtpZihPKHIpJiZ3IT09MCl7bGV0IHg9Y3Qocik7aWYoeCE9PSIiKXtsZXQgaD1jW3hdO2lmKGg/LmRlY29kZSlyZXR1cm4gaC5kZWNvZGUodyl9fXJldHVybiB3fWZ1bmN0aW9uIFNlKHQsZSl7aWYodCE9PSJ2b2lkIilyZXR1cm4geihuZXcgRGF0YVZpZXcoZSksMCx0KX12YXIgUD17ZW5jb2RlOnQ9PntsZXQgZT1uZXcgVGV4dEVuY29kZXIoInV0Zi0xNmxlIikuZW5jb2RlKHQrIlwwIikscj1uZXcgRChlLmJ5dGVMZW5ndGgpO3JldHVybiBuZXcgVWludDhBcnJheShyKS5zZXQoZSkscn0sZGVjb2RlOnQ9PntpZih0eXBlb2YgdD09Im51bWJlciIpe2xldCBvPSIiLGk9dCxjPWk7Zm9yKDs7KXtsZXQgcz15LnJlYWRCeXRlKGkpLHA9eS5yZWFkQnl0ZShpKzEpO2lmKHM9PT0wJiZwPT09MClyZXR1cm4gbztpZihvKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHN8cDw8OCksaSs9MixpLWM+MTw8MjEpdGhyb3cgbmV3IEVycm9yKCJmZmktYmluZDogV0NIQVIgZGVjb2RlIGV4Y2VlZGVkIDRNaUIgd2l0aG91dCBOVUwiKX19bGV0IGU9bmV3IFVpbnQ4QXJyYXkodCkscj1lLmxlbmd0aCYtMixuPSIiO2ZvcihsZXQgbz0wO288cjtvKz0yKXtsZXQgaT1lW29dfGVbbysxXTw8ODtpZihpPT09MClyZXR1cm4gbjtuKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGkpfXJldHVybiBufSxhbGxvYzoodD0yNTYpPT5uZXcgRCh0KjIpfSxiZT17ZW5jb2RlOnQ9PntpZighKHQgaW5zdGFuY2VvZiBEKSl0aHJvdyBuZXcgRXJyb3IoImZmaS1iaW5kOiA8QllURT5wdHIgd2FudHMgYSBQdHJBcnJheUJ1ZmZlciAobmV3IFB0ckFycmF5QnVmZmVyKG4pIC8gQllURS5hbGxvYyAvIHN0cnVjdC5lbmNvZGUpLCBub3QgYSBwbGFpbiBBcnJheUJ1ZmZlciIpO3JldHVybiB0fSxhbGxvYzp0PT5uZXcgRCh0KX0sRnQ9e1dDSEFSOlAsQllURTpiZX07ZnVuY3Rpb24gQSh0LGUscixuLG8pe2xldCBpPXYuR2V0UHJvY0FkZHJlc3MoaGUodCksZSk7aWYoIWkpdGhyb3cgbmV3IEVycm9yKGBmZmktYmluZDogcHJvYyAiJHtlfSIgbm90IGZvdW5kIGluICR7dH1gKTtsZXQgYz1vPz9uO3JldHVybiBnZShpLHIsey4uLkZ0LC4uLm59LHsuLi5GdCwuLi5jPz97fX0pfXZhciBNdD1uZXcgRmluYWxpemF0aW9uUmVnaXN0cnkodD0+e1kucHJpbnRmKGBbZmZpXSBjbG9zdXJlIGxlYWtlZCAoR0NlZCB3aXRob3V0IGRpc3Bvc2UpOiBzaWc9IiVzIiBwdHI9MHgleApgLHQuc2lnLHQucHRyKX0pO2Z1bmN0aW9uIFdlKHQsZSxyLG4sbyxpKXtsZXQgYz1uZXcgRGF0YVZpZXcobykscz1RLmFyY2g9PT0ieDY0IixwPW5ldyBEYXRhVmlldyhuKSxhPVtdLHU9MDtmb3IobGV0IGw9MDtsPHQubGVuZ3RoO2wrKyl7bGV0IG09dFtsXSxkPW0udG9rLFM7aWYocyl7bGV0IHg9ZD09PSJmMzIifHxkPT09ImY2NCI/bDw0PzEyOCtsKjg6MzIrKGwtNCkqODpsPDQ/bCo4OjMyKyhsLTQpKjg7Uz16KHAseCxkKX1lbHNlIFM9eihwLHUsZCksdSs9YXRbZF07aWYobS5ub25udWxsJiZTPT09MCl7WS5wcmludGYoYFtmZmldIGNsb3N1cmUgJXM6IGFyZyMlZCBnb3QgMCAoISBwcm9taXNlIHZpb2xhdGVkIGJ5IGNhbGxlciksIHNraXBwaW5nIGNhbGxiYWNrCmAsaSxsKzEpO3JldHVybn1hLnB1c2goUyl9bGV0IGY7dHJ5e2Y9ciguLi5hKX1jYXRjaChsKXtZLnByaW50ZihgW2ZmaV0gY2xvc3VyZSBjYWxsYmFjayB0aHJldzogJXMKYCxTdHJpbmcobCkpO3JldHVybn1pZihlLm5vbm51bGwmJmY9PT0wKXtZLnByaW50ZihgW2ZmaV0gY2xvc3VyZSAlczogcmV0dXJuIGdvdCAwICghIHByb21pc2UgdmlvbGF0ZWQgYnkgY2FsbGJhY2spLCBsZWF2aW5nIHJlc3VsdCBzbG90IDAKYCxpKTtyZXR1cm59ZS50b2shPT0idm9pZCImJlYoYywwLHtrOmUudG9rLHY6Zn0pfWZ1bmN0aW9uIE90KHQsZSxyKXtsZXR7YXJnVG9rZW5zOm4scmV0VG9rZW46b309SHQodCksaT1uLm1hcCh3PT4oe3RvazpxKHcpLG5vbm51bGw6dy5lbmRzV2l0aCgiISIpfSkpLGM9e3RvazpxKG8pLG5vbm51bGw6by5lbmRzV2l0aCgiISIpfSxzPVEuYXJjaD09PSJ4NjQiLHA9aS5yZWR1Y2UoKHcseCk9PncrYXRbeC50b2tdLDApO2lmKHM/aS5sZW5ndGg+MTY6cD42NCl0aHJvdyBuZXcgRXJyb3IoYGZmaS1iaW5kOiBjbG9zdXJlIHNpZ25hdHVyZSBleGNlZWRzIGNhcHR1cmUgd2luZG93ICgke3M/Im1heCAxNiBwYXJhbXMiOiJtYXggNjQgc3RhY2sgYnl0ZXMifSk6ICR7dH1gKTtsZXQgYT1yPy5zdGRjYWxsPT09ITF8fHM/MDpwLHU9Yy50b2s9PT0iZjMyIj8xOmMudG9rPT09ImY2NCI/MjpjLnRvaz09PSJ1NjQifHxjLnRvaz09PSJpNjQiPzM6MCxsPXkuY2xvc3VyZU5ldyhhLHUsKHcseCk9PntXZShpLGMsZSx3LHgsdCl9KSxtPSExLGQ9KCk9PnttfHwobT0hMCxNdC51bnJlZ2lzdGVyKGQpLHkuY2xvc3VyZUZyZWUobCkpfSxTPXtwdHI6bCxkaXNwb3NlOmR9O3JldHVybiBNdC5yZWdpc3RlcihkLHtzaWc6dCxwdHI6bH0pLFN9aW1wb3J0KmFzIFB0IGZyb20iZmZpIjtmdW5jdGlvbiBqKHQsZSl7cmV0dXJuIHQrZS0xJn4oZS0xKX12YXIgUnQ9dD0+VVt0XSE9PXZvaWQgMDtmdW5jdGlvbiB1dCh0KXtpZih0eXBlb2YgdD09InN0cmluZyIpe2xldCBlPS9eKHU4fHUxNilcWyhcZCspXF1AKHV0Zi04fHV0Zi0xNmxlKSQvLmV4ZWModCk7aWYoZSl7bGV0IGM9TnVtYmVyKGVbMl0pO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKGMpfHxjPDEpdGhyb3cgbmV3IEVycm9yKGBmZmktc3RydWN0OiBzdHJpbmcgbGVuZ3RoIG11c3QgYmUgYW4gaW50ZWdlciA+PSAxLCBnb3QgJHtjfWApO2xldCBzPWVbMV09PT0idTgiPzE6MjtyZXR1cm57c2l6ZTpzKmMsYWxpZ246cyx0eXBlOnt0YWc6InN0cmluZyIsZW5jb2Rpbmc6ZVszXX19fWxldCByPS9eKFteXFtcXV0rKVxbKFxkKylcXSQvLmV4ZWModCk7aWYocil7bGV0IGM9TnVtYmVyKHJbMl0pO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKGMpfHxjPDEpdGhyb3cgbmV3IEVycm9yKGBmZmktc3RydWN0OiBhcnJheSBsZW5ndGggbXVzdCBiZSBhbiBpbnRlZ2VyID49IDEsIGdvdCAke2N9YCk7bGV0IHM9dXQoclsxXSk7aWYocy50eXBlLnRhZz09PSJiaXRmaWVsZCIpdGhyb3cgbmV3IEVycm9yKCJmZmktc3RydWN0OiBiaXRmaWVsZHMgY2Fubm90IGJlIGFycmF5IGVsZW1lbnRzIik7cmV0dXJue3NpemU6cy5zaXplKmMsYWxpZ246cy5hbGlnbix0eXBlOnt0YWc6ImFycmF5IixlbGVtZW50VHlwZTpzLnR5cGUsZWxlbWVudFNpemU6cy5zaXplfX19bGV0IG49L14oW0EtWmEtel9dXHcqKTooXGQrKSQvLmV4ZWModCk7aWYobil7bGV0IGM9blsxXSxzPV8oYyk7aWYoIVJ0KHMpfHxzPT09ImYzMiJ8fHM9PT0iZjY0Iil0aHJvdyBuZXcgRXJyb3IoYGZmaS1zdHJ1Y3Q6IGJpdGZpZWxkIHVuaXQgbXVzdCBiZSBhbiBpbnRlZ2VyIHR5cGUsIGdvdCAiJHtjfSJgKTtsZXQgcD1OdW1iZXIoblsyXSksYT1VW3NdLHU9YSo4O2lmKCFOdW1iZXIuaXNJbnRlZ2VyKHApfHxwPDEpdGhyb3cgbmV3IEVycm9yKGBmZmktc3RydWN0OiBiaXRmaWVsZCB3aWR0aCBtdXN0IGJlIGFuIGludGVnZXIgPj0gMSwgZ290ICR7cH1gKTtpZihwPnUpdGhyb3cgbmV3IEVycm9yKGBmZmktc3RydWN0OiBiaXRmaWVsZCB3aWR0aCAke3B9IGV4Y2VlZHMgdW5pdCB3aWR0aCAke3V9YCk7cmV0dXJue3NpemU6YSxhbGlnbjphLHR5cGU6e3RhZzoiYml0ZmllbGQiLHVuaXQ6cyxiaXQ6MCx3aWR0aDpwfX19bGV0IG89Xyh0KTtpZihPKG8pKXJldHVybntzaXplOlIsYWxpZ246Uix0eXBlOnt0YWc6ImJhc2ljIixraW5kOiJwdHIifX07aWYoIVJ0KG8pKXRocm93IG5ldyBFcnJvcihgZmZpLXN0cnVjdDogdW5rbm93biBraW5kICIke3R9ImApO2xldCBpPVVbb107cmV0dXJue3NpemU6aSxhbGlnbjppLHR5cGU6e3RhZzoiYmFzaWMiLGtpbmQ6b319fWlmKHQmJnR5cGVvZiB0PT0ib2JqZWN0Iil7bGV0IGU9dCxyPWVbIiMiXTtpZihyPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcigiZmZpLXN0cnVjdDogbmVzdGVkIG9iamVjdCB2YWx1ZSByZXF1aXJlcyBhICcjJyBrZXkgKCdzdHJ1Y3QnIHwgJ3VuaW9uJyB8ICdhcnJheScpIik7aWYocj09PSJhcnJheSImJiIjcGFjayJpbiBlKXRocm93IG5ldyBFcnJvcihgZmZpLXN0cnVjdDogJyNwYWNrJyBpcyBvbmx5IGFsbG93ZWQgb24gc3RydWN0L3VuaW9uLCBnb3QgJyR7cn0nYCk7aWYocj09PSJhcnJheSIpe2xldCBuPWUubGVuZ3RoO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKG4pfHxuPDEpdGhyb3cgbmV3IEVycm9yKGBmZmktc3RydWN0OiBhcnJheSBsZW5ndGggbXVzdCBiZSBhbiBpbnRlZ2VyID49IDEsIGdvdCAke1N0cmluZyhuKX1gKTtsZXQgbz11dChlLmVsZW1lbnQpO2lmKG8udHlwZS50YWc9PT0iYml0ZmllbGQiKXRocm93IG5ldyBFcnJvcigiZmZpLXN0cnVjdDogYml0ZmllbGRzIGNhbm5vdCBiZSBhcnJheSBlbGVtZW50cyIpO3JldHVybntzaXplOm8uc2l6ZSpuLGFsaWduOm8uYWxpZ24sdHlwZTp7dGFnOiJhcnJheSIsZWxlbWVudFR5cGU6by50eXBlLGVsZW1lbnRTaXplOm8uc2l6ZX19fWlmKHI9PT0ic3RydWN0Inx8cj09PSJ1bmlvbiIpe2xldCBuPUF0KHQpO3JldHVybntzaXplOm4uc2l6ZSxhbGlnbjpuLm1heEVmZmVjdGl2ZUFsaWduLHR5cGU6e3RhZzpyLGZpZWxkczpuLmZpZWxkc319fXRocm93IG5ldyBFcnJvcihgZmZpLXN0cnVjdDogdW5rbm93biAnIycgZGVjbGFyYXRpb24gJHtKU09OLnN0cmluZ2lmeShTdHJpbmcocikpfWApfXRocm93IG5ldyBFcnJvcihgZmZpLXN0cnVjdDogaW52YWxpZCBtZW1iZXIgdmFsdWU6ICR7U3RyaW5nKHQpfWApfWZ1bmN0aW9uIEF0KHQpe2xldCBlPXRbIiMiXT09PSJzdHJ1Y3QiLHI9dFsiI3BhY2siXT8/OCxuPTEsbz0wLGk9W10sYz0wLHM9LTEscD0wLGE9MCx1PSgpPT57czwwfHwoYz1qKHMrTWF0aC5jZWlsKHAvOCksYSkscz0tMSl9O2ZvcihsZXRbZixsXW9mIE9iamVjdC5lbnRyaWVzKHQpKXtpZihmLnN0YXJ0c1dpdGgoIiMiKSljb250aW51ZTtsZXQgbT0vXihbXkBdKylAKFxkKykkLy5leGVjKGYpLGQ9bT9tWzFdOmYsUz1tP051bWJlcihtWzJdKTowLHtzaXplOncsYWxpZ246eCx0eXBlOmh9PXV0KGwpLEg9dHlwZW9mIGw9PSJzdHJpbmciJiZsLmVuZHNXaXRoKCIhIiksZz14O2lmKHI+MCYmKGc9TWF0aC5taW4ocixnKSksUyYmKGc9TWF0aC5tYXgoZyxTKSksaC50YWc9PT0iYml0ZmllbGQiKXtpZihkLnN0YXJ0c1dpdGgoIiQiKSl0aHJvdyBuZXcgRXJyb3IoImZmaS1zdHJ1Y3Q6IGJpdGZpZWxkIG1lbWJlcnMgbXVzdCBiZSBuYW1lZCIpO2lmKCFlKXtpLnB1c2goe25hbWU6ZCxvZmZzZXQ6MCxzaXplOncsdHlwZTp7Li4uaCxiaXQ6MH19KSxuPU1hdGgubWF4KG4sZyksbz1NYXRoLm1heChvLHcpO2NvbnRpbnVlfWxldCBXPWgud2lkdGg7KHM8MHx8dyE9PWF8fHArVz5hKjgpJiYocz49MCYmdSgpLHM9aihjLGcpLHA9MCxhPXcpLGkucHVzaCh7bmFtZTpkLG9mZnNldDpzLHNpemU6dyx0eXBlOnsuLi5oLGJpdDpwfX0pLHArPVcsbj1NYXRoLm1heChuLGcpLG89TWF0aC5tYXgobyx3KTtjb250aW51ZX11KCk7bGV0IGI9aihjLGcpO2lmKCFkLnN0YXJ0c1dpdGgoIiQiKSlpLnB1c2goe25hbWU6ZCxvZmZzZXQ6YixzaXplOncsdHlwZTpoLC4uLkg/e25vbm51bGw6ITB9Ont9fSk7ZWxzZXtpZihoLnRhZyE9PSJzdHJ1Y3QiJiZoLnRhZyE9PSJ1bmlvbiIpdGhyb3cgbmV3IEVycm9yKGBmZmktc3RydWN0OiBhbm9ueW1vdXMgbWVtYmVyICIke2R9IiBtdXN0IGJlIGEgc3RydWN0L3VuaW9uYCk7Zm9yKGxldCBXIG9mIGguZmllbGRzKWkucHVzaCh7Li4uVyxvZmZzZXQ6Vy5vZmZzZXQrYn0pfWUmJihjPWIrdyksbj1NYXRoLm1heChuLGcpLG89TWF0aC5tYXgobyx3KX1yZXR1cm4gdSgpLHtzaXplOmooZT9jOm8sbiksbWF4RWZmZWN0aXZlQWxpZ246bixmaWVsZHM6aX19ZnVuY3Rpb24gQnQodCxlLHIpe2xldCBuPVVbcl07cmV0dXJuIG49PT0xP0JpZ0ludCh0LmdldFVpbnQ4KGUpKTpuPT09Mj9CaWdJbnQodC5nZXRVaW50MTYoZSwhMCkpOm49PT00P0JpZ0ludCh0LmdldFVpbnQzMihlLCEwKSk6dC5nZXRCaWdVaW50NjQoZSwhMCl9ZnVuY3Rpb24gRGUodCxlLHIsbil7bGV0IG89VVtyXTtpZihvPT09MSl7dC5zZXRVaW50OChlLE51bWJlcihuJjB4ZmZuKSk7cmV0dXJufWlmKG89PT0yKXt0LnNldFVpbnQxNihlLE51bWJlcihuJjB4ZmZmZm4pLCEwKTtyZXR1cm59aWYobz09PTQpe3Quc2V0VWludDMyKGUsTnVtYmVyKG4mMHhmZmZmZmZmZm4pLCEwKTtyZXR1cm59dC5zZXRCaWdVaW50NjQoZSxuJjB4ZmZmZmZmZmZmZmZmZmZmZm4sITApfWZ1bmN0aW9uIEVlKHQsZSxyKXtsZXQgbj1CaWdJbnQoci53aWR0aCksbz1CdCh0LGUsci51bml0KT4+QmlnSW50KHIuYml0KSYoMW48PG4pLTFuO3JldHVybiByLnVuaXRbMF09PT0iaSImJm8mMW48PG4tMW4mJihvLT0xbjw8biksci53aWR0aD41Mz9vOk51bWJlcihvKX1mdW5jdGlvbiBUZSh0LGUscixuKXtsZXQgbz1CaWdJbnQoci53aWR0aCksaT1CaWdJbnQoci5iaXQpLGM9KDFuPDxvKS0xbixzPWM8PGkscD1CdCh0LGUsci51bml0KSxhPSh0eXBlb2Ygbj09ImJpZ2ludCI/bjpCaWdJbnQoTWF0aC50cnVuYyhuKSkpJmM7RGUodCxlLHIudW5pdCxwJn5zfGE8PGkpfXZhciBJZT17InV0Zi04IjpuZXcgVGV4dEVuY29kZXIoInV0Zi04IiksInV0Zi0xNmxlIjpuZXcgVGV4dEVuY29kZXIoInV0Zi0xNmxlIil9LE5lPXsidXRmLTgiOm5ldyBUZXh0RGVjb2RlcigidXRmLTgiLHtpZ25vcmVCT006ITB9KSwidXRmLTE2bGUiOm5ldyBUZXh0RGVjb2RlcigidXRmLTE2bGUiLHtpZ25vcmVCT006ITB9KX07ZnVuY3Rpb24geWUodCxlLHIsbil7bGV0IG89bmV3IFVpbnQ4QXJyYXkodC5idWZmZXIsdC5ieXRlT2Zmc2V0K2UsciksaT1uPT09InV0Zi0xNmxlIj8yOjEsYz1yO2ZvcihsZXQgcz0wO3MraTw9cjtzKz1pKWlmKG9bc109PT0wJiYoaT09PTF8fG9bcysxXT09PTApKXtjPXM7YnJlYWt9cmV0dXJuIE5lW25dLmRlY29kZShvLnN1YmFycmF5KDAsYykpfWZ1bmN0aW9uIEZlKHQsZSxyLG4sbyl7bGV0IGk9bmV3IFVpbnQ4QXJyYXkodC5idWZmZXIsdC5ieXRlT2Zmc2V0K2Uscik7aS5maWxsKDApO2xldCBzPXItKG49PT0idXRmLTE2bGUiPzI6MSk7aWYoczw9MClyZXR1cm47bGV0IHA9SWVbbl0uZW5jb2RlKFN0cmluZyhvPz8iIikpO2kuc2V0KHAuc3ViYXJyYXkoMCxNYXRoLm1pbihwLmxlbmd0aCxzKSkpfWZ1bmN0aW9uIE1lKHQsZSxyLG4pe2xldCBvPW4uZWxlbWVudFNpemU+MD9yL24uZWxlbWVudFNpemU6MCxpPVtdO2ZvcihsZXQgYz0wO2M8bztjKyspaS5wdXNoKGt0KHQsZStjKm4uZWxlbWVudFNpemUsbi5lbGVtZW50VHlwZSxuLmVsZW1lbnRTaXplKSk7cmV0dXJuIGl9ZnVuY3Rpb24gSGUodCxlLHIsbixvKXtsZXQgaT1uLmVsZW1lbnRTaXplPjA/ci9uLmVsZW1lbnRTaXplOjAsYz1vPz9bXTtmb3IobGV0IHM9MDtzPGk7cysrKUx0KHQsZStzKm4uZWxlbWVudFNpemUsbi5lbGVtZW50VHlwZSxuLmVsZW1lbnRTaXplLGNbc10pfWZ1bmN0aW9uIGt0KHQsZSxyLG4pe3N3aXRjaChyLnRhZyl7Y2FzZSJiYXNpYyI6cmV0dXJuIHoodCxlLHIua2luZCk7Y2FzZSJiaXRmaWVsZCI6cmV0dXJuIEVlKHQsZSxyKTtjYXNlInN0cmluZyI6cmV0dXJuIHllKHQsZSxuLHIuZW5jb2RpbmcpO2Nhc2Uic3RydWN0IjpjYXNlInVuaW9uIjpyZXR1cm4gbHQodCxlLHIuZmllbGRzKTtjYXNlImFycmF5IjpyZXR1cm4gTWUodCxlLG4scil9fWZ1bmN0aW9uIEx0KHQsZSxyLG4sbyl7c3dpdGNoKHIudGFnKXtjYXNlImJhc2ljIjpwdCh0LGUse2s6ci5raW5kLHY6b30pO2JyZWFrO2Nhc2UiYml0ZmllbGQiOlRlKHQsZSxyLG8/PzApO2JyZWFrO2Nhc2Uic3RyaW5nIjpGZSh0LGUsbixyLmVuY29kaW5nLG8pO2JyZWFrO2Nhc2Uic3RydWN0IjpjYXNlInVuaW9uIjpHdCh0LGUsci5maWVsZHMsbz8/e30pO2JyZWFrO2Nhc2UiYXJyYXkiOkhlKHQsZSxuLHIsbyk7YnJlYWt9fWZ1bmN0aW9uIGx0KHQsZSxyKXtsZXQgbj17fTtmb3IobGV0IG8gb2Ygcil7bGV0IGk9a3QodCxlK28ub2Zmc2V0LG8udHlwZSxvLnNpemUpO2lmKG8ubm9ubnVsbCYmaT09PTApdGhyb3cgbmV3IEVycm9yKGBmZmktc3RydWN0OiBkZWNvZGU6ICchJyBmaWVsZCAiJHtvLm5hbWV9IiBnb3QgMCAoQyBkaWQgbm90IGZpbGwgaXQsIG9yIGRlY29kZSB3YXMgY2FsbGVkIG9uIGFuIHVuZmlsbGVkIHNsb3QpYCk7bltvLm5hbWVdPWl9cmV0dXJuIG59ZnVuY3Rpb24gR3QodCxlLHIsbil7Zm9yKGxldCBvIG9mIHIpbltvLm5hbWVdIT09dm9pZCAwJiZMdCh0LGUrby5vZmZzZXQsby50eXBlLG8uc2l6ZSxuW28ubmFtZV0pfWZ1bmN0aW9uIE9lKHQpe2xldHtmaWVsZHM6ZSxzaXplOnIsbWF4RWZmZWN0aXZlQWxpZ246bn09QXQodCk7cmV0dXJue19fc3RydWN0OnQsc2l6ZTpyLHN0cnVjdEFsaWduOm4sZGVjb2RlOm89PntpZih0eXBlb2Ygbz09Im51bWJlciIpe2xldCBpPW5ldyBBcnJheUJ1ZmZlcihyKSxjPW5ldyBVaW50OEFycmF5KGkpO2ZvcihsZXQgcz0wO3M8cjtzKyspY1tzXT1QdC5yZWFkQnl0ZShvK3MpO3JldHVybiBsdChuZXcgRGF0YVZpZXcoaSksMCxlKX1yZXR1cm4gbHQobmV3IERhdGFWaWV3KG8pLDAsZSl9LGFsbG9jOigoKT0+bmV3IEQocikpLGVuY29kZTooKG8saSk9PntpZihvPT1udWxsKXRocm93IG5ldyBFcnJvcigiZmZpLXN0cnVjdDogZW5jb2RlKHYpIHJlcXVpcmVzIGFuIGFyZ3VtZW50OyB1c2UgYWxsb2MoKSBmb3IgYSB6ZXJvZWQgb3V0LXBhcmFtIHNsb3QiKTtsZXQgYz1pPz9uZXcgRChyKTtyZXR1cm4gR3QobmV3IERhdGFWaWV3KGMpLDAsZSxvKSxjfSksb2Zmc2V0T2Y6bz0+e2ZvcihsZXQgaSBvZiBlKWlmKGkubmFtZT09PW8pcmV0dXJuIGkub2Zmc2V0O3Rocm93IG5ldyBFcnJvcihgZmZpLXN0cnVjdDogbm8gZmllbGQgIiR7b30iYCl9fX1mdW5jdGlvbiBSZSh0LGUscil7bGV0IG49eyIjIjp0fTtyIT09dm9pZCAwJiYoblsiI3BhY2siXT1yKTtmb3IobGV0W28saV1vZiBPYmplY3QuZW50cmllcyhlKSlvLnN0YXJ0c1dpdGgoIiMiKXx8KG5bb109aSk7cmV0dXJuIG59ZnVuY3Rpb24gQyh0LGUscil7bGV0IG49dHlwZW9mIHQ9PSJzdHJpbmciO3JldHVybiBPZShSZSgic3RydWN0IixuP2U6dCwobj9yOmUpPy5wYWNrKSl9dmFyIEY9QygiUkVDVCIse2xlZnQ6ImkzMiIsdG9wOiJpMzIiLHJpZ2h0OiJpMzIiLGJvdHRvbToiaTMyIn0pLEo9QygiUE9JTlQiLHt4OiJpMzIiLHk6ImkzMiJ9KTt2YXIgdHQ9QygiU1RBUlRVUElORk9XIix7Y2I6InUzMiIsbHBSZXNlcnZlZDoiPD5wdHIiLGxwRGVza3RvcDoiPD5wdHIiLGxwVGl0bGU6Ijw+cHRyIixkd1g6InUzMiIsZHdZOiJ1MzIiLGR3WFNpemU6InUzMiIsZHdZU2l6ZToidTMyIixkd1hDb3VudENoYXJzOiJ1MzIiLGR3WUNvdW50Q2hhcnM6InUzMiIsZHdGaWxsQXR0cmlidXRlOiJ1MzIiLGR3RmxhZ3M6InUzMiIsd1Nob3dXaW5kb3c6InUxNkBTaG93V2luZG93Q21kIixjYlJlc2VydmVkMjoidTE2IixscFJlc2VydmVkMjoiPD5wdHIiLGhTdGRJbnB1dDoiPEhGSUxFPnB0ciIsaFN0ZE91dHB1dDoiPEhGSUxFPnB0ciIsaFN0ZEVycm9yOiI8SEZJTEU+cHRyIn0pLGZ0PUMoIlBST0NFU1NfSU5GT1JNQVRJT04iLHtoUHJvY2VzczoiPEhQUk9DRVNTPnB0ciEiLGhUaHJlYWQ6IjxIVEhSRUFEPnB0ciEiLGR3UHJvY2Vzc0lkOiJ1MzIiLGR3VGhyZWFkSWQ6InUzMiJ9KSwkPUMoIkJJVE1BUElORk9IRUFERVIiLHtiaVNpemU6InUzMiIsYmlXaWR0aDoiaTMyIixiaUhlaWdodDoiaTMyIixiaVBsYW5lczoidTE2IixiaUJpdENvdW50OiJ1MTYiLGJpQ29tcHJlc3Npb246InUzMiIsYmlTaXplSW1hZ2U6InUzMiIsYmlYUGVsc1Blck1ldGVyOiJpMzIiLGJpWVBlbHNQZXJNZXRlcjoiaTMyIixiaUNsclVzZWQ6InUzMiIsYmlDbHJJbXBvcnRhbnQ6InUzMiJ9KSxldD1DKCJCSVRNQVBGSUxFSEVBREVSIix7YmZUeXBlOiJ1MTYiLGJmU2l6ZToidTMyIixiZlJlc2VydmVkMToidTE2IixiZlJlc2VydmVkMjoidTE2IixiZk9mZkJpdHM6InUzMiJ9LHtwYWNrOjJ9KTt2YXIgSz1DKCJOTUhEUiIse2h3bmRGcm9tOiI8SFdORD5wdHIiLGlkRnJvbToiPD5wdHIiLGNvZGU6ImkzMiJ9KSxQZT1DKCJTWVNURU1USU1FIix7d1llYXI6InUxNiIsd01vbnRoOiJ1MTYiLHdEYXlPZldlZWs6InUxNiIsd0RheToidTE2Iix3SG91cjoidTE2Iix3TWludXRlOiJ1MTYiLHdTZWNvbmQ6InUxNiIsd01pbGxpc2Vjb25kczoidTE2In0pLHNyPUMoIk5NREFURVRJTUVDSEFOR0UiLHtoZHI6Sy5fX3N0cnVjdCxkd0ZsYWdzOiJ1MzIiLHN0OlBlLl9fc3RydWN0fSksQWU9QygiTElURU0iLHttYXNrOiJ1MzIiLGlMaW5rOiJpMzIiLHN0YXRlOiJ1MzIiLHN0YXRlTWFzazoidTMyIixzeklEOiJ1MTZbNDhdQHV0Zi0xNmxlIixzelVybDoidTE2WzIwODRdQHV0Zi0xNmxlIn0pLGNyPUMoIk5NTElOSyIse2hkcjpLLl9fc3RydWN0LGl0ZW06QWUuX19zdHJ1Y3R9KSxwcj1DKCJOTUNVU1RPTURSQVciLHtoZHI6Sy5fX3N0cnVjdCxkd0RyYXdTdGFnZToidTMyIixoZGM6IjxIREM+cHRyIixyYzoiaTMyWzRdIixkd0l0ZW1TcGVjOiI8PnB0ciIsdUl0ZW1TdGF0ZToidTMyIixsSXRlbWxQYXJhbToiPD5wdHIifSksYXI9QygiTk1MVkNVU1RPTURSQVciLHtoZHI6Sy5fX3N0cnVjdCxkd0RyYXdTdGFnZToidTMyIixoZGM6IjxIREM+cHRyIixyYzoiaTMyWzRdIixkd0l0ZW1TcGVjOiI8PnB0ciIsdUl0ZW1TdGF0ZToidTMyIixsSXRlbWxQYXJhbToiPD5wdHIiLGNsclRleHQ6InUzMiIsY2xyVGV4dEJrOiJ1MzIiLGlTdWJJdGVtOiJpMzIiLGR3SXRlbVR5cGU6InUzMiJ9KSx1cj1DKCJOTUxJU1RWSUVXIix7aGRyOksuX19zdHJ1Y3QsaUl0ZW06ImkzMiIsaVN1Ykl0ZW06ImkzMiIsdU5ld1N0YXRlOiJ1MzIiLHVPbGRTdGF0ZToidTMyIix1Q2hhbmdlZDoidTMyIixwdEFjdGlvbjoiaTMyWzJdIixsUGFyYW06Ijw+cHRyIn0pO3ZhciBCZT1DKCJUVklURU0iLHttYXNrOiJ1MzIiLGhJdGVtOiI8PnB0ciIsc3RhdGU6InUzMiIsc3RhdGVNYXNrOiJ1MzIiLHBzelRleHQ6Ijw+cHRyIixjY2hUZXh0TWF4OiJpMzIiLGlJbWFnZToiaTMyIixpU2VsZWN0ZWRJbWFnZToiaTMyIixjQ2hpbGRyZW46ImkzMiIsbFBhcmFtOiI8PnB0ciJ9KSxscj1DKCJUVklOU0VSVFNUUlVDVCIse2hQYXJlbnQ6Ijw+cHRyIixoSW5zZXJ0QWZ0ZXI6Ijw+cHRyIixpdGVtOkJlLl9fc3RydWN0fSk7dmFyIGZyPUMoIk1TRyIse2h3bmQ6IjxIV05EPnB0ciIsbWVzc2FnZToidTMyIix3UGFyYW06Ijw+cHRyIixsUGFyYW06Ijw+cHRyIix0aW1lOiJ1MzIiLHB0OkouX19zdHJ1Y3R9KSxkcj1DKCJQQUlOVFNUUlVDVCIse2hkYzoiPEhEQz5wdHIiLGZFcmFzZToiaTMyIixyY1BhaW50OkYuX19zdHJ1Y3QsZlJlc3RvcmU6ImkzMiIsZkluY1VwZGF0ZToiaTMyIixyZ2JSZXNlcnZlZDoidThbMzJdIn0pO3ZhciBydD1DKCJPU1ZFUlNJT05JTkZPXzE0OCIse2R3T1NWZXJzaW9uSW5mb1NpemU6InUzMiIsZHdNYWpvclZlcnNpb246InUzMiIsZHdNaW5vclZlcnNpb246InUzMiIsZHdCdWlsZE51bWJlcjoidTMyIixkd1BsYXRmb3JtSWQ6InUzMiIsc3pDU0RWZXJzaW9uOiJ1OFsxMjhdIn0pO3ZhciBNPSh0LGUscik9PkEoImtlcm5lbDMyLmRsbCIsdCxlLHIpLFV0PU0oIkNyZWF0ZVBpcGUiLCI8PnB0ciA8PnB0ciA8PnB0ciB1MzIgLT4gaTMyIiksZHQ9TSgiU2V0SGFuZGxlSW5mb3JtYXRpb24iLCI8SEZJTEU+cHRyISB1MzIgdTMyIC0+IGkzMiIpLF90PU0oIkNyZWF0ZVByb2Nlc3NXIiwiPFdDSEFSPnB0ciA8V0NIQVI+cHRyIDw+cHRyIDw+cHRyIGkzMiB1MzIgPD5wdHIgPFdDSEFSPnB0ciA8U1RBUlRVUElORk9XPnB0ciA8UFJPQ0VTU19JTkZPUk1BVElPTj5wdHIgLT4gaTMyIix7U1RBUlRVUElORk9XOnR0fSksenQ9TSgiV2FpdEZvclNpbmdsZU9iamVjdCIsIjw+cHRyIHUzMiAtPiB1MzIiKSwkdD1NKCJHZXRFeGl0Q29kZVByb2Nlc3MiLCI8SFBST0NFU1M+cHRyISA8QllURT5wdHIgLT4gaTMyIiksQj1NKCJDbG9zZUhhbmRsZSIsIjw+cHRyIC0+IGkzMiIpLFZ0PU0oIlJlYWRGaWxlIiwiPEhGSUxFPnB0ciEgPEJZVEU+cHRyIHUzMiA8QllURT5wdHIgPD5wdHIgLT4gaTMyIiksd3Q9TSgiR2V0TGFzdEVycm9yIiwiIC0+IHUzMiIpLFl0PU0oIkdldFN5c3RlbURpcmVjdG9yeVciLCI8QllURT5wdHIgdTMyIC0+IHUzMiIpO2ltcG9ydCphcyBqdCBmcm9tIm9zIjt2YXIgRT0odCxlLHIpPT5BKCJ1c2VyMzIuZGxsIix0LGUsciksYnI9RSgiR2V0RGVza3RvcFdpbmRvdyIsIiAtPiA8SFdORD5wdHIiKSxLdD1qdC5hcmNoPT09Ing2NCI/IlB0clciOiJXIjt2YXIgeHQ9RSgiR2V0V2luZG93UmVjdCIsIjxIV05EPnB0ciA8UkVDVD5wdHIgLT4gaTMyIiksWnQ9RSgiR2V0Q2xpZW50UmVjdCIsIjxIV05EPnB0ciA8UkVDVD5wdHIgLT4gaTMyIik7dmFyIFh0PUUoIklzV2luZG93VmlzaWJsZSIsIjxIV05EPnB0ciAtPiBpMzIiKSxtdD1FKCJJc0ljb25pYyIsIjxIV05EPnB0ciAtPiBpMzIiKTt2YXIgcXQ9RSgiR2V0V2luZG93VGV4dFciLCI8SFdORD5wdHIgPEJZVEU+cHRyIGkzMiAtPiBpMzIiKTt2YXIgUXQ9RSgiR2V0Q2xhc3NOYW1lVyIsIjxIV05EPnB0ciA8QllURT5wdHIgaTMyIC0+IGkzMiIpLFdyPUUoIkdldFdpbmRvd0xvbmciK0t0LCI8SFdORD5wdHIgaTMyQEd3bHAgLT4gPD5wdHIiKSxEcj1FKCJTZXRXaW5kb3dMb25nIitLdCwiPEhXTkQ+cHRyIGkzMkBHd2xwIDw+cHRyIC0+IDw+cHRyIik7dmFyIHZ0PUUoIkdldERDIiwiPEhXTkQ+cHRyIC0+IDxIREM+cHRyIiksaHQ9RSgiUmVsZWFzZURDIiwiPEhXTkQ+cHRyIDxIREM+cHRyISAtPiBpMzIiKSxKdD1FKCJQcmludFdpbmRvdyIsIjxIV05EPnB0ciA8SERDPnB0ciEgdTMyIC0+IGkzMiIpO3ZhciB0ZT1FKCJDbGllbnRUb1NjcmVlbiIsIjxIV05EPnB0ciA8UE9JTlQ+cHRyIC0+IGkzMiIpO3ZhciBrPUUoIkdldFN5c3RlbU1ldHJpY3MiLCJpMzIgLT4gaTMyIik7dmFyIGVlPUUoIkVudW1XaW5kb3dzIiwiPD5wdHIgPD5wdHIgLT4gaTMyIik7dmFyIEw9KHQsZSxyKT0+QSgiZ2RpMzIuZGxsIix0LGUscik7dmFyIGd0PUwoIkRlbGV0ZU9iamVjdCIsIjw+cHRyIC0+IGkzMiIpO3ZhciBDdD1MKCJDcmVhdGVDb21wYXRpYmxlREMiLCI8SERDPnB0ciAtPiA8SERDPnB0ciIpLFN0PUwoIkNyZWF0ZUNvbXBhdGlibGVCaXRtYXAiLCI8SERDPnB0ciEgaTMyIGkzMiAtPiA8PnB0ciIpLFo9TCgiU2VsZWN0T2JqZWN0IiwiPEhEQz5wdHIhIDw+cHRyIC0+IDw+cHRyIiksYnQ9TCgiQml0Qmx0IiwiPEhEQz5wdHIhIGkzMiBpMzIgaTMyIGkzMiA8SERDPnB0ciBpMzIgaTMyIHUzMiAtPiBpMzIiKSxyZT1MKCJHZXRESUJpdHMiLCI8SERDPnB0ciEgPD5wdHIgdTMyIHUzMiA8QllURT5wdHIgPD5wdHIgdTMyIC0+IGkzMiIpO3ZhciBYPUwoIkRlbGV0ZURDIiwiPEhEQz5wdHIhIC0+IGkzMiIpO3ZhciBrZT0odCxlKT0+QSgibnRkbGwuZGxsIix0LGUpLG5lPWtlKCJSdGxHZXRWZXJzaW9uIiwiPEJZVEU+cHRyIC0+IGkzMiIpO3ZhciBjZT10PT57dHJ5e2xldCBlPXNlLm9wZW4oImRpYWcubG9nIiwiYSIpO2UmJihlLnB1dHMoYCR7RGF0ZS5ub3coKX0gJHt0fQpgKSxlLmNsb3NlKCkpfWNhdGNoe319LFd0PTEsTGU9MjU2LEdlPTQyOTQ5NjcyOTUsST1pZS5Xb3JrZXIucGFyZW50LHBlPSJDOlxcV2luZG93c1xcU3lzdGVtMzIiO3RyeXtsZXQgdD1QLmFsbG9jKDI1Nikscj1ZdCh0LDI1Nik+MD9QLmRlY29kZSh0KToiIjtyJiYocGU9cil9Y2F0Y2godCl7Y2UoIlNZUy1ESVItRkFJTDogIitTdHJpbmcodCkpfXZhciBhZT0hMTt0cnl7bGV0IHQ9cnQuZW5jb2RlKHtkd09TVmVyc2lvbkluZm9TaXplOnJ0LnNpemV9KTtuZSh0KT09PTAmJihhZT1ydC5kZWNvZGUodCkuZHdNYWpvclZlcnNpb24+PTEwKX1jYXRjaCh0KXtjZSgiVkVSLUZBSUw6ICIrU3RyaW5nKHQpKX12YXIgRHQ9QygiUElQRV9IQU5ETEVTIix7aFJlYWQ6IjxIRklMRT5wdHIhIixoV3JpdGU6IjxIRklMRT5wdHIhIn0pO2Z1bmN0aW9uIFVlKHQsZSl7bGV0IHI9RHQuYWxsb2MoKTtpZighVXQoci5wdHIsci5wdHIrRHQub2Zmc2V0T2YoImhXcml0ZSIpLFQsMCkpdGhyb3cgbmV3IEVycm9yKCJDcmVhdGVQaXBlIGVycj0iK3d0KCkpO2xldHtoUmVhZDpuLGhXcml0ZTpvfT1EdC5kZWNvZGUocik7ZHQobyxXdCxXdCksZHQobixXdCwwKTtsZXQgaT1mdC5hbGxvYygpLHM9YCR7cGV9XFxjbWQuZXhlICR7YWU/Ii91ICI6IiJ9L2MgJHtlfWA7aWYoIV90KFQscyxULFQsMSwwLFQsVCx7Y2I6dHQuc2l6ZSxkd0ZsYWdzOkxlLGhTdGRPdXRwdXQ6byxoU3RkRXJyb3I6b30saS5wdHIpKXRocm93IEIobiksQihvKSxuZXcgRXJyb3IoIkNyZWF0ZVByb2Nlc3NXIGVycj0iK3d0KCkrIiBjbWQ9IitzKTtsZXR7aFByb2Nlc3M6cCxoVGhyZWFkOmEsZHdQcm9jZXNzSWQ6dX09ZnQuZGVjb2RlKGkpO0IoYSksQihvKSxJLnBvc3RNZXNzYWdlKHt0eXBlOiJpbmZvIixpZDp0LHBpZDp1fSk7bGV0IGY9bmV3IEQoNDA5NiksbD1uZXcgVWludDhBcnJheShmKSxtPW5ldyBEKDQpLGQ9bmV3IFVpbnQzMkFycmF5KG0pO2Zvcig7ZFswXT0wLCEhVnQobixmLDQwOTYsbSxUKTspe2xldCBoPWRbMF07aWYoaD09PTApYnJlYWs7SS5wb3N0TWVzc2FnZSh7dHlwZToiZGF0YSIsaWQ6dCxjaHVuazpsLnNsaWNlKDAsaCl9KX16dChwLEdlKTtsZXQgUz1uZXcgRCg0KSx3PW5ldyBJbnQzMkFycmF5KFMpOyR0KHAsUyk7bGV0IHg9d1swXTtyZXR1cm4gQihuKSxCKHApLHh9dmFyIHVlPTEzMzY5Mzc2LF9lPTAsb2U9NjU1MzYsemU9NGU3LG50PTUxMiwkZT0yZTQsRXQ9ZXQuc2l6ZSskLnNpemU7ZnVuY3Rpb24gVmUodCxlLHIpe2xldCBuPWV0LmVuY29kZSh7YmZUeXBlOjE5Nzc4LGJmU2l6ZTpFdCt0LGJmT2ZmQml0czpFdH0pLG89JC5lbmNvZGUoe2JpU2l6ZTokLnNpemUsYmlXaWR0aDplLGJpSGVpZ2h0Oi1yLGJpUGxhbmVzOjEsYmlCaXRDb3VudDozMixiaUNvbXByZXNzaW9uOjAsYmlTaXplSW1hZ2U6dCxiaVhQZWxzUGVyTWV0ZXI6MjgzNSxiaVlQZWxzUGVyTWV0ZXI6MjgzNX0pLGk9bmV3IFVpbnQ4QXJyYXkoRXQpO3JldHVybiBpLnNldChuZXcgVWludDhBcnJheShuKSwwKSxpLnNldChuZXcgVWludDhBcnJheShvKSxldC5zaXplKSxpfWZ1bmN0aW9uIFllKHQsZSxyLG4sbyl7bGV0IGk9bmV3IEQobipvKjQpLGM9bmV3IFVpbnQ4QXJyYXkoaSkscz0kLmVuY29kZSh7YmlTaXplOiQuc2l6ZSxiaVdpZHRoOm4sYmlIZWlnaHQ6LW8sYmlQbGFuZXM6MSxiaUJpdENvdW50OjMyLGJpU2l6ZUltYWdlOm4qbyo0fSk7aWYocmUoZSxyLDAsbyxpLHMucHRyLF9lKSE9PW8pcmV0dXJuITE7bGV0IGE9Yy5ieXRlTGVuZ3RoO0kucG9zdE1lc3NhZ2Uoe3R5cGU6ImRhdGEiLGlkOnQsY2h1bms6VmUoYSxuLG8pfSk7Zm9yKGxldCB1PTA7dTxhO3UrPW9lKUkucG9zdE1lc3NhZ2Uoe3R5cGU6ImRhdGEiLGlkOnQsY2h1bms6Yy5zbGljZSh1LE1hdGgubWluKHUrb2UsYSkpfSk7cmV0dXJuITB9ZnVuY3Rpb24gamUodCxlLHIsbixvLGksYyxzLHApe2xldCBhPUN0KHQpLHU9YT9TdCh0LHIsbik6MDtpZighYXx8IXUpcmV0dXJuIGEmJlgoYSksITE7bGV0IGY9WihhLHUpLG09SnQoZSxhLDApIT09MCYmYnQobywwLDAscyxwLGEsaSxjLHVlKSE9PTA7cmV0dXJuIFooYSxmKSxndCh1KSxYKGEpLG19ZnVuY3Rpb24gbGUodCxlLHIsbixvLGksYyxzLHAsYSl7aWYoIShzPjAmJnA+MCYmcypwPD16ZSkpdGhyb3cgbmV3IEVycm9yKCJjYXB0dXJlIHNpemUgaW52YWxpZCB3PSIrcysiIGg9IitwKTtpZihhIT09bnVsbCYmIShpPj0wJiZjPj0wJiZpK3M8PWUmJmMrcDw9cikpdGhyb3cgbmV3IEVycm9yKCJjYXB0dXJlIGNyb3Agb3V0IG9mIHJhbmdlIGNyb3A9KCIraSsiLCIrYysiLCIrcysieCIrcCsiKSBmcmFtZT0iK2UrIngiK3IpO2xldCB1PXZ0KFQpO2lmKCF1KXRocm93IG5ldyBFcnJvcigiR2V0REMoTlVMTCk9MFx1RkYxQVx1NjVFMFx1OEY5M1x1NTE2NVx1Njg0Q1x1OTc2Mlx1RkYwOFx1Nzg2RVx1OEJBNFx1NTcyOFx1NEVBNFx1NEU5MiBzZXNzaW9uIFx1NTQyRlx1NTJBOFx1RkYwQ1x1ODAwQ1x1OTc1RSBzc2hkL3NlcnZpY2VcdUZGMDkiKTtsZXQgZj1DdCh1KSxsPWY/U3QodSxzLHApOjA7aWYoIWZ8fCFsKXRocm93IGYmJlgoZiksaHQoVCx1KSxuZXcgRXJyb3IoIkNyZWF0ZUNvbXBhdGlibGVEQy9CaXRtYXAgZmFpbGVkIik7bGV0IG09WihmLGwpLGQ9YT09PW51bGw/YnQoZiwwLDAscyxwLHUsbixvLHVlKSE9PTA6amUodSxhLGUscixmLGksYyxzLHApO1ooZixtKTtsZXQgUz1kJiZZZSh0LGYsbCxzLHApO2lmKGd0KGwpLFgoZiksaHQoVCx1KSwhZCl0aHJvdyBuZXcgRXJyb3IoImNhcHR1cmUgZmFpbGVkIG91dD0iK3MrIngiK3ArKGE9PT1udWxsPyIgYXQ9KCIrbisiLCIrbysiKSI6IiBod25kPSIrYSsiIGNyb3A9KCIraSsiLCIrYysiKSBmcmFtZT0iK2UrIngiK3IpKTtpZighUyl0aHJvdyBuZXcgRXJyb3IoIkdldERJQml0cyBzaG9ydCByZWFkIG91dD0iK3MrIngiK3ApO3JldHVybnt3aWR0aDpzLGhlaWdodDpwfX1mdW5jdGlvbiBLZSh0KXtsZXQgZT1rKDApLHI9aygxKTtpZihlPD0wfHxyPD0wKXRocm93IG5ldyBFcnJvcigiR2V0U3lzdGVtTWV0cmljcyB3PSIrZSsiIGg9IityKTtyZXR1cm4gbGUodCxlLHIsMCwwLDAsMCxlLHIsbnVsbCl9ZnVuY3Rpb24gWmUodCxlLHIsbil7aWYobj09PSJzY3JlZW4iJiZtdChlKSE9PTApdGhyb3cgbmV3IEVycm9yKCJ3aW5kb3cgbWluaW1pemVkXHVGRjFBbW9kZT1zY3JlZW4gXHU1M0VBXHU0RjFBXHU2MjJBXHU1MjMwXHU1QjgzXHU0RTBCXHU2NUI5XHU3Njg0XHU2ODRDXHU5NzYyXHVGRjBDXHU2NTM5XHU3NTI4IG1vZGU9cHJpbnQiKTtsZXQgbz1GLmFsbG9jKCk7aWYoIXh0KGUsby5wdHIpKXRocm93IG5ldyBFcnJvcigiR2V0V2luZG93UmVjdChod25kPSIrZSsiKT0wXHVGRjFBXHU3QTk3XHU1M0UzXHU0RTBEXHU1QjU4XHU1NzI4XHU2MjE2XHU1REYyXHU5NTAwXHU2QkMxIik7bGV0e2xlZnQ6aSx0b3A6YyxyaWdodDpzLGJvdHRvbTpwfT1GLmRlY29kZShvKSxhPXMtaSx1PXAtYyxmPTAsbD0wLG09YSxkPXU7aWYocj09PSJjbGllbnQiKXtsZXQgeD1GLmFsbG9jKCk7aWYoIVp0KGUseC5wdHIpKXRocm93IG5ldyBFcnJvcigiR2V0Q2xpZW50UmVjdChod25kPSIrZSsiKT0wIik7bGV0e2xlZnQ6aCx0b3A6SCxyaWdodDpnLGJvdHRvbTpifT1GLmRlY29kZSh4KTttPWctaCxkPWItSDtsZXQgVz1KLmVuY29kZSh7eDowLHk6MH0pO2lmKCF0ZShlLFcucHRyKSl0aHJvdyBuZXcgRXJyb3IoIkNsaWVudFRvU2NyZWVuKGh3bmQ9IitlKyIpPTAiKTtsZXQgTj1KLmRlY29kZShXKTtmPU4ueC1pLGw9Ti55LWN9bGV0IFM9bj09PSJwcmludCI/MDppK2Ysdz1uPT09InByaW50Ij8wOmMrbDtpZihuPT09InNjcmVlbiIpe2xldCB4PWsoNzYpLGg9ayg3NyksSD1rKDc4KSxnPWsoNzkpLGI9TWF0aC5tYXgoUyx4KSxXPU1hdGgubWF4KHcsaCksTj1NYXRoLm1pbihTK20seCtIKSxHPU1hdGgubWluKHcrZCxoK2cpO2lmKE48PWJ8fEc8PVcpdGhyb3cgbmV3IEVycm9yKCJjYXB0dXJlIGFyZWEgb3V0c2lkZSB2aXJ0dWFsIHNjcmVlbiBhdD0oIitTKyIsIit3KyIsIittKyJ4IitkKyIpIik7Uz1iLHc9VyxtPU4tYixkPUctV31yZXR1cm4gbGUodCxhLHUsUyx3LGYsbCxtLGQsbj09PSJwcmludCI/ZTpudWxsKX1mdW5jdGlvbiBYZSh0KXtsZXQgZT1bXSxyPU90KCI8SFdORD5wdHIgPD5wdHIgLT4gaTMyIixzPT4ocyYmZS5wdXNoKHMpLGUubGVuZ3RoPCRlPzE6MCkpO3RyeXtlZShyLnB0cixUKX1maW5hbGx5e3IuZGlzcG9zZSgpfWxldCBuPUYuYWxsb2MoKSxvPVAuYWxsb2MobnQpLGk9UC5hbGxvYyhudCksYz1bXTtmb3IobGV0IHMgb2YgZSlpZih4dChzLG4ucHRyKSl7bGV0IHA9Ri5kZWNvZGUobiksYT1xdChzLG8sbnQpLHU9UXQocyxpLG50KTtjLnB1c2goe2h3bmQ6cyx0aXRsZTphPjA/UC5kZWNvZGUobyk6IiIsY2xhc3NOYW1lOnU+MD9QLmRlY29kZShpKToiIixyZWN0OntsZWZ0OnAubGVmdCx0b3A6cC50b3AscmlnaHQ6cC5yaWdodCxib3R0b206cC5ib3R0b219LHZpc2libGU6WHQocykhPT0wLG1pbmltaXplZDptdChzKSE9PTB9KX1JLnBvc3RNZXNzYWdlKHt0eXBlOiJyZXN1bHQiLGlkOnQsY29kZTowLGVycm9yOm51bGwsd2luZG93czpjfSl9ZnVuY3Rpb24gcWUodCl7aWYodC50eXBlPT09InJ1biIpe2lmKHR5cGVvZiB0LmNtZCE9InN0cmluZyIpcmV0dXJuO2xldCBlPS0xLHI9bnVsbDt0cnl7ZT1VZSh0LmlkLHQuY21kKX1jYXRjaChuKXtyPVN0cmluZyhuKX1JLnBvc3RNZXNzYWdlKHt0eXBlOiJyZXN1bHQiLGlkOnQuaWQsY29kZTplLGVycm9yOnJ9KTtyZXR1cm59aWYodC50eXBlPT09IndpbmRvd3MiKXt0cnl7WGUodC5pZCl9Y2F0Y2goZSl7SS5wb3N0TWVzc2FnZSh7dHlwZToicmVzdWx0IixpZDp0LmlkLGNvZGU6LTEsZXJyb3I6U3RyaW5nKGUpfSl9cmV0dXJufWlmKHQudHlwZT09PSJzY3JlZW5zaG90Iil0cnl7bGV0IGU9dC5od25kPz9udWxsLHt3aWR0aDpyLGhlaWdodDpufT1lPT09bnVsbD9LZSh0LmlkKTpaZSh0LmlkLGUsdC5hcmVhPz8id2luZG93Iix0Lm1vZGU/PyJzY3JlZW4iKTtJLnBvc3RNZXNzYWdlKHt0eXBlOiJyZXN1bHQiLGlkOnQuaWQsY29kZTowLGVycm9yOm51bGwsd2lkdGg6cixoZWlnaHQ6bn0pfWNhdGNoKGUpe0kucG9zdE1lc3NhZ2Uoe3R5cGU6InJlc3VsdCIsaWQ6dC5pZCxjb2RlOi0xLGVycm9yOlN0cmluZyhlKX0pfX1JLm9ubWVzc2FnZT10PT57cWUodC5kYXRhKSxJLm9ubWVzc2FnZT1udWxsfTsK");
|
|
21917
|
+
const worker = new os6.Worker("data:text/javascript;base64,aW1wb3J0KmFzIGZlIGZyb20ib3MiO2ltcG9ydCphcyB4ZSBmcm9tInN0ZCI7aW1wb3J0KmFzIHkgZnJvbSJmZmkiO2ltcG9ydCphcyBldCBmcm9tIm9zIjtpbXBvcnQqYXMgSyBmcm9tInN0ZCI7aW1wb3J0KmFzIHJ0IGZyb20id2luIjt2YXIgZ2U9eyJ1dGYtOCI6InV0Zi04Iix1dGY4OiJ1dGYtOCIsInVuaWNvZGUtMS0xLXV0Zi04IjoidXRmLTgiLCJ1dGYtMTYiOiJ1dGYtMTZsZSIsInV0Zi0xNmxlIjoidXRmLTE2bGUiLCJ1dGYtMTZiZSI6InV0Zi0xNmJlIn07ZnVuY3Rpb24gT3QodCl7aWYoIXQpcmV0dXJuInV0Zi04IjtsZXQgZT1nZVt0LnRyaW0oKS50b0xvd2VyQ2FzZSgpXTtpZihlKXJldHVybiBlO3Rocm93IG5ldyBSYW5nZUVycm9yKGBUaGUgZW5jb2RpbmcgbGFiZWwgIiR7dH0iIGlzIG5vdCBzdXBwb3J0ZWRgKX1mdW5jdGlvbiBEZSh0LGUpe2xldCByPSIiO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7KXtsZXQgbj10W28rK107aWYobjwxMjgpe3IrPVN0cmluZy5mcm9tQ2hhckNvZGUobik7Y29udGludWV9aWYobjwxOTIpe3IrPWU/KCgpPT57dGhyb3cgbmV3IFR5cGVFcnJvcigidW5leHBlY3RlZCBjb250aW51YXRpb24gYnl0ZSIpfSkoKToiXHVGRkZEIjtjb250aW51ZX1sZXQgaSxjO2lmKG48MjI0KXtpZihvPj10Lmxlbmd0aCl7cis9ZT8oKCk9Pnt0aHJvdyBuZXcgVHlwZUVycm9yKCJpbmNvbXBsZXRlIHV0Zi04Iil9KSgpOiJcdUZGRkQiO2JyZWFrfWxldCBzPXRbbysrXTtpZigocyYxOTIpIT09MTI4KXtyKz0iXHVGRkZEIjtjb250aW51ZX1pPShuJjMxKTw8NnxzJjYzLGM9MTI4fWVsc2UgaWYobjwyNDApe2lmKG8rMT49dC5sZW5ndGgpe3IrPWU/KCgpPT57dGhyb3cgbmV3IFR5cGVFcnJvcigiaW5jb21wbGV0ZSB1dGYtOCIpfSkoKToiXHVGRkZEIjticmVha31sZXQgcz10W28rK10scD10W28rK107aWYoKHMmMTkyKSE9PTEyOHx8KHAmMTkyKSE9PTEyOCl7cis9Ilx1RkZGRCI7Y29udGludWV9aT0obiYxNSk8PDEyfChzJjYzKTw8NnxwJjYzLGM9MjA0OH1lbHNlIGlmKG48MjQ4KXtpZihvKzI+PXQubGVuZ3RoKXtyKz1lPygoKT0+e3Rocm93IG5ldyBUeXBlRXJyb3IoImluY29tcGxldGUgdXRmLTgiKX0pKCk6Ilx1RkZGRCI7YnJlYWt9bGV0IHM9dFtvKytdLHA9dFtvKytdLGE9dFtvKytdO2lmKChzJjE5MikhPT0xMjh8fChwJjE5MikhPT0xMjh8fChhJjE5MikhPT0xMjgpe3IrPSJcdUZGRkQiO2NvbnRpbnVlfWk9KG4mNyk8PDE4fChzJjYzKTw8MTJ8KHAmNjMpPDw2fGEmNjMsYz02NTUzNn1lbHNle3IrPWU/KCgpPT57dGhyb3cgbmV3IFR5cGVFcnJvcigiaW52YWxpZCB1dGYtOCBzdGFydCIpfSkoKToiXHVGRkZEIjtjb250aW51ZX1pZihpPGN8fGk+PTU1Mjk2JiZpPD01NzM0M3x8aT4xMTE0MTExKXtyKz1lPygoKT0+e3Rocm93IG5ldyBUeXBlRXJyb3IoImludmFsaWQgdXRmLTggY29kZXBvaW50Iil9KSgpOiJcdUZGRkQiO2NvbnRpbnVlfWk8PTY1NTM1P3IrPVN0cmluZy5mcm9tQ2hhckNvZGUoaSk6KGktPTY1NTM2LHIrPVN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTZ8aT4+MTAsNTYzMjB8aSYxMDIzKSl9cmV0dXJuIHJ9ZnVuY3Rpb24gRWUodCxlLHIpe2xldCBvPW5ldyBEYXRhVmlldyh0LmJ1ZmZlcix0LmJ5dGVPZmZzZXQsdC5ieXRlTGVuZ3RoKSxuPSIiO2ZvcihsZXQgaT0wO2krMTx0Lmxlbmd0aDtpKz0yKXtsZXQgYz1vLmdldFVpbnQxNihpLGUpO2lmKGM+PTU1Mjk2JiZjPD01NjMxOSl7aWYoaSs9MixpKzE+PXQubGVuZ3RoKXtuKz1yPygoKT0+e3Rocm93IG5ldyBUeXBlRXJyb3IoInRydW5jYXRlZCBzdXJyb2dhdGUgcGFpciIpfSkoKToiXHVGRkZEIjticmVha31sZXQgcz1vLmdldFVpbnQxNihpLGUpO3M+PTU2MzIwJiZzPD01NzM0Mz9uKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGMscyk6KG4rPXI/KCgpPT57dGhyb3cgbmV3IFR5cGVFcnJvcigiaW52YWxpZCBzdXJyb2dhdGUgcGFpciIpfSkoKToiXHVGRkZEIixpLT0yKX1lbHNlIGM+PTU2MzIwJiZjPD01NzM0Mz9uKz1yPygoKT0+e3Rocm93IG5ldyBUeXBlRXJyb3IoInVuZXhwZWN0ZWQgdHJhaWxpbmcgc3Vycm9nYXRlIil9KSgpOiJcdUZGRkQiOm4rPVN0cmluZy5mcm9tQ2hhckNvZGUoYyl9cmV0dXJuIG59dmFyIHB0PWNsYXNze19lbmNvZGluZztfZmF0YWw7X2lnbm9yZUJPTTtjb25zdHJ1Y3RvcihlLHIpe3RoaXMuX2VuY29kaW5nPU90KGUpLHRoaXMuX2ZhdGFsPXI/LmZhdGFsPz8hMSx0aGlzLl9pZ25vcmVCT009cj8uaWdub3JlQk9NPz8hMX1nZXQgZW5jb2RpbmcoKXtyZXR1cm4gdGhpcy5fZW5jb2Rpbmd9Z2V0IGZhdGFsKCl7cmV0dXJuIHRoaXMuX2ZhdGFsfWdldCBpZ25vcmVCT00oKXtyZXR1cm4gdGhpcy5faWdub3JlQk9NfWRlY29kZShlKXtpZighZSlyZXR1cm4iIjtsZXQgcj1lIGluc3RhbmNlb2YgVWludDhBcnJheT9lOmUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcj9uZXcgVWludDhBcnJheShlKTpuZXcgVWludDhBcnJheShlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKTtpZih0aGlzLl9lbmNvZGluZz09PSJ1dGYtOCIpcmV0dXJuIERlKHIsdGhpcy5fZmF0YWwpO2xldCBvPXRoaXMuX2VuY29kaW5nPT09InV0Zi0xNmxlIixuPTA7aWYoci5sZW5ndGg+PTImJiF0aGlzLl9pZ25vcmVCT00pe2xldCBpPW8/clswXTpyWzFdLHM9KG8/clsxXTpyWzBdKTw8OHxpOyhzPT09NjUyNzl8fHM9PT02NTUzNCkmJihuPTIpfXJldHVybiBFZShyLnNsaWNlKG4pLG8sdGhpcy5fZmF0YWwpfX0sYXQ9Y2xhc3N7X2VuY29kaW5nO2NvbnN0cnVjdG9yKGUpe3RoaXMuX2VuY29kaW5nPU90KGUpfWdldCBlbmNvZGluZygpe3JldHVybiB0aGlzLl9lbmNvZGluZ31lbmNvZGUoZSl7aWYoIWUpcmV0dXJuIG5ldyBVaW50OEFycmF5KDApO2lmKHRoaXMuX2VuY29kaW5nPT09InV0Zi04Iil7bGV0IGk9W107Zm9yKGxldCBjPTA7YzxlLmxlbmd0aDtjKyspe2xldCBzPWUuY2hhckNvZGVBdChjKTtpZihzPDEyOClpLnB1c2gocyk7ZWxzZSBpZihzPDIwNDgpaS5wdXNoKDE5MnxzPj42LDEyOHxzJjYzKTtlbHNlIGlmKHM8NTUyOTZ8fHM+PTU3MzQ0KWkucHVzaCgyMjR8cz4+MTIsMTI4fHM+PjYmNjMsMTI4fHMmNjMpO2Vsc2V7YysrO2xldCBwPWUuY2hhckNvZGVBdChjKTtzPTY1NTM2KygocyYxMDIzKTw8MTApfHAmMTAyMyxpLnB1c2goMjQwfHM+PjE4LDEyOHxzPj4xMiY2MywxMjh8cz4+NiY2MywxMjh8cyY2Myl9fXJldHVybiBuZXcgVWludDhBcnJheShpKX1sZXQgcj10aGlzLl9lbmNvZGluZz09PSJ1dGYtMTZsZSIsbz1uZXcgQXJyYXlCdWZmZXIoZS5sZW5ndGgqMiksbj1uZXcgRGF0YVZpZXcobyk7Zm9yKGxldCBpPTA7aTxlLmxlbmd0aDtpKyspbi5zZXRVaW50MTYoaSoyLGUuY2hhckNvZGVBdChpKSxyKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkobyl9fTt0eXBlb2YgZ2xvYmFsVGhpcy5UZXh0RGVjb2Rlcj4idSImJihnbG9iYWxUaGlzLlRleHREZWNvZGVyPXB0KTt0eXBlb2YgZ2xvYmFsVGhpcy5UZXh0RW5jb2Rlcj4idSImJihnbG9iYWxUaGlzLlRleHRFbmNvZGVyPWF0KTtpbXBvcnR7YnVmZmVyUHRyIGFzIFdlfWZyb20iZmZpIjtpbXBvcnQqYXMgUnQgZnJvbSJvcyI7dmFyIFRlPVsidm9pZCIsInU4IiwiaTgiLCJ1MTYiLCJpMTYiLCJ1MzIiLCJpMzIiLCJ1NjQiLCJpNjQiLCJmMzIiLCJmNjQiLCJwdHIiXSx1dD0vXjwoW0EtWmEtel9dXHcqfCk+cHRyKCF8QFtBLVphLXpfXVx3Kik/JC87ZnVuY3Rpb24gUih0KXtyZXR1cm4gdXQudGVzdCh0KX12YXIgQXQ9L148KFtBLVphLXpfXVx3Kik+JC87ZnVuY3Rpb24gTSh0KXtyZXR1cm4gQXQudGVzdCh0KX1mdW5jdGlvbiBrKHQpe3JldHVybiBBdC5leGVjKHQpPy5bMV18fCIifWZ1bmN0aW9uIGx0KHQpe3JldHVybiB1dC5leGVjKHQpPy5bMV18fCIifXZhciB0dD10PT57aWYoUih0KSlyZXR1cm4icHRyIjtpZihNKHQpKXRocm93IG5ldyBFcnJvcihgZmZpOiBjVG9rZW5Ub1R5cGU6IGJ5LXZhbHVlIHRva2VuICIke3R9IiBoYXMgbm8gc2NhbGFyIHNsb3QgdHlwZWApO3JldHVybiB0fSxBPVJ0LmFyY2g9PT0ieDY0Ij84OjQsJD17dTg6MSxpODoxLHUxNjoyLGkxNjoyLHUzMjo0LGkzMjo0LHU2NDo4LGk2NDo4LGYzMjo0LGY2NDo4fSxJPTA7ZnVuY3Rpb24gWSh0KXtpZihSKHQpKXtsZXQgbj11dC5leGVjKHQpLGk9bj8uWzFdfHwiIjtyZXR1cm4gbj8uWzJdPy5zdGFydHNXaXRoKCJAIik/YDwke2l9PnB0cmA6dH1pZihNKHQpKXJldHVybiB0O2xldCBlPXQuaW5kZXhPZigiQCIpLHI9ZT49MD90LnNsaWNlKDAsZSk6dDtpZigoZTwwfHwvXltBLVphLXpfXVx3KiQvLnRlc3QodC5zbGljZShlKzEpKSkmJnIhPT0icHRyIiYmVGUuaW5jbHVkZXMocikpcmV0dXJuIHI7dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIHRva2VuOiAiK3QpfWZ1bmN0aW9uIFYodCxlLHIpe3N3aXRjaChyKXtjYXNlInU4IjpyZXR1cm4gdC5nZXRVaW50OChlKTtjYXNlImk4IjpyZXR1cm4gdC5nZXRJbnQ4KGUpO2Nhc2UidTE2IjpyZXR1cm4gdC5nZXRVaW50MTYoZSwhMCk7Y2FzZSJpMTYiOnJldHVybiB0LmdldEludDE2KGUsITApO2Nhc2UidTMyIjpyZXR1cm4gdC5nZXRVaW50MzIoZSwhMCk7Y2FzZSJpMzIiOnJldHVybiB0LmdldEludDMyKGUsITApO2Nhc2UidTY0IjpyZXR1cm4gdC5nZXRCaWdVaW50NjQoZSwhMCk7Y2FzZSJpNjQiOnJldHVybiB0LmdldEJpZ0ludDY0KGUsITApO2Nhc2UiZjMyIjpyZXR1cm4gdC5nZXRGbG9hdDMyKGUsITApO2Nhc2UiZjY0IjpyZXR1cm4gdC5nZXRGbG9hdDY0KGUsITApO2Nhc2UicHRyIjpyZXR1cm4gQT09PTg/TnVtYmVyKHQuZ2V0QmlnSW50NjQoZSwhMCkpOnQuZ2V0SW50MzIoZSwhMCl9fWZ1bmN0aW9uIGR0KHQsZSx7azpyLHY6b30pe3N3aXRjaChyKXtjYXNlInU4Ijp0LnNldFVpbnQ4KGUsTnVtYmVyKG8pKTticmVhaztjYXNlImk4Ijp0LnNldEludDgoZSxOdW1iZXIobykpO2JyZWFrO2Nhc2UidTE2Ijp0LnNldFVpbnQxNihlLE51bWJlcihvKSwhMCk7YnJlYWs7Y2FzZSJpMTYiOnQuc2V0SW50MTYoZSxOdW1iZXIobyksITApO2JyZWFrO2Nhc2UidTMyIjp0LnNldFVpbnQzMihlLG8+Pj4wLCEwKTticmVhaztjYXNlImkzMiI6dC5zZXRVaW50MzIoZSxvPj4+MCwhMCk7YnJlYWs7Y2FzZSJ1NjQiOnQuc2V0QmlnVWludDY0KGUsbywhMCk7YnJlYWs7Y2FzZSJpNjQiOnQuc2V0QmlnSW50NjQoZSxvLCEwKTticmVhaztjYXNlImYzMiI6dC5zZXRGbG9hdDMyKGUsbywhMCk7YnJlYWs7Y2FzZSJmNjQiOnQuc2V0RmxvYXQ2NChlLG8sITApO2JyZWFrO2Nhc2UicHRyIjp7aWYobz09bnVsbCl0aHJvdyBuZXcgRXJyb3IoImZmaTogZ290IG51bGwvdW5kZWZpbmVkIGZvciBhIHB0ciBzbG90OyBwYXNzIHRoZSBpbXBvcnRlZCBOVUxMIGNvbnN0YW50IGZvciBlbXB0eSIpO0E9PT04P3Quc2V0QmlnVWludDY0KGUsQmlnSW50LmFzVWludE4oNjQsQmlnSW50KG8pKSwhMCk6dC5zZXRVaW50MzIoZSxvPj4+MCwhMCk7YnJlYWt9fX1mdW5jdGlvbiB2KHQsZSxyKXtsZXR7azpvLHY6bn09cjtpZihvPT09InU4Inx8bz09PSJpOCJ8fG89PT0idTE2Inx8bz09PSJpMTYiKXt0LnNldFVpbnQzMihlLE51bWJlcihuKT4+PjAsITApO3JldHVybn1kdCh0LGUscil9dmFyIGI9Y2xhc3MgZXh0ZW5kcyBBcnJheUJ1ZmZlcntwdHI7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5wdHI9V2UodGhpcyl9fTtmdW5jdGlvbiBmdCh0LGUpe3JldHVybiBlW3RdfXZhciBCdD1uZXcgTWFwO2Z1bmN0aW9uIGJlKHQpe2xldCBlPUJ0LmdldCh0KTtpZihlIT09dm9pZCAwKXJldHVybiBlO2xldCByPXJ0LkxvYWRMaWJyYXJ5KHQpO2lmKCFyKXRocm93IG5ldyBFcnJvcihgZmZpLWJpbmQ6IExvYWRMaWJyYXJ5KCIke3R9IikgZmFpbGVkYCk7cmV0dXJuIEJ0LnNldCh0LHIpLHJ9ZnVuY3Rpb24gVXQodCl7bGV0IGU9dC5zcGxpdCgiIC0+ICIpO2lmKGUubGVuZ3RoIT09Mil0aHJvdyBuZXcgRXJyb3IoYGZmaS1iaW5kOiBpbnZhbGlkIHNpZ25hdHVyZSAiJHt0fSIgKGV4cGVjdGVkICJhcmcxIGFyZzIgLT4gcmV0IilgKTtsZXQgcj1lWzBdLnNwbGl0KCIgIikuZmlsdGVyKGk9PmkhPT0iIiksbz1bXTtmb3IobGV0IGkgb2Ygcil7bGV0IGM9WShpKTtpZihjPT09InZvaWQiKXRocm93IG5ldyBFcnJvcigiVm9pZCBjYW4gbm90IGluIGFyZ3MiKTtvLnB1c2goYyl9bGV0IG49WShlWzFdKTtpZihNKG4pKXRocm93IG5ldyBFcnJvcihgZmZpLWJpbmQ6ICIke3R9IjogYnktdmFsdWUgc3RydWN0IGF0IHRoZSByZXR1cm4gcG9zaXRpb24gKDwke2sobil9PikgaXMgbm90IHN1cHBvcnRlZCBcdTIwMTQgYXJndW1lbnQgcG9zaXRpb25zIG9ubHk7IHBhc3MgYSBzdHJ1Y3Qgb3V0IHRocm91Z2ggYW4gb3V0LXBhcmFtIHNsb3QgaW5zdGVhZCAoPE4+cHRyICsgY2FsbGVyIGJ1ZmZlcilgKTtyZXR1cm57YXJnVG9rZW5zOm8scmV0VG9rZW46bixzaWc6dH19ZnVuY3Rpb24gTmUodCxlLHIsbyl7bGV0IG49VXQoZSk7Zm9yKGxldCBpIG9mIG4uYXJnVG9rZW5zKXtpZighTShpKSljb250aW51ZTtsZXQgYz1rKGkpLHM9ZnQoYyxyKTtpZighc3x8dHlwZW9mIHMuZW5jb2RlIT0iZnVuY3Rpb24iKXRocm93IG5ldyBFcnJvcihgZmZpLWJpbmQ6ICR7ZX06IGJ5LXZhbHVlIHBvc2l0aW9uIDwke2N9PiBoYXMgbm8gcmVnaXN0ZXJlZCBsYXlvdXQgKGF2YWlsYWJsZTogJHtPYmplY3Qua2V5cyhyKS5qb2luKCIsICIpfHwibm9uZSJ9KWApO2lmKHR5cGVvZiBzLnNpemUhPSJudW1iZXIifHxzLnNpemU8MSl0aHJvdyBuZXcgRXJyb3IoYGZmaS1iaW5kOiAke2V9OiBieS12YWx1ZSBwb3NpdGlvbiA8JHtjfT4gcmVxdWlyZXMgYSBzdHJ1Y3QgbGF5b3V0IHdpdGggc2l6ZSA+PSAxIChnb3QgJHtzLnNpemV9OyBub24tc3RydWN0IGNvZGVjcyBleHBvc2Ugbm8gc2l6ZSlgKX1yZXR1cm4oLi4uaSk9PkllKHQsbixpLHIsbyl9dmFyIHh0PXt1ODo0LGk4OjQsdTE2OjQsaTE2OjQsdTMyOjQsaTMyOjQsdTY0OjgsaTY0OjgsZjMyOjQsZjY0OjgscHRyOkF9LEd0PTQ7ZnVuY3Rpb24gSWUodCx7YXJnVG9rZW5zOmUscmV0VG9rZW46cixzaWc6b30sbixpLGMpe2xldCBzPWV0LmFyY2g9PT0ieDY0IixwPShsLEQpPT57aWYoTShsKSl0aHJvdyBuZXcgRXJyb3IoYGZmaS1iaW5kOiBnZXRXaWR0aDogYnktdmFsdWUgdG9rZW4gIiR7bH0iIChkaXNwYXRjaGVkIGJ5IHdpZHRoT2YpYCk7cmV0dXJuIEQ/ODpSKGwpP0E6eHRbbF19LGE9bD0+e2lmKE0obCkpe2lmKHMpcmV0dXJuIDg7bGV0IEQ9ZnQoayhsKSxpKTtpZighRCl0aHJvdyBuZXcgRXJyb3IoYGZmaS1iaW5kOiA8JHtrKGwpfT4gYnktdmFsdWUgcG9zaXRpb24gaGFzIG5vIHJlZ2lzdGVyZWQgbGF5b3V0YCk7bGV0IEU9RC5zaXplO3JldHVybiBFJTQ9PT0wP0U6RSs0LUUlNH1yZXR1cm4gcChsLHMpfSx1PTA7Zm9yKGxldCBsIG9mIGUpdSs9YShsKTtzJiZlLmxlbmd0aDxHdCYmKHU9R3QqOCk7bGV0IHg9bmV3IEFycmF5QnVmZmVyKHUpLGQ9bmV3IERhdGFWaWV3KHgpLHc9W10sZj0wO2ZvcihsZXQgbD0wO2w8ZS5sZW5ndGg7bCsrKXtsZXQgRD1lW2xdLEU9RC5lbmRzV2l0aCgiISIpLEM9bltsXTtpZihSKEQpKXtsZXQgaD1sdChEKTtpZih0eXBlb2YgQz09Im51bWJlciIpe2lmKEUmJkM9PT0wKXRocm93IG5ldyBFcnJvcihgZmZpLWJpbmQ6ICR7b306IGFyZyMke2wrMX0gPCR7aH0+cHRyISBnb3QgMCAobnVsbCBwb2ludGVyIGZvcmJpZGRlbiBoZXJlOyB0aGUgdG9rZW4gbWFya3MgdGhpcyBwb3NpdGlvbiBub24tbnVsbClgKTt2KGQsZix7azoicHRyIix2OkN9KX1lbHNle2lmKEM9PW51bGwpdGhyb3cgbmV3IEVycm9yKGBmZmktYmluZDogPCR7aH0+cHRyIGdvdCAke1N0cmluZyhDKX07IHBhc3MgdGhlIGltcG9ydGVkIE5VTEwgY29uc3RhbnQgZm9yIGFuIGVtcHR5IHBvaW50ZXJgKTtsZXQgVD1pW2hdO2lmKCFUKXRocm93IG5ldyBFcnJvcihoPT09IiI/YGZmaS1iaW5kOiA8PnB0ciBleHBlY3RzIG51bWJlciAoTlVMTCB8IFB0ciksIGdvdCAke3R5cGVvZiBDfTsgdXNlIDxCWVRFPnB0ciB3aXRoIGEgUHRyQXJyYXlCdWZmZXIgKG5ldyBQdHJBcnJheUJ1ZmZlcihuKSksIG9yIGZmaS5idWZmZXJQdHIoYnVmKSBmb3IgYW4gYWRkcmVzc2A6YGZmaS1iaW5kOiB1bmtub3duIGxheW91dCAiPCR7aH0+cHRyIiAoYXZhaWxhYmxlOiAke09iamVjdC5rZXlzKGkpLmpvaW4oIiwgIil8fCJub25lIn0pYCk7aWYoIVQuZW5jb2RlKXRocm93IG5ldyBFcnJvcihgZmZpLWJpbmQ6IDwke2h9PnB0ciBoYXMgbm8gZW5jb2RlciAob3V0LW9ubHkgY29kZWMpYCk7bGV0IEg9VC5lbmNvZGUoQyk7dy5wdXNoKEgpO2xldCBMPUgucHRyO2lmKHR5cGVvZiBMIT0ibnVtYmVyIil0aHJvdyBuZXcgRXJyb3IoImZmaS1iaW5kOiBjb2RlYy5lbmNvZGUgbXVzdCByZXR1cm4gYSBQdHJBcnJheUJ1ZmZlciwgZ290IHBsYWluIEFycmF5QnVmZmVyIik7aWYoRSYmTD09PTApdGhyb3cgbmV3IEVycm9yKGBmZmktYmluZDogJHtvfTogYXJnIyR7bCsxfSA8JHtofT5wdHIhIGVuY29kZSBwcm9kdWNlZCAwIChudWxsIHBvaW50ZXIgZm9yYmlkZGVuIGhlcmUpYCk7dihkLGYse2s6InB0ciIsdjpMfSl9fWVsc2UgaWYoTShEKSl7bGV0IGg9ayhEKSxUPWZ0KGgsaSk7aWYoIVQpdGhyb3cgbmV3IEVycm9yKGBmZmktYmluZDogJHtvfTogYXJnIyR7bCsxfSA8JHtofT4gYnktdmFsdWUgcG9zaXRpb24gaGFzIG5vIHJlZ2lzdGVyZWQgbGF5b3V0YCk7aWYoQz09bnVsbCl0aHJvdyBuZXcgRXJyb3IoYGZmaS1iaW5kOiA8JHtofT4gdmFsdWUgcG9zaXRpb24gZ290ICR7U3RyaW5nKEMpfTsgcGFzcyBhIHN0cnVjdCBvYmplY3QgKHVzZSA8JHtofT5wdHIgdG8gcGFzcyBhIHBvaW50ZXIpYCk7bGV0IEg9VC5zaXplO2lmKCFzfHxIPD04JiYoSCZILTEpPT09MClULmVuY29kZShDLHgsZik7ZWxzZXtsZXQgTD1uZXcgQXJyYXlCdWZmZXIoSCsxNSksUHQ9eS5idWZmZXJQdHIoTCksTXQ9KDE2LVB0JTE2KSUxNjtULmVuY29kZShDLEwsTXQpLHcucHVzaChMKSx2KGQsZix7azoicHRyIix2OlB0K010fSl9fWVsc2UgdihkLGYse2s6RCx2OkN9KTtmKz1hKEQpfWxldCBTPW5ldyBBcnJheUJ1ZmZlcig4KTt5LmZmaUNhbGwodCx4LFMscj09PSJmMzIifHxyPT09ImY2NCI/MTowKTtsZXQgVz15ZSh0dChyKSxTKTtpZihyLmVuZHNXaXRoKCIhIikmJlc9PT0wKXRocm93IG5ldyBFcnJvcihgZmZpLWJpbmQ6ICR7b306IHJldHVybiAke3J9IGdvdCAwICh0aGUgdG9rZW4gcHJvbWlzZXMgQyBuZXZlciByZXR1cm5zIG51bGwgaGVyZSlgKTtpZihSKHIpJiZXIT09MCl7bGV0IGw9bHQocik7aWYobCE9PSIiKXtsZXQgRD1jW2xdO2lmKEQ/LmRlY29kZSlyZXR1cm4gRC5kZWNvZGUoVyl9fXJldHVybiBXfWZ1bmN0aW9uIHllKHQsZSl7aWYodCE9PSJ2b2lkIilyZXR1cm4gVihuZXcgRGF0YVZpZXcoZSksMCx0KX12YXIgQj17ZW5jb2RlOnQ9PntsZXQgZT1uZXcgVGV4dEVuY29kZXIoInV0Zi0xNmxlIikuZW5jb2RlKHQrIlwwIikscj1uZXcgYihlLmJ5dGVMZW5ndGgpO3JldHVybiBuZXcgVWludDhBcnJheShyKS5zZXQoZSkscn0sZGVjb2RlOnQ9PntpZih0eXBlb2YgdD09Im51bWJlciIpe2xldCBuPSIiLGk9dCxjPWk7Zm9yKDs7KXtsZXQgcz15LnJlYWRCeXRlKGkpLHA9eS5yZWFkQnl0ZShpKzEpO2lmKHM9PT0wJiZwPT09MClyZXR1cm4gbjtpZihuKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHN8cDw8OCksaSs9MixpLWM+MTw8MjEpdGhyb3cgbmV3IEVycm9yKCJmZmktYmluZDogV0NIQVIgZGVjb2RlIGV4Y2VlZGVkIDRNaUIgd2l0aG91dCBOVUwiKX19bGV0IGU9bmV3IFVpbnQ4QXJyYXkodCkscj1lLmxlbmd0aCYtMixvPSIiO2ZvcihsZXQgbj0wO248cjtuKz0yKXtsZXQgaT1lW25dfGVbbisxXTw8ODtpZihpPT09MClyZXR1cm4gbztvKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGkpfXJldHVybiBvfSxhbGxvYzoodD0yNTYpPT5uZXcgYih0KjIpfSxGZT17ZW5jb2RlOnQ9PntpZighKHQgaW5zdGFuY2VvZiBiKSl0aHJvdyBuZXcgRXJyb3IoImZmaS1iaW5kOiA8QllURT5wdHIgd2FudHMgYSBQdHJBcnJheUJ1ZmZlciAobmV3IFB0ckFycmF5QnVmZmVyKG4pIC8gQllURS5hbGxvYyAvIHN0cnVjdC5lbmNvZGUpLCBub3QgYSBwbGFpbiBBcnJheUJ1ZmZlciIpO3JldHVybiB0fSxhbGxvYzp0PT5uZXcgYih0KX0sTHQ9e1dDSEFSOkIsQllURTpGZX07ZnVuY3Rpb24gRyh0LGUscixvLG4pe2xldCBpPXJ0LkdldFByb2NBZGRyZXNzKGJlKHQpLGUpO2lmKCFpKXRocm93IG5ldyBFcnJvcihgZmZpLWJpbmQ6IHByb2MgIiR7ZX0iIG5vdCBmb3VuZCBpbiAke3R9YCk7bGV0IGM9bj8/bztyZXR1cm4gTmUoaSxyLHsuLi5MdCwuLi5vfSx7Li4uTHQsLi4uYz8/e319KX12YXIga3Q9bmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KHQ9PntLLnByaW50ZihgW2ZmaV0gY2xvc3VyZSBsZWFrZWQgKEdDZWQgd2l0aG91dCBkaXNwb3NlKTogc2lnPSIlcyIgcHRyPTB4JXgKYCx0LnNpZyx0LnB0cil9KTtmdW5jdGlvbiBIZSh0LGUscixvLG4saSl7bGV0IGM9bmV3IERhdGFWaWV3KG4pLHM9ZXQuYXJjaD09PSJ4NjQiLHA9bmV3IERhdGFWaWV3KG8pLGE9W10sdT0wO2ZvcihsZXQgZD0wO2Q8dC5sZW5ndGg7ZCsrKXtsZXQgdz10W2RdLGY9dy50b2ssUztpZihzKXtsZXQgVz1mPT09ImYzMiJ8fGY9PT0iZjY0Ij9kPDQ/MTI4K2QqODozMisoZC00KSo4OmQ8ND9kKjg6MzIrKGQtNCkqODtTPVYocCxXLGYpfWVsc2UgUz1WKHAsdSxmKSx1Kz14dFtmXTtpZih3Lm5vbm51bGwmJlM9PT0wKXtLLnByaW50ZihgW2ZmaV0gY2xvc3VyZSAlczogYXJnIyVkIGdvdCAwICghIHByb21pc2UgdmlvbGF0ZWQgYnkgY2FsbGVyKSwgc2tpcHBpbmcgY2FsbGJhY2sKYCxpLGQrMSk7cmV0dXJufWEucHVzaChTKX1sZXQgeDt0cnl7eD1yKC4uLmEpfWNhdGNoKGQpe0sucHJpbnRmKGBbZmZpXSBjbG9zdXJlIGNhbGxiYWNrIHRocmV3OiAlcwpgLFN0cmluZyhkKSk7cmV0dXJufWlmKGUubm9ubnVsbCYmeD09PTApe0sucHJpbnRmKGBbZmZpXSBjbG9zdXJlICVzOiByZXR1cm4gZ290IDAgKCEgcHJvbWlzZSB2aW9sYXRlZCBieSBjYWxsYmFjayksIGxlYXZpbmcgcmVzdWx0IHNsb3QgMApgLGkpO3JldHVybn1lLnRvayE9PSJ2b2lkIiYmdihjLDAse2s6ZS50b2ssdjp4fSl9ZnVuY3Rpb24gX3QodCxlLHIpe2xldHthcmdUb2tlbnM6byxyZXRUb2tlbjpufT1VdCh0KTtmb3IobGV0IG0gb2YgbylpZihNKG0pKXRocm93IG5ldyBFcnJvcihgZmZpLWJpbmQ6IGNsb3N1cmUgc2lnbmF0dXJlIGNhbm5vdCB0YWtlIGEgYnktdmFsdWUgc3RydWN0ICg8JHtrKG0pfT4pOyBieS12YWx1ZSBpcyBiaW5kLW9ubHkgXHUyMDE0IHRoZSBDXHUyMTkySlMgZGlyZWN0aW9uIGhhcyBubyBzdHJ1Y3Qgc2xvdCBkZWNvZGluZyAocGFzcyBhIHBvaW50ZXIgYW5kIGRlY29kZSBvbiB0aGUgSlMgc2lkZSlgKTtsZXQgaT1vLm1hcChtPT4oe3Rvazp0dChtKSxub25udWxsOm0uZW5kc1dpdGgoIiEiKX0pKSxjPXt0b2s6dHQobiksbm9ubnVsbDpuLmVuZHNXaXRoKCIhIil9LHM9ZXQuYXJjaD09PSJ4NjQiLHA9aS5yZWR1Y2UoKG0sVyk9Pm0reHRbVy50b2tdLDApO2lmKHM/aS5sZW5ndGg+MTY6cD42NCl0aHJvdyBuZXcgRXJyb3IoYGZmaS1iaW5kOiBjbG9zdXJlIHNpZ25hdHVyZSBleGNlZWRzIGNhcHR1cmUgd2luZG93ICgke3M/Im1heCAxNiBwYXJhbXMiOiJtYXggNjQgc3RhY2sgYnl0ZXMifSk6ICR7dH1gKTtsZXQgYT1yPy5zdGRjYWxsPT09ITF8fHM/MDpwLHU9Yy50b2s9PT0iZjMyIj8xOmMudG9rPT09ImY2NCI/MjpjLnRvaz09PSJ1NjQifHxjLnRvaz09PSJpNjQiPzM6MCxkPXkuY2xvc3VyZU5ldyhhLHUsKG0sVyk9PntIZShpLGMsZSxtLFcsdCl9KSx3PSExLGY9KCk9Pnt3fHwodz0hMCxrdC51bnJlZ2lzdGVyKGYpLHkuY2xvc3VyZUZyZWUoZCkpfSxTPXtwdHI6ZCxkaXNwb3NlOmZ9O3JldHVybiBrdC5yZWdpc3RlcihmLHtzaWc6dCxwdHI6ZH0pLFN9aW1wb3J0KmFzIHd0IGZyb20iZmZpIjtmdW5jdGlvbiBYKHQsZSl7cmV0dXJuIHQrZS0xJn4oZS0xKX12YXIgenQ9dD0+JFt0XSE9PXZvaWQgMDtmdW5jdGlvbiBtdCh0KXtpZih0eXBlb2YgdD09InN0cmluZyIpe2xldCBlPS9eKHU4fHUxNilcWyhcZCspXF1AKHV0Zi04fHV0Zi0xNmxlKSQvLmV4ZWModCk7aWYoZSl7bGV0IGM9TnVtYmVyKGVbMl0pO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKGMpfHxjPDEpdGhyb3cgbmV3IEVycm9yKGBmZmktc3RydWN0OiBzdHJpbmcgbGVuZ3RoIG11c3QgYmUgYW4gaW50ZWdlciA+PSAxLCBnb3QgJHtjfWApO2xldCBzPWVbMV09PT0idTgiPzE6MjtyZXR1cm57c2l6ZTpzKmMsYWxpZ246cyx0eXBlOnt0YWc6InN0cmluZyIsZW5jb2Rpbmc6ZVszXX19fWxldCByPS9eKFteXFtcXV0rKVxbKFxkKylcXSQvLmV4ZWModCk7aWYocil7bGV0IGM9TnVtYmVyKHJbMl0pO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKGMpfHxjPDEpdGhyb3cgbmV3IEVycm9yKGBmZmktc3RydWN0OiBhcnJheSBsZW5ndGggbXVzdCBiZSBhbiBpbnRlZ2VyID49IDEsIGdvdCAke2N9YCk7bGV0IHM9bXQoclsxXSk7aWYocy50eXBlLnRhZz09PSJiaXRmaWVsZCIpdGhyb3cgbmV3IEVycm9yKCJmZmktc3RydWN0OiBiaXRmaWVsZHMgY2Fubm90IGJlIGFycmF5IGVsZW1lbnRzIik7cmV0dXJue3NpemU6cy5zaXplKmMsYWxpZ246cy5hbGlnbix0eXBlOnt0YWc6ImFycmF5IixlbGVtZW50VHlwZTpzLnR5cGUsZWxlbWVudFNpemU6cy5zaXplfX19bGV0IG89L14oW0EtWmEtel9dXHcqKTooXGQrKSQvLmV4ZWModCk7aWYobyl7bGV0IGM9b1sxXSxzPVkoYyk7aWYoIXp0KHMpfHxzPT09ImYzMiJ8fHM9PT0iZjY0Iil0aHJvdyBuZXcgRXJyb3IoYGZmaS1zdHJ1Y3Q6IGJpdGZpZWxkIHVuaXQgbXVzdCBiZSBhbiBpbnRlZ2VyIHR5cGUsIGdvdCAiJHtjfSJgKTtsZXQgcD1OdW1iZXIob1syXSksYT0kW3NdLHU9YSo4O2lmKCFOdW1iZXIuaXNJbnRlZ2VyKHApfHxwPDEpdGhyb3cgbmV3IEVycm9yKGBmZmktc3RydWN0OiBiaXRmaWVsZCB3aWR0aCBtdXN0IGJlIGFuIGludGVnZXIgPj0gMSwgZ290ICR7cH1gKTtpZihwPnUpdGhyb3cgbmV3IEVycm9yKGBmZmktc3RydWN0OiBiaXRmaWVsZCB3aWR0aCAke3B9IGV4Y2VlZHMgdW5pdCB3aWR0aCAke3V9YCk7cmV0dXJue3NpemU6YSxhbGlnbjphLHR5cGU6e3RhZzoiYml0ZmllbGQiLHVuaXQ6cyxiaXQ6MCx3aWR0aDpwfX19bGV0IG49WSh0KTtpZihSKG4pKXJldHVybntzaXplOkEsYWxpZ246QSx0eXBlOnt0YWc6ImJhc2ljIixraW5kOiJwdHIifX07aWYoIXp0KG4pKXRocm93IG5ldyBFcnJvcihgZmZpLXN0cnVjdDogdW5rbm93biBraW5kICIke3R9ImApO2xldCBpPSRbbl07cmV0dXJue3NpemU6aSxhbGlnbjppLHR5cGU6e3RhZzoiYmFzaWMiLGtpbmQ6bn19fWlmKHQmJnR5cGVvZiB0PT0ib2JqZWN0Iil7bGV0IGU9dCxyPWVbIiMiXTtpZihyPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcigiZmZpLXN0cnVjdDogbmVzdGVkIG9iamVjdCB2YWx1ZSByZXF1aXJlcyBhICcjJyBrZXkgKCdzdHJ1Y3QnIHwgJ3VuaW9uJyB8ICdhcnJheScpIik7aWYocj09PSJhcnJheSImJiIjcGFjayJpbiBlKXRocm93IG5ldyBFcnJvcihgZmZpLXN0cnVjdDogJyNwYWNrJyBpcyBvbmx5IGFsbG93ZWQgb24gc3RydWN0L3VuaW9uLCBnb3QgJyR7cn0nYCk7aWYocj09PSJhcnJheSIpe2xldCBvPWUubGVuZ3RoO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKG8pfHxvPDEpdGhyb3cgbmV3IEVycm9yKGBmZmktc3RydWN0OiBhcnJheSBsZW5ndGggbXVzdCBiZSBhbiBpbnRlZ2VyID49IDEsIGdvdCAke1N0cmluZyhvKX1gKTtsZXQgbj1tdChlLmVsZW1lbnQpO2lmKG4udHlwZS50YWc9PT0iYml0ZmllbGQiKXRocm93IG5ldyBFcnJvcigiZmZpLXN0cnVjdDogYml0ZmllbGRzIGNhbm5vdCBiZSBhcnJheSBlbGVtZW50cyIpO3JldHVybntzaXplOm4uc2l6ZSpvLGFsaWduOm4uYWxpZ24sdHlwZTp7dGFnOiJhcnJheSIsZWxlbWVudFR5cGU6bi50eXBlLGVsZW1lbnRTaXplOm4uc2l6ZX19fWlmKHI9PT0ic3RydWN0Inx8cj09PSJ1bmlvbiIpe2xldCBvPWh0KHQpO3JldHVybntzaXplOm8uc2l6ZSxhbGlnbjpvLm1heEVmZmVjdGl2ZUFsaWduLHR5cGU6e3RhZzpyLGZpZWxkczpvLmZpZWxkc319fXRocm93IG5ldyBFcnJvcihgZmZpLXN0cnVjdDogdW5rbm93biAnIycgZGVjbGFyYXRpb24gJHtKU09OLnN0cmluZ2lmeShTdHJpbmcocikpfWApfXRocm93IG5ldyBFcnJvcihgZmZpLXN0cnVjdDogaW52YWxpZCBtZW1iZXIgdmFsdWU6ICR7U3RyaW5nKHQpfWApfWZ1bmN0aW9uIGh0KHQpe2xldCBlPXRbIiMiXT09PSJzdHJ1Y3QiLHI9dFsiI3BhY2siXT8/OCxvPTEsbj0wLGk9W10sYz0wLHM9LTEscD0wLGE9MCx1PSgpPT57czwwfHwoYz1YKHMrTWF0aC5jZWlsKHAvOCksYSkscz0tMSl9O2ZvcihsZXRbeCxkXW9mIE9iamVjdC5lbnRyaWVzKHQpKXtpZih4LnN0YXJ0c1dpdGgoIiMiKSljb250aW51ZTtsZXQgdz0vXihbXkBdKylAKFxkKykkLy5leGVjKHgpLGY9dz93WzFdOngsUz13P051bWJlcih3WzJdKTowLHtzaXplOm0sYWxpZ246Vyx0eXBlOmx9PW10KGQpLEQ9dHlwZW9mIGQ9PSJzdHJpbmciJiZkLmVuZHNXaXRoKCIhIiksRT1XO2lmKHI+MCYmKEU9TWF0aC5taW4ocixFKSksUyYmKEU9TWF0aC5tYXgoRSxTKSksbC50YWc9PT0iYml0ZmllbGQiKXtpZihmLnN0YXJ0c1dpdGgoIiQiKSl0aHJvdyBuZXcgRXJyb3IoImZmaS1zdHJ1Y3Q6IGJpdGZpZWxkIG1lbWJlcnMgbXVzdCBiZSBuYW1lZCIpO2lmKCFlKXtpLnB1c2goe25hbWU6ZixvZmZzZXQ6MCxzaXplOm0sdHlwZTp7Li4ubCxiaXQ6MH19KSxvPU1hdGgubWF4KG8sRSksbj1NYXRoLm1heChuLG0pO2NvbnRpbnVlfWxldCBoPWwud2lkdGg7KHM8MHx8bSE9PWF8fHAraD5hKjgpJiYocz49MCYmdSgpLHM9WChjLEUpLHA9MCxhPW0pLGkucHVzaCh7bmFtZTpmLG9mZnNldDpzLHNpemU6bSx0eXBlOnsuLi5sLGJpdDpwfX0pLHArPWgsbz1NYXRoLm1heChvLEUpLG49TWF0aC5tYXgobixtKTtjb250aW51ZX11KCk7bGV0IEM9WChjLEUpO2lmKCFmLnN0YXJ0c1dpdGgoIiQiKSlpLnB1c2goe25hbWU6ZixvZmZzZXQ6QyxzaXplOm0sdHlwZTpsLC4uLkQ/e25vbm51bGw6ITB9Ont9fSk7ZWxzZXtpZihsLnRhZyE9PSJzdHJ1Y3QiJiZsLnRhZyE9PSJ1bmlvbiIpdGhyb3cgbmV3IEVycm9yKGBmZmktc3RydWN0OiBhbm9ueW1vdXMgbWVtYmVyICIke2Z9IiBtdXN0IGJlIGEgc3RydWN0L3VuaW9uYCk7Zm9yKGxldCBoIG9mIGwuZmllbGRzKWkucHVzaCh7Li4uaCxvZmZzZXQ6aC5vZmZzZXQrQ30pfWUmJihjPUMrbSksbz1NYXRoLm1heChvLEUpLG49TWF0aC5tYXgobixtKX1yZXR1cm4gdSgpLHtzaXplOlgoZT9jOm4sbyksbWF4RWZmZWN0aXZlQWxpZ246byxmaWVsZHM6aX19ZnVuY3Rpb24gJHQodCxlLHIpe2xldCBvPSRbcl07cmV0dXJuIG89PT0xP0JpZ0ludCh0LmdldFVpbnQ4KGUpKTpvPT09Mj9CaWdJbnQodC5nZXRVaW50MTYoZSwhMCkpOm89PT00P0JpZ0ludCh0LmdldFVpbnQzMihlLCEwKSk6dC5nZXRCaWdVaW50NjQoZSwhMCl9ZnVuY3Rpb24gUGUodCxlLHIsbyl7bGV0IG49JFtyXTtpZihuPT09MSl7dC5zZXRVaW50OChlLE51bWJlcihvJjB4ZmZuKSk7cmV0dXJufWlmKG49PT0yKXt0LnNldFVpbnQxNihlLE51bWJlcihvJjB4ZmZmZm4pLCEwKTtyZXR1cm59aWYobj09PTQpe3Quc2V0VWludDMyKGUsTnVtYmVyKG8mMHhmZmZmZmZmZm4pLCEwKTtyZXR1cm59dC5zZXRCaWdVaW50NjQoZSxvJjB4ZmZmZmZmZmZmZmZmZmZmZm4sITApfWZ1bmN0aW9uIE1lKHQsZSxyKXtsZXQgbz1CaWdJbnQoci53aWR0aCksbj0kdCh0LGUsci51bml0KT4+QmlnSW50KHIuYml0KSYoMW48PG8pLTFuO3JldHVybiByLnVuaXRbMF09PT0iaSImJm4mMW48PG8tMW4mJihuLT0xbjw8byksci53aWR0aD41Mz9uOk51bWJlcihuKX1mdW5jdGlvbiBPZSh0LGUscixvKXtsZXQgbj1CaWdJbnQoci53aWR0aCksaT1CaWdJbnQoci5iaXQpLGM9KDFuPDxuKS0xbixzPWM8PGkscD0kdCh0LGUsci51bml0KSxhPSh0eXBlb2Ygbz09ImJpZ2ludCI/bzpCaWdJbnQoTWF0aC50cnVuYyhvKSkpJmM7UGUodCxlLHIudW5pdCxwJn5zfGE8PGkpfXZhciBSZT17InV0Zi04IjpuZXcgVGV4dEVuY29kZXIoInV0Zi04IiksInV0Zi0xNmxlIjpuZXcgVGV4dEVuY29kZXIoInV0Zi0xNmxlIil9LEFlPXsidXRmLTgiOm5ldyBUZXh0RGVjb2RlcigidXRmLTgiLHtpZ25vcmVCT006ITB9KSwidXRmLTE2bGUiOm5ldyBUZXh0RGVjb2RlcigidXRmLTE2bGUiLHtpZ25vcmVCT006ITB9KX07ZnVuY3Rpb24gQmUodCxlLHIsbyl7bGV0IG49bmV3IFVpbnQ4QXJyYXkodC5idWZmZXIsdC5ieXRlT2Zmc2V0K2UsciksaT1vPT09InV0Zi0xNmxlIj8yOjEsYz1yO2ZvcihsZXQgcz0wO3MraTw9cjtzKz1pKWlmKG5bc109PT0wJiYoaT09PTF8fG5bcysxXT09PTApKXtjPXM7YnJlYWt9cmV0dXJuIEFlW29dLmRlY29kZShuLnN1YmFycmF5KDAsYykpfWZ1bmN0aW9uIEdlKHQsZSxyLG8sbil7bGV0IGk9bmV3IFVpbnQ4QXJyYXkodC5idWZmZXIsdC5ieXRlT2Zmc2V0K2Uscik7aS5maWxsKDApO2xldCBzPXItKG89PT0idXRmLTE2bGUiPzI6MSk7aWYoczw9MClyZXR1cm47bGV0IHA9UmVbb10uZW5jb2RlKFN0cmluZyhuPz8iIikpO2kuc2V0KHAuc3ViYXJyYXkoMCxNYXRoLm1pbihwLmxlbmd0aCxzKSkpfWZ1bmN0aW9uIExlKHQsZSxyLG8pe2xldCBuPW8uZWxlbWVudFNpemU+MD9yL28uZWxlbWVudFNpemU6MCxpPVtdO2ZvcihsZXQgYz0wO2M8bjtjKyspaS5wdXNoKFl0KHQsZStjKm8uZWxlbWVudFNpemUsby5lbGVtZW50VHlwZSxvLmVsZW1lbnRTaXplKSk7cmV0dXJuIGl9ZnVuY3Rpb24ga2UodCxlLHIsbyxuKXtsZXQgaT1vLmVsZW1lbnRTaXplPjA/ci9vLmVsZW1lbnRTaXplOjAsYz1uPz9bXTtmb3IobGV0IHM9MDtzPGk7cysrKVZ0KHQsZStzKm8uZWxlbWVudFNpemUsby5lbGVtZW50VHlwZSxvLmVsZW1lbnRTaXplLGNbc10pfWZ1bmN0aW9uIFl0KHQsZSxyLG8pe3N3aXRjaChyLnRhZyl7Y2FzZSJiYXNpYyI6cmV0dXJuIFYodCxlLHIua2luZCk7Y2FzZSJiaXRmaWVsZCI6cmV0dXJuIE1lKHQsZSxyKTtjYXNlInN0cmluZyI6cmV0dXJuIEJlKHQsZSxvLHIuZW5jb2RpbmcpO2Nhc2Uic3RydWN0IjpjYXNlInVuaW9uIjpyZXR1cm4gb3QodCxlLHIuZmllbGRzKTtjYXNlImFycmF5IjpyZXR1cm4gTGUodCxlLG8scil9fWZ1bmN0aW9uIFZ0KHQsZSxyLG8sbil7c3dpdGNoKHIudGFnKXtjYXNlImJhc2ljIjpkdCh0LGUse2s6ci5raW5kLHY6bn0pO2JyZWFrO2Nhc2UiYml0ZmllbGQiOk9lKHQsZSxyLG4/PzApO2JyZWFrO2Nhc2Uic3RyaW5nIjpHZSh0LGUsbyxyLmVuY29kaW5nLG4pO2JyZWFrO2Nhc2Uic3RydWN0IjpjYXNlInVuaW9uIjp2dCh0LGUsci5maWVsZHMsbj8/e30pO2JyZWFrO2Nhc2UiYXJyYXkiOmtlKHQsZSxvLHIsbik7YnJlYWt9fWZ1bmN0aW9uIG90KHQsZSxyKXtsZXQgbz17fTtmb3IobGV0IG4gb2Ygcil7bGV0IGk9WXQodCxlK24ub2Zmc2V0LG4udHlwZSxuLnNpemUpO2lmKG4ubm9ubnVsbCYmaT09PTApdGhyb3cgbmV3IEVycm9yKGBmZmktc3RydWN0OiBkZWNvZGU6ICchJyBmaWVsZCAiJHtuLm5hbWV9IiBnb3QgMCAoQyBkaWQgbm90IGZpbGwgaXQsIG9yIGRlY29kZSB3YXMgY2FsbGVkIG9uIGFuIHVuZmlsbGVkIHNsb3QpYCk7b1tuLm5hbWVdPWl9cmV0dXJuIG99ZnVuY3Rpb24gdnQodCxlLHIsbyl7Zm9yKGxldCBuIG9mIHIpb1tuLm5hbWVdIT09dm9pZCAwJiZWdCh0LGUrbi5vZmZzZXQsbi50eXBlLG4uc2l6ZSxvW24ubmFtZV0pfWZ1bmN0aW9uIFVlKHQpe2xldHtmaWVsZHM6ZSxzaXplOnIsbWF4RWZmZWN0aXZlQWxpZ246b309aHQodCk7cmV0dXJue19fc3RydWN0OnQsc2l6ZTpyLHN0cnVjdEFsaWduOm8sZGVjb2RlOm49Pm90KHR5cGVvZiBuPT0ibnVtYmVyIj9uZXcgRGF0YVZpZXcod3QucmVhZEJ5dGVzKG4scikpOm5ldyBEYXRhVmlldyhuKSwwLGUpLGFsbG9jOihuPT57aWYobiE9PXZvaWQgMCYmKCFOdW1iZXIuaXNJbnRlZ2VyKG4pfHxuPDEpKXRocm93IG5ldyBFcnJvcigiZmZpLXN0cnVjdDogYWxsb2MobikgcmVxdWlyZXMgYW4gaW50ZWdlciBuID49IDEgKFBBQigwKSBuZXZlciBlc2NhcGVzIFx1MjAxNCBwYXNzIE5VTEwgZm9yIGFuIGVtcHR5IHBvaW50ZXIgcG9zaXRpb24pIik7cmV0dXJuIG5ldyBiKHIqKG4/PzEpKX0pLGVuY29kZTooKG4saSxjKT0+e2lmKG49PW51bGwpdGhyb3cgbmV3IEVycm9yKCJmZmktc3RydWN0OiBlbmNvZGUodikgcmVxdWlyZXMgYW4gYXJndW1lbnQ7IHVzZSBhbGxvYygpIGZvciBhIHplcm9lZCBvdXQtcGFyYW0gc2xvdCIpO2xldCBzPWk/P25ldyBiKHIpO3JldHVybiB2dChuZXcgRGF0YVZpZXcocyksYz8/MCxlLG4pLHN9KSxvZmZzZXRPZjpuPT57Zm9yKGxldCBpIG9mIGUpaWYoaS5uYW1lPT09bilyZXR1cm4gaS5vZmZzZXQ7dGhyb3cgbmV3IEVycm9yKGBmZmktc3RydWN0OiBubyBmaWVsZCAiJHtufSJgKX19fWZ1bmN0aW9uIF9lKHQsZSxyKXtsZXQgbz17IiMiOnR9O3IhPT12b2lkIDAmJihvWyIjcGFjayJdPXIpO2ZvcihsZXRbbixpXW9mIE9iamVjdC5lbnRyaWVzKGUpKW4uc3RhcnRzV2l0aCgiIyIpfHwob1tuXT1pKTtyZXR1cm4gb31mdW5jdGlvbiBqdCh0KXtsZXR7ZmllbGRzOmUsc2l6ZTpyfT1odCh0Ll9fc3RydWN0KSxvPShuLGkpPT57bGV0IGM9W107Zm9yKGxldCBzPTA7czxpO3MrKyljLnB1c2gob3QobixzKnIsZSkpO3JldHVybiBjfTtyZXR1cm57ZW5jb2RlOm49PntpZighQXJyYXkuaXNBcnJheShuKXx8bi5sZW5ndGg9PT0wKXRocm93IG5ldyBFcnJvcigiZmZpLXN0cnVjdDogc3RydWN0QXJyYXkoZGVmKS5lbmNvZGUoZWxzKSByZXF1aXJlcyBhIG5vbi1lbXB0eSBlbGVtZW50IGFycmF5IChwYXNzIE5VTEwgZm9yIGFuIGVtcHR5IHBvaW50ZXIgcG9zaXRpb24pIik7bGV0IGk9dC5hbGxvYyhuLmxlbmd0aCk7Zm9yKGxldCBjPTA7YzxuLmxlbmd0aDtjKyspdC5lbmNvZGUobltjXSxpLGMqdC5zaXplKTtyZXR1cm4gaX0sZGVjb2RlOigobixpKT0+e2lmKGkhPT12b2lkIDAmJighTnVtYmVyLmlzSW50ZWdlcihpKXx8aTwwKSl0aHJvdyBuZXcgRXJyb3IoYGZmaS1zdHJ1Y3Q6IHN0cnVjdEFycmF5LmRlY29kZShwLCBjb3VudCkgcmVxdWlyZXMgYSBub24tbmVnYXRpdmUgaW50ZWdlciBjb3VudCwgZ290ICR7aX1gKTtpZih0eXBlb2Ygbj09Im51bWJlciIpe2lmKGk9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKCJmZmktc3RydWN0OiBzdHJ1Y3RBcnJheS5kZWNvZGUoYWRkcmVzcywgY291bnQpIHJlcXVpcmVzIGFuIGV4cGxpY2l0IGNvdW50IChhIGJhcmUgYWRkcmVzcyBjYXJyaWVzIG5vIGxlbmd0aCkiKTtyZXR1cm4gaT09PTA/W106byhuZXcgRGF0YVZpZXcod3QucmVhZEJ5dGVzKG4saSpyKSksaSl9bGV0IGM7aWYoaSE9PXZvaWQgMCl7aWYoYz1pLGMqcj5uLmJ5dGVMZW5ndGgpdGhyb3cgbmV3IEVycm9yKGBmZmktc3RydWN0OiBzdHJ1Y3RBcnJheS5kZWNvZGU6IGNvdW50ICR7Y30gXHhENyBzaXplICR7cn0gPSAke2Mqcn0gZXhjZWVkcyBidWZmZXIgYnl0ZUxlbmd0aCAke24uYnl0ZUxlbmd0aH1gKX1lbHNle2lmKG4uYnl0ZUxlbmd0aCVyIT09MCl0aHJvdyBuZXcgRXJyb3IoYGZmaS1zdHJ1Y3Q6IHN0cnVjdEFycmF5LmRlY29kZTogYnl0ZUxlbmd0aCAke24uYnl0ZUxlbmd0aH0gaXMgbm90IGEgbXVsdGlwbGUgb2Ygc2l6ZSAke3J9IChtaXhlZCBidWZmZXI/IHBhc3MgY291bnQgZXhwbGljaXRseSlgKTtjPW4uYnl0ZUxlbmd0aC9yfXJldHVybiBjPT09MD9bXTpvKG5ldyBEYXRhVmlldyhuKSxjKX0pfX1mdW5jdGlvbiBnKHQsZSxyKXtsZXQgbz10eXBlb2YgdD09InN0cmluZyI7cmV0dXJuIFVlKF9lKCJzdHJ1Y3QiLG8/ZTp0LChvP3I6ZSk/LnBhY2spKX12YXIgUD1nKCJSRUNUIix7bGVmdDoiaTMyIix0b3A6ImkzMiIscmlnaHQ6ImkzMiIsYm90dG9tOiJpMzIifSksaj1nKCJQT0lOVCIse3g6ImkzMiIseToiaTMyIn0pO3ZhciBudD1nKCJTVEFSVFVQSU5GT1ciLHtjYjoidTMyIixscFJlc2VydmVkOiI8PnB0ciIsbHBEZXNrdG9wOiI8PnB0ciIsbHBUaXRsZToiPD5wdHIiLGR3WDoidTMyIixkd1k6InUzMiIsZHdYU2l6ZToidTMyIixkd1lTaXplOiJ1MzIiLGR3WENvdW50Q2hhcnM6InUzMiIsZHdZQ291bnRDaGFyczoidTMyIixkd0ZpbGxBdHRyaWJ1dGU6InUzMiIsZHdGbGFnczoidTMyIix3U2hvd1dpbmRvdzoidTE2QFNob3dXaW5kb3dDbWQiLGNiUmVzZXJ2ZWQyOiJ1MTYiLGxwUmVzZXJ2ZWQyOiI8PnB0ciIsaFN0ZElucHV0OiI8SEZJTEU+cHRyIixoU3RkT3V0cHV0OiI8SEZJTEU+cHRyIixoU3RkRXJyb3I6IjxIRklMRT5wdHIifSksQ3Q9ZygiUFJPQ0VTU19JTkZPUk1BVElPTiIse2hQcm9jZXNzOiI8SFBST0NFU1M+cHRyISIsaFRocmVhZDoiPEhUSFJFQUQ+cHRyISIsZHdQcm9jZXNzSWQ6InUzMiIsZHdUaHJlYWRJZDoidTMyIn0pLEo9ZygiQklUTUFQSU5GT0hFQURFUiIse2JpU2l6ZToidTMyIixiaVdpZHRoOiJpMzIiLGJpSGVpZ2h0OiJpMzIiLGJpUGxhbmVzOiJ1MTYiLGJpQml0Q291bnQ6InUxNiIsYmlDb21wcmVzc2lvbjoidTMyIixiaVNpemVJbWFnZToidTMyIixiaVhQZWxzUGVyTWV0ZXI6ImkzMiIsYmlZUGVsc1Blck1ldGVyOiJpMzIiLGJpQ2xyVXNlZDoidTMyIixiaUNsckltcG9ydGFudDoidTMyIn0pLGl0PWcoIkJJVE1BUEZJTEVIRUFERVIiLHtiZlR5cGU6InUxNiIsYmZTaXplOiJ1MzIiLGJmUmVzZXJ2ZWQxOiJ1MTYiLGJmUmVzZXJ2ZWQyOiJ1MTYiLGJmT2ZmQml0czoidTMyIn0se3BhY2s6Mn0pO3ZhciBaPWcoIk5NSERSIix7aHduZEZyb206IjxIV05EPnB0ciIsaWRGcm9tOiI8PnB0ciIsY29kZToiaTMyIn0pLHplPWcoIlNZU1RFTVRJTUUiLHt3WWVhcjoidTE2Iix3TW9udGg6InUxNiIsd0RheU9mV2VlazoidTE2Iix3RGF5OiJ1MTYiLHdIb3VyOiJ1MTYiLHdNaW51dGU6InUxNiIsd1NlY29uZDoidTE2Iix3TWlsbGlzZWNvbmRzOiJ1MTYifSksbXI9ZygiTk1EQVRFVElNRUNIQU5HRSIse2hkcjpaLl9fc3RydWN0LGR3RmxhZ3M6InUzMiIsc3Q6emUuX19zdHJ1Y3R9KSwkZT1nKCJMSVRFTSIse21hc2s6InUzMiIsaUxpbms6ImkzMiIsc3RhdGU6InUzMiIsc3RhdGVNYXNrOiJ1MzIiLHN6SUQ6InUxNls0OF1AdXRmLTE2bGUiLHN6VXJsOiJ1MTZbMjA4NF1AdXRmLTE2bGUifSksd3I9ZygiTk1MSU5LIix7aGRyOlouX19zdHJ1Y3QsaXRlbTokZS5fX3N0cnVjdH0pLGhyPWcoIk5NQ1VTVE9NRFJBVyIse2hkcjpaLl9fc3RydWN0LGR3RHJhd1N0YWdlOiJ1MzIiLGhkYzoiPEhEQz5wdHIiLHJjOiJpMzJbNF0iLGR3SXRlbVNwZWM6Ijw+cHRyIix1SXRlbVN0YXRlOiJ1MzIiLGxJdGVtbFBhcmFtOiI8PnB0ciJ9KSxDcj1nKCJOTUxWQ1VTVE9NRFJBVyIse2hkcjpaLl9fc3RydWN0LGR3RHJhd1N0YWdlOiJ1MzIiLGhkYzoiPEhEQz5wdHIiLHJjOiJpMzJbNF0iLGR3SXRlbVNwZWM6Ijw+cHRyIix1SXRlbVN0YXRlOiJ1MzIiLGxJdGVtbFBhcmFtOiI8PnB0ciIsY2xyVGV4dDoidTMyIixjbHJUZXh0Qms6InUzMiIsaVN1Ykl0ZW06ImkzMiIsZHdJdGVtVHlwZToidTMyIn0pLFNyPWcoIk5NTElTVFZJRVciLHtoZHI6Wi5fX3N0cnVjdCxpSXRlbToiaTMyIixpU3ViSXRlbToiaTMyIix1TmV3U3RhdGU6InUzMiIsdU9sZFN0YXRlOiJ1MzIiLHVDaGFuZ2VkOiJ1MzIiLHB0QWN0aW9uOiJpMzJbMl0iLGxQYXJhbToiPD5wdHIifSk7dmFyIFllPWcoIlRWSVRFTSIse21hc2s6InUzMiIsaEl0ZW06Ijw+cHRyIixzdGF0ZToidTMyIixzdGF0ZU1hc2s6InUzMiIscHN6VGV4dDoiPD5wdHIiLGNjaFRleHRNYXg6ImkzMiIsaUltYWdlOiJpMzIiLGlTZWxlY3RlZEltYWdlOiJpMzIiLGNDaGlsZHJlbjoiaTMyIixsUGFyYW06Ijw+cHRyIn0pLGdyPWcoIlRWSU5TRVJUU1RSVUNUIix7aFBhcmVudDoiPD5wdHIiLGhJbnNlcnRBZnRlcjoiPD5wdHIiLGl0ZW06WWUuX19zdHJ1Y3R9KTt2YXIgVmU9ZygiTVNHIix7aHduZDoiPEhXTkQ+cHRyIixtZXNzYWdlOiJ1MzIiLHdQYXJhbToiPD5wdHIiLGxQYXJhbToiPD5wdHIiLHRpbWU6InUzMiIscHQ6ai5fX3N0cnVjdH0pLERyPWcoIlBBSU5UU1RSVUNUIix7aGRjOiI8SERDPnB0ciIsZkVyYXNlOiJpMzIiLHJjUGFpbnQ6UC5fX3N0cnVjdCxmUmVzdG9yZToiaTMyIixmSW5jVXBkYXRlOiJpMzIiLHJnYlJlc2VydmVkOiJ1OFszMl0ifSk7dmFyIHN0PWcoIk9TVkVSU0lPTklORk9fMTQ4Iix7ZHdPU1ZlcnNpb25JbmZvU2l6ZToidTMyIixkd01ham9yVmVyc2lvbjoidTMyIixkd01pbm9yVmVyc2lvbjoidTMyIixkd0J1aWxkTnVtYmVyOiJ1MzIiLGR3UGxhdGZvcm1JZDoidTMyIixzekNTRFZlcnNpb246InU4WzEyOF0ifSk7dmFyIE89KHQsZSxyKT0+Rygia2VybmVsMzIuZGxsIix0LGUsciksSnQ9TygiQ3JlYXRlUGlwZSIsIjw+cHRyIDw+cHRyIDw+cHRyIHUzMiAtPiBpMzIiKSxTdD1PKCJTZXRIYW5kbGVJbmZvcm1hdGlvbiIsIjxIRklMRT5wdHIhIHUzMiB1MzIgLT4gaTMyIiksS3Q9TygiQ3JlYXRlUHJvY2Vzc1ciLCI8V0NIQVI+cHRyIDxXQ0hBUj5wdHIgPD5wdHIgPD5wdHIgaTMyIHUzMiA8PnB0ciA8V0NIQVI+cHRyIDxTVEFSVFVQSU5GT1c+cHRyIDxQUk9DRVNTX0lORk9STUFUSU9OPnB0ciAtPiBpMzIiLHtTVEFSVFVQSU5GT1c6bnR9KSxYdD1PKCJXYWl0Rm9yU2luZ2xlT2JqZWN0IiwiPD5wdHIgdTMyIC0+IHUzMiIpLFp0PU8oIkdldEV4aXRDb2RlUHJvY2VzcyIsIjxIUFJPQ0VTUz5wdHIhIDxCWVRFPnB0ciAtPiBpMzIiKSxVPU8oIkNsb3NlSGFuZGxlIiwiPD5wdHIgLT4gaTMyIik7dmFyIHF0PU8oIlJlYWRGaWxlIiwiPEhGSUxFPnB0ciEgPEJZVEU+cHRyIHUzMiA8QllURT5wdHIgPD5wdHIgLT4gaTMyIik7dmFyIGd0PU8oIkdldExhc3RFcnJvciIsIiAtPiB1MzIiKSxRdD1PKCJHZXRTeXN0ZW1EaXJlY3RvcnlXIiwiPEJZVEU+cHRyIHUzMiAtPiB1MzIiKTtpbXBvcnQqYXMgdGUgZnJvbSJvcyI7dmFyIE49KHQsZSxyKT0+RygidXNlcjMyLmRsbCIsdCxlLHIpLEhyPU4oIkdldERlc2t0b3BXaW5kb3ciLCIgLT4gPEhXTkQ+cHRyIiksZWU9dGUuYXJjaD09PSJ4NjQiPyJQdHJXIjoiVyI7dmFyIER0PU4oIkdldFdpbmRvd1JlY3QiLCI8SFdORD5wdHIgPFJFQ1Q+cHRyIC0+IGkzMiIpLHJlPU4oIkdldENsaWVudFJlY3QiLCI8SFdORD5wdHIgPFJFQ1Q+cHRyIC0+IGkzMiIpO3ZhciBvZT1OKCJJc1dpbmRvd1Zpc2libGUiLCI8SFdORD5wdHIgLT4gaTMyIiksRXQ9TigiSXNJY29uaWMiLCI8SFdORD5wdHIgLT4gaTMyIik7dmFyIG5lPU4oIkdldFdpbmRvd1RleHRXIiwiPEhXTkQ+cHRyIDxCWVRFPnB0ciBpMzIgLT4gaTMyIik7dmFyIGllPU4oIkdldENsYXNzTmFtZVciLCI8SFdORD5wdHIgPEJZVEU+cHRyIGkzMiAtPiBpMzIiKSxQcj1OKCJHZXRXaW5kb3dMb25nIitlZSwiPEhXTkQ+cHRyIGkzMkBHd2xwIC0+IDw+cHRyIiksTXI9TigiU2V0V2luZG93TG9uZyIrZWUsIjxIV05EPnB0ciBpMzJAR3dscCA8PnB0ciAtPiA8PnB0ciIpO3ZhciBzZT1OKCJHZXREQyIsIjxIV05EPnB0ciAtPiA8SERDPnB0ciIpLFd0PU4oIlJlbGVhc2VEQyIsIjxIV05EPnB0ciA8SERDPnB0ciEgLT4gaTMyIiksY2U9TigiUHJpbnRXaW5kb3ciLCI8SFdORD5wdHIgPEhEQz5wdHIhIHUzMiAtPiBpMzIiKTt2YXIgcGU9TigiQ2xpZW50VG9TY3JlZW4iLCI8SFdORD5wdHIgPFBPSU5UPnB0ciAtPiBpMzIiKTt2YXIgXz1OKCJHZXRTeXN0ZW1NZXRyaWNzIiwiaTMyIC0+IGkzMiIpO3ZhciBhZT1OKCJFbnVtV2luZG93cyIsIjw+cHRyIDw+cHRyIC0+IGkzMiIpO3ZhciB6PSh0LGUscik9PkcoImdkaTMyLmRsbCIsdCxlLHIpLExyPWp0KGopO3ZhciBUdD16KCJEZWxldGVPYmplY3QiLCI8SEdESU9CSj5wdHIgLT4gaTMyIik7dmFyIGJ0PXooIkNyZWF0ZUNvbXBhdGlibGVEQyIsIjxIREM+cHRyIC0+IDxIREM+cHRyIiksTnQ9eigiQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcCIsIjxIREM+cHRyISBpMzIgaTMyIC0+IDxIR0RJT0JKPnB0ciIpO3ZhciBxPXooIlNlbGVjdE9iamVjdCIsIjxIREM+cHRyISA8SEdESU9CSj5wdHIgLT4gPEhHRElPQko+cHRyIiksSXQ9eigiQml0Qmx0IiwiPEhEQz5wdHIhIGkzMiBpMzIgaTMyIGkzMiA8SERDPnB0ciBpMzIgaTMyIHUzMkBSYXN0ZXJPcCAtPiBpMzIiKSx1ZT16KCJHZXRESUJpdHMiLCI8SERDPnB0ciEgPEhHRElPQko+cHRyIHUzMiB1MzIgPEJZVEU+cHRyIDw+cHRyIHUzMiAtPiBpMzIiKTt2YXIgUT16KCJEZWxldGVEQyIsIjxIREM+cHRyISAtPiBpMzIiKTt2YXIgdmU9KHQsZSk9PkcoIm50ZGxsLmRsbCIsdCxlKSxsZT12ZSgiUnRsR2V0VmVyc2lvbiIsIjxPU1ZFUlNJT05JTkZPXzE0OD5wdHIgLT4gaTMyIik7dmFyIG1lPXQ9Pnt0cnl7bGV0IGU9eGUub3BlbigiZGlhZy5sb2ciLCJhIik7ZSYmKGUucHV0cyhgJHtEYXRlLm5vdygpfSAke3R9CmApLGUuY2xvc2UoKSl9Y2F0Y2h7fX0seXQ9MSxqZT0yNTYsSmU9NDI5NDk2NzI5NSxGPWZlLldvcmtlci5wYXJlbnQsd2U9IkM6XFxXaW5kb3dzXFxTeXN0ZW0zMiI7dHJ5e2xldCB0PUIuYWxsb2MoMjU2KSxyPVF0KHQsMjU2KT4wP0IuZGVjb2RlKHQpOiIiO3ImJih3ZT1yKX1jYXRjaCh0KXttZSgiU1lTLURJUi1GQUlMOiAiK1N0cmluZyh0KSl9dmFyIGhlPSExO3RyeXtsZXQgdD1zdC5lbmNvZGUoe2R3T1NWZXJzaW9uSW5mb1NpemU6c3Quc2l6ZX0pO2xlKHQucHRyKT09PTAmJihoZT1zdC5kZWNvZGUodCkuZHdNYWpvclZlcnNpb24+PTEwKX1jYXRjaCh0KXttZSgiVkVSLUZBSUw6ICIrU3RyaW5nKHQpKX12YXIgRnQ9ZygiUElQRV9IQU5ETEVTIix7aFJlYWQ6IjxIRklMRT5wdHIhIixoV3JpdGU6IjxIRklMRT5wdHIhIn0pO2Z1bmN0aW9uIEtlKHQsZSl7bGV0IHI9RnQuYWxsb2MoKTtpZighSnQoci5wdHIsci5wdHIrRnQub2Zmc2V0T2YoImhXcml0ZSIpLEksMCkpdGhyb3cgbmV3IEVycm9yKCJDcmVhdGVQaXBlIGVycj0iK2d0KCkpO2xldHtoUmVhZDpvLGhXcml0ZTpufT1GdC5kZWNvZGUocik7U3Qobix5dCx5dCksU3Qobyx5dCwwKTtsZXQgaT1DdC5hbGxvYygpLHM9YCR7d2V9XFxjbWQuZXhlICR7aGU/Ii91ICI6IiJ9L2MgJHtlfWA7aWYoIUt0KEkscyxJLEksMSwwLEksSSx7Y2I6bnQuc2l6ZSxkd0ZsYWdzOmplLGhTdGRPdXRwdXQ6bixoU3RkRXJyb3I6bn0saS5wdHIpKXRocm93IFUobyksVShuKSxuZXcgRXJyb3IoIkNyZWF0ZVByb2Nlc3NXIGVycj0iK2d0KCkrIiBjbWQ9IitzKTtsZXR7aFByb2Nlc3M6cCxoVGhyZWFkOmEsZHdQcm9jZXNzSWQ6dX09Q3QuZGVjb2RlKGkpO1UoYSksVShuKSxGLnBvc3RNZXNzYWdlKHt0eXBlOiJpbmZvIixpZDp0LHBpZDp1fSk7bGV0IHg9bmV3IGIoNDA5NiksZD1uZXcgVWludDhBcnJheSh4KSx3PW5ldyBiKDQpLGY9bmV3IFVpbnQzMkFycmF5KHcpO2Zvcig7ZlswXT0wLCEhcXQobyx4LDQwOTYsdyxJKTspe2xldCBsPWZbMF07aWYobD09PTApYnJlYWs7Ri5wb3N0TWVzc2FnZSh7dHlwZToiZGF0YSIsaWQ6dCxjaHVuazpkLnNsaWNlKDAsbCl9KX1YdChwLEplKTtsZXQgUz1uZXcgYig0KSxtPW5ldyBJbnQzMkFycmF5KFMpO1p0KHAsUyk7bGV0IFc9bVswXTtyZXR1cm4gVShvKSxVKHApLFd9dmFyIENlPTEzMzY5Mzc2LFhlPTAsZGU9NjU1MzYsWmU9NGU3LGN0PTUxMixxZT0yZTQsSHQ9aXQuc2l6ZStKLnNpemU7ZnVuY3Rpb24gUWUodCxlLHIpe2xldCBvPWl0LmVuY29kZSh7YmZUeXBlOjE5Nzc4LGJmU2l6ZTpIdCt0LGJmT2ZmQml0czpIdH0pLG49Si5lbmNvZGUoe2JpU2l6ZTpKLnNpemUsYmlXaWR0aDplLGJpSGVpZ2h0Oi1yLGJpUGxhbmVzOjEsYmlCaXRDb3VudDozMixiaUNvbXByZXNzaW9uOjAsYmlTaXplSW1hZ2U6dCxiaVhQZWxzUGVyTWV0ZXI6MjgzNSxiaVlQZWxzUGVyTWV0ZXI6MjgzNX0pLGk9bmV3IFVpbnQ4QXJyYXkoSHQpO3JldHVybiBpLnNldChuZXcgVWludDhBcnJheShvKSwwKSxpLnNldChuZXcgVWludDhBcnJheShuKSxpdC5zaXplKSxpfWZ1bmN0aW9uIHRyKHQsZSxyLG8sbil7bGV0IGk9bmV3IGIobypuKjQpLGM9bmV3IFVpbnQ4QXJyYXkoaSkscz1KLmVuY29kZSh7YmlTaXplOkouc2l6ZSxiaVdpZHRoOm8sYmlIZWlnaHQ6LW4sYmlQbGFuZXM6MSxiaUJpdENvdW50OjMyLGJpU2l6ZUltYWdlOm8qbio0fSk7aWYodWUoZSxyLDAsbixpLHMucHRyLFhlKSE9PW4pcmV0dXJuITE7bGV0IGE9Yy5ieXRlTGVuZ3RoO0YucG9zdE1lc3NhZ2Uoe3R5cGU6ImRhdGEiLGlkOnQsY2h1bms6UWUoYSxvLG4pfSk7Zm9yKGxldCB1PTA7dTxhO3UrPWRlKUYucG9zdE1lc3NhZ2Uoe3R5cGU6ImRhdGEiLGlkOnQsY2h1bms6Yy5zbGljZSh1LE1hdGgubWluKHUrZGUsYSkpfSk7cmV0dXJuITB9ZnVuY3Rpb24gZXIodCxlLHIsbyxuLGksYyxzLHApe2xldCBhPWJ0KHQpLHU9YT9OdCh0LHIsbyk6MDtpZighYXx8IXUpcmV0dXJuIGEmJlEoYSksITE7bGV0IHg9cShhLHUpLHc9Y2UoZSxhLDApIT09MCYmSXQobiwwLDAscyxwLGEsaSxjLENlKSE9PTA7cmV0dXJuIHEoYSx4KSxUdCh1KSxRKGEpLHd9ZnVuY3Rpb24gU2UodCxlLHIsbyxuLGksYyxzLHAsYSl7aWYoIShzPjAmJnA+MCYmcypwPD1aZSkpdGhyb3cgbmV3IEVycm9yKCJjYXB0dXJlIHNpemUgaW52YWxpZCB3PSIrcysiIGg9IitwKTtpZihhIT09bnVsbCYmIShpPj0wJiZjPj0wJiZpK3M8PWUmJmMrcDw9cikpdGhyb3cgbmV3IEVycm9yKCJjYXB0dXJlIGNyb3Agb3V0IG9mIHJhbmdlIGNyb3A9KCIraSsiLCIrYysiLCIrcysieCIrcCsiKSBmcmFtZT0iK2UrIngiK3IpO2xldCB1PXNlKEkpO2lmKCF1KXRocm93IG5ldyBFcnJvcigiR2V0REMoTlVMTCk9MFx1RkYxQVx1NjVFMFx1OEY5M1x1NTE2NVx1Njg0Q1x1OTc2Mlx1RkYwOFx1Nzg2RVx1OEJBNFx1NTcyOFx1NEVBNFx1NEU5MiBzZXNzaW9uIFx1NTQyRlx1NTJBOFx1RkYwQ1x1ODAwQ1x1OTc1RSBzc2hkL3NlcnZpY2VcdUZGMDkiKTtsZXQgeD1idCh1KSxkPXg/TnQodSxzLHApOjA7aWYoIXh8fCFkKXRocm93IHgmJlEoeCksV3QoSSx1KSxuZXcgRXJyb3IoIkNyZWF0ZUNvbXBhdGlibGVEQy9CaXRtYXAgZmFpbGVkIik7bGV0IHc9cSh4LGQpLGY9YT09PW51bGw/SXQoeCwwLDAscyxwLHUsbyxuLENlKSE9PTA6ZXIodSxhLGUscix4LGksYyxzLHApO3EoeCx3KTtsZXQgUz1mJiZ0cih0LHgsZCxzLHApO2lmKFR0KGQpLFEoeCksV3QoSSx1KSwhZil0aHJvdyBuZXcgRXJyb3IoImNhcHR1cmUgZmFpbGVkIG91dD0iK3MrIngiK3ArKGE9PT1udWxsPyIgYXQ9KCIrbysiLCIrbisiKSI6IiBod25kPSIrYSsiIGNyb3A9KCIraSsiLCIrYysiKSBmcmFtZT0iK2UrIngiK3IpKTtpZighUyl0aHJvdyBuZXcgRXJyb3IoIkdldERJQml0cyBzaG9ydCByZWFkIG91dD0iK3MrIngiK3ApO3JldHVybnt3aWR0aDpzLGhlaWdodDpwfX1mdW5jdGlvbiBycih0KXtsZXQgZT1fKDApLHI9XygxKTtpZihlPD0wfHxyPD0wKXRocm93IG5ldyBFcnJvcigiR2V0U3lzdGVtTWV0cmljcyB3PSIrZSsiIGg9IityKTtyZXR1cm4gU2UodCxlLHIsMCwwLDAsMCxlLHIsbnVsbCl9ZnVuY3Rpb24gb3IodCxlLHIsbyl7aWYobz09PSJzY3JlZW4iJiZFdChlKSE9PTApdGhyb3cgbmV3IEVycm9yKCJ3aW5kb3cgbWluaW1pemVkXHVGRjFBbW9kZT1zY3JlZW4gXHU1M0VBXHU0RjFBXHU2MjJBXHU1MjMwXHU1QjgzXHU0RTBCXHU2NUI5XHU3Njg0XHU2ODRDXHU5NzYyXHVGRjBDXHU2NTM5XHU3NTI4IG1vZGU9cHJpbnQiKTtsZXQgbj1QLmFsbG9jKCk7aWYoIUR0KGUsbi5wdHIpKXRocm93IG5ldyBFcnJvcigiR2V0V2luZG93UmVjdChod25kPSIrZSsiKT0wXHVGRjFBXHU3QTk3XHU1M0UzXHU0RTBEXHU1QjU4XHU1NzI4XHU2MjE2XHU1REYyXHU5NTAwXHU2QkMxIik7bGV0e2xlZnQ6aSx0b3A6YyxyaWdodDpzLGJvdHRvbTpwfT1QLmRlY29kZShuKSxhPXMtaSx1PXAtYyx4PTAsZD0wLHc9YSxmPXU7aWYocj09PSJjbGllbnQiKXtsZXQgVz1QLmFsbG9jKCk7aWYoIXJlKGUsVy5wdHIpKXRocm93IG5ldyBFcnJvcigiR2V0Q2xpZW50UmVjdChod25kPSIrZSsiKT0wIik7bGV0e2xlZnQ6bCx0b3A6RCxyaWdodDpFLGJvdHRvbTpDfT1QLmRlY29kZShXKTt3PUUtbCxmPUMtRDtsZXQgaD1qLmVuY29kZSh7eDowLHk6MH0pO2lmKCFwZShlLGgucHRyKSl0aHJvdyBuZXcgRXJyb3IoIkNsaWVudFRvU2NyZWVuKGh3bmQ9IitlKyIpPTAiKTtsZXQgVD1qLmRlY29kZShoKTt4PVQueC1pLGQ9VC55LWN9bGV0IFM9bz09PSJwcmludCI/MDppK3gsbT1vPT09InByaW50Ij8wOmMrZDtpZihvPT09InNjcmVlbiIpe2xldCBXPV8oNzYpLGw9Xyg3NyksRD1fKDc4KSxFPV8oNzkpLEM9TWF0aC5tYXgoUyxXKSxoPU1hdGgubWF4KG0sbCksVD1NYXRoLm1pbihTK3csVytEKSxIPU1hdGgubWluKG0rZixsK0UpO2lmKFQ8PUN8fEg8PWgpdGhyb3cgbmV3IEVycm9yKCJjYXB0dXJlIGFyZWEgb3V0c2lkZSB2aXJ0dWFsIHNjcmVlbiBhdD0oIitTKyIsIittKyIsIit3KyJ4IitmKyIpIik7Uz1DLG09aCx3PVQtQyxmPUgtaH1yZXR1cm4gU2UodCxhLHUsUyxtLHgsZCx3LGYsbz09PSJwcmludCI/ZTpudWxsKX1mdW5jdGlvbiBucih0KXtsZXQgZT1bXSxyPV90KCI8SFdORD5wdHIgPD5wdHIgLT4gaTMyIixzPT4ocyYmZS5wdXNoKHMpLGUubGVuZ3RoPHFlPzE6MCkpO3RyeXthZShyLnB0cixJKX1maW5hbGx5e3IuZGlzcG9zZSgpfWxldCBvPVAuYWxsb2MoKSxuPUIuYWxsb2MoY3QpLGk9Qi5hbGxvYyhjdCksYz1bXTtmb3IobGV0IHMgb2YgZSlpZihEdChzLG8ucHRyKSl7bGV0IHA9UC5kZWNvZGUobyksYT1uZShzLG4sY3QpLHU9aWUocyxpLGN0KTtjLnB1c2goe2h3bmQ6cyx0aXRsZTphPjA/Qi5kZWNvZGUobik6IiIsY2xhc3NOYW1lOnU+MD9CLmRlY29kZShpKToiIixyZWN0OntsZWZ0OnAubGVmdCx0b3A6cC50b3AscmlnaHQ6cC5yaWdodCxib3R0b206cC5ib3R0b219LHZpc2libGU6b2UocykhPT0wLG1pbmltaXplZDpFdChzKSE9PTB9KX1GLnBvc3RNZXNzYWdlKHt0eXBlOiJyZXN1bHQiLGlkOnQsY29kZTowLGVycm9yOm51bGwsd2luZG93czpjfSl9ZnVuY3Rpb24gaXIodCl7aWYodC50eXBlPT09InJ1biIpe2lmKHR5cGVvZiB0LmNtZCE9InN0cmluZyIpcmV0dXJuO2xldCBlPS0xLHI9bnVsbDt0cnl7ZT1LZSh0LmlkLHQuY21kKX1jYXRjaChvKXtyPVN0cmluZyhvKX1GLnBvc3RNZXNzYWdlKHt0eXBlOiJyZXN1bHQiLGlkOnQuaWQsY29kZTplLGVycm9yOnJ9KTtyZXR1cm59aWYodC50eXBlPT09IndpbmRvd3MiKXt0cnl7bnIodC5pZCl9Y2F0Y2goZSl7Ri5wb3N0TWVzc2FnZSh7dHlwZToicmVzdWx0IixpZDp0LmlkLGNvZGU6LTEsZXJyb3I6U3RyaW5nKGUpfSl9cmV0dXJufWlmKHQudHlwZT09PSJzY3JlZW5zaG90Iil0cnl7bGV0IGU9dC5od25kPz9udWxsLHt3aWR0aDpyLGhlaWdodDpvfT1lPT09bnVsbD9ycih0LmlkKTpvcih0LmlkLGUsdC5hcmVhPz8id2luZG93Iix0Lm1vZGU/PyJzY3JlZW4iKTtGLnBvc3RNZXNzYWdlKHt0eXBlOiJyZXN1bHQiLGlkOnQuaWQsY29kZTowLGVycm9yOm51bGwsd2lkdGg6cixoZWlnaHQ6b30pfWNhdGNoKGUpe0YucG9zdE1lc3NhZ2Uoe3R5cGU6InJlc3VsdCIsaWQ6dC5pZCxjb2RlOi0xLGVycm9yOlN0cmluZyhlKX0pfX1GLm9ubWVzc2FnZT10PT57aXIodC5kYXRhKSxGLm9ubWVzc2FnZT1udWxsfTsK");
|
|
21810
21918
|
bumpWorkers(1);
|
|
21811
21919
|
const id = 1;
|
|
21812
21920
|
let innerPid = null;
|
|
@@ -21927,7 +22035,7 @@ var SCREENSHOT_TIMEOUT_MS = 3e4;
|
|
|
21927
22035
|
var WINDOWS_TIMEOUT_MS = 5e3;
|
|
21928
22036
|
function withWorker(timeoutMs, onTimeout, post, onData, onResult) {
|
|
21929
22037
|
return new Promise((resolve) => {
|
|
21930
|
-
const worker = new os6.Worker("data:text/javascript;base64,aW1wb3J0KmFzIGllIGZyb20ib3MiO2ltcG9ydCphcyBzZSBmcm9tInN0ZCI7aW1wb3J0KmFzIHkgZnJvbSJmZmkiO2ltcG9ydCphcyBRIGZyb20ib3MiO2ltcG9ydCphcyBZIGZyb20ic3RkIjtpbXBvcnQqYXMgdiBmcm9tIndpbiI7dmFyIGZlPXsidXRmLTgiOiJ1dGYtOCIsdXRmODoidXRmLTgiLCJ1bmljb2RlLTEtMS11dGYtOCI6InV0Zi04IiwidXRmLTE2IjoidXRmLTE2bGUiLCJ1dGYtMTZsZSI6InV0Zi0xNmxlIiwidXRmLTE2YmUiOiJ1dGYtMTZiZSJ9O2Z1bmN0aW9uIFR0KHQpe2lmKCF0KXJldHVybiJ1dGYtOCI7bGV0IGU9ZmVbdC50cmltKCkudG9Mb3dlckNhc2UoKV07aWYoZSlyZXR1cm4gZTt0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVGhlIGVuY29kaW5nIGxhYmVsICIke3R9IiBpcyBub3Qgc3VwcG9ydGVkYCl9ZnVuY3Rpb24gZGUodCxlKXtsZXQgcj0iIjtmb3IobGV0IG49MDtuPHQubGVuZ3RoOyl7bGV0IG89dFtuKytdO2lmKG88MTI4KXtyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG8pO2NvbnRpbnVlfWlmKG88MTkyKXtyKz1lPygoKT0+e3Rocm93IG5ldyBUeXBlRXJyb3IoInVuZXhwZWN0ZWQgY29udGludWF0aW9uIGJ5dGUiKX0pKCk6Ilx1RkZGRCI7Y29udGludWV9bGV0IGksYztpZihvPDIyNCl7aWYobj49dC5sZW5ndGgpe3IrPWU/KCgpPT57dGhyb3cgbmV3IFR5cGVFcnJvcigiaW5jb21wbGV0ZSB1dGYtOCIpfSkoKToiXHVGRkZEIjticmVha31sZXQgcz10W24rK107aWYoKHMmMTkyKSE9PTEyOCl7cis9Ilx1RkZGRCI7Y29udGludWV9aT0obyYzMSk8PDZ8cyY2MyxjPTEyOH1lbHNlIGlmKG88MjQwKXtpZihuKzE+PXQubGVuZ3RoKXtyKz1lPygoKT0+e3Rocm93IG5ldyBUeXBlRXJyb3IoImluY29tcGxldGUgdXRmLTgiKX0pKCk6Ilx1RkZGRCI7YnJlYWt9bGV0IHM9dFtuKytdLHA9dFtuKytdO2lmKChzJjE5MikhPT0xMjh8fChwJjE5MikhPT0xMjgpe3IrPSJcdUZGRkQiO2NvbnRpbnVlfWk9KG8mMTUpPDwxMnwocyY2Myk8PDZ8cCY2MyxjPTIwNDh9ZWxzZSBpZihvPDI0OCl7aWYobisyPj10Lmxlbmd0aCl7cis9ZT8oKCk9Pnt0aHJvdyBuZXcgVHlwZUVycm9yKCJpbmNvbXBsZXRlIHV0Zi04Iil9KSgpOiJcdUZGRkQiO2JyZWFrfWxldCBzPXRbbisrXSxwPXRbbisrXSxhPXRbbisrXTtpZigocyYxOTIpIT09MTI4fHwocCYxOTIpIT09MTI4fHwoYSYxOTIpIT09MTI4KXtyKz0iXHVGRkZEIjtjb250aW51ZX1pPShvJjcpPDwxOHwocyY2Myk8PDEyfChwJjYzKTw8NnxhJjYzLGM9NjU1MzZ9ZWxzZXtyKz1lPygoKT0+e3Rocm93IG5ldyBUeXBlRXJyb3IoImludmFsaWQgdXRmLTggc3RhcnQiKX0pKCk6Ilx1RkZGRCI7Y29udGludWV9aWYoaTxjfHxpPj01NTI5NiYmaTw9NTczNDN8fGk+MTExNDExMSl7cis9ZT8oKCk9Pnt0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnZhbGlkIHV0Zi04IGNvZGVwb2ludCIpfSkoKToiXHVGRkZEIjtjb250aW51ZX1pPD02NTUzNT9yKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGkpOihpLT02NTUzNixyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2fGk+PjEwLDU2MzIwfGkmMTAyMykpfXJldHVybiByfWZ1bmN0aW9uIHdlKHQsZSxyKXtsZXQgbj1uZXcgRGF0YVZpZXcodC5idWZmZXIsdC5ieXRlT2Zmc2V0LHQuYnl0ZUxlbmd0aCksbz0iIjtmb3IobGV0IGk9MDtpKzE8dC5sZW5ndGg7aSs9Mil7bGV0IGM9bi5nZXRVaW50MTYoaSxlKTtpZihjPj01NTI5NiYmYzw9NTYzMTkpe2lmKGkrPTIsaSsxPj10Lmxlbmd0aCl7bys9cj8oKCk9Pnt0aHJvdyBuZXcgVHlwZUVycm9yKCJ0cnVuY2F0ZWQgc3Vycm9nYXRlIHBhaXIiKX0pKCk6Ilx1RkZGRCI7YnJlYWt9bGV0IHM9bi5nZXRVaW50MTYoaSxlKTtzPj01NjMyMCYmczw9NTczNDM/bys9U3RyaW5nLmZyb21DaGFyQ29kZShjLHMpOihvKz1yPygoKT0+e3Rocm93IG5ldyBUeXBlRXJyb3IoImludmFsaWQgc3Vycm9nYXRlIHBhaXIiKX0pKCk6Ilx1RkZGRCIsaS09Mil9ZWxzZSBjPj01NjMyMCYmYzw9NTczNDM/bys9cj8oKCk9Pnt0aHJvdyBuZXcgVHlwZUVycm9yKCJ1bmV4cGVjdGVkIHRyYWlsaW5nIHN1cnJvZ2F0ZSIpfSkoKToiXHVGRkZEIjpvKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGMpfXJldHVybiBvfXZhciBvdD1jbGFzc3tfZW5jb2Rpbmc7X2ZhdGFsO19pZ25vcmVCT007Y29uc3RydWN0b3IoZSxyKXt0aGlzLl9lbmNvZGluZz1UdChlKSx0aGlzLl9mYXRhbD1yPy5mYXRhbD8/ITEsdGhpcy5faWdub3JlQk9NPXI/Lmlnbm9yZUJPTT8/ITF9Z2V0IGVuY29kaW5nKCl7cmV0dXJuIHRoaXMuX2VuY29kaW5nfWdldCBmYXRhbCgpe3JldHVybiB0aGlzLl9mYXRhbH1nZXQgaWdub3JlQk9NKCl7cmV0dXJuIHRoaXMuX2lnbm9yZUJPTX1kZWNvZGUoZSl7aWYoIWUpcmV0dXJuIiI7bGV0IHI9ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXk/ZTplIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI/bmV3IFVpbnQ4QXJyYXkoZSk6bmV3IFVpbnQ4QXJyYXkoZS5idWZmZXIsZS5ieXRlT2Zmc2V0LGUuYnl0ZUxlbmd0aCk7aWYodGhpcy5fZW5jb2Rpbmc9PT0idXRmLTgiKXJldHVybiBkZShyLHRoaXMuX2ZhdGFsKTtsZXQgbj10aGlzLl9lbmNvZGluZz09PSJ1dGYtMTZsZSIsbz0wO2lmKHIubGVuZ3RoPj0yJiYhdGhpcy5faWdub3JlQk9NKXtsZXQgaT1uP3JbMF06clsxXSxzPShuP3JbMV06clswXSk8PDh8aTsocz09PTY1Mjc5fHxzPT09NjU1MzQpJiYobz0yKX1yZXR1cm4gd2Uoci5zbGljZShvKSxuLHRoaXMuX2ZhdGFsKX19LGl0PWNsYXNze19lbmNvZGluZztjb25zdHJ1Y3RvcihlKXt0aGlzLl9lbmNvZGluZz1UdChlKX1nZXQgZW5jb2RpbmcoKXtyZXR1cm4gdGhpcy5fZW5jb2Rpbmd9ZW5jb2RlKGUpe2lmKCFlKXJldHVybiBuZXcgVWludDhBcnJheSgwKTtpZih0aGlzLl9lbmNvZGluZz09PSJ1dGYtOCIpe2xldCBpPVtdO2ZvcihsZXQgYz0wO2M8ZS5sZW5ndGg7YysrKXtsZXQgcz1lLmNoYXJDb2RlQXQoYyk7aWYoczwxMjgpaS5wdXNoKHMpO2Vsc2UgaWYoczwyMDQ4KWkucHVzaCgxOTJ8cz4+NiwxMjh8cyY2Myk7ZWxzZSBpZihzPDU1Mjk2fHxzPj01NzM0NClpLnB1c2goMjI0fHM+PjEyLDEyOHxzPj42JjYzLDEyOHxzJjYzKTtlbHNle2MrKztsZXQgcD1lLmNoYXJDb2RlQXQoYyk7cz02NTUzNisoKHMmMTAyMyk8PDEwKXxwJjEwMjMsaS5wdXNoKDI0MHxzPj4xOCwxMjh8cz4+MTImNjMsMTI4fHM+PjYmNjMsMTI4fHMmNjMpfX1yZXR1cm4gbmV3IFVpbnQ4QXJyYXkoaSl9bGV0IHI9dGhpcy5fZW5jb2Rpbmc9PT0idXRmLTE2bGUiLG49bmV3IEFycmF5QnVmZmVyKGUubGVuZ3RoKjIpLG89bmV3IERhdGFWaWV3KG4pO2ZvcihsZXQgaT0wO2k8ZS5sZW5ndGg7aSsrKW8uc2V0VWludDE2KGkqMixlLmNoYXJDb2RlQXQoaSkscik7cmV0dXJuIG5ldyBVaW50OEFycmF5KG4pfX07dHlwZW9mIGdsb2JhbFRoaXMuVGV4dERlY29kZXI+InUiJiYoZ2xvYmFsVGhpcy5UZXh0RGVjb2Rlcj1vdCk7dHlwZW9mIGdsb2JhbFRoaXMuVGV4dEVuY29kZXI+InUiJiYoZ2xvYmFsVGhpcy5UZXh0RW5jb2Rlcj1pdCk7aW1wb3J0e2J1ZmZlclB0ciBhcyB4ZX1mcm9tImZmaSI7aW1wb3J0KmFzIEl0IGZyb20ib3MiO3ZhciBtZT1bInZvaWQiLCJ1OCIsImk4IiwidTE2IiwiaTE2IiwidTMyIiwiaTMyIiwidTY0IiwiaTY0IiwiZjMyIiwiZjY0IiwicHRyIl0sc3Q9L148KFtePD5cc10qKT5wdHIoIXxAW0EtWmEtel9dXHcqKT8kLztmdW5jdGlvbiBPKHQpe3JldHVybiBzdC50ZXN0KHQpfWZ1bmN0aW9uIGN0KHQpe3JldHVybiBzdC5leGVjKHQpPy5bMV18fCIifXZhciBxPXQ9Pk8odCk/InB0ciI6dCxSPUl0LmFyY2g9PT0ieDY0Ij84OjQsVT17dTg6MSxpODoxLHUxNjoyLGkxNjoyLHUzMjo0LGkzMjo0LHU2NDo4LGk2NDo4LGYzMjo0LGY2NDo4fSxUPTA7ZnVuY3Rpb24gXyh0KXtpZihPKHQpKXtsZXQgbz1zdC5leGVjKHQpO3JldHVybiBvPy5bMl0/LnN0YXJ0c1dpdGgoIkAiKT9gPCR7b1sxXX0+cHRyYDp0fWxldCBlPXQuaW5kZXhPZigiQCIpLHI9ZT49MD90LnNsaWNlKDAsZSk6dDtpZigoZTwwfHwvXltBLVphLXpfXVx3KiQvLnRlc3QodC5zbGljZShlKzEpKSkmJnIhPT0icHRyIiYmbWUuaW5jbHVkZXMocikpcmV0dXJuIHI7dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIHRva2VuOiAiK3QpfWZ1bmN0aW9uIHoodCxlLHIpe3N3aXRjaChyKXtjYXNlInU4IjpyZXR1cm4gdC5nZXRVaW50OChlKTtjYXNlImk4IjpyZXR1cm4gdC5nZXRJbnQ4KGUpO2Nhc2UidTE2IjpyZXR1cm4gdC5nZXRVaW50MTYoZSwhMCk7Y2FzZSJpMTYiOnJldHVybiB0LmdldEludDE2KGUsITApO2Nhc2UidTMyIjpyZXR1cm4gdC5nZXRVaW50MzIoZSwhMCk7Y2FzZSJpMzIiOnJldHVybiB0LmdldEludDMyKGUsITApO2Nhc2UidTY0IjpyZXR1cm4gdC5nZXRCaWdVaW50NjQoZSwhMCk7Y2FzZSJpNjQiOnJldHVybiB0LmdldEJpZ0ludDY0KGUsITApO2Nhc2UiZjMyIjpyZXR1cm4gdC5nZXRGbG9hdDMyKGUsITApO2Nhc2UiZjY0IjpyZXR1cm4gdC5nZXRGbG9hdDY0KGUsITApO2Nhc2UicHRyIjpyZXR1cm4gUj09PTg/TnVtYmVyKHQuZ2V0QmlnSW50NjQoZSwhMCkpOnQuZ2V0SW50MzIoZSwhMCl9fWZ1bmN0aW9uIHB0KHQsZSx7azpyLHY6bn0pe3N3aXRjaChyKXtjYXNlInU4Ijp0LnNldFVpbnQ4KGUsTnVtYmVyKG4pKTticmVhaztjYXNlImk4Ijp0LnNldEludDgoZSxOdW1iZXIobikpO2JyZWFrO2Nhc2UidTE2Ijp0LnNldFVpbnQxNihlLE51bWJlcihuKSwhMCk7YnJlYWs7Y2FzZSJpMTYiOnQuc2V0SW50MTYoZSxOdW1iZXIobiksITApO2JyZWFrO2Nhc2UidTMyIjp0LnNldFVpbnQzMihlLG4+Pj4wLCEwKTticmVhaztjYXNlImkzMiI6dC5zZXRVaW50MzIoZSxuPj4+MCwhMCk7YnJlYWs7Y2FzZSJ1NjQiOnQuc2V0QmlnVWludDY0KGUsbiwhMCk7YnJlYWs7Y2FzZSJpNjQiOnQuc2V0QmlnSW50NjQoZSxuLCEwKTticmVhaztjYXNlImYzMiI6dC5zZXRGbG9hdDMyKGUsbiwhMCk7YnJlYWs7Y2FzZSJmNjQiOnQuc2V0RmxvYXQ2NChlLG4sITApO2JyZWFrO2Nhc2UicHRyIjp7aWYobj09bnVsbCl0aHJvdyBuZXcgRXJyb3IoImZmaTogZ290IG51bGwvdW5kZWZpbmVkIGZvciBhIHB0ciBzbG90OyBwYXNzIHRoZSBpbXBvcnRlZCBOVUxMIGNvbnN0YW50IGZvciBlbXB0eSIpO1I9PT04P3Quc2V0QmlnVWludDY0KGUsQmlnSW50LmFzVWludE4oNjQsQmlnSW50KG4pKSwhMCk6dC5zZXRVaW50MzIoZSxuPj4+MCwhMCk7YnJlYWt9fX1mdW5jdGlvbiBWKHQsZSxyKXtsZXR7azpuLHY6b309cjtpZihuPT09InU4Inx8bj09PSJpOCJ8fG49PT0idTE2Inx8bj09PSJpMTYiKXt0LnNldFVpbnQzMihlLE51bWJlcihvKT4+PjAsITApO3JldHVybn1wdCh0LGUscil9dmFyIEQ9Y2xhc3MgZXh0ZW5kcyBBcnJheUJ1ZmZlcntwdHI7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5wdHI9eGUodGhpcyl9fTt2YXIgTnQ9bmV3IE1hcDtmdW5jdGlvbiBoZSh0KXtsZXQgZT1OdC5nZXQodCk7aWYoZSE9PXZvaWQgMClyZXR1cm4gZTtsZXQgcj12LkxvYWRMaWJyYXJ5KHQpO2lmKCFyKXRocm93IG5ldyBFcnJvcihgZmZpLWJpbmQ6IExvYWRMaWJyYXJ5KCIke3R9IikgZmFpbGVkYCk7cmV0dXJuIE50LnNldCh0LHIpLHJ9ZnVuY3Rpb24gSHQodCl7bGV0IGU9dC5zcGxpdCgiIC0+ICIpO2lmKGUubGVuZ3RoIT09Mil0aHJvdyBuZXcgRXJyb3IoYGZmaS1iaW5kOiBpbnZhbGlkIHNpZ25hdHVyZSAiJHt0fSIgKGV4cGVjdGVkICJhcmcxIGFyZzIgLT4gcmV0IilgKTtsZXQgcj1lWzBdLnNwbGl0KCIgIikuZmlsdGVyKG89Pm8hPT0iIiksbj1bXTtmb3IobGV0IG8gb2Ygcil7bGV0IGk9XyhvKTtpZihpPT09InZvaWQiKXRocm93IG5ldyBFcnJvcigiVm9pZCBjYW4gbm90IGluIGFyZ3MiKTtuLnB1c2goaSl9cmV0dXJue2FyZ1Rva2VuczpuLHJldFRva2VuOl8oZVsxXSksc2lnOnR9fWZ1bmN0aW9uIGdlKHQsZSxyLG4pe2xldCBvPUh0KGUpO3JldHVybiguLi5pKT0+Q2UodCxvLGkscixuKX12YXIgYXQ9e3U4OjQsaTg6NCx1MTY6NCxpMTY6NCx1MzI6NCxpMzI6NCx1NjQ6OCxpNjQ6OCxmMzI6NCxmNjQ6OCxwdHI6Un0seXQ9NDtmdW5jdGlvbiBDZSh0LHthcmdUb2tlbnM6ZSxyZXRUb2tlbjpyLHNpZzpufSxvLGksYyl7bGV0IHM9US5hcmNoPT09Ing2NCIscD0oeCxoKT0+aD84Ok8oeCk/UjphdFt4XSxhPTA7Zm9yKGxldCB4IG9mIGUpYSs9cCh4LHMpO3MmJmUubGVuZ3RoPHl0JiYoYT15dCo4KTtsZXQgdT1uZXcgQXJyYXlCdWZmZXIoYSksZj1uZXcgRGF0YVZpZXcodSksbD1bXSxtPTA7Zm9yKGxldCB4PTA7eDxlLmxlbmd0aDt4Kyspe2xldCBoPWVbeF0sSD1oLmVuZHNXaXRoKCIhIiksZz1vW3hdO2lmKE8oaCkpe2xldCBiPWN0KGgpO2lmKHR5cGVvZiBnPT0ibnVtYmVyIil7aWYoSCYmZz09PTApdGhyb3cgbmV3IEVycm9yKGBmZmktYmluZDogJHtufTogYXJnIyR7eCsxfSA8JHtifT5wdHIhIGdvdCAwIChudWxsIHBvaW50ZXIgZm9yYmlkZGVuIGhlcmU7IHRoZSB0b2tlbiBtYXJrcyB0aGlzIHBvc2l0aW9uIG5vbi1udWxsKWApO1YoZixtLHtrOiJwdHIiLHY6Z30pfWVsc2V7aWYoZz09bnVsbCl0aHJvdyBuZXcgRXJyb3IoYGZmaS1iaW5kOiA8JHtifT5wdHIgZ290ICR7U3RyaW5nKGcpfTsgcGFzcyB0aGUgaW1wb3J0ZWQgTlVMTCBjb25zdGFudCBmb3IgYW4gZW1wdHkgcG9pbnRlcmApO2xldCBXPWlbYl07aWYoIVcpdGhyb3cgbmV3IEVycm9yKGI9PT0iIj9gZmZpLWJpbmQ6IDw+cHRyIGV4cGVjdHMgbnVtYmVyIChOVUxMIHwgUHRyKSwgZ290ICR7dHlwZW9mIGd9OyB1c2UgPEJZVEU+cHRyIHdpdGggYSBQdHJBcnJheUJ1ZmZlciAobmV3IFB0ckFycmF5QnVmZmVyKG4pKSwgb3IgZmZpLmJ1ZmZlclB0cihidWYpIGZvciBhbiBhZGRyZXNzYDpgZmZpLWJpbmQ6IHVua25vd24gbGF5b3V0ICI8JHtifT5wdHIiIChhdmFpbGFibGU6ICR7T2JqZWN0LmtleXMoaSkuam9pbigiLCAiKXx8Im5vbmUifSlgKTtpZighVy5lbmNvZGUpdGhyb3cgbmV3IEVycm9yKGBmZmktYmluZDogPCR7Yn0+cHRyIGhhcyBubyBlbmNvZGVyIChvdXQtb25seSBjb2RlYylgKTtsZXQgTj1XLmVuY29kZShnKTtsLnB1c2goTik7bGV0IEc9Ti5wdHI7aWYodHlwZW9mIEchPSJudW1iZXIiKXRocm93IG5ldyBFcnJvcigiZmZpLWJpbmQ6IGNvZGVjLmVuY29kZSBtdXN0IHJldHVybiBhIFB0ckFycmF5QnVmZmVyLCBnb3QgcGxhaW4gQXJyYXlCdWZmZXIiKTtpZihIJiZHPT09MCl0aHJvdyBuZXcgRXJyb3IoYGZmaS1iaW5kOiAke259OiBhcmcjJHt4KzF9IDwke2J9PnB0ciEgZW5jb2RlIHByb2R1Y2VkIDAgKG51bGwgcG9pbnRlciBmb3JiaWRkZW4gaGVyZSlgKTtWKGYsbSx7azoicHRyIix2Okd9KX19ZWxzZSBWKGYsbSx7azpoLHY6Z30pO20rPXAoaCxzKX1sZXQgZD1uZXcgQXJyYXlCdWZmZXIoOCk7eS5mZmlDYWxsKHQsdSxkLHI9PT0iZjMyInx8cj09PSJmNjQiPzE6MCk7bGV0IHc9U2UocShyKSxkKTtpZihyLmVuZHNXaXRoKCIhIikmJnc9PT0wKXRocm93IG5ldyBFcnJvcihgZmZpLWJpbmQ6ICR7bn06IHJldHVybiAke3J9IGdvdCAwICh0aGUgdG9rZW4gcHJvbWlzZXMgQyBuZXZlciByZXR1cm5zIG51bGwgaGVyZSlgKTtpZihPKHIpJiZ3IT09MCl7bGV0IHg9Y3Qocik7aWYoeCE9PSIiKXtsZXQgaD1jW3hdO2lmKGg/LmRlY29kZSlyZXR1cm4gaC5kZWNvZGUodyl9fXJldHVybiB3fWZ1bmN0aW9uIFNlKHQsZSl7aWYodCE9PSJ2b2lkIilyZXR1cm4geihuZXcgRGF0YVZpZXcoZSksMCx0KX12YXIgUD17ZW5jb2RlOnQ9PntsZXQgZT1uZXcgVGV4dEVuY29kZXIoInV0Zi0xNmxlIikuZW5jb2RlKHQrIlwwIikscj1uZXcgRChlLmJ5dGVMZW5ndGgpO3JldHVybiBuZXcgVWludDhBcnJheShyKS5zZXQoZSkscn0sZGVjb2RlOnQ9PntpZih0eXBlb2YgdD09Im51bWJlciIpe2xldCBvPSIiLGk9dCxjPWk7Zm9yKDs7KXtsZXQgcz15LnJlYWRCeXRlKGkpLHA9eS5yZWFkQnl0ZShpKzEpO2lmKHM9PT0wJiZwPT09MClyZXR1cm4gbztpZihvKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHN8cDw8OCksaSs9MixpLWM+MTw8MjEpdGhyb3cgbmV3IEVycm9yKCJmZmktYmluZDogV0NIQVIgZGVjb2RlIGV4Y2VlZGVkIDRNaUIgd2l0aG91dCBOVUwiKX19bGV0IGU9bmV3IFVpbnQ4QXJyYXkodCkscj1lLmxlbmd0aCYtMixuPSIiO2ZvcihsZXQgbz0wO288cjtvKz0yKXtsZXQgaT1lW29dfGVbbysxXTw8ODtpZihpPT09MClyZXR1cm4gbjtuKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGkpfXJldHVybiBufSxhbGxvYzoodD0yNTYpPT5uZXcgRCh0KjIpfSxiZT17ZW5jb2RlOnQ9PntpZighKHQgaW5zdGFuY2VvZiBEKSl0aHJvdyBuZXcgRXJyb3IoImZmaS1iaW5kOiA8QllURT5wdHIgd2FudHMgYSBQdHJBcnJheUJ1ZmZlciAobmV3IFB0ckFycmF5QnVmZmVyKG4pIC8gQllURS5hbGxvYyAvIHN0cnVjdC5lbmNvZGUpLCBub3QgYSBwbGFpbiBBcnJheUJ1ZmZlciIpO3JldHVybiB0fSxhbGxvYzp0PT5uZXcgRCh0KX0sRnQ9e1dDSEFSOlAsQllURTpiZX07ZnVuY3Rpb24gQSh0LGUscixuLG8pe2xldCBpPXYuR2V0UHJvY0FkZHJlc3MoaGUodCksZSk7aWYoIWkpdGhyb3cgbmV3IEVycm9yKGBmZmktYmluZDogcHJvYyAiJHtlfSIgbm90IGZvdW5kIGluICR7dH1gKTtsZXQgYz1vPz9uO3JldHVybiBnZShpLHIsey4uLkZ0LC4uLm59LHsuLi5GdCwuLi5jPz97fX0pfXZhciBNdD1uZXcgRmluYWxpemF0aW9uUmVnaXN0cnkodD0+e1kucHJpbnRmKGBbZmZpXSBjbG9zdXJlIGxlYWtlZCAoR0NlZCB3aXRob3V0IGRpc3Bvc2UpOiBzaWc9IiVzIiBwdHI9MHgleApgLHQuc2lnLHQucHRyKX0pO2Z1bmN0aW9uIFdlKHQsZSxyLG4sbyxpKXtsZXQgYz1uZXcgRGF0YVZpZXcobykscz1RLmFyY2g9PT0ieDY0IixwPW5ldyBEYXRhVmlldyhuKSxhPVtdLHU9MDtmb3IobGV0IGw9MDtsPHQubGVuZ3RoO2wrKyl7bGV0IG09dFtsXSxkPW0udG9rLFM7aWYocyl7bGV0IHg9ZD09PSJmMzIifHxkPT09ImY2NCI/bDw0PzEyOCtsKjg6MzIrKGwtNCkqODpsPDQ/bCo4OjMyKyhsLTQpKjg7Uz16KHAseCxkKX1lbHNlIFM9eihwLHUsZCksdSs9YXRbZF07aWYobS5ub25udWxsJiZTPT09MCl7WS5wcmludGYoYFtmZmldIGNsb3N1cmUgJXM6IGFyZyMlZCBnb3QgMCAoISBwcm9taXNlIHZpb2xhdGVkIGJ5IGNhbGxlciksIHNraXBwaW5nIGNhbGxiYWNrCmAsaSxsKzEpO3JldHVybn1hLnB1c2goUyl9bGV0IGY7dHJ5e2Y9ciguLi5hKX1jYXRjaChsKXtZLnByaW50ZihgW2ZmaV0gY2xvc3VyZSBjYWxsYmFjayB0aHJldzogJXMKYCxTdHJpbmcobCkpO3JldHVybn1pZihlLm5vbm51bGwmJmY9PT0wKXtZLnByaW50ZihgW2ZmaV0gY2xvc3VyZSAlczogcmV0dXJuIGdvdCAwICghIHByb21pc2UgdmlvbGF0ZWQgYnkgY2FsbGJhY2spLCBsZWF2aW5nIHJlc3VsdCBzbG90IDAKYCxpKTtyZXR1cm59ZS50b2shPT0idm9pZCImJlYoYywwLHtrOmUudG9rLHY6Zn0pfWZ1bmN0aW9uIE90KHQsZSxyKXtsZXR7YXJnVG9rZW5zOm4scmV0VG9rZW46b309SHQodCksaT1uLm1hcCh3PT4oe3RvazpxKHcpLG5vbm51bGw6dy5lbmRzV2l0aCgiISIpfSkpLGM9e3RvazpxKG8pLG5vbm51bGw6by5lbmRzV2l0aCgiISIpfSxzPVEuYXJjaD09PSJ4NjQiLHA9aS5yZWR1Y2UoKHcseCk9PncrYXRbeC50b2tdLDApO2lmKHM/aS5sZW5ndGg+MTY6cD42NCl0aHJvdyBuZXcgRXJyb3IoYGZmaS1iaW5kOiBjbG9zdXJlIHNpZ25hdHVyZSBleGNlZWRzIGNhcHR1cmUgd2luZG93ICgke3M/Im1heCAxNiBwYXJhbXMiOiJtYXggNjQgc3RhY2sgYnl0ZXMifSk6ICR7dH1gKTtsZXQgYT1yPy5zdGRjYWxsPT09ITF8fHM/MDpwLHU9Yy50b2s9PT0iZjMyIj8xOmMudG9rPT09ImY2NCI/MjpjLnRvaz09PSJ1NjQifHxjLnRvaz09PSJpNjQiPzM6MCxsPXkuY2xvc3VyZU5ldyhhLHUsKHcseCk9PntXZShpLGMsZSx3LHgsdCl9KSxtPSExLGQ9KCk9PnttfHwobT0hMCxNdC51bnJlZ2lzdGVyKGQpLHkuY2xvc3VyZUZyZWUobCkpfSxTPXtwdHI6bCxkaXNwb3NlOmR9O3JldHVybiBNdC5yZWdpc3RlcihkLHtzaWc6dCxwdHI6bH0pLFN9aW1wb3J0KmFzIFB0IGZyb20iZmZpIjtmdW5jdGlvbiBqKHQsZSl7cmV0dXJuIHQrZS0xJn4oZS0xKX12YXIgUnQ9dD0+VVt0XSE9PXZvaWQgMDtmdW5jdGlvbiB1dCh0KXtpZih0eXBlb2YgdD09InN0cmluZyIpe2xldCBlPS9eKHU4fHUxNilcWyhcZCspXF1AKHV0Zi04fHV0Zi0xNmxlKSQvLmV4ZWModCk7aWYoZSl7bGV0IGM9TnVtYmVyKGVbMl0pO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKGMpfHxjPDEpdGhyb3cgbmV3IEVycm9yKGBmZmktc3RydWN0OiBzdHJpbmcgbGVuZ3RoIG11c3QgYmUgYW4gaW50ZWdlciA+PSAxLCBnb3QgJHtjfWApO2xldCBzPWVbMV09PT0idTgiPzE6MjtyZXR1cm57c2l6ZTpzKmMsYWxpZ246cyx0eXBlOnt0YWc6InN0cmluZyIsZW5jb2Rpbmc6ZVszXX19fWxldCByPS9eKFteXFtcXV0rKVxbKFxkKylcXSQvLmV4ZWModCk7aWYocil7bGV0IGM9TnVtYmVyKHJbMl0pO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKGMpfHxjPDEpdGhyb3cgbmV3IEVycm9yKGBmZmktc3RydWN0OiBhcnJheSBsZW5ndGggbXVzdCBiZSBhbiBpbnRlZ2VyID49IDEsIGdvdCAke2N9YCk7bGV0IHM9dXQoclsxXSk7aWYocy50eXBlLnRhZz09PSJiaXRmaWVsZCIpdGhyb3cgbmV3IEVycm9yKCJmZmktc3RydWN0OiBiaXRmaWVsZHMgY2Fubm90IGJlIGFycmF5IGVsZW1lbnRzIik7cmV0dXJue3NpemU6cy5zaXplKmMsYWxpZ246cy5hbGlnbix0eXBlOnt0YWc6ImFycmF5IixlbGVtZW50VHlwZTpzLnR5cGUsZWxlbWVudFNpemU6cy5zaXplfX19bGV0IG49L14oW0EtWmEtel9dXHcqKTooXGQrKSQvLmV4ZWModCk7aWYobil7bGV0IGM9blsxXSxzPV8oYyk7aWYoIVJ0KHMpfHxzPT09ImYzMiJ8fHM9PT0iZjY0Iil0aHJvdyBuZXcgRXJyb3IoYGZmaS1zdHJ1Y3Q6IGJpdGZpZWxkIHVuaXQgbXVzdCBiZSBhbiBpbnRlZ2VyIHR5cGUsIGdvdCAiJHtjfSJgKTtsZXQgcD1OdW1iZXIoblsyXSksYT1VW3NdLHU9YSo4O2lmKCFOdW1iZXIuaXNJbnRlZ2VyKHApfHxwPDEpdGhyb3cgbmV3IEVycm9yKGBmZmktc3RydWN0OiBiaXRmaWVsZCB3aWR0aCBtdXN0IGJlIGFuIGludGVnZXIgPj0gMSwgZ290ICR7cH1gKTtpZihwPnUpdGhyb3cgbmV3IEVycm9yKGBmZmktc3RydWN0OiBiaXRmaWVsZCB3aWR0aCAke3B9IGV4Y2VlZHMgdW5pdCB3aWR0aCAke3V9YCk7cmV0dXJue3NpemU6YSxhbGlnbjphLHR5cGU6e3RhZzoiYml0ZmllbGQiLHVuaXQ6cyxiaXQ6MCx3aWR0aDpwfX19bGV0IG89Xyh0KTtpZihPKG8pKXJldHVybntzaXplOlIsYWxpZ246Uix0eXBlOnt0YWc6ImJhc2ljIixraW5kOiJwdHIifX07aWYoIVJ0KG8pKXRocm93IG5ldyBFcnJvcihgZmZpLXN0cnVjdDogdW5rbm93biBraW5kICIke3R9ImApO2xldCBpPVVbb107cmV0dXJue3NpemU6aSxhbGlnbjppLHR5cGU6e3RhZzoiYmFzaWMiLGtpbmQ6b319fWlmKHQmJnR5cGVvZiB0PT0ib2JqZWN0Iil7bGV0IGU9dCxyPWVbIiMiXTtpZihyPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcigiZmZpLXN0cnVjdDogbmVzdGVkIG9iamVjdCB2YWx1ZSByZXF1aXJlcyBhICcjJyBrZXkgKCdzdHJ1Y3QnIHwgJ3VuaW9uJyB8ICdhcnJheScpIik7aWYocj09PSJhcnJheSImJiIjcGFjayJpbiBlKXRocm93IG5ldyBFcnJvcihgZmZpLXN0cnVjdDogJyNwYWNrJyBpcyBvbmx5IGFsbG93ZWQgb24gc3RydWN0L3VuaW9uLCBnb3QgJyR7cn0nYCk7aWYocj09PSJhcnJheSIpe2xldCBuPWUubGVuZ3RoO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKG4pfHxuPDEpdGhyb3cgbmV3IEVycm9yKGBmZmktc3RydWN0OiBhcnJheSBsZW5ndGggbXVzdCBiZSBhbiBpbnRlZ2VyID49IDEsIGdvdCAke1N0cmluZyhuKX1gKTtsZXQgbz11dChlLmVsZW1lbnQpO2lmKG8udHlwZS50YWc9PT0iYml0ZmllbGQiKXRocm93IG5ldyBFcnJvcigiZmZpLXN0cnVjdDogYml0ZmllbGRzIGNhbm5vdCBiZSBhcnJheSBlbGVtZW50cyIpO3JldHVybntzaXplOm8uc2l6ZSpuLGFsaWduOm8uYWxpZ24sdHlwZTp7dGFnOiJhcnJheSIsZWxlbWVudFR5cGU6by50eXBlLGVsZW1lbnRTaXplOm8uc2l6ZX19fWlmKHI9PT0ic3RydWN0Inx8cj09PSJ1bmlvbiIpe2xldCBuPUF0KHQpO3JldHVybntzaXplOm4uc2l6ZSxhbGlnbjpuLm1heEVmZmVjdGl2ZUFsaWduLHR5cGU6e3RhZzpyLGZpZWxkczpuLmZpZWxkc319fXRocm93IG5ldyBFcnJvcihgZmZpLXN0cnVjdDogdW5rbm93biAnIycgZGVjbGFyYXRpb24gJHtKU09OLnN0cmluZ2lmeShTdHJpbmcocikpfWApfXRocm93IG5ldyBFcnJvcihgZmZpLXN0cnVjdDogaW52YWxpZCBtZW1iZXIgdmFsdWU6ICR7U3RyaW5nKHQpfWApfWZ1bmN0aW9uIEF0KHQpe2xldCBlPXRbIiMiXT09PSJzdHJ1Y3QiLHI9dFsiI3BhY2siXT8/OCxuPTEsbz0wLGk9W10sYz0wLHM9LTEscD0wLGE9MCx1PSgpPT57czwwfHwoYz1qKHMrTWF0aC5jZWlsKHAvOCksYSkscz0tMSl9O2ZvcihsZXRbZixsXW9mIE9iamVjdC5lbnRyaWVzKHQpKXtpZihmLnN0YXJ0c1dpdGgoIiMiKSljb250aW51ZTtsZXQgbT0vXihbXkBdKylAKFxkKykkLy5leGVjKGYpLGQ9bT9tWzFdOmYsUz1tP051bWJlcihtWzJdKTowLHtzaXplOncsYWxpZ246eCx0eXBlOmh9PXV0KGwpLEg9dHlwZW9mIGw9PSJzdHJpbmciJiZsLmVuZHNXaXRoKCIhIiksZz14O2lmKHI+MCYmKGc9TWF0aC5taW4ocixnKSksUyYmKGc9TWF0aC5tYXgoZyxTKSksaC50YWc9PT0iYml0ZmllbGQiKXtpZihkLnN0YXJ0c1dpdGgoIiQiKSl0aHJvdyBuZXcgRXJyb3IoImZmaS1zdHJ1Y3Q6IGJpdGZpZWxkIG1lbWJlcnMgbXVzdCBiZSBuYW1lZCIpO2lmKCFlKXtpLnB1c2goe25hbWU6ZCxvZmZzZXQ6MCxzaXplOncsdHlwZTp7Li4uaCxiaXQ6MH19KSxuPU1hdGgubWF4KG4sZyksbz1NYXRoLm1heChvLHcpO2NvbnRpbnVlfWxldCBXPWgud2lkdGg7KHM8MHx8dyE9PWF8fHArVz5hKjgpJiYocz49MCYmdSgpLHM9aihjLGcpLHA9MCxhPXcpLGkucHVzaCh7bmFtZTpkLG9mZnNldDpzLHNpemU6dyx0eXBlOnsuLi5oLGJpdDpwfX0pLHArPVcsbj1NYXRoLm1heChuLGcpLG89TWF0aC5tYXgobyx3KTtjb250aW51ZX11KCk7bGV0IGI9aihjLGcpO2lmKCFkLnN0YXJ0c1dpdGgoIiQiKSlpLnB1c2goe25hbWU6ZCxvZmZzZXQ6YixzaXplOncsdHlwZTpoLC4uLkg/e25vbm51bGw6ITB9Ont9fSk7ZWxzZXtpZihoLnRhZyE9PSJzdHJ1Y3QiJiZoLnRhZyE9PSJ1bmlvbiIpdGhyb3cgbmV3IEVycm9yKGBmZmktc3RydWN0OiBhbm9ueW1vdXMgbWVtYmVyICIke2R9IiBtdXN0IGJlIGEgc3RydWN0L3VuaW9uYCk7Zm9yKGxldCBXIG9mIGguZmllbGRzKWkucHVzaCh7Li4uVyxvZmZzZXQ6Vy5vZmZzZXQrYn0pfWUmJihjPWIrdyksbj1NYXRoLm1heChuLGcpLG89TWF0aC5tYXgobyx3KX1yZXR1cm4gdSgpLHtzaXplOmooZT9jOm8sbiksbWF4RWZmZWN0aXZlQWxpZ246bixmaWVsZHM6aX19ZnVuY3Rpb24gQnQodCxlLHIpe2xldCBuPVVbcl07cmV0dXJuIG49PT0xP0JpZ0ludCh0LmdldFVpbnQ4KGUpKTpuPT09Mj9CaWdJbnQodC5nZXRVaW50MTYoZSwhMCkpOm49PT00P0JpZ0ludCh0LmdldFVpbnQzMihlLCEwKSk6dC5nZXRCaWdVaW50NjQoZSwhMCl9ZnVuY3Rpb24gRGUodCxlLHIsbil7bGV0IG89VVtyXTtpZihvPT09MSl7dC5zZXRVaW50OChlLE51bWJlcihuJjB4ZmZuKSk7cmV0dXJufWlmKG89PT0yKXt0LnNldFVpbnQxNihlLE51bWJlcihuJjB4ZmZmZm4pLCEwKTtyZXR1cm59aWYobz09PTQpe3Quc2V0VWludDMyKGUsTnVtYmVyKG4mMHhmZmZmZmZmZm4pLCEwKTtyZXR1cm59dC5zZXRCaWdVaW50NjQoZSxuJjB4ZmZmZmZmZmZmZmZmZmZmZm4sITApfWZ1bmN0aW9uIEVlKHQsZSxyKXtsZXQgbj1CaWdJbnQoci53aWR0aCksbz1CdCh0LGUsci51bml0KT4+QmlnSW50KHIuYml0KSYoMW48PG4pLTFuO3JldHVybiByLnVuaXRbMF09PT0iaSImJm8mMW48PG4tMW4mJihvLT0xbjw8biksci53aWR0aD41Mz9vOk51bWJlcihvKX1mdW5jdGlvbiBUZSh0LGUscixuKXtsZXQgbz1CaWdJbnQoci53aWR0aCksaT1CaWdJbnQoci5iaXQpLGM9KDFuPDxvKS0xbixzPWM8PGkscD1CdCh0LGUsci51bml0KSxhPSh0eXBlb2Ygbj09ImJpZ2ludCI/bjpCaWdJbnQoTWF0aC50cnVuYyhuKSkpJmM7RGUodCxlLHIudW5pdCxwJn5zfGE8PGkpfXZhciBJZT17InV0Zi04IjpuZXcgVGV4dEVuY29kZXIoInV0Zi04IiksInV0Zi0xNmxlIjpuZXcgVGV4dEVuY29kZXIoInV0Zi0xNmxlIil9LE5lPXsidXRmLTgiOm5ldyBUZXh0RGVjb2RlcigidXRmLTgiLHtpZ25vcmVCT006ITB9KSwidXRmLTE2bGUiOm5ldyBUZXh0RGVjb2RlcigidXRmLTE2bGUiLHtpZ25vcmVCT006ITB9KX07ZnVuY3Rpb24geWUodCxlLHIsbil7bGV0IG89bmV3IFVpbnQ4QXJyYXkodC5idWZmZXIsdC5ieXRlT2Zmc2V0K2UsciksaT1uPT09InV0Zi0xNmxlIj8yOjEsYz1yO2ZvcihsZXQgcz0wO3MraTw9cjtzKz1pKWlmKG9bc109PT0wJiYoaT09PTF8fG9bcysxXT09PTApKXtjPXM7YnJlYWt9cmV0dXJuIE5lW25dLmRlY29kZShvLnN1YmFycmF5KDAsYykpfWZ1bmN0aW9uIEZlKHQsZSxyLG4sbyl7bGV0IGk9bmV3IFVpbnQ4QXJyYXkodC5idWZmZXIsdC5ieXRlT2Zmc2V0K2Uscik7aS5maWxsKDApO2xldCBzPXItKG49PT0idXRmLTE2bGUiPzI6MSk7aWYoczw9MClyZXR1cm47bGV0IHA9SWVbbl0uZW5jb2RlKFN0cmluZyhvPz8iIikpO2kuc2V0KHAuc3ViYXJyYXkoMCxNYXRoLm1pbihwLmxlbmd0aCxzKSkpfWZ1bmN0aW9uIE1lKHQsZSxyLG4pe2xldCBvPW4uZWxlbWVudFNpemU+MD9yL24uZWxlbWVudFNpemU6MCxpPVtdO2ZvcihsZXQgYz0wO2M8bztjKyspaS5wdXNoKGt0KHQsZStjKm4uZWxlbWVudFNpemUsbi5lbGVtZW50VHlwZSxuLmVsZW1lbnRTaXplKSk7cmV0dXJuIGl9ZnVuY3Rpb24gSGUodCxlLHIsbixvKXtsZXQgaT1uLmVsZW1lbnRTaXplPjA/ci9uLmVsZW1lbnRTaXplOjAsYz1vPz9bXTtmb3IobGV0IHM9MDtzPGk7cysrKUx0KHQsZStzKm4uZWxlbWVudFNpemUsbi5lbGVtZW50VHlwZSxuLmVsZW1lbnRTaXplLGNbc10pfWZ1bmN0aW9uIGt0KHQsZSxyLG4pe3N3aXRjaChyLnRhZyl7Y2FzZSJiYXNpYyI6cmV0dXJuIHoodCxlLHIua2luZCk7Y2FzZSJiaXRmaWVsZCI6cmV0dXJuIEVlKHQsZSxyKTtjYXNlInN0cmluZyI6cmV0dXJuIHllKHQsZSxuLHIuZW5jb2RpbmcpO2Nhc2Uic3RydWN0IjpjYXNlInVuaW9uIjpyZXR1cm4gbHQodCxlLHIuZmllbGRzKTtjYXNlImFycmF5IjpyZXR1cm4gTWUodCxlLG4scil9fWZ1bmN0aW9uIEx0KHQsZSxyLG4sbyl7c3dpdGNoKHIudGFnKXtjYXNlImJhc2ljIjpwdCh0LGUse2s6ci5raW5kLHY6b30pO2JyZWFrO2Nhc2UiYml0ZmllbGQiOlRlKHQsZSxyLG8/PzApO2JyZWFrO2Nhc2Uic3RyaW5nIjpGZSh0LGUsbixyLmVuY29kaW5nLG8pO2JyZWFrO2Nhc2Uic3RydWN0IjpjYXNlInVuaW9uIjpHdCh0LGUsci5maWVsZHMsbz8/e30pO2JyZWFrO2Nhc2UiYXJyYXkiOkhlKHQsZSxuLHIsbyk7YnJlYWt9fWZ1bmN0aW9uIGx0KHQsZSxyKXtsZXQgbj17fTtmb3IobGV0IG8gb2Ygcil7bGV0IGk9a3QodCxlK28ub2Zmc2V0LG8udHlwZSxvLnNpemUpO2lmKG8ubm9ubnVsbCYmaT09PTApdGhyb3cgbmV3IEVycm9yKGBmZmktc3RydWN0OiBkZWNvZGU6ICchJyBmaWVsZCAiJHtvLm5hbWV9IiBnb3QgMCAoQyBkaWQgbm90IGZpbGwgaXQsIG9yIGRlY29kZSB3YXMgY2FsbGVkIG9uIGFuIHVuZmlsbGVkIHNsb3QpYCk7bltvLm5hbWVdPWl9cmV0dXJuIG59ZnVuY3Rpb24gR3QodCxlLHIsbil7Zm9yKGxldCBvIG9mIHIpbltvLm5hbWVdIT09dm9pZCAwJiZMdCh0LGUrby5vZmZzZXQsby50eXBlLG8uc2l6ZSxuW28ubmFtZV0pfWZ1bmN0aW9uIE9lKHQpe2xldHtmaWVsZHM6ZSxzaXplOnIsbWF4RWZmZWN0aXZlQWxpZ246bn09QXQodCk7cmV0dXJue19fc3RydWN0OnQsc2l6ZTpyLHN0cnVjdEFsaWduOm4sZGVjb2RlOm89PntpZih0eXBlb2Ygbz09Im51bWJlciIpe2xldCBpPW5ldyBBcnJheUJ1ZmZlcihyKSxjPW5ldyBVaW50OEFycmF5KGkpO2ZvcihsZXQgcz0wO3M8cjtzKyspY1tzXT1QdC5yZWFkQnl0ZShvK3MpO3JldHVybiBsdChuZXcgRGF0YVZpZXcoaSksMCxlKX1yZXR1cm4gbHQobmV3IERhdGFWaWV3KG8pLDAsZSl9LGFsbG9jOigoKT0+bmV3IEQocikpLGVuY29kZTooKG8saSk9PntpZihvPT1udWxsKXRocm93IG5ldyBFcnJvcigiZmZpLXN0cnVjdDogZW5jb2RlKHYpIHJlcXVpcmVzIGFuIGFyZ3VtZW50OyB1c2UgYWxsb2MoKSBmb3IgYSB6ZXJvZWQgb3V0LXBhcmFtIHNsb3QiKTtsZXQgYz1pPz9uZXcgRChyKTtyZXR1cm4gR3QobmV3IERhdGFWaWV3KGMpLDAsZSxvKSxjfSksb2Zmc2V0T2Y6bz0+e2ZvcihsZXQgaSBvZiBlKWlmKGkubmFtZT09PW8pcmV0dXJuIGkub2Zmc2V0O3Rocm93IG5ldyBFcnJvcihgZmZpLXN0cnVjdDogbm8gZmllbGQgIiR7b30iYCl9fX1mdW5jdGlvbiBSZSh0LGUscil7bGV0IG49eyIjIjp0fTtyIT09dm9pZCAwJiYoblsiI3BhY2siXT1yKTtmb3IobGV0W28saV1vZiBPYmplY3QuZW50cmllcyhlKSlvLnN0YXJ0c1dpdGgoIiMiKXx8KG5bb109aSk7cmV0dXJuIG59ZnVuY3Rpb24gQyh0LGUscil7bGV0IG49dHlwZW9mIHQ9PSJzdHJpbmciO3JldHVybiBPZShSZSgic3RydWN0IixuP2U6dCwobj9yOmUpPy5wYWNrKSl9dmFyIEY9QygiUkVDVCIse2xlZnQ6ImkzMiIsdG9wOiJpMzIiLHJpZ2h0OiJpMzIiLGJvdHRvbToiaTMyIn0pLEo9QygiUE9JTlQiLHt4OiJpMzIiLHk6ImkzMiJ9KTt2YXIgdHQ9QygiU1RBUlRVUElORk9XIix7Y2I6InUzMiIsbHBSZXNlcnZlZDoiPD5wdHIiLGxwRGVza3RvcDoiPD5wdHIiLGxwVGl0bGU6Ijw+cHRyIixkd1g6InUzMiIsZHdZOiJ1MzIiLGR3WFNpemU6InUzMiIsZHdZU2l6ZToidTMyIixkd1hDb3VudENoYXJzOiJ1MzIiLGR3WUNvdW50Q2hhcnM6InUzMiIsZHdGaWxsQXR0cmlidXRlOiJ1MzIiLGR3RmxhZ3M6InUzMiIsd1Nob3dXaW5kb3c6InUxNkBTaG93V2luZG93Q21kIixjYlJlc2VydmVkMjoidTE2IixscFJlc2VydmVkMjoiPD5wdHIiLGhTdGRJbnB1dDoiPEhGSUxFPnB0ciIsaFN0ZE91dHB1dDoiPEhGSUxFPnB0ciIsaFN0ZEVycm9yOiI8SEZJTEU+cHRyIn0pLGZ0PUMoIlBST0NFU1NfSU5GT1JNQVRJT04iLHtoUHJvY2VzczoiPEhQUk9DRVNTPnB0ciEiLGhUaHJlYWQ6IjxIVEhSRUFEPnB0ciEiLGR3UHJvY2Vzc0lkOiJ1MzIiLGR3VGhyZWFkSWQ6InUzMiJ9KSwkPUMoIkJJVE1BUElORk9IRUFERVIiLHtiaVNpemU6InUzMiIsYmlXaWR0aDoiaTMyIixiaUhlaWdodDoiaTMyIixiaVBsYW5lczoidTE2IixiaUJpdENvdW50OiJ1MTYiLGJpQ29tcHJlc3Npb246InUzMiIsYmlTaXplSW1hZ2U6InUzMiIsYmlYUGVsc1Blck1ldGVyOiJpMzIiLGJpWVBlbHNQZXJNZXRlcjoiaTMyIixiaUNsclVzZWQ6InUzMiIsYmlDbHJJbXBvcnRhbnQ6InUzMiJ9KSxldD1DKCJCSVRNQVBGSUxFSEVBREVSIix7YmZUeXBlOiJ1MTYiLGJmU2l6ZToidTMyIixiZlJlc2VydmVkMToidTE2IixiZlJlc2VydmVkMjoidTE2IixiZk9mZkJpdHM6InUzMiJ9LHtwYWNrOjJ9KTt2YXIgSz1DKCJOTUhEUiIse2h3bmRGcm9tOiI8SFdORD5wdHIiLGlkRnJvbToiPD5wdHIiLGNvZGU6ImkzMiJ9KSxQZT1DKCJTWVNURU1USU1FIix7d1llYXI6InUxNiIsd01vbnRoOiJ1MTYiLHdEYXlPZldlZWs6InUxNiIsd0RheToidTE2Iix3SG91cjoidTE2Iix3TWludXRlOiJ1MTYiLHdTZWNvbmQ6InUxNiIsd01pbGxpc2Vjb25kczoidTE2In0pLHNyPUMoIk5NREFURVRJTUVDSEFOR0UiLHtoZHI6Sy5fX3N0cnVjdCxkd0ZsYWdzOiJ1MzIiLHN0OlBlLl9fc3RydWN0fSksQWU9QygiTElURU0iLHttYXNrOiJ1MzIiLGlMaW5rOiJpMzIiLHN0YXRlOiJ1MzIiLHN0YXRlTWFzazoidTMyIixzeklEOiJ1MTZbNDhdQHV0Zi0xNmxlIixzelVybDoidTE2WzIwODRdQHV0Zi0xNmxlIn0pLGNyPUMoIk5NTElOSyIse2hkcjpLLl9fc3RydWN0LGl0ZW06QWUuX19zdHJ1Y3R9KSxwcj1DKCJOTUNVU1RPTURSQVciLHtoZHI6Sy5fX3N0cnVjdCxkd0RyYXdTdGFnZToidTMyIixoZGM6IjxIREM+cHRyIixyYzoiaTMyWzRdIixkd0l0ZW1TcGVjOiI8PnB0ciIsdUl0ZW1TdGF0ZToidTMyIixsSXRlbWxQYXJhbToiPD5wdHIifSksYXI9QygiTk1MVkNVU1RPTURSQVciLHtoZHI6Sy5fX3N0cnVjdCxkd0RyYXdTdGFnZToidTMyIixoZGM6IjxIREM+cHRyIixyYzoiaTMyWzRdIixkd0l0ZW1TcGVjOiI8PnB0ciIsdUl0ZW1TdGF0ZToidTMyIixsSXRlbWxQYXJhbToiPD5wdHIiLGNsclRleHQ6InUzMiIsY2xyVGV4dEJrOiJ1MzIiLGlTdWJJdGVtOiJpMzIiLGR3SXRlbVR5cGU6InUzMiJ9KSx1cj1DKCJOTUxJU1RWSUVXIix7aGRyOksuX19zdHJ1Y3QsaUl0ZW06ImkzMiIsaVN1Ykl0ZW06ImkzMiIsdU5ld1N0YXRlOiJ1MzIiLHVPbGRTdGF0ZToidTMyIix1Q2hhbmdlZDoidTMyIixwdEFjdGlvbjoiaTMyWzJdIixsUGFyYW06Ijw+cHRyIn0pO3ZhciBCZT1DKCJUVklURU0iLHttYXNrOiJ1MzIiLGhJdGVtOiI8PnB0ciIsc3RhdGU6InUzMiIsc3RhdGVNYXNrOiJ1MzIiLHBzelRleHQ6Ijw+cHRyIixjY2hUZXh0TWF4OiJpMzIiLGlJbWFnZToiaTMyIixpU2VsZWN0ZWRJbWFnZToiaTMyIixjQ2hpbGRyZW46ImkzMiIsbFBhcmFtOiI8PnB0ciJ9KSxscj1DKCJUVklOU0VSVFNUUlVDVCIse2hQYXJlbnQ6Ijw+cHRyIixoSW5zZXJ0QWZ0ZXI6Ijw+cHRyIixpdGVtOkJlLl9fc3RydWN0fSk7dmFyIGZyPUMoIk1TRyIse2h3bmQ6IjxIV05EPnB0ciIsbWVzc2FnZToidTMyIix3UGFyYW06Ijw+cHRyIixsUGFyYW06Ijw+cHRyIix0aW1lOiJ1MzIiLHB0OkouX19zdHJ1Y3R9KSxkcj1DKCJQQUlOVFNUUlVDVCIse2hkYzoiPEhEQz5wdHIiLGZFcmFzZToiaTMyIixyY1BhaW50OkYuX19zdHJ1Y3QsZlJlc3RvcmU6ImkzMiIsZkluY1VwZGF0ZToiaTMyIixyZ2JSZXNlcnZlZDoidThbMzJdIn0pO3ZhciBydD1DKCJPU1ZFUlNJT05JTkZPXzE0OCIse2R3T1NWZXJzaW9uSW5mb1NpemU6InUzMiIsZHdNYWpvclZlcnNpb246InUzMiIsZHdNaW5vclZlcnNpb246InUzMiIsZHdCdWlsZE51bWJlcjoidTMyIixkd1BsYXRmb3JtSWQ6InUzMiIsc3pDU0RWZXJzaW9uOiJ1OFsxMjhdIn0pO3ZhciBNPSh0LGUscik9PkEoImtlcm5lbDMyLmRsbCIsdCxlLHIpLFV0PU0oIkNyZWF0ZVBpcGUiLCI8PnB0ciA8PnB0ciA8PnB0ciB1MzIgLT4gaTMyIiksZHQ9TSgiU2V0SGFuZGxlSW5mb3JtYXRpb24iLCI8SEZJTEU+cHRyISB1MzIgdTMyIC0+IGkzMiIpLF90PU0oIkNyZWF0ZVByb2Nlc3NXIiwiPFdDSEFSPnB0ciA8V0NIQVI+cHRyIDw+cHRyIDw+cHRyIGkzMiB1MzIgPD5wdHIgPFdDSEFSPnB0ciA8U1RBUlRVUElORk9XPnB0ciA8UFJPQ0VTU19JTkZPUk1BVElPTj5wdHIgLT4gaTMyIix7U1RBUlRVUElORk9XOnR0fSksenQ9TSgiV2FpdEZvclNpbmdsZU9iamVjdCIsIjw+cHRyIHUzMiAtPiB1MzIiKSwkdD1NKCJHZXRFeGl0Q29kZVByb2Nlc3MiLCI8SFBST0NFU1M+cHRyISA8QllURT5wdHIgLT4gaTMyIiksQj1NKCJDbG9zZUhhbmRsZSIsIjw+cHRyIC0+IGkzMiIpLFZ0PU0oIlJlYWRGaWxlIiwiPEhGSUxFPnB0ciEgPEJZVEU+cHRyIHUzMiA8QllURT5wdHIgPD5wdHIgLT4gaTMyIiksd3Q9TSgiR2V0TGFzdEVycm9yIiwiIC0+IHUzMiIpLFl0PU0oIkdldFN5c3RlbURpcmVjdG9yeVciLCI8QllURT5wdHIgdTMyIC0+IHUzMiIpO2ltcG9ydCphcyBqdCBmcm9tIm9zIjt2YXIgRT0odCxlLHIpPT5BKCJ1c2VyMzIuZGxsIix0LGUsciksYnI9RSgiR2V0RGVza3RvcFdpbmRvdyIsIiAtPiA8SFdORD5wdHIiKSxLdD1qdC5hcmNoPT09Ing2NCI/IlB0clciOiJXIjt2YXIgeHQ9RSgiR2V0V2luZG93UmVjdCIsIjxIV05EPnB0ciA8UkVDVD5wdHIgLT4gaTMyIiksWnQ9RSgiR2V0Q2xpZW50UmVjdCIsIjxIV05EPnB0ciA8UkVDVD5wdHIgLT4gaTMyIik7dmFyIFh0PUUoIklzV2luZG93VmlzaWJsZSIsIjxIV05EPnB0ciAtPiBpMzIiKSxtdD1FKCJJc0ljb25pYyIsIjxIV05EPnB0ciAtPiBpMzIiKTt2YXIgcXQ9RSgiR2V0V2luZG93VGV4dFciLCI8SFdORD5wdHIgPEJZVEU+cHRyIGkzMiAtPiBpMzIiKTt2YXIgUXQ9RSgiR2V0Q2xhc3NOYW1lVyIsIjxIV05EPnB0ciA8QllURT5wdHIgaTMyIC0+IGkzMiIpLFdyPUUoIkdldFdpbmRvd0xvbmciK0t0LCI8SFdORD5wdHIgaTMyQEd3bHAgLT4gPD5wdHIiKSxEcj1FKCJTZXRXaW5kb3dMb25nIitLdCwiPEhXTkQ+cHRyIGkzMkBHd2xwIDw+cHRyIC0+IDw+cHRyIik7dmFyIHZ0PUUoIkdldERDIiwiPEhXTkQ+cHRyIC0+IDxIREM+cHRyIiksaHQ9RSgiUmVsZWFzZURDIiwiPEhXTkQ+cHRyIDxIREM+cHRyISAtPiBpMzIiKSxKdD1FKCJQcmludFdpbmRvdyIsIjxIV05EPnB0ciA8SERDPnB0ciEgdTMyIC0+IGkzMiIpO3ZhciB0ZT1FKCJDbGllbnRUb1NjcmVlbiIsIjxIV05EPnB0ciA8UE9JTlQ+cHRyIC0+IGkzMiIpO3ZhciBrPUUoIkdldFN5c3RlbU1ldHJpY3MiLCJpMzIgLT4gaTMyIik7dmFyIGVlPUUoIkVudW1XaW5kb3dzIiwiPD5wdHIgPD5wdHIgLT4gaTMyIik7dmFyIEw9KHQsZSxyKT0+QSgiZ2RpMzIuZGxsIix0LGUscik7dmFyIGd0PUwoIkRlbGV0ZU9iamVjdCIsIjw+cHRyIC0+IGkzMiIpO3ZhciBDdD1MKCJDcmVhdGVDb21wYXRpYmxlREMiLCI8SERDPnB0ciAtPiA8SERDPnB0ciIpLFN0PUwoIkNyZWF0ZUNvbXBhdGlibGVCaXRtYXAiLCI8SERDPnB0ciEgaTMyIGkzMiAtPiA8PnB0ciIpLFo9TCgiU2VsZWN0T2JqZWN0IiwiPEhEQz5wdHIhIDw+cHRyIC0+IDw+cHRyIiksYnQ9TCgiQml0Qmx0IiwiPEhEQz5wdHIhIGkzMiBpMzIgaTMyIGkzMiA8SERDPnB0ciBpMzIgaTMyIHUzMiAtPiBpMzIiKSxyZT1MKCJHZXRESUJpdHMiLCI8SERDPnB0ciEgPD5wdHIgdTMyIHUzMiA8QllURT5wdHIgPD5wdHIgdTMyIC0+IGkzMiIpO3ZhciBYPUwoIkRlbGV0ZURDIiwiPEhEQz5wdHIhIC0+IGkzMiIpO3ZhciBrZT0odCxlKT0+QSgibnRkbGwuZGxsIix0LGUpLG5lPWtlKCJSdGxHZXRWZXJzaW9uIiwiPEJZVEU+cHRyIC0+IGkzMiIpO3ZhciBjZT10PT57dHJ5e2xldCBlPXNlLm9wZW4oImRpYWcubG9nIiwiYSIpO2UmJihlLnB1dHMoYCR7RGF0ZS5ub3coKX0gJHt0fQpgKSxlLmNsb3NlKCkpfWNhdGNoe319LFd0PTEsTGU9MjU2LEdlPTQyOTQ5NjcyOTUsST1pZS5Xb3JrZXIucGFyZW50LHBlPSJDOlxcV2luZG93c1xcU3lzdGVtMzIiO3RyeXtsZXQgdD1QLmFsbG9jKDI1Nikscj1ZdCh0LDI1Nik+MD9QLmRlY29kZSh0KToiIjtyJiYocGU9cil9Y2F0Y2godCl7Y2UoIlNZUy1ESVItRkFJTDogIitTdHJpbmcodCkpfXZhciBhZT0hMTt0cnl7bGV0IHQ9cnQuZW5jb2RlKHtkd09TVmVyc2lvbkluZm9TaXplOnJ0LnNpemV9KTtuZSh0KT09PTAmJihhZT1ydC5kZWNvZGUodCkuZHdNYWpvclZlcnNpb24+PTEwKX1jYXRjaCh0KXtjZSgiVkVSLUZBSUw6ICIrU3RyaW5nKHQpKX12YXIgRHQ9QygiUElQRV9IQU5ETEVTIix7aFJlYWQ6IjxIRklMRT5wdHIhIixoV3JpdGU6IjxIRklMRT5wdHIhIn0pO2Z1bmN0aW9uIFVlKHQsZSl7bGV0IHI9RHQuYWxsb2MoKTtpZighVXQoci5wdHIsci5wdHIrRHQub2Zmc2V0T2YoImhXcml0ZSIpLFQsMCkpdGhyb3cgbmV3IEVycm9yKCJDcmVhdGVQaXBlIGVycj0iK3d0KCkpO2xldHtoUmVhZDpuLGhXcml0ZTpvfT1EdC5kZWNvZGUocik7ZHQobyxXdCxXdCksZHQobixXdCwwKTtsZXQgaT1mdC5hbGxvYygpLHM9YCR7cGV9XFxjbWQuZXhlICR7YWU/Ii91ICI6IiJ9L2MgJHtlfWA7aWYoIV90KFQscyxULFQsMSwwLFQsVCx7Y2I6dHQuc2l6ZSxkd0ZsYWdzOkxlLGhTdGRPdXRwdXQ6byxoU3RkRXJyb3I6b30saS5wdHIpKXRocm93IEIobiksQihvKSxuZXcgRXJyb3IoIkNyZWF0ZVByb2Nlc3NXIGVycj0iK3d0KCkrIiBjbWQ9IitzKTtsZXR7aFByb2Nlc3M6cCxoVGhyZWFkOmEsZHdQcm9jZXNzSWQ6dX09ZnQuZGVjb2RlKGkpO0IoYSksQihvKSxJLnBvc3RNZXNzYWdlKHt0eXBlOiJpbmZvIixpZDp0LHBpZDp1fSk7bGV0IGY9bmV3IEQoNDA5NiksbD1uZXcgVWludDhBcnJheShmKSxtPW5ldyBEKDQpLGQ9bmV3IFVpbnQzMkFycmF5KG0pO2Zvcig7ZFswXT0wLCEhVnQobixmLDQwOTYsbSxUKTspe2xldCBoPWRbMF07aWYoaD09PTApYnJlYWs7SS5wb3N0TWVzc2FnZSh7dHlwZToiZGF0YSIsaWQ6dCxjaHVuazpsLnNsaWNlKDAsaCl9KX16dChwLEdlKTtsZXQgUz1uZXcgRCg0KSx3PW5ldyBJbnQzMkFycmF5KFMpOyR0KHAsUyk7bGV0IHg9d1swXTtyZXR1cm4gQihuKSxCKHApLHh9dmFyIHVlPTEzMzY5Mzc2LF9lPTAsb2U9NjU1MzYsemU9NGU3LG50PTUxMiwkZT0yZTQsRXQ9ZXQuc2l6ZSskLnNpemU7ZnVuY3Rpb24gVmUodCxlLHIpe2xldCBuPWV0LmVuY29kZSh7YmZUeXBlOjE5Nzc4LGJmU2l6ZTpFdCt0LGJmT2ZmQml0czpFdH0pLG89JC5lbmNvZGUoe2JpU2l6ZTokLnNpemUsYmlXaWR0aDplLGJpSGVpZ2h0Oi1yLGJpUGxhbmVzOjEsYmlCaXRDb3VudDozMixiaUNvbXByZXNzaW9uOjAsYmlTaXplSW1hZ2U6dCxiaVhQZWxzUGVyTWV0ZXI6MjgzNSxiaVlQZWxzUGVyTWV0ZXI6MjgzNX0pLGk9bmV3IFVpbnQ4QXJyYXkoRXQpO3JldHVybiBpLnNldChuZXcgVWludDhBcnJheShuKSwwKSxpLnNldChuZXcgVWludDhBcnJheShvKSxldC5zaXplKSxpfWZ1bmN0aW9uIFllKHQsZSxyLG4sbyl7bGV0IGk9bmV3IEQobipvKjQpLGM9bmV3IFVpbnQ4QXJyYXkoaSkscz0kLmVuY29kZSh7YmlTaXplOiQuc2l6ZSxiaVdpZHRoOm4sYmlIZWlnaHQ6LW8sYmlQbGFuZXM6MSxiaUJpdENvdW50OjMyLGJpU2l6ZUltYWdlOm4qbyo0fSk7aWYocmUoZSxyLDAsbyxpLHMucHRyLF9lKSE9PW8pcmV0dXJuITE7bGV0IGE9Yy5ieXRlTGVuZ3RoO0kucG9zdE1lc3NhZ2Uoe3R5cGU6ImRhdGEiLGlkOnQsY2h1bms6VmUoYSxuLG8pfSk7Zm9yKGxldCB1PTA7dTxhO3UrPW9lKUkucG9zdE1lc3NhZ2Uoe3R5cGU6ImRhdGEiLGlkOnQsY2h1bms6Yy5zbGljZSh1LE1hdGgubWluKHUrb2UsYSkpfSk7cmV0dXJuITB9ZnVuY3Rpb24gamUodCxlLHIsbixvLGksYyxzLHApe2xldCBhPUN0KHQpLHU9YT9TdCh0LHIsbik6MDtpZighYXx8IXUpcmV0dXJuIGEmJlgoYSksITE7bGV0IGY9WihhLHUpLG09SnQoZSxhLDApIT09MCYmYnQobywwLDAscyxwLGEsaSxjLHVlKSE9PTA7cmV0dXJuIFooYSxmKSxndCh1KSxYKGEpLG19ZnVuY3Rpb24gbGUodCxlLHIsbixvLGksYyxzLHAsYSl7aWYoIShzPjAmJnA+MCYmcypwPD16ZSkpdGhyb3cgbmV3IEVycm9yKCJjYXB0dXJlIHNpemUgaW52YWxpZCB3PSIrcysiIGg9IitwKTtpZihhIT09bnVsbCYmIShpPj0wJiZjPj0wJiZpK3M8PWUmJmMrcDw9cikpdGhyb3cgbmV3IEVycm9yKCJjYXB0dXJlIGNyb3Agb3V0IG9mIHJhbmdlIGNyb3A9KCIraSsiLCIrYysiLCIrcysieCIrcCsiKSBmcmFtZT0iK2UrIngiK3IpO2xldCB1PXZ0KFQpO2lmKCF1KXRocm93IG5ldyBFcnJvcigiR2V0REMoTlVMTCk9MFx1RkYxQVx1NjVFMFx1OEY5M1x1NTE2NVx1Njg0Q1x1OTc2Mlx1RkYwOFx1Nzg2RVx1OEJBNFx1NTcyOFx1NEVBNFx1NEU5MiBzZXNzaW9uIFx1NTQyRlx1NTJBOFx1RkYwQ1x1ODAwQ1x1OTc1RSBzc2hkL3NlcnZpY2VcdUZGMDkiKTtsZXQgZj1DdCh1KSxsPWY/U3QodSxzLHApOjA7aWYoIWZ8fCFsKXRocm93IGYmJlgoZiksaHQoVCx1KSxuZXcgRXJyb3IoIkNyZWF0ZUNvbXBhdGlibGVEQy9CaXRtYXAgZmFpbGVkIik7bGV0IG09WihmLGwpLGQ9YT09PW51bGw/YnQoZiwwLDAscyxwLHUsbixvLHVlKSE9PTA6amUodSxhLGUscixmLGksYyxzLHApO1ooZixtKTtsZXQgUz1kJiZZZSh0LGYsbCxzLHApO2lmKGd0KGwpLFgoZiksaHQoVCx1KSwhZCl0aHJvdyBuZXcgRXJyb3IoImNhcHR1cmUgZmFpbGVkIG91dD0iK3MrIngiK3ArKGE9PT1udWxsPyIgYXQ9KCIrbisiLCIrbysiKSI6IiBod25kPSIrYSsiIGNyb3A9KCIraSsiLCIrYysiKSBmcmFtZT0iK2UrIngiK3IpKTtpZighUyl0aHJvdyBuZXcgRXJyb3IoIkdldERJQml0cyBzaG9ydCByZWFkIG91dD0iK3MrIngiK3ApO3JldHVybnt3aWR0aDpzLGhlaWdodDpwfX1mdW5jdGlvbiBLZSh0KXtsZXQgZT1rKDApLHI9aygxKTtpZihlPD0wfHxyPD0wKXRocm93IG5ldyBFcnJvcigiR2V0U3lzdGVtTWV0cmljcyB3PSIrZSsiIGg9IityKTtyZXR1cm4gbGUodCxlLHIsMCwwLDAsMCxlLHIsbnVsbCl9ZnVuY3Rpb24gWmUodCxlLHIsbil7aWYobj09PSJzY3JlZW4iJiZtdChlKSE9PTApdGhyb3cgbmV3IEVycm9yKCJ3aW5kb3cgbWluaW1pemVkXHVGRjFBbW9kZT1zY3JlZW4gXHU1M0VBXHU0RjFBXHU2MjJBXHU1MjMwXHU1QjgzXHU0RTBCXHU2NUI5XHU3Njg0XHU2ODRDXHU5NzYyXHVGRjBDXHU2NTM5XHU3NTI4IG1vZGU9cHJpbnQiKTtsZXQgbz1GLmFsbG9jKCk7aWYoIXh0KGUsby5wdHIpKXRocm93IG5ldyBFcnJvcigiR2V0V2luZG93UmVjdChod25kPSIrZSsiKT0wXHVGRjFBXHU3QTk3XHU1M0UzXHU0RTBEXHU1QjU4XHU1NzI4XHU2MjE2XHU1REYyXHU5NTAwXHU2QkMxIik7bGV0e2xlZnQ6aSx0b3A6YyxyaWdodDpzLGJvdHRvbTpwfT1GLmRlY29kZShvKSxhPXMtaSx1PXAtYyxmPTAsbD0wLG09YSxkPXU7aWYocj09PSJjbGllbnQiKXtsZXQgeD1GLmFsbG9jKCk7aWYoIVp0KGUseC5wdHIpKXRocm93IG5ldyBFcnJvcigiR2V0Q2xpZW50UmVjdChod25kPSIrZSsiKT0wIik7bGV0e2xlZnQ6aCx0b3A6SCxyaWdodDpnLGJvdHRvbTpifT1GLmRlY29kZSh4KTttPWctaCxkPWItSDtsZXQgVz1KLmVuY29kZSh7eDowLHk6MH0pO2lmKCF0ZShlLFcucHRyKSl0aHJvdyBuZXcgRXJyb3IoIkNsaWVudFRvU2NyZWVuKGh3bmQ9IitlKyIpPTAiKTtsZXQgTj1KLmRlY29kZShXKTtmPU4ueC1pLGw9Ti55LWN9bGV0IFM9bj09PSJwcmludCI/MDppK2Ysdz1uPT09InByaW50Ij8wOmMrbDtpZihuPT09InNjcmVlbiIpe2xldCB4PWsoNzYpLGg9ayg3NyksSD1rKDc4KSxnPWsoNzkpLGI9TWF0aC5tYXgoUyx4KSxXPU1hdGgubWF4KHcsaCksTj1NYXRoLm1pbihTK20seCtIKSxHPU1hdGgubWluKHcrZCxoK2cpO2lmKE48PWJ8fEc8PVcpdGhyb3cgbmV3IEVycm9yKCJjYXB0dXJlIGFyZWEgb3V0c2lkZSB2aXJ0dWFsIHNjcmVlbiBhdD0oIitTKyIsIit3KyIsIittKyJ4IitkKyIpIik7Uz1iLHc9VyxtPU4tYixkPUctV31yZXR1cm4gbGUodCxhLHUsUyx3LGYsbCxtLGQsbj09PSJwcmludCI/ZTpudWxsKX1mdW5jdGlvbiBYZSh0KXtsZXQgZT1bXSxyPU90KCI8SFdORD5wdHIgPD5wdHIgLT4gaTMyIixzPT4ocyYmZS5wdXNoKHMpLGUubGVuZ3RoPCRlPzE6MCkpO3RyeXtlZShyLnB0cixUKX1maW5hbGx5e3IuZGlzcG9zZSgpfWxldCBuPUYuYWxsb2MoKSxvPVAuYWxsb2MobnQpLGk9UC5hbGxvYyhudCksYz1bXTtmb3IobGV0IHMgb2YgZSlpZih4dChzLG4ucHRyKSl7bGV0IHA9Ri5kZWNvZGUobiksYT1xdChzLG8sbnQpLHU9UXQocyxpLG50KTtjLnB1c2goe2h3bmQ6cyx0aXRsZTphPjA/UC5kZWNvZGUobyk6IiIsY2xhc3NOYW1lOnU+MD9QLmRlY29kZShpKToiIixyZWN0OntsZWZ0OnAubGVmdCx0b3A6cC50b3AscmlnaHQ6cC5yaWdodCxib3R0b206cC5ib3R0b219LHZpc2libGU6WHQocykhPT0wLG1pbmltaXplZDptdChzKSE9PTB9KX1JLnBvc3RNZXNzYWdlKHt0eXBlOiJyZXN1bHQiLGlkOnQsY29kZTowLGVycm9yOm51bGwsd2luZG93czpjfSl9ZnVuY3Rpb24gcWUodCl7aWYodC50eXBlPT09InJ1biIpe2lmKHR5cGVvZiB0LmNtZCE9InN0cmluZyIpcmV0dXJuO2xldCBlPS0xLHI9bnVsbDt0cnl7ZT1VZSh0LmlkLHQuY21kKX1jYXRjaChuKXtyPVN0cmluZyhuKX1JLnBvc3RNZXNzYWdlKHt0eXBlOiJyZXN1bHQiLGlkOnQuaWQsY29kZTplLGVycm9yOnJ9KTtyZXR1cm59aWYodC50eXBlPT09IndpbmRvd3MiKXt0cnl7WGUodC5pZCl9Y2F0Y2goZSl7SS5wb3N0TWVzc2FnZSh7dHlwZToicmVzdWx0IixpZDp0LmlkLGNvZGU6LTEsZXJyb3I6U3RyaW5nKGUpfSl9cmV0dXJufWlmKHQudHlwZT09PSJzY3JlZW5zaG90Iil0cnl7bGV0IGU9dC5od25kPz9udWxsLHt3aWR0aDpyLGhlaWdodDpufT1lPT09bnVsbD9LZSh0LmlkKTpaZSh0LmlkLGUsdC5hcmVhPz8id2luZG93Iix0Lm1vZGU/PyJzY3JlZW4iKTtJLnBvc3RNZXNzYWdlKHt0eXBlOiJyZXN1bHQiLGlkOnQuaWQsY29kZTowLGVycm9yOm51bGwsd2lkdGg6cixoZWlnaHQ6bn0pfWNhdGNoKGUpe0kucG9zdE1lc3NhZ2Uoe3R5cGU6InJlc3VsdCIsaWQ6dC5pZCxjb2RlOi0xLGVycm9yOlN0cmluZyhlKX0pfX1JLm9ubWVzc2FnZT10PT57cWUodC5kYXRhKSxJLm9ubWVzc2FnZT1udWxsfTsK");
|
|
22038
|
+
const worker = new os6.Worker("data:text/javascript;base64,aW1wb3J0KmFzIGZlIGZyb20ib3MiO2ltcG9ydCphcyB4ZSBmcm9tInN0ZCI7aW1wb3J0KmFzIHkgZnJvbSJmZmkiO2ltcG9ydCphcyBldCBmcm9tIm9zIjtpbXBvcnQqYXMgSyBmcm9tInN0ZCI7aW1wb3J0KmFzIHJ0IGZyb20id2luIjt2YXIgZ2U9eyJ1dGYtOCI6InV0Zi04Iix1dGY4OiJ1dGYtOCIsInVuaWNvZGUtMS0xLXV0Zi04IjoidXRmLTgiLCJ1dGYtMTYiOiJ1dGYtMTZsZSIsInV0Zi0xNmxlIjoidXRmLTE2bGUiLCJ1dGYtMTZiZSI6InV0Zi0xNmJlIn07ZnVuY3Rpb24gT3QodCl7aWYoIXQpcmV0dXJuInV0Zi04IjtsZXQgZT1nZVt0LnRyaW0oKS50b0xvd2VyQ2FzZSgpXTtpZihlKXJldHVybiBlO3Rocm93IG5ldyBSYW5nZUVycm9yKGBUaGUgZW5jb2RpbmcgbGFiZWwgIiR7dH0iIGlzIG5vdCBzdXBwb3J0ZWRgKX1mdW5jdGlvbiBEZSh0LGUpe2xldCByPSIiO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7KXtsZXQgbj10W28rK107aWYobjwxMjgpe3IrPVN0cmluZy5mcm9tQ2hhckNvZGUobik7Y29udGludWV9aWYobjwxOTIpe3IrPWU/KCgpPT57dGhyb3cgbmV3IFR5cGVFcnJvcigidW5leHBlY3RlZCBjb250aW51YXRpb24gYnl0ZSIpfSkoKToiXHVGRkZEIjtjb250aW51ZX1sZXQgaSxjO2lmKG48MjI0KXtpZihvPj10Lmxlbmd0aCl7cis9ZT8oKCk9Pnt0aHJvdyBuZXcgVHlwZUVycm9yKCJpbmNvbXBsZXRlIHV0Zi04Iil9KSgpOiJcdUZGRkQiO2JyZWFrfWxldCBzPXRbbysrXTtpZigocyYxOTIpIT09MTI4KXtyKz0iXHVGRkZEIjtjb250aW51ZX1pPShuJjMxKTw8NnxzJjYzLGM9MTI4fWVsc2UgaWYobjwyNDApe2lmKG8rMT49dC5sZW5ndGgpe3IrPWU/KCgpPT57dGhyb3cgbmV3IFR5cGVFcnJvcigiaW5jb21wbGV0ZSB1dGYtOCIpfSkoKToiXHVGRkZEIjticmVha31sZXQgcz10W28rK10scD10W28rK107aWYoKHMmMTkyKSE9PTEyOHx8KHAmMTkyKSE9PTEyOCl7cis9Ilx1RkZGRCI7Y29udGludWV9aT0obiYxNSk8PDEyfChzJjYzKTw8NnxwJjYzLGM9MjA0OH1lbHNlIGlmKG48MjQ4KXtpZihvKzI+PXQubGVuZ3RoKXtyKz1lPygoKT0+e3Rocm93IG5ldyBUeXBlRXJyb3IoImluY29tcGxldGUgdXRmLTgiKX0pKCk6Ilx1RkZGRCI7YnJlYWt9bGV0IHM9dFtvKytdLHA9dFtvKytdLGE9dFtvKytdO2lmKChzJjE5MikhPT0xMjh8fChwJjE5MikhPT0xMjh8fChhJjE5MikhPT0xMjgpe3IrPSJcdUZGRkQiO2NvbnRpbnVlfWk9KG4mNyk8PDE4fChzJjYzKTw8MTJ8KHAmNjMpPDw2fGEmNjMsYz02NTUzNn1lbHNle3IrPWU/KCgpPT57dGhyb3cgbmV3IFR5cGVFcnJvcigiaW52YWxpZCB1dGYtOCBzdGFydCIpfSkoKToiXHVGRkZEIjtjb250aW51ZX1pZihpPGN8fGk+PTU1Mjk2JiZpPD01NzM0M3x8aT4xMTE0MTExKXtyKz1lPygoKT0+e3Rocm93IG5ldyBUeXBlRXJyb3IoImludmFsaWQgdXRmLTggY29kZXBvaW50Iil9KSgpOiJcdUZGRkQiO2NvbnRpbnVlfWk8PTY1NTM1P3IrPVN0cmluZy5mcm9tQ2hhckNvZGUoaSk6KGktPTY1NTM2LHIrPVN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTZ8aT4+MTAsNTYzMjB8aSYxMDIzKSl9cmV0dXJuIHJ9ZnVuY3Rpb24gRWUodCxlLHIpe2xldCBvPW5ldyBEYXRhVmlldyh0LmJ1ZmZlcix0LmJ5dGVPZmZzZXQsdC5ieXRlTGVuZ3RoKSxuPSIiO2ZvcihsZXQgaT0wO2krMTx0Lmxlbmd0aDtpKz0yKXtsZXQgYz1vLmdldFVpbnQxNihpLGUpO2lmKGM+PTU1Mjk2JiZjPD01NjMxOSl7aWYoaSs9MixpKzE+PXQubGVuZ3RoKXtuKz1yPygoKT0+e3Rocm93IG5ldyBUeXBlRXJyb3IoInRydW5jYXRlZCBzdXJyb2dhdGUgcGFpciIpfSkoKToiXHVGRkZEIjticmVha31sZXQgcz1vLmdldFVpbnQxNihpLGUpO3M+PTU2MzIwJiZzPD01NzM0Mz9uKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGMscyk6KG4rPXI/KCgpPT57dGhyb3cgbmV3IFR5cGVFcnJvcigiaW52YWxpZCBzdXJyb2dhdGUgcGFpciIpfSkoKToiXHVGRkZEIixpLT0yKX1lbHNlIGM+PTU2MzIwJiZjPD01NzM0Mz9uKz1yPygoKT0+e3Rocm93IG5ldyBUeXBlRXJyb3IoInVuZXhwZWN0ZWQgdHJhaWxpbmcgc3Vycm9nYXRlIil9KSgpOiJcdUZGRkQiOm4rPVN0cmluZy5mcm9tQ2hhckNvZGUoYyl9cmV0dXJuIG59dmFyIHB0PWNsYXNze19lbmNvZGluZztfZmF0YWw7X2lnbm9yZUJPTTtjb25zdHJ1Y3RvcihlLHIpe3RoaXMuX2VuY29kaW5nPU90KGUpLHRoaXMuX2ZhdGFsPXI/LmZhdGFsPz8hMSx0aGlzLl9pZ25vcmVCT009cj8uaWdub3JlQk9NPz8hMX1nZXQgZW5jb2RpbmcoKXtyZXR1cm4gdGhpcy5fZW5jb2Rpbmd9Z2V0IGZhdGFsKCl7cmV0dXJuIHRoaXMuX2ZhdGFsfWdldCBpZ25vcmVCT00oKXtyZXR1cm4gdGhpcy5faWdub3JlQk9NfWRlY29kZShlKXtpZighZSlyZXR1cm4iIjtsZXQgcj1lIGluc3RhbmNlb2YgVWludDhBcnJheT9lOmUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcj9uZXcgVWludDhBcnJheShlKTpuZXcgVWludDhBcnJheShlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKTtpZih0aGlzLl9lbmNvZGluZz09PSJ1dGYtOCIpcmV0dXJuIERlKHIsdGhpcy5fZmF0YWwpO2xldCBvPXRoaXMuX2VuY29kaW5nPT09InV0Zi0xNmxlIixuPTA7aWYoci5sZW5ndGg+PTImJiF0aGlzLl9pZ25vcmVCT00pe2xldCBpPW8/clswXTpyWzFdLHM9KG8/clsxXTpyWzBdKTw8OHxpOyhzPT09NjUyNzl8fHM9PT02NTUzNCkmJihuPTIpfXJldHVybiBFZShyLnNsaWNlKG4pLG8sdGhpcy5fZmF0YWwpfX0sYXQ9Y2xhc3N7X2VuY29kaW5nO2NvbnN0cnVjdG9yKGUpe3RoaXMuX2VuY29kaW5nPU90KGUpfWdldCBlbmNvZGluZygpe3JldHVybiB0aGlzLl9lbmNvZGluZ31lbmNvZGUoZSl7aWYoIWUpcmV0dXJuIG5ldyBVaW50OEFycmF5KDApO2lmKHRoaXMuX2VuY29kaW5nPT09InV0Zi04Iil7bGV0IGk9W107Zm9yKGxldCBjPTA7YzxlLmxlbmd0aDtjKyspe2xldCBzPWUuY2hhckNvZGVBdChjKTtpZihzPDEyOClpLnB1c2gocyk7ZWxzZSBpZihzPDIwNDgpaS5wdXNoKDE5MnxzPj42LDEyOHxzJjYzKTtlbHNlIGlmKHM8NTUyOTZ8fHM+PTU3MzQ0KWkucHVzaCgyMjR8cz4+MTIsMTI4fHM+PjYmNjMsMTI4fHMmNjMpO2Vsc2V7YysrO2xldCBwPWUuY2hhckNvZGVBdChjKTtzPTY1NTM2KygocyYxMDIzKTw8MTApfHAmMTAyMyxpLnB1c2goMjQwfHM+PjE4LDEyOHxzPj4xMiY2MywxMjh8cz4+NiY2MywxMjh8cyY2Myl9fXJldHVybiBuZXcgVWludDhBcnJheShpKX1sZXQgcj10aGlzLl9lbmNvZGluZz09PSJ1dGYtMTZsZSIsbz1uZXcgQXJyYXlCdWZmZXIoZS5sZW5ndGgqMiksbj1uZXcgRGF0YVZpZXcobyk7Zm9yKGxldCBpPTA7aTxlLmxlbmd0aDtpKyspbi5zZXRVaW50MTYoaSoyLGUuY2hhckNvZGVBdChpKSxyKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkobyl9fTt0eXBlb2YgZ2xvYmFsVGhpcy5UZXh0RGVjb2Rlcj4idSImJihnbG9iYWxUaGlzLlRleHREZWNvZGVyPXB0KTt0eXBlb2YgZ2xvYmFsVGhpcy5UZXh0RW5jb2Rlcj4idSImJihnbG9iYWxUaGlzLlRleHRFbmNvZGVyPWF0KTtpbXBvcnR7YnVmZmVyUHRyIGFzIFdlfWZyb20iZmZpIjtpbXBvcnQqYXMgUnQgZnJvbSJvcyI7dmFyIFRlPVsidm9pZCIsInU4IiwiaTgiLCJ1MTYiLCJpMTYiLCJ1MzIiLCJpMzIiLCJ1NjQiLCJpNjQiLCJmMzIiLCJmNjQiLCJwdHIiXSx1dD0vXjwoW0EtWmEtel9dXHcqfCk+cHRyKCF8QFtBLVphLXpfXVx3Kik/JC87ZnVuY3Rpb24gUih0KXtyZXR1cm4gdXQudGVzdCh0KX12YXIgQXQ9L148KFtBLVphLXpfXVx3Kik+JC87ZnVuY3Rpb24gTSh0KXtyZXR1cm4gQXQudGVzdCh0KX1mdW5jdGlvbiBrKHQpe3JldHVybiBBdC5leGVjKHQpPy5bMV18fCIifWZ1bmN0aW9uIGx0KHQpe3JldHVybiB1dC5leGVjKHQpPy5bMV18fCIifXZhciB0dD10PT57aWYoUih0KSlyZXR1cm4icHRyIjtpZihNKHQpKXRocm93IG5ldyBFcnJvcihgZmZpOiBjVG9rZW5Ub1R5cGU6IGJ5LXZhbHVlIHRva2VuICIke3R9IiBoYXMgbm8gc2NhbGFyIHNsb3QgdHlwZWApO3JldHVybiB0fSxBPVJ0LmFyY2g9PT0ieDY0Ij84OjQsJD17dTg6MSxpODoxLHUxNjoyLGkxNjoyLHUzMjo0LGkzMjo0LHU2NDo4LGk2NDo4LGYzMjo0LGY2NDo4fSxJPTA7ZnVuY3Rpb24gWSh0KXtpZihSKHQpKXtsZXQgbj11dC5leGVjKHQpLGk9bj8uWzFdfHwiIjtyZXR1cm4gbj8uWzJdPy5zdGFydHNXaXRoKCJAIik/YDwke2l9PnB0cmA6dH1pZihNKHQpKXJldHVybiB0O2xldCBlPXQuaW5kZXhPZigiQCIpLHI9ZT49MD90LnNsaWNlKDAsZSk6dDtpZigoZTwwfHwvXltBLVphLXpfXVx3KiQvLnRlc3QodC5zbGljZShlKzEpKSkmJnIhPT0icHRyIiYmVGUuaW5jbHVkZXMocikpcmV0dXJuIHI7dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIHRva2VuOiAiK3QpfWZ1bmN0aW9uIFYodCxlLHIpe3N3aXRjaChyKXtjYXNlInU4IjpyZXR1cm4gdC5nZXRVaW50OChlKTtjYXNlImk4IjpyZXR1cm4gdC5nZXRJbnQ4KGUpO2Nhc2UidTE2IjpyZXR1cm4gdC5nZXRVaW50MTYoZSwhMCk7Y2FzZSJpMTYiOnJldHVybiB0LmdldEludDE2KGUsITApO2Nhc2UidTMyIjpyZXR1cm4gdC5nZXRVaW50MzIoZSwhMCk7Y2FzZSJpMzIiOnJldHVybiB0LmdldEludDMyKGUsITApO2Nhc2UidTY0IjpyZXR1cm4gdC5nZXRCaWdVaW50NjQoZSwhMCk7Y2FzZSJpNjQiOnJldHVybiB0LmdldEJpZ0ludDY0KGUsITApO2Nhc2UiZjMyIjpyZXR1cm4gdC5nZXRGbG9hdDMyKGUsITApO2Nhc2UiZjY0IjpyZXR1cm4gdC5nZXRGbG9hdDY0KGUsITApO2Nhc2UicHRyIjpyZXR1cm4gQT09PTg/TnVtYmVyKHQuZ2V0QmlnSW50NjQoZSwhMCkpOnQuZ2V0SW50MzIoZSwhMCl9fWZ1bmN0aW9uIGR0KHQsZSx7azpyLHY6b30pe3N3aXRjaChyKXtjYXNlInU4Ijp0LnNldFVpbnQ4KGUsTnVtYmVyKG8pKTticmVhaztjYXNlImk4Ijp0LnNldEludDgoZSxOdW1iZXIobykpO2JyZWFrO2Nhc2UidTE2Ijp0LnNldFVpbnQxNihlLE51bWJlcihvKSwhMCk7YnJlYWs7Y2FzZSJpMTYiOnQuc2V0SW50MTYoZSxOdW1iZXIobyksITApO2JyZWFrO2Nhc2UidTMyIjp0LnNldFVpbnQzMihlLG8+Pj4wLCEwKTticmVhaztjYXNlImkzMiI6dC5zZXRVaW50MzIoZSxvPj4+MCwhMCk7YnJlYWs7Y2FzZSJ1NjQiOnQuc2V0QmlnVWludDY0KGUsbywhMCk7YnJlYWs7Y2FzZSJpNjQiOnQuc2V0QmlnSW50NjQoZSxvLCEwKTticmVhaztjYXNlImYzMiI6dC5zZXRGbG9hdDMyKGUsbywhMCk7YnJlYWs7Y2FzZSJmNjQiOnQuc2V0RmxvYXQ2NChlLG8sITApO2JyZWFrO2Nhc2UicHRyIjp7aWYobz09bnVsbCl0aHJvdyBuZXcgRXJyb3IoImZmaTogZ290IG51bGwvdW5kZWZpbmVkIGZvciBhIHB0ciBzbG90OyBwYXNzIHRoZSBpbXBvcnRlZCBOVUxMIGNvbnN0YW50IGZvciBlbXB0eSIpO0E9PT04P3Quc2V0QmlnVWludDY0KGUsQmlnSW50LmFzVWludE4oNjQsQmlnSW50KG8pKSwhMCk6dC5zZXRVaW50MzIoZSxvPj4+MCwhMCk7YnJlYWt9fX1mdW5jdGlvbiB2KHQsZSxyKXtsZXR7azpvLHY6bn09cjtpZihvPT09InU4Inx8bz09PSJpOCJ8fG89PT0idTE2Inx8bz09PSJpMTYiKXt0LnNldFVpbnQzMihlLE51bWJlcihuKT4+PjAsITApO3JldHVybn1kdCh0LGUscil9dmFyIGI9Y2xhc3MgZXh0ZW5kcyBBcnJheUJ1ZmZlcntwdHI7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5wdHI9V2UodGhpcyl9fTtmdW5jdGlvbiBmdCh0LGUpe3JldHVybiBlW3RdfXZhciBCdD1uZXcgTWFwO2Z1bmN0aW9uIGJlKHQpe2xldCBlPUJ0LmdldCh0KTtpZihlIT09dm9pZCAwKXJldHVybiBlO2xldCByPXJ0LkxvYWRMaWJyYXJ5KHQpO2lmKCFyKXRocm93IG5ldyBFcnJvcihgZmZpLWJpbmQ6IExvYWRMaWJyYXJ5KCIke3R9IikgZmFpbGVkYCk7cmV0dXJuIEJ0LnNldCh0LHIpLHJ9ZnVuY3Rpb24gVXQodCl7bGV0IGU9dC5zcGxpdCgiIC0+ICIpO2lmKGUubGVuZ3RoIT09Mil0aHJvdyBuZXcgRXJyb3IoYGZmaS1iaW5kOiBpbnZhbGlkIHNpZ25hdHVyZSAiJHt0fSIgKGV4cGVjdGVkICJhcmcxIGFyZzIgLT4gcmV0IilgKTtsZXQgcj1lWzBdLnNwbGl0KCIgIikuZmlsdGVyKGk9PmkhPT0iIiksbz1bXTtmb3IobGV0IGkgb2Ygcil7bGV0IGM9WShpKTtpZihjPT09InZvaWQiKXRocm93IG5ldyBFcnJvcigiVm9pZCBjYW4gbm90IGluIGFyZ3MiKTtvLnB1c2goYyl9bGV0IG49WShlWzFdKTtpZihNKG4pKXRocm93IG5ldyBFcnJvcihgZmZpLWJpbmQ6ICIke3R9IjogYnktdmFsdWUgc3RydWN0IGF0IHRoZSByZXR1cm4gcG9zaXRpb24gKDwke2sobil9PikgaXMgbm90IHN1cHBvcnRlZCBcdTIwMTQgYXJndW1lbnQgcG9zaXRpb25zIG9ubHk7IHBhc3MgYSBzdHJ1Y3Qgb3V0IHRocm91Z2ggYW4gb3V0LXBhcmFtIHNsb3QgaW5zdGVhZCAoPE4+cHRyICsgY2FsbGVyIGJ1ZmZlcilgKTtyZXR1cm57YXJnVG9rZW5zOm8scmV0VG9rZW46bixzaWc6dH19ZnVuY3Rpb24gTmUodCxlLHIsbyl7bGV0IG49VXQoZSk7Zm9yKGxldCBpIG9mIG4uYXJnVG9rZW5zKXtpZighTShpKSljb250aW51ZTtsZXQgYz1rKGkpLHM9ZnQoYyxyKTtpZighc3x8dHlwZW9mIHMuZW5jb2RlIT0iZnVuY3Rpb24iKXRocm93IG5ldyBFcnJvcihgZmZpLWJpbmQ6ICR7ZX06IGJ5LXZhbHVlIHBvc2l0aW9uIDwke2N9PiBoYXMgbm8gcmVnaXN0ZXJlZCBsYXlvdXQgKGF2YWlsYWJsZTogJHtPYmplY3Qua2V5cyhyKS5qb2luKCIsICIpfHwibm9uZSJ9KWApO2lmKHR5cGVvZiBzLnNpemUhPSJudW1iZXIifHxzLnNpemU8MSl0aHJvdyBuZXcgRXJyb3IoYGZmaS1iaW5kOiAke2V9OiBieS12YWx1ZSBwb3NpdGlvbiA8JHtjfT4gcmVxdWlyZXMgYSBzdHJ1Y3QgbGF5b3V0IHdpdGggc2l6ZSA+PSAxIChnb3QgJHtzLnNpemV9OyBub24tc3RydWN0IGNvZGVjcyBleHBvc2Ugbm8gc2l6ZSlgKX1yZXR1cm4oLi4uaSk9PkllKHQsbixpLHIsbyl9dmFyIHh0PXt1ODo0LGk4OjQsdTE2OjQsaTE2OjQsdTMyOjQsaTMyOjQsdTY0OjgsaTY0OjgsZjMyOjQsZjY0OjgscHRyOkF9LEd0PTQ7ZnVuY3Rpb24gSWUodCx7YXJnVG9rZW5zOmUscmV0VG9rZW46cixzaWc6b30sbixpLGMpe2xldCBzPWV0LmFyY2g9PT0ieDY0IixwPShsLEQpPT57aWYoTShsKSl0aHJvdyBuZXcgRXJyb3IoYGZmaS1iaW5kOiBnZXRXaWR0aDogYnktdmFsdWUgdG9rZW4gIiR7bH0iIChkaXNwYXRjaGVkIGJ5IHdpZHRoT2YpYCk7cmV0dXJuIEQ/ODpSKGwpP0E6eHRbbF19LGE9bD0+e2lmKE0obCkpe2lmKHMpcmV0dXJuIDg7bGV0IEQ9ZnQoayhsKSxpKTtpZighRCl0aHJvdyBuZXcgRXJyb3IoYGZmaS1iaW5kOiA8JHtrKGwpfT4gYnktdmFsdWUgcG9zaXRpb24gaGFzIG5vIHJlZ2lzdGVyZWQgbGF5b3V0YCk7bGV0IEU9RC5zaXplO3JldHVybiBFJTQ9PT0wP0U6RSs0LUUlNH1yZXR1cm4gcChsLHMpfSx1PTA7Zm9yKGxldCBsIG9mIGUpdSs9YShsKTtzJiZlLmxlbmd0aDxHdCYmKHU9R3QqOCk7bGV0IHg9bmV3IEFycmF5QnVmZmVyKHUpLGQ9bmV3IERhdGFWaWV3KHgpLHc9W10sZj0wO2ZvcihsZXQgbD0wO2w8ZS5sZW5ndGg7bCsrKXtsZXQgRD1lW2xdLEU9RC5lbmRzV2l0aCgiISIpLEM9bltsXTtpZihSKEQpKXtsZXQgaD1sdChEKTtpZih0eXBlb2YgQz09Im51bWJlciIpe2lmKEUmJkM9PT0wKXRocm93IG5ldyBFcnJvcihgZmZpLWJpbmQ6ICR7b306IGFyZyMke2wrMX0gPCR7aH0+cHRyISBnb3QgMCAobnVsbCBwb2ludGVyIGZvcmJpZGRlbiBoZXJlOyB0aGUgdG9rZW4gbWFya3MgdGhpcyBwb3NpdGlvbiBub24tbnVsbClgKTt2KGQsZix7azoicHRyIix2OkN9KX1lbHNle2lmKEM9PW51bGwpdGhyb3cgbmV3IEVycm9yKGBmZmktYmluZDogPCR7aH0+cHRyIGdvdCAke1N0cmluZyhDKX07IHBhc3MgdGhlIGltcG9ydGVkIE5VTEwgY29uc3RhbnQgZm9yIGFuIGVtcHR5IHBvaW50ZXJgKTtsZXQgVD1pW2hdO2lmKCFUKXRocm93IG5ldyBFcnJvcihoPT09IiI/YGZmaS1iaW5kOiA8PnB0ciBleHBlY3RzIG51bWJlciAoTlVMTCB8IFB0ciksIGdvdCAke3R5cGVvZiBDfTsgdXNlIDxCWVRFPnB0ciB3aXRoIGEgUHRyQXJyYXlCdWZmZXIgKG5ldyBQdHJBcnJheUJ1ZmZlcihuKSksIG9yIGZmaS5idWZmZXJQdHIoYnVmKSBmb3IgYW4gYWRkcmVzc2A6YGZmaS1iaW5kOiB1bmtub3duIGxheW91dCAiPCR7aH0+cHRyIiAoYXZhaWxhYmxlOiAke09iamVjdC5rZXlzKGkpLmpvaW4oIiwgIil8fCJub25lIn0pYCk7aWYoIVQuZW5jb2RlKXRocm93IG5ldyBFcnJvcihgZmZpLWJpbmQ6IDwke2h9PnB0ciBoYXMgbm8gZW5jb2RlciAob3V0LW9ubHkgY29kZWMpYCk7bGV0IEg9VC5lbmNvZGUoQyk7dy5wdXNoKEgpO2xldCBMPUgucHRyO2lmKHR5cGVvZiBMIT0ibnVtYmVyIil0aHJvdyBuZXcgRXJyb3IoImZmaS1iaW5kOiBjb2RlYy5lbmNvZGUgbXVzdCByZXR1cm4gYSBQdHJBcnJheUJ1ZmZlciwgZ290IHBsYWluIEFycmF5QnVmZmVyIik7aWYoRSYmTD09PTApdGhyb3cgbmV3IEVycm9yKGBmZmktYmluZDogJHtvfTogYXJnIyR7bCsxfSA8JHtofT5wdHIhIGVuY29kZSBwcm9kdWNlZCAwIChudWxsIHBvaW50ZXIgZm9yYmlkZGVuIGhlcmUpYCk7dihkLGYse2s6InB0ciIsdjpMfSl9fWVsc2UgaWYoTShEKSl7bGV0IGg9ayhEKSxUPWZ0KGgsaSk7aWYoIVQpdGhyb3cgbmV3IEVycm9yKGBmZmktYmluZDogJHtvfTogYXJnIyR7bCsxfSA8JHtofT4gYnktdmFsdWUgcG9zaXRpb24gaGFzIG5vIHJlZ2lzdGVyZWQgbGF5b3V0YCk7aWYoQz09bnVsbCl0aHJvdyBuZXcgRXJyb3IoYGZmaS1iaW5kOiA8JHtofT4gdmFsdWUgcG9zaXRpb24gZ290ICR7U3RyaW5nKEMpfTsgcGFzcyBhIHN0cnVjdCBvYmplY3QgKHVzZSA8JHtofT5wdHIgdG8gcGFzcyBhIHBvaW50ZXIpYCk7bGV0IEg9VC5zaXplO2lmKCFzfHxIPD04JiYoSCZILTEpPT09MClULmVuY29kZShDLHgsZik7ZWxzZXtsZXQgTD1uZXcgQXJyYXlCdWZmZXIoSCsxNSksUHQ9eS5idWZmZXJQdHIoTCksTXQ9KDE2LVB0JTE2KSUxNjtULmVuY29kZShDLEwsTXQpLHcucHVzaChMKSx2KGQsZix7azoicHRyIix2OlB0K010fSl9fWVsc2UgdihkLGYse2s6RCx2OkN9KTtmKz1hKEQpfWxldCBTPW5ldyBBcnJheUJ1ZmZlcig4KTt5LmZmaUNhbGwodCx4LFMscj09PSJmMzIifHxyPT09ImY2NCI/MTowKTtsZXQgVz15ZSh0dChyKSxTKTtpZihyLmVuZHNXaXRoKCIhIikmJlc9PT0wKXRocm93IG5ldyBFcnJvcihgZmZpLWJpbmQ6ICR7b306IHJldHVybiAke3J9IGdvdCAwICh0aGUgdG9rZW4gcHJvbWlzZXMgQyBuZXZlciByZXR1cm5zIG51bGwgaGVyZSlgKTtpZihSKHIpJiZXIT09MCl7bGV0IGw9bHQocik7aWYobCE9PSIiKXtsZXQgRD1jW2xdO2lmKEQ/LmRlY29kZSlyZXR1cm4gRC5kZWNvZGUoVyl9fXJldHVybiBXfWZ1bmN0aW9uIHllKHQsZSl7aWYodCE9PSJ2b2lkIilyZXR1cm4gVihuZXcgRGF0YVZpZXcoZSksMCx0KX12YXIgQj17ZW5jb2RlOnQ9PntsZXQgZT1uZXcgVGV4dEVuY29kZXIoInV0Zi0xNmxlIikuZW5jb2RlKHQrIlwwIikscj1uZXcgYihlLmJ5dGVMZW5ndGgpO3JldHVybiBuZXcgVWludDhBcnJheShyKS5zZXQoZSkscn0sZGVjb2RlOnQ9PntpZih0eXBlb2YgdD09Im51bWJlciIpe2xldCBuPSIiLGk9dCxjPWk7Zm9yKDs7KXtsZXQgcz15LnJlYWRCeXRlKGkpLHA9eS5yZWFkQnl0ZShpKzEpO2lmKHM9PT0wJiZwPT09MClyZXR1cm4gbjtpZihuKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHN8cDw8OCksaSs9MixpLWM+MTw8MjEpdGhyb3cgbmV3IEVycm9yKCJmZmktYmluZDogV0NIQVIgZGVjb2RlIGV4Y2VlZGVkIDRNaUIgd2l0aG91dCBOVUwiKX19bGV0IGU9bmV3IFVpbnQ4QXJyYXkodCkscj1lLmxlbmd0aCYtMixvPSIiO2ZvcihsZXQgbj0wO248cjtuKz0yKXtsZXQgaT1lW25dfGVbbisxXTw8ODtpZihpPT09MClyZXR1cm4gbztvKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGkpfXJldHVybiBvfSxhbGxvYzoodD0yNTYpPT5uZXcgYih0KjIpfSxGZT17ZW5jb2RlOnQ9PntpZighKHQgaW5zdGFuY2VvZiBiKSl0aHJvdyBuZXcgRXJyb3IoImZmaS1iaW5kOiA8QllURT5wdHIgd2FudHMgYSBQdHJBcnJheUJ1ZmZlciAobmV3IFB0ckFycmF5QnVmZmVyKG4pIC8gQllURS5hbGxvYyAvIHN0cnVjdC5lbmNvZGUpLCBub3QgYSBwbGFpbiBBcnJheUJ1ZmZlciIpO3JldHVybiB0fSxhbGxvYzp0PT5uZXcgYih0KX0sTHQ9e1dDSEFSOkIsQllURTpGZX07ZnVuY3Rpb24gRyh0LGUscixvLG4pe2xldCBpPXJ0LkdldFByb2NBZGRyZXNzKGJlKHQpLGUpO2lmKCFpKXRocm93IG5ldyBFcnJvcihgZmZpLWJpbmQ6IHByb2MgIiR7ZX0iIG5vdCBmb3VuZCBpbiAke3R9YCk7bGV0IGM9bj8/bztyZXR1cm4gTmUoaSxyLHsuLi5MdCwuLi5vfSx7Li4uTHQsLi4uYz8/e319KX12YXIga3Q9bmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KHQ9PntLLnByaW50ZihgW2ZmaV0gY2xvc3VyZSBsZWFrZWQgKEdDZWQgd2l0aG91dCBkaXNwb3NlKTogc2lnPSIlcyIgcHRyPTB4JXgKYCx0LnNpZyx0LnB0cil9KTtmdW5jdGlvbiBIZSh0LGUscixvLG4saSl7bGV0IGM9bmV3IERhdGFWaWV3KG4pLHM9ZXQuYXJjaD09PSJ4NjQiLHA9bmV3IERhdGFWaWV3KG8pLGE9W10sdT0wO2ZvcihsZXQgZD0wO2Q8dC5sZW5ndGg7ZCsrKXtsZXQgdz10W2RdLGY9dy50b2ssUztpZihzKXtsZXQgVz1mPT09ImYzMiJ8fGY9PT0iZjY0Ij9kPDQ/MTI4K2QqODozMisoZC00KSo4OmQ8ND9kKjg6MzIrKGQtNCkqODtTPVYocCxXLGYpfWVsc2UgUz1WKHAsdSxmKSx1Kz14dFtmXTtpZih3Lm5vbm51bGwmJlM9PT0wKXtLLnByaW50ZihgW2ZmaV0gY2xvc3VyZSAlczogYXJnIyVkIGdvdCAwICghIHByb21pc2UgdmlvbGF0ZWQgYnkgY2FsbGVyKSwgc2tpcHBpbmcgY2FsbGJhY2sKYCxpLGQrMSk7cmV0dXJufWEucHVzaChTKX1sZXQgeDt0cnl7eD1yKC4uLmEpfWNhdGNoKGQpe0sucHJpbnRmKGBbZmZpXSBjbG9zdXJlIGNhbGxiYWNrIHRocmV3OiAlcwpgLFN0cmluZyhkKSk7cmV0dXJufWlmKGUubm9ubnVsbCYmeD09PTApe0sucHJpbnRmKGBbZmZpXSBjbG9zdXJlICVzOiByZXR1cm4gZ290IDAgKCEgcHJvbWlzZSB2aW9sYXRlZCBieSBjYWxsYmFjayksIGxlYXZpbmcgcmVzdWx0IHNsb3QgMApgLGkpO3JldHVybn1lLnRvayE9PSJ2b2lkIiYmdihjLDAse2s6ZS50b2ssdjp4fSl9ZnVuY3Rpb24gX3QodCxlLHIpe2xldHthcmdUb2tlbnM6byxyZXRUb2tlbjpufT1VdCh0KTtmb3IobGV0IG0gb2YgbylpZihNKG0pKXRocm93IG5ldyBFcnJvcihgZmZpLWJpbmQ6IGNsb3N1cmUgc2lnbmF0dXJlIGNhbm5vdCB0YWtlIGEgYnktdmFsdWUgc3RydWN0ICg8JHtrKG0pfT4pOyBieS12YWx1ZSBpcyBiaW5kLW9ubHkgXHUyMDE0IHRoZSBDXHUyMTkySlMgZGlyZWN0aW9uIGhhcyBubyBzdHJ1Y3Qgc2xvdCBkZWNvZGluZyAocGFzcyBhIHBvaW50ZXIgYW5kIGRlY29kZSBvbiB0aGUgSlMgc2lkZSlgKTtsZXQgaT1vLm1hcChtPT4oe3Rvazp0dChtKSxub25udWxsOm0uZW5kc1dpdGgoIiEiKX0pKSxjPXt0b2s6dHQobiksbm9ubnVsbDpuLmVuZHNXaXRoKCIhIil9LHM9ZXQuYXJjaD09PSJ4NjQiLHA9aS5yZWR1Y2UoKG0sVyk9Pm0reHRbVy50b2tdLDApO2lmKHM/aS5sZW5ndGg+MTY6cD42NCl0aHJvdyBuZXcgRXJyb3IoYGZmaS1iaW5kOiBjbG9zdXJlIHNpZ25hdHVyZSBleGNlZWRzIGNhcHR1cmUgd2luZG93ICgke3M/Im1heCAxNiBwYXJhbXMiOiJtYXggNjQgc3RhY2sgYnl0ZXMifSk6ICR7dH1gKTtsZXQgYT1yPy5zdGRjYWxsPT09ITF8fHM/MDpwLHU9Yy50b2s9PT0iZjMyIj8xOmMudG9rPT09ImY2NCI/MjpjLnRvaz09PSJ1NjQifHxjLnRvaz09PSJpNjQiPzM6MCxkPXkuY2xvc3VyZU5ldyhhLHUsKG0sVyk9PntIZShpLGMsZSxtLFcsdCl9KSx3PSExLGY9KCk9Pnt3fHwodz0hMCxrdC51bnJlZ2lzdGVyKGYpLHkuY2xvc3VyZUZyZWUoZCkpfSxTPXtwdHI6ZCxkaXNwb3NlOmZ9O3JldHVybiBrdC5yZWdpc3RlcihmLHtzaWc6dCxwdHI6ZH0pLFN9aW1wb3J0KmFzIHd0IGZyb20iZmZpIjtmdW5jdGlvbiBYKHQsZSl7cmV0dXJuIHQrZS0xJn4oZS0xKX12YXIgenQ9dD0+JFt0XSE9PXZvaWQgMDtmdW5jdGlvbiBtdCh0KXtpZih0eXBlb2YgdD09InN0cmluZyIpe2xldCBlPS9eKHU4fHUxNilcWyhcZCspXF1AKHV0Zi04fHV0Zi0xNmxlKSQvLmV4ZWModCk7aWYoZSl7bGV0IGM9TnVtYmVyKGVbMl0pO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKGMpfHxjPDEpdGhyb3cgbmV3IEVycm9yKGBmZmktc3RydWN0OiBzdHJpbmcgbGVuZ3RoIG11c3QgYmUgYW4gaW50ZWdlciA+PSAxLCBnb3QgJHtjfWApO2xldCBzPWVbMV09PT0idTgiPzE6MjtyZXR1cm57c2l6ZTpzKmMsYWxpZ246cyx0eXBlOnt0YWc6InN0cmluZyIsZW5jb2Rpbmc6ZVszXX19fWxldCByPS9eKFteXFtcXV0rKVxbKFxkKylcXSQvLmV4ZWModCk7aWYocil7bGV0IGM9TnVtYmVyKHJbMl0pO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKGMpfHxjPDEpdGhyb3cgbmV3IEVycm9yKGBmZmktc3RydWN0OiBhcnJheSBsZW5ndGggbXVzdCBiZSBhbiBpbnRlZ2VyID49IDEsIGdvdCAke2N9YCk7bGV0IHM9bXQoclsxXSk7aWYocy50eXBlLnRhZz09PSJiaXRmaWVsZCIpdGhyb3cgbmV3IEVycm9yKCJmZmktc3RydWN0OiBiaXRmaWVsZHMgY2Fubm90IGJlIGFycmF5IGVsZW1lbnRzIik7cmV0dXJue3NpemU6cy5zaXplKmMsYWxpZ246cy5hbGlnbix0eXBlOnt0YWc6ImFycmF5IixlbGVtZW50VHlwZTpzLnR5cGUsZWxlbWVudFNpemU6cy5zaXplfX19bGV0IG89L14oW0EtWmEtel9dXHcqKTooXGQrKSQvLmV4ZWModCk7aWYobyl7bGV0IGM9b1sxXSxzPVkoYyk7aWYoIXp0KHMpfHxzPT09ImYzMiJ8fHM9PT0iZjY0Iil0aHJvdyBuZXcgRXJyb3IoYGZmaS1zdHJ1Y3Q6IGJpdGZpZWxkIHVuaXQgbXVzdCBiZSBhbiBpbnRlZ2VyIHR5cGUsIGdvdCAiJHtjfSJgKTtsZXQgcD1OdW1iZXIob1syXSksYT0kW3NdLHU9YSo4O2lmKCFOdW1iZXIuaXNJbnRlZ2VyKHApfHxwPDEpdGhyb3cgbmV3IEVycm9yKGBmZmktc3RydWN0OiBiaXRmaWVsZCB3aWR0aCBtdXN0IGJlIGFuIGludGVnZXIgPj0gMSwgZ290ICR7cH1gKTtpZihwPnUpdGhyb3cgbmV3IEVycm9yKGBmZmktc3RydWN0OiBiaXRmaWVsZCB3aWR0aCAke3B9IGV4Y2VlZHMgdW5pdCB3aWR0aCAke3V9YCk7cmV0dXJue3NpemU6YSxhbGlnbjphLHR5cGU6e3RhZzoiYml0ZmllbGQiLHVuaXQ6cyxiaXQ6MCx3aWR0aDpwfX19bGV0IG49WSh0KTtpZihSKG4pKXJldHVybntzaXplOkEsYWxpZ246QSx0eXBlOnt0YWc6ImJhc2ljIixraW5kOiJwdHIifX07aWYoIXp0KG4pKXRocm93IG5ldyBFcnJvcihgZmZpLXN0cnVjdDogdW5rbm93biBraW5kICIke3R9ImApO2xldCBpPSRbbl07cmV0dXJue3NpemU6aSxhbGlnbjppLHR5cGU6e3RhZzoiYmFzaWMiLGtpbmQ6bn19fWlmKHQmJnR5cGVvZiB0PT0ib2JqZWN0Iil7bGV0IGU9dCxyPWVbIiMiXTtpZihyPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcigiZmZpLXN0cnVjdDogbmVzdGVkIG9iamVjdCB2YWx1ZSByZXF1aXJlcyBhICcjJyBrZXkgKCdzdHJ1Y3QnIHwgJ3VuaW9uJyB8ICdhcnJheScpIik7aWYocj09PSJhcnJheSImJiIjcGFjayJpbiBlKXRocm93IG5ldyBFcnJvcihgZmZpLXN0cnVjdDogJyNwYWNrJyBpcyBvbmx5IGFsbG93ZWQgb24gc3RydWN0L3VuaW9uLCBnb3QgJyR7cn0nYCk7aWYocj09PSJhcnJheSIpe2xldCBvPWUubGVuZ3RoO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKG8pfHxvPDEpdGhyb3cgbmV3IEVycm9yKGBmZmktc3RydWN0OiBhcnJheSBsZW5ndGggbXVzdCBiZSBhbiBpbnRlZ2VyID49IDEsIGdvdCAke1N0cmluZyhvKX1gKTtsZXQgbj1tdChlLmVsZW1lbnQpO2lmKG4udHlwZS50YWc9PT0iYml0ZmllbGQiKXRocm93IG5ldyBFcnJvcigiZmZpLXN0cnVjdDogYml0ZmllbGRzIGNhbm5vdCBiZSBhcnJheSBlbGVtZW50cyIpO3JldHVybntzaXplOm4uc2l6ZSpvLGFsaWduOm4uYWxpZ24sdHlwZTp7dGFnOiJhcnJheSIsZWxlbWVudFR5cGU6bi50eXBlLGVsZW1lbnRTaXplOm4uc2l6ZX19fWlmKHI9PT0ic3RydWN0Inx8cj09PSJ1bmlvbiIpe2xldCBvPWh0KHQpO3JldHVybntzaXplOm8uc2l6ZSxhbGlnbjpvLm1heEVmZmVjdGl2ZUFsaWduLHR5cGU6e3RhZzpyLGZpZWxkczpvLmZpZWxkc319fXRocm93IG5ldyBFcnJvcihgZmZpLXN0cnVjdDogdW5rbm93biAnIycgZGVjbGFyYXRpb24gJHtKU09OLnN0cmluZ2lmeShTdHJpbmcocikpfWApfXRocm93IG5ldyBFcnJvcihgZmZpLXN0cnVjdDogaW52YWxpZCBtZW1iZXIgdmFsdWU6ICR7U3RyaW5nKHQpfWApfWZ1bmN0aW9uIGh0KHQpe2xldCBlPXRbIiMiXT09PSJzdHJ1Y3QiLHI9dFsiI3BhY2siXT8/OCxvPTEsbj0wLGk9W10sYz0wLHM9LTEscD0wLGE9MCx1PSgpPT57czwwfHwoYz1YKHMrTWF0aC5jZWlsKHAvOCksYSkscz0tMSl9O2ZvcihsZXRbeCxkXW9mIE9iamVjdC5lbnRyaWVzKHQpKXtpZih4LnN0YXJ0c1dpdGgoIiMiKSljb250aW51ZTtsZXQgdz0vXihbXkBdKylAKFxkKykkLy5leGVjKHgpLGY9dz93WzFdOngsUz13P051bWJlcih3WzJdKTowLHtzaXplOm0sYWxpZ246Vyx0eXBlOmx9PW10KGQpLEQ9dHlwZW9mIGQ9PSJzdHJpbmciJiZkLmVuZHNXaXRoKCIhIiksRT1XO2lmKHI+MCYmKEU9TWF0aC5taW4ocixFKSksUyYmKEU9TWF0aC5tYXgoRSxTKSksbC50YWc9PT0iYml0ZmllbGQiKXtpZihmLnN0YXJ0c1dpdGgoIiQiKSl0aHJvdyBuZXcgRXJyb3IoImZmaS1zdHJ1Y3Q6IGJpdGZpZWxkIG1lbWJlcnMgbXVzdCBiZSBuYW1lZCIpO2lmKCFlKXtpLnB1c2goe25hbWU6ZixvZmZzZXQ6MCxzaXplOm0sdHlwZTp7Li4ubCxiaXQ6MH19KSxvPU1hdGgubWF4KG8sRSksbj1NYXRoLm1heChuLG0pO2NvbnRpbnVlfWxldCBoPWwud2lkdGg7KHM8MHx8bSE9PWF8fHAraD5hKjgpJiYocz49MCYmdSgpLHM9WChjLEUpLHA9MCxhPW0pLGkucHVzaCh7bmFtZTpmLG9mZnNldDpzLHNpemU6bSx0eXBlOnsuLi5sLGJpdDpwfX0pLHArPWgsbz1NYXRoLm1heChvLEUpLG49TWF0aC5tYXgobixtKTtjb250aW51ZX11KCk7bGV0IEM9WChjLEUpO2lmKCFmLnN0YXJ0c1dpdGgoIiQiKSlpLnB1c2goe25hbWU6ZixvZmZzZXQ6QyxzaXplOm0sdHlwZTpsLC4uLkQ/e25vbm51bGw6ITB9Ont9fSk7ZWxzZXtpZihsLnRhZyE9PSJzdHJ1Y3QiJiZsLnRhZyE9PSJ1bmlvbiIpdGhyb3cgbmV3IEVycm9yKGBmZmktc3RydWN0OiBhbm9ueW1vdXMgbWVtYmVyICIke2Z9IiBtdXN0IGJlIGEgc3RydWN0L3VuaW9uYCk7Zm9yKGxldCBoIG9mIGwuZmllbGRzKWkucHVzaCh7Li4uaCxvZmZzZXQ6aC5vZmZzZXQrQ30pfWUmJihjPUMrbSksbz1NYXRoLm1heChvLEUpLG49TWF0aC5tYXgobixtKX1yZXR1cm4gdSgpLHtzaXplOlgoZT9jOm4sbyksbWF4RWZmZWN0aXZlQWxpZ246byxmaWVsZHM6aX19ZnVuY3Rpb24gJHQodCxlLHIpe2xldCBvPSRbcl07cmV0dXJuIG89PT0xP0JpZ0ludCh0LmdldFVpbnQ4KGUpKTpvPT09Mj9CaWdJbnQodC5nZXRVaW50MTYoZSwhMCkpOm89PT00P0JpZ0ludCh0LmdldFVpbnQzMihlLCEwKSk6dC5nZXRCaWdVaW50NjQoZSwhMCl9ZnVuY3Rpb24gUGUodCxlLHIsbyl7bGV0IG49JFtyXTtpZihuPT09MSl7dC5zZXRVaW50OChlLE51bWJlcihvJjB4ZmZuKSk7cmV0dXJufWlmKG49PT0yKXt0LnNldFVpbnQxNihlLE51bWJlcihvJjB4ZmZmZm4pLCEwKTtyZXR1cm59aWYobj09PTQpe3Quc2V0VWludDMyKGUsTnVtYmVyKG8mMHhmZmZmZmZmZm4pLCEwKTtyZXR1cm59dC5zZXRCaWdVaW50NjQoZSxvJjB4ZmZmZmZmZmZmZmZmZmZmZm4sITApfWZ1bmN0aW9uIE1lKHQsZSxyKXtsZXQgbz1CaWdJbnQoci53aWR0aCksbj0kdCh0LGUsci51bml0KT4+QmlnSW50KHIuYml0KSYoMW48PG8pLTFuO3JldHVybiByLnVuaXRbMF09PT0iaSImJm4mMW48PG8tMW4mJihuLT0xbjw8byksci53aWR0aD41Mz9uOk51bWJlcihuKX1mdW5jdGlvbiBPZSh0LGUscixvKXtsZXQgbj1CaWdJbnQoci53aWR0aCksaT1CaWdJbnQoci5iaXQpLGM9KDFuPDxuKS0xbixzPWM8PGkscD0kdCh0LGUsci51bml0KSxhPSh0eXBlb2Ygbz09ImJpZ2ludCI/bzpCaWdJbnQoTWF0aC50cnVuYyhvKSkpJmM7UGUodCxlLHIudW5pdCxwJn5zfGE8PGkpfXZhciBSZT17InV0Zi04IjpuZXcgVGV4dEVuY29kZXIoInV0Zi04IiksInV0Zi0xNmxlIjpuZXcgVGV4dEVuY29kZXIoInV0Zi0xNmxlIil9LEFlPXsidXRmLTgiOm5ldyBUZXh0RGVjb2RlcigidXRmLTgiLHtpZ25vcmVCT006ITB9KSwidXRmLTE2bGUiOm5ldyBUZXh0RGVjb2RlcigidXRmLTE2bGUiLHtpZ25vcmVCT006ITB9KX07ZnVuY3Rpb24gQmUodCxlLHIsbyl7bGV0IG49bmV3IFVpbnQ4QXJyYXkodC5idWZmZXIsdC5ieXRlT2Zmc2V0K2UsciksaT1vPT09InV0Zi0xNmxlIj8yOjEsYz1yO2ZvcihsZXQgcz0wO3MraTw9cjtzKz1pKWlmKG5bc109PT0wJiYoaT09PTF8fG5bcysxXT09PTApKXtjPXM7YnJlYWt9cmV0dXJuIEFlW29dLmRlY29kZShuLnN1YmFycmF5KDAsYykpfWZ1bmN0aW9uIEdlKHQsZSxyLG8sbil7bGV0IGk9bmV3IFVpbnQ4QXJyYXkodC5idWZmZXIsdC5ieXRlT2Zmc2V0K2Uscik7aS5maWxsKDApO2xldCBzPXItKG89PT0idXRmLTE2bGUiPzI6MSk7aWYoczw9MClyZXR1cm47bGV0IHA9UmVbb10uZW5jb2RlKFN0cmluZyhuPz8iIikpO2kuc2V0KHAuc3ViYXJyYXkoMCxNYXRoLm1pbihwLmxlbmd0aCxzKSkpfWZ1bmN0aW9uIExlKHQsZSxyLG8pe2xldCBuPW8uZWxlbWVudFNpemU+MD9yL28uZWxlbWVudFNpemU6MCxpPVtdO2ZvcihsZXQgYz0wO2M8bjtjKyspaS5wdXNoKFl0KHQsZStjKm8uZWxlbWVudFNpemUsby5lbGVtZW50VHlwZSxvLmVsZW1lbnRTaXplKSk7cmV0dXJuIGl9ZnVuY3Rpb24ga2UodCxlLHIsbyxuKXtsZXQgaT1vLmVsZW1lbnRTaXplPjA/ci9vLmVsZW1lbnRTaXplOjAsYz1uPz9bXTtmb3IobGV0IHM9MDtzPGk7cysrKVZ0KHQsZStzKm8uZWxlbWVudFNpemUsby5lbGVtZW50VHlwZSxvLmVsZW1lbnRTaXplLGNbc10pfWZ1bmN0aW9uIFl0KHQsZSxyLG8pe3N3aXRjaChyLnRhZyl7Y2FzZSJiYXNpYyI6cmV0dXJuIFYodCxlLHIua2luZCk7Y2FzZSJiaXRmaWVsZCI6cmV0dXJuIE1lKHQsZSxyKTtjYXNlInN0cmluZyI6cmV0dXJuIEJlKHQsZSxvLHIuZW5jb2RpbmcpO2Nhc2Uic3RydWN0IjpjYXNlInVuaW9uIjpyZXR1cm4gb3QodCxlLHIuZmllbGRzKTtjYXNlImFycmF5IjpyZXR1cm4gTGUodCxlLG8scil9fWZ1bmN0aW9uIFZ0KHQsZSxyLG8sbil7c3dpdGNoKHIudGFnKXtjYXNlImJhc2ljIjpkdCh0LGUse2s6ci5raW5kLHY6bn0pO2JyZWFrO2Nhc2UiYml0ZmllbGQiOk9lKHQsZSxyLG4/PzApO2JyZWFrO2Nhc2Uic3RyaW5nIjpHZSh0LGUsbyxyLmVuY29kaW5nLG4pO2JyZWFrO2Nhc2Uic3RydWN0IjpjYXNlInVuaW9uIjp2dCh0LGUsci5maWVsZHMsbj8/e30pO2JyZWFrO2Nhc2UiYXJyYXkiOmtlKHQsZSxvLHIsbik7YnJlYWt9fWZ1bmN0aW9uIG90KHQsZSxyKXtsZXQgbz17fTtmb3IobGV0IG4gb2Ygcil7bGV0IGk9WXQodCxlK24ub2Zmc2V0LG4udHlwZSxuLnNpemUpO2lmKG4ubm9ubnVsbCYmaT09PTApdGhyb3cgbmV3IEVycm9yKGBmZmktc3RydWN0OiBkZWNvZGU6ICchJyBmaWVsZCAiJHtuLm5hbWV9IiBnb3QgMCAoQyBkaWQgbm90IGZpbGwgaXQsIG9yIGRlY29kZSB3YXMgY2FsbGVkIG9uIGFuIHVuZmlsbGVkIHNsb3QpYCk7b1tuLm5hbWVdPWl9cmV0dXJuIG99ZnVuY3Rpb24gdnQodCxlLHIsbyl7Zm9yKGxldCBuIG9mIHIpb1tuLm5hbWVdIT09dm9pZCAwJiZWdCh0LGUrbi5vZmZzZXQsbi50eXBlLG4uc2l6ZSxvW24ubmFtZV0pfWZ1bmN0aW9uIFVlKHQpe2xldHtmaWVsZHM6ZSxzaXplOnIsbWF4RWZmZWN0aXZlQWxpZ246b309aHQodCk7cmV0dXJue19fc3RydWN0OnQsc2l6ZTpyLHN0cnVjdEFsaWduOm8sZGVjb2RlOm49Pm90KHR5cGVvZiBuPT0ibnVtYmVyIj9uZXcgRGF0YVZpZXcod3QucmVhZEJ5dGVzKG4scikpOm5ldyBEYXRhVmlldyhuKSwwLGUpLGFsbG9jOihuPT57aWYobiE9PXZvaWQgMCYmKCFOdW1iZXIuaXNJbnRlZ2VyKG4pfHxuPDEpKXRocm93IG5ldyBFcnJvcigiZmZpLXN0cnVjdDogYWxsb2MobikgcmVxdWlyZXMgYW4gaW50ZWdlciBuID49IDEgKFBBQigwKSBuZXZlciBlc2NhcGVzIFx1MjAxNCBwYXNzIE5VTEwgZm9yIGFuIGVtcHR5IHBvaW50ZXIgcG9zaXRpb24pIik7cmV0dXJuIG5ldyBiKHIqKG4/PzEpKX0pLGVuY29kZTooKG4saSxjKT0+e2lmKG49PW51bGwpdGhyb3cgbmV3IEVycm9yKCJmZmktc3RydWN0OiBlbmNvZGUodikgcmVxdWlyZXMgYW4gYXJndW1lbnQ7IHVzZSBhbGxvYygpIGZvciBhIHplcm9lZCBvdXQtcGFyYW0gc2xvdCIpO2xldCBzPWk/P25ldyBiKHIpO3JldHVybiB2dChuZXcgRGF0YVZpZXcocyksYz8/MCxlLG4pLHN9KSxvZmZzZXRPZjpuPT57Zm9yKGxldCBpIG9mIGUpaWYoaS5uYW1lPT09bilyZXR1cm4gaS5vZmZzZXQ7dGhyb3cgbmV3IEVycm9yKGBmZmktc3RydWN0OiBubyBmaWVsZCAiJHtufSJgKX19fWZ1bmN0aW9uIF9lKHQsZSxyKXtsZXQgbz17IiMiOnR9O3IhPT12b2lkIDAmJihvWyIjcGFjayJdPXIpO2ZvcihsZXRbbixpXW9mIE9iamVjdC5lbnRyaWVzKGUpKW4uc3RhcnRzV2l0aCgiIyIpfHwob1tuXT1pKTtyZXR1cm4gb31mdW5jdGlvbiBqdCh0KXtsZXR7ZmllbGRzOmUsc2l6ZTpyfT1odCh0Ll9fc3RydWN0KSxvPShuLGkpPT57bGV0IGM9W107Zm9yKGxldCBzPTA7czxpO3MrKyljLnB1c2gob3QobixzKnIsZSkpO3JldHVybiBjfTtyZXR1cm57ZW5jb2RlOm49PntpZighQXJyYXkuaXNBcnJheShuKXx8bi5sZW5ndGg9PT0wKXRocm93IG5ldyBFcnJvcigiZmZpLXN0cnVjdDogc3RydWN0QXJyYXkoZGVmKS5lbmNvZGUoZWxzKSByZXF1aXJlcyBhIG5vbi1lbXB0eSBlbGVtZW50IGFycmF5IChwYXNzIE5VTEwgZm9yIGFuIGVtcHR5IHBvaW50ZXIgcG9zaXRpb24pIik7bGV0IGk9dC5hbGxvYyhuLmxlbmd0aCk7Zm9yKGxldCBjPTA7YzxuLmxlbmd0aDtjKyspdC5lbmNvZGUobltjXSxpLGMqdC5zaXplKTtyZXR1cm4gaX0sZGVjb2RlOigobixpKT0+e2lmKGkhPT12b2lkIDAmJighTnVtYmVyLmlzSW50ZWdlcihpKXx8aTwwKSl0aHJvdyBuZXcgRXJyb3IoYGZmaS1zdHJ1Y3Q6IHN0cnVjdEFycmF5LmRlY29kZShwLCBjb3VudCkgcmVxdWlyZXMgYSBub24tbmVnYXRpdmUgaW50ZWdlciBjb3VudCwgZ290ICR7aX1gKTtpZih0eXBlb2Ygbj09Im51bWJlciIpe2lmKGk9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKCJmZmktc3RydWN0OiBzdHJ1Y3RBcnJheS5kZWNvZGUoYWRkcmVzcywgY291bnQpIHJlcXVpcmVzIGFuIGV4cGxpY2l0IGNvdW50IChhIGJhcmUgYWRkcmVzcyBjYXJyaWVzIG5vIGxlbmd0aCkiKTtyZXR1cm4gaT09PTA/W106byhuZXcgRGF0YVZpZXcod3QucmVhZEJ5dGVzKG4saSpyKSksaSl9bGV0IGM7aWYoaSE9PXZvaWQgMCl7aWYoYz1pLGMqcj5uLmJ5dGVMZW5ndGgpdGhyb3cgbmV3IEVycm9yKGBmZmktc3RydWN0OiBzdHJ1Y3RBcnJheS5kZWNvZGU6IGNvdW50ICR7Y30gXHhENyBzaXplICR7cn0gPSAke2Mqcn0gZXhjZWVkcyBidWZmZXIgYnl0ZUxlbmd0aCAke24uYnl0ZUxlbmd0aH1gKX1lbHNle2lmKG4uYnl0ZUxlbmd0aCVyIT09MCl0aHJvdyBuZXcgRXJyb3IoYGZmaS1zdHJ1Y3Q6IHN0cnVjdEFycmF5LmRlY29kZTogYnl0ZUxlbmd0aCAke24uYnl0ZUxlbmd0aH0gaXMgbm90IGEgbXVsdGlwbGUgb2Ygc2l6ZSAke3J9IChtaXhlZCBidWZmZXI/IHBhc3MgY291bnQgZXhwbGljaXRseSlgKTtjPW4uYnl0ZUxlbmd0aC9yfXJldHVybiBjPT09MD9bXTpvKG5ldyBEYXRhVmlldyhuKSxjKX0pfX1mdW5jdGlvbiBnKHQsZSxyKXtsZXQgbz10eXBlb2YgdD09InN0cmluZyI7cmV0dXJuIFVlKF9lKCJzdHJ1Y3QiLG8/ZTp0LChvP3I6ZSk/LnBhY2spKX12YXIgUD1nKCJSRUNUIix7bGVmdDoiaTMyIix0b3A6ImkzMiIscmlnaHQ6ImkzMiIsYm90dG9tOiJpMzIifSksaj1nKCJQT0lOVCIse3g6ImkzMiIseToiaTMyIn0pO3ZhciBudD1nKCJTVEFSVFVQSU5GT1ciLHtjYjoidTMyIixscFJlc2VydmVkOiI8PnB0ciIsbHBEZXNrdG9wOiI8PnB0ciIsbHBUaXRsZToiPD5wdHIiLGR3WDoidTMyIixkd1k6InUzMiIsZHdYU2l6ZToidTMyIixkd1lTaXplOiJ1MzIiLGR3WENvdW50Q2hhcnM6InUzMiIsZHdZQ291bnRDaGFyczoidTMyIixkd0ZpbGxBdHRyaWJ1dGU6InUzMiIsZHdGbGFnczoidTMyIix3U2hvd1dpbmRvdzoidTE2QFNob3dXaW5kb3dDbWQiLGNiUmVzZXJ2ZWQyOiJ1MTYiLGxwUmVzZXJ2ZWQyOiI8PnB0ciIsaFN0ZElucHV0OiI8SEZJTEU+cHRyIixoU3RkT3V0cHV0OiI8SEZJTEU+cHRyIixoU3RkRXJyb3I6IjxIRklMRT5wdHIifSksQ3Q9ZygiUFJPQ0VTU19JTkZPUk1BVElPTiIse2hQcm9jZXNzOiI8SFBST0NFU1M+cHRyISIsaFRocmVhZDoiPEhUSFJFQUQ+cHRyISIsZHdQcm9jZXNzSWQ6InUzMiIsZHdUaHJlYWRJZDoidTMyIn0pLEo9ZygiQklUTUFQSU5GT0hFQURFUiIse2JpU2l6ZToidTMyIixiaVdpZHRoOiJpMzIiLGJpSGVpZ2h0OiJpMzIiLGJpUGxhbmVzOiJ1MTYiLGJpQml0Q291bnQ6InUxNiIsYmlDb21wcmVzc2lvbjoidTMyIixiaVNpemVJbWFnZToidTMyIixiaVhQZWxzUGVyTWV0ZXI6ImkzMiIsYmlZUGVsc1Blck1ldGVyOiJpMzIiLGJpQ2xyVXNlZDoidTMyIixiaUNsckltcG9ydGFudDoidTMyIn0pLGl0PWcoIkJJVE1BUEZJTEVIRUFERVIiLHtiZlR5cGU6InUxNiIsYmZTaXplOiJ1MzIiLGJmUmVzZXJ2ZWQxOiJ1MTYiLGJmUmVzZXJ2ZWQyOiJ1MTYiLGJmT2ZmQml0czoidTMyIn0se3BhY2s6Mn0pO3ZhciBaPWcoIk5NSERSIix7aHduZEZyb206IjxIV05EPnB0ciIsaWRGcm9tOiI8PnB0ciIsY29kZToiaTMyIn0pLHplPWcoIlNZU1RFTVRJTUUiLHt3WWVhcjoidTE2Iix3TW9udGg6InUxNiIsd0RheU9mV2VlazoidTE2Iix3RGF5OiJ1MTYiLHdIb3VyOiJ1MTYiLHdNaW51dGU6InUxNiIsd1NlY29uZDoidTE2Iix3TWlsbGlzZWNvbmRzOiJ1MTYifSksbXI9ZygiTk1EQVRFVElNRUNIQU5HRSIse2hkcjpaLl9fc3RydWN0LGR3RmxhZ3M6InUzMiIsc3Q6emUuX19zdHJ1Y3R9KSwkZT1nKCJMSVRFTSIse21hc2s6InUzMiIsaUxpbms6ImkzMiIsc3RhdGU6InUzMiIsc3RhdGVNYXNrOiJ1MzIiLHN6SUQ6InUxNls0OF1AdXRmLTE2bGUiLHN6VXJsOiJ1MTZbMjA4NF1AdXRmLTE2bGUifSksd3I9ZygiTk1MSU5LIix7aGRyOlouX19zdHJ1Y3QsaXRlbTokZS5fX3N0cnVjdH0pLGhyPWcoIk5NQ1VTVE9NRFJBVyIse2hkcjpaLl9fc3RydWN0LGR3RHJhd1N0YWdlOiJ1MzIiLGhkYzoiPEhEQz5wdHIiLHJjOiJpMzJbNF0iLGR3SXRlbVNwZWM6Ijw+cHRyIix1SXRlbVN0YXRlOiJ1MzIiLGxJdGVtbFBhcmFtOiI8PnB0ciJ9KSxDcj1nKCJOTUxWQ1VTVE9NRFJBVyIse2hkcjpaLl9fc3RydWN0LGR3RHJhd1N0YWdlOiJ1MzIiLGhkYzoiPEhEQz5wdHIiLHJjOiJpMzJbNF0iLGR3SXRlbVNwZWM6Ijw+cHRyIix1SXRlbVN0YXRlOiJ1MzIiLGxJdGVtbFBhcmFtOiI8PnB0ciIsY2xyVGV4dDoidTMyIixjbHJUZXh0Qms6InUzMiIsaVN1Ykl0ZW06ImkzMiIsZHdJdGVtVHlwZToidTMyIn0pLFNyPWcoIk5NTElTVFZJRVciLHtoZHI6Wi5fX3N0cnVjdCxpSXRlbToiaTMyIixpU3ViSXRlbToiaTMyIix1TmV3U3RhdGU6InUzMiIsdU9sZFN0YXRlOiJ1MzIiLHVDaGFuZ2VkOiJ1MzIiLHB0QWN0aW9uOiJpMzJbMl0iLGxQYXJhbToiPD5wdHIifSk7dmFyIFllPWcoIlRWSVRFTSIse21hc2s6InUzMiIsaEl0ZW06Ijw+cHRyIixzdGF0ZToidTMyIixzdGF0ZU1hc2s6InUzMiIscHN6VGV4dDoiPD5wdHIiLGNjaFRleHRNYXg6ImkzMiIsaUltYWdlOiJpMzIiLGlTZWxlY3RlZEltYWdlOiJpMzIiLGNDaGlsZHJlbjoiaTMyIixsUGFyYW06Ijw+cHRyIn0pLGdyPWcoIlRWSU5TRVJUU1RSVUNUIix7aFBhcmVudDoiPD5wdHIiLGhJbnNlcnRBZnRlcjoiPD5wdHIiLGl0ZW06WWUuX19zdHJ1Y3R9KTt2YXIgVmU9ZygiTVNHIix7aHduZDoiPEhXTkQ+cHRyIixtZXNzYWdlOiJ1MzIiLHdQYXJhbToiPD5wdHIiLGxQYXJhbToiPD5wdHIiLHRpbWU6InUzMiIscHQ6ai5fX3N0cnVjdH0pLERyPWcoIlBBSU5UU1RSVUNUIix7aGRjOiI8SERDPnB0ciIsZkVyYXNlOiJpMzIiLHJjUGFpbnQ6UC5fX3N0cnVjdCxmUmVzdG9yZToiaTMyIixmSW5jVXBkYXRlOiJpMzIiLHJnYlJlc2VydmVkOiJ1OFszMl0ifSk7dmFyIHN0PWcoIk9TVkVSU0lPTklORk9fMTQ4Iix7ZHdPU1ZlcnNpb25JbmZvU2l6ZToidTMyIixkd01ham9yVmVyc2lvbjoidTMyIixkd01pbm9yVmVyc2lvbjoidTMyIixkd0J1aWxkTnVtYmVyOiJ1MzIiLGR3UGxhdGZvcm1JZDoidTMyIixzekNTRFZlcnNpb246InU4WzEyOF0ifSk7dmFyIE89KHQsZSxyKT0+Rygia2VybmVsMzIuZGxsIix0LGUsciksSnQ9TygiQ3JlYXRlUGlwZSIsIjw+cHRyIDw+cHRyIDw+cHRyIHUzMiAtPiBpMzIiKSxTdD1PKCJTZXRIYW5kbGVJbmZvcm1hdGlvbiIsIjxIRklMRT5wdHIhIHUzMiB1MzIgLT4gaTMyIiksS3Q9TygiQ3JlYXRlUHJvY2Vzc1ciLCI8V0NIQVI+cHRyIDxXQ0hBUj5wdHIgPD5wdHIgPD5wdHIgaTMyIHUzMiA8PnB0ciA8V0NIQVI+cHRyIDxTVEFSVFVQSU5GT1c+cHRyIDxQUk9DRVNTX0lORk9STUFUSU9OPnB0ciAtPiBpMzIiLHtTVEFSVFVQSU5GT1c6bnR9KSxYdD1PKCJXYWl0Rm9yU2luZ2xlT2JqZWN0IiwiPD5wdHIgdTMyIC0+IHUzMiIpLFp0PU8oIkdldEV4aXRDb2RlUHJvY2VzcyIsIjxIUFJPQ0VTUz5wdHIhIDxCWVRFPnB0ciAtPiBpMzIiKSxVPU8oIkNsb3NlSGFuZGxlIiwiPD5wdHIgLT4gaTMyIik7dmFyIHF0PU8oIlJlYWRGaWxlIiwiPEhGSUxFPnB0ciEgPEJZVEU+cHRyIHUzMiA8QllURT5wdHIgPD5wdHIgLT4gaTMyIik7dmFyIGd0PU8oIkdldExhc3RFcnJvciIsIiAtPiB1MzIiKSxRdD1PKCJHZXRTeXN0ZW1EaXJlY3RvcnlXIiwiPEJZVEU+cHRyIHUzMiAtPiB1MzIiKTtpbXBvcnQqYXMgdGUgZnJvbSJvcyI7dmFyIE49KHQsZSxyKT0+RygidXNlcjMyLmRsbCIsdCxlLHIpLEhyPU4oIkdldERlc2t0b3BXaW5kb3ciLCIgLT4gPEhXTkQ+cHRyIiksZWU9dGUuYXJjaD09PSJ4NjQiPyJQdHJXIjoiVyI7dmFyIER0PU4oIkdldFdpbmRvd1JlY3QiLCI8SFdORD5wdHIgPFJFQ1Q+cHRyIC0+IGkzMiIpLHJlPU4oIkdldENsaWVudFJlY3QiLCI8SFdORD5wdHIgPFJFQ1Q+cHRyIC0+IGkzMiIpO3ZhciBvZT1OKCJJc1dpbmRvd1Zpc2libGUiLCI8SFdORD5wdHIgLT4gaTMyIiksRXQ9TigiSXNJY29uaWMiLCI8SFdORD5wdHIgLT4gaTMyIik7dmFyIG5lPU4oIkdldFdpbmRvd1RleHRXIiwiPEhXTkQ+cHRyIDxCWVRFPnB0ciBpMzIgLT4gaTMyIik7dmFyIGllPU4oIkdldENsYXNzTmFtZVciLCI8SFdORD5wdHIgPEJZVEU+cHRyIGkzMiAtPiBpMzIiKSxQcj1OKCJHZXRXaW5kb3dMb25nIitlZSwiPEhXTkQ+cHRyIGkzMkBHd2xwIC0+IDw+cHRyIiksTXI9TigiU2V0V2luZG93TG9uZyIrZWUsIjxIV05EPnB0ciBpMzJAR3dscCA8PnB0ciAtPiA8PnB0ciIpO3ZhciBzZT1OKCJHZXREQyIsIjxIV05EPnB0ciAtPiA8SERDPnB0ciIpLFd0PU4oIlJlbGVhc2VEQyIsIjxIV05EPnB0ciA8SERDPnB0ciEgLT4gaTMyIiksY2U9TigiUHJpbnRXaW5kb3ciLCI8SFdORD5wdHIgPEhEQz5wdHIhIHUzMiAtPiBpMzIiKTt2YXIgcGU9TigiQ2xpZW50VG9TY3JlZW4iLCI8SFdORD5wdHIgPFBPSU5UPnB0ciAtPiBpMzIiKTt2YXIgXz1OKCJHZXRTeXN0ZW1NZXRyaWNzIiwiaTMyIC0+IGkzMiIpO3ZhciBhZT1OKCJFbnVtV2luZG93cyIsIjw+cHRyIDw+cHRyIC0+IGkzMiIpO3ZhciB6PSh0LGUscik9PkcoImdkaTMyLmRsbCIsdCxlLHIpLExyPWp0KGopO3ZhciBUdD16KCJEZWxldGVPYmplY3QiLCI8SEdESU9CSj5wdHIgLT4gaTMyIik7dmFyIGJ0PXooIkNyZWF0ZUNvbXBhdGlibGVEQyIsIjxIREM+cHRyIC0+IDxIREM+cHRyIiksTnQ9eigiQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcCIsIjxIREM+cHRyISBpMzIgaTMyIC0+IDxIR0RJT0JKPnB0ciIpO3ZhciBxPXooIlNlbGVjdE9iamVjdCIsIjxIREM+cHRyISA8SEdESU9CSj5wdHIgLT4gPEhHRElPQko+cHRyIiksSXQ9eigiQml0Qmx0IiwiPEhEQz5wdHIhIGkzMiBpMzIgaTMyIGkzMiA8SERDPnB0ciBpMzIgaTMyIHUzMkBSYXN0ZXJPcCAtPiBpMzIiKSx1ZT16KCJHZXRESUJpdHMiLCI8SERDPnB0ciEgPEhHRElPQko+cHRyIHUzMiB1MzIgPEJZVEU+cHRyIDw+cHRyIHUzMiAtPiBpMzIiKTt2YXIgUT16KCJEZWxldGVEQyIsIjxIREM+cHRyISAtPiBpMzIiKTt2YXIgdmU9KHQsZSk9PkcoIm50ZGxsLmRsbCIsdCxlKSxsZT12ZSgiUnRsR2V0VmVyc2lvbiIsIjxPU1ZFUlNJT05JTkZPXzE0OD5wdHIgLT4gaTMyIik7dmFyIG1lPXQ9Pnt0cnl7bGV0IGU9eGUub3BlbigiZGlhZy5sb2ciLCJhIik7ZSYmKGUucHV0cyhgJHtEYXRlLm5vdygpfSAke3R9CmApLGUuY2xvc2UoKSl9Y2F0Y2h7fX0seXQ9MSxqZT0yNTYsSmU9NDI5NDk2NzI5NSxGPWZlLldvcmtlci5wYXJlbnQsd2U9IkM6XFxXaW5kb3dzXFxTeXN0ZW0zMiI7dHJ5e2xldCB0PUIuYWxsb2MoMjU2KSxyPVF0KHQsMjU2KT4wP0IuZGVjb2RlKHQpOiIiO3ImJih3ZT1yKX1jYXRjaCh0KXttZSgiU1lTLURJUi1GQUlMOiAiK1N0cmluZyh0KSl9dmFyIGhlPSExO3RyeXtsZXQgdD1zdC5lbmNvZGUoe2R3T1NWZXJzaW9uSW5mb1NpemU6c3Quc2l6ZX0pO2xlKHQucHRyKT09PTAmJihoZT1zdC5kZWNvZGUodCkuZHdNYWpvclZlcnNpb24+PTEwKX1jYXRjaCh0KXttZSgiVkVSLUZBSUw6ICIrU3RyaW5nKHQpKX12YXIgRnQ9ZygiUElQRV9IQU5ETEVTIix7aFJlYWQ6IjxIRklMRT5wdHIhIixoV3JpdGU6IjxIRklMRT5wdHIhIn0pO2Z1bmN0aW9uIEtlKHQsZSl7bGV0IHI9RnQuYWxsb2MoKTtpZighSnQoci5wdHIsci5wdHIrRnQub2Zmc2V0T2YoImhXcml0ZSIpLEksMCkpdGhyb3cgbmV3IEVycm9yKCJDcmVhdGVQaXBlIGVycj0iK2d0KCkpO2xldHtoUmVhZDpvLGhXcml0ZTpufT1GdC5kZWNvZGUocik7U3Qobix5dCx5dCksU3Qobyx5dCwwKTtsZXQgaT1DdC5hbGxvYygpLHM9YCR7d2V9XFxjbWQuZXhlICR7aGU/Ii91ICI6IiJ9L2MgJHtlfWA7aWYoIUt0KEkscyxJLEksMSwwLEksSSx7Y2I6bnQuc2l6ZSxkd0ZsYWdzOmplLGhTdGRPdXRwdXQ6bixoU3RkRXJyb3I6bn0saS5wdHIpKXRocm93IFUobyksVShuKSxuZXcgRXJyb3IoIkNyZWF0ZVByb2Nlc3NXIGVycj0iK2d0KCkrIiBjbWQ9IitzKTtsZXR7aFByb2Nlc3M6cCxoVGhyZWFkOmEsZHdQcm9jZXNzSWQ6dX09Q3QuZGVjb2RlKGkpO1UoYSksVShuKSxGLnBvc3RNZXNzYWdlKHt0eXBlOiJpbmZvIixpZDp0LHBpZDp1fSk7bGV0IHg9bmV3IGIoNDA5NiksZD1uZXcgVWludDhBcnJheSh4KSx3PW5ldyBiKDQpLGY9bmV3IFVpbnQzMkFycmF5KHcpO2Zvcig7ZlswXT0wLCEhcXQobyx4LDQwOTYsdyxJKTspe2xldCBsPWZbMF07aWYobD09PTApYnJlYWs7Ri5wb3N0TWVzc2FnZSh7dHlwZToiZGF0YSIsaWQ6dCxjaHVuazpkLnNsaWNlKDAsbCl9KX1YdChwLEplKTtsZXQgUz1uZXcgYig0KSxtPW5ldyBJbnQzMkFycmF5KFMpO1p0KHAsUyk7bGV0IFc9bVswXTtyZXR1cm4gVShvKSxVKHApLFd9dmFyIENlPTEzMzY5Mzc2LFhlPTAsZGU9NjU1MzYsWmU9NGU3LGN0PTUxMixxZT0yZTQsSHQ9aXQuc2l6ZStKLnNpemU7ZnVuY3Rpb24gUWUodCxlLHIpe2xldCBvPWl0LmVuY29kZSh7YmZUeXBlOjE5Nzc4LGJmU2l6ZTpIdCt0LGJmT2ZmQml0czpIdH0pLG49Si5lbmNvZGUoe2JpU2l6ZTpKLnNpemUsYmlXaWR0aDplLGJpSGVpZ2h0Oi1yLGJpUGxhbmVzOjEsYmlCaXRDb3VudDozMixiaUNvbXByZXNzaW9uOjAsYmlTaXplSW1hZ2U6dCxiaVhQZWxzUGVyTWV0ZXI6MjgzNSxiaVlQZWxzUGVyTWV0ZXI6MjgzNX0pLGk9bmV3IFVpbnQ4QXJyYXkoSHQpO3JldHVybiBpLnNldChuZXcgVWludDhBcnJheShvKSwwKSxpLnNldChuZXcgVWludDhBcnJheShuKSxpdC5zaXplKSxpfWZ1bmN0aW9uIHRyKHQsZSxyLG8sbil7bGV0IGk9bmV3IGIobypuKjQpLGM9bmV3IFVpbnQ4QXJyYXkoaSkscz1KLmVuY29kZSh7YmlTaXplOkouc2l6ZSxiaVdpZHRoOm8sYmlIZWlnaHQ6LW4sYmlQbGFuZXM6MSxiaUJpdENvdW50OjMyLGJpU2l6ZUltYWdlOm8qbio0fSk7aWYodWUoZSxyLDAsbixpLHMucHRyLFhlKSE9PW4pcmV0dXJuITE7bGV0IGE9Yy5ieXRlTGVuZ3RoO0YucG9zdE1lc3NhZ2Uoe3R5cGU6ImRhdGEiLGlkOnQsY2h1bms6UWUoYSxvLG4pfSk7Zm9yKGxldCB1PTA7dTxhO3UrPWRlKUYucG9zdE1lc3NhZ2Uoe3R5cGU6ImRhdGEiLGlkOnQsY2h1bms6Yy5zbGljZSh1LE1hdGgubWluKHUrZGUsYSkpfSk7cmV0dXJuITB9ZnVuY3Rpb24gZXIodCxlLHIsbyxuLGksYyxzLHApe2xldCBhPWJ0KHQpLHU9YT9OdCh0LHIsbyk6MDtpZighYXx8IXUpcmV0dXJuIGEmJlEoYSksITE7bGV0IHg9cShhLHUpLHc9Y2UoZSxhLDApIT09MCYmSXQobiwwLDAscyxwLGEsaSxjLENlKSE9PTA7cmV0dXJuIHEoYSx4KSxUdCh1KSxRKGEpLHd9ZnVuY3Rpb24gU2UodCxlLHIsbyxuLGksYyxzLHAsYSl7aWYoIShzPjAmJnA+MCYmcypwPD1aZSkpdGhyb3cgbmV3IEVycm9yKCJjYXB0dXJlIHNpemUgaW52YWxpZCB3PSIrcysiIGg9IitwKTtpZihhIT09bnVsbCYmIShpPj0wJiZjPj0wJiZpK3M8PWUmJmMrcDw9cikpdGhyb3cgbmV3IEVycm9yKCJjYXB0dXJlIGNyb3Agb3V0IG9mIHJhbmdlIGNyb3A9KCIraSsiLCIrYysiLCIrcysieCIrcCsiKSBmcmFtZT0iK2UrIngiK3IpO2xldCB1PXNlKEkpO2lmKCF1KXRocm93IG5ldyBFcnJvcigiR2V0REMoTlVMTCk9MFx1RkYxQVx1NjVFMFx1OEY5M1x1NTE2NVx1Njg0Q1x1OTc2Mlx1RkYwOFx1Nzg2RVx1OEJBNFx1NTcyOFx1NEVBNFx1NEU5MiBzZXNzaW9uIFx1NTQyRlx1NTJBOFx1RkYwQ1x1ODAwQ1x1OTc1RSBzc2hkL3NlcnZpY2VcdUZGMDkiKTtsZXQgeD1idCh1KSxkPXg/TnQodSxzLHApOjA7aWYoIXh8fCFkKXRocm93IHgmJlEoeCksV3QoSSx1KSxuZXcgRXJyb3IoIkNyZWF0ZUNvbXBhdGlibGVEQy9CaXRtYXAgZmFpbGVkIik7bGV0IHc9cSh4LGQpLGY9YT09PW51bGw/SXQoeCwwLDAscyxwLHUsbyxuLENlKSE9PTA6ZXIodSxhLGUscix4LGksYyxzLHApO3EoeCx3KTtsZXQgUz1mJiZ0cih0LHgsZCxzLHApO2lmKFR0KGQpLFEoeCksV3QoSSx1KSwhZil0aHJvdyBuZXcgRXJyb3IoImNhcHR1cmUgZmFpbGVkIG91dD0iK3MrIngiK3ArKGE9PT1udWxsPyIgYXQ9KCIrbysiLCIrbisiKSI6IiBod25kPSIrYSsiIGNyb3A9KCIraSsiLCIrYysiKSBmcmFtZT0iK2UrIngiK3IpKTtpZighUyl0aHJvdyBuZXcgRXJyb3IoIkdldERJQml0cyBzaG9ydCByZWFkIG91dD0iK3MrIngiK3ApO3JldHVybnt3aWR0aDpzLGhlaWdodDpwfX1mdW5jdGlvbiBycih0KXtsZXQgZT1fKDApLHI9XygxKTtpZihlPD0wfHxyPD0wKXRocm93IG5ldyBFcnJvcigiR2V0U3lzdGVtTWV0cmljcyB3PSIrZSsiIGg9IityKTtyZXR1cm4gU2UodCxlLHIsMCwwLDAsMCxlLHIsbnVsbCl9ZnVuY3Rpb24gb3IodCxlLHIsbyl7aWYobz09PSJzY3JlZW4iJiZFdChlKSE9PTApdGhyb3cgbmV3IEVycm9yKCJ3aW5kb3cgbWluaW1pemVkXHVGRjFBbW9kZT1zY3JlZW4gXHU1M0VBXHU0RjFBXHU2MjJBXHU1MjMwXHU1QjgzXHU0RTBCXHU2NUI5XHU3Njg0XHU2ODRDXHU5NzYyXHVGRjBDXHU2NTM5XHU3NTI4IG1vZGU9cHJpbnQiKTtsZXQgbj1QLmFsbG9jKCk7aWYoIUR0KGUsbi5wdHIpKXRocm93IG5ldyBFcnJvcigiR2V0V2luZG93UmVjdChod25kPSIrZSsiKT0wXHVGRjFBXHU3QTk3XHU1M0UzXHU0RTBEXHU1QjU4XHU1NzI4XHU2MjE2XHU1REYyXHU5NTAwXHU2QkMxIik7bGV0e2xlZnQ6aSx0b3A6YyxyaWdodDpzLGJvdHRvbTpwfT1QLmRlY29kZShuKSxhPXMtaSx1PXAtYyx4PTAsZD0wLHc9YSxmPXU7aWYocj09PSJjbGllbnQiKXtsZXQgVz1QLmFsbG9jKCk7aWYoIXJlKGUsVy5wdHIpKXRocm93IG5ldyBFcnJvcigiR2V0Q2xpZW50UmVjdChod25kPSIrZSsiKT0wIik7bGV0e2xlZnQ6bCx0b3A6RCxyaWdodDpFLGJvdHRvbTpDfT1QLmRlY29kZShXKTt3PUUtbCxmPUMtRDtsZXQgaD1qLmVuY29kZSh7eDowLHk6MH0pO2lmKCFwZShlLGgucHRyKSl0aHJvdyBuZXcgRXJyb3IoIkNsaWVudFRvU2NyZWVuKGh3bmQ9IitlKyIpPTAiKTtsZXQgVD1qLmRlY29kZShoKTt4PVQueC1pLGQ9VC55LWN9bGV0IFM9bz09PSJwcmludCI/MDppK3gsbT1vPT09InByaW50Ij8wOmMrZDtpZihvPT09InNjcmVlbiIpe2xldCBXPV8oNzYpLGw9Xyg3NyksRD1fKDc4KSxFPV8oNzkpLEM9TWF0aC5tYXgoUyxXKSxoPU1hdGgubWF4KG0sbCksVD1NYXRoLm1pbihTK3csVytEKSxIPU1hdGgubWluKG0rZixsK0UpO2lmKFQ8PUN8fEg8PWgpdGhyb3cgbmV3IEVycm9yKCJjYXB0dXJlIGFyZWEgb3V0c2lkZSB2aXJ0dWFsIHNjcmVlbiBhdD0oIitTKyIsIittKyIsIit3KyJ4IitmKyIpIik7Uz1DLG09aCx3PVQtQyxmPUgtaH1yZXR1cm4gU2UodCxhLHUsUyxtLHgsZCx3LGYsbz09PSJwcmludCI/ZTpudWxsKX1mdW5jdGlvbiBucih0KXtsZXQgZT1bXSxyPV90KCI8SFdORD5wdHIgPD5wdHIgLT4gaTMyIixzPT4ocyYmZS5wdXNoKHMpLGUubGVuZ3RoPHFlPzE6MCkpO3RyeXthZShyLnB0cixJKX1maW5hbGx5e3IuZGlzcG9zZSgpfWxldCBvPVAuYWxsb2MoKSxuPUIuYWxsb2MoY3QpLGk9Qi5hbGxvYyhjdCksYz1bXTtmb3IobGV0IHMgb2YgZSlpZihEdChzLG8ucHRyKSl7bGV0IHA9UC5kZWNvZGUobyksYT1uZShzLG4sY3QpLHU9aWUocyxpLGN0KTtjLnB1c2goe2h3bmQ6cyx0aXRsZTphPjA/Qi5kZWNvZGUobik6IiIsY2xhc3NOYW1lOnU+MD9CLmRlY29kZShpKToiIixyZWN0OntsZWZ0OnAubGVmdCx0b3A6cC50b3AscmlnaHQ6cC5yaWdodCxib3R0b206cC5ib3R0b219LHZpc2libGU6b2UocykhPT0wLG1pbmltaXplZDpFdChzKSE9PTB9KX1GLnBvc3RNZXNzYWdlKHt0eXBlOiJyZXN1bHQiLGlkOnQsY29kZTowLGVycm9yOm51bGwsd2luZG93czpjfSl9ZnVuY3Rpb24gaXIodCl7aWYodC50eXBlPT09InJ1biIpe2lmKHR5cGVvZiB0LmNtZCE9InN0cmluZyIpcmV0dXJuO2xldCBlPS0xLHI9bnVsbDt0cnl7ZT1LZSh0LmlkLHQuY21kKX1jYXRjaChvKXtyPVN0cmluZyhvKX1GLnBvc3RNZXNzYWdlKHt0eXBlOiJyZXN1bHQiLGlkOnQuaWQsY29kZTplLGVycm9yOnJ9KTtyZXR1cm59aWYodC50eXBlPT09IndpbmRvd3MiKXt0cnl7bnIodC5pZCl9Y2F0Y2goZSl7Ri5wb3N0TWVzc2FnZSh7dHlwZToicmVzdWx0IixpZDp0LmlkLGNvZGU6LTEsZXJyb3I6U3RyaW5nKGUpfSl9cmV0dXJufWlmKHQudHlwZT09PSJzY3JlZW5zaG90Iil0cnl7bGV0IGU9dC5od25kPz9udWxsLHt3aWR0aDpyLGhlaWdodDpvfT1lPT09bnVsbD9ycih0LmlkKTpvcih0LmlkLGUsdC5hcmVhPz8id2luZG93Iix0Lm1vZGU/PyJzY3JlZW4iKTtGLnBvc3RNZXNzYWdlKHt0eXBlOiJyZXN1bHQiLGlkOnQuaWQsY29kZTowLGVycm9yOm51bGwsd2lkdGg6cixoZWlnaHQ6b30pfWNhdGNoKGUpe0YucG9zdE1lc3NhZ2Uoe3R5cGU6InJlc3VsdCIsaWQ6dC5pZCxjb2RlOi0xLGVycm9yOlN0cmluZyhlKX0pfX1GLm9ubWVzc2FnZT10PT57aXIodC5kYXRhKSxGLm9ubWVzc2FnZT1udWxsfTsK");
|
|
21931
22039
|
bumpWorkers(1);
|
|
21932
22040
|
const id = 1;
|
|
21933
22041
|
let settled = false;
|