PageSourceSearch

https://holdfree.ai/src/App.tsx

js holdfree.ai collected 2026-10-05 14:35:45 UTC 58,966 bytes, 640 lines download raw bytes

1import { createHotContext as __vite__createHotContext } from "/@vite/client";import.meta.hot = __vite__createHotContext("/src/App.tsx");import __vite__cjsImport0_react_jsxDevRuntime from "/node_modules/.vite/deps/react_jsx-dev-runtime.js?v=9e8fcb68"; const Fragment = __vite__cjsImport0_react_jsxDevRuntime["Fragment"]; const jsxDEV = __vite__cjsImport0_react_jsxDevRuntime["jsxDEV"];
2import * as RefreshRuntime from "/@react-refresh";
3const inWebWorker = typeof WorkerGlobalScope !== "undefined" && self instanceof WorkerGlobalScope;
4let prevRefreshReg;
5let prevRefreshSig;
6if (import.meta.hot && !inWebWorker) {
7  if (!window.$RefreshReg$) {
8    throw new Error(
9      "@vitejs/plugin-react can't detect preamble. Something is wrong."
10    );
11  }
12  prevRefreshReg = window.$RefreshReg$;
13  prevRefreshSig = window.$RefreshSig$;
14  window.$RefreshReg$ = RefreshRuntime.getRefreshReg("/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx");
15  window.$RefreshSig$ = RefreshRuntime.createSignatureFunctionForTransform;
16}
17var _s = $RefreshSig$();
18import __vite__cjsImport3_react from "/node_modules/.vite/deps/react.js?v=9e8fcb68"; const useState = __vite__cjsImport3_react["useState"];
19import { api } from "/src/lib/api.ts";
20import { NodeEditor } from "/src/components/NodeEditor.tsx";
21import { TreeVisualizer } from "/src/components/TreeVisualizer.tsx";
22import { Login } from "/src/components/Login.tsx";
23import { Sidebar } from "/src/components/Sidebar.tsx";
24import { BetaWhitelist } from "/src/components/BetaWhitelist.tsx";
25import { HoldfreeLogs } from "/src/components/HoldfreeLogs.tsx";
26import { CompanyDirectory } from "/src/components/CompanyDirectory.tsx";
27import { ActivityLogs } from "/src/components/ActivityLogs.tsx";
28import { Input, Button, Card, Badge } from "/src/components/ui/index.tsx";
29import { Modal } from "/src/components/ui/Modal.tsx";
30import { Icons } from "/src/components/Icons.tsx";
31function App() {
32  _s();
33  const [token, setToken] = useState(localStorage.getItem("ivr_admin_token"));
34  const [phoneNumber, setPhoneNumber] = useState("");
35  const [loading, setLoading] = useState(false);
36  const [menu, setMenu] = useState(null);
37  const [view, setView] = useState("menu");
38  const [editPromptPath, setEditPromptPath] = useState(null);
39  const [editPromptValue, setEditPromptValue] = useState("");
40  const [addOptionPath, setAddOptionPath] = useState(null);
41  const [newOptionKey, setNewOptionKey] = useState("");
42  const [newOptionText, setNewOptionText] = useState("");
43  const push = (msg) => {
44    console.log("Toast:", msg);
45  };
46  const handleLogin = (newToken) => {
47    localStorage.setItem("ivr_admin_token", newToken);
48    setToken(newToken);
49  };
50  const handleLogout = () => {
51    localStorage.removeItem("ivr_admin_token");
52    setToken(null);
53    setMenu(null);
54  };
55  const handleLoad = async () => {
56    if (!phoneNumber) return;
57    setLoading(true);
58    try {
59      const data = await api.getMenuByPhone(phoneNumber);
60      setMenu(data);
61      push("Menu loaded");
62    } catch (e) {
63      console.error(e);
64      if (e.message !== "Unauthorized") {
65        setMenu(null);
66        alert("Menu not found. Click Create to start a new one.");
67      }
68    } finally {
69      setLoading(false);
70    }
71  };
72  const handleCreate = async () => {
73    if (!phoneNumber) return;
74    setLoading(true);
75    try {
76      const data = await api.createMenu(phoneNumber, "Welcome! Please make a selection.");
77      setMenu(data);
78      push("Menu created");
79    } catch (e) {
80      console.error(e);
81      let msg = "Failed to create menu.";
82      if (e instanceof Error) {
83        msg = e.message;
84        try {
85          const json = JSON.parse(msg);
86          if (json.detail && json.detail.includes("already exists")) {
87            msg = "This phone number already has a menu. Please click 'Load' instead.";
88          } else if (json.detail) {
89            msg = json.detail;
90          }
91        } catch {
92        }
93      }
94      alert(msg);
95    } finally {
96      setLoading(false);
97    }
98  };
99  const openEditPrompt = (path, currentPrompt) => {
100    setEditPromptPath(path);
101    setEditPromptValue(currentPrompt);
102  };
103  const submitEditPrompt = async () => {
104    if (!menu || !editPromptPath) return;
105    try {
106      const updated = await api.updatePrompt(menu.id, editPromptPath, editPromptValue);
107      setMenu(updated);
108      setEditPromptPath(null);
109      push("Prompt updated");
110    } catch (e) {
111      alert("Failed to update prompt");
112    }
113  };
114  const openAddOption = (path) => {
115    setAddOptionPath(path);
116    setNewOptionKey("");
117    setNewOptionText("");
118  };
119  const submitAddOption = async () => {
120    if (!menu || !addOptionPath || !newOptionKey || !newOptionText) return;
121    try {
122      const updated = await api.upsertOption(menu.id, addOptionPath, newOptionKey, newOptionText);
123      setMenu(updated);
124      setAddOptionPath(null);
125      push("Option added");
126    } catch (e) {
127      alert("Failed to add option");
128    }
129  };
130  const handleDeleteOption = async (path, key) => {
131    if (!menu) return;
132    try {
133      const updated = await api.deleteOption(menu.id, path, key);
134      setMenu(updated);
135      push("Option deleted");
136    } catch (e) {
137      alert("Failed to delete option");
138    }
139  };
140  const canOperate = phoneNumber.length > 3;
141  if (!token) {
142    return /* @__PURE__ */ jsxDEV(Login, { onLogin: handleLogin }, void 0, false, {
143      fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
144      lineNumber: 162,
145      columnNumber: 12
146    }, this);
147  }
148  return /* @__PURE__ */ jsxDEV("div", { className: "flex min-h-screen bg-zinc-50 dark:bg-zinc-950", children: [
149    /* @__PURE__ */ jsxDEV(Sidebar, { onLogout: handleLogout, active: view, onNavigate: setView }, void 0, false, {
150      fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
151      lineNumber: 168,
152      columnNumber: 7
153    }, this),
154    /* @__PURE__ */ jsxDEV("main", { className: "flex-1 overflow-y-auto", children: /* @__PURE__ */ jsxDEV("div", { className: "mx-auto max-w-6xl p-8 space-y-8", children: view === "whitelist" ? /* @__PURE__ */ jsxDEV(BetaWhitelist, {}, void 0, false, {
155      fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
156      lineNumber: 174,
157      columnNumber: 11
158    }, this) : view === "companyDirectory" ? /* @__PURE__ */ jsxDEV(CompanyDirectory, {}, void 0, false, {
159      fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
160      lineNumber: 176,
161      columnNumber: 11
162    }, this) : view === "logs" ? /* @__PURE__ */ jsxDEV(HoldfreeLogs, {}, void 0, false, {
163      fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
164      lineNumber: 178,
165      columnNumber: 11
166    }, this) : view === "activityLogs" ? /* @__PURE__ */ jsxDEV(ActivityLogs, {}, void 0, false, {
167      fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
168      lineNumber: 180,
169      columnNumber: 11
170    }, this) : /* @__PURE__ */ jsxDEV(Fragment, { children: [
171      /* @__PURE__ */ jsxDEV("div", { className: "flex flex-col gap-1 border-b border-zinc-200 pb-5 dark:border-zinc-800", children: [
172        /* @__PURE__ */ jsxDEV("h1", { className: "text-2xl font-bold tracking-tight text-zinc-900 dark:text-zinc-50", children: "IVR Menu Editor" }, void 0, false, {
173          fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
174          lineNumber: 185,
175          columnNumber: 13
176        }, this),
177        /* @__PURE__ */ jsxDEV("p", { className: "text-sm text-zinc-500 dark:text-zinc-400", children: "Configure phone trees and prompts for your AI agents." }, void 0, false, {
178          fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
179          lineNumber: 186,
180          columnNumber: 13
181        }, this)
182      ] }, void 0, true, {
183        fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
184        lineNumber: 184,
185        columnNumber: 11
186      }, this),
187      /* @__PURE__ */ jsxDEV("div", { className: "grid gap-8 lg:grid-cols-12", children: [
188        /* @__PURE__ */ jsxDEV("div", { className: "lg:col-span-4 space-y-6", children: [
189          /* @__PURE__ */ jsxDEV(Card, { className: "overflow-hidden", children: [
190            /* @__PURE__ */ jsxDEV("div", { className: "bg-zinc-50/50 p-4 border-b border-zinc-100 dark:bg-zinc-900/50 dark:border-zinc-800", children: /* @__PURE__ */ jsxDEV("h3", { className: "font-semibold text-sm", children: "Target Selection" }, void 0, false, {
191              fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
192              lineNumber: 194,
193              columnNumber: 19
194            }, this) }, void 0, false, {
195              fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
196              lineNumber: 193,
197              columnNumber: 17
198            }, this),
199            /* @__PURE__ */ jsxDEV("div", { className: "p-4 space-y-4", children: [
200              /* @__PURE__ */ jsxDEV("div", { className: "space-y-2", children: [
201                /* @__PURE__ */ jsxDEV("label", { className: "text-xs font-medium text-zinc-500 uppercase tracking-wider", children: "Phone Number" }, void 0, false, {
202                  fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
203                  lineNumber: 198,
204                  columnNumber: 21
205                }, this),
206                /* @__PURE__ */ jsxDEV("div", { className: "relative", children: [
207                  /* @__PURE__ */ jsxDEV("div", { className: "absolute left-3 top-2.5 text-zinc-400", children: /* @__PURE__ */ jsxDEV(Icons.Phone, { className: "h-4 w-4" }, void 0, false, {
208                    fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
209                    lineNumber: 201,
210                    columnNumber: 25
211                  }, this) }, void 0, false, {
212                    fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
213                    lineNumber: 200,
214                    columnNumber: 23
215                  }, this),
216                  /* @__PURE__ */ jsxDEV(
217                    Input,
218                    {
219                      className: "pl-9",
220                      placeholder: "+1234567890",
221                      value: phoneNumber,
222                      onChange: (e) => setPhoneNumber(e.target.value)
223                    },
224                    void 0,
225                    false,
226                    {
227                      fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
228                      lineNumber: 203,
229                      columnNumber: 23
230                    },
231                    this
232                  )
233                ] }, void 0, true, {
234                  fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
235                  lineNumber: 199,
236                  columnNumber: 21
237                }, this)
238              ] }, void 0, true, {
239                fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
240                lineNumber: 197,
241                columnNumber: 19
242              }, this),
243              /* @__PURE__ */ jsxDEV("div", { className: "grid grid-cols-2 gap-2", children: [
244                /* @__PURE__ */ jsxDEV(
245                  Button,
246                  {
247                    variant: "outline",
248                    onClick: handleLoad,
249                    disabled: !canOperate || loading,
250                    className: "w-full",
251                    children: [
252                      /* @__PURE__ */ jsxDEV(Icons.Search, { className: "mr-2 h-4 w-4" }, void 0, false, {
253                        fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
254                        lineNumber: 219,
255                        columnNumber: 23
256                      }, this),
257                      " ",
258                      loading ? "..." : "Load"
259                    ]
260                  },
261                  void 0,
262                  true,
263                  {
264                    fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
265                    lineNumber: 213,
266                    columnNumber: 21
267                  },
268                  this
269                ),
270                /* @__PURE__ */ jsxDEV(
271                  Button,
272                  {
273                    onClick: handleCreate,
274                    disabled: !canOperate || loading,
275                    className: "w-full",
276                    children: [
277                      /* @__PURE__ */ jsxDEV(Icons.Plus, { className: "mr-2 h-4 w-4" }, void 0, false, {
278                        fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
279                        lineNumber: 226,
280                        columnNumber: 23
281                      }, this),
282                      " Create"
283                    ]
284                  },
285                  void 0,
286                  true,
287                  {
288                    fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
289                    lineNumber: 221,
290                    columnNumber: 21
291                  },
292                  this
293                )
294              ] }, void 0, true, {
295                fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
296                lineNumber: 212,
297                columnNumber: 19
298              }, this)
299            ] }, void 0, true, {
300              fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
301              lineNumber: 196,
302              columnNumber: 17
303            }, this)
304          ] }, void 0, true, {
305            fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
306            lineNumber: 192,
307            columnNumber: 15
308          }, this),
309          /* @__PURE__ */ jsxDEV("div", { className: "rounded-lg border border-blue-100 bg-blue-50/50 p-4 text-sm text-blue-900 dark:border-blue-900/30 dark:bg-blue-900/10 dark:text-blue-200", children: /* @__PURE__ */ jsxDEV("div", { className: "flex gap-3", children: [
310            /* @__PURE__ */ jsxDEV(Icons.Alert, { className: "h-5 w-5 shrink-0" }, void 0, false, {
311              fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
312              lineNumber: 234,
313              columnNumber: 19
314            }, this),
315            /* @__PURE__ */ jsxDEV("div", { className: "space-y-1", children: [
316              /* @__PURE__ */ jsxDEV("p", { className: "font-semibold", children: "Quick Tip" }, void 0, false, {
317                fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
318                lineNumber: 236,
319                columnNumber: 21
320              }, this),
321              /* @__PURE__ */ jsxDEV("p", { className: "text-xs opacity-90", children: 'Start by defining the Root Prompt. Adding options (e.g. Key "1") automatically creates branches.' }, void 0, false, {
322                fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
323                lineNumber: 237,
324                columnNumber: 21
325              }, this)
326            ] }, void 0, true, {
327              fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
328              lineNumber: 235,
329              columnNumber: 19
330            }, this)
331          ] }, void 0, true, {
332            fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
333            lineNumber: 233,
334            columnNumber: 17
335          }, this) }, void 0, false, {
336            fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
337            lineNumber: 232,
338            columnNumber: 15
339          }, this)
340        ] }, void 0, true, {
341          fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
342          lineNumber: 191,
343          columnNumber: 13
344        }, this),
345        /* @__PURE__ */ jsxDEV("div", { className: "lg:col-span-8", children: !menu ? /* @__PURE__ */ jsxDEV("div", { className: "flex h-64 flex-col items-center justify-center rounded-xl border-2 border-dashed border-zinc-200 bg-zinc-50/50 text-zinc-400 dark:border-zinc-800 dark:bg-zinc-900/50", children: [
346          /* @__PURE__ */ jsxDEV(Icons.Tree, { className: "h-12 w-12 mb-4 opacity-50" }, void 0, false, {
347            fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
348            lineNumber: 247,
349            columnNumber: 19
350          }, this),
351          /* @__PURE__ */ jsxDEV("p", { className: "font-medium", children: "No menu selected" }, void 0, false, {
352            fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
353            lineNumber: 248,
354            columnNumber: 19
355          }, this),
356          /* @__PURE__ */ jsxDEV("p", { className: "text-xs", children: "Enter a phone number to load or create a tree." }, void 0, false, {
357            fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
358            lineNumber: 249,
359            columnNumber: 19
360          }, this)
361        ] }, void 0, true, {
362          fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
363          lineNumber: 246,
364          columnNumber: 17
365        }, this) : /* @__PURE__ */ jsxDEV("div", { className: "space-y-6", children: [
366          /* @__PURE__ */ jsxDEV("div", { className: "flex items-center justify-between", children: /* @__PURE__ */ jsxDEV("div", { className: "space-y-1", children: [
367            /* @__PURE__ */ jsxDEV("h2", { className: "text-lg font-semibold", children: "Tree Structure" }, void 0, false, {
368              fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
369              lineNumber: 255,
370              columnNumber: 23
371            }, this),
372            /* @__PURE__ */ jsxDEV("div", { className: "flex gap-2", children: [
373              /* @__PURE__ */ jsxDEV(Badge, { children: [
374                "ID: ",
375                menu.id
376              ] }, void 0, true, {
377                fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
378                lineNumber: 257,
379                columnNumber: 25
380              }, this),
381              /* @__PURE__ */ jsxDEV(Badge, { className: "bg-green-100 text-green-700 border-green-200 dark:bg-green-900/30 dark:text-green-400 dark:border-green-900", children: "Active" }, void 0, false, {
382                fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
383                lineNumber: 258,
384                columnNumber: 25
385              }, this)
386            ] }, void 0, true, {
387              fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
388              lineNumber: 256,
389              columnNumber: 23
390            }, this)
391          ] }, void 0, true, {
392            fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
393            lineNumber: 254,
394            columnNumber: 21
395          }, this) }, void 0, false, {
396            fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
397            lineNumber: 253,
398            columnNumber: 19
399          }, this),
400          /* @__PURE__ */ jsxDEV(
401            TreeVisualizer,
402            {
403              root: menu.menu,
404              onEditPrompt: openEditPrompt,
405              onAddOption: openAddOption,
406              onDeleteOption: handleDeleteOption
407            },
408            void 0,
409            false,
410            {
411              fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
412              lineNumber: 264,
413              columnNumber: 19
414            },
415            this
416          ),
417          /* @__PURE__ */ jsxDEV("div", { className: "opacity-50 hover:opacity-100 transition-opacity", children: [
418            /* @__PURE__ */ jsxDEV("div", { className: "text-xs text-center mb-2 uppercase text-zinc-400", children: "Legacy List Editor" }, void 0, false, {
419              fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
420              lineNumber: 273,
421              columnNumber: 21
422            }, this),
423            /* @__PURE__ */ jsxDEV(Card, { className: "bg-white shadow-sm dark:bg-zinc-950", children: /* @__PURE__ */ jsxDEV("div", { className: "p-6", children: /* @__PURE__ */ jsxDEV(
424              NodeEditor,
425              {
426                menuId: menu.id,
427                node: menu.menu,
428                path: [],
429                depth: 0,
430                onMenuUpdated: (m) => setMenu(m),
431                toast: push
432              },
433              void 0,
434              false,
435              {
436                fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
437                lineNumber: 276,
438                columnNumber: 25
439              },
440              this
441            ) }, void 0, false, {
442              fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
443              lineNumber: 275,
444              columnNumber: 23
445            }, this) }, void 0, false, {
446              fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
447              lineNumber: 274,
448              columnNumber: 21
449            }, this)
450          ] }, void 0, true, {
451            fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
452            lineNumber: 272,
453            columnNumber: 19
454          }, this)
455        ] }, void 0, true, {
456          fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
457          lineNumber: 252,
458          columnNumber: 17
459        }, this) }, void 0, false, {
460          fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
461          lineNumber: 244,
462          columnNumber: 13
463        }, this)
464      ] }, void 0, true, {
465        fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
466        lineNumber: 189,
467        columnNumber: 11
468      }, this),
469      /* @__PURE__ */ jsxDEV(
470        Modal,
471        {
472          isOpen: !!editPromptPath,
473          onClose: () => setEditPromptPath(null),
474          title: "Edit Prompt",
475          footer: /* @__PURE__ */ jsxDEV(Button, { onClick: submitEditPrompt, children: "Save" }, void 0, false, {
476            fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
477            lineNumber: 298,
478            columnNumber: 15
479          }, this),
480          children: /* @__PURE__ */ jsxDEV("div", { className: "space-y-4", children: [
481            /* @__PURE__ */ jsxDEV("p", { className: "text-sm text-zinc-500", children: "Enter the text or SSML that will be spoken to the caller." }, void 0, false, {
482              fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
483              lineNumber: 302,
484              columnNumber: 13
485            }, this),
486            /* @__PURE__ */ jsxDEV(
487              "textarea",
488              {
489                className: "w-full h-32 rounded-md border border-zinc-200 bg-transparent p-3 text-sm focus:ring-2 focus:ring-zinc-900 dark:border-zinc-800 dark:focus:ring-zinc-100",
490                value: editPromptValue,
491                onChange: (e) => setEditPromptValue(e.target.value),
492                placeholder: "e.g. Thanks for calling. Press 1 for Sales."
493              },
494              void 0,
495              false,
496              {
497                fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
498                lineNumber: 303,
499                columnNumber: 13
500              },
501              this
502            )
503          ] }, void 0, true, {
504            fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
505            lineNumber: 301,
506            columnNumber: 11
507          }, this)
508        },
509        void 0,
510        false,
511        {
512          fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
513          lineNumber: 293,
514          columnNumber: 9
515        },
516        this
517      ),
518      /* @__PURE__ */ jsxDEV(
519        Modal,
520        {
521          isOpen: !!addOptionPath,
522          onClose: () => setAddOptionPath(null),
523          title: "Add Option",
524          footer: /* @__PURE__ */ jsxDEV(Button, { onClick: submitAddOption, disabled: !newOptionKey || !newOptionText, children: "Add" }, void 0, false, {
525            fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
526            lineNumber: 317,
527            columnNumber: 15
528          }, this),
529          children: /* @__PURE__ */ jsxDEV("div", { className: "space-y-4", children: [
530            /* @__PURE__ */ jsxDEV("div", { className: "grid grid-cols-4 gap-4 items-center", children: [
531              /* @__PURE__ */ jsxDEV("label", { className: "text-sm font-medium text-right", children: "Key" }, void 0, false, {
532                fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
533                lineNumber: 322,
534                columnNumber: 15
535              }, this),
536              /* @__PURE__ */ jsxDEV(
537                Input,
538                {
539                  className: "col-span-3",
540                  placeholder: "e.g. 1",
541                  value: newOptionKey,
542                  onChange: (e) => setNewOptionKey(e.target.value)
543                },
544                void 0,
545                false,
546                {
547                  fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
548                  lineNumber: 323,
549                  columnNumber: 15
550                },
551                this
552              )
553            ] }, void 0, true, {
554              fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
555              lineNumber: 321,
556              columnNumber: 13
557            }, this),
558            /* @__PURE__ */ jsxDEV("div", { className: "grid grid-cols-4 gap-4 items-center", children: [
559              /* @__PURE__ */ jsxDEV("label", { className: "text-sm font-medium text-right", children: "Label" }, void 0, false, {
560                fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
561                lineNumber: 331,
562                columnNumber: 15
563              }, this),
564              /* @__PURE__ */ jsxDEV(
565                Input,
566                {
567                  className: "col-span-3",
568                  placeholder: "e.g. Sales Department",
569                  value: newOptionText,
570                  onChange: (e) => setNewOptionText(e.target.value)
571                },
572                void 0,
573                false,
574                {
575                  fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
576                  lineNumber: 332,
577                  columnNumber: 15
578                },
579                this
580              )
581            ] }, void 0, true, {
582              fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
583              lineNumber: 330,
584              columnNumber: 13
585            }, this)
586          ] }, void 0, true, {
587            fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
588            lineNumber: 320,
589            columnNumber: 11
590          }, this)
591        },
592        void 0,
593        false,
594        {
595          fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
596          lineNumber: 312,
597          columnNumber: 9
598        },
599        this
600      )
601    ] }, void 0, true, {
602      fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
603      lineNumber: 182,
604      columnNumber: 11
605    }, this) }, void 0, false, {
606      fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
607      lineNumber: 172,
608      columnNumber: 9
609    }, this) }, void 0, false, {
610      fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
611      lineNumber: 171,
612      columnNumber: 7
613    }, this)
614  ] }, void 0, true, {
615    fileName: "/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx",
616    lineNumber: 166,
617    columnNumber: 5
618  }, this);
619}
620_s(App, "2XKn+2ZO9yjz8Eo6rNs9Ncw+BZw=");
621_c = App;
622export default App;
623var _c;
624$RefreshReg$(_c, "App");
625if (import.meta.hot && !inWebWorker) {
626  window.$RefreshReg$ = prevRefreshReg;
627  window.$RefreshSig$ = prevRefreshSig;
628}
629if (import.meta.hot && !inWebWorker) {
630  RefreshRuntime.__hmr_import(import.meta.url).then((currentExports) => {
631    RefreshRuntime.registerExportsForReactRefresh("/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx", currentExports);
632    import.meta.hot.accept((nextExports) => {
633      if (!nextExports) return;
634      const invalidateMessage = RefreshRuntime.validateRefreshBoundaryAndEnqueueUpdate("/home/holdfree/repos/holdfree/ivr_admin_fe/src/App.tsx", currentExports, nextExports);
635      if (invalidateMessage) import.meta.hot.invalidate(invalidateMessage);
636    });
637  });
638}
639
640//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJtYXBwaW5ncyI6IkFBOElXLFNBb0JELFVBcEJDOzs7Ozs7Ozs7Ozs7Ozs7OztBQTlJWCxTQUFTQSxnQkFBZ0I7QUFDekIsU0FBU0MsV0FBVztBQUVwQixTQUFTQyxrQkFBa0I7QUFDM0IsU0FBU0Msc0JBQXNCO0FBQy9CLFNBQVNDLGFBQWE7QUFDdEIsU0FBU0MsZUFBZTtBQUN4QixTQUFTQyxxQkFBcUI7QUFDOUIsU0FBU0Msb0JBQW9CO0FBQzdCLFNBQVNDLHdCQUF3QjtB
640QUNqQyxTQUFTQyxvQkFBb0I7QUFDN0IsU0FBU0MsT0FBT0MsUUFBUUMsTUFBTUMsYUFBYTtBQUMzQyxTQUFTQyxhQUFhO0FBQ3RCLFNBQVNDLGFBQWE7QUFFdEIsU0FBU0MsTUFBTTtBQUFBQyxLQUFBO0FBQ2IsUUFBTSxDQUFDQyxPQUFPQyxRQUFRLElBQUluQixTQUF3Qm9CLGFBQWFDLFFBQVEsaUJBQWlCLENBQUM7QUFDekYsUUFBTSxDQUFDQyxhQUFhQyxjQUFjLElBQUl2QixTQUFTLEVBQUU7QUFDakQsUUFBTSxDQUFDd0IsU0FBU0MsVUFBVSxJQUFJekIsU0FBUyxLQUFLO0FBQzVDLFFBQU0sQ0FBQzBCLE1BQU1DLE9BQU8sSUFBSTNCLFNBQXlCLElBQUk7QUFDckQsUUFBTSxDQUFDNEIsTUFBTUMsT0FBTyxJQUFJN0IsU0FBOEUsTUFBTTtBQUc1RyxRQUFNLENBQUM4QixnQkFBZ0JDLGlCQUFpQixJQUFJL0IsU0FBMEIsSUFBSTtBQUMxRSxRQUFNLENBQUNnQyxpQkFBaUJDLGtCQUFrQixJQUFJakMsU0FBUyxFQUFFO0FBRXpELFFBQU0sQ0FBQ2tDLGVBQWVDLGdCQUFnQixJQUFJbkMsU0FBMEIsSUFBSTtBQUN4RSxRQUFNLENBQUNvQyxjQUFjQyxlQUFlLElBQUlyQyxTQUFTLEVBQUU7QUFDbkQsUUFBTSxDQUFDc0MsZUFBZUMsZ0JBQWdCLElBQUl2QyxTQUFTLEVBQUU7QUFFckQsUUFBTXdDLE9BQU9BLENBQUNDLFFBQWdCO0FBQzVCQyxZQUFRQyxJQUFJLFVBQVVGLEdBQUc7QUFBQSxFQUMzQjtBQUVBLFFBQU1HLGNBQWNBLENBQUNDLGFBQXFCO0FBQ3hDekIsaUJBQWEwQixRQUFRLG1CQUFtQkQsUUFBUTtBQUNoRDFCLGFBQVMwQixRQUFRO0FBQUEsRUFDbkI7QUFFQSxRQUFNRSxlQUFlQSxNQUFNO0FBQ3pCM0IsaUJBQWE0QixXQUFXLGlCQUFpQjtBQUN6QzdCLGFBQVMsSUFBSTtBQUNiUSxZQUFRLElBQUk7QUFBQSxFQUNkO0FBRUEsUUFBTXNCLGFBQWEsWUFBWTtBQUM3QixRQ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BQWdCLE1BQUtmLGdCQUFnQmUsRUFBRTJCLE9BQU9DLEtBQUs7QUFBQTtBQUFBLGdCQUovQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsY0FJaUQ7QUFBQSxpQkFObkQ7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQkFRQTtBQUFBLFlBQ0EsdUJBQUMsU0FBSSxXQUFVLHVDQUNiO0FBQUEscUNBQUMsV0FBTSxXQUFVLGtDQUFpQyxxQkFBbEQ7QUFBQTtBQUFBO0FBQUE7QUFBQSxxQkFBdUQ7QUFBQSxjQUN2RDtBQUFBLGdCQUFDO0FBQUE7QUFBQSxrQkFDQyxXQUFVO0FBQUEsa0JBQ1YsYUFBWTtBQUFBLGtCQUNaLE9BQU8xQztBQUFBQSxrQkFDUCxVQUFVLENBQUFjLE1BQUtiLGlCQUFpQmEsRUFBRTJCLE9BQU9DLEtBQUs7QUFBQTtBQUFBLGdCQUpoRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsY0FJa0Q7QUFBQSxpQkFOcEQ7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQkFRQTtBQUFBLGVBbEJGO0FBQUE7QUFBQTtBQUFBO0FBQUEsaUJBbUJBO0FBQUE7QUFBQSxRQTNCRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUE0QkE7QUFBQSxTQTlKRTtBQUFBO0FBQUE7QUFBQTtBQUFBLFdBZ0tBLEtBMUtGO0FBQUE7QUFBQTtBQUFBO0FBQUEsV0E0S0EsS0E3S0Y7QUFBQTtBQUFBO0FBQUE7QUFBQSxXQThLQTtBQUFBLE9BbkxGO0FBQUE7QUFBQTtBQUFBO0FBQUEsU0FvTEE7QUFFSjtBQUFDL0QsR0F6VFFELEtBQUc7QUFBQWtFLEtBQUhsRTtBQTJUVCxlQUFlQTtBQUFJLElBQUFrRTtBQUFBQyxhQUFBRCxJQUFBIiwibmFtZXMiOlsidXNlU3RhdGUiLCJhcGkiLCJOb2RlRWRpdG9yIiwiVHJlZVZpc3VhbGl6ZXIiLCJMb2dpbiIsIlNpZGViYXIiLCJCZXRhV2hpdGVsaXN0IiwiSG9sZGZyZWVMb2dzIiwiQ29tcGFueURpcmVjdG9yeSIsIkFjdGl2aXR5TG9ncyIsIklucHV0IiwiQnV0dG9uIiwiQ2FyZCIsIkJhZGdlIiwiTW9kYWwiLCJJY29ucyIsIkFwcCIsIl9zIiwidG9rZW4iLCJzZXRUb2tlbiIsImxvY2FsU3RvcmFnZSIsImdldEl0ZW0iLCJwaG9uZU51bWJlciIsInNldFBob25lTnVtYmVyIiwibG9hZGluZyIsInNldExvYWRpbmciLCJtZW51Iiwic2V0TWVudSIsInZpZXciLCJzZXRWaWV3IiwiZWRpdFByb21wdFBhdGgiLCJzZXRFZGl0UHJvbXB0UGF0aCIsImVkaXRQcm9tcHRWYWx1ZSIsInNldEVkaXRQcm9tcHRWYWx1ZSIsImFkZE9wdGlvblBhdGgiLCJzZXRBZGRPcHRpb25QYXRoIiwibmV3T3B0aW9uS2V5Iiwic2V0TmV3T3B0aW9uS2V5IiwibmV3T3B0aW9uVGV4dCIsInNldE5ld09wdGlvblRleHQiLCJwdXNoIiwibXNnIiwiY29uc29sZSIsImxvZyIsImhhbmRsZUxvZ2luIiwibmV3VG9rZW4iLCJzZXRJdGVtIiwiaGFuZGxlTG9nb3V0IiwicmVtb3ZlSXRlbSIsImhhbmRsZUxvYWQiLCJkYXRhIiwiZ2V0TWVudUJ5UGhvbmUiLCJlIiwiZXJyb3IiLCJtZXNzYWdlIiwiYWxlcnQiLCJoYW5kbGVDcmVhdGUiLCJjcmVhdGVNZW51IiwiRXJyb3IiLCJqc29uIiwiSlNPTiIsInBhcnNlIiwiZGV0YWlsIiwiaW5jbHVkZXMiLCJvcGVuRWRpdFByb21wdCIsInBhdGgiLCJjdXJyZW50UHJvbXB0Iiwic3VibWl0RWRpdFByb21wdCIsInVwZGF0ZWQiLCJ1cGRhdGVQcm9tcHQiLCJpZCIsIm9wZW5BZGRPcHRpb24iLCJzdWJtaXRBZGRPcHRpb24iLCJ1cHNlcnRPcHRpb24iLCJoYW5kbGVEZWxldGVPcHRpb24iLCJrZXkiLCJkZWxldGVPcHRpb24iLCJjYW5PcGVyYXRlIiwibGVuZ3RoIiwidGFyZ2V0IiwidmFsdWUiLCJtIiwiX2MiLCIkUmVmcmVzaFJlZyQiXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOlsiQXBwLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgYXBpIH0gZnJvbSBcIi4vbGliL2FwaVwiO1xuaW1wb3J0IHR5cGUgeyBJdnJNZW51IH0gZnJvbSBcIi4vbGliL3R5cGVzXCI7XG5pbXBvcnQgeyBOb2RlRWRpdG9yIH0gZnJvbSBcIi4vY29tcG9uZW50cy9Ob2RlRWRpdG9yXCI7XG5pbXBvcnQgeyBUcmVlVmlzdWFsaXplciB9IGZyb20gXCIuL2NvbXBvbmVudHMvVHJlZVZpc3VhbGl6ZXJcIjtcbmltcG9ydCB7
640IExvZ2luIH0gZnJvbSBcIi4vY29tcG9uZW50cy9Mb2dpblwiO1xuaW1wb3J0IHsgU2lkZWJhciB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2lkZWJhclwiO1xuaW1wb3J0IHsgQmV0YVdoaXRlbGlzdCB9IGZyb20gXCIuL2NvbXBvbmVudHMvQmV0YVdoaXRlbGlzdFwiO1xuaW1wb3J0IHsgSG9sZGZyZWVMb2dzIH0gZnJvbSBcIi4vY29tcG9uZW50cy9Ib2xkZnJlZUxvZ3NcIjtcbmltcG9ydCB7IENvbXBhbnlEaXJlY3RvcnkgfSBmcm9tIFwiLi9jb21wb25lbnRzL0NvbXBhbnlEaXJlY3RvcnlcIjtcbmltcG9ydCB7IEFjdGl2aXR5TG9ncyB9IGZyb20gXCIuL2NvbXBvbmVudHMvQWN0aXZpdHlMb2dzXCI7XG5pbXBvcnQgeyBJbnB1dCwgQnV0dG9uLCBDYXJkLCBCYWRnZSB9IGZyb20gXCIuL2NvbXBvbmVudHMvdWlcIjtcbmltcG9ydCB7IE1vZGFsIH0gZnJvbSBcIi4vY29tcG9uZW50cy91aS9Nb2RhbFwiO1xuaW1wb3J0IHsgSWNvbnMgfSBmcm9tIFwiLi9jb21wb25lbnRzL0ljb25zXCI7XG5cbmZ1bmN0aW9uIEFwcCgpIHtcbiAgY29uc3QgW3Rva2VuLCBzZXRUb2tlbl0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIml2cl9hZG1pbl90b2tlblwiKSk7XG4gIGNvbnN0IFtwaG9uZU51bWJlciwgc2V0UGhvbmVOdW1iZXJdID0gdXNlU3RhdGUoXCJcIik7XG4gIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW21lbnUsIHNldE1lbnVdID0gdXNlU3RhdGU8SXZyTWVudSB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbdmlldywgc2V0Vmlld10gPSB1c2VTdGF0ZTxcIm1lbnVcIiB8IFwid2hpdGVsaXN0XCIgfCBcImNvbXBhbnlEaXJlY3RvcnlcIiB8IFwibG9nc1wiIHwgXCJhY3Rpdml0eUxvZ3NcIj4oXCJtZW51XCIpO1xuICBcbiAgLy8gTW9kYWxzIFN0YXRlXG4gIGNvbnN0IFtlZGl0UHJvbXB0UGF0aCwgc2V0RWRpdFByb21wdFBhdGhdID0gdXNlU3RhdGU8c3RyaW5nW10gfCBudWxsPihudWxsKTtcbiAgY29uc3QgW2VkaXRQcm9tcHRWYWx1ZSwgc2V0RWRpdFByb21wdFZhbHVlXSA9IHVzZVN0YXRlKFwiXCIpO1xuICBcbiAgY29uc3QgW2FkZE9wdGlvblBhdGgsIHNldEFkZE9wdGlvblBhdGhdID0gdXNlU3RhdGU8c3RyaW5nW10gfCBudWxsPihudWxsKTtcbiAgY29uc3QgW25ld09wdGlvbktleSwgc2V0TmV3T3B0aW9uS2V5XSA9IHVzZVN0YXRlKFwiXCIpO1xuICBjb25zdCBbbmV3T3B0aW9uVGV4dCwgc2V0TmV3T3B0aW9uVGV4dF0gPSB1c2VTdGF0ZShcIlwiKTtcblxuICBjb25zdCBwdXNoID0gKG1zZzogc3RyaW5nKSA9PiB7XG4gICAgY29uc29sZS5sb2coXCJUb2FzdDpcIiwgbXNnKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVMb2dpbiA9IChuZXdUb2tlbjogc3RyaW5nKSA9PiB7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJpdnJfYWRtaW5fdG9rZW5cIiwgbmV3VG9rZW4pO1xuICAgIHNldFRva2VuKG5ld1Rva2VuKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVMb2dvdXQgPSAoKSA9PiB7XG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oXCJpdnJfYWRtaW5fdG9rZW5cIik7XG4gICAgc2V0VG9rZW4obnVsbCk7XG4gICAgc2V0TWVudShudWxsKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVMb2FkID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmICghcGhvbmVOdW1iZXIpIHJldHVybjtcbiAgICBzZXRMb2FkaW5nKHRydWUpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgYXBpLmdldE1lbnVCeVBob25lKHBob25lTnVtYmVyKTtcbiAgICAgIHNldE1lbnUoZGF0YSk7XG4gICAgICBwdXNoKFwiTWVudSBsb2FkZWRcIik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgIGlmICgoZSBhcyBFcnJvcikubWVzc2FnZSAhPT0gXCJVbmF1dGhvcml6ZWRcIikge1xuICAgICAgICBzZXRNZW51KG51bGwpO1xuICAgICAgICBhbGVydChcIk1lbnUgbm90IGZvdW5kLiBDbGljayBDcmVhdGUgdG8gc3RhcnQgYSBuZXcgb25lLlwiKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGhhbmRsZUNyZWF0ZSA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAoIXBob25lTnVtYmVyKSByZXR1cm47XG4gICAgc2V0TG9hZGluZyh0cnVlKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGFwaS5jcmVhdGVNZW51KHBob25lTnVtYmVyLCBcIldlbGNvbWUhIFBsZWFzZSBtYWtlIGEgc2VsZWN0aW9uLlwiKTtcbiAgICAgIHNldE1lbnUoZGF0YSk7XG4gICAgICBwdXNoKFwiTWVudSBjcmVhdGVkXCIpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAvLyDop6PmnpDlkI7nq6/plJnor6/or6bmg4VcbiAgICAgIGxldCBtc2cgPSBcIkZhaWxlZCB0byBjcmVhdGUgbWVudS5cIjtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgbXNnID0gZS5tZXNzYWdlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKG1zZyk7XG4gICAgICAgICAgaWYgKGpzb24uZGV0YWlsICYmIGpzb24uZGV0YWlsLmluY2x1ZGVzKFwiYWxyZWFkeSBleGlzdHNcIikpIHtcbiAgICAgICAgICAgIG1zZyA9IFwiVGhpcyBwaG9uZSBudW1iZXIgYWxyZWFkeSBoYXMgYSBtZW51LiBQbGVhc2UgY2xpY2sgJ0xvYWQnIGluc3RlYWQuXCI7XG4gICAgICAgICAgfSBlbHNlIGlmIChqc29uLmRldGFpbCkge1xuICAgICAgICAgICAgbXNnID0ganNvbi5kZXRhaWw7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHsgLyogbm90IGpzb24gKi8gfVxuICAgICAgfVxuICAgICAgYWxlcnQobXNnKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgfVxuICB9O1xuXG4gIC8vIC0tLSBWaXN1YWwgRWRpdG9yIEhhbmRsZXJzIC0tLVxuXG4gIGNvbnN0IG9wZW5FZGl0UHJvbXB0ID0gKHBhdGg6IHN0cmluZ1tdLCBjdXJyZW50UHJvbXB0OiBzdHJpbmcpID0+IHtcbiAgICBzZXRFZGl0UHJvbXB0UGF0aChwYXRoKTtcbiAgICBzZXRFZGl0UHJvbXB0VmFsdWUoY3VycmVudFByb21wdCk7XG4gIH07XG5cbiAgY29uc3Qgc3VibWl0RWRpdFByb21wdCA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAoIW1lbnUgfHwgIWVkaXRQcm9tcHRQYXRoKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCBhcGkudXBkYXRlUHJvbXB0KG1lbnUuaWQsIGVkaXRQcm9tcHRQYXRoLCBlZGl0UHJvbXB0VmFsdWUpO1xuICAgICAgc2V0TWVudSh1cGRhdGVkKTtcbiAgICAgIHNldEVkaXRQcm9tcHRQYXRoKG51bGwpO1xuICAgICAgcHVzaChcIlByb21wdCB1cGRhdGVkXCIpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGFsZXJ0KFwiRmFpbGVkIHRvIHVwZGF0ZSBwcm9tcHRcIik7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IG9wZW5BZGRPcHRpb24gPSAocGF0aDogc3RyaW5nW10pID0+IHtcbiAgICBzZXRBZGRPcHRpb25QYXRoKHBhdGgpO1xuICAgIHNldE5ld09wdGlvbktleShcIlwiKTtcbiAgICBzZXROZXdPcHRpb25UZXh0KFwiXCIpO1xuICB9O1xuXG4gIGNvbnN0IHN1Ym1pdEFkZE9wdGlvbiA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAoIW1lbnUgfHwgIWFkZE9wdGlvblBhdGggfHwgIW5ld09wdGlvbktleSB8fCAhbmV3T3B0aW9uVGV4dCkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgYXBpLnVwc2VydE9wdGlvbihtZW51LmlkLCBhZGRPcHRpb25QYXRoLCBuZXdPcHRpb25LZXksIG5ld09wdGlvblRleHQpO1xuICAgICAgc2V0TWVudSh1cGRhdGVkKTtcbiAgICAgIHNldEFkZE9wdGlvblBhdGgobnVsbCk7XG4gICAgICBwdXNoKFwiT3B0aW9uIGFkZGVkXCIpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGFsZXJ0KFwiRmFpbGVkIHRvIGFkZCBvcHRpb25cIik7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGhhbmRsZURlbGV0ZU9wdGlvbiA9IGFzeW5jIChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcpID0+IHtcbiAgICBpZiAoIW1lbnUpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXBkYXRlZCA9IGF3YWl0IGFwaS5kZWxldGVPcHRpb24obWVudS5pZCwgcGF0aCwga2V5KTtcbiAgICAgIHNldE1lbnUodXBkYXRlZCk7XG4gICAgICBwdXNoKFwiT3B0aW9uIGRlbGV0ZWRcIik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgYWxlcnQoXCJGYWlsZWQgdG8gZGVsZXRlIG9wdGlvblwiKTtcbiAgICB9XG4gI
640H07XG5cbiAgY29uc3QgY2FuT3BlcmF0ZSA9IHBob25lTnVtYmVyLmxlbmd0aCA+IDM7XG5cbiAgaWYgKCF0b2tlbikge1xuICAgIHJldHVybiA8TG9naW4gb25Mb2dpbj17aGFuZGxlTG9naW59IC8+O1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggbWluLWgtc2NyZWVuIGJnLXppbmMtNTAgZGFyazpiZy16aW5jLTk1MFwiPlxuICAgICAgey8qIFNpZGViYXIgKi99XG4gICAgICA8U2lkZWJhciBvbkxvZ291dD17aGFuZGxlTG9nb3V0fSBhY3RpdmU9e3ZpZXd9IG9uTmF2aWdhdGU9e3NldFZpZXd9IC8+XG5cbiAgICAgIHsvKiBNYWluIENvbnRlbnQgQXJlYSAqL31cbiAgICAgIDxtYWluIGNsYXNzTmFtZT1cImZsZXgtMSBvdmVyZmxvdy15LWF1dG9cIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteC1hdXRvIG1heC13LTZ4bCBwLTggc3BhY2UteS04XCI+XG4gICAgICAgICAge3ZpZXcgPT09IFwid2hpdGVsaXN0XCIgPyAoXG4gICAgICAgICAgICA8QmV0YVdoaXRlbGlzdCAvPlxuICAgICAgICAgICkgOiB2aWV3ID09PSBcImNvbXBhbnlEaXJlY3RvcnlcIiA/IChcbiAgICAgICAgICAgIDxDb21wYW55RGlyZWN0b3J5IC8+XG4gICAgICAgICAgKSA6IHZpZXcgPT09IFwibG9nc1wiID8gKFxuICAgICAgICAgICAgPEhvbGRmcmVlTG9ncyAvPlxuICAgICAgICAgICkgOiB2aWV3ID09PSBcImFjdGl2aXR5TG9nc1wiID8gKFxuICAgICAgICAgICAgPEFjdGl2aXR5TG9ncyAvPlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgPD5cbiAgICAgICAgICB7LyogSGVhZGVyICovfVxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAtMSBib3JkZXItYiBib3JkZXItemluYy0yMDAgcGItNSBkYXJrOmJvcmRlci16aW5jLTgwMFwiPlxuICAgICAgICAgICAgPGgxIGNsYXNzTmFtZT1cInRleHQtMnhsIGZvbnQtYm9sZCB0cmFja2luZy10aWdodCB0ZXh0LXppbmMtOTAwIGRhcms6dGV4dC16aW5jLTUwXCI+SVZSIE1lbnUgRWRpdG9yPC9oMT5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC16aW5jLTUwMCBkYXJrOnRleHQtemluYy00MDBcIj5Db25maWd1cmUgcGhvbmUgdHJlZXMgYW5kIHByb21wdHMgZm9yIHlvdXIgQUkgYWdlbnRzLjwvcD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JpZCBnYXAtOCBsZzpncmlkLWNvbHMtMTJcIj5cbiAgICAgICAgICAgIHsvKiBMZWZ0IENvbHVtbjogQ29udHJvbHMgKDQvMTIpICovfVxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJsZzpjb2wtc3Bhbi00IHNwYWNlLXktNlwiPlxuICAgICAgICAgICAgICA8Q2FyZCBjbGFzc05hbWU9XCJvdmVyZmxvdy1oaWRkZW5cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLXppbmMtNTAvNTAgcC00IGJvcmRlci1iIGJvcmRlci16aW5jLTEwMCBkYXJrOmJnLXppbmMtOTAwLzUwIGRhcms6Ym9yZGVyLXppbmMtODAwXCI+XG4gICAgICAgICAgICAgICAgICA8aDMgY2xhc3NOYW1lPVwiZm9udC1zZW1pYm9sZCB0ZXh0LXNtXCI+VGFyZ2V0IFNlbGVjdGlvbjwvaDM+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwLTQgc3BhY2UteS00XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktMlwiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwidGV4dC14cyBmb250LW1lZGl1bSB0ZXh0LXppbmMtNTAwIHVwcGVyY2FzZSB0cmFja2luZy13aWRlclwiPlBob25lIE51bWJlcjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImFic29sdXRlIGxlZnQtMyB0b3AtMi41IHRleHQtemluYy00MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxJY29ucy5QaG9uZSBjbGFzc05hbWU9XCJoLTQgdy00XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8SW5wdXQgXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJwbC05XCIgXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIisxMjM0NTY3ODkwXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cGhvbmVOdW1iZXJ9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHNldFBob25lTnVtYmVyKGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdyaWQgZ3JpZC1jb2xzLTIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPEJ1dHRvbiBcbiAgICAgICAgICAgICAgICAgICAgICB2Y
640XJpYW50PVwib3V0bGluZVwiIFxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZUxvYWR9IFxuICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXshY2FuT3BlcmF0ZSB8fCBsb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8SWNvbnMuU2VhcmNoIGNsYXNzTmFtZT1cIm1yLTIgaC00IHctNFwiIC8+IHtsb2FkaW5nID8gXCIuLi5cIiA6IFwiTG9hZFwifVxuICAgICAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPEJ1dHRvbiBcbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVDcmVhdGV9IFxuICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXshY2FuT3BlcmF0ZSB8fCBsb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8SWNvbnMuUGx1cyBjbGFzc05hbWU9XCJtci0yIGgtNCB3LTRcIiAvPiBDcmVhdGVcbiAgICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9DYXJkPlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicm91bmRlZC1sZyBib3JkZXIgYm9yZGVyLWJsdWUtMTAwIGJnLWJsdWUtNTAvNTAgcC00IHRleHQtc20gdGV4dC1ibHVlLTkwMCBkYXJrOmJvcmRlci1ibHVlLTkwMC8zMCBkYXJrOmJnLWJsdWUtOTAwLzEwIGRhcms6dGV4dC1ibHVlLTIwMFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBnYXAtM1wiPlxuICAgICAgICAgICAgICAgICAgPEljb25zLkFsZXJ0IGNsYXNzTmFtZT1cImgtNSB3LTUgc2hyaW5rLTBcIiAvPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwiZm9udC1zZW1pYm9sZFwiPlF1aWNrIFRpcDwvcD5cbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC14cyBvcGFjaXR5LTkwXCI+U3RhcnQgYnkgZGVmaW5pbmcgdGhlIFJvb3QgUHJvbXB0LiBBZGRpbmcgb3B0aW9ucyAoZS5nLiBLZXkgXCIxXCIpIGF1dG9tYXRpY2FsbHkgY3JlYXRlcyBicmFuY2hlcy48L3A+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgey8qIFJpZ2h0IENvbHVtbjogRWRpdG9yICg4LzEyKSAqL31cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibGc6Y29sLXNwYW4tOFwiPlxuICAgICAgICAgICAgICB7IW1lbnUgPyAoXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGgtNjQgZmxleC1jb2wgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQteGwgYm9yZGVyLTIgYm9yZGVyLWRhc2hlZCBib3JkZXItemluYy0yMDAgYmctemluYy01MC81MCB0ZXh0LXppbmMtNDAwIGRhcms6Ym9yZGVyLXppbmMtODAwIGRhcms6YmctemluYy05MDAvNTBcIj5cbiAgICAgICAgICAgICAgICAgIDxJY29ucy5UcmVlIGNsYXNzTmFtZT1cImgtMTIgdy0xMiBtYi00IG9wYWNpdHktNTBcIiAvPlxuICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwiZm9udC1tZWRpdW1cIj5ObyBtZW51IHNlbGVjdGVkPC9wPlxuICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC14c1wiPkVudGVyIGEgcGhvbmUgbnVtYmVyIHRvIGxvYWQgb3IgY3JlYXRlIGEgdHJlZS48L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTZcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGgyIGNsYXNzTmFtZT1cInRleHQtbGcgZm9udC1zZW1pYm9sZFwiPlRyZWUgU3RydWN0dXJlPC9oMj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxCYWRnZT5JRDoge21lbnUuaWR9PC9CYWRnZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxCYWRnZSBjbGFzc05hbWU9XCJiZy1ncmVlbi0xMDAgdGV4dC1ncmVlbi03MDAgYm9yZGVyLWdyZWVuLTIwMCBkYXJrOmJnLWdyZWVuLTkwMC8zMCBkYXJrOnRleHQtZ3JlZW4tNDAwIGRhcms6Ym9yZGVyLWdyZWVuLTkwMFwiPkFjdGl2ZTwvQmFkZ2U+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIHsvKiBWaXN1YWwgRWRpdG9yIChSZXBsYWNlcyBPbGQgTGlzdCBFZGl0b3IpICovfVxuICAgICAgICAgICAgICAgICAgPFRyZWVWaXN1YWxpemVyIFxuICAgICAgICAgICAgICAgICAgICByb290PXttZW51Lm1lbnV9IFxuICAgICAgICAgICAgICAgICAgICBvbkVkaXRQcm9tcHQ9e29wZW5FZGl0UHJvbXB0fVxuICAgICAgICAgICAgICAgICAgICBvbkFkZE9wdGlvbj17b3BlbkFkZE9wdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgb25EZWxldGVPcHRpb249e2hhbmRsZURlbGV0ZU9wdGlvbn1cbiAgICAgICAgICAgICAgICAgIC8+XG5cbiAgICAgICAgICAgICAgICAgIHsvKiBPbGQgRWRpdG9yIChDb2xsYXBzZWQgb3IgUmVtb3ZlZD8gS2VlcGluZyBmb3IgZmFsbGJhY2sgYXMgcmVxdWVzdGVkKSAqL31cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwib3BhY2l0eS01MCBob3ZlcjpvcGFjaXR5LTEwMCB0cmFuc2l0aW9uLW9wYWNpdHlcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtY2VudGVyIG1iLTIgdXBwZXJjYXNlIHRleHQtemluYy00MDBcIj5MZWdhY3kgTGlzdCBFZGl0b3I8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPENhcmQgY2xhc3NOYW1lPVwiYmctd2h
640pdGUgc2hhZG93LXNtIGRhcms6YmctemluYy05NTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInAtNlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPE5vZGVFZGl0b3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWVudUlkPXttZW51LmlkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlPXttZW51Lm1lbnV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg9e1tdfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aD17MH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25NZW51VXBkYXRlZD17KG0pID0+IHNldE1lbnUobSl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRvYXN0PXtwdXNofVxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9DYXJkPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICB7LyogTW9kYWxzICovfVxuICAgICAgICA8TW9kYWwgXG4gICAgICAgICAgaXNPcGVuPXshIWVkaXRQcm9tcHRQYXRofSBcbiAgICAgICAgICBvbkNsb3NlPXsoKSA9PiBzZXRFZGl0UHJvbXB0UGF0aChudWxsKX1cbiAgICAgICAgICB0aXRsZT1cIkVkaXQgUHJvbXB0XCJcbiAgICAgICAgICBmb290ZXI9e1xuICAgICAgICAgICAgPEJ1dHRvbiBvbkNsaWNrPXtzdWJtaXRFZGl0UHJvbXB0fT5TYXZlPC9CdXR0b24+XG4gICAgICAgICAgfVxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTRcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC16aW5jLTUwMFwiPkVudGVyIHRoZSB0ZXh0IG9yIFNTTUwgdGhhdCB3aWxsIGJlIHNwb2tlbiB0byB0aGUgY2FsbGVyLjwvcD5cbiAgICAgICAgICAgIDx0ZXh0YXJlYSBcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidy1mdWxsIGgtMzIgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtMjAwIGJnLXRyYW5zcGFyZW50IHAtMyB0ZXh0LXNtIGZvY3VzOnJpbmctMiBmb2N1czpyaW5nLXppbmMtOTAwIGRhcms6Ym9yZGVyLXppbmMtODAwIGRhcms6Zm9jdXM6cmluZy16aW5jLTEwMFwiXG4gICAgICAgICAgICAgIHZhbHVlPXtlZGl0UHJvbXB0VmFsdWV9XG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXtlID0+IHNldEVkaXRQcm9tcHRWYWx1ZShlLnRhcmdldC52YWx1ZSl9XG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBUaGFua3MgZm9yIGNhbGxpbmcuIFByZXNzIDEgZm9yIFNhbGVzLlwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L01vZGFsPlxuXG4gICAgICAgIDxNb2RhbCBcbiAgICAgICAgICBpc09wZW49eyEhYWRkT3B0aW9uUGF0aH0gXG4gICAgICAgICAgb25DbG9zZT17KCkgPT4gc2V0QWRkT3B0aW9uUGF0aChudWxsKX1cbiAgICAgICAgICB0aXRsZT1cIkFkZCBPcHRpb25cIlxuICAgICAgICAgIGZvb3Rlcj17XG4gICAgICAgICAgICA8QnV0dG9uIG9uQ2xpY2s9e3N1Ym1pdEFkZE9wdGlvbn0gZGlzYWJsZWQ9eyFuZXdPcHRpb25LZXkgfHwgIW5ld09wdGlvblRleHR9PkFkZDwvQnV0dG9uPlxuICAgICAgICAgIH1cbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS00XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdyaWQgZ3JpZC1jb2xzLTQgZ2FwLTQgaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtcmlnaHRcIj5LZXk8L2xhYmVsPlxuICAgICAgICAgICAgICA8SW5wdXQgXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiY29sLXNwYW4tM1wiIFxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiAxXCIgXG4gICAgICAgICAgICAgICAgdmFsdWU9e25ld09wdGlvbktleX1cbiAgICAgICAgICAgICAgICBvbkNoYW5nZT17ZSA9PiBzZXROZXdPcHRpb25LZXkoZS50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdyaWQgZ3JpZC1jb2xzLTQgZ2FwLTQgaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtcmlnaHRcIj5MYWJlbDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxJbnB1dCBcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJjb2wtc3Bhbi0zXCIgXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIFNhbGVzIERlcGFydG1lbnRcIiBcbiAgICAgICAgICAgICAgICB2YWx1ZT17bmV3T3B0aW9uVGV4dH1cbiAgICAgICAgICAgICAgICBvbkNoYW5nZT17ZSA9PiBzZXROZXdPcHRpb25UZXh0KGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L01vZGFsPlxuXG4gICAgICAgICAgPC8+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L21haW4+XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEFwcDtcbiJdLCJmaWxlIjoiL2hvbWUvaG9sZGZyZWUvcmVwb3MvaG9sZGZyZWUvaXZyX2FkbWluX2ZlL3NyYy9BcHAudHN4In0=

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.