PageSourceSearch

https://www.myinteriordesigners.com/src/pages/admin/AdminProfile.tsx

js myinteriordesigners.com collected 2026-10-06 01:01:33 UTC 42,096 bytes, 448 lines download raw bytes

1import __vite__cjsImport0_react_jsxDevRuntime from "/node_modules/.vite/deps/react_jsx-dev-runtime.js?v=6dae5f06"; const Fragment = __vite__cjsImport0_react_jsxDevRuntime["Fragment"]; const jsxDEV = __vite__cjsImport0_react_jsxDevRuntime["jsxDEV"];
2import __vite__cjsImport1_react from "/node_modules/.vite/deps/react.js?v=6dae5f06"; const React = __vite__cjsImport1_react.__esModule ? __vite__cjsImport1_react.default : __vite__cjsImport1_react; const useState = __vite__cjsImport1_react["useState"];
3import { User, Mail, Lock, Save, Camera, Key } from "/node_modules/.vite/deps/lucide-react.js?v=6dae5f06";
4import { Button } from "/components/ui/button.tsx";
5import { Input } from "/components/ui/input.tsx";
6import { Label } from "/components/ui/label.tsx";
7import { toast } from "/node_modules/.vite/deps/sonner.js?v=6dae5f06";
8import api from "/src/lib/api.ts";
9export default function AdminProfile() {
10  const [isLoading, setIsLoading] = useState(false);
11  const [isPasswordLoading, setIsPasswordLoading] = useState(false);
12  const [adminData, setAdminData] = useState({
13    name: "",
14    email: ""
15  });
16  const [passwords, setPasswords] = useState({
17    currentPassword: "",
18    newPassword: "",
19    confirmPassword: ""
20  });
21  React.useEffect(() => {
22    api.get("/auth/me").then((res) => {
23      setAdminData({
24        name: res.data.name,
25        email: res.data.email
26      });
27    }).catch((err) => {
28      toast.error("Failed to fetch profile data");
29    });
30  }, []);
31  const handleSave = async (e) => {
32    e.preventDefault();
33    setIsLoading(true);
34    try {
35      await api.patch("/admin/profile", {
36        name: adminData.name,
37        email: adminData.email
38      });
39      toast.success("Profile updated successfully");
40    } catch (error) {
41      toast.error(error.response?.data?.error || "Failed to update profile");
42    } finally {
43      setIsLoading(false);
44    }
45  };
46  const handleChangePassword = async (e) => {
47    e.preventDefault();
48    if (passwords.newPassword !== passwords.confirmPassword) {
49      toast.error("New passwords do not match");
50      return;
51    }
52    if (passwords.newPassword.length < 6) {
53      toast.error("Password must be at least 6 characters");
54      return;
55    }
56    setIsPasswordLoading(true);
57    try {
58      await api.patch("/admin/change-password", {
59        currentPassword: passwords.currentPassword,
60        newPassword: passwords.newPassword
61      });
62      toast.success("Password updated successfully");
63      setPasswords({
64        currentPassword: "",
65        newPassword: "",
66        confirmPassword: ""
67      });
68    } catch (error) {
69      toast.error(error.response?.data?.error || "Failed to update password");
70    } finally {
71      setIsPasswordLoading(false);
72    }
73  };
74  return /* @__PURE__ */ jsxDEV("div", { className: "max-w-4xl mx-auto space-y-8", children: [
75    /* @__PURE__ */ jsxDEV("div", { children: [
76      /* @__PURE__ */ jsxDEV("h1", { className: "text-2xl font-bold text-slate-900", children: "Admin Profile" }, void 0, false, {
77        fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
78        lineNumber: 82,
79        columnNumber: 9
80      }, this),
81      /* @__PURE__ */ jsxDEV("p", { className: "text-slate-500", children: "Manage your account settings and security preferences" }, void 0, false, {
82        fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
83        lineNumber: 83,
84        columnNumber: 9
85      }, this)
86    ] }, void 0, true, {
87      fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
88      lineNumber: 81,
89      columnNumber: 7
90    }, this),
91    /* @__PURE__ */ jsxDEV("div", { className: "grid grid-cols-1 md:grid-cols-3 gap-8", children: [
92      /* @__PURE__ */ jsxDEV("div", { className: "md:col-span-1", children: /* @__PURE__ */ jsxDEV("div", { className: "bg-white p-6 rounded-2xl border border-slate-100 shadow-sm text-center", children: [
93        /* @__P
93URE__ */ jsxDEV("div", { className: "relative inline-block", children: [
94          /* @__PURE__ */ jsxDEV("div", { className: "w-32 h-32 rounded-full bg-red-50 flex items-center justify-center text-[#bb1341] text-4xl font-bold border-4 border-white shadow-lg uppercase", children: adminData.name ? adminData.name.substring(0, 2) : "AD" }, void 0, false, {
95            fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
96            lineNumber: 90,
97            columnNumber: 15
98          }, this),
99          /* @__PURE__ */ jsxDEV("button", { className: "absolute bottom-0 right-0 p-2 bg-slate-900 text-white rounded-full border-2 border-white hover:bg-slate-800 transition-colors", children: /* @__PURE__ */ jsxDEV(Camera, { size: 16 }, void 0, false, {
100            fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
101            lineNumber: 94,
102            columnNumber: 17
103          }, this) }, void 0, false, {
104            fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
105            lineNumber: 93,
106            columnNumber: 15
107          }, this)
108        ] }, void 0, true, {
109          fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
110          lineNumber: 89,
111          columnNumber: 13
112        }, this),
113        /* @__PURE__ */ jsxDEV("h2", { className: "mt-4 font-bold text-slate-900 text-lg", children: adminData.name || "Admin" }, void 0, false, {
114          fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
115          lineNumber: 97,
116          columnNumber: 13
117        }, this),
118        /* @__PURE__ */ jsxDEV("p", { className: "text-slate-500 text-sm", children: "Administrator" }, void 0, false, {
119          fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
120          lineNumber: 98,
121          columnNumber: 13
122        }, this),
123        /* @__PURE__ */ jsxDEV("div", { className: "mt-6 pt-6 border-t border-slate-50 space-y-2", children: [
124          /* @__PURE__ */ jsxDEV("div", { className: "flex items-center justify-between text-xs", children: [
125            /* @__PURE__ */ jsxDEV("span", { className: "text-slate-400", children: "Role" }, void 0, false, {
126              fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
127              lineNumber: 101,
128              columnNumber: 17
129            }, this),
130            /* @__PURE__ */ jsxDEV("span", { className: "font-semibold text-slate-700", children: "Full Access" }, void 0, false, {
131              fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
132              lineNumber: 102,
133              columnNumber: 17
134            }, this)
135          ] }, void 0, true, {
136            fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
137            lineNumber: 100,
138            columnNumber: 15
139          }, this),
140          /* @__PURE__ */ jsxDEV("div", { className: "flex items-center justify-between text-xs", children: [
141            /* @__PURE__ */ jsxDEV("span", { className: "text-slate-400", children: "Member since" }, void 0, false, {
142              fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
143              lineNumber: 105,
144              columnNumber: 17
145            }, this),
146            /* @__PURE__ */ jsxDEV("span", { className: "font-semibold text-slate-700", children: "April 2024" }, void 0, false, {
147              fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
148              lineNumber: 106,
149              columnNumber: 17
150            }, this)
151          ] }, void 0, true, {
152            fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
153            lineNumber: 104,
154            columnNumber: 15
155          }, this)
156        ] }, void 0, true, {
157          fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
158          lineNumber: 99,
159          columnNumber: 13
160        }, this)
161      ] }, void 0, true, {
162        fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
163        lineNumber: 88,
164        columnNumber: 11
165      }, this) }, void 0, false, {
166        fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
167        lineNumber: 87,
168        columnNumber: 9
169      }, this),
170      /* @__PURE__ */ jsxDEV("div", { className: "md:col-span-2 space-y-6", children: [
171        /* @__PURE__ */ jsxDEV("form", { onSubmit: handleSave, className: "bg-white p-8 rounded-2xl border border-slate-100 shadow-sm space-y-6", children: [
172          /* @__PURE__ */ jsxDEV("div", { className: "flex items-center space-x-2 text-slate-900 font-bold border-b border-slate-50 pb-4 mb-6", children: [
173            /* @__PURE__ */ jsxDEV(User, { size: 20, className: "text-[#bb1341]" }, void 0, false, {
174              fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
175              lineNumber: 115,
176              columnNumber: 15
177            }, this),
178            /* @__PURE__ */ jsxDEV("span", { children: "Personal Information" }, void 0, false, {
179              fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
180              lineNumber: 116,
181              columnNumber: 15
182            }, this)
183          ] }, void 0, true, {
184            fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
185            lineNumber: 114,
186            columnNumber: 13
187          }, this),
188          /* @__PURE__ */ jsxDEV("div", { className: "grid grid-cols-1 gap-6", children: /* @__PURE__ */ jsxDEV("div", { className: "space-y-2", children: [
189            /* @__PURE__ */ jsxDEV(Label, { htmlFor: "name", children: "Full Name" }, void 0, false, {
190              fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
191              lineNumber: 121,
192              columnNumber: 17
193            }, this),
194            /* @__PURE__ */ jsxDEV(
195              Input,
196              {
197                id: "name",
198                value: adminData.name,
199                onChange: (e) => setAdminData({ ...adminData, name: e.target.value }),
200                className: "rounded-xl border-slate-200",
201                required: true
202              },
203              void 0,
204              false,
205              {
206                fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
207                lineNumber: 122,
208                columnNumber: 17
209              },
210              this
211            )
212          ] }, void 0, true, {
213            fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
214            lineNumber: 120,
215            columnNumber: 15
216          }, this) }, void 0, false, {
217            fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
218            lineNumber: 119,
219            columnNumber: 13
220          }, this),
221          /* @__PURE__ */ jsxDEV("div", { className: "space-y-2", children: [
222            /* @__PURE__ */ jsxDEV(Label, { htmlFor: "email", children: "Email Address" }, void 0, false, {
223              fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
224              lineNumber: 133,
225              columnNumber: 15
226            }, this),
227            /* @__PURE__ */ jsxDEV("div", { className: "relative", children: [
228              /* @__PURE__ */ jsxDEV(Mail, { className: "absolute left-3 top-1/2 -translate-y-1/2 text-slate-400", size: 18 }, void 0, false, {
229                fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
230                lineNumber: 135,
231                columnNumber: 17
232              }, this),
233              /* @__PURE__ */ jsxDEV(
234                Input,
235                {
236                  id: "email",
237                  type: "email",
238                  value: adminData.email,
239                  onChange: (e) => setAdminData({ ...adminData, email: e.target.value }),
240                  className: "pl-10 rounded-xl border-slate-200",
241                  required: true
242                },
243                void 0,
244                false,
245                {
246                  fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
247                  lineNumber: 136,
248                  columnNumber: 17
249                },
250                this
251              )
252            ] }, void 0, true, {
253              fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
254              lineNumber: 134,
255              columnNumber: 15
256            }, this)
257          ] }, void 0, true, {
258            fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
259            lineNumber: 132,
260            columnNumber: 13
261          }, this),
262          /* @__PURE__ */ jsxDEV("div", { className: "pt-4", children: /* @__PURE__ */ jsxDEV(Button, { type: "submit", disabled: isLoading, className: "bg-slate-900 hover:bg-slate-800 text-white rounded-xl px-8 h-12", children: isLoading ? "Saving..." : /* @__PURE__ */ jsxDEV(Fragment, { children: [
263            /* @__PURE__ */ jsxDEV(Save, { size: 18, className: "mr-2" }, void 0, false, {
264              fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
265              lineNumber: 151,
266              columnNumber: 21
267            }, this),
268            " Save Changes"
269          ] }, void 0, true, {
270            fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
271            lineNumber: 150,
272            columnNumber: 19
273          }, this) }, void 0, false, {
274            fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
275            lineNumber: 148,
276            columnNumber: 15
277          }, this) }, void 0, false, {
278            fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
279            lineNumber: 147,
280            columnNumber: 13
281          }, this)
282        ] }, void 0, true, {
283          fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
284          lineNumber: 113,
285          columnNumber: 11
286        }, this),
287        /* @__PURE__ */ jsxDEV("form", { onSubmit: handleChangePassword, className: "bg-white p-8 rounded-2xl border border-slate-100 shadow-sm space-y-6", children: [
288          /* @__PURE__ */ jsxDEV("div", { className: "flex items-center space-x-2 text-slate-900 font-bold border-b border-slate-50 pb-4 mb-6", children: [
289            /* @__PURE__ */ jsxDEV(Lock, { size: 20, className: "text-[#bb1341]" }, void 0, false, {
290              fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
291              lineNumber: 160,
292              columnNumber: 15
293            }, this),
294            /* @__PURE__ */ jsxDEV("span", { children: "Security Settings" }, void 0, false, {
295              fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
296              lineNumber: 161,
297              columnNumber: 15
298            }, this)
299          ] }, void 0, true, {
300            fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
301            lineNumber: 159,
302            columnNumber: 13
303          }, this),
304          /* @__PURE__ */ jsxDEV("div", { className: "space-y-4", children: [
305            /* @__PURE__ */ jsxDEV("div", { className: "space-y-2", children: [
306              /* @__PURE__ */ jsxDEV(Label, { htmlFor: "currentPassword", children: "Current Password" }, void 0, false, {
307                fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
308                lineNumber: 166,
309                columnNumber: 17
310              }, this),
311              /* @__PURE__ */ jsxDEV("div", { className: "relative", children: [
312                /* @__PURE__ */ jsxDEV(Key, { className: "absolute left-3 top-1/2 -translate-y-1/2 text-slate-400", size: 18 }, void 0, false, {
313                  fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
314                  lineNumber: 168,
315                  columnNumber: 19
316                }, this),
317                /* @__PURE__ */ jsxDEV(
318                  Input,
319                  {
320                    id: "currentPassword",
321                    type: "password",
322                    value: passwords.currentPassword,
323                    onChange: (e) => setPasswords({ ...passwords, currentPassword: e.target.value }),
324                    className: "pl-10 rounded-xl border-slate-200",
325                    required: true
326                  },
327                  void 0,
328                  false,
329                  {
330                    fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
331                    lineNumber: 169,
332                    columnNumber: 19
333                  },
334                  this
335                )
336              ] }, void 0, true, {
337                fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
338                lineNumber: 167,
339                columnNumber: 17
340              }, this)
341            ] }, void 0, true, {
342              fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
343              lineNumber: 165,
344              columnNumber: 15
345            }, this),
346            /* @__PURE__ */ jsxDEV("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-6", children: [
347              /* @__PURE__ */ jsxDEV("div", { className: "space-y-2", children: [
348                /* @__PURE__ */ jsxDEV(Label, { htmlFor: "newPassword", children: "New Password" }, void 0, false, {
349                  fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
350                  lineNumber: 182,
351                  columnNumber: 19
352                }, this),
353                /* @__PURE__ */ jsxDEV(
354                  Input,
355                  {
356                    id: "newPassword",
357                    type: "password",
358                    value: passwords.newPassword,
359                    onChange: (e) => setPasswords({ ...passwords, newPassword: e.target.value }),
360                    className: "rounded-xl border-slate-200",
361                    required: true
362                  },
363                  void 0,
364                  false,
365                  {
366                    fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
367                    lineNumber: 183,
368                    columnNumber: 19
369                  },
370                  this
371                )
372              ] }, void 0, true, {
373                fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
374                lineNumber: 181,
375                columnNumber: 17
376              }, this),
377              /* @__PURE__ */ jsxDEV("div", { className: "space-y-2", children: [
378                /* @__PURE__ */ jsxDEV(Label, { htmlFor: "confirmPassword", children: "Confirm New Password" }, void 0, false, {
379                  fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
380                  lineNumber: 193,
381                  columnNumber: 19
382                }, this),
383                /* @__PURE__ */ jsxDEV(
384                  Input,
385                  {
386                    id: "confirmPassword",
387                    type: "password",
388                    value: passwords.confirmPassword,
389                    onChange: (e) => setPasswords({ ...passwords, confirmPassword: e.target.value }),
390                    className: "rounded-xl border-slate-200",
391                    required: true
392                  },
393                  void 0,
394                  false,
395                  {
396                    fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
397                    lineNumber: 194,
398                    columnNumber: 19
399                  },
400                  this
401                )
402              ] }, void 0, true, {
403                fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
404                lineNumber: 192,
405                columnNumber: 17
406              }, this)
407            ] }, void 0, true, {
408              fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
409              lineNumber: 180,
410              columnNumber: 15
411            }, this),
412            /* @__PURE__ */ jsxDEV("div", { className: "pt-4", children: /* @__PURE__ */ jsxDEV(Button, { type: "submit", disabled: isPasswordLoading, className: "btn-gradient border-none text-white rounded-xl px-8 h-12", children: isPasswordLoading ? "Updating..." : "Update Password" }, void 0, false, {
413              fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
414              lineNumber: 206,
415              columnNumber: 17
416            }, this) }, void 0, false, {
417              fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
418              lineNumber: 205,
419              columnNumber: 15
420            }, this)
421          ] }, void 0, true, {
422            fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
423            lineNumber: 164,
424            columnNumber: 13
425          }, this)
426        ] }, void 0, true, {
427          fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
428          lineNumber: 158,
429          columnNumber: 11
430        }, this)
431      ] }, void 0, true, {
432        fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
433        lineNumber: 112,
434        columnNumber: 9
435      }, this)
436    ] }, void 0, true, {
437      fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
438      lineNumber: 86,
439      columnNumber: 7
440    }, this)
441  ] }, void 0, true, {
442    fileName: "/home/myinteri/nodejs/src/pages/admin/AdminProfile.tsx",
443    lineNumber: 80,
444    columnNumber: 5
445  }, this);
446}
447
448//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkFkbWluUHJvZmlsZS50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBVc2VyLCBNYWlsLCBMb2NrLCBTYXZlLCBDYW1lcmEsIEtleSB9IGZyb20gJ2x1Y2lkZS1yZWFjdCc7XHJcbmltcG9ydCB7IEJ1dHRvbiB9IGZyb20gJ0AvY29tcG9uZW50cy91aS9idXR0b24nO1xyXG5pbXBvcnQgeyBJbnB1dCB9IGZyb20gJ0AvY29tcG9uZW50cy91aS9pbnB1dCc7XHJcbmltcG9ydCB7IExhYmVsIH0gZnJvbSAnQC9jb21wb25lbnRzL3VpL2xhYmVsJztcclxuaW1wb3J0IHsgdG9hc3QgfSBmcm9tICdzb25uZXInO1xyXG5pbXBvcnQgYXBpIGZyb20gJ0Avc3JjL2xpYi9hcGknO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQWRtaW5Qcm9maWxlKCkge1xyXG4gIGNvbnN0IFtpc0xvYWRpbmcsIHNldElzTG9hZGluZ10gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW2lzUGFzc3dvcmRMb2FkaW5nLCBzZXRJc1Bhc3N3b3JkTG9hZGluZ10gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW2FkbWluRGF0YSwgc2V0QWRtaW5EYXRhXSA9IHVzZVN0YXRlKHtcclxuICAgIG5hbWU6ICcnLFxyXG4gICAgZW1haWw6ICcnXHJcbiAgfSk7XHJcbiAgY29uc3QgW3Bhc3N3b3Jkcywgc2V0UGFzc3dvcmRzXSA9IHVzZVN0YXRlKHtcclxuICAgIGN1cnJlbnRQYXNzd29yZDogJycsXHJcbiAgICBuZXdQYXNzd29yZDogJycsXHJcbiAgICBjb25maXJtUGFzc3dvcmQ6ICcnXHJcbiAgfSk7XHJcblxyXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICBhcGkuZ2V0KCcvYXV0aC9tZScpLnRoZW4ocmVzID0+IHtcclxuICAgICAgc2V0QWRtaW5EYXRhKHtcclxuICAgICAgICBuYW1lOiByZXMuZGF0YS5uYW1lLFxyXG4gICAgICAgIGVtYWlsOiByZXMuZGF0YS5lbWFpbFxyXG4gICAgICB9KTtcclxuICAgIH0pLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgIHRvYXN0LmVycm9yKFwiRmFpbGVkIHRvIGZldGNoIHByb2ZpbGUgZGF0YVwiKTtcclxuICAgIH0pO1xyXG4gIH0sIFtdKTtcclxuXHJcbiAgY29uc3QgaGFuZGxlU2F2ZSA9IGFzeW5jIChlOiBSZWFjdC5Gb3JtRXZlbnQpID0+IHtcclxuICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgIHNldElzTG9hZGluZyh0cnVlKTtcclxuICAgIHRyeSB7XHJcbiAgICAgIGF3YWl0IGFwaS5wYXRjaCgnL2FkbWluL3Byb2ZpbGUnLCB7XHJcbiAgICAgICAgbmFtZTogYWRtaW5EYXRhLm5hbWUsXHJcbiAgICAgICAgZW1haWw6IGFkbWluRGF0YS5lbWFpbFxyXG4gICAgICB9KTtcclxuICAgICAgdG9hc3Quc3VjY2VzcygnUHJvZmlsZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseScpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xyXG4gICAgICB0b2FzdC5lcnJvcihlcnJvci5yZXNwb25zZT8uZGF0YT8uZXJyb3IgfHwgJ0ZhaWxlZCB0byB1cGRhdGUgcHJvZmlsZScpO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgc2V0SXNMb2FkaW5nKGZhbHNlKTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBjb25zdCBoYW5kbGVDaGFuZ2VQYXNzd29yZCA9IGFzeW5jIChlOiBSZWFjdC5Gb3JtRXZlbnQpID0+IHtcclxuICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgIGlmIChwYXNzd29yZHMubmV3UGFzc3dvcmQgIT09IHBhc3N3b3Jkcy5jb25maXJtUGFzc3dvcmQpIHtcclxuICAgICAgdG9hc3QuZXJyb3IoXCJOZXcgcGFzc3dvcmRzIGRvIG5vdCBtYXRjaFwiKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHBhc3N3b3Jkcy5uZXdQYXNzd29yZC5sZW5ndGggPCA2KSB7XHJcbiAgICAgIHRvYXN0LmVycm9yKFwiUGFzc3dvcmQgbXVzdCBiZSBhdCBsZWFzdCA2IGNoYXJhY3RlcnNcIik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBzZXRJc1Bhc3N3b3JkTG9hZGluZyh0cnVlKTtcclxuICAgIHRyeSB7XHJcbiAgICAgIGF3YWl0IGFwaS5wYXRjaCgnL2FkbWluL2NoYW5nZS1wYXNzd29yZCcsIHtcclxuICAgICAgICBjdXJyZW50UGFzc3dvcmQ6IHBhc3N3b3Jkcy5jdXJyZW50UGFzc3dvcmQsXHJcbiAgICAgICAgbmV3
448UGFzc3dvcmQ6IHBhc3N3b3Jkcy5uZXdQYXNzd29yZFxyXG4gICAgICB9KTtcclxuICAgICAgdG9hc3Quc3VjY2VzcygnUGFzc3dvcmQgdXBkYXRlZCBzdWNjZXNzZnVsbHknKTtcclxuICAgICAgc2V0UGFzc3dvcmRzKHtcclxuICAgICAgICBjdXJyZW50UGFzc3dvcmQ6ICcnLFxyXG4gICAgICAgIG5ld1Bhc3N3b3JkOiAnJyxcclxuICAgICAgICBjb25maXJtUGFzc3dvcmQ6ICcnXHJcbiAgICAgIH0pO1xyXG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xyXG4gICAgICB0b2FzdC5lcnJvcihlcnJvci5yZXNwb25zZT8uZGF0YT8uZXJyb3IgfHwgJ0ZhaWxlZCB0byB1cGRhdGUgcGFzc3dvcmQnKTtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHNldElzUGFzc3dvcmRMb2FkaW5nKGZhbHNlKTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICByZXR1cm4gKFxyXG4gICAgPGRpdiBjbGFzc05hbWU9XCJtYXgtdy00eGwgbXgtYXV0byBzcGFjZS15LThcIj5cclxuICAgICAgPGRpdj5cclxuICAgICAgICA8aDEgY2xhc3NOYW1lPVwidGV4dC0yeGwgZm9udC1ib2xkIHRleHQtc2xhdGUtOTAwXCI+QWRtaW4gUHJvZmlsZTwvaDE+XHJcbiAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbGF0ZS01MDBcIj5NYW5hZ2UgeW91ciBhY2NvdW50IHNldHRpbmdzIGFuZCBzZWN1cml0eSBwcmVmZXJlbmNlczwvcD5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImdyaWQgZ3JpZC1jb2xzLTEgbWQ6Z3JpZC1jb2xzLTMgZ2FwLThcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1kOmNvbC1zcGFuLTFcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmctd2h
448pdGUgcC02IHJvdW5kZWQtMnhsIGJvcmRlciBib3JkZXItc2xhdGUtMTAwIHNoYWRvdy1zbSB0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlIGlubGluZS1ibG9ja1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidy0zMiBoLTMyIHJvdW5kZWQtZnVsbCBiZy1yZWQtNTAgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdGV4dC1bI2JiMTM0MV0gdGV4dC00eGwgZm9udC1ib2xkIGJvcmRlci00IGJvcmRlci13aGl0ZSBzaGFkb3ctbGcgdXBwZXJjYXNlXCI+XHJcbiAgICAgICAgICAgICAgICB7YWRtaW5EYXRhLm5hbWUgPyBhZG1pbkRhdGEubmFtZS5zdWJzdHJpbmcoMCwgMikgOiAnQUQnfVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3NOYW1lPVwiYWJzb2x1dGUgYm90dG9tLTAgcmlnaHQtMCBwLTIgYmctc2xhdGUtOTAwIHRleHQtd2hpdGUgcm91bmRlZC1mdWxsIGJvcmRlci0yIGJvcmRlci13aGl0ZSBob3ZlcjpiZy1zbGF0ZS04MDAgdHJhbnNpdGlvbi1jb2xvcnNcIj5cclxuICAgICAgICAgICAgICAgIDxDYW1lcmEgc2l6ZT17MTZ9IC8+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8aDIgY2xhc3NOYW1lPVwibXQtNCBmb250LWJvbGQgdGV4dC1zbGF0ZS05MDAgdGV4dC1sZ1wiPnthZG1pbkRhdGEubmFtZSB8fCAnQWRtaW4nfTwvaDI+XHJcbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc2xhdGUtNTAwIHRleHQtc21cIj5BZG1pbmlzdHJhdG9yPC9wPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTYgcHQtNiBib3JkZXItdCBib3JkZXItc2xhdGUtNTAgc3BhY2UteS0yXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gdGV4dC14c1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1zbGF0ZS00MDBcIj5Sb2xlPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1zZW1pYm9sZCB0ZXh0LXNsYXRlLTcwMFwiPkZ1bGwgQWNjZXNzPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHRleHQteHNcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtc2xhdGUtNDAwXCI+TWVtYmVyIHNpbmNlPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1zZW1pYm9sZCB0ZXh0LXNsYXRlLTcwMFwiPkFwcmlsIDIwMjQ8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWQ6Y29sLXNwYW4tMiBzcGFjZS15LTZcIj5cclxuICAgICAgICAgIDxmb3JtIG9uU3VibWl0PXtoYW5kbGVTYXZlfSBjbGFzc05hbWU9XCJiZy13aGl0ZSBwLTggcm91bmRlZC0yeGwgYm9yZGVyIGJvcmRlci1zbGF0ZS0xMDAgc2hhZG93LXNtIHNwYWNlLXktNlwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIHNwYWNlLXgtMiB0ZXh0LXNsYXRlLTkwMCBmb250LWJvbGQgYm9yZGVyLWIgYm9yZGVyLXNsYXRlLTUwIHBiLTQgbWItNlwiPlxyXG4gICAgICAgICAgICAgIDxVc2VyIHNpemU9ezIwfSBjbGFzc05hbWU9XCJ0ZXh0LVsjYmIxMzQxXVwiIC8+XHJcbiAgICAgICAgICAgICAgPHNwYW4+UGVyc29uYWwgSW5mb3JtYXRpb248L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIGdyaWQtY29scy0xIGdhcC02XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTJcIj5cclxuICAgICAgICAgICAgICAgIDxMYWJlbCBodG1sRm9yPVwibmFtZVwiPkZ1bGwgTmFtZTwvTGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8SW5wdXQgXHJcbiAgICAgICAgICAgICAgICAgIGlkPVwibmFtZVwiIFxyXG4gICAgICAgICAgICAgICAgICB2YWx1ZT17YWRtaW5EYXRhLm5hbWV9IFxyXG4gICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHNldEFkbWluRGF0YSh7Li4uYWRtaW5EYXRhLCBuYW1lOiBlLnRhcmdldC52YWx1ZX0pfVxyXG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLXhsIGJvcmRlci1zbGF0ZS0yMDBcIiBcclxuICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTJcIj5cclxuICAgICAgICAgICAgICA8TGFiZWwgaHRtbEZvcj1cImVtYWlsXCI+RW1haWwgQWRkcmVzczwvTGFiZWw+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyZWxhdGl2ZVwiPlxyXG4gICAgICAgICAgICAgICAgPE1haWwgY2xhc3NOYW1lPVwiYWJzb2x1dGUgbGVmdC0zIHRvcC0xLzIgLXRyYW5zbGF0ZS15LTEvMiB0ZXh0LXNsYXRlLTQwMFwiIHNpemU9ezE4fSAvPlxyXG4gICAgICAgICAgICAgICAgPElucHV0IFxyXG4gICAgICAgICAgICAgICAgICBpZD1cImVtYWlsXCIgXHJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJlbWFpbFwiIFxyXG4gICAgICAgICAgICAgICAgICB2YWx1ZT17YWRtaW5EYXRhLmVtYWlsfSBcclxuICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiBzZXRBZG1pbkRhdGEoey4uLmFkbWluRGF0YSwgZW1haWw6IGUudGFyZ2V0LnZhbHVlfSl9XHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInBsLTEwIHJvdW5kZWQteGwgYm9yZGVyLXNsYXRlLTIwMFwiIFxyXG4gICAgICAgICAgICAgICAgICByZXF1aXJlZFxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInB0LTRcIj5cclxuICAgICAgICAgICAgICA8QnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBkaXNhYmxlZD17aXNMb2FkaW5nfSBjbGFzc05hbWU9XCJiZy1zbGF0ZS05MDAgaG92ZXI6Ymctc2xhdGUtODAwIHRleHQtd2hpdGUgcm91bmRlZC14bCBweC04IGgtMTJcIj5cclxuICAgICAgICAgICAgICAgI
448Htpc0xvYWRpbmcgPyAnU2F2aW5nLi4uJyA6IChcclxuICAgICAgICAgICAgICAgICAgPD5cclxuICAgICAgICAgICAgICAgICAgICA8U2F2ZSBzaXplPXsxOH0gY2xhc3NOYW1lPVwibXItMlwiIC8+IFNhdmUgQ2hhbmdlc1xyXG4gICAgICAgICAgICAgICAgICA8Lz5cclxuICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgPC9CdXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9mb3JtPlxyXG5cclxuICAgICAgICAgIDxmb3JtIG9uU3VibWl0PXtoYW5kbGVDaGFuZ2VQYXNzd29yZH0gY2xhc3NOYW1lPVwiYmctd2hpdGUgcC04IHJvdW5kZWQtMnhsIGJvcmRlciBib3JkZXItc2xhdGUtMTAwIHNoYWRvdy1zbSBzcGFjZS15LTZcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBzcGFjZS14LTIgdGV4dC1zbGF0ZS05MDAgZm9udC1ib2xkIGJvcmRlci1iIGJvcmRlci1zbGF0ZS01MCBwYi00IG1iLTZcIj5cclxuICAgICAgICAgICAgICA8TG9jayBzaXplPXsyMH0gY2xhc3NOYW1lPVwidGV4dC1bI2JiMTM0MV1cIiAvPlxyXG4gICAgICAgICAgICAgIDxzcGFuPlNlY3VyaXR5IFNldHRpbmdzPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS00XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTJcIj5cclxuICAgICAgICAgICAgICAgIDxMYWJlbCBodG1sRm9yPVwiY3VycmVudFBhc3N3b3JkXCI+Q3VycmVudCBQYXNzd29yZDwvTGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxLZXkgY2xhc3NOYW1lPVwiYWJzb2x1dGUgbGVmdC0zIHRvcC0xLzIgLXRyYW5zbGF0ZS15LTEvMiB0ZXh0LXNsYXRlLTQwMFwiIHNpemU9ezE4fSAvPlxyXG4gICAgICAgICAgICAgICAgICA8SW5wdXQgXHJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJjdXJyZW50UGFzc3dvcmRcIiBcclxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwicGFzc3dvcmRcIiBcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cGFzc3dvcmRzLmN1cnJlbnRQYXNzd29yZH1cclxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHNldFBhc3N3b3Jkcyh7Li4ucGFzc3dvcmRzLCBjdXJyZW50UGFzc3dvcmQ6IGUudGFyZ2V0LnZhbHVlfSl9XHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicGwtMTAgcm91bmRlZC14bCBib3JkZXItc2xhdGUtMjAwXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcclxuICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JpZCBncmlkLWNvbHMtMSBzbTpncmlkLWNvbHMtMiBnYXAtNlwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTJcIj5cclxuICAgICAgICAgICAgICAgICAgPExhYmVsIGh0bWxGb3I9XCJuZXdQYXNzd29yZFwiPk5ldyBQYXNzd29yZDwvTGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgIDxJbnB1dCBcclxuICAgICAgICAgICAgICAgICAgICBpZD1cIm5ld1Bhc3N3b3JkXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cInBhc3N3b3JkXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3Bhc3N3b3Jkcy5uZXdQYXNzd29yZH1cclxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHNldFBhc3N3b3Jkcyh7Li4ucGFzc3dvcmRzLCBuZXdQYXNzd29yZDogZS50YXJnZXQudmFsdWV9KX1cclxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLXhsIGJvcmRlci1zbGF0ZS0yMDBcIiBcclxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZFxyXG4gICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktMlwiPlxyXG4gICAgICAgICAgICAgICAgICA8TGFiZWwgaHRtbEZvcj1cImNvbmZpcm1QYXNzd29yZFwiPkNvbmZpcm0gTmV3IFBhc3N3b3JkPC9MYWJlbD5cclxuICAgICAgICAgICAgICAgICAgPElucHV0IFxyXG4gICAgICAgICAgICAgICAgICAgIGlkPVwiY29uZmlybVBhc3N3b3JkXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cInBhc3N3b3JkXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3Bhc3N3b3Jkcy5jb25maXJtUGFzc3dvcmR9XHJcbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiBzZXRQYXNzd29yZHMoey4uLnBhc3N3b3JkcywgY29uZmlybVBhc3N3b3JkOiBlLnRhcmdldC52YWx1ZX0pfVxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQteGwgYm9yZGVyLXNsYXRlLTIwMFwiIFxyXG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkXHJcbiAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwdC00XCI+XHJcbiAgICAgICAgICAgICAgICA8QnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBkaXNhYmxlZD17aXNQYXNzd29yZExvYWRpbmd9IGNsYXNzTmFtZT1cImJ0bi1ncmFkaWVudCBib3JkZXItbm9uZSB0ZXh0LXdoaXRlIHJvdW5kZWQteGwgcHgtOCBoLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgIHtpc1Bhc3N3b3JkTG9hZGluZyA/ICdVcGRhdGluZy4uLicgOiAnVXBkYXRlIFBhc3N3b3JkJ31cclxuICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICApO
4481xyXG59XHJcbiJdLCJtYXBwaW5ncyI6IkFBaUZRLFNBb0VVLFVBcEVWO0FBakZSLE9BQU8sU0FBUyxnQkFBZ0I7QUFDaEMsU0FBUyxNQUFNLE1BQU0sTUFBTSxNQUFNLFFBQVEsV0FBVztBQUNwRCxTQUFTLGNBQWM7QUFDdkIsU0FBUyxhQUFhO0FBQ3RCLFNBQVMsYUFBYTtBQUN0QixTQUFTLGFBQWE7QUFDdEIsT0FBTyxTQUFTO0FBRWhCLHdCQUF3QixlQUFlO0FBQ3JDLFFBQU0sQ0FBQyxXQUFXLFlBQVksSUFBSSxTQUFTLEtBQUs7QUFDaEQsUUFBTSxDQUFDLG1CQUFtQixvQkFBb0IsSUFBSSxTQUFTLEtBQUs7QUFDaEUsUUFBTSxDQUFDLFdBQVcsWUFBWSxJQUFJLFNBQVM7QUFBQSxJQUN6QyxNQUFNO0FBQUEsSUFDTixPQUFPO0FBQUEsRUFDVCxDQUFDO0FBQ0QsUUFBTSxDQUFDLFdBQVcsWUFBWSxJQUFJLFNBQVM7QUFBQSxJQUN6QyxpQkFBaUI7QUFBQSxJQUNqQixhQUFhO0FBQUEsSUFDYixpQkFBaUI7QUFBQSxFQUNuQixDQUFDO0FBRUQsUUFBTSxVQUFVLE1BQU07QUFDcEIsUUFBSSxJQUFJLFVBQVUsRUFBRSxLQUFLLFNBQU87QUFDOUIsbUJBQWE7QUFBQSxRQUNYLE1BQU0sSUFBSSxLQUFLO0FBQUEsUUFDZixPQUFPLElBQUksS0FBSztBQUFBLE1BQ2xCLENBQUM7QUFBQSxJQUNILENBQUMsRUFBRSxNQUFNLFNBQU87QUFDZCxZQUFNLE1BQU0sOEJBQThCO0FBQUEsSUFDNUMsQ0FBQztBQUFBLEVBQ0gsR0FBRyxDQUFDLENBQUM7QUFFTCxRQUFNLGFBQWEsT0FBTyxNQUF1QjtBQUMvQyxNQUFFLGVBQWU7QUFDakIsaUJBQWEsSUFBSTtBQUNqQixRQUFJO0FBQ0YsWUFBTSxJQUFJLE1BQU0sa0JBQWtCO0FBQUEsUUFDaEMsTUFBTSxVQUFVO0FBQUEsUUFDaEIsT0FBTyxVQUFVO0FBQUEsTUFDbkIsQ0FBQztBQUNELFlBQU0sUUFBUSw4QkFBOEI7QUFBQSxJQUM5QyxTQUFTLE9BQVk7QUFDbkIsWUFBTSxNQUFNLE1BQU0sVUFBVSxNQUFNLFNBQVMsMEJBQTBCO0FBQUEsSUFDdkUsVUFBRTtBQUNBLG1CQUFhLEtB
448QUs7QUFBQSxJQUNwQjtBQUFBLEVBQ0Y7QUFFQSxRQUFNLHVCQUF1QixPQUFPLE1BQXVCO0FBQ3pELE1BQUUsZUFBZTtBQUNqQixRQUFJLFVBQVUsZ0JBQWdCLFVBQVUsaUJBQWlCO0FBQ3ZELFlBQU0sTUFBTSw0QkFBNEI7QUFDeEM7QUFBQSxJQUNGO0FBQ0EsUUFBSSxVQUFVLFlBQVksU0FBUyxHQUFHO0FBQ3BDLFlBQU0sTUFBTSx3Q0FBd0M7QUFDcEQ7QUFBQSxJQUNGO0FBRUEseUJBQXFCLElBQUk7QUFDekIsUUFBSTtBQUNGLFlBQU0sSUFBSSxNQUFNLDBCQUEwQjtBQUFBLFFBQ3hDLGlCQUFpQixVQUFVO0FBQUEsUUFDM0IsYUFBYSxVQUFVO0FBQUEsTUFDekIsQ0FBQztBQUNELFlBQU0sUUFBUSwrQkFBK0I7QUFDN0MsbUJBQWE7QUFBQSxRQUNYLGlCQUFpQjtBQUFBLFFBQ2pCLGFBQWE7QUFBQSxRQUNiLGlCQUFpQjtBQUFBLE1BQ25CLENBQUM7QUFBQSxJQUNILFNBQVMsT0FBWTtBQUNuQixZQUFNLE1BQU0sTUFBTSxVQUFVLE1BQU0sU0FBUywyQkFBMkI7QUFBQSxJQUN4RSxVQUFFO0FBQ0EsMkJBQXFCLEtBQUs7QUFBQSxJQUM1QjtBQUFBLEVBQ0Y7QUFFQSxTQUNFLHVCQUFDLFNBQUksV0FBVSwrQkFDYjtBQUFBLDJCQUFDLFNBQ0M7QUFBQSw2QkFBQyxRQUFHLFdBQVUscUNBQW9DLDZCQUFsRDtBQUFBO0FBQUE7QUFBQTtBQUFBLGFBQStEO0FBQUEsTUFDL0QsdUJBQUMsT0FBRSxXQUFVLGtCQUFpQixxRUFBOUI7QUFBQTtBQUFBO0FBQUE7QUFBQSxhQUFtRjtBQUFBLFNBRnJGO0FBQUE7QUFBQTtBQUFBO0FBQUEsV0FHQTtBQUFBLElBRUEsdUJBQUMsU0FBSSxXQUFVLHlDQUNiO0FBQUEsNkJBQUMsU0FBSSxXQUFVLGlCQUNiLGlDQUFDLFNBQUksV0FBVSwwRUFDYjtBQUFBLCtCQUFDLFNBQUksV0FBVSx5QkFDYjtBQUFBLGlDQUFDLFNBQUksV0FBVSxpSkFDWixvQkFBVSxPQUFPLFVBQVUsS0FBSyxVQUFVLEdBQUcsQ0FBQyxJQUFJLFFBRHJEO0FBQUE7QUFBQTtBQUFBO0FBQUEsaUJBRUE7QUFBQSxVQUNBLHVCQUFDLFlBQU8sV0FBVSxpSUFDaEIsaUNBQUMsVUFBTyxNQUFNLE1BQWQ7QUFBQTtBQUFBO0FBQUE7QUFBQSxpQkFBa0IsS0FEcEI7QUFBQTtBQUFBO0FBQUE7QUFBQSxpQkFFQTtBQUFBLGFBTkY7QUFBQTtBQUFBO0FBQUE7QUFBQSxlQU9BO0FBQUEsUUFDQSx1QkFBQyxRQUFHLFdBQVUseUNBQXlDLG9CQUFVLFFBQVEsV0FBekU7QUFBQTtBQUFBO0FBQUE7QUFBQSxlQUFpRjtBQUFBLFFBQ2pGLHVCQUFDLE9BQUUsV0FBVSwwQkFBeUIsNkJBQXRDO0FBQUE7QUFBQTtBQUFBO0FBQUEsZUFBbUQ7QUFBQSxRQUNuRCx1QkFBQyxTQUFJLFdBQVUsZ0RBQ2I7QUFBQSxpQ0FBQyxTQUFJLFdBQVUsNkNBQ2I7QUFBQSxtQ0FBQyxVQUFLLFdBQVUsa0JBQWlCLG9CQUFqQztBQUFBO0FBQUE7QUFBQTtBQUFBLG1CQUFxQztBQUFBLFlBQ3JDLHVCQUFDLFVBQUssV0FBVSxnQ0FBK0IsMkJBQS9DO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUJBQTBEO0FBQUEsZUFGNUQ7QUFBQTtBQUFBO0FBQUE7QUFBQSxpQkFHQTtBQUFBLFVBQ0EsdUJBQUMsU0FBSSxXQUFVLDZDQUNiO0FBQUEsbUNBQUMsVUFBSyxXQUFVLGtCQUFpQiw0QkFBakM7QU
448FBQTtBQUFBO0FBQUE7QUFBQSxtQkFBNkM7QUFBQSxZQUM3Qyx1QkFBQyxVQUFLLFdBQVUsZ0NBQStCLDBCQUEvQztBQUFBO0FBQUE7QUFBQTtBQUFBLG1CQUF5RDtBQUFBLGVBRjNEO0FBQUE7QUFBQTtBQUFBO0FBQUEsaUJBR0E7QUFBQSxhQVJGO0FBQUE7QUFBQTtBQUFBO0FBQUEsZUFTQTtBQUFBLFdBcEJGO0FBQUE7QUFBQTtBQUFBO0FBQUEsYUFxQkEsS0F0QkY7QUFBQTtBQUFBO0FBQUE7QUFBQSxhQXVCQTtBQUFBLE1BRUEsdUJBQUMsU0FBSSxXQUFVLDJCQUNiO0FBQUEsK0JBQUMsVUFBSyxVQUFVLFlBQVksV0FBVSx3RUFDcEM7QUFBQSxpQ0FBQyxTQUFJLFdBQVUsMkZBQ2I7QUFBQSxtQ0FBQyxRQUFLLE1BQU0sSUFBSSxXQUFVLG9CQUExQjtBQUFBO0FBQUE7QUFBQTtBQUFBLG1CQUEyQztBQUFBLFlBQzNDLHVCQUFDLFVBQUssb0NBQU47QUFBQTtBQUFBO0FBQUE7QUFBQSxtQkFBMEI7QUFBQSxlQUY1QjtBQUFBO0FBQUE7QUFBQTtBQUFBLGlCQUdBO0FBQUEsVUFFQSx1QkFBQyxTQUFJLFdBQVUsMEJBQ2IsaUNBQUMsU0FBSSxXQUFVLGFBQ2I7QUFBQSxtQ0FBQyxTQUFNLFNBQVEsUUFBTyx5QkFBdEI7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQkFBK0I7QUFBQSxZQUMvQjtBQUFBLGNBQUM7QUFBQTtBQUFBLGdCQUNDLElBQUc7QUFBQSxnQkFDSCxPQUFPLFVBQVU7QUFBQSxnQkFDakIsVUFBVSxDQUFDLE1BQU0sYUFBYSxFQUFDLEdBQUcsV0FBVyxNQUFNLEVBQUUsT0FBTyxNQUFLLENBQUM7QUFBQSxnQkFDbEUsV0FBVTtBQUFBLGdCQUNWLFVBQVE7QUFBQTtBQUFBLGNBTFY7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBTUE7QUFBQSxlQVJGO0FBQUE7QUFBQTtBQUFBO0FBQUEsaUJBU0EsS0FWRjtBQUFBO0FBQUE7QUFBQTtBQUFBLGlCQVdBO0FBQUEsVUFFQSx1QkFBQyxTQUFJLFdBQVUsYUFDYjtBQUFBLG1DQUFDLFNBQU0sU0FBUSxTQUFRLDZCQUF2QjtBQUFBO0FBQUE7QUFBQTtBQUFBLG1CQUFvQztBQUFBLFlBQ3BDLHVCQUFDLFNBQUksV0FBVSxZQUNiO0FBQUEscUNBQUMsUUFBSyxXQUFVLDJEQUEwRCxNQUFNLE1BQWhGO0FBQUE7QUFBQTtBQUFBO0FBQUEscUJBQW9GO0FBQUEsY0FDcEY7QUFBQSxnQkFBQztBQUFBO0FBQUEsa0JBQ0MsSUFBRztBQUFBLGtCQUNILE1BQUs7QUFBQSxrQkFDTCxPQUFPLFVBQVU7QUFBQSxrQkFDakIsVUFBVSxDQUFDLE1BQU0sYUFBYSxFQUFDLEdBQUcsV0FBVyxPQUFPLEVBQUUsT0FBTyxNQUFLLENBQUM7QUFBQSxrQkFDbkUsV0FBVTtBQUFBLGtCQUNWLFVBQVE7QUFBQTtBQUFBLGdCQU5WO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxjQU9BO0FBQUEsaUJBVEY7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQkFVQTtBQUFBLGVBWkY7QUFBQTtBQUFBO0FBQUE7QUFBQSxpQkFhQTtBQUFBLFVBRUEsdUJBQUMsU0FBSSxXQUFVLFFBQ2IsaUNBQUMsVUFBTyxNQUFLLFVBQVMsVUFBVSxXQUFXLFdBQVUsbUVBQ2xELHNCQUFZLGNBQ1gsbUNBQ0U7QUFBQSxtQ0FBQyxRQUFLLE1BQU0sSUFBSSxXQUFVLFVBQTFCO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUJBQWlDO0FBQUEsWUFBRTtBQUFBLGVBRHJDO0FBQUE7QUFBQTtBQUFBO0FBQUEsaUJBRUEsS0FKSjtBQUFBO0FBQUE7QUFBQTtBQUFBLGlCQU1BLEtBUEY7QUFBQTtBQUFBO0FBQUE7QUFBQSxpQkFRQTtBQUFBLGFBMUNGO0FBQUE7QUFBQTtBQUFBO0FBQUEsZUEyQ0E7QUFBQSxRQUVBLHVCQUFDLFVBQUssVUFBVSxzQkFBc0IsV0FBVSx3RUFDOUM7QUFBQSxpQ0FBQyxTQUFJLFdBQVUsMkZBQ2I7QUFBQSxtQ0FBQyxRQUFLLE1BQU0sSUFBSSxXQUFVLG9CQUExQjtBQUFBO0FBQUE7QUFBQTtBQUFBLG1CQUEyQztBQUFBLFlBQzNDLHVCQUFDLFVBQUssaUNBQU47QUFBQTtBQUFBO0FBQUE7QUFBQSxtQkFBdUI7QUFBQSxlQUZ6QjtBQUFBO0FBQUE7QUFBQTtBQUFBLGlCQUdBO0FBQUEsVUFFQSx1QkFBQyxTQUFJLFdBQVUsYUFDYjtBQUFBLG1DQUFDLFNBQUksV0FBVSxhQUNiO0FBQUEscUNBQUMsU0FBTSxTQUFRLG1CQUFrQixnQ0FBakM7QUFBQTtBQUFBO0FBQUE7QUFBQSxxQkFBaUQ7QUFBQSxjQUNqRCx1QkFBQyxTQUFJLFdBQVUsWUFDYjtBQUFBLHVDQUFDLE9BQUksV0FBVSwyREFBMEQsTUFBTSxNQUEvRTtBQUFBO0FBQUE7QUFBQTtBQUFBLHVCQUFtRjtBQUFBLGdCQUNuRjtBQUFBLGtCQUFDO0FBQUE7QUFBQSxvQkFDQyxJQUFHO0FBQUEsb0JBQ0gsTUFBSztBQUFBLG9CQUNMLE9BQU8sVUFBVTtBQUFBLG9CQUNqQixVQUFVLENBQUMsTUFBTSxhQUFhLEVBQUMsR0FBRyxXQUFXLGlCQUFpQixFQUFFLE9BQU8sTUFBSyxDQUFDO0FBQUEsb0JBQzdFLFdBQVU7QUFBQSxvQkFDVixVQUFRO0FBQUE7QUFBQSxrQkFOVjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsZ0JBT0E7QUFBQSxtQkFURjtBQUFBO0FBQUE7QUFBQTtBQUFBLHFCQVVBO0FBQUEsaUJBWkY7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQkFhQTtBQUFBLFlBRUEsdUJBQUMsU0FBSSxXQUFVLHlDQUNiO0FBQUEscUNBQUMsU0FBSSxXQUFVLGFBQ2I7QUFBQSx1Q0FBQyxTQUFNLFNBQVEsZUFBYyw0QkFBN0I7QUFBQTtBQUFBO0FBQUE7QUFBQSx1QkFBeUM7QUFBQSxnQkFDekM7QUFBQSxrQkFBQztBQUFBO0FBQUEsb0JBQ0MsSUFBRztBQUFBLG9CQUNILE1BQUs7QUFBQSxvQkFDTCxPQUFPLFVBQVU7QUFBQSxvQkFDakIsVUFBVSxDQUFDLE1BQU0sYUFBYSxFQUFDLEdBQUcsV0FBVyxhQUFhLEVBQUUsT0FBTyxNQUFLLENBQUM7QUFBQSxvQkFDekUsV0FBVTtBQUFBLG9CQUNWLFVBQVE7QUFBQTtBQUFBLGtCQU5WO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxnQkFPQTtBQUFBLG1CQVRGO0FBQUE7QUFBQTtBQUFBO0FBQUEscUJBVUE7QUFBQSxjQUNBLHVCQUFDLFNBQUksV0FBVSxhQUNiO0FBQUEsdUNBQUMsU0FBTSxTQUFRLG1CQUFrQixvQ0FBakM7QUFBQTtBQUFBO0FBQUE7QUFBQSx1QkFBcUQ7QUFBQSxnQkFDckQ7QUFBQSxrQkFBQztBQUFBO0FBQUEsb0JBQ0MsSUFBRztBQUFBLG9CQUNILE1BQUs7QUFBQSxvQkFDTCxPQUFPLFVBQVU7QUFBQSxvQkFDakIsVUFBVSxDQUFDLE1BQU0sYUFBYSxFQUFDLEdBQUcsV0FBVyxpQkFBaUIsRUFBRSxPQUFPLE1BQUssQ0FBQztBQUFBLG9CQUM3RSxXQUFVO0FBQUEsb0JBQ1YsVUFBUTtBQUFBO0FBQUEsa0JBTlY7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGdCQU9BO0FBQUEsbUJBVEY7QUFBQTtBQUFBO0FBQUE7QUFBQSxxQkFVQTtBQUFBLGlCQXRCRjtBQUFBO0FBQUE7QUFBQTtBQUFBLG1CQXVCQTtBQUFBLFlBRUEsdUJBQUMsU0FBSSxXQUFVLFFBQ2IsaUNBQUMsVUFBTyxNQUFLLFVBQVMsVUFBVSxtQkFBbUIsV0FBVSw0REFDMUQsOEJBQW9CLGdCQUFnQixxQkFEdkM7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQk
448FFQSxLQUhGO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUJBSUE7QUFBQSxlQTdDRjtBQUFBO0FBQUE7QUFBQTtBQUFBLGlCQThDQTtBQUFBLGFBcERGO0FBQUE7QUFBQTtBQUFBO0FBQUEsZUFxREE7QUFBQSxXQW5HRjtBQUFBO0FBQUE7QUFBQTtBQUFBLGFBb0dBO0FBQUEsU0E5SEY7QUFBQTtBQUFBO0FBQUE7QUFBQSxXQStIQTtBQUFBLE9BcklGO0FBQUE7QUFBQTtBQUFBO0FBQUEsU0FzSUE7QUFFSjsiLCJuYW1lcyI6W119

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.