@monaco-neovim-wasm/lib 0.1.15 → 0.1.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,137 +1,137 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as b from "monaco-editor";
|
|
2
2
|
class ie {
|
|
3
3
|
buffer;
|
|
4
4
|
ctrl;
|
|
5
5
|
data;
|
|
6
6
|
capacity;
|
|
7
|
-
constructor(t =
|
|
7
|
+
constructor(t = O) {
|
|
8
8
|
this.capacity = Math.max(8 * 1024, t | 0), this.buffer = new SharedArrayBuffer(8 + this.capacity), this.ctrl = new Int32Array(this.buffer, 0, 2), this.data = new Uint8Array(this.buffer, 8), Atomics.store(this.ctrl, 0, 0), Atomics.store(this.ctrl, 1, 0);
|
|
9
9
|
}
|
|
10
10
|
push(t) {
|
|
11
11
|
let e;
|
|
12
12
|
if (t instanceof Uint8Array ? e = t : t instanceof ArrayBuffer || t instanceof SharedArrayBuffer ? e = new Uint8Array(t) : e = new Uint8Array(t), !e.byteLength) return !0;
|
|
13
|
-
const i = Atomics.load(this.ctrl, 0), s = Atomics.load(this.ctrl, 1), n = s >= i ? s - i : this.capacity - (i - s),
|
|
14
|
-
if (e.byteLength >
|
|
15
|
-
const
|
|
16
|
-
return e.byteLength <=
|
|
13
|
+
const i = Atomics.load(this.ctrl, 0), s = Atomics.load(this.ctrl, 1), n = s >= i ? s - i : this.capacity - (i - s), r = this.capacity - n - 1;
|
|
14
|
+
if (e.byteLength > r) return !1;
|
|
15
|
+
const l = this.capacity - s;
|
|
16
|
+
return e.byteLength <= l ? (this.data.set(e, s), Atomics.store(this.ctrl, 1, (s + e.byteLength) % this.capacity)) : (this.data.set(e.subarray(0, l), s), this.data.set(e.subarray(l), 0), Atomics.store(this.ctrl, 1, e.byteLength - l)), Atomics.notify(this.ctrl, 1), !0;
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
|
-
const
|
|
20
|
-
function ne(
|
|
21
|
-
return new ie(
|
|
19
|
+
const O = 262144;
|
|
20
|
+
function ne(o = O) {
|
|
21
|
+
return new ie(o);
|
|
22
22
|
}
|
|
23
|
-
function U(
|
|
23
|
+
function U(o) {
|
|
24
24
|
const t = [];
|
|
25
|
-
return
|
|
25
|
+
return K(o, t), new Uint8Array(t);
|
|
26
26
|
}
|
|
27
|
-
function
|
|
28
|
-
if (
|
|
27
|
+
function K(o, t) {
|
|
28
|
+
if (o == null) {
|
|
29
29
|
t.push(192);
|
|
30
30
|
return;
|
|
31
31
|
}
|
|
32
|
-
if (typeof
|
|
33
|
-
t.push(
|
|
32
|
+
if (typeof o == "boolean") {
|
|
33
|
+
t.push(o ? 195 : 194);
|
|
34
34
|
return;
|
|
35
35
|
}
|
|
36
|
-
if (typeof
|
|
37
|
-
se(
|
|
36
|
+
if (typeof o == "number") {
|
|
37
|
+
se(o, t);
|
|
38
38
|
return;
|
|
39
39
|
}
|
|
40
|
-
if (typeof
|
|
41
|
-
|
|
40
|
+
if (typeof o == "string") {
|
|
41
|
+
re(o, t);
|
|
42
42
|
return;
|
|
43
43
|
}
|
|
44
|
-
if (typeof
|
|
45
|
-
|
|
44
|
+
if (typeof o == "bigint") {
|
|
45
|
+
G(o, t);
|
|
46
46
|
return;
|
|
47
47
|
}
|
|
48
|
-
if (Array.isArray(
|
|
49
|
-
|
|
48
|
+
if (Array.isArray(o)) {
|
|
49
|
+
le(o, t);
|
|
50
50
|
return;
|
|
51
51
|
}
|
|
52
|
-
if (
|
|
53
|
-
|
|
52
|
+
if (o instanceof Uint8Array) {
|
|
53
|
+
oe(o, t);
|
|
54
54
|
return;
|
|
55
55
|
}
|
|
56
|
-
if (
|
|
57
|
-
|
|
56
|
+
if (ue(o)) {
|
|
57
|
+
ce(o, t);
|
|
58
58
|
return;
|
|
59
59
|
}
|
|
60
|
-
if (typeof
|
|
61
|
-
|
|
60
|
+
if (typeof o == "object") {
|
|
61
|
+
ae(o, t);
|
|
62
62
|
return;
|
|
63
63
|
}
|
|
64
64
|
throw new Error("Unsupported type in msgpack encode");
|
|
65
65
|
}
|
|
66
|
-
function se(
|
|
67
|
-
if (!Number.isFinite(
|
|
68
|
-
if (Number.isInteger(
|
|
69
|
-
if (
|
|
70
|
-
t.push(
|
|
66
|
+
function se(o, t) {
|
|
67
|
+
if (!Number.isFinite(o)) throw new Error("Cannot encode non-finite number");
|
|
68
|
+
if (Number.isInteger(o)) {
|
|
69
|
+
if (o >= 0 && o <= 127) {
|
|
70
|
+
t.push(o);
|
|
71
71
|
return;
|
|
72
72
|
}
|
|
73
|
-
if (
|
|
74
|
-
t.push(224 |
|
|
73
|
+
if (o < 0 && o >= -32) {
|
|
74
|
+
t.push(224 | o + 32);
|
|
75
75
|
return;
|
|
76
76
|
}
|
|
77
|
-
if (
|
|
78
|
-
t.push(208,
|
|
77
|
+
if (o >= -128 && o <= 127) {
|
|
78
|
+
t.push(208, o + 256 & 255);
|
|
79
79
|
return;
|
|
80
80
|
}
|
|
81
|
-
if (
|
|
82
|
-
t.push(209,
|
|
81
|
+
if (o >= -32768 && o <= 32767) {
|
|
82
|
+
t.push(209, o >> 8 & 255, o & 255);
|
|
83
83
|
return;
|
|
84
84
|
}
|
|
85
|
-
if (
|
|
86
|
-
t.push(210,
|
|
85
|
+
if (o >= -2147483648 && o <= 2147483647) {
|
|
86
|
+
t.push(210, o >> 24 & 255, o >> 16 & 255, o >> 8 & 255, o & 255);
|
|
87
87
|
return;
|
|
88
88
|
}
|
|
89
|
-
|
|
89
|
+
G(BigInt(o), t);
|
|
90
90
|
return;
|
|
91
91
|
}
|
|
92
92
|
const e = new ArrayBuffer(8);
|
|
93
|
-
new DataView(e).setFloat64(0,
|
|
93
|
+
new DataView(e).setFloat64(0, o), t.push(203, ...new Uint8Array(e));
|
|
94
94
|
}
|
|
95
|
-
function
|
|
95
|
+
function G(o, t) {
|
|
96
96
|
const e = new ArrayBuffer(8);
|
|
97
|
-
new DataView(e).setBigInt64(0, BigInt(
|
|
97
|
+
new DataView(e).setBigInt64(0, BigInt(o)), t.push(211, ...new Uint8Array(e));
|
|
98
98
|
}
|
|
99
|
-
function
|
|
100
|
-
const i = new TextEncoder().encode(
|
|
99
|
+
function re(o, t) {
|
|
100
|
+
const i = new TextEncoder().encode(o), s = i.length;
|
|
101
101
|
s <= 31 ? t.push(160 | s) : s <= 255 ? t.push(217, s) : s <= 65535 ? t.push(218, s >> 8 & 255, s & 255) : t.push(219, s >> 24 & 255, s >> 16 & 255, s >> 8 & 255, s & 255), t.push(...i);
|
|
102
102
|
}
|
|
103
|
-
function
|
|
104
|
-
const e =
|
|
105
|
-
e <= 255 ? t.push(196, e) : e <= 65535 ? t.push(197, e >> 8 & 255, e & 255) : t.push(198, e >> 24 & 255, e >> 16 & 255, e >> 8 & 255, e & 255), t.push(...
|
|
103
|
+
function oe(o, t) {
|
|
104
|
+
const e = o.length;
|
|
105
|
+
e <= 255 ? t.push(196, e) : e <= 65535 ? t.push(197, e >> 8 & 255, e & 255) : t.push(198, e >> 24 & 255, e >> 16 & 255, e >> 8 & 255, e & 255), t.push(...o);
|
|
106
106
|
}
|
|
107
|
-
function
|
|
108
|
-
const e =
|
|
107
|
+
function le(o, t) {
|
|
108
|
+
const e = o.length;
|
|
109
109
|
e <= 15 ? t.push(144 | e) : e <= 65535 ? t.push(220, e >> 8 & 255, e & 255) : t.push(221, e >> 24 & 255, e >> 16 & 255, e >> 8 & 255, e & 255);
|
|
110
|
-
for (const i of
|
|
111
|
-
|
|
110
|
+
for (const i of o)
|
|
111
|
+
K(i, t);
|
|
112
112
|
}
|
|
113
|
-
function
|
|
114
|
-
const e = Object.keys(
|
|
113
|
+
function ae(o, t) {
|
|
114
|
+
const e = Object.keys(o), i = e.length;
|
|
115
115
|
i <= 15 ? t.push(128 | i) : i <= 65535 ? t.push(222, i >> 8 & 255, i & 255) : t.push(223, i >> 24 & 255, i >> 16 & 255, i >> 8 & 255, i & 255);
|
|
116
116
|
for (const s of e)
|
|
117
|
-
|
|
117
|
+
K(s, t), K(o[s], t);
|
|
118
118
|
}
|
|
119
|
-
function
|
|
120
|
-
const e =
|
|
121
|
-
e === 1 ? t.push(212,
|
|
119
|
+
function ce(o, t) {
|
|
120
|
+
const e = o.data.length;
|
|
121
|
+
e === 1 ? t.push(212, o.type) : e === 2 ? t.push(213, o.type) : e === 4 ? t.push(214, o.type) : e === 8 ? t.push(215, o.type) : e === 16 ? t.push(216, o.type) : t.push(199, e, o.type);
|
|
122
122
|
for (let i = 0; i < e; i += 1)
|
|
123
|
-
t.push(
|
|
123
|
+
t.push(o.data[i]);
|
|
124
124
|
}
|
|
125
|
-
function
|
|
126
|
-
return !!(
|
|
125
|
+
function ue(o) {
|
|
126
|
+
return !!(o && typeof o == "object" && typeof o.type == "number" && o.data instanceof Uint8Array);
|
|
127
127
|
}
|
|
128
|
-
function
|
|
128
|
+
function he() {
|
|
129
129
|
return typeof SharedArrayBuffer < "u" && typeof crossOriginIsolated < "u" && crossOriginIsolated;
|
|
130
130
|
}
|
|
131
|
-
function
|
|
132
|
-
return
|
|
131
|
+
function de(o) {
|
|
132
|
+
return o.byteOffset === 0 && o.byteLength === o.buffer.byteLength ? o : o.slice();
|
|
133
133
|
}
|
|
134
|
-
class
|
|
134
|
+
class fe {
|
|
135
135
|
init;
|
|
136
136
|
worker = null;
|
|
137
137
|
sharedInput = null;
|
|
@@ -150,7 +150,7 @@ class he {
|
|
|
150
150
|
worker: t.worker ?? null,
|
|
151
151
|
workerUrl: t.workerUrl ?? null,
|
|
152
152
|
createWorker: t.createWorker ?? null,
|
|
153
|
-
sharedInputBytes: t.sharedInputBytes ??
|
|
153
|
+
sharedInputBytes: t.sharedInputBytes ?? O,
|
|
154
154
|
inputMode: t.inputMode ?? "shared",
|
|
155
155
|
rpcTimeoutMs: t.rpcTimeoutMs ?? 8e3,
|
|
156
156
|
maxQueuedBytes: t.maxQueuedBytes ?? 4 * 1024 * 1024,
|
|
@@ -168,45 +168,45 @@ class he {
|
|
|
168
168
|
return this.workerExitCode;
|
|
169
169
|
}
|
|
170
170
|
async start(t) {
|
|
171
|
-
const { cols: e, rows: i, wasmPath: s, runtimePath: n, env:
|
|
172
|
-
if (this.inputMode = t.inputMode ?? this.init.inputMode, this.inputMode === "shared" && !
|
|
171
|
+
const { cols: e, rows: i, wasmPath: s, runtimePath: n, env: r, files: l } = t;
|
|
172
|
+
if (this.inputMode = t.inputMode ?? this.init.inputMode, this.inputMode === "shared" && !he())
|
|
173
173
|
throw new Error('SharedArrayBuffer is required for inputMode="shared"; serve with COOP/COEP so crossOriginIsolated is true, or use inputMode="message" with the asyncify worker.');
|
|
174
|
-
const
|
|
175
|
-
if (this.stop({ terminate: !this.init.reuseWorker, silent: !0 }), this.sharedInput = this.inputMode === "shared" ? ne(this.init.sharedInputBytes) : null, this.workerExited = !1, this.workerExitCode = null, this.workerFatalError = null, this.reqId = 1, this.pending.clear(), this.init.worker ? this.worker = this.init.worker : this.init.createWorker ? this.worker = this.init.createWorker() : this.init.reuseWorker &&
|
|
176
|
-
this.worker.onmessage = (
|
|
177
|
-
const
|
|
174
|
+
const c = this.worker;
|
|
175
|
+
if (this.stop({ terminate: !this.init.reuseWorker, silent: !0 }), this.sharedInput = this.inputMode === "shared" ? ne(this.init.sharedInputBytes) : null, this.workerExited = !1, this.workerExitCode = null, this.workerFatalError = null, this.reqId = 1, this.pending.clear(), this.init.worker ? this.worker = this.init.worker : this.init.createWorker ? this.worker = this.init.createWorker() : this.init.reuseWorker && c ? this.worker = c : this.worker = this.init.workerUrl ? new Worker(this.init.workerUrl, { type: "module" }) : null, !this.worker) throw new Error("worker/workerUrl is required");
|
|
176
|
+
this.worker.onmessage = (f) => this.handleWorkerMessage(f.data);
|
|
177
|
+
const u = (f) => {
|
|
178
178
|
if (!this.workerExited) {
|
|
179
|
-
if (this.workerFatalError =
|
|
180
|
-
const
|
|
181
|
-
this.pending.forEach((m) => m.reject(
|
|
179
|
+
if (this.workerFatalError = f, this.workerExited = !0, this.workerExitCode = 1, this.pending.size) {
|
|
180
|
+
const p = new Error(f);
|
|
181
|
+
this.pending.forEach((m) => m.reject(p)), this.pending.clear();
|
|
182
182
|
}
|
|
183
183
|
try {
|
|
184
|
-
this.init.handlers.onStartError?.(
|
|
184
|
+
this.init.handlers.onStartError?.(f);
|
|
185
185
|
} catch {
|
|
186
186
|
}
|
|
187
187
|
}
|
|
188
188
|
};
|
|
189
|
-
this.worker.onerror = (
|
|
190
|
-
const
|
|
191
|
-
|
|
192
|
-
${m}` :
|
|
189
|
+
this.worker.onerror = (f) => {
|
|
190
|
+
const p = f?.message ? `worker error: ${f.message}` : "worker error", m = f?.error?.stack;
|
|
191
|
+
u(m ? `${p}
|
|
192
|
+
${m}` : p);
|
|
193
193
|
}, this.worker.onmessageerror = () => {
|
|
194
|
-
|
|
194
|
+
u("worker messageerror");
|
|
195
195
|
};
|
|
196
|
-
const
|
|
196
|
+
const d = {
|
|
197
197
|
type: "start",
|
|
198
198
|
cols: Number(e) || 80,
|
|
199
199
|
rows: Number(i) || 24,
|
|
200
200
|
wasmPath: String(s ?? ""),
|
|
201
201
|
runtimePath: String(n ?? ""),
|
|
202
202
|
inputBuffer: this.sharedInput?.buffer ?? null,
|
|
203
|
-
env:
|
|
204
|
-
files:
|
|
203
|
+
env: r ?? void 0,
|
|
204
|
+
files: l ?? void 0
|
|
205
205
|
};
|
|
206
206
|
try {
|
|
207
|
-
this.worker.postMessage(
|
|
207
|
+
this.worker.postMessage(d, []);
|
|
208
208
|
} catch {
|
|
209
|
-
this.worker.postMessage(
|
|
209
|
+
this.worker.postMessage(d);
|
|
210
210
|
}
|
|
211
211
|
}
|
|
212
212
|
stop(t = {}) {
|
|
@@ -241,14 +241,14 @@ ${m}` : u);
|
|
|
241
241
|
return;
|
|
242
242
|
}
|
|
243
243
|
if (this.workerExited) {
|
|
244
|
-
const
|
|
245
|
-
s(new Error(
|
|
244
|
+
const l = this.workerExitCode, c = this.workerFatalError ? `: ${this.workerFatalError}` : "";
|
|
245
|
+
s(new Error(l != null ? `nvim exited (${l})${c}` : `nvim exited${c}`));
|
|
246
246
|
return;
|
|
247
247
|
}
|
|
248
248
|
const n = this.reqId++;
|
|
249
249
|
this.pending.set(n, { resolve: i, reject: s, ts: Date.now(), method: t });
|
|
250
|
-
const
|
|
251
|
-
this.postInput(
|
|
250
|
+
const r = U([0, n, t, e]);
|
|
251
|
+
this.postInput(r), setTimeout(() => {
|
|
252
252
|
this.pending.has(n) && (this.pending.delete(n), s(new Error(this.workerExited ? this.workerExitCode != null ? `nvim exited (${this.workerExitCode})${this.workerFatalError ? `: ${this.workerFatalError}` : ""}` : `nvim exited${this.workerFatalError ? `: ${this.workerFatalError}` : ""}` : `rpc timeout: ${t}`)));
|
|
253
253
|
}, this.init.rpcTimeoutMs);
|
|
254
254
|
});
|
|
@@ -265,8 +265,8 @@ ${m}` : u);
|
|
|
265
265
|
return;
|
|
266
266
|
} catch {
|
|
267
267
|
if (this.workerExited) {
|
|
268
|
-
const n = this.workerExitCode,
|
|
269
|
-
throw new Error(n != null ? `nvim exited (${n})${
|
|
268
|
+
const n = this.workerExitCode, r = this.workerFatalError ? `: ${this.workerFatalError}` : "";
|
|
269
|
+
throw new Error(n != null ? `nvim exited (${n})${r}` : `nvim exited${r}`);
|
|
270
270
|
}
|
|
271
271
|
await new Promise((n) => setTimeout(n, 300));
|
|
272
272
|
}
|
|
@@ -281,9 +281,9 @@ ${m}` : u);
|
|
|
281
281
|
handleWorkerMessage(t) {
|
|
282
282
|
const e = t?.type;
|
|
283
283
|
if (e === "rpc-response") {
|
|
284
|
-
const { msgid: i, error: s, result: n } = t,
|
|
285
|
-
if (!
|
|
286
|
-
this.pending.delete(i), s ?
|
|
284
|
+
const { msgid: i, error: s, result: n } = t, r = this.pending.get(i);
|
|
285
|
+
if (!r) return;
|
|
286
|
+
this.pending.delete(i), s ? r.reject(new Error(String(s))) : r.resolve(n);
|
|
287
287
|
return;
|
|
288
288
|
}
|
|
289
289
|
if (e === "rpc-notify") {
|
|
@@ -337,8 +337,8 @@ ${m}` : u);
|
|
|
337
337
|
if (e === "exit") {
|
|
338
338
|
const i = t, s = i.code, n = i.lastStderr;
|
|
339
339
|
if (this.workerExited = !0, this.workerExitCode = s, this.pending.size) {
|
|
340
|
-
const
|
|
341
|
-
this.pending.forEach((
|
|
340
|
+
const r = n ? `: ${n.trim()}` : "", l = new Error(`nvim exited (${s})${r}`);
|
|
341
|
+
this.pending.forEach((c) => c.reject(l)), this.pending.clear();
|
|
342
342
|
}
|
|
343
343
|
try {
|
|
344
344
|
this.init.handlers.onExit?.(s, n);
|
|
@@ -348,7 +348,7 @@ ${m}` : u);
|
|
|
348
348
|
}
|
|
349
349
|
postInput(t) {
|
|
350
350
|
if (!t || !t.buffer) return;
|
|
351
|
-
const e =
|
|
351
|
+
const e = de(t);
|
|
352
352
|
if (!(!this.worker || this.workerExited)) {
|
|
353
353
|
if (this.inputMode === "shared") {
|
|
354
354
|
if (!this.sharedInput || this.inputQueueHead >= this.inputQueue.length && this.sharedInput.push(e))
|
|
@@ -388,19 +388,19 @@ ${m}` : u);
|
|
|
388
388
|
}
|
|
389
389
|
} else {
|
|
390
390
|
let e = 0, i = 0;
|
|
391
|
-
for (let
|
|
392
|
-
const
|
|
393
|
-
if (
|
|
394
|
-
if (i > 0 && e +
|
|
395
|
-
e +=
|
|
391
|
+
for (let r = this.inputQueueHead; r < this.inputQueue.length; r += 1) {
|
|
392
|
+
const l = this.inputQueue[r];
|
|
393
|
+
if (l?.byteLength) {
|
|
394
|
+
if (i > 0 && e + l.byteLength > 262144) break;
|
|
395
|
+
e += l.byteLength, i += 1;
|
|
396
396
|
}
|
|
397
397
|
}
|
|
398
398
|
if (i <= 0 || e <= 0) return;
|
|
399
399
|
const s = new Uint8Array(e);
|
|
400
400
|
let n = 0;
|
|
401
|
-
for (let
|
|
402
|
-
const
|
|
403
|
-
s.set(
|
|
401
|
+
for (let r = 0; r < i; r += 1) {
|
|
402
|
+
const l = this.inputQueue[this.inputQueueHead + r];
|
|
403
|
+
s.set(l, n), n += l.byteLength;
|
|
404
404
|
}
|
|
405
405
|
this.inputQueueHead += i, this.inputQueuedBytes -= e, this.postStdin(s);
|
|
406
406
|
}
|
|
@@ -418,7 +418,7 @@ ${m}` : u);
|
|
|
418
418
|
}
|
|
419
419
|
}
|
|
420
420
|
}
|
|
421
|
-
const
|
|
421
|
+
const pe = `if !exists('g:monaco_neovim_wasm_chan')
|
|
422
422
|
finish
|
|
423
423
|
endif
|
|
424
424
|
|
|
@@ -582,7 +582,7 @@ onoremap <silent> <C-f> <Cmd>call <SID>scroll('down', 'page')<CR>
|
|
|
582
582
|
nnoremap <silent> <C-b> <Cmd>call <SID>scroll('up', 'page')<CR>
|
|
583
583
|
xnoremap <silent> <C-b> <Cmd>call <SID>scroll('up', 'page')<CR>
|
|
584
584
|
onoremap <silent> <C-b> <Cmd>call <SID>scroll('up', 'page')<CR>
|
|
585
|
-
`,
|
|
585
|
+
`, ge = `if !exists('g:monaco_neovim_wasm_chan')
|
|
586
586
|
finish
|
|
587
587
|
endif
|
|
588
588
|
|
|
@@ -633,7 +633,7 @@ cnoreabbrev <expr> q <SID>abbr('q', 'MonacoQuit')
|
|
|
633
633
|
cnoreabbrev <expr> quit <SID>abbr('quit', 'MonacoQuit')
|
|
634
634
|
cnoreabbrev <expr> wq <SID>abbr('wq', 'MonacoWq')
|
|
635
635
|
cnoreabbrev <expr> x <SID>abbr('x', 'MonacoWq')
|
|
636
|
-
`,
|
|
636
|
+
`, ye = [
|
|
637
637
|
"-- Monaco + Neovim (WASM)",
|
|
638
638
|
"-- Click into the editor, press i, and start typing.",
|
|
639
639
|
"",
|
|
@@ -643,20 +643,20 @@ cnoreabbrev <expr> x <SID>abbr('x', 'MonacoWq')
|
|
|
643
643
|
"",
|
|
644
644
|
"print(greet('monaco'))"
|
|
645
645
|
];
|
|
646
|
-
function
|
|
646
|
+
function H(o) {
|
|
647
647
|
try {
|
|
648
648
|
if (typeof document > "u") return !1;
|
|
649
649
|
const t = document.body;
|
|
650
650
|
if (!t) return !1;
|
|
651
651
|
const e = document.createElement("textarea");
|
|
652
|
-
e.value = String(
|
|
652
|
+
e.value = String(o ?? ""), e.setAttribute("readonly", ""), e.style.position = "fixed", e.style.left = "0", e.style.top = "0", e.style.width = "1px", e.style.height = "1px", e.style.opacity = "0", e.style.pointerEvents = "none", t.appendChild(e), e.focus(), e.select(), e.setSelectionRange(0, e.value.length);
|
|
653
653
|
const i = !!document.execCommand?.("copy");
|
|
654
654
|
return t.removeChild(e), i;
|
|
655
655
|
} catch {
|
|
656
656
|
return !1;
|
|
657
657
|
}
|
|
658
658
|
}
|
|
659
|
-
const
|
|
659
|
+
const ve = `
|
|
660
660
|
local api, fn = vim.api, vim.fn
|
|
661
661
|
|
|
662
662
|
-- virtcol2col() returns a column (1-indexed) for the given virtual column.
|
|
@@ -801,7 +801,7 @@ end
|
|
|
801
801
|
|
|
802
802
|
local tail = (api.nvim_get_mode().mode or ""):sub(-1)
|
|
803
803
|
return { tail = tail, ranges = get_selections(...) }
|
|
804
|
-
`,
|
|
804
|
+
`, be = `
|
|
805
805
|
local api, fn = vim.api, vim.fn
|
|
806
806
|
|
|
807
807
|
local function get_visible_range(s, e)
|
|
@@ -890,7 +890,7 @@ end
|
|
|
890
890
|
|
|
891
891
|
return run(...)
|
|
892
892
|
`;
|
|
893
|
-
class
|
|
893
|
+
class _e {
|
|
894
894
|
editor;
|
|
895
895
|
opts;
|
|
896
896
|
session = null;
|
|
@@ -1033,7 +1033,7 @@ class fe {
|
|
|
1033
1033
|
const e = String(t ?? "");
|
|
1034
1034
|
if (!e) return;
|
|
1035
1035
|
const i = typeof performance < "u" && performance.now ? performance.now() : Date.now();
|
|
1036
|
-
e.length > 1 && e === this.lastImeCommitText && i - this.lastImeCommitAt < 60 || (this.lastImeCommitText = e, this.lastImeCommitAt = i, this.sendInput(
|
|
1036
|
+
e.length > 1 && e === this.lastImeCommitText && i - this.lastImeCommitAt < 60 || (this.lastImeCommitText = e, this.lastImeCommitAt = i, this.sendInput(z(e, !0)));
|
|
1037
1037
|
}
|
|
1038
1038
|
armIgnoreNextInputEvent(t, e = 80) {
|
|
1039
1039
|
this.ignoreNextInputEvent = !0, this.ignoreNextInputEventTarget = t ?? null;
|
|
@@ -1057,22 +1057,22 @@ class fe {
|
|
|
1057
1057
|
})(), s = (() => {
|
|
1058
1058
|
try {
|
|
1059
1059
|
if (typeof location > "u" || !location?.search) return !1;
|
|
1060
|
-
const
|
|
1061
|
-
return
|
|
1060
|
+
const l = new URLSearchParams(location.search);
|
|
1061
|
+
return l.has("monaco-neovim-wasm-debug") || l.has("mnw_debug");
|
|
1062
1062
|
} catch {
|
|
1063
1063
|
return !1;
|
|
1064
1064
|
}
|
|
1065
|
-
})(),
|
|
1065
|
+
})(), r = i || s ? !0 : !!e.debug;
|
|
1066
1066
|
this.opts = {
|
|
1067
1067
|
worker: e.worker ?? null,
|
|
1068
|
-
workerUrl: e.workerUrl ?? new URL("data:video/mp2t;base64,aW1wb3J0IHsKICBXQVNJLAogIHdhc2ksCiAgRGlyZWN0b3J5LAogIEZpbGUsCiAgUHJlb3BlbkRpcmVjdG9yeSwKICBGZCwKICBJbm9kZSwKfSBmcm9tICJAYmpvcm4zL2Jyb3dzZXJfd2FzaV9zaGltIjsKaW1wb3J0IHsgZ3VuemlwU3luYyB9IGZyb20gImZmbGF0ZSI7CmltcG9ydCB7IERlY29kZXIgfSBmcm9tICIuL21zZ3BhY2siOwp0eXBlIFN0YXJ0TWVzc2FnZSA9IHsKICB0eXBlOiAic3RhcnQiOwogIGNvbHM/OiBudW1iZXI7CiAgcm93cz86IG51bWJlcjsKICB3YXNtUGF0aDogc3RyaW5nOwogIHJ1bnRpbWVQYXRoOiBzdHJpbmc7CiAgaW5wdXRCdWZmZXI/OiBTaGFyZWRBcnJheUJ1ZmZlciB8IG51bGw7CiAgZW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IG51bGw7CiAgZmlsZXM/OiBBcnJheTx7IHBhdGg6IHN0cmluZzsgZGF0YTogVWludDhBcnJheSB8IEFycmF5QnVmZmVyIHwgQXJyYXlMaWtlPG51bWJlcj4gfCB7IHR5cGU6ICJCdWZmZXIiOyBkYXRhOiBudW1iZXJbXSB9IH0+IHwgbnVsbDsKfTsKCnR5cGUgU3RvcE1lc3NhZ2UgPSB7IHR5cGU6ICJzdG9wIiB9OwoKdHlwZSBJbmJvdW5kTWVzc2FnZSA9IFN0YXJ0TWVzc2FnZSB8IFN0b3BNZXNzYWdlOwoKdHlwZSBEaXJOb2RlID0gRGlyZWN0b3J5ICYgeyBjb250ZW50czogTWFwPHN0cmluZywgYW55PiB9OwoKbGV0IHJwY0RlY29kZXI6IERlY29kZXIgfCBudWxsID0gbnVsbDsKbGV0IGFjdGl2ZVdhc2k6IFdBU0kgfCBudWxsID0gbnVsbDsKbGV0IGlucHV0RmQ6IFJpbmdGZCB8IG51bGwgPSBudWxsOwpjb25zdCBzdGRlcnJEZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7CmxldCBsYXN0U3RkZXJyID0gIiI7CmxldCBmYXRhbFNlbnQgPSBmYWxzZTsKbGV0IGNhY2hlZFdhc206IHsgdXJsOiBzdHJpbmc7IGJ5dGVzOiBVaW50OEFycmF5IH0gfCBudWxsID0gbnVsbDsKbGV0IGNhY2hlZFJ1bnRpbWU6IHsgdXJsOiBzdHJpbmc7IGVudHJpZXM6IFRhckVudHJ5W10gfSB8IG51bGwgPSBudWxsOwoKc2VsZi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsIChldikgPT4gewogIGlmIChmYXRhbFNlbnQpIHJldHVybjsKICBmYXRhbFNlbnQgPSB0cnVlOwogIGNvbnN0IG1zZyA9IGV2Lm1lc3NhZ2UgfHwgU3RyaW5nKGV2LmVycm9yIHx8ICJ3b3JrZXIgZXJyb3IiKTsKICBjb25zdCBzdGFjayA9IChldi5lcnJvciBhcyB7IHN0YWNrPzogc3RyaW5nIH0pPy5zdGFjazsKICB0cnkgewogICAgcG9zdE1lc3NhZ2UoeyB0eXBlOiAic3RhcnQtZXJyb3IiLCBtZXNzYWdlOiBzdGFjayA/IGAke21zZ31cbiR7c3RhY2t9YCA6IG1zZyB9KTsKICAgIHBvc3RNZXNzYWdlKHsgdHlwZTogImV4aXQiLCBjb2RlOiAxLCBsYXN0U3RkZXJyIH0pOwogIH0gY2F0Y2ggKF8pIHsKICB9Cn0pOwoKc2VsZi5hZGRFdmVudExpc3RlbmVyKCJ1bmhhbmRsZWRyZWplY3Rpb24iLCAoZXYpID0+IHsKICBpZiAoZmF0YWxTZW50KSByZXR1cm47CiAgZmF0YWxTZW50ID0gdHJ1ZTsKICBjb25zdCByZWFzb24gPSBldi5yZWFzb247CiAgY29uc3QgbXNnID0gKHJlYXNvbiAmJiAocmVhc29uLm1lc3NhZ2UgfHwgU3RyaW5nKHJlYXNvbikpKSB8fCAidW5oYW5kbGVkIHJlamVjdGlvbiI7CiAgY29uc3Qgc3RhY2sgPSAocmVhc29uIGFzIHsgc3RhY2s/OiBzdHJpbmcgfSk/LnN0YWNrOwogIHRyeSB7CiAgICBwb3N0TWVzc2FnZSh7IHR5cGU6ICJzdGFydC1lcnJvciIsIG1lc3NhZ2U6IHN0YWNrID8gYCR7bXNnfVxuJHtzdGFja31gIDogbXNnIH0pOwogICAgcG9zdE1lc3NhZ2UoeyB0eXBlOiAiZXhpdCIsIGNvZGU6IDEsIGxhc3RTdGRlcnIgfSk7CiAgfSBjYXRjaCAoXykgewogIH0KfSk7CgpzZWxmLm9ubWVzc2FnZSA9IChldmVudDogTWVzc2FnZUV2ZW50PEluYm91bmRNZXNzYWdlPikgPT4gewogIGNvbnN0IHsgdHlwZSB9ID0gZXZlbnQuZGF0YSB8fCB7fTsKICBpZiAodHlwZSA9PT0gInN0YXJ0IikgewogICAgc3RhcnROdmltKGV2ZW50LmRhdGEgYXMgU3RhcnRNZXNzYWdlKS5jYXRjaCgoZXJyKSA9PiB7CiAgICAgIHBvc3RNZXNzYWdlKHsgdHlwZTogInN0YXJ0LWVycm9yIiwgbWVzc2FnZTogZXJyPy5tZXNzYWdlIHx8IFN0cmluZyhlcnIpIH0pOwogICAgICBwb3N0TWVzc2FnZSh7IHR5cGU6ICJleGl0IiwgY29kZTogMSB9KTsKICAgIH0pOwogIH0gZWxzZSBpZiAodHlwZSA9PT0gInN0b3AiKSB7CiAgICB0cnkgewogICAgICBhY3RpdmVXYXNpPy53YXNpSW1wb3J0Py5wcm9jX2V4aXQ/LigwKTsKICAgIH0gY2F0Y2ggKF8pIHsKICAgIH0KICAgIGlucHV0RmQgPSBudWxsOwogIH0KfTsKCmNsYXNzIFJpbmdGZCBleHRlbmRzIEZkIHsKICBwcml2YXRlIHJlYWRvbmx5IGN0cmw6IEludDMyQXJyYXk7CiAgcHJpdmF0ZSByZWFkb25seSBkYXRhOiBVaW50OEFycmF5OwogIHByaXZhdGUgcmVhZG9ubHkgY2FwYWNpdHk6IG51bWJlcjsKCiAgY29uc3RydWN0b3IoYnVmZmVyOiBTaGFyZWRBcnJheUJ1ZmZlcikgewogICAgc3VwZXIoKTsKICAgIHRoaXMuY3RybCA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMik7CiAgICB0aGlzLmRhdGEgPSBuZXcgVWludDhBcnJheShidWZmZXIsIDgpOwogICAgdGhpcy5jYXBhY2l0eSA9IHRoaXMuZGF0YS5sZW5ndGg7CiAgfQoKICBmZF9mZHN0YXRfZ2V0KCkgewogICAgY29uc3QgZmRzdGF0ID0gbmV3IHdhc2kuRmRzdGF0KHdhc2kuRklMRVRZUEVfUkVHVUxBUl9GSUxFLCAwKTsKICAgIGZkc3RhdC5mc19yaWdodHNfYmFzZSA9IEJpZ0ludCh3YXNpLlJJR0hUU19GRF9SRUFEIHwgd2FzaS5SSUdIVFNfRkRfV1JJVEUpOwogICAgcmV0dXJuIHsgcmV0OiB3YXNpLkVSUk5PX1NVQ0NFU1MsIGZkc3RhdCB9OwogIH0KCiAgZmRfY2xvc2UoKSB7IHJldHVybiB3YXNpLkVSUk5PX1NVQ0NFU1M7IH0KCiAgZmRfcmVhZChzaXplOiBudW1iZXIpIHsKICAgIGNvbnN0IG1heCA9IE1hdGgubWluKE1hdGgubWF4KDAsIE51bWJlcihzaXplKSB8fCAwKSwgdGhpcy5jYXBhY2l0eSk7CiAgICBpZiAobWF4ID09PSAwKSByZXR1cm4geyByZXQ6IHdhc2kuRVJSTk9fQUdBSU4sIGRhdGE6IG5ldyBVaW50OEFycmF5KCkgfTsKICAgIGxldCBoZWFkID0gQXRvbWljcy5sb2FkKHRoaXMuY3RybCwgMCk7CiAgICBjb25zdCB0YWlsID0gQXRvbWljcy5sb2FkKHRoaXMuY3RybCwgMSk7CiAgICBpZiAoaGVhZCA9PT0gdGFpbCkgcmV0dXJuIHsgcmV0OiB3YXNpLkVSUk5PX0FHQUlOLCBkYXRhOiBuZXcgVWludDhBcnJheSgpIH07CiAgICBjb25zdCBvdXQgPSBuZXcgVWludDhBcnJheShtYXgpOwogICAgbGV0IHdyaXR0ZW4gPSAwOwogICAgd2hpbGUgKGhlYWQgIT09IHRhaWwgJiYgd3JpdHRlbiA8IG1heCkgewogICAgICBvdXRbd3JpdHRlbisrXSA9IHRoaXMuZGF0YVtoZWFkXTsKICAgICAgaGVhZCA9IChoZWFkICsgMSkgJSB0aGlzLmNhcGFjaXR5OwogICAgfQogICAgQXRvbWljcy5zdG9yZSh0aGlzLmN0cmwsIDAsIGhlYWQpOwogICAgcmV0dXJuIHsgcmV0OiB3YXNpLkVSUk5PX1NVQ0NFU1MsIGRhdGE6IG91dC5zbGljZSgwLCB3cml0dGVuKSB9OwogIH0KCiAgZmRfd3JpdGUoKSB7IHJldHVybiB7IHJldDogd2FzaS5FUlJOT19CQURGLCBud3JpdHRlbjogMCB9OyB9CiAgZmRfc2VlaygpIHsgcmV0dXJuIHsgcmV0OiB3YXNpLkVSUk5PX0JBREYsIG9mZnNldDogMG4gfTsgfQogIGZkX3RlbGwoKSB7IHJldHVybiB7IHJldDogd2FzaS5FUlJOT19CQURGLCBvZmZzZXQ6IDBuIH07IH0KICBmZF9wcmVhZCgpIHsgcmV0dXJuIHsgcmV0OiB3YXNpLkVSUk5PX0JBREYsIGRhdGE6IG5ldyBVaW50OEFycmF5KCkgfTsgfQogIGZkX3B3cml0ZSgpIHsgcmV0dXJuIHsgcmV0OiB3YXNpLkVSUk5PX0JBREYsIG53cml0dGVuOiAwIH07IH0KfQoKY2xhc3MgU2lua0ZkIGV4dGVuZHMgRmQgewogIHByaXZhdGUgcmVhZG9ubHkgb25Xcml0ZTogKGRhdGE6IFVpbnQ4QXJyYXkpID0+IHZvaWQ7CgogIGNvbnN0cnVjdG9yKG9uV3JpdGU6IChkYXRhOiBVaW50OEFycmF5KSA9PiB2b2lkKSB7CiAgICBzdXBlcigpOwogICAgdGhpcy5vbldyaXRlID0gb25Xcml0ZTsKICB9CgogIGZkX2Zkc3RhdF9nZXQoKSB7CiAgICBjb25zdCBmZHN0YXQgPSBuZXcgd2FzaS5GZHN0YXQod2FzaS5GSUxFVFlQRV9SRUdVTEFSX0ZJTEUsIDApOwogICAgZmRzdGF0LmZzX3JpZ2h0c19iYXNlID0gQmlnSW50KHdhc2kuUklHSFRTX0ZEX1dSSVRFKTsKICAgIHJldHVybiB7IHJldDogd2FzaS5FUlJOT19TVUNDRVNTLCBmZHN0YXQgfTsKICB9CgogIGZkX3dyaXRlKGRhdGE6IFVpbnQ4QXJyYXkpIHsKICAgIHRoaXMub25Xcml0ZShuZXcgVWludDhBcnJheShkYXRhKSk7CiAgICByZXR1cm4geyByZXQ6IHdhc2kuRVJSTk9fU1VDQ0VTUywgbndyaXR0ZW46IGRhdGEuYnl0ZUxlbmd0aCB9OwogIH0KCiAgZmRfY2xvc2UoKSB7IHJldHVybiB3YXNpLkVSUk5PX1NVQ0NFU1M7IH0KfQoKYXN5bmMgZnVuY3Rpb24gc3RhcnROdmltKHsgY29scywgcm93cywgd2FzbVBhdGgsIHJ1bnRpbWVQYXRoLCBpbnB1dEJ1ZmZlciwgZW52OiBleHRyYUVudiwgZmlsZXMgfTogU3RhcnRNZXNzYWdlKSB7CiAgbGV0IGV4aXRDb2RlID0gMTsKICB0cnkgewogICAgaWYgKCFpbnB1dEJ1ZmZlcikgewogICAgICBwb3N0TWVzc2FnZSh7IHR5cGU6ICJzdGFydC1lcnJvciIsIG1lc3NhZ2U6ICJpbnB1dCBidWZmZXIgbWlzc2luZyIgfSk7CiAgICAgIHBvc3RNZXNzYWdlKHsgdHlwZTogImV4aXQiLCBjb2RlOiAxIH0pOwogICAgICByZXR1cm47CiAgICB9CgogICAgcnBjRGVjb2RlciA9IG51bGw7CiAgICBpbnB1dEZkID0gbmV3IFJpbmdGZChpbnB1dEJ1ZmZlcik7CgogICAgY29uc3Qgd2FzbUJ5dGVzID0gYXdhaXQgZ2V0Q2FjaGVkV2FzbUJ5dGVzKHdhc21QYXRoKTsKICAgIGNvbnN0IHVudGFycmVkID0gYXdhaXQgZ2V0Q2FjaGVkUnVudGltZUVudHJpZXMocnVudGltZVBhdGgpOwogICAgY29uc3QgZnNSb290ID0gYnVpbGRGcyh1bnRhcnJlZCwgKCkgPT4ge30pOwogICAgaWYgKGZpbGVzICYmIEFycmF5LmlzQXJyYXkoZmlsZXMpICYmIGZpbGVzLmxlbmd0aCkgYXBwbHlFeHRyYUZpbGVzKGZzUm9vdCwgZmlsZXMpOwoKICAgIGNvbnN0IHN0ZGluRmQgPSBpbnB1dEZkITsKICAgIGNvbnN0IHN0ZG91dEZkID0gbmV3IFNpbmtGZChoYW5kbGVTdGRvdXQpOwogICAgY29uc3Qgc3RkZXJyRmQgPSBuZXcgU2lua0ZkKChkYXRhKSA9PiB7CiAgICAgIGNvbnN0IG1zZyA9IHN0ZGVyckRlY29kZXIuZGVjb2RlKGRhdGEpOwogICAgICBpZiAobXNnKSB7CiAgICAgICAgbGFzdFN0ZGVyciA9IChsYXN0U3RkZXJyICsgbXNnKS5zbGljZSgtODE5Mik7CiAgICAgIH0KICAgICAgcG9zdE1lc3NhZ2UoeyB0eXBlOiAic3RkZXJyIiwgbWVzc2FnZTogbXNnIH0pOwogICAgfSk7CgogICAgY29uc3QgcHJlb3BlbiA9IG5ldyBSb290ZWRQcmVvcGVuRGlyZWN0b3J5KCJudmltIiwgZnNSb290LmNvbnRlbnRzKTsKICAgIGNvbnN0IHRtcERpciA9IGZzUm9vdC5jb250ZW50cy5nZXQoInRtcCIpIGFzIERpcmVjdG9yeSB8IHVuZGVmaW5lZDsKICAgIGNvbnN0IHRtcCA9IHRtcERpcj8uY29udGVudHMgfHwgbmV3IE1hcCgpOwogICAgY29uc3QgcHJlb3BlblRtcCA9IG5ldyBSb290ZWRQcmVvcGVuRGlyZWN0b3J5KCJ0bXAiLCB0bXApOwoKICAgIGNvbnN0IGFyZ3MgPSBbIm52aW0iLCAiLS1oZWFkbGVzcyIsICItLWVtYmVkIiwgIi11IiwgIk5PUkMiLCAiLS1ub3BsdWdpbiIsICItaSIsICJOT05FIiwgIi1uIl07CiAgICBjb25zdCBlbnYgPSBbCiAgICAgICJWSU1SVU5USU1FPS9udmltL3J1bnRpbWUiLAogICAgICAiSE9NRT0vbnZpbS9ob21lIiwKICAgICAgIlBXRD0vbnZpbSIsCiAgICAgICJYREdfQ09ORklHX0hPTUU9L252aW0vaG9tZS8uY29uZmlnIiwKICAgICAgIlhER19EQVRBX0hPTUU9L252aW0vaG9tZS8ubG9jYWwvc2hhcmUiLAogICAgICAiWERHX1NUQVRFX0hPTUU9L252aW0vaG9tZS8ubG9jYWwvc3RhdGUiLAogICAgICAiUEFUSD0vdXNyL2JpbjovYmluIiwKICAgICAgIlRNUERJUj0vbnZpbS90bXAiLAogICAgICBgQ09MVU1OUz0ke2NvbHMgfHwgMTIwfWAsCiAgICAgIGBMSU5FUz0ke3Jvd3MgfHwgNDB9YCwKICAgIF07CiAgICBpZiAoZXh0cmFFbnYgJiYgdHlwZW9mIGV4dHJhRW52ID09PSAib2JqZWN0IikgewogICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhleHRyYUVudikpIHsKICAgICAgICBpZiAoIWspIGNvbnRpbnVlOwogICAgICAgIGVudi5wdXNoKGAke2t9PSR7U3RyaW5nKHYgPz8gIiIpfWApOwogICAgICB9CiAgICB9CiAgICBhY3RpdmVXYXNpID0gbmV3IFdBU0koYXJncywgZW52LCBbc3RkaW5GZCwgc3Rkb3V0RmQsIHN0ZGVyckZkLCBwcmVvcGVuLCBwcmVvcGVuVG1wXSwgeyBkZWJ1ZzogZmFsc2UgfSk7CiAgICBhY3RpdmVXYXNpLmZkc1swXSA9IHN0ZGluRmQ7CiAgICBhY3RpdmVXYXNpLmZkc1sxXSA9IHN0ZG91dEZkOwogICAgYWN0aXZlV2FzaS5mZHNbMl0gPSBzdGRlcnJGZDsKICAgIGFjdGl2ZVdhc2kuZmRzWzNdID0gcHJlb3BlbjsKICAgIGFjdGl2ZVdhc2kuZmRzWzRdID0gcHJlb3BlblRtcDsKICAgIChhY3RpdmVXYXNpIGFzIHVua25vd24gYXMgeyBwcmVvcGVuczogUmVjb3JkPHN0cmluZywgUHJlb3BlbkRpcmVjdG9yeT4gfSkucHJlb3BlbnMgPSB7ICIvbnZpbSI6IHByZW9wZW4sICIvdG1wIjogcHJlb3BlblRtcCB9OwoKICAgIGNvbnN0IGVudkltcG9ydHMgPSBtYWtlRW52KCgpID0+IGFjdGl2ZVdhc2k/Lndhc2lJbXBvcnQ/LnByb2NfZXhpdD8uKDEpKTsKICAgIGNvbnN0IHdhc21JbnN0YW5jZSA9IGF3YWl0IFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKHdhc21CeXRlcywgewogICAgICB3YXNpX3NuYXBzaG90X3ByZXZpZXcxOiBhY3RpdmVXYXNpLndhc2lJbXBvcnQsCiAgICAgIGVudjogZW52SW1wb3J0cywKICAgIH0pOwogICAgY29uc3QgaW5zdGFuY2VTb3VyY2UgPSB3YXNtSW5zdGFuY2UgYXMgdW5rbm93biBhcyBXZWJBc3NlbWJseS5XZWJBc3NlbWJseUluc3RhbnRpYXRlZFNvdXJjZTsKICAgIGNvbnN0IGluc3RhbmNlID0gaW5zdGFuY2VTb3VyY2UuaW5zdGFuY2UKICAgICAgPz8gKHdhc21JbnN0YW5jZSBhcyB1bmtub3duIGFzIHsgaW5zdGFuY2U6IFdlYkFzc2VtYmx5Lkluc3RhbmNlIH0pLmluc3RhbmNlOwogICAgZXhpdENvZGUgPSBhY3RpdmVXYXNpLnN0YXJ0KGluc3RhbmNlIGFzIGFueSk7CiAgfSBjYXRjaCAoZXJyKSB7CiAgICBjb25zdCBtZXNzYWdlID0gKGVyciBhcyB7IG1lc3NhZ2U/OiBzdHJpbmcgfSk/Lm1lc3NhZ2UgfHwgU3RyaW5nKGVycik7CiAgICBjb25zdCBzdGFjayA9IChlcnIgYXMgeyBzdGFjaz86IHN0cmluZyB9KT8uc3RhY2s7CiAgICBwb3N0TWVzc2FnZSh7IHR5cGU6ICJzdGFydC1lcnJvciIsIG1lc3NhZ2U6IHN0YWNrID8gYCR7bWVzc2FnZX1cbiR7c3RhY2t9YCA6IG1lc3NhZ2UgfSk7CiAgfQoKICBwb3N0TWVzc2FnZSh7IHR5cGU6ICJleGl0IiwgY29kZTogZXhpdENvZGUsIGxhc3RTdGRlcnIgfSk7Cn0KCmFzeW5jIGZ1bmN0aW9uIGdldENhY2hlZFdhc21CeXRlcyh1cmw6IHN0cmluZyk6IFByb21pc2U8VWludDhBcnJheT4gewogIGlmIChjYWNoZWRXYXNtICYmIGNhY2hlZFdhc20udXJsID09PSB1cmwgJiYgY2FjaGVkV2FzbS5ieXRlcz8uYnl0ZUxlbmd0aCkgcmV0dXJuIGNhY2hlZFdhc20uYnl0ZXM7CiAgY29uc3QgYnl0ZXMgPSBhd2FpdCBmZXRjaEJ5dGVzKHVybCk7CiAgY2FjaGVkV2FzbSA9IHsgdXJsLCBieXRlcyB9OwogIHJldHVybiBieXRlczsKfQoKYXN5bmMgZnVuY3Rpb24gZ2V0Q2FjaGVkUnVudGltZUVudHJpZXModXJsOiBzdHJpbmcpOiBQcm9taXNlPFRhckVudHJ5W10+IHsKICBpZiAoY2FjaGVkUnVudGltZSAmJiBjYWNoZWRSdW50aW1lLnVybCA9PT0gdXJsICYmIGNhY2hlZFJ1bnRpbWUuZW50cmllcz8ubGVuZ3RoKSByZXR1cm4gY2FjaGVkUnVudGltZS5lbnRyaWVzOwogIGNvbnN0IGFyY2hpdmUgPSBhd2FpdCBmZXRjaEJ5dGVzKHVybCk7CiAgbGV0IHJ1bnRpbWVCeXRlczogVWludDhBcnJheTsKICBpZiAobG9va3NMaWtlR3ppcChhcmNoaXZlKSkgewogICAgdHJ5IHsKICAgICAgcnVudGltZUJ5dGVzID0gZ3VuemlwU3luYyhhcmNoaXZlKTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKGBndW56aXAgcnVudGltZSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpPy5tZXNzYWdlID8/IGV9YCk7CiAgICB9CiAgfSBlbHNlIHsKICAgIHJ1bnRpbWVCeXRlcyA9IGFyY2hpdmU7CiAgfQogIGxldCBlbnRyaWVzOiBUYXJFbnRyeVtdOwogIHRyeSB7CiAgICBlbnRyaWVzID0gdW50YXIocnVudGltZUJ5dGVzKTsKICB9IGNhdGNoIChlKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoYHVudGFyIHJ1bnRpbWUgZmFpbGVkOiAkeyhlIGFzIEVycm9yKT8ubWVzc2FnZSA/PyBlfWApOwogIH0KICBjYWNoZWRSdW50aW1lID0geyB1cmwsIGVudHJpZXMgfTsKICByZXR1cm4gZW50cmllczsKfQoKZnVuY3Rpb24gYXBwbHlFeHRyYUZpbGVzKGZzUm9vdDogRGlyTm9kZSwgZmlsZXM6IEFycmF5PHsgcGF0aDogc3RyaW5nOyBkYXRhOiBhbnkgfT4pIHsKICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHsKICAgIGNvbnN0IHJhd1BhdGggPSBTdHJpbmcoZmlsZT8ucGF0aCA/PyAiIik7CiAgICBjb25zdCBjbGVhbiA9IHJhd1BhdGgucmVwbGFjZSgvXlwvKy8sICIiKS5yZXBsYWNlKC9eXC5cLysvLCAiIik7CiAgICBpZiAoIWNsZWFuIHx8IGNsZWFuLmVuZHNXaXRoKCIvIikpIGNvbnRpbnVlOwogICAgY29uc3QgZGF0YSA9IHRvVTgoZmlsZT8uZGF0YSk7CiAgICBpZiAoIWRhdGEpIGNvbnRpbnVlOwogICAgY29uc3QgcGFydHMgPSBjbGVhbi5zcGxpdCgiLyIpLmZpbHRlcihCb29sZWFuKTsKICAgIGlmICghcGFydHMubGVuZ3RoKSBjb250aW51ZTsKICAgIGxldCBkaXI6IERpck5vZGUgPSBmc1Jvb3Q7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aCAtIDE7IGkgKz0gMSkgewogICAgICBjb25zdCBwYXJ0ID0gcGFydHNbaV07CiAgICAgIGlmICghZGlyLmNvbnRlbnRzLmhhcyhwYXJ0KSkgZGlyLmNvbnRlbnRzLnNldChwYXJ0LCBuZXcgRGlyZWN0b3J5KG5ldyBNYXAoKSkpOwogICAgICBkaXIgPSBkaXIuY29udGVudHMuZ2V0KHBhcnQpIGFzIERpck5vZGU7CiAgICB9CiAgICBjb25zdCBsZWFmID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV07CiAgICBkaXIuY29udGVudHMuc2V0KGxlYWYsIG5ldyBGaWxlKGRhdGEsIHsgcmVhZG9ubHk6IGZhbHNlIH0pKTsKICB9Cn0KCmZ1bmN0aW9uIHRvVTgoZGF0YTogYW55KTogVWludDhBcnJheSB8IG51bGwgewogIGlmICghZGF0YSkgcmV0dXJuIG5ldyBVaW50OEFycmF5KCk7CiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSByZXR1cm4gZGF0YTsKICBpZiAoZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7CiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBTaGFyZWRBcnJheUJ1ZmZlcikgcmV0dXJuIG5ldyBVaW50OEFycmF5KGRhdGEpOwogIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7CiAgaWYgKGRhdGEgJiYgZGF0YS50eXBlID09PSAiQnVmZmVyIiAmJiBBcnJheS5pc0FycmF5KGRhdGEuZGF0YSkpIHJldHVybiBuZXcgVWludDhBcnJheShkYXRhLmRhdGEpOwogIHRyeSB7CiAgICByZXR1cm4gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKFN0cmluZyhkYXRhKSk7CiAgfSBjYXRjaCAoXykgewogICAgcmV0dXJuIG51bGw7CiAgfQp9CgpmdW5jdGlvbiBoYW5kbGVTdGRvdXQoY2h1bms6IFVpbnQ4QXJyYXkpIHsKICBpZiAoIXJwY0RlY29kZXIpIHsKICAgIHJwY0RlY29kZXIgPSBuZXcgRGVjb2RlcihoYW5kbGVNZXNzYWdlKTsKICB9CiAgdHJ5IHsKICAgIHJwY0RlY29kZXIucHVzaChjaHVuayk7CiAgfSBjYXRjaCAoZXJyKSB7CiAgICB2b2lkIGVycjsKICAgIHJwY0RlY29kZXIgPSBuZXcgRGVjb2RlcihoYW5kbGVNZXNzYWdlKTsKICB9Cn0KCmZ1bmN0aW9uIGhhbmRsZU1lc3NhZ2UobXNnOiB1bmtub3duKSB7CiAgaWYgKCFBcnJheS5pc0FycmF5KG1zZykgfHwgbXNnLmxlbmd0aCA8IDEpIHJldHVybjsKICBjb25zdCBraW5kID0gbXNnWzBdOwogIGlmIChraW5kID09PSAwKSB7CiAgICBjb25zdCBbLCBtc2dpZCwgbWV0aG9kLCBwYXJhbXNdID0gbXNnOwogICAgaWYgKG1ldGhvZCA9PT0gIndhc20tY2xpcGJvYXJkLXBhc3RlIikgewogICAgICBwb3N0TWVzc2FnZSh7IHR5cGU6ICJjbGlwYm9hcmQtcGFzdGUiLCBtc2dpZCB9KTsKICAgIH0gZWxzZSB7CiAgICAgIHBvc3RNZXNzYWdlKHsgdHlwZTogInJwYy1yZXF1ZXN0IiwgbXNnaWQsIG1ldGhvZCwgcGFyYW1zIH0pOwogICAgfQogIH0gZWxzZSBpZiAoa2luZCA9PT0gMSkgewogICAgY29uc3QgWywgbXNnaWQsIGVycm9yLCByZXN1bHRdID0gbXNnOwogICAgcG9zdE1lc3NhZ2UoeyB0eXBlOiAicnBjLXJlc3BvbnNlIiwgbXNnaWQsIGVycm9yLCByZXN1bHQgfSk7CiAgfSBlbHNlIGlmIChraW5kID09PSAyKSB7CiAgICBjb25zdCBbLCBtZXRob2QsIHBhcmFtc10gPSBtc2c7CiAgICBpZiAobWV0aG9kID09PSAid2FzbS1jbGlwYm9hcmQtY29weSIpIHsKICAgICAgY29uc3QgbGluZXMgPSBBcnJheS5pc0FycmF5KHBhcmFtcz8uWzBdKSA/IHBhcmFtc1swXSA6IFtdOwogICAgICBjb25zdCByZWd0eXBlID0gdHlwZW9mIHBhcmFtcz8uWzFdID09PSAic3RyaW5nIiA/IHBhcmFtc1sxXSA6ICJ2IjsKICAgICAgcG9zdE1lc3NhZ2UoeyB0eXBlOiAiY2xpcGJvYXJkLWNvcHkiLCBsaW5lcywgcmVndHlwZSB9KTsKICAgIH0gZWxzZSBpZiAoCiAgICAgIG1ldGhvZCA9PT0gIm52aW1fYnVmX2xpbmVzX2V2ZW50IgogICAgICB8fCBtZXRob2QgPT09ICJudmltX2J1Zl9kZXRhY2hfZXZlbnQiCiAgICAgIHx8IG1ldGhvZCA9PT0gInJlZHJhdyIKICAgICAgfHwgbWV0aG9kID09PSAibW9uYWNvX2N1cnNvciIKICAgICAgfHwgbWV0aG9kID09PSAibW9uYWNvX21vZGUiCiAgICAgIHx8IG1ldGhvZCA9PT0gIm1vbmFjb19jdXJzb3JNb3ZlIgogICAgICB8fCBtZXRob2QgPT09ICJtb25hY29fc2Nyb2xsIgogICAgICB8fCBtZXRob2QgPT09ICJtb25hY29fcmV2ZWFsIgogICAgICB8fCBtZXRob2QgPT09ICJtb25hY29fbW92ZUN1cnNvciIKICAgICAgfHwgbWV0aG9kID09PSAibW9uYWNvX3Njcm9sbG9mZiIKICAgICAgfHwgbWV0aG9kID09PSAibW9uYWNvX2hvc3RfY29tbWFuZCIKICAgICAgfHwgbWV0aG9kID09PSAibW9uYWNvX2J1Zl9lbnRlciIKICAgICAgfHwgbWV0aG9kID09PSAibW9uYWNvX2J1Zl9kZWxldGUiCiAgICApIHsKICAgICAgcG9zdE1lc3NhZ2UoeyB0eXBlOiAicnBjLW5vdGlmeSIsIG1ldGhvZCwgcGFyYW1zIH0pOwogICAgfQogIH0KfQoKYXN5bmMgZnVuY3Rpb24gZmV0Y2hCeXRlcyh1cmw6IHN0cmluZyk6IFByb21pc2U8VWludDhBcnJheT4gewogIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCk7CiAgaWYgKCFyZXMub2spIHRocm93IG5ldyBFcnJvcihgZmV0Y2ggJHt1cmx9IGZhaWxlZCAoJHtyZXMuc3RhdHVzfSlgKTsKICBjb25zdCBjdCA9IChyZXMuaGVhZGVycy5nZXQoImNvbnRlbnQtdHlwZSIpIHx8ICIiKS50b0xvd2VyQ2FzZSgpOwogIGlmIChjdC5pbmNsdWRlcygidGV4dC9odG1sIikpIHRocm93IG5ldyBFcnJvcihgZmV0Y2ggJHt1cmx9IHJldHVybmVkIEhUTUwgKGxpa2VseSB3cm9uZyBwYXRoIG9yIGRldiBzZXJ2ZXIgZmFsbGJhY2spYCk7CiAgY29uc3QgZGF0YSA9IG5ldyBVaW50OEFycmF5KGF3YWl0IHJlcy5hcnJheUJ1ZmZlcigpKTsKICBpZiAoIWRhdGEuYnl0ZUxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKGBmZXRjaCAke3VybH0gcmV0dXJuZWQgZW1wdHkgYm9keWApOwogIHJldHVybiBkYXRhOwp9Cgp0eXBlIFRhckVudHJ5ID0geyBuYW1lOiBzdHJpbmc7IHR5cGU6ICJkaXIiIHwgImZpbGUiOyBkYXRhOiBVaW50OEFycmF5IH07CgpmdW5jdGlvbiBsb29rc0xpa2VHemlwKGRhdGE6IFVpbnQ4QXJyYXkpIHsKICByZXR1cm4gZGF0YSAmJiBkYXRhLmxlbmd0aCA+PSAyICYmIGRhdGFbMF0gPT09IDB4MWYgJiYgZGF0YVsxXSA9PT0gMHg4YjsKfQoKZnVuY3Rpb24gdW50YXIoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBUYXJFbnRyeVtdIHsKICBjb25zdCBmaWxlczogVGFyRW50cnlbXSA9IFtdOwogIGNvbnN0IGRhdGEgPSBieXRlcyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgPyBieXRlcyA6IG5ldyBVaW50OEFycmF5KGJ5dGVzKTsKICBsZXQgb2Zmc2V0ID0gMDsKICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7CiAgbGV0IHNhZmV0eSA9IDA7CgogIHdoaWxlIChvZmZzZXQgKyA1MTIgPD0gZGF0YS5sZW5ndGgpIHsKICAgIGlmIChzYWZldHkrKyA+IDEwMF8wMDApIHRocm93IG5ldyBFcnJvcigidW50YXIgc2FmZXR5IGJyZWFrIik7CiAgICBjb25zdCBuYW1lID0gZGVjb2RlVGFyU3RyaW5nKGRlY29kZXIsIGRhdGEsIG9mZnNldCwgMTAwKTsKICAgIGNvbnN0IHNpemVUZXh0ID0gZGVjb2RlVGFyU3RyaW5nKGRlY29kZXIsIGRhdGEsIG9mZnNldCArIDEyNCwgMTIpOwogICAgY29uc3QgdHlwZWZsYWcgPSBkYXRhW29mZnNldCArIDE1Nl07CiAgICBjb25zdCBwcmVmaXggPSBkZWNvZGVUYXJTdHJpbmcoZGVjb2RlciwgZGF0YSwgb2Zmc2V0ICsgMzQ1LCAxNTUpOwogICAgaWYgKCFuYW1lICYmICFwcmVmaXgpIGJyZWFrOwogICAgY29uc3Qgc2l6ZVJhdyA9IHNpemVUZXh0LnRyaW0oKSB8fCAiMCI7CiAgICBjb25zdCBzaXplID0gcGFyc2VJbnQoc2l6ZVJhdywgOCk7CiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShzaXplKSB8fCBzaXplIDwgMCkgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHRhciBzaXplOiAke3NpemVSYXd9YCk7CiAgICBjb25zdCBmdWxsTmFtZSA9IHByZWZpeCA/IGAke3ByZWZpeH0vJHtuYW1lfWAgOiBuYW1lOwogICAgY29uc3QgYm9keVN0YXJ0ID0gb2Zmc2V0ICsgNTEyOwogICAgY29uc3QgYm9keUVuZCA9IGJvZHlTdGFydCArIHNpemU7CiAgICBjb25zdCBwYXlsb2FkID0gZGF0YS5zbGljZShib2R5U3RhcnQsIGJvZHlFbmQpOwogICAgZmlsZXMucHVzaCh7IG5hbWU6IGZ1bGxOYW1lLCB0eXBlOiB0eXBlZmxhZyA9PT0gNTMgPyAiZGlyIiA6ICJmaWxlIiwgZGF0YTogcGF5bG9hZCB9KTsKICAgIGNvbnN0IGJsb2NrcyA9IE1hdGguY2VpbChzaXplIC8gNTEyKTsKICAgIGNvbnN0IG5leHQgPSBib2R5U3RhcnQgKyBibG9ja3MgKiA1MTI7CiAgICBpZiAobmV4dCA8PSBvZmZzZXQpIHRocm93IG5ldyBFcnJvcigidGFyIHBhcnNlIGRpZCBub3QgYWR2YW5jZSIpOwogICAgb2Zmc2V0ID0gbmV4dDsKICB9CiAgcmV0dXJuIGZpbGVzOwp9CgpmdW5jdGlvbiBkZWNvZGVUYXJTdHJpbmcoZGVjb2RlcjogVGV4dERlY29kZXIsIGRhdGE6IFVpbnQ4QXJyYXksIHN0YXJ0OiBudW1iZXIsIGxlbmd0aDogbnVtYmVyKTogc3RyaW5nIHsKICBsZXQgZW5kID0gc3RhcnQ7CiAgY29uc3QgbWF4ID0gc3RhcnQgKyBsZW5ndGg7CiAgd2hpbGUgKGVuZCA8IG1heCAmJiBkYXRhW2VuZF0gIT09IDApIGVuZCArPSAxOwogIHJldHVybiBkZWNvZGVyLmRlY29kZShkYXRhLnN1YmFycmF5KHN0YXJ0LCBlbmQpKS50cmltKCk7Cn0KCmZ1bmN0aW9uIGJ1aWxkRnMoZW50cmllczogVGFyRW50cnlbXSwgb25Qcm9ncmVzcz86IChjb3VudDogbnVtYmVyKSA9PiB2b2lkKSB7CiAgY29uc3Qgcm9vdCA9IG5ldyBEaXJlY3RvcnkobmV3IE1hcCgpKSBhcyBEaXJOb2RlOwogIGxldCBjb3VudCA9IDA7CiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7CiAgICBjb25zdCBjbGVhbiA9IGVudHJ5Lm5hbWUucmVwbGFjZSgvXlwuXC8/LywgIiIpOwogICAgaWYgKCFjbGVhbikgY29udGludWU7CiAgICBjb25zdCBwYXJ0cyA9IGNsZWFuLnNwbGl0KCIvIikuZmlsdGVyKEJvb2xlYW4pOwogICAgaWYgKCFwYXJ0cy5sZW5ndGgpIGNvbnRpbnVlOwogICAgY291bnQgKz0gMTsKICAgIGlmIChvblByb2dyZXNzICYmIGNvdW50ICUgNTAwID09PSAwKSBvblByb2dyZXNzKGNvdW50KTsKCiAgICBsZXQgZGlyOiBEaXJOb2RlID0gcm9vdDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSArPSAxKSB7CiAgICAgIGNvbnN0IHBhcnQgPSBwYXJ0c1tpXTsKICAgICAgaWYgKCFkaXIuY29udGVudHMuaGFzKHBhcnQpKSBkaXIuY29udGVudHMuc2V0KHBhcnQsIG5ldyBEaXJlY3RvcnkobmV3IE1hcCgpKSk7CiAgICAgIGRpciA9IGRpci5jb250ZW50cy5nZXQocGFydCkgYXMgRGlyTm9kZTsKICAgIH0KCiAgICBjb25zdCBsZWFmID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV07CiAgICBpZiAoZW50cnkudHlwZSA9PT0gImRpciIpIHsKICAgICAgaWYgKCFkaXIuY29udGVudHMuaGFzKGxlYWYpKSBkaXIuY29udGVudHMuc2V0KGxlYWYsIG5ldyBEaXJlY3RvcnkobmV3IE1hcCgpKSk7CiAgICB9IGVsc2UgewogICAgICBkaXIuY29udGVudHMuc2V0KGxlYWYsIG5ldyBGaWxlKGVudHJ5LmRhdGEsIHsgcmVhZG9ubHk6IHRydWUgfSkpOwogICAgfQogIH0KCiAgZW5zdXJlRGlyKHJvb3QsICJob21lIik7CiAgZW5zdXJlRGlyKHJvb3QsICJ0bXAiKTsKICBlbnN1cmVEaXIocm9vdCwgImhvbWUvLmNvbmZpZyIpOwogIGVuc3VyZURpcihyb290LCAiaG9tZS8ubG9jYWwvc2hhcmUiKTsKICBlbnN1cmVEaXIocm9vdCwgImhvbWUvLmxvY2FsL3N0YXRlIik7CgogIHJldHVybiByb290Owp9CgpmdW5jdGlvbiBlbnN1cmVEaXIocm9vdDogRGlyTm9kZSwgcGF0aDogc3RyaW5nKSB7CiAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KCIvIikuZmlsdGVyKEJvb2xlYW4pOwogIGxldCBub2RlOiBEaXJOb2RlID0gcm9vdDsKICBmb3IgKGNvbnN0IHAgb2YgcGFydHMpIHsKICAgIGlmICghbm9kZS5jb250ZW50cy5oYXMocCkpIG5vZGUuY29udGVudHMuc2V0KHAsIG5ldyBEaXJlY3RvcnkobmV3IE1hcCgpKSk7CiAgICBub2RlID0gbm9kZS5jb250ZW50cy5nZXQocCkgYXMgRGlyTm9kZTsKICB9Cn0KCmZ1bmN0aW9uIG1ha2VFbnYocHJvY0V4aXQ/OiAoY29kZTogbnVtYmVyKSA9PiB2b2lkKSB7CiAgY29uc3Qgd2FzbUFueSA9IFdlYkFzc2VtYmx5IGFzIGFueTsKICBjb25zdCBjTG9uZ2ptcCA9IG5ldyB3YXNtQW55LlRhZyh7IHBhcmFtZXRlcnM6IFsiaTMyIl0sIHJlc3VsdHM6IFtdIH0pIGFzIGFueTsKICByZXR1cm4gewogICAgZmxvY2s6ICgpID0+IDAsCiAgICBnZXRwaWQ6ICgpID0+IDEsCiAgICB1dl9yYW5kb206ICgpID0+IC0zOCwKICAgIHV2X3d0ZjhfdG9fdXRmMTY6ICgpID0+IHt9LAogICAgdXZfdXRmMTZfbGVuZ3RoX2FzX3d0Zjg6ICgpID0+IDAsCiAgICB1dl91dGYxNl90b193dGY4OiAoKSA9PiAtMzgsCiAgICB1dl93dGY4X2xlbmd0aF9hc191dGYxNjogKCkgPT4gMCwKICAgIF9fd2FzbV9sb25nam1wOiAocHRyOiBudW1iZXIpID0+IHsKICAgICAgaWYgKHByb2NFeGl0KSBwcm9jRXhpdCgxKTsKICAgICAgdGhyb3cgbmV3IHdhc21BbnkuRXhjZXB0aW9uKGNMb25nam1wLCBbcHRyID8/IDBdKTsKICAgIH0sCiAgICBfX3dhc21fc2V0am1wOiAoKSA9PiAwLAogICAgX193YXNtX3NldGptcF90ZXN0OiAoKSA9PiAwLAogICAgdG1wZmlsZTogKCkgPT4gMCwKICAgIGNsb2NrOiAoKSA9PiAwLAogICAgc3lzdGVtOiAoKSA9PiAtMSwKICAgIHRtcG5hbTogKCkgPT4gMCwKICAgIF9fY19sb25nam1wOiBjTG9uZ2ptcCwKICB9IGFzIFdlYkFzc2VtYmx5Lk1vZHVsZUltcG9ydHM7Cn0KCmNsYXNzIFJvb3RlZFByZW9wZW5EaXJlY3RvcnkgZXh0ZW5kcyBQcmVvcGVuRGlyZWN0b3J5IHsKICAjc3RyaXAocGF0aDogc3RyaW5nKSB7IHJldHVybiBwYXRoLnJlcGxhY2UoL15cLysvLCAiIik7IH0KICBwYXRoX29wZW4oCiAgICBkaXJmbGFnczogbnVtYmVyLAogICAgcGF0aF9zdHI6IHN0cmluZywKICAgIG9mbGFnczogbnVtYmVyLAogICAgZnNfcmlnaHRzX2Jhc2U6IGJpZ2ludCwKICAgIGZzX3JpZ2h0c19pbmhlcml0aW5nOiBiaWdpbnQsCiAgICBmZF9mbGFnczogbnVtYmVyLAogICkgewogICAgcmV0dXJuIHN1cGVyLnBhdGhfb3BlbihkaXJmbGFncywgdGhpcy4jc3RyaXAocGF0aF9zdHIpLCBvZmxhZ3MsIGZzX3JpZ2h0c19iYXNlLCBmc19yaWdodHNfaW5oZXJpdGluZywgZmRfZmxhZ3MpOwogIH0KICBwYXRoX2ZpbGVzdGF0X2dldChmbGFnczogbnVtYmVyLCBwYXRoX3N0cjogc3RyaW5nKSB7IHJldHVybiBzdXBlci5wYXRoX2ZpbGVzdGF0X2dldChmbGFncywgdGhpcy4jc3RyaXAocGF0aF9zdHIpKTsgfQogIHBhdGhfY3JlYXRlX2RpcmVjdG9yeShwYXRoX3N0cjogc3RyaW5nKSB7IHJldHVybiBzdXBlci5wYXRoX2NyZWF0ZV9kaXJlY3RvcnkodGhpcy4jc3RyaXAocGF0aF9zdHIpKTsgfQogIHBhdGhfdW5saW5rX2ZpbGUocGF0aF9zdHI6IHN0cmluZykgeyByZXR1cm4gc3VwZXIucGF0aF91bmxpbmtfZmlsZSh0aGlzLiNzdHJpcChwYXRoX3N0cikpOyB9CiAgcGF0aF9yZW1vdmVfZGlyZWN0b3J5KHBhdGhfc3RyOiBzdHJpbmcpIHsgcmV0dXJuIHN1cGVyLnBhdGhfcmVtb3ZlX2RpcmVjdG9yeSh0aGlzLiNzdHJpcChwYXRoX3N0cikpOyB9CiAgcGF0aF9saW5rKHBhdGhfc3RyOiBzdHJpbmcsIGlub2RlOiBJbm9kZSwgYWxsb3dfZGlyOiBib29sZWFuKSB7IHJldHVybiBzdXBlci5wYXRoX2xpbmsodGhpcy4jc3RyaXAocGF0aF9zdHIpLCBpbm9kZSwgYWxsb3dfZGlyKTsgfQogIHBhdGhfcmVhZGxpbmsocGF0aF9zdHI6IHN0cmluZykgeyByZXR1cm4gc3VwZXIucGF0aF9yZWFkbGluayh0aGlzLiNzdHJpcChwYXRoX3N0cikpOyB9CiAgcGF0aF9zeW1saW5rKG9sZF9wYXRoOiBzdHJpbmcsIG5ld19wYXRoOiBzdHJpbmcpIHsKICAgIGNvbnN0IHRhcmdldCA9IChQcmVvcGVuRGlyZWN0b3J5LnByb3RvdHlwZSBhcyB1bmtub3duIGFzIHsgcGF0aF9zeW1saW5rPzogKG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKSA9PiBudW1iZXIgfSkucGF0aF9zeW1saW5rOwogICAgaWYgKCF0YXJnZXQpIHJldHVybiB3YXNpLkVSUk5PX05PVFNVUDsKICAgIHJldHVybiB0YXJnZXQuY2FsbCh0aGlzLCB0aGlzLiNzdHJpcChvbGRfcGF0aCksIHRoaXMuI3N0cmlwKG5ld19wYXRoKSk7CiAgfQp9Cg==", import.meta.url),
|
|
1068
|
+
workerUrl: e.workerUrl ?? new URL("./nvimWorker.worker.js", import.meta.url),
|
|
1069
1069
|
reuseWorker: e.reuseWorker ?? !1,
|
|
1070
1070
|
wasmPath: e.wasmPath ?? "",
|
|
1071
1071
|
runtimePath: e.runtimePath ?? "",
|
|
1072
1072
|
inputMode: e.inputMode ?? "shared",
|
|
1073
1073
|
env: e.env,
|
|
1074
1074
|
files: e.files,
|
|
1075
|
-
sharedInputBytes: e.sharedInputBytes ??
|
|
1075
|
+
sharedInputBytes: e.sharedInputBytes ?? O,
|
|
1076
1076
|
cols: e.cols ?? 120,
|
|
1077
1077
|
rows: e.rows ?? 40,
|
|
1078
1078
|
minCols: e.minCols ?? 20,
|
|
@@ -1098,7 +1098,7 @@ class fe {
|
|
|
1098
1098
|
onHostCommand: e.onHostCommand,
|
|
1099
1099
|
status: e.status ?? (() => {
|
|
1100
1100
|
}),
|
|
1101
|
-
seedLines: e.seedLines ??
|
|
1101
|
+
seedLines: e.seedLines ?? ye,
|
|
1102
1102
|
seedName: e.seedName ?? "monaco-demo.lua",
|
|
1103
1103
|
seedFiletype: e.seedFiletype ?? "lua",
|
|
1104
1104
|
uiAttach: e.uiAttach ?? !0,
|
|
@@ -1128,11 +1128,11 @@ class fe {
|
|
|
1128
1128
|
onPopupmenu: e.onPopupmenu,
|
|
1129
1129
|
cmdlineContainer: e.cmdlineContainer,
|
|
1130
1130
|
insertSyncDebounceMs: Number.isFinite(e.insertSyncDebounceMs) ? Math.max(0, Number(e.insertSyncDebounceMs)) : 20,
|
|
1131
|
-
debug:
|
|
1131
|
+
debug: r,
|
|
1132
1132
|
debugLog: e.debugLog,
|
|
1133
1133
|
shouldHandleKey: e.shouldHandleKey ?? (() => !0),
|
|
1134
|
-
translateKey: e.translateKey ??
|
|
1135
|
-
}, this.ctrlKeysNormal = this.opts.ctrlKeysForNormalMode ? new Set(this.opts.ctrlKeysForNormalMode.map((
|
|
1134
|
+
translateKey: e.translateKey ?? Ce
|
|
1135
|
+
}, this.ctrlKeysNormal = this.opts.ctrlKeysForNormalMode ? new Set(this.opts.ctrlKeysForNormalMode.map((l) => String(l).toLowerCase())) : null, this.ctrlKeysInsert = this.opts.ctrlKeysForInsertMode ? new Set(this.opts.ctrlKeysForInsertMode.map((l) => String(l).toLowerCase())) : null, this.altKeysNormal = this.opts.altKeysForNormalMode ? new Set(this.opts.altKeysForNormalMode.map((l) => String(l).toLowerCase())) : null, this.altKeysInsert = this.opts.altKeysForInsertMode ? new Set(this.opts.altKeysForInsertMode.map((l) => String(l).toLowerCase())) : null, this.metaKeysNormal = this.opts.metaKeysForNormalMode ? new Set(this.opts.metaKeysForNormalMode.map((l) => String(l).toLowerCase())) : null, this.metaKeysInsert = this.opts.metaKeysForInsertMode ? new Set(this.opts.metaKeysForInsertMode.map((l) => String(l).toLowerCase())) : null, this.opts.debug && (this.opts.status?.("[monaco-neovim-wasm] debug enabled"), this.debugLog("debug enabled"));
|
|
1136
1136
|
}
|
|
1137
1137
|
async start(t) {
|
|
1138
1138
|
this.stop(!0), this.nextSeedLines = t ?? null;
|
|
@@ -1144,8 +1144,8 @@ class fe {
|
|
|
1144
1144
|
this.notifyChain = this.notifyChain.then(() => this.handleNotify(s, n)).catch(() => {
|
|
1145
1145
|
});
|
|
1146
1146
|
},
|
|
1147
|
-
onRequest: (s, n,
|
|
1148
|
-
this.handleRequest(s, n,
|
|
1147
|
+
onRequest: (s, n, r) => {
|
|
1148
|
+
this.handleRequest(s, n, r);
|
|
1149
1149
|
},
|
|
1150
1150
|
onClipboardCopy: (s, n) => {
|
|
1151
1151
|
this.handleClipboardCopy(s);
|
|
@@ -1168,8 +1168,8 @@ class fe {
|
|
|
1168
1168
|
this.opts.status(`start failed: ${s ?? "unknown"}`, !0);
|
|
1169
1169
|
},
|
|
1170
1170
|
onExit: (s, n) => {
|
|
1171
|
-
const
|
|
1172
|
-
this.opts.status(`nvim exited (${s})${
|
|
1171
|
+
const r = n ? `: ${n.trim()}` : "";
|
|
1172
|
+
this.opts.status(`nvim exited (${s})${r}`, s !== 0);
|
|
1173
1173
|
try {
|
|
1174
1174
|
this.opts.onExit?.(s, n);
|
|
1175
1175
|
} catch {
|
|
@@ -1183,7 +1183,7 @@ class fe {
|
|
|
1183
1183
|
this.opts.status(s, !0);
|
|
1184
1184
|
}
|
|
1185
1185
|
};
|
|
1186
|
-
if (!this.session || !this.opts.reuseWorker ? this.session = new
|
|
1186
|
+
if (!this.session || !this.opts.reuseWorker ? this.session = new fe({
|
|
1187
1187
|
worker: this.opts.worker,
|
|
1188
1188
|
workerUrl: this.opts.workerUrl,
|
|
1189
1189
|
inputMode: this.opts.inputMode,
|
|
@@ -1200,12 +1200,12 @@ class fe {
|
|
|
1200
1200
|
runtimePath: this.opts.runtimePath,
|
|
1201
1201
|
inputMode: this.opts.inputMode,
|
|
1202
1202
|
env: this.opts.env,
|
|
1203
|
-
files:
|
|
1203
|
+
files: Me(Ie(
|
|
1204
1204
|
this.opts.files,
|
|
1205
1205
|
this.opts.wrappedLineMotions || this.opts.scrollMotions || this.opts.hostCommands ? [
|
|
1206
|
-
{ path: "home/.config/nvim/monaco-neovim-wasm/motion.vim", data:
|
|
1206
|
+
{ path: "home/.config/nvim/monaco-neovim-wasm/motion.vim", data: pe },
|
|
1207
1207
|
{ path: "home/.config/nvim/monaco-neovim-wasm/scrolling.vim", data: me },
|
|
1208
|
-
{ path: "home/.config/nvim/monaco-neovim-wasm/host-commands.vim", data:
|
|
1208
|
+
{ path: "home/.config/nvim/monaco-neovim-wasm/host-commands.vim", data: ge }
|
|
1209
1209
|
] : []
|
|
1210
1210
|
))
|
|
1211
1211
|
}), this.opts.status("starting..."), this.primeSent = !1, setTimeout(() => {
|
|
@@ -1235,7 +1235,7 @@ class fe {
|
|
|
1235
1235
|
this.sendNotify("nvim_input", [String(t ?? "")]);
|
|
1236
1236
|
}
|
|
1237
1237
|
type(t, e = !0) {
|
|
1238
|
-
const i =
|
|
1238
|
+
const i = z(String(t ?? ""), e);
|
|
1239
1239
|
i && this.sendNotify("nvim_input", [i]);
|
|
1240
1240
|
}
|
|
1241
1241
|
paste(t) {
|
|
@@ -1245,14 +1245,14 @@ class fe {
|
|
|
1245
1245
|
const i = String(t ?? ""), s = Array.isArray(e) ? e : [];
|
|
1246
1246
|
if (this.execLuaAvailable !== !1)
|
|
1247
1247
|
try {
|
|
1248
|
-
const
|
|
1249
|
-
return this.execLuaAvailable = !0,
|
|
1250
|
-
} catch (
|
|
1251
|
-
const
|
|
1252
|
-
if (
|
|
1248
|
+
const r = await this.rpcCall("nvim_exec_lua", [i, s]);
|
|
1249
|
+
return this.execLuaAvailable = !0, r;
|
|
1250
|
+
} catch (r) {
|
|
1251
|
+
const l = r?.message || String(r);
|
|
1252
|
+
if (l.includes("Invalid method") && l.includes("nvim_exec_lua"))
|
|
1253
1253
|
this.execLuaAvailable = !1;
|
|
1254
1254
|
else
|
|
1255
|
-
throw
|
|
1255
|
+
throw r;
|
|
1256
1256
|
}
|
|
1257
1257
|
const n = `(function(...)
|
|
1258
1258
|
${i}
|
|
@@ -1273,7 +1273,7 @@ end)(unpack(_A))`;
|
|
|
1273
1273
|
}
|
|
1274
1274
|
attachEditorListeners() {
|
|
1275
1275
|
this.disposeEditorListeners();
|
|
1276
|
-
const t =
|
|
1276
|
+
const t = b.editor.EditorOption;
|
|
1277
1277
|
try {
|
|
1278
1278
|
const e = this.editor.getOption(t.fontInfo);
|
|
1279
1279
|
this.initialCursorWidth = this.editor.getOption(t.cursorWidth) || 0, this.typicalFullWidth = e?.typicalFullwidthCharacterWidth || 2;
|
|
@@ -1367,10 +1367,10 @@ end)(unpack(_A))`;
|
|
|
1367
1367
|
const t = this.editor.getModel();
|
|
1368
1368
|
if (!t) return;
|
|
1369
1369
|
try {
|
|
1370
|
-
const i = t.uri, s = i?.scheme ?? "", n = i?.authority ?? "",
|
|
1370
|
+
const i = t.uri, s = i?.scheme ?? "", n = i?.authority ?? "", r = i?.path ?? "";
|
|
1371
1371
|
if (s === "nvim" && n === "buf") {
|
|
1372
|
-
const
|
|
1373
|
-
Number.isFinite(
|
|
1372
|
+
const l = /^\/(\d+)$/.exec(r), c = l ? Number(l[1]) : NaN;
|
|
1373
|
+
Number.isFinite(c) && c > 0 && (this.bufHandle = c);
|
|
1374
1374
|
}
|
|
1375
1375
|
} catch {
|
|
1376
1376
|
}
|
|
@@ -1386,8 +1386,8 @@ end)(unpack(_A))`;
|
|
|
1386
1386
|
}
|
|
1387
1387
|
computeGridSize() {
|
|
1388
1388
|
try {
|
|
1389
|
-
const t = this.editor.getLayoutInfo(), e = Math.max(0, Number(t?.contentWidth ?? t?.width ?? 0) || 0), i = Math.max(0, Number(t?.contentHeight ?? t?.height ?? 0) || 0), s = this.editor.getOption(
|
|
1390
|
-
if (Number.isFinite(
|
|
1389
|
+
const t = this.editor.getLayoutInfo(), e = Math.max(0, Number(t?.contentWidth ?? t?.width ?? 0) || 0), i = Math.max(0, Number(t?.contentHeight ?? t?.height ?? 0) || 0), s = this.editor.getOption(b.editor.EditorOption.fontInfo), n = Math.max(1, Number(s?.typicalHalfwidthCharacterWidth ?? s?.maxDigitWidth ?? 0) || 0), r = Math.max(1, Number(s?.lineHeight ?? 0) || 0), l = Math.max(this.opts.minCols, Math.floor(e / n)), c = Math.max(this.opts.minRows, Math.floor(i / r));
|
|
1390
|
+
if (Number.isFinite(l) && Number.isFinite(c) && l > 0 && c > 0) return { cols: l, rows: c };
|
|
1391
1391
|
} catch {
|
|
1392
1392
|
}
|
|
1393
1393
|
return { cols: this.opts.cols, rows: this.opts.rows };
|
|
@@ -1410,7 +1410,7 @@ end)(unpack(_A))`;
|
|
|
1410
1410
|
const e = document.createElement("div");
|
|
1411
1411
|
e.style.position = "absolute", e.style.display = "none", e.style.pointerEvents = "none", e.style.zIndex = "40", e.style.whiteSpace = "pre", e.style.padding = "0 1px", e.style.background = "rgba(0, 0, 0, 0.15)", e.style.borderBottom = "1px solid rgba(255, 255, 255, 0.6)", e.style.borderRadius = "2px";
|
|
1412
1412
|
try {
|
|
1413
|
-
const i = this.editor.getOption(
|
|
1413
|
+
const i = this.editor.getOption(b.editor.EditorOption.fontInfo);
|
|
1414
1414
|
i?.fontFamily && (e.style.fontFamily = i.fontFamily), i?.fontSize && (e.style.fontSize = `${i.fontSize}px`), i?.lineHeight && (e.style.lineHeight = `${i.lineHeight}px`);
|
|
1415
1415
|
} catch {
|
|
1416
1416
|
}
|
|
@@ -1429,11 +1429,11 @@ end)(unpack(_A))`;
|
|
|
1429
1429
|
if (!t || this.cmdlineVisible) return;
|
|
1430
1430
|
const e = this.editor.getModel();
|
|
1431
1431
|
if (!e) return;
|
|
1432
|
-
const i = this.editor.getSelection(), n = (i && !i.isEmpty() ? i.getStartPosition() : null) ?? this.editor.getPosition() ?? this.lastCursorPos ?? new
|
|
1433
|
-
let
|
|
1434
|
-
|
|
1435
|
-
const
|
|
1436
|
-
this.optimisticCursorPrevPos =
|
|
1432
|
+
const i = this.editor.getSelection(), n = (i && !i.isEmpty() ? i.getStartPosition() : null) ?? this.editor.getPosition() ?? this.lastCursorPos ?? new b.Position(1, 1), r = String(t).split(/\r?\n/);
|
|
1433
|
+
let l = n.lineNumber, c = n.column;
|
|
1434
|
+
r.length <= 1 ? c += Array.from(r[0] ?? "").length : (l += r.length - 1, c = 1 + Array.from(r[r.length - 1] ?? "").length);
|
|
1435
|
+
const u = e.validatePosition(new b.Position(l, c)), d = this.editor.getPosition() ?? this.lastCursorPos ?? n;
|
|
1436
|
+
this.optimisticCursorPrevPos = d, this.optimisticCursorPos = u, this.optimisticCursorUntil = (typeof performance < "u" && performance.now ? performance.now() : Date.now()) + 120, this.lastCursorPos = u, !this.compositionActive && (this.suppressCursorSync = !0, this.editor.setPosition(u), this.suppressCursorSync = !1);
|
|
1437
1437
|
}
|
|
1438
1438
|
positionPreedit() {
|
|
1439
1439
|
if (!this.preeditEl || !this.preeditVisible) return;
|
|
@@ -1560,14 +1560,14 @@ end)(unpack(_A))`;
|
|
|
1560
1560
|
await this.rpcCall("nvim_ui_attach", [this.uiCols || this.opts.cols, this.uiRows || this.opts.rows, this.opts.uiAttachOptions]);
|
|
1561
1561
|
} catch {
|
|
1562
1562
|
}
|
|
1563
|
-
for (const
|
|
1564
|
-
|
|
1563
|
+
for (const r of this.opts.startupCommands)
|
|
1564
|
+
r && this.sendNotify("nvim_command", [r]);
|
|
1565
1565
|
if (this.opts.startupLua)
|
|
1566
1566
|
try {
|
|
1567
1567
|
await this.execLua(this.opts.startupLua, []);
|
|
1568
1568
|
} catch {
|
|
1569
1569
|
}
|
|
1570
|
-
const t = await this.rpcCall("nvim_get_current_buf", []), e =
|
|
1570
|
+
const t = await this.rpcCall("nvim_get_current_buf", []), e = B(t) ?? 1;
|
|
1571
1571
|
if (this.bufHandle = e, await this.rpcCall("nvim_buf_attach", [e, !0, {}]) !== !0) throw new Error("nvim_buf_attach failed");
|
|
1572
1572
|
this.ensureActiveState(), this.opts.syncTabstop && this.syncTabstopFromMonaco();
|
|
1573
1573
|
const s = await this.rpcCall("nvim_buf_get_lines", [e, 0, -1, !1]);
|
|
@@ -1575,13 +1575,13 @@ end)(unpack(_A))`;
|
|
|
1575
1575
|
const n = await this.seedBuffer(e, this.nextSeedLines);
|
|
1576
1576
|
this.nextSeedLines = null, n && n.length && this.applyBuffer(n);
|
|
1577
1577
|
try {
|
|
1578
|
-
const
|
|
1579
|
-
if (
|
|
1580
|
-
const
|
|
1581
|
-
|
|
1578
|
+
const r = this.ensureActiveState();
|
|
1579
|
+
if (r) {
|
|
1580
|
+
const l = await this.rpcCall("nvim_buf_get_name", [e]);
|
|
1581
|
+
r.name = typeof l == "string" ? l : "", r.name && this.buffersByName.set(r.name, e);
|
|
1582
1582
|
try {
|
|
1583
|
-
const
|
|
1584
|
-
|
|
1583
|
+
const c = await this.rpcCall("nvim_buf_get_option", [e, "filetype"]);
|
|
1584
|
+
r.filetype = typeof c == "string" ? c : "";
|
|
1585
1585
|
} catch {
|
|
1586
1586
|
}
|
|
1587
1587
|
}
|
|
@@ -1602,18 +1602,18 @@ end)(unpack(_A))`;
|
|
|
1602
1602
|
if (i?.writeText) {
|
|
1603
1603
|
i.writeText(e).catch(() => {
|
|
1604
1604
|
navigator.clipboard?.writeText ? navigator.clipboard.writeText(e).catch(() => {
|
|
1605
|
-
|
|
1606
|
-
}) :
|
|
1605
|
+
H(e);
|
|
1606
|
+
}) : H(e);
|
|
1607
1607
|
});
|
|
1608
1608
|
return;
|
|
1609
1609
|
}
|
|
1610
1610
|
if (navigator.clipboard?.writeText) {
|
|
1611
1611
|
navigator.clipboard.writeText(e).catch(() => {
|
|
1612
|
-
|
|
1612
|
+
H(e);
|
|
1613
1613
|
});
|
|
1614
1614
|
return;
|
|
1615
1615
|
}
|
|
1616
|
-
|
|
1616
|
+
H(e);
|
|
1617
1617
|
}
|
|
1618
1618
|
}
|
|
1619
1619
|
handleRequest(t, e, i) {
|
|
@@ -1663,33 +1663,33 @@ end)(unpack(_A))`;
|
|
|
1663
1663
|
if (t === "monaco_cursor") {
|
|
1664
1664
|
const [i, s] = e;
|
|
1665
1665
|
try {
|
|
1666
|
-
const
|
|
1667
|
-
if (
|
|
1666
|
+
const r = this.ignoreInsertExitCursor, l = this.nowMs();
|
|
1667
|
+
if (r && l < r.untilMs && !this.delegateInsertToMonaco && Number(i) === r.line && Number(s) === r.col0 && r.col0 > 0) {
|
|
1668
1668
|
this.debugLog(`nvim->monaco cursor: ignore stale post-exit insert cursor ln=${Number(i)} col0=${Number(s)}`);
|
|
1669
1669
|
return;
|
|
1670
1670
|
}
|
|
1671
|
-
|
|
1671
|
+
r && l >= r.untilMs && (this.ignoreInsertExitCursor = null);
|
|
1672
1672
|
} catch {
|
|
1673
1673
|
}
|
|
1674
|
-
const n =
|
|
1674
|
+
const n = Q(this.editor, Number(i), Number(s));
|
|
1675
1675
|
if (this.debugLog(`nvim->monaco cursor: ln=${Number(i)} col0=${Number(s)} -> line=${n.line} col=${n.col} delegateInsert=${this.delegateInsertToMonaco} exitingInsert=${this.exitingInsertMode} mode=${JSON.stringify(this.lastMode)}`), this.delegateInsertToMonaco && !this.exitingInsertMode) {
|
|
1676
|
-
const
|
|
1677
|
-
this.lastCursorPos =
|
|
1676
|
+
const r = this.editor.getModel(), l = r ? r.validatePosition(new b.Position(n.line, n.col)) : new b.Position(n.line, n.col);
|
|
1677
|
+
this.lastCursorPos = l;
|
|
1678
1678
|
return;
|
|
1679
1679
|
}
|
|
1680
|
-
this.updateCursor(n.line, n.col),
|
|
1680
|
+
this.updateCursor(n.line, n.col), k(this.lastMode) && this.scheduleVisualSelectionRefresh();
|
|
1681
1681
|
return;
|
|
1682
1682
|
}
|
|
1683
1683
|
if (t === "monaco_mode") {
|
|
1684
1684
|
let i = "", s;
|
|
1685
|
-
const n = e?.[0],
|
|
1685
|
+
const n = e?.[0], r = e?.[1];
|
|
1686
1686
|
if (typeof n == "string")
|
|
1687
1687
|
i = String(n);
|
|
1688
1688
|
else if (n && typeof n == "object") {
|
|
1689
|
-
const
|
|
1690
|
-
typeof
|
|
1689
|
+
const l = n;
|
|
1690
|
+
typeof l.mode == "string" && (i = String(l.mode)), typeof l.blocking == "boolean" && (s = !!l.blocking);
|
|
1691
1691
|
}
|
|
1692
|
-
typeof
|
|
1692
|
+
typeof r == "boolean" && (s = !!r), this.hostAutocmdInstalled || (this.hostAutocmdInstalled = !0), this.debugLog(`nvim->monaco mode: ${JSON.stringify(this.lastMode)} -> ${JSON.stringify(i)} blocking=${s}`), this.applyNvimMode(i, s);
|
|
1693
1693
|
return;
|
|
1694
1694
|
}
|
|
1695
1695
|
if (t === "monaco_recording") {
|
|
@@ -1698,49 +1698,49 @@ end)(unpack(_A))`;
|
|
|
1698
1698
|
return;
|
|
1699
1699
|
}
|
|
1700
1700
|
if (t === "nvim_buf_lines_event") {
|
|
1701
|
-
const [i, s, n,
|
|
1702
|
-
if (!
|
|
1703
|
-
const
|
|
1704
|
-
if (!
|
|
1701
|
+
const [i, s, n, r, l] = e, c = B(i);
|
|
1702
|
+
if (!c) return;
|
|
1703
|
+
const u = this.bufHandle != null && c === this.bufHandle ? this.ensureActiveState() : this.buffers.get(c) ?? null;
|
|
1704
|
+
if (!u || this.bufHandle != null && c === this.bufHandle && this.delegateInsertToMonaco && !this.exitingInsertMode && this.nowMs() < this.ignoreActiveBufLinesEventsUntil)
|
|
1705
1705
|
return;
|
|
1706
|
-
if (this.bufHandle != null &&
|
|
1706
|
+
if (this.bufHandle != null && c === this.bufHandle && this.compositionActive) {
|
|
1707
1707
|
this.pendingResyncAfterComposition = !0;
|
|
1708
1708
|
return;
|
|
1709
1709
|
}
|
|
1710
|
-
const
|
|
1711
|
-
if (
|
|
1710
|
+
const d = u.model, f = Number(n), p = Number(r), m = Array.isArray(l) ? l.map((_) => String(_ ?? "")) : null;
|
|
1711
|
+
if (d && Number.isInteger(f) && Number.isInteger(p) && f >= 0 && p >= f && m)
|
|
1712
1712
|
try {
|
|
1713
|
-
const
|
|
1714
|
-
if (
|
|
1715
|
-
const
|
|
1716
|
-
let
|
|
1713
|
+
const _ = this.bufHandle != null && c === this.bufHandle && this.editor.getModel() === d;
|
|
1714
|
+
if (_ && this.delegateInsertToMonaco) {
|
|
1715
|
+
const w = this.computeLinePatch(d, f, p, m);
|
|
1716
|
+
let x = !1;
|
|
1717
1717
|
try {
|
|
1718
|
-
|
|
1718
|
+
x = d.getValueInRange(w.range) === w.text;
|
|
1719
1719
|
} catch {
|
|
1720
1720
|
}
|
|
1721
|
-
if (!
|
|
1722
|
-
if (
|
|
1721
|
+
if (!x) {
|
|
1722
|
+
if (u.pendingFullSync || u.pendingBufEdits.length) {
|
|
1723
1723
|
this.scheduleResync();
|
|
1724
1724
|
return;
|
|
1725
1725
|
}
|
|
1726
|
-
this.applyLinePatchToModel(
|
|
1726
|
+
this.applyLinePatchToModel(d, f, p, m);
|
|
1727
1727
|
try {
|
|
1728
|
-
|
|
1728
|
+
u.shadowLines = d.getLinesContent();
|
|
1729
1729
|
} catch {
|
|
1730
1730
|
}
|
|
1731
1731
|
}
|
|
1732
|
-
} else
|
|
1732
|
+
} else _ ? this.applyLinePatch(d, f, p, m) : this.applyLinePatchToModel(d, f, p, m);
|
|
1733
1733
|
} catch {
|
|
1734
1734
|
}
|
|
1735
1735
|
else
|
|
1736
1736
|
try {
|
|
1737
|
-
const
|
|
1738
|
-
this.bufHandle != null &&
|
|
1737
|
+
const _ = await this.rpcCall("nvim_buf_get_lines", [c, 0, -1, !1]), w = Array.isArray(_) ? _ : [""];
|
|
1738
|
+
this.bufHandle != null && c === this.bufHandle && this.editor.getModel() === d ? this.applyBuffer(w) : this.setModelText(d, w);
|
|
1739
1739
|
} catch {
|
|
1740
1740
|
}
|
|
1741
|
-
this.bufHandle != null &&
|
|
1741
|
+
this.bufHandle != null && c === this.bufHandle && k(this.lastMode) && this.scheduleVisualSelectionRefresh();
|
|
1742
1742
|
} else if (t === "nvim_buf_detach_event") {
|
|
1743
|
-
const i =
|
|
1743
|
+
const i = B(e?.[0]);
|
|
1744
1744
|
if (i && this.buffers.has(i)) {
|
|
1745
1745
|
const s = this.buffers.get(i);
|
|
1746
1746
|
if (s.name && this.buffersByName.delete(s.name), s.createdModel)
|
|
@@ -1760,18 +1760,18 @@ end)(unpack(_A))`;
|
|
|
1760
1760
|
if (!this.pendingRedrawEvents.length) return;
|
|
1761
1761
|
let e = -1;
|
|
1762
1762
|
for (let n = 0; n < this.pendingRedrawEvents.length; n += 1) {
|
|
1763
|
-
const
|
|
1764
|
-
(Array.isArray(
|
|
1763
|
+
const r = this.pendingRedrawEvents[n];
|
|
1764
|
+
(Array.isArray(r) ? r[0] : null) === "flush" && (e = n);
|
|
1765
1765
|
}
|
|
1766
1766
|
if (e < 0) return;
|
|
1767
1767
|
const i = this.pendingRedrawEvents.slice(0, e + 1);
|
|
1768
1768
|
this.pendingRedrawEvents = this.pendingRedrawEvents.slice(e + 1);
|
|
1769
1769
|
let s = 0;
|
|
1770
1770
|
for (let n = 0; n < i.length; n += 1) {
|
|
1771
|
-
const
|
|
1772
|
-
if ((Array.isArray(
|
|
1773
|
-
const
|
|
1774
|
-
s = n + 1, this.processRedrawFrame(
|
|
1771
|
+
const r = i[n];
|
|
1772
|
+
if ((Array.isArray(r) ? r[0] : null) === "flush") {
|
|
1773
|
+
const c = i.slice(s, n + 1);
|
|
1774
|
+
s = n + 1, this.processRedrawFrame(c);
|
|
1775
1775
|
}
|
|
1776
1776
|
}
|
|
1777
1777
|
s < i.length && this.pendingRedrawEvents.unshift(...i.slice(s));
|
|
@@ -1809,10 +1809,10 @@ end)(unpack(_A))`;
|
|
|
1809
1809
|
return;
|
|
1810
1810
|
}
|
|
1811
1811
|
if (t === "cmdline_show") {
|
|
1812
|
-
const i = e[0], s = Math.max(0, Number(e[1] ?? 0) || 0), n = typeof e[2] == "string" ? e[2] : "",
|
|
1813
|
-
this.cmdlineCursorOffsetBytes =
|
|
1814
|
-
const
|
|
1815
|
-
this.stagedCmdlineText =
|
|
1812
|
+
const i = e[0], s = Math.max(0, Number(e[1] ?? 0) || 0), n = typeof e[2] == "string" ? e[2] : "", r = typeof e[3] == "string" ? e[3] : "", l = Math.max(0, Number(e[4] ?? 0) || 0), c = r || n || "", u = " ".repeat(l), d = $(i), f = `${u}${c}${d}`, p = W(`${u}${c}`), m = W(d);
|
|
1813
|
+
this.cmdlineCursorOffsetBytes = p, this.cmdlineCursorContentBytes = m;
|
|
1814
|
+
const v = s <= m ? this.cmdlineCursorOffsetBytes + s : s;
|
|
1815
|
+
this.stagedCmdlineText = f, this.stagedCmdlineCursorByte = v, this.stagedSearchRefresh = !0;
|
|
1816
1816
|
return;
|
|
1817
1817
|
}
|
|
1818
1818
|
if (t === "cmdline_pos") {
|
|
@@ -1827,26 +1827,26 @@ end)(unpack(_A))`;
|
|
|
1827
1827
|
if (t === "msg_show") {
|
|
1828
1828
|
const i = typeof e[0] == "string" ? e[0] : "";
|
|
1829
1829
|
if (i === "return_prompt") return;
|
|
1830
|
-
const s = e[1], n = !!e[2],
|
|
1831
|
-
if (i === "empty" && !
|
|
1830
|
+
const s = e[1], n = !!e[2], r = !!e[4], l = $(s);
|
|
1831
|
+
if (i === "empty" && !l) {
|
|
1832
1832
|
this.stagedMessageText = null;
|
|
1833
1833
|
return;
|
|
1834
1834
|
}
|
|
1835
|
-
if (!
|
|
1836
|
-
const
|
|
1837
|
-
if (
|
|
1838
|
-
this.stagedMessageText = `${
|
|
1835
|
+
if (!l) return;
|
|
1836
|
+
const c = this.stagedMessageText !== void 0 ? this.stagedMessageText ?? "" : this.messageEl?.textContent ?? "";
|
|
1837
|
+
if (r && c) {
|
|
1838
|
+
this.stagedMessageText = `${c}${l}`;
|
|
1839
1839
|
return;
|
|
1840
1840
|
}
|
|
1841
1841
|
if (n) {
|
|
1842
|
-
this.stagedMessageText =
|
|
1842
|
+
this.stagedMessageText = l;
|
|
1843
1843
|
return;
|
|
1844
1844
|
}
|
|
1845
|
-
this.stagedMessageText =
|
|
1845
|
+
this.stagedMessageText = l;
|
|
1846
1846
|
return;
|
|
1847
1847
|
}
|
|
1848
1848
|
if (t === "msg_showmode" || t === "msg_showcmd" || t === "msg_ruler") {
|
|
1849
|
-
const i = e[0], s =
|
|
1849
|
+
const i = e[0], s = $(i);
|
|
1850
1850
|
this.stagedMessageText = s || null;
|
|
1851
1851
|
return;
|
|
1852
1852
|
}
|
|
@@ -1855,7 +1855,7 @@ end)(unpack(_A))`;
|
|
|
1855
1855
|
return;
|
|
1856
1856
|
}
|
|
1857
1857
|
if (t === "popupmenu_show") {
|
|
1858
|
-
const i = e[0], s = Number(e[1] ?? -1), n =
|
|
1858
|
+
const i = e[0], s = Number(e[1] ?? -1), n = Te(i);
|
|
1859
1859
|
this.stagedPopupItems = n, this.stagedPopupSelected = Number.isFinite(s) ? s : -1;
|
|
1860
1860
|
return;
|
|
1861
1861
|
}
|
|
@@ -1871,24 +1871,24 @@ end)(unpack(_A))`;
|
|
|
1871
1871
|
}
|
|
1872
1872
|
}
|
|
1873
1873
|
computeLinePatch(t, e, i, s) {
|
|
1874
|
-
const n = t.getLineCount(),
|
|
1875
|
-
let
|
|
1874
|
+
const n = t.getLineCount(), r = Math.min(e, n), l = Math.min(i, n), c = new b.Position(n, t.getLineMaxColumn(n)), d = l >= n && s.length === 0 && r > 0 ? new b.Position(r, t.getLineMaxColumn(r)) : r < n ? new b.Position(r + 1, 1) : c, f = l < n ? new b.Position(l + 1, 1) : c;
|
|
1875
|
+
let p = s.join(`
|
|
1876
1876
|
`);
|
|
1877
|
-
return e >= n && i >= n && s.length > 0 && (
|
|
1878
|
-
${
|
|
1879
|
-
`), { range: new
|
|
1877
|
+
return e >= n && i >= n && s.length > 0 && (p = `
|
|
1878
|
+
${p}`), i < n && s.length > 0 && (p += `
|
|
1879
|
+
`), { range: new b.Range(d.lineNumber, d.column, f.lineNumber, f.column), text: p };
|
|
1880
1880
|
}
|
|
1881
1881
|
applyLinePatch(t, e, i, s) {
|
|
1882
|
-
const n = this.lastCursorPos ?? this.editor.getPosition() ?? new
|
|
1882
|
+
const n = this.lastCursorPos ?? this.editor.getPosition() ?? new b.Position(1, 1), r = this.computeLinePatch(t, e, i, s);
|
|
1883
1883
|
try {
|
|
1884
|
-
if (t.getValueInRange(
|
|
1884
|
+
if (t.getValueInRange(r.range) === r.text) return;
|
|
1885
1885
|
} catch {
|
|
1886
1886
|
}
|
|
1887
|
-
if (this.suppressCursorSync = !0, this.applyingFromNvim = !0, t.applyEdits([{ range:
|
|
1888
|
-
const
|
|
1889
|
-
if (
|
|
1887
|
+
if (this.suppressCursorSync = !0, this.applyingFromNvim = !0, t.applyEdits([{ range: r.range, text: r.text }]), this.applyingFromNvim = !1, n && this.editor.setPosition(n), this.suppressCursorSync = !1, this.delegateInsertToMonaco) {
|
|
1888
|
+
const l = this.getActiveState();
|
|
1889
|
+
if (l && l.model === t)
|
|
1890
1890
|
try {
|
|
1891
|
-
|
|
1891
|
+
l.shadowLines = t.getLinesContent();
|
|
1892
1892
|
} catch {
|
|
1893
1893
|
}
|
|
1894
1894
|
}
|
|
@@ -1962,7 +1962,7 @@ ${u}`), i < n && s.length > 0 && (u += `
|
|
|
1962
1962
|
this.cmdlineEl.textContent = this.cmdlineTextRaw, this.cmdlineCursorByte = null;
|
|
1963
1963
|
return;
|
|
1964
1964
|
}
|
|
1965
|
-
const e = this.cmdlineTextRaw, i = Math.max(0, Math.min(Number(t) || 0,
|
|
1965
|
+
const e = this.cmdlineTextRaw, i = Math.max(0, Math.min(Number(t) || 0, W(e))), s = Math.max(0, Math.min(e.length, L(e, i)));
|
|
1966
1966
|
this.cmdlineCursorByte = i, this.cmdlineEl.textContent = `${e.slice(0, s)}▏${e.slice(s)}`;
|
|
1967
1967
|
}
|
|
1968
1968
|
setMessage(t) {
|
|
@@ -1996,10 +1996,10 @@ ${u}`), i < n && s.length > 0 && (u += `
|
|
|
1996
1996
|
for (let i = 0; i < t.length; i += 1) {
|
|
1997
1997
|
const s = t[i], n = document.createElement("div");
|
|
1998
1998
|
n.style.padding = "2px 10px", n.style.display = "flex", n.style.gap = "10px", n.style.justifyContent = "space-between", n.style.background = i === e ? "rgba(255,255,255,0.12)" : "transparent";
|
|
1999
|
-
const
|
|
2000
|
-
|
|
2001
|
-
const
|
|
2002
|
-
|
|
1999
|
+
const r = document.createElement("span");
|
|
2000
|
+
r.textContent = s.word ?? "";
|
|
2001
|
+
const l = document.createElement("span");
|
|
2002
|
+
l.style.opacity = "0.7", l.textContent = s.menu ?? s.kind ?? "", n.appendChild(r), n.appendChild(l), this.popupEl.appendChild(n);
|
|
2003
2003
|
}
|
|
2004
2004
|
this.popupEl.style.display = "block";
|
|
2005
2005
|
}
|
|
@@ -2027,10 +2027,10 @@ ${u}`), i < n && s.length > 0 && (u += `
|
|
|
2027
2027
|
} catch {
|
|
2028
2028
|
}
|
|
2029
2029
|
if (i === "wrappedLine" && (e === "down" || e === "up")) {
|
|
2030
|
-
const
|
|
2031
|
-
for (let
|
|
2030
|
+
const l = e === "down" ? "cursorDown" : "cursorUp";
|
|
2031
|
+
for (let c = 0; c < s; c += 1)
|
|
2032
2032
|
try {
|
|
2033
|
-
this.editor.trigger("monaco-neovim-wasm",
|
|
2033
|
+
this.editor.trigger("monaco-neovim-wasm", l, null);
|
|
2034
2034
|
} catch {
|
|
2035
2035
|
}
|
|
2036
2036
|
return !0;
|
|
@@ -2038,8 +2038,8 @@ ${u}`), i < n && s.length > 0 && (u += `
|
|
|
2038
2038
|
return !1;
|
|
2039
2039
|
};
|
|
2040
2040
|
this.suppressCursorSync = !0, n();
|
|
2041
|
-
const
|
|
2042
|
-
|
|
2041
|
+
const r = this.editor.getPosition();
|
|
2042
|
+
r && (this.lastCursorPos = r, this.applyScrolloff(r)), this.suppressCursorSync = !1, this.requestSearchHighlightRefresh();
|
|
2043
2043
|
}
|
|
2044
2044
|
getScrolloffLines() {
|
|
2045
2045
|
return this.opts.scrolloff != null ? Math.max(0, Math.floor(this.opts.scrolloff)) : this.opts.syncScrolloff ? Math.max(0, Math.floor(this.nvimScrolloff)) : 0;
|
|
@@ -2050,89 +2050,89 @@ ${u}`), i < n && s.length > 0 && (u += `
|
|
|
2050
2050
|
if (e <= 0) return !1;
|
|
2051
2051
|
const i = t ?? this.editor.getPosition();
|
|
2052
2052
|
if (!i) return !1;
|
|
2053
|
-
const s = Math.max(1, Number(this.editor.getOption(
|
|
2053
|
+
const s = Math.max(1, Number(this.editor.getOption(b.editor.EditorOption.lineHeight)) || 0), n = e * s;
|
|
2054
2054
|
if (n <= 0) return !1;
|
|
2055
|
-
let
|
|
2055
|
+
let r = 0;
|
|
2056
2056
|
try {
|
|
2057
|
-
const
|
|
2058
|
-
|
|
2057
|
+
const v = this.editor.getLayoutInfo();
|
|
2058
|
+
r = Math.max(0, Number(v?.contentHeight ?? v?.height ?? 0) || 0);
|
|
2059
2059
|
} catch {
|
|
2060
2060
|
}
|
|
2061
|
-
if (
|
|
2062
|
-
const
|
|
2061
|
+
if (r <= 0) return !1;
|
|
2062
|
+
const l = () => {
|
|
2063
2063
|
try {
|
|
2064
2064
|
this.editor.revealPositionInCenterIfOutsideViewport(i);
|
|
2065
2065
|
} catch {
|
|
2066
2066
|
}
|
|
2067
2067
|
};
|
|
2068
|
-
let
|
|
2068
|
+
let c = null;
|
|
2069
2069
|
try {
|
|
2070
|
-
|
|
2070
|
+
c = this.editor.getScrolledVisiblePosition(i);
|
|
2071
2071
|
} catch {
|
|
2072
2072
|
}
|
|
2073
|
-
if (!
|
|
2074
|
-
|
|
2073
|
+
if (!c) {
|
|
2074
|
+
l();
|
|
2075
2075
|
try {
|
|
2076
|
-
|
|
2076
|
+
c = this.editor.getScrolledVisiblePosition(i);
|
|
2077
2077
|
} catch {
|
|
2078
2078
|
}
|
|
2079
2079
|
}
|
|
2080
|
-
if (!
|
|
2081
|
-
const
|
|
2080
|
+
if (!c || !Number.isFinite(c.top) || !Number.isFinite(c.height)) return !1;
|
|
2081
|
+
const u = this.editor.getScrollTop(), d = c.top, f = c.top + c.height, p = Math.max(0, r - n);
|
|
2082
2082
|
let m = 0;
|
|
2083
|
-
if (
|
|
2083
|
+
if (d < n ? m = d - n : f > p && (m = f - p), !m) return !1;
|
|
2084
2084
|
try {
|
|
2085
|
-
this.editor.setScrollTop(Math.max(0,
|
|
2085
|
+
this.editor.setScrollTop(Math.max(0, u + m));
|
|
2086
2086
|
} catch {
|
|
2087
2087
|
}
|
|
2088
2088
|
return !0;
|
|
2089
2089
|
}
|
|
2090
2090
|
applyMonacoScroll(t) {
|
|
2091
|
-
const e = typeof t.by == "string" ? t.by : "", i = typeof t.direction == "string" ? t.direction : "", s = Math.max(1, Number(t.value ?? 1) || 1), n = !!t.moveCursor,
|
|
2092
|
-
let
|
|
2093
|
-
if (e === "page")
|
|
2094
|
-
else if (e === "halfPage")
|
|
2095
|
-
else if (e === "line")
|
|
2091
|
+
const e = typeof t.by == "string" ? t.by : "", i = typeof t.direction == "string" ? t.direction : "", s = Math.max(1, Number(t.value ?? 1) || 1), n = !!t.moveCursor, r = typeof t.cursorBy == "string" ? t.cursorBy : "wrappedLine", l = Math.max(3, this.uiRows || this.opts.rows), c = this.editor.getOption(b.editor.EditorOption.fontInfo), u = Math.max(1, Number(c?.lineHeight ?? 0) || 0), d = Math.max(1, l - 2), f = Math.max(1, Math.floor(d / 2));
|
|
2092
|
+
let p = s;
|
|
2093
|
+
if (e === "page") p = d * s;
|
|
2094
|
+
else if (e === "halfPage") p = f * s;
|
|
2095
|
+
else if (e === "line") p = s;
|
|
2096
2096
|
else return !1;
|
|
2097
2097
|
const m = i === "up" ? -1 : i === "down" ? 1 : 0;
|
|
2098
2098
|
if (!m) return !1;
|
|
2099
2099
|
this.suppressCursorSync = !0;
|
|
2100
2100
|
try {
|
|
2101
|
-
const
|
|
2102
|
-
this.editor.setScrollTop(
|
|
2101
|
+
const _ = this.editor.getScrollTop(), w = Math.max(0, _ + m * p * u);
|
|
2102
|
+
this.editor.setScrollTop(w);
|
|
2103
2103
|
} catch {
|
|
2104
2104
|
}
|
|
2105
|
-
let
|
|
2105
|
+
let v = !1;
|
|
2106
2106
|
if (n)
|
|
2107
2107
|
try {
|
|
2108
2108
|
this.applyMonacoCursorMove({
|
|
2109
2109
|
to: m > 0 ? "down" : "up",
|
|
2110
|
-
by:
|
|
2111
|
-
value:
|
|
2112
|
-
}),
|
|
2110
|
+
by: r,
|
|
2111
|
+
value: p
|
|
2112
|
+
}), v = !0;
|
|
2113
2113
|
} catch {
|
|
2114
2114
|
}
|
|
2115
|
-
return this.suppressCursorSync = !1,
|
|
2115
|
+
return this.suppressCursorSync = !1, v;
|
|
2116
2116
|
}
|
|
2117
2117
|
applyMonacoReveal(t) {
|
|
2118
2118
|
const e = typeof t.direction == "string" ? t.direction : "", i = !!t.resetCursor, s = this.editor.getPosition();
|
|
2119
2119
|
if (!s) return !1;
|
|
2120
|
-
const n = s.lineNumber,
|
|
2120
|
+
const n = s.lineNumber, r = Math.max(1, this.uiRows || this.opts.rows), l = this.editor.getOption(b.editor.EditorOption.fontInfo), c = Math.max(1, Number(l?.lineHeight ?? 0) || 0);
|
|
2121
2121
|
this.suppressCursorSync = !0;
|
|
2122
2122
|
try {
|
|
2123
2123
|
if (e === "top") {
|
|
2124
|
-
const
|
|
2125
|
-
this.editor.setScrollTop(
|
|
2124
|
+
const u = this.editor.getTopForLineNumber(n);
|
|
2125
|
+
this.editor.setScrollTop(u);
|
|
2126
2126
|
} else if (e === "center")
|
|
2127
2127
|
this.editor.revealLineInCenter(n);
|
|
2128
2128
|
else if (e === "bottom") {
|
|
2129
|
-
const
|
|
2130
|
-
this.editor.setScrollTop(
|
|
2129
|
+
const u = this.editor.getTopForLineNumber(n), d = Math.max(0, u - (r - 1) * c);
|
|
2130
|
+
this.editor.setScrollTop(d);
|
|
2131
2131
|
}
|
|
2132
2132
|
if (i) {
|
|
2133
|
-
const
|
|
2134
|
-
if (
|
|
2135
|
-
const
|
|
2133
|
+
const u = this.editor.getModel();
|
|
2134
|
+
if (u) {
|
|
2135
|
+
const d = u.getLineContent(n) ?? "", f = /\S/.exec(d), p = f ? f.index + 1 : 1, m = u.validatePosition(new b.Position(n, p));
|
|
2136
2136
|
this.editor.setPosition(m), this.lastCursorPos = m;
|
|
2137
2137
|
}
|
|
2138
2138
|
}
|
|
@@ -2146,30 +2146,30 @@ ${u}`), i < n && s.length > 0 && (u += `
|
|
|
2146
2146
|
const i = this.editor.getModel();
|
|
2147
2147
|
if (!i) return;
|
|
2148
2148
|
const s = Math.max(1, Number(t.value ?? 1) || 1);
|
|
2149
|
-
let n = 1,
|
|
2149
|
+
let n = 1, r = i.getLineCount();
|
|
2150
2150
|
try {
|
|
2151
|
-
const
|
|
2152
|
-
|
|
2151
|
+
const p = this.editor.getVisibleRanges();
|
|
2152
|
+
p && p.length && (n = Math.min(...p.map((m) => m.startLineNumber)), r = Math.max(...p.map((m) => m.endLineNumber)));
|
|
2153
2153
|
} catch {
|
|
2154
2154
|
}
|
|
2155
|
-
n = Math.max(1, Math.min(n, i.getLineCount())),
|
|
2156
|
-
let
|
|
2155
|
+
n = Math.max(1, Math.min(n, i.getLineCount())), r = Math.max(1, Math.min(r, i.getLineCount())), r < n && (r = n);
|
|
2156
|
+
let l = n;
|
|
2157
2157
|
if (e === "top")
|
|
2158
|
-
|
|
2158
|
+
l = n + (s - 1);
|
|
2159
2159
|
else if (e === "middle")
|
|
2160
|
-
|
|
2160
|
+
l = Math.floor((n + r) / 2);
|
|
2161
2161
|
else if (e === "bottom")
|
|
2162
|
-
|
|
2162
|
+
l = r - (s - 1);
|
|
2163
2163
|
else
|
|
2164
2164
|
return;
|
|
2165
|
-
|
|
2166
|
-
const
|
|
2165
|
+
l = Math.max(n, Math.min(r, l));
|
|
2166
|
+
const c = i.getLineContent(l) ?? "", u = /\S/.exec(c), d = u ? u.index + 1 : 1, f = i.validatePosition(new b.Position(l, d));
|
|
2167
2167
|
this.suppressCursorSync = !0;
|
|
2168
2168
|
try {
|
|
2169
|
-
this.editor.setPosition(
|
|
2169
|
+
this.editor.setPosition(f);
|
|
2170
2170
|
} catch {
|
|
2171
2171
|
}
|
|
2172
|
-
this.lastCursorPos =
|
|
2172
|
+
this.lastCursorPos = f, this.suppressCursorSync = !1;
|
|
2173
2173
|
}
|
|
2174
2174
|
syncTabstopFromMonaco() {
|
|
2175
2175
|
const t = this.editor.getModel();
|
|
@@ -2194,100 +2194,100 @@ ${u}`), i < n && s.length > 0 && (u += `
|
|
|
2194
2194
|
initTextInputListeners() {
|
|
2195
2195
|
const t = this.editor.getDomNode();
|
|
2196
2196
|
if (!t) return;
|
|
2197
|
-
const e = t.ownerDocument || document, i = e.defaultView || window, s = (
|
|
2197
|
+
const e = t.ownerDocument || document, i = e.defaultView || window, s = (a) => {
|
|
2198
2198
|
try {
|
|
2199
|
-
|
|
2199
|
+
a.stopImmediatePropagation?.();
|
|
2200
2200
|
} catch {
|
|
2201
2201
|
}
|
|
2202
2202
|
try {
|
|
2203
|
-
|
|
2203
|
+
a.stopPropagation();
|
|
2204
2204
|
} catch {
|
|
2205
2205
|
}
|
|
2206
|
-
}, n = (
|
|
2206
|
+
}, n = (a) => {
|
|
2207
2207
|
try {
|
|
2208
2208
|
if (typeof this.editor.hasTextFocus == "function" ? !!this.editor.hasTextFocus() : !1) return !0;
|
|
2209
|
-
const
|
|
2210
|
-
if (
|
|
2211
|
-
const
|
|
2212
|
-
return !!(
|
|
2209
|
+
const g = a.target;
|
|
2210
|
+
if (g && t.contains(g)) return !0;
|
|
2211
|
+
const y = e.activeElement;
|
|
2212
|
+
return !!(y && t.contains(y));
|
|
2213
2213
|
} catch {
|
|
2214
2214
|
return !1;
|
|
2215
2215
|
}
|
|
2216
|
-
},
|
|
2216
|
+
}, r = (a) => {
|
|
2217
2217
|
try {
|
|
2218
|
-
const
|
|
2219
|
-
return !
|
|
2218
|
+
const h = a;
|
|
2219
|
+
return !h || typeof h.tagName != "string" ? null : h;
|
|
2220
2220
|
} catch {
|
|
2221
2221
|
return null;
|
|
2222
2222
|
}
|
|
2223
|
-
},
|
|
2224
|
-
if (!n(
|
|
2225
|
-
const
|
|
2226
|
-
if (
|
|
2227
|
-
if (
|
|
2228
|
-
if (!this.opts.shouldHandleKey(
|
|
2229
|
-
s(
|
|
2223
|
+
}, l = (a) => {
|
|
2224
|
+
if (!n(a) || this.compositionActive || a.isComposing || a.getModifierState?.("AltGraph")) return;
|
|
2225
|
+
const h = this.delegateInsertToMonaco && !this.exitingInsertMode;
|
|
2226
|
+
if (h) {
|
|
2227
|
+
if (a.key === "Escape") {
|
|
2228
|
+
if (!this.opts.shouldHandleKey(a)) return;
|
|
2229
|
+
s(a);
|
|
2230
2230
|
try {
|
|
2231
|
-
|
|
2231
|
+
a.preventDefault();
|
|
2232
2232
|
} catch {
|
|
2233
2233
|
}
|
|
2234
|
-
if (this.compositionActive ||
|
|
2234
|
+
if (this.compositionActive || a.isComposing) {
|
|
2235
2235
|
this.pendingEscAfterComposition = !0;
|
|
2236
2236
|
return;
|
|
2237
2237
|
}
|
|
2238
2238
|
this.exitDelegatedInsertMode("<Esc>");
|
|
2239
2239
|
return;
|
|
2240
2240
|
}
|
|
2241
|
-
const
|
|
2242
|
-
(
|
|
2243
|
-
}
|
|
2244
|
-
if (!
|
|
2245
|
-
if (!this.opts.shouldHandleKey(
|
|
2246
|
-
const
|
|
2247
|
-
if (!
|
|
2248
|
-
s(
|
|
2241
|
+
const C = a.key;
|
|
2242
|
+
(C === "ArrowLeft" || C === "ArrowRight" || C === "ArrowUp" || C === "ArrowDown" || C === "Home" || C === "End" || C === "PageUp" || C === "PageDown" || C === "Tab" || C === "Enter") && (this.delegatedInsertReplayPossible = !1);
|
|
2243
|
+
}
|
|
2244
|
+
if (!h && (a.key === "Backspace" || a.key === "Delete" || a.key === "Escape")) {
|
|
2245
|
+
if (!this.opts.shouldHandleKey(a)) return;
|
|
2246
|
+
const C = this.opts.translateKey(a);
|
|
2247
|
+
if (!C) return;
|
|
2248
|
+
s(a);
|
|
2249
2249
|
try {
|
|
2250
|
-
|
|
2250
|
+
a.preventDefault();
|
|
2251
2251
|
} catch {
|
|
2252
2252
|
}
|
|
2253
|
-
if (this.exitingInsertMode &&
|
|
2254
|
-
this.exitingInsertMode ? this.pendingKeysAfterExit +=
|
|
2253
|
+
if (this.exitingInsertMode && C === "<Esc>") return;
|
|
2254
|
+
this.exitingInsertMode ? this.pendingKeysAfterExit += C : this.sendInput(C);
|
|
2255
2255
|
return;
|
|
2256
2256
|
}
|
|
2257
|
-
if (
|
|
2258
|
-
const
|
|
2259
|
-
if (!!!(
|
|
2260
|
-
if (!this.opts.shouldHandleKey(
|
|
2261
|
-
s(
|
|
2257
|
+
if (A(this.lastMode) && !this.delegateInsertToMonaco && !this.exitingInsertMode && !a.ctrlKey && !a.metaKey && typeof a.key == "string" && a.key.length === 1) {
|
|
2258
|
+
const C = /^[\x20-\x7E]$/.test(a.key);
|
|
2259
|
+
if (!!!(a.altKey && C)) {
|
|
2260
|
+
if (!this.opts.shouldHandleKey(a)) return;
|
|
2261
|
+
s(a);
|
|
2262
2262
|
return;
|
|
2263
2263
|
}
|
|
2264
2264
|
}
|
|
2265
|
-
if (!
|
|
2266
|
-
const
|
|
2267
|
-
if (!
|
|
2268
|
-
if (this.hasExplicitModAllowlist(
|
|
2269
|
-
if (!this.shouldForwardModifiedKeys(
|
|
2270
|
-
} else if (
|
|
2271
|
-
const
|
|
2272
|
-
if (
|
|
2273
|
-
s(
|
|
2265
|
+
if (!a.ctrlKey && !a.altKey && !a.metaKey) return;
|
|
2266
|
+
const g = this.modifiedKeyName(a);
|
|
2267
|
+
if (!g || !this.opts.shouldHandleKey(a)) return;
|
|
2268
|
+
if (this.hasExplicitModAllowlist(h)) {
|
|
2269
|
+
if (!this.shouldForwardModifiedKeys(a, h)) return;
|
|
2270
|
+
} else if (h || !a.ctrlKey || a.altKey || a.metaKey || g !== "f" && g !== "b" && g !== "d" && g !== "u" && g !== "e" && g !== "y" && g !== "v") return;
|
|
2271
|
+
const y = this.opts.translateKey(a);
|
|
2272
|
+
if (y) {
|
|
2273
|
+
s(a);
|
|
2274
2274
|
try {
|
|
2275
|
-
|
|
2275
|
+
a.preventDefault();
|
|
2276
2276
|
} catch {
|
|
2277
2277
|
}
|
|
2278
|
-
this.exitingInsertMode ? (this.debugLog(`keydown(capture) buffer: key=${JSON.stringify(
|
|
2278
|
+
this.exitingInsertMode ? (this.debugLog(`keydown(capture) buffer: key=${JSON.stringify(a.key)} code=${JSON.stringify(a.code)} mods=${a.ctrlKey ? "C" : ""}${a.altKey ? "A" : ""}${a.metaKey ? "D" : ""}${a.shiftKey ? "S" : ""} -> ${y}`), this.pendingKeysAfterExit += y) : h && (y === "<C-[>" || y === "<C-c>") ? (this.debugLog(`keydown(capture) exit insert: key=${JSON.stringify(a.key)} code=${JSON.stringify(a.code)} mods=${a.ctrlKey ? "C" : ""}${a.altKey ? "A" : ""}${a.metaKey ? "D" : ""}${a.shiftKey ? "S" : ""} -> ${y}`), this.exitDelegatedInsertMode(y)) : (h && this.flushPendingMonacoSync(), this.debugLog(`keydown(capture) send: key=${JSON.stringify(a.key)} code=${JSON.stringify(a.code)} mods=${a.ctrlKey ? "C" : ""}${a.altKey ? "A" : ""}${a.metaKey ? "D" : ""}${a.shiftKey ? "S" : ""} -> ${y}`), this.sendInput(y));
|
|
2279
2279
|
}
|
|
2280
|
-
},
|
|
2281
|
-
if (n(
|
|
2280
|
+
}, c = (a) => {
|
|
2281
|
+
if (n(a)) {
|
|
2282
2282
|
if (this.compositionActive = !0, this.debugLog(`compositionstart delegateInsert=${this.delegateInsertToMonaco} mode=${JSON.stringify(this.lastMode)}`), this.delegateInsertToMonaco) {
|
|
2283
2283
|
this.setPreedit(null);
|
|
2284
2284
|
return;
|
|
2285
2285
|
}
|
|
2286
2286
|
this.setPreedit("");
|
|
2287
2287
|
}
|
|
2288
|
-
},
|
|
2289
|
-
if (!n(
|
|
2290
|
-
if (this.compositionActive = !1, this.setPreedit(null), this.debugLog(`compositionend delegateInsert=${this.delegateInsertToMonaco} mode=${JSON.stringify(this.lastMode)} data=${JSON.stringify(
|
|
2288
|
+
}, u = (a) => {
|
|
2289
|
+
if (!n(a)) return;
|
|
2290
|
+
if (this.compositionActive = !1, this.setPreedit(null), this.debugLog(`compositionend delegateInsert=${this.delegateInsertToMonaco} mode=${JSON.stringify(this.lastMode)} data=${JSON.stringify(a.data ?? "")}`), this.delegateInsertToMonaco) {
|
|
2291
2291
|
if (this.pendingEscAfterComposition) {
|
|
2292
2292
|
this.pendingEscAfterComposition = !1, this.exitDelegatedInsertMode("<Esc>");
|
|
2293
2293
|
return;
|
|
@@ -2295,185 +2295,185 @@ ${u}`), i < n && s.length > 0 && (u += `
|
|
|
2295
2295
|
this.exitingInsertMode || this.scheduleCursorSyncToNvim();
|
|
2296
2296
|
return;
|
|
2297
2297
|
}
|
|
2298
|
-
const
|
|
2299
|
-
if (
|
|
2300
|
-
const
|
|
2301
|
-
|
|
2298
|
+
const h = r(a.target);
|
|
2299
|
+
if (P(this.lastMode) && !A(this.lastMode)) {
|
|
2300
|
+
const g = typeof a.data == "string" ? a.data : "", y = !g && h && h.tagName === "TEXTAREA" && h.value ? String(h.value) : !g && h?.textContent ? String(h.textContent) : "", C = g || y;
|
|
2301
|
+
C && this.sendImeText(C);
|
|
2302
2302
|
}
|
|
2303
|
-
if (
|
|
2304
|
-
const
|
|
2305
|
-
|
|
2303
|
+
if (A(this.lastMode)) {
|
|
2304
|
+
const g = typeof a.data == "string" ? a.data : "", y = !g && h && h.tagName === "TEXTAREA" && h.value ? String(h.value) : !g && h?.textContent ? String(h.textContent) : "", C = g || y;
|
|
2305
|
+
C && this.sendImeText(C);
|
|
2306
2306
|
}
|
|
2307
2307
|
try {
|
|
2308
|
-
|
|
2308
|
+
h && h.tagName === "TEXTAREA" ? h.value = "" : h && (h.textContent = "");
|
|
2309
2309
|
} catch {
|
|
2310
2310
|
}
|
|
2311
2311
|
this.pendingResyncAfterComposition && (this.pendingResyncAfterComposition = !1, this.scheduleResync());
|
|
2312
|
-
},
|
|
2313
|
-
if (!n(
|
|
2314
|
-
const
|
|
2315
|
-
this.setPreedit(
|
|
2316
|
-
},
|
|
2317
|
-
if (!n(
|
|
2318
|
-
const
|
|
2319
|
-
s(
|
|
2320
|
-
try {
|
|
2321
|
-
|
|
2322
|
-
} catch {
|
|
2323
|
-
}
|
|
2324
|
-
if (
|
|
2325
|
-
const
|
|
2326
|
-
if (!
|
|
2327
|
-
if (
|
|
2328
|
-
|
|
2312
|
+
}, d = (a) => {
|
|
2313
|
+
if (!n(a) || (this.compositionActive || (this.compositionActive = !0), this.delegateInsertToMonaco)) return;
|
|
2314
|
+
const h = r(a.target), g = typeof a.data == "string" ? a.data : h && h.tagName === "TEXTAREA" && h.value ? String(h.value) : h?.textContent ? String(h.textContent) : "";
|
|
2315
|
+
this.setPreedit(g || "");
|
|
2316
|
+
}, f = (a) => {
|
|
2317
|
+
if (!n(a) || this.delegateInsertToMonaco && !this.exitingInsertMode) return;
|
|
2318
|
+
const h = r(a.target);
|
|
2319
|
+
s(a);
|
|
2320
|
+
try {
|
|
2321
|
+
a.preventDefault?.();
|
|
2322
|
+
} catch {
|
|
2323
|
+
}
|
|
2324
|
+
if (P(this.lastMode) && !this.compositionActive) {
|
|
2325
|
+
const g = a, y = typeof g.inputType == "string" ? String(g.inputType) : "", C = !!g.isComposing, M = typeof g.data == "string" ? g.data : "";
|
|
2326
|
+
if (!C && !y.includes("Composition")) {
|
|
2327
|
+
if (y === "insertText" || y === "insertReplacementText" || y === "insertFromDrop") {
|
|
2328
|
+
M && (this.armIgnoreNextInputEvent(g.target, 120), this.sendImeText(M));
|
|
2329
2329
|
try {
|
|
2330
|
-
|
|
2330
|
+
h?.tagName === "TEXTAREA" ? h.value = "" : h && (h.textContent = "");
|
|
2331
2331
|
} catch {
|
|
2332
2332
|
}
|
|
2333
2333
|
return;
|
|
2334
2334
|
}
|
|
2335
|
-
if (
|
|
2336
|
-
this.armIgnoreNextInputEvent(
|
|
2335
|
+
if (y === "insertLineBreak" || y === "insertParagraph") {
|
|
2336
|
+
this.armIgnoreNextInputEvent(g.target, 120), this.sendInput("<CR>");
|
|
2337
2337
|
try {
|
|
2338
|
-
|
|
2338
|
+
h?.tagName === "TEXTAREA" ? h.value = "" : h && (h.textContent = "");
|
|
2339
2339
|
} catch {
|
|
2340
2340
|
}
|
|
2341
2341
|
return;
|
|
2342
2342
|
}
|
|
2343
|
-
if (
|
|
2344
|
-
this.armIgnoreNextInputEvent(
|
|
2343
|
+
if (y === "deleteContentBackward") {
|
|
2344
|
+
this.armIgnoreNextInputEvent(g.target, 120), this.sendInput("<BS>");
|
|
2345
2345
|
try {
|
|
2346
|
-
|
|
2346
|
+
h?.tagName === "TEXTAREA" ? h.value = "" : h && (h.textContent = "");
|
|
2347
2347
|
} catch {
|
|
2348
2348
|
}
|
|
2349
2349
|
return;
|
|
2350
2350
|
}
|
|
2351
|
-
if (
|
|
2352
|
-
this.armIgnoreNextInputEvent(
|
|
2351
|
+
if (y === "deleteContentForward") {
|
|
2352
|
+
this.armIgnoreNextInputEvent(g.target, 120), this.sendInput("<Del>");
|
|
2353
2353
|
try {
|
|
2354
|
-
|
|
2354
|
+
h?.tagName === "TEXTAREA" ? h.value = "" : h && (h.textContent = "");
|
|
2355
2355
|
} catch {
|
|
2356
2356
|
}
|
|
2357
2357
|
return;
|
|
2358
2358
|
}
|
|
2359
2359
|
}
|
|
2360
2360
|
}
|
|
2361
|
-
if (
|
|
2362
|
-
const
|
|
2363
|
-
!
|
|
2361
|
+
if (A(this.lastMode) && !this.compositionActive) {
|
|
2362
|
+
const g = a, y = typeof g.data == "string" ? g.data : "", C = typeof g.inputType == "string" ? String(g.inputType) : "";
|
|
2363
|
+
!g.isComposing && !C.includes("Composition") && y && this.sendImeText(y);
|
|
2364
2364
|
}
|
|
2365
|
-
},
|
|
2366
|
-
if (!n(
|
|
2367
|
-
const
|
|
2368
|
-
s(
|
|
2369
|
-
const
|
|
2370
|
-
if (this.shouldIgnoreNextInputEvent(
|
|
2365
|
+
}, p = (a) => {
|
|
2366
|
+
if (!n(a) || this.delegateInsertToMonaco && !this.exitingInsertMode) return;
|
|
2367
|
+
const h = r(a.target);
|
|
2368
|
+
s(a);
|
|
2369
|
+
const g = a;
|
|
2370
|
+
if (this.shouldIgnoreNextInputEvent(g.target)) {
|
|
2371
2371
|
this.clearIgnoreNextInputEvent();
|
|
2372
2372
|
try {
|
|
2373
|
-
|
|
2373
|
+
h?.tagName === "TEXTAREA" ? h.value = "" : h && (h.textContent = "");
|
|
2374
2374
|
} catch {
|
|
2375
2375
|
}
|
|
2376
2376
|
return;
|
|
2377
2377
|
}
|
|
2378
2378
|
if (!this.compositionActive) {
|
|
2379
|
-
if (
|
|
2380
|
-
const
|
|
2381
|
-
|
|
2379
|
+
if (P(this.lastMode) && !A(this.lastMode)) {
|
|
2380
|
+
const y = typeof g.data == "string" ? g.data : "", C = !y && h?.tagName === "TEXTAREA" && h.value ? String(h.value) : !y && h?.textContent ? String(h.textContent) : "", M = y || C;
|
|
2381
|
+
M && (this.armIgnoreNextInputEvent(g.target, 120), this.sendImeText(M));
|
|
2382
2382
|
}
|
|
2383
|
-
if (
|
|
2384
|
-
const
|
|
2385
|
-
|
|
2383
|
+
if (A(this.lastMode)) {
|
|
2384
|
+
const y = typeof g.data == "string" ? g.data : "", C = !y && h?.tagName === "TEXTAREA" && h.value ? String(h.value) : !y && h?.textContent ? String(h.textContent) : "", M = y || C;
|
|
2385
|
+
M && this.sendImeText(M);
|
|
2386
2386
|
}
|
|
2387
2387
|
try {
|
|
2388
|
-
|
|
2388
|
+
h?.tagName === "TEXTAREA" ? h.value = "" : h && (h.textContent = "");
|
|
2389
2389
|
} catch {
|
|
2390
2390
|
}
|
|
2391
2391
|
}
|
|
2392
|
-
}, m = (
|
|
2393
|
-
if (!n(
|
|
2394
|
-
const
|
|
2395
|
-
s(
|
|
2396
|
-
const
|
|
2397
|
-
|
|
2392
|
+
}, m = (a) => {
|
|
2393
|
+
if (!n(a) || this.delegateInsertToMonaco && !this.exitingInsertMode) return;
|
|
2394
|
+
const h = r(a.target);
|
|
2395
|
+
s(a);
|
|
2396
|
+
const g = a.clipboardData?.getData("text/plain") ?? "";
|
|
2397
|
+
g && (a.preventDefault(), this.armIgnoreNextInputEvent(a.target, 150), this.pasteText(g));
|
|
2398
2398
|
try {
|
|
2399
|
-
|
|
2399
|
+
h?.tagName === "TEXTAREA" ? h.value = "" : h && (h.textContent = "");
|
|
2400
2400
|
} catch {
|
|
2401
2401
|
}
|
|
2402
2402
|
};
|
|
2403
|
-
let
|
|
2404
|
-
const
|
|
2403
|
+
let v = !1, _ = "left", w = null, x = "", S = null;
|
|
2404
|
+
const N = (a) => `${a.shiftKey ? "S" : ""}${a.ctrlKey ? "C" : ""}${a.altKey ? "A" : ""}${a.metaKey ? "D" : ""}`, D = (a) => a.button === 1 ? "middle" : a.button === 2 ? "right" : "left", R = (a) => {
|
|
2405
2405
|
try {
|
|
2406
|
-
const
|
|
2407
|
-
return
|
|
2406
|
+
const y = this.editor.getTargetAtClientPoint?.(a.clientX, a.clientY)?.position;
|
|
2407
|
+
return y ? new b.Position(y.lineNumber, y.column) : null;
|
|
2408
2408
|
} catch {
|
|
2409
2409
|
return null;
|
|
2410
2410
|
}
|
|
2411
|
-
},
|
|
2412
|
-
|
|
2413
|
-
},
|
|
2414
|
-
if (!n(
|
|
2415
|
-
const
|
|
2416
|
-
if (
|
|
2417
|
-
s(
|
|
2411
|
+
}, E = () => {
|
|
2412
|
+
S = null, v && w && (this.ignoreSelectionSyncUntil = this.nowMs() + 200, this.sendNvimMouse(_, "drag", x, w));
|
|
2413
|
+
}, Y = (a) => {
|
|
2414
|
+
if (!n(a) || this.delegateInsertToMonaco && !this.exitingInsertMode || this.compositionActive || a.isComposing || a.button !== 0 && a.button !== 1 && a.button !== 2) return;
|
|
2415
|
+
const h = R(a);
|
|
2416
|
+
if (h) {
|
|
2417
|
+
s(a);
|
|
2418
2418
|
try {
|
|
2419
|
-
|
|
2419
|
+
a.preventDefault();
|
|
2420
2420
|
} catch {
|
|
2421
2421
|
}
|
|
2422
2422
|
try {
|
|
2423
2423
|
this.editor.focus();
|
|
2424
2424
|
} catch {
|
|
2425
2425
|
}
|
|
2426
|
-
|
|
2426
|
+
v = !0, _ = D(a), x = N(a), w = h, S && (clearTimeout(S), S = null), this.ignoreSelectionSyncUntil = this.nowMs() + 250, this.sendNvimMouse(_, "press", x, h);
|
|
2427
2427
|
}
|
|
2428
|
-
},
|
|
2429
|
-
if (!
|
|
2430
|
-
const
|
|
2431
|
-
if (
|
|
2432
|
-
s(
|
|
2428
|
+
}, Z = (a) => {
|
|
2429
|
+
if (!v || !n(a) || this.delegateInsertToMonaco && !this.exitingInsertMode || this.compositionActive || a.isComposing) return;
|
|
2430
|
+
const h = R(a);
|
|
2431
|
+
if (h) {
|
|
2432
|
+
s(a);
|
|
2433
2433
|
try {
|
|
2434
|
-
|
|
2434
|
+
a.preventDefault();
|
|
2435
2435
|
} catch {
|
|
2436
2436
|
}
|
|
2437
|
-
|
|
2438
|
-
}
|
|
2439
|
-
}, ee = (
|
|
2440
|
-
if (!
|
|
2441
|
-
|
|
2442
|
-
const
|
|
2443
|
-
if (
|
|
2444
|
-
const
|
|
2445
|
-
if (
|
|
2446
|
-
if (
|
|
2447
|
-
s(
|
|
2437
|
+
x = N(a), w = h, !S && (S = window.setTimeout(E, 16));
|
|
2438
|
+
}
|
|
2439
|
+
}, ee = (a) => {
|
|
2440
|
+
if (!v) return;
|
|
2441
|
+
v = !1;
|
|
2442
|
+
const h = n(a);
|
|
2443
|
+
if (h && this.delegateInsertToMonaco && !this.exitingInsertMode) return;
|
|
2444
|
+
const g = R(a) ?? w;
|
|
2445
|
+
if (g) {
|
|
2446
|
+
if (h) {
|
|
2447
|
+
s(a);
|
|
2448
2448
|
try {
|
|
2449
|
-
|
|
2449
|
+
a.preventDefault();
|
|
2450
2450
|
} catch {
|
|
2451
2451
|
}
|
|
2452
2452
|
}
|
|
2453
|
-
|
|
2453
|
+
S && (clearTimeout(S), S = null), x = N(a), w = g, this.ignoreSelectionSyncUntil = this.nowMs() + 250, this.sendNvimMouse(_, "release", x, g);
|
|
2454
2454
|
}
|
|
2455
|
-
}, te = (
|
|
2456
|
-
if (n(
|
|
2457
|
-
s(
|
|
2455
|
+
}, te = (a) => {
|
|
2456
|
+
if (n(a) && !(this.delegateInsertToMonaco && !this.exitingInsertMode)) {
|
|
2457
|
+
s(a);
|
|
2458
2458
|
try {
|
|
2459
|
-
|
|
2459
|
+
a.preventDefault();
|
|
2460
2460
|
} catch {
|
|
2461
2461
|
}
|
|
2462
2462
|
}
|
|
2463
2463
|
};
|
|
2464
2464
|
this.disposables.push(
|
|
2465
2465
|
// Capture phase to ensure we see events even if Monaco stops propagation.
|
|
2466
|
-
|
|
2467
|
-
|
|
2468
|
-
|
|
2469
|
-
|
|
2470
|
-
|
|
2471
|
-
|
|
2472
|
-
|
|
2473
|
-
|
|
2474
|
-
|
|
2475
|
-
|
|
2476
|
-
|
|
2466
|
+
I(i, "keydown", l, !0),
|
|
2467
|
+
I(i, "beforeinput", f, !0),
|
|
2468
|
+
I(i, "input", p, !0),
|
|
2469
|
+
I(i, "paste", m, !0),
|
|
2470
|
+
I(i, "mousedown", Y, !0),
|
|
2471
|
+
I(i, "mousemove", Z, !0),
|
|
2472
|
+
I(i, "mouseup", ee, !0),
|
|
2473
|
+
I(i, "contextmenu", te, !0),
|
|
2474
|
+
I(i, "compositionstart", c, !0),
|
|
2475
|
+
I(i, "compositionupdate", d, !0),
|
|
2476
|
+
I(i, "compositionend", u, !0)
|
|
2477
2477
|
);
|
|
2478
2478
|
}
|
|
2479
2479
|
scheduleResync() {
|
|
@@ -2495,7 +2495,7 @@ ${u}`), i < n && s.length > 0 && (u += `
|
|
|
2495
2495
|
const i = (t && t.length ? t : [""]).join(`
|
|
2496
2496
|
`);
|
|
2497
2497
|
if (e.getValue() === i) return;
|
|
2498
|
-
const s = this.lastCursorPos ?? this.editor.getPosition() ?? new
|
|
2498
|
+
const s = this.lastCursorPos ?? this.editor.getPosition() ?? new b.Position(1, 1);
|
|
2499
2499
|
if (this.suppressCursorSync = !0, this.applyingFromNvim = !0, e.setValue(i), this.applyingFromNvim = !1, s && this.editor.setPosition(s), this.suppressCursorSync = !1, this.delegateInsertToMonaco) {
|
|
2500
2500
|
const n = this.getActiveState();
|
|
2501
2501
|
if (n && n.model === e)
|
|
@@ -2569,35 +2569,35 @@ ${u}`), i < n && s.length > 0 && (u += `
|
|
|
2569
2569
|
let s = 0, n = 0;
|
|
2570
2570
|
if (i && t !== i)
|
|
2571
2571
|
try {
|
|
2572
|
-
const
|
|
2573
|
-
s = Number.isFinite(
|
|
2572
|
+
const d = i.getBoundingClientRect(), f = t.getBoundingClientRect();
|
|
2573
|
+
s = Number.isFinite(f.left - d.left) ? f.left - d.left : 0, n = Number.isFinite(f.top - d.top) ? f.top - d.top : 0;
|
|
2574
2574
|
} catch {
|
|
2575
2575
|
}
|
|
2576
|
-
const
|
|
2577
|
-
if (
|
|
2576
|
+
const r = Array.isArray(this.visualVirtualRawRanges) ? this.visualVirtualRawRanges : [];
|
|
2577
|
+
if (r.length === 0) {
|
|
2578
2578
|
try {
|
|
2579
2579
|
t.replaceChildren();
|
|
2580
2580
|
} catch {
|
|
2581
2581
|
}
|
|
2582
2582
|
return;
|
|
2583
2583
|
}
|
|
2584
|
-
const
|
|
2585
|
-
for (const
|
|
2586
|
-
const
|
|
2587
|
-
if (!Number.isFinite(
|
|
2588
|
-
const
|
|
2589
|
-
if (
|
|
2590
|
-
const
|
|
2591
|
-
if (!
|
|
2592
|
-
const
|
|
2593
|
-
if (
|
|
2594
|
-
const
|
|
2595
|
-
if (!Number.isFinite(
|
|
2596
|
-
const
|
|
2597
|
-
|
|
2584
|
+
const l = this.editor.getOption(b.editor.EditorOption.fontInfo), c = Math.max(1, Number(l?.typicalHalfwidthCharacterWidth ?? l?.maxDigitWidth ?? 0) || 0), u = document.createDocumentFragment();
|
|
2585
|
+
for (const d of r) {
|
|
2586
|
+
const f = Number(d?.start?.line), p = Number(d?.start_vcol), m = Number(d?.end_vcol), v = Number(d?.disp);
|
|
2587
|
+
if (!Number.isFinite(f) || !Number.isFinite(p) || !Number.isFinite(m) || !Number.isFinite(v)) continue;
|
|
2588
|
+
const _ = f + 1;
|
|
2589
|
+
if (_ < 1 || _ > e.getLineCount()) continue;
|
|
2590
|
+
const w = Math.min(p, m), x = Math.max(p, m), S = this.editor.getScrolledVisiblePosition(new b.Position(_, 1));
|
|
2591
|
+
if (!S) continue;
|
|
2592
|
+
const N = x - w + 1;
|
|
2593
|
+
if (N <= 0) continue;
|
|
2594
|
+
const D = S.left + Math.max(0, w - 1) * c, R = N * c;
|
|
2595
|
+
if (!Number.isFinite(R) || R <= 0) continue;
|
|
2596
|
+
const E = document.createElement("div");
|
|
2597
|
+
E.className = "monaco-neovim-visual-virtual", E.style.left = `${Math.max(0, D - s)}px`, E.style.top = `${Math.max(0, S.top - n)}px`, E.style.width = `${R}px`, E.style.height = `${Math.max(0, S.height)}px`, u.appendChild(E);
|
|
2598
2598
|
}
|
|
2599
2599
|
try {
|
|
2600
|
-
t.replaceChildren(
|
|
2600
|
+
t.replaceChildren(u);
|
|
2601
2601
|
} catch {
|
|
2602
2602
|
}
|
|
2603
2603
|
}
|
|
@@ -2651,11 +2651,11 @@ ${u}`), i < n && s.length > 0 && (u += `
|
|
|
2651
2651
|
let e = 1, i = t.getLineCount();
|
|
2652
2652
|
try {
|
|
2653
2653
|
const n = this.editor.getVisibleRanges();
|
|
2654
|
-
n && n.length && (e = Math.min(...n.map((
|
|
2654
|
+
n && n.length && (e = Math.min(...n.map((r) => r.startLineNumber)), i = Math.max(...n.map((r) => r.endLineNumber)));
|
|
2655
2655
|
} catch {
|
|
2656
2656
|
}
|
|
2657
2657
|
e = Math.max(1, Math.min(e, t.getLineCount())), i = Math.max(1, Math.min(i, t.getLineCount()));
|
|
2658
|
-
const s = await this.execLua(
|
|
2658
|
+
const s = await this.execLua(be, [e, i]);
|
|
2659
2659
|
this.applySearchHighlights(s, t);
|
|
2660
2660
|
} catch {
|
|
2661
2661
|
}
|
|
@@ -2672,63 +2672,63 @@ ${u}`), i < n && s.length > 0 && (u += `
|
|
|
2672
2672
|
this.clearSearchHighlights();
|
|
2673
2673
|
return;
|
|
2674
2674
|
}
|
|
2675
|
-
const n = Array.isArray(i.matches) ? i.matches : [],
|
|
2676
|
-
if (
|
|
2677
|
-
const m = e.getLineContent(
|
|
2678
|
-
return
|
|
2675
|
+
const n = Array.isArray(i.matches) ? i.matches : [], r = i.current && typeof i.current == "object" ? i.current : null, l = r && Number.isFinite(Number(r.l)) ? `${Number(r.l)}:${Number(r.s)}:${Number(r.e)}` : null, c = [], u = 2e3, d = /* @__PURE__ */ new Map(), f = (p) => {
|
|
2676
|
+
if (d.has(p)) return d.get(p);
|
|
2677
|
+
const m = e.getLineContent(p) ?? "";
|
|
2678
|
+
return d.set(p, m), m;
|
|
2679
2679
|
};
|
|
2680
|
-
for (let
|
|
2681
|
-
const m = n[
|
|
2682
|
-
if (!Number.isFinite(
|
|
2683
|
-
const
|
|
2684
|
-
if (
|
|
2685
|
-
const
|
|
2686
|
-
if (
|
|
2687
|
-
const
|
|
2688
|
-
|
|
2689
|
-
range: new
|
|
2690
|
-
options: { inlineClassName:
|
|
2680
|
+
for (let p = 0; p < n.length && c.length < u; p += 1) {
|
|
2681
|
+
const m = n[p], v = Number(m?.l), _ = Number(m?.s), w = Number(m?.e);
|
|
2682
|
+
if (!Number.isFinite(v) || !Number.isFinite(_) || !Number.isFinite(w)) continue;
|
|
2683
|
+
const x = v + 1;
|
|
2684
|
+
if (x < 1 || x > e.getLineCount()) continue;
|
|
2685
|
+
const S = f(x), N = L(S, Math.max(0, _)) + 1, D = L(S, Math.max(0, w)) + 1;
|
|
2686
|
+
if (D <= N) continue;
|
|
2687
|
+
const R = `${v}:${_}:${w}`, E = l && R === l ? "monaco-neovim-search-current" : "monaco-neovim-search-match";
|
|
2688
|
+
c.push({
|
|
2689
|
+
range: new b.Range(x, N, x, D),
|
|
2690
|
+
options: { inlineClassName: E }
|
|
2691
2691
|
});
|
|
2692
2692
|
}
|
|
2693
2693
|
this.ensureSearchStyle();
|
|
2694
2694
|
try {
|
|
2695
|
-
this.searchDecorationIds = this.editor.deltaDecorations(this.searchDecorationIds,
|
|
2695
|
+
this.searchDecorationIds = this.editor.deltaDecorations(this.searchDecorationIds, c);
|
|
2696
2696
|
} catch {
|
|
2697
2697
|
this.searchDecorationIds = [];
|
|
2698
2698
|
}
|
|
2699
2699
|
}
|
|
2700
2700
|
applyVisualDecorations(t, e, i = [], s = "") {
|
|
2701
2701
|
this.ensureVisualStyle();
|
|
2702
|
-
const n = typeof s == "string" && s ? s :
|
|
2703
|
-
if (
|
|
2704
|
-
let
|
|
2705
|
-
for (const
|
|
2706
|
-
const
|
|
2707
|
-
|
|
2708
|
-
}
|
|
2709
|
-
Number.isFinite(
|
|
2710
|
-
range: new
|
|
2702
|
+
const n = typeof s == "string" && s ? s : Ne(e), r = n === "V", l = n === "", c = [];
|
|
2703
|
+
if (r) {
|
|
2704
|
+
let u = 1 / 0, d = -1 / 0;
|
|
2705
|
+
for (const f of t) {
|
|
2706
|
+
const p = f.getStartPosition(), m = f.getEndPosition();
|
|
2707
|
+
u = Math.min(u, p.lineNumber, m.lineNumber), d = Math.max(d, p.lineNumber, m.lineNumber);
|
|
2708
|
+
}
|
|
2709
|
+
Number.isFinite(u) && Number.isFinite(d) && d >= u && c.push({
|
|
2710
|
+
range: new b.Range(u, 1, d, 1),
|
|
2711
2711
|
options: { isWholeLine: !0, className: "monaco-neovim-visual-line" }
|
|
2712
2712
|
});
|
|
2713
|
-
} else if (!
|
|
2714
|
-
for (const
|
|
2715
|
-
const
|
|
2716
|
-
|
|
2717
|
-
range:
|
|
2713
|
+
} else if (!l)
|
|
2714
|
+
for (const u of t) {
|
|
2715
|
+
const d = u.getStartPosition(), f = u.getEndPosition();
|
|
2716
|
+
c.push({
|
|
2717
|
+
range: b.Range.fromPositions(d, f),
|
|
2718
2718
|
options: { className: "monaco-neovim-visual-inline" }
|
|
2719
2719
|
});
|
|
2720
2720
|
}
|
|
2721
|
-
|
|
2721
|
+
l ? (this.visualVirtualRawRanges = Array.isArray(i) ? i : [], this.visualVirtualActive = !0, this.renderVisualVirtualOverlay()) : this.clearVisualVirtualOverlay();
|
|
2722
2722
|
try {
|
|
2723
|
-
this.visualDecorationIds = this.editor.deltaDecorations(this.visualDecorationIds,
|
|
2723
|
+
this.visualDecorationIds = this.editor.deltaDecorations(this.visualDecorationIds, c), this.visualSelectionActive = c.length > 0 || l;
|
|
2724
2724
|
} catch {
|
|
2725
2725
|
this.visualDecorationIds = [], this.visualSelectionActive = !1;
|
|
2726
2726
|
}
|
|
2727
2727
|
if (this.visualSelectionActive && !this.compositionActive) {
|
|
2728
|
-
const
|
|
2729
|
-
if (
|
|
2728
|
+
const u = this.editor.getPosition();
|
|
2729
|
+
if (u)
|
|
2730
2730
|
try {
|
|
2731
|
-
this.suppressCursorSync = !0, this.editor.setSelection(new
|
|
2731
|
+
this.suppressCursorSync = !0, this.editor.setSelection(new b.Selection(u.lineNumber, u.column, u.lineNumber, u.column));
|
|
2732
2732
|
} catch {
|
|
2733
2733
|
} finally {
|
|
2734
2734
|
this.suppressCursorSync = !1;
|
|
@@ -2736,45 +2736,45 @@ ${u}`), i < n && s.length > 0 && (u += `
|
|
|
2736
2736
|
}
|
|
2737
2737
|
}
|
|
2738
2738
|
applyNvimMode(t, e) {
|
|
2739
|
-
const i = typeof t == "string" ? t : "", s = e == null ? this.nvimBlocking : !!e, n = !!(i && i !== this.lastMode),
|
|
2740
|
-
if (!n && !
|
|
2741
|
-
const
|
|
2742
|
-
n && (this.lastMode = i,
|
|
2743
|
-
const
|
|
2744
|
-
if (
|
|
2745
|
-
this.delegateInsertToMonaco =
|
|
2746
|
-
const
|
|
2747
|
-
if (
|
|
2739
|
+
const i = typeof t == "string" ? t : "", s = e == null ? this.nvimBlocking : !!e, n = !!(i && i !== this.lastMode), r = s !== this.nvimBlocking;
|
|
2740
|
+
if (!n && !r) return;
|
|
2741
|
+
const l = this.lastMode;
|
|
2742
|
+
n && (this.lastMode = i, A(i) && (this.ignoreNextInputEvent = !1), this.setMonacoHighlightsSuppressed(k(i))), this.nvimBlocking = s;
|
|
2743
|
+
const c = P(this.lastMode) && !this.recordingRegister && !this.nvimBlocking;
|
|
2744
|
+
if (c !== this.delegateInsertToMonaco) {
|
|
2745
|
+
this.delegateInsertToMonaco = c, this.setEditorReadOnly(!c);
|
|
2746
|
+
const u = this.ensureActiveState();
|
|
2747
|
+
if (c) {
|
|
2748
2748
|
this.setPreedit(null), this.dotRepeatKeys = "", this.dotRepeatBackspaces = 0, this.delegatedInsertReplayPossible = !0;
|
|
2749
2749
|
{
|
|
2750
|
-
const
|
|
2751
|
-
if (
|
|
2750
|
+
const d = this.recentNormalKeys, f = d.slice(-1), p = d.slice(-2), m = /* @__PURE__ */ new Set(["i", "a", "I", "A", "o", "O", "s", "S", "C", "R"]);
|
|
2751
|
+
if (p === "cc")
|
|
2752
2752
|
this.lastDelegatedInsertPrefix = "cc";
|
|
2753
|
-
else if (m.has(
|
|
2754
|
-
this.lastDelegatedInsertPrefix =
|
|
2753
|
+
else if (m.has(f))
|
|
2754
|
+
this.lastDelegatedInsertPrefix = f;
|
|
2755
2755
|
else {
|
|
2756
|
-
const
|
|
2757
|
-
if (
|
|
2758
|
-
let
|
|
2759
|
-
for (;
|
|
2760
|
-
this.lastDelegatedInsertPrefix =
|
|
2756
|
+
const v = d.lastIndexOf("c");
|
|
2757
|
+
if (v >= 0) {
|
|
2758
|
+
let _ = v;
|
|
2759
|
+
for (; _ > 0 && /\d/.test(d[_ - 1] ?? ""); ) _ -= 1;
|
|
2760
|
+
this.lastDelegatedInsertPrefix = d.slice(_);
|
|
2761
2761
|
} else
|
|
2762
2762
|
this.lastDelegatedInsertPrefix = null;
|
|
2763
2763
|
}
|
|
2764
2764
|
}
|
|
2765
|
-
|
|
2765
|
+
u && (u.shadowLines = this.editor.getModel()?.getLinesContent() ?? null, u.pendingBufEdits = [], u.pendingFullSync = !1, u.pendingCursorSync = !1);
|
|
2766
2766
|
} else
|
|
2767
|
-
|
|
2767
|
+
u && ((u.pendingBufEdits.length || u.pendingCursorSync || u.pendingFullSync) && this.flushPendingMonacoSync(), u.shadowLines = null, u.pendingBufEdits = [], u.pendingFullSync = !1, u.pendingCursorSync = !1), this.dotRepeatKeys = "", this.dotRepeatBackspaces = 0, this.delegatedInsertReplayPossible = !1;
|
|
2768
2768
|
}
|
|
2769
|
-
if (this.exitingInsertMode && !
|
|
2769
|
+
if (this.exitingInsertMode && !P(this.lastMode)) {
|
|
2770
2770
|
this.exitInsertTimer && (clearTimeout(this.exitInsertTimer), this.exitInsertTimer = null), this.exitingInsertMode = !1;
|
|
2771
|
-
const
|
|
2772
|
-
this.pendingKeysAfterExit = "",
|
|
2771
|
+
const u = this.pendingKeysAfterExit;
|
|
2772
|
+
this.pendingKeysAfterExit = "", u && this.sendInput(u);
|
|
2773
2773
|
}
|
|
2774
|
-
if (n && (this.applyCursorStyle(i), this.opts.onModeChange && this.opts.onModeChange(i), this.updateVisualSelection(i)), n &&
|
|
2774
|
+
if (n && (this.applyCursorStyle(i), this.opts.onModeChange && this.opts.onModeChange(i), this.updateVisualSelection(i)), n && k(l) && !k(i))
|
|
2775
2775
|
try {
|
|
2776
|
-
const
|
|
2777
|
-
|
|
2776
|
+
const u = this.editor.getPosition() ?? this.lastCursorPos;
|
|
2777
|
+
u && !this.compositionActive && (this.suppressCursorSync = !0, this.editor.setSelection(new b.Selection(u.lineNumber, u.column, u.lineNumber, u.column)), this.suppressCursorSync = !1);
|
|
2778
2778
|
} catch {
|
|
2779
2779
|
this.suppressCursorSync = !1;
|
|
2780
2780
|
}
|
|
@@ -2815,7 +2815,7 @@ ${u}`), i < n && s.length > 0 && (u += `
|
|
|
2815
2815
|
try {
|
|
2816
2816
|
const e = this.editor.getModel(), i = this.editor.getPosition();
|
|
2817
2817
|
if (e && i) {
|
|
2818
|
-
const s = e.getLineContent(i.lineNumber) ?? "", n =
|
|
2818
|
+
const s = e.getLineContent(i.lineNumber) ?? "", n = T(s, Math.max(0, i.column - 1));
|
|
2819
2819
|
this.ignoreInsertExitCursor = { line: i.lineNumber, col0: n, untilMs: this.nowMs() + 400 }, this.debugLog(`exitDelegatedInsertMode: sync cursor before exit: line=${i.lineNumber} col=${i.column} (byteCol0=${n})`), await this.rpcCall("nvim_win_set_cursor", [0, [i.lineNumber, n]]);
|
|
2820
2820
|
}
|
|
2821
2821
|
} catch {
|
|
@@ -2927,7 +2927,7 @@ vim.opt.ei = ei
|
|
|
2927
2927
|
}
|
|
2928
2928
|
return;
|
|
2929
2929
|
}
|
|
2930
|
-
if (
|
|
2930
|
+
if (A(this.lastMode) && !this.compositionActive && !e.isComposing && !e.getModifierState?.("AltGraph") && !e.ctrlKey && !e.metaKey && typeof e.key == "string" && e.key.length === 1) {
|
|
2931
2931
|
const s = /^[\x20-\x7E]$/.test(e.key);
|
|
2932
2932
|
if (!!!(e.altKey && s))
|
|
2933
2933
|
return this.opts.shouldHandleKey(e), void 0;
|
|
@@ -2938,7 +2938,7 @@ vim.opt.ei = ei
|
|
|
2938
2938
|
this.compositionActive = !0;
|
|
2939
2939
|
return;
|
|
2940
2940
|
}
|
|
2941
|
-
if (this.compositionActive || e.isComposing || !this.opts.shouldHandleKey(e) || this.hasExplicitModAllowlist(!1) && !this.shouldForwardModifiedKeys(e, !1) ||
|
|
2941
|
+
if (this.compositionActive || e.isComposing || !this.opts.shouldHandleKey(e) || this.hasExplicitModAllowlist(!1) && !this.shouldForwardModifiedKeys(e, !1) || P(this.lastMode) && !this.delegateInsertToMonaco && !this.exitingInsertMode && !e.ctrlKey && !e.metaKey && !e.altKey && (e.key === "Dead" || typeof e.key == "string" && e.key.length === 1))
|
|
2942
2942
|
return;
|
|
2943
2943
|
const i = this.opts.translateKey(e);
|
|
2944
2944
|
if (i) {
|
|
@@ -2950,19 +2950,19 @@ vim.opt.ei = ei
|
|
|
2950
2950
|
}
|
|
2951
2951
|
this.lastDelegatedDotRepeat && (/* @__PURE__ */ new Set(["c", "d", "y", "p", "x", "s", "r", "~", "J", ":"])).has(i) && (this.lastDelegatedDotRepeat = null);
|
|
2952
2952
|
}
|
|
2953
|
-
!
|
|
2953
|
+
!P(this.lastMode) && i.length === 1 && !i.startsWith("<") && (this.recentNormalKeys = (this.recentNormalKeys + i).slice(-16)), this.sendInput(i);
|
|
2954
2954
|
}
|
|
2955
2955
|
}
|
|
2956
2956
|
handleMouse(t) {
|
|
2957
2957
|
if (this.delegateInsertToMonaco || !this.bufHandle || !t.target?.position) return;
|
|
2958
|
-
const { lineNumber: e, column: i } = t.target.position, s = this.editor.getModel(), n = Math.max(0, i - 1),
|
|
2959
|
-
this.sendNotify("nvim_win_set_cursor", [0, [e,
|
|
2958
|
+
const { lineNumber: e, column: i } = t.target.position, s = this.editor.getModel(), n = Math.max(0, i - 1), r = s ? s.getLineContent(e) ?? "" : "", l = s ? T(r, n) : n;
|
|
2959
|
+
this.sendNotify("nvim_win_set_cursor", [0, [e, l]]);
|
|
2960
2960
|
}
|
|
2961
2961
|
async sendNvimMouse(t, e, i, s) {
|
|
2962
2962
|
if (!this.session || !this.session.isRunning() || !this.bufHandle) return;
|
|
2963
2963
|
const n = this.editor.getModel();
|
|
2964
2964
|
if (!n) return;
|
|
2965
|
-
const
|
|
2965
|
+
const r = Math.max(1, Number(s.lineNumber) || 1), l = Math.max(0, Number(s.column) - 1 || 0), c = n.getLineContent(r) ?? "", u = T(c, l), d = String(i ?? ""), f = String(t ?? "left"), p = String(e ?? "press"), m = `
|
|
2966
2966
|
local api, fn = vim.api, vim.fn
|
|
2967
2967
|
local button, action, mods, lnum, col0 = ...
|
|
2968
2968
|
pcall(api.nvim_win_set_cursor, 0, { lnum, col0 })
|
|
@@ -2971,7 +2971,7 @@ local col = (fn.wincol() or 1) - 1
|
|
|
2971
2971
|
pcall(api.nvim_input_mouse, button, action, mods, 0, row, col)
|
|
2972
2972
|
`;
|
|
2973
2973
|
try {
|
|
2974
|
-
await this.execLua(m, [
|
|
2974
|
+
await this.execLua(m, [f, p, d, r, u]);
|
|
2975
2975
|
} catch {
|
|
2976
2976
|
}
|
|
2977
2977
|
}
|
|
@@ -2980,10 +2980,10 @@ pcall(api.nvim_input_mouse, button, action, mods, 0, row, col)
|
|
|
2980
2980
|
const e = t.selection;
|
|
2981
2981
|
if (e && t.source === "mouse") {
|
|
2982
2982
|
if (e.isEmpty()) {
|
|
2983
|
-
|
|
2983
|
+
k(this.lastMode) && this.sendInput("<Esc>");
|
|
2984
2984
|
return;
|
|
2985
2985
|
}
|
|
2986
|
-
this.pendingSelection = new
|
|
2986
|
+
this.pendingSelection = new b.Selection(
|
|
2987
2987
|
e.selectionStartLineNumber,
|
|
2988
2988
|
e.selectionStartColumn,
|
|
2989
2989
|
e.positionLineNumber,
|
|
@@ -3000,7 +3000,7 @@ pcall(api.nvim_input_mouse, button, action, mods, 0, row, col)
|
|
|
3000
3000
|
if (this.delegateInsertToMonaco || !this.session || !this.session.isRunning() || !this.bufHandle) return;
|
|
3001
3001
|
const e = this.editor.getModel();
|
|
3002
3002
|
if (!e) return;
|
|
3003
|
-
const i = t.selectionStartLineNumber, s = Math.max(0, t.selectionStartColumn - 1), n = t.positionLineNumber,
|
|
3003
|
+
const i = t.selectionStartLineNumber, s = Math.max(0, t.selectionStartColumn - 1), n = t.positionLineNumber, r = Math.max(0, t.positionColumn - 1), l = e.getLineContent(i) ?? "", c = e.getLineContent(n) ?? "", u = T(l, s), d = T(c, r);
|
|
3004
3004
|
await this.execLua(`
|
|
3005
3005
|
local api = vim.api
|
|
3006
3006
|
local fn = vim.fn
|
|
@@ -3013,7 +3013,7 @@ end
|
|
|
3013
3013
|
api.nvim_win_set_cursor(0, { a_line, a_col0 })
|
|
3014
3014
|
api.nvim_feedkeys("v", "n", false)
|
|
3015
3015
|
api.nvim_win_set_cursor(0, { b_line, b_col0 })
|
|
3016
|
-
`, [i,
|
|
3016
|
+
`, [i, u, n, d]);
|
|
3017
3017
|
}
|
|
3018
3018
|
sendInput(t) {
|
|
3019
3019
|
this.sendNotify("nvim_input", [t]);
|
|
@@ -3086,20 +3086,20 @@ api.nvim_win_set_cursor(0, { b_line, b_col0 })
|
|
|
3086
3086
|
i.pendingFullSync = !0, i.pendingCursorSync = !0, i.shadowLines = e.getLinesContent(), this.dotRepeatKeys = "", this.dotRepeatBackspaces = 0, this.delegatedInsertReplayPossible = !1, this.scheduleFlushPendingMonacoSync();
|
|
3087
3087
|
return;
|
|
3088
3088
|
}
|
|
3089
|
-
const s = t.changes[0], n = s.range,
|
|
3090
|
-
if (
|
|
3091
|
-
if (i.shadowLines[
|
|
3089
|
+
const s = t.changes[0], n = s.range, r = n.startLineNumber - 1, l = n.endLineNumber - 1;
|
|
3090
|
+
if (r < 0 || l < 0) return;
|
|
3091
|
+
if (i.shadowLines[r] == null || i.shadowLines[l] == null) {
|
|
3092
3092
|
i.pendingFullSync = !0, i.pendingCursorSync = !0, i.shadowLines = e.getLinesContent(), this.dotRepeatKeys = "", this.dotRepeatBackspaces = 0, this.delegatedInsertReplayPossible = !1, this.scheduleFlushPendingMonacoSync();
|
|
3093
3093
|
return;
|
|
3094
3094
|
}
|
|
3095
|
-
const
|
|
3095
|
+
const c = i.shadowLines[r] ?? "", u = i.shadowLines[l] ?? "", d = Math.max(0, n.startColumn - 1), f = Math.max(0, n.endColumn - 1), p = T(c, d), m = T(u, f), v = String(s.text ?? ""), _ = v.length ? v.split(/\r?\n/) : [];
|
|
3096
3096
|
try {
|
|
3097
|
-
const
|
|
3098
|
-
|
|
3099
|
-
`) ? (
|
|
3097
|
+
const w = Math.max(0, Number(s.rangeLength ?? 0) || 0);
|
|
3098
|
+
r === l && !v.includes(`
|
|
3099
|
+
`) ? (w > 0 && (this.dotRepeatBackspaces += w, this.dotRepeatKeys += "<BS>".repeat(w)), v && (this.dotRepeatKeys += z(v, !0)), this.dotRepeatKeys.length > 2e4 && (this.dotRepeatKeys = "", this.dotRepeatBackspaces = 0, this.delegatedInsertReplayPossible = !1)) : (this.dotRepeatKeys = "", this.dotRepeatBackspaces = 0, this.delegatedInsertReplayPossible = !1);
|
|
3100
3100
|
} catch {
|
|
3101
3101
|
}
|
|
3102
|
-
i.pendingBufEdits.push({ startRow:
|
|
3102
|
+
i.pendingBufEdits.push({ startRow: r, startColByte: p, endRow: l, endColByte: m, lines: _ }), Re(i.shadowLines, r, d, l, f, v), i.pendingCursorSync = !0, this.scheduleFlushPendingMonacoSync();
|
|
3103
3103
|
}
|
|
3104
3104
|
scheduleCursorSyncToNvim() {
|
|
3105
3105
|
if (!this.delegateInsertToMonaco || this.exitingInsertMode) return;
|
|
@@ -3134,8 +3134,8 @@ api.nvim_win_set_cursor(0, { b_line, b_col0 })
|
|
|
3134
3134
|
if (!this.session || !this.session.isRunning() || !this.bufHandle || !t && !this.delegateInsertToMonaco) return;
|
|
3135
3135
|
const e = this.editor.getModel(), i = this.editor.getPosition();
|
|
3136
3136
|
if (!e || !i) return;
|
|
3137
|
-
const s = i.lineNumber, n = e.getLineContent(s) ?? "",
|
|
3138
|
-
this.sendNotify("nvim_win_set_cursor", [0, [s,
|
|
3137
|
+
const s = i.lineNumber, n = e.getLineContent(s) ?? "", r = T(n, Math.max(0, i.column - 1));
|
|
3138
|
+
this.sendNotify("nvim_win_set_cursor", [0, [s, r]]);
|
|
3139
3139
|
}
|
|
3140
3140
|
scheduleVisualSelectionRefresh() {
|
|
3141
3141
|
this.visualSelectionRefreshTimer || (this.visualSelectionRefreshTimer = window.setTimeout(() => {
|
|
@@ -3148,7 +3148,7 @@ api.nvim_win_set_cursor(0, { b_line, b_col0 })
|
|
|
3148
3148
|
const t = await this.rpcCall("nvim_get_api_info", []), e = Array.isArray(t) ? Number(t[0]) : NaN;
|
|
3149
3149
|
if (!Number.isFinite(e) || e <= 0) return;
|
|
3150
3150
|
this.nvimChannelId = e;
|
|
3151
|
-
const i = this.opts.wrappedLineMotions ? "true" : "false", s = this.opts.scrollMotions ? "true" : "false", n = this.opts.syncScrolloff && this.opts.scrolloff == null ? "true" : "false",
|
|
3151
|
+
const i = this.opts.wrappedLineMotions ? "true" : "false", s = this.opts.scrollMotions ? "true" : "false", n = this.opts.syncScrolloff && this.opts.scrolloff == null ? "true" : "false", r = this.opts.hostCommands ? "true" : "false", c = `
|
|
3152
3152
|
local chan = ...
|
|
3153
3153
|
local api = vim.api
|
|
3154
3154
|
vim.g.monaco_neovim_wasm_chan = chan
|
|
@@ -3207,7 +3207,7 @@ end
|
|
|
3207
3207
|
if ${s} then
|
|
3208
3208
|
pcall(vim.cmd, "silent! source $HOME/.config/nvim/monaco-neovim-wasm/scrolling.vim")
|
|
3209
3209
|
end
|
|
3210
|
-
if ${
|
|
3210
|
+
if ${r} then
|
|
3211
3211
|
pcall(vim.cmd, "silent! source $HOME/.config/nvim/monaco-neovim-wasm/host-commands.vim")
|
|
3212
3212
|
end
|
|
3213
3213
|
|
|
@@ -3263,7 +3263,7 @@ vim.rpcnotify(chan, "monaco_buf_enter", {
|
|
|
3263
3263
|
filetype = (vim.bo[api.nvim_get_current_buf()] and vim.bo[api.nvim_get_current_buf()].filetype) or "",
|
|
3264
3264
|
})
|
|
3265
3265
|
`;
|
|
3266
|
-
await this.execLua(
|
|
3266
|
+
await this.execLua(c, [e]), this.hostAutocmdInstalled = !0;
|
|
3267
3267
|
} catch {
|
|
3268
3268
|
}
|
|
3269
3269
|
}
|
|
@@ -3294,42 +3294,42 @@ vim.rpcnotify(chan, "monaco_buf_enter", {
|
|
|
3294
3294
|
return;
|
|
3295
3295
|
}
|
|
3296
3296
|
try {
|
|
3297
|
-
const
|
|
3298
|
-
if (
|
|
3299
|
-
const
|
|
3300
|
-
await this.openText({ path: n, text:
|
|
3301
|
-
} catch (
|
|
3302
|
-
this.opts.status(`edit failed: ${
|
|
3297
|
+
const r = await s.readFile(n);
|
|
3298
|
+
if (r == null) return;
|
|
3299
|
+
const l = r instanceof Uint8Array ? new TextDecoder().decode(r) : String(r);
|
|
3300
|
+
await this.openText({ path: n, text: l }), this.opts.status(`opened: ${n}`);
|
|
3301
|
+
} catch (r) {
|
|
3302
|
+
this.opts.status(`edit failed: ${r?.message ?? r}`, !0);
|
|
3303
3303
|
}
|
|
3304
3304
|
return;
|
|
3305
3305
|
}
|
|
3306
3306
|
if (e === "write" || e === "wq") {
|
|
3307
|
-
const n = this.editor.getModel(),
|
|
3308
|
-
let
|
|
3309
|
-
if (!
|
|
3307
|
+
const n = this.editor.getModel(), r = n ? n.getValue() : "";
|
|
3308
|
+
let l = typeof i.path == "string" ? String(i.path) : "";
|
|
3309
|
+
if (!l)
|
|
3310
3310
|
try {
|
|
3311
|
-
const
|
|
3312
|
-
typeof
|
|
3311
|
+
const c = await this.rpcCall("nvim_buf_get_name", [0]);
|
|
3312
|
+
typeof c == "string" && (l = c);
|
|
3313
3313
|
} catch {
|
|
3314
3314
|
}
|
|
3315
|
-
if (
|
|
3315
|
+
if (l || (l = this.opts.seedName), !s.writeFile) {
|
|
3316
3316
|
this.opts.status("write: fileSystem.writeFile not set", !0);
|
|
3317
3317
|
return;
|
|
3318
3318
|
}
|
|
3319
3319
|
try {
|
|
3320
|
-
await s.writeFile(
|
|
3320
|
+
await s.writeFile(l, r);
|
|
3321
3321
|
try {
|
|
3322
|
-
await this.rpcCall("nvim_buf_set_name", [0,
|
|
3322
|
+
await this.rpcCall("nvim_buf_set_name", [0, l]);
|
|
3323
3323
|
} catch {
|
|
3324
3324
|
}
|
|
3325
3325
|
try {
|
|
3326
3326
|
await this.rpcCall("nvim_buf_set_option", [0, "modified", !1]);
|
|
3327
3327
|
} catch {
|
|
3328
3328
|
}
|
|
3329
|
-
const
|
|
3330
|
-
|
|
3331
|
-
} catch (
|
|
3332
|
-
this.opts.status(`write failed: ${
|
|
3329
|
+
const c = this.getActiveState();
|
|
3330
|
+
c && (c.name && c.name !== l && this.buffersByName.delete(c.name), c.name = l, this.buffersByName.set(l, c.id)), this.opts.status(`written: ${l}`), e === "wq" && this.opts.status("wq requested (provide onHostCommand to close the editor)");
|
|
3331
|
+
} catch (c) {
|
|
3332
|
+
this.opts.status(`write failed: ${c?.message ?? c}`, !0);
|
|
3333
3333
|
}
|
|
3334
3334
|
return;
|
|
3335
3335
|
}
|
|
@@ -3350,19 +3350,19 @@ vim.rpcnotify(chan, "monaco_buf_enter", {
|
|
|
3350
3350
|
await this.rpcCall("nvim_buf_attach", [e, !1, {}]);
|
|
3351
3351
|
} catch {
|
|
3352
3352
|
}
|
|
3353
|
-
let
|
|
3353
|
+
let l = [""];
|
|
3354
3354
|
try {
|
|
3355
|
-
const
|
|
3356
|
-
Array.isArray(
|
|
3355
|
+
const p = await this.rpcCall("nvim_buf_get_lines", [e, 0, -1, !1]);
|
|
3356
|
+
Array.isArray(p) && (l = p.map((m) => String(m ?? "")));
|
|
3357
3357
|
} catch {
|
|
3358
3358
|
}
|
|
3359
|
-
const
|
|
3360
|
-
`),
|
|
3359
|
+
const c = b.Uri.from({ scheme: "nvim", authority: "buf", path: `/${e}` }), u = l.join(`
|
|
3360
|
+
`), d = s && b.languages.getLanguages().some((p) => p.id === s), f = b.editor.createModel(u, d ? s : void 0, c);
|
|
3361
3361
|
n = {
|
|
3362
3362
|
id: e,
|
|
3363
3363
|
name: i || "",
|
|
3364
3364
|
filetype: s || "",
|
|
3365
|
-
model:
|
|
3365
|
+
model: f,
|
|
3366
3366
|
createdModel: !0,
|
|
3367
3367
|
shadowLines: null,
|
|
3368
3368
|
pendingBufEdits: [],
|
|
@@ -3405,8 +3405,8 @@ vim.rpcnotify(chan, "monaco_buf_enter", {
|
|
|
3405
3405
|
let n = this.buffersByName.get(s) ?? null;
|
|
3406
3406
|
if (!n)
|
|
3407
3407
|
try {
|
|
3408
|
-
const
|
|
3409
|
-
n =
|
|
3408
|
+
const r = await this.rpcCall("nvim_create_buf", [!0, !1]);
|
|
3409
|
+
n = B(r) ?? Number(r);
|
|
3410
3410
|
} catch {
|
|
3411
3411
|
n = null;
|
|
3412
3412
|
}
|
|
@@ -3441,8 +3441,8 @@ vim.rpcnotify(chan, "monaco_buf_enter", {
|
|
|
3441
3441
|
doClipboardPaste(t) {
|
|
3442
3442
|
const e = (n) => {
|
|
3443
3443
|
this.lastClipboardText = n == null ? "" : String(n);
|
|
3444
|
-
const
|
|
3445
|
-
this.sendRpcResponse(t, null, [
|
|
3444
|
+
const r = (n || "").split(/\r?\n/);
|
|
3445
|
+
this.sendRpcResponse(t, null, [r, "v"]);
|
|
3446
3446
|
}, i = () => {
|
|
3447
3447
|
try {
|
|
3448
3448
|
return typeof navigator < "u" && navigator?.webdriver || typeof window > "u" || typeof window.prompt != "function" ? null : window.prompt("Paste text");
|
|
@@ -3472,10 +3472,10 @@ vim.rpcnotify(chan, "monaco_buf_enter", {
|
|
|
3472
3472
|
});
|
|
3473
3473
|
}
|
|
3474
3474
|
updateCursor(t, e) {
|
|
3475
|
-
const i = this.editor.getModel(), s = Math.max(1, Number(t) || 1), n = Math.max(1, Number(e) || 1),
|
|
3476
|
-
if (this.debugLog(`updateCursor: line=${
|
|
3477
|
-
const
|
|
3478
|
-
|
|
3475
|
+
const i = this.editor.getModel(), s = Math.max(1, Number(t) || 1), n = Math.max(1, Number(e) || 1), r = i ? i.validatePosition(new b.Position(s, n)) : new b.Position(s, n);
|
|
3476
|
+
if (this.debugLog(`updateCursor: line=${r.lineNumber} col=${r.column} (from line=${s} col=${n}) visual=${this.visualSelectionActive} mode=${JSON.stringify(this.lastMode)}`), this.lastCursorPos = r, this.compositionActive) return;
|
|
3477
|
+
const l = this.editor.getPosition();
|
|
3478
|
+
l && l.lineNumber === r.lineNumber && l.column === r.column || (this.suppressCursorSync = !0, this.editor.setPosition(this.lastCursorPos), this.visualSelectionActive && this.editor.setSelection(new b.Selection(r.lineNumber, r.column, r.lineNumber, r.column)), this.applyScrolloff(this.lastCursorPos) || this.editor.revealPositionInCenterIfOutsideViewport(this.lastCursorPos), this.suppressCursorSync = !1), this.requestSearchHighlightRefresh();
|
|
3479
3479
|
}
|
|
3480
3480
|
requestSearchHighlightRefresh() {
|
|
3481
3481
|
if (this.opts.searchHighlights) {
|
|
@@ -3508,12 +3508,12 @@ vim.rpcnotify(chan, "monaco_buf_enter", {
|
|
|
3508
3508
|
try {
|
|
3509
3509
|
const e = await this.rpcCall("nvim_win_get_cursor", [0]);
|
|
3510
3510
|
if (Array.isArray(e) && e.length >= 2) {
|
|
3511
|
-
const i = Number(e[0]), s = Number(e[1]), n =
|
|
3512
|
-
if (this.optimisticCursorPos && this.optimisticCursorUntil >
|
|
3513
|
-
const
|
|
3514
|
-
|
|
3511
|
+
const i = Number(e[0]), s = Number(e[1]), n = Q(this.editor, i, s), r = new b.Position(n.line, n.col), l = typeof performance < "u" && performance.now ? performance.now() : Date.now();
|
|
3512
|
+
if (this.optimisticCursorPos && this.optimisticCursorUntil > l) {
|
|
3513
|
+
const c = this.optimisticCursorPrevPos;
|
|
3514
|
+
c && r.lineNumber === c.lineNumber && r.column === c.column || r.lineNumber < this.optimisticCursorPos.lineNumber || r.lineNumber === this.optimisticCursorPos.lineNumber && r.column < this.optimisticCursorPos.column || (this.optimisticCursorPos = null, this.optimisticCursorPrevPos = null, this.optimisticCursorUntil = 0, this.updateCursor(r.lineNumber, r.column));
|
|
3515
3515
|
} else
|
|
3516
|
-
this.optimisticCursorPos = null, this.optimisticCursorPrevPos = null, this.optimisticCursorUntil = 0, this.updateCursor(
|
|
3516
|
+
this.optimisticCursorPos = null, this.optimisticCursorPrevPos = null, this.optimisticCursorUntil = 0, this.updateCursor(r.lineNumber, r.column);
|
|
3517
3517
|
}
|
|
3518
3518
|
if (!this.lastMode)
|
|
3519
3519
|
try {
|
|
@@ -3531,24 +3531,24 @@ vim.rpcnotify(chan, "monaco_buf_enter", {
|
|
|
3531
3531
|
}
|
|
3532
3532
|
}
|
|
3533
3533
|
applyCursorStyle(t) {
|
|
3534
|
-
const e = typeof t == "string" ? t : "", i = e.startsWith("i") || e.startsWith("R"), s = i ? "line" : "block", n = i ? "blink" : "solid",
|
|
3535
|
-
s === this.lastCursorStyle && n === this.lastCursorBlink &&
|
|
3534
|
+
const e = typeof t == "string" ? t : "", i = e.startsWith("i") || e.startsWith("R"), s = i ? "line" : "block", n = i ? "blink" : "solid", r = i ? this.initialCursorWidth || 1 : this.typicalFullWidth;
|
|
3535
|
+
s === this.lastCursorStyle && n === this.lastCursorBlink && r === this.lastCursorWidth || (this.editor.updateOptions({ cursorStyle: s, cursorBlinking: n, cursorWidth: r }), this.lastCursorStyle = s, this.lastCursorBlink = n, this.lastCursorWidth = r);
|
|
3536
3536
|
}
|
|
3537
3537
|
async updateVisualSelection(t) {
|
|
3538
|
-
const e =
|
|
3538
|
+
const e = k(t), i = ++this.visualSelectionToken;
|
|
3539
3539
|
if (!e) {
|
|
3540
3540
|
this.clearVisualDecorations();
|
|
3541
3541
|
return;
|
|
3542
3542
|
}
|
|
3543
3543
|
try {
|
|
3544
|
-
const { selections: s, raw: n, tail:
|
|
3544
|
+
const { selections: s, raw: n, tail: r } = await this.fetchVisualRanges();
|
|
3545
3545
|
if (i !== this.visualSelectionToken || !s.length) return;
|
|
3546
|
-
this.applyVisualDecorations(s, t, n,
|
|
3546
|
+
this.applyVisualDecorations(s, t, n, r);
|
|
3547
3547
|
} catch {
|
|
3548
3548
|
}
|
|
3549
3549
|
}
|
|
3550
3550
|
async fetchVisualRanges() {
|
|
3551
|
-
const t = await this.execLua(
|
|
3551
|
+
const t = await this.execLua(ve, []);
|
|
3552
3552
|
let e = [], i = "";
|
|
3553
3553
|
if (Array.isArray(t))
|
|
3554
3554
|
e = t;
|
|
@@ -3556,12 +3556,12 @@ vim.rpcnotify(chan, "monaco_buf_enter", {
|
|
|
3556
3556
|
const n = t;
|
|
3557
3557
|
i = typeof n.tail == "string" ? n.tail : "", e = Array.isArray(n.ranges) ? n.ranges : [];
|
|
3558
3558
|
}
|
|
3559
|
-
return { selections: e.map(
|
|
3559
|
+
return { selections: e.map(xe(this.editor)).filter((n) => !!n), raw: e, tail: i };
|
|
3560
3560
|
}
|
|
3561
3561
|
async syncVisualSelectionColor() {
|
|
3562
3562
|
try {
|
|
3563
|
-
const e = await this.fetchVisualBg() || "#3e4451", i =
|
|
3564
|
-
|
|
3563
|
+
const e = await this.fetchVisualBg() || "#3e4451", i = J(e, 0.45), s = J(e, 0.3);
|
|
3564
|
+
b.editor.defineTheme(this.opts.visualThemeName, {
|
|
3565
3565
|
base: "vs-dark",
|
|
3566
3566
|
inherit: !0,
|
|
3567
3567
|
rules: [],
|
|
@@ -3574,7 +3574,7 @@ vim.rpcnotify(chan, "monaco_buf_enter", {
|
|
|
3574
3574
|
}
|
|
3575
3575
|
}
|
|
3576
3576
|
setMonacoHighlightsSuppressed(t) {
|
|
3577
|
-
const e =
|
|
3577
|
+
const e = b.editor.EditorOption, i = !!t;
|
|
3578
3578
|
if (i !== this.monacoHighlightsSuppressed) {
|
|
3579
3579
|
if (i) {
|
|
3580
3580
|
try {
|
|
@@ -3604,19 +3604,19 @@ vim.rpcnotify(chan, "monaco_buf_enter", {
|
|
|
3604
3604
|
}
|
|
3605
3605
|
async fetchVisualBg() {
|
|
3606
3606
|
try {
|
|
3607
|
-
const t = await this.rpcCall("nvim_get_hl", [0, { name: "Visual", link: !1 }]), e =
|
|
3607
|
+
const t = await this.rpcCall("nvim_get_hl", [0, { name: "Visual", link: !1 }]), e = X(t);
|
|
3608
3608
|
if (e) return e;
|
|
3609
3609
|
} catch {
|
|
3610
3610
|
}
|
|
3611
3611
|
try {
|
|
3612
|
-
const t = await this.rpcCall("nvim_get_hl_by_name", ["Visual", !0]), e =
|
|
3612
|
+
const t = await this.rpcCall("nvim_get_hl_by_name", ["Visual", !0]), e = X(t);
|
|
3613
3613
|
if (e) return e;
|
|
3614
3614
|
} catch {
|
|
3615
3615
|
}
|
|
3616
3616
|
return null;
|
|
3617
3617
|
}
|
|
3618
3618
|
async seedBuffer(t, e) {
|
|
3619
|
-
const i =
|
|
3619
|
+
const i = B(t);
|
|
3620
3620
|
if (!i || i <= 0) return null;
|
|
3621
3621
|
const s = e ?? this.opts.seedLines;
|
|
3622
3622
|
if (!s || !s.length) return null;
|
|
@@ -3627,105 +3627,105 @@ vim.rpcnotify(chan, "monaco_buf_enter", {
|
|
|
3627
3627
|
}
|
|
3628
3628
|
}
|
|
3629
3629
|
}
|
|
3630
|
-
function
|
|
3631
|
-
return new
|
|
3630
|
+
function Ae(o, t = {}) {
|
|
3631
|
+
return new _e(o, t);
|
|
3632
3632
|
}
|
|
3633
|
-
function
|
|
3634
|
-
return Math.min(Math.max(
|
|
3633
|
+
function F(o, t, e) {
|
|
3634
|
+
return Math.min(Math.max(o, t), e);
|
|
3635
3635
|
}
|
|
3636
|
-
function
|
|
3636
|
+
function W(o) {
|
|
3637
3637
|
try {
|
|
3638
|
-
return new TextEncoder().encode(String(
|
|
3638
|
+
return new TextEncoder().encode(String(o ?? "")).length;
|
|
3639
3639
|
} catch {
|
|
3640
|
-
return String(
|
|
3640
|
+
return String(o ?? "").length;
|
|
3641
3641
|
}
|
|
3642
3642
|
}
|
|
3643
|
-
function
|
|
3644
|
-
const i = Math.max(1, Number(t) || 1), s = Math.max(1, (Number(e) || 0) + 1), n =
|
|
3643
|
+
function Q(o, t, e) {
|
|
3644
|
+
const i = Math.max(1, Number(t) || 1), s = Math.max(1, (Number(e) || 0) + 1), n = o.getModel();
|
|
3645
3645
|
if (!n)
|
|
3646
3646
|
return { line: i, col: s };
|
|
3647
|
-
const
|
|
3648
|
-
return { line:
|
|
3647
|
+
const r = n.getLineCount(), l = F(i, 1, r), c = n.getLineContent(l) ?? "", u = n.getLineMaxColumn(l), d = Math.max(0, Number(e) || 0), f = L(c, d), p = F(f + 1, 1, u);
|
|
3648
|
+
return { line: l, col: p };
|
|
3649
3649
|
}
|
|
3650
|
-
function
|
|
3651
|
-
const e = String(
|
|
3650
|
+
function z(o, t = !0) {
|
|
3651
|
+
const e = String(o ?? "");
|
|
3652
3652
|
if (!e) return "";
|
|
3653
3653
|
const i = e.replace(/\r\n/g, `
|
|
3654
3654
|
`).replace(/\r/g, `
|
|
3655
3655
|
`).replace(/</g, "<lt>");
|
|
3656
3656
|
return t ? i.replace(/\n/g, "<CR>") : i;
|
|
3657
3657
|
}
|
|
3658
|
-
function
|
|
3659
|
-
const t =
|
|
3658
|
+
function Ce(o) {
|
|
3659
|
+
const t = o.key;
|
|
3660
3660
|
if (!t || t === "Dead" || t === "Unidentified") return null;
|
|
3661
|
-
const e = !!
|
|
3661
|
+
const e = !!o.getModifierState?.("AltGraph"), i = o.ctrlKey && !e, s = o.altKey && !e, n = o.metaKey && !e, r = o.shiftKey, l = (f) => f === "<" ? "lt" : f, c = (f) => f === "<" ? "<lt>" : f, u = (f, p = !1) => {
|
|
3662
3662
|
const m = [];
|
|
3663
|
-
i && m.push("C-"),
|
|
3664
|
-
const
|
|
3665
|
-
return m.length ? `<${m.join("")}${
|
|
3663
|
+
i && m.push("C-"), p && r && m.push("S-"), s && m.push("A-"), n && m.push("D-");
|
|
3664
|
+
const v = l(f);
|
|
3665
|
+
return m.length ? `<${m.join("")}${v}>` : `<${v}>`;
|
|
3666
3666
|
};
|
|
3667
|
-
if (typeof
|
|
3668
|
-
switch (
|
|
3667
|
+
if (typeof o.code == "string" && o.code.startsWith("Numpad") || typeof KeyboardEvent?.DOM_KEY_LOCATION_NUMPAD == "number" && o.location === KeyboardEvent.DOM_KEY_LOCATION_NUMPAD) {
|
|
3668
|
+
switch (o.code) {
|
|
3669
3669
|
case "NumpadEnter":
|
|
3670
|
-
return
|
|
3670
|
+
return u("kEnter", !0);
|
|
3671
3671
|
case "NumpadAdd":
|
|
3672
|
-
return
|
|
3672
|
+
return u("kPlus", !0);
|
|
3673
3673
|
case "NumpadSubtract":
|
|
3674
|
-
return
|
|
3674
|
+
return u("kMinus", !0);
|
|
3675
3675
|
case "NumpadMultiply":
|
|
3676
|
-
return
|
|
3676
|
+
return u("kMultiply", !0);
|
|
3677
3677
|
case "NumpadDivide":
|
|
3678
|
-
return
|
|
3678
|
+
return u("kDivide", !0);
|
|
3679
3679
|
case "NumpadDecimal":
|
|
3680
|
-
return
|
|
3680
|
+
return u("kPoint", !0);
|
|
3681
3681
|
}
|
|
3682
|
-
if (/^\d$/.test(t)) return
|
|
3682
|
+
if (/^\d$/.test(t)) return u(`k${t}`, !0);
|
|
3683
3683
|
}
|
|
3684
3684
|
switch (t) {
|
|
3685
3685
|
case "Backspace":
|
|
3686
|
-
return
|
|
3686
|
+
return u("BS", !0);
|
|
3687
3687
|
case "Enter":
|
|
3688
|
-
return
|
|
3688
|
+
return u("CR", !0);
|
|
3689
3689
|
case "Escape":
|
|
3690
|
-
return
|
|
3690
|
+
return u("Esc", !0);
|
|
3691
3691
|
case "Tab":
|
|
3692
|
-
return
|
|
3692
|
+
return r && !i && !s && !n ? "<S-Tab>" : u("Tab", !0);
|
|
3693
3693
|
case "ArrowUp":
|
|
3694
|
-
return
|
|
3694
|
+
return u("Up", !0);
|
|
3695
3695
|
case "ArrowDown":
|
|
3696
|
-
return
|
|
3696
|
+
return u("Down", !0);
|
|
3697
3697
|
case "ArrowLeft":
|
|
3698
|
-
return
|
|
3698
|
+
return u("Left", !0);
|
|
3699
3699
|
case "ArrowRight":
|
|
3700
|
-
return
|
|
3700
|
+
return u("Right", !0);
|
|
3701
3701
|
case "Delete":
|
|
3702
|
-
return
|
|
3702
|
+
return u("Del", !0);
|
|
3703
3703
|
case "Home":
|
|
3704
|
-
return
|
|
3704
|
+
return u("Home", !0);
|
|
3705
3705
|
case "End":
|
|
3706
|
-
return
|
|
3706
|
+
return u("End", !0);
|
|
3707
3707
|
case "PageUp":
|
|
3708
|
-
return
|
|
3708
|
+
return u("PageUp", !0);
|
|
3709
3709
|
case "PageDown":
|
|
3710
|
-
return
|
|
3710
|
+
return u("PageDown", !0);
|
|
3711
3711
|
case "Insert":
|
|
3712
|
-
return
|
|
3712
|
+
return u("Insert", !0);
|
|
3713
3713
|
}
|
|
3714
|
-
if (/^F\d{1,2}$/.test(t)) return
|
|
3714
|
+
if (/^F\d{1,2}$/.test(t)) return u(t, !0);
|
|
3715
3715
|
if (t.length === 1) {
|
|
3716
|
-
if (!i && !s && !n) return
|
|
3716
|
+
if (!i && !s && !n) return c(t);
|
|
3717
3717
|
if (t === " " && i && !s && !n) return "<Nul>";
|
|
3718
|
-
const
|
|
3719
|
-
return `<${(i ? "C-" : "") + (s ? "A-" : "") + (n ? "D-" : "")}${
|
|
3718
|
+
const f = /^[A-Za-z]$/.test(t) ? t.toLowerCase() : t, p = l(f);
|
|
3719
|
+
return `<${(i ? "C-" : "") + (s ? "A-" : "") + (n ? "D-" : "")}${p}>`;
|
|
3720
3720
|
}
|
|
3721
3721
|
return null;
|
|
3722
3722
|
}
|
|
3723
|
-
function
|
|
3724
|
-
if (!
|
|
3725
|
-
const t =
|
|
3726
|
-
if (
|
|
3723
|
+
function we(o) {
|
|
3724
|
+
if (!o || o.length === 0) return null;
|
|
3725
|
+
const t = o[0];
|
|
3726
|
+
if (o.length === 1)
|
|
3727
3727
|
return t <= 127 ? t : t - 256;
|
|
3728
|
-
const e = new DataView(
|
|
3728
|
+
const e = new DataView(o.buffer, o.byteOffset, o.byteLength);
|
|
3729
3729
|
switch (t) {
|
|
3730
3730
|
case 204:
|
|
3731
3731
|
return e.getUint8(1);
|
|
@@ -3747,78 +3747,78 @@ function Ge(l) {
|
|
|
3747
3747
|
return t;
|
|
3748
3748
|
}
|
|
3749
3749
|
}
|
|
3750
|
-
function
|
|
3751
|
-
return
|
|
3750
|
+
function Se(o) {
|
|
3751
|
+
return o instanceof Uint8Array ? o : o instanceof ArrayBuffer ? new Uint8Array(o) : Array.isArray(o) ? new Uint8Array(o) : Number.isInteger(o) ? new Uint8Array([o & 255]) : o && o.type === "Buffer" && Array.isArray(o.data) ? new Uint8Array(o.data) : null;
|
|
3752
3752
|
}
|
|
3753
|
-
function
|
|
3754
|
-
if (
|
|
3755
|
-
const e =
|
|
3753
|
+
function B(o) {
|
|
3754
|
+
if (o && typeof o == "object" && typeof o.type == "number") {
|
|
3755
|
+
const e = Se(o.data);
|
|
3756
3756
|
if (e) {
|
|
3757
|
-
const i =
|
|
3757
|
+
const i = we(e);
|
|
3758
3758
|
if (i != null && i > 0) return i;
|
|
3759
3759
|
}
|
|
3760
3760
|
}
|
|
3761
|
-
const t = Number(
|
|
3761
|
+
const t = Number(o);
|
|
3762
3762
|
return Number.isInteger(t) && t > 0 ? t : null;
|
|
3763
3763
|
}
|
|
3764
|
-
function
|
|
3764
|
+
function L(o, t) {
|
|
3765
3765
|
let e = 0, i = 0;
|
|
3766
3766
|
const s = Math.max(0, Number(t) || 0);
|
|
3767
3767
|
for (; e < s; ) {
|
|
3768
|
-
if (i >=
|
|
3768
|
+
if (i >= o.length)
|
|
3769
3769
|
return i + (s - e);
|
|
3770
|
-
const n =
|
|
3771
|
-
if (e +
|
|
3772
|
-
e +=
|
|
3770
|
+
const n = o.codePointAt(i), r = q(n ?? 0);
|
|
3771
|
+
if (e + r > s) return i;
|
|
3772
|
+
e += r, i += r === 4 ? 2 : 1;
|
|
3773
3773
|
}
|
|
3774
3774
|
return i;
|
|
3775
3775
|
}
|
|
3776
|
-
function
|
|
3776
|
+
function T(o, t) {
|
|
3777
3777
|
const e = Math.max(0, Number(t) || 0);
|
|
3778
3778
|
let i = 0, s = 0;
|
|
3779
|
-
for (; s < e && s <
|
|
3780
|
-
const n =
|
|
3781
|
-
i +=
|
|
3779
|
+
for (; s < e && s < o.length; ) {
|
|
3780
|
+
const n = o.codePointAt(s), r = q(n ?? 0);
|
|
3781
|
+
i += r, s += r === 4 ? 2 : 1;
|
|
3782
3782
|
}
|
|
3783
3783
|
return i;
|
|
3784
3784
|
}
|
|
3785
|
-
function
|
|
3786
|
-
return
|
|
3785
|
+
function q(o) {
|
|
3786
|
+
return o == null ? 0 : o <= 127 ? 1 : o <= 2047 ? 2 : o >= 55296 && o <= 57343 ? 4 : o < 65535 ? 3 : 4;
|
|
3787
3787
|
}
|
|
3788
|
-
function
|
|
3788
|
+
function xe(o) {
|
|
3789
3789
|
return (t) => {
|
|
3790
3790
|
if (!t || !t.start || !t.end) return null;
|
|
3791
|
-
const e =
|
|
3792
|
-
return !e || !i ? null : new
|
|
3791
|
+
const e = j(o, t.start, !1), i = j(o, t.end, !!t.inclusive);
|
|
3792
|
+
return !e || !i ? null : new b.Selection(e.lineNumber, e.column, i.lineNumber, i.column);
|
|
3793
3793
|
};
|
|
3794
3794
|
}
|
|
3795
|
-
function
|
|
3795
|
+
function j(o, t, e) {
|
|
3796
3796
|
if (!t || typeof t.line != "number" || typeof t.col != "number") return null;
|
|
3797
|
-
const i =
|
|
3797
|
+
const i = o.getModel(), s = F(t.line + 1, 1, i?.getLineCount() || 1 / 0);
|
|
3798
3798
|
if (!i) {
|
|
3799
|
-
const
|
|
3800
|
-
return { lineNumber: s, column:
|
|
3799
|
+
const d = Math.max(1, t.col + 1);
|
|
3800
|
+
return { lineNumber: s, column: d + (e ? 1 : 0) };
|
|
3801
3801
|
}
|
|
3802
|
-
const n = i.getLineContent(s) ?? "",
|
|
3803
|
-
let
|
|
3802
|
+
const n = i.getLineContent(s) ?? "", r = Math.max(0, Number(t.col) || 0);
|
|
3803
|
+
let l = r;
|
|
3804
3804
|
if (e) {
|
|
3805
|
-
const
|
|
3806
|
-
if (
|
|
3807
|
-
const
|
|
3808
|
-
|
|
3805
|
+
const d = L(n, r);
|
|
3806
|
+
if (d < n.length) {
|
|
3807
|
+
const f = n.codePointAt(d);
|
|
3808
|
+
l = r + q(f ?? 0);
|
|
3809
3809
|
}
|
|
3810
3810
|
}
|
|
3811
|
-
const
|
|
3812
|
-
return { lineNumber: s, column:
|
|
3811
|
+
const c = L(n, l) + 1, u = i.getLineMaxColumn(s);
|
|
3812
|
+
return { lineNumber: s, column: F(c, 1, u) };
|
|
3813
3813
|
}
|
|
3814
|
-
function
|
|
3815
|
-
const t = typeof
|
|
3814
|
+
function k(o) {
|
|
3815
|
+
const t = typeof o == "string" ? o : "";
|
|
3816
3816
|
return t.includes("v") || t.includes("V") || t.includes("") || t.includes("s") || t.includes("S") || t.includes("");
|
|
3817
3817
|
}
|
|
3818
|
-
function
|
|
3819
|
-
if (!
|
|
3818
|
+
function Me(o) {
|
|
3819
|
+
if (!o || !Array.isArray(o) || o.length === 0) return;
|
|
3820
3820
|
const t = new TextEncoder(), e = [];
|
|
3821
|
-
for (const i of
|
|
3821
|
+
for (const i of o) {
|
|
3822
3822
|
if (!i) continue;
|
|
3823
3823
|
const s = String(i.path ?? "");
|
|
3824
3824
|
if (!s) continue;
|
|
@@ -3827,71 +3827,71 @@ function Re(l) {
|
|
|
3827
3827
|
}
|
|
3828
3828
|
return e.length ? e : void 0;
|
|
3829
3829
|
}
|
|
3830
|
-
function
|
|
3831
|
-
const e = Array.isArray(t) ? t.filter(Boolean) : [], i = Array.isArray(
|
|
3830
|
+
function Ie(o, t) {
|
|
3831
|
+
const e = Array.isArray(t) ? t.filter(Boolean) : [], i = Array.isArray(o) ? o.filter(Boolean) : [], s = [...e, ...i];
|
|
3832
3832
|
return s.length ? s : void 0;
|
|
3833
3833
|
}
|
|
3834
|
-
function
|
|
3835
|
-
const e =
|
|
3836
|
-
if (e.length !== 6) return
|
|
3837
|
-
const i = Math.round(
|
|
3834
|
+
function J(o, t) {
|
|
3835
|
+
const e = o.replace("#", "");
|
|
3836
|
+
if (e.length !== 6) return o;
|
|
3837
|
+
const i = Math.round(F(t, 0, 1) * 255);
|
|
3838
3838
|
return `#${e}${i.toString(16).padStart(2, "0")}`;
|
|
3839
3839
|
}
|
|
3840
|
-
function
|
|
3841
|
-
if (!
|
|
3842
|
-
const t =
|
|
3843
|
-
return typeof e == "number" && e >= 0 ?
|
|
3840
|
+
function X(o) {
|
|
3841
|
+
if (!o || typeof o != "object") return null;
|
|
3842
|
+
const t = o, e = t.background ?? t.bg;
|
|
3843
|
+
return typeof e == "number" && e >= 0 ? Ee(e) : typeof t.background == "string" && t.background.startsWith("#") ? t.background : typeof t.bg == "string" && t.bg.startsWith("#") ? t.bg : null;
|
|
3844
3844
|
}
|
|
3845
|
-
function
|
|
3846
|
-
return `#${Number(
|
|
3845
|
+
function Ee(o) {
|
|
3846
|
+
return `#${Number(o >>> 0).toString(16).padStart(6, "0").slice(-6)}`;
|
|
3847
3847
|
}
|
|
3848
|
-
function
|
|
3849
|
-
return
|
|
3848
|
+
function I(o, t, e, i) {
|
|
3849
|
+
return o.addEventListener(t, e, i), { dispose: () => o.removeEventListener(t, e, i) };
|
|
3850
3850
|
}
|
|
3851
|
-
function
|
|
3852
|
-
return (typeof
|
|
3851
|
+
function P(o) {
|
|
3852
|
+
return (typeof o == "string" ? o : "").startsWith("i");
|
|
3853
3853
|
}
|
|
3854
|
-
function
|
|
3855
|
-
const t = typeof
|
|
3854
|
+
function Ne(o) {
|
|
3855
|
+
const t = typeof o == "string" ? o : "";
|
|
3856
3856
|
return t.length ? t[t.length - 1] : "";
|
|
3857
3857
|
}
|
|
3858
|
-
function
|
|
3859
|
-
const t = typeof
|
|
3858
|
+
function A(o) {
|
|
3859
|
+
const t = typeof o == "string" ? o : "";
|
|
3860
3860
|
return t === "c" || t.startsWith("c");
|
|
3861
3861
|
}
|
|
3862
|
-
function
|
|
3863
|
-
const
|
|
3864
|
-
let
|
|
3865
|
-
if (
|
|
3866
|
-
|
|
3862
|
+
function Re(o, t, e, i, s, n) {
|
|
3863
|
+
const r = o[t] ?? "", l = o[i] ?? "", c = r.slice(0, Math.max(0, e)), u = l.slice(Math.max(0, s)), f = String(n ?? "").split(/\r?\n/);
|
|
3864
|
+
let p;
|
|
3865
|
+
if (f.length <= 1)
|
|
3866
|
+
p = [`${c}${f[0] ?? ""}${u}`];
|
|
3867
3867
|
else {
|
|
3868
|
-
const m = `${
|
|
3869
|
-
|
|
3868
|
+
const m = `${c}${f[0] ?? ""}`, v = `${f[f.length - 1] ?? ""}${u}`, _ = f.slice(1, -1);
|
|
3869
|
+
p = [m, ..._, v];
|
|
3870
3870
|
}
|
|
3871
|
-
|
|
3871
|
+
o.splice(t, Math.max(0, i - t + 1), ...p);
|
|
3872
3872
|
}
|
|
3873
|
-
function
|
|
3874
|
-
if (!
|
|
3875
|
-
if (typeof
|
|
3876
|
-
if (!Array.isArray(
|
|
3873
|
+
function $(o) {
|
|
3874
|
+
if (!o) return "";
|
|
3875
|
+
if (typeof o == "string") return o;
|
|
3876
|
+
if (!Array.isArray(o)) return "";
|
|
3877
3877
|
let t = "";
|
|
3878
|
-
for (const e of
|
|
3878
|
+
for (const e of o) {
|
|
3879
3879
|
if (typeof e == "string") {
|
|
3880
3880
|
t += e;
|
|
3881
3881
|
continue;
|
|
3882
3882
|
}
|
|
3883
3883
|
if (Array.isArray(e)) {
|
|
3884
|
-
typeof e[1] == "string" ? t += e[1] : typeof e[0] == "string" ? t += e[0] : t +=
|
|
3884
|
+
typeof e[1] == "string" ? t += e[1] : typeof e[0] == "string" ? t += e[0] : t += $(e);
|
|
3885
3885
|
continue;
|
|
3886
3886
|
}
|
|
3887
3887
|
e && typeof e == "object" && typeof e.text == "string" && (t += e.text);
|
|
3888
3888
|
}
|
|
3889
3889
|
return t;
|
|
3890
3890
|
}
|
|
3891
|
-
function
|
|
3892
|
-
if (!Array.isArray(
|
|
3891
|
+
function Te(o) {
|
|
3892
|
+
if (!Array.isArray(o)) return [];
|
|
3893
3893
|
const t = [];
|
|
3894
|
-
for (const e of
|
|
3894
|
+
for (const e of o) {
|
|
3895
3895
|
if (Array.isArray(e)) {
|
|
3896
3896
|
t.push({
|
|
3897
3897
|
word: String(e[0] ?? ""),
|
|
@@ -3908,12 +3908,12 @@ function We(l) {
|
|
|
3908
3908
|
}
|
|
3909
3909
|
return t.filter((e) => e.word.length > 0);
|
|
3910
3910
|
}
|
|
3911
|
-
const He = new URL("data:video/mp2t;base64,aW1wb3J0IHsKICBXQVNJLAogIHdhc2ksCiAgRGlyZWN0b3J5LAogIEZpbGUsCiAgUHJlb3BlbkRpcmVjdG9yeSwKICBGZCwKICBJbm9kZSwKfSBmcm9tICJAYmpvcm4zL2Jyb3dzZXJfd2FzaV9zaGltIjsKaW1wb3J0IHsgZ3VuemlwU3luYyB9IGZyb20gImZmbGF0ZSI7CmltcG9ydCB7IERlY29kZXIgfSBmcm9tICIuL21zZ3BhY2siOwp0eXBlIFN0YXJ0TWVzc2FnZSA9IHsKICB0eXBlOiAic3RhcnQiOwogIGNvbHM/OiBudW1iZXI7CiAgcm93cz86IG51bWJlcjsKICB3YXNtUGF0aDogc3RyaW5nOwogIHJ1bnRpbWVQYXRoOiBzdHJpbmc7CiAgaW5wdXRCdWZmZXI/OiBTaGFyZWRBcnJheUJ1ZmZlciB8IG51bGw7CiAgZW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IG51bGw7CiAgZmlsZXM/OiBBcnJheTx7IHBhdGg6IHN0cmluZzsgZGF0YTogVWludDhBcnJheSB8IEFycmF5QnVmZmVyIHwgQXJyYXlMaWtlPG51bWJlcj4gfCB7IHR5cGU6ICJCdWZmZXIiOyBkYXRhOiBudW1iZXJbXSB9IH0+IHwgbnVsbDsKfTsKCnR5cGUgU3RvcE1lc3NhZ2UgPSB7IHR5cGU6ICJzdG9wIiB9OwoKdHlwZSBJbmJvdW5kTWVzc2FnZSA9IFN0YXJ0TWVzc2FnZSB8IFN0b3BNZXNzYWdlOwoKdHlwZSBEaXJOb2RlID0gRGlyZWN0b3J5ICYgeyBjb250ZW50czogTWFwPHN0cmluZywgYW55PiB9OwoKbGV0IHJwY0RlY29kZXI6IERlY29kZXIgfCBudWxsID0gbnVsbDsKbGV0IGFjdGl2ZVdhc2k6IFdBU0kgfCBudWxsID0gbnVsbDsKbGV0IGlucHV0RmQ6IFJpbmdGZCB8IG51bGwgPSBudWxsOwpjb25zdCBzdGRlcnJEZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7CmxldCBsYXN0U3RkZXJyID0gIiI7CmxldCBmYXRhbFNlbnQgPSBmYWxzZTsKbGV0IGNhY2hlZFdhc206IHsgdXJsOiBzdHJpbmc7IGJ5dGVzOiBVaW50OEFycmF5IH0gfCBudWxsID0gbnVsbDsKbGV0IGNhY2hlZFJ1bnRpbWU6IHsgdXJsOiBzdHJpbmc7IGVudHJpZXM6IFRhckVudHJ5W10gfSB8IG51bGwgPSBudWxsOwoKc2VsZi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsIChldikgPT4gewogIGlmIChmYXRhbFNlbnQpIHJldHVybjsKICBmYXRhbFNlbnQgPSB0cnVlOwogIGNvbnN0IG1zZyA9IGV2Lm1lc3NhZ2UgfHwgU3RyaW5nKGV2LmVycm9yIHx8ICJ3b3JrZXIgZXJyb3IiKTsKICBjb25zdCBzdGFjayA9IChldi5lcnJvciBhcyB7IHN0YWNrPzogc3RyaW5nIH0pPy5zdGFjazsKICB0cnkgewogICAgcG9zdE1lc3NhZ2UoeyB0eXBlOiAic3RhcnQtZXJyb3IiLCBtZXNzYWdlOiBzdGFjayA/IGAke21zZ31cbiR7c3RhY2t9YCA6IG1zZyB9KTsKICAgIHBvc3RNZXNzYWdlKHsgdHlwZTogImV4aXQiLCBjb2RlOiAxLCBsYXN0U3RkZXJyIH0pOwogIH0gY2F0Y2ggKF8pIHsKICB9Cn0pOwoKc2VsZi5hZGRFdmVudExpc3RlbmVyKCJ1bmhhbmRsZWRyZWplY3Rpb24iLCAoZXYpID0+IHsKICBpZiAoZmF0YWxTZW50KSByZXR1cm47CiAgZmF0YWxTZW50ID0gdHJ1ZTsKICBjb25zdCByZWFzb24gPSBldi5yZWFzb247CiAgY29uc3QgbXNnID0gKHJlYXNvbiAmJiAocmVhc29uLm1lc3NhZ2UgfHwgU3RyaW5nKHJlYXNvbikpKSB8fCAidW5oYW5kbGVkIHJlamVjdGlvbiI7CiAgY29uc3Qgc3RhY2sgPSAocmVhc29uIGFzIHsgc3RhY2s/OiBzdHJpbmcgfSk/LnN0YWNrOwogIHRyeSB7CiAgICBwb3N0TWVzc2FnZSh7IHR5cGU6ICJzdGFydC1lcnJvciIsIG1lc3NhZ2U6IHN0YWNrID8gYCR7bXNnfVxuJHtzdGFja31gIDogbXNnIH0pOwogICAgcG9zdE1lc3NhZ2UoeyB0eXBlOiAiZXhpdCIsIGNvZGU6IDEsIGxhc3RTdGRlcnIgfSk7CiAgfSBjYXRjaCAoXykgewogIH0KfSk7CgpzZWxmLm9ubWVzc2FnZSA9IChldmVudDogTWVzc2FnZUV2ZW50PEluYm91bmRNZXNzYWdlPikgPT4gewogIGNvbnN0IHsgdHlwZSB9ID0gZXZlbnQuZGF0YSB8fCB7fTsKICBpZiAodHlwZSA9PT0gInN0YXJ0IikgewogICAgc3RhcnROdmltKGV2ZW50LmRhdGEgYXMgU3RhcnRNZXNzYWdlKS5jYXRjaCgoZXJyKSA9PiB7CiAgICAgIHBvc3RNZXNzYWdlKHsgdHlwZTogInN0YXJ0LWVycm9yIiwgbWVzc2FnZTogZXJyPy5tZXNzYWdlIHx8IFN0cmluZyhlcnIpIH0pOwogICAgICBwb3N0TWVzc2FnZSh7IHR5cGU6ICJleGl0IiwgY29kZTogMSB9KTsKICAgIH0pOwogIH0gZWxzZSBpZiAodHlwZSA9PT0gInN0b3AiKSB7CiAgICB0cnkgewogICAgICBhY3RpdmVXYXNpPy53YXNpSW1wb3J0Py5wcm9jX2V4aXQ/LigwKTsKICAgIH0gY2F0Y2ggKF8pIHsKICAgIH0KICAgIGlucHV0RmQgPSBudWxsOwogIH0KfTsKCmNsYXNzIFJpbmdGZCBleHRlbmRzIEZkIHsKICBwcml2YXRlIHJlYWRvbmx5IGN0cmw6IEludDMyQXJyYXk7CiAgcHJpdmF0ZSByZWFkb25seSBkYXRhOiBVaW50OEFycmF5OwogIHByaXZhdGUgcmVhZG9ubHkgY2FwYWNpdHk6IG51bWJlcjsKCiAgY29uc3RydWN0b3IoYnVmZmVyOiBTaGFyZWRBcnJheUJ1ZmZlcikgewogICAgc3VwZXIoKTsKICAgIHRoaXMuY3RybCA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMik7CiAgICB0aGlzLmRhdGEgPSBuZXcgVWludDhBcnJheShidWZmZXIsIDgpOwogICAgdGhpcy5jYXBhY2l0eSA9IHRoaXMuZGF0YS5sZW5ndGg7CiAgfQoKICBmZF9mZHN0YXRfZ2V0KCkgewogICAgY29uc3QgZmRzdGF0ID0gbmV3IHdhc2kuRmRzdGF0KHdhc2kuRklMRVRZUEVfUkVHVUxBUl9GSUxFLCAwKTsKICAgIGZkc3RhdC5mc19yaWdodHNfYmFzZSA9IEJpZ0ludCh3YXNpLlJJR0hUU19GRF9SRUFEIHwgd2FzaS5SSUdIVFNfRkRfV1JJVEUpOwogICAgcmV0dXJuIHsgcmV0OiB3YXNpLkVSUk5PX1NVQ0NFU1MsIGZkc3RhdCB9OwogIH0KCiAgZmRfY2xvc2UoKSB7IHJldHVybiB3YXNpLkVSUk5PX1NVQ0NFU1M7IH0KCiAgZmRfcmVhZChzaXplOiBudW1iZXIpIHsKICAgIGNvbnN0IG1heCA9IE1hdGgubWluKE1hdGgubWF4KDAsIE51bWJlcihzaXplKSB8fCAwKSwgdGhpcy5jYXBhY2l0eSk7CiAgICBpZiAobWF4ID09PSAwKSByZXR1cm4geyByZXQ6IHdhc2kuRVJSTk9fQUdBSU4sIGRhdGE6IG5ldyBVaW50OEFycmF5KCkgfTsKICAgIGxldCBoZWFkID0gQXRvbWljcy5sb2FkKHRoaXMuY3RybCwgMCk7CiAgICBjb25zdCB0YWlsID0gQXRvbWljcy5sb2FkKHRoaXMuY3RybCwgMSk7CiAgICBpZiAoaGVhZCA9PT0gdGFpbCkgcmV0dXJuIHsgcmV0OiB3YXNpLkVSUk5PX0FHQUlOLCBkYXRhOiBuZXcgVWludDhBcnJheSgpIH07CiAgICBjb25zdCBvdXQgPSBuZXcgVWludDhBcnJheShtYXgpOwogICAgbGV0IHdyaXR0ZW4gPSAwOwogICAgd2hpbGUgKGhlYWQgIT09IHRhaWwgJiYgd3JpdHRlbiA8IG1heCkgewogICAgICBvdXRbd3JpdHRlbisrXSA9IHRoaXMuZGF0YVtoZWFkXTsKICAgICAgaGVhZCA9IChoZWFkICsgMSkgJSB0aGlzLmNhcGFjaXR5OwogICAgfQogICAgQXRvbWljcy5zdG9yZSh0aGlzLmN0cmwsIDAsIGhlYWQpOwogICAgcmV0dXJuIHsgcmV0OiB3YXNpLkVSUk5PX1NVQ0NFU1MsIGRhdGE6IG91dC5zbGljZSgwLCB3cml0dGVuKSB9OwogIH0KCiAgZmRfd3JpdGUoKSB7IHJldHVybiB7IHJldDogd2FzaS5FUlJOT19CQURGLCBud3JpdHRlbjogMCB9OyB9CiAgZmRfc2VlaygpIHsgcmV0dXJuIHsgcmV0OiB3YXNpLkVSUk5PX0JBREYsIG9mZnNldDogMG4gfTsgfQogIGZkX3RlbGwoKSB7IHJldHVybiB7IHJldDogd2FzaS5FUlJOT19CQURGLCBvZmZzZXQ6IDBuIH07IH0KICBmZF9wcmVhZCgpIHsgcmV0dXJuIHsgcmV0OiB3YXNpLkVSUk5PX0JBREYsIGRhdGE6IG5ldyBVaW50OEFycmF5KCkgfTsgfQogIGZkX3B3cml0ZSgpIHsgcmV0dXJuIHsgcmV0OiB3YXNpLkVSUk5PX0JBREYsIG53cml0dGVuOiAwIH07IH0KfQoKY2xhc3MgU2lua0ZkIGV4dGVuZHMgRmQgewogIHByaXZhdGUgcmVhZG9ubHkgb25Xcml0ZTogKGRhdGE6IFVpbnQ4QXJyYXkpID0+IHZvaWQ7CgogIGNvbnN0cnVjdG9yKG9uV3JpdGU6IChkYXRhOiBVaW50OEFycmF5KSA9PiB2b2lkKSB7CiAgICBzdXBlcigpOwogICAgdGhpcy5vbldyaXRlID0gb25Xcml0ZTsKICB9CgogIGZkX2Zkc3RhdF9nZXQoKSB7CiAgICBjb25zdCBmZHN0YXQgPSBuZXcgd2FzaS5GZHN0YXQod2FzaS5GSUxFVFlQRV9SRUdVTEFSX0ZJTEUsIDApOwogICAgZmRzdGF0LmZzX3JpZ2h0c19iYXNlID0gQmlnSW50KHdhc2kuUklHSFRTX0ZEX1dSSVRFKTsKICAgIHJldHVybiB7IHJldDogd2FzaS5FUlJOT19TVUNDRVNTLCBmZHN0YXQgfTsKICB9CgogIGZkX3dyaXRlKGRhdGE6IFVpbnQ4QXJyYXkpIHsKICAgIHRoaXMub25Xcml0ZShuZXcgVWludDhBcnJheShkYXRhKSk7CiAgICByZXR1cm4geyByZXQ6IHdhc2kuRVJSTk9fU1VDQ0VTUywgbndyaXR0ZW46IGRhdGEuYnl0ZUxlbmd0aCB9OwogIH0KCiAgZmRfY2xvc2UoKSB7IHJldHVybiB3YXNpLkVSUk5PX1NVQ0NFU1M7IH0KfQoKYXN5bmMgZnVuY3Rpb24gc3RhcnROdmltKHsgY29scywgcm93cywgd2FzbVBhdGgsIHJ1bnRpbWVQYXRoLCBpbnB1dEJ1ZmZlciwgZW52OiBleHRyYUVudiwgZmlsZXMgfTogU3RhcnRNZXNzYWdlKSB7CiAgbGV0IGV4aXRDb2RlID0gMTsKICB0cnkgewogICAgaWYgKCFpbnB1dEJ1ZmZlcikgewogICAgICBwb3N0TWVzc2FnZSh7IHR5cGU6ICJzdGFydC1lcnJvciIsIG1lc3NhZ2U6ICJpbnB1dCBidWZmZXIgbWlzc2luZyIgfSk7CiAgICAgIHBvc3RNZXNzYWdlKHsgdHlwZTogImV4aXQiLCBjb2RlOiAxIH0pOwogICAgICByZXR1cm47CiAgICB9CgogICAgcnBjRGVjb2RlciA9IG51bGw7CiAgICBpbnB1dEZkID0gbmV3IFJpbmdGZChpbnB1dEJ1ZmZlcik7CgogICAgY29uc3Qgd2FzbUJ5dGVzID0gYXdhaXQgZ2V0Q2FjaGVkV2FzbUJ5dGVzKHdhc21QYXRoKTsKICAgIGNvbnN0IHVudGFycmVkID0gYXdhaXQgZ2V0Q2FjaGVkUnVudGltZUVudHJpZXMocnVudGltZVBhdGgpOwogICAgY29uc3QgZnNSb290ID0gYnVpbGRGcyh1bnRhcnJlZCwgKCkgPT4ge30pOwogICAgaWYgKGZpbGVzICYmIEFycmF5LmlzQXJyYXkoZmlsZXMpICYmIGZpbGVzLmxlbmd0aCkgYXBwbHlFeHRyYUZpbGVzKGZzUm9vdCwgZmlsZXMpOwoKICAgIGNvbnN0IHN0ZGluRmQgPSBpbnB1dEZkITsKICAgIGNvbnN0IHN0ZG91dEZkID0gbmV3IFNpbmtGZChoYW5kbGVTdGRvdXQpOwogICAgY29uc3Qgc3RkZXJyRmQgPSBuZXcgU2lua0ZkKChkYXRhKSA9PiB7CiAgICAgIGNvbnN0IG1zZyA9IHN0ZGVyckRlY29kZXIuZGVjb2RlKGRhdGEpOwogICAgICBpZiAobXNnKSB7CiAgICAgICAgbGFzdFN0ZGVyciA9IChsYXN0U3RkZXJyICsgbXNnKS5zbGljZSgtODE5Mik7CiAgICAgIH0KICAgICAgcG9zdE1lc3NhZ2UoeyB0eXBlOiAic3RkZXJyIiwgbWVzc2FnZTogbXNnIH0pOwogICAgfSk7CgogICAgY29uc3QgcHJlb3BlbiA9IG5ldyBSb290ZWRQcmVvcGVuRGlyZWN0b3J5KCJudmltIiwgZnNSb290LmNvbnRlbnRzKTsKICAgIGNvbnN0IHRtcERpciA9IGZzUm9vdC5jb250ZW50cy5nZXQoInRtcCIpIGFzIERpcmVjdG9yeSB8IHVuZGVmaW5lZDsKICAgIGNvbnN0IHRtcCA9IHRtcERpcj8uY29udGVudHMgfHwgbmV3IE1hcCgpOwogICAgY29uc3QgcHJlb3BlblRtcCA9IG5ldyBSb290ZWRQcmVvcGVuRGlyZWN0b3J5KCJ0bXAiLCB0bXApOwoKICAgIGNvbnN0IGFyZ3MgPSBbIm52aW0iLCAiLS1oZWFkbGVzcyIsICItLWVtYmVkIiwgIi11IiwgIk5PUkMiLCAiLS1ub3BsdWdpbiIsICItaSIsICJOT05FIiwgIi1uIl07CiAgICBjb25zdCBlbnYgPSBbCiAgICAgICJWSU1SVU5USU1FPS9udmltL3J1bnRpbWUiLAogICAgICAiSE9NRT0vbnZpbS9ob21lIiwKICAgICAgIlBXRD0vbnZpbSIsCiAgICAgICJYREdfQ09ORklHX0hPTUU9L252aW0vaG9tZS8uY29uZmlnIiwKICAgICAgIlhER19EQVRBX0hPTUU9L252aW0vaG9tZS8ubG9jYWwvc2hhcmUiLAogICAgICAiWERHX1NUQVRFX0hPTUU9L252aW0vaG9tZS8ubG9jYWwvc3RhdGUiLAogICAgICAiUEFUSD0vdXNyL2JpbjovYmluIiwKICAgICAgIlRNUERJUj0vbnZpbS90bXAiLAogICAgICBgQ09MVU1OUz0ke2NvbHMgfHwgMTIwfWAsCiAgICAgIGBMSU5FUz0ke3Jvd3MgfHwgNDB9YCwKICAgIF07CiAgICBpZiAoZXh0cmFFbnYgJiYgdHlwZW9mIGV4dHJhRW52ID09PSAib2JqZWN0IikgewogICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhleHRyYUVudikpIHsKICAgICAgICBpZiAoIWspIGNvbnRpbnVlOwogICAgICAgIGVudi5wdXNoKGAke2t9PSR7U3RyaW5nKHYgPz8gIiIpfWApOwogICAgICB9CiAgICB9CiAgICBhY3RpdmVXYXNpID0gbmV3IFdBU0koYXJncywgZW52LCBbc3RkaW5GZCwgc3Rkb3V0RmQsIHN0ZGVyckZkLCBwcmVvcGVuLCBwcmVvcGVuVG1wXSwgeyBkZWJ1ZzogZmFsc2UgfSk7CiAgICBhY3RpdmVXYXNpLmZkc1swXSA9IHN0ZGluRmQ7CiAgICBhY3RpdmVXYXNpLmZkc1sxXSA9IHN0ZG91dEZkOwogICAgYWN0aXZlV2FzaS5mZHNbMl0gPSBzdGRlcnJGZDsKICAgIGFjdGl2ZVdhc2kuZmRzWzNdID0gcHJlb3BlbjsKICAgIGFjdGl2ZVdhc2kuZmRzWzRdID0gcHJlb3BlblRtcDsKICAgIChhY3RpdmVXYXNpIGFzIHVua25vd24gYXMgeyBwcmVvcGVuczogUmVjb3JkPHN0cmluZywgUHJlb3BlbkRpcmVjdG9yeT4gfSkucHJlb3BlbnMgPSB7ICIvbnZpbSI6IHByZW9wZW4sICIvdG1wIjogcHJlb3BlblRtcCB9OwoKICAgIGNvbnN0IGVudkltcG9ydHMgPSBtYWtlRW52KCgpID0+IGFjdGl2ZVdhc2k/Lndhc2lJbXBvcnQ/LnByb2NfZXhpdD8uKDEpKTsKICAgIGNvbnN0IHdhc21JbnN0YW5jZSA9IGF3YWl0IFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKHdhc21CeXRlcywgewogICAgICB3YXNpX3NuYXBzaG90X3ByZXZpZXcxOiBhY3RpdmVXYXNpLndhc2lJbXBvcnQsCiAgICAgIGVudjogZW52SW1wb3J0cywKICAgIH0pOwogICAgY29uc3QgaW5zdGFuY2VTb3VyY2UgPSB3YXNtSW5zdGFuY2UgYXMgdW5rbm93biBhcyBXZWJBc3NlbWJseS5XZWJBc3NlbWJseUluc3RhbnRpYXRlZFNvdXJjZTsKICAgIGNvbnN0IGluc3RhbmNlID0gaW5zdGFuY2VTb3VyY2UuaW5zdGFuY2UKICAgICAgPz8gKHdhc21JbnN0YW5jZSBhcyB1bmtub3duIGFzIHsgaW5zdGFuY2U6IFdlYkFzc2VtYmx5Lkluc3RhbmNlIH0pLmluc3RhbmNlOwogICAgZXhpdENvZGUgPSBhY3RpdmVXYXNpLnN0YXJ0KGluc3RhbmNlIGFzIGFueSk7CiAgfSBjYXRjaCAoZXJyKSB7CiAgICBjb25zdCBtZXNzYWdlID0gKGVyciBhcyB7IG1lc3NhZ2U/OiBzdHJpbmcgfSk/Lm1lc3NhZ2UgfHwgU3RyaW5nKGVycik7CiAgICBjb25zdCBzdGFjayA9IChlcnIgYXMgeyBzdGFjaz86IHN0cmluZyB9KT8uc3RhY2s7CiAgICBwb3N0TWVzc2FnZSh7IHR5cGU6ICJzdGFydC1lcnJvciIsIG1lc3NhZ2U6IHN0YWNrID8gYCR7bWVzc2FnZX1cbiR7c3RhY2t9YCA6IG1lc3NhZ2UgfSk7CiAgfQoKICBwb3N0TWVzc2FnZSh7IHR5cGU6ICJleGl0IiwgY29kZTogZXhpdENvZGUsIGxhc3RTdGRlcnIgfSk7Cn0KCmFzeW5jIGZ1bmN0aW9uIGdldENhY2hlZFdhc21CeXRlcyh1cmw6IHN0cmluZyk6IFByb21pc2U8VWludDhBcnJheT4gewogIGlmIChjYWNoZWRXYXNtICYmIGNhY2hlZFdhc20udXJsID09PSB1cmwgJiYgY2FjaGVkV2FzbS5ieXRlcz8uYnl0ZUxlbmd0aCkgcmV0dXJuIGNhY2hlZFdhc20uYnl0ZXM7CiAgY29uc3QgYnl0ZXMgPSBhd2FpdCBmZXRjaEJ5dGVzKHVybCk7CiAgY2FjaGVkV2FzbSA9IHsgdXJsLCBieXRlcyB9OwogIHJldHVybiBieXRlczsKfQoKYXN5bmMgZnVuY3Rpb24gZ2V0Q2FjaGVkUnVudGltZUVudHJpZXModXJsOiBzdHJpbmcpOiBQcm9taXNlPFRhckVudHJ5W10+IHsKICBpZiAoY2FjaGVkUnVudGltZSAmJiBjYWNoZWRSdW50aW1lLnVybCA9PT0gdXJsICYmIGNhY2hlZFJ1bnRpbWUuZW50cmllcz8ubGVuZ3RoKSByZXR1cm4gY2FjaGVkUnVudGltZS5lbnRyaWVzOwogIGNvbnN0IGFyY2hpdmUgPSBhd2FpdCBmZXRjaEJ5dGVzKHVybCk7CiAgbGV0IHJ1bnRpbWVCeXRlczogVWludDhBcnJheTsKICBpZiAobG9va3NMaWtlR3ppcChhcmNoaXZlKSkgewogICAgdHJ5IHsKICAgICAgcnVudGltZUJ5dGVzID0gZ3VuemlwU3luYyhhcmNoaXZlKTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKGBndW56aXAgcnVudGltZSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpPy5tZXNzYWdlID8/IGV9YCk7CiAgICB9CiAgfSBlbHNlIHsKICAgIHJ1bnRpbWVCeXRlcyA9IGFyY2hpdmU7CiAgfQogIGxldCBlbnRyaWVzOiBUYXJFbnRyeVtdOwogIHRyeSB7CiAgICBlbnRyaWVzID0gdW50YXIocnVudGltZUJ5dGVzKTsKICB9IGNhdGNoIChlKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoYHVudGFyIHJ1bnRpbWUgZmFpbGVkOiAkeyhlIGFzIEVycm9yKT8ubWVzc2FnZSA/PyBlfWApOwogIH0KICBjYWNoZWRSdW50aW1lID0geyB1cmwsIGVudHJpZXMgfTsKICByZXR1cm4gZW50cmllczsKfQoKZnVuY3Rpb24gYXBwbHlFeHRyYUZpbGVzKGZzUm9vdDogRGlyTm9kZSwgZmlsZXM6IEFycmF5PHsgcGF0aDogc3RyaW5nOyBkYXRhOiBhbnkgfT4pIHsKICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHsKICAgIGNvbnN0IHJhd1BhdGggPSBTdHJpbmcoZmlsZT8ucGF0aCA/PyAiIik7CiAgICBjb25zdCBjbGVhbiA9IHJhd1BhdGgucmVwbGFjZSgvXlwvKy8sICIiKS5yZXBsYWNlKC9eXC5cLysvLCAiIik7CiAgICBpZiAoIWNsZWFuIHx8IGNsZWFuLmVuZHNXaXRoKCIvIikpIGNvbnRpbnVlOwogICAgY29uc3QgZGF0YSA9IHRvVTgoZmlsZT8uZGF0YSk7CiAgICBpZiAoIWRhdGEpIGNvbnRpbnVlOwogICAgY29uc3QgcGFydHMgPSBjbGVhbi5zcGxpdCgiLyIpLmZpbHRlcihCb29sZWFuKTsKICAgIGlmICghcGFydHMubGVuZ3RoKSBjb250aW51ZTsKICAgIGxldCBkaXI6IERpck5vZGUgPSBmc1Jvb3Q7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aCAtIDE7IGkgKz0gMSkgewogICAgICBjb25zdCBwYXJ0ID0gcGFydHNbaV07CiAgICAgIGlmICghZGlyLmNvbnRlbnRzLmhhcyhwYXJ0KSkgZGlyLmNvbnRlbnRzLnNldChwYXJ0LCBuZXcgRGlyZWN0b3J5KG5ldyBNYXAoKSkpOwogICAgICBkaXIgPSBkaXIuY29udGVudHMuZ2V0KHBhcnQpIGFzIERpck5vZGU7CiAgICB9CiAgICBjb25zdCBsZWFmID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV07CiAgICBkaXIuY29udGVudHMuc2V0KGxlYWYsIG5ldyBGaWxlKGRhdGEsIHsgcmVhZG9ubHk6IGZhbHNlIH0pKTsKICB9Cn0KCmZ1bmN0aW9uIHRvVTgoZGF0YTogYW55KTogVWludDhBcnJheSB8IG51bGwgewogIGlmICghZGF0YSkgcmV0dXJuIG5ldyBVaW50OEFycmF5KCk7CiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSByZXR1cm4gZGF0YTsKICBpZiAoZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7CiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBTaGFyZWRBcnJheUJ1ZmZlcikgcmV0dXJuIG5ldyBVaW50OEFycmF5KGRhdGEpOwogIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7CiAgaWYgKGRhdGEgJiYgZGF0YS50eXBlID09PSAiQnVmZmVyIiAmJiBBcnJheS5pc0FycmF5KGRhdGEuZGF0YSkpIHJldHVybiBuZXcgVWludDhBcnJheShkYXRhLmRhdGEpOwogIHRyeSB7CiAgICByZXR1cm4gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKFN0cmluZyhkYXRhKSk7CiAgfSBjYXRjaCAoXykgewogICAgcmV0dXJuIG51bGw7CiAgfQp9CgpmdW5jdGlvbiBoYW5kbGVTdGRvdXQoY2h1bms6IFVpbnQ4QXJyYXkpIHsKICBpZiAoIXJwY0RlY29kZXIpIHsKICAgIHJwY0RlY29kZXIgPSBuZXcgRGVjb2RlcihoYW5kbGVNZXNzYWdlKTsKICB9CiAgdHJ5IHsKICAgIHJwY0RlY29kZXIucHVzaChjaHVuayk7CiAgfSBjYXRjaCAoZXJyKSB7CiAgICB2b2lkIGVycjsKICAgIHJwY0RlY29kZXIgPSBuZXcgRGVjb2RlcihoYW5kbGVNZXNzYWdlKTsKICB9Cn0KCmZ1bmN0aW9uIGhhbmRsZU1lc3NhZ2UobXNnOiB1bmtub3duKSB7CiAgaWYgKCFBcnJheS5pc0FycmF5KG1zZykgfHwgbXNnLmxlbmd0aCA8IDEpIHJldHVybjsKICBjb25zdCBraW5kID0gbXNnWzBdOwogIGlmIChraW5kID09PSAwKSB7CiAgICBjb25zdCBbLCBtc2dpZCwgbWV0aG9kLCBwYXJhbXNdID0gbXNnOwogICAgaWYgKG1ldGhvZCA9PT0gIndhc20tY2xpcGJvYXJkLXBhc3RlIikgewogICAgICBwb3N0TWVzc2FnZSh7IHR5cGU6ICJjbGlwYm9hcmQtcGFzdGUiLCBtc2dpZCB9KTsKICAgIH0gZWxzZSB7CiAgICAgIHBvc3RNZXNzYWdlKHsgdHlwZTogInJwYy1yZXF1ZXN0IiwgbXNnaWQsIG1ldGhvZCwgcGFyYW1zIH0pOwogICAgfQogIH0gZWxzZSBpZiAoa2luZCA9PT0gMSkgewogICAgY29uc3QgWywgbXNnaWQsIGVycm9yLCByZXN1bHRdID0gbXNnOwogICAgcG9zdE1lc3NhZ2UoeyB0eXBlOiAicnBjLXJlc3BvbnNlIiwgbXNnaWQsIGVycm9yLCByZXN1bHQgfSk7CiAgfSBlbHNlIGlmIChraW5kID09PSAyKSB7CiAgICBjb25zdCBbLCBtZXRob2QsIHBhcmFtc10gPSBtc2c7CiAgICBpZiAobWV0aG9kID09PSAid2FzbS1jbGlwYm9hcmQtY29weSIpIHsKICAgICAgY29uc3QgbGluZXMgPSBBcnJheS5pc0FycmF5KHBhcmFtcz8uWzBdKSA/IHBhcmFtc1swXSA6IFtdOwogICAgICBjb25zdCByZWd0eXBlID0gdHlwZW9mIHBhcmFtcz8uWzFdID09PSAic3RyaW5nIiA/IHBhcmFtc1sxXSA6ICJ2IjsKICAgICAgcG9zdE1lc3NhZ2UoeyB0eXBlOiAiY2xpcGJvYXJkLWNvcHkiLCBsaW5lcywgcmVndHlwZSB9KTsKICAgIH0gZWxzZSBpZiAoCiAgICAgIG1ldGhvZCA9PT0gIm52aW1fYnVmX2xpbmVzX2V2ZW50IgogICAgICB8fCBtZXRob2QgPT09ICJudmltX2J1Zl9kZXRhY2hfZXZlbnQiCiAgICAgIHx8IG1ldGhvZCA9PT0gInJlZHJhdyIKICAgICAgfHwgbWV0aG9kID09PSAibW9uYWNvX2N1cnNvciIKICAgICAgfHwgbWV0aG9kID09PSAibW9uYWNvX21vZGUiCiAgICAgIHx8IG1ldGhvZCA9PT0gIm1vbmFjb19jdXJzb3JNb3ZlIgogICAgICB8fCBtZXRob2QgPT09ICJtb25hY29fc2Nyb2xsIgogICAgICB8fCBtZXRob2QgPT09ICJtb25hY29fcmV2ZWFsIgogICAgICB8fCBtZXRob2QgPT09ICJtb25hY29fbW92ZUN1cnNvciIKICAgICAgfHwgbWV0aG9kID09PSAibW9uYWNvX3Njcm9sbG9mZiIKICAgICAgfHwgbWV0aG9kID09PSAibW9uYWNvX2hvc3RfY29tbWFuZCIKICAgICAgfHwgbWV0aG9kID09PSAibW9uYWNvX2J1Zl9lbnRlciIKICAgICAgfHwgbWV0aG9kID09PSAibW9uYWNvX2J1Zl9kZWxldGUiCiAgICApIHsKICAgICAgcG9zdE1lc3NhZ2UoeyB0eXBlOiAicnBjLW5vdGlmeSIsIG1ldGhvZCwgcGFyYW1zIH0pOwogICAgfQogIH0KfQoKYXN5bmMgZnVuY3Rpb24gZmV0Y2hCeXRlcyh1cmw6IHN0cmluZyk6IFByb21pc2U8VWludDhBcnJheT4gewogIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCk7CiAgaWYgKCFyZXMub2spIHRocm93IG5ldyBFcnJvcihgZmV0Y2ggJHt1cmx9IGZhaWxlZCAoJHtyZXMuc3RhdHVzfSlgKTsKICBjb25zdCBjdCA9IChyZXMuaGVhZGVycy5nZXQoImNvbnRlbnQtdHlwZSIpIHx8ICIiKS50b0xvd2VyQ2FzZSgpOwogIGlmIChjdC5pbmNsdWRlcygidGV4dC9odG1sIikpIHRocm93IG5ldyBFcnJvcihgZmV0Y2ggJHt1cmx9IHJldHVybmVkIEhUTUwgKGxpa2VseSB3cm9uZyBwYXRoIG9yIGRldiBzZXJ2ZXIgZmFsbGJhY2spYCk7CiAgY29uc3QgZGF0YSA9IG5ldyBVaW50OEFycmF5KGF3YWl0IHJlcy5hcnJheUJ1ZmZlcigpKTsKICBpZiAoIWRhdGEuYnl0ZUxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKGBmZXRjaCAke3VybH0gcmV0dXJuZWQgZW1wdHkgYm9keWApOwogIHJldHVybiBkYXRhOwp9Cgp0eXBlIFRhckVudHJ5ID0geyBuYW1lOiBzdHJpbmc7IHR5cGU6ICJkaXIiIHwgImZpbGUiOyBkYXRhOiBVaW50OEFycmF5IH07CgpmdW5jdGlvbiBsb29rc0xpa2VHemlwKGRhdGE6IFVpbnQ4QXJyYXkpIHsKICByZXR1cm4gZGF0YSAmJiBkYXRhLmxlbmd0aCA+PSAyICYmIGRhdGFbMF0gPT09IDB4MWYgJiYgZGF0YVsxXSA9PT0gMHg4YjsKfQoKZnVuY3Rpb24gdW50YXIoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBUYXJFbnRyeVtdIHsKICBjb25zdCBmaWxlczogVGFyRW50cnlbXSA9IFtdOwogIGNvbnN0IGRhdGEgPSBieXRlcyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgPyBieXRlcyA6IG5ldyBVaW50OEFycmF5KGJ5dGVzKTsKICBsZXQgb2Zmc2V0ID0gMDsKICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7CiAgbGV0IHNhZmV0eSA9IDA7CgogIHdoaWxlIChvZmZzZXQgKyA1MTIgPD0gZGF0YS5sZW5ndGgpIHsKICAgIGlmIChzYWZldHkrKyA+IDEwMF8wMDApIHRocm93IG5ldyBFcnJvcigidW50YXIgc2FmZXR5IGJyZWFrIik7CiAgICBjb25zdCBuYW1lID0gZGVjb2RlVGFyU3RyaW5nKGRlY29kZXIsIGRhdGEsIG9mZnNldCwgMTAwKTsKICAgIGNvbnN0IHNpemVUZXh0ID0gZGVjb2RlVGFyU3RyaW5nKGRlY29kZXIsIGRhdGEsIG9mZnNldCArIDEyNCwgMTIpOwogICAgY29uc3QgdHlwZWZsYWcgPSBkYXRhW29mZnNldCArIDE1Nl07CiAgICBjb25zdCBwcmVmaXggPSBkZWNvZGVUYXJTdHJpbmcoZGVjb2RlciwgZGF0YSwgb2Zmc2V0ICsgMzQ1LCAxNTUpOwogICAgaWYgKCFuYW1lICYmICFwcmVmaXgpIGJyZWFrOwogICAgY29uc3Qgc2l6ZVJhdyA9IHNpemVUZXh0LnRyaW0oKSB8fCAiMCI7CiAgICBjb25zdCBzaXplID0gcGFyc2VJbnQoc2l6ZVJhdywgOCk7CiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShzaXplKSB8fCBzaXplIDwgMCkgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHRhciBzaXplOiAke3NpemVSYXd9YCk7CiAgICBjb25zdCBmdWxsTmFtZSA9IHByZWZpeCA/IGAke3ByZWZpeH0vJHtuYW1lfWAgOiBuYW1lOwogICAgY29uc3QgYm9keVN0YXJ0ID0gb2Zmc2V0ICsgNTEyOwogICAgY29uc3QgYm9keUVuZCA9IGJvZHlTdGFydCArIHNpemU7CiAgICBjb25zdCBwYXlsb2FkID0gZGF0YS5zbGljZShib2R5U3RhcnQsIGJvZHlFbmQpOwogICAgZmlsZXMucHVzaCh7IG5hbWU6IGZ1bGxOYW1lLCB0eXBlOiB0eXBlZmxhZyA9PT0gNTMgPyAiZGlyIiA6ICJmaWxlIiwgZGF0YTogcGF5bG9hZCB9KTsKICAgIGNvbnN0IGJsb2NrcyA9IE1hdGguY2VpbChzaXplIC8gNTEyKTsKICAgIGNvbnN0IG5leHQgPSBib2R5U3RhcnQgKyBibG9ja3MgKiA1MTI7CiAgICBpZiAobmV4dCA8PSBvZmZzZXQpIHRocm93IG5ldyBFcnJvcigidGFyIHBhcnNlIGRpZCBub3QgYWR2YW5jZSIpOwogICAgb2Zmc2V0ID0gbmV4dDsKICB9CiAgcmV0dXJuIGZpbGVzOwp9CgpmdW5jdGlvbiBkZWNvZGVUYXJTdHJpbmcoZGVjb2RlcjogVGV4dERlY29kZXIsIGRhdGE6IFVpbnQ4QXJyYXksIHN0YXJ0OiBudW1iZXIsIGxlbmd0aDogbnVtYmVyKTogc3RyaW5nIHsKICBsZXQgZW5kID0gc3RhcnQ7CiAgY29uc3QgbWF4ID0gc3RhcnQgKyBsZW5ndGg7CiAgd2hpbGUgKGVuZCA8IG1heCAmJiBkYXRhW2VuZF0gIT09IDApIGVuZCArPSAxOwogIHJldHVybiBkZWNvZGVyLmRlY29kZShkYXRhLnN1YmFycmF5KHN0YXJ0LCBlbmQpKS50cmltKCk7Cn0KCmZ1bmN0aW9uIGJ1aWxkRnMoZW50cmllczogVGFyRW50cnlbXSwgb25Qcm9ncmVzcz86IChjb3VudDogbnVtYmVyKSA9PiB2b2lkKSB7CiAgY29uc3Qgcm9vdCA9IG5ldyBEaXJlY3RvcnkobmV3IE1hcCgpKSBhcyBEaXJOb2RlOwogIGxldCBjb3VudCA9IDA7CiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7CiAgICBjb25zdCBjbGVhbiA9IGVudHJ5Lm5hbWUucmVwbGFjZSgvXlwuXC8/LywgIiIpOwogICAgaWYgKCFjbGVhbikgY29udGludWU7CiAgICBjb25zdCBwYXJ0cyA9IGNsZWFuLnNwbGl0KCIvIikuZmlsdGVyKEJvb2xlYW4pOwogICAgaWYgKCFwYXJ0cy5sZW5ndGgpIGNvbnRpbnVlOwogICAgY291bnQgKz0gMTsKICAgIGlmIChvblByb2dyZXNzICYmIGNvdW50ICUgNTAwID09PSAwKSBvblByb2dyZXNzKGNvdW50KTsKCiAgICBsZXQgZGlyOiBEaXJOb2RlID0gcm9vdDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSArPSAxKSB7CiAgICAgIGNvbnN0IHBhcnQgPSBwYXJ0c1tpXTsKICAgICAgaWYgKCFkaXIuY29udGVudHMuaGFzKHBhcnQpKSBkaXIuY29udGVudHMuc2V0KHBhcnQsIG5ldyBEaXJlY3RvcnkobmV3IE1hcCgpKSk7CiAgICAgIGRpciA9IGRpci5jb250ZW50cy5nZXQocGFydCkgYXMgRGlyTm9kZTsKICAgIH0KCiAgICBjb25zdCBsZWFmID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV07CiAgICBpZiAoZW50cnkudHlwZSA9PT0gImRpciIpIHsKICAgICAgaWYgKCFkaXIuY29udGVudHMuaGFzKGxlYWYpKSBkaXIuY29udGVudHMuc2V0KGxlYWYsIG5ldyBEaXJlY3RvcnkobmV3IE1hcCgpKSk7CiAgICB9IGVsc2UgewogICAgICBkaXIuY29udGVudHMuc2V0KGxlYWYsIG5ldyBGaWxlKGVudHJ5LmRhdGEsIHsgcmVhZG9ubHk6IHRydWUgfSkpOwogICAgfQogIH0KCiAgZW5zdXJlRGlyKHJvb3QsICJob21lIik7CiAgZW5zdXJlRGlyKHJvb3QsICJ0bXAiKTsKICBlbnN1cmVEaXIocm9vdCwgImhvbWUvLmNvbmZpZyIpOwogIGVuc3VyZURpcihyb290LCAiaG9tZS8ubG9jYWwvc2hhcmUiKTsKICBlbnN1cmVEaXIocm9vdCwgImhvbWUvLmxvY2FsL3N0YXRlIik7CgogIHJldHVybiByb290Owp9CgpmdW5jdGlvbiBlbnN1cmVEaXIocm9vdDogRGlyTm9kZSwgcGF0aDogc3RyaW5nKSB7CiAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KCIvIikuZmlsdGVyKEJvb2xlYW4pOwogIGxldCBub2RlOiBEaXJOb2RlID0gcm9vdDsKICBmb3IgKGNvbnN0IHAgb2YgcGFydHMpIHsKICAgIGlmICghbm9kZS5jb250ZW50cy5oYXMocCkpIG5vZGUuY29udGVudHMuc2V0KHAsIG5ldyBEaXJlY3RvcnkobmV3IE1hcCgpKSk7CiAgICBub2RlID0gbm9kZS5jb250ZW50cy5nZXQocCkgYXMgRGlyTm9kZTsKICB9Cn0KCmZ1bmN0aW9uIG1ha2VFbnYocHJvY0V4aXQ/OiAoY29kZTogbnVtYmVyKSA9PiB2b2lkKSB7CiAgY29uc3Qgd2FzbUFueSA9IFdlYkFzc2VtYmx5IGFzIGFueTsKICBjb25zdCBjTG9uZ2ptcCA9IG5ldyB3YXNtQW55LlRhZyh7IHBhcmFtZXRlcnM6IFsiaTMyIl0sIHJlc3VsdHM6IFtdIH0pIGFzIGFueTsKICByZXR1cm4gewogICAgZmxvY2s6ICgpID0+IDAsCiAgICBnZXRwaWQ6ICgpID0+IDEsCiAgICB1dl9yYW5kb206ICgpID0+IC0zOCwKICAgIHV2X3d0ZjhfdG9fdXRmMTY6ICgpID0+IHt9LAogICAgdXZfdXRmMTZfbGVuZ3RoX2FzX3d0Zjg6ICgpID0+IDAsCiAgICB1dl91dGYxNl90b193dGY4OiAoKSA9PiAtMzgsCiAgICB1dl93dGY4X2xlbmd0aF9hc191dGYxNjogKCkgPT4gMCwKICAgIF9fd2FzbV9sb25nam1wOiAocHRyOiBudW1iZXIpID0+IHsKICAgICAgaWYgKHByb2NFeGl0KSBwcm9jRXhpdCgxKTsKICAgICAgdGhyb3cgbmV3IHdhc21BbnkuRXhjZXB0aW9uKGNMb25nam1wLCBbcHRyID8/IDBdKTsKICAgIH0sCiAgICBfX3dhc21fc2V0am1wOiAoKSA9PiAwLAogICAgX193YXNtX3NldGptcF90ZXN0OiAoKSA9PiAwLAogICAgdG1wZmlsZTogKCkgPT4gMCwKICAgIGNsb2NrOiAoKSA9PiAwLAogICAgc3lzdGVtOiAoKSA9PiAtMSwKICAgIHRtcG5hbTogKCkgPT4gMCwKICAgIF9fY19sb25nam1wOiBjTG9uZ2ptcCwKICB9IGFzIFdlYkFzc2VtYmx5Lk1vZHVsZUltcG9ydHM7Cn0KCmNsYXNzIFJvb3RlZFByZW9wZW5EaXJlY3RvcnkgZXh0ZW5kcyBQcmVvcGVuRGlyZWN0b3J5IHsKICAjc3RyaXAocGF0aDogc3RyaW5nKSB7IHJldHVybiBwYXRoLnJlcGxhY2UoL15cLysvLCAiIik7IH0KICBwYXRoX29wZW4oCiAgICBkaXJmbGFnczogbnVtYmVyLAogICAgcGF0aF9zdHI6IHN0cmluZywKICAgIG9mbGFnczogbnVtYmVyLAogICAgZnNfcmlnaHRzX2Jhc2U6IGJpZ2ludCwKICAgIGZzX3JpZ2h0c19pbmhlcml0aW5nOiBiaWdpbnQsCiAgICBmZF9mbGFnczogbnVtYmVyLAogICkgewogICAgcmV0dXJuIHN1cGVyLnBhdGhfb3BlbihkaXJmbGFncywgdGhpcy4jc3RyaXAocGF0aF9zdHIpLCBvZmxhZ3MsIGZzX3JpZ2h0c19iYXNlLCBmc19yaWdodHNfaW5oZXJpdGluZywgZmRfZmxhZ3MpOwogIH0KICBwYXRoX2ZpbGVzdGF0X2dldChmbGFnczogbnVtYmVyLCBwYXRoX3N0cjogc3RyaW5nKSB7IHJldHVybiBzdXBlci5wYXRoX2ZpbGVzdGF0X2dldChmbGFncywgdGhpcy4jc3RyaXAocGF0aF9zdHIpKTsgfQogIHBhdGhfY3JlYXRlX2RpcmVjdG9yeShwYXRoX3N0cjogc3RyaW5nKSB7IHJldHVybiBzdXBlci5wYXRoX2NyZWF0ZV9kaXJlY3RvcnkodGhpcy4jc3RyaXAocGF0aF9zdHIpKTsgfQogIHBhdGhfdW5saW5rX2ZpbGUocGF0aF9zdHI6IHN0cmluZykgeyByZXR1cm4gc3VwZXIucGF0aF91bmxpbmtfZmlsZSh0aGlzLiNzdHJpcChwYXRoX3N0cikpOyB9CiAgcGF0aF9yZW1vdmVfZGlyZWN0b3J5KHBhdGhfc3RyOiBzdHJpbmcpIHsgcmV0dXJuIHN1cGVyLnBhdGhfcmVtb3ZlX2RpcmVjdG9yeSh0aGlzLiNzdHJpcChwYXRoX3N0cikpOyB9CiAgcGF0aF9saW5rKHBhdGhfc3RyOiBzdHJpbmcsIGlub2RlOiBJbm9kZSwgYWxsb3dfZGlyOiBib29sZWFuKSB7IHJldHVybiBzdXBlci5wYXRoX2xpbmsodGhpcy4jc3RyaXAocGF0aF9zdHIpLCBpbm9kZSwgYWxsb3dfZGlyKTsgfQogIHBhdGhfcmVhZGxpbmsocGF0aF9zdHI6IHN0cmluZykgeyByZXR1cm4gc3VwZXIucGF0aF9yZWFkbGluayh0aGlzLiNzdHJpcChwYXRoX3N0cikpOyB9CiAgcGF0aF9zeW1saW5rKG9sZF9wYXRoOiBzdHJpbmcsIG5ld19wYXRoOiBzdHJpbmcpIHsKICAgIGNvbnN0IHRhcmdldCA9IChQcmVvcGVuRGlyZWN0b3J5LnByb3RvdHlwZSBhcyB1bmtub3duIGFzIHsgcGF0aF9zeW1saW5rPzogKG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKSA9PiBudW1iZXIgfSkucGF0aF9zeW1saW5rOwogICAgaWYgKCF0YXJnZXQpIHJldHVybiB3YXNpLkVSUk5PX05PVFNVUDsKICAgIHJldHVybiB0YXJnZXQuY2FsbCh0aGlzLCB0aGlzLiNzdHJpcChvbGRfcGF0aCksIHRoaXMuI3N0cmlwKG5ld19wYXRoKSk7CiAgfQp9Cg==", import.meta.url), Ye = new URL("data:video/mp2t;base64,aW1wb3J0IHsKICBXQVNJLAogIHdhc2ksCiAgV0FTSVByb2NFeGl0LAogIERpcmVjdG9yeSwKICBGaWxlLAogIFByZW9wZW5EaXJlY3RvcnksCiAgRmQsCiAgSW5vZGUsCn0gZnJvbSAiQGJqb3JuMy9icm93c2VyX3dhc2lfc2hpbSI7CmltcG9ydCB7IGd1bnppcFN5bmMgfSBmcm9tICJmZmxhdGUiOwppbXBvcnQgeyBEZWNvZGVyIH0gZnJvbSAiLi9tc2dwYWNrIjsKCnR5cGUgU3RhcnRNZXNzYWdlID0gewogIHR5cGU6ICJzdGFydCI7CiAgY29scz86IG51bWJlcjsKICByb3dzPzogbnVtYmVyOwogIHdhc21QYXRoOiBzdHJpbmc7CiAgcnVudGltZVBhdGg6IHN0cmluZzsKICBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgbnVsbDsKICBmaWxlcz86IEFycmF5PHsgcGF0aDogc3RyaW5nOyBkYXRhOiBVaW50OEFycmF5IHwgQXJyYXlCdWZmZXIgfCBBcnJheUxpa2U8bnVtYmVyPiB8IHsgdHlwZTogIkJ1ZmZlciI7IGRhdGE6IG51bWJlcltdIH0gfT4gfCBudWxsOwp9OwoKdHlwZSBTdG9wTWVzc2FnZSA9IHsgdHlwZTogInN0b3AiIH07CnR5cGUgU3RkaW5NZXNzYWdlID0geyB0eXBlOiAic3RkaW4iOyBjaHVuaz86IFVpbnQ4QXJyYXkgfCBBcnJheUJ1ZmZlciB8IEFycmF5TGlrZTxudW1iZXI+IHwgeyB0eXBlOiAiQnVmZmVyIjsgZGF0YTogbnVtYmVyW10gfSB9OwoKdHlwZSBJbmJvdW5kTWVzc2FnZSA9IFN0YXJ0TWVzc2FnZSB8IFN0b3BNZXNzYWdlIHwgU3RkaW5NZXNzYWdlOwoKdHlwZSBEaXJOb2RlID0gRGlyZWN0b3J5ICYgeyBjb250ZW50czogTWFwPHN0cmluZywgYW55PiB9OwoKbGV0IHJwY0RlY29kZXI6IERlY29kZXIgfCBudWxsID0gbnVsbDsKbGV0IGFjdGl2ZVdhc2k6IFdBU0kgfCBudWxsID0gbnVsbDsKbGV0IHN0ZGluRmQ6IE1lc3NhZ2VJbnB1dEZkIHwgbnVsbCA9IG51bGw7CmxldCB3YXNtRXhwb3J0czogYW55ID0gbnVsbDsKbGV0IHBlbmRpbmdBc3luYzogUHJvbWlzZTx2b2lkPiB8IG51bGwgPSBudWxsOwpsZXQgcGVuZGluZ1BvbGxPbmVvZmY6IHsgaW5fcHRyOiBudW1iZXI7IG5zdWJzY3JpcHRpb25zOiBudW1iZXI7IGNsb2NrRGVhZGxpbmVzOiBBcnJheTxiaWdpbnQgfCBudWxsPiB9IHwgbnVsbCA9IG51bGw7CmxldCBzdGRpbldhaXRQcm9taXNlOiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7CgpsZXQgYXN5bmNpZnlEYXRhUHRyID0gMDsKbGV0IGFzeW5jaWZ5U3RhY2tTdGFydCA9IDA7CmxldCBhc3luY2lmeVN0YWNrRW5kID0gMDsKCmNvbnN0IHN0ZGVyckRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTsKbGV0IGxhc3RTdGRlcnIgPSAiIjsKbGV0IGZhdGFsU2VudCA9IGZhbHNlOwpsZXQgY2FjaGVkV2FzbTogeyB1cmw6IHN0cmluZzsgYnl0ZXM6IFVpbnQ4QXJyYXkgfSB8IG51bGwgPSBudWxsOwpsZXQgY2FjaGVkUnVudGltZTogeyB1cmw6IHN0cmluZzsgZW50cmllczogVGFyRW50cnlbXSB9IHwgbnVsbCA9IG51bGw7CmNvbnN0IHBlbmRpbmdTdGRpbjogVWludDhBcnJheVtdID0gW107CgpzZWxmLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwgKGV2KSA9PiB7CiAgaWYgKGZhdGFsU2VudCkgcmV0dXJuOwogIGZhdGFsU2VudCA9IHRydWU7CiAgY29uc3QgbXNnID0gZXYubWVzc2FnZSB8fCBTdHJpbmcoKGV2IGFzIGFueSkuZXJyb3IgfHwgIndvcmtlciBlcnJvciIpOwogIGNvbnN0IHN0YWNrID0gKGV2IGFzIGFueSkuZXJyb3I/LnN0YWNrOwogIHRyeSB7CiAgICBwb3N0TWVzc2FnZSh7IHR5cGU6ICJzdGFydC1lcnJvciIsIG1lc3NhZ2U6IHN0YWNrID8gYCR7bXNnfVxuJHtzdGFja31gIDogbXNnIH0pOwogICAgcG9zdE1lc3NhZ2UoeyB0eXBlOiAiZXhpdCIsIGNvZGU6IDEsIGxhc3RTdGRlcnIgfSk7CiAgfSBjYXRjaCAoXykgewogIH0KfSk7CgpzZWxmLmFkZEV2ZW50TGlzdGVuZXIoInVuaGFuZGxlZHJlamVjdGlvbiIsIChldikgPT4gewogIGlmIChmYXRhbFNlbnQpIHJldHVybjsKICBmYXRhbFNlbnQgPSB0cnVlOwogIGNvbnN0IHJlYXNvbjogYW55ID0gKGV2IGFzIGFueSkucmVhc29uOwogIGNvbnN0IG1zZyA9IChyZWFzb24gJiYgKHJlYXNvbi5tZXNzYWdlIHx8IFN0cmluZyhyZWFzb24pKSkgfHwgInVuaGFuZGxlZCByZWplY3Rpb24iOwogIGNvbnN0IHN0YWNrID0gcmVhc29uPy5zdGFjazsKICB0cnkgewogICAgcG9zdE1lc3NhZ2UoeyB0eXBlOiAic3RhcnQtZXJyb3IiLCBtZXNzYWdlOiBzdGFjayA/IGAke21zZ31cbiR7c3RhY2t9YCA6IG1zZyB9KTsKICAgIHBvc3RNZXNzYWdlKHsgdHlwZTogImV4aXQiLCBjb2RlOiAxLCBsYXN0U3RkZXJyIH0pOwogIH0gY2F0Y2ggKF8pIHsKICB9Cn0pOwoKc2VsZi5vbm1lc3NhZ2UgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudDxJbmJvdW5kTWVzc2FnZT4pID0+IHsKICBjb25zdCB7IHR5cGUgfSA9IGV2ZW50LmRhdGEgfHwgKHt9IGFzIGFueSk7CiAgaWYgKHR5cGUgPT09ICJzdGFydCIpIHsKICAgIHN0YXJ0TnZpbShldmVudC5kYXRhIGFzIFN0YXJ0TWVzc2FnZSkuY2F0Y2goKGVycikgPT4gewogICAgICBwb3N0TWVzc2FnZSh7IHR5cGU6ICJzdGFydC1lcnJvciIsIG1lc3NhZ2U6IGVycj8ubWVzc2FnZSB8fCBTdHJpbmcoZXJyKSB9KTsKICAgICAgcG9zdE1lc3NhZ2UoeyB0eXBlOiAiZXhpdCIsIGNvZGU6IDEgfSk7CiAgICB9KTsKICB9IGVsc2UgaWYgKHR5cGUgPT09ICJzdGRpbiIpIHsKICAgIGNvbnN0IGNodW5rID0gdG9VOCgoZXZlbnQuZGF0YSBhcyBTdGRpbk1lc3NhZ2UpPy5jaHVuayk7CiAgICBpZiAoIWNodW5rPy5ieXRlTGVuZ3RoKSByZXR1cm47CiAgICBpZiAoc3RkaW5GZCkgewogICAgICBzdGRpbkZkLnB1c2goY2h1bmspOwogICAgfSBlbHNlIHsKICAgICAgcGVuZGluZ1N0ZGluLnB1c2goY2h1bmspOwogICAgfQogIH0gZWxzZSBpZiAodHlwZSA9PT0gInN0b3AiKSB7CiAgICB0cnkgewogICAgICBzdGRpbkZkPy5jbG9zZSgpOwogICAgfSBjYXRjaCAoXykgewogICAgfQogICAgdHJ5IHsKICAgICAgYWN0aXZlV2FzaT8ud2FzaUltcG9ydD8ucHJvY19leGl0Py4oMCk7CiAgICB9IGNhdGNoIChfKSB7CiAgICB9CiAgICBzdGRpbkZkID0gbnVsbDsKICB9Cn07CgpjbGFzcyBNZXNzYWdlSW5wdXRGZCBleHRlbmRzIEZkIHsKICBwcml2YXRlIGNodW5rczogVWludDhBcnJheVtdID0gW107CiAgdG90YWwgPSAwOwogIHByaXZhdGUgd2FpdGVyczogQXJyYXk8KCkgPT4gdm9pZD4gPSBbXTsKICBjbG9zZWQgPSBmYWxzZTsKCiAgZmRfZmRzdGF0X2dldCgpIHsKICAgIGNvbnN0IGZkc3RhdCA9IG5ldyB3YXNpLkZkc3RhdCh3YXNpLkZJTEVUWVBFX1JFR1VMQVJfRklMRSwgMCk7CiAgICBmZHN0YXQuZnNfcmlnaHRzX2Jhc2UgPSBCaWdJbnQod2FzaS5SSUdIVFNfRkRfUkVBRCB8IHdhc2kuUklHSFRTX0ZEX1dSSVRFKTsKICAgIHJldHVybiB7IHJldDogd2FzaS5FUlJOT19TVUNDRVNTLCBmZHN0YXQgfTsKICB9CgogIGZkX2Nsb3NlKCkgewogICAgdGhpcy5jbG9zZSgpOwogICAgcmV0dXJuIHdhc2kuRVJSTk9fU1VDQ0VTUzsKICB9CgogIGNsb3NlKCkgewogICAgaWYgKHRoaXMuY2xvc2VkKSByZXR1cm47CiAgICB0aGlzLmNsb3NlZCA9IHRydWU7CiAgICBjb25zdCB3YWl0ZXJzID0gdGhpcy53YWl0ZXJzOwogICAgdGhpcy53YWl0ZXJzID0gW107CiAgICBmb3IgKGNvbnN0IHcgb2Ygd2FpdGVycykgdygpOwogIH0KCiAgcHVzaChjaHVuazogVWludDhBcnJheSkgewogICAgaWYgKHRoaXMuY2xvc2VkKSByZXR1cm47CiAgICBpZiAoIWNodW5rPy5ieXRlTGVuZ3RoKSByZXR1cm47CiAgICB0aGlzLmNodW5rcy5wdXNoKGNodW5rKTsKICAgIHRoaXMudG90YWwgKz0gY2h1bmsuYnl0ZUxlbmd0aDsKICAgIGNvbnN0IHdhaXRlcnMgPSB0aGlzLndhaXRlcnM7CiAgICB0aGlzLndhaXRlcnMgPSBbXTsKICAgIGZvciAoY29uc3QgdyBvZiB3YWl0ZXJzKSB3KCk7CiAgfQoKICB3YWl0Rm9yRGF0YSgpIHsKICAgIGlmICh0aGlzLmNsb3NlZCB8fCB0aGlzLnRvdGFsID4gMCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOwogICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB0aGlzLndhaXRlcnMucHVzaChyZXNvbHZlKSk7CiAgfQoKICBmZF9yZWFkKHNpemU6IG51bWJlcikgewogICAgaWYgKHRoaXMuY2xvc2VkICYmIHRoaXMudG90YWwgPT09IDApIHJldHVybiB7IHJldDogd2FzaS5FUlJOT19TVUNDRVNTLCBkYXRhOiBuZXcgVWludDhBcnJheSgpIH07CiAgICBjb25zdCBtYXggPSBNYXRoLm1pbihNYXRoLm1heCgwLCBOdW1iZXIoc2l6ZSkgfHwgMCksIHRoaXMudG90YWwpOwogICAgaWYgKG1heCA9PT0gMCkgcmV0dXJuIHsgcmV0OiB3YXNpLkVSUk5PX0FHQUlOLCBkYXRhOiBuZXcgVWludDhBcnJheSgpIH07CiAgICBjb25zdCBvdXQgPSBuZXcgVWludDhBcnJheShtYXgpOwogICAgbGV0IHdyaXR0ZW4gPSAwOwogICAgd2hpbGUgKHdyaXR0ZW4gPCBtYXggJiYgdGhpcy5jaHVua3MubGVuZ3RoKSB7CiAgICAgIGNvbnN0IGZpcnN0ID0gdGhpcy5jaHVua3NbMF07CiAgICAgIGNvbnN0IHRha2UgPSBNYXRoLm1pbihmaXJzdC5ieXRlTGVuZ3RoLCBtYXggLSB3cml0dGVuKTsKICAgICAgb3V0LnNldChmaXJzdC5zdWJhcnJheSgwLCB0YWtlKSwgd3JpdHRlbik7CiAgICAgIHdyaXR0ZW4gKz0gdGFrZTsKICAgICAgaWYgKHRha2UgPT09IGZpcnN0LmJ5dGVMZW5ndGgpIHRoaXMuY2h1bmtzLnNoaWZ0KCk7CiAgICAgIGVsc2UgdGhpcy5jaHVua3NbMF0gPSBmaXJzdC5zdWJhcnJheSh0YWtlKTsKICAgIH0KICAgIHRoaXMudG90YWwgLT0gd3JpdHRlbjsKICAgIHJldHVybiB7IHJldDogd2FzaS5FUlJOT19TVUNDRVNTLCBkYXRhOiBvdXQgfTsKICB9CgogIGZkX3dyaXRlKCkgeyByZXR1cm4geyByZXQ6IHdhc2kuRVJSTk9fQkFERiwgbndyaXR0ZW46IDAgfTsgfQogIGZkX3NlZWsoKSB7IHJldHVybiB7IHJldDogd2FzaS5FUlJOT19CQURGLCBvZmZzZXQ6IDBuIH07IH0KICBmZF90ZWxsKCkgeyByZXR1cm4geyByZXQ6IHdhc2kuRVJSTk9fQkFERiwgb2Zmc2V0OiAwbiB9OyB9CiAgZmRfcHJlYWQoKSB7IHJldHVybiB7IHJldDogd2FzaS5FUlJOT19CQURGLCBkYXRhOiBuZXcgVWludDhBcnJheSgpIH07IH0KICBmZF9wd3JpdGUoKSB7IHJldHVybiB7IHJldDogd2FzaS5FUlJOT19CQURGLCBud3JpdHRlbjogMCB9OyB9Cn0KCmNsYXNzIFNpbmtGZCBleHRlbmRzIEZkIHsKICBwcml2YXRlIHJlYWRvbmx5IG9uV3JpdGU6IChkYXRhOiBVaW50OEFycmF5KSA9PiB2b2lkOwoKICBjb25zdHJ1Y3RvcihvbldyaXRlOiAoZGF0YTogVWludDhBcnJheSkgPT4gdm9pZCkgewogICAgc3VwZXIoKTsKICAgIHRoaXMub25Xcml0ZSA9IG9uV3JpdGU7CiAgfQoKICBmZF9mZHN0YXRfZ2V0KCkgewogICAgY29uc3QgZmRzdGF0ID0gbmV3IHdhc2kuRmRzdGF0KHdhc2kuRklMRVRZUEVfUkVHVUxBUl9GSUxFLCAwKTsKICAgIGZkc3RhdC5mc19yaWdodHNfYmFzZSA9IEJpZ0ludCh3YXNpLlJJR0hUU19GRF9XUklURSk7CiAgICByZXR1cm4geyByZXQ6IHdhc2kuRVJSTk9fU1VDQ0VTUywgZmRzdGF0IH07CiAgfQoKICBmZF93cml0ZShkYXRhOiBVaW50OEFycmF5KSB7CiAgICB0aGlzLm9uV3JpdGUobmV3IFVpbnQ4QXJyYXkoZGF0YSkpOwogICAgcmV0dXJuIHsgcmV0OiB3YXNpLkVSUk5PX1NVQ0NFU1MsIG53cml0dGVuOiBkYXRhLmJ5dGVMZW5ndGggfTsKICB9CgogIGZkX2Nsb3NlKCkgeyByZXR1cm4gd2FzaS5FUlJOT19TVUNDRVNTOyB9Cn0KCmFzeW5jIGZ1bmN0aW9uIHN0YXJ0TnZpbSh7IGNvbHMsIHJvd3MsIHdhc21QYXRoLCBydW50aW1lUGF0aCwgZW52OiBleHRyYUVudiwgZmlsZXMgfTogU3RhcnRNZXNzYWdlKSB7CiAgbGV0IGV4aXRDb2RlID0gMTsKICB0cnkgewogICAgcnBjRGVjb2RlciA9IG51bGw7CiAgICBzdGRpbldhaXRQcm9taXNlID0gbnVsbDsKICAgIHBlbmRpbmdBc3luYyA9IG51bGw7CiAgICBwZW5kaW5nUG9sbE9uZW9mZiA9IG51bGw7CiAgICB3YXNtRXhwb3J0cyA9IG51bGw7CgogICAgc3RkaW5GZCA9IG5ldyBNZXNzYWdlSW5wdXRGZCgpOwogICAgd2hpbGUgKHBlbmRpbmdTdGRpbi5sZW5ndGgpIHN0ZGluRmQucHVzaChwZW5kaW5nU3RkaW4uc2hpZnQoKSEpOwoKICAgIGNvbnN0IHdhc21CeXRlcyA9IGF3YWl0IGdldENhY2hlZFdhc21CeXRlcyh3YXNtUGF0aCk7CiAgICBjb25zdCB1bnRhcnJlZCA9IGF3YWl0IGdldENhY2hlZFJ1bnRpbWVFbnRyaWVzKHJ1bnRpbWVQYXRoKTsKICAgIGNvbnN0IGZzUm9vdCA9IGJ1aWxkRnModW50YXJyZWQsICgpID0+IHt9KTsKICAgIGlmIChmaWxlcyAmJiBBcnJheS5pc0FycmF5KGZpbGVzKSAmJiBmaWxlcy5sZW5ndGgpIGFwcGx5RXh0cmFGaWxlcyhmc1Jvb3QsIGZpbGVzKTsKCiAgICBjb25zdCBzdGRvdXRGZCA9IG5ldyBTaW5rRmQoaGFuZGxlU3Rkb3V0KTsKICAgIGNvbnN0IHN0ZGVyckZkID0gbmV3IFNpbmtGZCgoZGF0YSkgPT4gewogICAgICBjb25zdCBtc2cgPSBzdGRlcnJEZWNvZGVyLmRlY29kZShkYXRhKTsKICAgICAgaWYgKG1zZykgbGFzdFN0ZGVyciA9IChsYXN0U3RkZXJyICsgbXNnKS5zbGljZSgtODE5Mik7CiAgICAgIHBvc3RNZXNzYWdlKHsgdHlwZTogInN0ZGVyciIsIG1lc3NhZ2U6IG1zZyB9KTsKICAgIH0pOwoKICAgIGNvbnN0IHByZW9wZW4gPSBuZXcgUm9vdGVkUHJlb3BlbkRpcmVjdG9yeSgibnZpbSIsIGZzUm9vdC5jb250ZW50cyk7CiAgICBjb25zdCB0bXBEaXIgPSBmc1Jvb3QuY29udGVudHMuZ2V0KCJ0bXAiKSBhcyBEaXJlY3RvcnkgfCB1bmRlZmluZWQ7CiAgICBjb25zdCB0bXAgPSB0bXBEaXI/LmNvbnRlbnRzIHx8IG5ldyBNYXAoKTsKICAgIGNvbnN0IHByZW9wZW5UbXAgPSBuZXcgUm9vdGVkUHJlb3BlbkRpcmVjdG9yeSgidG1wIiwgdG1wKTsKCiAgICBjb25zdCBhcmdzID0gWyJudmltIiwgIi0taGVhZGxlc3MiLCAiLS1lbWJlZCIsICItdSIsICJOT1JDIiwgIi0tbm9wbHVnaW4iLCAiLWkiLCAiTk9ORSIsICItbiJdOwogICAgY29uc3QgZW52ID0gWwogICAgICAiVklNUlVOVElNRT0vbnZpbS9ydW50aW1lIiwKICAgICAgIkhPTUU9L252aW0vaG9tZSIsCiAgICAgICJQV0Q9L252aW0iLAogICAgICAiWERHX0NPTkZJR19IT01FPS9udmltL2hvbWUvLmNvbmZpZyIsCiAgICAgICJYREdfREFUQV9IT01FPS9udmltL2hvbWUvLmxvY2FsL3NoYXJlIiwKICAgICAgIlhER19TVEFURV9IT01FPS9udmltL2hvbWUvLmxvY2FsL3N0YXRlIiwKICAgICAgIlBBVEg9L3Vzci9iaW46L2JpbiIsCiAgICAgICJUTVBESVI9L252aW0vdG1wIiwKICAgICAgYENPTFVNTlM9JHtjb2xzIHx8IDEyMH1gLAogICAgICBgTElORVM9JHtyb3dzIHx8IDQwfWAsCiAgICBdOwogICAgaWYgKGV4dHJhRW52ICYmIHR5cGVvZiBleHRyYUVudiA9PT0gIm9iamVjdCIpIHsKICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoZXh0cmFFbnYpKSB7CiAgICAgICAgaWYgKCFrKSBjb250aW51ZTsKICAgICAgICBlbnYucHVzaChgJHtrfT0ke1N0cmluZyh2ID8/ICIiKX1gKTsKICAgICAgfQogICAgfQoKICAgIGFjdGl2ZVdhc2kgPSBuZXcgV0FTSShhcmdzLCBlbnYsIFtzdGRpbkZkLCBzdGRvdXRGZCwgc3RkZXJyRmQsIHByZW9wZW4sIHByZW9wZW5UbXBdLCB7IGRlYnVnOiBmYWxzZSB9KTsKICAgIGFjdGl2ZVdhc2kuZmRzWzBdID0gc3RkaW5GZDsKICAgIGFjdGl2ZVdhc2kuZmRzWzFdID0gc3Rkb3V0RmQ7CiAgICBhY3RpdmVXYXNpLmZkc1syXSA9IHN0ZGVyckZkOwogICAgYWN0aXZlV2FzaS5mZHNbM10gPSBwcmVvcGVuOwogICAgYWN0aXZlV2FzaS5mZHNbNF0gPSBwcmVvcGVuVG1wOwogICAgKGFjdGl2ZVdhc2kgYXMgdW5rbm93biBhcyB7IHByZW9wZW5zOiBSZWNvcmQ8c3RyaW5nLCBQcmVvcGVuRGlyZWN0b3J5PiB9KS5wcmVvcGVucyA9IHsgIi9udmltIjogcHJlb3BlbiwgIi90bXAiOiBwcmVvcGVuVG1wIH07CgogICAgY29uc3QgZW52SW1wb3J0cyA9IG1ha2VFbnYoKCkgPT4gYWN0aXZlV2FzaT8ud2FzaUltcG9ydD8ucHJvY19leGl0Py4oMSkpOwogICAgY29uc3Qgd2FzaUltcG9ydHM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7IC4uLmFjdGl2ZVdhc2kud2FzaUltcG9ydCB9OwoKICAgIC8vIEtlZXAgZmRfcmVhZCBub24tYmxvY2tpbmcgKEVSUk5PX0FHQUlOKSBhbmQgb25seSBhc3luY2lmeSBwb2xsX29uZW9mZi4KICAgIHdhc2lJbXBvcnRzLmZkX3JlYWQgPSBhY3RpdmVXYXNpLndhc2lJbXBvcnQuZmRfcmVhZDsKICAgIHdhc2lJbXBvcnRzLnBvbGxfb25lb2ZmID0gKGluX3B0cjogbnVtYmVyLCBvdXRfcHRyOiBudW1iZXIsIG5zdWJzY3JpcHRpb25zOiBudW1iZXIsIG5ldmVudHNfcHRyOiBudW1iZXIpID0+ICgKICAgICAgcG9sbE9uZW9mZkFzeW5jaWZpZWQoaW5fcHRyLCBvdXRfcHRyLCBuc3Vic2NyaXB0aW9ucywgbmV2ZW50c19wdHIpCiAgICApOwoKICAgIGNvbnN0IHdhc21JbnN0YW5jZSA9IGF3YWl0IFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKHdhc21CeXRlcywgewogICAgICB3YXNpX3NuYXBzaG90X3ByZXZpZXcxOiB3YXNpSW1wb3J0cywKICAgICAgZW52OiBlbnZJbXBvcnRzLAogICAgfSk7CiAgICBjb25zdCBpbnN0YW5jZVNvdXJjZSA9IHdhc21JbnN0YW5jZSBhcyB1bmtub3duIGFzIFdlYkFzc2VtYmx5LldlYkFzc2VtYmx5SW5zdGFudGlhdGVkU291cmNlOwogICAgY29uc3QgaW5zdGFuY2UgPSBpbnN0YW5jZVNvdXJjZS5pbnN0YW5jZQogICAgICA/PyAod2FzbUluc3RhbmNlIGFzIHVua25vd24gYXMgeyBpbnN0YW5jZTogV2ViQXNzZW1ibHkuSW5zdGFuY2UgfSkuaW5zdGFuY2U7CgogICAgd2FzbUV4cG9ydHMgPSAoaW5zdGFuY2UgYXMgYW55KS5leHBvcnRzOwogICAgaW5pdEFzeW5jaWZ5KHdhc21FeHBvcnRzKTsKICAgIChhY3RpdmVXYXNpIGFzIGFueSkuaW5zdCA9IGluc3RhbmNlOwoKICAgIGV4aXRDb2RlID0gYXdhaXQgcnVuQXN5bmNpZmllZFN0YXJ0KHdhc21FeHBvcnRzKTsKICB9IGNhdGNoIChlcnIpIHsKICAgIGlmIChlcnIgaW5zdGFuY2VvZiBXQVNJUHJvY0V4aXQpIHsKICAgICAgZXhpdENvZGUgPSBlcnIuY29kZTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IG1lc3NhZ2UgPSAoZXJyIGFzIHsgbWVzc2FnZT86IHN0cmluZyB9KT8ubWVzc2FnZSB8fCBTdHJpbmcoZXJyKTsKICAgICAgY29uc3Qgc3RhY2sgPSAoZXJyIGFzIHsgc3RhY2s/OiBzdHJpbmcgfSk/LnN0YWNrOwogICAgICBwb3N0TWVzc2FnZSh7IHR5cGU6ICJzdGFydC1lcnJvciIsIG1lc3NhZ2U6IHN0YWNrID8gYCR7bWVzc2FnZX1cbiR7c3RhY2t9YCA6IG1lc3NhZ2UgfSk7CiAgICB9CiAgfQoKICBwb3N0TWVzc2FnZSh7IHR5cGU6ICJleGl0IiwgY29kZTogZXhpdENvZGUsIGxhc3RTdGRlcnIgfSk7Cn0KCmZ1bmN0aW9uIHBvbGxPbmVvZmZBc3luY2lmaWVkKGluX3B0cjogbnVtYmVyLCBvdXRfcHRyOiBudW1iZXIsIG5zdWJzY3JpcHRpb25zOiBudW1iZXIsIG5ldmVudHNfcHRyOiBudW1iZXIpOiBudW1iZXIgewogIGlmICghd2FzbUV4cG9ydHM/Lm1lbW9yeSkgcmV0dXJuIHdhc2kuRVJSTk9fRkFVTFQ7CiAgY29uc3QgbnMgPSBOdW1iZXIobnN1YnNjcmlwdGlvbnMpID4+PiAwOwogIGlmIChucyA9PT0gMCkgcmV0dXJuIHdhc2kuRVJSTk9fSU5WQUw7CgogIGNvbnN0IHN0YXRlID0gd2FzbUV4cG9ydHM/LmFzeW5jaWZ5X2dldF9zdGF0ZT8uKCkgPz8gMDsKICBpZiAoc3RhdGUgPT09IDAgJiYgcGVuZGluZ1BvbGxPbmVvZmYpIHBlbmRpbmdQb2xsT25lb2ZmID0gbnVsbDsKCiAgY29uc3QgYnVmZmVyID0gbmV3IERhdGFWaWV3KHdhc21FeHBvcnRzLm1lbW9yeS5idWZmZXIpOwogIGNvbnN0IHN1YlNpemUgPSA0ODsKICBjb25zdCBldmVudFNpemUgPSAzMjsKCiAgY29uc3Qgbm93TnMgPSAoKSA9PiBCaWdJbnQoTWF0aC5yb3VuZChwZXJmb3JtYW5jZS5ub3coKSAqIDFlNikpOwogIGNvbnN0IG5vd1JlYWxOcyA9ICgpID0+IEJpZ0ludChEYXRlLm5vdygpKSAqIDEwMDAwMDBuOwoKICBsZXQgbmVlZFN0ZGluID0gZmFsc2U7CiAgbGV0IG5leHREZWx0YU5zOiBiaWdpbnQgfCBudWxsID0gbnVsbDsKICBjb25zdCByZWFkeTogQXJyYXk8eyB1c2VyZGF0YTogYmlnaW50OyBldmVudHR5cGU6IG51bWJlciB9PiA9IFtdOwogIGNvbnN0IGNsb2NrRGVhZGxpbmVzOiBBcnJheTxiaWdpbnQgfCBudWxsPiA9IG5ldyBBcnJheShucykuZmlsbChudWxsKTsKCiAgY29uc3QgdXNlUGVuZGluZyA9IHN0YXRlID09PSAyCiAgICAmJiBwZW5kaW5nUG9sbE9uZW9mZgogICAgJiYgcGVuZGluZ1BvbGxPbmVvZmYuaW5fcHRyID09PSAoaW5fcHRyID4+PiAwKQogICAgJiYgcGVuZGluZ1BvbGxPbmVvZmYubnN1YnNjcmlwdGlvbnMgPT09IG5zOwoKICBmb3IgKGxldCBpID0gMDsgaSA8IG5zOyBpICs9IDEpIHsKICAgIGNvbnN0IGJhc2UgPSAoaW5fcHRyICsgaSAqIHN1YlNpemUpID4+PiAwOwogICAgY29uc3QgdXNlcmRhdGEgPSBidWZmZXIuZ2V0QmlnVWludDY0KGJhc2UsIHRydWUpOwogICAgY29uc3QgZXZlbnR0eXBlID0gYnVmZmVyLmdldFVpbnQ4KGJhc2UgKyA4KTsKCiAgICBpZiAoZXZlbnR0eXBlID09PSB3YXNpLkVWRU5UVFlQRV9GRF9SRUFEIHx8IGV2ZW50dHlwZSA9PT0gd2FzaS5FVkVOVFRZUEVfRkRfV1JJVEUpIHsKICAgICAgY29uc3QgZmQgPSBidWZmZXIuZ2V0VWludDMyKGJhc2UgKyAxNiwgdHJ1ZSk7CgogICAgICBpZiAoZXZlbnR0eXBlID09PSB3YXNpLkVWRU5UVFlQRV9GRF9XUklURSkgewogICAgICAgIHJlYWR5LnB1c2goeyB1c2VyZGF0YSwgZXZlbnR0eXBlIH0pOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CgogICAgICBpZiAoZmQgPT09IDApIHsKICAgICAgICBjb25zdCBzdGRpblJlYWR5ID0gQm9vbGVhbihzdGRpbkZkICYmIChzdGRpbkZkLnRvdGFsID4gMCB8fCBzdGRpbkZkLmNsb3NlZCkpOwogICAgICAgIGlmIChzdGRpblJlYWR5KSByZWFkeS5wdXNoKHsgdXNlcmRhdGEsIGV2ZW50dHlwZSB9KTsKICAgICAgICBlbHNlIG5lZWRTdGRpbiA9IHRydWU7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KCiAgICAgIC8vIEZvciBub24tc3RkaW4gZmRzLCBhc3N1bWUgcmVhZGFiaWxpdHkuIE5lb3ZpbStsaWJ1diB1c2VzIHBvbGxfb25lb2ZmCiAgICAgIC8vIGZvciB2YXJpb3VzIGludGVybmFsIGhhbmRsZXM7IHJldHVybmluZyBOT1RTVVAgY2FuIHN0YWxsIHRoZSBsb29wLgogICAgICByZWFkeS5wdXNoKHsgdXNlcmRhdGEsIGV2ZW50dHlwZSB9KTsKICAgICAgY29udGludWU7CiAgICB9CgogICAgaWYgKGV2ZW50dHlwZSA9PT0gd2FzaS5FVkVOVFRZUEVfQ0xPQ0spIHsKICAgICAgY29uc3QgY2xvY2tpZCA9IGJ1ZmZlci5nZXRVaW50MzIoYmFzZSArIDE2LCB0cnVlKTsKICAgICAgY29uc3QgdGltZW91dCA9IGJ1ZmZlci5nZXRCaWdVaW50NjQoYmFzZSArIDI0LCB0cnVlKTsKICAgICAgY29uc3QgZmxhZ3MgPSBidWZmZXIuZ2V0VWludDE2KGJhc2UgKyAzNiwgdHJ1ZSk7CiAgICAgIGNvbnN0IGdldE5vdyA9IGNsb2NraWQgPT09IHdhc2kuQ0xPQ0tJRF9NT05PVE9OSUMKICAgICAgICA/IG5vd05zCiAgICAgICAgOiAoY2xvY2tpZCA9PT0gd2FzaS5DTE9DS0lEX1JFQUxUSU1FID8gbm93UmVhbE5zIDogbnVsbCk7CiAgICAgIGlmICghZ2V0Tm93KSByZXR1cm4gd2FzaS5FUlJOT19JTlZBTDsKCiAgICAgIGNvbnN0IG5vdyA9IGdldE5vdygpOwogICAgICBjb25zdCBpc0FicyA9IChmbGFncyAmIHdhc2kuU1VCQ0xPQ0tGTEFHU19TVUJTQ1JJUFRJT05fQ0xPQ0tfQUJTVElNRSkgIT09IDA7CiAgICAgIGNvbnN0IGVuZFRpbWUgPSB1c2VQZW5kaW5nICYmIHBlbmRpbmdQb2xsT25lb2ZmPy5jbG9ja0RlYWRsaW5lcz8uW2ldICE9IG51bGwKICAgICAgICA/IEJpZ0ludChwZW5kaW5nUG9sbE9uZW9mZiEuY2xvY2tEZWFkbGluZXNbaV0hKQogICAgICAgIDogKGlzQWJzID8gdGltZW91dCA6IChub3cgKyB0aW1lb3V0KSk7CiAgICAgIGNsb2NrRGVhZGxpbmVzW2ldID0gZW5kVGltZTsKICAgICAgaWYgKGVuZFRpbWUgPD0gbm93KSB7CiAgICAgICAgcmVhZHkucHVzaCh7IHVzZXJkYXRhLCBldmVudHR5cGUgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgZGVsdGEgPSBlbmRUaW1lIC0gbm93OwogICAgICAgIGlmIChuZXh0RGVsdGFOcyA9PT0gbnVsbCB8fCBkZWx0YSA8IG5leHREZWx0YU5zKSBuZXh0RGVsdGFOcyA9IGRlbHRhOwogICAgICB9CiAgICAgIGNvbnRpbnVlOwogICAgfQoKICAgIHJldHVybiB3YXNpLkVSUk5PX05PVFNVUDsKICB9CgogIGlmIChyZWFkeS5sZW5ndGggPiAwKSB7CiAgICBpZiAoc3RhdGUgPT09IDIpIHN0b3BSZXdpbmRJZk5lZWRlZCgpOwogICAgcGVuZGluZ1BvbGxPbmVvZmYgPSBudWxsOwogICAgY29uc3Qgb3V0ID0gbmV3IERhdGFWaWV3KHdhc21FeHBvcnRzLm1lbW9yeS5idWZmZXIpOwogICAgY29uc3QgY291bnQgPSBNYXRoLm1pbihyZWFkeS5sZW5ndGgsIG5zKTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkgKz0gMSkgewogICAgICBjb25zdCBldiA9IHJlYWR5W2ldOwogICAgICBjb25zdCBldmVudCA9IG5ldyAod2FzaSBhcyBhbnkpLkV2ZW50KGV2LnVzZXJkYXRhLCB3YXNpLkVSUk5PX1NVQ0NFU1MsIGV2LmV2ZW50dHlwZSk7CiAgICAgIGV2ZW50LndyaXRlX2J5dGVzKG91dCBhcyBhbnksIChvdXRfcHRyICsgaSAqIGV2ZW50U2l6ZSkgPj4+IDApOwogICAgfQogICAgaWYgKHR5cGVvZiBuZXZlbnRzX3B0ciA9PT0gIm51bWJlciIpIG91dC5zZXRVaW50MzIobmV2ZW50c19wdHIsIGNvdW50LCB0cnVlKTsKICAgIHJldHVybiB3YXNpLkVSUk5PX1NVQ0NFU1M7CiAgfQoKICBjb25zdCB3YWl0czogQXJyYXk8UHJvbWlzZTx2b2lkPj4gPSBbXTsKICBjb25zdCBjYW5XYWtlT25TdGRpbiA9IEJvb2xlYW4oc3RkaW5GZCAmJiAhc3RkaW5GZC5jbG9zZWQgJiYgc3RkaW5GZC50b3RhbCA9PT0gMCk7CiAgaWYgKChuZWVkU3RkaW4gfHwgY2FuV2FrZU9uU3RkaW4pICYmIHN0ZGluRmQgJiYgIXN0ZGluRmQuY2xvc2VkKSB3YWl0cy5wdXNoKGdldFN0ZGluV2FpdFByb21pc2UoKSk7CiAgaWYgKG5leHREZWx0YU5zICE9PSBudWxsKSB7CiAgICBjb25zdCBtYXhXYWl0TXMgPSA1MDsKICAgIGNvbnN0IHJhdyA9IE51bWJlcihuZXh0RGVsdGFOcyAvIDEwMDAwMDBuKTsKICAgIGNvbnN0IG1zID0gTnVtYmVyLmlzRmluaXRlKHJhdykgJiYgcmF3ID4gMCA/IHJhdyA6IDA7CiAgICB3YWl0cy5wdXNoKG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIE1hdGgubWluKG1zLCBtYXhXYWl0TXMpKSkpOwogIH0KCiAgaWYgKHdhaXRzLmxlbmd0aCA9PT0gMCkgewogICAgaWYgKHR5cGVvZiBuZXZlbnRzX3B0ciA9PT0gIm51bWJlciIpIGJ1ZmZlci5zZXRVaW50MzIobmV2ZW50c19wdHIsIDAsIHRydWUpOwogICAgcmV0dXJuIHdhc2kuRVJSTk9fU1VDQ0VTUzsKICB9CgogIGlmIChzdGF0ZSA9PT0gMikgc3RvcFJld2luZElmTmVlZGVkKCk7CiAgaWYgKHN0YXRlID09PSAwIHx8IHN0YXRlID09PSAyKSB7CiAgICBwZW5kaW5nUG9sbE9uZW9mZiA9IHsgaW5fcHRyOiAoaW5fcHRyID4+PiAwKSwgbnN1YnNjcmlwdGlvbnM6IG5zLCBjbG9ja0RlYWRsaW5lcyB9OwogICAgc3RhcnRVbndpbmQod2FpdHMubGVuZ3RoID09PSAxID8gd2FpdHNbMF0gOiBQcm9taXNlLnJhY2Uod2FpdHMpKTsKICAgIGlmICh0eXBlb2YgbmV2ZW50c19wdHIgPT09ICJudW1iZXIiKSBuZXcgRGF0YVZpZXcod2FzbUV4cG9ydHMubWVtb3J5LmJ1ZmZlcikuc2V0VWludDMyKG5ldmVudHNfcHRyLCAwLCB0cnVlKTsKICAgIHJldHVybiB3YXNpLkVSUk5PX1NVQ0NFU1M7CiAgfQoKICBpZiAodHlwZW9mIG5ldmVudHNfcHRyID09PSAibnVtYmVyIikgYnVmZmVyLnNldFVpbnQzMihuZXZlbnRzX3B0ciwgMCwgdHJ1ZSk7CiAgcmV0dXJuIHdhc2kuRVJSTk9fU1VDQ0VTUzsKfQoKZnVuY3Rpb24gZ2V0U3RkaW5XYWl0UHJvbWlzZSgpOiBQcm9taXNlPHZvaWQ+IHsKICBpZiAoIXN0ZGluRmQgfHwgc3RkaW5GZC5jbG9zZWQgfHwgc3RkaW5GZC50b3RhbCA+IDApIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsKICBpZiAoIXN0ZGluV2FpdFByb21pc2UpIHsKICAgIHN0ZGluV2FpdFByb21pc2UgPSBzdGRpbkZkLndhaXRGb3JEYXRhKCkuZmluYWxseSgoKSA9PiB7IHN0ZGluV2FpdFByb21pc2UgPSBudWxsOyB9KTsKICB9CiAgcmV0dXJuIHN0ZGluV2FpdFByb21pc2U7Cn0KCmZ1bmN0aW9uIGluaXRBc3luY2lmeShleHBvcnRzOiBhbnkpIHsKICBpZiAoIWV4cG9ydHM/Lm1lbW9yeSkgdGhyb3cgbmV3IEVycm9yKCJhc3luY2lmeTogbWlzc2luZyBleHBvcnRlZCBtZW1vcnkiKTsKICBpZiAodHlwZW9mIGV4cG9ydHMuYXN5bmNpZnlfc3RhcnRfdW53aW5kICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgRXJyb3IoImFzeW5jaWZ5OiBtaXNzaW5nIGV4cG9ydHMiKTsKCiAgaWYgKAogICAgdHlwZW9mIGV4cG9ydHMubnZpbV9hc3luY2lmeV9nZXRfZGF0YV9wdHIgPT09ICJmdW5jdGlvbiIKICAgICYmIHR5cGVvZiBleHBvcnRzLm52aW1fYXN5bmNpZnlfZ2V0X3N0YWNrX3N0YXJ0ID09PSAiZnVuY3Rpb24iCiAgICAmJiB0eXBlb2YgZXhwb3J0cy5udmltX2FzeW5jaWZ5X2dldF9zdGFja19lbmQgPT09ICJmdW5jdGlvbiIKICApIHsKICAgIGFzeW5jaWZ5RGF0YVB0ciA9IGV4cG9ydHMubnZpbV9hc3luY2lmeV9nZXRfZGF0YV9wdHIoKSA+Pj4gMDsKICAgIGFzeW5jaWZ5U3RhY2tTdGFydCA9IGV4cG9ydHMubnZpbV9hc3luY2lmeV9nZXRfc3RhY2tfc3RhcnQoKSA+Pj4gMDsKICAgIGFzeW5jaWZ5U3RhY2tFbmQgPSBleHBvcnRzLm52aW1fYXN5bmNpZnlfZ2V0X3N0YWNrX2VuZCgpID4+PiAwOwogICAgcmVzZXRBc3luY2lmeURhdGEoKTsKICAgIHJldHVybjsKICB9CgogIGNvbnN0IHN0YWNrU2l6ZSA9IDY0ICogMTAyNCAqIDEwMjQ7CiAgY29uc3QgcGFnZVNpemUgPSA2NTUzNjsKICBjb25zdCBleHRyYSA9IHN0YWNrU2l6ZSArIDY0OwogIGNvbnN0IHBhZ2VzID0gTWF0aC5jZWlsKGV4dHJhIC8gcGFnZVNpemUpOwogIGV4cG9ydHMubWVtb3J5Lmdyb3cocGFnZXMpOwoKICBjb25zdCBlbmQgPSBleHBvcnRzLm1lbW9yeS5idWZmZXIuYnl0ZUxlbmd0aCA+Pj4gMDsKICBhc3luY2lmeVN0YWNrRW5kID0gZW5kOwogIGNvbnN0IHJhd1N0YWNrU3RhcnQgPSAoZW5kIC0gc3RhY2tTaXplKSA+Pj4gMDsKICBhc3luY2lmeURhdGFQdHIgPSAoKHJhd1N0YWNrU3RhcnQgLSA4KSAmIH4weDcpID4+PiAwOwogIGFzeW5jaWZ5U3RhY2tTdGFydCA9IChhc3luY2lmeURhdGFQdHIgKyA4KSA+Pj4gMDsKICByZXNldEFzeW5jaWZ5RGF0YSgpOwp9CgpmdW5jdGlvbiByZXNldEFzeW5jaWZ5RGF0YSgpIHsKICBpZiAoIXdhc21FeHBvcnRzPy5tZW1vcnkpIHJldHVybjsKICBpZiAoIWFzeW5jaWZ5RGF0YVB0ciB8fCAhYXN5bmNpZnlTdGFja1N0YXJ0IHx8ICFhc3luY2lmeVN0YWNrRW5kKSByZXR1cm47CiAgY29uc3QgdmlldyA9IG5ldyBEYXRhVmlldyh3YXNtRXhwb3J0cy5tZW1vcnkuYnVmZmVyKTsKICB2aWV3LnNldEludDMyKGFzeW5jaWZ5RGF0YVB0ciwgYXN5bmNpZnlTdGFja1N0YXJ0LCB0cnVlKTsKICB2aWV3LnNldEludDMyKGFzeW5jaWZ5RGF0YVB0ciArIDQsIGFzeW5jaWZ5U3RhY2tFbmQsIHRydWUpOwp9CgpmdW5jdGlvbiBzdGFydFVud2luZChwcm9taXNlOiBQcm9taXNlPHZvaWQ+KSB7CiAgaWYgKCF3YXNtRXhwb3J0cyB8fCAhYXN5bmNpZnlEYXRhUHRyKSB0aHJvdyBuZXcgRXJyb3IoImFzeW5jaWZ5OiBub3QgaW5pdGlhbGl6ZWQiKTsKICBpZiAocGVuZGluZ0FzeW5jKSB0aHJvdyBuZXcgRXJyb3IoImFzeW5jaWZ5OiBvdmVybGFwcGluZyBhc3luYyBvcGVyYXRpb24iKTsKICByZXNldEFzeW5jaWZ5RGF0YSgpOwogIHBlbmRpbmdBc3luYyA9IHByb21pc2U7CiAgd2FzbUV4cG9ydHMuYXN5bmNpZnlfc3RhcnRfdW53aW5kKGFzeW5jaWZ5RGF0YVB0cik7Cn0KCmZ1bmN0aW9uIHN0b3BSZXdpbmRJZk5lZWRlZCgpIHsKICBpZiAoIXdhc21FeHBvcnRzPy5hc3luY2lmeV9nZXRfc3RhdGUgfHwgIXdhc21FeHBvcnRzPy5hc3luY2lmeV9zdG9wX3Jld2luZCkgcmV0dXJuOwogIGlmICh3YXNtRXhwb3J0cy5hc3luY2lmeV9nZXRfc3RhdGUoKSA9PT0gMikgewogICAgd2FzbUV4cG9ydHMuYXN5bmNpZnlfc3RvcF9yZXdpbmQoKTsKICAgIHJlc2V0QXN5bmNpZnlEYXRhKCk7CiAgfQp9Cgphc3luYyBmdW5jdGlvbiBydW5Bc3luY2lmaWVkU3RhcnQoZXhwb3J0czogYW55KTogUHJvbWlzZTxudW1iZXI+IHsKICB3aGlsZSAodHJ1ZSkgewogICAgdHJ5IHsKICAgICAgZXhwb3J0cy5fc3RhcnQoKTsKICAgIH0gY2F0Y2ggKGVycikgewogICAgICBpZiAoZXJyIGluc3RhbmNlb2YgV0FTSVByb2NFeGl0KSByZXR1cm4gZXJyLmNvZGU7CiAgICAgIHRocm93IGVycjsKICAgIH0KCiAgICBjb25zdCBzdGF0ZSA9IGV4cG9ydHMuYXN5bmNpZnlfZ2V0X3N0YXRlKCk7CiAgICBpZiAoc3RhdGUgPT09IDApIHJldHVybiAwOwogICAgaWYgKHN0YXRlID09PSAyKSB7CiAgICAgIGV4cG9ydHMuYXN5bmNpZnlfc3RvcF9yZXdpbmQoKTsKICAgICAgcmVzZXRBc3luY2lmeURhdGEoKTsKICAgICAgY29udGludWU7CiAgICB9CiAgICBpZiAoc3RhdGUgIT09IDEpIHRocm93IG5ldyBFcnJvcihgYXN5bmNpZnk6IHVuZXhwZWN0ZWQgc3RhdGUgJHtzdGF0ZX1gKTsKCiAgICBleHBvcnRzLmFzeW5jaWZ5X3N0b3BfdW53aW5kKCk7CiAgICBjb25zdCB3YWl0ID0gcGVuZGluZ0FzeW5jOwogICAgcGVuZGluZ0FzeW5jID0gbnVsbDsKICAgIGlmICghd2FpdCkgdGhyb3cgbmV3IEVycm9yKCJhc3luY2lmeTogbWlzc2luZyBwZW5kaW5nIHByb21pc2UiKTsKICAgIGF3YWl0IHdhaXQ7CiAgICBleHBvcnRzLmFzeW5jaWZ5X3N0YXJ0X3Jld2luZChhc3luY2lmeURhdGFQdHIpOwogIH0KfQoKYXN5bmMgZnVuY3Rpb24gZ2V0Q2FjaGVkV2FzbUJ5dGVzKHVybDogc3RyaW5nKTogUHJvbWlzZTxVaW50OEFycmF5PiB7CiAgaWYgKGNhY2hlZFdhc20gJiYgY2FjaGVkV2FzbS51cmwgPT09IHVybCAmJiBjYWNoZWRXYXNtLmJ5dGVzPy5ieXRlTGVuZ3RoKSByZXR1cm4gY2FjaGVkV2FzbS5ieXRlczsKICBjb25zdCBieXRlcyA9IGF3YWl0IGZldGNoQnl0ZXModXJsKTsKICBjYWNoZWRXYXNtID0geyB1cmwsIGJ5dGVzIH07CiAgcmV0dXJuIGJ5dGVzOwp9Cgphc3luYyBmdW5jdGlvbiBnZXRDYWNoZWRSdW50aW1lRW50cmllcyh1cmw6IHN0cmluZyk6IFByb21pc2U8VGFyRW50cnlbXT4gewogIGlmIChjYWNoZWRSdW50aW1lICYmIGNhY2hlZFJ1bnRpbWUudXJsID09PSB1cmwgJiYgY2FjaGVkUnVudGltZS5lbnRyaWVzPy5sZW5ndGgpIHJldHVybiBjYWNoZWRSdW50aW1lLmVudHJpZXM7CiAgY29uc3QgYXJjaGl2ZSA9IGF3YWl0IGZldGNoQnl0ZXModXJsKTsKICBsZXQgcnVudGltZUJ5dGVzOiBVaW50OEFycmF5OwogIGlmIChsb29rc0xpa2VHemlwKGFyY2hpdmUpKSB7CiAgICB0cnkgewogICAgICBydW50aW1lQnl0ZXMgPSBndW56aXBTeW5jKGFyY2hpdmUpOwogICAgfSBjYXRjaCAoZSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoYGd1bnppcCBydW50aW1lIGZhaWxlZDogJHsoZSBhcyBFcnJvcik/Lm1lc3NhZ2UgPz8gZX1gKTsKICAgIH0KICB9IGVsc2UgewogICAgcnVudGltZUJ5dGVzID0gYXJjaGl2ZTsKICB9CiAgbGV0IGVudHJpZXM6IFRhckVudHJ5W107CiAgdHJ5IHsKICAgIGVudHJpZXMgPSB1bnRhcihydW50aW1lQnl0ZXMpOwogIH0gY2F0Y2ggKGUpIHsKICAgIHRocm93IG5ldyBFcnJvcihgdW50YXIgcnVudGltZSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpPy5tZXNzYWdlID8/IGV9YCk7CiAgfQogIGNhY2hlZFJ1bnRpbWUgPSB7IHVybCwgZW50cmllcyB9OwogIHJldHVybiBlbnRyaWVzOwp9CgpmdW5jdGlvbiBhcHBseUV4dHJhRmlsZXMoZnNSb290OiBEaXJOb2RlLCBmaWxlczogQXJyYXk8eyBwYXRoOiBzdHJpbmc7IGRhdGE6IGFueSB9PikgewogIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykgewogICAgY29uc3QgcmF3UGF0aCA9IFN0cmluZyhmaWxlPy5wYXRoID8/ICIiKTsKICAgIGNvbnN0IGNsZWFuID0gcmF3UGF0aC5yZXBsYWNlKC9eXC8rLywgIiIpLnJlcGxhY2UoL15cLlwvKy8sICIiKTsKICAgIGlmICghY2xlYW4gfHwgY2xlYW4uZW5kc1dpdGgoIi8iKSkgY29udGludWU7CiAgICBjb25zdCBkYXRhID0gdG9VOChmaWxlPy5kYXRhKTsKICAgIGlmICghZGF0YSkgY29udGludWU7CiAgICBjb25zdCBwYXJ0cyA9IGNsZWFuLnNwbGl0KCIvIikuZmlsdGVyKEJvb2xlYW4pOwogICAgaWYgKCFwYXJ0cy5sZW5ndGgpIGNvbnRpbnVlOwogICAgbGV0IGRpcjogRGlyTm9kZSA9IGZzUm9vdDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSArPSAxKSB7CiAgICAgIGNvbnN0IHBhcnQgPSBwYXJ0c1tpXTsKICAgICAgaWYgKCFkaXIuY29udGVudHMuaGFzKHBhcnQpKSBkaXIuY29udGVudHMuc2V0KHBhcnQsIG5ldyBEaXJlY3RvcnkobmV3IE1hcCgpKSk7CiAgICAgIGRpciA9IGRpci5jb250ZW50cy5nZXQocGFydCkgYXMgRGlyTm9kZTsKICAgIH0KICAgIGNvbnN0IGxlYWYgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXTsKICAgIGRpci5jb250ZW50cy5zZXQobGVhZiwgbmV3IEZpbGUoZGF0YSwgeyByZWFkb25seTogZmFsc2UgfSkpOwogIH0KfQoKZnVuY3Rpb24gdG9VOChkYXRhOiBhbnkpOiBVaW50OEFycmF5IHwgbnVsbCB7CiAgaWYgKCFkYXRhKSByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoKTsKICBpZiAoZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHJldHVybiBkYXRhOwogIGlmIChkYXRhIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHJldHVybiBuZXcgVWludDhBcnJheShkYXRhKTsKICBpZiAoZGF0YSBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyKSByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7CiAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHJldHVybiBuZXcgVWludDhBcnJheShkYXRhKTsKICBpZiAoZGF0YSAmJiBkYXRhLnR5cGUgPT09ICJCdWZmZXIiICYmIEFycmF5LmlzQXJyYXkoZGF0YS5kYXRhKSkgcmV0dXJuIG5ldyBVaW50OEFycmF5KGRhdGEuZGF0YSk7CiAgdHJ5IHsKICAgIHJldHVybiBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoU3RyaW5nKGRhdGEpKTsKICB9IGNhdGNoIChfKSB7CiAgICByZXR1cm4gbnVsbDsKICB9Cn0KCmZ1bmN0aW9uIGhhbmRsZVN0ZG91dChjaHVuazogVWludDhBcnJheSkgewogIGlmICghcnBjRGVjb2RlcikgewogICAgcnBjRGVjb2RlciA9IG5ldyBEZWNvZGVyKGhhbmRsZU1lc3NhZ2UpOwogIH0KICB0cnkgewogICAgcnBjRGVjb2Rlci5wdXNoKGNodW5rKTsKICB9IGNhdGNoIChlcnIpIHsKICAgIHZvaWQgZXJyOwogICAgcnBjRGVjb2RlciA9IG5ldyBEZWNvZGVyKGhhbmRsZU1lc3NhZ2UpOwogIH0KfQoKZnVuY3Rpb24gaGFuZGxlTWVzc2FnZShtc2c6IHVua25vd24pIHsKICBpZiAoIUFycmF5LmlzQXJyYXkobXNnKSB8fCBtc2cubGVuZ3RoIDwgMSkgcmV0dXJuOwogIGNvbnN0IGtpbmQgPSBtc2dbMF07CiAgaWYgKGtpbmQgPT09IDApIHsKICAgIGNvbnN0IFssIG1zZ2lkLCBtZXRob2QsIHBhcmFtc10gPSBtc2cgYXMgYW55OwogICAgaWYgKG1ldGhvZCA9PT0gIndhc20tY2xpcGJvYXJkLXBhc3RlIikgewogICAgICBwb3N0TWVzc2FnZSh7IHR5cGU6ICJjbGlwYm9hcmQtcGFzdGUiLCBtc2dpZCB9KTsKICAgIH0gZWxzZSB7CiAgICAgIHBvc3RNZXNzYWdlKHsgdHlwZTogInJwYy1yZXF1ZXN0IiwgbXNnaWQsIG1ldGhvZCwgcGFyYW1zIH0pOwogICAgfQogIH0gZWxzZSBpZiAoa2luZCA9PT0gMSkgewogICAgY29uc3QgWywgbXNnaWQsIGVycm9yLCByZXN1bHRdID0gbXNnIGFzIGFueTsKICAgIHBvc3RNZXNzYWdlKHsgdHlwZTogInJwYy1yZXNwb25zZSIsIG1zZ2lkLCBlcnJvciwgcmVzdWx0IH0pOwogIH0gZWxzZSBpZiAoa2luZCA9PT0gMikgewogICAgY29uc3QgWywgbWV0aG9kLCBwYXJhbXNdID0gbXNnIGFzIGFueTsKICAgIGlmIChtZXRob2QgPT09ICJ3YXNtLWNsaXBib2FyZC1jb3B5IikgewogICAgICBjb25zdCBsaW5lcyA9IEFycmF5LmlzQXJyYXkoKHBhcmFtcyBhcyBhbnkpPy5bMF0pID8gKHBhcmFtcyBhcyBhbnkpWzBdIDogW107CiAgICAgIGNvbnN0IHJlZ3R5cGUgPSB0eXBlb2YgKHBhcmFtcyBhcyBhbnkpPy5bMV0gPT09ICJzdHJpbmciID8gKHBhcmFtcyBhcyBhbnkpWzFdIDogInYiOwogICAgICBwb3N0TWVzc2FnZSh7IHR5cGU6ICJjbGlwYm9hcmQtY29weSIsIGxpbmVzLCByZWd0eXBlIH0pOwogICAgfSBlbHNlIGlmICgKICAgICAgbWV0aG9kID09PSAibnZpbV9idWZfbGluZXNfZXZlbnQiCiAgICAgIHx8IG1ldGhvZCA9PT0gIm52aW1fYnVmX2RldGFjaF9ldmVudCIKICAgICAgfHwgbWV0aG9kID09PSAicmVkcmF3IgogICAgICB8fCBtZXRob2QgPT09ICJtb25hY29fY3Vyc29yIgogICAgICB8fCBtZXRob2QgPT09ICJtb25hY29fbW9kZSIKICAgICAgfHwgbWV0aG9kID09PSAibW9uYWNvX2N1cnNvck1vdmUiCiAgICAgIHx8IG1ldGhvZCA9PT0gIm1vbmFjb19zY3JvbGwiCiAgICAgIHx8IG1ldGhvZCA9PT0gIm1vbmFjb19yZXZlYWwiCiAgICAgIHx8IG1ldGhvZCA9PT0gIm1vbmFjb19tb3ZlQ3Vyc29yIgogICAgICB8fCBtZXRob2QgPT09ICJtb25hY29fc2Nyb2xsb2ZmIgogICAgICB8fCBtZXRob2QgPT09ICJtb25hY29faG9zdF9jb21tYW5kIgogICAgICB8fCBtZXRob2QgPT09ICJtb25hY29fYnVmX2VudGVyIgogICAgICB8fCBtZXRob2QgPT09ICJtb25hY29fYnVmX2RlbGV0ZSIKICAgICkgewogICAgICBwb3N0TWVzc2FnZSh7IHR5cGU6ICJycGMtbm90aWZ5IiwgbWV0aG9kLCBwYXJhbXMgfSk7CiAgICB9CiAgfQp9Cgphc3luYyBmdW5jdGlvbiBmZXRjaEJ5dGVzKHVybDogc3RyaW5nKTogUHJvbWlzZTxVaW50OEFycmF5PiB7CiAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsKTsKICBpZiAoIXJlcy5vaykgdGhyb3cgbmV3IEVycm9yKGBmZXRjaCAke3VybH0gZmFpbGVkICgke3Jlcy5zdGF0dXN9KWApOwogIGNvbnN0IGN0ID0gKHJlcy5oZWFkZXJzLmdldCgiY29udGVudC10eXBlIikgfHwgIiIpLnRvTG93ZXJDYXNlKCk7CiAgaWYgKGN0LmluY2x1ZGVzKCJ0ZXh0L2h0bWwiKSkgdGhyb3cgbmV3IEVycm9yKGBmZXRjaCAke3VybH0gcmV0dXJuZWQgSFRNTCAobGlrZWx5IHdyb25nIHBhdGggb3IgZGV2IHNlcnZlciBmYWxsYmFjaylgKTsKICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoYXdhaXQgcmVzLmFycmF5QnVmZmVyKCkpOwogIGlmICghZGF0YS5ieXRlTGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoYGZldGNoICR7dXJsfSByZXR1cm5lZCBlbXB0eSBib2R5YCk7CiAgcmV0dXJuIGRhdGE7Cn0KCnR5cGUgVGFyRW50cnkgPSB7IG5hbWU6IHN0cmluZzsgdHlwZTogImRpciIgfCAiZmlsZSI7IGRhdGE6IFVpbnQ4QXJyYXkgfTsKCmZ1bmN0aW9uIGxvb2tzTGlrZUd6aXAoZGF0YTogVWludDhBcnJheSkgewogIHJldHVybiBkYXRhICYmIGRhdGEubGVuZ3RoID49IDIgJiYgZGF0YVswXSA9PT0gMHgxZiAmJiBkYXRhWzFdID09PSAweDhiOwp9CgpmdW5jdGlvbiB1bnRhcihieXRlczogVWludDhBcnJheSk6IFRhckVudHJ5W10gewogIGNvbnN0IGZpbGVzOiBUYXJFbnRyeVtdID0gW107CiAgY29uc3QgZGF0YSA9IGJ5dGVzIGluc3RhbmNlb2YgVWludDhBcnJheSA/IGJ5dGVzIDogbmV3IFVpbnQ4QXJyYXkoYnl0ZXMpOwogIGxldCBvZmZzZXQgPSAwOwogIGNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTsKICBsZXQgc2FmZXR5ID0gMDsKCiAgd2hpbGUgKG9mZnNldCArIDUxMiA8PSBkYXRhLmxlbmd0aCkgewogICAgaWYgKHNhZmV0eSsrID4gMTAwXzAwMCkgdGhyb3cgbmV3IEVycm9yKCJ1bnRhciBzYWZldHkgYnJlYWsiKTsKICAgIGNvbnN0IG5hbWUgPSBkZWNvZGVUYXJTdHJpbmcoZGVjb2RlciwgZGF0YSwgb2Zmc2V0LCAxMDApOwogICAgY29uc3Qgc2l6ZVRleHQgPSBkZWNvZGVUYXJTdHJpbmcoZGVjb2RlciwgZGF0YSwgb2Zmc2V0ICsgMTI0LCAxMik7CiAgICBjb25zdCB0eXBlZmxhZyA9IGRhdGFbb2Zmc2V0ICsgMTU2XTsKICAgIGNvbnN0IHByZWZpeCA9IGRlY29kZVRhclN0cmluZyhkZWNvZGVyLCBkYXRhLCBvZmZzZXQgKyAzNDUsIDE1NSk7CiAgICBpZiAoIW5hbWUgJiYgIXByZWZpeCkgYnJlYWs7CiAgICBjb25zdCBzaXplUmF3ID0gc2l6ZVRleHQudHJpbSgpIHx8ICIwIjsKICAgIGNvbnN0IHNpemUgPSBwYXJzZUludChzaXplUmF3LCA4KTsKICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHNpemUpIHx8IHNpemUgPCAwKSB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgdGFyIHNpemU6ICR7c2l6ZVJhd31gKTsKICAgIGNvbnN0IGZ1bGxOYW1lID0gcHJlZml4ID8gYCR7cHJlZml4fS8ke25hbWV9YCA6IG5hbWU7CiAgICBjb25zdCBib2R5U3RhcnQgPSBvZmZzZXQgKyA1MTI7CiAgICBjb25zdCBib2R5RW5kID0gYm9keVN0YXJ0ICsgc2l6ZTsKICAgIGNvbnN0IHBheWxvYWQgPSBkYXRhLnNsaWNlKGJvZHlTdGFydCwgYm9keUVuZCk7CiAgICBmaWxlcy5wdXNoKHsgbmFtZTogZnVsbE5hbWUsIHR5cGU6IHR5cGVmbGFnID09PSA1MyA/ICJkaXIiIDogImZpbGUiLCBkYXRhOiBwYXlsb2FkIH0pOwogICAgY29uc3QgYmxvY2tzID0gTWF0aC5jZWlsKHNpemUgLyA1MTIpOwogICAgY29uc3QgbmV4dCA9IGJvZHlTdGFydCArIGJsb2NrcyAqIDUxMjsKICAgIGlmIChuZXh0IDw9IG9mZnNldCkgdGhyb3cgbmV3IEVycm9yKCJ0YXIgcGFyc2UgZGlkIG5vdCBhZHZhbmNlIik7CiAgICBvZmZzZXQgPSBuZXh0OwogIH0KICByZXR1cm4gZmlsZXM7Cn0KCmZ1bmN0aW9uIGRlY29kZVRhclN0cmluZyhkZWNvZGVyOiBUZXh0RGVjb2RlciwgZGF0YTogVWludDhBcnJheSwgc3RhcnQ6IG51bWJlciwgbGVuZ3RoOiBudW1iZXIpOiBzdHJpbmcgewogIGxldCBlbmQgPSBzdGFydDsKICBjb25zdCBtYXggPSBzdGFydCArIGxlbmd0aDsKICB3aGlsZSAoZW5kIDwgbWF4ICYmIGRhdGFbZW5kXSAhPT0gMCkgZW5kICs9IDE7CiAgcmV0dXJuIGRlY29kZXIuZGVjb2RlKGRhdGEuc3ViYXJyYXkoc3RhcnQsIGVuZCkpLnRyaW0oKTsKfQoKZnVuY3Rpb24gYnVpbGRGcyhlbnRyaWVzOiBUYXJFbnRyeVtdLCBvblByb2dyZXNzPzogKGNvdW50OiBudW1iZXIpID0+IHZvaWQpIHsKICBjb25zdCByb290ID0gbmV3IERpcmVjdG9yeShuZXcgTWFwKCkpIGFzIERpck5vZGU7CiAgbGV0IGNvdW50ID0gMDsKICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHsKICAgIGNvbnN0IGNsZWFuID0gZW50cnkubmFtZS5yZXBsYWNlKC9eXC5cLz8vLCAiIik7CiAgICBpZiAoIWNsZWFuKSBjb250aW51ZTsKICAgIGNvbnN0IHBhcnRzID0gY2xlYW4uc3BsaXQoIi8iKS5maWx0ZXIoQm9vbGVhbik7CiAgICBpZiAoIXBhcnRzLmxlbmd0aCkgY29udGludWU7CiAgICBjb3VudCArPSAxOwogICAgaWYgKG9uUHJvZ3Jlc3MgJiYgY291bnQgJSA1MDAgPT09IDApIG9uUHJvZ3Jlc3MoY291bnQpOwoKICAgIGxldCBkaXI6IERpck5vZGUgPSByb290OwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpICs9IDEpIHsKICAgICAgY29uc3QgcGFydCA9IHBhcnRzW2ldOwogICAgICBpZiAoIWRpci5jb250ZW50cy5oYXMocGFydCkpIGRpci5jb250ZW50cy5zZXQocGFydCwgbmV3IERpcmVjdG9yeShuZXcgTWFwKCkpKTsKICAgICAgZGlyID0gZGlyLmNvbnRlbnRzLmdldChwYXJ0KSBhcyBEaXJOb2RlOwogICAgfQoKICAgIGNvbnN0IGxlYWYgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXTsKICAgIGlmIChlbnRyeS50eXBlID09PSAiZGlyIikgewogICAgICBpZiAoIWRpci5jb250ZW50cy5oYXMobGVhZikpIGRpci5jb250ZW50cy5zZXQobGVhZiwgbmV3IERpcmVjdG9yeShuZXcgTWFwKCkpKTsKICAgIH0gZWxzZSB7CiAgICAgIGRpci5jb250ZW50cy5zZXQobGVhZiwgbmV3IEZpbGUoZW50cnkuZGF0YSwgeyByZWFkb25seTogdHJ1ZSB9KSk7CiAgICB9CiAgfQoKICBlbnN1cmVEaXIocm9vdCwgImhvbWUiKTsKICBlbnN1cmVEaXIocm9vdCwgInRtcCIpOwogIGVuc3VyZURpcihyb290LCAiaG9tZS8uY29uZmlnIik7CiAgZW5zdXJlRGlyKHJvb3QsICJob21lLy5sb2NhbC9zaGFyZSIpOwogIGVuc3VyZURpcihyb290LCAiaG9tZS8ubG9jYWwvc3RhdGUiKTsKCiAgcmV0dXJuIHJvb3Q7Cn0KCmZ1bmN0aW9uIGVuc3VyZURpcihyb290OiBEaXJOb2RlLCBwYXRoOiBzdHJpbmcpIHsKICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoIi8iKS5maWx0ZXIoQm9vbGVhbik7CiAgbGV0IG5vZGU6IERpck5vZGUgPSByb290OwogIGZvciAoY29uc3QgcCBvZiBwYXJ0cykgewogICAgaWYgKCFub2RlLmNvbnRlbnRzLmhhcyhwKSkgbm9kZS5jb250ZW50cy5zZXQocCwgbmV3IERpcmVjdG9yeShuZXcgTWFwKCkpKTsKICAgIG5vZGUgPSBub2RlLmNvbnRlbnRzLmdldChwKSBhcyBEaXJOb2RlOwogIH0KfQoKZnVuY3Rpb24gbWFrZUVudihwcm9jRXhpdD86IChjb2RlOiBudW1iZXIpID0+IHZvaWQpIHsKICBjb25zdCB3YXNtQW55ID0gV2ViQXNzZW1ibHkgYXMgYW55OwogIGNvbnN0IGNMb25nam1wID0gbmV3IHdhc21BbnkuVGFnKHsgcGFyYW1ldGVyczogWyJpMzIiXSwgcmVzdWx0czogW10gfSkgYXMgYW55OwogIHJldHVybiB7CiAgICBmbG9jazogKCkgPT4gMCwKICAgIGdldHBpZDogKCkgPT4gMSwKICAgIHV2X3JhbmRvbTogKCkgPT4gLTM4LAogICAgdXZfd3RmOF90b191dGYxNjogKCkgPT4ge30sCiAgICB1dl91dGYxNl9sZW5ndGhfYXNfd3RmODogKCkgPT4gMCwKICAgIHV2X3V0ZjE2X3RvX3d0Zjg6ICgpID0+IC0zOCwKICAgIHV2X3d0ZjhfbGVuZ3RoX2FzX3V0ZjE2OiAoKSA9PiAwLAogICAgX193YXNtX2xvbmdqbXA6IChwdHI6IG51bWJlcikgPT4gewogICAgICBpZiAocHJvY0V4aXQpIHByb2NFeGl0KDEpOwogICAgICB0aHJvdyBuZXcgd2FzbUFueS5FeGNlcHRpb24oY0xvbmdqbXAsIFtwdHIgPz8gMF0pOwogICAgfSwKICAgIF9fd2FzbV9zZXRqbXA6ICgpID0+IDAsCiAgICBfX3dhc21fc2V0am1wX3Rlc3Q6ICgpID0+IDAsCiAgICB0bXBmaWxlOiAoKSA9PiAwLAogICAgY2xvY2s6ICgpID0+IDAsCiAgICBzeXN0ZW06ICgpID0+IC0xLAogICAgdG1wbmFtOiAoKSA9PiAwLAogICAgX19jX2xvbmdqbXA6IGNMb25nam1wLAogIH0gYXMgV2ViQXNzZW1ibHkuTW9kdWxlSW1wb3J0czsKfQoKY2xhc3MgUm9vdGVkUHJlb3BlbkRpcmVjdG9yeSBleHRlbmRzIFByZW9wZW5EaXJlY3RvcnkgewogICNzdHJpcChwYXRoOiBzdHJpbmcpIHsgcmV0dXJuIHBhdGgucmVwbGFjZSgvXlwvKy8sICIiKTsgfQogIHBhdGhfb3BlbigKICAgIGRpcmZsYWdzOiBudW1iZXIsCiAgICBwYXRoX3N0cjogc3RyaW5nLAogICAgb2ZsYWdzOiBudW1iZXIsCiAgICBmc19yaWdodHNfYmFzZTogYmlnaW50LAogICAgZnNfcmlnaHRzX2luaGVyaXRpbmc6IGJpZ2ludCwKICAgIGZkX2ZsYWdzOiBudW1iZXIsCiAgKSB7CiAgICByZXR1cm4gc3VwZXIucGF0aF9vcGVuKGRpcmZsYWdzLCB0aGlzLiNzdHJpcChwYXRoX3N0ciksIG9mbGFncywgZnNfcmlnaHRzX2Jhc2UsIGZzX3JpZ2h0c19pbmhlcml0aW5nLCBmZF9mbGFncyk7CiAgfQogIHBhdGhfZmlsZXN0YXRfZ2V0KGZsYWdzOiBudW1iZXIsIHBhdGhfc3RyOiBzdHJpbmcpIHsgcmV0dXJuIHN1cGVyLnBhdGhfZmlsZXN0YXRfZ2V0KGZsYWdzLCB0aGlzLiNzdHJpcChwYXRoX3N0cikpOyB9CiAgcGF0aF9jcmVhdGVfZGlyZWN0b3J5KHBhdGhfc3RyOiBzdHJpbmcpIHsgcmV0dXJuIHN1cGVyLnBhdGhfY3JlYXRlX2RpcmVjdG9yeSh0aGlzLiNzdHJpcChwYXRoX3N0cikpOyB9CiAgcGF0aF91bmxpbmtfZmlsZShwYXRoX3N0cjogc3RyaW5nKSB7IHJldHVybiBzdXBlci5wYXRoX3VubGlua19maWxlKHRoaXMuI3N0cmlwKHBhdGhfc3RyKSk7IH0KICBwYXRoX3JlbW92ZV9kaXJlY3RvcnkocGF0aF9zdHI6IHN0cmluZykgeyByZXR1cm4gc3VwZXIucGF0aF9yZW1vdmVfZGlyZWN0b3J5KHRoaXMuI3N0cmlwKHBhdGhfc3RyKSk7IH0KICBwYXRoX2xpbmsocGF0aF9zdHI6IHN0cmluZywgaW5vZGU6IElub2RlLCBhbGxvd19kaXI6IGJvb2xlYW4pIHsgcmV0dXJuIHN1cGVyLnBhdGhfbGluayh0aGlzLiNzdHJpcChwYXRoX3N0ciksIGlub2RlLCBhbGxvd19kaXIpOyB9CiAgcGF0aF9yZWFkbGluayhwYXRoX3N0cjogc3RyaW5nKSB7IHJldHVybiBzdXBlci5wYXRoX3JlYWRsaW5rKHRoaXMuI3N0cmlwKHBhdGhfc3RyKSk7IH0KICBwYXRoX3N5bWxpbmsob2xkX3BhdGg6IHN0cmluZywgbmV3X3BhdGg6IHN0cmluZykgewogICAgY29uc3QgdGFyZ2V0ID0gKFByZW9wZW5EaXJlY3RvcnkucHJvdG90eXBlIGFzIHVua25vd24gYXMgeyBwYXRoX3N5bWxpbms/OiAob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpID0+IG51bWJlciB9KS5wYXRoX3N5bWxpbms7CiAgICBpZiAoIXRhcmdldCkgcmV0dXJuIHdhc2kuRVJSTk9fTk9UU1VQOwogICAgcmV0dXJuIHRhcmdldC5jYWxsKHRoaXMsIHRoaXMuI3N0cmlwKG9sZF9wYXRoKSwgdGhpcy4jc3RyaXAobmV3X3BhdGgpKTsKICB9Cn0KCg==", import.meta.url);
|
|
3911
|
+
const ke = new URL("./nvimWorker.worker.js", import.meta.url), Pe = new URL("./nvimWorkerAsyncify.worker.js", import.meta.url);
|
|
3912
3912
|
export {
|
|
3913
|
-
|
|
3914
|
-
|
|
3915
|
-
|
|
3916
|
-
|
|
3917
|
-
|
|
3918
|
-
|
|
3913
|
+
_e as MonacoNeovimClient,
|
|
3914
|
+
fe as NeovimWasmSession,
|
|
3915
|
+
Ae as createMonacoNeovim,
|
|
3916
|
+
ke as defaultWorkerUrl,
|
|
3917
|
+
Pe as defaultWorkerUrlAsyncify,
|
|
3918
|
+
he as isSharedArrayBufferAvailable
|
|
3919
3919
|
};
|