@1agh/maude 0.35.0 → 0.36.0

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,2048 +1 @@
1
- // canvas-comment-mount.tsx
2
- import {
3
- Component,
4
- createElement,
5
- Fragment as Fragment3,
6
- useCallback as useCallback5,
7
- useEffect as useEffect6,
8
- useMemo as useMemo5,
9
- useRef as useRef4,
10
- useState as useState5
11
- } from "react";
12
- import { createRoot } from "react-dom/client";
13
-
14
- // comments-overlay.tsx
15
- import { useCallback as useCallback3, useEffect as useEffect3, useMemo as useMemo3, useRef as useRef3, useState as useState3 } from "react";
16
-
17
- // use-collab.tsx
18
- import * as decoding from "lib0/decoding";
19
- import * as encoding from "lib0/encoding";
20
- import {
21
- createContext,
22
- useCallback,
23
- useContext,
24
- useEffect,
25
- useMemo,
26
- useReducer,
27
- useRef,
28
- useState
29
- } from "react";
30
- import { Awareness, applyAwarenessUpdate, encodeAwarenessUpdate } from "y-protocols/awareness";
31
- import { readSyncMessage, writeSyncStep1, writeUpdate } from "y-protocols/sync";
32
- import * as Y from "yjs";
33
- import { jsx } from "react/jsx-runtime";
34
- var CollabContext = createContext(null);
35
- function useCollab() {
36
- return useContext(CollabContext);
37
- }
38
- var SESSIONS_KEY = Symbol.for("maude.collab.sessions.v1");
39
-
40
- // use-selection-set.tsx
41
- import {
42
- createContext as createContext2,
43
- useCallback as useCallback2,
44
- useContext as useContext2,
45
- useEffect as useEffect2,
46
- useMemo as useMemo2,
47
- useRef as useRef2,
48
- useState as useState2
49
- } from "react";
50
- import { jsx as jsx2, Fragment } from "react/jsx-runtime";
51
- var SelectionSetContext = createContext2(null);
52
- function selectionKey(s) {
53
- return s.id ? `id:${s.id}` : `sel:${s.selector}`;
54
- }
55
- function dedupe(list) {
56
- const out = [];
57
- const seen = new Set;
58
- for (const s of list) {
59
- const k = selectionKey(s);
60
- if (seen.has(k))
61
- continue;
62
- seen.add(k);
63
- out.push(s);
64
- }
65
- return out;
66
- }
67
- var POST_DEBOUNCE_MS = 50;
68
- function SelectionSetProvider({
69
- children,
70
- postTarget
71
- }) {
72
- const [selected, setSelected] = useState2([]);
73
- const timerRef = useRef2(null);
74
- const post = useCallback2((next) => {
75
- if (timerRef.current)
76
- clearTimeout(timerRef.current);
77
- timerRef.current = setTimeout(() => {
78
- timerRef.current = null;
79
- const target = postTarget ?? (typeof window !== "undefined" ? window.parent : null);
80
- if (!target)
81
- return;
82
- const payload = next.length === 0 ? null : next.length === 1 ? next[0] ?? null : next;
83
- try {
84
- target.postMessage({ dgn: "select-set", selection: payload }, "*");
85
- } catch {}
86
- }, POST_DEBOUNCE_MS);
87
- }, [postTarget]);
88
- useEffect2(() => () => {
89
- if (timerRef.current)
90
- clearTimeout(timerRef.current);
91
- }, []);
92
- const replace = useCallback2((s) => {
93
- const next = dedupe(Array.isArray(s) ? s : [s]);
94
- setSelected(next);
95
- post(next);
96
- }, [post]);
97
- const add = useCallback2((s) => {
98
- const incoming = Array.isArray(s) ? s : [s];
99
- setSelected((prev) => {
100
- const next = dedupe([...prev, ...incoming]);
101
- post(next);
102
- return next;
103
- });
104
- }, [post]);
105
- const remove = useCallback2((s) => {
106
- const k = selectionKey(s);
107
- setSelected((prev) => {
108
- const next = prev.filter((x) => selectionKey(x) !== k);
109
- post(next);
110
- return next;
111
- });
112
- }, [post]);
113
- const toggle = useCallback2((s) => {
114
- const k = selectionKey(s);
115
- setSelected((prev) => {
116
- const next = prev.some((x) => selectionKey(x) === k) ? prev.filter((x) => selectionKey(x) !== k) : [...prev, s];
117
- post(next);
118
- return next;
119
- });
120
- }, [post]);
121
- const clear = useCallback2(() => {
122
- setSelected([]);
123
- post([]);
124
- }, [post]);
125
- const value = useMemo2(() => ({ selected, replace, add, remove, toggle, clear }), [selected, replace, add, remove, toggle, clear]);
126
- return /* @__PURE__ */ jsx2(SelectionSetContext.Provider, {
127
- value,
128
- children
129
- });
130
- }
131
- function MaybeSelectionSetProvider({ children }) {
132
- const outer = useContext2(SelectionSetContext);
133
- if (outer)
134
- return /* @__PURE__ */ jsx2(Fragment, {
135
- children
136
- });
137
- return /* @__PURE__ */ jsx2(SelectionSetProvider, {
138
- children
139
- });
140
- }
141
- function useSelectionSet() {
142
- const ctx = useContext2(SelectionSetContext);
143
- if (!ctx) {
144
- throw new Error("useSelectionSet must be used inside <SelectionSetProvider>");
145
- }
146
- return ctx;
147
- }
148
- function useSelectionSetOptional() {
149
- return useContext2(SelectionSetContext);
150
- }
151
-
152
- // comments-overlay.tsx
153
- import { jsx as jsx3, jsxs } from "react/jsx-runtime";
154
- var CSS_HREF = "/_client/comments-overlay.css";
155
- function ensureOverlayStyles() {
156
- if (typeof document === "undefined")
157
- return;
158
- if (document.getElementById("cm-overlay-css"))
159
- return;
160
- const link = document.createElement("link");
161
- link.id = "cm-overlay-css";
162
- link.rel = "stylesheet";
163
- link.href = CSS_HREF;
164
- document.head.appendChild(link);
165
- }
166
- function deriveFile() {
167
- if (typeof window === "undefined")
168
- return null;
169
- try {
170
- const p = window.location.pathname;
171
- if (p === "/_canvas-shell.html" || p === "/_canvas-shell") {
172
- const qs = new URLSearchParams(window.location.search);
173
- const canvas = qs.get("canvas") ?? "";
174
- const designRel = (qs.get("designRel") ?? ".design").replace(/^\/+|\/+$/g, "");
175
- return canvas ? `${designRel}/${canvas}` : null;
176
- }
177
- return decodeURIComponent(p).replace(/^\//, "");
178
- } catch {
179
- return null;
180
- }
181
- }
182
- function screenRectFor(selector, index) {
183
- if (!selector)
184
- return null;
185
- let el = null;
186
- try {
187
- const all = document.querySelectorAll(selector);
188
- const i = index && index > 0 && index < all.length ? index : 0;
189
- el = all[i] ?? all[0] ?? null;
190
- } catch {
191
- return null;
192
- }
193
- if (!el?.isConnected)
194
- return null;
195
- const r = el.getBoundingClientRect();
196
- if (r.width === 0 && r.height === 0)
197
- return null;
198
- return { x: r.left, y: r.top, w: r.width, h: r.height };
199
- }
200
- function CommentsOverlay() {
201
- ensureOverlayStyles();
202
- const selSet = useSelectionSetOptional();
203
- const [comments, setComments] = useState3([]);
204
- const [focusedId, setFocusedId] = useState3(null);
205
- const [composer, setComposer] = useState3(null);
206
- const file = useMemo3(() => deriveFile(), []);
207
- useEffect3(() => {
208
- if (typeof document === "undefined")
209
- return;
210
- const legacy = document.getElementById("dgn-pin-layer");
211
- if (!legacy)
212
- return;
213
- const prev = legacy.style.display;
214
- legacy.style.display = "none";
215
- return () => {
216
- legacy.style.display = prev;
217
- };
218
- }, []);
219
- const mirrorSelection = useCallback3((comment) => {
220
- if (!selSet)
221
- return;
222
- if (!comment?.selector) {
223
- selSet.clear();
224
- return;
225
- }
226
- const cdMatch = comment.selector.match(/data-cd-id="([^"]+)"/);
227
- const cdId = cdMatch ? cdMatch[1] : undefined;
228
- let tag;
229
- let classes;
230
- try {
231
- const el = document.querySelector(comment.selector);
232
- if (el) {
233
- tag = el.tagName.toLowerCase();
234
- classes = (el.getAttribute("class") ?? "").split(/\s+/).filter((cls) => cls && !cls.startsWith("dgn-") && !cls.startsWith("dc-cv-")).join(" ");
235
- }
236
- } catch {}
237
- selSet.replace({
238
- file: file ?? undefined,
239
- id: cdId,
240
- selector: comment.selector,
241
- tag,
242
- classes,
243
- bounds: comment.bounds ?? undefined
244
- });
245
- }, [selSet, file]);
246
- const commentsRef = useRef3(comments);
247
- commentsRef.current = comments;
248
- const collab = useCollab();
249
- useEffect3(() => {
250
- if (!collab)
251
- return;
252
- const arr = collab.doc.getArray("comments");
253
- const sync = () => {
254
- setComments(arr.toArray());
255
- };
256
- if (arr.length > 0)
257
- sync();
258
- arr.observe(sync);
259
- return () => {
260
- try {
261
- arr.unobserve(sync);
262
- } catch {}
263
- };
264
- }, [collab]);
265
- useEffect3(() => {
266
- if (typeof window === "undefined")
267
- return;
268
- const onMessage = (e) => {
269
- const m = e.data;
270
- if (!m || typeof m !== "object" || !m.dgn)
271
- return;
272
- if (m.dgn === "comments-set" && Array.isArray(m.comments)) {
273
- setComments(m.comments);
274
- } else if (m.dgn === "comment-focus") {
275
- const id = typeof m.id === "string" ? m.id : null;
276
- setFocusedId(id);
277
- const target = id ? commentsRef.current.find((c) => c.id === id) : undefined;
278
- mirrorSelection(target);
279
- }
280
- };
281
- window.addEventListener("message", onMessage);
282
- return () => window.removeEventListener("message", onMessage);
283
- }, [mirrorSelection]);
284
- useEffect3(() => {
285
- if (typeof document === "undefined")
286
- return;
287
- const onOpen = (e) => {
288
- const detail = e.detail;
289
- if (!detail?.selection)
290
- return;
291
- setComposer({
292
- selection: detail.selection,
293
- clientX: typeof detail.clientX === "number" ? detail.clientX : 0,
294
- clientY: typeof detail.clientY === "number" ? detail.clientY : 0
295
- });
296
- };
297
- document.addEventListener("cm:open-composer", onOpen);
298
- return () => document.removeEventListener("cm:open-composer", onOpen);
299
- }, []);
300
- const closeComposer = useCallback3(() => {
301
- setComposer(null);
302
- if (typeof window === "undefined")
303
- return;
304
- try {
305
- window.parent.postMessage({ dgn: "force-clear" }, "*");
306
- } catch {}
307
- }, []);
308
- const submitComposer = useCallback3((text) => {
309
- if (!composer)
310
- return;
311
- const sel = composer.selection;
312
- const payload = {
313
- file: sel.file,
314
- selector: sel.selector,
315
- index: sel.index,
316
- dom_path: sel.dom_path,
317
- tag: sel.tag,
318
- classes: sel.classes,
319
- bounds: sel.bounds,
320
- html_excerpt: sel.html,
321
- text
322
- };
323
- if (typeof window === "undefined")
324
- return;
325
- try {
326
- window.parent.postMessage({ dgn: "comment-submit", payload }, "*");
327
- } catch {}
328
- closeComposer();
329
- }, [composer, closeComposer]);
330
- useEffect3(() => {
331
- if (!file)
332
- return;
333
- let cancelled = false;
334
- (async () => {
335
- try {
336
- const r = await fetch(`/_comments?file=${encodeURIComponent(file)}`);
337
- if (!r.ok)
338
- return;
339
- const data = await r.json();
340
- if (cancelled)
341
- return;
342
- if (Array.isArray(data.comments)) {
343
- setComments((prev) => prev.length === 0 ? data.comments ?? [] : prev);
344
- }
345
- } catch {}
346
- })();
347
- return () => {
348
- cancelled = true;
349
- };
350
- }, [file]);
351
- const visible = useMemo3(() => {
352
- const list = comments.slice().sort((a, b) => a.created.localeCompare(b.created));
353
- return list.filter((c) => c.status !== "resolved");
354
- }, [comments]);
355
- const indexById = useMemo3(() => {
356
- const m = new Map;
357
- const all = comments.slice().sort((a, b) => a.created.localeCompare(b.created));
358
- all.forEach((c, i) => {
359
- m.set(c.id, i + 1);
360
- });
361
- return m;
362
- }, [comments]);
363
- const handlePinClick = useCallback3((id) => {
364
- setFocusedId(id);
365
- mirrorSelection(comments.find((c) => c.id === id));
366
- if (typeof window === "undefined")
367
- return;
368
- try {
369
- window.parent.postMessage({ dgn: "comment-click", id }, "*");
370
- } catch {}
371
- }, [comments, mirrorSelection]);
372
- const handlePatch = useCallback3((id, patch) => {
373
- if (typeof window === "undefined")
374
- return;
375
- try {
376
- window.parent.postMessage({ dgn: "comment-patch", id, patch }, "*");
377
- } catch {}
378
- }, []);
379
- const handleDelete = useCallback3((id) => {
380
- if (typeof window === "undefined")
381
- return;
382
- try {
383
- window.parent.postMessage({ dgn: "comment-delete", id }, "*");
384
- } catch {}
385
- setFocusedId((prev) => prev === id ? null : prev);
386
- }, []);
387
- const handleReply = useCallback3(async (id, body) => {
388
- if (typeof fetch === "undefined")
389
- return false;
390
- try {
391
- const r = await fetch(`/_api/comments/${encodeURIComponent(id)}/reply`, {
392
- method: "POST",
393
- headers: { "Content-Type": "application/json" },
394
- body: JSON.stringify({ body })
395
- });
396
- if (!r.ok)
397
- return false;
398
- const updated = await r.json();
399
- setComments((prev) => prev.map((c) => c.id === updated.id ? updated : c));
400
- return true;
401
- } catch {
402
- return false;
403
- }
404
- }, []);
405
- return /* @__PURE__ */ jsxs("div", {
406
- className: "cm-layer",
407
- "aria-hidden": false,
408
- children: [
409
- visible.map((c) => {
410
- const n = indexById.get(c.id) ?? 0;
411
- return /* @__PURE__ */ jsx3(CommentPin, {
412
- comment: c,
413
- sequence: n,
414
- focused: focusedId === c.id,
415
- onClick: handlePinClick
416
- }, c.id);
417
- }),
418
- composer ? /* @__PURE__ */ jsx3(CommentComposer, {
419
- state: composer,
420
- onSubmit: submitComposer,
421
- onCancel: closeComposer
422
- }) : null,
423
- (() => {
424
- if (!focusedId)
425
- return null;
426
- const focused = visible.find((c) => c.id === focusedId);
427
- if (!focused)
428
- return null;
429
- return /* @__PURE__ */ jsx3(CommentThread, {
430
- comment: focused,
431
- sequence: indexById.get(focused.id) ?? 0,
432
- onClose: () => {
433
- setFocusedId(null);
434
- selSet?.clear();
435
- },
436
- onPatch: (patch) => handlePatch(focused.id, patch),
437
- onDelete: () => handleDelete(focused.id),
438
- onReply: (body) => handleReply(focused.id, body)
439
- });
440
- })()
441
- ]
442
- });
443
- }
444
- var committerCache = null;
445
- async function loadCommitters() {
446
- if (!committerCache) {
447
- committerCache = (async () => {
448
- try {
449
- const r = await fetch("/_api/git-committers");
450
- if (!r.ok)
451
- return [];
452
- const data = await r.json();
453
- return Array.isArray(data.committers) ? data.committers : [];
454
- } catch {
455
- return [];
456
- }
457
- })();
458
- }
459
- return committerCache;
460
- }
461
- function firstNameSlug(name) {
462
- const first = name.trim().split(/\s+/)[0] ?? "";
463
- return first.replace(/[^\w.-]/g, "").toLowerCase();
464
- }
465
- function detectMentionToken(text, caret) {
466
- if (caret <= 0 || caret > text.length)
467
- return null;
468
- let i = caret - 1;
469
- while (i >= 0) {
470
- const ch = text[i] ?? "";
471
- if (ch === "@") {
472
- const prev = i > 0 ? text[i - 1] : "";
473
- if (i === 0 || /\s/.test(prev ?? "")) {
474
- const query = text.slice(i + 1, caret);
475
- return { start: i, end: caret, query };
476
- }
477
- return null;
478
- }
479
- if (!/[\w.-]/.test(ch))
480
- return null;
481
- i -= 1;
482
- }
483
- return null;
484
- }
485
- function MentionAwareTextarea({
486
- className,
487
- value,
488
- onChange,
489
- onKeyDown,
490
- placeholder,
491
- rows,
492
- disabled,
493
- textareaRef,
494
- ariaLabel
495
- }) {
496
- const internalRef = useRef3(null);
497
- const setRef = useCallback3((el) => {
498
- internalRef.current = el;
499
- if (textareaRef)
500
- textareaRef.current = el;
501
- }, [textareaRef]);
502
- const [committers, setCommitters] = useState3([]);
503
- const [token, setToken] = useState3(null);
504
- const [highlight, setHighlight] = useState3(0);
505
- const onFocus = useCallback3(() => {
506
- if (committers.length > 0)
507
- return;
508
- loadCommitters().then((list) => setCommitters(list));
509
- }, [committers.length]);
510
- const filtered = useMemo3(() => {
511
- if (!token)
512
- return [];
513
- const q = token.query.toLowerCase();
514
- const list = !q ? committers : committers.filter((c) => c.name.toLowerCase().includes(q) || c.email.toLowerCase().includes(q));
515
- return list.slice(0, 8);
516
- }, [token, committers]);
517
- const refreshToken = useCallback3((textarea) => {
518
- const caret = textarea.selectionStart ?? textarea.value.length;
519
- const t = detectMentionToken(textarea.value, caret);
520
- setToken(t);
521
- setHighlight(0);
522
- }, []);
523
- const handleChange = useCallback3((e) => {
524
- onChange(e.target.value);
525
- refreshToken(e.target);
526
- }, [onChange, refreshToken]);
527
- const insertMention = useCallback3((committer) => {
528
- if (!token)
529
- return;
530
- const ta = internalRef.current;
531
- if (!ta)
532
- return;
533
- const tag = `@${firstNameSlug(committer.name)}`;
534
- const next = `${value.slice(0, token.start)}${tag} ${value.slice(token.end)}`;
535
- onChange(next);
536
- setToken(null);
537
- const newCaret = token.start + tag.length + 1;
538
- requestAnimationFrame(() => {
539
- ta.focus();
540
- ta.setSelectionRange(newCaret, newCaret);
541
- });
542
- }, [token, value, onChange]);
543
- const handleKeyDown = useCallback3((e) => {
544
- if (token && filtered.length > 0) {
545
- if (e.key === "ArrowDown") {
546
- e.preventDefault();
547
- setHighlight((h) => (h + 1) % filtered.length);
548
- return;
549
- }
550
- if (e.key === "ArrowUp") {
551
- e.preventDefault();
552
- setHighlight((h) => (h - 1 + filtered.length) % filtered.length);
553
- return;
554
- }
555
- if (e.key === "Enter" || e.key === "Tab") {
556
- e.preventDefault();
557
- const pick = filtered[highlight] ?? filtered[0];
558
- if (pick)
559
- insertMention(pick);
560
- return;
561
- }
562
- if (e.key === "Escape") {
563
- e.preventDefault();
564
- setToken(null);
565
- return;
566
- }
567
- }
568
- onKeyDown?.(e);
569
- }, [token, filtered, highlight, insertMention, onKeyDown]);
570
- const handleSelect = useCallback3((e) => {
571
- refreshToken(e.currentTarget);
572
- }, [refreshToken]);
573
- return /* @__PURE__ */ jsxs("div", {
574
- style: { position: "relative" },
575
- children: [
576
- /* @__PURE__ */ jsx3("textarea", {
577
- ref: setRef,
578
- className,
579
- value,
580
- placeholder,
581
- rows,
582
- disabled,
583
- "aria-label": ariaLabel,
584
- onChange: handleChange,
585
- onKeyDown: handleKeyDown,
586
- onFocus,
587
- onSelect: handleSelect,
588
- onClick: handleSelect
589
- }),
590
- token && filtered.length > 0 ? /* @__PURE__ */ jsx3("ul", {
591
- className: "cm-mention-popup",
592
- role: "listbox",
593
- "aria-label": "Mention suggestions",
594
- style: { left: 0, top: "100%" },
595
- children: filtered.map((c, i) => {
596
- const selected = i === highlight;
597
- return /* @__PURE__ */ jsxs("li", {
598
- role: "option",
599
- "aria-selected": selected,
600
- className: "cm-mention-popup__item",
601
- onMouseEnter: () => setHighlight(i),
602
- onMouseDown: (ev) => {
603
- ev.preventDefault();
604
- insertMention(c);
605
- },
606
- children: [
607
- /* @__PURE__ */ jsxs("span", {
608
- className: "cm-mention-popup__name",
609
- children: [
610
- "@",
611
- firstNameSlug(c.name)
612
- ]
613
- }),
614
- /* @__PURE__ */ jsx3("span", {
615
- className: "cm-mention-popup__email",
616
- children: c.email
617
- })
618
- ]
619
- }, `${c.name}-${c.email}`);
620
- })
621
- }) : null
622
- ]
623
- });
624
- }
625
- function CommentPin({
626
- comment,
627
- sequence,
628
- focused,
629
- onClick
630
- }) {
631
- const ref = useRef3(null);
632
- const rafRef = useRef3(null);
633
- useEffect3(() => {
634
- const tick = () => {
635
- rafRef.current = null;
636
- const pin = ref.current;
637
- if (!pin)
638
- return;
639
- let pos = screenRectFor(comment.selector, comment.index);
640
- if (!pos && comment.bounds) {
641
- pos = {
642
- x: comment.bounds.x,
643
- y: comment.bounds.y,
644
- w: comment.bounds.w,
645
- h: comment.bounds.h
646
- };
647
- }
648
- if (!pos) {
649
- pin.style.display = "none";
650
- rafRef.current = requestAnimationFrame(tick);
651
- return;
652
- }
653
- pin.style.display = "grid";
654
- const left = Math.round(pos.x + pos.w - 12);
655
- const top = Math.round(pos.y - 12);
656
- pin.style.left = `${left}px`;
657
- pin.style.top = `${top}px`;
658
- rafRef.current = requestAnimationFrame(tick);
659
- };
660
- rafRef.current = requestAnimationFrame(tick);
661
- return () => {
662
- if (rafRef.current != null)
663
- cancelAnimationFrame(rafRef.current);
664
- };
665
- }, [comment.selector, comment.bounds, comment.index]);
666
- const author = comment.author?.trim() || "unknown";
667
- const label = `Comment ${sequence} by ${author}`;
668
- return /* @__PURE__ */ jsx3("button", {
669
- ref,
670
- type: "button",
671
- className: "cm-pin",
672
- "data-resolved": comment.status === "resolved" ? "true" : "false",
673
- "data-focused": focused ? "true" : "false",
674
- "data-comment-pin": comment.id,
675
- "aria-label": label,
676
- "aria-expanded": focused,
677
- title: comment.text.slice(0, 200),
678
- onClick: (e) => {
679
- e.preventDefault();
680
- e.stopPropagation();
681
- onClick(comment.id);
682
- },
683
- children: sequence
684
- });
685
- }
686
- function CommentComposer({
687
- state,
688
- onSubmit,
689
- onCancel
690
- }) {
691
- const [text, setText] = useState3("");
692
- const textareaRef = useRef3(null);
693
- const cardRef = useRef3(null);
694
- const rafRef = useRef3(null);
695
- useEffect3(() => {
696
- const tick = () => {
697
- rafRef.current = null;
698
- const node = cardRef.current;
699
- if (!node)
700
- return;
701
- const anchor = computeAnchor(state);
702
- node.style.left = `${Math.round(anchor.x)}px`;
703
- node.style.top = `${Math.round(anchor.y)}px`;
704
- rafRef.current = requestAnimationFrame(tick);
705
- };
706
- rafRef.current = requestAnimationFrame(tick);
707
- return () => {
708
- if (rafRef.current != null)
709
- cancelAnimationFrame(rafRef.current);
710
- };
711
- }, [state]);
712
- useEffect3(() => {
713
- textareaRef.current?.focus();
714
- }, []);
715
- const trySubmit = useCallback3(() => {
716
- const v = text.trim();
717
- if (!v)
718
- return;
719
- onSubmit(v);
720
- }, [text, onSubmit]);
721
- const onKeyDown = useCallback3((e) => {
722
- if (e.key === "Escape") {
723
- e.preventDefault();
724
- onCancel();
725
- return;
726
- }
727
- if ((e.metaKey || e.ctrlKey) && e.key === "Enter") {
728
- e.preventDefault();
729
- trySubmit();
730
- }
731
- }, [onCancel, trySubmit]);
732
- const selectorChip = useMemo3(() => {
733
- const s = state.selection.selector || "";
734
- if (!s)
735
- return state.selection.tag || "canvas";
736
- const cd = s.match(/data-cd-id="([^"]+)"/);
737
- if (cd)
738
- return `cd:${cd[1]}`;
739
- return s.length > 36 ? `${s.slice(0, 33)}…` : s;
740
- }, [state.selection]);
741
- return /* @__PURE__ */ jsxs("div", {
742
- ref: cardRef,
743
- className: "cm-composer",
744
- role: "dialog",
745
- "aria-label": "New comment",
746
- onClick: (e) => e.stopPropagation(),
747
- onPointerDown: (e) => e.stopPropagation(),
748
- children: [
749
- /* @__PURE__ */ jsxs("div", {
750
- className: "cm-composer__head",
751
- children: [
752
- /* @__PURE__ */ jsx3("span", {
753
- children: "New comment"
754
- }),
755
- /* @__PURE__ */ jsx3("span", {
756
- className: "cm-composer__selector",
757
- children: selectorChip
758
- })
759
- ]
760
- }),
761
- /* @__PURE__ */ jsx3(MentionAwareTextarea, {
762
- textareaRef,
763
- className: "cm-composer__textarea",
764
- value: text,
765
- placeholder: "Type a comment. ⌘↵ to save · Esc to cancel · @name to tag",
766
- onChange: setText,
767
- onKeyDown,
768
- rows: 3,
769
- ariaLabel: "Comment body"
770
- }),
771
- /* @__PURE__ */ jsxs("div", {
772
- className: "cm-composer__actions",
773
- children: [
774
- /* @__PURE__ */ jsx3("button", {
775
- type: "button",
776
- className: "cm-btn",
777
- onClick: onCancel,
778
- children: "Cancel"
779
- }),
780
- /* @__PURE__ */ jsx3("button", {
781
- type: "button",
782
- className: "cm-btn cm-btn--primary",
783
- disabled: !text.trim(),
784
- onClick: trySubmit,
785
- children: "Save"
786
- })
787
- ]
788
- })
789
- ]
790
- });
791
- }
792
- function CommentThread({
793
- comment,
794
- sequence,
795
- onClose,
796
- onPatch,
797
- onDelete,
798
- onReply
799
- }) {
800
- const dialogRef = useRef3(null);
801
- const replyRef = useRef3(null);
802
- const rafRef = useRef3(null);
803
- const [reply, setReply] = useState3("");
804
- const [sending, setSending] = useState3(false);
805
- useEffect3(() => {
806
- const tick = () => {
807
- rafRef.current = null;
808
- const node = dialogRef.current;
809
- if (!node)
810
- return;
811
- const anchor = computeThreadAnchor(comment);
812
- node.style.left = `${Math.round(anchor.x)}px`;
813
- node.style.top = `${Math.round(anchor.y)}px`;
814
- rafRef.current = requestAnimationFrame(tick);
815
- };
816
- rafRef.current = requestAnimationFrame(tick);
817
- return () => {
818
- if (rafRef.current != null)
819
- cancelAnimationFrame(rafRef.current);
820
- };
821
- }, [comment]);
822
- useEffect3(() => {
823
- dialogRef.current?.focus();
824
- const pinId = comment.id;
825
- return () => {
826
- const pin = document.querySelector(`[data-comment-pin="${pinId}"]`);
827
- pin?.focus();
828
- };
829
- }, [comment.id]);
830
- useEffect3(() => {
831
- if (typeof document === "undefined")
832
- return;
833
- const onKey = (e) => {
834
- if (e.key !== "Escape")
835
- return;
836
- const root = dialogRef.current;
837
- if (!root)
838
- return;
839
- if (root.contains(e.target) || document.activeElement === root) {
840
- e.preventDefault();
841
- onClose();
842
- }
843
- };
844
- document.addEventListener("keydown", onKey);
845
- return () => document.removeEventListener("keydown", onKey);
846
- }, [onClose]);
847
- const trySendReply = useCallback3(async () => {
848
- const v = reply.trim();
849
- if (!v || sending)
850
- return;
851
- setSending(true);
852
- const ok = await onReply(v);
853
- setSending(false);
854
- if (ok) {
855
- setReply("");
856
- replyRef.current?.focus();
857
- }
858
- }, [reply, sending, onReply]);
859
- const onReplyKeyDown = useCallback3((e) => {
860
- if ((e.metaKey || e.ctrlKey) && e.key === "Enter") {
861
- e.preventDefault();
862
- trySendReply();
863
- }
864
- }, [trySendReply]);
865
- const headId = `cm-thread-head-${comment.id}`;
866
- const selectorChip = formatSelectorChip(comment.selector, "");
867
- return /* @__PURE__ */ jsxs("div", {
868
- ref: dialogRef,
869
- className: "cm-thread",
870
- role: "dialog",
871
- "aria-labelledby": headId,
872
- tabIndex: -1,
873
- onClick: (e) => e.stopPropagation(),
874
- onPointerDown: (e) => e.stopPropagation(),
875
- children: [
876
- /* @__PURE__ */ jsxs("div", {
877
- className: "cm-thread__head",
878
- id: headId,
879
- children: [
880
- /* @__PURE__ */ jsxs("div", {
881
- className: "cm-thread__head-row",
882
- children: [
883
- /* @__PURE__ */ jsx3("span", {
884
- className: "cm-thread__seq",
885
- "aria-hidden": "true",
886
- children: sequence
887
- }),
888
- /* @__PURE__ */ jsx3("span", {
889
- className: "cm-thread__author",
890
- children: comment.author?.trim() || "unknown"
891
- }),
892
- /* @__PURE__ */ jsx3("span", {
893
- className: "cm-thread__time",
894
- children: formatRelativeTime(comment.created)
895
- }),
896
- /* @__PURE__ */ jsx3("button", {
897
- type: "button",
898
- className: "cm-thread__close",
899
- "aria-label": "Close thread",
900
- title: "Close · Esc",
901
- onClick: onClose,
902
- children: "×"
903
- })
904
- ]
905
- }),
906
- selectorChip ? /* @__PURE__ */ jsx3("code", {
907
- className: "cm-thread__selector",
908
- children: selectorChip
909
- }) : null
910
- ]
911
- }),
912
- /* @__PURE__ */ jsx3("div", {
913
- className: "cm-thread__body",
914
- children: renderBodyWithMentions(comment.text)
915
- }),
916
- (comment.thread ?? []).map((r) => /* @__PURE__ */ jsxs("div", {
917
- className: "cm-thread__reply",
918
- children: [
919
- /* @__PURE__ */ jsxs("div", {
920
- className: "cm-thread__reply-head",
921
- children: [
922
- /* @__PURE__ */ jsx3("span", {
923
- className: "cm-thread__reply-author",
924
- children: r.author?.trim() || "unknown"
925
- }),
926
- /* @__PURE__ */ jsx3("span", {
927
- className: "cm-thread__reply-time",
928
- children: formatRelativeTime(r.created)
929
- })
930
- ]
931
- }),
932
- /* @__PURE__ */ jsx3("div", {
933
- className: "cm-thread__reply-body",
934
- children: renderBodyWithMentions(r.body)
935
- })
936
- ]
937
- }, r.id)),
938
- /* @__PURE__ */ jsxs("div", {
939
- className: "cm-thread__reply-form",
940
- children: [
941
- /* @__PURE__ */ jsx3(MentionAwareTextarea, {
942
- textareaRef: replyRef,
943
- className: "cm-thread__reply-textarea",
944
- value: reply,
945
- placeholder: "Reply… ⌘↵ to send · @name to tag",
946
- onChange: setReply,
947
- onKeyDown: onReplyKeyDown,
948
- rows: 2,
949
- ariaLabel: "Reply",
950
- disabled: sending
951
- }),
952
- /* @__PURE__ */ jsx3("div", {
953
- className: "cm-thread__reply-actions",
954
- children: /* @__PURE__ */ jsx3("button", {
955
- type: "button",
956
- className: "cm-btn cm-btn--primary",
957
- disabled: !reply.trim() || sending,
958
- onClick: () => void trySendReply(),
959
- children: "Send"
960
- })
961
- })
962
- ]
963
- }),
964
- /* @__PURE__ */ jsxs("div", {
965
- className: "cm-thread__actions",
966
- children: [
967
- comment.status === "resolved" ? /* @__PURE__ */ jsx3("button", {
968
- type: "button",
969
- className: "cm-btn",
970
- onClick: () => onPatch({ status: "open" }),
971
- children: "↺ Reopen"
972
- }) : /* @__PURE__ */ jsx3("button", {
973
- type: "button",
974
- className: "cm-btn cm-btn--primary",
975
- onClick: () => {
976
- onPatch({ status: "resolved" });
977
- onClose();
978
- },
979
- children: "✓ Resolve"
980
- }),
981
- /* @__PURE__ */ jsx3("button", {
982
- type: "button",
983
- className: "cm-btn cm-btn--danger",
984
- onClick: () => {
985
- onDelete();
986
- onClose();
987
- },
988
- children: "Delete"
989
- })
990
- ]
991
- })
992
- ]
993
- });
994
- }
995
- function renderBodyWithMentions(text) {
996
- if (!text)
997
- return null;
998
- const re = /(@[\w][\w.-]*)/g;
999
- const parts = text.split(re);
1000
- return parts.map((part, i) => {
1001
- const key = `${i}:${part}`;
1002
- if (i % 2 === 1) {
1003
- return /* @__PURE__ */ jsx3("strong", {
1004
- "data-mention": "true",
1005
- children: part
1006
- }, key);
1007
- }
1008
- return /* @__PURE__ */ jsx3("span", {
1009
- children: part
1010
- }, key);
1011
- });
1012
- }
1013
- function formatRelativeTime(iso) {
1014
- if (!iso)
1015
- return "";
1016
- const t = Date.parse(iso);
1017
- if (!Number.isFinite(t))
1018
- return "";
1019
- const diffSec = Math.round((Date.now() - t) / 1000);
1020
- if (diffSec < 60)
1021
- return `${Math.max(diffSec, 0)}s ago`;
1022
- if (diffSec < 3600)
1023
- return `${Math.round(diffSec / 60)}m ago`;
1024
- if (diffSec < 86400)
1025
- return `${Math.round(diffSec / 3600)}h ago`;
1026
- return `${Math.round(diffSec / 86400)}d ago`;
1027
- }
1028
- function formatSelectorChip(selector, fallback) {
1029
- if (!selector)
1030
- return fallback;
1031
- const cd = selector.match(/data-cd-id="([^"]+)"/);
1032
- if (cd)
1033
- return `cd:${cd[1]}`;
1034
- return selector.length > 36 ? `${selector.slice(0, 33)}…` : selector;
1035
- }
1036
- function computeThreadAnchor(comment) {
1037
- const rect = comment.selector ? screenRectFor(comment.selector, comment.index) : null;
1038
- if (rect) {
1039
- return { x: rect.x + rect.w - 12, y: rect.y + 16 };
1040
- }
1041
- if (comment.bounds) {
1042
- return { x: comment.bounds.x + comment.bounds.w - 12, y: comment.bounds.y + 16 };
1043
- }
1044
- return { x: 16, y: 16 };
1045
- }
1046
- function computeAnchor(state) {
1047
- if (state.clientX || state.clientY) {
1048
- return { x: state.clientX, y: state.clientY + 8 };
1049
- }
1050
- if (state.selection.selector) {
1051
- const rect = screenRectFor(state.selection.selector, state.selection.index);
1052
- if (rect) {
1053
- return { x: rect.x, y: rect.y + rect.h + 8 };
1054
- }
1055
- }
1056
- return { x: 16, y: 16 };
1057
- }
1058
-
1059
- // dom-selection.ts
1060
- function deriveFile2() {
1061
- if (typeof window === "undefined")
1062
- return;
1063
- try {
1064
- const p = window.location.pathname;
1065
- if (p === "/_canvas-shell.html" || p === "/_canvas-shell") {
1066
- const qs = new URLSearchParams(window.location.search);
1067
- const canvas = qs.get("canvas") ?? "";
1068
- const designRel = (qs.get("designRel") ?? ".design").replace(/^\/+|\/+$/g, "");
1069
- return canvas ? `${designRel}/${canvas}` : undefined;
1070
- }
1071
- return decodeURIComponent(p).replace(/^\//, "");
1072
- } catch {
1073
- return;
1074
- }
1075
- }
1076
- function realClasses(el) {
1077
- if (!el)
1078
- return "";
1079
- return (el.getAttribute("class") ?? "").trim().split(/\s+/).filter((c) => c && !c.startsWith("dgn-") && !c.startsWith("dc-cv-")).join(" ");
1080
- }
1081
- function shortText(el, max) {
1082
- if (!el)
1083
- return "";
1084
- const t = (el.innerText || el.textContent || "").replace(/\s+/g, " ").trim();
1085
- return t.length > max ? `${t.slice(0, max - 1)}…` : t;
1086
- }
1087
- function cssPath(el) {
1088
- if (!el)
1089
- return "";
1090
- const path = [];
1091
- let cur = el;
1092
- while (cur && cur.nodeType === 1 && path.length < 8) {
1093
- const dscEl = cur.getAttribute?.("data-dc-element");
1094
- if (dscEl) {
1095
- path.unshift(`[data-dc-element="${dscEl}"]`);
1096
- break;
1097
- }
1098
- const dscSc = cur.getAttribute?.("data-dc-screen");
1099
- if (dscSc) {
1100
- path.unshift(`[data-dc-screen="${dscSc}"]`);
1101
- break;
1102
- }
1103
- let sel = cur.nodeName.toLowerCase();
1104
- if (cur.id) {
1105
- sel = `#${cur.id}`;
1106
- path.unshift(sel);
1107
- break;
1108
- }
1109
- const cls = realClasses(cur).split(/\s+/).filter(Boolean).slice(0, 2);
1110
- if (cls.length)
1111
- sel += `.${cls.join(".")}`;
1112
- let sib = 1;
1113
- let n = cur.previousElementSibling;
1114
- while (n) {
1115
- sib++;
1116
- n = n.previousElementSibling;
1117
- }
1118
- sel += `:nth-child(${sib})`;
1119
- path.unshift(sel);
1120
- cur = cur.parentElement;
1121
- }
1122
- return path.join(" > ");
1123
- }
1124
- function domPath(el) {
1125
- const hops = [];
1126
- let cur = el;
1127
- while (cur && cur.nodeType === 1 && hops.length < 8) {
1128
- let label = cur.nodeName.toLowerCase();
1129
- const dEl = cur.getAttribute?.("data-dc-element");
1130
- const dSc = cur.getAttribute?.("data-dc-screen");
1131
- if (dEl)
1132
- label += `[data-dc-element="${dEl}"]`;
1133
- else if (dSc)
1134
- label += `[data-dc-screen="${dSc}"]`;
1135
- else if (cur.id)
1136
- label += `#${cur.id}`;
1137
- const cls = realClasses(cur).split(/\s+/).filter(Boolean).slice(0, 2);
1138
- if (cls.length && !dEl && !dSc)
1139
- label += `.${cls.join(".")}`;
1140
- hops.unshift(label);
1141
- cur = cur.parentElement;
1142
- }
1143
- return hops;
1144
- }
1145
- function scopedCdSelector(cdId, artboardId) {
1146
- return artboardId ? `[data-dc-screen="${artboardId}"] [data-cd-id="${cdId}"]` : `[data-cd-id="${cdId}"]`;
1147
- }
1148
- function selectorIndex(doc, selector, el) {
1149
- if (!el)
1150
- return 0;
1151
- try {
1152
- const all = doc.querySelectorAll(selector);
1153
- for (let i = 0;i < all.length; i++) {
1154
- if (all[i] === el)
1155
- return i;
1156
- }
1157
- } catch {}
1158
- return 0;
1159
- }
1160
- var KNOB_PROPS = [
1161
- "display",
1162
- "flex-direction",
1163
- "align-items",
1164
- "justify-content",
1165
- "gap",
1166
- "font-family",
1167
- "color",
1168
- "font-size",
1169
- "font-weight",
1170
- "line-height",
1171
- "letter-spacing",
1172
- "text-align",
1173
- "margin",
1174
- "margin-top",
1175
- "margin-right",
1176
- "margin-bottom",
1177
- "margin-left",
1178
- "padding",
1179
- "padding-top",
1180
- "padding-right",
1181
- "padding-bottom",
1182
- "padding-left",
1183
- "width",
1184
- "height",
1185
- "max-width",
1186
- "background-color",
1187
- "border-radius",
1188
- "border-top-left-radius",
1189
- "border-top-right-radius",
1190
- "border-bottom-left-radius",
1191
- "border-bottom-right-radius",
1192
- "border-width",
1193
- "border-style",
1194
- "border-color",
1195
- "box-shadow",
1196
- "opacity"
1197
- ];
1198
- var ATTR_SKIP = /^(style|class|data-cd-id|data-dc-|data-dcid$)/;
1199
- function styleMapsFor(el) {
1200
- if (!el || typeof window === "undefined" || !window.getComputedStyle) {
1201
- return { authored: {}, computed: {}, customStyles: {}, attrs: {} };
1202
- }
1203
- try {
1204
- const inline = el.style;
1205
- const cs = window.getComputedStyle(el);
1206
- const authored = {};
1207
- const computed = {};
1208
- const knob = new Set(KNOB_PROPS);
1209
- for (const p of KNOB_PROPS) {
1210
- const a = inline.getPropertyValue(p);
1211
- if (a)
1212
- authored[p] = a.trim();
1213
- const c = cs.getPropertyValue(p);
1214
- if (c)
1215
- computed[p] = c.trim();
1216
- }
1217
- const MANAGED_FAMILY = /^(margin|padding|border)(-|$)/;
1218
- const customStyles = {};
1219
- for (let i = 0;i < inline.length; i++) {
1220
- const p = inline.item(i);
1221
- if (!p || knob.has(p) || MANAGED_FAMILY.test(p))
1222
- continue;
1223
- const v = inline.getPropertyValue(p);
1224
- if (v)
1225
- customStyles[p] = v.trim();
1226
- }
1227
- const attrs = {};
1228
- for (const a of Array.from(el.attributes)) {
1229
- if (ATTR_SKIP.test(a.name))
1230
- continue;
1231
- attrs[a.name] = a.value;
1232
- }
1233
- return { authored, computed, customStyles, attrs };
1234
- } catch {
1235
- return { authored: {}, computed: {}, customStyles: {}, attrs: {} };
1236
- }
1237
- }
1238
- function hoverTargetToSelection(target, file) {
1239
- const el = target.el;
1240
- const rect = el && el.getBoundingClientRect ? el.getBoundingClientRect() : null;
1241
- const cdId = target.cdId;
1242
- const selector = cdId ? scopedCdSelector(cdId, target.artboardId) : target.artboardId ? `[data-dc-screen="${target.artboardId}"]` : cssPath(el);
1243
- const index = cdId && typeof document !== "undefined" ? selectorIndex(document, selector, el) : 0;
1244
- return {
1245
- file: file ?? deriveFile2(),
1246
- id: cdId ?? undefined,
1247
- selector,
1248
- artboardId: target.artboardId,
1249
- index,
1250
- tag: el?.tagName.toLowerCase() ?? "",
1251
- classes: realClasses(el),
1252
- text: shortText(el, 240),
1253
- dom_path: domPath(el),
1254
- bounds: rect ? {
1255
- x: Math.round(rect.left),
1256
- y: Math.round(rect.top),
1257
- w: Math.round(rect.width),
1258
- h: Math.round(rect.height)
1259
- } : null,
1260
- html: el ? (el.outerHTML ?? "").slice(0, 4000) : "",
1261
- ...styleMapsFor(el)
1262
- };
1263
- }
1264
-
1265
- // input-router.tsx
1266
- import { useEffect as useEffect4 } from "react";
1267
- var ANNOTATION_TOOLS = new Set([
1268
- "pen",
1269
- "highlighter",
1270
- "shape",
1271
- "rect",
1272
- "ellipse",
1273
- "arrow",
1274
- "sticky",
1275
- "text",
1276
- "section",
1277
- "eraser"
1278
- ]);
1279
- function isAnnotationTool(t) {
1280
- return ANNOTATION_TOOLS.has(t);
1281
- }
1282
- var metaOrCtrl = (i) => !!(i.metaKey || i.ctrlKey);
1283
- function classify(input) {
1284
- if (input.type === "keydown") {
1285
- if (input.isEditable)
1286
- return { kind: "no-op" };
1287
- if (input.metaKey || input.ctrlKey || input.altKey) {
1288
- if (input.key === "Escape")
1289
- return { kind: "escape" };
1290
- const k2 = (input.key || "").toLowerCase();
1291
- if (!input.altKey && (input.metaKey || input.ctrlKey)) {
1292
- if (k2 === "z" && input.shiftKey)
1293
- return { kind: "redo" };
1294
- if (k2 === "z")
1295
- return { kind: "undo" };
1296
- if (k2 === "y" && !input.shiftKey)
1297
- return { kind: "redo" };
1298
- }
1299
- return { kind: "no-op" };
1300
- }
1301
- const k = (input.key || "").toLowerCase();
1302
- if (k === "v")
1303
- return { kind: "tool", tool: "move" };
1304
- if (k === "h")
1305
- return { kind: "tool", tool: "hand" };
1306
- if (k === "c")
1307
- return { kind: "tool", tool: "comment" };
1308
- if (k === "b")
1309
- return { kind: "tool", tool: "pen" };
1310
- if (k === "i")
1311
- return { kind: "tool", tool: "highlighter" };
1312
- if (k === "r" || k === "o")
1313
- return { kind: "tool", tool: "shape" };
1314
- if (k === "a")
1315
- return { kind: "tool", tool: "arrow" };
1316
- if (k === "n")
1317
- return { kind: "tool", tool: "sticky" };
1318
- if (k === "t")
1319
- return { kind: "tool", tool: "text" };
1320
- if (k === "s" && input.shiftKey)
1321
- return { kind: "tool", tool: "section" };
1322
- if (k === "e")
1323
- return { kind: "tool", tool: "eraser" };
1324
- if (input.key === "Escape")
1325
- return { kind: "escape" };
1326
- return { kind: "no-op" };
1327
- }
1328
- if (input.type === "contextmenu") {
1329
- return {
1330
- kind: "context-menu",
1331
- clientX: input.clientX ?? 0,
1332
- clientY: input.clientY ?? 0
1333
- };
1334
- }
1335
- if (input.type === "pointermove") {
1336
- if (isAnnotationTool(input.activeTool))
1337
- return { kind: "no-op" };
1338
- if (input.activeTool === "hand")
1339
- return { kind: "no-op" };
1340
- if (input.activeTool === "comment") {
1341
- return {
1342
- kind: "hover",
1343
- deep: true,
1344
- clientX: input.clientX ?? 0,
1345
- clientY: input.clientY ?? 0
1346
- };
1347
- }
1348
- if (!metaOrCtrl(input))
1349
- return { kind: "no-op" };
1350
- return {
1351
- kind: "hover",
1352
- deep: true,
1353
- clientX: input.clientX ?? 0,
1354
- clientY: input.clientY ?? 0
1355
- };
1356
- }
1357
- if (input.type === "pointerdown") {
1358
- if (input.button === 2) {
1359
- return {
1360
- kind: "context-menu",
1361
- clientX: input.clientX ?? 0,
1362
- clientY: input.clientY ?? 0
1363
- };
1364
- }
1365
- if (input.button === 1 || input.spaceHeld)
1366
- return { kind: "no-op" };
1367
- if (input.button !== 0)
1368
- return { kind: "no-op" };
1369
- if (isAnnotationTool(input.activeTool) && !metaOrCtrl(input)) {
1370
- return { kind: "no-op" };
1371
- }
1372
- if (input.activeTool === "comment") {
1373
- return {
1374
- kind: "drop-comment",
1375
- clientX: input.clientX ?? 0,
1376
- clientY: input.clientY ?? 0
1377
- };
1378
- }
1379
- if (input.activeTool === "hand")
1380
- return { kind: "no-op" };
1381
- const cmd = metaOrCtrl(input);
1382
- if (!cmd)
1383
- return { kind: "no-op" };
1384
- const shift = !!input.shiftKey;
1385
- return {
1386
- kind: "select",
1387
- mode: shift ? "add" : "replace",
1388
- deep: true,
1389
- clientX: input.clientX ?? 0,
1390
- clientY: input.clientY ?? 0
1391
- };
1392
- }
1393
- return { kind: "no-op" };
1394
- }
1395
- function isEditableTarget(t) {
1396
- if (!t || !t.tagName)
1397
- return false;
1398
- const el = t;
1399
- const tag = el.tagName;
1400
- if (tag === "INPUT" || tag === "TEXTAREA" || tag === "SELECT")
1401
- return true;
1402
- if (el.isContentEditable)
1403
- return true;
1404
- return false;
1405
- }
1406
- function isOverlayTarget(t) {
1407
- if (!t || !t.closest)
1408
- return false;
1409
- return !!t.closest(".cm-composer, .cm-thread, .cm-mention-popup, .cm-pin");
1410
- }
1411
- function useInputRouter(opts) {
1412
- const { hostRef, getActiveTool, isSpaceHeld, callbacks, enabled = true, claimableActions } = opts;
1413
- useEffect4(() => {
1414
- if (!enabled)
1415
- return;
1416
- const host = hostRef.current;
1417
- if (!host)
1418
- return;
1419
- const claim = (action) => claimableActions && action.kind !== "no-op" && !claimableActions.has(action.kind) ? { kind: "no-op" } : action;
1420
- const dispatch = (action) => {
1421
- switch (action.kind) {
1422
- case "hover":
1423
- callbacks.onHover?.(action);
1424
- break;
1425
- case "select":
1426
- callbacks.onSelect?.(action);
1427
- break;
1428
- case "drop-comment":
1429
- callbacks.onDropComment?.(action);
1430
- break;
1431
- case "context-menu":
1432
- callbacks.onContextMenu?.(action);
1433
- break;
1434
- case "tool":
1435
- callbacks.onTool?.(action);
1436
- break;
1437
- case "escape":
1438
- callbacks.onEscape?.();
1439
- break;
1440
- case "undo":
1441
- callbacks.onUndo?.();
1442
- break;
1443
- case "redo":
1444
- callbacks.onRedo?.();
1445
- break;
1446
- case "no-op":
1447
- break;
1448
- }
1449
- };
1450
- const onPointerMove = (e) => {
1451
- const action = claim(classify({
1452
- type: "pointermove",
1453
- button: e.button,
1454
- metaKey: e.metaKey,
1455
- ctrlKey: e.ctrlKey,
1456
- shiftKey: e.shiftKey,
1457
- altKey: e.altKey,
1458
- clientX: e.clientX,
1459
- clientY: e.clientY,
1460
- spaceHeld: isSpaceHeld?.() ?? false,
1461
- activeTool: getActiveTool()
1462
- }));
1463
- dispatch(action);
1464
- };
1465
- const onPointerDown = (e) => {
1466
- if (isOverlayTarget(e.target))
1467
- return;
1468
- const action = claim(classify({
1469
- type: "pointerdown",
1470
- button: e.button,
1471
- metaKey: e.metaKey,
1472
- ctrlKey: e.ctrlKey,
1473
- shiftKey: e.shiftKey,
1474
- altKey: e.altKey,
1475
- clientX: e.clientX,
1476
- clientY: e.clientY,
1477
- spaceHeld: isSpaceHeld?.() ?? false,
1478
- activeTool: getActiveTool()
1479
- }));
1480
- if (action.kind !== "no-op") {
1481
- e.preventDefault();
1482
- e.stopImmediatePropagation();
1483
- }
1484
- dispatch(action);
1485
- };
1486
- const onMouseDown = (e) => {
1487
- if (isOverlayTarget(e.target))
1488
- return;
1489
- const action = claim(classify({
1490
- type: "pointerdown",
1491
- button: e.button,
1492
- metaKey: e.metaKey,
1493
- ctrlKey: e.ctrlKey,
1494
- shiftKey: e.shiftKey,
1495
- altKey: e.altKey,
1496
- clientX: e.clientX,
1497
- clientY: e.clientY,
1498
- spaceHeld: isSpaceHeld?.() ?? false,
1499
- activeTool: getActiveTool()
1500
- }));
1501
- if (action.kind !== "no-op") {
1502
- e.preventDefault();
1503
- e.stopImmediatePropagation();
1504
- }
1505
- };
1506
- const onClick = (e) => {
1507
- if (isOverlayTarget(e.target))
1508
- return;
1509
- const tool = getActiveTool();
1510
- const mod = e.metaKey || e.ctrlKey;
1511
- const wouldRouteKind = tool === "comment" ? "drop-comment" : tool === "move" && mod && e.button === 0 ? "select" : e.button === 2 ? "context-menu" : null;
1512
- if (wouldRouteKind && (!claimableActions || claimableActions.has(wouldRouteKind))) {
1513
- e.preventDefault();
1514
- e.stopImmediatePropagation();
1515
- }
1516
- };
1517
- const onContextMenu = (e) => {
1518
- const action = claim(classify({
1519
- type: "contextmenu",
1520
- clientX: e.clientX,
1521
- clientY: e.clientY,
1522
- metaKey: e.metaKey,
1523
- ctrlKey: e.ctrlKey,
1524
- shiftKey: e.shiftKey,
1525
- altKey: e.altKey,
1526
- activeTool: getActiveTool()
1527
- }));
1528
- if (action.kind === "no-op")
1529
- return;
1530
- e.preventDefault();
1531
- e.stopImmediatePropagation();
1532
- dispatch(action);
1533
- };
1534
- const onKeyDown = (e) => {
1535
- const action = claim(classify({
1536
- type: "keydown",
1537
- key: e.key,
1538
- metaKey: e.metaKey,
1539
- ctrlKey: e.ctrlKey,
1540
- shiftKey: e.shiftKey,
1541
- altKey: e.altKey,
1542
- isEditable: isEditableTarget(e.target),
1543
- activeTool: getActiveTool()
1544
- }));
1545
- if (action.kind === "tool" || action.kind === "escape" || action.kind === "undo" || action.kind === "redo") {
1546
- e.preventDefault();
1547
- }
1548
- dispatch(action);
1549
- };
1550
- host.addEventListener("pointermove", onPointerMove, { passive: true });
1551
- host.addEventListener("pointerdown", onPointerDown, { capture: true });
1552
- host.addEventListener("mousedown", onMouseDown, { capture: true });
1553
- host.addEventListener("click", onClick, { capture: true });
1554
- host.addEventListener("contextmenu", onContextMenu, { capture: true });
1555
- const doc = host.ownerDocument ?? document;
1556
- doc.addEventListener("keydown", onKeyDown, true);
1557
- return () => {
1558
- host.removeEventListener("pointermove", onPointerMove);
1559
- host.removeEventListener("pointerdown", onPointerDown, {
1560
- capture: true
1561
- });
1562
- host.removeEventListener("mousedown", onMouseDown, { capture: true });
1563
- host.removeEventListener("click", onClick, { capture: true });
1564
- host.removeEventListener("contextmenu", onContextMenu, {
1565
- capture: true
1566
- });
1567
- doc.removeEventListener("keydown", onKeyDown, true);
1568
- };
1569
- }, [enabled, hostRef, getActiveTool, isSpaceHeld, callbacks, claimableActions]);
1570
- }
1571
- function resolveHoverTarget(doc, clientX, clientY, opts) {
1572
- const hit = doc.elementFromPoint(clientX, clientY);
1573
- if (!hit)
1574
- return null;
1575
- if (hit.closest?.(".dc-mm, .dc-zoom-tb, .dc-tool-palette, .dc-context-menu, .dc-cv-group-bbox")) {
1576
- return null;
1577
- }
1578
- const artboardEl = hit.closest?.("[data-dc-screen]") ?? null;
1579
- const artboardId = artboardEl?.getAttribute("data-dc-screen") ?? null;
1580
- const bodyEl = hit.closest?.(".dc-artboard-body") ?? null;
1581
- if (!bodyEl) {
1582
- if (artboardEl && artboardId) {
1583
- return { el: artboardEl, cdId: null, artboardId };
1584
- }
1585
- return null;
1586
- }
1587
- if (hit === bodyEl) {
1588
- if (artboardEl && artboardId) {
1589
- return { el: artboardEl, cdId: null, artboardId };
1590
- }
1591
- return null;
1592
- }
1593
- if (opts.deep) {
1594
- const cdId2 = hit.getAttribute?.("data-cd-id") ?? null;
1595
- return { el: hit, cdId: cdId2, artboardId };
1596
- }
1597
- let cur = hit;
1598
- let topCdEl = null;
1599
- while (cur && cur !== bodyEl) {
1600
- if (cur.hasAttribute?.("data-cd-id"))
1601
- topCdEl = cur;
1602
- cur = cur.parentElement;
1603
- }
1604
- const el = topCdEl ?? hit;
1605
- const cdId = el.getAttribute?.("data-cd-id") ?? null;
1606
- return { el, cdId, artboardId };
1607
- }
1608
-
1609
- // use-tool-mode.tsx
1610
- import {
1611
- createContext as createContext3,
1612
- useCallback as useCallback4,
1613
- useContext as useContext3,
1614
- useEffect as useEffect5,
1615
- useMemo as useMemo4,
1616
- useState as useState4
1617
- } from "react";
1618
-
1619
- // canvas-cursors.ts
1620
- function svgCursor(svg, hx, hy, fallback) {
1621
- return `url("data:image/svg+xml,${encodeURIComponent(svg.trim())}") ${hx} ${hy}, ${fallback}`;
1622
- }
1623
- var W = `width='24' height='24' viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'`;
1624
- var INK = "#1f1f1f";
1625
- var HALO = "stroke='#ffffff' stroke-linejoin='round' stroke-linecap='round'";
1626
- function kenney(b, w, transform) {
1627
- const open = transform ? `<g transform='${transform}'>` : "";
1628
- const close = transform ? "</g>" : "";
1629
- return `<svg ${W}>${open}<path fill='#ffffff' d='${b}'/><path fill='${INK}' d='${w}'/>${close}</svg>`;
1630
- }
1631
- var FLIP_V = "translate(0,32) scale(1,-1)";
1632
- var MOVE = svgCursor(kenney("M10.25 8.25 L10.05 8.65 10 9 10 23.1 10.05 23.4 10.25 23.75 10.8 24 11.45 23.85 11.6 23.7 11.75 23.45 14.65 19.8 14.85 19.65 14.95 19.5 15.4 19.2 15.95 19.1 21.05 19.1 21.2 19.1 21.35 19.05 21.65 18.9 21.9 18.6 22 18.3 22 17.9 21.9 17.65 21.75 17.35 21.65 17.3 21.55 17.15 11.5 8.25 11.25 8.05 10.95 8 10.6 8.05 10.25 8.25 M9.15 6.6 L9.7 6.25 10 6.15 10.95 6 11.9 6.15 13 6.9 22.9 15.65 23 15.8 23.2 15.95 23.75 16.75 24 17.9 24 18.3 23.9 18.95 23.8 19.25 23.6 19.7 23.1 20.35 22.75 20.6 22.1 20.9 22.05 20.95 22 20.95 21.2 21.1 21.05 21.1 16.2 21.1 16.1 21.25 16.05 21.25 13.4 24.6 13.05 25.15 12.9 25.3 12.55 25.55 Q11.6 26.15 10.55 26 L10.5 26 Q9.65 25.85 9 25.3 L8.45 24.65 8.4 24.5 8.15 24.05 8 23.1 8 9 Q8 8.45 8.15 8.05 L8.25 7.75 8.45 7.35 9.15 6.6", "M10.25 8.25 L10.6 8.05 10.95 8 11.25 8.05 11.5 8.25 21.55 17.15 21.65 17.3 21.75 17.35 21.9 17.65 22 17.9 22 18.3 21.9 18.6 21.65 18.9 21.35 19.05 21.2 19.1 21.05 19.1 15.95 19.1 15.4 19.2 14.95 19.5 14.85 19.65 14.65 19.8 11.75 23.45 11.6 23.7 11.45 23.85 10.8 24 10.25 23.75 10.05 23.4 10 23.1 10 9 10.05 8.65 10.25 8.25"), 8, 5, "default");
1633
- var HAND = svgCursor(kenney("M28.55 17.8 Q29.4 20.3 28.75 22.8 L28.7 23 28.15 24.55 28.05 24.75 Q26.4 28.2 22.75 29.4 L22.45 29.5 18 29.9 17.75 29.85 Q15.8 29.25 13.8 28.1 L13.45 27.95 Q12 27.05 10.35 26.8 L10.25 26.75 7.9 26.7 7.8 26.7 Q6.1 26.9 4.8 25.8 L4.75 25.8 4.65 25.7 4.6 25.65 Q3.25 24.5 3.05 22.85 L3 22.75 Q2.8 20.95 4 19.5 5.05 18.15 6.75 17.95 L8.4 17.9 7.5 15.55 7.3 15.2 7.2 15 5 10.95 Q3.9 9.15 4.3 7.75 L4.4 7.5 Q4.75 6.15 6.45 5.2 9 3.65 11 5 11.05 4.1 11.5 3.45 12.15 2.1 14.2 1.6 L14.35 1.6 Q18.05 0.6 19.6 4.4 L19.65 4.55 Q20.75 3.65 22.7 3.75 L22.75 3.75 Q26.75 4 27 8.15 L27 8.25 27 8.35 27 8.45 Q26.9 10.75 27.1 12.6 27.15 14.65 28.2 16.75 L28.55 17.8 M26.65 18.4 L26.1 16.8 26.1 16.85 Q24.8 13.7 25 8.35 L25 8.25 Q24.85 5.9 22.6 5.75 20.7 5.65 20.4 7.35 L20.1 7.95 19.5 8.2 18.85 8.05 18.45 7.5 17.75 5.15 Q16.85 2.95 14.7 3.55 L14.65 3.55 Q12.55 4.05 13.15 6.15 L13.85 8.75 13.75 9.45 13.25 9.95 12.55 9.95 12 9.55 10.9 7.7 Q9.5 5.7 7.45 6.9 6.5 7.45 6.25 8.15 6.1 8.9 6.7 9.85 9.2 13.9 10.8 18.65 L10.8 19.3 10.4 19.8 9.75 19.95 Q8.35 19.8 6.95 19.95 6.1 20.05 5.55 20.75 4.9 21.55 5 22.55 5.15 23.55 6 24.2 L6.05 24.25 Q6.75 24.85 7.65 24.7 L7.7 24.7 10.65 24.8 Q12.7 25.15 14.45 26.2 L14.5 26.2 Q16.4 27.35 18.3 27.9 L22.05 27.5 22.1 27.5 Q24.95 26.55 26.25 23.85 L26.8 22.3 Q27.3 20.35 26.65 18.4", "M26.65 18.4 Q27.3 20.35 26.8 22.3 L26.25 23.85 Q24.95 26.55 22.1 27.5 L22.05 27.5 18.3 27.9 Q16.4 27.35 14.5 26.2 L14.45 26.2 Q12.7 25.15 10.65 24.8 L7.7 24.7 7.65 24.7 Q6.75 24.85 6.05 24.25 L6 24.2 Q5.15 23.55 5 22.55 4.9 21.55 5.55 20.75 6.1 20.05 6.95 19.95 8.35 19.8 9.75 19.95 L10.4 19.8 10.8 19.3 10.8 18.65 Q9.2 13.9 6.7 9.85 6.1 8.9 6.25 8.15 6.5 7.45 7.45 6.9 9.5 5.7 10.9 7.7 L12 9.55 12.55 9.95 13.25 9.95 13.75 9.45 13.85 8.75 13.15 6.15 Q12.55 4.05 14.65 3.55 L14.7 3.55 Q16.85 2.95 17.75 5.15 L18.45 7.5 18.85 8.05 19.5 8.2 20.1 7.95 20.4 7.35 Q20.7 5.65 22.6 5.75 24.85 5.9 25 8.25 L25 8.35 Q24.8 13.7 26.1 16.85 L26.1 16.8 26.65 18.4"), 12, 12, "grab");
1634
- var COMMENT = svgCursor(kenney("M28 14 Q28 9.85 24.45 6.9 20.95 4 16 4 11.05 4 7.5 6.9 L7.45 7 Q4 9.9 4 14 4 18.15 7.55 21.05 L7.5 21.05 Q9.2 22.45 11.2 23.2 L15.3 27.3 16 27.6 16.7 27.3 20.85 23.2 Q22.7 22.45 24.3 21.15 L24.45 21.05 Q28 18.15 28 14 M25.75 5.35 Q30.05 8.95 30 14 30.05 19.05 25.75 22.6 L25.4 22.85 Q23.8 24.1 22 24.9 L18.1 28.75 18.15 28.75 Q17.2 29.6 16 29.6 14.8 29.6 13.85 28.75 L13.9 28.75 10 24.9 6.6 22.85 6.25 22.6 Q1.95 19.05 2 14 1.95 8.95 6.25 5.35 10.3 2 16 2 21.7 2 25.75 5.35", "M28 14 Q28 18.15 24.45 21.05 L24.3 21.15 Q22.7 22.45 20.85 23.2 L16.7 27.3 16 27.6 15.3 27.3 11.2 23.2 Q9.2 22.45 7.5 21.05 L7.55 21.05 Q4 18.15 4 14 4 9.9 7.45 7 L7.5 6.9 Q11.05 4 16 4 20.95 4 24.45 6.9 28 9.85 28 14"), 12, 21, "crosshair");
1635
- var PEN = svgCursor(kenney("M4 13.1 L4 6 Q4 5.15 4.6 4.6 5.15 4 6 4 L13.1 4 Q13.95 4 14.55 4.6 L28.65 18.75 Q29.8 19.9 29.75 21.45 L29.75 21.6 29.75 21.7 Q29.75 23.2 28.7 24.35 L24.45 28.65 24.35 28.75 Q23.15 29.85 21.65 29.8 L21.55 29.8 21.4 29.8 Q20.2 29.8 19.25 29.15 L18 29.35 Q16.6 29.4 15.25 28 L15.2 27.95 8.2 20.95 Q7.6 20.35 7.6 19.55 7.6 18.7 8.2 18.1 L4.6 14.5 Q4 13.9 4 13.1 M19.5 26.65 L20.1 27.25 Q20.7 27.85 21.5 27.8 22.35 27.85 23 27.25 L27.25 22.95 Q27.8 22.35 27.75 21.55 27.8 20.75 27.2 20.15 L13.1 6 6 6 6 13.1 12.35 19.45 9.6 19.5 16.65 26.55 Q18.05 28.05 19.5 26.65 M8.05 12.3 L8 8 12.25 8.05 13.8 9.6 9.6 13.85 8.05 12.3 M15.25 11.05 L23 18.8 18.8 23.05 11.05 15.3 15.25 11.05", "M15.25 11.05 L11.05 15.3 18.8 23.05 23 18.8 15.25 11.05 M12.35 19.45 L6 13.1 6 6 13.1 6 27.2 20.15 Q27.8 20.75 27.75 21.55 27.8 22.35 27.25 22.95 L23 27.25 Q22.35 27.85 21.5 27.8 20.7 27.85 20.1 27.25 L19.5 26.65 12.35 19.45 M8.05 12.3 L9.6 13.85 13.8 9.6 12.25 8.05 8 8 8.05 12.3", FLIP_V), 6, 18, "crosshair");
1636
- var HIGHLIGHTER = svgCursor(kenney("M5.15 10.85 Q4 9.65 4 8.1 L4 7.95 4 7.85 Q3.95 6.2 5.1 5.15 6.25 4 7.85 4 L7.95 4 8.1 4 Q9.65 4 10.85 5.15 L11 5.3 14.3 5.25 Q15.15 5.25 15.75 5.85 L29.9 20 Q31 21.15 31 22.75 L31 22.85 31 23 Q31.05 24.5 29.9 25.7 L29.55 25.95 25.65 29.9 25.65 29.95 Q24.45 31.1 22.75 31.1 21.2 31.15 20 29.95 L5.85 15.8 Q5.25 15.2 5.25 14.35 L5.25 10.95 5.15 10.85 M19.95 24.2 L18.55 22.8 22.8 18.55 24.2 19.95 19.95 24.2 M28.45 21.4 L14.3 7.25 10.15 7.3 9.4 6.55 Q8.8 5.95 7.95 6 7.1 5.95 6.5 6.55 5.95 7.1 6 7.95 5.95 8.8 6.55 9.4 L7.25 10.1 7.25 14.35 21.4 28.5 Q22 29.1 22.75 29.1 23.6 29.1 24.2 28.5 L28.45 24.25 Q29.05 23.65 29 22.85 29.05 22 28.45 21.4 M9.25 13.5 L9.25 9.3 13.5 9.25 14.3 10.05 10.05 14.3 9.25 13.5 M17.15 21.4 L11.5 15.75 15.75 11.5 21.4 17.15 17.15 21.4", "M17.15 21.4 L21.4 17.15 15.75 11.5 11.5 15.75 17.15 21.4 M28.45 21.4 Q29.05 22 29 22.85 29.05 23.65 28.45 24.25 L24.2 28.5 Q23.6 29.1 22.75 29.1 22 29.1 21.4 28.5 L7.25 14.35 7.25 10.1 6.55 9.4 Q5.95 8.8 6 7.95 5.95 7.1 6.5 6.55 7.1 5.95 7.95 6 8.8 5.95 9.4 6.55 L10.15 7.3 14.3 7.25 28.45 21.4 M19.95 24.2 L24.2 19.95 22.8 18.55 18.55 22.8 19.95 24.2 M9.25 13.5 L10.05 14.3 14.3 10.05 13.5 9.25 9.25 9.3 9.25 13.5", FLIP_V), 6, 18, "crosshair");
1637
- var CROSSHAIR = svgCursor(kenney("M17 2 Q18.2 2 19.15 2.9 20 3.8 20 5 L20 12 27 12 Q28.2 12 29.15 12.9 30 13.8 30 15 L30 17 Q30 18.2 29.15 19.15 28.2 20 27 20 L20 20 20 27 Q20 28.2 19.15 29.15 18.2 30 17 30 L15 30 Q13.8 30 12.9 29.15 12 28.2 12 27 L12 20 5 20 Q3.8 20 2.9 19.15 2 18.2 2 17 L2 15 Q2 13.8 2.9 12.9 3.8 12 5 12 L12 12 12 5 Q12 3.8 12.9 2.9 13.8 2 15 2 L17 2 M14 27 L14.3 27.7 Q14.6 28 15 28 L17 28 17.7 27.7 18 27 18 18.05 18.05 18 27 18 Q27.4 18 27.7 17.7 L28 17 28 15 27.7 14.3 Q27.4 14 27 14 L18 14 18 5 17.7 4.3 17 4 15 4 Q14.6 4 14.3 4.3 14 4.6 14 5 L14 14 5 14 Q4.6 14 4.3 14.3 4 14.6 4 15 L4 17 Q4 17.4 4.3 17.7 4.6 18 5 18 L14 18 14 27", "M14 27 L14 18 5 18 Q4.6 18 4.3 17.7 4 17.4 4 17 L4 15 Q4 14.6 4.3 14.3 4.6 14 5 14 L14 14 14 5 Q14 4.6 14.3 4.3 14.6 4 15 4 L17 4 17.7 4.3 18 5 18 14 27 14 Q27.4 14 27.7 14.3 L28 15 28 17 27.7 17.7 Q27.4 18 27 18 L18.05 18 18 18.05 18 27 17.7 27.7 17 28 15 28 Q14.6 28 14.3 27.7 L14 27"), 12, 12, "crosshair");
1638
- var ERASER = svgCursor(kenney("M3.9 11.35 Q2.3 12.5 3.7 13.9 L16.4 26.65 Q17.85 28.05 19.45 26.9 L27.65 21.15 Q29.3 20 27.85 18.6 L15.15 5.85 Q13.75 4.45 12.1 5.6 L3.9 11.35 M1.05 12.4 Q1 10.95 2.75 9.75 L10.95 4 10.95 3.95 Q14 1.85 16.6 4.45 L29.3 17.2 Q30.8 18.65 30.55 20.1 30.55 21.55 28.8 22.8 L20.6 28.55 20.65 28.55 Q17.7 30.65 15 28.1 L15 28.05 2.3 15.3 2.3 15.35 Q0.8 13.85 1.05 12.4 M13.5 7 L19.85 13.35 11.65 19.15 5.3 12.75 13.5 7", "M13.5 7 L5.3 12.75 11.65 19.15 19.85 13.35 13.5 7 M3.9 11.35 L12.1 5.6 Q13.75 4.45 15.15 5.85 L27.85 18.6 Q29.3 20 27.65 21.15 L19.45 26.9 Q17.85 28.05 16.4 26.65 L3.7 13.9 Q2.3 12.5 3.9 11.35"), 6, 14, "cell");
1639
- var TEXT = svgCursor(`<svg ${W}><path d='M16 4V28M11 4H21M11 28H21' fill='none' ${HALO} stroke-width='5'/><path d='M16 4V28M11 4H21M11 28H21' fill='none' stroke='${INK}' stroke-width='2.25' stroke-linecap='round'/></svg>`, 12, 12, "text");
1640
- var STICKY = svgCursor(`<svg ${W}><path d='M6 5H21L26 10V27H6Z' fill='${INK}' ${HALO} stroke-width='2.5'/><path d='M21 5V11H26' fill='none' ${HALO} stroke-width='2.25'/></svg>`, 5, 5, "crosshair");
1641
- var TOOL_CURSORS = Object.freeze({
1642
- move: MOVE,
1643
- hand: HAND,
1644
- comment: COMMENT,
1645
- pen: PEN,
1646
- section: CROSSHAIR,
1647
- highlighter: HIGHLIGHTER,
1648
- shape: CROSSHAIR,
1649
- rect: CROSSHAIR,
1650
- ellipse: CROSSHAIR,
1651
- sticky: STICKY,
1652
- arrow: CROSSHAIR,
1653
- text: TEXT,
1654
- eraser: ERASER
1655
- });
1656
-
1657
- // use-tool-mode.tsx
1658
- import { jsx as jsx4, Fragment as Fragment2 } from "react/jsx-runtime";
1659
- var DEFAULT_TOOLS = Object.freeze([
1660
- { id: "move", label: "Move", shortcut: "V", cursor: TOOL_CURSORS.move },
1661
- { id: "hand", label: "Hand", shortcut: "H", cursor: TOOL_CURSORS.hand },
1662
- { id: "comment", label: "Comment", shortcut: "C", cursor: TOOL_CURSORS.comment },
1663
- { id: "pen", label: "Pen", shortcut: "B", cursor: TOOL_CURSORS.pen },
1664
- { id: "highlighter", label: "Highlighter", shortcut: "I", cursor: TOOL_CURSORS.highlighter },
1665
- { id: "shape", label: "Shape", shortcut: "R", cursor: TOOL_CURSORS.shape },
1666
- { id: "sticky", label: "Sticky", shortcut: "N", cursor: TOOL_CURSORS.sticky },
1667
- { id: "section", label: "Section", shortcut: "⇧S", cursor: TOOL_CURSORS.shape },
1668
- { id: "arrow", label: "Arrow", shortcut: "A", cursor: TOOL_CURSORS.arrow },
1669
- { id: "text", label: "Text", shortcut: "T", cursor: TOOL_CURSORS.text },
1670
- { id: "eraser", label: "Eraser", shortcut: "E", cursor: TOOL_CURSORS.eraser }
1671
- ]);
1672
- var ToolContext = createContext3(null);
1673
- function ToolProvider({
1674
- children,
1675
- tools = DEFAULT_TOOLS,
1676
- initial = "move"
1677
- }) {
1678
- const [tool, setToolState] = useState4(initial);
1679
- const [sticky, setSticky] = useState4(() => ({
1680
- tool: null,
1681
- locked: false
1682
- }));
1683
- const setTool = useCallback4((t) => {
1684
- setToolState(t);
1685
- setSticky((prev) => prev.locked && prev.tool === t ? prev : { tool: null, locked: false });
1686
- }, []);
1687
- const toggleSticky = useCallback4((t) => {
1688
- setSticky((prev) => {
1689
- if (prev.locked && prev.tool === t)
1690
- return { tool: null, locked: false };
1691
- return { tool: t, locked: true };
1692
- });
1693
- setToolState(t);
1694
- }, []);
1695
- const clearSticky = useCallback4(() => {
1696
- setSticky({ tool: null, locked: false });
1697
- }, []);
1698
- const [shapeKind, setShapeKind] = useState4("rounded");
1699
- useEffect5(() => {
1700
- if (typeof document === "undefined")
1701
- return;
1702
- const desc = tools.find((t) => t.id === tool);
1703
- if (!desc)
1704
- return;
1705
- const prev = document.body.style.cursor;
1706
- document.body.style.cursor = desc.cursor;
1707
- let styleEl = document.getElementById("dc-tool-cursor");
1708
- if (!styleEl) {
1709
- styleEl = document.createElement("style");
1710
- styleEl.id = "dc-tool-cursor";
1711
- document.head.appendChild(styleEl);
1712
- }
1713
- styleEl.textContent = `* { cursor: ${desc.cursor} !important; }`;
1714
- if (typeof window !== "undefined" && window.parent && window.parent !== window) {
1715
- try {
1716
- window.parent.postMessage({ dgn: "tool-cursor", tool }, "*");
1717
- } catch {}
1718
- }
1719
- return () => {
1720
- document.body.style.cursor = prev;
1721
- const el = document.getElementById("dc-tool-cursor");
1722
- if (el)
1723
- el.textContent = "";
1724
- };
1725
- }, [tool, tools]);
1726
- const value = useMemo4(() => ({ tool, setTool, tools, sticky, toggleSticky, clearSticky, shapeKind, setShapeKind }), [tool, setTool, tools, sticky, toggleSticky, clearSticky, shapeKind]);
1727
- return /* @__PURE__ */ jsx4(ToolContext.Provider, {
1728
- value,
1729
- children
1730
- });
1731
- }
1732
- function MaybeToolProvider({ children }) {
1733
- const outer = useContext3(ToolContext);
1734
- if (outer)
1735
- return /* @__PURE__ */ jsx4(Fragment2, {
1736
- children
1737
- });
1738
- return /* @__PURE__ */ jsx4(ToolProvider, {
1739
- children
1740
- });
1741
- }
1742
- function useToolMode() {
1743
- const ctx = useContext3(ToolContext);
1744
- if (!ctx) {
1745
- throw new Error("useToolMode must be used inside <ToolProvider>");
1746
- }
1747
- return ctx;
1748
- }
1749
-
1750
- // canvas-comment-mount.tsx
1751
- import { jsx as jsx5, jsxs as jsxs2 } from "react/jsx-runtime";
1752
- var COMMENT_CLAIMS = new Set([
1753
- "drop-comment",
1754
- "tool",
1755
- "escape",
1756
- "hover"
1757
- ]);
1758
- function isBareSpecimen() {
1759
- return typeof document !== "undefined" && !document.querySelector(".dc-canvas");
1760
- }
1761
- function pickSpecimenEl(clientX, clientY) {
1762
- if (typeof document === "undefined")
1763
- return null;
1764
- const hit = document.elementFromPoint(clientX, clientY);
1765
- if (!hit)
1766
- return null;
1767
- if (hit.closest(".cm-composer, .cm-thread, .cm-mention-popup, .cm-pin, [data-mc-hover-halo]")) {
1768
- return null;
1769
- }
1770
- const tag = hit.tagName;
1771
- if (tag === "HTML" || tag === "BODY")
1772
- return null;
1773
- return hit;
1774
- }
1775
- function CommentHost({ children, file }) {
1776
- const { tool, setTool } = useToolMode();
1777
- const selSet = useSelectionSet();
1778
- const hostRef = useRef4(null);
1779
- const [hoverEl, setHoverEl] = useState5(null);
1780
- const toolRef = useRef4(tool);
1781
- toolRef.current = tool;
1782
- const getActiveTool = useMemo5(() => () => toolRef.current, []);
1783
- useEffect6(() => {
1784
- if (tool !== "comment")
1785
- setHoverEl(null);
1786
- }, [tool]);
1787
- useEffect6(() => {
1788
- const host = hostRef.current;
1789
- if (host)
1790
- host.setAttribute("data-active-tool", tool);
1791
- if (typeof document !== "undefined" && document.body) {
1792
- document.body.setAttribute("data-active-tool", tool);
1793
- }
1794
- return () => {
1795
- host?.removeAttribute("data-active-tool");
1796
- };
1797
- }, [tool]);
1798
- useEffect6(() => {
1799
- if (typeof window === "undefined")
1800
- return;
1801
- const onMessage = (e) => {
1802
- const m = e.data;
1803
- if (!m || typeof m !== "object" || m.dgn !== "tool-set")
1804
- return;
1805
- if (typeof m.tool === "string")
1806
- setTool(m.tool);
1807
- };
1808
- window.addEventListener("message", onMessage);
1809
- return () => window.removeEventListener("message", onMessage);
1810
- }, [setTool]);
1811
- useInputRouter({
1812
- hostRef,
1813
- getActiveTool,
1814
- claimableActions: COMMENT_CLAIMS,
1815
- callbacks: {
1816
- onHover: ({ clientX, clientY }) => {
1817
- if (toolRef.current !== "comment" || !isBareSpecimen()) {
1818
- setHoverEl(null);
1819
- return;
1820
- }
1821
- const el = pickSpecimenEl(clientX, clientY);
1822
- setHoverEl((prev) => prev === el ? prev : el);
1823
- },
1824
- onTool: ({ tool: t }) => setTool(t),
1825
- onEscape: () => {
1826
- if (toolRef.current !== "move")
1827
- setTool("move");
1828
- setHoverEl(null);
1829
- selSet.clear();
1830
- if (typeof window !== "undefined") {
1831
- try {
1832
- window.parent.postMessage({ dgn: "force-clear" }, "*");
1833
- } catch {}
1834
- }
1835
- },
1836
- onDropComment: ({ clientX, clientY }) => dropComment(clientX, clientY, selSet, file)
1837
- }
1838
- });
1839
- return /* @__PURE__ */ jsxs2("div", {
1840
- "data-mc-host": true,
1841
- ref: hostRef,
1842
- style: { display: "contents" },
1843
- children: [
1844
- children,
1845
- hoverEl ? /* @__PURE__ */ jsx5(MountHoverHalo, {
1846
- el: hoverEl
1847
- }) : null,
1848
- /* @__PURE__ */ jsx5(CommentsOverlay, {})
1849
- ]
1850
- });
1851
- }
1852
- function MountHoverHalo({ el }) {
1853
- const ref = useRef4(null);
1854
- const targetRef = useRef4(el);
1855
- targetRef.current = el;
1856
- const rafRef = useRef4(null);
1857
- useEffect6(() => {
1858
- const tick = () => {
1859
- rafRef.current = null;
1860
- const div = ref.current;
1861
- const t = targetRef.current;
1862
- if (div && t?.isConnected) {
1863
- const r = t.getBoundingClientRect();
1864
- if (r.width === 0 && r.height === 0) {
1865
- div.style.display = "none";
1866
- } else {
1867
- div.style.display = "block";
1868
- div.style.left = `${Math.round(r.left)}px`;
1869
- div.style.top = `${Math.round(r.top)}px`;
1870
- div.style.width = `${Math.round(r.width)}px`;
1871
- div.style.height = `${Math.round(r.height)}px`;
1872
- }
1873
- } else if (div) {
1874
- div.style.display = "none";
1875
- }
1876
- rafRef.current = requestAnimationFrame(tick);
1877
- };
1878
- rafRef.current = requestAnimationFrame(tick);
1879
- return () => {
1880
- if (rafRef.current != null)
1881
- cancelAnimationFrame(rafRef.current);
1882
- };
1883
- }, []);
1884
- return /* @__PURE__ */ jsx5("div", {
1885
- ref,
1886
- "aria-hidden": "true",
1887
- "data-mc-hover-halo": "",
1888
- style: {
1889
- position: "fixed",
1890
- display: "none",
1891
- pointerEvents: "none",
1892
- zIndex: 2147483646,
1893
- border: "2px solid var(--maude-hud-accent, #d63b1f)",
1894
- borderRadius: "3px",
1895
- boxSizing: "border-box"
1896
- }
1897
- });
1898
- }
1899
- function dropComment(clientX, clientY, selSet, file) {
1900
- if (typeof document === "undefined")
1901
- return;
1902
- let target = resolveHoverTarget(document, clientX, clientY, { deep: true });
1903
- if (!target)
1904
- target = resolveHoverTarget(document, clientX, clientY, { deep: false });
1905
- if (!target && !isBareSpecimen() && typeof document.elementsFromPoint === "function") {
1906
- const stack = document.elementsFromPoint(clientX, clientY);
1907
- for (const candidate of stack) {
1908
- const stamped = candidate.closest?.("[data-cd-id]");
1909
- if (!stamped)
1910
- continue;
1911
- if (!stamped.closest(".dc-artboard-body"))
1912
- continue;
1913
- const artboardEl = stamped.closest("[data-dc-screen]");
1914
- target = {
1915
- el: stamped,
1916
- cdId: stamped.getAttribute("data-cd-id"),
1917
- artboardId: artboardEl?.getAttribute("data-dc-screen") ?? null
1918
- };
1919
- break;
1920
- }
1921
- }
1922
- if (!target && isBareSpecimen()) {
1923
- const el = pickSpecimenEl(clientX, clientY);
1924
- if (el)
1925
- target = { el, cdId: el.getAttribute("data-cd-id"), artboardId: null };
1926
- }
1927
- if (!target) {
1928
- const floatingSel = {
1929
- file,
1930
- id: undefined,
1931
- selector: "",
1932
- artboardId: null,
1933
- tag: "",
1934
- classes: "",
1935
- text: "",
1936
- dom_path: [],
1937
- bounds: { x: clientX - 12, y: clientY - 12, w: 24, h: 24 },
1938
- html: ""
1939
- };
1940
- openComposer(floatingSel, clientX, clientY);
1941
- return;
1942
- }
1943
- const sel = hoverTargetToSelection(target, file);
1944
- selSet.replace(sel);
1945
- openComposer(sel, clientX, clientY);
1946
- }
1947
- function openComposer(selection, clientX, clientY) {
1948
- if (typeof document !== "undefined") {
1949
- try {
1950
- document.dispatchEvent(new CustomEvent("cm:open-composer", { detail: { selection, clientX, clientY } }));
1951
- } catch {}
1952
- }
1953
- if (typeof window !== "undefined") {
1954
- try {
1955
- window.parent.postMessage({ dgn: "comment-compose", selection }, "*");
1956
- } catch {}
1957
- }
1958
- }
1959
- function buildCanvasTree(Canvas, file) {
1960
- return createElement(MaybeToolProvider, null, createElement(MaybeSelectionSetProvider, null, createElement(CommentHost, { file }, createElement(Canvas))));
1961
- }
1962
- function mountCanvas(Canvas, opts) {
1963
- const root = createRoot(opts.rootEl);
1964
- if (!opts.commentsEnabled) {
1965
- root.render(createElement(Canvas));
1966
- return;
1967
- }
1968
- const file = opts.file ?? deriveFile2();
1969
- root.render(createElement(CanvasHmrRuntime, { initialCanvas: Canvas, file }));
1970
- }
1971
- var RUNTIME_KEY = "__maudeCanvasRuntime";
1972
- function OkSignal({
1973
- Canvas,
1974
- file,
1975
- onOk
1976
- }) {
1977
- useEffect6(() => {
1978
- onOk();
1979
- }, []);
1980
- return buildCanvasTree(Canvas, file);
1981
- }
1982
-
1983
- class CanvasErrorBoundary extends Component {
1984
- state = { hasError: false };
1985
- static getDerivedStateFromError() {
1986
- return { hasError: true };
1987
- }
1988
- componentDidCatch() {
1989
- this.props.onError();
1990
- }
1991
- componentDidUpdate(prev) {
1992
- if (prev.attempt !== this.props.attempt && this.state.hasError) {
1993
- this.setState({ hasError: false });
1994
- }
1995
- }
1996
- render() {
1997
- if (this.state.hasError)
1998
- return this.props.fallback();
1999
- return this.props.children;
2000
- }
2001
- }
2002
- function HmrHoldingToast({ message }) {
2003
- return createElement("div", {
2004
- className: "dc-hmr-holding",
2005
- role: "status",
2006
- "aria-live": "polite",
2007
- title: message ? `Holding last working render — ${message}` : "Holding last working render"
2008
- }, "⏸ build error — držím poslední funkční verzi");
2009
- }
2010
- function CanvasHmrRuntime({
2011
- initialCanvas,
2012
- file
2013
- }) {
2014
- const [{ canvas, attempt }, setCanvasState] = useState5({ canvas: initialCanvas, attempt: 0 });
2015
- const [holding, setHoldingState] = useState5({ on: false });
2016
- const lastGood = useRef4(null);
2017
- const canvasRef = useRef4(canvas);
2018
- canvasRef.current = canvas;
2019
- useEffect6(() => {
2020
- const api = {
2021
- remount: (next) => setCanvasState((s) => ({ canvas: next, attempt: s.attempt + 1 })),
2022
- setHolding: (on, message) => setHoldingState(on ? { on: true, message } : { on: false })
2023
- };
2024
- window[RUNTIME_KEY] = api;
2025
- return () => {
2026
- window[RUNTIME_KEY] = undefined;
2027
- };
2028
- }, []);
2029
- const handleOk = useCallback5(() => {
2030
- lastGood.current = canvasRef.current;
2031
- setHoldingState((h) => h.on ? { on: false } : h);
2032
- }, []);
2033
- const handleError = useCallback5(() => {
2034
- setHoldingState({ on: true, message: "render error" });
2035
- }, []);
2036
- const fallback = useCallback5(() => {
2037
- const LG = lastGood.current;
2038
- return LG ? buildCanvasTree(LG, file) : null;
2039
- }, [file]);
2040
- return createElement(Fragment3, null, createElement(CanvasErrorBoundary, { attempt, onError: handleError, fallback }, createElement(OkSignal, { key: attempt, Canvas: canvas, file, onOk: handleOk })), holding.on ? createElement(HmrHoldingToast, { message: holding.message }) : null);
2041
- }
2042
- export {
2043
- mountCanvas,
2044
- CanvasErrorBoundary
2045
- };
2046
-
2047
- //# debugId=0F835BAF67B3DCC664756E2164756E21
2048
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY2FudmFzLWNvbW1lbnQtbW91bnQudHN4IiwgIi4uL2NvbW1lbnRzLW92ZXJsYXkudHN4IiwgIi4uL3VzZS1jb2xsYWIudHN4IiwgIi4uL3VzZS1zZWxlY3Rpb24tc2V0LnRzeCIsICIuLi9kb20tc2VsZWN0aW9uLnRzIiwgIi4uL2lucHV0LXJvdXRlci50c3giLCAiLi4vdXNlLXRvb2wtbW9kZS50c3giLCAiLi4vY2FudmFzLWN1cnNvcnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiLyoqXG4gKiBAZmlsZSAgICAgICBjYW52YXMtY29tbWVudC1tb3VudC50c3gg4oCUIHNoZWxsLW93bmVkIGNvbW1lbnQgbGF5ZXIgKyBtb3VudENhbnZhc1xuICogQHNjb3BlICAgICAgYXBwcy9zdHVkaW8vY2FudmFzLWNvbW1lbnQtbW91bnQudHN4XG4gKiBAcHVycG9zZSAgICBUaGUgY2FudmFzIG1vdW50IGhhcm5lc3MgKGBfc2hlbGwuaHRtbGApIGNhbGxzIGBtb3VudENhbnZhc2BcbiAqICAgICAgICAgICAgIGluc3RlYWQgb2YgcmVuZGVyaW5nIHRoZSBjYW52YXMgZGVmYXVsdC1leHBvcnQgcmF3LiBtb3VudENhbnZhc1xuICogICAgICAgICAgICAgd3JhcHMgQU5ZIGRlZmF1bHQgZXhwb3J0IOKAlCBhIGBEZXNpZ25DYW52YXNgIFVJIGNhbnZhcyBPUiBhIGJhcmVcbiAqICAgICAgICAgICAgIERTIHNwZWNpbWVuIOKAlCBpbiBhIExJVEUgY29tbWVudCBwcm92aWRlciB0cmVlIHNvIHRoZSBpbi1wbGFjZVxuICogICAgICAgICAgICAgY29tbWVudCB0b29sIHdvcmtzIG9uIGV2ZXJ5IG1vdW50ZWQgc3VyZmFjZS5cbiAqXG4gKiBXaHkgYSBzaW5nbGUgc2hlbGwtb3duZWQgbGF5ZXIgKEREUiDigJQgc2VlIHBsYW4gwqdcIktleSBkZWNpc2lvblwiKTpcbiAqICAgLSBDb21tZW50cyB1c2VkIHRvIGJlIG1vdW50ZWQgb25seSBieSBgRGVzaWduQ2FudmFzYCAoVG9vbFByb3ZpZGVyICtcbiAqICAgICBTZWxlY3Rpb25TZXRQcm92aWRlciArIENvbW1lbnRzT3ZlcmxheSArIHRoZSBvbkRyb3BDb21tZW50IHJvdXRlclxuICogICAgIGJyYW5jaCkuIEJhcmUgc3BlY2ltZW5zIChgc3lzdGVtLzxkcz4vcHJldmlldy8qLnRzeGApIG5ldmVyIHJlbmRlclxuICogICAgIERlc2lnbkNhbnZhcywgc28gdGhleSBoYWQgbm8gY29tbWVudCB0b29sIGF0IGFsbC5cbiAqICAgLSBIb2lzdGluZyB0aGUgY29tbWVudCBzdWJzeXN0ZW0gaGVyZSBtYWtlcyBpdCB1bml2ZXJzYWwuIGBEZXNpZ25DYW52YXNgXG4gKiAgICAgYmVjb21lcyBhIENPTlNVTUVSIG9mIHRoZSBzaGVsbC1wcm92aWRlZCBUb29sUHJvdmlkZXIgLyBTZWxlY3Rpb25TZXQgL1xuICogICAgIENvbW1lbnRzT3ZlcmxheSAodmlhIE1heWJlVG9vbFByb3ZpZGVyIC8gTWF5YmVTZWxlY3Rpb25TZXRQcm92aWRlciBhbmRcbiAqICAgICBieSBkcm9wcGluZyBpdHMgb3duIDxDb21tZW50c092ZXJsYXkvPikuXG4gKlxuICogQ29leGlzdGVuY2Ugd2l0aCB0aGUgVUktY2FudmFzIHJvdXRlcjogdGhpcyBsYXllcidzIGlucHV0IHJvdXRlciBpcyBhblxuICogQU5DRVNUT1IgY2FwdHVyZS1saXN0ZW5lciBvdmVyIHRoZSBjYW52YXMuIE9uIGEgVUkgY2FudmFzLCBgQ2FudmFzU2hlbGxgXG4gKiBzdGlsbCBydW5zIGl0cyBPV04gcm91dGVyIChob3ZlciAvIHNlbGVjdCAvIGNvbnRleHQtbWVudSAvIHVuZG8pLiBUbyBhdm9pZFxuICogc3dhbGxvd2luZyB0aG9zZSBnZXN0dXJlcywgdGhpcyByb3V0ZXIgcGFzc2VzIGEgbmFycm93IGBjbGFpbWFibGVBY3Rpb25zYFxuICogYWxsb3dsaXN0IOKAlCBgZHJvcC1jb21tZW50YCAvIGB0b29sYCAvIGBlc2NhcGVgIC8gYGhvdmVyYC4gYGhvdmVyYCBuZXZlclxuICogcHJldmVudERlZmF1bHRzIHNvIHRoZSBpbm5lciByb3V0ZXIncyBoYWxvIGlzIHVuYWZmZWN0ZWQ7IGV2ZXJ5dGhpbmcgZWxzZVxuICogKHNlbGVjdCAvIGNvbnRleHQtbWVudSAvIHVuZG8pIHByb3BhZ2F0ZXMgdW50b3VjaGVkIHRvIHRoZSBpbm5lciByb3V0ZXIuXG4gKi9cblxuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICB0eXBlIENvbXBvbmVudFR5cGUsXG4gIGNyZWF0ZUVsZW1lbnQsXG4gIEZyYWdtZW50LFxuICB0eXBlIFJlYWN0Tm9kZSxcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUVmZmVjdCxcbiAgdXNlTWVtbyxcbiAgdXNlUmVmLFxuICB1c2VTdGF0ZSxcbn0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY3JlYXRlUm9vdCB9IGZyb20gJ3JlYWN0LWRvbS9jbGllbnQnO1xuXG5pbXBvcnQgeyBDb21tZW50c092ZXJsYXkgfSBmcm9tICcuL2NvbW1lbnRzLW92ZXJsYXkudHN4JztcbmltcG9ydCB7IGRlcml2ZUZpbGUsIGhvdmVyVGFyZ2V0VG9TZWxlY3Rpb24gfSBmcm9tICcuL2RvbS1zZWxlY3Rpb24udHMnO1xuaW1wb3J0IHsgdHlwZSBSb3V0ZXJBY3Rpb24sIHJlc29sdmVIb3ZlclRhcmdldCwgdXNlSW5wdXRSb3V0ZXIgfSBmcm9tICcuL2lucHV0LXJvdXRlci50c3gnO1xuaW1wb3J0IHtcbiAgTWF5YmVTZWxlY3Rpb25TZXRQcm92aWRlcixcbiAgdHlwZSBTZWxlY3Rpb24sXG4gIHVzZVNlbGVjdGlvblNldCxcbn0gZnJvbSAnLi91c2Utc2VsZWN0aW9uLXNldC50c3gnO1xuaW1wb3J0IHsgTWF5YmVUb29sUHJvdmlkZXIsIHVzZVRvb2xNb2RlIH0gZnJvbSAnLi91c2UtdG9vbC1tb2RlLnRzeCc7XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gUGhhc2UgMjQg4oCUIHRoZSBjb21tZW50LW1vZGUgY3Vyc29yIChhbmQgZXZlcnkgb3RoZXIgdG9vbCBjdXJzb3IpIGlzIG93bmVkXG4vLyBTT0xFTFkgYnkgdXNlLXRvb2wtbW9kZS50c3gsIHdob3NlIGAqIHsgY3Vyc29yOiA8S2VubmV5IGdseXBoPiAhaW1wb3J0YW50IH1gXG4vLyBydWxlIGlzIGluamVjdGVkIGJ5IHRoZSBUb29sUHJvdmlkZXIgdGhpcyBsYXllciBtb3VudHMgKE1heWJlVG9vbFByb3ZpZGVyKSDigJRcbi8vIHNvIGl0IGNvdmVycyBiYXJlIERTIHNwZWNpbWVucyB0b28uIFRoZSBvbGQgYFtkYXRhLW1jLWhvc3Rd4oCmYC9gYm9keVvigKZdYFxuLy8gY29tbWVudC1jdXJzb3IgcnVsZSB1c2VkIHRvIGxpdmUgaGVyZSwgYnV0IGl0cyBoaWdoZXIgc3BlY2lmaWNpdHkgc2hhZG93ZWRcbi8vIHRoZSB1bmlmaWVkIEtlbm5leSBjdXJzb3Igb24gVUkgY2FudmFzZXMgKGNvbW1lbnQtbW91bnQgc3RhbXBzXG4vLyBgZGF0YS1hY3RpdmUtdG9vbGAgb24gPGJvZHk+LCBzbyBgYm9keVtkYXRhLWFjdGl2ZS10b29sPVwiY29tbWVudFwiXSAqYCBtYXRjaGVkXG4vLyB0aGVyZSBhcyB3ZWxsKS4gUmVtb3ZlZCBzbyB0aGUgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCB3aW5zLiBTZWUgRERSLTA2Ny5cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBDb21tZW50SG9zdCDigJQgb3ducyB0aGUgbGl0ZSBjb21tZW50IHN1YnN5c3RlbTogdGhlIGlucHV0IHJvdXRlciAoY29tbWVudC1cbi8vIHNjb3BlZCksIHRoZSBzaW5nbGUgQ29tbWVudHNPdmVybGF5LCB0aGUgY29tbWVudC1tb2RlIGN1cnNvciBhdHRyaWJ1dGUsIGFuZFxuLy8gdGhlIHBhcmVudCBgZGduOid0b29sLXNldCdgIGxpc3RlbmVyIChzbyB0aGUgb3V0ZXIgbWVudWJhciBjb21tZW50IHRvZ2dsZVxuLy8gcmVhY2hlcyB0aGUgaWZyYW1lKS5cblxuLy8gT25seSB0aGVzZSBhY3Rpb24ga2luZHMgYXJlIGNsYWltZWQgYnkgdGhlIG1vdW50LWxheWVyIHJvdXRlcjsgdGhlIHJlc3Rcbi8vIHByb3BhZ2F0ZSB0byBhIFVJIGNhbnZhcydzIG93biByb3V0ZXIuIGB0b29sYCArIGBlc2NhcGVgIGFyZSBhbHNvIGhhbmRsZWQgYnlcbi8vIHRoZSBpbm5lciByb3V0ZXIgb24gVUkgY2FudmFzZXMg4oCUIGlkZW1wb3RlbnQgKHNhbWUgc2hhcmVkIHByb3ZpZGVyKS4gYGhvdmVyYFxuLy8gaXMgZGlzcGF0Y2hlZCB0b28gKGl0IG5ldmVyIHByZXZlbnREZWZhdWx0cywgc28gdGhlIGlubmVyIHJvdXRlcidzIG93biBob3ZlclxuLy8gaGFsbyBvbiBhIFVJIGNhbnZhcyBpcyB1bmFmZmVjdGVkKSDigJQgd2Ugb25seSBQQUlOVCB0aGUgbW91bnQtbGF5ZXIgcHJldmlld1xuLy8gaGFsbyBvbiBhIGJhcmUgc3BlY2ltZW4sIHdoZXJlIHRoZXJlIGlzIG5vIGlubmVyIENhbnZhc1NoZWxsIGhhbG8uXG5jb25zdCBDT01NRU5UX0NMQUlNUzogUmVhZG9ubHlTZXQ8Um91dGVyQWN0aW9uWydraW5kJ10+ID0gbmV3IFNldDxSb3V0ZXJBY3Rpb25bJ2tpbmQnXT4oW1xuICAnZHJvcC1jb21tZW50JyxcbiAgJ3Rvb2wnLFxuICAnZXNjYXBlJyxcbiAgJ2hvdmVyJyxcbl0pO1xuXG4vLyBUcnVlIHdoZW4gbm8gRGVzaWduQ2FudmFzL0NhbnZhc1NoZWxsIGlzIG1vdW50ZWQgb24gdGhpcyBzdXJmYWNlIOKAlCBpLmUuIGFcbi8vIGJhcmUgRFMgc3BlY2ltZW4uIE9uIGEgVUkgY2FudmFzIChgLmRjLWNhbnZhc2AgcHJlc2VudCkgdGhlIGlubmVyIHNoZWxsIG93bnNcbi8vIGhvdmVyLWhhbG8gcGFpbnRpbmcgKyBgcmVzb2x2ZUhvdmVyVGFyZ2V0YCBlbGVtZW50IGFuY2hvcmluZywgc28gdGhlIGxpdGVcbi8vIGxheWVyIGRlZmVycyB0byBpdC5cbmZ1bmN0aW9uIGlzQmFyZVNwZWNpbWVuKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiAhZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmRjLWNhbnZhcycpO1xufVxuXG4vLyBEZWVwZXN0IG5vbi1jaHJvbWUgZWxlbWVudCB1bmRlciBhIHBvaW50IOKAlCB0aGUgY29tbWVudCBhbmNob3IgZm9yIGEgYmFyZVxuLy8gc3BlY2ltZW4gKHNwZWNpbWVucyBhcmVuJ3Qgc3RhbXBlZCB3aXRoIGBkYXRhLWNkLWlkYCBhbmQgaGF2ZSBub1xuLy8gYC5kYy1hcnRib2FyZC1ib2R5YCwgc28gYHJlc29sdmVIb3ZlclRhcmdldGAgcmV0dXJucyBudWxsIGZvciB0aGVtKS5cbmZ1bmN0aW9uIHBpY2tTcGVjaW1lbkVsKGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiBudWxsO1xuICBjb25zdCBoaXQgPSBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KGNsaWVudFgsIGNsaWVudFkpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgaWYgKCFoaXQpIHJldHVybiBudWxsO1xuICAvLyBOZXZlciBhbmNob3IgdG8gY29tbWVudCBjaHJvbWUgb3IgdGhlIGRvY3VtZW50IHJvb3QuXG4gIGlmIChoaXQuY2xvc2VzdCgnLmNtLWNvbXBvc2VyLCAuY20tdGhyZWFkLCAuY20tbWVudGlvbi1wb3B1cCwgLmNtLXBpbiwgW2RhdGEtbWMtaG92ZXItaGFsb10nKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHRhZyA9IGhpdC50YWdOYW1lO1xuICBpZiAodGFnID09PSAnSFRNTCcgfHwgdGFnID09PSAnQk9EWScpIHJldHVybiBudWxsO1xuICByZXR1cm4gaGl0O1xufVxuXG5mdW5jdGlvbiBDb21tZW50SG9zdCh7IGNoaWxkcmVuLCBmaWxlIH06IHsgY2hpbGRyZW46IFJlYWN0Tm9kZTsgZmlsZTogc3RyaW5nIHwgdW5kZWZpbmVkIH0pIHtcbiAgY29uc3QgeyB0b29sLCBzZXRUb29sIH0gPSB1c2VUb29sTW9kZSgpO1xuICBjb25zdCBzZWxTZXQgPSB1c2VTZWxlY3Rpb25TZXQoKTtcbiAgY29uc3QgaG9zdFJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudCB8IG51bGw+KG51bGwpO1xuICAvLyBIb3Zlci1wcmV2aWV3IGhhbG8gdGFyZ2V0IChiYXJlIHNwZWNpbWVucyBvbmx5IOKAlCBzZWUgaXNCYXJlU3BlY2ltZW4pLlxuICBjb25zdCBbaG92ZXJFbCwgc2V0SG92ZXJFbF0gPSB1c2VTdGF0ZTxIVE1MRWxlbWVudCB8IG51bGw+KG51bGwpO1xuXG4gIC8vIExhdGVzdCB0b29sIGZvciB0aGUgcm91dGVyIChyZWFkIGF0IGV2ZW50IHRpbWUsIG5vdCBjYXB0dXJlZCkuXG4gIGNvbnN0IHRvb2xSZWYgPSB1c2VSZWYodG9vbCk7XG4gIHRvb2xSZWYuY3VycmVudCA9IHRvb2w7XG4gIGNvbnN0IGdldEFjdGl2ZVRvb2wgPSB1c2VNZW1vKCgpID0+ICgpID0+IHRvb2xSZWYuY3VycmVudCwgW10pO1xuXG4gIC8vIERyb3AgdGhlIHByZXZpZXcgaGFsbyB3aGVuZXZlciB3ZSBsZWF2ZSBjb21tZW50IG1vZGUuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHRvb2wgIT09ICdjb21tZW50Jykgc2V0SG92ZXJFbChudWxsKTtcbiAgfSwgW3Rvb2xdKTtcblxuICAvLyBSZWZsZWN0IHRoZSBhY3RpdmUgdG9vbCBvbnRvIHRoZSBob3N0IChhbmQgYm9keSwgc2luY2UgdGhlIGhvc3QgaXNcbiAgLy8gZGlzcGxheTpjb250ZW50cyBhbmQgY2FuJ3QgY2FycnkgYSBwYWludGFibGUgY3Vyc29yKS4gQ29tbWVudC1tb2RlIENTU1xuICAvLyBrZXlzIG9mZiBgW2RhdGEtYWN0aXZlLXRvb2w9XCJjb21tZW50XCJdYC5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBob3N0ID0gaG9zdFJlZi5jdXJyZW50O1xuICAgIGlmIChob3N0KSBob3N0LnNldEF0dHJpYnV0ZSgnZGF0YS1hY3RpdmUtdG9vbCcsIHRvb2wpO1xuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LmJvZHkpIHtcbiAgICAgIGRvY3VtZW50LmJvZHkuc2V0QXR0cmlidXRlKCdkYXRhLWFjdGl2ZS10b29sJywgdG9vbCk7XG4gICAgfVxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBob3N0Py5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtYWN0aXZlLXRvb2wnKTtcbiAgICB9O1xuICB9LCBbdG9vbF0pO1xuXG4gIC8vIFBhcmVudCBgZGduOid0b29sLXNldCdgIOKAlCB0aGUgb3V0ZXIgZGV2LXNlcnZlciBtZW51YmFyIHBvc3RzIHRoaXMgd2hlbiB0aGVcbiAgLy8gdXNlciB0b2dnbGVzIHRoZSBjb21tZW50IHRvb2wuIE1pcnJvcnMgY2FudmFzLXNoZWxsJ3MgbGlzdGVuZXIgc28gdGhlXG4gIC8vIHRvZ2dsZSByZWFjaGVzIGJhcmUgc3BlY2ltZW5zIHRvbyAod2hpY2ggaGF2ZSBubyBpbm5lciBzaGVsbCBsaXN0ZW5lcikuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG4gICAgY29uc3Qgb25NZXNzYWdlID0gKGU6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgICAgY29uc3QgbSA9IGUuZGF0YSBhcyB7IGRnbj86IHN0cmluZzsgdG9vbD86IHN0cmluZyB9IHwgbnVsbDtcbiAgICAgIGlmICghbSB8fCB0eXBlb2YgbSAhPT0gJ29iamVjdCcgfHwgbS5kZ24gIT09ICd0b29sLXNldCcpIHJldHVybjtcbiAgICAgIGlmICh0eXBlb2YgbS50b29sID09PSAnc3RyaW5nJykgc2V0VG9vbChtLnRvb2wgYXMgbmV2ZXIpO1xuICAgIH07XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBvbk1lc3NhZ2UpO1xuICAgIHJldHVybiAoKSA9PiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIG9uTWVzc2FnZSk7XG4gIH0sIFtzZXRUb29sXSk7XG5cbiAgdXNlSW5wdXRSb3V0ZXIoe1xuICAgIGhvc3RSZWYsXG4gICAgZ2V0QWN0aXZlVG9vbCxcbiAgICBjbGFpbWFibGVBY3Rpb25zOiBDT01NRU5UX0NMQUlNUyxcbiAgICBjYWxsYmFja3M6IHtcbiAgICAgIG9uSG92ZXI6ICh7IGNsaWVudFgsIGNsaWVudFkgfSkgPT4ge1xuICAgICAgICAvLyBQYWludCBhIHByZXZpZXcgaGFsbyBvbmx5IG9uIGJhcmUgc3BlY2ltZW5zOyBhIFVJIGNhbnZhcydzIG93blxuICAgICAgICAvLyBDYW52YXNTaGVsbCBIb3ZlckhhbG8gb3ducyB0aGUgY29tbWVudC1tb2RlIHByZXZpZXcgdGhlcmUuXG4gICAgICAgIGlmICh0b29sUmVmLmN1cnJlbnQgIT09ICdjb21tZW50JyB8fCAhaXNCYXJlU3BlY2ltZW4oKSkge1xuICAgICAgICAgIHNldEhvdmVyRWwobnVsbCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVsID0gcGlja1NwZWNpbWVuRWwoY2xpZW50WCwgY2xpZW50WSk7XG4gICAgICAgIHNldEhvdmVyRWwoKHByZXYpID0+IChwcmV2ID09PSBlbCA/IHByZXYgOiBlbCkpO1xuICAgICAgfSxcbiAgICAgIG9uVG9vbDogKHsgdG9vbDogdCB9KSA9PiBzZXRUb29sKHQpLFxuICAgICAgb25Fc2NhcGU6ICgpID0+IHtcbiAgICAgICAgaWYgKHRvb2xSZWYuY3VycmVudCAhPT0gJ21vdmUnKSBzZXRUb29sKCdtb3ZlJyk7XG4gICAgICAgIHNldEhvdmVyRWwobnVsbCk7XG4gICAgICAgIHNlbFNldC5jbGVhcigpO1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZSh7IGRnbjogJ2ZvcmNlLWNsZWFyJyB9LCAnKicpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLyogcGFyZW50IGRldGFjaGVkICovXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgb25Ecm9wQ29tbWVudDogKHsgY2xpZW50WCwgY2xpZW50WSB9KSA9PiBkcm9wQ29tbWVudChjbGllbnRYLCBjbGllbnRZLCBzZWxTZXQsIGZpbGUpLFxuICAgIH0sXG4gIH0pO1xuXG4gIC8vIGBkaXNwbGF5OiBjb250ZW50c2Aga2VlcHMgdGhlIHNwZWNpbWVuJ3Mgb3duIGZsZXgvZ3JpZCBsYXlvdXQgYnl0ZS1cbiAgLy8gaWRlbnRpY2FsIOKAlCB0aGUgaG9zdCBib3ggY29udHJpYnV0ZXMgbm90aGluZyB0byBsYXlvdXQuIFRoZSBmaXhlZC1wb3NpdGlvblxuICAvLyBDb21tZW50c092ZXJsYXkgcmVuZGVycyBmaW5lIGFzIGEgY2hpbGQgcmVnYXJkbGVzcy5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGRhdGEtbWMtaG9zdCByZWY9e2hvc3RSZWZ9IHN0eWxlPXt7IGRpc3BsYXk6ICdjb250ZW50cycgfX0+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgICB7aG92ZXJFbCA/IDxNb3VudEhvdmVySGFsbyBlbD17aG92ZXJFbH0gLz4gOiBudWxsfVxuICAgICAgPENvbW1lbnRzT3ZlcmxheSAvPlxuICAgIDwvZGl2PlxuICApO1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIE1vdW50SG92ZXJIYWxvIOKAlCBmaXhlZC1wb3NpdGlvbiBvdXRsaW5lIHRyYWNraW5nIHRoZSBob3ZlcmVkIGVsZW1lbnQncyBzY3JlZW5cbi8vIGJvdW5kcyB2aWEgckFGLiBJbmxpbmUtc3R5bGVkIChubyBkZXBlbmRlbmN5IG9uIGNhbnZhcy1saWIncyBIQUxPX0NTUywgd2hpY2hcbi8vIGEgYmFyZSBzcGVjaW1lbiBkb2Vzbid0IGxvYWQpLiBNaXJyb3JzIGNhbnZhcy1zaGVsbCdzIEhvdmVySGFsbyB2aXN1YWxseS5cblxuZnVuY3Rpb24gTW91bnRIb3ZlckhhbG8oeyBlbCB9OiB7IGVsOiBIVE1MRWxlbWVudCB9KSB7XG4gIGNvbnN0IHJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudCB8IG51bGw+KG51bGwpO1xuICBjb25zdCB0YXJnZXRSZWYgPSB1c2VSZWY8SFRNTEVsZW1lbnQ+KGVsKTtcbiAgdGFyZ2V0UmVmLmN1cnJlbnQgPSBlbDtcbiAgY29uc3QgcmFmUmVmID0gdXNlUmVmPG51bWJlciB8IG51bGw+KG51bGwpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgdGljayA9ICgpID0+IHtcbiAgICAgIHJhZlJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgIGNvbnN0IGRpdiA9IHJlZi5jdXJyZW50O1xuICAgICAgY29uc3QgdCA9IHRhcmdldFJlZi5jdXJyZW50O1xuICAgICAgaWYgKGRpdiAmJiB0Py5pc0Nvbm5lY3RlZCkge1xuICAgICAgICBjb25zdCByID0gdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgaWYgKHIud2lkdGggPT09IDAgJiYgci5oZWlnaHQgPT09IDApIHtcbiAgICAgICAgICBkaXYuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkaXYuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgZGl2LnN0eWxlLmxlZnQgPSBgJHtNYXRoLnJvdW5kKHIubGVmdCl9cHhgO1xuICAgICAgICAgIGRpdi5zdHlsZS50b3AgPSBgJHtNYXRoLnJvdW5kKHIudG9wKX1weGA7XG4gICAgICAgICAgZGl2LnN0eWxlLndpZHRoID0gYCR7TWF0aC5yb3VuZChyLndpZHRoKX1weGA7XG4gICAgICAgICAgZGl2LnN0eWxlLmhlaWdodCA9IGAke01hdGgucm91bmQoci5oZWlnaHQpfXB4YDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkaXYpIHtcbiAgICAgICAgZGl2LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9XG4gICAgICByYWZSZWYuY3VycmVudCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aWNrKTtcbiAgICB9O1xuICAgIHJhZlJlZi5jdXJyZW50ID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRpY2spO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAocmFmUmVmLmN1cnJlbnQgIT0gbnVsbCkgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmUmVmLmN1cnJlbnQpO1xuICAgIH07XG4gIH0sIFtdKTtcblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIHJlZj17cmVmfVxuICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgIGRhdGEtbWMtaG92ZXItaGFsbz1cIlwiXG4gICAgICBzdHlsZT17e1xuICAgICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgICAgZGlzcGxheTogJ25vbmUnLFxuICAgICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZScsXG4gICAgICAgIHpJbmRleDogMjE0NzQ4MzY0NixcbiAgICAgICAgYm9yZGVyOiAnMnB4IHNvbGlkIHZhcigtLW1hdWRlLWh1ZC1hY2NlbnQsICNkNjNiMWYpJyxcbiAgICAgICAgYm9yZGVyUmFkaXVzOiAnM3B4JyxcbiAgICAgICAgYm94U2l6aW5nOiAnYm9yZGVyLWJveCcsXG4gICAgICB9fVxuICAgIC8+XG4gICk7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gQ29tbWVudCBkcm9wIOKAlCBnZW5lcmljIHBhdGggbGlmdGVkIGZyb20gY2FudmFzLXNoZWxsJ3Mgb25Ecm9wQ29tbWVudC4gV29ya3Ncbi8vIHdpdGggb3Igd2l0aG91dCBhcnRib2FyZHM6IGRlZXAvc2hhbGxvdyByZXNvbHZlSG92ZXJUYXJnZXQg4oaSIGVsZW1lbnRzRnJvbVBvaW50XG4vLyBkYXRhLWNkLWlkIGNsaW1iIOKGkiBmbG9hdGluZyBmYWxsYmFjay4gRGlzcGF0Y2hlcyBgY206b3Blbi1jb21wb3NlcmAgZm9yIHRoZVxuLy8gaW4taWZyYW1lIG92ZXJsYXkgKyBwb3N0cyBgY29tbWVudC1jb21wb3NlYCB0byB0aGUgcGFyZW50IGZvciBsZWdhY3kgbW9ja3MuXG5cbmZ1bmN0aW9uIGRyb3BDb21tZW50KFxuICBjbGllbnRYOiBudW1iZXIsXG4gIGNsaWVudFk6IG51bWJlcixcbiAgc2VsU2V0OiB7IHJlcGxhY2U6IChzOiBTZWxlY3Rpb24pID0+IHZvaWQgfSxcbiAgZmlsZTogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiB2b2lkIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcbiAgbGV0IHRhcmdldCA9IHJlc29sdmVIb3ZlclRhcmdldChkb2N1bWVudCwgY2xpZW50WCwgY2xpZW50WSwgeyBkZWVwOiB0cnVlIH0pO1xuICBpZiAoIXRhcmdldCkgdGFyZ2V0ID0gcmVzb2x2ZUhvdmVyVGFyZ2V0KGRvY3VtZW50LCBjbGllbnRYLCBjbGllbnRZLCB7IGRlZXA6IGZhbHNlIH0pO1xuICAvLyBVSS1jYW52YXMgcmVjb3Zlcnkg4oCUIHdoZW4gYm90aCBwYXNzZXMgYmFpbCBvbiBhIGBwb2ludGVyLWV2ZW50czogbm9uZWBcbiAgLy8gZGVjb3JhdGlvbiwgZW51bWVyYXRlIHRoZSBzdGFjayBhbmQgY2xpbWIgdGhlIGZpcnN0IGBkYXRhLWNkLWlkYCBhbmNlc3RvclxuICAvLyBpbnNpZGUgYW4gYXJ0Ym9hcmQgYm9keS4gU2tpcHBlZCBvbiBiYXJlIHNwZWNpbWVucywgd2hpY2ggaW5zdGVhZCBhbmNob3IgdG9cbiAgLy8gdGhlIGV4YWN0IGhvdmVyZWQgZWxlbWVudCBiZWxvdyAoc28gdGhlIHBpbiBtYXRjaGVzIHRoZSBob3ZlciBwcmV2aWV3IGhhbG8pLlxuICBpZiAoIXRhcmdldCAmJiAhaXNCYXJlU3BlY2ltZW4oKSAmJiB0eXBlb2YgZG9jdW1lbnQuZWxlbWVudHNGcm9tUG9pbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zdCBzdGFjayA9IGRvY3VtZW50LmVsZW1lbnRzRnJvbVBvaW50KGNsaWVudFgsIGNsaWVudFkpO1xuICAgIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIHN0YWNrKSB7XG4gICAgICBjb25zdCBzdGFtcGVkID0gKGNhbmRpZGF0ZSBhcyBFbGVtZW50KS5jbG9zZXN0Py4oJ1tkYXRhLWNkLWlkXScpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICAgIGlmICghc3RhbXBlZCkgY29udGludWU7XG4gICAgICBpZiAoIXN0YW1wZWQuY2xvc2VzdCgnLmRjLWFydGJvYXJkLWJvZHknKSkgY29udGludWU7XG4gICAgICBjb25zdCBhcnRib2FyZEVsID0gc3RhbXBlZC5jbG9zZXN0KCdbZGF0YS1kYy1zY3JlZW5dJyk7XG4gICAgICB0YXJnZXQgPSB7XG4gICAgICAgIGVsOiBzdGFtcGVkLFxuICAgICAgICBjZElkOiBzdGFtcGVkLmdldEF0dHJpYnV0ZSgnZGF0YS1jZC1pZCcpLFxuICAgICAgICBhcnRib2FyZElkOiBhcnRib2FyZEVsPy5nZXRBdHRyaWJ1dGUoJ2RhdGEtZGMtc2NyZWVuJykgPz8gbnVsbCxcbiAgICAgIH07XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvLyBCYXJlLXNwZWNpbWVuIGFuY2hvciDigJQgc3BlY2ltZW5zIGhhdmUgbm8gYC5kYy1hcnRib2FyZC1ib2R5YCwgc29cbiAgLy8gcmVzb2x2ZUhvdmVyVGFyZ2V0IGJhaWxzLiBBbmNob3IgdG8gdGhlIEVYQUNUIGVsZW1lbnQgdW5kZXIgdGhlIGN1cnNvciAodGhlXG4gIC8vIHNhbWUgb25lIHBpY2tTcGVjaW1lbkVsIGhpZ2hsaWdodHMgZm9yIHRoZSBob3ZlciBwcmV2aWV3KSwgdmlhIGl0cyBvd25cbiAgLy8gZGF0YS1jZC1pZCB3aGVuIHN0YW1wZWQsIGVsc2UgYSBjc3NQYXRoIHNlbGVjdG9yIOKAlCBzbyB0aGUgZHJvcHBlZCBwaW4gbGFuZHNcbiAgLy8gb24gdGhlIHByZXZpZXdlZCBlbGVtZW50IGluc3RlYWQgb2YgZmxvYXRpbmcuXG4gIGlmICghdGFyZ2V0ICYmIGlzQmFyZVNwZWNpbWVuKCkpIHtcbiAgICBjb25zdCBlbCA9IHBpY2tTcGVjaW1lbkVsKGNsaWVudFgsIGNsaWVudFkpO1xuICAgIGlmIChlbCkgdGFyZ2V0ID0geyBlbCwgY2RJZDogZWwuZ2V0QXR0cmlidXRlKCdkYXRhLWNkLWlkJyksIGFydGJvYXJkSWQ6IG51bGwgfTtcbiAgfVxuXG4gIGlmICghdGFyZ2V0KSB7XG4gICAgLy8gRmxvYXRpbmcgY29tbWVudCDigJQgbm8gZWxlbWVudCBhbmNob3IsIGp1c3QgdGhlIGNsaWNrIHBvaW50IChlLmcuIGEgY2xpY2tcbiAgICAvLyBvbiBlbXB0eSBjYW52YXMvc3BlY2ltZW4gZGVhZCBzcGFjZSkuIFRoZSBvdmVybGF5IHJlbmRlcnMgYSBwaW4gYXQgdGhlXG4gICAgLy8gc3RvcmVkIGJvdW5kcy5cbiAgICBjb25zdCBmbG9hdGluZ1NlbDogU2VsZWN0aW9uID0ge1xuICAgICAgZmlsZSxcbiAgICAgIGlkOiB1bmRlZmluZWQsXG4gICAgICBzZWxlY3RvcjogJycsXG4gICAgICBhcnRib2FyZElkOiBudWxsLFxuICAgICAgdGFnOiAnJyxcbiAgICAgIGNsYXNzZXM6ICcnLFxuICAgICAgdGV4dDogJycsXG4gICAgICBkb21fcGF0aDogW10sXG4gICAgICBib3VuZHM6IHsgeDogY2xpZW50WCAtIDEyLCB5OiBjbGllbnRZIC0gMTIsIHc6IDI0LCBoOiAyNCB9LFxuICAgICAgaHRtbDogJycsXG4gICAgfTtcbiAgICBvcGVuQ29tcG9zZXIoZmxvYXRpbmdTZWwsIGNsaWVudFgsIGNsaWVudFkpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHNlbCA9IGhvdmVyVGFyZ2V0VG9TZWxlY3Rpb24odGFyZ2V0LCBmaWxlKTtcbiAgc2VsU2V0LnJlcGxhY2Uoc2VsKTtcbiAgb3BlbkNvbXBvc2VyKHNlbCwgY2xpZW50WCwgY2xpZW50WSk7XG59XG5cbmZ1bmN0aW9uIG9wZW5Db21wb3NlcihzZWxlY3Rpb246IFNlbGVjdGlvbiwgY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiB2b2lkIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB0cnkge1xuICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50KCdjbTpvcGVuLWNvbXBvc2VyJywgeyBkZXRhaWw6IHsgc2VsZWN0aW9uLCBjbGllbnRYLCBjbGllbnRZIH0gfSlcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvKiBDdXN0b21FdmVudCBhYnNlbnQg4oCUIGZhbGwgdGhyb3VnaCB0byBwYXJlbnQgcGF0aCAqL1xuICAgIH1cbiAgfVxuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB0cnkge1xuICAgICAgd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZSh7IGRnbjogJ2NvbW1lbnQtY29tcG9zZScsIHNlbGVjdGlvbiB9LCAnKicpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLyogcGFyZW50IGRldGFjaGVkICovXG4gICAgfVxuICB9XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gbW91bnRDYW52YXMg4oCUIHRoZSBzaGVsbCBoYXJuZXNzIGVudHJ5LiBSZW5kZXJzIHRoZSBjYW52YXMgd3JhcHBlZCBpbiB0aGUgbGl0ZVxuLy8gY29tbWVudCB0cmVlLCBvciBiYXJlIHdoZW4gY29tbWVudHMgYXJlIGRpc2FibGVkIChnYWxsZXJ5IHRodW1ibmFpbHMgcGFzc1xuLy8gYGNvbW1lbnRzRW5hYmxlZDogZmFsc2VgIHZpYSBgP2NvbW1lbnRzPTBgKS5cblxuZXhwb3J0IGludGVyZmFjZSBNb3VudENhbnZhc09wdGlvbnMge1xuICByb290RWw6IEhUTUxFbGVtZW50O1xuICAvKiogQ2FudmFzIGZpbGUga2V5IChkZXNpZ25SZWwtcHJlZml4ZWQpLiBEZWZhdWx0cyB0byBgZGVyaXZlRmlsZSgpYC4gKi9cbiAgZmlsZT86IHN0cmluZztcbiAgLyoqIFdoZW4gZmFsc2UsIHRoZSBjb21tZW50IGxheWVyIGlzIHNraXBwZWQg4oCUIHRoZSBjYW52YXMgcmVuZGVycyByYXcuICovXG4gIGNvbW1lbnRzRW5hYmxlZDogYm9vbGVhbjtcbn1cblxuLy8gVGhlIGxpdGUgcHJvdmlkZXIgdHJlZSB3cmFwcGluZyBhIGNhbnZhcyBjb21wb25lbnQgKHRvb2wgKyBzZWxlY3Rpb24gK1xuLy8gY29tbWVudCBsYXllcikuIFB1bGxlZCBvdXQgc28gYm90aCB0aGUgbGl2ZSByZW5kZXIgYW5kIHRoZSBlcnJvci1mYWxsYmFja1xuLy8gcmVuZGVyIGJ1aWxkIHRoZSBpZGVudGljYWwgZW52ZWxvcGUuXG4vL1xuLy8gTkI6IHRoZSBDYW52YXNBY3Rpdml0eVByb3ZpZGVyIChQaGFzZSAxMyAvIEREUi0wMjkpIGlzIE5PVCBtb3VudGVkIGhlcmUg4oCUIGl0XG4vLyBsaXZlcyBpbnNpZGUgYERlc2lnbkNhbnZhc2AgKGNhbnZhcy1saWIpLiBjb21tZW50LW1vdW50LmpzIGFuZCBjYW52YXMtbGliIGFyZVxuLy8gU0VQQVJBVEUgYnVuZGxlcywgc28gYSBjb250ZXh0IHByb3ZpZGVkIGhlcmUgd291bGQgYmUgYSBkaWZmZXJlbnQgaW5zdGFuY2Vcbi8vIGZyb20gdGhlIG9uZSBEQ0FydGJvYXJkIChjYW52YXMtbGliKSBjb25zdW1lcy4gU2FtZSByZWFzb25pbmcgdGhlIHJlYWxcbi8vIFRvb2xQcm92aWRlciBsaXZlcyBpbiBEZXNpZ25DYW52YXMsIG5vdCBpbiB0aGlzIGxheWVyJ3MgTWF5YmVUb29sUHJvdmlkZXIuXG5mdW5jdGlvbiBidWlsZENhbnZhc1RyZWUoQ2FudmFzOiBDb21wb25lbnRUeXBlLCBmaWxlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBSZWFjdE5vZGUge1xuICByZXR1cm4gY3JlYXRlRWxlbWVudChcbiAgICBNYXliZVRvb2xQcm92aWRlcixcbiAgICBudWxsLFxuICAgIGNyZWF0ZUVsZW1lbnQoXG4gICAgICBNYXliZVNlbGVjdGlvblNldFByb3ZpZGVyLFxuICAgICAgbnVsbCxcbiAgICAgIGNyZWF0ZUVsZW1lbnQoQ29tbWVudEhvc3QsIHsgZmlsZSB9LCBjcmVhdGVFbGVtZW50KENhbnZhcykpXG4gICAgKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbW91bnRDYW52YXMoQ2FudmFzOiBDb21wb25lbnRUeXBlLCBvcHRzOiBNb3VudENhbnZhc09wdGlvbnMpOiB2b2lkIHtcbiAgY29uc3Qgcm9vdCA9IGNyZWF0ZVJvb3Qob3B0cy5yb290RWwpO1xuICBpZiAoIW9wdHMuY29tbWVudHNFbmFibGVkKSB7XG4gICAgcm9vdC5yZW5kZXIoY3JlYXRlRWxlbWVudChDYW52YXMpKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgZmlsZSA9IG9wdHMuZmlsZSA/PyBkZXJpdmVGaWxlKCk7XG4gIHJvb3QucmVuZGVyKGNyZWF0ZUVsZW1lbnQoQ2FudmFzSG1yUnVudGltZSwgeyBpbml0aWFsQ2FudmFzOiBDYW52YXMsIGZpbGUgfSkpO1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFBoYXNlIDEzLjEgLyBERFItMDc3IOKAlCBITVIgZXJyb3IgcmVzaWxpZW5jZSBkdXJpbmcgYWdlbnQgZWRpdGluZy5cbi8vXG4vLyBXaGVuIGFuIGFnZW50IChgL2Rlc2lnbjplZGl0YCAvIGAvZGVzaWduOm5ld2ApIGxpdmUtZWRpdHMgYSBjYW52YXMsIGFcbi8vIGhhbGYtc2F2ZWQgZmlsZSAobWlzc2luZyBpbXBvcnQsIHVuZGVmaW5lZCBzeW1ib2wsIHRyYW5zcGlsZSBlcnJvcikgdXNlZCB0b1xuLy8gYmxhbmsgdGhlIGNhbnZhcyB0byB3aGl0ZTogdGhlIHNoZWxsIGRpZCBgbG9jYXRpb24ucmVsb2FkKClgIHN0cmFpZ2h0IGludG8gdGhlXG4vLyBicm9rZW4gbW9kdWxlLiBUaGUgc2hlbGwgbm93IHNvZnQtcmVsb2FkcyAoaW1wb3J0LWJlZm9yZS1zd2FwLCBzZWVcbi8vIGB0ZW1wbGF0ZXMvX3NoZWxsLmh0bWxgKSBzbyBhIGJ1aWxkL2ltcG9ydCBlcnJvciBuZXZlciB0ZWFycyBkb3duIHRoZSBnb29kXG4vLyByZW5kZXIuIFRoaXMgcnVudGltZSBjbG9zZXMgdGhlIHJlbWFpbmluZyBnYXAg4oCUIGEgKnJlbmRlci10aW1lKiB0aHJvdyDigJQgYnlcbi8vIGtlZXBpbmcgdGhlIGxhc3QgZ29vZCBjYW52YXMgbW91bnRlZCB2aWEgYW4gZXJyb3IgYm91bmRhcnkgYW5kIHN1cmZhY2luZyBhXG4vLyBcImhvbGRpbmcgbGFzdCBnb29kXCIgdG9hc3QgaW5zdGVhZCBvZiBhIHdoaXRlIHNjcmVlbi4gU3RyaWN0bHkgZ2F0ZWQgYnkgdGhlXG4vLyBzaGVsbCBvbiBhZ2VudC1hY3RpdmU7IG1hbnVhbCBlZGl0cyBrZWVwIHRoZSBwbGFpbiByZWxvYWQgKHNvIHRoaXMgaXMgaW5lcnRcbi8vIGZvciBzb2xvIGhhbmQtZWRpdGluZykuIFRoZSBydW50aW1lIGV4cG9zZXMgaXRzIHN3YXAvaG9sZCBBUEkgb25cbi8vIGB3aW5kb3cuX19tYXVkZUNhbnZhc1J1bnRpbWVgICh0aGUgc2FtZSB3aW5kb3ctaGFuZHNoYWtlIHN0eWxlIHRoZSBzaGVsbFxuLy8gYWxyZWFkeSB1c2VzIGZvciBgX19jYW52YXNfcmVsX19gIGV0Yy4pLlxuXG5leHBvcnQgaW50ZXJmYWNlIENhbnZhc1J1bnRpbWVBcGkge1xuICAvKiogU3dhcCBpbiBhIGZyZXNobHktaW1wb3J0ZWQgY2FudmFzIG1vZHVsZSdzIGRlZmF1bHQgZXhwb3J0IChzdWNjZXNzIHBhdGgpLiAqL1xuICByZW1vdW50OiAobmV4dDogQ29tcG9uZW50VHlwZSkgPT4gdm9pZDtcbiAgLyoqIFNob3cvaGlkZSB0aGUgXCJob2xkaW5nIGxhc3QgZ29vZFwiIHRvYXN0IChidWlsZC1lcnJvciBwYXRoIGZyb20gdGhlIHNoZWxsKS4gKi9cbiAgc2V0SG9sZGluZzogKG9uOiBib29sZWFuLCBtZXNzYWdlPzogc3RyaW5nKSA9PiB2b2lkO1xufVxuXG5jb25zdCBSVU5USU1FX0tFWSA9ICdfX21hdWRlQ2FudmFzUnVudGltZSc7XG5cbi8qKlxuICogRmlyZXMgYG9uT2tgIG9ubHkgd2hlbiBpdHMgc3VidHJlZSBDT01NSVRTIOKAlCBpLmUuIHJlbmRlcnMgd2l0aG91dCB0aHJvd2luZy4gQVxuICogcmVuZGVyLXRpbWUgdGhyb3cgaW4gdGhlIGNhbnZhcyB1bndpbmRzIHRvIHRoZSBib3VuZGFyeSBiZWZvcmUgdGhpcyBjb21taXRzLFxuICogc28gYG9uT2tgIG5ldmVyIHJ1bnMgYW5kIGBsYXN0R29vZGAgaXMgbm90IGFkdmFuY2VkIHRvIGEgYnJva2VuIG1vZHVsZS5cbiAqL1xuZnVuY3Rpb24gT2tTaWduYWwoe1xuICBDYW52YXMsXG4gIGZpbGUsXG4gIG9uT2ssXG59OiB7XG4gIENhbnZhczogQ29tcG9uZW50VHlwZTtcbiAgZmlsZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBvbk9rOiAoKSA9PiB2b2lkO1xufSkge1xuICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb3JyZWN0bmVzcy91c2VFeGhhdXN0aXZlRGVwZW5kZW5jaWVzOiBmaXJlIG9uY2UgcGVyIG1vdW50IChrZXk9YXR0ZW1wdCByZW1vdW50cyB0aGlzKS5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBvbk9rKCk7XG4gIH0sIFtdKTtcbiAgcmV0dXJuIGJ1aWxkQ2FudmFzVHJlZShDYW52YXMsIGZpbGUpO1xufVxuXG5leHBvcnQgY2xhc3MgQ2FudmFzRXJyb3JCb3VuZGFyeSBleHRlbmRzIENvbXBvbmVudDxcbiAge1xuICAgIGF0dGVtcHQ6IG51bWJlcjtcbiAgICBvbkVycm9yOiAoKSA9PiB2b2lkO1xuICAgIGZhbGxiYWNrOiAoKSA9PiBSZWFjdE5vZGU7XG4gICAgY2hpbGRyZW46IFJlYWN0Tm9kZTtcbiAgfSxcbiAgeyBoYXNFcnJvcjogYm9vbGVhbiB9XG4+IHtcbiAgc3RhdGUgPSB7IGhhc0Vycm9yOiBmYWxzZSB9O1xuICBzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKCk6IHsgaGFzRXJyb3I6IGJvb2xlYW4gfSB7XG4gICAgcmV0dXJuIHsgaGFzRXJyb3I6IHRydWUgfTtcbiAgfVxuICBjb21wb25lbnREaWRDYXRjaCgpOiB2b2lkIHtcbiAgICB0aGlzLnByb3BzLm9uRXJyb3IoKTtcbiAgfVxuICBjb21wb25lbnREaWRVcGRhdGUocHJldjogeyBhdHRlbXB0OiBudW1iZXIgfSk6IHZvaWQge1xuICAgIC8vIEEgbmV3IGNhbnZhcyAobmV3IGF0dGVtcHQpIGFycml2ZWQg4oaSIGNsZWFyIHRoZSBlcnJvciBhbmQgdHJ5IHJlbmRlcmluZyBpdC5cbiAgICBpZiAocHJldi5hdHRlbXB0ICE9PSB0aGlzLnByb3BzLmF0dGVtcHQgJiYgdGhpcy5zdGF0ZS5oYXNFcnJvcikge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IGhhc0Vycm9yOiBmYWxzZSB9KTtcbiAgICB9XG4gIH1cbiAgcmVuZGVyKCk6IFJlYWN0Tm9kZSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuaGFzRXJyb3IpIHJldHVybiB0aGlzLnByb3BzLmZhbGxiYWNrKCk7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW47XG4gIH1cbn1cblxuZnVuY3Rpb24gSG1ySG9sZGluZ1RvYXN0KHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSk6IFJlYWN0Tm9kZSB7XG4gIHJldHVybiBjcmVhdGVFbGVtZW50KFxuICAgICdkaXYnLFxuICAgIHtcbiAgICAgIGNsYXNzTmFtZTogJ2RjLWhtci1ob2xkaW5nJyxcbiAgICAgIHJvbGU6ICdzdGF0dXMnLFxuICAgICAgJ2FyaWEtbGl2ZSc6ICdwb2xpdGUnLFxuICAgICAgdGl0bGU6IG1lc3NhZ2UgPyBgSG9sZGluZyBsYXN0IHdvcmtpbmcgcmVuZGVyIOKAlCAke21lc3NhZ2V9YCA6ICdIb2xkaW5nIGxhc3Qgd29ya2luZyByZW5kZXInLFxuICAgIH0sXG4gICAgJ+KPuCBidWlsZCBlcnJvciDigJQgZHLFvsOtbSBwb3NsZWRuw60gZnVua8SNbsOtIHZlcnppJ1xuICApO1xufVxuXG5mdW5jdGlvbiBDYW52YXNIbXJSdW50aW1lKHtcbiAgaW5pdGlhbENhbnZhcyxcbiAgZmlsZSxcbn06IHtcbiAgaW5pdGlhbENhbnZhczogQ29tcG9uZW50VHlwZTtcbiAgZmlsZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufSk6IFJlYWN0Tm9kZSB7XG4gIGNvbnN0IFt7IGNhbnZhcywgYXR0ZW1wdCB9LCBzZXRDYW52YXNTdGF0ZV0gPSB1c2VTdGF0ZSh7IGNhbnZhczogaW5pdGlhbENhbnZhcywgYXR0ZW1wdDogMCB9KTtcbiAgY29uc3QgW2hvbGRpbmcsIHNldEhvbGRpbmdTdGF0ZV0gPSB1c2VTdGF0ZTx7IG9uOiBib29sZWFuOyBtZXNzYWdlPzogc3RyaW5nIH0+KHsgb246IGZhbHNlIH0pO1xuICBjb25zdCBsYXN0R29vZCA9IHVzZVJlZjxDb21wb25lbnRUeXBlIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IGNhbnZhc1JlZiA9IHVzZVJlZihjYW52YXMpO1xuICBjYW52YXNSZWYuY3VycmVudCA9IGNhbnZhcztcblxuICAvLyBQdWJsaXNoIHRoZSBydW50aW1lIEFQSSBmb3IgdGhlIHNoZWxsIEhNUiBjbGllbnQuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgYXBpOiBDYW52YXNSdW50aW1lQXBpID0ge1xuICAgICAgcmVtb3VudDogKG5leHQpID0+IHNldENhbnZhc1N0YXRlKChzKSA9PiAoeyBjYW52YXM6IG5leHQsIGF0dGVtcHQ6IHMuYXR0ZW1wdCArIDEgfSkpLFxuICAgICAgc2V0SG9sZGluZzogKG9uLCBtZXNzYWdlKSA9PiBzZXRIb2xkaW5nU3RhdGUob24gPyB7IG9uOiB0cnVlLCBtZXNzYWdlIH0gOiB7IG9uOiBmYWxzZSB9KSxcbiAgICB9O1xuICAgICh3aW5kb3cgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbUlVOVElNRV9LRVldID0gYXBpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAod2luZG93IGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW1JVTlRJTUVfS0VZXSA9IHVuZGVmaW5lZDtcbiAgICB9O1xuICB9LCBbXSk7XG5cbiAgY29uc3QgaGFuZGxlT2sgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgbGFzdEdvb2QuY3VycmVudCA9IGNhbnZhc1JlZi5jdXJyZW50O1xuICAgIC8vIFRoZSBuZXcgY2FudmFzIHJlbmRlcmVkIGNsZWFuIOKGkiBkcm9wIGFueSBob2xkaW5nIHN0YXRlLlxuICAgIHNldEhvbGRpbmdTdGF0ZSgoaCkgPT4gKGgub24gPyB7IG9uOiBmYWxzZSB9IDogaCkpO1xuICB9LCBbXSk7XG5cbiAgY29uc3QgaGFuZGxlRXJyb3IgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0SG9sZGluZ1N0YXRlKHsgb246IHRydWUsIG1lc3NhZ2U6ICdyZW5kZXIgZXJyb3InIH0pO1xuICB9LCBbXSk7XG5cbiAgY29uc3QgZmFsbGJhY2sgPSB1c2VDYWxsYmFjaygoKTogUmVhY3ROb2RlID0+IHtcbiAgICBjb25zdCBMRyA9IGxhc3RHb29kLmN1cnJlbnQ7XG4gICAgcmV0dXJuIExHID8gYnVpbGRDYW52YXNUcmVlKExHLCBmaWxlKSA6IG51bGw7XG4gIH0sIFtmaWxlXSk7XG5cbiAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoXG4gICAgRnJhZ21lbnQsXG4gICAgbnVsbCxcbiAgICBjcmVhdGVFbGVtZW50KFxuICAgICAgQ2FudmFzRXJyb3JCb3VuZGFyeSxcbiAgICAgIHsgYXR0ZW1wdCwgb25FcnJvcjogaGFuZGxlRXJyb3IsIGZhbGxiYWNrIH0sXG4gICAgICAvLyBrZXk9YXR0ZW1wdCDihpIgZWFjaCBzb2Z0LXJlbG9hZCByZW1vdW50cyBhIGZyZXNoIHN1YnRyZWUgKGFuZCByZXNldHMgdGhlXG4gICAgICAvLyBib3VuZGFyeSdzIGNoaWxkKSwgbWF0Y2hpbmcgdGhlIGNsZWFuLXNsYXRlIHNlbWFudGljcyBvZiBhIGZ1bGwgcmVsb2FkLlxuICAgICAgY3JlYXRlRWxlbWVudChPa1NpZ25hbCwgeyBrZXk6IGF0dGVtcHQsIENhbnZhczogY2FudmFzLCBmaWxlLCBvbk9rOiBoYW5kbGVPayB9KVxuICAgICksXG4gICAgaG9sZGluZy5vbiA/IGNyZWF0ZUVsZW1lbnQoSG1ySG9sZGluZ1RvYXN0LCB7IG1lc3NhZ2U6IGhvbGRpbmcubWVzc2FnZSB9KSA6IG51bGxcbiAgKTtcbn1cbiIsCiAgICAiLyoqXG4gKiBAZmlsZSAgICAgICBjb21tZW50cy1vdmVybGF5LnRzeCDigJQgRmlnSmFtLXN0eWxlIGluLXBsYWNlIGNvbW1lbnRzIG92ZXJsYXlcbiAqIEBzY29wZSAgICAgIGFwcHMvc3R1ZGlvL2NvbW1lbnRzLW92ZXJsYXkudHN4XG4gKiBAcHVycG9zZSAgICBSZW5kZXJzIERTLXN0eWxlZCBjb21tZW50IHBpbnMgKFBoYXNlIDYgVGFzayAyKSwgdGhlIGluLXBsYWNlXG4gKiAgICAgICAgICAgICBjb21wb3NlciBidWJibGUgKFRhc2sgMyksIGFuZCB0aGUgdGhyZWFkIHBvcG92ZXIgKFRhc2sgNClcbiAqICAgICAgICAgICAgIGluc2lkZSB0aGUgY2FudmFzIGlmcmFtZS4gU2libGluZyB0byBgYW5ub3RhdGlvbnMtbGF5ZXJgIOKAlFxuICogICAgICAgICAgICAgcG9ydGFscyBpbnRvIGAuZGMtd29ybGRgIHNvIENTUyB6b29tICsgdHJhbnNsYXRlIG9uIHRoZSB3b3JsZFxuICogICAgICAgICAgICAgcGxhbmUgc2NhbGUgZXZlcnkgcGluL3BvcG92ZXIgdW5pZm9ybWx5IHdpdGggdGhlIGFydGJvYXJkcy5cbiAqXG4gKiBEYXRhIGZsb3cgKFBoYXNlIDYgVGFzayAyIOKAlCBwaW5zIG9ubHk7IGNvbXBvc2VyICsgdGhyZWFkIGxhbmQgaW4gVGFzayAzLzQpOlxuICogICAxLiBTaGVsbCAoYGNsaWVudC9hcHAuanN4YCkgcHVzaGVzIGB7IGRnbjogJ2NvbW1lbnRzLXNldCcsIGNvbW1lbnRzIH1gXG4gKiAgICAgIGludG8gdGhlIGlmcmFtZSB3aGVuZXZlciBpdHMgYGNvbW1lbnRzQnlGaWxlW2FjdGl2ZVBhdGhdYCBjaGFuZ2VzLlxuICogICAyLiBPdmVybGF5IGFsc28gZmV0Y2hlcyBgL19jb21tZW50cz9maWxlPS4uLmAgb24gbW91bnQgYXMgYSBzZWxmLWhlYWwg4oCUXG4gKiAgICAgIGxldHMgdGhlIG92ZXJsYXkgcmVuZGVyIGV2ZW4gaWYgdGhlIHNoZWxsIGhhc24ndCBicm9hZGNhc3QgeWV0XG4gKiAgICAgIChyYWNlIG9uIGZpcnN0IGlmcmFtZSBsb2FkKS5cbiAqICAgMy4gU2hlbGwgcHVzaGVzIGB7IGRnbjogJ2NvbW1lbnQtZm9jdXMnLCBpZCB9YCB3aGVuIHRoZSB1c2VyIGNsaWNrcyBhIHJvd1xuICogICAgICBpbiB0aGUgY29tbWVudHMgcGFuZWwg4oCUIG92ZXJsYXkgaGlnaGxpZ2h0cyB0aGUgbWF0Y2hpbmcgcGluLlxuICogICA0LiBPdmVybGF5IHBvc3RzIGB7IGRnbjogJ2NvbW1lbnQtY2xpY2snLCBpZCB9YCBiYWNrIHRvIHRoZSBzaGVsbCB3aGVuXG4gKiAgICAgIHRoZSB1c2VyIGNsaWNrcyBhIHBpbiDigJQgc2FtZSBjaGFubmVsIHRoZSBsZWdhY3kgYGRnbi1waW5gIG92ZXJsYXlcbiAqICAgICAgdXNlZDsgdGhlIHNoZWxsIGFscmVhZHkgcm91dGVzIGl0IHRvIGBzZXRGb2N1c2VkQ29tbWVudElkYC5cbiAqXG4gKiBGaWx0ZXIgcmVzcGVjdCDigJQgUGhhc2UgNiBUYXNrIDIgZGVmYXVsdCBpcyBcImhpZGUgcmVzb2x2ZWRcIi4gVGhlIHNoZWxsIHdpbGxcbiAqIGdhaW4gYSBgY29tbWVudHMtZmlsdGVyYCBjaGFubmVsIGluIFRhc2sgNjsgdW50aWwgdGhlbiB0aGUgb3ZlcmxheSBhbHdheXNcbiAqIGhpZGVzIHJlc29sdmVkIHBpbnMuIFBsYW4tYWxpZ25lZC5cbiAqXG4gKiBQaW4gcG9zaXRpb24gbWF0aCDigJQgc2VlIGBvZmZzZXRXaXRoaW5Xb3JsZGAgYmVsb3cuIFdlIHdhbGsgb2Zmc2V0UGFyZW50IHVwXG4gKiB0byBgLmRjLXdvcmxkYCB0byBnZXQgcHJlLXpvb20gd29ybGQgY29vcmRzIGRpcmVjdGx5OyBDU1Mgem9vbSBvbiB0aGUgd29ybGRcbiAqIHBsYW5lIHRoZW4gcmVuZGVycyB0aGUgcGluIGF0IHRoZSByaWdodCBzY2FsZSB3aXRob3V0IHVzIGRvaW5nIHpvb20gbWF0aC5cbiAqXG4gKiBUaGUgbGVnYWN5IHZhbmlsbGEtSlMgYCNkZ24tcGluLWxheWVyYCBpbmplY3RlZCBieSBgaW5zcGVjdC50c2AgaXMgaGlkZGVuXG4gKiBvbiBtb3VudCB0byBhdm9pZCBkb3VibGUtcGlucyBpbnNpZGUgVFNYIGNhbnZhc2VzLiBUaGUgbGVnYWN5IGxheWVyIHN0aWxsXG4gKiByZW5kZXJzIGZvciBgLmh0bWxgIG1vY2tzIHdoZXJlIHRoaXMgUmVhY3Qgb3ZlcmxheSBuZXZlciBtb3VudHMuXG4gKi9cblxuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgdXNlQ29sbGFiIH0gZnJvbSAnLi91c2UtY29sbGFiLnRzeCc7XG5pbXBvcnQgeyB1c2VTZWxlY3Rpb25TZXRPcHRpb25hbCB9IGZyb20gJy4vdXNlLXNlbGVjdGlvbi1zZXQudHN4JztcblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBUeXBlcyDigJQga2VwdCBpbiBzeW5jIHdpdGggYENvbW1lbnRgIGluIGBhcGkudHNgLiBXZSBtaXJyb3IgdGhlIHNoYXBlIHJhdGhlclxuLy8gdGhhbiBpbXBvcnQgdG8gYXZvaWQgcHVsbGluZyBzZXJ2ZXIgdHlwZXMgaW50byB0aGUgY2FudmFzIHJ1bnRpbWUgYnVuZGxlLlxuXG5pbnRlcmZhY2UgT3ZlcmxheUJvdW5kcyB7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xuICB3OiBudW1iZXI7XG4gIGg6IG51bWJlcjtcbn1cblxuLy8gU2VsZWN0aW9uIHBheWxvYWQgcG9zdGVkIGJ5IGNhbnZhcy1zaGVsbCdzIGBvbkRyb3BDb21tZW50YC4gTWlycm9ycyB0aGVcbi8vIHNoYXBlIGBob3ZlclRhcmdldFRvU2VsZWN0aW9uYCByZXR1cm5zOyB3ZSBrZWVwIGl0IGxvb3NlIHNvIHRoZSBvdmVybGF5XG4vLyBkb2Vzbid0IGRlcGVuZCBvbiBjYW52YXMtc2hlbGwgdHlwZXMuXG5pbnRlcmZhY2UgQ29tcG9zZVNlbGVjdGlvbiB7XG4gIGZpbGU/OiBzdHJpbmc7XG4gIGlkPzogc3RyaW5nO1xuICBzZWxlY3Rvcjogc3RyaW5nO1xuICBhcnRib2FyZElkPzogc3RyaW5nIHwgbnVsbDtcbiAgdGFnOiBzdHJpbmc7XG4gIGNsYXNzZXM6IHN0cmluZztcbiAgdGV4dDogc3RyaW5nO1xuICBkb21fcGF0aDogc3RyaW5nW107XG4gIGJvdW5kczogT3ZlcmxheUJvdW5kcyB8IG51bGw7XG4gIGh0bWw6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIENvbXBvc2VyU3RhdGUge1xuICBzZWxlY3Rpb246IENvbXBvc2VTZWxlY3Rpb247XG4gIGNsaWVudFg6IG51bWJlcjtcbiAgY2xpZW50WTogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgT3ZlcmxheVJlcGx5IHtcbiAgaWQ6IHN0cmluZztcbiAgYXV0aG9yOiBzdHJpbmc7XG4gIGJvZHk6IHN0cmluZztcbiAgY3JlYXRlZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJsYXlDb21tZW50IHtcbiAgaWQ6IHN0cmluZztcbiAgZmlsZTogc3RyaW5nO1xuICBzZWxlY3Rvcjogc3RyaW5nO1xuICAvKiogT2NjdXJyZW5jZSBpbmRleCBhbW9uZyBgcXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcilgIOKAlCBkaXNhbWJpZ3VhdGVzIGFcbiAgICogY29tcG9uZW50IHJlcGVhdGVkIHdpdGhpbiBvbmUgYXJ0Ym9hcmQuIEFic2VudCAob2xkIGNvbW1lbnRzKSDihpIgZmlyc3QuICovXG4gIGluZGV4PzogbnVtYmVyO1xuICBib3VuZHM6IE92ZXJsYXlCb3VuZHMgfCBudWxsO1xuICB0ZXh0OiBzdHJpbmc7XG4gIHN0YXR1czogJ29wZW4nIHwgJ3Jlc29sdmVkJztcbiAgY3JlYXRlZDogc3RyaW5nO1xuICByZXNvbHZlZF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgYXV0aG9yPzogc3RyaW5nO1xuICB0aHJlYWQ/OiBPdmVybGF5UmVwbHlbXTtcbiAgbWVudGlvbnM/OiBzdHJpbmdbXTtcbiAgLy8gZG9tX3BhdGggLyB0YWcgLyBjbGFzc2VzIC8gaHRtbF9leGNlcnB0IHVudXNlZCBhdCBvdmVybGF5IGxheWVyOyBrZXB0IG9mZlxuICAvLyB0aGUgdHlwZSB0byBrZWVwIHRoZSBzdXJmYWNlIHRpZ2h0LlxufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIENTUyBsb2FkIOKAlCBzaWJsaW5nIHN0eWxlc2hlZXQsIGZldGNoZWQgb25jZSBwZXIgc2Vzc2lvbiB2aWEgYSA8bGluaz4gdGFnLlxuLy8gSW5saW5pbmcgdGhlIGZpbGUgYXQgYnVpbGQgdGltZSB3b3VsZCBjb3N0IGFuIGV4dHJhIGJ1bmRsZXIgY29uZmlnOyB0aGVcbi8vIG92ZXJsYXkgaXMgaW50ZXJuYWwtb25seSBzbyBhIHJ1bnRpbWUgPGxpbms+IGlzIGZpbmUuXG5cbmNvbnN0IENTU19IUkVGID0gJy9fY2xpZW50L2NvbW1lbnRzLW92ZXJsYXkuY3NzJztcblxuZnVuY3Rpb24gZW5zdXJlT3ZlcmxheVN0eWxlcygpOiB2b2lkIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcbiAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbS1vdmVybGF5LWNzcycpKSByZXR1cm47XG4gIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gIGxpbmsuaWQgPSAnY20tb3ZlcmxheS1jc3MnO1xuICBsaW5rLnJlbCA9ICdzdHlsZXNoZWV0JztcbiAgbGluay5ocmVmID0gQ1NTX0hSRUY7XG4gIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobGluayk7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gRmlsZSBkZXJpdmF0aW9uIOKAlCBzYW1lIGxvZ2ljIGFzIGNhbnZhcy1zaGVsbC50c3g6OmRlcml2ZUZpbGUoKS4gRHVwbGljYXRlZFxuLy8gaGVyZSBzbyB0aGUgb3ZlcmxheSBjYW4gZmV0Y2ggaXRzIG93biBjb21tZW50cyBvbiBtb3VudCB3aXRob3V0IGltcG9ydGluZ1xuLy8gZnJvbSBjYW52YXMtc2hlbGwgKHdoaWNoIHdvdWxkIGNyZWF0ZSBhIGN5Y2xlKS5cblxuZnVuY3Rpb24gZGVyaXZlRmlsZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm4gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCBwID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIGlmIChwID09PSAnL19jYW52YXMtc2hlbGwuaHRtbCcgfHwgcCA9PT0gJy9fY2FudmFzLXNoZWxsJykge1xuICAgICAgY29uc3QgcXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuICAgICAgY29uc3QgY2FudmFzID0gcXMuZ2V0KCdjYW52YXMnKSA/PyAnJztcbiAgICAgIGNvbnN0IGRlc2lnblJlbCA9IChxcy5nZXQoJ2Rlc2lnblJlbCcpID8/ICcuZGVzaWduJykucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgJycpO1xuICAgICAgcmV0dXJuIGNhbnZhcyA/IGAke2Rlc2lnblJlbH0vJHtjYW52YXN9YCA6IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQocCkucmVwbGFjZSgvXlxcLy8sICcnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBQb3NpdGlvbiByZXNvbHZlcnMg4oCUIHNjcmVlbiBjb29yZHMgdmlhIGdldEJvdW5kaW5nQ2xpZW50UmVjdC4gTWlycm9ycyB0aGVcbi8vIGBTZWxlY3Rpb25IYWxvc2AgLyBgSG92ZXJIYWxvYCBwYXR0ZXJuIGluIGNhbnZhcy1zaGVsbC50c3ggc28gdGhlIGNvbW1lbnRzXG4vLyBsYXllciBjYW4gcmVuZGVyIGFzIGEgZml4ZWQtcG9zaXRpb24gc2libGluZyBvZiBgLmRjLWNhbnZhc2AgKGFib3ZlIHRoZVxuLy8gaGFsbyBjaHJvbWUgYXQgei1pbmRleCA1KSBpbnN0ZWFkIG9mIGJlaW5nIHBvcnRhbGVkIGludG8gYC5kYy13b3JsZGAgd2hlcmVcbi8vIGl0IHdvdWxkIGxvc2UgdGhlIHN0YWNraW5nIGJhdHRsZS5cblxuZnVuY3Rpb24gc2NyZWVuUmVjdEZvcihcbiAgc2VsZWN0b3I6IHN0cmluZyxcbiAgaW5kZXg/OiBudW1iZXJcbik6IHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG4gIHc6IG51bWJlcjtcbiAgaDogbnVtYmVyO1xufSB8IG51bGwge1xuICBpZiAoIXNlbGVjdG9yKSByZXR1cm4gbnVsbDtcbiAgbGV0IGVsOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICB0cnkge1xuICAgIC8vIGluZGV4IGRpc2FtYmlndWF0ZXMgYSBjb21wb25lbnQgcmVwZWF0ZWQgd2l0aGluIG9uZSBhcnRib2FyZCAocXVlcnlTZWxlY3RvclxuICAgIC8vIGFsb25lIHdvdWxkIGFsd2F5cyBncmFiIHRoZSBmaXJzdCBtYXRjaCkuIEFic2VudC8wIOKGkiBmaXJzdC5cbiAgICBjb25zdCBhbGwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgICBjb25zdCBpID0gaW5kZXggJiYgaW5kZXggPiAwICYmIGluZGV4IDwgYWxsLmxlbmd0aCA/IGluZGV4IDogMDtcbiAgICBlbCA9IChhbGxbaV0gPz8gYWxsWzBdID8/IG51bGwpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKCFlbD8uaXNDb25uZWN0ZWQpIHJldHVybiBudWxsO1xuICBjb25zdCByID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIGlmIChyLndpZHRoID09PSAwICYmIHIuaGVpZ2h0ID09PSAwKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIHsgeDogci5sZWZ0LCB5OiByLnRvcCwgdzogci53aWR0aCwgaDogci5oZWlnaHQgfTtcbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBQdWJsaWMgY29tcG9uZW50IOKAlCBtb3VudGVkIGZyb20gY2FudmFzLXNoZWxsLnRzeCBhbG9uZ3NpZGUgVG9vbFBhbGV0dGUgL1xuLy8gQW5ub3RhdGlvbnNMYXllciAvIFNuYXBHdWlkZU92ZXJsYXkuXG5cbmV4cG9ydCBmdW5jdGlvbiBDb21tZW50c092ZXJsYXkoKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgZW5zdXJlT3ZlcmxheVN0eWxlcygpO1xuXG4gIC8vIE9wdGlvbmFsIOKAlCBDb21tZW50c092ZXJsYXkgaXMgbW91bnRlZCBpbnNpZGUgU2VsZWN0aW9uU2V0UHJvdmlkZXIgaW4gdGhlXG4gIC8vIHN0YW5kYXJkIENhbnZhc1NoZWxsIHRyZWUsIGJ1dCBzdGF5cyB1c2FibGUgaWYgYSBob3N0IGV2ZXIgZW1iZWRzIGl0XG4gIC8vIG91dHNpZGUgdGhhdCBwcm92aWRlciAocmV0dXJucyBudWxsIGluc3RlYWQgb2YgdGhyb3dpbmcpLlxuICBjb25zdCBzZWxTZXQgPSB1c2VTZWxlY3Rpb25TZXRPcHRpb25hbCgpO1xuICBjb25zdCBbY29tbWVudHMsIHNldENvbW1lbnRzXSA9IHVzZVN0YXRlPE92ZXJsYXlDb21tZW50W10+KFtdKTtcbiAgY29uc3QgW2ZvY3VzZWRJZCwgc2V0Rm9jdXNlZElkXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbY29tcG9zZXIsIHNldENvbXBvc2VyXSA9IHVzZVN0YXRlPENvbXBvc2VyU3RhdGUgfCBudWxsPihudWxsKTtcbiAgY29uc3QgZmlsZSA9IHVzZU1lbW8oKCkgPT4gZGVyaXZlRmlsZSgpLCBbXSk7XG5cbiAgLy8gRHJvcCB0aGUgbGVnYWN5IGAjZGduLXBpbi1sYXllcmAgc28gd2UgZG9uJ3QgcmVuZGVyIGR1cGxpY2F0ZSBwaW5zIGluc2lkZVxuICAvLyBUU1ggY2FudmFzZXMuIFRoZSBsYXllciBzaGlwcyBpbiBldmVyeSBzZXJ2ZWQgSFRNTCBwYWdlIHZpYSBpbnNwZWN0LnRzO1xuICAvLyBmb3IgYC5odG1sYCBtb2NrcyAobm8gY2FudmFzLXNoZWxsIG1vdW50KSBpdCBzdGlsbCBkb2VzIGl0cyBqb2IuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcbiAgICBjb25zdCBsZWdhY3kgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGduLXBpbi1sYXllcicpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAoIWxlZ2FjeSkgcmV0dXJuO1xuICAgIGNvbnN0IHByZXYgPSBsZWdhY3kuc3R5bGUuZGlzcGxheTtcbiAgICBsZWdhY3kuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgbGVnYWN5LnN0eWxlLmRpc3BsYXkgPSBwcmV2O1xuICAgIH07XG4gIH0sIFtdKTtcblxuICAvLyBNaXJyb3IgYSBjb21tZW50IGludG8gdGhlIGNhbnZhcyBzZWxlY3Rpb24gc2V0IHNvIFNlbGVjdGlvbkhhbG9zIHBhaW50c1xuICAvLyB0aGUgc2FtZSBoYWxvIENtZC1jbGljayB3b3VsZC4gQ2FsbGVkIGZyb20gYm90aCB0aGUgaW4taWZyYW1lIHBpbiBjbGlja1xuICAvLyBBTkQgdGhlIGluYm91bmQgYGNvbW1lbnQtZm9jdXNgIHBvc3RNZXNzYWdlIHNvIGp1bXBpbmcgZnJvbSB0aGUgc2hlbGwnc1xuICAvLyBDb21tZW50cyBwYW5lbCBwcm9kdWNlcyB0aGUgc2FtZSB2aXN1YWwgZmVlZGJhY2sgYXMgY2xpY2tpbmcgdGhlIHBpbi5cbiAgY29uc3QgbWlycm9yU2VsZWN0aW9uID0gdXNlQ2FsbGJhY2soXG4gICAgKGNvbW1lbnQ6IE92ZXJsYXlDb21tZW50IHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICBpZiAoIXNlbFNldCkgcmV0dXJuO1xuICAgICAgaWYgKCFjb21tZW50Py5zZWxlY3Rvcikge1xuICAgICAgICBzZWxTZXQuY2xlYXIoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgY2RNYXRjaCA9IGNvbW1lbnQuc2VsZWN0b3IubWF0Y2goL2RhdGEtY2QtaWQ9XCIoW15cIl0rKVwiLyk7XG4gICAgICBjb25zdCBjZElkID0gY2RNYXRjaCA/IGNkTWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG4gICAgICBsZXQgdGFnOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgY2xhc3Nlczogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGNvbW1lbnQuc2VsZWN0b3IpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICAgICAgaWYgKGVsKSB7XG4gICAgICAgICAgdGFnID0gZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIGNsYXNzZXMgPSAoZWwuZ2V0QXR0cmlidXRlKCdjbGFzcycpID8/ICcnKVxuICAgICAgICAgICAgLnNwbGl0KC9cXHMrLylcbiAgICAgICAgICAgIC5maWx0ZXIoKGNscykgPT4gY2xzICYmICFjbHMuc3RhcnRzV2l0aCgnZGduLScpICYmICFjbHMuc3RhcnRzV2l0aCgnZGMtY3YtJykpXG4gICAgICAgICAgICAuam9pbignICcpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogdW5yZXNvbHZhYmxlIHNlbGVjdG9yIOKAlCBmYWxsIHRocm91Z2ggd2l0aCBubyBmcmVzaCBtZXRhZGF0YSAqL1xuICAgICAgfVxuICAgICAgc2VsU2V0LnJlcGxhY2Uoe1xuICAgICAgICBmaWxlOiBmaWxlID8/IHVuZGVmaW5lZCxcbiAgICAgICAgaWQ6IGNkSWQsXG4gICAgICAgIHNlbGVjdG9yOiBjb21tZW50LnNlbGVjdG9yLFxuICAgICAgICB0YWcsXG4gICAgICAgIGNsYXNzZXMsXG4gICAgICAgIGJvdW5kczogY29tbWVudC5ib3VuZHMgPz8gdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBbc2VsU2V0LCBmaWxlXVxuICApO1xuXG4gIC8vIEtlZXAgdGhlIGxhdGVzdCBjb21tZW50cyBsaXN0IHJlYWNoYWJsZSBmcm9tIHRoZSBtZXNzYWdlIGhhbmRsZXIgd2l0aG91dFxuICAvLyByZS1hdHRhY2hpbmcgdGhlIGxpc3RlbmVyIG9uIGV2ZXJ5IGNvbW1lbnRzIG11dGF0aW9uLlxuICBjb25zdCBjb21tZW50c1JlZiA9IHVzZVJlZjxPdmVybGF5Q29tbWVudFtdPihjb21tZW50cyk7XG4gIGNvbW1lbnRzUmVmLmN1cnJlbnQgPSBjb21tZW50cztcblxuICAvLyBQaGFzZSA4IFRhc2sgMyDigJQgd2hlbiBhIGNvbGxhYiByb29tIGlzIGNvbm5lY3RlZCwgdGhlIFkuQXJyYXkgb2YgY29tbWVudHNcbiAgLy8gaXMgdGhlIGxpdmUgc291cmNlIG9mIHRydXRoLiBvYnNlcnZlKCkgZmlyZXMgb24gZXZlcnkgcmVtb3RlIG11dGF0aW9uXG4gIC8vIChhZGRlZCBwaW5zIGZyb20gYW5vdGhlciB0YWIsIHJlc29sdmVkLWZyb20taW5zcGVjdG9yIHZpYSB0aGUgcmVnaXN0cnlcbiAgLy8gYnJpZGdlLCBldGMuKSBhbmQgb24gdGhlIGxvY2FsIHNlZWQuIEJvdGggcGF0aHMgY29udmVyZ2Ugb24gdGhlIHNhbWVcbiAgLy8gSlNPTiBwcm9qZWN0aW9uIOKAlCBsYXN0LXdyaXRlLXdpbnMgYmV0d2VlbiBZLkFycmF5IGFuZCBwb3N0TWVzc2FnZSBpc1xuICAvLyBzYWZlIGJlY2F1c2UgdGhleSBjYXJyeSBpZGVudGljYWwgY29udGVudDsgdGhlIFkuQXJyYXkgcGF0aCBqdXN0XG4gIC8vIHJlYWNoZXMgdXMgZmlyc3QgKG5vIDgwMCBtcyBkZWJvdW5jZSBkZWxheSkuXG4gIGNvbnN0IGNvbGxhYiA9IHVzZUNvbGxhYigpO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghY29sbGFiKSByZXR1cm47XG4gICAgY29uc3QgYXJyID0gY29sbGFiLmRvYy5nZXRBcnJheTxPdmVybGF5Q29tbWVudD4oJ2NvbW1lbnRzJyk7XG4gICAgY29uc3Qgc3luYyA9ICgpID0+IHtcbiAgICAgIC8vIHRvQXJyYXkoKSBzbmFwc2hvdCB0aGUgY3VycmVudCBZLkFycmF5IGludG8gYSBwbGFpbiBKUyBsaXN0LlxuICAgICAgc2V0Q29tbWVudHMoYXJyLnRvQXJyYXkoKSBhcyBPdmVybGF5Q29tbWVudFtdKTtcbiAgICB9O1xuICAgIC8vIEluaXRpYWwgZmlsbCDigJQgY292ZXJzIHRoZSBjYXNlIHdoZXJlIFkuRG9jIHdhcyBhbHJlYWR5IHNlZWRlZCBieSB0aGVcbiAgICAvLyB0aW1lIHRoaXMgb3ZlcmxheSBtb3VudGVkLlxuICAgIGlmIChhcnIubGVuZ3RoID4gMCkgc3luYygpO1xuICAgIGFyci5vYnNlcnZlKHN5bmMpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhcnIudW5vYnNlcnZlKHN5bmMpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8qIGRvYyBkZXN0cm95ZWQgYmVmb3JlIHVubW91bnQg4oCUIG9ic2VydmVyIGFscmVhZHkgZ29uZSAqL1xuICAgICAgfVxuICAgIH07XG4gIH0sIFtjb2xsYWJdKTtcblxuICAvLyBMaXN0ZW4gZm9yIHRoZSBzaGVsbCdzIGJyb2FkY2FzdCBjaGFubmVscy4gU2NoZW1hIG1hdGNoZXMgdGhlIGxlZ2FjeVxuICAvLyBvdmVybGF5IHNvIHRoZSBzaGVsbC1zaWRlIGdsdWUgaW4gY2xpZW50L2FwcC5qc3ggKH5saW5lIDE2NzIpIGtlZXBzXG4gIC8vIHdvcmtpbmcgd2l0aG91dCBtb2RpZmljYXRpb24uXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG4gICAgY29uc3Qgb25NZXNzYWdlID0gKGU6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgICAgY29uc3QgbSA9IGUuZGF0YSBhcyB7IGRnbj86IHN0cmluZzsgY29tbWVudHM/OiB1bmtub3duOyBpZD86IHN0cmluZyB9IHwgbnVsbDtcbiAgICAgIGlmICghbSB8fCB0eXBlb2YgbSAhPT0gJ29iamVjdCcgfHwgIW0uZGduKSByZXR1cm47XG4gICAgICBpZiAobS5kZ24gPT09ICdjb21tZW50cy1zZXQnICYmIEFycmF5LmlzQXJyYXkobS5jb21tZW50cykpIHtcbiAgICAgICAgc2V0Q29tbWVudHMobS5jb21tZW50cyBhcyBPdmVybGF5Q29tbWVudFtdKTtcbiAgICAgIH0gZWxzZSBpZiAobS5kZ24gPT09ICdjb21tZW50LWZvY3VzJykge1xuICAgICAgICBjb25zdCBpZCA9IHR5cGVvZiBtLmlkID09PSAnc3RyaW5nJyA/IG0uaWQgOiBudWxsO1xuICAgICAgICBzZXRGb2N1c2VkSWQoaWQpO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBpZCA/IGNvbW1lbnRzUmVmLmN1cnJlbnQuZmluZCgoYykgPT4gYy5pZCA9PT0gaWQpIDogdW5kZWZpbmVkO1xuICAgICAgICBtaXJyb3JTZWxlY3Rpb24odGFyZ2V0KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgb25NZXNzYWdlKTtcbiAgICByZXR1cm4gKCkgPT4gd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBvbk1lc3NhZ2UpO1xuICB9LCBbbWlycm9yU2VsZWN0aW9uXSk7XG5cbiAgLy8gY2FudmFzLXNoZWxsJ3MgYG9uRHJvcENvbW1lbnRgIGRpc3BhdGNoZXMgYGNtOm9wZW4tY29tcG9zZXJgIG9uIHRoZSBpZnJhbWVcbiAgLy8gZG9jdW1lbnQuIE9wZW4gdGhlIGNvbXBvc2VyIHBpbm5lZCB0byB0aGF0IGNsaWNrIHBvaW50LlxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG4gICAgY29uc3Qgb25PcGVuID0gKGU6IEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBkZXRhaWwgPSAoXG4gICAgICAgIGUgYXMgQ3VzdG9tRXZlbnQ8eyBzZWxlY3Rpb24/OiBDb21wb3NlU2VsZWN0aW9uOyBjbGllbnRYPzogbnVtYmVyOyBjbGllbnRZPzogbnVtYmVyIH0+XG4gICAgICApLmRldGFpbDtcbiAgICAgIGlmICghZGV0YWlsPy5zZWxlY3Rpb24pIHJldHVybjtcbiAgICAgIHNldENvbXBvc2VyKHtcbiAgICAgICAgc2VsZWN0aW9uOiBkZXRhaWwuc2VsZWN0aW9uLFxuICAgICAgICBjbGllbnRYOiB0eXBlb2YgZGV0YWlsLmNsaWVudFggPT09ICdudW1iZXInID8gZGV0YWlsLmNsaWVudFggOiAwLFxuICAgICAgICBjbGllbnRZOiB0eXBlb2YgZGV0YWlsLmNsaWVudFkgPT09ICdudW1iZXInID8gZGV0YWlsLmNsaWVudFkgOiAwLFxuICAgICAgfSk7XG4gICAgfTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbTpvcGVuLWNvbXBvc2VyJywgb25PcGVuKTtcbiAgICByZXR1cm4gKCkgPT4gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY206b3Blbi1jb21wb3NlcicsIG9uT3Blbik7XG4gIH0sIFtdKTtcblxuICBjb25zdCBjbG9zZUNvbXBvc2VyID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldENvbXBvc2VyKG51bGwpO1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKHsgZGduOiAnZm9yY2UtY2xlYXInIH0sICcqJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvKiBwYXJlbnQgZGV0YWNoZWQgKi9cbiAgICB9XG4gIH0sIFtdKTtcblxuICBjb25zdCBzdWJtaXRDb21wb3NlciA9IHVzZUNhbGxiYWNrKFxuICAgICh0ZXh0OiBzdHJpbmcpID0+IHtcbiAgICAgIGlmICghY29tcG9zZXIpIHJldHVybjtcbiAgICAgIGNvbnN0IHNlbCA9IGNvbXBvc2VyLnNlbGVjdGlvbjtcbiAgICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICAgIGZpbGU6IHNlbC5maWxlLFxuICAgICAgICBzZWxlY3Rvcjogc2VsLnNlbGVjdG9yLFxuICAgICAgICBpbmRleDogc2VsLmluZGV4LFxuICAgICAgICBkb21fcGF0aDogc2VsLmRvbV9wYXRoLFxuICAgICAgICB0YWc6IHNlbC50YWcsXG4gICAgICAgIGNsYXNzZXM6IHNlbC5jbGFzc2VzLFxuICAgICAgICBib3VuZHM6IHNlbC5ib3VuZHMsXG4gICAgICAgIGh0bWxfZXhjZXJwdDogc2VsLmh0bWwsXG4gICAgICAgIHRleHQsXG4gICAgICB9O1xuICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG4gICAgICAvLyBTaGVsbCByZWxheXMgaW50byB0aGUgV1MgYGNvbW1lbnRzLWFkZGAgY2hhbm5lbCBhbmQgcGVyc2lzdHMuXG4gICAgICB0cnkge1xuICAgICAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKHsgZGduOiAnY29tbWVudC1zdWJtaXQnLCBwYXlsb2FkIH0sICcqJyk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogcGFyZW50IGRldGFjaGVkICovXG4gICAgICB9XG4gICAgICBjbG9zZUNvbXBvc2VyKCk7XG4gICAgfSxcbiAgICBbY29tcG9zZXIsIGNsb3NlQ29tcG9zZXJdXG4gICk7XG5cbiAgLy8gU2VsZi1oZWFsIGZldGNoIOKAlCBjb3ZlcnMgdGhlIHJhY2Ugd2hlcmUgdGhlIGlmcmFtZSBsb2FkcyBiZWZvcmUgdGhlIHNoZWxsXG4gIC8vIHB1c2hlcyBgY29tbWVudHMtc2V0YCAoZS5nLiBmaXJzdCBoeWRyYXRpb24gb24gY29sZCBvcGVuKS5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWZpbGUpIHJldHVybjtcbiAgICBsZXQgY2FuY2VsbGVkID0gZmFsc2U7XG4gICAgKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCBmZXRjaChgL19jb21tZW50cz9maWxlPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGZpbGUpfWApO1xuICAgICAgICBpZiAoIXIub2spIHJldHVybjtcbiAgICAgICAgY29uc3QgZGF0YSA9IChhd2FpdCByLmpzb24oKSkgYXMgeyBjb21tZW50cz86IE92ZXJsYXlDb21tZW50W10gfTtcbiAgICAgICAgaWYgKGNhbmNlbGxlZCkgcmV0dXJuO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhLmNvbW1lbnRzKSkge1xuICAgICAgICAgIC8vIE9ubHkgc2V0IHdoZW4gd2UgaGF2ZW4ndCByZWNlaXZlZCBhIHNoZWxsIGJyb2FkY2FzdCB5ZXQ7IHRoZVxuICAgICAgICAgIC8vIHNoZWxsIGlzIGF1dGhvcml0YXRpdmUgb25jZSBpdCBraWNrcyBpbi5cbiAgICAgICAgICBzZXRDb21tZW50cygocHJldikgPT4gKHByZXYubGVuZ3RoID09PSAwID8gKGRhdGEuY29tbWVudHMgPz8gW10pIDogcHJldikpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogb2ZmbGluZSAvIGRldi1zZXJ2ZXIgcmVzdGFydCDigJQgc2lsZW50bHkgbm8tb3AgKi9cbiAgICAgIH1cbiAgICB9KSgpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjYW5jZWxsZWQgPSB0cnVlO1xuICAgIH07XG4gIH0sIFtmaWxlXSk7XG5cbiAgLy8gU29ydGVkIGJ5IGBjcmVhdGVkYCBhc2Mgc28gc2VxdWVuY2UgbnVtYmVycyBhcmUgc3RhYmxlIHBlciBjYW52YXMgYWNyb3NzXG4gIC8vIHJlbG9hZHMuIFJlc29sdmVkIGNvbW1lbnRzIGFyZSBoaWRkZW4gYnkgZGVmYXVsdCAoVGFzayAyIHNwZWMpLlxuICBjb25zdCB2aXNpYmxlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgbGlzdCA9IGNvbW1lbnRzLnNsaWNlKCkuc29ydCgoYSwgYikgPT4gYS5jcmVhdGVkLmxvY2FsZUNvbXBhcmUoYi5jcmVhdGVkKSk7XG4gICAgcmV0dXJuIGxpc3QuZmlsdGVyKChjKSA9PiBjLnN0YXR1cyAhPT0gJ3Jlc29sdmVkJyk7XG4gIH0sIFtjb21tZW50c10pO1xuXG4gIC8vIFNlcXVlbmNlIGluZGV4IGxvb2t1cCDigJQgYnVpbHQgb2ZmIHRoZSBGVUxMIHNvcnRlZCBsaXN0IHNvIGEgcmVzb2x2ZWQtdGhlbi1cbiAgLy8gcmVvcGVuZWQgcGluIGtlZXBzIGl0cyBvcmlnaW5hbCBudW1iZXIuXG4gIGNvbnN0IGluZGV4QnlJZCA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IG0gPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIGNvbnN0IGFsbCA9IGNvbW1lbnRzLnNsaWNlKCkuc29ydCgoYSwgYikgPT4gYS5jcmVhdGVkLmxvY2FsZUNvbXBhcmUoYi5jcmVhdGVkKSk7XG4gICAgYWxsLmZvckVhY2goKGMsIGkpID0+IHtcbiAgICAgIG0uc2V0KGMuaWQsIGkgKyAxKTtcbiAgICB9KTtcbiAgICByZXR1cm4gbTtcbiAgfSwgW2NvbW1lbnRzXSk7XG5cbiAgY29uc3QgaGFuZGxlUGluQ2xpY2sgPSB1c2VDYWxsYmFjayhcbiAgICAoaWQ6IHN0cmluZykgPT4ge1xuICAgICAgc2V0Rm9jdXNlZElkKGlkKTtcbiAgICAgIG1pcnJvclNlbGVjdGlvbihjb21tZW50cy5maW5kKChjKSA9PiBjLmlkID09PSBpZCkpO1xuICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG4gICAgICB0cnkge1xuICAgICAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKHsgZGduOiAnY29tbWVudC1jbGljaycsIGlkIH0sICcqJyk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogcGFyZW50IGRldGFjaGVkICovXG4gICAgICB9XG4gICAgfSxcbiAgICBbY29tbWVudHMsIG1pcnJvclNlbGVjdGlvbl1cbiAgKTtcblxuICBjb25zdCBoYW5kbGVQYXRjaCA9IHVzZUNhbGxiYWNrKChpZDogc3RyaW5nLCBwYXRjaDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZSh7IGRnbjogJ2NvbW1lbnQtcGF0Y2gnLCBpZCwgcGF0Y2ggfSwgJyonKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8qIHBhcmVudCBkZXRhY2hlZCAqL1xuICAgIH1cbiAgfSwgW10pO1xuXG4gIGNvbnN0IGhhbmRsZURlbGV0ZSA9IHVzZUNhbGxiYWNrKChpZDogc3RyaW5nKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UoeyBkZ246ICdjb21tZW50LWRlbGV0ZScsIGlkIH0sICcqJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvKiBwYXJlbnQgZGV0YWNoZWQgKi9cbiAgICB9XG4gICAgc2V0Rm9jdXNlZElkKChwcmV2KSA9PiAocHJldiA9PT0gaWQgPyBudWxsIDogcHJldikpO1xuICB9LCBbXSk7XG5cbiAgY29uc3QgaGFuZGxlUmVwbHkgPSB1c2VDYWxsYmFjayhhc3luYyAoaWQ6IHN0cmluZywgYm9keTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgaWYgKHR5cGVvZiBmZXRjaCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgciA9IGF3YWl0IGZldGNoKGAvX2FwaS9jb21tZW50cy8ke2VuY29kZVVSSUNvbXBvbmVudChpZCl9L3JlcGx5YCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYm9keSB9KSxcbiAgICAgIH0pO1xuICAgICAgaWYgKCFyLm9rKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCB1cGRhdGVkID0gKGF3YWl0IHIuanNvbigpKSBhcyBPdmVybGF5Q29tbWVudDtcbiAgICAgIC8vIE9wdGltaXN0aWMgbG9jYWwgbWVyZ2Ug4oCUIHRoZSBzaGVsbCB3aWxsIGJyb2FkY2FzdCBgY29tbWVudHMtc2V0YFxuICAgICAgLy8gc2hvcnRseSBhZnRlciBhcyB0aGUgV1MgZmFucyBvdXQgdGhlIGNoYW5nZSwgYnV0IGFwcGx5aW5nIGl0IG5vd1xuICAgICAgLy8gYXZvaWRzIHRoZSBwb3BvdmVyIGZsaWNrZXJpbmcgZW1wdHkgYmV0d2VlbiBzdWJtaXQgKyBicm9hZGNhc3QuXG4gICAgICBzZXRDb21tZW50cygocHJldikgPT4gcHJldi5tYXAoKGMpID0+IChjLmlkID09PSB1cGRhdGVkLmlkID8gdXBkYXRlZCA6IGMpKSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sIFtdKTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiY20tbGF5ZXJcIiBhcmlhLWhpZGRlbj17ZmFsc2V9PlxuICAgICAge3Zpc2libGUubWFwKChjKSA9PiB7XG4gICAgICAgIGNvbnN0IG4gPSBpbmRleEJ5SWQuZ2V0KGMuaWQpID8/IDA7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPENvbW1lbnRQaW5cbiAgICAgICAgICAgIGtleT17Yy5pZH1cbiAgICAgICAgICAgIGNvbW1lbnQ9e2N9XG4gICAgICAgICAgICBzZXF1ZW5jZT17bn1cbiAgICAgICAgICAgIGZvY3VzZWQ9e2ZvY3VzZWRJZCA9PT0gYy5pZH1cbiAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZVBpbkNsaWNrfVxuICAgICAgICAgIC8+XG4gICAgICAgICk7XG4gICAgICB9KX1cbiAgICAgIHtjb21wb3NlciA/IChcbiAgICAgICAgPENvbW1lbnRDb21wb3NlciBzdGF0ZT17Y29tcG9zZXJ9IG9uU3VibWl0PXtzdWJtaXRDb21wb3Nlcn0gb25DYW5jZWw9e2Nsb3NlQ29tcG9zZXJ9IC8+XG4gICAgICApIDogbnVsbH1cbiAgICAgIHsoKCkgPT4ge1xuICAgICAgICBpZiAoIWZvY3VzZWRJZCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IGZvY3VzZWQgPSB2aXNpYmxlLmZpbmQoKGMpID0+IGMuaWQgPT09IGZvY3VzZWRJZCk7XG4gICAgICAgIGlmICghZm9jdXNlZCkgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPENvbW1lbnRUaHJlYWRcbiAgICAgICAgICAgIGNvbW1lbnQ9e2ZvY3VzZWR9XG4gICAgICAgICAgICBzZXF1ZW5jZT17aW5kZXhCeUlkLmdldChmb2N1c2VkLmlkKSA/PyAwfVxuICAgICAgICAgICAgb25DbG9zZT17KCkgPT4ge1xuICAgICAgICAgICAgICBzZXRGb2N1c2VkSWQobnVsbCk7XG4gICAgICAgICAgICAgIC8vIERyb3AgdGhlIGNhbnZhcyBoYWxvIHdoZW4gdGhlIHRocmVhZCBjbG9zZXMg4oCUIHN5bW1ldHJpYyB3aXRoXG4gICAgICAgICAgICAgIC8vIGBoYW5kbGVQaW5DbGlja2Agd2hpY2ggcGFpbnRzIGl0IG9uIG9wZW4uXG4gICAgICAgICAgICAgIHNlbFNldD8uY2xlYXIoKTtcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICBvblBhdGNoPXsocGF0Y2gpID0+IGhhbmRsZVBhdGNoKGZvY3VzZWQuaWQsIHBhdGNoKX1cbiAgICAgICAgICAgIG9uRGVsZXRlPXsoKSA9PiBoYW5kbGVEZWxldGUoZm9jdXNlZC5pZCl9XG4gICAgICAgICAgICBvblJlcGx5PXsoYm9keSkgPT4gaGFuZGxlUmVwbHkoZm9jdXNlZC5pZCwgYm9keSl9XG4gICAgICAgICAgLz5cbiAgICAgICAgKTtcbiAgICAgIH0pKCl9XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gTWVudGlvbkF3YXJlVGV4dGFyZWEgKyBwb3B1cCDigJQgVGFzayA1XG4vL1xuLy8gV3JhcHMgYSB0ZXh0YXJlYSBhbmQgc3VyZmFjZXMgYW4gYXV0b2NvbXBsZXRlIHBvcHVwIHdoZW4gdGhlIGNhcmV0IHNpdHNcbi8vIGluc2lkZSBhbiBgQDxxdWVyeT5gIHRva2VuIChubyB3aGl0ZXNwYWNlIGJldHdlZW4gYEBgIGFuZCBjdXJzb3IpLiBUaGVcbi8vIGNvbW1pdHRlciBsaXN0IGlzIGZldGNoZWQgb25jZSBvbiBmaXJzdCBmb2N1cyBhbmQgY2FjaGVkIGZvciB0aGUgc2Vzc2lvbi5cbi8vIEtleWJvYXJkOiDihpHihpMgbW92ZSwg4oa1L1RhYiBpbnNlcnQgKGBAZmlyc3RuYW1lIGApLCBFc2MgZGlzbWlzcy5cblxuaW50ZXJmYWNlIENvbW1pdHRlclJvdyB7XG4gIG5hbWU6IHN0cmluZztcbiAgZW1haWw6IHN0cmluZztcbiAgY29tbWl0czogbnVtYmVyO1xufVxuXG5sZXQgY29tbWl0dGVyQ2FjaGU6IFByb21pc2U8Q29tbWl0dGVyUm93W10+IHwgbnVsbCA9IG51bGw7XG5hc3luYyBmdW5jdGlvbiBsb2FkQ29tbWl0dGVycygpOiBQcm9taXNlPENvbW1pdHRlclJvd1tdPiB7XG4gIGlmICghY29tbWl0dGVyQ2FjaGUpIHtcbiAgICBjb21taXR0ZXJDYWNoZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgZmV0Y2goJy9fYXBpL2dpdC1jb21taXR0ZXJzJyk7XG4gICAgICAgIGlmICghci5vaykgcmV0dXJuIFtdO1xuICAgICAgICBjb25zdCBkYXRhID0gKGF3YWl0IHIuanNvbigpKSBhcyB7IGNvbW1pdHRlcnM/OiBDb21taXR0ZXJSb3dbXSB9O1xuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShkYXRhLmNvbW1pdHRlcnMpID8gZGF0YS5jb21taXR0ZXJzIDogW107XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgIH0pKCk7XG4gIH1cbiAgcmV0dXJuIGNvbW1pdHRlckNhY2hlO1xufVxuXG5mdW5jdGlvbiBmaXJzdE5hbWVTbHVnKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIGBAZmlyc3RuYW1lYCBpcyB3aGF0IHdlIGluc2VydCBvbiBhY2NlcHQuIFN0cmlwIHN1cm5hbWVzICsgcHVuY3R1YXRpb24uXG4gIGNvbnN0IGZpcnN0ID0gbmFtZS50cmltKCkuc3BsaXQoL1xccysvKVswXSA/PyAnJztcbiAgLy8gS2VlcCBhbHBoYW51bSArIGAuYCBgLWAgYF9gIChtYXRjaGVzIHRoZSBwYXJzZU1lbnRpb25zIHJlZ2V4IG9uIHRoZSBzZXJ2ZXIpLlxuICByZXR1cm4gZmlyc3QucmVwbGFjZSgvW15cXHcuLV0vZywgJycpLnRvTG93ZXJDYXNlKCk7XG59XG5cbmludGVyZmFjZSBNZW50aW9uVG9rZW4ge1xuICBzdGFydDogbnVtYmVyOyAvLyBpbmRleCBvZiBgQGBcbiAgZW5kOiBudW1iZXI7IC8vIGV4Y2x1c2l2ZSDigJQgY3VycmVudCBjYXJldFxuICBxdWVyeTogc3RyaW5nOyAvLyBjaGFycyBiZXR3ZWVuIGBAYCBhbmQgY2FyZXQgKGV4Y2x1ZGluZyBgQGApXG59XG5cbmZ1bmN0aW9uIGRldGVjdE1lbnRpb25Ub2tlbih0ZXh0OiBzdHJpbmcsIGNhcmV0OiBudW1iZXIpOiBNZW50aW9uVG9rZW4gfCBudWxsIHtcbiAgaWYgKGNhcmV0IDw9IDAgfHwgY2FyZXQgPiB0ZXh0Lmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gIC8vIFdhbGsgYmFja3dhcmRzIGZyb20gY2FyZXQ7IHRoZSB0b2tlbiBzdGFydHMgYXQgYEBgIGFuZCBlbmRzIGF0IHRoZSBjYXJldC5cbiAgLy8gQWJvcnRzIG9uIHdoaXRlc3BhY2UsIG5ld2xpbmUsIG9yIGFueSBub24tbWVudGlvbiBjaGFyIHNvIGEgc3RyYXkgYEBgIGluXG4gIC8vIGFuIGVtYWlsIGlzIGlnbm9yZWQuXG4gIGxldCBpID0gY2FyZXQgLSAxO1xuICB3aGlsZSAoaSA+PSAwKSB7XG4gICAgY29uc3QgY2ggPSB0ZXh0W2ldID8/ICcnO1xuICAgIGlmIChjaCA9PT0gJ0AnKSB7XG4gICAgICAvLyBUb2tlbiBtdXN0IGJlIHdvcmQtbGVhZGluZzogcHJldmlvdXMgY2hhciBpcyBzdGFydC1vZi1zdHJpbmcgb3Igd2hpdGVzcGFjZS5cbiAgICAgIGNvbnN0IHByZXYgPSBpID4gMCA/IHRleHRbaSAtIDFdIDogJyc7XG4gICAgICBpZiAoaSA9PT0gMCB8fCAvXFxzLy50ZXN0KHByZXYgPz8gJycpKSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gdGV4dC5zbGljZShpICsgMSwgY2FyZXQpO1xuICAgICAgICByZXR1cm4geyBzdGFydDogaSwgZW5kOiBjYXJldCwgcXVlcnkgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoIS9bXFx3Li1dLy50ZXN0KGNoKSkgcmV0dXJuIG51bGw7XG4gICAgaSAtPSAxO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBNZW50aW9uQXdhcmVUZXh0YXJlYSh7XG4gIGNsYXNzTmFtZSxcbiAgdmFsdWUsXG4gIG9uQ2hhbmdlLFxuICBvbktleURvd24sXG4gIHBsYWNlaG9sZGVyLFxuICByb3dzLFxuICBkaXNhYmxlZCxcbiAgdGV4dGFyZWFSZWYsXG4gIGFyaWFMYWJlbCxcbn06IHtcbiAgY2xhc3NOYW1lOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIG9uQ2hhbmdlOiAobmV4dDogc3RyaW5nKSA9PiB2b2lkO1xuICBvbktleURvd24/OiAoZTogUmVhY3QuS2V5Ym9hcmRFdmVudDxIVE1MVGV4dEFyZWFFbGVtZW50PikgPT4gdm9pZDtcbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIHJvd3M/OiBudW1iZXI7XG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgdGV4dGFyZWFSZWY/OiBSZWFjdC5NdXRhYmxlUmVmT2JqZWN0PEhUTUxUZXh0QXJlYUVsZW1lbnQgfCBudWxsPjtcbiAgYXJpYUxhYmVsPzogc3RyaW5nO1xufSk6IFJlYWN0LlJlYWN0RWxlbWVudCB7XG4gIGNvbnN0IGludGVybmFsUmVmID0gdXNlUmVmPEhUTUxUZXh0QXJlYUVsZW1lbnQgfCBudWxsPihudWxsKTtcbiAgY29uc3Qgc2V0UmVmID0gdXNlQ2FsbGJhY2soXG4gICAgKGVsOiBIVE1MVGV4dEFyZWFFbGVtZW50IHwgbnVsbCkgPT4ge1xuICAgICAgaW50ZXJuYWxSZWYuY3VycmVudCA9IGVsO1xuICAgICAgaWYgKHRleHRhcmVhUmVmKSB0ZXh0YXJlYVJlZi5jdXJyZW50ID0gZWw7XG4gICAgfSxcbiAgICBbdGV4dGFyZWFSZWZdXG4gICk7XG5cbiAgY29uc3QgW2NvbW1pdHRlcnMsIHNldENvbW1pdHRlcnNdID0gdXNlU3RhdGU8Q29tbWl0dGVyUm93W10+KFtdKTtcbiAgY29uc3QgW3Rva2VuLCBzZXRUb2tlbl0gPSB1c2VTdGF0ZTxNZW50aW9uVG9rZW4gfCBudWxsPihudWxsKTtcbiAgY29uc3QgW2hpZ2hsaWdodCwgc2V0SGlnaGxpZ2h0XSA9IHVzZVN0YXRlKDApO1xuXG4gIC8vIExhenktbG9hZCBjb21taXR0ZXJzIG9uIGZpcnN0IGZvY3VzLlxuICBjb25zdCBvbkZvY3VzID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGlmIChjb21taXR0ZXJzLmxlbmd0aCA+IDApIHJldHVybjtcbiAgICB2b2lkIGxvYWRDb21taXR0ZXJzKCkudGhlbigobGlzdCkgPT4gc2V0Q29tbWl0dGVycyhsaXN0KSk7XG4gIH0sIFtjb21taXR0ZXJzLmxlbmd0aF0pO1xuXG4gIGNvbnN0IGZpbHRlcmVkID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKCF0b2tlbikgcmV0dXJuIFtdIGFzIENvbW1pdHRlclJvd1tdO1xuICAgIGNvbnN0IHEgPSB0b2tlbi5xdWVyeS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGxpc3QgPSAhcVxuICAgICAgPyBjb21taXR0ZXJzXG4gICAgICA6IGNvbW1pdHRlcnMuZmlsdGVyKFxuICAgICAgICAgIChjKSA9PiBjLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSB8fCBjLmVtYWlsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSlcbiAgICAgICAgKTtcbiAgICByZXR1cm4gbGlzdC5zbGljZSgwLCA4KTtcbiAgfSwgW3Rva2VuLCBjb21taXR0ZXJzXSk7XG5cbiAgY29uc3QgcmVmcmVzaFRva2VuID0gdXNlQ2FsbGJhY2soKHRleHRhcmVhOiBIVE1MVGV4dEFyZWFFbGVtZW50KSA9PiB7XG4gICAgY29uc3QgY2FyZXQgPSB0ZXh0YXJlYS5zZWxlY3Rpb25TdGFydCA/PyB0ZXh0YXJlYS52YWx1ZS5sZW5ndGg7XG4gICAgY29uc3QgdCA9IGRldGVjdE1lbnRpb25Ub2tlbih0ZXh0YXJlYS52YWx1ZSwgY2FyZXQpO1xuICAgIHNldFRva2VuKHQpO1xuICAgIHNldEhpZ2hsaWdodCgwKTtcbiAgfSwgW10pO1xuXG4gIGNvbnN0IGhhbmRsZUNoYW5nZSA9IHVzZUNhbGxiYWNrKFxuICAgIChlOiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MVGV4dEFyZWFFbGVtZW50PikgPT4ge1xuICAgICAgb25DaGFuZ2UoZS50YXJnZXQudmFsdWUpO1xuICAgICAgcmVmcmVzaFRva2VuKGUudGFyZ2V0KTtcbiAgICB9LFxuICAgIFtvbkNoYW5nZSwgcmVmcmVzaFRva2VuXVxuICApO1xuXG4gIGNvbnN0IGluc2VydE1lbnRpb24gPSB1c2VDYWxsYmFjayhcbiAgICAoY29tbWl0dGVyOiBDb21taXR0ZXJSb3cpID0+IHtcbiAgICAgIGlmICghdG9rZW4pIHJldHVybjtcbiAgICAgIGNvbnN0IHRhID0gaW50ZXJuYWxSZWYuY3VycmVudDtcbiAgICAgIGlmICghdGEpIHJldHVybjtcbiAgICAgIGNvbnN0IHRhZyA9IGBAJHtmaXJzdE5hbWVTbHVnKGNvbW1pdHRlci5uYW1lKX1gO1xuICAgICAgY29uc3QgbmV4dCA9IGAke3ZhbHVlLnNsaWNlKDAsIHRva2VuLnN0YXJ0KX0ke3RhZ30gJHt2YWx1ZS5zbGljZSh0b2tlbi5lbmQpfWA7XG4gICAgICBvbkNoYW5nZShuZXh0KTtcbiAgICAgIHNldFRva2VuKG51bGwpO1xuICAgICAgLy8gUmVzdG9yZSBjYXJldCBqdXN0IHBhc3QgdGhlIGluc2VydGVkIHRva2VuICsgdHJhaWxpbmcgc3BhY2UuXG4gICAgICBjb25zdCBuZXdDYXJldCA9IHRva2VuLnN0YXJ0ICsgdGFnLmxlbmd0aCArIDE7XG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICB0YS5mb2N1cygpO1xuICAgICAgICB0YS5zZXRTZWxlY3Rpb25SYW5nZShuZXdDYXJldCwgbmV3Q2FyZXQpO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBbdG9rZW4sIHZhbHVlLCBvbkNoYW5nZV1cbiAgKTtcblxuICBjb25zdCBoYW5kbGVLZXlEb3duID0gdXNlQ2FsbGJhY2soXG4gICAgKGU6IFJlYWN0LktleWJvYXJkRXZlbnQ8SFRNTFRleHRBcmVhRWxlbWVudD4pID0+IHtcbiAgICAgIGlmICh0b2tlbiAmJiBmaWx0ZXJlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmIChlLmtleSA9PT0gJ0Fycm93RG93bicpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgc2V0SGlnaGxpZ2h0KChoKSA9PiAoaCArIDEpICUgZmlsdGVyZWQubGVuZ3RoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGUua2V5ID09PSAnQXJyb3dVcCcpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgc2V0SGlnaGxpZ2h0KChoKSA9PiAoaCAtIDEgKyBmaWx0ZXJlZC5sZW5ndGgpICUgZmlsdGVyZWQubGVuZ3RoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInIHx8IGUua2V5ID09PSAnVGFiJykge1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBjb25zdCBwaWNrID0gZmlsdGVyZWRbaGlnaGxpZ2h0XSA/PyBmaWx0ZXJlZFswXTtcbiAgICAgICAgICBpZiAocGljaykgaW5zZXJ0TWVudGlvbihwaWNrKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBzZXRUb2tlbihudWxsKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG9uS2V5RG93bj8uKGUpO1xuICAgIH0sXG4gICAgW3Rva2VuLCBmaWx0ZXJlZCwgaGlnaGxpZ2h0LCBpbnNlcnRNZW50aW9uLCBvbktleURvd25dXG4gICk7XG5cbiAgY29uc3QgaGFuZGxlU2VsZWN0ID0gdXNlQ2FsbGJhY2soXG4gICAgKGU6IFJlYWN0LlN5bnRoZXRpY0V2ZW50PEhUTUxUZXh0QXJlYUVsZW1lbnQ+KSA9PiB7XG4gICAgICByZWZyZXNoVG9rZW4oZS5jdXJyZW50VGFyZ2V0KTtcbiAgICB9LFxuICAgIFtyZWZyZXNoVG9rZW5dXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IHN0eWxlPXt7IHBvc2l0aW9uOiAncmVsYXRpdmUnIH19PlxuICAgICAgPHRleHRhcmVhXG4gICAgICAgIHJlZj17c2V0UmVmfVxuICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZX1cbiAgICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICAgIHJvd3M9e3Jvd3N9XG4gICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgYXJpYS1sYWJlbD17YXJpYUxhYmVsfVxuICAgICAgICBvbkNoYW5nZT17aGFuZGxlQ2hhbmdlfVxuICAgICAgICBvbktleURvd249e2hhbmRsZUtleURvd259XG4gICAgICAgIG9uRm9jdXM9e29uRm9jdXN9XG4gICAgICAgIG9uU2VsZWN0PXtoYW5kbGVTZWxlY3R9XG4gICAgICAgIG9uQ2xpY2s9e2hhbmRsZVNlbGVjdH1cbiAgICAgIC8+XG4gICAgICB7LyogQ29tYm9ib3ggcGF0dGVybiDigJQgYHJvbGU9XCJsaXN0Ym94XCJgICsgYHJvbGU9XCJvcHRpb25cImAgaXMgdGhlIGNhbm9uaWNhbFxuICAgICAgICogQVJJQSBzaGFwZSBmb3IgYSBzaW5nbGUtc2VsZWN0IGF1dG9jb21wbGV0ZS4gS2V5Ym9hcmQgbmF2aWdhdGlvblxuICAgICAgICogKOKGkSDihpMgRW50ZXIgRXNjKSBsaXZlcyBvbiB0aGUgcGFyZW50IHRleHRhcmVhIHBlciB0aGUgY29tYm9ib3ggc3BlYyxcbiAgICAgICAqIHNvIHRoZSBwb3B1cCBpdHNlbGYgc3RheXMgaW5lcnQuIFNhbWUgcGF0dGVybiBhcHBsaWVzIHRvIHRoZSBjb21wb3NlclxuICAgICAgICogKyB0aHJlYWQgcG9wb3ZlcnMgYmVsb3cgKGByb2xlPVwiZGlhbG9nXCJgIG9uIGEgcG9zaXRpb25lZCA8ZGl2PikuXG4gICAgICAgKiBCaW9tZSdzIGExMXkgcnVsZXMgd2FudCBzZW1hbnRpYyBIVE1MIHByaW1pdGl2ZXMsIGJ1dCBub25lIG1hdGNoXG4gICAgICAgKiBcIm5vbi1mb2N1c2FibGUgbGlzdGJveCB1bmRlciBhIHRleHRhcmVhXCIgb3IgXCJhbmNob3JlZCBub24tbW9kYWwgcG9wb3ZlclwiLlxuICAgICAgICogVGhlIGZvdXIgYWZmZWN0ZWQgcnVsZXMgYXJlIHNjb3BlZCBvZmYgZm9yIHRoaXMgZmlsZSBpbiBiaW9tZS5qc29uLiAqL31cbiAgICAgIHt0b2tlbiAmJiBmaWx0ZXJlZC5sZW5ndGggPiAwID8gKFxuICAgICAgICA8dWxcbiAgICAgICAgICBjbGFzc05hbWU9XCJjbS1tZW50aW9uLXBvcHVwXCJcbiAgICAgICAgICByb2xlPVwibGlzdGJveFwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIk1lbnRpb24gc3VnZ2VzdGlvbnNcIlxuICAgICAgICAgIHN0eWxlPXt7IGxlZnQ6IDAsIHRvcDogJzEwMCUnIH19XG4gICAgICAgID5cbiAgICAgICAgICB7ZmlsdGVyZWQubWFwKChjLCBpKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IGkgPT09IGhpZ2hsaWdodDtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICAgIGtleT17YCR7Yy5uYW1lfS0ke2MuZW1haWx9YH1cbiAgICAgICAgICAgICAgICByb2xlPVwib3B0aW9uXCJcbiAgICAgICAgICAgICAgICBhcmlhLXNlbGVjdGVkPXtzZWxlY3RlZH1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJjbS1tZW50aW9uLXBvcHVwX19pdGVtXCJcbiAgICAgICAgICAgICAgICBvbk1vdXNlRW50ZXI9eygpID0+IHNldEhpZ2hsaWdodChpKX1cbiAgICAgICAgICAgICAgICAvLyBVc2UgbW91c2Vkb3duIHNvIHRoZSB0ZXh0YXJlYSBkb2Vzbid0IGJsdXIgYmVmb3JlIHRoZVxuICAgICAgICAgICAgICAgIC8vIHNlbGVjdGlvbiByZWdpc3RlcnMuXG4gICAgICAgICAgICAgICAgb25Nb3VzZURvd249eyhldikgPT4ge1xuICAgICAgICAgICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgIGluc2VydE1lbnRpb24oYyk7XG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImNtLW1lbnRpb24tcG9wdXBfX25hbWVcIj5Ae2ZpcnN0TmFtZVNsdWcoYy5uYW1lKX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiY20tbWVudGlvbi1wb3B1cF9fZW1haWxcIj57Yy5lbWFpbH08L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pfVxuICAgICAgICA8L3VsPlxuICAgICAgKSA6IG51bGx9XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gQ29tbWVudFBpbiDigJQgc2luZ2xlIDI0w5cyNCBiYWRnZSBhbmNob3JlZCB0byB0b3AtcmlnaHQgb2YgaXRzIHRhcmdldCBlbGVtZW50LlxuLy8gUmVzb2x2ZXMgdGFyZ2V0IG9uIGV2ZXJ5IGFuaW1hdGlvbiBmcmFtZSB0byB0cmFjayBsYXlvdXQgc2hpZnRzIChkcmFnLFxuLy8gcmVmbG93LCBmb250IGxvYWQpLiBGYWxscyBiYWNrIHRvIHRoZSBzdG9yZWQgYGJvdW5kc2Agd2hlbiB0aGUgdGFyZ2V0IGlzXG4vLyBnb25lIGZyb20gdGhlIERPTS5cblxuZnVuY3Rpb24gQ29tbWVudFBpbih7XG4gIGNvbW1lbnQsXG4gIHNlcXVlbmNlLFxuICBmb2N1c2VkLFxuICBvbkNsaWNrLFxufToge1xuICBjb21tZW50OiBPdmVybGF5Q29tbWVudDtcbiAgc2VxdWVuY2U6IG51bWJlcjtcbiAgZm9jdXNlZDogYm9vbGVhbjtcbiAgb25DbGljazogKGlkOiBzdHJpbmcpID0+IHZvaWQ7XG59KSB7XG4gIGNvbnN0IHJlZiA9IHVzZVJlZjxIVE1MQnV0dG9uRWxlbWVudCB8IG51bGw+KG51bGwpO1xuICBjb25zdCByYWZSZWYgPSB1c2VSZWY8bnVtYmVyIHwgbnVsbD4obnVsbCk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCB0aWNrID0gKCkgPT4ge1xuICAgICAgcmFmUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgY29uc3QgcGluID0gcmVmLmN1cnJlbnQ7XG4gICAgICBpZiAoIXBpbikgcmV0dXJuO1xuXG4gICAgICAvLyBMaXZlIHNjcmVlbi1jb29yZCBsb29rdXAgbWlycm9ycyBTZWxlY3Rpb25IYWxvcyBpbiBjYW52YXMtc2hlbGwudHN4LlxuICAgICAgLy8gRmFsbHMgYmFjayB0byBzdG9yZWQgYm91bmRzIChhIHNjcmVlbi1jb29yZCBjYXB0dXJlIGF0IGNyZWF0ZSB0aW1lKVxuICAgICAgLy8gd2hlbiB0aGUgdGFyZ2V0IGVsZW1lbnQgaXMgZ29uZSDigJQgYmV0dGVyIHRoYW4gdmFuaXNoaW5nIGVudGlyZWx5LlxuICAgICAgbGV0IHBvcyA9IHNjcmVlblJlY3RGb3IoY29tbWVudC5zZWxlY3RvciwgY29tbWVudC5pbmRleCk7XG4gICAgICBpZiAoIXBvcyAmJiBjb21tZW50LmJvdW5kcykge1xuICAgICAgICBwb3MgPSB7XG4gICAgICAgICAgeDogY29tbWVudC5ib3VuZHMueCxcbiAgICAgICAgICB5OiBjb21tZW50LmJvdW5kcy55LFxuICAgICAgICAgIHc6IGNvbW1lbnQuYm91bmRzLncsXG4gICAgICAgICAgaDogY29tbWVudC5ib3VuZHMuaCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmICghcG9zKSB7XG4gICAgICAgIHBpbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICByYWZSZWYuY3VycmVudCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aWNrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcGluLnN0eWxlLmRpc3BsYXkgPSAnZ3JpZCc7XG4gICAgICAvLyBQb3NpdGlvbiB0aGUgcGluJ3MgY2VudGVyIGF0IChyaWdodCAtIDEyLCB0b3AgLSAxMikg4oCUIHRoZSBGaWdKYW1cbiAgICAgIC8vIGNvbnZlbnRpb24uIDEyID0gaGFsZiBvZiAyNCAodGhlIHBpbidzIG93biBzaXplKS5cbiAgICAgIGNvbnN0IGxlZnQgPSBNYXRoLnJvdW5kKHBvcy54ICsgcG9zLncgLSAxMik7XG4gICAgICBjb25zdCB0b3AgPSBNYXRoLnJvdW5kKHBvcy55IC0gMTIpO1xuICAgICAgcGluLnN0eWxlLmxlZnQgPSBgJHtsZWZ0fXB4YDtcbiAgICAgIHBpbi5zdHlsZS50b3AgPSBgJHt0b3B9cHhgO1xuICAgICAgcmFmUmVmLmN1cnJlbnQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGljayk7XG4gICAgfTtcbiAgICByYWZSZWYuY3VycmVudCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aWNrKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaWYgKHJhZlJlZi5jdXJyZW50ICE9IG51bGwpIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHJhZlJlZi5jdXJyZW50KTtcbiAgICB9O1xuICB9LCBbY29tbWVudC5zZWxlY3RvciwgY29tbWVudC5ib3VuZHMsIGNvbW1lbnQuaW5kZXhdKTtcblxuICBjb25zdCBhdXRob3IgPSBjb21tZW50LmF1dGhvcj8udHJpbSgpIHx8ICd1bmtub3duJztcbiAgY29uc3QgbGFiZWwgPSBgQ29tbWVudCAke3NlcXVlbmNlfSBieSAke2F1dGhvcn1gO1xuXG4gIHJldHVybiAoXG4gICAgPGJ1dHRvblxuICAgICAgcmVmPXtyZWZ9XG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGNsYXNzTmFtZT1cImNtLXBpblwiXG4gICAgICBkYXRhLXJlc29sdmVkPXtjb21tZW50LnN0YXR1cyA9PT0gJ3Jlc29sdmVkJyA/ICd0cnVlJyA6ICdmYWxzZSd9XG4gICAgICBkYXRhLWZvY3VzZWQ9e2ZvY3VzZWQgPyAndHJ1ZScgOiAnZmFsc2UnfVxuICAgICAgZGF0YS1jb21tZW50LXBpbj17Y29tbWVudC5pZH1cbiAgICAgIGFyaWEtbGFiZWw9e2xhYmVsfVxuICAgICAgYXJpYS1leHBhbmRlZD17Zm9jdXNlZH1cbiAgICAgIHRpdGxlPXtjb21tZW50LnRleHQuc2xpY2UoMCwgMjAwKX1cbiAgICAgIG9uQ2xpY2s9eyhlKSA9PiB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgb25DbGljayhjb21tZW50LmlkKTtcbiAgICAgIH19XG4gICAgPlxuICAgICAge3NlcXVlbmNlfVxuICAgIDwvYnV0dG9uPlxuICApO1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIENvbW1lbnRDb21wb3NlciDigJQgRFMtc3R5bGVkIGNhcmQgYW5jaG9yZWQganVzdCB1bmRlciB0aGUgY2xpY2tlZCBlbGVtZW50XG4vLyAob3IgYXQgdGhlIGNsaWNrIHBvaW50IGlmIHRoZSBjbGljayBoaXQgZW1wdHkgY2FudmFzKS4gRWRnZS1jbGFtcCBpcyB0aGVcbi8vIHByYWdtYXRpYyBraW5kOiBwb3NpdGlvbiBpcyBjb21wdXRlZCBvbmNlIG9uIG9wZW4gYWdhaW5zdCB0aGUgd29ybGQgbGF5b3V0LFxuLy8gbm90IGNoYXNlZCBvbiBwYW4vem9vbSDigJQgdGhlIHVzZXIgaXMgYWN0aXZlbHkgdHlwaW5nLlxuXG5mdW5jdGlvbiBDb21tZW50Q29tcG9zZXIoe1xuICBzdGF0ZSxcbiAgb25TdWJtaXQsXG4gIG9uQ2FuY2VsLFxufToge1xuICBzdGF0ZTogQ29tcG9zZXJTdGF0ZTtcbiAgb25TdWJtaXQ6ICh0ZXh0OiBzdHJpbmcpID0+IHZvaWQ7XG4gIG9uQ2FuY2VsOiAoKSA9PiB2b2lkO1xufSkge1xuICBjb25zdCBbdGV4dCwgc2V0VGV4dF0gPSB1c2VTdGF0ZSgnJyk7XG4gIGNvbnN0IHRleHRhcmVhUmVmID0gdXNlUmVmPEhUTUxUZXh0QXJlYUVsZW1lbnQgfCBudWxsPihudWxsKTtcbiAgY29uc3QgY2FyZFJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudCB8IG51bGw+KG51bGwpO1xuICBjb25zdCByYWZSZWYgPSB1c2VSZWY8bnVtYmVyIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gTGl2ZSBhbmNob3Ig4oCUIGNvbXBvc2VyIHRyYWNrcyB0aGUgdGFyZ2V0IGVsZW1lbnQgdmlhIHJBRiBzbyBwYW4vem9vbVxuICAvLyB3aGlsZSB0eXBpbmcga2VlcHMgdGhlIGNhcmQgZ2x1ZWQgdG8gaXRzIGFuY2hvci4gV3JpdGVzIGRpcmVjdGx5IHRvIHRoZVxuICAvLyBET00gc28gd2UgZG9uJ3QgcmUtcmVuZGVyIGV2ZXJ5IGZyYW1lLlxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHRpY2sgPSAoKSA9PiB7XG4gICAgICByYWZSZWYuY3VycmVudCA9IG51bGw7XG4gICAgICBjb25zdCBub2RlID0gY2FyZFJlZi5jdXJyZW50O1xuICAgICAgaWYgKCFub2RlKSByZXR1cm47XG4gICAgICBjb25zdCBhbmNob3IgPSBjb21wdXRlQW5jaG9yKHN0YXRlKTtcbiAgICAgIG5vZGUuc3R5bGUubGVmdCA9IGAke01hdGgucm91bmQoYW5jaG9yLngpfXB4YDtcbiAgICAgIG5vZGUuc3R5bGUudG9wID0gYCR7TWF0aC5yb3VuZChhbmNob3IueSl9cHhgO1xuICAgICAgcmFmUmVmLmN1cnJlbnQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGljayk7XG4gICAgfTtcbiAgICByYWZSZWYuY3VycmVudCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aWNrKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaWYgKHJhZlJlZi5jdXJyZW50ICE9IG51bGwpIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHJhZlJlZi5jdXJyZW50KTtcbiAgICB9O1xuICB9LCBbc3RhdGVdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHRleHRhcmVhUmVmLmN1cnJlbnQ/LmZvY3VzKCk7XG4gIH0sIFtdKTtcblxuICBjb25zdCB0cnlTdWJtaXQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgY29uc3QgdiA9IHRleHQudHJpbSgpO1xuICAgIGlmICghdikgcmV0dXJuO1xuICAgIG9uU3VibWl0KHYpO1xuICB9LCBbdGV4dCwgb25TdWJtaXRdKTtcblxuICBjb25zdCBvbktleURvd24gPSB1c2VDYWxsYmFjayhcbiAgICAoZTogUmVhY3QuS2V5Ym9hcmRFdmVudDxIVE1MVGV4dEFyZWFFbGVtZW50PikgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIG9uQ2FuY2VsKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICgoZS5tZXRhS2V5IHx8IGUuY3RybEtleSkgJiYgZS5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0cnlTdWJtaXQoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtvbkNhbmNlbCwgdHJ5U3VibWl0XVxuICApO1xuXG4gIC8vIENvbXBhY3Qgc2VsZWN0b3IgaGludCDigJQgc3RyaXAgbm9pc3kgc3RydWN0dXJhbCBiaXRzIHNvIHRoZSBoZWFkIHN0YXlzXG4gIC8vIHRpZ2h0IGluc2lkZSB0aGUgMzAwcHggY2FyZC5cbiAgY29uc3Qgc2VsZWN0b3JDaGlwID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgcyA9IHN0YXRlLnNlbGVjdGlvbi5zZWxlY3RvciB8fCAnJztcbiAgICBpZiAoIXMpIHJldHVybiBzdGF0ZS5zZWxlY3Rpb24udGFnIHx8ICdjYW52YXMnO1xuICAgIC8vIFtkYXRhLWNkLWlkPVwi4oCmXCJdIOKGkiBjZDo8aWQ+IMK3IGtlZXBzIHRoZSBjaGlwIHJlYWRhYmxlIHdoZW4gc3RhYmxlIGlkc1xuICAgIC8vIGFyZSBwcmVzZW50LlxuICAgIGNvbnN0IGNkID0gcy5tYXRjaCgvZGF0YS1jZC1pZD1cIihbXlwiXSspXCIvKTtcbiAgICBpZiAoY2QpIHJldHVybiBgY2Q6JHtjZFsxXX1gO1xuICAgIHJldHVybiBzLmxlbmd0aCA+IDM2ID8gYCR7cy5zbGljZSgwLCAzMyl94oCmYCA6IHM7XG4gIH0sIFtzdGF0ZS5zZWxlY3Rpb25dKTtcblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIHJlZj17Y2FyZFJlZn1cbiAgICAgIGNsYXNzTmFtZT1cImNtLWNvbXBvc2VyXCJcbiAgICAgIHJvbGU9XCJkaWFsb2dcIlxuICAgICAgYXJpYS1sYWJlbD1cIk5ldyBjb21tZW50XCJcbiAgICAgIG9uQ2xpY2s9eyhlKSA9PiBlLnN0b3BQcm9wYWdhdGlvbigpfVxuICAgICAgb25Qb2ludGVyRG93bj17KGUpID0+IGUuc3RvcFByb3BhZ2F0aW9uKCl9XG4gICAgPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJjbS1jb21wb3Nlcl9faGVhZFwiPlxuICAgICAgICA8c3Bhbj5OZXcgY29tbWVudDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiY20tY29tcG9zZXJfX3NlbGVjdG9yXCI+e3NlbGVjdG9yQ2hpcH08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxNZW50aW9uQXdhcmVUZXh0YXJlYVxuICAgICAgICB0ZXh0YXJlYVJlZj17dGV4dGFyZWFSZWZ9XG4gICAgICAgIGNsYXNzTmFtZT1cImNtLWNvbXBvc2VyX190ZXh0YXJlYVwiXG4gICAgICAgIHZhbHVlPXt0ZXh0fVxuICAgICAgICBwbGFjZWhvbGRlcj1cIlR5cGUgYSBjb21tZW50LiDijJjihrUgdG8gc2F2ZSDCtyBFc2MgdG8gY2FuY2VsIMK3IEBuYW1lIHRvIHRhZ1wiXG4gICAgICAgIG9uQ2hhbmdlPXtzZXRUZXh0fVxuICAgICAgICBvbktleURvd249e29uS2V5RG93bn1cbiAgICAgICAgcm93cz17M31cbiAgICAgICAgYXJpYUxhYmVsPVwiQ29tbWVudCBib2R5XCJcbiAgICAgIC8+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImNtLWNvbXBvc2VyX19hY3Rpb25zXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzTmFtZT1cImNtLWJ0blwiIG9uQ2xpY2s9e29uQ2FuY2VsfT5cbiAgICAgICAgICBDYW5jZWxcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzc05hbWU9XCJjbS1idG4gY20tYnRuLS1wcmltYXJ5XCJcbiAgICAgICAgICBkaXNhYmxlZD17IXRleHQudHJpbSgpfVxuICAgICAgICAgIG9uQ2xpY2s9e3RyeVN1Ym1pdH1cbiAgICAgICAgPlxuICAgICAgICAgIFNhdmVcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBDb21tZW50VGhyZWFkIOKAlCBwb3BvdmVyIGFuY2hvcmVkIHRvIHRoZSBmb2N1c2VkIHBpbi4gU2hvd3MgYXV0aG9yICsgcmVsYXRpdmVcbi8vIHRpbWUgKyBzZWxlY3RvciBjaGlwLCB0aGUgb3JpZ2luYWwgYm9keSB3aXRoIEBtZW50aW9ucyBib2xkZWQsIHJlcGxpZXMsIGFcbi8vIHJlcGx5IHRleHRhcmVhLCBhbmQgcmVzb2x2ZS9yZW9wZW4vZGVsZXRlIGFjdGlvbnMuIFBhdGNoZXMgKyBkZWxldGVzIHJvdXRlXG4vLyB0aHJvdWdoIHRoZSBzaGVsbCdzIGV4aXN0aW5nIFdTIGNoYW5uZWwgdmlhIHBvc3RNZXNzYWdlOyByZXBsaWVzIFBPU1Rcbi8vIGRpcmVjdGx5IHRvIGAvX2FwaS9jb21tZW50cy88aWQ+L3JlcGx5YCBiZWNhdXNlIHRoYXQgZW5kcG9pbnQgZXhpc3RzIG9ubHkgb25cbi8vIEJ1biBydW50aW1lIGFuZCBsaXZlcyBpbiBgaHR0cC50c2AuXG5cbmZ1bmN0aW9uIENvbW1lbnRUaHJlYWQoe1xuICBjb21tZW50LFxuICBzZXF1ZW5jZSxcbiAgb25DbG9zZSxcbiAgb25QYXRjaCxcbiAgb25EZWxldGUsXG4gIG9uUmVwbHksXG59OiB7XG4gIGNvbW1lbnQ6IE92ZXJsYXlDb21tZW50O1xuICBzZXF1ZW5jZTogbnVtYmVyO1xuICBvbkNsb3NlOiAoKSA9PiB2b2lkO1xuICBvblBhdGNoOiAocGF0Y2g6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB2b2lkO1xuICBvbkRlbGV0ZTogKCkgPT4gdm9pZDtcbiAgb25SZXBseTogKGJvZHk6IHN0cmluZykgPT4gUHJvbWlzZTxib29sZWFuPjtcbn0pIHtcbiAgY29uc3QgZGlhbG9nUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50IHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IHJlcGx5UmVmID0gdXNlUmVmPEhUTUxUZXh0QXJlYUVsZW1lbnQgfCBudWxsPihudWxsKTtcbiAgY29uc3QgcmFmUmVmID0gdXNlUmVmPG51bWJlciB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbcmVwbHksIHNldFJlcGx5XSA9IHVzZVN0YXRlKCcnKTtcbiAgY29uc3QgW3NlbmRpbmcsIHNldFNlbmRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gIC8vIExpdmUgYW5jaG9yIOKAlCBwb3BvdmVyIHRyYWNrcyB0aGUgcGluIHZpYSByQUYgc28gaXQgc3RheXMgZ2x1ZWQgdG8gaXRzXG4gIC8vIHRhcmdldCB0aHJvdWdoIHBhbiAvIHpvb20gKEZpZ0phbSBwYXJpdHkpLiBXcml0aW5nIHRvIHRoZSBkaWFsb2cgc3R5bGVcbiAgLy8gZGlyZWN0bHkgYXZvaWRzIHJlLXJlbmRlcmluZyBldmVyeSBmcmFtZS5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCB0aWNrID0gKCkgPT4ge1xuICAgICAgcmFmUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgY29uc3Qgbm9kZSA9IGRpYWxvZ1JlZi5jdXJyZW50O1xuICAgICAgaWYgKCFub2RlKSByZXR1cm47XG4gICAgICBjb25zdCBhbmNob3IgPSBjb21wdXRlVGhyZWFkQW5jaG9yKGNvbW1lbnQpO1xuICAgICAgbm9kZS5zdHlsZS5sZWZ0ID0gYCR7TWF0aC5yb3VuZChhbmNob3IueCl9cHhgO1xuICAgICAgbm9kZS5zdHlsZS50b3AgPSBgJHtNYXRoLnJvdW5kKGFuY2hvci55KX1weGA7XG4gICAgICByYWZSZWYuY3VycmVudCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aWNrKTtcbiAgICB9O1xuICAgIHJhZlJlZi5jdXJyZW50ID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRpY2spO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAocmFmUmVmLmN1cnJlbnQgIT0gbnVsbCkgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmUmVmLmN1cnJlbnQpO1xuICAgIH07XG4gIH0sIFtjb21tZW50XSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAvLyBNb3ZlIGZvY3VzIGludG8gdGhlIGRpYWxvZyBvbiBvcGVuLiBQZXIgV0NBRyAyLjEgdGhlIGRpYWxvZyBzaG91bGQgb3duXG4gICAgLy8gaW5pdGlhbCBmb2N1czsgd2UgcHV0IGl0IG9uIHRoZSBkaWFsb2cgcm9vdCAoZm9jdXNhYmxlIHZpYSB0YWJpbmRleClcbiAgICAvLyBzbyBzY3JlZW4gcmVhZGVycyBhbm5vdW5jZSB0aGUgaGVhZGVyIGJlZm9yZSB0aGUgYm9keS4gT24gY2xvc2UsXG4gICAgLy8gcmV0dXJuIGZvY3VzIHRvIHRoZSBwaW4gc28ga2V5Ym9hcmQgdXNlcnMgbGFuZCB3aGVyZSB0aGV5IHN0YXJ0ZWQuXG4gICAgZGlhbG9nUmVmLmN1cnJlbnQ/LmZvY3VzKCk7XG4gICAgY29uc3QgcGluSWQgPSBjb21tZW50LmlkO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjb25zdCBwaW4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxCdXR0b25FbGVtZW50PihgW2RhdGEtY29tbWVudC1waW49XCIke3BpbklkfVwiXWApO1xuICAgICAgcGluPy5mb2N1cygpO1xuICAgIH07XG4gIH0sIFtjb21tZW50LmlkXSk7XG5cbiAgLy8gRXNjLXRvLWNsb3NlIHdoaWxlIGZvY3VzIGlzIGFueXdoZXJlIGluc2lkZSB0aGUgcG9wb3Zlci5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykgcmV0dXJuO1xuICAgIGNvbnN0IG9uS2V5ID0gKGU6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgIGlmIChlLmtleSAhPT0gJ0VzY2FwZScpIHJldHVybjtcbiAgICAgIGNvbnN0IHJvb3QgPSBkaWFsb2dSZWYuY3VycmVudDtcbiAgICAgIGlmICghcm9vdCkgcmV0dXJuO1xuICAgICAgaWYgKHJvb3QuY29udGFpbnMoZS50YXJnZXQgYXMgTm9kZSkgfHwgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gcm9vdCkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIG9uQ2xvc2UoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBvbktleSk7XG4gICAgcmV0dXJuICgpID0+IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBvbktleSk7XG4gIH0sIFtvbkNsb3NlXSk7XG5cbiAgY29uc3QgdHJ5U2VuZFJlcGx5ID0gdXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHYgPSByZXBseS50cmltKCk7XG4gICAgaWYgKCF2IHx8IHNlbmRpbmcpIHJldHVybjtcbiAgICBzZXRTZW5kaW5nKHRydWUpO1xuICAgIGNvbnN0IG9rID0gYXdhaXQgb25SZXBseSh2KTtcbiAgICBzZXRTZW5kaW5nKGZhbHNlKTtcbiAgICBpZiAob2spIHtcbiAgICAgIHNldFJlcGx5KCcnKTtcbiAgICAgIHJlcGx5UmVmLmN1cnJlbnQ/LmZvY3VzKCk7XG4gICAgfVxuICB9LCBbcmVwbHksIHNlbmRpbmcsIG9uUmVwbHldKTtcblxuICBjb25zdCBvblJlcGx5S2V5RG93biA9IHVzZUNhbGxiYWNrKFxuICAgIChlOiBSZWFjdC5LZXlib2FyZEV2ZW50PEhUTUxUZXh0QXJlYUVsZW1lbnQ+KSA9PiB7XG4gICAgICBpZiAoKGUubWV0YUtleSB8fCBlLmN0cmxLZXkpICYmIGUua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdm9pZCB0cnlTZW5kUmVwbHkoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFt0cnlTZW5kUmVwbHldXG4gICk7XG5cbiAgY29uc3QgaGVhZElkID0gYGNtLXRocmVhZC1oZWFkLSR7Y29tbWVudC5pZH1gO1xuICBjb25zdCBzZWxlY3RvckNoaXAgPSBmb3JtYXRTZWxlY3RvckNoaXAoY29tbWVudC5zZWxlY3RvciwgJycpO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgcmVmPXtkaWFsb2dSZWZ9XG4gICAgICBjbGFzc05hbWU9XCJjbS10aHJlYWRcIlxuICAgICAgcm9sZT1cImRpYWxvZ1wiXG4gICAgICBhcmlhLWxhYmVsbGVkYnk9e2hlYWRJZH1cbiAgICAgIHRhYkluZGV4PXstMX1cbiAgICAgIG9uQ2xpY2s9eyhlKSA9PiBlLnN0b3BQcm9wYWdhdGlvbigpfVxuICAgICAgb25Qb2ludGVyRG93bj17KGUpID0+IGUuc3RvcFByb3BhZ2F0aW9uKCl9XG4gICAgPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJjbS10aHJlYWRfX2hlYWRcIiBpZD17aGVhZElkfT5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjbS10aHJlYWRfX2hlYWQtcm93XCI+XG4gICAgICAgICAgey8qIFBsYW4gQyBQMTgg4oCUIHBpbi9zZXF1ZW5jZSBiYWRnZSBpbiB0aGUgcG9wb3ZlciBoZWFkZXIgKHBhcml0eSB3aXRoXG4gICAgICAgICAgICAgIGAuZGVzaWduL3VpL1N0dWRpby50c3hgIHRocmVhZCBwb3BvdmVyKS4gKi99XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiY20tdGhyZWFkX19zZXFcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgIHtzZXF1ZW5jZX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiY20tdGhyZWFkX19hdXRob3JcIj57Y29tbWVudC5hdXRob3I/LnRyaW0oKSB8fCAndW5rbm93bid9PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImNtLXRocmVhZF9fdGltZVwiPntmb3JtYXRSZWxhdGl2ZVRpbWUoY29tbWVudC5jcmVhdGVkKX08L3NwYW4+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJjbS10aHJlYWRfX2Nsb3NlXCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJDbG9zZSB0aHJlYWRcIlxuICAgICAgICAgICAgdGl0bGU9XCJDbG9zZSDCtyBFc2NcIlxuICAgICAgICAgICAgb25DbGljaz17b25DbG9zZX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICDDl1xuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAge3NlbGVjdG9yQ2hpcCA/IDxjb2RlIGNsYXNzTmFtZT1cImNtLXRocmVhZF9fc2VsZWN0b3JcIj57c2VsZWN0b3JDaGlwfTwvY29kZT4gOiBudWxsfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY20tdGhyZWFkX19ib2R5XCI+e3JlbmRlckJvZHlXaXRoTWVudGlvbnMoY29tbWVudC50ZXh0KX08L2Rpdj5cblxuICAgICAgeyhjb21tZW50LnRocmVhZCA/PyBbXSkubWFwKChyKSA9PiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY20tdGhyZWFkX19yZXBseVwiIGtleT17ci5pZH0+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjbS10aHJlYWRfX3JlcGx5LWhlYWRcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImNtLXRocmVhZF9fcmVwbHktYXV0aG9yXCI+e3IuYXV0aG9yPy50cmltKCkgfHwgJ3Vua25vd24nfTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImNtLXRocmVhZF9fcmVwbHktdGltZVwiPntmb3JtYXRSZWxhdGl2ZVRpbWUoci5jcmVhdGVkKX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjbS10aHJlYWRfX3JlcGx5LWJvZHlcIj57cmVuZGVyQm9keVdpdGhNZW50aW9ucyhyLmJvZHkpfTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICkpfVxuXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImNtLXRocmVhZF9fcmVwbHktZm9ybVwiPlxuICAgICAgICA8TWVudGlvbkF3YXJlVGV4dGFyZWFcbiAgICAgICAgICB0ZXh0YXJlYVJlZj17cmVwbHlSZWZ9XG4gICAgICAgICAgY2xhc3NOYW1lPVwiY20tdGhyZWFkX19yZXBseS10ZXh0YXJlYVwiXG4gICAgICAgICAgdmFsdWU9e3JlcGx5fVxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiUmVwbHnigKYg4oyY4oa1IHRvIHNlbmQgwrcgQG5hbWUgdG8gdGFnXCJcbiAgICAgICAgICBvbkNoYW5nZT17c2V0UmVwbHl9XG4gICAgICAgICAgb25LZXlEb3duPXtvblJlcGx5S2V5RG93bn1cbiAgICAgICAgICByb3dzPXsyfVxuICAgICAgICAgIGFyaWFMYWJlbD1cIlJlcGx5XCJcbiAgICAgICAgICBkaXNhYmxlZD17c2VuZGluZ31cbiAgICAgICAgLz5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjbS10aHJlYWRfX3JlcGx5LWFjdGlvbnNcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImNtLWJ0biBjbS1idG4tLXByaW1hcnlcIlxuICAgICAgICAgICAgZGlzYWJsZWQ9eyFyZXBseS50cmltKCkgfHwgc2VuZGluZ31cbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHZvaWQgdHJ5U2VuZFJlcGx5KCl9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgU2VuZFxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImNtLXRocmVhZF9fYWN0aW9uc1wiPlxuICAgICAgICB7Y29tbWVudC5zdGF0dXMgPT09ICdyZXNvbHZlZCcgPyAoXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3NOYW1lPVwiY20tYnRuXCIgb25DbGljaz17KCkgPT4gb25QYXRjaCh7IHN0YXR1czogJ29wZW4nIH0pfT5cbiAgICAgICAgICAgIOKGuiBSZW9wZW5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImNtLWJ0biBjbS1idG4tLXByaW1hcnlcIlxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICBvblBhdGNoKHsgc3RhdHVzOiAncmVzb2x2ZWQnIH0pO1xuICAgICAgICAgICAgICBvbkNsb3NlKCk7XG4gICAgICAgICAgICB9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIOKckyBSZXNvbHZlXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICl9XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzc05hbWU9XCJjbS1idG4gY20tYnRuLS1kYW5nZXJcIlxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgIG9uRGVsZXRlKCk7XG4gICAgICAgICAgICBvbkNsb3NlKCk7XG4gICAgICAgICAgfX1cbiAgICAgICAgPlxuICAgICAgICAgIERlbGV0ZVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEJvZHkgcmVuZGVyZXIg4oCUIHNwbGl0cyB0ZXh0IG9uIEAtaGFuZGxlcywgd3JhcHMgZWFjaCBpbiA8c3Ryb25nPi4gQW55dGhpbmdcbi8vIG5vdCBtYXRjaGluZyB0aGUgbWVudGlvbiByZWdleCBzdGF5cyBwbGFpbiB0ZXh0IChuZXdsaW5lcyBwcmVzZXJ2ZWQgYnkgQ1NTXG4vLyBgd2hpdGUtc3BhY2U6IHByZS13cmFwYCkuXG5cbmZ1bmN0aW9uIHJlbmRlckJvZHlXaXRoTWVudGlvbnModGV4dDogc3RyaW5nKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgaWYgKCF0ZXh0KSByZXR1cm4gbnVsbDtcbiAgY29uc3QgcmUgPSAvKEBbXFx3XVtcXHcuLV0qKS9nO1xuICBjb25zdCBwYXJ0cyA9IHRleHQuc3BsaXQocmUpO1xuICByZXR1cm4gcGFydHMubWFwKChwYXJ0LCBpKSA9PiB7XG4gICAgLy8gVGhlIHNwbGl0IHBvc2l0aW9ucyBBUkUgdGhlIGlkZW50aXR5IGhlcmUg4oCUIGZvciB0aGUgc2FtZSBgdGV4dGAgaW5wdXQsXG4gICAgLy8gaW5kZXggYGlgIGFsd2F5cyBtYXBzIHRvIHRoZSBzYW1lIGZyYWdtZW50LiBDb21wb3NlIGtleSBmcm9tIGluZGV4ICtcbiAgICAvLyBjb250ZW50IHNvIGJpb21lJ3MgYXJyYXktaW5kZXgta2V5IGhldXJpc3RpYyBpcyBzYXRpc2ZpZWQgQU5EIHJlb3JkZXJcbiAgICAvLyByZXNpc3RhbmNlIGlzIGludGFjdCBpZiBgdGV4dGAgbXV0YXRlcyBtaWQtcmVuZGVyLlxuICAgIGNvbnN0IGtleSA9IGAke2l9OiR7cGFydH1gO1xuICAgIGlmIChpICUgMiA9PT0gMSkge1xuICAgICAgLy8gT2RkIHBhcnRzIGFyZSB0aGUgY2FwdHVyZWQgQGhhbmRsZXMgdGhhbmtzIHRvIHRoZSBwYXJlbnRoZXNpemVkIHNwbGl0LlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPHN0cm9uZyBrZXk9e2tleX0gZGF0YS1tZW50aW9uPVwidHJ1ZVwiPlxuICAgICAgICAgIHtwYXJ0fVxuICAgICAgICA8L3N0cm9uZz5cbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiA8c3BhbiBrZXk9e2tleX0+e3BhcnR9PC9zcGFuPjtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFJlbGF0aXZlVGltZShpc286IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghaXNvKSByZXR1cm4gJyc7XG4gIGNvbnN0IHQgPSBEYXRlLnBhcnNlKGlzbyk7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHQpKSByZXR1cm4gJyc7XG4gIGNvbnN0IGRpZmZTZWMgPSBNYXRoLnJvdW5kKChEYXRlLm5vdygpIC0gdCkgLyAxMDAwKTtcbiAgaWYgKGRpZmZTZWMgPCA2MCkgcmV0dXJuIGAke01hdGgubWF4KGRpZmZTZWMsIDApfXMgYWdvYDtcbiAgaWYgKGRpZmZTZWMgPCAzNjAwKSByZXR1cm4gYCR7TWF0aC5yb3VuZChkaWZmU2VjIC8gNjApfW0gYWdvYDtcbiAgaWYgKGRpZmZTZWMgPCA4Nl80MDApIHJldHVybiBgJHtNYXRoLnJvdW5kKGRpZmZTZWMgLyAzNjAwKX1oIGFnb2A7XG4gIHJldHVybiBgJHtNYXRoLnJvdW5kKGRpZmZTZWMgLyA4Nl80MDApfWQgYWdvYDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0U2VsZWN0b3JDaGlwKHNlbGVjdG9yOiBzdHJpbmcsIGZhbGxiYWNrOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIXNlbGVjdG9yKSByZXR1cm4gZmFsbGJhY2s7XG4gIGNvbnN0IGNkID0gc2VsZWN0b3IubWF0Y2goL2RhdGEtY2QtaWQ9XCIoW15cIl0rKVwiLyk7XG4gIGlmIChjZCkgcmV0dXJuIGBjZDoke2NkWzFdfWA7XG4gIHJldHVybiBzZWxlY3Rvci5sZW5ndGggPiAzNiA/IGAke3NlbGVjdG9yLnNsaWNlKDAsIDMzKX3igKZgIDogc2VsZWN0b3I7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVUaHJlYWRBbmNob3IoY29tbWVudDogT3ZlcmxheUNvbW1lbnQpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0ge1xuICAvLyBSZXNvbHZlIHRhcmdldCdzIGxpdmUgc2NyZWVuIHJlY3Q7IHBvcG92ZXIgZHJvcHMgYmVsb3cgdGhlIHBpbiB3aXRoIHNtYWxsXG4gIC8vIGJyZWF0aGluZyByb29tLiBTdG9yZWQgYm91bmRzIChjYXB0dXJlLXRpbWUgc2NyZWVuIGNvb3JkcykgYXJlIHRoZVxuICAvLyBsYXN0LXJlc29ydCBmYWxsYmFjayBmb3Igb3JwaGFuZWQgcGlucy5cbiAgY29uc3QgcmVjdCA9IGNvbW1lbnQuc2VsZWN0b3IgPyBzY3JlZW5SZWN0Rm9yKGNvbW1lbnQuc2VsZWN0b3IsIGNvbW1lbnQuaW5kZXgpIDogbnVsbDtcbiAgaWYgKHJlY3QpIHtcbiAgICAvLyBQaW4gc2l0cyBhdCAocmVjdC5yaWdodCAtIDEyLCByZWN0LnRvcCAtIDEyKS4gUGxhY2UgcG9wb3ZlciBhdCB0aGUgc2FtZVxuICAgIC8vIHggZm9yIHZpc3VhbCBjb250aW51aXR5LCAxNnB4IGJlbG93IHRoZSB0b3Agc28gaXQgY2xlYXJzIHRoZSBwaW4uXG4gICAgcmV0dXJuIHsgeDogcmVjdC54ICsgcmVjdC53IC0gMTIsIHk6IHJlY3QueSArIDE2IH07XG4gIH1cbiAgaWYgKGNvbW1lbnQuYm91bmRzKSB7XG4gICAgcmV0dXJuIHsgeDogY29tbWVudC5ib3VuZHMueCArIGNvbW1lbnQuYm91bmRzLncgLSAxMiwgeTogY29tbWVudC5ib3VuZHMueSArIDE2IH07XG4gIH1cbiAgcmV0dXJuIHsgeDogMTYsIHk6IDE2IH07XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVBbmNob3Ioc3RhdGU6IENvbXBvc2VyU3RhdGUpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0ge1xuICAvLyBHNCDigJQgYW5jaG9yIHRvIHRoZSBjdXJzb3IgY2xpY2sgcG9pbnQgZmlyc3QuIEVhcmxpZXIgdmVyc2lvbnMgYW5jaG9yZWQgdG9cbiAgLy8gdGhlIHNlbGVjdGVkIGVsZW1lbnQncyBib3R0b20tbGVmdCwgd2hpY2ggbGFuZGVkIHRoZSBjb21wb3NlciBmbHVzaCBpblxuICAvLyB0aGUgY29ybmVyIHJlZ2FyZGxlc3Mgb2Ygd2hlcmUgdGhlIHVzZXIgY2xpY2tlZCDigJQgc3VycHJpc2luZyBmb3IgdGhlXG4gIC8vIGNvbW1vbiBjYXNlIG9mIFwiSSBjbGlja2VkIHRoZSBtaWRkbGUgb2YgYW4gZWxlbWVudCwgZXhwZWN0aW5nIHRoZVxuICAvLyBjb21wb3NlciB0byBhcHBlYXIgbmVhciBteSBjdXJzb3JcIi4gVGhlIGVsZW1lbnQtcmVjdCBwYXRoIHJlbWFpbnMgYXMgYVxuICAvLyBmYWxsYmFjayBmb3IgZW50cnkgcG9pbnRzIHRoYXQgZG9uJ3QgY2FycnkgYSBjdXJzb3IgKGUuZy4gb3BlbmluZyB0aGVcbiAgLy8gY29tcG9zZXIgZnJvbSBhIGNvbnRleHR1YWwgdG9vbGJhciBidXR0b24g4oCUIHRob3NlIHNob3VsZCBzZXQgY2xpZW50WC9ZXG4gIC8vIHRvIGEgc2Vuc2libGUgYW5jaG9yIGJlZm9yZSBkaXNwYXRjaGluZykuXG4gIGlmIChzdGF0ZS5jbGllbnRYIHx8IHN0YXRlLmNsaWVudFkpIHtcbiAgICByZXR1cm4geyB4OiBzdGF0ZS5jbGllbnRYLCB5OiBzdGF0ZS5jbGllbnRZICsgOCB9O1xuICB9XG4gIGlmIChzdGF0ZS5zZWxlY3Rpb24uc2VsZWN0b3IpIHtcbiAgICBjb25zdCByZWN0ID0gc2NyZWVuUmVjdEZvcihzdGF0ZS5zZWxlY3Rpb24uc2VsZWN0b3IsIHN0YXRlLnNlbGVjdGlvbi5pbmRleCk7XG4gICAgaWYgKHJlY3QpIHtcbiAgICAgIHJldHVybiB7IHg6IHJlY3QueCwgeTogcmVjdC55ICsgcmVjdC5oICsgOCB9O1xuICAgIH1cbiAgfVxuICByZXR1cm4geyB4OiAxNiwgeTogMTYgfTtcbn1cbiIsCiAgICAiLyoqXG4gKiBAZmlsZSAgICAgICB1c2UtY29sbGFiLnRzeCDigJQgY2xpZW50LXNpZGUgWWpzIGNvbGxhYiBwcm92aWRlciBmb3IgY2FudmFzIGlmcmFtZXNcbiAqIEBzY29wZSAgICAgIGFwcHMvc3R1ZGlvL3VzZS1jb2xsYWIudHN4XG4gKiBAcHVycG9zZSAgICBNb3VudHMgYSBzaW5nbGUgWS5Eb2MgKyBBd2FyZW5lc3MgcGVyIGNhbnZhcyBpZnJhbWUuIE9wZW5zIGFcbiAqICAgICAgICAgICAgIFdlYlNvY2tldCB0byBgL193cy9jb2xsYWIvOnNsdWdgLCBzcGVha3MgdGhlIHktd2Vic29ja2V0IGJpbmFyeVxuICogICAgICAgICAgICAgcHJvdG9jb2wsIGV4cG9zZXMgaG9va3MgZm9yIHRoZSBjdXJzb3Igb3ZlcmxheSArIFRhc2sgMyBjb21tZW50c1xuICogICAgICAgICAgICAgYmluZGluZy5cbiAqXG4gKiBCb3VuZGFyeTpcbiAqICAgLSBTZXJ2ZXItc2lkZSBlcXVpdmFsZW50IGlzIGBjb2xsYWIvcHJvdG9jb2wudHNgICsgYGNvbGxhYi9yb29tLnRzYC5cbiAqICAgLSBUaGlzIGZpbGUgbWlycm9ycyB0aGUgbWVzc2FnZSBmcmFtaW5nICh2YXJpbnQtcHJlZml4ZWQgc3luYyArIGF3YXJlbmVzc1xuICogICAgIGZyYW1lcykgc28gdGhlIHR3byBzaWRlcyBjb252ZXJnZSBvdmVyIGEgYmluYXJ5IFdTIHdpdGhvdXQgaW50ZXJtZWRpYXRlXG4gKiAgICAgSlNPTi5cbiAqICAgLSBJbXBvcnRzIGB5anNgICsgYHktcHJvdG9jb2xzL3tzeW5jLGF3YXJlbmVzc31gIHZpYSB0aGUgY2FudmFzLXNoZWxsXG4gKiAgICAgaW1wb3J0bWFwIChSVU5USU1FX1BBQ0tBR0VTIGFkZGl0aW9ucykuIENhbnZhcyBidW5kbGVzIHRoYXQgZG9uJ3QgbW91bnRcbiAqICAgICA8Q29sbGFiUHJvdmlkZXI+IG5ldmVyIHJlc29sdmUgdGhlc2Ugc3BlY2lmaWVycyBhbmQgcGF5IHplcm8gYnVuZGxlIGNvc3QuXG4gKi9cblxuaW1wb3J0ICogYXMgZGVjb2RpbmcgZnJvbSAnbGliMC9kZWNvZGluZyc7XG5pbXBvcnQgKiBhcyBlbmNvZGluZyBmcm9tICdsaWIwL2VuY29kaW5nJztcbmltcG9ydCB7XG4gIGNyZWF0ZUNvbnRleHQsXG4gIHR5cGUgUmVhY3ROb2RlLFxuICB1c2VDYWxsYmFjayxcbiAgdXNlQ29udGV4dCxcbiAgdXNlRWZmZWN0LFxuICB1c2VNZW1vLFxuICB1c2VSZWR1Y2VyLFxuICB1c2VSZWYsXG4gIHVzZVN0YXRlLFxufSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBBd2FyZW5lc3MsIGFwcGx5QXdhcmVuZXNzVXBkYXRlLCBlbmNvZGVBd2FyZW5lc3NVcGRhdGUgfSBmcm9tICd5LXByb3RvY29scy9hd2FyZW5lc3MnO1xuaW1wb3J0IHsgcmVhZFN5bmNNZXNzYWdlLCB3cml0ZVN5bmNTdGVwMSwgd3JpdGVVcGRhdGUgfSBmcm9tICd5LXByb3RvY29scy9zeW5jJztcbmltcG9ydCAqIGFzIFkgZnJvbSAneWpzJztcblxuY29uc3QgTUVTU0FHRV9TWU5DID0gMDtcbmNvbnN0IE1FU1NBR0VfQVdBUkVORVNTID0gMTtcblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBDb2xvciBoYXNoIOKAlCBzdGFibGUgcGVyIHBlZXIgaWRlbnRpdHkuXG5cbi8qKlxuICogZGpiMiBzdHJpbmcgaGFzaCDihpIgT0tMQ0ggY29sb3IgaW4gYSBjdXJhdGVkIHBhbGV0dGUuIERldGVybWluaXNtIHBlclxuICogaW5wdXQgbmFtZSBpcyB0aGUgbG9hZC1iZWFyaW5nIHByb3BlcnR5OiBldmVyeSBwZWVyIGhhc2hpbmcgXCJBbGljZVwiIG11c3RcbiAqIGxhbmQgb24gdGhlIFNBTUUgY29sb3IuXG4gKlxuICogRFMgY29udHJhY3QgKGNvbG9ycy1wcmVzZW5jZSBzcGVjaW1lbik6IHRoZSBBSSBhZ2VudCByaWRlc1xuICogYC0tcHJlc2VuY2UtYWdlbnRgICh2aW9sZXQtbWFnZW50YSwgaHVlIDMyMikg4oCUIFwiYSBodWUgbm8gaHVtYW4gc3RhdGUgdXNlcyxcbiAqIHNvIGF0dHJpYnV0aW9uIG9uIGEgc2hhcmVkIGNhbnZhcyBpcyB1bmFtYmlndW91c1wiLiBIdW1hbiBodWVzIHRoZXJlZm9yZVxuICogRVhDTFVERSB0aGUgYWdlbnQgYmFuZCAofjI5MuKAkzM1MikgQU5EIHRoZSBhY2NlbnQgaW5kaWdvIGJhbmQgKH4yNDXigJMyOTAsXG4gKiByZXNlcnZlZCBmb3Igc2VsZWN0aW9uL2FjdGl2ZSkuIEwvQyBtYXRjaCB0aGUgRFMgcHJlc2VuY2UgdG9rZW5zXG4gKiAob2tsY2gg4omIMC43NCAwLjE2KSBzbyBldmVyeSBjdXJzb3IgcmVhZHMgYXQgdGhlIHNhbWUgd2VpZ2h0IG9uIGJvdGggdGhlbWVzLlxuICovXG5jb25zdCBDT0xPUl9QQUxFVFRFID0gW1xuICAnb2tsY2goMC43MCAwLjE3IDEyKScsIC8vIHJvc2VcbiAgJ29rbGNoKDAuNzIgMC4xNiA0MCknLCAvLyBjb3JhbFxuICAnb2tsY2goMC43OCAwLjE1IDc4KScsIC8vIGFtYmVyICAocHJlc2VuY2UtYXdheSBodWUpXG4gICdva2xjaCgwLjc2IDAuMTYgMTA4KScsIC8vIGxpbWVcbiAgJ29rbGNoKDAuNzQgMC4xNiAxNDUpJywgLy8gZ3JlZW4gIChwcmVzZW5jZS1vbmxpbmUgaHVlKVxuICAnb2tsY2goMC43NSAwLjE0IDE3MiknLCAvLyB0ZWFsXG4gICdva2xjaCgwLjczIDAuMTMgMjAwKScsIC8vIGN5YW5cbiAgJ29rbGNoKDAuNzIgMC4xMyAyMzgpJywgLy8gYmx1ZSAgIChzdGF0dXMtaW5mbyBodWUpXG5dIGFzIGNvbnN0O1xuXG4vKiogVGhlIEFJIGFnZW50J3MgZXhjbHVzaXZlIGN1cnNvci9hdmF0YXIgaHVlIOKAlCBgLS1wcmVzZW5jZS1hZ2VudGAuICovXG5leHBvcnQgY29uc3QgQUdFTlRfQ09MT1IgPSAnb2tsY2goMC43MDAgMC4xOTAgMzIyKSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjb2xvckZvck5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gQ09MT1JfUEFMRVRURSBpcyBhIG5vbi1lbXB0eSBjb25zdCB0dXBsZTsgdGhlIGV4cGxpY2l0IGA/PyAnIzAwMCdgXG4gIC8vIGZhbGxiYWNrIGlzIHVucmVhY2hhYmxlIGJ1dCBzYXRpc2ZpZXMgYG5vVW5jaGVja2VkSW5kZXhlZEFjY2Vzc2AuXG4gIGNvbnN0IEZBTExCQUNLID0gJyMwMDAwMDAnO1xuICBpZiAoIW5hbWUpIHJldHVybiBDT0xPUl9QQUxFVFRFWzBdID8/IEZBTExCQUNLO1xuICBsZXQgaGFzaCA9IDUzODE7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZS5sZW5ndGg7IGkrKykge1xuICAgIGhhc2ggPSAoKGhhc2ggPDwgNSkgKyBoYXNoICsgbmFtZS5jaGFyQ29kZUF0KGkpKSB8IDA7XG4gIH1cbiAgY29uc3QgaWR4ID0gKChoYXNoICUgQ09MT1JfUEFMRVRURS5sZW5ndGgpICsgQ09MT1JfUEFMRVRURS5sZW5ndGgpICUgQ09MT1JfUEFMRVRURS5sZW5ndGg7XG4gIHJldHVybiBDT0xPUl9QQUxFVFRFW2lkeF0gPz8gRkFMTEJBQ0s7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gQXdhcmVuZXNzIHN0YXRlIHNoYXBlLlxuXG5leHBvcnQgaW50ZXJmYWNlIENvbGxhYkF3YXJlbmVzc1N0YXRlIHtcbiAgbmFtZTogc3RyaW5nO1xuICBjb2xvcjogc3RyaW5nO1xuICAvKipcbiAgICogQ3Vyc29yIHBvc2l0aW9uIGluICoqd29ybGQgY29vcmRzKiogKGNhbnZhcy1saWIgdmlld3BvcnQgc3BhY2UpIHNvIGZvcmVpZ25cbiAgICogcGVlcnMgc2VlIHRoZSBzYW1lIGNvbmNlcHR1YWwgcG9pbnQgZXZlbiB3aGVuIHRoZWlyIGxvY2FsIHZpZXdwb3J0IGlzXG4gICAqIHBhbm5lZC96b29tZWQgZGlmZmVyZW50bHkuIE51bGwgPSBwZWVyIGlzIG5vdCBvdmVyIHRoZSBjYW52YXMgc3VyZmFjZS5cbiAgICovXG4gIGN1cnNvcjogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgbnVsbDtcbiAgLyoqXG4gICAqIE1vc3QtcmVjZW50bHkgc2VsZWN0ZWQgZWxlbWVudC4gYGNzc1BhdGhgIGlzIHRoZSBsb2NhdG9yIGlkIGNoYWluIHRoZVxuICAgKiBjYW52YXMtc2hlbGwgYWxyZWFkeSB1c2VzOyBgYm91bmRzYCBhcmUgc2NyZWVuLXB4IHJlY3QgYXQgdGhlIG1vbWVudCBvZlxuICAgKiBwdWJsaXNoIChzbyBpdCdzIGEgaGludCwgbm90IGEgbGl2ZSByZWYpLiBOdWxsIHdoZW4gbm90aGluZyBzZWxlY3RlZC5cbiAgICovXG4gIHNlbGVjdGlvbjogeyBjc3NQYXRoOiBzdHJpbmc7IGJvdW5kczogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgdzogbnVtYmVyOyBoOiBudW1iZXIgfSB9IHwgbnVsbDtcbiAgLyoqXG4gICAqIEN1cnJlbnRseS1zZWxlY3RlZCBhbm5vdGF0aW9uIHN0cm9rZSBJRHMgKFBoYXNlIDUpLiBTdHJva2VzIGFyZSBhZGRyZXNzZWRcbiAgICogYnkgdGhlaXIgc3RhYmxlIGBkYXRhLWlkYCBhdHRyaWJ1dGUsIHNvIHBlZXJzIGNhbiByZXNvbHZlIGhhbG9zIHZpYVxuICAgKiBgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtaWQ9XCI8aWQ+XCJdJylgLiBFbXB0eSB3aGVuIG5vdGhpbmdcbiAgICogYW5ub3RhdGlvbi1zaGFwZWQgaXMgc2VsZWN0ZWQuXG4gICAqL1xuICBhbm5vdGF0aW9uU2VsZWN0aW9uOiBzdHJpbmdbXTtcbiAgdmlld3BvcnQ6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHpvb206IG51bWJlciB9O1xuICAvKipcbiAgICogU29mdCBlZGl0aW5nLXByZXNlbmNlIChQaGFzZSAzMCkuIFNldCB3aGlsZSBUSElTIHBlZXIgKGEgaHVtYW4gZWRpdGluZyB2aWFcbiAgICogdGhlIENTUy1pbnNwZWN0b3IgLyBhIGAvZGVzaWduOmVkaXRgLWRyaXZlbiB3cml0ZSwgb3IgYSBicmlkZ2VkIGFnZW50KSBpc1xuICAgKiBhY3RpdmVseSBlZGl0aW5nIHRoZSBjYW52YXMgYm9keTsgYHNpbmNlYCBpcyB0aGUgZXBvY2gtbXMgdGhlIGVkaXQgc2Vzc2lvblxuICAgKiBiZWdhbi4gTnVsbC9hYnNlbnQgPSBub3QgZWRpdGluZy4gVGhpcyBpcyBhIFNPRlQsIGF0dHJpYnV0ZWQgaGVhZHMtdXAgdGhhdFxuICAgKiByaWRlcyB0aGUgc2FtZSBodWItYnJpZGdlZCBhd2FyZW5lc3MgY2hhbm5lbCBhcyBjdXJzb3JzIOKAlCBpdCBpcyBOT1QgYSBsb2NrXG4gICAqIChubyBsZWFzZSwgbm8gdGFrZW92ZXIsIG5ldmVyIGJsb2NrcyBhbm90aGVyIHBlZXIpLiBDbGVhcmVkIG9uIGlkbGUgKyBvblxuICAgKiBkaXNjb25uZWN0IChhd2FyZW5lc3MgR0MpLiBUaGUgdmlzdWFsIGNvbmZsaWN0IHBpY2tlciAoRERSLTExNikgcmVtYWlucyB0aGVcbiAgICogc2FmZXR5IG5ldCBmb3IgZGl2ZXJnZW50IHNhdmVzLlxuICAgKi9cbiAgZWRpdGluZz86IHsgc2luY2U6IG51bWJlciB9IHwgbnVsbDtcbiAgLyoqXG4gICAqIFNlcnZlci1zaWRlIGBkaXNjb25uZWN0YCBtYXRjaGVzIGF3YXJlbmVzcyBzdGF0ZXMgdG8gb3V0Z29pbmcgcGVlcnMgYnlcbiAgICogdGhpcyB0b2tlbiAobXVzdCBlcXVhbCB0aGUgd3MuZGF0YS5pZCB0aGUgc2VydmVyIGFzc2lnbnMgYXQgdXBncmFkZSkuXG4gICAqIFVudGlsIHRoZSBzZXJ2ZXIgcHVzaGVzIHRoZSBhc3NpZ25lZCBpZCBiYWNrIHRvIHRoZSBjbGllbnQsIHdlIHVzZSBhXG4gICAqIGNsaWVudC1nZW5lcmF0ZWQgVVVJRCDigJQgY29sbGlzaW9ucyBhcmUgbmVnbGlnaWJsZSBhbmQgZGlzY29ubmVjdCBjbGVhbnVwXG4gICAqIHRvbGVyYXRlcyBhIHN0YWxlIHN0YXRlICh0aGUgbmV4dCBhd2FyZW5lc3MgR0MgcGFzcyBkcm9wcyBpdCkuXG4gICAqL1xuICBfX2Nvbm5JZDogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBGb3JlaWduQXdhcmVuZXNzID0gT21pdDxDb2xsYWJBd2FyZW5lc3NTdGF0ZSwgJ19fY29ubklkJz4gJiB7IGNsaWVudElEOiBudW1iZXIgfTtcblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBVbnRydXN0ZWQtaW5wdXQgc2FuaXRpemF0aW9uIGF0IHRoZSBhd2FyZW5lc3MgdHJ1c3QgYm91bmRhcnkuXG4vL1xuLy8gUGhhc2UgOCBhd2FyZW5lc3Mgd2FzIGxvb3BiYWNrLW9ubHkg4oCUIGV2ZXJ5IHN0YXRlIGNhbWUgZnJvbSBhIHRydXN0ZWQgbG9jYWxcbi8vIHRhYi4gUGhhc2UgOSAoVGFzayA1KSBicmlkZ2VzIGF3YXJlbmVzcyB0aHJvdWdoIGEgU0VNSS1UUlVTVEVEIGh1YiAoRERSLTA1NCksXG4vLyBzbyBmb3JlaWduIHN0YXRlcyBhcmUgbm93IGF0dGFja2VyLWluZmx1ZW5jZWFibGUuIGB1c2VGb3JlaWduQXdhcmVuZXNzYCBpc1xuLy8gdGhlIHNpbmdsZSBjaG9rZXBvaW50IHdoZXJlIHJlbW90ZSBzdGF0ZSBpcyByZWFkIGJlZm9yZSBpdCByZWFjaGVzIHRoZVxuLy8gY3Vyc29yIC8gcGFydGljaXBhbnQgcmVuZGVyIHNpbmtzLCBzbyBhbGwgdmFsaWRhdGlvbiBsaXZlcyBoZXJlLiBGaWVsZHMgYXJlXG4vLyB2YWxpZGF0ZWQgZm9yIFZBTFVFLCBub3QganVzdCB0eXBlOlxuLy8gICAtIGNvbG9yOiByZS1kZXJpdmVkIGxvY2FsbHkgZnJvbSB0aGUgKHNhbml0aXplZCkgbmFtZSBhbmQgdGhlIHdpcmUgdmFsdWVcbi8vICAgICBpcyBESVNDQVJERUQg4oCUIGEgaHViLWNob3NlbiBgY29sb3JgIHN0cmluZyB3b3VsZCBvdGhlcndpc2UgZmxvdyBpbnRvIGFuXG4vLyAgICAgaW5saW5lIGBzdHlsZWAgYW5kIGEgYHVybCguLi4pYCB2YWx1ZSBiZWFjb25zIGV2ZXJ5IHZpZXdlcidzIGJyb3dzZXIuXG4vLyAgICAgVGhlIHBhbGV0dGUgaXMgZGV0ZXJtaW5pc3RpYywgc28gcmUtZGVyaXZhdGlvbiBpcyB2aXN1YWxseSBpZGVudGljYWwuXG4vLyAgIC0gbmFtZTogY29udHJvbCAvIGJpZGkgLyB6ZXJvLXdpZHRoIGNoYXJzIHN0cmlwcGVkLCBsZW5ndGgtY2FwcGVkIOKAlCBibG9ja3Ncbi8vICAgICBpZGVudGl0eSBzcG9vZmluZyArIHJlbmRlciBibG9hdC5cbi8vICAgLSBjdXJzb3IgLyB2aWV3cG9ydDogZmluaXRlLW51bWJlciBnYXRlZCDigJQgYSBOYU4vSW5maW5pdHkgd291bGQgcG9pc29uIHRoZVxuLy8gICAgIENTUyB0cmFuc2Zvcm0gLyB0aGUgbG9jYWwgdmlld3BvcnQgY29udHJvbGxlciBkdXJpbmcgRm9sbG93IG1vZGUuXG4vLyAgIC0gc2VsZWN0aW9uLmNzc1BhdGg6IGNoYXJzZXQgKyBsZW5ndGggYWxsb3dsaXN0IGJlZm9yZSBpdCByZWFjaGVzXG4vLyAgICAgYHF1ZXJ5U2VsZWN0b3JgIOKAlCBibG9ja3Mgc2VsZWN0b3ItY29tcGxleGl0eSBEb1MgKyBhcmJpdHJhcnkgRE9NIHByb2JpbmcuXG4vLyAgIC0gYW5ub3RhdGlvblNlbGVjdGlvbjogcGVyLWlkIHRva2VuICsgYXJyYXktbGVuZ3RoIGNhcHBlZCDigJQgYmxvY2tzIGFcbi8vICAgICBxdWVyeVNlbGVjdG9yIHJlbmRlci1zdG9ybS5cbi8vICAgLSBwZWVyIGNvdW50IGNhcHBlZCDigJQgYmxvY2tzIGFuIHVuYm91bmRlZC1jbGllbnRzIG1lbW9yeS9yZW5kZXIgRG9TLlxuXG5jb25zdCBNQVhfRk9SRUlHTl9QRUVSUyA9IDY0O1xuY29uc3QgTUFYX05BTUVfTEVOID0gNjQ7XG5jb25zdCBNQVhfQ1NTUEFUSF9MRU4gPSA1MTI7XG5jb25zdCBNQVhfQU5OT1RBVElPTl9JRFMgPSAyNTY7XG5jb25zdCBNQVhfQU5OT1RBVElPTl9JRF9MRU4gPSAxMjg7XG5cbi8vIENoYXJzZXQgb2YgZXZlcnkgc2VsZWN0b3IgdGhlIGNhbnZhcy1zaGVsbCBgY3NzUGF0aCgpYCBlbWl0c1xuLy8gKGBbZGF0YS0qPVwiLi4uXCJdYCwgYCNpZGAsIGB0YWcuY2xzOm50aC1jaGlsZChOKWAsIGAgPiBgIGNvbWJpbmF0b3JzKS5cbmNvbnN0IENTU1BBVEhfQUxMT1dFRCA9IC9eW0EtWmEtejAtOSAuXyM+OltcXF09XCInKCktXSskLztcbi8vIGBjc3NQYXRoKClgIG9ubHkgZXZlciBlbWl0cyBgOm50aC1jaGlsZChOKWAgYXMgYSBwYXJlbnRoZXNpc2VkIGNvbnN0cnVjdC5cbi8vIEZ1bmN0aW9uYWwgcHNldWRvLWNsYXNzZXMgKGA6aGFzKClgLCBgOmlzKClgLCBgOndoZXJlKClgLCBgOm5vdCgpYCkgdHJpZ2dlclxuLy8gcGVyLXJlbmRlciBzdWJ0cmVlIHdhbGtzIOKGkiBhIG1hbGljaW91cyBodWIgcGVlciBjb3VsZCBwdWJsaXNoIGEgZGVlcGx5XG4vLyBuZXN0ZWQgYDpoYXMoKWAgc2VsZWN0b3IgYW5kIHBpbiBldmVyeSB2aWV3ZXIncyBtYWluIHRocmVhZCAocXVlcnlTZWxlY3RvclxuLy8gcmUtcnVucyBlYWNoIHJlbmRlcikuIFNvIGFmdGVyIHN0cmlwcGluZyB0aGUgbGVnaXQgYDpudGgtY2hpbGQvb2YtdHlwZShOKWBcbi8vIGZvcm1zLCBhbnkgcmVzaWR1YWwgcGFyZW4gbWVhbnMgYSBmdW5jdGlvbmFsIHBzZXVkbyDigJQgcmVqZWN0LiBUaGUgY2hhcnNldFxuLy8gYWxsb3dsaXN0IGFsb25lIHdhcyB3aWRlciB0aGFuIHRoZSBnZW5lcmF0b3IgKHRoZSBvcmlnaW5hbCBEb1MgaG9sZSkuXG5jb25zdCBDU1NQQVRIX05USCA9IC86bnRoLShjaGlsZHxvZi10eXBlKVxcKFxcZHsxLDR9XFwpL2c7XG5jb25zdCBBTk5PVEFUSU9OX0lEX0FMTE9XRUQgPSAvXltBLVphLXowLTkuXzotXSskLztcblxuZnVuY3Rpb24gaXNTYWZlQ3NzUGF0aChwOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKHAubGVuZ3RoID4gTUFYX0NTU1BBVEhfTEVOIHx8ICFDU1NQQVRIX0FMTE9XRUQudGVzdChwKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBzdHJpcHBlZCA9IHAucmVwbGFjZShDU1NQQVRIX05USCwgJycpO1xuICByZXR1cm4gIXN0cmlwcGVkLmluY2x1ZGVzKCcoJykgJiYgIXN0cmlwcGVkLmluY2x1ZGVzKCcpJyk7XG59XG5cbmZ1bmN0aW9uIGlzRmluaXRlTnVtKHY6IHVua25vd24pOiB2IGlzIG51bWJlciB7XG4gIHJldHVybiB0eXBlb2YgdiA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHYpO1xufVxuXG4vLyBDb250cm9sIChDMC9DMSksIHplcm8td2lkdGgsIGFuZCBiaWRpLW92ZXJyaWRlIGNvZGUgcG9pbnRzIGdldCBzdHJpcHBlZCBmcm9tXG4vLyBkaXNwbGF5ZWQgc3RyaW5ncyBzbyBhIHJlbW90ZSBwZWVyIGNhbid0IHNwb29mIGFub3RoZXIncyBpZGVudGl0eSBvciBoaWRlXG4vLyBwYXlsb2FkcyBpbiBsYWJlbHMuIEEgY2hhckNvZGUgc2NhbiAobm90IGEgcmVnZXggbGl0ZXJhbCB3aXRoIHJhdyBjb250cm9sXG4vLyBjaGFycykgc2lkZXN0ZXBzIGJpb21lJ3Mgbm9Db250cm9sQ2hhcmFjdGVyc0luUmVnZXggd2hpbGUga2VlcGluZyB0aGUgc2FtZVxuLy8gc2VtYW50aWNzIOKAlCBzYW1lIGFwcHJvYWNoIGFzIHRoZSBodWIncyBzYW5pdGl6ZUZvckxvZyAoRERSLTA1MykuXG5mdW5jdGlvbiBpc1Vuc2FmZUNvZGVQb2ludChjcDogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY3AgPD0gMHgxZiB8fFxuICAgIChjcCA+PSAweDdmICYmIGNwIDw9IDB4OWYpIHx8XG4gICAgKGNwID49IDB4MjAwYiAmJiBjcCA8PSAweDIwMGYpIHx8XG4gICAgKGNwID49IDB4MjAyYSAmJiBjcCA8PSAweDIwMmUpIHx8XG4gICAgKGNwID49IDB4MjA2NiAmJiBjcCA8PSAweDIwNjkpIHx8XG4gICAgY3AgPT09IDB4ZmVmZlxuICApO1xufVxuXG5mdW5jdGlvbiBzYW5pdGl6ZU5hbWUocmF3OiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiByYXcgIT09ICdzdHJpbmcnKSByZXR1cm4gJ2Fub255bW91cyc7XG4gIGxldCBjbGVhbmVkID0gJyc7XG4gIGZvciAoY29uc3QgY2ggb2YgcmF3KSB7XG4gICAgaWYgKCFpc1Vuc2FmZUNvZGVQb2ludChjaC5jb2RlUG9pbnRBdCgwKSA/PyAwKSkgY2xlYW5lZCArPSBjaDtcbiAgfVxuICBjbGVhbmVkID0gY2xlYW5lZC50cmltKCkuc2xpY2UoMCwgTUFYX05BTUVfTEVOKTtcbiAgcmV0dXJuIGNsZWFuZWQgfHwgJ2Fub255bW91cyc7XG59XG5cbmZ1bmN0aW9uIHNhbml0aXplQ3Vyc29yKHJhdzogdW5rbm93bik6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB8IG51bGwge1xuICBpZiAoIXJhdyB8fCB0eXBlb2YgcmF3ICE9PSAnb2JqZWN0JykgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGMgPSByYXcgYXMgeyB4PzogdW5rbm93bjsgeT86IHVua25vd24gfTtcbiAgcmV0dXJuIGlzRmluaXRlTnVtKGMueCkgJiYgaXNGaW5pdGVOdW0oYy55KSA/IHsgeDogYy54LCB5OiBjLnkgfSA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIHNhbml0aXplVmlld3BvcnQocmF3OiB1bmtub3duKTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgem9vbTogbnVtYmVyIH0ge1xuICBjb25zdCBmYWxsYmFjayA9IHsgeDogMCwgeTogMCwgem9vbTogMSB9O1xuICBpZiAoIXJhdyB8fCB0eXBlb2YgcmF3ICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbGxiYWNrO1xuICBjb25zdCB2ID0gcmF3IGFzIHsgeD86IHVua25vd247IHk/OiB1bmtub3duOyB6b29tPzogdW5rbm93biB9O1xuICBpZiAoIWlzRmluaXRlTnVtKHYueCkgfHwgIWlzRmluaXRlTnVtKHYueSkgfHwgIWlzRmluaXRlTnVtKHYuem9vbSkgfHwgdi56b29tIDw9IDApXG4gICAgcmV0dXJuIGZhbGxiYWNrO1xuICByZXR1cm4geyB4OiB2LngsIHk6IHYueSwgem9vbTogdi56b29tIH07XG59XG5cbmZ1bmN0aW9uIHNhbml0aXplU2VsZWN0aW9uKHJhdzogdW5rbm93bik6IENvbGxhYkF3YXJlbmVzc1N0YXRlWydzZWxlY3Rpb24nXSB7XG4gIGlmICghcmF3IHx8IHR5cGVvZiByYXcgIT09ICdvYmplY3QnKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgcyA9IHJhdyBhcyB7IGNzc1BhdGg/OiB1bmtub3duOyBib3VuZHM/OiB1bmtub3duIH07XG4gIGNvbnN0IGIgPSBzLmJvdW5kcyBhcyB7IHg/OiB1bmtub3duOyB5PzogdW5rbm93bjsgdz86IHVua25vd247IGg/OiB1bmtub3duIH0gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGJvdW5kcyA9XG4gICAgYiAmJiBpc0Zpbml0ZU51bShiLngpICYmIGlzRmluaXRlTnVtKGIueSkgJiYgaXNGaW5pdGVOdW0oYi53KSAmJiBpc0Zpbml0ZU51bShiLmgpXG4gICAgICA/IHsgeDogYi54LCB5OiBiLnksIHc6IGIudywgaDogYi5oIH1cbiAgICAgIDogbnVsbDtcbiAgLy8gT25seSBrZWVwIGNzc1BhdGggaWYgaXQgbWF0Y2hlcyB0aGUgbG9jYXRvciBncmFtbWFyIOKAlCBvdGhlcndpc2UgZHJvcCBpdCBhbmRcbiAgLy8gbGV0IHRoZSByZW5kZXJlciBmYWxsIGJhY2sgdG8gdGhlICh2YWxpZGF0ZWQpIGJvdW5kcy5cbiAgY29uc3QgY3NzUGF0aCA9IHR5cGVvZiBzLmNzc1BhdGggPT09ICdzdHJpbmcnICYmIGlzU2FmZUNzc1BhdGgocy5jc3NQYXRoKSA/IHMuY3NzUGF0aCA6ICcnO1xuICBpZiAoIWNzc1BhdGggJiYgIWJvdW5kcykgcmV0dXJuIG51bGw7XG4gIHJldHVybiB7IGNzc1BhdGgsIGJvdW5kczogYm91bmRzID8/IHsgeDogMCwgeTogMCwgdzogMCwgaDogMCB9IH07XG59XG5cbmZ1bmN0aW9uIHNhbml0aXplQW5ub3RhdGlvblNlbGVjdGlvbihyYXc6IHVua25vd24pOiBzdHJpbmdbXSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShyYXcpKSByZXR1cm4gW107XG4gIGNvbnN0IG91dDogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBpZCBvZiByYXcpIHtcbiAgICBpZiAob3V0Lmxlbmd0aCA+PSBNQVhfQU5OT1RBVElPTl9JRFMpIGJyZWFrO1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiBpZCA9PT0gJ3N0cmluZycgJiZcbiAgICAgIGlkLmxlbmd0aCA8PSBNQVhfQU5OT1RBVElPTl9JRF9MRU4gJiZcbiAgICAgIEFOTk9UQVRJT05fSURfQUxMT1dFRC50ZXN0KGlkKVxuICAgIClcbiAgICAgIG91dC5wdXNoKGlkKTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vLyBTb2Z0IGVkaXRpbmctcHJlc2VuY2UgKFBoYXNlIDMwKS4gYHNpbmNlYCBtdXN0IGJlIGEgZmluaXRlIFBPU0lUSVZFIGVwb2NoLW1zXG4vLyB0aGF0IGlzIG5vdCBpbiB0aGUgZnV0dXJlIChhbGxvdyDCsTUgcyBjbG9jayBza2V3KS4gQSBmdXR1cmUgLyBOYU4gLyBJbmZpbml0eSAvXG4vLyBub24tcG9zaXRpdmUgdmFsdWUgaXMgcmVqZWN0ZWQg4oaSIGBudWxsYCAodHJlYXRlZCBhcyBub3QtZWRpdGluZyksIHNvIGEgaG9zdGlsZVxuLy8gaHViIHBlZXIgY2FuJ3QgcGluIGEgcGVybWFuZW50IFwiZWRpdGluZ1wiIGJhZGdlIHdpdGggYSBmYXItZnV0dXJlIHRpbWVzdGFtcCBvclxuLy8gcG9pc29uIGEgYERhdGUubm93KCkgLSBzaW5jZWAgYWdlIGNvbXB1dGF0aW9uIHdpdGggYSBOYU4uXG5mdW5jdGlvbiBzYW5pdGl6ZUVkaXRpbmdTdGF0ZShyYXc6IHVua25vd24pOiB7IHNpbmNlOiBudW1iZXIgfSB8IG51bGwge1xuICBpZiAoIXJhdyB8fCB0eXBlb2YgcmF3ICE9PSAnb2JqZWN0JykgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGUgPSByYXcgYXMgeyBzaW5jZT86IHVua25vd24gfTtcbiAgaWYgKCFpc0Zpbml0ZU51bShlLnNpbmNlKSB8fCBlLnNpbmNlIDw9IDAgfHwgZS5zaW5jZSA+IERhdGUubm93KCkgKyA1MDAwKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIHsgc2luY2U6IGUuc2luY2UgfTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSArIG5vcm1hbGl6ZSBvbmUgZm9yZWlnbiBhd2FyZW5lc3Mgc3RhdGUgYXQgdGhlIHRydXN0IGJvdW5kYXJ5LlxuICogUmV0dXJucyBudWxsIGZvciBzdGF0ZXMgdGhhdCBjYW4ndCBiZSBhIHBlZXIgKG5vIHVzYWJsZSBuYW1lKS4gYGNvbG9yYCBpc1xuICogYWx3YXlzIHJlLWRlcml2ZWQgbG9jYWxseSBmcm9tIHRoZSBzYW5pdGl6ZWQgbmFtZSDigJQgdGhlIHdpcmUgdmFsdWUgaXMgbmV2ZXJcbiAqIHRydXN0ZWQsIHdoaWNoIGlzIHdoYXQgY2xvc2VzIHRoZSBodWIgQ1NTLWB1cmwoKWAgZXhmaWwgY2hhbm5lbC4gRXhwb3J0ZWQgc29cbiAqIHRoZSBob3N0aWxlLWlucHV0IG1hdHJpeCBjYW4gZXhlcmNpc2UgaXQgd2l0aG91dCBhIFJlYWN0IGhhcm5lc3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzYW5pdGl6ZUZvcmVpZ25TdGF0ZShjbGllbnRJRDogbnVtYmVyLCBzdGF0ZTogdW5rbm93bik6IEZvcmVpZ25Bd2FyZW5lc3MgfCBudWxsIHtcbiAgaWYgKCFzdGF0ZSB8fCB0eXBlb2Ygc3RhdGUgIT09ICdvYmplY3QnKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgcyA9IHN0YXRlIGFzIFBhcnRpYWw8Q29sbGFiQXdhcmVuZXNzU3RhdGU+O1xuICBpZiAodHlwZW9mIHMubmFtZSAhPT0gJ3N0cmluZycpIHJldHVybiBudWxsO1xuICBjb25zdCBuYW1lID0gc2FuaXRpemVOYW1lKHMubmFtZSk7XG4gIHJldHVybiB7XG4gICAgY2xpZW50SUQsXG4gICAgbmFtZSxcbiAgICBjb2xvcjogY29sb3JGb3JOYW1lKG5hbWUpLFxuICAgIGN1cnNvcjogc2FuaXRpemVDdXJzb3Iocy5jdXJzb3IpLFxuICAgIHNlbGVjdGlvbjogc2FuaXRpemVTZWxlY3Rpb24ocy5zZWxlY3Rpb24pLFxuICAgIGFubm90YXRpb25TZWxlY3Rpb246IHNhbml0aXplQW5ub3RhdGlvblNlbGVjdGlvbihzLmFubm90YXRpb25TZWxlY3Rpb24pLFxuICAgIHZpZXdwb3J0OiBzYW5pdGl6ZVZpZXdwb3J0KHMudmlld3BvcnQpLFxuICAgIGVkaXRpbmc6IHNhbml0aXplRWRpdGluZ1N0YXRlKHMuZWRpdGluZyksXG4gIH07XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gQ29udGV4dC5cblxuaW50ZXJmYWNlIENvbGxhYlZhbHVlIHtcbiAgZG9jOiBZLkRvYztcbiAgLyoqXG4gICAqIFNFQ1VSSVRZIElOVkFSSUFOVDogaW4gbGlua2VkIG1vZGUgdGhpcyBBd2FyZW5lc3MgY2FycmllcyBzdGF0ZXMgcmVsYXllZFxuICAgKiBmcm9tIGEgU0VNSS1UUlVTVEVEIGh1YiAoRERSLTA1NCkuIEZvcmVpZ24gc3RhdGVzIGFyZSB1bnRydXN0ZWQgaW5wdXQg4oCUXG4gICAqIHJlYWQgdGhlbSBPTkxZIHRocm91Z2ggYHVzZUZvcmVpZ25Bd2FyZW5lc3NgLCB3aGljaCBzYW5pdGl6ZXMgZXZlcnkgZmllbGRcbiAgICogYXQgdGhlIHRydXN0IGJvdW5kYXJ5IChgc2FuaXRpemVGb3JlaWduU3RhdGVgKS4gRG8gTk9UIGNhbGxcbiAgICogYGF3YXJlbmVzcy5nZXRTdGF0ZXMoKWAgZGlyZWN0bHkgaW4gcmVuZGVyIGNvZGU7IHRoYXQgYnlwYXNzZXMgdGhlIGdhdGUuXG4gICAqL1xuICBhd2FyZW5lc3M6IEF3YXJlbmVzcztcbiAgLyoqIExvY2FsIHBlZXIncyBzZXNzaW9uLXN0YWJsZSBjb2xvciAoZGVyaXZlZCBmcm9tIGdpdCB1c2VyLm5hbWUpLiAqL1xuICBteUNvbG9yOiBzdHJpbmc7XG4gIC8qKiBMb2NhbCBwZWVyJ3MgZGlzcGxheSBuYW1lIChnaXQgdXNlci5uYW1lIG9yIGFub255bW91cyBmYWxsYmFjaykuICovXG4gIG15TmFtZTogc3RyaW5nO1xuICAvKiogTG9jYWwgcGVlcidzIGNvbm5lY3Rpb24gaWQgKG1hdGNoZXMgc2VydmVyLXNpZGUgd3MuZGF0YS5pZCBwYXR0ZXJuKS4gKi9cbiAgbXlDb25uSWQ6IHN0cmluZztcbiAgLyoqIFRydWUgd2hlbiB0aGUgV1MgaXMgT1BFTi4gQ3Vyc29yIG92ZXJsYXkgY2FuIHVzZSB0aGlzIHRvIGdhdGUgcmVuZGVyaW5nLiAqL1xuICBjb25uZWN0ZWQ6IGJvb2xlYW47XG4gIC8qKiBQdWJsaXNoIChkZWJvdW5jZS1jb2FsZXNjZWQpIGFuIHVwZGF0ZWQgbG9jYWwgYXdhcmVuZXNzIHN0YXRlLiAqL1xuICBwdWJsaXNoQXdhcmVuZXNzOiAocGF0Y2g6IFBhcnRpYWw8T21pdDxDb2xsYWJBd2FyZW5lc3NTdGF0ZSwgJ19fY29ubklkJz4+KSA9PiB2b2lkO1xufVxuXG5jb25zdCBDb2xsYWJDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxDb2xsYWJWYWx1ZSB8IG51bGw+KG51bGwpO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlQ29sbGFiKCk6IENvbGxhYlZhbHVlIHwgbnVsbCB7XG4gIHJldHVybiB1c2VDb250ZXh0KENvbGxhYkNvbnRleHQpO1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEhvb2s6IGZvcmVpZ24gYXdhcmVuZXNzIHBlZXJzICh0aGUgY3Vyc29yIG92ZXJsYXkgc3Vic2NyaWJlcyB0byB0aGlzKS5cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNldCBvZiBmb3JlaWduIHBlZXJzIChleGNsdWRlcyB0aGUgbG9jYWwgY2xpZW50KS4gVGhlXG4gKiByZXR1cm5lZCBhcnJheSBpcyBzdGFibGUtcmVmZXJlbmNlIGJldHdlZW4gYXdhcmVuZXNzIHVwZGF0ZXMg4oCUIHVzZWZ1bCBmb3JcbiAqIGRvd25zdHJlYW0gUmVhY3QubWVtbyBjdXJzb3IgY29tcG9uZW50cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUZvcmVpZ25Bd2FyZW5lc3MoKTogRm9yZWlnbkF3YXJlbmVzc1tdIHtcbiAgY29uc3QgY29sbGFiID0gdXNlQ29sbGFiKCk7XG4gIGNvbnN0IFtwZWVycywgc2V0UGVlcnNdID0gdXNlU3RhdGU8Rm9yZWlnbkF3YXJlbmVzc1tdPihbXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWNvbGxhYikge1xuICAgICAgc2V0UGVlcnMoW10pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7IGF3YXJlbmVzcyB9ID0gY29sbGFiO1xuICAgIGZ1bmN0aW9uIGNvbXB1dGUoKTogRm9yZWlnbkF3YXJlbmVzc1tdIHtcbiAgICAgIGNvbnN0IG91dDogRm9yZWlnbkF3YXJlbmVzc1tdID0gW107XG4gICAgICBjb25zdCBteUlkID0gYXdhcmVuZXNzLmNsaWVudElEO1xuICAgICAgZm9yIChjb25zdCBbY2xpZW50SUQsIHN0YXRlXSBvZiBhd2FyZW5lc3MuZ2V0U3RhdGVzKCkgYXMgTWFwPG51bWJlciwgdW5rbm93bj4pIHtcbiAgICAgICAgaWYgKGNsaWVudElEID09PSBteUlkKSBjb250aW51ZTtcbiAgICAgICAgaWYgKG91dC5sZW5ndGggPj0gTUFYX0ZPUkVJR05fUEVFUlMpIGJyZWFrOyAvLyBib3VuZCBEb1MgdmlhIHVuYm91bmRlZCBwZWVyc1xuICAgICAgICAvLyBTYW5pdGl6ZSBldmVyeSBub3ctcmVtb3RlIGZpZWxkIGF0IHRoaXMgdHJ1c3QgYm91bmRhcnkgKFRhc2sgNSkuXG4gICAgICAgIGNvbnN0IHBlZXIgPSBzYW5pdGl6ZUZvcmVpZ25TdGF0ZShjbGllbnRJRCwgc3RhdGUpO1xuICAgICAgICBpZiAocGVlcikgb3V0LnB1c2gocGVlcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0O1xuICAgIH1cbiAgICBzZXRQZWVycyhjb21wdXRlKCkpO1xuICAgIGNvbnN0IG9uQ2hhbmdlID0gKCkgPT4gc2V0UGVlcnMoY29tcHV0ZSgpKTtcbiAgICBhd2FyZW5lc3Mub24oJ2NoYW5nZScsIG9uQ2hhbmdlKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgYXdhcmVuZXNzLm9mZignY2hhbmdlJywgb25DaGFuZ2UpO1xuICAgIH07XG4gIH0sIFtjb2xsYWJdKTtcblxuICByZXR1cm4gcGVlcnM7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gSG9vazogc29mdCBlZGl0aW5nLXByZXNlbmNlIChQaGFzZSAzMCkuXG4vL1xuLy8gQSBTT0ZULCBhdHRyaWJ1dGVkIFwiSSdtIGVkaXRpbmcgdGhpcyBjYW52YXNcIiBoZWFkcy11cCDigJQgTk9UIGEgbG9jay4gSXQgcmlkZXNcbi8vIHRoZSBzYW1lIHBlci1jYW52YXMgYXdhcmVuZXNzIGNoYW5uZWwgYXMgY3Vyc29ycyAoc28gaXQgY3Jvc3NlcyB0aGUgaHViIGZvclxuLy8gZnJlZSB2aWEgdGhlIGF3YXJlbmVzcyBicmlkZ2UpIGFuZCBpcyBzdXJmYWNlZCBieSB0aGUgcGVlciBvdmVybGF5IHNvIHR3b1xuLy8gcGVvcGxlIChvciBhIHBlcnNvbiArIGFuIGFnZW50KSBkb24ndCB1bmtub3dpbmdseSBlZGl0IHRoZSBzYW1lIGNhbnZhcyBhdCB0aGVcbi8vIHNhbWUgbW9tZW50LiBJdCBuZXZlciBibG9ja3MgYW55b25lOyB0aGUgdmlzdWFsIGNvbmZsaWN0IHBpY2tlciAoRERSLTExNilcbi8vIHJlbWFpbnMgdGhlIHNhZmV0eSBuZXQgZm9yIGRpdmVyZ2VudCBzYXZlcy5cblxuY29uc3QgRURJVElOR19JRExFX01TID0gNTAwMDtcblxuLyoqXG4gKiBSZXR1cm5zIGBzZXRFZGl0aW5nKClgIC8gYGNsZWFyRWRpdGluZygpYC4gQ2FsbCBgc2V0RWRpdGluZygpYCBvbiBlYWNoIGVkaXRcbiAqIHRoZSBsb2NhbCB1c2VyIG1ha2VzIChDU1MtaW5zcGVjdG9yIHR3ZWFrLCBgL2Rlc2lnbjplZGl0YC1kcml2ZW4gd3JpdGUpOyBpdFxuICogcHVibGlzaGVzIGBlZGl0aW5nOiB7IHNpbmNlIH1gIG9uY2UgYW5kIGF1dG8tZXh0ZW5kcywgdGhlbiBhdXRvLWNsZWFycyBhZnRlclxuICogYEVESVRJTkdfSURMRV9NU2Agb2Ygbm8gY2FsbHMgKGFuZCBvbiB1bm1vdW50KS4gQSBuby1vcCBvdXRzaWRlIGFcbiAqIGBDb2xsYWJQcm92aWRlcmAgKHJldHVybnMgY2FsbGJhY2tzIHRoYXQgZG8gbm90aGluZykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VFZGl0aW5nUHJlc2VuY2UoKTogeyBzZXRFZGl0aW5nOiAoKSA9PiB2b2lkOyBjbGVhckVkaXRpbmc6ICgpID0+IHZvaWQgfSB7XG4gIGNvbnN0IGNvbGxhYiA9IHVzZUNvbGxhYigpO1xuICBjb25zdCBpZGxlVGltZXJSZWYgPSB1c2VSZWY8UmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsPihudWxsKTtcbiAgY29uc3Qgc2luY2VSZWYgPSB1c2VSZWY8bnVtYmVyIHwgbnVsbD4obnVsbCk7XG5cbiAgY29uc3QgY2xlYXJFZGl0aW5nID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGlmIChpZGxlVGltZXJSZWYuY3VycmVudCkge1xuICAgICAgY2xlYXJUaW1lb3V0KGlkbGVUaW1lclJlZi5jdXJyZW50KTtcbiAgICAgIGlkbGVUaW1lclJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHNpbmNlUmVmLmN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIHNpbmNlUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgY29sbGFiPy5wdWJsaXNoQXdhcmVuZXNzKHsgZWRpdGluZzogbnVsbCB9KTtcbiAgICB9XG4gIH0sIFtjb2xsYWJdKTtcblxuICBjb25zdCBzZXRFZGl0aW5nID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGlmICghY29sbGFiKSByZXR1cm47XG4gICAgaWYgKHNpbmNlUmVmLmN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgIHNpbmNlUmVmLmN1cnJlbnQgPSBEYXRlLm5vdygpO1xuICAgICAgY29sbGFiLnB1Ymxpc2hBd2FyZW5lc3MoeyBlZGl0aW5nOiB7IHNpbmNlOiBzaW5jZVJlZi5jdXJyZW50IH0gfSk7XG4gICAgfVxuICAgIGlmIChpZGxlVGltZXJSZWYuY3VycmVudCkgY2xlYXJUaW1lb3V0KGlkbGVUaW1lclJlZi5jdXJyZW50KTtcbiAgICBpZGxlVGltZXJSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoY2xlYXJFZGl0aW5nLCBFRElUSU5HX0lETEVfTVMpO1xuICB9LCBbY29sbGFiLCBjbGVhckVkaXRpbmddKTtcblxuICAvLyBDbGVhciBsb2NhbCBlZGl0aW5nLXByZXNlbmNlIG9uIHVubW91bnQuXG4gIHVzZUVmZmVjdCgoKSA9PiAoKSA9PiBjbGVhckVkaXRpbmcoKSwgW2NsZWFyRWRpdGluZ10pO1xuXG4gIHJldHVybiB7IHNldEVkaXRpbmcsIGNsZWFyRWRpdGluZyB9O1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFNsdWcgZGVyaXZhdGlvbiDigJQgbXVzdCBtYXRjaCBgYXBpLmZpbGVTbHVnYCBzZXJ2ZXItc2lkZS5cblxuLyoqXG4gKiBNaXJyb3Igb2Ygc2VydmVyLXNpZGUgYGFwaS5maWxlU2x1Z2AuIFRoZSBpbnB1dCBpcyB0aGUgY2FudmFzIHBhdGggYXMgdGhlXG4gKiBzaGVsbCBzdG9yZWQgaXQgb24gYHdpbmRvdy5fX2NhbnZhc19tZXRhX2ZpbGVfX2AgKGUuZy4gYC5kZXNpZ24vdWkvRm9vLnRzeGApLlxuICogU3RyaXAgdGhlIGRlc2lnblJlbCBwcmVmaXggKHJlYWQgZnJvbSBgd2luZG93Ll9fY2FudmFzX2Rlc2lnbl9yZWxfX2AsIHNldFxuICogYnkgX3NoZWxsLmh0bWwpIHNvIGJvdGggc2lkZXMgbGFuZCBvbiB0aGUgc2FtZSBzbHVnIOKAlCB3aXRob3V0IHRoaXMgYm90aFxuICogdGFicyBvcGVuIGEgYGRlc2lnbi11aS1mb29gIHJvb20gd2hpbGUgdGhlIHNlcnZlcidzIGluc3BlY3RvciBicmlkZ2VcbiAqIHB1c2hlcyBpbnRvIGB1aS1mb29gLCBhbmQgdGhlIHJvb21zIG5ldmVyIGNvbnZlcmdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FudmFzU2x1Z0Zyb21QYXRoKGNhbnZhc1JlbDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IG51bGwge1xuICBpZiAoIWNhbnZhc1JlbCkgcmV0dXJuIG51bGw7XG4gIGxldCBwID0gY2FudmFzUmVsLnJlcGxhY2UoL15cXC8rfFxcLyskL2csICcnKTtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgY29uc3QgdyA9IHdpbmRvdyBhcyB1bmtub3duIGFzIHsgX19jYW52YXNfZGVzaWduX3JlbF9fPzogc3RyaW5nIH07XG4gICAgY29uc3QgZGVzaWduUmVsID0gKHcuX19jYW52YXNfZGVzaWduX3JlbF9fID8/ICcnKS5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCAnJyk7XG4gICAgaWYgKGRlc2lnblJlbCAmJiBwLnN0YXJ0c1dpdGgoYCR7ZGVzaWduUmVsfS9gKSkgcCA9IHAuc2xpY2UoZGVzaWduUmVsLmxlbmd0aCArIDEpO1xuICB9XG4gIGNvbnN0IHNsdWcgPSBwXG4gICAgLnJlcGxhY2UoL1xcLy9nLCAnLScpXG4gICAgLnJlcGxhY2UoL1xccysvZywgJ18nKVxuICAgIC5yZXBsYWNlKC9cXC4odHN4fGh0bWwpJC9pLCAnJylcbiAgICAucmVwbGFjZSgvXlxcLisvLCAnJylcbiAgICAudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIC9eW2EtejAtOV8tXSskLy50ZXN0KHNsdWcpID8gc2x1ZyA6IG51bGw7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gTW9kdWxlLWxldmVsLCByZWZjb3VudGVkIGNvbGxhYiBzZXNzaW9uIChGNCDigJQgcHJlc2VuY2Ugc3Vydml2ZXMgYSBob3Qtc3dhcCkuXG4vL1xuLy8gQSBjcm9zcy1wZWVyIHN5bmNlZCBlZGl0IChvciBhbiBhZ2VudCBlZGl0KSBob3Qtc3dhcHMgdGhlIGNhbnZhcyBtb2R1bGUgaW5cbi8vIHBsYWNlLCB3aGljaCBSRU1PVU5UUyB0aGUgd2hvbGUgY2FudmFzIHN1YnRyZWUg4oCUIGluY2x1ZGluZyA8Q29sbGFiUHJvdmlkZXI+LlxuLy8gSWYgdGhlIFkuRG9jICsgQXdhcmVuZXNzICsgV2ViU29ja2V0IHdlcmUgb3duZWQgYnkgdGhlIGNvbXBvbmVudCAodXNlTWVtbyAvXG4vLyB1c2VFZmZlY3QpLCB0aGF0IHJlbW91bnQgd291bGQgQ0xPU0UgdGhlIGF3YXJlbmVzcyBzb2NrZXQgYW5kIHJlLWhhbmRzaGFrZSwgc29cbi8vIGV2ZXJ5IHBlZXIncyBjdXJzb3IgKyBhdmF0YXIgYmxpbmtzIG91dCBhbmQgYmFjayBvbiBldmVyeSBzeW5jZWQgY2hhbmdlICh0aGVcbi8vIEY0IGJ1ZykuIEluc3RlYWQgdGhlIGxpdmUgc2Vzc2lvbiBsaXZlcyBIRVJFLCBrZXllZCBieSBzbHVnICsgcmVmY291bnRlZDogYVxuLy8gc2FtZS1zbHVnIHJlbW91bnQgcmUtYWNxdWlyZXMgdGhlIFNBTUUgZG9jL2F3YXJlbmVzcy9zb2NrZXQgd2l0aGluIGEgc2hvcnRcbi8vIGdyYWNlIHdpbmRvdywgc28gdGhlIGF3YXJlbmVzcyBjb25uZWN0aW9uIG5ldmVyIGRyb3BzIGFuZCBwcmVzZW5jZSBpcyBzdGFibGUuXG4vL1xuLy8gT25lIGNhbnZhcyBpZnJhbWUgaXMgb25lIHJlYWxtIGFuZCBvbmx5IGV2ZXIgaG9sZHMgb25lIHNsdWcgKHN3aXRjaGluZ1xuLy8gY2FudmFzZXMgbmF2aWdhdGVzIHRoZSBpZnJhbWUg4oaSIGZyZXNoIHJlYWxtIOKGkiBmcmVzaCBtb2R1bGUgc3RhdGUpLCBzbyB0aGUgbWFwXG4vLyBob2xkcyBhdCBtb3N0IG9uZSBsaXZlIGVudHJ5IHBsdXMsIGJyaWVmbHksIG9uZSBkcmFpbmluZyBvbmUuXG5cbmNvbnN0IEFXQVJFTkVTU19USFJPVFRMRV9NUyA9IDMzOyAvLyB+MzAgSHpcblxuaW50ZXJmYWNlIENvbGxhYlNlc3Npb24ge1xuICBzbHVnOiBzdHJpbmc7XG4gIGRvYzogWS5Eb2M7XG4gIGF3YXJlbmVzczogQXdhcmVuZXNzO1xuICBjb25uSWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBjb2xvcjogc3RyaW5nO1xuICBjb25uZWN0ZWQ6IGJvb2xlYW47XG4gIHJlZkNvdW50OiBudW1iZXI7XG4gIGRlc3Ryb3lUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsO1xuICAvKiogUmVhY3QgY29uc3VtZXJzIHN1YnNjcmliZSBzbyBuYW1lL2NvbG9yL2Nvbm5lY3RlZCBjaGFuZ2VzIHJlLXJlbmRlci4gKi9cbiAgbGlzdGVuZXJzOiBTZXQ8KCkgPT4gdm9pZD47XG4gIC8qKiBUZWFyIGRvd24gdGhlIHNvY2tldCArIGxpc3RlbmVycyArIGRlc3Ryb3kgZG9jL2F3YXJlbmVzcy4gKi9cbiAgc3RvcDogKCkgPT4gdm9pZDtcbn1cblxuLy8gVGhlIHNlc3Npb24gcmVnaXN0cnkgTVVTVCBsaXZlIG9uIGB3aW5kb3dgLCBub3QgaW4gbW9kdWxlIHNjb3BlLCBhbmQgYmVcbi8vIHJlc29sdmVkIExBWklMWSAocGVyIGFjY2Vzcywgbm90IG9uY2UgYXQgbW9kdWxlIGxvYWQpLiBBIGhvdC1zd2FwIChGNClcbi8vIHJlLWltcG9ydHMgdGhlIGNhbnZhcyBidW5kbGUgd2l0aCBhIGNhY2hlLWJ1c3RpbmcgYD92PWAgcXVlcnksIGFuZCB1c2UtY29sbGFiXG4vLyBpcyBJTkxJTkVEIGludG8gdGhhdCBwZXItY2FudmFzIGJ1bmRsZSDigJQgc28gZWFjaCBob3Qtc3dhcCByZS1ldmFsdWF0ZXMgYSBGUkVTSFxuLy8gbW9kdWxlIHdpdGggYSBmcmVzaCBtb2R1bGUtbGV2ZWwgYmluZGluZy4gQSBwbGFpbiBgY29uc3QgU0VTU0lPTlMgPSBuZXcgTWFwKClgXG4vLyB3b3VsZCB0aGVyZWZvcmUgYmUgZW1wdHkgb24gZXZlcnkgaG90LXN3YXAgYW5kIHdlJ2Qgc3BpbiBhIG5ldyBZLkRvYyArXG4vLyBBd2FyZW5lc3MgKyBzb2NrZXQgKG5ldyBjbGllbnRJRCkgZWFjaCB0aW1lLCBsZWF2aW5nIHRoZSBwcmlvciBjbGllbnRJRCdzXG4vLyBhd2FyZW5lc3MgdG8gbGluZ2VyIG9uIHRoZSBodWIg4oaSIHBoYW50b20gXCJzZWxmXCIgYXZhdGFycyBwaWxlIHVwIHVudGlsIHRoZVxuLy8gYXdhcmVuZXNzIHRpbWVvdXQuIEFuY2hvcmluZyB0aGUgbWFwIG9uIHRoZSBpZnJhbWUncyBgd2luZG93YCAod2hpY2ggc3Vydml2ZXNcbi8vIG1vZHVsZSByZS1ldmFsdWF0aW9uKSBpcyB3aGF0IG1ha2VzIHRoZSBzZXNzaW9uIOKAlCBhbmQgdGh1cyBwcmVzZW5jZSDigJQgc3Vydml2ZVxuLy8gdGhlIHN3YXAuIExhenkgcmVzb2x1dGlvbiBhbHNvIHRvbGVyYXRlcyBhIGB3aW5kb3dgIHRoYXQgYmVjb21lcyBhdmFpbGFibGVcbi8vIGFmdGVyIHRoaXMgbW9kdWxlIGZpcnN0IGV2YWx1YXRlcyAodGVzdCBoYXJuZXNzOiBpbXBvcnRzIGFyZSBob2lzdGVkIGFib3ZlXG4vLyBoYXBweS1kb20gcmVnaXN0cmF0aW9uKS5cbi8vXG4vLyBTRUNVUklUWSAoRERSLTA1NCk6IHRoZSBjYW52YXMgaWZyYW1lIGlzIHVudHJ1c3RlZCBhbmQgc2hhcmVzIHRoaXMgcmVhbG0sIHNvXG4vLyB0aGUgcmVnaXN0cnkgaG9sZHMgbGl2ZSBuZXR3b3JrIGhhbmRsZXMgaW4gcmVhY2ggb2YgY2FudmFzIHNjcmlwdC4gV2Uga2V5IGl0XG4vLyBieSBhIE5PTi1FTlVNRVJBQkxFIGdsb2JhbCBTeW1ib2wgKG5vdCBhbiBlbnVtZXJhYmxlIHN0cmluZyBwcm9wZXJ0eSkgc28gaXRcbi8vIGNhbid0IGJlIGhhcnZlc3RlZCBieSBhbiBvcHBvcnR1bmlzdGljIGBmb3LigKZpbmAgLyBgT2JqZWN0LmtleXMod2luZG93KWAgc3dlZXBcbi8vIOKAlCBkZWZlbnNlIGluIGRlcHRoLCBOT1QgYSB0cnVzdCBib3VuZGFyeTogc2FtZS1yZWFsbSBjYW52YXMgY29kZSBjYW4gYWxyZWFkeVxuLy8gcmVhY2ggY29sbGFiIHN0YXRlIHRocm91Z2ggYHVzZUNvbGxhYigpYCwgYW5kIGBTeW1ib2wuZm9yYCBpcyByZWNvdmVyYWJsZSBieSBhXG4vLyBkZXRlcm1pbmVkIGF0dGFja2VyLiBDbG9zaW5nIHRoZSB1bmRlcmx5aW5nIFwidW50cnVzdGVkIGNhbnZhcyBjYW4gbXV0YXRlIHRoZVxuLy8gc2hhcmVkIGRvY1wiIHN1cmZhY2UgaXMgYSBzZXBhcmF0ZSwgcHJlLWV4aXN0aW5nIGNvbmNlcm4gKHRyYWNrZWQgYXMgYVxuLy8gZm9sbG93LXVwKTsgdGhpcyBrZWVwcyB0aGUgaG90LXN3YXAgZml4IGZyb20gV0lERU5JTkcgZGlzY292ZXJ5LiBBIGdsb2JhbFxuLy8gU3ltYm9sIChzaGFyZWQgcmVnaXN0cnkpIGlzIHJlcXVpcmVkIHNvIHRoZSByZS1pbXBvcnRlZCBtb2R1bGUgcmVzb2x2ZXMgdGhlXG4vLyBTQU1FIGtleSDigJQgYSBwZXItbW9kdWxlIGBTeW1ib2woKWAgd291bGQgZGVmZWF0IHRoZSBjcm9zcy1yZS1pbXBvcnQgc3Vydml2YWwuXG5jb25zdCBTRVNTSU9OU19LRVkgPSBTeW1ib2wuZm9yKCdtYXVkZS5jb2xsYWIuc2Vzc2lvbnMudjEnKTtcbmxldCBtb2R1bGVGYWxsYmFja1Nlc3Npb25zOiBNYXA8c3RyaW5nLCBDb2xsYWJTZXNzaW9uPiB8IG51bGwgPSBudWxsO1xuZnVuY3Rpb24gZ2V0U2Vzc2lvbnMoKTogTWFwPHN0cmluZywgQ29sbGFiU2Vzc2lvbj4ge1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAoIW1vZHVsZUZhbGxiYWNrU2Vzc2lvbnMpIG1vZHVsZUZhbGxiYWNrU2Vzc2lvbnMgPSBuZXcgTWFwPHN0cmluZywgQ29sbGFiU2Vzc2lvbj4oKTtcbiAgICByZXR1cm4gbW9kdWxlRmFsbGJhY2tTZXNzaW9ucztcbiAgfVxuICBjb25zdCB3ID0gd2luZG93IGFzIHVua25vd24gYXMgUmVjb3JkPHN5bWJvbCwgTWFwPHN0cmluZywgQ29sbGFiU2Vzc2lvbj4gfCB1bmRlZmluZWQ+O1xuICBsZXQgbWFwID0gd1tTRVNTSU9OU19LRVldO1xuICBpZiAoIW1hcCkge1xuICAgIG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBDb2xsYWJTZXNzaW9uPigpO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3LCBTRVNTSU9OU19LRVksIHtcbiAgICAgIHZhbHVlOiBtYXAsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG1hcDtcbn1cblxuLy8gS2VlcCBhIHJlZmNvdW50LTAgc2Vzc2lvbiBhbGl2ZSBicmllZmx5IHNvIGEgaG90LXN3YXAgcmVtb3VudCAod2hpY2ggdW5tb3VudHNcbi8vIHRoZW4gaW1tZWRpYXRlbHkgcmVtb3VudHMgdGhlIHByb3ZpZGVyIGluIHRoZSBzYW1lIGNvbW1pdCkgcmV1c2VzIHRoZSBsaXZlXG4vLyBzb2NrZXQgaW5zdGVhZCBvZiByZWNvbm5lY3RpbmcuIEEgZ2VudWluZSBjbG9zZSAobm8gcmUtYWNxdWlyZSB3aXRoaW4gdGhlXG4vLyB3aW5kb3cpIHRlYXJzIGRvd24gc28gdGhlIHBlZXIgbGVhdmVzIHRoZSByb29tIGNsZWFubHkuXG5jb25zdCBTRVNTSU9OX0dSQUNFX01TID0gNDAwMDtcblxuZnVuY3Rpb24gbm90aWZ5U2Vzc2lvbihzOiBDb2xsYWJTZXNzaW9uKTogdm9pZCB7XG4gIGZvciAoY29uc3QgbCBvZiBzLmxpc3RlbmVycykgbCgpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVTZXNzaW9uKHNsdWc6IHN0cmluZyk6IENvbGxhYlNlc3Npb24ge1xuICBjb25zdCBkb2MgPSBuZXcgWS5Eb2MoKTtcbiAgY29uc3QgYXdhcmVuZXNzID0gbmV3IEF3YXJlbmVzcyhkb2MpO1xuICBjb25zdCBjb25uSWQgPSBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuXG4gIGNvbnN0IHNlc3Npb246IENvbGxhYlNlc3Npb24gPSB7XG4gICAgc2x1ZyxcbiAgICBkb2MsXG4gICAgYXdhcmVuZXNzLFxuICAgIGNvbm5JZCxcbiAgICBuYW1lOiAnYW5vbnltb3VzJyxcbiAgICBjb2xvcjogY29sb3JGb3JOYW1lKCdhbm9ueW1vdXMnKSxcbiAgICBjb25uZWN0ZWQ6IGZhbHNlLFxuICAgIHJlZkNvdW50OiAwLFxuICAgIGRlc3Ryb3lUaW1lcjogbnVsbCxcbiAgICBsaXN0ZW5lcnM6IG5ldyBTZXQoKSxcbiAgICBzdG9wOiAoKSA9PiB7fSxcbiAgfTtcblxuICAvLyBTZWVkIGxvY2FsIGF3YXJlbmVzcyBpbW1lZGlhdGVseSBzbyBmb3JlaWduIHBlZXJzIHNlZSBvdXIgbmFtZSBldmVuIGJlZm9yZVxuICAvLyB0aGUgZmlyc3QgY3Vyc29yIG1vdmU7IHByZXNlcnZlcyBhbnkgY3Vyc29yL3NlbGVjdGlvbiBhbHJlYWR5IHB1Ymxpc2hlZC5cbiAgY29uc3Qgc2VlZExvY2FsQXdhcmVuZXNzID0gKG5hbWU6IHN0cmluZywgY29sb3I6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IGN1ciA9IChhd2FyZW5lc3MuZ2V0TG9jYWxTdGF0ZSgpID8/IHt9KSBhcyBQYXJ0aWFsPENvbGxhYkF3YXJlbmVzc1N0YXRlPjtcbiAgICBhd2FyZW5lc3Muc2V0TG9jYWxTdGF0ZSh7XG4gICAgICBuYW1lLFxuICAgICAgY29sb3IsXG4gICAgICBjdXJzb3I6IGN1ci5jdXJzb3IgPz8gbnVsbCxcbiAgICAgIHNlbGVjdGlvbjogY3VyLnNlbGVjdGlvbiA/PyBudWxsLFxuICAgICAgYW5ub3RhdGlvblNlbGVjdGlvbjogY3VyLmFubm90YXRpb25TZWxlY3Rpb24gPz8gW10sXG4gICAgICB2aWV3cG9ydDogY3VyLnZpZXdwb3J0ID8/IHsgeDogMCwgeTogMCwgem9vbTogMSB9LFxuICAgICAgZWRpdGluZzogY3VyLmVkaXRpbmcgPz8gbnVsbCxcbiAgICAgIF9fY29ubklkOiBjb25uSWQsXG4gICAgfSBzYXRpc2ZpZXMgQ29sbGFiQXdhcmVuZXNzU3RhdGUpO1xuICB9O1xuICBzZWVkTG9jYWxBd2FyZW5lc3Moc2Vzc2lvbi5uYW1lLCBzZXNzaW9uLmNvbG9yKTtcblxuICAvLyBSZXNvbHZlIGlkZW50aXR5IGZyb20gZ2l0IHVzZXIubmFtZSBvbmNlIHBlciBTRVNTSU9OIChub3QgcGVyIG1vdW50KSBzbyBhXG4gIC8vIGhvdC1zd2FwIHJlbW91bnQgZG9lc24ndCByZS1mZXRjaCArIHJlLXB1Ymxpc2ggKHdoaWNoIHdvdWxkIGNodXJuIGF3YXJlbmVzcykuXG4gIGxldCBpZGVudGl0eUNhbmNlbGxlZCA9IGZhbHNlO1xuICBmZXRjaCgnL19hcGkvZ2l0LXVzZXInKVxuICAgIC50aGVuKChyKSA9PiByLmpzb24oKSlcbiAgICAudGhlbigoaikgPT4ge1xuICAgICAgaWYgKGlkZW50aXR5Q2FuY2VsbGVkKSByZXR1cm47XG4gICAgICBjb25zdCBuID0gdHlwZW9mIGo/Lm5hbWUgPT09ICdzdHJpbmcnICYmIGoubmFtZS50cmltKCkgPyBqLm5hbWUudHJpbSgpIDogbnVsbDtcbiAgICAgIGNvbnN0IGZpbmFsTmFtZSA9IG4gPz8gYGFub255bW91cy0ke2Nvbm5JZC5zbGljZSgwLCA2KX1gO1xuICAgICAgc2Vzc2lvbi5uYW1lID0gZmluYWxOYW1lO1xuICAgICAgc2Vzc2lvbi5jb2xvciA9IGNvbG9yRm9yTmFtZShmaW5hbE5hbWUpO1xuICAgICAgc2VlZExvY2FsQXdhcmVuZXNzKGZpbmFsTmFtZSwgc2Vzc2lvbi5jb2xvcik7XG4gICAgICBub3RpZnlTZXNzaW9uKHNlc3Npb24pO1xuICAgIH0pXG4gICAgLmNhdGNoKCgpID0+IHtcbiAgICAgIGlmIChpZGVudGl0eUNhbmNlbGxlZCkgcmV0dXJuO1xuICAgICAgY29uc3QgZmFsbGJhY2sgPSBgYW5vbnltb3VzLSR7Y29ubklkLnNsaWNlKDAsIDYpfWA7XG4gICAgICBzZXNzaW9uLm5hbWUgPSBmYWxsYmFjaztcbiAgICAgIHNlc3Npb24uY29sb3IgPSBjb2xvckZvck5hbWUoZmFsbGJhY2spO1xuICAgICAgc2VlZExvY2FsQXdhcmVuZXNzKGZhbGxiYWNrLCBzZXNzaW9uLmNvbG9yKTtcbiAgICAgIG5vdGlmeVNlc3Npb24oc2Vzc2lvbik7XG4gICAgfSk7XG5cbiAgLy8g4pSA4pSAIFdlYlNvY2tldCBsaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGxldCBjYW5jZWxsZWQgPSBmYWxzZTtcbiAgbGV0IHJlY29ubmVjdFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICBsZXQgd3NSZWY6IFdlYlNvY2tldCB8IG51bGwgPSBudWxsO1xuXG4gIGZ1bmN0aW9uIHNlbmRGcmFtZSh3czogV2ViU29ja2V0LCBwYXlsb2FkOiBVaW50OEFycmF5KSB7XG4gICAgdHJ5IHtcbiAgICAgIHdzLnNlbmQocGF5bG9hZCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvKiBkZWFkIHNvY2tldCDigJQgY2xvc2UgaGFuZGxlciB3aWxsIHJlY29ubmVjdCAqL1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGJyb2FkY2FzdEF3YXJlbmVzcyh3czogV2ViU29ja2V0LCBjaGFuZ2VkOiBudW1iZXJbXSkge1xuICAgIGlmIChjaGFuZ2VkLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IGVuY29kZXIgPSBlbmNvZGluZy5jcmVhdGVFbmNvZGVyKCk7XG4gICAgZW5jb2Rpbmcud3JpdGVWYXJVaW50KGVuY29kZXIsIE1FU1NBR0VfQVdBUkVORVNTKTtcbiAgICBlbmNvZGluZy53cml0ZVZhclVpbnQ4QXJyYXkoZW5jb2RlciwgZW5jb2RlQXdhcmVuZXNzVXBkYXRlKGF3YXJlbmVzcywgY2hhbmdlZCkpO1xuICAgIHNlbmRGcmFtZSh3cywgZW5jb2RpbmcudG9VaW50OEFycmF5KGVuY29kZXIpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJyb2FkY2FzdFN5bmNVcGRhdGUod3M6IFdlYlNvY2tldCwgdXBkYXRlOiBVaW50OEFycmF5KSB7XG4gICAgY29uc3QgZW5jb2RlciA9IGVuY29kaW5nLmNyZWF0ZUVuY29kZXIoKTtcbiAgICBlbmNvZGluZy53cml0ZVZhclVpbnQoZW5jb2RlciwgTUVTU0FHRV9TWU5DKTtcbiAgICB3cml0ZVVwZGF0ZShlbmNvZGVyLCB1cGRhdGUpO1xuICAgIHNlbmRGcmFtZSh3cywgZW5jb2RpbmcudG9VaW50OEFycmF5KGVuY29kZXIpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbm5lY3QoKSB7XG4gICAgaWYgKGNhbmNlbGxlZCkgcmV0dXJuO1xuICAgIGNvbnN0IHByb3RvID0gbG9jYXRpb24ucHJvdG9jb2wgPT09ICdodHRwczonID8gJ3dzczonIDogJ3dzOic7XG4gICAgY29uc3Qgd3MgPSBuZXcgV2ViU29ja2V0KGAke3Byb3RvfS8vJHtsb2NhdGlvbi5ob3N0fS9fd3MvY29sbGFiLyR7c2x1Z31gKTtcbiAgICB3cy5iaW5hcnlUeXBlID0gJ2FycmF5YnVmZmVyJztcbiAgICB3c1JlZiA9IHdzO1xuXG4gICAgd3MuYWRkRXZlbnRMaXN0ZW5lcignb3BlbicsICgpID0+IHtcbiAgICAgIHNlc3Npb24uY29ubmVjdGVkID0gdHJ1ZTtcbiAgICAgIG5vdGlmeVNlc3Npb24oc2Vzc2lvbik7XG4gICAgICAvLyBTeW5jIHN0ZXAgMSDigJQgYW5ub3VuY2Ugb3VyIHN0YXRlIHZlY3RvciBzbyB0aGUgc2VydmVyIGNhbiBzZW5kIHRoZVxuICAgICAgLy8gbWlzc2luZyBwaWVjZXMgKG1hdGNoZXMgdGhlIGVuY29kZUhhbmRzaGFrZSBzZXJ2ZXIgcGF0aCkuXG4gICAgICBjb25zdCBlbmNvZGVyID0gZW5jb2RpbmcuY3JlYXRlRW5jb2RlcigpO1xuICAgICAgZW5jb2Rpbmcud3JpdGVWYXJVaW50KGVuY29kZXIsIE1FU1NBR0VfU1lOQyk7XG4gICAgICB3cml0ZVN5bmNTdGVwMShlbmNvZGVyLCBkb2MpO1xuICAgICAgc2VuZEZyYW1lKHdzLCBlbmNvZGluZy50b1VpbnQ4QXJyYXkoZW5jb2RlcikpO1xuICAgICAgLy8gQXdhcmVuZXNzIGluaXRpYWwgc3RhdGUg4oCUIGZpcmUgb3VyIGxvY2FsIHN0YXRlIHRvIHRoZSByb29tLlxuICAgICAgYnJvYWRjYXN0QXdhcmVuZXNzKHdzLCBbYXdhcmVuZXNzLmNsaWVudElEXSk7XG4gICAgfSk7XG5cbiAgICB3cy5hZGRFdmVudExpc3RlbmVyKCdjbG9zZScsICgpID0+IHtcbiAgICAgIHNlc3Npb24uY29ubmVjdGVkID0gZmFsc2U7XG4gICAgICBub3RpZnlTZXNzaW9uKHNlc3Npb24pO1xuICAgICAgd3NSZWYgPSBudWxsO1xuICAgICAgaWYgKGNhbmNlbGxlZCkgcmV0dXJuO1xuICAgICAgcmVjb25uZWN0VGltZXIgPSBzZXRUaW1lb3V0KGNvbm5lY3QsIDEwMDApO1xuICAgIH0pO1xuXG4gICAgd3MuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoKSA9PiB7XG4gICAgICAvLyBMZXQgY2xvc2UgaGFuZGxlciBkbyB0aGUgcmVjb25uZWN0OyBlcnJvciBldmVudHMgd2l0aG91dCBhIGNsb3NlXG4gICAgICAvLyB3b3VsZCBqdXN0IHJldHJ5LXNwYW0uXG4gICAgfSk7XG5cbiAgICB3cy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKGV2dCkgPT4ge1xuICAgICAgY29uc3QgcGF5bG9hZCA9XG4gICAgICAgIGV2dC5kYXRhIGluc3RhbmNlb2YgQXJyYXlCdWZmZXJcbiAgICAgICAgICA/IG5ldyBVaW50OEFycmF5KGV2dC5kYXRhKVxuICAgICAgICAgIDogZXZ0LmRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5XG4gICAgICAgICAgICA/IGV2dC5kYXRhXG4gICAgICAgICAgICA6IG51bGw7XG4gICAgICBpZiAoIXBheWxvYWQpIHJldHVybjtcbiAgICAgIGNvbnN0IGRlY29kZXIgPSBkZWNvZGluZy5jcmVhdGVEZWNvZGVyKHBheWxvYWQpO1xuICAgICAgY29uc3QgbWVzc2FnZVR5cGUgPSBkZWNvZGluZy5yZWFkVmFyVWludChkZWNvZGVyKTtcbiAgICAgIHN3aXRjaCAobWVzc2FnZVR5cGUpIHtcbiAgICAgICAgY2FzZSBNRVNTQUdFX1NZTkM6IHtcbiAgICAgICAgICBjb25zdCBlbmNvZGVyID0gZW5jb2RpbmcuY3JlYXRlRW5jb2RlcigpO1xuICAgICAgICAgIGVuY29kaW5nLndyaXRlVmFyVWludChlbmNvZGVyLCBNRVNTQUdFX1NZTkMpO1xuICAgICAgICAgIHJlYWRTeW5jTWVzc2FnZShkZWNvZGVyLCBlbmNvZGVyLCBkb2MsIHdzKTtcbiAgICAgICAgICBpZiAoZW5jb2RpbmcubGVuZ3RoKGVuY29kZXIpID4gMSkgc2VuZEZyYW1lKHdzLCBlbmNvZGluZy50b1VpbnQ4QXJyYXkoZW5jb2RlcikpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgTUVTU0FHRV9BV0FSRU5FU1M6IHtcbiAgICAgICAgICBhcHBseUF3YXJlbmVzc1VwZGF0ZShhd2FyZW5lc3MsIGRlY29kaW5nLnJlYWRWYXJVaW50OEFycmF5KGRlY29kZXIpLCB3cyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIFdpcmUgZG9jIHVwZGF0ZXMg4oaSIGJyb2FkY2FzdCB0byBzZXJ2ZXIuIE9yaWdpbiB0YWdnZWQgd2l0aCB0aGUgd3Mgc29cbiAgLy8gc2VydmVyLXNpZGUgdXBkYXRlcyB3ZSByZWNlaXZlIGRvbid0IGVjaG8gYmFjay5cbiAgY29uc3Qgb25Eb2NVcGRhdGUgPSAodXBkYXRlOiBVaW50OEFycmF5LCBvcmlnaW46IHVua25vd24pID0+IHtcbiAgICBjb25zdCB3cyA9IHdzUmVmO1xuICAgIGlmICghd3MgfHwgd3MucmVhZHlTdGF0ZSAhPT0gV2ViU29ja2V0Lk9QRU4pIHJldHVybjtcbiAgICBpZiAob3JpZ2luID09PSB3cykgcmV0dXJuOyAvLyBjYW1lIGZyb20gc2VydmVyLCBkb24ndCBlY2hvXG4gICAgYnJvYWRjYXN0U3luY1VwZGF0ZSh3cywgdXBkYXRlKTtcbiAgfTtcbiAgZG9jLm9uKCd1cGRhdGUnLCBvbkRvY1VwZGF0ZSk7XG5cbiAgLy8gV2lyZSBhd2FyZW5lc3MgY2hhbmdlcyDihpIgYnJvYWRjYXN0LiBTYW1lIG9yaWdpbiBndWFyZC5cbiAgY29uc3Qgb25Bd2FyZW5lc3NVcGRhdGUgPSAoXG4gICAgeyBhZGRlZCwgdXBkYXRlZCwgcmVtb3ZlZCB9OiB7IGFkZGVkOiBudW1iZXJbXTsgdXBkYXRlZDogbnVtYmVyW107IHJlbW92ZWQ6IG51bWJlcltdIH0sXG4gICAgb3JpZ2luOiB1bmtub3duXG4gICkgPT4ge1xuICAgIGNvbnN0IHdzID0gd3NSZWY7XG4gICAgaWYgKCF3cyB8fCB3cy5yZWFkeVN0YXRlICE9PSBXZWJTb2NrZXQuT1BFTikgcmV0dXJuO1xuICAgIGlmIChvcmlnaW4gPT09IHdzKSByZXR1cm47XG4gICAgY29uc3QgY2hhbmdlZCA9IGFkZGVkLmNvbmNhdCh1cGRhdGVkLCByZW1vdmVkKTtcbiAgICBicm9hZGNhc3RBd2FyZW5lc3Mod3MsIGNoYW5nZWQpO1xuICB9O1xuICBhd2FyZW5lc3Mub24oJ3VwZGF0ZScsIG9uQXdhcmVuZXNzVXBkYXRlKTtcblxuICBzZXNzaW9uLnN0b3AgPSAoKSA9PiB7XG4gICAgaWRlbnRpdHlDYW5jZWxsZWQgPSB0cnVlO1xuICAgIGNhbmNlbGxlZCA9IHRydWU7XG4gICAgaWYgKHJlY29ubmVjdFRpbWVyKSBjbGVhclRpbWVvdXQocmVjb25uZWN0VGltZXIpO1xuICAgIGRvYy5vZmYoJ3VwZGF0ZScsIG9uRG9jVXBkYXRlKTtcbiAgICBhd2FyZW5lc3Mub2ZmKCd1cGRhdGUnLCBvbkF3YXJlbmVzc1VwZGF0ZSk7XG4gICAgY29uc3Qgd3MgPSB3c1JlZjtcbiAgICBpZiAod3MgJiYgd3MucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0Lk9QRU4pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHdzLmNsb3NlKCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogaWdub3JlICovXG4gICAgICB9XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FyZW5lc3MuZGVzdHJveSgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLyogaWdub3JlICovXG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBkb2MuZGVzdHJveSgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLyogaWdub3JlICovXG4gICAgfVxuICB9O1xuXG4gIGNvbm5lY3QoKTtcbiAgcmV0dXJuIHNlc3Npb247XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlU2Vzc2lvbkRlc3Ryb3koczogQ29sbGFiU2Vzc2lvbik6IHZvaWQge1xuICBpZiAocy5kZXN0cm95VGltZXIpIHJldHVybjtcbiAgcy5kZXN0cm95VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICBnZXRTZXNzaW9ucygpLmRlbGV0ZShzLnNsdWcpO1xuICAgIHMuc3RvcCgpO1xuICB9LCBTRVNTSU9OX0dSQUNFX01TKTtcbn1cblxuLyoqIElkZW1wb3RlbnQgZ2V0LW9yLWNyZWF0ZSAoY2FsbGVkIGluIHJlbmRlciBzbyBjaGlsZHJlbiBnZXQgYSBsaXZlIGRvYyBvblxuICogIGZpcnN0IHJlbmRlcikuIEEgZnJlc2hseSBjcmVhdGVkIHNlc3Npb24gc2VsZi1kZXN0cnVjdHMgYWZ0ZXIgdGhlIGdyYWNlXG4gKiAgd2luZG93IHVubGVzcyBhIG1vdW50IGVmZmVjdCByZXRhaW5zIGl0IOKAlCBzbyBhIHRocm93bi1hd2F5IHJlbmRlciBjYW4ndCBsZWFrXG4gKiAgYSBzb2NrZXQuICovXG5mdW5jdGlvbiBwZWVrT3JDcmVhdGVTZXNzaW9uKHNsdWc6IHN0cmluZyk6IENvbGxhYlNlc3Npb24ge1xuICBjb25zdCBzZXNzaW9ucyA9IGdldFNlc3Npb25zKCk7XG4gIGxldCBzID0gc2Vzc2lvbnMuZ2V0KHNsdWcpO1xuICBpZiAoIXMpIHtcbiAgICBzID0gY3JlYXRlU2Vzc2lvbihzbHVnKTtcbiAgICBzZXNzaW9ucy5zZXQoc2x1Zywgcyk7XG4gICAgc2NoZWR1bGVTZXNzaW9uRGVzdHJveShzKTtcbiAgfVxuICByZXR1cm4gcztcbn1cblxuZnVuY3Rpb24gcmV0YWluU2Vzc2lvbihzbHVnOiBzdHJpbmcpOiBDb2xsYWJTZXNzaW9uIHtcbiAgY29uc3QgcyA9IHBlZWtPckNyZWF0ZVNlc3Npb24oc2x1Zyk7XG4gIGlmIChzLmRlc3Ryb3lUaW1lcikge1xuICAgIGNsZWFyVGltZW91dChzLmRlc3Ryb3lUaW1lcik7XG4gICAgcy5kZXN0cm95VGltZXIgPSBudWxsO1xuICB9XG4gIHMucmVmQ291bnQrKztcbiAgcmV0dXJuIHM7XG59XG5cbmZ1bmN0aW9uIHJlbGVhc2VTZXNzaW9uKHNsdWc6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBzID0gZ2V0U2Vzc2lvbnMoKS5nZXQoc2x1Zyk7XG4gIGlmICghcykgcmV0dXJuO1xuICBzLnJlZkNvdW50ID0gTWF0aC5tYXgoMCwgcy5yZWZDb3VudCAtIDEpO1xuICBpZiAocy5yZWZDb3VudCA9PT0gMCkgc2NoZWR1bGVTZXNzaW9uRGVzdHJveShzKTtcbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBQcm92aWRlciDigJQgdGhpbiBjb25zdW1lciBvZiB0aGUgc2hhcmVkIHNlc3Npb24gKGxpZmV0aW1lIG93bmVkIGFib3ZlKS5cblxuaW50ZXJmYWNlIENvbGxhYlByb3ZpZGVyUHJvcHMge1xuICAvKiogQ2FudmFzIHNsdWcg4oCUIG11c3QgbWF0Y2ggc2VydmVyLXNpZGUgYHBhcnNlQ29sbGFiU2x1Z2AuICovXG4gIHNsdWc6IHN0cmluZztcbiAgY2hpbGRyZW46IFJlYWN0Tm9kZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIENvbGxhYlByb3ZpZGVyKHsgc2x1ZywgY2hpbGRyZW4gfTogQ29sbGFiUHJvdmlkZXJQcm9wcyk6IEpTWC5FbGVtZW50IHtcbiAgLy8gQWNxdWlyZSAoZ2V0LW9yLWNyZWF0ZSkgZm9yIHJlbmRlciBzbyBjaGlsZHJlbiBzZWUgYSBsaXZlIGRvYyBpbW1lZGlhdGVseTtcbiAgLy8gdGhlIHJlZmNvdW50ICsgdGVhcmRvd24gbGlmZXRpbWUgaXMgbWFuYWdlZCBpbiB0aGUgZWZmZWN0IGJlbG93IHNvIGFcbiAgLy8gaG90LXN3YXAgcmVtb3VudCByZXVzZXMgdGhlIFNBTUUgc29ja2V0IChubyBwcmVzZW5jZSBibGluayDigJQgRjQpLlxuICBjb25zdCBzZXNzaW9uID0gcGVla09yQ3JlYXRlU2Vzc2lvbihzbHVnKTtcbiAgY29uc3QgWywgZm9yY2VSZW5kZXJdID0gdXNlUmVkdWNlcigoYzogbnVtYmVyKSA9PiBjICsgMSwgMCk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBzID0gcmV0YWluU2Vzc2lvbihzbHVnKTtcbiAgICBjb25zdCBsaXN0ZW5lciA9ICgpID0+IGZvcmNlUmVuZGVyKCk7XG4gICAgcy5saXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgICAvLyBJZGVudGl0eSAvIGNvbm5lY3Rpb24gbWF5IGhhdmUgcmVzb2x2ZWQgYmV0d2VlbiByZW5kZXIgYW5kIHRoaXMgZWZmZWN0LlxuICAgIGZvcmNlUmVuZGVyKCk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHMubGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG4gICAgICByZWxlYXNlU2Vzc2lvbihzbHVnKTtcbiAgICB9O1xuICB9LCBbc2x1Z10pO1xuXG4gIGNvbnN0IHsgZG9jLCBhd2FyZW5lc3MsIGNvbm5JZDogbXlDb25uSWQsIG5hbWU6IG15TmFtZSwgY29sb3I6IG15Q29sb3IsIGNvbm5lY3RlZCB9ID0gc2Vzc2lvbjtcblxuICAvLyDilIDilIAgVGhyb3R0bGVkIGF3YXJlbmVzcyBwdWJsaXNoIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBjb25zdCBwZW5kaW5nUmVmID0gdXNlUmVmPFBhcnRpYWw8T21pdDxDb2xsYWJBd2FyZW5lc3NTdGF0ZSwgJ19fY29ubklkJz4+IHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IHRocm90dGxlVGltZXJSZWYgPSB1c2VSZWY8UmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsPihudWxsKTtcblxuICBjb25zdCBwdWJsaXNoQXdhcmVuZXNzID0gdXNlQ2FsbGJhY2soXG4gICAgKHBhdGNoOiBQYXJ0aWFsPE9taXQ8Q29sbGFiQXdhcmVuZXNzU3RhdGUsICdfX2Nvbm5JZCc+PikgPT4ge1xuICAgICAgcGVuZGluZ1JlZi5jdXJyZW50ID0geyAuLi4ocGVuZGluZ1JlZi5jdXJyZW50ID8/IHt9KSwgLi4ucGF0Y2ggfTtcbiAgICAgIGlmICh0aHJvdHRsZVRpbWVyUmVmLmN1cnJlbnQpIHJldHVybjtcbiAgICAgIHRocm90dGxlVGltZXJSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aHJvdHRsZVRpbWVyUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICBjb25zdCBuZXh0ID0gcGVuZGluZ1JlZi5jdXJyZW50O1xuICAgICAgICBwZW5kaW5nUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICBpZiAoIW5leHQpIHJldHVybjtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IChhd2FyZW5lc3MuZ2V0TG9jYWxTdGF0ZSgpID8/IHt9KSBhcyBQYXJ0aWFsPENvbGxhYkF3YXJlbmVzc1N0YXRlPjtcbiAgICAgICAgYXdhcmVuZXNzLnNldExvY2FsU3RhdGUoe1xuICAgICAgICAgIG5hbWU6IGN1cnJlbnQubmFtZSA/PyBzZXNzaW9uLm5hbWUsXG4gICAgICAgICAgY29sb3I6IGN1cnJlbnQuY29sb3IgPz8gc2Vzc2lvbi5jb2xvcixcbiAgICAgICAgICBjdXJzb3I6IGN1cnJlbnQuY3Vyc29yID8/IG51bGwsXG4gICAgICAgICAgc2VsZWN0aW9uOiBjdXJyZW50LnNlbGVjdGlvbiA/PyBudWxsLFxuICAgICAgICAgIGFubm90YXRpb25TZWxlY3Rpb246IGN1cnJlbnQuYW5ub3RhdGlvblNlbGVjdGlvbiA/PyBbXSxcbiAgICAgICAgICB2aWV3cG9ydDogY3VycmVudC52aWV3cG9ydCA/PyB7IHg6IDAsIHk6IDAsIHpvb206IDEgfSxcbiAgICAgICAgICBlZGl0aW5nOiBjdXJyZW50LmVkaXRpbmcgPz8gbnVsbCxcbiAgICAgICAgICBfX2Nvbm5JZDogbXlDb25uSWQsXG4gICAgICAgICAgLi4ubmV4dCxcbiAgICAgICAgfSBzYXRpc2ZpZXMgQ29sbGFiQXdhcmVuZXNzU3RhdGUpO1xuICAgICAgfSwgQVdBUkVORVNTX1RIUk9UVExFX01TKTtcbiAgICB9LFxuICAgIFthd2FyZW5lc3MsIHNlc3Npb24sIG15Q29ubklkXVxuICApO1xuXG4gIC8vIOKUgOKUgCBDbGVhbnVwIHRocm90dGxlIHRpbWVyIG9uIHVubW91bnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHVzZUVmZmVjdChcbiAgICAoKSA9PiAoKSA9PiB7XG4gICAgICBpZiAodGhyb3R0bGVUaW1lclJlZi5jdXJyZW50KSBjbGVhclRpbWVvdXQodGhyb3R0bGVUaW1lclJlZi5jdXJyZW50KTtcbiAgICB9LFxuICAgIFtdXG4gICk7XG5cbiAgY29uc3QgdmFsdWUgPSB1c2VNZW1vPENvbGxhYlZhbHVlPihcbiAgICAoKSA9PiAoe1xuICAgICAgZG9jLFxuICAgICAgYXdhcmVuZXNzLFxuICAgICAgbXlDb2xvcixcbiAgICAgIG15TmFtZSxcbiAgICAgIG15Q29ubklkLFxuICAgICAgY29ubmVjdGVkLFxuICAgICAgcHVibGlzaEF3YXJlbmVzcyxcbiAgICB9KSxcbiAgICBbZG9jLCBhd2FyZW5lc3MsIG15Q29sb3IsIG15TmFtZSwgbXlDb25uSWQsIGNvbm5lY3RlZCwgcHVibGlzaEF3YXJlbmVzc11cbiAgKTtcblxuICByZXR1cm4gPENvbGxhYkNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3ZhbHVlfT57Y2hpbGRyZW59PC9Db2xsYWJDb250ZXh0LlByb3ZpZGVyPjtcbn1cbiIsCiAgICAiLyoqXG4gKiBAZmlsZSAgICAgICB1c2Utc2VsZWN0aW9uLXNldC50c3gg4oCUIFBoYXNlIDQuMSBtdWx0aS1zZWxlY3Rpb24gc3RvcmVcbiAqIEBzY29wZSAgICAgIGFwcHMvc3R1ZGlvL3VzZS1zZWxlY3Rpb24tc2V0LnRzeFxuICogQHB1cnBvc2UgICAgTXVsdGktZWxlbWVudCBzZWxlY3Rpb24gc3RhdGUgZm9yIGNhbnZhcy1zaGVsbC4gVGhlIGNhbnZhc1xuICogICAgICAgICAgICAgaW5wdXQgcm91dGVyIGNhbGxzIGByZXBsYWNlKClgIC8gYGFkZCgpYCAvIGBjbGVhcigpYDtcbiAqICAgICAgICAgICAgIHRoZSBwcm92aWRlciBkZWJvdW5jZXMgYW5kIHBvc3RzIHVwIHRvIHRoZSBkZXYtc2VydmVyIHNoZWxsXG4gKiAgICAgICAgICAgICB0aHJvdWdoIHRoZSBleGlzdGluZyBgX19kZXNpZ25fc2VsZWN0ZWRgIHdpbmRvdy5wYXJlbnQgY2hhbm5lbFxuICogICAgICAgICAgICAgc28gYF9hY3RpdmUuanNvbmAgcmVmbGVjdHMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHNldC5cbiAqXG4gKiBTY2hlbWEgbWlncmF0aW9uLiBgX2FjdGl2ZS5qc29uI3NlbGVjdGVkYCBoaXN0b3JpY2FsbHkgaG9sZHNcbiAqICAgICBzZWxlY3RlZDogU2VsZWN0ZWRFbGVtZW50IHwgbnVsbFxuICogUGhhc2UgNC4xIHdpZGVucyB0b1xuICogICAgIHNlbGVjdGVkOiBTZWxlY3RlZEVsZW1lbnQgfCBTZWxlY3RlZEVsZW1lbnRbXSB8IG51bGxcbiAqIFdyaXRlcjogZW1pdHMgYSBzaW5nbGUgb2JqZWN0IHdoZW4gTiA9PT0gMSAoYmFjay1jb21wYXQgd2l0aCBkb3duc3RyZWFtXG4gKiB0b29scyB0aGF0IHN0aWxsIHJlYWQgdGhlIGxlZ2FjeSBzaGFwZSDigJQgYC9kZXNpZ246ZWRpdGAsIGhhbmRvZmYpLiBFbWl0cyBhblxuICogYXJyYXkgd2hlbiBOID4gMS4gUmVhZGVyICh0aGlzIGhvb2sgb24gcmVoeWRyYXRlKSBhY2NlcHRzIGFsbCB0aHJlZS5cbiAqL1xuXG5pbXBvcnQge1xuICBjcmVhdGVDb250ZXh0LFxuICB0eXBlIFJlYWN0Tm9kZSxcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUNvbnRleHQsXG4gIHVzZUVmZmVjdCxcbiAgdXNlTWVtbyxcbiAgdXNlUmVmLFxuICB1c2VTdGF0ZSxcbn0gZnJvbSAncmVhY3QnO1xuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFR5cGVzXG5cbi8qKlxuICogTWluaW1hbCBTZWxlY3Rpb24gc2hhcGUgdGhhdCB0cmF2ZWxzIHRocm91Z2ggdGhlIHBhcmVudCBwb3N0TWVzc2FnZSBjaGFubmVsLlxuICogTWlycm9ycyBgU2VsZWN0ZWRFbGVtZW50YCBmcm9tIGluc3BlY3QudHMgYnV0IHRoZSBjYW52YXMgcm91dGVyIGNvbXB1dGVzIGl0XG4gKiBjbGllbnQtc2lkZSBhbmQgdGhlIGluc3BlY3RvciBvdmVybGF5J3MgZW5yaWNobWVudCBmaWVsZHMgKGh0bWwgZXhjZXJwdCxcbiAqIGRvbV9wYXRoLCBjbGFzc2VzLi4uKSBhcmUgZmlsbGVkIGluIGJ5IHRoZSByb3V0ZXIgcmlnaHQgYmVmb3JlIHRoZSBtZXNzYWdlXG4gKiBpcyBwb3N0ZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0aW9uIHtcbiAgLyoqIENhbnZhcyBmaWxlIHBhdGgg4oCUIGRlc2lnblJlbC1wcmVmaXhlZCAoZS5nLiBgLmRlc2lnbi91aS9Gb28udHN4YCkuICovXG4gIGZpbGU/OiBzdHJpbmc7XG4gIC8qKiBTdGFibGUgYGRhdGEtY2QtaWRgIGFuY2hvciB3aGVuIHByZXNlbnQuIHYyLWdyYWRlIG9ubHkuICovXG4gIGlkPzogc3RyaW5nO1xuICAvKiogQ1NTLXNlbGVjdG9yIGZhbGxiYWNrIHBhdGggKGFsd2F5cyBwcmVzZW50KS4gKi9cbiAgc2VsZWN0b3I6IHN0cmluZztcbiAgLyoqIEFydGJvYXJkIGhvc3QgKGBkYXRhLWRjLXNjcmVlbmApIOKAlCBmb3Igc2NvcGluZyBtdWx0aS1lZGl0cyBpbiBmdXR1cmUuICovXG4gIGFydGJvYXJkSWQ/OiBzdHJpbmcgfCBudWxsO1xuICAvKipcbiAgICogT2NjdXJyZW5jZSBpbmRleCBvZiB0aGlzIGVsZW1lbnQgYW1vbmcgYHF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpYC5cbiAgICogZGF0YS1jZC1pZCBpcyBzdGFtcGVkIHBlciBTT1VSQ0UgZWxlbWVudCwgc28gYSBjb21wb25lbnQgcmVuZGVyZWQgTiB0aW1lc1xuICAgKiAoYSBsaXN0IHJvdywgb3IgYSByZXVzYWJsZSB1c2VkIHR3aWNlKSB5aWVsZHMgTiBET00gbm9kZXMgd2l0aCB0aGUgU0FNRVxuICAgKiBpZCthcnRib2FyZCBzZWxlY3Rvci4gVGhlIGluZGV4IGRpc2FtYmlndWF0ZXMgd2hpY2ggaW5zdGFuY2Ug4oCUIHJlc29sdmVyc1xuICAgKiB1c2UgYHF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpW2luZGV4XWAuIEFic2VudC8wIOKGkiBmaXJzdCBtYXRjaC5cbiAgICovXG4gIGluZGV4PzogbnVtYmVyO1xuICAvKiogU25hcHNob3QgZmllbGRzIGZpbGxlZCBieSB0aGUgcm91dGVyIGZyb20gYHJlc29sdmVIb3ZlclRhcmdldGAuICovXG4gIHRhZz86IHN0cmluZztcbiAgY2xhc3Nlcz86IHN0cmluZztcbiAgdGV4dD86IHN0cmluZztcbiAgZG9tX3BhdGg/OiBzdHJpbmdbXTtcbiAgYm91bmRzPzogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgdzogbnVtYmVyOyBoOiBudW1iZXIgfSB8IG51bGw7XG4gIGh0bWw/OiBzdHJpbmc7XG4gIC8qKiBQaGFzZSAxMi4yIOKAlCBhdXRob3JlZCBpbmxpbmUtc3R5bGUgdmFsdWVzIChrbm9iIHByZS1maWxsKSArIHJlc29sdmVkIGNvbXB1dGVkIChwbGFjZWhvbGRlciBoaW50KS4gKi9cbiAgYXV0aG9yZWQ/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBjb21wdXRlZD86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIC8qKiBQaGFzZSAxMi4zIOKAlCBhdXRob3JlZCBpbmxpbmUtc3R5bGUgcHJvcHMgT1VUU0lERSB0aGUgY3VyYXRlZCBrbm9iIHNldCwgc28gdGhlXG4gICAqICBwYW5lbCBjYW4gc3VyZmFjZSBhIGN1c3RvbSBDU1MgcHJvcGVydHkgdGhlIHVzZXIgYWRkZWQgKGUuZy4gYGxldHRlci1zcGFjaW5nYCkuICovXG4gIGN1c3RvbVN0eWxlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIC8qKiBQaGFzZSAxMi4zIOKAlCBjdXN0b20gSFRNTCBhdHRyaWJ1dGVzIG9uIHRoZSBlbGVtZW50IChkYXRhLSwgYXJpYS0sIHJvbGUsIHRpdGxl4oCmKSxcbiAgICogIHNvIHRoZSBwYW5lbCByZWZsZWN0cyBhIGN1c3RvbSBhdHRyaWJ1dGUgdGhlIHVzZXIgYWRkZWQgdmlhIHRoZSBlc2NhcGUgaGF0Y2guICovXG4gIGF0dHJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn1cblxuaW50ZXJmYWNlIFNlbGVjdGlvblNldFZhbHVlIHtcbiAgc2VsZWN0ZWQ6IFNlbGVjdGlvbltdO1xuICByZXBsYWNlOiAoczogU2VsZWN0aW9uIHwgU2VsZWN0aW9uW10pID0+IHZvaWQ7XG4gIGFkZDogKHM6IFNlbGVjdGlvbiB8IFNlbGVjdGlvbltdKSA9PiB2b2lkO1xuICByZW1vdmU6IChzOiBTZWxlY3Rpb24pID0+IHZvaWQ7XG4gIHRvZ2dsZTogKHM6IFNlbGVjdGlvbikgPT4gdm9pZDtcbiAgY2xlYXI6ICgpID0+IHZvaWQ7XG59XG5cbmNvbnN0IFNlbGVjdGlvblNldENvbnRleHQgPSBjcmVhdGVDb250ZXh0PFNlbGVjdGlvblNldFZhbHVlIHwgbnVsbD4obnVsbCk7XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gSWRlbnRpdHkuIFByZWZlciBgaWRgIChkYXRhLWNkLWlkIHN0YWJsZSBhbmNob3IpOyBmYWxsIGJhY2sgdG8gc2VsZWN0b3IuXG5cbmZ1bmN0aW9uIHNlbGVjdGlvbktleShzOiBTZWxlY3Rpb24pOiBzdHJpbmcge1xuICByZXR1cm4gcy5pZCA/IGBpZDoke3MuaWR9YCA6IGBzZWw6JHtzLnNlbGVjdG9yfWA7XG59XG5cbmZ1bmN0aW9uIGRlZHVwZShsaXN0OiBTZWxlY3Rpb25bXSk6IFNlbGVjdGlvbltdIHtcbiAgY29uc3Qgb3V0OiBTZWxlY3Rpb25bXSA9IFtdO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgcyBvZiBsaXN0KSB7XG4gICAgY29uc3QgayA9IHNlbGVjdGlvbktleShzKTtcbiAgICBpZiAoc2Vlbi5oYXMoaykpIGNvbnRpbnVlO1xuICAgIHNlZW4uYWRkKGspO1xuICAgIG91dC5wdXNoKHMpO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gUHJvdmlkZXJcblxuY29uc3QgUE9TVF9ERUJPVU5DRV9NUyA9IDUwOyAvLyBtaXJyb3JzIGNhbnZhcy1saWIncyBTRVRUTEUvUFVCTElTSCBjYWRlbmNlXG5cbmV4cG9ydCBmdW5jdGlvbiBTZWxlY3Rpb25TZXRQcm92aWRlcih7XG4gIGNoaWxkcmVuLFxuICAvKiogT3ZlcnJpZGUgdGhlIHBvc3RNZXNzYWdlIGRlc3RpbmF0aW9uICh1c2VkIGluIHRlc3RzKS4gKi9cbiAgcG9zdFRhcmdldCxcbn06IHtcbiAgY2hpbGRyZW46IFJlYWN0Tm9kZTtcbiAgcG9zdFRhcmdldD86IHsgcG9zdE1lc3NhZ2U6IChtc2c6IHVua25vd24sIHRhcmdldE9yaWdpbjogc3RyaW5nKSA9PiB2b2lkIH0gfCBudWxsO1xufSkge1xuICBjb25zdCBbc2VsZWN0ZWQsIHNldFNlbGVjdGVkXSA9IHVzZVN0YXRlPFNlbGVjdGlvbltdPihbXSk7XG4gIGNvbnN0IHRpbWVyUmVmID0gdXNlUmVmPFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbD4obnVsbCk7XG5cbiAgY29uc3QgcG9zdCA9IHVzZUNhbGxiYWNrKFxuICAgIChuZXh0OiBTZWxlY3Rpb25bXSkgPT4ge1xuICAgICAgaWYgKHRpbWVyUmVmLmN1cnJlbnQpIGNsZWFyVGltZW91dCh0aW1lclJlZi5jdXJyZW50KTtcbiAgICAgIHRpbWVyUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGltZXJSZWYuY3VycmVudCA9IG51bGw7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHBvc3RUYXJnZXQgPz8gKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93LnBhcmVudCA6IG51bGwpO1xuICAgICAgICBpZiAoIXRhcmdldCkgcmV0dXJuO1xuICAgICAgICAvLyBXaXJlIHNoYXBlOiBzaW5nbGUgb2JqZWN0IGZvciBOPTEgKGJhY2stY29tcGF0KSwgYXJyYXkgZm9yIE4+MSwgbnVsbCBmb3IgZW1wdHkuXG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFNlbGVjdGlvbiB8IFNlbGVjdGlvbltdIHwgbnVsbCA9XG4gICAgICAgICAgbmV4dC5sZW5ndGggPT09IDAgPyBudWxsIDogbmV4dC5sZW5ndGggPT09IDEgPyAobmV4dFswXSA/PyBudWxsKSA6IG5leHQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGFyZ2V0LnBvc3RNZXNzYWdlKHsgZGduOiAnc2VsZWN0LXNldCcsIHNlbGVjdGlvbjogcGF5bG9hZCB9LCAnKicpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvKiBpZnJhbWUgbGlrZWx5IGNyb3NzLW9yaWdpbiBvciBkZXRhY2hlZCAqL1xuICAgICAgICB9XG4gICAgICB9LCBQT1NUX0RFQk9VTkNFX01TKTtcbiAgICB9LFxuICAgIFtwb3N0VGFyZ2V0XVxuICApO1xuXG4gIC8vIENsZWFudXAgdGhlIGRlYm91bmNlIHRpbWVyIG9uIHVubW91bnQuXG4gIHVzZUVmZmVjdChcbiAgICAoKSA9PiAoKSA9PiB7XG4gICAgICBpZiAodGltZXJSZWYuY3VycmVudCkgY2xlYXJUaW1lb3V0KHRpbWVyUmVmLmN1cnJlbnQpO1xuICAgIH0sXG4gICAgW11cbiAgKTtcblxuICBjb25zdCByZXBsYWNlID0gdXNlQ2FsbGJhY2soXG4gICAgKHM6IFNlbGVjdGlvbiB8IFNlbGVjdGlvbltdKSA9PiB7XG4gICAgICBjb25zdCBuZXh0ID0gZGVkdXBlKEFycmF5LmlzQXJyYXkocykgPyBzIDogW3NdKTtcbiAgICAgIHNldFNlbGVjdGVkKG5leHQpO1xuICAgICAgcG9zdChuZXh0KTtcbiAgICB9LFxuICAgIFtwb3N0XVxuICApO1xuXG4gIGNvbnN0IGFkZCA9IHVzZUNhbGxiYWNrKFxuICAgIChzOiBTZWxlY3Rpb24gfCBTZWxlY3Rpb25bXSkgPT4ge1xuICAgICAgY29uc3QgaW5jb21pbmcgPSBBcnJheS5pc0FycmF5KHMpID8gcyA6IFtzXTtcbiAgICAgIHNldFNlbGVjdGVkKChwcmV2KSA9PiB7XG4gICAgICAgIGNvbnN0IG5leHQgPSBkZWR1cGUoWy4uLnByZXYsIC4uLmluY29taW5nXSk7XG4gICAgICAgIHBvc3QobmV4dCk7XG4gICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBbcG9zdF1cbiAgKTtcblxuICBjb25zdCByZW1vdmUgPSB1c2VDYWxsYmFjayhcbiAgICAoczogU2VsZWN0aW9uKSA9PiB7XG4gICAgICBjb25zdCBrID0gc2VsZWN0aW9uS2V5KHMpO1xuICAgICAgc2V0U2VsZWN0ZWQoKHByZXYpID0+IHtcbiAgICAgICAgY29uc3QgbmV4dCA9IHByZXYuZmlsdGVyKCh4KSA9PiBzZWxlY3Rpb25LZXkoeCkgIT09IGspO1xuICAgICAgICBwb3N0KG5leHQpO1xuICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgW3Bvc3RdXG4gICk7XG5cbiAgY29uc3QgdG9nZ2xlID0gdXNlQ2FsbGJhY2soXG4gICAgKHM6IFNlbGVjdGlvbikgPT4ge1xuICAgICAgY29uc3QgayA9IHNlbGVjdGlvbktleShzKTtcbiAgICAgIHNldFNlbGVjdGVkKChwcmV2KSA9PiB7XG4gICAgICAgIGNvbnN0IG5leHQgPSBwcmV2LnNvbWUoKHgpID0+IHNlbGVjdGlvbktleSh4KSA9PT0gaylcbiAgICAgICAgICA/IHByZXYuZmlsdGVyKCh4KSA9PiBzZWxlY3Rpb25LZXkoeCkgIT09IGspXG4gICAgICAgICAgOiBbLi4ucHJldiwgc107XG4gICAgICAgIHBvc3QobmV4dCk7XG4gICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBbcG9zdF1cbiAgKTtcblxuICBjb25zdCBjbGVhciA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzZXRTZWxlY3RlZChbXSk7XG4gICAgcG9zdChbXSk7XG4gIH0sIFtwb3N0XSk7XG5cbiAgY29uc3QgdmFsdWUgPSB1c2VNZW1vPFNlbGVjdGlvblNldFZhbHVlPihcbiAgICAoKSA9PiAoeyBzZWxlY3RlZCwgcmVwbGFjZSwgYWRkLCByZW1vdmUsIHRvZ2dsZSwgY2xlYXIgfSksXG4gICAgW3NlbGVjdGVkLCByZXBsYWNlLCBhZGQsIHJlbW92ZSwgdG9nZ2xlLCBjbGVhcl1cbiAgKTtcblxuICByZXR1cm4gPFNlbGVjdGlvblNldENvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3ZhbHVlfT57Y2hpbGRyZW59PC9TZWxlY3Rpb25TZXRDb250ZXh0LlByb3ZpZGVyPjtcbn1cblxuLyoqXG4gKiBNb3VudCBhIGBTZWxlY3Rpb25TZXRQcm92aWRlcmAgb25seSB3aGVuIG5vbmUgZXhpc3RzIGFib3ZlIHVzLiBUaGUgc2hlbGwtXG4gKiBvd25lZCBjb21tZW50IG1vdW50IGxheWVyIHByb3ZpZGVzIG9uZSBzbyBib3RoIHRoZSBsaXRlIGNvbW1lbnQgcm91dGVyIGFuZFxuICogYENhbnZhc1NoZWxsYCBzaGFyZSBhIHNpbmdsZSBzZWxlY3Rpb24gc2V0LiBIb29rIGNhbGxlZCB1bmNvbmRpdGlvbmFsbHk7XG4gKiBvbmx5IHRoZSByZXR1cm5lZCB0cmVlIGJyYW5jaGVzIChob29rIHJ1bGVzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE1heWJlU2VsZWN0aW9uU2V0UHJvdmlkZXIoeyBjaGlsZHJlbiB9OiB7IGNoaWxkcmVuOiBSZWFjdE5vZGUgfSkge1xuICBjb25zdCBvdXRlciA9IHVzZUNvbnRleHQoU2VsZWN0aW9uU2V0Q29udGV4dCk7XG4gIGlmIChvdXRlcikgcmV0dXJuIDw+e2NoaWxkcmVufTwvPjtcbiAgcmV0dXJuIDxTZWxlY3Rpb25TZXRQcm92aWRlcj57Y2hpbGRyZW59PC9TZWxlY3Rpb25TZXRQcm92aWRlcj47XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gSG9va3NcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVNlbGVjdGlvblNldCgpOiBTZWxlY3Rpb25TZXRWYWx1ZSB7XG4gIGNvbnN0IGN0eCA9IHVzZUNvbnRleHQoU2VsZWN0aW9uU2V0Q29udGV4dCk7XG4gIGlmICghY3R4KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1c2VTZWxlY3Rpb25TZXQgbXVzdCBiZSB1c2VkIGluc2lkZSA8U2VsZWN0aW9uU2V0UHJvdmlkZXI+Jyk7XG4gIH1cbiAgcmV0dXJuIGN0eDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVNlbGVjdGlvblNldE9wdGlvbmFsKCk6IFNlbGVjdGlvblNldFZhbHVlIHwgbnVsbCB7XG4gIHJldHVybiB1c2VDb250ZXh0KFNlbGVjdGlvblNldENvbnRleHQpO1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFdpcmUtc2hhcGUgaGVscGVycyDigJQgZXhwb3J0ZWQgZm9yIHRlc3RzIGFuZCBpbnNwZWN0LnRzIGJhY2stY29tcGF0IHJlYWRlci5cblxuLyoqIENvbnZlcnQgYW55IGluYm91bmQgc2hhcGUgdG8gYW4gYXJyYXkuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplU2VsZWN0ZWRSZWFkKFxuICByYXc6IFNlbGVjdGlvbiB8IFNlbGVjdGlvbltdIHwgbnVsbCB8IHVuZGVmaW5lZFxuKTogU2VsZWN0aW9uW10ge1xuICBpZiAocmF3ID09IG51bGwpIHJldHVybiBbXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkocmF3KSkgcmV0dXJuIGRlZHVwZShyYXcpO1xuICByZXR1cm4gW3Jhd107XG59XG5cbi8qKiBDb252ZXJ0IGludGVybmFsIGFycmF5IGJhY2sgdG8gdGhlIHdpcmUgc2hhcGUgKHdyaXRlcikuICovXG5leHBvcnQgZnVuY3Rpb24gZGVub3JtYWxpemVTZWxlY3RlZFdyaXRlKGxpc3Q6IFNlbGVjdGlvbltdKTogU2VsZWN0aW9uIHwgU2VsZWN0aW9uW10gfCBudWxsIHtcbiAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgaWYgKGxpc3QubGVuZ3RoID09PSAxKSByZXR1cm4gbGlzdFswXSA/PyBudWxsO1xuICByZXR1cm4gbGlzdDtcbn1cbiIsCiAgICAiLyoqXG4gKiBAZmlsZSAgICAgICBkb20tc2VsZWN0aW9uLnRzIOKAlCBzZWxlY3Rpb24tZnJvbS1ET00gaGVscGVycyAobGVhZiBtb2R1bGUpXG4gKiBAc2NvcGUgICAgICBhcHBzL3N0dWRpby9kb20tc2VsZWN0aW9uLnRzXG4gKiBAcHVycG9zZSAgICBQdXJlIERPTSDihpIgU2VsZWN0aW9uIGJ1aWxkZXJzIHNoYXJlZCBieSB0aGUgY2FudmFzIGNocm9tZVxuICogICAgICAgICAgICAgKGNhbnZhcy1zaGVsbC50c3gpIGFuZCB0aGUgc2hlbGwtb3duZWQgY29tbWVudCBtb3VudCBsYXllclxuICogICAgICAgICAgICAgKGNhbnZhcy1jb21tZW50LW1vdW50LnRzeCkuIExpdmVzIGluIGl0cyBvd24gbGVhZiBtb2R1bGUg4oCUIG5vXG4gKiAgICAgICAgICAgICBSZWFjdCwgbm8gY2FudmFzLWxpYiBpbXBvcnQg4oCUIHNvIGJvdGggY29uc3VtZXJzIGNhbiBsaWZ0IHRoZVxuICogICAgICAgICAgICAgc2FtZSBgaG92ZXJUYXJnZXRUb1NlbGVjdGlvbmAgLyBgZGVyaXZlRmlsZWAgbG9naWMgd2l0aG91dCBhXG4gKiAgICAgICAgICAgICBjeWNsZSBhbmQgd2l0aG91dCBidW5kbGluZyB0aGUgaGVhdnkgRGVzaWduQ2FudmFzIHRyZWUgaW50byB0aGVcbiAqICAgICAgICAgICAgIGxpdGUgY29tbWVudCBtb3VudC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEhvdmVyVGFyZ2V0IH0gZnJvbSAnLi9pbnB1dC1yb3V0ZXIudHN4JztcbmltcG9ydCB0eXBlIHsgU2VsZWN0aW9uIH0gZnJvbSAnLi91c2Utc2VsZWN0aW9uLXNldC50c3gnO1xuXG4vKipcbiAqIENhbnZhcyBmaWxlIHBhdGggZm9yIHRoZSBjdXJyZW50IHBhZ2UuIFVuZGVyIHRoZSBtb3VudCBoYXJuZXNzIHRoZSBwYWdlIGlzXG4gKiBgL19jYW52YXMtc2hlbGwuaHRtbD9jYW52YXM9PHJlbD4mZGVzaWduUmVsPTxyb290PmA7IGZvciBsZWdhY3kgYC5odG1sYFxuICogbW9ja3MgaXQncyB0aGUgc2VydmVkIGZpbGUgcGF0aCBpdHNlbGYuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXJpdmVGaWxlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICBjb25zdCBwID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIGlmIChwID09PSAnL19jYW52YXMtc2hlbGwuaHRtbCcgfHwgcCA9PT0gJy9fY2FudmFzLXNoZWxsJykge1xuICAgICAgY29uc3QgcXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuICAgICAgY29uc3QgY2FudmFzID0gcXMuZ2V0KCdjYW52YXMnKSA/PyAnJztcbiAgICAgIGNvbnN0IGRlc2lnblJlbCA9IChxcy5nZXQoJ2Rlc2lnblJlbCcpID8/ICcuZGVzaWduJykucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgJycpO1xuICAgICAgcmV0dXJuIGNhbnZhcyA/IGAke2Rlc2lnblJlbH0vJHtjYW52YXN9YCA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChwKS5yZXBsYWNlKC9eXFwvLywgJycpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFsQ2xhc3NlcyhlbDogRWxlbWVudCB8IG51bGwpOiBzdHJpbmcge1xuICBpZiAoIWVsKSByZXR1cm4gJyc7XG4gIHJldHVybiAoZWwuZ2V0QXR0cmlidXRlKCdjbGFzcycpID8/ICcnKVxuICAgIC50cmltKClcbiAgICAuc3BsaXQoL1xccysvKVxuICAgIC5maWx0ZXIoKGMpID0+IGMgJiYgIWMuc3RhcnRzV2l0aCgnZGduLScpICYmICFjLnN0YXJ0c1dpdGgoJ2RjLWN2LScpKVxuICAgIC5qb2luKCcgJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG9ydFRleHQoZWw6IEVsZW1lbnQgfCBudWxsLCBtYXg6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmICghZWwpIHJldHVybiAnJztcbiAgY29uc3QgdCA9ICgoZWwgYXMgSFRNTEVsZW1lbnQpLmlubmVyVGV4dCB8fCBlbC50ZXh0Q29udGVudCB8fCAnJykucmVwbGFjZSgvXFxzKy9nLCAnICcpLnRyaW0oKTtcbiAgcmV0dXJuIHQubGVuZ3RoID4gbWF4ID8gYCR7dC5zbGljZSgwLCBtYXggLSAxKX3igKZgIDogdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNzc1BhdGgoZWw6IEVsZW1lbnQgfCBudWxsKTogc3RyaW5nIHtcbiAgaWYgKCFlbCkgcmV0dXJuICcnO1xuICBjb25zdCBwYXRoOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgY3VyOiBFbGVtZW50IHwgbnVsbCA9IGVsO1xuICB3aGlsZSAoY3VyICYmIGN1ci5ub2RlVHlwZSA9PT0gMSAmJiBwYXRoLmxlbmd0aCA8IDgpIHtcbiAgICBjb25zdCBkc2NFbCA9IGN1ci5nZXRBdHRyaWJ1dGU/LignZGF0YS1kYy1lbGVtZW50Jyk7XG4gICAgaWYgKGRzY0VsKSB7XG4gICAgICBwYXRoLnVuc2hpZnQoYFtkYXRhLWRjLWVsZW1lbnQ9XCIke2RzY0VsfVwiXWApO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNvbnN0IGRzY1NjID0gY3VyLmdldEF0dHJpYnV0ZT8uKCdkYXRhLWRjLXNjcmVlbicpO1xuICAgIGlmIChkc2NTYykge1xuICAgICAgcGF0aC51bnNoaWZ0KGBbZGF0YS1kYy1zY3JlZW49XCIke2RzY1NjfVwiXWApO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGxldCBzZWwgPSBjdXIubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoY3VyLmlkKSB7XG4gICAgICBzZWwgPSBgIyR7Y3VyLmlkfWA7XG4gICAgICBwYXRoLnVuc2hpZnQoc2VsKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjb25zdCBjbHMgPSByZWFsQ2xhc3NlcyhjdXIpLnNwbGl0KC9cXHMrLykuZmlsdGVyKEJvb2xlYW4pLnNsaWNlKDAsIDIpO1xuICAgIGlmIChjbHMubGVuZ3RoKSBzZWwgKz0gYC4ke2Nscy5qb2luKCcuJyl9YDtcbiAgICBsZXQgc2liID0gMTtcbiAgICBsZXQgbjogRWxlbWVudCB8IG51bGwgPSBjdXIucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICB3aGlsZSAobikge1xuICAgICAgc2liKys7XG4gICAgICBuID0gbi5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICAgIH1cbiAgICBzZWwgKz0gYDpudGgtY2hpbGQoJHtzaWJ9KWA7XG4gICAgcGF0aC51bnNoaWZ0KHNlbCk7XG4gICAgY3VyID0gY3VyLnBhcmVudEVsZW1lbnQ7XG4gIH1cbiAgcmV0dXJuIHBhdGguam9pbignID4gJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkb21QYXRoKGVsOiBFbGVtZW50IHwgbnVsbCk6IHN0cmluZ1tdIHtcbiAgY29uc3QgaG9wczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGN1ciA9IGVsO1xuICB3aGlsZSAoY3VyICYmIGN1ci5ub2RlVHlwZSA9PT0gMSAmJiBob3BzLmxlbmd0aCA8IDgpIHtcbiAgICBsZXQgbGFiZWwgPSBjdXIubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBkRWwgPSBjdXIuZ2V0QXR0cmlidXRlPy4oJ2RhdGEtZGMtZWxlbWVudCcpO1xuICAgIGNvbnN0IGRTYyA9IGN1ci5nZXRBdHRyaWJ1dGU/LignZGF0YS1kYy1zY3JlZW4nKTtcbiAgICBpZiAoZEVsKSBsYWJlbCArPSBgW2RhdGEtZGMtZWxlbWVudD1cIiR7ZEVsfVwiXWA7XG4gICAgZWxzZSBpZiAoZFNjKSBsYWJlbCArPSBgW2RhdGEtZGMtc2NyZWVuPVwiJHtkU2N9XCJdYDtcbiAgICBlbHNlIGlmIChjdXIuaWQpIGxhYmVsICs9IGAjJHtjdXIuaWR9YDtcbiAgICBjb25zdCBjbHMgPSByZWFsQ2xhc3NlcyhjdXIpLnNwbGl0KC9cXHMrLykuZmlsdGVyKEJvb2xlYW4pLnNsaWNlKDAsIDIpO1xuICAgIGlmIChjbHMubGVuZ3RoICYmICFkRWwgJiYgIWRTYykgbGFiZWwgKz0gYC4ke2Nscy5qb2luKCcuJyl9YDtcbiAgICBob3BzLnVuc2hpZnQobGFiZWwpO1xuICAgIGN1ciA9IGN1ci5wYXJlbnRFbGVtZW50O1xuICB9XG4gIHJldHVybiBob3BzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3NzRXNjYXBlKHM6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIE1pbmltYWwgQ1NTLmVzY2FwZSBwb2x5ZmlsbCDigJQgb25seSBoYW5kbGVzIGNoYXJzIGFjdHVhbGx5IHByZXNlbnQgaW5cbiAgLy8gcGlwZWxpbmUtc3RhbXBlZCBJRHMgKGFscGhhbnVtZXJpY3MgKyBgLWAgKyBgX2ApLlxuICByZXR1cm4gcy5yZXBsYWNlKC9bXmEtekEtWjAtOV8tXS9nLCAoYykgPT4gYFxcXFwke2N9YCk7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIHdpcmUtc2hhcGUgYFNlbGVjdGlvbmAgZm9yIGEgcmVzb2x2ZWQgaG92ZXIgdGFyZ2V0LiBgZmlsZWBcbiAqIGRlZmF1bHRzIHRvIGBkZXJpdmVGaWxlKClgOyB0aGUgY29tbWVudCBtb3VudCBsYXllciBwYXNzZXMgaXQgZXhwbGljaXRseVxuICogc28gYWxsIHRocmVlIGNvbnN1bWVycyAocm91dGVyLCBvdmVybGF5LCBtb3VudCkgYWdyZWUgb24gdGhlIHNhbWUga2V5LlxuICovXG4vKipcbiAqIFRoZSBhcnRib2FyZC1zY29wZWQgZGF0YS1jZC1pZCBzZWxlY3Rvci4gQSBjb21wb25lbnQgc2hhcmVkIGFjcm9zcyBhcnRib2FyZHNcbiAqIGNhcnJpZXMgdGhlIFNBTUUgZGF0YS1jZC1pZCBpbiBlYWNoLCBzbyBhIGJhcmUgYFtkYXRhLWNkLWlkPVwi4oCmXCJdYCByZXNvbHZlc1xuICogKHZpYSBxdWVyeVNlbGVjdG9yKSB0byB0aGUgRklSU1QgYXJ0Ym9hcmQuIFByZWZpeGluZyB0aGUgaGl0J3MgYXJ0Ym9hcmQgbWFrZXNcbiAqIHRoZSBhbmNob3IgcGVyLWluc3RhbmNlLiBTaGFyZWQgYnkgRVZFUlkgc2VsZWN0b3IgYnVpbGRlciArIHJlc29sdmVyIHNvIHRoZXlcbiAqIGNhbid0IGRyaWZ0ICh0aGUgb3JpZ2luYWwgZml4IG9ubHkgcGF0Y2hlZCBvbmUgb2Ygfjggc2l0ZXMpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2NvcGVkQ2RTZWxlY3RvcihjZElkOiBzdHJpbmcsIGFydGJvYXJkSWQ/OiBzdHJpbmcgfCBudWxsKTogc3RyaW5nIHtcbiAgcmV0dXJuIGFydGJvYXJkSWRcbiAgICA/IGBbZGF0YS1kYy1zY3JlZW49XCIke2FydGJvYXJkSWR9XCJdIFtkYXRhLWNkLWlkPVwiJHtjZElkfVwiXWBcbiAgICA6IGBbZGF0YS1jZC1pZD1cIiR7Y2RJZH1cIl1gO1xufVxuXG4vKipcbiAqIE9jY3VycmVuY2UgaW5kZXggb2YgYGVsYCBhbW9uZyBgZG9jLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpYC4gRXZlbiB3aXRoIGFuXG4gKiBhcnRib2FyZC1zY29wZWQgZGF0YS1jZC1pZCBzZWxlY3RvciwgYSBjb21wb25lbnQgcmVwZWF0ZWQgV0lUSElOIG9uZSBhcnRib2FyZFxuICogKGEgbGlzdCByb3csIG9yIGEgcmV1c2FibGUgdXNlZCB0d2ljZSkgcHJvZHVjZXMgc2V2ZXJhbCBtYXRjaGVzIOKAlCB0aGUgaW5kZXhcbiAqIGlzIHRoZSBvbmx5IHRoaW5nIHRoYXQgbWFrZXMgdGhlIGFuY2hvciB0cnVseSB1bmlxdWUgcGVyIERPTSBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdG9ySW5kZXgoZG9jOiBEb2N1bWVudCwgc2VsZWN0b3I6IHN0cmluZywgZWw6IEVsZW1lbnQgfCBudWxsKTogbnVtYmVyIHtcbiAgaWYgKCFlbCkgcmV0dXJuIDA7XG4gIHRyeSB7XG4gICAgY29uc3QgYWxsID0gZG9jLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYWxsW2ldID09PSBlbCkgcmV0dXJuIGk7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvKiBtYWxmb3JtZWQgc2VsZWN0b3IgKi9cbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgc3RvcmVkIFNlbGVjdGlvbiB0byBpdHMgbGl2ZSBlbGVtZW50LCBhcnRib2FyZC1zY29wZWQuIFByZWZlcnMgdGhlXG4gKiBpZCthcnRib2FyZElkIHNjb3BlZCBzZWxlY3RvciAodGhlIHJvYnVzdCBwYXRoKSwgdGhlbiB0aGUgc3RvcmVkIGBzZWxlY3RvcmBcbiAqIChhbHJlYWR5IHNjb3BlZCBmb3IgcmVjZW50IHNlbGVjdGlvbnM7IGEgbGVnYWN5IGZhbGxiYWNrIGZvciBvbGQgY29tbWVudHMpLlxuICogRXZlcnkgaGFsbyAvIHBpbiAvIHRvb2xiYXIgLyBzcGFjaW5nLWhhbmRsZSByZXNvbHZlciByb3V0ZXMgdGhyb3VnaCB0aGlzIHNvIGFcbiAqIHNoYXJlZCBjb21wb25lbnQgYW5jaG9ycyB0byB0aGUgaW5zdGFuY2UgdGhlIHVzZXIgYWN0dWFsbHkgY2xpY2tlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTZWxlY3Rpb25FbChcbiAgZG9jOiBEb2N1bWVudCxcbiAgc2VsOiB7IGlkPzogc3RyaW5nIHwgbnVsbDsgc2VsZWN0b3I/OiBzdHJpbmcgfCBudWxsOyBhcnRib2FyZElkPzogc3RyaW5nIHwgbnVsbDsgaW5kZXg/OiBudW1iZXIgfVxuKTogRWxlbWVudCB8IG51bGwge1xuICBjb25zdCBhdCA9IChzZWxlY3Rvcjogc3RyaW5nKTogRWxlbWVudCB8IG51bGwgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhbGwgPSBkb2MucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG4gICAgICBpZiAoIWFsbC5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgICAgY29uc3QgaSA9IHNlbC5pbmRleCAmJiBzZWwuaW5kZXggPiAwICYmIHNlbC5pbmRleCA8IGFsbC5sZW5ndGggPyBzZWwuaW5kZXggOiAwO1xuICAgICAgcmV0dXJuIGFsbFtpXSA/PyBhbGxbMF07XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH07XG4gIGlmIChzZWwuaWQpIHtcbiAgICBjb25zdCBlbCA9IGF0KHNjb3BlZENkU2VsZWN0b3Ioc2VsLmlkLCBzZWwuYXJ0Ym9hcmRJZCkpO1xuICAgIGlmIChlbCkgcmV0dXJuIGVsO1xuICB9XG4gIGlmIChzZWwuc2VsZWN0b3IpIHJldHVybiBhdChzZWwuc2VsZWN0b3IpO1xuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBQaGFzZSAxMi4yIOKAlCBzdHlsZSBtYXBzIGZvciB0aGUgQ1NTLWtub2IgcHJvcGVydGllcy4gYGF1dGhvcmVkYCBpcyB3aGF0IHRoZVxuICogZWxlbWVudCBzZXRzIElOTElORSAoUmVhY3QgcmVuZGVycyBgc3R5bGU9e3twYWRkaW5nOjh9fWAg4oaSIGBzdHlsZT1cInBhZGRpbmc6OHB4XCJgKSxcbiAqIHNvIHRoZSBrbm9iIHByZS1maWxscyB0aGUgRURJVEFCTEUgc291cmNlIHZhbHVlIGFuZCBpcyBibGFuayB3aGVuIHVuc2V0IOKAlCBub3RcbiAqIHRoZSBub2lzeSByZXNvbHZlZCBkZWZhdWx0IChgNjU2LjAwM3B4YCwgYHJnYigwLDAsMClgKS4gYGNvbXB1dGVkYCBpcyB0aGVcbiAqIHJlc29sdmVkIHZhbHVlLCBzaG93biBvbmx5IGFzIGEgZmFpbnQgcGxhY2Vob2xkZXIgaGludC4gRW1wdHkgZm9yIGEgZGV0YWNoZWRcbiAqIG5vZGUgLyBTU1IuXG4gKi9cbi8vIFBoYXNlIDEyLjMgKFcyLjIgZml4KSDigJQgRVZFUlkgcHJvcGVydHkgdGhlIENTUyBwYW5lbCBoYXMgYSBjb250cm9sIGZvciwgc28gZWFjaFxuLy8gcmVhZHMgYmFjayBpbnRvIGBhdXRob3JlZGAgKHByZS1maWxscyB0aGUgcmlnaHQgY29udHJvbCkgYW5kIGlzIGV4Y2x1ZGVkIGZyb21cbi8vIGBjdXN0b21TdHlsZXNgLiBUaGUgZWFybGllciBzaG9ydCBsaXN0IG9taXR0ZWQgdGhlIGJveC1tb2RlbCBMT05HSEFORFNcbi8vIChgcGFkZGluZy10b3BgLCBgbWFyZ2luLWxlZnRgLCDigKYpICsgdGhlIExheW91dC9ib3JkZXIgbG9uZ2hhbmRzLCBzbyBhIHZhbHVlIHRoZVxuLy8gcGFuZWwgd3JvdGUgKGUuZy4gYW4gYWx0LXNjcnViIGBwYWRkaW5nLXRvcGApIGZlbGwgdGhyb3VnaCB0byBjdXN0b21TdHlsZXMgYW5kXG4vLyB0aGUgYm94LW1vZGVsIHdpZGdldCBzaG93ZWQgaXQgYXMgYSBcImN1c3RvbSBDU1MgcHJvcGVydHlcIiBpbnN0ZWFkIG9mIGluIHRoZSBib3guXG5jb25zdCBLTk9CX1BST1BTID0gW1xuICAvLyBMYXlvdXRcbiAgJ2Rpc3BsYXknLFxuICAnZmxleC1kaXJlY3Rpb24nLFxuICAnYWxpZ24taXRlbXMnLFxuICAnanVzdGlmeS1jb250ZW50JyxcbiAgJ2dhcCcsXG4gIC8vIFR5cG9ncmFwaHlcbiAgJ2ZvbnQtZmFtaWx5JyxcbiAgJ2NvbG9yJyxcbiAgJ2ZvbnQtc2l6ZScsXG4gICdmb250LXdlaWdodCcsXG4gICdsaW5lLWhlaWdodCcsXG4gICdsZXR0ZXItc3BhY2luZycsXG4gICd0ZXh0LWFsaWduJyxcbiAgLy8gU3BhY2luZyDigJQgc2hvcnRoYW5kIChmb3IgY3VzdG9tU3R5bGVzIGV4Y2x1c2lvbiArIHdob2xlLXNpZGUgYXV0aG9yaW5nKSBBTkRcbiAgLy8gdGhlIDggbG9uZ2hhbmRzIHRoZSBib3gtbW9kZWwgd2lkZ2V0IGFjdHVhbGx5IHJlYWRzL3dyaXRlcy5cbiAgJ21hcmdpbicsXG4gICdtYXJnaW4tdG9wJyxcbiAgJ21hcmdpbi1yaWdodCcsXG4gICdtYXJnaW4tYm90dG9tJyxcbiAgJ21hcmdpbi1sZWZ0JyxcbiAgJ3BhZGRpbmcnLFxuICAncGFkZGluZy10b3AnLFxuICAncGFkZGluZy1yaWdodCcsXG4gICdwYWRkaW5nLWJvdHRvbScsXG4gICdwYWRkaW5nLWxlZnQnLFxuICAvLyBTaXplXG4gICd3aWR0aCcsXG4gICdoZWlnaHQnLFxuICAnbWF4LXdpZHRoJyxcbiAgLy8gQXBwZWFyYW5jZVxuICAnYmFja2dyb3VuZC1jb2xvcicsXG4gICdib3JkZXItcmFkaXVzJyxcbiAgJ2JvcmRlci10b3AtbGVmdC1yYWRpdXMnLFxuICAnYm9yZGVyLXRvcC1yaWdodC1yYWRpdXMnLFxuICAnYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1cycsXG4gICdib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1cycsXG4gICdib3JkZXItd2lkdGgnLFxuICAnYm9yZGVyLXN0eWxlJyxcbiAgJ2JvcmRlci1jb2xvcicsXG4gICdib3gtc2hhZG93JyxcbiAgJ29wYWNpdHknLFxuXSBhcyBjb25zdDtcblxuLy8gUGhhc2UgMTIuMyDigJQgSFRNTCBhdHRyaWJ1dGVzIHRoZSBjdXN0b20tYXR0cmlidXRlIGhhdGNoIG1heSBoYXZlIHdyaXR0ZW4sIHNvIGFcbi8vIGp1c3QtYWRkZWQgYGRhdGEtKmAvYGFyaWEtKmAvYHJvbGVgL2B0aXRsZWAgcm91bmQtdHJpcHMgYmFjayBpbnRvIGEgcGFuZWwgcm93LlxuLy8gRXhjbHVkZXMgdGhlIHN0cnVjdHVyYWwgb25lcyB0aGUgcGFuZWwgbWFuYWdlcyBlbHNld2hlcmUgKHN0eWxlLCBjbGFzcyxcbi8vIGRhdGEtY2QtaWQgcGlwZWxpbmUgYW5jaG9yLCB0aGUgZGF0YS1kYy0qIGNhbnZhcyBjaHJvbWUgbWFya2VycykuXG5jb25zdCBBVFRSX1NLSVAgPSAvXihzdHlsZXxjbGFzc3xkYXRhLWNkLWlkfGRhdGEtZGMtfGRhdGEtZGNpZCQpLztcblxuZnVuY3Rpb24gc3R5bGVNYXBzRm9yKGVsOiBFbGVtZW50IHwgbnVsbCk6IHtcbiAgYXV0aG9yZWQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGNvbXB1dGVkOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBjdXN0b21TdHlsZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGF0dHJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufSB7XG4gIGlmICghZWwgfHwgdHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKSB7XG4gICAgcmV0dXJuIHsgYXV0aG9yZWQ6IHt9LCBjb21wdXRlZDoge30sIGN1c3RvbVN0eWxlczoge30sIGF0dHJzOiB7fSB9O1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgaW5saW5lID0gKGVsIGFzIEhUTUxFbGVtZW50KS5zdHlsZTtcbiAgICBjb25zdCBjcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsIGFzIEhUTUxFbGVtZW50KTtcbiAgICBjb25zdCBhdXRob3JlZDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIGNvbnN0IGNvbXB1dGVkOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgY29uc3Qga25vYiA9IG5ldyBTZXQ8c3RyaW5nPihLTk9CX1BST1BTIGFzIHJlYWRvbmx5IHN0cmluZ1tdKTtcbiAgICAvLyBDdXJhdGVkIGtub2IgcHJvcHM6IGF1dGhvcmVkIHZhbHVlIChrbm9iIHByZS1maWxsKSArIGNvbXB1dGVkIChwbGFjZWhvbGRlcikuXG4gICAgZm9yIChjb25zdCBwIG9mIEtOT0JfUFJPUFMpIHtcbiAgICAgIGNvbnN0IGEgPSBpbmxpbmUuZ2V0UHJvcGVydHlWYWx1ZShwKTtcbiAgICAgIGlmIChhKSBhdXRob3JlZFtwXSA9IGEudHJpbSgpO1xuICAgICAgY29uc3QgYyA9IGNzLmdldFByb3BlcnR5VmFsdWUocCk7XG4gICAgICBpZiAoYykgY29tcHV0ZWRbcF0gPSBjLnRyaW0oKTtcbiAgICB9XG4gICAgLy8gRXZlcnkgT1RIRVIgYXV0aG9yZWQgaW5saW5lIHByb3BlcnR5IOKGkiBjdXN0b21TdHlsZXMsIHNvIHRoZSBwYW5lbCBjYW4gc2hvd1xuICAgIC8vIGEgY3VzdG9tIENTUyBwcm9wZXJ0eSB0aGUgdXNlciBhZGRlZCB0aGF0IG5vIGN1cmF0ZWQgcm93IGNvdmVycy4gRVhDTFVERVxuICAgIC8vIHRoZSBwYW5lbC1tYW5hZ2VkIEZBTUlMSUVTIHdob2xlc2FsZTogc2V0dGluZyBgYm9yZGVyYC9gYm9yZGVyLXJhZGl1c2AgKG9yXG4gICAgLy8gdGhlaXIgMy13YXkgc2hvcnRoYW5kcykgbWFrZXMgdGhlIENTU09NIGV4cGFuZCB0aGVtIHRvIHRoZSBwZXItc2lkZVxuICAgIC8vIGxvbmdoYW5kcyDigJQgYGJvcmRlci10b3Atd2lkdGhgLCBgYm9yZGVyLWxlZnQtY29sb3JgLCDigKYg4oCUIHdoaWNoIHRoZSBwYW5lbFxuICAgIC8vIGNvbnRyb2xzIGJ1dCBjYW4ndCBlbnVtZXJhdGUgaW4gdGhlIGtub2Igc2V0LiBXaXRob3V0IHRoZSBmYW1pbHkgZ3VhcmQgdGhleVxuICAgIC8vIGxlYWsgaW50byBcImN1c3RvbSBDU1MgcHJvcGVydGllc1wiICh0aGUgc2FtZSBjbGFzcyBvZiBidWcgZml4ZWQgZm9yIHNwYWNpbmcpLlxuICAgIGNvbnN0IE1BTkFHRURfRkFNSUxZID0gL14obWFyZ2lufHBhZGRpbmd8Ym9yZGVyKSgtfCQpLztcbiAgICBjb25zdCBjdXN0b21TdHlsZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlubGluZS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcCA9IGlubGluZS5pdGVtKGkpO1xuICAgICAgaWYgKCFwIHx8IGtub2IuaGFzKHApIHx8IE1BTkFHRURfRkFNSUxZLnRlc3QocCkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgdiA9IGlubGluZS5nZXRQcm9wZXJ0eVZhbHVlKHApO1xuICAgICAgaWYgKHYpIGN1c3RvbVN0eWxlc1twXSA9IHYudHJpbSgpO1xuICAgIH1cbiAgICAvLyBDdXN0b20gSFRNTCBhdHRyaWJ1dGVzICh0aGUgZXNjYXBlLWhhdGNoIHN1cmZhY2UpLlxuICAgIGNvbnN0IGF0dHJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgZm9yIChjb25zdCBhIG9mIEFycmF5LmZyb20oKGVsIGFzIEhUTUxFbGVtZW50KS5hdHRyaWJ1dGVzKSkge1xuICAgICAgaWYgKEFUVFJfU0tJUC50ZXN0KGEubmFtZSkpIGNvbnRpbnVlO1xuICAgICAgYXR0cnNbYS5uYW1lXSA9IGEudmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB7IGF1dGhvcmVkLCBjb21wdXRlZCwgY3VzdG9tU3R5bGVzLCBhdHRycyB9O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4geyBhdXRob3JlZDoge30sIGNvbXB1dGVkOiB7fSwgY3VzdG9tU3R5bGVzOiB7fSwgYXR0cnM6IHt9IH07XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhvdmVyVGFyZ2V0VG9TZWxlY3Rpb24odGFyZ2V0OiBIb3ZlclRhcmdldCwgZmlsZT86IHN0cmluZyk6IFNlbGVjdGlvbiB7XG4gIGNvbnN0IGVsID0gdGFyZ2V0LmVsO1xuICBjb25zdCByZWN0ID1cbiAgICBlbCAmJiAoZWwgYXMgSFRNTEVsZW1lbnQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdFxuICAgICAgPyAoZWwgYXMgSFRNTEVsZW1lbnQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICA6IG51bGw7XG4gIC8vIGBjZElkYCBpcyB0aGUgaGl0IGVsZW1lbnQncyBPV04gZGF0YS1jZC1pZCAoZGVlcCBtb2RlKTsgcmVzb2x2ZXIgbmV2ZXJcbiAgLy8gY2xpbWJzIHRvIGFuIGFuY2VzdG9yLiBGYWxscyBiYWNrIHRvIGNzc1BhdGggb2YgdGhlIGhpdCB3aGVuIG5vIHN0YWJsZVxuICAvLyBhbmNob3IgZXhpc3RzLlxuICBjb25zdCBjZElkID0gdGFyZ2V0LmNkSWQ7XG4gIC8vIFNlbGVjdG9yIHJlc29sdXRpb24gb3JkZXI6XG4gIC8vICAgMS4gZGF0YS1jZC1pZCBhbmNob3Ig4oCUIHN0YWJsZSBwaXBlbGluZS1zdGFtcGVkIGlkIChwcmVmZXJyZWQpLiBTQ09QRUQgYnlcbiAgLy8gICAgICB0aGUgaGl0J3MgYXJ0Ym9hcmQgKGBbZGF0YS1kYy1zY3JlZW494oCmXSBbZGF0YS1jZC1pZD3igKZdYCkg4oCUIGEgY29tcG9uZW50XG4gIC8vICAgICAgc2hhcmVkIGFjcm9zcyBhcnRib2FyZHMgY2FycmllcyB0aGUgU0FNRSBkYXRhLWNkLWlkIGluIGVhY2gsIHNvIGFuXG4gIC8vICAgICAgdW5zY29wZWQgYFtkYXRhLWNkLWlkXWAgc2VsZWN0b3IgcmVzb2x2ZXMgKHZpYSBxdWVyeVNlbGVjdG9yKSB0byB0aGVcbiAgLy8gICAgICBGSVJTVCBhcnRib2FyZCdzIGluc3RhbmNlIGFuZCB0aGUgcGluL3NlbGVjdCBsYW5kcyBvbiB0aGUgd3JvbmcgYm9hcmQuXG4gIC8vICAgICAgUHJlZml4aW5nIHRoZSBhcnRib2FyZCBtYWtlcyB0aGUgYW5jaG9yIHBlci1pbnN0YW5jZS5cbiAgLy8gICAyLiBkYXRhLWRjLXNjcmVlbiDigJQgY2hyb21lIGNsaWNrIHByb21vdGVkIHRvIHdob2xlLWFydGJvYXJkIHNlbGVjdFxuICAvLyAgICAgIChUMjQuNSBHOCBtdWx0aS1hcnRib2FyZCBnZXN0dXJlKS5cbiAgLy8gICAzLiBjc3NQYXRoIG9mIHRoZSBoaXQg4oCUIGxhc3QtcmVzb3J0IHBhdGggc3RyaW5nLlxuICBjb25zdCBzZWxlY3RvciA9IGNkSWRcbiAgICA/IHNjb3BlZENkU2VsZWN0b3IoY2RJZCwgdGFyZ2V0LmFydGJvYXJkSWQpXG4gICAgOiB0YXJnZXQuYXJ0Ym9hcmRJZFxuICAgICAgPyBgW2RhdGEtZGMtc2NyZWVuPVwiJHt0YXJnZXQuYXJ0Ym9hcmRJZH1cIl1gXG4gICAgICA6IGNzc1BhdGgoZWwpO1xuICAvLyBEaXNhbWJpZ3VhdGUgcmVwZWF0ZWQgaW5zdGFuY2VzIHdpdGhpbiB0aGUgc2FtZSBhcnRib2FyZCAobGlzdCByb3dzLCBhXG4gIC8vIHJldXNhYmxlIHVzZWQgdHdpY2UpIOKAlCB0aGUgaW5kZXggaXMgd2hpY2ggYHF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpYFxuICAvLyBtYXRjaCB0aGlzIGVsZW1lbnQgaXMuIGNzc1BhdGggaXMgYWxyZWFkeSB1bmlxdWUsIHNvIDAgdGhlcmUuXG4gIGNvbnN0IGluZGV4ID0gY2RJZCAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnID8gc2VsZWN0b3JJbmRleChkb2N1bWVudCwgc2VsZWN0b3IsIGVsKSA6IDA7XG4gIHJldHVybiB7XG4gICAgZmlsZTogZmlsZSA/PyBkZXJpdmVGaWxlKCksXG4gICAgaWQ6IGNkSWQgPz8gdW5kZWZpbmVkLFxuICAgIHNlbGVjdG9yLFxuICAgIGFydGJvYXJkSWQ6IHRhcmdldC5hcnRib2FyZElkLFxuICAgIGluZGV4LFxuICAgIHRhZzogZWw/LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA/PyAnJyxcbiAgICBjbGFzc2VzOiByZWFsQ2xhc3NlcyhlbCksXG4gICAgdGV4dDogc2hvcnRUZXh0KGVsLCAyNDApLFxuICAgIGRvbV9wYXRoOiBkb21QYXRoKGVsKSxcbiAgICBib3VuZHM6IHJlY3RcbiAgICAgID8ge1xuICAgICAgICAgIHg6IE1hdGgucm91bmQocmVjdC5sZWZ0KSxcbiAgICAgICAgICB5OiBNYXRoLnJvdW5kKHJlY3QudG9wKSxcbiAgICAgICAgICB3OiBNYXRoLnJvdW5kKHJlY3Qud2lkdGgpLFxuICAgICAgICAgIGg6IE1hdGgucm91bmQocmVjdC5oZWlnaHQpLFxuICAgICAgICB9XG4gICAgICA6IG51bGwsXG4gICAgaHRtbDogZWwgPyAoZWwub3V0ZXJIVE1MID8/ICcnKS5zbGljZSgwLCA0MDAwKSA6ICcnLFxuICAgIC4uLnN0eWxlTWFwc0ZvcihlbCksXG4gIH07XG59XG4iLAogICAgIi8qKlxuICogQGZpbGUgICAgICAgaW5wdXQtcm91dGVyLnRzeCDigJQgY2FudmFzIHBvaW50ZXIva2V5Ym9hcmQgY2xhc3NpZmllciArIGhvb2tcbiAqIEBzY29wZSAgICAgIGFwcHMvc3R1ZGlvL2lucHV0LXJvdXRlci50c3hcbiAqIEBwdXJwb3NlICAgIE93bmVkIGJ5IGNhbnZhcy1saWIncyBEZXNpZ25DYW52YXMuIENsYXNzaWZpZXMgdGhlIE5PTi1XSEVFTFxuICogICAgICAgICAgICAgc3Vic2V0IG9mIHBvaW50ZXIgKyBrZXkgZXZlbnRzIGludG8gZGlzY3JldGUgcm91dGVyIGFjdGlvbnMuXG4gKiAgICAgICAgICAgICBgdXNlVmlld3BvcnRDb250cm9sbGVyYCBrZWVwcyBvd25pbmcgd2hlZWwgKyBtaWRkbGUtbW91c2UgK1xuICogICAgICAgICAgICAgc3BhY2UtcGFuICsgQ21kKzAvMS8rLy0g4oCUIHRoZSB0d28gc3RhY2tzIGNvZXhpc3Qgd2l0aG91dCBhXG4gKiAgICAgICAgICAgICBsaXN0ZW5lciByYWNlIChERFItMDI2KS5cbiAqXG4gKiBFdmVudCBvd25lcnNoaXAgKHJlYWQgdGhpcyBiZWZvcmUgYWRkaW5nIGhhbmRsZXJzKTpcbiAqXG4gKiAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUrOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkFxuICogICDilIIgRXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSCIE93bmVyICAgICAgICAgICAgICAgICAgICDilIJcbiAqICAg4pSc4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pS84pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSkXG4gKiAgIOKUgiB3aGVlbCAvIHNoaWZ0LXdoZWVsIC8gY21kLXdoZWVsICDilIIgdXNlVmlld3BvcnRDb250cm9sbGVyICAgIOKUglxuICogICDilIIgcG9pbnRlcmRvd24gYnRuPTEgLyBzcGFjZS1oZWxkICAg4pSCIHVzZVZpZXdwb3J0Q29udHJvbGxlciAgICDilIJcbiAqICAg4pSCIGtleWRvd24gU3BhY2UgLyBDbWQrMC8xLysvLSAgICAgIOKUgiB1c2VWaWV3cG9ydENvbnRyb2xsZXIgICAg4pSCXG4gKiAgIOKUgiBwb2ludGVybW92ZSAoaG92ZXIpICAgICAgICAgICAgICDilIIgaW5wdXQtcm91dGVyICAgICAgICAgICAgIOKUglxuICogICDilIIgcG9pbnRlcmRvd24gYnRuPTAgKHNlbGVjdCkgICAgICAg4pSCIGlucHV0LXJvdXRlciAgICAgICAgICAgICDilIJcbiAqICAg4pSCIHBvaW50ZXJkb3duIGJ0bj0yIChyaWdodC1jbGljaykgIOKUgiBpbnB1dC1yb3V0ZXIgICAgICAgICAgICAg4pSCXG4gKiAgIOKUgiBrZXlkb3duIFYgLyBIIC8gQyAvIEVzYyAgICAgICAgICDilIIgaW5wdXQtcm91dGVyICAgICAgICAgICAgIOKUglxuICogICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilLTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJhcbiAqXG4gKiBUaGUgcm91dGVyIGRvZXMgbm8gRE9NIHdvcmsgaXRzZWxmIOKAlCBgY2xhc3NpZnkoKWAgaXMgcHVyZSAodGVzdGFibGUgd2l0aG91dFxuICogYSBET00pIGFuZCBgdXNlSW5wdXRSb3V0ZXIoKWAgYXR0YWNoZXMgbGlzdGVuZXJzIHRoYXQgZGlzcGF0Y2ggdGhyb3VnaCB0aGVcbiAqIGNhbGxlci1zdXBwbGllZCBjYWxsYmFja3MuIEhvdmVyLXRhcmdldCByZXNvbHV0aW9uICsgc2VsZWN0aW9uIHBlcnNpc3RlbmNlXG4gKiBsaXZlIGluIHRoZSBjb25zdW1lciAoRGVzaWduQ2FudmFzKS5cbiAqL1xuXG5pbXBvcnQgeyB0eXBlIFJlZk9iamVjdCwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIERyYWctdnMtY2xpY2sgdGhyZXNob2xkIChUMjUpXG4vL1xuLy8gNCBweCBzY3JlZW4tcGl4ZWwgaHlwb3Qgc2VwYXJhdGVzIFwiY2xpY2tcIiBmcm9tIFwiZHJhZ1wiIOKAlCBNaWNyb3NvZnQgV2luMzJcbi8vIGNhbm9uaWNhbCAoYFNNX0NYRFJBR2AvYFNNX0NZRFJBR2AgZGVmYXVsdCksIGFsc28gZDMtZHJhZyBhbmQgdGxkcmF3IGRlZmF1bHQuXG4vLyBPd25lZCBoZXJlIHNvIGFydGJvYXJkLWRyYWcsIGFydGJvYXJkLW1hcnF1ZWUsIGVsZW1lbnQtbWFycXVlZSwgYW5ub3RhdGlvbi1cbi8vIGRyYWctdnMtdGFwLCBhbmQgYW55IGZ1dHVyZSBkcmFnLWNsYXNzIGdlc3R1cmUgYWxsIHJlYWQgdGhlIHNhbWUgY29uc3RhbnQuXG4vLyBXaGVlbCArIHBpbmNoLXpvb20gYXJlIEVYRU1QVCDigJQgdGhyZXNob2xkIGlzIGZvciBgcG9pbnRlcmRvd24g4oaSIHBvaW50ZXJtb3ZlYFxuLy8gZHJhZyBjbGFzc2lmaWNhdGlvbiBvbmx5LlxuXG5leHBvcnQgY29uc3QgRFJBR19USFJFU0hPTERfUFggPSA0O1xuXG4vKiogVHJ1ZSBvbmNlIHRoZSBwb2ludGVyIGhhcyBtb3ZlZCDiiaUgRFJBR19USFJFU0hPTERfUFggZnJvbSBpdHMgc3RhcnQuICovXG5leHBvcnQgZnVuY3Rpb24gY3Jvc3NlZERyYWdUaHJlc2hvbGQoXG4gIHN0YXJ0WDogbnVtYmVyLFxuICBzdGFydFk6IG51bWJlcixcbiAgY3VyWDogbnVtYmVyLFxuICBjdXJZOiBudW1iZXJcbik6IGJvb2xlYW4ge1xuICBjb25zdCBkeCA9IGN1clggLSBzdGFydFg7XG4gIGNvbnN0IGR5ID0gY3VyWSAtIHN0YXJ0WTtcbiAgcmV0dXJuIE1hdGguaHlwb3QoZHgsIGR5KSA+PSBEUkFHX1RIUkVTSE9MRF9QWDtcbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBUeXBlc1xuXG4vKipcbiAqIFRvb2wgdW5pb24uIFBoYXNlIDQuMSBzaGlwcGVkIFYvSC9DOyBQaGFzZSA1IGFkZHMgdGhlIGRyYXcgc2V0XG4gKiAocGVuIC8gcmVjdCAvIGFycm93IC8gZXJhc2VyKS4gRHJhdy10b29sIHBvaW50ZXIgZXZlbnRzIGFyZSBvd25lZCBieVxuICogYEFubm90YXRpb25zTGF5ZXJgIOKAlCB0aGUgcm91dGVyIGNsYXNzaWZpZXMgdGhlaXIgbGV0dGVyIHNob3J0Y3V0cyBidXRcbiAqIHJldHVybnMgYG5vLW9wYCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgcG9pbnRlciBldmVudHMgc28gdGhlIFNWRyBvdmVybGF5XG4gKiBjYW4gZ3JhYiB0aGVtIG5hdGl2ZWx5LlxuICovXG5leHBvcnQgdHlwZSBUb29sID1cbiAgfCAnbW92ZSdcbiAgfCAnaGFuZCdcbiAgfCAnY29tbWVudCdcbiAgfCAncGVuJ1xuICAvLyBBbm5vdGF0aW9uIHBvbGlzaCAoaXRlbSA4KSDigJQgRmlnSmFtLXN0eWxlIGhpZ2hsaWdodGVyLiBBIGBwZW5gLXNoYXBlZCB0b29sXG4gIC8vIHRoYXQgcHJvZHVjZXMgYSB0cmFuc2x1Y2VudCB3aWRlIG11bHRpcGx5IHN0cm9rZSAoYSBQZW5TdHJva2Ugd2l0aFxuICAvLyBgaGlnaGxpZ2h0ZXI6dHJ1ZWApLCBub3QgYSBuZXcgc3Ryb2tlIHR5cGUuXG4gIHwgJ2hpZ2hsaWdodGVyJ1xuICAvLyBQaGFzZSAyNCDigJQgYHNoYXBlYCBpcyB0aGUgc2luZ2xlIGFjdGl2ZSBkcmF3IHRvb2wgdGhhdCBwcm9kdWNlcyByZWN0IC9cbiAgLy8gZWxsaXBzZSAvIHBvbHlnb24gc3Ryb2tlcyAodGhlIGtpbmQgaXMgY2hvc2VuIHZpYSB0aGUgcGFsZXR0ZSBwb3BvdmVyKS5cbiAgLy8gYHJlY3RgIC8gYGVsbGlwc2VgIHN0YXkgaW4gdGhlIHVuaW9uIGFzIHRoZSBzdHJva2UgZGlzY3JpbWluYW50cyB0aGV5XG4gIC8vIGFsd2F5cyB3ZXJlLCBidXQgYXJlIG5vIGxvbmdlciBkaXJlY3RseSBzZWxlY3RhYmxlIGFjdGl2ZSB0b29scy5cbiAgfCAnc2hhcGUnXG4gIHwgJ3JlY3QnXG4gIHwgJ2VsbGlwc2UnXG4gIHwgJ2Fycm93J1xuICB8ICdzdGlja3knXG4gIHwgJ3RleHQnXG4gIC8vIEZpZ0phbSB2MyDigJQgbGFiZWxsZWQgb3JnYW5pemluZyBjb250YWluZXIgKFNoaWZ0K1MpLlxuICB8ICdzZWN0aW9uJ1xuICB8ICdlcmFzZXInO1xuXG5jb25zdCBBTk5PVEFUSU9OX1RPT0xTID0gbmV3IFNldDxUb29sPihbXG4gICdwZW4nLFxuICAnaGlnaGxpZ2h0ZXInLFxuICAnc2hhcGUnLFxuICAncmVjdCcsXG4gICdlbGxpcHNlJyxcbiAgJ2Fycm93JyxcbiAgJ3N0aWNreScsXG4gICd0ZXh0JyxcbiAgJ3NlY3Rpb24nLFxuICAnZXJhc2VyJyxcbl0pO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNBbm5vdGF0aW9uVG9vbCh0OiBUb29sKTogYm9vbGVhbiB7XG4gIHJldHVybiBBTk5PVEFUSU9OX1RPT0xTLmhhcyh0KTtcbn1cblxuZXhwb3J0IHR5cGUgUm91dGVyQWN0aW9uID1cbiAgfCB7IGtpbmQ6ICduby1vcCcgfVxuICB8IHsga2luZDogJ2hvdmVyJzsgZGVlcDogYm9vbGVhbjsgY2xpZW50WDogbnVtYmVyOyBjbGllbnRZOiBudW1iZXIgfVxuICB8IHtcbiAgICAgIGtpbmQ6ICdzZWxlY3QnO1xuICAgICAgLyoqIGByZXBsYWNlYCBzd2FwcyB0aGUgc2VsZWN0aW9uIHNldCwgYGFkZGAgbWVyZ2VzIGludG8gaXQuICovXG4gICAgICBtb2RlOiAncmVwbGFjZScgfCAnYWRkJztcbiAgICAgIC8qKlxuICAgICAgICogYHRydWVgIHJlc29sdmVzIHRvIHRoZSBkZWVwZXN0IGRlc2NlbmRhbnQgdW5kZXIgdGhlIGN1cnNvciAoQ21kLWhlbGRcbiAgICAgICAqIG1vZGUpLiBgZmFsc2VgIHJlc29sdmVzIHRvIHRoZSB0b3Btb3N0IGludGVyZXN0aW5nIGFuY2VzdG9yICh0b3AgbW9kZSkuXG4gICAgICAgKiBQaGFzZSA0LjEgTW92ZS10b29sIHNlbGVjdGlvbiBhbHdheXMgdXNlcyBkZWVwPXRydWUg4oCUIGJhcmUgY2xpY2tzXG4gICAgICAgKiBhcmUgcGFzc3Rocm91Z2ggKG5vIHNlbGVjdCksIGFuZCB0aGUgb25seSBlbnRyeSBwb2ludHMgYXJlIENtZFxuICAgICAgICogKHJlcGxhY2UgZGVlcCkgYW5kIENtZCtTaGlmdCAoYWRkIGRlZXApLlxuICAgICAgICovXG4gICAgICBkZWVwOiBib29sZWFuO1xuICAgICAgY2xpZW50WDogbnVtYmVyO1xuICAgICAgY2xpZW50WTogbnVtYmVyO1xuICAgIH1cbiAgfCB7IGtpbmQ6ICdkcm9wLWNvbW1lbnQnOyBjbGllbnRYOiBudW1iZXI7IGNsaWVudFk6IG51bWJlciB9XG4gIHwgeyBraW5kOiAnY29udGV4dC1tZW51JzsgY2xpZW50WDogbnVtYmVyOyBjbGllbnRZOiBudW1iZXIgfVxuICB8IHsga2luZDogJ3Rvb2wnOyB0b29sOiBUb29sIH1cbiAgfCB7IGtpbmQ6ICdlc2NhcGUnIH1cbiAgfCB7IGtpbmQ6ICd1bmRvJyB9XG4gIHwgeyBraW5kOiAncmVkbycgfTtcblxuZXhwb3J0IGludGVyZmFjZSBDbGFzc2lmeUlucHV0IHtcbiAgdHlwZTogJ3BvaW50ZXJtb3ZlJyB8ICdwb2ludGVyZG93bicgfCAnY29udGV4dG1lbnUnIHwgJ2tleWRvd24nO1xuICAvKiogUG9pbnRlckV2ZW50LmJ1dHRvbjogMCA9IGxlZnQsIDEgPSBtaWRkbGUsIDIgPSByaWdodC4gKi9cbiAgYnV0dG9uPzogbnVtYmVyO1xuICBtZXRhS2V5PzogYm9vbGVhbjtcbiAgY3RybEtleT86IGJvb2xlYW47XG4gIHNoaWZ0S2V5PzogYm9vbGVhbjtcbiAgYWx0S2V5PzogYm9vbGVhbjtcbiAga2V5Pzogc3RyaW5nO1xuICBjbGllbnRYPzogbnVtYmVyO1xuICBjbGllbnRZPzogbnVtYmVyO1xuICAvKiogU3BhY2ViYXIgaGVsZCDigJQgc2hhcmVkIHNpZ25hbCB3aXRoIGB1c2VWaWV3cG9ydENvbnRyb2xsZXJgJ3MgcGFuLWRyYWcuICovXG4gIHNwYWNlSGVsZD86IGJvb2xlYW47XG4gIC8qKiBFdmVudCB0YXJnZXQgaXMgZWRpdGFibGUgKGlucHV0L3RleHRhcmVhL2NvbnRlbnRFZGl0YWJsZSkg4oCUIGNhbGxlciBjb21wdXRlcy4gKi9cbiAgaXNFZGl0YWJsZT86IGJvb2xlYW47XG4gIGFjdGl2ZVRvb2w6IFRvb2w7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gY2xhc3NpZnkg4oCUIHB1cmUgZnVuY3Rpb24uIEFsbCBicmFuY2hpbmcgbGl2ZXMgaGVyZSBzbyB1bml0IHRlc3RzIGNvdmVyIGV2ZXJ5XG4vLyByb3cgb2YgdGhlIGRpc3BhdGNoIHRhYmxlIHdpdGhvdXQgc3Bpbm5pbmcgdXAgYSBET00uXG5cbmNvbnN0IG1ldGFPckN0cmwgPSAoaTogQ2xhc3NpZnlJbnB1dCk6IGJvb2xlYW4gPT4gISEoaS5tZXRhS2V5IHx8IGkuY3RybEtleSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc2lmeShpbnB1dDogQ2xhc3NpZnlJbnB1dCk6IFJvdXRlckFjdGlvbiB7XG4gIGlmIChpbnB1dC50eXBlID09PSAna2V5ZG93bicpIHtcbiAgICBpZiAoaW5wdXQuaXNFZGl0YWJsZSkgcmV0dXJuIHsga2luZDogJ25vLW9wJyB9O1xuICAgIC8vIFRvb2wgbGV0dGVycyBhcmUgYmFyZSBrZXlzIOKAlCBDbWQvQ3RybC9BbHQrbGV0dGVyIGJlbG9uZ3MgdG8gc2hlbGwgLyBicm93c2VyLlxuICAgIGlmIChpbnB1dC5tZXRhS2V5IHx8IGlucHV0LmN0cmxLZXkgfHwgaW5wdXQuYWx0S2V5KSB7XG4gICAgICAvLyBFc2Mgd2l0aCBtb2RpZmllcnMgc3RpbGwgZGlzbWlzc2VzLlxuICAgICAgaWYgKGlucHV0LmtleSA9PT0gJ0VzY2FwZScpIHJldHVybiB7IGtpbmQ6ICdlc2NhcGUnIH07XG4gICAgICAvLyBVbmRvIC8gcmVkbyAoUGhhc2UgMjApLiBBbHQgaXMgcmVzZXJ2ZWQg4oCUIENtZCtPcHQrWiBpcyBhIGJyb3dzZXJcbiAgICAgIC8vIHRleHQtaW5wdXQgZ2VzdHVyZSB3ZSBkb24ndCBjbGFpbS4gYG1ldGFLZXkgfHwgY3RybEtleWAgY292ZXJzIGJvdGhcbiAgICAgIC8vIG1hYyBhbmQgV2luZG93cyAvIExpbnV4IHdpdGhvdXQgYSBwbGF0Zm9ybSBzbmlmZi5cbiAgICAgIGNvbnN0IGsgPSAoaW5wdXQua2V5IHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKCFpbnB1dC5hbHRLZXkgJiYgKGlucHV0Lm1ldGFLZXkgfHwgaW5wdXQuY3RybEtleSkpIHtcbiAgICAgICAgaWYgKGsgPT09ICd6JyAmJiBpbnB1dC5zaGlmdEtleSkgcmV0dXJuIHsga2luZDogJ3JlZG8nIH07XG4gICAgICAgIGlmIChrID09PSAneicpIHJldHVybiB7IGtpbmQ6ICd1bmRvJyB9O1xuICAgICAgICBpZiAoayA9PT0gJ3knICYmICFpbnB1dC5zaGlmdEtleSkgcmV0dXJuIHsga2luZDogJ3JlZG8nIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyBraW5kOiAnbm8tb3AnIH07XG4gICAgfVxuICAgIGNvbnN0IGsgPSAoaW5wdXQua2V5IHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChrID09PSAndicpIHJldHVybiB7IGtpbmQ6ICd0b29sJywgdG9vbDogJ21vdmUnIH07XG4gICAgaWYgKGsgPT09ICdoJykgcmV0dXJuIHsga2luZDogJ3Rvb2wnLCB0b29sOiAnaGFuZCcgfTtcbiAgICBpZiAoayA9PT0gJ2MnKSByZXR1cm4geyBraW5kOiAndG9vbCcsIHRvb2w6ICdjb21tZW50JyB9O1xuICAgIGlmIChrID09PSAnYicpIHJldHVybiB7IGtpbmQ6ICd0b29sJywgdG9vbDogJ3BlbicgfTtcbiAgICAvLyBJID0gaElnaGxpZ2h0ZXIgKGEgZnJlZSBiYXJlIGxldHRlcjsgJ0gnIGlzIHRha2VuIGJ5IEhhbmQpLlxuICAgIGlmIChrID09PSAnaScpIHJldHVybiB7IGtpbmQ6ICd0b29sJywgdG9vbDogJ2hpZ2hsaWdodGVyJyB9O1xuICAgIC8vIFBoYXNlIDI0IOKAlCBSIChhbmQgbGVnYWN5IE8pIGJvdGggYXJtIHRoZSBzaW5nbGUgU2hhcGUgdG9vbDsgdGhlIHNwZWNpZmljXG4gICAgLy8gcHJpbWl0aXZlIGlzIHBpY2tlZCBmcm9tIHRoZSBwYWxldHRlJ3Mgc2hhcGUta2luZCBwb3BvdmVyLlxuICAgIGlmIChrID09PSAncicgfHwgayA9PT0gJ28nKSByZXR1cm4geyBraW5kOiAndG9vbCcsIHRvb2w6ICdzaGFwZScgfTtcbiAgICBpZiAoayA9PT0gJ2EnKSByZXR1cm4geyBraW5kOiAndG9vbCcsIHRvb2w6ICdhcnJvdycgfTtcbiAgICAvLyBQaGFzZSAyMSDigJQgTiA9IHN0aWNreSBOb3RlICgnUycgaXMgdGFrZW4gYnkgdGhlIHNoZWxsIERlc2lnbi1zeXN0ZW0gdmlld1xuICAgIC8vICsgU2hpZnQtbWFycXVlZSk7IFQgPSBzdGFuZGFsb25lIFRleHQuIEJvdGggYXJlIGJhcmUgbGV0dGVycyB0aGUgc2hlbGxcbiAgICAvLyB5aWVsZHMgd2hlbiBmb2N1cyBpcyBpbnNpZGUgdGhlIGNhbnZhcyBpZnJhbWUgKGFwcC5qc3ggb25LZXkgYmFpbCkuXG4gICAgaWYgKGsgPT09ICduJykgcmV0dXJuIHsga2luZDogJ3Rvb2wnLCB0b29sOiAnc3RpY2t5JyB9O1xuICAgIGlmIChrID09PSAndCcpIHJldHVybiB7IGtpbmQ6ICd0b29sJywgdG9vbDogJ3RleHQnIH07XG4gICAgLy8gRmlnSmFtIHYzIOKAlCBTaGlmdCtTIGFybXMgdGhlIFNlY3Rpb24gdG9vbCAoRmlnSmFtJ3Mgb3duIGJpbmRpbmc7IGJhcmUgU1xuICAgIC8vIHN0YXlzIHdpdGggdGhlIHNoZWxsJ3MgRGVzaWduLXN5c3RlbSB2aWV3KS4gQ2hlY2tlZCBoZXJlIGJlY2F1c2UgdGhlXG4gICAgLy8gbW9kaWZpZXIgZ3VhcmQgYWJvdmUgb25seSBmaWx0ZXJzIENtZC9DdHJsL0FsdC5cbiAgICBpZiAoayA9PT0gJ3MnICYmIGlucHV0LnNoaWZ0S2V5KSByZXR1cm4geyBraW5kOiAndG9vbCcsIHRvb2w6ICdzZWN0aW9uJyB9O1xuICAgIGlmIChrID09PSAnZScpIHJldHVybiB7IGtpbmQ6ICd0b29sJywgdG9vbDogJ2VyYXNlcicgfTtcbiAgICBpZiAoaW5wdXQua2V5ID09PSAnRXNjYXBlJykgcmV0dXJuIHsga2luZDogJ2VzY2FwZScgfTtcbiAgICByZXR1cm4geyBraW5kOiAnbm8tb3AnIH07XG4gIH1cblxuICBpZiAoaW5wdXQudHlwZSA9PT0gJ2NvbnRleHRtZW51Jykge1xuICAgIHJldHVybiB7XG4gICAgICBraW5kOiAnY29udGV4dC1tZW51JyxcbiAgICAgIGNsaWVudFg6IGlucHV0LmNsaWVudFggPz8gMCxcbiAgICAgIGNsaWVudFk6IGlucHV0LmNsaWVudFkgPz8gMCxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGlucHV0LnR5cGUgPT09ICdwb2ludGVybW92ZScpIHtcbiAgICAvLyBQaGFzZSA1IGRyYXcgdG9vbHM6IHBlbiAvIHJlY3QgLyBhcnJvdyAvIGVyYXNlciBvd24gYWxsIHRoZWlyIHBvaW50ZXJcbiAgICAvLyBldmVudHMgdGhyb3VnaCBgQW5ub3RhdGlvbnNMYXllcmAuIFRoZSByb3V0ZXIgbmV2ZXIgcGFpbnRzIGEgaG92ZXIgaGFsb1xuICAgIC8vIHdoaWxlIGRyYXdpbmcg4oCUIHRoYXQgYWZmb3JkYW5jZSBpcyByZXNlcnZlZCBmb3Igc2VsZWN0IC8gY29tbWVudC5cbiAgICBpZiAoaXNBbm5vdGF0aW9uVG9vbChpbnB1dC5hY3RpdmVUb29sKSkgcmV0dXJuIHsga2luZDogJ25vLW9wJyB9O1xuICAgIC8vIEhhbmQgdG9vbDogZHJhZyBwYW4gaXMgb3duZWQgYnkgdXNlVmlld3BvcnRDb250cm9sbGVyOyBubyBob3ZlciBwYWludC5cbiAgICBpZiAoaW5wdXQuYWN0aXZlVG9vbCA9PT0gJ2hhbmQnKSByZXR1cm4geyBraW5kOiAnbm8tb3AnIH07XG4gICAgLy8gQ29tbWVudCB0b29sOiBhbHdheXMgcGFpbnQgYSBwcmV2aWV3IGhhbG8gb24gdGhlIGRlZXBlc3QgZWxlbWVudCB1bmRlclxuICAgIC8vIGN1cnNvciDigJQgdGhhdCdzIHRoZSBlbGVtZW50IHRoZSB1c2VyIGlzIGFib3V0IHRvIGNvbW1lbnQgb24uIENvbW1lbnRcbiAgICAvLyBwaW4gYXR0YWNobWVudCBpcyB0byB0aGUgc2FtZSBlbGVtZW50IHRoZXkgd2VyZSBob3ZlcmluZy5cbiAgICBpZiAoaW5wdXQuYWN0aXZlVG9vbCA9PT0gJ2NvbW1lbnQnKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiAnaG92ZXInLFxuICAgICAgICBkZWVwOiB0cnVlLFxuICAgICAgICBjbGllbnRYOiBpbnB1dC5jbGllbnRYID8/IDAsXG4gICAgICAgIGNsaWVudFk6IGlucHV0LmNsaWVudFkgPz8gMCxcbiAgICAgIH07XG4gICAgfVxuICAgIC8vIE1vdmUgdG9vbDogYmFyZSBob3ZlciBkb2VzIG5vdGhpbmcgKG5hdGl2ZSBpbnRlcmFjdGlvbnMgcGFzcyB0aHJvdWdoKTtcbiAgICAvLyBDbWQtaGVsZCBob3ZlciBwYWludHMgYSBoYWxvIG9uIHRoZSBkZWVwZXN0IGVsZW1lbnQgKHByZXZpZXcpLlxuICAgIGlmICghbWV0YU9yQ3RybChpbnB1dCkpIHJldHVybiB7IGtpbmQ6ICduby1vcCcgfTtcbiAgICByZXR1cm4ge1xuICAgICAga2luZDogJ2hvdmVyJyxcbiAgICAgIGRlZXA6IHRydWUsXG4gICAgICBjbGllbnRYOiBpbnB1dC5jbGllbnRYID8/IDAsXG4gICAgICBjbGllbnRZOiBpbnB1dC5jbGllbnRZID8/IDAsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChpbnB1dC50eXBlID09PSAncG9pbnRlcmRvd24nKSB7XG4gICAgaWYgKGlucHV0LmJ1dHRvbiA9PT0gMikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2luZDogJ2NvbnRleHQtbWVudScsXG4gICAgICAgIGNsaWVudFg6IGlucHV0LmNsaWVudFggPz8gMCxcbiAgICAgICAgY2xpZW50WTogaW5wdXQuY2xpZW50WSA/PyAwLFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKGlucHV0LmJ1dHRvbiA9PT0gMSB8fCBpbnB1dC5zcGFjZUhlbGQpIHJldHVybiB7IGtpbmQ6ICduby1vcCcgfTtcbiAgICBpZiAoaW5wdXQuYnV0dG9uICE9PSAwKSByZXR1cm4geyBraW5kOiAnbm8tb3AnIH07XG5cbiAgICAvLyBQaGFzZSA1IGRyYXcgdG9vbHMgb3duIGJhcmUgbGVmdC1jbGlja3M7IHRoZSByb3V0ZXIgcmV0dXJucyBuby1vcCBzb1xuICAgIC8vIHRoZSBTVkcgbGF5ZXIncyBvd24gbGlzdGVuZXJzIChubyBwcmV2ZW50RGVmYXVsdCkgZmlyZSBub3JtYWxseS4gQ21kLVxuICAgIC8vIG1vZGlmaWVkIGNsaWNrcyBzdGlsbCBmbG93IGludG8gdGhlIG1vdmUtdG9vbCBzZWxlY3QgcGF0aCBiZWxvdyDigJQgdGhhdFxuICAgIC8vIHN0YXlzIGF2YWlsYWJsZSBhcyBhbiBlc2NhcGUgaGF0Y2ggZXZlbiB3aGlsZSBhIGRyYXcgdG9vbCBpcyBhY3RpdmUuXG4gICAgaWYgKGlzQW5ub3RhdGlvblRvb2woaW5wdXQuYWN0aXZlVG9vbCkgJiYgIW1ldGFPckN0cmwoaW5wdXQpKSB7XG4gICAgICByZXR1cm4geyBraW5kOiAnbm8tb3AnIH07XG4gICAgfVxuXG4gICAgaWYgKGlucHV0LmFjdGl2ZVRvb2wgPT09ICdjb21tZW50Jykge1xuICAgICAgLy8gQ29tbWVudCB0b29sOiBiYXJlIGNsaWNrIGRyb3BzIGEgcGluLiBDbWQgLyBTaGlmdCBtb2RpZmllcnMgcmVzZXJ2ZWRcbiAgICAgIC8vIGZvciBmdXR1cmUgXCJzY29wZSBjb21tZW50IHRvIGRlZXBlc3RcIiB2YXJpYW50cyDigJQgZm9yIG5vdyB0aGV5IGZhbGxcbiAgICAgIC8vIHRocm91Z2ggdG8gdGhlIHNhbWUgZHJvcC5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtpbmQ6ICdkcm9wLWNvbW1lbnQnLFxuICAgICAgICBjbGllbnRYOiBpbnB1dC5jbGllbnRYID8/IDAsXG4gICAgICAgIGNsaWVudFk6IGlucHV0LmNsaWVudFkgPz8gMCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gSGFuZCB0b29sOiBwYW4gaXMgb3duZWQgYnkgdXNlVmlld3BvcnRDb250cm9sbGVyIHZpYSBgaXNQYW5EcmFnQWN0aXZlYC5cbiAgICAvLyBSb3V0ZXIgcmV0dXJucyBuby1vcCBzbyBpdCBkb2Vzbid0IHByZXZlbnREZWZhdWx0IG9yIHN0b3BQcm9wYWdhdGlvbiDigJRcbiAgICAvLyB0aGUgY29udHJvbGxlcidzIHBvaW50ZXJkb3duIGxpc3RlbmVyIG9uIHRoZSBzYW1lIGhvc3QgY2xhaW1zIHRoZSBkcmFnLlxuICAgIGlmIChpbnB1dC5hY3RpdmVUb29sID09PSAnaGFuZCcpIHJldHVybiB7IGtpbmQ6ICduby1vcCcgfTtcblxuICAgIC8vIE1vdmUgdG9vbC4gU2VsZWN0aW9uIE9OTFkgZmlyZXMgd2l0aCBDbWQgLyBDbWQrU2hpZnQuIEJhcmUgY2xpY2tzIGFuZFxuICAgIC8vIFNoaWZ0LXdpdGhvdXQtQ21kIHBhc3MgdGhyb3VnaCBzbyBuYXRpdmUgY2FudmFzIGludGVyYWN0aW9ucyAoYnV0dG9uXG4gICAgLy8gcHJlc3NlcywgbGluayBjbGlja3MsIGlucHV0IGZvY3VzKSBzdGlsbCB3b3JrIOKAlCBleGFjdGx5IHRoZSBzYW1lIGFzXG4gICAgLy8gcHJlLVBoYXNlLTQuMSBiZWhhdmlvciBmb3IgZXZlcnl0aGluZyBleGNlcHQgQ21kLW1vZGlmaWVkIGdlc3R1cmVzLlxuICAgIGNvbnN0IGNtZCA9IG1ldGFPckN0cmwoaW5wdXQpO1xuICAgIGlmICghY21kKSByZXR1cm4geyBraW5kOiAnbm8tb3AnIH07XG4gICAgY29uc3Qgc2hpZnQgPSAhIWlucHV0LnNoaWZ0S2V5O1xuICAgIHJldHVybiB7XG4gICAgICBraW5kOiAnc2VsZWN0JyxcbiAgICAgIG1vZGU6IHNoaWZ0ID8gJ2FkZCcgOiAncmVwbGFjZScsXG4gICAgICBkZWVwOiB0cnVlLFxuICAgICAgY2xpZW50WDogaW5wdXQuY2xpZW50WCA/PyAwLFxuICAgICAgY2xpZW50WTogaW5wdXQuY2xpZW50WSA/PyAwLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4geyBraW5kOiAnbm8tb3AnIH07XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gdXNlSW5wdXRSb3V0ZXIg4oCUIGF0dGFjaCBsaXN0ZW5lcnMgc2NvcGVkIHRvIGBob3N0UmVmLmN1cnJlbnRgLiBEaXNwYXRjaGVzXG4vLyB0aHJvdWdoIGBjYWxsYmFja3NgLiBSZXR1cm5zIG5vdGhpbmc7IGNsZWFucyB1cCBvbiB1bm1vdW50LlxuXG5leHBvcnQgaW50ZXJmYWNlIFJvdXRlckNhbGxiYWNrcyB7XG4gIG9uSG92ZXI/OiAoYTogRXh0cmFjdDxSb3V0ZXJBY3Rpb24sIHsga2luZDogJ2hvdmVyJyB9PikgPT4gdm9pZDtcbiAgb25TZWxlY3Q/OiAoYTogRXh0cmFjdDxSb3V0ZXJBY3Rpb24sIHsga2luZDogJ3NlbGVjdCcgfT4pID0+IHZvaWQ7XG4gIG9uRHJvcENvbW1lbnQ/OiAoYTogRXh0cmFjdDxSb3V0ZXJBY3Rpb24sIHsga2luZDogJ2Ryb3AtY29tbWVudCcgfT4pID0+IHZvaWQ7XG4gIG9uQ29udGV4dE1lbnU/OiAoYTogRXh0cmFjdDxSb3V0ZXJBY3Rpb24sIHsga2luZDogJ2NvbnRleHQtbWVudScgfT4pID0+IHZvaWQ7XG4gIG9uVG9vbD86IChhOiBFeHRyYWN0PFJvdXRlckFjdGlvbiwgeyBraW5kOiAndG9vbCcgfT4pID0+IHZvaWQ7XG4gIG9uRXNjYXBlPzogKCkgPT4gdm9pZDtcbiAgLyoqIFBoYXNlIDIwIOKAlCBDbWQrWiAvIEN0cmwrWi4gKi9cbiAgb25VbmRvPzogKCkgPT4gdm9pZDtcbiAgLyoqIFBoYXNlIDIwIOKAlCBDbWQrU2hpZnQrWiAvIEN0cmwrWSAvIENtZCtZLiAqL1xuICBvblJlZG8/OiAoKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVzZUlucHV0Um91dGVyT3B0aW9ucyB7XG4gIGhvc3RSZWY6IFJlZk9iamVjdDxIVE1MRWxlbWVudCB8IG51bGw+O1xuICAvKiogTGF0ZXN0IGFjdGl2ZSB0b29sIOKAlCByZWFkIGF0IGV2ZW50IHRpbWUsIG5vdCBjYXB0dXJlZC4gKi9cbiAgZ2V0QWN0aXZlVG9vbDogKCkgPT4gVG9vbDtcbiAgLyoqIE9wdGlvbmFsIHNwYWNlYmFyLWhlbGQgc2lnbmFsIHNoYXJlZCB3aXRoIHVzZVZpZXdwb3J0Q29udHJvbGxlci4gKi9cbiAgaXNTcGFjZUhlbGQ/OiAoKSA9PiBib29sZWFuO1xuICBjYWxsYmFja3M6IFJvdXRlckNhbGxiYWNrcztcbiAgLyoqIFdoZW4gZmFsc2UsIGxpc3RlbmVycyBhcmUgbm90IGF0dGFjaGVkLiBEZWZhdWx0cyB0byB0cnVlLiAqL1xuICBlbmFibGVkPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEFsbG93bGlzdCBvZiBhY3Rpb24ga2luZHMgdGhpcyByb3V0ZXIgaXMgcGVybWl0dGVkIHRvIENMQUlNIChwcmV2ZW50RGVmYXVsdFxuICAgKiArIHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiArIGRpc3BhdGNoKS4gQW55IGNsYXNzaWZpZWQgYWN0aW9uIG91dHNpZGUgdGhlXG4gICAqIHNldCBpcyBkb3duZ3JhZGVkIHRvIGBuby1vcGAgc28gaXQgcHJvcGFnYXRlcyB1bnRvdWNoZWQgdG8gb3RoZXIgbGlzdGVuZXJzLlxuICAgKiBPbWl0IHRvIGNsYWltIGV2ZXJ5dGhpbmcgKHRoZSBkZWZhdWx0IOKAlCB1c2VkIGJ5IHRoZSBmdWxsIERlc2lnbkNhbnZhc1xuICAgKiByb3V0ZXIpLiBUaGUgc2hlbGwtb3duZWQgY29tbWVudCBtb3VudCBsYXllciBwYXNzZXMgYSBuYXJyb3cgc2V0IHNvIGl0IGNhblxuICAgKiBjb2V4aXN0IGFzIGFuIEFOQ0VTVE9SIGNhcHR1cmUtbGlzdGVuZXIgb3ZlciBhIFVJIGNhbnZhcydzIG93biByb3V0ZXJcbiAgICogd2l0aG91dCBzd2FsbG93aW5nIHNlbGVjdCAvIGNvbnRleHQtbWVudSAvIHVuZG8gZ2VzdHVyZXMgaXQgZG9lc24ndCBvd24uXG4gICAqL1xuICBjbGFpbWFibGVBY3Rpb25zPzogUmVhZG9ubHlTZXQ8Um91dGVyQWN0aW9uWydraW5kJ10+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFZGl0YWJsZVRhcmdldCh0OiBFdmVudFRhcmdldCB8IG51bGwpOiBib29sZWFuIHtcbiAgaWYgKCF0IHx8ICEodCBhcyBIVE1MRWxlbWVudCkudGFnTmFtZSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBlbCA9IHQgYXMgSFRNTEVsZW1lbnQ7XG4gIGNvbnN0IHRhZyA9IGVsLnRhZ05hbWU7XG4gIGlmICh0YWcgPT09ICdJTlBVVCcgfHwgdGFnID09PSAnVEVYVEFSRUEnIHx8IHRhZyA9PT0gJ1NFTEVDVCcpIHJldHVybiB0cnVlO1xuICBpZiAoZWwuaXNDb250ZW50RWRpdGFibGUpIHJldHVybiB0cnVlO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogUGhhc2UgNiDigJQgdGhlIGNvbW1lbnRzIG92ZXJsYXkgKHBpbnMgLyBjb21wb3NlciAvIHRocmVhZCBwb3BvdmVyIC8gbWVudGlvblxuICogcG9wdXApIGxpdmVzIElOU0lERSB0aGUgY2FudmFzIHdvcmxkLCB3aGljaCBtZWFucyBpdHMgRE9NIG5vZGVzIGFyZSBpbnNpZGVcbiAqIHRoZSBpbnB1dC1yb3V0ZXIncyBjYXB0dXJlIGhvc3QuIFdpdGhvdXQgYW4gZXhwbGljaXQgYmFpbC1vdXQgdGhlIHJvdXRlclxuICogd291bGQgYHByZXZlbnREZWZhdWx0ICsgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uYCBldmVyeSBjbGljayBvbiBhXG4gKiBjb21wb3NlciBidXR0b24gd2hpbGUgY29tbWVudCBtb2RlIGlzIGFjdGl2ZSwgYmxvY2tpbmcgU2F2ZSAvIENhbmNlbC5cbiAqXG4gKiBXZSB0cmVhdCB0aGUgb3ZlcmxheSBub2RlcyBsaWtlIGVkaXRhYmxlIGZvcm0gd2lkZ2V0cyDigJQgdGhlIHJvdXRlciB5aWVsZHMsXG4gKiB0aGUgUmVhY3QgZXZlbnQgaGFuZGxlciBydW5zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNPdmVybGF5VGFyZ2V0KHQ6IEV2ZW50VGFyZ2V0IHwgbnVsbCk6IGJvb2xlYW4ge1xuICBpZiAoIXQgfHwgISh0IGFzIEVsZW1lbnQpLmNsb3Nlc3QpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuICEhKHQgYXMgRWxlbWVudCkuY2xvc2VzdCgnLmNtLWNvbXBvc2VyLCAuY20tdGhyZWFkLCAuY20tbWVudGlvbi1wb3B1cCwgLmNtLXBpbicpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlSW5wdXRSb3V0ZXIob3B0czogVXNlSW5wdXRSb3V0ZXJPcHRpb25zKTogdm9pZCB7XG4gIGNvbnN0IHsgaG9zdFJlZiwgZ2V0QWN0aXZlVG9vbCwgaXNTcGFjZUhlbGQsIGNhbGxiYWNrcywgZW5hYmxlZCA9IHRydWUsIGNsYWltYWJsZUFjdGlvbnMgfSA9IG9wdHM7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWVuYWJsZWQpIHJldHVybjtcbiAgICBjb25zdCBob3N0ID0gaG9zdFJlZi5jdXJyZW50O1xuICAgIGlmICghaG9zdCkgcmV0dXJuO1xuXG4gICAgLy8gRG93bmdyYWRlIGFueSBhY3Rpb24gdGhpcyByb3V0ZXIgaXNuJ3QgcGVybWl0dGVkIHRvIGNsYWltIHRvIG5vLW9wIHNvIGl0XG4gICAgLy8gcHJvcGFnYXRlcyB1bnRvdWNoZWQgKG5vIHByZXZlbnREZWZhdWx0IC8gbm8gZGlzcGF0Y2gpLiBJZGVudGl0eSBwYXNzLVxuICAgIC8vIHRocm91Z2ggd2hlbiBubyBhbGxvd2xpc3QgaXMgY29uZmlndXJlZC5cbiAgICBjb25zdCBjbGFpbSA9IChhY3Rpb246IFJvdXRlckFjdGlvbik6IFJvdXRlckFjdGlvbiA9PlxuICAgICAgY2xhaW1hYmxlQWN0aW9ucyAmJiBhY3Rpb24ua2luZCAhPT0gJ25vLW9wJyAmJiAhY2xhaW1hYmxlQWN0aW9ucy5oYXMoYWN0aW9uLmtpbmQpXG4gICAgICAgID8geyBraW5kOiAnbm8tb3AnIH1cbiAgICAgICAgOiBhY3Rpb247XG5cbiAgICBjb25zdCBkaXNwYXRjaCA9IChhY3Rpb246IFJvdXRlckFjdGlvbik6IHZvaWQgPT4ge1xuICAgICAgc3dpdGNoIChhY3Rpb24ua2luZCkge1xuICAgICAgICBjYXNlICdob3Zlcic6XG4gICAgICAgICAgY2FsbGJhY2tzLm9uSG92ZXI/LihhY3Rpb24pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgICAgIGNhbGxiYWNrcy5vblNlbGVjdD8uKGFjdGlvbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2Ryb3AtY29tbWVudCc6XG4gICAgICAgICAgY2FsbGJhY2tzLm9uRHJvcENvbW1lbnQ/LihhY3Rpb24pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdjb250ZXh0LW1lbnUnOlxuICAgICAgICAgIGNhbGxiYWNrcy5vbkNvbnRleHRNZW51Py4oYWN0aW9uKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndG9vbCc6XG4gICAgICAgICAgY2FsbGJhY2tzLm9uVG9vbD8uKGFjdGlvbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2VzY2FwZSc6XG4gICAgICAgICAgY2FsbGJhY2tzLm9uRXNjYXBlPy4oKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndW5kbyc6XG4gICAgICAgICAgY2FsbGJhY2tzLm9uVW5kbz8uKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3JlZG8nOlxuICAgICAgICAgIGNhbGxiYWNrcy5vblJlZG8/LigpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICduby1vcCc6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IG9uUG9pbnRlck1vdmUgPSAoZTogUG9pbnRlckV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBhY3Rpb24gPSBjbGFpbShcbiAgICAgICAgY2xhc3NpZnkoe1xuICAgICAgICAgIHR5cGU6ICdwb2ludGVybW92ZScsXG4gICAgICAgICAgYnV0dG9uOiBlLmJ1dHRvbixcbiAgICAgICAgICBtZXRhS2V5OiBlLm1ldGFLZXksXG4gICAgICAgICAgY3RybEtleTogZS5jdHJsS2V5LFxuICAgICAgICAgIHNoaWZ0S2V5OiBlLnNoaWZ0S2V5LFxuICAgICAgICAgIGFsdEtleTogZS5hbHRLZXksXG4gICAgICAgICAgY2xpZW50WDogZS5jbGllbnRYLFxuICAgICAgICAgIGNsaWVudFk6IGUuY2xpZW50WSxcbiAgICAgICAgICBzcGFjZUhlbGQ6IGlzU3BhY2VIZWxkPy4oKSA/PyBmYWxzZSxcbiAgICAgICAgICBhY3RpdmVUb29sOiBnZXRBY3RpdmVUb29sKCksXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgZGlzcGF0Y2goYWN0aW9uKTtcbiAgICB9O1xuXG4gICAgY29uc3Qgb25Qb2ludGVyRG93biA9IChlOiBQb2ludGVyRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIC8vIFBoYXNlIDYg4oCUIG92ZXJsYXkgc3VyZmFjZXMgKGNvbXBvc2VyIC8gdGhyZWFkIC8gbWVudGlvbiBwb3B1cCkgb3duXG4gICAgICAvLyB0aGVpciBvd24gY2xpY2tzLiBUaGUgcm91dGVyIGlzIGluIGNhcHR1cmUgcGhhc2UsIHNvIHdlIGhhdmUgdG9cbiAgICAgIC8vIGJhaWwgSEVSRSBiZWZvcmUgY2xhc3NpZnkgY2FuIGNsYWltIHRoZSBldmVudC5cbiAgICAgIGlmIChpc092ZXJsYXlUYXJnZXQoZS50YXJnZXQpKSByZXR1cm47XG4gICAgICBjb25zdCBhY3Rpb24gPSBjbGFpbShcbiAgICAgICAgY2xhc3NpZnkoe1xuICAgICAgICAgIHR5cGU6ICdwb2ludGVyZG93bicsXG4gICAgICAgICAgYnV0dG9uOiBlLmJ1dHRvbixcbiAgICAgICAgICBtZXRhS2V5OiBlLm1ldGFLZXksXG4gICAgICAgICAgY3RybEtleTogZS5jdHJsS2V5LFxuICAgICAgICAgIHNoaWZ0S2V5OiBlLnNoaWZ0S2V5LFxuICAgICAgICAgIGFsdEtleTogZS5hbHRLZXksXG4gICAgICAgICAgY2xpZW50WDogZS5jbGllbnRYLFxuICAgICAgICAgIGNsaWVudFk6IGUuY2xpZW50WSxcbiAgICAgICAgICBzcGFjZUhlbGQ6IGlzU3BhY2VIZWxkPy4oKSA/PyBmYWxzZSxcbiAgICAgICAgICBhY3RpdmVUb29sOiBnZXRBY3RpdmVUb29sKCksXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgaWYgKGFjdGlvbi5raW5kICE9PSAnbm8tb3AnKSB7XG4gICAgICAgIC8vIFN1cHByZXNzIG5hdGl2ZSBiZWhhdmlvciBvbiBldmVyeSBldmVudCB0aGUgcm91dGVyIGNsYWltcyDigJRcbiAgICAgICAgLy8gYnV0dG9uIHByZXNzZXMgZG9uJ3QgZmlyZSwgaW5wdXRzIGRvbid0IGZvY3VzLCB0aGUgY2FudmFzXG4gICAgICAgIC8vIGNvbnRlbnQncyBvd24gY2xpY2sgaGFuZGxlcnMgZG9uJ3QgcnVuLiBUaGUgcm91dGVyIGxpdmVzIGluXG4gICAgICAgIC8vIGNhcHR1cmUgcGhhc2Ugc28gdGhpcyBmaXJlcyBiZWZvcmUgZGVzY2VuZGFudHMuXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cbiAgICAgIGRpc3BhdGNoKGFjdGlvbik7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFBhaXJlZCBtb3VzZWRvd24gbGlzdGVuZXIg4oCUIHByZXZlbnREZWZhdWx0IG9uIHBvaW50ZXJkb3duIGRvZXMgTk9UXG4gICAgICogc3VwcHJlc3MgdGhlIG1vdXNlZG93biBldmVudCB0aGF0IGJyb3dzZXJzIGZpcmUgYWxvbmdzaWRlLCBhbmRcbiAgICAgKiBgPGlucHV0PmAgLyBgPGJ1dHRvbj5gIGZvY3VzIGlzIGRyaXZlbiBieSBtb3VzZWRvd24ncyBkZWZhdWx0IGJlaGF2aW9yLlxuICAgICAqIFdlIG1pcnJvciB0aGUgc2FtZSBnYXRlIGFzIHBvaW50ZXJkb3duIHNvIHN1cHByZXNzZWQgcG9pbnRlcmRvd25zIGFsc29cbiAgICAgKiBzdG9wIHRoZWlyIHR3aW4gbW91c2Vkb3duLlxuICAgICAqL1xuICAgIGNvbnN0IG9uTW91c2VEb3duID0gKGU6IE1vdXNlRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmIChpc092ZXJsYXlUYXJnZXQoZS50YXJnZXQpKSByZXR1cm47XG4gICAgICBjb25zdCBhY3Rpb24gPSBjbGFpbShcbiAgICAgICAgY2xhc3NpZnkoe1xuICAgICAgICAgIHR5cGU6ICdwb2ludGVyZG93bicsXG4gICAgICAgICAgYnV0dG9uOiBlLmJ1dHRvbixcbiAgICAgICAgICBtZXRhS2V5OiBlLm1ldGFLZXksXG4gICAgICAgICAgY3RybEtleTogZS5jdHJsS2V5LFxuICAgICAgICAgIHNoaWZ0S2V5OiBlLnNoaWZ0S2V5LFxuICAgICAgICAgIGFsdEtleTogZS5hbHRLZXksXG4gICAgICAgICAgY2xpZW50WDogZS5jbGllbnRYLFxuICAgICAgICAgIGNsaWVudFk6IGUuY2xpZW50WSxcbiAgICAgICAgICBzcGFjZUhlbGQ6IGlzU3BhY2VIZWxkPy4oKSA/PyBmYWxzZSxcbiAgICAgICAgICBhY3RpdmVUb29sOiBnZXRBY3RpdmVUb29sKCksXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgaWYgKGFjdGlvbi5raW5kICE9PSAnbm8tb3AnKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ2xpY2sgbGlzdGVuZXIg4oCUIGZpcmVzIEFGVEVSIHBvaW50ZXJkb3duK3BvaW50ZXJ1cC4gRXZlbiB3aXRoXG4gICAgICogcHJldmVudERlZmF1bHQgb24gbW91c2Vkb3duLCB0aGUgY2xpY2sgZXZlbnQgc3RpbGwgc3ludGhlc2l6ZXMgZm9yXG4gICAgICogbm9uLWZvcm0gZWxlbWVudHMuIFdlIHN1cHByZXNzIGl0IHdoZW5ldmVyIHRoZSByb3V0ZXIgY2xhaW1lZCB0aGVcbiAgICAgKiBtYXRjaGluZyBwb2ludGVyZG93biAocmUtY2xhc3NpZnkgd2l0aCB0aGUgc2FtZSBtb2RpZmllcnMpLlxuICAgICAqL1xuICAgIGNvbnN0IG9uQ2xpY2sgPSAoZTogTW91c2VFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKGlzT3ZlcmxheVRhcmdldChlLnRhcmdldCkpIHJldHVybjtcbiAgICAgIGNvbnN0IHRvb2wgPSBnZXRBY3RpdmVUb29sKCk7XG4gICAgICBjb25zdCBtb2QgPSBlLm1ldGFLZXkgfHwgZS5jdHJsS2V5O1xuICAgICAgLy8gTWFwIHRoZSBjbGljayB0byB0aGUgYWN0aW9uIGtpbmQgdGhlIG1hdGNoaW5nIHBvaW50ZXJkb3duIHdvdWxkIGhhdmVcbiAgICAgIC8vIHByb2R1Y2VkLCB0aGVuIGhvbm9yIHRoZSBjbGFpbSBhbGxvd2xpc3Qgc28gYSBzY29wZWQgcm91dGVyICh0aGVcbiAgICAgIC8vIGNvbW1lbnQgbW91bnQgbGF5ZXIpIGRvZXNuJ3Qgc3VwcHJlc3MgY2xpY2tzIGl0IG5ldmVyIGNsYWltZWQuXG4gICAgICBjb25zdCB3b3VsZFJvdXRlS2luZDogUm91dGVyQWN0aW9uWydraW5kJ10gfCBudWxsID1cbiAgICAgICAgdG9vbCA9PT0gJ2NvbW1lbnQnXG4gICAgICAgICAgPyAnZHJvcC1jb21tZW50J1xuICAgICAgICAgIDogdG9vbCA9PT0gJ21vdmUnICYmIG1vZCAmJiBlLmJ1dHRvbiA9PT0gMFxuICAgICAgICAgICAgPyAnc2VsZWN0J1xuICAgICAgICAgICAgOiBlLmJ1dHRvbiA9PT0gMlxuICAgICAgICAgICAgICA/ICdjb250ZXh0LW1lbnUnXG4gICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgIGlmICh3b3VsZFJvdXRlS2luZCAmJiAoIWNsYWltYWJsZUFjdGlvbnMgfHwgY2xhaW1hYmxlQWN0aW9ucy5oYXMod291bGRSb3V0ZUtpbmQpKSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IG9uQ29udGV4dE1lbnUgPSAoZTogTW91c2VFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgYWN0aW9uID0gY2xhaW0oXG4gICAgICAgIGNsYXNzaWZ5KHtcbiAgICAgICAgICB0eXBlOiAnY29udGV4dG1lbnUnLFxuICAgICAgICAgIGNsaWVudFg6IGUuY2xpZW50WCxcbiAgICAgICAgICBjbGllbnRZOiBlLmNsaWVudFksXG4gICAgICAgICAgbWV0YUtleTogZS5tZXRhS2V5LFxuICAgICAgICAgIGN0cmxLZXk6IGUuY3RybEtleSxcbiAgICAgICAgICBzaGlmdEtleTogZS5zaGlmdEtleSxcbiAgICAgICAgICBhbHRLZXk6IGUuYWx0S2V5LFxuICAgICAgICAgIGFjdGl2ZVRvb2w6IGdldEFjdGl2ZVRvb2woKSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICBpZiAoYWN0aW9uLmtpbmQgPT09ICduby1vcCcpIHJldHVybjsgLy8gbm90IG91cnMgdG8gY2xhaW0g4oCUIGxldCBpdCBidWJibGVcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICBkaXNwYXRjaChhY3Rpb24pO1xuICAgIH07XG5cbiAgICBjb25zdCBvbktleURvd24gPSAoZTogS2V5Ym9hcmRFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgYWN0aW9uID0gY2xhaW0oXG4gICAgICAgIGNsYXNzaWZ5KHtcbiAgICAgICAgICB0eXBlOiAna2V5ZG93bicsXG4gICAgICAgICAga2V5OiBlLmtleSxcbiAgICAgICAgICBtZXRhS2V5OiBlLm1ldGFLZXksXG4gICAgICAgICAgY3RybEtleTogZS5jdHJsS2V5LFxuICAgICAgICAgIHNoaWZ0S2V5OiBlLnNoaWZ0S2V5LFxuICAgICAgICAgIGFsdEtleTogZS5hbHRLZXksXG4gICAgICAgICAgaXNFZGl0YWJsZTogaXNFZGl0YWJsZVRhcmdldChlLnRhcmdldCksXG4gICAgICAgICAgYWN0aXZlVG9vbDogZ2V0QWN0aXZlVG9vbCgpLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIGlmIChcbiAgICAgICAgYWN0aW9uLmtpbmQgPT09ICd0b29sJyB8fFxuICAgICAgICBhY3Rpb24ua2luZCA9PT0gJ2VzY2FwZScgfHxcbiAgICAgICAgYWN0aW9uLmtpbmQgPT09ICd1bmRvJyB8fFxuICAgICAgICBhY3Rpb24ua2luZCA9PT0gJ3JlZG8nXG4gICAgICApIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgICAgZGlzcGF0Y2goYWN0aW9uKTtcbiAgICB9O1xuXG4gICAgLy8gQ2FwdHVyZSBwaGFzZSBmb3IgcG9pbnRlci9tb3VzZS9jbGljayBldmVudHMg4oCUIHJvdXRlciBydW5zIEJFRk9SRVxuICAgIC8vIGRlc2NlbmRhbnRzIChidXR0b25zLCBpbnB1dHMsIGNhbnZhcyBjb250ZW50IGxpc3RlbmVycykuIEZvciBldmVudHMgdGhlXG4gICAgLy8gY2xhc3NpZmllciBjbGFpbXMsIHdlIHByZXZlbnREZWZhdWx0ICsgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uIHNvIHRoZVxuICAgIC8vIGRlc2NlbmRhbnRzIG5ldmVyIHNlZSB0aGVtLlxuICAgIGhvc3QuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCBvblBvaW50ZXJNb3ZlLCB7IHBhc3NpdmU6IHRydWUgfSk7XG4gICAgaG9zdC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIG9uUG9pbnRlckRvd24sIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgICBob3N0LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIG9uTW91c2VEb3duLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gICAgaG9zdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9uQ2xpY2ssIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgICBob3N0LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51Jywgb25Db250ZXh0TWVudSwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgIC8vIEtleSBldmVudHM6IGF0dGFjaCBvbiBkb2N1bWVudCBzbyBmb2N1cyBpbnNpZGUgYW55IGRlc2NlbmRhbnQgaXMgT0s7XG4gICAgLy8gdGhlIGVkaXRhYmxlLXRhcmdldCBnYXRlIGhhbmRsZXMgdGhlIFwidXNlciBpcyB0eXBpbmdcIiBjYXNlLlxuICAgIGNvbnN0IGRvYyA9IGhvc3Qub3duZXJEb2N1bWVudCA/PyBkb2N1bWVudDtcbiAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG9uS2V5RG93biwgdHJ1ZSk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaG9zdC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsIG9uUG9pbnRlck1vdmUpO1xuICAgICAgaG9zdC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIG9uUG9pbnRlckRvd24sIHtcbiAgICAgICAgY2FwdHVyZTogdHJ1ZSxcbiAgICAgIH0gYXMgRXZlbnRMaXN0ZW5lck9wdGlvbnMpO1xuICAgICAgaG9zdC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbk1vdXNlRG93biwgeyBjYXB0dXJlOiB0cnVlIH0gYXMgRXZlbnRMaXN0ZW5lck9wdGlvbnMpO1xuICAgICAgaG9zdC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIG9uQ2xpY2ssIHsgY2FwdHVyZTogdHJ1ZSB9IGFzIEV2ZW50TGlzdGVuZXJPcHRpb25zKTtcbiAgICAgIGhvc3QucmVtb3ZlRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCBvbkNvbnRleHRNZW51LCB7XG4gICAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgICB9IGFzIEV2ZW50TGlzdGVuZXJPcHRpb25zKTtcbiAgICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25LZXlEb3duLCB0cnVlKTtcbiAgICB9O1xuICB9LCBbZW5hYmxlZCwgaG9zdFJlZiwgZ2V0QWN0aXZlVG9vbCwgaXNTcGFjZUhlbGQsIGNhbGxiYWNrcywgY2xhaW1hYmxlQWN0aW9uc10pO1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIHJlc29sdmVIb3ZlclRhcmdldCDigJQgd2Fsa3MgZnJvbSBhIGNsaWVudFgvY2xpZW50WSBwYWlyIHRvIHRoZSBjYW52YXMgZWxlbWVudFxuLy8gb2YgaW50ZXJlc3QuIERlZmF1bHQgPSB0b3Btb3N0IGBbZGF0YS1jZC1pZF1gIGFuY2VzdG9yICh0aGUgc3RhYmxlXG4vLyBwaXBlbGluZS1zdGFtcGVkIGFuY2hvcikuIGBkZWVwID0gdHJ1ZWAgcmV0dXJucyB0aGUgZGVlcGVzdCBkZXNjZW5kYW50XG4vLyAoQ21kLWhvdmVyIGJlaGF2aW9yKS5cblxuZXhwb3J0IGludGVyZmFjZSBIb3ZlclRhcmdldCB7XG4gIGVsOiBFbGVtZW50O1xuICBjZElkOiBzdHJpbmcgfCBudWxsO1xuICBhcnRib2FyZElkOiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUhvdmVyVGFyZ2V0KFxuICBkb2M6IERvY3VtZW50LFxuICBjbGllbnRYOiBudW1iZXIsXG4gIGNsaWVudFk6IG51bWJlcixcbiAgb3B0czogeyBkZWVwOiBib29sZWFuIH1cbik6IEhvdmVyVGFyZ2V0IHwgbnVsbCB7XG4gIGNvbnN0IGhpdCA9IGRvYy5lbGVtZW50RnJvbVBvaW50KGNsaWVudFgsIGNsaWVudFkpO1xuICBpZiAoIWhpdCkgcmV0dXJuIG51bGw7XG4gIC8vIFNraXAgdGhlIGZsb2F0aW5nIGNocm9tZSAoTWluaU1hcCAvIFpvb21Ub29sYmFyIC8gVG9vbFBhbGV0dGUgLyBDb250ZXh0TWVudSlcbiAgLy8gQU5EIHRoZSBjYW52YXMvd29ybGQgZnJhbWUgaXRzZWxmIOKAlCB0aGUgdXNlciBpcyBuZXZlciBhc2tpbmcgdG8gXCJzZWxlY3RcbiAgLy8gdGhlIGVudGlyZSBjYW52YXMgdmlld3BvcnQsXCIgdGhhdCdzIGEgVUkgYWNjaWRlbnQgZnJvbSBjbGltYmluZyB0b28gaGlnaC5cbiAgaWYgKGhpdC5jbG9zZXN0Py4oJy5kYy1tbSwgLmRjLXpvb20tdGIsIC5kYy10b29sLXBhbGV0dGUsIC5kYy1jb250ZXh0LW1lbnUsIC5kYy1jdi1ncm91cC1iYm94JykpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGFydGJvYXJkRWwgPSBoaXQuY2xvc2VzdD8uKCdbZGF0YS1kYy1zY3JlZW5dJykgPz8gbnVsbDtcbiAgY29uc3QgYXJ0Ym9hcmRJZCA9IGFydGJvYXJkRWw/LmdldEF0dHJpYnV0ZSgnZGF0YS1kYy1zY3JlZW4nKSA/PyBudWxsO1xuXG4gIC8vIEhvdmVyLXRhcmdldCBoYXJkIGNlaWxpbmcgPSBgLmRjLWFydGJvYXJkLWJvZHlgLiBJbm5lciBET00gY29udGVudCBsaXZlc1xuICAvLyB0aGVyZTsgY2hyb21lIGxpdmVzIG91dHNpZGUgKGxhYmVsLCBoZWFkZXIsIGFydGljbGUgcm9vdCkuIFRoZSB0d28gcGF0aHNcbiAgLy8gZGl2ZXJnZSBmcm9tIGhlcmU6XG4gIC8vICAgKiBoaXQg4oiIIGJvZHkg4oaSIHJlc29sdmUgdG8gdGhlIGRlZXBlc3Qgc3RhbXBlZCBlbGVtZW50IChleGlzdGluZ1xuICAvLyAgICAgZGVlcC90b3AgbG9naWMgYmVsb3cpLlxuICAvLyAgICogaGl0IOKIiCBjaHJvbWUgKGxhYmVsL2hlYWRlci9hcnRpY2xlLXJvb3QpIOKGkiB0aGUgdXNlciB3YW50cyB0byBzZWxlY3RcbiAgLy8gICAgIHRoZSBXSE9MRSBhcnRib2FyZC4gUmV0dXJuIHRoZSBhcnRpY2xlIGVsZW1lbnQgaXRzZWxmIHdpdGggbm8gY2RJZDtcbiAgLy8gICAgIGNvbnN1bWVycyAoaG92ZXJUYXJnZXRUb1NlbGVjdGlvbikgZmFsbCBiYWNrIHRvIGFcbiAgLy8gICAgIGBbZGF0YS1kYy1zY3JlZW49XCLigKZcIl1gIHNlbGVjdG9yIHRoYXQgd3JhcHMgdGhlIHdob2xlIGZyYW1lLiBUaGlzIGlzXG4gIC8vICAgICB3aGF0IGVuYWJsZXMgQ21kK1NoaWZ0K0NsaWNrIG11bHRpLXNlbGVjdCBvZiBhcnRib2FyZHMgKFQyNCAvIEc4KS5cbiAgY29uc3QgYm9keUVsID0gaGl0LmNsb3Nlc3Q/LignLmRjLWFydGJvYXJkLWJvZHknKSA/PyBudWxsO1xuICBpZiAoIWJvZHlFbCkge1xuICAgIGlmIChhcnRib2FyZEVsICYmIGFydGJvYXJkSWQpIHtcbiAgICAgIHJldHVybiB7IGVsOiBhcnRib2FyZEVsLCBjZElkOiBudWxsLCBhcnRib2FyZElkIH07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmIChoaXQgPT09IGJvZHlFbCkge1xuICAgIC8vIENsaWNrZWQgdGhlIGJvZHkgd3JhcHBlciBpdHNlbGYgKGVtcHR5IHBhZGRpbmcgaW5zaWRlIGFuIGFydGJvYXJkLCBub1xuICAgIC8vIHVzZXIgY29udGVudCB1bmRlciB0aGUgY3Vyc29yKS4gUHJvbW90ZSB0byBcInNlbGVjdCB3aG9sZSBhcnRib2FyZFwiIHNvXG4gICAgLy8gdGhlIGdlc3R1cmUgc3RheXMgY29uc2lzdGVudCB3aXRoIGNocm9tZSBjbGlja3MgYWJvdmUuXG4gICAgaWYgKGFydGJvYXJkRWwgJiYgYXJ0Ym9hcmRJZCkge1xuICAgICAgcmV0dXJuIHsgZWw6IGFydGJvYXJkRWwsIGNkSWQ6IG51bGwsIGFydGJvYXJkSWQgfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAob3B0cy5kZWVwKSB7XG4gICAgLy8gRGVlcGVzdCBtb2RlIOKAlCB0aGUgaGl0IGVsZW1lbnQgSVMgdGhlIHRhcmdldC4gVXNlIGl0cyBPV04gZGF0YS1jZC1pZFxuICAgIC8vIHdoZW4gcHJlc2VudDsgbmV2ZXIgY2xpbWIgdG8gYW4gYW5jZXN0b3IncyBpZCAoY2xpbWJpbmcgd2FzIHRoZSBjYXVzZVxuICAgIC8vIG9mIFwiQ21kLWNsaWNrIG9uIGEgZGVlcCBzcGFuIHNlbGVjdHMgdGhlIHdob2xlIGFydGJvYXJkIHJvb3RcIikuIFdoZW5cbiAgICAvLyB0aGUgaGl0IGxhY2tzIGEgc3RhbXBlZCBpZCwgY29uc3VtZXJzIGZhbGwgYmFjayB0byBhIENTUy1wYXRoIHNlbGVjdG9yLlxuICAgIGNvbnN0IGNkSWQgPSBoaXQuZ2V0QXR0cmlidXRlPy4oJ2RhdGEtY2QtaWQnKSA/PyBudWxsO1xuICAgIHJldHVybiB7IGVsOiBoaXQsIGNkSWQsIGFydGJvYXJkSWQgfTtcbiAgfVxuXG4gIC8vIFRvcCBtb2RlIOKAlCBjbGltYiB0byB0aGUgdG9wbW9zdCBkZXNjZW5kYW50IG9mIHRoZSBhcnRib2FyZCBib2R5IHRoYXRcbiAgLy8gc3RpbGwgY2FycmllcyBhIGRhdGEtY2QtaWQuIEhhcmQgY2VpbGluZyBpcyBib2R5RWwgaXRzZWxmIChuZXZlciBzZWxlY3RcbiAgLy8gdGhlIGJvZHkgd3JhcHBlciBvciBoaWdoZXIpLlxuICBsZXQgY3VyOiBFbGVtZW50IHwgbnVsbCA9IGhpdDtcbiAgbGV0IHRvcENkRWw6IEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgd2hpbGUgKGN1ciAmJiBjdXIgIT09IGJvZHlFbCkge1xuICAgIGlmIChjdXIuaGFzQXR0cmlidXRlPy4oJ2RhdGEtY2QtaWQnKSkgdG9wQ2RFbCA9IGN1cjtcbiAgICBjdXIgPSBjdXIucGFyZW50RWxlbWVudDtcbiAgfVxuICBjb25zdCBlbCA9IHRvcENkRWwgPz8gaGl0O1xuICBjb25zdCBjZElkID0gZWwuZ2V0QXR0cmlidXRlPy4oJ2RhdGEtY2QtaWQnKSA/PyBudWxsO1xuICByZXR1cm4geyBlbCwgY2RJZCwgYXJ0Ym9hcmRJZCB9O1xufVxuIiwKICAgICIvKipcbiAqIEBmaWxlICAgICAgIHVzZS10b29sLW1vZGUudHN4IOKAlCBQaGFzZSA0LjEgdG9vbC1tb2RlIHN0b3JlXG4gKiBAc2NvcGUgICAgICBhcHBzL3N0dWRpby91c2UtdG9vbC1tb2RlLnRzeFxuICogQHB1cnBvc2UgICAgQ29udGV4dCArIGhvb2sgZm9yIHRoZSBhY3RpdmUgY2FudmFzIHRvb2wuIFdpcmVkIGludG9cbiAqICAgICAgICAgICAgIERlc2lnbkNhbnZhcy4gUGhhc2UgNSB3aWxsXG4gKiAgICAgICAgICAgICByZWdpc3RlciBhZGRpdGlvbmFsIHRvb2xzIChwZW4sIGNpcmNsZSwgYXJyb3csIGVyYXNlcikgdmlhXG4gKiAgICAgICAgICAgICB0aGUgc2FtZSBwcm92aWRlciDigJQgdGhlIEFQSSBpcyBpbnRlbnRpb25hbGx5IG9wZW4uXG4gKlxuICogVGhlIHJvdXRlcidzIGBvblRvb2xgIGNhbGxiYWNrIChpbnB1dC1yb3V0ZXIudHN4KSB3cml0ZXMgaW50byB0aGlzIHN0b3JlLlxuICogVGhlIFRvb2xQYWxldHRlICsgY3Vyc29yIHN5bmMgcmVhZCBmcm9tIGl0LiBTZWxlY3RpbmcgYSB0b29sIGFsc28gbXV0YXRlc1xuICogYGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yYCBzbyB0aGUgYWZmb3JkYW5jZSBtYXRjaGVzIGFjcm9zcyB0aGUgaWZyYW1lLlxuICovXG5cbmltcG9ydCB7XG4gIGNyZWF0ZUNvbnRleHQsXG4gIHR5cGUgUmVhY3ROb2RlLFxuICB1c2VDYWxsYmFjayxcbiAgdXNlQ29udGV4dCxcbiAgdXNlRWZmZWN0LFxuICB1c2VNZW1vLFxuICB1c2VTdGF0ZSxcbn0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgeyBUT09MX0NVUlNPUlMgfSBmcm9tICcuL2NhbnZhcy1jdXJzb3JzLnRzJztcbmltcG9ydCB0eXBlIHsgVG9vbCB9IGZyb20gJy4vaW5wdXQtcm91dGVyLnRzeCc7XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gVHlwZXNcblxuZXhwb3J0IGludGVyZmFjZSBUb29sRGVzY3JpcHRvciB7XG4gIGlkOiBUb29sO1xuICBsYWJlbDogc3RyaW5nO1xuICAvKiogTGV0dGVyLWtleSBzaG9ydGN1dCBzaG93biBpbiB0aGUgcGFsZXR0ZSB0b29sdGlwLiAqL1xuICBzaG9ydGN1dDogc3RyaW5nO1xuICAvKiogQ1NTIGN1cnNvciB2YWx1ZSBhcHBsaWVkIHRvIDxib2R5PiB3aGVuIHRoaXMgdG9vbCBpcyBhY3RpdmUuICovXG4gIGN1cnNvcjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBoYXNlIDI0IOKAlCB0aGUgc2l4IHByaW1pdGl2ZXMgdGhlIHNpbmdsZSBTaGFwZSB0b29sIGNhbiBkcmF3LiBNYXBzIG9udG8gdGhlXG4gKiBzdHJva2UgbW9kZWw6IHNxdWFyZS9yb3VuZGVkIOKGkiBgcmVjdGAgKGNvcm5lclJhZGl1cyAwIC8gOCk7IGNpcmNsZSDihpJcbiAqIGBlbGxpcHNlYDsgZGlhbW9uZC90cmlhbmdsZS90cmlhbmdsZS1kb3duIOKGkiBgcG9seWdvbmAuXG4gKi9cbmV4cG9ydCB0eXBlIFNoYXBlS2luZCA9ICdzcXVhcmUnIHwgJ3JvdW5kZWQnIHwgJ2NpcmNsZScgfCAnZGlhbW9uZCcgfCAndHJpYW5nbGUnIHwgJ3RyaWFuZ2xlLWRvd24nO1xuXG4vLyBQaGFzZSAyMSDigJQgZXZlcnkgdG9vbCBzaGlwcyBhIGN1c3RvbSAzMsOXMzIgU1ZHIGN1cnNvciAoY2FudmFzLWN1cnNvcnMudHMpXG4vLyB3aXRoIGEgd2hpdGUgb3V0bGluZSBoYWxvIHNvIHRoZSBnbHlwaCByZWFkcyBvbiBhbnkgYmFja2dyb3VuZC4gVGhlIG5hdGl2ZVxuLy8gY3Jvc3NoYWlyL3RleHQvY2VsbCB3ZXJlIHRoaW4gKyB0aW55IChcInBlbiBhbG1vc3QgaW52aXNpYmxlXCIpOyB0aGVzZSBtaXJyb3Jcbi8vIHRoZSB0b29sLXBhbGV0dGUgaWNvbnMuIGBtb3ZlYCBrZWVwcyB0aGUgc3lzdGVtIGFycm93IG9uIHB1cnBvc2UuXG5leHBvcnQgY29uc3QgREVGQVVMVF9UT09MUzogcmVhZG9ubHkgVG9vbERlc2NyaXB0b3JbXSA9IE9iamVjdC5mcmVlemUoW1xuICB7IGlkOiAnbW92ZScsIGxhYmVsOiAnTW92ZScsIHNob3J0Y3V0OiAnVicsIGN1cnNvcjogVE9PTF9DVVJTT1JTLm1vdmUgfSxcbiAgeyBpZDogJ2hhbmQnLCBsYWJlbDogJ0hhbmQnLCBzaG9ydGN1dDogJ0gnLCBjdXJzb3I6IFRPT0xfQ1VSU09SUy5oYW5kIH0sXG4gIHsgaWQ6ICdjb21tZW50JywgbGFiZWw6ICdDb21tZW50Jywgc2hvcnRjdXQ6ICdDJywgY3Vyc29yOiBUT09MX0NVUlNPUlMuY29tbWVudCB9LFxuICB7IGlkOiAncGVuJywgbGFiZWw6ICdQZW4nLCBzaG9ydGN1dDogJ0InLCBjdXJzb3I6IFRPT0xfQ1VSU09SUy5wZW4gfSxcbiAgLy8gQW5ub3RhdGlvbiBwb2xpc2ggKGl0ZW0gOCkg4oCUIGhpZ2hsaWdodGVyIHNpdHMgbmV4dCB0byB0aGUgcGVuLlxuICB7IGlkOiAnaGlnaGxpZ2h0ZXInLCBsYWJlbDogJ0hpZ2hsaWdodGVyJywgc2hvcnRjdXQ6ICdJJywgY3Vyc29yOiBUT09MX0NVUlNPUlMuaGlnaGxpZ2h0ZXIgfSxcbiAgLy8gUGhhc2UgMjQg4oCUIG9uZSBTaGFwZSB0b29sIHJlcGxhY2VzIHRoZSBzZXBhcmF0ZSBSZWN0IChSKSArIEVsbGlwc2UgKE8pXG4gIC8vIGJ1dHRvbnM7IHRoZSBwcmltaXRpdmUgaXMgY2hvc2VuIGZyb20gdGhlIHBhbGV0dGUgcG9wb3Zlci5cbiAgeyBpZDogJ3NoYXBlJywgbGFiZWw6ICdTaGFwZScsIHNob3J0Y3V0OiAnUicsIGN1cnNvcjogVE9PTF9DVVJTT1JTLnNoYXBlIH0sXG4gIHsgaWQ6ICdzdGlja3knLCBsYWJlbDogJ1N0aWNreScsIHNob3J0Y3V0OiAnTicsIGN1cnNvcjogVE9PTF9DVVJTT1JTLnN0aWNreSB9LFxuICAvLyBGaWdKYW0gdjMg4oCUIGxhYmVsbGVkIG9yZ2FuaXppbmcgY29udGFpbmVyLlxuICB7IGlkOiAnc2VjdGlvbicsIGxhYmVsOiAnU2VjdGlvbicsIHNob3J0Y3V0OiAn4oenUycsIGN1cnNvcjogVE9PTF9DVVJTT1JTLnNoYXBlIH0sXG4gIHsgaWQ6ICdhcnJvdycsIGxhYmVsOiAnQXJyb3cnLCBzaG9ydGN1dDogJ0EnLCBjdXJzb3I6IFRPT0xfQ1VSU09SUy5hcnJvdyB9LFxuICB7IGlkOiAndGV4dCcsIGxhYmVsOiAnVGV4dCcsIHNob3J0Y3V0OiAnVCcsIGN1cnNvcjogVE9PTF9DVVJTT1JTLnRleHQgfSxcbiAgeyBpZDogJ2VyYXNlcicsIGxhYmVsOiAnRXJhc2VyJywgc2hvcnRjdXQ6ICdFJywgY3Vyc29yOiBUT09MX0NVUlNPUlMuZXJhc2VyIH0sXG5dKTtcblxuaW50ZXJmYWNlIFRvb2xDb250ZXh0VmFsdWUge1xuICB0b29sOiBUb29sO1xuICBzZXRUb29sOiAodDogVG9vbCkgPT4gdm9pZDtcbiAgdG9vbHM6IHJlYWRvbmx5IFRvb2xEZXNjcmlwdG9yW107XG4gIC8qKiBUMTkg4oCUIHN0aWNreS10b29sIGRvdWJsZS1jbGljayBsb2NrLiBXaGVuIGBzdGlja3kubG9ja2VkID09PSB0cnVlYCBBTkRcbiAgICogIGBzdGlja3kudG9vbCA9PT0gdG9vbGAsIGRyYXcgdG9vbHMgc3RheSBhcm1lZCBhZnRlciBlYWNoIHNoYXBlIGNvbW1pdFxuICAgKiAgKFQxOCBhdXRvLWZsaXAgaXMgc3VwcHJlc3NlZCkuIFNpbmdsZS1jbGljayBvbiBhbnkgb3RoZXIgdG9vbCBjbGVhcnNcbiAgICogIHN0aWNreTsgRXNjIGNsZWFycyArIGZsaXBzIHRvIE1vdmUuICovXG4gIHN0aWNreTogeyB0b29sOiBUb29sIHwgbnVsbDsgbG9ja2VkOiBib29sZWFuIH07XG4gIHRvZ2dsZVN0aWNreTogKHQ6IFRvb2wpID0+IHZvaWQ7XG4gIGNsZWFyU3RpY2t5OiAoKSA9PiB2b2lkO1xuICAvKiogUGhhc2UgMjQg4oCUIHRoZSBwcmltaXRpdmUgdGhlIFNoYXBlIHRvb2wgd2lsbCBkcmF3IG5leHQuICovXG4gIHNoYXBlS2luZDogU2hhcGVLaW5kO1xuICBzZXRTaGFwZUtpbmQ6IChrOiBTaGFwZUtpbmQpID0+IHZvaWQ7XG59XG5cbmNvbnN0IFRvb2xDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxUb29sQ29udGV4dFZhbHVlIHwgbnVsbD4obnVsbCk7XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gUHJvdmlkZXJcblxuZXhwb3J0IGZ1bmN0aW9uIFRvb2xQcm92aWRlcih7XG4gIGNoaWxkcmVuLFxuICB0b29scyA9IERFRkFVTFRfVE9PTFMsXG4gIGluaXRpYWwgPSAnbW92ZScsXG59OiB7XG4gIGNoaWxkcmVuOiBSZWFjdE5vZGU7XG4gIHRvb2xzPzogcmVhZG9ubHkgVG9vbERlc2NyaXB0b3JbXTtcbiAgaW5pdGlhbD86IFRvb2w7XG59KSB7XG4gIGNvbnN0IFt0b29sLCBzZXRUb29sU3RhdGVdID0gdXNlU3RhdGU8VG9vbD4oaW5pdGlhbCk7XG4gIGNvbnN0IFtzdGlja3ksIHNldFN0aWNreV0gPSB1c2VTdGF0ZTx7IHRvb2w6IFRvb2wgfCBudWxsOyBsb2NrZWQ6IGJvb2xlYW4gfT4oKCkgPT4gKHtcbiAgICB0b29sOiBudWxsLFxuICAgIGxvY2tlZDogZmFsc2UsXG4gIH0pKTtcbiAgY29uc3Qgc2V0VG9vbCA9IHVzZUNhbGxiYWNrKCh0OiBUb29sKSA9PiB7XG4gICAgc2V0VG9vbFN0YXRlKHQpO1xuICAgIC8vIFNpbmdsZS1jbGljayBvbiBhIGRpZmZlcmVudCB0b29sIGNsZWFycyBhbnkgc3RpY2t5IGxvY2sg4oCUIHN0aWNreSBpc1xuICAgIC8vIGEgcGVyLXRvb2wgZmxhZywgbm90IGdsb2JhbC5cbiAgICBzZXRTdGlja3koKHByZXYpID0+IChwcmV2LmxvY2tlZCAmJiBwcmV2LnRvb2wgPT09IHQgPyBwcmV2IDogeyB0b29sOiBudWxsLCBsb2NrZWQ6IGZhbHNlIH0pKTtcbiAgfSwgW10pO1xuICBjb25zdCB0b2dnbGVTdGlja3kgPSB1c2VDYWxsYmFjaygodDogVG9vbCkgPT4ge1xuICAgIHNldFN0aWNreSgocHJldikgPT4ge1xuICAgICAgaWYgKHByZXYubG9ja2VkICYmIHByZXYudG9vbCA9PT0gdCkgcmV0dXJuIHsgdG9vbDogbnVsbCwgbG9ja2VkOiBmYWxzZSB9O1xuICAgICAgcmV0dXJuIHsgdG9vbDogdCwgbG9ja2VkOiB0cnVlIH07XG4gICAgfSk7XG4gICAgc2V0VG9vbFN0YXRlKHQpO1xuICB9LCBbXSk7XG4gIGNvbnN0IGNsZWFyU3RpY2t5ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldFN0aWNreSh7IHRvb2w6IG51bGwsIGxvY2tlZDogZmFsc2UgfSk7XG4gIH0sIFtdKTtcbiAgLy8gRmlnSmFtIHYzIOKAlCBzb2Z0IGRlZmF1bHQ6IGEgZnJlc2ggU2hhcGUgdG9vbCBkcmF3cyBST1VOREVEIHNxdWFyZXMgKHRoZVxuICAvLyBGaWdKYW0gbG9vayk7IHNoYXJwIHNxdWFyZXMgc3RheSBvbmUgcG9wb3ZlciBjbGljayBhd2F5LlxuICBjb25zdCBbc2hhcGVLaW5kLCBzZXRTaGFwZUtpbmRdID0gdXNlU3RhdGU8U2hhcGVLaW5kPigncm91bmRlZCcpO1xuXG4gIC8vIEN1cnNvciBzeW5jIOKAlCBhcHBsaWVkIGluc2lkZSB0aGUgY2FudmFzICh0aGlzIGhvb2sgcnVucyBpbiB0aGUgY2FudmFzXG4gIC8vIGNvbnRleHQpLiBUaGUgYWN0aXZlIHRvb2wncyBjdXJzb3IgaXMgc2V0IG9uIDxib2R5PiBBTkQgZm9yY2VkIGFjcm9zcyB0aGVcbiAgLy8gd2hvbGUgY2FudmFzIHdvcmtpbmcgYXJlYSB2aWEgYW4gYCFpbXBvcnRhbnRgIHJ1bGUsIHNvIHRoZSBjdXN0b20gY3Vyc29yXG4gIC8vIHNob3dzIEVWRVJZV0hFUkUg4oCUIGluY2x1ZGluZyBvdmVyIGFydGJvYXJkIENPTlRFTlQsIHdob3NlIG93biBgY3Vyc29yOlxuICAvLyBwb2ludGVyYC9gdGV4dGAv4oCmIHdvdWxkIG90aGVyd2lzZSB3aW4gKFBoYXNlIDI0LCB0aGUgXCJjdXN0b20gY3Vyc29ycyBpbiB0aGVcbiAgLy8gd2hvbGUgYXBwXCIgcmVxdWlyZW1lbnQ7IEZpZ0phbSBiZWhhdmlvdXIpLiBDaHJvbWUgdGhhdCBsaXZlcyBPVVRTSURFXG4gIC8vIGAuZGMtd29ybGRgICh0b29sIHBhbGV0dGUsIGNvbnRleHQgdG9vbGJhciwgcmVzaXplIGhhbmRsZXMpIGlzIGludGVudGlvbmFsbHlcbiAgLy8gTk9UIG1hdGNoZWQsIHNvIGl0cyBidXR0b25zL2hhbmRsZXMga2VlcCB0aGVpciBhZmZvcmRhbmNlIGN1cnNvcnMuIFRoZVxuICAvLyB2aWV3cG9ydC1jb250cm9sbGVyIHN0aWxsIG93bnMgdGhlIGdyYWIvZ3JhYmJpbmcgc3dhcCBkdXJpbmcgc3BhY2UtcGFuLlxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG4gICAgY29uc3QgZGVzYyA9IHRvb2xzLmZpbmQoKHQpID0+IHQuaWQgPT09IHRvb2wpO1xuICAgIGlmICghZGVzYykgcmV0dXJuO1xuICAgIGNvbnN0IHByZXYgPSBkb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvcjtcbiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvciA9IGRlc2MuY3Vyc29yO1xuICAgIGxldCBzdHlsZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RjLXRvb2wtY3Vyc29yJykgYXMgSFRNTFN0eWxlRWxlbWVudCB8IG51bGw7XG4gICAgaWYgKCFzdHlsZUVsKSB7XG4gICAgICBzdHlsZUVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgIHN0eWxlRWwuaWQgPSAnZGMtdG9vbC1jdXJzb3InO1xuICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZUVsKTtcbiAgICB9XG4gICAgLy8gVHJ1bHkgR0xPQkFMIGluc2lkZSB0aGUgY2FudmFzIGRvY3VtZW50IOKAlCBgKmAgc28gaXQgY292ZXJzIHRoZSBlbXB0eSBncmlkXG4gICAgLy8gaG9zdCwgYC5kYy13b3JsZGAsIGV2ZXJ5IGFydGJvYXJkICsgaXRzIGNvbnRlbnQsIEFORCB0aGUgZmxvYXRpbmcgY2hyb21lXG4gICAgLy8gKG1pbmltYXAsIHRvb2xiYXIpLiBUaGUgZWFybGllciBgLmRjLXdvcmxkYC1zY29wZWQgcnVsZSBsZWZ0IHRoZSBlbXB0eVxuICAgIC8vIGNhbnZhcyAvIG1pbmltYXAgb24gdGhlaXIgb3duIGN1cnNvcnM7IHRoZSBicmllZiBpcyBcInByb3N0xJsgdsWhdWRlXCIuIChNaXJyb3JzXG4gICAgLy8gdGhlIG91dGVyLXNoZWxsIGAqYCBydWxlIHNvIGJvdGggZG9jdW1lbnRzIGFyZSB1bmlmb3JtbHkgY292ZXJlZC4pXG4gICAgc3R5bGVFbC50ZXh0Q29udGVudCA9IGAqIHsgY3Vyc29yOiAke2Rlc2MuY3Vyc29yfSAhaW1wb3J0YW50OyB9YDtcbiAgICAvLyBQaGFzZSAyNCDigJQgYnJvYWRjYXN0IHRoZSBhY3RpdmUgdG9vbCBUT0tFTiB0byB0aGUgT1VURVIgYXBwIHNoZWxsICh0aGlzXG4gICAgLy8gaG9vayBydW5zIGluIHRoZSBjYW52YXMgaWZyYW1lKSBzbyB0aGUgc2hlbGwgc2hvd3MgdGhlIHNhbWUgY3VzdG9tIGN1cnNvclxuICAgIC8vIGFjcm9zcyB0aGUgd2hvbGUgbWF1ZGUgVUkgKHNpZGViYXIgLyB0b3AgYmFyKS4gV2Ugc2VuZCB0aGUgdG9vbCAqaWQqLCBOT1RcbiAgICAvLyB0aGUgY3Vyc29yIHN0cmluZzogdGhlIHNoZWxsIHJlc29sdmVzIGl0IGFnYWluc3QgaXRzIG93biB0cnVzdGVkXG4gICAgLy8gVE9PTF9DVVJTT1JTIGNvcHkgKHJlc29sdmVUb29sQ3Vyc29yKSwgc28gYW4gdW50cnVzdGVkIHN5bmNlZCBjYW52YXNcbiAgICAvLyAoRERSLTA1NCkgY2FuIG9ubHkgcGljayBhIGtub3duLCBhbHdheXMtdmlzaWJsZSBnbHlwaCDigJQgaXQgY2FuJ3QgaW5qZWN0IGFuXG4gICAgLy8gaW52aXNpYmxlL2Rpc3BsYWNlZCBjdXJzb3IgYXMgYSBjbGlja2phY2tpbmcgYWlkIChwaGFzZS0yNCBldGhpY2FsLWhhY2tlclxuICAgIC8vIEZpbmRpbmcgMjsgRERSLTA2NykuXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5wYXJlbnQgJiYgd2luZG93LnBhcmVudCAhPT0gd2luZG93KSB7XG4gICAgICB0cnkge1xuICAgICAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKHsgZGduOiAndG9vbC1jdXJzb3InLCB0b29sIH0sICcqJyk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogY3Jvc3Mtb3JpZ2luIHBhcmVudCByZWplY3RlZCDigJQgc2hlbGwga2VlcHMgaXRzIGRlZmF1bHQgY3Vyc29yICovXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvciA9IHByZXY7XG4gICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYy10b29sLWN1cnNvcicpO1xuICAgICAgaWYgKGVsKSBlbC50ZXh0Q29udGVudCA9ICcnO1xuICAgIH07XG4gIH0sIFt0b29sLCB0b29sc10pO1xuXG4gIGNvbnN0IHZhbHVlID0gdXNlTWVtbzxUb29sQ29udGV4dFZhbHVlPihcbiAgICAoKSA9PiAoeyB0b29sLCBzZXRUb29sLCB0b29scywgc3RpY2t5LCB0b2dnbGVTdGlja3ksIGNsZWFyU3RpY2t5LCBzaGFwZUtpbmQsIHNldFNoYXBlS2luZCB9KSxcbiAgICBbdG9vbCwgc2V0VG9vbCwgdG9vbHMsIHN0aWNreSwgdG9nZ2xlU3RpY2t5LCBjbGVhclN0aWNreSwgc2hhcGVLaW5kXVxuICApO1xuXG4gIHJldHVybiA8VG9vbENvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3ZhbHVlfT57Y2hpbGRyZW59PC9Ub29sQ29udGV4dC5Qcm92aWRlcj47XG59XG5cbi8qKlxuICogTW91bnQgYSBgVG9vbFByb3ZpZGVyYCBvbmx5IHdoZW4gbm9uZSBleGlzdHMgYWJvdmUgdXMuIFdoZW4gdGhlIHNoZWxsLW93bmVkXG4gKiBjb21tZW50IG1vdW50IGxheWVyIChjYW52YXMtY29tbWVudC1tb3VudC50c3gpIGFscmVhZHkgcHJvdmlkZXMgb25lLFxuICogYERlc2lnbkNhbnZhc2AgY29uc3VtZXMgdGhhdCBpbnN0YW5jZSBpbnN0ZWFkIG9mIGRvdWJsZS1tb3VudGluZy4gVGhlIGhvb2tcbiAqIGlzIGNhbGxlZCB1bmNvbmRpdGlvbmFsbHk7IG9ubHkgdGhlIHJldHVybmVkIHRyZWUgYnJhbmNoZXMgKGhvb2sgcnVsZXMpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gTWF5YmVUb29sUHJvdmlkZXIoeyBjaGlsZHJlbiB9OiB7IGNoaWxkcmVuOiBSZWFjdE5vZGUgfSkge1xuICBjb25zdCBvdXRlciA9IHVzZUNvbnRleHQoVG9vbENvbnRleHQpO1xuICBpZiAob3V0ZXIpIHJldHVybiA8PntjaGlsZHJlbn08Lz47XG4gIHJldHVybiA8VG9vbFByb3ZpZGVyPntjaGlsZHJlbn08L1Rvb2xQcm92aWRlcj47XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gSG9va1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlVG9vbE1vZGUoKTogVG9vbENvbnRleHRWYWx1ZSB7XG4gIGNvbnN0IGN0eCA9IHVzZUNvbnRleHQoVG9vbENvbnRleHQpO1xuICBpZiAoIWN0eCkge1xuICAgIHRocm93IG5ldyBFcnJvcigndXNlVG9vbE1vZGUgbXVzdCBiZSB1c2VkIGluc2lkZSA8VG9vbFByb3ZpZGVyPicpO1xuICB9XG4gIHJldHVybiBjdHg7XG59XG5cbi8qKlxuICogUmVhZC1vbmx5IHZhcmlhbnQg4oCUIHJldHVybnMgYG51bGxgIHdoZW4gbm8gcHJvdmlkZXIgbW91bnRlZC4gVXNlZCBieVxuICogY29tcG9uZW50cyB0aGF0IGNhbiByZW5kZXIgb3V0c2lkZSBhIFRvb2xQcm92aWRlciB0cmVlICh0aGUgaW5wdXRcbiAqIHJvdXRlcidzIG9wdGlvbmFsIHBhdGgpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlVG9vbE1vZGVPcHRpb25hbCgpOiBUb29sQ29udGV4dFZhbHVlIHwgbnVsbCB7XG4gIHJldHVybiB1c2VDb250ZXh0KFRvb2xDb250ZXh0KTtcbn1cbiIsCiAgICAiLyoqXG4gKiBAZmlsZSAgICAgICBjYW52YXMtY3Vyc29ycy50cyDigJQgUGhhc2UgMjQgY3VzdG9tIHRvb2wgY3Vyc29ycyAoS2VubmV5IENDMClcbiAqIEBzY29wZSAgICAgIGFwcHMvc3R1ZGlvL2NhbnZhcy1jdXJzb3JzLnRzXG4gKiBAcHVycG9zZSAgICBGaWdKYW0vRmlnbWEtc3R5bGUgY3VzdG9tIGN1cnNvcnMgZm9yIEVWRVJZIGNhbnZhcyB0b29sLiBUaGVcbiAqICAgICAgICAgICAgIG5hdGl2ZSBjcm9zc2hhaXIgLyB0ZXh0IC8gYXJyb3cgY3Vyc29ycyBhcmUgdGlueSArIHRoaW4gYW5kXG4gKiAgICAgICAgICAgICB2YW5pc2ggb24gYnVzeSBjYW52YXNlczsgdGhlc2UgYXJlIDMyw5czMiBTVkcgY3Vyc29ycyB0aGF0IHJlYWQgb25cbiAqICAgICAgICAgICAgIGFueSBiYWNrZ3JvdW5kLlxuICpcbiAqICAgICAgICAgICAgIFBoYXNlIDI0IOKAlCBBTEwgdG9vbHMgZHJhdyBmcm9tIE9ORSBsaWJyYXJ5LCB0aGUgKipLZW5uZXkgQ3Vyc29yXG4gKiAgICAgICAgICAgICBQYWNrICgxLjEpKiogXCJPdXRsaW5lXCIgc2V0LCB3aGljaCBpcyAqKkNDMCAvIHB1YmxpYyBkb21haW4qKlxuICogICAgICAgICAgICAgKGh0dHBzOi8va2VubmV5Lm5sL2Fzc2V0cy9jdXJzb3ItcGFjayDigJQgbm8gYXR0cmlidXRpb24gcmVxdWlyZWQsXG4gKiAgICAgICAgICAgICByZWRpc3RyaWJ1dGFibGUgaW5zaWRlIHRoaXMgTUlUIHBhY2thZ2UgKyBtYXJrZXRwbGFjZSBjbG9uZSkuIFNlZVxuICogICAgICAgICAgICAgRERSLTA2NyBmb3IgdGhlIGxpY2VuY2UgZ2F0ZSAoQmliYXRhIEdQTC0zLjAgd2FzIHJlamVjdGVkIGFzXG4gKiAgICAgICAgICAgICBjb3B5bGVmdCkuIE9uZSBsaWJyYXJ5ID0gb25lIHZpc3VhbCBpZGVudGl0eSBhY3Jvc3MgbW92ZSAvIGhhbmQgL1xuICogICAgICAgICAgICAgY29tbWVudCAvIHBlbiAvIHNoYXBlIC8gc3RpY2t5IC8gdGV4dCAvIGVyYXNlci4gVGhlIGdseXBoIHBhdGhzXG4gKiAgICAgICAgICAgICBhcmUgS2VubmV5J3M7IHdlIFJFQ09MT1VSIHRoZW0gKHNlZSBga2VubmV5KClgKSB0byBhIGRhcmstZ2x5cGggK1xuICogICAgICAgICAgICAgd2hpdGUtaGFsbyB0cmVhdG1lbnQgc28gdGhleSByZWFkIGNyaXNwbHkgb24gbGlnaHQgQU5EIGRhcmtcbiAqICAgICAgICAgICAgIGNhbnZhc2VzLiBQZXItdG9vbCBnbHlwaCBtYXA6XG4gKiAgICAgICAgICAgICAgIG1vdmXihpJwb2ludGVyX2EgwrcgaGFuZOKGkmhhbmRfb3BlbiDCtyBjb21tZW504oaSbWVzc2FnZV9kb3RzX3NxdWFyZSDCt1xuICogICAgICAgICAgICAgICBwZW7ihpJkcmF3aW5nX3BlbmNpbCDCtyBzaGFwZeKGkmxpbmVfY3Jvc3MgwrcgZXJhc2Vy4oaSZHJhd2luZ19lcmFzZXIuXG4gKiAgICAgICAgICAgICB0ZXh0IChJLWJlYW0pICsgc3RpY2t5IChmb2xkZWQtY29ybmVyIG5vdGUpIGhhdmUgbm8gY2xlYW4gS2VubmV5XG4gKiAgICAgICAgICAgICBlcXVpdmFsZW50LCBzbyB0aGV5IGFyZSBBVVRIT1JFRCBpbiB0aGUgaWRlbnRpY2FsIGRhcmstZ2x5cGggK1xuICogICAgICAgICAgICAgd2hpdGUtaGFsbyB0cmVhdG1lbnQgdG8ga2VlcCBvbmUgdmlzdWFsIGlkZW50aXR5LlxuICpcbiAqICAgICAgICAgICAgIERlbGl2ZXJlZCBhcyBDU1MgYGN1cnNvcjogdXJsKFwiZGF0YTppbWFnZS9zdmcreG1sLOKAplwiKSBoeCBoeSwgZmJgXG4gKiAgICAgICAgICAgICDigJQgbm8gcnVudGltZSBkZXBlbmRlbmN5LCBubyBhc3NldCBmaWxlcy4gMzLDlzMyIGlzIHRoZVxuICogICAgICAgICAgICAgY3Jvc3MtYnJvd3Nlci1zYWZlIGNlaWxpbmc7IChoeCwgaHkpIGlzIHRoZSBjbGljayBob3RzcG90LlxuICovXG5cbmltcG9ydCB0eXBlIHsgVG9vbCB9IGZyb20gJy4vaW5wdXQtcm91dGVyLnRzeCc7XG5cbi8qKiBCdWlsZCBhIENTUyBjdXJzb3IgdmFsdWUgZnJvbSBhbiBpbmxpbmUgU1ZHICsgaG90c3BvdCArIG5hdGl2ZSBmYWxsYmFjay4gKi9cbmZ1bmN0aW9uIHN2Z0N1cnNvcihzdmc6IHN0cmluZywgaHg6IG51bWJlciwgaHk6IG51bWJlciwgZmFsbGJhY2s6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIGVuY29kZVVSSUNvbXBvbmVudCBpcyB0aGUgc2FmZXN0IGVzY2FwaW5nIGZvciBhIGRhdGE6IFVSSSBpbnNpZGUgdXJsKFwi4oCmXCIpLlxuICByZXR1cm4gYHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwke2VuY29kZVVSSUNvbXBvbmVudChzdmcudHJpbSgpKX1cIikgJHtoeH0gJHtoeX0sICR7ZmFsbGJhY2t9YDtcbn1cblxuLy8gUGhhc2UgMjQg4oCUIDI0cHggcmVuZGVyZWQgYm94IChkb3duIGZyb20gMzIpIHNvIGN1cnNvcnMgYXJlbid0IG92ZXJzaXplZDsgdGhlXG4vLyBnbHlwaCBjb29yZHMgc3RheSBpbiB0aGUgMzItdW5pdCB2aWV3Qm94IGFuZCBzY2FsZSBpbnRvIDI0cHguIEhvdHNwb3RzIGFyZVxuLy8gc2NhbGVkIHRvIG1hdGNoIChzZWUgdGhlIGdlbmVyYXRvcikuXG5jb25zdCBXID0gYHdpZHRoPScyNCcgaGVpZ2h0PScyNCcgdmlld0JveD0nMCAwIDMyIDMyJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnYDtcbmNvbnN0IElOSyA9ICcjMWYxZjFmJztcbmNvbnN0IEhBTE8gPSBcInN0cm9rZT0nI2ZmZmZmZicgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCcgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJ1wiO1xuXG4vLyBLZW5uZXkgQ0MwIGdseXBoLCByZWNvbG91cmVkIHRvIGEgRmlnSmFtLXN0eWxlICoqZGFyayBnbHlwaCArIHdoaXRlIGhhbG8qKjpcbi8vIEtlbm5leSdzIG91dGxpbmUgYmFuZCAoYGJgKSBpcyBwYWludGVkIFdISVRFICh0aGUgaGFsbykgYW5kIGl0cyBpbm5lciBmaWxsXG4vLyAoYHdgKSBpcyBwYWludGVkIGRhcmsgSU5LLiBSZWFkcyBjcmlzcGx5IG9uIGEgTElHSFQgY2FudmFzIChzb2xpZCBkYXJrIGdseXBoKVxuLy8gQU5EIGEgZGFyayBvbmUgKHdoaXRlIGhhbG8gZWRnZSkuXG5mdW5jdGlvbiBrZW5uZXkoYjogc3RyaW5nLCB3OiBzdHJpbmcsIHRyYW5zZm9ybT86IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIE9wdGlvbmFsIGA8ZyB0cmFuc2Zvcm0+YCBmb3IgdGhlIGRyYXdpbmcgdG9vbHMgd2hvc2UgS2VubmV5IGdseXBoIG5lZWRzXG4gIC8vIHJlLW9yaWVudGluZyBzbyB0aGUgd3JpdGluZyB0aXAgbGFuZHMgYXQgdGhlIGhvdHNwb3QgKHVzZXIgc3RlZXJcbiAgLy8gMjAyNi0wNi0wNDogcGVuIC8gaGlnaGxpZ2h0ZXIgXCJrcmVzbMOtIHBvZCBrb25jZW0sIG5lIG5hIMWhcGnEjWNlXCIg4oaSIGZsaXBwZWQgc29cbiAgLy8gdGhlIG5pYiBwb2ludHMgZG93bi1MRUZULCB0b3AtcmlnaHTihpJib3R0b20tbGVmdCkuXG4gIGNvbnN0IG9wZW4gPSB0cmFuc2Zvcm0gPyBgPGcgdHJhbnNmb3JtPScke3RyYW5zZm9ybX0nPmAgOiAnJztcbiAgY29uc3QgY2xvc2UgPSB0cmFuc2Zvcm0gPyAnPC9nPicgOiAnJztcbiAgcmV0dXJuIGA8c3ZnICR7V30+JHtvcGVufTxwYXRoIGZpbGw9JyNmZmZmZmYnIGQ9JyR7Yn0nLz48cGF0aCBmaWxsPScke0lOS30nIGQ9JyR7d30nLz4ke2Nsb3NlfTwvc3ZnPmA7XG59XG5cbi8vIFZlcnRpY2FsIG1pcnJvciBhYm91dCB0aGUgMzItdmlld0JveCBob3Jpem9udGFsIGNlbnRyZTogKHgseSkg4oaSICh4LCAzMuKIknkpLlxuLy8gQXBwbGllZCB0byBwZW4vaGlnaGxpZ2h0ZXIgc28gdGhlIGdseXBoIGxpZXMgYWxvbmcgdGhlIHRvcC1yaWdodOKGkmJvdHRvbS1sZWZ0XG4vLyBkaWFnb25hbCB3aXRoIHRoZSBuaWIgYXQgYm90dG9tLWxlZnQuXG5jb25zdCBGTElQX1YgPSAndHJhbnNsYXRlKDAsMzIpIHNjYWxlKDEsLTEpJztcblxuLy8gbW92ZSDihpIgS2VubmV5IGBwb2ludGVyX2JgICh1c2VyIHN0ZWVyIDIwMjYtMDYtMDQg4oCUIHRoZSBwbGFpbiB2YXJpYW50LCBub3QgdGhlXG4vLyBzaGFkZWQgb25lKS4gSG90c3BvdCBhdCB0aGUgYXJyb3cgdGlwICh0b3ApLlxuY29uc3QgTU9WRSA9IHN2Z0N1cnNvcihcbiAga2VubmV5KFxuICAgICdNMTAuMjUgOC4yNSBMMTAuMDUgOC42NSAxMCA5IDEwIDIzLjEgMTAuMDUgMjMuNCAxMC4yNSAyMy43NSAxMC44IDI0IDExLjQ1IDIzLjg1IDExLjYgMjMuNyAxMS43NSAyMy40NSAxNC42NSAxOS44IDE0Ljg1IDE5LjY1IDE0Ljk1IDE5LjUgMTUuNCAxOS4yIDE1Ljk1IDE5LjEgMjEuMDUgMTkuMSAyMS4yIDE5LjEgMjEuMzUgMTkuMDUgMjEuNjUgMTguOSAyMS45IDE4LjYgMjIgMTguMyAyMiAxNy45IDIxLjkgMTcuNjUgMjEuNzUgMTcuMzUgMjEuNjUgMTcuMyAyMS41NSAxNy4xNSAxMS41IDguMjUgMTEuMjUgOC4wNSAxMC45NSA4IDEwLjYgOC4wNSAxMC4yNSA4LjI1IE05LjE1IDYuNiBMOS43IDYuMjUgMTAgNi4xNSAxMC45NSA2IDExLjkgNi4xNSAxMyA2LjkgMjIuOSAxNS42NSAyMyAxNS44IDIzLjIgMTUuOTUgMjMuNzUgMTYuNzUgMjQgMTcuOSAyNCAxOC4zIDIzLjkgMTguOTUgMjMuOCAxOS4yNSAyMy42IDE5LjcgMjMuMSAyMC4zNSAyMi43NSAyMC42IDIyLjEgMjAuOSAyMi4wNSAyMC45NSAyMiAyMC45NSAyMS4yIDIxLjEgMjEuMDUgMjEuMSAxNi4yIDIxLjEgMTYuMSAyMS4yNSAxNi4wNSAyMS4yNSAxMy40IDI0LjYgMTMuMDUgMjUuMTUgMTIuOSAyNS4zIDEyLjU1IDI1LjU1IFExMS42IDI2LjE1IDEwLjU1IDI2IEwxMC41IDI2IFE5LjY1IDI1Ljg1IDkgMjUuMyBMOC40NSAyNC42NSA4LjQgMjQuNSA4LjE1IDI0LjA1IDggMjMuMSA4IDkgUTggOC40NSA4LjE1IDguMDUgTDguMjUgNy43NSA4LjQ1IDcuMzUgOS4xNSA2LjYnLFxuICAgICdNMTAuMjUgOC4yNSBMMTAuNiA4LjA1IDEwLjk1IDggMTEuMjUgOC4wNSAxMS41IDguMjUgMjEuNTUgMTcuMTUgMjEuNjUgMTcuMyAyMS43NSAxNy4zNSAyMS45IDE3LjY1IDIyIDE3LjkgMjIgMTguMyAyMS45IDE4LjYgMjEuNjUgMTguOSAyMS4zNSAxOS4wNSAyMS4yIDE5LjEgMjEuMDUgMTkuMSAxNS45NSAxOS4xIDE1LjQgMTkuMiAxNC45NSAxOS41IDE0Ljg1IDE5LjY1IDE0LjY1IDE5LjggMTEuNzUgMjMuNDUgMTEuNiAyMy43IDExLjQ1IDIzLjg1IDEwLjggMjQgMTAuMjUgMjMuNzUgMTAuMDUgMjMuNCAxMCAyMy4xIDEwIDkgMTAuMDUgOC42NSAxMC4yNSA4LjI1J1xuICApLFxuICA4LFxuICA1LFxuICAnZGVmYXVsdCdcbik7XG5jb25zdCBIQU5EID0gc3ZnQ3Vyc29yKFxuICBrZW5uZXkoXG4gICAgJ00yOC41NSAxNy44IFEyOS40IDIwLjMgMjguNzUgMjIuOCBMMjguNyAyMyAyOC4xNSAyNC41NSAyOC4wNSAyNC43NSBRMjYuNCAyOC4yIDIyLjc1IDI5LjQgTDIyLjQ1IDI5LjUgMTggMjkuOSAxNy43NSAyOS44NSBRMTUuOCAyOS4yNSAxMy44IDI4LjEgTDEzLjQ1IDI3Ljk1IFExMiAyNy4wNSAxMC4zNSAyNi44IEwxMC4yNSAyNi43NSA3LjkgMjYuNyA3LjggMjYuNyBRNi4xIDI2LjkgNC44IDI1LjggTDQuNzUgMjUuOCA0LjY1IDI1LjcgNC42IDI1LjY1IFEzLjI1IDI0LjUgMy4wNSAyMi44NSBMMyAyMi43NSBRMi44IDIwLjk1IDQgMTkuNSA1LjA1IDE4LjE1IDYuNzUgMTcuOTUgTDguNCAxNy45IDcuNSAxNS41NSA3LjMgMTUuMiA3LjIgMTUgNSAxMC45NSBRMy45IDkuMTUgNC4zIDcuNzUgTDQuNCA3LjUgUTQuNzUgNi4xNSA2LjQ1IDUuMiA5IDMuNjUgMTEgNSAxMS4wNSA0LjEgMTEuNSAzLjQ1IDEyLjE1IDIuMSAxNC4yIDEuNiBMMTQuMzUgMS42IFExOC4wNSAwLjYgMTkuNiA0LjQgTDE5LjY1IDQuNTUgUTIwLjc1IDMuNjUgMjIuNyAzLjc1IEwyMi43NSAzLjc1IFEyNi43NSA0IDI3IDguMTUgTDI3IDguMjUgMjcgOC4zNSAyNyA4LjQ1IFEyNi45IDEwLjc1IDI3LjEgMTIuNiAyNy4xNSAxNC42NSAyOC4yIDE2Ljc1IEwyOC41NSAxNy44IE0yNi42NSAxOC40IEwyNi4xIDE2LjggMjYuMSAxNi44NSBRMjQuOCAxMy43IDI1IDguMzUgTDI1IDguMjUgUTI0Ljg1IDUuOSAyMi42IDUuNzUgMjAuNyA1LjY1IDIwLjQgNy4zNSBMMjAuMSA3Ljk1IDE5LjUgOC4yIDE4Ljg1IDguMDUgMTguNDUgNy41IDE3Ljc1IDUuMTUgUTE2Ljg1IDIuOTUgMTQuNyAzLjU1IEwxNC42NSAzLjU1IFExMi41NSA0LjA1IDEzLjE1IDYuMTUgTDEzLjg1IDguNzUgMTMuNzUgOS40NSAxMy4yNSA5Ljk1IDEyLjU1IDkuOTUgMTIgOS41NSAxMC45IDcuNyBROS41IDUuNyA3LjQ1IDYuOSA2LjUgNy40NSA2LjI1IDguMTUgNi4xIDguOSA2LjcgOS44NSA5LjIgMTMuOSAxMC44IDE4LjY1IEwxMC44IDE5LjMgMTAuNCAxOS44IDkuNzUgMTkuOTUgUTguMzUgMTkuOCA2Ljk1IDE5Ljk1IDYuMSAyMC4wNSA1LjU1IDIwLjc1IDQuOSAyMS41NSA1IDIyLjU1IDUuMTUgMjMuNTUgNiAyNC4yIEw2LjA1IDI0LjI1IFE2Ljc1IDI0Ljg1IDcuNjUgMjQuNyBMNy43IDI0LjcgMTAuNjUgMjQuOCBRMTIuNyAyNS4xNSAxNC40NSAyNi4yIEwxNC41IDI2LjIgUTE2LjQgMjcuMzUgMTguMyAyNy45IEwyMi4wNSAyNy41IDIyLjEgMjcuNSBRMjQuOTUgMjYuNTUgMjYuMjUgMjMuODUgTDI2LjggMjIuMyBRMjcuMyAyMC4zNSAyNi42NSAxOC40JyxcbiAgICAnTTI2LjY1IDE4LjQgUTI3LjMgMjAuMzUgMjYuOCAyMi4zIEwyNi4yNSAyMy44NSBRMjQuOTUgMjYuNTUgMjIuMSAyNy41IEwyMi4wNSAyNy41IDE4LjMgMjcuOSBRMTYuNCAyNy4zNSAxNC41IDI2LjIgTDE0LjQ1IDI2LjIgUTEyLjcgMjUuMTUgMTAuNjUgMjQuOCBMNy43IDI0LjcgNy42NSAyNC43IFE2Ljc1IDI0Ljg1IDYuMDUgMjQuMjUgTDYgMjQuMiBRNS4xNSAyMy41NSA1IDIyLjU1IDQuOSAyMS41NSA1LjU1IDIwLjc1IDYuMSAyMC4wNSA2Ljk1IDE5Ljk1IDguMzUgMTkuOCA5Ljc1IDE5Ljk1IEwxMC40IDE5LjggMTAuOCAxOS4zIDEwLjggMTguNjUgUTkuMiAxMy45IDYuNyA5Ljg1IDYuMSA4LjkgNi4yNSA4LjE1IDYuNSA3LjQ1IDcuNDUgNi45IDkuNSA1LjcgMTAuOSA3LjcgTDEyIDkuNTUgMTIuNTUgOS45NSAxMy4yNSA5Ljk1IDEzLjc1IDkuNDUgMTMuODUgOC43NSAxMy4xNSA2LjE1IFExMi41NSA0LjA1IDE0LjY1IDMuNTUgTDE0LjcgMy41NSBRMTYuODUgMi45NSAxNy43NSA1LjE1IEwxOC40NSA3LjUgMTguODUgOC4wNSAxOS41IDguMiAyMC4xIDcuOTUgMjAuNCA3LjM1IFEyMC43IDUuNjUgMjIuNiA1Ljc1IDI0Ljg1IDUuOSAyNSA4LjI1IEwyNSA4LjM1IFEyNC44IDEzLjcgMjYuMSAxNi44NSBMMjYuMSAxNi44IDI2LjY1IDE4LjQnXG4gICksXG4gIDEyLFxuICAxMixcbiAgJ2dyYWInXG4pO1xuLy8gY29tbWVudCDihpIgS2VubmV5IGBtZXNzYWdlX3JvdW5kYCAodXNlciBzdGVlciAyMDI2LTA2LTA0KS4gSG90c3BvdCBhdCB0aGVcbi8vIHRhaWwgdGlwIChib3R0b20tY2VudHJlKSwgd2hlcmUgdGhlIGNvbW1lbnQgcGluIGlzIGRyb3BwZWQuXG5jb25zdCBDT01NRU5UID0gc3ZnQ3Vyc29yKFxuICBrZW5uZXkoXG4gICAgJ00yOCAxNCBRMjggOS44NSAyNC40NSA2LjkgMjAuOTUgNCAxNiA0IDExLjA1IDQgNy41IDYuOSBMNy40NSA3IFE0IDkuOSA0IDE0IDQgMTguMTUgNy41NSAyMS4wNSBMNy41IDIxLjA1IFE5LjIgMjIuNDUgMTEuMiAyMy4yIEwxNS4zIDI3LjMgMTYgMjcuNiAxNi43IDI3LjMgMjAuODUgMjMuMiBRMjIuNyAyMi40NSAyNC4zIDIxLjE1IEwyNC40NSAyMS4wNSBRMjggMTguMTUgMjggMTQgTTI1Ljc1IDUuMzUgUTMwLjA1IDguOTUgMzAgMTQgMzAuMDUgMTkuMDUgMjUuNzUgMjIuNiBMMjUuNCAyMi44NSBRMjMuOCAyNC4xIDIyIDI0LjkgTDE4LjEgMjguNzUgMTguMTUgMjguNzUgUTE3LjIgMjkuNiAxNiAyOS42IDE0LjggMjkuNiAxMy44NSAyOC43NSBMMTMuOSAyOC43NSAxMCAyNC45IDYuNiAyMi44NSA2LjI1IDIyLjYgUTEuOTUgMTkuMDUgMiAxNCAxLjk1IDguOTUgNi4yNSA1LjM1IDEwLjMgMiAxNiAyIDIxLjcgMiAyNS43NSA1LjM1JyxcbiAgICAnTTI4IDE0IFEyOCAxOC4xNSAyNC40NSAyMS4wNSBMMjQuMyAyMS4xNSBRMjIuNyAyMi40NSAyMC44NSAyMy4yIEwxNi43IDI3LjMgMTYgMjcuNiAxNS4zIDI3LjMgMTEuMiAyMy4yIFE5LjIgMjIuNDUgNy41IDIxLjA1IEw3LjU1IDIxLjA1IFE0IDE4LjE1IDQgMTQgNCA5LjkgNy40NSA3IEw3LjUgNi45IFExMS4wNSA0IDE2IDQgMjAuOTUgNCAyNC40NSA2LjkgMjggOS44NSAyOCAxNCdcbiAgKSxcbiAgMTIsXG4gIDIxLFxuICAnY3Jvc3NoYWlyJ1xuKTtcbi8vIHBlbiDihpIgS2VubmV5IGBkcmF3aW5nX3BlbmAsIG1pcnJvcmVkIHZlcnRpY2FsbHkgKEZMSVBfVikgc28gdGhlIG5pYiBwb2ludHNcbi8vIGRvd24tTEVGVCAodG9wLXJpZ2h04oaSYm90dG9tLWxlZnQgZGlhZ29uYWwpLiBTb3VyY2UgZ3JhZGllbnQtc2hhZGUgcGF0aCBkcm9wcGVkLlxuLy8gSG90c3BvdCBhdCB0aGUgbmliLCBib3R0b20tbGVmdC5cbmNvbnN0IFBFTiA9IHN2Z0N1cnNvcihcbiAga2VubmV5KFxuICAgICdNNCAxMy4xIEw0IDYgUTQgNS4xNSA0LjYgNC42IDUuMTUgNCA2IDQgTDEzLjEgNCBRMTMuOTUgNCAxNC41NSA0LjYgTDI4LjY1IDE4Ljc1IFEyOS44IDE5LjkgMjkuNzUgMjEuNDUgTDI5Ljc1IDIxLjYgMjkuNzUgMjEuNyBRMjkuNzUgMjMuMiAyOC43IDI0LjM1IEwyNC40NSAyOC42NSAyNC4zNSAyOC43NSBRMjMuMTUgMjkuODUgMjEuNjUgMjkuOCBMMjEuNTUgMjkuOCAyMS40IDI5LjggUTIwLjIgMjkuOCAxOS4yNSAyOS4xNSBMMTggMjkuMzUgUTE2LjYgMjkuNCAxNS4yNSAyOCBMMTUuMiAyNy45NSA4LjIgMjAuOTUgUTcuNiAyMC4zNSA3LjYgMTkuNTUgNy42IDE4LjcgOC4yIDE4LjEgTDQuNiAxNC41IFE0IDEzLjkgNCAxMy4xIE0xOS41IDI2LjY1IEwyMC4xIDI3LjI1IFEyMC43IDI3Ljg1IDIxLjUgMjcuOCAyMi4zNSAyNy44NSAyMyAyNy4yNSBMMjcuMjUgMjIuOTUgUTI3LjggMjIuMzUgMjcuNzUgMjEuNTUgMjcuOCAyMC43NSAyNy4yIDIwLjE1IEwxMy4xIDYgNiA2IDYgMTMuMSAxMi4zNSAxOS40NSA5LjYgMTkuNSAxNi42NSAyNi41NSBRMTguMDUgMjguMDUgMTkuNSAyNi42NSBNOC4wNSAxMi4zIEw4IDggMTIuMjUgOC4wNSAxMy44IDkuNiA5LjYgMTMuODUgOC4wNSAxMi4zIE0xNS4yNSAxMS4wNSBMMjMgMTguOCAxOC44IDIzLjA1IDExLjA1IDE1LjMgMTUuMjUgMTEuMDUnLFxuICAgICdNMTUuMjUgMTEuMDUgTDExLjA1IDE1LjMgMTguOCAyMy4wNSAyMyAxOC44IDE1LjI1IDExLjA1IE0xMi4zNSAxOS40NSBMNiAxMy4xIDYgNiAxMy4xIDYgMjcuMiAyMC4xNSBRMjcuOCAyMC43NSAyNy43NSAyMS41NSAyNy44IDIyLjM1IDI3LjI1IDIyLjk1IEwyMyAyNy4yNSBRMjIuMzUgMjcuODUgMjEuNSAyNy44IDIwLjcgMjcuODUgMjAuMSAyNy4yNSBMMTkuNSAyNi42NSAxMi4zNSAxOS40NSBNOC4wNSAxMi4zIEw5LjYgMTMuODUgMTMuOCA5LjYgMTIuMjUgOC4wNSA4IDggOC4wNSAxMi4zJyxcbiAgICBGTElQX1ZcbiAgKSxcbiAgNixcbiAgMTgsXG4gICdjcm9zc2hhaXInXG4pO1xuLy8gaGlnaGxpZ2h0ZXIg4oaSIEtlbm5leSBgZHJhd2luZ19wZW5jaWxgLCBhbHNvIG1pcnJvcmVkIHZlcnRpY2FsbHkgKGRpc3RpbmN0IGZyb21cbi8vIHRoZSBwZW4gZ2x5cGgpLiBIb3RzcG90IGF0IHRoZSBsZWFkIHRpcCwgYm90dG9tLWxlZnQuXG5jb25zdCBISUdITElHSFRFUiA9IHN2Z0N1cnNvcihcbiAga2VubmV5KFxuICAgICdNNS4xNSAxMC44NSBRNCA5LjY1IDQgOC4xIEw0IDcuOTUgNCA3Ljg1IFEzLjk1IDYuMiA1LjEgNS4xNSA2LjI1IDQgNy44NSA0IEw3Ljk1IDQgOC4xIDQgUTkuNjUgNCAxMC44NSA1LjE1IEwxMSA1LjMgMTQuMyA1LjI1IFExNS4xNSA1LjI1IDE1Ljc1IDUuODUgTDI5LjkgMjAgUTMxIDIxLjE1IDMxIDIyLjc1IEwzMSAyMi44NSAzMSAyMyBRMzEuMDUgMjQuNSAyOS45IDI1LjcgTDI5LjU1IDI1Ljk1IDI1LjY1IDI5LjkgMjUuNjUgMjkuOTUgUTI0LjQ1IDMxLjEgMjIuNzUgMzEuMSAyMS4yIDMxLjE1IDIwIDI5Ljk1IEw1Ljg1IDE1LjggUTUuMjUgMTUuMiA1LjI1IDE0LjM1IEw1LjI1IDEwLjk1IDUuMTUgMTAuODUgTTE5Ljk1IDI0LjIgTDE4LjU1IDIyLjggMjIuOCAxOC41NSAyNC4yIDE5Ljk1IDE5Ljk1IDI0LjIgTTI4LjQ1IDIxLjQgTDE0LjMgNy4yNSAxMC4xNSA3LjMgOS40IDYuNTUgUTguOCA1Ljk1IDcuOTUgNiA3LjEgNS45NSA2LjUgNi41NSA1Ljk1IDcuMSA2IDcuOTUgNS45NSA4LjggNi41NSA5LjQgTDcuMjUgMTAuMSA3LjI1IDE0LjM1IDIxLjQgMjguNSBRMjIgMjkuMSAyMi43NSAyOS4xIDIzLjYgMjkuMSAyNC4yIDI4LjUgTDI4LjQ1IDI0LjI1IFEyOS4wNSAyMy42NSAyOSAyMi44NSAyOS4wNSAyMiAyOC40NSAyMS40IE05LjI1IDEzLjUgTDkuMjUgOS4zIDEzLjUgOS4yNSAxNC4zIDEwLjA1IDEwLjA1IDE0LjMgOS4yNSAxMy41IE0xNy4xNSAyMS40IEwxMS41IDE1Ljc1IDE1Ljc1IDExLjUgMjEuNCAxNy4xNSAxNy4xNSAyMS40JyxcbiAgICAnTTE3LjE1IDIxLjQgTDIxLjQgMTcuMTUgMTUuNzUgMTEuNSAxMS41IDE1Ljc1IDE3LjE1IDIxLjQgTTI4LjQ1IDIxLjQgUTI5LjA1IDIyIDI5IDIyLjg1IDI5LjA1IDIzLjY1IDI4LjQ1IDI0LjI1IEwyNC4yIDI4LjUgUTIzLjYgMjkuMSAyMi43NSAyOS4xIDIyIDI5LjEgMjEuNCAyOC41IEw3LjI1IDE0LjM1IDcuMjUgMTAuMSA2LjU1IDkuNCBRNS45NSA4LjggNiA3Ljk1IDUuOTUgNy4xIDYuNSA2LjU1IDcuMSA1Ljk1IDcuOTUgNiA4LjggNS45NSA5LjQgNi41NSBMMTAuMTUgNy4zIDE0LjMgNy4yNSAyOC40NSAyMS40IE0xOS45NSAyNC4yIEwyNC4yIDE5Ljk1IDIyLjggMTguNTUgMTguNTUgMjIuOCAxOS45NSAyNC4yIE05LjI1IDEzLjUgTDEwLjA1IDE0LjMgMTQuMyAxMC4wNSAxMy41IDkuMjUgOS4yNSA5LjMgOS4yNSAxMy41JyxcbiAgICBGTElQX1ZcbiAgKSxcbiAgNixcbiAgMTgsXG4gICdjcm9zc2hhaXInXG4pO1xuY29uc3QgQ1JPU1NIQUlSID0gc3ZnQ3Vyc29yKFxuICBrZW5uZXkoXG4gICAgJ00xNyAyIFExOC4yIDIgMTkuMTUgMi45IDIwIDMuOCAyMCA1IEwyMCAxMiAyNyAxMiBRMjguMiAxMiAyOS4xNSAxMi45IDMwIDEzLjggMzAgMTUgTDMwIDE3IFEzMCAxOC4yIDI5LjE1IDE5LjE1IDI4LjIgMjAgMjcgMjAgTDIwIDIwIDIwIDI3IFEyMCAyOC4yIDE5LjE1IDI5LjE1IDE4LjIgMzAgMTcgMzAgTDE1IDMwIFExMy44IDMwIDEyLjkgMjkuMTUgMTIgMjguMiAxMiAyNyBMMTIgMjAgNSAyMCBRMy44IDIwIDIuOSAxOS4xNSAyIDE4LjIgMiAxNyBMMiAxNSBRMiAxMy44IDIuOSAxMi45IDMuOCAxMiA1IDEyIEwxMiAxMiAxMiA1IFExMiAzLjggMTIuOSAyLjkgMTMuOCAyIDE1IDIgTDE3IDIgTTE0IDI3IEwxNC4zIDI3LjcgUTE0LjYgMjggMTUgMjggTDE3IDI4IDE3LjcgMjcuNyAxOCAyNyAxOCAxOC4wNSAxOC4wNSAxOCAyNyAxOCBRMjcuNCAxOCAyNy43IDE3LjcgTDI4IDE3IDI4IDE1IDI3LjcgMTQuMyBRMjcuNCAxNCAyNyAxNCBMMTggMTQgMTggNSAxNy43IDQuMyAxNyA0IDE1IDQgUTE0LjYgNCAxNC4zIDQuMyAxNCA0LjYgMTQgNSBMMTQgMTQgNSAxNCBRNC42IDE0IDQuMyAxNC4zIDQgMTQuNiA0IDE1IEw0IDE3IFE0IDE3LjQgNC4zIDE3LjcgNC42IDE4IDUgMTggTDE0IDE4IDE0IDI3JyxcbiAgICAnTTE0IDI3IEwxNCAxOCA1IDE4IFE0LjYgMTggNC4zIDE3LjcgNCAxNy40IDQgMTcgTDQgMTUgUTQgMTQuNiA0LjMgMTQuMyA0LjYgMTQgNSAxNCBMMTQgMTQgMTQgNSBRMTQgNC42IDE0LjMgNC4zIDE0LjYgNCAxNSA0IEwxNyA0IDE3LjcgNC4zIDE4IDUgMTggMTQgMjcgMTQgUTI3LjQgMTQgMjcuNyAxNC4zIEwyOCAxNSAyOCAxNyAyNy43IDE3LjcgUTI3LjQgMTggMjcgMTggTDE4LjA1IDE4IDE4IDE4LjA1IDE4IDI3IDE3LjcgMjcuNyAxNyAyOCAxNSAyOCBRMTQuNiAyOCAxNC4zIDI3LjcgTDE0IDI3J1xuICApLFxuICAxMixcbiAgMTIsXG4gICdjcm9zc2hhaXInXG4pO1xuY29uc3QgRVJBU0VSID0gc3ZnQ3Vyc29yKFxuICBrZW5uZXkoXG4gICAgJ00zLjkgMTEuMzUgUTIuMyAxMi41IDMuNyAxMy45IEwxNi40IDI2LjY1IFExNy44NSAyOC4wNSAxOS40NSAyNi45IEwyNy42NSAyMS4xNSBRMjkuMyAyMCAyNy44NSAxOC42IEwxNS4xNSA1Ljg1IFExMy43NSA0LjQ1IDEyLjEgNS42IEwzLjkgMTEuMzUgTTEuMDUgMTIuNCBRMSAxMC45NSAyLjc1IDkuNzUgTDEwLjk1IDQgMTAuOTUgMy45NSBRMTQgMS44NSAxNi42IDQuNDUgTDI5LjMgMTcuMiBRMzAuOCAxOC42NSAzMC41NSAyMC4xIDMwLjU1IDIxLjU1IDI4LjggMjIuOCBMMjAuNiAyOC41NSAyMC42NSAyOC41NSBRMTcuNyAzMC42NSAxNSAyOC4xIEwxNSAyOC4wNSAyLjMgMTUuMyAyLjMgMTUuMzUgUTAuOCAxMy44NSAxLjA1IDEyLjQgTTEzLjUgNyBMMTkuODUgMTMuMzUgMTEuNjUgMTkuMTUgNS4zIDEyLjc1IDEzLjUgNycsXG4gICAgJ00xMy41IDcgTDUuMyAxMi43NSAxMS42NSAxOS4xNSAxOS44NSAxMy4zNSAxMy41IDcgTTMuOSAxMS4zNSBMMTIuMSA1LjYgUTEzLjc1IDQuNDUgMTUuMTUgNS44NSBMMjcuODUgMTguNiBRMjkuMyAyMCAyNy42NSAyMS4xNSBMMTkuNDUgMjYuOSBRMTcuODUgMjguMDUgMTYuNCAyNi42NSBMMy43IDEzLjkgUTIuMyAxMi41IDMuOSAxMS4zNSdcbiAgKSxcbiAgNixcbiAgMTQsXG4gICdjZWxsJ1xuKTtcblxuLy8gVGV4dCDigJQgYSBjbGFzc2ljIEktYmVhbSAodmVydGljYWwgc3RlbSArIHRvcC9ib3R0b20gc2VyaWZzKS4gQXV0aG9yZWQgaW4gdGhlXG4vLyBzYW1lIGRhcmstSU5LIGdseXBoICsgd2hpdGUtSEFMTyB0cmVhdG1lbnQgYXMgdGhlIEtlbm5leSBnbHlwaHMgKEtlbm5leSdzXG4vLyBwb2ludGVyX2kgcmVhZHMgYXMgYSBzbWFsbCBicmFja2V0LCBub3QgYW4gSS1iZWFtKS4gSG90c3BvdCBkZWFkLWNlbnRyZS5cbmNvbnN0IFRFWFQgPSBzdmdDdXJzb3IoXG4gIGA8c3ZnICR7V30+PHBhdGggZD0nTTE2IDRWMjhNMTEgNEgyMU0xMSAyOEgyMScgZmlsbD0nbm9uZScgJHtIQUxPfSBzdHJva2Utd2lkdGg9JzUnLz48cGF0aCBkPSdNMTYgNFYyOE0xMSA0SDIxTTExIDI4SDIxJyBmaWxsPSdub25lJyBzdHJva2U9JyR7SU5LfScgc3Ryb2tlLXdpZHRoPScyLjI1JyBzdHJva2UtbGluZWNhcD0ncm91bmQnLz48L3N2Zz5gLFxuICAxMixcbiAgMTIsXG4gICd0ZXh0J1xuKTtcblxuLy8gU3RpY2t5IOKAlCBhIG5vdGUgd2l0aCBhIHBlZWxlZC9mb2xkZWQgdG9wLXJpZ2h0IGNvcm5lciAodGhlIHVuaXZlcnNhbCBzdGlja3lcbi8vIGdseXBoKS4gQXV0aG9yZWQgaW4gdGhlIHNhbWUgdHJlYXRtZW50IChLZW5uZXkgaGFzIG5vIHN0aWNreS1ub3RlKS4gSG90c3BvdFxuLy8gYXQgdGhlIG5vdGUncyB0b3AtbGVmdCwgd2hlcmUgdGhlIG5vdGUgaXMgZHJvcHBlZC5cbmNvbnN0IFNUSUNLWSA9IHN2Z0N1cnNvcihcbiAgYDxzdmcgJHtXfT48cGF0aCBkPSdNNiA1SDIxTDI2IDEwVjI3SDZaJyBmaWxsPScke0lOS30nICR7SEFMT30gc3Ryb2tlLXdpZHRoPScyLjUnLz48cGF0aCBkPSdNMjEgNVYxMUgyNicgZmlsbD0nbm9uZScgJHtIQUxPfSBzdHJva2Utd2lkdGg9JzIuMjUnLz48L3N2Zz5gLFxuICA1LFxuICA1LFxuICAnY3Jvc3NoYWlyJ1xuKTtcblxuLyoqXG4gKiBUb29sIOKGkiBDU1MgY3Vyc29yIHZhbHVlLiBQaGFzZSAyNCDigJQgZXZlcnkgdG9vbCBzaGlwcyBhIEtlbm5leSBnbHlwaCAobm9cbiAqIHN5c3RlbSBmYWxsYmFjayBmb3IgYG1vdmVgIGFueW1vcmU7IHRoZSBicmllZiBpcyBPTkUgdW5pZmllZCBsaWJyYXJ5KS4gVGhlXG4gKiBzaW5nbGUgU2hhcGUgdG9vbCB1c2VzIHRoZSBjcm9zc2hhaXI7IGByZWN0YC9gZWxsaXBzZWAgc3RheSBrZXllZCAoc3RpbGwgaW5cbiAqIHRoZSBUb29sIHVuaW9uKSBidXQgYXJlIG5vIGxvbmdlciBkaXJlY3RseSBzZWxlY3RhYmxlLlxuICovXG4vLyBGcm96ZW4gc28gdGhlIGRvY3N0cmluZydzIFwiZnJvemVuIG1hcFwiIGd1YXJhbnRlZSBpcyByZWFsOiBgcmVzb2x2ZVRvb2xDdXJzb3JgXG4vLyBpcyBhIHB1cmUgbG9va3VwIGludG8gdGhpcyBvYmplY3QsIGFuZCBmcmVlemluZyBmb3JlY2xvc2VzIGFueSBzYW1lLXJlYWxtXG4vLyBzaGVsbC1zaWRlIGNvZGUgZXZlciBtdXRhdGluZyBhbiBlbnRyeSBvdXQgZnJvbSB1bmRlciB0aGUgbG9va3VwICh0aGUgY2FudmFzXG4vLyBydW5zIGNyb3NzLW9yaWdpbiBhbmQgY2FuJ3QgcmVhY2ggaXQgcmVnYXJkbGVzcyDigJQgdGhpcyBpcyBiZWx0LWFuZC1icmFjZXMpLlxuZXhwb3J0IGNvbnN0IFRPT0xfQ1VSU09SUzogUmVjb3JkPFRvb2wsIHN0cmluZz4gPSBPYmplY3QuZnJlZXplKHtcbiAgbW92ZTogTU9WRSxcbiAgaGFuZDogSEFORCxcbiAgY29tbWVudDogQ09NTUVOVCxcbiAgcGVuOiBQRU4sXG4gIC8vIEZpZ0phbSB2MyDigJQgdGhlIHNlY3Rpb24gY29udGFpbmVyIGRyYXdzIGxpa2UgYSBzaGFwZSAoY3Jvc3NoYWlyIGdseXBoKS5cbiAgc2VjdGlvbjogQ1JPU1NIQUlSLFxuICAvLyBIaWdobGlnaHRlciA9IEtlbm5leSBgZHJhd2luZ19wZW5jaWxgIHJvdDE4MDsgcGVuID0gYGRyYXdpbmdfcGVuYCByb3QxODAg4oCUXG4gIC8vIGRpc3RpbmN0IGdseXBocywgYm90aCBmcm9tIHRoZSBLZW5uZXkgcGFjayAodXNlciBzdGVlciAyMDI2LTA2LTA0KS5cbiAgaGlnaGxpZ2h0ZXI6IEhJR0hMSUdIVEVSLFxuICBzaGFwZTogQ1JPU1NIQUlSLFxuICByZWN0OiBDUk9TU0hBSVIsXG4gIGVsbGlwc2U6IENST1NTSEFJUixcbiAgc3RpY2t5OiBTVElDS1ksXG4gIGFycm93OiBDUk9TU0hBSVIsXG4gIHRleHQ6IFRFWFQsXG4gIGVyYXNlcjogRVJBU0VSLFxufSk7XG5cbi8qKlxuICogUmVzb2x2ZSBhIHRvb2wgdG9rZW4g4oCUIHJlY2VpdmVkIG92ZXIgdGhlICoqdW50cnVzdGVkKiogY2FudmFz4oaSc2hlbGxcbiAqIGB0b29sLWN1cnNvcmAgcG9zdE1lc3NhZ2UgYnJpZGdlIOKAlCB0byBhIFRSVVNURUQgY3Vyc29yIHN0cmluZyBmcm9tXG4gKiB7QGxpbmsgVE9PTF9DVVJTT1JTfSwgb3IgYG51bGxgIHdoZW4gdGhlIHRva2VuIGlzIG5vdCBhIGtub3duIHRvb2wuXG4gKlxuICogVGhlIGFwcCBzaGVsbCBhcHBsaWVzIHRoZSB2YWx1ZSB0aGlzIFJFVFVSTlMsIG5ldmVyIHRoZSByYXcgbWVzc2FnZS4gVGhhdCBpc1xuICogdGhlIHNlY3VyaXR5IGJvdW5kYXJ5OiBhIG1hbGljaW91cyAqc3luY2VkKiBjYW52YXMgKEREUi0wNTQg4oCUIGNhbnZhcyBjb250ZW50XG4gKiBpcyB1bnRydXN0ZWQgYW5kIG1heSBiZSBodWItcHVzaGVkKSBjYW4gY2FsbFxuICogYHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UoeyBkZ246ICd0b29sLWN1cnNvcicsIHRvb2w6IOKApiB9LCAnKicpYCBkaXJlY3RseSxcbiAqIGJ5cGFzc2luZyB0aGUgaG9uZXN0IGBUb29sUHJvdmlkZXJgIHNlbmRlci4gQnkgZWNob2luZyBvbmx5IGEgdG9rZW4gYW5kXG4gKiBsb29raW5nIHRoZSBjdXJzb3IgdXAgaGVyZSwgdGhlIHdvcnN0IHRoYXQgY2FudmFzIGNhbiBkbyBpcyBwaWNrICp3aGljaCpcbiAqIGtub3duLCBhbHdheXMtdmlzaWJsZSBnbHlwaCB0aGUgc2hlbGwgc2hvd3Mg4oCUIGl0IGNhbiBubyBsb25nZXIgc211Z2dsZSBhblxuICogaW52aXNpYmxlIC8gZGlzcGxhY2VkIC8gemVyby1jb250ZW50IFNWRyBjdXJzb3IgdGhhdCB3b3VsZCBhY3QgYXMgYVxuICogY2xpY2tqYWNraW5nIGFpZCBvdmVyIHRoZSB1bi1DU1AnZCBzaGVsbCAocGhhc2UtMjQgZXRoaWNhbC1oYWNrZXIgRmluZGluZyAyO1xuICogc2VlIEREUi0wNjcpLiBgaGFzT3duUHJvcGVydHlgIChub3QgYGluYCkga2VlcHMgYGNvbnN0cnVjdG9yYC9gX19wcm90b19fYFxuICogb2ZmIHRoZSBhbGxvd2xpc3QsIGFuZCB0aGUgYFthLXotXWAgc2hhcGUgZ2F0ZSBiYXJzIGFueXRoaW5nIGJ1dCBhIHRvb2wgaWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVG9vbEN1cnNvcih0b2tlbjogdW5rbm93bik6IHN0cmluZyB8IG51bGwge1xuICBpZiAodHlwZW9mIHRva2VuICE9PSAnc3RyaW5nJyB8fCAhL15bYS16LV0rJC8udGVzdCh0b2tlbikpIHJldHVybiBudWxsO1xuICBpZiAoIU9iamVjdC5oYXNPd24oVE9PTF9DVVJTT1JTLCB0b2tlbikpIHJldHVybiBudWxsO1xuICByZXR1cm4gVE9PTF9DVVJTT1JTW3Rva2VuIGFzIFRvb2xdO1xufVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIjtBQTRCQTtBQUFBO0FBQUE7QUFBQSxjQUlFO0FBQUEsaUJBRUE7QUFBQSxlQUNBO0FBQUEsYUFDQTtBQUFBLFlBQ0E7QUFBQSxjQUNBO0FBQUE7QUFFRjs7O0FDTkEsd0JBQVMsMkJBQWEsdUJBQVcsb0JBQVMscUJBQVE7OztBQ2hCbEQ7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBV0E7QUFDQTtBQUNBO0FBQUE7QUF3UkEsSUFBTSxnQkFBZ0IsY0FBa0MsSUFBSTtBQUVyRCxTQUFTLFNBQVMsR0FBdUI7QUFBQSxFQUM5QyxPQUFPLFdBQVcsYUFBYTtBQUFBO0FBc0xqQyxJQUFNLGVBQWUsT0FBTyxJQUFJLDBCQUEwQjs7O0FDaGUxRDtBQUFBLG1CQUNFO0FBQUEsaUJBRUE7QUFBQSxnQkFDQTtBQUFBLGVBQ0E7QUFBQSxhQUNBO0FBQUEsWUFDQTtBQUFBLGNBQ0E7QUFBQTtBQUFBO0FBeURGLElBQU0sc0JBQXNCLGVBQXdDLElBQUk7QUFLeEUsU0FBUyxZQUFZLENBQUMsR0FBc0I7QUFBQSxFQUMxQyxPQUFPLEVBQUUsS0FBSyxNQUFNLEVBQUUsT0FBTyxPQUFPLEVBQUU7QUFBQTtBQUd4QyxTQUFTLE1BQU0sQ0FBQyxNQUFnQztB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
1
+ import{Component as bQ,createElement as k,Fragment as xQ,useCallback as UJ,useEffect as p,useMemo as vQ,useRef as S,useState as KJ}from"react";import{createRoot as RQ}from"react-dom/client";import{useCallback as T,useEffect as y,useMemo as u,useRef as b,useState as v}from"react";import*as l from"lib0/decoding";import*as m from"lib0/encoding";import{createContext as hJ,useCallback as rQ,useContext as fJ,useEffect as iQ,useMemo as cQ,useReducer as lQ,useRef as aQ,useState as oQ}from"react";import{Awareness as sQ,applyAwarenessUpdate as tQ,encodeAwarenessUpdate as eQ}from"y-protocols/awareness";import{readSyncMessage as QZ,writeSyncStep1 as ZZ,writeUpdate as $Z}from"y-protocols/sync";import*as pJ from"yjs";import{jsx as zZ}from"react/jsx-runtime";var mJ=hJ(null);function FJ(){return fJ(mJ)}import{createContext as uJ,useCallback as h,useContext as o,useEffect as dJ,useMemo as rJ,useRef as iJ,useState as cJ}from"react";import{jsx as a,Fragment as oJ}from"react/jsx-runtime";var i=uJ(null);function f(J){return J.id?`id:${J.id}`:`sel:${J.selector}`}function HJ(J){let Z=[],Q=new Set;for(let $ of J){let z=f($);if(Q.has(z))continue;Q.add(z),Z.push($)}return Z}var lJ=50;function aJ({children:J,postTarget:Z}){let[Q,$]=cJ([]),z=iJ(null),W=h((X)=>{if(z.current)clearTimeout(z.current);z.current=setTimeout(()=>{z.current=null;let Y=Z??(typeof window<"u"?window.parent:null);if(!Y)return;let j=X.length===0?null:X.length===1?X[0]??null:X;try{Y.postMessage({dgn:"select-set",selection:j},"*")}catch{}},lJ)},[Z]);dJ(()=>()=>{if(z.current)clearTimeout(z.current)},[]);let U=h((X)=>{let Y=HJ(Array.isArray(X)?X:[X]);$(Y),W(Y)},[W]),q=h((X)=>{let Y=Array.isArray(X)?X:[X];$((j)=>{let _=HJ([...j,...Y]);return W(_),_})},[W]),G=h((X)=>{let Y=f(X);$((j)=>{let _=j.filter((I)=>f(I)!==Y);return W(_),_})},[W]),F=h((X)=>{let Y=f(X);$((j)=>{let _=j.some((I)=>f(I)===Y)?j.filter((I)=>f(I)!==Y):[...j,X];return W(_),_})},[W]),D=h(()=>{$([]),W([])},[W]),K=rJ(()=>({selected:Q,replace:U,add:q,remove:G,toggle:F,clear:D}),[Q,U,q,G,F,D]);return a(i.Provider,{value:K,children:J})}function PJ({children:J}){if(o(i))return a(oJ,{children:J});return a(aJ,{children:J})}function LJ(){let J=o(i);if(!J)throw Error("useSelectionSet must be used inside <SelectionSetProvider>");return J}function MJ(){return o(i)}import{jsx as N,jsxs as E}from"react/jsx-runtime";var nJ="/_client/comments-overlay.css";function sJ(){if(typeof document>"u")return;if(document.getElementById("cm-overlay-css"))return;let J=document.createElement("link");J.id="cm-overlay-css",J.rel="stylesheet",J.href=nJ,document.head.appendChild(J)}function tJ(){if(typeof window>"u")return null;try{let J=window.location.pathname;if(J==="/_canvas-shell.html"||J==="/_canvas-shell"){let Z=new URLSearchParams(window.location.search),Q=Z.get("canvas")??"",$=(Z.get("designRel")??".design").replace(/^\/+|\/+$/g,"");return Q?`${$}/${Q}`:null}return decodeURIComponent(J).replace(/^\//,"")}catch{return null}}function s(J,Z){if(!J)return null;let Q=null;try{let z=document.querySelectorAll(J),W=Z&&Z>0&&Z<z.length?Z:0;Q=z[W]??z[0]??null}catch{return null}if(!Q?.isConnected)return null;let $=Q.getBoundingClientRect();if($.width===0&&$.height===0)return null;return{x:$.left,y:$.top,w:$.width,h:$.height}}function IJ(){sJ();let J=MJ(),[Z,Q]=v([]),[$,z]=v(null),[W,U]=v(null),q=u(()=>tJ(),[]);y(()=>{if(typeof document>"u")return;let B=document.getElementById("dgn-pin-layer");if(!B)return;let H=B.style.display;return B.style.display="none",()=>{B.style.display=H}},[]);let G=T((B)=>{if(!J)return;if(!B?.selector){J.clear();return}let H=B.selector.match(/data-cd-id="([^"]+)"/),M=H?H[1]:void 0,O,x;try{let P=document.querySelector(B.selector);if(P)O=P.tagName.toLowerCase(),x=(P.getAttribute("class")??"").split(/\s+/).filter((A)=>A&&!A.startsWith("dgn-")&&!A.startsWith("dc-cv-")).join(" ")}catch{}J.replace({file:q??void 0,id:M,selector:B.selector,tag:O,classes:x,bounds:B.bounds??void 0})},[J,q]),F=b(Z);F.current=Z;let D=FJ();y(()=>{if(!D)return;let B=D.doc.getArray("comments"),H=()=>{Q(B.toArray())};if(B.length>0)H();return B.observe(H),()=>{try{B.unobserve(H)}catch{}}},[D]),y(()=>{if(typeof window>"u")return;let B=(H)=>{let M=H.data;if(!M||typeof M!=="object"||!M.dgn)return;if(M.dgn==="comments-set"&&Array.isArray(M.comments))Q(M.comments);else if(M.dgn==="comment-focus"){let O=typeof M.id==="string"?M.id:null;z(O);let x=O?F.current.find((P)=>P.id===O):void 0;G(x)}};return window.addEventListener("message",B),()=>window.removeEventListener("message",B)},[G]),y(()=>{if(typeof document>"u")return;let B=(H)=>{let M=H.detail;if(!M?.selection)return;U({selection:M.selection,clientX:typeof M.clientX==="number"?M.clientX:0,clientY:typeof M.clientY==="number"?M.clientY:0})};return document.addEventListener("cm:open-composer",B),()=>document.removeEventListener("cm:open-composer",B)},[]);let K=T(()=>{if(U(null),typeof window>"u")return;try{window.parent.postMessage({dgn:"force-clear"},"*")}catch{}},[]),X=T((B)=>{if(!W)return;let H=W.selection,M={file:H.file,selector:H.selector,index:H.index,dom_path:H.dom_path,tag:H.tag,classes:H.classes,bounds:H.bounds,html_excerpt:H.html,text:B};if(typeof window>"u")return;try{window.parent.postMessage({dgn:"comment-submit",payload:M},"*")}catch{}K()},[W,K]);y(()=>{if(!q)return;let B=!1;return(async()=>{try{let H=await fetch(`/_comments?file=${encodeURIComponent(q)}`);if(!H.ok)return;let M=await H.json();if(B)return;if(Array.isArray(M.comments))Q((O)=>O.length===0?M.comments??[]:O)}catch{}})(),()=>{B=!0}},[q]);let Y=u(()=>{return Z.slice().sort((H,M)=>H.created.localeCompare(M.created)).filter((H)=>H.status!=="resolved")},[Z]),j=u(()=>{let B=new Map;return Z.slice().sort((M,O)=>M.created.localeCompare(O.created)).forEach((M,O)=>{B.set(M.id,O+1)}),B},[Z]),_=T((B)=>{if(z(B),G(Z.find((H)=>H.id===B)),typeof window>"u")return;try{window.parent.postMessage({dgn:"comment-click",id:B},"*")}catch{}},[Z,G]),I=T((B,H)=>{if(typeof window>"u")return;try{window.parent.postMessage({dgn:"comment-patch",id:B,patch:H},"*")}catch{}},[]),V=T((B)=>{if(typeof window>"u")return;try{window.parent.postMessage({dgn:"comment-delete",id:B},"*")}catch{}z((H)=>H===B?null:H)},[]),L=T(async(B,H)=>{if(typeof fetch>"u")return!1;try{let M=await fetch(`/_api/comments/${encodeURIComponent(B)}/reply`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({body:H})});if(!M.ok)return!1;let O=await M.json();return Q((x)=>x.map((P)=>P.id===O.id?O:P)),!0}catch{return!1}},[]);return E("div",{className:"cm-layer","aria-hidden":!1,children:[Y.map((B)=>{let H=j.get(B.id)??0;return N(QQ,{comment:B,sequence:H,focused:$===B.id,onClick:_},B.id)}),W?N(ZQ,{state:W,onSubmit:X,onCancel:K}):null,(()=>{if(!$)return null;let B=Y.find((H)=>H.id===$);if(!B)return null;return N($Q,{comment:B,sequence:j.get(B.id)??0,onClose:()=>{z(null),J?.clear()},onPatch:(H)=>I(B.id,H),onDelete:()=>V(B.id),onReply:(H)=>L(B.id,H)})})()]})}var n=null;async function eJ(){if(!n)n=(async()=>{try{let J=await fetch("/_api/git-committers");if(!J.ok)return[];let Z=await J.json();return Array.isArray(Z.committers)?Z.committers:[]}catch{return[]}})();return n}function jJ(J){return(J.trim().split(/\s+/)[0]??"").replace(/[^\w.-]/g,"").toLowerCase()}function JQ(J,Z){if(Z<=0||Z>J.length)return null;let Q=Z-1;while(Q>=0){let $=J[Q]??"";if($==="@"){let z=Q>0?J[Q-1]:"";if(Q===0||/\s/.test(z??"")){let W=J.slice(Q+1,Z);return{start:Q,end:Z,query:W}}return null}if(!/[\w.-]/.test($))return null;Q-=1}return null}function AJ({className:J,value:Z,onChange:Q,onKeyDown:$,placeholder:z,rows:W,disabled:U,textareaRef:q,ariaLabel:G}){let F=b(null),D=T((P)=>{if(F.current=P,q)q.current=P},[q]),[K,X]=v([]),[Y,j]=v(null),[_,I]=v(0),V=T(()=>{if(K.length>0)return;eJ().then((P)=>X(P))},[K.length]),L=u(()=>{if(!Y)return[];let P=Y.query.toLowerCase();return(!P?K:K.filter((g)=>g.name.toLowerCase().includes(P)||g.email.toLowerCase().includes(P))).slice(0,8)},[Y,K]),B=T((P)=>{let A=P.selectionStart??P.value.length,g=JQ(P.value,A);j(g),I(0)},[]),H=T((P)=>{Q(P.target.value),B(P.target)},[Q,B]),M=T((P)=>{if(!Y)return;let A=F.current;if(!A)return;let g=`@${jJ(P.name)}`,c=`${Z.slice(0,Y.start)}${g} ${Z.slice(Y.end)}`;Q(c),j(null);let DJ=Y.start+g.length+1;requestAnimationFrame(()=>{A.focus(),A.setSelectionRange(DJ,DJ)})},[Y,Z,Q]),O=T((P)=>{if(Y&&L.length>0){if(P.key==="ArrowDown"){P.preventDefault(),I((A)=>(A+1)%L.length);return}if(P.key==="ArrowUp"){P.preventDefault(),I((A)=>(A-1+L.length)%L.length);return}if(P.key==="Enter"||P.key==="Tab"){P.preventDefault();let A=L[_]??L[0];if(A)M(A);return}if(P.key==="Escape"){P.preventDefault(),j(null);return}}$?.(P)},[Y,L,_,M,$]),x=T((P)=>{B(P.currentTarget)},[B]);return E("div",{style:{position:"relative"},children:[N("textarea",{ref:D,className:J,value:Z,placeholder:z,rows:W,disabled:U,"aria-label":G,onChange:H,onKeyDown:O,onFocus:V,onSelect:x,onClick:x}),Y&&L.length>0?N("ul",{className:"cm-mention-popup",role:"listbox","aria-label":"Mention suggestions",style:{left:0,top:"100%"},children:L.map((P,A)=>{return E("li",{role:"option","aria-selected":A===_,className:"cm-mention-popup__item",onMouseEnter:()=>I(A),onMouseDown:(c)=>{c.preventDefault(),M(P)},children:[E("span",{className:"cm-mention-popup__name",children:["@",jJ(P.name)]}),N("span",{className:"cm-mention-popup__email",children:P.email})]},`${P.name}-${P.email}`)})}):null]})}function QQ({comment:J,sequence:Z,focused:Q,onClick:$}){let z=b(null),W=b(null);y(()=>{let G=()=>{W.current=null;let F=z.current;if(!F)return;let D=s(J.selector,J.index);if(!D&&J.bounds)D={x:J.bounds.x,y:J.bounds.y,w:J.bounds.w,h:J.bounds.h};if(!D){F.style.display="none",W.current=requestAnimationFrame(G);return}F.style.display="grid";let K=Math.round(D.x+D.w-12),X=Math.round(D.y-12);F.style.left=`${K}px`,F.style.top=`${X}px`,W.current=requestAnimationFrame(G)};return W.current=requestAnimationFrame(G),()=>{if(W.current!=null)cancelAnimationFrame(W.current)}},[J.selector,J.bounds,J.index]);let U=J.author?.trim()||"unknown",q=`Comment ${Z} by ${U}`;return N("button",{ref:z,type:"button",className:"cm-pin","data-resolved":J.status==="resolved"?"true":"false","data-focused":Q?"true":"false","data-comment-pin":J.id,"aria-label":q,"aria-expanded":Q,title:J.text.slice(0,200),onClick:(G)=>{G.preventDefault(),G.stopPropagation(),$(J.id)},children:Z})}function ZQ({state:J,onSubmit:Z,onCancel:Q}){let[$,z]=v(""),W=b(null),U=b(null),q=b(null);y(()=>{let K=()=>{q.current=null;let X=U.current;if(!X)return;let Y=WQ(J);X.style.left=`${Math.round(Y.x)}px`,X.style.top=`${Math.round(Y.y)}px`,q.current=requestAnimationFrame(K)};return q.current=requestAnimationFrame(K),()=>{if(q.current!=null)cancelAnimationFrame(q.current)}},[J]),y(()=>{W.current?.focus()},[]);let G=T(()=>{let K=$.trim();if(!K)return;Z(K)},[$,Z]),F=T((K)=>{if(K.key==="Escape"){K.preventDefault(),Q();return}if((K.metaKey||K.ctrlKey)&&K.key==="Enter")K.preventDefault(),G()},[Q,G]),D=u(()=>{let K=J.selection.selector||"";if(!K)return J.selection.tag||"canvas";let X=K.match(/data-cd-id="([^"]+)"/);if(X)return`cd:${X[1]}`;return K.length>36?`${K.slice(0,33)}…`:K},[J.selection]);return E("div",{ref:U,className:"cm-composer",role:"dialog","aria-label":"New comment",onClick:(K)=>K.stopPropagation(),onPointerDown:(K)=>K.stopPropagation(),children:[E("div",{className:"cm-composer__head",children:[N("span",{children:"New comment"}),N("span",{className:"cm-composer__selector",children:D})]}),N(AJ,{textareaRef:W,className:"cm-composer__textarea",value:$,placeholder:"Type a comment. ⌘↵ to save · Esc to cancel · @name to tag",onChange:z,onKeyDown:F,rows:3,ariaLabel:"Comment body"}),E("div",{className:"cm-composer__actions",children:[N("button",{type:"button",className:"cm-btn",onClick:Q,children:"Cancel"}),N("button",{type:"button",className:"cm-btn cm-btn--primary",disabled:!$.trim(),onClick:G,children:"Save"})]})]})}function $Q({comment:J,sequence:Z,onClose:Q,onPatch:$,onDelete:z,onReply:W}){let U=b(null),q=b(null),G=b(null),[F,D]=v(""),[K,X]=v(!1);y(()=>{let V=()=>{G.current=null;let L=U.current;if(!L)return;let B=zQ(J);L.style.left=`${Math.round(B.x)}px`,L.style.top=`${Math.round(B.y)}px`,G.current=requestAnimationFrame(V)};return G.current=requestAnimationFrame(V),()=>{if(G.current!=null)cancelAnimationFrame(G.current)}},[J]),y(()=>{U.current?.focus();let V=J.id;return()=>{document.querySelector(`[data-comment-pin="${V}"]`)?.focus()}},[J.id]),y(()=>{if(typeof document>"u")return;let V=(L)=>{if(L.key!=="Escape")return;let B=U.current;if(!B)return;if(B.contains(L.target)||document.activeElement===B)L.preventDefault(),Q()};return document.addEventListener("keydown",V),()=>document.removeEventListener("keydown",V)},[Q]);let Y=T(async()=>{let V=F.trim();if(!V||K)return;X(!0);let L=await W(V);if(X(!1),L)D(""),q.current?.focus()},[F,K,W]),j=T((V)=>{if((V.metaKey||V.ctrlKey)&&V.key==="Enter")V.preventDefault(),Y()},[Y]),_=`cm-thread-head-${J.id}`,I=VQ(J.selector,"");return E("div",{ref:U,className:"cm-thread",role:"dialog","aria-labelledby":_,tabIndex:-1,onClick:(V)=>V.stopPropagation(),onPointerDown:(V)=>V.stopPropagation(),children:[E("div",{className:"cm-thread__head",id:_,children:[E("div",{className:"cm-thread__head-row",children:[N("span",{className:"cm-thread__seq","aria-hidden":"true",children:Z}),N("span",{className:"cm-thread__author",children:J.author?.trim()||"unknown"}),N("span",{className:"cm-thread__time",children:_J(J.created)}),N("button",{type:"button",className:"cm-thread__close","aria-label":"Close thread",title:"Close · Esc",onClick:Q,children:"×"})]}),I?N("code",{className:"cm-thread__selector",children:I}):null]}),N("div",{className:"cm-thread__body",children:NJ(J.text)}),(J.thread??[]).map((V)=>E("div",{className:"cm-thread__reply",children:[E("div",{className:"cm-thread__reply-head",children:[N("span",{className:"cm-thread__reply-author",children:V.author?.trim()||"unknown"}),N("span",{className:"cm-thread__reply-time",children:_J(V.created)})]}),N("div",{className:"cm-thread__reply-body",children:NJ(V.body)})]},V.id)),E("div",{className:"cm-thread__reply-form",children:[N(AJ,{textareaRef:q,className:"cm-thread__reply-textarea",value:F,placeholder:"Reply… ⌘↵ to send · @name to tag",onChange:D,onKeyDown:j,rows:2,ariaLabel:"Reply",disabled:K}),N("div",{className:"cm-thread__reply-actions",children:N("button",{type:"button",className:"cm-btn cm-btn--primary",disabled:!F.trim()||K,onClick:()=>void Y(),children:"Send"})})]}),E("div",{className:"cm-thread__actions",children:[J.status==="resolved"?N("button",{type:"button",className:"cm-btn",onClick:()=>$({status:"open"}),children:"↺ Reopen"}):N("button",{type:"button",className:"cm-btn cm-btn--primary",onClick:()=>{$({status:"resolved"}),Q()},children:"✓ Resolve"}),N("button",{type:"button",className:"cm-btn cm-btn--danger",onClick:()=>{z(),Q()},children:"Delete"})]})]})}function NJ(J){if(!J)return null;let Z=/(@[\w][\w.-]*)/g;return J.split(Z).map(($,z)=>{let W=`${z}:${$}`;if(z%2===1)return N("strong",{"data-mention":"true",children:$},W);return N("span",{children:$},W)})}function _J(J){if(!J)return"";let Z=Date.parse(J);if(!Number.isFinite(Z))return"";let Q=Math.round((Date.now()-Z)/1000);if(Q<60)return`${Math.max(Q,0)}s ago`;if(Q<3600)return`${Math.round(Q/60)}m ago`;if(Q<86400)return`${Math.round(Q/3600)}h ago`;return`${Math.round(Q/86400)}d ago`}function VQ(J,Z){if(!J)return Z;let Q=J.match(/data-cd-id="([^"]+)"/);if(Q)return`cd:${Q[1]}`;return J.length>36?`${J.slice(0,33)}…`:J}function zQ(J){let Z=J.selector?s(J.selector,J.index):null;if(Z)return{x:Z.x+Z.w-12,y:Z.y+16};if(J.bounds)return{x:J.bounds.x+J.bounds.w-12,y:J.bounds.y+16};return{x:16,y:16}}function WQ(J){if(J.clientX||J.clientY)return{x:J.clientX,y:J.clientY+8};if(J.selection.selector){let Z=s(J.selection.selector,J.selection.index);if(Z)return{x:Z.x,y:Z.y+Z.h+8}}return{x:16,y:16}}function t(){if(typeof window>"u")return;try{let J=window.location.pathname;if(J==="/_canvas-shell.html"||J==="/_canvas-shell"){let Z=new URLSearchParams(window.location.search),Q=Z.get("canvas")??"",$=(Z.get("designRel")??".design").replace(/^\/+|\/+$/g,"");return Q?`${$}/${Q}`:void 0}return decodeURIComponent(J).replace(/^\//,"")}catch{return}}function e(J){if(!J)return"";return(J.getAttribute("class")??"").trim().split(/\s+/).filter((Z)=>Z&&!Z.startsWith("dgn-")&&!Z.startsWith("dc-cv-")).join(" ")}function BQ(J,Z){if(!J)return"";let Q=(J.innerText||J.textContent||"").replace(/\s+/g," ").trim();return Q.length>Z?`${Q.slice(0,Z-1)}…`:Q}function qQ(J){if(!J)return"";let Z=[],Q=J;while(Q&&Q.nodeType===1&&Z.length<8){let $=Q.getAttribute?.("data-dc-element");if($){Z.unshift(`[data-dc-element="${$}"]`);break}let z=Q.getAttribute?.("data-dc-screen");if(z){Z.unshift(`[data-dc-screen="${z}"]`);break}let W=Q.nodeName.toLowerCase();if(Q.id){W=`#${Q.id}`,Z.unshift(W);break}let U=e(Q).split(/\s+/).filter(Boolean).slice(0,2);if(U.length)W+=`.${U.join(".")}`;let q=1,G=Q.previousElementSibling;while(G)q++,G=G.previousElementSibling;W+=`:nth-child(${q})`,Z.unshift(W),Q=Q.parentElement}return Z.join(" > ")}function GQ(J){let Z=[],Q=J;while(Q&&Q.nodeType===1&&Z.length<8){let $=Q.nodeName.toLowerCase(),z=Q.getAttribute?.("data-dc-element"),W=Q.getAttribute?.("data-dc-screen");if(z)$+=`[data-dc-element="${z}"]`;else if(W)$+=`[data-dc-screen="${W}"]`;else if(Q.id)$+=`#${Q.id}`;let U=e(Q).split(/\s+/).filter(Boolean).slice(0,2);if(U.length&&!z&&!W)$+=`.${U.join(".")}`;Z.unshift($),Q=Q.parentElement}return Z}function UQ(J,Z){return Z?`[data-dc-screen="${Z}"] [data-cd-id="${J}"]`:`[data-cd-id="${J}"]`}function KQ(J,Z,Q){if(!Q)return 0;try{let $=J.querySelectorAll(Z);for(let z=0;z<$.length;z++)if($[z]===Q)return z}catch{}return 0}var OJ=["display","flex-direction","align-items","justify-content","gap","font-family","color","font-size","font-weight","line-height","letter-spacing","text-align","margin","margin-top","margin-right","margin-bottom","margin-left","padding","padding-top","padding-right","padding-bottom","padding-left","width","height","max-width","background-color","border-radius","border-top-left-radius","border-top-right-radius","border-bottom-left-radius","border-bottom-right-radius","border-width","border-style","border-color","box-shadow","opacity"],XQ=/^(style|class|data-cd-id|data-dc-|data-dcid$)/;function YQ(J){if(!J||typeof window>"u"||!window.getComputedStyle)return{authored:{},computed:{},customStyles:{},attrs:{}};try{let Z=J.style,Q=window.getComputedStyle(J),$={},z={},W=new Set(OJ);for(let F of OJ){let D=Z.getPropertyValue(F);if(D)$[F]=D.trim();let K=Q.getPropertyValue(F);if(K)z[F]=K.trim()}let U=/^(margin|padding|border)(-|$)/,q={};for(let F=0;F<Z.length;F++){let D=Z.item(F);if(!D||W.has(D)||U.test(D))continue;let K=Z.getPropertyValue(D);if(K)q[D]=K.trim()}let G={};for(let F of Array.from(J.attributes)){if(XQ.test(F.name))continue;G[F.name]=F.value}return{authored:$,computed:z,customStyles:q,attrs:G}}catch{return{authored:{},computed:{},customStyles:{},attrs:{}}}}function TJ(J,Z){let Q=J.el,$=Q&&Q.getBoundingClientRect?Q.getBoundingClientRect():null,z=J.cdId,W=z?UQ(z,J.artboardId):J.artboardId?`[data-dc-screen="${J.artboardId}"]`:qQ(Q),U=z&&typeof document<"u"?KQ(document,W,Q):0;return{file:Z??t(),id:z??void 0,selector:W,artboardId:J.artboardId,index:U,tag:Q?.tagName.toLowerCase()??"",classes:e(Q),text:BQ(Q,240),dom_path:GQ(Q),bounds:$?{x:Math.round($.left),y:Math.round($.top),w:Math.round($.width),h:Math.round($.height)}:null,html:Q?(Q.outerHTML??"").slice(0,4000):"",...YQ(Q)}}import{useEffect as DQ}from"react";var FQ=new Set(["pen","highlighter","shape","rect","ellipse","arrow","sticky","text","section","eraser"]);function EJ(J){return FQ.has(J)}var JJ=(J)=>!!(J.metaKey||J.ctrlKey);function d(J){if(J.type==="keydown"){if(J.isEditable)return{kind:"no-op"};if(J.metaKey||J.ctrlKey||J.altKey){if(J.key==="Escape")return{kind:"escape"};let Q=(J.key||"").toLowerCase();if(!J.altKey&&(J.metaKey||J.ctrlKey)){if(Q==="z"&&J.shiftKey)return{kind:"redo"};if(Q==="z")return{kind:"undo"};if(Q==="y"&&!J.shiftKey)return{kind:"redo"}}return{kind:"no-op"}}let Z=(J.key||"").toLowerCase();if(Z==="v")return{kind:"tool",tool:"move"};if(Z==="h")return{kind:"tool",tool:"hand"};if(Z==="c")return{kind:"tool",tool:"comment"};if(Z==="b")return{kind:"tool",tool:"pen"};if(Z==="i")return{kind:"tool",tool:"highlighter"};if(Z==="r"||Z==="o")return{kind:"tool",tool:"shape"};if(Z==="a")return{kind:"tool",tool:"arrow"};if(Z==="n")return{kind:"tool",tool:"sticky"};if(Z==="t")return{kind:"tool",tool:"text"};if(Z==="s"&&J.shiftKey)return{kind:"tool",tool:"section"};if(Z==="e")return{kind:"tool",tool:"eraser"};if(J.key==="Escape")return{kind:"escape"};return{kind:"no-op"}}if(J.type==="contextmenu")return{kind:"context-menu",clientX:J.clientX??0,clientY:J.clientY??0};if(J.type==="pointermove"){if(EJ(J.activeTool))return{kind:"no-op"};if(J.activeTool==="hand")return{kind:"no-op"};if(J.activeTool==="comment")return{kind:"hover",deep:!0,clientX:J.clientX??0,clientY:J.clientY??0};if(!JJ(J))return{kind:"no-op"};return{kind:"hover",deep:!0,clientX:J.clientX??0,clientY:J.clientY??0}}if(J.type==="pointerdown"){if(J.button===2)return{kind:"context-menu",clientX:J.clientX??0,clientY:J.clientY??0};if(J.button===1||J.spaceHeld)return{kind:"no-op"};if(J.button!==0)return{kind:"no-op"};if(EJ(J.activeTool)&&!JJ(J))return{kind:"no-op"};if(J.activeTool==="comment")return{kind:"drop-comment",clientX:J.clientX??0,clientY:J.clientY??0};if(J.activeTool==="hand")return{kind:"no-op"};if(!JJ(J))return{kind:"no-op"};return{kind:"select",mode:!!J.shiftKey?"add":"replace",deep:!0,clientX:J.clientX??0,clientY:J.clientY??0}}return{kind:"no-op"}}function HQ(J){if(!J||!J.tagName)return!1;let Z=J,Q=Z.tagName;if(Q==="INPUT"||Q==="TEXTAREA"||Q==="SELECT")return!0;if(Z.isContentEditable)return!0;return!1}function QJ(J){if(!J||!J.closest)return!1;return!!J.closest(".cm-composer, .cm-thread, .cm-mention-popup, .cm-pin")}function wJ(J){let{hostRef:Z,getActiveTool:Q,isSpaceHeld:$,callbacks:z,enabled:W=!0,claimableActions:U}=J;DQ(()=>{if(!W)return;let q=Z.current;if(!q)return;let G=(V)=>U&&V.kind!=="no-op"&&!U.has(V.kind)?{kind:"no-op"}:V,F=(V)=>{switch(V.kind){case"hover":z.onHover?.(V);break;case"select":z.onSelect?.(V);break;case"drop-comment":z.onDropComment?.(V);break;case"context-menu":z.onContextMenu?.(V);break;case"tool":z.onTool?.(V);break;case"escape":z.onEscape?.();break;case"undo":z.onUndo?.();break;case"redo":z.onRedo?.();break;case"no-op":break}},D=(V)=>{let L=G(d({type:"pointermove",button:V.button,metaKey:V.metaKey,ctrlKey:V.ctrlKey,shiftKey:V.shiftKey,altKey:V.altKey,clientX:V.clientX,clientY:V.clientY,spaceHeld:$?.()??!1,activeTool:Q()}));F(L)},K=(V)=>{if(QJ(V.target))return;let L=G(d({type:"pointerdown",button:V.button,metaKey:V.metaKey,ctrlKey:V.ctrlKey,shiftKey:V.shiftKey,altKey:V.altKey,clientX:V.clientX,clientY:V.clientY,spaceHeld:$?.()??!1,activeTool:Q()}));if(L.kind!=="no-op")V.preventDefault(),V.stopImmediatePropagation();F(L)},X=(V)=>{if(QJ(V.target))return;if(G(d({type:"pointerdown",button:V.button,metaKey:V.metaKey,ctrlKey:V.ctrlKey,shiftKey:V.shiftKey,altKey:V.altKey,clientX:V.clientX,clientY:V.clientY,spaceHeld:$?.()??!1,activeTool:Q()})).kind!=="no-op")V.preventDefault(),V.stopImmediatePropagation()},Y=(V)=>{if(QJ(V.target))return;let L=Q(),B=V.metaKey||V.ctrlKey,H=L==="comment"?"drop-comment":L==="move"&&B&&V.button===0?"select":V.button===2?"context-menu":null;if(H&&(!U||U.has(H)))V.preventDefault(),V.stopImmediatePropagation()},j=(V)=>{let L=G(d({type:"contextmenu",clientX:V.clientX,clientY:V.clientY,metaKey:V.metaKey,ctrlKey:V.ctrlKey,shiftKey:V.shiftKey,altKey:V.altKey,activeTool:Q()}));if(L.kind==="no-op")return;V.preventDefault(),V.stopImmediatePropagation(),F(L)},_=(V)=>{let L=G(d({type:"keydown",key:V.key,metaKey:V.metaKey,ctrlKey:V.ctrlKey,shiftKey:V.shiftKey,altKey:V.altKey,isEditable:HQ(V.target),activeTool:Q()}));if(L.kind==="tool"||L.kind==="escape"||L.kind==="undo"||L.kind==="redo")V.preventDefault();F(L)};q.addEventListener("pointermove",D,{passive:!0}),q.addEventListener("pointerdown",K,{capture:!0}),q.addEventListener("mousedown",X,{capture:!0}),q.addEventListener("click",Y,{capture:!0}),q.addEventListener("contextmenu",j,{capture:!0});let I=q.ownerDocument??document;return I.addEventListener("keydown",_,!0),()=>{q.removeEventListener("pointermove",D),q.removeEventListener("pointerdown",K,{capture:!0}),q.removeEventListener("mousedown",X,{capture:!0}),q.removeEventListener("click",Y,{capture:!0}),q.removeEventListener("contextmenu",j,{capture:!0}),I.removeEventListener("keydown",_,!0)}},[W,Z,Q,$,z,U])}function ZJ(J,Z,Q,$){let z=J.elementFromPoint(Z,Q);if(!z)return null;if(z.closest?.(".dc-mm, .dc-zoom-tb, .dc-tool-palette, .dc-context-menu, .dc-cv-group-bbox"))return null;let W=z.closest?.("[data-dc-screen]")??null,U=W?.getAttribute("data-dc-screen")??null,q=z.closest?.(".dc-artboard-body")??null;if(!q){if(W&&U)return{el:W,cdId:null,artboardId:U};return null}if(z===q){if(W&&U)return{el:W,cdId:null,artboardId:U};return null}if($.deep){let X=z.getAttribute?.("data-cd-id")??null;return{el:z,cdId:X,artboardId:U}}let G=z,F=null;while(G&&G!==q){if(G.hasAttribute?.("data-cd-id"))F=G;G=G.parentElement}let D=F??z,K=D.getAttribute?.("data-cd-id")??null;return{el:D,cdId:K,artboardId:U}}import{createContext as OQ,useCallback as WJ,useContext as kJ,useEffect as TQ,useMemo as EQ,useState as BJ}from"react";function R(J,Z,Q,$){return`url("data:image/svg+xml,${encodeURIComponent(J.trim())}") ${Z} ${Q}, ${$}`}var VJ="width='24' height='24' viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'",zJ="#1f1f1f",$J="stroke='#ffffff' stroke-linejoin='round' stroke-linecap='round'";function C(J,Z,Q){let $=Q?`<g transform='${Q}'>`:"";return`<svg ${VJ}>${$}<path fill='#ffffff' d='${J}'/><path fill='${zJ}' d='${Z}'/>${Q?"</g>":""}</svg>`}var yJ="translate(0,32) scale(1,-1)",PQ=R(C("M10.25 8.25 L10.05 8.65 10 9 10 23.1 10.05 23.4 10.25 23.75 10.8 24 11.45 23.85 11.6 23.7 11.75 23.45 14.65 19.8 14.85 19.65 14.95 19.5 15.4 19.2 15.95 19.1 21.05 19.1 21.2 19.1 21.35 19.05 21.65 18.9 21.9 18.6 22 18.3 22 17.9 21.9 17.65 21.75 17.35 21.65 17.3 21.55 17.15 11.5 8.25 11.25 8.05 10.95 8 10.6 8.05 10.25 8.25 M9.15 6.6 L9.7 6.25 10 6.15 10.95 6 11.9 6.15 13 6.9 22.9 15.65 23 15.8 23.2 15.95 23.75 16.75 24 17.9 24 18.3 23.9 18.95 23.8 19.25 23.6 19.7 23.1 20.35 22.75 20.6 22.1 20.9 22.05 20.95 22 20.95 21.2 21.1 21.05 21.1 16.2 21.1 16.1 21.25 16.05 21.25 13.4 24.6 13.05 25.15 12.9 25.3 12.55 25.55 Q11.6 26.15 10.55 26 L10.5 26 Q9.65 25.85 9 25.3 L8.45 24.65 8.4 24.5 8.15 24.05 8 23.1 8 9 Q8 8.45 8.15 8.05 L8.25 7.75 8.45 7.35 9.15 6.6","M10.25 8.25 L10.6 8.05 10.95 8 11.25 8.05 11.5 8.25 21.55 17.15 21.65 17.3 21.75 17.35 21.9 17.65 22 17.9 22 18.3 21.9 18.6 21.65 18.9 21.35 19.05 21.2 19.1 21.05 19.1 15.95 19.1 15.4 19.2 14.95 19.5 14.85 19.65 14.65 19.8 11.75 23.45 11.6 23.7 11.45 23.85 10.8 24 10.25 23.75 10.05 23.4 10 23.1 10 9 10.05 8.65 10.25 8.25"),8,5,"default"),LQ=R(C("M28.55 17.8 Q29.4 20.3 28.75 22.8 L28.7 23 28.15 24.55 28.05 24.75 Q26.4 28.2 22.75 29.4 L22.45 29.5 18 29.9 17.75 29.85 Q15.8 29.25 13.8 28.1 L13.45 27.95 Q12 27.05 10.35 26.8 L10.25 26.75 7.9 26.7 7.8 26.7 Q6.1 26.9 4.8 25.8 L4.75 25.8 4.65 25.7 4.6 25.65 Q3.25 24.5 3.05 22.85 L3 22.75 Q2.8 20.95 4 19.5 5.05 18.15 6.75 17.95 L8.4 17.9 7.5 15.55 7.3 15.2 7.2 15 5 10.95 Q3.9 9.15 4.3 7.75 L4.4 7.5 Q4.75 6.15 6.45 5.2 9 3.65 11 5 11.05 4.1 11.5 3.45 12.15 2.1 14.2 1.6 L14.35 1.6 Q18.05 0.6 19.6 4.4 L19.65 4.55 Q20.75 3.65 22.7 3.75 L22.75 3.75 Q26.75 4 27 8.15 L27 8.25 27 8.35 27 8.45 Q26.9 10.75 27.1 12.6 27.15 14.65 28.2 16.75 L28.55 17.8 M26.65 18.4 L26.1 16.8 26.1 16.85 Q24.8 13.7 25 8.35 L25 8.25 Q24.85 5.9 22.6 5.75 20.7 5.65 20.4 7.35 L20.1 7.95 19.5 8.2 18.85 8.05 18.45 7.5 17.75 5.15 Q16.85 2.95 14.7 3.55 L14.65 3.55 Q12.55 4.05 13.15 6.15 L13.85 8.75 13.75 9.45 13.25 9.95 12.55 9.95 12 9.55 10.9 7.7 Q9.5 5.7 7.45 6.9 6.5 7.45 6.25 8.15 6.1 8.9 6.7 9.85 9.2 13.9 10.8 18.65 L10.8 19.3 10.4 19.8 9.75 19.95 Q8.35 19.8 6.95 19.95 6.1 20.05 5.55 20.75 4.9 21.55 5 22.55 5.15 23.55 6 24.2 L6.05 24.25 Q6.75 24.85 7.65 24.7 L7.7 24.7 10.65 24.8 Q12.7 25.15 14.45 26.2 L14.5 26.2 Q16.4 27.35 18.3 27.9 L22.05 27.5 22.1 27.5 Q24.95 26.55 26.25 23.85 L26.8 22.3 Q27.3 20.35 26.65 18.4","M26.65 18.4 Q27.3 20.35 26.8 22.3 L26.25 23.85 Q24.95 26.55 22.1 27.5 L22.05 27.5 18.3 27.9 Q16.4 27.35 14.5 26.2 L14.45 26.2 Q12.7 25.15 10.65 24.8 L7.7 24.7 7.65 24.7 Q6.75 24.85 6.05 24.25 L6 24.2 Q5.15 23.55 5 22.55 4.9 21.55 5.55 20.75 6.1 20.05 6.95 19.95 8.35 19.8 9.75 19.95 L10.4 19.8 10.8 19.3 10.8 18.65 Q9.2 13.9 6.7 9.85 6.1 8.9 6.25 8.15 6.5 7.45 7.45 6.9 9.5 5.7 10.9 7.7 L12 9.55 12.55 9.95 13.25 9.95 13.75 9.45 13.85 8.75 13.15 6.15 Q12.55 4.05 14.65 3.55 L14.7 3.55 Q16.85 2.95 17.75 5.15 L18.45 7.5 18.85 8.05 19.5 8.2 20.1 7.95 20.4 7.35 Q20.7 5.65 22.6 5.75 24.85 5.9 25 8.25 L25 8.35 Q24.8 13.7 26.1 16.85 L26.1 16.8 26.65 18.4"),12,12,"grab"),MQ=R(C("M28 14 Q28 9.85 24.45 6.9 20.95 4 16 4 11.05 4 7.5 6.9 L7.45 7 Q4 9.9 4 14 4 18.15 7.55 21.05 L7.5 21.05 Q9.2 22.45 11.2 23.2 L15.3 27.3 16 27.6 16.7 27.3 20.85 23.2 Q22.7 22.45 24.3 21.15 L24.45 21.05 Q28 18.15 28 14 M25.75 5.35 Q30.05 8.95 30 14 30.05 19.05 25.75 22.6 L25.4 22.85 Q23.8 24.1 22 24.9 L18.1 28.75 18.15 28.75 Q17.2 29.6 16 29.6 14.8 29.6 13.85 28.75 L13.9 28.75 10 24.9 6.6 22.85 6.25 22.6 Q1.95 19.05 2 14 1.95 8.95 6.25 5.35 10.3 2 16 2 21.7 2 25.75 5.35","M28 14 Q28 18.15 24.45 21.05 L24.3 21.15 Q22.7 22.45 20.85 23.2 L16.7 27.3 16 27.6 15.3 27.3 11.2 23.2 Q9.2 22.45 7.5 21.05 L7.55 21.05 Q4 18.15 4 14 4 9.9 7.45 7 L7.5 6.9 Q11.05 4 16 4 20.95 4 24.45 6.9 28 9.85 28 14"),12,21,"crosshair"),jQ=R(C("M4 13.1 L4 6 Q4 5.15 4.6 4.6 5.15 4 6 4 L13.1 4 Q13.95 4 14.55 4.6 L28.65 18.75 Q29.8 19.9 29.75 21.45 L29.75 21.6 29.75 21.7 Q29.75 23.2 28.7 24.35 L24.45 28.65 24.35 28.75 Q23.15 29.85 21.65 29.8 L21.55 29.8 21.4 29.8 Q20.2 29.8 19.25 29.15 L18 29.35 Q16.6 29.4 15.25 28 L15.2 27.95 8.2 20.95 Q7.6 20.35 7.6 19.55 7.6 18.7 8.2 18.1 L4.6 14.5 Q4 13.9 4 13.1 M19.5 26.65 L20.1 27.25 Q20.7 27.85 21.5 27.8 22.35 27.85 23 27.25 L27.25 22.95 Q27.8 22.35 27.75 21.55 27.8 20.75 27.2 20.15 L13.1 6 6 6 6 13.1 12.35 19.45 9.6 19.5 16.65 26.55 Q18.05 28.05 19.5 26.65 M8.05 12.3 L8 8 12.25 8.05 13.8 9.6 9.6 13.85 8.05 12.3 M15.25 11.05 L23 18.8 18.8 23.05 11.05 15.3 15.25 11.05","M15.25 11.05 L11.05 15.3 18.8 23.05 23 18.8 15.25 11.05 M12.35 19.45 L6 13.1 6 6 13.1 6 27.2 20.15 Q27.8 20.75 27.75 21.55 27.8 22.35 27.25 22.95 L23 27.25 Q22.35 27.85 21.5 27.8 20.7 27.85 20.1 27.25 L19.5 26.65 12.35 19.45 M8.05 12.3 L9.6 13.85 13.8 9.6 12.25 8.05 8 8 8.05 12.3",yJ),6,18,"crosshair"),NQ=R(C("M5.15 10.85 Q4 9.65 4 8.1 L4 7.95 4 7.85 Q3.95 6.2 5.1 5.15 6.25 4 7.85 4 L7.95 4 8.1 4 Q9.65 4 10.85 5.15 L11 5.3 14.3 5.25 Q15.15 5.25 15.75 5.85 L29.9 20 Q31 21.15 31 22.75 L31 22.85 31 23 Q31.05 24.5 29.9 25.7 L29.55 25.95 25.65 29.9 25.65 29.95 Q24.45 31.1 22.75 31.1 21.2 31.15 20 29.95 L5.85 15.8 Q5.25 15.2 5.25 14.35 L5.25 10.95 5.15 10.85 M19.95 24.2 L18.55 22.8 22.8 18.55 24.2 19.95 19.95 24.2 M28.45 21.4 L14.3 7.25 10.15 7.3 9.4 6.55 Q8.8 5.95 7.95 6 7.1 5.95 6.5 6.55 5.95 7.1 6 7.95 5.95 8.8 6.55 9.4 L7.25 10.1 7.25 14.35 21.4 28.5 Q22 29.1 22.75 29.1 23.6 29.1 24.2 28.5 L28.45 24.25 Q29.05 23.65 29 22.85 29.05 22 28.45 21.4 M9.25 13.5 L9.25 9.3 13.5 9.25 14.3 10.05 10.05 14.3 9.25 13.5 M17.15 21.4 L11.5 15.75 15.75 11.5 21.4 17.15 17.15 21.4","M17.15 21.4 L21.4 17.15 15.75 11.5 11.5 15.75 17.15 21.4 M28.45 21.4 Q29.05 22 29 22.85 29.05 23.65 28.45 24.25 L24.2 28.5 Q23.6 29.1 22.75 29.1 22 29.1 21.4 28.5 L7.25 14.35 7.25 10.1 6.55 9.4 Q5.95 8.8 6 7.95 5.95 7.1 6.5 6.55 7.1 5.95 7.95 6 8.8 5.95 9.4 6.55 L10.15 7.3 14.3 7.25 28.45 21.4 M19.95 24.2 L24.2 19.95 22.8 18.55 18.55 22.8 19.95 24.2 M9.25 13.5 L10.05 14.3 14.3 10.05 13.5 9.25 9.25 9.3 9.25 13.5",yJ),6,18,"crosshair"),r=R(C("M17 2 Q18.2 2 19.15 2.9 20 3.8 20 5 L20 12 27 12 Q28.2 12 29.15 12.9 30 13.8 30 15 L30 17 Q30 18.2 29.15 19.15 28.2 20 27 20 L20 20 20 27 Q20 28.2 19.15 29.15 18.2 30 17 30 L15 30 Q13.8 30 12.9 29.15 12 28.2 12 27 L12 20 5 20 Q3.8 20 2.9 19.15 2 18.2 2 17 L2 15 Q2 13.8 2.9 12.9 3.8 12 5 12 L12 12 12 5 Q12 3.8 12.9 2.9 13.8 2 15 2 L17 2 M14 27 L14.3 27.7 Q14.6 28 15 28 L17 28 17.7 27.7 18 27 18 18.05 18.05 18 27 18 Q27.4 18 27.7 17.7 L28 17 28 15 27.7 14.3 Q27.4 14 27 14 L18 14 18 5 17.7 4.3 17 4 15 4 Q14.6 4 14.3 4.3 14 4.6 14 5 L14 14 5 14 Q4.6 14 4.3 14.3 4 14.6 4 15 L4 17 Q4 17.4 4.3 17.7 4.6 18 5 18 L14 18 14 27","M14 27 L14 18 5 18 Q4.6 18 4.3 17.7 4 17.4 4 17 L4 15 Q4 14.6 4.3 14.3 4.6 14 5 14 L14 14 14 5 Q14 4.6 14.3 4.3 14.6 4 15 4 L17 4 17.7 4.3 18 5 18 14 27 14 Q27.4 14 27.7 14.3 L28 15 28 17 27.7 17.7 Q27.4 18 27 18 L18.05 18 18 18.05 18 27 17.7 27.7 17 28 15 28 Q14.6 28 14.3 27.7 L14 27"),12,12,"crosshair"),_Q=R(C("M3.9 11.35 Q2.3 12.5 3.7 13.9 L16.4 26.65 Q17.85 28.05 19.45 26.9 L27.65 21.15 Q29.3 20 27.85 18.6 L15.15 5.85 Q13.75 4.45 12.1 5.6 L3.9 11.35 M1.05 12.4 Q1 10.95 2.75 9.75 L10.95 4 10.95 3.95 Q14 1.85 16.6 4.45 L29.3 17.2 Q30.8 18.65 30.55 20.1 30.55 21.55 28.8 22.8 L20.6 28.55 20.65 28.55 Q17.7 30.65 15 28.1 L15 28.05 2.3 15.3 2.3 15.35 Q0.8 13.85 1.05 12.4 M13.5 7 L19.85 13.35 11.65 19.15 5.3 12.75 13.5 7","M13.5 7 L5.3 12.75 11.65 19.15 19.85 13.35 13.5 7 M3.9 11.35 L12.1 5.6 Q13.75 4.45 15.15 5.85 L27.85 18.6 Q29.3 20 27.65 21.15 L19.45 26.9 Q17.85 28.05 16.4 26.65 L3.7 13.9 Q2.3 12.5 3.9 11.35"),6,14,"cell"),IQ=R(`<svg ${VJ}><path d='M16 4V28M11 4H21M11 28H21' fill='none' ${$J} stroke-width='5'/><path d='M16 4V28M11 4H21M11 28H21' fill='none' stroke='${zJ}' stroke-width='2.25' stroke-linecap='round'/></svg>`,12,12,"text"),AQ=R(`<svg ${VJ}><path d='M6 5H21L26 10V27H6Z' fill='${zJ}' ${$J} stroke-width='2.5'/><path d='M21 5V11H26' fill='none' ${$J} stroke-width='2.25'/></svg>`,5,5,"crosshair"),w=Object.freeze({move:PQ,hand:LQ,comment:MQ,pen:jQ,section:r,highlighter:NQ,shape:r,rect:r,ellipse:r,sticky:AQ,arrow:r,text:IQ,eraser:_Q});import{jsx as qJ,Fragment as kQ}from"react/jsx-runtime";var wQ=Object.freeze([{id:"move",label:"Move",shortcut:"V",cursor:w.move},{id:"hand",label:"Hand",shortcut:"H",cursor:w.hand},{id:"comment",label:"Comment",shortcut:"C",cursor:w.comment},{id:"pen",label:"Pen",shortcut:"B",cursor:w.pen},{id:"highlighter",label:"Highlighter",shortcut:"I",cursor:w.highlighter},{id:"shape",label:"Shape",shortcut:"R",cursor:w.shape},{id:"sticky",label:"Sticky",shortcut:"N",cursor:w.sticky},{id:"section",label:"Section",shortcut:"⇧S",cursor:w.shape},{id:"arrow",label:"Arrow",shortcut:"A",cursor:w.arrow},{id:"text",label:"Text",shortcut:"T",cursor:w.text},{id:"eraser",label:"Eraser",shortcut:"E",cursor:w.eraser}]),GJ=OQ(null);function yQ({children:J,tools:Z=wQ,initial:Q="move"}){let[$,z]=BJ(Q),[W,U]=BJ(()=>({tool:null,locked:!1})),q=WJ((Y)=>{z(Y),U((j)=>j.locked&&j.tool===Y?j:{tool:null,locked:!1})},[]),G=WJ((Y)=>{U((j)=>{if(j.locked&&j.tool===Y)return{tool:null,locked:!1};return{tool:Y,locked:!0}}),z(Y)},[]),F=WJ(()=>{U({tool:null,locked:!1})},[]),[D,K]=BJ("rounded");TQ(()=>{if(typeof document>"u")return;let Y=Z.find((I)=>I.id===$);if(!Y)return;let j=document.body.style.cursor;document.body.style.cursor=Y.cursor;let _=document.getElementById("dc-tool-cursor");if(!_)_=document.createElement("style"),_.id="dc-tool-cursor",document.head.appendChild(_);if(_.textContent=`* { cursor: ${Y.cursor} !important; }`,typeof window<"u"&&window.parent&&window.parent!==window)try{window.parent.postMessage({dgn:"tool-cursor",tool:$},"*")}catch{}return()=>{document.body.style.cursor=j;let I=document.getElementById("dc-tool-cursor");if(I)I.textContent=""}},[$,Z]);let X=EQ(()=>({tool:$,setTool:q,tools:Z,sticky:W,toggleSticky:G,clearSticky:F,shapeKind:D,setShapeKind:K}),[$,q,Z,W,G,F,D]);return qJ(GJ.Provider,{value:X,children:J})}function bJ({children:J}){if(kJ(GJ))return qJ(kQ,{children:J});return qJ(yQ,{children:J})}function xJ(){let J=kJ(GJ);if(!J)throw Error("useToolMode must be used inside <ToolProvider>");return J}import{jsx as YJ,jsxs as uQ}from"react/jsx-runtime";var gQ=new Set(["drop-comment","tool","escape","hover"]);function XJ(){return typeof document<"u"&&!document.querySelector(".dc-canvas")}function gJ(J,Z){if(typeof document>"u")return null;let Q=document.elementFromPoint(J,Z);if(!Q)return null;if(Q.closest(".cm-composer, .cm-thread, .cm-mention-popup, .cm-pin, [data-mc-hover-halo]"))return null;let $=Q.tagName;if($==="HTML"||$==="BODY")return null;return Q}function CQ({children:J,file:Z}){let{tool:Q,setTool:$}=xJ(),z=LJ(),W=S(null),[U,q]=KJ(null),G=S(Q);G.current=Q;let F=vQ(()=>()=>G.current,[]);return p(()=>{if(Q!=="comment")q(null)},[Q]),p(()=>{let D=W.current;if(D)D.setAttribute("data-active-tool",Q);if(typeof document<"u"&&document.body)document.body.setAttribute("data-active-tool",Q);return()=>{D?.removeAttribute("data-active-tool")}},[Q]),p(()=>{if(typeof window>"u")return;let D=(K)=>{let X=K.data;if(!X||typeof X!=="object"||X.dgn!=="tool-set")return;if(typeof X.tool==="string")$(X.tool)};return window.addEventListener("message",D),()=>window.removeEventListener("message",D)},[$]),wJ({hostRef:W,getActiveTool:F,claimableActions:gQ,callbacks:{onHover:({clientX:D,clientY:K})=>{if(G.current!=="comment"||!XJ()){q(null);return}let X=gJ(D,K);q((Y)=>Y===X?Y:X)},onTool:({tool:D})=>$(D),onEscape:()=>{if(G.current!=="move")$("move");if(q(null),z.clear(),typeof window<"u")try{window.parent.postMessage({dgn:"force-clear"},"*")}catch{}},onDropComment:({clientX:D,clientY:K})=>hQ(D,K,z,Z)}}),uQ("div",{"data-mc-host":!0,ref:W,style:{display:"contents"},children:[J,U?YJ(SQ,{el:U}):null,YJ(IJ,{})]})}function SQ({el:J}){let Z=S(null),Q=S(J);Q.current=J;let $=S(null);return p(()=>{let z=()=>{$.current=null;let W=Z.current,U=Q.current;if(W&&U?.isConnected){let q=U.getBoundingClientRect();if(q.width===0&&q.height===0)W.style.display="none";else W.style.display="block",W.style.left=`${Math.round(q.left)}px`,W.style.top=`${Math.round(q.top)}px`,W.style.width=`${Math.round(q.width)}px`,W.style.height=`${Math.round(q.height)}px`}else if(W)W.style.display="none";$.current=requestAnimationFrame(z)};return $.current=requestAnimationFrame(z),()=>{if($.current!=null)cancelAnimationFrame($.current)}},[]),YJ("div",{ref:Z,"aria-hidden":"true","data-mc-hover-halo":"",style:{position:"fixed",display:"none",pointerEvents:"none",zIndex:2147483646,border:"2px solid var(--maude-hud-accent, #d63b1f)",borderRadius:"3px",boxSizing:"border-box"}})}function hQ(J,Z,Q,$){if(typeof document>"u")return;let z=ZJ(document,J,Z,{deep:!0});if(!z)z=ZJ(document,J,Z,{deep:!1});if(!z&&!XJ()&&typeof document.elementsFromPoint==="function"){let U=document.elementsFromPoint(J,Z);for(let q of U){let G=q.closest?.("[data-cd-id]");if(!G)continue;if(!G.closest(".dc-artboard-body"))continue;let F=G.closest("[data-dc-screen]");z={el:G,cdId:G.getAttribute("data-cd-id"),artboardId:F?.getAttribute("data-dc-screen")??null};break}}if(!z&&XJ()){let U=gJ(J,Z);if(U)z={el:U,cdId:U.getAttribute("data-cd-id"),artboardId:null}}if(!z){let U={file:$,id:void 0,selector:"",artboardId:null,tag:"",classes:"",text:"",dom_path:[],bounds:{x:J-12,y:Z-12,w:24,h:24},html:""};vJ(U,J,Z);return}let W=TJ(z,$);Q.replace(W),vJ(W,J,Z)}function vJ(J,Z,Q){if(typeof document<"u")try{document.dispatchEvent(new CustomEvent("cm:open-composer",{detail:{selection:J,clientX:Z,clientY:Q}}))}catch{}if(typeof window<"u")try{window.parent.postMessage({dgn:"comment-compose",selection:J},"*")}catch{}}function CJ(J,Z){return k(bJ,null,k(PJ,null,k(CQ,{file:Z},k(J))))}function kZ(J,Z){let Q=RQ(Z.rootEl);if(!Z.commentsEnabled){Q.render(k(J));return}let $=Z.file??t();Q.render(k(mQ,{initialCanvas:J,file:$}))}var RJ="__maudeCanvasRuntime";function fQ({Canvas:J,file:Z,onOk:Q}){return p(()=>{Q()},[]),CJ(J,Z)}class SJ extends bQ{state={hasError:!1};static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(){this.props.onError()}componentDidUpdate(J){if(J.attempt!==this.props.attempt&&this.state.hasError)this.setState({hasError:!1})}render(){if(this.state.hasError)return this.props.fallback();return this.props.children}}function pQ({message:J}){return k("div",{className:"dc-hmr-holding",role:"status","aria-live":"polite",title:J?`Holding last working render — ${J}`:"Holding last working render"},"⏸ build error — držím poslední funkční verzi")}function mQ({initialCanvas:J,file:Z}){let[{canvas:Q,attempt:$},z]=KJ({canvas:J,attempt:0}),[W,U]=KJ({on:!1}),q=S(null),G=S(Q);G.current=Q,p(()=>{let X={remount:(Y)=>z((j)=>({canvas:Y,attempt:j.attempt+1})),setHolding:(Y,j)=>U(Y?{on:!0,message:j}:{on:!1})};return window[RJ]=X,()=>{window[RJ]=void 0}},[]);let F=UJ(()=>{q.current=G.current,U((X)=>X.on?{on:!1}:X)},[]),D=UJ(()=>{U({on:!0,message:"render error"})},[]),K=UJ(()=>{let X=q.current;return X?CJ(X,Z):null},[Z]);return k(xQ,null,k(SJ,{attempt:$,onError:D,fallback:K},k(fQ,{key:$,Canvas:Q,file:Z,onOk:F})),W.on?k(pQ,{message:W.message}):null)}export{kZ as mountCanvas,SJ as CanvasErrorBoundary};