PageSourceSearch

https://app.datasert.com/assets/Connection-CjkQCBhc.js

js datasert.com collected 2026-10-02 01:30:23 UTC 47,246 bytes, 580 lines download raw bytes

1import { Q as QBreadcrumbsEl } from "./QBreadcrumbsEl-DJmFSikN.js";
2import { Q as QTab, a as QTabs, b as QTabPanel, c as QTabPanels } from "./QTabPanels-BC9Oww_1.js";
3import { r as rotateAccessToken, c as clearCache, h as clearSecrets, k as getExternalLoginInfo, b as getConnUsage, l as getConnUsername, i as deleteConnections, m as getConnection } from "./realsyncUtils-B_eb3OgH.js";
4import { a2 as getPropsToDisplay, v as valueLabels, p as getAuditUpdated, q as getAuditCreated, a1 as getCurrentProduct, R as showConfirm, h as notifySuccess, B as getEntityNamesListForDialog, r as confirmDanger, G as notifyInfo, y as confirmDelete, a3 as isTenantAdmin, Y as hasRealtask } from "./utils-Dl9t6EOZ.js";
5import { m as mixins } from "./mixins-BCMXzTHA.js";
6import { O as OutputField } from "./OutputField-DkpOfYYx.js";
7import { _ as _export_sfc, c as createBlock, o as openBlock, w as withCtx, a as createVNode, r as resolveComponent, e as createCommentVNode, j as createTextVNode } from "./index-l2g1tnsc.js";
8import { I as IconReadOnly, R as RefUsageViewerDialog, C as ConnectionDialog } from "./IconReadOnly-9GxUNzum.js";
9import { T as TextViewerDialog } from "./TextViewerDialog-BPyN4E_q.js";
10import { S as SyncStatus } from "./SyncStatus-Ehz8Em6K.js";
11import "./QResizeObserver-C-xPzvmf.js";
12import "./rtl-DDpZOXNn.js";
13import "./touch-BscSWsHh.js";
14import "./selection-CtEbNG46.js";
15import "./use-render-cache-DRJWLz-b.js";
16import "./http-QV44vcaW.js";
17import "./api-CsX1TBBI.js";
18/* empty css                                                     */
19import "./QForm-B7u6vHMU.js";
20import "./SharingDialog-8nsVnUso.js";
21import "./mixinsV3-DJOx874v.js";
22import "./lodash-D-1jTqv6.js";
23import "./Column-CHEOSUiF.js";
24import "./TextViewer-DMWZwv7n.js";
25import "./styles-Ba8hxl-j.js";
26import "./Tooltip-BL9mlxg7.js";
27import "./Popover-DdmYwYku.js";
28import "./light-ChFcYHVz.js";
29import "./Scrollbar-w6xdyLLY.js";
30import "./Close-CMLcMmhU.js";
31import "./Icon-XvtDqeG4.js";
32import "./replaceable-D4umoBrm.js";
33import "./upperFirst-DygzsnnD.js";
34const _sfc_main$1 = {
35  mixins: [mixins],
36  components: { OutputField },
37  props: {
38    model: Object
39  },
40  data() {
41    return {
42      message: ""
43    };
44  },
45  computed: {
46    created() {
47      return getAuditCreated(this.model);
48    },
49    updated() {
50      return getAuditUpdated(this.model);
51    }
52  },
53  methods: {
54    valueLabels() {
55      return valueLabels;
56    },
57    getPropsToDisplay() {
58      return getPropsToDisplay(this.model.options);
59    }
60  }
61};
62function _sfc_render$1(_ctx, _cache, $props, $setup, $data, $options) {
63  const _component_OutputField = resolveComponent("OutputField");
64  const _component_Column = resolveComponent("Column");
65  const _component_Row = resolveComponent("Row");
66  const _component_ProgressDialog = resolveComponent("ProgressDialog");
67  const _component_Card = resolveComponent("Card");
68  return openBlock(), createBlock(_component_Card, {
69    width: "100%",
70    message: $data.message,
71    messageType: _ctx.messageType
72  }, {
73    default: withCtx(() => [
74      createVNode(_component_Row, null, {
75        default: withCtx(() => [
76          createVNode(_component_Column, null, {
77            default: withCtx(() => [
78              createVNode(_component_OutputField, {
79                label: "Name",
80                value: $props.model.name
81              }, null, 8, ["value"])
82            ]),
83            _: 1
84          }),
85          createVNode(_component_Column, null, {
86            default: withCtx(() => [
87              createVNode(_component_OutputField, {
88                label: "Type",
89                value: $props.model.type,
90                valueLabels: $options.valueLabels().connTypes
91              }, null, 8, ["value", "valueLabels"])
92            ]),
93            _: 1
94          }),
95          createVNode(_component_Column, null, {
96            default: withCtx(() => [
97              createVNode(_component_OutputField, {
98                label: "Flavor",
99                value: $props.model.flavor
100              }, null, 8, ["value"])
101            ]),
102            _: 1
103          })
104        ]),
105        _: 1
106      }),
107      createVNode(_component_Row, null, {
108        default: withCtx(() => [
109          createVNode(_component_Column, null, {
110            default: withCtx(() => [
111              createVNode(_component_OutputField, {
112                label: "Auth Type",
113                value: $props.model.authType,
114                valueLabels: $options.valueLabels().authTypes
115              }, null, 8, ["value", "valueLabels"])
116            ]),
117            _: 1
118          }),
119          createVNode(_component_Column, null, {
120            default: withCtx(() => [
121              createVNode(_component_OutputField, {
122                label: "Auth User",
123                value: $props.model.authUser
124              }, null, 8, ["value"])
125            ]),
126            _: 1
127          })
128        ]),
129        _: 1
130      }),
131      createVNode(_component_Row, null, {
132        default: withCtx(() => [
133          createVNode(_component_Column, null, {
134            default: withCtx(() => [
135              createVNode(_component_OutputField, {
136                label: "External Env Name",
137                value: $props.model.externalEnvName
138              }, null, 8, ["value"])
139            ]),
140            _: 1
141          }),
142          createVNode(_component_Column, null, {
143            default: withCtx(() => [
144              createVNode(_component_OutputField, {
145                label: "External Env Id",
146                value: $props.model.externalEnvId
147              }, null, 8, ["value"])
148            ]),
149            _: 1
150          })
151        ]),
152        _: 1
153      }),
154      createVNode(_component_Row, null, {
155        default: withCtx(() => [
156          createVNode(_component_Column, null, {
157            default: withCtx(() => [
158              createVNode(_component_OutputField, {
159                label: "Sharing",
160                value: $props.model.sharing,
161                valueLabels: $options.valueLabels().sharingTypes
162              }, null, 8, ["value", "valueLabels"])
163            ]),
164            _: 1
165          }),
166          createVNode(_component_Column, null, {
167            default: withCtx(() => [
168              createVNode(_component_OutputField, {
169                label: "Sharing Details",
170                value: $props.model.sharingDetails
171              }, null, 8, ["value"])
172            ]),
173            _: 1
174          })
175        ]),
176        _: 1
177      }),
178      createVNode(_component_Row, null, {
179        default: withCtx(() => [
180          createVNode(_component_Column, null, {
181            default: withCtx(() => [
182              createVNode(_component_OutputField, {
183                label: "Owner",
184                value: ($props.model.ownerId__r || {}).name
185              }, null, 8, ["value"])
186            ]),
187            _: 1
188          })
189        ]),
190        _: 1
191      }),
192      createVNode(_component_Row, null, {
193        default: withCtx(() => [
194          createVNode(_component_Column, null, {
195            default: withCtx(() => [
196              createVNode(_component_OutputField, {
197                label: "Properties",
198                value: $options.getPropsToDisplay()
199              }, null, 8, ["value"])
200            ]),
201            _: 1
202          })
203        ]),
204        _: 1
205      }),
206      createVNode(_component_Row, null, {
207        default: withCtx(() => [
208          createVNode(_component_Column, null, {
209            default: withCtx(() => [
210              createVNode(_component_OutputField, {
211                label: "Message",
212                value: $props.model.message
213              }, null, 8, ["value"])
214            ]),
215            _: 1
216          })
217        ]),
218        _: 1
219      }),
220      createVNode(_component_Row, null, {
221        default: withCtx(() => [
222          createVNode(_component_Column, null, {
223            default: withCtx(() => [
224              createVNode(_component_OutputField, {
225                label: "Details",
226                value: $props.model.details
227              }, null, 8, ["value"])
228            ]),
229            _: 1
230          })
231        ]),
232        _: 1
233      }),
234      createVNode(_component_Row, null, {
235        default: withCtx(() => [
236          createVNode(_component_Column, null, {
237            default: withCtx(() => [
238              createVNode(_component_OutputField, {
239                label: "Created",
240                value: $options.created
241              }, null, 8, ["value"])
242            ]),
243            _: 1
244          }),
245          createVNode(_component_Column, null, {
246            default: withCtx(() => [
247              createVNode(_component_OutputField, {
248                label: "Updated",
249                value: $options.updated
250              }, null, 8, ["value"])
251            ]),
252            _: 1
253          })
254        ]),
255        _: 1
256      }),
257      createVNode(_component_ProgressDialog, {
258        modelValue: _ctx.processing,
259        "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => _ctx.processing = $event)
260      }, null, 8, ["modelValue"])
261    ]),
262    _: 1
263  }, 8, ["message", "messageType"]);
264}
265const ConnectionDetails = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["render", _sfc_render$1], ["__file", "ConnectionDetails.vue"]]);
266const _sfc_main = {
267  mixins: [mixins],
268  components: {
269    ConnectionDialog,
270    ConnectionDetails,
271    RefUsageViewerDialog,
272    IconReadOnly,
273    TextViewerDialog,
274    SyncStatus
275  },
276  props: {
277    showEnvs: {
278      type: Boolean,
279      default: false
280    },
281    showJobs: {
282      type: Boolean,
283      default: false
284    }
285  },
286  data: () => ({
287    progressOpen: false,
288    dialogOpen: false,
289    dialogMode: "add",
290    dialogConnId: null,
291    dialogData: {},
292    initingSuccess: true,
293    model: [],
294    currentTab: "details",
295    connId: "",
296    productName: getCurrentProduct(),
297    textViewerContent: "",
298    textViewerOpen: false,
299    usageViewerContent: [],
300    usageViewerOpen: false,
301    usageViewerTitle: ""
302  }),
303  created() {
304    this.connId = this.$route.params.connId;
305    this.initForm(async () => {
306      this.model = await getConnection(this.connId);
307    });
308  },
309  computed: {
310    hasRealtask() {
311      return hasRealtask();
312    },
313    isTenantAdmin() {
314      return isTenantAdmin();
315    }
316  },
317  methods: {
318    async refresh() {
319      this.processForm(async () => {
320        this.model = await getConnection(this.connId);
321      });
322    },
323    async handleDelete() {
324      const recs = [this.model];
325      const msg = `Are you sure you want to delete the following Connection? </br> ${getEntityNamesListForDialog(recs)}Note that if Connection is referenced by entities like Realtask Jobs or Realtask Environments, then it cannot be deleted until all references are removed.`;
326      const result = await confirmDelete("Delete Connection?", msg);
327      if (result) {
328        this.handleDeleteAfterConfirm();
329      }
330    },
331    handleDeleteAfterConfirm() {
332      this.processing = true;
333      this.processForm(async () => {
334        await deleteConnections({
335          records: [{ id: this.model.id }]
336        });
337        this.$router.go(-1);
338        notifySuccess("Connection have been deleted");
339      });
340    },
341    handleEdit() {
342      this.dialogConnId = this.model.id;
343      this.dialogMode = "edit";
344      this.dialogOpen = true;
345    },
346    viewUsername() {
347      this.process(async () => {
348        const resp = await getConnUsername(this.model.id);
349        this.textViewerContent = JSON.stringify(resp);
350        this.textViewerOpen = true;
351      });
352    },
353    viewUsage() {
354      this.process(async () => {
355        const usages = await getConnUsage(this.model.id);
356        if (usages.length === 0) {
357          notifyInfo("This connection is not used anywhere");
358        } else {
359          this.usageViewerContent = usages;
360          this.usageViewerOpen = true;
361          this.usageViewerTitle = `Connection Usage - ${this.model.name}`;
362        }
363      });
364    },
365    openSfdcUI() {
366      this.process(async () => {
367        const info = await getExternalLoginInfo(this.model.id);
368        window.open(info.url, "_newtab");
369      });
370    },
371    async handleClearSecrets() {
372      const recs = [this.model];
373      this.message = null;
374      const msg = `Are you sure you want to clear the secrets for following Connections? </br> ${getEntityNamesListForDialog(recs)}
375
376Once cleared, this connection will not be able to be used till secrets are specified again.`;
377      const confirmed = await confirmDanger("Clear Secrets?", msg, "Yes, Clear");
378      if (!confirmed) {
379        return;
380      }
381      return this.processForm(async () => {
382        const resp = await clearSecrets({ records: [{ id: this.model.id }] });
383        notifySuccess(resp.message);
384        this.refresh();
385      });
386    },
387    async handleClearCache() {
388      this.message = null;
389      const msg = "Are you sure you want to clear the cache?";
390      const confirmed = await showConfirm("Clear Cache?", msg, { okLabel: "Yes, Clear" });
391      if (!confirmed) {
392        return;
393      }
394      return this.processForm(async () => {
395        await clearCache({ records: [{ id: this.model.id }] });
396        notifySuccess("Cache has been cleared");
397      });
398    },
399    async handleRotateAccessToken() {
400      this.message = null;
401      const msg = "Are you sure you want to rotate the access token for this Connection? This will call Salesforce to renew the session, re-issuing the access token (and refresh token, if Refresh Token Rotation is enabled) and saving the new tokens.";
402      const confirmed = await showConfirm("Rotate Access Token?", msg, { okLabel: "Yes, Rotate" });
403      if (!confirmed) {
404        return;
405      }
406      return this.processForm(async () => {
407        const resp = await rotateAccessToken(this.model.id);
408        notifySuccess(resp.message);
409        this.refresh();
410      });
411    }
412  }
413};
414function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
415  const _component_Icon = resolveComponent("Icon");
416  const _component_MenuItem = resolveComponent("MenuItem");
417  const _component_Separator = resolveComponent("Separator");
418  const _component_IconMenu = resolveComponent("IconMenu");
419  const _component_IconReadOnly = resolveComponent("IconReadOnly");
420  const _component_SyncStatus = resolveComponent("SyncStatus");
421  const _component_ConnectionDetails = resolveComponent("ConnectionDetails");
422  const _component_ConnectionDialog = resolveComponent("ConnectionDialog");
423  const _component_TextViewerDialog = resolveComponent("TextViewerDialog");
424  const _component_RefUsageViewerDialog = resolveComponent("RefUsageViewerDialog");
425  const _component_Page = resolveComponent("Page");
426  return openBlock(), createBlock(_component_Page, {
427    title: `Connection - ${_ctx.model.name || ""}`,
428    initing: _ctx.initing,
429    initingSuccess: _ctx.initingSuccess,
430    processing: _ctx.processing,
431    message: _ctx.message,
432    messageType: _ctx.messageType
433  }, {
434    breadcrumbs: withCtx(() => [
435      createVNode(QBreadcrumbsEl, {
436        label: "Home",
437        to: `/${_ctx.productName}/home`
438      }, null, 8, ["to"]),
439      createVNode(QBreadcrumbsEl, {
440        label: "Connections",
441        to: `/${_ctx.productName}/connections`
442      }, null, 8, ["to"])
443    ]),
444    "title-suffix": withCtx(() => [
445      createVNode(_component_Icon, {
446        name: "refresh",
447        onClick: $options.refresh,
448        clickable: ""
449      }, null, 8, ["onClick"]),
450      createVNode(_component_IconMenu, null, {
451        default: withCtx(() => [
452          createVNode(_component_MenuItem, { onClick: $options.handleEdit }, {
453            default: withCtx(() => [..._cache[7] || (_cache[7] = [
454              createTextVNode("Edit", -1)
455            ])]),
456            _: 1
457          }, 8, ["onClick"]),
458          createVNode(_component_MenuItem, { onClick: $options.handleClearCache }, {
459            default: withCtx(() => [..._cache[8] || (_cache[8] = [
460              createTextVNode("Clear Cache", -1)
461            ])]),
462            _: 1
463          }, 8, ["onClick"]),
464          createVNode(_component_Separator),
465          createVNode(_component_MenuItem, { onClick: $options.viewUsage }, {
466            default: withCtx(() => [..._cache[9] || (_cache[9] = [
467              createTextVNode("View Usage", -1)
468            ])]),
469            _: 1
470          }, 8, ["onClick"]),
471          _ctx.model.type === "sfdc" ? (openBlock(), createBlock(_component_MenuItem, {
472            key: 0,
473            onClick: $options.openSfdcUI
474          }, {
475            default: withCtx(() => [..._cache[10] || (_cache[10] = [
476              createTextVNode("Open Sfdc UI", -1)
477            ])]),
478            _: 1
479          }, 8, ["onClick"])) : createCommentVNode("", true),
480          _ctx.model.type === "sfdc" && $options.isTenantAdmin ? (openBlock(), createBlock(_component_MenuItem, {
481            key: 1,
482            onClick: $options.handleRotateAccessToken
483          }, {
484            default: withCtx(() => [..._cache[11] || (_cache[11] = [
485              createTextVNode("Rotate Access Token", -1)
486            ])]),
487            _: 1
488          }, 8, ["onClick"])) : createCommentVNode("", true),
489          createVNode(_component_MenuItem, { onClick: $options.handleClearSecrets }, {
490            default: withCtx(() => [..._cache[12] || (_cache[12] = [
491              createTextVNode("Clear Secrets", -1)
492            ])]),
493            _: 1
494          }, 8, ["onClick"]),
495          createVNode(_component_Separator),
496          createVNode(_component_Separator),
497          createVNode(_component_MenuItem, {
498            onClick: $options.handleDelete,
499            danger: ""
500          }, {
501            default: withCtx(() => [..._cache[13] || (_cache[13] = [
502              createTextVNode("Delete", -1)
503            ])]),
504            _: 1
505          }, 8, ["onClick"])
506        ]),
507        _: 1
508      })
509    ]),
510    "title-desc": withCtx(() => [
511      createVNode(_component_IconReadOnly, { model: _ctx.model }, null, 8, ["model"]),
512      createVNode(_component_SyncStatus, {
513        status: _ctx.model.status,
514        tooltip: _ctx.model.message
515      }, null, 8, ["status", "tooltip"])
516    ]),
517    default: withCtx(() => [
518      createVNode(QTabs, {
519        "indicator-color": "primary",
520        align: "left",
521        modelValue: _ctx.currentTab,
522        "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => _ctx.currentTab = $event),
523        dense: "",
524        class: "",
525        "no-caps": ""
526      }, {
527        default: withCtx(() => [
528          createVNode(QTab, {
529            name: "details",
530            label: "Details"
531          })
532        ]),
533        _: 1
534      }, 8, ["modelValue"]),
535      createVNode(QTabPanels, {
536        "keep-alive": "",
537        modelValue: _ctx.currentTab,
538        "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => _ctx.currentTab = $event)
539      }, {
540        default: withCtx(() => [
541          createVNode(QTabPanel, { name: "details" }, {
542            default: withCtx(() => [
543              createVNode(_component_ConnectionDetails, {
544                model: _ctx.model,
545                onEdit: _cache[1] || (_cache[1] = ($event) => _ctx.dialogOpen = true)
546              }, null, 8, ["model"])
547            ]),
548            _: 1
549          })
550        ]),
551        _: 1
552      }, 8, ["modelValue"]),
553      createVNode(_component_ConnectionDialog, {
554        modelValue: _ctx.dialogOpen,
555        "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => _ctx.dialogOpen = $event),
556        connId: _ctx.connId,
557        mode: "edit",
558        onOk: $options.refresh,
559        onCancel: _cache[4] || (_cache[4] = ($event) => _ctx.dialogOpen = false)
560      }, null, 8, ["modelValue", "connId", "onOk"]),
561      createVNode(_component_TextViewerDialog, {
562        modelValue: _ctx.textViewerOpen,
563        "onUpdate:modelValue": _cache[5] || (_cache[5] = ($event) => _ctx.textViewerOpen = $event),
564        content: _ctx.textViewerContent
565      }, null, 8, ["modelValue", "content"]),
566      createVNode(_component_RefUsageViewerDialog, {
567        modelValue: _ctx.usageViewerOpen,
568        "onUpdate:modelValue": _cache[6] || (_cache[6] = ($event) => _ctx.usageViewerOpen = $event),
569        model: _ctx.usageViewerContent,
570        title: _ctx.usageViewerTitle
571      }, null, 8, ["modelValue", "model", "title"])
572    ]),
573    _: 1
574  }, 8, ["title", "initing", "initingSuccess", "processing", "message", "messageType"]);
575}
576const Connection = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render], ["__file", "Connection.vue"]]);
577export {
578  Connection as default
579};
580//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29ubmVjdGlvbi1DamtRQ0JoYy5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Byb2R1Y3RzL2FjY291bnQvcGFnZXMvY29ubmVjdGlvbi9Db25uZWN0aW9uRGV0YWlscy52dWUiLCIuLi8uLi8uLi9zcmMvcHJvZHVjdHMvYWNjb3VudC9wYWdlcy9jb25uZWN0aW9uL0Nvbm5lY3Rpb24udnVlIl0sInNvdXJjZXNDb250ZW50IjpbIjx0ZW1wbGF0ZT5cbiAgPENhcmQgd2lkdGg9XCIxMDAlXCIgOm1lc3NhZ2U9XCJtZXNzYWdlXCIgOm1lc3NhZ2VUeXBlPVwibWVzc2FnZVR5cGVcIj5cbiAgICA8Um93PlxuICAgICAgPENvbHVtbj5cbiAgICAgICAgPE91dHB1dEZpZWxkIGxhYmVsPVwiTmFtZVwiIDp2YWx1ZT1cIm1vZGVsLm5hbWVcIiAvPlxuICAgICAgPC9Db2x1bW4+XG4gICAgICA8Q29sdW1uPlxuICAgICAgICA8T3V0cHV0RmllbGQgbGFiZWw9XCJUeXBlXCIgOnZhbHVlPVwibW9kZWwudHlwZVwiIDp2YWx1ZUxhYmVscz1cInZhbHVlTGFiZWxzKCkuY29ublR5cGVzXCIgLz5cbiAgICAgIDwvQ29sdW1uPlxuICAgICAgPENvbHVtbj5cbiAgICAgICAgPE91dHB1dEZpZWxkIGxhYmVsPVwiRmxhdm9yXCIgOnZhbHVlPVwibW9kZWwuZmxhdm9yXCIgLz5cbiAgICAgIDwvQ29sdW1uPlxuICAgIDwvUm93PlxuICAgIDxSb3c+XG4gICAgICA8Q29sdW1uPlxuICAgICAgICA8T3V0cHV0RmllbGQgbGFiZWw9XCJBdXRoIFR5cGVcIiA6dmFsdWU9XCJtb2RlbC5hdXRoVHlwZVwiIDp2YWx1ZUxhYmVscz1cInZhbHVlTGFiZWxzKCkuYXV0aFR5cGVzXCIgLz5cbiAgICAgIDwvQ29sdW1uPlxuICAgICAgPENvbHVtbj5cbiAgICAgICAgPE91dHB1dEZpZWxkIGxhYmVsPVwiQXV0aCBVc2VyXCIgOnZhbHVlPVwibW9kZWwuYXV0aFVzZXJcIiAvPlxuICAgICAgPC9Db2x1bW4+XG4gICAgPC9Sb3c+XG4gICAgPFJvdz5cbiAgICAgIDxDb2x1bW4+XG4gICAgICAgIDxPdXRwdXRGaWVsZCBsYWJlbD1cIkV4dGVybmFsIEVudiBOYW1lXCIgOnZhbHVlPVwibW9kZWwuZXh0ZXJuYWxFbnZOYW1lXCIgLz5cbiAgICAgIDwvQ29sdW1uPlxuICAgICAgPENvbHVtbj5cbiAgICAgICAgPE91dHB1dEZpZWxkIGxhYmVsPVwiRXh0ZXJuYWwgRW52IElkXCIgOnZhbHVlPVwibW9kZWwuZXh0ZXJuYWxFbnZJZFwiIC8+XG4gICAgICA8L0NvbHVtbj5cbiAgICA8L1Jvdz5cbiAgICA8Um93PlxuICAgICAgPENvbHVtbj5cbiAgICAgICAgPE91dHB1dEZpZWxkIGxhYmVsPVwiU2hhcmluZ1wiIDp2YWx1ZT1cIm1vZGVsLnNoYXJpbmdcIiA6dmFsdWVMYWJlbHM9XCJ2YWx1ZUxhYmVscygpLnNoYXJpbmdUeXBlc1wiIC8+XG4gICAgICA8L0NvbHVtbj5cbiAgICAgIDxDb2x1bW4+XG4gICAgICAgIDxPdXRwdXRGaWVsZCBsYWJlbD1cIlNoYXJpbmcgRGV0YWlsc1wiIDp2YWx1ZT1cIm1vZGVsLnNoYXJpbmdEZXRhaWxzXCIgLz5cbiAgICAgIDwvQ29sdW1uPlxuICAgIDwvUm93PlxuICAgIDxSb3c+XG4gICAgICA8Q29sdW1uPlxuICAgICAgICA8T3V0cHV0RmllbGQgbGFiZWw9XCJPd25lclwiIDp2YWx1ZT1cIihtb2RlbC5vd25lcklkX19yIHx8IHt9KS5uYW1lXCIgLz5cbiAgICAgIDwvQ29sdW1uPlxuICAgIDwvUm93PlxuICAgIDxSb3c+XG4gICAgICA8Q29sdW1uPlxuICAgICAgICA8T3V0cHV0RmllbGQgbGFiZWw9XCJQcm9wZXJ0aWVzXCIgOnZhbHVlPVwiZ2V0UHJvcHNUb0Rpc3BsYXkoKVwiIC8+XG4gICAgICA8L0NvbHVtbj5cbiAgICA8L1Jvdz5cbiAgICA8Um93PlxuICAgICAgPENvbHVtbj5cbiAgICAgICAgPE91dHB1dEZpZWxkIGxhYmVsPVwiTWVzc2FnZVwiIDp2YWx1ZT1cIm1vZGVsLm1lc3NhZ2VcIiAvPlxuICAgICAgPC9Db2x1bW4+XG4gICAgPC9Sb3c+XG4gICAgPFJvdz5cbiAgICAgIDxDb2x1bW4+XG4gICAgICAgIDxPdXRwdXRGaWVsZCBsYWJlbD1cIkRldGFpbHNcIiA6dmFsdWU9XCJtb2RlbC5kZXRhaWxzXCIgLz5cbiAgICAgIDwvQ29sdW1uPlxuICAgIDwvUm93PlxuICAgIDxSb3c+XG4gICAgICA8Q29sdW1uPlxuICAgICAgICA8T3V0cHV0RmllbGQgbGFiZWw9XCJDcmVhdGVkXCIgOnZhbHVlPVwiY3JlYXRlZFwiIC8+XG4gICAgICA8L0NvbHVtbj5cbiAgICAgIDxDb2x1bW4+XG4gICAgICAgIDxPdXRwdXRGaWVsZCBsYWJlbD1cIlVwZGF0ZWRcIiA6dmFsdWU9XCJ1cGRhdGVkXCIgLz5cbiAgICAgIDwvQ29sdW1uPlxuICAgIDwvUm93PlxuICAgIDwhLS0gICAgPFJvdz4tLT5cbiAgICA8IS0tICAgICAgPENvbHVtbj4tLT5cbiAgICA8IS0tICAgICAgICA8QnV0dG9uIEBjbGljaz1cIiRlbWl0KCdlZGl0JylcIiBsYWJlbD1cIkVkaXRcIiAvPi0tPlxuICAgIDwhLS0gICAgICA8L0NvbHVtbj4tLT5cbiAgICA8IS0tICAgIDwvUm93Pi0tPlxuXG4gICAgPFByb2dyZXNzRGlhbG9nIHYtbW9kZWw9XCJwcm9jZXNzaW5nXCIgLz5cbiAgPC9DYXJkPlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJ3NyYy9zZXJ2aWNlcy91dGlscyc7XG5pbXBvcnQgbWl4aW5zIGZyb20gJ3NyYy9taXhpbnMvbWl4aW5zJztcbmltcG9ydCAqIGFzIGNvbW1vbkFwaSBmcm9tICdzcmMvc2VydmljZXMvY29tbW9uQXBpJztcbmltcG9ydCBPdXRwdXRGaWVsZCBmcm9tICdzcmMvY29tcG9uZW50cy9PdXRwdXRGaWVsZC52dWUnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG1peGluczogW21peGluc10sXG4gIGNvbXBvbmVudHM6IHtPdXRwdXRGaWVsZH0sXG4gIHByb3BzOiB7XG4gICAgbW9kZWw6IE9iamVjdCxcbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybi
580B7XG4gICAgICBtZXNzYWdlOiAnJyxcbiAgICB9O1xuICB9LFxuICBjb21wdXRlZDoge1xuICAgIGNyZWF0ZWQoKSB7XG4gICAgICByZXR1cm4gdXRpbHMuZ2V0QXVkaXRDcmVhdGVkKHRoaXMubW9kZWwpO1xuICAgIH0sXG4gICAgdXBkYXRlZCgpIHtcbiAgICAgIHJldHVybiB1dGlscy5nZXRBdWRpdFVwZGF0ZWQodGhpcy5tb2RlbCk7XG4gICAgfSxcbiAgfSxcbiAgbWV0aG9kczoge1xuICAgIHZhbHVlTGFiZWxzKCkge1xuICAgICAgcmV0dXJuIHV0aWxzLnZhbHVlTGFiZWxzO1xuICAgIH0sXG4gICAgZ2V0UHJvcHNUb0Rpc3BsYXkoKSB7XG4gICAgICByZXR1cm4gdXRpbHMuZ2V0UHJvcHNUb0Rpc3BsYXkodGhpcy5tb2RlbC5vcHRpb25zKTtcbiAgICB9LFxuICB9LFxufTtcbjwvc2NyaXB0PlxuIiwiPHRlbXBsYXRlPlxuICA8UGFnZVxuICAgIDp0aXRsZT1cImBDb25uZWN0aW9uIC0gJHttb2RlbC5uYW1lIHx8ICcnfWBcIlxuICAgIDppbml0aW5nPVwiaW5pdGluZ1wiXG4gICAgOmluaXRpbmdTdWNjZXNzPVwiaW5pdGluZ1N1Y2Nlc3NcIlxuICAgIDpwcm9jZXNzaW5nPVwicHJvY2Vzc2luZ1wiXG4gICAgOm1lc3NhZ2U9XCJtZXNzYWdlXCJcbiAgICA6bWVzc2FnZVR5cGU9XCJtZXNzYWdlVHlwZVwiXG4gID5cbiAgICA8dGVtcGxhdGUgdi1zbG90OmJyZWFkY3J1bWJzPlxuICAgICAgPHEtYnJlYWRjcnVtYnMtZWwgbGFiZWw9XCJIb21lXCIgOnRvPVwiYC8ke3Byb2R1Y3ROYW1lfS9ob21lYFwiIC8+XG4gICAgICA8cS1icmVhZGNydW1icy1lbCBsYWJlbD1cIkNvbm5lY3Rpb25zXCIgOnRvPVwiYC8ke3Byb2R1Y3ROYW1lfS9jb25uZWN0aW9uc2BcIiAvPlxuICAgIDwvdGVtcGxhdGU+XG5cbiAgICA8dGVtcGxhdGUgdi1zbG90OnRpdGxlLXN1ZmZpeD5cbiAgICAgIDxJY29uIG5hbWU9XCJyZWZyZXNoXCIgQGNsaWNrPVwicmVmcmVzaFwiIGNsaWNrYWJsZSAvPlxuICAgICAgPEljb25NZW51PlxuICAgICAgICA8TWVudUl0ZW0gQGNsaWNrPVwiaGFuZGxlRWRpdFwiPkVkaXQ8L01lbnVJdGVtPlxuICAgICAgICA8IS0tICAgICAgICA8TWVudUl0ZW0gQGNsaWNrPVwiaGFuZGxlQ2hhbmdlT3duZXJcIj5DaGFuZ2UgT3duZXI8L01lbnVJdGVtPi0tPlxuICAgICAgICA8TWVudUl0ZW0gQGNsaWNrPVwiaGFuZGxlQ2xlYXJDYWNoZVwiPkNsZWFyIENhY2hlPC9NZW51SXRlbT5cbiAgICAgICAgPFNlcGFyYXRvciAvPlxuICAgICAgICA8IS0tICAgICAgICBUaGlzIGlzIG5vdCByZXF1aXJlZCBhcyB3ZSBkb24ndCBtYXNrIHRoZSB1c2VybmFtZS0tPlxuICAgICAgICA8IS0tICAgICAgICA8TWVudUl0ZW0gQGNsaWNrPVwidmlld1VzZXJuYW1lXCI+VmlldyBVc2VybmFtZTwvTWVudUl0ZW0+LS0+XG4gICAgICAgIDxNZW51SXRlbSBAY2xpY2s9XCJ2aWV3VXNhZ2
580VcIj5WaWV3IFVzYWdlPC9NZW51SXRlbT5cbiAgICAgICAgPE1lbnVJdGVtIHYtaWY9XCJtb2RlbC50eXBlID09PSAnc2ZkYydcIiBAY2xpY2s9XCJvcGVuU2ZkY1VJXCI+T3BlbiBTZmRjIFVJPC9NZW51SXRlbT5cbiAgICAgICAgPE1lbnVJdGVtIHYtaWY9XCJtb2RlbC50eXBlID09PSAnc2ZkYycgJiYgaXNUZW5hbnRBZG1pblwiIEBjbGljaz1cImhhbmRsZVJvdGF0ZUFjY2Vzc1Rva2VuXCI+Um90YXRlIEFjY2VzcyBUb2tlbjwvTWVudUl0ZW0+XG4gICAgICAgIDxNZW51SXRlbSBAY2xpY2s9XCJoYW5kbGVDbGVhclNlY3JldHNcIj5DbGVhciBTZWNyZXRzPC9NZW51SXRlbT5cbiAgICAgICAgPFNlcGFyYXRvciAvPlxuXG4gICAgICAgIDxTZXBhcmF0b3IgLz5cbiAgICAgICAgPE1lbnVJdGVtIEBjbGljaz1cImhhbmRsZURlbGV0ZVwiIGRhbmdlcj5EZWxldGU8L01lbnVJdGVtPlxuICAgICAgPC9JY29uTWVudT5cbiAgICA8L3RlbXBsYXRlPlxuICAgIDx0ZW1wbGF0ZSB2LXNsb3Q6dGl0bGUtZGVzYz5cbiAgICAgIDxJY29uUmVhZE9ubHkgOm1vZGVsPVwibW9kZWxcIiAvPlxuICAgICAgPFN5bmNTdGF0dXMgOnN0YXR1cz1cIm1vZGVsLnN0YXR1c1wiIDp0b29sdGlwPVwibW9kZWwubWVzc2FnZVwiIC8+XG4gICAgPC90ZW1wbGF0ZT5cblxuICAgIDxxLXRhYnMgaW5kaWNhdG9yLWNvbG9yPVwicHJpbWFyeVwiIGFsaWduPVwibGVmdFwiIHYtbW9kZWw9XCJjdXJyZW50VGFiXCIgZGVuc2UgY2xhc3Mgbm8tY2Fwcz5cbiAgICAgIDxxLXRhYiBuYW1lPVwiZGV0YWlsc1wiIGxhYmVsPVwiRGV0YWlsc1wiIC8+XG4gICAgPC9xLXRhYnM+XG5cbiAgICA8cS10YWItcGFuZWxzIGtlZXAtYWxpdmUgdi1tb2RlbD1cImN1cnJlbnRUYWJcIj5cbiAgICAgIDxxLXRhYi1wYW5lbCBuYW1lPVwiZGV0YWlsc1wiPlxuICAgICAgICA8Q29ubmVjdGlvbkRldGFpbHMgOm1vZGVsPVwibW9kZWxcIiBAZWRpdD1cImRpYWxvZ09wZW4gPSB0cnVlXCIgLz5cbiAgICAgIDwvcS10YWItcGFuZWw+XG4gICAgPC9xLXRhYi1wYW5lbHM+XG4gICAgPENvbm5lY3Rpb25EaWFsb2cgdi1tb2RlbD1cImRpYWxvZ09wZW5cIiA6Y29ubklkPVwiY29ubklkXCIgbW9kZT1cImVkaXRcIiBAb2s9XCJyZWZyZXNoXCIgQGNhbmNlbD1cImRpYWxvZ09wZW4gPSBmYWxzZVwiIC8+XG4gICAgPFRleHRWaWV3ZXJEaWFsb2cgdi1tb2RlbD1cInRleHRWaWV3ZXJPcGVuXCIgOmNvbnRlbnQ9XCJ0ZXh0Vmlld2VyQ29udGVudFwiIC8+XG4gICAgPFJlZlVzYWdlVmlld2VyRGlhbG9nIHYtbW9kZWw9XCJ1c2FnZVZpZXdlck9wZW5cIiA6bW9kZWw9XCJ1c2FnZVZpZXdlckNvbnRlbnRcIiA6dGl0bGU9XCJ1c2FnZVZpZXdlclRpdGxlXCIgLz5cbiAgPC9QYWdlPlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCAqIGFzIGNvbW1vbkFwaSBmcm9tICdzcmMvc2VydmljZXMvY29tbW9uQXBpJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJ3NyYy9zZXJ2aWNlcy91dGlscyc7XG5pbXBvcnQgbWl4aW5zIGZyb20gJ3NyYy9taXhpbnMvbWl4aW5zJztcbmltcG9ydCBDb25uZWN0aW9uRGV0YWlscyBmcm9tICcuL0Nvbm5lY3Rpb25EZXRhaWxzLnZ1ZSc7XG5pbXBvcnQgQ29ubmVjdGlvbkRpYWxvZyBmcm9tICcuL0Nvbm5lY3Rpb25EaWFsb2cudnVlJztcbmltcG9ydCBSZWZVc2FnZVZpZXdlckRpYWxvZyBmcm9tICcuL1JlZlVzYWdlVmlld2VyRGlhbG9nLnZ1ZSc7XG5pbXBvcnQge25vdGlmeUluZm99IGZyb20gJ3NyYy9zZXJ2aWNlcy91dGlscyc7XG5pbXBvcnQgKiBhcyBjb21tbm9uQXBpIGZyb20gJ3NyYy9zZXJ2aWNlcy9jb21tb25BcGknO1xuaW1wb3J0IEljb25SZWFkT25seSBmcm9tICdzcmMvY29tcG9uZW50cy9JY29uUmVhZE9ubHkudnVlJztcbmltcG9ydCBUZXh0Vmlld2VyRGlhbG9nIGZyb20gJ3NyYy9jb21wb25lbnRzL1RleHRWaWV3ZXJEaWFsb2cudnVlJztcbmltcG9ydCBTeW5jU3RhdHVzIGZyb20gJ3NyYy9jb21wb25lbnRzL1N5bmNTdGF0dXMudnVlJztcbmltcG9ydCAqIGFzIGFjY2VzcyBmcm9tICdAZGF0YXNlcnQvanMtdXRpbHMnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG1peGluczogW21peGluc10sXG5cbiAgY29tcG9uZW50czoge1xuICAgIENvbm5lY3Rpb25EaWFsb2csXG4gICAgQ29ubmVjdGlvbkRldGFpbHMsXG4gICAgUmVmVXNhZ2VWaWV3ZXJEaWFsb2csXG4gICAgSWNvblJlYWRPbmx5LFxuICAgIFRleHRWaWV3ZXJEaWFsb2csXG4gICAgU3luY1N0YXR1cyxcbiAgfSxcbiAgcHJvcHM6IHtcbiAgICBzaG93RW52czoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgIH0sXG4gICAgc2hvd0pvYnM6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICB9LFxuICB9LFxuXG4gIGRhdGE6ICgpID0+ICh7XG4gICAgcHJvZ3Jlc3NPcGVuOiBmYWxzZSxcbiAgICBkaWFsb2dPcGVuOiBmYWxzZSxcbiAgICBkaWFsb2dNb2RlOiAnYWRkJyxcbiAgICBkaWFsb2dDb25uSWQ6IG51bGwsXG4gICAgZGlhbG9nRGF0YToge30sXG4gICAgaW5pdGluZ1N1Y2Nlc3M6IHRydWUsXG4gICAgbW9kZWw6IFtdLFxuICAgIGN1cnJlbnRUYWI6ICdkZXRhaWxzJyxcbiAgICBjb25uSWQ6ICcnLFxuICAgIHByb2R1Y3ROYW1lOiB1dGlscy5nZXRDdXJyZW50UHJvZHVjdCgpLFxuICAgIHRleHRWaWV3ZXJDb250ZW50OiAnJyxcbiAgICB0ZXh0Vmlld2VyT3BlbjogZmFsc2UsXG4gICAgdXNhZ2VWaWV3ZXJDb250ZW50OiBbXSxcbiAgICB1c2FnZVZpZXdlck9wZW46IGZhbHNlLFxuICAgIHVzYWdlVmlld2VyVGl0bGU6ICcnLFxuICB9KSxcblxuICBjcmVhdGVkKCkge1xuICAgIHRoaXMuY29ubklkID0gdGhpcy4kcm91dGUucGFyYW1zLmNvbm5JZDtcbiAgICB0aGlzLmluaXRGb3JtKGFzeW5jICgpID0+IHtcbiAgICAgIHRoaXMubW9kZWwgPSBhd2FpdCBjb21tb25BcGkuZ2V0Q29ubmVjdGlvbih0aGlzLmNvbm5JZCk7XG4gICAgfSk7XG4gIH0sXG4gIGNvbXB1dGVkOiB7XG4gICAgaGFzUmVhbHRhc2soKSB7XG4gICAgICByZXR1cm4gdXRpbHMuaGFzUmVhbHRhc2soKTtcbiAgICB9LFxuICAgIGlzVGVuYW50
580QWRtaW4oKSB7XG4gICAgICByZXR1cm4gdXRpbHMuaXNUZW5hbnRBZG1pbigpO1xuICAgIH0sXG4gIH0sXG4gIG1ldGhvZHM6IHtcbiAgICBhc3luYyByZWZyZXNoKCkge1xuICAgICAgdGhpcy5wcm9jZXNzRm9ybShhc3luYyAoKSA9PiB7XG4gICAgICAgIHRoaXMubW9kZWwgPSBhd2FpdCBjb21tb25BcGkuZ2V0Q29ubmVjdGlvbih0aGlzLmNvbm5JZCk7XG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgaGFuZGxlRGVsZXRlKCkge1xuICAgICAgY29uc3QgcmVjcyA9IFt0aGlzLm1vZGVsXTtcbiAgICAgIGNvbnN0IG1zZyA9XG4gICAgICAgIGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoZSBmb2xsb3dpbmcgQ29ubmVjdGlvbj8gPC9icj4gJHt1dGlscy5nZXRFbnRpdHlOYW1lc0xpc3RGb3JEaWFsb2cocmVjcyl9YCArXG4gICAgICAgICdOb3RlIHRoYXQgaWYgQ29ubmVjdGlvbiBpcyByZWZlcmVuY2VkIGJ5IGVudGl0aWVzIGxpa2UgUmVhbHRhc2sgSm9icyBvciBSZWFsdGFzayBFbnZpcm9ubWVudHMsIHRoZW4gaXQgY2Fubm90IGJlIGRlbGV0ZWQgdW50aWwgYWxsIHJlZmVyZW5jZXMgYXJlIHJlbW92ZWQuJztcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdXRpbHMuY29uZmlybURlbGV0ZSgnRGVsZXRlIENvbm5lY3Rpb24/JywgbXNnKTtcblxuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICB0aGlzLmhhbmRsZURlbGV0ZUFmdGVyQ29uZmlybSgpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBoYW5kbGVEZWxldGVBZnRlckNvbmZpcm0oKSB7XG4gICAgICB0aGlzLnByb2Nlc3NpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5wcm9jZXNzRm9ybShhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGNvbW1vbkFwaS5kZWxldGVDb25uZWN0aW9ucyh7XG4gICAgICAgICAgcmVjb3JkczogW3tpZDogdGhpcy5tb2RlbC5pZH1dLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4kcm91dGVyLmdvKC0xKTtcbiAgICAgICAgdXRpbHMubm90aWZ5U3VjY2VzcygnQ29ubmVjdGlvbiBoYXZlIGJlZW4gZGVsZXRlZCcpO1xuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGhhbmRsZUVkaXQoKSB7XG4gICAgICB0aGlzLmRpYWxvZ0Nvbm5JZCA9IHRoaXMubW9kZWwuaWQ7XG4gICAgICB0aGlzLmRpYWxvZ01vZGUgPSAnZWRpdCc7XG4gICAgICB0aGlzLmRpYWxvZ09wZW4gPSB0cnVlO1xuICAgIH0sXG5cbiAgICB2aWV3VXNlcm5hbWUoKSB7XG4gICAgICB0aGlzLnByb2Nlc3MoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgY29tbW9uQXBpLmdldENvbm5Vc2VybmFtZSh0aGlzLm1vZGVsLmlkKTtcbiAgICAgICAgdGhpcy50ZXh0Vmlld2VyQ29udGVudCA9IEpTT04uc3RyaW5naWZ5KHJlc3ApO1xuICAgICAgICB0aGlzLnRleHRWaWV3ZXJPcGVuID0gdHJ1ZTtcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICB2aWV3VXNhZ2UoKSB7XG4gICAgICB0aGlzLnByb2Nlc3MoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB1c2FnZXMgPSBhd2FpdCBjb21tb25BcGkuZ2V0Q29ublVzYWdlKHRoaXMubW9kZWwuaWQpO1xuICAgICAgICBpZiAodXNhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIG5vdGlmeUluZm8oJ1RoaXMgY29ubmVjdGlvbiBpcyBub3QgdXNlZCBhbnl3aGVyZScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudXNhZ2VWaWV3ZXJDb250ZW50ID0gdXNhZ2VzO1xuICAgICAgICAgIHRoaXMudXNhZ2VWaWV3ZXJPcGVuID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnVzYWdlVmlld2VyVGl0bGUgPSBgQ29ubmVjdGlvbiBVc2FnZSAtICR7dGhpcy5tb2RlbC5uYW1lfWA7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBvcGVuU2ZkY1VJKCkge1xuICAgICAgdGhpcy5wcm9jZXNzKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgaW5mbyA9IGF3YWl0IGNvbW1vbkFwaS5nZXRFeHRlcm5hbExvZ2luSW5mbyh0aGlzLm1vZGVsLmlkKTtcbiAgICAgICAgd2luZG93Lm9wZW4oaW5mby51cmwsICdfbmV3dGFiJyk7XG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgaGFuZGxlQ2xlYXJTZWNyZXRzKCkge1xuICAgICAgY29uc3QgcmVjcyA9IFt0aGlzLm1vZGVsXTtcbiAgICAgIHRoaXMubWVzc2FnZSA9IG51bGw7XG4gICAgICBjb25zdCBtc2cgPVxuICAgICAgICBgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNsZWFyIHRoZSBzZWNyZXRzIGZvciBmb2xsb3dpbmcgQ29ubmVjdGlvbnM/IDwvYnI+ICR7dXRpbHMuZ2V0RW50aXR5TmFtZXNMaXN0Rm9yRGlhbG9nKHJlY3MpfVxcblxcbmAgK1xuICAgICAgICAnT25jZSBjbGVhcmVkLCB0aGlzIGNvbm5lY3Rpb24gd2lsbCBub3QgYmUgYWJsZSB0byBiZSB1c2VkIHRpbGwgc2VjcmV0cyBhcmUgc3BlY2lmaWVkIGFnYWluLic7XG5cbiAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IHV0aWxzLmNvbmZpcm1EYW5nZXIoJ0NsZWFyIFNlY3JldHM/JywgbXNnLCAnWWVzLCBDbGVhcicpO1xuICAgICAgaWYgKCFjb25maXJtZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5wcm9jZXNzRm9ybShhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBjb21tb25BcGkuY2xlYXJTZWNyZXRzKHtyZWNvcmRzOiBbe2lkOiB0aGlzLm1vZGVsLmlkfV19KTtcbiAgICAgICAgdXRpbHMubm90aWZ5U3VjY2VzcyhyZXNwLm1lc3NhZ2UpO1xuICAgICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBoYW5kbGVDbGVhckNhY2hlKCkge1xuICAgICAgdGhpcy5tZXNzYWdlID0gbnVsbDtcbiAgICAgIGNvbnN0IG1zZyA9ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY2xlYXIgdGhlIGNhY2hlPyc7XG4gICAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCB1dGlscy5zaG93Q29uZmlybSgnQ2xlYXIgQ2FjaGU/JywgbXNnLCB7b2tMYWJlbDogJ1llcywgQ2xlYXInfSk7XG4gICAgICBpZiAoIWNvbmZpcm1lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJldHVybi
580B0aGlzLnByb2Nlc3NGb3JtKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgY29tbW5vbkFwaS5jbGVhckNhY2hlKHtyZWNvcmRzOiBbe2lkOiB0aGlzLm1vZGVsLmlkfV19KTtcbiAgICAgICAgdXRpbHMubm90aWZ5U3VjY2VzcygnQ2FjaGUgaGFzIGJlZW4gY2xlYXJlZCcpO1xuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGhhbmRsZVJvdGF0ZUFjY2Vzc1Rva2VuKCkge1xuICAgICAgdGhpcy5tZXNzYWdlID0gbnVsbDtcbiAgICAgIGNvbnN0IG1zZyA9XG4gICAgICAgICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcm90YXRlIHRoZSBhY2Nlc3MgdG9rZW4gZm9yIHRoaXMgQ29ubmVjdGlvbj8gJyArXG4gICAgICAgICdUaGlzIHdpbGwgY2FsbCBTYWxlc2ZvcmNlIHRvIHJlbmV3IHRoZSBzZXNzaW9uLCByZS1pc3N1aW5nIHRoZSBhY2Nlc3MgdG9rZW4gKGFuZCByZWZyZXNoIHRva2VuLCBpZiBSZWZyZXNoIFRva2VuIFJvdGF0aW9uICcgK1xuICAgICAgICAnaXMgZW5hYmxlZCkgYW5kIHNhdmluZyB0aGUgbmV3IHRva2Vucy4nO1xuICAgICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgdXRpbHMuc2hvd0NvbmZpcm0oJ1JvdGF0ZSBBY2Nlc3MgVG9rZW4/JywgbXNnLCB7b2tMYWJlbDogJ1llcywgUm90YXRlJ30pO1xuICAgICAgaWYgKCFjb25maXJtZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5wcm9jZXNzRm9ybShhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBjb21tb25BcGkucm90YXRlQWNjZXNzVG9rZW4odGhpcy5tb2RlbC5pZCk7XG4gICAgICAgIHV0aWxzLm5vdGlmeVN1Y2Nlc3MocmVzcC5tZXNzYWdlKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgICB9KTtcbiAgICB9LFxuICB9LFxufTtcbjwvc2NyaXB0PlxuIl0sIm5hbWVzIjpbIl9zZmNfbWFpbiIsInV0aWxzLmdldEF1ZGl0Q3JlYXRlZCIsInV0aWxzLmdldEF1ZGl0VXBkYXRlZCIsInV0aWxzLnZhbHVlTGFiZWxzIiwidXRpbHMuZ2V0UHJvcHNUb0Rpc3BsYXkiLCJfY3JlYXRlQmxvY2siLCJfY3JlYXRlVk5vZGUiLCJ1dGlscy5nZXRDdXJyZW50UHJvZHVjdCIsImNvbW1vbkFwaS5nZXRDb25uZWN0aW9uIiwidXRpbHMuaGFzUmVhbHRhc2siLCJ1dGlscy5pc1RlbmFudEFkbWluIiwidXRpbHMuZ2V0RW50aXR5TmFtZXNMaXN0Rm9yRGlhbG9nIiwidXRpbHMuY29uZmlybURlbGV0ZSIsImNvbW1vbkFwaS5kZWxldGVDb25uZWN0aW9ucyIsInV0aWxzLm5vdGlmeVN1Y2Nlc3MiLCJjb21tb25BcGkuZ2V0Q29ublVzZXJuYW1lIiwiY29tbW9uQXBpLmdldENvbm5Vc2FnZSIsImNvbW1vbkFwaS5nZXRFeHRlcm5hbExvZ2luSW5mbyIsInV0aWxzLmNvbmZpcm1EYW5nZXIiLCJjb21tb25BcGkuY2xlYXJTZWNyZXRzIiwidXRpbHMuc2hvd0NvbmZpcm0iLCJjb21tbm9uQXBpLmNsZWFyQ2FjaGUiLCJjb21tb25BcGkucm90YXRlQWNjZXNzVG9rZW4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWlGQSxNQUFLQSxjQUFVO0FBQUEsRUFDYixRQUFRLENBQUMsTUFBTTtBQUFBLEVBQ2YsWUFBWSxFQUFDLFlBQVc7QUFBQSxFQUN4QixPQUFPO0FBQUEsSUFDTCxPQUFPO0FBQUE7RUFHVCxPQUFPO0FBQ0wsV0FBTztBQUFBLE1BQ0wsU0FBUztBQUFBO0VBRWI7QUFBQSxFQUNBLFVBQVU7QUFBQSxJQUNSLFVBQVU7QUFDUixhQUFPQyxnQkFBc0IsS0FBSyxLQUFLO0FBQUEsSUFDekM7QUFBQSxJQUNBLFVBQVU7QUFDUixhQUFPQyxnQkFBc0IsS0FBSyxLQUFLO0FBQUEsSUFDekM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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.