1import __vite__cjsImport0_react_jsxRuntime from "/node_modules/.vite/deps/react_jsx-runtime.js?v=f660f992"; const jsx = __vite__cjsImport0_react_jsxRuntime["jsx"]; const jsxs = __vite__cjsImport0_react_jsxRuntime["jsxs"]; 2import __vite__cjsImport1_react from "/node_modules/.vite/deps/react.js?v=f660f992"; const React = __vite__cjsImport1_react.__esModule ? __vite__cjsImport1_react.default : __vite__cjsImport1_react; const useEffect = __vite__cjsImport1_react["useEffect"]; const useState = __vite__cjsImport1_react["useState"]; 3import { adminService } from "/src/api/endpoints/admin.ts"; 4import { handleAdminError } from "/src/utils/errorHandling.ts"; 5import { useAdminAuth } from "/src/features/admin/context/AdminAuthContext.tsx"; 6import { Button } from "/src/components/ui/Button.tsx"; 7import { Card } from "/src/features/admin/components/Card.tsx"; 8import { cn } from "/src/utils/cn.ts"; 9import toast from "/node_modules/.vite/deps/react-hot-toast.js?v=f660f992"; 10export const SupportPartnerTickets = () => { 11 const { isPartnerTenantAdmin } = useAdminAuth(); 12 const [tickets, setTickets] = useState([]); 13 const [total, setTotal] = useState(0); 14 const [page, setPage] = useState(1); 15 const [status, setStatus] = useState(""); 16 const [partnerId, setPartnerId] = useState(""); 17 const [partners, setPartners] = useState([]); 18 const [loading, setLoading] = useState(true); 19 const [detail, setDetail] = useState(null); 20 const [showNew, setShowNew] = useState(false); 21 const [subject, setSubject] = useState(""); 22 const [body, setBody] = useState(""); 23 const [relatedUserId, setRelatedUserId] = useState(""); 24 const [saving, setSaving] = useState(false); 25 const limit = 20; 26 useEffect(() => { 27 if (isPartnerTenantAdmin) return; 28 void (async () => { 29 try { 30 const list = await adminService.getPartners(); 31 setPartners(list.map((p) => ({ id: p.id, partner_name: p.partner_name }))); 32 } catch (e) { 33 handleAdminError(e, "Failed to load partners"); 34 } 35 })(); 36 }, [isPartnerTenantAdmin]); 37 const load = async () => { 38 setLoading(true); 39 try { 40 const pid = !isPartnerTenantAdmin && partnerId ? Number(partnerId) : void 0; 41 const res = await adminService.getSupportPartnerTickets( 42 page, 43 limit, 44 status || void 0, 45 pid 46 ); 47 setTickets(res.tickets); 48 setTotal(res.total_count); 49 } catch (e) { 50 handleAdminError(e, "Failed to load escalations"); 51 } finally { 52 setLoading(false); 53 } 54 }; 55 useEffect(() => { 56 void load(); 57 }, [page, status, partnerId, isPartnerTenantAdmin]); 58 const openRow = async (t) => { 59 try { 60 const full = await adminService.getSupportTicketDetail(t.id); 61 setDetail(full); 62 } catch (e) { 63 handleAdminError(e, "Failed to load ticket"); 64 } 65 }; 66 const setStatusRemote = async (id, next) => { 67 try { 68 await adminService.patchSupportTicketStatus(id, next); 69 toast.success(next === "closed" ? "Ticket closed" : "Ticket reopened"); 70 setDetail((d) => d && d.id === id ? { ...d, status: next } : d); 71 await load(); 72 } catch (e) { 73 handleAdminError(e, "Could not update status"); 74 } 75 }; 76 const submitEscalation = async (e) => { 77 e.preventDefault(); 78 if (!isPartnerTenantAdmin) return; 79 if (subject.trim().length < 2 || body.trim().length < 10) { 80 toast.error("Subject and message (10+ chars) required"); 81 return; 82 } 83 setSaving(true); 84 try { 85 let rid; 86 if (relatedUserId.trim()) { 87 const n = Number(relatedUserId.trim()); 88 if (Number.isNaN(n)) { 89 toast.error("Related user id must be a number"); 90 setSaving(false); 91 return; 92 } 93 rid = n; 94 } 95 await adminService.createSupportPartnerTicket({ 96 subject: subject.trim(), 97 body: body.trim(), 98 related_user_id: rid 99 }); 100 toast.success("Ticket sent to platform team"); 101 setShowNew(false); 102 setSubject(""); 103 setBody(""); 104 setRelatedUserId(""); 105 setPage(1); 106 await load(); 107 } catch (e2) { 108 handleAdminError(e2, "Could not create ticket"); 109 } finally { 110 setSaving(false); 111 } 112 }; 113 const totalPages = Math.max(1, Math.ceil(total / limit)); 114 const colCount = isPartnerTenantAdmin ? 6 : 7; 115 return /* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
116 /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-start justify-between gap-4", children: [ 117 /* @__PURE__ */ jsxs("div", { children: [ 118 /* @__PURE__ */ jsx("h1", { className: "text-2xl font-bold text-slate-900 dark:text-white", children: isPartnerTenantAdmin ? "Requests to platform" : "Partner escalations" }), 119 /* @__PURE__ */ jsx("p", { className: "mt-1 text-sm text-slate-500 dark:text-slate-400", children: isPartnerTenantAdmin ? "Raise issues about your partner or a specific user. Vealthx platform admins manage status." : "Tickets opened by partner administrators to the platform team." }) 120 ] }), 121 isPartnerTenantAdmin && /* @__PURE__ */ jsx(Button, { type: "button", variant: "primary", onClick: () => setShowNew(true), children: "New request" }) 122 ] }), 123 /* @__PURE__ */ jsxs(Card, { className: "p-0 overflow-hidden", children: [ 124 /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-3 border-b border-slate-200 p-4 dark:border-slate-800", children: [
125 /* @__PURE__ */ jsxs( 126 "select", 127 { 128 value: status, 129 onChange: (e) => { 130 setPage(1); 131 setStatus(e.target.value); 132 }, 133 className: "rounded-lg border border-slate-200 bg-white px-3 py-2 text-sm dark:border-slate-700 dark:bg-slate-900 dark:text-white", 134 children: [ 135 /* @__PURE__ */ jsx("option", { value: "", children: "All statuses" }), 136 /* @__PURE__ */ jsx("option", { value: "open", children: "Open" }), 137 /* @__PURE__ */ jsx("option", { value: "closed", children: "Closed" }) 138 ] 139 } 140 ), 141 !isPartnerTenantAdmin && /* @__PURE__ */ jsxs( 142 "select", 143 { 144 value: partnerId, 145 onChange: (e) => { 146 setPage(1); 147 setPartnerId(e.target.value); 148 }, 149 className: "rounded-lg border border-slate-200 bg-white px-3 py-2 text-sm dark:border-slate-700 dark:bg-slate-900 dark:text-white", 150 children: [
151 /* @__PURE__ */ jsx("option", { value: "", children: "All partners" }), 152 partners.map((p) => /* @__PURE__ */ jsx("option", { value: String(p.id), children: p.partner_name }, p.id)) 153 ] 154 } 155 ) 156 ] }), 157 /* @__PURE__ */ jsx("div", { className: "overflow-x-auto", children: /* @__PURE__ */ jsxs("table", { className: "w-full text-left text-sm", children: [ 158 /* @__PURE__ */ jsx("thead", { className: "border-b border-slate-200 bg-slate-50/80 dark:border-slate-800 dark:bg-slate-800/40", children: /* @__PURE__ */ jsxs("tr", { children: [ 159 /* @__PURE__ */ jsx("th", { className: "px-4 py-3 font-semibold text-slate-600 dark:text-slate-300", children: "ID" }), 160 /* @__PURE__ */ jsx("th", { className: "px-4 py-3 font-semibold text-slate-600 dark:text-slate-300", children: "Subject" }), 161 !isPartnerTenantAdmin && /* @__PURE__ */ jsx("th", { className: "px-4 py-3 font-semibold text-slate-600 dark:text-slate-300", children: "Partner" }),
162 /* @__PURE__ */ jsx("th", { className: "px-4 py-3 font-semibold text-slate-600 dark:text-slate-300", children: "From" }), 163 /* @__PURE__ */ jsx("th", { className: "px-4 py-3 font-semibold text-slate-600 dark:text-slate-300", children: "Related user" }), 164 /* @__PURE__ */ jsx("th", { className: "px-4 py-3 font-semibold text-slate-600 dark:text-slate-300", children: "Status" }), 165 /* @__PURE__ */ jsx("th", { className: "px-4 py-3 font-semibold text-slate-600 dark:text-slate-300", children: "Created" }) 166 ] }) }), 167 /* @__PURE__ */ jsx("tbody", { className: "divide-y divide-slate-100 dark:divide-slate-800", children: loading ? /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", { colSpan: colCount, className: "px-4 py-10 text-center text-slate-500", children: "Loadingâ¦" }) }) : tickets.length === 0 ? /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", { colSpan: colCount, className: "px-4 py-10 text-center text-slate-500", children: "No tickets." }) }) : tickets.map((t) => /* @__PURE__ */ jsxs( 168 "tr", 169 { 170 className: "cursor-pointer hover:bg-slate-50 dark:hover:bg-slate-800/40", 171 onClick: () => void openRow(t), 172 children: [
173 /* @__PURE__ */ jsx("td", { className: "px-4 py-3 font-mono text-xs", children: t.id }), 174 /* @__PURE__ */ jsx("td", { className: "px-4 py-3 font-medium text-slate-900 dark:text-white", children: t.subject }), 175 !isPartnerTenantAdmin && /* @__PURE__ */ jsx("td", { className: "px-4 py-3 text-xs text-slate-600 dark:text-slate-400", children: t.partner_name || t.partner_id }), 176 /* @__PURE__ */ jsx("td", { className: "max-w-[120px] truncate px-4 py-3 text-xs text-slate-500", children: t.creator_label || "â" }), 177 /* @__PURE__ */ jsx("td", { className: "max-w-[120px] truncate px-4 py-3 text-xs text-slate-500", children: t.related_user_label || (t.related_user_id ? `#${t.related_user_id}` : "â") }), 178 /* @__PURE__ */ jsx("td", { className: "px-4 py-3", children: /* @__PURE__ */ jsx( 179 "span", 180 { 181 className: cn( 182 "rounded-full px-2 py-0.5 text-[10px] font-bold uppercase", 183 t.status === "open" ? "bg-emerald-100 text-emerald-800 dark:bg-emerald-900/40 dark:text-emerald-200" : "bg-slate-200 text-slate-600 dark:bg-slate-700 dark:text-slate-300" 184 ), 185 children: t.status 186 } 187 ) }),
188 /* @__PURE__ */ jsx("td", { className: "px-4 py-3 text-xs text-slate-500", children: t.created_at ? new Date(t.created_at).toLocaleString() : "â" }) 189 ] 190 }, 191 t.id 192 )) }) 193 ] }) }), 194 totalPages > 1 && /* @__PURE__ */ jsxs("div", { className: "flex justify-between border-t border-slate-200 p-4 dark:border-slate-800", children: [ 195 /* @__PURE__ */ jsx( 196 Button, 197 { 198 variant: "outline", 199 size: "sm", 200 disabled: page <= 1, 201 onClick: () => setPage((p) => Math.max(1, p - 1)), 202 children: "Previous" 203 } 204 ), 205 /* @__PURE__ */ jsx( 206 Button, 207 { 208 variant: "outline", 209 size: "sm", 210 disabled: page >= totalPages, 211 onClick: () => setPage((p) => Math.min(totalPages, p + 1)), 212 children: "Next" 213 } 214 ) 215 ] }) 216 ] }), 217 detail && /* @__PURE__ */ jsx("div", { className: "fixed inset-0 z-[100] flex items-end justify-center bg-slate-900/55 p-4 sm:items-center", children: /* @__PURE__ */ jsxs("div", { className: "max-h-[90vh] w-full max-w-lg overflow-y-auto rounded-2xl border border-slate-200 bg-white p-6 shadow-xl dark:border-slate-700 dark:bg-slate-900", children: [
218 /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-2", children: [ 219 /* @__PURE__ */ jsx("h3", { className: "text-lg font-bold text-slate-900 dark:text-white", children: detail.subject }), 220 /* @__PURE__ */ jsx( 221 "button", 222 { 223 type: "button", 224 onClick: () => setDetail(null), 225 className: "text-sm text-slate-500 hover:text-slate-800 dark:hover:text-slate-200", 226 children: "Close" 227 } 228 ) 229 ] }), 230 /* @__PURE__ */ jsxs("p", { className: "mt-2 text-xs text-slate-500", children: [ 231 "#", 232 detail.id, 233 " · ", 234 detail.partner_name || `Partner ${detail.partner_id}`, 235 " ·", 236 " ", 237 /* @__PURE__ */ jsx("span", { className: "font-semibold uppercase", children: detail.status }) 238 ] }), 239 detail.related_user_label && /* @__PURE__ */ jsxs("p", { className: "mt-1 text-xs text-slate-500", children: [ 240 "Related user: ", 241 detail.related_user_label 242 ] }),
243 /* @__PURE__ */ jsx("p", { className: "mt-4 whitespace-pre-wrap text-sm text-slate-700 dark:text-slate-200", children: detail.body }), 244 !isPartnerTenantAdmin && /* @__PURE__ */ jsx("div", { className: "mt-6 flex flex-wrap gap-2 border-t border-slate-100 pt-4 dark:border-slate-800", children: detail.status === "open" ? /* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", onClick: () => void setStatusRemote(detail.id, "closed"), children: "Mark closed" }) : /* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", onClick: () => void setStatusRemote(detail.id, "open"), children: "Reopen" }) }) 245 ] }) }), 246 showNew && isPartnerTenantAdmin && /* @__PURE__ */ jsx("div", { className: "fixed inset-0 z-[110] flex items-end justify-center bg-slate-900/55 p-4 sm:items-center", children: /* @__PURE__ */ jsxs( 247 "form", 248 { 249 onSubmit: submitEscalation, 250 className: "w-full max-w-md rounded-2xl border border-slate-200 bg-white p-6 shadow-xl dark:border-slate-700 dark:bg-slate-900", 251 children: [
252 /* @__PURE__ */ jsx("h3", { className: "text-lg font-bold text-slate-900 dark:text-white", children: "New request to platform" }), 253 /* @__PURE__ */ jsxs("div", { className: "mt-4 space-y-3", children: [ 254 /* @__PURE__ */ jsxs("div", { children: [ 255 /* @__PURE__ */ jsx("label", { className: "mb-1 block text-xs font-semibold text-slate-600 dark:text-slate-300", children: "Subject" }), 256 /* @__PURE__ */ jsx( 257 "input", 258 { 259 value: subject, 260 onChange: (e) => setSubject(e.target.value), 261 className: "w-full rounded-lg border border-slate-200 px-3 py-2 text-sm dark:border-slate-600 dark:bg-slate-800 dark:text-white" 262 } 263 ) 264 ] }), 265 /* @__PURE__ */ jsxs("div", { children: [ 266 /* @__PURE__ */ jsx("label", { className: "mb-1 block text-xs font-semibold text-slate-600 dark:text-slate-300", children: "Details" }), 267 /* @__PURE__ */ jsx( 268 "textarea", 269 { 270 value: body, 271 onChange: (e) => setBody(e.target.value), 272 rows: 5, 273 className: "w-full rounded-lg border border-slate-200 px-3 py-2 text-sm dark:border-slate-600 dark:bg-slate-800 dark:text-white" 274 } 275 ) 276 ] }),
277 /* @__PURE__ */ jsxs("div", { children: [ 278 /* @__PURE__ */ jsx("label", { className: "mb-1 block text-xs font-semibold text-slate-600 dark:text-slate-300", children: "Related user id (optional)" }), 279 /* @__PURE__ */ jsx( 280 "input", 281 { 282 value: relatedUserId, 283 onChange: (e) => setRelatedUserId(e.target.value), 284 placeholder: "e.g. 12345", 285 className: "w-full rounded-lg border border-slate-200 px-3 py-2 text-sm dark:border-slate-600 dark:bg-slate-800 dark:text-white" 286 } 287 ), 288 /* @__PURE__ */ jsx("p", { className: "mt-1 text-[10px] text-slate-500", children: "Must be a user under your partner." }) 289 ] }) 290 ] }), 291 /* @__PURE__ */ jsxs("div", { className: "mt-6 flex justify-end gap-2", children: [ 292 /* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", onClick: () => setShowNew(false), children: "Cancel" }),
293 /* @__PURE__ */ jsx(Button, { type: "submit", variant: "primary", loading: saving, children: "Submit" }) 294 ] }) 295 ] 296 } 297 ) }) 298 ] }); 299}; 300 301//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlN1cHBvcnRQYXJ0bmVyVGlja2V0cy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBhZG1pblNlcnZpY2UsIHR5cGUgU3VwcG9ydFRpY2tldCB9IGZyb20gJy4uLy4uLy4uL2FwaS9lbmRwb2ludHMvYWRtaW4nO1xuaW1wb3J0IHsgaGFuZGxlQWRtaW5FcnJvciB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2Vycm9ySGFuZGxpbmcnO1xuaW1wb3J0IHsgdXNlQWRtaW5BdXRoIH0gZnJvbSAnLi4vY29udGV4dC9BZG1pbkF1dGhDb250ZXh0JztcbmltcG9ydCB7IEJ1dHRvbiB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvdWkvQnV0dG9uJztcbmltcG9ydCB7IENhcmQgfSBmcm9tICcuLi9jb21wb25lbnRzL0NhcmQnO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuLi8uLi8uLi91dGlscy9jbic7XG5pbXBvcnQgdG9hc3QgZnJvbSAncmVhY3QtaG90LXRvYXN0JztcblxuZXhwb3J0IGNvbnN0IFN1cHBvcnRQYXJ0bmVyVGlja2V0czogUmVhY3QuRkMgPSAoKSA9PiB7XG4gICAgY29uc3QgeyBpc1BhcnRuZXJUZW5hbnRBZG1pbiB9ID0gdXNlQWRtaW5BdXRoKCk7XG4gICAgY29uc3QgW3RpY2tldHMsIHNldFRpY2tldHNdID0gdXNlU3RhdGU8U3VwcG9ydFRpY2tldFtdPihbXSk7XG4gICAgY29uc3QgW3RvdGFsLCBzZXRUb3RhbF0gPSB1c2VTdGF0ZSgwKTtcbiAgICBjb25zdCBbcGFnZSwgc2V0UGFnZV0gPSB1c2VTdGF0ZSgxKTtcbiAgICBjb25zdCBbc3RhdHVzLCBzZXRTdGF0dXNdID0gdXNlU3RhdGU8c3RyaW5nPignJyk7XG4gICAgY29uc3QgW3BhcnRuZXJJZCwgc2V0UGFydG5lcklkXSA9IHVzZVN0YXRlPHN0cmluZz4oJycpO1xuICAgIGNvbnN0IFtwYXJ0bmVycywgc2V0UGFydG5lcnNdID0gdXNlU3RhdGU8eyBpZDogbnVtYmVyOyBwYXJ0bmVyX25hbWU6IHN0cmluZyB9W10+KFtdKTtcbiAgICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTdGF0ZSh0cnVlKTtcbiAgICBjb25zdCBbZGV0YWlsLCBzZXREZXRhaWxdID0gdXNlU3RhdGU8U3VwcG9ydFRpY2tldCB8IG51bGw+KG51bGwpO1xuICAgIGNvbnN0IFtzaG93TmV3LCBzZXRTaG93TmV3XSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgICBjb25zdCBbc3ViamVjdCwgc2V0U3ViamVjdF0gPSB1c2VTdGF0ZSgnJyk7XG4gICAgY29uc3QgW2JvZHksIHNldEJvZHldID0gdXNlU3RhdGUoJycpO1xuICAgIGNvbnN0IFtyZWxhdGVkVXNlcklkLCBzZXRSZWxhdGVkVXNlcklkXSA9IHVzZVN0YXRlKCcnKTtcbiAgICBjb25zdCBbc2F2aW5nLCBzZXRTYXZpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gICAgY29uc3QgbGltaXQgPSAyMDtcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmIChpc1BhcnRuZXJUZW5hbnRBZG1pbikgcmV0dXJuO1xuICAgICAgICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpc3QgPSBhd2FpdCBhZG1pblNlcnZpY2UuZ2V0UGFydG5lcnMoKTtcbiAgICAgICAgICAgICAgICBzZXRQYXJ0bmVycyhsaXN0Lm1hcCgocCkgPT4gKHsgaWQ6IHAuaWQsIHBhcnRuZXJfbmFtZTogcC5wYXJ0bmVyX25hbWUgfSkpKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVBZG1pbkVycm9yKGUsICdGYWlsZWQgdG8gbG9hZCBwYXJ0bmVycycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSgpO1xuICAgIH0sIFtpc1BhcnRuZXJUZW5hbnRBZG1pbl0pO1xuXG4gICAgY29uc3QgbG9hZCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgc2V0TG9hZGluZyh0cnVlKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHBpZCA9ICFpc1BhcnRuZXJUZW5hbnRBZG1pbiAmJiBwYXJ0bmVySWQgPyBOdW1iZXIocGFydG5lcklkKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFkbWluU2VydmljZS5nZXRTdXBwb3J0UGFydG5lclRpY2tldHMoXG4gICAgICAgICAgICAgICAgcGFnZSxcbiAgICAgICAgICAgICAgICBsaW1pdCxcbiAgICAgICAgICAgICAgICBzdGF0dXMgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHBpZCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBzZXRUaWNrZXRzKHJlcy50aWNrZXRzKTtcbiAgICAgICAgICAgIHNldFRvdGFsKHJlcy50b3RhbF9jb3VudCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGhhbmRsZUFkbWluRXJyb3IoZSwgJ0ZhaWxlZCB0byBsb2FkIGVzY2FsYXRpb25zJyk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICB2b2lkIGxvYWQoKTtcbiAgICB9LCBbcGFnZSwgc3RhdHVzLCBwYXJ0bmVySWQsIGlzUGFydG5lclRlbmFudEFkbWluXSk7XG5cbiAgICBjb25zdCBvcGVuUm93ID0gYXN5bmMgKHQ6IFN1cHBvcnRUaWNrZXQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGZ1bGwgPSBhd2FpdCBhZG1pblNlcnZpY2UuZ2V0U3VwcG9ydFRpY2tldERldGFpbCh0LmlkKTtcbiAgICAgICAgICAgIHNldERldGFpbChmdWxsKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaGFuZGxlQWRtaW5FcnJvcihlLCAnRmFpbGVkIHRvIGxvYWQgdGlja2V0Jyk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgc2V0U3RhdHVzUmVtb3RlID0gYXN5bmMgKGlkOiBudW1iZXIsIG5leHQ6ICdvcGVuJyB8ICdjbG9zZWQnKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBhZG1pblNlcnZpY2UucGF0Y2hTdXBwb3J0VGlja2V0U3RhdHVzKGlkLCBuZXh0KTtcbiAgICAgICAgICAgI
301HRvYXN0LnN1Y2Nlc3MobmV4dCA9PT0gJ2Nsb3NlZCcgPyAnVGlja2V0IGNsb3NlZCcgOiAnVGlja2V0IHJlb3BlbmVkJyk7XG4gICAgICAgICAgICBzZXREZXRhaWwoKGQpID0+IChkICYmIGQuaWQgPT09IGlkID8geyAuLi5kLCBzdGF0dXM6IG5leHQgfSA6IGQpKTtcbiAgICAgICAgICAgIGF3YWl0IGxvYWQoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaGFuZGxlQWRtaW5FcnJvcihlLCAnQ291bGQgbm90IHVwZGF0ZSBzdGF0dXMnKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBzdWJtaXRFc2NhbGF0aW9uID0gYXN5bmMgKGU6IFJlYWN0LkZvcm1FdmVudCkgPT4ge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmICghaXNQYXJ0bmVyVGVuYW50QWRtaW4pIHJldHVybjtcbiAgICAgICAgaWYgKHN1YmplY3QudHJpbSgpLmxlbmd0aCA8IDIgfHwgYm9keS50cmltKCkubGVuZ3RoIDwgMTApIHtcbiAgICAgICAgICAgIHRvYXN0LmVycm9yKCdTdWJqZWN0IGFuZCBtZXNzYWdlICgxMCsgY2hhcnMpIHJlcXVpcmVkJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2V0U2F2aW5nKHRydWUpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHJpZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHJlbGF0ZWRVc2VySWQudHJpbSgpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbiA9IE51bWJlcihyZWxhdGVkVXNlcklkLnRyaW0oKSk7XG4gICAgICAgICAgICAgICAgaWYgKE51bWJlci5pc05hTihuKSkge1xuICAgICAgICAgICAgICAgICAgICB0b2FzdC5lcnJvcignUmVsYXRlZCB1c2VyIGlkIG11c3QgYmUgYSBudW1iZXInKTtcbiAgICAgICAgICAgICAgICAgICAgc2V0U2F2aW5nKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByaWQgPSBuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgYWRtaW5TZXJ2aWNlLmNyZWF0ZVN1cHBvcnRQYXJ0bmVyVGlja2V0KHtcbiAgICAgICAgICAgICAgICBzdWJqZWN0OiBzdWJqZWN0LnRyaW0oKSxcbiAgICAgICAgICAgICAgICBib2R5OiBib2R5LnRyaW0oKSxcbiAgICAgICAgICAgICAgICByZWxhdGVkX3VzZXJfaWQ6IHJpZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdG9hc3Quc3VjY2VzcygnVGlja2V0IHNlbnQgdG8gcGxhdGZvcm0gdGVhbScpO1xuICAgICAgICAgICAgc2V0U2hvd05ldyhmYWxzZSk7XG4gICAgICAgICAgICBzZXRTdWJqZWN0KCcnKTtcbiAgICAgICAgICAgIHNldEJvZHkoJycpO1xuICAgICAgICAgICAgc2V0UmVsYXRlZFVzZXJJZCgnJyk7XG4gICAgICAgICAgICBzZXRQYWdlKDEpO1xuICAgICAgICAgICAgYXdhaXQgbG9hZCgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBoYW5kbGVBZG1pbkVycm9yKGUsICdDb3VsZCBub3QgY3JlYXRlIHRpY2tldCcpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgc2V0U2F2aW5nKGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCB0b3RhbFBhZ2VzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHRvdGFsIC8gbGltaXQpKTtcbiAgICBjb25zdCBjb2xDb3VudCA9IGlzUGFydG5lclRlbmFudEFkbWluID8gNiA6IDc7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktNlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtd3JhcCBpdGVtcy1zdGFydCBqdXN0aWZ5LWJldHdlZW4gZ2FwLTRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8aDEgY2xhc3NOYW1lPVwidGV4dC0yeGwgZm9udC1ib2xkIHRleHQtc2xhdGUtOTAwIGRhcms6dGV4dC13aGl0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge2lzUGFydG5lclRlbmFudEFkbWluID8gJ1JlcXVlc3RzIHRvIHBsYXRmb3JtJyA6ICdQYXJ0bmVyIGVzY2FsYXRpb25zJ31cbiAgICAgICAgICAgICAgICAgICAgPC9oMT5cbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMSB0ZXh0LXNtIHRleHQtc2xhdGUtNTAwIGRhcms6dGV4dC1zbGF0ZS00MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtpc1BhcnRuZXJUZW5hbnRBZG1pblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ1JhaXNlIGlzc3VlcyBhYm91dCB5b3VyIHBhcnRuZXIgb3IgYSBzcGVjaWZpYyB1c2VyLiBWZWFsdGh4IHBsYXRmb3JtIGFkbWlucyBtYW5hZ2Ugc3RhdHVzLidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdUaWNrZXRzIG9wZW5lZCBieSBwYXJ0bmVyIGFkbWluaXN0cmF0b3JzIHRvIHRoZSBwbGF0Zm9ybSB0ZWFtLid9XG4gICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB7aXNQYXJ0bmVyVGVuYW50QWRtaW4gJiYgKFxuICAgICAgICAgICAgICAgICAgICA8QnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwicHJpbWFyeVwiIG9uQ2xpY2s9eygpID0+IHNldFNob3dOZXcodHJ1ZSl9PlxuICAgICAgICAgICAgICAgICAgICAgICAgTmV3IHJlcXVlc3RcbiAgICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8Q2FyZCBjbGFzc05hbWU9XCJwLTAgb3ZlcmZsb3ctaGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtd3JhcCBnYXAtMyBib3JkZXItYiBib3JkZXItc2xhdGUtMjAwIHAtNCBkYXJrOmJvcmRlci1zbGF0ZS04MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3N0YXR1c31cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFBhZ2UoMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdHVzKGUudGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgI
301H19XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLWxnIGJvcmRlciBib3JkZXItc2xhdGUtMjAwIGJnLXdoaXRlIHB4LTMgcHktMiB0ZXh0LXNtIGRhcms6Ym9yZGVyLXNsYXRlLTcwMCBkYXJrOmJnLXNsYXRlLTkwMCBkYXJrOnRleHQtd2hpdGVcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+QWxsIHN0YXR1c2VzPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwib3BlblwiPk9wZW48L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJjbG9zZWRcIj5DbG9zZWQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIHshaXNQYXJ0bmVyVGVuYW50QWRtaW4gJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwYXJ0bmVySWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFBhZ2UoMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFBhcnRuZXJJZChlLnRhcmdldC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLWxnIGJvcmRlciBib3JkZXItc2xhdGUtMjAwIGJnLXdoaXRlIHB4LTMgcHktMiB0ZXh0LXNtIGRhcms6Ym9yZGVyLXNsYXRlLTcwMCBkYXJrOmJnLXNsYXRlLTkwMCBkYXJrOnRleHQtd2hpdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5BbGwgcGFydG5lcnM8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydG5lcnMubWFwKChwKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24ga2V5PXtwLmlkfSB2YWx1ZT17U3RyaW5nKHAuaWQpfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwLnBhcnRuZXJfbmFtZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm92ZXJmbG93LXgtYXV0b1wiPlxuICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3NOYW1lPVwidy1mdWxsIHRleHQtbGVmdCB0ZXh0LXNtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGhlYWQgY2xhc3NOYW1lPVwiYm9yZGVyLWIgYm9yZGVyLXNsYXRlLTIwMCBiZy1zbGF0ZS01MC84MCBkYXJrOmJvcmRlci1zbGF0ZS04MDAgZGFyazpiZy1zbGF0ZS04MDAvNDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzc05hbWU9XCJweC00IHB5LTMgZm9udC1zZW1pYm9sZCB0ZXh0LXNsYXRlLTYwMCBkYXJrOnRleHQtc2xhdGUtMzAwXCI+SUQ8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3NOYW1lPVwicHgtNCBweS0zIGZvbnQtc2VtaWJvbGQgdGV4dC1zbGF0ZS02MDAgZGFyazp0ZXh0LXNsYXRlLTMwMFwiPlN1YmplY3Q8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IWlzUGFydG5lclRlbmFudEFkbWluICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzc05hbWU9XCJweC00IHB5LTMgZm9udC1zZW1pYm9sZCB0ZXh0LXNsYXRlLTYwMCBkYXJrOnRleHQtc2xhdGUtMzAwXCI+UGFydG5lcjwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzc05hbWU9XCJweC00IHB5LTMgZm9udC1zZW1pYm9sZCB0ZXh0LXNsYXRlLTYwMCBkYXJrOnRleHQtc2xhdGUtMzAwXCI+RnJvbTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzc05hbWU9XCJweC00IHB5LTMgZm9udC1zZW1pYm9sZCB0ZXh0LXNsYXRlLTYwMCBkYXJrOnRleHQtc2xhdGUtMzAwXCI+UmVsYXRlZCB1c2VyPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzTmFtZT1cInB4LTQgcHktMyBmb250LXNlbWlib2xkIHRleHQtc2xhdGUtNjAwIGRhcms6dGV4dC1zbGF0ZS0zMDBcIj5TdGF0dXM8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3NOYW1lPVwicHgtNCBweS0zIGZvbnQtc2VtaWJvbGQgdGV4dC1zbGF0ZS02MDAgZGFyazp0ZXh0LXNsYXRlLTMwMFwiPkNyZWF0ZWQ8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5IGNsYXNzTmFtZT1cImRpdmlkZS15IGRpdmlkZS1zbGF0ZS0xMDAgZGFyazpkaXZpZGUtc2xhdGUtODAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2xvYWRpbmcgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xTcGFuPXtjb2xDb3VudH0gY2xhc3NOYW1lPVwicHgtNCBweS0xMCB0ZXh0LWNlbnRlciB0ZXh0LXNsYXRlLTUwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYWRpbmfigKZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA6IHRpY2tldHMubGVuZ3RoID09PSAwID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sU3Bhbj17Y29sQ291bnR9IGNsYXNzTmFtZT1cInB4LTQgcHktMTAgdGV4dC1jZW50ZXIgdGV4dC1zbGF0ZS01MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBObyB0aWNrZXRzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWNrZXRzLm1hcCgodCkgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PXt0LmlkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImN1cnNvci1wb2ludGVyIGhvdmVyOmJnLXNsYXRlLTUwIGRhcms6aG92ZXI6Ymctc2xhdGUtODAwLzQwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB2b2lkIG9wZW5Sb3codCl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzTmFtZT1cInB4LTQgcHktMyBmb250LW1vbm8gdGV4dC14c1wiPnt0LmlkfTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzTmFtZT1cInB4LTQgcHktMyBmb250LW1lZGl1bSB0ZXh0LXNsYXRlLTkwMCBkYXJrOnRleHQtd2hpdGVcIj57dC5zdWJqZWN0fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyFpc1BhcnRuZXJUZW5hbnRBZG1pbiAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzc05hbWU9XCJweC00IHB5LTMgdGV4dC14cyB0ZXh0LXNsYXRlLTYwMCBkYXJrOnRleHQtc2xhdGUtNDAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dC5wYXJ0bmVyX25hbWUgfHwgdC5wYXJ0bmVyX2lkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzTmFtZT1cIm1heC13LVsxMjBweF0gdHJ1bmNhdGUgcHgtNCBweS0zIHRleHQteHMgdGV4dC1zbGF0ZS01MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3QuY3JlYXRvcl9sYWJlbC
301B8fCAn4oCUJ31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzc05hbWU9XCJtYXgtdy1bMTIwcHhdIHRydW5jYXRlIHB4LTQgcHktMyB0ZXh0LXhzIHRleHQtc2xhdGUtNTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0LnJlbGF0ZWRfdXNlcl9sYWJlbCB8fCAodC5yZWxhdGVkX3VzZXJfaWQgPyBgIyR7dC5yZWxhdGVkX3VzZXJfaWR9YCA6ICfigJQnKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzc05hbWU9XCJweC00IHB5LTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JvdW5kZWQtZnVsbCBweC0yIHB5LTAuNSB0ZXh0LVsxMHB4XSBmb250LWJvbGQgdXBwZXJjYXNlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnN0YXR1cyA9PT0gJ29wZW4nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ2JnLWVtZXJhbGQtMTAwIHRleHQtZW1lcmFsZC04MDAgZGFyazpiZy1lbWVyYWxkLTkwMC80MCBkYXJrOnRleHQtZW1lcmFsZC0yMDAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ2JnLXNsYXRlLTIwMCB0ZXh0LXNsYXRlLTYwMCBkYXJrOmJnLXNsYXRlLTcwMCBkYXJrOnRleHQtc2xhdGUtMzAwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0LnN0YXR1c31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzTmFtZT1cInB4LTQgcHktMyB0ZXh0LXhzIHRleHQtc2xhdGUtNTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0LmNyZWF0ZWRfYXQgPyBuZXcgRGF0ZSh0LmNyZWF0ZWRfYXQpLnRvTG9jYWxlU3RyaW5nKCkgOiAn4oCUJ31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB7dG90YWxQYWdlcyA+IDEgJiYgKFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1iZXR3ZWVuIGJvcmRlci10IGJvcmRlci1zbGF0ZS0yMDAgcC00IGRhcms6Ym9yZGVyLXNsYXRlLTgwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtwYWdlIDw9IDF9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0UGFnZSgocCkgPT4gTWF0aC5tYXgoMSwgcCAtIDEpKX1cbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmV2aW91c1xuICAgICAgICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudD1cIm91dGxpbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJzbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3BhZ2UgPj0gdG90YWxQYWdlc31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRQYWdlKChwKSA9PiBNYXRoLm1pbih0b3RhbFBhZ2VzLCBwICsgMSkpfVxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5leHRcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9DYXJkPlxuXG4gICAgICAgICAgICB7ZGV0YWlsICYmIChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZpeGVkIGluc2V0LTAgei1bMTAwXSBmbGV4IGl0ZW1zLWVuZCBqdXN0aWZ5LWNlbnRlciBiZy1zbGF0ZS05MDAvNTUgcC00IHNtOml0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1heC1oLVs5MHZoXSB3LWZ1bGwgbWF4LXctbGcgb3ZlcmZsb3cteS1hdXRvIHJvdW5kZWQtMnhsIGJvcmRlciBib3JkZXItc2xhdGUtMjAwIGJnLXdoaXRlIHAtNiBzaGFkb3cteGwgZGFyazpib3JkZXItc2xhdGUtNzAwIGRhcms6Ymctc2xhdGUtOTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtc3RhcnQganVzdGlmeS1iZXR3ZWVuIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRleHQtbGcgZm9udC1ib2xkIHRleHQtc2xhdGUtOTAwIGRhcms6dGV4dC13aGl0ZVwiPntkZXRhaWwuc3ViamVjdH08L2gzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldERldGFpbChudWxsKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXNsYXRlLTUwMCBob3Zlcjp0ZXh0LXNsYXRlLTgwMCBkYXJrOmhvdmVyOnRleHQtc2xhdGUtMjAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsb3NlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm10LTIgdGV4dC14cyB0ZXh0LXNsYXRlLTUwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICN7ZGV0YWlsLmlkfSDCtyB7ZGV0YWlsLnBhcnRuZXJfbmFtZSB8fCBgUGFydG5lciAke2RldGFpbC5wYXJ0bmVyX2lkfWB9IMK3eycgJ31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LXNlbWlib2xkIHVwcGVyY2FzZVwiPntkZXRhaWwuc3RhdHVzfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgI
301HtkZXRhaWwucmVsYXRlZF91c2VyX2xhYmVsICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJtdC0xIHRleHQteHMgdGV4dC1zbGF0ZS01MDBcIj5SZWxhdGVkIHVzZXI6IHtkZXRhaWwucmVsYXRlZF91c2VyX2xhYmVsfTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJtdC00IHdoaXRlc3BhY2UtcHJlLXdyYXAgdGV4dC1zbSB0ZXh0LXNsYXRlLTcwMCBkYXJrOnRleHQtc2xhdGUtMjAwXCI+e2RldGFpbC5ib2R5fTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIHshaXNQYXJ0bmVyVGVuYW50QWRtaW4gJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtNiBmbGV4IGZsZXgtd3JhcCBnYXAtMiBib3JkZXItdCBib3JkZXItc2xhdGUtMTAwIHB0LTQgZGFyazpib3JkZXItc2xhdGUtODAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtkZXRhaWwuc3RhdHVzID09PSAnb3BlbicgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwib3V0bGluZVwiIG9uQ2xpY2s9eygpID0+IHZvaWQgc2V0U3RhdHVzUmVtb3RlKGRldGFpbC5pZCwgJ2Nsb3NlZCcpfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXJrIGNsb3NlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwib3V0bGluZVwiIG9uQ2xpY2s9eygpID0+IHZvaWQgc2V0U3RhdHVzUmVtb3RlKGRldGFpbC5pZCwgJ29wZW4nKX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVvcGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKX1cblxuICAgICAgICAgICAge3Nob3dOZXcgJiYgaXNQYXJ0bmVyVGVuYW50QWRtaW4gJiYgKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZml4ZWQgaW5zZXQtMCB6LVsxMTBdIGZsZXggaXRlbXMtZW5kIGp1c3RpZnktY2VudGVyIGJnLXNsYXRlLTkwMC81NSBwLTQgc206aXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxmb3JtXG4gICAgICAgICAgICAgICAgICAgICAgICBvblN1Ym1pdD17c3VibWl0RXNjYWxhdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbCBtYXgtdy1tZCByb3VuZGVkLTJ4bCBib3JkZXIgYm9yZGVyLXNsYXRlLTIwMCBiZy13aGl0ZSBwLTYgc2hhZG93LXhsIGRhcms6Ym9yZGVyLXNsYXRlLTcwMCBkYXJrOmJnLXNsYXRlLTkwMFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzc05hbWU9XCJ0ZXh0LWxnIGZvbnQtYm9sZCB0ZXh0LXNsYXRlLTkwMCBkYXJrOnRleHQtd2hpdGVcIj5OZXcgcmVxdWVzdCB0byBwbGF0Zm9ybTwvaDM+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTQgc3BhY2UteS0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT1cIm1iLTEgYmxvY2sgdGV4dC14cyBmb250LXNlbWlib2xkIHRleHQtc2xhdGUtNjAwIGRhcms6dGV4dC1zbGF0ZS0zMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17c3ViamVjdH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0U3ViamVjdChlLnRhcmdldC52YWx1ZSl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgcm91bmRlZC1sZyBib3JkZXIgYm9yZGVyLXNsYXRlLTIwMCBweC0zIHB5LTIgdGV4dC1zbSBkYXJrOmJvcmRlci1zbGF0ZS02MDAgZGFyazpiZy1zbGF0ZS04MDAgZGFyazp0ZXh0LXdoaXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwibWItMSBibG9jayB0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdGV4dC1zbGF0ZS02MDAgZGFyazp0ZXh0LXNsYXRlLTMwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtib2R5fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiBzZXRCb2R5KGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd3M9ezV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgcm91bmRlZC1sZyBib3JkZXIgYm9yZGVyLXNsYXRlLTIwMCBweC0zIHB5LTIgdGV4dC1zbSBkYXJrOmJvcmRlci1zbGF0ZS02MDAgZGFyazpiZy1zbGF0ZS04MDAgZGFyazp0ZXh0LXdoaXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwibWItMSBibG9jayB0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdGV4dC1zbGF0ZS02MDAgZGFyazp0ZXh0LXNsYXRlLTMwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVsYXRlZCB1c2VyIGlkIChvcHRpb25hbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cmVsYXRlZFVzZXJJZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0UmVsYXRlZFVzZXJJZChlLnRhcmdldC52YWx1ZSl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gMTIzNDVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidy1mdWxsIHJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci1zbGF0ZS0yMDAgcHgtMyBweS0yIHRleHQtc20gZGFyazpib3JkZXItc2xhdGUtNjAwIGRhcms6Ymctc2xhdGUtODAwIGRhcms6dGV4dC13aGl0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm10LTEgdGV4dC1bMTBweF0gdGV4dC1zbGF0ZS01MDBcIj5NdXN0IGJlIGEgdXNlciB1bmRlciB5b3VyIHBhcnRuZXIuPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTYgZmxleCBqdXN0aWZ5LWVuZCBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxCdXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJvdXRsaW5lXCIgb25DbGljaz17KCkgPT4gc2V0U2hvd05ldyhmYWxzZSl9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW5jZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QnV0dG9uIHR5cGU9XCJzdWJtaXRcIiB2YXJpYW50PVwicHJpbWFyeVwiIGxvYWRpbmc9e3NhdmluZ30+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1Ym1pdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuICAgICk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUE4SGdCLFNBQ0ksS0FESjtBQTlIaEIsT0FBTyxTQUFTLFdBQVcsZ0JBQWdCO0FBQzNDLFNBQVMsb0JBQXdDO0FBQ2pELFNBQVMsd0JBQXdCO0FBQ2pDLFNBQVMsb0JBQW9CO0FBQzdCLFNBQVMsY0FBYztBQUN2QixTQUFTLFlBQVk7QUFDckIsU0FBUyxVQUFVO0FBQ25CLE9BQU8sV0FBVztBQUVYLGFBQU0sd0JBQWtDLE1BQU07QUFDakQsUUFBTSxFQUFFLHFCQUFxQixJQUFJLGFBQWE7QUFDOUMsUUFBTSxDQUFDLFNBQVMsVUFBVSxJQUFJLFNBQTBCLENBQUMsQ0FBQztBQUMxRCxRQUFNLENBQUMsT0FBTyxRQUFRLElBQUksU0FBUyxDQUFDO0FBQ3BDLFFBQU0sQ0FBQyxNQUFNLE9BQU8sSUFBSSxTQUFTLENBQUM7QUFDbEMsUUFBTSxDQUFDLFFBQVEsU0FBUyxJQUFJLFNBQWlCLEVBQUU7QUFDL0MsUUFBTSxDQUFDLFdBQVcsWUFBWSxJQUFJLFNBQWlCLEVBQUU7QUFDckQsUUFBTSxDQUFDLFVBQVUsV0FBVyxJQUFJLFNBQWlELENBQUMsQ0FBQztBQUNuRixRQUFNLENBQUMsU0FBUyxVQUFVLElBQUksU0FBUyxJQUFJO0FBQzNDLFFBQU0sQ0FBQyxRQUFRLFNBQVMsSUFBSSxTQUErQixJQUFJO0FBQy9ELFFBQU0sQ0FBQyxTQUFTLFVBQVUsSUFBSSxTQUFTLEtBQUs7QUFDNUMsUUFBTSxDQUFDLFNBQVMsVUFBVSxJQUFJLFNBQVMsRUFBRTtBQUN6QyxRQUFNLENBQUMsTUFBTSxPQUFPLElBQUksU0FBUyxFQUFFO0FBQ25DLFFBQU0sQ0FBQyxlQUFlLG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
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.