@1agh/maude 0.29.0 → 0.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/apps/studio/ai-banner.tsx +0 -1
- package/apps/studio/annotations-align.ts +149 -0
- package/apps/studio/annotations-bindings.ts +197 -0
- package/apps/studio/annotations-context-toolbar.tsx +436 -186
- package/apps/studio/annotations-groups.ts +270 -0
- package/apps/studio/annotations-layer.tsx +1708 -1660
- package/apps/studio/annotations-model.ts +2077 -0
- package/apps/studio/annotations-snap.ts +125 -0
- package/apps/studio/api.ts +208 -116
- package/apps/studio/bin/_png-playwright.mjs +1 -1
- package/apps/studio/bin/annotate.mjs +732 -0
- package/apps/studio/bin/annotate.sh +17 -0
- package/apps/studio/bin/read-annotations.mjs +152 -17
- package/apps/studio/build.ts +1 -1
- package/apps/studio/canvas-arrowheads.ts +78 -9
- package/apps/studio/canvas-cursors.ts +2 -0
- package/apps/studio/canvas-edit.ts +257 -7
- package/apps/studio/canvas-icons.tsx +105 -0
- package/apps/studio/canvas-shell.tsx +305 -8
- package/apps/studio/client/app.jsx +2812 -238
- package/apps/studio/client/index.html +1 -1
- package/apps/studio/client/styles/3-shell-maude.css +713 -11
- package/apps/studio/client/styles/4-components.css +39 -0
- package/apps/studio/client/styles/5-maude-overrides.css +16 -2
- package/apps/studio/client/tour/overlay.jsx +105 -17
- package/apps/studio/client/tour/usage-tour.js +23 -10
- package/apps/studio/commands/annotation-strokes-command.ts +1 -1
- package/apps/studio/commands/move-artboards-command.ts +1 -1
- package/apps/studio/comments-overlay.tsx +7 -5
- package/apps/studio/context-menu.tsx +4 -3
- package/apps/studio/contextual-toolbar.tsx +14 -0
- package/apps/studio/cursors-overlay.tsx +20 -20
- package/apps/studio/dist/client.bundle.js +3322 -602
- package/apps/studio/dist/comment-mount.js +95 -9
- package/apps/studio/dist/styles.css +2490 -167
- package/apps/studio/dom-selection.ts +115 -0
- package/apps/studio/export-dialog.tsx +3 -3
- package/apps/studio/history.ts +20 -3
- package/apps/studio/http.ts +124 -5
- package/apps/studio/input-router.tsx +7 -0
- package/apps/studio/inspect.ts +37 -8
- package/apps/studio/participants-chrome.tsx +1 -7
- package/apps/studio/server.ts +5 -2
- package/apps/studio/sync/agent.ts +231 -57
- package/apps/studio/sync/codec.ts +45 -0
- package/apps/studio/sync/cold-start.ts +158 -0
- package/apps/studio/sync/connection-state.ts +58 -2
- package/apps/studio/sync/index.ts +563 -221
- package/apps/studio/sync/journal.ts +190 -0
- package/apps/studio/sync/migrate-seed.ts +202 -44
- package/apps/studio/sync/projection.ts +22 -3
- package/apps/studio/sync/status.ts +15 -4
- package/apps/studio/test/activity.test.ts +1 -7
- package/apps/studio/test/annotate-write.test.ts +184 -0
- package/apps/studio/test/annotations-align.test.ts +88 -0
- package/apps/studio/test/annotations-bindings.test.ts +124 -0
- package/apps/studio/test/annotations-groups.test.ts +231 -0
- package/apps/studio/test/annotations-snap.test.ts +79 -0
- package/apps/studio/test/canvas-edit.test.ts +181 -1
- package/apps/studio/test/canvas-origin-gate.test.ts +8 -0
- package/apps/studio/test/collab-bridge.test.ts +0 -2
- package/apps/studio/test/collab-room.test.ts +2 -7
- package/apps/studio/test/csp-canvas-shell.test.ts +5 -0
- package/apps/studio/test/csrf-write-guard.test.ts +52 -0
- package/apps/studio/test/figjam-v3-model.test.ts +342 -0
- package/apps/studio/test/fixtures/figjam-v3-groups-bindings.svg +1 -0
- package/apps/studio/test/shared-doc-migrate.test.ts +224 -14
- package/apps/studio/test/sync-agent.test.ts +272 -2
- package/apps/studio/test/sync-codec.test.ts +65 -0
- package/apps/studio/test/sync-cold-start.test.ts +244 -0
- package/apps/studio/test/sync-connection-state.test.ts +68 -0
- package/apps/studio/test/sync-hardening.test.ts +0 -8
- package/apps/studio/test/sync-hubs-config.test.ts +0 -1
- package/apps/studio/test/sync-incident-replay.test.ts +211 -0
- package/apps/studio/test/sync-journal.test.ts +176 -0
- package/apps/studio/test/sync-runtime.test.ts +360 -5
- package/apps/studio/test/sync-status.test.ts +66 -0
- package/apps/studio/test/use-annotation-resize.test.ts +159 -0
- package/apps/studio/test/use-artboard-drag.test.ts +0 -1
- package/apps/studio/test/use-collab.test.ts +0 -0
- package/apps/studio/test/use-tool-mode.test.tsx +5 -2
- package/apps/studio/tool-palette.tsx +12 -2
- package/apps/studio/undo-hud.tsx +0 -1
- package/apps/studio/use-agent-presence.tsx +4 -2
- package/apps/studio/use-annotation-resize.tsx +484 -54
- package/apps/studio/use-annotation-selection.tsx +16 -4
- package/apps/studio/use-canvas-activity.tsx +2 -2
- package/apps/studio/use-collab.tsx +20 -15
- package/apps/studio/use-selection-set.tsx +9 -0
- package/apps/studio/use-tool-mode.tsx +5 -1
- package/apps/studio/whats-new.json +135 -10
- package/apps/studio/whats-new.schema.json +18 -2
- package/cli/commands/design-link.test.mjs +84 -0
- package/cli/commands/design.mjs +2 -1
- package/cli/commands/design.test.mjs +5 -1
- package/cli/lib/design-link.mjs +51 -1
- package/package.json +8 -8
- package/plugins/design/templates/_shell.html +28 -4
|
@@ -188,7 +188,7 @@ function screenRectFor(selector, index) {
|
|
|
188
188
|
} catch {
|
|
189
189
|
return null;
|
|
190
190
|
}
|
|
191
|
-
if (!el
|
|
191
|
+
if (!el?.isConnected)
|
|
192
192
|
return null;
|
|
193
193
|
const r = el.getBoundingClientRect();
|
|
194
194
|
if (r.width === 0 && r.height === 0)
|
|
@@ -217,7 +217,7 @@ function CommentsOverlay() {
|
|
|
217
217
|
const mirrorSelection = useCallback3((comment) => {
|
|
218
218
|
if (!selSet)
|
|
219
219
|
return;
|
|
220
|
-
if (!comment
|
|
220
|
+
if (!comment?.selector) {
|
|
221
221
|
selSet.clear();
|
|
222
222
|
return;
|
|
223
223
|
}
|
|
@@ -284,7 +284,7 @@ function CommentsOverlay() {
|
|
|
284
284
|
return;
|
|
285
285
|
const onOpen = (e) => {
|
|
286
286
|
const detail = e.detail;
|
|
287
|
-
if (!detail
|
|
287
|
+
if (!detail?.selection)
|
|
288
288
|
return;
|
|
289
289
|
setComposer({
|
|
290
290
|
selection: detail.selection,
|
|
@@ -353,7 +353,9 @@ function CommentsOverlay() {
|
|
|
353
353
|
const indexById = useMemo3(() => {
|
|
354
354
|
const m = new Map;
|
|
355
355
|
const all = comments.slice().sort((a, b) => a.created.localeCompare(b.created));
|
|
356
|
-
all.forEach((c, i) =>
|
|
356
|
+
all.forEach((c, i) => {
|
|
357
|
+
m.set(c.id, i + 1);
|
|
358
|
+
});
|
|
357
359
|
return m;
|
|
358
360
|
}, [comments]);
|
|
359
361
|
const handlePinClick = useCallback3((id) => {
|
|
@@ -658,7 +660,7 @@ function CommentPin({
|
|
|
658
660
|
if (rafRef.current != null)
|
|
659
661
|
cancelAnimationFrame(rafRef.current);
|
|
660
662
|
};
|
|
661
|
-
}, [comment.selector, comment.bounds]);
|
|
663
|
+
}, [comment.selector, comment.bounds, comment.index]);
|
|
662
664
|
const author = comment.author?.trim() || "unknown";
|
|
663
665
|
const label = `Comment ${sequence} by ${author}`;
|
|
664
666
|
return /* @__PURE__ */ jsx3("button", {
|
|
@@ -1153,6 +1155,84 @@ function selectorIndex(doc, selector, el) {
|
|
|
1153
1155
|
} catch {}
|
|
1154
1156
|
return 0;
|
|
1155
1157
|
}
|
|
1158
|
+
var KNOB_PROPS = [
|
|
1159
|
+
"display",
|
|
1160
|
+
"flex-direction",
|
|
1161
|
+
"align-items",
|
|
1162
|
+
"justify-content",
|
|
1163
|
+
"gap",
|
|
1164
|
+
"font-family",
|
|
1165
|
+
"color",
|
|
1166
|
+
"font-size",
|
|
1167
|
+
"font-weight",
|
|
1168
|
+
"line-height",
|
|
1169
|
+
"letter-spacing",
|
|
1170
|
+
"text-align",
|
|
1171
|
+
"margin",
|
|
1172
|
+
"margin-top",
|
|
1173
|
+
"margin-right",
|
|
1174
|
+
"margin-bottom",
|
|
1175
|
+
"margin-left",
|
|
1176
|
+
"padding",
|
|
1177
|
+
"padding-top",
|
|
1178
|
+
"padding-right",
|
|
1179
|
+
"padding-bottom",
|
|
1180
|
+
"padding-left",
|
|
1181
|
+
"width",
|
|
1182
|
+
"height",
|
|
1183
|
+
"max-width",
|
|
1184
|
+
"background-color",
|
|
1185
|
+
"border-radius",
|
|
1186
|
+
"border-top-left-radius",
|
|
1187
|
+
"border-top-right-radius",
|
|
1188
|
+
"border-bottom-left-radius",
|
|
1189
|
+
"border-bottom-right-radius",
|
|
1190
|
+
"border-width",
|
|
1191
|
+
"border-style",
|
|
1192
|
+
"border-color",
|
|
1193
|
+
"box-shadow",
|
|
1194
|
+
"opacity"
|
|
1195
|
+
];
|
|
1196
|
+
var ATTR_SKIP = /^(style|class|data-cd-id|data-dc-|data-dcid$)/;
|
|
1197
|
+
function styleMapsFor(el) {
|
|
1198
|
+
if (!el || typeof window === "undefined" || !window.getComputedStyle) {
|
|
1199
|
+
return { authored: {}, computed: {}, customStyles: {}, attrs: {} };
|
|
1200
|
+
}
|
|
1201
|
+
try {
|
|
1202
|
+
const inline = el.style;
|
|
1203
|
+
const cs = window.getComputedStyle(el);
|
|
1204
|
+
const authored = {};
|
|
1205
|
+
const computed = {};
|
|
1206
|
+
const knob = new Set(KNOB_PROPS);
|
|
1207
|
+
for (const p of KNOB_PROPS) {
|
|
1208
|
+
const a = inline.getPropertyValue(p);
|
|
1209
|
+
if (a)
|
|
1210
|
+
authored[p] = a.trim();
|
|
1211
|
+
const c = cs.getPropertyValue(p);
|
|
1212
|
+
if (c)
|
|
1213
|
+
computed[p] = c.trim();
|
|
1214
|
+
}
|
|
1215
|
+
const MANAGED_FAMILY = /^(margin|padding|border)(-|$)/;
|
|
1216
|
+
const customStyles = {};
|
|
1217
|
+
for (let i = 0;i < inline.length; i++) {
|
|
1218
|
+
const p = inline.item(i);
|
|
1219
|
+
if (!p || knob.has(p) || MANAGED_FAMILY.test(p))
|
|
1220
|
+
continue;
|
|
1221
|
+
const v = inline.getPropertyValue(p);
|
|
1222
|
+
if (v)
|
|
1223
|
+
customStyles[p] = v.trim();
|
|
1224
|
+
}
|
|
1225
|
+
const attrs = {};
|
|
1226
|
+
for (const a of Array.from(el.attributes)) {
|
|
1227
|
+
if (ATTR_SKIP.test(a.name))
|
|
1228
|
+
continue;
|
|
1229
|
+
attrs[a.name] = a.value;
|
|
1230
|
+
}
|
|
1231
|
+
return { authored, computed, customStyles, attrs };
|
|
1232
|
+
} catch {
|
|
1233
|
+
return { authored: {}, computed: {}, customStyles: {}, attrs: {} };
|
|
1234
|
+
}
|
|
1235
|
+
}
|
|
1156
1236
|
function hoverTargetToSelection(target, file) {
|
|
1157
1237
|
const el = target.el;
|
|
1158
1238
|
const rect = el && el.getBoundingClientRect ? el.getBoundingClientRect() : null;
|
|
@@ -1175,7 +1255,8 @@ function hoverTargetToSelection(target, file) {
|
|
|
1175
1255
|
w: Math.round(rect.width),
|
|
1176
1256
|
h: Math.round(rect.height)
|
|
1177
1257
|
} : null,
|
|
1178
|
-
html: el ? (el.outerHTML ?? "").slice(0, 4000) : ""
|
|
1258
|
+
html: el ? (el.outerHTML ?? "").slice(0, 4000) : "",
|
|
1259
|
+
...styleMapsFor(el)
|
|
1179
1260
|
};
|
|
1180
1261
|
}
|
|
1181
1262
|
|
|
@@ -1190,6 +1271,7 @@ var ANNOTATION_TOOLS = new Set([
|
|
|
1190
1271
|
"arrow",
|
|
1191
1272
|
"sticky",
|
|
1192
1273
|
"text",
|
|
1274
|
+
"section",
|
|
1193
1275
|
"eraser"
|
|
1194
1276
|
]);
|
|
1195
1277
|
function isAnnotationTool(t) {
|
|
@@ -1233,6 +1315,8 @@ function classify(input) {
|
|
|
1233
1315
|
return { kind: "tool", tool: "sticky" };
|
|
1234
1316
|
if (k === "t")
|
|
1235
1317
|
return { kind: "tool", tool: "text" };
|
|
1318
|
+
if (k === "s" && input.shiftKey)
|
|
1319
|
+
return { kind: "tool", tool: "section" };
|
|
1236
1320
|
if (k === "e")
|
|
1237
1321
|
return { kind: "tool", tool: "eraser" };
|
|
1238
1322
|
if (input.key === "Escape")
|
|
@@ -1557,6 +1641,7 @@ var TOOL_CURSORS = Object.freeze({
|
|
|
1557
1641
|
hand: HAND,
|
|
1558
1642
|
comment: COMMENT,
|
|
1559
1643
|
pen: PEN,
|
|
1644
|
+
section: CROSSHAIR,
|
|
1560
1645
|
highlighter: HIGHLIGHTER,
|
|
1561
1646
|
shape: CROSSHAIR,
|
|
1562
1647
|
rect: CROSSHAIR,
|
|
@@ -1577,6 +1662,7 @@ var DEFAULT_TOOLS = Object.freeze([
|
|
|
1577
1662
|
{ id: "highlighter", label: "Highlighter", shortcut: "I", cursor: TOOL_CURSORS.highlighter },
|
|
1578
1663
|
{ id: "shape", label: "Shape", shortcut: "R", cursor: TOOL_CURSORS.shape },
|
|
1579
1664
|
{ id: "sticky", label: "Sticky", shortcut: "N", cursor: TOOL_CURSORS.sticky },
|
|
1665
|
+
{ id: "section", label: "Section", shortcut: "⇧S", cursor: TOOL_CURSORS.shape },
|
|
1580
1666
|
{ id: "arrow", label: "Arrow", shortcut: "A", cursor: TOOL_CURSORS.arrow },
|
|
1581
1667
|
{ id: "text", label: "Text", shortcut: "T", cursor: TOOL_CURSORS.text },
|
|
1582
1668
|
{ id: "eraser", label: "Eraser", shortcut: "E", cursor: TOOL_CURSORS.eraser }
|
|
@@ -1607,7 +1693,7 @@ function ToolProvider({
|
|
|
1607
1693
|
const clearSticky = useCallback4(() => {
|
|
1608
1694
|
setSticky({ tool: null, locked: false });
|
|
1609
1695
|
}, []);
|
|
1610
|
-
const [shapeKind, setShapeKind] = useState4("
|
|
1696
|
+
const [shapeKind, setShapeKind] = useState4("rounded");
|
|
1611
1697
|
useEffect5(() => {
|
|
1612
1698
|
if (typeof document === "undefined")
|
|
1613
1699
|
return;
|
|
@@ -1956,5 +2042,5 @@ export {
|
|
|
1956
2042
|
CanvasErrorBoundary
|
|
1957
2043
|
};
|
|
1958
2044
|
|
|
1959
|
-
//# debugId=
|
|
1960
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY2FudmFzLWNvbW1lbnQtbW91bnQudHN4IiwgIi4uL2NvbW1lbnRzLW92ZXJsYXkudHN4IiwgIi4uL3VzZS1jb2xsYWIudHN4IiwgIi4uL3VzZS1zZWxlY3Rpb24tc2V0LnRzeCIsICIuLi9kb20tc2VsZWN0aW9uLnRzIiwgIi4uL2lucHV0LXJvdXRlci50c3giLCAiLi4vdXNlLXRvb2wtbW9kZS50c3giLCAiLi4vY2FudmFzLWN1cnNvcnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiLyoqXG4gKiBAZmlsZSAgICAgICBjYW52YXMtY29tbWVudC1tb3VudC50c3gg4oCUIHNoZWxsLW93bmVkIGNvbW1lbnQgbGF5ZXIgKyBtb3VudENhbnZhc1xuICogQHNjb3BlICAgICAgYXBwcy9zdHVkaW8vY2FudmFzLWNvbW1lbnQtbW91bnQudHN4XG4gKiBAcHVycG9zZSAgICBUaGUgY2FudmFzIG1vdW50IGhhcm5lc3MgKGBfc2hlbGwuaHRtbGApIGNhbGxzIGBtb3VudENhbnZhc2BcbiAqICAgICAgICAgICAgIGluc3RlYWQgb2YgcmVuZGVyaW5nIHRoZSBjYW52YXMgZGVmYXVsdC1leHBvcnQgcmF3LiBtb3VudENhbnZhc1xuICogICAgICAgICAgICAgd3JhcHMgQU5ZIGRlZmF1bHQgZXhwb3J0IOKAlCBhIGBEZXNpZ25DYW52YXNgIFVJIGNhbnZhcyBPUiBhIGJhcmVcbiAqICAgICAgICAgICAgIERTIHNwZWNpbWVuIOKAlCBpbiBhIExJVEUgY29tbWVudCBwcm92aWRlciB0cmVlIHNvIHRoZSBpbi1wbGFjZVxuICogICAgICAgICAgICAgY29tbWVudCB0b29sIHdvcmtzIG9uIGV2ZXJ5IG1vdW50ZWQgc3VyZmFjZS5cbiAqXG4gKiBXaHkgYSBzaW5nbGUgc2hlbGwtb3duZWQgbGF5ZXIgKEREUiDigJQgc2VlIHBsYW4gwqdcIktleSBkZWNpc2lvblwiKTpcbiAqICAgLSBDb21tZW50cyB1c2VkIHRvIGJlIG1vdW50ZWQgb25seSBieSBgRGVzaWduQ2FudmFzYCAoVG9vbFByb3ZpZGVyICtcbiAqICAgICBTZWxlY3Rpb25TZXRQcm92aWRlciArIENvbW1lbnRzT3ZlcmxheSArIHRoZSBvbkRyb3BDb21tZW50IHJvdXRlclxuICogICAgIGJyYW5jaCkuIEJhcmUgc3BlY2ltZW5zIChgc3lzdGVtLzxkcz4vcHJldmlldy8qLnRzeGApIG5ldmVyIHJlbmRlclxuICogICAgIERlc2lnbkNhbnZhcywgc28gdGhleSBoYWQgbm8gY29tbWVudCB0b29sIGF0IGFsbC5cbiAqICAgLSBIb2lzdGluZyB0aGUgY29tbWVudCBzdWJzeXN0ZW0gaGVyZSBtYWtlcyBpdCB1bml2ZXJzYWwuIGBEZXNpZ25DYW52YXNgXG4gKiAgICAgYmVjb21lcyBhIENPTlNVTUVSIG9mIHRoZSBzaGVsbC1wcm92aWRlZCBUb29sUHJvdmlkZXIgLyBTZWxlY3Rpb25TZXQgL1xuICogICAgIENvbW1lbnRzT3ZlcmxheSAodmlhIE1heWJlVG9vbFByb3ZpZGVyIC8gTWF5YmVTZWxlY3Rpb25TZXRQcm92aWRlciBhbmRcbiAqICAgICBieSBkcm9wcGluZyBpdHMgb3duIDxDb21tZW50c092ZXJsYXkvPikuXG4gKlxuICogQ29leGlzdGVuY2Ugd2l0aCB0aGUgVUktY2FudmFzIHJvdXRlcjogdGhpcyBsYXllcidzIGlucHV0IHJvdXRlciBpcyBhblxuICogQU5DRVNUT1IgY2FwdHVyZS1saXN0ZW5lciBvdmVyIHRoZSBjYW52YXMuIE9uIGEgVUkgY2FudmFzLCBgQ2FudmFzU2hlbGxgXG4gKiBzdGlsbCBydW5zIGl0cyBPV04gcm91dGVyIChob3ZlciAvIHNlbGVjdCAvIGNvbnRleHQtbWVudSAvIHVuZG8pLiBUbyBhdm9pZFxuICogc3dhbGxvd2luZyB0aG9zZSBnZXN0dXJlcywgdGhpcyByb3V0ZXIgcGFzc2VzIGEgbmFycm93IGBjbGFpbWFibGVBY3Rpb25zYFxuICogYWxsb3dsaXN0IOKAlCBgZHJvcC1jb21tZW50YCAvIGB0b29sYCAvIGBlc2NhcGVgIC8gYGhvdmVyYC4gYGhvdmVyYCBuZXZlclxuICogcHJldmVudERlZmF1bHRzIHNvIHRoZSBpbm5lciByb3V0ZXIncyBoYWxvIGlzIHVuYWZmZWN0ZWQ7IGV2ZXJ5dGhpbmcgZWxzZVxuICogKHNlbGVjdCAvIGNvbnRleHQtbWVudSAvIHVuZG8pIHByb3BhZ2F0ZXMgdW50b3VjaGVkIHRvIHRoZSBpbm5lciByb3V0ZXIuXG4gKi9cblxuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICB0eXBlIENvbXBvbmVudFR5cGUsXG4gIGNyZWF0ZUVsZW1lbnQsXG4gIEZyYWdtZW50LFxuICB0eXBlIFJlYWN0Tm9kZSxcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUVmZmVjdCxcbiAgdXNlTWVtbyxcbiAgdXNlUmVmLFxuICB1c2VTdGF0ZSxcbn0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY3JlYXRlUm9vdCB9IGZyb20gJ3JlYWN0LWRvbS9jbGllbnQnO1xuXG5pbXBvcnQgeyBDb21tZW50c092ZXJsYXkgfSBmcm9tICcuL2NvbW1lbnRzLW92ZXJsYXkudHN4JztcbmltcG9ydCB7IGRlcml2ZUZpbGUsIGhvdmVyVGFyZ2V0VG9TZWxlY3Rpb24gfSBmcm9tICcuL2RvbS1zZWxlY3Rpb24udHMnO1xuaW1wb3J0IHsgdHlwZSBSb3V0ZXJBY3Rpb24sIHJlc29sdmVIb3ZlclRhcmdldCwgdXNlSW5wdXRSb3V0ZXIgfSBmcm9tICcuL2lucHV0LXJvdXRlci50c3gnO1xuaW1wb3J0IHtcbiAgTWF5YmVTZWxlY3Rpb25TZXRQcm92aWRlcixcbiAgdHlwZSBTZWxlY3Rpb24sXG4gIHVzZVNlbGVjdGlvblNldCxcbn0gZnJvbSAnLi91c2Utc2VsZWN0aW9uLXNldC50c3gnO1xuaW1wb3J0IHsgTWF5YmVUb29sUHJvdmlkZXIsIHVzZVRvb2xNb2RlIH0gZnJvbSAnLi91c2UtdG9vbC1tb2RlLnRzeCc7XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gUGhhc2UgMjQg4oCUIHRoZSBjb21tZW50LW1vZGUgY3Vyc29yIChhbmQgZXZlcnkgb3RoZXIgdG9vbCBjdXJzb3IpIGlzIG93bmVkXG4vLyBTT0xFTFkgYnkgdXNlLXRvb2wtbW9kZS50c3gsIHdob3NlIGAqIHsgY3Vyc29yOiA8S2VubmV5IGdseXBoPiAhaW1wb3J0YW50IH1gXG4vLyBydWxlIGlzIGluamVjdGVkIGJ5IHRoZSBUb29sUHJvdmlkZXIgdGhpcyBsYXllciBtb3VudHMgKE1heWJlVG9vbFByb3ZpZGVyKSDigJRcbi8vIHNvIGl0IGNvdmVycyBiYXJlIERTIHNwZWNpbWVucyB0b28uIFRoZSBvbGQgYFtkYXRhLW1jLWhvc3Rd4oCmYC9gYm9keVvigKZdYFxuLy8gY29tbWVudC1jdXJzb3IgcnVsZSB1c2VkIHRvIGxpdmUgaGVyZSwgYnV0IGl0cyBoaWdoZXIgc3BlY2lmaWNpdHkgc2hhZG93ZWRcbi8vIHRoZSB1bmlmaWVkIEtlbm5leSBjdXJzb3Igb24gVUkgY2FudmFzZXMgKGNvbW1lbnQtbW91bnQgc3RhbXBzXG4vLyBgZGF0YS1hY3RpdmUtdG9vbGAgb24gPGJvZHk+LCBzbyBgYm9keVtkYXRhLWFjdGl2ZS10b29sPVwiY29tbWVudFwiXSAqYCBtYXRjaGVkXG4vLyB0aGVyZSBhcyB3ZWxsKS4gUmVtb3ZlZCBzbyB0aGUgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCB3aW5zLiBTZWUgRERSLTA2Ny5cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBDb21tZW50SG9zdCDigJQgb3ducyB0aGUgbGl0ZSBjb21tZW50IHN1YnN5c3RlbTogdGhlIGlucHV0IHJvdXRlciAoY29tbWVudC1cbi8vIHNjb3BlZCksIHRoZSBzaW5nbGUgQ29tbWVudHNPdmVybGF5LCB0aGUgY29tbWVudC1tb2RlIGN1cnNvciBhdHRyaWJ1dGUsIGFuZFxuLy8gdGhlIHBhcmVudCBgZGduOid0b29sLXNldCdgIGxpc3RlbmVyIChzbyB0aGUgb3V0ZXIgbWVudWJhciBjb21tZW50IHRvZ2dsZVxuLy8gcmVhY2hlcyB0aGUgaWZyYW1lKS5cblxuLy8gT25seSB0aGVzZSBhY3Rpb24ga2luZHMgYXJlIGNsYWltZWQgYnkgdGhlIG1vdW50LWxheWVyIHJvdXRlcjsgdGhlIHJlc3Rcbi8vIHByb3BhZ2F0ZSB0byBhIFVJIGNhbnZhcydzIG93biByb3V0ZXIuIGB0b29sYCArIGBlc2NhcGVgIGFyZSBhbHNvIGhhbmRsZWQgYnlcbi8vIHRoZSBpbm5lciByb3V0ZXIgb24gVUkgY2FudmFzZXMg4oCUIGlkZW1wb3RlbnQgKHNhbWUgc2hhcmVkIHByb3ZpZGVyKS4gYGhvdmVyYFxuLy8gaXMgZGlzcGF0Y2hlZCB0b28gKGl0IG5ldmVyIHByZXZlbnREZWZhdWx0cywgc28gdGhlIGlubmVyIHJvdXRlcidzIG93biBob3ZlclxuLy8gaGFsbyBvbiBhIFVJIGNhbnZhcyBpcyB1bmFmZmVjdGVkKSDigJQgd2Ugb25seSBQQUlOVCB0aGUgbW91bnQtbGF5ZXIgcHJldmlld1xuLy8gaGFsbyBvbiBhIGJhcmUgc3BlY2ltZW4sIHdoZXJlIHRoZXJlIGlzIG5vIGlubmVyIENhbnZhc1NoZWxsIGhhbG8uXG5jb25zdCBDT01NRU5UX0NMQUlNUzogUmVhZG9ubHlTZXQ8Um91dGVyQWN0aW9uWydraW5kJ10+ID0gbmV3IFNldDxSb3V0ZXJBY3Rpb25bJ2tpbmQnXT4oW1xuICAnZHJvcC1jb21tZW50JyxcbiAgJ3Rvb2wnLFxuICAnZXNjYXBlJyxcbiAgJ2hvdmVyJyxcbl0pO1xuXG4vLyBUcnVlIHdoZW4gbm8gRGVzaWduQ2FudmFzL0NhbnZhc1NoZWxsIGlzIG1vdW50ZWQgb24gdGhpcyBzdXJmYWNlIOKAlCBpLmUuIGFcbi8vIGJhcmUgRFMgc3BlY2ltZW4uIE9uIGEgVUkgY2FudmFzIChgLmRjLWNhbnZhc2AgcHJlc2VudCkgdGhlIGlubmVyIHNoZWxsIG93bnNcbi8vIGhvdmVyLWhhbG8gcGFpbnRpbmcgKyBgcmVzb2x2ZUhvdmVyVGFyZ2V0YCBlbGVtZW50IGFuY2hvcmluZywgc28gdGhlIGxpdGVcbi8vIGxheWVyIGRlZmVycyB0byBpdC5cbmZ1bmN0aW9uIGlzQmFyZVNwZWNpbWVuKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiAhZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmRjLWNhbnZhcycpO1xufVxuXG4vLyBEZWVwZXN0IG5vbi1jaHJvbWUgZWxlbWVudCB1bmRlciBhIHBvaW50IOKAlCB0aGUgY29tbWVudCBhbmNob3IgZm9yIGEgYmFyZVxuLy8gc3BlY2ltZW4gKHNwZWNpbWVucyBhcmVuJ3Qgc3RhbXBlZCB3aXRoIGBkYXRhLWNkLWlkYCBhbmQgaGF2ZSBub1xuLy8gYC5kYy1hcnRib2FyZC1ib2R5YCwgc28gYHJlc29sdmVIb3ZlclRhcmdldGAgcmV0dXJucyBudWxsIGZvciB0aGVtKS5cbmZ1bmN0aW9uIHBpY2tTcGVjaW1lbkVsKGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiBudWxsO1xuICBjb25zdCBoaXQgPSBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KGNsaWVudFgsIGNsaWVudFkpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgaWYgKCFoaXQpIHJldHVybiBudWxsO1xuICAvLyBOZXZlciBhbmNob3IgdG8gY29tbWVudCBjaHJvbWUgb3IgdGhlIGRvY3VtZW50IHJvb3QuXG4gIGlmIChoaXQuY2xvc2VzdCgnLmNtLWNvbXBvc2VyLCAuY20tdGhyZWFkLCAuY20tbWVudGlvbi1wb3B1cCwgLmNtLXBpbiwgW2RhdGEtbWMtaG92ZXItaGFsb10nKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHRhZyA9IGhpdC50YWdOYW1lO1xuICBpZiAodGFnID09PSAnSFRNTCcgfHwgdGFnID09PSAnQk9EWScpIHJldHVybiBudWxsO1xuICByZXR1cm4gaGl0O1xufVxuXG5mdW5jdGlvbiBDb21tZW50SG9zdCh7IGNoaWxkcmVuLCBmaWxlIH06IHsgY2hpbGRyZW46IFJlYWN0Tm9kZTsgZmlsZTogc3RyaW5nIHwgdW5kZWZpbmVkIH0pIHtcbiAgY29uc3QgeyB0b29sLCBzZXRUb29sIH0gPSB1c2VUb29sTW9kZSgpO1xuICBjb25zdCBzZWxTZXQgPSB1c2VTZWxlY3Rpb25TZXQoKTtcbiAgY29uc3QgaG9zdFJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudCB8IG51bGw+KG51bGwpO1xuICAvLyBIb3Zlci1wcmV2aWV3IGhhbG8gdGFyZ2V0IChiYXJlIHNwZWNpbWVucyBvbmx5IOKAlCBzZWUgaXNCYXJlU3BlY2ltZW4pLlxuICBjb25zdCBbaG92ZXJFbCwgc2V0SG92ZXJFbF0gPSB1c2VTdGF0ZTxIVE1MRWxlbWVudCB8IG51bGw+KG51bGwpO1xuXG4gIC8vIExhdGVzdCB0b29sIGZvciB0aGUgcm91dGVyIChyZWFkIGF0IGV2ZW50IHRpbWUsIG5vdCBjYXB0dXJlZCkuXG4gIGNvbnN0IHRvb2xSZWYgPSB1c2VSZWYodG9vbCk7XG4gIHRvb2xSZWYuY3VycmVudCA9IHRvb2w7XG4gIGNvbnN0IGdldEFjdGl2ZVRvb2wgPSB1c2VNZW1vKCgpID0+ICgpID0+IHRvb2xSZWYuY3VycmVudCwgW10pO1xuXG4gIC8vIERyb3AgdGhlIHByZXZpZXcgaGFsbyB3aGVuZXZlciB3ZSBsZWF2ZSBjb21tZW50IG1vZGUuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHRvb2wgIT09ICdjb21tZW50Jykgc2V0SG92ZXJFbChudWxsKTtcbiAgfSwgW3Rvb2xdKTtcblxuICAvLyBSZWZsZWN0IHRoZSBhY3RpdmUgdG9vbCBvbnRvIHRoZSBob3N0IChhbmQgYm9keSwgc2luY2UgdGhlIGhvc3QgaXNcbiAgLy8gZGlzcGxheTpjb250ZW50cyBhbmQgY2FuJ3QgY2FycnkgYSBwYWludGFibGUgY3Vyc29yKS4gQ29tbWVudC1tb2RlIENTU1xuICAvLyBrZXlzIG9mZiBgW2RhdGEtYWN0aXZlLXRvb2w9XCJjb21tZW50XCJdYC5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBob3N0ID0gaG9zdFJlZi5jdXJyZW50O1xuICAgIGlmIChob3N0KSBob3N0LnNldEF0dHJpYnV0ZSgnZGF0YS1hY3RpdmUtdG9vbCcsIHRvb2wpO1xuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LmJvZHkpIHtcbiAgICAgIGRvY3VtZW50LmJvZHkuc2V0QXR0cmlidXRlKCdkYXRhLWFjdGl2ZS10b29sJywgdG9vbCk7XG4gICAgfVxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBob3N0Py5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtYWN0aXZlLXRvb2wnKTtcbiAgICB9O1xuICB9LCBbdG9vbF0pO1xuXG4gIC8vIFBhcmVudCBgZGduOid0b29sLXNldCdgIOKAlCB0aGUgb3V0ZXIgZGV2LXNlcnZlciBtZW51YmFyIHBvc3RzIHRoaXMgd2hlbiB0aGVcbiAgLy8gdXNlciB0b2dnbGVzIHRoZSBjb21tZW50IHRvb2wuIE1pcnJvcnMgY2FudmFzLXNoZWxsJ3MgbGlzdGVuZXIgc28gdGhlXG4gIC8vIHRvZ2dsZSByZWFjaGVzIGJhcmUgc3BlY2ltZW5zIHRvbyAod2hpY2ggaGF2ZSBubyBpbm5lciBzaGVsbCBsaXN0ZW5lcikuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG4gICAgY29uc3Qgb25NZXNzYWdlID0gKGU6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgICAgY29uc3QgbSA9IGUuZGF0YSBhcyB7IGRnbj86IHN0cmluZzsgdG9vbD86IHN0cmluZyB9IHwgbnVsbDtcbiAgICAgIGlmICghbSB8fCB0eXBlb2YgbSAhPT0gJ29iamVjdCcgfHwgbS5kZ24gIT09ICd0b29sLXNldCcpIHJldHVybjtcbiAgICAgIGlmICh0eXBlb2YgbS50b29sID09PSAnc3RyaW5nJykgc2V0VG9vbChtLnRvb2wgYXMgbmV2ZXIpO1xuICAgIH07XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBvbk1lc3NhZ2UpO1xuICAgIHJldHVybiAoKSA9PiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIG9uTWVzc2FnZSk7XG4gIH0sIFtzZXRUb29sXSk7XG5cbiAgdXNlSW5wdXRSb3V0ZXIoe1xuICAgIGhvc3RSZWYsXG4gICAgZ2V0QWN0aXZlVG9vbCxcbiAgICBjbGFpbWFibGVBY3Rpb25zOiBDT01NRU5UX0NMQUlNUyxcbiAgICBjYWxsYmFja3M6IHtcbiAgICAgIG9uSG92ZXI6ICh7IGNsaWVudFgsIGNsaWVudFkgfSkgPT4ge1xuICAgICAgICAvLyBQYWludCBhIHByZXZpZXcgaGFsbyBvbmx5IG9uIGJhcmUgc3BlY2ltZW5zOyBhIFVJIGNhbnZhcydzIG93blxuICAgICAgICAvLyBDYW52YXNTaGVsbCBIb3ZlckhhbG8gb3ducyB0aGUgY29tbWVudC1tb2RlIHByZXZpZXcgdGhlcmUuXG4gICAgICAgIGlmICh0b29sUmVmLmN1cnJlbnQgIT09ICdjb21tZW50JyB8fCAhaXNCYXJlU3BlY2ltZW4oKSkge1xuICAgICAgICAgIHNldEhvdmVyRWwobnVsbCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVsID0gcGlja1NwZWNpbWVuRWwoY2xpZW50WCwgY2xpZW50WSk7XG4gICAgICAgIHNldEhvdmVyRWwoKHByZXYpID0+IChwcmV2ID09PSBlbCA/IHByZXYgOiBlbCkpO1xuICAgICAgfSxcbiAgICAgIG9uVG9vbDogKHsgdG9vbDogdCB9KSA9PiBzZXRUb29sKHQpLFxuICAgICAgb25Fc2NhcGU6ICgpID0+IHtcbiAgICAgICAgaWYgKHRvb2xSZWYuY3VycmVudCAhPT0gJ21vdmUnKSBzZXRUb29sKCdtb3ZlJyk7XG4gICAgICAgIHNldEhvdmVyRWwobnVsbCk7XG4gICAgICAgIHNlbFNldC5jbGVhcigpO1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZSh7IGRnbjogJ2ZvcmNlLWNsZWFyJyB9LCAnKicpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLyogcGFyZW50IGRldGFjaGVkICovXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgb25Ecm9wQ29tbWVudDogKHsgY2xpZW50WCwgY2xpZW50WSB9KSA9PiBkcm9wQ29tbWVudChjbGllbnRYLCBjbGllbnRZLCBzZWxTZXQsIGZpbGUpLFxuICAgIH0sXG4gIH0pO1xuXG4gIC8vIGBkaXNwbGF5OiBjb250ZW50c2Aga2VlcHMgdGhlIHNwZWNpbWVuJ3Mgb3duIGZsZXgvZ3JpZCBsYXlvdXQgYnl0ZS1cbiAgLy8gaWRlbnRpY2FsIOKAlCB0aGUgaG9zdCBib3ggY29udHJpYnV0ZXMgbm90aGluZyB0byBsYXlvdXQuIFRoZSBmaXhlZC1wb3NpdGlvblxuICAvLyBDb21tZW50c092ZXJsYXkgcmVuZGVycyBmaW5lIGFzIGEgY2hpbGQgcmVnYXJkbGVzcy5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGRhdGEtbWMtaG9zdCByZWY9e2hvc3RSZWZ9IHN0eWxlPXt7IGRpc3BsYXk6ICdjb250ZW50cycgfX0+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgICB7aG92ZXJFbCA/IDxNb3VudEhvdmVySGFsbyBlbD17aG92ZXJFbH0gLz4gOiBudWxsfVxuICAgICAgPENvbW1lbnRzT3ZlcmxheSAvPlxuICAgIDwvZGl2PlxuICApO1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIE1vdW50SG92ZXJIYWxvIOKAlCBmaXhlZC1wb3NpdGlvbiBvdXRsaW5lIHRyYWNraW5nIHRoZSBob3ZlcmVkIGVsZW1lbnQncyBzY3JlZW5cbi8vIGJvdW5kcyB2aWEgckFGLiBJbmxpbmUtc3R5bGVkIChubyBkZXBlbmRlbmN5IG9uIGNhbnZhcy1saWIncyBIQUxPX0NTUywgd2hpY2hcbi8vIGEgYmFyZSBzcGVjaW1lbiBkb2Vzbid0IGxvYWQpLiBNaXJyb3JzIGNhbnZhcy1zaGVsbCdzIEhvdmVySGFsbyB2aXN1YWxseS5cblxuZnVuY3Rpb24gTW91bnRIb3ZlckhhbG8oeyBlbCB9OiB7IGVsOiBIVE1MRWxlbWVudCB9KSB7XG4gIGNvbnN0IHJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudCB8IG51bGw+KG51bGwpO1xuICBjb25zdCB0YXJnZXRSZWYgPSB1c2VSZWY8SFRNTEVsZW1lbnQ+KGVsKTtcbiAgdGFyZ2V0UmVmLmN1cnJlbnQgPSBlbDtcbiAgY29uc3QgcmFmUmVmID0gdXNlUmVmPG51bWJlciB8IG51bGw+KG51bGwpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgdGljayA9ICgpID0+IHtcbiAgICAgIHJhZlJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgIGNvbnN0IGRpdiA9IHJlZi5jdXJyZW50O1xuICAgICAgY29uc3QgdCA9IHRhcmdldFJlZi5jdXJyZW50O1xuICAgICAgaWYgKGRpdiAmJiB0Py5pc0Nvbm5lY3RlZCkge1xuICAgICAgICBjb25zdCByID0gdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgaWYgKHIud2lkdGggPT09IDAgJiYgci5oZWlnaHQgPT09IDApIHtcbiAgICAgICAgICBkaXYuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkaXYuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgZGl2LnN0eWxlLmxlZnQgPSBgJHtNYXRoLnJvdW5kKHIubGVmdCl9cHhgO1xuICAgICAgICAgIGRpdi5zdHlsZS50b3AgPSBgJHtNYXRoLnJvdW5kKHIudG9wKX1weGA7XG4gICAgICAgICAgZGl2LnN0eWxlLndpZHRoID0gYCR7TWF0aC5yb3VuZChyLndpZHRoKX1weGA7XG4gICAgICAgICAgZGl2LnN0eWxlLmhlaWdodCA9IGAke01hdGgucm91bmQoci5oZWlnaHQpfXB4YDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkaXYpIHtcbiAgICAgICAgZGl2LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9XG4gICAgICByYWZSZWYuY3VycmVudCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aWNrKTtcbiAgICB9O1xuICAgIHJhZlJlZi5jdXJyZW50ID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRpY2spO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAocmFmUmVmLmN1cnJlbnQgIT0gbnVsbCkgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmUmVmLmN1cnJlbnQpO1xuICAgIH07XG4gIH0sIFtdKTtcblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIHJlZj17cmVmfVxuICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgIGRhdGEtbWMtaG92ZXItaGFsbz1cIlwiXG4gICAgICBzdHlsZT17e1xuICAgICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgICAgZGlzcGxheTogJ25vbmUnLFxuICAgICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZScsXG4gICAgICAgIHpJbmRleDogMjE0NzQ4MzY0NixcbiAgICAgICAgYm9yZGVyOiAnMnB4IHNvbGlkIHZhcigtLW1hdWRlLWh1ZC1hY2NlbnQsICNkNjNiMWYpJyxcbiAgICAgICAgYm9yZGVyUmFkaXVzOiAnM3B4JyxcbiAgICAgICAgYm94U2l6aW5nOiAnYm9yZGVyLWJveCcsXG4gICAgICB9fVxuICAgIC8+XG4gICk7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gQ29tbWVudCBkcm9wIOKAlCBnZW5lcmljIHBhdGggbGlmdGVkIGZyb20gY2FudmFzLXNoZWxsJ3Mgb25Ecm9wQ29tbWVudC4gV29ya3Ncbi8vIHdpdGggb3Igd2l0aG91dCBhcnRib2FyZHM6IGRlZXAvc2hhbGxvdyByZXNvbHZlSG92ZXJUYXJnZXQg4oaSIGVsZW1lbnRzRnJvbVBvaW50XG4vLyBkYXRhLWNkLWlkIGNsaW1iIOKGkiBmbG9hdGluZyBmYWxsYmFjay4gRGlzcGF0Y2hlcyBgY206b3Blbi1jb21wb3NlcmAgZm9yIHRoZVxuLy8gaW4taWZyYW1lIG92ZXJsYXkgKyBwb3N0cyBgY29tbWVudC1jb21wb3NlYCB0byB0aGUgcGFyZW50IGZvciBsZWdhY3kgbW9ja3MuXG5cbmZ1bmN0aW9uIGRyb3BDb21tZW50KFxuICBjbGllbnRYOiBudW1iZXIsXG4gIGNsaWVudFk6IG51bWJlcixcbiAgc2VsU2V0OiB7IHJlcGxhY2U6IChzOiBTZWxlY3Rpb24pID0+IHZvaWQgfSxcbiAgZmlsZTogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiB2b2lkIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcbiAgbGV0IHRhcmdldCA9IHJlc29sdmVIb3ZlclRhcmdldChkb2N1bWVudCwgY2xpZW50WCwgY2xpZW50WSwgeyBkZWVwOiB0cnVlIH0pO1xuICBpZiAoIXRhcmdldCkgdGFyZ2V0ID0gcmVzb2x2ZUhvdmVyVGFyZ2V0KGRvY3VtZW50LCBjbGllbnRYLCBjbGllbnRZLCB7IGRlZXA6IGZhbHNlIH0pO1xuICAvLyBVSS1jYW52YXMgcmVjb3Zlcnkg4oCUIHdoZW4gYm90aCBwYXNzZXMgYmFpbCBvbiBhIGBwb2ludGVyLWV2ZW50czogbm9uZWBcbiAgLy8gZGVjb3JhdGlvbiwgZW51bWVyYXRlIHRoZSBzdGFjayBhbmQgY2xpbWIgdGhlIGZpcnN0IGBkYXRhLWNkLWlkYCBhbmNlc3RvclxuICAvLyBpbnNpZGUgYW4gYXJ0Ym9hcmQgYm9keS4gU2tpcHBlZCBvbiBiYXJlIHNwZWNpbWVucywgd2hpY2ggaW5zdGVhZCBhbmNob3IgdG9cbiAgLy8gdGhlIGV4YWN0IGhvdmVyZWQgZWxlbWVudCBiZWxvdyAoc28gdGhlIHBpbiBtYXRjaGVzIHRoZSBob3ZlciBwcmV2aWV3IGhhbG8pLlxuICBpZiAoIXRhcmdldCAmJiAhaXNCYXJlU3BlY2ltZW4oKSAmJiB0eXBlb2YgZG9jdW1lbnQuZWxlbWVudHNGcm9tUG9pbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zdCBzdGFjayA9IGRvY3VtZW50LmVsZW1lbnRzRnJvbVBvaW50KGNsaWVudFgsIGNsaWVudFkpO1xuICAgIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIHN0YWNrKSB7XG4gICAgICBjb25zdCBzdGFtcGVkID0gKGNhbmRpZGF0ZSBhcyBFbGVtZW50KS5jbG9zZXN0Py4oJ1tkYXRhLWNkLWlkXScpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICAgIGlmICghc3RhbXBlZCkgY29udGludWU7XG4gICAgICBpZiAoIXN0YW1wZWQuY2xvc2VzdCgnLmRjLWFydGJvYXJkLWJvZHknKSkgY29udGludWU7XG4gICAgICBjb25zdCBhcnRib2FyZEVsID0gc3RhbXBlZC5jbG9zZXN0KCdbZGF0YS1kYy1zY3JlZW5dJyk7XG4gICAgICB0YXJnZXQgPSB7XG4gICAgICAgIGVsOiBzdGFtcGVkLFxuICAgICAgICBjZElkOiBzdGFtcGVkLmdldEF0dHJpYnV0ZSgnZGF0YS1jZC1pZCcpLFxuICAgICAgICBhcnRib2FyZElkOiBhcnRib2FyZEVsPy5nZXRBdHRyaWJ1dGUoJ2RhdGEtZGMtc2NyZWVuJykgPz8gbnVsbCxcbiAgICAgIH07XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvLyBCYXJlLXNwZWNpbWVuIGFuY2hvciDigJQgc3BlY2ltZW5zIGhhdmUgbm8gYC5kYy1hcnRib2FyZC1ib2R5YCwgc29cbiAgLy8gcmVzb2x2ZUhvdmVyVGFyZ2V0IGJhaWxzLiBBbmNob3IgdG8gdGhlIEVYQUNUIGVsZW1lbnQgdW5kZXIgdGhlIGN1cnNvciAodGhlXG4gIC8vIHNhbWUgb25lIHBpY2tTcGVjaW1lbkVsIGhpZ2hsaWdodHMgZm9yIHRoZSBob3ZlciBwcmV2aWV3KSwgdmlhIGl0cyBvd25cbiAgLy8gZGF0YS1jZC1pZCB3aGVuIHN0YW1wZWQsIGVsc2UgYSBjc3NQYXRoIHNlbGVjdG9yIOKAlCBzbyB0aGUgZHJvcHBlZCBwaW4gbGFuZHNcbiAgLy8gb24gdGhlIHByZXZpZXdlZCBlbGVtZW50IGluc3RlYWQgb2YgZmxvYXRpbmcuXG4gIGlmICghdGFyZ2V0ICYmIGlzQmFyZVNwZWNpbWVuKCkpIHtcbiAgICBjb25zdCBlbCA9IHBpY2tTcGVjaW1lbkVsKGNsaWVudFgsIGNsaWVudFkpO1xuICAgIGlmIChlbCkgdGFyZ2V0ID0geyBlbCwgY2RJZDogZWwuZ2V0QXR0cmlidXRlKCdkYXRhLWNkLWlkJyksIGFydGJvYXJkSWQ6IG51bGwgfTtcbiAgfVxuXG4gIGlmICghdGFyZ2V0KSB7XG4gICAgLy8gRmxvYXRpbmcgY29tbWVudCDigJQgbm8gZWxlbWVudCBhbmNob3IsIGp1c3QgdGhlIGNsaWNrIHBvaW50IChlLmcuIGEgY2xpY2tcbiAgICAvLyBvbiBlbXB0eSBjYW52YXMvc3BlY2ltZW4gZGVhZCBzcGFjZSkuIFRoZSBvdmVybGF5IHJlbmRlcnMgYSBwaW4gYXQgdGhlXG4gICAgLy8gc3RvcmVkIGJvdW5kcy5cbiAgICBjb25zdCBmbG9hdGluZ1NlbDogU2VsZWN0aW9uID0ge1xuICAgICAgZmlsZSxcbiAgICAgIGlkOiB1bmRlZmluZWQsXG4gICAgICBzZWxlY3RvcjogJycsXG4gICAgICBhcnRib2FyZElkOiBudWxsLFxuICAgICAgdGFnOiAnJyxcbiAgICAgIGNsYXNzZXM6ICcnLFxuICAgICAgdGV4dDogJycsXG4gICAgICBkb21fcGF0aDogW10sXG4gICAgICBib3VuZHM6IHsgeDogY2xpZW50WCAtIDEyLCB5OiBjbGllbnRZIC0gMTIsIHc6IDI0LCBoOiAyNCB9LFxuICAgICAgaHRtbDogJycsXG4gICAgfTtcbiAgICBvcGVuQ29tcG9zZXIoZmxvYXRpbmdTZWwsIGNsaWVudFgsIGNsaWVudFkpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHNlbCA9IGhvdmVyVGFyZ2V0VG9TZWxlY3Rpb24odGFyZ2V0LCBmaWxlKTtcbiAgc2VsU2V0LnJlcGxhY2Uoc2VsKTtcbiAgb3BlbkNvbXBvc2VyKHNlbCwgY2xpZW50WCwgY2xpZW50WSk7XG59XG5cbmZ1bmN0aW9uIG9wZW5Db21wb3NlcihzZWxlY3Rpb246IFNlbGVjdGlvbiwgY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiB2b2lkIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB0cnkge1xuICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50KCdjbTpvcGVuLWNvbXBvc2VyJywgeyBkZXRhaWw6IHsgc2VsZWN0aW9uLCBjbGllbnRYLCBjbGllbnRZIH0gfSlcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvKiBDdXN0b21FdmVudCBhYnNlbnQg4oCUIGZhbGwgdGhyb3VnaCB0byBwYXJlbnQgcGF0aCAqL1xuICAgIH1cbiAgfVxuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB0cnkge1xuICAgICAgd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZSh7IGRnbjogJ2NvbW1lbnQtY29tcG9zZScsIHNlbGVjdGlvbiB9LCAnKicpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLyogcGFyZW50IGRldGFjaGVkICovXG4gICAgfVxuICB9XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gbW91bnRDYW52YXMg4oCUIHRoZSBzaGVsbCBoYXJuZXNzIGVudHJ5LiBSZW5kZXJzIHRoZSBjYW52YXMgd3JhcHBlZCBpbiB0aGUgbGl0ZVxuLy8gY29tbWVudCB0cmVlLCBvciBiYXJlIHdoZW4gY29tbWVudHMgYXJlIGRpc2FibGVkIChnYWxsZXJ5IHRodW1ibmFpbHMgcGFzc1xuLy8gYGNvbW1lbnRzRW5hYmxlZDogZmFsc2VgIHZpYSBgP2NvbW1lbnRzPTBgKS5cblxuZXhwb3J0IGludGVyZmFjZSBNb3VudENhbnZhc09wdGlvbnMge1xuICByb290RWw6IEhUTUxFbGVtZW50O1xuICAvKiogQ2FudmFzIGZpbGUga2V5IChkZXNpZ25SZWwtcHJlZml4ZWQpLiBEZWZhdWx0cyB0byBgZGVyaXZlRmlsZSgpYC4gKi9cbiAgZmlsZT86IHN0cmluZztcbiAgLyoqIFdoZW4gZmFsc2UsIHRoZSBjb21tZW50IGxheWVyIGlzIHNraXBwZWQg4oCUIHRoZSBjYW52YXMgcmVuZGVycyByYXcuICovXG4gIGNvbW1lbnRzRW5hYmxlZDogYm9vbGVhbjtcbn1cblxuLy8gVGhlIGxpdGUgcHJvdmlkZXIgdHJlZSB3cmFwcGluZyBhIGNhbnZhcyBjb21wb25lbnQgKHRvb2wgKyBzZWxlY3Rpb24gK1xuLy8gY29tbWVudCBsYXllcikuIFB1bGxlZCBvdXQgc28gYm90aCB0aGUgbGl2ZSByZW5kZXIgYW5kIHRoZSBlcnJvci1mYWxsYmFja1xuLy8gcmVuZGVyIGJ1aWxkIHRoZSBpZGVudGljYWwgZW52ZWxvcGUuXG4vL1xuLy8gTkI6IHRoZSBDYW52YXNBY3Rpdml0eVByb3ZpZGVyIChQaGFzZSAxMyAvIEREUi0wMjkpIGlzIE5PVCBtb3VudGVkIGhlcmUg4oCUIGl0XG4vLyBsaXZlcyBpbnNpZGUgYERlc2lnbkNhbnZhc2AgKGNhbnZhcy1saWIpLiBjb21tZW50LW1vdW50LmpzIGFuZCBjYW52YXMtbGliIGFyZVxuLy8gU0VQQVJBVEUgYnVuZGxlcywgc28gYSBjb250ZXh0IHByb3ZpZGVkIGhlcmUgd291bGQgYmUgYSBkaWZmZXJlbnQgaW5zdGFuY2Vcbi8vIGZyb20gdGhlIG9uZSBEQ0FydGJvYXJkIChjYW52YXMtbGliKSBjb25zdW1lcy4gU2FtZSByZWFzb25pbmcgdGhlIHJlYWxcbi8vIFRvb2xQcm92aWRlciBsaXZlcyBpbiBEZXNpZ25DYW52YXMsIG5vdCBpbiB0aGlzIGxheWVyJ3MgTWF5YmVUb29sUHJvdmlkZXIuXG5mdW5jdGlvbiBidWlsZENhbnZhc1RyZWUoQ2FudmFzOiBDb21wb25lbnRUeXBlLCBmaWxlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBSZWFjdE5vZGUge1xuICByZXR1cm4gY3JlYXRlRWxlbWVudChcbiAgICBNYXliZVRvb2xQcm92aWRlcixcbiAgICBudWxsLFxuICAgIGNyZWF0ZUVsZW1lbnQoXG4gICAgICBNYXliZVNlbGVjdGlvblNldFByb3ZpZGVyLFxuICAgICAgbnVsbCxcbiAgICAgIGNyZWF0ZUVsZW1lbnQoQ29tbWVudEhvc3QsIHsgZmlsZSB9LCBjcmVhdGVFbGVtZW50KENhbnZhcykpXG4gICAgKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbW91bnRDYW52YXMoQ2FudmFzOiBDb21wb25lbnRUeXBlLCBvcHRzOiBNb3VudENhbnZhc09wdGlvbnMpOiB2b2lkIHtcbiAgY29uc3Qgcm9vdCA9IGNyZWF0ZVJvb3Qob3B0cy5yb290RWwpO1xuICBpZiAoIW9wdHMuY29tbWVudHNFbmFibGVkKSB7XG4gICAgcm9vdC5yZW5kZXIoY3JlYXRlRWxlbWVudChDYW52YXMpKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgZmlsZSA9IG9wdHMuZmlsZSA/PyBkZXJpdmVGaWxlKCk7XG4gIHJvb3QucmVuZGVyKGNyZWF0ZUVsZW1lbnQoQ2FudmFzSG1yUnVudGltZSwgeyBpbml0aWFsQ2FudmFzOiBDYW52YXMsIGZpbGUgfSkpO1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFBoYXNlIDEzLjEgLyBERFItMDc3IOKAlCBITVIgZXJyb3IgcmVzaWxpZW5jZSBkdXJpbmcgYWdlbnQgZWRpdGluZy5cbi8vXG4vLyBXaGVuIGFuIGFnZW50IChgL2Rlc2lnbjplZGl0YCAvIGAvZGVzaWduOm5ld2ApIGxpdmUtZWRpdHMgYSBjYW52YXMsIGFcbi8vIGhhbGYtc2F2ZWQgZmlsZSAobWlzc2luZyBpbXBvcnQsIHVuZGVmaW5lZCBzeW1ib2wsIHRyYW5zcGlsZSBlcnJvcikgdXNlZCB0b1xuLy8gYmxhbmsgdGhlIGNhbnZhcyB0byB3aGl0ZTogdGhlIHNoZWxsIGRpZCBgbG9jYXRpb24ucmVsb2FkKClgIHN0cmFpZ2h0IGludG8gdGhlXG4vLyBicm9rZW4gbW9kdWxlLiBUaGUgc2hlbGwgbm93IHNvZnQtcmVsb2FkcyAoaW1wb3J0LWJlZm9yZS1zd2FwLCBzZWVcbi8vIGB0ZW1wbGF0ZXMvX3NoZWxsLmh0bWxgKSBzbyBhIGJ1aWxkL2ltcG9ydCBlcnJvciBuZXZlciB0ZWFycyBkb3duIHRoZSBnb29kXG4vLyByZW5kZXIuIFRoaXMgcnVudGltZSBjbG9zZXMgdGhlIHJlbWFpbmluZyBnYXAg4oCUIGEgKnJlbmRlci10aW1lKiB0aHJvdyDigJQgYnlcbi8vIGtlZXBpbmcgdGhlIGxhc3QgZ29vZCBjYW52YXMgbW91bnRlZCB2aWEgYW4gZXJyb3IgYm91bmRhcnkgYW5kIHN1cmZhY2luZyBhXG4vLyBcImhvbGRpbmcgbGFzdCBnb29kXCIgdG9hc3QgaW5zdGVhZCBvZiBhIHdoaXRlIHNjcmVlbi4gU3RyaWN0bHkgZ2F0ZWQgYnkgdGhlXG4vLyBzaGVsbCBvbiBhZ2VudC1hY3RpdmU7IG1hbnVhbCBlZGl0cyBrZWVwIHRoZSBwbGFpbiByZWxvYWQgKHNvIHRoaXMgaXMgaW5lcnRcbi8vIGZvciBzb2xvIGhhbmQtZWRpdGluZykuIFRoZSBydW50aW1lIGV4cG9zZXMgaXRzIHN3YXAvaG9sZCBBUEkgb25cbi8vIGB3aW5kb3cuX19tYXVkZUNhbnZhc1J1bnRpbWVgICh0aGUgc2FtZSB3aW5kb3ctaGFuZHNoYWtlIHN0eWxlIHRoZSBzaGVsbFxuLy8gYWxyZWFkeSB1c2VzIGZvciBgX19jYW52YXNfcmVsX19gIGV0Yy4pLlxuXG5leHBvcnQgaW50ZXJmYWNlIENhbnZhc1J1bnRpbWVBcGkge1xuICAvKiogU3dhcCBpbiBhIGZyZXNobHktaW1wb3J0ZWQgY2FudmFzIG1vZHVsZSdzIGRlZmF1bHQgZXhwb3J0IChzdWNjZXNzIHBhdGgpLiAqL1xuICByZW1vdW50OiAobmV4dDogQ29tcG9uZW50VHlwZSkgPT4gdm9pZDtcbiAgLyoqIFNob3cvaGlkZSB0aGUgXCJob2xkaW5nIGxhc3QgZ29vZFwiIHRvYXN0IChidWlsZC1lcnJvciBwYXRoIGZyb20gdGhlIHNoZWxsKS4gKi9cbiAgc2V0SG9sZGluZzogKG9uOiBib29sZWFuLCBtZXNzYWdlPzogc3RyaW5nKSA9PiB2b2lkO1xufVxuXG5jb25zdCBSVU5USU1FX0tFWSA9ICdfX21hdWRlQ2FudmFzUnVudGltZSc7XG5cbi8qKlxuICogRmlyZXMgYG9uT2tgIG9ubHkgd2hlbiBpdHMgc3VidHJlZSBDT01NSVRTIOKAlCBpLmUuIHJlbmRlcnMgd2l0aG91dCB0aHJvd2luZy4gQVxuICogcmVuZGVyLXRpbWUgdGhyb3cgaW4gdGhlIGNhbnZhcyB1bndpbmRzIHRvIHRoZSBib3VuZGFyeSBiZWZvcmUgdGhpcyBjb21taXRzLFxuICogc28gYG9uT2tgIG5ldmVyIHJ1bnMgYW5kIGBsYXN0R29vZGAgaXMgbm90IGFkdmFuY2VkIHRvIGEgYnJva2VuIG1vZHVsZS5cbiAqL1xuZnVuY3Rpb24gT2tTaWduYWwoe1xuICBDYW52YXMsXG4gIGZpbGUsXG4gIG9uT2ssXG59OiB7XG4gIENhbnZhczogQ29tcG9uZW50VHlwZTtcbiAgZmlsZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBvbk9rOiAoKSA9PiB2b2lkO1xufSkge1xuICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb3JyZWN0bmVzcy91c2VFeGhhdXN0aXZlRGVwZW5kZW5jaWVzOiBmaXJlIG9uY2UgcGVyIG1vdW50IChrZXk9YXR0ZW1wdCByZW1vdW50cyB0aGlzKS5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBvbk9rKCk7XG4gIH0sIFtdKTtcbiAgcmV0dXJuIGJ1aWxkQ2FudmFzVHJlZShDYW52YXMsIGZpbGUpO1xufVxuXG5leHBvcnQgY2xhc3MgQ2FudmFzRXJyb3JCb3VuZGFyeSBleHRlbmRzIENvbXBvbmVudDxcbiAge1xuICAgIGF0dGVtcHQ6IG51bWJlcjtcbiAgICBvbkVycm9yOiAoKSA9PiB2b2lkO1xuICAgIGZhbGxiYWNrOiAoKSA9PiBSZWFjdE5vZGU7XG4gICAgY2hpbGRyZW46IFJlYWN0Tm9kZTtcbiAgfSxcbiAgeyBoYXNFcnJvcjogYm9vbGVhbiB9XG4+IHtcbiAgc3RhdGUgPSB7IGhhc0Vycm9yOiBmYWxzZSB9O1xuICBzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKCk6IHsgaGFzRXJyb3I6IGJvb2xlYW4gfSB7XG4gICAgcmV0dXJuIHsgaGFzRXJyb3I6IHRydWUgfTtcbiAgfVxuICBjb21wb25lbnREaWRDYXRjaCgpOiB2b2lkIHtcbiAgICB0aGlzLnByb3BzLm9uRXJyb3IoKTtcbiAgfVxuICBjb21wb25lbnREaWRVcGRhdGUocHJldjogeyBhdHRlbXB0OiBudW1iZXIgfSk6IHZvaWQge1xuICAgIC8vIEEgbmV3IGNhbnZhcyAobmV3IGF0dGVtcHQpIGFycml2ZWQg4oaSIGNsZWFyIHRoZSBlcnJvciBhbmQgdHJ5IHJlbmRlcmluZyBpdC5cbiAgICBpZiAocHJldi5hdHRlbXB0ICE9PSB0aGlzLnByb3BzLmF0dGVtcHQgJiYgdGhpcy5zdGF0ZS5oYXNFcnJvcikge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IGhhc0Vycm9yOiBmYWxzZSB9KTtcbiAgICB9XG4gIH1cbiAgcmVuZGVyKCk6IFJlYWN0Tm9kZSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuaGFzRXJyb3IpIHJldHVybiB0aGlzLnByb3BzLmZhbGxiYWNrKCk7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW47XG4gIH1cbn1cblxuZnVuY3Rpb24gSG1ySG9sZGluZ1RvYXN0KHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSk6IFJlYWN0Tm9kZSB7XG4gIHJldHVybiBjcmVhdGVFbGVtZW50KFxuICAgICdkaXYnLFxuICAgIHtcbiAgICAgIGNsYXNzTmFtZTogJ2RjLWhtci1ob2xkaW5nJyxcbiAgICAgIHJvbGU6ICdzdGF0dXMnLFxuICAgICAgJ2FyaWEtbGl2ZSc6ICdwb2xpdGUnLFxuICAgICAgdGl0bGU6IG1lc3NhZ2UgPyBgSG9sZGluZyBsYXN0IHdvcmtpbmcgcmVuZGVyIOKAlCAke21lc3NhZ2V9YCA6ICdIb2xkaW5nIGxhc3Qgd29ya2luZyByZW5kZXInLFxuICAgIH0sXG4gICAgJ+KPuCBidWlsZCBlcnJvciDigJQgZHLFvsOtbSBwb3NsZWRuw60gZnVua8SNbsOtIHZlcnppJ1xuICApO1xufVxuXG5mdW5jdGlvbiBDYW52YXNIbXJSdW50aW1lKHtcbiAgaW5pdGlhbENhbnZhcyxcbiAgZmlsZSxcbn06IHtcbiAgaW5pdGlhbENhbnZhczogQ29tcG9uZW50VHlwZTtcbiAgZmlsZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufSk6IFJlYWN0Tm9kZSB7XG4gIGNvbnN0IFt7IGNhbnZhcywgYXR0ZW1wdCB9LCBzZXRDYW52YXNTdGF0ZV0gPSB1c2VTdGF0ZSh7IGNhbnZhczogaW5pdGlhbENhbnZhcywgYXR0ZW1wdDogMCB9KTtcbiAgY29uc3QgW2hvbGRpbmcsIHNldEhvbGRpbmdTdGF0ZV0gPSB1c2VTdGF0ZTx7IG9uOiBib29sZWFuOyBtZXNzYWdlPzogc3RyaW5nIH0+KHsgb246IGZhbHNlIH0pO1xuICBjb25zdCBsYXN0R29vZCA9IHVzZVJlZjxDb21wb25lbnRUeXBlIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IGNhbnZhc1JlZiA9IHVzZVJlZihjYW52YXMpO1xuICBjYW52YXNSZWYuY3VycmVudCA9IGNhbnZhcztcblxuICAvLyBQdWJsaXNoIHRoZSBydW50aW1lIEFQSSBmb3IgdGhlIHNoZWxsIEhNUiBjbGllbnQuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgYXBpOiBDYW52YXNSdW50aW1lQXBpID0ge1xuICAgICAgcmVtb3VudDogKG5leHQpID0+IHNldENhbnZhc1N0YXRlKChzKSA9PiAoeyBjYW52YXM6IG5leHQsIGF0dGVtcHQ6IHMuYXR0ZW1wdCArIDEgfSkpLFxuICAgICAgc2V0SG9sZGluZzogKG9uLCBtZXNzYWdlKSA9PiBzZXRIb2xkaW5nU3RhdGUob24gPyB7IG9uOiB0cnVlLCBtZXNzYWdlIH0gOiB7IG9uOiBmYWxzZSB9KSxcbiAgICB9O1xuICAgICh3aW5kb3cgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbUlVOVElNRV9LRVldID0gYXBpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAod2luZG93IGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW1JVTlRJTUVfS0VZXSA9IHVuZGVmaW5lZDtcbiAgICB9O1xuICB9LCBbXSk7XG5cbiAgY29uc3QgaGFuZGxlT2sgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgbGFzdEdvb2QuY3VycmVudCA9IGNhbnZhc1JlZi5jdXJyZW50O1xuICAgIC8vIFRoZSBuZXcgY2FudmFzIHJlbmRlcmVkIGNsZWFuIOKGkiBkcm9wIGFueSBob2xkaW5nIHN0YXRlLlxuICAgIHNldEhvbGRpbmdTdGF0ZSgoaCkgPT4gKGgub24gPyB7IG9uOiBmYWxzZSB9IDogaCkpO1xuICB9LCBbXSk7XG5cbiAgY29uc3QgaGFuZGxlRXJyb3IgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0SG9sZGluZ1N0YXRlKHsgb246IHRydWUsIG1lc3NhZ2U6ICdyZW5kZXIgZXJyb3InIH0pO1xuICB9LCBbXSk7XG5cbiAgY29uc3QgZmFsbGJhY2sgPSB1c2VDYWxsYmFjaygoKTogUmVhY3ROb2RlID0+IHtcbiAgICBjb25zdCBMRyA9IGxhc3RHb29kLmN1cnJlbnQ7XG4gICAgcmV0dXJuIExHID8gYnVpbGRDYW52YXNUcmVlKExHLCBmaWxlKSA6IG51bGw7XG4gIH0sIFtmaWxlXSk7XG5cbiAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoXG4gICAgRnJhZ21lbnQsXG4gICAgbnVsbCxcbiAgICBjcmVhdGVFbGVtZW50KFxuICAgICAgQ2FudmFzRXJyb3JCb3VuZGFyeSxcbiAgICAgIHsgYXR0ZW1wdCwgb25FcnJvcjogaGFuZGxlRXJyb3IsIGZhbGxiYWNrIH0sXG4gICAgICAvLyBrZXk9YXR0ZW1wdCDihpIgZWFjaCBzb2Z0LXJlbG9hZCByZW1vdW50cyBhIGZyZXNoIHN1YnRyZWUgKGFuZCByZXNldHMgdGhlXG4gICAgICAvLyBib3VuZGFyeSdzIGNoaWxkKSwgbWF0Y2hpbmcgdGhlIGNsZWFuLXNsYXRlIHNlbWFudGljcyBvZiBhIGZ1bGwgcmVsb2FkLlxuICAgICAgY3JlYXRlRWxlbWVudChPa1NpZ25hbCwgeyBrZXk6IGF0dGVtcHQsIENhbnZhczogY2FudmFzLCBmaWxlLCBvbk9rOiBoYW5kbGVPayB9KVxuICAgICksXG4gICAgaG9sZGluZy5vbiA/IGNyZWF0ZUVsZW1lbnQoSG1ySG9sZGluZ1RvYXN0LCB7IG1lc3NhZ2U6IGhvbGRpbmcubWVzc2FnZSB9KSA6IG51bGxcbiAgKTtcbn1cbiIsCiAgICAiLyoqXG4gKiBAZmlsZSAgICAgICBjb21tZW50cy1vdmVybGF5LnRzeCDigJQgRmlnSmFtLXN0eWxlIGluLXBsYWNlIGNvbW1lbnRzIG92ZXJsYXlcbiAqIEBzY29wZSAgICAgIGFwcHMvc3R1ZGlvL2NvbW1lbnRzLW92ZXJsYXkudHN4XG4gKiBAcHVycG9zZSAgICBSZW5kZXJzIERTLXN0eWxlZCBjb21tZW50IHBpbnMgKFBoYXNlIDYgVGFzayAyKSwgdGhlIGluLXBsYWNlXG4gKiAgICAgICAgICAgICBjb21wb3NlciBidWJibGUgKFRhc2sgMyksIGFuZCB0aGUgdGhyZWFkIHBvcG92ZXIgKFRhc2sgNClcbiAqICAgICAgICAgICAgIGluc2lkZSB0aGUgY2FudmFzIGlmcmFtZS4gU2libGluZyB0byBgYW5ub3RhdGlvbnMtbGF5ZXJgIOKAlFxuICogICAgICAgICAgICAgcG9ydGFscyBpbnRvIGAuZGMtd29ybGRgIHNvIENTUyB6b29tICsgdHJhbnNsYXRlIG9uIHRoZSB3b3JsZFxuICogICAgICAgICAgICAgcGxhbmUgc2NhbGUgZXZlcnkgcGluL3BvcG92ZXIgdW5pZm9ybWx5IHdpdGggdGhlIGFydGJvYXJkcy5cbiAqXG4gKiBEYXRhIGZsb3cgKFBoYXNlIDYgVGFzayAyIOKAlCBwaW5zIG9ubHk7IGNvbXBvc2VyICsgdGhyZWFkIGxhbmQgaW4gVGFzayAzLzQpOlxuICogICAxLiBTaGVsbCAoYGNsaWVudC9hcHAuanN4YCkgcHVzaGVzIGB7IGRnbjogJ2NvbW1lbnRzLXNldCcsIGNvbW1lbnRzIH1gXG4gKiAgICAgIGludG8gdGhlIGlmcmFtZSB3aGVuZXZlciBpdHMgYGNvbW1lbnRzQnlGaWxlW2FjdGl2ZVBhdGhdYCBjaGFuZ2VzLlxuICogICAyLiBPdmVybGF5IGFsc28gZmV0Y2hlcyBgL19jb21tZW50cz9maWxlPS4uLmAgb24gbW91bnQgYXMgYSBzZWxmLWhlYWwg4oCUXG4gKiAgICAgIGxldHMgdGhlIG92ZXJsYXkgcmVuZGVyIGV2ZW4gaWYgdGhlIHNoZWxsIGhhc24ndCBicm9hZGNhc3QgeWV0XG4gKiAgICAgIChyYWNlIG9uIGZpcnN0IGlmcmFtZSBsb2FkKS5cbiAqICAgMy4gU2hlbGwgcHVzaGVzIGB7IGRnbjogJ2NvbW1lbnQtZm9jdXMnLCBpZCB9YCB3aGVuIHRoZSB1c2VyIGNsaWNrcyBhIHJvd1xuICogICAgICBpbiB0aGUgY29tbWVudHMgcGFuZWwg4oCUIG92ZXJsYXkgaGlnaGxpZ2h0cyB0aGUgbWF0Y2hpbmcgcGluLlxuICogICA0LiBPdmVybGF5IHBvc3RzIGB7IGRnbjogJ2NvbW1lbnQtY2xpY2snLCBpZCB9YCBiYWNrIHRvIHRoZSBzaGVsbCB3aGVuXG4gKiAgICAgIHRoZSB1c2VyIGNsaWNrcyBhIHBpbiDigJQgc2FtZSBjaGFubmVsIHRoZSBsZWdhY3kgYGRnbi1waW5gIG92ZXJsYXlcbiAqICAgICAgdXNlZDsgdGhlIHNoZWxsIGFscmVhZHkgcm91dGVzIGl0IHRvIGBzZXRGb2N1c2VkQ29tbWVudElkYC5cbiAqXG4gKiBGaWx0ZXIgcmVzcGVjdCDigJQgUGhhc2UgNiBUYXNrIDIgZGVmYXVsdCBpcyBcImhpZGUgcmVzb2x2ZWRcIi4gVGhlIHNoZWxsIHdpbGxcbiAqIGdhaW4gYSBgY29tbWVudHMtZmlsdGVyYCBjaGFubmVsIGluIFRhc2sgNjsgdW50aWwgdGhlbiB0aGUgb3ZlcmxheSBhbHdheXNcbiAqIGhpZGVzIHJlc29sdmVkIHBpbnMuIFBsYW4tYWxpZ25lZC5cbiAqXG4gKiBQaW4gcG9zaXRpb24gbWF0aCDigJQgc2VlIGBvZmZzZXRXaXRoaW5Xb3JsZGAgYmVsb3cuIFdlIHdhbGsgb2Zmc2V0UGFyZW50IHVwXG4gKiB0byBgLmRjLXdvcmxkYCB0byBnZXQgcHJlLXpvb20gd29ybGQgY29vcmRzIGRpcmVjdGx5OyBDU1Mgem9vbSBvbiB0aGUgd29ybGRcbiAqIHBsYW5lIHRoZW4gcmVuZGVycyB0aGUgcGluIGF0IHRoZSByaWdodCBzY2FsZSB3aXRob3V0IHVzIGRvaW5nIHpvb20gbWF0aC5cbiAqXG4gKiBUaGUgbGVnYWN5IHZhbmlsbGEtSlMgYCNkZ24tcGluLWxheWVyYCBpbmplY3RlZCBieSBgaW5zcGVjdC50c2AgaXMgaGlkZGVuXG4gKiBvbiBtb3VudCB0byBhdm9pZCBkb3VibGUtcGlucyBpbnNpZGUgVFNYIGNhbnZhc2VzLiBUaGUgbGVnYWN5IGxheWVyIHN0aWxsXG4gKiByZW5kZXJzIGZvciBgLmh0bWxgIG1vY2tzIHdoZXJlIHRoaXMgUmVhY3Qgb3ZlcmxheSBuZXZlciBtb3VudHMuXG4gKi9cblxuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgdXNlQ29sbGFiIH0gZnJvbSAnLi91c2UtY29sbGFiLnRzeCc7XG5pbXBvcnQgeyB1c2VTZWxlY3Rpb25TZXRPcHRpb25hbCB9IGZyb20gJy4vdXNlLXNlbGVjdGlvbi1zZXQudHN4JztcblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBUeXBlcyDigJQga2VwdCBpbiBzeW5jIHdpdGggYENvbW1lbnRgIGluIGBhcGkudHNgLiBXZSBtaXJyb3IgdGhlIHNoYXBlIHJhdGhlclxuLy8gdGhhbiBpbXBvcnQgdG8gYXZvaWQgcHVsbGluZyBzZXJ2ZXIgdHlwZXMgaW50byB0aGUgY2FudmFzIHJ1bnRpbWUgYnVuZGxlLlxuXG5pbnRlcmZhY2UgT3ZlcmxheUJvdW5kcyB7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xuICB3OiBudW1iZXI7XG4gIGg6IG51bWJlcjtcbn1cblxuLy8gU2VsZWN0aW9uIHBheWxvYWQgcG9zdGVkIGJ5IGNhbnZhcy1zaGVsbCdzIGBvbkRyb3BDb21tZW50YC4gTWlycm9ycyB0aGVcbi8vIHNoYXBlIGBob3ZlclRhcmdldFRvU2VsZWN0aW9uYCByZXR1cm5zOyB3ZSBrZWVwIGl0IGxvb3NlIHNvIHRoZSBvdmVybGF5XG4vLyBkb2Vzbid0IGRlcGVuZCBvbiBjYW52YXMtc2hlbGwgdHlwZXMuXG5pbnRlcmZhY2UgQ29tcG9zZVNlbGVjdGlvbiB7XG4gIGZpbGU/OiBzdHJpbmc7XG4gIGlkPzogc3RyaW5nO1xuICBzZWxlY3Rvcjogc3RyaW5nO1xuICBhcnRib2FyZElkPzogc3RyaW5nIHwgbnVsbDtcbiAgdGFnOiBzdHJpbmc7XG4gIGNsYXNzZXM6IHN0cmluZztcbiAgdGV4dDogc3RyaW5nO1xuICBkb21fcGF0aDogc3RyaW5nW107XG4gIGJvdW5kczogT3ZlcmxheUJvdW5kcyB8IG51bGw7XG4gIGh0bWw6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIENvbXBvc2VyU3RhdGUge1xuICBzZWxlY3Rpb246IENvbXBvc2VTZWxlY3Rpb247XG4gIGNsaWVudFg6IG51bWJlcjtcbiAgY2xpZW50WTogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgT3ZlcmxheVJlcGx5IHtcbiAgaWQ6IHN0cmluZztcbiAgYXV0aG9yOiBzdHJpbmc7XG4gIGJvZHk6IHN0cmluZztcbiAgY3JlYXRlZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJsYXlDb21tZW50IHtcbiAgaWQ6IHN0cmluZztcbiAgZmlsZTogc3RyaW5nO1xuICBzZWxlY3Rvcjogc3RyaW5nO1xuICAvKiogT2NjdXJyZW5jZSBpbmRleCBhbW9uZyBgcXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcilgIOKAlCBkaXNhbWJpZ3VhdGVzIGFcbiAgICogY29tcG9uZW50IHJlcGVhdGVkIHdpdGhpbiBvbmUgYXJ0Ym9hcmQuIEFic2VudCAob2xkIGNvbW1lbnRzKSDihpIgZmlyc3QuICovXG4gIGluZGV4PzogbnVtYmVyO1xuICBib3VuZHM6IE92ZXJsYXlCb3VuZHMgfCBudWxsO1xuICB0ZXh0OiBzdHJpbmc7XG4gIHN0YXR1czogJ29wZW4nIHwgJ3Jlc29sdmVkJztcbiAgY3JlYXRlZDogc3RyaW5nO1xuICByZXNvbHZlZF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgYXV0aG9yPzogc3RyaW5nO1xuICB0aHJlYWQ/OiBPdmVybGF5UmVwbHlbXTtcbiAgbWVudGlvbnM/OiBzdHJpbmdbXTtcbiAgLy8gZG9tX3BhdGggLyB0YWcgLyBjbGFzc2VzIC8gaHRtbF9leGNlcnB0IHVudXNlZCBhdCBvdmVybGF5IGxheWVyOyBrZXB0IG9mZlxuICAvLyB0aGUgdHlwZSB0byBrZWVwIHRoZSBzdXJmYWNlIHRpZ2h0LlxufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIENTUyBsb2FkIOKAlCBzaWJsaW5nIHN0eWxlc2hlZXQsIGZldGNoZWQgb25jZSBwZXIgc2Vzc2lvbiB2aWEgYSA8bGluaz4gdGFnLlxuLy8gSW5saW5pbmcgdGhlIGZpbGUgYXQgYnVpbGQgdGltZSB3b3VsZCBjb3N0IGFuIGV4dHJhIGJ1bmRsZXIgY29uZmlnOyB0aGVcbi8vIG92ZXJsYXkgaXMgaW50ZXJuYWwtb25seSBzbyBhIHJ1bnRpbWUgPGxpbms+IGlzIGZpbmUuXG5cbmNvbnN0IENTU19IUkVGID0gJy9fY2xpZW50L2NvbW1lbnRzLW92ZXJsYXkuY3NzJztcblxuZnVuY3Rpb24gZW5zdXJlT3ZlcmxheVN0eWxlcygpOiB2b2lkIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcbiAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbS1vdmVybGF5LWNzcycpKSByZXR1cm47XG4gIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gIGxpbmsuaWQgPSAnY20tb3ZlcmxheS1jc3MnO1xuICBsaW5rLnJlbCA9ICdzdHlsZXNoZWV0JztcbiAgbGluay5ocmVmID0gQ1NTX0hSRUY7XG4gIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobGluayk7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gRmlsZSBkZXJpdmF0aW9uIOKAlCBzYW1lIGxvZ2ljIGFzIGNhbnZhcy1zaGVsbC50c3g6OmRlcml2ZUZpbGUoKS4gRHVwbGljYXRlZFxuLy8gaGVyZSBzbyB0aGUgb3ZlcmxheSBjYW4gZmV0Y2ggaXRzIG93biBjb21tZW50cyBvbiBtb3VudCB3aXRob3V0IGltcG9ydGluZ1xuLy8gZnJvbSBjYW52YXMtc2hlbGwgKHdoaWNoIHdvdWxkIGNyZWF0ZSBhIGN5Y2xlKS5cblxuZnVuY3Rpb24gZGVyaXZlRmlsZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm4gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCBwID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIGlmIChwID09PSAnL19jYW52YXMtc2hlbGwuaHRtbCcgfHwgcCA9PT0gJy9fY2FudmFzLXNoZWxsJykge1xuICAgICAgY29uc3QgcXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuICAgICAgY29uc3QgY2FudmFzID0gcXMuZ2V0KCdjYW52YXMnKSA/PyAnJztcbiAgICAgIGNvbnN0IGRlc2lnblJlbCA9IChxcy5nZXQoJ2Rlc2lnblJlbCcpID8/ICcuZGVzaWduJykucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgJycpO1xuICAgICAgcmV0dXJuIGNhbnZhcyA/IGAke2Rlc2lnblJlbH0vJHtjYW52YXN9YCA6IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQocCkucmVwbGFjZSgvXlxcLy8sICcnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBQb3NpdGlvbiByZXNvbHZlcnMg4oCUIHNjcmVlbiBjb29yZHMgdmlhIGdldEJvdW5kaW5nQ2xpZW50UmVjdC4gTWlycm9ycyB0aGVcbi8vIGBTZWxlY3Rpb25IYWxvc2AgLyBgSG92ZXJIYWxvYCBwYXR0ZXJuIGluIGNhbnZhcy1zaGVsbC50c3ggc28gdGhlIGNvbW1lbnRzXG4vLyBsYXllciBjYW4gcmVuZGVyIGFzIGEgZml4ZWQtcG9zaXRpb24gc2libGluZyBvZiBgLmRjLWNhbnZhc2AgKGFib3ZlIHRoZVxuLy8gaGFsbyBjaHJvbWUgYXQgei1pbmRleCA1KSBpbnN0ZWFkIG9mIGJlaW5nIHBvcnRhbGVkIGludG8gYC5kYy13b3JsZGAgd2hlcmVcbi8vIGl0IHdvdWxkIGxvc2UgdGhlIHN0YWNraW5nIGJhdHRsZS5cblxuZnVuY3Rpb24gc2NyZWVuUmVjdEZvcihcbiAgc2VsZWN0b3I6IHN0cmluZyxcbiAgaW5kZXg/OiBudW1iZXJcbik6IHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG4gIHc6IG51bWJlcjtcbiAgaDogbnVtYmVyO1xufSB8IG51bGwge1xuICBpZiAoIXNlbGVjdG9yKSByZXR1cm4gbnVsbDtcbiAgbGV0IGVsOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICB0cnkge1xuICAgIC8vIGluZGV4IGRpc2FtYmlndWF0ZXMgYSBjb21wb25lbnQgcmVwZWF0ZWQgd2l0aGluIG9uZSBhcnRib2FyZCAocXVlcnlTZWxlY3RvclxuICAgIC8vIGFsb25lIHdvdWxkIGFsd2F5cyBncmFiIHRoZSBmaXJzdCBtYXRjaCkuIEFic2VudC8wIOKGkiBmaXJzdC5cbiAgICBjb25zdCBhbGwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgICBjb25zdCBpID0gaW5kZXggJiYgaW5kZXggPiAwICYmIGluZGV4IDwgYWxsLmxlbmd0aCA/IGluZGV4IDogMDtcbiAgICBlbCA9IChhbGxbaV0gPz8gYWxsWzBdID8/IG51bGwpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKCFlbCB8fCAhZWwuaXNDb25uZWN0ZWQpIHJldHVybiBudWxsO1xuICBjb25zdCByID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIGlmIChyLndpZHRoID09PSAwICYmIHIuaGVpZ2h0ID09PSAwKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIHsgeDogci5sZWZ0LCB5OiByLnRvcCwgdzogci53aWR0aCwgaDogci5oZWlnaHQgfTtcbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBQdWJsaWMgY29tcG9uZW50IOKAlCBtb3VudGVkIGZyb20gY2FudmFzLXNoZWxsLnRzeCBhbG9uZ3NpZGUgVG9vbFBhbGV0dGUgL1xuLy8gQW5ub3RhdGlvbnNMYXllciAvIFNuYXBHdWlkZU92ZXJsYXkuXG5cbmV4cG9ydCBmdW5jdGlvbiBDb21tZW50c092ZXJsYXkoKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgZW5zdXJlT3ZlcmxheVN0eWxlcygpO1xuXG4gIC8vIE9wdGlvbmFsIOKAlCBDb21tZW50c092ZXJsYXkgaXMgbW91bnRlZCBpbnNpZGUgU2VsZWN0aW9uU2V0UHJvdmlkZXIgaW4gdGhlXG4gIC8vIHN0YW5kYXJkIENhbnZhc1NoZWxsIHRyZWUsIGJ1dCBzdGF5cyB1c2FibGUgaWYgYSBob3N0IGV2ZXIgZW1iZWRzIGl0XG4gIC8vIG91dHNpZGUgdGhhdCBwcm92aWRlciAocmV0dXJucyBudWxsIGluc3RlYWQgb2YgdGhyb3dpbmcpLlxuICBjb25zdCBzZWxTZXQgPSB1c2VTZWxlY3Rpb25TZXRPcHRpb25hbCgpO1xuICBjb25zdCBbY29tbWVudHMsIHNldENvbW1lbnRzXSA9IHVzZVN0YXRlPE92ZXJsYXlDb21tZW50W10+KFtdKTtcbiAgY29uc3QgW2ZvY3VzZWRJZCwgc2V0Rm9jdXNlZElkXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbY29tcG9zZXIsIHNldENvbXBvc2VyXSA9IHVzZVN0YXRlPENvbXBvc2VyU3RhdGUgfCBudWxsPihudWxsKTtcbiAgY29uc3QgZmlsZSA9IHVzZU1lbW8oKCkgPT4gZGVyaXZlRmlsZSgpLCBbXSk7XG5cbiAgLy8gRHJvcCB0aGUgbGVnYWN5IGAjZGduLXBpbi1sYXllcmAgc28gd2UgZG9uJ3QgcmVuZGVyIGR1cGxpY2F0ZSBwaW5zIGluc2lkZVxuICAvLyBUU1ggY2FudmFzZXMuIFRoZSBsYXllciBzaGlwcyBpbiBldmVyeSBzZXJ2ZWQgSFRNTCBwYWdlIHZpYSBpbnNwZWN0LnRzO1xuICAvLyBmb3IgYC5odG1sYCBtb2NrcyAobm8gY2FudmFzLXNoZWxsIG1vdW50KSBpdCBzdGlsbCBkb2VzIGl0cyBqb2IuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcbiAgICBjb25zdCBsZWdhY3kgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGduLXBpbi1sYXllcicpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAoIWxlZ2FjeSkgcmV0dXJuO1xuICAgIGNvbnN0IHByZXYgPSBsZWdhY3kuc3R5bGUuZGlzcGxheTtcbiAgICBsZWdhY3kuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgbGVnYWN5LnN0eWxlLmRpc3BsYXkgPSBwcmV2O1xuICAgIH07XG4gIH0sIFtdKTtcblxuICAvLyBNaXJyb3IgYSBjb21tZW50IGludG8gdGhlIGNhbnZhcyBzZWxlY3Rpb24gc2V0IHNvIFNlbGVjdGlvbkhhbG9zIHBhaW50c1xuICAvLyB0aGUgc2FtZSBoYWxvIENtZC1jbGljayB3b3VsZC4gQ2FsbGVkIGZyb20gYm90aCB0aGUgaW4taWZyYW1lIHBpbiBjbGlja1xuICAvLyBBTkQgdGhlIGluYm91bmQgYGNvbW1lbnQtZm9jdXNgIHBvc3RNZXNzYWdlIHNvIGp1bXBpbmcgZnJvbSB0aGUgc2hlbGwnc1xuICAvLyBDb21tZW50cyBwYW5lbCBwcm9kdWNlcyB0aGUgc2FtZSB2aXN1YWwgZmVlZGJhY2sgYXMgY2xpY2tpbmcgdGhlIHBpbi5cbiAgY29uc3QgbWlycm9yU2VsZWN0aW9uID0gdXNlQ2FsbGJhY2soXG4gICAgKGNvbW1lbnQ6IE92ZXJsYXlDb21tZW50IHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICBpZiAoIXNlbFNldCkgcmV0dXJuO1xuICAgICAgaWYgKCFjb21tZW50IHx8ICFjb21tZW50LnNlbGVjdG9yKSB7XG4gICAgICAgIHNlbFNldC5jbGVhcigpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBjZE1hdGNoID0gY29tbWVudC5zZWxlY3Rvci5tYXRjaCgvZGF0YS1jZC1pZD1cIihbXlwiXSspXCIvKTtcbiAgICAgIGNvbnN0IGNkSWQgPSBjZE1hdGNoID8gY2RNYXRjaFsxXSA6IHVuZGVmaW5lZDtcbiAgICAgIGxldCB0YWc6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIGxldCBjbGFzc2VzOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBlbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoY29tbWVudC5zZWxlY3RvcikgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgICAgICBpZiAoZWwpIHtcbiAgICAgICAgICB0YWcgPSBlbC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgY2xhc3NlcyA9IChlbC5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykgPz8gJycpXG4gICAgICAgICAgICAuc3BsaXQoL1xccysvKVxuICAgICAgICAgICAgLmZpbHRlcigoY2xzKSA9PiBjbHMgJiYgIWNscy5zdGFydHNXaXRoKCdkZ24tJykgJiYgIWNscy5zdGFydHNXaXRoKCdkYy1jdi0nKSlcbiAgICAgICAgICAgIC5qb2luKCcgJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvKiB1bnJlc29sdmFibGUgc2VsZWN0b3Ig4oCUIGZhbGwgdGhyb3VnaCB3aXRoIG5vIGZyZXNoIG1ldGFkYXRhICovXG4gICAgICB9XG4gICAgICBzZWxTZXQucmVwbGFjZSh7XG4gICAgICAgIGZpbGU6IGZpbGUgPz8gdW5kZWZpbmVkLFxuICAgICAgICBpZDogY2RJZCxcbiAgICAgICAgc2VsZWN0b3I6IGNvbW1lbnQuc2VsZWN0b3IsXG4gICAgICAgIHRhZyxcbiAgICAgICAgY2xhc3NlcyxcbiAgICAgICAgYm91bmRzOiBjb21tZW50LmJvdW5kcyA/PyB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICB9LFxuICAgIFtzZWxTZXQsIGZpbGVdXG4gICk7XG5cbiAgLy8gS2VlcCB0aGUgbGF0ZXN0IGNvbW1lbnRzIGxpc3QgcmVhY2hhYmxlIGZyb20gdGhlIG1lc3NhZ2UgaGFuZGxlciB3aXRob3V0XG4gIC8vIHJlLWF0dGFjaGluZyB0aGUgbGlzdGVuZXIgb24gZXZlcnkgY29tbWVudHMgbXV0YXRpb24uXG4gIGNvbnN0IGNvbW1lbnRzUmVmID0gdXNlUmVmPE92ZXJsYXlDb21tZW50W10+KGNvbW1lbnRzKTtcbiAgY29tbWVudHNSZWYuY3VycmVudCA9IGNvbW1lbnRzO1xuXG4gIC8vIFBoYXNlIDggVGFzayAzIOKAlCB3aGVuIGEgY29sbGFiIHJvb20gaXMgY29ubmVjdGVkLCB0aGUgWS5BcnJheSBvZiBjb21tZW50c1xuICAvLyBpcyB0aGUgbGl2ZSBzb3VyY2Ugb2YgdHJ1dGguIG9ic2VydmUoKSBmaXJlcyBvbiBldmVyeSByZW1vdGUgbXV0YXRpb25cbiAgLy8gKGFkZGVkIHBpbnMgZnJvbSBhbm90aGVyIHRhYiwgcmVzb2x2ZWQtZnJvbS1pbnNwZWN0b3IgdmlhIHRoZSByZWdpc3RyeVxuICAvLyBicmlkZ2UsIGV0Yy4pIGFuZCBvbiB0aGUgbG9jYWwgc2VlZC4gQm90aCBwYXRocyBjb252ZXJnZSBvbiB0aGUgc2FtZVxuICAvLyBKU09OIHByb2plY3Rpb24g4oCUIGxhc3Qtd3JpdGUtd2lucyBiZXR3ZWVuIFkuQXJyYXkgYW5kIHBvc3RNZXNzYWdlIGlzXG4gIC8vIHNhZmUgYmVjYXVzZSB0aGV5IGNhcnJ5IGlkZW50aWNhbCBjb250ZW50OyB0aGUgWS5BcnJheSBwYXRoIGp1c3RcbiAgLy8gcmVhY2hlcyB1cyBmaXJzdCAobm8gODAwIG1zIGRlYm91bmNlIGRlbGF5KS5cbiAgY29uc3QgY29sbGFiID0gdXNlQ29sbGFiKCk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFjb2xsYWIpIHJldHVybjtcbiAgICBjb25zdCBhcnIgPSBjb2xsYWIuZG9jLmdldEFycmF5PE92ZXJsYXlDb21tZW50PignY29tbWVudHMnKTtcbiAgICBjb25zdCBzeW5jID0gKCkgPT4ge1xuICAgICAgLy8gdG9BcnJheSgpIHNuYXBzaG90IHRoZSBjdXJyZW50IFkuQXJyYXkgaW50byBhIHBsYWluIEpTIGxpc3QuXG4gICAgICBzZXRDb21tZW50cyhhcnIudG9BcnJheSgpIGFzIE92ZXJsYXlDb21tZW50W10pO1xuICAgIH07XG4gICAgLy8gSW5pdGlhbCBmaWxsIOKAlCBjb3ZlcnMgdGhlIGNhc2Ugd2hlcmUgWS5Eb2Mgd2FzIGFscmVhZHkgc2VlZGVkIGJ5IHRoZVxuICAgIC8vIHRpbWUgdGhpcyBvdmVybGF5IG1vdW50ZWQuXG4gICAgaWYgKGFyci5sZW5ndGggPiAwKSBzeW5jKCk7XG4gICAgYXJyLm9ic2VydmUoc3luYyk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGFyci51bm9ic2VydmUoc3luYyk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogZG9jIGRlc3Ryb3llZCBiZWZvcmUgdW5tb3VudCDigJQgb2JzZXJ2ZXIgYWxyZWFkeSBnb25lICovXG4gICAgICB9XG4gICAgfTtcbiAgfSwgW2NvbGxhYl0pO1xuXG4gIC8vIExpc3RlbiBmb3IgdGhlIHNoZWxsJ3MgYnJvYWRjYXN0IGNoYW5uZWxzLiBTY2hlbWEgbWF0Y2hlcyB0aGUgbGVnYWN5XG4gIC8vIG92ZXJsYXkgc28gdGhlIHNoZWxsLXNpZGUgZ2x1ZSBpbiBjbGllbnQvYXBwLmpzeCAofmxpbmUgMTY3Mikga2VlcHNcbiAgLy8gd29ya2luZyB3aXRob3V0IG1vZGlmaWNhdGlvbi5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcbiAgICBjb25zdCBvbk1lc3NhZ2UgPSAoZTogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBtID0gZS5kYXRhIGFzIHsgZGduPzogc3RyaW5nOyBjb21tZW50cz86IHVua25vd247IGlkPzogc3RyaW5nIH0gfCBudWxsO1xuICAgICAgaWYgKCFtIHx8IHR5cGVvZiBtICE9PSAnb2JqZWN0JyB8fCAhbS5kZ24pIHJldHVybjtcbiAgICAgIGlmIChtLmRnbiA9PT0gJ2NvbW1lbnRzLXNldCcgJiYgQXJyYXkuaXNBcnJheShtLmNvbW1lbnRzKSkge1xuICAgICAgICBzZXRDb21tZW50cyhtLmNvbW1lbnRzIGFzIE92ZXJsYXlDb21tZW50W10pO1xuICAgICAgfSBlbHNlIGlmIChtLmRnbiA9PT0gJ2NvbW1lbnQtZm9jdXMnKSB7XG4gICAgICAgIGNvbnN0IGlkID0gdHlwZW9mIG0uaWQgPT09ICdzdHJpbmcnID8gbS5pZCA6IG51bGw7XG4gICAgICAgIHNldEZvY3VzZWRJZChpZCk7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGlkID8gY29tbWVudHNSZWYuY3VycmVudC5maW5kKChjKSA9PiBjLmlkID09PSBpZCkgOiB1bmRlZmluZWQ7XG4gICAgICAgIG1pcnJvclNlbGVjdGlvbih0YXJnZXQpO1xuICAgICAgfVxuICAgIH07XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBvbk1lc3NhZ2UpO1xuICAgIHJldHVybiAoKSA9PiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIG9uTWVzc2FnZSk7XG4gIH0sIFttaXJyb3JTZWxlY3Rpb25dKTtcblxuICAvLyBjYW52YXMtc2hlbGwncyBgb25Ecm9wQ29tbWVudGAgZGlzcGF0Y2hlcyBgY206b3Blbi1jb21wb3NlcmAgb24gdGhlIGlmcmFtZVxuICAvLyBkb2N1bWVudC4gT3BlbiB0aGUgY29tcG9zZXIgcGlubmVkIHRvIHRoYXQgY2xpY2sgcG9pbnQuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcbiAgICBjb25zdCBvbk9wZW4gPSAoZTogRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGRldGFpbCA9IChcbiAgICAgICAgZSBhcyBDdXN0b21FdmVudDx7IHNlbGVjdGlvbj86IENvbXBvc2VTZWxlY3Rpb247IGNsaWVudFg/OiBudW1iZXI7IGNsaWVudFk/OiBudW1iZXIgfT5cbiAgICAgICkuZGV0YWlsO1xuICAgICAgaWYgKCFkZXRhaWwgfHwgIWRldGFpbC5zZWxlY3Rpb24pIHJldHVybjtcbiAgICAgIHNldENvbXBvc2VyKHtcbiAgICAgICAgc2VsZWN0aW9uOiBkZXRhaWwuc2VsZWN0aW9uLFxuICAgICAgICBjbGllbnRYOiB0eXBlb2YgZGV0YWlsLmNsaWVudFggPT09ICdudW1iZXInID8gZGV0YWlsLmNsaWVudFggOiAwLFxuICAgICAgICBjbGllbnRZOiB0eXBlb2YgZGV0YWlsLmNsaWVudFkgPT09ICdudW1iZXInID8gZGV0YWlsLmNsaWVudFkgOiAwLFxuICAgICAgfSk7XG4gICAgfTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbTpvcGVuLWNvbXBvc2VyJywgb25PcGVuKTtcbiAgICByZXR1cm4gKCkgPT4gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY206b3Blbi1jb21wb3NlcicsIG9uT3Blbik7XG4gIH0sIFtdKTtcblxuICBjb25zdCBjbG9zZUNvbXBvc2VyID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldENvbXBvc2VyKG51bGwpO1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKHsgZGduOiAnZm9yY2UtY2xlYXInIH0sICcqJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvKiBwYXJlbnQgZGV0YWNoZWQgKi9cbiAgICB9XG4gIH0sIFtdKTtcblxuICBjb25zdCBzdWJtaXRDb21wb3NlciA9IHVzZUNhbGxiYWNrKFxuICAgICh0ZXh0OiBzdHJpbmcpID0+IHtcbiAgICAgIGlmICghY29tcG9zZXIpIHJldHVybjtcbiAgICAgIGNvbnN0IHNlbCA9IGNvbXBvc2VyLnNlbGVjdGlvbjtcbiAgICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICAgIGZpbGU6IHNlbC5maWxlLFxuICAgICAgICBzZWxlY3Rvcjogc2VsLnNlbGVjdG9yLFxuICAgICAgICBpbmRleDogc2VsLmluZGV4LFxuICAgICAgICBkb21fcGF0aDogc2VsLmRvbV9wYXRoLFxuICAgICAgICB0YWc6IHNlbC50YWcsXG4gICAgICAgIGNsYXNzZXM6IHNlbC5jbGFzc2VzLFxuICAgICAgICBib3VuZHM6IHNlbC5ib3VuZHMsXG4gICAgICAgIGh0bWxfZXhjZXJwdDogc2VsLmh0bWwsXG4gICAgICAgIHRleHQsXG4gICAgICB9O1xuICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG4gICAgICAvLyBTaGVsbCByZWxheXMgaW50byB0aGUgV1MgYGNvbW1lbnRzLWFkZGAgY2hhbm5lbCBhbmQgcGVyc2lzdHMuXG4gICAgICB0cnkge1xuICAgICAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKHsgZGduOiAnY29tbWVudC1zdWJtaXQnLCBwYXlsb2FkIH0sICcqJyk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogcGFyZW50IGRldGFjaGVkICovXG4gICAgICB9XG4gICAgICBjbG9zZUNvbXBvc2VyKCk7XG4gICAgfSxcbiAgICBbY29tcG9zZXIsIGNsb3NlQ29tcG9zZXJdXG4gICk7XG5cbiAgLy8gU2VsZi1oZWFsIGZldGNoIOKAlCBjb3ZlcnMgdGhlIHJhY2Ugd2hlcmUgdGhlIGlmcmFtZSBsb2FkcyBiZWZvcmUgdGhlIHNoZWxsXG4gIC8vIHB1c2hlcyBgY29tbWVudHMtc2V0YCAoZS5nLiBmaXJzdCBoeWRyYXRpb24gb24gY29sZCBvcGVuKS5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWZpbGUpIHJldHVybjtcbiAgICBsZXQgY2FuY2VsbGVkID0gZmFsc2U7XG4gICAgKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCBmZXRjaChgL19jb21tZW50cz9maWxlPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGZpbGUpfWApO1xuICAgICAgICBpZiAoIXIub2spIHJldHVybjtcbiAgICAgICAgY29uc3QgZGF0YSA9IChhd2FpdCByLmpzb24oKSkgYXMgeyBjb21tZW50cz86IE92ZXJsYXlDb21tZW50W10gfTtcbiAgICAgICAgaWYgKGNhbmNlbGxlZCkgcmV0dXJuO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhLmNvbW1lbnRzKSkge1xuICAgICAgICAgIC8vIE9ubHkgc2V0IHdoZW4gd2UgaGF2ZW4ndCByZWNlaXZlZCBhIHNoZWxsIGJyb2FkY2FzdCB5ZXQ7IHRoZVxuICAgICAgICAgIC8vIHNoZWxsIGlzIGF1dGhvcml0YXRpdmUgb25jZSBpdCBraWNrcyBpbi5cbiAgICAgICAgICBzZXRDb21tZW50cygocHJldikgPT4gKHByZXYubGVuZ3RoID09PSAwID8gKGRhdGEuY29tbWVudHMgPz8gW10pIDogcHJldikpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogb2ZmbGluZSAvIGRldi1zZXJ2ZXIgcmVzdGFydCDigJQgc2lsZW50bHkgbm8tb3AgKi9cbiAgICAgIH1cbiAgICB9KSgpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjYW5jZWxsZWQgPSB0cnVlO1xuICAgIH07XG4gIH0sIFtmaWxlXSk7XG5cbiAgLy8gU29ydGVkIGJ5IGBjcmVhdGVkYCBhc2Mgc28gc2VxdWVuY2UgbnVtYmVycyBhcmUgc3RhYmxlIHBlciBjYW52YXMgYWNyb3NzXG4gIC8vIHJlbG9hZHMuIFJlc29sdmVkIGNvbW1lbnRzIGFyZSBoaWRkZW4gYnkgZGVmYXVsdCAoVGFzayAyIHNwZWMpLlxuICBjb25zdCB2aXNpYmxlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgbGlzdCA9IGNvbW1lbnRzLnNsaWNlKCkuc29ydCgoYSwgYikgPT4gYS5jcmVhdGVkLmxvY2FsZUNvbXBhcmUoYi5jcmVhdGVkKSk7XG4gICAgcmV0dXJuIGxpc3QuZmlsdGVyKChjKSA9PiBjLnN0YXR1cyAhPT0gJ3Jlc29sdmVkJyk7XG4gIH0sIFtjb21tZW50c10pO1xuXG4gIC8vIFNlcXVlbmNlIGluZGV4IGxvb2t1cCDigJQgYnVpbHQgb2ZmIHRoZSBGVUxMIHNvcnRlZCBsaXN0IHNvIGEgcmVzb2x2ZWQtdGhlbi1cbiAgLy8gcmVvcGVuZWQgcGluIGtlZXBzIGl0cyBvcmlnaW5hbCBudW1iZXIuXG4gIGNvbnN0IGluZGV4QnlJZCA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IG0gPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIGNvbnN0IGFsbCA9IGNvbW1lbnRzLnNsaWNlKCkuc29ydCgoYSwgYikgPT4gYS5jcmVhdGVkLmxvY2FsZUNvbXBhcmUoYi5jcmVhdGVkKSk7XG4gICAgYWxsLmZvckVhY2goKGMsIGkpID0+IG0uc2V0KGMuaWQsIGkgKyAxKSk7XG4gICAgcmV0dXJuIG07XG4gIH0sIFtjb21tZW50c10pO1xuXG4gIGNvbnN0IGhhbmRsZVBpbkNsaWNrID0gdXNlQ2FsbGJhY2soXG4gICAgKGlkOiBzdHJpbmcpID0+IHtcbiAgICAgIHNldEZvY3VzZWRJZChpZCk7XG4gICAgICBtaXJyb3JTZWxlY3Rpb24oY29tbWVudHMuZmluZCgoYykgPT4gYy5pZCA9PT0gaWQpKTtcbiAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykgcmV0dXJuO1xuICAgICAgdHJ5IHtcbiAgICAgICAgd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZSh7IGRnbjogJ2NvbW1lbnQtY2xpY2snLCBpZCB9LCAnKicpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8qIHBhcmVudCBkZXRhY2hlZCAqL1xuICAgICAgfVxuICAgIH0sXG4gICAgW2NvbW1lbnRzLCBtaXJyb3JTZWxlY3Rpb25dXG4gICk7XG5cbiAgY29uc3QgaGFuZGxlUGF0Y2ggPSB1c2VDYWxsYmFjaygoaWQ6IHN0cmluZywgcGF0Y2g6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UoeyBkZ246ICdjb21tZW50LXBhdGNoJywgaWQsIHBhdGNoIH0sICcqJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvKiBwYXJlbnQgZGV0YWNoZWQgKi9cbiAgICB9XG4gIH0sIFtdKTtcblxuICBjb25zdCBoYW5kbGVEZWxldGUgPSB1c2VDYWxsYmFjaygoaWQ6IHN0cmluZykgPT4ge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKHsgZGduOiAnY29tbWVudC1kZWxldGUnLCBpZCB9LCAnKicpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLyogcGFyZW50IGRldGFjaGVkICovXG4gICAgfVxuICAgIHNldEZvY3VzZWRJZCgocHJldikgPT4gKHByZXYgPT09IGlkID8gbnVsbCA6IHByZXYpKTtcbiAgfSwgW10pO1xuXG4gIGNvbnN0IGhhbmRsZVJlcGx5ID0gdXNlQ2FsbGJhY2soYXN5bmMgKGlkOiBzdHJpbmcsIGJvZHk6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgIGlmICh0eXBlb2YgZmV0Y2ggPT09ICd1bmRlZmluZWQnKSByZXR1cm4gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHIgPSBhd2FpdCBmZXRjaChgL19hcGkvY29tbWVudHMvJHtlbmNvZGVVUklDb21wb25lbnQoaWQpfS9yZXBseWAsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGJvZHkgfSksXG4gICAgICB9KTtcbiAgICAgIGlmICghci5vaykgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgdXBkYXRlZCA9IChhd2FpdCByLmpzb24oKSkgYXMgT3ZlcmxheUNvbW1lbnQ7XG4gICAgICAvLyBPcHRpbWlzdGljIGxvY2FsIG1lcmdlIOKAlCB0aGUgc2hlbGwgd2lsbCBicm9hZGNhc3QgYGNvbW1lbnRzLXNldGBcbiAgICAgIC8vIHNob3J0bHkgYWZ0ZXIgYXMgdGhlIFdTIGZhbnMgb3V0IHRoZSBjaGFuZ2UsIGJ1dCBhcHBseWluZyBpdCBub3dcbiAgICAgIC8vIGF2b2lkcyB0aGUgcG9wb3ZlciBmbGlja2VyaW5nIGVtcHR5IGJldHdlZW4gc3VibWl0ICsgYnJvYWRjYXN0LlxuICAgICAgc2V0Q29tbWVudHMoKHByZXYpID0+IHByZXYubWFwKChjKSA9PiAoYy5pZCA9PT0gdXBkYXRlZC5pZCA/IHVwZGF0ZWQgOiBjKSkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LCBbXSk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImNtLWxheWVyXCIgYXJpYS1oaWRkZW49e2ZhbHNlfT5cbiAgICAgIHt2aXNpYmxlLm1hcCgoYykgPT4ge1xuICAgICAgICBjb25zdCBuID0gaW5kZXhCeUlkLmdldChjLmlkKSA/PyAwO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxDb21tZW50UGluXG4gICAgICAgICAgICBrZXk9e2MuaWR9XG4gICAgICAgICAgICBjb21tZW50PXtjfVxuICAgICAgICAgICAgc2VxdWVuY2U9e259XG4gICAgICAgICAgICBmb2N1c2VkPXtmb2N1c2VkSWQgPT09IGMuaWR9XG4gICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVQaW5DbGlja31cbiAgICAgICAgICAvPlxuICAgICAgICApO1xuICAgICAgfSl9XG4gICAgICB7Y29tcG9zZXIgPyAoXG4gICAgICAgIDxDb21tZW50Q29tcG9zZXIgc3RhdGU9e2NvbXBvc2VyfSBvblN1Ym1pdD17c3VibWl0Q29tcG9zZXJ9IG9uQ2FuY2VsPXtjbG9zZUNvbXBvc2VyfSAvPlxuICAgICAgKSA6IG51bGx9XG4gICAgICB7KCgpID0+IHtcbiAgICAgICAgaWYgKCFmb2N1c2VkSWQpIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBmb2N1c2VkID0gdmlzaWJsZS5maW5kKChjKSA9PiBjLmlkID09PSBmb2N1c2VkSWQpO1xuICAgICAgICBpZiAoIWZvY3VzZWQpIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxDb21tZW50VGhyZWFkXG4gICAgICAgICAgICBjb21tZW50PXtmb2N1c2VkfVxuICAgICAgICAgICAgc2VxdWVuY2U9e2luZGV4QnlJZC5nZXQoZm9jdXNlZC5pZCkgPz8gMH1cbiAgICAgICAgICAgIG9uQ2xvc2U9eygpID0+IHtcbiAgICAgICAgICAgICAgc2V0Rm9jdXNlZElkKG51bGwpO1xuICAgICAgICAgICAgICAvLyBEcm9wIHRoZSBjYW52YXMgaGFsbyB3aGVuIHRoZSB0aHJlYWQgY2xvc2VzIOKAlCBzeW1tZXRyaWMgd2l0aFxuICAgICAgICAgICAgICAvLyBgaGFuZGxlUGluQ2xpY2tgIHdoaWNoIHBhaW50cyBpdCBvbiBvcGVuLlxuICAgICAgICAgICAgICBzZWxTZXQ/LmNsZWFyKCk7XG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgb25QYXRjaD17KHBhdGNoKSA9PiBoYW5kbGVQYXRjaChmb2N1c2VkLmlkLCBwYXRjaCl9XG4gICAgICAgICAgICBvbkRlbGV0ZT17KCkgPT4gaGFuZGxlRGVsZXRlKGZvY3VzZWQuaWQpfVxuICAgICAgICAgICAgb25SZXBseT17KGJvZHkpID0+IGhhbmRsZVJlcGx5KGZvY3VzZWQuaWQsIGJvZHkpfVxuICAgICAgICAgIC8+XG4gICAgICAgICk7XG4gICAgICB9KSgpfVxuICAgIDwvZGl2PlxuICApO1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIE1lbnRpb25Bd2FyZVRleHRhcmVhICsgcG9wdXAg4oCUIFRhc2sgNVxuLy9cbi8vIFdyYXBzIGEgdGV4dGFyZWEgYW5kIHN1cmZhY2VzIGFuIGF1dG9jb21wbGV0ZSBwb3B1cCB3aGVuIHRoZSBjYXJldCBzaXRzXG4vLyBpbnNpZGUgYW4gYEA8cXVlcnk+YCB0b2tlbiAobm8gd2hpdGVzcGFjZSBiZXR3ZWVuIGBAYCBhbmQgY3Vyc29yKS4gVGhlXG4vLyBjb21taXR0ZXIgbGlzdCBpcyBmZXRjaGVkIG9uY2Ugb24gZmlyc3QgZm9jdXMgYW5kIGNhY2hlZCBmb3IgdGhlIHNlc3Npb24uXG4vLyBLZXlib2FyZDog4oaR4oaTIG1vdmUsIOKGtS9UYWIgaW5zZXJ0IChgQGZpcnN0bmFtZSBgKSwgRXNjIGRpc21pc3MuXG5cbmludGVyZmFjZSBDb21taXR0ZXJSb3cge1xuICBuYW1lOiBzdHJpbmc7XG4gIGVtYWlsOiBzdHJpbmc7XG4gIGNvbW1pdHM6IG51bWJlcjtcbn1cblxubGV0IGNvbW1pdHRlckNhY2hlOiBQcm9taXNlPENvbW1pdHRlclJvd1tdPiB8IG51bGwgPSBudWxsO1xuYXN5bmMgZnVuY3Rpb24gbG9hZENvbW1pdHRlcnMoKTogUHJvbWlzZTxDb21taXR0ZXJSb3dbXT4ge1xuICBpZiAoIWNvbW1pdHRlckNhY2hlKSB7XG4gICAgY29tbWl0dGVyQ2FjaGUgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IGZldGNoKCcvX2FwaS9naXQtY29tbWl0dGVycycpO1xuICAgICAgICBpZiAoIXIub2spIHJldHVybiBbXTtcbiAgICAgICAgY29uc3QgZGF0YSA9IChhd2FpdCByLmpzb24oKSkgYXMgeyBjb21taXR0ZXJzPzogQ29tbWl0dGVyUm93W10gfTtcbiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZGF0YS5jb21taXR0ZXJzKSA/IGRhdGEuY29tbWl0dGVycyA6IFtdO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICB9KSgpO1xuICB9XG4gIHJldHVybiBjb21taXR0ZXJDYWNoZTtcbn1cblxuZnVuY3Rpb24gZmlyc3ROYW1lU2x1ZyhuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBgQGZpcnN0bmFtZWAgaXMgd2hhdCB3ZSBpbnNlcnQgb24gYWNjZXB0LiBTdHJpcCBzdXJuYW1lcyArIHB1bmN0dWF0aW9uLlxuICBjb25zdCBmaXJzdCA9IG5hbWUudHJpbSgpLnNwbGl0KC9cXHMrLylbMF0gPz8gJyc7XG4gIC8vIEtlZXAgYWxwaGFudW0gKyBgLmAgYC1gIGBfYCAobWF0Y2hlcyB0aGUgcGFyc2VNZW50aW9ucyByZWdleCBvbiB0aGUgc2VydmVyKS5cbiAgcmV0dXJuIGZpcnN0LnJlcGxhY2UoL1teXFx3Li1dL2csICcnKS50b0xvd2VyQ2FzZSgpO1xufVxuXG5pbnRlcmZhY2UgTWVudGlvblRva2VuIHtcbiAgc3RhcnQ6IG51bWJlcjsgLy8gaW5kZXggb2YgYEBgXG4gIGVuZDogbnVtYmVyOyAvLyBleGNsdXNpdmUg4oCUIGN1cnJlbnQgY2FyZXRcbiAgcXVlcnk6IHN0cmluZzsgLy8gY2hhcnMgYmV0d2VlbiBgQGAgYW5kIGNhcmV0IChleGNsdWRpbmcgYEBgKVxufVxuXG5mdW5jdGlvbiBkZXRlY3RNZW50aW9uVG9rZW4odGV4dDogc3RyaW5nLCBjYXJldDogbnVtYmVyKTogTWVudGlvblRva2VuIHwgbnVsbCB7XG4gIGlmIChjYXJldCA8PSAwIHx8IGNhcmV0ID4gdGV4dC5sZW5ndGgpIHJldHVybiBudWxsO1xuICAvLyBXYWxrIGJhY2t3YXJkcyBmcm9tIGNhcmV0OyB0aGUgdG9rZW4gc3RhcnRzIGF0IGBAYCBhbmQgZW5kcyBhdCB0aGUgY2FyZXQuXG4gIC8vIEFib3J0cyBvbiB3aGl0ZXNwYWNlLCBuZXdsaW5lLCBvciBhbnkgbm9uLW1lbnRpb24gY2hhciBzbyBhIHN0cmF5IGBAYCBpblxuICAvLyBhbiBlbWFpbCBpcyBpZ25vcmVkLlxuICBsZXQgaSA9IGNhcmV0IC0gMTtcbiAgd2hpbGUgKGkgPj0gMCkge1xuICAgIGNvbnN0IGNoID0gdGV4dFtpXSA/PyAnJztcbiAgICBpZiAoY2ggPT09ICdAJykge1xuICAgICAgLy8gVG9rZW4gbXVzdCBiZSB3b3JkLWxlYWRpbmc6IHByZXZpb3VzIGNoYXIgaXMgc3RhcnQtb2Ytc3RyaW5nIG9yIHdoaXRlc3BhY2UuXG4gICAgICBjb25zdCBwcmV2ID0gaSA+IDAgPyB0ZXh0W2kgLSAxXSA6ICcnO1xuICAgICAgaWYgKGkgPT09IDAgfHwgL1xccy8udGVzdChwcmV2ID8/ICcnKSkge1xuICAgICAgICBjb25zdCBxdWVyeSA9IHRleHQuc2xpY2UoaSArIDEsIGNhcmV0KTtcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IGksIGVuZDogY2FyZXQsIHF1ZXJ5IH07XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKCEvW1xcdy4tXS8udGVzdChjaCkpIHJldHVybiBudWxsO1xuICAgIGkgLT0gMTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gTWVudGlvbkF3YXJlVGV4dGFyZWEoe1xuICBjbGFzc05hbWUsXG4gIHZhbHVlLFxuICBvbkNoYW5nZSxcbiAgb25LZXlEb3duLFxuICBwbGFjZWhvbGRlcixcbiAgcm93cyxcbiAgZGlzYWJsZWQsXG4gIHRleHRhcmVhUmVmLFxuICBhcmlhTGFiZWwsXG59OiB7XG4gIGNsYXNzTmFtZTogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xuICBvbkNoYW5nZTogKG5leHQ6IHN0cmluZykgPT4gdm9pZDtcbiAgb25LZXlEb3duPzogKGU6IFJlYWN0LktleWJvYXJkRXZlbnQ8SFRNTFRleHRBcmVhRWxlbWVudD4pID0+IHZvaWQ7XG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICByb3dzPzogbnVtYmVyO1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG4gIHRleHRhcmVhUmVmPzogUmVhY3QuTXV0YWJsZVJlZk9iamVjdDxIVE1MVGV4dEFyZWFFbGVtZW50IHwgbnVsbD47XG4gIGFyaWFMYWJlbD86IHN0cmluZztcbn0pOiBSZWFjdC5SZWFjdEVsZW1lbnQge1xuICBjb25zdCBpbnRlcm5hbFJlZiA9IHVzZVJlZjxIVE1MVGV4dEFyZWFFbGVtZW50IHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IHNldFJlZiA9IHVzZUNhbGxiYWNrKFxuICAgIChlbDogSFRNTFRleHRBcmVhRWxlbWVudCB8IG51bGwpID0+IHtcbiAgICAgIGludGVybmFsUmVmLmN1cnJlbnQgPSBlbDtcbiAgICAgIGlmICh0ZXh0YXJlYVJlZikgdGV4dGFyZWFSZWYuY3VycmVudCA9IGVsO1xuICAgIH0sXG4gICAgW3RleHRhcmVhUmVmXVxuICApO1xuXG4gIGNvbnN0IFtjb21taXR0ZXJzLCBzZXRDb21taXR0ZXJzXSA9IHVzZVN0YXRlPENvbW1pdHRlclJvd1tdPihbXSk7XG4gIGNvbnN0IFt0b2tlbiwgc2V0VG9rZW5dID0gdXNlU3RhdGU8TWVudGlvblRva2VuIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtoaWdobGlnaHQsIHNldEhpZ2hsaWdodF0gPSB1c2VTdGF0ZSgwKTtcblxuICAvLyBMYXp5LWxvYWQgY29tbWl0dGVycyBvbiBmaXJzdCBmb2N1cy5cbiAgY29uc3Qgb25Gb2N1cyA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBpZiAoY29tbWl0dGVycy5sZW5ndGggPiAwKSByZXR1cm47XG4gICAgdm9pZCBsb2FkQ29tbWl0dGVycygpLnRoZW4oKGxpc3QpID0+IHNldENvbW1pdHRlcnMobGlzdCkpO1xuICB9LCBbY29tbWl0dGVycy5sZW5ndGhdKTtcblxuICBjb25zdCBmaWx0ZXJlZCA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmICghdG9rZW4pIHJldHVybiBbXSBhcyBDb21taXR0ZXJSb3dbXTtcbiAgICBjb25zdCBxID0gdG9rZW4ucXVlcnkudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBsaXN0ID0gIXFcbiAgICAgID8gY29tbWl0dGVyc1xuICAgICAgOiBjb21taXR0ZXJzLmZpbHRlcihcbiAgICAgICAgICAoYykgPT4gYy5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkgfHwgYy5lbWFpbC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpXG4gICAgICAgICk7XG4gICAgcmV0dXJuIGxpc3Quc2xpY2UoMCwgOCk7XG4gIH0sIFt0b2tlbiwgY29tbWl0dGVyc10pO1xuXG4gIGNvbnN0IHJlZnJlc2hUb2tlbiA9IHVzZUNhbGxiYWNrKCh0ZXh0YXJlYTogSFRNTFRleHRBcmVhRWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IGNhcmV0ID0gdGV4dGFyZWEuc2VsZWN0aW9uU3RhcnQgPz8gdGV4dGFyZWEudmFsdWUubGVuZ3RoO1xuICAgIGNvbnN0IHQgPSBkZXRlY3RNZW50aW9uVG9rZW4odGV4dGFyZWEudmFsdWUsIGNhcmV0KTtcbiAgICBzZXRUb2tlbih0KTtcbiAgICBzZXRIaWdobGlnaHQoMCk7XG4gIH0sIFtdKTtcblxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAoZTogUmVhY3QuQ2hhbmdlRXZlbnQ8SFRNTFRleHRBcmVhRWxlbWVudD4pID0+IHtcbiAgICAgIG9uQ2hhbmdlKGUudGFyZ2V0LnZhbHVlKTtcbiAgICAgIHJlZnJlc2hUb2tlbihlLnRhcmdldCk7XG4gICAgfSxcbiAgICBbb25DaGFuZ2UsIHJlZnJlc2hUb2tlbl1cbiAgKTtcblxuICBjb25zdCBpbnNlcnRNZW50aW9uID0gdXNlQ2FsbGJhY2soXG4gICAgKGNvbW1pdHRlcjogQ29tbWl0dGVyUm93KSA9PiB7XG4gICAgICBpZiAoIXRva2VuKSByZXR1cm47XG4gICAgICBjb25zdCB0YSA9IGludGVybmFsUmVmLmN1cnJlbnQ7XG4gICAgICBpZiAoIXRhKSByZXR1cm47XG4gICAgICBjb25zdCB0YWcgPSBgQCR7Zmlyc3ROYW1lU2x1Zyhjb21taXR0ZXIubmFtZSl9YDtcbiAgICAgIGNvbnN0IG5leHQgPSBgJHt2YWx1ZS5zbGljZSgwLCB0b2tlbi5zdGFydCl9JHt0YWd9ICR7dmFsdWUuc2xpY2UodG9rZW4uZW5kKX1gO1xuICAgICAgb25DaGFuZ2UobmV4dCk7XG4gICAgICBzZXRUb2tlbihudWxsKTtcbiAgICAgIC8vIFJlc3RvcmUgY2FyZXQganVzdCBwYXN0IHRoZSBpbnNlcnRlZCB0b2tlbiArIHRyYWlsaW5nIHNwYWNlLlxuICAgICAgY29uc3QgbmV3Q2FyZXQgPSB0b2tlbi5zdGFydCArIHRhZy5sZW5ndGggKyAxO1xuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgdGEuZm9jdXMoKTtcbiAgICAgICAgdGEuc2V0U2VsZWN0aW9uUmFuZ2UobmV3Q2FyZXQsIG5ld0NhcmV0KTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgW3Rva2VuLCB2YWx1ZSwgb25DaGFuZ2VdXG4gICk7XG5cbiAgY29uc3QgaGFuZGxlS2V5RG93biA9IHVzZUNhbGxiYWNrKFxuICAgIChlOiBSZWFjdC5LZXlib2FyZEV2ZW50PEhUTUxUZXh0QXJlYUVsZW1lbnQ+KSA9PiB7XG4gICAgICBpZiAodG9rZW4gJiYgZmlsdGVyZWQubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAoZS5rZXkgPT09ICdBcnJvd0Rvd24nKSB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHNldEhpZ2hsaWdodCgoaCkgPT4gKGggKyAxKSAlIGZpbHRlcmVkLmxlbmd0aCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlLmtleSA9PT0gJ0Fycm93VXAnKSB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHNldEhpZ2hsaWdodCgoaCkgPT4gKGggLSAxICsgZmlsdGVyZWQubGVuZ3RoKSAlIGZpbHRlcmVkLmxlbmd0aCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJyB8fCBlLmtleSA9PT0gJ1RhYicpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgY29uc3QgcGljayA9IGZpbHRlcmVkW2hpZ2hsaWdodF0gPz8gZmlsdGVyZWRbMF07XG4gICAgICAgICAgaWYgKHBpY2spIGluc2VydE1lbnRpb24ocGljayk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgc2V0VG9rZW4obnVsbCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBvbktleURvd24/LihlKTtcbiAgICB9LFxuICAgIFt0b2tlbiwgZmlsdGVyZWQsIGhpZ2hsaWdodCwgaW5zZXJ0TWVudGlvbiwgb25LZXlEb3duXVxuICApO1xuXG4gIGNvbnN0IGhhbmRsZVNlbGVjdCA9IHVzZUNhbGxiYWNrKFxuICAgIChlOiBSZWFjdC5TeW50aGV0aWNFdmVudDxIVE1MVGV4dEFyZWFFbGVtZW50PikgPT4ge1xuICAgICAgcmVmcmVzaFRva2VuKGUuY3VycmVudFRhcmdldCk7XG4gICAgfSxcbiAgICBbcmVmcmVzaFRva2VuXVxuICApO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiBzdHlsZT17eyBwb3NpdGlvbjogJ3JlbGF0aXZlJyB9fT5cbiAgICAgIDx0ZXh0YXJlYVxuICAgICAgICByZWY9e3NldFJlZn1cbiAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWV9XG4gICAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgICByb3dzPXtyb3dzfVxuICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICAgIGFyaWEtbGFiZWw9e2FyaWFMYWJlbH1cbiAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoYW5nZX1cbiAgICAgICAgb25LZXlEb3duPXtoYW5kbGVLZXlEb3dufVxuICAgICAgICBvbkZvY3VzPXtvbkZvY3VzfVxuICAgICAgICBvblNlbGVjdD17aGFuZGxlU2VsZWN0fVxuICAgICAgICBvbkNsaWNrPXtoYW5kbGVTZWxlY3R9XG4gICAgICAvPlxuICAgICAgey8qIENvbWJvYm94IHBhdHRlcm4g4oCUIGByb2xlPVwibGlzdGJveFwiYCArIGByb2xlPVwib3B0aW9uXCJgIGlzIHRoZSBjYW5vbmljYWxcbiAgICAgICAqIEFSSUEgc2hhcGUgZm9yIGEgc2luZ2xlLXNlbGVjdCBhdXRvY29tcGxldGUuIEtleWJvYXJkIG5hdmlnYXRpb25cbiAgICAgICAqICjihpEg4oaTIEVudGVyIEVzYykgbGl2ZXMgb24gdGhlIHBhcmVudCB0ZXh0YXJlYSBwZXIgdGhlIGNvbWJvYm94IHNwZWMsXG4gICAgICAgKiBzbyB0aGUgcG9wdXAgaXRzZWxmIHN0YXlzIGluZXJ0LiBTYW1lIHBhdHRlcm4gYXBwbGllcyB0byB0aGUgY29tcG9zZXJcbiAgICAgICAqICsgdGhyZWFkIHBvcG92ZXJzIGJlbG93IChgcm9sZT1cImRpYWxvZ1wiYCBvbiBhIHBvc2l0aW9uZWQgPGRpdj4pLlxuICAgICAgICogQmlvbWUncyBhMTF5IHJ1bGVzIHdhbnQgc2VtYW50aWMgSFRNTCBwcmltaXRpdmVzLCBidXQgbm9uZSBtYXRjaFxuICAgICAgICogXCJub24tZm9jdXNhYmxlIGxpc3Rib3ggdW5kZXIgYSB0ZXh0YXJlYVwiIG9yIFwiYW5jaG9yZWQgbm9uLW1vZGFsIHBvcG92ZXJcIi5cbiAgICAgICAqIFRoZSBmb3VyIGFmZmVjdGVkIHJ1bGVzIGFyZSBzY29wZWQgb2ZmIGZvciB0aGlzIGZpbGUgaW4gYmlvbWUuanNvbi4gKi99XG4gICAgICB7dG9rZW4gJiYgZmlsdGVyZWQubGVuZ3RoID4gMCA/IChcbiAgICAgICAgPHVsXG4gICAgICAgICAgY2xhc3NOYW1lPVwiY20tbWVudGlvbi1wb3B1cFwiXG4gICAgICAgICAgcm9sZT1cImxpc3Rib3hcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJNZW50aW9uIHN1Z2dlc3Rpb25zXCJcbiAgICAgICAgICBzdHlsZT17eyBsZWZ0OiAwLCB0b3A6ICcxMDAlJyB9fVxuICAgICAgICA+XG4gICAgICAgICAge2ZpbHRlcmVkLm1hcCgoYywgaSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBpID09PSBoaWdobGlnaHQ7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgICBrZXk9e2Ake2MubmFtZX0tJHtjLmVtYWlsfWB9XG4gICAgICAgICAgICAgICAgcm9sZT1cIm9wdGlvblwiXG4gICAgICAgICAgICAgICAgYXJpYS1zZWxlY3RlZD17c2VsZWN0ZWR9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiY20tbWVudGlvbi1wb3B1cF9faXRlbVwiXG4gICAgICAgICAgICAgICAgb25Nb3VzZUVudGVyPXsoKSA9PiBzZXRIaWdobGlnaHQoaSl9XG4gICAgICAgICAgICAgICAgLy8gVXNlIG1vdXNlZG93biBzbyB0aGUgdGV4dGFyZWEgZG9lc24ndCBibHVyIGJlZm9yZSB0aGVcbiAgICAgICAgICAgICAgICAvLyBzZWxlY3Rpb24gcmVnaXN0ZXJzLlxuICAgICAgICAgICAgICAgIG9uTW91c2VEb3duPXsoZXYpID0+IHtcbiAgICAgICAgICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICBpbnNlcnRNZW50aW9uKGMpO1xuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJjbS1tZW50aW9uLXBvcHVwX19uYW1lXCI+QHtmaXJzdE5hbWVTbHVnKGMubmFtZSl9PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImNtLW1lbnRpb24tcG9wdXBfX2VtYWlsXCI+e2MuZW1haWx9PC9zcGFuPlxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KX1cbiAgICAgICAgPC91bD5cbiAgICAgICkgOiBudWxsfVxuICAgIDwvZGl2PlxuICApO1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIENvbW1lbnRQaW4g4oCUIHNpbmdsZSAyNMOXMjQgYmFkZ2UgYW5jaG9yZWQgdG8gdG9wLXJpZ2h0IG9mIGl0cyB0YXJnZXQgZWxlbWVudC5cbi8vIFJlc29sdmVzIHRhcmdldCBvbiBldmVyeSBhbmltYXRpb24gZnJhbWUgdG8gdHJhY2sgbGF5b3V0IHNoaWZ0cyAoZHJhZyxcbi8vIHJlZmxvdywgZm9udCBsb2FkKS4gRmFsbHMgYmFjayB0byB0aGUgc3RvcmVkIGBib3VuZHNgIHdoZW4gdGhlIHRhcmdldCBpc1xuLy8gZ29uZSBmcm9tIHRoZSBET00uXG5cbmZ1bmN0aW9uIENvbW1lbnRQaW4oe1xuICBjb21tZW50LFxuICBzZXF1ZW5jZSxcbiAgZm9jdXNlZCxcbiAgb25DbGljayxcbn06IHtcbiAgY29tbWVudDogT3ZlcmxheUNvbW1lbnQ7XG4gIHNlcXVlbmNlOiBudW1iZXI7XG4gIGZvY3VzZWQ6IGJvb2xlYW47XG4gIG9uQ2xpY2s6IChpZDogc3RyaW5nKSA9PiB2b2lkO1xufSkge1xuICBjb25zdCByZWYgPSB1c2VSZWY8SFRNTEJ1dHRvbkVsZW1lbnQgfCBudWxsPihudWxsKTtcbiAgY29uc3QgcmFmUmVmID0gdXNlUmVmPG51bWJlciB8IG51bGw+KG51bGwpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgdGljayA9ICgpID0+IHtcbiAgICAgIHJhZlJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgIGNvbnN0IHBpbiA9IHJlZi5jdXJyZW50O1xuICAgICAgaWYgKCFwaW4pIHJldHVybjtcblxuICAgICAgLy8gTGl2ZSBzY3JlZW4tY29vcmQgbG9va3VwIG1pcnJvcnMgU2VsZWN0aW9uSGFsb3MgaW4gY2FudmFzLXNoZWxsLnRzeC5cbiAgICAgIC8vIEZhbGxzIGJhY2sgdG8gc3RvcmVkIGJvdW5kcyAoYSBzY3JlZW4tY29vcmQgY2FwdHVyZSBhdCBjcmVhdGUgdGltZSlcbiAgICAgIC8vIHdoZW4gdGhlIHRhcmdldCBlbGVtZW50IGlzIGdvbmUg4oCUIGJldHRlciB0aGFuIHZhbmlzaGluZyBlbnRpcmVseS5cbiAgICAgIGxldCBwb3MgPSBzY3JlZW5SZWN0Rm9yKGNvbW1lbnQuc2VsZWN0b3IsIGNvbW1lbnQuaW5kZXgpO1xuICAgICAgaWYgKCFwb3MgJiYgY29tbWVudC5ib3VuZHMpIHtcbiAgICAgICAgcG9zID0ge1xuICAgICAgICAgIHg6IGNvbW1lbnQuYm91bmRzLngsXG4gICAgICAgICAgeTogY29tbWVudC5ib3VuZHMueSxcbiAgICAgICAgICB3OiBjb21tZW50LmJvdW5kcy53LFxuICAgICAgICAgIGg6IGNvbW1lbnQuYm91bmRzLmgsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoIXBvcykge1xuICAgICAgICBwaW4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgcmFmUmVmLmN1cnJlbnQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGljayk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHBpbi5zdHlsZS5kaXNwbGF5ID0gJ2dyaWQnO1xuICAgICAgLy8gUG9zaXRpb24gdGhlIHBpbidzIGNlbnRlciBhdCAocmlnaHQgLSAxMiwgdG9wIC0gMTIpIOKAlCB0aGUgRmlnSmFtXG4gICAgICAvLyBjb252ZW50aW9uLiAxMiA9IGhhbGYgb2YgMjQgKHRoZSBwaW4ncyBvd24gc2l6ZSkuXG4gICAgICBjb25zdCBsZWZ0ID0gTWF0aC5yb3VuZChwb3MueCArIHBvcy53IC0gMTIpO1xuICAgICAgY29uc3QgdG9wID0gTWF0aC5yb3VuZChwb3MueSAtIDEyKTtcbiAgICAgIHBpbi5zdHlsZS5sZWZ0ID0gYCR7bGVmdH1weGA7XG4gICAgICBwaW4uc3R5bGUudG9wID0gYCR7dG9wfXB4YDtcbiAgICAgIHJhZlJlZi5jdXJyZW50ID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRpY2spO1xuICAgIH07XG4gICAgcmFmUmVmLmN1cnJlbnQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGljayk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlmIChyYWZSZWYuY3VycmVudCAhPSBudWxsKSBjYW5jZWxBbmltYXRpb25GcmFtZShyYWZSZWYuY3VycmVudCk7XG4gICAgfTtcbiAgfSwgW2NvbW1lbnQuc2VsZWN0b3IsIGNvbW1lbnQuYm91bmRzXSk7XG5cbiAgY29uc3QgYXV0aG9yID0gY29tbWVudC5hdXRob3I/LnRyaW0oKSB8fCAndW5rbm93bic7XG4gIGNvbnN0IGxhYmVsID0gYENvbW1lbnQgJHtzZXF1ZW5jZX0gYnkgJHthdXRob3J9YDtcblxuICByZXR1cm4gKFxuICAgIDxidXR0b25cbiAgICAgIHJlZj17cmVmfVxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBjbGFzc05hbWU9XCJjbS1waW5cIlxuICAgICAgZGF0YS1yZXNvbHZlZD17Y29tbWVudC5zdGF0dXMgPT09ICdyZXNvbHZlZCcgPyAndHJ1ZScgOiAnZmFsc2UnfVxuICAgICAgZGF0YS1mb2N1c2VkPXtmb2N1c2VkID8gJ3RydWUnIDogJ2ZhbHNlJ31cbiAgICAgIGRhdGEtY29tbWVudC1waW49e2NvbW1lbnQuaWR9XG4gICAgICBhcmlhLWxhYmVsPXtsYWJlbH1cbiAgICAgIGFyaWEtZXhwYW5kZWQ9e2ZvY3VzZWR9XG4gICAgICB0aXRsZT17Y29tbWVudC50ZXh0LnNsaWNlKDAsIDIwMCl9XG4gICAgICBvbkNsaWNrPXsoZSkgPT4ge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIG9uQ2xpY2soY29tbWVudC5pZCk7XG4gICAgICB9fVxuICAgID5cbiAgICAgIHtzZXF1ZW5jZX1cbiAgICA8L2J1dHRvbj5cbiAgKTtcbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBDb21tZW50Q29tcG9zZXIg4oCUIERTLXN0eWxlZCBjYXJkIGFuY2hvcmVkIGp1c3QgdW5kZXIgdGhlIGNsaWNrZWQgZWxlbWVudFxuLy8gKG9yIGF0IHRoZSBjbGljayBwb2ludCBpZiB0aGUgY2xpY2sgaGl0IGVtcHR5IGNhbnZhcykuIEVkZ2UtY2xhbXAgaXMgdGhlXG4vLyBwcmFnbWF0aWMga2luZDogcG9zaXRpb24gaXMgY29tcHV0ZWQgb25jZSBvbiBvcGVuIGFnYWluc3QgdGhlIHdvcmxkIGxheW91dCxcbi8vIG5vdCBjaGFzZWQgb24gcGFuL3pvb20g4oCUIHRoZSB1c2VyIGlzIGFjdGl2ZWx5IHR5cGluZy5cblxuZnVuY3Rpb24gQ29tbWVudENvbXBvc2VyKHtcbiAgc3RhdGUsXG4gIG9uU3VibWl0LFxuICBvbkNhbmNlbCxcbn06IHtcbiAgc3RhdGU6IENvbXBvc2VyU3RhdGU7XG4gIG9uU3VibWl0OiAodGV4dDogc3RyaW5nKSA9PiB2b2lkO1xuICBvbkNhbmNlbDogKCkgPT4gdm9pZDtcbn0pIHtcbiAgY29uc3QgW3RleHQsIHNldFRleHRdID0gdXNlU3RhdGUoJycpO1xuICBjb25zdCB0ZXh0YXJlYVJlZiA9IHVzZVJlZjxIVE1MVGV4dEFyZWFFbGVtZW50IHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IGNhcmRSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQgfCBudWxsPihudWxsKTtcbiAgY29uc3QgcmFmUmVmID0gdXNlUmVmPG51bWJlciB8IG51bGw+KG51bGwpO1xuXG4gIC8vIExpdmUgYW5jaG9yIOKAlCBjb21wb3NlciB0cmFja3MgdGhlIHRhcmdldCBlbGVtZW50IHZpYSByQUYgc28gcGFuL3pvb21cbiAgLy8gd2hpbGUgdHlwaW5nIGtlZXBzIHRoZSBjYXJkIGdsdWVkIHRvIGl0cyBhbmNob3IuIFdyaXRlcyBkaXJlY3RseSB0byB0aGVcbiAgLy8gRE9NIHNvIHdlIGRvbid0IHJlLXJlbmRlciBldmVyeSBmcmFtZS5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCB0aWNrID0gKCkgPT4ge1xuICAgICAgcmFmUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgY29uc3Qgbm9kZSA9IGNhcmRSZWYuY3VycmVudDtcbiAgICAgIGlmICghbm9kZSkgcmV0dXJuO1xuICAgICAgY29uc3QgYW5jaG9yID0gY29tcHV0ZUFuY2hvcihzdGF0ZSk7XG4gICAgICBub2RlLnN0eWxlLmxlZnQgPSBgJHtNYXRoLnJvdW5kKGFuY2hvci54KX1weGA7XG4gICAgICBub2RlLnN0eWxlLnRvcCA9IGAke01hdGgucm91bmQoYW5jaG9yLnkpfXB4YDtcbiAgICAgIHJhZlJlZi5jdXJyZW50ID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRpY2spO1xuICAgIH07XG4gICAgcmFmUmVmLmN1cnJlbnQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGljayk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlmIChyYWZSZWYuY3VycmVudCAhPSBudWxsKSBjYW5jZWxBbmltYXRpb25GcmFtZShyYWZSZWYuY3VycmVudCk7XG4gICAgfTtcbiAgfSwgW3N0YXRlXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICB0ZXh0YXJlYVJlZi5jdXJyZW50Py5mb2N1cygpO1xuICB9LCBbXSk7XG5cbiAgY29uc3QgdHJ5U3VibWl0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGNvbnN0IHYgPSB0ZXh0LnRyaW0oKTtcbiAgICBpZiAoIXYpIHJldHVybjtcbiAgICBvblN1Ym1pdCh2KTtcbiAgfSwgW3RleHQsIG9uU3VibWl0XSk7XG5cbiAgY29uc3Qgb25LZXlEb3duID0gdXNlQ2FsbGJhY2soXG4gICAgKGU6IFJlYWN0LktleWJvYXJkRXZlbnQ8SFRNTFRleHRBcmVhRWxlbWVudD4pID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBvbkNhbmNlbCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoKGUubWV0YUtleSB8fCBlLmN0cmxLZXkpICYmIGUua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdHJ5U3VibWl0KCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbb25DYW5jZWwsIHRyeVN1Ym1pdF1cbiAgKTtcblxuICAvLyBDb21wYWN0IHNlbGVjdG9yIGhpbnQg4oCUIHN0cmlwIG5vaXN5IHN0cnVjdHVyYWwgYml0cyBzbyB0aGUgaGVhZCBzdGF5c1xuICAvLyB0aWdodCBpbnNpZGUgdGhlIDMwMHB4IGNhcmQuXG4gIGNvbnN0IHNlbGVjdG9yQ2hpcCA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IHMgPSBzdGF0ZS5zZWxlY3Rpb24uc2VsZWN0b3IgfHwgJyc7XG4gICAgaWYgKCFzKSByZXR1cm4gc3RhdGUuc2VsZWN0aW9uLnRhZyB8fCAnY2FudmFzJztcbiAgICAvLyBbZGF0YS1jZC1pZD1cIuKAplwiXSDihpIgY2Q6PGlkPiDCtyBrZWVwcyB0aGUgY2hpcCByZWFkYWJsZSB3aGVuIHN0YWJsZSBpZHNcbiAgICAvLyBhcmUgcHJlc2VudC5cbiAgICBjb25zdCBjZCA9IHMubWF0Y2goL2RhdGEtY2QtaWQ9XCIoW15cIl0rKVwiLyk7XG4gICAgaWYgKGNkKSByZXR1cm4gYGNkOiR7Y2RbMV19YDtcbiAgICByZXR1cm4gcy5sZW5ndGggPiAzNiA/IGAke3Muc2xpY2UoMCwgMzMpfeKApmAgOiBzO1xuICB9LCBbc3RhdGUuc2VsZWN0aW9uXSk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICByZWY9e2NhcmRSZWZ9XG4gICAgICBjbGFzc05hbWU9XCJjbS1jb21wb3NlclwiXG4gICAgICByb2xlPVwiZGlhbG9nXCJcbiAgICAgIGFyaWEtbGFiZWw9XCJOZXcgY29tbWVudFwiXG4gICAgICBvbkNsaWNrPXsoZSkgPT4gZS5zdG9wUHJvcGFnYXRpb24oKX1cbiAgICAgIG9uUG9pbnRlckRvd249eyhlKSA9PiBlLnN0b3BQcm9wYWdhdGlvbigpfVxuICAgID5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY20tY29tcG9zZXJfX2hlYWRcIj5cbiAgICAgICAgPHNwYW4+TmV3IGNvbW1lbnQ8L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImNtLWNvbXBvc2VyX19zZWxlY3RvclwiPntzZWxlY3RvckNoaXB9PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8TWVudGlvbkF3YXJlVGV4dGFyZWFcbiAgICAgICAgdGV4dGFyZWFSZWY9e3RleHRhcmVhUmVmfVxuICAgICAgICBjbGFzc05hbWU9XCJjbS1jb21wb3Nlcl9fdGV4dGFyZWFcIlxuICAgICAgICB2YWx1ZT17dGV4dH1cbiAgICAgICAgcGxhY2Vob2xkZXI9XCJUeXBlIGEgY29tbWVudC4g4oyY4oa1IHRvIHNhdmUgwrcgRXNjIHRvIGNhbmNlbCDCtyBAbmFtZSB0byB0YWdcIlxuICAgICAgICBvbkNoYW5nZT17c2V0VGV4dH1cbiAgICAgICAgb25LZXlEb3duPXtvbktleURvd259XG4gICAgICAgIHJvd3M9ezN9XG4gICAgICAgIGFyaWFMYWJlbD1cIkNvbW1lbnQgYm9keVwiXG4gICAgICAvPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJjbS1jb21wb3Nlcl9fYWN0aW9uc1wiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzc05hbWU9XCJjbS1idG5cIiBvbkNsaWNrPXtvbkNhbmNlbH0+XG4gICAgICAgICAgQ2FuY2VsXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3NOYW1lPVwiY20tYnRuIGNtLWJ0bi0tcHJpbWFyeVwiXG4gICAgICAgICAgZGlzYWJsZWQ9eyF0ZXh0LnRyaW0oKX1cbiAgICAgICAgICBvbkNsaWNrPXt0cnlTdWJtaXR9XG4gICAgICAgID5cbiAgICAgICAgICBTYXZlXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gQ29tbWVudFRocmVhZCDigJQgcG9wb3ZlciBhbmNob3JlZCB0byB0aGUgZm9jdXNlZCBwaW4uIFNob3dzIGF1dGhvciArIHJlbGF0aXZlXG4vLyB0aW1lICsgc2VsZWN0b3IgY2hpcCwgdGhlIG9yaWdpbmFsIGJvZHkgd2l0aCBAbWVudGlvbnMgYm9sZGVkLCByZXBsaWVzLCBhXG4vLyByZXBseSB0ZXh0YXJlYSwgYW5kIHJlc29sdmUvcmVvcGVuL2RlbGV0ZSBhY3Rpb25zLiBQYXRjaGVzICsgZGVsZXRlcyByb3V0ZVxuLy8gdGhyb3VnaCB0aGUgc2hlbGwncyBleGlzdGluZyBXUyBjaGFubmVsIHZpYSBwb3N0TWVzc2FnZTsgcmVwbGllcyBQT1NUXG4vLyBkaXJlY3RseSB0byBgL19hcGkvY29tbWVudHMvPGlkPi9yZXBseWAgYmVjYXVzZSB0aGF0IGVuZHBvaW50IGV4aXN0cyBvbmx5IG9uXG4vLyBCdW4gcnVudGltZSBhbmQgbGl2ZXMgaW4gYGh0dHAudHNgLlxuXG5mdW5jdGlvbiBDb21tZW50VGhyZWFkKHtcbiAgY29tbWVudCxcbiAgc2VxdWVuY2UsXG4gIG9uQ2xvc2UsXG4gIG9uUGF0Y2gsXG4gIG9uRGVsZXRlLFxuICBvblJlcGx5LFxufToge1xuICBjb21tZW50OiBPdmVybGF5Q29tbWVudDtcbiAgc2VxdWVuY2U6IG51bWJlcjtcbiAgb25DbG9zZTogKCkgPT4gdm9pZDtcbiAgb25QYXRjaDogKHBhdGNoOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gdm9pZDtcbiAgb25EZWxldGU6ICgpID0+IHZvaWQ7XG4gIG9uUmVwbHk6IChib2R5OiBzdHJpbmcpID0+IFByb21pc2U8Ym9vbGVhbj47XG59KSB7XG4gIGNvbnN0IGRpYWxvZ1JlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudCB8IG51bGw+KG51bGwpO1xuICBjb25zdCByZXBseVJlZiA9IHVzZVJlZjxIVE1MVGV4dEFyZWFFbGVtZW50IHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IHJhZlJlZiA9IHVzZVJlZjxudW1iZXIgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW3JlcGx5LCBzZXRSZXBseV0gPSB1c2VTdGF0ZSgnJyk7XG4gIGNvbnN0IFtzZW5kaW5nLCBzZXRTZW5kaW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICAvLyBMaXZlIGFuY2hvciDigJQgcG9wb3ZlciB0cmFja3MgdGhlIHBpbiB2aWEgckFGIHNvIGl0IHN0YXlzIGdsdWVkIHRvIGl0c1xuICAvLyB0YXJnZXQgdGhyb3VnaCBwYW4gLyB6b29tIChGaWdKYW0gcGFyaXR5KS4gV3JpdGluZyB0byB0aGUgZGlhbG9nIHN0eWxlXG4gIC8vIGRpcmVjdGx5IGF2b2lkcyByZS1yZW5kZXJpbmcgZXZlcnkgZnJhbWUuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgdGljayA9ICgpID0+IHtcbiAgICAgIHJhZlJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgIGNvbnN0IG5vZGUgPSBkaWFsb2dSZWYuY3VycmVudDtcbiAgICAgIGlmICghbm9kZSkgcmV0dXJuO1xuICAgICAgY29uc3QgYW5jaG9yID0gY29tcHV0ZVRocmVhZEFuY2hvcihjb21tZW50KTtcbiAgICAgIG5vZGUuc3R5bGUubGVmdCA9IGAke01hdGgucm91bmQoYW5jaG9yLngpfXB4YDtcbiAgICAgIG5vZGUuc3R5bGUudG9wID0gYCR7TWF0aC5yb3VuZChhbmNob3IueSl9cHhgO1xuICAgICAgcmFmUmVmLmN1cnJlbnQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGljayk7XG4gICAgfTtcbiAgICByYWZSZWYuY3VycmVudCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aWNrKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaWYgKHJhZlJlZi5jdXJyZW50ICE9IG51bGwpIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHJhZlJlZi5jdXJyZW50KTtcbiAgICB9O1xuICB9LCBbY29tbWVudF0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgLy8gTW92ZSBmb2N1cyBpbnRvIHRoZSBkaWFsb2cgb24gb3Blbi4gUGVyIFdDQUcgMi4xIHRoZSBkaWFsb2cgc2hvdWxkIG93blxuICAgIC8vIGluaXRpYWwgZm9jdXM7IHdlIHB1dCBpdCBvbiB0aGUgZGlhbG9nIHJvb3QgKGZvY3VzYWJsZSB2aWEgdGFiaW5kZXgpXG4gICAgLy8gc28gc2NyZWVuIHJlYWRlcnMgYW5ub3VuY2UgdGhlIGhlYWRlciBiZWZvcmUgdGhlIGJvZHkuIE9uIGNsb3NlLFxuICAgIC8vIHJldHVybiBmb2N1cyB0byB0aGUgcGluIHNvIGtleWJvYXJkIHVzZXJzIGxhbmQgd2hlcmUgdGhleSBzdGFydGVkLlxuICAgIGRpYWxvZ1JlZi5jdXJyZW50Py5mb2N1cygpO1xuICAgIGNvbnN0IHBpbklkID0gY29tbWVudC5pZDtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY29uc3QgcGluID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MQnV0dG9uRWxlbWVudD4oYFtkYXRhLWNvbW1lbnQtcGluPVwiJHtwaW5JZH1cIl1gKTtcbiAgICAgIHBpbj8uZm9jdXMoKTtcbiAgICB9O1xuICB9LCBbY29tbWVudC5pZF0pO1xuXG4gIC8vIEVzYy10by1jbG9zZSB3aGlsZSBmb2N1cyBpcyBhbnl3aGVyZSBpbnNpZGUgdGhlIHBvcG92ZXIuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcbiAgICBjb25zdCBvbktleSA9IChlOiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICBpZiAoZS5rZXkgIT09ICdFc2NhcGUnKSByZXR1cm47XG4gICAgICBjb25zdCByb290ID0gZGlhbG9nUmVmLmN1cnJlbnQ7XG4gICAgICBpZiAoIXJvb3QpIHJldHVybjtcbiAgICAgIGlmIChyb290LmNvbnRhaW5zKGUudGFyZ2V0IGFzIE5vZGUpIHx8IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHJvb3QpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBvbkNsb3NlKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25LZXkpO1xuICAgIHJldHVybiAoKSA9PiBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25LZXkpO1xuICB9LCBbb25DbG9zZV0pO1xuXG4gIGNvbnN0IHRyeVNlbmRSZXBseSA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB2ID0gcmVwbHkudHJpbSgpO1xuICAgIGlmICghdiB8fCBzZW5kaW5nKSByZXR1cm47XG4gICAgc2V0U2VuZGluZyh0cnVlKTtcbiAgICBjb25zdCBvayA9IGF3YWl0IG9uUmVwbHkodik7XG4gICAgc2V0U2VuZGluZyhmYWxzZSk7XG4gICAgaWYgKG9rKSB7XG4gICAgICBzZXRSZXBseSgnJyk7XG4gICAgICByZXBseVJlZi5jdXJyZW50Py5mb2N1cygpO1xuICAgIH1cbiAgfSwgW3JlcGx5LCBzZW5kaW5nLCBvblJlcGx5XSk7XG5cbiAgY29uc3Qgb25SZXBseUtleURvd24gPSB1c2VDYWxsYmFjayhcbiAgICAoZTogUmVhY3QuS2V5Ym9hcmRFdmVudDxIVE1MVGV4dEFyZWFFbGVtZW50PikgPT4ge1xuICAgICAgaWYgKChlLm1ldGFLZXkgfHwgZS5jdHJsS2V5KSAmJiBlLmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHZvaWQgdHJ5U2VuZFJlcGx5KCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbdHJ5U2VuZFJlcGx5XVxuICApO1xuXG4gIGNvbnN0IGhlYWRJZCA9IGBjbS10aHJlYWQtaGVhZC0ke2NvbW1lbnQuaWR9YDtcbiAgY29uc3Qgc2VsZWN0b3JDaGlwID0gZm9ybWF0U2VsZWN0b3JDaGlwKGNvbW1lbnQuc2VsZWN0b3IsICcnKTtcblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIHJlZj17ZGlhbG9nUmVmfVxuICAgICAgY2xhc3NOYW1lPVwiY20tdGhyZWFkXCJcbiAgICAgIHJvbGU9XCJkaWFsb2dcIlxuICAgICAgYXJpYS1sYWJlbGxlZGJ5PXtoZWFkSWR9XG4gICAgICB0YWJJbmRleD17LTF9XG4gICAgICBvbkNsaWNrPXsoZSkgPT4gZS5zdG9wUHJvcGFnYXRpb24oKX1cbiAgICAgIG9uUG9pbnRlckRvd249eyhlKSA9PiBlLnN0b3BQcm9wYWdhdGlvbigpfVxuICAgID5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY20tdGhyZWFkX19oZWFkXCIgaWQ9e2hlYWRJZH0+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY20tdGhyZWFkX19oZWFkLXJvd1wiPlxuICAgICAgICAgIHsvKiBQbGFuIEMgUDE4IOKAlCBwaW4vc2VxdWVuY2UgYmFkZ2UgaW4gdGhlIHBvcG92ZXIgaGVhZGVyIChwYXJpdHkgd2l0aFxuICAgICAgICAgICAgICBgLmRlc2lnbi91aS9TdHVkaW8udHN4YCB0aHJlYWQgcG9wb3ZlcikuICovfVxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImNtLXRocmVhZF9fc2VxXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICB7c2VxdWVuY2V9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImNtLXRocmVhZF9fYXV0aG9yXCI+e2NvbW1lbnQuYXV0aG9yPy50cmltKCkgfHwgJ3Vua25vd24nfTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJjbS10aHJlYWRfX3RpbWVcIj57Zm9ybWF0UmVsYXRpdmVUaW1lKGNvbW1lbnQuY3JlYXRlZCl9PC9zcGFuPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiY20tdGhyZWFkX19jbG9zZVwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2xvc2UgdGhyZWFkXCJcbiAgICAgICAgICAgIHRpdGxlPVwiQ2xvc2UgwrcgRXNjXCJcbiAgICAgICAgICAgIG9uQ2xpY2s9e29uQ2xvc2V9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgw5dcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIHtzZWxlY3RvckNoaXAgPyA8Y29kZSBjbGFzc05hbWU9XCJjbS10aHJlYWRfX3NlbGVjdG9yXCI+e3NlbGVjdG9yQ2hpcH08L2NvZGU+IDogbnVsbH1cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImNtLXRocmVhZF9fYm9keVwiPntyZW5kZXJCb2R5V2l0aE1lbnRpb25zKGNvbW1lbnQudGV4dCl9PC9kaXY+XG5cbiAgICAgIHsoY29tbWVudC50aHJlYWQgPz8gW10pLm1hcCgocikgPT4gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNtLXRocmVhZF9fcmVwbHlcIiBrZXk9e3IuaWR9PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY20tdGhyZWFkX19yZXBseS1oZWFkXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJjbS10aHJlYWRfX3JlcGx5LWF1dGhvclwiPntyLmF1dGhvcj8udHJpbSgpIHx8ICd1bmtub3duJ308L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJjbS10aHJlYWRfX3JlcGx5LXRpbWVcIj57Zm9ybWF0UmVsYXRpdmVUaW1lKHIuY3JlYXRlZCl9PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY20tdGhyZWFkX19yZXBseS1ib2R5XCI+e3JlbmRlckJvZHlXaXRoTWVudGlvbnMoci5ib2R5KX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApKX1cblxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJjbS10aHJlYWRfX3JlcGx5LWZvcm1cIj5cbiAgICAgICAgPE1lbnRpb25Bd2FyZVRleHRhcmVhXG4gICAgICAgICAgdGV4dGFyZWFSZWY9e3JlcGx5UmVmfVxuICAgICAgICAgIGNsYXNzTmFtZT1cImNtLXRocmVhZF9fcmVwbHktdGV4dGFyZWFcIlxuICAgICAgICAgIHZhbHVlPXtyZXBseX1cbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIlJlcGx54oCmIOKMmOKGtSB0byBzZW5kIMK3IEBuYW1lIHRvIHRhZ1wiXG4gICAgICAgICAgb25DaGFuZ2U9e3NldFJlcGx5fVxuICAgICAgICAgIG9uS2V5RG93bj17b25SZXBseUtleURvd259XG4gICAgICAgICAgcm93cz17Mn1cbiAgICAgICAgICBhcmlhTGFiZWw9XCJSZXBseVwiXG4gICAgICAgICAgZGlzYWJsZWQ9e3NlbmRpbmd9XG4gICAgICAgIC8+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY20tdGhyZWFkX19yZXBseS1hY3Rpb25zXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJjbS1idG4gY20tYnRuLS1wcmltYXJ5XCJcbiAgICAgICAgICAgIGRpc2FibGVkPXshcmVwbHkudHJpbSgpIHx8IHNlbmRpbmd9XG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB2b2lkIHRyeVNlbmRSZXBseSgpfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIFNlbmRcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJjbS10aHJlYWRfX2FjdGlvbnNcIj5cbiAgICAgICAge2NvbW1lbnQuc3RhdHVzID09PSAncmVzb2x2ZWQnID8gKFxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzTmFtZT1cImNtLWJ0blwiIG9uQ2xpY2s9eygpID0+IG9uUGF0Y2goeyBzdGF0dXM6ICdvcGVuJyB9KX0+XG4gICAgICAgICAgICDihrogUmVvcGVuXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJjbS1idG4gY20tYnRuLS1wcmltYXJ5XCJcbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgb25QYXRjaCh7IHN0YXR1czogJ3Jlc29sdmVkJyB9KTtcbiAgICAgICAgICAgICAgb25DbG9zZSgpO1xuICAgICAgICAgICAgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICDinJMgUmVzb2x2ZVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICApfVxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3NOYW1lPVwiY20tYnRuIGNtLWJ0bi0tZGFuZ2VyXCJcbiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICBvbkRlbGV0ZSgpO1xuICAgICAgICAgICAgb25DbG9zZSgpO1xuICAgICAgICAgIH19XG4gICAgICAgID5cbiAgICAgICAgICBEZWxldGVcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBCb2R5IHJlbmRlcmVyIOKAlCBzcGxpdHMgdGV4dCBvbiBALWhhbmRsZXMsIHdyYXBzIGVhY2ggaW4gPHN0cm9uZz4uIEFueXRoaW5nXG4vLyBub3QgbWF0Y2hpbmcgdGhlIG1lbnRpb24gcmVnZXggc3RheXMgcGxhaW4gdGV4dCAobmV3bGluZXMgcHJlc2VydmVkIGJ5IENTU1xuLy8gYHdoaXRlLXNwYWNlOiBwcmUtd3JhcGApLlxuXG5mdW5jdGlvbiByZW5kZXJCb2R5V2l0aE1lbnRpb25zKHRleHQ6IHN0cmluZyk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGlmICghdGV4dCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHJlID0gLyhAW1xcd11bXFx3Li1dKikvZztcbiAgY29uc3QgcGFydHMgPSB0ZXh0LnNwbGl0KHJlKTtcbiAgcmV0dXJuIHBhcnRzLm1hcCgocGFydCwgaSkgPT4ge1xuICAgIC8vIFRoZSBzcGxpdCBwb3NpdGlvbnMgQVJFIHRoZSBpZGVudGl0eSBoZXJlIOKAlCBmb3IgdGhlIHNhbWUgYHRleHRgIGlucHV0LFxuICAgIC8vIGluZGV4IGBpYCBhbHdheXMgbWFwcyB0byB0aGUgc2FtZSBmcmFnbWVudC4gQ29tcG9zZSBrZXkgZnJvbSBpbmRleCArXG4gICAgLy8gY29udGVudCBzbyBiaW9tZSdzIGFycmF5LWluZGV4LWtleSBoZXVyaXN0aWMgaXMgc2F0aXNmaWVkIEFORCByZW9yZGVyXG4gICAgLy8gcmVzaXN0YW5jZSBpcyBpbnRhY3QgaWYgYHRleHRgIG11dGF0ZXMgbWlkLXJlbmRlci5cbiAgICBjb25zdCBrZXkgPSBgJHtpfToke3BhcnR9YDtcbiAgICBpZiAoaSAlIDIgPT09IDEpIHtcbiAgICAgIC8vIE9kZCBwYXJ0cyBhcmUgdGhlIGNhcHR1cmVkIEBoYW5kbGVzIHRoYW5rcyB0byB0aGUgcGFyZW50aGVzaXplZCBzcGxpdC5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxzdHJvbmcga2V5PXtrZXl9IGRhdGEtbWVudGlvbj1cInRydWVcIj5cbiAgICAgICAgICB7cGFydH1cbiAgICAgICAgPC9zdHJvbmc+XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gPHNwYW4ga2V5PXtrZXl9PntwYXJ0fTwvc3Bhbj47XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRSZWxhdGl2ZVRpbWUoaXNvOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIWlzbykgcmV0dXJuICcnO1xuICBjb25zdCB0ID0gRGF0ZS5wYXJzZShpc28pO1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZSh0KSkgcmV0dXJuICcnO1xuICBjb25zdCBkaWZmU2VjID0gTWF0aC5yb3VuZCgoRGF0ZS5ub3coKSAtIHQpIC8gMTAwMCk7XG4gIGlmIChkaWZmU2VjIDwgNjApIHJldHVybiBgJHtNYXRoLm1heChkaWZmU2VjLCAwKX1zIGFnb2A7XG4gIGlmIChkaWZmU2VjIDwgMzYwMCkgcmV0dXJuIGAke01hdGgucm91bmQoZGlmZlNlYyAvIDYwKX1tIGFnb2A7XG4gIGlmIChkaWZmU2VjIDwgODZfNDAwKSByZXR1cm4gYCR7TWF0aC5yb3VuZChkaWZmU2VjIC8gMzYwMCl9aCBhZ29gO1xuICByZXR1cm4gYCR7TWF0aC5yb3VuZChkaWZmU2VjIC8gODZfNDAwKX1kIGFnb2A7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFNlbGVjdG9yQ2hpcChzZWxlY3Rvcjogc3RyaW5nLCBmYWxsYmFjazogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFzZWxlY3RvcikgcmV0dXJuIGZhbGxiYWNrO1xuICBjb25zdCBjZCA9IHNlbGVjdG9yLm1hdGNoKC9kYXRhLWNkLWlkPVwiKFteXCJdKylcIi8pO1xuICBpZiAoY2QpIHJldHVybiBgY2Q6JHtjZFsxXX1gO1xuICByZXR1cm4gc2VsZWN0b3IubGVuZ3RoID4gMzYgPyBgJHtzZWxlY3Rvci5zbGljZSgwLCAzMyl94oCmYCA6IHNlbGVjdG9yO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlVGhyZWFkQW5jaG9yKGNvbW1lbnQ6IE92ZXJsYXlDb21tZW50KTogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHtcbiAgLy8gUmVzb2x2ZSB0YXJnZXQncyBsaXZlIHNjcmVlbiByZWN0OyBwb3BvdmVyIGRyb3BzIGJlbG93IHRoZSBwaW4gd2l0aCBzbWFsbFxuICAvLyBicmVhdGhpbmcgcm9vbS4gU3RvcmVkIGJvdW5kcyAoY2FwdHVyZS10aW1lIHNjcmVlbiBjb29yZHMpIGFyZSB0aGVcbiAgLy8gbGFzdC1yZXNvcnQgZmFsbGJhY2sgZm9yIG9ycGhhbmVkIHBpbnMuXG4gIGNvbnN0IHJlY3QgPSBjb21tZW50LnNlbGVjdG9yID8gc2NyZWVuUmVjdEZvcihjb21tZW50LnNlbGVjdG9yLCBjb21tZW50LmluZGV4KSA6IG51bGw7XG4gIGlmIChyZWN0KSB7XG4gICAgLy8gUGluIHNpdHMgYXQgKHJlY3QucmlnaHQgLSAxMiwgcmVjdC50b3AgLSAxMikuIFBsYWNlIHBvcG92ZXIgYXQgdGhlIHNhbWVcbiAgICAvLyB4IGZvciB2aXN1YWwgY29udGludWl0eSwgMTZweCBiZWxvdyB0aGUgdG9wIHNvIGl0IGNsZWFycyB0aGUgcGluLlxuICAgIHJldHVybiB7IHg6IHJlY3QueCArIHJlY3QudyAtIDEyLCB5OiByZWN0LnkgKyAxNiB9O1xuICB9XG4gIGlmIChjb21tZW50LmJvdW5kcykge1xuICAgIHJldHVybiB7IHg6IGNvbW1lbnQuYm91bmRzLnggKyBjb21tZW50LmJvdW5kcy53IC0gMTIsIHk6IGNvbW1lbnQuYm91bmRzLnkgKyAxNiB9O1xuICB9XG4gIHJldHVybiB7IHg6IDE2LCB5OiAxNiB9O1xufVxuXG5mdW5jdGlvbiBjb21wdXRlQW5jaG9yKHN0YXRlOiBDb21wb3NlclN0YXRlKTogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHtcbiAgLy8gRzQg4oCUIGFuY2hvciB0byB0aGUgY3Vyc29yIGNsaWNrIHBvaW50IGZpcnN0LiBFYXJsaWVyIHZlcnNpb25zIGFuY2hvcmVkIHRvXG4gIC8vIHRoZSBzZWxlY3RlZCBlbGVtZW50J3MgYm90dG9tLWxlZnQsIHdoaWNoIGxhbmRlZCB0aGUgY29tcG9zZXIgZmx1c2ggaW5cbiAgLy8gdGhlIGNvcm5lciByZWdhcmRsZXNzIG9mIHdoZXJlIHRoZSB1c2VyIGNsaWNrZWQg4oCUIHN1cnByaXNpbmcgZm9yIHRoZVxuICAvLyBjb21tb24gY2FzZSBvZiBcIkkgY2xpY2tlZCB0aGUgbWlkZGxlIG9mIGFuIGVsZW1lbnQsIGV4cGVjdGluZyB0aGVcbiAgLy8gY29tcG9zZXIgdG8gYXBwZWFyIG5lYXIgbXkgY3Vyc29yXCIuIFRoZSBlbGVtZW50LXJlY3QgcGF0aCByZW1haW5zIGFzIGFcbiAgLy8gZmFsbGJhY2sgZm9yIGVudHJ5IHBvaW50cyB0aGF0IGRvbid0IGNhcnJ5IGEgY3Vyc29yIChlLmcuIG9wZW5pbmcgdGhlXG4gIC8vIGNvbXBvc2VyIGZyb20gYSBjb250ZXh0dWFsIHRvb2xiYXIgYnV0dG9uIOKAlCB0aG9zZSBzaG91bGQgc2V0IGNsaWVudFgvWVxuICAvLyB0byBhIHNlbnNpYmxlIGFuY2hvciBiZWZvcmUgZGlzcGF0Y2hpbmcpLlxuICBpZiAoc3RhdGUuY2xpZW50WCB8fCBzdGF0ZS5jbGllbnRZKSB7XG4gICAgcmV0dXJuIHsgeDogc3RhdGUuY2xpZW50WCwgeTogc3RhdGUuY2xpZW50WSArIDggfTtcbiAgfVxuICBpZiAoc3RhdGUuc2VsZWN0aW9uLnNlbGVjdG9yKSB7XG4gICAgY29uc3QgcmVjdCA9IHNjcmVlblJlY3RGb3Ioc3RhdGUuc2VsZWN0aW9uLnNlbGVjdG9yLCBzdGF0ZS5zZWxlY3Rpb24uaW5kZXgpO1xuICAgIGlmIChyZWN0KSB7XG4gICAgICByZXR1cm4geyB4OiByZWN0LngsIHk6IHJlY3QueSArIHJlY3QuaCArIDggfTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgeDogMTYsIHk6IDE2IH07XG59XG4iLAogICAgIi8qKlxuICogQGZpbGUgICAgICAgdXNlLWNvbGxhYi50c3gg4oCUIGNsaWVudC1zaWRlIFlqcyBjb2xsYWIgcHJvdmlkZXIgZm9yIGNhbnZhcyBpZnJhbWVzXG4gKiBAc2NvcGUgICAgICBhcHBzL3N0dWRpby91c2UtY29sbGFiLnRzeFxuICogQHB1cnBvc2UgICAgTW91bnRzIGEgc2luZ2xlIFkuRG9jICsgQXdhcmVuZXNzIHBlciBjYW52YXMgaWZyYW1lLiBPcGVucyBhXG4gKiAgICAgICAgICAgICBXZWJTb2NrZXQgdG8gYC9fd3MvY29sbGFiLzpzbHVnYCwgc3BlYWtzIHRoZSB5LXdlYnNvY2tldCBiaW5hcnlcbiAqICAgICAgICAgICAgIHByb3RvY29sLCBleHBvc2VzIGhvb2tzIGZvciB0aGUgY3Vyc29yIG92ZXJsYXkgKyBUYXNrIDMgY29tbWVudHNcbiAqICAgICAgICAgICAgIGJpbmRpbmcuXG4gKlxuICogQm91bmRhcnk6XG4gKiAgIC0gU2VydmVyLXNpZGUgZXF1aXZhbGVudCBpcyBgY29sbGFiL3Byb3RvY29sLnRzYCArIGBjb2xsYWIvcm9vbS50c2AuXG4gKiAgIC0gVGhpcyBmaWxlIG1pcnJvcnMgdGhlIG1lc3NhZ2UgZnJhbWluZyAodmFyaW50LXByZWZpeGVkIHN5bmMgKyBhd2FyZW5lc3NcbiAqICAgICBmcmFtZXMpIHNvIHRoZSB0d28gc2lkZXMgY29udmVyZ2Ugb3ZlciBhIGJpbmFyeSBXUyB3aXRob3V0IGludGVybWVkaWF0ZVxuICogICAgIEpTT04uXG4gKiAgIC0gSW1wb3J0cyBgeWpzYCArIGB5LXByb3RvY29scy97c3luYyxhd2FyZW5lc3N9YCB2aWEgdGhlIGNhbnZhcy1zaGVsbFxuICogICAgIGltcG9ydG1hcCAoUlVOVElNRV9QQUNLQUdFUyBhZGRpdGlvbnMpLiBDYW52YXMgYnVuZGxlcyB0aGF0IGRvbid0IG1vdW50XG4gKiAgICAgPENvbGxhYlByb3ZpZGVyPiBuZXZlciByZXNvbHZlIHRoZXNlIHNwZWNpZmllcnMgYW5kIHBheSB6ZXJvIGJ1bmRsZSBjb3N0LlxuICovXG5cbmltcG9ydCAqIGFzIGRlY29kaW5nIGZyb20gJ2xpYjAvZGVjb2RpbmcnO1xuaW1wb3J0ICogYXMgZW5jb2RpbmcgZnJvbSAnbGliMC9lbmNvZGluZyc7XG5pbXBvcnQge1xuICBjcmVhdGVDb250ZXh0LFxuICB0eXBlIFJlYWN0Tm9kZSxcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUNvbnRleHQsXG4gIHVzZUVmZmVjdCxcbiAgdXNlTWVtbyxcbiAgdXNlUmVmLFxuICB1c2VTdGF0ZSxcbn0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQXdhcmVuZXNzLCBhcHBseUF3YXJlbmVzc1VwZGF0ZSwgZW5jb2RlQXdhcmVuZXNzVXBkYXRlIH0gZnJvbSAneS1wcm90b2NvbHMvYXdhcmVuZXNzJztcbmltcG9ydCB7IHJlYWRTeW5jTWVzc2FnZSwgd3JpdGVTeW5jU3RlcDEsIHdyaXRlVXBkYXRlIH0gZnJvbSAneS1wcm90b2NvbHMvc3luYyc7XG5pbXBvcnQgKiBhcyBZIGZyb20gJ3lqcyc7XG5cbmNvbnN0IE1FU1NBR0VfU1lOQyA9IDA7XG5jb25zdCBNRVNTQUdFX0FXQVJFTkVTUyA9IDE7XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gQ29sb3IgaGFzaCDigJQgc3RhYmxlIHBlciBwZWVyIGlkZW50aXR5LlxuXG4vKipcbiAqIGRqYjIgc3RyaW5nIGhhc2gg4oaSIDB4UlJHR0JCIGNvbG9yIGluIGEgY3VyYXRlZCBwYWxldHRlLiBEZXRlcm1pbmlzbSBwZXJcbiAqIGlucHV0IG5hbWUgaXMgdGhlIGxvYWQtYmVhcmluZyBwcm9wZXJ0eTogZXZlcnkgcGVlciBoYXNoaW5nIFwiQWxpY2VcIiBtdXN0XG4gKiBsYW5kIG9uIHRoZSBTQU1FIGNvbG9yLiAxMiBodWVzIHNwcmVhZCBldmVubHkgYXJvdW5kIHRoZSB3aGVlbDsgc2F0dXJhdGlvblxuICogKyBsaWdodG5lc3MgZml4ZWQgc28gYWxsIGNvbG9ycyBzdGF5IHJlYWRhYmxlIG9uIGxpZ2h0ICsgZGFyayBzdXJmYWNlcy5cbiAqL1xuY29uc3QgQ09MT1JfUEFMRVRURSA9IFtcbiAgJyNlOTFlNjMnLCAvLyBwaW5rXG4gICcjZjQ0MzM2JywgLy8gcmVkXG4gICcjZmY5ODAwJywgLy8gb3JhbmdlXG4gICcjZmZjMTA3JywgLy8gYW1iZXJcbiAgJyNjZGRjMzknLCAvLyBsaW1lXG4gICcjNGNhZjUwJywgLy8gZ3JlZW5cbiAgJyMwMDk2ODgnLCAvLyB0ZWFsXG4gICcjMDBiY2Q0JywgLy8gY3lhblxuICAnIzAzYTlmNCcsIC8vIGxpZ2h0IGJsdWVcbiAgJyMzZjUxYjUnLCAvLyBpbmRpZ29cbiAgJyM2NzNhYjcnLCAvLyBkZWVwIHB1cnBsZVxuICAnIzljMjdiMCcsIC8vIHB1cnBsZVxuXSBhcyBjb25zdDtcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbG9yRm9yTmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBDT0xPUl9QQUxFVFRFIGlzIGEgbm9uLWVtcHR5IGNvbnN0IHR1cGxlOyB0aGUgZXhwbGljaXQgYD8/ICcjMDAwJ2BcbiAgLy8gZmFsbGJhY2sgaXMgdW5yZWFjaGFibGUgYnV0IHNhdGlzZmllcyBgbm9VbmNoZWNrZWRJbmRleGVkQWNjZXNzYC5cbiAgY29uc3QgRkFMTEJBQ0sgPSAnIzAwMDAwMCc7XG4gIGlmICghbmFtZSkgcmV0dXJuIENPTE9SX1BBTEVUVEVbMF0gPz8gRkFMTEJBQ0s7XG4gIGxldCBoYXNoID0gNTM4MTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lLmxlbmd0aDsgaSsrKSB7XG4gICAgaGFzaCA9ICgoaGFzaCA8PCA1KSArIGhhc2ggKyBuYW1lLmNoYXJDb2RlQXQoaSkpIHwgMDtcbiAgfVxuICBjb25zdCBpZHggPSAoKGhhc2ggJSBDT0xPUl9QQUxFVFRFLmxlbmd0aCkgKyBDT0xPUl9QQUxFVFRFLmxlbmd0aCkgJSBDT0xPUl9QQUxFVFRFLmxlbmd0aDtcbiAgcmV0dXJuIENPTE9SX1BBTEVUVEVbaWR4XSA/PyBGQUxMQkFDSztcbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBBd2FyZW5lc3Mgc3RhdGUgc2hhcGUuXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sbGFiQXdhcmVuZXNzU3RhdGUge1xuICBuYW1lOiBzdHJpbmc7XG4gIGNvbG9yOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDdXJzb3IgcG9zaXRpb24gaW4gKip3b3JsZCBjb29yZHMqKiAoY2FudmFzLWxpYiB2aWV3cG9ydCBzcGFjZSkgc28gZm9yZWlnblxuICAgKiBwZWVycyBzZWUgdGhlIHNhbWUgY29uY2VwdHVhbCBwb2ludCBldmVuIHdoZW4gdGhlaXIgbG9jYWwgdmlld3BvcnQgaXNcbiAgICogcGFubmVkL3pvb21lZCBkaWZmZXJlbnRseS4gTnVsbCA9IHBlZXIgaXMgbm90IG92ZXIgdGhlIGNhbnZhcyBzdXJmYWNlLlxuICAgKi9cbiAgY3Vyc29yOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gfCBudWxsO1xuICAvKipcbiAgICogTW9zdC1yZWNlbnRseSBzZWxlY3RlZCBlbGVtZW50LiBgY3NzUGF0aGAgaXMgdGhlIGxvY2F0b3IgaWQgY2hhaW4gdGhlXG4gICAqIGNhbnZhcy1zaGVsbCBhbHJlYWR5IHVzZXM7IGBib3VuZHNgIGFyZSBzY3JlZW4tcHggcmVjdCBhdCB0aGUgbW9tZW50IG9mXG4gICAqIHB1Ymxpc2ggKHNvIGl0J3MgYSBoaW50LCBub3QgYSBsaXZlIHJlZikuIE51bGwgd2hlbiBub3RoaW5nIHNlbGVjdGVkLlxuICAgKi9cbiAgc2VsZWN0aW9uOiB7IGNzc1BhdGg6IHN0cmluZzsgYm91bmRzOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3OiBudW1iZXI7IGg6IG51bWJlciB9IH0gfCBudWxsO1xuICAvKipcbiAgICogQ3VycmVudGx5LXNlbGVjdGVkIGFubm90YXRpb24gc3Ryb2tlIElEcyAoUGhhc2UgNSkuIFN0cm9rZXMgYXJlIGFkZHJlc3NlZFxuICAgKiBieSB0aGVpciBzdGFibGUgYGRhdGEtaWRgIGF0dHJpYnV0ZSwgc28gcGVlcnMgY2FuIHJlc29sdmUgaGFsb3MgdmlhXG4gICAqIGBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1pZD1cIjxpZD5cIl0nKWAuIEVtcHR5IHdoZW4gbm90aGluZ1xuICAgKiBhbm5vdGF0aW9uLXNoYXBlZCBpcyBzZWxlY3RlZC5cbiAgICovXG4gIGFubm90YXRpb25TZWxlY3Rpb246IHN0cmluZ1tdO1xuICB2aWV3cG9ydDogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgem9vbTogbnVtYmVyIH07XG4gIC8qKlxuICAgKiBTZXJ2ZXItc2lkZSBgZGlzY29ubmVjdGAgbWF0Y2hlcyBhd2FyZW5lc3Mgc3RhdGVzIHRvIG91dGdvaW5nIHBlZXJzIGJ5XG4gICAqIHRoaXMgdG9rZW4gKG11c3QgZXF1YWwgdGhlIHdzLmRhdGEuaWQgdGhlIHNlcnZlciBhc3NpZ25zIGF0IHVwZ3JhZGUpLlxuICAgKiBVbnRpbCB0aGUgc2VydmVyIHB1c2hlcyB0aGUgYXNzaWduZWQgaWQgYmFjayB0byB0aGUgY2xpZW50LCB3ZSB1c2UgYVxuICAgKiBjbGllbnQtZ2VuZXJhdGVkIFVVSUQg4oCUIGNvbGxpc2lvbnMgYXJlIG5lZ2xpZ2libGUgYW5kIGRpc2Nvbm5lY3QgY2xlYW51cFxuICAgKiB0b2xlcmF0ZXMgYSBzdGFsZSBzdGF0ZSAodGhlIG5leHQgYXdhcmVuZXNzIEdDIHBhc3MgZHJvcHMgaXQpLlxuICAgKi9cbiAgX19jb25uSWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgRm9yZWlnbkF3YXJlbmVzcyA9IE9taXQ8Q29sbGFiQXdhcmVuZXNzU3RhdGUsICdfX2Nvbm5JZCc+ICYgeyBjbGllbnRJRDogbnVtYmVyIH07XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gVW50cnVzdGVkLWlucHV0IHNhbml0aXphdGlvbiBhdCB0aGUgYXdhcmVuZXNzIHRydXN0IGJvdW5kYXJ5LlxuLy9cbi8vIFBoYXNlIDggYXdhcmVuZXNzIHdhcyBsb29wYmFjay1vbmx5IOKAlCBldmVyeSBzdGF0ZSBjYW1lIGZyb20gYSB0cnVzdGVkIGxvY2FsXG4vLyB0YWIuIFBoYXNlIDkgKFRhc2sgNSkgYnJpZGdlcyBhd2FyZW5lc3MgdGhyb3VnaCBhIFNFTUktVFJVU1RFRCBodWIgKEREUi0wNTQpLFxuLy8gc28gZm9yZWlnbiBzdGF0ZXMgYXJlIG5vdyBhdHRhY2tlci1pbmZsdWVuY2VhYmxlLiBgdXNlRm9yZWlnbkF3YXJlbmVzc2AgaXNcbi8vIHRoZSBzaW5nbGUgY2hva2Vwb2ludCB3aGVyZSByZW1vdGUgc3RhdGUgaXMgcmVhZCBiZWZvcmUgaXQgcmVhY2hlcyB0aGVcbi8vIGN1cnNvciAvIHBhcnRpY2lwYW50IHJlbmRlciBzaW5rcywgc28gYWxsIHZhbGlkYXRpb24gbGl2ZXMgaGVyZS4gRmllbGRzIGFyZVxuLy8gdmFsaWRhdGVkIGZvciBWQUxVRSwgbm90IGp1c3QgdHlwZTpcbi8vICAgLSBjb2xvcjogcmUtZGVyaXZlZCBsb2NhbGx5IGZyb20gdGhlIChzYW5pdGl6ZWQpIG5hbWUgYW5kIHRoZSB3aXJlIHZhbHVlXG4vLyAgICAgaXMgRElTQ0FSREVEIOKAlCBhIGh1Yi1jaG9zZW4gYGNvbG9yYCBzdHJpbmcgd291bGQgb3RoZXJ3aXNlIGZsb3cgaW50byBhblxuLy8gICAgIGlubGluZSBgc3R5bGVgIGFuZCBhIGB1cmwoLi4uKWAgdmFsdWUgYmVhY29ucyBldmVyeSB2aWV3ZXIncyBicm93c2VyLlxuLy8gICAgIFRoZSBwYWxldHRlIGlzIGRldGVybWluaXN0aWMsIHNvIHJlLWRlcml2YXRpb24gaXMgdmlzdWFsbHkgaWRlbnRpY2FsLlxuLy8gICAtIG5hbWU6IGNvbnRyb2wgLyBiaWRpIC8gemVyby13aWR0aCBjaGFycyBzdHJpcHBlZCwgbGVuZ3RoLWNhcHBlZCDigJQgYmxvY2tzXG4vLyAgICAgaWRlbnRpdHkgc3Bvb2ZpbmcgKyByZW5kZXIgYmxvYXQuXG4vLyAgIC0gY3Vyc29yIC8gdmlld3BvcnQ6IGZpbml0ZS1udW1iZXIgZ2F0ZWQg4oCUIGEgTmFOL0luZmluaXR5IHdvdWxkIHBvaXNvbiB0aGVcbi8vICAgICBDU1MgdHJhbnNmb3JtIC8gdGhlIGxvY2FsIHZpZXdwb3J0IGNvbnRyb2xsZXIgZHVyaW5nIEZvbGxvdyBtb2RlLlxuLy8gICAtIHNlbGVjdGlvbi5jc3NQYXRoOiBjaGFyc2V0ICsgbGVuZ3RoIGFsbG93bGlzdCBiZWZvcmUgaXQgcmVhY2hlc1xuLy8gICAgIGBxdWVyeVNlbGVjdG9yYCDigJQgYmxvY2tzIHNlbGVjdG9yLWNvbXBsZXhpdHkgRG9TICsgYXJiaXRyYXJ5IERPTSBwcm9iaW5nLlxuLy8gICAtIGFubm90YXRpb25TZWxlY3Rpb246IHBlci1pZCB0b2tlbiArIGFycmF5LWxlbmd0aCBjYXBwZWQg4oCUIGJsb2NrcyBhXG4vLyAgICAgcXVlcnlTZWxlY3RvciByZW5kZXItc3Rvcm0uXG4vLyAgIC0gcGVlciBjb3VudCBjYXBwZWQg4oCUIGJsb2NrcyBhbiB1bmJvdW5kZWQtY2xpZW50cyBtZW1vcnkvcmVuZGVyIERvUy5cblxuY29uc3QgTUFYX0ZPUkVJR05fUEVFUlMgPSA2NDtcbmNvbnN0IE1BWF9OQU1FX0xFTiA9IDY0O1xuY29uc3QgTUFYX0NTU1BBVEhfTEVOID0gNTEyO1xuY29uc3QgTUFYX0FOTk9UQVRJT05fSURTID0gMjU2O1xuY29uc3QgTUFYX0FOTk9UQVRJT05fSURfTEVOID0gMTI4O1xuXG4vLyBDaGFyc2V0IG9mIGV2ZXJ5IHNlbGVjdG9yIHRoZSBjYW52YXMtc2hlbGwgYGNzc1BhdGgoKWAgZW1pdHNcbi8vIChgW2RhdGEtKj1cIi4uLlwiXWAsIGAjaWRgLCBgdGFnLmNsczpudGgtY2hpbGQoTilgLCBgID4gYCBjb21iaW5hdG9ycykuXG5jb25zdCBDU1NQQVRIX0FMTE9XRUQgPSAvXltBLVphLXowLTkgLl8jPjpbXFxdPVwiJygpLV0rJC87XG4vLyBgY3NzUGF0aCgpYCBvbmx5IGV2ZXIgZW1pdHMgYDpudGgtY2hpbGQoTilgIGFzIGEgcGFyZW50aGVzaXNlZCBjb25zdHJ1Y3QuXG4vLyBGdW5jdGlvbmFsIHBzZXVkby1jbGFzc2VzIChgOmhhcygpYCwgYDppcygpYCwgYDp3aGVyZSgpYCwgYDpub3QoKWApIHRyaWdnZXJcbi8vIHBlci1yZW5kZXIgc3VidHJlZSB3YWxrcyDihpIgYSBtYWxpY2lvdXMgaHViIHBlZXIgY291bGQgcHVibGlzaCBhIGRlZXBseVxuLy8gbmVzdGVkIGA6aGFzKClgIHNlbGVjdG9yIGFuZCBwaW4gZXZlcnkgdmlld2VyJ3MgbWFpbiB0aHJlYWQgKHF1ZXJ5U2VsZWN0b3Jcbi8vIHJlLXJ1bnMgZWFjaCByZW5kZXIpLiBTbyBhZnRlciBzdHJpcHBpbmcgdGhlIGxlZ2l0IGA6bnRoLWNoaWxkL29mLXR5cGUoTilgXG4vLyBmb3JtcywgYW55IHJlc2lkdWFsIHBhcmVuIG1lYW5zIGEgZnVuY3Rpb25hbCBwc2V1ZG8g4oCUIHJlamVjdC4gVGhlIGNoYXJzZXRcbi8vIGFsbG93bGlzdCBhbG9uZSB3YXMgd2lkZXIgdGhhbiB0aGUgZ2VuZXJhdG9yICh0aGUgb3JpZ2luYWwgRG9TIGhvbGUpLlxuY29uc3QgQ1NTUEFUSF9OVEggPSAvOm50aC0oY2hpbGR8b2YtdHlwZSlcXChcXGR7MSw0fVxcKS9nO1xuY29uc3QgQU5OT1RBVElPTl9JRF9BTExPV0VEID0gL15bQS1aYS16MC05Ll86LV0rJC87XG5cbmZ1bmN0aW9uIGlzU2FmZUNzc1BhdGgocDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChwLmxlbmd0aCA+IE1BWF9DU1NQQVRIX0xFTiB8fCAhQ1NTUEFUSF9BTExPV0VELnRlc3QocCkpIHJldHVybiBmYWxzZTtcbiAgY29uc3Qgc3RyaXBwZWQgPSBwLnJlcGxhY2UoQ1NTUEFUSF9OVEgsICcnKTtcbiAgcmV0dXJuICFzdHJpcHBlZC5pbmNsdWRlcygnKCcpICYmICFzdHJpcHBlZC5pbmNsdWRlcygnKScpO1xufVxuXG5mdW5jdGlvbiBpc0Zpbml0ZU51bSh2OiB1bmtub3duKTogdiBpcyBudW1iZXIge1xuICByZXR1cm4gdHlwZW9mIHYgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZSh2KTtcbn1cblxuLy8gQ29udHJvbCAoQzAvQzEpLCB6ZXJvLXdpZHRoLCBhbmQgYmlkaS1vdmVycmlkZSBjb2RlIHBvaW50cyBnZXQgc3RyaXBwZWQgZnJvbVxuLy8gZGlzcGxheWVkIHN0cmluZ3Mgc28gYSByZW1vdGUgcGVlciBjYW4ndCBzcG9vZiBhbm90aGVyJ3MgaWRlbnRpdHkgb3IgaGlkZVxuLy8gcGF5bG9hZHMgaW4gbGFiZWxzLiBBIGNoYXJDb2RlIHNjYW4gKG5vdCBhIHJlZ2V4IGxpdGVyYWwgd2l0aCByYXcgY29udHJvbFxuLy8gY2hhcnMpIHNpZGVzdGVwcyBiaW9tZSdzIG5vQ29udHJvbENoYXJhY3RlcnNJblJlZ2V4IHdoaWxlIGtlZXBpbmcgdGhlIHNhbWVcbi8vIHNlbWFudGljcyDigJQgc2FtZSBhcHByb2FjaCBhcyB0aGUgaHViJ3Mgc2FuaXRpemVGb3JMb2cgKEREUi0wNTMpLlxuZnVuY3Rpb24gaXNVbnNhZmVDb2RlUG9pbnQoY3A6IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGNwIDw9IDB4MWYgfHxcbiAgICAoY3AgPj0gMHg3ZiAmJiBjcCA8PSAweDlmKSB8fFxuICAgIChjcCA+PSAweDIwMGIgJiYgY3AgPD0gMHgyMDBmKSB8fFxuICAgIChjcCA+PSAweDIwMmEgJiYgY3AgPD0gMHgyMDJlKSB8fFxuICAgIChjcCA+PSAweDIwNjYgJiYgY3AgPD0gMHgyMDY5KSB8fFxuICAgIGNwID09PSAweGZlZmZcbiAgKTtcbn1cblxuZnVuY3Rpb24gc2FuaXRpemVOYW1lKHJhdzogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgcmF3ICE9PSAnc3RyaW5nJykgcmV0dXJuICdhbm9ueW1vdXMnO1xuICBsZXQgY2xlYW5lZCA9ICcnO1xuICBmb3IgKGNvbnN0IGNoIG9mIHJhdykge1xuICAgIGlmICghaXNVbnNhZmVDb2RlUG9pbnQoY2guY29kZVBvaW50QXQoMCkgPz8gMCkpIGNsZWFuZWQgKz0gY2g7XG4gIH1cbiAgY2xlYW5lZCA9IGNsZWFuZWQudHJpbSgpLnNsaWNlKDAsIE1BWF9OQU1FX0xFTik7XG4gIHJldHVybiBjbGVhbmVkIHx8ICdhbm9ueW1vdXMnO1xufVxuXG5mdW5jdGlvbiBzYW5pdGl6ZUN1cnNvcihyYXc6IHVua25vd24pOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gfCBudWxsIHtcbiAgaWYgKCFyYXcgfHwgdHlwZW9mIHJhdyAhPT0gJ29iamVjdCcpIHJldHVybiBudWxsO1xuICBjb25zdCBjID0gcmF3IGFzIHsgeD86IHVua25vd247IHk/OiB1bmtub3duIH07XG4gIHJldHVybiBpc0Zpbml0ZU51bShjLngpICYmIGlzRmluaXRlTnVtKGMueSkgPyB7IHg6IGMueCwgeTogYy55IH0gOiBudWxsO1xufVxuXG5mdW5jdGlvbiBzYW5pdGl6ZVZpZXdwb3J0KHJhdzogdW5rbm93bik6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHpvb206IG51bWJlciB9IHtcbiAgY29uc3QgZmFsbGJhY2sgPSB7IHg6IDAsIHk6IDAsIHpvb206IDEgfTtcbiAgaWYgKCFyYXcgfHwgdHlwZW9mIHJhdyAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxsYmFjaztcbiAgY29uc3QgdiA9IHJhdyBhcyB7IHg/OiB1bmtub3duOyB5PzogdW5rbm93bjsgem9vbT86IHVua25vd24gfTtcbiAgaWYgKCFpc0Zpbml0ZU51bSh2LngpIHx8ICFpc0Zpbml0ZU51bSh2LnkpIHx8ICFpc0Zpbml0ZU51bSh2Lnpvb20pIHx8IHYuem9vbSA8PSAwKVxuICAgIHJldHVybiBmYWxsYmFjaztcbiAgcmV0dXJuIHsgeDogdi54LCB5OiB2LnksIHpvb206IHYuem9vbSB9O1xufVxuXG5mdW5jdGlvbiBzYW5pdGl6ZVNlbGVjdGlvbihyYXc6IHVua25vd24pOiBDb2xsYWJBd2FyZW5lc3NTdGF0ZVsnc2VsZWN0aW9uJ10ge1xuICBpZiAoIXJhdyB8fCB0eXBlb2YgcmF3ICE9PSAnb2JqZWN0JykgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHMgPSByYXcgYXMgeyBjc3NQYXRoPzogdW5rbm93bjsgYm91bmRzPzogdW5rbm93biB9O1xuICBjb25zdCBiID0gcy5ib3VuZHMgYXMgeyB4PzogdW5rbm93bjsgeT86IHVua25vd247IHc/OiB1bmtub3duOyBoPzogdW5rbm93biB9IHwgdW5kZWZpbmVkO1xuICBjb25zdCBib3VuZHMgPVxuICAgIGIgJiYgaXNGaW5pdGVOdW0oYi54KSAmJiBpc0Zpbml0ZU51bShiLnkpICYmIGlzRmluaXRlTnVtKGIudykgJiYgaXNGaW5pdGVOdW0oYi5oKVxuICAgICAgPyB7IHg6IGIueCwgeTogYi55LCB3OiBiLncsIGg6IGIuaCB9XG4gICAgICA6IG51bGw7XG4gIC8vIE9ubHkga2VlcCBjc3NQYXRoIGlmIGl0IG1hdGNoZXMgdGhlIGxvY2F0b3IgZ3JhbW1hciDigJQgb3RoZXJ3aXNlIGRyb3AgaXQgYW5kXG4gIC8vIGxldCB0aGUgcmVuZGVyZXIgZmFsbCBiYWNrIHRvIHRoZSAodmFsaWRhdGVkKSBib3VuZHMuXG4gIGNvbnN0IGNzc1BhdGggPSB0eXBlb2Ygcy5jc3NQYXRoID09PSAnc3RyaW5nJyAmJiBpc1NhZmVDc3NQYXRoKHMuY3NzUGF0aCkgPyBzLmNzc1BhdGggOiAnJztcbiAgaWYgKCFjc3NQYXRoICYmICFib3VuZHMpIHJldHVybiBudWxsO1xuICByZXR1cm4geyBjc3NQYXRoLCBib3VuZHM6IGJvdW5kcyA/PyB7IHg6IDAsIHk6IDAsIHc6IDAsIGg6IDAgfSB9O1xufVxuXG5mdW5jdGlvbiBzYW5pdGl6ZUFubm90YXRpb25TZWxlY3Rpb24ocmF3OiB1bmtub3duKTogc3RyaW5nW10ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkocmF3KSkgcmV0dXJuIFtdO1xuICBjb25zdCBvdXQ6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgaWQgb2YgcmF3KSB7XG4gICAgaWYgKG91dC5sZW5ndGggPj0gTUFYX0FOTk9UQVRJT05fSURTKSBicmVhaztcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgaWQgPT09ICdzdHJpbmcnICYmXG4gICAgICBpZC5sZW5ndGggPD0gTUFYX0FOTk9UQVRJT05fSURfTEVOICYmXG4gICAgICBBTk5PVEFUSU9OX0lEX0FMTE9XRUQudGVzdChpZClcbiAgICApXG4gICAgICBvdXQucHVzaChpZCk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSArIG5vcm1hbGl6ZSBvbmUgZm9yZWlnbiBhd2FyZW5lc3Mgc3RhdGUgYXQgdGhlIHRydXN0IGJvdW5kYXJ5LlxuICogUmV0dXJucyBudWxsIGZvciBzdGF0ZXMgdGhhdCBjYW4ndCBiZSBhIHBlZXIgKG5vIHVzYWJsZSBuYW1lKS4gYGNvbG9yYCBpc1xuICogYWx3YXlzIHJlLWRlcml2ZWQgbG9jYWxseSBmcm9tIHRoZSBzYW5pdGl6ZWQgbmFtZSDigJQgdGhlIHdpcmUgdmFsdWUgaXMgbmV2ZXJcbiAqIHRydXN0ZWQsIHdoaWNoIGlzIHdoYXQgY2xvc2VzIHRoZSBodWIgQ1NTLWB1cmwoKWAgZXhmaWwgY2hhbm5lbC4gRXhwb3J0ZWQgc29cbiAqIHRoZSBob3N0aWxlLWlucHV0IG1hdHJpeCBjYW4gZXhlcmNpc2UgaXQgd2l0aG91dCBhIFJlYWN0IGhhcm5lc3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzYW5pdGl6ZUZvcmVpZ25TdGF0ZShjbGllbnRJRDogbnVtYmVyLCBzdGF0ZTogdW5rbm93bik6IEZvcmVpZ25Bd2FyZW5lc3MgfCBudWxsIHtcbiAgaWYgKCFzdGF0ZSB8fCB0eXBlb2Ygc3RhdGUgIT09ICdvYmplY3QnKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgcyA9IHN0YXRlIGFzIFBhcnRpYWw8Q29sbGFiQXdhcmVuZXNzU3RhdGU+O1xuICBpZiAodHlwZW9mIHMubmFtZSAhPT0gJ3N0cmluZycpIHJldHVybiBudWxsO1xuICBjb25zdCBuYW1lID0gc2FuaXRpemVOYW1lKHMubmFtZSk7XG4gIHJldHVybiB7XG4gICAgY2xpZW50SUQsXG4gICAgbmFtZSxcbiAgICBjb2xvcjogY29sb3JGb3JOYW1lKG5hbWUpLFxuICAgIGN1cnNvcjogc2FuaXRpemVDdXJzb3Iocy5jdXJzb3IpLFxuICAgIHNlbGVjdGlvbjogc2FuaXRpemVTZWxlY3Rpb24ocy5zZWxlY3Rpb24pLFxuICAgIGFubm90YXRpb25TZWxlY3Rpb246IHNhbml0aXplQW5ub3RhdGlvblNlbGVjdGlvbihzLmFubm90YXRpb25TZWxlY3Rpb24pLFxuICAgIHZpZXdwb3J0OiBzYW5pdGl6ZVZpZXdwb3J0KHMudmlld3BvcnQpLFxuICB9O1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIENvbnRleHQuXG5cbmludGVyZmFjZSBDb2xsYWJWYWx1ZSB7XG4gIGRvYzogWS5Eb2M7XG4gIC8qKlxuICAgKiBTRUNVUklUWSBJTlZBUklBTlQ6IGluIGxpbmtlZCBtb2RlIHRoaXMgQXdhcmVuZXNzIGNhcnJpZXMgc3RhdGVzIHJlbGF5ZWRcbiAgICogZnJvbSBhIFNFTUktVFJVU1RFRCBodWIgKEREUi0wNTQpLiBGb3JlaWduIHN0YXRlcyBhcmUgdW50cnVzdGVkIGlucHV0IOKAlFxuICAgKiByZWFkIHRoZW0gT05MWSB0aHJvdWdoIGB1c2VGb3JlaWduQXdhcmVuZXNzYCwgd2hpY2ggc2FuaXRpemVzIGV2ZXJ5IGZpZWxkXG4gICAqIGF0IHRoZSB0cnVzdCBib3VuZGFyeSAoYHNhbml0aXplRm9yZWlnblN0YXRlYCkuIERvIE5PVCBjYWxsXG4gICAqIGBhd2FyZW5lc3MuZ2V0U3RhdGVzKClgIGRpcmVjdGx5IGluIHJlbmRlciBjb2RlOyB0aGF0IGJ5cGFzc2VzIHRoZSBnYXRlLlxuICAgKi9cbiAgYXdhcmVuZXNzOiBBd2FyZW5lc3M7XG4gIC8qKiBMb2NhbCBwZWVyJ3Mgc2Vzc2lvbi1zdGFibGUgY29sb3IgKGRlcml2ZWQgZnJvbSBnaXQgdXNlci5uYW1lKS4gKi9cbiAgbXlDb2xvcjogc3RyaW5nO1xuICAvKiogTG9jYWwgcGVlcidzIGRpc3BsYXkgbmFtZSAoZ2l0IHVzZXIubmFtZSBvciBhbm9ueW1vdXMgZmFsbGJhY2spLiAqL1xuICBteU5hbWU6IHN0cmluZztcbiAgLyoqIExvY2FsIHBlZXIncyBjb25uZWN0aW9uIGlkIChtYXRjaGVzIHNlcnZlci1zaWRlIHdzLmRhdGEuaWQgcGF0dGVybikuICovXG4gIG15Q29ubklkOiBzdHJpbmc7XG4gIC8qKiBUcnVlIHdoZW4gdGhlIFdTIGlzIE9QRU4uIEN1cnNvciBvdmVybGF5IGNhbiB1c2UgdGhpcyB0byBnYXRlIHJlbmRlcmluZy4gKi9cbiAgY29ubmVjdGVkOiBib29sZWFuO1xuICAvKiogUHVibGlzaCAoZGVib3VuY2UtY29hbGVzY2VkKSBhbiB1cGRhdGVkIGxvY2FsIGF3YXJlbmVzcyBzdGF0ZS4gKi9cbiAgcHVibGlzaEF3YXJlbmVzczogKHBhdGNoOiBQYXJ0aWFsPE9taXQ8Q29sbGFiQXdhcmVuZXNzU3RhdGUsICdfX2Nvbm5JZCc+PikgPT4gdm9pZDtcbn1cblxuY29uc3QgQ29sbGFiQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8Q29sbGFiVmFsdWUgfCBudWxsPihudWxsKTtcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUNvbGxhYigpOiBDb2xsYWJWYWx1ZSB8IG51bGwge1xuICByZXR1cm4gdXNlQ29udGV4dChDb2xsYWJDb250ZXh0KTtcbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBIb29rOiBmb3JlaWduIGF3YXJlbmVzcyBwZWVycyAodGhlIGN1cnNvciBvdmVybGF5IHN1YnNjcmliZXMgdG8gdGhpcykuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgY3VycmVudCBzZXQgb2YgZm9yZWlnbiBwZWVycyAoZXhjbHVkZXMgdGhlIGxvY2FsIGNsaWVudCkuIFRoZVxuICogcmV0dXJuZWQgYXJyYXkgaXMgc3RhYmxlLXJlZmVyZW5jZSBiZXR3ZWVuIGF3YXJlbmVzcyB1cGRhdGVzIOKAlCB1c2VmdWwgZm9yXG4gKiBkb3duc3RyZWFtIFJlYWN0Lm1lbW8gY3Vyc29yIGNvbXBvbmVudHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VGb3JlaWduQXdhcmVuZXNzKCk6IEZvcmVpZ25Bd2FyZW5lc3NbXSB7XG4gIGNvbnN0IGNvbGxhYiA9IHVzZUNvbGxhYigpO1xuICBjb25zdCBbcGVlcnMsIHNldFBlZXJzXSA9IHVzZVN0YXRlPEZvcmVpZ25Bd2FyZW5lc3NbXT4oW10pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFjb2xsYWIpIHtcbiAgICAgIHNldFBlZXJzKFtdKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgeyBhd2FyZW5lc3MgfSA9IGNvbGxhYjtcbiAgICBmdW5jdGlvbiBjb21wdXRlKCk6IEZvcmVpZ25Bd2FyZW5lc3NbXSB7XG4gICAgICBjb25zdCBvdXQ6IEZvcmVpZ25Bd2FyZW5lc3NbXSA9IFtdO1xuICAgICAgY29uc3QgbXlJZCA9IGF3YXJlbmVzcy5jbGllbnRJRDtcbiAgICAgIGZvciAoY29uc3QgW2NsaWVudElELCBzdGF0ZV0gb2YgYXdhcmVuZXNzLmdldFN0YXRlcygpIGFzIE1hcDxudW1iZXIsIHVua25vd24+KSB7XG4gICAgICAgIGlmIChjbGllbnRJRCA9PT0gbXlJZCkgY29udGludWU7XG4gICAgICAgIGlmIChvdXQubGVuZ3RoID49IE1BWF9GT1JFSUdOX1BFRVJTKSBicmVhazsgLy8gYm91bmQgRG9TIHZpYSB1bmJvdW5kZWQgcGVlcnNcbiAgICAgICAgLy8gU2FuaXRpemUgZXZlcnkgbm93LXJlbW90ZSBmaWVsZCBhdCB0aGlzIHRydXN0IGJvdW5kYXJ5IChUYXNrIDUpLlxuICAgICAgICBjb25zdCBwZWVyID0gc2FuaXRpemVGb3JlaWduU3RhdGUoY2xpZW50SUQsIHN0YXRlKTtcbiAgICAgICAgaWYgKHBlZXIpIG91dC5wdXNoKHBlZXIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG4gICAgc2V0UGVlcnMoY29tcHV0ZSgpKTtcbiAgICBjb25zdCBvbkNoYW5nZSA9ICgpID0+IHNldFBlZXJzKGNvbXB1dGUoKSk7XG4gICAgYXdhcmVuZXNzLm9uKCdjaGFuZ2UnLCBvbkNoYW5nZSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGF3YXJlbmVzcy5vZmYoJ2NoYW5nZScsIG9uQ2hhbmdlKTtcbiAgICB9O1xuICB9LCBbY29sbGFiXSk7XG5cbiAgcmV0dXJuIHBlZXJzO1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFNsdWcgZGVyaXZhdGlvbiDigJQgbXVzdCBtYXRjaCBgYXBpLmZpbGVTbHVnYCBzZXJ2ZXItc2lkZS5cblxuLyoqXG4gKiBNaXJyb3Igb2Ygc2VydmVyLXNpZGUgYGFwaS5maWxlU2x1Z2AuIFRoZSBpbnB1dCBpcyB0aGUgY2FudmFzIHBhdGggYXMgdGhlXG4gKiBzaGVsbCBzdG9yZWQgaXQgb24gYHdpbmRvdy5fX2NhbnZhc19tZXRhX2ZpbGVfX2AgKGUuZy4gYC5kZXNpZ24vdWkvRm9vLnRzeGApLlxuICogU3RyaXAgdGhlIGRlc2lnblJlbCBwcmVmaXggKHJlYWQgZnJvbSBgd2luZG93Ll9fY2FudmFzX2Rlc2lnbl9yZWxfX2AsIHNldFxuICogYnkgX3NoZWxsLmh0bWwpIHNvIGJvdGggc2lkZXMgbGFuZCBvbiB0aGUgc2FtZSBzbHVnIOKAlCB3aXRob3V0IHRoaXMgYm90aFxuICogdGFicyBvcGVuIGEgYGRlc2lnbi11aS1mb29gIHJvb20gd2hpbGUgdGhlIHNlcnZlcidzIGluc3BlY3RvciBicmlkZ2VcbiAqIHB1c2hlcyBpbnRvIGB1aS1mb29gLCBhbmQgdGhlIHJvb21zIG5ldmVyIGNvbnZlcmdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FudmFzU2x1Z0Zyb21QYXRoKGNhbnZhc1JlbDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IG51bGwge1xuICBpZiAoIWNhbnZhc1JlbCkgcmV0dXJuIG51bGw7XG4gIGxldCBwID0gY2FudmFzUmVsLnJlcGxhY2UoL15cXC8rfFxcLyskL2csICcnKTtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgY29uc3QgdyA9IHdpbmRvdyBhcyB1bmtub3duIGFzIHsgX19jYW52YXNfZGVzaWduX3JlbF9fPzogc3RyaW5nIH07XG4gICAgY29uc3QgZGVzaWduUmVsID0gKHcuX19jYW52YXNfZGVzaWduX3JlbF9fID8/ICcnKS5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCAnJyk7XG4gICAgaWYgKGRlc2lnblJlbCAmJiBwLnN0YXJ0c1dpdGgoYCR7ZGVzaWduUmVsfS9gKSkgcCA9IHAuc2xpY2UoZGVzaWduUmVsLmxlbmd0aCArIDEpO1xuICB9XG4gIGNvbnN0IHNsdWcgPSBwXG4gICAgLnJlcGxhY2UoL1xcLy9nLCAnLScpXG4gICAgLnJlcGxhY2UoL1xccysvZywgJ18nKVxuICAgIC5yZXBsYWNlKC9cXC4odHN4fGh0bWwpJC9pLCAnJylcbiAgICAucmVwbGFjZSgvXlxcLisvLCAnJylcbiAgICAudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIC9eW2EtejAtOV8tXSskLy50ZXN0KHNsdWcpID8gc2x1ZyA6IG51bGw7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gUHJvdmlkZXIg4oCUIG9wZW5zIFdTLCBvd25zIFkuRG9jICsgQXdhcmVuZXNzIGxpZmVjeWNsZS5cblxuaW50ZXJmYWNlIENvbGxhYlByb3ZpZGVyUHJvcHMge1xuICAvKiogQ2FudmFzIHNsdWcg4oCUIG11c3QgbWF0Y2ggc2VydmVyLXNpZGUgYHBhcnNlQ29sbGFiU2x1Z2AuICovXG4gIHNsdWc6IHN0cmluZztcbiAgY2hpbGRyZW46IFJlYWN0Tm9kZTtcbn1cblxuY29uc3QgQVdBUkVORVNTX1RIUk9UVExFX01TID0gMzM7IC8vIH4zMCBIelxuXG5leHBvcnQgZnVuY3Rpb24gQ29sbGFiUHJvdmlkZXIoeyBzbHVnLCBjaGlsZHJlbiB9OiBDb2xsYWJQcm92aWRlclByb3BzKTogSlNYLkVsZW1lbnQge1xuICAvLyBZLkRvYyArIEF3YXJlbmVzcyBhcmUgcmVjcmVhdGVkIHdoZW5ldmVyIHRoZSBzbHVnIGNoYW5nZXMgKHN3aXRjaGluZ1xuICAvLyBjYW52YXNlcyB0ZWFycyBkb3duIHRoZSBwcmlvciBzZXNzaW9uIGNsZWFubHkpLiBUaGUgdXNlTWVtbyBmYWN0b3J5XG4gIC8vIGJvZGllcyBkb24ndCByZWFkIGBzbHVnYCDigJQgc2x1ZyBJUyB0aGUgY2FjaGUga2V5LCBpbnRlbnRpb25hbGx5LlxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb3JyZWN0bmVzcy91c2VFeGhhdXN0aXZlRGVwZW5kZW5jaWVzOiBzbHVnIGlzIHRoZSBjYWNoZSBrZXlcbiAgY29uc3QgZG9jID0gdXNlTWVtbygoKSA9PiBuZXcgWS5Eb2MoKSwgW3NsdWddKTtcbiAgY29uc3QgYXdhcmVuZXNzID0gdXNlTWVtbygoKSA9PiBuZXcgQXdhcmVuZXNzKGRvYyksIFtkb2NdKTtcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29ycmVjdG5lc3MvdXNlRXhoYXVzdGl2ZURlcGVuZGVuY2llczogc2x1ZyBpcyB0aGUgY2FjaGUga2V5XG4gIGNvbnN0IG15Q29ubklkID0gdXNlTWVtbygoKSA9PiBjcnlwdG8ucmFuZG9tVVVJRCgpLCBbc2x1Z10pO1xuXG4gIGNvbnN0IFtteU5hbWUsIHNldE15TmFtZV0gPSB1c2VTdGF0ZSgnYW5vbnltb3VzJyk7XG4gIGNvbnN0IFtteUNvbG9yLCBzZXRNeUNvbG9yXSA9IHVzZVN0YXRlKGNvbG9yRm9yTmFtZSgnYW5vbnltb3VzJykpO1xuICBjb25zdCBbY29ubmVjdGVkLCBzZXRDb25uZWN0ZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gIC8vIEZldGNoIGdpdCB1c2VyLm5hbWUgb25jZSBwZXIgc2x1ZzsgZmFsbHMgYmFjayB0byBhbm9ueW1vdXMtPHNob3J0IGlkPi5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBsZXQgY2FuY2VsbGVkID0gZmFsc2U7XG4gICAgZmV0Y2goJy9fYXBpL2dpdC11c2VyJylcbiAgICAgIC50aGVuKChyKSA9PiByLmpzb24oKSlcbiAgICAgIC50aGVuKChqKSA9PiB7XG4gICAgICAgIGlmIChjYW5jZWxsZWQpIHJldHVybjtcbiAgICAgICAgY29uc3QgbiA9IHR5cGVvZiBqPy5uYW1lID09PSAnc3RyaW5nJyAmJiBqLm5hbWUudHJpbSgpID8gai5uYW1lLnRyaW0oKSA6IG51bGw7XG4gICAgICAgIGNvbnN0IGZpbmFsTmFtZSA9IG4gPz8gYGFub255bW91cy0ke215Q29ubklkLnNsaWNlKDAsIDYpfWA7XG4gICAgICAgIHNldE15TmFtZShmaW5hbE5hbWUpO1xuICAgICAgICBzZXRNeUNvbG9yKGNvbG9yRm9yTmFtZShmaW5hbE5hbWUpKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICBpZiAoY2FuY2VsbGVkKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGZhbGxiYWNrID0gYGFub255bW91cy0ke215Q29ubklkLnNsaWNlKDAsIDYpfWA7XG4gICAgICAgIHNldE15TmFtZShmYWxsYmFjayk7XG4gICAgICAgIHNldE15Q29sb3IoY29sb3JGb3JOYW1lKGZhbGxiYWNrKSk7XG4gICAgICB9KTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICB9O1xuICB9LCBbbXlDb25uSWRdKTtcblxuICAvLyBTZWVkIGxvY2FsIGF3YXJlbmVzcyBzdGF0ZSBpbW1lZGlhdGVseSBzbyBmb3JlaWduIHBlZXJzIHNlZSBvdXIgbmFtZSBldmVuXG4gIC8vIGJlZm9yZSB0aGUgY3Vyc29yIG1vdmVzLiBVcGRhdGUgd2hlbiBteU5hbWUvbXlDb2xvciBzZXR0bGVzIGZyb20gdGhlIGZldGNoLlxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGF3YXJlbmVzcy5zZXRMb2NhbFN0YXRlKHtcbiAgICAgIG5hbWU6IG15TmFtZSxcbiAgICAgIGNvbG9yOiBteUNvbG9yLFxuICAgICAgY3Vyc29yOiBudWxsLFxuICAgICAgc2VsZWN0aW9uOiBudWxsLFxuICAgICAgYW5ub3RhdGlvblNlbGVjdGlvbjogW10sXG4gICAgICB2aWV3cG9ydDogeyB4OiAwLCB5OiAwLCB6b29tOiAxIH0sXG4gICAgICBfX2Nvbm5JZDogbXlDb25uSWQsXG4gICAgfSBzYXRpc2ZpZXMgQ29sbGFiQXdhcmVuZXNzU3RhdGUpO1xuICB9LCBbYXdhcmVuZXNzLCBteU5hbWUsIG15Q29sb3IsIG15Q29ubklkXSk7XG5cbiAgLy8g4pSA4pSAIFdlYlNvY2tldCBsaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGNvbnN0IHdzUmVmID0gdXNlUmVmPFdlYlNvY2tldCB8IG51bGw+KG51bGwpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgbGV0IGNhbmNlbGxlZCA9IGZhbHNlO1xuICAgIGxldCByZWNvbm5lY3RUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcblxuICAgIGZ1bmN0aW9uIHNlbmRGcmFtZSh3czogV2ViU29ja2V0LCBwYXlsb2FkOiBVaW50OEFycmF5KSB7XG4gICAgICB0cnkge1xuICAgICAgICB3cy5zZW5kKHBheWxvYWQpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8qIGRlYWQgc29ja2V0IOKAlCBjbG9zZSBoYW5kbGVyIHdpbGwgcmVjb25uZWN0ICovXG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYnJvYWRjYXN0QXdhcmVuZXNzKHdzOiBXZWJTb2NrZXQsIGNoYW5nZWQ6IG51bWJlcltdKSB7XG4gICAgICBpZiAoY2hhbmdlZC5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAgIGNvbnN0IGVuY29kZXIgPSBlbmNvZGluZy5jcmVhdGVFbmNvZGVyKCk7XG4gICAgICBlbmNvZGluZy53cml0ZVZhclVpbnQoZW5jb2RlciwgTUVTU0FHRV9BV0FSRU5FU1MpO1xuICAgICAgZW5jb2Rpbmcud3JpdGVWYXJVaW50OEFycmF5KGVuY29kZXIsIGVuY29kZUF3YXJlbmVzc1VwZGF0ZShhd2FyZW5lc3MsIGNoYW5nZWQpKTtcbiAgICAgIHNlbmRGcmFtZSh3cywgZW5jb2RpbmcudG9VaW50OEFycmF5KGVuY29kZXIpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBicm9hZGNhc3RTeW5jVXBkYXRlKHdzOiBXZWJTb2NrZXQsIHVwZGF0ZTogVWludDhBcnJheSkge1xuICAgICAgY29uc3QgZW5jb2RlciA9IGVuY29kaW5nLmNyZWF0ZUVuY29kZXIoKTtcbiAgICAgIGVuY29kaW5nLndyaXRlVmFyVWludChlbmNvZGVyLCBNRVNTQUdFX1NZTkMpO1xuICAgICAgd3JpdGVVcGRhdGUoZW5jb2RlciwgdXBkYXRlKTtcbiAgICAgIHNlbmRGcmFtZSh3cywgZW5jb2RpbmcudG9VaW50OEFycmF5KGVuY29kZXIpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb25uZWN0KCkge1xuICAgICAgaWYgKGNhbmNlbGxlZCkgcmV0dXJuO1xuICAgICAgY29uc3QgcHJvdG8gPSBsb2NhdGlvbi5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyAnd3NzOicgOiAnd3M6JztcbiAgICAgIGNvbnN0IHdzID0gbmV3IFdlYlNvY2tldChgJHtwcm90b30vLyR7bG9jYXRpb24uaG9zdH0vX3dzL2NvbGxhYi8ke3NsdWd9YCk7XG4gICAgICB3cy5iaW5hcnlUeXBlID0gJ2FycmF5YnVmZmVyJztcbiAgICAgIHdzUmVmLmN1cnJlbnQgPSB3cztcblxuICAgICAgd3MuYWRkRXZlbnRMaXN0ZW5lcignb3BlbicsICgpID0+IHtcbiAgICAgICAgc2V0Q29ubmVjdGVkKHRydWUpO1xuICAgICAgICAvLyBTeW5jIHN0ZXAgMSDigJQgYW5ub3VuY2Ugb3VyIHN0YXRlIHZlY3RvciBzbyB0aGUgc2VydmVyIGNhbiBzZW5kIHRoZVxuICAgICAgICAvLyBtaXNzaW5nIHBpZWNlcyAobWF0Y2hlcyB0aGUgZW5jb2RlSGFuZHNoYWtlIHNlcnZlciBwYXRoKS5cbiAgICAgICAgY29uc3QgZW5jb2RlciA9IGVuY29kaW5nLmNyZWF0ZUVuY29kZXIoKTtcbiAgICAgICAgZW5jb2Rpbmcud3JpdGVWYXJVaW50KGVuY29kZXIsIE1FU1NBR0VfU1lOQyk7XG4gICAgICAgIHdyaXRlU3luY1N0ZXAxKGVuY29kZXIsIGRvYyk7XG4gICAgICAgIHNlbmRGcmFtZSh3cywgZW5jb2RpbmcudG9VaW50OEFycmF5KGVuY29kZXIpKTtcbiAgICAgICAgLy8gQXdhcmVuZXNzIGluaXRpYWwgc3RhdGUg4oCUIGZpcmUgb3VyIGxvY2FsIHN0YXRlIHRvIHRoZSByb29tLlxuICAgICAgICBicm9hZGNhc3RBd2FyZW5lc3Mod3MsIFthd2FyZW5lc3MuY2xpZW50SURdKTtcbiAgICAgIH0pO1xuXG4gICAgICB3cy5hZGRFdmVudExpc3RlbmVyKCdjbG9zZScsICgpID0+IHtcbiAgICAgICAgc2V0Q29ubmVjdGVkKGZhbHNlKTtcbiAgICAgICAgd3NSZWYuY3VycmVudCA9IG51bGw7XG4gICAgICAgIGlmIChjYW5jZWxsZWQpIHJldHVybjtcbiAgICAgICAgcmVjb25uZWN0VGltZXIgPSBzZXRUaW1lb3V0KGNvbm5lY3QsIDEwMDApO1xuICAgICAgfSk7XG5cbiAgICAgIHdzLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKCkgPT4ge1xuICAgICAgICAvLyBMZXQgY2xvc2UgaGFuZGxlciBkbyB0aGUgcmVjb25uZWN0OyBlcnJvciBldmVudHMgd2l0aG91dCBhIGNsb3NlXG4gICAgICAgIC8vIHdvdWxkIGp1c3QgcmV0cnktc3BhbS5cbiAgICAgIH0pO1xuXG4gICAgICB3cy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKGV2dCkgPT4ge1xuICAgICAgICBjb25zdCBwYXlsb2FkID1cbiAgICAgICAgICBldnQuZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyXG4gICAgICAgICAgICA/IG5ldyBVaW50OEFycmF5KGV2dC5kYXRhKVxuICAgICAgICAgICAgOiBldnQuZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXlcbiAgICAgICAgICAgICAgPyBldnQuZGF0YVxuICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgIGlmICghcGF5bG9hZCkgcmV0dXJuO1xuICAgICAgICBjb25zdCBkZWNvZGVyID0gZGVjb2RpbmcuY3JlYXRlRGVjb2RlcihwYXlsb2FkKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZVR5cGUgPSBkZWNvZGluZy5yZWFkVmFyVWludChkZWNvZGVyKTtcbiAgICAgICAgc3dpdGNoIChtZXNzYWdlVHlwZSkge1xuICAgICAgICAgIGNhc2UgTUVTU0FHRV9TWU5DOiB7XG4gICAgICAgICAgICBjb25zdCBlbmNvZGVyID0gZW5jb2RpbmcuY3JlYXRlRW5jb2RlcigpO1xuICAgICAgICAgICAgZW5jb2Rpbmcud3JpdGVWYXJVaW50KGVuY29kZXIsIE1FU1NBR0VfU1lOQyk7XG4gICAgICAgICAgICByZWFkU3luY01lc3NhZ2UoZGVjb2RlciwgZW5jb2RlciwgZG9jLCB3cyk7XG4gICAgICAgICAgICBpZiAoZW5jb2RpbmcubGVuZ3RoKGVuY29kZXIpID4gMSkgc2VuZEZyYW1lKHdzLCBlbmNvZGluZy50b1VpbnQ4QXJyYXkoZW5jb2RlcikpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgTUVTU0FHRV9BV0FSRU5FU1M6IHtcbiAgICAgICAgICAgIGFwcGx5QXdhcmVuZXNzVXBkYXRlKGF3YXJlbmVzcywgZGVjb2RpbmcucmVhZFZhclVpbnQ4QXJyYXkoZGVjb2RlciksIHdzKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFdpcmUgZG9jIHVwZGF0ZXMg4oaSIGJyb2FkY2FzdCB0byBzZXJ2ZXIuIE9yaWdpbiB0YWdnZWQgd2l0aCB0aGUgd3MgcmVmIHNvXG4gICAgLy8gc2VydmVyLXNpZGUgdXBkYXRlcyB3ZSByZWNlaXZlIGRvbid0IGVjaG8gYmFjay5cbiAgICBjb25zdCBvbkRvY1VwZGF0ZSA9ICh1cGRhdGU6IFVpbnQ4QXJyYXksIG9yaWdpbjogdW5rbm93bikgPT4ge1xuICAgICAgY29uc3Qgd3MgPSB3c1JlZi5jdXJyZW50O1xuICAgICAgaWYgKCF3cyB8fCB3cy5yZWFkeVN0YXRlICE9PSBXZWJTb2NrZXQuT1BFTikgcmV0dXJuO1xuICAgICAgaWYgKG9yaWdpbiA9PT0gd3MpIHJldHVybjsgLy8gY2FtZSBmcm9tIHNlcnZlciwgZG9uJ3QgZWNob1xuICAgICAgYnJvYWRjYXN0U3luY1VwZGF0ZSh3cywgdXBkYXRlKTtcbiAgICB9O1xuICAgIGRvYy5vbigndXBkYXRlJywgb25Eb2NVcGRhdGUpO1xuXG4gICAgLy8gV2lyZSBhd2FyZW5lc3MgY2hhbmdlcyDihpIgYnJvYWRjYXN0LiBTYW1lIG9yaWdpbiBndWFyZC5cbiAgICBjb25zdCBvbkF3YXJlbmVzc1VwZGF0ZSA9IChcbiAgICAgIHsgYWRkZWQsIHVwZGF0ZWQsIHJlbW92ZWQgfTogeyBhZGRlZDogbnVtYmVyW107IHVwZGF0ZWQ6IG51bWJlcltdOyByZW1vdmVkOiBudW1iZXJbXSB9LFxuICAgICAgb3JpZ2luOiB1bmtub3duXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCB3cyA9IHdzUmVmLmN1cnJlbnQ7XG4gICAgICBpZiAoIXdzIHx8IHdzLnJlYWR5U3RhdGUgIT09IFdlYlNvY2tldC5PUEVOKSByZXR1cm47XG4gICAgICBpZiAob3JpZ2luID09PSB3cykgcmV0dXJuO1xuICAgICAgY29uc3QgY2hhbmdlZCA9IGFkZGVkLmNvbmNhdCh1cGRhdGVkLCByZW1vdmVkKTtcbiAgICAgIGJyb2FkY2FzdEF3YXJlbmVzcyh3cywgY2hhbmdlZCk7XG4gICAgfTtcbiAgICBhd2FyZW5lc3Mub24oJ3VwZGF0ZScsIG9uQXdhcmVuZXNzVXBkYXRlKTtcblxuICAgIGNvbm5lY3QoKTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgaWYgKHJlY29ubmVjdFRpbWVyKSBjbGVhclRpbWVvdXQocmVjb25uZWN0VGltZXIpO1xuICAgICAgZG9jLm9mZigndXBkYXRlJywgb25Eb2NVcGRhdGUpO1xuICAgICAgYXdhcmVuZXNzLm9mZigndXBkYXRlJywgb25Bd2FyZW5lc3NVcGRhdGUpO1xuICAgICAgY29uc3Qgd3MgPSB3c1JlZi5jdXJyZW50O1xuICAgICAgaWYgKHdzICYmIHdzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5PUEVOKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgd3MuY2xvc2UoKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLyogaWdub3JlICovXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIERvbid0IGRlc3Ryb3kgZG9jL2F3YXJlbmVzcyBoZXJlIOKAlCB0aGUgdXNlTWVtby10aWVkIGxpZmV0aW1lIGhhbmRsZXNcbiAgICAgIC8vIHRoYXQgd2hlbiB0aGUgc2x1ZyBjaGFuZ2VzLlxuICAgIH07XG4gIH0sIFtzbHVnLCBkb2MsIGF3YXJlbmVzc10pO1xuXG4gIC8vIFBlci1zbHVnIGNsZWFudXAgb2YgZG9jL2F3YXJlbmVzcyB3aGVuIHNsdWcgY2hhbmdlcyAob3IgcHJvdmlkZXIgdW5tb3VudHMpLlxuICB1c2VFZmZlY3QoXG4gICAgKCkgPT4gKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhcmVuZXNzLmRlc3Ryb3koKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvKiBpZ25vcmUgKi9cbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGRvYy5kZXN0cm95KCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogaWdub3JlICovXG4gICAgICB9XG4gICAgfSxcbiAgICBbZG9jLCBhd2FyZW5lc3NdXG4gICk7XG5cbiAgLy8g4pSA4pSAIFRocm90dGxlZCBhd2FyZW5lc3MgcHVibGlzaCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgY29uc3QgcGVuZGluZ1JlZiA9IHVzZVJlZjxQYXJ0aWFsPE9taXQ8Q29sbGFiQXdhcmVuZXNzU3RhdGUsICdfX2Nvbm5JZCc+PiB8IG51bGw+KG51bGwpO1xuICBjb25zdCB0aHJvdHRsZVRpbWVyUmVmID0gdXNlUmVmPFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbD4obnVsbCk7XG5cbiAgY29uc3QgcHVibGlzaEF3YXJlbmVzcyA9IHVzZUNhbGxiYWNrKFxuICAgIChwYXRjaDogUGFydGlhbDxPbWl0PENvbGxhYkF3YXJlbmVzc1N0YXRlLCAnX19jb25uSWQnPj4pID0+IHtcbiAgICAgIHBlbmRpbmdSZWYuY3VycmVudCA9IHsgLi4uKHBlbmRpbmdSZWYuY3VycmVudCA/PyB7fSksIC4uLnBhdGNoIH07XG4gICAgICBpZiAodGhyb3R0bGVUaW1lclJlZi5jdXJyZW50KSByZXR1cm47XG4gICAgICB0aHJvdHRsZVRpbWVyUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhyb3R0bGVUaW1lclJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgY29uc3QgbmV4dCA9IHBlbmRpbmdSZWYuY3VycmVudDtcbiAgICAgICAgcGVuZGluZ1JlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgaWYgKCFuZXh0KSByZXR1cm47XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSAoYXdhcmVuZXNzLmdldExvY2FsU3RhdGUoKSA/PyB7fSkgYXMgUGFydGlhbDxDb2xsYWJBd2FyZW5lc3NTdGF0ZT47XG4gICAgICAgIGF3YXJlbmVzcy5zZXRMb2NhbFN0YXRlKHtcbiAgICAgICAgICBuYW1lOiBjdXJyZW50Lm5hbWUgPz8gbXlOYW1lLFxuICAgICAgICAgIGNvbG9yOiBjdXJyZW50LmNvbG9yID8/IG15Q29sb3IsXG4gICAgICAgICAgY3Vyc29yOiBjdXJyZW50LmN1cnNvciA/PyBudWxsLFxuICAgICAgICAgIHNlbGVjdGlvbjogY3VycmVudC5zZWxlY3Rpb24gPz8gbnVsbCxcbiAgICAgICAgICBhbm5vdGF0aW9uU2VsZWN0aW9uOiBjdXJyZW50LmFubm90YXRpb25TZWxlY3Rpb24gPz8gW10sXG4gICAgICAgICAgdmlld3BvcnQ6IGN1cnJlbnQudmlld3BvcnQgPz8geyB4OiAwLCB5OiAwLCB6b29tOiAxIH0sXG4gICAgICAgICAgX19jb25uSWQ6IG15Q29ubklkLFxuICAgICAgICAgIC4uLm5leHQsXG4gICAgICAgIH0gc2F0aXNmaWVzIENvbGxhYkF3YXJlbmVzc1N0YXRlKTtcbiAgICAgIH0sIEFXQVJFTkVTU19USFJPVFRMRV9NUyk7XG4gICAgfSxcbiAgICBbYXdhcmVuZXNzLCBteU5hbWUsIG15Q29sb3IsIG15Q29ubklkXVxuICApO1xuXG4gIC8vIOKUgOKUgCBDbGVhbnVwIHRocm90dGxlIHRpbWVyIG9uIHVubW91bnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHVzZUVmZmVjdChcbiAgICAoKSA9PiAoKSA9PiB7XG4gICAgICBpZiAodGhyb3R0bGVUaW1lclJlZi5jdXJyZW50KSBjbGVhclRpbWVvdXQodGhyb3R0bGVUaW1lclJlZi5jdXJyZW50KTtcbiAgICB9LFxuICAgIFtdXG4gICk7XG5cbiAgY29uc3QgdmFsdWUgPSB1c2VNZW1vPENvbGxhYlZhbHVlPihcbiAgICAoKSA9PiAoe1xuICAgICAgZG9jLFxuICAgICAgYXdhcmVuZXNzLFxuICAgICAgbXlDb2xvcixcbiAgICAgIG15TmFtZSxcbiAgICAgIG15Q29ubklkLFxuICAgICAgY29ubmVjdGVkLFxuICAgICAgcHVibGlzaEF3YXJlbmVzcyxcbiAgICB9KSxcbiAgICBbZG9jLCBhd2FyZW5lc3MsIG15Q29sb3IsIG15TmFtZSwgbXlDb25uSWQsIGNvbm5lY3RlZCwgcHVibGlzaEF3YXJlbmVzc11cbiAgKTtcblxuICByZXR1cm4gPENvbGxhYkNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3ZhbHVlfT57Y2hpbGRyZW59PC9Db2xsYWJDb250ZXh0LlByb3ZpZGVyPjtcbn1cbiIsCiAgICAiLyoqXG4gKiBAZmlsZSAgICAgICB1c2Utc2VsZWN0aW9uLXNldC50c3gg4oCUIFBoYXNlIDQuMSBtdWx0aS1zZWxlY3Rpb24gc3RvcmVcbiAqIEBzY29wZSAgICAgIGFwcHMvc3R1ZGlvL3VzZS1zZWxlY3Rpb24tc2V0LnRzeFxuICogQHB1cnBvc2UgICAgTXVsdGktZWxlbWVudCBzZWxlY3Rpb24gc3RhdGUgZm9yIGNhbnZhcy1zaGVsbC4gVGhlIGNhbnZhc1xuICogICAgICAgICAgICAgaW5wdXQgcm91dGVyIGNhbGxzIGByZXBsYWNlKClgIC8gYGFkZCgpYCAvIGBjbGVhcigpYDtcbiAqICAgICAgICAgICAgIHRoZSBwcm92aWRlciBkZWJvdW5jZXMgYW5kIHBvc3RzIHVwIHRvIHRoZSBkZXYtc2VydmVyIHNoZWxsXG4gKiAgICAgICAgICAgICB0aHJvdWdoIHRoZSBleGlzdGluZyBgX19kZXNpZ25fc2VsZWN0ZWRgIHdpbmRvdy5wYXJlbnQgY2hhbm5lbFxuICogICAgICAgICAgICAgc28gYF9hY3RpdmUuanNvbmAgcmVmbGVjdHMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHNldC5cbiAqXG4gKiBTY2hlbWEgbWlncmF0aW9uLiBgX2FjdGl2ZS5qc29uI3NlbGVjdGVkYCBoaXN0b3JpY2FsbHkgaG9sZHNcbiAqICAgICBzZWxlY3RlZDogU2VsZWN0ZWRFbGVtZW50IHwgbnVsbFxuICogUGhhc2UgNC4xIHdpZGVucyB0b1xuICogICAgIHNlbGVjdGVkOiBTZWxlY3RlZEVsZW1lbnQgfCBTZWxlY3RlZEVsZW1lbnRbXSB8IG51bGxcbiAqIFdyaXRlcjogZW1pdHMgYSBzaW5nbGUgb2JqZWN0IHdoZW4gTiA9PT0gMSAoYmFjay1jb21wYXQgd2l0aCBkb3duc3RyZWFtXG4gKiB0b29scyB0aGF0IHN0aWxsIHJlYWQgdGhlIGxlZ2FjeSBzaGFwZSDigJQgYC9kZXNpZ246ZWRpdGAsIGhhbmRvZmYpLiBFbWl0cyBhblxuICogYXJyYXkgd2hlbiBOID4gMS4gUmVhZGVyICh0aGlzIGhvb2sgb24gcmVoeWRyYXRlKSBhY2NlcHRzIGFsbCB0aHJlZS5cbiAqL1xuXG5pbXBvcnQge1xuICBjcmVhdGVDb250ZXh0LFxuICB0eXBlIFJlYWN0Tm9kZSxcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUNvbnRleHQsXG4gIHVzZUVmZmVjdCxcbiAgdXNlTWVtbyxcbiAgdXNlUmVmLFxuICB1c2VTdGF0ZSxcbn0gZnJvbSAncmVhY3QnO1xuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFR5cGVzXG5cbi8qKlxuICogTWluaW1hbCBTZWxlY3Rpb24gc2hhcGUgdGhhdCB0cmF2ZWxzIHRocm91Z2ggdGhlIHBhcmVudCBwb3N0TWVzc2FnZSBjaGFubmVsLlxuICogTWlycm9ycyBgU2VsZWN0ZWRFbGVtZW50YCBmcm9tIGluc3BlY3QudHMgYnV0IHRoZSBjYW52YXMgcm91dGVyIGNvbXB1dGVzIGl0XG4gKiBjbGllbnQtc2lkZSBhbmQgdGhlIGluc3BlY3RvciBvdmVybGF5J3MgZW5yaWNobWVudCBmaWVsZHMgKGh0bWwgZXhjZXJwdCxcbiAqIGRvbV9wYXRoLCBjbGFzc2VzLi4uKSBhcmUgZmlsbGVkIGluIGJ5IHRoZSByb3V0ZXIgcmlnaHQgYmVmb3JlIHRoZSBtZXNzYWdlXG4gKiBpcyBwb3N0ZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0aW9uIHtcbiAgLyoqIENhbnZhcyBmaWxlIHBhdGgg4oCUIGRlc2lnblJlbC1wcmVmaXhlZCAoZS5nLiBgLmRlc2lnbi91aS9Gb28udHN4YCkuICovXG4gIGZpbGU/OiBzdHJpbmc7XG4gIC8qKiBTdGFibGUgYGRhdGEtY2QtaWRgIGFuY2hvciB3aGVuIHByZXNlbnQuIHYyLWdyYWRlIG9ubHkuICovXG4gIGlkPzogc3RyaW5nO1xuICAvKiogQ1NTLXNlbGVjdG9yIGZhbGxiYWNrIHBhdGggKGFsd2F5cyBwcmVzZW50KS4gKi9cbiAgc2VsZWN0b3I6IHN0cmluZztcbiAgLyoqIEFydGJvYXJkIGhvc3QgKGBkYXRhLWRjLXNjcmVlbmApIOKAlCBmb3Igc2NvcGluZyBtdWx0aS1lZGl0cyBpbiBmdXR1cmUuICovXG4gIGFydGJvYXJkSWQ/OiBzdHJpbmcgfCBudWxsO1xuICAvKipcbiAgICogT2NjdXJyZW5jZSBpbmRleCBvZiB0aGlzIGVsZW1lbnQgYW1vbmcgYHF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpYC5cbiAgICogZGF0YS1jZC1pZCBpcyBzdGFtcGVkIHBlciBTT1VSQ0UgZWxlbWVudCwgc28gYSBjb21wb25lbnQgcmVuZGVyZWQgTiB0aW1lc1xuICAgKiAoYSBsaXN0IHJvdywgb3IgYSByZXVzYWJsZSB1c2VkIHR3aWNlKSB5aWVsZHMgTiBET00gbm9kZXMgd2l0aCB0aGUgU0FNRVxuICAgKiBpZCthcnRib2FyZCBzZWxlY3Rvci4gVGhlIGluZGV4IGRpc2FtYmlndWF0ZXMgd2hpY2ggaW5zdGFuY2Ug4oCUIHJlc29sdmVyc1xuICAgKiB1c2UgYHF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpW2luZGV4XWAuIEFic2VudC8wIOKGkiBmaXJzdCBtYXRjaC5cbiAgICovXG4gIGluZGV4PzogbnVtYmVyO1xuICAvKiogU25hcHNob3QgZmllbGRzIGZpbGxlZCBieSB0aGUgcm91dGVyIGZyb20gYHJlc29sdmVIb3ZlclRhcmdldGAuICovXG4gIHRhZz86IHN0cmluZztcbiAgY2xhc3Nlcz86IHN0cmluZztcbiAgdGV4dD86IHN0cmluZztcbiAgZG9tX3BhdGg/OiBzdHJpbmdbXTtcbiAgYm91bmRzPzogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgdzogbnVtYmVyOyBoOiBudW1iZXIgfSB8IG51bGw7XG4gIGh0bWw/OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBTZWxlY3Rpb25TZXRWYWx1ZSB7XG4gIHNlbGVjdGVkOiBTZWxlY3Rpb25bXTtcbiAgcmVwbGFjZTogKHM6IFNlbGVjdGlvbiB8IFNlbGVjdGlvbltdKSA9PiB2b2lkO1xuICBhZGQ6IChzOiBTZWxlY3Rpb24gfCBTZWxlY3Rpb25bXSkgPT4gdm9pZDtcbiAgcmVtb3ZlOiAoczogU2VsZWN0aW9uKSA9PiB2b2lkO1xuICB0b2dnbGU6IChzOiBTZWxlY3Rpb24pID0+IHZvaWQ7XG4gIGNsZWFyOiAoKSA9PiB2b2lkO1xufVxuXG5jb25zdCBTZWxlY3Rpb25TZXRDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxTZWxlY3Rpb25TZXRWYWx1ZSB8IG51bGw+KG51bGwpO1xuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIElkZW50aXR5LiBQcmVmZXIgYGlkYCAoZGF0YS1jZC1pZCBzdGFibGUgYW5jaG9yKTsgZmFsbCBiYWNrIHRvIHNlbGVjdG9yLlxuXG5mdW5jdGlvbiBzZWxlY3Rpb25LZXkoczogU2VsZWN0aW9uKTogc3RyaW5nIHtcbiAgcmV0dXJuIHMuaWQgPyBgaWQ6JHtzLmlkfWAgOiBgc2VsOiR7cy5zZWxlY3Rvcn1gO1xufVxuXG5mdW5jdGlvbiBkZWR1cGUobGlzdDogU2VsZWN0aW9uW10pOiBTZWxlY3Rpb25bXSB7XG4gIGNvbnN0IG91dDogU2VsZWN0aW9uW10gPSBbXTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHMgb2YgbGlzdCkge1xuICAgIGNvbnN0IGsgPSBzZWxlY3Rpb25LZXkocyk7XG4gICAgaWYgKHNlZW4uaGFzKGspKSBjb250aW51ZTtcbiAgICBzZWVuLmFkZChrKTtcbiAgICBvdXQucHVzaChzKTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFByb3ZpZGVyXG5cbmNvbnN0IFBPU1RfREVCT1VOQ0VfTVMgPSA1MDsgLy8gbWlycm9ycyBjYW52YXMtbGliJ3MgU0VUVExFL1BVQkxJU0ggY2FkZW5jZVxuXG5leHBvcnQgZnVuY3Rpb24gU2VsZWN0aW9uU2V0UHJvdmlkZXIoe1xuICBjaGlsZHJlbixcbiAgLyoqIE92ZXJyaWRlIHRoZSBwb3N0TWVzc2FnZSBkZXN0aW5hdGlvbiAodXNlZCBpbiB0ZXN0cykuICovXG4gIHBvc3RUYXJnZXQsXG59OiB7XG4gIGNoaWxkcmVuOiBSZWFjdE5vZGU7XG4gIHBvc3RUYXJnZXQ/OiB7IHBvc3RNZXNzYWdlOiAobXNnOiB1bmtub3duLCB0YXJnZXRPcmlnaW46IHN0cmluZykgPT4gdm9pZCB9IHwgbnVsbDtcbn0pIHtcbiAgY29uc3QgW3NlbGVjdGVkLCBzZXRTZWxlY3RlZF0gPSB1c2VTdGF0ZTxTZWxlY3Rpb25bXT4oW10pO1xuICBjb25zdCB0aW1lclJlZiA9IHVzZVJlZjxSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGw+KG51bGwpO1xuXG4gIGNvbnN0IHBvc3QgPSB1c2VDYWxsYmFjayhcbiAgICAobmV4dDogU2VsZWN0aW9uW10pID0+IHtcbiAgICAgIGlmICh0aW1lclJlZi5jdXJyZW50KSBjbGVhclRpbWVvdXQodGltZXJSZWYuY3VycmVudCk7XG4gICAgICB0aW1lclJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRpbWVyUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBwb3N0VGFyZ2V0ID8/ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdy5wYXJlbnQgOiBudWxsKTtcbiAgICAgICAgaWYgKCF0YXJnZXQpIHJldHVybjtcbiAgICAgICAgLy8gV2lyZSBzaGFwZTogc2luZ2xlIG9iamVjdCBmb3IgTj0xIChiYWNrLWNvbXBhdCksIGFycmF5IGZvciBOPjEsIG51bGwgZm9yIGVtcHR5LlxuICAgICAgICBjb25zdCBwYXlsb2FkOiBTZWxlY3Rpb24gfCBTZWxlY3Rpb25bXSB8IG51bGwgPVxuICAgICAgICAgIG5leHQubGVuZ3RoID09PSAwID8gbnVsbCA6IG5leHQubGVuZ3RoID09PSAxID8gKG5leHRbMF0gPz8gbnVsbCkgOiBuZXh0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRhcmdldC5wb3N0TWVzc2FnZSh7IGRnbjogJ3NlbGVjdC1zZXQnLCBzZWxlY3Rpb246IHBheWxvYWQgfSwgJyonKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLyogaWZyYW1lIGxpa2VseSBjcm9zcy1vcmlnaW4gb3IgZGV0YWNoZWQgKi9cbiAgICAgICAgfVxuICAgICAgfSwgUE9TVF9ERUJPVU5DRV9NUyk7XG4gICAgfSxcbiAgICBbcG9zdFRhcmdldF1cbiAgKTtcblxuICAvLyBDbGVhbnVwIHRoZSBkZWJvdW5jZSB0aW1lciBvbiB1bm1vdW50LlxuICB1c2VFZmZlY3QoXG4gICAgKCkgPT4gKCkgPT4ge1xuICAgICAgaWYgKHRpbWVyUmVmLmN1cnJlbnQpIGNsZWFyVGltZW91dCh0aW1lclJlZi5jdXJyZW50KTtcbiAgICB9LFxuICAgIFtdXG4gICk7XG5cbiAgY29uc3QgcmVwbGFjZSA9IHVzZUNhbGxiYWNrKFxuICAgIChzOiBTZWxlY3Rpb24gfCBTZWxlY3Rpb25bXSkgPT4ge1xuICAgICAgY29uc3QgbmV4dCA9IGRlZHVwZShBcnJheS5pc0FycmF5KHMpID8gcyA6IFtzXSk7XG4gICAgICBzZXRTZWxlY3RlZChuZXh0KTtcbiAgICAgIHBvc3QobmV4dCk7XG4gICAgfSxcbiAgICBbcG9zdF1cbiAgKTtcblxuICBjb25zdCBhZGQgPSB1c2VDYWxsYmFjayhcbiAgICAoczogU2VsZWN0aW9uIHwgU2VsZWN0aW9uW10pID0+IHtcbiAgICAgIGNvbnN0IGluY29taW5nID0gQXJyYXkuaXNBcnJheShzKSA/IHMgOiBbc107XG4gICAgICBzZXRTZWxlY3RlZCgocHJldikgPT4ge1xuICAgICAgICBjb25zdCBuZXh0ID0gZGVkdXBlKFsuLi5wcmV2LCAuLi5pbmNvbWluZ10pO1xuICAgICAgICBwb3N0KG5leHQpO1xuICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgW3Bvc3RdXG4gICk7XG5cbiAgY29uc3QgcmVtb3ZlID0gdXNlQ2FsbGJhY2soXG4gICAgKHM6IFNlbGVjdGlvbikgPT4ge1xuICAgICAgY29uc3QgayA9IHNlbGVjdGlvbktleShzKTtcbiAgICAgIHNldFNlbGVjdGVkKChwcmV2KSA9PiB7XG4gICAgICAgIGNvbnN0IG5leHQgPSBwcmV2LmZpbHRlcigoeCkgPT4gc2VsZWN0aW9uS2V5KHgpICE9PSBrKTtcbiAgICAgICAgcG9zdChuZXh0KTtcbiAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIFtwb3N0XVxuICApO1xuXG4gIGNvbnN0IHRvZ2dsZSA9IHVzZUNhbGxiYWNrKFxuICAgIChzOiBTZWxlY3Rpb24pID0+IHtcbiAgICAgIGNvbnN0IGsgPSBzZWxlY3Rpb25LZXkocyk7XG4gICAgICBzZXRTZWxlY3RlZCgocHJldikgPT4ge1xuICAgICAgICBjb25zdCBuZXh0ID0gcHJldi5zb21lKCh4KSA9PiBzZWxlY3Rpb25LZXkoeCkgPT09IGspXG4gICAgICAgICAgPyBwcmV2LmZpbHRlcigoeCkgPT4gc2VsZWN0aW9uS2V5KHgpICE9PSBrKVxuICAgICAgICAgIDogWy4uLnByZXYsIHNdO1xuICAgICAgICBwb3N0KG5leHQpO1xuICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgW3Bvc3RdXG4gICk7XG5cbiAgY29uc3QgY2xlYXIgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0U2VsZWN0ZWQoW10pO1xuICAgIHBvc3QoW10pO1xuICB9LCBbcG9zdF0pO1xuXG4gIGNvbnN0IHZhbHVlID0gdXNlTWVtbzxTZWxlY3Rpb25TZXRWYWx1ZT4oXG4gICAgKCkgPT4gKHsgc2VsZWN0ZWQsIHJlcGxhY2UsIGFkZCwgcmVtb3ZlLCB0b2dnbGUsIGNsZWFyIH0pLFxuICAgIFtzZWxlY3RlZCwgcmVwbGFjZSwgYWRkLCByZW1vdmUsIHRvZ2dsZSwgY2xlYXJdXG4gICk7XG5cbiAgcmV0dXJuIDxTZWxlY3Rpb25TZXRDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXt2YWx1ZX0+e2NoaWxkcmVufTwvU2VsZWN0aW9uU2V0Q29udGV4dC5Qcm92aWRlcj47XG59XG5cbi8qKlxuICogTW91bnQgYSBgU2VsZWN0aW9uU2V0UHJvdmlkZXJgIG9ubHkgd2hlbiBub25lIGV4aXN0cyBhYm92ZSB1cy4gVGhlIHNoZWxsLVxuICogb3duZWQgY29tbWVudCBtb3VudCBsYXllciBwcm92aWRlcyBvbmUgc28gYm90aCB0aGUgbGl0ZSBjb21tZW50IHJvdXRlciBhbmRcbiAqIGBDYW52YXNTaGVsbGAgc2hhcmUgYSBzaW5nbGUgc2VsZWN0aW9uIHNldC4gSG9vayBjYWxsZWQgdW5jb25kaXRpb25hbGx5O1xuICogb25seSB0aGUgcmV0dXJuZWQgdHJlZSBicmFuY2hlcyAoaG9vayBydWxlcykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBNYXliZVNlbGVjdGlvblNldFByb3ZpZGVyKHsgY2hpbGRyZW4gfTogeyBjaGlsZHJlbjogUmVhY3ROb2RlIH0pIHtcbiAgY29uc3Qgb3V0ZXIgPSB1c2VDb250ZXh0KFNlbGVjdGlvblNldENvbnRleHQpO1xuICBpZiAob3V0ZXIpIHJldHVybiA8PntjaGlsZHJlbn08Lz47XG4gIHJldHVybiA8U2VsZWN0aW9uU2V0UHJvdmlkZXI+e2NoaWxkcmVufTwvU2VsZWN0aW9uU2V0UHJvdmlkZXI+O1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEhvb2tzXG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VTZWxlY3Rpb25TZXQoKTogU2VsZWN0aW9uU2V0VmFsdWUge1xuICBjb25zdCBjdHggPSB1c2VDb250ZXh0KFNlbGVjdGlvblNldENvbnRleHQpO1xuICBpZiAoIWN0eCkge1xuICAgIHRocm93IG5ldyBFcnJvcigndXNlU2VsZWN0aW9uU2V0IG11c3QgYmUgdXNlZCBpbnNpZGUgPFNlbGVjdGlvblNldFByb3ZpZGVyPicpO1xuICB9XG4gIHJldHVybiBjdHg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VTZWxlY3Rpb25TZXRPcHRpb25hbCgpOiBTZWxlY3Rpb25TZXRWYWx1ZSB8IG51bGwge1xuICByZXR1cm4gdXNlQ29udGV4dChTZWxlY3Rpb25TZXRDb250ZXh0KTtcbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBXaXJlLXNoYXBlIGhlbHBlcnMg4oCUIGV4cG9ydGVkIGZvciB0ZXN0cyBhbmQgaW5zcGVjdC50cyBiYWNrLWNvbXBhdCByZWFkZXIuXG5cbi8qKiBDb252ZXJ0IGFueSBpbmJvdW5kIHNoYXBlIHRvIGFuIGFycmF5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVNlbGVjdGVkUmVhZChcbiAgcmF3OiBTZWxlY3Rpb24gfCBTZWxlY3Rpb25bXSB8IG51bGwgfCB1bmRlZmluZWRcbik6IFNlbGVjdGlvbltdIHtcbiAgaWYgKHJhdyA9PSBudWxsKSByZXR1cm4gW107XG4gIGlmIChBcnJheS5pc0FycmF5KHJhdykpIHJldHVybiBkZWR1cGUocmF3KTtcbiAgcmV0dXJuIFtyYXddO1xufVxuXG4vKiogQ29udmVydCBpbnRlcm5hbCBhcnJheSBiYWNrIHRvIHRoZSB3aXJlIHNoYXBlICh3cml0ZXIpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlbm9ybWFsaXplU2VsZWN0ZWRXcml0ZShsaXN0OiBTZWxlY3Rpb25bXSk6IFNlbGVjdGlvbiB8IFNlbGVjdGlvbltdIHwgbnVsbCB7XG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMSkgcmV0dXJuIGxpc3RbMF0gPz8gbnVsbDtcbiAgcmV0dXJuIGxpc3Q7XG59XG4iLAogICAgIi8qKlxuICogQGZpbGUgICAgICAgZG9tLXNlbGVjdGlvbi50cyDigJQgc2VsZWN0aW9uLWZyb20tRE9NIGhlbHBlcnMgKGxlYWYgbW9kdWxlKVxuICogQHNjb3BlICAgICAgYXBwcy9zdHVkaW8vZG9tLXNlbGVjdGlvbi50c1xuICogQHB1cnBvc2UgICAgUHVyZSBET00g4oaSIFNlbGVjdGlvbiBidWlsZGVycyBzaGFyZWQgYnkgdGhlIGNhbnZhcyBjaHJvbWVcbiAqICAgICAgICAgICAgIChjYW52YXMtc2hlbGwudHN4KSBhbmQgdGhlIHNoZWxsLW93bmVkIGNvbW1lbnQgbW91bnQgbGF5ZXJcbiAqICAgICAgICAgICAgIChjYW52YXMtY29tbWVudC1tb3VudC50c3gpLiBMaXZlcyBpbiBpdHMgb3duIGxlYWYgbW9kdWxlIOKAlCBub1xuICogICAgICAgICAgICAgUmVhY3QsIG5vIGNhbnZhcy1saWIgaW1wb3J0IOKAlCBzbyBib3RoIGNvbnN1bWVycyBjYW4gbGlmdCB0aGVcbiAqICAgICAgICAgICAgIHNhbWUgYGhvdmVyVGFyZ2V0VG9TZWxlY3Rpb25gIC8gYGRlcml2ZUZpbGVgIGxvZ2ljIHdpdGhvdXQgYVxuICogICAgICAgICAgICAgY3ljbGUgYW5kIHdpdGhvdXQgYnVuZGxpbmcgdGhlIGhlYXZ5IERlc2lnbkNhbnZhcyB0cmVlIGludG8gdGhlXG4gKiAgICAgICAgICAgICBsaXRlIGNvbW1lbnQgbW91bnQuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBIb3ZlclRhcmdldCB9IGZyb20gJy4vaW5wdXQtcm91dGVyLnRzeCc7XG5pbXBvcnQgdHlwZSB7IFNlbGVjdGlvbiB9IGZyb20gJy4vdXNlLXNlbGVjdGlvbi1zZXQudHN4JztcblxuLyoqXG4gKiBDYW52YXMgZmlsZSBwYXRoIGZvciB0aGUgY3VycmVudCBwYWdlLiBVbmRlciB0aGUgbW91bnQgaGFybmVzcyB0aGUgcGFnZSBpc1xuICogYC9fY2FudmFzLXNoZWxsLmh0bWw/Y2FudmFzPTxyZWw+JmRlc2lnblJlbD08cm9vdD5gOyBmb3IgbGVnYWN5IGAuaHRtbGBcbiAqIG1vY2tzIGl0J3MgdGhlIHNlcnZlZCBmaWxlIHBhdGggaXRzZWxmLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVyaXZlRmlsZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgY29uc3QgcCA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTtcbiAgICBpZiAocCA9PT0gJy9fY2FudmFzLXNoZWxsLmh0bWwnIHx8IHAgPT09ICcvX2NhbnZhcy1zaGVsbCcpIHtcbiAgICAgIGNvbnN0IHFzID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcbiAgICAgIGNvbnN0IGNhbnZhcyA9IHFzLmdldCgnY2FudmFzJykgPz8gJyc7XG4gICAgICBjb25zdCBkZXNpZ25SZWwgPSAocXMuZ2V0KCdkZXNpZ25SZWwnKSA/PyAnLmRlc2lnbicpLnJlcGxhY2UoL15cXC8rfFxcLyskL2csICcnKTtcbiAgICAgIHJldHVybiBjYW52YXMgPyBgJHtkZXNpZ25SZWx9LyR7Y2FudmFzfWAgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQocCkucmVwbGFjZSgvXlxcLy8sICcnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhbENsYXNzZXMoZWw6IEVsZW1lbnQgfCBudWxsKTogc3RyaW5nIHtcbiAgaWYgKCFlbCkgcmV0dXJuICcnO1xuICByZXR1cm4gKGVsLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSA/PyAnJylcbiAgICAudHJpbSgpXG4gICAgLnNwbGl0KC9cXHMrLylcbiAgICAuZmlsdGVyKChjKSA9PiBjICYmICFjLnN0YXJ0c1dpdGgoJ2Rnbi0nKSAmJiAhYy5zdGFydHNXaXRoKCdkYy1jdi0nKSlcbiAgICAuam9pbignICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvcnRUZXh0KGVsOiBFbGVtZW50IHwgbnVsbCwgbWF4OiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoIWVsKSByZXR1cm4gJyc7XG4gIGNvbnN0IHQgPSAoKGVsIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQgfHwgZWwudGV4dENvbnRlbnQgfHwgJycpLnJlcGxhY2UoL1xccysvZywgJyAnKS50cmltKCk7XG4gIHJldHVybiB0Lmxlbmd0aCA+IG1heCA/IGAke3Quc2xpY2UoMCwgbWF4IC0gMSl94oCmYCA6IHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjc3NQYXRoKGVsOiBFbGVtZW50IHwgbnVsbCk6IHN0cmluZyB7XG4gIGlmICghZWwpIHJldHVybiAnJztcbiAgY29uc3QgcGF0aDogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGN1cjogRWxlbWVudCB8IG51bGwgPSBlbDtcbiAgd2hpbGUgKGN1ciAmJiBjdXIubm9kZVR5cGUgPT09IDEgJiYgcGF0aC5sZW5ndGggPCA4KSB7XG4gICAgY29uc3QgZHNjRWwgPSBjdXIuZ2V0QXR0cmlidXRlPy4oJ2RhdGEtZGMtZWxlbWVudCcpO1xuICAgIGlmIChkc2NFbCkge1xuICAgICAgcGF0aC51bnNoaWZ0KGBbZGF0YS1kYy1lbGVtZW50PVwiJHtkc2NFbH1cIl1gKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjb25zdCBkc2NTYyA9IGN1ci5nZXRBdHRyaWJ1dGU/LignZGF0YS1kYy1zY3JlZW4nKTtcbiAgICBpZiAoZHNjU2MpIHtcbiAgICAgIHBhdGgudW5zaGlmdChgW2RhdGEtZGMtc2NyZWVuPVwiJHtkc2NTY31cIl1gKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBsZXQgc2VsID0gY3VyLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGN1ci5pZCkge1xuICAgICAgc2VsID0gYCMke2N1ci5pZH1gO1xuICAgICAgcGF0aC51bnNoaWZ0KHNlbCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY29uc3QgY2xzID0gcmVhbENsYXNzZXMoY3VyKS5zcGxpdCgvXFxzKy8pLmZpbHRlcihCb29sZWFuKS5zbGljZSgwLCAyKTtcbiAgICBpZiAoY2xzLmxlbmd0aCkgc2VsICs9IGAuJHtjbHMuam9pbignLicpfWA7XG4gICAgbGV0IHNpYiA9IDE7XG4gICAgbGV0IG46IEVsZW1lbnQgfCBudWxsID0gY3VyLnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG4gICAgd2hpbGUgKG4pIHtcbiAgICAgIHNpYisrO1xuICAgICAgbiA9IG4ucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICB9XG4gICAgc2VsICs9IGA6bnRoLWNoaWxkKCR7c2lifSlgO1xuICAgIHBhdGgudW5zaGlmdChzZWwpO1xuICAgIGN1ciA9IGN1ci5wYXJlbnRFbGVtZW50O1xuICB9XG4gIHJldHVybiBwYXRoLmpvaW4oJyA+ICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZG9tUGF0aChlbDogRWxlbWVudCB8IG51bGwpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGhvcHM6IHN0cmluZ1tdID0gW107XG4gIGxldCBjdXIgPSBlbDtcbiAgd2hpbGUgKGN1ciAmJiBjdXIubm9kZVR5cGUgPT09IDEgJiYgaG9wcy5sZW5ndGggPCA4KSB7XG4gICAgbGV0IGxhYmVsID0gY3VyLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgZEVsID0gY3VyLmdldEF0dHJpYnV0ZT8uKCdkYXRhLWRjLWVsZW1lbnQnKTtcbiAgICBjb25zdCBkU2MgPSBjdXIuZ2V0QXR0cmlidXRlPy4oJ2RhdGEtZGMtc2NyZWVuJyk7XG4gICAgaWYgKGRFbCkgbGFiZWwgKz0gYFtkYXRhLWRjLWVsZW1lbnQ9XCIke2RFbH1cIl1gO1xuICAgIGVsc2UgaWYgKGRTYykgbGFiZWwgKz0gYFtkYXRhLWRjLXNjcmVlbj1cIiR7ZFNjfVwiXWA7XG4gICAgZWxzZSBpZiAoY3VyLmlkKSBsYWJlbCArPSBgIyR7Y3VyLmlkfWA7XG4gICAgY29uc3QgY2xzID0gcmVhbENsYXNzZXMoY3VyKS5zcGxpdCgvXFxzKy8pLmZpbHRlcihCb29sZWFuKS5zbGljZSgwLCAyKTtcbiAgICBpZiAoY2xzLmxlbmd0aCAmJiAhZEVsICYmICFkU2MpIGxhYmVsICs9IGAuJHtjbHMuam9pbignLicpfWA7XG4gICAgaG9wcy51bnNoaWZ0KGxhYmVsKTtcbiAgICBjdXIgPSBjdXIucGFyZW50RWxlbWVudDtcbiAgfVxuICByZXR1cm4gaG9wcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNzc0VzY2FwZShzOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBNaW5pbWFsIENTUy5lc2NhcGUgcG9seWZpbGwg4oCUIG9ubHkgaGFuZGxlcyBjaGFycyBhY3R1YWxseSBwcmVzZW50IGluXG4gIC8vIHBpcGVsaW5lLXN0YW1wZWQgSURzIChhbHBoYW51bWVyaWNzICsgYC1gICsgYF9gKS5cbiAgcmV0dXJuIHMucmVwbGFjZSgvW15hLXpBLVowLTlfLV0vZywgKGMpID0+IGBcXFxcJHtjfWApO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSB3aXJlLXNoYXBlIGBTZWxlY3Rpb25gIGZvciBhIHJlc29sdmVkIGhvdmVyIHRhcmdldC4gYGZpbGVgXG4gKiBkZWZhdWx0cyB0byBgZGVyaXZlRmlsZSgpYDsgdGhlIGNvbW1lbnQgbW91bnQgbGF5ZXIgcGFzc2VzIGl0IGV4cGxpY2l0bHlcbiAqIHNvIGFsbCB0aHJlZSBjb25zdW1lcnMgKHJvdXRlciwgb3ZlcmxheSwgbW91bnQpIGFncmVlIG9uIHRoZSBzYW1lIGtleS5cbiAqL1xuLyoqXG4gKiBUaGUgYXJ0Ym9hcmQtc2NvcGVkIGRhdGEtY2QtaWQgc2VsZWN0b3IuIEEgY29tcG9uZW50IHNoYXJlZCBhY3Jvc3MgYXJ0Ym9hcmRzXG4gKiBjYXJyaWVzIHRoZSBTQU1FIGRhdGEtY2QtaWQgaW4gZWFjaCwgc28gYSBiYXJlIGBbZGF0YS1jZC1pZD1cIuKAplwiXWAgcmVzb2x2ZXNcbiAqICh2aWEgcXVlcnlTZWxlY3RvcikgdG8gdGhlIEZJUlNUIGFydGJvYXJkLiBQcmVmaXhpbmcgdGhlIGhpdCdzIGFydGJvYXJkIG1ha2VzXG4gKiB0aGUgYW5jaG9yIHBlci1pbnN0YW5jZS4gU2hhcmVkIGJ5IEVWRVJZIHNlbGVjdG9yIGJ1aWxkZXIgKyByZXNvbHZlciBzbyB0aGV5XG4gKiBjYW4ndCBkcmlmdCAodGhlIG9yaWdpbmFsIGZpeCBvbmx5IHBhdGNoZWQgb25lIG9mIH44IHNpdGVzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjb3BlZENkU2VsZWN0b3IoY2RJZDogc3RyaW5nLCBhcnRib2FyZElkPzogc3RyaW5nIHwgbnVsbCk6IHN0cmluZyB7XG4gIHJldHVybiBhcnRib2FyZElkXG4gICAgPyBgW2RhdGEtZGMtc2NyZWVuPVwiJHthcnRib2FyZElkfVwiXSBbZGF0YS1jZC1pZD1cIiR7Y2RJZH1cIl1gXG4gICAgOiBgW2RhdGEtY2QtaWQ9XCIke2NkSWR9XCJdYDtcbn1cblxuLyoqXG4gKiBPY2N1cnJlbmNlIGluZGV4IG9mIGBlbGAgYW1vbmcgYGRvYy5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKWAuIEV2ZW4gd2l0aCBhblxuICogYXJ0Ym9hcmQtc2NvcGVkIGRhdGEtY2QtaWQgc2VsZWN0b3IsIGEgY29tcG9uZW50IHJlcGVhdGVkIFdJVEhJTiBvbmUgYXJ0Ym9hcmRcbiAqIChhIGxpc3Qgcm93LCBvciBhIHJldXNhYmxlIHVzZWQgdHdpY2UpIHByb2R1Y2VzIHNldmVyYWwgbWF0Y2hlcyDigJQgdGhlIGluZGV4XG4gKiBpcyB0aGUgb25seSB0aGluZyB0aGF0IG1ha2VzIHRoZSBhbmNob3IgdHJ1bHkgdW5pcXVlIHBlciBET00gaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RvckluZGV4KGRvYzogRG9jdW1lbnQsIHNlbGVjdG9yOiBzdHJpbmcsIGVsOiBFbGVtZW50IHwgbnVsbCk6IG51bWJlciB7XG4gIGlmICghZWwpIHJldHVybiAwO1xuICB0cnkge1xuICAgIGNvbnN0IGFsbCA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFsbFtpXSA9PT0gZWwpIHJldHVybiBpO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLyogbWFsZm9ybWVkIHNlbGVjdG9yICovXG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIHN0b3JlZCBTZWxlY3Rpb24gdG8gaXRzIGxpdmUgZWxlbWVudCwgYXJ0Ym9hcmQtc2NvcGVkLiBQcmVmZXJzIHRoZVxuICogaWQrYXJ0Ym9hcmRJZCBzY29wZWQgc2VsZWN0b3IgKHRoZSByb2J1c3QgcGF0aCksIHRoZW4gdGhlIHN0b3JlZCBgc2VsZWN0b3JgXG4gKiAoYWxyZWFkeSBzY29wZWQgZm9yIHJlY2VudCBzZWxlY3Rpb25zOyBhIGxlZ2FjeSBmYWxsYmFjayBmb3Igb2xkIGNvbW1lbnRzKS5cbiAqIEV2ZXJ5IGhhbG8gLyBwaW4gLyB0b29sYmFyIC8gc3BhY2luZy1oYW5kbGUgcmVzb2x2ZXIgcm91dGVzIHRocm91Z2ggdGhpcyBzbyBhXG4gKiBzaGFyZWQgY29tcG9uZW50IGFuY2hvcnMgdG8gdGhlIGluc3RhbmNlIHRoZSB1c2VyIGFjdHVhbGx5IGNsaWNrZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlU2VsZWN0aW9uRWwoXG4gIGRvYzogRG9jdW1lbnQsXG4gIHNlbDogeyBpZD86IHN0cmluZyB8IG51bGw7IHNlbGVjdG9yPzogc3RyaW5nIHwgbnVsbDsgYXJ0Ym9hcmRJZD86IHN0cmluZyB8IG51bGw7IGluZGV4PzogbnVtYmVyIH1cbik6IEVsZW1lbnQgfCBudWxsIHtcbiAgY29uc3QgYXQgPSAoc2VsZWN0b3I6IHN0cmluZyk6IEVsZW1lbnQgfCBudWxsID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYWxsID0gZG9jLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICAgICAgaWYgKCFhbGwubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICAgIGNvbnN0IGkgPSBzZWwuaW5kZXggJiYgc2VsLmluZGV4ID4gMCAmJiBzZWwuaW5kZXggPCBhbGwubGVuZ3RoID8gc2VsLmluZGV4IDogMDtcbiAgICAgIHJldHVybiBhbGxbaV0gPz8gYWxsWzBdO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9O1xuICBpZiAoc2VsLmlkKSB7XG4gICAgY29uc3QgZWwgPSBhdChzY29wZWRDZFNlbGVjdG9yKHNlbC5pZCwgc2VsLmFydGJvYXJkSWQpKTtcbiAgICBpZiAoZWwpIHJldHVybiBlbDtcbiAgfVxuICBpZiAoc2VsLnNlbGVjdG9yKSByZXR1cm4gYXQoc2VsLnNlbGVjdG9yKTtcbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBob3ZlclRhcmdldFRvU2VsZWN0aW9uKHRhcmdldDogSG92ZXJUYXJnZXQsIGZpbGU/OiBzdHJpbmcpOiBTZWxlY3Rpb24ge1xuICBjb25zdCBlbCA9IHRhcmdldC5lbDtcbiAgY29uc3QgcmVjdCA9XG4gICAgZWwgJiYgKGVsIGFzIEhUTUxFbGVtZW50KS5nZXRCb3VuZGluZ0NsaWVudFJlY3RcbiAgICAgID8gKGVsIGFzIEhUTUxFbGVtZW50KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgOiBudWxsO1xuICAvLyBgY2RJZGAgaXMgdGhlIGhpdCBlbGVtZW50J3MgT1dOIGRhdGEtY2QtaWQgKGRlZXAgbW9kZSk7IHJlc29sdmVyIG5ldmVyXG4gIC8vIGNsaW1icyB0byBhbiBhbmNlc3Rvci4gRmFsbHMgYmFjayB0byBjc3NQYXRoIG9mIHRoZSBoaXQgd2hlbiBubyBzdGFibGVcbiAgLy8gYW5jaG9yIGV4aXN0cy5cbiAgY29uc3QgY2RJZCA9IHRhcmdldC5jZElkO1xuICAvLyBTZWxlY3RvciByZXNvbHV0aW9uIG9yZGVyOlxuICAvLyAgIDEuIGRhdGEtY2QtaWQgYW5jaG9yIOKAlCBzdGFibGUgcGlwZWxpbmUtc3RhbXBlZCBpZCAocHJlZmVycmVkKS4gU0NPUEVEIGJ5XG4gIC8vICAgICAgdGhlIGhpdCdzIGFydGJvYXJkIChgW2RhdGEtZGMtc2NyZWVuPeKApl0gW2RhdGEtY2QtaWQ94oCmXWApIOKAlCBhIGNvbXBvbmVudFxuICAvLyAgICAgIHNoYXJlZCBhY3Jvc3MgYXJ0Ym9hcmRzIGNhcnJpZXMgdGhlIFNBTUUgZGF0YS1jZC1pZCBpbiBlYWNoLCBzbyBhblxuICAvLyAgICAgIHVuc2NvcGVkIGBbZGF0YS1jZC1pZF1gIHNlbGVjdG9yIHJlc29sdmVzICh2aWEgcXVlcnlTZWxlY3RvcikgdG8gdGhlXG4gIC8vICAgICAgRklSU1QgYXJ0Ym9hcmQncyBpbnN0YW5jZSBhbmQgdGhlIHBpbi9zZWxlY3QgbGFuZHMgb24gdGhlIHdyb25nIGJvYXJkLlxuICAvLyAgICAgIFByZWZpeGluZyB0aGUgYXJ0Ym9hcmQgbWFrZXMgdGhlIGFuY2hvciBwZXItaW5zdGFuY2UuXG4gIC8vICAgMi4gZGF0YS1kYy1zY3JlZW4g4oCUIGNocm9tZSBjbGljayBwcm9tb3RlZCB0byB3aG9sZS1hcnRib2FyZCBzZWxlY3RcbiAgLy8gICAgICAoVDI0LjUgRzggbXVsdGktYXJ0Ym9hcmQgZ2VzdHVyZSkuXG4gIC8vICAgMy4gY3NzUGF0aCBvZiB0aGUgaGl0IOKAlCBsYXN0LXJlc29ydCBwYXRoIHN0cmluZy5cbiAgY29uc3Qgc2VsZWN0b3IgPSBjZElkXG4gICAgPyBzY29wZWRDZFNlbGVjdG9yKGNkSWQsIHRhcmdldC5hcnRib2FyZElkKVxuICAgIDogdGFyZ2V0LmFydGJvYXJkSWRcbiAgICAgID8gYFtkYXRhLWRjLXNjcmVlbj1cIiR7dGFyZ2V0LmFydGJvYXJkSWR9XCJdYFxuICAgICAgOiBjc3NQYXRoKGVsKTtcbiAgLy8gRGlzYW1iaWd1YXRlIHJlcGVhdGVkIGluc3RhbmNlcyB3aXRoaW4gdGhlIHNhbWUgYXJ0Ym9hcmQgKGxpc3Qgcm93cywgYVxuICAvLyByZXVzYWJsZSB1c2VkIHR3aWNlKSDigJQgdGhlIGluZGV4IGlzIHdoaWNoIGBxdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKWBcbiAgLy8gbWF0Y2ggdGhpcyBlbGVtZW50IGlzLiBjc3NQYXRoIGlzIGFscmVhZHkgdW5pcXVlLCBzbyAwIHRoZXJlLlxuICBjb25zdCBpbmRleCA9IGNkSWQgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyA/IHNlbGVjdG9ySW5kZXgoZG9jdW1lbnQsIHNlbGVjdG9yLCBlbCkgOiAwO1xuICByZXR1cm4ge1xuICAgIGZpbGU6IGZpbGUgPz8gZGVyaXZlRmlsZSgpLFxuICAgIGlkOiBjZElkID8/IHVuZGVmaW5lZCxcbiAgICBzZWxlY3RvcixcbiAgICBhcnRib2FyZElkOiB0YXJnZXQuYXJ0Ym9hcmRJZCxcbiAgICBpbmRleCxcbiAgICB0YWc6IGVsPy50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPz8gJycsXG4gICAgY2xhc3NlczogcmVhbENsYXNzZXMoZWwpLFxuICAgIHRleHQ6IHNob3J0VGV4dChlbCwgMjQwKSxcbiAgICBkb21fcGF0aDogZG9tUGF0aChlbCksXG4gICAgYm91bmRzOiByZWN0XG4gICAgICA/IHtcbiAgICAgICAgICB4OiBNYXRoLnJvdW5kKHJlY3QubGVmdCksXG4gICAgICAgICAgeTogTWF0aC5yb3VuZChyZWN0LnRvcCksXG4gICAgICAgICAgdzogTWF0aC5yb3VuZChyZWN0LndpZHRoKSxcbiAgICAgICAgICBoOiBNYXRoLnJvdW5kKHJlY3QuaGVpZ2h0KSxcbiAgICAgICAgfVxuICAgICAgOiBudWxsLFxuICAgIGh0bWw6IGVsID8gKGVsLm91dGVySFRNTCA/PyAnJykuc2xpY2UoMCwgNDAwMCkgOiAnJyxcbiAgfTtcbn1cbiIsCiAgICAiLyoqXG4gKiBAZmlsZSAgICAgICBpbnB1dC1yb3V0ZXIudHN4IOKAlCBjYW52YXMgcG9pbnRlci9rZXlib2FyZCBjbGFzc2lmaWVyICsgaG9va1xuICogQHNjb3BlICAgICAgYXBwcy9zdHVkaW8vaW5wdXQtcm91dGVyLnRzeFxuICogQHB1cnBvc2UgICAgT3duZWQgYnkgY2FudmFzLWxpYidzIERlc2lnbkNhbnZhcy4gQ2xhc3NpZmllcyB0aGUgTk9OLVdIRUVMXG4gKiAgICAgICAgICAgICBzdWJzZXQgb2YgcG9pbnRlciArIGtleSBldmVudHMgaW50byBkaXNjcmV0ZSByb3V0ZXIgYWN0aW9ucy5cbiAqICAgICAgICAgICAgIGB1c2VWaWV3cG9ydENvbnRyb2xsZXJgIGtlZXBzIG93bmluZyB3aGVlbCArIG1pZGRsZS1tb3VzZSArXG4gKiAgICAgICAgICAgICBzcGFjZS1wYW4gKyBDbWQrMC8xLysvLSDigJQgdGhlIHR3byBzdGFja3MgY29leGlzdCB3aXRob3V0IGFcbiAqICAgICAgICAgICAgIGxpc3RlbmVyIHJhY2UgKEREUi0wMjYpLlxuICpcbiAqIEV2ZW50IG93bmVyc2hpcCAocmVhZCB0aGlzIGJlZm9yZSBhZGRpbmcgaGFuZGxlcnMpOlxuICpcbiAqICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQXG4gKiAgIOKUgiBFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIIgT3duZXIgICAgICAgICAgICAgICAgICAgIOKUglxuICogICDilJzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilLzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilKRcbiAqICAg4pSCIHdoZWVsIC8gc2hpZnQtd2hlZWwgLyBjbWQtd2hlZWwgIOKUgiB1c2VWaWV3cG9ydENvbnRyb2xsZXIgICAg4pSCXG4gKiAgIOKUgiBwb2ludGVyZG93biBidG49MSAvIHNwYWNlLWhlbGQgICDilIIgdXNlVmlld3BvcnRDb250cm9sbGVyICAgIOKUglxuICogICDilIIga2V5ZG93biBTcGFjZSAvIENtZCswLzEvKy8tICAgICAg4pSCIHVzZVZpZXdwb3J0Q29udHJvbGxlciAgICDilIJcbiAqICAg4pSCIHBvaW50ZXJtb3ZlIChob3ZlcikgICAgICAgICAgICAgIOKUgiBpbnB1dC1yb3V0ZXIgICAgICAgICAgICAg4pSCXG4gKiAgIOKUgiBwb2ludGVyZG93biBidG49MCAoc2VsZWN0KSAgICAgICDilIIgaW5wdXQtcm91dGVyICAgICAgICAgICAgIOKUglxuICogICDilIIgcG9pbnRlcmRvd24gYnRuPTIgKHJpZ2h0LWNsaWNrKSAg4pSCIGlucHV0LXJvdXRlciAgICAgICAgICAgICDilIJcbiAqICAg4pSCIGtleWRvd24gViAvIEggLyBDIC8gRXNjICAgICAgICAgIOKUgiBpbnB1dC1yb3V0ZXIgICAgICAgICAgICAg4pSCXG4gKiAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmFxuICpcbiAqIFRoZSByb3V0ZXIgZG9lcyBubyBET00gd29yayBpdHNlbGYg4oCUIGBjbGFzc2lmeSgpYCBpcyBwdXJlICh0ZXN0YWJsZSB3aXRob3V0XG4gKiBhIERPTSkgYW5kIGB1c2VJbnB1dFJvdXRlcigpYCBhdHRhY2hlcyBsaXN0ZW5lcnMgdGhhdCBkaXNwYXRjaCB0aHJvdWdoIHRoZVxuICogY2FsbGVyLXN1cHBsaWVkIGNhbGxiYWNrcy4gSG92ZXItdGFyZ2V0IHJlc29sdXRpb24gKyBzZWxlY3Rpb24gcGVyc2lzdGVuY2VcbiAqIGxpdmUgaW4gdGhlIGNvbnN1bWVyIChEZXNpZ25DYW52YXMpLlxuICovXG5cbmltcG9ydCB7IHR5cGUgUmVmT2JqZWN0LCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gRHJhZy12cy1jbGljayB0aHJlc2hvbGQgKFQyNSlcbi8vXG4vLyA0IHB4IHNjcmVlbi1waXhlbCBoeXBvdCBzZXBhcmF0ZXMgXCJjbGlja1wiIGZyb20gXCJkcmFnXCIg4oCUIE1pY3Jvc29mdCBXaW4zMlxuLy8gY2Fub25pY2FsIChgU01fQ1hEUkFHYC9gU01fQ1lEUkFHYCBkZWZhdWx0KSwgYWxzbyBkMy1kcmFnIGFuZCB0bGRyYXcgZGVmYXVsdC5cbi8vIE93bmVkIGhlcmUgc28gYXJ0Ym9hcmQtZHJhZywgYXJ0Ym9hcmQtbWFycXVlZSwgZWxlbWVudC1tYXJxdWVlLCBhbm5vdGF0aW9uLVxuLy8gZHJhZy12cy10YXAsIGFuZCBhbnkgZnV0dXJlIGRyYWctY2xhc3MgZ2VzdHVyZSBhbGwgcmVhZCB0aGUgc2FtZSBjb25zdGFudC5cbi8vIFdoZWVsICsgcGluY2gtem9vbSBhcmUgRVhFTVBUIOKAlCB0aHJlc2hvbGQgaXMgZm9yIGBwb2ludGVyZG93biDihpIgcG9pbnRlcm1vdmVgXG4vLyBkcmFnIGNsYXNzaWZpY2F0aW9uIG9ubHkuXG5cbmV4cG9ydCBjb25zdCBEUkFHX1RIUkVTSE9MRF9QWCA9IDQ7XG5cbi8qKiBUcnVlIG9uY2UgdGhlIHBvaW50ZXIgaGFzIG1vdmVkIOKJpSBEUkFHX1RIUkVTSE9MRF9QWCBmcm9tIGl0cyBzdGFydC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcm9zc2VkRHJhZ1RocmVzaG9sZChcbiAgc3RhcnRYOiBudW1iZXIsXG4gIHN0YXJ0WTogbnVtYmVyLFxuICBjdXJYOiBudW1iZXIsXG4gIGN1clk6IG51bWJlclxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGR4ID0gY3VyWCAtIHN0YXJ0WDtcbiAgY29uc3QgZHkgPSBjdXJZIC0gc3RhcnRZO1xuICByZXR1cm4gTWF0aC5oeXBvdChkeCwgZHkpID49IERSQUdfVEhSRVNIT0xEX1BYO1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFR5cGVzXG5cbi8qKlxuICogVG9vbCB1bmlvbi4gUGhhc2UgNC4xIHNoaXBwZWQgVi9IL0M7IFBoYXNlIDUgYWRkcyB0aGUgZHJhdyBzZXRcbiAqIChwZW4gLyByZWN0IC8gYXJyb3cgLyBlcmFzZXIpLiBEcmF3LXRvb2wgcG9pbnRlciBldmVudHMgYXJlIG93bmVkIGJ5XG4gKiBgQW5ub3RhdGlvbnNMYXllcmAg4oCUIHRoZSByb3V0ZXIgY2xhc3NpZmllcyB0aGVpciBsZXR0ZXIgc2hvcnRjdXRzIGJ1dFxuICogcmV0dXJucyBgbm8tb3BgIGZvciB0aGUgY29ycmVzcG9uZGluZyBwb2ludGVyIGV2ZW50cyBzbyB0aGUgU1ZHIG92ZXJsYXlcbiAqIGNhbiBncmFiIHRoZW0gbmF0aXZlbHkuXG4gKi9cbmV4cG9ydCB0eXBlIFRvb2wgPVxuICB8ICdtb3ZlJ1xuICB8ICdoYW5kJ1xuICB8ICdjb21tZW50J1xuICB8ICdwZW4nXG4gIC8vIEFubm90YXRpb24gcG9saXNoIChpdGVtIDgpIOKAlCBGaWdKYW0tc3R5bGUgaGlnaGxpZ2h0ZXIuIEEgYHBlbmAtc2hhcGVkIHRvb2xcbiAgLy8gdGhhdCBwcm9kdWNlcyBhIHRyYW5zbHVjZW50IHdpZGUgbXVsdGlwbHkgc3Ryb2tlIChhIFBlblN0cm9rZSB3aXRoXG4gIC8vIGBoaWdobGlnaHRlcjp0cnVlYCksIG5vdCBhIG5ldyBzdHJva2UgdHlwZS5cbiAgfCAnaGlnaGxpZ2h0ZXInXG4gIC8vIFBoYXNlIDI0IOKAlCBgc2hhcGVgIGlzIHRoZSBzaW5nbGUgYWN0aXZlIGRyYXcgdG9vbCB0aGF0IHByb2R1Y2VzIHJlY3QgL1xuICAvLyBlbGxpcHNlIC8gcG9seWdvbiBzdHJva2VzICh0aGUga2luZCBpcyBjaG9zZW4gdmlhIHRoZSBwYWxldHRlIHBvcG92ZXIpLlxuICAvLyBgcmVjdGAgLyBgZWxsaXBzZWAgc3RheSBpbiB0aGUgdW5pb24gYXMgdGhlIHN0cm9rZSBkaXNjcmltaW5hbnRzIHRoZXlcbiAgLy8gYWx3YXlzIHdlcmUsIGJ1dCBhcmUgbm8gbG9uZ2VyIGRpcmVjdGx5IHNlbGVjdGFibGUgYWN0aXZlIHRvb2xzLlxuICB8ICdzaGFwZSdcbiAgfCAncmVjdCdcbiAgfCAnZWxsaXBzZSdcbiAgfCAnYXJyb3cnXG4gIHwgJ3N0aWNreSdcbiAgfCAndGV4dCdcbiAgfCAnZXJhc2VyJztcblxuY29uc3QgQU5OT1RBVElPTl9UT09MUyA9IG5ldyBTZXQ8VG9vbD4oW1xuICAncGVuJyxcbiAgJ2hpZ2hsaWdodGVyJyxcbiAgJ3NoYXBlJyxcbiAgJ3JlY3QnLFxuICAnZWxsaXBzZScsXG4gICdhcnJvdycsXG4gICdzdGlja3knLFxuICAndGV4dCcsXG4gICdlcmFzZXInLFxuXSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Fubm90YXRpb25Ub29sKHQ6IFRvb2wpOiBib29sZWFuIHtcbiAgcmV0dXJuIEFOTk9UQVRJT05fVE9PTFMuaGFzKHQpO1xufVxuXG5leHBvcnQgdHlwZSBSb3V0ZXJBY3Rpb24gPVxuICB8IHsga2luZDogJ25vLW9wJyB9XG4gIHwgeyBraW5kOiAnaG92ZXInOyBkZWVwOiBib29sZWFuOyBjbGllbnRYOiBudW1iZXI7IGNsaWVudFk6IG51bWJlciB9XG4gIHwge1xuICAgICAga2luZDogJ3NlbGVjdCc7XG4gICAgICAvKiogYHJlcGxhY2VgIHN3YXBzIHRoZSBzZWxlY3Rpb24gc2V0LCBgYWRkYCBtZXJnZXMgaW50byBpdC4gKi9cbiAgICAgIG1vZGU6ICdyZXBsYWNlJyB8ICdhZGQnO1xuICAgICAgLyoqXG4gICAgICAgKiBgdHJ1ZWAgcmVzb2x2ZXMgdG8gdGhlIGRlZXBlc3QgZGVzY2VuZGFudCB1bmRlciB0aGUgY3Vyc29yIChDbWQtaGVsZFxuICAgICAgICogbW9kZSkuIGBmYWxzZWAgcmVzb2x2ZXMgdG8gdGhlIHRvcG1vc3QgaW50ZXJlc3RpbmcgYW5jZXN0b3IgKHRvcCBtb2RlKS5cbiAgICAgICAqIFBoYXNlIDQuMSBNb3ZlLXRvb2wgc2VsZWN0aW9uIGFsd2F5cyB1c2VzIGRlZXA9dHJ1ZSDigJQgYmFyZSBjbGlja3NcbiAgICAgICAqIGFyZSBwYXNzdGhyb3VnaCAobm8gc2VsZWN0KSwgYW5kIHRoZSBvbmx5IGVudHJ5IHBvaW50cyBhcmUgQ21kXG4gICAgICAgKiAocmVwbGFjZSBkZWVwKSBhbmQgQ21kK1NoaWZ0IChhZGQgZGVlcCkuXG4gICAgICAgKi9cbiAgICAgIGRlZXA6IGJvb2xlYW47XG4gICAgICBjbGllbnRYOiBudW1iZXI7XG4gICAgICBjbGllbnRZOiBudW1iZXI7XG4gICAgfVxuICB8IHsga2luZDogJ2Ryb3AtY29tbWVudCc7IGNsaWVudFg6IG51bWJlcjsgY2xpZW50WTogbnVtYmVyIH1cbiAgfCB7IGtpbmQ6ICdjb250ZXh0LW1lbnUnOyBjbGllbnRYOiBudW1iZXI7IGNsaWVudFk6IG51bWJlciB9XG4gIHwgeyBraW5kOiAndG9vbCc7IHRvb2w6IFRvb2wgfVxuICB8IHsga2luZDogJ2VzY2FwZScgfVxuICB8IHsga2luZDogJ3VuZG8nIH1cbiAgfCB7IGtpbmQ6ICdyZWRvJyB9O1xuXG5leHBvcnQgaW50ZXJmYWNlIENsYXNzaWZ5SW5wdXQge1xuICB0eXBlOiAncG9pbnRlcm1vdmUnIHwgJ3BvaW50ZXJkb3duJyB8ICdjb250ZXh0bWVudScgfCAna2V5ZG93bic7XG4gIC8qKiBQb2ludGVyRXZlbnQuYnV0dG9uOiAwID0gbGVmdCwgMSA9IG1pZGRsZSwgMiA9IHJpZ2h0LiAqL1xuICBidXR0b24/OiBudW1iZXI7XG4gIG1ldGFLZXk/OiBib29sZWFuO1xuICBjdHJsS2V5PzogYm9vbGVhbjtcbiAgc2hpZnRLZXk/OiBib29sZWFuO1xuICBhbHRLZXk/OiBib29sZWFuO1xuICBrZXk/OiBzdHJpbmc7XG4gIGNsaWVudFg/OiBudW1iZXI7XG4gIGNsaWVudFk/OiBudW1iZXI7XG4gIC8qKiBTcGFjZWJhciBoZWxkIOKAlCBzaGFyZWQgc2lnbmFsIHdpdGggYHVzZVZpZXdwb3J0Q29udHJvbGxlcmAncyBwYW4tZHJhZy4gKi9cbiAgc3BhY2VIZWxkPzogYm9vbGVhbjtcbiAgLyoqIEV2ZW50IHRhcmdldCBpcyBlZGl0YWJsZSAoaW5wdXQvdGV4dGFyZWEvY29udGVudEVkaXRhYmxlKSDigJQgY2FsbGVyIGNvbXB1dGVzLiAqL1xuICBpc0VkaXRhYmxlPzogYm9vbGVhbjtcbiAgYWN0aXZlVG9vbDogVG9vbDtcbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBjbGFzc2lmeSDigJQgcHVyZSBmdW5jdGlvbi4gQWxsIGJyYW5jaGluZyBsaXZlcyBoZXJlIHNvIHVuaXQgdGVzdHMgY292ZXIgZXZlcnlcbi8vIHJvdyBvZiB0aGUgZGlzcGF0Y2ggdGFibGUgd2l0aG91dCBzcGlubmluZyB1cCBhIERPTS5cblxuY29uc3QgbWV0YU9yQ3RybCA9IChpOiBDbGFzc2lmeUlucHV0KTogYm9vbGVhbiA9PiAhIShpLm1ldGFLZXkgfHwgaS5jdHJsS2V5KTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNsYXNzaWZ5KGlucHV0OiBDbGFzc2lmeUlucHV0KTogUm91dGVyQWN0aW9uIHtcbiAgaWYgKGlucHV0LnR5cGUgPT09ICdrZXlkb3duJykge1xuICAgIGlmIChpbnB1dC5pc0VkaXRhYmxlKSByZXR1cm4geyBraW5kOiAnbm8tb3AnIH07XG4gICAgLy8gVG9vbCBsZXR0ZXJzIGFyZSBiYXJlIGtleXMg4oCUIENtZC9DdHJsL0FsdCtsZXR0ZXIgYmVsb25ncyB0byBzaGVsbCAvIGJyb3dzZXIuXG4gICAgaWYgKGlucHV0Lm1ldGFLZXkgfHwgaW5wdXQuY3RybEtleSB8fCBpbnB1dC5hbHRLZXkpIHtcbiAgICAgIC8vIEVzYyB3aXRoIG1vZGlmaWVycyBzdGlsbCBkaXNtaXNzZXMuXG4gICAgICBpZiAoaW5wdXQua2V5ID09PSAnRXNjYXBlJykgcmV0dXJuIHsga2luZDogJ2VzY2FwZScgfTtcbiAgICAgIC8vIFVuZG8gLyByZWRvIChQaGFzZSAyMCkuIEFsdCBpcyByZXNlcnZlZCDigJQgQ21kK09wdCtaIGlzIGEgYnJvd3NlclxuICAgICAgLy8gdGV4dC1pbnB1dCBnZXN0dXJlIHdlIGRvbid0IGNsYWltLiBgbWV0YUtleSB8fCBjdHJsS2V5YCBjb3ZlcnMgYm90aFxuICAgICAgLy8gbWFjIGFuZCBXaW5kb3dzIC8gTGludXggd2l0aG91dCBhIHBsYXRmb3JtIHNuaWZmLlxuICAgICAgY29uc3QgayA9IChpbnB1dC5rZXkgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAoIWlucHV0LmFsdEtleSAmJiAoaW5wdXQubWV0YUtleSB8fCBpbnB1dC5jdHJsS2V5KSkge1xuICAgICAgICBpZiAoayA9PT0gJ3onICYmIGlucHV0LnNoaWZ0S2V5KSByZXR1cm4geyBraW5kOiAncmVkbycgfTtcbiAgICAgICAgaWYgKGsgPT09ICd6JykgcmV0dXJuIHsga2luZDogJ3VuZG8nIH07XG4gICAgICAgIGlmIChrID09PSAneScgJiYgIWlucHV0LnNoaWZ0S2V5KSByZXR1cm4geyBraW5kOiAncmVkbycgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGtpbmQ6ICduby1vcCcgfTtcbiAgICB9XG4gICAgY29uc3QgayA9IChpbnB1dC5rZXkgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGsgPT09ICd2JykgcmV0dXJuIHsga2luZDogJ3Rvb2wnLCB0b29sOiAnbW92ZScgfTtcbiAgICBpZiAoayA9PT0gJ2gnKSByZXR1cm4geyBraW5kOiAndG9vbCcsIHRvb2w6ICdoYW5kJyB9O1xuICAgIGlmIChrID09PSAnYycpIHJldHVybiB7IGtpbmQ6ICd0b29sJywgdG9vbDogJ2NvbW1lbnQnIH07XG4gICAgaWYgKGsgPT09ICdiJykgcmV0dXJuIHsga2luZDogJ3Rvb2wnLCB0b29sOiAncGVuJyB9O1xuICAgIC8vIEkgPSBoSWdobGlnaHRlciAoYSBmcmVlIGJhcmUgbGV0dGVyOyAnSCcgaXMgdGFrZW4gYnkgSGFuZCkuXG4gICAgaWYgKGsgPT09ICdpJykgcmV0dXJuIHsga2luZDogJ3Rvb2wnLCB0b29sOiAnaGlnaGxpZ2h0ZXInIH07XG4gICAgLy8gUGhhc2UgMjQg4oCUIFIgKGFuZCBsZWdhY3kgTykgYm90aCBhcm0gdGhlIHNpbmdsZSBTaGFwZSB0b29sOyB0aGUgc3BlY2lmaWNcbiAgICAvLyBwcmltaXRpdmUgaXMgcGlja2VkIGZyb20gdGhlIHBhbGV0dGUncyBzaGFwZS1raW5kIHBvcG92ZXIuXG4gICAgaWYgKGsgPT09ICdyJyB8fCBrID09PSAnbycpIHJldHVybiB7IGtpbmQ6ICd0b29sJywgdG9vbDogJ3NoYXBlJyB9O1xuICAgIGlmIChrID09PSAnYScpIHJldHVybiB7IGtpbmQ6ICd0b29sJywgdG9vbDogJ2Fycm93JyB9O1xuICAgIC8vIFBoYXNlIDIxIOKAlCBOID0gc3RpY2t5IE5vdGUgKCdTJyBpcyB0YWtlbiBieSB0aGUgc2hlbGwgRGVzaWduLXN5c3RlbSB2aWV3XG4gICAgLy8gKyBTaGlmdC1tYXJxdWVlKTsgVCA9IHN0YW5kYWxvbmUgVGV4dC4gQm90aCBhcmUgYmFyZSBsZXR0ZXJzIHRoZSBzaGVsbFxuICAgIC8vIHlpZWxkcyB3aGVuIGZvY3VzIGlzIGluc2lkZSB0aGUgY2FudmFzIGlmcmFtZSAoYXBwLmpzeCBvbktleSBiYWlsKS5cbiAgICBpZiAoayA9PT0gJ24nKSByZXR1cm4geyBraW5kOiAndG9vbCcsIHRvb2w6ICdzdGlja3knIH07XG4gICAgaWYgKGsgPT09ICd0JykgcmV0dXJuIHsga2luZDogJ3Rvb2wnLCB0b29sOiAndGV4dCcgfTtcbiAgICBpZiAoayA9PT0gJ2UnKSByZXR1cm4geyBraW5kOiAndG9vbCcsIHRvb2w6ICdlcmFzZXInIH07XG4gICAgaWYgKGlucHV0LmtleSA9PT0gJ0VzY2FwZScpIHJldHVybiB7IGtpbmQ6ICdlc2NhcGUnIH07XG4gICAgcmV0dXJuIHsga2luZDogJ25vLW9wJyB9O1xuICB9XG5cbiAgaWYgKGlucHV0LnR5cGUgPT09ICdjb250ZXh0bWVudScpIHtcbiAgICByZXR1cm4ge1xuICAgICAga2luZDogJ2NvbnRleHQtbWVudScsXG4gICAgICBjbGllbnRYOiBpbnB1dC5jbGllbnRYID8/IDAsXG4gICAgICBjbGllbnRZOiBpbnB1dC5jbGllbnRZID8/IDAsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChpbnB1dC50eXBlID09PSAncG9pbnRlcm1vdmUnKSB7XG4gICAgLy8gUGhhc2UgNSBkcmF3IHRvb2xzOiBwZW4gLyByZWN0IC8gYXJyb3cgLyBlcmFzZXIgb3duIGFsbCB0aGVpciBwb2ludGVyXG4gICAgLy8gZXZlbnRzIHRocm91Z2ggYEFubm90YXRpb25zTGF5ZXJgLiBUaGUgcm91dGVyIG5ldmVyIHBhaW50cyBhIGhvdmVyIGhhbG9cbiAgICAvLyB3aGlsZSBkcmF3aW5nIOKAlCB0aGF0IGFmZm9yZGFuY2UgaXMgcmVzZXJ2ZWQgZm9yIHNlbGVjdCAvIGNvbW1lbnQuXG4gICAgaWYgKGlzQW5ub3RhdGlvblRvb2woaW5wdXQuYWN0aXZlVG9vbCkpIHJldHVybiB7IGtpbmQ6ICduby1vcCcgfTtcbiAgICAvLyBIYW5kIHRvb2w6IGRyYWcgcGFuIGlzIG93bmVkIGJ5IHVzZVZpZXdwb3J0Q29udHJvbGxlcjsgbm8gaG92ZXIgcGFpbnQuXG4gICAgaWYgKGlucHV0LmFjdGl2ZVRvb2wgPT09ICdoYW5kJykgcmV0dXJuIHsga2luZDogJ25vLW9wJyB9O1xuICAgIC8vIENvbW1lbnQgdG9vbDogYWx3YXlzIHBhaW50IGEgcHJldmlldyBoYWxvIG9uIHRoZSBkZWVwZXN0IGVsZW1lbnQgdW5kZXJcbiAgICAvLyBjdXJzb3Ig4oCUIHRoYXQncyB0aGUgZWxlbWVudCB0aGUgdXNlciBpcyBhYm91dCB0byBjb21tZW50IG9uLiBDb21tZW50XG4gICAgLy8gcGluIGF0dGFjaG1lbnQgaXMgdG8gdGhlIHNhbWUgZWxlbWVudCB0aGV5IHdlcmUgaG92ZXJpbmcuXG4gICAgaWYgKGlucHV0LmFjdGl2ZVRvb2wgPT09ICdjb21tZW50Jykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2luZDogJ2hvdmVyJyxcbiAgICAgICAgZGVlcDogdHJ1ZSxcbiAgICAgICAgY2xpZW50WDogaW5wdXQuY2xpZW50WCA/PyAwLFxuICAgICAgICBjbGllbnRZOiBpbnB1dC5jbGllbnRZID8/IDAsXG4gICAgICB9O1xuICAgIH1cbiAgICAvLyBNb3ZlIHRvb2w6IGJhcmUgaG92ZXIgZG9lcyBub3RoaW5nIChuYXRpdmUgaW50ZXJhY3Rpb25zIHBhc3MgdGhyb3VnaCk7XG4gICAgLy8gQ21kLWhlbGQgaG92ZXIgcGFpbnRzIGEgaGFsbyBvbiB0aGUgZGVlcGVzdCBlbGVtZW50IChwcmV2aWV3KS5cbiAgICBpZiAoIW1ldGFPckN0cmwoaW5wdXQpKSByZXR1cm4geyBraW5kOiAnbm8tb3AnIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQ6ICdob3ZlcicsXG4gICAgICBkZWVwOiB0cnVlLFxuICAgICAgY2xpZW50WDogaW5wdXQuY2xpZW50WCA/PyAwLFxuICAgICAgY2xpZW50WTogaW5wdXQuY2xpZW50WSA/PyAwLFxuICAgIH07XG4gIH1cblxuICBpZiAoaW5wdXQudHlwZSA9PT0gJ3BvaW50ZXJkb3duJykge1xuICAgIGlmIChpbnB1dC5idXR0b24gPT09IDIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtpbmQ6ICdjb250ZXh0LW1lbnUnLFxuICAgICAgICBjbGllbnRYOiBpbnB1dC5jbGllbnRYID8/IDAsXG4gICAgICAgIGNsaWVudFk6IGlucHV0LmNsaWVudFkgPz8gMCxcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChpbnB1dC5idXR0b24gPT09IDEgfHwgaW5wdXQuc3BhY2VIZWxkKSByZXR1cm4geyBraW5kOiAnbm8tb3AnIH07XG4gICAgaWYgKGlucHV0LmJ1dHRvbiAhPT0gMCkgcmV0dXJuIHsga2luZDogJ25vLW9wJyB9O1xuXG4gICAgLy8gUGhhc2UgNSBkcmF3IHRvb2xzIG93biBiYXJlIGxlZnQtY2xpY2tzOyB0aGUgcm91dGVyIHJldHVybnMgbm8tb3Agc29cbiAgICAvLyB0aGUgU1ZHIGxheWVyJ3Mgb3duIGxpc3RlbmVycyAobm8gcHJldmVudERlZmF1bHQpIGZpcmUgbm9ybWFsbHkuIENtZC1cbiAgICAvLyBtb2RpZmllZCBjbGlja3Mgc3RpbGwgZmxvdyBpbnRvIHRoZSBtb3ZlLXRvb2wgc2VsZWN0IHBhdGggYmVsb3cg4oCUIHRoYXRcbiAgICAvLyBzdGF5cyBhdmFpbGFibGUgYXMgYW4gZXNjYXBlIGhhdGNoIGV2ZW4gd2hpbGUgYSBkcmF3IHRvb2wgaXMgYWN0aXZlLlxuICAgIGlmIChpc0Fubm90YXRpb25Ub29sKGlucHV0LmFjdGl2ZVRvb2wpICYmICFtZXRhT3JDdHJsKGlucHV0KSkge1xuICAgICAgcmV0dXJuIHsga2luZDogJ25vLW9wJyB9O1xuICAgIH1cblxuICAgIGlmIChpbnB1dC5hY3RpdmVUb29sID09PSAnY29tbWVudCcpIHtcbiAgICAgIC8vIENvbW1lbnQgdG9vbDogYmFyZSBjbGljayBkcm9wcyBhIHBpbi4gQ21kIC8gU2hpZnQgbW9kaWZpZXJzIHJlc2VydmVkXG4gICAgICAvLyBmb3IgZnV0dXJlIFwic2NvcGUgY29tbWVudCB0byBkZWVwZXN0XCIgdmFyaWFudHMg4oCUIGZvciBub3cgdGhleSBmYWxsXG4gICAgICAvLyB0aHJvdWdoIHRvIHRoZSBzYW1lIGRyb3AuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiAnZHJvcC1jb21tZW50JyxcbiAgICAgICAgY2xpZW50WDogaW5wdXQuY2xpZW50WCA/PyAwLFxuICAgICAgICBjbGllbnRZOiBpbnB1dC5jbGllbnRZID8/IDAsXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEhhbmQgdG9vbDogcGFuIGlzIG93bmVkIGJ5IHVzZVZpZXdwb3J0Q29udHJvbGxlciB2aWEgYGlzUGFuRHJhZ0FjdGl2ZWAuXG4gICAgLy8gUm91dGVyIHJldHVybnMgbm8tb3Agc28gaXQgZG9lc24ndCBwcmV2ZW50RGVmYXVsdCBvciBzdG9wUHJvcGFnYXRpb24g4oCUXG4gICAgLy8gdGhlIGNvbnRyb2xsZXIncyBwb2ludGVyZG93biBsaXN0ZW5lciBvbiB0aGUgc2FtZSBob3N0IGNsYWltcyB0aGUgZHJhZy5cbiAgICBpZiAoaW5wdXQuYWN0aXZlVG9vbCA9PT0gJ2hhbmQnKSByZXR1cm4geyBraW5kOiAnbm8tb3AnIH07XG5cbiAgICAvLyBNb3ZlIHRvb2wuIFNlbGVjdGlvbiBPTkxZIGZpcmVzIHdpdGggQ21kIC8gQ21kK1NoaWZ0LiBCYXJlIGNsaWNrcyBhbmRcbiAgICAvLyBTaGlmdC13aXRob3V0LUNtZCBwYXNzIHRocm91Z2ggc28gbmF0aXZlIGNhbnZhcyBpbnRlcmFjdGlvbnMgKGJ1dHRvblxuICAgIC8vIHByZXNzZXMsIGxpbmsgY2xpY2tzLCBpbnB1dCBmb2N1cykgc3RpbGwgd29yayDigJQgZXhhY3RseSB0aGUgc2FtZSBhc1xuICAgIC8vIHByZS1QaGFzZS00LjEgYmVoYXZpb3IgZm9yIGV2ZXJ5dGhpbmcgZXhjZXB0IENtZC1tb2RpZmllZCBnZXN0dXJlcy5cbiAgICBjb25zdCBjbWQgPSBtZXRhT3JDdHJsKGlucHV0KTtcbiAgICBpZiAoIWNtZCkgcmV0dXJuIHsga2luZDogJ25vLW9wJyB9O1xuICAgIGNvbnN0IHNoaWZ0ID0gISFpbnB1dC5zaGlmdEtleTtcbiAgICByZXR1cm4ge1xuICAgICAga2luZDogJ3NlbGVjdCcsXG4gICAgICBtb2RlOiBzaGlmdCA/ICdhZGQnIDogJ3JlcGxhY2UnLFxuICAgICAgZGVlcDogdHJ1ZSxcbiAgICAgIGNsaWVudFg6IGlucHV0LmNsaWVudFggPz8gMCxcbiAgICAgIGNsaWVudFk6IGlucHV0LmNsaWVudFkgPz8gMCxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHsga2luZDogJ25vLW9wJyB9O1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIHVzZUlucHV0Um91dGVyIOKAlCBhdHRhY2ggbGlzdGVuZXJzIHNjb3BlZCB0byBgaG9zdFJlZi5jdXJyZW50YC4gRGlzcGF0Y2hlc1xuLy8gdGhyb3VnaCBgY2FsbGJhY2tzYC4gUmV0dXJucyBub3RoaW5nOyBjbGVhbnMgdXAgb24gdW5tb3VudC5cblxuZXhwb3J0IGludGVyZmFjZSBSb3V0ZXJDYWxsYmFja3Mge1xuICBvbkhvdmVyPzogKGE6IEV4dHJhY3Q8Um91dGVyQWN0aW9uLCB7IGtpbmQ6ICdob3ZlcicgfT4pID0+IHZvaWQ7XG4gIG9uU2VsZWN0PzogKGE6IEV4dHJhY3Q8Um91dGVyQWN0aW9uLCB7IGtpbmQ6ICdzZWxlY3QnIH0+KSA9PiB2b2lkO1xuICBvbkRyb3BDb21tZW50PzogKGE6IEV4dHJhY3Q8Um91dGVyQWN0aW9uLCB7IGtpbmQ6ICdkcm9wLWNvbW1lbnQnIH0+KSA9PiB2b2lkO1xuICBvbkNvbnRleHRNZW51PzogKGE6IEV4dHJhY3Q8Um91dGVyQWN0aW9uLCB7IGtpbmQ6ICdjb250ZXh0LW1lbnUnIH0+KSA9PiB2b2lkO1xuICBvblRvb2w/OiAoYTogRXh0cmFjdDxSb3V0ZXJBY3Rpb24sIHsga2luZDogJ3Rvb2wnIH0+KSA9PiB2b2lkO1xuICBvbkVzY2FwZT86ICgpID0+IHZvaWQ7XG4gIC8qKiBQaGFzZSAyMCDigJQgQ21kK1ogLyBDdHJsK1ouICovXG4gIG9uVW5kbz86ICgpID0+IHZvaWQ7XG4gIC8qKiBQaGFzZSAyMCDigJQgQ21kK1NoaWZ0K1ogLyBDdHJsK1kgLyBDbWQrWS4gKi9cbiAgb25SZWRvPzogKCkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVc2VJbnB1dFJvdXRlck9wdGlvbnMge1xuICBob3N0UmVmOiBSZWZPYmplY3Q8SFRNTEVsZW1lbnQgfCBudWxsPjtcbiAgLyoqIExhdGVzdCBhY3RpdmUgdG9vbCDigJQgcmVhZCBhdCBldmVudCB0aW1lLCBub3QgY2FwdHVyZWQuICovXG4gIGdldEFjdGl2ZVRvb2w6ICgpID0+IFRvb2w7XG4gIC8qKiBPcHRpb25hbCBzcGFjZWJhci1oZWxkIHNpZ25hbCBzaGFyZWQgd2l0aCB1c2VWaWV3cG9ydENvbnRyb2xsZXIuICovXG4gIGlzU3BhY2VIZWxkPzogKCkgPT4gYm9vbGVhbjtcbiAgY2FsbGJhY2tzOiBSb3V0ZXJDYWxsYmFja3M7XG4gIC8qKiBXaGVuIGZhbHNlLCBsaXN0ZW5lcnMgYXJlIG5vdCBhdHRhY2hlZC4gRGVmYXVsdHMgdG8gdHJ1ZS4gKi9cbiAgZW5hYmxlZD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBbGxvd2xpc3Qgb2YgYWN0aW9uIGtpbmRzIHRoaXMgcm91dGVyIGlzIHBlcm1pdHRlZCB0byBDTEFJTSAocHJldmVudERlZmF1bHRcbiAgICogKyBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24gKyBkaXNwYXRjaCkuIEFueSBjbGFzc2lmaWVkIGFjdGlvbiBvdXRzaWRlIHRoZVxuICAgKiBzZXQgaXMgZG93bmdyYWRlZCB0byBgbm8tb3BgIHNvIGl0IHByb3BhZ2F0ZXMgdW50b3VjaGVkIHRvIG90aGVyIGxpc3RlbmVycy5cbiAgICogT21pdCB0byBjbGFpbSBldmVyeXRoaW5nICh0aGUgZGVmYXVsdCDigJQgdXNlZCBieSB0aGUgZnVsbCBEZXNpZ25DYW52YXNcbiAgICogcm91dGVyKS4gVGhlIHNoZWxsLW93bmVkIGNvbW1lbnQgbW91bnQgbGF5ZXIgcGFzc2VzIGEgbmFycm93IHNldCBzbyBpdCBjYW5cbiAgICogY29leGlzdCBhcyBhbiBBTkNFU1RPUiBjYXB0dXJlLWxpc3RlbmVyIG92ZXIgYSBVSSBjYW52YXMncyBvd24gcm91dGVyXG4gICAqIHdpdGhvdXQgc3dhbGxvd2luZyBzZWxlY3QgLyBjb250ZXh0LW1lbnUgLyB1bmRvIGdlc3R1cmVzIGl0IGRvZXNuJ3Qgb3duLlxuICAgKi9cbiAgY2xhaW1hYmxlQWN0aW9ucz86IFJlYWRvbmx5U2V0PFJvdXRlckFjdGlvblsna2luZCddPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRWRpdGFibGVUYXJnZXQodDogRXZlbnRUYXJnZXQgfCBudWxsKTogYm9vbGVhbiB7XG4gIGlmICghdCB8fCAhKHQgYXMgSFRNTEVsZW1lbnQpLnRhZ05hbWUpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgZWwgPSB0IGFzIEhUTUxFbGVtZW50O1xuICBjb25zdCB0YWcgPSBlbC50YWdOYW1lO1xuICBpZiAodGFnID09PSAnSU5QVVQnIHx8IHRhZyA9PT0gJ1RFWFRBUkVBJyB8fCB0YWcgPT09ICdTRUxFQ1QnKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGVsLmlzQ29udGVudEVkaXRhYmxlKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFBoYXNlIDYg4oCUIHRoZSBjb21tZW50cyBvdmVybGF5IChwaW5zIC8gY29tcG9zZXIgLyB0aHJlYWQgcG9wb3ZlciAvIG1lbnRpb25cbiAqIHBvcHVwKSBsaXZlcyBJTlNJREUgdGhlIGNhbnZhcyB3b3JsZCwgd2hpY2ggbWVhbnMgaXRzIERPTSBub2RlcyBhcmUgaW5zaWRlXG4gKiB0aGUgaW5wdXQtcm91dGVyJ3MgY2FwdHVyZSBob3N0LiBXaXRob3V0IGFuIGV4cGxpY2l0IGJhaWwtb3V0IHRoZSByb3V0ZXJcbiAqIHdvdWxkIGBwcmV2ZW50RGVmYXVsdCArIHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbmAgZXZlcnkgY2xpY2sgb24gYVxuICogY29tcG9zZXIgYnV0dG9uIHdoaWxlIGNvbW1lbnQgbW9kZSBpcyBhY3RpdmUsIGJsb2NraW5nIFNhdmUgLyBDYW5jZWwuXG4gKlxuICogV2UgdHJlYXQgdGhlIG92ZXJsYXkgbm9kZXMgbGlrZSBlZGl0YWJsZSBmb3JtIHdpZGdldHMg4oCUIHRoZSByb3V0ZXIgeWllbGRzLFxuICogdGhlIFJlYWN0IGV2ZW50IGhhbmRsZXIgcnVucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzT3ZlcmxheVRhcmdldCh0OiBFdmVudFRhcmdldCB8IG51bGwpOiBib29sZWFuIHtcbiAgaWYgKCF0IHx8ICEodCBhcyBFbGVtZW50KS5jbG9zZXN0KSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiAhISh0IGFzIEVsZW1lbnQpLmNsb3Nlc3QoJy5jbS1jb21wb3NlciwgLmNtLXRocmVhZCwgLmNtLW1lbnRpb24tcG9wdXAsIC5jbS1waW4nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUlucHV0Um91dGVyKG9wdHM6IFVzZUlucHV0Um91dGVyT3B0aW9ucyk6IHZvaWQge1xuICBjb25zdCB7IGhvc3RSZWYsIGdldEFjdGl2ZVRvb2wsIGlzU3BhY2VIZWxkLCBjYWxsYmFja3MsIGVuYWJsZWQgPSB0cnVlLCBjbGFpbWFibGVBY3Rpb25zIH0gPSBvcHRzO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFlbmFibGVkKSByZXR1cm47XG4gICAgY29uc3QgaG9zdCA9IGhvc3RSZWYuY3VycmVudDtcbiAgICBpZiAoIWhvc3QpIHJldHVybjtcblxuICAgIC8vIERvd25ncmFkZSBhbnkgYWN0aW9uIHRoaXMgcm91dGVyIGlzbid0IHBlcm1pdHRlZCB0byBjbGFpbSB0byBuby1vcCBzbyBpdFxuICAgIC8vIHByb3BhZ2F0ZXMgdW50b3VjaGVkIChubyBwcmV2ZW50RGVmYXVsdCAvIG5vIGRpc3BhdGNoKS4gSWRlbnRpdHkgcGFzcy1cbiAgICAvLyB0aHJvdWdoIHdoZW4gbm8gYWxsb3dsaXN0IGlzIGNvbmZpZ3VyZWQuXG4gICAgY29uc3QgY2xhaW0gPSAoYWN0aW9uOiBSb3V0ZXJBY3Rpb24pOiBSb3V0ZXJBY3Rpb24gPT5cbiAgICAgIGNsYWltYWJsZUFjdGlvbnMgJiYgYWN0aW9uLmtpbmQgIT09ICduby1vcCcgJiYgIWNsYWltYWJsZUFjdGlvbnMuaGFzKGFjdGlvbi5raW5kKVxuICAgICAgICA/IHsga2luZDogJ25vLW9wJyB9XG4gICAgICAgIDogYWN0aW9uO1xuXG4gICAgY29uc3QgZGlzcGF0Y2ggPSAoYWN0aW9uOiBSb3V0ZXJBY3Rpb24pOiB2b2lkID0+IHtcbiAgICAgIHN3aXRjaCAoYWN0aW9uLmtpbmQpIHtcbiAgICAgICAgY2FzZSAnaG92ZXInOlxuICAgICAgICAgIGNhbGxiYWNrcy5vbkhvdmVyPy4oYWN0aW9uKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgICBjYWxsYmFja3Mub25TZWxlY3Q/LihhY3Rpb24pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdkcm9wLWNvbW1lbnQnOlxuICAgICAgICAgIGNhbGxiYWNrcy5vbkRyb3BDb21tZW50Py4oYWN0aW9uKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY29udGV4dC1tZW51JzpcbiAgICAgICAgICBjYWxsYmFja3Mub25Db250ZXh0TWVudT8uKGFjdGlvbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3Rvb2wnOlxuICAgICAgICAgIGNhbGxiYWNrcy5vblRvb2w/LihhY3Rpb24pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdlc2NhcGUnOlxuICAgICAgICAgIGNhbGxiYWNrcy5vbkVzY2FwZT8uKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3VuZG8nOlxuICAgICAgICAgIGNhbGxiYWNrcy5vblVuZG8/LigpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdyZWRvJzpcbiAgICAgICAgICBjYWxsYmFja3Mub25SZWRvPy4oKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbm8tb3AnOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblBvaW50ZXJNb3ZlID0gKGU6IFBvaW50ZXJFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgYWN0aW9uID0gY2xhaW0oXG4gICAgICAgIGNsYXNzaWZ5KHtcbiAgICAgICAgICB0eXBlOiAncG9pbnRlcm1vdmUnLFxuICAgICAgICAgIGJ1dHRvbjogZS5idXR0b24sXG4gICAgICAgICAgbWV0YUtleTogZS5tZXRhS2V5LFxuICAgICAgICAgIGN0cmxLZXk6IGUuY3RybEtleSxcbiAgICAgICAgICBzaGlmdEtleTogZS5zaGlmdEtleSxcbiAgICAgICAgICBhbHRLZXk6IGUuYWx0S2V5LFxuICAgICAgICAgIGNsaWVudFg6IGUuY2xpZW50WCxcbiAgICAgICAgICBjbGllbnRZOiBlLmNsaWVudFksXG4gICAgICAgICAgc3BhY2VIZWxkOiBpc1NwYWNlSGVsZD8uKCkgPz8gZmFsc2UsXG4gICAgICAgICAgYWN0aXZlVG9vbDogZ2V0QWN0aXZlVG9vbCgpLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIGRpc3BhdGNoKGFjdGlvbik7XG4gICAgfTtcblxuICAgIGNvbnN0IG9uUG9pbnRlckRvd24gPSAoZTogUG9pbnRlckV2ZW50KTogdm9pZCA9PiB7XG4gICAgICAvLyBQaGFzZSA2IOKAlCBvdmVybGF5IHN1cmZhY2VzIChjb21wb3NlciAvIHRocmVhZCAvIG1lbnRpb24gcG9wdXApIG93blxuICAgICAgLy8gdGhlaXIgb3duIGNsaWNrcy4gVGhlIHJvdXRlciBpcyBpbiBjYXB0dXJlIHBoYXNlLCBzbyB3ZSBoYXZlIHRvXG4gICAgICAvLyBiYWlsIEhFUkUgYmVmb3JlIGNsYXNzaWZ5IGNhbiBjbGFpbSB0aGUgZXZlbnQuXG4gICAgICBpZiAoaXNPdmVybGF5VGFyZ2V0KGUudGFyZ2V0KSkgcmV0dXJuO1xuICAgICAgY29uc3QgYWN0aW9uID0gY2xhaW0oXG4gICAgICAgIGNsYXNzaWZ5KHtcbiAgICAgICAgICB0eXBlOiAncG9pbnRlcmRvd24nLFxuICAgICAgICAgIGJ1dHRvbjogZS5idXR0b24sXG4gICAgICAgICAgbWV0YUtleTogZS5tZXRhS2V5LFxuICAgICAgICAgIGN0cmxLZXk6IGUuY3RybEtleSxcbiAgICAgICAgICBzaGlmdEtleTogZS5zaGlmdEtleSxcbiAgICAgICAgICBhbHRLZXk6IGUuYWx0S2V5LFxuICAgICAgICAgIGNsaWVudFg6IGUuY2xpZW50WCxcbiAgICAgICAgICBjbGllbnRZOiBlLmNsaWVudFksXG4gICAgICAgICAgc3BhY2VIZWxkOiBpc1NwYWNlSGVsZD8uKCkgPz8gZmFsc2UsXG4gICAgICAgICAgYWN0aXZlVG9vbDogZ2V0QWN0aXZlVG9vbCgpLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIGlmIChhY3Rpb24ua2luZCAhPT0gJ25vLW9wJykge1xuICAgICAgICAvLyBTdXBwcmVzcyBuYXRpdmUgYmVoYXZpb3Igb24gZXZlcnkgZXZlbnQgdGhlIHJvdXRlciBjbGFpbXMg4oCUXG4gICAgICAgIC8vIGJ1dHRvbiBwcmVzc2VzIGRvbid0IGZpcmUsIGlucHV0cyBkb24ndCBmb2N1cywgdGhlIGNhbnZhc1xuICAgICAgICAvLyBjb250ZW50J3Mgb3duIGNsaWNrIGhhbmRsZXJzIGRvbid0IHJ1bi4gVGhlIHJvdXRlciBsaXZlcyBpblxuICAgICAgICAvLyBjYXB0dXJlIHBoYXNlIHNvIHRoaXMgZmlyZXMgYmVmb3JlIGRlc2NlbmRhbnRzLlxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgICBkaXNwYXRjaChhY3Rpb24pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBQYWlyZWQgbW91c2Vkb3duIGxpc3RlbmVyIOKAlCBwcmV2ZW50RGVmYXVsdCBvbiBwb2ludGVyZG93biBkb2VzIE5PVFxuICAgICAqIHN1cHByZXNzIHRoZSBtb3VzZWRvd24gZXZlbnQgdGhhdCBicm93c2VycyBmaXJlIGFsb25nc2lkZSwgYW5kXG4gICAgICogYDxpbnB1dD5gIC8gYDxidXR0b24+YCBmb2N1cyBpcyBkcml2ZW4gYnkgbW91c2Vkb3duJ3MgZGVmYXVsdCBiZWhhdmlvci5cbiAgICAgKiBXZSBtaXJyb3IgdGhlIHNhbWUgZ2F0ZSBhcyBwb2ludGVyZG93biBzbyBzdXBwcmVzc2VkIHBvaW50ZXJkb3ducyBhbHNvXG4gICAgICogc3RvcCB0aGVpciB0d2luIG1vdXNlZG93bi5cbiAgICAgKi9cbiAgICBjb25zdCBvbk1vdXNlRG93biA9IChlOiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoaXNPdmVybGF5VGFyZ2V0KGUudGFyZ2V0KSkgcmV0dXJuO1xuICAgICAgY29uc3QgYWN0aW9uID0gY2xhaW0oXG4gICAgICAgIGNsYXNzaWZ5KHtcbiAgICAgICAgICB0eXBlOiAncG9pbnRlcmRvd24nLFxuICAgICAgICAgIGJ1dHRvbjogZS5idXR0b24sXG4gICAgICAgICAgbWV0YUtleTogZS5tZXRhS2V5LFxuICAgICAgICAgIGN0cmxLZXk6IGUuY3RybEtleSxcbiAgICAgICAgICBzaGlmdEtleTogZS5zaGlmdEtleSxcbiAgICAgICAgICBhbHRLZXk6IGUuYWx0S2V5LFxuICAgICAgICAgIGNsaWVudFg6IGUuY2xpZW50WCxcbiAgICAgICAgICBjbGllbnRZOiBlLmNsaWVudFksXG4gICAgICAgICAgc3BhY2VIZWxkOiBpc1NwYWNlSGVsZD8uKCkgPz8gZmFsc2UsXG4gICAgICAgICAgYWN0aXZlVG9vbDogZ2V0QWN0aXZlVG9vbCgpLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIGlmIChhY3Rpb24ua2luZCAhPT0gJ25vLW9wJykge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENsaWNrIGxpc3RlbmVyIOKAlCBmaXJlcyBBRlRFUiBwb2ludGVyZG93bitwb2ludGVydXAuIEV2ZW4gd2l0aFxuICAgICAqIHByZXZlbnREZWZhdWx0IG9uIG1vdXNlZG93biwgdGhlIGNsaWNrIGV2ZW50IHN0aWxsIHN5bnRoZXNpemVzIGZvclxuICAgICAqIG5vbi1mb3JtIGVsZW1lbnRzLiBXZSBzdXBwcmVzcyBpdCB3aGVuZXZlciB0aGUgcm91dGVyIGNsYWltZWQgdGhlXG4gICAgICogbWF0Y2hpbmcgcG9pbnRlcmRvd24gKHJlLWNsYXNzaWZ5IHdpdGggdGhlIHNhbWUgbW9kaWZpZXJzKS5cbiAgICAgKi9cbiAgICBjb25zdCBvbkNsaWNrID0gKGU6IE1vdXNlRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmIChpc092ZXJsYXlUYXJnZXQoZS50YXJnZXQpKSByZXR1cm47XG4gICAgICBjb25zdCB0b29sID0gZ2V0QWN0aXZlVG9vbCgpO1xuICAgICAgY29uc3QgbW9kID0gZS5tZXRhS2V5IHx8IGUuY3RybEtleTtcbiAgICAgIC8vIE1hcCB0aGUgY2xpY2sgdG8gdGhlIGFjdGlvbiBraW5kIHRoZSBtYXRjaGluZyBwb2ludGVyZG93biB3b3VsZCBoYXZlXG4gICAgICAvLyBwcm9kdWNlZCwgdGhlbiBob25vciB0aGUgY2xhaW0gYWxsb3dsaXN0IHNvIGEgc2NvcGVkIHJvdXRlciAodGhlXG4gICAgICAvLyBjb21tZW50IG1vdW50IGxheWVyKSBkb2Vzbid0IHN1cHByZXNzIGNsaWNrcyBpdCBuZXZlciBjbGFpbWVkLlxuICAgICAgY29uc3Qgd291bGRSb3V0ZUtpbmQ6IFJvdXRlckFjdGlvblsna2luZCddIHwgbnVsbCA9XG4gICAgICAgIHRvb2wgPT09ICdjb21tZW50J1xuICAgICAgICAgID8gJ2Ryb3AtY29tbWVudCdcbiAgICAgICAgICA6IHRvb2wgPT09ICdtb3ZlJyAmJiBtb2QgJiYgZS5idXR0b24gPT09IDBcbiAgICAgICAgICAgID8gJ3NlbGVjdCdcbiAgICAgICAgICAgIDogZS5idXR0b24gPT09IDJcbiAgICAgICAgICAgICAgPyAnY29udGV4dC1tZW51J1xuICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICBpZiAod291bGRSb3V0ZUtpbmQgJiYgKCFjbGFpbWFibGVBY3Rpb25zIHx8IGNsYWltYWJsZUFjdGlvbnMuaGFzKHdvdWxkUm91dGVLaW5kKSkpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvbkNvbnRleHRNZW51ID0gKGU6IE1vdXNlRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IGNsYWltKFxuICAgICAgICBjbGFzc2lmeSh7XG4gICAgICAgICAgdHlwZTogJ2NvbnRleHRtZW51JyxcbiAgICAgICAgICBjbGllbnRYOiBlLmNsaWVudFgsXG4gICAgICAgICAgY2xpZW50WTogZS5jbGllbnRZLFxuICAgICAgICAgIG1ldGFLZXk6IGUubWV0YUtleSxcbiAgICAgICAgICBjdHJsS2V5OiBlLmN0cmxLZXksXG4gICAgICAgICAgc2hpZnRLZXk6IGUuc2hpZnRLZXksXG4gICAgICAgICAgYWx0S2V5OiBlLmFsdEtleSxcbiAgICAgICAgICBhY3RpdmVUb29sOiBnZXRBY3RpdmVUb29sKCksXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgaWYgKGFjdGlvbi5raW5kID09PSAnbm8tb3AnKSByZXR1cm47IC8vIG5vdCBvdXJzIHRvIGNsYWltIOKAlCBsZXQgaXQgYnViYmxlXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgZGlzcGF0Y2goYWN0aW9uKTtcbiAgICB9O1xuXG4gICAgY29uc3Qgb25LZXlEb3duID0gKGU6IEtleWJvYXJkRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IGNsYWltKFxuICAgICAgICBjbGFzc2lmeSh7XG4gICAgICAgICAgdHlwZTogJ2tleWRvd24nLFxuICAgICAgICAgIGtleTogZS5rZXksXG4gICAgICAgICAgbWV0YUtleTogZS5tZXRhS2V5LFxuICAgICAgICAgIGN0cmxLZXk6IGUuY3RybEtleSxcbiAgICAgICAgICBzaGlmdEtleTogZS5zaGlmdEtleSxcbiAgICAgICAgICBhbHRLZXk6IGUuYWx0S2V5LFxuICAgICAgICAgIGlzRWRpdGFibGU6IGlzRWRpdGFibGVUYXJnZXQoZS50YXJnZXQpLFxuICAgICAgICAgIGFjdGl2ZVRvb2w6IGdldEFjdGl2ZVRvb2woKSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICBpZiAoXG4gICAgICAgIGFjdGlvbi5raW5kID09PSAndG9vbCcgfHxcbiAgICAgICAgYWN0aW9uLmtpbmQgPT09ICdlc2NhcGUnIHx8XG4gICAgICAgIGFjdGlvbi5raW5kID09PSAndW5kbycgfHxcbiAgICAgICAgYWN0aW9uLmtpbmQgPT09ICdyZWRvJ1xuICAgICAgKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICAgIGRpc3BhdGNoKGFjdGlvbik7XG4gICAgfTtcblxuICAgIC8vIENhcHR1cmUgcGhhc2UgZm9yIHBvaW50ZXIvbW91c2UvY2xpY2sgZXZlbnRzIOKAlCByb3V0ZXIgcnVucyBCRUZPUkVcbiAgICAvLyBkZXNjZW5kYW50cyAoYnV0dG9ucywgaW5wdXRzLCBjYW52YXMgY29udGVudCBsaXN0ZW5lcnMpLiBGb3IgZXZlbnRzIHRoZVxuICAgIC8vIGNsYXNzaWZpZXIgY2xhaW1zLCB3ZSBwcmV2ZW50RGVmYXVsdCArIHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiBzbyB0aGVcbiAgICAvLyBkZXNjZW5kYW50cyBuZXZlciBzZWUgdGhlbS5cbiAgICBob3N0LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgb25Qb2ludGVyTW92ZSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICAgIGhvc3QuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCBvblBvaW50ZXJEb3duLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gICAgaG9zdC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbk1vdXNlRG93biwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgIGhvc3QuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvbkNsaWNrLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gICAgaG9zdC5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIG9uQ29udGV4dE1lbnUsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgICAvLyBLZXkgZXZlbnRzOiBhdHRhY2ggb24gZG9jdW1lbnQgc28gZm9jdXMgaW5zaWRlIGFueSBkZXNjZW5kYW50IGlzIE9LO1xuICAgIC8vIHRoZSBlZGl0YWJsZS10YXJnZXQgZ2F0ZSBoYW5kbGVzIHRoZSBcInVzZXIgaXMgdHlwaW5nXCIgY2FzZS5cbiAgICBjb25zdCBkb2MgPSBob3N0Lm93bmVyRG9jdW1lbnQgPz8gZG9jdW1lbnQ7XG4gICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBvbktleURvd24sIHRydWUpO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGhvc3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCBvblBvaW50ZXJNb3ZlKTtcbiAgICAgIGhvc3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCBvblBvaW50ZXJEb3duLCB7XG4gICAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgICB9IGFzIEV2ZW50TGlzdGVuZXJPcHRpb25zKTtcbiAgICAgIGhvc3QucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgb25Nb3VzZURvd24sIHsgY2FwdHVyZTogdHJ1ZSB9IGFzIEV2ZW50TGlzdGVuZXJPcHRpb25zKTtcbiAgICAgIGhvc3QucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvbkNsaWNrLCB7IGNhcHR1cmU6IHRydWUgfSBhcyBFdmVudExpc3RlbmVyT3B0aW9ucyk7XG4gICAgICBob3N0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51Jywgb25Db250ZXh0TWVudSwge1xuICAgICAgICBjYXB0dXJlOiB0cnVlLFxuICAgICAgfSBhcyBFdmVudExpc3RlbmVyT3B0aW9ucyk7XG4gICAgICBkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG9uS2V5RG93biwgdHJ1ZSk7XG4gICAgfTtcbiAgfSwgW2VuYWJsZWQsIGhvc3RSZWYsIGdldEFjdGl2ZVRvb2wsIGlzU3BhY2VIZWxkLCBjYWxsYmFja3MsIGNsYWltYWJsZUFjdGlvbnNdKTtcbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyByZXNvbHZlSG92ZXJUYXJnZXQg4oCUIHdhbGtzIGZyb20gYSBjbGllbnRYL2NsaWVudFkgcGFpciB0byB0aGUgY2FudmFzIGVsZW1lbnRcbi8vIG9mIGludGVyZXN0LiBEZWZhdWx0ID0gdG9wbW9zdCBgW2RhdGEtY2QtaWRdYCBhbmNlc3RvciAodGhlIHN0YWJsZVxuLy8gcGlwZWxpbmUtc3RhbXBlZCBhbmNob3IpLiBgZGVlcCA9IHRydWVgIHJldHVybnMgdGhlIGRlZXBlc3QgZGVzY2VuZGFudFxuLy8gKENtZC1ob3ZlciBiZWhhdmlvcikuXG5cbmV4cG9ydCBpbnRlcmZhY2UgSG92ZXJUYXJnZXQge1xuICBlbDogRWxlbWVudDtcbiAgY2RJZDogc3RyaW5nIHwgbnVsbDtcbiAgYXJ0Ym9hcmRJZDogc3RyaW5nIHwgbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVIb3ZlclRhcmdldChcbiAgZG9jOiBEb2N1bWVudCxcbiAgY2xpZW50WDogbnVtYmVyLFxuICBjbGllbnRZOiBudW1iZXIsXG4gIG9wdHM6IHsgZGVlcDogYm9vbGVhbiB9XG4pOiBIb3ZlclRhcmdldCB8IG51bGwge1xuICBjb25zdCBoaXQgPSBkb2MuZWxlbWVudEZyb21Qb2ludChjbGllbnRYLCBjbGllbnRZKTtcbiAgaWYgKCFoaXQpIHJldHVybiBudWxsO1xuICAvLyBTa2lwIHRoZSBmbG9hdGluZyBjaHJvbWUgKE1pbmlNYXAgLyBab29tVG9vbGJhciAvIFRvb2xQYWxldHRlIC8gQ29udGV4dE1lbnUpXG4gIC8vIEFORCB0aGUgY2FudmFzL3dvcmxkIGZyYW1lIGl0c2VsZiDigJQgdGhlIHVzZXIgaXMgbmV2ZXIgYXNraW5nIHRvIFwic2VsZWN0XG4gIC8vIHRoZSBlbnRpcmUgY2FudmFzIHZpZXdwb3J0LFwiIHRoYXQncyBhIFVJIGFjY2lkZW50IGZyb20gY2xpbWJpbmcgdG9vIGhpZ2guXG4gIGlmIChoaXQuY2xvc2VzdD8uKCcuZGMtbW0sIC5kYy16b29tLXRiLCAuZGMtdG9vbC1wYWxldHRlLCAuZGMtY29udGV4dC1tZW51LCAuZGMtY3YtZ3JvdXAtYmJveCcpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBhcnRib2FyZEVsID0gaGl0LmNsb3Nlc3Q/LignW2RhdGEtZGMtc2NyZWVuXScpID8/IG51bGw7XG4gIGNvbnN0IGFydGJvYXJkSWQgPSBhcnRib2FyZEVsPy5nZXRBdHRyaWJ1dGUoJ2RhdGEtZGMtc2NyZWVuJykgPz8gbnVsbDtcblxuICAvLyBIb3Zlci10YXJnZXQgaGFyZCBjZWlsaW5nID0gYC5kYy1hcnRib2FyZC1ib2R5YC4gSW5uZXIgRE9NIGNvbnRlbnQgbGl2ZXNcbiAgLy8gdGhlcmU7IGNocm9tZSBsaXZlcyBvdXRzaWRlIChsYWJlbCwgaGVhZGVyLCBhcnRpY2xlIHJvb3QpLiBUaGUgdHdvIHBhdGhzXG4gIC8vIGRpdmVyZ2UgZnJvbSBoZXJlOlxuICAvLyAgICogaGl0IOKIiCBib2R5IOKGkiByZXNvbHZlIHRvIHRoZSBkZWVwZXN0IHN0YW1wZWQgZWxlbWVudCAoZXhpc3RpbmdcbiAgLy8gICAgIGRlZXAvdG9wIGxvZ2ljIGJlbG93KS5cbiAgLy8gICAqIGhpdCDiiIggY2hyb21lIChsYWJlbC9oZWFkZXIvYXJ0aWNsZS1yb290KSDihpIgdGhlIHVzZXIgd2FudHMgdG8gc2VsZWN0XG4gIC8vICAgICB0aGUgV0hPTEUgYXJ0Ym9hcmQuIFJldHVybiB0aGUgYXJ0aWNsZSBlbGVtZW50IGl0c2VsZiB3aXRoIG5vIGNkSWQ7XG4gIC8vICAgICBjb25zdW1lcnMgKGhvdmVyVGFyZ2V0VG9TZWxlY3Rpb24pIGZhbGwgYmFjayB0byBhXG4gIC8vICAgICBgW2RhdGEtZGMtc2NyZWVuPVwi4oCmXCJdYCBzZWxlY3RvciB0aGF0IHdyYXBzIHRoZSB3aG9sZSBmcmFtZS4gVGhpcyBpc1xuICAvLyAgICAgd2hhdCBlbmFibGVzIENtZCtTaGlmdCtDbGljayBtdWx0aS1zZWxlY3Qgb2YgYXJ0Ym9hcmRzIChUMjQgLyBHOCkuXG4gIGNvbnN0IGJvZHlFbCA9IGhpdC5jbG9zZXN0Py4oJy5kYy1hcnRib2FyZC1ib2R5JykgPz8gbnVsbDtcbiAgaWYgKCFib2R5RWwpIHtcbiAgICBpZiAoYXJ0Ym9hcmRFbCAmJiBhcnRib2FyZElkKSB7XG4gICAgICByZXR1cm4geyBlbDogYXJ0Ym9hcmRFbCwgY2RJZDogbnVsbCwgYXJ0Ym9hcmRJZCB9O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAoaGl0ID09PSBib2R5RWwpIHtcbiAgICAvLyBDbGlja2VkIHRoZSBib2R5IHdyYXBwZXIgaXRzZWxmIChlbXB0eSBwYWRkaW5nIGluc2lkZSBhbiBhcnRib2FyZCwgbm9cbiAgICAvLyB1c2VyIGNvbnRlbnQgdW5kZXIgdGhlIGN1cnNvcikuIFByb21vdGUgdG8gXCJzZWxlY3Qgd2hvbGUgYXJ0Ym9hcmRcIiBzb1xuICAgIC8vIHRoZSBnZXN0dXJlIHN0YXlzIGNvbnNpc3RlbnQgd2l0aCBjaHJvbWUgY2xpY2tzIGFib3ZlLlxuICAgIGlmIChhcnRib2FyZEVsICYmIGFydGJvYXJkSWQpIHtcbiAgICAgIHJldHVybiB7IGVsOiBhcnRib2FyZEVsLCBjZElkOiBudWxsLCBhcnRib2FyZElkIH07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKG9wdHMuZGVlcCkge1xuICAgIC8vIERlZXBlc3QgbW9kZSDigJQgdGhlIGhpdCBlbGVtZW50IElTIHRoZSB0YXJnZXQuIFVzZSBpdHMgT1dOIGRhdGEtY2QtaWRcbiAgICAvLyB3aGVuIHByZXNlbnQ7IG5ldmVyIGNsaW1iIHRvIGFuIGFuY2VzdG9yJ3MgaWQgKGNsaW1iaW5nIHdhcyB0aGUgY2F1c2VcbiAgICAvLyBvZiBcIkNtZC1jbGljayBvbiBhIGRlZXAgc3BhbiBzZWxlY3RzIHRoZSB3aG9sZSBhcnRib2FyZCByb290XCIpLiBXaGVuXG4gICAgLy8gdGhlIGhpdCBsYWNrcyBhIHN0YW1wZWQgaWQsIGNvbnN1bWVycyBmYWxsIGJhY2sgdG8gYSBDU1MtcGF0aCBzZWxlY3Rvci5cbiAgICBjb25zdCBjZElkID0gaGl0LmdldEF0dHJpYnV0ZT8uKCdkYXRhLWNkLWlkJykgPz8gbnVsbDtcbiAgICByZXR1cm4geyBlbDogaGl0LCBjZElkLCBhcnRib2FyZElkIH07XG4gIH1cblxuICAvLyBUb3AgbW9kZSDigJQgY2xpbWIgdG8gdGhlIHRvcG1vc3QgZGVzY2VuZGFudCBvZiB0aGUgYXJ0Ym9hcmQgYm9keSB0aGF0XG4gIC8vIHN0aWxsIGNhcnJpZXMgYSBkYXRhLWNkLWlkLiBIYXJkIGNlaWxpbmcgaXMgYm9keUVsIGl0c2VsZiAobmV2ZXIgc2VsZWN0XG4gIC8vIHRoZSBib2R5IHdyYXBwZXIgb3IgaGlnaGVyKS5cbiAgbGV0IGN1cjogRWxlbWVudCB8IG51bGwgPSBoaXQ7XG4gIGxldCB0b3BDZEVsOiBFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHdoaWxlIChjdXIgJiYgY3VyICE9PSBib2R5RWwpIHtcbiAgICBpZiAoY3VyLmhhc0F0dHJpYnV0ZT8uKCdkYXRhLWNkLWlkJykpIHRvcENkRWwgPSBjdXI7XG4gICAgY3VyID0gY3VyLnBhcmVudEVsZW1lbnQ7XG4gIH1cbiAgY29uc3QgZWwgPSB0b3BDZEVsID8/IGhpdDtcbiAgY29uc3QgY2RJZCA9IGVsLmdldEF0dHJpYnV0ZT8uKCdkYXRhLWNkLWlkJykgPz8gbnVsbDtcbiAgcmV0dXJuIHsgZWwsIGNkSWQsIGFydGJvYXJkSWQgfTtcbn1cbiIsCiAgICAiLyoqXG4gKiBAZmlsZSAgICAgICB1c2UtdG9vbC1tb2RlLnRzeCDigJQgUGhhc2UgNC4xIHRvb2wtbW9kZSBzdG9yZVxuICogQHNjb3BlICAgICAgYXBwcy9zdHVkaW8vdXNlLXRvb2wtbW9kZS50c3hcbiAqIEBwdXJwb3NlICAgIENvbnRleHQgKyBob29rIGZvciB0aGUgYWN0aXZlIGNhbnZhcyB0b29sLiBXaXJlZCBpbnRvXG4gKiAgICAgICAgICAgICBEZXNpZ25DYW52YXMuIFBoYXNlIDUgd2lsbFxuICogICAgICAgICAgICAgcmVnaXN0ZXIgYWRkaXRpb25hbCB0b29scyAocGVuLCBjaXJjbGUsIGFycm93LCBlcmFzZXIpIHZpYVxuICogICAgICAgICAgICAgdGhlIHNhbWUgcHJvdmlkZXIg4oCUIHRoZSBBUEkgaXMgaW50ZW50aW9uYWxseSBvcGVuLlxuICpcbiAqIFRoZSByb3V0ZXIncyBgb25Ub29sYCBjYWxsYmFjayAoaW5wdXQtcm91dGVyLnRzeCkgd3JpdGVzIGludG8gdGhpcyBzdG9yZS5cbiAqIFRoZSBUb29sUGFsZXR0ZSArIGN1cnNvciBzeW5jIHJlYWQgZnJvbSBpdC4gU2VsZWN0aW5nIGEgdG9vbCBhbHNvIG11dGF0ZXNcbiAqIGBkb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvcmAgc28gdGhlIGFmZm9yZGFuY2UgbWF0Y2hlcyBhY3Jvc3MgdGhlIGlmcmFtZS5cbiAqL1xuXG5pbXBvcnQge1xuICBjcmVhdGVDb250ZXh0LFxuICB0eXBlIFJlYWN0Tm9kZSxcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUNvbnRleHQsXG4gIHVzZUVmZmVjdCxcbiAgdXNlTWVtbyxcbiAgdXNlU3RhdGUsXG59IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgVE9PTF9DVVJTT1JTIH0gZnJvbSAnLi9jYW52YXMtY3Vyc29ycy50cyc7XG5pbXBvcnQgdHlwZSB7IFRvb2wgfSBmcm9tICcuL2lucHV0LXJvdXRlci50c3gnO1xuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFR5cGVzXG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9vbERlc2NyaXB0b3Ige1xuICBpZDogVG9vbDtcbiAgbGFiZWw6IHN0cmluZztcbiAgLyoqIExldHRlci1rZXkgc2hvcnRjdXQgc2hvd24gaW4gdGhlIHBhbGV0dGUgdG9vbHRpcC4gKi9cbiAgc2hvcnRjdXQ6IHN0cmluZztcbiAgLyoqIENTUyBjdXJzb3IgdmFsdWUgYXBwbGllZCB0byA8Ym9keT4gd2hlbiB0aGlzIHRvb2wgaXMgYWN0aXZlLiAqL1xuICBjdXJzb3I6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQaGFzZSAyNCDigJQgdGhlIHNpeCBwcmltaXRpdmVzIHRoZSBzaW5nbGUgU2hhcGUgdG9vbCBjYW4gZHJhdy4gTWFwcyBvbnRvIHRoZVxuICogc3Ryb2tlIG1vZGVsOiBzcXVhcmUvcm91bmRlZCDihpIgYHJlY3RgIChjb3JuZXJSYWRpdXMgMCAvIDgpOyBjaXJjbGUg4oaSXG4gKiBgZWxsaXBzZWA7IGRpYW1vbmQvdHJpYW5nbGUvdHJpYW5nbGUtZG93biDihpIgYHBvbHlnb25gLlxuICovXG5leHBvcnQgdHlwZSBTaGFwZUtpbmQgPSAnc3F1YXJlJyB8ICdyb3VuZGVkJyB8ICdjaXJjbGUnIHwgJ2RpYW1vbmQnIHwgJ3RyaWFuZ2xlJyB8ICd0cmlhbmdsZS1kb3duJztcblxuLy8gUGhhc2UgMjEg4oCUIGV2ZXJ5IHRvb2wgc2hpcHMgYSBjdXN0b20gMzLDlzMyIFNWRyBjdXJzb3IgKGNhbnZhcy1jdXJzb3JzLnRzKVxuLy8gd2l0aCBhIHdoaXRlIG91dGxpbmUgaGFsbyBzbyB0aGUgZ2x5cGggcmVhZHMgb24gYW55IGJhY2tncm91bmQuIFRoZSBuYXRpdmVcbi8vIGNyb3NzaGFpci90ZXh0L2NlbGwgd2VyZSB0aGluICsgdGlueSAoXCJwZW4gYWxtb3N0IGludmlzaWJsZVwiKTsgdGhlc2UgbWlycm9yXG4vLyB0aGUgdG9vbC1wYWxldHRlIGljb25zLiBgbW92ZWAga2VlcHMgdGhlIHN5c3RlbSBhcnJvdyBvbiBwdXJwb3NlLlxuZXhwb3J0IGNvbnN0IERFRkFVTFRfVE9PTFM6IHJlYWRvbmx5IFRvb2xEZXNjcmlwdG9yW10gPSBPYmplY3QuZnJlZXplKFtcbiAgeyBpZDogJ21vdmUnLCBsYWJlbDogJ01vdmUnLCBzaG9ydGN1dDogJ1YnLCBjdXJzb3I6IFRPT0xfQ1VSU09SUy5tb3ZlIH0sXG4gIHsgaWQ6ICdoYW5kJywgbGFiZWw6ICdIYW5kJywgc2hvcnRjdXQ6ICdIJywgY3Vyc29yOiBUT09MX0NVUlNPUlMuaGFuZCB9LFxuICB7IGlkOiAnY29tbWVudCcsIGxhYmVsOiAnQ29tbWVudCcsIHNob3J0Y3V0OiAnQycsIGN1cnNvcjogVE9PTF9DVVJTT1JTLmNvbW1lbnQgfSxcbiAgeyBpZDogJ3BlbicsIGxhYmVsOiAnUGVuJywgc2hvcnRjdXQ6ICdCJywgY3Vyc29yOiBUT09MX0NVUlNPUlMucGVuIH0sXG4gIC8vIEFubm90YXRpb24gcG9saXNoIChpdGVtIDgpIOKAlCBoaWdobGlnaHRlciBzaXRzIG5leHQgdG8gdGhlIHBlbi5cbiAgeyBpZDogJ2hpZ2hsaWdodGVyJywgbGFiZWw6ICdIaWdobGlnaHRlcicsIHNob3J0Y3V0OiAnSScsIGN1cnNvcjogVE9PTF9DVVJTT1JTLmhpZ2hsaWdodGVyIH0sXG4gIC8vIFBoYXNlIDI0IOKAlCBvbmUgU2hhcGUgdG9vbCByZXBsYWNlcyB0aGUgc2VwYXJhdGUgUmVjdCAoUikgKyBFbGxpcHNlIChPKVxuICAvLyBidXR0b25zOyB0aGUgcHJpbWl0aXZlIGlzIGNob3NlbiBmcm9tIHRoZSBwYWxldHRlIHBvcG92ZXIuXG4gIHsgaWQ6ICdzaGFwZScsIGxhYmVsOiAnU2hhcGUnLCBzaG9ydGN1dDogJ1InLCBjdXJzb3I6IFRPT0xfQ1VSU09SUy5zaGFwZSB9LFxuICB7IGlkOiAnc3RpY2t5JywgbGFiZWw6ICdTdGlja3knLCBzaG9ydGN1dDogJ04nLCBjdXJzb3I6IFRPT0xfQ1VSU09SUy5zdGlja3kgfSxcbiAgeyBpZDogJ2Fycm93JywgbGFiZWw6ICdBcnJvdycsIHNob3J0Y3V0OiAnQScsIGN1cnNvcjogVE9PTF9DVVJTT1JTLmFycm93IH0sXG4gIHsgaWQ6ICd0ZXh0JywgbGFiZWw6ICdUZXh0Jywgc2hvcnRjdXQ6ICdUJywgY3Vyc29yOiBUT09MX0NVUlNPUlMudGV4dCB9LFxuICB7IGlkOiAnZXJhc2VyJywgbGFiZWw6ICdFcmFzZXInLCBzaG9ydGN1dDogJ0UnLCBjdXJzb3I6IFRPT0xfQ1VSU09SUy5lcmFzZXIgfSxcbl0pO1xuXG5pbnRlcmZhY2UgVG9vbENvbnRleHRWYWx1ZSB7XG4gIHRvb2w6IFRvb2w7XG4gIHNldFRvb2w6ICh0OiBUb29sKSA9PiB2b2lkO1xuICB0b29sczogcmVhZG9ubHkgVG9vbERlc2NyaXB0b3JbXTtcbiAgLyoqIFQxOSDigJQgc3RpY2t5LXRvb2wgZG91YmxlLWNsaWNrIGxvY2suIFdoZW4gYHN0aWNreS5sb2NrZWQgPT09IHRydWVgIEFORFxuICAgKiAgYHN0aWNreS50b29sID09PSB0b29sYCwgZHJhdyB0b29scyBzdGF5IGFybWVkIGFmdGVyIGVhY2ggc2hhcGUgY29tbWl0XG4gICAqICAoVDE4IGF1dG8tZmxpcCBpcyBzdXBwcmVzc2VkKS4gU2luZ2xlLWNsaWNrIG9uIGFueSBvdGhlciB0b29sIGNsZWFyc1xuICAgKiAgc3RpY2t5OyBFc2MgY2xlYXJzICsgZmxpcHMgdG8gTW92ZS4gKi9cbiAgc3RpY2t5OiB7IHRvb2w6IFRvb2wgfCBudWxsOyBsb2NrZWQ6IGJvb2xlYW4gfTtcbiAgdG9nZ2xlU3RpY2t5OiAodDogVG9vbCkgPT4gdm9pZDtcbiAgY2xlYXJTdGlja3k6ICgpID0+IHZvaWQ7XG4gIC8qKiBQaGFzZSAyNCDigJQgdGhlIHByaW1pdGl2ZSB0aGUgU2hhcGUgdG9vbCB3aWxsIGRyYXcgbmV4dC4gKi9cbiAgc2hhcGVLaW5kOiBTaGFwZUtpbmQ7XG4gIHNldFNoYXBlS2luZDogKGs6IFNoYXBlS2luZCkgPT4gdm9pZDtcbn1cblxuY29uc3QgVG9vbENvbnRleHQgPSBjcmVhdGVDb250ZXh0PFRvb2xDb250ZXh0VmFsdWUgfCBudWxsPihudWxsKTtcblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBQcm92aWRlclxuXG5leHBvcnQgZnVuY3Rpb24gVG9vbFByb3ZpZGVyKHtcbiAgY2hpbGRyZW4sXG4gIHRvb2xzID0gREVGQVVMVF9UT09MUyxcbiAgaW5pdGlhbCA9ICdtb3ZlJyxcbn06IHtcbiAgY2hpbGRyZW46IFJlYWN0Tm9kZTtcbiAgdG9vbHM/OiByZWFkb25seSBUb29sRGVzY3JpcHRvcltdO1xuICBpbml0aWFsPzogVG9vbDtcbn0pIHtcbiAgY29uc3QgW3Rvb2wsIHNldFRvb2xTdGF0ZV0gPSB1c2VTdGF0ZTxUb29sPihpbml0aWFsKTtcbiAgY29uc3QgW3N0aWNreSwgc2V0U3RpY2t5XSA9IHVzZVN0YXRlPHsgdG9vbDogVG9vbCB8IG51bGw7IGxvY2tlZDogYm9vbGVhbiB9PigoKSA9PiAoe1xuICAgIHRvb2w6IG51bGwsXG4gICAgbG9ja2VkOiBmYWxzZSxcbiAgfSkpO1xuICBjb25zdCBzZXRUb29sID0gdXNlQ2FsbGJhY2soKHQ6IFRvb2wpID0+IHtcbiAgICBzZXRUb29sU3RhdGUodCk7XG4gICAgLy8gU2luZ2xlLWNsaWNrIG9uIGEgZGlmZmVyZW50IHRvb2wgY2xlYXJzIGFueSBzdGlja3kgbG9jayDigJQgc3RpY2t5IGlzXG4gICAgLy8gYSBwZXItdG9vbCBmbGFnLCBub3QgZ2xvYmFsLlxuICAgIHNldFN0aWNreSgocHJldikgPT4gKHByZXYubG9ja2VkICYmIHByZXYudG9vbCA9PT0gdCA/IHByZXYgOiB7IHRvb2w6IG51bGwsIGxvY2tlZDogZmFsc2UgfSkpO1xuICB9LCBbXSk7XG4gIGNvbnN0IHRvZ2dsZVN0aWNreSA9IHVzZUNhbGxiYWNrKCh0OiBUb29sKSA9PiB7XG4gICAgc2V0U3RpY2t5KChwcmV2KSA9PiB7XG4gICAgICBpZiAocHJldi5sb2NrZWQgJiYgcHJldi50b29sID09PSB0KSByZXR1cm4geyB0b29sOiBudWxsLCBsb2NrZWQ6IGZhbHNlIH07XG4gICAgICByZXR1cm4geyB0b29sOiB0LCBsb2NrZWQ6IHRydWUgfTtcbiAgICB9KTtcbiAgICBzZXRUb29sU3RhdGUodCk7XG4gIH0sIFtdKTtcbiAgY29uc3QgY2xlYXJTdGlja3kgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0U3RpY2t5KHsgdG9vbDogbnVsbCwgbG9ja2VkOiBmYWxzZSB9KTtcbiAgfSwgW10pO1xuICBjb25zdCBbc2hhcGVLaW5kLCBzZXRTaGFwZUtpbmRdID0gdXNlU3RhdGU8U2hhcGVLaW5kPignc3F1YXJlJyk7XG5cbiAgLy8gQ3Vyc29yIHN5bmMg4oCUIGFwcGxpZWQgaW5zaWRlIHRoZSBjYW52YXMgKHRoaXMgaG9vayBydW5zIGluIHRoZSBjYW52YXNcbiAgLy8gY29udGV4dCkuIFRoZSBhY3RpdmUgdG9vbCdzIGN1cnNvciBpcyBzZXQgb24gPGJvZHk+IEFORCBmb3JjZWQgYWNyb3NzIHRoZVxuICAvLyB3aG9sZSBjYW52YXMgd29ya2luZyBhcmVhIHZpYSBhbiBgIWltcG9ydGFudGAgcnVsZSwgc28gdGhlIGN1c3RvbSBjdXJzb3JcbiAgLy8gc2hvd3MgRVZFUllXSEVSRSDigJQgaW5jbHVkaW5nIG92ZXIgYXJ0Ym9hcmQgQ09OVEVOVCwgd2hvc2Ugb3duIGBjdXJzb3I6XG4gIC8vIHBvaW50ZXJgL2B0ZXh0YC/igKYgd291bGQgb3RoZXJ3aXNlIHdpbiAoUGhhc2UgMjQsIHRoZSBcImN1c3RvbSBjdXJzb3JzIGluIHRoZVxuICAvLyB3aG9sZSBhcHBcIiByZXF1aXJlbWVudDsgRmlnSmFtIGJlaGF2aW91cikuIENocm9tZSB0aGF0IGxpdmVzIE9VVFNJREVcbiAgLy8gYC5kYy13b3JsZGAgKHRvb2wgcGFsZXR0ZSwgY29udGV4dCB0b29sYmFyLCByZXNpemUgaGFuZGxlcykgaXMgaW50ZW50aW9uYWxseVxuICAvLyBOT1QgbWF0Y2hlZCwgc28gaXRzIGJ1dHRvbnMvaGFuZGxlcyBrZWVwIHRoZWlyIGFmZm9yZGFuY2UgY3Vyc29ycy4gVGhlXG4gIC8vIHZpZXdwb3J0LWNvbnRyb2xsZXIgc3RpbGwgb3ducyB0aGUgZ3JhYi9ncmFiYmluZyBzd2FwIGR1cmluZyBzcGFjZS1wYW4uXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcbiAgICBjb25zdCBkZXNjID0gdG9vbHMuZmluZCgodCkgPT4gdC5pZCA9PT0gdG9vbCk7XG4gICAgaWYgKCFkZXNjKSByZXR1cm47XG4gICAgY29uc3QgcHJldiA9IGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yO1xuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yID0gZGVzYy5jdXJzb3I7XG4gICAgbGV0IHN0eWxlRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGMtdG9vbC1jdXJzb3InKSBhcyBIVE1MU3R5bGVFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAoIXN0eWxlRWwpIHtcbiAgICAgIHN0eWxlRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgc3R5bGVFbC5pZCA9ICdkYy10b29sLWN1cnNvcic7XG4gICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlRWwpO1xuICAgIH1cbiAgICAvLyBUcnVseSBHTE9CQUwgaW5zaWRlIHRoZSBjYW52YXMgZG9jdW1lbnQg4oCUIGAqYCBzbyBpdCBjb3ZlcnMgdGhlIGVtcHR5IGdyaWRcbiAgICAvLyBob3N0LCBgLmRjLXdvcmxkYCwgZXZlcnkgYXJ0Ym9hcmQgKyBpdHMgY29udGVudCwgQU5EIHRoZSBmbG9hdGluZyBjaHJvbWVcbiAgICAvLyAobWluaW1hcCwgdG9vbGJhcikuIFRoZSBlYXJsaWVyIGAuZGMtd29ybGRgLXNjb3BlZCBydWxlIGxlZnQgdGhlIGVtcHR5XG4gICAgLy8gY2FudmFzIC8gbWluaW1hcCBvbiB0aGVpciBvd24gY3Vyc29yczsgdGhlIGJyaWVmIGlzIFwicHJvc3TEmyB2xaF1ZGVcIi4gKE1pcnJvcnNcbiAgICAvLyB0aGUgb3V0ZXItc2hlbGwgYCpgIHJ1bGUgc28gYm90aCBkb2N1bWVudHMgYXJlIHVuaWZvcm1seSBjb3ZlcmVkLilcbiAgICBzdHlsZUVsLnRleHRDb250ZW50ID0gYCogeyBjdXJzb3I6ICR7ZGVzYy5jdXJzb3J9ICFpbXBvcnRhbnQ7IH1gO1xuICAgIC8vIFBoYXNlIDI0IOKAlCBicm9hZGNhc3QgdGhlIGFjdGl2ZSB0b29sIFRPS0VOIHRvIHRoZSBPVVRFUiBhcHAgc2hlbGwgKHRoaXNcbiAgICAvLyBob29rIHJ1bnMgaW4gdGhlIGNhbnZhcyBpZnJhbWUpIHNvIHRoZSBzaGVsbCBzaG93cyB0aGUgc2FtZSBjdXN0b20gY3Vyc29yXG4gICAgLy8gYWNyb3NzIHRoZSB3aG9sZSBtYXVkZSBVSSAoc2lkZWJhciAvIHRvcCBiYXIpLiBXZSBzZW5kIHRoZSB0b29sICppZCosIE5PVFxuICAgIC8vIHRoZSBjdXJzb3Igc3RyaW5nOiB0aGUgc2hlbGwgcmVzb2x2ZXMgaXQgYWdhaW5zdCBpdHMgb3duIHRydXN0ZWRcbiAgICAvLyBUT09MX0NVUlNPUlMgY29weSAocmVzb2x2ZVRvb2xDdXJzb3IpLCBzbyBhbiB1bnRydXN0ZWQgc3luY2VkIGNhbnZhc1xuICAgIC8vIChERFItMDU0KSBjYW4gb25seSBwaWNrIGEga25vd24sIGFsd2F5cy12aXNpYmxlIGdseXBoIOKAlCBpdCBjYW4ndCBpbmplY3QgYW5cbiAgICAvLyBpbnZpc2libGUvZGlzcGxhY2VkIGN1cnNvciBhcyBhIGNsaWNramFja2luZyBhaWQgKHBoYXNlLTI0IGV0aGljYWwtaGFja2VyXG4gICAgLy8gRmluZGluZyAyOyBERFItMDY3KS5cbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LnBhcmVudCAmJiB3aW5kb3cucGFyZW50ICE9PSB3aW5kb3cpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UoeyBkZ246ICd0b29sLWN1cnNvcicsIHRvb2wgfSwgJyonKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvKiBjcm9zcy1vcmlnaW4gcGFyZW50IHJlamVjdGVkIOKAlCBzaGVsbCBrZWVwcyBpdHMgZGVmYXVsdCBjdXJzb3IgKi9cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yID0gcHJldjtcbiAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RjLXRvb2wtY3Vyc29yJyk7XG4gICAgICBpZiAoZWwpIGVsLnRleHRDb250ZW50ID0gJyc7XG4gICAgfTtcbiAgfSwgW3Rvb2wsIHRvb2xzXSk7XG5cbiAgY29uc3QgdmFsdWUgPSB1c2VNZW1vPFRvb2xDb250ZXh0VmFsdWU+KFxuICAgICgpID0+ICh7IHRvb2wsIHNldFRvb2wsIHRvb2xzLCBzdGlja3ksIHRvZ2dsZVN0aWNreSwgY2xlYXJTdGlja3ksIHNoYXBlS2luZCwgc2V0U2hhcGVLaW5kIH0pLFxuICAgIFt0b29sLCBzZXRUb29sLCB0b29scywgc3RpY2t5LCB0b2dnbGVTdGlja3ksIGNsZWFyU3RpY2t5LCBzaGFwZUtpbmRdXG4gICk7XG5cbiAgcmV0dXJuIDxUb29sQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17dmFsdWV9PntjaGlsZHJlbn08L1Rvb2xDb250ZXh0LlByb3ZpZGVyPjtcbn1cblxuLyoqXG4gKiBNb3VudCBhIGBUb29sUHJvdmlkZXJgIG9ubHkgd2hlbiBub25lIGV4aXN0cyBhYm92ZSB1cy4gV2hlbiB0aGUgc2hlbGwtb3duZWRcbiAqIGNvbW1lbnQgbW91bnQgbGF5ZXIgKGNhbnZhcy1jb21tZW50LW1vdW50LnRzeCkgYWxyZWFkeSBwcm92aWRlcyBvbmUsXG4gKiBgRGVzaWduQ2FudmFzYCBjb25zdW1lcyB0aGF0IGluc3RhbmNlIGluc3RlYWQgb2YgZG91YmxlLW1vdW50aW5nLiBUaGUgaG9va1xuICogaXMgY2FsbGVkIHVuY29uZGl0aW9uYWxseTsgb25seSB0aGUgcmV0dXJuZWQgdHJlZSBicmFuY2hlcyAoaG9vayBydWxlcykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBNYXliZVRvb2xQcm92aWRlcih7IGNoaWxkcmVuIH06IHsgY2hpbGRyZW46IFJlYWN0Tm9kZSB9KSB7XG4gIGNvbnN0IG91dGVyID0gdXNlQ29udGV4dChUb29sQ29udGV4dCk7XG4gIGlmIChvdXRlcikgcmV0dXJuIDw+e2NoaWxkcmVufTwvPjtcbiAgcmV0dXJuIDxUb29sUHJvdmlkZXI+e2NoaWxkcmVufTwvVG9vbFByb3ZpZGVyPjtcbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBIb29rXG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VUb29sTW9kZSgpOiBUb29sQ29udGV4dFZhbHVlIHtcbiAgY29uc3QgY3R4ID0gdXNlQ29udGV4dChUb29sQ29udGV4dCk7XG4gIGlmICghY3R4KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1c2VUb29sTW9kZSBtdXN0IGJlIHVzZWQgaW5zaWRlIDxUb29sUHJvdmlkZXI+Jyk7XG4gIH1cbiAgcmV0dXJuIGN0eDtcbn1cblxuLyoqXG4gKiBSZWFkLW9ubHkgdmFyaWFudCDigJQgcmV0dXJucyBgbnVsbGAgd2hlbiBubyBwcm92aWRlciBtb3VudGVkLiBVc2VkIGJ5XG4gKiBjb21wb25lbnRzIHRoYXQgY2FuIHJlbmRlciBvdXRzaWRlIGEgVG9vbFByb3ZpZGVyIHRyZWUgKHRoZSBpbnB1dFxuICogcm91dGVyJ3Mgb3B0aW9uYWwgcGF0aCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VUb29sTW9kZU9wdGlvbmFsKCk6IFRvb2xDb250ZXh0VmFsdWUgfCBudWxsIHtcbiAgcmV0dXJuIHVzZUNvbnRleHQoVG9vbENvbnRleHQpO1xufVxuIiwKICAgICIvKipcbiAqIEBmaWxlICAgICAgIGNhbnZhcy1jdXJzb3JzLnRzIOKAlCBQaGFzZSAyNCBjdXN0b20gdG9vbCBjdXJzb3JzIChLZW5uZXkgQ0MwKVxuICogQHNjb3BlICAgICAgYXBwcy9zdHVkaW8vY2FudmFzLWN1cnNvcnMudHNcbiAqIEBwdXJwb3NlICAgIEZpZ0phbS9GaWdtYS1zdHlsZSBjdXN0b20gY3Vyc29ycyBmb3IgRVZFUlkgY2FudmFzIHRvb2wuIFRoZVxuICogICAgICAgICAgICAgbmF0aXZlIGNyb3NzaGFpciAvIHRleHQgLyBhcnJvdyBjdXJzb3JzIGFyZSB0aW55ICsgdGhpbiBhbmRcbiAqICAgICAgICAgICAgIHZhbmlzaCBvbiBidXN5IGNhbnZhc2VzOyB0aGVzZSBhcmUgMzLDlzMyIFNWRyBjdXJzb3JzIHRoYXQgcmVhZCBvblxuICogICAgICAgICAgICAgYW55IGJhY2tncm91bmQuXG4gKlxuICogICAgICAgICAgICAgUGhhc2UgMjQg4oCUIEFMTCB0b29scyBkcmF3IGZyb20gT05FIGxpYnJhcnksIHRoZSAqKktlbm5leSBDdXJzb3JcbiAqICAgICAgICAgICAgIFBhY2sgKDEuMSkqKiBcIk91dGxpbmVcIiBzZXQsIHdoaWNoIGlzICoqQ0MwIC8gcHVibGljIGRvbWFpbioqXG4gKiAgICAgICAgICAgICAoaHR0cHM6Ly9rZW5uZXkubmwvYXNzZXRzL2N1cnNvci1wYWNrIOKAlCBubyBhdHRyaWJ1dGlvbiByZXF1aXJlZCxcbiAqICAgICAgICAgICAgIHJlZGlzdHJpYnV0YWJsZSBpbnNpZGUgdGhpcyBNSVQgcGFja2FnZSArIG1hcmtldHBsYWNlIGNsb25lKS4gU2VlXG4gKiAgICAgICAgICAgICBERFItMDY3IGZvciB0aGUgbGljZW5jZSBnYXRlIChCaWJhdGEgR1BMLTMuMCB3YXMgcmVqZWN0ZWQgYXNcbiAqICAgICAgICAgICAgIGNvcHlsZWZ0KS4gT25lIGxpYnJhcnkgPSBvbmUgdmlzdWFsIGlkZW50aXR5IGFjcm9zcyBtb3ZlIC8gaGFuZCAvXG4gKiAgICAgICAgICAgICBjb21tZW50IC8gcGVuIC8gc2hhcGUgLyBzdGlja3kgLyB0ZXh0IC8gZXJhc2VyLiBUaGUgZ2x5cGggcGF0aHNcbiAqICAgICAgICAgICAgIGFyZSBLZW5uZXknczsgd2UgUkVDT0xPVVIgdGhlbSAoc2VlIGBrZW5uZXkoKWApIHRvIGEgZGFyay1nbHlwaCArXG4gKiAgICAgICAgICAgICB3aGl0ZS1oYWxvIHRyZWF0bWVudCBzbyB0aGV5IHJlYWQgY3Jpc3BseSBvbiBsaWdodCBBTkQgZGFya1xuICogICAgICAgICAgICAgY2FudmFzZXMuIFBlci10b29sIGdseXBoIG1hcDpcbiAqICAgICAgICAgICAgICAgbW92ZeKGknBvaW50ZXJfYSDCtyBoYW5k4oaSaGFuZF9vcGVuIMK3IGNvbW1lbnTihpJtZXNzYWdlX2RvdHNfc3F1YXJlIMK3XG4gKiAgICAgICAgICAgICAgIHBlbuKGkmRyYXdpbmdfcGVuY2lsIMK3IHNoYXBl4oaSbGluZV9jcm9zcyDCtyBlcmFzZXLihpJkcmF3aW5nX2VyYXNlci5cbiAqICAgICAgICAgICAgIHRleHQgKEktYmVhbSkgKyBzdGlja3kgKGZvbGRlZC1jb3JuZXIgbm90ZSkgaGF2ZSBubyBjbGVhbiBLZW5uZXlcbiAqICAgICAgICAgICAgIGVxdWl2YWxlbnQsIHNvIHRoZXkgYXJlIEFVVEhPUkVEIGluIHRoZSBpZGVudGljYWwgZGFyay1nbHlwaCArXG4gKiAgICAgICAgICAgICB3aGl0ZS1oYWxvIHRyZWF0bWVudCB0byBrZWVwIG9uZSB2aXN1YWwgaWRlbnRpdHkuXG4gKlxuICogICAgICAgICAgICAgRGVsaXZlcmVkIGFzIENTUyBgY3Vyc29yOiB1cmwoXCJkYXRhOmltYWdlL3N2Zyt4bWws4oCmXCIpIGh4IGh5LCBmYmBcbiAqICAgICAgICAgICAgIOKAlCBubyBydW50aW1lIGRlcGVuZGVuY3ksIG5vIGFzc2V0IGZpbGVzLiAzMsOXMzIgaXMgdGhlXG4gKiAgICAgICAgICAgICBjcm9zcy1icm93c2VyLXNhZmUgY2VpbGluZzsgKGh4LCBoeSkgaXMgdGhlIGNsaWNrIGhvdHNwb3QuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBUb29sIH0gZnJvbSAnLi9pbnB1dC1yb3V0ZXIudHN4JztcblxuLyoqIEJ1aWxkIGEgQ1NTIGN1cnNvciB2YWx1ZSBmcm9tIGFuIGlubGluZSBTVkcgKyBob3RzcG90ICsgbmF0aXZlIGZhbGxiYWNrLiAqL1xuZnVuY3Rpb24gc3ZnQ3Vyc29yKHN2Zzogc3RyaW5nLCBoeDogbnVtYmVyLCBoeTogbnVtYmVyLCBmYWxsYmFjazogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gZW5jb2RlVVJJQ29tcG9uZW50IGlzIHRoZSBzYWZlc3QgZXNjYXBpbmcgZm9yIGEgZGF0YTogVVJJIGluc2lkZSB1cmwoXCLigKZcIikuXG4gIHJldHVybiBgdXJsKFwiZGF0YTppbWFnZS9zdmcreG1sLCR7ZW5jb2RlVVJJQ29tcG9uZW50KHN2Zy50cmltKCkpfVwiKSAke2h4fSAke2h5fSwgJHtmYWxsYmFja31gO1xufVxuXG4vLyBQaGFzZSAyNCDigJQgMjRweCByZW5kZXJlZCBib3ggKGRvd24gZnJvbSAzMikgc28gY3Vyc29ycyBhcmVuJ3Qgb3ZlcnNpemVkOyB0aGVcbi8vIGdseXBoIGNvb3JkcyBzdGF5IGluIHRoZSAzMi11bml0IHZpZXdCb3ggYW5kIHNjYWxlIGludG8gMjRweC4gSG90c3BvdHMgYXJlXG4vLyBzY2FsZWQgdG8gbWF0Y2ggKHNlZSB0aGUgZ2VuZXJhdG9yKS5cbmNvbnN0IFcgPSBgd2lkdGg9JzI0JyBoZWlnaHQ9JzI0JyB2aWV3Qm94PScwIDAgMzIgMzInIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZydgO1xuY29uc3QgSU5LID0gJyMxZjFmMWYnO1xuY29uc3QgSEFMTyA9IFwic3Ryb2tlPScjZmZmZmZmJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJyBzdHJva2UtbGluZWNhcD0ncm91bmQnXCI7XG5cbi8vIEtlbm5leSBDQzAgZ2x5cGgsIHJlY29sb3VyZWQgdG8gYSBGaWdKYW0tc3R5bGUgKipkYXJrIGdseXBoICsgd2hpdGUgaGFsbyoqOlxuLy8gS2VubmV5J3Mgb3V0bGluZSBiYW5kIChgYmApIGlzIHBhaW50ZWQgV0hJVEUgKHRoZSBoYWxvKSBhbmQgaXRzIGlubmVyIGZpbGxcbi8vIChgd2ApIGlzIHBhaW50ZWQgZGFyayBJTksuIFJlYWRzIGNyaXNwbHkgb24gYSBMSUdIVCBjYW52YXMgKHNvbGlkIGRhcmsgZ2x5cGgpXG4vLyBBTkQgYSBkYXJrIG9uZSAod2hpdGUgaGFsbyBlZGdlKS5cbmZ1bmN0aW9uIGtlbm5leShiOiBzdHJpbmcsIHc6IHN0cmluZywgdHJhbnNmb3JtPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gT3B0aW9uYWwgYDxnIHRyYW5zZm9ybT5gIGZvciB0aGUgZHJhd2luZyB0b29scyB3aG9zZSBLZW5uZXkgZ2x5cGggbmVlZHNcbiAgLy8gcmUtb3JpZW50aW5nIHNvIHRoZSB3cml0aW5nIHRpcCBsYW5kcyBhdCB0aGUgaG90c3BvdCAodXNlciBzdGVlclxuICAvLyAyMDI2LTA2LTA0OiBwZW4gLyBoaWdobGlnaHRlciBcImtyZXNsw60gcG9kIGtvbmNlbSwgbmUgbmEgxaFwacSNY2VcIiDihpIgZmxpcHBlZCBzb1xuICAvLyB0aGUgbmliIHBvaW50cyBkb3duLUxFRlQsIHRvcC1yaWdodOKGkmJvdHRvbS1sZWZ0KS5cbiAgY29uc3Qgb3BlbiA9IHRyYW5zZm9ybSA/IGA8ZyB0cmFuc2Zvcm09JyR7dHJhbnNmb3JtfSc+YCA6ICcnO1xuICBjb25zdCBjbG9zZSA9IHRyYW5zZm9ybSA/ICc8L2c+JyA6ICcnO1xuICByZXR1cm4gYDxzdmcgJHtXfT4ke29wZW59PHBhdGggZmlsbD0nI2ZmZmZmZicgZD0nJHtifScvPjxwYXRoIGZpbGw9JyR7SU5LfScgZD0nJHt3fScvPiR7Y2xvc2V9PC9zdmc+YDtcbn1cblxuLy8gVmVydGljYWwgbWlycm9yIGFib3V0IHRoZSAzMi12aWV3Qm94IGhvcml6b250YWwgY2VudHJlOiAoeCx5KSDihpIgKHgsIDMy4oiSeSkuXG4vLyBBcHBsaWVkIHRvIHBlbi9oaWdobGlnaHRlciBzbyB0aGUgZ2x5cGggbGllcyBhbG9uZyB0aGUgdG9wLXJpZ2h04oaSYm90dG9tLWxlZnRcbi8vIGRpYWdvbmFsIHdpdGggdGhlIG5pYiBhdCBib3R0b20tbGVmdC5cbmNvbnN0IEZMSVBfViA9ICd0cmFuc2xhdGUoMCwzMikgc2NhbGUoMSwtMSknO1xuXG4vLyBtb3ZlIOKGkiBLZW5uZXkgYHBvaW50ZXJfYmAgKHVzZXIgc3RlZXIgMjAyNi0wNi0wNCDigJQgdGhlIHBsYWluIHZhcmlhbnQsIG5vdCB0aGVcbi8vIHNoYWRlZCBvbmUpLiBIb3RzcG90IGF0IHRoZSBhcnJvdyB0aXAgKHRvcCkuXG5jb25zdCBNT1ZFID0gc3ZnQ3Vyc29yKFxuICBrZW5uZXkoXG4gICAgJ00xMC4yNSA4LjI1IEwxMC4wNSA4LjY1IDEwIDkgMTAgMjMuMSAxMC4wNSAyMy40IDEwLjI1IDIzLjc1IDEwLjggMjQgMTEuNDUgMjMuODUgMTEuNiAyMy43IDExLjc1IDIzLjQ1IDE0LjY1IDE5LjggMTQuODUgMTkuNjUgMTQuOTUgMTkuNSAxNS40IDE5LjIgMTUuOTUgMTkuMSAyMS4wNSAxOS4xIDIxLjIgMTkuMSAyMS4zNSAxOS4wNSAyMS42NSAxOC45IDIxLjkgMTguNiAyMiAxOC4zIDIyIDE3LjkgMjEuOSAxNy42NSAyMS43NSAxNy4zNSAyMS42NSAxNy4zIDIxLjU1IDE3LjE1IDExLjUgOC4yNSAxMS4yNSA4LjA1IDEwLjk1IDggMTAuNiA4LjA1IDEwLjI1IDguMjUgTTkuMTUgNi42IEw5LjcgNi4yNSAxMCA2LjE1IDEwLjk1IDYgMTEuOSA2LjE1IDEzIDYuOSAyMi45IDE1LjY1IDIzIDE1LjggMjMuMiAxNS45NSAyMy43NSAxNi43NSAyNCAxNy45IDI0IDE4LjMgMjMuOSAxOC45NSAyMy44IDE5LjI1IDIzLjYgMTkuNyAyMy4xIDIwLjM1IDIyLjc1IDIwLjYgMjIuMSAyMC45IDIyLjA1IDIwLjk1IDIyIDIwLjk1IDIxLjIgMjEuMSAyMS4wNSAyMS4xIDE2LjIgMjEuMSAxNi4xIDIxLjI1IDE2LjA1IDIxLjI1IDEzLjQgMjQuNiAxMy4wNSAyNS4xNSAxMi45IDI1LjMgMTIuNTUgMjUuNTUgUTExLjYgMjYuMTUgMTAuNTUgMjYgTDEwLjUgMjYgUTkuNjUgMjUuODUgOSAyNS4zIEw4LjQ1IDI0LjY1IDguNCAyNC41IDguMTUgMjQuMDUgOCAyMy4xIDggOSBROCA4LjQ1IDguMTUgOC4wNSBMOC4yNSA3Ljc1IDguNDUgNy4zNSA5LjE1IDYuNicsXG4gICAgJ00xMC4yNSA4LjI1IEwxMC42IDguMDUgMTAuOTUgOCAxMS4yNSA4LjA1IDExLjUgOC4yNSAyMS41NSAxNy4xNSAyMS42NSAxNy4zIDIxLjc1IDE3LjM1IDIxLjkgMTcuNjUgMjIgMTcuOSAyMiAxOC4zIDIxLjkgMTguNiAyMS42NSAxOC45IDIxLjM1IDE5LjA1IDIxLjIgMTkuMSAyMS4wNSAxOS4xIDE1Ljk1IDE5LjEgMTUuNCAxOS4yIDE0Ljk1IDE5LjUgMTQuODUgMTkuNjUgMTQuNjUgMTkuOCAxMS43NSAyMy40NSAxMS42IDIzLjcgMTEuNDUgMjMuODUgMTAuOCAyNCAxMC4yNSAyMy43NSAxMC4wNSAyMy40IDEwIDIzLjEgMTAgOSAxMC4wNSA4LjY1IDEwLjI1IDguMjUnXG4gICksXG4gIDgsXG4gIDUsXG4gICdkZWZhdWx0J1xuKTtcbmNvbnN0IEhBTkQgPSBzdmdDdXJzb3IoXG4gIGtlbm5leShcbiAgICAnTTI4LjU1IDE3LjggUTI5LjQgMjAuMyAyOC43NSAyMi44IEwyOC43IDIzIDI4LjE1IDI0LjU1IDI4LjA1IDI0Ljc1IFEyNi40IDI4LjIgMjIuNzUgMjkuNCBMMjIuNDUgMjkuNSAxOCAyOS45IDE3Ljc1IDI5Ljg1IFExNS44IDI5LjI1IDEzLjggMjguMSBMMTMuNDUgMjcuOTUgUTEyIDI3LjA1IDEwLjM1IDI2LjggTDEwLjI1IDI2Ljc1IDcuOSAyNi43IDcuOCAyNi43IFE2LjEgMjYuOSA0LjggMjUuOCBMNC43NSAyNS44IDQuNjUgMjUuNyA0LjYgMjUuNjUgUTMuMjUgMjQuNSAzLjA1IDIyLjg1IEwzIDIyLjc1IFEyLjggMjAuOTUgNCAxOS41IDUuMDUgMTguMTUgNi43NSAxNy45NSBMOC40IDE3LjkgNy41IDE1LjU1IDcuMyAxNS4yIDcuMiAxNSA1IDEwLjk1IFEzLjkgOS4xNSA0LjMgNy43NSBMNC40IDcuNSBRNC43NSA2LjE1IDYuNDUgNS4yIDkgMy42NSAxMSA1IDExLjA1IDQuMSAxMS41IDMuNDUgMTIuMTUgMi4xIDE0LjIgMS42IEwxNC4zNSAxLjYgUTE4LjA1IDAuNiAxOS42IDQuNCBMMTkuNjUgNC41NSBRMjAuNzUgMy42NSAyMi43IDMuNzUgTDIyLjc1IDMuNzUgUTI2Ljc1IDQgMjcgOC4xNSBMMjcgOC4yNSAyNyA4LjM1IDI3IDguNDUgUTI2LjkgMTAuNzUgMjcuMSAxMi42IDI3LjE1IDE0LjY1IDI4LjIgMTYuNzUgTDI4LjU1IDE3LjggTTI2LjY1IDE4LjQgTDI2LjEgMTYuOCAyNi4xIDE2Ljg1IFEyNC44IDEzLjcgMjUgOC4zNSBMMjUgOC4yNSBRMjQuODUgNS45IDIyLjYgNS43NSAyMC43IDUuNjUgMjAuNCA3LjM1IEwyMC4xIDcuOTUgMTkuNSA4LjIgMTguODUgOC4wNSAxOC40NSA3LjUgMTcuNzUgNS4xNSBRMTYuODUgMi45NSAxNC43IDMuNTUgTDE0LjY1IDMuNTUgUTEyLjU1IDQuMDUgMTMuMTUgNi4xNSBMMTMuODUgOC43NSAxMy43NSA5LjQ1IDEzLjI1IDkuOTUgMTIuNTUgOS45NSAxMiA5LjU1IDEwLjkgNy43IFE5LjUgNS43IDcuNDUgNi45IDYuNSA3LjQ1IDYuMjUgOC4xNSA2LjEgOC45IDYuNyA5Ljg1IDkuMiAxMy45IDEwLjggMTguNjUgTDEwLjggMTkuMyAxMC40IDE5LjggOS43NSAxOS45NSBROC4zNSAxOS44IDYuOTUgMTkuOTUgNi4xIDIwLjA1IDUuNTUgMjAuNzUgNC45IDIxLjU1IDUgMjIuNTUgNS4xNSAyMy41NSA2IDI0LjIgTDYuMDUgMjQuMjUgUTYuNzUgMjQuODUgNy42NSAyNC43IEw3LjcgMjQuNyAxMC42NSAyNC44IFExMi43IDI1LjE1IDE0LjQ1IDI2LjIgTDE0LjUgMjYuMiBRMTYuNCAyNy4zNSAxOC4zIDI3LjkgTDIyLjA1IDI3LjUgMjIuMSAyNy41IFEyNC45NSAyNi41NSAyNi4yNSAyMy44NSBMMjYuOCAyMi4zIFEyNy4zIDIwLjM1IDI2LjY1IDE4LjQnLFxuICAgICdNMjYuNjUgMTguNCBRMjcuMyAyMC4zNSAyNi44IDIyLjMgTDI2LjI1IDIzLjg1IFEyNC45NSAyNi41NSAyMi4xIDI3LjUgTDIyLjA1IDI3LjUgMTguMyAyNy45IFExNi40IDI3LjM1IDE0LjUgMjYuMiBMMTQuNDUgMjYuMiBRMTIuNyAyNS4xNSAxMC42NSAyNC44IEw3LjcgMjQuNyA3LjY1IDI0LjcgUTYuNzUgMjQuODUgNi4wNSAyNC4yNSBMNiAyNC4yIFE1LjE1IDIzLjU1IDUgMjIuNTUgNC45IDIxLjU1IDUuNTUgMjAuNzUgNi4xIDIwLjA1IDYuOTUgMTkuOTUgOC4zNSAxOS44IDkuNzUgMTkuOTUgTDEwLjQgMTkuOCAxMC44IDE5LjMgMTAuOCAxOC42NSBROS4yIDEzLjkgNi43IDkuODUgNi4xIDguOSA2LjI1IDguMTUgNi41IDcuNDUgNy40NSA2LjkgOS41IDUuNyAxMC45IDcuNyBMMTIgOS41NSAxMi41NSA5Ljk1IDEzLjI1IDkuOTUgMTMuNzUgOS40NSAxMy44NSA4Ljc1IDEzLjE1IDYuMTUgUTEyLjU1IDQuMDUgMTQuNjUgMy41NSBMMTQuNyAzLjU1IFExNi44NSAyLjk1IDE3Ljc1IDUuMTUgTDE4LjQ1IDcuNSAxOC44NSA4LjA1IDE5LjUgOC4yIDIwLjEgNy45NSAyMC40IDcuMzUgUTIwLjcgNS42NSAyMi42IDUuNzUgMjQuODUgNS45IDI1IDguMjUgTDI1IDguMzUgUTI0LjggMTMuNyAyNi4xIDE2Ljg1IEwyNi4xIDE2LjggMjYuNjUgMTguNCdcbiAgKSxcbiAgMTIsXG4gIDEyLFxuICAnZ3JhYidcbik7XG4vLyBjb21tZW50IOKGkiBLZW5uZXkgYG1lc3NhZ2Vfcm91bmRgICh1c2VyIHN0ZWVyIDIwMjYtMDYtMDQpLiBIb3RzcG90IGF0IHRoZVxuLy8gdGFpbCB0aXAgKGJvdHRvbS1jZW50cmUpLCB3aGVyZSB0aGUgY29tbWVudCBwaW4gaXMgZHJvcHBlZC5cbmNvbnN0IENPTU1FTlQgPSBzdmdDdXJzb3IoXG4gIGtlbm5leShcbiAgICAnTTI4IDE0IFEyOCA5Ljg1IDI0LjQ1IDYuOSAyMC45NSA0IDE2IDQgMTEuMDUgNCA3LjUgNi45IEw3LjQ1IDcgUTQgOS45IDQgMTQgNCAxOC4xNSA3LjU1IDIxLjA1IEw3LjUgMjEuMDUgUTkuMiAyMi40NSAxMS4yIDIzLjIgTDE1LjMgMjcuMyAxNiAyNy42IDE2LjcgMjcuMyAyMC44NSAyMy4yIFEyMi43IDIyLjQ1IDI0LjMgMjEuMTUgTDI0LjQ1IDIxLjA1IFEyOCAxOC4xNSAyOCAxNCBNMjUuNzUgNS4zNSBRMzAuMDUgOC45NSAzMCAxNCAzMC4wNSAxOS4wNSAyNS43NSAyMi42IEwyNS40IDIyLjg1IFEyMy44IDI0LjEgMjIgMjQuOSBMMTguMSAyOC43NSAxOC4xNSAyOC43NSBRMTcuMiAyOS42IDE2IDI5LjYgMTQuOCAyOS42IDEzLjg1IDI4Ljc1IEwxMy45IDI4Ljc1IDEwIDI0LjkgNi42IDIyLjg1IDYuMjUgMjIuNiBRMS45NSAxOS4wNSAyIDE0IDEuOTUgOC45NSA2LjI1IDUuMzUgMTAuMyAyIDE2IDIgMjEuNyAyIDI1Ljc1IDUuMzUnLFxuICAgICdNMjggMTQgUTI4IDE4LjE1IDI0LjQ1IDIxLjA1IEwyNC4zIDIxLjE1IFEyMi43IDIyLjQ1IDIwLjg1IDIzLjIgTDE2LjcgMjcuMyAxNiAyNy42IDE1LjMgMjcuMyAxMS4yIDIzLjIgUTkuMiAyMi40NSA3LjUgMjEuMDUgTDcuNTUgMjEuMDUgUTQgMTguMTUgNCAxNCA0IDkuOSA3LjQ1IDcgTDcuNSA2LjkgUTExLjA1IDQgMTYgNCAyMC45NSA0IDI0LjQ1IDYuOSAyOCA5Ljg1IDI4IDE0J1xuICApLFxuICAxMixcbiAgMjEsXG4gICdjcm9zc2hhaXInXG4pO1xuLy8gcGVuIOKGkiBLZW5uZXkgYGRyYXdpbmdfcGVuYCwgbWlycm9yZWQgdmVydGljYWxseSAoRkxJUF9WKSBzbyB0aGUgbmliIHBvaW50c1xuLy8gZG93bi1MRUZUICh0b3AtcmlnaHTihpJib3R0b20tbGVmdCBkaWFnb25hbCkuIFNvdXJjZSBncmFkaWVudC1zaGFkZSBwYXRoIGRyb3BwZWQuXG4vLyBIb3RzcG90IGF0IHRoZSBuaWIsIGJvdHRvbS1sZWZ0LlxuY29uc3QgUEVOID0gc3ZnQ3Vyc29yKFxuICBrZW5uZXkoXG4gICAgJ000IDEzLjEgTDQgNiBRNCA1LjE1IDQuNiA0LjYgNS4xNSA0IDYgNCBMMTMuMSA0IFExMy45NSA0IDE0LjU1IDQuNiBMMjguNjUgMTguNzUgUTI5LjggMTkuOSAyOS43NSAyMS40NSBMMjkuNzUgMjEuNiAyOS43NSAyMS43IFEyOS43NSAyMy4yIDI4LjcgMjQuMzUgTDI0LjQ1IDI4LjY1IDI0LjM1IDI4Ljc1IFEyMy4xNSAyOS44NSAyMS42NSAyOS44IEwyMS41NSAyOS44IDIxLjQgMjkuOCBRMjAuMiAyOS44IDE5LjI1IDI5LjE1IEwxOCAyOS4zNSBRMTYuNiAyOS40IDE1LjI1IDI4IEwxNS4yIDI3Ljk1IDguMiAyMC45NSBRNy42IDIwLjM1IDcuNiAxOS41NSA3LjYgMTguNyA4LjIgMTguMSBMNC42IDE0LjUgUTQgMTMuOSA0IDEzLjEgTTE5LjUgMjYuNjUgTDIwLjEgMjcuMjUgUTIwLjcgMjcuODUgMjEuNSAyNy44IDIyLjM1IDI3Ljg1IDIzIDI3LjI1IEwyNy4yNSAyMi45NSBRMjcuOCAyMi4zNSAyNy43NSAyMS41NSAyNy44IDIwLjc1IDI3LjIgMjAuMTUgTDEzLjEgNiA2IDYgNiAxMy4xIDEyLjM1IDE5LjQ1IDkuNiAxOS41IDE2LjY1IDI2LjU1IFExOC4wNSAyOC4wNSAxOS41IDI2LjY1IE04LjA1IDEyLjMgTDggOCAxMi4yNSA4LjA1IDEzLjggOS42IDkuNiAxMy44NSA4LjA1IDEyLjMgTTE1LjI1IDExLjA1IEwyMyAxOC44IDE4LjggMjMuMDUgMTEuMDUgMTUuMyAxNS4yNSAxMS4wNScsXG4gICAgJ00xNS4yNSAxMS4wNSBMMTEuMDUgMTUuMyAxOC44IDIzLjA1IDIzIDE4LjggMTUuMjUgMTEuMDUgTTEyLjM1IDE5LjQ1IEw2IDEzLjEgNiA2IDEzLjEgNiAyNy4yIDIwLjE1IFEyNy44IDIwLjc1IDI3Ljc1IDIxLjU1IDI3LjggMjIuMzUgMjcuMjUgMjIuOTUgTDIzIDI3LjI1IFEyMi4zNSAyNy44NSAyMS41IDI3LjggMjAuNyAyNy44NSAyMC4xIDI3LjI1IEwxOS41IDI2LjY1IDEyLjM1IDE5LjQ1IE04LjA1IDEyLjMgTDkuNiAxMy44NSAxMy44IDkuNiAxMi4yNSA4LjA1IDggOCA4LjA1IDEyLjMnLFxuICAgIEZMSVBfVlxuICApLFxuICA2LFxuICAxOCxcbiAgJ2Nyb3NzaGFpcidcbik7XG4vLyBoaWdobGlnaHRlciDihpIgS2VubmV5IGBkcmF3aW5nX3BlbmNpbGAsIGFsc28gbWlycm9yZWQgdmVydGljYWxseSAoZGlzdGluY3QgZnJvbVxuLy8gdGhlIHBlbiBnbHlwaCkuIEhvdHNwb3QgYXQgdGhlIGxlYWQgdGlwLCBib3R0b20tbGVmdC5cbmNvbnN0IEhJR0hMSUdIVEVSID0gc3ZnQ3Vyc29yKFxuICBrZW5uZXkoXG4gICAgJ001LjE1IDEwLjg1IFE0IDkuNjUgNCA4LjEgTDQgNy45NSA0IDcuODUgUTMuOTUgNi4yIDUuMSA1LjE1IDYuMjUgNCA3Ljg1IDQgTDcuOTUgNCA4LjEgNCBROS42NSA0IDEwLjg1IDUuMTUgTDExIDUuMyAxNC4zIDUuMjUgUTE1LjE1IDUuMjUgMTUuNzUgNS44NSBMMjkuOSAyMCBRMzEgMjEuMTUgMzEgMjIuNzUgTDMxIDIyLjg1IDMxIDIzIFEzMS4wNSAyNC41IDI5LjkgMjUuNyBMMjkuNTUgMjUuOTUgMjUuNjUgMjkuOSAyNS42NSAyOS45NSBRMjQuNDUgMzEuMSAyMi43NSAzMS4xIDIxLjIgMzEuMTUgMjAgMjkuOTUgTDUuODUgMTUuOCBRNS4yNSAxNS4yIDUuMjUgMTQuMzUgTDUuMjUgMTAuOTUgNS4xNSAxMC44NSBNMTkuOTUgMjQuMiBMMTguNTUgMjIuOCAyMi44IDE4LjU1IDI0LjIgMTkuOTUgMTkuOTUgMjQuMiBNMjguNDUgMjEuNCBMMTQuMyA3LjI1IDEwLjE1IDcuMyA5LjQgNi41NSBROC44IDUuOTUgNy45NSA2IDcuMSA1Ljk1IDYuNSA2LjU1IDUuOTUgNy4xIDYgNy45NSA1Ljk1IDguOCA2LjU1IDkuNCBMNy4yNSAxMC4xIDcuMjUgMTQuMzUgMjEuNCAyOC41IFEyMiAyOS4xIDIyLjc1IDI5LjEgMjMuNiAyOS4xIDI0LjIgMjguNSBMMjguNDUgMjQuMjUgUTI5LjA1IDIzLjY1IDI5IDIyLjg1IDI5LjA1IDIyIDI4LjQ1IDIxLjQgTTkuMjUgMTMuNSBMOS4yNSA5LjMgMTMuNSA5LjI1IDE0LjMgMTAuMDUgMTAuMDUgMTQuMyA5LjI1IDEzLjUgTTE3LjE1IDIxLjQgTDExLjUgMTUuNzUgMTUuNzUgMTEuNSAyMS40IDE3LjE1IDE3LjE1IDIxLjQnLFxuICAgICdNMTcuMTUgMjEuNCBMMjEuNCAxNy4xNSAxNS43NSAxMS41IDExLjUgMTUuNzUgMTcuMTUgMjEuNCBNMjguNDUgMjEuNCBRMjkuMDUgMjIgMjkgMjIuODUgMjkuMDUgMjMuNjUgMjguNDUgMjQuMjUgTDI0LjIgMjguNSBRMjMuNiAyOS4xIDIyLjc1IDI5LjEgMjIgMjkuMSAyMS40IDI4LjUgTDcuMjUgMTQuMzUgNy4yNSAxMC4xIDYuNTUgOS40IFE1Ljk1IDguOCA2IDcuOTUgNS45NSA3LjEgNi41IDYuNTUgNy4xIDUuOTUgNy45NSA2IDguOCA1Ljk1IDkuNCA2LjU1IEwxMC4xNSA3LjMgMTQuMyA3LjI1IDI4LjQ1IDIxLjQgTTE5Ljk1IDI0LjIgTDI0LjIgMTkuOTUgMjIuOCAxOC41NSAxOC41NSAyMi44IDE5Ljk1IDI0LjIgTTkuMjUgMTMuNSBMMTAuMDUgMTQuMyAxNC4zIDEwLjA1IDEzLjUgOS4yNSA5LjI1IDkuMyA5LjI1IDEzLjUnLFxuICAgIEZMSVBfVlxuICApLFxuICA2LFxuICAxOCxcbiAgJ2Nyb3NzaGFpcidcbik7XG5jb25zdCBDUk9TU0hBSVIgPSBzdmdDdXJzb3IoXG4gIGtlbm5leShcbiAgICAnTTE3IDIgUTE4LjIgMiAxOS4xNSAyLjkgMjAgMy44IDIwIDUgTDIwIDEyIDI3IDEyIFEyOC4yIDEyIDI5LjE1IDEyLjkgMzAgMTMuOCAzMCAxNSBMMzAgMTcgUTMwIDE4LjIgMjkuMTUgMTkuMTUgMjguMiAyMCAyNyAyMCBMMjAgMjAgMjAgMjcgUTIwIDI4LjIgMTkuMTUgMjkuMTUgMTguMiAzMCAxNyAzMCBMMTUgMzAgUTEzLjggMzAgMTIuOSAyOS4xNSAxMiAyOC4yIDEyIDI3IEwxMiAyMCA1IDIwIFEzLjggMjAgMi45IDE5LjE1IDIgMTguMiAyIDE3IEwyIDE1IFEyIDEzLjggMi45IDEyLjkgMy44IDEyIDUgMTIgTDEyIDEyIDEyIDUgUTEyIDMuOCAxMi45IDIuOSAxMy44IDIgMTUgMiBMMTcgMiBNMTQgMjcgTDE0LjMgMjcuNyBRMTQuNiAyOCAxNSAyOCBMMTcgMjggMTcuNyAyNy43IDE4IDI3IDE4IDE4LjA1IDE4LjA1IDE4IDI3IDE4IFEyNy40IDE4IDI3LjcgMTcuNyBMMjggMTcgMjggMTUgMjcuNyAxNC4zIFEyNy40IDE0IDI3IDE0IEwxOCAxNCAxOCA1IDE3LjcgNC4zIDE3IDQgMTUgNCBRMTQuNiA0IDE0LjMgNC4zIDE0IDQuNiAxNCA1IEwxNCAxNCA1IDE0IFE0LjYgMTQgNC4zIDE0LjMgNCAxNC42IDQgMTUgTDQgMTcgUTQgMTcuNCA0LjMgMTcuNyA0LjYgMTggNSAxOCBMMTQgMTggMTQgMjcnLFxuICAgICdNMTQgMjcgTDE0IDE4IDUgMTggUTQuNiAxOCA0LjMgMTcuNyA0IDE3LjQgNCAxNyBMNCAxNSBRNCAxNC42IDQuMyAxNC4zIDQuNiAxNCA1IDE0IEwxNCAxNCAxNCA1IFExNCA0LjYgMTQuMyA0LjMgMTQuNiA0IDE1IDQgTDE3IDQgMTcuNyA0LjMgMTggNSAxOCAxNCAyNyAxNCBRMjcuNCAxNCAyNy43IDE0LjMgTDI4IDE1IDI4IDE3IDI3LjcgMTcuNyBRMjcuNCAxOCAyNyAxOCBMMTguMDUgMTggMTggMTguMDUgMTggMjcgMTcuNyAyNy43IDE3IDI4IDE1IDI4IFExNC42IDI4IDE0LjMgMjcuNyBMMTQgMjcnXG4gICksXG4gIDEyLFxuICAxMixcbiAgJ2Nyb3NzaGFpcidcbik7XG5jb25zdCBFUkFTRVIgPSBzdmdDdXJzb3IoXG4gIGtlbm5leShcbiAgICAnTTMuOSAxMS4zNSBRMi4zIDEyLjUgMy43IDEzLjkgTDE2LjQgMjYuNjUgUTE3Ljg1IDI4LjA1IDE5LjQ1IDI2LjkgTDI3LjY1IDIxLjE1IFEyOS4zIDIwIDI3Ljg1IDE4LjYgTDE1LjE1IDUuODUgUTEzLjc1IDQuNDUgMTIuMSA1LjYgTDMuOSAxMS4zNSBNMS4wNSAxMi40IFExIDEwLjk1IDIuNzUgOS43NSBMMTAuOTUgNCAxMC45NSAzLjk1IFExNCAxLjg1IDE2LjYgNC40NSBMMjkuMyAxNy4yIFEzMC44IDE4LjY1IDMwLjU1IDIwLjEgMzAuNTUgMjEuNTUgMjguOCAyMi44IEwyMC42IDI4LjU1IDIwLjY1IDI4LjU1IFExNy43IDMwLjY1IDE1IDI4LjEgTDE1IDI4LjA1IDIuMyAxNS4zIDIuMyAxNS4zNSBRMC44IDEzLjg1IDEuMDUgMTIuNCBNMTMuNSA3IEwxOS44NSAxMy4zNSAxMS42NSAxOS4xNSA1LjMgMTIuNzUgMTMuNSA3JyxcbiAgICAnTTEzLjUgNyBMNS4zIDEyLjc1IDExLjY1IDE5LjE1IDE5Ljg1IDEzLjM1IDEzLjUgNyBNMy45IDExLjM1IEwxMi4xIDUuNiBRMTMuNzUgNC40NSAxNS4xNSA1Ljg1IEwyNy44NSAxOC42IFEyOS4zIDIwIDI3LjY1IDIxLjE1IEwxOS40NSAyNi45IFExNy44NSAyOC4wNSAxNi40IDI2LjY1IEwzLjcgMTMuOSBRMi4zIDEyLjUgMy45IDExLjM1J1xuICApLFxuICA2LFxuICAxNCxcbiAgJ2NlbGwnXG4pO1xuXG4vLyBUZXh0IOKAlCBhIGNsYXNzaWMgSS1iZWFtICh2ZXJ0aWNhbCBzdGVtICsgdG9wL2JvdHRvbSBzZXJpZnMpLiBBdXRob3JlZCBpbiB0aGVcbi8vIHNhbWUgZGFyay1JTksgZ2x5cGggKyB3aGl0ZS1IQUxPIHRyZWF0bWVudCBhcyB0aGUgS2VubmV5IGdseXBocyAoS2VubmV5J3Ncbi8vIHBvaW50ZXJfaSByZWFkcyBhcyBhIHNtYWxsIGJyYWNrZXQsIG5vdCBhbiBJLWJlYW0pLiBIb3RzcG90IGRlYWQtY2VudHJlLlxuY29uc3QgVEVYVCA9IHN2Z0N1cnNvcihcbiAgYDxzdmcgJHtXfT48cGF0aCBkPSdNMTYgNFYyOE0xMSA0SDIxTTExIDI4SDIxJyBmaWxsPSdub25lJyAke0hBTE99IHN0cm9rZS13aWR0aD0nNScvPjxwYXRoIGQ9J00xNiA0VjI4TTExIDRIMjFNMTEgMjhIMjEnIGZpbGw9J25vbmUnIHN0cm9rZT0nJHtJTkt9JyBzdHJva2Utd2lkdGg9JzIuMjUnIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcvPjwvc3ZnPmAsXG4gIDEyLFxuICAxMixcbiAgJ3RleHQnXG4pO1xuXG4vLyBTdGlja3kg4oCUIGEgbm90ZSB3aXRoIGEgcGVlbGVkL2ZvbGRlZCB0b3AtcmlnaHQgY29ybmVyICh0aGUgdW5pdmVyc2FsIHN0aWNreVxuLy8gZ2x5cGgpLiBBdXRob3JlZCBpbiB0aGUgc2FtZSB0cmVhdG1lbnQgKEtlbm5leSBoYXMgbm8gc3RpY2t5LW5vdGUpLiBIb3RzcG90XG4vLyBhdCB0aGUgbm90ZSdzIHRvcC1sZWZ0LCB3aGVyZSB0aGUgbm90ZSBpcyBkcm9wcGVkLlxuY29uc3QgU1RJQ0tZID0gc3ZnQ3Vyc29yKFxuICBgPHN2ZyAke1d9PjxwYXRoIGQ9J002IDVIMjFMMjYgMTBWMjdINlonIGZpbGw9JyR7SU5LfScgJHtIQUxPfSBzdHJva2Utd2lkdGg9JzIuNScvPjxwYXRoIGQ9J00yMSA1VjExSDI2JyBmaWxsPSdub25lJyAke0hBTE99IHN0cm9rZS13aWR0aD0nMi4yNScvPjwvc3ZnPmAsXG4gIDUsXG4gIDUsXG4gICdjcm9zc2hhaXInXG4pO1xuXG4vKipcbiAqIFRvb2wg4oaSIENTUyBjdXJzb3IgdmFsdWUuIFBoYXNlIDI0IOKAlCBldmVyeSB0b29sIHNoaXBzIGEgS2VubmV5IGdseXBoIChub1xuICogc3lzdGVtIGZhbGxiYWNrIGZvciBgbW92ZWAgYW55bW9yZTsgdGhlIGJyaWVmIGlzIE9ORSB1bmlmaWVkIGxpYnJhcnkpLiBUaGVcbiAqIHNpbmdsZSBTaGFwZSB0b29sIHVzZXMgdGhlIGNyb3NzaGFpcjsgYHJlY3RgL2BlbGxpcHNlYCBzdGF5IGtleWVkIChzdGlsbCBpblxuICogdGhlIFRvb2wgdW5pb24pIGJ1dCBhcmUgbm8gbG9uZ2VyIGRpcmVjdGx5IHNlbGVjdGFibGUuXG4gKi9cbi8vIEZyb3plbiBzbyB0aGUgZG9jc3RyaW5nJ3MgXCJmcm96ZW4gbWFwXCIgZ3VhcmFudGVlIGlzIHJlYWw6IGByZXNvbHZlVG9vbEN1cnNvcmBcbi8vIGlzIGEgcHVyZSBsb29rdXAgaW50byB0aGlzIG9iamVjdCwgYW5kIGZyZWV6aW5nIGZvcmVjbG9zZXMgYW55IHNhbWUtcmVhbG1cbi8vIHNoZWxsLXNpZGUgY29kZSBldmVyIG11dGF0aW5nIGFuIGVudHJ5IG91dCBmcm9tIHVuZGVyIHRoZSBsb29rdXAgKHRoZSBjYW52YXNcbi8vIHJ1bnMgY3Jvc3Mtb3JpZ2luIGFuZCBjYW4ndCByZWFjaCBpdCByZWdhcmRsZXNzIOKAlCB0aGlzIGlzIGJlbHQtYW5kLWJyYWNlcykuXG5leHBvcnQgY29uc3QgVE9PTF9DVVJTT1JTOiBSZWNvcmQ8VG9vbCwgc3RyaW5nPiA9IE9iamVjdC5mcmVlemUoe1xuICBtb3ZlOiBNT1ZFLFxuICBoYW5kOiBIQU5ELFxuICBjb21tZW50OiBDT01NRU5ULFxuICBwZW46IFBFTixcbiAgLy8gSGlnaGxpZ2h0ZXIgPSBLZW5uZXkgYGRyYXdpbmdfcGVuY2lsYCByb3QxODA7IHBlbiA9IGBkcmF3aW5nX3BlbmAgcm90MTgwIOKAlFxuICAvLyBkaXN0aW5jdCBnbHlwaHMsIGJvdGggZnJvbSB0aGUgS2VubmV5IHBhY2sgKHVzZXIgc3RlZXIgMjAyNi0wNi0wNCkuXG4gIGhpZ2hsaWdodGVyOiBISUdITElHSFRFUixcbiAgc2hhcGU6IENST1NTSEFJUixcbiAgcmVjdDogQ1JPU1NIQUlSLFxuICBlbGxpcHNlOiBDUk9TU0hBSVIsXG4gIHN0aWNreTogU1RJQ0tZLFxuICBhcnJvdzogQ1JPU1NIQUlSLFxuICB0ZXh0OiBURVhULFxuICBlcmFzZXI6IEVSQVNFUixcbn0pO1xuXG4vKipcbiAqIFJlc29sdmUgYSB0b29sIHRva2VuIOKAlCByZWNlaXZlZCBvdmVyIHRoZSAqKnVudHJ1c3RlZCoqIGNhbnZhc+KGknNoZWxsXG4gKiBgdG9vbC1jdXJzb3JgIHBvc3RNZXNzYWdlIGJyaWRnZSDigJQgdG8gYSBUUlVTVEVEIGN1cnNvciBzdHJpbmcgZnJvbVxuICoge0BsaW5rIFRPT0xfQ1VSU09SU30sIG9yIGBudWxsYCB3aGVuIHRoZSB0b2tlbiBpcyBub3QgYSBrbm93biB0b29sLlxuICpcbiAqIFRoZSBhcHAgc2hlbGwgYXBwbGllcyB0aGUgdmFsdWUgdGhpcyBSRVRVUk5TLCBuZXZlciB0aGUgcmF3IG1lc3NhZ2UuIFRoYXQgaXNcbiAqIHRoZSBzZWN1cml0eSBib3VuZGFyeTogYSBtYWxpY2lvdXMgKnN5bmNlZCogY2FudmFzIChERFItMDU0IOKAlCBjYW52YXMgY29udGVudFxuICogaXMgdW50cnVzdGVkIGFuZCBtYXkgYmUgaHViLXB1c2hlZCkgY2FuIGNhbGxcbiAqIGB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKHsgZGduOiAndG9vbC1jdXJzb3InLCB0b29sOiDigKYgfSwgJyonKWAgZGlyZWN0bHksXG4gKiBieXBhc3NpbmcgdGhlIGhvbmVzdCBgVG9vbFByb3ZpZGVyYCBzZW5kZXIuIEJ5IGVjaG9pbmcgb25seSBhIHRva2VuIGFuZFxuICogbG9va2luZyB0aGUgY3Vyc29yIHVwIGhlcmUsIHRoZSB3b3JzdCB0aGF0IGNhbnZhcyBjYW4gZG8gaXMgcGljayAqd2hpY2gqXG4gKiBrbm93biwgYWx3YXlzLXZpc2libGUgZ2x5cGggdGhlIHNoZWxsIHNob3dzIOKAlCBpdCBjYW4gbm8gbG9uZ2VyIHNtdWdnbGUgYW5cbiAqIGludmlzaWJsZSAvIGRpc3BsYWNlZCAvIHplcm8tY29udGVudCBTVkcgY3Vyc29yIHRoYXQgd291bGQgYWN0IGFzIGFcbiAqIGNsaWNramFja2luZyBhaWQgb3ZlciB0aGUgdW4tQ1NQJ2Qgc2hlbGwgKHBoYXNlLTI0IGV0aGljYWwtaGFja2VyIEZpbmRpbmcgMjtcbiAqIHNlZSBERFItMDY3KS4gYGhhc093blByb3BlcnR5YCAobm90IGBpbmApIGtlZXBzIGBjb25zdHJ1Y3RvcmAvYF9fcHJvdG9fX2BcbiAqIG9mZiB0aGUgYWxsb3dsaXN0LCBhbmQgdGhlIGBbYS16LV1gIHNoYXBlIGdhdGUgYmFycyBhbnl0aGluZyBidXQgYSB0b29sIGlkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVRvb2xDdXJzb3IodG9rZW46IHVua25vd24pOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKHR5cGVvZiB0b2tlbiAhPT0gJ3N0cmluZycgfHwgIS9eW2Etei1dKyQvLnRlc3QodG9rZW4pKSByZXR1cm4gbnVsbDtcbiAgaWYgKCFPYmplY3QuaGFzT3duKFRPT0xfQ1VSU09SUywgdG9rZW4pKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIFRPT0xfQ1VSU09SU1t0b2tlbiBhcyBUb29sXTtcbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICI7QUE0QkE7QUFBQTtBQUFBO0FBQUEsY0FJRTtBQUFBLGlCQUVBO0FBQUEsZUFDQTtBQUFBLGFBQ0E7QUFBQSxZQUNBO0FBQUEsY0FDQTtBQUFBO0FBRUY7OztBQ05BLHdCQUFTLDJCQUFhLHVCQUFXLG9CQUFTLHFCQUFROzs7QUNoQmxEO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFVQTtBQUNBO0FBQ0E7QUFBQTtBQTJQQSxJQUFNLGdCQUFnQixjQUFrQyxJQUFJO0FBRXJELFNBQVMsU0FBUyxHQUF1QjtBQUFBLEVBQzlDLE9BQU8sV0FBVyxhQUFhO0FBQUE7OztBQzVRakM7QUFBQSxtQkFDRTtBQUFBLGlCQUVBO0FBQUEsZ0JBQ0E7QUFBQSxlQUNBO0FBQUEsYUFDQTtBQUFBLFlBQ0E7QUFBQSxjQUNBO0FBQUE7QUFBQTtBQWdERixJQUFNLHNCQUFzQixlQUF3QyxJQUFJO0FBS3hFLFNBQVMsWUFBWSxDQUFDLEdBQXNCO0FBQUEsRUFDMUMsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFFLE9BQU8sT0FBTyxFQUFFO0FBQUE7QUFHeEMsU0FBUyxNQUFNLENBQUMsTUFBZ0M7QUFBQSxFQUM5QyxNQUFNLE1BQW1CLENBQUM7QUFBQSxFQUMxQixNQUFNLE9BQU8sSUFBSTtBQUFBLEVBQ2pCLFdBQVcsS0FBSyxNQUFNO0FBQUEsSUFDcEIsTUFBTSxJQUFJLGFBQWEsQ0FBQztBQUFBLElBQ3hCLElBQUksS0FBSyxJQUFJLENBQUM7QUFBQSxNQUFHO0FBQUEsSUFDakIsS0FBSyxJQUFJLENBQUM7QUFBQSxJQUNWLElBQUksS0FBSyxDQUFDO0FBQUEsRUFDWjtBQUFBLEVBQ0EsT0FBTztBQUFB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QUEsSUFDOUQsT0FBTyxNQUFNO0FBQUEsTUFDVixPQUE4QyxlQUFlO0FBQUE7QUFBQSxLQUUvRCxDQUFDLENBQUM7QUFBQSxFQUVMLE1BQU0sV0FBVyxhQUFZLE1BQU07QUFBQSxJQUNqQyxTQUFTLFVBQVUsVUFBVTtBQUFBLElBRTdCLGdCQUFnQixDQUFDLE1BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxNQUFNLElBQUksQ0FBRTtBQUFBLEtBQ2hELENBQUMsQ0FBQztBQUFBLEVBRUwsTUFBTSxjQUFjLGFBQVksTUFBTTtBQUFBLElBQ3BDLGdCQUFnQixFQUFFLElBQUksTUFBTSxTQUFTLGVBQWUsQ0FBQztBQUFBLEtBQ3BELENBQUMsQ0FBQztBQUFBLEVBRUwsTUFBTSxXQUFXLGFBQVksTUFBaUI7QUFBQSxJQUM1QyxNQUFNLEtBQUssU0FBUztBQUFBLElBQ3BCLE9BQU8sS0FBSyxnQkFBZ0IsSUFBSSxJQUFJLElBQUk7QUFBQSxLQUN2QyxDQUFDLElBQUksQ0FBQztBQUFBLEVBRVQsT0FBTyxjQUNMLFdBQ0EsTUFDQSxjQUNFLHFCQUNBLEVBQUUsU0FBUyxTQUFTLGFBQWEsU0FBUyxHQUcxQyxjQUFjLFVBQVUsRUFBRSxLQUFLLFNBQVMsUUFBUSxRQUFRLE1BQU0sTUFBTSxTQUFTLENBQUMsQ0FDaEYsR0FDQSxRQUFRLEtBQUssY0FBYyxpQkFBaUIsRUFBRSxTQUFTLFFBQVEsUUFBUSxDQUFDLElBQUksSUFDOUU7QUFBQTsiLAogICJkZWJ1Z0lkIjogIjVDMzBGNUM5M0RFMDFDNEY2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
|
|
2045
|
+
//# debugId=7F1482847AF8ADD864756E2164756E21
|
|
2046
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY2FudmFzLWNvbW1lbnQtbW91bnQudHN4IiwgIi4uL2NvbW1lbnRzLW92ZXJsYXkudHN4IiwgIi4uL3VzZS1jb2xsYWIudHN4IiwgIi4uL3VzZS1zZWxlY3Rpb24tc2V0LnRzeCIsICIuLi9kb20tc2VsZWN0aW9uLnRzIiwgIi4uL2lucHV0LXJvdXRlci50c3giLCAiLi4vdXNlLXRvb2wtbW9kZS50c3giLCAiLi4vY2FudmFzLWN1cnNvcnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiLyoqXG4gKiBAZmlsZSAgICAgICBjYW52YXMtY29tbWVudC1tb3VudC50c3gg4oCUIHNoZWxsLW93bmVkIGNvbW1lbnQgbGF5ZXIgKyBtb3VudENhbnZhc1xuICogQHNjb3BlICAgICAgYXBwcy9zdHVkaW8vY2FudmFzLWNvbW1lbnQtbW91bnQudHN4XG4gKiBAcHVycG9zZSAgICBUaGUgY2FudmFzIG1vdW50IGhhcm5lc3MgKGBfc2hlbGwuaHRtbGApIGNhbGxzIGBtb3VudENhbnZhc2BcbiAqICAgICAgICAgICAgIGluc3RlYWQgb2YgcmVuZGVyaW5nIHRoZSBjYW52YXMgZGVmYXVsdC1leHBvcnQgcmF3LiBtb3VudENhbnZhc1xuICogICAgICAgICAgICAgd3JhcHMgQU5ZIGRlZmF1bHQgZXhwb3J0IOKAlCBhIGBEZXNpZ25DYW52YXNgIFVJIGNhbnZhcyBPUiBhIGJhcmVcbiAqICAgICAgICAgICAgIERTIHNwZWNpbWVuIOKAlCBpbiBhIExJVEUgY29tbWVudCBwcm92aWRlciB0cmVlIHNvIHRoZSBpbi1wbGFjZVxuICogICAgICAgICAgICAgY29tbWVudCB0b29sIHdvcmtzIG9uIGV2ZXJ5IG1vdW50ZWQgc3VyZmFjZS5cbiAqXG4gKiBXaHkgYSBzaW5nbGUgc2hlbGwtb3duZWQgbGF5ZXIgKEREUiDigJQgc2VlIHBsYW4gwqdcIktleSBkZWNpc2lvblwiKTpcbiAqICAgLSBDb21tZW50cyB1c2VkIHRvIGJlIG1vdW50ZWQgb25seSBieSBgRGVzaWduQ2FudmFzYCAoVG9vbFByb3ZpZGVyICtcbiAqICAgICBTZWxlY3Rpb25TZXRQcm92aWRlciArIENvbW1lbnRzT3ZlcmxheSArIHRoZSBvbkRyb3BDb21tZW50IHJvdXRlclxuICogICAgIGJyYW5jaCkuIEJhcmUgc3BlY2ltZW5zIChgc3lzdGVtLzxkcz4vcHJldmlldy8qLnRzeGApIG5ldmVyIHJlbmRlclxuICogICAgIERlc2lnbkNhbnZhcywgc28gdGhleSBoYWQgbm8gY29tbWVudCB0b29sIGF0IGFsbC5cbiAqICAgLSBIb2lzdGluZyB0aGUgY29tbWVudCBzdWJzeXN0ZW0gaGVyZSBtYWtlcyBpdCB1bml2ZXJzYWwuIGBEZXNpZ25DYW52YXNgXG4gKiAgICAgYmVjb21lcyBhIENPTlNVTUVSIG9mIHRoZSBzaGVsbC1wcm92aWRlZCBUb29sUHJvdmlkZXIgLyBTZWxlY3Rpb25TZXQgL1xuICogICAgIENvbW1lbnRzT3ZlcmxheSAodmlhIE1heWJlVG9vbFByb3ZpZGVyIC8gTWF5YmVTZWxlY3Rpb25TZXRQcm92aWRlciBhbmRcbiAqICAgICBieSBkcm9wcGluZyBpdHMgb3duIDxDb21tZW50c092ZXJsYXkvPikuXG4gKlxuICogQ29leGlzdGVuY2Ugd2l0aCB0aGUgVUktY2FudmFzIHJvdXRlcjogdGhpcyBsYXllcidzIGlucHV0IHJvdXRlciBpcyBhblxuICogQU5DRVNUT1IgY2FwdHVyZS1saXN0ZW5lciBvdmVyIHRoZSBjYW52YXMuIE9uIGEgVUkgY2FudmFzLCBgQ2FudmFzU2hlbGxgXG4gKiBzdGlsbCBydW5zIGl0cyBPV04gcm91dGVyIChob3ZlciAvIHNlbGVjdCAvIGNvbnRleHQtbWVudSAvIHVuZG8pLiBUbyBhdm9pZFxuICogc3dhbGxvd2luZyB0aG9zZSBnZXN0dXJlcywgdGhpcyByb3V0ZXIgcGFzc2VzIGEgbmFycm93IGBjbGFpbWFibGVBY3Rpb25zYFxuICogYWxsb3dsaXN0IOKAlCBgZHJvcC1jb21tZW50YCAvIGB0b29sYCAvIGBlc2NhcGVgIC8gYGhvdmVyYC4gYGhvdmVyYCBuZXZlclxuICogcHJldmVudERlZmF1bHRzIHNvIHRoZSBpbm5lciByb3V0ZXIncyBoYWxvIGlzIHVuYWZmZWN0ZWQ7IGV2ZXJ5dGhpbmcgZWxzZVxuICogKHNlbGVjdCAvIGNvbnRleHQtbWVudSAvIHVuZG8pIHByb3BhZ2F0ZXMgdW50b3VjaGVkIHRvIHRoZSBpbm5lciByb3V0ZXIuXG4gKi9cblxuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICB0eXBlIENvbXBvbmVudFR5cGUsXG4gIGNyZWF0ZUVsZW1lbnQsXG4gIEZyYWdtZW50LFxuICB0eXBlIFJlYWN0Tm9kZSxcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUVmZmVjdCxcbiAgdXNlTWVtbyxcbiAgdXNlUmVmLFxuICB1c2VTdGF0ZSxcbn0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY3JlYXRlUm9vdCB9IGZyb20gJ3JlYWN0LWRvbS9jbGllbnQnO1xuXG5pbXBvcnQgeyBDb21tZW50c092ZXJsYXkgfSBmcm9tICcuL2NvbW1lbnRzLW92ZXJsYXkudHN4JztcbmltcG9ydCB7IGRlcml2ZUZpbGUsIGhvdmVyVGFyZ2V0VG9TZWxlY3Rpb24gfSBmcm9tICcuL2RvbS1zZWxlY3Rpb24udHMnO1xuaW1wb3J0IHsgdHlwZSBSb3V0ZXJBY3Rpb24sIHJlc29sdmVIb3ZlclRhcmdldCwgdXNlSW5wdXRSb3V0ZXIgfSBmcm9tICcuL2lucHV0LXJvdXRlci50c3gnO1xuaW1wb3J0IHtcbiAgTWF5YmVTZWxlY3Rpb25TZXRQcm92aWRlcixcbiAgdHlwZSBTZWxlY3Rpb24sXG4gIHVzZVNlbGVjdGlvblNldCxcbn0gZnJvbSAnLi91c2Utc2VsZWN0aW9uLXNldC50c3gnO1xuaW1wb3J0IHsgTWF5YmVUb29sUHJvdmlkZXIsIHVzZVRvb2xNb2RlIH0gZnJvbSAnLi91c2UtdG9vbC1tb2RlLnRzeCc7XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gUGhhc2UgMjQg4oCUIHRoZSBjb21tZW50LW1vZGUgY3Vyc29yIChhbmQgZXZlcnkgb3RoZXIgdG9vbCBjdXJzb3IpIGlzIG93bmVkXG4vLyBTT0xFTFkgYnkgdXNlLXRvb2wtbW9kZS50c3gsIHdob3NlIGAqIHsgY3Vyc29yOiA8S2VubmV5IGdseXBoPiAhaW1wb3J0YW50IH1gXG4vLyBydWxlIGlzIGluamVjdGVkIGJ5IHRoZSBUb29sUHJvdmlkZXIgdGhpcyBsYXllciBtb3VudHMgKE1heWJlVG9vbFByb3ZpZGVyKSDigJRcbi8vIHNvIGl0IGNvdmVycyBiYXJlIERTIHNwZWNpbWVucyB0b28uIFRoZSBvbGQgYFtkYXRhLW1jLWhvc3Rd4oCmYC9gYm9keVvigKZdYFxuLy8gY29tbWVudC1jdXJzb3IgcnVsZSB1c2VkIHRvIGxpdmUgaGVyZSwgYnV0IGl0cyBoaWdoZXIgc3BlY2lmaWNpdHkgc2hhZG93ZWRcbi8vIHRoZSB1bmlmaWVkIEtlbm5leSBjdXJzb3Igb24gVUkgY2FudmFzZXMgKGNvbW1lbnQtbW91bnQgc3RhbXBzXG4vLyBgZGF0YS1hY3RpdmUtdG9vbGAgb24gPGJvZHk+LCBzbyBgYm9keVtkYXRhLWFjdGl2ZS10b29sPVwiY29tbWVudFwiXSAqYCBtYXRjaGVkXG4vLyB0aGVyZSBhcyB3ZWxsKS4gUmVtb3ZlZCBzbyB0aGUgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCB3aW5zLiBTZWUgRERSLTA2Ny5cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBDb21tZW50SG9zdCDigJQgb3ducyB0aGUgbGl0ZSBjb21tZW50IHN1YnN5c3RlbTogdGhlIGlucHV0IHJvdXRlciAoY29tbWVudC1cbi8vIHNjb3BlZCksIHRoZSBzaW5nbGUgQ29tbWVudHNPdmVybGF5LCB0aGUgY29tbWVudC1tb2RlIGN1cnNvciBhdHRyaWJ1dGUsIGFuZFxuLy8gdGhlIHBhcmVudCBgZGduOid0b29sLXNldCdgIGxpc3RlbmVyIChzbyB0aGUgb3V0ZXIgbWVudWJhciBjb21tZW50IHRvZ2dsZVxuLy8gcmVhY2hlcyB0aGUgaWZyYW1lKS5cblxuLy8gT25seSB0aGVzZSBhY3Rpb24ga2luZHMgYXJlIGNsYWltZWQgYnkgdGhlIG1vdW50LWxheWVyIHJvdXRlcjsgdGhlIHJlc3Rcbi8vIHByb3BhZ2F0ZSB0byBhIFVJIGNhbnZhcydzIG93biByb3V0ZXIuIGB0b29sYCArIGBlc2NhcGVgIGFyZSBhbHNvIGhhbmRsZWQgYnlcbi8vIHRoZSBpbm5lciByb3V0ZXIgb24gVUkgY2FudmFzZXMg4oCUIGlkZW1wb3RlbnQgKHNhbWUgc2hhcmVkIHByb3ZpZGVyKS4gYGhvdmVyYFxuLy8gaXMgZGlzcGF0Y2hlZCB0b28gKGl0IG5ldmVyIHByZXZlbnREZWZhdWx0cywgc28gdGhlIGlubmVyIHJvdXRlcidzIG93biBob3ZlclxuLy8gaGFsbyBvbiBhIFVJIGNhbnZhcyBpcyB1bmFmZmVjdGVkKSDigJQgd2Ugb25seSBQQUlOVCB0aGUgbW91bnQtbGF5ZXIgcHJldmlld1xuLy8gaGFsbyBvbiBhIGJhcmUgc3BlY2ltZW4sIHdoZXJlIHRoZXJlIGlzIG5vIGlubmVyIENhbnZhc1NoZWxsIGhhbG8uXG5jb25zdCBDT01NRU5UX0NMQUlNUzogUmVhZG9ubHlTZXQ8Um91dGVyQWN0aW9uWydraW5kJ10+ID0gbmV3IFNldDxSb3V0ZXJBY3Rpb25bJ2tpbmQnXT4oW1xuICAnZHJvcC1jb21tZW50JyxcbiAgJ3Rvb2wnLFxuICAnZXNjYXBlJyxcbiAgJ2hvdmVyJyxcbl0pO1xuXG4vLyBUcnVlIHdoZW4gbm8gRGVzaWduQ2FudmFzL0NhbnZhc1NoZWxsIGlzIG1vdW50ZWQgb24gdGhpcyBzdXJmYWNlIOKAlCBpLmUuIGFcbi8vIGJhcmUgRFMgc3BlY2ltZW4uIE9uIGEgVUkgY2FudmFzIChgLmRjLWNhbnZhc2AgcHJlc2VudCkgdGhlIGlubmVyIHNoZWxsIG93bnNcbi8vIGhvdmVyLWhhbG8gcGFpbnRpbmcgKyBgcmVzb2x2ZUhvdmVyVGFyZ2V0YCBlbGVtZW50IGFuY2hvcmluZywgc28gdGhlIGxpdGVcbi8vIGxheWVyIGRlZmVycyB0byBpdC5cbmZ1bmN0aW9uIGlzQmFyZVNwZWNpbWVuKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiAhZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmRjLWNhbnZhcycpO1xufVxuXG4vLyBEZWVwZXN0IG5vbi1jaHJvbWUgZWxlbWVudCB1bmRlciBhIHBvaW50IOKAlCB0aGUgY29tbWVudCBhbmNob3IgZm9yIGEgYmFyZVxuLy8gc3BlY2ltZW4gKHNwZWNpbWVucyBhcmVuJ3Qgc3RhbXBlZCB3aXRoIGBkYXRhLWNkLWlkYCBhbmQgaGF2ZSBub1xuLy8gYC5kYy1hcnRib2FyZC1ib2R5YCwgc28gYHJlc29sdmVIb3ZlclRhcmdldGAgcmV0dXJucyBudWxsIGZvciB0aGVtKS5cbmZ1bmN0aW9uIHBpY2tTcGVjaW1lbkVsKGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiBudWxsO1xuICBjb25zdCBoaXQgPSBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KGNsaWVudFgsIGNsaWVudFkpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgaWYgKCFoaXQpIHJldHVybiBudWxsO1xuICAvLyBOZXZlciBhbmNob3IgdG8gY29tbWVudCBjaHJvbWUgb3IgdGhlIGRvY3VtZW50IHJvb3QuXG4gIGlmIChoaXQuY2xvc2VzdCgnLmNtLWNvbXBvc2VyLCAuY20tdGhyZWFkLCAuY20tbWVudGlvbi1wb3B1cCwgLmNtLXBpbiwgW2RhdGEtbWMtaG92ZXItaGFsb10nKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHRhZyA9IGhpdC50YWdOYW1lO1xuICBpZiAodGFnID09PSAnSFRNTCcgfHwgdGFnID09PSAnQk9EWScpIHJldHVybiBudWxsO1xuICByZXR1cm4gaGl0O1xufVxuXG5mdW5jdGlvbiBDb21tZW50SG9zdCh7IGNoaWxkcmVuLCBmaWxlIH06IHsgY2hpbGRyZW46IFJlYWN0Tm9kZTsgZmlsZTogc3RyaW5nIHwgdW5kZWZpbmVkIH0pIHtcbiAgY29uc3QgeyB0b29sLCBzZXRUb29sIH0gPSB1c2VUb29sTW9kZSgpO1xuICBjb25zdCBzZWxTZXQgPSB1c2VTZWxlY3Rpb25TZXQoKTtcbiAgY29uc3QgaG9zdFJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudCB8IG51bGw+KG51bGwpO1xuICAvLyBIb3Zlci1wcmV2aWV3IGhhbG8gdGFyZ2V0IChiYXJlIHNwZWNpbWVucyBvbmx5IOKAlCBzZWUgaXNCYXJlU3BlY2ltZW4pLlxuICBjb25zdCBbaG92ZXJFbCwgc2V0SG92ZXJFbF0gPSB1c2VTdGF0ZTxIVE1MRWxlbWVudCB8IG51bGw+KG51bGwpO1xuXG4gIC8vIExhdGVzdCB0b29sIGZvciB0aGUgcm91dGVyIChyZWFkIGF0IGV2ZW50IHRpbWUsIG5vdCBjYXB0dXJlZCkuXG4gIGNvbnN0IHRvb2xSZWYgPSB1c2VSZWYodG9vbCk7XG4gIHRvb2xSZWYuY3VycmVudCA9IHRvb2w7XG4gIGNvbnN0IGdldEFjdGl2ZVRvb2wgPSB1c2VNZW1vKCgpID0+ICgpID0+IHRvb2xSZWYuY3VycmVudCwgW10pO1xuXG4gIC8vIERyb3AgdGhlIHByZXZpZXcgaGFsbyB3aGVuZXZlciB3ZSBsZWF2ZSBjb21tZW50IG1vZGUuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHRvb2wgIT09ICdjb21tZW50Jykgc2V0SG92ZXJFbChudWxsKTtcbiAgfSwgW3Rvb2xdKTtcblxuICAvLyBSZWZsZWN0IHRoZSBhY3RpdmUgdG9vbCBvbnRvIHRoZSBob3N0IChhbmQgYm9keSwgc2luY2UgdGhlIGhvc3QgaXNcbiAgLy8gZGlzcGxheTpjb250ZW50cyBhbmQgY2FuJ3QgY2FycnkgYSBwYWludGFibGUgY3Vyc29yKS4gQ29tbWVudC1tb2RlIENTU1xuICAvLyBrZXlzIG9mZiBgW2RhdGEtYWN0aXZlLXRvb2w9XCJjb21tZW50XCJdYC5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBob3N0ID0gaG9zdFJlZi5jdXJyZW50O1xuICAgIGlmIChob3N0KSBob3N0LnNldEF0dHJpYnV0ZSgnZGF0YS1hY3RpdmUtdG9vbCcsIHRvb2wpO1xuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LmJvZHkpIHtcbiAgICAgIGRvY3VtZW50LmJvZHkuc2V0QXR0cmlidXRlKCdkYXRhLWFjdGl2ZS10b29sJywgdG9vbCk7XG4gICAgfVxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBob3N0Py5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtYWN0aXZlLXRvb2wnKTtcbiAgICB9O1xuICB9LCBbdG9vbF0pO1xuXG4gIC8vIFBhcmVudCBgZGduOid0b29sLXNldCdgIOKAlCB0aGUgb3V0ZXIgZGV2LXNlcnZlciBtZW51YmFyIHBvc3RzIHRoaXMgd2hlbiB0aGVcbiAgLy8gdXNlciB0b2dnbGVzIHRoZSBjb21tZW50IHRvb2wuIE1pcnJvcnMgY2FudmFzLXNoZWxsJ3MgbGlzdGVuZXIgc28gdGhlXG4gIC8vIHRvZ2dsZSByZWFjaGVzIGJhcmUgc3BlY2ltZW5zIHRvbyAod2hpY2ggaGF2ZSBubyBpbm5lciBzaGVsbCBsaXN0ZW5lcikuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG4gICAgY29uc3Qgb25NZXNzYWdlID0gKGU6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgICAgY29uc3QgbSA9IGUuZGF0YSBhcyB7IGRnbj86IHN0cmluZzsgdG9vbD86IHN0cmluZyB9IHwgbnVsbDtcbiAgICAgIGlmICghbSB8fCB0eXBlb2YgbSAhPT0gJ29iamVjdCcgfHwgbS5kZ24gIT09ICd0b29sLXNldCcpIHJldHVybjtcbiAgICAgIGlmICh0eXBlb2YgbS50b29sID09PSAnc3RyaW5nJykgc2V0VG9vbChtLnRvb2wgYXMgbmV2ZXIpO1xuICAgIH07XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBvbk1lc3NhZ2UpO1xuICAgIHJldHVybiAoKSA9PiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIG9uTWVzc2FnZSk7XG4gIH0sIFtzZXRUb29sXSk7XG5cbiAgdXNlSW5wdXRSb3V0ZXIoe1xuICAgIGhvc3RSZWYsXG4gICAgZ2V0QWN0aXZlVG9vbCxcbiAgICBjbGFpbWFibGVBY3Rpb25zOiBDT01NRU5UX0NMQUlNUyxcbiAgICBjYWxsYmFja3M6IHtcbiAgICAgIG9uSG92ZXI6ICh7IGNsaWVudFgsIGNsaWVudFkgfSkgPT4ge1xuICAgICAgICAvLyBQYWludCBhIHByZXZpZXcgaGFsbyBvbmx5IG9uIGJhcmUgc3BlY2ltZW5zOyBhIFVJIGNhbnZhcydzIG93blxuICAgICAgICAvLyBDYW52YXNTaGVsbCBIb3ZlckhhbG8gb3ducyB0aGUgY29tbWVudC1tb2RlIHByZXZpZXcgdGhlcmUuXG4gICAgICAgIGlmICh0b29sUmVmLmN1cnJlbnQgIT09ICdjb21tZW50JyB8fCAhaXNCYXJlU3BlY2ltZW4oKSkge1xuICAgICAgICAgIHNldEhvdmVyRWwobnVsbCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVsID0gcGlja1NwZWNpbWVuRWwoY2xpZW50WCwgY2xpZW50WSk7XG4gICAgICAgIHNldEhvdmVyRWwoKHByZXYpID0+IChwcmV2ID09PSBlbCA/IHByZXYgOiBlbCkpO1xuICAgICAgfSxcbiAgICAgIG9uVG9vbDogKHsgdG9vbDogdCB9KSA9PiBzZXRUb29sKHQpLFxuICAgICAgb25Fc2NhcGU6ICgpID0+IHtcbiAgICAgICAgaWYgKHRvb2xSZWYuY3VycmVudCAhPT0gJ21vdmUnKSBzZXRUb29sKCdtb3ZlJyk7XG4gICAgICAgIHNldEhvdmVyRWwobnVsbCk7XG4gICAgICAgIHNlbFNldC5jbGVhcigpO1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZSh7IGRnbjogJ2ZvcmNlLWNsZWFyJyB9LCAnKicpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLyogcGFyZW50IGRldGFjaGVkICovXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgb25Ecm9wQ29tbWVudDogKHsgY2xpZW50WCwgY2xpZW50WSB9KSA9PiBkcm9wQ29tbWVudChjbGllbnRYLCBjbGllbnRZLCBzZWxTZXQsIGZpbGUpLFxuICAgIH0sXG4gIH0pO1xuXG4gIC8vIGBkaXNwbGF5OiBjb250ZW50c2Aga2VlcHMgdGhlIHNwZWNpbWVuJ3Mgb3duIGZsZXgvZ3JpZCBsYXlvdXQgYnl0ZS1cbiAgLy8gaWRlbnRpY2FsIOKAlCB0aGUgaG9zdCBib3ggY29udHJpYnV0ZXMgbm90aGluZyB0byBsYXlvdXQuIFRoZSBmaXhlZC1wb3NpdGlvblxuICAvLyBDb21tZW50c092ZXJsYXkgcmVuZGVycyBmaW5lIGFzIGEgY2hpbGQgcmVnYXJkbGVzcy5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGRhdGEtbWMtaG9zdCByZWY9e2hvc3RSZWZ9IHN0eWxlPXt7IGRpc3BsYXk6ICdjb250ZW50cycgfX0+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgICB7aG92ZXJFbCA/IDxNb3VudEhvdmVySGFsbyBlbD17aG92ZXJFbH0gLz4gOiBudWxsfVxuICAgICAgPENvbW1lbnRzT3ZlcmxheSAvPlxuICAgIDwvZGl2PlxuICApO1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIE1vdW50SG92ZXJIYWxvIOKAlCBmaXhlZC1wb3NpdGlvbiBvdXRsaW5lIHRyYWNraW5nIHRoZSBob3ZlcmVkIGVsZW1lbnQncyBzY3JlZW5cbi8vIGJvdW5kcyB2aWEgckFGLiBJbmxpbmUtc3R5bGVkIChubyBkZXBlbmRlbmN5IG9uIGNhbnZhcy1saWIncyBIQUxPX0NTUywgd2hpY2hcbi8vIGEgYmFyZSBzcGVjaW1lbiBkb2Vzbid0IGxvYWQpLiBNaXJyb3JzIGNhbnZhcy1zaGVsbCdzIEhvdmVySGFsbyB2aXN1YWxseS5cblxuZnVuY3Rpb24gTW91bnRIb3ZlckhhbG8oeyBlbCB9OiB7IGVsOiBIVE1MRWxlbWVudCB9KSB7XG4gIGNvbnN0IHJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudCB8IG51bGw+KG51bGwpO1xuICBjb25zdCB0YXJnZXRSZWYgPSB1c2VSZWY8SFRNTEVsZW1lbnQ+KGVsKTtcbiAgdGFyZ2V0UmVmLmN1cnJlbnQgPSBlbDtcbiAgY29uc3QgcmFmUmVmID0gdXNlUmVmPG51bWJlciB8IG51bGw+KG51bGwpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgdGljayA9ICgpID0+IHtcbiAgICAgIHJhZlJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgIGNvbnN0IGRpdiA9IHJlZi5jdXJyZW50O1xuICAgICAgY29uc3QgdCA9IHRhcmdldFJlZi5jdXJyZW50O1xuICAgICAgaWYgKGRpdiAmJiB0Py5pc0Nvbm5lY3RlZCkge1xuICAgICAgICBjb25zdCByID0gdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgaWYgKHIud2lkdGggPT09IDAgJiYgci5oZWlnaHQgPT09IDApIHtcbiAgICAgICAgICBkaXYuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkaXYuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgZGl2LnN0eWxlLmxlZnQgPSBgJHtNYXRoLnJvdW5kKHIubGVmdCl9cHhgO1xuICAgICAgICAgIGRpdi5zdHlsZS50b3AgPSBgJHtNYXRoLnJvdW5kKHIudG9wKX1weGA7XG4gICAgICAgICAgZGl2LnN0eWxlLndpZHRoID0gYCR7TWF0aC5yb3VuZChyLndpZHRoKX1weGA7XG4gICAgICAgICAgZGl2LnN0eWxlLmhlaWdodCA9IGAke01hdGgucm91bmQoci5oZWlnaHQpfXB4YDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkaXYpIHtcbiAgICAgICAgZGl2LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9XG4gICAgICByYWZSZWYuY3VycmVudCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aWNrKTtcbiAgICB9O1xuICAgIHJhZlJlZi5jdXJyZW50ID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRpY2spO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAocmFmUmVmLmN1cnJlbnQgIT0gbnVsbCkgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmUmVmLmN1cnJlbnQpO1xuICAgIH07XG4gIH0sIFtdKTtcblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIHJlZj17cmVmfVxuICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgIGRhdGEtbWMtaG92ZXItaGFsbz1cIlwiXG4gICAgICBzdHlsZT17e1xuICAgICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgICAgZGlzcGxheTogJ25vbmUnLFxuICAgICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZScsXG4gICAgICAgIHpJbmRleDogMjE0NzQ4MzY0NixcbiAgICAgICAgYm9yZGVyOiAnMnB4IHNvbGlkIHZhcigtLW1hdWRlLWh1ZC1hY2NlbnQsICNkNjNiMWYpJyxcbiAgICAgICAgYm9yZGVyUmFkaXVzOiAnM3B4JyxcbiAgICAgICAgYm94U2l6aW5nOiAnYm9yZGVyLWJveCcsXG4gICAgICB9fVxuICAgIC8+XG4gICk7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gQ29tbWVudCBkcm9wIOKAlCBnZW5lcmljIHBhdGggbGlmdGVkIGZyb20gY2FudmFzLXNoZWxsJ3Mgb25Ecm9wQ29tbWVudC4gV29ya3Ncbi8vIHdpdGggb3Igd2l0aG91dCBhcnRib2FyZHM6IGRlZXAvc2hhbGxvdyByZXNvbHZlSG92ZXJUYXJnZXQg4oaSIGVsZW1lbnRzRnJvbVBvaW50XG4vLyBkYXRhLWNkLWlkIGNsaW1iIOKGkiBmbG9hdGluZyBmYWxsYmFjay4gRGlzcGF0Y2hlcyBgY206b3Blbi1jb21wb3NlcmAgZm9yIHRoZVxuLy8gaW4taWZyYW1lIG92ZXJsYXkgKyBwb3N0cyBgY29tbWVudC1jb21wb3NlYCB0byB0aGUgcGFyZW50IGZvciBsZWdhY3kgbW9ja3MuXG5cbmZ1bmN0aW9uIGRyb3BDb21tZW50KFxuICBjbGllbnRYOiBudW1iZXIsXG4gIGNsaWVudFk6IG51bWJlcixcbiAgc2VsU2V0OiB7IHJlcGxhY2U6IChzOiBTZWxlY3Rpb24pID0+IHZvaWQgfSxcbiAgZmlsZTogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiB2b2lkIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcbiAgbGV0IHRhcmdldCA9IHJlc29sdmVIb3ZlclRhcmdldChkb2N1bWVudCwgY2xpZW50WCwgY2xpZW50WSwgeyBkZWVwOiB0cnVlIH0pO1xuICBpZiAoIXRhcmdldCkgdGFyZ2V0ID0gcmVzb2x2ZUhvdmVyVGFyZ2V0KGRvY3VtZW50LCBjbGllbnRYLCBjbGllbnRZLCB7IGRlZXA6IGZhbHNlIH0pO1xuICAvLyBVSS1jYW52YXMgcmVjb3Zlcnkg4oCUIHdoZW4gYm90aCBwYXNzZXMgYmFpbCBvbiBhIGBwb2ludGVyLWV2ZW50czogbm9uZWBcbiAgLy8gZGVjb3JhdGlvbiwgZW51bWVyYXRlIHRoZSBzdGFjayBhbmQgY2xpbWIgdGhlIGZpcnN0IGBkYXRhLWNkLWlkYCBhbmNlc3RvclxuICAvLyBpbnNpZGUgYW4gYXJ0Ym9hcmQgYm9keS4gU2tpcHBlZCBvbiBiYXJlIHNwZWNpbWVucywgd2hpY2ggaW5zdGVhZCBhbmNob3IgdG9cbiAgLy8gdGhlIGV4YWN0IGhvdmVyZWQgZWxlbWVudCBiZWxvdyAoc28gdGhlIHBpbiBtYXRjaGVzIHRoZSBob3ZlciBwcmV2aWV3IGhhbG8pLlxuICBpZiAoIXRhcmdldCAmJiAhaXNCYXJlU3BlY2ltZW4oKSAmJiB0eXBlb2YgZG9jdW1lbnQuZWxlbWVudHNGcm9tUG9pbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zdCBzdGFjayA9IGRvY3VtZW50LmVsZW1lbnRzRnJvbVBvaW50KGNsaWVudFgsIGNsaWVudFkpO1xuICAgIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIHN0YWNrKSB7XG4gICAgICBjb25zdCBzdGFtcGVkID0gKGNhbmRpZGF0ZSBhcyBFbGVtZW50KS5jbG9zZXN0Py4oJ1tkYXRhLWNkLWlkXScpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICAgIGlmICghc3RhbXBlZCkgY29udGludWU7XG4gICAgICBpZiAoIXN0YW1wZWQuY2xvc2VzdCgnLmRjLWFydGJvYXJkLWJvZHknKSkgY29udGludWU7XG4gICAgICBjb25zdCBhcnRib2FyZEVsID0gc3RhbXBlZC5jbG9zZXN0KCdbZGF0YS1kYy1zY3JlZW5dJyk7XG4gICAgICB0YXJnZXQgPSB7XG4gICAgICAgIGVsOiBzdGFtcGVkLFxuICAgICAgICBjZElkOiBzdGFtcGVkLmdldEF0dHJpYnV0ZSgnZGF0YS1jZC1pZCcpLFxuICAgICAgICBhcnRib2FyZElkOiBhcnRib2FyZEVsPy5nZXRBdHRyaWJ1dGUoJ2RhdGEtZGMtc2NyZWVuJykgPz8gbnVsbCxcbiAgICAgIH07XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvLyBCYXJlLXNwZWNpbWVuIGFuY2hvciDigJQgc3BlY2ltZW5zIGhhdmUgbm8gYC5kYy1hcnRib2FyZC1ib2R5YCwgc29cbiAgLy8gcmVzb2x2ZUhvdmVyVGFyZ2V0IGJhaWxzLiBBbmNob3IgdG8gdGhlIEVYQUNUIGVsZW1lbnQgdW5kZXIgdGhlIGN1cnNvciAodGhlXG4gIC8vIHNhbWUgb25lIHBpY2tTcGVjaW1lbkVsIGhpZ2hsaWdodHMgZm9yIHRoZSBob3ZlciBwcmV2aWV3KSwgdmlhIGl0cyBvd25cbiAgLy8gZGF0YS1jZC1pZCB3aGVuIHN0YW1wZWQsIGVsc2UgYSBjc3NQYXRoIHNlbGVjdG9yIOKAlCBzbyB0aGUgZHJvcHBlZCBwaW4gbGFuZHNcbiAgLy8gb24gdGhlIHByZXZpZXdlZCBlbGVtZW50IGluc3RlYWQgb2YgZmxvYXRpbmcuXG4gIGlmICghdGFyZ2V0ICYmIGlzQmFyZVNwZWNpbWVuKCkpIHtcbiAgICBjb25zdCBlbCA9IHBpY2tTcGVjaW1lbkVsKGNsaWVudFgsIGNsaWVudFkpO1xuICAgIGlmIChlbCkgdGFyZ2V0ID0geyBlbCwgY2RJZDogZWwuZ2V0QXR0cmlidXRlKCdkYXRhLWNkLWlkJyksIGFydGJvYXJkSWQ6IG51bGwgfTtcbiAgfVxuXG4gIGlmICghdGFyZ2V0KSB7XG4gICAgLy8gRmxvYXRpbmcgY29tbWVudCDigJQgbm8gZWxlbWVudCBhbmNob3IsIGp1c3QgdGhlIGNsaWNrIHBvaW50IChlLmcuIGEgY2xpY2tcbiAgICAvLyBvbiBlbXB0eSBjYW52YXMvc3BlY2ltZW4gZGVhZCBzcGFjZSkuIFRoZSBvdmVybGF5IHJlbmRlcnMgYSBwaW4gYXQgdGhlXG4gICAgLy8gc3RvcmVkIGJvdW5kcy5cbiAgICBjb25zdCBmbG9hdGluZ1NlbDogU2VsZWN0aW9uID0ge1xuICAgICAgZmlsZSxcbiAgICAgIGlkOiB1bmRlZmluZWQsXG4gICAgICBzZWxlY3RvcjogJycsXG4gICAgICBhcnRib2FyZElkOiBudWxsLFxuICAgICAgdGFnOiAnJyxcbiAgICAgIGNsYXNzZXM6ICcnLFxuICAgICAgdGV4dDogJycsXG4gICAgICBkb21fcGF0aDogW10sXG4gICAgICBib3VuZHM6IHsgeDogY2xpZW50WCAtIDEyLCB5OiBjbGllbnRZIC0gMTIsIHc6IDI0LCBoOiAyNCB9LFxuICAgICAgaHRtbDogJycsXG4gICAgfTtcbiAgICBvcGVuQ29tcG9zZXIoZmxvYXRpbmdTZWwsIGNsaWVudFgsIGNsaWVudFkpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHNlbCA9IGhvdmVyVGFyZ2V0VG9TZWxlY3Rpb24odGFyZ2V0LCBmaWxlKTtcbiAgc2VsU2V0LnJlcGxhY2Uoc2VsKTtcbiAgb3BlbkNvbXBvc2VyKHNlbCwgY2xpZW50WCwgY2xpZW50WSk7XG59XG5cbmZ1bmN0aW9uIG9wZW5Db21wb3NlcihzZWxlY3Rpb246IFNlbGVjdGlvbiwgY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiB2b2lkIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB0cnkge1xuICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50KCdjbTpvcGVuLWNvbXBvc2VyJywgeyBkZXRhaWw6IHsgc2VsZWN0aW9uLCBjbGllbnRYLCBjbGllbnRZIH0gfSlcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvKiBDdXN0b21FdmVudCBhYnNlbnQg4oCUIGZhbGwgdGhyb3VnaCB0byBwYXJlbnQgcGF0aCAqL1xuICAgIH1cbiAgfVxuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB0cnkge1xuICAgICAgd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZSh7IGRnbjogJ2NvbW1lbnQtY29tcG9zZScsIHNlbGVjdGlvbiB9LCAnKicpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLyogcGFyZW50IGRldGFjaGVkICovXG4gICAgfVxuICB9XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gbW91bnRDYW52YXMg4oCUIHRoZSBzaGVsbCBoYXJuZXNzIGVudHJ5LiBSZW5kZXJzIHRoZSBjYW52YXMgd3JhcHBlZCBpbiB0aGUgbGl0ZVxuLy8gY29tbWVudCB0cmVlLCBvciBiYXJlIHdoZW4gY29tbWVudHMgYXJlIGRpc2FibGVkIChnYWxsZXJ5IHRodW1ibmFpbHMgcGFzc1xuLy8gYGNvbW1lbnRzRW5hYmxlZDogZmFsc2VgIHZpYSBgP2NvbW1lbnRzPTBgKS5cblxuZXhwb3J0IGludGVyZmFjZSBNb3VudENhbnZhc09wdGlvbnMge1xuICByb290RWw6IEhUTUxFbGVtZW50O1xuICAvKiogQ2FudmFzIGZpbGUga2V5IChkZXNpZ25SZWwtcHJlZml4ZWQpLiBEZWZhdWx0cyB0byBgZGVyaXZlRmlsZSgpYC4gKi9cbiAgZmlsZT86IHN0cmluZztcbiAgLyoqIFdoZW4gZmFsc2UsIHRoZSBjb21tZW50IGxheWVyIGlzIHNraXBwZWQg4oCUIHRoZSBjYW52YXMgcmVuZGVycyByYXcuICovXG4gIGNvbW1lbnRzRW5hYmxlZDogYm9vbGVhbjtcbn1cblxuLy8gVGhlIGxpdGUgcHJvdmlkZXIgdHJlZSB3cmFwcGluZyBhIGNhbnZhcyBjb21wb25lbnQgKHRvb2wgKyBzZWxlY3Rpb24gK1xuLy8gY29tbWVudCBsYXllcikuIFB1bGxlZCBvdXQgc28gYm90aCB0aGUgbGl2ZSByZW5kZXIgYW5kIHRoZSBlcnJvci1mYWxsYmFja1xuLy8gcmVuZGVyIGJ1aWxkIHRoZSBpZGVudGljYWwgZW52ZWxvcGUuXG4vL1xuLy8gTkI6IHRoZSBDYW52YXNBY3Rpdml0eVByb3ZpZGVyIChQaGFzZSAxMyAvIEREUi0wMjkpIGlzIE5PVCBtb3VudGVkIGhlcmUg4oCUIGl0XG4vLyBsaXZlcyBpbnNpZGUgYERlc2lnbkNhbnZhc2AgKGNhbnZhcy1saWIpLiBjb21tZW50LW1vdW50LmpzIGFuZCBjYW52YXMtbGliIGFyZVxuLy8gU0VQQVJBVEUgYnVuZGxlcywgc28gYSBjb250ZXh0IHByb3ZpZGVkIGhlcmUgd291bGQgYmUgYSBkaWZmZXJlbnQgaW5zdGFuY2Vcbi8vIGZyb20gdGhlIG9uZSBEQ0FydGJvYXJkIChjYW52YXMtbGliKSBjb25zdW1lcy4gU2FtZSByZWFzb25pbmcgdGhlIHJlYWxcbi8vIFRvb2xQcm92aWRlciBsaXZlcyBpbiBEZXNpZ25DYW52YXMsIG5vdCBpbiB0aGlzIGxheWVyJ3MgTWF5YmVUb29sUHJvdmlkZXIuXG5mdW5jdGlvbiBidWlsZENhbnZhc1RyZWUoQ2FudmFzOiBDb21wb25lbnRUeXBlLCBmaWxlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBSZWFjdE5vZGUge1xuICByZXR1cm4gY3JlYXRlRWxlbWVudChcbiAgICBNYXliZVRvb2xQcm92aWRlcixcbiAgICBudWxsLFxuICAgIGNyZWF0ZUVsZW1lbnQoXG4gICAgICBNYXliZVNlbGVjdGlvblNldFByb3ZpZGVyLFxuICAgICAgbnVsbCxcbiAgICAgIGNyZWF0ZUVsZW1lbnQoQ29tbWVudEhvc3QsIHsgZmlsZSB9LCBjcmVhdGVFbGVtZW50KENhbnZhcykpXG4gICAgKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbW91bnRDYW52YXMoQ2FudmFzOiBDb21wb25lbnRUeXBlLCBvcHRzOiBNb3VudENhbnZhc09wdGlvbnMpOiB2b2lkIHtcbiAgY29uc3Qgcm9vdCA9IGNyZWF0ZVJvb3Qob3B0cy5yb290RWwpO1xuICBpZiAoIW9wdHMuY29tbWVudHNFbmFibGVkKSB7XG4gICAgcm9vdC5yZW5kZXIoY3JlYXRlRWxlbWVudChDYW52YXMpKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgZmlsZSA9IG9wdHMuZmlsZSA/PyBkZXJpdmVGaWxlKCk7XG4gIHJvb3QucmVuZGVyKGNyZWF0ZUVsZW1lbnQoQ2FudmFzSG1yUnVudGltZSwgeyBpbml0aWFsQ2FudmFzOiBDYW52YXMsIGZpbGUgfSkpO1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFBoYXNlIDEzLjEgLyBERFItMDc3IOKAlCBITVIgZXJyb3IgcmVzaWxpZW5jZSBkdXJpbmcgYWdlbnQgZWRpdGluZy5cbi8vXG4vLyBXaGVuIGFuIGFnZW50IChgL2Rlc2lnbjplZGl0YCAvIGAvZGVzaWduOm5ld2ApIGxpdmUtZWRpdHMgYSBjYW52YXMsIGFcbi8vIGhhbGYtc2F2ZWQgZmlsZSAobWlzc2luZyBpbXBvcnQsIHVuZGVmaW5lZCBzeW1ib2wsIHRyYW5zcGlsZSBlcnJvcikgdXNlZCB0b1xuLy8gYmxhbmsgdGhlIGNhbnZhcyB0byB3aGl0ZTogdGhlIHNoZWxsIGRpZCBgbG9jYXRpb24ucmVsb2FkKClgIHN0cmFpZ2h0IGludG8gdGhlXG4vLyBicm9rZW4gbW9kdWxlLiBUaGUgc2hlbGwgbm93IHNvZnQtcmVsb2FkcyAoaW1wb3J0LWJlZm9yZS1zd2FwLCBzZWVcbi8vIGB0ZW1wbGF0ZXMvX3NoZWxsLmh0bWxgKSBzbyBhIGJ1aWxkL2ltcG9ydCBlcnJvciBuZXZlciB0ZWFycyBkb3duIHRoZSBnb29kXG4vLyByZW5kZXIuIFRoaXMgcnVudGltZSBjbG9zZXMgdGhlIHJlbWFpbmluZyBnYXAg4oCUIGEgKnJlbmRlci10aW1lKiB0aHJvdyDigJQgYnlcbi8vIGtlZXBpbmcgdGhlIGxhc3QgZ29vZCBjYW52YXMgbW91bnRlZCB2aWEgYW4gZXJyb3IgYm91bmRhcnkgYW5kIHN1cmZhY2luZyBhXG4vLyBcImhvbGRpbmcgbGFzdCBnb29kXCIgdG9hc3QgaW5zdGVhZCBvZiBhIHdoaXRlIHNjcmVlbi4gU3RyaWN0bHkgZ2F0ZWQgYnkgdGhlXG4vLyBzaGVsbCBvbiBhZ2VudC1hY3RpdmU7IG1hbnVhbCBlZGl0cyBrZWVwIHRoZSBwbGFpbiByZWxvYWQgKHNvIHRoaXMgaXMgaW5lcnRcbi8vIGZvciBzb2xvIGhhbmQtZWRpdGluZykuIFRoZSBydW50aW1lIGV4cG9zZXMgaXRzIHN3YXAvaG9sZCBBUEkgb25cbi8vIGB3aW5kb3cuX19tYXVkZUNhbnZhc1J1bnRpbWVgICh0aGUgc2FtZSB3aW5kb3ctaGFuZHNoYWtlIHN0eWxlIHRoZSBzaGVsbFxuLy8gYWxyZWFkeSB1c2VzIGZvciBgX19jYW52YXNfcmVsX19gIGV0Yy4pLlxuXG5leHBvcnQgaW50ZXJmYWNlIENhbnZhc1J1bnRpbWVBcGkge1xuICAvKiogU3dhcCBpbiBhIGZyZXNobHktaW1wb3J0ZWQgY2FudmFzIG1vZHVsZSdzIGRlZmF1bHQgZXhwb3J0IChzdWNjZXNzIHBhdGgpLiAqL1xuICByZW1vdW50OiAobmV4dDogQ29tcG9uZW50VHlwZSkgPT4gdm9pZDtcbiAgLyoqIFNob3cvaGlkZSB0aGUgXCJob2xkaW5nIGxhc3QgZ29vZFwiIHRvYXN0IChidWlsZC1lcnJvciBwYXRoIGZyb20gdGhlIHNoZWxsKS4gKi9cbiAgc2V0SG9sZGluZzogKG9uOiBib29sZWFuLCBtZXNzYWdlPzogc3RyaW5nKSA9PiB2b2lkO1xufVxuXG5jb25zdCBSVU5USU1FX0tFWSA9ICdfX21hdWRlQ2FudmFzUnVudGltZSc7XG5cbi8qKlxuICogRmlyZXMgYG9uT2tgIG9ubHkgd2hlbiBpdHMgc3VidHJlZSBDT01NSVRTIOKAlCBpLmUuIHJlbmRlcnMgd2l0aG91dCB0aHJvd2luZy4gQVxuICogcmVuZGVyLXRpbWUgdGhyb3cgaW4gdGhlIGNhbnZhcyB1bndpbmRzIHRvIHRoZSBib3VuZGFyeSBiZWZvcmUgdGhpcyBjb21taXRzLFxuICogc28gYG9uT2tgIG5ldmVyIHJ1bnMgYW5kIGBsYXN0R29vZGAgaXMgbm90IGFkdmFuY2VkIHRvIGEgYnJva2VuIG1vZHVsZS5cbiAqL1xuZnVuY3Rpb24gT2tTaWduYWwoe1xuICBDYW52YXMsXG4gIGZpbGUsXG4gIG9uT2ssXG59OiB7XG4gIENhbnZhczogQ29tcG9uZW50VHlwZTtcbiAgZmlsZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBvbk9rOiAoKSA9PiB2b2lkO1xufSkge1xuICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb3JyZWN0bmVzcy91c2VFeGhhdXN0aXZlRGVwZW5kZW5jaWVzOiBmaXJlIG9uY2UgcGVyIG1vdW50IChrZXk9YXR0ZW1wdCByZW1vdW50cyB0aGlzKS5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBvbk9rKCk7XG4gIH0sIFtdKTtcbiAgcmV0dXJuIGJ1aWxkQ2FudmFzVHJlZShDYW52YXMsIGZpbGUpO1xufVxuXG5leHBvcnQgY2xhc3MgQ2FudmFzRXJyb3JCb3VuZGFyeSBleHRlbmRzIENvbXBvbmVudDxcbiAge1xuICAgIGF0dGVtcHQ6IG51bWJlcjtcbiAgICBvbkVycm9yOiAoKSA9PiB2b2lkO1xuICAgIGZhbGxiYWNrOiAoKSA9PiBSZWFjdE5vZGU7XG4gICAgY2hpbGRyZW46IFJlYWN0Tm9kZTtcbiAgfSxcbiAgeyBoYXNFcnJvcjogYm9vbGVhbiB9XG4+IHtcbiAgc3RhdGUgPSB7IGhhc0Vycm9yOiBmYWxzZSB9O1xuICBzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKCk6IHsgaGFzRXJyb3I6IGJvb2xlYW4gfSB7XG4gICAgcmV0dXJuIHsgaGFzRXJyb3I6IHRydWUgfTtcbiAgfVxuICBjb21wb25lbnREaWRDYXRjaCgpOiB2b2lkIHtcbiAgICB0aGlzLnByb3BzLm9uRXJyb3IoKTtcbiAgfVxuICBjb21wb25lbnREaWRVcGRhdGUocHJldjogeyBhdHRlbXB0OiBudW1iZXIgfSk6IHZvaWQge1xuICAgIC8vIEEgbmV3IGNhbnZhcyAobmV3IGF0dGVtcHQpIGFycml2ZWQg4oaSIGNsZWFyIHRoZSBlcnJvciBhbmQgdHJ5IHJlbmRlcmluZyBpdC5cbiAgICBpZiAocHJldi5hdHRlbXB0ICE9PSB0aGlzLnByb3BzLmF0dGVtcHQgJiYgdGhpcy5zdGF0ZS5oYXNFcnJvcikge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IGhhc0Vycm9yOiBmYWxzZSB9KTtcbiAgICB9XG4gIH1cbiAgcmVuZGVyKCk6IFJlYWN0Tm9kZSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuaGFzRXJyb3IpIHJldHVybiB0aGlzLnByb3BzLmZhbGxiYWNrKCk7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW47XG4gIH1cbn1cblxuZnVuY3Rpb24gSG1ySG9sZGluZ1RvYXN0KHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSk6IFJlYWN0Tm9kZSB7XG4gIHJldHVybiBjcmVhdGVFbGVtZW50KFxuICAgICdkaXYnLFxuICAgIHtcbiAgICAgIGNsYXNzTmFtZTogJ2RjLWhtci1ob2xkaW5nJyxcbiAgICAgIHJvbGU6ICdzdGF0dXMnLFxuICAgICAgJ2FyaWEtbGl2ZSc6ICdwb2xpdGUnLFxuICAgICAgdGl0bGU6IG1lc3NhZ2UgPyBgSG9sZGluZyBsYXN0IHdvcmtpbmcgcmVuZGVyIOKAlCAke21lc3NhZ2V9YCA6ICdIb2xkaW5nIGxhc3Qgd29ya2luZyByZW5kZXInLFxuICAgIH0sXG4gICAgJ+KPuCBidWlsZCBlcnJvciDigJQgZHLFvsOtbSBwb3NsZWRuw60gZnVua8SNbsOtIHZlcnppJ1xuICApO1xufVxuXG5mdW5jdGlvbiBDYW52YXNIbXJSdW50aW1lKHtcbiAgaW5pdGlhbENhbnZhcyxcbiAgZmlsZSxcbn06IHtcbiAgaW5pdGlhbENhbnZhczogQ29tcG9uZW50VHlwZTtcbiAgZmlsZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufSk6IFJlYWN0Tm9kZSB7XG4gIGNvbnN0IFt7IGNhbnZhcywgYXR0ZW1wdCB9LCBzZXRDYW52YXNTdGF0ZV0gPSB1c2VTdGF0ZSh7IGNhbnZhczogaW5pdGlhbENhbnZhcywgYXR0ZW1wdDogMCB9KTtcbiAgY29uc3QgW2hvbGRpbmcsIHNldEhvbGRpbmdTdGF0ZV0gPSB1c2VTdGF0ZTx7IG9uOiBib29sZWFuOyBtZXNzYWdlPzogc3RyaW5nIH0+KHsgb246IGZhbHNlIH0pO1xuICBjb25zdCBsYXN0R29vZCA9IHVzZVJlZjxDb21wb25lbnRUeXBlIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IGNhbnZhc1JlZiA9IHVzZVJlZihjYW52YXMpO1xuICBjYW52YXNSZWYuY3VycmVudCA9IGNhbnZhcztcblxuICAvLyBQdWJsaXNoIHRoZSBydW50aW1lIEFQSSBmb3IgdGhlIHNoZWxsIEhNUiBjbGllbnQuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgYXBpOiBDYW52YXNSdW50aW1lQXBpID0ge1xuICAgICAgcmVtb3VudDogKG5leHQpID0+IHNldENhbnZhc1N0YXRlKChzKSA9PiAoeyBjYW52YXM6IG5leHQsIGF0dGVtcHQ6IHMuYXR0ZW1wdCArIDEgfSkpLFxuICAgICAgc2V0SG9sZGluZzogKG9uLCBtZXNzYWdlKSA9PiBzZXRIb2xkaW5nU3RhdGUob24gPyB7IG9uOiB0cnVlLCBtZXNzYWdlIH0gOiB7IG9uOiBmYWxzZSB9KSxcbiAgICB9O1xuICAgICh3aW5kb3cgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbUlVOVElNRV9LRVldID0gYXBpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAod2luZG93IGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW1JVTlRJTUVfS0VZXSA9IHVuZGVmaW5lZDtcbiAgICB9O1xuICB9LCBbXSk7XG5cbiAgY29uc3QgaGFuZGxlT2sgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgbGFzdEdvb2QuY3VycmVudCA9IGNhbnZhc1JlZi5jdXJyZW50O1xuICAgIC8vIFRoZSBuZXcgY2FudmFzIHJlbmRlcmVkIGNsZWFuIOKGkiBkcm9wIGFueSBob2xkaW5nIHN0YXRlLlxuICAgIHNldEhvbGRpbmdTdGF0ZSgoaCkgPT4gKGgub24gPyB7IG9uOiBmYWxzZSB9IDogaCkpO1xuICB9LCBbXSk7XG5cbiAgY29uc3QgaGFuZGxlRXJyb3IgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0SG9sZGluZ1N0YXRlKHsgb246IHRydWUsIG1lc3NhZ2U6ICdyZW5kZXIgZXJyb3InIH0pO1xuICB9LCBbXSk7XG5cbiAgY29uc3QgZmFsbGJhY2sgPSB1c2VDYWxsYmFjaygoKTogUmVhY3ROb2RlID0+IHtcbiAgICBjb25zdCBMRyA9IGxhc3RHb29kLmN1cnJlbnQ7XG4gICAgcmV0dXJuIExHID8gYnVpbGRDYW52YXNUcmVlKExHLCBmaWxlKSA6IG51bGw7XG4gIH0sIFtmaWxlXSk7XG5cbiAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoXG4gICAgRnJhZ21lbnQsXG4gICAgbnVsbCxcbiAgICBjcmVhdGVFbGVtZW50KFxuICAgICAgQ2FudmFzRXJyb3JCb3VuZGFyeSxcbiAgICAgIHsgYXR0ZW1wdCwgb25FcnJvcjogaGFuZGxlRXJyb3IsIGZhbGxiYWNrIH0sXG4gICAgICAvLyBrZXk9YXR0ZW1wdCDihpIgZWFjaCBzb2Z0LXJlbG9hZCByZW1vdW50cyBhIGZyZXNoIHN1YnRyZWUgKGFuZCByZXNldHMgdGhlXG4gICAgICAvLyBib3VuZGFyeSdzIGNoaWxkKSwgbWF0Y2hpbmcgdGhlIGNsZWFuLXNsYXRlIHNlbWFudGljcyBvZiBhIGZ1bGwgcmVsb2FkLlxuICAgICAgY3JlYXRlRWxlbWVudChPa1NpZ25hbCwgeyBrZXk6IGF0dGVtcHQsIENhbnZhczogY2FudmFzLCBmaWxlLCBvbk9rOiBoYW5kbGVPayB9KVxuICAgICksXG4gICAgaG9sZGluZy5vbiA/IGNyZWF0ZUVsZW1lbnQoSG1ySG9sZGluZ1RvYXN0LCB7IG1lc3NhZ2U6IGhvbGRpbmcubWVzc2FnZSB9KSA6IG51bGxcbiAgKTtcbn1cbiIsCiAgICAiLyoqXG4gKiBAZmlsZSAgICAgICBjb21tZW50cy1vdmVybGF5LnRzeCDigJQgRmlnSmFtLXN0eWxlIGluLXBsYWNlIGNvbW1lbnRzIG92ZXJsYXlcbiAqIEBzY29wZSAgICAgIGFwcHMvc3R1ZGlvL2NvbW1lbnRzLW92ZXJsYXkudHN4XG4gKiBAcHVycG9zZSAgICBSZW5kZXJzIERTLXN0eWxlZCBjb21tZW50IHBpbnMgKFBoYXNlIDYgVGFzayAyKSwgdGhlIGluLXBsYWNlXG4gKiAgICAgICAgICAgICBjb21wb3NlciBidWJibGUgKFRhc2sgMyksIGFuZCB0aGUgdGhyZWFkIHBvcG92ZXIgKFRhc2sgNClcbiAqICAgICAgICAgICAgIGluc2lkZSB0aGUgY2FudmFzIGlmcmFtZS4gU2libGluZyB0byBgYW5ub3RhdGlvbnMtbGF5ZXJgIOKAlFxuICogICAgICAgICAgICAgcG9ydGFscyBpbnRvIGAuZGMtd29ybGRgIHNvIENTUyB6b29tICsgdHJhbnNsYXRlIG9uIHRoZSB3b3JsZFxuICogICAgICAgICAgICAgcGxhbmUgc2NhbGUgZXZlcnkgcGluL3BvcG92ZXIgdW5pZm9ybWx5IHdpdGggdGhlIGFydGJvYXJkcy5cbiAqXG4gKiBEYXRhIGZsb3cgKFBoYXNlIDYgVGFzayAyIOKAlCBwaW5zIG9ubHk7IGNvbXBvc2VyICsgdGhyZWFkIGxhbmQgaW4gVGFzayAzLzQpOlxuICogICAxLiBTaGVsbCAoYGNsaWVudC9hcHAuanN4YCkgcHVzaGVzIGB7IGRnbjogJ2NvbW1lbnRzLXNldCcsIGNvbW1lbnRzIH1gXG4gKiAgICAgIGludG8gdGhlIGlmcmFtZSB3aGVuZXZlciBpdHMgYGNvbW1lbnRzQnlGaWxlW2FjdGl2ZVBhdGhdYCBjaGFuZ2VzLlxuICogICAyLiBPdmVybGF5IGFsc28gZmV0Y2hlcyBgL19jb21tZW50cz9maWxlPS4uLmAgb24gbW91bnQgYXMgYSBzZWxmLWhlYWwg4oCUXG4gKiAgICAgIGxldHMgdGhlIG92ZXJsYXkgcmVuZGVyIGV2ZW4gaWYgdGhlIHNoZWxsIGhhc24ndCBicm9hZGNhc3QgeWV0XG4gKiAgICAgIChyYWNlIG9uIGZpcnN0IGlmcmFtZSBsb2FkKS5cbiAqICAgMy4gU2hlbGwgcHVzaGVzIGB7IGRnbjogJ2NvbW1lbnQtZm9jdXMnLCBpZCB9YCB3aGVuIHRoZSB1c2VyIGNsaWNrcyBhIHJvd1xuICogICAgICBpbiB0aGUgY29tbWVudHMgcGFuZWwg4oCUIG92ZXJsYXkgaGlnaGxpZ2h0cyB0aGUgbWF0Y2hpbmcgcGluLlxuICogICA0LiBPdmVybGF5IHBvc3RzIGB7IGRnbjogJ2NvbW1lbnQtY2xpY2snLCBpZCB9YCBiYWNrIHRvIHRoZSBzaGVsbCB3aGVuXG4gKiAgICAgIHRoZSB1c2VyIGNsaWNrcyBhIHBpbiDigJQgc2FtZSBjaGFubmVsIHRoZSBsZWdhY3kgYGRnbi1waW5gIG92ZXJsYXlcbiAqICAgICAgdXNlZDsgdGhlIHNoZWxsIGFscmVhZHkgcm91dGVzIGl0IHRvIGBzZXRGb2N1c2VkQ29tbWVudElkYC5cbiAqXG4gKiBGaWx0ZXIgcmVzcGVjdCDigJQgUGhhc2UgNiBUYXNrIDIgZGVmYXVsdCBpcyBcImhpZGUgcmVzb2x2ZWRcIi4gVGhlIHNoZWxsIHdpbGxcbiAqIGdhaW4gYSBgY29tbWVudHMtZmlsdGVyYCBjaGFubmVsIGluIFRhc2sgNjsgdW50aWwgdGhlbiB0aGUgb3ZlcmxheSBhbHdheXNcbiAqIGhpZGVzIHJlc29sdmVkIHBpbnMuIFBsYW4tYWxpZ25lZC5cbiAqXG4gKiBQaW4gcG9zaXRpb24gbWF0aCDigJQgc2VlIGBvZmZzZXRXaXRoaW5Xb3JsZGAgYmVsb3cuIFdlIHdhbGsgb2Zmc2V0UGFyZW50IHVwXG4gKiB0byBgLmRjLXdvcmxkYCB0byBnZXQgcHJlLXpvb20gd29ybGQgY29vcmRzIGRpcmVjdGx5OyBDU1Mgem9vbSBvbiB0aGUgd29ybGRcbiAqIHBsYW5lIHRoZW4gcmVuZGVycyB0aGUgcGluIGF0IHRoZSByaWdodCBzY2FsZSB3aXRob3V0IHVzIGRvaW5nIHpvb20gbWF0aC5cbiAqXG4gKiBUaGUgbGVnYWN5IHZhbmlsbGEtSlMgYCNkZ24tcGluLWxheWVyYCBpbmplY3RlZCBieSBgaW5zcGVjdC50c2AgaXMgaGlkZGVuXG4gKiBvbiBtb3VudCB0byBhdm9pZCBkb3VibGUtcGlucyBpbnNpZGUgVFNYIGNhbnZhc2VzLiBUaGUgbGVnYWN5IGxheWVyIHN0aWxsXG4gKiByZW5kZXJzIGZvciBgLmh0bWxgIG1vY2tzIHdoZXJlIHRoaXMgUmVhY3Qgb3ZlcmxheSBuZXZlciBtb3VudHMuXG4gKi9cblxuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgdXNlQ29sbGFiIH0gZnJvbSAnLi91c2UtY29sbGFiLnRzeCc7XG5pbXBvcnQgeyB1c2VTZWxlY3Rpb25TZXRPcHRpb25hbCB9IGZyb20gJy4vdXNlLXNlbGVjdGlvbi1zZXQudHN4JztcblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBUeXBlcyDigJQga2VwdCBpbiBzeW5jIHdpdGggYENvbW1lbnRgIGluIGBhcGkudHNgLiBXZSBtaXJyb3IgdGhlIHNoYXBlIHJhdGhlclxuLy8gdGhhbiBpbXBvcnQgdG8gYXZvaWQgcHVsbGluZyBzZXJ2ZXIgdHlwZXMgaW50byB0aGUgY2FudmFzIHJ1bnRpbWUgYnVuZGxlLlxuXG5pbnRlcmZhY2UgT3ZlcmxheUJvdW5kcyB7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xuICB3OiBudW1iZXI7XG4gIGg6IG51bWJlcjtcbn1cblxuLy8gU2VsZWN0aW9uIHBheWxvYWQgcG9zdGVkIGJ5IGNhbnZhcy1zaGVsbCdzIGBvbkRyb3BDb21tZW50YC4gTWlycm9ycyB0aGVcbi8vIHNoYXBlIGBob3ZlclRhcmdldFRvU2VsZWN0aW9uYCByZXR1cm5zOyB3ZSBrZWVwIGl0IGxvb3NlIHNvIHRoZSBvdmVybGF5XG4vLyBkb2Vzbid0IGRlcGVuZCBvbiBjYW52YXMtc2hlbGwgdHlwZXMuXG5pbnRlcmZhY2UgQ29tcG9zZVNlbGVjdGlvbiB7XG4gIGZpbGU/OiBzdHJpbmc7XG4gIGlkPzogc3RyaW5nO1xuICBzZWxlY3Rvcjogc3RyaW5nO1xuICBhcnRib2FyZElkPzogc3RyaW5nIHwgbnVsbDtcbiAgdGFnOiBzdHJpbmc7XG4gIGNsYXNzZXM6IHN0cmluZztcbiAgdGV4dDogc3RyaW5nO1xuICBkb21fcGF0aDogc3RyaW5nW107XG4gIGJvdW5kczogT3ZlcmxheUJvdW5kcyB8IG51bGw7XG4gIGh0bWw6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIENvbXBvc2VyU3RhdGUge1xuICBzZWxlY3Rpb246IENvbXBvc2VTZWxlY3Rpb247XG4gIGNsaWVudFg6IG51bWJlcjtcbiAgY2xpZW50WTogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgT3ZlcmxheVJlcGx5IHtcbiAgaWQ6IHN0cmluZztcbiAgYXV0aG9yOiBzdHJpbmc7XG4gIGJvZHk6IHN0cmluZztcbiAgY3JlYXRlZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJsYXlDb21tZW50IHtcbiAgaWQ6IHN0cmluZztcbiAgZmlsZTogc3RyaW5nO1xuICBzZWxlY3Rvcjogc3RyaW5nO1xuICAvKiogT2NjdXJyZW5jZSBpbmRleCBhbW9uZyBgcXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcilgIOKAlCBkaXNhbWJpZ3VhdGVzIGFcbiAgICogY29tcG9uZW50IHJlcGVhdGVkIHdpdGhpbiBvbmUgYXJ0Ym9hcmQuIEFic2VudCAob2xkIGNvbW1lbnRzKSDihpIgZmlyc3QuICovXG4gIGluZGV4PzogbnVtYmVyO1xuICBib3VuZHM6IE92ZXJsYXlCb3VuZHMgfCBudWxsO1xuICB0ZXh0OiBzdHJpbmc7XG4gIHN0YXR1czogJ29wZW4nIHwgJ3Jlc29sdmVkJztcbiAgY3JlYXRlZDogc3RyaW5nO1xuICByZXNvbHZlZF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgYXV0aG9yPzogc3RyaW5nO1xuICB0aHJlYWQ/OiBPdmVybGF5UmVwbHlbXTtcbiAgbWVudGlvbnM/OiBzdHJpbmdbXTtcbiAgLy8gZG9tX3BhdGggLyB0YWcgLyBjbGFzc2VzIC8gaHRtbF9leGNlcnB0IHVudXNlZCBhdCBvdmVybGF5IGxheWVyOyBrZXB0IG9mZlxuICAvLyB0aGUgdHlwZSB0byBrZWVwIHRoZSBzdXJmYWNlIHRpZ2h0LlxufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIENTUyBsb2FkIOKAlCBzaWJsaW5nIHN0eWxlc2hlZXQsIGZldGNoZWQgb25jZSBwZXIgc2Vzc2lvbiB2aWEgYSA8bGluaz4gdGFnLlxuLy8gSW5saW5pbmcgdGhlIGZpbGUgYXQgYnVpbGQgdGltZSB3b3VsZCBjb3N0IGFuIGV4dHJhIGJ1bmRsZXIgY29uZmlnOyB0aGVcbi8vIG92ZXJsYXkgaXMgaW50ZXJuYWwtb25seSBzbyBhIHJ1bnRpbWUgPGxpbms+IGlzIGZpbmUuXG5cbmNvbnN0IENTU19IUkVGID0gJy9fY2xpZW50L2NvbW1lbnRzLW92ZXJsYXkuY3NzJztcblxuZnVuY3Rpb24gZW5zdXJlT3ZlcmxheVN0eWxlcygpOiB2b2lkIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcbiAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbS1vdmVybGF5LWNzcycpKSByZXR1cm47XG4gIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gIGxpbmsuaWQgPSAnY20tb3ZlcmxheS1jc3MnO1xuICBsaW5rLnJlbCA9ICdzdHlsZXNoZWV0JztcbiAgbGluay5ocmVmID0gQ1NTX0hSRUY7XG4gIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobGluayk7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gRmlsZSBkZXJpdmF0aW9uIOKAlCBzYW1lIGxvZ2ljIGFzIGNhbnZhcy1zaGVsbC50c3g6OmRlcml2ZUZpbGUoKS4gRHVwbGljYXRlZFxuLy8gaGVyZSBzbyB0aGUgb3ZlcmxheSBjYW4gZmV0Y2ggaXRzIG93biBjb21tZW50cyBvbiBtb3VudCB3aXRob3V0IGltcG9ydGluZ1xuLy8gZnJvbSBjYW52YXMtc2hlbGwgKHdoaWNoIHdvdWxkIGNyZWF0ZSBhIGN5Y2xlKS5cblxuZnVuY3Rpb24gZGVyaXZlRmlsZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm4gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCBwID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIGlmIChwID09PSAnL19jYW52YXMtc2hlbGwuaHRtbCcgfHwgcCA9PT0gJy9fY2FudmFzLXNoZWxsJykge1xuICAgICAgY29uc3QgcXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuICAgICAgY29uc3QgY2FudmFzID0gcXMuZ2V0KCdjYW52YXMnKSA/PyAnJztcbiAgICAgIGNvbnN0IGRlc2lnblJlbCA9IChxcy5nZXQoJ2Rlc2lnblJlbCcpID8/ICcuZGVzaWduJykucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgJycpO1xuICAgICAgcmV0dXJuIGNhbnZhcyA/IGAke2Rlc2lnblJlbH0vJHtjYW52YXN9YCA6IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQocCkucmVwbGFjZSgvXlxcLy8sICcnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBQb3NpdGlvbiByZXNvbHZlcnMg4oCUIHNjcmVlbiBjb29yZHMgdmlhIGdldEJvdW5kaW5nQ2xpZW50UmVjdC4gTWlycm9ycyB0aGVcbi8vIGBTZWxlY3Rpb25IYWxvc2AgLyBgSG92ZXJIYWxvYCBwYXR0ZXJuIGluIGNhbnZhcy1zaGVsbC50c3ggc28gdGhlIGNvbW1lbnRzXG4vLyBsYXllciBjYW4gcmVuZGVyIGFzIGEgZml4ZWQtcG9zaXRpb24gc2libGluZyBvZiBgLmRjLWNhbnZhc2AgKGFib3ZlIHRoZVxuLy8gaGFsbyBjaHJvbWUgYXQgei1pbmRleCA1KSBpbnN0ZWFkIG9mIGJlaW5nIHBvcnRhbGVkIGludG8gYC5kYy13b3JsZGAgd2hlcmVcbi8vIGl0IHdvdWxkIGxvc2UgdGhlIHN0YWNraW5nIGJhdHRsZS5cblxuZnVuY3Rpb24gc2NyZWVuUmVjdEZvcihcbiAgc2VsZWN0b3I6IHN0cmluZyxcbiAgaW5kZXg/OiBudW1iZXJcbik6IHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG4gIHc6IG51bWJlcjtcbiAgaDogbnVtYmVyO1xufSB8IG51bGwge1xuICBpZiAoIXNlbGVjdG9yKSByZXR1cm4gbnVsbDtcbiAgbGV0IGVsOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICB0cnkge1xuICAgIC8vIGluZGV4IGRpc2FtYmlndWF0ZXMgYSBjb21wb25lbnQgcmVwZWF0ZWQgd2l0aGluIG9uZSBhcnRib2FyZCAocXVlcnlTZWxlY3RvclxuICAgIC8vIGFsb25lIHdvdWxkIGFsd2F5cyBncmFiIHRoZSBmaXJzdCBtYXRjaCkuIEFic2VudC8wIOKGkiBmaXJzdC5cbiAgICBjb25zdCBhbGwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgICBjb25zdCBpID0gaW5kZXggJiYgaW5kZXggPiAwICYmIGluZGV4IDwgYWxsLmxlbmd0aCA/IGluZGV4IDogMDtcbiAgICBlbCA9IChhbGxbaV0gPz8gYWxsWzBdID8/IG51bGwpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKCFlbD8uaXNDb25uZWN0ZWQpIHJldHVybiBudWxsO1xuICBjb25zdCByID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIGlmIChyLndpZHRoID09PSAwICYmIHIuaGVpZ2h0ID09PSAwKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIHsgeDogci5sZWZ0LCB5OiByLnRvcCwgdzogci53aWR0aCwgaDogci5oZWlnaHQgfTtcbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBQdWJsaWMgY29tcG9uZW50IOKAlCBtb3VudGVkIGZyb20gY2FudmFzLXNoZWxsLnRzeCBhbG9uZ3NpZGUgVG9vbFBhbGV0dGUgL1xuLy8gQW5ub3RhdGlvbnNMYXllciAvIFNuYXBHdWlkZU92ZXJsYXkuXG5cbmV4cG9ydCBmdW5jdGlvbiBDb21tZW50c092ZXJsYXkoKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgZW5zdXJlT3ZlcmxheVN0eWxlcygpO1xuXG4gIC8vIE9wdGlvbmFsIOKAlCBDb21tZW50c092ZXJsYXkgaXMgbW91bnRlZCBpbnNpZGUgU2VsZWN0aW9uU2V0UHJvdmlkZXIgaW4gdGhlXG4gIC8vIHN0YW5kYXJkIENhbnZhc1NoZWxsIHRyZWUsIGJ1dCBzdGF5cyB1c2FibGUgaWYgYSBob3N0IGV2ZXIgZW1iZWRzIGl0XG4gIC8vIG91dHNpZGUgdGhhdCBwcm92aWRlciAocmV0dXJucyBudWxsIGluc3RlYWQgb2YgdGhyb3dpbmcpLlxuICBjb25zdCBzZWxTZXQgPSB1c2VTZWxlY3Rpb25TZXRPcHRpb25hbCgpO1xuICBjb25zdCBbY29tbWVudHMsIHNldENvbW1lbnRzXSA9IHVzZVN0YXRlPE92ZXJsYXlDb21tZW50W10+KFtdKTtcbiAgY29uc3QgW2ZvY3VzZWRJZCwgc2V0Rm9jdXNlZElkXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbY29tcG9zZXIsIHNldENvbXBvc2VyXSA9IHVzZVN0YXRlPENvbXBvc2VyU3RhdGUgfCBudWxsPihudWxsKTtcbiAgY29uc3QgZmlsZSA9IHVzZU1lbW8oKCkgPT4gZGVyaXZlRmlsZSgpLCBbXSk7XG5cbiAgLy8gRHJvcCB0aGUgbGVnYWN5IGAjZGduLXBpbi1sYXllcmAgc28gd2UgZG9uJ3QgcmVuZGVyIGR1cGxpY2F0ZSBwaW5zIGluc2lkZVxuICAvLyBUU1ggY2FudmFzZXMuIFRoZSBsYXllciBzaGlwcyBpbiBldmVyeSBzZXJ2ZWQgSFRNTCBwYWdlIHZpYSBpbnNwZWN0LnRzO1xuICAvLyBmb3IgYC5odG1sYCBtb2NrcyAobm8gY2FudmFzLXNoZWxsIG1vdW50KSBpdCBzdGlsbCBkb2VzIGl0cyBqb2IuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcbiAgICBjb25zdCBsZWdhY3kgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGduLXBpbi1sYXllcicpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAoIWxlZ2FjeSkgcmV0dXJuO1xuICAgIGNvbnN0IHByZXYgPSBsZWdhY3kuc3R5bGUuZGlzcGxheTtcbiAgICBsZWdhY3kuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgbGVnYWN5LnN0eWxlLmRpc3BsYXkgPSBwcmV2O1xuICAgIH07XG4gIH0sIFtdKTtcblxuICAvLyBNaXJyb3IgYSBjb21tZW50IGludG8gdGhlIGNhbnZhcyBzZWxlY3Rpb24gc2V0IHNvIFNlbGVjdGlvbkhhbG9zIHBhaW50c1xuICAvLyB0aGUgc2FtZSBoYWxvIENtZC1jbGljayB3b3VsZC4gQ2FsbGVkIGZyb20gYm90aCB0aGUgaW4taWZyYW1lIHBpbiBjbGlja1xuICAvLyBBTkQgdGhlIGluYm91bmQgYGNvbW1lbnQtZm9jdXNgIHBvc3RNZXNzYWdlIHNvIGp1bXBpbmcgZnJvbSB0aGUgc2hlbGwnc1xuICAvLyBDb21tZW50cyBwYW5lbCBwcm9kdWNlcyB0aGUgc2FtZSB2aXN1YWwgZmVlZGJhY2sgYXMgY2xpY2tpbmcgdGhlIHBpbi5cbiAgY29uc3QgbWlycm9yU2VsZWN0aW9uID0gdXNlQ2FsbGJhY2soXG4gICAgKGNvbW1lbnQ6IE92ZXJsYXlDb21tZW50IHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICBpZiAoIXNlbFNldCkgcmV0dXJuO1xuICAgICAgaWYgKCFjb21tZW50Py5zZWxlY3Rvcikge1xuICAgICAgICBzZWxTZXQuY2xlYXIoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgY2RNYXRjaCA9IGNvbW1lbnQuc2VsZWN0b3IubWF0Y2goL2RhdGEtY2QtaWQ9XCIoW15cIl0rKVwiLyk7XG4gICAgICBjb25zdCBjZElkID0gY2RNYXRjaCA/IGNkTWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG4gICAgICBsZXQgdGFnOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgY2xhc3Nlczogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGNvbW1lbnQuc2VsZWN0b3IpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICAgICAgaWYgKGVsKSB7XG4gICAgICAgICAgdGFnID0gZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIGNsYXNzZXMgPSAoZWwuZ2V0QXR0cmlidXRlKCdjbGFzcycpID8/ICcnKVxuICAgICAgICAgICAgLnNwbGl0KC9cXHMrLylcbiAgICAgICAgICAgIC5maWx0ZXIoKGNscykgPT4gY2xzICYmICFjbHMuc3RhcnRzV2l0aCgnZGduLScpICYmICFjbHMuc3RhcnRzV2l0aCgnZGMtY3YtJykpXG4gICAgICAgICAgICAuam9pbignICcpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogdW5yZXNvbHZhYmxlIHNlbGVjdG9yIOKAlCBmYWxsIHRocm91Z2ggd2l0aCBubyBmcmVzaCBtZXRhZGF0YSAqL1xuICAgICAgfVxuICAgICAgc2VsU2V0LnJlcGxhY2Uoe1xuICAgICAgICBmaWxlOiBmaWxlID8/IHVuZGVmaW5lZCxcbiAgICAgICAgaWQ6IGNkSWQsXG4gICAgICAgIHNlbGVjdG9yOiBjb21tZW50LnNlbGVjdG9yLFxuICAgICAgICB0YWcsXG4gICAgICAgIGNsYXNzZXMsXG4gICAgICAgIGJvdW5kczogY29tbWVudC5ib3VuZHMgPz8gdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBbc2VsU2V0LCBmaWxlXVxuICApO1xuXG4gIC8vIEtlZXAgdGhlIGxhdGVzdCBjb21tZW50cyBsaXN0IHJlYWNoYWJsZSBmcm9tIHRoZSBtZXNzYWdlIGhhbmRsZXIgd2l0aG91dFxuICAvLyByZS1hdHRhY2hpbmcgdGhlIGxpc3RlbmVyIG9uIGV2ZXJ5IGNvbW1lbnRzIG11dGF0aW9uLlxuICBjb25zdCBjb21tZW50c1JlZiA9IHVzZVJlZjxPdmVybGF5Q29tbWVudFtdPihjb21tZW50cyk7XG4gIGNvbW1lbnRzUmVmLmN1cnJlbnQgPSBjb21tZW50cztcblxuICAvLyBQaGFzZSA4IFRhc2sgMyDigJQgd2hlbiBhIGNvbGxhYiByb29tIGlzIGNvbm5lY3RlZCwgdGhlIFkuQXJyYXkgb2YgY29tbWVudHNcbiAgLy8gaXMgdGhlIGxpdmUgc291cmNlIG9mIHRydXRoLiBvYnNlcnZlKCkgZmlyZXMgb24gZXZlcnkgcmVtb3RlIG11dGF0aW9uXG4gIC8vIChhZGRlZCBwaW5zIGZyb20gYW5vdGhlciB0YWIsIHJlc29sdmVkLWZyb20taW5zcGVjdG9yIHZpYSB0aGUgcmVnaXN0cnlcbiAgLy8gYnJpZGdlLCBldGMuKSBhbmQgb24gdGhlIGxvY2FsIHNlZWQuIEJvdGggcGF0aHMgY29udmVyZ2Ugb24gdGhlIHNhbWVcbiAgLy8gSlNPTiBwcm9qZWN0aW9uIOKAlCBsYXN0LXdyaXRlLXdpbnMgYmV0d2VlbiBZLkFycmF5IGFuZCBwb3N0TWVzc2FnZSBpc1xuICAvLyBzYWZlIGJlY2F1c2UgdGhleSBjYXJyeSBpZGVudGljYWwgY29udGVudDsgdGhlIFkuQXJyYXkgcGF0aCBqdXN0XG4gIC8vIHJlYWNoZXMgdXMgZmlyc3QgKG5vIDgwMCBtcyBkZWJvdW5jZSBkZWxheSkuXG4gIGNvbnN0IGNvbGxhYiA9IHVzZUNvbGxhYigpO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghY29sbGFiKSByZXR1cm47XG4gICAgY29uc3QgYXJyID0gY29sbGFiLmRvYy5nZXRBcnJheTxPdmVybGF5Q29tbWVudD4oJ2NvbW1lbnRzJyk7XG4gICAgY29uc3Qgc3luYyA9ICgpID0+IHtcbiAgICAgIC8vIHRvQXJyYXkoKSBzbmFwc2hvdCB0aGUgY3VycmVudCBZLkFycmF5IGludG8gYSBwbGFpbiBKUyBsaXN0LlxuICAgICAgc2V0Q29tbWVudHMoYXJyLnRvQXJyYXkoKSBhcyBPdmVybGF5Q29tbWVudFtdKTtcbiAgICB9O1xuICAgIC8vIEluaXRpYWwgZmlsbCDigJQgY292ZXJzIHRoZSBjYXNlIHdoZXJlIFkuRG9jIHdhcyBhbHJlYWR5IHNlZWRlZCBieSB0aGVcbiAgICAvLyB0aW1lIHRoaXMgb3ZlcmxheSBtb3VudGVkLlxuICAgIGlmIChhcnIubGVuZ3RoID4gMCkgc3luYygpO1xuICAgIGFyci5vYnNlcnZlKHN5bmMpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhcnIudW5vYnNlcnZlKHN5bmMpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8qIGRvYyBkZXN0cm95ZWQgYmVmb3JlIHVubW91bnQg4oCUIG9ic2VydmVyIGFscmVhZHkgZ29uZSAqL1xuICAgICAgfVxuICAgIH07XG4gIH0sIFtjb2xsYWJdKTtcblxuICAvLyBMaXN0ZW4gZm9yIHRoZSBzaGVsbCdzIGJyb2FkY2FzdCBjaGFubmVscy4gU2NoZW1hIG1hdGNoZXMgdGhlIGxlZ2FjeVxuICAvLyBvdmVybGF5IHNvIHRoZSBzaGVsbC1zaWRlIGdsdWUgaW4gY2xpZW50L2FwcC5qc3ggKH5saW5lIDE2NzIpIGtlZXBzXG4gIC8vIHdvcmtpbmcgd2l0aG91dCBtb2RpZmljYXRpb24uXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG4gICAgY29uc3Qgb25NZXNzYWdlID0gKGU6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgICAgY29uc3QgbSA9IGUuZGF0YSBhcyB7IGRnbj86IHN0cmluZzsgY29tbWVudHM/OiB1bmtub3duOyBpZD86IHN0cmluZyB9IHwgbnVsbDtcbiAgICAgIGlmICghbSB8fCB0eXBlb2YgbSAhPT0gJ29iamVjdCcgfHwgIW0uZGduKSByZXR1cm47XG4gICAgICBpZiAobS5kZ24gPT09ICdjb21tZW50cy1zZXQnICYmIEFycmF5LmlzQXJyYXkobS5jb21tZW50cykpIHtcbiAgICAgICAgc2V0Q29tbWVudHMobS5jb21tZW50cyBhcyBPdmVybGF5Q29tbWVudFtdKTtcbiAgICAgIH0gZWxzZSBpZiAobS5kZ24gPT09ICdjb21tZW50LWZvY3VzJykge1xuICAgICAgICBjb25zdCBpZCA9IHR5cGVvZiBtLmlkID09PSAnc3RyaW5nJyA/IG0uaWQgOiBudWxsO1xuICAgICAgICBzZXRGb2N1c2VkSWQoaWQpO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBpZCA/IGNvbW1lbnRzUmVmLmN1cnJlbnQuZmluZCgoYykgPT4gYy5pZCA9PT0gaWQpIDogdW5kZWZpbmVkO1xuICAgICAgICBtaXJyb3JTZWxlY3Rpb24odGFyZ2V0KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgb25NZXNzYWdlKTtcbiAgICByZXR1cm4gKCkgPT4gd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBvbk1lc3NhZ2UpO1xuICB9LCBbbWlycm9yU2VsZWN0aW9uXSk7XG5cbiAgLy8gY2FudmFzLXNoZWxsJ3MgYG9uRHJvcENvbW1lbnRgIGRpc3BhdGNoZXMgYGNtOm9wZW4tY29tcG9zZXJgIG9uIHRoZSBpZnJhbWVcbiAgLy8gZG9jdW1lbnQuIE9wZW4gdGhlIGNvbXBvc2VyIHBpbm5lZCB0byB0aGF0IGNsaWNrIHBvaW50LlxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG4gICAgY29uc3Qgb25PcGVuID0gKGU6IEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBkZXRhaWwgPSAoXG4gICAgICAgIGUgYXMgQ3VzdG9tRXZlbnQ8eyBzZWxlY3Rpb24/OiBDb21wb3NlU2VsZWN0aW9uOyBjbGllbnRYPzogbnVtYmVyOyBjbGllbnRZPzogbnVtYmVyIH0+XG4gICAgICApLmRldGFpbDtcbiAgICAgIGlmICghZGV0YWlsPy5zZWxlY3Rpb24pIHJldHVybjtcbiAgICAgIHNldENvbXBvc2VyKHtcbiAgICAgICAgc2VsZWN0aW9uOiBkZXRhaWwuc2VsZWN0aW9uLFxuICAgICAgICBjbGllbnRYOiB0eXBlb2YgZGV0YWlsLmNsaWVudFggPT09ICdudW1iZXInID8gZGV0YWlsLmNsaWVudFggOiAwLFxuICAgICAgICBjbGllbnRZOiB0eXBlb2YgZGV0YWlsLmNsaWVudFkgPT09ICdudW1iZXInID8gZGV0YWlsLmNsaWVudFkgOiAwLFxuICAgICAgfSk7XG4gICAgfTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbTpvcGVuLWNvbXBvc2VyJywgb25PcGVuKTtcbiAgICByZXR1cm4gKCkgPT4gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY206b3Blbi1jb21wb3NlcicsIG9uT3Blbik7XG4gIH0sIFtdKTtcblxuICBjb25zdCBjbG9zZUNvbXBvc2VyID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldENvbXBvc2VyKG51bGwpO1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKHsgZGduOiAnZm9yY2UtY2xlYXInIH0sICcqJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvKiBwYXJlbnQgZGV0YWNoZWQgKi9cbiAgICB9XG4gIH0sIFtdKTtcblxuICBjb25zdCBzdWJtaXRDb21wb3NlciA9IHVzZUNhbGxiYWNrKFxuICAgICh0ZXh0OiBzdHJpbmcpID0+IHtcbiAgICAgIGlmICghY29tcG9zZXIpIHJldHVybjtcbiAgICAgIGNvbnN0IHNlbCA9IGNvbXBvc2VyLnNlbGVjdGlvbjtcbiAgICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICAgIGZpbGU6IHNlbC5maWxlLFxuICAgICAgICBzZWxlY3Rvcjogc2VsLnNlbGVjdG9yLFxuICAgICAgICBpbmRleDogc2VsLmluZGV4LFxuICAgICAgICBkb21fcGF0aDogc2VsLmRvbV9wYXRoLFxuICAgICAgICB0YWc6IHNlbC50YWcsXG4gICAgICAgIGNsYXNzZXM6IHNlbC5jbGFzc2VzLFxuICAgICAgICBib3VuZHM6IHNlbC5ib3VuZHMsXG4gICAgICAgIGh0bWxfZXhjZXJwdDogc2VsLmh0bWwsXG4gICAgICAgIHRleHQsXG4gICAgICB9O1xuICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG4gICAgICAvLyBTaGVsbCByZWxheXMgaW50byB0aGUgV1MgYGNvbW1lbnRzLWFkZGAgY2hhbm5lbCBhbmQgcGVyc2lzdHMuXG4gICAgICB0cnkge1xuICAgICAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKHsgZGduOiAnY29tbWVudC1zdWJtaXQnLCBwYXlsb2FkIH0sICcqJyk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogcGFyZW50IGRldGFjaGVkICovXG4gICAgICB9XG4gICAgICBjbG9zZUNvbXBvc2VyKCk7XG4gICAgfSxcbiAgICBbY29tcG9zZXIsIGNsb3NlQ29tcG9zZXJdXG4gICk7XG5cbiAgLy8gU2VsZi1oZWFsIGZldGNoIOKAlCBjb3ZlcnMgdGhlIHJhY2Ugd2hlcmUgdGhlIGlmcmFtZSBsb2FkcyBiZWZvcmUgdGhlIHNoZWxsXG4gIC8vIHB1c2hlcyBgY29tbWVudHMtc2V0YCAoZS5nLiBmaXJzdCBoeWRyYXRpb24gb24gY29sZCBvcGVuKS5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWZpbGUpIHJldHVybjtcbiAgICBsZXQgY2FuY2VsbGVkID0gZmFsc2U7XG4gICAgKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCBmZXRjaChgL19jb21tZW50cz9maWxlPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGZpbGUpfWApO1xuICAgICAgICBpZiAoIXIub2spIHJldHVybjtcbiAgICAgICAgY29uc3QgZGF0YSA9IChhd2FpdCByLmpzb24oKSkgYXMgeyBjb21tZW50cz86IE92ZXJsYXlDb21tZW50W10gfTtcbiAgICAgICAgaWYgKGNhbmNlbGxlZCkgcmV0dXJuO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhLmNvbW1lbnRzKSkge1xuICAgICAgICAgIC8vIE9ubHkgc2V0IHdoZW4gd2UgaGF2ZW4ndCByZWNlaXZlZCBhIHNoZWxsIGJyb2FkY2FzdCB5ZXQ7IHRoZVxuICAgICAgICAgIC8vIHNoZWxsIGlzIGF1dGhvcml0YXRpdmUgb25jZSBpdCBraWNrcyBpbi5cbiAgICAgICAgICBzZXRDb21tZW50cygocHJldikgPT4gKHByZXYubGVuZ3RoID09PSAwID8gKGRhdGEuY29tbWVudHMgPz8gW10pIDogcHJldikpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogb2ZmbGluZSAvIGRldi1zZXJ2ZXIgcmVzdGFydCDigJQgc2lsZW50bHkgbm8tb3AgKi9cbiAgICAgIH1cbiAgICB9KSgpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjYW5jZWxsZWQgPSB0cnVlO1xuICAgIH07XG4gIH0sIFtmaWxlXSk7XG5cbiAgLy8gU29ydGVkIGJ5IGBjcmVhdGVkYCBhc2Mgc28gc2VxdWVuY2UgbnVtYmVycyBhcmUgc3RhYmxlIHBlciBjYW52YXMgYWNyb3NzXG4gIC8vIHJlbG9hZHMuIFJlc29sdmVkIGNvbW1lbnRzIGFyZSBoaWRkZW4gYnkgZGVmYXVsdCAoVGFzayAyIHNwZWMpLlxuICBjb25zdCB2aXNpYmxlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgbGlzdCA9IGNvbW1lbnRzLnNsaWNlKCkuc29ydCgoYSwgYikgPT4gYS5jcmVhdGVkLmxvY2FsZUNvbXBhcmUoYi5jcmVhdGVkKSk7XG4gICAgcmV0dXJuIGxpc3QuZmlsdGVyKChjKSA9PiBjLnN0YXR1cyAhPT0gJ3Jlc29sdmVkJyk7XG4gIH0sIFtjb21tZW50c10pO1xuXG4gIC8vIFNlcXVlbmNlIGluZGV4IGxvb2t1cCDigJQgYnVpbHQgb2ZmIHRoZSBGVUxMIHNvcnRlZCBsaXN0IHNvIGEgcmVzb2x2ZWQtdGhlbi1cbiAgLy8gcmVvcGVuZWQgcGluIGtlZXBzIGl0cyBvcmlnaW5hbCBudW1iZXIuXG4gIGNvbnN0IGluZGV4QnlJZCA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IG0gPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIGNvbnN0IGFsbCA9IGNvbW1lbnRzLnNsaWNlKCkuc29ydCgoYSwgYikgPT4gYS5jcmVhdGVkLmxvY2FsZUNvbXBhcmUoYi5jcmVhdGVkKSk7XG4gICAgYWxsLmZvckVhY2goKGMsIGkpID0+IHtcbiAgICAgIG0uc2V0KGMuaWQsIGkgKyAxKTtcbiAgICB9KTtcbiAgICByZXR1cm4gbTtcbiAgfSwgW2NvbW1lbnRzXSk7XG5cbiAgY29uc3QgaGFuZGxlUGluQ2xpY2sgPSB1c2VDYWxsYmFjayhcbiAgICAoaWQ6IHN0cmluZykgPT4ge1xuICAgICAgc2V0Rm9jdXNlZElkKGlkKTtcbiAgICAgIG1pcnJvclNlbGVjdGlvbihjb21tZW50cy5maW5kKChjKSA9PiBjLmlkID09PSBpZCkpO1xuICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG4gICAgICB0cnkge1xuICAgICAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKHsgZGduOiAnY29tbWVudC1jbGljaycsIGlkIH0sICcqJyk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogcGFyZW50IGRldGFjaGVkICovXG4gICAgICB9XG4gICAgfSxcbiAgICBbY29tbWVudHMsIG1pcnJvclNlbGVjdGlvbl1cbiAgKTtcblxuICBjb25zdCBoYW5kbGVQYXRjaCA9IHVzZUNhbGxiYWNrKChpZDogc3RyaW5nLCBwYXRjaDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZSh7IGRnbjogJ2NvbW1lbnQtcGF0Y2gnLCBpZCwgcGF0Y2ggfSwgJyonKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8qIHBhcmVudCBkZXRhY2hlZCAqL1xuICAgIH1cbiAgfSwgW10pO1xuXG4gIGNvbnN0IGhhbmRsZURlbGV0ZSA9IHVzZUNhbGxiYWNrKChpZDogc3RyaW5nKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UoeyBkZ246ICdjb21tZW50LWRlbGV0ZScsIGlkIH0sICcqJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvKiBwYXJlbnQgZGV0YWNoZWQgKi9cbiAgICB9XG4gICAgc2V0Rm9jdXNlZElkKChwcmV2KSA9PiAocHJldiA9PT0gaWQgPyBudWxsIDogcHJldikpO1xuICB9LCBbXSk7XG5cbiAgY29uc3QgaGFuZGxlUmVwbHkgPSB1c2VDYWxsYmFjayhhc3luYyAoaWQ6IHN0cmluZywgYm9keTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgaWYgKHR5cGVvZiBmZXRjaCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgciA9IGF3YWl0IGZldGNoKGAvX2FwaS9jb21tZW50cy8ke2VuY29kZVVSSUNvbXBvbmVudChpZCl9L3JlcGx5YCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYm9keSB9KSxcbiAgICAgIH0pO1xuICAgICAgaWYgKCFyLm9rKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCB1cGRhdGVkID0gKGF3YWl0IHIuanNvbigpKSBhcyBPdmVybGF5Q29tbWVudDtcbiAgICAgIC8vIE9wdGltaXN0aWMgbG9jYWwgbWVyZ2Ug4oCUIHRoZSBzaGVsbCB3aWxsIGJyb2FkY2FzdCBgY29tbWVudHMtc2V0YFxuICAgICAgLy8gc2hvcnRseSBhZnRlciBhcyB0aGUgV1MgZmFucyBvdXQgdGhlIGNoYW5nZSwgYnV0IGFwcGx5aW5nIGl0IG5vd1xuICAgICAgLy8gYXZvaWRzIHRoZSBwb3BvdmVyIGZsaWNrZXJpbmcgZW1wdHkgYmV0d2VlbiBzdWJtaXQgKyBicm9hZGNhc3QuXG4gICAgICBzZXRDb21tZW50cygocHJldikgPT4gcHJldi5tYXAoKGMpID0+IChjLmlkID09PSB1cGRhdGVkLmlkID8gdXBkYXRlZCA6IGMpKSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sIFtdKTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiY20tbGF5ZXJcIiBhcmlhLWhpZGRlbj17ZmFsc2V9PlxuICAgICAge3Zpc2libGUubWFwKChjKSA9PiB7XG4gICAgICAgIGNvbnN0IG4gPSBpbmRleEJ5SWQuZ2V0KGMuaWQpID8/IDA7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPENvbW1lbnRQaW5cbiAgICAgICAgICAgIGtleT17Yy5pZH1cbiAgICAgICAgICAgIGNvbW1lbnQ9e2N9XG4gICAgICAgICAgICBzZXF1ZW5jZT17bn1cbiAgICAgICAgICAgIGZvY3VzZWQ9e2ZvY3VzZWRJZCA9PT0gYy5pZH1cbiAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZVBpbkNsaWNrfVxuICAgICAgICAgIC8+XG4gICAgICAgICk7XG4gICAgICB9KX1cbiAgICAgIHtjb21wb3NlciA/IChcbiAgICAgICAgPENvbW1lbnRDb21wb3NlciBzdGF0ZT17Y29tcG9zZXJ9IG9uU3VibWl0PXtzdWJtaXRDb21wb3Nlcn0gb25DYW5jZWw9e2Nsb3NlQ29tcG9zZXJ9IC8+XG4gICAgICApIDogbnVsbH1cbiAgICAgIHsoKCkgPT4ge1xuICAgICAgICBpZiAoIWZvY3VzZWRJZCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IGZvY3VzZWQgPSB2aXNpYmxlLmZpbmQoKGMpID0+IGMuaWQgPT09IGZvY3VzZWRJZCk7XG4gICAgICAgIGlmICghZm9jdXNlZCkgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPENvbW1lbnRUaHJlYWRcbiAgICAgICAgICAgIGNvbW1lbnQ9e2ZvY3VzZWR9XG4gICAgICAgICAgICBzZXF1ZW5jZT17aW5kZXhCeUlkLmdldChmb2N1c2VkLmlkKSA/PyAwfVxuICAgICAgICAgICAgb25DbG9zZT17KCkgPT4ge1xuICAgICAgICAgICAgICBzZXRGb2N1c2VkSWQobnVsbCk7XG4gICAgICAgICAgICAgIC8vIERyb3AgdGhlIGNhbnZhcyBoYWxvIHdoZW4gdGhlIHRocmVhZCBjbG9zZXMg4oCUIHN5bW1ldHJpYyB3aXRoXG4gICAgICAgICAgICAgIC8vIGBoYW5kbGVQaW5DbGlja2Agd2hpY2ggcGFpbnRzIGl0IG9uIG9wZW4uXG4gICAgICAgICAgICAgIHNlbFNldD8uY2xlYXIoKTtcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICBvblBhdGNoPXsocGF0Y2gpID0+IGhhbmRsZVBhdGNoKGZvY3VzZWQuaWQsIHBhdGNoKX1cbiAgICAgICAgICAgIG9uRGVsZXRlPXsoKSA9PiBoYW5kbGVEZWxldGUoZm9jdXNlZC5pZCl9XG4gICAgICAgICAgICBvblJlcGx5PXsoYm9keSkgPT4gaGFuZGxlUmVwbHkoZm9jdXNlZC5pZCwgYm9keSl9XG4gICAgICAgICAgLz5cbiAgICAgICAgKTtcbiAgICAgIH0pKCl9XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gTWVudGlvbkF3YXJlVGV4dGFyZWEgKyBwb3B1cCDigJQgVGFzayA1XG4vL1xuLy8gV3JhcHMgYSB0ZXh0YXJlYSBhbmQgc3VyZmFjZXMgYW4gYXV0b2NvbXBsZXRlIHBvcHVwIHdoZW4gdGhlIGNhcmV0IHNpdHNcbi8vIGluc2lkZSBhbiBgQDxxdWVyeT5gIHRva2VuIChubyB3aGl0ZXNwYWNlIGJldHdlZW4gYEBgIGFuZCBjdXJzb3IpLiBUaGVcbi8vIGNvbW1pdHRlciBsaXN0IGlzIGZldGNoZWQgb25jZSBvbiBmaXJzdCBmb2N1cyBhbmQgY2FjaGVkIGZvciB0aGUgc2Vzc2lvbi5cbi8vIEtleWJvYXJkOiDihpHihpMgbW92ZSwg4oa1L1RhYiBpbnNlcnQgKGBAZmlyc3RuYW1lIGApLCBFc2MgZGlzbWlzcy5cblxuaW50ZXJmYWNlIENvbW1pdHRlclJvdyB7XG4gIG5hbWU6IHN0cmluZztcbiAgZW1haWw6IHN0cmluZztcbiAgY29tbWl0czogbnVtYmVyO1xufVxuXG5sZXQgY29tbWl0dGVyQ2FjaGU6IFByb21pc2U8Q29tbWl0dGVyUm93W10+IHwgbnVsbCA9IG51bGw7XG5hc3luYyBmdW5jdGlvbiBsb2FkQ29tbWl0dGVycygpOiBQcm9taXNlPENvbW1pdHRlclJvd1tdPiB7XG4gIGlmICghY29tbWl0dGVyQ2FjaGUpIHtcbiAgICBjb21taXR0ZXJDYWNoZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgZmV0Y2goJy9fYXBpL2dpdC1jb21taXR0ZXJzJyk7XG4gICAgICAgIGlmICghci5vaykgcmV0dXJuIFtdO1xuICAgICAgICBjb25zdCBkYXRhID0gKGF3YWl0IHIuanNvbigpKSBhcyB7IGNvbW1pdHRlcnM/OiBDb21taXR0ZXJSb3dbXSB9O1xuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShkYXRhLmNvbW1pdHRlcnMpID8gZGF0YS5jb21taXR0ZXJzIDogW107XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgIH0pKCk7XG4gIH1cbiAgcmV0dXJuIGNvbW1pdHRlckNhY2hlO1xufVxuXG5mdW5jdGlvbiBmaXJzdE5hbWVTbHVnKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIGBAZmlyc3RuYW1lYCBpcyB3aGF0IHdlIGluc2VydCBvbiBhY2NlcHQuIFN0cmlwIHN1cm5hbWVzICsgcHVuY3R1YXRpb24uXG4gIGNvbnN0IGZpcnN0ID0gbmFtZS50cmltKCkuc3BsaXQoL1xccysvKVswXSA/PyAnJztcbiAgLy8gS2VlcCBhbHBoYW51bSArIGAuYCBgLWAgYF9gIChtYXRjaGVzIHRoZSBwYXJzZU1lbnRpb25zIHJlZ2V4IG9uIHRoZSBzZXJ2ZXIpLlxuICByZXR1cm4gZmlyc3QucmVwbGFjZSgvW15cXHcuLV0vZywgJycpLnRvTG93ZXJDYXNlKCk7XG59XG5cbmludGVyZmFjZSBNZW50aW9uVG9rZW4ge1xuICBzdGFydDogbnVtYmVyOyAvLyBpbmRleCBvZiBgQGBcbiAgZW5kOiBudW1iZXI7IC8vIGV4Y2x1c2l2ZSDigJQgY3VycmVudCBjYXJldFxuICBxdWVyeTogc3RyaW5nOyAvLyBjaGFycyBiZXR3ZWVuIGBAYCBhbmQgY2FyZXQgKGV4Y2x1ZGluZyBgQGApXG59XG5cbmZ1bmN0aW9uIGRldGVjdE1lbnRpb25Ub2tlbih0ZXh0OiBzdHJpbmcsIGNhcmV0OiBudW1iZXIpOiBNZW50aW9uVG9rZW4gfCBudWxsIHtcbiAgaWYgKGNhcmV0IDw9IDAgfHwgY2FyZXQgPiB0ZXh0Lmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gIC8vIFdhbGsgYmFja3dhcmRzIGZyb20gY2FyZXQ7IHRoZSB0b2tlbiBzdGFydHMgYXQgYEBgIGFuZCBlbmRzIGF0IHRoZSBjYXJldC5cbiAgLy8gQWJvcnRzIG9uIHdoaXRlc3BhY2UsIG5ld2xpbmUsIG9yIGFueSBub24tbWVudGlvbiBjaGFyIHNvIGEgc3RyYXkgYEBgIGluXG4gIC8vIGFuIGVtYWlsIGlzIGlnbm9yZWQuXG4gIGxldCBpID0gY2FyZXQgLSAxO1xuICB3aGlsZSAoaSA+PSAwKSB7XG4gICAgY29uc3QgY2ggPSB0ZXh0W2ldID8/ICcnO1xuICAgIGlmIChjaCA9PT0gJ0AnKSB7XG4gICAgICAvLyBUb2tlbiBtdXN0IGJlIHdvcmQtbGVhZGluZzogcHJldmlvdXMgY2hhciBpcyBzdGFydC1vZi1zdHJpbmcgb3Igd2hpdGVzcGFjZS5cbiAgICAgIGNvbnN0IHByZXYgPSBpID4gMCA/IHRleHRbaSAtIDFdIDogJyc7XG4gICAgICBpZiAoaSA9PT0gMCB8fCAvXFxzLy50ZXN0KHByZXYgPz8gJycpKSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gdGV4dC5zbGljZShpICsgMSwgY2FyZXQpO1xuICAgICAgICByZXR1cm4geyBzdGFydDogaSwgZW5kOiBjYXJldCwgcXVlcnkgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoIS9bXFx3Li1dLy50ZXN0KGNoKSkgcmV0dXJuIG51bGw7XG4gICAgaSAtPSAxO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBNZW50aW9uQXdhcmVUZXh0YXJlYSh7XG4gIGNsYXNzTmFtZSxcbiAgdmFsdWUsXG4gIG9uQ2hhbmdlLFxuICBvbktleURvd24sXG4gIHBsYWNlaG9sZGVyLFxuICByb3dzLFxuICBkaXNhYmxlZCxcbiAgdGV4dGFyZWFSZWYsXG4gIGFyaWFMYWJlbCxcbn06IHtcbiAgY2xhc3NOYW1lOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIG9uQ2hhbmdlOiAobmV4dDogc3RyaW5nKSA9PiB2b2lkO1xuICBvbktleURvd24/OiAoZTogUmVhY3QuS2V5Ym9hcmRFdmVudDxIVE1MVGV4dEFyZWFFbGVtZW50PikgPT4gdm9pZDtcbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIHJvd3M/OiBudW1iZXI7XG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgdGV4dGFyZWFSZWY/OiBSZWFjdC5NdXRhYmxlUmVmT2JqZWN0PEhUTUxUZXh0QXJlYUVsZW1lbnQgfCBudWxsPjtcbiAgYXJpYUxhYmVsPzogc3RyaW5nO1xufSk6IFJlYWN0LlJlYWN0RWxlbWVudCB7XG4gIGNvbnN0IGludGVybmFsUmVmID0gdXNlUmVmPEhUTUxUZXh0QXJlYUVsZW1lbnQgfCBudWxsPihudWxsKTtcbiAgY29uc3Qgc2V0UmVmID0gdXNlQ2FsbGJhY2soXG4gICAgKGVsOiBIVE1MVGV4dEFyZWFFbGVtZW50IHwgbnVsbCkgPT4ge1xuICAgICAgaW50ZXJuYWxSZWYuY3VycmVudCA9IGVsO1xuICAgICAgaWYgKHRleHRhcmVhUmVmKSB0ZXh0YXJlYVJlZi5jdXJyZW50ID0gZWw7XG4gICAgfSxcbiAgICBbdGV4dGFyZWFSZWZdXG4gICk7XG5cbiAgY29uc3QgW2NvbW1pdHRlcnMsIHNldENvbW1pdHRlcnNdID0gdXNlU3RhdGU8Q29tbWl0dGVyUm93W10+KFtdKTtcbiAgY29uc3QgW3Rva2VuLCBzZXRUb2tlbl0gPSB1c2VTdGF0ZTxNZW50aW9uVG9rZW4gfCBudWxsPihudWxsKTtcbiAgY29uc3QgW2hpZ2hsaWdodCwgc2V0SGlnaGxpZ2h0XSA9IHVzZVN0YXRlKDApO1xuXG4gIC8vIExhenktbG9hZCBjb21taXR0ZXJzIG9uIGZpcnN0IGZvY3VzLlxuICBjb25zdCBvbkZvY3VzID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGlmIChjb21taXR0ZXJzLmxlbmd0aCA+IDApIHJldHVybjtcbiAgICB2b2lkIGxvYWRDb21taXR0ZXJzKCkudGhlbigobGlzdCkgPT4gc2V0Q29tbWl0dGVycyhsaXN0KSk7XG4gIH0sIFtjb21taXR0ZXJzLmxlbmd0aF0pO1xuXG4gIGNvbnN0IGZpbHRlcmVkID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKCF0b2tlbikgcmV0dXJuIFtdIGFzIENvbW1pdHRlclJvd1tdO1xuICAgIGNvbnN0IHEgPSB0b2tlbi5xdWVyeS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGxpc3QgPSAhcVxuICAgICAgPyBjb21taXR0ZXJzXG4gICAgICA6IGNvbW1pdHRlcnMuZmlsdGVyKFxuICAgICAgICAgIChjKSA9PiBjLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSB8fCBjLmVtYWlsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSlcbiAgICAgICAgKTtcbiAgICByZXR1cm4gbGlzdC5zbGljZSgwLCA4KTtcbiAgfSwgW3Rva2VuLCBjb21taXR0ZXJzXSk7XG5cbiAgY29uc3QgcmVmcmVzaFRva2VuID0gdXNlQ2FsbGJhY2soKHRleHRhcmVhOiBIVE1MVGV4dEFyZWFFbGVtZW50KSA9PiB7XG4gICAgY29uc3QgY2FyZXQgPSB0ZXh0YXJlYS5zZWxlY3Rpb25TdGFydCA/PyB0ZXh0YXJlYS52YWx1ZS5sZW5ndGg7XG4gICAgY29uc3QgdCA9IGRldGVjdE1lbnRpb25Ub2tlbih0ZXh0YXJlYS52YWx1ZSwgY2FyZXQpO1xuICAgIHNldFRva2VuKHQpO1xuICAgIHNldEhpZ2hsaWdodCgwKTtcbiAgfSwgW10pO1xuXG4gIGNvbnN0IGhhbmRsZUNoYW5nZSA9IHVzZUNhbGxiYWNrKFxuICAgIChlOiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MVGV4dEFyZWFFbGVtZW50PikgPT4ge1xuICAgICAgb25DaGFuZ2UoZS50YXJnZXQudmFsdWUpO1xuICAgICAgcmVmcmVzaFRva2VuKGUudGFyZ2V0KTtcbiAgICB9LFxuICAgIFtvbkNoYW5nZSwgcmVmcmVzaFRva2VuXVxuICApO1xuXG4gIGNvbnN0IGluc2VydE1lbnRpb24gPSB1c2VDYWxsYmFjayhcbiAgICAoY29tbWl0dGVyOiBDb21taXR0ZXJSb3cpID0+IHtcbiAgICAgIGlmICghdG9rZW4pIHJldHVybjtcbiAgICAgIGNvbnN0IHRhID0gaW50ZXJuYWxSZWYuY3VycmVudDtcbiAgICAgIGlmICghdGEpIHJldHVybjtcbiAgICAgIGNvbnN0IHRhZyA9IGBAJHtmaXJzdE5hbWVTbHVnKGNvbW1pdHRlci5uYW1lKX1gO1xuICAgICAgY29uc3QgbmV4dCA9IGAke3ZhbHVlLnNsaWNlKDAsIHRva2VuLnN0YXJ0KX0ke3RhZ30gJHt2YWx1ZS5zbGljZSh0b2tlbi5lbmQpfWA7XG4gICAgICBvbkNoYW5nZShuZXh0KTtcbiAgICAgIHNldFRva2VuKG51bGwpO1xuICAgICAgLy8gUmVzdG9yZSBjYXJldCBqdXN0IHBhc3QgdGhlIGluc2VydGVkIHRva2VuICsgdHJhaWxpbmcgc3BhY2UuXG4gICAgICBjb25zdCBuZXdDYXJldCA9IHRva2VuLnN0YXJ0ICsgdGFnLmxlbmd0aCArIDE7XG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICB0YS5mb2N1cygpO1xuICAgICAgICB0YS5zZXRTZWxlY3Rpb25SYW5nZShuZXdDYXJldCwgbmV3Q2FyZXQpO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBbdG9rZW4sIHZhbHVlLCBvbkNoYW5nZV1cbiAgKTtcblxuICBjb25zdCBoYW5kbGVLZXlEb3duID0gdXNlQ2FsbGJhY2soXG4gICAgKGU6IFJlYWN0LktleWJvYXJkRXZlbnQ8SFRNTFRleHRBcmVhRWxlbWVudD4pID0+IHtcbiAgICAgIGlmICh0b2tlbiAmJiBmaWx0ZXJlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmIChlLmtleSA9PT0gJ0Fycm93RG93bicpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgc2V0SGlnaGxpZ2h0KChoKSA9PiAoaCArIDEpICUgZmlsdGVyZWQubGVuZ3RoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGUua2V5ID09PSAnQXJyb3dVcCcpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgc2V0SGlnaGxpZ2h0KChoKSA9PiAoaCAtIDEgKyBmaWx0ZXJlZC5sZW5ndGgpICUgZmlsdGVyZWQubGVuZ3RoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInIHx8IGUua2V5ID09PSAnVGFiJykge1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBjb25zdCBwaWNrID0gZmlsdGVyZWRbaGlnaGxpZ2h0XSA/PyBmaWx0ZXJlZFswXTtcbiAgICAgICAgICBpZiAocGljaykgaW5zZXJ0TWVudGlvbihwaWNrKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBzZXRUb2tlbihudWxsKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG9uS2V5RG93bj8uKGUpO1xuICAgIH0sXG4gICAgW3Rva2VuLCBmaWx0ZXJlZCwgaGlnaGxpZ2h0LCBpbnNlcnRNZW50aW9uLCBvbktleURvd25dXG4gICk7XG5cbiAgY29uc3QgaGFuZGxlU2VsZWN0ID0gdXNlQ2FsbGJhY2soXG4gICAgKGU6IFJlYWN0LlN5bnRoZXRpY0V2ZW50PEhUTUxUZXh0QXJlYUVsZW1lbnQ+KSA9PiB7XG4gICAgICByZWZyZXNoVG9rZW4oZS5jdXJyZW50VGFyZ2V0KTtcbiAgICB9LFxuICAgIFtyZWZyZXNoVG9rZW5dXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IHN0eWxlPXt7IHBvc2l0aW9uOiAncmVsYXRpdmUnIH19PlxuICAgICAgPHRleHRhcmVhXG4gICAgICAgIHJlZj17c2V0UmVmfVxuICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZX1cbiAgICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICAgIHJvd3M9e3Jvd3N9XG4gICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgYXJpYS1sYWJlbD17YXJpYUxhYmVsfVxuICAgICAgICBvbkNoYW5nZT17aGFuZGxlQ2hhbmdlfVxuICAgICAgICBvbktleURvd249e2hhbmRsZUtleURvd259XG4gICAgICAgIG9uRm9jdXM9e29uRm9jdXN9XG4gICAgICAgIG9uU2VsZWN0PXtoYW5kbGVTZWxlY3R9XG4gICAgICAgIG9uQ2xpY2s9e2hhbmRsZVNlbGVjdH1cbiAgICAgIC8+XG4gICAgICB7LyogQ29tYm9ib3ggcGF0dGVybiDigJQgYHJvbGU9XCJsaXN0Ym94XCJgICsgYHJvbGU9XCJvcHRpb25cImAgaXMgdGhlIGNhbm9uaWNhbFxuICAgICAgICogQVJJQSBzaGFwZSBmb3IgYSBzaW5nbGUtc2VsZWN0IGF1dG9jb21wbGV0ZS4gS2V5Ym9hcmQgbmF2aWdhdGlvblxuICAgICAgICogKOKGkSDihpMgRW50ZXIgRXNjKSBsaXZlcyBvbiB0aGUgcGFyZW50IHRleHRhcmVhIHBlciB0aGUgY29tYm9ib3ggc3BlYyxcbiAgICAgICAqIHNvIHRoZSBwb3B1cCBpdHNlbGYgc3RheXMgaW5lcnQuIFNhbWUgcGF0dGVybiBhcHBsaWVzIHRvIHRoZSBjb21wb3NlclxuICAgICAgICogKyB0aHJlYWQgcG9wb3ZlcnMgYmVsb3cgKGByb2xlPVwiZGlhbG9nXCJgIG9uIGEgcG9zaXRpb25lZCA8ZGl2PikuXG4gICAgICAgKiBCaW9tZSdzIGExMXkgcnVsZXMgd2FudCBzZW1hbnRpYyBIVE1MIHByaW1pdGl2ZXMsIGJ1dCBub25lIG1hdGNoXG4gICAgICAgKiBcIm5vbi1mb2N1c2FibGUgbGlzdGJveCB1bmRlciBhIHRleHRhcmVhXCIgb3IgXCJhbmNob3JlZCBub24tbW9kYWwgcG9wb3ZlclwiLlxuICAgICAgICogVGhlIGZvdXIgYWZmZWN0ZWQgcnVsZXMgYXJlIHNjb3BlZCBvZmYgZm9yIHRoaXMgZmlsZSBpbiBiaW9tZS5qc29uLiAqL31cbiAgICAgIHt0b2tlbiAmJiBmaWx0ZXJlZC5sZW5ndGggPiAwID8gKFxuICAgICAgICA8dWxcbiAgICAgICAgICBjbGFzc05hbWU9XCJjbS1tZW50aW9uLXBvcHVwXCJcbiAgICAgICAgICByb2xlPVwibGlzdGJveFwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIk1lbnRpb24gc3VnZ2VzdGlvbnNcIlxuICAgICAgICAgIHN0eWxlPXt7IGxlZnQ6IDAsIHRvcDogJzEwMCUnIH19XG4gICAgICAgID5cbiAgICAgICAgICB7ZmlsdGVyZWQubWFwKChjLCBpKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IGkgPT09IGhpZ2hsaWdodDtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICAgIGtleT17YCR7Yy5uYW1lfS0ke2MuZW1haWx9YH1cbiAgICAgICAgICAgICAgICByb2xlPVwib3B0aW9uXCJcbiAgICAgICAgICAgICAgICBhcmlhLXNlbGVjdGVkPXtzZWxlY3RlZH1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJjbS1tZW50aW9uLXBvcHVwX19pdGVtXCJcbiAgICAgICAgICAgICAgICBvbk1vdXNlRW50ZXI9eygpID0+IHNldEhpZ2hsaWdodChpKX1cbiAgICAgICAgICAgICAgICAvLyBVc2UgbW91c2Vkb3duIHNvIHRoZSB0ZXh0YXJlYSBkb2Vzbid0IGJsdXIgYmVmb3JlIHRoZVxuICAgICAgICAgICAgICAgIC8vIHNlbGVjdGlvbiByZWdpc3RlcnMuXG4gICAgICAgICAgICAgICAgb25Nb3VzZURvd249eyhldikgPT4ge1xuICAgICAgICAgICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgIGluc2VydE1lbnRpb24oYyk7XG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImNtLW1lbnRpb24tcG9wdXBfX25hbWVcIj5Ae2ZpcnN0TmFtZVNsdWcoYy5uYW1lKX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiY20tbWVudGlvbi1wb3B1cF9fZW1haWxcIj57Yy5lbWFpbH08L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pfVxuICAgICAgICA8L3VsPlxuICAgICAgKSA6IG51bGx9XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gQ29tbWVudFBpbiDigJQgc2luZ2xlIDI0w5cyNCBiYWRnZSBhbmNob3JlZCB0byB0b3AtcmlnaHQgb2YgaXRzIHRhcmdldCBlbGVtZW50LlxuLy8gUmVzb2x2ZXMgdGFyZ2V0IG9uIGV2ZXJ5IGFuaW1hdGlvbiBmcmFtZSB0byB0cmFjayBsYXlvdXQgc2hpZnRzIChkcmFnLFxuLy8gcmVmbG93LCBmb250IGxvYWQpLiBGYWxscyBiYWNrIHRvIHRoZSBzdG9yZWQgYGJvdW5kc2Agd2hlbiB0aGUgdGFyZ2V0IGlzXG4vLyBnb25lIGZyb20gdGhlIERPTS5cblxuZnVuY3Rpb24gQ29tbWVudFBpbih7XG4gIGNvbW1lbnQsXG4gIHNlcXVlbmNlLFxuICBmb2N1c2VkLFxuICBvbkNsaWNrLFxufToge1xuICBjb21tZW50OiBPdmVybGF5Q29tbWVudDtcbiAgc2VxdWVuY2U6IG51bWJlcjtcbiAgZm9jdXNlZDogYm9vbGVhbjtcbiAgb25DbGljazogKGlkOiBzdHJpbmcpID0+IHZvaWQ7XG59KSB7XG4gIGNvbnN0IHJlZiA9IHVzZVJlZjxIVE1MQnV0dG9uRWxlbWVudCB8IG51bGw+KG51bGwpO1xuICBjb25zdCByYWZSZWYgPSB1c2VSZWY8bnVtYmVyIHwgbnVsbD4obnVsbCk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCB0aWNrID0gKCkgPT4ge1xuICAgICAgcmFmUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgY29uc3QgcGluID0gcmVmLmN1cnJlbnQ7XG4gICAgICBpZiAoIXBpbikgcmV0dXJuO1xuXG4gICAgICAvLyBMaXZlIHNjcmVlbi1jb29yZCBsb29rdXAgbWlycm9ycyBTZWxlY3Rpb25IYWxvcyBpbiBjYW52YXMtc2hlbGwudHN4LlxuICAgICAgLy8gRmFsbHMgYmFjayB0byBzdG9yZWQgYm91bmRzIChhIHNjcmVlbi1jb29yZCBjYXB0dXJlIGF0IGNyZWF0ZSB0aW1lKVxuICAgICAgLy8gd2hlbiB0aGUgdGFyZ2V0IGVsZW1lbnQgaXMgZ29uZSDigJQgYmV0dGVyIHRoYW4gdmFuaXNoaW5nIGVudGlyZWx5LlxuICAgICAgbGV0IHBvcyA9IHNjcmVlblJlY3RGb3IoY29tbWVudC5zZWxlY3RvciwgY29tbWVudC5pbmRleCk7XG4gICAgICBpZiAoIXBvcyAmJiBjb21tZW50LmJvdW5kcykge1xuICAgICAgICBwb3MgPSB7XG4gICAgICAgICAgeDogY29tbWVudC5ib3VuZHMueCxcbiAgICAgICAgICB5OiBjb21tZW50LmJvdW5kcy55LFxuICAgICAgICAgIHc6IGNvbW1lbnQuYm91bmRzLncsXG4gICAgICAgICAgaDogY29tbWVudC5ib3VuZHMuaCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmICghcG9zKSB7XG4gICAgICAgIHBpbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICByYWZSZWYuY3VycmVudCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aWNrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcGluLnN0eWxlLmRpc3BsYXkgPSAnZ3JpZCc7XG4gICAgICAvLyBQb3NpdGlvbiB0aGUgcGluJ3MgY2VudGVyIGF0IChyaWdodCAtIDEyLCB0b3AgLSAxMikg4oCUIHRoZSBGaWdKYW1cbiAgICAgIC8vIGNvbnZlbnRpb24uIDEyID0gaGFsZiBvZiAyNCAodGhlIHBpbidzIG93biBzaXplKS5cbiAgICAgIGNvbnN0IGxlZnQgPSBNYXRoLnJvdW5kKHBvcy54ICsgcG9zLncgLSAxMik7XG4gICAgICBjb25zdCB0b3AgPSBNYXRoLnJvdW5kKHBvcy55IC0gMTIpO1xuICAgICAgcGluLnN0eWxlLmxlZnQgPSBgJHtsZWZ0fXB4YDtcbiAgICAgIHBpbi5zdHlsZS50b3AgPSBgJHt0b3B9cHhgO1xuICAgICAgcmFmUmVmLmN1cnJlbnQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGljayk7XG4gICAgfTtcbiAgICByYWZSZWYuY3VycmVudCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aWNrKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaWYgKHJhZlJlZi5jdXJyZW50ICE9IG51bGwpIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHJhZlJlZi5jdXJyZW50KTtcbiAgICB9O1xuICB9LCBbY29tbWVudC5zZWxlY3RvciwgY29tbWVudC5ib3VuZHMsIGNvbW1lbnQuaW5kZXhdKTtcblxuICBjb25zdCBhdXRob3IgPSBjb21tZW50LmF1dGhvcj8udHJpbSgpIHx8ICd1bmtub3duJztcbiAgY29uc3QgbGFiZWwgPSBgQ29tbWVudCAke3NlcXVlbmNlfSBieSAke2F1dGhvcn1gO1xuXG4gIHJldHVybiAoXG4gICAgPGJ1dHRvblxuICAgICAgcmVmPXtyZWZ9XG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGNsYXNzTmFtZT1cImNtLXBpblwiXG4gICAgICBkYXRhLXJlc29sdmVkPXtjb21tZW50LnN0YXR1cyA9PT0gJ3Jlc29sdmVkJyA/ICd0cnVlJyA6ICdmYWxzZSd9XG4gICAgICBkYXRhLWZvY3VzZWQ9e2ZvY3VzZWQgPyAndHJ1ZScgOiAnZmFsc2UnfVxuICAgICAgZGF0YS1jb21tZW50LXBpbj17Y29tbWVudC5pZH1cbiAgICAgIGFyaWEtbGFiZWw9e2xhYmVsfVxuICAgICAgYXJpYS1leHBhbmRlZD17Zm9jdXNlZH1cbiAgICAgIHRpdGxlPXtjb21tZW50LnRleHQuc2xpY2UoMCwgMjAwKX1cbiAgICAgIG9uQ2xpY2s9eyhlKSA9PiB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgb25DbGljayhjb21tZW50LmlkKTtcbiAgICAgIH19XG4gICAgPlxuICAgICAge3NlcXVlbmNlfVxuICAgIDwvYnV0dG9uPlxuICApO1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIENvbW1lbnRDb21wb3NlciDigJQgRFMtc3R5bGVkIGNhcmQgYW5jaG9yZWQganVzdCB1bmRlciB0aGUgY2xpY2tlZCBlbGVtZW50XG4vLyAob3IgYXQgdGhlIGNsaWNrIHBvaW50IGlmIHRoZSBjbGljayBoaXQgZW1wdHkgY2FudmFzKS4gRWRnZS1jbGFtcCBpcyB0aGVcbi8vIHByYWdtYXRpYyBraW5kOiBwb3NpdGlvbiBpcyBjb21wdXRlZCBvbmNlIG9uIG9wZW4gYWdhaW5zdCB0aGUgd29ybGQgbGF5b3V0LFxuLy8gbm90IGNoYXNlZCBvbiBwYW4vem9vbSDigJQgdGhlIHVzZXIgaXMgYWN0aXZlbHkgdHlwaW5nLlxuXG5mdW5jdGlvbiBDb21tZW50Q29tcG9zZXIoe1xuICBzdGF0ZSxcbiAgb25TdWJtaXQsXG4gIG9uQ2FuY2VsLFxufToge1xuICBzdGF0ZTogQ29tcG9zZXJTdGF0ZTtcbiAgb25TdWJtaXQ6ICh0ZXh0OiBzdHJpbmcpID0+IHZvaWQ7XG4gIG9uQ2FuY2VsOiAoKSA9PiB2b2lkO1xufSkge1xuICBjb25zdCBbdGV4dCwgc2V0VGV4dF0gPSB1c2VTdGF0ZSgnJyk7XG4gIGNvbnN0IHRleHRhcmVhUmVmID0gdXNlUmVmPEhUTUxUZXh0QXJlYUVsZW1lbnQgfCBudWxsPihudWxsKTtcbiAgY29uc3QgY2FyZFJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudCB8IG51bGw+KG51bGwpO1xuICBjb25zdCByYWZSZWYgPSB1c2VSZWY8bnVtYmVyIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gTGl2ZSBhbmNob3Ig4oCUIGNvbXBvc2VyIHRyYWNrcyB0aGUgdGFyZ2V0IGVsZW1lbnQgdmlhIHJBRiBzbyBwYW4vem9vbVxuICAvLyB3aGlsZSB0eXBpbmcga2VlcHMgdGhlIGNhcmQgZ2x1ZWQgdG8gaXRzIGFuY2hvci4gV3JpdGVzIGRpcmVjdGx5IHRvIHRoZVxuICAvLyBET00gc28gd2UgZG9uJ3QgcmUtcmVuZGVyIGV2ZXJ5IGZyYW1lLlxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHRpY2sgPSAoKSA9PiB7XG4gICAgICByYWZSZWYuY3VycmVudCA9IG51bGw7XG4gICAgICBjb25zdCBub2RlID0gY2FyZFJlZi5jdXJyZW50O1xuICAgICAgaWYgKCFub2RlKSByZXR1cm47XG4gICAgICBjb25zdCBhbmNob3IgPSBjb21wdXRlQW5jaG9yKHN0YXRlKTtcbiAgICAgIG5vZGUuc3R5bGUubGVmdCA9IGAke01hdGgucm91bmQoYW5jaG9yLngpfXB4YDtcbiAgICAgIG5vZGUuc3R5bGUudG9wID0gYCR7TWF0aC5yb3VuZChhbmNob3IueSl9cHhgO1xuICAgICAgcmFmUmVmLmN1cnJlbnQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGljayk7XG4gICAgfTtcbiAgICByYWZSZWYuY3VycmVudCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aWNrKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaWYgKHJhZlJlZi5jdXJyZW50ICE9IG51bGwpIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHJhZlJlZi5jdXJyZW50KTtcbiAgICB9O1xuICB9LCBbc3RhdGVdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHRleHRhcmVhUmVmLmN1cnJlbnQ/LmZvY3VzKCk7XG4gIH0sIFtdKTtcblxuICBjb25zdCB0cnlTdWJtaXQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgY29uc3QgdiA9IHRleHQudHJpbSgpO1xuICAgIGlmICghdikgcmV0dXJuO1xuICAgIG9uU3VibWl0KHYpO1xuICB9LCBbdGV4dCwgb25TdWJtaXRdKTtcblxuICBjb25zdCBvbktleURvd24gPSB1c2VDYWxsYmFjayhcbiAgICAoZTogUmVhY3QuS2V5Ym9hcmRFdmVudDxIVE1MVGV4dEFyZWFFbGVtZW50PikgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIG9uQ2FuY2VsKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICgoZS5tZXRhS2V5IHx8IGUuY3RybEtleSkgJiYgZS5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0cnlTdWJtaXQoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtvbkNhbmNlbCwgdHJ5U3VibWl0XVxuICApO1xuXG4gIC8vIENvbXBhY3Qgc2VsZWN0b3IgaGludCDigJQgc3RyaXAgbm9pc3kgc3RydWN0dXJhbCBiaXRzIHNvIHRoZSBoZWFkIHN0YXlzXG4gIC8vIHRpZ2h0IGluc2lkZSB0aGUgMzAwcHggY2FyZC5cbiAgY29uc3Qgc2VsZWN0b3JDaGlwID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgcyA9IHN0YXRlLnNlbGVjdGlvbi5zZWxlY3RvciB8fCAnJztcbiAgICBpZiAoIXMpIHJldHVybiBzdGF0ZS5zZWxlY3Rpb24udGFnIHx8ICdjYW52YXMnO1xuICAgIC8vIFtkYXRhLWNkLWlkPVwi4oCmXCJdIOKGkiBjZDo8aWQ+IMK3IGtlZXBzIHRoZSBjaGlwIHJlYWRhYmxlIHdoZW4gc3RhYmxlIGlkc1xuICAgIC8vIGFyZSBwcmVzZW50LlxuICAgIGNvbnN0IGNkID0gcy5tYXRjaCgvZGF0YS1jZC1pZD1cIihbXlwiXSspXCIvKTtcbiAgICBpZiAoY2QpIHJldHVybiBgY2Q6JHtjZFsxXX1gO1xuICAgIHJldHVybiBzLmxlbmd0aCA+IDM2ID8gYCR7cy5zbGljZSgwLCAzMyl94oCmYCA6IHM7XG4gIH0sIFtzdGF0ZS5zZWxlY3Rpb25dKTtcblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIHJlZj17Y2FyZFJlZn1cbiAgICAgIGNsYXNzTmFtZT1cImNtLWNvbXBvc2VyXCJcbiAgICAgIHJvbGU9XCJkaWFsb2dcIlxuICAgICAgYXJpYS1sYWJlbD1cIk5ldyBjb21tZW50XCJcbiAgICAgIG9uQ2xpY2s9eyhlKSA9PiBlLnN0b3BQcm9wYWdhdGlvbigpfVxuICAgICAgb25Qb2ludGVyRG93bj17KGUpID0+IGUuc3RvcFByb3BhZ2F0aW9uKCl9XG4gICAgPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJjbS1jb21wb3Nlcl9faGVhZFwiPlxuICAgICAgICA8c3Bhbj5OZXcgY29tbWVudDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiY20tY29tcG9zZXJfX3NlbGVjdG9yXCI+e3NlbGVjdG9yQ2hpcH08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxNZW50aW9uQXdhcmVUZXh0YXJlYVxuICAgICAgICB0ZXh0YXJlYVJlZj17dGV4dGFyZWFSZWZ9XG4gICAgICAgIGNsYXNzTmFtZT1cImNtLWNvbXBvc2VyX190ZXh0YXJlYVwiXG4gICAgICAgIHZhbHVlPXt0ZXh0fVxuICAgICAgICBwbGFjZWhvbGRlcj1cIlR5cGUgYSBjb21tZW50LiDijJjihrUgdG8gc2F2ZSDCtyBFc2MgdG8gY2FuY2VsIMK3IEBuYW1lIHRvIHRhZ1wiXG4gICAgICAgIG9uQ2hhbmdlPXtzZXRUZXh0fVxuICAgICAgICBvbktleURvd249e29uS2V5RG93bn1cbiAgICAgICAgcm93cz17M31cbiAgICAgICAgYXJpYUxhYmVsPVwiQ29tbWVudCBib2R5XCJcbiAgICAgIC8+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImNtLWNvbXBvc2VyX19hY3Rpb25zXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzTmFtZT1cImNtLWJ0blwiIG9uQ2xpY2s9e29uQ2FuY2VsfT5cbiAgICAgICAgICBDYW5jZWxcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzc05hbWU9XCJjbS1idG4gY20tYnRuLS1wcmltYXJ5XCJcbiAgICAgICAgICBkaXNhYmxlZD17IXRleHQudHJpbSgpfVxuICAgICAgICAgIG9uQ2xpY2s9e3RyeVN1Ym1pdH1cbiAgICAgICAgPlxuICAgICAgICAgIFNhdmVcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBDb21tZW50VGhyZWFkIOKAlCBwb3BvdmVyIGFuY2hvcmVkIHRvIHRoZSBmb2N1c2VkIHBpbi4gU2hvd3MgYXV0aG9yICsgcmVsYXRpdmVcbi8vIHRpbWUgKyBzZWxlY3RvciBjaGlwLCB0aGUgb3JpZ2luYWwgYm9keSB3aXRoIEBtZW50aW9ucyBib2xkZWQsIHJlcGxpZXMsIGFcbi8vIHJlcGx5IHRleHRhcmVhLCBhbmQgcmVzb2x2ZS9yZW9wZW4vZGVsZXRlIGFjdGlvbnMuIFBhdGNoZXMgKyBkZWxldGVzIHJvdXRlXG4vLyB0aHJvdWdoIHRoZSBzaGVsbCdzIGV4aXN0aW5nIFdTIGNoYW5uZWwgdmlhIHBvc3RNZXNzYWdlOyByZXBsaWVzIFBPU1Rcbi8vIGRpcmVjdGx5IHRvIGAvX2FwaS9jb21tZW50cy88aWQ+L3JlcGx5YCBiZWNhdXNlIHRoYXQgZW5kcG9pbnQgZXhpc3RzIG9ubHkgb25cbi8vIEJ1biBydW50aW1lIGFuZCBsaXZlcyBpbiBgaHR0cC50c2AuXG5cbmZ1bmN0aW9uIENvbW1lbnRUaHJlYWQoe1xuICBjb21tZW50LFxuICBzZXF1ZW5jZSxcbiAgb25DbG9zZSxcbiAgb25QYXRjaCxcbiAgb25EZWxldGUsXG4gIG9uUmVwbHksXG59OiB7XG4gIGNvbW1lbnQ6IE92ZXJsYXlDb21tZW50O1xuICBzZXF1ZW5jZTogbnVtYmVyO1xuICBvbkNsb3NlOiAoKSA9PiB2b2lkO1xuICBvblBhdGNoOiAocGF0Y2g6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB2b2lkO1xuICBvbkRlbGV0ZTogKCkgPT4gdm9pZDtcbiAgb25SZXBseTogKGJvZHk6IHN0cmluZykgPT4gUHJvbWlzZTxib29sZWFuPjtcbn0pIHtcbiAgY29uc3QgZGlhbG9nUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50IHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IHJlcGx5UmVmID0gdXNlUmVmPEhUTUxUZXh0QXJlYUVsZW1lbnQgfCBudWxsPihudWxsKTtcbiAgY29uc3QgcmFmUmVmID0gdXNlUmVmPG51bWJlciB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbcmVwbHksIHNldFJlcGx5XSA9IHVzZVN0YXRlKCcnKTtcbiAgY29uc3QgW3NlbmRpbmcsIHNldFNlbmRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gIC8vIExpdmUgYW5jaG9yIOKAlCBwb3BvdmVyIHRyYWNrcyB0aGUgcGluIHZpYSByQUYgc28gaXQgc3RheXMgZ2x1ZWQgdG8gaXRzXG4gIC8vIHRhcmdldCB0aHJvdWdoIHBhbiAvIHpvb20gKEZpZ0phbSBwYXJpdHkpLiBXcml0aW5nIHRvIHRoZSBkaWFsb2cgc3R5bGVcbiAgLy8gZGlyZWN0bHkgYXZvaWRzIHJlLXJlbmRlcmluZyBldmVyeSBmcmFtZS5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCB0aWNrID0gKCkgPT4ge1xuICAgICAgcmFmUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgY29uc3Qgbm9kZSA9IGRpYWxvZ1JlZi5jdXJyZW50O1xuICAgICAgaWYgKCFub2RlKSByZXR1cm47XG4gICAgICBjb25zdCBhbmNob3IgPSBjb21wdXRlVGhyZWFkQW5jaG9yKGNvbW1lbnQpO1xuICAgICAgbm9kZS5zdHlsZS5sZWZ0ID0gYCR7TWF0aC5yb3VuZChhbmNob3IueCl9cHhgO1xuICAgICAgbm9kZS5zdHlsZS50b3AgPSBgJHtNYXRoLnJvdW5kKGFuY2hvci55KX1weGA7XG4gICAgICByYWZSZWYuY3VycmVudCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aWNrKTtcbiAgICB9O1xuICAgIHJhZlJlZi5jdXJyZW50ID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRpY2spO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAocmFmUmVmLmN1cnJlbnQgIT0gbnVsbCkgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmUmVmLmN1cnJlbnQpO1xuICAgIH07XG4gIH0sIFtjb21tZW50XSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAvLyBNb3ZlIGZvY3VzIGludG8gdGhlIGRpYWxvZyBvbiBvcGVuLiBQZXIgV0NBRyAyLjEgdGhlIGRpYWxvZyBzaG91bGQgb3duXG4gICAgLy8gaW5pdGlhbCBmb2N1czsgd2UgcHV0IGl0IG9uIHRoZSBkaWFsb2cgcm9vdCAoZm9jdXNhYmxlIHZpYSB0YWJpbmRleClcbiAgICAvLyBzbyBzY3JlZW4gcmVhZGVycyBhbm5vdW5jZSB0aGUgaGVhZGVyIGJlZm9yZSB0aGUgYm9keS4gT24gY2xvc2UsXG4gICAgLy8gcmV0dXJuIGZvY3VzIHRvIHRoZSBwaW4gc28ga2V5Ym9hcmQgdXNlcnMgbGFuZCB3aGVyZSB0aGV5IHN0YXJ0ZWQuXG4gICAgZGlhbG9nUmVmLmN1cnJlbnQ/LmZvY3VzKCk7XG4gICAgY29uc3QgcGluSWQgPSBjb21tZW50LmlkO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjb25zdCBwaW4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxCdXR0b25FbGVtZW50PihgW2RhdGEtY29tbWVudC1waW49XCIke3BpbklkfVwiXWApO1xuICAgICAgcGluPy5mb2N1cygpO1xuICAgIH07XG4gIH0sIFtjb21tZW50LmlkXSk7XG5cbiAgLy8gRXNjLXRvLWNsb3NlIHdoaWxlIGZvY3VzIGlzIGFueXdoZXJlIGluc2lkZSB0aGUgcG9wb3Zlci5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykgcmV0dXJuO1xuICAgIGNvbnN0IG9uS2V5ID0gKGU6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgIGlmIChlLmtleSAhPT0gJ0VzY2FwZScpIHJldHVybjtcbiAgICAgIGNvbnN0IHJvb3QgPSBkaWFsb2dSZWYuY3VycmVudDtcbiAgICAgIGlmICghcm9vdCkgcmV0dXJuO1xuICAgICAgaWYgKHJvb3QuY29udGFpbnMoZS50YXJnZXQgYXMgTm9kZSkgfHwgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gcm9vdCkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIG9uQ2xvc2UoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBvbktleSk7XG4gICAgcmV0dXJuICgpID0+IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBvbktleSk7XG4gIH0sIFtvbkNsb3NlXSk7XG5cbiAgY29uc3QgdHJ5U2VuZFJlcGx5ID0gdXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHYgPSByZXBseS50cmltKCk7XG4gICAgaWYgKCF2IHx8IHNlbmRpbmcpIHJldHVybjtcbiAgICBzZXRTZW5kaW5nKHRydWUpO1xuICAgIGNvbnN0IG9rID0gYXdhaXQgb25SZXBseSh2KTtcbiAgICBzZXRTZW5kaW5nKGZhbHNlKTtcbiAgICBpZiAob2spIHtcbiAgICAgIHNldFJlcGx5KCcnKTtcbiAgICAgIHJlcGx5UmVmLmN1cnJlbnQ/LmZvY3VzKCk7XG4gICAgfVxuICB9LCBbcmVwbHksIHNlbmRpbmcsIG9uUmVwbHldKTtcblxuICBjb25zdCBvblJlcGx5S2V5RG93biA9IHVzZUNhbGxiYWNrKFxuICAgIChlOiBSZWFjdC5LZXlib2FyZEV2ZW50PEhUTUxUZXh0QXJlYUVsZW1lbnQ+KSA9PiB7XG4gICAgICBpZiAoKGUubWV0YUtleSB8fCBlLmN0cmxLZXkpICYmIGUua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdm9pZCB0cnlTZW5kUmVwbHkoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFt0cnlTZW5kUmVwbHldXG4gICk7XG5cbiAgY29uc3QgaGVhZElkID0gYGNtLXRocmVhZC1oZWFkLSR7Y29tbWVudC5pZH1gO1xuICBjb25zdCBzZWxlY3RvckNoaXAgPSBmb3JtYXRTZWxlY3RvckNoaXAoY29tbWVudC5zZWxlY3RvciwgJycpO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgcmVmPXtkaWFsb2dSZWZ9XG4gICAgICBjbGFzc05hbWU9XCJjbS10aHJlYWRcIlxuICAgICAgcm9sZT1cImRpYWxvZ1wiXG4gICAgICBhcmlhLWxhYmVsbGVkYnk9e2hlYWRJZH1cbiAgICAgIHRhYkluZGV4PXstMX1cbiAgICAgIG9uQ2xpY2s9eyhlKSA9PiBlLnN0b3BQcm9wYWdhdGlvbigpfVxuICAgICAgb25Qb2ludGVyRG93bj17KGUpID0+IGUuc3RvcFByb3BhZ2F0aW9uKCl9XG4gICAgPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJjbS10aHJlYWRfX2hlYWRcIiBpZD17aGVhZElkfT5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjbS10aHJlYWRfX2hlYWQtcm93XCI+XG4gICAgICAgICAgey8qIFBsYW4gQyBQMTgg4oCUIHBpbi9zZXF1ZW5jZSBiYWRnZSBpbiB0aGUgcG9wb3ZlciBoZWFkZXIgKHBhcml0eSB3aXRoXG4gICAgICAgICAgICAgIGAuZGVzaWduL3VpL1N0dWRpby50c3hgIHRocmVhZCBwb3BvdmVyKS4gKi99XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiY20tdGhyZWFkX19zZXFcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgIHtzZXF1ZW5jZX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiY20tdGhyZWFkX19hdXRob3JcIj57Y29tbWVudC5hdXRob3I/LnRyaW0oKSB8fCAndW5rbm93bid9PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImNtLXRocmVhZF9fdGltZVwiPntmb3JtYXRSZWxhdGl2ZVRpbWUoY29tbWVudC5jcmVhdGVkKX08L3NwYW4+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJjbS10aHJlYWRfX2Nsb3NlXCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJDbG9zZSB0aHJlYWRcIlxuICAgICAgICAgICAgdGl0bGU9XCJDbG9zZSDCtyBFc2NcIlxuICAgICAgICAgICAgb25DbGljaz17b25DbG9zZX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICDDl1xuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAge3NlbGVjdG9yQ2hpcCA/IDxjb2RlIGNsYXNzTmFtZT1cImNtLXRocmVhZF9fc2VsZWN0b3JcIj57c2VsZWN0b3JDaGlwfTwvY29kZT4gOiBudWxsfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY20tdGhyZWFkX19ib2R5XCI+e3JlbmRlckJvZHlXaXRoTWVudGlvbnMoY29tbWVudC50ZXh0KX08L2Rpdj5cblxuICAgICAgeyhjb21tZW50LnRocmVhZCA/PyBbXSkubWFwKChyKSA9PiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY20tdGhyZWFkX19yZXBseVwiIGtleT17ci5pZH0+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjbS10aHJlYWRfX3JlcGx5LWhlYWRcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImNtLXRocmVhZF9fcmVwbHktYXV0aG9yXCI+e3IuYXV0aG9yPy50cmltKCkgfHwgJ3Vua25vd24nfTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImNtLXRocmVhZF9fcmVwbHktdGltZVwiPntmb3JtYXRSZWxhdGl2ZVRpbWUoci5jcmVhdGVkKX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjbS10aHJlYWRfX3JlcGx5LWJvZHlcIj57cmVuZGVyQm9keVdpdGhNZW50aW9ucyhyLmJvZHkpfTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICkpfVxuXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImNtLXRocmVhZF9fcmVwbHktZm9ybVwiPlxuICAgICAgICA8TWVudGlvbkF3YXJlVGV4dGFyZWFcbiAgICAgICAgICB0ZXh0YXJlYVJlZj17cmVwbHlSZWZ9XG4gICAgICAgICAgY2xhc3NOYW1lPVwiY20tdGhyZWFkX19yZXBseS10ZXh0YXJlYVwiXG4gICAgICAgICAgdmFsdWU9e3JlcGx5fVxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiUmVwbHnigKYg4oyY4oa1IHRvIHNlbmQgwrcgQG5hbWUgdG8gdGFnXCJcbiAgICAgICAgICBvbkNoYW5nZT17c2V0UmVwbHl9XG4gICAgICAgICAgb25LZXlEb3duPXtvblJlcGx5S2V5RG93bn1cbiAgICAgICAgICByb3dzPXsyfVxuICAgICAgICAgIGFyaWFMYWJlbD1cIlJlcGx5XCJcbiAgICAgICAgICBkaXNhYmxlZD17c2VuZGluZ31cbiAgICAgICAgLz5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjbS10aHJlYWRfX3JlcGx5LWFjdGlvbnNcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImNtLWJ0biBjbS1idG4tLXByaW1hcnlcIlxuICAgICAgICAgICAgZGlzYWJsZWQ9eyFyZXBseS50cmltKCkgfHwgc2VuZGluZ31cbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHZvaWQgdHJ5U2VuZFJlcGx5KCl9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgU2VuZFxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImNtLXRocmVhZF9fYWN0aW9uc1wiPlxuICAgICAgICB7Y29tbWVudC5zdGF0dXMgPT09ICdyZXNvbHZlZCcgPyAoXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3NOYW1lPVwiY20tYnRuXCIgb25DbGljaz17KCkgPT4gb25QYXRjaCh7IHN0YXR1czogJ29wZW4nIH0pfT5cbiAgICAgICAgICAgIOKGuiBSZW9wZW5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImNtLWJ0biBjbS1idG4tLXByaW1hcnlcIlxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICBvblBhdGNoKHsgc3RhdHVzOiAncmVzb2x2ZWQnIH0pO1xuICAgICAgICAgICAgICBvbkNsb3NlKCk7XG4gICAgICAgICAgICB9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIOKckyBSZXNvbHZlXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICl9XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzc05hbWU9XCJjbS1idG4gY20tYnRuLS1kYW5nZXJcIlxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgIG9uRGVsZXRlKCk7XG4gICAgICAgICAgICBvbkNsb3NlKCk7XG4gICAgICAgICAgfX1cbiAgICAgICAgPlxuICAgICAgICAgIERlbGV0ZVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEJvZHkgcmVuZGVyZXIg4oCUIHNwbGl0cyB0ZXh0IG9uIEAtaGFuZGxlcywgd3JhcHMgZWFjaCBpbiA8c3Ryb25nPi4gQW55dGhpbmdcbi8vIG5vdCBtYXRjaGluZyB0aGUgbWVudGlvbiByZWdleCBzdGF5cyBwbGFpbiB0ZXh0IChuZXdsaW5lcyBwcmVzZXJ2ZWQgYnkgQ1NTXG4vLyBgd2hpdGUtc3BhY2U6IHByZS13cmFwYCkuXG5cbmZ1bmN0aW9uIHJlbmRlckJvZHlXaXRoTWVudGlvbnModGV4dDogc3RyaW5nKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgaWYgKCF0ZXh0KSByZXR1cm4gbnVsbDtcbiAgY29uc3QgcmUgPSAvKEBbXFx3XVtcXHcuLV0qKS9nO1xuICBjb25zdCBwYXJ0cyA9IHRleHQuc3BsaXQocmUpO1xuICByZXR1cm4gcGFydHMubWFwKChwYXJ0LCBpKSA9PiB7XG4gICAgLy8gVGhlIHNwbGl0IHBvc2l0aW9ucyBBUkUgdGhlIGlkZW50aXR5IGhlcmUg4oCUIGZvciB0aGUgc2FtZSBgdGV4dGAgaW5wdXQsXG4gICAgLy8gaW5kZXggYGlgIGFsd2F5cyBtYXBzIHRvIHRoZSBzYW1lIGZyYWdtZW50LiBDb21wb3NlIGtleSBmcm9tIGluZGV4ICtcbiAgICAvLyBjb250ZW50IHNvIGJpb21lJ3MgYXJyYXktaW5kZXgta2V5IGhldXJpc3RpYyBpcyBzYXRpc2ZpZWQgQU5EIHJlb3JkZXJcbiAgICAvLyByZXNpc3RhbmNlIGlzIGludGFjdCBpZiBgdGV4dGAgbXV0YXRlcyBtaWQtcmVuZGVyLlxuICAgIGNvbnN0IGtleSA9IGAke2l9OiR7cGFydH1gO1xuICAgIGlmIChpICUgMiA9PT0gMSkge1xuICAgICAgLy8gT2RkIHBhcnRzIGFyZSB0aGUgY2FwdHVyZWQgQGhhbmRsZXMgdGhhbmtzIHRvIHRoZSBwYXJlbnRoZXNpemVkIHNwbGl0LlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPHN0cm9uZyBrZXk9e2tleX0gZGF0YS1tZW50aW9uPVwidHJ1ZVwiPlxuICAgICAgICAgIHtwYXJ0fVxuICAgICAgICA8L3N0cm9uZz5cbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiA8c3BhbiBrZXk9e2tleX0+e3BhcnR9PC9zcGFuPjtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFJlbGF0aXZlVGltZShpc286IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghaXNvKSByZXR1cm4gJyc7XG4gIGNvbnN0IHQgPSBEYXRlLnBhcnNlKGlzbyk7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHQpKSByZXR1cm4gJyc7XG4gIGNvbnN0IGRpZmZTZWMgPSBNYXRoLnJvdW5kKChEYXRlLm5vdygpIC0gdCkgLyAxMDAwKTtcbiAgaWYgKGRpZmZTZWMgPCA2MCkgcmV0dXJuIGAke01hdGgubWF4KGRpZmZTZWMsIDApfXMgYWdvYDtcbiAgaWYgKGRpZmZTZWMgPCAzNjAwKSByZXR1cm4gYCR7TWF0aC5yb3VuZChkaWZmU2VjIC8gNjApfW0gYWdvYDtcbiAgaWYgKGRpZmZTZWMgPCA4Nl80MDApIHJldHVybiBgJHtNYXRoLnJvdW5kKGRpZmZTZWMgLyAzNjAwKX1oIGFnb2A7XG4gIHJldHVybiBgJHtNYXRoLnJvdW5kKGRpZmZTZWMgLyA4Nl80MDApfWQgYWdvYDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0U2VsZWN0b3JDaGlwKHNlbGVjdG9yOiBzdHJpbmcsIGZhbGxiYWNrOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIXNlbGVjdG9yKSByZXR1cm4gZmFsbGJhY2s7XG4gIGNvbnN0IGNkID0gc2VsZWN0b3IubWF0Y2goL2RhdGEtY2QtaWQ9XCIoW15cIl0rKVwiLyk7XG4gIGlmIChjZCkgcmV0dXJuIGBjZDoke2NkWzFdfWA7XG4gIHJldHVybiBzZWxlY3Rvci5sZW5ndGggPiAzNiA/IGAke3NlbGVjdG9yLnNsaWNlKDAsIDMzKX3igKZgIDogc2VsZWN0b3I7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVUaHJlYWRBbmNob3IoY29tbWVudDogT3ZlcmxheUNvbW1lbnQpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0ge1xuICAvLyBSZXNvbHZlIHRhcmdldCdzIGxpdmUgc2NyZWVuIHJlY3Q7IHBvcG92ZXIgZHJvcHMgYmVsb3cgdGhlIHBpbiB3aXRoIHNtYWxsXG4gIC8vIGJyZWF0aGluZyByb29tLiBTdG9yZWQgYm91bmRzIChjYXB0dXJlLXRpbWUgc2NyZWVuIGNvb3JkcykgYXJlIHRoZVxuICAvLyBsYXN0LXJlc29ydCBmYWxsYmFjayBmb3Igb3JwaGFuZWQgcGlucy5cbiAgY29uc3QgcmVjdCA9IGNvbW1lbnQuc2VsZWN0b3IgPyBzY3JlZW5SZWN0Rm9yKGNvbW1lbnQuc2VsZWN0b3IsIGNvbW1lbnQuaW5kZXgpIDogbnVsbDtcbiAgaWYgKHJlY3QpIHtcbiAgICAvLyBQaW4gc2l0cyBhdCAocmVjdC5yaWdodCAtIDEyLCByZWN0LnRvcCAtIDEyKS4gUGxhY2UgcG9wb3ZlciBhdCB0aGUgc2FtZVxuICAgIC8vIHggZm9yIHZpc3VhbCBjb250aW51aXR5LCAxNnB4IGJlbG93IHRoZSB0b3Agc28gaXQgY2xlYXJzIHRoZSBwaW4uXG4gICAgcmV0dXJuIHsgeDogcmVjdC54ICsgcmVjdC53IC0gMTIsIHk6IHJlY3QueSArIDE2IH07XG4gIH1cbiAgaWYgKGNvbW1lbnQuYm91bmRzKSB7XG4gICAgcmV0dXJuIHsgeDogY29tbWVudC5ib3VuZHMueCArIGNvbW1lbnQuYm91bmRzLncgLSAxMiwgeTogY29tbWVudC5ib3VuZHMueSArIDE2IH07XG4gIH1cbiAgcmV0dXJuIHsgeDogMTYsIHk6IDE2IH07XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVBbmNob3Ioc3RhdGU6IENvbXBvc2VyU3RhdGUpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0ge1xuICAvLyBHNCDigJQgYW5jaG9yIHRvIHRoZSBjdXJzb3IgY2xpY2sgcG9pbnQgZmlyc3QuIEVhcmxpZXIgdmVyc2lvbnMgYW5jaG9yZWQgdG9cbiAgLy8gdGhlIHNlbGVjdGVkIGVsZW1lbnQncyBib3R0b20tbGVmdCwgd2hpY2ggbGFuZGVkIHRoZSBjb21wb3NlciBmbHVzaCBpblxuICAvLyB0aGUgY29ybmVyIHJlZ2FyZGxlc3Mgb2Ygd2hlcmUgdGhlIHVzZXIgY2xpY2tlZCDigJQgc3VycHJpc2luZyBmb3IgdGhlXG4gIC8vIGNvbW1vbiBjYXNlIG9mIFwiSSBjbGlja2VkIHRoZSBtaWRkbGUgb2YgYW4gZWxlbWVudCwgZXhwZWN0aW5nIHRoZVxuICAvLyBjb21wb3NlciB0byBhcHBlYXIgbmVhciBteSBjdXJzb3JcIi4gVGhlIGVsZW1lbnQtcmVjdCBwYXRoIHJlbWFpbnMgYXMgYVxuICAvLyBmYWxsYmFjayBmb3IgZW50cnkgcG9pbnRzIHRoYXQgZG9uJ3QgY2FycnkgYSBjdXJzb3IgKGUuZy4gb3BlbmluZyB0aGVcbiAgLy8gY29tcG9zZXIgZnJvbSBhIGNvbnRleHR1YWwgdG9vbGJhciBidXR0b24g4oCUIHRob3NlIHNob3VsZCBzZXQgY2xpZW50WC9ZXG4gIC8vIHRvIGEgc2Vuc2libGUgYW5jaG9yIGJlZm9yZSBkaXNwYXRjaGluZykuXG4gIGlmIChzdGF0ZS5jbGllbnRYIHx8IHN0YXRlLmNsaWVudFkpIHtcbiAgICByZXR1cm4geyB4OiBzdGF0ZS5jbGllbnRYLCB5OiBzdGF0ZS5jbGllbnRZICsgOCB9O1xuICB9XG4gIGlmIChzdGF0ZS5zZWxlY3Rpb24uc2VsZWN0b3IpIHtcbiAgICBjb25zdCByZWN0ID0gc2NyZWVuUmVjdEZvcihzdGF0ZS5zZWxlY3Rpb24uc2VsZWN0b3IsIHN0YXRlLnNlbGVjdGlvbi5pbmRleCk7XG4gICAgaWYgKHJlY3QpIHtcbiAgICAgIHJldHVybiB7IHg6IHJlY3QueCwgeTogcmVjdC55ICsgcmVjdC5oICsgOCB9O1xuICAgIH1cbiAgfVxuICByZXR1cm4geyB4OiAxNiwgeTogMTYgfTtcbn1cbiIsCiAgICAiLyoqXG4gKiBAZmlsZSAgICAgICB1c2UtY29sbGFiLnRzeCDigJQgY2xpZW50LXNpZGUgWWpzIGNvbGxhYiBwcm92aWRlciBmb3IgY2FudmFzIGlmcmFtZXNcbiAqIEBzY29wZSAgICAgIGFwcHMvc3R1ZGlvL3VzZS1jb2xsYWIudHN4XG4gKiBAcHVycG9zZSAgICBNb3VudHMgYSBzaW5nbGUgWS5Eb2MgKyBBd2FyZW5lc3MgcGVyIGNhbnZhcyBpZnJhbWUuIE9wZW5zIGFcbiAqICAgICAgICAgICAgIFdlYlNvY2tldCB0byBgL193cy9jb2xsYWIvOnNsdWdgLCBzcGVha3MgdGhlIHktd2Vic29ja2V0IGJpbmFyeVxuICogICAgICAgICAgICAgcHJvdG9jb2wsIGV4cG9zZXMgaG9va3MgZm9yIHRoZSBjdXJzb3Igb3ZlcmxheSArIFRhc2sgMyBjb21tZW50c1xuICogICAgICAgICAgICAgYmluZGluZy5cbiAqXG4gKiBCb3VuZGFyeTpcbiAqICAgLSBTZXJ2ZXItc2lkZSBlcXVpdmFsZW50IGlzIGBjb2xsYWIvcHJvdG9jb2wudHNgICsgYGNvbGxhYi9yb29tLnRzYC5cbiAqICAgLSBUaGlzIGZpbGUgbWlycm9ycyB0aGUgbWVzc2FnZSBmcmFtaW5nICh2YXJpbnQtcHJlZml4ZWQgc3luYyArIGF3YXJlbmVzc1xuICogICAgIGZyYW1lcykgc28gdGhlIHR3byBzaWRlcyBjb252ZXJnZSBvdmVyIGEgYmluYXJ5IFdTIHdpdGhvdXQgaW50ZXJtZWRpYXRlXG4gKiAgICAgSlNPTi5cbiAqICAgLSBJbXBvcnRzIGB5anNgICsgYHktcHJvdG9jb2xzL3tzeW5jLGF3YXJlbmVzc31gIHZpYSB0aGUgY2FudmFzLXNoZWxsXG4gKiAgICAgaW1wb3J0bWFwIChSVU5USU1FX1BBQ0tBR0VTIGFkZGl0aW9ucykuIENhbnZhcyBidW5kbGVzIHRoYXQgZG9uJ3QgbW91bnRcbiAqICAgICA8Q29sbGFiUHJvdmlkZXI+IG5ldmVyIHJlc29sdmUgdGhlc2Ugc3BlY2lmaWVycyBhbmQgcGF5IHplcm8gYnVuZGxlIGNvc3QuXG4gKi9cblxuaW1wb3J0ICogYXMgZGVjb2RpbmcgZnJvbSAnbGliMC9kZWNvZGluZyc7XG5pbXBvcnQgKiBhcyBlbmNvZGluZyBmcm9tICdsaWIwL2VuY29kaW5nJztcbmltcG9ydCB7XG4gIGNyZWF0ZUNvbnRleHQsXG4gIHR5cGUgUmVhY3ROb2RlLFxuICB1c2VDYWxsYmFjayxcbiAgdXNlQ29udGV4dCxcbiAgdXNlRWZmZWN0LFxuICB1c2VNZW1vLFxuICB1c2VSZWYsXG4gIHVzZVN0YXRlLFxufSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBBd2FyZW5lc3MsIGFwcGx5QXdhcmVuZXNzVXBkYXRlLCBlbmNvZGVBd2FyZW5lc3NVcGRhdGUgfSBmcm9tICd5LXByb3RvY29scy9hd2FyZW5lc3MnO1xuaW1wb3J0IHsgcmVhZFN5bmNNZXNzYWdlLCB3cml0ZVN5bmNTdGVwMSwgd3JpdGVVcGRhdGUgfSBmcm9tICd5LXByb3RvY29scy9zeW5jJztcbmltcG9ydCAqIGFzIFkgZnJvbSAneWpzJztcblxuY29uc3QgTUVTU0FHRV9TWU5DID0gMDtcbmNvbnN0IE1FU1NBR0VfQVdBUkVORVNTID0gMTtcblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBDb2xvciBoYXNoIOKAlCBzdGFibGUgcGVyIHBlZXIgaWRlbnRpdHkuXG5cbi8qKlxuICogZGpiMiBzdHJpbmcgaGFzaCDihpIgT0tMQ0ggY29sb3IgaW4gYSBjdXJhdGVkIHBhbGV0dGUuIERldGVybWluaXNtIHBlclxuICogaW5wdXQgbmFtZSBpcyB0aGUgbG9hZC1iZWFyaW5nIHByb3BlcnR5OiBldmVyeSBwZWVyIGhhc2hpbmcgXCJBbGljZVwiIG11c3RcbiAqIGxhbmQgb24gdGhlIFNBTUUgY29sb3IuXG4gKlxuICogRFMgY29udHJhY3QgKGNvbG9ycy1wcmVzZW5jZSBzcGVjaW1lbik6IHRoZSBBSSBhZ2VudCByaWRlc1xuICogYC0tcHJlc2VuY2UtYWdlbnRgICh2aW9sZXQtbWFnZW50YSwgaHVlIDMyMikg4oCUIFwiYSBodWUgbm8gaHVtYW4gc3RhdGUgdXNlcyxcbiAqIHNvIGF0dHJpYnV0aW9uIG9uIGEgc2hhcmVkIGNhbnZhcyBpcyB1bmFtYmlndW91c1wiLiBIdW1hbiBodWVzIHRoZXJlZm9yZVxuICogRVhDTFVERSB0aGUgYWdlbnQgYmFuZCAofjI5MuKAkzM1MikgQU5EIHRoZSBhY2NlbnQgaW5kaWdvIGJhbmQgKH4yNDXigJMyOTAsXG4gKiByZXNlcnZlZCBmb3Igc2VsZWN0aW9uL2FjdGl2ZSkuIEwvQyBtYXRjaCB0aGUgRFMgcHJlc2VuY2UgdG9rZW5zXG4gKiAob2tsY2gg4omIMC43NCAwLjE2KSBzbyBldmVyeSBjdXJzb3IgcmVhZHMgYXQgdGhlIHNhbWUgd2VpZ2h0IG9uIGJvdGggdGhlbWVzLlxuICovXG5jb25zdCBDT0xPUl9QQUxFVFRFID0gW1xuICAnb2tsY2goMC43MCAwLjE3IDEyKScsIC8vIHJvc2VcbiAgJ29rbGNoKDAuNzIgMC4xNiA0MCknLCAvLyBjb3JhbFxuICAnb2tsY2goMC43OCAwLjE1IDc4KScsIC8vIGFtYmVyICAocHJlc2VuY2UtYXdheSBodWUpXG4gICdva2xjaCgwLjc2IDAuMTYgMTA4KScsIC8vIGxpbWVcbiAgJ29rbGNoKDAuNzQgMC4xNiAxNDUpJywgLy8gZ3JlZW4gIChwcmVzZW5jZS1vbmxpbmUgaHVlKVxuICAnb2tsY2goMC43NSAwLjE0IDE3MiknLCAvLyB0ZWFsXG4gICdva2xjaCgwLjczIDAuMTMgMjAwKScsIC8vIGN5YW5cbiAgJ29rbGNoKDAuNzIgMC4xMyAyMzgpJywgLy8gYmx1ZSAgIChzdGF0dXMtaW5mbyBodWUpXG5dIGFzIGNvbnN0O1xuXG4vKiogVGhlIEFJIGFnZW50J3MgZXhjbHVzaXZlIGN1cnNvci9hdmF0YXIgaHVlIOKAlCBgLS1wcmVzZW5jZS1hZ2VudGAuICovXG5leHBvcnQgY29uc3QgQUdFTlRfQ09MT1IgPSAnb2tsY2goMC43MDAgMC4xOTAgMzIyKSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjb2xvckZvck5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gQ09MT1JfUEFMRVRURSBpcyBhIG5vbi1lbXB0eSBjb25zdCB0dXBsZTsgdGhlIGV4cGxpY2l0IGA/PyAnIzAwMCdgXG4gIC8vIGZhbGxiYWNrIGlzIHVucmVhY2hhYmxlIGJ1dCBzYXRpc2ZpZXMgYG5vVW5jaGVja2VkSW5kZXhlZEFjY2Vzc2AuXG4gIGNvbnN0IEZBTExCQUNLID0gJyMwMDAwMDAnO1xuICBpZiAoIW5hbWUpIHJldHVybiBDT0xPUl9QQUxFVFRFWzBdID8/IEZBTExCQUNLO1xuICBsZXQgaGFzaCA9IDUzODE7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZS5sZW5ndGg7IGkrKykge1xuICAgIGhhc2ggPSAoKGhhc2ggPDwgNSkgKyBoYXNoICsgbmFtZS5jaGFyQ29kZUF0KGkpKSB8IDA7XG4gIH1cbiAgY29uc3QgaWR4ID0gKChoYXNoICUgQ09MT1JfUEFMRVRURS5sZW5ndGgpICsgQ09MT1JfUEFMRVRURS5sZW5ndGgpICUgQ09MT1JfUEFMRVRURS5sZW5ndGg7XG4gIHJldHVybiBDT0xPUl9QQUxFVFRFW2lkeF0gPz8gRkFMTEJBQ0s7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gQXdhcmVuZXNzIHN0YXRlIHNoYXBlLlxuXG5leHBvcnQgaW50ZXJmYWNlIENvbGxhYkF3YXJlbmVzc1N0YXRlIHtcbiAgbmFtZTogc3RyaW5nO1xuICBjb2xvcjogc3RyaW5nO1xuICAvKipcbiAgICogQ3Vyc29yIHBvc2l0aW9uIGluICoqd29ybGQgY29vcmRzKiogKGNhbnZhcy1saWIgdmlld3BvcnQgc3BhY2UpIHNvIGZvcmVpZ25cbiAgICogcGVlcnMgc2VlIHRoZSBzYW1lIGNvbmNlcHR1YWwgcG9pbnQgZXZlbiB3aGVuIHRoZWlyIGxvY2FsIHZpZXdwb3J0IGlzXG4gICAqIHBhbm5lZC96b29tZWQgZGlmZmVyZW50bHkuIE51bGwgPSBwZWVyIGlzIG5vdCBvdmVyIHRoZSBjYW52YXMgc3VyZmFjZS5cbiAgICovXG4gIGN1cnNvcjogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgbnVsbDtcbiAgLyoqXG4gICAqIE1vc3QtcmVjZW50bHkgc2VsZWN0ZWQgZWxlbWVudC4gYGNzc1BhdGhgIGlzIHRoZSBsb2NhdG9yIGlkIGNoYWluIHRoZVxuICAgKiBjYW52YXMtc2hlbGwgYWxyZWFkeSB1c2VzOyBgYm91bmRzYCBhcmUgc2NyZWVuLXB4IHJlY3QgYXQgdGhlIG1vbWVudCBvZlxuICAgKiBwdWJsaXNoIChzbyBpdCdzIGEgaGludCwgbm90IGEgbGl2ZSByZWYpLiBOdWxsIHdoZW4gbm90aGluZyBzZWxlY3RlZC5cbiAgICovXG4gIHNlbGVjdGlvbjogeyBjc3NQYXRoOiBzdHJpbmc7IGJvdW5kczogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgdzogbnVtYmVyOyBoOiBudW1iZXIgfSB9IHwgbnVsbDtcbiAgLyoqXG4gICAqIEN1cnJlbnRseS1zZWxlY3RlZCBhbm5vdGF0aW9uIHN0cm9rZSBJRHMgKFBoYXNlIDUpLiBTdHJva2VzIGFyZSBhZGRyZXNzZWRcbiAgICogYnkgdGhlaXIgc3RhYmxlIGBkYXRhLWlkYCBhdHRyaWJ1dGUsIHNvIHBlZXJzIGNhbiByZXNvbHZlIGhhbG9zIHZpYVxuICAgKiBgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtaWQ9XCI8aWQ+XCJdJylgLiBFbXB0eSB3aGVuIG5vdGhpbmdcbiAgICogYW5ub3RhdGlvbi1zaGFwZWQgaXMgc2VsZWN0ZWQuXG4gICAqL1xuICBhbm5vdGF0aW9uU2VsZWN0aW9uOiBzdHJpbmdbXTtcbiAgdmlld3BvcnQ6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHpvb206IG51bWJlciB9O1xuICAvKipcbiAgICogU2VydmVyLXNpZGUgYGRpc2Nvbm5lY3RgIG1hdGNoZXMgYXdhcmVuZXNzIHN0YXRlcyB0byBvdXRnb2luZyBwZWVycyBieVxuICAgKiB0aGlzIHRva2VuIChtdXN0IGVxdWFsIHRoZSB3cy5kYXRhLmlkIHRoZSBzZXJ2ZXIgYXNzaWducyBhdCB1cGdyYWRlKS5cbiAgICogVW50aWwgdGhlIHNlcnZlciBwdXNoZXMgdGhlIGFzc2lnbmVkIGlkIGJhY2sgdG8gdGhlIGNsaWVudCwgd2UgdXNlIGFcbiAgICogY2xpZW50LWdlbmVyYXRlZCBVVUlEIOKAlCBjb2xsaXNpb25zIGFyZSBuZWdsaWdpYmxlIGFuZCBkaXNjb25uZWN0IGNsZWFudXBcbiAgICogdG9sZXJhdGVzIGEgc3RhbGUgc3RhdGUgKHRoZSBuZXh0IGF3YXJlbmVzcyBHQyBwYXNzIGRyb3BzIGl0KS5cbiAgICovXG4gIF9fY29ubklkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIEZvcmVpZ25Bd2FyZW5lc3MgPSBPbWl0PENvbGxhYkF3YXJlbmVzc1N0YXRlLCAnX19jb25uSWQnPiAmIHsgY2xpZW50SUQ6IG51bWJlciB9O1xuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFVudHJ1c3RlZC1pbnB1dCBzYW5pdGl6YXRpb24gYXQgdGhlIGF3YXJlbmVzcyB0cnVzdCBib3VuZGFyeS5cbi8vXG4vLyBQaGFzZSA4IGF3YXJlbmVzcyB3YXMgbG9vcGJhY2stb25seSDigJQgZXZlcnkgc3RhdGUgY2FtZSBmcm9tIGEgdHJ1c3RlZCBsb2NhbFxuLy8gdGFiLiBQaGFzZSA5IChUYXNrIDUpIGJyaWRnZXMgYXdhcmVuZXNzIHRocm91Z2ggYSBTRU1JLVRSVVNURUQgaHViIChERFItMDU0KSxcbi8vIHNvIGZvcmVpZ24gc3RhdGVzIGFyZSBub3cgYXR0YWNrZXItaW5mbHVlbmNlYWJsZS4gYHVzZUZvcmVpZ25Bd2FyZW5lc3NgIGlzXG4vLyB0aGUgc2luZ2xlIGNob2tlcG9pbnQgd2hlcmUgcmVtb3RlIHN0YXRlIGlzIHJlYWQgYmVmb3JlIGl0IHJlYWNoZXMgdGhlXG4vLyBjdXJzb3IgLyBwYXJ0aWNpcGFudCByZW5kZXIgc2lua3MsIHNvIGFsbCB2YWxpZGF0aW9uIGxpdmVzIGhlcmUuIEZpZWxkcyBhcmVcbi8vIHZhbGlkYXRlZCBmb3IgVkFMVUUsIG5vdCBqdXN0IHR5cGU6XG4vLyAgIC0gY29sb3I6IHJlLWRlcml2ZWQgbG9jYWxseSBmcm9tIHRoZSAoc2FuaXRpemVkKSBuYW1lIGFuZCB0aGUgd2lyZSB2YWx1ZVxuLy8gICAgIGlzIERJU0NBUkRFRCDigJQgYSBodWItY2hvc2VuIGBjb2xvcmAgc3RyaW5nIHdvdWxkIG90aGVyd2lzZSBmbG93IGludG8gYW5cbi8vICAgICBpbmxpbmUgYHN0eWxlYCBhbmQgYSBgdXJsKC4uLilgIHZhbHVlIGJlYWNvbnMgZXZlcnkgdmlld2VyJ3MgYnJvd3Nlci5cbi8vICAgICBUaGUgcGFsZXR0ZSBpcyBkZXRlcm1pbmlzdGljLCBzbyByZS1kZXJpdmF0aW9uIGlzIHZpc3VhbGx5IGlkZW50aWNhbC5cbi8vICAgLSBuYW1lOiBjb250cm9sIC8gYmlkaSAvIHplcm8td2lkdGggY2hhcnMgc3RyaXBwZWQsIGxlbmd0aC1jYXBwZWQg4oCUIGJsb2Nrc1xuLy8gICAgIGlkZW50aXR5IHNwb29maW5nICsgcmVuZGVyIGJsb2F0LlxuLy8gICAtIGN1cnNvciAvIHZpZXdwb3J0OiBmaW5pdGUtbnVtYmVyIGdhdGVkIOKAlCBhIE5hTi9JbmZpbml0eSB3b3VsZCBwb2lzb24gdGhlXG4vLyAgICAgQ1NTIHRyYW5zZm9ybSAvIHRoZSBsb2NhbCB2aWV3cG9ydCBjb250cm9sbGVyIGR1cmluZyBGb2xsb3cgbW9kZS5cbi8vICAgLSBzZWxlY3Rpb24uY3NzUGF0aDogY2hhcnNldCArIGxlbmd0aCBhbGxvd2xpc3QgYmVmb3JlIGl0IHJlYWNoZXNcbi8vICAgICBgcXVlcnlTZWxlY3RvcmAg4oCUIGJsb2NrcyBzZWxlY3Rvci1jb21wbGV4aXR5IERvUyArIGFyYml0cmFyeSBET00gcHJvYmluZy5cbi8vICAgLSBhbm5vdGF0aW9uU2VsZWN0aW9uOiBwZXItaWQgdG9rZW4gKyBhcnJheS1sZW5ndGggY2FwcGVkIOKAlCBibG9ja3MgYVxuLy8gICAgIHF1ZXJ5U2VsZWN0b3IgcmVuZGVyLXN0b3JtLlxuLy8gICAtIHBlZXIgY291bnQgY2FwcGVkIOKAlCBibG9ja3MgYW4gdW5ib3VuZGVkLWNsaWVudHMgbWVtb3J5L3JlbmRlciBEb1MuXG5cbmNvbnN0IE1BWF9GT1JFSUdOX1BFRVJTID0gNjQ7XG5jb25zdCBNQVhfTkFNRV9MRU4gPSA2NDtcbmNvbnN0IE1BWF9DU1NQQVRIX0xFTiA9IDUxMjtcbmNvbnN0IE1BWF9BTk5PVEFUSU9OX0lEUyA9IDI1NjtcbmNvbnN0IE1BWF9BTk5PVEFUSU9OX0lEX0xFTiA9IDEyODtcblxuLy8gQ2hhcnNldCBvZiBldmVyeSBzZWxlY3RvciB0aGUgY2FudmFzLXNoZWxsIGBjc3NQYXRoKClgIGVtaXRzXG4vLyAoYFtkYXRhLSo9XCIuLi5cIl1gLCBgI2lkYCwgYHRhZy5jbHM6bnRoLWNoaWxkKE4pYCwgYCA+IGAgY29tYmluYXRvcnMpLlxuY29uc3QgQ1NTUEFUSF9BTExPV0VEID0gL15bQS1aYS16MC05IC5fIz46W1xcXT1cIicoKS1dKyQvO1xuLy8gYGNzc1BhdGgoKWAgb25seSBldmVyIGVtaXRzIGA6bnRoLWNoaWxkKE4pYCBhcyBhIHBhcmVudGhlc2lzZWQgY29uc3RydWN0LlxuLy8gRnVuY3Rpb25hbCBwc2V1ZG8tY2xhc3NlcyAoYDpoYXMoKWAsIGA6aXMoKWAsIGA6d2hlcmUoKWAsIGA6bm90KClgKSB0cmlnZ2VyXG4vLyBwZXItcmVuZGVyIHN1YnRyZWUgd2Fsa3Mg4oaSIGEgbWFsaWNpb3VzIGh1YiBwZWVyIGNvdWxkIHB1Ymxpc2ggYSBkZWVwbHlcbi8vIG5lc3RlZCBgOmhhcygpYCBzZWxlY3RvciBhbmQgcGluIGV2ZXJ5IHZpZXdlcidzIG1haW4gdGhyZWFkIChxdWVyeVNlbGVjdG9yXG4vLyByZS1ydW5zIGVhY2ggcmVuZGVyKS4gU28gYWZ0ZXIgc3RyaXBwaW5nIHRoZSBsZWdpdCBgOm50aC1jaGlsZC9vZi10eXBlKE4pYFxuLy8gZm9ybXMsIGFueSByZXNpZHVhbCBwYXJlbiBtZWFucyBhIGZ1bmN0aW9uYWwgcHNldWRvIOKAlCByZWplY3QuIFRoZSBjaGFyc2V0XG4vLyBhbGxvd2xpc3QgYWxvbmUgd2FzIHdpZGVyIHRoYW4gdGhlIGdlbmVyYXRvciAodGhlIG9yaWdpbmFsIERvUyBob2xlKS5cbmNvbnN0IENTU1BBVEhfTlRIID0gLzpudGgtKGNoaWxkfG9mLXR5cGUpXFwoXFxkezEsNH1cXCkvZztcbmNvbnN0IEFOTk9UQVRJT05fSURfQUxMT1dFRCA9IC9eW0EtWmEtejAtOS5fOi1dKyQvO1xuXG5mdW5jdGlvbiBpc1NhZmVDc3NQYXRoKHA6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAocC5sZW5ndGggPiBNQVhfQ1NTUEFUSF9MRU4gfHwgIUNTU1BBVEhfQUxMT1dFRC50ZXN0KHApKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHN0cmlwcGVkID0gcC5yZXBsYWNlKENTU1BBVEhfTlRILCAnJyk7XG4gIHJldHVybiAhc3RyaXBwZWQuaW5jbHVkZXMoJygnKSAmJiAhc3RyaXBwZWQuaW5jbHVkZXMoJyknKTtcbn1cblxuZnVuY3Rpb24gaXNGaW5pdGVOdW0odjogdW5rbm93bik6IHYgaXMgbnVtYmVyIHtcbiAgcmV0dXJuIHR5cGVvZiB2ID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUodik7XG59XG5cbi8vIENvbnRyb2wgKEMwL0MxKSwgemVyby13aWR0aCwgYW5kIGJpZGktb3ZlcnJpZGUgY29kZSBwb2ludHMgZ2V0IHN0cmlwcGVkIGZyb21cbi8vIGRpc3BsYXllZCBzdHJpbmdzIHNvIGEgcmVtb3RlIHBlZXIgY2FuJ3Qgc3Bvb2YgYW5vdGhlcidzIGlkZW50aXR5IG9yIGhpZGVcbi8vIHBheWxvYWRzIGluIGxhYmVscy4gQSBjaGFyQ29kZSBzY2FuIChub3QgYSByZWdleCBsaXRlcmFsIHdpdGggcmF3IGNvbnRyb2xcbi8vIGNoYXJzKSBzaWRlc3RlcHMgYmlvbWUncyBub0NvbnRyb2xDaGFyYWN0ZXJzSW5SZWdleCB3aGlsZSBrZWVwaW5nIHRoZSBzYW1lXG4vLyBzZW1hbnRpY3Mg4oCUIHNhbWUgYXBwcm9hY2ggYXMgdGhlIGh1YidzIHNhbml0aXplRm9yTG9nIChERFItMDUzKS5cbmZ1bmN0aW9uIGlzVW5zYWZlQ29kZVBvaW50KGNwOiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjcCA8PSAweDFmIHx8XG4gICAgKGNwID49IDB4N2YgJiYgY3AgPD0gMHg5ZikgfHxcbiAgICAoY3AgPj0gMHgyMDBiICYmIGNwIDw9IDB4MjAwZikgfHxcbiAgICAoY3AgPj0gMHgyMDJhICYmIGNwIDw9IDB4MjAyZSkgfHxcbiAgICAoY3AgPj0gMHgyMDY2ICYmIGNwIDw9IDB4MjA2OSkgfHxcbiAgICBjcCA9PT0gMHhmZWZmXG4gICk7XG59XG5cbmZ1bmN0aW9uIHNhbml0aXplTmFtZShyYXc6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHJhdyAhPT0gJ3N0cmluZycpIHJldHVybiAnYW5vbnltb3VzJztcbiAgbGV0IGNsZWFuZWQgPSAnJztcbiAgZm9yIChjb25zdCBjaCBvZiByYXcpIHtcbiAgICBpZiAoIWlzVW5zYWZlQ29kZVBvaW50KGNoLmNvZGVQb2ludEF0KDApID8/IDApKSBjbGVhbmVkICs9IGNoO1xuICB9XG4gIGNsZWFuZWQgPSBjbGVhbmVkLnRyaW0oKS5zbGljZSgwLCBNQVhfTkFNRV9MRU4pO1xuICByZXR1cm4gY2xlYW5lZCB8fCAnYW5vbnltb3VzJztcbn1cblxuZnVuY3Rpb24gc2FuaXRpemVDdXJzb3IocmF3OiB1bmtub3duKTogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgbnVsbCB7XG4gIGlmICghcmF3IHx8IHR5cGVvZiByYXcgIT09ICdvYmplY3QnKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgYyA9IHJhdyBhcyB7IHg/OiB1bmtub3duOyB5PzogdW5rbm93biB9O1xuICByZXR1cm4gaXNGaW5pdGVOdW0oYy54KSAmJiBpc0Zpbml0ZU51bShjLnkpID8geyB4OiBjLngsIHk6IGMueSB9IDogbnVsbDtcbn1cblxuZnVuY3Rpb24gc2FuaXRpemVWaWV3cG9ydChyYXc6IHVua25vd24pOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6b29tOiBudW1iZXIgfSB7XG4gIGNvbnN0IGZhbGxiYWNrID0geyB4OiAwLCB5OiAwLCB6b29tOiAxIH07XG4gIGlmICghcmF3IHx8IHR5cGVvZiByYXcgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsbGJhY2s7XG4gIGNvbnN0IHYgPSByYXcgYXMgeyB4PzogdW5rbm93bjsgeT86IHVua25vd247IHpvb20/OiB1bmtub3duIH07XG4gIGlmICghaXNGaW5pdGVOdW0odi54KSB8fCAhaXNGaW5pdGVOdW0odi55KSB8fCAhaXNGaW5pdGVOdW0odi56b29tKSB8fCB2Lnpvb20gPD0gMClcbiAgICByZXR1cm4gZmFsbGJhY2s7XG4gIHJldHVybiB7IHg6IHYueCwgeTogdi55LCB6b29tOiB2Lnpvb20gfTtcbn1cblxuZnVuY3Rpb24gc2FuaXRpemVTZWxlY3Rpb24ocmF3OiB1bmtub3duKTogQ29sbGFiQXdhcmVuZXNzU3RhdGVbJ3NlbGVjdGlvbiddIHtcbiAgaWYgKCFyYXcgfHwgdHlwZW9mIHJhdyAhPT0gJ29iamVjdCcpIHJldHVybiBudWxsO1xuICBjb25zdCBzID0gcmF3IGFzIHsgY3NzUGF0aD86IHVua25vd247IGJvdW5kcz86IHVua25vd24gfTtcbiAgY29uc3QgYiA9IHMuYm91bmRzIGFzIHsgeD86IHVua25vd247IHk/OiB1bmtub3duOyB3PzogdW5rbm93bjsgaD86IHVua25vd24gfSB8IHVuZGVmaW5lZDtcbiAgY29uc3QgYm91bmRzID1cbiAgICBiICYmIGlzRmluaXRlTnVtKGIueCkgJiYgaXNGaW5pdGVOdW0oYi55KSAmJiBpc0Zpbml0ZU51bShiLncpICYmIGlzRmluaXRlTnVtKGIuaClcbiAgICAgID8geyB4OiBiLngsIHk6IGIueSwgdzogYi53LCBoOiBiLmggfVxuICAgICAgOiBudWxsO1xuICAvLyBPbmx5IGtlZXAgY3NzUGF0aCBpZiBpdCBtYXRjaGVzIHRoZSBsb2NhdG9yIGdyYW1tYXIg4oCUIG90aGVyd2lzZSBkcm9wIGl0IGFuZFxuICAvLyBsZXQgdGhlIHJlbmRlcmVyIGZhbGwgYmFjayB0byB0aGUgKHZhbGlkYXRlZCkgYm91bmRzLlxuICBjb25zdCBjc3NQYXRoID0gdHlwZW9mIHMuY3NzUGF0aCA9PT0gJ3N0cmluZycgJiYgaXNTYWZlQ3NzUGF0aChzLmNzc1BhdGgpID8gcy5jc3NQYXRoIDogJyc7XG4gIGlmICghY3NzUGF0aCAmJiAhYm91bmRzKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIHsgY3NzUGF0aCwgYm91bmRzOiBib3VuZHMgPz8geyB4OiAwLCB5OiAwLCB3OiAwLCBoOiAwIH0gfTtcbn1cblxuZnVuY3Rpb24gc2FuaXRpemVBbm5vdGF0aW9uU2VsZWN0aW9uKHJhdzogdW5rbm93bik6IHN0cmluZ1tdIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHJhdykpIHJldHVybiBbXTtcbiAgY29uc3Qgb3V0OiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGlkIG9mIHJhdykge1xuICAgIGlmIChvdXQubGVuZ3RoID49IE1BWF9BTk5PVEFUSU9OX0lEUykgYnJlYWs7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIGlkID09PSAnc3RyaW5nJyAmJlxuICAgICAgaWQubGVuZ3RoIDw9IE1BWF9BTk5PVEFUSU9OX0lEX0xFTiAmJlxuICAgICAgQU5OT1RBVElPTl9JRF9BTExPV0VELnRlc3QoaWQpXG4gICAgKVxuICAgICAgb3V0LnB1c2goaWQpO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgKyBub3JtYWxpemUgb25lIGZvcmVpZ24gYXdhcmVuZXNzIHN0YXRlIGF0IHRoZSB0cnVzdCBib3VuZGFyeS5cbiAqIFJldHVybnMgbnVsbCBmb3Igc3RhdGVzIHRoYXQgY2FuJ3QgYmUgYSBwZWVyIChubyB1c2FibGUgbmFtZSkuIGBjb2xvcmAgaXNcbiAqIGFsd2F5cyByZS1kZXJpdmVkIGxvY2FsbHkgZnJvbSB0aGUgc2FuaXRpemVkIG5hbWUg4oCUIHRoZSB3aXJlIHZhbHVlIGlzIG5ldmVyXG4gKiB0cnVzdGVkLCB3aGljaCBpcyB3aGF0IGNsb3NlcyB0aGUgaHViIENTUy1gdXJsKClgIGV4ZmlsIGNoYW5uZWwuIEV4cG9ydGVkIHNvXG4gKiB0aGUgaG9zdGlsZS1pbnB1dCBtYXRyaXggY2FuIGV4ZXJjaXNlIGl0IHdpdGhvdXQgYSBSZWFjdCBoYXJuZXNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2FuaXRpemVGb3JlaWduU3RhdGUoY2xpZW50SUQ6IG51bWJlciwgc3RhdGU6IHVua25vd24pOiBGb3JlaWduQXdhcmVuZXNzIHwgbnVsbCB7XG4gIGlmICghc3RhdGUgfHwgdHlwZW9mIHN0YXRlICE9PSAnb2JqZWN0JykgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHMgPSBzdGF0ZSBhcyBQYXJ0aWFsPENvbGxhYkF3YXJlbmVzc1N0YXRlPjtcbiAgaWYgKHR5cGVvZiBzLm5hbWUgIT09ICdzdHJpbmcnKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgbmFtZSA9IHNhbml0aXplTmFtZShzLm5hbWUpO1xuICByZXR1cm4ge1xuICAgIGNsaWVudElELFxuICAgIG5hbWUsXG4gICAgY29sb3I6IGNvbG9yRm9yTmFtZShuYW1lKSxcbiAgICBjdXJzb3I6IHNhbml0aXplQ3Vyc29yKHMuY3Vyc29yKSxcbiAgICBzZWxlY3Rpb246IHNhbml0aXplU2VsZWN0aW9uKHMuc2VsZWN0aW9uKSxcbiAgICBhbm5vdGF0aW9uU2VsZWN0aW9uOiBzYW5pdGl6ZUFubm90YXRpb25TZWxlY3Rpb24ocy5hbm5vdGF0aW9uU2VsZWN0aW9uKSxcbiAgICB2aWV3cG9ydDogc2FuaXRpemVWaWV3cG9ydChzLnZpZXdwb3J0KSxcbiAgfTtcbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBDb250ZXh0LlxuXG5pbnRlcmZhY2UgQ29sbGFiVmFsdWUge1xuICBkb2M6IFkuRG9jO1xuICAvKipcbiAgICogU0VDVVJJVFkgSU5WQVJJQU5UOiBpbiBsaW5rZWQgbW9kZSB0aGlzIEF3YXJlbmVzcyBjYXJyaWVzIHN0YXRlcyByZWxheWVkXG4gICAqIGZyb20gYSBTRU1JLVRSVVNURUQgaHViIChERFItMDU0KS4gRm9yZWlnbiBzdGF0ZXMgYXJlIHVudHJ1c3RlZCBpbnB1dCDigJRcbiAgICogcmVhZCB0aGVtIE9OTFkgdGhyb3VnaCBgdXNlRm9yZWlnbkF3YXJlbmVzc2AsIHdoaWNoIHNhbml0aXplcyBldmVyeSBmaWVsZFxuICAgKiBhdCB0aGUgdHJ1c3QgYm91bmRhcnkgKGBzYW5pdGl6ZUZvcmVpZ25TdGF0ZWApLiBEbyBOT1QgY2FsbFxuICAgKiBgYXdhcmVuZXNzLmdldFN0YXRlcygpYCBkaXJlY3RseSBpbiByZW5kZXIgY29kZTsgdGhhdCBieXBhc3NlcyB0aGUgZ2F0ZS5cbiAgICovXG4gIGF3YXJlbmVzczogQXdhcmVuZXNzO1xuICAvKiogTG9jYWwgcGVlcidzIHNlc3Npb24tc3RhYmxlIGNvbG9yIChkZXJpdmVkIGZyb20gZ2l0IHVzZXIubmFtZSkuICovXG4gIG15Q29sb3I6IHN0cmluZztcbiAgLyoqIExvY2FsIHBlZXIncyBkaXNwbGF5IG5hbWUgKGdpdCB1c2VyLm5hbWUgb3IgYW5vbnltb3VzIGZhbGxiYWNrKS4gKi9cbiAgbXlOYW1lOiBzdHJpbmc7XG4gIC8qKiBMb2NhbCBwZWVyJ3MgY29ubmVjdGlvbiBpZCAobWF0Y2hlcyBzZXJ2ZXItc2lkZSB3cy5kYXRhLmlkIHBhdHRlcm4pLiAqL1xuICBteUNvbm5JZDogc3RyaW5nO1xuICAvKiogVHJ1ZSB3aGVuIHRoZSBXUyBpcyBPUEVOLiBDdXJzb3Igb3ZlcmxheSBjYW4gdXNlIHRoaXMgdG8gZ2F0ZSByZW5kZXJpbmcuICovXG4gIGNvbm5lY3RlZDogYm9vbGVhbjtcbiAgLyoqIFB1Ymxpc2ggKGRlYm91bmNlLWNvYWxlc2NlZCkgYW4gdXBkYXRlZCBsb2NhbCBhd2FyZW5lc3Mgc3RhdGUuICovXG4gIHB1Ymxpc2hBd2FyZW5lc3M6IChwYXRjaDogUGFydGlhbDxPbWl0PENvbGxhYkF3YXJlbmVzc1N0YXRlLCAnX19jb25uSWQnPj4pID0+IHZvaWQ7XG59XG5cbmNvbnN0IENvbGxhYkNvbnRleHQgPSBjcmVhdGVDb250ZXh0PENvbGxhYlZhbHVlIHwgbnVsbD4obnVsbCk7XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VDb2xsYWIoKTogQ29sbGFiVmFsdWUgfCBudWxsIHtcbiAgcmV0dXJuIHVzZUNvbnRleHQoQ29sbGFiQ29udGV4dCk7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gSG9vazogZm9yZWlnbiBhd2FyZW5lc3MgcGVlcnMgKHRoZSBjdXJzb3Igb3ZlcmxheSBzdWJzY3JpYmVzIHRvIHRoaXMpLlxuXG4vKipcbiAqIFJldHVybnMgdGhlIGN1cnJlbnQgc2V0IG9mIGZvcmVpZ24gcGVlcnMgKGV4Y2x1ZGVzIHRoZSBsb2NhbCBjbGllbnQpLiBUaGVcbiAqIHJldHVybmVkIGFycmF5IGlzIHN0YWJsZS1yZWZlcmVuY2UgYmV0d2VlbiBhd2FyZW5lc3MgdXBkYXRlcyDigJQgdXNlZnVsIGZvclxuICogZG93bnN0cmVhbSBSZWFjdC5tZW1vIGN1cnNvciBjb21wb25lbnRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRm9yZWlnbkF3YXJlbmVzcygpOiBGb3JlaWduQXdhcmVuZXNzW10ge1xuICBjb25zdCBjb2xsYWIgPSB1c2VDb2xsYWIoKTtcbiAgY29uc3QgW3BlZXJzLCBzZXRQZWVyc10gPSB1c2VTdGF0ZTxGb3JlaWduQXdhcmVuZXNzW10+KFtdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghY29sbGFiKSB7XG4gICAgICBzZXRQZWVycyhbXSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHsgYXdhcmVuZXNzIH0gPSBjb2xsYWI7XG4gICAgZnVuY3Rpb24gY29tcHV0ZSgpOiBGb3JlaWduQXdhcmVuZXNzW10ge1xuICAgICAgY29uc3Qgb3V0OiBGb3JlaWduQXdhcmVuZXNzW10gPSBbXTtcbiAgICAgIGNvbnN0IG15SWQgPSBhd2FyZW5lc3MuY2xpZW50SUQ7XG4gICAgICBmb3IgKGNvbnN0IFtjbGllbnRJRCwgc3RhdGVdIG9mIGF3YXJlbmVzcy5nZXRTdGF0ZXMoKSBhcyBNYXA8bnVtYmVyLCB1bmtub3duPikge1xuICAgICAgICBpZiAoY2xpZW50SUQgPT09IG15SWQpIGNvbnRpbnVlO1xuICAgICAgICBpZiAob3V0Lmxlbmd0aCA+PSBNQVhfRk9SRUlHTl9QRUVSUykgYnJlYWs7IC8vIGJvdW5kIERvUyB2aWEgdW5ib3VuZGVkIHBlZXJzXG4gICAgICAgIC8vIFNhbml0aXplIGV2ZXJ5IG5vdy1yZW1vdGUgZmllbGQgYXQgdGhpcyB0cnVzdCBib3VuZGFyeSAoVGFzayA1KS5cbiAgICAgICAgY29uc3QgcGVlciA9IHNhbml0aXplRm9yZWlnblN0YXRlKGNsaWVudElELCBzdGF0ZSk7XG4gICAgICAgIGlmIChwZWVyKSBvdXQucHVzaChwZWVyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuICAgIHNldFBlZXJzKGNvbXB1dGUoKSk7XG4gICAgY29uc3Qgb25DaGFuZ2UgPSAoKSA9PiBzZXRQZWVycyhjb21wdXRlKCkpO1xuICAgIGF3YXJlbmVzcy5vbignY2hhbmdlJywgb25DaGFuZ2UpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBhd2FyZW5lc3Mub2ZmKCdjaGFuZ2UnLCBvbkNoYW5nZSk7XG4gICAgfTtcbiAgfSwgW2NvbGxhYl0pO1xuXG4gIHJldHVybiBwZWVycztcbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBTbHVnIGRlcml2YXRpb24g4oCUIG11c3QgbWF0Y2ggYGFwaS5maWxlU2x1Z2Agc2VydmVyLXNpZGUuXG5cbi8qKlxuICogTWlycm9yIG9mIHNlcnZlci1zaWRlIGBhcGkuZmlsZVNsdWdgLiBUaGUgaW5wdXQgaXMgdGhlIGNhbnZhcyBwYXRoIGFzIHRoZVxuICogc2hlbGwgc3RvcmVkIGl0IG9uIGB3aW5kb3cuX19jYW52YXNfbWV0YV9maWxlX19gIChlLmcuIGAuZGVzaWduL3VpL0Zvby50c3hgKS5cbiAqIFN0cmlwIHRoZSBkZXNpZ25SZWwgcHJlZml4IChyZWFkIGZyb20gYHdpbmRvdy5fX2NhbnZhc19kZXNpZ25fcmVsX19gLCBzZXRcbiAqIGJ5IF9zaGVsbC5odG1sKSBzbyBib3RoIHNpZGVzIGxhbmQgb24gdGhlIHNhbWUgc2x1ZyDigJQgd2l0aG91dCB0aGlzIGJvdGhcbiAqIHRhYnMgb3BlbiBhIGBkZXNpZ24tdWktZm9vYCByb29tIHdoaWxlIHRoZSBzZXJ2ZXIncyBpbnNwZWN0b3IgYnJpZGdlXG4gKiBwdXNoZXMgaW50byBgdWktZm9vYCwgYW5kIHRoZSByb29tcyBuZXZlciBjb252ZXJnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbnZhc1NsdWdGcm9tUGF0aChjYW52YXNSZWw6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKCFjYW52YXNSZWwpIHJldHVybiBudWxsO1xuICBsZXQgcCA9IGNhbnZhc1JlbC5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCAnJyk7XG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgIGNvbnN0IHcgPSB3aW5kb3cgYXMgdW5rbm93biBhcyB7IF9fY2FudmFzX2Rlc2lnbl9yZWxfXz86IHN0cmluZyB9O1xuICAgIGNvbnN0IGRlc2lnblJlbCA9ICh3Ll9fY2FudmFzX2Rlc2lnbl9yZWxfXyA/PyAnJykucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgJycpO1xuICAgIGlmIChkZXNpZ25SZWwgJiYgcC5zdGFydHNXaXRoKGAke2Rlc2lnblJlbH0vYCkpIHAgPSBwLnNsaWNlKGRlc2lnblJlbC5sZW5ndGggKyAxKTtcbiAgfVxuICBjb25zdCBzbHVnID0gcFxuICAgIC5yZXBsYWNlKC9cXC8vZywgJy0nKVxuICAgIC5yZXBsYWNlKC9cXHMrL2csICdfJylcbiAgICAucmVwbGFjZSgvXFwuKHRzeHxodG1sKSQvaSwgJycpXG4gICAgLnJlcGxhY2UoL15cXC4rLywgJycpXG4gICAgLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiAvXlthLXowLTlfLV0rJC8udGVzdChzbHVnKSA/IHNsdWcgOiBudWxsO1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFByb3ZpZGVyIOKAlCBvcGVucyBXUywgb3ducyBZLkRvYyArIEF3YXJlbmVzcyBsaWZlY3ljbGUuXG5cbmludGVyZmFjZSBDb2xsYWJQcm92aWRlclByb3BzIHtcbiAgLyoqIENhbnZhcyBzbHVnIOKAlCBtdXN0IG1hdGNoIHNlcnZlci1zaWRlIGBwYXJzZUNvbGxhYlNsdWdgLiAqL1xuICBzbHVnOiBzdHJpbmc7XG4gIGNoaWxkcmVuOiBSZWFjdE5vZGU7XG59XG5cbmNvbnN0IEFXQVJFTkVTU19USFJPVFRMRV9NUyA9IDMzOyAvLyB+MzAgSHpcblxuZXhwb3J0IGZ1bmN0aW9uIENvbGxhYlByb3ZpZGVyKHsgc2x1ZywgY2hpbGRyZW4gfTogQ29sbGFiUHJvdmlkZXJQcm9wcyk6IEpTWC5FbGVtZW50IHtcbiAgLy8gWS5Eb2MgKyBBd2FyZW5lc3MgYXJlIHJlY3JlYXRlZCB3aGVuZXZlciB0aGUgc2x1ZyBjaGFuZ2VzIChzd2l0Y2hpbmdcbiAgLy8gY2FudmFzZXMgdGVhcnMgZG93biB0aGUgcHJpb3Igc2Vzc2lvbiBjbGVhbmx5KS4gVGhlIHVzZU1lbW8gZmFjdG9yeVxuICAvLyBib2RpZXMgZG9uJ3QgcmVhZCBgc2x1Z2Ag4oCUIHNsdWcgSVMgdGhlIGNhY2hlIGtleSwgaW50ZW50aW9uYWxseS5cbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29ycmVjdG5lc3MvdXNlRXhoYXVzdGl2ZURlcGVuZGVuY2llczogc2x1ZyBpcyB0aGUgY2FjaGUga2V5XG4gIGNvbnN0IGRvYyA9IHVzZU1lbW8oKCkgPT4gbmV3IFkuRG9jKCksIFtzbHVnXSk7XG4gIGNvbnN0IGF3YXJlbmVzcyA9IHVzZU1lbW8oKCkgPT4gbmV3IEF3YXJlbmVzcyhkb2MpLCBbZG9jXSk7XG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvcnJlY3RuZXNzL3VzZUV4aGF1c3RpdmVEZXBlbmRlbmNpZXM6IHNsdWcgaXMgdGhlIGNhY2hlIGtleVxuICBjb25zdCBteUNvbm5JZCA9IHVzZU1lbW8oKCkgPT4gY3J5cHRvLnJhbmRvbVVVSUQoKSwgW3NsdWddKTtcblxuICBjb25zdCBbbXlOYW1lLCBzZXRNeU5hbWVdID0gdXNlU3RhdGUoJ2Fub255bW91cycpO1xuICBjb25zdCBbbXlDb2xvciwgc2V0TXlDb2xvcl0gPSB1c2VTdGF0ZShjb2xvckZvck5hbWUoJ2Fub255bW91cycpKTtcbiAgY29uc3QgW2Nvbm5lY3RlZCwgc2V0Q29ubmVjdGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICAvLyBGZXRjaCBnaXQgdXNlci5uYW1lIG9uY2UgcGVyIHNsdWc7IGZhbGxzIGJhY2sgdG8gYW5vbnltb3VzLTxzaG9ydCBpZD4uXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgbGV0IGNhbmNlbGxlZCA9IGZhbHNlO1xuICAgIGZldGNoKCcvX2FwaS9naXQtdXNlcicpXG4gICAgICAudGhlbigocikgPT4gci5qc29uKCkpXG4gICAgICAudGhlbigoaikgPT4ge1xuICAgICAgICBpZiAoY2FuY2VsbGVkKSByZXR1cm47XG4gICAgICAgIGNvbnN0IG4gPSB0eXBlb2Ygaj8ubmFtZSA9PT0gJ3N0cmluZycgJiYgai5uYW1lLnRyaW0oKSA/IGoubmFtZS50cmltKCkgOiBudWxsO1xuICAgICAgICBjb25zdCBmaW5hbE5hbWUgPSBuID8/IGBhbm9ueW1vdXMtJHtteUNvbm5JZC5zbGljZSgwLCA2KX1gO1xuICAgICAgICBzZXRNeU5hbWUoZmluYWxOYW1lKTtcbiAgICAgICAgc2V0TXlDb2xvcihjb2xvckZvck5hbWUoZmluYWxOYW1lKSk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgaWYgKGNhbmNlbGxlZCkgcmV0dXJuO1xuICAgICAgICBjb25zdCBmYWxsYmFjayA9IGBhbm9ueW1vdXMtJHtteUNvbm5JZC5zbGljZSgwLCA2KX1gO1xuICAgICAgICBzZXRNeU5hbWUoZmFsbGJhY2spO1xuICAgICAgICBzZXRNeUNvbG9yKGNvbG9yRm9yTmFtZShmYWxsYmFjaykpO1xuICAgICAgfSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNhbmNlbGxlZCA9IHRydWU7XG4gICAgfTtcbiAgfSwgW215Q29ubklkXSk7XG5cbiAgLy8gU2VlZCBsb2NhbCBhd2FyZW5lc3Mgc3RhdGUgaW1tZWRpYXRlbHkgc28gZm9yZWlnbiBwZWVycyBzZWUgb3VyIG5hbWUgZXZlblxuICAvLyBiZWZvcmUgdGhlIGN1cnNvciBtb3Zlcy4gVXBkYXRlIHdoZW4gbXlOYW1lL215Q29sb3Igc2V0dGxlcyBmcm9tIHRoZSBmZXRjaC5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBhd2FyZW5lc3Muc2V0TG9jYWxTdGF0ZSh7XG4gICAgICBuYW1lOiBteU5hbWUsXG4gICAgICBjb2xvcjogbXlDb2xvcixcbiAgICAgIGN1cnNvcjogbnVsbCxcbiAgICAgIHNlbGVjdGlvbjogbnVsbCxcbiAgICAgIGFubm90YXRpb25TZWxlY3Rpb246IFtdLFxuICAgICAgdmlld3BvcnQ6IHsgeDogMCwgeTogMCwgem9vbTogMSB9LFxuICAgICAgX19jb25uSWQ6IG15Q29ubklkLFxuICAgIH0gc2F0aXNmaWVzIENvbGxhYkF3YXJlbmVzc1N0YXRlKTtcbiAgfSwgW2F3YXJlbmVzcywgbXlOYW1lLCBteUNvbG9yLCBteUNvbm5JZF0pO1xuXG4gIC8vIOKUgOKUgCBXZWJTb2NrZXQgbGlmZWN5Y2xlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBjb25zdCB3c1JlZiA9IHVzZVJlZjxXZWJTb2NrZXQgfCBudWxsPihudWxsKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGxldCBjYW5jZWxsZWQgPSBmYWxzZTtcbiAgICBsZXQgcmVjb25uZWN0VGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgICBmdW5jdGlvbiBzZW5kRnJhbWUod3M6IFdlYlNvY2tldCwgcGF5bG9hZDogVWludDhBcnJheSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgd3Muc2VuZChwYXlsb2FkKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvKiBkZWFkIHNvY2tldCDigJQgY2xvc2UgaGFuZGxlciB3aWxsIHJlY29ubmVjdCAqL1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGJyb2FkY2FzdEF3YXJlbmVzcyh3czogV2ViU29ja2V0LCBjaGFuZ2VkOiBudW1iZXJbXSkge1xuICAgICAgaWYgKGNoYW5nZWQubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICBjb25zdCBlbmNvZGVyID0gZW5jb2RpbmcuY3JlYXRlRW5jb2RlcigpO1xuICAgICAgZW5jb2Rpbmcud3JpdGVWYXJVaW50KGVuY29kZXIsIE1FU1NBR0VfQVdBUkVORVNTKTtcbiAgICAgIGVuY29kaW5nLndyaXRlVmFyVWludDhBcnJheShlbmNvZGVyLCBlbmNvZGVBd2FyZW5lc3NVcGRhdGUoYXdhcmVuZXNzLCBjaGFuZ2VkKSk7XG4gICAgICBzZW5kRnJhbWUod3MsIGVuY29kaW5nLnRvVWludDhBcnJheShlbmNvZGVyKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYnJvYWRjYXN0U3luY1VwZGF0ZSh3czogV2ViU29ja2V0LCB1cGRhdGU6IFVpbnQ4QXJyYXkpIHtcbiAgICAgIGNvbnN0IGVuY29kZXIgPSBlbmNvZGluZy5jcmVhdGVFbmNvZGVyKCk7XG4gICAgICBlbmNvZGluZy53cml0ZVZhclVpbnQoZW5jb2RlciwgTUVTU0FHRV9TWU5DKTtcbiAgICAgIHdyaXRlVXBkYXRlKGVuY29kZXIsIHVwZGF0ZSk7XG4gICAgICBzZW5kRnJhbWUod3MsIGVuY29kaW5nLnRvVWludDhBcnJheShlbmNvZGVyKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29ubmVjdCgpIHtcbiAgICAgIGlmIChjYW5jZWxsZWQpIHJldHVybjtcbiAgICAgIGNvbnN0IHByb3RvID0gbG9jYXRpb24ucHJvdG9jb2wgPT09ICdodHRwczonID8gJ3dzczonIDogJ3dzOic7XG4gICAgICBjb25zdCB3cyA9IG5ldyBXZWJTb2NrZXQoYCR7cHJvdG99Ly8ke2xvY2F0aW9uLmhvc3R9L193cy9jb2xsYWIvJHtzbHVnfWApO1xuICAgICAgd3MuYmluYXJ5VHlwZSA9ICdhcnJheWJ1ZmZlcic7XG4gICAgICB3c1JlZi5jdXJyZW50ID0gd3M7XG5cbiAgICAgIHdzLmFkZEV2ZW50TGlzdGVuZXIoJ29wZW4nLCAoKSA9PiB7XG4gICAgICAgIHNldENvbm5lY3RlZCh0cnVlKTtcbiAgICAgICAgLy8gU3luYyBzdGVwIDEg4oCUIGFubm91bmNlIG91ciBzdGF0ZSB2ZWN0b3Igc28gdGhlIHNlcnZlciBjYW4gc2VuZCB0aGVcbiAgICAgICAgLy8gbWlzc2luZyBwaWVjZXMgKG1hdGNoZXMgdGhlIGVuY29kZUhhbmRzaGFrZSBzZXJ2ZXIgcGF0aCkuXG4gICAgICAgIGNvbnN0IGVuY29kZXIgPSBlbmNvZGluZy5jcmVhdGVFbmNvZGVyKCk7XG4gICAgICAgIGVuY29kaW5nLndyaXRlVmFyVWludChlbmNvZGVyLCBNRVNTQUdFX1NZTkMpO1xuICAgICAgICB3cml0ZVN5bmNTdGVwMShlbmNvZGVyLCBkb2MpO1xuICAgICAgICBzZW5kRnJhbWUod3MsIGVuY29kaW5nLnRvVWludDhBcnJheShlbmNvZGVyKSk7XG4gICAgICAgIC8vIEF3YXJlbmVzcyBpbml0aWFsIHN0YXRlIOKAlCBmaXJlIG91ciBsb2NhbCBzdGF0ZSB0byB0aGUgcm9vbS5cbiAgICAgICAgYnJvYWRjYXN0QXdhcmVuZXNzKHdzLCBbYXdhcmVuZXNzLmNsaWVudElEXSk7XG4gICAgICB9KTtcblxuICAgICAgd3MuYWRkRXZlbnRMaXN0ZW5lcignY2xvc2UnLCAoKSA9PiB7XG4gICAgICAgIHNldENvbm5lY3RlZChmYWxzZSk7XG4gICAgICAgIHdzUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICBpZiAoY2FuY2VsbGVkKSByZXR1cm47XG4gICAgICAgIHJlY29ubmVjdFRpbWVyID0gc2V0VGltZW91dChjb25uZWN0LCAxMDAwKTtcbiAgICAgIH0pO1xuXG4gICAgICB3cy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsICgpID0+IHtcbiAgICAgICAgLy8gTGV0IGNsb3NlIGhhbmRsZXIgZG8gdGhlIHJlY29ubmVjdDsgZXJyb3IgZXZlbnRzIHdpdGhvdXQgYSBjbG9zZVxuICAgICAgICAvLyB3b3VsZCBqdXN0IHJldHJ5LXNwYW0uXG4gICAgICB9KTtcblxuICAgICAgd3MuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIChldnQpID0+IHtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9XG4gICAgICAgICAgZXZ0LmRhdGEgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlclxuICAgICAgICAgICAgPyBuZXcgVWludDhBcnJheShldnQuZGF0YSlcbiAgICAgICAgICAgIDogZXZ0LmRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5XG4gICAgICAgICAgICAgID8gZXZ0LmRhdGFcbiAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICBpZiAoIXBheWxvYWQpIHJldHVybjtcbiAgICAgICAgY29uc3QgZGVjb2RlciA9IGRlY29kaW5nLmNyZWF0ZURlY29kZXIocGF5bG9hZCk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VUeXBlID0gZGVjb2RpbmcucmVhZFZhclVpbnQoZGVjb2Rlcik7XG4gICAgICAgIHN3aXRjaCAobWVzc2FnZVR5cGUpIHtcbiAgICAgICAgICBjYXNlIE1FU1NBR0VfU1lOQzoge1xuICAgICAgICAgICAgY29uc3QgZW5jb2RlciA9IGVuY29kaW5nLmNyZWF0ZUVuY29kZXIoKTtcbiAgICAgICAgICAgIGVuY29kaW5nLndyaXRlVmFyVWludChlbmNvZGVyLCBNRVNTQUdFX1NZTkMpO1xuICAgICAgICAgICAgcmVhZFN5bmNNZXNzYWdlKGRlY29kZXIsIGVuY29kZXIsIGRvYywgd3MpO1xuICAgICAgICAgICAgaWYgKGVuY29kaW5nLmxlbmd0aChlbmNvZGVyKSA+IDEpIHNlbmRGcmFtZSh3cywgZW5jb2RpbmcudG9VaW50OEFycmF5KGVuY29kZXIpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIE1FU1NBR0VfQVdBUkVORVNTOiB7XG4gICAgICAgICAgICBhcHBseUF3YXJlbmVzc1VwZGF0ZShhd2FyZW5lc3MsIGRlY29kaW5nLnJlYWRWYXJVaW50OEFycmF5KGRlY29kZXIpLCB3cyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBXaXJlIGRvYyB1cGRhdGVzIOKGkiBicm9hZGNhc3QgdG8gc2VydmVyLiBPcmlnaW4gdGFnZ2VkIHdpdGggdGhlIHdzIHJlZiBzb1xuICAgIC8vIHNlcnZlci1zaWRlIHVwZGF0ZXMgd2UgcmVjZWl2ZSBkb24ndCBlY2hvIGJhY2suXG4gICAgY29uc3Qgb25Eb2NVcGRhdGUgPSAodXBkYXRlOiBVaW50OEFycmF5LCBvcmlnaW46IHVua25vd24pID0+IHtcbiAgICAgIGNvbnN0IHdzID0gd3NSZWYuY3VycmVudDtcbiAgICAgIGlmICghd3MgfHwgd3MucmVhZHlTdGF0ZSAhPT0gV2ViU29ja2V0Lk9QRU4pIHJldHVybjtcbiAgICAgIGlmIChvcmlnaW4gPT09IHdzKSByZXR1cm47IC8vIGNhbWUgZnJvbSBzZXJ2ZXIsIGRvbid0IGVjaG9cbiAgICAgIGJyb2FkY2FzdFN5bmNVcGRhdGUod3MsIHVwZGF0ZSk7XG4gICAgfTtcbiAgICBkb2Mub24oJ3VwZGF0ZScsIG9uRG9jVXBkYXRlKTtcblxuICAgIC8vIFdpcmUgYXdhcmVuZXNzIGNoYW5nZXMg4oaSIGJyb2FkY2FzdC4gU2FtZSBvcmlnaW4gZ3VhcmQuXG4gICAgY29uc3Qgb25Bd2FyZW5lc3NVcGRhdGUgPSAoXG4gICAgICB7IGFkZGVkLCB1cGRhdGVkLCByZW1vdmVkIH06IHsgYWRkZWQ6IG51bWJlcltdOyB1cGRhdGVkOiBudW1iZXJbXTsgcmVtb3ZlZDogbnVtYmVyW10gfSxcbiAgICAgIG9yaWdpbjogdW5rbm93blxuICAgICkgPT4ge1xuICAgICAgY29uc3Qgd3MgPSB3c1JlZi5jdXJyZW50O1xuICAgICAgaWYgKCF3cyB8fCB3cy5yZWFkeVN0YXRlICE9PSBXZWJTb2NrZXQuT1BFTikgcmV0dXJuO1xuICAgICAgaWYgKG9yaWdpbiA9PT0gd3MpIHJldHVybjtcbiAgICAgIGNvbnN0IGNoYW5nZWQgPSBhZGRlZC5jb25jYXQodXBkYXRlZCwgcmVtb3ZlZCk7XG4gICAgICBicm9hZGNhc3RBd2FyZW5lc3Mod3MsIGNoYW5nZWQpO1xuICAgIH07XG4gICAgYXdhcmVuZXNzLm9uKCd1cGRhdGUnLCBvbkF3YXJlbmVzc1VwZGF0ZSk7XG5cbiAgICBjb25uZWN0KCk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgIGlmIChyZWNvbm5lY3RUaW1lcikgY2xlYXJUaW1lb3V0KHJlY29ubmVjdFRpbWVyKTtcbiAgICAgIGRvYy5vZmYoJ3VwZGF0ZScsIG9uRG9jVXBkYXRlKTtcbiAgICAgIGF3YXJlbmVzcy5vZmYoJ3VwZGF0ZScsIG9uQXdhcmVuZXNzVXBkYXRlKTtcbiAgICAgIGNvbnN0IHdzID0gd3NSZWYuY3VycmVudDtcbiAgICAgIGlmICh3cyAmJiB3cy5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHdzLmNsb3NlKCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8qIGlnbm9yZSAqL1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBEb24ndCBkZXN0cm95IGRvYy9hd2FyZW5lc3MgaGVyZSDigJQgdGhlIHVzZU1lbW8tdGllZCBsaWZldGltZSBoYW5kbGVzXG4gICAgICAvLyB0aGF0IHdoZW4gdGhlIHNsdWcgY2hhbmdlcy5cbiAgICB9O1xuICB9LCBbc2x1ZywgZG9jLCBhd2FyZW5lc3NdKTtcblxuICAvLyBQZXItc2x1ZyBjbGVhbnVwIG9mIGRvYy9hd2FyZW5lc3Mgd2hlbiBzbHVnIGNoYW5nZXMgKG9yIHByb3ZpZGVyIHVubW91bnRzKS5cbiAgdXNlRWZmZWN0KFxuICAgICgpID0+ICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YXJlbmVzcy5kZXN0cm95KCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogaWdub3JlICovXG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBkb2MuZGVzdHJveSgpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8qIGlnbm9yZSAqL1xuICAgICAgfVxuICAgIH0sXG4gICAgW2RvYywgYXdhcmVuZXNzXVxuICApO1xuXG4gIC8vIOKUgOKUgCBUaHJvdHRsZWQgYXdhcmVuZXNzIHB1Ymxpc2gg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGNvbnN0IHBlbmRpbmdSZWYgPSB1c2VSZWY8UGFydGlhbDxPbWl0PENvbGxhYkF3YXJlbmVzc1N0YXRlLCAnX19jb25uSWQnPj4gfCBudWxsPihudWxsKTtcbiAgY29uc3QgdGhyb3R0bGVUaW1lclJlZiA9IHVzZVJlZjxSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGw+KG51bGwpO1xuXG4gIGNvbnN0IHB1Ymxpc2hBd2FyZW5lc3MgPSB1c2VDYWxsYmFjayhcbiAgICAocGF0Y2g6IFBhcnRpYWw8T21pdDxDb2xsYWJBd2FyZW5lc3NTdGF0ZSwgJ19fY29ubklkJz4+KSA9PiB7XG4gICAgICBwZW5kaW5nUmVmLmN1cnJlbnQgPSB7IC4uLihwZW5kaW5nUmVmLmN1cnJlbnQgPz8ge30pLCAuLi5wYXRjaCB9O1xuICAgICAgaWYgKHRocm90dGxlVGltZXJSZWYuY3VycmVudCkgcmV0dXJuO1xuICAgICAgdGhyb3R0bGVUaW1lclJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRocm90dGxlVGltZXJSZWYuY3VycmVudCA9IG51bGw7XG4gICAgICAgIGNvbnN0IG5leHQgPSBwZW5kaW5nUmVmLmN1cnJlbnQ7XG4gICAgICAgIHBlbmRpbmdSZWYuY3VycmVudCA9IG51bGw7XG4gICAgICAgIGlmICghbmV4dCkgcmV0dXJuO1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gKGF3YXJlbmVzcy5nZXRMb2NhbFN0YXRlKCkgPz8ge30pIGFzIFBhcnRpYWw8Q29sbGFiQXdhcmVuZXNzU3RhdGU+O1xuICAgICAgICBhd2FyZW5lc3Muc2V0TG9jYWxTdGF0ZSh7XG4gICAgICAgICAgbmFtZTogY3VycmVudC5uYW1lID8/IG15TmFtZSxcbiAgICAgICAgICBjb2xvcjogY3VycmVudC5jb2xvciA/PyBteUNvbG9yLFxuICAgICAgICAgIGN1cnNvcjogY3VycmVudC5jdXJzb3IgPz8gbnVsbCxcbiAgICAgICAgICBzZWxlY3Rpb246IGN1cnJlbnQuc2VsZWN0aW9uID8/IG51bGwsXG4gICAgICAgICAgYW5ub3RhdGlvblNlbGVjdGlvbjogY3VycmVudC5hbm5vdGF0aW9uU2VsZWN0aW9uID8/IFtdLFxuICAgICAgICAgIHZpZXdwb3J0OiBjdXJyZW50LnZpZXdwb3J0ID8/IHsgeDogMCwgeTogMCwgem9vbTogMSB9LFxuICAgICAgICAgIF9fY29ubklkOiBteUNvbm5JZCxcbiAgICAgICAgICAuLi5uZXh0LFxuICAgICAgICB9IHNhdGlzZmllcyBDb2xsYWJBd2FyZW5lc3NTdGF0ZSk7XG4gICAgICB9LCBBV0FSRU5FU1NfVEhST1RUTEVfTVMpO1xuICAgIH0sXG4gICAgW2F3YXJlbmVzcywgbXlOYW1lLCBteUNvbG9yLCBteUNvbm5JZF1cbiAgKTtcblxuICAvLyDilIDilIAgQ2xlYW51cCB0aHJvdHRsZSB0aW1lciBvbiB1bm1vdW50IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICB1c2VFZmZlY3QoXG4gICAgKCkgPT4gKCkgPT4ge1xuICAgICAgaWYgKHRocm90dGxlVGltZXJSZWYuY3VycmVudCkgY2xlYXJUaW1lb3V0KHRocm90dGxlVGltZXJSZWYuY3VycmVudCk7XG4gICAgfSxcbiAgICBbXVxuICApO1xuXG4gIGNvbnN0IHZhbHVlID0gdXNlTWVtbzxDb2xsYWJWYWx1ZT4oXG4gICAgKCkgPT4gKHtcbiAgICAgIGRvYyxcbiAgICAgIGF3YXJlbmVzcyxcbiAgICAgIG15Q29sb3IsXG4gICAgICBteU5hbWUsXG4gICAgICBteUNvbm5JZCxcbiAgICAgIGNvbm5lY3RlZCxcbiAgICAgIHB1Ymxpc2hBd2FyZW5lc3MsXG4gICAgfSksXG4gICAgW2RvYywgYXdhcmVuZXNzLCBteUNvbG9yLCBteU5hbWUsIG15Q29ubklkLCBjb25uZWN0ZWQsIHB1Ymxpc2hBd2FyZW5lc3NdXG4gICk7XG5cbiAgcmV0dXJuIDxDb2xsYWJDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXt2YWx1ZX0+e2NoaWxkcmVufTwvQ29sbGFiQ29udGV4dC5Qcm92aWRlcj47XG59XG4iLAogICAgIi8qKlxuICogQGZpbGUgICAgICAgdXNlLXNlbGVjdGlvbi1zZXQudHN4IOKAlCBQaGFzZSA0LjEgbXVsdGktc2VsZWN0aW9uIHN0b3JlXG4gKiBAc2NvcGUgICAgICBhcHBzL3N0dWRpby91c2Utc2VsZWN0aW9uLXNldC50c3hcbiAqIEBwdXJwb3NlICAgIE11bHRpLWVsZW1lbnQgc2VsZWN0aW9uIHN0YXRlIGZvciBjYW52YXMtc2hlbGwuIFRoZSBjYW52YXNcbiAqICAgICAgICAgICAgIGlucHV0IHJvdXRlciBjYWxscyBgcmVwbGFjZSgpYCAvIGBhZGQoKWAgLyBgY2xlYXIoKWA7XG4gKiAgICAgICAgICAgICB0aGUgcHJvdmlkZXIgZGVib3VuY2VzIGFuZCBwb3N0cyB1cCB0byB0aGUgZGV2LXNlcnZlciBzaGVsbFxuICogICAgICAgICAgICAgdGhyb3VnaCB0aGUgZXhpc3RpbmcgYF9fZGVzaWduX3NlbGVjdGVkYCB3aW5kb3cucGFyZW50IGNoYW5uZWxcbiAqICAgICAgICAgICAgIHNvIGBfYWN0aXZlLmpzb25gIHJlZmxlY3RzIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBzZXQuXG4gKlxuICogU2NoZW1hIG1pZ3JhdGlvbi4gYF9hY3RpdmUuanNvbiNzZWxlY3RlZGAgaGlzdG9yaWNhbGx5IGhvbGRzXG4gKiAgICAgc2VsZWN0ZWQ6IFNlbGVjdGVkRWxlbWVudCB8IG51bGxcbiAqIFBoYXNlIDQuMSB3aWRlbnMgdG9cbiAqICAgICBzZWxlY3RlZDogU2VsZWN0ZWRFbGVtZW50IHwgU2VsZWN0ZWRFbGVtZW50W10gfCBudWxsXG4gKiBXcml0ZXI6IGVtaXRzIGEgc2luZ2xlIG9iamVjdCB3aGVuIE4gPT09IDEgKGJhY2stY29tcGF0IHdpdGggZG93bnN0cmVhbVxuICogdG9vbHMgdGhhdCBzdGlsbCByZWFkIHRoZSBsZWdhY3kgc2hhcGUg4oCUIGAvZGVzaWduOmVkaXRgLCBoYW5kb2ZmKS4gRW1pdHMgYW5cbiAqIGFycmF5IHdoZW4gTiA+IDEuIFJlYWRlciAodGhpcyBob29rIG9uIHJlaHlkcmF0ZSkgYWNjZXB0cyBhbGwgdGhyZWUuXG4gKi9cblxuaW1wb3J0IHtcbiAgY3JlYXRlQ29udGV4dCxcbiAgdHlwZSBSZWFjdE5vZGUsXG4gIHVzZUNhbGxiYWNrLFxuICB1c2VDb250ZXh0LFxuICB1c2VFZmZlY3QsXG4gIHVzZU1lbW8sXG4gIHVzZVJlZixcbiAgdXNlU3RhdGUsXG59IGZyb20gJ3JlYWN0JztcblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBUeXBlc1xuXG4vKipcbiAqIE1pbmltYWwgU2VsZWN0aW9uIHNoYXBlIHRoYXQgdHJhdmVscyB0aHJvdWdoIHRoZSBwYXJlbnQgcG9zdE1lc3NhZ2UgY2hhbm5lbC5cbiAqIE1pcnJvcnMgYFNlbGVjdGVkRWxlbWVudGAgZnJvbSBpbnNwZWN0LnRzIGJ1dCB0aGUgY2FudmFzIHJvdXRlciBjb21wdXRlcyBpdFxuICogY2xpZW50LXNpZGUgYW5kIHRoZSBpbnNwZWN0b3Igb3ZlcmxheSdzIGVucmljaG1lbnQgZmllbGRzIChodG1sIGV4Y2VycHQsXG4gKiBkb21fcGF0aCwgY2xhc3Nlcy4uLikgYXJlIGZpbGxlZCBpbiBieSB0aGUgcm91dGVyIHJpZ2h0IGJlZm9yZSB0aGUgbWVzc2FnZVxuICogaXMgcG9zdGVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdGlvbiB7XG4gIC8qKiBDYW52YXMgZmlsZSBwYXRoIOKAlCBkZXNpZ25SZWwtcHJlZml4ZWQgKGUuZy4gYC5kZXNpZ24vdWkvRm9vLnRzeGApLiAqL1xuICBmaWxlPzogc3RyaW5nO1xuICAvKiogU3RhYmxlIGBkYXRhLWNkLWlkYCBhbmNob3Igd2hlbiBwcmVzZW50LiB2Mi1ncmFkZSBvbmx5LiAqL1xuICBpZD86IHN0cmluZztcbiAgLyoqIENTUy1zZWxlY3RvciBmYWxsYmFjayBwYXRoIChhbHdheXMgcHJlc2VudCkuICovXG4gIHNlbGVjdG9yOiBzdHJpbmc7XG4gIC8qKiBBcnRib2FyZCBob3N0IChgZGF0YS1kYy1zY3JlZW5gKSDigJQgZm9yIHNjb3BpbmcgbXVsdGktZWRpdHMgaW4gZnV0dXJlLiAqL1xuICBhcnRib2FyZElkPzogc3RyaW5nIHwgbnVsbDtcbiAgLyoqXG4gICAqIE9jY3VycmVuY2UgaW5kZXggb2YgdGhpcyBlbGVtZW50IGFtb25nIGBxdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKWAuXG4gICAqIGRhdGEtY2QtaWQgaXMgc3RhbXBlZCBwZXIgU09VUkNFIGVsZW1lbnQsIHNvIGEgY29tcG9uZW50IHJlbmRlcmVkIE4gdGltZXNcbiAgICogKGEgbGlzdCByb3csIG9yIGEgcmV1c2FibGUgdXNlZCB0d2ljZSkgeWllbGRzIE4gRE9NIG5vZGVzIHdpdGggdGhlIFNBTUVcbiAgICogaWQrYXJ0Ym9hcmQgc2VsZWN0b3IuIFRoZSBpbmRleCBkaXNhbWJpZ3VhdGVzIHdoaWNoIGluc3RhbmNlIOKAlCByZXNvbHZlcnNcbiAgICogdXNlIGBxdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVtpbmRleF1gLiBBYnNlbnQvMCDihpIgZmlyc3QgbWF0Y2guXG4gICAqL1xuICBpbmRleD86IG51bWJlcjtcbiAgLyoqIFNuYXBzaG90IGZpZWxkcyBmaWxsZWQgYnkgdGhlIHJvdXRlciBmcm9tIGByZXNvbHZlSG92ZXJUYXJnZXRgLiAqL1xuICB0YWc/OiBzdHJpbmc7XG4gIGNsYXNzZXM/OiBzdHJpbmc7XG4gIHRleHQ/OiBzdHJpbmc7XG4gIGRvbV9wYXRoPzogc3RyaW5nW107XG4gIGJvdW5kcz86IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0gfCBudWxsO1xuICBodG1sPzogc3RyaW5nO1xuICAvKiogUGhhc2UgMTIuMiDigJQgYXV0aG9yZWQgaW5saW5lLXN0eWxlIHZhbHVlcyAoa25vYiBwcmUtZmlsbCkgKyByZXNvbHZlZCBjb21wdXRlZCAocGxhY2Vob2xkZXIgaGludCkuICovXG4gIGF1dGhvcmVkPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgY29tcHV0ZWQ/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKiogUGhhc2UgMTIuMyDigJQgYXV0aG9yZWQgaW5saW5lLXN0eWxlIHByb3BzIE9VVFNJREUgdGhlIGN1cmF0ZWQga25vYiBzZXQsIHNvIHRoZVxuICAgKiAgcGFuZWwgY2FuIHN1cmZhY2UgYSBjdXN0b20gQ1NTIHByb3BlcnR5IHRoZSB1c2VyIGFkZGVkIChlLmcuIGBsZXR0ZXItc3BhY2luZ2ApLiAqL1xuICBjdXN0b21TdHlsZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKiogUGhhc2UgMTIuMyDigJQgY3VzdG9tIEhUTUwgYXR0cmlidXRlcyBvbiB0aGUgZWxlbWVudCAoZGF0YS0sIGFyaWEtLCByb2xlLCB0aXRsZeKApiksXG4gICAqICBzbyB0aGUgcGFuZWwgcmVmbGVjdHMgYSBjdXN0b20gYXR0cmlidXRlIHRoZSB1c2VyIGFkZGVkIHZpYSB0aGUgZXNjYXBlIGhhdGNoLiAqL1xuICBhdHRycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbmludGVyZmFjZSBTZWxlY3Rpb25TZXRWYWx1ZSB7XG4gIHNlbGVjdGVkOiBTZWxlY3Rpb25bXTtcbiAgcmVwbGFjZTogKHM6IFNlbGVjdGlvbiB8IFNlbGVjdGlvbltdKSA9PiB2b2lkO1xuICBhZGQ6IChzOiBTZWxlY3Rpb24gfCBTZWxlY3Rpb25bXSkgPT4gdm9pZDtcbiAgcmVtb3ZlOiAoczogU2VsZWN0aW9uKSA9PiB2b2lkO1xuICB0b2dnbGU6IChzOiBTZWxlY3Rpb24pID0+IHZvaWQ7XG4gIGNsZWFyOiAoKSA9PiB2b2lkO1xufVxuXG5jb25zdCBTZWxlY3Rpb25TZXRDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxTZWxlY3Rpb25TZXRWYWx1ZSB8IG51bGw+KG51bGwpO1xuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIElkZW50aXR5LiBQcmVmZXIgYGlkYCAoZGF0YS1jZC1pZCBzdGFibGUgYW5jaG9yKTsgZmFsbCBiYWNrIHRvIHNlbGVjdG9yLlxuXG5mdW5jdGlvbiBzZWxlY3Rpb25LZXkoczogU2VsZWN0aW9uKTogc3RyaW5nIHtcbiAgcmV0dXJuIHMuaWQgPyBgaWQ6JHtzLmlkfWAgOiBgc2VsOiR7cy5zZWxlY3Rvcn1gO1xufVxuXG5mdW5jdGlvbiBkZWR1cGUobGlzdDogU2VsZWN0aW9uW10pOiBTZWxlY3Rpb25bXSB7XG4gIGNvbnN0IG91dDogU2VsZWN0aW9uW10gPSBbXTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHMgb2YgbGlzdCkge1xuICAgIGNvbnN0IGsgPSBzZWxlY3Rpb25LZXkocyk7XG4gICAgaWYgKHNlZW4uaGFzKGspKSBjb250aW51ZTtcbiAgICBzZWVuLmFkZChrKTtcbiAgICBvdXQucHVzaChzKTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFByb3ZpZGVyXG5cbmNvbnN0IFBPU1RfREVCT1VOQ0VfTVMgPSA1MDsgLy8gbWlycm9ycyBjYW52YXMtbGliJ3MgU0VUVExFL1BVQkxJU0ggY2FkZW5jZVxuXG5leHBvcnQgZnVuY3Rpb24gU2VsZWN0aW9uU2V0UHJvdmlkZXIoe1xuICBjaGlsZHJlbixcbiAgLyoqIE92ZXJyaWRlIHRoZSBwb3N0TWVzc2FnZSBkZXN0aW5hdGlvbiAodXNlZCBpbiB0ZXN0cykuICovXG4gIHBvc3RUYXJnZXQsXG59OiB7XG4gIGNoaWxkcmVuOiBSZWFjdE5vZGU7XG4gIHBvc3RUYXJnZXQ/OiB7IHBvc3RNZXNzYWdlOiAobXNnOiB1bmtub3duLCB0YXJnZXRPcmlnaW46IHN0cmluZykgPT4gdm9pZCB9IHwgbnVsbDtcbn0pIHtcbiAgY29uc3QgW3NlbGVjdGVkLCBzZXRTZWxlY3RlZF0gPSB1c2VTdGF0ZTxTZWxlY3Rpb25bXT4oW10pO1xuICBjb25zdCB0aW1lclJlZiA9IHVzZVJlZjxSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGw+KG51bGwpO1xuXG4gIGNvbnN0IHBvc3QgPSB1c2VDYWxsYmFjayhcbiAgICAobmV4dDogU2VsZWN0aW9uW10pID0+IHtcbiAgICAgIGlmICh0aW1lclJlZi5jdXJyZW50KSBjbGVhclRpbWVvdXQodGltZXJSZWYuY3VycmVudCk7XG4gICAgICB0aW1lclJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRpbWVyUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBwb3N0VGFyZ2V0ID8/ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdy5wYXJlbnQgOiBudWxsKTtcbiAgICAgICAgaWYgKCF0YXJnZXQpIHJldHVybjtcbiAgICAgICAgLy8gV2lyZSBzaGFwZTogc2luZ2xlIG9iamVjdCBmb3IgTj0xIChiYWNrLWNvbXBhdCksIGFycmF5IGZvciBOPjEsIG51bGwgZm9yIGVtcHR5LlxuICAgICAgICBjb25zdCBwYXlsb2FkOiBTZWxlY3Rpb24gfCBTZWxlY3Rpb25bXSB8IG51bGwgPVxuICAgICAgICAgIG5leHQubGVuZ3RoID09PSAwID8gbnVsbCA6IG5leHQubGVuZ3RoID09PSAxID8gKG5leHRbMF0gPz8gbnVsbCkgOiBuZXh0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRhcmdldC5wb3N0TWVzc2FnZSh7IGRnbjogJ3NlbGVjdC1zZXQnLCBzZWxlY3Rpb246IHBheWxvYWQgfSwgJyonKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLyogaWZyYW1lIGxpa2VseSBjcm9zcy1vcmlnaW4gb3IgZGV0YWNoZWQgKi9cbiAgICAgICAgfVxuICAgICAgfSwgUE9TVF9ERUJPVU5DRV9NUyk7XG4gICAgfSxcbiAgICBbcG9zdFRhcmdldF1cbiAgKTtcblxuICAvLyBDbGVhbnVwIHRoZSBkZWJvdW5jZSB0aW1lciBvbiB1bm1vdW50LlxuICB1c2VFZmZlY3QoXG4gICAgKCkgPT4gKCkgPT4ge1xuICAgICAgaWYgKHRpbWVyUmVmLmN1cnJlbnQpIGNsZWFyVGltZW91dCh0aW1lclJlZi5jdXJyZW50KTtcbiAgICB9LFxuICAgIFtdXG4gICk7XG5cbiAgY29uc3QgcmVwbGFjZSA9IHVzZUNhbGxiYWNrKFxuICAgIChzOiBTZWxlY3Rpb24gfCBTZWxlY3Rpb25bXSkgPT4ge1xuICAgICAgY29uc3QgbmV4dCA9IGRlZHVwZShBcnJheS5pc0FycmF5KHMpID8gcyA6IFtzXSk7XG4gICAgICBzZXRTZWxlY3RlZChuZXh0KTtcbiAgICAgIHBvc3QobmV4dCk7XG4gICAgfSxcbiAgICBbcG9zdF1cbiAgKTtcblxuICBjb25zdCBhZGQgPSB1c2VDYWxsYmFjayhcbiAgICAoczogU2VsZWN0aW9uIHwgU2VsZWN0aW9uW10pID0+IHtcbiAgICAgIGNvbnN0IGluY29taW5nID0gQXJyYXkuaXNBcnJheShzKSA/IHMgOiBbc107XG4gICAgICBzZXRTZWxlY3RlZCgocHJldikgPT4ge1xuICAgICAgICBjb25zdCBuZXh0ID0gZGVkdXBlKFsuLi5wcmV2LCAuLi5pbmNvbWluZ10pO1xuICAgICAgICBwb3N0KG5leHQpO1xuICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgW3Bvc3RdXG4gICk7XG5cbiAgY29uc3QgcmVtb3ZlID0gdXNlQ2FsbGJhY2soXG4gICAgKHM6IFNlbGVjdGlvbikgPT4ge1xuICAgICAgY29uc3QgayA9IHNlbGVjdGlvbktleShzKTtcbiAgICAgIHNldFNlbGVjdGVkKChwcmV2KSA9PiB7XG4gICAgICAgIGNvbnN0IG5leHQgPSBwcmV2LmZpbHRlcigoeCkgPT4gc2VsZWN0aW9uS2V5KHgpICE9PSBrKTtcbiAgICAgICAgcG9zdChuZXh0KTtcbiAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIFtwb3N0XVxuICApO1xuXG4gIGNvbnN0IHRvZ2dsZSA9IHVzZUNhbGxiYWNrKFxuICAgIChzOiBTZWxlY3Rpb24pID0+IHtcbiAgICAgIGNvbnN0IGsgPSBzZWxlY3Rpb25LZXkocyk7XG4gICAgICBzZXRTZWxlY3RlZCgocHJldikgPT4ge1xuICAgICAgICBjb25zdCBuZXh0ID0gcHJldi5zb21lKCh4KSA9PiBzZWxlY3Rpb25LZXkoeCkgPT09IGspXG4gICAgICAgICAgPyBwcmV2LmZpbHRlcigoeCkgPT4gc2VsZWN0aW9uS2V5KHgpICE9PSBrKVxuICAgICAgICAgIDogWy4uLnByZXYsIHNdO1xuICAgICAgICBwb3N0KG5leHQpO1xuICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgW3Bvc3RdXG4gICk7XG5cbiAgY29uc3QgY2xlYXIgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0U2VsZWN0ZWQoW10pO1xuICAgIHBvc3QoW10pO1xuICB9LCBbcG9zdF0pO1xuXG4gIGNvbnN0IHZhbHVlID0gdXNlTWVtbzxTZWxlY3Rpb25TZXRWYWx1ZT4oXG4gICAgKCkgPT4gKHsgc2VsZWN0ZWQsIHJlcGxhY2UsIGFkZCwgcmVtb3ZlLCB0b2dnbGUsIGNsZWFyIH0pLFxuICAgIFtzZWxlY3RlZCwgcmVwbGFjZSwgYWRkLCByZW1vdmUsIHRvZ2dsZSwgY2xlYXJdXG4gICk7XG5cbiAgcmV0dXJuIDxTZWxlY3Rpb25TZXRDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXt2YWx1ZX0+e2NoaWxkcmVufTwvU2VsZWN0aW9uU2V0Q29udGV4dC5Qcm92aWRlcj47XG59XG5cbi8qKlxuICogTW91bnQgYSBgU2VsZWN0aW9uU2V0UHJvdmlkZXJgIG9ubHkgd2hlbiBub25lIGV4aXN0cyBhYm92ZSB1cy4gVGhlIHNoZWxsLVxuICogb3duZWQgY29tbWVudCBtb3VudCBsYXllciBwcm92aWRlcyBvbmUgc28gYm90aCB0aGUgbGl0ZSBjb21tZW50IHJvdXRlciBhbmRcbiAqIGBDYW52YXNTaGVsbGAgc2hhcmUgYSBzaW5nbGUgc2VsZWN0aW9uIHNldC4gSG9vayBjYWxsZWQgdW5jb25kaXRpb25hbGx5O1xuICogb25seSB0aGUgcmV0dXJuZWQgdHJlZSBicmFuY2hlcyAoaG9vayBydWxlcykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBNYXliZVNlbGVjdGlvblNldFByb3ZpZGVyKHsgY2hpbGRyZW4gfTogeyBjaGlsZHJlbjogUmVhY3ROb2RlIH0pIHtcbiAgY29uc3Qgb3V0ZXIgPSB1c2VDb250ZXh0KFNlbGVjdGlvblNldENvbnRleHQpO1xuICBpZiAob3V0ZXIpIHJldHVybiA8PntjaGlsZHJlbn08Lz47XG4gIHJldHVybiA8U2VsZWN0aW9uU2V0UHJvdmlkZXI+e2NoaWxkcmVufTwvU2VsZWN0aW9uU2V0UHJvdmlkZXI+O1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEhvb2tzXG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VTZWxlY3Rpb25TZXQoKTogU2VsZWN0aW9uU2V0VmFsdWUge1xuICBjb25zdCBjdHggPSB1c2VDb250ZXh0KFNlbGVjdGlvblNldENvbnRleHQpO1xuICBpZiAoIWN0eCkge1xuICAgIHRocm93IG5ldyBFcnJvcigndXNlU2VsZWN0aW9uU2V0IG11c3QgYmUgdXNlZCBpbnNpZGUgPFNlbGVjdGlvblNldFByb3ZpZGVyPicpO1xuICB9XG4gIHJldHVybiBjdHg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VTZWxlY3Rpb25TZXRPcHRpb25hbCgpOiBTZWxlY3Rpb25TZXRWYWx1ZSB8IG51bGwge1xuICByZXR1cm4gdXNlQ29udGV4dChTZWxlY3Rpb25TZXRDb250ZXh0KTtcbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBXaXJlLXNoYXBlIGhlbHBlcnMg4oCUIGV4cG9ydGVkIGZvciB0ZXN0cyBhbmQgaW5zcGVjdC50cyBiYWNrLWNvbXBhdCByZWFkZXIuXG5cbi8qKiBDb252ZXJ0IGFueSBpbmJvdW5kIHNoYXBlIHRvIGFuIGFycmF5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVNlbGVjdGVkUmVhZChcbiAgcmF3OiBTZWxlY3Rpb24gfCBTZWxlY3Rpb25bXSB8IG51bGwgfCB1bmRlZmluZWRcbik6IFNlbGVjdGlvbltdIHtcbiAgaWYgKHJhdyA9PSBudWxsKSByZXR1cm4gW107XG4gIGlmIChBcnJheS5pc0FycmF5KHJhdykpIHJldHVybiBkZWR1cGUocmF3KTtcbiAgcmV0dXJuIFtyYXddO1xufVxuXG4vKiogQ29udmVydCBpbnRlcm5hbCBhcnJheSBiYWNrIHRvIHRoZSB3aXJlIHNoYXBlICh3cml0ZXIpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlbm9ybWFsaXplU2VsZWN0ZWRXcml0ZShsaXN0OiBTZWxlY3Rpb25bXSk6IFNlbGVjdGlvbiB8IFNlbGVjdGlvbltdIHwgbnVsbCB7XG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMSkgcmV0dXJuIGxpc3RbMF0gPz8gbnVsbDtcbiAgcmV0dXJuIGxpc3Q7XG59XG4iLAogICAgIi8qKlxuICogQGZpbGUgICAgICAgZG9tLXNlbGVjdGlvbi50cyDigJQgc2VsZWN0aW9uLWZyb20tRE9NIGhlbHBlcnMgKGxlYWYgbW9kdWxlKVxuICogQHNjb3BlICAgICAgYXBwcy9zdHVkaW8vZG9tLXNlbGVjdGlvbi50c1xuICogQHB1cnBvc2UgICAgUHVyZSBET00g4oaSIFNlbGVjdGlvbiBidWlsZGVycyBzaGFyZWQgYnkgdGhlIGNhbnZhcyBjaHJvbWVcbiAqICAgICAgICAgICAgIChjYW52YXMtc2hlbGwudHN4KSBhbmQgdGhlIHNoZWxsLW93bmVkIGNvbW1lbnQgbW91bnQgbGF5ZXJcbiAqICAgICAgICAgICAgIChjYW52YXMtY29tbWVudC1tb3VudC50c3gpLiBMaXZlcyBpbiBpdHMgb3duIGxlYWYgbW9kdWxlIOKAlCBub1xuICogICAgICAgICAgICAgUmVhY3QsIG5vIGNhbnZhcy1saWIgaW1wb3J0IOKAlCBzbyBib3RoIGNvbnN1bWVycyBjYW4gbGlmdCB0aGVcbiAqICAgICAgICAgICAgIHNhbWUgYGhvdmVyVGFyZ2V0VG9TZWxlY3Rpb25gIC8gYGRlcml2ZUZpbGVgIGxvZ2ljIHdpdGhvdXQgYVxuICogICAgICAgICAgICAgY3ljbGUgYW5kIHdpdGhvdXQgYnVuZGxpbmcgdGhlIGhlYXZ5IERlc2lnbkNhbnZhcyB0cmVlIGludG8gdGhlXG4gKiAgICAgICAgICAgICBsaXRlIGNvbW1lbnQgbW91bnQuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBIb3ZlclRhcmdldCB9IGZyb20gJy4vaW5wdXQtcm91dGVyLnRzeCc7XG5pbXBvcnQgdHlwZSB7IFNlbGVjdGlvbiB9IGZyb20gJy4vdXNlLXNlbGVjdGlvbi1zZXQudHN4JztcblxuLyoqXG4gKiBDYW52YXMgZmlsZSBwYXRoIGZvciB0aGUgY3VycmVudCBwYWdlLiBVbmRlciB0aGUgbW91bnQgaGFybmVzcyB0aGUgcGFnZSBpc1xuICogYC9fY2FudmFzLXNoZWxsLmh0bWw/Y2FudmFzPTxyZWw+JmRlc2lnblJlbD08cm9vdD5gOyBmb3IgbGVnYWN5IGAuaHRtbGBcbiAqIG1vY2tzIGl0J3MgdGhlIHNlcnZlZCBmaWxlIHBhdGggaXRzZWxmLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVyaXZlRmlsZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgY29uc3QgcCA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTtcbiAgICBpZiAocCA9PT0gJy9fY2FudmFzLXNoZWxsLmh0bWwnIHx8IHAgPT09ICcvX2NhbnZhcy1zaGVsbCcpIHtcbiAgICAgIGNvbnN0IHFzID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcbiAgICAgIGNvbnN0IGNhbnZhcyA9IHFzLmdldCgnY2FudmFzJykgPz8gJyc7XG4gICAgICBjb25zdCBkZXNpZ25SZWwgPSAocXMuZ2V0KCdkZXNpZ25SZWwnKSA/PyAnLmRlc2lnbicpLnJlcGxhY2UoL15cXC8rfFxcLyskL2csICcnKTtcbiAgICAgIHJldHVybiBjYW52YXMgPyBgJHtkZXNpZ25SZWx9LyR7Y2FudmFzfWAgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQocCkucmVwbGFjZSgvXlxcLy8sICcnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhbENsYXNzZXMoZWw6IEVsZW1lbnQgfCBudWxsKTogc3RyaW5nIHtcbiAgaWYgKCFlbCkgcmV0dXJuICcnO1xuICByZXR1cm4gKGVsLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSA/PyAnJylcbiAgICAudHJpbSgpXG4gICAgLnNwbGl0KC9cXHMrLylcbiAgICAuZmlsdGVyKChjKSA9PiBjICYmICFjLnN0YXJ0c1dpdGgoJ2Rnbi0nKSAmJiAhYy5zdGFydHNXaXRoKCdkYy1jdi0nKSlcbiAgICAuam9pbignICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvcnRUZXh0KGVsOiBFbGVtZW50IHwgbnVsbCwgbWF4OiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoIWVsKSByZXR1cm4gJyc7XG4gIGNvbnN0IHQgPSAoKGVsIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQgfHwgZWwudGV4dENvbnRlbnQgfHwgJycpLnJlcGxhY2UoL1xccysvZywgJyAnKS50cmltKCk7XG4gIHJldHVybiB0Lmxlbmd0aCA+IG1heCA/IGAke3Quc2xpY2UoMCwgbWF4IC0gMSl94oCmYCA6IHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjc3NQYXRoKGVsOiBFbGVtZW50IHwgbnVsbCk6IHN0cmluZyB7XG4gIGlmICghZWwpIHJldHVybiAnJztcbiAgY29uc3QgcGF0aDogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGN1cjogRWxlbWVudCB8IG51bGwgPSBlbDtcbiAgd2hpbGUgKGN1ciAmJiBjdXIubm9kZVR5cGUgPT09IDEgJiYgcGF0aC5sZW5ndGggPCA4KSB7XG4gICAgY29uc3QgZHNjRWwgPSBjdXIuZ2V0QXR0cmlidXRlPy4oJ2RhdGEtZGMtZWxlbWVudCcpO1xuICAgIGlmIChkc2NFbCkge1xuICAgICAgcGF0aC51bnNoaWZ0KGBbZGF0YS1kYy1lbGVtZW50PVwiJHtkc2NFbH1cIl1gKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjb25zdCBkc2NTYyA9IGN1ci5nZXRBdHRyaWJ1dGU/LignZGF0YS1kYy1zY3JlZW4nKTtcbiAgICBpZiAoZHNjU2MpIHtcbiAgICAgIHBhdGgudW5zaGlmdChgW2RhdGEtZGMtc2NyZWVuPVwiJHtkc2NTY31cIl1gKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBsZXQgc2VsID0gY3VyLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGN1ci5pZCkge1xuICAgICAgc2VsID0gYCMke2N1ci5pZH1gO1xuICAgICAgcGF0aC51bnNoaWZ0KHNlbCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY29uc3QgY2xzID0gcmVhbENsYXNzZXMoY3VyKS5zcGxpdCgvXFxzKy8pLmZpbHRlcihCb29sZWFuKS5zbGljZSgwLCAyKTtcbiAgICBpZiAoY2xzLmxlbmd0aCkgc2VsICs9IGAuJHtjbHMuam9pbignLicpfWA7XG4gICAgbGV0IHNpYiA9IDE7XG4gICAgbGV0IG46IEVsZW1lbnQgfCBudWxsID0gY3VyLnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG4gICAgd2hpbGUgKG4pIHtcbiAgICAgIHNpYisrO1xuICAgICAgbiA9IG4ucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICB9XG4gICAgc2VsICs9IGA6bnRoLWNoaWxkKCR7c2lifSlgO1xuICAgIHBhdGgudW5zaGlmdChzZWwpO1xuICAgIGN1ciA9IGN1ci5wYXJlbnRFbGVtZW50O1xuICB9XG4gIHJldHVybiBwYXRoLmpvaW4oJyA+ICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZG9tUGF0aChlbDogRWxlbWVudCB8IG51bGwpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGhvcHM6IHN0cmluZ1tdID0gW107XG4gIGxldCBjdXIgPSBlbDtcbiAgd2hpbGUgKGN1ciAmJiBjdXIubm9kZVR5cGUgPT09IDEgJiYgaG9wcy5sZW5ndGggPCA4KSB7XG4gICAgbGV0IGxhYmVsID0gY3VyLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgZEVsID0gY3VyLmdldEF0dHJpYnV0ZT8uKCdkYXRhLWRjLWVsZW1lbnQnKTtcbiAgICBjb25zdCBkU2MgPSBjdXIuZ2V0QXR0cmlidXRlPy4oJ2RhdGEtZGMtc2NyZWVuJyk7XG4gICAgaWYgKGRFbCkgbGFiZWwgKz0gYFtkYXRhLWRjLWVsZW1lbnQ9XCIke2RFbH1cIl1gO1xuICAgIGVsc2UgaWYgKGRTYykgbGFiZWwgKz0gYFtkYXRhLWRjLXNjcmVlbj1cIiR7ZFNjfVwiXWA7XG4gICAgZWxzZSBpZiAoY3VyLmlkKSBsYWJlbCArPSBgIyR7Y3VyLmlkfWA7XG4gICAgY29uc3QgY2xzID0gcmVhbENsYXNzZXMoY3VyKS5zcGxpdCgvXFxzKy8pLmZpbHRlcihCb29sZWFuKS5zbGljZSgwLCAyKTtcbiAgICBpZiAoY2xzLmxlbmd0aCAmJiAhZEVsICYmICFkU2MpIGxhYmVsICs9IGAuJHtjbHMuam9pbignLicpfWA7XG4gICAgaG9wcy51bnNoaWZ0KGxhYmVsKTtcbiAgICBjdXIgPSBjdXIucGFyZW50RWxlbWVudDtcbiAgfVxuICByZXR1cm4gaG9wcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNzc0VzY2FwZShzOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBNaW5pbWFsIENTUy5lc2NhcGUgcG9seWZpbGwg4oCUIG9ubHkgaGFuZGxlcyBjaGFycyBhY3R1YWxseSBwcmVzZW50IGluXG4gIC8vIHBpcGVsaW5lLXN0YW1wZWQgSURzIChhbHBoYW51bWVyaWNzICsgYC1gICsgYF9gKS5cbiAgcmV0dXJuIHMucmVwbGFjZSgvW15hLXpBLVowLTlfLV0vZywgKGMpID0+IGBcXFxcJHtjfWApO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSB3aXJlLXNoYXBlIGBTZWxlY3Rpb25gIGZvciBhIHJlc29sdmVkIGhvdmVyIHRhcmdldC4gYGZpbGVgXG4gKiBkZWZhdWx0cyB0byBgZGVyaXZlRmlsZSgpYDsgdGhlIGNvbW1lbnQgbW91bnQgbGF5ZXIgcGFzc2VzIGl0IGV4cGxpY2l0bHlcbiAqIHNvIGFsbCB0aHJlZSBjb25zdW1lcnMgKHJvdXRlciwgb3ZlcmxheSwgbW91bnQpIGFncmVlIG9uIHRoZSBzYW1lIGtleS5cbiAqL1xuLyoqXG4gKiBUaGUgYXJ0Ym9hcmQtc2NvcGVkIGRhdGEtY2QtaWQgc2VsZWN0b3IuIEEgY29tcG9uZW50IHNoYXJlZCBhY3Jvc3MgYXJ0Ym9hcmRzXG4gKiBjYXJyaWVzIHRoZSBTQU1FIGRhdGEtY2QtaWQgaW4gZWFjaCwgc28gYSBiYXJlIGBbZGF0YS1jZC1pZD1cIuKAplwiXWAgcmVzb2x2ZXNcbiAqICh2aWEgcXVlcnlTZWxlY3RvcikgdG8gdGhlIEZJUlNUIGFydGJvYXJkLiBQcmVmaXhpbmcgdGhlIGhpdCdzIGFydGJvYXJkIG1ha2VzXG4gKiB0aGUgYW5jaG9yIHBlci1pbnN0YW5jZS4gU2hhcmVkIGJ5IEVWRVJZIHNlbGVjdG9yIGJ1aWxkZXIgKyByZXNvbHZlciBzbyB0aGV5XG4gKiBjYW4ndCBkcmlmdCAodGhlIG9yaWdpbmFsIGZpeCBvbmx5IHBhdGNoZWQgb25lIG9mIH44IHNpdGVzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjb3BlZENkU2VsZWN0b3IoY2RJZDogc3RyaW5nLCBhcnRib2FyZElkPzogc3RyaW5nIHwgbnVsbCk6IHN0cmluZyB7XG4gIHJldHVybiBhcnRib2FyZElkXG4gICAgPyBgW2RhdGEtZGMtc2NyZWVuPVwiJHthcnRib2FyZElkfVwiXSBbZGF0YS1jZC1pZD1cIiR7Y2RJZH1cIl1gXG4gICAgOiBgW2RhdGEtY2QtaWQ9XCIke2NkSWR9XCJdYDtcbn1cblxuLyoqXG4gKiBPY2N1cnJlbmNlIGluZGV4IG9mIGBlbGAgYW1vbmcgYGRvYy5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKWAuIEV2ZW4gd2l0aCBhblxuICogYXJ0Ym9hcmQtc2NvcGVkIGRhdGEtY2QtaWQgc2VsZWN0b3IsIGEgY29tcG9uZW50IHJlcGVhdGVkIFdJVEhJTiBvbmUgYXJ0Ym9hcmRcbiAqIChhIGxpc3Qgcm93LCBvciBhIHJldXNhYmxlIHVzZWQgdHdpY2UpIHByb2R1Y2VzIHNldmVyYWwgbWF0Y2hlcyDigJQgdGhlIGluZGV4XG4gKiBpcyB0aGUgb25seSB0aGluZyB0aGF0IG1ha2VzIHRoZSBhbmNob3IgdHJ1bHkgdW5pcXVlIHBlciBET00gaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RvckluZGV4KGRvYzogRG9jdW1lbnQsIHNlbGVjdG9yOiBzdHJpbmcsIGVsOiBFbGVtZW50IHwgbnVsbCk6IG51bWJlciB7XG4gIGlmICghZWwpIHJldHVybiAwO1xuICB0cnkge1xuICAgIGNvbnN0IGFsbCA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFsbFtpXSA9PT0gZWwpIHJldHVybiBpO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLyogbWFsZm9ybWVkIHNlbGVjdG9yICovXG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIHN0b3JlZCBTZWxlY3Rpb24gdG8gaXRzIGxpdmUgZWxlbWVudCwgYXJ0Ym9hcmQtc2NvcGVkLiBQcmVmZXJzIHRoZVxuICogaWQrYXJ0Ym9hcmRJZCBzY29wZWQgc2VsZWN0b3IgKHRoZSByb2J1c3QgcGF0aCksIHRoZW4gdGhlIHN0b3JlZCBgc2VsZWN0b3JgXG4gKiAoYWxyZWFkeSBzY29wZWQgZm9yIHJlY2VudCBzZWxlY3Rpb25zOyBhIGxlZ2FjeSBmYWxsYmFjayBmb3Igb2xkIGNvbW1lbnRzKS5cbiAqIEV2ZXJ5IGhhbG8gLyBwaW4gLyB0b29sYmFyIC8gc3BhY2luZy1oYW5kbGUgcmVzb2x2ZXIgcm91dGVzIHRocm91Z2ggdGhpcyBzbyBhXG4gKiBzaGFyZWQgY29tcG9uZW50IGFuY2hvcnMgdG8gdGhlIGluc3RhbmNlIHRoZSB1c2VyIGFjdHVhbGx5IGNsaWNrZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlU2VsZWN0aW9uRWwoXG4gIGRvYzogRG9jdW1lbnQsXG4gIHNlbDogeyBpZD86IHN0cmluZyB8IG51bGw7IHNlbGVjdG9yPzogc3RyaW5nIHwgbnVsbDsgYXJ0Ym9hcmRJZD86IHN0cmluZyB8IG51bGw7IGluZGV4PzogbnVtYmVyIH1cbik6IEVsZW1lbnQgfCBudWxsIHtcbiAgY29uc3QgYXQgPSAoc2VsZWN0b3I6IHN0cmluZyk6IEVsZW1lbnQgfCBudWxsID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYWxsID0gZG9jLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICAgICAgaWYgKCFhbGwubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICAgIGNvbnN0IGkgPSBzZWwuaW5kZXggJiYgc2VsLmluZGV4ID4gMCAmJiBzZWwuaW5kZXggPCBhbGwubGVuZ3RoID8gc2VsLmluZGV4IDogMDtcbiAgICAgIHJldHVybiBhbGxbaV0gPz8gYWxsWzBdO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9O1xuICBpZiAoc2VsLmlkKSB7XG4gICAgY29uc3QgZWwgPSBhdChzY29wZWRDZFNlbGVjdG9yKHNlbC5pZCwgc2VsLmFydGJvYXJkSWQpKTtcbiAgICBpZiAoZWwpIHJldHVybiBlbDtcbiAgfVxuICBpZiAoc2VsLnNlbGVjdG9yKSByZXR1cm4gYXQoc2VsLnNlbGVjdG9yKTtcbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogUGhhc2UgMTIuMiDigJQgc3R5bGUgbWFwcyBmb3IgdGhlIENTUy1rbm9iIHByb3BlcnRpZXMuIGBhdXRob3JlZGAgaXMgd2hhdCB0aGVcbiAqIGVsZW1lbnQgc2V0cyBJTkxJTkUgKFJlYWN0IHJlbmRlcnMgYHN0eWxlPXt7cGFkZGluZzo4fX1gIOKGkiBgc3R5bGU9XCJwYWRkaW5nOjhweFwiYCksXG4gKiBzbyB0aGUga25vYiBwcmUtZmlsbHMgdGhlIEVESVRBQkxFIHNvdXJjZSB2YWx1ZSBhbmQgaXMgYmxhbmsgd2hlbiB1bnNldCDigJQgbm90XG4gKiB0aGUgbm9pc3kgcmVzb2x2ZWQgZGVmYXVsdCAoYDY1Ni4wMDNweGAsIGByZ2IoMCwwLDApYCkuIGBjb21wdXRlZGAgaXMgdGhlXG4gKiByZXNvbHZlZCB2YWx1ZSwgc2hvd24gb25seSBhcyBhIGZhaW50IHBsYWNlaG9sZGVyIGhpbnQuIEVtcHR5IGZvciBhIGRldGFjaGVkXG4gKiBub2RlIC8gU1NSLlxuICovXG4vLyBQaGFzZSAxMi4zIChXMi4yIGZpeCkg4oCUIEVWRVJZIHByb3BlcnR5IHRoZSBDU1MgcGFuZWwgaGFzIGEgY29udHJvbCBmb3IsIHNvIGVhY2hcbi8vIHJlYWRzIGJhY2sgaW50byBgYXV0aG9yZWRgIChwcmUtZmlsbHMgdGhlIHJpZ2h0IGNvbnRyb2wpIGFuZCBpcyBleGNsdWRlZCBmcm9tXG4vLyBgY3VzdG9tU3R5bGVzYC4gVGhlIGVhcmxpZXIgc2hvcnQgbGlzdCBvbWl0dGVkIHRoZSBib3gtbW9kZWwgTE9OR0hBTkRTXG4vLyAoYHBhZGRpbmctdG9wYCwgYG1hcmdpbi1sZWZ0YCwg4oCmKSArIHRoZSBMYXlvdXQvYm9yZGVyIGxvbmdoYW5kcywgc28gYSB2YWx1ZSB0aGVcbi8vIHBhbmVsIHdyb3RlIChlLmcuIGFuIGFsdC1zY3J1YiBgcGFkZGluZy10b3BgKSBmZWxsIHRocm91Z2ggdG8gY3VzdG9tU3R5bGVzIGFuZFxuLy8gdGhlIGJveC1tb2RlbCB3aWRnZXQgc2hvd2VkIGl0IGFzIGEgXCJjdXN0b20gQ1NTIHByb3BlcnR5XCIgaW5zdGVhZCBvZiBpbiB0aGUgYm94LlxuY29uc3QgS05PQl9QUk9QUyA9IFtcbiAgLy8gTGF5b3V0XG4gICdkaXNwbGF5JyxcbiAgJ2ZsZXgtZGlyZWN0aW9uJyxcbiAgJ2FsaWduLWl0ZW1zJyxcbiAgJ2p1c3RpZnktY29udGVudCcsXG4gICdnYXAnLFxuICAvLyBUeXBvZ3JhcGh5XG4gICdmb250LWZhbWlseScsXG4gICdjb2xvcicsXG4gICdmb250LXNpemUnLFxuICAnZm9udC13ZWlnaHQnLFxuICAnbGluZS1oZWlnaHQnLFxuICAnbGV0dGVyLXNwYWNpbmcnLFxuICAndGV4dC1hbGlnbicsXG4gIC8vIFNwYWNpbmcg4oCUIHNob3J0aGFuZCAoZm9yIGN1c3RvbVN0eWxlcyBleGNsdXNpb24gKyB3aG9sZS1zaWRlIGF1dGhvcmluZykgQU5EXG4gIC8vIHRoZSA4IGxvbmdoYW5kcyB0aGUgYm94LW1vZGVsIHdpZGdldCBhY3R1YWxseSByZWFkcy93cml0ZXMuXG4gICdtYXJnaW4nLFxuICAnbWFyZ2luLXRvcCcsXG4gICdtYXJnaW4tcmlnaHQnLFxuICAnbWFyZ2luLWJvdHRvbScsXG4gICdtYXJnaW4tbGVmdCcsXG4gICdwYWRkaW5nJyxcbiAgJ3BhZGRpbmctdG9wJyxcbiAgJ3BhZGRpbmctcmlnaHQnLFxuICAncGFkZGluZy1ib3R0b20nLFxuICAncGFkZGluZy1sZWZ0JyxcbiAgLy8gU2l6ZVxuICAnd2lkdGgnLFxuICAnaGVpZ2h0JyxcbiAgJ21heC13aWR0aCcsXG4gIC8vIEFwcGVhcmFuY2VcbiAgJ2JhY2tncm91bmQtY29sb3InLFxuICAnYm9yZGVyLXJhZGl1cycsXG4gICdib3JkZXItdG9wLWxlZnQtcmFkaXVzJyxcbiAgJ2JvcmRlci10b3AtcmlnaHQtcmFkaXVzJyxcbiAgJ2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXMnLFxuICAnYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXMnLFxuICAnYm9yZGVyLXdpZHRoJyxcbiAgJ2JvcmRlci1zdHlsZScsXG4gICdib3JkZXItY29sb3InLFxuICAnYm94LXNoYWRvdycsXG4gICdvcGFjaXR5Jyxcbl0gYXMgY29uc3Q7XG5cbi8vIFBoYXNlIDEyLjMg4oCUIEhUTUwgYXR0cmlidXRlcyB0aGUgY3VzdG9tLWF0dHJpYnV0ZSBoYXRjaCBtYXkgaGF2ZSB3cml0dGVuLCBzbyBhXG4vLyBqdXN0LWFkZGVkIGBkYXRhLSpgL2BhcmlhLSpgL2Byb2xlYC9gdGl0bGVgIHJvdW5kLXRyaXBzIGJhY2sgaW50byBhIHBhbmVsIHJvdy5cbi8vIEV4Y2x1ZGVzIHRoZSBzdHJ1Y3R1cmFsIG9uZXMgdGhlIHBhbmVsIG1hbmFnZXMgZWxzZXdoZXJlIChzdHlsZSwgY2xhc3MsXG4vLyBkYXRhLWNkLWlkIHBpcGVsaW5lIGFuY2hvciwgdGhlIGRhdGEtZGMtKiBjYW52YXMgY2hyb21lIG1hcmtlcnMpLlxuY29uc3QgQVRUUl9TS0lQID0gL14oc3R5bGV8Y2xhc3N8ZGF0YS1jZC1pZHxkYXRhLWRjLXxkYXRhLWRjaWQkKS87XG5cbmZ1bmN0aW9uIHN0eWxlTWFwc0ZvcihlbDogRWxlbWVudCB8IG51bGwpOiB7XG4gIGF1dGhvcmVkOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBjb21wdXRlZDogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgY3VzdG9tU3R5bGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBhdHRyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn0ge1xuICBpZiAoIWVsIHx8IHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICF3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSkge1xuICAgIHJldHVybiB7IGF1dGhvcmVkOiB7fSwgY29tcHV0ZWQ6IHt9LCBjdXN0b21TdHlsZXM6IHt9LCBhdHRyczoge30gfTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGlubGluZSA9IChlbCBhcyBIVE1MRWxlbWVudCkuc3R5bGU7XG4gICAgY29uc3QgY3MgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCBhcyBIVE1MRWxlbWVudCk7XG4gICAgY29uc3QgYXV0aG9yZWQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBjb25zdCBjb21wdXRlZDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIGNvbnN0IGtub2IgPSBuZXcgU2V0PHN0cmluZz4oS05PQl9QUk9QUyBhcyByZWFkb25seSBzdHJpbmdbXSk7XG4gICAgLy8gQ3VyYXRlZCBrbm9iIHByb3BzOiBhdXRob3JlZCB2YWx1ZSAoa25vYiBwcmUtZmlsbCkgKyBjb21wdXRlZCAocGxhY2Vob2xkZXIpLlxuICAgIGZvciAoY29uc3QgcCBvZiBLTk9CX1BST1BTKSB7XG4gICAgICBjb25zdCBhID0gaW5saW5lLmdldFByb3BlcnR5VmFsdWUocCk7XG4gICAgICBpZiAoYSkgYXV0aG9yZWRbcF0gPSBhLnRyaW0oKTtcbiAgICAgIGNvbnN0IGMgPSBjcy5nZXRQcm9wZXJ0eVZhbHVlKHApO1xuICAgICAgaWYgKGMpIGNvbXB1dGVkW3BdID0gYy50cmltKCk7XG4gICAgfVxuICAgIC8vIEV2ZXJ5IE9USEVSIGF1dGhvcmVkIGlubGluZSBwcm9wZXJ0eSDihpIgY3VzdG9tU3R5bGVzLCBzbyB0aGUgcGFuZWwgY2FuIHNob3dcbiAgICAvLyBhIGN1c3RvbSBDU1MgcHJvcGVydHkgdGhlIHVzZXIgYWRkZWQgdGhhdCBubyBjdXJhdGVkIHJvdyBjb3ZlcnMuIEVYQ0xVREVcbiAgICAvLyB0aGUgcGFuZWwtbWFuYWdlZCBGQU1JTElFUyB3aG9sZXNhbGU6IHNldHRpbmcgYGJvcmRlcmAvYGJvcmRlci1yYWRpdXNgIChvclxuICAgIC8vIHRoZWlyIDMtd2F5IHNob3J0aGFuZHMpIG1ha2VzIHRoZSBDU1NPTSBleHBhbmQgdGhlbSB0byB0aGUgcGVyLXNpZGVcbiAgICAvLyBsb25naGFuZHMg4oCUIGBib3JkZXItdG9wLXdpZHRoYCwgYGJvcmRlci1sZWZ0LWNvbG9yYCwg4oCmIOKAlCB3aGljaCB0aGUgcGFuZWxcbiAgICAvLyBjb250cm9scyBidXQgY2FuJ3QgZW51bWVyYXRlIGluIHRoZSBrbm9iIHNldC4gV2l0aG91dCB0aGUgZmFtaWx5IGd1YXJkIHRoZXlcbiAgICAvLyBsZWFrIGludG8gXCJjdXN0b20gQ1NTIHByb3BlcnRpZXNcIiAodGhlIHNhbWUgY2xhc3Mgb2YgYnVnIGZpeGVkIGZvciBzcGFjaW5nKS5cbiAgICBjb25zdCBNQU5BR0VEX0ZBTUlMWSA9IC9eKG1hcmdpbnxwYWRkaW5nfGJvcmRlcikoLXwkKS87XG4gICAgY29uc3QgY3VzdG9tU3R5bGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmxpbmUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHAgPSBpbmxpbmUuaXRlbShpKTtcbiAgICAgIGlmICghcCB8fCBrbm9iLmhhcyhwKSB8fCBNQU5BR0VEX0ZBTUlMWS50ZXN0KHApKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHYgPSBpbmxpbmUuZ2V0UHJvcGVydHlWYWx1ZShwKTtcbiAgICAgIGlmICh2KSBjdXN0b21TdHlsZXNbcF0gPSB2LnRyaW0oKTtcbiAgICB9XG4gICAgLy8gQ3VzdG9tIEhUTUwgYXR0cmlidXRlcyAodGhlIGVzY2FwZS1oYXRjaCBzdXJmYWNlKS5cbiAgICBjb25zdCBhdHRyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIGZvciAoY29uc3QgYSBvZiBBcnJheS5mcm9tKChlbCBhcyBIVE1MRWxlbWVudCkuYXR0cmlidXRlcykpIHtcbiAgICAgIGlmIChBVFRSX1NLSVAudGVzdChhLm5hbWUpKSBjb250aW51ZTtcbiAgICAgIGF0dHJzW2EubmFtZV0gPSBhLnZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4geyBhdXRob3JlZCwgY29tcHV0ZWQsIGN1c3RvbVN0eWxlcywgYXR0cnMgfTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHsgYXV0aG9yZWQ6IHt9LCBjb21wdXRlZDoge30sIGN1c3RvbVN0eWxlczoge30sIGF0dHJzOiB7fSB9O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBob3ZlclRhcmdldFRvU2VsZWN0aW9uKHRhcmdldDogSG92ZXJUYXJnZXQsIGZpbGU/OiBzdHJpbmcpOiBTZWxlY3Rpb24ge1xuICBjb25zdCBlbCA9IHRhcmdldC5lbDtcbiAgY29uc3QgcmVjdCA9XG4gICAgZWwgJiYgKGVsIGFzIEhUTUxFbGVtZW50KS5nZXRCb3VuZGluZ0NsaWVudFJlY3RcbiAgICAgID8gKGVsIGFzIEhUTUxFbGVtZW50KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgOiBudWxsO1xuICAvLyBgY2RJZGAgaXMgdGhlIGhpdCBlbGVtZW50J3MgT1dOIGRhdGEtY2QtaWQgKGRlZXAgbW9kZSk7IHJlc29sdmVyIG5ldmVyXG4gIC8vIGNsaW1icyB0byBhbiBhbmNlc3Rvci4gRmFsbHMgYmFjayB0byBjc3NQYXRoIG9mIHRoZSBoaXQgd2hlbiBubyBzdGFibGVcbiAgLy8gYW5jaG9yIGV4aXN0cy5cbiAgY29uc3QgY2RJZCA9IHRhcmdldC5jZElkO1xuICAvLyBTZWxlY3RvciByZXNvbHV0aW9uIG9yZGVyOlxuICAvLyAgIDEuIGRhdGEtY2QtaWQgYW5jaG9yIOKAlCBzdGFibGUgcGlwZWxpbmUtc3RhbXBlZCBpZCAocHJlZmVycmVkKS4gU0NPUEVEIGJ5XG4gIC8vICAgICAgdGhlIGhpdCdzIGFydGJvYXJkIChgW2RhdGEtZGMtc2NyZWVuPeKApl0gW2RhdGEtY2QtaWQ94oCmXWApIOKAlCBhIGNvbXBvbmVudFxuICAvLyAgICAgIHNoYXJlZCBhY3Jvc3MgYXJ0Ym9hcmRzIGNhcnJpZXMgdGhlIFNBTUUgZGF0YS1jZC1pZCBpbiBlYWNoLCBzbyBhblxuICAvLyAgICAgIHVuc2NvcGVkIGBbZGF0YS1jZC1pZF1gIHNlbGVjdG9yIHJlc29sdmVzICh2aWEgcXVlcnlTZWxlY3RvcikgdG8gdGhlXG4gIC8vICAgICAgRklSU1QgYXJ0Ym9hcmQncyBpbnN0YW5jZSBhbmQgdGhlIHBpbi9zZWxlY3QgbGFuZHMgb24gdGhlIHdyb25nIGJvYXJkLlxuICAvLyAgICAgIFByZWZpeGluZyB0aGUgYXJ0Ym9hcmQgbWFrZXMgdGhlIGFuY2hvciBwZXItaW5zdGFuY2UuXG4gIC8vICAgMi4gZGF0YS1kYy1zY3JlZW4g4oCUIGNocm9tZSBjbGljayBwcm9tb3RlZCB0byB3aG9sZS1hcnRib2FyZCBzZWxlY3RcbiAgLy8gICAgICAoVDI0LjUgRzggbXVsdGktYXJ0Ym9hcmQgZ2VzdHVyZSkuXG4gIC8vICAgMy4gY3NzUGF0aCBvZiB0aGUgaGl0IOKAlCBsYXN0LXJlc29ydCBwYXRoIHN0cmluZy5cbiAgY29uc3Qgc2VsZWN0b3IgPSBjZElkXG4gICAgPyBzY29wZWRDZFNlbGVjdG9yKGNkSWQsIHRhcmdldC5hcnRib2FyZElkKVxuICAgIDogdGFyZ2V0LmFydGJvYXJkSWRcbiAgICAgID8gYFtkYXRhLWRjLXNjcmVlbj1cIiR7dGFyZ2V0LmFydGJvYXJkSWR9XCJdYFxuICAgICAgOiBjc3NQYXRoKGVsKTtcbiAgLy8gRGlzYW1iaWd1YXRlIHJlcGVhdGVkIGluc3RhbmNlcyB3aXRoaW4gdGhlIHNhbWUgYXJ0Ym9hcmQgKGxpc3Qgcm93cywgYVxuICAvLyByZXVzYWJsZSB1c2VkIHR3aWNlKSDigJQgdGhlIGluZGV4IGlzIHdoaWNoIGBxdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKWBcbiAgLy8gbWF0Y2ggdGhpcyBlbGVtZW50IGlzLiBjc3NQYXRoIGlzIGFscmVhZHkgdW5pcXVlLCBzbyAwIHRoZXJlLlxuICBjb25zdCBpbmRleCA9IGNkSWQgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyA/IHNlbGVjdG9ySW5kZXgoZG9jdW1lbnQsIHNlbGVjdG9yLCBlbCkgOiAwO1xuICByZXR1cm4ge1xuICAgIGZpbGU6IGZpbGUgPz8gZGVyaXZlRmlsZSgpLFxuICAgIGlkOiBjZElkID8/IHVuZGVmaW5lZCxcbiAgICBzZWxlY3RvcixcbiAgICBhcnRib2FyZElkOiB0YXJnZXQuYXJ0Ym9hcmRJZCxcbiAgICBpbmRleCxcbiAgICB0YWc6IGVsPy50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPz8gJycsXG4gICAgY2xhc3NlczogcmVhbENsYXNzZXMoZWwpLFxuICAgIHRleHQ6IHNob3J0VGV4dChlbCwgMjQwKSxcbiAgICBkb21fcGF0aDogZG9tUGF0aChlbCksXG4gICAgYm91bmRzOiByZWN0XG4gICAgICA/IHtcbiAgICAgICAgICB4OiBNYXRoLnJvdW5kKHJlY3QubGVmdCksXG4gICAgICAgICAgeTogTWF0aC5yb3VuZChyZWN0LnRvcCksXG4gICAgICAgICAgdzogTWF0aC5yb3VuZChyZWN0LndpZHRoKSxcbiAgICAgICAgICBoOiBNYXRoLnJvdW5kKHJlY3QuaGVpZ2h0KSxcbiAgICAgICAgfVxuICAgICAgOiBudWxsLFxuICAgIGh0bWw6IGVsID8gKGVsLm91dGVySFRNTCA/PyAnJykuc2xpY2UoMCwgNDAwMCkgOiAnJyxcbiAgICAuLi5zdHlsZU1hcHNGb3IoZWwpLFxuICB9O1xufVxuIiwKICAgICIvKipcbiAqIEBmaWxlICAgICAgIGlucHV0LXJvdXRlci50c3gg4oCUIGNhbnZhcyBwb2ludGVyL2tleWJvYXJkIGNsYXNzaWZpZXIgKyBob29rXG4gKiBAc2NvcGUgICAgICBhcHBzL3N0dWRpby9pbnB1dC1yb3V0ZXIudHN4XG4gKiBAcHVycG9zZSAgICBPd25lZCBieSBjYW52YXMtbGliJ3MgRGVzaWduQ2FudmFzLiBDbGFzc2lmaWVzIHRoZSBOT04tV0hFRUxcbiAqICAgICAgICAgICAgIHN1YnNldCBvZiBwb2ludGVyICsga2V5IGV2ZW50cyBpbnRvIGRpc2NyZXRlIHJvdXRlciBhY3Rpb25zLlxuICogICAgICAgICAgICAgYHVzZVZpZXdwb3J0Q29udHJvbGxlcmAga2VlcHMgb3duaW5nIHdoZWVsICsgbWlkZGxlLW1vdXNlICtcbiAqICAgICAgICAgICAgIHNwYWNlLXBhbiArIENtZCswLzEvKy8tIOKAlCB0aGUgdHdvIHN0YWNrcyBjb2V4aXN0IHdpdGhvdXQgYVxuICogICAgICAgICAgICAgbGlzdGVuZXIgcmFjZSAoRERSLTAyNikuXG4gKlxuICogRXZlbnQgb3duZXJzaGlwIChyZWFkIHRoaXMgYmVmb3JlIGFkZGluZyBoYW5kbGVycyk6XG4gKlxuICogICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilKzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJBcbiAqICAg4pSCIEV2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUgiBPd25lciAgICAgICAgICAgICAgICAgICAg4pSCXG4gKiAgIOKUnOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUvOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUpFxuICogICDilIIgd2hlZWwgLyBzaGlmdC13aGVlbCAvIGNtZC13aGVlbCAg4pSCIHVzZVZpZXdwb3J0Q29udHJvbGxlciAgICDilIJcbiAqICAg4pSCIHBvaW50ZXJkb3duIGJ0bj0xIC8gc3BhY2UtaGVsZCAgIOKUgiB1c2VWaWV3cG9ydENvbnRyb2xsZXIgICAg4pSCXG4gKiAgIOKUgiBrZXlkb3duIFNwYWNlIC8gQ21kKzAvMS8rLy0gICAgICDilIIgdXNlVmlld3BvcnRDb250cm9sbGVyICAgIOKUglxuICogICDilIIgcG9pbnRlcm1vdmUgKGhvdmVyKSAgICAgICAgICAgICAg4pSCIGlucHV0LXJvdXRlciAgICAgICAgICAgICDilIJcbiAqICAg4pSCIHBvaW50ZXJkb3duIGJ0bj0wIChzZWxlY3QpICAgICAgIOKUgiBpbnB1dC1yb3V0ZXIgICAgICAgICAgICAg4pSCXG4gKiAgIOKUgiBwb2ludGVyZG93biBidG49MiAocmlnaHQtY2xpY2spICDilIIgaW5wdXQtcm91dGVyICAgICAgICAgICAgIOKUglxuICogICDilIIga2V5ZG93biBWIC8gSCAvIEMgLyBFc2MgICAgICAgICAg4pSCIGlucHV0LXJvdXRlciAgICAgICAgICAgICDilIJcbiAqICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pS04pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYXG4gKlxuICogVGhlIHJvdXRlciBkb2VzIG5vIERPTSB3b3JrIGl0c2VsZiDigJQgYGNsYXNzaWZ5KClgIGlzIHB1cmUgKHRlc3RhYmxlIHdpdGhvdXRcbiAqIGEgRE9NKSBhbmQgYHVzZUlucHV0Um91dGVyKClgIGF0dGFjaGVzIGxpc3RlbmVycyB0aGF0IGRpc3BhdGNoIHRocm91Z2ggdGhlXG4gKiBjYWxsZXItc3VwcGxpZWQgY2FsbGJhY2tzLiBIb3Zlci10YXJnZXQgcmVzb2x1dGlvbiArIHNlbGVjdGlvbiBwZXJzaXN0ZW5jZVxuICogbGl2ZSBpbiB0aGUgY29uc3VtZXIgKERlc2lnbkNhbnZhcykuXG4gKi9cblxuaW1wb3J0IHsgdHlwZSBSZWZPYmplY3QsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBEcmFnLXZzLWNsaWNrIHRocmVzaG9sZCAoVDI1KVxuLy9cbi8vIDQgcHggc2NyZWVuLXBpeGVsIGh5cG90IHNlcGFyYXRlcyBcImNsaWNrXCIgZnJvbSBcImRyYWdcIiDigJQgTWljcm9zb2Z0IFdpbjMyXG4vLyBjYW5vbmljYWwgKGBTTV9DWERSQUdgL2BTTV9DWURSQUdgIGRlZmF1bHQpLCBhbHNvIGQzLWRyYWcgYW5kIHRsZHJhdyBkZWZhdWx0LlxuLy8gT3duZWQgaGVyZSBzbyBhcnRib2FyZC1kcmFnLCBhcnRib2FyZC1tYXJxdWVlLCBlbGVtZW50LW1hcnF1ZWUsIGFubm90YXRpb24tXG4vLyBkcmFnLXZzLXRhcCwgYW5kIGFueSBmdXR1cmUgZHJhZy1jbGFzcyBnZXN0dXJlIGFsbCByZWFkIHRoZSBzYW1lIGNvbnN0YW50LlxuLy8gV2hlZWwgKyBwaW5jaC16b29tIGFyZSBFWEVNUFQg4oCUIHRocmVzaG9sZCBpcyBmb3IgYHBvaW50ZXJkb3duIOKGkiBwb2ludGVybW92ZWBcbi8vIGRyYWcgY2xhc3NpZmljYXRpb24gb25seS5cblxuZXhwb3J0IGNvbnN0IERSQUdfVEhSRVNIT0xEX1BYID0gNDtcblxuLyoqIFRydWUgb25jZSB0aGUgcG9pbnRlciBoYXMgbW92ZWQg4omlIERSQUdfVEhSRVNIT0xEX1BYIGZyb20gaXRzIHN0YXJ0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyb3NzZWREcmFnVGhyZXNob2xkKFxuICBzdGFydFg6IG51bWJlcixcbiAgc3RhcnRZOiBudW1iZXIsXG4gIGN1clg6IG51bWJlcixcbiAgY3VyWTogbnVtYmVyXG4pOiBib29sZWFuIHtcbiAgY29uc3QgZHggPSBjdXJYIC0gc3RhcnRYO1xuICBjb25zdCBkeSA9IGN1clkgLSBzdGFydFk7XG4gIHJldHVybiBNYXRoLmh5cG90KGR4LCBkeSkgPj0gRFJBR19USFJFU0hPTERfUFg7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gVHlwZXNcblxuLyoqXG4gKiBUb29sIHVuaW9uLiBQaGFzZSA0LjEgc2hpcHBlZCBWL0gvQzsgUGhhc2UgNSBhZGRzIHRoZSBkcmF3IHNldFxuICogKHBlbiAvIHJlY3QgLyBhcnJvdyAvIGVyYXNlcikuIERyYXctdG9vbCBwb2ludGVyIGV2ZW50cyBhcmUgb3duZWQgYnlcbiAqIGBBbm5vdGF0aW9uc0xheWVyYCDigJQgdGhlIHJvdXRlciBjbGFzc2lmaWVzIHRoZWlyIGxldHRlciBzaG9ydGN1dHMgYnV0XG4gKiByZXR1cm5zIGBuby1vcGAgZm9yIHRoZSBjb3JyZXNwb25kaW5nIHBvaW50ZXIgZXZlbnRzIHNvIHRoZSBTVkcgb3ZlcmxheVxuICogY2FuIGdyYWIgdGhlbSBuYXRpdmVseS5cbiAqL1xuZXhwb3J0IHR5cGUgVG9vbCA9XG4gIHwgJ21vdmUnXG4gIHwgJ2hhbmQnXG4gIHwgJ2NvbW1lbnQnXG4gIHwgJ3BlbidcbiAgLy8gQW5ub3RhdGlvbiBwb2xpc2ggKGl0ZW0gOCkg4oCUIEZpZ0phbS1zdHlsZSBoaWdobGlnaHRlci4gQSBgcGVuYC1zaGFwZWQgdG9vbFxuICAvLyB0aGF0IHByb2R1Y2VzIGEgdHJhbnNsdWNlbnQgd2lkZSBtdWx0aXBseSBzdHJva2UgKGEgUGVuU3Ryb2tlIHdpdGhcbiAgLy8gYGhpZ2hsaWdodGVyOnRydWVgKSwgbm90IGEgbmV3IHN0cm9rZSB0eXBlLlxuICB8ICdoaWdobGlnaHRlcidcbiAgLy8gUGhhc2UgMjQg4oCUIGBzaGFwZWAgaXMgdGhlIHNpbmdsZSBhY3RpdmUgZHJhdyB0b29sIHRoYXQgcHJvZHVjZXMgcmVjdCAvXG4gIC8vIGVsbGlwc2UgLyBwb2x5Z29uIHN0cm9rZXMgKHRoZSBraW5kIGlzIGNob3NlbiB2aWEgdGhlIHBhbGV0dGUgcG9wb3ZlcikuXG4gIC8vIGByZWN0YCAvIGBlbGxpcHNlYCBzdGF5IGluIHRoZSB1bmlvbiBhcyB0aGUgc3Ryb2tlIGRpc2NyaW1pbmFudHMgdGhleVxuICAvLyBhbHdheXMgd2VyZSwgYnV0IGFyZSBubyBsb25nZXIgZGlyZWN0bHkgc2VsZWN0YWJsZSBhY3RpdmUgdG9vbHMuXG4gIHwgJ3NoYXBlJ1xuICB8ICdyZWN0J1xuICB8ICdlbGxpcHNlJ1xuICB8ICdhcnJvdydcbiAgfCAnc3RpY2t5J1xuICB8ICd0ZXh0J1xuICAvLyBGaWdKYW0gdjMg4oCUIGxhYmVsbGVkIG9yZ2FuaXppbmcgY29udGFpbmVyIChTaGlmdCtTKS5cbiAgfCAnc2VjdGlvbidcbiAgfCAnZXJhc2VyJztcblxuY29uc3QgQU5OT1RBVElPTl9UT09MUyA9IG5ldyBTZXQ8VG9vbD4oW1xuICAncGVuJyxcbiAgJ2hpZ2hsaWdodGVyJyxcbiAgJ3NoYXBlJyxcbiAgJ3JlY3QnLFxuICAnZWxsaXBzZScsXG4gICdhcnJvdycsXG4gICdzdGlja3knLFxuICAndGV4dCcsXG4gICdzZWN0aW9uJyxcbiAgJ2VyYXNlcicsXG5dKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzQW5ub3RhdGlvblRvb2wodDogVG9vbCk6IGJvb2xlYW4ge1xuICByZXR1cm4gQU5OT1RBVElPTl9UT09MUy5oYXModCk7XG59XG5cbmV4cG9ydCB0eXBlIFJvdXRlckFjdGlvbiA9XG4gIHwgeyBraW5kOiAnbm8tb3AnIH1cbiAgfCB7IGtpbmQ6ICdob3Zlcic7IGRlZXA6IGJvb2xlYW47IGNsaWVudFg6IG51bWJlcjsgY2xpZW50WTogbnVtYmVyIH1cbiAgfCB7XG4gICAgICBraW5kOiAnc2VsZWN0JztcbiAgICAgIC8qKiBgcmVwbGFjZWAgc3dhcHMgdGhlIHNlbGVjdGlvbiBzZXQsIGBhZGRgIG1lcmdlcyBpbnRvIGl0LiAqL1xuICAgICAgbW9kZTogJ3JlcGxhY2UnIHwgJ2FkZCc7XG4gICAgICAvKipcbiAgICAgICAqIGB0cnVlYCByZXNvbHZlcyB0byB0aGUgZGVlcGVzdCBkZXNjZW5kYW50IHVuZGVyIHRoZSBjdXJzb3IgKENtZC1oZWxkXG4gICAgICAgKiBtb2RlKS4gYGZhbHNlYCByZXNvbHZlcyB0byB0aGUgdG9wbW9zdCBpbnRlcmVzdGluZyBhbmNlc3RvciAodG9wIG1vZGUpLlxuICAgICAgICogUGhhc2UgNC4xIE1vdmUtdG9vbCBzZWxlY3Rpb24gYWx3YXlzIHVzZXMgZGVlcD10cnVlIOKAlCBiYXJlIGNsaWNrc1xuICAgICAgICogYXJlIHBhc3N0aHJvdWdoIChubyBzZWxlY3QpLCBhbmQgdGhlIG9ubHkgZW50cnkgcG9pbnRzIGFyZSBDbWRcbiAgICAgICAqIChyZXBsYWNlIGRlZXApIGFuZCBDbWQrU2hpZnQgKGFkZCBkZWVwKS5cbiAgICAgICAqL1xuICAgICAgZGVlcDogYm9vbGVhbjtcbiAgICAgIGNsaWVudFg6IG51bWJlcjtcbiAgICAgIGNsaWVudFk6IG51bWJlcjtcbiAgICB9XG4gIHwgeyBraW5kOiAnZHJvcC1jb21tZW50JzsgY2xpZW50WDogbnVtYmVyOyBjbGllbnRZOiBudW1iZXIgfVxuICB8IHsga2luZDogJ2NvbnRleHQtbWVudSc7IGNsaWVudFg6IG51bWJlcjsgY2xpZW50WTogbnVtYmVyIH1cbiAgfCB7IGtpbmQ6ICd0b29sJzsgdG9vbDogVG9vbCB9XG4gIHwgeyBraW5kOiAnZXNjYXBlJyB9XG4gIHwgeyBraW5kOiAndW5kbycgfVxuICB8IHsga2luZDogJ3JlZG8nIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xhc3NpZnlJbnB1dCB7XG4gIHR5cGU6ICdwb2ludGVybW92ZScgfCAncG9pbnRlcmRvd24nIHwgJ2NvbnRleHRtZW51JyB8ICdrZXlkb3duJztcbiAgLyoqIFBvaW50ZXJFdmVudC5idXR0b246IDAgPSBsZWZ0LCAxID0gbWlkZGxlLCAyID0gcmlnaHQuICovXG4gIGJ1dHRvbj86IG51bWJlcjtcbiAgbWV0YUtleT86IGJvb2xlYW47XG4gIGN0cmxLZXk/OiBib29sZWFuO1xuICBzaGlmdEtleT86IGJvb2xlYW47XG4gIGFsdEtleT86IGJvb2xlYW47XG4gIGtleT86IHN0cmluZztcbiAgY2xpZW50WD86IG51bWJlcjtcbiAgY2xpZW50WT86IG51bWJlcjtcbiAgLyoqIFNwYWNlYmFyIGhlbGQg4oCUIHNoYXJlZCBzaWduYWwgd2l0aCBgdXNlVmlld3BvcnRDb250cm9sbGVyYCdzIHBhbi1kcmFnLiAqL1xuICBzcGFjZUhlbGQ/OiBib29sZWFuO1xuICAvKiogRXZlbnQgdGFyZ2V0IGlzIGVkaXRhYmxlIChpbnB1dC90ZXh0YXJlYS9jb250ZW50RWRpdGFibGUpIOKAlCBjYWxsZXIgY29tcHV0ZXMuICovXG4gIGlzRWRpdGFibGU/OiBib29sZWFuO1xuICBhY3RpdmVUb29sOiBUb29sO1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIGNsYXNzaWZ5IOKAlCBwdXJlIGZ1bmN0aW9uLiBBbGwgYnJhbmNoaW5nIGxpdmVzIGhlcmUgc28gdW5pdCB0ZXN0cyBjb3ZlciBldmVyeVxuLy8gcm93IG9mIHRoZSBkaXNwYXRjaCB0YWJsZSB3aXRob3V0IHNwaW5uaW5nIHVwIGEgRE9NLlxuXG5jb25zdCBtZXRhT3JDdHJsID0gKGk6IENsYXNzaWZ5SW5wdXQpOiBib29sZWFuID0+ICEhKGkubWV0YUtleSB8fCBpLmN0cmxLZXkpO1xuXG5leHBvcnQgZnVuY3Rpb24gY2xhc3NpZnkoaW5wdXQ6IENsYXNzaWZ5SW5wdXQpOiBSb3V0ZXJBY3Rpb24ge1xuICBpZiAoaW5wdXQudHlwZSA9PT0gJ2tleWRvd24nKSB7XG4gICAgaWYgKGlucHV0LmlzRWRpdGFibGUpIHJldHVybiB7IGtpbmQ6ICduby1vcCcgfTtcbiAgICAvLyBUb29sIGxldHRlcnMgYXJlIGJhcmUga2V5cyDigJQgQ21kL0N0cmwvQWx0K2xldHRlciBiZWxvbmdzIHRvIHNoZWxsIC8gYnJvd3Nlci5cbiAgICBpZiAoaW5wdXQubWV0YUtleSB8fCBpbnB1dC5jdHJsS2V5IHx8IGlucHV0LmFsdEtleSkge1xuICAgICAgLy8gRXNjIHdpdGggbW9kaWZpZXJzIHN0aWxsIGRpc21pc3Nlcy5cbiAgICAgIGlmIChpbnB1dC5rZXkgPT09ICdFc2NhcGUnKSByZXR1cm4geyBraW5kOiAnZXNjYXBlJyB9O1xuICAgICAgLy8gVW5kbyAvIHJlZG8gKFBoYXNlIDIwKS4gQWx0IGlzIHJlc2VydmVkIOKAlCBDbWQrT3B0K1ogaXMgYSBicm93c2VyXG4gICAgICAvLyB0ZXh0LWlucHV0IGdlc3R1cmUgd2UgZG9uJ3QgY2xhaW0uIGBtZXRhS2V5IHx8IGN0cmxLZXlgIGNvdmVycyBib3RoXG4gICAgICAvLyBtYWMgYW5kIFdpbmRvd3MgLyBMaW51eCB3aXRob3V0IGEgcGxhdGZvcm0gc25pZmYuXG4gICAgICBjb25zdCBrID0gKGlucHV0LmtleSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmICghaW5wdXQuYWx0S2V5ICYmIChpbnB1dC5tZXRhS2V5IHx8IGlucHV0LmN0cmxLZXkpKSB7XG4gICAgICAgIGlmIChrID09PSAneicgJiYgaW5wdXQuc2hpZnRLZXkpIHJldHVybiB7IGtpbmQ6ICdyZWRvJyB9O1xuICAgICAgICBpZiAoayA9PT0gJ3onKSByZXR1cm4geyBraW5kOiAndW5kbycgfTtcbiAgICAgICAgaWYgKGsgPT09ICd5JyAmJiAhaW5wdXQuc2hpZnRLZXkpIHJldHVybiB7IGtpbmQ6ICdyZWRvJyB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsga2luZDogJ25vLW9wJyB9O1xuICAgIH1cbiAgICBjb25zdCBrID0gKGlucHV0LmtleSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoayA9PT0gJ3YnKSByZXR1cm4geyBraW5kOiAndG9vbCcsIHRvb2w6ICdtb3ZlJyB9O1xuICAgIGlmIChrID09PSAnaCcpIHJldHVybiB7IGtpbmQ6ICd0b29sJywgdG9vbDogJ2hhbmQnIH07XG4gICAgaWYgKGsgPT09ICdjJykgcmV0dXJuIHsga2luZDogJ3Rvb2wnLCB0b29sOiAnY29tbWVudCcgfTtcbiAgICBpZiAoayA9PT0gJ2InKSByZXR1cm4geyBraW5kOiAndG9vbCcsIHRvb2w6ICdwZW4nIH07XG4gICAgLy8gSSA9IGhJZ2hsaWdodGVyIChhIGZyZWUgYmFyZSBsZXR0ZXI7ICdIJyBpcyB0YWtlbiBieSBIYW5kKS5cbiAgICBpZiAoayA9PT0gJ2knKSByZXR1cm4geyBraW5kOiAndG9vbCcsIHRvb2w6ICdoaWdobGlnaHRlcicgfTtcbiAgICAvLyBQaGFzZSAyNCDigJQgUiAoYW5kIGxlZ2FjeSBPKSBib3RoIGFybSB0aGUgc2luZ2xlIFNoYXBlIHRvb2w7IHRoZSBzcGVjaWZpY1xuICAgIC8vIHByaW1pdGl2ZSBpcyBwaWNrZWQgZnJvbSB0aGUgcGFsZXR0ZSdzIHNoYXBlLWtpbmQgcG9wb3Zlci5cbiAgICBpZiAoayA9PT0gJ3InIHx8IGsgPT09ICdvJykgcmV0dXJuIHsga2luZDogJ3Rvb2wnLCB0b29sOiAnc2hhcGUnIH07XG4gICAgaWYgKGsgPT09ICdhJykgcmV0dXJuIHsga2luZDogJ3Rvb2wnLCB0b29sOiAnYXJyb3cnIH07XG4gICAgLy8gUGhhc2UgMjEg4oCUIE4gPSBzdGlja3kgTm90ZSAoJ1MnIGlzIHRha2VuIGJ5IHRoZSBzaGVsbCBEZXNpZ24tc3lzdGVtIHZpZXdcbiAgICAvLyArIFNoaWZ0LW1hcnF1ZWUpOyBUID0gc3RhbmRhbG9uZSBUZXh0LiBCb3RoIGFyZSBiYXJlIGxldHRlcnMgdGhlIHNoZWxsXG4gICAgLy8geWllbGRzIHdoZW4gZm9jdXMgaXMgaW5zaWRlIHRoZSBjYW52YXMgaWZyYW1lIChhcHAuanN4IG9uS2V5IGJhaWwpLlxuICAgIGlmIChrID09PSAnbicpIHJldHVybiB7IGtpbmQ6ICd0b29sJywgdG9vbDogJ3N0aWNreScgfTtcbiAgICBpZiAoayA9PT0gJ3QnKSByZXR1cm4geyBraW5kOiAndG9vbCcsIHRvb2w6ICd0ZXh0JyB9O1xuICAgIC8vIEZpZ0phbSB2MyDigJQgU2hpZnQrUyBhcm1zIHRoZSBTZWN0aW9uIHRvb2wgKEZpZ0phbSdzIG93biBiaW5kaW5nOyBiYXJlIFNcbiAgICAvLyBzdGF5cyB3aXRoIHRoZSBzaGVsbCdzIERlc2lnbi1zeXN0ZW0gdmlldykuIENoZWNrZWQgaGVyZSBiZWNhdXNlIHRoZVxuICAgIC8vIG1vZGlmaWVyIGd1YXJkIGFib3ZlIG9ubHkgZmlsdGVycyBDbWQvQ3RybC9BbHQuXG4gICAgaWYgKGsgPT09ICdzJyAmJiBpbnB1dC5zaGlmdEtleSkgcmV0dXJuIHsga2luZDogJ3Rvb2wnLCB0b29sOiAnc2VjdGlvbicgfTtcbiAgICBpZiAoayA9PT0gJ2UnKSByZXR1cm4geyBraW5kOiAndG9vbCcsIHRvb2w6ICdlcmFzZXInIH07XG4gICAgaWYgKGlucHV0LmtleSA9PT0gJ0VzY2FwZScpIHJldHVybiB7IGtpbmQ6ICdlc2NhcGUnIH07XG4gICAgcmV0dXJuIHsga2luZDogJ25vLW9wJyB9O1xuICB9XG5cbiAgaWYgKGlucHV0LnR5cGUgPT09ICdjb250ZXh0bWVudScpIHtcbiAgICByZXR1cm4ge1xuICAgICAga2luZDogJ2NvbnRleHQtbWVudScsXG4gICAgICBjbGllbnRYOiBpbnB1dC5jbGllbnRYID8/IDAsXG4gICAgICBjbGllbnRZOiBpbnB1dC5jbGllbnRZID8/IDAsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChpbnB1dC50eXBlID09PSAncG9pbnRlcm1vdmUnKSB7XG4gICAgLy8gUGhhc2UgNSBkcmF3IHRvb2xzOiBwZW4gLyByZWN0IC8gYXJyb3cgLyBlcmFzZXIgb3duIGFsbCB0aGVpciBwb2ludGVyXG4gICAgLy8gZXZlbnRzIHRocm91Z2ggYEFubm90YXRpb25zTGF5ZXJgLiBUaGUgcm91dGVyIG5ldmVyIHBhaW50cyBhIGhvdmVyIGhhbG9cbiAgICAvLyB3aGlsZSBkcmF3aW5nIOKAlCB0aGF0IGFmZm9yZGFuY2UgaXMgcmVzZXJ2ZWQgZm9yIHNlbGVjdCAvIGNvbW1lbnQuXG4gICAgaWYgKGlzQW5ub3RhdGlvblRvb2woaW5wdXQuYWN0aXZlVG9vbCkpIHJldHVybiB7IGtpbmQ6ICduby1vcCcgfTtcbiAgICAvLyBIYW5kIHRvb2w6IGRyYWcgcGFuIGlzIG93bmVkIGJ5IHVzZVZpZXdwb3J0Q29udHJvbGxlcjsgbm8gaG92ZXIgcGFpbnQuXG4gICAgaWYgKGlucHV0LmFjdGl2ZVRvb2wgPT09ICdoYW5kJykgcmV0dXJuIHsga2luZDogJ25vLW9wJyB9O1xuICAgIC8vIENvbW1lbnQgdG9vbDogYWx3YXlzIHBhaW50IGEgcHJldmlldyBoYWxvIG9uIHRoZSBkZWVwZXN0IGVsZW1lbnQgdW5kZXJcbiAgICAvLyBjdXJzb3Ig4oCUIHRoYXQncyB0aGUgZWxlbWVudCB0aGUgdXNlciBpcyBhYm91dCB0byBjb21tZW50IG9uLiBDb21tZW50XG4gICAgLy8gcGluIGF0dGFjaG1lbnQgaXMgdG8gdGhlIHNhbWUgZWxlbWVudCB0aGV5IHdlcmUgaG92ZXJpbmcuXG4gICAgaWYgKGlucHV0LmFjdGl2ZVRvb2wgPT09ICdjb21tZW50Jykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2luZDogJ2hvdmVyJyxcbiAgICAgICAgZGVlcDogdHJ1ZSxcbiAgICAgICAgY2xpZW50WDogaW5wdXQuY2xpZW50WCA/PyAwLFxuICAgICAgICBjbGllbnRZOiBpbnB1dC5jbGllbnRZID8/IDAsXG4gICAgICB9O1xuICAgIH1cbiAgICAvLyBNb3ZlIHRvb2w6IGJhcmUgaG92ZXIgZG9lcyBub3RoaW5nIChuYXRpdmUgaW50ZXJhY3Rpb25zIHBhc3MgdGhyb3VnaCk7XG4gICAgLy8gQ21kLWhlbGQgaG92ZXIgcGFpbnRzIGEgaGFsbyBvbiB0aGUgZGVlcGVzdCBlbGVtZW50IChwcmV2aWV3KS5cbiAgICBpZiAoIW1ldGFPckN0cmwoaW5wdXQpKSByZXR1cm4geyBraW5kOiAnbm8tb3AnIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQ6ICdob3ZlcicsXG4gICAgICBkZWVwOiB0cnVlLFxuICAgICAgY2xpZW50WDogaW5wdXQuY2xpZW50WCA/PyAwLFxuICAgICAgY2xpZW50WTogaW5wdXQuY2xpZW50WSA/PyAwLFxuICAgIH07XG4gIH1cblxuICBpZiAoaW5wdXQudHlwZSA9PT0gJ3BvaW50ZXJkb3duJykge1xuICAgIGlmIChpbnB1dC5idXR0b24gPT09IDIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtpbmQ6ICdjb250ZXh0LW1lbnUnLFxuICAgICAgICBjbGllbnRYOiBpbnB1dC5jbGllbnRYID8/IDAsXG4gICAgICAgIGNsaWVudFk6IGlucHV0LmNsaWVudFkgPz8gMCxcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChpbnB1dC5idXR0b24gPT09IDEgfHwgaW5wdXQuc3BhY2VIZWxkKSByZXR1cm4geyBraW5kOiAnbm8tb3AnIH07XG4gICAgaWYgKGlucHV0LmJ1dHRvbiAhPT0gMCkgcmV0dXJuIHsga2luZDogJ25vLW9wJyB9O1xuXG4gICAgLy8gUGhhc2UgNSBkcmF3IHRvb2xzIG93biBiYXJlIGxlZnQtY2xpY2tzOyB0aGUgcm91dGVyIHJldHVybnMgbm8tb3Agc29cbiAgICAvLyB0aGUgU1ZHIGxheWVyJ3Mgb3duIGxpc3RlbmVycyAobm8gcHJldmVudERlZmF1bHQpIGZpcmUgbm9ybWFsbHkuIENtZC1cbiAgICAvLyBtb2RpZmllZCBjbGlja3Mgc3RpbGwgZmxvdyBpbnRvIHRoZSBtb3ZlLXRvb2wgc2VsZWN0IHBhdGggYmVsb3cg4oCUIHRoYXRcbiAgICAvLyBzdGF5cyBhdmFpbGFibGUgYXMgYW4gZXNjYXBlIGhhdGNoIGV2ZW4gd2hpbGUgYSBkcmF3IHRvb2wgaXMgYWN0aXZlLlxuICAgIGlmIChpc0Fubm90YXRpb25Ub29sKGlucHV0LmFjdGl2ZVRvb2wpICYmICFtZXRhT3JDdHJsKGlucHV0KSkge1xuICAgICAgcmV0dXJuIHsga2luZDogJ25vLW9wJyB9O1xuICAgIH1cblxuICAgIGlmIChpbnB1dC5hY3RpdmVUb29sID09PSAnY29tbWVudCcpIHtcbiAgICAgIC8vIENvbW1lbnQgdG9vbDogYmFyZSBjbGljayBkcm9wcyBhIHBpbi4gQ21kIC8gU2hpZnQgbW9kaWZpZXJzIHJlc2VydmVkXG4gICAgICAvLyBmb3IgZnV0dXJlIFwic2NvcGUgY29tbWVudCB0byBkZWVwZXN0XCIgdmFyaWFudHMg4oCUIGZvciBub3cgdGhleSBmYWxsXG4gICAgICAvLyB0aHJvdWdoIHRvIHRoZSBzYW1lIGRyb3AuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiAnZHJvcC1jb21tZW50JyxcbiAgICAgICAgY2xpZW50WDogaW5wdXQuY2xpZW50WCA/PyAwLFxuICAgICAgICBjbGllbnRZOiBpbnB1dC5jbGllbnRZID8/IDAsXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEhhbmQgdG9vbDogcGFuIGlzIG93bmVkIGJ5IHVzZVZpZXdwb3J0Q29udHJvbGxlciB2aWEgYGlzUGFuRHJhZ0FjdGl2ZWAuXG4gICAgLy8gUm91dGVyIHJldHVybnMgbm8tb3Agc28gaXQgZG9lc24ndCBwcmV2ZW50RGVmYXVsdCBvciBzdG9wUHJvcGFnYXRpb24g4oCUXG4gICAgLy8gdGhlIGNvbnRyb2xsZXIncyBwb2ludGVyZG93biBsaXN0ZW5lciBvbiB0aGUgc2FtZSBob3N0IGNsYWltcyB0aGUgZHJhZy5cbiAgICBpZiAoaW5wdXQuYWN0aXZlVG9vbCA9PT0gJ2hhbmQnKSByZXR1cm4geyBraW5kOiAnbm8tb3AnIH07XG5cbiAgICAvLyBNb3ZlIHRvb2wuIFNlbGVjdGlvbiBPTkxZIGZpcmVzIHdpdGggQ21kIC8gQ21kK1NoaWZ0LiBCYXJlIGNsaWNrcyBhbmRcbiAgICAvLyBTaGlmdC13aXRob3V0LUNtZCBwYXNzIHRocm91Z2ggc28gbmF0aXZlIGNhbnZhcyBpbnRlcmFjdGlvbnMgKGJ1dHRvblxuICAgIC8vIHByZXNzZXMsIGxpbmsgY2xpY2tzLCBpbnB1dCBmb2N1cykgc3RpbGwgd29yayDigJQgZXhhY3RseSB0aGUgc2FtZSBhc1xuICAgIC8vIHByZS1QaGFzZS00LjEgYmVoYXZpb3IgZm9yIGV2ZXJ5dGhpbmcgZXhjZXB0IENtZC1tb2RpZmllZCBnZXN0dXJlcy5cbiAgICBjb25zdCBjbWQgPSBtZXRhT3JDdHJsKGlucHV0KTtcbiAgICBpZiAoIWNtZCkgcmV0dXJuIHsga2luZDogJ25vLW9wJyB9O1xuICAgIGNvbnN0IHNoaWZ0ID0gISFpbnB1dC5zaGlmdEtleTtcbiAgICByZXR1cm4ge1xuICAgICAga2luZDogJ3NlbGVjdCcsXG4gICAgICBtb2RlOiBzaGlmdCA/ICdhZGQnIDogJ3JlcGxhY2UnLFxuICAgICAgZGVlcDogdHJ1ZSxcbiAgICAgIGNsaWVudFg6IGlucHV0LmNsaWVudFggPz8gMCxcbiAgICAgIGNsaWVudFk6IGlucHV0LmNsaWVudFkgPz8gMCxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHsga2luZDogJ25vLW9wJyB9O1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIHVzZUlucHV0Um91dGVyIOKAlCBhdHRhY2ggbGlzdGVuZXJzIHNjb3BlZCB0byBgaG9zdFJlZi5jdXJyZW50YC4gRGlzcGF0Y2hlc1xuLy8gdGhyb3VnaCBgY2FsbGJhY2tzYC4gUmV0dXJucyBub3RoaW5nOyBjbGVhbnMgdXAgb24gdW5tb3VudC5cblxuZXhwb3J0IGludGVyZmFjZSBSb3V0ZXJDYWxsYmFja3Mge1xuICBvbkhvdmVyPzogKGE6IEV4dHJhY3Q8Um91dGVyQWN0aW9uLCB7IGtpbmQ6ICdob3ZlcicgfT4pID0+IHZvaWQ7XG4gIG9uU2VsZWN0PzogKGE6IEV4dHJhY3Q8Um91dGVyQWN0aW9uLCB7IGtpbmQ6ICdzZWxlY3QnIH0+KSA9PiB2b2lkO1xuICBvbkRyb3BDb21tZW50PzogKGE6IEV4dHJhY3Q8Um91dGVyQWN0aW9uLCB7IGtpbmQ6ICdkcm9wLWNvbW1lbnQnIH0+KSA9PiB2b2lkO1xuICBvbkNvbnRleHRNZW51PzogKGE6IEV4dHJhY3Q8Um91dGVyQWN0aW9uLCB7IGtpbmQ6ICdjb250ZXh0LW1lbnUnIH0+KSA9PiB2b2lkO1xuICBvblRvb2w/OiAoYTogRXh0cmFjdDxSb3V0ZXJBY3Rpb24sIHsga2luZDogJ3Rvb2wnIH0+KSA9PiB2b2lkO1xuICBvbkVzY2FwZT86ICgpID0+IHZvaWQ7XG4gIC8qKiBQaGFzZSAyMCDigJQgQ21kK1ogLyBDdHJsK1ouICovXG4gIG9uVW5kbz86ICgpID0+IHZvaWQ7XG4gIC8qKiBQaGFzZSAyMCDigJQgQ21kK1NoaWZ0K1ogLyBDdHJsK1kgLyBDbWQrWS4gKi9cbiAgb25SZWRvPzogKCkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVc2VJbnB1dFJvdXRlck9wdGlvbnMge1xuICBob3N0UmVmOiBSZWZPYmplY3Q8SFRNTEVsZW1lbnQgfCBudWxsPjtcbiAgLyoqIExhdGVzdCBhY3RpdmUgdG9vbCDigJQgcmVhZCBhdCBldmVudCB0aW1lLCBub3QgY2FwdHVyZWQuICovXG4gIGdldEFjdGl2ZVRvb2w6ICgpID0+IFRvb2w7XG4gIC8qKiBPcHRpb25hbCBzcGFjZWJhci1oZWxkIHNpZ25hbCBzaGFyZWQgd2l0aCB1c2VWaWV3cG9ydENvbnRyb2xsZXIuICovXG4gIGlzU3BhY2VIZWxkPzogKCkgPT4gYm9vbGVhbjtcbiAgY2FsbGJhY2tzOiBSb3V0ZXJDYWxsYmFja3M7XG4gIC8qKiBXaGVuIGZhbHNlLCBsaXN0ZW5lcnMgYXJlIG5vdCBhdHRhY2hlZC4gRGVmYXVsdHMgdG8gdHJ1ZS4gKi9cbiAgZW5hYmxlZD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBbGxvd2xpc3Qgb2YgYWN0aW9uIGtpbmRzIHRoaXMgcm91dGVyIGlzIHBlcm1pdHRlZCB0byBDTEFJTSAocHJldmVudERlZmF1bHRcbiAgICogKyBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24gKyBkaXNwYXRjaCkuIEFueSBjbGFzc2lmaWVkIGFjdGlvbiBvdXRzaWRlIHRoZVxuICAgKiBzZXQgaXMgZG93bmdyYWRlZCB0byBgbm8tb3BgIHNvIGl0IHByb3BhZ2F0ZXMgdW50b3VjaGVkIHRvIG90aGVyIGxpc3RlbmVycy5cbiAgICogT21pdCB0byBjbGFpbSBldmVyeXRoaW5nICh0aGUgZGVmYXVsdCDigJQgdXNlZCBieSB0aGUgZnVsbCBEZXNpZ25DYW52YXNcbiAgICogcm91dGVyKS4gVGhlIHNoZWxsLW93bmVkIGNvbW1lbnQgbW91bnQgbGF5ZXIgcGFzc2VzIGEgbmFycm93IHNldCBzbyBpdCBjYW5cbiAgICogY29leGlzdCBhcyBhbiBBTkNFU1RPUiBjYXB0dXJlLWxpc3RlbmVyIG92ZXIgYSBVSSBjYW52YXMncyBvd24gcm91dGVyXG4gICAqIHdpdGhvdXQgc3dhbGxvd2luZyBzZWxlY3QgLyBjb250ZXh0LW1lbnUgLyB1bmRvIGdlc3R1cmVzIGl0IGRvZXNuJ3Qgb3duLlxuICAgKi9cbiAgY2xhaW1hYmxlQWN0aW9ucz86IFJlYWRvbmx5U2V0PFJvdXRlckFjdGlvblsna2luZCddPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRWRpdGFibGVUYXJnZXQodDogRXZlbnRUYXJnZXQgfCBudWxsKTogYm9vbGVhbiB7XG4gIGlmICghdCB8fCAhKHQgYXMgSFRNTEVsZW1lbnQpLnRhZ05hbWUpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgZWwgPSB0IGFzIEhUTUxFbGVtZW50O1xuICBjb25zdCB0YWcgPSBlbC50YWdOYW1lO1xuICBpZiAodGFnID09PSAnSU5QVVQnIHx8IHRhZyA9PT0gJ1RFWFRBUkVBJyB8fCB0YWcgPT09ICdTRUxFQ1QnKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGVsLmlzQ29udGVudEVkaXRhYmxlKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFBoYXNlIDYg4oCUIHRoZSBjb21tZW50cyBvdmVybGF5IChwaW5zIC8gY29tcG9zZXIgLyB0aHJlYWQgcG9wb3ZlciAvIG1lbnRpb25cbiAqIHBvcHVwKSBsaXZlcyBJTlNJREUgdGhlIGNhbnZhcyB3b3JsZCwgd2hpY2ggbWVhbnMgaXRzIERPTSBub2RlcyBhcmUgaW5zaWRlXG4gKiB0aGUgaW5wdXQtcm91dGVyJ3MgY2FwdHVyZSBob3N0LiBXaXRob3V0IGFuIGV4cGxpY2l0IGJhaWwtb3V0IHRoZSByb3V0ZXJcbiAqIHdvdWxkIGBwcmV2ZW50RGVmYXVsdCArIHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbmAgZXZlcnkgY2xpY2sgb24gYVxuICogY29tcG9zZXIgYnV0dG9uIHdoaWxlIGNvbW1lbnQgbW9kZSBpcyBhY3RpdmUsIGJsb2NraW5nIFNhdmUgLyBDYW5jZWwuXG4gKlxuICogV2UgdHJlYXQgdGhlIG92ZXJsYXkgbm9kZXMgbGlrZSBlZGl0YWJsZSBmb3JtIHdpZGdldHMg4oCUIHRoZSByb3V0ZXIgeWllbGRzLFxuICogdGhlIFJlYWN0IGV2ZW50IGhhbmRsZXIgcnVucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzT3ZlcmxheVRhcmdldCh0OiBFdmVudFRhcmdldCB8IG51bGwpOiBib29sZWFuIHtcbiAgaWYgKCF0IHx8ICEodCBhcyBFbGVtZW50KS5jbG9zZXN0KSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiAhISh0IGFzIEVsZW1lbnQpLmNsb3Nlc3QoJy5jbS1jb21wb3NlciwgLmNtLXRocmVhZCwgLmNtLW1lbnRpb24tcG9wdXAsIC5jbS1waW4nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUlucHV0Um91dGVyKG9wdHM6IFVzZUlucHV0Um91dGVyT3B0aW9ucyk6IHZvaWQge1xuICBjb25zdCB7IGhvc3RSZWYsIGdldEFjdGl2ZVRvb2wsIGlzU3BhY2VIZWxkLCBjYWxsYmFja3MsIGVuYWJsZWQgPSB0cnVlLCBjbGFpbWFibGVBY3Rpb25zIH0gPSBvcHRzO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFlbmFibGVkKSByZXR1cm47XG4gICAgY29uc3QgaG9zdCA9IGhvc3RSZWYuY3VycmVudDtcbiAgICBpZiAoIWhvc3QpIHJldHVybjtcblxuICAgIC8vIERvd25ncmFkZSBhbnkgYWN0aW9uIHRoaXMgcm91dGVyIGlzbid0IHBlcm1pdHRlZCB0byBjbGFpbSB0byBuby1vcCBzbyBpdFxuICAgIC8vIHByb3BhZ2F0ZXMgdW50b3VjaGVkIChubyBwcmV2ZW50RGVmYXVsdCAvIG5vIGRpc3BhdGNoKS4gSWRlbnRpdHkgcGFzcy1cbiAgICAvLyB0aHJvdWdoIHdoZW4gbm8gYWxsb3dsaXN0IGlzIGNvbmZpZ3VyZWQuXG4gICAgY29uc3QgY2xhaW0gPSAoYWN0aW9uOiBSb3V0ZXJBY3Rpb24pOiBSb3V0ZXJBY3Rpb24gPT5cbiAgICAgIGNsYWltYWJsZUFjdGlvbnMgJiYgYWN0aW9uLmtpbmQgIT09ICduby1vcCcgJiYgIWNsYWltYWJsZUFjdGlvbnMuaGFzKGFjdGlvbi5raW5kKVxuICAgICAgICA/IHsga2luZDogJ25vLW9wJyB9XG4gICAgICAgIDogYWN0aW9uO1xuXG4gICAgY29uc3QgZGlzcGF0Y2ggPSAoYWN0aW9uOiBSb3V0ZXJBY3Rpb24pOiB2b2lkID0+IHtcbiAgICAgIHN3aXRjaCAoYWN0aW9uLmtpbmQpIHtcbiAgICAgICAgY2FzZSAnaG92ZXInOlxuICAgICAgICAgIGNhbGxiYWNrcy5vbkhvdmVyPy4oYWN0aW9uKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgICBjYWxsYmFja3Mub25TZWxlY3Q/LihhY3Rpb24pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdkcm9wLWNvbW1lbnQnOlxuICAgICAgICAgIGNhbGxiYWNrcy5vbkRyb3BDb21tZW50Py4oYWN0aW9uKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY29udGV4dC1tZW51JzpcbiAgICAgICAgICBjYWxsYmFja3Mub25Db250ZXh0TWVudT8uKGFjdGlvbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3Rvb2wnOlxuICAgICAgICAgIGNhbGxiYWNrcy5vblRvb2w/LihhY3Rpb24pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdlc2NhcGUnOlxuICAgICAgICAgIGNhbGxiYWNrcy5vbkVzY2FwZT8uKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3VuZG8nOlxuICAgICAgICAgIGNhbGxiYWNrcy5vblVuZG8/LigpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdyZWRvJzpcbiAgICAgICAgICBjYWxsYmFja3Mub25SZWRvPy4oKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbm8tb3AnOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblBvaW50ZXJNb3ZlID0gKGU6IFBvaW50ZXJFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgYWN0aW9uID0gY2xhaW0oXG4gICAgICAgIGNsYXNzaWZ5KHtcbiAgICAgICAgICB0eXBlOiAncG9pbnRlcm1vdmUnLFxuICAgICAgICAgIGJ1dHRvbjogZS5idXR0b24sXG4gICAgICAgICAgbWV0YUtleTogZS5tZXRhS2V5LFxuICAgICAgICAgIGN0cmxLZXk6IGUuY3RybEtleSxcbiAgICAgICAgICBzaGlmdEtleTogZS5zaGlmdEtleSxcbiAgICAgICAgICBhbHRLZXk6IGUuYWx0S2V5LFxuICAgICAgICAgIGNsaWVudFg6IGUuY2xpZW50WCxcbiAgICAgICAgICBjbGllbnRZOiBlLmNsaWVudFksXG4gICAgICAgICAgc3BhY2VIZWxkOiBpc1NwYWNlSGVsZD8uKCkgPz8gZmFsc2UsXG4gICAgICAgICAgYWN0aXZlVG9vbDogZ2V0QWN0aXZlVG9vbCgpLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIGRpc3BhdGNoKGFjdGlvbik7XG4gICAgfTtcblxuICAgIGNvbnN0IG9uUG9pbnRlckRvd24gPSAoZTogUG9pbnRlckV2ZW50KTogdm9pZCA9PiB7XG4gICAgICAvLyBQaGFzZSA2IOKAlCBvdmVybGF5IHN1cmZhY2VzIChjb21wb3NlciAvIHRocmVhZCAvIG1lbnRpb24gcG9wdXApIG93blxuICAgICAgLy8gdGhlaXIgb3duIGNsaWNrcy4gVGhlIHJvdXRlciBpcyBpbiBjYXB0dXJlIHBoYXNlLCBzbyB3ZSBoYXZlIHRvXG4gICAgICAvLyBiYWlsIEhFUkUgYmVmb3JlIGNsYXNzaWZ5IGNhbiBjbGFpbSB0aGUgZXZlbnQuXG4gICAgICBpZiAoaXNPdmVybGF5VGFyZ2V0KGUudGFyZ2V0KSkgcmV0dXJuO1xuICAgICAgY29uc3QgYWN0aW9uID0gY2xhaW0oXG4gICAgICAgIGNsYXNzaWZ5KHtcbiAgICAgICAgICB0eXBlOiAncG9pbnRlcmRvd24nLFxuICAgICAgICAgIGJ1dHRvbjogZS5idXR0b24sXG4gICAgICAgICAgbWV0YUtleTogZS5tZXRhS2V5LFxuICAgICAgICAgIGN0cmxLZXk6IGUuY3RybEtleSxcbiAgICAgICAgICBzaGlmdEtleTogZS5zaGlmdEtleSxcbiAgICAgICAgICBhbHRLZXk6IGUuYWx0S2V5LFxuICAgICAgICAgIGNsaWVudFg6IGUuY2xpZW50WCxcbiAgICAgICAgICBjbGllbnRZOiBlLmNsaWVudFksXG4gICAgICAgICAgc3BhY2VIZWxkOiBpc1NwYWNlSGVsZD8uKCkgPz8gZmFsc2UsXG4gICAgICAgICAgYWN0aXZlVG9vbDogZ2V0QWN0aXZlVG9vbCgpLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIGlmIChhY3Rpb24ua2luZCAhPT0gJ25vLW9wJykge1xuICAgICAgICAvLyBTdXBwcmVzcyBuYXRpdmUgYmVoYXZpb3Igb24gZXZlcnkgZXZlbnQgdGhlIHJvdXRlciBjbGFpbXMg4oCUXG4gICAgICAgIC8vIGJ1dHRvbiBwcmVzc2VzIGRvbid0IGZpcmUsIGlucHV0cyBkb24ndCBmb2N1cywgdGhlIGNhbnZhc1xuICAgICAgICAvLyBjb250ZW50J3Mgb3duIGNsaWNrIGhhbmRsZXJzIGRvbid0IHJ1bi4gVGhlIHJvdXRlciBsaXZlcyBpblxuICAgICAgICAvLyBjYXB0dXJlIHBoYXNlIHNvIHRoaXMgZmlyZXMgYmVmb3JlIGRlc2NlbmRhbnRzLlxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgICBkaXNwYXRjaChhY3Rpb24pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBQYWlyZWQgbW91c2Vkb3duIGxpc3RlbmVyIOKAlCBwcmV2ZW50RGVmYXVsdCBvbiBwb2ludGVyZG93biBkb2VzIE5PVFxuICAgICAqIHN1cHByZXNzIHRoZSBtb3VzZWRvd24gZXZlbnQgdGhhdCBicm93c2VycyBmaXJlIGFsb25nc2lkZSwgYW5kXG4gICAgICogYDxpbnB1dD5gIC8gYDxidXR0b24+YCBmb2N1cyBpcyBkcml2ZW4gYnkgbW91c2Vkb3duJ3MgZGVmYXVsdCBiZWhhdmlvci5cbiAgICAgKiBXZSBtaXJyb3IgdGhlIHNhbWUgZ2F0ZSBhcyBwb2ludGVyZG93biBzbyBzdXBwcmVzc2VkIHBvaW50ZXJkb3ducyBhbHNvXG4gICAgICogc3RvcCB0aGVpciB0d2luIG1vdXNlZG93bi5cbiAgICAgKi9cbiAgICBjb25zdCBvbk1vdXNlRG93biA9IChlOiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoaXNPdmVybGF5VGFyZ2V0KGUudGFyZ2V0KSkgcmV0dXJuO1xuICAgICAgY29uc3QgYWN0aW9uID0gY2xhaW0oXG4gICAgICAgIGNsYXNzaWZ5KHtcbiAgICAgICAgICB0eXBlOiAncG9pbnRlcmRvd24nLFxuICAgICAgICAgIGJ1dHRvbjogZS5idXR0b24sXG4gICAgICAgICAgbWV0YUtleTogZS5tZXRhS2V5LFxuICAgICAgICAgIGN0cmxLZXk6IGUuY3RybEtleSxcbiAgICAgICAgICBzaGlmdEtleTogZS5zaGlmdEtleSxcbiAgICAgICAgICBhbHRLZXk6IGUuYWx0S2V5LFxuICAgICAgICAgIGNsaWVudFg6IGUuY2xpZW50WCxcbiAgICAgICAgICBjbGllbnRZOiBlLmNsaWVudFksXG4gICAgICAgICAgc3BhY2VIZWxkOiBpc1NwYWNlSGVsZD8uKCkgPz8gZmFsc2UsXG4gICAgICAgICAgYWN0aXZlVG9vbDogZ2V0QWN0aXZlVG9vbCgpLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIGlmIChhY3Rpb24ua2luZCAhPT0gJ25vLW9wJykge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENsaWNrIGxpc3RlbmVyIOKAlCBmaXJlcyBBRlRFUiBwb2ludGVyZG93bitwb2ludGVydXAuIEV2ZW4gd2l0aFxuICAgICAqIHByZXZlbnREZWZhdWx0IG9uIG1vdXNlZG93biwgdGhlIGNsaWNrIGV2ZW50IHN0aWxsIHN5bnRoZXNpemVzIGZvclxuICAgICAqIG5vbi1mb3JtIGVsZW1lbnRzLiBXZSBzdXBwcmVzcyBpdCB3aGVuZXZlciB0aGUgcm91dGVyIGNsYWltZWQgdGhlXG4gICAgICogbWF0Y2hpbmcgcG9pbnRlcmRvd24gKHJlLWNsYXNzaWZ5IHdpdGggdGhlIHNhbWUgbW9kaWZpZXJzKS5cbiAgICAgKi9cbiAgICBjb25zdCBvbkNsaWNrID0gKGU6IE1vdXNlRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmIChpc092ZXJsYXlUYXJnZXQoZS50YXJnZXQpKSByZXR1cm47XG4gICAgICBjb25zdCB0b29sID0gZ2V0QWN0aXZlVG9vbCgpO1xuICAgICAgY29uc3QgbW9kID0gZS5tZXRhS2V5IHx8IGUuY3RybEtleTtcbiAgICAgIC8vIE1hcCB0aGUgY2xpY2sgdG8gdGhlIGFjdGlvbiBraW5kIHRoZSBtYXRjaGluZyBwb2ludGVyZG93biB3b3VsZCBoYXZlXG4gICAgICAvLyBwcm9kdWNlZCwgdGhlbiBob25vciB0aGUgY2xhaW0gYWxsb3dsaXN0IHNvIGEgc2NvcGVkIHJvdXRlciAodGhlXG4gICAgICAvLyBjb21tZW50IG1vdW50IGxheWVyKSBkb2Vzbid0IHN1cHByZXNzIGNsaWNrcyBpdCBuZXZlciBjbGFpbWVkLlxuICAgICAgY29uc3Qgd291bGRSb3V0ZUtpbmQ6IFJvdXRlckFjdGlvblsna2luZCddIHwgbnVsbCA9XG4gICAgICAgIHRvb2wgPT09ICdjb21tZW50J1xuICAgICAgICAgID8gJ2Ryb3AtY29tbWVudCdcbiAgICAgICAgICA6IHRvb2wgPT09ICdtb3ZlJyAmJiBtb2QgJiYgZS5idXR0b24gPT09IDBcbiAgICAgICAgICAgID8gJ3NlbGVjdCdcbiAgICAgICAgICAgIDogZS5idXR0b24gPT09IDJcbiAgICAgICAgICAgICAgPyAnY29udGV4dC1tZW51J1xuICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICBpZiAod291bGRSb3V0ZUtpbmQgJiYgKCFjbGFpbWFibGVBY3Rpb25zIHx8IGNsYWltYWJsZUFjdGlvbnMuaGFzKHdvdWxkUm91dGVLaW5kKSkpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvbkNvbnRleHRNZW51ID0gKGU6IE1vdXNlRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IGNsYWltKFxuICAgICAgICBjbGFzc2lmeSh7XG4gICAgICAgICAgdHlwZTogJ2NvbnRleHRtZW51JyxcbiAgICAgICAgICBjbGllbnRYOiBlLmNsaWVudFgsXG4gICAgICAgICAgY2xpZW50WTogZS5jbGllbnRZLFxuICAgICAgICAgIG1ldGFLZXk6IGUubWV0YUtleSxcbiAgICAgICAgICBjdHJsS2V5OiBlLmN0cmxLZXksXG4gICAgICAgICAgc2hpZnRLZXk6IGUuc2hpZnRLZXksXG4gICAgICAgICAgYWx0S2V5OiBlLmFsdEtleSxcbiAgICAgICAgICBhY3RpdmVUb29sOiBnZXRBY3RpdmVUb29sKCksXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgaWYgKGFjdGlvbi5raW5kID09PSAnbm8tb3AnKSByZXR1cm47IC8vIG5vdCBvdXJzIHRvIGNsYWltIOKAlCBsZXQgaXQgYnViYmxlXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgZGlzcGF0Y2goYWN0aW9uKTtcbiAgICB9O1xuXG4gICAgY29uc3Qgb25LZXlEb3duID0gKGU6IEtleWJvYXJkRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IGNsYWltKFxuICAgICAgICBjbGFzc2lmeSh7XG4gICAgICAgICAgdHlwZTogJ2tleWRvd24nLFxuICAgICAgICAgIGtleTogZS5rZXksXG4gICAgICAgICAgbWV0YUtleTogZS5tZXRhS2V5LFxuICAgICAgICAgIGN0cmxLZXk6IGUuY3RybEtleSxcbiAgICAgICAgICBzaGlmdEtleTogZS5zaGlmdEtleSxcbiAgICAgICAgICBhbHRLZXk6IGUuYWx0S2V5LFxuICAgICAgICAgIGlzRWRpdGFibGU6IGlzRWRpdGFibGVUYXJnZXQoZS50YXJnZXQpLFxuICAgICAgICAgIGFjdGl2ZVRvb2w6IGdldEFjdGl2ZVRvb2woKSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICBpZiAoXG4gICAgICAgIGFjdGlvbi5raW5kID09PSAndG9vbCcgfHxcbiAgICAgICAgYWN0aW9uLmtpbmQgPT09ICdlc2NhcGUnIHx8XG4gICAgICAgIGFjdGlvbi5raW5kID09PSAndW5kbycgfHxcbiAgICAgICAgYWN0aW9uLmtpbmQgPT09ICdyZWRvJ1xuICAgICAgKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICAgIGRpc3BhdGNoKGFjdGlvbik7XG4gICAgfTtcblxuICAgIC8vIENhcHR1cmUgcGhhc2UgZm9yIHBvaW50ZXIvbW91c2UvY2xpY2sgZXZlbnRzIOKAlCByb3V0ZXIgcnVucyBCRUZPUkVcbiAgICAvLyBkZXNjZW5kYW50cyAoYnV0dG9ucywgaW5wdXRzLCBjYW52YXMgY29udGVudCBsaXN0ZW5lcnMpLiBGb3IgZXZlbnRzIHRoZVxuICAgIC8vIGNsYXNzaWZpZXIgY2xhaW1zLCB3ZSBwcmV2ZW50RGVmYXVsdCArIHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiBzbyB0aGVcbiAgICAvLyBkZXNjZW5kYW50cyBuZXZlciBzZWUgdGhlbS5cbiAgICBob3N0LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgb25Qb2ludGVyTW92ZSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICAgIGhvc3QuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCBvblBvaW50ZXJEb3duLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gICAgaG9zdC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbk1vdXNlRG93biwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgIGhvc3QuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvbkNsaWNrLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gICAgaG9zdC5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIG9uQ29udGV4dE1lbnUsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgICAvLyBLZXkgZXZlbnRzOiBhdHRhY2ggb24gZG9jdW1lbnQgc28gZm9jdXMgaW5zaWRlIGFueSBkZXNjZW5kYW50IGlzIE9LO1xuICAgIC8vIHRoZSBlZGl0YWJsZS10YXJnZXQgZ2F0ZSBoYW5kbGVzIHRoZSBcInVzZXIgaXMgdHlwaW5nXCIgY2FzZS5cbiAgICBjb25zdCBkb2MgPSBob3N0Lm93bmVyRG9jdW1lbnQgPz8gZG9jdW1lbnQ7XG4gICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBvbktleURvd24sIHRydWUpO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGhvc3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCBvblBvaW50ZXJNb3ZlKTtcbiAgICAgIGhvc3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCBvblBvaW50ZXJEb3duLCB7XG4gICAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgICB9IGFzIEV2ZW50TGlzdGVuZXJPcHRpb25zKTtcbiAgICAgIGhvc3QucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgb25Nb3VzZURvd24sIHsgY2FwdHVyZTogdHJ1ZSB9IGFzIEV2ZW50TGlzdGVuZXJPcHRpb25zKTtcbiAgICAgIGhvc3QucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvbkNsaWNrLCB7IGNhcHR1cmU6IHRydWUgfSBhcyBFdmVudExpc3RlbmVyT3B0aW9ucyk7XG4gICAgICBob3N0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51Jywgb25Db250ZXh0TWVudSwge1xuICAgICAgICBjYXB0dXJlOiB0cnVlLFxuICAgICAgfSBhcyBFdmVudExpc3RlbmVyT3B0aW9ucyk7XG4gICAgICBkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG9uS2V5RG93biwgdHJ1ZSk7XG4gICAgfTtcbiAgfSwgW2VuYWJsZWQsIGhvc3RSZWYsIGdldEFjdGl2ZVRvb2wsIGlzU3BhY2VIZWxkLCBjYWxsYmFja3MsIGNsYWltYWJsZUFjdGlvbnNdKTtcbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyByZXNvbHZlSG92ZXJUYXJnZXQg4oCUIHdhbGtzIGZyb20gYSBjbGllbnRYL2NsaWVudFkgcGFpciB0byB0aGUgY2FudmFzIGVsZW1lbnRcbi8vIG9mIGludGVyZXN0LiBEZWZhdWx0ID0gdG9wbW9zdCBgW2RhdGEtY2QtaWRdYCBhbmNlc3RvciAodGhlIHN0YWJsZVxuLy8gcGlwZWxpbmUtc3RhbXBlZCBhbmNob3IpLiBgZGVlcCA9IHRydWVgIHJldHVybnMgdGhlIGRlZXBlc3QgZGVzY2VuZGFudFxuLy8gKENtZC1ob3ZlciBiZWhhdmlvcikuXG5cbmV4cG9ydCBpbnRlcmZhY2UgSG92ZXJUYXJnZXQge1xuICBlbDogRWxlbWVudDtcbiAgY2RJZDogc3RyaW5nIHwgbnVsbDtcbiAgYXJ0Ym9hcmRJZDogc3RyaW5nIHwgbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVIb3ZlclRhcmdldChcbiAgZG9jOiBEb2N1bWVudCxcbiAgY2xpZW50WDogbnVtYmVyLFxuICBjbGllbnRZOiBudW1iZXIsXG4gIG9wdHM6IHsgZGVlcDogYm9vbGVhbiB9XG4pOiBIb3ZlclRhcmdldCB8IG51bGwge1xuICBjb25zdCBoaXQgPSBkb2MuZWxlbWVudEZyb21Qb2ludChjbGllbnRYLCBjbGllbnRZKTtcbiAgaWYgKCFoaXQpIHJldHVybiBudWxsO1xuICAvLyBTa2lwIHRoZSBmbG9hdGluZyBjaHJvbWUgKE1pbmlNYXAgLyBab29tVG9vbGJhciAvIFRvb2xQYWxldHRlIC8gQ29udGV4dE1lbnUpXG4gIC8vIEFORCB0aGUgY2FudmFzL3dvcmxkIGZyYW1lIGl0c2VsZiDigJQgdGhlIHVzZXIgaXMgbmV2ZXIgYXNraW5nIHRvIFwic2VsZWN0XG4gIC8vIHRoZSBlbnRpcmUgY2FudmFzIHZpZXdwb3J0LFwiIHRoYXQncyBhIFVJIGFjY2lkZW50IGZyb20gY2xpbWJpbmcgdG9vIGhpZ2guXG4gIGlmIChoaXQuY2xvc2VzdD8uKCcuZGMtbW0sIC5kYy16b29tLXRiLCAuZGMtdG9vbC1wYWxldHRlLCAuZGMtY29udGV4dC1tZW51LCAuZGMtY3YtZ3JvdXAtYmJveCcpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBhcnRib2FyZEVsID0gaGl0LmNsb3Nlc3Q/LignW2RhdGEtZGMtc2NyZWVuXScpID8/IG51bGw7XG4gIGNvbnN0IGFydGJvYXJkSWQgPSBhcnRib2FyZEVsPy5nZXRBdHRyaWJ1dGUoJ2RhdGEtZGMtc2NyZWVuJykgPz8gbnVsbDtcblxuICAvLyBIb3Zlci10YXJnZXQgaGFyZCBjZWlsaW5nID0gYC5kYy1hcnRib2FyZC1ib2R5YC4gSW5uZXIgRE9NIGNvbnRlbnQgbGl2ZXNcbiAgLy8gdGhlcmU7IGNocm9tZSBsaXZlcyBvdXRzaWRlIChsYWJlbCwgaGVhZGVyLCBhcnRpY2xlIHJvb3QpLiBUaGUgdHdvIHBhdGhzXG4gIC8vIGRpdmVyZ2UgZnJvbSBoZXJlOlxuICAvLyAgICogaGl0IOKIiCBib2R5IOKGkiByZXNvbHZlIHRvIHRoZSBkZWVwZXN0IHN0YW1wZWQgZWxlbWVudCAoZXhpc3RpbmdcbiAgLy8gICAgIGRlZXAvdG9wIGxvZ2ljIGJlbG93KS5cbiAgLy8gICAqIGhpdCDiiIggY2hyb21lIChsYWJlbC9oZWFkZXIvYXJ0aWNsZS1yb290KSDihpIgdGhlIHVzZXIgd2FudHMgdG8gc2VsZWN0XG4gIC8vICAgICB0aGUgV0hPTEUgYXJ0Ym9hcmQuIFJldHVybiB0aGUgYXJ0aWNsZSBlbGVtZW50IGl0c2VsZiB3aXRoIG5vIGNkSWQ7XG4gIC8vICAgICBjb25zdW1lcnMgKGhvdmVyVGFyZ2V0VG9TZWxlY3Rpb24pIGZhbGwgYmFjayB0byBhXG4gIC8vICAgICBgW2RhdGEtZGMtc2NyZWVuPVwi4oCmXCJdYCBzZWxlY3RvciB0aGF0IHdyYXBzIHRoZSB3aG9sZSBmcmFtZS4gVGhpcyBpc1xuICAvLyAgICAgd2hhdCBlbmFibGVzIENtZCtTaGlmdCtDbGljayBtdWx0aS1zZWxlY3Qgb2YgYXJ0Ym9hcmRzIChUMjQgLyBHOCkuXG4gIGNvbnN0IGJvZHlFbCA9IGhpdC5jbG9zZXN0Py4oJy5kYy1hcnRib2FyZC1ib2R5JykgPz8gbnVsbDtcbiAgaWYgKCFib2R5RWwpIHtcbiAgICBpZiAoYXJ0Ym9hcmRFbCAmJiBhcnRib2FyZElkKSB7XG4gICAgICByZXR1cm4geyBlbDogYXJ0Ym9hcmRFbCwgY2RJZDogbnVsbCwgYXJ0Ym9hcmRJZCB9O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAoaGl0ID09PSBib2R5RWwpIHtcbiAgICAvLyBDbGlja2VkIHRoZSBib2R5IHdyYXBwZXIgaXRzZWxmIChlbXB0eSBwYWRkaW5nIGluc2lkZSBhbiBhcnRib2FyZCwgbm9cbiAgICAvLyB1c2VyIGNvbnRlbnQgdW5kZXIgdGhlIGN1cnNvcikuIFByb21vdGUgdG8gXCJzZWxlY3Qgd2hvbGUgYXJ0Ym9hcmRcIiBzb1xuICAgIC8vIHRoZSBnZXN0dXJlIHN0YXlzIGNvbnNpc3RlbnQgd2l0aCBjaHJvbWUgY2xpY2tzIGFib3ZlLlxuICAgIGlmIChhcnRib2FyZEVsICYmIGFydGJvYXJkSWQpIHtcbiAgICAgIHJldHVybiB7IGVsOiBhcnRib2FyZEVsLCBjZElkOiBudWxsLCBhcnRib2FyZElkIH07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKG9wdHMuZGVlcCkge1xuICAgIC8vIERlZXBlc3QgbW9kZSDigJQgdGhlIGhpdCBlbGVtZW50IElTIHRoZSB0YXJnZXQuIFVzZSBpdHMgT1dOIGRhdGEtY2QtaWRcbiAgICAvLyB3aGVuIHByZXNlbnQ7IG5ldmVyIGNsaW1iIHRvIGFuIGFuY2VzdG9yJ3MgaWQgKGNsaW1iaW5nIHdhcyB0aGUgY2F1c2VcbiAgICAvLyBvZiBcIkNtZC1jbGljayBvbiBhIGRlZXAgc3BhbiBzZWxlY3RzIHRoZSB3aG9sZSBhcnRib2FyZCByb290XCIpLiBXaGVuXG4gICAgLy8gdGhlIGhpdCBsYWNrcyBhIHN0YW1wZWQgaWQsIGNvbnN1bWVycyBmYWxsIGJhY2sgdG8gYSBDU1MtcGF0aCBzZWxlY3Rvci5cbiAgICBjb25zdCBjZElkID0gaGl0LmdldEF0dHJpYnV0ZT8uKCdkYXRhLWNkLWlkJykgPz8gbnVsbDtcbiAgICByZXR1cm4geyBlbDogaGl0LCBjZElkLCBhcnRib2FyZElkIH07XG4gIH1cblxuICAvLyBUb3AgbW9kZSDigJQgY2xpbWIgdG8gdGhlIHRvcG1vc3QgZGVzY2VuZGFudCBvZiB0aGUgYXJ0Ym9hcmQgYm9keSB0aGF0XG4gIC8vIHN0aWxsIGNhcnJpZXMgYSBkYXRhLWNkLWlkLiBIYXJkIGNlaWxpbmcgaXMgYm9keUVsIGl0c2VsZiAobmV2ZXIgc2VsZWN0XG4gIC8vIHRoZSBib2R5IHdyYXBwZXIgb3IgaGlnaGVyKS5cbiAgbGV0IGN1cjogRWxlbWVudCB8IG51bGwgPSBoaXQ7XG4gIGxldCB0b3BDZEVsOiBFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHdoaWxlIChjdXIgJiYgY3VyICE9PSBib2R5RWwpIHtcbiAgICBpZiAoY3VyLmhhc0F0dHJpYnV0ZT8uKCdkYXRhLWNkLWlkJykpIHRvcENkRWwgPSBjdXI7XG4gICAgY3VyID0gY3VyLnBhcmVudEVsZW1lbnQ7XG4gIH1cbiAgY29uc3QgZWwgPSB0b3BDZEVsID8/IGhpdDtcbiAgY29uc3QgY2RJZCA9IGVsLmdldEF0dHJpYnV0ZT8uKCdkYXRhLWNkLWlkJykgPz8gbnVsbDtcbiAgcmV0dXJuIHsgZWwsIGNkSWQsIGFydGJvYXJkSWQgfTtcbn1cbiIsCiAgICAiLyoqXG4gKiBAZmlsZSAgICAgICB1c2UtdG9vbC1tb2RlLnRzeCDigJQgUGhhc2UgNC4xIHRvb2wtbW9kZSBzdG9yZVxuICogQHNjb3BlICAgICAgYXBwcy9zdHVkaW8vdXNlLXRvb2wtbW9kZS50c3hcbiAqIEBwdXJwb3NlICAgIENvbnRleHQgKyBob29rIGZvciB0aGUgYWN0aXZlIGNhbnZhcyB0b29sLiBXaXJlZCBpbnRvXG4gKiAgICAgICAgICAgICBEZXNpZ25DYW52YXMuIFBoYXNlIDUgd2lsbFxuICogICAgICAgICAgICAgcmVnaXN0ZXIgYWRkaXRpb25hbCB0b29scyAocGVuLCBjaXJjbGUsIGFycm93LCBlcmFzZXIpIHZpYVxuICogICAgICAgICAgICAgdGhlIHNhbWUgcHJvdmlkZXIg4oCUIHRoZSBBUEkgaXMgaW50ZW50aW9uYWxseSBvcGVuLlxuICpcbiAqIFRoZSByb3V0ZXIncyBgb25Ub29sYCBjYWxsYmFjayAoaW5wdXQtcm91dGVyLnRzeCkgd3JpdGVzIGludG8gdGhpcyBzdG9yZS5cbiAqIFRoZSBUb29sUGFsZXR0ZSArIGN1cnNvciBzeW5jIHJlYWQgZnJvbSBpdC4gU2VsZWN0aW5nIGEgdG9vbCBhbHNvIG11dGF0ZXNcbiAqIGBkb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvcmAgc28gdGhlIGFmZm9yZGFuY2UgbWF0Y2hlcyBhY3Jvc3MgdGhlIGlmcmFtZS5cbiAqL1xuXG5pbXBvcnQge1xuICBjcmVhdGVDb250ZXh0LFxuICB0eXBlIFJlYWN0Tm9kZSxcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUNvbnRleHQsXG4gIHVzZUVmZmVjdCxcbiAgdXNlTWVtbyxcbiAgdXNlU3RhdGUsXG59IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgVE9PTF9DVVJTT1JTIH0gZnJvbSAnLi9jYW52YXMtY3Vyc29ycy50cyc7XG5pbXBvcnQgdHlwZSB7IFRvb2wgfSBmcm9tICcuL2lucHV0LXJvdXRlci50c3gnO1xuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFR5cGVzXG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9vbERlc2NyaXB0b3Ige1xuICBpZDogVG9vbDtcbiAgbGFiZWw6IHN0cmluZztcbiAgLyoqIExldHRlci1rZXkgc2hvcnRjdXQgc2hvd24gaW4gdGhlIHBhbGV0dGUgdG9vbHRpcC4gKi9cbiAgc2hvcnRjdXQ6IHN0cmluZztcbiAgLyoqIENTUyBjdXJzb3IgdmFsdWUgYXBwbGllZCB0byA8Ym9keT4gd2hlbiB0aGlzIHRvb2wgaXMgYWN0aXZlLiAqL1xuICBjdXJzb3I6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQaGFzZSAyNCDigJQgdGhlIHNpeCBwcmltaXRpdmVzIHRoZSBzaW5nbGUgU2hhcGUgdG9vbCBjYW4gZHJhdy4gTWFwcyBvbnRvIHRoZVxuICogc3Ryb2tlIG1vZGVsOiBzcXVhcmUvcm91bmRlZCDihpIgYHJlY3RgIChjb3JuZXJSYWRpdXMgMCAvIDgpOyBjaXJjbGUg4oaSXG4gKiBgZWxsaXBzZWA7IGRpYW1vbmQvdHJpYW5nbGUvdHJpYW5nbGUtZG93biDihpIgYHBvbHlnb25gLlxuICovXG5leHBvcnQgdHlwZSBTaGFwZUtpbmQgPSAnc3F1YXJlJyB8ICdyb3VuZGVkJyB8ICdjaXJjbGUnIHwgJ2RpYW1vbmQnIHwgJ3RyaWFuZ2xlJyB8ICd0cmlhbmdsZS1kb3duJztcblxuLy8gUGhhc2UgMjEg4oCUIGV2ZXJ5IHRvb2wgc2hpcHMgYSBjdXN0b20gMzLDlzMyIFNWRyBjdXJzb3IgKGNhbnZhcy1jdXJzb3JzLnRzKVxuLy8gd2l0aCBhIHdoaXRlIG91dGxpbmUgaGFsbyBzbyB0aGUgZ2x5cGggcmVhZHMgb24gYW55IGJhY2tncm91bmQuIFRoZSBuYXRpdmVcbi8vIGNyb3NzaGFpci90ZXh0L2NlbGwgd2VyZSB0aGluICsgdGlueSAoXCJwZW4gYWxtb3N0IGludmlzaWJsZVwiKTsgdGhlc2UgbWlycm9yXG4vLyB0aGUgdG9vbC1wYWxldHRlIGljb25zLiBgbW92ZWAga2VlcHMgdGhlIHN5c3RlbSBhcnJvdyBvbiBwdXJwb3NlLlxuZXhwb3J0IGNvbnN0IERFRkFVTFRfVE9PTFM6IHJlYWRvbmx5IFRvb2xEZXNjcmlwdG9yW10gPSBPYmplY3QuZnJlZXplKFtcbiAgeyBpZDogJ21vdmUnLCBsYWJlbDogJ01vdmUnLCBzaG9ydGN1dDogJ1YnLCBjdXJzb3I6IFRPT0xfQ1VSU09SUy5tb3ZlIH0sXG4gIHsgaWQ6ICdoYW5kJywgbGFiZWw6ICdIYW5kJywgc2hvcnRjdXQ6ICdIJywgY3Vyc29yOiBUT09MX0NVUlNPUlMuaGFuZCB9LFxuICB7IGlkOiAnY29tbWVudCcsIGxhYmVsOiAnQ29tbWVudCcsIHNob3J0Y3V0OiAnQycsIGN1cnNvcjogVE9PTF9DVVJTT1JTLmNvbW1lbnQgfSxcbiAgeyBpZDogJ3BlbicsIGxhYmVsOiAnUGVuJywgc2hvcnRjdXQ6ICdCJywgY3Vyc29yOiBUT09MX0NVUlNPUlMucGVuIH0sXG4gIC8vIEFubm90YXRpb24gcG9saXNoIChpdGVtIDgpIOKAlCBoaWdobGlnaHRlciBzaXRzIG5leHQgdG8gdGhlIHBlbi5cbiAgeyBpZDogJ2hpZ2hsaWdodGVyJywgbGFiZWw6ICdIaWdobGlnaHRlcicsIHNob3J0Y3V0OiAnSScsIGN1cnNvcjogVE9PTF9DVVJTT1JTLmhpZ2hsaWdodGVyIH0sXG4gIC8vIFBoYXNlIDI0IOKAlCBvbmUgU2hhcGUgdG9vbCByZXBsYWNlcyB0aGUgc2VwYXJhdGUgUmVjdCAoUikgKyBFbGxpcHNlIChPKVxuICAvLyBidXR0b25zOyB0aGUgcHJpbWl0aXZlIGlzIGNob3NlbiBmcm9tIHRoZSBwYWxldHRlIHBvcG92ZXIuXG4gIHsgaWQ6ICdzaGFwZScsIGxhYmVsOiAnU2hhcGUnLCBzaG9ydGN1dDogJ1InLCBjdXJzb3I6IFRPT0xfQ1VSU09SUy5zaGFwZSB9LFxuICB7IGlkOiAnc3RpY2t5JywgbGFiZWw6ICdTdGlja3knLCBzaG9ydGN1dDogJ04nLCBjdXJzb3I6IFRPT0xfQ1VSU09SUy5zdGlja3kgfSxcbiAgLy8gRmlnSmFtIHYzIOKAlCBsYWJlbGxlZCBvcmdhbml6aW5nIGNvbnRhaW5lci5cbiAgeyBpZDogJ3NlY3Rpb24nLCBsYWJlbDogJ1NlY3Rpb24nLCBzaG9ydGN1dDogJ+KHp1MnLCBjdXJzb3I6IFRPT0xfQ1VSU09SUy5zaGFwZSB9LFxuICB7IGlkOiAnYXJyb3cnLCBsYWJlbDogJ0Fycm93Jywgc2hvcnRjdXQ6ICdBJywgY3Vyc29yOiBUT09MX0NVUlNPUlMuYXJyb3cgfSxcbiAgeyBpZDogJ3RleHQnLCBsYWJlbDogJ1RleHQnLCBzaG9ydGN1dDogJ1QnLCBjdXJzb3I6IFRPT0xfQ1VSU09SUy50ZXh0IH0sXG4gIHsgaWQ6ICdlcmFzZXInLCBsYWJlbDogJ0VyYXNlcicsIHNob3J0Y3V0OiAnRScsIGN1cnNvcjogVE9PTF9DVVJTT1JTLmVyYXNlciB9LFxuXSk7XG5cbmludGVyZmFjZSBUb29sQ29udGV4dFZhbHVlIHtcbiAgdG9vbDogVG9vbDtcbiAgc2V0VG9vbDogKHQ6IFRvb2wpID0+IHZvaWQ7XG4gIHRvb2xzOiByZWFkb25seSBUb29sRGVzY3JpcHRvcltdO1xuICAvKiogVDE5IOKAlCBzdGlja3ktdG9vbCBkb3VibGUtY2xpY2sgbG9jay4gV2hlbiBgc3RpY2t5LmxvY2tlZCA9PT0gdHJ1ZWAgQU5EXG4gICAqICBgc3RpY2t5LnRvb2wgPT09IHRvb2xgLCBkcmF3IHRvb2xzIHN0YXkgYXJtZWQgYWZ0ZXIgZWFjaCBzaGFwZSBjb21taXRcbiAgICogIChUMTggYXV0by1mbGlwIGlzIHN1cHByZXNzZWQpLiBTaW5nbGUtY2xpY2sgb24gYW55IG90aGVyIHRvb2wgY2xlYXJzXG4gICAqICBzdGlja3k7IEVzYyBjbGVhcnMgKyBmbGlwcyB0byBNb3ZlLiAqL1xuICBzdGlja3k6IHsgdG9vbDogVG9vbCB8IG51bGw7IGxvY2tlZDogYm9vbGVhbiB9O1xuICB0b2dnbGVTdGlja3k6ICh0OiBUb29sKSA9PiB2b2lkO1xuICBjbGVhclN0aWNreTogKCkgPT4gdm9pZDtcbiAgLyoqIFBoYXNlIDI0IOKAlCB0aGUgcHJpbWl0aXZlIHRoZSBTaGFwZSB0b29sIHdpbGwgZHJhdyBuZXh0LiAqL1xuICBzaGFwZUtpbmQ6IFNoYXBlS2luZDtcbiAgc2V0U2hhcGVLaW5kOiAoazogU2hhcGVLaW5kKSA9PiB2b2lkO1xufVxuXG5jb25zdCBUb29sQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8VG9vbENvbnRleHRWYWx1ZSB8IG51bGw+KG51bGwpO1xuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFByb3ZpZGVyXG5cbmV4cG9ydCBmdW5jdGlvbiBUb29sUHJvdmlkZXIoe1xuICBjaGlsZHJlbixcbiAgdG9vbHMgPSBERUZBVUxUX1RPT0xTLFxuICBpbml0aWFsID0gJ21vdmUnLFxufToge1xuICBjaGlsZHJlbjogUmVhY3ROb2RlO1xuICB0b29scz86IHJlYWRvbmx5IFRvb2xEZXNjcmlwdG9yW107XG4gIGluaXRpYWw/OiBUb29sO1xufSkge1xuICBjb25zdCBbdG9vbCwgc2V0VG9vbFN0YXRlXSA9IHVzZVN0YXRlPFRvb2w+KGluaXRpYWwpO1xuICBjb25zdCBbc3RpY2t5LCBzZXRTdGlja3ldID0gdXNlU3RhdGU8eyB0b29sOiBUb29sIHwgbnVsbDsgbG9ja2VkOiBib29sZWFuIH0+KCgpID0+ICh7XG4gICAgdG9vbDogbnVsbCxcbiAgICBsb2NrZWQ6IGZhbHNlLFxuICB9KSk7XG4gIGNvbnN0IHNldFRvb2wgPSB1c2VDYWxsYmFjaygodDogVG9vbCkgPT4ge1xuICAgIHNldFRvb2xTdGF0ZSh0KTtcbiAgICAvLyBTaW5nbGUtY2xpY2sgb24gYSBkaWZmZXJlbnQgdG9vbCBjbGVhcnMgYW55IHN0aWNreSBsb2NrIOKAlCBzdGlja3kgaXNcbiAgICAvLyBhIHBlci10b29sIGZsYWcsIG5vdCBnbG9iYWwuXG4gICAgc2V0U3RpY2t5KChwcmV2KSA9PiAocHJldi5sb2NrZWQgJiYgcHJldi50b29sID09PSB0ID8gcHJldiA6IHsgdG9vbDogbnVsbCwgbG9ja2VkOiBmYWxzZSB9KSk7XG4gIH0sIFtdKTtcbiAgY29uc3QgdG9nZ2xlU3RpY2t5ID0gdXNlQ2FsbGJhY2soKHQ6IFRvb2wpID0+IHtcbiAgICBzZXRTdGlja3koKHByZXYpID0+IHtcbiAgICAgIGlmIChwcmV2LmxvY2tlZCAmJiBwcmV2LnRvb2wgPT09IHQpIHJldHVybiB7IHRvb2w6IG51bGwsIGxvY2tlZDogZmFsc2UgfTtcbiAgICAgIHJldHVybiB7IHRvb2w6IHQsIGxvY2tlZDogdHJ1ZSB9O1xuICAgIH0pO1xuICAgIHNldFRvb2xTdGF0ZSh0KTtcbiAgfSwgW10pO1xuICBjb25zdCBjbGVhclN0aWNreSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzZXRTdGlja3koeyB0b29sOiBudWxsLCBsb2NrZWQ6IGZhbHNlIH0pO1xuICB9LCBbXSk7XG4gIC8vIEZpZ0phbSB2MyDigJQgc29mdCBkZWZhdWx0OiBhIGZyZXNoIFNoYXBlIHRvb2wgZHJhd3MgUk9VTkRFRCBzcXVhcmVzICh0aGVcbiAgLy8gRmlnSmFtIGxvb2spOyBzaGFycCBzcXVhcmVzIHN0YXkgb25lIHBvcG92ZXIgY2xpY2sgYXdheS5cbiAgY29uc3QgW3NoYXBlS2luZCwgc2V0U2hhcGVLaW5kXSA9IHVzZVN0YXRlPFNoYXBlS2luZD4oJ3JvdW5kZWQnKTtcblxuICAvLyBDdXJzb3Igc3luYyDigJQgYXBwbGllZCBpbnNpZGUgdGhlIGNhbnZhcyAodGhpcyBob29rIHJ1bnMgaW4gdGhlIGNhbnZhc1xuICAvLyBjb250ZXh0KS4gVGhlIGFjdGl2ZSB0b29sJ3MgY3Vyc29yIGlzIHNldCBvbiA8Ym9keT4gQU5EIGZvcmNlZCBhY3Jvc3MgdGhlXG4gIC8vIHdob2xlIGNhbnZhcyB3b3JraW5nIGFyZWEgdmlhIGFuIGAhaW1wb3J0YW50YCBydWxlLCBzbyB0aGUgY3VzdG9tIGN1cnNvclxuICAvLyBzaG93cyBFVkVSWVdIRVJFIOKAlCBpbmNsdWRpbmcgb3ZlciBhcnRib2FyZCBDT05URU5ULCB3aG9zZSBvd24gYGN1cnNvcjpcbiAgLy8gcG9pbnRlcmAvYHRleHRgL+KApiB3b3VsZCBvdGhlcndpc2Ugd2luIChQaGFzZSAyNCwgdGhlIFwiY3VzdG9tIGN1cnNvcnMgaW4gdGhlXG4gIC8vIHdob2xlIGFwcFwiIHJlcXVpcmVtZW50OyBGaWdKYW0gYmVoYXZpb3VyKS4gQ2hyb21lIHRoYXQgbGl2ZXMgT1VUU0lERVxuICAvLyBgLmRjLXdvcmxkYCAodG9vbCBwYWxldHRlLCBjb250ZXh0IHRvb2xiYXIsIHJlc2l6ZSBoYW5kbGVzKSBpcyBpbnRlbnRpb25hbGx5XG4gIC8vIE5PVCBtYXRjaGVkLCBzbyBpdHMgYnV0dG9ucy9oYW5kbGVzIGtlZXAgdGhlaXIgYWZmb3JkYW5jZSBjdXJzb3JzLiBUaGVcbiAgLy8gdmlld3BvcnQtY29udHJvbGxlciBzdGlsbCBvd25zIHRoZSBncmFiL2dyYWJiaW5nIHN3YXAgZHVyaW5nIHNwYWNlLXBhbi5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykgcmV0dXJuO1xuICAgIGNvbnN0IGRlc2MgPSB0b29scy5maW5kKCh0KSA9PiB0LmlkID09PSB0b29sKTtcbiAgICBpZiAoIWRlc2MpIHJldHVybjtcbiAgICBjb25zdCBwcmV2ID0gZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3I7XG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSBkZXNjLmN1cnNvcjtcbiAgICBsZXQgc3R5bGVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYy10b29sLWN1cnNvcicpIGFzIEhUTUxTdHlsZUVsZW1lbnQgfCBudWxsO1xuICAgIGlmICghc3R5bGVFbCkge1xuICAgICAgc3R5bGVFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICBzdHlsZUVsLmlkID0gJ2RjLXRvb2wtY3Vyc29yJztcbiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGVFbCk7XG4gICAgfVxuICAgIC8vIFRydWx5IEdMT0JBTCBpbnNpZGUgdGhlIGNhbnZhcyBkb2N1bWVudCDigJQgYCpgIHNvIGl0IGNvdmVycyB0aGUgZW1wdHkgZ3JpZFxuICAgIC8vIGhvc3QsIGAuZGMtd29ybGRgLCBldmVyeSBhcnRib2FyZCArIGl0cyBjb250ZW50LCBBTkQgdGhlIGZsb2F0aW5nIGNocm9tZVxuICAgIC8vIChtaW5pbWFwLCB0b29sYmFyKS4gVGhlIGVhcmxpZXIgYC5kYy13b3JsZGAtc2NvcGVkIHJ1bGUgbGVmdCB0aGUgZW1wdHlcbiAgICAvLyBjYW52YXMgLyBtaW5pbWFwIG9uIHRoZWlyIG93biBjdXJzb3JzOyB0aGUgYnJpZWYgaXMgXCJwcm9zdMSbIHbFoXVkZVwiLiAoTWlycm9yc1xuICAgIC8vIHRoZSBvdXRlci1zaGVsbCBgKmAgcnVsZSBzbyBib3RoIGRvY3VtZW50cyBhcmUgdW5pZm9ybWx5IGNvdmVyZWQuKVxuICAgIHN0eWxlRWwudGV4dENvbnRlbnQgPSBgKiB7IGN1cnNvcjogJHtkZXNjLmN1cnNvcn0gIWltcG9ydGFudDsgfWA7XG4gICAgLy8gUGhhc2UgMjQg4oCUIGJyb2FkY2FzdCB0aGUgYWN0aXZlIHRvb2wgVE9LRU4gdG8gdGhlIE9VVEVSIGFwcCBzaGVsbCAodGhpc1xuICAgIC8vIGhvb2sgcnVucyBpbiB0aGUgY2FudmFzIGlmcmFtZSkgc28gdGhlIHNoZWxsIHNob3dzIHRoZSBzYW1lIGN1c3RvbSBjdXJzb3JcbiAgICAvLyBhY3Jvc3MgdGhlIHdob2xlIG1hdWRlIFVJIChzaWRlYmFyIC8gdG9wIGJhcikuIFdlIHNlbmQgdGhlIHRvb2wgKmlkKiwgTk9UXG4gICAgLy8gdGhlIGN1cnNvciBzdHJpbmc6IHRoZSBzaGVsbCByZXNvbHZlcyBpdCBhZ2FpbnN0IGl0cyBvd24gdHJ1c3RlZFxuICAgIC8vIFRPT0xfQ1VSU09SUyBjb3B5IChyZXNvbHZlVG9vbEN1cnNvciksIHNvIGFuIHVudHJ1c3RlZCBzeW5jZWQgY2FudmFzXG4gICAgLy8gKEREUi0wNTQpIGNhbiBvbmx5IHBpY2sgYSBrbm93biwgYWx3YXlzLXZpc2libGUgZ2x5cGgg4oCUIGl0IGNhbid0IGluamVjdCBhblxuICAgIC8vIGludmlzaWJsZS9kaXNwbGFjZWQgY3Vyc29yIGFzIGEgY2xpY2tqYWNraW5nIGFpZCAocGhhc2UtMjQgZXRoaWNhbC1oYWNrZXJcbiAgICAvLyBGaW5kaW5nIDI7IEREUi0wNjcpLlxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cucGFyZW50ICYmIHdpbmRvdy5wYXJlbnQgIT09IHdpbmRvdykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZSh7IGRnbjogJ3Rvb2wtY3Vyc29yJywgdG9vbCB9LCAnKicpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8qIGNyb3NzLW9yaWdpbiBwYXJlbnQgcmVqZWN0ZWQg4oCUIHNoZWxsIGtlZXBzIGl0cyBkZWZhdWx0IGN1cnNvciAqL1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSBwcmV2O1xuICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGMtdG9vbC1jdXJzb3InKTtcbiAgICAgIGlmIChlbCkgZWwudGV4dENvbnRlbnQgPSAnJztcbiAgICB9O1xuICB9LCBbdG9vbCwgdG9vbHNdKTtcblxuICBjb25zdCB2YWx1ZSA9IHVzZU1lbW88VG9vbENvbnRleHRWYWx1ZT4oXG4gICAgKCkgPT4gKHsgdG9vbCwgc2V0VG9vbCwgdG9vbHMsIHN0aWNreSwgdG9nZ2xlU3RpY2t5LCBjbGVhclN0aWNreSwgc2hhcGVLaW5kLCBzZXRTaGFwZUtpbmQgfSksXG4gICAgW3Rvb2wsIHNldFRvb2wsIHRvb2xzLCBzdGlja3ksIHRvZ2dsZVN0aWNreSwgY2xlYXJTdGlja3ksIHNoYXBlS2luZF1cbiAgKTtcblxuICByZXR1cm4gPFRvb2xDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXt2YWx1ZX0+e2NoaWxkcmVufTwvVG9vbENvbnRleHQuUHJvdmlkZXI+O1xufVxuXG4vKipcbiAqIE1vdW50IGEgYFRvb2xQcm92aWRlcmAgb25seSB3aGVuIG5vbmUgZXhpc3RzIGFib3ZlIHVzLiBXaGVuIHRoZSBzaGVsbC1vd25lZFxuICogY29tbWVudCBtb3VudCBsYXllciAoY2FudmFzLWNvbW1lbnQtbW91bnQudHN4KSBhbHJlYWR5IHByb3ZpZGVzIG9uZSxcbiAqIGBEZXNpZ25DYW52YXNgIGNvbnN1bWVzIHRoYXQgaW5zdGFuY2UgaW5zdGVhZCBvZiBkb3VibGUtbW91bnRpbmcuIFRoZSBob29rXG4gKiBpcyBjYWxsZWQgdW5jb25kaXRpb25hbGx5OyBvbmx5IHRoZSByZXR1cm5lZCB0cmVlIGJyYW5jaGVzIChob29rIHJ1bGVzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE1heWJlVG9vbFByb3ZpZGVyKHsgY2hpbGRyZW4gfTogeyBjaGlsZHJlbjogUmVhY3ROb2RlIH0pIHtcbiAgY29uc3Qgb3V0ZXIgPSB1c2VDb250ZXh0KFRvb2xDb250ZXh0KTtcbiAgaWYgKG91dGVyKSByZXR1cm4gPD57Y2hpbGRyZW59PC8+O1xuICByZXR1cm4gPFRvb2xQcm92aWRlcj57Y2hpbGRyZW59PC9Ub29sUHJvdmlkZXI+O1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEhvb2tcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVRvb2xNb2RlKCk6IFRvb2xDb250ZXh0VmFsdWUge1xuICBjb25zdCBjdHggPSB1c2VDb250ZXh0KFRvb2xDb250ZXh0KTtcbiAgaWYgKCFjdHgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZVRvb2xNb2RlIG11c3QgYmUgdXNlZCBpbnNpZGUgPFRvb2xQcm92aWRlcj4nKTtcbiAgfVxuICByZXR1cm4gY3R4O1xufVxuXG4vKipcbiAqIFJlYWQtb25seSB2YXJpYW50IOKAlCByZXR1cm5zIGBudWxsYCB3aGVuIG5vIHByb3ZpZGVyIG1vdW50ZWQuIFVzZWQgYnlcbiAqIGNvbXBvbmVudHMgdGhhdCBjYW4gcmVuZGVyIG91dHNpZGUgYSBUb29sUHJvdmlkZXIgdHJlZSAodGhlIGlucHV0XG4gKiByb3V0ZXIncyBvcHRpb25hbCBwYXRoKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVRvb2xNb2RlT3B0aW9uYWwoKTogVG9vbENvbnRleHRWYWx1ZSB8IG51bGwge1xuICByZXR1cm4gdXNlQ29udGV4dChUb29sQ29udGV4dCk7XG59XG4iLAogICAgIi8qKlxuICogQGZpbGUgICAgICAgY2FudmFzLWN1cnNvcnMudHMg4oCUIFBoYXNlIDI0IGN1c3RvbSB0b29sIGN1cnNvcnMgKEtlbm5leSBDQzApXG4gKiBAc2NvcGUgICAgICBhcHBzL3N0dWRpby9jYW52YXMtY3Vyc29ycy50c1xuICogQHB1cnBvc2UgICAgRmlnSmFtL0ZpZ21hLXN0eWxlIGN1c3RvbSBjdXJzb3JzIGZvciBFVkVSWSBjYW52YXMgdG9vbC4gVGhlXG4gKiAgICAgICAgICAgICBuYXRpdmUgY3Jvc3NoYWlyIC8gdGV4dCAvIGFycm93IGN1cnNvcnMgYXJlIHRpbnkgKyB0aGluIGFuZFxuICogICAgICAgICAgICAgdmFuaXNoIG9uIGJ1c3kgY2FudmFzZXM7IHRoZXNlIGFyZSAzMsOXMzIgU1ZHIGN1cnNvcnMgdGhhdCByZWFkIG9uXG4gKiAgICAgICAgICAgICBhbnkgYmFja2dyb3VuZC5cbiAqXG4gKiAgICAgICAgICAgICBQaGFzZSAyNCDigJQgQUxMIHRvb2xzIGRyYXcgZnJvbSBPTkUgbGlicmFyeSwgdGhlICoqS2VubmV5IEN1cnNvclxuICogICAgICAgICAgICAgUGFjayAoMS4xKSoqIFwiT3V0bGluZVwiIHNldCwgd2hpY2ggaXMgKipDQzAgLyBwdWJsaWMgZG9tYWluKipcbiAqICAgICAgICAgICAgIChodHRwczovL2tlbm5leS5ubC9hc3NldHMvY3Vyc29yLXBhY2sg4oCUIG5vIGF0dHJpYnV0aW9uIHJlcXVpcmVkLFxuICogICAgICAgICAgICAgcmVkaXN0cmlidXRhYmxlIGluc2lkZSB0aGlzIE1JVCBwYWNrYWdlICsgbWFya2V0cGxhY2UgY2xvbmUpLiBTZWVcbiAqICAgICAgICAgICAgIEREUi0wNjcgZm9yIHRoZSBsaWNlbmNlIGdhdGUgKEJpYmF0YSBHUEwtMy4wIHdhcyByZWplY3RlZCBhc1xuICogICAgICAgICAgICAgY29weWxlZnQpLiBPbmUgbGlicmFyeSA9IG9uZSB2aXN1YWwgaWRlbnRpdHkgYWNyb3NzIG1vdmUgLyBoYW5kIC9cbiAqICAgICAgICAgICAgIGNvbW1lbnQgLyBwZW4gLyBzaGFwZSAvIHN0aWNreSAvIHRleHQgLyBlcmFzZXIuIFRoZSBnbHlwaCBwYXRoc1xuICogICAgICAgICAgICAgYXJlIEtlbm5leSdzOyB3ZSBSRUNPTE9VUiB0aGVtIChzZWUgYGtlbm5leSgpYCkgdG8gYSBkYXJrLWdseXBoICtcbiAqICAgICAgICAgICAgIHdoaXRlLWhhbG8gdHJlYXRtZW50IHNvIHRoZXkgcmVhZCBjcmlzcGx5IG9uIGxpZ2h0IEFORCBkYXJrXG4gKiAgICAgICAgICAgICBjYW52YXNlcy4gUGVyLXRvb2wgZ2x5cGggbWFwOlxuICogICAgICAgICAgICAgICBtb3Zl4oaScG9pbnRlcl9hIMK3IGhhbmTihpJoYW5kX29wZW4gwrcgY29tbWVudOKGkm1lc3NhZ2VfZG90c19zcXVhcmUgwrdcbiAqICAgICAgICAgICAgICAgcGVu4oaSZHJhd2luZ19wZW5jaWwgwrcgc2hhcGXihpJsaW5lX2Nyb3NzIMK3IGVyYXNlcuKGkmRyYXdpbmdfZXJhc2VyLlxuICogICAgICAgICAgICAgdGV4dCAoSS1iZWFtKSArIHN0aWNreSAoZm9sZGVkLWNvcm5lciBub3RlKSBoYXZlIG5vIGNsZWFuIEtlbm5leVxuICogICAgICAgICAgICAgZXF1aXZhbGVudCwgc28gdGhleSBhcmUgQVVUSE9SRUQgaW4gdGhlIGlkZW50aWNhbCBkYXJrLWdseXBoICtcbiAqICAgICAgICAgICAgIHdoaXRlLWhhbG8gdHJlYXRtZW50IHRvIGtlZXAgb25lIHZpc3VhbCBpZGVudGl0eS5cbiAqXG4gKiAgICAgICAgICAgICBEZWxpdmVyZWQgYXMgQ1NTIGBjdXJzb3I6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbCzigKZcIikgaHggaHksIGZiYFxuICogICAgICAgICAgICAg4oCUIG5vIHJ1bnRpbWUgZGVwZW5kZW5jeSwgbm8gYXNzZXQgZmlsZXMuIDMyw5czMiBpcyB0aGVcbiAqICAgICAgICAgICAgIGNyb3NzLWJyb3dzZXItc2FmZSBjZWlsaW5nOyAoaHgsIGh5KSBpcyB0aGUgY2xpY2sgaG90c3BvdC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFRvb2wgfSBmcm9tICcuL2lucHV0LXJvdXRlci50c3gnO1xuXG4vKiogQnVpbGQgYSBDU1MgY3Vyc29yIHZhbHVlIGZyb20gYW4gaW5saW5lIFNWRyArIGhvdHNwb3QgKyBuYXRpdmUgZmFsbGJhY2suICovXG5mdW5jdGlvbiBzdmdDdXJzb3Ioc3ZnOiBzdHJpbmcsIGh4OiBudW1iZXIsIGh5OiBudW1iZXIsIGZhbGxiYWNrOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBlbmNvZGVVUklDb21wb25lbnQgaXMgdGhlIHNhZmVzdCBlc2NhcGluZyBmb3IgYSBkYXRhOiBVUkkgaW5zaWRlIHVybChcIuKAplwiKS5cbiAgcmV0dXJuIGB1cmwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJHtlbmNvZGVVUklDb21wb25lbnQoc3ZnLnRyaW0oKSl9XCIpICR7aHh9ICR7aHl9LCAke2ZhbGxiYWNrfWA7XG59XG5cbi8vIFBoYXNlIDI0IOKAlCAyNHB4IHJlbmRlcmVkIGJveCAoZG93biBmcm9tIDMyKSBzbyBjdXJzb3JzIGFyZW4ndCBvdmVyc2l6ZWQ7IHRoZVxuLy8gZ2x5cGggY29vcmRzIHN0YXkgaW4gdGhlIDMyLXVuaXQgdmlld0JveCBhbmQgc2NhbGUgaW50byAyNHB4LiBIb3RzcG90cyBhcmVcbi8vIHNjYWxlZCB0byBtYXRjaCAoc2VlIHRoZSBnZW5lcmF0b3IpLlxuY29uc3QgVyA9IGB3aWR0aD0nMjQnIGhlaWdodD0nMjQnIHZpZXdCb3g9JzAgMCAzMiAzMicgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJ2A7XG5jb25zdCBJTksgPSAnIzFmMWYxZic7XG5jb25zdCBIQUxPID0gXCJzdHJva2U9JyNmZmZmZmYnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnIHN0cm9rZS1saW5lY2FwPSdyb3VuZCdcIjtcblxuLy8gS2VubmV5IENDMCBnbHlwaCwgcmVjb2xvdXJlZCB0byBhIEZpZ0phbS1zdHlsZSAqKmRhcmsgZ2x5cGggKyB3aGl0ZSBoYWxvKio6XG4vLyBLZW5uZXkncyBvdXRsaW5lIGJhbmQgKGBiYCkgaXMgcGFpbnRlZCBXSElURSAodGhlIGhhbG8pIGFuZCBpdHMgaW5uZXIgZmlsbFxuLy8gKGB3YCkgaXMgcGFpbnRlZCBkYXJrIElOSy4gUmVhZHMgY3Jpc3BseSBvbiBhIExJR0hUIGNhbnZhcyAoc29saWQgZGFyayBnbHlwaClcbi8vIEFORCBhIGRhcmsgb25lICh3aGl0ZSBoYWxvIGVkZ2UpLlxuZnVuY3Rpb24ga2VubmV5KGI6IHN0cmluZywgdzogc3RyaW5nLCB0cmFuc2Zvcm0/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBPcHRpb25hbCBgPGcgdHJhbnNmb3JtPmAgZm9yIHRoZSBkcmF3aW5nIHRvb2xzIHdob3NlIEtlbm5leSBnbHlwaCBuZWVkc1xuICAvLyByZS1vcmllbnRpbmcgc28gdGhlIHdyaXRpbmcgdGlwIGxhbmRzIGF0IHRoZSBob3RzcG90ICh1c2VyIHN0ZWVyXG4gIC8vIDIwMjYtMDYtMDQ6IHBlbiAvIGhpZ2hsaWdodGVyIFwia3Jlc2zDrSBwb2Qga29uY2VtLCBuZSBuYSDFoXBpxI1jZVwiIOKGkiBmbGlwcGVkIHNvXG4gIC8vIHRoZSBuaWIgcG9pbnRzIGRvd24tTEVGVCwgdG9wLXJpZ2h04oaSYm90dG9tLWxlZnQpLlxuICBjb25zdCBvcGVuID0gdHJhbnNmb3JtID8gYDxnIHRyYW5zZm9ybT0nJHt0cmFuc2Zvcm19Jz5gIDogJyc7XG4gIGNvbnN0IGNsb3NlID0gdHJhbnNmb3JtID8gJzwvZz4nIDogJyc7XG4gIHJldHVybiBgPHN2ZyAke1d9PiR7b3Blbn08cGF0aCBmaWxsPScjZmZmZmZmJyBkPScke2J9Jy8+PHBhdGggZmlsbD0nJHtJTkt9JyBkPScke3d9Jy8+JHtjbG9zZX08L3N2Zz5gO1xufVxuXG4vLyBWZXJ0aWNhbCBtaXJyb3IgYWJvdXQgdGhlIDMyLXZpZXdCb3ggaG9yaXpvbnRhbCBjZW50cmU6ICh4LHkpIOKGkiAoeCwgMzLiiJJ5KS5cbi8vIEFwcGxpZWQgdG8gcGVuL2hpZ2hsaWdodGVyIHNvIHRoZSBnbHlwaCBsaWVzIGFsb25nIHRoZSB0b3AtcmlnaHTihpJib3R0b20tbGVmdFxuLy8gZGlhZ29uYWwgd2l0aCB0aGUgbmliIGF0IGJvdHRvbS1sZWZ0LlxuY29uc3QgRkxJUF9WID0gJ3RyYW5zbGF0ZSgwLDMyKSBzY2FsZSgxLC0xKSc7XG5cbi8vIG1vdmUg4oaSIEtlbm5leSBgcG9pbnRlcl9iYCAodXNlciBzdGVlciAyMDI2LTA2LTA0IOKAlCB0aGUgcGxhaW4gdmFyaWFudCwgbm90IHRoZVxuLy8gc2hhZGVkIG9uZSkuIEhvdHNwb3QgYXQgdGhlIGFycm93IHRpcCAodG9wKS5cbmNvbnN0IE1PVkUgPSBzdmdDdXJzb3IoXG4gIGtlbm5leShcbiAgICAnTTEwLjI1IDguMjUgTDEwLjA1IDguNjUgMTAgOSAxMCAyMy4xIDEwLjA1IDIzLjQgMTAuMjUgMjMuNzUgMTAuOCAyNCAxMS40NSAyMy44NSAxMS42IDIzLjcgMTEuNzUgMjMuNDUgMTQuNjUgMTkuOCAxNC44NSAxOS42NSAxNC45NSAxOS41IDE1LjQgMTkuMiAxNS45NSAxOS4xIDIxLjA1IDE5LjEgMjEuMiAxOS4xIDIxLjM1IDE5LjA1IDIxLjY1IDE4LjkgMjEuOSAxOC42IDIyIDE4LjMgMjIgMTcuOSAyMS45IDE3LjY1IDIxLjc1IDE3LjM1IDIxLjY1IDE3LjMgMjEuNTUgMTcuMTUgMTEuNSA4LjI1IDExLjI1IDguMDUgMTAuOTUgOCAxMC42IDguMDUgMTAuMjUgOC4yNSBNOS4xNSA2LjYgTDkuNyA2LjI1IDEwIDYuMTUgMTAuOTUgNiAxMS45IDYuMTUgMTMgNi45IDIyLjkgMTUuNjUgMjMgMTUuOCAyMy4yIDE1Ljk1IDIzLjc1IDE2Ljc1IDI0IDE3LjkgMjQgMTguMyAyMy45IDE4Ljk1IDIzLjggMTkuMjUgMjMuNiAxOS43IDIzLjEgMjAuMzUgMjIuNzUgMjAuNiAyMi4xIDIwLjkgMjIuMDUgMjAuOTUgMjIgMjAuOTUgMjEuMiAyMS4xIDIxLjA1IDIxLjEgMTYuMiAyMS4xIDE2LjEgMjEuMjUgMTYuMDUgMjEuMjUgMTMuNCAyNC42IDEzLjA1IDI1LjE1IDEyLjkgMjUuMyAxMi41NSAyNS41NSBRMTEuNiAyNi4xNSAxMC41NSAyNiBMMTAuNSAyNiBROS42NSAyNS44NSA5IDI1LjMgTDguNDUgMjQuNjUgOC40IDI0LjUgOC4xNSAyNC4wNSA4IDIzLjEgOCA5IFE4IDguNDUgOC4xNSA4LjA1IEw4LjI1IDcuNzUgOC40NSA3LjM1IDkuMTUgNi42JyxcbiAgICAnTTEwLjI1IDguMjUgTDEwLjYgOC4wNSAxMC45NSA4IDExLjI1IDguMDUgMTEuNSA4LjI1IDIxLjU1IDE3LjE1IDIxLjY1IDE3LjMgMjEuNzUgMTcuMzUgMjEuOSAxNy42NSAyMiAxNy45IDIyIDE4LjMgMjEuOSAxOC42IDIxLjY1IDE4LjkgMjEuMzUgMTkuMDUgMjEuMiAxOS4xIDIxLjA1IDE5LjEgMTUuOTUgMTkuMSAxNS40IDE5LjIgMTQuOTUgMTkuNSAxNC44NSAxOS42NSAxNC42NSAxOS44IDExLjc1IDIzLjQ1IDExLjYgMjMuNyAxMS40NSAyMy44NSAxMC44IDI0IDEwLjI1IDIzLjc1IDEwLjA1IDIzLjQgMTAgMjMuMSAxMCA5IDEwLjA1IDguNjUgMTAuMjUgOC4yNSdcbiAgKSxcbiAgOCxcbiAgNSxcbiAgJ2RlZmF1bHQnXG4pO1xuY29uc3QgSEFORCA9IHN2Z0N1cnNvcihcbiAga2VubmV5KFxuICAgICdNMjguNTUgMTcuOCBRMjkuNCAyMC4zIDI4Ljc1IDIyLjggTDI4LjcgMjMgMjguMTUgMjQuNTUgMjguMDUgMjQuNzUgUTI2LjQgMjguMiAyMi43NSAyOS40IEwyMi40NSAyOS41IDE4IDI5LjkgMTcuNzUgMjkuODUgUTE1LjggMjkuMjUgMTMuOCAyOC4xIEwxMy40NSAyNy45NSBRMTIgMjcuMDUgMTAuMzUgMjYuOCBMMTAuMjUgMjYuNzUgNy45IDI2LjcgNy44IDI2LjcgUTYuMSAyNi45IDQuOCAyNS44IEw0Ljc1IDI1LjggNC42NSAyNS43IDQuNiAyNS42NSBRMy4yNSAyNC41IDMuMDUgMjIuODUgTDMgMjIuNzUgUTIuOCAyMC45NSA0IDE5LjUgNS4wNSAxOC4xNSA2Ljc1IDE3Ljk1IEw4LjQgMTcuOSA3LjUgMTUuNTUgNy4zIDE1LjIgNy4yIDE1IDUgMTAuOTUgUTMuOSA5LjE1IDQuMyA3Ljc1IEw0LjQgNy41IFE0Ljc1IDYuMTUgNi40NSA1LjIgOSAzLjY1IDExIDUgMTEuMDUgNC4xIDExLjUgMy40NSAxMi4xNSAyLjEgMTQuMiAxLjYgTDE0LjM1IDEuNiBRMTguMDUgMC42IDE5LjYgNC40IEwxOS42NSA0LjU1IFEyMC43NSAzLjY1IDIyLjcgMy43NSBMMjIuNzUgMy43NSBRMjYuNzUgNCAyNyA4LjE1IEwyNyA4LjI1IDI3IDguMzUgMjcgOC40NSBRMjYuOSAxMC43NSAyNy4xIDEyLjYgMjcuMTUgMTQuNjUgMjguMiAxNi43NSBMMjguNTUgMTcuOCBNMjYuNjUgMTguNCBMMjYuMSAxNi44IDI2LjEgMTYuODUgUTI0LjggMTMuNyAyNSA4LjM1IEwyNSA4LjI1IFEyNC44NSA1LjkgMjIuNiA1Ljc1IDIwLjcgNS42NSAyMC40IDcuMzUgTDIwLjEgNy45NSAxOS41IDguMiAxOC44NSA4LjA1IDE4LjQ1IDcuNSAxNy43NSA1LjE1IFExNi44NSAyLjk1IDE0LjcgMy41NSBMMTQuNjUgMy41NSBRMTIuNTUgNC4wNSAxMy4xNSA2LjE1IEwxMy44NSA4Ljc1IDEzLjc1IDkuNDUgMTMuMjUgOS45NSAxMi41NSA5Ljk1IDEyIDkuNTUgMTAuOSA3LjcgUTkuNSA1LjcgNy40NSA2LjkgNi41IDcuNDUgNi4yNSA4LjE1IDYuMSA4LjkgNi43IDkuODUgOS4yIDEzLjkgMTAuOCAxOC42NSBMMTAuOCAxOS4zIDEwLjQgMTkuOCA5Ljc1IDE5Ljk1IFE4LjM1IDE5LjggNi45NSAxOS45NSA2LjEgMjAuMDUgNS41NSAyMC43NSA0LjkgMjEuNTUgNSAyMi41NSA1LjE1IDIzLjU1IDYgMjQuMiBMNi4wNSAyNC4yNSBRNi43NSAyNC44NSA3LjY1IDI0LjcgTDcuNyAyNC43IDEwLjY1IDI0LjggUTEyLjcgMjUuMTUgMTQuNDUgMjYuMiBMMTQuNSAyNi4yIFExNi40IDI3LjM1IDE4LjMgMjcuOSBMMjIuMDUgMjcuNSAyMi4xIDI3LjUgUTI0Ljk1IDI2LjU1IDI2LjI1IDIzLjg1IEwyNi44IDIyLjMgUTI3LjMgMjAuMzUgMjYuNjUgMTguNCcsXG4gICAgJ00yNi42NSAxOC40IFEyNy4zIDIwLjM1IDI2LjggMjIuMyBMMjYuMjUgMjMuODUgUTI0Ljk1IDI2LjU1IDIyLjEgMjcuNSBMMjIuMDUgMjcuNSAxOC4zIDI3LjkgUTE2LjQgMjcuMzUgMTQuNSAyNi4yIEwxNC40NSAyNi4yIFExMi43IDI1LjE1IDEwLjY1IDI0LjggTDcuNyAyNC43IDcuNjUgMjQuNyBRNi43NSAyNC44NSA2LjA1IDI0LjI1IEw2IDI0LjIgUTUuMTUgMjMuNTUgNSAyMi41NSA0LjkgMjEuNTUgNS41NSAyMC43NSA2LjEgMjAuMDUgNi45NSAxOS45NSA4LjM1IDE5LjggOS43NSAxOS45NSBMMTAuNCAxOS44IDEwLjggMTkuMyAxMC44IDE4LjY1IFE5LjIgMTMuOSA2LjcgOS44NSA2LjEgOC45IDYuMjUgOC4xNSA2LjUgNy40NSA3LjQ1IDYuOSA5LjUgNS43IDEwLjkgNy43IEwxMiA5LjU1IDEyLjU1IDkuOTUgMTMuMjUgOS45NSAxMy43NSA5LjQ1IDEzLjg1IDguNzUgMTMuMTUgNi4xNSBRMTIuNTUgNC4wNSAxNC42NSAzLjU1IEwxNC43IDMuNTUgUTE2Ljg1IDIuOTUgMTcuNzUgNS4xNSBMMTguNDUgNy41IDE4Ljg1IDguMDUgMTkuNSA4LjIgMjAuMSA3Ljk1IDIwLjQgNy4zNSBRMjAuNyA1LjY1IDIyLjYgNS43NSAyNC44NSA1LjkgMjUgOC4yNSBMMjUgOC4zNSBRMjQuOCAxMy43IDI2LjEgMTYuODUgTDI2LjEgMTYuOCAyNi42NSAxOC40J1xuICApLFxuICAxMixcbiAgMTIsXG4gICdncmFiJ1xuKTtcbi8vIGNvbW1lbnQg4oaSIEtlbm5leSBgbWVzc2FnZV9yb3VuZGAgKHVzZXIgc3RlZXIgMjAyNi0wNi0wNCkuIEhvdHNwb3QgYXQgdGhlXG4vLyB0YWlsIHRpcCAoYm90dG9tLWNlbnRyZSksIHdoZXJlIHRoZSBjb21tZW50IHBpbiBpcyBkcm9wcGVkLlxuY29uc3QgQ09NTUVOVCA9IHN2Z0N1cnNvcihcbiAga2VubmV5KFxuICAgICdNMjggMTQgUTI4IDkuODUgMjQuNDUgNi45IDIwLjk1IDQgMTYgNCAxMS4wNSA0IDcuNSA2LjkgTDcuNDUgNyBRNCA5LjkgNCAxNCA0IDE4LjE1IDcuNTUgMjEuMDUgTDcuNSAyMS4wNSBROS4yIDIyLjQ1IDExLjIgMjMuMiBMMTUuMyAyNy4zIDE2IDI3LjYgMTYuNyAyNy4zIDIwLjg1IDIzLjIgUTIyLjcgMjIuNDUgMjQuMyAyMS4xNSBMMjQuNDUgMjEuMDUgUTI4IDE4LjE1IDI4IDE0IE0yNS43NSA1LjM1IFEzMC4wNSA4Ljk1IDMwIDE0IDMwLjA1IDE5LjA1IDI1Ljc1IDIyLjYgTDI1LjQgMjIuODUgUTIzLjggMjQuMSAyMiAyNC45IEwxOC4xIDI4Ljc1IDE4LjE1IDI4Ljc1IFExNy4yIDI5LjYgMTYgMjkuNiAxNC44IDI5LjYgMTMuODUgMjguNzUgTDEzLjkgMjguNzUgMTAgMjQuOSA2LjYgMjIuODUgNi4yNSAyMi42IFExLjk1IDE5LjA1IDIgMTQgMS45NSA4Ljk1IDYuMjUgNS4zNSAxMC4zIDIgMTYgMiAyMS43IDIgMjUuNzUgNS4zNScsXG4gICAgJ00yOCAxNCBRMjggMTguMTUgMjQuNDUgMjEuMDUgTDI0LjMgMjEuMTUgUTIyLjcgMjIuNDUgMjAuODUgMjMuMiBMMTYuNyAyNy4zIDE2IDI3LjYgMTUuMyAyNy4zIDExLjIgMjMuMiBROS4yIDIyLjQ1IDcuNSAyMS4wNSBMNy41NSAyMS4wNSBRNCAxOC4xNSA0IDE0IDQgOS45IDcuNDUgNyBMNy41IDYuOSBRMTEuMDUgNCAxNiA0IDIwLjk1IDQgMjQuNDUgNi45IDI4IDkuODUgMjggMTQnXG4gICksXG4gIDEyLFxuICAyMSxcbiAgJ2Nyb3NzaGFpcidcbik7XG4vLyBwZW4g4oaSIEtlbm5leSBgZHJhd2luZ19wZW5gLCBtaXJyb3JlZCB2ZXJ0aWNhbGx5IChGTElQX1YpIHNvIHRoZSBuaWIgcG9pbnRzXG4vLyBkb3duLUxFRlQgKHRvcC1yaWdodOKGkmJvdHRvbS1sZWZ0IGRpYWdvbmFsKS4gU291cmNlIGdyYWRpZW50LXNoYWRlIHBhdGggZHJvcHBlZC5cbi8vIEhvdHNwb3QgYXQgdGhlIG5pYiwgYm90dG9tLWxlZnQuXG5jb25zdCBQRU4gPSBzdmdDdXJzb3IoXG4gIGtlbm5leShcbiAgICAnTTQgMTMuMSBMNCA2IFE0IDUuMTUgNC42IDQuNiA1LjE1IDQgNiA0IEwxMy4xIDQgUTEzLjk1IDQgMTQuNTUgNC42IEwyOC42NSAxOC43NSBRMjkuOCAxOS45IDI5Ljc1IDIxLjQ1IEwyOS43NSAyMS42IDI5Ljc1IDIxLjcgUTI5Ljc1IDIzLjIgMjguNyAyNC4zNSBMMjQuNDUgMjguNjUgMjQuMzUgMjguNzUgUTIzLjE1IDI5Ljg1IDIxLjY1IDI5LjggTDIxLjU1IDI5LjggMjEuNCAyOS44IFEyMC4yIDI5LjggMTkuMjUgMjkuMTUgTDE4IDI5LjM1IFExNi42IDI5LjQgMTUuMjUgMjggTDE1LjIgMjcuOTUgOC4yIDIwLjk1IFE3LjYgMjAuMzUgNy42IDE5LjU1IDcuNiAxOC43IDguMiAxOC4xIEw0LjYgMTQuNSBRNCAxMy45IDQgMTMuMSBNMTkuNSAyNi42NSBMMjAuMSAyNy4yNSBRMjAuNyAyNy44NSAyMS41IDI3LjggMjIuMzUgMjcuODUgMjMgMjcuMjUgTDI3LjI1IDIyLjk1IFEyNy44IDIyLjM1IDI3Ljc1IDIxLjU1IDI3LjggMjAuNzUgMjcuMiAyMC4xNSBMMTMuMSA2IDYgNiA2IDEzLjEgMTIuMzUgMTkuNDUgOS42IDE5LjUgMTYuNjUgMjYuNTUgUTE4LjA1IDI4LjA1IDE5LjUgMjYuNjUgTTguMDUgMTIuMyBMOCA4IDEyLjI1IDguMDUgMTMuOCA5LjYgOS42IDEzLjg1IDguMDUgMTIuMyBNMTUuMjUgMTEuMDUgTDIzIDE4LjggMTguOCAyMy4wNSAxMS4wNSAxNS4zIDE1LjI1IDExLjA1JyxcbiAgICAnTTE1LjI1IDExLjA1IEwxMS4wNSAxNS4zIDE4LjggMjMuMDUgMjMgMTguOCAxNS4yNSAxMS4wNSBNMTIuMzUgMTkuNDUgTDYgMTMuMSA2IDYgMTMuMSA2IDI3LjIgMjAuMTUgUTI3LjggMjAuNzUgMjcuNzUgMjEuNTUgMjcuOCAyMi4zNSAyNy4yNSAyMi45NSBMMjMgMjcuMjUgUTIyLjM1IDI3Ljg1IDIxLjUgMjcuOCAyMC43IDI3Ljg1IDIwLjEgMjcuMjUgTDE5LjUgMjYuNjUgMTIuMzUgMTkuNDUgTTguMDUgMTIuMyBMOS42IDEzLjg1IDEzLjggOS42IDEyLjI1IDguMDUgOCA4IDguMDUgMTIuMycsXG4gICAgRkxJUF9WXG4gICksXG4gIDYsXG4gIDE4LFxuICAnY3Jvc3NoYWlyJ1xuKTtcbi8vIGhpZ2hsaWdodGVyIOKGkiBLZW5uZXkgYGRyYXdpbmdfcGVuY2lsYCwgYWxzbyBtaXJyb3JlZCB2ZXJ0aWNhbGx5IChkaXN0aW5jdCBmcm9tXG4vLyB0aGUgcGVuIGdseXBoKS4gSG90c3BvdCBhdCB0aGUgbGVhZCB0aXAsIGJvdHRvbS1sZWZ0LlxuY29uc3QgSElHSExJR0hURVIgPSBzdmdDdXJzb3IoXG4gIGtlbm5leShcbiAgICAnTTUuMTUgMTAuODUgUTQgOS42NSA0IDguMSBMNCA3Ljk1IDQgNy44NSBRMy45NSA2LjIgNS4xIDUuMTUgNi4yNSA0IDcuODUgNCBMNy45NSA0IDguMSA0IFE5LjY1IDQgMTAuODUgNS4xNSBMMTEgNS4zIDE0LjMgNS4yNSBRMTUuMTUgNS4yNSAxNS43NSA1Ljg1IEwyOS45IDIwIFEzMSAyMS4xNSAzMSAyMi43NSBMMzEgMjIuODUgMzEgMjMgUTMxLjA1IDI0LjUgMjkuOSAyNS43IEwyOS41NSAyNS45NSAyNS42NSAyOS45IDI1LjY1IDI5Ljk1IFEyNC40NSAzMS4xIDIyLjc1IDMxLjEgMjEuMiAzMS4xNSAyMCAyOS45NSBMNS44NSAxNS44IFE1LjI1IDE1LjIgNS4yNSAxNC4zNSBMNS4yNSAxMC45NSA1LjE1IDEwLjg1IE0xOS45NSAyNC4yIEwxOC41NSAyMi44IDIyLjggMTguNTUgMjQuMiAxOS45NSAxOS45NSAyNC4yIE0yOC40NSAyMS40IEwxNC4zIDcuMjUgMTAuMTUgNy4zIDkuNCA2LjU1IFE4LjggNS45NSA3Ljk1IDYgNy4xIDUuOTUgNi41IDYuNTUgNS45NSA3LjEgNiA3Ljk1IDUuOTUgOC44IDYuNTUgOS40IEw3LjI1IDEwLjEgNy4yNSAxNC4zNSAyMS40IDI4LjUgUTIyIDI5LjEgMjIuNzUgMjkuMSAyMy42IDI5LjEgMjQuMiAyOC41IEwyOC40NSAyNC4yNSBRMjkuMDUgMjMuNjUgMjkgMjIuODUgMjkuMDUgMjIgMjguNDUgMjEuNCBNOS4yNSAxMy41IEw5LjI1IDkuMyAxMy41IDkuMjUgMTQuMyAxMC4wNSAxMC4wNSAxNC4zIDkuMjUgMTMuNSBNMTcuMTUgMjEuNCBMMTEuNSAxNS43NSAxNS43NSAxMS41IDIxLjQgMTcuMTUgMTcuMTUgMjEuNCcsXG4gICAgJ00xNy4xNSAyMS40IEwyMS40IDE3LjE1IDE1Ljc1IDExLjUgMTEuNSAxNS43NSAxNy4xNSAyMS40IE0yOC40NSAyMS40IFEyOS4wNSAyMiAyOSAyMi44NSAyOS4wNSAyMy42NSAyOC40NSAyNC4yNSBMMjQuMiAyOC41IFEyMy42IDI5LjEgMjIuNzUgMjkuMSAyMiAyOS4xIDIxLjQgMjguNSBMNy4yNSAxNC4zNSA3LjI1IDEwLjEgNi41NSA5LjQgUTUuOTUgOC44IDYgNy45NSA1Ljk1IDcuMSA2LjUgNi41NSA3LjEgNS45NSA3Ljk1IDYgOC44IDUuOTUgOS40IDYuNTUgTDEwLjE1IDcuMyAxNC4zIDcuMjUgMjguNDUgMjEuNCBNMTkuOTUgMjQuMiBMMjQuMiAxOS45NSAyMi44IDE4LjU1IDE4LjU1IDIyLjggMTkuOTUgMjQuMiBNOS4yNSAxMy41IEwxMC4wNSAxNC4zIDE0LjMgMTAuMDUgMTMuNSA5LjI1IDkuMjUgOS4zIDkuMjUgMTMuNScsXG4gICAgRkxJUF9WXG4gICksXG4gIDYsXG4gIDE4LFxuICAnY3Jvc3NoYWlyJ1xuKTtcbmNvbnN0IENST1NTSEFJUiA9IHN2Z0N1cnNvcihcbiAga2VubmV5KFxuICAgICdNMTcgMiBRMTguMiAyIDE5LjE1IDIuOSAyMCAzLjggMjAgNSBMMjAgMTIgMjcgMTIgUTI4LjIgMTIgMjkuMTUgMTIuOSAzMCAxMy44IDMwIDE1IEwzMCAxNyBRMzAgMTguMiAyOS4xNSAxOS4xNSAyOC4yIDIwIDI3IDIwIEwyMCAyMCAyMCAyNyBRMjAgMjguMiAxOS4xNSAyOS4xNSAxOC4yIDMwIDE3IDMwIEwxNSAzMCBRMTMuOCAzMCAxMi45IDI5LjE1IDEyIDI4LjIgMTIgMjcgTDEyIDIwIDUgMjAgUTMuOCAyMCAyLjkgMTkuMTUgMiAxOC4yIDIgMTcgTDIgMTUgUTIgMTMuOCAyLjkgMTIuOSAzLjggMTIgNSAxMiBMMTIgMTIgMTIgNSBRMTIgMy44IDEyLjkgMi45IDEzLjggMiAxNSAyIEwxNyAyIE0xNCAyNyBMMTQuMyAyNy43IFExNC42IDI4IDE1IDI4IEwxNyAyOCAxNy43IDI3LjcgMTggMjcgMTggMTguMDUgMTguMDUgMTggMjcgMTggUTI3LjQgMTggMjcuNyAxNy43IEwyOCAxNyAyOCAxNSAyNy43IDE0LjMgUTI3LjQgMTQgMjcgMTQgTDE4IDE0IDE4IDUgMTcuNyA0LjMgMTcgNCAxNSA0IFExNC42IDQgMTQuMyA0LjMgMTQgNC42IDE0IDUgTDE0IDE0IDUgMTQgUTQuNiAxNCA0LjMgMTQuMyA0IDE0LjYgNCAxNSBMNCAxNyBRNCAxNy40IDQuMyAxNy43IDQuNiAxOCA1IDE4IEwxNCAxOCAxNCAyNycsXG4gICAgJ00xNCAyNyBMMTQgMTggNSAxOCBRNC42IDE4IDQuMyAxNy43IDQgMTcuNCA0IDE3IEw0IDE1IFE0IDE0LjYgNC4zIDE0LjMgNC42IDE0IDUgMTQgTDE0IDE0IDE0IDUgUTE0IDQuNiAxNC4zIDQuMyAxNC42IDQgMTUgNCBMMTcgNCAxNy43IDQuMyAxOCA1IDE4IDE0IDI3IDE0IFEyNy40IDE0IDI3LjcgMTQuMyBMMjggMTUgMjggMTcgMjcuNyAxNy43IFEyNy40IDE4IDI3IDE4IEwxOC4wNSAxOCAxOCAxOC4wNSAxOCAyNyAxNy43IDI3LjcgMTcgMjggMTUgMjggUTE0LjYgMjggMTQuMyAyNy43IEwxNCAyNydcbiAgKSxcbiAgMTIsXG4gIDEyLFxuICAnY3Jvc3NoYWlyJ1xuKTtcbmNvbnN0IEVSQVNFUiA9IHN2Z0N1cnNvcihcbiAga2VubmV5KFxuICAgICdNMy45IDExLjM1IFEyLjMgMTIuNSAzLjcgMTMuOSBMMTYuNCAyNi42NSBRMTcuODUgMjguMDUgMTkuNDUgMjYuOSBMMjcuNjUgMjEuMTUgUTI5LjMgMjAgMjcuODUgMTguNiBMMTUuMTUgNS44NSBRMTMuNzUgNC40NSAxMi4xIDUuNiBMMy45IDExLjM1IE0xLjA1IDEyLjQgUTEgMTAuOTUgMi43NSA5Ljc1IEwxMC45NSA0IDEwLjk1IDMuOTUgUTE0IDEuODUgMTYuNiA0LjQ1IEwyOS4zIDE3LjIgUTMwLjggMTguNjUgMzAuNTUgMjAuMSAzMC41NSAyMS41NSAyOC44IDIyLjggTDIwLjYgMjguNTUgMjAuNjUgMjguNTUgUTE3LjcgMzAuNjUgMTUgMjguMSBMMTUgMjguMDUgMi4zIDE1LjMgMi4zIDE1LjM1IFEwLjggMTMuODUgMS4wNSAxMi40IE0xMy41IDcgTDE5Ljg1IDEzLjM1IDExLjY1IDE5LjE1IDUuMyAxMi43NSAxMy41IDcnLFxuICAgICdNMTMuNSA3IEw1LjMgMTIuNzUgMTEuNjUgMTkuMTUgMTkuODUgMTMuMzUgMTMuNSA3IE0zLjkgMTEuMzUgTDEyLjEgNS42IFExMy43NSA0LjQ1IDE1LjE1IDUuODUgTDI3Ljg1IDE4LjYgUTI5LjMgMjAgMjcuNjUgMjEuMTUgTDE5LjQ1IDI2LjkgUTE3Ljg1IDI4LjA1IDE2LjQgMjYuNjUgTDMuNyAxMy45IFEyLjMgMTIuNSAzLjkgMTEuMzUnXG4gICksXG4gIDYsXG4gIDE0LFxuICAnY2VsbCdcbik7XG5cbi8vIFRleHQg4oCUIGEgY2xhc3NpYyBJLWJlYW0gKHZlcnRpY2FsIHN0ZW0gKyB0b3AvYm90dG9tIHNlcmlmcykuIEF1dGhvcmVkIGluIHRoZVxuLy8gc2FtZSBkYXJrLUlOSyBnbHlwaCArIHdoaXRlLUhBTE8gdHJlYXRtZW50IGFzIHRoZSBLZW5uZXkgZ2x5cGhzIChLZW5uZXknc1xuLy8gcG9pbnRlcl9pIHJlYWRzIGFzIGEgc21hbGwgYnJhY2tldCwgbm90IGFuIEktYmVhbSkuIEhvdHNwb3QgZGVhZC1jZW50cmUuXG5jb25zdCBURVhUID0gc3ZnQ3Vyc29yKFxuICBgPHN2ZyAke1d9PjxwYXRoIGQ9J00xNiA0VjI4TTExIDRIMjFNMTEgMjhIMjEnIGZpbGw9J25vbmUnICR7SEFMT30gc3Ryb2tlLXdpZHRoPSc1Jy8+PHBhdGggZD0nTTE2IDRWMjhNMTEgNEgyMU0xMSAyOEgyMScgZmlsbD0nbm9uZScgc3Ryb2tlPScke0lOS30nIHN0cm9rZS13aWR0aD0nMi4yNScgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJy8+PC9zdmc+YCxcbiAgMTIsXG4gIDEyLFxuICAndGV4dCdcbik7XG5cbi8vIFN0aWNreSDigJQgYSBub3RlIHdpdGggYSBwZWVsZWQvZm9sZGVkIHRvcC1yaWdodCBjb3JuZXIgKHRoZSB1bml2ZXJzYWwgc3RpY2t5XG4vLyBnbHlwaCkuIEF1dGhvcmVkIGluIHRoZSBzYW1lIHRyZWF0bWVudCAoS2VubmV5IGhhcyBubyBzdGlja3ktbm90ZSkuIEhvdHNwb3Rcbi8vIGF0IHRoZSBub3RlJ3MgdG9wLWxlZnQsIHdoZXJlIHRoZSBub3RlIGlzIGRyb3BwZWQuXG5jb25zdCBTVElDS1kgPSBzdmdDdXJzb3IoXG4gIGA8c3ZnICR7V30+PHBhdGggZD0nTTYgNUgyMUwyNiAxMFYyN0g2WicgZmlsbD0nJHtJTkt9JyAke0hBTE99IHN0cm9rZS13aWR0aD0nMi41Jy8+PHBhdGggZD0nTTIxIDVWMTFIMjYnIGZpbGw9J25vbmUnICR7SEFMT30gc3Ryb2tlLXdpZHRoPScyLjI1Jy8+PC9zdmc+YCxcbiAgNSxcbiAgNSxcbiAgJ2Nyb3NzaGFpcidcbik7XG5cbi8qKlxuICogVG9vbCDihpIgQ1NTIGN1cnNvciB2YWx1ZS4gUGhhc2UgMjQg4oCUIGV2ZXJ5IHRvb2wgc2hpcHMgYSBLZW5uZXkgZ2x5cGggKG5vXG4gKiBzeXN0ZW0gZmFsbGJhY2sgZm9yIGBtb3ZlYCBhbnltb3JlOyB0aGUgYnJpZWYgaXMgT05FIHVuaWZpZWQgbGlicmFyeSkuIFRoZVxuICogc2luZ2xlIFNoYXBlIHRvb2wgdXNlcyB0aGUgY3Jvc3NoYWlyOyBgcmVjdGAvYGVsbGlwc2VgIHN0YXkga2V5ZWQgKHN0aWxsIGluXG4gKiB0aGUgVG9vbCB1bmlvbikgYnV0IGFyZSBubyBsb25nZXIgZGlyZWN0bHkgc2VsZWN0YWJsZS5cbiAqL1xuLy8gRnJvemVuIHNvIHRoZSBkb2NzdHJpbmcncyBcImZyb3plbiBtYXBcIiBndWFyYW50ZWUgaXMgcmVhbDogYHJlc29sdmVUb29sQ3Vyc29yYFxuLy8gaXMgYSBwdXJlIGxvb2t1cCBpbnRvIHRoaXMgb2JqZWN0LCBhbmQgZnJlZXppbmcgZm9yZWNsb3NlcyBhbnkgc2FtZS1yZWFsbVxuLy8gc2hlbGwtc2lkZSBjb2RlIGV2ZXIgbXV0YXRpbmcgYW4gZW50cnkgb3V0IGZyb20gdW5kZXIgdGhlIGxvb2t1cCAodGhlIGNhbnZhc1xuLy8gcnVucyBjcm9zcy1vcmlnaW4gYW5kIGNhbid0IHJlYWNoIGl0IHJlZ2FyZGxlc3Mg4oCUIHRoaXMgaXMgYmVsdC1hbmQtYnJhY2VzKS5cbmV4cG9ydCBjb25zdCBUT09MX0NVUlNPUlM6IFJlY29yZDxUb29sLCBzdHJpbmc+ID0gT2JqZWN0LmZyZWV6ZSh7XG4gIG1vdmU6IE1PVkUsXG4gIGhhbmQ6IEhBTkQsXG4gIGNvbW1lbnQ6IENPTU1FTlQsXG4gIHBlbjogUEVOLFxuICAvLyBGaWdKYW0gdjMg4oCUIHRoZSBzZWN0aW9uIGNvbnRhaW5lciBkcmF3cyBsaWtlIGEgc2hhcGUgKGNyb3NzaGFpciBnbHlwaCkuXG4gIHNlY3Rpb246IENST1NTSEFJUixcbiAgLy8gSGlnaGxpZ2h0ZXIgPSBLZW5uZXkgYGRyYXdpbmdfcGVuY2lsYCByb3QxODA7IHBlbiA9IGBkcmF3aW5nX3BlbmAgcm90MTgwIOKAlFxuICAvLyBkaXN0aW5jdCBnbHlwaHMsIGJvdGggZnJvbSB0aGUgS2VubmV5IHBhY2sgKHVzZXIgc3RlZXIgMjAyNi0wNi0wNCkuXG4gIGhpZ2hsaWdodGVyOiBISUdITElHSFRFUixcbiAgc2hhcGU6IENST1NTSEFJUixcbiAgcmVjdDogQ1JPU1NIQUlSLFxuICBlbGxpcHNlOiBDUk9TU0hBSVIsXG4gIHN0aWNreTogU1RJQ0tZLFxuICBhcnJvdzogQ1JPU1NIQUlSLFxuICB0ZXh0OiBURVhULFxuICBlcmFzZXI6IEVSQVNFUixcbn0pO1xuXG4vKipcbiAqIFJlc29sdmUgYSB0b29sIHRva2VuIOKAlCByZWNlaXZlZCBvdmVyIHRoZSAqKnVudHJ1c3RlZCoqIGNhbnZhc+KGknNoZWxsXG4gKiBgdG9vbC1jdXJzb3JgIHBvc3RNZXNzYWdlIGJyaWRnZSDigJQgdG8gYSBUUlVTVEVEIGN1cnNvciBzdHJpbmcgZnJvbVxuICoge0BsaW5rIFRPT0xfQ1VSU09SU30sIG9yIGBudWxsYCB3aGVuIHRoZSB0b2tlbiBpcyBub3QgYSBrbm93biB0b29sLlxuICpcbiAqIFRoZSBhcHAgc2hlbGwgYXBwbGllcyB0aGUgdmFsdWUgdGhpcyBSRVRVUk5TLCBuZXZlciB0aGUgcmF3IG1lc3NhZ2UuIFRoYXQgaXNcbiAqIHRoZSBzZWN1cml0eSBib3VuZGFyeTogYSBtYWxpY2lvdXMgKnN5bmNlZCogY2FudmFzIChERFItMDU0IOKAlCBjYW52YXMgY29udGVudFxuICogaXMgdW50cnVzdGVkIGFuZCBtYXkgYmUgaHViLXB1c2hlZCkgY2FuIGNhbGxcbiAqIGB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKHsgZGduOiAndG9vbC1jdXJzb3InLCB0b29sOiDigKYgfSwgJyonKWAgZGlyZWN0bHksXG4gKiBieXBhc3NpbmcgdGhlIGhvbmVzdCBgVG9vbFByb3ZpZGVyYCBzZW5kZXIuIEJ5IGVjaG9pbmcgb25seSBhIHRva2VuIGFuZFxuICogbG9va2luZyB0aGUgY3Vyc29yIHVwIGhlcmUsIHRoZSB3b3JzdCB0aGF0IGNhbnZhcyBjYW4gZG8gaXMgcGljayAqd2hpY2gqXG4gKiBrbm93biwgYWx3YXlzLXZpc2libGUgZ2x5cGggdGhlIHNoZWxsIHNob3dzIOKAlCBpdCBjYW4gbm8gbG9uZ2VyIHNtdWdnbGUgYW5cbiAqIGludmlzaWJsZSAvIGRpc3BsYWNlZCAvIHplcm8tY29udGVudCBTVkcgY3Vyc29yIHRoYXQgd291bGQgYWN0IGFzIGFcbiAqIGNsaWNramFja2luZyBhaWQgb3ZlciB0aGUgdW4tQ1NQJ2Qgc2hlbGwgKHBoYXNlLTI0IGV0aGljYWwtaGFja2VyIEZpbmRpbmcgMjtcbiAqIHNlZSBERFItMDY3KS4gYGhhc093blByb3BlcnR5YCAobm90IGBpbmApIGtlZXBzIGBjb25zdHJ1Y3RvcmAvYF9fcHJvdG9fX2BcbiAqIG9mZiB0aGUgYWxsb3dsaXN0LCBhbmQgdGhlIGBbYS16LV1gIHNoYXBlIGdhdGUgYmFycyBhbnl0aGluZyBidXQgYSB0b29sIGlkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVRvb2xDdXJzb3IodG9rZW46IHVua25vd24pOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKHR5cGVvZiB0b2tlbiAhPT0gJ3N0cmluZycgfHwgIS9eW2Etei1dKyQvLnRlc3QodG9rZW4pKSByZXR1cm4gbnVsbDtcbiAgaWYgKCFPYmplY3QuaGFzT3duKFRPT0xfQ1VSU09SUywgdG9rZW4pKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIFRPT0xfQ1VSU09SU1t0b2tlbiBhcyBUb29sXTtcbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICI7QUE0QkE7QUFBQTtBQUFBO0FBQUEsY0FJRTtBQUFBLGlCQUVBO0FBQUEsZUFDQTtBQUFBLGFBQ0E7QUFBQSxZQUNBO0FBQUEsY0FDQTtBQUFBO0FBRUY7OztBQ05BLHdCQUFTLDJCQUFhLHVCQUFXLG9CQUFTLHFCQUFROzs7QUNoQmxEO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFVQTtBQUNBO0FBQ0E7QUFBQTtBQWdRQSxJQUFNLGdCQUFnQixjQUFrQyxJQUFJO0FBRXJELFNBQVMsU0FBUyxHQUF1QjtBQUFBLEVBQzlDLE9BQU8sV0FBVyxhQUFhO0FBQUE7OztBQ2pSakM7QUFBQSxtQkFDRTtBQUFBLGlCQUVBO0FBQUEsZ0JBQ0E7QUFBQSxlQUNBO0FBQUEsYUFDQTtBQUFBLFlBQ0E7QUFBQSxjQUNBO0FBQUE7QUFBQTtBQXlERixJQUFNLHNCQUFzQixlQUF3QyxJQUFJO0FBS3hFLFNBQVMsWUFBWSxDQUFDLEdBQXNCO0FBQUEsRUFDMUMsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFFLE9BQU8sT0FBTyxFQUFFO0FBQUE7QUFHeEMsU0FBUyxNQUFNLENBQUMsTUFBZ0M7QUFBQSxFQUM5QyxNQUFNLE1BQW1CLENBQUM7QUFBQSxFQUMxQixNQUFNLE9BQU8sSUFBSTtBQUFBLEVBQ2pCLFdBQVcs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QUFnQixLQUFLLEVBQUUsSUFBSSxNQUFNLFFBQVEsSUFBSSxFQUFFLElBQUksTUFBTSxDQUFDO0FBQUEsSUFDekY7QUFBQSxJQUNDLE9BQThDLGVBQWU7QUFBQSxJQUM5RCxPQUFPLE1BQU07QUFBQSxNQUNWLE9BQThDLGVBQWU7QUFBQTtBQUFBLEtBRS9ELENBQUMsQ0FBQztBQUFBLEVBRUwsTUFBTSxXQUFXLGFBQVksTUFBTTtBQUFBLElBQ2pDLFNBQVMsVUFBVSxVQUFVO0FBQUEsSUFFN0IsZ0JBQWdCLENBQUMsTUFBTyxFQUFFLEtBQUssRUFBRSxJQUFJLE1BQU0sSUFBSSxDQUFFO0FBQUEsS0FDaEQsQ0FBQyxDQUFDO0FBQUEsRUFFTCxNQUFNLGNBQWMsYUFBWSxNQUFNO0FBQUEsSUFDcEMsZ0JBQWdCLEVBQUUsSUFBSSxNQUFNLFNBQVMsZUFBZSxDQUFDO0FBQUEsS0FDcEQsQ0FBQyxDQUFDO0FBQUEsRUFFTCxNQUFNLFdBQVcsYUFBWSxNQUFpQjtBQUFBLElBQzVDLE1BQU0sS0FBSyxTQUFTO0FBQUEsSUFDcEIsT0FBTyxLQUFLLGdCQUFnQixJQUFJLElBQUksSUFBSTtBQUFBLEtBQ3ZDLENBQUMsSUFBSSxDQUFDO0FBQUEsRUFFVCxPQUFPLGNBQ0wsV0FDQSxNQUNBLGNBQ0UscUJBQ0EsRUFBRSxTQUFTLFNBQVMsYUFBYSxTQUFTLEdBRzFDLGNBQWMsVUFBVSxFQUFFLEtBQUssU0FBUyxRQUFRLFFBQVEsTUFBTSxNQUFNLFNBQVMsQ0FBQyxDQUNoRixHQUNBLFFBQVEsS0FBSyxjQUFjLGlCQUFpQixFQUFFLFNBQVMsUUFBUSxRQUFRLENBQUMsSUFBSSxJQUM5RTtBQUFBOyIsCiAgImRlYnVnSWQiOiAiN0YxNDgyODQ3QUY4QUREODY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
|