/ components / tasks / ShellDetailDialog.tsx
ShellDetailDialog.tsx
  1  import { c as _c } from "react/compiler-runtime";
  2  import React, { Suspense, use, useDeferredValue, useEffect, useState } from 'react';
  3  import type { DeepImmutable } from 'src/types/utils.js';
  4  import type { CommandResultDisplay } from '../../commands.js';
  5  import { useTerminalSize } from '../../hooks/useTerminalSize.js';
  6  import type { KeyboardEvent } from '../../ink/events/keyboard-event.js';
  7  import { Box, Text } from '../../ink.js';
  8  import { useKeybindings } from '../../keybindings/useKeybinding.js';
  9  import type { LocalShellTaskState } from '../../tasks/LocalShellTask/guards.js';
 10  import { formatDuration, formatFileSize, truncateToWidth } from '../../utils/format.js';
 11  import { tailFile } from '../../utils/fsOperations.js';
 12  import { getTaskOutputPath } from '../../utils/task/diskOutput.js';
 13  import { Byline } from '../design-system/Byline.js';
 14  import { Dialog } from '../design-system/Dialog.js';
 15  import { KeyboardShortcutHint } from '../design-system/KeyboardShortcutHint.js';
 16  type Props = {
 17    shell: DeepImmutable<LocalShellTaskState>;
 18    onDone: (result?: string, options?: {
 19      display?: CommandResultDisplay;
 20    }) => void;
 21    onKillShell?: () => void;
 22    onBack?: () => void;
 23  };
 24  const SHELL_DETAIL_TAIL_BYTES = 8192;
 25  type TaskOutputResult = {
 26    content: string;
 27    bytesTotal: number;
 28  };
 29  
 30  /**
 31   * Read the tail of the task output file. Only reads the last few KB,
 32   * not the entire file.
 33   */
 34  async function getTaskOutput(shell: DeepImmutable<LocalShellTaskState>): Promise<TaskOutputResult> {
 35    const path = getTaskOutputPath(shell.id);
 36    try {
 37      const result = await tailFile(path, SHELL_DETAIL_TAIL_BYTES);
 38      return {
 39        content: result.content,
 40        bytesTotal: result.bytesTotal
 41      };
 42    } catch {
 43      return {
 44        content: '',
 45        bytesTotal: 0
 46      };
 47    }
 48  }
 49  export function ShellDetailDialog(t0) {
 50    const $ = _c(57);
 51    const {
 52      shell,
 53      onDone,
 54      onKillShell,
 55      onBack
 56    } = t0;
 57    const {
 58      columns
 59    } = useTerminalSize();
 60    let t1;
 61    if ($[0] !== shell) {
 62      t1 = () => getTaskOutput(shell);
 63      $[0] = shell;
 64      $[1] = t1;
 65    } else {
 66      t1 = $[1];
 67    }
 68    const [outputPromise, setOutputPromise] = useState(t1);
 69    const deferredOutputPromise = useDeferredValue(outputPromise);
 70    let t2;
 71    if ($[2] !== shell) {
 72      t2 = () => {
 73        if (shell.status !== "running") {
 74          return;
 75        }
 76        const timer = setInterval(_temp, 1000, setOutputPromise, shell);
 77        return () => clearInterval(timer);
 78      };
 79      $[2] = shell;
 80      $[3] = t2;
 81    } else {
 82      t2 = $[3];
 83    }
 84    let t3;
 85    if ($[4] !== shell.id || $[5] !== shell.status) {
 86      t3 = [shell.id, shell.status];
 87      $[4] = shell.id;
 88      $[5] = shell.status;
 89      $[6] = t3;
 90    } else {
 91      t3 = $[6];
 92    }
 93    useEffect(t2, t3);
 94    let t4;
 95    if ($[7] !== onDone) {
 96      t4 = () => onDone("Shell details dismissed", {
 97        display: "system"
 98      });
 99      $[7] = onDone;
100      $[8] = t4;
101    } else {
102      t4 = $[8];
103    }
104    const handleClose = t4;
105    let t5;
106    if ($[9] !== handleClose) {
107      t5 = {
108        "confirm:yes": handleClose
109      };
110      $[9] = handleClose;
111      $[10] = t5;
112    } else {
113      t5 = $[10];
114    }
115    let t6;
116    if ($[11] === Symbol.for("react.memo_cache_sentinel")) {
117      t6 = {
118        context: "Confirmation"
119      };
120      $[11] = t6;
121    } else {
122      t6 = $[11];
123    }
124    useKeybindings(t5, t6);
125    let t7;
126    if ($[12] !== onBack || $[13] !== onDone || $[14] !== onKillShell || $[15] !== shell.status) {
127      t7 = e => {
128        if (e.key === " ") {
129          e.preventDefault();
130          onDone("Shell details dismissed", {
131            display: "system"
132          });
133        } else {
134          if (e.key === "left" && onBack) {
135            e.preventDefault();
136            onBack();
137          } else {
138            if (e.key === "x" && shell.status === "running" && onKillShell) {
139              e.preventDefault();
140              onKillShell();
141            }
142          }
143        }
144      };
145      $[12] = onBack;
146      $[13] = onDone;
147      $[14] = onKillShell;
148      $[15] = shell.status;
149      $[16] = t7;
150    } else {
151      t7 = $[16];
152    }
153    const handleKeyDown = t7;
154    const isMonitor = shell.kind === "monitor";
155    let t8;
156    if ($[17] !== shell.command) {
157      t8 = truncateToWidth(shell.command, 280);
158      $[17] = shell.command;
159      $[18] = t8;
160    } else {
161      t8 = $[18];
162    }
163    const displayCommand = t8;
164    const t9 = isMonitor ? "Monitor details" : "Shell details";
165    let t10;
166    if ($[19] !== onBack || $[20] !== onKillShell || $[21] !== shell.status) {
167      t10 = exitState => exitState.pending ? <Text>Press {exitState.keyName} again to exit</Text> : <Byline>{onBack && <KeyboardShortcutHint shortcut={"\u2190"} action="go back" />}<KeyboardShortcutHint shortcut="Esc/Enter/Space" action="close" />{shell.status === "running" && onKillShell && <KeyboardShortcutHint shortcut="x" action="stop" />}</Byline>;
168      $[19] = onBack;
169      $[20] = onKillShell;
170      $[21] = shell.status;
171      $[22] = t10;
172    } else {
173      t10 = $[22];
174    }
175    let t11;
176    if ($[23] === Symbol.for("react.memo_cache_sentinel")) {
177      t11 = <Text bold={true}>Status:</Text>;
178      $[23] = t11;
179    } else {
180      t11 = $[23];
181    }
182    let t12;
183    if ($[24] !== shell.result || $[25] !== shell.status) {
184      t12 = <Text>{t11}{" "}{shell.status === "running" ? <Text color="background">{shell.status}{shell.result?.code !== undefined && ` (exit code: ${shell.result.code})`}</Text> : shell.status === "completed" ? <Text color="success">{shell.status}{shell.result?.code !== undefined && ` (exit code: ${shell.result.code})`}</Text> : <Text color="error">{shell.status}{shell.result?.code !== undefined && ` (exit code: ${shell.result.code})`}</Text>}</Text>;
185      $[24] = shell.result;
186      $[25] = shell.status;
187      $[26] = t12;
188    } else {
189      t12 = $[26];
190    }
191    let t13;
192    if ($[27] === Symbol.for("react.memo_cache_sentinel")) {
193      t13 = <Text bold={true}>Runtime:</Text>;
194      $[27] = t13;
195    } else {
196      t13 = $[27];
197    }
198    let t14;
199    if ($[28] !== shell.endTime) {
200      t14 = shell.endTime ?? Date.now();
201      $[28] = shell.endTime;
202      $[29] = t14;
203    } else {
204      t14 = $[29];
205    }
206    const t15 = t14 - shell.startTime;
207    let t16;
208    if ($[30] !== t15) {
209      t16 = formatDuration(t15);
210      $[30] = t15;
211      $[31] = t16;
212    } else {
213      t16 = $[31];
214    }
215    let t17;
216    if ($[32] !== t16) {
217      t17 = <Text>{t13}{" "}{t16}</Text>;
218      $[32] = t16;
219      $[33] = t17;
220    } else {
221      t17 = $[33];
222    }
223    const t18 = isMonitor ? "Script:" : "Command:";
224    let t19;
225    if ($[34] !== t18) {
226      t19 = <Text bold={true}>{t18}</Text>;
227      $[34] = t18;
228      $[35] = t19;
229    } else {
230      t19 = $[35];
231    }
232    let t20;
233    if ($[36] !== displayCommand || $[37] !== t19) {
234      t20 = <Text wrap="wrap">{t19}{" "}{displayCommand}</Text>;
235      $[36] = displayCommand;
236      $[37] = t19;
237      $[38] = t20;
238    } else {
239      t20 = $[38];
240    }
241    let t21;
242    if ($[39] !== t12 || $[40] !== t17 || $[41] !== t20) {
243      t21 = <Box flexDirection="column">{t12}{t17}{t20}</Box>;
244      $[39] = t12;
245      $[40] = t17;
246      $[41] = t20;
247      $[42] = t21;
248    } else {
249      t21 = $[42];
250    }
251    let t22;
252    if ($[43] === Symbol.for("react.memo_cache_sentinel")) {
253      t22 = <Text bold={true}>Output:</Text>;
254      $[43] = t22;
255    } else {
256      t22 = $[43];
257    }
258    let t23;
259    if ($[44] === Symbol.for("react.memo_cache_sentinel")) {
260      t23 = <Text dimColor={true}>Loading output…</Text>;
261      $[44] = t23;
262    } else {
263      t23 = $[44];
264    }
265    let t24;
266    if ($[45] !== columns || $[46] !== deferredOutputPromise) {
267      t24 = <Box flexDirection="column">{t22}<Suspense fallback={t23}><ShellOutputContent outputPromise={deferredOutputPromise} columns={columns} /></Suspense></Box>;
268      $[45] = columns;
269      $[46] = deferredOutputPromise;
270      $[47] = t24;
271    } else {
272      t24 = $[47];
273    }
274    let t25;
275    if ($[48] !== handleClose || $[49] !== t10 || $[50] !== t21 || $[51] !== t24 || $[52] !== t9) {
276      t25 = <Dialog title={t9} onCancel={handleClose} color="background" inputGuide={t10}>{t21}{t24}</Dialog>;
277      $[48] = handleClose;
278      $[49] = t10;
279      $[50] = t21;
280      $[51] = t24;
281      $[52] = t9;
282      $[53] = t25;
283    } else {
284      t25 = $[53];
285    }
286    let t26;
287    if ($[54] !== handleKeyDown || $[55] !== t25) {
288      t26 = <Box flexDirection="column" tabIndex={0} autoFocus={true} onKeyDown={handleKeyDown}>{t25}</Box>;
289      $[54] = handleKeyDown;
290      $[55] = t25;
291      $[56] = t26;
292    } else {
293      t26 = $[56];
294    }
295    return t26;
296  }
297  function _temp(setOutputPromise_0, shell_0) {
298    return setOutputPromise_0(getTaskOutput(shell_0));
299  }
300  type ShellOutputContentProps = {
301    outputPromise: Promise<TaskOutputResult>;
302    columns: number;
303  };
304  function ShellOutputContent(t0) {
305    const $ = _c(19);
306    const {
307      outputPromise,
308      columns
309    } = t0;
310    const {
311      content,
312      bytesTotal
313    } = use(outputPromise);
314    if (!content) {
315      let t1;
316      if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
317        t1 = <Text dimColor={true}>No output available</Text>;
318        $[0] = t1;
319      } else {
320        t1 = $[0];
321      }
322      return t1;
323    }
324    let isIncomplete;
325    let rendered;
326    if ($[1] !== bytesTotal || $[2] !== content) {
327      const starts = [];
328      let pos = content.length;
329      for (let i = 0; i < 10 && pos > 0; i++) {
330        const prev = content.lastIndexOf("\n", pos - 1);
331        starts.push(prev + 1);
332        pos = prev;
333      }
334      starts.reverse();
335      isIncomplete = bytesTotal > content.length;
336      rendered = [];
337      for (let i_0 = 0; i_0 < starts.length; i_0++) {
338        const start = starts[i_0];
339        const end = i_0 < starts.length - 1 ? starts[i_0 + 1] - 1 : content.length;
340        const line = content.slice(start, end);
341        if (line) {
342          rendered.push(line);
343        }
344      }
345      $[1] = bytesTotal;
346      $[2] = content;
347      $[3] = isIncomplete;
348      $[4] = rendered;
349    } else {
350      isIncomplete = $[3];
351      rendered = $[4];
352    }
353    const t1 = columns - 6;
354    let t2;
355    if ($[5] !== rendered) {
356      t2 = rendered.map(_temp2);
357      $[5] = rendered;
358      $[6] = t2;
359    } else {
360      t2 = $[6];
361    }
362    let t3;
363    if ($[7] !== t1 || $[8] !== t2) {
364      t3 = <Box borderStyle="round" paddingX={1} flexDirection="column" height={12} maxWidth={t1}>{t2}</Box>;
365      $[7] = t1;
366      $[8] = t2;
367      $[9] = t3;
368    } else {
369      t3 = $[9];
370    }
371    const t4 = `Showing ${rendered.length} lines`;
372    let t5;
373    if ($[10] !== bytesTotal || $[11] !== isIncomplete) {
374      t5 = isIncomplete ? ` of ${formatFileSize(bytesTotal)}` : "";
375      $[10] = bytesTotal;
376      $[11] = isIncomplete;
377      $[12] = t5;
378    } else {
379      t5 = $[12];
380    }
381    let t6;
382    if ($[13] !== t4 || $[14] !== t5) {
383      t6 = <Text dimColor={true} italic={true}>{t4}{t5}</Text>;
384      $[13] = t4;
385      $[14] = t5;
386      $[15] = t6;
387    } else {
388      t6 = $[15];
389    }
390    let t7;
391    if ($[16] !== t3 || $[17] !== t6) {
392      t7 = <>{t3}{t6}</>;
393      $[16] = t3;
394      $[17] = t6;
395      $[18] = t7;
396    } else {
397      t7 = $[18];
398    }
399    return t7;
400  }
401  function _temp2(line_0, i_1) {
402    return <Text key={i_1} wrap="truncate-end">{line_0}</Text>;
403  }
404  //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIlN1c3BlbnNlIiwidXNlIiwidXNlRGVmZXJyZWRWYWx1ZSIsInVzZUVmZmVjdCIsInVzZVN0YXRlIiwiRGVlcEltbXV0YWJsZSIsIkNvbW1hbmRSZXN1bHREaXNwbGF5IiwidXNlVGVybWluYWxTaXplIiwiS2V5Ym9hcmRFdmVudCIsIkJveCIsIlRleHQiLCJ1c2VLZXliaW5kaW5ncyIsIkxvY2FsU2hlbGxUYXNrU3RhdGUiLCJmb3JtYXREdXJhdGlvbiIsImZvcm1hdEZpbGVTaXplIiwidHJ1bmNhdGVUb1dpZHRoIiwidGFpbEZpbGUiLCJnZXRUYXNrT3V0cHV0UGF0aCIsIkJ5bGluZSIsIkRpYWxvZyIsIktleWJvYXJkU2hvcnRjdXRIaW50IiwiUHJvcHMiLCJzaGVsbCIsIm9uRG9uZSIsInJlc3VsdCIsIm9wdGlvbnMiLCJkaXNwbGF5Iiwib25LaWxsU2hlbGwiLCJvbkJhY2siLCJTSEVMTF9ERVRBSUxfVEFJTF9CWVRFUyIsIlRhc2tPdXRwdXRSZXN1bHQiLCJjb250ZW50IiwiYnl0ZXNUb3RhbCIsImdldFRhc2tPdXRwdXQiLCJQcm9taXNlIiwicGF0aCIsImlkIiwiU2hlbGxEZXRhaWxEaWFsb2ciLCJ0MCIsIiQiLCJfYyIsImNvbHVtbnMiLCJ0MSIsIm91dHB1dFByb21pc2UiLCJzZXRPdXRwdXRQcm9taXNlIiwiZGVmZXJyZWRPdXRwdXRQcm9taXNlIiwidDIiLCJzdGF0dXMiLCJ0aW1lciIsInNldEludGVydmFsIiwiX3RlbXAiLCJjbGVhckludGVydmFsIiwidDMiLCJ0NCIsImhhbmRsZUNsb3NlIiwidDUiLCJ0NiIsIlN5bWJvbCIsImZvciIsImNvbnRleHQiLCJ0NyIsImUiLCJrZXkiLCJwcmV2ZW50RGVmYXVsdCIsImhhbmRsZUtleURvd24iLCJpc01vbml0b3IiLCJraW5kIiwidDgiLCJjb21tYW5kIiwiZGlzcGxheUNvbW1hbmQiLCJ0OSIsInQxMCIsImV4aXRTdGF0ZSIsInBlbmRpbmciLCJrZXlOYW1lIiwidDExIiwidDEyIiwiY29kZSIsInVuZGVmaW5lZCIsInQxMyIsInQxNCIsImVuZFRpbWUiLCJEYXRlIiwibm93IiwidDE1Iiwic3RhcnRUaW1lIiwidDE2IiwidDE3IiwidDE4IiwidDE5IiwidDIwIiwidDIxIiwidDIyIiwidDIzIiwidDI0IiwidDI1IiwidDI2Iiwic2V0T3V0cHV0UHJvbWlzZV8wIiwic2hlbGxfMCIsIlNoZWxsT3V0cHV0Q29udGVudFByb3BzIiwiU2hlbGxPdXRwdXRDb250ZW50IiwiaXNJbmNvbXBsZXRlIiwicmVuZGVyZWQiLCJzdGFydHMiLCJwb3MiLCJsZW5ndGgiLCJpIiwicHJldiIsImxhc3RJbmRleE9mIiwicHVzaCIsInJldmVyc2UiLCJpXzAiLCJzdGFydCIsImVuZCIsImxpbmUiLCJzbGljZSIsIm1hcCIsIl90ZW1wMiIsImxpbmVfMCIsImlfMSJdLCJzb3VyY2VzIjpbIlNoZWxsRGV0YWlsRGlhbG9nLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHtcbiAgU3VzcGVuc2UsXG4gIHVzZSxcbiAgdXNlRGVmZXJyZWRWYWx1ZSxcbiAgdXNlRWZmZWN0LFxuICB1c2VTdGF0ZSxcbn0gZnJvbSAncmVhY3QnXG5pbXBvcnQgdHlwZSB7IERlZXBJbW11dGFibGUgfSBmcm9tICdzcmMvdHlwZXMvdXRpbHMuanMnXG5pbXBvcnQgdHlwZSB7IENvbW1hbmRSZXN1bHREaXNwbGF5IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMuanMnXG5pbXBvcnQgeyB1c2VUZXJtaW5hbFNpemUgfSBmcm9tICcuLi8uLi9ob29rcy91c2VUZXJtaW5hbFNpemUuanMnXG5pbXBvcnQgdHlwZSB7IEtleWJvYXJkRXZlbnQgfSBmcm9tICcuLi8uLi9pbmsvZXZlbnRzL2tleWJvYXJkLWV2ZW50LmpzJ1xuaW1wb3J0IHsgQm94LCBUZXh0IH0gZnJvbSAnLi4vLi4vaW5rLmpzJ1xuaW1wb3J0IHsgdXNlS2V5YmluZGluZ3MgfSBmcm9tICcuLi8uLi9rZXliaW5kaW5ncy91c2VLZXliaW5kaW5nLmpzJ1xuaW1wb3J0IHR5cGUgeyBMb2NhbFNoZWxsVGFza1N0YXRlIH0gZnJvbSAnLi4vLi4vdGFza3MvTG9jYWxTaGVsbFRhc2svZ3VhcmRzLmpzJ1xuaW1wb3J0IHtcbiAgZm9ybWF0RHVyYXRpb24sXG4gIGZvcm1hdEZpbGVTaXplLFxuICB0cnVuY2F0ZVRvV2lkdGgsXG59IGZyb20gJy4uLy4uL3V0aWxzL2Zvcm1hdC5qcydcbmltcG9ydCB7IHRhaWxGaWxlIH0gZnJvbSAnLi4vLi4vdXRpbHMvZnNPcGVyYXRpb25zLmpzJ1xuaW1wb3J0IHsgZ2V0VGFza091dHB1dFBhdGggfSBmcm9tICcuLi8uLi91dGlscy90YXNrL2Rpc2tPdXRwdXQuanMnXG5pbXBvcnQgeyBCeWxpbmUgfSBmcm9tICcuLi9kZXNpZ24tc3lzdGVtL0J5bGluZS5qcydcbmltcG9ydCB7IERpYWxvZyB9IGZyb20gJy4uL2Rlc2lnbi1zeXN0ZW0vRGlhbG9nLmpzJ1xuaW1wb3J0IHsgS2V5Ym9hcmRTaG9ydGN1dEhpbnQgfSBmcm9tICcuLi9kZXNpZ24tc3lzdGVtL0tleWJvYXJkU2hvcnRjdXRIaW50LmpzJ1xuXG50eXBlIFByb3BzID0ge1xuICBzaGVsbDogRGVlcEltbXV0YWJsZTxMb2NhbFNoZWxsVGFza1N0YXRlPlxuICBvbkRvbmU6IChcbiAgICByZXN1bHQ/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHsgZGlzcGxheT86IENvbW1hbmRSZXN1bHREaXNwbGF5IH0sXG4gICkgPT4gdm9pZFxuICBvbktpbGxTaGVsbD86ICgpID0+IHZvaWRcbiAgb25CYWNrPzogKCkgPT4gdm9pZFxufVxuXG5jb25zdCBTSEVMTF9ERVRBSUxfVEFJTF9CWVRFUyA9IDgxOTJcblxudHlwZSBUYXNrT3V0cHV0UmVzdWx0ID0ge1xuICBjb250ZW50OiBzdHJpbmdcbiAgYnl0ZXNUb3RhbDogbnVtYmVyXG59XG5cbi8qKlxuICogUmVhZCB0aGUgdGFpbCBvZiB0aGUgdGFzayBvdXRwdXQgZmlsZS4gT25seSByZWFkcyB0aGUgbGFzdCBmZXcgS0IsXG4gKiBub3QgdGhlIGVudGlyZSBmaWxlLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRUYXNrT3V0cHV0KFxuICBzaGVsbDogRGVlcEltbXV0YWJsZTxMb2NhbFNoZWxsVGFza1N0YXRlPixcbik6IFByb21pc2U8VGFza091dHB1dFJlc3VsdD4ge1xuICBjb25zdCBwYXRoID0gZ2V0VGFza091dHB1dFBhdGgoc2hlbGwuaWQpXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGFpbEZpbGUocGF0aCwgU0hFTExfREVUQUlMX1RBSUxfQllURVMpXG4gICAgcmV0dXJuIHsgY29udGVudDogcmVzdWx0LmNvbnRlbnQsIGJ5dGVzVG90YWw6IHJlc3VsdC5ieXRlc1RvdGFsIH1cbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHsgY29udGVudDogJycsIGJ5dGVzVG90YWw6IDAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBTaGVsbERldGFpbERpYWxvZyh7XG4gIHNoZWxsLFxuICBvbkRvbmUsXG4gIG9uS2lsbFNoZWxsLFxuICBvbkJhY2ssXG59OiBQcm9wcyk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGNvbnN0IHsgY29sdW1ucyB9ID0gdXNlVGVybWluYWxTaXplKClcblxuICAvLyBQcm9taXNlIGNyZWF0ZWQgaW4gaW5pdGlhbGl6ZXIgKG5vdCBkdXJpbmcgcmVuZGVyKS4gRm9yIHJ1bm5pbmcgc2hlbGxzLFxuICAvLyB0aGUgZWZmZWN0IHRpbWVyIHJlcGxhY2VzIGl0IHBlcmlvZGljYWxseSB0byBwaWNrIHVwIG5ldyBvdXRwdXQuXG4gIC8vIHVzZURlZmVycmVkVmFsdWUga2VlcHMgc2hvd2luZyB0aGUgcHJldmlvdXMgb3V0cHV0IHdoaWxlIHRoZSBuZXcgcHJvbWlzZVxuICAvLyByZXNvbHZlcywgcHJldmVudGluZyB0aGUgU3VzcGVuc2UgZmFsbGJhY2sgZnJvbSBmbGlja2VyaW5nLlxuICBjb25zdCBbb3V0cHV0UHJvbWlzZSwgc2V0T3V0cHV0UHJvbWlzZV0gPSB1c2VTdGF0ZTxQcm9taXNlPFRhc2tPdXRwdXRSZXN1bHQ+PihcbiAgICAoKSA9PiBnZXRUYXNrT3V0cHV0KHNoZWxsKSxcbiAgKVxuICBjb25zdCBkZWZlcnJlZE91dHB1dFByb21pc2UgPSB1c2VEZWZlcnJlZFZhbHVlKG91dHB1dFByb21pc2UpXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoc2hlbGwuc3RhdHVzICE9PSAncnVubmluZycpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCB0aW1lciA9IHNldEludGVydmFsKFxuICAgICAgKHNldE91dHB1dFByb21pc2UsIHNoZWxsKSA9PiBzZXRPdXRwdXRQcm9taXNlKGdldFRhc2tPdXRwdXQoc2hlbGwpKSxcbiAgICAgIDEwMDAsXG4gICAgICBzZXRPdXRwdXRQcm9taXNlLFxuICAgICAgc2hlbGwsXG4gICAgKVxuICAgIHJldHVybiAoKSA9PiBjbGVhckludGVydmFsKHRpbWVyKVxuICB9LCBbc2hlbGwuaWQsIHNoZWxsLnN0YXR1c10pXG5cbiAgLy8gSGFuZGxlIHN0YW5kYXJkIGNsb3NlIGFjdGlvblxuICBjb25zdCBoYW5kbGVDbG9zZSA9ICgpID0+XG4gICAgb25Eb25lKCdTaGVsbCBkZXRhaWxzIGRpc21pc3NlZCcsIHsgZGlzcGxheTogJ3N5c3RlbScgfSlcblxuICAvLyBIYW5kbGUgYWRkaXRpb25hbCBjbG9zZSBhY3Rpb25zIGJleW9uZCBEaWFsb2cncyBidWlsdC1pbiBFc2MgaGFuZGxlclxuICB1c2VLZXliaW5kaW5ncyhcbiAgICB7XG4gICAgICAnY29uZmlybTp5ZXMnOiBoYW5kbGVDbG9zZSxcbiAgICB9LFxuICAgIHsgY29udGV4dDogJ0NvbmZpcm1hdGlvbicgfSxcbiAgKVxuXG4gIC8vIEhhbmRsZSBkaWFsb2ctc3BlY2lmaWMga2V5c1xuICBjb25zdCBoYW5kbGVLZXlEb3duID0gKGU6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICBpZiAoZS5rZXkgPT09ICcgJykge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICBvbkRvbmUoJ1NoZWxsIGRldGFpbHMgZGlzbWlzc2VkJywgeyBkaXNwbGF5OiAnc3lzdGVtJyB9KVxuICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICdsZWZ0JyAmJiBvbkJhY2spIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgb25CYWNrKClcbiAgICB9IGVsc2UgaWYgKGUua2V5ID09PSAneCcgJiYgc2hlbGwuc3RhdHVzID09PSAncnVubmluZycgJiYgb25LaWxsU2hlbGwpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgb25LaWxsU2hlbGwoKVxuICAgIH1cbiAgfVxuXG4gIC8vIFRydW5jYXRlIGNvbW1hbmQgaWYgdG9vIGxvbmcgKGZvciBkaXNwbGF5IHB1cnBvc2VzKVxuICBjb25zdCBpc01vbml0b3IgPSBzaGVsbC5raW5kID09PSAnbW9uaXRvcidcbiAgY29uc3QgZGlzcGxheUNvbW1hbmQgPSB0cnVuY2F0ZVRvV2lkdGgoc2hlbGwuY29tbWFuZCwgMjgwKVxuXG4gIHJldHVybiAoXG4gICAgPEJveFxuICAgICAgZmxleERpcmVjdGlvbj1cImNvbHVtblwiXG4gICAgICB0YWJJbmRleD17MH1cbiAgICAgIGF1dG9Gb2N1c1xuICAgICAgb25LZXlEb3duPXtoYW5kbGVLZXlEb3dufVxuICAgID5cbiAgICAgIDxEaWFsb2dcbiAgICAgICAgdGl0bGU9e2lzTW9uaXRvciA/ICdNb25pdG9yIGRldGFpbHMnIDogJ1NoZWxsIGRldGFpbHMnfVxuICAgICAgICBvbkNhbmNlbD17aGFuZGxlQ2xvc2V9XG4gICAgICAgIGNvbG9yPVwiYmFja2dyb3VuZFwiXG4gICAgICAgIGlucHV0R3VpZGU9e2V4aXRTdGF0ZSA9PlxuICAgICAgICAgIGV4aXRTdGF0ZS5wZW5kaW5nID8gKFxuICAgICAgICAgICAgPFRleHQ+UHJlc3Mge2V4aXRTdGF0ZS5rZXlOYW1lfSBhZ2FpbiB0byBleGl0PC9UZXh0PlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8QnlsaW5lPlxuICAgICAgICAgICAgICB7b25CYWNrICYmIDxLZXlib2FyZFNob3J0Y3V0SGludCBzaG9ydGN1dD1cIuKGkFwiIGFjdGlvbj1cImdvIGJhY2tcIiAvPn1cbiAgICAgICAgICAgICAgPEtleWJvYXJkU2hvcnRjdXRIaW50IHNob3J0Y3V0PVwiRXNjL0VudGVyL1NwYWNlXCIgYWN0aW9uPVwiY2xvc2VcIiAvPlxuICAgICAgICAgICAgICB7c2hlbGwuc3RhdHVzID09PSAncnVubmluZycgJiYgb25LaWxsU2hlbGwgJiYgKFxuICAgICAgICAgICAgICAgIDxLZXlib2FyZFNob3J0Y3V0SGludCBzaG9ydGN1dD1cInhcIiBhY3Rpb249XCJzdG9wXCIgLz5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvQnlsaW5lPlxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgPlxuICAgICAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIj5cbiAgICAgICAgICA8VGV4dD5cbiAgICAgICAgICAgIDxUZXh0IGJvbGQ+U3RhdHVzOjwvVGV4dD57JyAnfVxuICAgICAgICAgICAge3NoZWxsLnN0YXR1cyA9PT0gJ3J1bm5pbmcnID8gKFxuICAgICAgICAgICAgICA8VGV4dCBjb2xvcj1cImJhY2tncm91bmRcIj5cbiAgICAgICAgICAgICAgICB7c2hlbGwuc3RhdHVzfVxuICAgICAgICAgICAgICAgIHtzaGVsbC5yZXN1bHQ/LmNvZGUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgYCAoZXhpdCBjb2RlOiAke3NoZWxsLnJlc3VsdC5jb2RlfSlgfVxuICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICApIDogc2hlbGwuc3RhdHVzID09PSAnY29tcGxldGVkJyA/IChcbiAgICAgICAgICAgICAgPFRleHQgY29sb3I9XCJzdWNjZXNzXCI+XG4gICAgICAgICAgICAgICAge3NoZWxsLnN0YXR1c31cbiAgICAgICAgICAgICAgICB7c2hlbGwucmVzdWx0Py5jb2RlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgIGAgKGV4aXQgY29kZTogJHtzaGVsbC5yZXN1bHQuY29kZX0pYH1cbiAgICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgPFRleHQgY29sb3I9XCJlcnJvclwiPlxuICAgICAgICAgICAgICAgIHtzaGVsbC5zdGF0dXN9XG4gICAgICAgICAgICAgICAge3NoZWxsLnJlc3VsdD8uY29kZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICBgIChleGl0IGNvZGU6ICR7c2hlbGwucmVzdWx0LmNvZGV9KWB9XG4gICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgIDxUZXh0PlxuICAgICAgICAgICAgPFRleHQgYm9sZD5SdW50aW1lOjwvVGV4dD57JyAnfVxuICAgICAgICAgICAge2Zvcm1hdER1cmF0aW9uKChzaGVsbC5lbmRUaW1lID8/IERhdGUubm93KCkpIC0gc2hlbGwuc3RhcnRUaW1lKX1cbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgPFRleHQgd3JhcD1cIndyYXBcIj5cbiAgICAgICAgICAgIDxUZXh0IGJvbGQ+e2lzTW9uaXRvciA/ICdTY3JpcHQ6JyA6ICdDb21tYW5kOid9PC9UZXh0PnsnICd9XG4gICAgICAgICAgICB7ZGlzcGxheUNvbW1hbmR9XG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICA8L0JveD5cblxuICAgICAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIj5cbiAgICAgICAgICA8VGV4dCBib2xkPk91dHB1dDo8L1RleHQ+XG4gICAgICAgICAgPFN1c3BlbnNlIGZhbGxiYWNrPXs8VGV4dCBkaW1Db2xvcj5Mb2FkaW5nIG91dHB1dOKApjwvVGV4dD59PlxuICAgICAgICAgICAgPFNoZWxsT3V0cHV0Q29udGVudFxuICAgICAgICAgICAgICBvdXRwdXRQcm9taXNlPXtkZWZlcnJlZE91dHB1dFByb21pc2V9XG4gICAgICAgICAgICAgIGNvbHVtbnM9e2NvbHVtbnN9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvU3VzcGVuc2U+XG4gICAgICAgIDwvQm94PlxuICAgICAgPC9EaWFsb2c+XG4gICAgPC9Cb3g+XG4gIClcbn1cblxudHlwZSBTaGVsbE91dHB1dENvbnRlbnRQcm9wcyA9IHtcbiAgb3V0cHV0UHJvbWlzZTogUHJvbWlzZTxUYXNrT3V0cHV0UmVzdWx0PlxuICBjb2x1bW5zOiBudW1iZXJcbn1cblxuZnVuY3Rpb24gU2hlbGxPdXRwdXRDb250ZW50KHtcbiAgb3V0cHV0UHJvbWlzZSxcbiAgY29sdW1ucyxcbn06IFNoZWxsT3V0cHV0Q29udGVudFByb3BzKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgY29uc3QgeyBjb250ZW50LCBieXRlc1RvdGFsIH0gPSB1c2Uob3V0cHV0UHJvbWlzZSlcblxuICBpZiAoIWNvbnRlbnQpIHtcbiAgICByZXR1cm4gPFRleHQgZGltQ29sb3I+Tm8gb3V0cHV0IGF2YWlsYWJsZTwvVGV4dD5cbiAgfVxuXG4gIC8vIEZpbmQgbGFzdCAxMCBsaW5lIGJvdW5kYXJpZXMgdmlhIGxhc3RJbmRleE9mXG4gIGNvbnN0IHN0YXJ0czogbnVtYmVyW10gPSBbXVxuICBsZXQgcG9zID0gY29udGVudC5sZW5ndGhcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMCAmJiBwb3MgPiAwOyBpKyspIHtcbiAgICBjb25zdCBwcmV2ID0gY29udGVudC5sYXN0SW5kZXhPZignXFxuJywgcG9zIC0gMSlcbiAgICBzdGFydHMucHVzaChwcmV2ICsgMSlcbiAgICBwb3MgPSBwcmV2XG4gIH1cbiAgc3RhcnRzLnJldmVyc2UoKVxuICBjb25zdCBpc0luY29tcGxldGUgPSBieXRlc1RvdGFsID4gY29udGVudC5sZW5ndGhcblxuICAvLyBCdWlsZCBsaW5lcywgc2tpcCBlbXB0eSB0cmFpbGluZy9sZWFkaW5nIHNlZ21lbnRzXG4gIGNvbnN0IHJlbmRlcmVkOiBzdHJpbmdbXSA9IFtdXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgc3RhcnQgPSBzdGFydHNbaV0hXG4gICAgY29uc3QgZW5kID0gaSA8IHN0YXJ0cy5sZW5ndGggLSAxID8gc3RhcnRzW2kgKyAxXSEgLSAxIDogY29udGVudC5sZW5ndGhcbiAgICBjb25zdCBsaW5lID0gY29udGVudC5zbGljZShzdGFydCwgZW5kKVxuICAgIGlmIChsaW5lKSByZW5kZXJlZC5wdXNoKGxpbmUpXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8Qm94XG4gICAgICAgIGJvcmRlclN0eWxlPVwicm91bmRcIlxuICAgICAgICBwYWRkaW5nWD17MX1cbiAgICAgICAgZmxleERpcmVjdGlvbj1cImNvbHVtblwiXG4gICAgICAgIGhlaWdodD17MTJ9XG4gICAgICAgIG1heFdpZHRoPXtjb2x1bW5zIC0gNn1cbiAgICAgID5cbiAgICAgICAge3JlbmRlcmVkLm1hcCgobGluZSwgaSkgPT4gKFxuICAgICAgICAgIDxUZXh0IGtleT17aX0gd3JhcD1cInRydW5jYXRlLWVuZFwiPlxuICAgICAgICAgICAge2xpbmV9XG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICApKX1cbiAgICAgIDwvQm94PlxuICAgICAgPFRleHQgZGltQ29sb3IgaXRhbGljPlxuICAgICAgICB7YFNob3dpbmcgJHtyZW5kZXJlZC5sZW5ndGh9IGxpbmVzYH1cbiAgICAgICAge2lzSW5jb21wbGV0ZSA/IGAgb2YgJHtmb3JtYXRGaWxlU2l6ZShieXRlc1RvdGFsKX1gIDogJyd9XG4gICAgICA8L1RleHQ+XG4gICAgPC8+XG4gIClcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU9BLEtBQUssSUFDVkMsUUFBUSxFQUNSQyxHQUFHLEVBQ0hDLGdCQUFnQixFQUNoQkMsU0FBUyxFQUNUQyxRQUFRLFFBQ0gsT0FBTztBQUNkLGNBQWNDLGFBQWEsUUFBUSxvQkFBb0I7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