cdk-nextjs 0.7.14 → 0.7.16

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.
@@ -1215,18 +1215,18 @@ async function sendWebResponse(res, response) {
1215
1215
  if (res.destroyed) {
1216
1216
  return;
1217
1217
  }
1218
+ // No `res.flush()` needed when the sink compresses: its gzip stage
1219
+ // sync-flushes every chunk, so a streamed body (server-sent events through
1220
+ // a rewrite, a middleware `ReadableStream`) reaches the client chunk by
1221
+ // chunk.
1222
+ //
1218
1223
  // Paced by the client: without waiting for `drain`, a large proxied body
1219
1224
  // headed for a slow client is buffered whole in memory.
1220
1225
  const accepted = res.write(chunk);
1221
- // Set by the sink when it compresses. Without it the chunk sits in zlib's
1222
- // buffer, and a streamed body — server-sent events through a rewrite, a
1223
- // middleware `ReadableStream` — reaches the client all at once, at the end.
1224
- // Next.js flushes after every chunk for the same reason (`pipe-readable`).
1225
- res.flush?.();
1226
1226
  if (!accepted && !(await (0, util_1.drained)(res))) {
1227
1227
  return;
1228
1228
  }
1229
1229
  }
1230
1230
  res.end();
1231
1231
  }
1232
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL2NvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBMitCQSx3REFnQkM7QUFtREQsc0RBK0JDO0FBbUJELGtDQTBEQztBQWlJRCw4QkEyQ0M7QUF0MENELHNEQUFzRDtBQUN0RDs7Ozs7Ozs7Ozs7R0FXRztBQUNILCtDQUE0QztBQUU1Qyx5Q0FBaUM7QUFDakMsNkNBQWlEO0FBQ2pELG1EQUFvRDtBQUNwRCx5Q0FLb0I7QUFDcEIsK0NBSXVCO0FBQ3ZCLDRDQUE0RTtBQUM1RSw4Q0FJeUI7QUFDekIsc0NBQXVEO0FBQ3ZELG1DQUF1RTtBQUN2RSx5Q0FNb0I7QUFDcEIsNkNBQWdEO0FBQ2hELGlEQUt3QjtBQUN4QixpREFBa0U7QUFDbEUsaURBQW9FO0FBQ3BFLGlEQUFvRTtBQUNwRSxpQ0FBMEU7QUFFMUUsMEVBQTBFO0FBQzFFLElBQUEsb0NBQXFCLEdBQUUsQ0FBQztBQStEeEIsTUFBYSxhQUFhO0lBVVk7SUFUbkIsV0FBVyxDQUFxQjtJQUNoQyxVQUFVLENBQWE7SUFDdkIsVUFBVSxDQUFvQjtJQUM5QixNQUFNLENBQXdCO0lBQy9DLDJDQUEyQztJQUMxQixjQUFjLENBQXlDO0lBQ3hFLGtFQUFrRTtJQUNqRCxZQUFZLENBQVU7SUFFdkMsWUFBb0MsT0FBNkI7UUFBN0IsWUFBTyxHQUFQLE9BQU8sQ0FBc0I7UUFDL0QsTUFBTSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFDN0MsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLGdDQUFrQixDQUFDLGNBQWMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNwRSx3REFBd0Q7UUFDeEQsTUFBTSxXQUFXLEdBQUcsSUFBQSxpQ0FBa0IsRUFBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLHFCQUFVLENBQUM7WUFDL0IsUUFB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TUFBTSxJQUFBLGNBQU8sRUFBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDdkMsT0FBTztRQUNULENBQUM7SUFDSCxDQUFDO0lBQ0QsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ1osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAqL1xuLyoqXG4gKiBUaGUgcnVudGltZSBjb3JlOiBvbmUgYGhhbmRsZShyZXF1ZXN0LCBzaW5rKWAgdGhhdCBib3RoIHNoZWxscyB3cmFwLlxuICpcbiAqIFRoZSBMYW1iZGEgc2hlbGwgKGBsYW1iZGEubXRzYCkgYW5kIHRoZSBjb250YWluZXIgc2hlbGwgKGBzZXJ2ZXIubXRzYCkgZG9cbiAqIG5vdGhpbmcgYnV0IHR1cm4gdGhlaXIgaW5wdXQgaW50byBhIHtAbGluayBSdW50aW1lUmVxdWVzdH0gYW5kIHRoZWlyIG91dHB1dCBpbnRvXG4gKiBhIHtAbGluayBSZXNwb25zZVNpbmt9LiBFdmVyeXRoaW5nIGVsc2Ug4oCUIHN5bnRoZXNpemluZyBgcmVxYC9gcmVzYCwgZGlzcGF0Y2gsXG4gKiBtaWRkbGV3YXJlLCBlbnRyeXBvaW50IGludm9jYXRpb24sIHN0YXRpYyBmaWxlcywgaW1hZ2Ugb3B0aW1pemF0aW9uLCBnemlwLFxuICogYHdhaXRVbnRpbGAg4oCUIGhhcHBlbnMgaGVyZSwgc28gdGhlIGNvbnRhaW5lciBlMmUgc3VpdGUgZXhlcmNpc2VzIHRoZSBzYW1lIGNvZGVcbiAqIExhbWJkYSBydW5zLiBUaGF0IGlzIGRlbGliZXJhdGU6IHRoZSBjb250YWluZXIgcGF0aCB1c2VkIHRvIGdldCByZWFsXG4gKiBgbm9kZTpodHRwYCBvYmplY3RzIGZyb20gTGFtYmRhIFdlYiBBZGFwdGVyLCB3aGljaCBtZWFudCBjb250YWluZXIgdGVzdHMgcHJvdmVkXG4gKiBub3RoaW5nIGFib3V0IExhbWJkYS5cbiAqL1xuaW1wb3J0IHsgcmVhZEZpbGUgfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHR5cGUgeyBJbmNvbWluZ0h0dHBIZWFkZXJzIH0gZnJvbSBcIm5vZGU6aHR0cFwiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IFJlYWRhYmxlLCBXcml0YWJsZSB9IGZyb20gXCJub2RlOnN0cmVhbVwiO1xuaW1wb3J0IHsgY2FzZUNhbm9uaWNhbFBhdGggfSBmcm9tIFwiLi9jYXNlLXJlZGlyZWN0XCI7XG5pbXBvcnQge1xuICBEaXNwYXRjaGVyLFxuICBvdXRPZkJhbmRSb3V0ZVBhcmFtcyxcbiAgU3RhdHVzVGFyZ2V0LFxuICBzdGF0dXNUYXJnZXRzLFxufSBmcm9tIFwiLi9kaXNwYXRjaFwiO1xuaW1wb3J0IHtcbiAgRW50cnlwb2ludEhhbmRsZXIsXG4gIEVudHJ5cG9pbnRSZWdpc3RyeSxcbiAgUm91dGVJbk90aGVyR3JvdXBFcnJvcixcbn0gZnJvbSBcIi4vZW50cnlwb2ludHNcIjtcbmltcG9ydCB7IFNoaW1JbmNvbWluZ01lc3NhZ2UsIHRvSW5jb21pbmdIdHRwSGVhZGVycyB9IGZyb20gXCIuL2h0dHAvcmVxdWVzdFwiO1xuaW1wb3J0IHtcbiAgYXNTZXJ2ZXJSZXNwb25zZSxcbiAgUmVzcG9uc2VIZWFkLFxuICBTaGltU2VydmVyUmVzcG9uc2UsXG59IGZyb20gXCIuL2h0dHAvcmVzcG9uc2VcIjtcbmltcG9ydCB7IHBpcGVUb1NpbmssIFJlc3BvbnNlU2luayB9IGZyb20gXCIuL2h0dHAvc2lua1wiO1xuaW1wb3J0IHsgSW50ZXJuYWxJbWFnZVJlc3BvbnNlLCBSdW50aW1lSW1hZ2VPcHRpbWl6ZXIgfSBmcm9tIFwiLi9pbWFnZVwiO1xuaW1wb3J0IHtcbiAgQWRhcHRlck1hbmlmZXN0LFxuICBkZXBsb3llZE1hbmlmZXN0UGF0aCxcbiAgRlVOQ1RJT05fR1JPVVBfRU5WX1ZBUixcbiAgTUFOSUZFU1RfRklMRV9OQU1FLFxuICBSRVZBTElEQVRFRF9QQUdFX0hPT0ssXG59IGZyb20gXCIuL21hbmlmZXN0XCI7XG5pbXBvcnQgeyBNaWRkbGV3YXJlUnVubmVyIH0gZnJvbSBcIi4vbWlkZGxld2FyZVwiO1xuaW1wb3J0IHtcbiAgbG9hZEVudkZpbGVzLFxuICByZWdpc3Rlckluc3RydW1lbnRhdGlvbixcbiAgc2V0dXBOb2RlRW52aXJvbm1lbnQsXG4gIHVzZU5leHRGcm9tLFxufSBmcm9tIFwiLi9uZXh0LW1vZHVsZXNcIjtcbmltcG9ydCB7IHB1YmxpY0RpcktleSwgcmVzb2x2ZVB1YmxpY0ZpbGVzIH0gZnJvbSBcIi4vcHVibGljLWZpbGVzXCI7XG5pbXBvcnQgeyBzZXJ2ZVMzUHVibGljRmlsZSwgc2VydmVTdGF0aWNGaWxlIH0gZnJvbSBcIi4vc3RhdGljLWZpbGVzXCI7XG5pbXBvcnQgeyBjYXB0dXJlT3V0c2lkZVJlcXVlc3QsIGNhdGNoVXBUYWdzIH0gZnJvbSBcIi4vdGFnLW1hbmlmZXN0XCI7XG5pbXBvcnQgeyBkcmFpbmVkLCBmaXJzdFZhbHVlLCB0b1NlYXJjaCwgd2l0aG91dFBhdGhQcmVmaXggfSBmcm9tIFwiLi91dGlsXCI7XG5cbi8vIEF0IGxvYWQsIGJlZm9yZSBhbnkgcmVxdWVzdDogdGhlIGNvbnRleHQgY2FjaGUgaGFuZGxlciB3b3JrIGVzY2FwZXMgdG8uXG5jYXB0dXJlT3V0c2lkZVJlcXVlc3QoKTtcblxuLyoqIE9uZSByZXF1ZXN0LCBub3JtYWxpemVkIGJ5IGEgc2hlbGwuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWVSZXF1ZXN0IHtcbiAgcmVhZG9ubHkgbWV0aG9kOiBzdHJpbmc7XG4gIC8qKiBPcmlnaW4tZm9ybSB0YXJnZXQgZXhhY3RseSBhcyByZWNlaXZlZDogcGF0aCArIHF1ZXJ5LCBuZXZlciBhYnNvbHV0ZS4gKi9cbiAgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGhlYWRlcnM6IEluY29taW5nSHR0cEhlYWRlcnM7XG4gIHJlYWRvbmx5IGJvZHk/OiBSZWFkYWJsZSB8IEJ1ZmZlcjtcbiAgcmVhZG9ubHkgcmVtb3RlQWRkcmVzcz86IHN0cmluZztcbiAgLyoqIGBmYWxzZWAgYmVoaW5kIGEgVExTLXRlcm1pbmF0aW5nIEFMQi4gT25seSBhZmZlY3RzIHRoZSBzeW50aGVzaXplZCBzb2NrZXQuICovXG4gIHJlYWRvbmx5IGVuY3J5cHRlZD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBYm9ydGVkIHdoZW4gdGhlIGNsaWVudCBkaXNjb25uZWN0cy4gV2lyaW5nIGl0IHRvIGByZXMuZGVzdHJveSgpYCBpcyB3aGF0XG4gICAqIG1ha2VzIGByZXF1ZXN0LnNpZ25hbC5vbmFib3J0YCBmaXJlIGluc2lkZSByb3V0ZSBoYW5kbGVycy5cbiAgICovXG4gIHJlYWRvbmx5IHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICAvKipcbiAgICogV2hldGhlciBgeC1mb3J3YXJkZWQtaG9zdGAgbmFtZXMgdGhlIGhvc3QgdGhlIGNsaWVudCBhc2tlZCBmb3IuIE9ubHkgdGhlXG4gICAqIHNoZWxsIGNhbiBrbm93OiBpdCBpcyBgdHJ1ZWAgZm9yIGEgRnVuY3Rpb24gVVJMIGV2ZW50IHdob3NlIFNpZ1Y0IExhbWJkYVxuICAgKiB2ZXJpZmllZC4gVGhhdCBpcyBhbnkgSUFNLWF1dGhvcml6ZWQgaW52b2tlciDigJQgaW4gcHJhY3RpY2UgQ2xvdWRGcm9udCdzXG4gICAqIE9yaWdpbiBBY2Nlc3MgQ29udHJvbCwgd2hvc2Ugdmlld2VyLXJlcXVlc3QgZnVuY3Rpb24gb3ZlcndyaXRlcyB0aGUgaGVhZGVyXG4gICAqIHdpdGggdGhlIHZpZXdlcidzIGBIb3N0YCAoQ2xvdWRGcm9udCBoYXMgdG8gcmVwbGFjZSBgSG9zdGAgaXRzZWxmIHdpdGggdGhlXG4gICAqIEZ1bmN0aW9uIFVSTCdzIGRvbWFpbiksIHBsdXMgcHJpbmNpcGFscyBncmFudGVkIGBsYW1iZGE6SW52b2tlRnVuY3Rpb25VcmxgLFxuICAgKiB3aG8gY291bGQgcmVwbGFjZSB0aGUgZnVuY3Rpb24ncyBjb2RlIGFueXdheS4gSXQgaXMgYWxzbyB3aGF0XG4gICAqIGBwcm94eUV4dGVybmFsYCBkcm9wcyBPQUMncyBzaWduYXR1cmUgb24uIEV2ZXJ5d2hlcmUgZWxzZSB0aGUgaGVhZGVyIGlzXG4gICAqIHdoYXRldmVyIHRoZSBjbGllbnQgc2VudCwgYW5kIGl0IGlzXG4gICAqIGlnbm9yZWQsIGFzIGBuZXh0IHN0YXJ0YCBpZ25vcmVzIGl0IHdpdGhvdXQgYGV4cGVyaW1lbnRhbC50cnVzdEhvc3RIZWFkZXJgLlxuICAgKi9cbiAgcmVhZG9ubHkgdHJ1c3RGb3J3YXJkZWRIb3N0PzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFNldCBieSB7QGxpbmsgTmV4dGpzUnVudGltZS5oYW5kbGVJbnRlcm5hbGx5fSBmb3IgdGhlIGluLXByb2Nlc3MgcmVxdWVzdHMgaXRcbiAgICogbWFrZXM6IGNhbGxlZCB3aXRoIHRoZSBgUm91dGVJbk90aGVyR3JvdXBFcnJvcmAgdGhlIHJvdXRlIHRocmV3LCBpbnN0ZWFkIG9mXG4gICAqIGxvZ2dpbmcgdGhlIG1pc3JvdXRlZC1yZXF1ZXN0IHdhcm5pbmcsIHdoaWNoIGRlc2NyaWJlcyBhIENsb3VkRnJvbnQgb3IgQVBJXG4gICAqIEdhdGV3YXkgcHJvYmxlbSB0aGlzIGlzIG5vdC5cbiAgICovXG4gIHJlYWRvbmx5IG9uUm91dGVJbk90aGVyR3JvdXA/OiAoZXJyb3I6IFJvdXRlSW5PdGhlckdyb3VwRXJyb3IpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogYFJldmFsaWRhdGVGbmAncyBhcmd1bWVudCAoYG5leHQvZGlzdC9zZXJ2ZXIvbGliL3JvdXRlci11dGlscy9yb3V0ZXItc2VydmVyLWNvbnRleHRgKSxcbiAqIHJlc3RhdGVkIGJlY2F1c2UgdGhhdCBtb2R1bGUgaXMgbm90IHBhcnQgb2YgYG5leHRgJ3MgcHVibGlzaGVkIHR5cGUgc3VyZmFjZS5cbiAqL1xuaW50ZXJmYWNlIFJldmFsaWRhdGVDb25maWcge1xuICByZWFkb25seSB1cmxQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGhlYWRlcnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW10gfTtcbiAgcmVhZG9ubHkgb3B0czogeyB1bnN0YWJsZV9vbmx5R2VuZXJhdGVkPzogYm9vbGVhbiB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc1J1bnRpbWVPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFic29sdXRlIHBhdGggdG8gdGhlIGRlcGxveW1lbnQgcm9vdCDigJQgdGhlIHN0YWdlZCB0cmVlIGV2ZXJ5IG1hbmlmZXN0IGtleVxuICAgKiByZXNvbHZlcyBhZ2FpbnN0LiBgTEFNQkRBX1RBU0tfUk9PVGAgZm9yIEZ1bmN0aW9ucywgdGhlIGltYWdlIGBXT1JLRElSYCBmb3JcbiAgICogQ29udGFpbmVyczsgYm90aCBzaGVsbHMgZGVyaXZlIGl0IGZyb20gdGhlaXIgb3duIGxvY2F0aW9uIGluc3RlYWQuXG4gICAqL1xuICByZWFkb25seSBkZXBsb3ltZW50Um9vdDogc3RyaW5nO1xuICByZWFkb25seSBtYW5pZmVzdDogQWRhcHRlck1hbmlmZXN0O1xuICAvKiogYENES19ORVhUSlNfU1RBVElDX0FTU0VUU19CVUNLRVRfTkFNRWAuICovXG4gIHJlYWRvbmx5IGJ1Y2tldD86IHN0cmluZztcbiAgLyoqIGBDREtfTkVYVEpTX1NUQVRJQ19BU1NFVFNfS0VZX1BSRUZJWGAuICovXG4gIHJlYWRvbmx5IGJ1Y2tldEtleVByZWZpeD86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIE5leHRqc1J1bnRpbWUge1xuICBwcml2YXRlIHJlYWRvbmx5IGVudHJ5cG9pbnRzOiBFbnRyeXBvaW50UmVnaXN0cnk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGlzcGF0Y2hlcjogRGlzcGF0Y2hlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBtaWRkbGV3YXJlPzogTWlkZGxld2FyZVJ1bm5lcjtcbiAgcHJpdmF0ZSByZWFkb25seSBpbWFnZXM6IFJ1bnRpbWVJbWFnZU9wdGltaXplcjtcbiAgLyoqIFRoZSA1MDAgbGFkZGVyOyBzZWUgYHN0YXR1c1RhcmdldHNgLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGVycm9yVGFyZ2V0Rm9yOiAodXJsOiBVUkwgfCB1bmRlZmluZWQpID0+IFN0YXR1c1RhcmdldDtcbiAgLyoqIFRoZSBhc3NldHMgYnVja2V0LCB3aGVuIGBwdWJsaWMvYCBmaWxlcyBhcmUgc2VydmVkIGZyb20gaXQuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcHVibGljQnVja2V0Pzogc3RyaW5nO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IE5leHRqc1J1bnRpbWVPcHRpb25zKSB7XG4gICAgY29uc3QgeyBtYW5pZmVzdCwgZGVwbG95bWVudFJvb3QgfSA9IG9wdGlvbnM7XG4gICAgdGhpcy5lbnRyeXBvaW50cyA9IG5ldyBFbnRyeXBvaW50UmVnaXN0cnkoZGVwbG95bWVudFJvb3QsIG1hbmlmZXN0KTtcbiAgICAvLyBMaXN0ZWQgb25jZSwgYXQgY29sZCBzdGFydDsgc2VlIGByZXNvbHZlUHVibGljRmlsZXNgLlxuICAgIGNvbnN0IHB1YmxpY0ZpbGVzID0gcmVzb2x2ZVB1YmxpY0ZpbGVzKGRlcGxveW1lbnRSb290LCBtYW5pZmVzdCk7XG4gICAgdGhpcy5kaXNwYXRjaGVyID0gbmV3IERpc3BhdGNoZXIoe1xuICAgICAgbWFuaWZlc3QsXG4gICAgICBwdWJsaWNGaWxlczogcHVibGljRmlsZXMuZmlsZXMsXG4gICAgfSk7XG4gICAgLy8gT24gZGlzayBvdGhlcndpc2UsIHdpdGggYC5uZXh0L3N0YXRpY2AuXG4gICAgdGhpcy5wdWJsaWNCdWNrZXQgPSBwdWJsaWNGaWxlcy5pblMzID8gb3B0aW9ucy5idWNrZXQgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5lcnJvclRhcmdldEZvciA9IHN0YXR1c1RhcmdldHMobWFuaWZlc3QsIDUwMCk7XG4gICAgdGhpcy5pbWFnZXMgPSBuZXcgUnVudGltZUltYWdlT3B0aW1pemVyKHtcbiAgICAgIGRlcGxveW1lbnRSb290LFxuICAgICAgbWFuaWZlc3QsXG4gICAgICBidWNrZXQ6IHRoaXMucHVibGljQnVja2V0ID8/IFwiXCIsXG4gICAgICBidWNrZXRLZXlQcmVmaXg6IG9wdGlvbnMuYnVja2V0S2V5UHJlZml4ID8/IFwiXCIsXG4gICAgICBmZXRjaEludGVybmFsOiAoaHJlZiwgcmVxLCBtYXhpbXVtQm9keSkgPT5cbiAgICAgICAgdGhpcy5mZXRjaEludGVybmFsKGhyZWYsIHJlcSwgbWF4aW11bUJvZHkpLFxuICAgIH0pO1xuICAgIC8vIFRoZSBydW5uZXIgaXMgc2hhcmVkIOKAlCBpdCBtZW1vaXplcyB0aGUgbG9hZGVkIG1pZGRsZXdhcmUgbW9kdWxlIOKAlCB3aGlsZSB0aGVcbiAgICAvLyBgaW52b2tlTWlkZGxld2FyZWAgY2FsbGJhY2sgaXQgcHJvZHVjZXMgaXMgcGVyIHJlcXVlc3QuXG4gICAgdGhpcy5taWRkbGV3YXJlID0gbWFuaWZlc3QubWlkZGxld2FyZVxuICAgICAgPyBuZXcgTWlkZGxld2FyZVJ1bm5lcih7XG4gICAgICAgICAgbWlkZGxld2FyZTogbWFuaWZlc3QubWlkZGxld2FyZSxcbiAgICAgICAgICByb290OiBkZXBsb3ltZW50Um9vdCxcbiAgICAgICAgfSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGdldCBtYW5pZmVzdCgpOiBBZGFwdGVyTWFuaWZlc3Qge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubWFuaWZlc3Q7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaGFuZGxlKFxuICAgIHJlcXVlc3Q6IFJ1bnRpbWVSZXF1ZXN0LFxuICAgIHNpbms6IFJlc3BvbnNlU2luayxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBtYW5pZmVzdCB9ID0gdGhpcy5vcHRpb25zO1xuICAgIGNvbnN0IHBlbmRpbmc6IEFycmF5PFByb21pc2U8dW5rbm93bj4+ID0gW107XG4gICAgY29uc3Qgd2FpdFVudGlsID0gKHByb21pc2U6IFByb21pc2U8dW5rbm93bj4pID0+IHtcbiAgICAgIHBlbmRpbmcucHVzaChwcm9taXNlKTtcbiAgICB9O1xuXG4gICAgY29uc3QgYm9keSA9IHNwbGl0Qm9keShyZXF1ZXN0LmJvZHksIHRoaXMubWlkZGxld2FyZSAhPT0gdW5kZWZpbmVkKTtcbiAgICBjb25zdCByZXEgPSBuZXcgU2hpbUluY29taW5nTWVzc2FnZSh7XG4gICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgdXJsOiByZXF1ZXN0LnVybCxcbiAgICAgIGhlYWRlcnM6IHdpdGhvdXRJbnRlcm5hbEhlYWRlcnMoXG4gICAgICAgIHJlcXVlc3QuaGVhZGVycyxcbiAgICAgICAgcmVxdWVzdC51cmwsXG4gICAgICAgIG1hbmlmZXN0LmNvbmZpZy5iYXNlUGF0aCxcbiAgICAgICksXG4gICAgICBib2R5OiBib2R5LmZvclJlcXVlc3QsXG4gICAgICByZW1vdGVBZGRyZXNzOiByZXF1ZXN0LnJlbW90ZUFkZHJlc3MsXG4gICAgICBlbmNyeXB0ZWQ6IHJlcXVlc3QuZW5jcnlwdGVkLFxuICAgICAgdHJ1c3RGb3J3YXJkZWRIb3N0OiByZXF1ZXN0LnRydXN0Rm9yd2FyZGVkSG9zdCxcbiAgICB9KTtcbiAgICBjb25zdCByZXMgPSBuZXcgU2hpbVNlcnZlclJlc3BvbnNlKCk7XG4gICAgLy8gTmV4dC5qcyByZWFkcyBgcmVzLnJlcWAgaW4gYSBmZXcgZXJyb3IgcGF0aHMuXG4gICAgcmVzLnJlcSA9IHJlcTtcbiAgICByZXF1ZXN0LnNpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsICgpID0+IHJlcy5kZXN0cm95KCksIHtcbiAgICAgIG9uY2U6IHRydWUsXG4gICAgfSk7XG5cbiAgICAvLyBUaGUgcmVqZWN0aW9uIGhhbmRsZXIgaXMgYXR0YWNoZWQgaGVyZSByYXRoZXIgdGhhbiBhdCB0aGUgYGF3YWl0YCBiZWxvdy5cbiAgICAvLyBgcm91dGUoKWAgYXdhaXRzIHJlYWwgSS9PLCBzbyBhIHN0cmVhbSB0aGF0IGJyZWFrcyB3aGlsZSBpdCBydW5zIHdvdWxkXG4gICAgLy8gbGVhdmUgdGhpcyBwcm9taXNlIHJlamVjdGVkIHdpdGggbm8gaGFuZGxlciBhdHRhY2hlZCBmb3IgYSBmdWxsIGV2ZW50LWxvb3BcbiAgICAvLyB0dXJuIOKAlCBhbmQgTm9kZSAyNCBkZWZhdWx0cyB0byBgLS11bmhhbmRsZWQtcmVqZWN0aW9ucz10aHJvd2AsIHdoaWNoIG9uXG4gICAgLy8gdGhlIGNvbnRhaW5lciBzaGVsbCB0YWtlcyB0aGUgd2hvbGUgdGFzayBkb3duIGFuZCBhYm9ydHMgZXZlcnkgb3RoZXJcbiAgICAvLyBpbi1mbGlnaHQgcmVxdWVzdCBvbiBpdC4gQSBtaWQtc3RyZWFtIEVQSVBFIGZyb20gb25lIGNsaWVudCBkaXNjb25uZWN0IGlzXG4gICAgLy8gbm90IGdyb3VuZHMgZm9yIHRoYXQuXG4gICAgLy9cbiAgICAvLyBUaGUgZXJyb3IgaXMgbG9nZ2VkLCBub3QgcmV0aHJvd246IHRoZSBzdHJlYW0gYnJva2UgYWZ0ZXIgKG9yIHdoaWxlKSB0aGVcbiAgICAvLyBoZWFkIHdlbnQgb3V0IOKAlCBhIGNsaWVudCBkaXNjb25uZWN0LCBvciBgc2VuZEVycm9yYCBkZXN0cm95aW5nIGFcbiAgICAvLyBoYWxmLXdyaXR0ZW4gcmVzcG9uc2Ug4oCUIGFuZCBuZWl0aGVyIGlzIGFuIGludm9jYXRpb24gZmFpbHVyZS4gUmV0aHJvd2luZ1xuICAgIC8vIHdvdWxkIG1ha2UgTGFtYmRhIHJldHJ5IGEgcmVxdWVzdCB0aGUgY2xpZW50IGFscmVhZHkgYWJhbmRvbmVkLlxuICAgIGNvbnN0IGZpbmlzaGVkID0gcGlwZVRvU2luayhyZXEsIHJlcywgc2luaywge1xuICAgICAgY29tcHJlc3M6IG1hbmlmZXN0LmNvbmZpZy5jb21wcmVzcyxcbiAgICB9KS5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJUaGUgcmVzcG9uc2Ugc3RyZWFtIGRpZCBub3QgY29tcGxldGU6XCIsIGVycm9yKTtcbiAgICB9KTtcblxuICAgIC8vIEZvciB0aGUgZXJyb3IgcGFnZSdzIGxvY2FsZTsgdW5zZXQgd2hlbiB0aGUgdGhyb3cgaXMgYGFic29sdXRlVXJsYCdzLlxuICAgIGxldCB1cmw6IFVSTCB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgLy8gQmVmb3JlIGFueXRoaW5nIHBhcnNlcyB0aGUgdGFyZ2V0LCBpbmNsdWRpbmcgYGFic29sdXRlVXJsYCAtIGBuZXcgVVJMYFxuICAgICAgLy8gcmVhZHMgYSBsZWFkaW5nIGAvL2AgYXMgcHJvdG9jb2wtcmVsYXRpdmUgYW5kIHdvdWxkIHRha2UgdGhlIGZpcnN0IHBhdGhcbiAgICAgIC8vIHNlZ21lbnQgZm9yIHRoZSBob3N0LlxuICAgICAgY29uc3QgY29sbGFwc2VkID0gY29sbGFwc2VSZXBlYXRlZFNsYXNoZXMocmVxdWVzdC51cmwpO1xuICAgICAgaWYgKGNvbGxhcHNlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHNlbmRSZWRpcmVjdChyZXMsIGNvbGxhcHNlZCwgMzA4KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEluc2lkZSB0aGUgdHJ5OiBgYWJzb2x1dGVVcmxgIGJ1aWxkcyBhIGBVUkxgIG91dCBvZiB0aGUgcmVxdWVzdCBsaW5lXG4gICAgICAgIC8vIGFuZCB0aGUgZm9yd2FyZGVkIGhlYWRlcnMsIGFuZCBhIHRocm93IGhlcmUgaGFzIHRvIHJlYWNoIHRoZSBlcnJvclxuICAgICAgICAvLyBsYWRkZXIgbGlrZSBhbnkgb3RoZXIuIE91dHNpZGUgaXQsIG9uIHRoZSBMYW1iZGEgc2hlbGxzIOKAlCB3aG9zZVxuICAgICAgICAvLyBoYW5kbGVycyB3cmFwIG5vdGhpbmcg4oCUIHRoZSBzYW1lIHRocm93IGlzIGFuIGludm9jYXRpb24gZXJyb3IgYW5kIGFcbiAgICAgICAgLy8gNTAyLlxuICAgICAgICB1cmwgPSBhYnNvbHV0ZVVybChyZXF1ZXN0KTtcbiAgICAgICAgYXdhaXQgdGhpcy5yb3V0ZShyZXEsIHJlcywgdXJsLCBib2R5LCB3YWl0VW50aWwsIHJlcXVlc3QpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCB0aGlzLnNlbmRFcnJvcihyZXEsIHJlcywgd2FpdFVudGlsLCBlcnJvciwgdXJsKTtcbiAgICB9XG5cbiAgICBhd2FpdCBmaW5pc2hlZDtcblxuICAgIC8vIExhbWJkYSBmcmVlemVzIHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnQgdGhlIG1vbWVudCB0aGUgaGFuZGxlciByZXNvbHZlcyDigJRcbiAgICAvLyB0aGVyZSBpcyBubyBwb3N0LXJlc3BvbnNlIGtlZXBhbGl2ZSDigJQgc28gYmFja2dyb3VuZCB3b3JrIHJlZ2lzdGVyZWQgd2l0aFxuICAgIC8vIGB3YWl0VW50aWxgIChub3RhYmx5IElTUiByZXZhbGlkYXRpb24pIGhhcyB0byBiZSBhd2FpdGVkIGhlcmUuIEFmdGVyIHRoZVxuICAgIC8vIHJlc3BvbnNlIHN0cmVhbSBoYXMgY2xvc2VkLCBzbyBjbGllbnQgbGF0ZW5jeSBpcyB1bmFmZmVjdGVkOyBiaWxsZWRcbiAgICAvLyBkdXJhdGlvbiBleHRlbmRzLCB3aGljaCBpcyB0aGUgY29ycmVjdCB0cmFkZSBhZ2FpbnN0IGEgcmV2YWxpZGF0aW9uIHRoYXRcbiAgICAvLyBuZXZlciBjb21wbGV0ZXMuXG4gICAgLy9cbiAgICAvLyBEcmFpbmVkIHVudGlsIG5vdGhpbmcgbmV3IGFycml2ZXMsIG5vdCBhd2FpdGVkIG9uY2U6IGB3YWl0VW50aWxgIGtlZXBzXG4gICAgLy8gYmVpbmcgY2FsbGVkIGFmdGVyIHRoZSByZXNwb25zZSDigJQgTmV4dCdzIGBBZnRlckNvbnRleHRgIHJlZ2lzdGVycyBpdHNcbiAgICAvLyBjYWxsYmFjayBxdWV1ZSBvbiB0aGUgZmlyc3QgYGFmdGVyKClgLCBhbmQgYW4gYGFmdGVyKHByb21pc2UpYCBtYWRlIGZyb21cbiAgICAvLyBpbnNpZGUgYSBydW5uaW5nIGNhbGxiYWNrLCBvciBhIGJhY2tncm91bmQgcmVnZW5lcmF0aW9uIHRoYXQgaXRzZWxmIGNhbGxzXG4gICAgLy8gYGFmdGVyKClgLCByZWdpc3RlcnMgbW9yZS4gQSBzaW5nbGUgYGFsbFNldHRsZWRgIHNuYXBzaG90cyB0aGUgYXJyYXkgYW5kXG4gICAgLy8gbGV0cyBMYW1iZGEgZnJlZXplIG9uIHRoYXQgbGF0ZSB3b3JrLlxuICAgIGxldCBzZXR0bGVkQ291bnQgPSAwO1xuICAgIHdoaWxlIChzZXR0bGVkQ291bnQgPCBwZW5kaW5nLmxlbmd0aCkge1xuICAgICAgY29uc3QgYmF0Y2ggPSBwZW5kaW5nLnNsaWNlKHNldHRsZWRDb3VudCk7XG4gICAgICBzZXR0bGVkQ291bnQgPSBwZW5kaW5nLmxlbmd0aDtcbiAgICAgIGNvbnN0IHNldHRsZWQgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoYmF0Y2gpO1xuICAgICAgZm9yIChjb25zdCByZXN1bHQgb2Ygc2V0dGxlZCkge1xuICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJyZWplY3RlZFwiKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkEgd2FpdFVudGlsKCkgcHJvbWlzZSByZWplY3RlZDpcIiwgcmVzdWx0LnJlYXNvbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJvdXRlKFxuICAgIHJlcTogU2hpbUluY29taW5nTWVzc2FnZSxcbiAgICByZXM6IFNoaW1TZXJ2ZXJSZXNwb25zZSxcbiAgICB1cmw6IFVSTCxcbiAgICBib2R5OiBTcGxpdEJvZHksXG4gICAgd2FpdFVudGlsOiAocHJvbWlzZTogUHJvbWlzZTx1bmtub3duPikgPT4gdm9pZCxcbiAgICByZXF1ZXN0OiBSdW50aW1lUmVxdWVzdCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5kaXNwYXRjaGVyLmRpc3BhdGNoKHtcbiAgICAgIG1ldGhvZDogcmVxLm1ldGhvZCA/PyBcIkdFVFwiLFxuICAgICAgdXJsLFxuICAgICAgaGVhZGVyczogbmV3IEhlYWRlcnModG9XZWJIZWFkZXJzKHJlcS5oZWFkZXJzKSksXG4gICAgICBib2R5OiBib2R5LmZvckRpc3BhdGNoLFxuICAgICAgaW52b2tlTWlkZGxld2FyZTogdGhpcy5taWRkbGV3YXJlPy5pbnZva2VyRm9yKHtcbiAgICAgICAgd2FpdFVudGlsLFxuICAgICAgICBzaWduYWw6IHJlcXVlc3Quc2lnbmFsLFxuICAgICAgfSksXG4gICAgfSk7XG4gICAgYm9keS5yZWxlYXNlVW5yZWFkKHJlc3VsdC5raW5kID09PSBcIm1pZGRsZXdhcmUtcmVzcG9uZGVkXCIpO1xuXG4gICAgYXBwbHlIZWFkZXJzKHJlcywgcmVzdWx0LnJlc3BvbnNlSGVhZGVycyk7XG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzLnN0YXR1c0NvZGUgPSByZXN1bHQuc3RhdHVzO1xuICAgIH1cblxuICAgIHN3aXRjaCAocmVzdWx0LmtpbmQpIHtcbiAgICAgIGNhc2UgXCJlbnRyeXBvaW50XCI6IHtcbiAgICAgICAgbGV0IGhhbmRsZXI6IEVudHJ5cG9pbnRIYW5kbGVyO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGhhbmRsZXIgPSBhd2FpdCB0aGlzLmVudHJ5cG9pbnRzLmxvYWQocmVzdWx0LmVudHJ5cG9pbnQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGlmICghKGVycm9yIGluc3RhbmNlb2YgUm91dGVJbk90aGVyR3JvdXBFcnJvcikpIHRocm93IGVycm9yO1xuICAgICAgICAgIC8vIEEgVVJMIHRoZSBlZGdlIHNlbnQgaGVyZSBvbmx5IGJlY2F1c2Ugb2YgaXRzIGNhc2UgZ29lcyB0byBpdHNcbiAgICAgICAgICAvLyBjYW5vbmljYWwgc3BlbGxpbmcsIHdoaWNoIHRoZSBlZGdlIHJvdXRlcyB0byB0aGUgb3duaW5nIGdyb3VwLlxuICAgICAgICAgIGNvbnN0IGNhbm9uaWNhbCA9IGNhc2VDYW5vbmljYWxQYXRoKFxuICAgICAgICAgICAgdXJsLnBhdGhuYW1lLFxuICAgICAgICAgICAgcmVzdWx0LnJlc29sdmVkUGF0aG5hbWUsXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMubWFuaWZlc3QsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoY2Fub25pY2FsKSB7XG4gICAgICAgICAgICBzZW5kUmVkaXJlY3QocmVzLCBgJHtjYW5vbmljYWx9JHt1cmwuc2VhcmNofWAsIDMwOCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZXF1ZXN0Lm9uUm91dGVJbk90aGVyR3JvdXApIHtcbiAgICAgICAgICAgIC8vIEV4cGxhaW5lZCBieSB0aGUgY2FsbGVyIG9mIGBoYW5kbGVJbnRlcm5hbGx5YCwgd2hpY2gga25vd3Mgd2h5IGl0XG4gICAgICAgICAgICAvLyBoYXBwZW5lZC5cbiAgICAgICAgICAgIHJlcXVlc3Qub25Sb3V0ZUluT3RoZXJHcm91cChlcnJvcik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIExvZ2dlZCwgYmVjYXVzZSBpdCBpcyBhbHNvIHdoYXQgYSBtaXNyb3V0ZWQgZ3JvdXAgbG9va3MgbGlrZTsgc2VlXG4gICAgICAgICAgICAvLyBgUm91dGVJbk90aGVyR3JvdXBFcnJvcmAgZm9yIHdoeSBpdCBpcyBhIDQwNC5cbiAgICAgICAgICAgIGNvbnNvbGUud2FybihlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgdGhpcy5zZW5kVW5tYXRjaGVkKFxuICAgICAgICAgICAgcmVxLFxuICAgICAgICAgICAgcmVzLFxuICAgICAgICAgICAgd2FpdFVudGlsLFxuICAgICAgICAgICAgeyBwYXRobmFtZTogdXJsLnBhdGhuYW1lLCByZXF1ZXN0SGVhZGVyczogcmVzdWx0LnJlcXVlc3RIZWFkZXJzIH0sXG4gICAgICAgICAgICB1cmwsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIGludm9jYXRpb24gdGFyZ2V0LCBub3QgdGhlIHJlcXVlc3RlZCBVUkw6IGByZXNvbHZlUm91dGVzYCBoYXNcbiAgICAgICAgLy8gYXBwbGllZCByZXdyaXRlcywgc3RyaXBwZWQgaTE4biBwcmVmaXhlcywgYW5kIGFwcGVuZGVkIHRoZSBgbnh0UGBcbiAgICAgICAgLy8gcm91dGUgcGFyYW1zIGFzIHF1ZXJ5IHZhbHVlcy4gVGhhdCBpcyBleGFjdGx5IHRoZSBjb250cmFjdCBOZXh0LmpzXG4gICAgICAgIC8vIGRvY3VtZW50cyBmb3IgYSBwcm94eSBpbiBmcm9udCBvZiBhIGZ1bmN0aW9uIOKAlCBgUm91dGVNb2R1bGUucHJlcGFyZWBcbiAgICAgICAgLy8gcmVjb3ZlcnMgYHBhcmFtc2AgZnJvbSB0aGVzZSBxdWVyeSB2YWx1ZXMg4oCUIHNvIHRoYXQgY29udHJhY3QsIG5vdFxuICAgICAgICAvLyBgcmVxdWVzdE1ldGEucGFyYW1zYCwgaXMgaG93IHBhcmFtcyBnZXQgcGFzc2VkLiBUaGUgb25lIGV4Y2VwdGlvbiBpc1xuICAgICAgICAvLyBhIGNhcHR1cmUgdGhlIGNvbnRyYWN0IHdvdWxkIGNvcnJ1cHQ7IHNlZSBgb3V0T2ZCYW5kUm91dGVQYXJhbXNgLlxuICAgICAgICBjb25zdCBvdXRPZkJhbmQgPSBvdXRPZkJhbmRSb3V0ZVBhcmFtcyhcbiAgICAgICAgICByZXN1bHQuaW52b2NhdGlvblRhcmdldC5xdWVyeSxcbiAgICAgICAgICByZXN1bHQucmVzb2x2ZWRQYXRobmFtZSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgaW52b2NhdGlvblF1ZXJ5ID1cbiAgICAgICAgICBvdXRPZkJhbmQ/LnF1ZXJ5ID8/IHJlc3VsdC5pbnZvY2F0aW9uVGFyZ2V0LnF1ZXJ5O1xuICAgICAgICBjb25zdCB7IHBhdGhuYW1lIH0gPSByZXN1bHQuaW52b2NhdGlvblRhcmdldDtcbiAgICAgICAgY29uc3Qgc2VhcmNoID0gdG9TZWFyY2goaW52b2NhdGlvblF1ZXJ5KTtcbiAgICAgICAgcmVxLnVybCA9IHNlYXJjaCA/IGAke3BhdGhuYW1lfT8ke3NlYXJjaH1gIDogcGF0aG5hbWU7XG4gICAgICAgIC8vIE1pZGRsZXdhcmUgbWF5IGhhdmUgcmV3cml0dGVuIHJlcXVlc3QgaGVhZGVycyB2aWFcbiAgICAgICAgLy8gYE5leHRSZXNwb25zZS5uZXh0KHsgcmVxdWVzdDogeyBoZWFkZXJzIH0gfSlgLlxuICAgICAgICByZXEuaGVhZGVycyA9IHRvSW5jb21pbmdIdHRwSGVhZGVycyhyZXN1bHQucmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICBjb25zdCBvcHRpb25zOiBQYXJhbWV0ZXJzPHR5cGVvZiBoYW5kbGVyPlsyXSA9IHtcbiAgICAgICAgICB3YWl0VW50aWwsXG4gICAgICAgICAgcmVxdWVzdE1ldGE6IHtcbiAgICAgICAgICAgIC8vIFRoZSByZXNvbHZlZCBxdWVyeSwgc3RhdGVkIHJhdGhlciB0aGFuIGxlZnQgdG8gYmUgcmUtZGVyaXZlZC5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBgUm91dGVNb2R1bGUucHJlcGFyZWAgcnVucyBgaGFuZGxlUmV3cml0ZXNgIGFnYWluc3QgYHJlcS51cmxgXG4gICAgICAgICAgICAvLyB1bmNvbmRpdGlvbmFsbHksIGFuZCBgcmVxLnVybGAgaXMgdGhlICphbHJlYWR5IHJld3JpdHRlbiogdGFyZ2V0LlxuICAgICAgICAgICAgLy8gQSBgYmVmb3JlRmlsZXNgIHJld3JpdGUgd2hvc2UgY29uZGl0aW9uIHN0aWxsIGhvbGRzIGFmdGVyIGl0IGhhc1xuICAgICAgICAgICAgLy8gYmVlbiBhcHBsaWVkIHRoZXJlZm9yZSBnZXRzIGFwcGxpZWQgdHdpY2U6IGluXG4gICAgICAgICAgICAvLyBgdGVzdC9lMmUvbGluay13aXRoLWFwaS1yZXdyaXRlYCB0aGUgcnVsZVxuICAgICAgICAgICAgLy8gYC86cGF0aCguKilgICsgYGhhczogcXVlcnkganNvbj10cnVlYCAtPiBgL2FwaS9qc29uP2Zyb209LzpwYXRoYFxuICAgICAgICAgICAgLy8gbWF0Y2hlZCBgL2FwaS9qc29uP2pzb249dHJ1ZSZmcm9tPS9zb21lL3JvdXRlL2ZvcmAgYSBzZWNvbmQgdGltZVxuICAgICAgICAgICAgLy8gYW5kIG92ZXJ3cm90ZSBgZnJvbWAgd2l0aCBgL2FwaS9qc29uYC4gYG5leHQgc3RhcnRgIGVzY2FwZXMgaXRcbiAgICAgICAgICAgIC8vIGJlY2F1c2UgaXRzIHJvdXRlciBsZWF2ZXMgYHJlcS51cmxgIGFzIHRoZSBVUkwgdGhlIGNsaWVudCBzZW50LCBzb1xuICAgICAgICAgICAgLy8gdGhlIG9uZSBwYXNzIGBwcmVwYXJlYCBtYWtlcyBpcyB0aGUgb25seSBvbmUuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gYHByZXBhcmVgIHByZWZlcnMgdGhpcyBtZXRhIG92ZXIgaXRzIG93biBgcGFyc2VkVXJsLnF1ZXJ5YFxuICAgICAgICAgICAgLy8gKFwid2hlbiBkZXBsb3llZCBwcm94aWVzIHdpbGwgYWRkIHF1ZXJ5IHZhbHVlcyBmcm9tIHJlc29sdmluZyB0aGVcbiAgICAgICAgICAgIC8vIHJvdXRlcyB0byBwYXNzIHRvIGZ1bmN0aW9uXCIpLCB3aGljaCBpcyB0aGUgZG9jdW1lbnRlZCBkaXZpc2lvbiBvZlxuICAgICAgICAgICAgLy8gbGFib3VyIGZvciBhIHByb3h5IGluIGZyb250IG9mIGEgZnVuY3Rpb24gLSBhbmQgaXQgaXMgdGhlIHNhbWVcbiAgICAgICAgICAgIC8vIGRpdmlzaW9uIHRoZSBgcmVxLnVybGAgYWJvdmUgcmVsaWVzIG9uLiBTZXR0aW5nIGl0IGRvZXMgbm90IHN0b3BcbiAgICAgICAgICAgIC8vIHRoZSBzZWNvbmQgcmV3cml0ZSBwYXNzLCBpdCBqdXN0IHN0b3BzIHRoYXQgcGFzcyBmcm9tIGJlaW5nIHdoYXRcbiAgICAgICAgICAgIC8vIHRoZSByb3V0ZSBzZWVzLlxuICAgICAgICAgICAgcXVlcnk6IHsgLi4uaW52b2NhdGlvblF1ZXJ5IH0sXG4gICAgICAgICAgICAvLyBTZXQgb25seSBmb3IgYSBjYXB0dXJlIHRoZSBxdWVyeSBjb250cmFjdCBjYW5ub3QgY2FycnksIGFuZCB0aGVuXG4gICAgICAgICAgICAvLyBpbiBwbGFjZSBvZiBpdCByYXRoZXIgdGhhbiBhbG9uZ3NpZGUuXG4gICAgICAgICAgICAuLi4ob3V0T2ZCYW5kID8geyBwYXJhbXM6IG91dE9mQmFuZC5wYXJhbXMgfSA6IHt9KSxcbiAgICAgICAgICAgIC8vIFdpdGhvdXQgdGhpcywgYFJvdXRlTW9kdWxlLnByZXBhcmVgIGZhbGxzIGJhY2sgdG9cbiAgICAgICAgICAgIC8vIGBodHRwOi8vbG9jYWxob3N0JHtyZXEudXJsfWAgYW5kIGV2ZXJ5IGFic29sdXRlIFVSTCBhIHJvdXRlXG4gICAgICAgICAgICAvLyBoYW5kbGVyIGJ1aWxkcyBpcyB3cm9uZy4gYHJlbGF0aXZlUHJvamVjdERpcmAgaXMgZGVsaWJlcmF0ZWx5XG4gICAgICAgICAgICAvLyAqbm90KiBwYXNzZWQ6IHRoZSBydW50aW1lIGBjaGRpcmBzIHRvIHRoZSBwcm9qZWN0IGRpciwgc28gdGhlXG4gICAgICAgICAgICAvLyB2YWx1ZSBOZXh0LmpzIGlubGluZWQgYXQgYnVpbGQgdGltZSAoXCJcIikgaXMgYWxyZWFkeSBjb3JyZWN0LCBhbmRcbiAgICAgICAgICAgIC8vIGBhcHAtcGFnZS1ydW50aW1lLmpzYCBpZ25vcmVzIHRoZSByZXF1ZXN0TWV0YSBvdmVycmlkZSBhbnl3YXkuXG4gICAgICAgICAgICBpbml0VVJMOiB1cmwuaHJlZixcbiAgICAgICAgICAgIC8vIEZlZWRzIGByb3V0ZXJTZXJ2ZXJDb250ZXh0Lmhvc3RuYW1lYCAoYHJvdXRlLW1vZHVsZS5qc2BcbiAgICAgICAgICAgIC8vIGBnZXRSb3V0ZXJTZXJ2ZXJDb250ZXh0YCkuIEluY2x1ZGVzIHRoZSBwb3J0LCBiZWNhdXNlIGl0IGlzXG4gICAgICAgICAgICAvLyBjb25jYXRlbmF0ZWQgaW50byBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgaG9zdG5hbWU6IHVybC5ob3N0LFxuICAgICAgICAgICAgLy8gQm90aCByb3V0ZXJzIGNhbGwgdGhpcyBmb3IgYSBgbm90Rm91bmQ6IHRydWVgIC8gYG5vdEZvdW5kKClgIHRoYXRcbiAgICAgICAgICAgIC8vIHRoZSBlbnRyeXBvaW50IGl0c2VsZiBjYW5ub3QgcmVuZGVyLCBhbmQgZmFsbCBiYWNrIHRvXG4gICAgICAgICAgICAvLyBgcmVzLmVuZCgnVGhpcyBwYWdlIGNvdWxkIG5vdCBiZSBmb3VuZCcpYCDigJQgbm8gc3RhdHVzLCBubyBhcHAgNDA0XG4gICAgICAgICAgICAvLyBwYWdlIOKAlCB3aGVuIGl0IGlzIGFic2VudC4gVGhlIGByZXFgL2ByZXNgIHRoZXkgcGFzcyBhcmUgdGhlIG9uZXNcbiAgICAgICAgICAgIC8vIGhhbmRlZCBpbiBqdXN0IGFib3ZlLCBzbyB0aGUgY2FwdHVyZWQgcGFpciBpcyB1c2VkIGluc3RlYWQgb2ZcbiAgICAgICAgICAgIC8vIHJlLWRlcml2aW5nIHRoZW0uXG4gICAgICAgICAgICByZW5kZXI0MDQ6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZW5kTm90Rm91bmQoXG4gICAgICAgICAgICAgICAgcmVxLFxuICAgICAgICAgICAgICAgIHJlcyxcbiAgICAgICAgICAgICAgICB3YWl0VW50aWwsXG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaGVyLm5vdEZvdW5kRm9yKHVybCksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gYHJlcy5yZXZhbGlkYXRlKClgIGZyb20gYSBQYWdlcyBBUEkgcm91dGUuIFdpdGhvdXQgaXQsIE5leHQuanNcbiAgICAgICAgICAgIC8vIGZhbGxzIGJhY2sgdG8gYGZldGNoKCdodHRwczovLycgKyByZXEuaGVhZGVycy5ob3N0ICsgdXJsUGF0aClgIOKAlFxuICAgICAgICAgICAgLy8gYW5kIG9ubHkgd2hlbiBgZXhwZXJpbWVudGFsLnRydXN0SG9zdEhlYWRlcmAgaXMgc2V0LCB3aGljaCBpdCBpc1xuICAgICAgICAgICAgLy8gbm90LCBzbyBgcmVzLnJldmFsaWRhdGUoKWAgdGhyZXdcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyAgIEZhaWxlZCB0byByZXZhbGlkYXRlIC86IEludmFyaWFudDogbWlzc2luZyBpbnRlcm5hbFxuICAgICAgICAgICAgLy8gICByb3V0ZXItc2VydmVyLW1ldGhvZHMgdGhpcyBpcyBhbiBpbnRlcm5hbCBidWdcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBhbmQgYHRlc3QvZTJlL3JldmFsaWRhdGUtcmVhc29uYCBzYXcgYHN0YWxlYCB3aGVyZSBgbmV4dCBzdGFydGBcbiAgICAgICAgICAgIC8vIHJlcG9ydHMgYG9uLWRlbWFuZGA6IHRoZSByb3V0ZSBzdGlsbCByZS1yZW5kZXJlZCwganVzdCBhcyBhblxuICAgICAgICAgICAgLy8gb3JkaW5hcnkgc3RhbGUgcmVnZW5lcmF0aW9uIHJhdGhlciB0aGFuIHRoZSBvbi1kZW1hbmQgb25lIGl0XG4gICAgICAgICAgICAvLyBhc2tlZCBmb3IuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gQW5zd2VyaW5nIGl0IGluIHByb2Nlc3MgcmF0aGVyIHRoYW4gYnkgc2V0dGluZ1xuICAgICAgICAgICAgLy8gYHRydXN0SG9zdEhlYWRlcmA6IHRoZSBmZXRjaCBwYXRoIHdvdWxkIGxlYXZlIHRoZSBmdW5jdGlvbiwgY3Jvc3NcbiAgICAgICAgICAgIC8vIENsb3VkRnJvbnQgYW5kIGNvbWUgYmFjayDigJQgYSBzZWNvbmQgYmlsbGVkIGludm9jYXRpb24sIGFcbiAgICAgICAgICAgIC8vIGRlcGVuZGVuY3kgb24gYHgtcHJlcmVuZGVyLXJldmFsaWRhdGVgIHN1cnZpdmluZyB0aGUgZWRnZSwgYW5kIGFcbiAgICAgICAgICAgIC8vIHJlYXNvbiB0byB0cnVzdCBhIGNsaWVudC1zdXBwbGllZCBgSG9zdGAuIE5leHQuanMncyBvd25cbiAgICAgICAgICAgIC8vIG5vbi1zZXJ2ZXJsZXNzIGFuc3dlciBpcyB0aGUgc2FtZSBzaGFwZSBhcyB0aGlzIG9uZVxuICAgICAgICAgICAgLy8gKGBOZXh0U2VydmVyI3JldmFsaWRhdGVgIHJ1bnMgaXRzIHJlcXVlc3QgaGFuZGxlciBhZ2FpbnN0IGFcbiAgICAgICAgICAgIC8vIG1vY2tlZCBgcmVxYC9gcmVzYCkuXG4gICAgICAgICAgICByZXZhbGlkYXRlOiAoY29uZmlnOiBSZXZhbGlkYXRlQ29uZmlnKSA9PlxuICAgICAgICAgICAgICB0aGlzLnJldmFsaWRhdGUoY29uZmlnLCByZXF1ZXN0KSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZW5kZXIgPSAoKSA9PiBoYW5kbGVyKHJlcSwgYXNTZXJ2ZXJSZXNwb25zZShyZXMpLCBvcHRpb25zKTtcbiAgICAgICAgLy8gQ2F1Z2h0IHVwIGhlcmUsIG5vdCBpbiBgcmVmcmVzaFRhZ3NgOiBOZXh0LmpzIGF3YWl0cyB0aGF0IGluc2lkZSB0aGVcbiAgICAgICAgLy8gZmlyc3QgYCd1c2UgY2FjaGUnYCBsb29rdXAsIGFuZCBhIHdhaXQgdGhlcmUgY3V0cyB0aGUgc3RhdGljIHN0YWdlXG4gICAgICAgIC8vIHNob3J0LiBPbmx5IGZvciBhIHBhZ2U6IG5vdGhpbmcgZWxzZSBoYXMgYSBzdGF0aWMgc3RhZ2UgdG8gcHJvdGVjdCxcbiAgICAgICAgLy8gYW5kIGEgcm91dGUgaGFuZGxlciB0aGF0IHJlYWRzIHRoZSBjYWNoZSB3YWl0cyBpbiBgcmVmcmVzaFRhZ3NgXG4gICAgICAgIC8vIGluc3RlYWQuXG4gICAgICAgIGF3YWl0IChyZXN1bHQuZW50cnlwb2ludC50eXBlID09PSBcImFwcC1wYWdlXCJcbiAgICAgICAgICA/IGNhdGNoVXBUYWdzKHJlbmRlcilcbiAgICAgICAgICA6IHJlbmRlcigpKTtcbiAgICAgICAgLy8gQSBQYWdlcyBBUEkgcm91dGUgb3ducyB0aGUgZW5kIG9mIGl0cyByZXNwb25zZTogYHN0cmVhbS5waXBlKHJlcylgLFxuICAgICAgICAvLyBhbiBgZXh0ZXJuYWxSZXNvbHZlcmAgcHJveHksIG9yIGEgY2FsbGJhY2sgdGhhdCBjYWxscyBgcmVzLmpzb24oKWBcbiAgICAgICAgLy8gbGF0ZXIgYWxsIHJldHVybiBmcm9tIHRoZSBoYW5kbGVyIGJlZm9yZSB0aGV5IGFyZSBkb25lIHdyaXRpbmcsIGFuZFxuICAgICAgICAvLyBlbmRpbmcgaGVyZSBzZW50IGFuIGVtcHR5IDIwMCBhbmQgbWFkZSB0aGVpciB3cml0ZXMgdGhyb3dcbiAgICAgICAgLy8gYEVSUl9TVFJFQU1fV1JJVEVfQUZURVJfRU5EYC4gYG5leHQgc3RhcnRgJ3MgYGFwaVJlc29sdmVyYCBsZWF2ZXMgaXRcbiAgICAgICAgLy8gb3BlbiB0b28g4oCUIG9uZSB0aGF0IG5ldmVyIGVuZHMgc3RhbGxzLCB0aGVyZSBhcyBoZXJlLiBgaGFuZGxlYCBhd2FpdHNcbiAgICAgICAgLy8gdGhlIHJlc3BvbnNlIGl0c2VsZiwgc28gbm90aGluZyBpcyBjdXQgc2hvcnQgYnkgcmV0dXJuaW5nLlxuICAgICAgICBpZiAoIXJlcy53cml0YWJsZUVuZGVkICYmIHJlc3VsdC5lbnRyeXBvaW50LnR5cGUgIT09IFwicGFnZS1hcGlcIikge1xuICAgICAgICAgIHJlcy5lbmQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNhc2UgXCJzdGF0aWMtZmlsZVwiOiB7XG4gICAgICAgIGNvbnN0IHN0YXR1c1BhZ2UgPVxuICAgICAgICAgIHJlc3VsdC5zb3VyY2UgPT09IFwic2VydmVyXCJcbiAgICAgICAgICAgID8gdGhpcy5zdGF0dXNQYWdlU3RhdHVzKHJlc3VsdC5wYXRobmFtZSlcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICAvLyBgbmV4dCBzdGFydGAgc2VydmVzIGEgYHB1YmxpYy9gIG9yIGBfbmV4dC9zdGF0aWNgIGZpbGUgdG8gR0VUIGFuZFxuICAgICAgICAvLyBIRUFEIG9ubHksIGFuZCBgc2VuZGAgd291bGQgc2VydmUgaXQgdG8gYW55IG1ldGhvZC4gVGhlIHNhbWUgZ29lcyBmb3JcbiAgICAgICAgLy8gYW4gYXV0by1leHBvcnRlZCBQYWdlcyBSb3V0ZXIgcGFnZSAoYGJhc2Utc2VydmVyLmpzYFxuICAgICAgICAvLyBgcmVuZGVyVG9SZXNwb25zZVdpdGhDb21wb25lbnRzSW1wbGA6IGEgc3RyaW5nIGBDb21wb25lbnRgIGFuc3dlcnNcbiAgICAgICAgLy8gYW55dGhpbmcgZWxzZSB3aXRoIGEgNDA1KSwgZXhjZXB0IHRoZSA0MDQgYW5kIDUwMCBwYWdlcy5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHJlcS5tZXRob2QgIT09IFwiR0VUXCIgJiZcbiAgICAgICAgICByZXEubWV0aG9kICE9PSBcIkhFQURcIiAmJlxuICAgICAgICAgIChyZXN1bHQuc291cmNlICE9PSBcInNlcnZlclwiIHx8XG4gICAgICAgICAgICAoc3RhdHVzUGFnZSA9PT0gdW5kZWZpbmVkICYmIHJlc3VsdC5maWxlUGF0aC5lbmRzV2l0aChcIi5odG1sXCIpKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgc2VuZE1ldGhvZE5vdEFsbG93ZWQocmVzKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gXCJlbnN1cmUgY29ycmVjdCBzdGF0dXMgaXMgc2V0IHdoZW4gdmlzaXRpbmcgYSBzdGF0dXMgcGFnZSBkaXJlY3RseVwiOlxuICAgICAgICAvLyBgbmV4dCBzdGFydGAgYW5zd2VycyBgLzQwNGAgd2l0aCBhIDQwNCBhbmQgYC81MDBgIHdpdGggYSA1MDAsIG5vdCB0aGVcbiAgICAgICAgLy8gMjAwIHRoZWlyIHByZXJlbmRlcmVkIEhUTUwgd291bGQgb3RoZXJ3aXNlIGdvIG91dCB3aXRoLlxuICAgICAgICBpZiAoc3RhdHVzUGFnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVzLnN0YXR1c0NvZGUgPSBzdGF0dXNQYWdlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV0YWcgPSB0aGlzLm9wdGlvbnMubWFuaWZlc3QuY29uZmlnLmdlbmVyYXRlRXRhZ3M7XG4gICAgICAgIGNvbnN0IHB1YmxpY0RpciA9IGAke3B1YmxpY0RpcktleSh0aGlzLm9wdGlvbnMubWFuaWZlc3QpfS9gO1xuICAgICAgICBjb25zdCBzZXJ2ZWQgPVxuICAgICAgICAgIChhd2FpdCBzZXJ2ZVN0YXRpY0ZpbGUoXG4gICAgICAgICAgICByZXEsXG4gICAgICAgICAgICByZXMsXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuZGVwbG95bWVudFJvb3QsXG4gICAgICAgICAgICByZXN1bHQuZmlsZVBhdGgsXG4gICAgICAgICAgICB7IGV0YWcgfSxcbiAgICAgICAgICApKSB8fFxuICAgICAgICAgIC8vIExpc3RlZCBidXQgbm90IHN0YWdlZDogYSBMYW1iZGEgcm9vdCwgd2hvc2UgYHB1YmxpYy9gIGlzIGluIFMzLlxuICAgICAgICAgIChyZXN1bHQuc291cmNlID09PSBcInB1YmxpY1wiICYmXG4gICAgICAgICAgICAhIXRoaXMucHVibGljQnVja2V0ICYmXG4gICAgICAgICAgICAoYXdhaXQgc2VydmVTM1B1YmxpY0ZpbGUocmVxLCByZXMsIHtcbiAgICAgICAgICAgICAgYnVja2V0OiB0aGlzLnB1YmxpY0J1Y2tldCxcbiAgICAgICAgICAgICAga2V5UHJlZml4OiB0aGlzLm9wdGlvbnMuYnVja2V0S2V5UHJlZml4ID8/IFwiXCIsXG4gICAgICAgICAgICAgIGZpbGU6IHJlc3VsdC5maWxlUGF0aC5zbGljZShwdWJsaWNEaXIubGVuZ3RoKSxcbiAgICAgICAgICAgICAgZXRhZyxcbiAgICAgICAgICAgIH0pKSk7XG4gICAgICAgIGlmICghc2VydmVkKSB7XG4gICAgICAgICAgLy8gVGhlIHJvdXRpbmcgcnVsZSB0aGF0IG1hdGNoZWQgYSBidWlsZCBhc3NldCBhbHJlYWR5IHNldCBpdHNcbiAgICAgICAgICAvLyB5ZWFyLWxvbmcgYGltbXV0YWJsZWAgQ2FjaGUtQ29udHJvbCwgd2hpY2ggYHNlbmRVbm1hdGNoZWRgXG4gICAgICAgICAgLy8gcmVwbGFjZXM6IHVuZGVyIGl0IHRoZSA0MDQgd291bGQgYmUgY2FjaGVkIGF0IHRoZSBlZGdlIGFuZCBpblxuICAgICAgICAgIC8vIGJyb3dzZXJzIGZvciB0aGF0IGxvbmcsIGFuZCBhIGNodW5rIHRoYXQgc2hvd3MgdXAgb24gdGhlIG5leHRcbiAgICAgICAgICAvLyBkZXBsb3kgd291bGQgc3RheSBtaXNzaW5nLlxuICAgICAgICAgIGF3YWl0IHRoaXMuc2VuZFVubWF0Y2hlZChyZXEsIHJlcywgd2FpdFVudGlsLCByZXN1bHQsIHVybCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFwiaW1hZ2Utb3B0aW1pemF0aW9uXCI6XG4gICAgICAgIGlmICghdGhpcy5pbWFnZXMuaXNFbmFibGVkKCkpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnNlbmRVbm1hdGNoZWQoXG4gICAgICAgICAgICByZXEsXG4gICAgICAgICAgICByZXMsXG4gICAgICAgICAgICB3YWl0VW50aWwsXG4gICAgICAgICAgICB7IHBhdGhuYW1lOiB1cmwucGF0aG5hbWUsIHJlcXVlc3RIZWFkZXJzOiByZXN1bHQucmVxdWVzdEhlYWRlcnMgfSxcbiAgICAgICAgICAgIHVybCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXEuaGVhZGVycyA9IHRvSW5jb21pbmdIdHRwSGVhZGVycyhyZXN1bHQucmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICBhd2FpdCB0aGlzLmltYWdlcy5oYW5kbGUocmVxLCByZXMsIHJlc3VsdC51cmwsIHdhaXRVbnRpbCk7XG4gICAgICAgIHJldHVybjtcblxuICAgICAgY2FzZSBcInJlZGlyZWN0XCI6XG4gICAgICAgIHNlbmRSZWRpcmVjdChyZXMsIHJlc3VsdC5sb2NhdGlvbiwgcmVzdWx0LnN0YXR1cyk7XG4gICAgICAgIHJldHVybjtcblxuICAgICAgY2FzZSBcImV4dGVybmFsLXJld3JpdGVcIjpcbiAgICAgICAgYXdhaXQgcHJveHlFeHRlcm5hbChyZXEsIHJlcywgcmVzdWx0LnVybCwgcmVzdWx0LnJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjYXNlIFwibWlkZGxld2FyZS1yZXNwb25kZWRcIjpcbiAgICAgICAgYXdhaXQgc2VuZFdlYlJlc3BvbnNlKHJlcywgcmVzdWx0LnJlc3BvbnNlKTtcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjYXNlIFwicmVzcG9uc2VcIjpcbiAgICAgICAgcmVzLmVuZCgpO1xuICAgICAgICByZXR1cm47XG5cbiAgICAgIGNhc2UgXCJub3QtZm91bmRcIjpcbiAgICAgICAgYXdhaXQgdGhpcy5zZW5kVW5tYXRjaGVkKHJlcSwgcmVzLCB3YWl0VW50aWwsIHJlc3VsdCwgdXJsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiA0MDQgb3IgNTAwIHdoZW4gYHBhdGhuYW1lYCBpcyB0aGUgcHJlcmVuZGVyZWQgYC80MDRgIG9yIGAvNTAwYCBwYWdlIOKAlCB1bmRlclxuICAgKiBgYmFzZVBhdGhgIGFuZCwgaW4gYW4gaTE4biBhcHAsIGFueSBsb2NhbGUgKGAvZnIvNDA0YCkg4oCUIGFuZCBgdW5kZWZpbmVkYFxuICAgKiBvdGhlcndpc2UuIGBuZXh0IHN0YXJ0YCBtYXRjaGVzIHRoZSBwYWdlLCBub3QgdGhlIFVSTCwgc28gdGhlIGxvY2FsZSBkb2VzXG4gICAqIG5vdCBtYXR0ZXIuXG4gICAqL1xuICBwcml2YXRlIHN0YXR1c1BhZ2VTdGF0dXMocGF0aG5hbWU6IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgeyBiYXNlUGF0aCwgaTE4biB9ID0gdGhpcy5vcHRpb25zLm1hbmlmZXN0LmNvbmZpZztcbiAgICBsZXQgcGFnZSA9IHdpdGhvdXRQYXRoUHJlZml4KHBhdGhuYW1lLCBiYXNlUGF0aCk7XG4gICAgY29uc3QgbG9jYWxlcyA9IChpMThuIGFzIHsgbG9jYWxlcz86IHJlYWRvbmx5IHN0cmluZ1tdIH0gfCBudWxsKT8ubG9jYWxlcztcbiAgICBmb3IgKGNvbnN0IGxvY2FsZSBvZiBsb2NhbGVzID8/IFtdKSB7XG4gICAgICBjb25zdCBzdHJpcHBlZCA9IHdpdGhvdXRQYXRoUHJlZml4KHBhZ2UsIGAvJHtsb2NhbGV9YCk7XG4gICAgICBpZiAoc3RyaXBwZWQgIT09IHBhZ2UpIHtcbiAgICAgICAgcGFnZSA9IHN0cmlwcGVkO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBhZ2UgPT09IFwiLzQwNFwiKSByZXR1cm4gNDA0O1xuICAgIGlmIChwYWdlID09PSBcIi81MDBcIikgcmV0dXJuIDUwMDtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIGBuZXh0IHN0YXJ0YCdzIGFuc3dlciB0byBhIHBhdGggbm90aGluZyBzZXJ2ZXMgKGByb3V0ZXItc2VydmVyLmpzYCwgdGhlXG4gICAqIFwiNDA0IGNhc2VcIiksIGZvciBib3RoIHdheXMgb2YgZ2V0dGluZyBoZXJlOiBkaXNwYXRjaCBtYXRjaGVkIG5vdGhpbmcsIG9yIGl0XG4gICAqIG1hdGNoZWQgYSBidWlsZCBhc3NldCB0aGF0IGlzIG5vdCBpbiB0aGUgcGFja2FnZS5cbiAgICpcbiAgICogTm8tc3RvcmUsIGFsd2F5cy4gQSBwcmVyZW5kZXJlZCBgL19ub3QtZm91bmRgIHdvdWxkIG90aGVyd2lzZSBzZW5kIGl0c1xuICAgKiBjYWNoZSBlbnRyeSdzIHllYXItbG9uZyBgcy1tYXhhZ2VgLCBhbmQgdGhlIENETiB3b3VsZCBrZWVwIHRoZSA0MDQgcGFzdCB0aGVcbiAgICogZGVwbG95IHRoYXQgYWRkcyB0aGUgcm91dGUuIFNldCByYXRoZXIgdGhhbiBmb3JjZWQ6IE5leHQncyBwYWdlIGhhbmRsZXJzXG4gICAqIG9ubHkgd3JpdGUgYSBgQ2FjaGUtQ29udHJvbGAgd2hlbiBub25lIGlzIHNldCAoYHNlbmRSZW5kZXJSZXN1bHRgLFxuICAgKiBgcGFnZXMtaGFuZGxlci5qc2ApLCB3aGljaCBpcyBleGFjdGx5IGhvdyBgbmV4dCBzdGFydGAncyBvd24gbm8tc3RvcmUgaGVyZVxuICAgKiBzdXJ2aXZlcyB0aGUgcmVuZGVyLiBgcmVuZGVyNDA0YCBpcyBub3QgdGhpcyBwYXRoOiBhIGBub3RGb3VuZCgpYCBmcm9tIGFuXG4gICAqIElTUiBwYWdlIGlzIGNhY2hlYWJsZSBmb3IgdGhhdCBwYWdlJ3MgcmV2YWxpZGF0ZSBwZXJpb2QuXG4gICAqXG4gICAqIEEgbWlzc2luZyBgX25leHQvc3RhdGljYCBmaWxlLCBhbmQgYSBHRVQgb3IgSEVBRCB3aG9zZSBgU2VjLUZldGNoLURlc3RgXG4gICAqIHNheXMgaXQgY2Fubm90IGRpc3BsYXkgSFRNTCAoYW4gYDxpbWc+YCwgYSBzY3JpcHQsIGEgZm9udCksIGdldCBhXG4gICAqIHBsYWluLXRleHQgYE5vdCBGb3VuZGAgaW5zdGVhZCBvZiB0aGUgcmVuZGVyZWQgcGFnZSDigJQgbm90aGluZyB3b3VsZCBzaG93XG4gICAqIGl0LCBhbmQgcmVuZGVyaW5nIGl0IGlzIHRoZSBleHBlbnNpdmUgcGFydC5cbiAgICpcbiAgICogRXZlcnl0aGluZyBlbHNlIHJlbmRlcnMgdGhlIGFwcCdzIDQwNCBhcyB0aGUgcGF0aCB0aGF0IHdhcyBhc2tlZCBmb3IsIG5vdFxuICAgKiBhcyBgL19ub3QtZm91bmRgOiB0aGUgQXBwIFJvdXRlciBzZXJpYWxpemVzIHRoZSBjYW5vbmljYWwgVVJMIGludG8gdGhlIFJTQ1xuICAgKiBwYXlsb2FkLCBzbyBhIGNsaWVudCBoeWRyYXRlZCBvZmYgYSBgL19ub3QtZm91bmRgIHBheWxvYWQgcmVwb3J0cyB0aGUgd3JvbmdcbiAgICogYHVzZVBhdGhuYW1lKClgIGFuZCBwdXNoZXMgdGhlIHdyb25nIGhpc3RvcnkgZW50cnkuIEl0IHJlbmRlcnMgd2l0aCB0aGVcbiAgICogcmVxdWVzdCBoZWFkZXJzIG1pZGRsZXdhcmUgc2V0LCB0b28g4oCUIGEgQ1NQIG5vbmNlLCBzYXkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlbmRVbm1hdGNoZWQoXG4gICAgcmVxOiBTaGltSW5jb21pbmdNZXNzYWdlLFxuICAgIHJlczogU2hpbVNlcnZlclJlc3BvbnNlLFxuICAgIHdhaXRVbnRpbDogKHByb21pc2U6IFByb21pc2U8dW5rbm93bj4pID0+IHZvaWQsXG4gICAgcmVzdWx0OiB7IHJlYWRvbmx5IHBhdGhuYW1lOiBzdHJpbmc7IHJlYWRvbmx5IHJlcXVlc3RIZWFkZXJzOiBIZWFkZXJzIH0sXG4gICAgdXJsOiBVUkwsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJlcy5zZXRIZWFkZXIoXCJDYWNoZS1Db250cm9sXCIsIE5PX1NUT1JFKTtcbiAgICBjb25zdCB7IGJhc2VQYXRoLCBhc3NldFByZWZpeCB9ID0gdGhpcy5vcHRpb25zLm1hbmlmZXN0LmNvbmZpZztcbiAgICBjb25zdCBwYXRobmFtZSA9IHdpdGhvdXRQYXRoUHJlZml4KFxuICAgICAgd2l0aG91dFBhdGhQcmVmaXgocmVzdWx0LnBhdGhuYW1lLCBiYXNlUGF0aCksXG4gICAgICBhc3NldFByZWZpeCxcbiAgICApO1xuICAgIGlmIChcbiAgICAgIHBhdGhuYW1lLnN0YXJ0c1dpdGgoXCIvX25leHQvc3RhdGljL1wiKSB8fFxuICAgICAgKChyZXEubWV0aG9kID09PSBcIkdFVFwiIHx8IHJlcS5tZXRob2QgPT09IFwiSEVBRFwiKSAmJlxuICAgICAgICBOT05fSFRNTF9TRUNfRkVUQ0hfREVTVFMuaGFzKFxuICAgICAgICAgIGZpcnN0VmFsdWUocmVxLmhlYWRlcnNbXCJzZWMtZmV0Y2gtZGVzdFwiXSkgPz8gXCJcIixcbiAgICAgICAgKSlcbiAgICApIHtcbiAgICAgIHJlcy5zdGF0dXNDb2RlID0gNDA0O1xuICAgICAgcmVzLnNldEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcInRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLThcIik7XG4gICAgICByZXMuZW5kKFwiTm90IEZvdW5kXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXEuaGVhZGVycyA9IHRvSW5jb21pbmdIdHRwSGVhZGVycyhyZXN1bHQucmVxdWVzdEhlYWRlcnMpO1xuICAgIGF3YWl0IHRoaXMuc2VuZE5vdEZvdW5kKFxuICAgICAgcmVxLFxuICAgICAgcmVzLFxuICAgICAgd2FpdFVudGlsLFxuICAgICAgdGhpcy5kaXNwYXRjaGVyLm5vdEZvdW5kRm9yKHVybCksXG4gICAgICBgJHtyZXN1bHQucGF0aG5hbWV9JHt1cmwuc2VhcmNofWAsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbmUgb24tZGVtYW5kIHJldmFsaWRhdGlvbiwgcnVuIGFnYWluc3QgdGhpcyBydW50aW1lIHJhdGhlciB0aGFuIG92ZXIgdGhlXG4gICAqIG5ldHdvcmsuIFdpcmVkIGluIGFzIGByZXF1ZXN0TWV0YS5yZXZhbGlkYXRlYDsgc2VlIHRoZSBjb21tZW50IHRoZXJlLlxuICAgKlxuICAgKiBUaGUgcmVzcG9uc2UgaXMgdGhyb3duIGF3YXkg4oCUIG9ubHkgaXRzIHN0YXR1cyBtYXR0ZXJzIOKAlCBidXQgaXQgZ29lcyB0aHJvdWdoXG4gICAqIHRoZSBmdWxsIHtAbGluayBoYW5kbGV9LCBzbyB0aGUgZW50cnlwb2ludCBzZWVzIGEgcmVxdWVzdCB3aXRoXG4gICAqIGB4LXByZXJlbmRlci1yZXZhbGlkYXRlYCBvbiBpdCBhbmQgd3JpdGVzIHRoZSBmcmVzaCBlbnRyeSB0aHJvdWdoIHRoZSBjYWNoZVxuICAgKiBoYW5kbGVyIGV4YWN0bHkgYXMgYSByZXF1ZXN0IGZyb20gb3V0c2lkZSB3b3VsZC4gYGhhbmRsZWAgYXdhaXRzIGl0cyBvd25cbiAgICogYHdhaXRVbnRpbGAgd29yaywgc28gdGhlIG5ldyBlbnRyeSBpcyBjb21taXR0ZWQgYmVmb3JlIGByZXMucmV2YWxpZGF0ZSgpYFxuICAgKiByZXNvbHZlcywgd2hpY2ggaXMgd2hhdCBjYWxsZXJzIHRoYXQgcmV2YWxpZGF0ZSBhbmQgdGhlbiByZWRpcmVjdCBkZXBlbmQgb24uXG4gICAqXG4gICAqIFRoZSBhY2NlcHQvdGhyb3cgcnVsZSBpcyBgTmV4dFNlcnZlciNyZXZhbGlkYXRlYCdzLCB2ZXJiYXRpbTogYSByZXZhbGlkYXRpb25cbiAgICogaXMgc3VjY2Vzc2Z1bCBpZiBpdCB3YXMgY2FjaGVkIG9yIGFuc3dlcmVkIDIwMCwgYW5kIGBub3RGb3VuZDogdHJ1ZWBcbiAgICogbGVnaXRpbWF0ZWx5IGFuc3dlcnMgNDA0IGZvciBhbiBgdW5zdGFibGVfb25seUdlbmVyYXRlZGAgY2FsbGVyLiBBbnl0aGluZ1xuICAgKiBlbHNlIHRocm93cywgYW5kIGByZXMucmV2YWxpZGF0ZSgpYCB0dXJucyBpdCBpbnRvIGBGYWlsZWQgdG8gcmV2YWxpZGF0ZVxuICAgKiA8cGF0aD46IDxtZXNzYWdlPmAuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJldmFsaWRhdGUoXG4gICAgY29uZmlnOiBSZXZhbGlkYXRlQ29uZmlnLFxuICAgIG9yaWdpbjogUnVudGltZVJlcXVlc3QsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgaGVhZCwgb3RoZXJHcm91cCB9ID0gYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbGx5KFxuICAgICAge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIHVybDogY29uZmlnLnVybFBhdGgsXG4gICAgICAgIC8vIFRoZSBjYWxsZXIncyBhdXRob3JpdHksIG5vdCB0aGUgcmV2YWxpZGF0ZWQgcGF0aCdzOiBpdCBpcyB3aGF0XG4gICAgICAgIC8vIGBhYnNvbHV0ZVVybGAgYnVpbGRzIHRoZSByZXF1ZXN0IFVSTCBmcm9tLCBhbmQgYSByZXZhbGlkYXRpb24gaXMgZm9yXG4gICAgICAgIC8vIHRoZSBvcmlnaW4gYmVpbmcgc2VydmVkLiBUaGUgZm9yd2FyZGVkIHBhaXIgd2l0aCBpdCDigJQgYmVoaW5kXG4gICAgICAgIC8vIENsb3VkRnJvbnQgYGhvc3RgIGlzIHRoZSBGdW5jdGlvbiBVUkwsIGFuZCBhIHJlbmRlciB0aGF0IGJ1aWx0IGl0c1xuICAgICAgICAvLyBhYnNvbHV0ZSBVUkxzIGZyb20gdGhhdCB3b3VsZCBjYWNoZSBsaW5rcyB0byB0aGUgcmF3IGZ1bmN0aW9uLlxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgLi4uY29uZmlnLmhlYWRlcnMsXG4gICAgICAgICAgaG9zdDogb3JpZ2luLmhlYWRlcnMuaG9zdCxcbiAgICAgICAgICAuLi5waWNrRGVmaW5lZChvcmlnaW4uaGVhZGVycywgW1xuICAgICAgICAgICAgXCJ4LWZvcndhcmRlZC1ob3N0XCIsXG4gICAgICAgICAgICBcIngtZm9yd2FyZGVkLXByb3RvXCIsXG4gICAgICAgICAgXSksXG4gICAgICAgIH0sXG4gICAgICAgIGVuY3J5cHRlZDogb3JpZ2luLmVuY3J5cHRlZCxcbiAgICAgICAgdHJ1c3RGb3J3YXJkZWRIb3N0OiBvcmlnaW4udHJ1c3RGb3J3YXJkZWRIb3N0LFxuICAgICAgfSxcbiAgICAgIHt9LFxuICAgICk7XG5cbiAgICBjb25zdCBzdGF0dXMgPSBoZWFkPy5zdGF0dXNDb2RlID8/IDUwMDtcbiAgICBpZiAob3RoZXJHcm91cCkge1xuICAgICAgY29uc3Qgc2VsZiA9IHByb2Nlc3MuZW52W0ZVTkNUSU9OX0dST1VQX0VOVl9WQVJdO1xuICAgICAgLy8gQSBwYWdlIHBhY2thZ2VkIGludG8gYW5vdGhlciBgZnVuY3Rpb25Hcm91cHNgIGdyb3VwOiBpdCBpcyByZW5kZXJlZCBpblxuICAgICAgLy8gcHJvY2VzcywgYW5kIHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaGF2ZSB0aGUgcGFnZSdzIGNvZGUuIENoZWNrZWRcbiAgICAgIC8vIGZpcnN0IGJlY2F1c2UgaXQgcmVuZGVycyBhcyBhIDQwNCwgd2hpY2ggYHVuc3RhYmxlX29ubHlHZW5lcmF0ZWRgXG4gICAgICAvLyB3b3VsZCBvdGhlcndpc2UgYWNjZXB0LlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCByZXNwb25zZSAke3N0YXR1c306IFwiJHtjb25maWcudXJsUGF0aH1cIiBiZWxvbmdzIHRvIGAgK1xuICAgICAgICAgIGBcXGBmdW5jdGlvbkdyb3Vwc1xcYCBncm91cCBcIiR7b3RoZXJHcm91cC5vd25lcn1cIiwgYW5kIGAgK1xuICAgICAgICAgIGByZXMucmV2YWxpZGF0ZSgpIGNhbiBvbmx5IHJldmFsaWRhdGUgcGFnZXMgaW4gdGhlIGdyb3VwIGl0IHJ1bnMgYCArXG4gICAgICAgICAgYGluIChcIiR7c2VsZn1cIikuIENhbGwgaXQgZnJvbSBhbiBBUEkgcm91dGUgaW4gZ3JvdXAgYCArXG4gICAgICAgICAgYFwiJHtvdGhlckdyb3VwLm93bmVyfVwiLCBvciB1c2UgcmV2YWxpZGF0ZVBhdGgoKS9yZXZhbGlkYXRlVGFnKCksIGAgK1xuICAgICAgICAgIGB3aGljaCB3b3JrIGZyb20gYW55IGdyb3VwLmAsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBoZWFkPy5oZWFkZXJzW1wieC1uZXh0anMtY2FjaGVcIl0gIT09IFwiUkVWQUxJREFURURcIiAmJlxuICAgICAgc3RhdHVzICE9PSAyMDAgJiZcbiAgICAgICEoc3RhdHVzID09PSA0MDQgJiYgY29uZmlnLm9wdHMudW5zdGFibGVfb25seUdlbmVyYXRlZClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCByZXNwb25zZSAke3N0YXR1c31gKTtcbiAgICB9XG5cbiAgICBhd2FpdCBpbnZhbGlkYXRlUmV2YWxpZGF0ZWRQYWdlKGNvbmZpZy51cmxQYXRoLCB0aGlzLm9wdGlvbnMubWFuaWZlc3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuIGltYWdlIG9wdGltaXphdGlvbiBzb3VyY2UgdGhhdCBpcyBub3QgYSBmaWxlOiBgPEltYWdlIHNyYz1cIi9hcGkvYXZhdGFyXCI+YFxuICAgKiBzZXJ2ZWQgYnkgYSByb3V0ZSBoYW5kbGVyLiBXaXJlZCBpbiBhcyB0aGUgb3B0aW1pemVyJ3MgYGZldGNoSW50ZXJuYWxgLCBhbmRcbiAgICogcnVuIGluIHByb2Nlc3MgZm9yIHRoZSByZWFzb25zIHtAbGluayByZXZhbGlkYXRlfSBpcyDigJQgYG5leHQgc3RhcnRgIGZldGNoZXNcbiAgICogdGhlIHNvdXJjZSBmcm9tIGl0c2VsZiBvdmVyIGxvb3BiYWNrLCB3aGljaCBoZXJlIHdvdWxkIGJlIGEgc2Vjb25kIGJpbGxlZFxuICAgKiBpbnZvY2F0aW9uIHRocm91Z2ggQ2xvdWRGcm9udC5cbiAgICpcbiAgICogT25seSB0aGUgYXV0aG9yaXR5IGlzIGZvcndhcmRlZCwgYXMgYG5leHQgc3RhcnRgJ3MgYGZldGNoSW50ZXJuYWxJbWFnZWBcbiAgICogZm9yd2FyZHMgbm9uZSBvZiB0aGUgdmlld2VyJ3MgaGVhZGVyczogdGhlIHNvdXJjZSBpcyBjYWNoZWQgYW5kIHNlcnZlZCB0b1xuICAgKiBldmVyeW9uZSwgc28gaXQgbXVzdCBub3QgZGVwZW5kIG9uIG9uZSB2aWV3ZXIncyBjb29raWVzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaEludGVybmFsKFxuICAgIGhyZWY6IHN0cmluZyxcbiAgICByZXE6IFNoaW1JbmNvbWluZ01lc3NhZ2UsXG4gICAgbWF4aW11bUJvZHk6IG51bWJlcixcbiAgKTogUHJvbWlzZTxJbnRlcm5hbEltYWdlUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXF1ZXN0OiBSdW50aW1lUmVxdWVzdCA9IHtcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgIHVybDogaHJlZixcbiAgICAgIGhlYWRlcnM6IHBpY2tEZWZpbmVkKHJlcS5oZWFkZXJzLCBbXG4gICAgICAgIFwiaG9zdFwiLFxuICAgICAgICBcIngtZm9yd2FyZGVkLWhvc3RcIixcbiAgICAgICAgXCJ4LWZvcndhcmRlZC1wcm90b1wiLFxuICAgICAgXSksXG4gICAgICBlbmNyeXB0ZWQ6IChyZXEuc29ja2V0IGFzIHsgZW5jcnlwdGVkPzogYm9vbGVhbiB9IHwgdW5kZWZpbmVkKT8uZW5jcnlwdGVkLFxuICAgICAgdHJ1c3RGb3J3YXJkZWRIb3N0OiByZXEudHJ1c3RGb3J3YXJkZWRIb3N0LFxuICAgIH07XG4gICAgY29uc3QgeyBoZWFkLCBib2R5LCBvdGhlckdyb3VwLCB0b29MYXJnZSB9ID0gYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbGx5KFxuICAgICAgcmVxdWVzdCxcbiAgICAgIHsgbWF4aW11bUJvZHkgfSxcbiAgICApO1xuICAgIGlmICh0b29MYXJnZSkge1xuICAgICAgcmV0dXJuIHsgc3RhdHVzQ29kZTogMCwgaGVhZGVyczoge30sIGJvZHk6IEJ1ZmZlci5hbGxvYygwKSwgdG9vTGFyZ2UgfTtcbiAgICB9XG4gICAgaWYgKG90aGVyR3JvdXApIHtcbiAgICAgIC8vIFRoZSBlZGdlIHNlbmRzIGV2ZXJ5IGAvX25leHQvaW1hZ2VgIHJlcXVlc3QgdG8gdGhlIGRlZmF1bHQgZ3JvdXAsIGFuZFxuICAgICAgLy8gdGhlIHNvdXJjZSBpcyByZW5kZXJlZCBpbiBwcm9jZXNzLCBzbyBhIHJvdXRlIHBhY2thZ2VkIGludG8gYW5vdGhlclxuICAgICAgLy8gZ3JvdXAgaXMgb3V0IG9mIHJlYWNoOiB0aGUgb3B0aW1pemVyIGFuc3dlcnMgKGFuZCBsb2dzKSBhIDUwMi5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1c0NvZGU6IDAsXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICBib2R5OiBCdWZmZXIuYWxsb2MoMCksXG4gICAgICAgIG90aGVyR3JvdXA6IG90aGVyR3JvdXAub3duZXIsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzQ29kZTogaGVhZD8uc3RhdHVzQ29kZSA/PyAwLFxuICAgICAgaGVhZGVyczogaGVhZD8uaGVhZGVycyA/PyB7fSxcbiAgICAgIGJvZHksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbmUgcmVxdWVzdCB0aHJvdWdoIHtAbGluayBoYW5kbGV9LCBhbnN3ZXJlZCB0byB0aGlzIHJ1bnRpbWUgaW5zdGVhZCBvZiBhXG4gICAqIGNsaWVudDogdGhlIGhlYWQsIHRoZSBib2R5IHdoZW4gaXQgaXMgd2FudGVkLCBhbmQgdGhlIGVycm9yIHdoZW4gdGhlIHJvdXRlXG4gICAqIGlzIHBhY2thZ2VkIGludG8gYW5vdGhlciBgZnVuY3Rpb25Hcm91cHNgIGdyb3VwLiBgaGFuZGxlYCBhd2FpdHMgdGhlXG4gICAqIHJlcXVlc3QncyBgd2FpdFVudGlsYCB3b3JrIHRvbywgc28gd2hhdGV2ZXIgdGhlIHJlbmRlciB3cm90ZSBpcyBjb21taXR0ZWQgYnlcbiAgICogdGhlIHRpbWUgdGhpcyByZXNvbHZlcy5cbiAgICpcbiAgICogVGhlIGJvZHkgaXMga2VwdCBvbmx5IHdoZW4gYG1heGltdW1Cb2R5YCBpcyBzZXQuIE9uZSBwYXN0IGl0IGZhaWxzIHRoZVxuICAgKiByZXNwb25zZSBzdHJlYW0sIHdoaWNoIHN0b3BzIHRoZSByb3V0ZSB3cml0aW5nLCBhbmQgY29tZXMgYmFjayBhc1xuICAgKiBgdG9vTGFyZ2VgIHJhdGhlciB0aGFuIGhlbGQgaW4gbWVtb3J5LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVJbnRlcm5hbGx5KFxuICAgIHJlcXVlc3Q6IFJ1bnRpbWVSZXF1ZXN0LFxuICAgIG9wdGlvbnM6IHsgcmVhZG9ubHkgbWF4aW11bUJvZHk/OiBudW1iZXIgfSxcbiAgKTogUHJvbWlzZTx7XG4gICAgaGVhZD86IFJlc3BvbnNlSGVhZDtcbiAgICBib2R5OiBCdWZmZXI7XG4gICAgb3RoZXJHcm91cD86IFJvdXRlSW5PdGhlckdyb3VwRXJyb3I7XG4gICAgdG9vTGFyZ2U6IGJvb2xlYW47XG4gIH0+IHtcbiAgICBsZXQgaGVhZDogUmVzcG9uc2VIZWFkIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNodW5rczogQnVmZmVyW10gPSBbXTtcbiAgICBsZXQgc2l6ZSA9IDA7XG4gICAgbGV0IHRvb0xhcmdlID0gZmFsc2U7XG4gICAgbGV0IG90aGVyR3JvdXA6IFJvdXRlSW5PdGhlckdyb3VwRXJyb3IgfCB1bmRlZmluZWQ7XG4gICAgY29uc3Qgb25Sb3V0ZUluT3RoZXJHcm91cCA9IChlcnJvcjogUm91dGVJbk90aGVyR3JvdXBFcnJvcikgPT4ge1xuICAgICAgb3RoZXJHcm91cCA9IGVycm9yO1xuICAgIH07XG4gICAgYXdhaXQgdGhpcy5oYW5kbGUoXG4gICAgICB7IC4uLnJlcXVlc3QsIG9uUm91dGVJbk90aGVyR3JvdXAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW4ocmVzcG9uc2VIZWFkKSB7XG4gICAgICAgICAgaGVhZCA9IHJlc3BvbnNlSGVhZDtcbiAgICAgICAgICByZXR1cm4gbmV3IFdyaXRhYmxlKHtcbiAgICAgICAgICAgIHdyaXRlKGNodW5rOiBCdWZmZXIsIF9lbmNvZGluZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubWF4aW11bUJvZHkgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgIHNpemUgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgaWYgKHNpemUgPiBvcHRpb25zLm1heGltdW1Cb2R5KSB7XG4gICAgICAgICAgICAgICAgdG9vTGFyZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoXCJPdmVyIGltYWdlcy5tYXhpbXVtUmVzcG9uc2VCb2R5XCIpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjaHVua3MucHVzaChCdWZmZXIuZnJvbShjaHVuaykpO1xuICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgaGVhZCxcbiAgICAgIGJvZHk6IHRvb0xhcmdlID8gQnVmZmVyLmFsbG9jKDApIDogQnVmZmVyLmNvbmNhdChjaHVua3MpLFxuICAgICAgb3RoZXJHcm91cCxcbiAgICAgIHRvb0xhcmdlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQXBwIFJvdXRlciBidWlsZHMgYW4gaW52b2NhYmxlIGAvX25vdC1mb3VuZGAsIFBhZ2VzIFJvdXRlciBhIHByZXJlbmRlcmVkXG4gICAqIGA0MDQuaHRtbGAgKHBlciBsb2NhbGUgdW5kZXIgaTE4bikgb3IgZWxzZSBgL19lcnJvcmA7IHNlZSBgc3RhdHVzVGFyZ2V0c2AuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlbmROb3RGb3VuZChcbiAgICByZXE6IFNoaW1JbmNvbWluZ01lc3NhZ2UsXG4gICAgcmVzOiBTaGltU2VydmVyUmVzcG9uc2UsXG4gICAgd2FpdFVudGlsOiAocHJvbWlzZTogUHJvbWlzZTx1bmtub3duPikgPT4gdm9pZCxcbiAgICB0YXJnZXQ6IFN0YXR1c1RhcmdldCxcbiAgICAvKipcbiAgICAgKiBXaGF0IHRvIHJlbmRlciB0aGUgNDA0IGFzLiBPbWl0dGVkIGJ5IGByZW5kZXI0MDRgLCB3aGljaCBpcyBjYWxsZWRcbiAgICAgKiBtaWQtcmVuZGVyIHdpdGggYHJlcS51cmxgIGFscmVhZHkgcG9pbnRpbmcgYXQgdGhlIHJvdXRlIHRoYXQgZ2F2ZSB1cCDigJRcbiAgICAgKiB0aGUgcGF0aCBOZXh0LmpzIHdvdWxkIHJlbmRlciB0aGF0IDQwNCBmb3IuXG4gICAgICovXG4gICAgcmVxdWVzdGVkVXJsPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXMuc3RhdHVzQ29kZSA9IDQwNDtcblxuICAgIGlmICh0YXJnZXQua2luZCA9PT0gXCJlbnRyeXBvaW50XCIpIHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSBhd2FpdCB0aGlzLmVudHJ5cG9pbnRzLmxvYWQodGFyZ2V0LmVudHJ5cG9pbnQpO1xuICAgICAgcmVxLnVybCA9IHJlcXVlc3RlZFVybCA/PyByZXEudXJsO1xuICAgICAgY29uc3QgcmVuZGVyID0gKCkgPT4gaGFuZGxlcihyZXEsIGFzU2VydmVyUmVzcG9uc2UocmVzKSwgeyB3YWl0VW50aWwgfSk7XG4gICAgICAvLyBBcHAgUm91dGVyJ3MgYC9fbm90LWZvdW5kYCBpcyBhIHBhZ2UgcmVuZGVyIHRvbzogc2VlIGByb3V0ZWAuXG4gICAgICBhd2FpdCAodGFyZ2V0LmVudHJ5cG9pbnQudHlwZSA9PT0gXCJhcHAtcGFnZVwiXG4gICAgICAgID8gY2F0Y2hVcFRhZ3MocmVuZGVyKVxuICAgICAgICA6IHJlbmRlcigpKTtcbiAgICAgIGlmICghcmVzLndyaXRhYmxlRW5kZWQpIHtcbiAgICAgICAgcmVzLmVuZCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHRhcmdldC5raW5kID09PSBcInN0YXRpYy1maWxlXCIgJiZcbiAgICAgIChhd2FpdCB0aGlzLnNlbmRIdG1sRmlsZShyZXMsIHRhcmdldCkpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmVzLnNldEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcInRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLThcIik7XG4gICAgcmVzLmVuZChcIlRoaXMgcGFnZSBjb3VsZCBub3QgYmUgZm91bmQuXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFR1cm4gYSB0aHJvd24gZXJyb3IgaW50byBhIHJlc3BvbnNlLCByZW5kZXJpbmcgdGhlIGFwcCdzIGVycm9yIHBhZ2Ugd2hlbiBpdFxuICAgKiBoYXMgb25lLlxuICAgKlxuICAgKiBOZXh0LmpzJ3Mgb3duIHBhZ2UgaGFuZGxlcnMgY2F0Y2gsIHJlcG9ydCBhbmQgdGhlbiAqcmV0aHJvdyogKFwicmV0aHJvdyBzb1xuICAgKiB0aGF0IHdlIGNhbiBoYW5kbGUgc2VydmluZyBlcnJvciBwYWdlXCIsIGBwYWdlcy1oYW5kbGVyLnRzYCksIHdoaWNoIG1ha2VzIHRoZVxuICAgKiBlcnJvciBwYWdlIHRoZSBob3N0J3Mgam9iIOKAlCB0aGUgc2FtZSBkaXZpc2lvbiBvZiBsYWJvciBhcyBgcmVuZGVyNDA0YC4gV2l0aG91dFxuICAgKiB0aGlzIGxhZGRlciBldmVyeSB0aHJvdyBhbnN3ZXJlZCBhIGJhcmUgYHRleHQvcGxhaW5gIDUwMCBhbmQgYSBjdXN0b21cbiAgICogYHBhZ2VzL19lcnJvcmAgd2FzIGRlYWQgY29kZSAoYHRlc3QvZTJlL2FzeW5jLW1vZHVsZXNgLCB3aG9zZSBgL21ha2UtZXJyb3JgXG4gICAqIHRocm93cyBpbiBgZ2V0U2VydmVyU2lkZVByb3BzYCkuXG4gICAqXG4gICAqIE9uY2UgdGhlIGhlYWQgaXMgb3V0IHRoZXJlIGlzIG5vdGhpbmcgdG8gc2F5IOKAlCBkZXN0cm95aW5nIHRoZSBzdHJlYW0gaXMgd2hhdFxuICAgKiB0ZWxscyB0aGUgY2xpZW50IHRoZSByZXNwb25zZSBpcyB0cnVuY2F0ZWQgcmF0aGVyIHRoYW4gY29tcGxldGUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlbmRFcnJvcihcbiAgICByZXE6IFNoaW1JbmNvbWluZ01lc3NhZ2UsXG4gICAgcmVzOiBTaGltU2VydmVyUmVzcG9uc2UsXG4gICAgd2FpdFVudGlsOiAocHJvbWlzZTogUHJvbWlzZTx1bmtub3duPikgPT4gdm9pZCxcbiAgICBlcnJvcjogdW5rbm93bixcbiAgICAvKiogVGhlIHJlcXVlc3QsIGFzIHJlY2VpdmVkOiB3aGljaCBsb2NhbGUncyBwcmVyZW5kZXJlZCA1MDAgdG8gc2VuZC4gKi9cbiAgICB1cmw6IFVSTCB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc29sZS5lcnJvcihcIlVuaGFuZGxlZCBlcnJvciB3aGlsZSBoYW5kbGluZyB0aGUgcmVxdWVzdDpcIiwgZXJyb3IpO1xuICAgIGlmIChyZXMuaGVhZGVyc1NlbnQpIHtcbiAgICAgIHJlcy5kZXN0cm95KGFzRXJyb3IoZXJyb3IpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVzLnN0YXR1c0NvZGUgPSA1MDA7XG4gICAgLy8gQSBmYWlsZWQgcmVuZGVyIG1heSBoYXZlIHNldCBoZWFkZXJzIGRlc2NyaWJpbmcgYSBib2R5IHRoYXQgbmV2ZXJcbiAgICAvLyBhcnJpdmVkLiBFdmVyeSBydW5nIGJlbG93IHNlbmRzIGEgZGlmZmVyZW50IGJvZHksIHNvIHRoZXkgZ28gZmlyc3Q6IGFcbiAgICAvLyBzdGFsZSBgQ29udGVudC1MZW5ndGhgIG9uIGEgNTAwLmh0bWwgb2YgYW5vdGhlciBzaXplIGhhbmdzIHRoZSBjbGllbnQgb3JcbiAgICAvLyBkZXN5bmNzIGEga2VlcC1hbGl2ZSBjb25uZWN0aW9uLlxuICAgIHJlcy5yZW1vdmVIZWFkZXIoXCJDb250ZW50LUxlbmd0aFwiKTtcbiAgICByZXMucmVtb3ZlSGVhZGVyKFwiRVRhZ1wiKTtcbiAgICAvLyBFdmVyeSBydW5nLCB0aGUgZXJyb3ItcGFnZSBlbnRyeXBvaW50IGluY2x1ZGVkOiBvdGhlcndpc2UgdGhlIHRocm93aW5nXG4gICAgLy8gcmVuZGVyJ3MgYHMtbWF4YWdlYCAob3IgYSBgaGVhZGVycygpYCBydWxlJ3MpIHJpZGVzIGFsb25nIGFuZCBDbG91ZEZyb250XG4gICAgLy8gY2FjaGVzIHRoZSA1MDAuIGBuZXh0IHN0YXJ0YCBzZXRzIGl0IGJlZm9yZSByZW5kZXJpbmcgdGhlIGVycm9yIHBhZ2UgdG9vLlxuICAgIHJlcy5zZXRIZWFkZXIoXCJDYWNoZS1Db250cm9sXCIsIE5PX1NUT1JFKTtcbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmVycm9yVGFyZ2V0Rm9yKHVybCk7XG5cbiAgICBpZiAodGFyZ2V0LmtpbmQgPT09IFwiZW50cnlwb2ludFwiKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gYXdhaXQgdGhpcy5lbnRyeXBvaW50cy5sb2FkKHRhcmdldC5lbnRyeXBvaW50KTtcbiAgICAgICAgLy8gYHJlcS51cmxgIGlzIGxlZnQgYWxvbmU6IHRoZSBlcnJvciBwYWdlIHJlbmRlcnMgZm9yIHRoZSBVUkwgdGhhdCB3YXNcbiAgICAgICAgLy8gYXNrZWQgZm9yLCBhbmQgYF9lcnJvcmAncyBgZ2V0SW5pdGlhbFByb3BzYCByZWFkcyB0aGUgc3RhdHVzIG9mZiBgcmVzYCxcbiAgICAgICAgLy8gd2hpY2ggaXMgd2h5IHRoZSA1MDAgYWJvdmUgaXMgc2V0IGZpcnN0LlxuICAgICAgICBhd2FpdCBoYW5kbGVyKHJlcSwgYXNTZXJ2ZXJSZXNwb25zZShyZXMpLCB7IHdhaXRVbnRpbCB9KTtcbiAgICAgICAgaWYgKCFyZXMud3JpdGFibGVFbmRlZCkge1xuICAgICAgICAgIHJlcy5lbmQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvclBhZ2VFcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiVGhlIGVycm9yIHBhZ2UgaXRzZWxmIGZhaWxlZCB0byByZW5kZXI6XCIsXG4gICAgICAgICAgZXJyb3JQYWdlRXJyb3IsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChyZXMuaGVhZGVyc1NlbnQpIHtcbiAgICAgICAgICByZXMuZGVzdHJveShhc0Vycm9yKGVycm9yUGFnZUVycm9yKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGFyZ2V0LmtpbmQgPT09IFwic3RhdGljLWZpbGVcIiAmJlxuICAgICAgKGF3YWl0IHRoaXMuc2VuZEh0bWxGaWxlKHJlcywgdGFyZ2V0KSlcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBZ2FpbjogYW4gZXJyb3IgcGFnZSB0aGF0IHRocmV3IG1heSBoYXZlIGRlc2NyaWJlZCBpdHMgb3duIGJvZHkgdG9vLlxuICAgIHJlcy5yZW1vdmVIZWFkZXIoXCJDb250ZW50LUxlbmd0aFwiKTtcbiAgICByZXMucmVtb3ZlSGVhZGVyKFwiRVRhZ1wiKTtcbiAgICByZXMuc3RhdHVzQ29kZSA9IDUwMDtcbiAgICByZXMuc2V0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOFwiKTtcbiAgICByZXMuc2V0SGVhZGVyKFwiQ2FjaGUtQ29udHJvbFwiLCBOT19TVE9SRSk7XG4gICAgcmVzLmVuZChcIkludGVybmFsIFNlcnZlciBFcnJvclwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHByZXJlbmRlcmVkIDQwNCBvciA1MDAgcGFnZSwgb3IgYGZhbHNlYCB3aGVuIGl0IGNhbm5vdCBiZSByZWFkIGFuZCB0aGVcbiAgICogY2FsbGVyJ3MgcGxhaW4tdGV4dCBmYWxsYmFjayBzaG91bGQgYW5zd2VyLiBSZWFkIHJhdGhlciB0aGFuIGBzZXJ2ZVN0YXRpY2AsXG4gICAqIHdoaWNoIGtlZXBzIHRoZSBzdGF0dXMgYWxyZWFkeSBzZXQgYnV0IHdvdWxkIGFuc3dlciBhIGBSYW5nZWAgcmVxdWVzdCB3aXRoXG4gICAqIGEgMjA2IG9mIHRoZSBlcnJvciBwYWdlLCBhbmQgYWRkIGBFVGFnYCwgYExhc3QtTW9kaWZpZWRgIGFuZCwgd2hlcmUgbm9uZSBpc1xuICAgKiBzZXQgeWV0LCBhIHB1YmxpYyBgQ2FjaGUtQ29udHJvbGAgdG8gaXQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlbmRIdG1sRmlsZShcbiAgICByZXM6IFNoaW1TZXJ2ZXJSZXNwb25zZSxcbiAgICB0YXJnZXQ6IHsgcmVhZG9ubHkgZmlsZVBhdGg6IHN0cmluZyB9LFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBsZXQgaHRtbDogQnVmZmVyO1xuICAgIHRyeSB7XG4gICAgICBodG1sID0gYXdhaXQgcmVhZEZpbGUoam9pbih0aGlzLm9wdGlvbnMuZGVwbG95bWVudFJvb3QsIHRhcmdldC5maWxlUGF0aCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXMuc2V0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwidGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04XCIpO1xuICAgIHJlcy5lbmQoaHRtbCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBXaGF0IG5leHQgc2VuZHMgd2l0aCBhbiBlcnJvciBpdCByZW5kZXJlZCBpdHNlbGYuIFdpdGhvdXQgaXQgYSBgQ2FjaGUtQ29udHJvbGBcbiAqIGxlZnQgYmVoaW5kIGJ5IHRoZSByZW5kZXIgdGhhdCB0aHJldyBjYW4gZ2V0IGEgNTAwIGNhY2hlZCBhdCB0aGUgZWRnZS5cbiAqL1xuY29uc3QgTk9fU1RPUkUgPSBcInByaXZhdGUsIG5vLWNhY2hlLCBuby1zdG9yZSwgbWF4LWFnZT0wLCBtdXN0LXJldmFsaWRhdGVcIjtcblxuLyoqXG4gKiBgU2VjLUZldGNoLURlc3RgIHZhbHVlcyB0aGF0IGNhbiBuZXZlciBkaXNwbGF5IGFuIEhUTUwgcmVzcG9uc2UsIGZyb21cbiAqIGBuZXh0L2Rpc3Qvc2VydmVyL2xpYi9pcy1ub24taHRtbC1zZWMtZmV0Y2gtZGVzdC5qc2AuIFJlc3RhdGVkIHJhdGhlciB0aGFuXG4gKiByZXF1aXJlZCwgYmVjYXVzZSB0aGF0IG1vZHVsZSBpcyByZWNlbnQgYW5kIHRoZSBhcHAncyBgbmV4dGAgbWF5IHByZWRhdGUgaXQ6XG4gKiBhIGZhaWxlZCByZXF1aXJlIGhlcmUgd291bGQgdHVybiBldmVyeSA0MDQgaW50byBhIDUwMC4gRXhjbHVkZXMgYGRvY3VtZW50YCxcbiAqIGBpZnJhbWVgIGFuZCB0aGUgbGlrZSwgYW5kIGBlbXB0eWAg4oCUIGBmZXRjaCgpYCwgd2hpY2ggaXMgaG93IFJTQyByZXF1ZXN0cyBnby5cbiAqL1xuY29uc3QgTk9OX0hUTUxfU0VDX0ZFVENIX0RFU1RTOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldChbXG4gIFwiYXVkaW9cIixcbiAgXCJhdWRpb3dvcmtsZXRcIixcbiAgXCJmb250XCIsXG4gIFwiaW1hZ2VcIixcbiAgXCJqc29uXCIsXG4gIFwibWFuaWZlc3RcIixcbiAgXCJwYWludHdvcmtsZXRcIixcbiAgXCJyZXBvcnRcIixcbiAgXCJzY3JpcHRcIixcbiAgXCJzZXJ2aWNld29ya2VyXCIsXG4gIFwic2hhcmVkd29ya2VyXCIsXG4gIFwic3R5bGVcIixcbiAgXCJ0cmFja1wiLFxuICBcInZpZGVvXCIsXG4gIFwid2ViaWRlbnRpdHlcIixcbiAgXCJ3b3JrZXJcIixcbiAgXCJ4c2x0XCIsXG5dKTtcblxuLyoqXG4gKiBgSU5URVJOQUxfSEVBREVSU2AgZnJvbSBgbmV4dC9kaXN0L3NlcnZlci9saWIvc2VydmVyLWlwYy91dGlscy5qc2AgKE5leHRcbiAqIDE2LjMpLCB3aGljaCBgbmV4dCBzdGFydGAgZGVsZXRlcyBmcm9tIGV2ZXJ5IHJlcXVlc3QgYmVmb3JlIHJvdXRpbmcgaXRcbiAqIChgZmlsdGVySW50ZXJuYWxIZWFkZXJzYCBpbiBgcm91dGVyLXNlcnZlci5qc2ApLiBUaGV5IGFyZSBzaWduYWxzIGJldHdlZW5cbiAqIE5leHQncyBvd24gcm91dGVyIGFuZCByZW5kZXIgbGF5ZXJzOyBob25vcmluZyBvbmUgYSBjbGllbnQgc2VudCBsZXRzIGl0IHN0ZWVyXG4gKiB0aG9zZSBsYXllcnMg4oCUIGBuZXh0LXJlc3VtZWAgbWFrZXMgYSBQUFIgcGFnZSByZXN1bWUgZnJvbSBhIHBvc3Rwb25lZCBzdGF0ZVxuICogdGhlIGNsaWVudCBzdXBwbGllcy4gUmVzdGF0ZWQgcmF0aGVyIHRoYW4gcmVxdWlyZWQsIGxpa2VcbiAqIHtAbGluayBOT05fSFRNTF9TRUNfRkVUQ0hfREVTVFN9LlxuICovXG5jb25zdCBJTlRFUk5BTF9IRUFERVJTOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldChbXG4gIFwieC1taWRkbGV3YXJlLXJld3JpdGVcIixcbiAgXCJ4LW1pZGRsZXdhcmUtcmVkaXJlY3RcIixcbiAgXCJ4LW1pZGRsZXdhcmUtc2V0LWNvb2tpZVwiLFxuICBcIngtbWlkZGxld2FyZS1za2lwXCIsXG4gIFwieC1taWRkbGV3YXJlLW92ZXJyaWRlLWhlYWRlcnNcIixcbiAgXCJ4LW1pZGRsZXdhcmUtbmV4dFwiLFxuICBcIngtbm93LXJvdXRlLW1hdGNoZXNcIixcbiAgXCJ4LW1hdGNoZWQtcGF0aFwiLFxuICBcIngtbmV4dGpzLWRhdGFcIixcbiAgXCJ4LW5leHQtcmVzdW1lLXN0YXRlLWxlbmd0aFwiLFxuICBcIm5leHQtcmVzdW1lXCIsXG5dKTtcblxuLyoqXG4gKiBUaGUgcmVxdWVzdCBoZWFkZXJzIHdpdGgge0BsaW5rIElOVEVSTkFMX0hFQURFUlN9IHJlbW92ZWQsIGFuZCBgeC1uZXh0anMtZGF0YWBcbiAqIHB1dCBiYWNrIGZvciBhIGBfbmV4dC9kYXRhYCByZXF1ZXN0LCB3aGljaCBpcyB3aGF0IGBuZXh0IHN0YXJ0YCdzXG4gKiBgcmVzb2x2ZVJvdXRlc2AgZG9lcyAoYHNldElzTmV4dERhdGFSZXF1ZXN0YCkgcmlnaHQgYWZ0ZXIgc3RyaXBwaW5nIGl0OiB0aGVcbiAqIGhlYWRlciBpcyBpbnRlcm5hbCwgYnV0IE5leHQncyBoYW5kbGVycyBhbmQgbWlkZGxld2FyZSBzdGlsbCByZWFkIGl0IOKAlCBpdCBpc1xuICogaG93IGEgZGF0YSByZXF1ZXN0IGdldHMgYHgtbmV4dGpzLW1hdGNoZWQtcGF0aGAg4oCUIHNvIGEgcmVhbCBkYXRhIHJlcXVlc3QgaGFzXG4gKiB0byBrZWVwIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aG91dEludGVybmFsSGVhZGVycyhcbiAgaGVhZGVyczogSW5jb21pbmdIdHRwSGVhZGVycyxcbiAgdGFyZ2V0OiBzdHJpbmcsXG4gIGJhc2VQYXRoOiBzdHJpbmcsXG4pOiBJbmNvbWluZ0h0dHBIZWFkZXJzIHtcbiAgY29uc3QgZmlsdGVyZWQ6IEluY29taW5nSHR0cEhlYWRlcnMgPSB7fTtcbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpKSB7XG4gICAgaWYgKCFJTlRFUk5BTF9IRUFERVJTLmhhcyhuYW1lKSkge1xuICAgICAgZmlsdGVyZWRbbmFtZV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgY29uc3QgcGF0aG5hbWUgPSB3aXRob3V0UGF0aFByZWZpeCh0YXJnZXQuc3BsaXQoXCI/XCIpWzBdLCBiYXNlUGF0aCk7XG4gIGlmIChwYXRobmFtZS5zdGFydHNXaXRoKFwiL19uZXh0L2RhdGEvXCIpICYmIHBhdGhuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICBmaWx0ZXJlZFtcIngtbmV4dGpzLWRhdGFcIl0gPSBcIjFcIjtcbiAgfVxuICByZXR1cm4gZmlsdGVyZWQ7XG59XG5cbi8qKiBFdmVyeSByb3V0ZSB0byBpbnZhbGlkYXRlLCBlYWNoIG9uY2UsIGluIG9uZSBDbG91ZEZyb250IGludmFsaWRhdGlvbi4gKi9cbnR5cGUgUmV2YWxpZGF0ZWRQYWdlSG9vayA9IChyb3V0ZXM6IHJlYWRvbmx5IHN0cmluZ1tdKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4vKipcbiAqIEludmFsaWRhdGUgdGhlIENETiBjb3BpZXMgb2YgYSBwYWdlIGByZXMucmV2YWxpZGF0ZSgpYCBqdXN0IHJlZ2VuZXJhdGVkOiBpdHNcbiAqIEhUTUwgYW5kIFJTQyBwYXlsb2FkLCBhbmQgaXRzIFBhZ2VzIFJvdXRlciBgX25leHQvZGF0YWAgSlNPTi4gV2l0aG91dCB0aGlzIHRoZVxuICogZnJlc2ggZW50cnkgc2F0IGJlaGluZCBDbG91ZEZyb250J3MgY29weSBvZiB0aGUgb2xkIG9uZSBmb3IgdGhlIHBhZ2UncyB3aG9sZVxuICogYHMtbWF4YWdlYCDigJQgYSB5ZWFyLCBmb3IgYW4gb24tZGVtYW5kLW9ubHkgSVNSIHBhZ2UuIGByZXZhbGlkYXRlUGF0aGAgYW5kXG4gKiBgcmV2YWxpZGF0ZVRhZ2AgZ28gdGhyb3VnaCB0aGUgY2FjaGUgaGFuZGxlcidzIGByZXZhbGlkYXRlVGFnYCwgd2hpY2ggYWxyZWFkeVxuICogaW52YWxpZGF0ZXM7IGByZXMucmV2YWxpZGF0ZSgpYCBkb2VzIG5vdCB0b3VjaCBpdC5cbiAqXG4gKiBFdmVyeSByb3V0ZSBpcyB3aXRob3V0IGBiYXNlUGF0aGAsIHdoaWNoIHRoZSBob29rIHByZWZpeGVzLiBBIG5vLW9wIG91dHNpZGVcbiAqIHRoZSBHbG9iYWwgY29uc3RydWN0cywgd2hlcmUgbm8gaG9vayBpcyByZWdpc3RlcmVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBpbnZhbGlkYXRlUmV2YWxpZGF0ZWRQYWdlKFxuICB1cmxQYXRoOiBzdHJpbmcsXG4gIG1hbmlmZXN0OiBBZGFwdGVyTWFuaWZlc3QsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgaG9vayA9IChnbG9iYWxUaGlzIGFzIFJlY29yZDxzeW1ib2wsIHVua25vd24+KVtcbiAgICBSRVZBTElEQVRFRF9QQUdFX0hPT0tcbiAgXSBhcyBSZXZhbGlkYXRlZFBhZ2VIb29rIHwgdW5kZWZpbmVkO1xuICBpZiAodHlwZW9mIGhvb2sgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCByb3V0ZSA9IHdpdGhvdXRQYXRoUHJlZml4KFxuICAgIHVybFBhdGguc3BsaXQoXCI/XCIpWzBdLFxuICAgIG1hbmlmZXN0LmNvbmZpZy5iYXNlUGF0aCxcbiAgKTtcbiAgdHJ5IHtcbiAgICAvLyBPbmUgY2FsbCwgZGVkdXBsaWNhdGVkOiB0aGUgZGVmYXVsdCBsb2NhbGUncyB0d28gcGFpcnMgc2hhcmUgYSBkYXRhXG4gICAgLy8gcm91dGUsIGFuZCBlYWNoIGludmFsaWRhdGlvbiBwYXRoIGNvdW50cyBhZ2FpbnN0IENsb3VkRnJvbnQncyBxdW90YS5cbiAgICBhd2FpdCBob29rKFsuLi5uZXcgU2V0KHJldmFsaWRhdGVkUGFnZVJvdXRlcyhyb3V0ZSwgbWFuaWZlc3QpLmZsYXQoKSldKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBUaGUgcmVnZW5lcmF0aW9uIGl0c2VsZiBzdWNjZWVkZWQ7IHRoZSBlZGdlIGNhdGNoZXMgdXAgYXQgYHMtbWF4YWdlYC5cbiAgICBjb25zb2xlLndhcm4oYENvdWxkIG5vdCBpbnZhbGlkYXRlIHRoZSBDRE4gY29weSBvZiAke3VybFBhdGh9OmAsIGVycm9yKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBgW3JvdXRlLCBkYXRhUm91dGVdYCBwYWlycyBhIHJldmFsaWRhdGVkIHBhZ2UgaXMgY2FjaGVkIHVuZGVyIGF0IHRoZSBlZGdlLlxuICpcbiAqIEluIGFuIGkxOG4gYXBwIHRoZSBOZXh0IGNsaWVudCBhbHdheXMgcHV0cyB0aGUgbG9jYWxlIGluIGEgZGF0YSBocmVmLCB0aGVcbiAqIGRlZmF1bHQgbG9jYWxlIGluY2x1ZGVkIChgL19uZXh0L2RhdGEvPGlkPi9lbi9ibG9nLmpzb25gLCBhbmQgYOKApi9lbi5qc29uYCBmb3JcbiAqIHRoZSByb290KSwgc28gdGhlIHVucHJlZml4ZWQgZGF0YSByb3V0ZSBuYW1lcyBub3RoaW5nIENsb3VkRnJvbnQgaG9sZHMuIFRoZVxuICogcGFnZSBpcyBvbmUgbG9jYWxlJ3Mg4oCUIGByZXMucmV2YWxpZGF0ZShcIi9ibG9nXCIpYCByZWdlbmVyYXRlcyB0aGUgZGVmYXVsdFxuICogbG9jYWxlJ3MsIGBcIi9mci9ibG9nXCJgIEZyZW5jaCDigJQgYW5kIHRoZSBkZWZhdWx0IGxvY2FsZSdzIEhUTUwgaXMgcmVhY2hhYmxlLFxuICogYW5kIGNhY2hlZCwgYm90aCB3aXRoIGFuZCB3aXRob3V0IGl0cyBwcmVmaXgsIHNvIGl0cyB0d28gcGFpcnMgc2hhcmUgYSBkYXRhXG4gKiByb3V0ZSwgd2hpY2ggdGhlIGNhbGxlciBzZW5kcyBvbmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmV2YWxpZGF0ZWRQYWdlUm91dGVzKFxuICByb3V0ZTogc3RyaW5nLFxuICBtYW5pZmVzdDogUGljazxBZGFwdGVyTWFuaWZlc3QsIFwiYnVpbGRJZFwiIHwgXCJjb25maWdcIj4sXG4pOiBBcnJheTxbc3RyaW5nLCBzdHJpbmddPiB7XG4gIGNvbnN0IGRhdGFSb3V0ZSA9IChwYWdlOiBzdHJpbmcpID0+XG4gICAgYC9fbmV4dC9kYXRhLyR7bWFuaWZlc3QuYnVpbGRJZH0ke1xuICAgICAgcGFnZSA9PT0gXCIvXCIgPyBcIi9pbmRleFwiIDogcGFnZS5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpXG4gICAgfS5qc29uYDtcbiAgY29uc3QgaTE4biA9IG1hbmlmZXN0LmNvbmZpZy5pMThuIGFzIHtcbiAgICByZWFkb25seSBsb2NhbGVzPzogcmVhZG9ubHkgc3RyaW5nW107XG4gICAgcmVhZG9ubHkgZGVmYXVsdExvY2FsZT86IHN0cmluZztcbiAgfSB8IG51bGw7XG4gIGlmICghaTE4bj8uZGVmYXVsdExvY2FsZSkge1xuICAgIHJldHVybiBbW3JvdXRlLCBkYXRhUm91dGUocm91dGUpXV07XG4gIH1cbiAgY29uc3QgeyBkZWZhdWx0TG9jYWxlIH0gPSBpMThuO1xuICBjb25zdCBzZWdtZW50ID0gcm91dGUuc3BsaXQoXCIvXCIpWzFdID8/IFwiXCI7XG4gIGNvbnN0IGxvY2FsZSA9IChpMThuLmxvY2FsZXMgPz8gW10pLmluY2x1ZGVzKHNlZ21lbnQpXG4gICAgPyBzZWdtZW50XG4gICAgOiBkZWZhdWx0TG9jYWxlO1xuICBjb25zdCBwYWdlID1cbiAgICBsb2NhbGUgPT09IHNlZ21lbnQgPyB3aXRob3V0UGF0aFByZWZpeChyb3V0ZSwgYC8ke3NlZ21lbnR9YCkgOiByb3V0ZTtcbiAgY29uc3QgbG9jYWxpemVkID0gcGFnZSA9PT0gXCIvXCIgPyBgLyR7bG9jYWxlfWAgOiBgLyR7bG9jYWxlfSR7cGFnZX1gO1xuICAvLyBUaGUgcm9vdCdzIGRhdGEgcm91dGUgaXMgdGhlIGxvY2FsZSBpdHNlbGYsIG5vdCBgLzxsb2NhbGU+L2luZGV4YC5cbiAgY29uc3QgbG9jYWxpemVkRGF0YSA9IGAvX25leHQvZGF0YS8ke21hbmlmZXN0LmJ1aWxkSWR9JHtsb2NhbGl6ZWQucmVwbGFjZSgvXFwvKyQvLCBcIlwiKX0uanNvbmA7XG4gIHJldHVybiBsb2NhbGUgPT09IGRlZmF1bHRMb2NhbGVcbiAgICA/IFtcbiAgICAgICAgW3BhZ2UsIGxvY2FsaXplZERhdGFdLFxuICAgICAgICBbbG9jYWxpemVkLCBsb2NhbGl6ZWREYXRhXSxcbiAgICAgIF1cbiAgICA6IFtbbG9jYWxpemVkLCBsb2NhbGl6ZWREYXRhXV07XG59XG5cbmZ1bmN0aW9uIGFzRXJyb3IoZXJyb3I6IHVua25vd24pOiBFcnJvciB7XG4gIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSk7XG59XG5cbi8qKlxuICogUmVhZCB0aGUgbWFuaWZlc3QgYW5kIHBpbiB0aGUgbGF5b3V0IGl0IGRlc2NyaWJlcy5cbiAqXG4gKiBgcHJvY2Vzcy5jd2QoKWAgaXMgbG9hZC1iZWFyaW5nIGFuZCB0aGVyZSBpcyBleGFjdGx5IG9uZSBjaGFuY2UgdG8gZ2V0IGl0XG4gKiByaWdodDogTmV4dC5qcyBpbmxpbmVzIGByZWxhdGl2ZShidWlsZEN3ZCwgcHJvamVjdERpcilgIGludG8gZXZlcnkgZW50cnlwb2ludFxuICogYW5kIHJlc29sdmVzIGl0IGFnYWluc3QgdGhlICpydW50aW1lKiBjd2QgdG8gZmluZFxuICogYHJlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uYCwgdGhlIHByZXJlbmRlciBtYW5pZmVzdCwgYW5kIHRoZSBhcHAncyBjaHVua3MuXG4gKiBgYXNzZXJ0QnVpbGRDd2RgIGluIGBidWlsZC1vdXRwdXRzLnRzYCBrZWVwcyB0aGF0IGlubGluZWQgdmFsdWUgYFwiXCJgLCBzbyB0aGVcbiAqIHdob2xlIGludmFyaWFudCByZWR1Y2VzIHRvIFwiY3dkIGlzIHRoZSBzdGFnZWQgcHJvamVjdCBkaXJcIiDigJQgYXNzZXJ0ZWQgcmF0aGVyXG4gKiB0aGFuIGFzc3VtZWQsIGJlY2F1c2UgZ2V0dGluZyBpdCB3cm9uZyBwcm9kdWNlcyBhXG4gKiBgQ2Fubm90IGZpbmQgbW9kdWxlIOKApi9yZXF1aXJlZC1zZXJ2ZXItZmlsZXMuanNvbmAgZnJvbSBpbnNpZGUgY29tcGlsZWQgTmV4dC5qc1xuICogY29kZSB3aXRoIG5vIGluZGljYXRpb24gdGhhdCB0aGUgbGF5b3V0IGlzIHRoZSBwcm9ibGVtLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFJ1bnRpbWUoXG4gIGRlcGxveW1lbnRSb290OiBzdHJpbmcsXG4pOiBQcm9taXNlPE5leHRqc1J1bnRpbWU+IHtcbiAgY29uc3QgbWFuaWZlc3RQYXRoID0gZGVwbG95ZWRNYW5pZmVzdFBhdGgoZGVwbG95bWVudFJvb3QpO1xuICBsZXQgbWFuaWZlc3Q6IEFkYXB0ZXJNYW5pZmVzdDtcbiAgdHJ5IHtcbiAgICBtYW5pZmVzdCA9IEpTT04ucGFyc2UoYXdhaXQgcmVhZEZpbGUobWFuaWZlc3RQYXRoLCBcInV0Zi04XCIpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQ291bGQgbm90IHJlYWQgdGhlIGNkay1uZXh0anMgYWRhcHRlciBtYW5pZmVzdCBhdCBcIiR7bWFuaWZlc3RQYXRofVwiLiBgICtcbiAgICAgICAgYFRoZSBkZXBsb3ltZW50IHBhY2thZ2UgaXMgaW5jb21wbGV0ZTogc3ludGggY29waWVzIGAgK1xuICAgICAgICBgJHtNQU5JRkVTVF9GSUxFX05BTUV9IGluIG5leHQgdG8gdGhlIGJ1bmRsZWQgcnVudGltZS5gLFxuICAgICAgeyBjYXVzZTogZXJyb3IgfSxcbiAgICApO1xuICB9XG5cbiAgY29uc3QgcHJvamVjdERpciA9IGpvaW4oZGVwbG95bWVudFJvb3QsIG1hbmlmZXN0LnJlbGF0aXZlUHJvamVjdERpcik7XG4gIGNvbnN0IHByb2JlID0gam9pbihcbiAgICBwcm9qZWN0RGlyLFxuICAgIG1hbmlmZXN0LmNvbmZpZy5kaXN0RGlyLFxuICAgIFwicmVxdWlyZWQtc2VydmVyLWZpbGVzLmpzb25cIixcbiAgKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCByZWFkRmlsZShwcm9iZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRoZSBkZXBsb3ltZW50IHJvb3QgXCIke2RlcGxveW1lbnRSb290fVwiIGRvZXMgbm90IGNvbnRhaW4gdGhlIHN0YWdlZCBgICtcbiAgICAgICAgYE5leHQuanMgcHJvamVjdDogZXhwZWN0ZWQgXCIke3Byb2JlfVwiIHRvIGV4aXN0LiBFdmVyeSBidWlsdCBlbnRyeXBvaW50IGAgK1xuICAgICAgICBgcmVzb2x2ZXMgaXRzIG93biBwYXRocyBhZ2FpbnN0IHByb2Nlc3MuY3dkKCksIHNvIHRoaXMgbGF5b3V0IGlzIHBhcnQgYCArXG4gICAgICAgIGBvZiB0aGUgY29udHJhY3QsIG5vdCBhIGNvbnZlbmllbmNlLmAsXG4gICAgICB7IGNhdXNlOiBlcnJvciB9LFxuICAgICk7XG4gIH1cbiAgLy8gYG5leHQgc3RhcnRgIGZvcmNlcyB0aGlzLCBhbmQgZXh0ZXJuYWxpemVkIHBhY2thZ2VzIChSZWFjdCBmb3IgUGFnZXMgUm91dGVyXG4gIC8vIFNTUiwgYW55dGhpbmcgaW4gYHNlcnZlckV4dGVybmFsUGFja2FnZXNgKSBwaWNrIHRoZWlyIGRldiBvciBwcm9kIGJ1aWxkIGZyb21cbiAgLy8gaXQgYXQgcmVxdWlyZSB0aW1lLiBUaGUgQ29udGFpbmVycyBEb2NrZXJmaWxlcyBzZXQgaXQgYW5kIHRoZSBGdW5jdGlvbnNcbiAgLy8gY29uc3RydWN0cyBkbyB0b287IHRoaXMgY292ZXJzIGEgaGFuZC13aXJlZCBmdW5jdGlvbi4gQmVmb3JlIGFueSBgcmVxdWlyZWAuXG4gIC8vIChgbmV4dGAncyB0eXBpbmdzIGRlY2xhcmUgTk9ERV9FTlYgcmVhZC1vbmx5LilcbiAgKHByb2Nlc3MuZW52IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4pLk5PREVfRU5WID8/PSBcInByb2R1Y3Rpb25cIjtcbiAgcHJvY2Vzcy5jaGRpcihwcm9qZWN0RGlyKTtcbiAgLy8gQmVmb3JlIGFueXRoaW5nIGNhbiBzZXJ2ZSBhIHJlcXVlc3Q6IHRoZSBydW50aW1lJ3Mgb3duIGBuZXh0YCBpbXBvcnRzIHJlc29sdmVcbiAgLy8gb3V0IG9mIHRoZSBzdGFnZWQgYXBwLCBub3Qgb3V0IG9mIHRoZSBzaGVsbCdzIGRpcmVjdG9yeS4gU2VlIGBuZXh0LW1vZHVsZXMudHNgLlxuICB1c2VOZXh0RnJvbShwcm9qZWN0RGlyKTtcbiAgLy8gQmVmb3JlIGFueSBlbnRyeXBvaW50IGNhbiByZWFkIHRoZW0gYXQgbW9kdWxlIHNjb3BlLlxuICBsb2FkRW52RmlsZXMocHJvamVjdERpcik7XG4gIC8vIFRoZW4sIGJlZm9yZSBhbnkgZW50cnlwb2ludCAob3IgbWlkZGxld2FyZSkgY2FuIGJlIGxvYWRlZDogTmV4dCdzIG93blxuICAvLyBub2RlLWVudmlyb25tZW50IGJvb3RzdHJhcC4gU2VlIGBzZXR1cE5vZGVFbnZpcm9ubWVudGAuXG4gIHNldHVwTm9kZUVudmlyb25tZW50KCk7XG4gIC8vIEFuZCBsYXN0LCBvbmNlIHRoZSBlbnZpcm9ubWVudCBpcyByZWFkeTogYHJlZ2lzdGVyKClgLCBiZWZvcmUgYW55IGVudHJ5cG9pbnRcbiAgLy8gb3IgbWlkZGxld2FyZSBtb2R1bGUgaXMgZXZhbHVhdGVkLiBTZWUgYHJlZ2lzdGVySW5zdHJ1bWVudGF0aW9uYC5cbiAgYXdhaXQgcmVnaXN0ZXJJbnN0cnVtZW50YXRpb24ocHJvamVjdERpciwgbWFuaWZlc3QuY29uZmlnLmRpc3REaXIpO1xuXG4gIHJldHVybiBuZXcgTmV4dGpzUnVudGltZSh7XG4gICAgZGVwbG95bWVudFJvb3QsXG4gICAgbWFuaWZlc3QsXG4gICAgYnVja2V0OiBwcm9jZXNzLmVudi5DREtfTkVYVEpTX1NUQVRJQ19BU1NFVFNfQlVDS0VUX05BTUUsXG4gICAgYnVja2V0S2V5UHJlZml4OiBwcm9jZXNzLmVudi5DREtfTkVYVEpTX1NUQVRJQ19BU1NFVFNfS0VZX1BSRUZJWCxcbiAgfSk7XG59XG5cbi8qKlxuICogQSBzeW50YWN0aWNhbGx5IHZhbGlkIGBob3N0Wzpwb3J0XWA6IGEgcmVnaXN0ZXJlZCBuYW1lIG9yIGEgYnJhY2tldGVkIElQdjZcbiAqIGxpdGVyYWwsIG9wdGlvbmFsbHkgd2l0aCBhIHBvcnQuIEFueXRoaW5nIGVsc2UgY2Fubm90IGJlIHRoZSBhdXRob3JpdHkgb2YgYVxuICogVVJMLlxuICovXG5jb25zdCBIT1NUX0FVVEhPUklUWSA9IC9eKD86XFxbWzAtOUEtRmEtZjouXStcXF18WzAtOUEtWmEtei5fLV0rKSg/OjpcXGR7MSw1fSk/JC87XG5cbi8qKlxuICogVGhlIGZpcnN0IHZhbHVlIHRoYXQgaXMgYWN0dWFsbHkgdXNhYmxlIGFzIGFuIGF1dGhvcml0eSwgb3IgYHVuZGVmaW5lZGAuXG4gKlxuICogYHgtZm9yd2FyZGVkLWhvc3RgIGNhbiBhcnJpdmUgYXMgYSBsaXN0IHdoZW4gbW9yZSB0aGFuIG9uZSBwcm94eSBhcHBlbmRzIHRvXG4gKiBpdC4gVmFsaWRhdGluZyBpcyB3aGF0IGtlZXBzIGEgbWFsZm9ybWVkIHZhbHVlIGZyb20gbWFraW5nIHRoZSBgVVJMYFxuICogY29uc3RydWN0b3IgdGhyb3cg4oCUIHdoaWNoIG9uIHRoZSBMYW1iZGEgc2hlbGxzIGlzIGFuIGludm9jYXRpb24gZXJyb3IgYW5kIGFcbiAqIDUwMiwgbm90IGEgcmVzcG9uc2UuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkQXV0aG9yaXR5KFxuICB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQsXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBjYW5kaWRhdGUgPSBmaXJzdFZhbHVlKHZhbHVlKT8uc3BsaXQoXCIsXCIpWzBdLnRyaW0oKTtcbiAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBIT1NUX0FVVEhPUklUWS50ZXN0KGNhbmRpZGF0ZSkgPyBjYW5kaWRhdGUgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogYHJlc29sdmVSb3V0ZXNgIG5lZWRzIGFuIGFic29sdXRlIFVSTCwgYW5kIGl0IGJlY29tZXMgdGhlIG9yaWdpbiBldmVyeVxuICogYWJzb2x1dGUgVVJMIHRoZSBhcHAgYnVpbGRzIHN0YXJ0cyB3aXRoIOKAlCBgcmVxLm5leHRVcmwub3JpZ2luYCBpbiBtaWRkbGV3YXJlLFxuICogYGluaXRVUkxgIGZvciBhIHJvdXRlIGhhbmRsZXIg4oCUIHNvIGl0cyBob3N0IGhhcyB0byBiZSBvbmUgdGhlIGNsaWVudCBjYW5ub3RcbiAqIHBpY2suXG4gKlxuICogVGhhdCBpcyBgSG9zdGAgb24gZXZlcnkgZGVwbG95bWVudCBidXQgb25lOiBDbG91ZEZyb250IGZvcndhcmRzIHRoZSB2aWV3ZXInc1xuICogYEhvc3RgIHRvIGEgY29udGFpbmVyIG9yaWdpbiAoYEFMTF9WSUVXRVJgKSwgYW4gQUxCIHBhc3NlcyBpdCB0aHJvdWdoLCBhbmQgQVBJXG4gKiBHYXRld2F5IHNldHMgaXRzIG93biBkb21haW4uIFRoZSBleGNlcHRpb24gaXMgYSBMYW1iZGEgRnVuY3Rpb24gVVJMLCB3aGVyZVxuICogQ2xvdWRGcm9udCBoYXMgdG8gc2VuZCB0aGUgVVJMJ3Mgb3duIGRvbWFpbiBhcyBgSG9zdGAgYW5kIHB1dHMgdGhlIHZpZXdlcidzIGluXG4gKiBgeC1mb3J3YXJkZWQtaG9zdGA7IHNlZSB7QGxpbmsgUnVudGltZVJlcXVlc3QudHJ1c3RGb3J3YXJkZWRIb3N0fS4gQW55d2hlcmVcbiAqIGVsc2UgdGhlIGhlYWRlciBpcyB0aGUgY2xpZW50J3MsIGFuZCBob25vcmluZyBpdCBsZXQgYSByZXF1ZXN0IHdpdGhcbiAqIGBYLUZvcndhcmRlZC1Ib3N0OiBldmlsLmV4YW1wbGVgIHBvaW50IGEgcGFzc3dvcmQtcmVzZXQgbGluayBhdCBldmlsLmV4YW1wbGUg4oCUXG4gKiBhbmQsIG9uIEdsb2JhbCBDb250YWluZXJzLCBoYXZlIENsb3VkRnJvbnQgY2FjaGUgdGhhdCBwYWdlLCBzaW5jZSB0aGUgaGVhZGVyXG4gKiBpcyBub3QgaW4gaXRzIGNhY2hlIGtleS5cbiAqL1xuZnVuY3Rpb24gYWJzb2x1dGVVcmwocmVxdWVzdDogUnVudGltZVJlcXVlc3QpOiBVUkwge1xuICBjb25zdCBob3N0ID1cbiAgICAocmVxdWVzdC50cnVzdEZvcndhcmRlZEhvc3RcbiAgICAgID8gdmFsaWRBdXRob3JpdHkocmVxdWVzdC5oZWFkZXJzW1wieC1mb3J3YXJkZWQtaG9zdFwiXSlcbiAgICAgIDogdW5kZWZpbmVkKSA/P1xuICAgIHZhbGlkQXV0aG9yaXR5KHJlcXVlc3QuaGVhZGVycy5ob3N0KSA/P1xuICAgIFwibG9jYWxob3N0XCI7XG4gIC8vIEJlaGluZCBDbG91ZEZyb250IG9uIEdsb2JhbCBDb250YWluZXJzIHRoZSBjb250YWluZXIgc2hlbGwgaGFzIGFscmVhZHkgcHV0XG4gIC8vIHRoZSB2aWV3ZXIncyBwcm90b2NvbCBoZXJlOyBzZWUgYHRydXN0Q2xvdWRGcm9udFByb3RvYCBpbiBodHRwL25vZGUtc2VydmVyLnRzLlxuICBjb25zdCBmb3J3YXJkZWRQcm90byA9IGZpcnN0VmFsdWUocmVxdWVzdC5oZWFkZXJzW1wieC1mb3J3YXJkZWQtcHJvdG9cIl0pXG4gICAgPy5zcGxpdChcIixcIilbMF1cbiAgICAudHJpbSgpXG4gICAgLnRvTG93ZXJDYXNlKCk7XG4gIC8vIENsaWVudC1zdXBwbGllZCB3aGVyZSBubyBwcm94eSBvdmVyd3JpdGVzIGl0LCBidXQgaGFybWxlc3M6IHRoZSBob3N0IGlzXG4gIC8vIGFscmVhZHkgZml4ZWQsIGFuZCBhbnl0aGluZyBidXQgdGhlc2UgdHdvIHdvdWxkIG5vdCBwYXJzZS5cbiAgY29uc3QgcHJvdG8gPVxuICAgIGZvcndhcmRlZFByb3RvID09PSBcImh0dHBcIiB8fCBmb3J3YXJkZWRQcm90byA9PT0gXCJodHRwc1wiXG4gICAgICA/IGZvcndhcmRlZFByb3RvXG4gICAgICA6IHJlcXVlc3QuZW5jcnlwdGVkID09PSBmYWxzZVxuICAgICAgICA/IFwiaHR0cFwiXG4gICAgICAgIDogXCJodHRwc1wiO1xuICByZXR1cm4gbmV3IFVSTChyZXF1ZXN0LnVybCwgYCR7cHJvdG99Oi8vJHtob3N0fWApO1xufVxuXG5mdW5jdGlvbiBwaWNrRGVmaW5lZChcbiAgaGVhZGVyczogSW5jb21pbmdIdHRwSGVhZGVycyxcbiAgbmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuKTogSW5jb21pbmdIdHRwSGVhZGVycyB7XG4gIGNvbnN0IHBpY2tlZDogSW5jb21pbmdIdHRwSGVhZGVycyA9IHt9O1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICBpZiAoaGVhZGVyc1tuYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwaWNrZWRbbmFtZV0gPSBoZWFkZXJzW25hbWVdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcGlja2VkO1xufVxuXG4vKipcbiAqIGBub3JtYWxpemVSZXBlYXRlZFNsYXNoZXNgIChgbmV4dC9kaXN0L3NoYXJlZC9saWIvdXRpbHMuanNgKSwgYXBwbGllZCB3aGVyZVxuICogTmV4dC5qcyBhcHBsaWVzIGl0OiBiZWZvcmUgcm91dGluZywgYXMgYSAzMDggdG8gdGhlIGNvbGxhcHNlZCBwYXRoLlxuICogYGJhc2Utc2VydmVyLnRzYCBkb2VzIGBpZiAodXJsTm9RdWVyeT8ubWF0Y2goLyhcXFxcfFxcL1xcLykvKSlcbiAqIHJlcy5yZWRpcmVjdChub3JtYWxpemVSZXBlYXRlZFNsYXNoZXMocmVxLnVybCksIDMwOClgLCBzbyBgL2EvL2JgIGFuZCBgL2FcXGJgXG4gKiBib3RoIGFuc3dlciBhIHJlZGlyZWN0IHRvIGAvYS9iYCByYXRoZXIgdGhhbiBhIDQwNCAtIGFuZCBgQG5leHQvcm91dGluZ2Anc1xuICogYHJlc29sdmVSb3V0ZXNgIGRvZXMgbm90IGRvIGl0IGZvciB1cywgd2hpY2ggaXMgaG93IGAvL2AgcmVhY2hlZCB0aGlzIHJ1bnRpbWUgYXNcbiAqIGEgNTAwIGFuZCBgL2FwaS8vanNvbmAgYXMgYSA0MDQuXG4gKlxuICogRW5jb2RlZCBiYWNrc2xhc2hlcyBhcmUgbGVmdCBhbG9uZSwgYXMgTmV4dC5qcyBsZWF2ZXMgdGhlbTogYCU1Q2AgaXMgYSBsaXRlcmFsXG4gKiBjaGFyYWN0ZXIgaW4gYSBwYXRoIHNlZ21lbnQsIG5vdCBhIHNlcGFyYXRvci5cbiAqXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgaXMgbm90aGluZyB0byBjb2xsYXBzZSwgd2hpY2ggaXMgdGhlIGNvbW1vbiBjYXNlLlxuICovXG5mdW5jdGlvbiBjb2xsYXBzZVJlcGVhdGVkU2xhc2hlcyh0YXJnZXQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhcnRzID0gdGFyZ2V0LnNwbGl0KFwiP1wiKTtcbiAgY29uc3QgcGF0aG5hbWUgPSBwYXJ0c1swXTtcbiAgaWYgKCEvXFxcXHxcXC9cXC8vLnRlc3QocGF0aG5hbWUpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBxdWVyeSA9IHBhcnRzLmxlbmd0aCA+IDEgPyBgPyR7cGFydHMuc2xpY2UoMSkuam9pbihcIj9cIil9YCA6IFwiXCI7XG4gIHJldHVybiBwYXRobmFtZS5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKS5yZXBsYWNlKC9cXC9cXC8rL2csIFwiL1wiKSArIHF1ZXJ5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNwbGl0Qm9keSB7XG4gIC8qKiBXaGF0IGByZXFgIHJlYWRzOiB0aGUgZW50cnlwb2ludCdzIGNvcHkuICovXG4gIHJlYWRvbmx5IGZvclJlcXVlc3Q/OiBSZWFkYWJsZSB8IEJ1ZmZlcjtcbiAgLyoqIFdoYXQgYHJlc29sdmVSb3V0ZXNgIGhhbmRzIG1pZGRsZXdhcmUuICovXG4gIHJlYWRvbmx5IGZvckRpc3BhdGNoOiBSZWFkYWJsZVN0cmVhbTtcbiAgLyoqXG4gICAqIENhbGxlZCBvbmNlIGRpc3BhdGNoIGhhcyByZXR1cm5lZCwgd2l0aCB3aGV0aGVyIG1pZGRsZXdhcmUgYW5zd2VyZWQgdGhlXG4gICAqIHJlcXVlc3QgaXRzZWxmLiBMZXRzIGdvIG9mIHdoaWNoZXZlciBjb3B5IG5vdGhpbmcgd2lsbCByZWFkIGFueSBtb3JlLlxuICAgKi9cbiAgcmVsZWFzZVVucmVhZChtaWRkbGV3YXJlUmVzcG9uZGVkOiBib29sZWFuKTogdm9pZDtcbn1cblxuLyoqXG4gKiBgcmVzb2x2ZVJvdXRlc2AgaGFuZHMgYHJlcXVlc3RCb2R5YCB0byBtaWRkbGV3YXJlLCB3aGljaCBjb25zdW1lcyBpdCwgd2hpbGUgdGhlXG4gKiBlbnRyeXBvaW50IG5lZWRzIHRoZSBzYW1lIGJ5dGVzIOKAlCB0aGUgc2FtZSBwcm9ibGVtIGBuZXh0LXNlcnZlcmAgc29sdmVzIHdpdGhcbiAqIGBnZXRDbG9uZWFibGVCb2R5KClgLiBPbmx5IHNwbGl0IHdoZW4gdGhlcmUgaXMgbWlkZGxld2FyZSB0byBmZWVkOiB0ZWVpbmcgY29zdHNcbiAqIGEgYnVmZmVyIGNvcHkgb2YgZXZlcnkgdXBsb2FkIG9uIGEgcGF0aCB0aGF0IHdvdWxkIG90aGVyd2lzZSBiZSBhIHN0cmFpZ2h0IHBpcGUuXG4gKlxuICogQSBgdGVlKClgIGJ1ZmZlcnMsIGZvciB0aGUgYnJhbmNoIHRoYXQgaXMgYmVoaW5kLCBldmVyeSBjaHVuayB0aGUgb3RoZXIgb25lXG4gKiBoYXMgcmVhZCDigJQgc28gYSBicmFuY2ggdGhhdCBpcyBuZXZlciByZWFkIGhvbGRzIHRoZSB3aG9sZSBib2R5LiBNaWRkbGV3YXJlXG4gKiB0aGF0IGRvZXNuJ3QgcmVhZCB0aGUgYm9keSBpcyB0aGUgY29tbW9uIGNhc2UgKGFuZCBpdHMgbWF0Y2hlciBtYXkgbm90IGV2ZW5cbiAqIGhhdmUgcnVuIGl0KSwgYWZ0ZXIgd2hpY2ggdGhlIGVudHJ5cG9pbnQgc3RyZWFtaW5nIGFuIHVwbG9hZCB3b3VsZCBwaWxlIGFsbFxuICogb2YgaXQgdXAgaW4gdGhlIG1pZGRsZXdhcmUgYnJhbmNoOiB0aGUgd2hvbGUgdXBsb2FkIGluIG1lbW9yeSwgb24gYVxuICogY29udGFpbmVyIHRoYXQgc2VydmVzIG90aGVyIHJlcXVlc3RzLiBTbyBvbmNlIGRpc3BhdGNoIHJldHVybnMsIHRoZSBicmFuY2hcbiAqIHdpdGggbm8gcmVhZGVyIGxlZnQgaXMgY2FuY2VsbGVkIOKAlCB0aGUgbWlkZGxld2FyZSBvbmUsIG9yIHRoZSBlbnRyeXBvaW50IG9uZVxuICogd2hlbiBtaWRkbGV3YXJlIGFuc3dlcmVkIGFuZCBgcmVxYCB3aWxsIG5ldmVyIGJlIHJlYWQuIENhbmNlbGxpbmcgb25lXG4gKiBicmFuY2ggbGVhdmVzIHRoZSBzb3VyY2UgYW5kIHRoZSBvdGhlciBicmFuY2ggcnVubmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0Qm9keShcbiAgYm9keTogUmVhZGFibGUgfCBCdWZmZXIgfCB1bmRlZmluZWQsXG4gIGhhc01pZGRsZXdhcmU6IGJvb2xlYW4sXG4pOiBTcGxpdEJvZHkge1xuICBjb25zdCByZWxlYXNlTm90aGluZyA9ICgpOiB2b2lkID0+IHt9O1xuICBpZiAoYm9keSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZvckRpc3BhdGNoOiBuZXcgQmxvYihbXSkuc3RyZWFtKCksXG4gICAgICByZWxlYXNlVW5yZWFkOiByZWxlYXNlTm90aGluZyxcbiAgICB9O1xuICB9XG4gIGlmICghaGFzTWlkZGxld2FyZSkge1xuICAgIHJldHVybiB7XG4gICAgICBmb3JSZXF1ZXN0OiBib2R5LFxuICAgICAgZm9yRGlzcGF0Y2g6IG5ldyBCbG9iKFtdKS5zdHJlYW0oKSxcbiAgICAgIHJlbGVhc2VVbnJlYWQ6IHJlbGVhc2VOb3RoaW5nLFxuICAgIH07XG4gIH1cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihib2R5KSkge1xuICAgIC8vIEFscmVhZHkgZnVsbHkgaW4gbWVtb3J5LCBzbyBcInRlZWluZ1wiIGlzIGp1c3QgcmVhZGluZyBpdCB0d2ljZS5cbiAgICByZXR1cm4ge1xuICAgICAgZm9yUmVxdWVzdDogYm9keSxcbiAgICAgIGZvckRpc3BhdGNoOiBuZXcgQmxvYihbYm9keV0pLnN0cmVhbSgpLFxuICAgICAgcmVsZWFzZVVucmVhZDogcmVsZWFzZU5vdGhpbmcsXG4gICAgfTtcbiAgfVxuICBjb25zdCBbZm9yTWlkZGxld2FyZSwgZm9yRW50cnlwb2ludF0gPSBSZWFkYWJsZS50b1dlYihib2R5KS50ZWUoKTtcbiAgY29uc3QgZm9yUmVxdWVzdCA9IFJlYWRhYmxlLmZyb21XZWIoZm9yRW50cnlwb2ludCBhcyBuZXZlcik7XG4gIHJldHVybiB7XG4gICAgZm9yUmVxdWVzdCxcbiAgICBmb3JEaXNwYXRjaDogZm9yTWlkZGxld2FyZSBhcyBSZWFkYWJsZVN0cmVhbSxcbiAgICByZWxlYXNlVW5yZWFkKG1pZGRsZXdhcmVSZXNwb25kZWQpIHtcbiAgICAgIGlmIChtaWRkbGV3YXJlUmVzcG9uZGVkKSB7XG4gICAgICAgIC8vIGBmcm9tV2ViYCBob2xkcyB0aGUgYnJhbmNoJ3MgcmVhZGVyLCBzbyBpdCBpcyBkZXN0cm95ZWQgcmF0aGVyIHRoYW5cbiAgICAgICAgLy8gY2FuY2VsbGVkOyBpdHMgYF9kZXN0cm95YCBjYW5jZWxzIHRoZSByZWFkZXIuXG4gICAgICAgIGZvclJlcXVlc3QuZGVzdHJveSgpO1xuICAgICAgfSBlbHNlIGlmICghZm9yTWlkZGxld2FyZS5sb2NrZWQpIHtcbiAgICAgICAgLy8gTG9ja2VkIG1lYW5zIG1pZGRsZXdhcmUgdG9vayBhIHJlYWRlcjogaXQgaXMgcmVhZGluZywgb3IgaGFzIHJlYWQsXG4gICAgICAgIC8vIHRoZSBib2R5IGl0c2VsZiwgYW5kIGEgbG9ja2VkIHN0cmVhbSBjYW5ub3QgYmUgY2FuY2VsbGVkIGFueXdheS5cbiAgICAgICAgZm9yTWlkZGxld2FyZS5jYW5jZWwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqIGBJbmNvbWluZ0h0dHBIZWFkZXJzYCDihpIgdGhlIGZsYXQgZW50cmllcyBhIGBIZWFkZXJzYCBjb25zdHJ1Y3RvciBhY2NlcHRzLiAqL1xuZnVuY3Rpb24gdG9XZWJIZWFkZXJzKGhlYWRlcnM6IEluY29taW5nSHR0cEhlYWRlcnMpOiBBcnJheTxbc3RyaW5nLCBzdHJpbmddPiB7XG4gIGNvbnN0IGVudHJpZXM6IEFycmF5PFtzdHJpbmcsIHN0cmluZ10+ID0gW107XG4gIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhoZWFkZXJzKSkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBzaW5nbGUgb2YgQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV0pIHtcbiAgICAgIGVudHJpZXMucHVzaChbbmFtZSwgc2luZ2xlXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbnRyaWVzO1xufVxuXG4vKipcbiAqIGBoZWFkZXJzKClgIHJ1bGVzLCB0aGUgaW1tdXRhYmxlIGBjYWNoZS1jb250cm9sYCBmb3IgYnVpbGQgYXNzZXRzLCBhbmQgYW55dGhpbmdcbiAqIG1pZGRsZXdhcmUgc2V0IHdpdGggYE5leHRSZXNwb25zZS5uZXh0KHsgaGVhZGVycyB9KWAuIEFwcGxpZWQgYmVmb3JlIHRoZVxuICogZW50cnlwb2ludCBydW5zIHNvIHRoYXQgYSByb3V0ZSBjYW4gc3RpbGwgb3ZlcnJpZGUgaXRzIG93bi5cbiAqL1xuZnVuY3Rpb24gYXBwbHlIZWFkZXJzKHJlczogU2hpbVNlcnZlclJlc3BvbnNlLCBoZWFkZXJzOiBIZWFkZXJzKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBoZWFkZXJzLmVudHJpZXMoKSkge1xuICAgIC8vIGBlbnRyaWVzKClgIHlpZWxkcyBgc2V0LWNvb2tpZWAgb25jZSBwZXIgY29va2llLCBzbyBhcHBlbmRpbmcgdGhlIHdob2xlXG4gICAgLy8gYGdldFNldENvb2tpZSgpYCBhcnJheSBoZXJlIHdvdWxkIGVtaXQgTsKyIG9mIHRoZW0g4oCUIHR3byBjb29raWVzIHNldCBieVxuICAgIC8vIG1pZGRsZXdhcmUgYXJyaXZlZCBhcyBbXCJhPTFcIixcImI9MlwiLFwiYT0xXCIsXCJiPTJcIl0uIEhhbmRsZWQgb25jZSwgb3V0c2lkZS5cbiAgICBpZiAobmFtZSA9PT0gXCJzZXQtY29va2llXCIpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICByZXMuc2V0SGVhZGVyKG5hbWUsIHZhbHVlKTtcbiAgfVxuICBmb3IgKGNvbnN0IGNvb2tpZSBvZiBoZWFkZXJzLmdldFNldENvb2tpZSgpKSB7XG4gICAgcmVzLmFwcGVuZEhlYWRlcihcInNldC1jb29raWVcIiwgY29va2llKTtcbiAgfVxufVxuXG4vKipcbiAqIE1pcnJvcnMgTmV4dC5qcydzIG93biByZWRpcmVjdCByZXNwb25zZSAoYGJhc2Utc2VydmVyLnRzYCk6IHRoZSBkZXN0aW5hdGlvbiBpc1xuICogYWxzbyB0aGUgYm9keSwgYW5kIGEgMzA4IGNhcnJpZXMgYSBgUmVmcmVzaGAgaGVhZGVyIGJlY2F1c2Ugc29tZSBjbGllbnRzIGFuZFxuICogaW50ZXJtZWRpYXJpZXMgc3RpbGwgZG8gbm90IGltcGxlbWVudCAzMDguXG4gKi9cbmZ1bmN0aW9uIHNlbmRSZWRpcmVjdChcbiAgcmVzOiBTaGltU2VydmVyUmVzcG9uc2UsXG4gIGxvY2F0aW9uOiBzdHJpbmcsXG4gIHN0YXR1czogbnVtYmVyLFxuKTogdm9pZCB7XG4gIHJlcy5zdGF0dXNDb2RlID0gc3RhdHVzO1xuICByZXMuc2V0SGVhZGVyKFwiTG9jYXRpb25cIiwgbG9jYXRpb24pO1xuICBpZiAoc3RhdHVzID09PSAzMDgpIHtcbiAgICByZXMuc2V0SGVhZGVyKFwiUmVmcmVzaFwiLCBgMDt1cmw9JHtsb2NhdGlvbn1gKTtcbiAgfVxuICByZXMuc2V0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOFwiKTtcbiAgcmVzLmVuZChsb2NhdGlvbik7XG59XG5cbi8qKlxuICogYG5leHQgc3RhcnRgJ3MgYW5zd2VyIHRvIGEgUE9TVCwgUFVUIG9yIERFTEVURSBmb3IgYSBzdGF0aWMgZmlsZTogNDA1IHdpdGhcbiAqIGBBbGxvdzogR0VULCBIRUFEYCAoYHJvdXRlci1zZXJ2ZXIuanNgKS4gSXQgcmVuZGVycyB0aGF0IHRocm91Z2ggYC9fZXJyb3JgO1xuICogdGhpcyBpcyB0aGUgcGxhaW4tdGV4dCBlcXVpdmFsZW50LCBzaW5jZSB0aGUgc3RhdHVzIGFuZCBgQWxsb3dgIGFyZSB3aGF0IGFcbiAqIGNsaWVudCBhY3RzIG9uLlxuICovXG5mdW5jdGlvbiBzZW5kTWV0aG9kTm90QWxsb3dlZChyZXM6IFNoaW1TZXJ2ZXJSZXNwb25zZSk6IHZvaWQge1xuICByZXMuc3RhdHVzQ29kZSA9IDQwNTtcbiAgcmVzLnNldEhlYWRlcihcIkFsbG93XCIsIFwiR0VULCBIRUFEXCIpO1xuICByZXMuc2V0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOFwiKTtcbiAgcmVzLmVuZChcIk1ldGhvZCBOb3QgQWxsb3dlZFwiKTtcbn1cblxuLyoqXG4gKiBSZXF1ZXN0IGhlYWRlcnMge0BsaW5rIHByb3h5RXh0ZXJuYWx9IGRvZXMgbm90IGZvcndhcmQuIFRoZSB1cHN0cmVhbSdzIG93blxuICogYEhvc3RgIG11c3Qgd2luOyB0aGUgcmVzdCBkZXNjcmliZSBvdXIgY29ubmVjdGlvbiwgbm90IHRoZSBwcm94aWVkIG9uZSwgYW5kXG4gKiB1bmRpY2kgdGhyb3dzIG9uIG1vc3Qgb2YgdGhlbSwgd2hpY2ggd291bGQgYW5zd2VyIHRoZSByZXF1ZXN0IHdpdGggYSA1MDAuXG4gKiBOZXh0LmpzJ3MgbGlzdCBmb3IgdGhlIHJlcXVlc3RzIGl0IG1ha2VzIHdpdGggdW5kaWNpIChgaXBjRm9yYmlkZGVuSGVhZGVyc2AsXG4gKiBgbmV4dC9kaXN0L3NlcnZlci9saWIvc2VydmVyLWlwYy91dGlscy5qc2ApLCBwbHVzIGBob3N0YCBhbmQgYHVwZ3JhZGVgLCBtaW51c1xuICogYGNvbnRlbnQtZW5jb2RpbmdgOiBOZXh0IHN0cmlwcyB0aGF0IG92ZXIgYSBib2R5IGl0IGhhcyBhbHJlYWR5IGRlY29kZWQsIHdoaWxlXG4gKiB0aGlzIG9uZSBpcyBmb3J3YXJkZWQgYXMgcmVjZWl2ZWQsIHN0aWxsIGVuY29kZWQuXG4gKi9cbmNvbnN0IFBST1hZX0RST1BQRURfSEVBREVSUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gIFwiaG9zdFwiLFxuICBcInVwZ3JhZGVcIixcbiAgXCJhY2NlcHQtZW5jb2RpbmdcIixcbiAgXCJrZWVwYWxpdmVcIixcbiAgXCJrZWVwLWFsaXZlXCIsXG4gIFwidHJhbnNmZXItZW5jb2RpbmdcIixcbiAgXCJjb25uZWN0aW9uXCIsXG4gIFwiZXhwZWN0XCIsXG5dO1xuXG4vKipcbiAqIFRoZSBTaWdWNCBzaWduYXR1cmUgT3JpZ2luIEFjY2VzcyBDb250cm9sIHB1dCBvbiBhIHJlcXVlc3QgdG8gdGhlIEZ1bmN0aW9uXG4gKiBVUkwsIGFsc28gZHJvcHBlZCBieSB7QGxpbmsgcHJveHlFeHRlcm5hbH0gd2hlbiB0aGUgcmVxdWVzdCB3YXMgSUFNLXZlcmlmaWVkOlxuICogZm9yd2FyZGVkLCBpdCB3b3VsZCBsZXQgdGhlIHRoaXJkLXBhcnR5IG9yaWdpbiByZXBsYXkgdGhlIHJlcXVlc3QgYWdhaW5zdFxuICogdGhlIEZ1bmN0aW9uIFVSTC4gQW55d2hlcmUgZWxzZSB0aGVzZSBhcmUgdGhlIGNsaWVudCdzIG93biwgYW5kIGFyZVxuICogZm9yd2FyZGVkIGFzIGBuZXh0IHN0YXJ0YCBmb3J3YXJkcyB0aGVtLlxuICovXG5jb25zdCBTSUdWNF9IRUFERVJTOiByZWFkb25seSBzdHJpbmdbXSA9IFtcbiAgXCJhdXRob3JpemF0aW9uXCIsXG4gIFwieC1hbXotZGF0ZVwiLFxuICBcIngtYW16LWNvbnRlbnQtc2hhMjU2XCIsXG4gIFwieC1hbXotc2VjdXJpdHktdG9rZW5cIixcbl07XG5cbi8qKiBBIGBuZXh0LmNvbmZpZ2AgcmV3cml0ZSB3aG9zZSBkZXN0aW5hdGlvbiBpcyBhbm90aGVyIG9yaWdpbi4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByb3h5RXh0ZXJuYWwoXG4gIHJlcTogU2hpbUluY29taW5nTWVzc2FnZSxcbiAgcmVzOiBTaGltU2VydmVyUmVzcG9uc2UsXG4gIHVybDogVVJMLFxuICByZXF1ZXN0SGVhZGVyczogSGVhZGVycyxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBtZXRob2QgPSByZXEubWV0aG9kID8/IFwiR0VUXCI7XG4gIGNvbnN0IGhhc0JvZHkgPSBtZXRob2QgIT09IFwiR0VUXCIgJiYgbWV0aG9kICE9PSBcIkhFQURcIjtcbiAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKHJlcXVlc3RIZWFkZXJzKTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIFBST1hZX0RST1BQRURfSEVBREVSUykge1xuICAgIGhlYWRlcnMuZGVsZXRlKG5hbWUpO1xuICB9XG4gIGlmIChyZXEudHJ1c3RGb3J3YXJkZWRIb3N0KSB7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIFNJR1Y0X0hFQURFUlMpIHtcbiAgICAgIGhlYWRlcnMuZGVsZXRlKG5hbWUpO1xuICAgIH1cbiAgfVxuICBjb25zdCB1cHN0cmVhbSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgIG1ldGhvZCxcbiAgICBoZWFkZXJzLFxuICAgIGJvZHk6IGhhc0JvZHkgPyAoUmVhZGFibGUudG9XZWIocmVxKSBhcyBSZWFkYWJsZVN0cmVhbSkgOiB1bmRlZmluZWQsXG4gICAgcmVkaXJlY3Q6IFwibWFudWFsXCIsXG4gICAgLi4uKGhhc0JvZHkgPyB7IGR1cGxleDogXCJoYWxmXCIgfSA6IHt9KSxcbiAgfSBhcyBSZXF1ZXN0SW5pdCk7XG4gIGF3YWl0IHNlbmRXZWJSZXNwb25zZShyZXMsIHVwc3RyZWFtKTtcbn1cblxuLyoqXG4gKiBIZWFkZXJzIGRlc2NyaWJpbmcgdGhlIGZyYW1pbmcgb2YgYSBib2R5IHRoYXQgaXMgbm8gbG9uZ2VyIHRoZSBib2R5IGJlaW5nXG4gKiBzZW50LCBkcm9wcGVkIGZyb20gZXZlcnkgYFJlc3BvbnNlYCB7QGxpbmsgc2VuZFdlYlJlc3BvbnNlfSBmb3J3YXJkcy5cbiAqXG4gKiBBIHByb3hpZWQgb3JpZ2luJ3MgYFJlc3BvbnNlYCBjYW1lIGJhY2sgZnJvbSBgZmV0Y2hgLCBhbmQgc28sIG9mdGVuLCBkaWRcbiAqIG1pZGRsZXdhcmUncyBvd24gKGByZXR1cm4gZmV0Y2godXBzdHJlYW0pYCBpbiBgcHJveHkudHNgLCBzaW5jZSBtaWRkbGV3YXJlXG4gKiBydW5zIGluIHByb2Nlc3MgYW5kIGl0cyBgZmV0Y2hgIGlzIHVuZGljaSkuIHVuZGljaSBkZWNvZGVzIHRoZSBib2R5IOKAlCBnemlwLFxuICogZGVmbGF0ZSwgYnIsIHpzdGQg4oCUIGFuZCBsZWF2ZXMgYGNvbnRlbnQtZW5jb2RpbmdgIGFuZCBgY29udGVudC1sZW5ndGhgXG4gKiBkZXNjcmliaW5nIHRoZSBlbmNvZGVkIGJ5dGVzIGl0IGFscmVhZHkgdGhyZXcgYXdheS4gRm9yd2FyZGluZyB0aGVtIGVtaXRzXG4gKiBwbGFpbnRleHQgbGFiZWxsZWQgYGd6aXBgICh0aGUgYnJvd3NlciBmYWlscyB0aGUgd2hvbGUgcmVzcG9uc2Ugd2l0aFxuICogYEVSUl9DT05URU5UX0RFQ09ESU5HX0ZBSUxFRGApIHVuZGVyIGEgYENvbnRlbnQtTGVuZ3RoYCB0aGF0IGlzIHRvbyBzaG9ydCxcbiAqIGFuZCBgc2hvdWxkR3ppcGAgdGhlbiBkZWNsaW5lcyB0byBjb21wcmVzcyBpdCBiZWNhdXNlIGBjb250ZW50LWVuY29kaW5nYCBpc1xuICogYWxyZWFkeSBzZXQsIHNvIG5vdGhpbmcgZG93bnN0cmVhbSByZXBhaXJzIGl0LiBgdHJhbnNmZXItZW5jb2RpbmdgIGlzXG4gKiBob3AtYnktaG9wOiBpdCBkZXNjcmliZWQgdGhlIHVwc3RyZWFtIGNvbm5lY3Rpb24sIG5vdCB0aGlzIG9uZS5cbiAqXG4gKiBTdG9jayBOZXh0LmpzIGRyb3BzIHRoZSBzYW1lIHRocmVlIGZyb20gZXZlcnkgbWlkZGxld2FyZSByZXNwb25zZVxuICogKGBGT1JCSURERU5fSEVBREVSU2AgaW4gYG5leHQvZGlzdC9zZXJ2ZXIvd2ViL3NhbmRib3gvc2FuZGJveC5qc2ApLCBzb1xuICogbWlkZGxld2FyZSBjYW5ub3QgbGFiZWwgYSBib2R5IGl0IGVuY29kZWQgaXRzZWxmIHRoZXJlIGVpdGhlci5cbiAqL1xuY29uc3QgU1RBTEVfRlJBTUlOR19IRUFERVJTOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldChbXG4gIFwiY29udGVudC1lbmNvZGluZ1wiLFxuICBcImNvbnRlbnQtbGVuZ3RoXCIsXG4gIFwidHJhbnNmZXItZW5jb2RpbmdcIixcbl0pO1xuXG4vKiogU3RyZWFtIGEgYFJlc3BvbnNlYCDigJQgbWlkZGxld2FyZSdzIG93biwgb3IgYSBwcm94aWVkIG9yaWdpbidzIOKAlCBpbnRvIGByZXNgLiAqL1xuYXN5bmMgZnVuY3Rpb24gc2VuZFdlYlJlc3BvbnNlKFxuICByZXM6IFNoaW1TZXJ2ZXJSZXNwb25zZSxcbiAgcmVzcG9uc2U6IFJlc3BvbnNlLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJlcy5zdGF0dXNDb2RlID0gcmVzcG9uc2Uuc3RhdHVzO1xuICBpZiAocmVzcG9uc2Uuc3RhdHVzVGV4dCkge1xuICAgIHJlcy5zdGF0dXNNZXNzYWdlID0gcmVzcG9uc2Uuc3RhdHVzVGV4dDtcbiAgfVxuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMocmVzcG9uc2UuaGVhZGVycyk7XG4gIGZvciAoY29uc3QgbmFtZSBvZiBTVEFMRV9GUkFNSU5HX0hFQURFUlMpIHtcbiAgICBoZWFkZXJzLmRlbGV0ZShuYW1lKTtcbiAgfVxuICBhcHBseUhlYWRlcnMocmVzLCBoZWFkZXJzKTtcbiAgaWYgKCFyZXNwb25zZS5ib2R5KSB7XG4gICAgcmVzLmVuZCgpO1xuICAgIHJldHVybjtcbiAgfVxuICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIHJlc3BvbnNlLmJvZHkgYXMgdW5rbm93biBhcyBBc3luY0l0ZXJhYmxlPFVpbnQ4QXJyYXk+KSB7XG4gICAgLy8gTGVhdmluZyB0aGUgbG9vcCBjYW5jZWxzIHRoZSBib2R5LCB3aGljaCBpcyB3aGF0IHN0b3BzIGEgcHJveGllZCBvcmlnaW5cbiAgICAvLyBmcm9tIGJlaW5nIHJlYWQgdG8gdGhlIGVuZCBmb3IgYSBjbGllbnQgdGhhdCBoYXMgYWxyZWFkeSBnb25lLlxuICAgIGlmIChyZXMuZGVzdHJveWVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFBhY2VkIGJ5IHRoZSBjbGllbnQ6IHdpdGhvdXQgd2FpdGluZyBmb3IgYGRyYWluYCwgYSBsYXJnZSBwcm94aWVkIGJvZHlcbiAgICAvLyBoZWFkZWQgZm9yIGEgc2xvdyBjbGllbnQgaXMgYnVmZmVyZWQgd2hvbGUgaW4gbWVtb3J5LlxuICAgIGNvbnN0IGFjY2VwdGVkID0gcmVzLndyaXRlKGNodW5rKTtcbiAgICAvLyBTZXQgYnkgdGhlIHNpbmsgd2hlbiBpdCBjb21wcmVzc2VzLiBXaXRob3V0IGl0IHRoZSBjaHVuayBzaXRzIGluIHpsaWInc1xuICAgIC8vIGJ1ZmZlciwgYW5kIGEgc3RyZWFtZWQgYm9keSDigJQgc2VydmVyLXNlbnQgZXZlbnRzIHRocm91Z2ggYSByZXdyaXRlLCBhXG4gICAgLy8gbWlkZGxld2FyZSBgUmVhZGFibGVTdHJlYW1gIOKAlCByZWFjaGVzIHRoZSBjbGllbnQgYWxsIGF0IG9uY2UsIGF0IHRoZSBlbmQuXG4gICAgLy8gTmV4dC5qcyBmbHVzaGVzIGFmdGVyIGV2ZXJ5IGNodW5rIGZvciB0aGUgc2FtZSByZWFzb24gKGBwaXBlLXJlYWRhYmxlYCkuXG4gICAgcmVzLmZsdXNoPy4oKTtcbiAgICBpZiAoIWFjY2VwdGVkICYmICEoYXdhaXQgZHJhaW5lZChyZXMpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICByZXMuZW5kKCk7XG59XG4iXX0=
1232
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL2NvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBMitCQSx3REFnQkM7QUFtREQsc0RBK0JDO0FBbUJELGtDQTBEQztBQWlJRCw4QkEyQ0M7QUF0MENELHNEQUFzRDtBQUN0RDs7Ozs7Ozs7Ozs7R0FXRztBQUNILCtDQUE0QztBQUU1Qyx5Q0FBaUM7QUFDakMsNkNBQWlEO0FBQ2pELG1EQUFvRDtBQUNwRCx5Q0FLb0I7QUFDcEIsK0NBSXVCO0FBQ3ZCLDRDQUE0RTtBQUM1RSw4Q0FJeUI7QUFDekIsc0NBQXVEO0FBQ3ZELG1DQUF1RTtBQUN2RSx5Q0FNb0I7QUFDcEIsNkNBQWdEO0FBQ2hELGlEQUt3QjtBQUN4QixpREFBa0U7QUFDbEUsaURBQW9FO0FBQ3BFLGlEQUFvRTtBQUNwRSxpQ0FBMEU7QUFFMUUsMEVBQTBFO0FBQzFFLElBQUEsb0NBQXFCLEdBQUUsQ0FBQztBQStEeEIsTUFBYSxhQUFhO0lBVVk7SUFUbkIsV0FBVyxDQUFxQjtJQUNoQyxVQUFVLENBQWE7SUFDdkIsVUFBVSxDQUFvQjtJQUM5QixNQUFNLENBQXdCO0lBQy9DLDJDQUEyQztJQUMxQixjQUFjLENBQXlDO0lBQ3hFLGtFQUFrRTtJQUNqRCxZQUFZLENBQVU7SUFFdkMsWUFBb0MsT0FBNkI7UUFBN0IsWUFBTyxHQUFQLE9BQU8sQ0FBc0I7UUFDL0QsTUFBTSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFDN0MsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLGdDQUFrQixDQUFDLGNBQWMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNwRSx3REFBd0Q7UUFDeEQsTUFBTSxXQUFXLEdBQUcsSUFBQSxpQ0FBa0IsRUFBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLHFCQUFVLENBQUM7WUFDL0IsUUFB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QyxDQUFDLEVBQUUsQ0FBQztZQUN2QyxPQUFPO1FBQ1QsQ0FBQztJQUNILENBQUM7SUFDRCxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDWixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzICovXG4vKipcbiAqIFRoZSBydW50aW1lIGNvcmU6IG9uZSBgaGFuZGxlKHJlcXVlc3QsIHNpbmspYCB0aGF0IGJvdGggc2hlbGxzIHdyYXAuXG4gKlxuICogVGhlIExhbWJkYSBzaGVsbCAoYGxhbWJkYS5tdHNgKSBhbmQgdGhlIGNvbnRhaW5lciBzaGVsbCAoYHNlcnZlci5tdHNgKSBkb1xuICogbm90aGluZyBidXQgdHVybiB0aGVpciBpbnB1dCBpbnRvIGEge0BsaW5rIFJ1bnRpbWVSZXF1ZXN0fSBhbmQgdGhlaXIgb3V0cHV0IGludG9cbiAqIGEge0BsaW5rIFJlc3BvbnNlU2lua30uIEV2ZXJ5dGhpbmcgZWxzZSDigJQgc3ludGhlc2l6aW5nIGByZXFgL2ByZXNgLCBkaXNwYXRjaCxcbiAqIG1pZGRsZXdhcmUsIGVudHJ5cG9pbnQgaW52b2NhdGlvbiwgc3RhdGljIGZpbGVzLCBpbWFnZSBvcHRpbWl6YXRpb24sIGd6aXAsXG4gKiBgd2FpdFVudGlsYCDigJQgaGFwcGVucyBoZXJlLCBzbyB0aGUgY29udGFpbmVyIGUyZSBzdWl0ZSBleGVyY2lzZXMgdGhlIHNhbWUgY29kZVxuICogTGFtYmRhIHJ1bnMuIFRoYXQgaXMgZGVsaWJlcmF0ZTogdGhlIGNvbnRhaW5lciBwYXRoIHVzZWQgdG8gZ2V0IHJlYWxcbiAqIGBub2RlOmh0dHBgIG9iamVjdHMgZnJvbSBMYW1iZGEgV2ViIEFkYXB0ZXIsIHdoaWNoIG1lYW50IGNvbnRhaW5lciB0ZXN0cyBwcm92ZWRcbiAqIG5vdGhpbmcgYWJvdXQgTGFtYmRhLlxuICovXG5pbXBvcnQgeyByZWFkRmlsZSB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgdHlwZSB7IEluY29taW5nSHR0cEhlYWRlcnMgfSBmcm9tIFwibm9kZTpodHRwXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgUmVhZGFibGUsIFdyaXRhYmxlIH0gZnJvbSBcIm5vZGU6c3RyZWFtXCI7XG5pbXBvcnQgeyBjYXNlQ2Fub25pY2FsUGF0aCB9IGZyb20gXCIuL2Nhc2UtcmVkaXJlY3RcIjtcbmltcG9ydCB7XG4gIERpc3BhdGNoZXIsXG4gIG91dE9mQmFuZFJvdXRlUGFyYW1zLFxuICBTdGF0dXNUYXJnZXQsXG4gIHN0YXR1c1RhcmdldHMsXG59IGZyb20gXCIuL2Rpc3BhdGNoXCI7XG5pbXBvcnQge1xuICBFbnRyeXBvaW50SGFuZGxlcixcbiAgRW50cnlwb2ludFJlZ2lzdHJ5LFxuICBSb3V0ZUluT3RoZXJHcm91cEVycm9yLFxufSBmcm9tIFwiLi9lbnRyeXBvaW50c1wiO1xuaW1wb3J0IHsgU2hpbUluY29taW5nTWVzc2FnZSwgdG9JbmNvbWluZ0h0dHBIZWFkZXJzIH0gZnJvbSBcIi4vaHR0cC9yZXF1ZXN0XCI7XG5pbXBvcnQge1xuICBhc1NlcnZlclJlc3BvbnNlLFxuICBSZXNwb25zZUhlYWQsXG4gIFNoaW1TZXJ2ZXJSZXNwb25zZSxcbn0gZnJvbSBcIi4vaHR0cC9yZXNwb25zZVwiO1xuaW1wb3J0IHsgcGlwZVRvU2luaywgUmVzcG9uc2VTaW5rIH0gZnJvbSBcIi4vaHR0cC9zaW5rXCI7XG5pbXBvcnQgeyBJbnRlcm5hbEltYWdlUmVzcG9uc2UsIFJ1bnRpbWVJbWFnZU9wdGltaXplciB9IGZyb20gXCIuL2ltYWdlXCI7XG5pbXBvcnQge1xuICBBZGFwdGVyTWFuaWZlc3QsXG4gIGRlcGxveWVkTWFuaWZlc3RQYXRoLFxuICBGVU5DVElPTl9HUk9VUF9FTlZfVkFSLFxuICBNQU5JRkVTVF9GSUxFX05BTUUsXG4gIFJFVkFMSURBVEVEX1BBR0VfSE9PSyxcbn0gZnJvbSBcIi4vbWFuaWZlc3RcIjtcbmltcG9ydCB7IE1pZGRsZXdhcmVSdW5uZXIgfSBmcm9tIFwiLi9taWRkbGV3YXJlXCI7XG5pbXBvcnQge1xuICBsb2FkRW52RmlsZXMsXG4gIHJlZ2lzdGVySW5zdHJ1bWVudGF0aW9uLFxuICBzZXR1cE5vZGVFbnZpcm9ubWVudCxcbiAgdXNlTmV4dEZyb20sXG59IGZyb20gXCIuL25leHQtbW9kdWxlc1wiO1xuaW1wb3J0IHsgcHVibGljRGlyS2V5LCByZXNvbHZlUHVibGljRmlsZXMgfSBmcm9tIFwiLi9wdWJsaWMtZmlsZXNcIjtcbmltcG9ydCB7IHNlcnZlUzNQdWJsaWNGaWxlLCBzZXJ2ZVN0YXRpY0ZpbGUgfSBmcm9tIFwiLi9zdGF0aWMtZmlsZXNcIjtcbmltcG9ydCB7IGNhcHR1cmVPdXRzaWRlUmVxdWVzdCwgY2F0Y2hVcFRhZ3MgfSBmcm9tIFwiLi90YWctbWFuaWZlc3RcIjtcbmltcG9ydCB7IGRyYWluZWQsIGZpcnN0VmFsdWUsIHRvU2VhcmNoLCB3aXRob3V0UGF0aFByZWZpeCB9IGZyb20gXCIuL3V0aWxcIjtcblxuLy8gQXQgbG9hZCwgYmVmb3JlIGFueSByZXF1ZXN0OiB0aGUgY29udGV4dCBjYWNoZSBoYW5kbGVyIHdvcmsgZXNjYXBlcyB0by5cbmNhcHR1cmVPdXRzaWRlUmVxdWVzdCgpO1xuXG4vKiogT25lIHJlcXVlc3QsIG5vcm1hbGl6ZWQgYnkgYSBzaGVsbC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVudGltZVJlcXVlc3Qge1xuICByZWFkb25seSBtZXRob2Q6IHN0cmluZztcbiAgLyoqIE9yaWdpbi1mb3JtIHRhcmdldCBleGFjdGx5IGFzIHJlY2VpdmVkOiBwYXRoICsgcXVlcnksIG5ldmVyIGFic29sdXRlLiAqL1xuICByZWFkb25seSB1cmw6IHN0cmluZztcbiAgcmVhZG9ubHkgaGVhZGVyczogSW5jb21pbmdIdHRwSGVhZGVycztcbiAgcmVhZG9ubHkgYm9keT86IFJlYWRhYmxlIHwgQnVmZmVyO1xuICByZWFkb25seSByZW1vdGVBZGRyZXNzPzogc3RyaW5nO1xuICAvKiogYGZhbHNlYCBiZWhpbmQgYSBUTFMtdGVybWluYXRpbmcgQUxCLiBPbmx5IGFmZmVjdHMgdGhlIHN5bnRoZXNpemVkIHNvY2tldC4gKi9cbiAgcmVhZG9ubHkgZW5jcnlwdGVkPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEFib3J0ZWQgd2hlbiB0aGUgY2xpZW50IGRpc2Nvbm5lY3RzLiBXaXJpbmcgaXQgdG8gYHJlcy5kZXN0cm95KClgIGlzIHdoYXRcbiAgICogbWFrZXMgYHJlcXVlc3Quc2lnbmFsLm9uYWJvcnRgIGZpcmUgaW5zaWRlIHJvdXRlIGhhbmRsZXJzLlxuICAgKi9cbiAgcmVhZG9ubHkgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIC8qKlxuICAgKiBXaGV0aGVyIGB4LWZvcndhcmRlZC1ob3N0YCBuYW1lcyB0aGUgaG9zdCB0aGUgY2xpZW50IGFza2VkIGZvci4gT25seSB0aGVcbiAgICogc2hlbGwgY2FuIGtub3c6IGl0IGlzIGB0cnVlYCBmb3IgYSBGdW5jdGlvbiBVUkwgZXZlbnQgd2hvc2UgU2lnVjQgTGFtYmRhXG4gICAqIHZlcmlmaWVkLiBUaGF0IGlzIGFueSBJQU0tYXV0aG9yaXplZCBpbnZva2VyIOKAlCBpbiBwcmFjdGljZSBDbG91ZEZyb250J3NcbiAgICogT3JpZ2luIEFjY2VzcyBDb250cm9sLCB3aG9zZSB2aWV3ZXItcmVxdWVzdCBmdW5jdGlvbiBvdmVyd3JpdGVzIHRoZSBoZWFkZXJcbiAgICogd2l0aCB0aGUgdmlld2VyJ3MgYEhvc3RgIChDbG91ZEZyb250IGhhcyB0byByZXBsYWNlIGBIb3N0YCBpdHNlbGYgd2l0aCB0aGVcbiAgICogRnVuY3Rpb24gVVJMJ3MgZG9tYWluKSwgcGx1cyBwcmluY2lwYWxzIGdyYW50ZWQgYGxhbWJkYTpJbnZva2VGdW5jdGlvblVybGAsXG4gICAqIHdobyBjb3VsZCByZXBsYWNlIHRoZSBmdW5jdGlvbidzIGNvZGUgYW55d2F5LiBJdCBpcyBhbHNvIHdoYXRcbiAgICogYHByb3h5RXh0ZXJuYWxgIGRyb3BzIE9BQydzIHNpZ25hdHVyZSBvbi4gRXZlcnl3aGVyZSBlbHNlIHRoZSBoZWFkZXIgaXNcbiAgICogd2hhdGV2ZXIgdGhlIGNsaWVudCBzZW50LCBhbmQgaXQgaXNcbiAgICogaWdub3JlZCwgYXMgYG5leHQgc3RhcnRgIGlnbm9yZXMgaXQgd2l0aG91dCBgZXhwZXJpbWVudGFsLnRydXN0SG9zdEhlYWRlcmAuXG4gICAqL1xuICByZWFkb25seSB0cnVzdEZvcndhcmRlZEhvc3Q/OiBib29sZWFuO1xuICAvKipcbiAgICogU2V0IGJ5IHtAbGluayBOZXh0anNSdW50aW1lLmhhbmRsZUludGVybmFsbHl9IGZvciB0aGUgaW4tcHJvY2VzcyByZXF1ZXN0cyBpdFxuICAgKiBtYWtlczogY2FsbGVkIHdpdGggdGhlIGBSb3V0ZUluT3RoZXJHcm91cEVycm9yYCB0aGUgcm91dGUgdGhyZXcsIGluc3RlYWQgb2ZcbiAgICogbG9nZ2luZyB0aGUgbWlzcm91dGVkLXJlcXVlc3Qgd2FybmluZywgd2hpY2ggZGVzY3JpYmVzIGEgQ2xvdWRGcm9udCBvciBBUElcbiAgICogR2F0ZXdheSBwcm9ibGVtIHRoaXMgaXMgbm90LlxuICAgKi9cbiAgcmVhZG9ubHkgb25Sb3V0ZUluT3RoZXJHcm91cD86IChlcnJvcjogUm91dGVJbk90aGVyR3JvdXBFcnJvcikgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBgUmV2YWxpZGF0ZUZuYCdzIGFyZ3VtZW50IChgbmV4dC9kaXN0L3NlcnZlci9saWIvcm91dGVyLXV0aWxzL3JvdXRlci1zZXJ2ZXItY29udGV4dGApLFxuICogcmVzdGF0ZWQgYmVjYXVzZSB0aGF0IG1vZHVsZSBpcyBub3QgcGFydCBvZiBgbmV4dGAncyBwdWJsaXNoZWQgdHlwZSBzdXJmYWNlLlxuICovXG5pbnRlcmZhY2UgUmV2YWxpZGF0ZUNvbmZpZyB7XG4gIHJlYWRvbmx5IHVybFBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgaGVhZGVyczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXSB9O1xuICByZWFkb25seSBvcHRzOiB7IHVuc3RhYmxlX29ubHlHZW5lcmF0ZWQ/OiBib29sZWFuIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzUnVudGltZU9wdGlvbnMge1xuICAvKipcbiAgICogQWJzb2x1dGUgcGF0aCB0byB0aGUgZGVwbG95bWVudCByb290IOKAlCB0aGUgc3RhZ2VkIHRyZWUgZXZlcnkgbWFuaWZlc3Qga2V5XG4gICAqIHJlc29sdmVzIGFnYWluc3QuIGBMQU1CREFfVEFTS19ST09UYCBmb3IgRnVuY3Rpb25zLCB0aGUgaW1hZ2UgYFdPUktESVJgIGZvclxuICAgKiBDb250YWluZXJzOyBib3RoIHNoZWxscyBkZXJpdmUgaXQgZnJvbSB0aGVpciBvd24gbG9jYXRpb24gaW5zdGVhZC5cbiAgICovXG4gIHJlYWRvbmx5IGRlcGxveW1lbnRSb290OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1hbmlmZXN0OiBBZGFwdGVyTWFuaWZlc3Q7XG4gIC8qKiBgQ0RLX05FWFRKU19TVEFUSUNfQVNTRVRTX0JVQ0tFVF9OQU1FYC4gKi9cbiAgcmVhZG9ubHkgYnVja2V0Pzogc3RyaW5nO1xuICAvKiogYENES19ORVhUSlNfU1RBVElDX0FTU0VUU19LRVlfUFJFRklYYC4gKi9cbiAgcmVhZG9ubHkgYnVja2V0S2V5UHJlZml4Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgTmV4dGpzUnVudGltZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZW50cnlwb2ludHM6IEVudHJ5cG9pbnRSZWdpc3RyeTtcbiAgcHJpdmF0ZSByZWFkb25seSBkaXNwYXRjaGVyOiBEaXNwYXRjaGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IG1pZGRsZXdhcmU/OiBNaWRkbGV3YXJlUnVubmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGltYWdlczogUnVudGltZUltYWdlT3B0aW1pemVyO1xuICAvKiogVGhlIDUwMCBsYWRkZXI7IHNlZSBgc3RhdHVzVGFyZ2V0c2AuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZXJyb3JUYXJnZXRGb3I6ICh1cmw6IFVSTCB8IHVuZGVmaW5lZCkgPT4gU3RhdHVzVGFyZ2V0O1xuICAvKiogVGhlIGFzc2V0cyBidWNrZXQsIHdoZW4gYHB1YmxpYy9gIGZpbGVzIGFyZSBzZXJ2ZWQgZnJvbSBpdC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwdWJsaWNCdWNrZXQ/OiBzdHJpbmc7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogTmV4dGpzUnVudGltZU9wdGlvbnMpIHtcbiAgICBjb25zdCB7IG1hbmlmZXN0LCBkZXBsb3ltZW50Um9vdCB9ID0gb3B0aW9ucztcbiAgICB0aGlzLmVudHJ5cG9pbnRzID0gbmV3IEVudHJ5cG9pbnRSZWdpc3RyeShkZXBsb3ltZW50Um9vdCwgbWFuaWZlc3QpO1xuICAgIC8vIExpc3RlZCBvbmNlLCBhdCBjb2xkIHN0YXJ0OyBzZWUgYHJlc29sdmVQdWJsaWNGaWxlc2AuXG4gICAgY29uc3QgcHVibGljRmlsZXMgPSByZXNvbHZlUHVibGljRmlsZXMoZGVwbG95bWVudFJvb3QsIG1hbmlmZXN0KTtcbiAgICB0aGlzLmRpc3BhdGNoZXIgPSBuZXcgRGlzcGF0Y2hlcih7XG4gICAgICBtYW5pZmVzdCxcbiAgICAgIHB1YmxpY0ZpbGVzOiBwdWJsaWNGaWxlcy5maWxlcyxcbiAgICB9KTtcbiAgICAvLyBPbiBkaXNrIG90aGVyd2lzZSwgd2l0aCBgLm5leHQvc3RhdGljYC5cbiAgICB0aGlzLnB1YmxpY0J1Y2tldCA9IHB1YmxpY0ZpbGVzLmluUzMgPyBvcHRpb25zLmJ1Y2tldCA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLmVycm9yVGFyZ2V0Rm9yID0gc3RhdHVzVGFyZ2V0cyhtYW5pZmVzdCwgNTAwKTtcbiAgICB0aGlzLmltYWdlcyA9IG5ldyBSdW50aW1lSW1hZ2VPcHRpbWl6ZXIoe1xuICAgICAgZGVwbG95bWVudFJvb3QsXG4gICAgICBtYW5pZmVzdCxcbiAgICAgIGJ1Y2tldDogdGhpcy5wdWJsaWNCdWNrZXQgPz8gXCJcIixcbiAgICAgIGJ1Y2tldEtleVByZWZpeDogb3B0aW9ucy5idWNrZXRLZXlQcmVmaXggPz8gXCJcIixcbiAgICAgIGZldGNoSW50ZXJuYWw6IChocmVmLCByZXEsIG1heGltdW1Cb2R5KSA9PlxuICAgICAgICB0aGlzLmZldGNoSW50ZXJuYWwoaHJlZiwgcmVxLCBtYXhpbXVtQm9keSksXG4gICAgfSk7XG4gICAgLy8gVGhlIHJ1bm5lciBpcyBzaGFyZWQg4oCUIGl0IG1lbW9pemVzIHRoZSBsb2FkZWQgbWlkZGxld2FyZSBtb2R1bGUg4oCUIHdoaWxlIHRoZVxuICAgIC8vIGBpbnZva2VNaWRkbGV3YXJlYCBjYWxsYmFjayBpdCBwcm9kdWNlcyBpcyBwZXIgcmVxdWVzdC5cbiAgICB0aGlzLm1pZGRsZXdhcmUgPSBtYW5pZmVzdC5taWRkbGV3YXJlXG4gICAgICA/IG5ldyBNaWRkbGV3YXJlUnVubmVyKHtcbiAgICAgICAgICBtaWRkbGV3YXJlOiBtYW5pZmVzdC5taWRkbGV3YXJlLFxuICAgICAgICAgIHJvb3Q6IGRlcGxveW1lbnRSb290LFxuICAgICAgICB9KVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1hbmlmZXN0KCk6IEFkYXB0ZXJNYW5pZmVzdCB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5tYW5pZmVzdDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBoYW5kbGUoXG4gICAgcmVxdWVzdDogUnVudGltZVJlcXVlc3QsXG4gICAgc2luazogUmVzcG9uc2VTaW5rLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IG1hbmlmZXN0IH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgY29uc3QgcGVuZGluZzogQXJyYXk8UHJvbWlzZTx1bmtub3duPj4gPSBbXTtcbiAgICBjb25zdCB3YWl0VW50aWwgPSAocHJvbWlzZTogUHJvbWlzZTx1bmtub3duPikgPT4ge1xuICAgICAgcGVuZGluZy5wdXNoKHByb21pc2UpO1xuICAgIH07XG5cbiAgICBjb25zdCBib2R5ID0gc3BsaXRCb2R5KHJlcXVlc3QuYm9keSwgdGhpcy5taWRkbGV3YXJlICE9PSB1bmRlZmluZWQpO1xuICAgIGNvbnN0IHJlcSA9IG5ldyBTaGltSW5jb21pbmdNZXNzYWdlKHtcbiAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICB1cmw6IHJlcXVlc3QudXJsLFxuICAgICAgaGVhZGVyczogd2l0aG91dEludGVybmFsSGVhZGVycyhcbiAgICAgICAgcmVxdWVzdC5oZWFkZXJzLFxuICAgICAgICByZXF1ZXN0LnVybCxcbiAgICAgICAgbWFuaWZlc3QuY29uZmlnLmJhc2VQYXRoLFxuICAgICAgKSxcbiAgICAgIGJvZHk6IGJvZHkuZm9yUmVxdWVzdCxcbiAgICAgIHJlbW90ZUFkZHJlc3M6IHJlcXVlc3QucmVtb3RlQWRkcmVzcyxcbiAgICAgIGVuY3J5cHRlZDogcmVxdWVzdC5lbmNyeXB0ZWQsXG4gICAgICB0cnVzdEZvcndhcmRlZEhvc3Q6IHJlcXVlc3QudHJ1c3RGb3J3YXJkZWRIb3N0LFxuICAgIH0pO1xuICAgIGNvbnN0IHJlcyA9IG5ldyBTaGltU2VydmVyUmVzcG9uc2UoKTtcbiAgICAvLyBOZXh0LmpzIHJlYWRzIGByZXMucmVxYCBpbiBhIGZldyBlcnJvciBwYXRocy5cbiAgICByZXMucmVxID0gcmVxO1xuICAgIHJlcXVlc3Quc2lnbmFsPy5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgKCkgPT4gcmVzLmRlc3Ryb3koKSwge1xuICAgICAgb25jZTogdHJ1ZSxcbiAgICB9KTtcblxuICAgIC8vIFRoZSByZWplY3Rpb24gaGFuZGxlciBpcyBhdHRhY2hlZCBoZXJlIHJhdGhlciB0aGFuIGF0IHRoZSBgYXdhaXRgIGJlbG93LlxuICAgIC8vIGByb3V0ZSgpYCBhd2FpdHMgcmVhbCBJL08sIHNvIGEgc3RyZWFtIHRoYXQgYnJlYWtzIHdoaWxlIGl0IHJ1bnMgd291bGRcbiAgICAvLyBsZWF2ZSB0aGlzIHByb21pc2UgcmVqZWN0ZWQgd2l0aCBubyBoYW5kbGVyIGF0dGFjaGVkIGZvciBhIGZ1bGwgZXZlbnQtbG9vcFxuICAgIC8vIHR1cm4g4oCUIGFuZCBOb2RlIDI0IGRlZmF1bHRzIHRvIGAtLXVuaGFuZGxlZC1yZWplY3Rpb25zPXRocm93YCwgd2hpY2ggb25cbiAgICAvLyB0aGUgY29udGFpbmVyIHNoZWxsIHRha2VzIHRoZSB3aG9sZSB0YXNrIGRvd24gYW5kIGFib3J0cyBldmVyeSBvdGhlclxuICAgIC8vIGluLWZsaWdodCByZXF1ZXN0IG9uIGl0LiBBIG1pZC1zdHJlYW0gRVBJUEUgZnJvbSBvbmUgY2xpZW50IGRpc2Nvbm5lY3QgaXNcbiAgICAvLyBub3QgZ3JvdW5kcyBmb3IgdGhhdC5cbiAgICAvL1xuICAgIC8vIFRoZSBlcnJvciBpcyBsb2dnZWQsIG5vdCByZXRocm93bjogdGhlIHN0cmVhbSBicm9rZSBhZnRlciAob3Igd2hpbGUpIHRoZVxuICAgIC8vIGhlYWQgd2VudCBvdXQg4oCUIGEgY2xpZW50IGRpc2Nvbm5lY3QsIG9yIGBzZW5kRXJyb3JgIGRlc3Ryb3lpbmcgYVxuICAgIC8vIGhhbGYtd3JpdHRlbiByZXNwb25zZSDigJQgYW5kIG5laXRoZXIgaXMgYW4gaW52b2NhdGlvbiBmYWlsdXJlLiBSZXRocm93aW5nXG4gICAgLy8gd291bGQgbWFrZSBMYW1iZGEgcmV0cnkgYSByZXF1ZXN0IHRoZSBjbGllbnQgYWxyZWFkeSBhYmFuZG9uZWQuXG4gICAgY29uc3QgZmluaXNoZWQgPSBwaXBlVG9TaW5rKHJlcSwgcmVzLCBzaW5rLCB7XG4gICAgICBjb21wcmVzczogbWFuaWZlc3QuY29uZmlnLmNvbXByZXNzLFxuICAgIH0pLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgY29uc29sZS5lcnJvcihcIlRoZSByZXNwb25zZSBzdHJlYW0gZGlkIG5vdCBjb21wbGV0ZTpcIiwgZXJyb3IpO1xuICAgIH0pO1xuXG4gICAgLy8gRm9yIHRoZSBlcnJvciBwYWdlJ3MgbG9jYWxlOyB1bnNldCB3aGVuIHRoZSB0aHJvdyBpcyBgYWJzb2x1dGVVcmxgJ3MuXG4gICAgbGV0IHVybDogVVJMIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICAvLyBCZWZvcmUgYW55dGhpbmcgcGFyc2VzIHRoZSB0YXJnZXQsIGluY2x1ZGluZyBgYWJzb2x1dGVVcmxgIC0gYG5ldyBVUkxgXG4gICAgICAvLyByZWFkcyBhIGxlYWRpbmcgYC8vYCBhcyBwcm90b2NvbC1yZWxhdGl2ZSBhbmQgd291bGQgdGFrZSB0aGUgZmlyc3QgcGF0aFxuICAgICAgLy8gc2VnbWVudCBmb3IgdGhlIGhvc3QuXG4gICAgICBjb25zdCBjb2xsYXBzZWQgPSBjb2xsYXBzZVJlcGVhdGVkU2xhc2hlcyhyZXF1ZXN0LnVybCk7XG4gICAgICBpZiAoY29sbGFwc2VkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2VuZFJlZGlyZWN0KHJlcywgY29sbGFwc2VkLCAzMDgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSW5zaWRlIHRoZSB0cnk6IGBhYnNvbHV0ZVVybGAgYnVpbGRzIGEgYFVSTGAgb3V0IG9mIHRoZSByZXF1ZXN0IGxpbmVcbiAgICAgICAgLy8gYW5kIHRoZSBmb3J3YXJkZWQgaGVhZGVycywgYW5kIGEgdGhyb3cgaGVyZSBoYXMgdG8gcmVhY2ggdGhlIGVycm9yXG4gICAgICAgIC8vIGxhZGRlciBsaWtlIGFueSBvdGhlci4gT3V0c2lkZSBpdCwgb24gdGhlIExhbWJkYSBzaGVsbHMg4oCUIHdob3NlXG4gICAgICAgIC8vIGhhbmRsZXJzIHdyYXAgbm90aGluZyDigJQgdGhlIHNhbWUgdGhyb3cgaXMgYW4gaW52b2NhdGlvbiBlcnJvciBhbmQgYVxuICAgICAgICAvLyA1MDIuXG4gICAgICAgIHVybCA9IGFic29sdXRlVXJsKHJlcXVlc3QpO1xuICAgICAgICBhd2FpdCB0aGlzLnJvdXRlKHJlcSwgcmVzLCB1cmwsIGJvZHksIHdhaXRVbnRpbCwgcmVxdWVzdCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZEVycm9yKHJlcSwgcmVzLCB3YWl0VW50aWwsIGVycm9yLCB1cmwpO1xuICAgIH1cblxuICAgIGF3YWl0IGZpbmlzaGVkO1xuXG4gICAgLy8gTGFtYmRhIGZyZWV6ZXMgdGhlIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCB0aGUgbW9tZW50IHRoZSBoYW5kbGVyIHJlc29sdmVzIOKAlFxuICAgIC8vIHRoZXJlIGlzIG5vIHBvc3QtcmVzcG9uc2Uga2VlcGFsaXZlIOKAlCBzbyBiYWNrZ3JvdW5kIHdvcmsgcmVnaXN0ZXJlZCB3aXRoXG4gICAgLy8gYHdhaXRVbnRpbGAgKG5vdGFibHkgSVNSIHJldmFsaWRhdGlvbikgaGFzIHRvIGJlIGF3YWl0ZWQgaGVyZS4gQWZ0ZXIgdGhlXG4gICAgLy8gcmVzcG9uc2Ugc3RyZWFtIGhhcyBjbG9zZWQsIHNvIGNsaWVudCBsYXRlbmN5IGlzIHVuYWZmZWN0ZWQ7IGJpbGxlZFxuICAgIC8vIGR1cmF0aW9uIGV4dGVuZHMsIHdoaWNoIGlzIHRoZSBjb3JyZWN0IHRyYWRlIGFnYWluc3QgYSByZXZhbGlkYXRpb24gdGhhdFxuICAgIC8vIG5ldmVyIGNvbXBsZXRlcy5cbiAgICAvL1xuICAgIC8vIERyYWluZWQgdW50aWwgbm90aGluZyBuZXcgYXJyaXZlcywgbm90IGF3YWl0ZWQgb25jZTogYHdhaXRVbnRpbGAga2VlcHNcbiAgICAvLyBiZWluZyBjYWxsZWQgYWZ0ZXIgdGhlIHJlc3BvbnNlIOKAlCBOZXh0J3MgYEFmdGVyQ29udGV4dGAgcmVnaXN0ZXJzIGl0c1xuICAgIC8vIGNhbGxiYWNrIHF1ZXVlIG9uIHRoZSBmaXJzdCBgYWZ0ZXIoKWAsIGFuZCBhbiBgYWZ0ZXIocHJvbWlzZSlgIG1hZGUgZnJvbVxuICAgIC8vIGluc2lkZSBhIHJ1bm5pbmcgY2FsbGJhY2ssIG9yIGEgYmFja2dyb3VuZCByZWdlbmVyYXRpb24gdGhhdCBpdHNlbGYgY2FsbHNcbiAgICAvLyBgYWZ0ZXIoKWAsIHJlZ2lzdGVycyBtb3JlLiBBIHNpbmdsZSBgYWxsU2V0dGxlZGAgc25hcHNob3RzIHRoZSBhcnJheSBhbmRcbiAgICAvLyBsZXRzIExhbWJkYSBmcmVlemUgb24gdGhhdCBsYXRlIHdvcmsuXG4gICAgbGV0IHNldHRsZWRDb3VudCA9IDA7XG4gICAgd2hpbGUgKHNldHRsZWRDb3VudCA8IHBlbmRpbmcubGVuZ3RoKSB7XG4gICAgICBjb25zdCBiYXRjaCA9IHBlbmRpbmcuc2xpY2Uoc2V0dGxlZENvdW50KTtcbiAgICAgIHNldHRsZWRDb3VudCA9IHBlbmRpbmcubGVuZ3RoO1xuICAgICAgY29uc3Qgc2V0dGxlZCA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChiYXRjaCk7XG4gICAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiBzZXR0bGVkKSB7XG4gICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSBcInJlamVjdGVkXCIpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiQSB3YWl0VW50aWwoKSBwcm9taXNlIHJlamVjdGVkOlwiLCByZXN1bHQucmVhc29uKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcm91dGUoXG4gICAgcmVxOiBTaGltSW5jb21pbmdNZXNzYWdlLFxuICAgIHJlczogU2hpbVNlcnZlclJlc3BvbnNlLFxuICAgIHVybDogVVJMLFxuICAgIGJvZHk6IFNwbGl0Qm9keSxcbiAgICB3YWl0VW50aWw6IChwcm9taXNlOiBQcm9taXNlPHVua25vd24+KSA9PiB2b2lkLFxuICAgIHJlcXVlc3Q6IFJ1bnRpbWVSZXF1ZXN0LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmRpc3BhdGNoZXIuZGlzcGF0Y2goe1xuICAgICAgbWV0aG9kOiByZXEubWV0aG9kID8/IFwiR0VUXCIsXG4gICAgICB1cmwsXG4gICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh0b1dlYkhlYWRlcnMocmVxLmhlYWRlcnMpKSxcbiAgICAgIGJvZHk6IGJvZHkuZm9yRGlzcGF0Y2gsXG4gICAgICBpbnZva2VNaWRkbGV3YXJlOiB0aGlzLm1pZGRsZXdhcmU/Lmludm9rZXJGb3Ioe1xuICAgICAgICB3YWl0VW50aWwsXG4gICAgICAgIHNpZ25hbDogcmVxdWVzdC5zaWduYWwsXG4gICAgICB9KSxcbiAgICB9KTtcbiAgICBib2R5LnJlbGVhc2VVbnJlYWQocmVzdWx0LmtpbmQgPT09IFwibWlkZGxld2FyZS1yZXNwb25kZWRcIik7XG5cbiAgICBhcHBseUhlYWRlcnMocmVzLCByZXN1bHQucmVzcG9uc2VIZWFkZXJzKTtcbiAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXMuc3RhdHVzQ29kZSA9IHJlc3VsdC5zdGF0dXM7XG4gICAgfVxuXG4gICAgc3dpdGNoIChyZXN1bHQua2luZCkge1xuICAgICAgY2FzZSBcImVudHJ5cG9pbnRcIjoge1xuICAgICAgICBsZXQgaGFuZGxlcjogRW50cnlwb2ludEhhbmRsZXI7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaGFuZGxlciA9IGF3YWl0IHRoaXMuZW50cnlwb2ludHMubG9hZChyZXN1bHQuZW50cnlwb2ludCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBSb3V0ZUluT3RoZXJHcm91cEVycm9yKSkgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgLy8gQSBVUkwgdGhlIGVkZ2Ugc2VudCBoZXJlIG9ubHkgYmVjYXVzZSBvZiBpdHMgY2FzZSBnb2VzIHRvIGl0c1xuICAgICAgICAgIC8vIGNhbm9uaWNhbCBzcGVsbGluZywgd2hpY2ggdGhlIGVkZ2Ugcm91dGVzIHRvIHRoZSBvd25pbmcgZ3JvdXAuXG4gICAgICAgICAgY29uc3QgY2Fub25pY2FsID0gY2FzZUNhbm9uaWNhbFBhdGgoXG4gICAgICAgICAgICB1cmwucGF0aG5hbWUsXG4gICAgICAgICAgICByZXN1bHQucmVzb2x2ZWRQYXRobmFtZSxcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5tYW5pZmVzdCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChjYW5vbmljYWwpIHtcbiAgICAgICAgICAgIHNlbmRSZWRpcmVjdChyZXMsIGAke2Nhbm9uaWNhbH0ke3VybC5zZWFyY2h9YCwgMzA4KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlcXVlc3Qub25Sb3V0ZUluT3RoZXJHcm91cCkge1xuICAgICAgICAgICAgLy8gRXhwbGFpbmVkIGJ5IHRoZSBjYWxsZXIgb2YgYGhhbmRsZUludGVybmFsbHlgLCB3aGljaCBrbm93cyB3aHkgaXRcbiAgICAgICAgICAgIC8vIGhhcHBlbmVkLlxuICAgICAgICAgICAgcmVxdWVzdC5vblJvdXRlSW5PdGhlckdyb3VwKGVycm9yKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTG9nZ2VkLCBiZWNhdXNlIGl0IGlzIGFsc28gd2hhdCBhIG1pc3JvdXRlZCBncm91cCBsb29rcyBsaWtlOyBzZWVcbiAgICAgICAgICAgIC8vIGBSb3V0ZUluT3RoZXJHcm91cEVycm9yYCBmb3Igd2h5IGl0IGlzIGEgNDA0LlxuICAgICAgICAgICAgY29uc29sZS53YXJuKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhd2FpdCB0aGlzLnNlbmRVbm1hdGNoZWQoXG4gICAgICAgICAgICByZXEsXG4gICAgICAgICAgICByZXMsXG4gICAgICAgICAgICB3YWl0VW50aWwsXG4gICAgICAgICAgICB7IHBhdGhuYW1lOiB1cmwucGF0aG5hbWUsIHJlcXVlc3RIZWFkZXJzOiByZXN1bHQucmVxdWVzdEhlYWRlcnMgfSxcbiAgICAgICAgICAgIHVybCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgaW52b2NhdGlvbiB0YXJnZXQsIG5vdCB0aGUgcmVxdWVzdGVkIFVSTDogYHJlc29sdmVSb3V0ZXNgIGhhc1xuICAgICAgICAvLyBhcHBsaWVkIHJld3JpdGVzLCBzdHJpcHBlZCBpMThuIHByZWZpeGVzLCBhbmQgYXBwZW5kZWQgdGhlIGBueHRQYFxuICAgICAgICAvLyByb3V0ZSBwYXJhbXMgYXMgcXVlcnkgdmFsdWVzLiBUaGF0IGlzIGV4YWN0bHkgdGhlIGNvbnRyYWN0IE5leHQuanNcbiAgICAgICAgLy8gZG9jdW1lbnRzIGZvciBhIHByb3h5IGluIGZyb250IG9mIGEgZnVuY3Rpb24g4oCUIGBSb3V0ZU1vZHVsZS5wcmVwYXJlYFxuICAgICAgICAvLyByZWNvdmVycyBgcGFyYW1zYCBmcm9tIHRoZXNlIHF1ZXJ5IHZhbHVlcyDigJQgc28gdGhhdCBjb250cmFjdCwgbm90XG4gICAgICAgIC8vIGByZXF1ZXN0TWV0YS5wYXJhbXNgLCBpcyBob3cgcGFyYW1zIGdldCBwYXNzZWQuIFRoZSBvbmUgZXhjZXB0aW9uIGlzXG4gICAgICAgIC8vIGEgY2FwdHVyZSB0aGUgY29udHJhY3Qgd291bGQgY29ycnVwdDsgc2VlIGBvdXRPZkJhbmRSb3V0ZVBhcmFtc2AuXG4gICAgICAgIGNvbnN0IG91dE9mQmFuZCA9IG91dE9mQmFuZFJvdXRlUGFyYW1zKFxuICAgICAgICAgIHJlc3VsdC5pbnZvY2F0aW9uVGFyZ2V0LnF1ZXJ5LFxuICAgICAgICAgIHJlc3VsdC5yZXNvbHZlZFBhdGhuYW1lLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBpbnZvY2F0aW9uUXVlcnkgPVxuICAgICAgICAgIG91dE9mQmFuZD8ucXVlcnkgPz8gcmVzdWx0Lmludm9jYXRpb25UYXJnZXQucXVlcnk7XG4gICAgICAgIGNvbnN0IHsgcGF0aG5hbWUgfSA9IHJlc3VsdC5pbnZvY2F0aW9uVGFyZ2V0O1xuICAgICAgICBjb25zdCBzZWFyY2ggPSB0b1NlYXJjaChpbnZvY2F0aW9uUXVlcnkpO1xuICAgICAgICByZXEudXJsID0gc2VhcmNoID8gYCR7cGF0aG5hbWV9PyR7c2VhcmNofWAgOiBwYXRobmFtZTtcbiAgICAgICAgLy8gTWlkZGxld2FyZSBtYXkgaGF2ZSByZXdyaXR0ZW4gcmVxdWVzdCBoZWFkZXJzIHZpYVxuICAgICAgICAvLyBgTmV4dFJlc3BvbnNlLm5leHQoeyByZXF1ZXN0OiB7IGhlYWRlcnMgfSB9KWAuXG4gICAgICAgIHJlcS5oZWFkZXJzID0gdG9JbmNvbWluZ0h0dHBIZWFkZXJzKHJlc3VsdC5yZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIGhhbmRsZXI+WzJdID0ge1xuICAgICAgICAgIHdhaXRVbnRpbCxcbiAgICAgICAgICByZXF1ZXN0TWV0YToge1xuICAgICAgICAgICAgLy8gVGhlIHJlc29sdmVkIHF1ZXJ5LCBzdGF0ZWQgcmF0aGVyIHRoYW4gbGVmdCB0byBiZSByZS1kZXJpdmVkLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIGBSb3V0ZU1vZHVsZS5wcmVwYXJlYCBydW5zIGBoYW5kbGVSZXdyaXRlc2AgYWdhaW5zdCBgcmVxLnVybGBcbiAgICAgICAgICAgIC8vIHVuY29uZGl0aW9uYWxseSwgYW5kIGByZXEudXJsYCBpcyB0aGUgKmFscmVhZHkgcmV3cml0dGVuKiB0YXJnZXQuXG4gICAgICAgICAgICAvLyBBIGBiZWZvcmVGaWxlc2AgcmV3cml0ZSB3aG9zZSBjb25kaXRpb24gc3RpbGwgaG9sZHMgYWZ0ZXIgaXQgaGFzXG4gICAgICAgICAgICAvLyBiZWVuIGFwcGxpZWQgdGhlcmVmb3JlIGdldHMgYXBwbGllZCB0d2ljZTogaW5cbiAgICAgICAgICAgIC8vIGB0ZXN0L2UyZS9saW5rLXdpdGgtYXBpLXJld3JpdGVgIHRoZSBydWxlXG4gICAgICAgICAgICAvLyBgLzpwYXRoKC4qKWAgKyBgaGFzOiBxdWVyeSBqc29uPXRydWVgIC0+IGAvYXBpL2pzb24/ZnJvbT0vOnBhdGhgXG4gICAgICAgICAgICAvLyBtYXRjaGVkIGAvYXBpL2pzb24/anNvbj10cnVlJmZyb209L3NvbWUvcm91dGUvZm9yYCBhIHNlY29uZCB0aW1lXG4gICAgICAgICAgICAvLyBhbmQgb3Zlcndyb3RlIGBmcm9tYCB3aXRoIGAvYXBpL2pzb25gLiBgbmV4dCBzdGFydGAgZXNjYXBlcyBpdFxuICAgICAgICAgICAgLy8gYmVjYXVzZSBpdHMgcm91dGVyIGxlYXZlcyBgcmVxLnVybGAgYXMgdGhlIFVSTCB0aGUgY2xpZW50IHNlbnQsIHNvXG4gICAgICAgICAgICAvLyB0aGUgb25lIHBhc3MgYHByZXBhcmVgIG1ha2VzIGlzIHRoZSBvbmx5IG9uZS5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBgcHJlcGFyZWAgcHJlZmVycyB0aGlzIG1ldGEgb3ZlciBpdHMgb3duIGBwYXJzZWRVcmwucXVlcnlgXG4gICAgICAgICAgICAvLyAoXCJ3aGVuIGRlcGxveWVkIHByb3hpZXMgd2lsbCBhZGQgcXVlcnkgdmFsdWVzIGZyb20gcmVzb2x2aW5nIHRoZVxuICAgICAgICAgICAgLy8gcm91dGVzIHRvIHBhc3MgdG8gZnVuY3Rpb25cIiksIHdoaWNoIGlzIHRoZSBkb2N1bWVudGVkIGRpdmlzaW9uIG9mXG4gICAgICAgICAgICAvLyBsYWJvdXIgZm9yIGEgcHJveHkgaW4gZnJvbnQgb2YgYSBmdW5jdGlvbiAtIGFuZCBpdCBpcyB0aGUgc2FtZVxuICAgICAgICAgICAgLy8gZGl2aXNpb24gdGhlIGByZXEudXJsYCBhYm92ZSByZWxpZXMgb24uIFNldHRpbmcgaXQgZG9lcyBub3Qgc3RvcFxuICAgICAgICAgICAgLy8gdGhlIHNlY29uZCByZXdyaXRlIHBhc3MsIGl0IGp1c3Qgc3RvcHMgdGhhdCBwYXNzIGZyb20gYmVpbmcgd2hhdFxuICAgICAgICAgICAgLy8gdGhlIHJvdXRlIHNlZXMuXG4gICAgICAgICAgICBxdWVyeTogeyAuLi5pbnZvY2F0aW9uUXVlcnkgfSxcbiAgICAgICAgICAgIC8vIFNldCBvbmx5IGZvciBhIGNhcHR1cmUgdGhlIHF1ZXJ5IGNvbnRyYWN0IGNhbm5vdCBjYXJyeSwgYW5kIHRoZW5cbiAgICAgICAgICAgIC8vIGluIHBsYWNlIG9mIGl0IHJhdGhlciB0aGFuIGFsb25nc2lkZS5cbiAgICAgICAgICAgIC4uLihvdXRPZkJhbmQgPyB7IHBhcmFtczogb3V0T2ZCYW5kLnBhcmFtcyB9IDoge30pLFxuICAgICAgICAgICAgLy8gV2l0aG91dCB0aGlzLCBgUm91dGVNb2R1bGUucHJlcGFyZWAgZmFsbHMgYmFjayB0b1xuICAgICAgICAgICAgLy8gYGh0dHA6Ly9sb2NhbGhvc3Qke3JlcS51cmx9YCBhbmQgZXZlcnkgYWJzb2x1dGUgVVJMIGEgcm91dGVcbiAgICAgICAgICAgIC8vIGhhbmRsZXIgYnVpbGRzIGlzIHdyb25nLiBgcmVsYXRpdmVQcm9qZWN0RGlyYCBpcyBkZWxpYmVyYXRlbHlcbiAgICAgICAgICAgIC8vICpub3QqIHBhc3NlZDogdGhlIHJ1bnRpbWUgYGNoZGlyYHMgdG8gdGhlIHByb2plY3QgZGlyLCBzbyB0aGVcbiAgICAgICAgICAgIC8vIHZhbHVlIE5leHQuanMgaW5saW5lZCBhdCBidWlsZCB0aW1lIChcIlwiKSBpcyBhbHJlYWR5IGNvcnJlY3QsIGFuZFxuICAgICAgICAgICAgLy8gYGFwcC1wYWdlLXJ1bnRpbWUuanNgIGlnbm9yZXMgdGhlIHJlcXVlc3RNZXRhIG92ZXJyaWRlIGFueXdheS5cbiAgICAgICAgICAgIGluaXRVUkw6IHVybC5ocmVmLFxuICAgICAgICAgICAgLy8gRmVlZHMgYHJvdXRlclNlcnZlckNvbnRleHQuaG9zdG5hbWVgIChgcm91dGUtbW9kdWxlLmpzYFxuICAgICAgICAgICAgLy8gYGdldFJvdXRlclNlcnZlckNvbnRleHRgKS4gSW5jbHVkZXMgdGhlIHBvcnQsIGJlY2F1c2UgaXQgaXNcbiAgICAgICAgICAgIC8vIGNvbmNhdGVuYXRlZCBpbnRvIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBob3N0bmFtZTogdXJsLmhvc3QsXG4gICAgICAgICAgICAvLyBCb3RoIHJvdXRlcnMgY2FsbCB0aGlzIGZvciBhIGBub3RGb3VuZDogdHJ1ZWAgLyBgbm90Rm91bmQoKWAgdGhhdFxuICAgICAgICAgICAgLy8gdGhlIGVudHJ5cG9pbnQgaXRzZWxmIGNhbm5vdCByZW5kZXIsIGFuZCBmYWxsIGJhY2sgdG9cbiAgICAgICAgICAgIC8vIGByZXMuZW5kKCdUaGlzIHBhZ2UgY291bGQgbm90IGJlIGZvdW5kJylgIOKAlCBubyBzdGF0dXMsIG5vIGFwcCA0MDRcbiAgICAgICAgICAgIC8vIHBhZ2Ug4oCUIHdoZW4gaXQgaXMgYWJzZW50LiBUaGUgYHJlcWAvYHJlc2AgdGhleSBwYXNzIGFyZSB0aGUgb25lc1xuICAgICAgICAgICAgLy8gaGFuZGVkIGluIGp1c3QgYWJvdmUsIHNvIHRoZSBjYXB0dXJlZCBwYWlyIGlzIHVzZWQgaW5zdGVhZCBvZlxuICAgICAgICAgICAgLy8gcmUtZGVyaXZpbmcgdGhlbS5cbiAgICAgICAgICAgIHJlbmRlcjQwNDogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNlbmROb3RGb3VuZChcbiAgICAgICAgICAgICAgICByZXEsXG4gICAgICAgICAgICAgICAgcmVzLFxuICAgICAgICAgICAgICAgIHdhaXRVbnRpbCxcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXIubm90Rm91bmRGb3IodXJsKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyBgcmVzLnJldmFsaWRhdGUoKWAgZnJvbSBhIFBhZ2VzIEFQSSByb3V0ZS4gV2l0aG91dCBpdCwgTmV4dC5qc1xuICAgICAgICAgICAgLy8gZmFsbHMgYmFjayB0byBgZmV0Y2goJ2h0dHBzOi8vJyArIHJlcS5oZWFkZXJzLmhvc3QgKyB1cmxQYXRoKWAg4oCUXG4gICAgICAgICAgICAvLyBhbmQgb25seSB3aGVuIGBleHBlcmltZW50YWwudHJ1c3RIb3N0SGVhZGVyYCBpcyBzZXQsIHdoaWNoIGl0IGlzXG4gICAgICAgICAgICAvLyBub3QsIHNvIGByZXMucmV2YWxpZGF0ZSgpYCB0aHJld1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vICAgRmFpbGVkIHRvIHJldmFsaWRhdGUgLzogSW52YXJpYW50OiBtaXNzaW5nIGludGVybmFsXG4gICAgICAgICAgICAvLyAgIHJvdXRlci1zZXJ2ZXItbWV0aG9kcyB0aGlzIGlzIGFuIGludGVybmFsIGJ1Z1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIGFuZCBgdGVzdC9lMmUvcmV2YWxpZGF0ZS1yZWFzb25gIHNhdyBgc3RhbGVgIHdoZXJlIGBuZXh0IHN0YXJ0YFxuICAgICAgICAgICAgLy8gcmVwb3J0cyBgb24tZGVtYW5kYDogdGhlIHJvdXRlIHN0aWxsIHJlLXJlbmRlcmVkLCBqdXN0IGFzIGFuXG4gICAgICAgICAgICAvLyBvcmRpbmFyeSBzdGFsZSByZWdlbmVyYXRpb24gcmF0aGVyIHRoYW4gdGhlIG9uLWRlbWFuZCBvbmUgaXRcbiAgICAgICAgICAgIC8vIGFza2VkIGZvci5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBBbnN3ZXJpbmcgaXQgaW4gcHJvY2VzcyByYXRoZXIgdGhhbiBieSBzZXR0aW5nXG4gICAgICAgICAgICAvLyBgdHJ1c3RIb3N0SGVhZGVyYDogdGhlIGZldGNoIHBhdGggd291bGQgbGVhdmUgdGhlIGZ1bmN0aW9uLCBjcm9zc1xuICAgICAgICAgICAgLy8gQ2xvdWRGcm9udCBhbmQgY29tZSBiYWNrIOKAlCBhIHNlY29uZCBiaWxsZWQgaW52b2NhdGlvbiwgYVxuICAgICAgICAgICAgLy8gZGVwZW5kZW5jeSBvbiBgeC1wcmVyZW5kZXItcmV2YWxpZGF0ZWAgc3Vydml2aW5nIHRoZSBlZGdlLCBhbmQgYVxuICAgICAgICAgICAgLy8gcmVhc29uIHRvIHRydXN0IGEgY2xpZW50LXN1cHBsaWVkIGBIb3N0YC4gTmV4dC5qcydzIG93blxuICAgICAgICAgICAgLy8gbm9uLXNlcnZlcmxlc3MgYW5zd2VyIGlzIHRoZSBzYW1lIHNoYXBlIGFzIHRoaXMgb25lXG4gICAgICAgICAgICAvLyAoYE5leHRTZXJ2ZXIjcmV2YWxpZGF0ZWAgcnVucyBpdHMgcmVxdWVzdCBoYW5kbGVyIGFnYWluc3QgYVxuICAgICAgICAgICAgLy8gbW9ja2VkIGByZXFgL2ByZXNgKS5cbiAgICAgICAgICAgIHJldmFsaWRhdGU6IChjb25maWc6IFJldmFsaWRhdGVDb25maWcpID0+XG4gICAgICAgICAgICAgIHRoaXMucmV2YWxpZGF0ZShjb25maWcsIHJlcXVlc3QpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlbmRlciA9ICgpID0+IGhhbmRsZXIocmVxLCBhc1NlcnZlclJlc3BvbnNlKHJlcyksIG9wdGlvbnMpO1xuICAgICAgICAvLyBDYXVnaHQgdXAgaGVyZSwgbm90IGluIGByZWZyZXNoVGFnc2A6IE5leHQuanMgYXdhaXRzIHRoYXQgaW5zaWRlIHRoZVxuICAgICAgICAvLyBmaXJzdCBgJ3VzZSBjYWNoZSdgIGxvb2t1cCwgYW5kIGEgd2FpdCB0aGVyZSBjdXRzIHRoZSBzdGF0aWMgc3RhZ2VcbiAgICAgICAgLy8gc2hvcnQuIE9ubHkgZm9yIGEgcGFnZTogbm90aGluZyBlbHNlIGhhcyBhIHN0YXRpYyBzdGFnZSB0byBwcm90ZWN0LFxuICAgICAgICAvLyBhbmQgYSByb3V0ZSBoYW5kbGVyIHRoYXQgcmVhZHMgdGhlIGNhY2hlIHdhaXRzIGluIGByZWZyZXNoVGFnc2BcbiAgICAgICAgLy8gaW5zdGVhZC5cbiAgICAgICAgYXdhaXQgKHJlc3VsdC5lbnRyeXBvaW50LnR5cGUgPT09IFwiYXBwLXBhZ2VcIlxuICAgICAgICAgID8gY2F0Y2hVcFRhZ3MocmVuZGVyKVxuICAgICAgICAgIDogcmVuZGVyKCkpO1xuICAgICAgICAvLyBBIFBhZ2VzIEFQSSByb3V0ZSBvd25zIHRoZSBlbmQgb2YgaXRzIHJlc3BvbnNlOiBgc3RyZWFtLnBpcGUocmVzKWAsXG4gICAgICAgIC8vIGFuIGBleHRlcm5hbFJlc29sdmVyYCBwcm94eSwgb3IgYSBjYWxsYmFjayB0aGF0IGNhbGxzIGByZXMuanNvbigpYFxuICAgICAgICAvLyBsYXRlciBhbGwgcmV0dXJuIGZyb20gdGhlIGhhbmRsZXIgYmVmb3JlIHRoZXkgYXJlIGRvbmUgd3JpdGluZywgYW5kXG4gICAgICAgIC8vIGVuZGluZyBoZXJlIHNlbnQgYW4gZW1wdHkgMjAwIGFuZCBtYWRlIHRoZWlyIHdyaXRlcyB0aHJvd1xuICAgICAgICAvLyBgRVJSX1NUUkVBTV9XUklURV9BRlRFUl9FTkRgLiBgbmV4dCBzdGFydGAncyBgYXBpUmVzb2x2ZXJgIGxlYXZlcyBpdFxuICAgICAgICAvLyBvcGVuIHRvbyDigJQgb25lIHRoYXQgbmV2ZXIgZW5kcyBzdGFsbHMsIHRoZXJlIGFzIGhlcmUuIGBoYW5kbGVgIGF3YWl0c1xuICAgICAgICAvLyB0aGUgcmVzcG9uc2UgaXRzZWxmLCBzbyBub3RoaW5nIGlzIGN1dCBzaG9ydCBieSByZXR1cm5pbmcuXG4gICAgICAgIGlmICghcmVzLndyaXRhYmxlRW5kZWQgJiYgcmVzdWx0LmVudHJ5cG9pbnQudHlwZSAhPT0gXCJwYWdlLWFwaVwiKSB7XG4gICAgICAgICAgcmVzLmVuZCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY2FzZSBcInN0YXRpYy1maWxlXCI6IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzUGFnZSA9XG4gICAgICAgICAgcmVzdWx0LnNvdXJjZSA9PT0gXCJzZXJ2ZXJcIlxuICAgICAgICAgICAgPyB0aGlzLnN0YXR1c1BhZ2VTdGF0dXMocmVzdWx0LnBhdGhuYW1lKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGBuZXh0IHN0YXJ0YCBzZXJ2ZXMgYSBgcHVibGljL2Agb3IgYF9uZXh0L3N0YXRpY2AgZmlsZSB0byBHRVQgYW5kXG4gICAgICAgIC8vIEhFQUQgb25seSwgYW5kIGBzZW5kYCB3b3VsZCBzZXJ2ZSBpdCB0byBhbnkgbWV0aG9kLiBUaGUgc2FtZSBnb2VzIGZvclxuICAgICAgICAvLyBhbiBhdXRvLWV4cG9ydGVkIFBhZ2VzIFJvdXRlciBwYWdlIChgYmFzZS1zZXJ2ZXIuanNgXG4gICAgICAgIC8vIGByZW5kZXJUb1Jlc3BvbnNlV2l0aENvbXBvbmVudHNJbXBsYDogYSBzdHJpbmcgYENvbXBvbmVudGAgYW5zd2Vyc1xuICAgICAgICAvLyBhbnl0aGluZyBlbHNlIHdpdGggYSA0MDUpLCBleGNlcHQgdGhlIDQwNCBhbmQgNTAwIHBhZ2VzLlxuICAgICAgICBpZiAoXG4gICAgICAgICAgcmVxLm1ldGhvZCAhPT0gXCJHRVRcIiAmJlxuICAgICAgICAgIHJlcS5tZXRob2QgIT09IFwiSEVBRFwiICYmXG4gICAgICAgICAgKHJlc3VsdC5zb3VyY2UgIT09IFwic2VydmVyXCIgfHxcbiAgICAgICAgICAgIChzdGF0dXNQYWdlID09PSB1bmRlZmluZWQgJiYgcmVzdWx0LmZpbGVQYXRoLmVuZHNXaXRoKFwiLmh0bWxcIikpKVxuICAgICAgICApIHtcbiAgICAgICAgICBzZW5kTWV0aG9kTm90QWxsb3dlZChyZXMpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBcImVuc3VyZSBjb3JyZWN0IHN0YXR1cyBpcyBzZXQgd2hlbiB2aXNpdGluZyBhIHN0YXR1cyBwYWdlIGRpcmVjdGx5XCI6XG4gICAgICAgIC8vIGBuZXh0IHN0YXJ0YCBhbnN3ZXJzIGAvNDA0YCB3aXRoIGEgNDA0IGFuZCBgLzUwMGAgd2l0aCBhIDUwMCwgbm90IHRoZVxuICAgICAgICAvLyAyMDAgdGhlaXIgcHJlcmVuZGVyZWQgSFRNTCB3b3VsZCBvdGhlcndpc2UgZ28gb3V0IHdpdGguXG4gICAgICAgIGlmIChzdGF0dXNQYWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXMuc3RhdHVzQ29kZSA9IHN0YXR1c1BhZ2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXRhZyA9IHRoaXMub3B0aW9ucy5tYW5pZmVzdC5jb25maWcuZ2VuZXJhdGVFdGFncztcbiAgICAgICAgY29uc3QgcHVibGljRGlyID0gYCR7cHVibGljRGlyS2V5KHRoaXMub3B0aW9ucy5tYW5pZmVzdCl9L2A7XG4gICAgICAgIGNvbnN0IHNlcnZlZCA9XG4gICAgICAgICAgKGF3YWl0IHNlcnZlU3RhdGljRmlsZShcbiAgICAgICAgICAgIHJlcSxcbiAgICAgICAgICAgIHJlcyxcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kZXBsb3ltZW50Um9vdCxcbiAgICAgICAgICAgIHJlc3VsdC5maWxlUGF0aCxcbiAgICAgICAgICAgIHsgZXRhZyB9LFxuICAgICAgICAgICkpIHx8XG4gICAgICAgICAgLy8gTGlzdGVkIGJ1dCBub3Qgc3RhZ2VkOiBhIExhbWJkYSByb290LCB3aG9zZSBgcHVibGljL2AgaXMgaW4gUzMuXG4gICAgICAgICAgKHJlc3VsdC5zb3VyY2UgPT09IFwicHVibGljXCIgJiZcbiAgICAgICAgICAgICEhdGhpcy5wdWJsaWNCdWNrZXQgJiZcbiAgICAgICAgICAgIChhd2FpdCBzZXJ2ZVMzUHVibGljRmlsZShyZXEsIHJlcywge1xuICAgICAgICAgICAgICBidWNrZXQ6IHRoaXMucHVibGljQnVja2V0LFxuICAgICAgICAgICAgICBrZXlQcmVmaXg6IHRoaXMub3B0aW9ucy5idWNrZXRLZXlQcmVmaXggPz8gXCJcIixcbiAgICAgICAgICAgICAgZmlsZTogcmVzdWx0LmZpbGVQYXRoLnNsaWNlKHB1YmxpY0Rpci5sZW5ndGgpLFxuICAgICAgICAgICAgICBldGFnLFxuICAgICAgICAgICAgfSkpKTtcbiAgICAgICAgaWYgKCFzZXJ2ZWQpIHtcbiAgICAgICAgICAvLyBUaGUgcm91dGluZyBydWxlIHRoYXQgbWF0Y2hlZCBhIGJ1aWxkIGFzc2V0IGFscmVhZHkgc2V0IGl0c1xuICAgICAgICAgIC8vIHllYXItbG9uZyBgaW1tdXRhYmxlYCBDYWNoZS1Db250cm9sLCB3aGljaCBgc2VuZFVubWF0Y2hlZGBcbiAgICAgICAgICAvLyByZXBsYWNlczogdW5kZXIgaXQgdGhlIDQwNCB3b3VsZCBiZSBjYWNoZWQgYXQgdGhlIGVkZ2UgYW5kIGluXG4gICAgICAgICAgLy8gYnJvd3NlcnMgZm9yIHRoYXQgbG9uZywgYW5kIGEgY2h1bmsgdGhhdCBzaG93cyB1cCBvbiB0aGUgbmV4dFxuICAgICAgICAgIC8vIGRlcGxveSB3b3VsZCBzdGF5IG1pc3NpbmcuXG4gICAgICAgICAgYXdhaXQgdGhpcy5zZW5kVW5tYXRjaGVkKHJlcSwgcmVzLCB3YWl0VW50aWwsIHJlc3VsdCwgdXJsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNhc2UgXCJpbWFnZS1vcHRpbWl6YXRpb25cIjpcbiAgICAgICAgaWYgKCF0aGlzLmltYWdlcy5pc0VuYWJsZWQoKSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuc2VuZFVubWF0Y2hlZChcbiAgICAgICAgICAgIHJlcSxcbiAgICAgICAgICAgIHJlcyxcbiAgICAgICAgICAgIHdhaXRVbnRpbCxcbiAgICAgICAgICAgIHsgcGF0aG5hbWU6IHVybC5wYXRobmFtZSwgcmVxdWVzdEhlYWRlcnM6IHJlc3VsdC5yZXF1ZXN0SGVhZGVycyB9LFxuICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJlcS5oZWFkZXJzID0gdG9JbmNvbWluZ0h0dHBIZWFkZXJzKHJlc3VsdC5yZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgIGF3YWl0IHRoaXMuaW1hZ2VzLmhhbmRsZShyZXEsIHJlcywgcmVzdWx0LnVybCwgd2FpdFVudGlsKTtcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjYXNlIFwicmVkaXJlY3RcIjpcbiAgICAgICAgc2VuZFJlZGlyZWN0KHJlcywgcmVzdWx0LmxvY2F0aW9uLCByZXN1bHQuc3RhdHVzKTtcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjYXNlIFwiZXh0ZXJuYWwtcmV3cml0ZVwiOlxuICAgICAgICBhd2FpdCBwcm94eUV4dGVybmFsKHJlcSwgcmVzLCByZXN1bHQudXJsLCByZXN1bHQucmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICByZXR1cm47XG5cbiAgICAgIGNhc2UgXCJtaWRkbGV3YXJlLXJlc3BvbmRlZFwiOlxuICAgICAgICBhd2FpdCBzZW5kV2ViUmVzcG9uc2UocmVzLCByZXN1bHQucmVzcG9uc2UpO1xuICAgICAgICByZXR1cm47XG5cbiAgICAgIGNhc2UgXCJyZXNwb25zZVwiOlxuICAgICAgICByZXMuZW5kKCk7XG4gICAgICAgIHJldHVybjtcblxuICAgICAgY2FzZSBcIm5vdC1mb3VuZFwiOlxuICAgICAgICBhd2FpdCB0aGlzLnNlbmRVbm1hdGNoZWQocmVxLCByZXMsIHdhaXRVbnRpbCwgcmVzdWx0LCB1cmwpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIDQwNCBvciA1MDAgd2hlbiBgcGF0aG5hbWVgIGlzIHRoZSBwcmVyZW5kZXJlZCBgLzQwNGAgb3IgYC81MDBgIHBhZ2Ug4oCUIHVuZGVyXG4gICAqIGBiYXNlUGF0aGAgYW5kLCBpbiBhbiBpMThuIGFwcCwgYW55IGxvY2FsZSAoYC9mci80MDRgKSDigJQgYW5kIGB1bmRlZmluZWRgXG4gICAqIG90aGVyd2lzZS4gYG5leHQgc3RhcnRgIG1hdGNoZXMgdGhlIHBhZ2UsIG5vdCB0aGUgVVJMLCBzbyB0aGUgbG9jYWxlIGRvZXNcbiAgICogbm90IG1hdHRlci5cbiAgICovXG4gIHByaXZhdGUgc3RhdHVzUGFnZVN0YXR1cyhwYXRobmFtZTogc3RyaW5nKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB7IGJhc2VQYXRoLCBpMThuIH0gPSB0aGlzLm9wdGlvbnMubWFuaWZlc3QuY29uZmlnO1xuICAgIGxldCBwYWdlID0gd2l0aG91dFBhdGhQcmVmaXgocGF0aG5hbWUsIGJhc2VQYXRoKTtcbiAgICBjb25zdCBsb2NhbGVzID0gKGkxOG4gYXMgeyBsb2NhbGVzPzogcmVhZG9ubHkgc3RyaW5nW10gfSB8IG51bGwpPy5sb2NhbGVzO1xuICAgIGZvciAoY29uc3QgbG9jYWxlIG9mIGxvY2FsZXMgPz8gW10pIHtcbiAgICAgIGNvbnN0IHN0cmlwcGVkID0gd2l0aG91dFBhdGhQcmVmaXgocGFnZSwgYC8ke2xvY2FsZX1gKTtcbiAgICAgIGlmIChzdHJpcHBlZCAhPT0gcGFnZSkge1xuICAgICAgICBwYWdlID0gc3RyaXBwZWQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocGFnZSA9PT0gXCIvNDA0XCIpIHJldHVybiA0MDQ7XG4gICAgaWYgKHBhZ2UgPT09IFwiLzUwMFwiKSByZXR1cm4gNTAwO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogYG5leHQgc3RhcnRgJ3MgYW5zd2VyIHRvIGEgcGF0aCBub3RoaW5nIHNlcnZlcyAoYHJvdXRlci1zZXJ2ZXIuanNgLCB0aGVcbiAgICogXCI0MDQgY2FzZVwiKSwgZm9yIGJvdGggd2F5cyBvZiBnZXR0aW5nIGhlcmU6IGRpc3BhdGNoIG1hdGNoZWQgbm90aGluZywgb3IgaXRcbiAgICogbWF0Y2hlZCBhIGJ1aWxkIGFzc2V0IHRoYXQgaXMgbm90IGluIHRoZSBwYWNrYWdlLlxuICAgKlxuICAgKiBOby1zdG9yZSwgYWx3YXlzLiBBIHByZXJlbmRlcmVkIGAvX25vdC1mb3VuZGAgd291bGQgb3RoZXJ3aXNlIHNlbmQgaXRzXG4gICAqIGNhY2hlIGVudHJ5J3MgeWVhci1sb25nIGBzLW1heGFnZWAsIGFuZCB0aGUgQ0ROIHdvdWxkIGtlZXAgdGhlIDQwNCBwYXN0IHRoZVxuICAgKiBkZXBsb3kgdGhhdCBhZGRzIHRoZSByb3V0ZS4gU2V0IHJhdGhlciB0aGFuIGZvcmNlZDogTmV4dCdzIHBhZ2UgaGFuZGxlcnNcbiAgICogb25seSB3cml0ZSBhIGBDYWNoZS1Db250cm9sYCB3aGVuIG5vbmUgaXMgc2V0IChgc2VuZFJlbmRlclJlc3VsdGAsXG4gICAqIGBwYWdlcy1oYW5kbGVyLmpzYCksIHdoaWNoIGlzIGV4YWN0bHkgaG93IGBuZXh0IHN0YXJ0YCdzIG93biBuby1zdG9yZSBoZXJlXG4gICAqIHN1cnZpdmVzIHRoZSByZW5kZXIuIGByZW5kZXI0MDRgIGlzIG5vdCB0aGlzIHBhdGg6IGEgYG5vdEZvdW5kKClgIGZyb20gYW5cbiAgICogSVNSIHBhZ2UgaXMgY2FjaGVhYmxlIGZvciB0aGF0IHBhZ2UncyByZXZhbGlkYXRlIHBlcmlvZC5cbiAgICpcbiAgICogQSBtaXNzaW5nIGBfbmV4dC9zdGF0aWNgIGZpbGUsIGFuZCBhIEdFVCBvciBIRUFEIHdob3NlIGBTZWMtRmV0Y2gtRGVzdGBcbiAgICogc2F5cyBpdCBjYW5ub3QgZGlzcGxheSBIVE1MIChhbiBgPGltZz5gLCBhIHNjcmlwdCwgYSBmb250KSwgZ2V0IGFcbiAgICogcGxhaW4tdGV4dCBgTm90IEZvdW5kYCBpbnN0ZWFkIG9mIHRoZSByZW5kZXJlZCBwYWdlIOKAlCBub3RoaW5nIHdvdWxkIHNob3dcbiAgICogaXQsIGFuZCByZW5kZXJpbmcgaXQgaXMgdGhlIGV4cGVuc2l2ZSBwYXJ0LlxuICAgKlxuICAgKiBFdmVyeXRoaW5nIGVsc2UgcmVuZGVycyB0aGUgYXBwJ3MgNDA0IGFzIHRoZSBwYXRoIHRoYXQgd2FzIGFza2VkIGZvciwgbm90XG4gICAqIGFzIGAvX25vdC1mb3VuZGA6IHRoZSBBcHAgUm91dGVyIHNlcmlhbGl6ZXMgdGhlIGNhbm9uaWNhbCBVUkwgaW50byB0aGUgUlNDXG4gICAqIHBheWxvYWQsIHNvIGEgY2xpZW50IGh5ZHJhdGVkIG9mZiBhIGAvX25vdC1mb3VuZGAgcGF5bG9hZCByZXBvcnRzIHRoZSB3cm9uZ1xuICAgKiBgdXNlUGF0aG5hbWUoKWAgYW5kIHB1c2hlcyB0aGUgd3JvbmcgaGlzdG9yeSBlbnRyeS4gSXQgcmVuZGVycyB3aXRoIHRoZVxuICAgKiByZXF1ZXN0IGhlYWRlcnMgbWlkZGxld2FyZSBzZXQsIHRvbyDigJQgYSBDU1Agbm9uY2UsIHNheS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2VuZFVubWF0Y2hlZChcbiAgICByZXE6IFNoaW1JbmNvbWluZ01lc3NhZ2UsXG4gICAgcmVzOiBTaGltU2VydmVyUmVzcG9uc2UsXG4gICAgd2FpdFVudGlsOiAocHJvbWlzZTogUHJvbWlzZTx1bmtub3duPikgPT4gdm9pZCxcbiAgICByZXN1bHQ6IHsgcmVhZG9ubHkgcGF0aG5hbWU6IHN0cmluZzsgcmVhZG9ubHkgcmVxdWVzdEhlYWRlcnM6IEhlYWRlcnMgfSxcbiAgICB1cmw6IFVSTCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmVzLnNldEhlYWRlcihcIkNhY2hlLUNvbnRyb2xcIiwgTk9fU1RPUkUpO1xuICAgIGNvbnN0IHsgYmFzZVBhdGgsIGFzc2V0UHJlZml4IH0gPSB0aGlzLm9wdGlvbnMubWFuaWZlc3QuY29uZmlnO1xuICAgIGNvbnN0IHBhdGhuYW1lID0gd2l0aG91dFBhdGhQcmVmaXgoXG4gICAgICB3aXRob3V0UGF0aFByZWZpeChyZXN1bHQucGF0aG5hbWUsIGJhc2VQYXRoKSxcbiAgICAgIGFzc2V0UHJlZml4LFxuICAgICk7XG4gICAgaWYgKFxuICAgICAgcGF0aG5hbWUuc3RhcnRzV2l0aChcIi9fbmV4dC9zdGF0aWMvXCIpIHx8XG4gICAgICAoKHJlcS5tZXRob2QgPT09IFwiR0VUXCIgfHwgcmVxLm1ldGhvZCA9PT0gXCJIRUFEXCIpICYmXG4gICAgICAgIE5PTl9IVE1MX1NFQ19GRVRDSF9ERVNUUy5oYXMoXG4gICAgICAgICAgZmlyc3RWYWx1ZShyZXEuaGVhZGVyc1tcInNlYy1mZXRjaC1kZXN0XCJdKSA/PyBcIlwiLFxuICAgICAgICApKVxuICAgICkge1xuICAgICAgcmVzLnN0YXR1c0NvZGUgPSA0MDQ7XG4gICAgICByZXMuc2V0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOFwiKTtcbiAgICAgIHJlcy5lbmQoXCJOb3QgRm91bmRcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlcS5oZWFkZXJzID0gdG9JbmNvbWluZ0h0dHBIZWFkZXJzKHJlc3VsdC5yZXF1ZXN0SGVhZGVycyk7XG4gICAgYXdhaXQgdGhpcy5zZW5kTm90Rm91bmQoXG4gICAgICByZXEsXG4gICAgICByZXMsXG4gICAgICB3YWl0VW50aWwsXG4gICAgICB0aGlzLmRpc3BhdGNoZXIubm90Rm91bmRGb3IodXJsKSxcbiAgICAgIGAke3Jlc3VsdC5wYXRobmFtZX0ke3VybC5zZWFyY2h9YCxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIE9uZSBvbi1kZW1hbmQgcmV2YWxpZGF0aW9uLCBydW4gYWdhaW5zdCB0aGlzIHJ1bnRpbWUgcmF0aGVyIHRoYW4gb3ZlciB0aGVcbiAgICogbmV0d29yay4gV2lyZWQgaW4gYXMgYHJlcXVlc3RNZXRhLnJldmFsaWRhdGVgOyBzZWUgdGhlIGNvbW1lbnQgdGhlcmUuXG4gICAqXG4gICAqIFRoZSByZXNwb25zZSBpcyB0aHJvd24gYXdheSDigJQgb25seSBpdHMgc3RhdHVzIG1hdHRlcnMg4oCUIGJ1dCBpdCBnb2VzIHRocm91Z2hcbiAgICogdGhlIGZ1bGwge0BsaW5rIGhhbmRsZX0sIHNvIHRoZSBlbnRyeXBvaW50IHNlZXMgYSByZXF1ZXN0IHdpdGhcbiAgICogYHgtcHJlcmVuZGVyLXJldmFsaWRhdGVgIG9uIGl0IGFuZCB3cml0ZXMgdGhlIGZyZXNoIGVudHJ5IHRocm91Z2ggdGhlIGNhY2hlXG4gICAqIGhhbmRsZXIgZXhhY3RseSBhcyBhIHJlcXVlc3QgZnJvbSBvdXRzaWRlIHdvdWxkLiBgaGFuZGxlYCBhd2FpdHMgaXRzIG93blxuICAgKiBgd2FpdFVudGlsYCB3b3JrLCBzbyB0aGUgbmV3IGVudHJ5IGlzIGNvbW1pdHRlZCBiZWZvcmUgYHJlcy5yZXZhbGlkYXRlKClgXG4gICAqIHJlc29sdmVzLCB3aGljaCBpcyB3aGF0IGNhbGxlcnMgdGhhdCByZXZhbGlkYXRlIGFuZCB0aGVuIHJlZGlyZWN0IGRlcGVuZCBvbi5cbiAgICpcbiAgICogVGhlIGFjY2VwdC90aHJvdyBydWxlIGlzIGBOZXh0U2VydmVyI3JldmFsaWRhdGVgJ3MsIHZlcmJhdGltOiBhIHJldmFsaWRhdGlvblxuICAgKiBpcyBzdWNjZXNzZnVsIGlmIGl0IHdhcyBjYWNoZWQgb3IgYW5zd2VyZWQgMjAwLCBhbmQgYG5vdEZvdW5kOiB0cnVlYFxuICAgKiBsZWdpdGltYXRlbHkgYW5zd2VycyA0MDQgZm9yIGFuIGB1bnN0YWJsZV9vbmx5R2VuZXJhdGVkYCBjYWxsZXIuIEFueXRoaW5nXG4gICAqIGVsc2UgdGhyb3dzLCBhbmQgYHJlcy5yZXZhbGlkYXRlKClgIHR1cm5zIGl0IGludG8gYEZhaWxlZCB0byByZXZhbGlkYXRlXG4gICAqIDxwYXRoPjogPG1lc3NhZ2U+YC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmV2YWxpZGF0ZShcbiAgICBjb25maWc6IFJldmFsaWRhdGVDb25maWcsXG4gICAgb3JpZ2luOiBSdW50aW1lUmVxdWVzdCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBoZWFkLCBvdGhlckdyb3VwIH0gPSBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsbHkoXG4gICAgICB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgdXJsOiBjb25maWcudXJsUGF0aCxcbiAgICAgICAgLy8gVGhlIGNhbGxlcidzIGF1dGhvcml0eSwgbm90IHRoZSByZXZhbGlkYXRlZCBwYXRoJ3M6IGl0IGlzIHdoYXRcbiAgICAgICAgLy8gYGFic29sdXRlVXJsYCBidWlsZHMgdGhlIHJlcXVlc3QgVVJMIGZyb20sIGFuZCBhIHJldmFsaWRhdGlvbiBpcyBmb3JcbiAgICAgICAgLy8gdGhlIG9yaWdpbiBiZWluZyBzZXJ2ZWQuIFRoZSBmb3J3YXJkZWQgcGFpciB3aXRoIGl0IOKAlCBiZWhpbmRcbiAgICAgICAgLy8gQ2xvdWRGcm9udCBgaG9zdGAgaXMgdGhlIEZ1bmN0aW9uIFVSTCwgYW5kIGEgcmVuZGVyIHRoYXQgYnVpbHQgaXRzXG4gICAgICAgIC8vIGFic29sdXRlIFVSTHMgZnJvbSB0aGF0IHdvdWxkIGNhY2hlIGxpbmtzIHRvIHRoZSByYXcgZnVuY3Rpb24uXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAuLi5jb25maWcuaGVhZGVycyxcbiAgICAgICAgICBob3N0OiBvcmlnaW4uaGVhZGVycy5ob3N0LFxuICAgICAgICAgIC4uLnBpY2tEZWZpbmVkKG9yaWdpbi5oZWFkZXJzLCBbXG4gICAgICAgICAgICBcIngtZm9yd2FyZGVkLWhvc3RcIixcbiAgICAgICAgICAgIFwieC1mb3J3YXJkZWQtcHJvdG9cIixcbiAgICAgICAgICBdKSxcbiAgICAgICAgfSxcbiAgICAgICAgZW5jcnlwdGVkOiBvcmlnaW4uZW5jcnlwdGVkLFxuICAgICAgICB0cnVzdEZvcndhcmRlZEhvc3Q6IG9yaWdpbi50cnVzdEZvcndhcmRlZEhvc3QsXG4gICAgICB9LFxuICAgICAge30sXG4gICAgKTtcblxuICAgIGNvbnN0IHN0YXR1cyA9IGhlYWQ/LnN0YXR1c0NvZGUgPz8gNTAwO1xuICAgIGlmIChvdGhlckdyb3VwKSB7XG4gICAgICBjb25zdCBzZWxmID0gcHJvY2Vzcy5lbnZbRlVOQ1RJT05fR1JPVVBfRU5WX1ZBUl07XG4gICAgICAvLyBBIHBhZ2UgcGFja2FnZWQgaW50byBhbm90aGVyIGBmdW5jdGlvbkdyb3Vwc2AgZ3JvdXA6IGl0IGlzIHJlbmRlcmVkIGluXG4gICAgICAvLyBwcm9jZXNzLCBhbmQgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBoYXZlIHRoZSBwYWdlJ3MgY29kZS4gQ2hlY2tlZFxuICAgICAgLy8gZmlyc3QgYmVjYXVzZSBpdCByZW5kZXJzIGFzIGEgNDA0LCB3aGljaCBgdW5zdGFibGVfb25seUdlbmVyYXRlZGBcbiAgICAgIC8vIHdvdWxkIG90aGVyd2lzZSBhY2NlcHQuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIHJlc3BvbnNlICR7c3RhdHVzfTogXCIke2NvbmZpZy51cmxQYXRofVwiIGJlbG9uZ3MgdG8gYCArXG4gICAgICAgICAgYFxcYGZ1bmN0aW9uR3JvdXBzXFxgIGdyb3VwIFwiJHtvdGhlckdyb3VwLm93bmVyfVwiLCBhbmQgYCArXG4gICAgICAgICAgYHJlcy5yZXZhbGlkYXRlKCkgY2FuIG9ubHkgcmV2YWxpZGF0ZSBwYWdlcyBpbiB0aGUgZ3JvdXAgaXQgcnVucyBgICtcbiAgICAgICAgICBgaW4gKFwiJHtzZWxmfVwiKS4gQ2FsbCBpdCBmcm9tIGFuIEFQSSByb3V0ZSBpbiBncm91cCBgICtcbiAgICAgICAgICBgXCIke290aGVyR3JvdXAub3duZXJ9XCIsIG9yIHVzZSByZXZhbGlkYXRlUGF0aCgpL3JldmFsaWRhdGVUYWcoKSwgYCArXG4gICAgICAgICAgYHdoaWNoIHdvcmsgZnJvbSBhbnkgZ3JvdXAuYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGhlYWQ/LmhlYWRlcnNbXCJ4LW5leHRqcy1jYWNoZVwiXSAhPT0gXCJSRVZBTElEQVRFRFwiICYmXG4gICAgICBzdGF0dXMgIT09IDIwMCAmJlxuICAgICAgIShzdGF0dXMgPT09IDQwNCAmJiBjb25maWcub3B0cy51bnN0YWJsZV9vbmx5R2VuZXJhdGVkKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJlc3BvbnNlICR7c3RhdHVzfWApO1xuICAgIH1cblxuICAgIGF3YWl0IGludmFsaWRhdGVSZXZhbGlkYXRlZFBhZ2UoY29uZmlnLnVybFBhdGgsIHRoaXMub3B0aW9ucy5tYW5pZmVzdCk7XG4gIH1cblxuICAvKipcbiAgICogQW4gaW1hZ2Ugb3B0aW1pemF0aW9uIHNvdXJjZSB0aGF0IGlzIG5vdCBhIGZpbGU6IGA8SW1hZ2Ugc3JjPVwiL2FwaS9hdmF0YXJcIj5gXG4gICAqIHNlcnZlZCBieSBhIHJvdXRlIGhhbmRsZXIuIFdpcmVkIGluIGFzIHRoZSBvcHRpbWl6ZXIncyBgZmV0Y2hJbnRlcm5hbGAsIGFuZFxuICAgKiBydW4gaW4gcHJvY2VzcyBmb3IgdGhlIHJlYXNvbnMge0BsaW5rIHJldmFsaWRhdGV9IGlzIOKAlCBgbmV4dCBzdGFydGAgZmV0Y2hlc1xuICAgKiB0aGUgc291cmNlIGZyb20gaXRzZWxmIG92ZXIgbG9vcGJhY2ssIHdoaWNoIGhlcmUgd291bGQgYmUgYSBzZWNvbmQgYmlsbGVkXG4gICAqIGludm9jYXRpb24gdGhyb3VnaCBDbG91ZEZyb250LlxuICAgKlxuICAgKiBPbmx5IHRoZSBhdXRob3JpdHkgaXMgZm9yd2FyZGVkLCBhcyBgbmV4dCBzdGFydGAncyBgZmV0Y2hJbnRlcm5hbEltYWdlYFxuICAgKiBmb3J3YXJkcyBub25lIG9mIHRoZSB2aWV3ZXIncyBoZWFkZXJzOiB0aGUgc291cmNlIGlzIGNhY2hlZCBhbmQgc2VydmVkIHRvXG4gICAqIGV2ZXJ5b25lLCBzbyBpdCBtdXN0IG5vdCBkZXBlbmQgb24gb25lIHZpZXdlcidzIGNvb2tpZXMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoSW50ZXJuYWwoXG4gICAgaHJlZjogc3RyaW5nLFxuICAgIHJlcTogU2hpbUluY29taW5nTWVzc2FnZSxcbiAgICBtYXhpbXVtQm9keTogbnVtYmVyLFxuICApOiBQcm9taXNlPEludGVybmFsSW1hZ2VSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcXVlc3Q6IFJ1bnRpbWVSZXF1ZXN0ID0ge1xuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgdXJsOiBocmVmLFxuICAgICAgaGVhZGVyczogcGlja0RlZmluZWQocmVxLmhlYWRlcnMsIFtcbiAgICAgICAgXCJob3N0XCIsXG4gICAgICAgIFwieC1mb3J3YXJkZWQtaG9zdFwiLFxuICAgICAgICBcIngtZm9yd2FyZGVkLXByb3RvXCIsXG4gICAgICBdKSxcbiAgICAgIGVuY3J5cHRlZDogKHJlcS5zb2NrZXQgYXMgeyBlbmNyeXB0ZWQ/OiBib29sZWFuIH0gfCB1bmRlZmluZWQpPy5lbmNyeXB0ZWQsXG4gICAgICB0cnVzdEZvcndhcmRlZEhvc3Q6IHJlcS50cnVzdEZvcndhcmRlZEhvc3QsXG4gICAgfTtcbiAgICBjb25zdCB7IGhlYWQsIGJvZHksIG90aGVyR3JvdXAsIHRvb0xhcmdlIH0gPSBhd2FpdCB0aGlzLmhhbmRsZUludGVybmFsbHkoXG4gICAgICByZXF1ZXN0LFxuICAgICAgeyBtYXhpbXVtQm9keSB9LFxuICAgICk7XG4gICAgaWYgKHRvb0xhcmdlKSB7XG4gICAgICByZXR1cm4geyBzdGF0dXNDb2RlOiAwLCBoZWFkZXJzOiB7fSwgYm9keTogQnVmZmVyLmFsbG9jKDApLCB0b29MYXJnZSB9O1xuICAgIH1cbiAgICBpZiAob3RoZXJHcm91cCkge1xuICAgICAgLy8gVGhlIGVkZ2Ugc2VuZHMgZXZlcnkgYC9fbmV4dC9pbWFnZWAgcmVxdWVzdCB0byB0aGUgZGVmYXVsdCBncm91cCwgYW5kXG4gICAgICAvLyB0aGUgc291cmNlIGlzIHJlbmRlcmVkIGluIHByb2Nlc3MsIHNvIGEgcm91dGUgcGFja2FnZWQgaW50byBhbm90aGVyXG4gICAgICAvLyBncm91cCBpcyBvdXQgb2YgcmVhY2g6IHRoZSBvcHRpbWl6ZXIgYW5zd2VycyAoYW5kIGxvZ3MpIGEgNTAyLlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhdHVzQ29kZTogMCxcbiAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgIGJvZHk6IEJ1ZmZlci5hbGxvYygwKSxcbiAgICAgICAgb3RoZXJHcm91cDogb3RoZXJHcm91cC5vd25lcixcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXNDb2RlOiBoZWFkPy5zdGF0dXNDb2RlID8/IDAsXG4gICAgICBoZWFkZXJzOiBoZWFkPy5oZWFkZXJzID8/IHt9LFxuICAgICAgYm9keSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIE9uZSByZXF1ZXN0IHRocm91Z2gge0BsaW5rIGhhbmRsZX0sIGFuc3dlcmVkIHRvIHRoaXMgcnVudGltZSBpbnN0ZWFkIG9mIGFcbiAgICogY2xpZW50OiB0aGUgaGVhZCwgdGhlIGJvZHkgd2hlbiBpdCBpcyB3YW50ZWQsIGFuZCB0aGUgZXJyb3Igd2hlbiB0aGUgcm91dGVcbiAgICogaXMgcGFja2FnZWQgaW50byBhbm90aGVyIGBmdW5jdGlvbkdyb3Vwc2AgZ3JvdXAuIGBoYW5kbGVgIGF3YWl0cyB0aGVcbiAgICogcmVxdWVzdCdzIGB3YWl0VW50aWxgIHdvcmsgdG9vLCBzbyB3aGF0ZXZlciB0aGUgcmVuZGVyIHdyb3RlIGlzIGNvbW1pdHRlZCBieVxuICAgKiB0aGUgdGltZSB0aGlzIHJlc29sdmVzLlxuICAgKlxuICAgKiBUaGUgYm9keSBpcyBrZXB0IG9ubHkgd2hlbiBgbWF4aW11bUJvZHlgIGlzIHNldC4gT25lIHBhc3QgaXQgZmFpbHMgdGhlXG4gICAqIHJlc3BvbnNlIHN0cmVhbSwgd2hpY2ggc3RvcHMgdGhlIHJvdXRlIHdyaXRpbmcsIGFuZCBjb21lcyBiYWNrIGFzXG4gICAqIGB0b29MYXJnZWAgcmF0aGVyIHRoYW4gaGVsZCBpbiBtZW1vcnkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGhhbmRsZUludGVybmFsbHkoXG4gICAgcmVxdWVzdDogUnVudGltZVJlcXVlc3QsXG4gICAgb3B0aW9uczogeyByZWFkb25seSBtYXhpbXVtQm9keT86IG51bWJlciB9LFxuICApOiBQcm9taXNlPHtcbiAgICBoZWFkPzogUmVzcG9uc2VIZWFkO1xuICAgIGJvZHk6IEJ1ZmZlcjtcbiAgICBvdGhlckdyb3VwPzogUm91dGVJbk90aGVyR3JvdXBFcnJvcjtcbiAgICB0b29MYXJnZTogYm9vbGVhbjtcbiAgfT4ge1xuICAgIGxldCBoZWFkOiBSZXNwb25zZUhlYWQgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgY2h1bmtzOiBCdWZmZXJbXSA9IFtdO1xuICAgIGxldCBzaXplID0gMDtcbiAgICBsZXQgdG9vTGFyZ2UgPSBmYWxzZTtcbiAgICBsZXQgb3RoZXJHcm91cDogUm91dGVJbk90aGVyR3JvdXBFcnJvciB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBvblJvdXRlSW5PdGhlckdyb3VwID0gKGVycm9yOiBSb3V0ZUluT3RoZXJHcm91cEVycm9yKSA9PiB7XG4gICAgICBvdGhlckdyb3VwID0gZXJyb3I7XG4gICAgfTtcbiAgICBhd2FpdCB0aGlzLmhhbmRsZShcbiAgICAgIHsgLi4ucmVxdWVzdCwgb25Sb3V0ZUluT3RoZXJHcm91cCB9LFxuICAgICAge1xuICAgICAgICBiZWdpbihyZXNwb25zZUhlYWQpIHtcbiAgICAgICAgICBoZWFkID0gcmVzcG9uc2VIZWFkO1xuICAgICAgICAgIHJldHVybiBuZXcgV3JpdGFibGUoe1xuICAgICAgICAgICAgd3JpdGUoY2h1bms6IEJ1ZmZlciwgX2VuY29kaW5nLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5tYXhpbXVtQm9keSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gY2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgc2l6ZSArPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICBpZiAoc2l6ZSA+IG9wdGlvbnMubWF4aW11bUJvZHkpIHtcbiAgICAgICAgICAgICAgICB0b29MYXJnZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcihcIk92ZXIgaW1hZ2VzLm1heGltdW1SZXNwb25zZUJvZHlcIikpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNodW5rcy5wdXNoKEJ1ZmZlci5mcm9tKGNodW5rKSk7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICBoZWFkLFxuICAgICAgYm9keTogdG9vTGFyZ2UgPyBCdWZmZXIuYWxsb2MoMCkgOiBCdWZmZXIuY29uY2F0KGNodW5rcyksXG4gICAgICBvdGhlckdyb3VwLFxuICAgICAgdG9vTGFyZ2UsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHAgUm91dGVyIGJ1aWxkcyBhbiBpbnZvY2FibGUgYC9fbm90LWZvdW5kYCwgUGFnZXMgUm91dGVyIGEgcHJlcmVuZGVyZWRcbiAgICogYDQwNC5odG1sYCAocGVyIGxvY2FsZSB1bmRlciBpMThuKSBvciBlbHNlIGAvX2Vycm9yYDsgc2VlIGBzdGF0dXNUYXJnZXRzYC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2VuZE5vdEZvdW5kKFxuICAgIHJlcTogU2hpbUluY29taW5nTWVzc2FnZSxcbiAgICByZXM6IFNoaW1TZXJ2ZXJSZXNwb25zZSxcbiAgICB3YWl0VW50aWw6IChwcm9taXNlOiBQcm9taXNlPHVua25vd24+KSA9PiB2b2lkLFxuICAgIHRhcmdldDogU3RhdHVzVGFyZ2V0LFxuICAgIC8qKlxuICAgICAqIFdoYXQgdG8gcmVuZGVyIHRoZSA0MDQgYXMuIE9taXR0ZWQgYnkgYHJlbmRlcjQwNGAsIHdoaWNoIGlzIGNhbGxlZFxuICAgICAqIG1pZC1yZW5kZXIgd2l0aCBgcmVxLnVybGAgYWxyZWFkeSBwb2ludGluZyBhdCB0aGUgcm91dGUgdGhhdCBnYXZlIHVwIOKAlFxuICAgICAqIHRoZSBwYXRoIE5leHQuanMgd291bGQgcmVuZGVyIHRoYXQgNDA0IGZvci5cbiAgICAgKi9cbiAgICByZXF1ZXN0ZWRVcmw/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJlcy5zdGF0dXNDb2RlID0gNDA0O1xuXG4gICAgaWYgKHRhcmdldC5raW5kID09PSBcImVudHJ5cG9pbnRcIikge1xuICAgICAgY29uc3QgaGFuZGxlciA9IGF3YWl0IHRoaXMuZW50cnlwb2ludHMubG9hZCh0YXJnZXQuZW50cnlwb2ludCk7XG4gICAgICByZXEudXJsID0gcmVxdWVzdGVkVXJsID8/IHJlcS51cmw7XG4gICAgICBjb25zdCByZW5kZXIgPSAoKSA9PiBoYW5kbGVyKHJlcSwgYXNTZXJ2ZXJSZXNwb25zZShyZXMpLCB7IHdhaXRVbnRpbCB9KTtcbiAgICAgIC8vIEFwcCBSb3V0ZXIncyBgL19ub3QtZm91bmRgIGlzIGEgcGFnZSByZW5kZXIgdG9vOiBzZWUgYHJvdXRlYC5cbiAgICAgIGF3YWl0ICh0YXJnZXQuZW50cnlwb2ludC50eXBlID09PSBcImFwcC1wYWdlXCJcbiAgICAgICAgPyBjYXRjaFVwVGFncyhyZW5kZXIpXG4gICAgICAgIDogcmVuZGVyKCkpO1xuICAgICAgaWYgKCFyZXMud3JpdGFibGVFbmRlZCkge1xuICAgICAgICByZXMuZW5kKCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGFyZ2V0LmtpbmQgPT09IFwic3RhdGljLWZpbGVcIiAmJlxuICAgICAgKGF3YWl0IHRoaXMuc2VuZEh0bWxGaWxlKHJlcywgdGFyZ2V0KSlcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXMuc2V0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOFwiKTtcbiAgICByZXMuZW5kKFwiVGhpcyBwYWdlIGNvdWxkIG5vdCBiZSBmb3VuZC5cIik7XG4gIH1cblxuICAvKipcbiAgICogVHVybiBhIHRocm93biBlcnJvciBpbnRvIGEgcmVzcG9uc2UsIHJlbmRlcmluZyB0aGUgYXBwJ3MgZXJyb3IgcGFnZSB3aGVuIGl0XG4gICAqIGhhcyBvbmUuXG4gICAqXG4gICAqIE5leHQuanMncyBvd24gcGFnZSBoYW5kbGVycyBjYXRjaCwgcmVwb3J0IGFuZCB0aGVuICpyZXRocm93KiAoXCJyZXRocm93IHNvXG4gICAqIHRoYXQgd2UgY2FuIGhhbmRsZSBzZXJ2aW5nIGVycm9yIHBhZ2VcIiwgYHBhZ2VzLWhhbmRsZXIudHNgKSwgd2hpY2ggbWFrZXMgdGhlXG4gICAqIGVycm9yIHBhZ2UgdGhlIGhvc3QncyBqb2Ig4oCUIHRoZSBzYW1lIGRpdmlzaW9uIG9mIGxhYm9yIGFzIGByZW5kZXI0MDRgLiBXaXRob3V0XG4gICAqIHRoaXMgbGFkZGVyIGV2ZXJ5IHRocm93IGFuc3dlcmVkIGEgYmFyZSBgdGV4dC9wbGFpbmAgNTAwIGFuZCBhIGN1c3RvbVxuICAgKiBgcGFnZXMvX2Vycm9yYCB3YXMgZGVhZCBjb2RlIChgdGVzdC9lMmUvYXN5bmMtbW9kdWxlc2AsIHdob3NlIGAvbWFrZS1lcnJvcmBcbiAgICogdGhyb3dzIGluIGBnZXRTZXJ2ZXJTaWRlUHJvcHNgKS5cbiAgICpcbiAgICogT25jZSB0aGUgaGVhZCBpcyBvdXQgdGhlcmUgaXMgbm90aGluZyB0byBzYXkg4oCUIGRlc3Ryb3lpbmcgdGhlIHN0cmVhbSBpcyB3aGF0XG4gICAqIHRlbGxzIHRoZSBjbGllbnQgdGhlIHJlc3BvbnNlIGlzIHRydW5jYXRlZCByYXRoZXIgdGhhbiBjb21wbGV0ZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2VuZEVycm9yKFxuICAgIHJlcTogU2hpbUluY29taW5nTWVzc2FnZSxcbiAgICByZXM6IFNoaW1TZXJ2ZXJSZXNwb25zZSxcbiAgICB3YWl0VW50aWw6IChwcm9taXNlOiBQcm9taXNlPHVua25vd24+KSA9PiB2b2lkLFxuICAgIGVycm9yOiB1bmtub3duLFxuICAgIC8qKiBUaGUgcmVxdWVzdCwgYXMgcmVjZWl2ZWQ6IHdoaWNoIGxvY2FsZSdzIHByZXJlbmRlcmVkIDUwMCB0byBzZW5kLiAqL1xuICAgIHVybDogVVJMIHwgdW5kZWZpbmVkLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zb2xlLmVycm9yKFwiVW5oYW5kbGVkIGVycm9yIHdoaWxlIGhhbmRsaW5nIHRoZSByZXF1ZXN0OlwiLCBlcnJvcik7XG4gICAgaWYgKHJlcy5oZWFkZXJzU2VudCkge1xuICAgICAgcmVzLmRlc3Ryb3koYXNFcnJvcihlcnJvcikpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXMuc3RhdHVzQ29kZSA9IDUwMDtcbiAgICAvLyBBIGZhaWxlZCByZW5kZXIgbWF5IGhhdmUgc2V0IGhlYWRlcnMgZGVzY3JpYmluZyBhIGJvZHkgdGhhdCBuZXZlclxuICAgIC8vIGFycml2ZWQuIEV2ZXJ5IHJ1bmcgYmVsb3cgc2VuZHMgYSBkaWZmZXJlbnQgYm9keSwgc28gdGhleSBnbyBmaXJzdDogYVxuICAgIC8vIHN0YWxlIGBDb250ZW50LUxlbmd0aGAgb24gYSA1MDAuaHRtbCBvZiBhbm90aGVyIHNpemUgaGFuZ3MgdGhlIGNsaWVudCBvclxuICAgIC8vIGRlc3luY3MgYSBrZWVwLWFsaXZlIGNvbm5lY3Rpb24uXG4gICAgcmVzLnJlbW92ZUhlYWRlcihcIkNvbnRlbnQtTGVuZ3RoXCIpO1xuICAgIHJlcy5yZW1vdmVIZWFkZXIoXCJFVGFnXCIpO1xuICAgIC8vIEV2ZXJ5IHJ1bmcsIHRoZSBlcnJvci1wYWdlIGVudHJ5cG9pbnQgaW5jbHVkZWQ6IG90aGVyd2lzZSB0aGUgdGhyb3dpbmdcbiAgICAvLyByZW5kZXIncyBgcy1tYXhhZ2VgIChvciBhIGBoZWFkZXJzKClgIHJ1bGUncykgcmlkZXMgYWxvbmcgYW5kIENsb3VkRnJvbnRcbiAgICAvLyBjYWNoZXMgdGhlIDUwMC4gYG5leHQgc3RhcnRgIHNldHMgaXQgYmVmb3JlIHJlbmRlcmluZyB0aGUgZXJyb3IgcGFnZSB0b28uXG4gICAgcmVzLnNldEhlYWRlcihcIkNhY2hlLUNvbnRyb2xcIiwgTk9fU1RPUkUpO1xuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuZXJyb3JUYXJnZXRGb3IodXJsKTtcblxuICAgIGlmICh0YXJnZXQua2luZCA9PT0gXCJlbnRyeXBvaW50XCIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBhd2FpdCB0aGlzLmVudHJ5cG9pbnRzLmxvYWQodGFyZ2V0LmVudHJ5cG9pbnQpO1xuICAgICAgICAvLyBgcmVxLnVybGAgaXMgbGVmdCBhbG9uZTogdGhlIGVycm9yIHBhZ2UgcmVuZGVycyBmb3IgdGhlIFVSTCB0aGF0IHdhc1xuICAgICAgICAvLyBhc2tlZCBmb3IsIGFuZCBgX2Vycm9yYCdzIGBnZXRJbml0aWFsUHJvcHNgIHJlYWRzIHRoZSBzdGF0dXMgb2ZmIGByZXNgLFxuICAgICAgICAvLyB3aGljaCBpcyB3aHkgdGhlIDUwMCBhYm92ZSBpcyBzZXQgZmlyc3QuXG4gICAgICAgIGF3YWl0IGhhbmRsZXIocmVxLCBhc1NlcnZlclJlc3BvbnNlKHJlcyksIHsgd2FpdFVudGlsIH0pO1xuICAgICAgICBpZiAoIXJlcy53cml0YWJsZUVuZGVkKSB7XG4gICAgICAgICAgcmVzLmVuZCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKGVycm9yUGFnZUVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJUaGUgZXJyb3IgcGFnZSBpdHNlbGYgZmFpbGVkIHRvIHJlbmRlcjpcIixcbiAgICAgICAgICBlcnJvclBhZ2VFcnJvcixcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHJlcy5oZWFkZXJzU2VudCkge1xuICAgICAgICAgIHJlcy5kZXN0cm95KGFzRXJyb3IoZXJyb3JQYWdlRXJyb3IpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0YXJnZXQua2luZCA9PT0gXCJzdGF0aWMtZmlsZVwiICYmXG4gICAgICAoYXdhaXQgdGhpcy5zZW5kSHRtbEZpbGUocmVzLCB0YXJnZXQpKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEFnYWluOiBhbiBlcnJvciBwYWdlIHRoYXQgdGhyZXcgbWF5IGhhdmUgZGVzY3JpYmVkIGl0cyBvd24gYm9keSB0b28uXG4gICAgcmVzLnJlbW92ZUhlYWRlcihcIkNvbnRlbnQtTGVuZ3RoXCIpO1xuICAgIHJlcy5yZW1vdmVIZWFkZXIoXCJFVGFnXCIpO1xuICAgIHJlcy5zdGF0dXNDb2RlID0gNTAwO1xuICAgIHJlcy5zZXRIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04XCIpO1xuICAgIHJlcy5zZXRIZWFkZXIoXCJDYWNoZS1Db250cm9sXCIsIE5PX1NUT1JFKTtcbiAgICByZXMuZW5kKFwiSW50ZXJuYWwgU2VydmVyIEVycm9yXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgcHJlcmVuZGVyZWQgNDA0IG9yIDUwMCBwYWdlLCBvciBgZmFsc2VgIHdoZW4gaXQgY2Fubm90IGJlIHJlYWQgYW5kIHRoZVxuICAgKiBjYWxsZXIncyBwbGFpbi10ZXh0IGZhbGxiYWNrIHNob3VsZCBhbnN3ZXIuIFJlYWQgcmF0aGVyIHRoYW4gYHNlcnZlU3RhdGljYCxcbiAgICogd2hpY2gga2VlcHMgdGhlIHN0YXR1cyBhbHJlYWR5IHNldCBidXQgd291bGQgYW5zd2VyIGEgYFJhbmdlYCByZXF1ZXN0IHdpdGhcbiAgICogYSAyMDYgb2YgdGhlIGVycm9yIHBhZ2UsIGFuZCBhZGQgYEVUYWdgLCBgTGFzdC1Nb2RpZmllZGAgYW5kLCB3aGVyZSBub25lIGlzXG4gICAqIHNldCB5ZXQsIGEgcHVibGljIGBDYWNoZS1Db250cm9sYCB0byBpdC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2VuZEh0bWxGaWxlKFxuICAgIHJlczogU2hpbVNlcnZlclJlc3BvbnNlLFxuICAgIHRhcmdldDogeyByZWFkb25seSBmaWxlUGF0aDogc3RyaW5nIH0sXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGxldCBodG1sOiBCdWZmZXI7XG4gICAgdHJ5IHtcbiAgICAgIGh0bWwgPSBhd2FpdCByZWFkRmlsZShqb2luKHRoaXMub3B0aW9ucy5kZXBsb3ltZW50Um9vdCwgdGFyZ2V0LmZpbGVQYXRoKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJlcy5zZXRIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLThcIik7XG4gICAgcmVzLmVuZChodG1sKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG4vKipcbiAqIFdoYXQgbmV4dCBzZW5kcyB3aXRoIGFuIGVycm9yIGl0IHJlbmRlcmVkIGl0c2VsZi4gV2l0aG91dCBpdCBhIGBDYWNoZS1Db250cm9sYFxuICogbGVmdCBiZWhpbmQgYnkgdGhlIHJlbmRlciB0aGF0IHRocmV3IGNhbiBnZXQgYSA1MDAgY2FjaGVkIGF0IHRoZSBlZGdlLlxuICovXG5jb25zdCBOT19TVE9SRSA9IFwicHJpdmF0ZSwgbm8tY2FjaGUsIG5vLXN0b3JlLCBtYXgtYWdlPTAsIG11c3QtcmV2YWxpZGF0ZVwiO1xuXG4vKipcbiAqIGBTZWMtRmV0Y2gtRGVzdGAgdmFsdWVzIHRoYXQgY2FuIG5ldmVyIGRpc3BsYXkgYW4gSFRNTCByZXNwb25zZSwgZnJvbVxuICogYG5leHQvZGlzdC9zZXJ2ZXIvbGliL2lzLW5vbi1odG1sLXNlYy1mZXRjaC1kZXN0LmpzYC4gUmVzdGF0ZWQgcmF0aGVyIHRoYW5cbiAqIHJlcXVpcmVkLCBiZWNhdXNlIHRoYXQgbW9kdWxlIGlzIHJlY2VudCBhbmQgdGhlIGFwcCdzIGBuZXh0YCBtYXkgcHJlZGF0ZSBpdDpcbiAqIGEgZmFpbGVkIHJlcXVpcmUgaGVyZSB3b3VsZCB0dXJuIGV2ZXJ5IDQwNCBpbnRvIGEgNTAwLiBFeGNsdWRlcyBgZG9jdW1lbnRgLFxuICogYGlmcmFtZWAgYW5kIHRoZSBsaWtlLCBhbmQgYGVtcHR5YCDigJQgYGZldGNoKClgLCB3aGljaCBpcyBob3cgUlNDIHJlcXVlc3RzIGdvLlxuICovXG5jb25zdCBOT05fSFRNTF9TRUNfRkVUQ0hfREVTVFM6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KFtcbiAgXCJhdWRpb1wiLFxuICBcImF1ZGlvd29ya2xldFwiLFxuICBcImZvbnRcIixcbiAgXCJpbWFnZVwiLFxuICBcImpzb25cIixcbiAgXCJtYW5pZmVzdFwiLFxuICBcInBhaW50d29ya2xldFwiLFxuICBcInJlcG9ydFwiLFxuICBcInNjcmlwdFwiLFxuICBcInNlcnZpY2V3b3JrZXJcIixcbiAgXCJzaGFyZWR3b3JrZXJcIixcbiAgXCJzdHlsZVwiLFxuICBcInRyYWNrXCIsXG4gIFwidmlkZW9cIixcbiAgXCJ3ZWJpZGVudGl0eVwiLFxuICBcIndvcmtlclwiLFxuICBcInhzbHRcIixcbl0pO1xuXG4vKipcbiAqIGBJTlRFUk5BTF9IRUFERVJTYCBmcm9tIGBuZXh0L2Rpc3Qvc2VydmVyL2xpYi9zZXJ2ZXItaXBjL3V0aWxzLmpzYCAoTmV4dFxuICogMTYuMyksIHdoaWNoIGBuZXh0IHN0YXJ0YCBkZWxldGVzIGZyb20gZXZlcnkgcmVxdWVzdCBiZWZvcmUgcm91dGluZyBpdFxuICogKGBmaWx0ZXJJbnRlcm5hbEhlYWRlcnNgIGluIGByb3V0ZXItc2VydmVyLmpzYCkuIFRoZXkgYXJlIHNpZ25hbHMgYmV0d2VlblxuICogTmV4dCdzIG93biByb3V0ZXIgYW5kIHJlbmRlciBsYXllcnM7IGhvbm9yaW5nIG9uZSBhIGNsaWVudCBzZW50IGxldHMgaXQgc3RlZXJcbiAqIHRob3NlIGxheWVycyDigJQgYG5leHQtcmVzdW1lYCBtYWtlcyBhIFBQUiBwYWdlIHJlc3VtZSBmcm9tIGEgcG9zdHBvbmVkIHN0YXRlXG4gKiB0aGUgY2xpZW50IHN1cHBsaWVzLiBSZXN0YXRlZCByYXRoZXIgdGhhbiByZXF1aXJlZCwgbGlrZVxuICoge0BsaW5rIE5PTl9IVE1MX1NFQ19GRVRDSF9ERVNUU30uXG4gKi9cbmNvbnN0IElOVEVSTkFMX0hFQURFUlM6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KFtcbiAgXCJ4LW1pZGRsZXdhcmUtcmV3cml0ZVwiLFxuICBcIngtbWlkZGxld2FyZS1yZWRpcmVjdFwiLFxuICBcIngtbWlkZGxld2FyZS1zZXQtY29va2llXCIsXG4gIFwieC1taWRkbGV3YXJlLXNraXBcIixcbiAgXCJ4LW1pZGRsZXdhcmUtb3ZlcnJpZGUtaGVhZGVyc1wiLFxuICBcIngtbWlkZGxld2FyZS1uZXh0XCIsXG4gIFwieC1ub3ctcm91dGUtbWF0Y2hlc1wiLFxuICBcIngtbWF0Y2hlZC1wYXRoXCIsXG4gIFwieC1uZXh0anMtZGF0YVwiLFxuICBcIngtbmV4dC1yZXN1bWUtc3RhdGUtbGVuZ3RoXCIsXG4gIFwibmV4dC1yZXN1bWVcIixcbl0pO1xuXG4vKipcbiAqIFRoZSByZXF1ZXN0IGhlYWRlcnMgd2l0aCB7QGxpbmsgSU5URVJOQUxfSEVBREVSU30gcmVtb3ZlZCwgYW5kIGB4LW5leHRqcy1kYXRhYFxuICogcHV0IGJhY2sgZm9yIGEgYF9uZXh0L2RhdGFgIHJlcXVlc3QsIHdoaWNoIGlzIHdoYXQgYG5leHQgc3RhcnRgJ3NcbiAqIGByZXNvbHZlUm91dGVzYCBkb2VzIChgc2V0SXNOZXh0RGF0YVJlcXVlc3RgKSByaWdodCBhZnRlciBzdHJpcHBpbmcgaXQ6IHRoZVxuICogaGVhZGVyIGlzIGludGVybmFsLCBidXQgTmV4dCdzIGhhbmRsZXJzIGFuZCBtaWRkbGV3YXJlIHN0aWxsIHJlYWQgaXQg4oCUIGl0IGlzXG4gKiBob3cgYSBkYXRhIHJlcXVlc3QgZ2V0cyBgeC1uZXh0anMtbWF0Y2hlZC1wYXRoYCDigJQgc28gYSByZWFsIGRhdGEgcmVxdWVzdCBoYXNcbiAqIHRvIGtlZXAgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRob3V0SW50ZXJuYWxIZWFkZXJzKFxuICBoZWFkZXJzOiBJbmNvbWluZ0h0dHBIZWFkZXJzLFxuICB0YXJnZXQ6IHN0cmluZyxcbiAgYmFzZVBhdGg6IHN0cmluZyxcbik6IEluY29taW5nSHR0cEhlYWRlcnMge1xuICBjb25zdCBmaWx0ZXJlZDogSW5jb21pbmdIdHRwSGVhZGVycyA9IHt9O1xuICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoaGVhZGVycykpIHtcbiAgICBpZiAoIUlOVEVSTkFMX0hFQURFUlMuaGFzKG5hbWUpKSB7XG4gICAgICBmaWx0ZXJlZFtuYW1lXSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICBjb25zdCBwYXRobmFtZSA9IHdpdGhvdXRQYXRoUHJlZml4KHRhcmdldC5zcGxpdChcIj9cIilbMF0sIGJhc2VQYXRoKTtcbiAgaWYgKHBhdGhuYW1lLnN0YXJ0c1dpdGgoXCIvX25leHQvZGF0YS9cIikgJiYgcGF0aG5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgIGZpbHRlcmVkW1wieC1uZXh0anMtZGF0YVwiXSA9IFwiMVwiO1xuICB9XG4gIHJldHVybiBmaWx0ZXJlZDtcbn1cblxuLyoqIEV2ZXJ5IHJvdXRlIHRvIGludmFsaWRhdGUsIGVhY2ggb25jZSwgaW4gb25lIENsb3VkRnJvbnQgaW52YWxpZGF0aW9uLiAqL1xudHlwZSBSZXZhbGlkYXRlZFBhZ2VIb29rID0gKHJvdXRlczogcmVhZG9ubHkgc3RyaW5nW10pID0+IFByb21pc2U8dm9pZD47XG5cbi8qKlxuICogSW52YWxpZGF0ZSB0aGUgQ0ROIGNvcGllcyBvZiBhIHBhZ2UgYHJlcy5yZXZhbGlkYXRlKClgIGp1c3QgcmVnZW5lcmF0ZWQ6IGl0c1xuICogSFRNTCBhbmQgUlNDIHBheWxvYWQsIGFuZCBpdHMgUGFnZXMgUm91dGVyIGBfbmV4dC9kYXRhYCBKU09OLiBXaXRob3V0IHRoaXMgdGhlXG4gKiBmcmVzaCBlbnRyeSBzYXQgYmVoaW5kIENsb3VkRnJvbnQncyBjb3B5IG9mIHRoZSBvbGQgb25lIGZvciB0aGUgcGFnZSdzIHdob2xlXG4gKiBgcy1tYXhhZ2VgIOKAlCBhIHllYXIsIGZvciBhbiBvbi1kZW1hbmQtb25seSBJU1IgcGFnZS4gYHJldmFsaWRhdGVQYXRoYCBhbmRcbiAqIGByZXZhbGlkYXRlVGFnYCBnbyB0aHJvdWdoIHRoZSBjYWNoZSBoYW5kbGVyJ3MgYHJldmFsaWRhdGVUYWdgLCB3aGljaCBhbHJlYWR5XG4gKiBpbnZhbGlkYXRlczsgYHJlcy5yZXZhbGlkYXRlKClgIGRvZXMgbm90IHRvdWNoIGl0LlxuICpcbiAqIEV2ZXJ5IHJvdXRlIGlzIHdpdGhvdXQgYGJhc2VQYXRoYCwgd2hpY2ggdGhlIGhvb2sgcHJlZml4ZXMuIEEgbm8tb3Agb3V0c2lkZVxuICogdGhlIEdsb2JhbCBjb25zdHJ1Y3RzLCB3aGVyZSBubyBob29rIGlzIHJlZ2lzdGVyZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGludmFsaWRhdGVSZXZhbGlkYXRlZFBhZ2UoXG4gIHVybFBhdGg6IHN0cmluZyxcbiAgbWFuaWZlc3Q6IEFkYXB0ZXJNYW5pZmVzdCxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBob29rID0gKGdsb2JhbFRoaXMgYXMgUmVjb3JkPHN5bWJvbCwgdW5rbm93bj4pW1xuICAgIFJFVkFMSURBVEVEX1BBR0VfSE9PS1xuICBdIGFzIFJldmFsaWRhdGVkUGFnZUhvb2sgfCB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2YgaG9vayAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHJvdXRlID0gd2l0aG91dFBhdGhQcmVmaXgoXG4gICAgdXJsUGF0aC5zcGxpdChcIj9cIilbMF0sXG4gICAgbWFuaWZlc3QuY29uZmlnLmJhc2VQYXRoLFxuICApO1xuICB0cnkge1xuICAgIC8vIE9uZSBjYWxsLCBkZWR1cGxpY2F0ZWQ6IHRoZSBkZWZhdWx0IGxvY2FsZSdzIHR3byBwYWlycyBzaGFyZSBhIGRhdGFcbiAgICAvLyByb3V0ZSwgYW5kIGVhY2ggaW52YWxpZGF0aW9uIHBhdGggY291bnRzIGFnYWluc3QgQ2xvdWRGcm9udCdzIHF1b3RhLlxuICAgIGF3YWl0IGhvb2soWy4uLm5ldyBTZXQocmV2YWxpZGF0ZWRQYWdlUm91dGVzKHJvdXRlLCBtYW5pZmVzdCkuZmxhdCgpKV0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIFRoZSByZWdlbmVyYXRpb24gaXRzZWxmIHN1Y2NlZWRlZDsgdGhlIGVkZ2UgY2F0Y2hlcyB1cCBhdCBgcy1tYXhhZ2VgLlxuICAgIGNvbnNvbGUud2FybihgQ291bGQgbm90IGludmFsaWRhdGUgdGhlIENETiBjb3B5IG9mICR7dXJsUGF0aH06YCwgZXJyb3IpO1xuICB9XG59XG5cbi8qKlxuICogVGhlIGBbcm91dGUsIGRhdGFSb3V0ZV1gIHBhaXJzIGEgcmV2YWxpZGF0ZWQgcGFnZSBpcyBjYWNoZWQgdW5kZXIgYXQgdGhlIGVkZ2UuXG4gKlxuICogSW4gYW4gaTE4biBhcHAgdGhlIE5leHQgY2xpZW50IGFsd2F5cyBwdXRzIHRoZSBsb2NhbGUgaW4gYSBkYXRhIGhyZWYsIHRoZVxuICogZGVmYXVsdCBsb2NhbGUgaW5jbHVkZWQgKGAvX25leHQvZGF0YS88aWQ+L2VuL2Jsb2cuanNvbmAsIGFuZCBg4oCmL2VuLmpzb25gIGZvclxuICogdGhlIHJvb3QpLCBzbyB0aGUgdW5wcmVmaXhlZCBkYXRhIHJvdXRlIG5hbWVzIG5vdGhpbmcgQ2xvdWRGcm9udCBob2xkcy4gVGhlXG4gKiBwYWdlIGlzIG9uZSBsb2NhbGUncyDigJQgYHJlcy5yZXZhbGlkYXRlKFwiL2Jsb2dcIilgIHJlZ2VuZXJhdGVzIHRoZSBkZWZhdWx0XG4gKiBsb2NhbGUncywgYFwiL2ZyL2Jsb2dcImAgRnJlbmNoIOKAlCBhbmQgdGhlIGRlZmF1bHQgbG9jYWxlJ3MgSFRNTCBpcyByZWFjaGFibGUsXG4gKiBhbmQgY2FjaGVkLCBib3RoIHdpdGggYW5kIHdpdGhvdXQgaXRzIHByZWZpeCwgc28gaXRzIHR3byBwYWlycyBzaGFyZSBhIGRhdGFcbiAqIHJvdXRlLCB3aGljaCB0aGUgY2FsbGVyIHNlbmRzIG9uY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXZhbGlkYXRlZFBhZ2VSb3V0ZXMoXG4gIHJvdXRlOiBzdHJpbmcsXG4gIG1hbmlmZXN0OiBQaWNrPEFkYXB0ZXJNYW5pZmVzdCwgXCJidWlsZElkXCIgfCBcImNvbmZpZ1wiPixcbik6IEFycmF5PFtzdHJpbmcsIHN0cmluZ10+IHtcbiAgY29uc3QgZGF0YVJvdXRlID0gKHBhZ2U6IHN0cmluZykgPT5cbiAgICBgL19uZXh0L2RhdGEvJHttYW5pZmVzdC5idWlsZElkfSR7XG4gICAgICBwYWdlID09PSBcIi9cIiA/IFwiL2luZGV4XCIgOiBwYWdlLnJlcGxhY2UoL1xcLyskLywgXCJcIilcbiAgICB9Lmpzb25gO1xuICBjb25zdCBpMThuID0gbWFuaWZlc3QuY29uZmlnLmkxOG4gYXMge1xuICAgIHJlYWRvbmx5IGxvY2FsZXM/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgICByZWFkb25seSBkZWZhdWx0TG9jYWxlPzogc3RyaW5nO1xuICB9IHwgbnVsbDtcbiAgaWYgKCFpMThuPy5kZWZhdWx0TG9jYWxlKSB7XG4gICAgcmV0dXJuIFtbcm91dGUsIGRhdGFSb3V0ZShyb3V0ZSldXTtcbiAgfVxuICBjb25zdCB7IGRlZmF1bHRMb2NhbGUgfSA9IGkxOG47XG4gIGNvbnN0IHNlZ21lbnQgPSByb3V0ZS5zcGxpdChcIi9cIilbMV0gPz8gXCJcIjtcbiAgY29uc3QgbG9jYWxlID0gKGkxOG4ubG9jYWxlcyA/PyBbXSkuaW5jbHVkZXMoc2VnbWVudClcbiAgICA/IHNlZ21lbnRcbiAgICA6IGRlZmF1bHRMb2NhbGU7XG4gIGNvbnN0IHBhZ2UgPVxuICAgIGxvY2FsZSA9PT0gc2VnbWVudCA/IHdpdGhvdXRQYXRoUHJlZml4KHJvdXRlLCBgLyR7c2VnbWVudH1gKSA6IHJvdXRlO1xuICBjb25zdCBsb2NhbGl6ZWQgPSBwYWdlID09PSBcIi9cIiA/IGAvJHtsb2NhbGV9YCA6IGAvJHtsb2NhbGV9JHtwYWdlfWA7XG4gIC8vIFRoZSByb290J3MgZGF0YSByb3V0ZSBpcyB0aGUgbG9jYWxlIGl0c2VsZiwgbm90IGAvPGxvY2FsZT4vaW5kZXhgLlxuICBjb25zdCBsb2NhbGl6ZWREYXRhID0gYC9fbmV4dC9kYXRhLyR7bWFuaWZlc3QuYnVpbGRJZH0ke2xvY2FsaXplZC5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpfS5qc29uYDtcbiAgcmV0dXJuIGxvY2FsZSA9PT0gZGVmYXVsdExvY2FsZVxuICAgID8gW1xuICAgICAgICBbcGFnZSwgbG9jYWxpemVkRGF0YV0sXG4gICAgICAgIFtsb2NhbGl6ZWQsIGxvY2FsaXplZERhdGFdLFxuICAgICAgXVxuICAgIDogW1tsb2NhbGl6ZWQsIGxvY2FsaXplZERhdGFdXTtcbn1cblxuZnVuY3Rpb24gYXNFcnJvcihlcnJvcjogdW5rbm93bik6IEVycm9yIHtcbiAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKTtcbn1cblxuLyoqXG4gKiBSZWFkIHRoZSBtYW5pZmVzdCBhbmQgcGluIHRoZSBsYXlvdXQgaXQgZGVzY3JpYmVzLlxuICpcbiAqIGBwcm9jZXNzLmN3ZCgpYCBpcyBsb2FkLWJlYXJpbmcgYW5kIHRoZXJlIGlzIGV4YWN0bHkgb25lIGNoYW5jZSB0byBnZXQgaXRcbiAqIHJpZ2h0OiBOZXh0LmpzIGlubGluZXMgYHJlbGF0aXZlKGJ1aWxkQ3dkLCBwcm9qZWN0RGlyKWAgaW50byBldmVyeSBlbnRyeXBvaW50XG4gKiBhbmQgcmVzb2x2ZXMgaXQgYWdhaW5zdCB0aGUgKnJ1bnRpbWUqIGN3ZCB0byBmaW5kXG4gKiBgcmVxdWlyZWQtc2VydmVyLWZpbGVzLmpzb25gLCB0aGUgcHJlcmVuZGVyIG1hbmlmZXN0LCBhbmQgdGhlIGFwcCdzIGNodW5rcy5cbiAqIGBhc3NlcnRCdWlsZEN3ZGAgaW4gYGJ1aWxkLW91dHB1dHMudHNgIGtlZXBzIHRoYXQgaW5saW5lZCB2YWx1ZSBgXCJcImAsIHNvIHRoZVxuICogd2hvbGUgaW52YXJpYW50IHJlZHVjZXMgdG8gXCJjd2QgaXMgdGhlIHN0YWdlZCBwcm9qZWN0IGRpclwiIOKAlCBhc3NlcnRlZCByYXRoZXJcbiAqIHRoYW4gYXNzdW1lZCwgYmVjYXVzZSBnZXR0aW5nIGl0IHdyb25nIHByb2R1Y2VzIGFcbiAqIGBDYW5ub3QgZmluZCBtb2R1bGUg4oCmL3JlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uYCBmcm9tIGluc2lkZSBjb21waWxlZCBOZXh0LmpzXG4gKiBjb2RlIHdpdGggbm8gaW5kaWNhdGlvbiB0aGF0IHRoZSBsYXlvdXQgaXMgdGhlIHByb2JsZW0uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkUnVudGltZShcbiAgZGVwbG95bWVudFJvb3Q6IHN0cmluZyxcbik6IFByb21pc2U8TmV4dGpzUnVudGltZT4ge1xuICBjb25zdCBtYW5pZmVzdFBhdGggPSBkZXBsb3llZE1hbmlmZXN0UGF0aChkZXBsb3ltZW50Um9vdCk7XG4gIGxldCBtYW5pZmVzdDogQWRhcHRlck1hbmlmZXN0O1xuICB0cnkge1xuICAgIG1hbmlmZXN0ID0gSlNPTi5wYXJzZShhd2FpdCByZWFkRmlsZShtYW5pZmVzdFBhdGgsIFwidXRmLThcIikpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBDb3VsZCBub3QgcmVhZCB0aGUgY2RrLW5leHRqcyBhZGFwdGVyIG1hbmlmZXN0IGF0IFwiJHttYW5pZmVzdFBhdGh9XCIuIGAgK1xuICAgICAgICBgVGhlIGRlcGxveW1lbnQgcGFja2FnZSBpcyBpbmNvbXBsZXRlOiBzeW50aCBjb3BpZXMgYCArXG4gICAgICAgIGAke01BTklGRVNUX0ZJTEVfTkFNRX0gaW4gbmV4dCB0byB0aGUgYnVuZGxlZCBydW50aW1lLmAsXG4gICAgICB7IGNhdXNlOiBlcnJvciB9LFxuICAgICk7XG4gIH1cblxuICBjb25zdCBwcm9qZWN0RGlyID0gam9pbihkZXBsb3ltZW50Um9vdCwgbWFuaWZlc3QucmVsYXRpdmVQcm9qZWN0RGlyKTtcbiAgY29uc3QgcHJvYmUgPSBqb2luKFxuICAgIHByb2plY3REaXIsXG4gICAgbWFuaWZlc3QuY29uZmlnLmRpc3REaXIsXG4gICAgXCJyZXF1aXJlZC1zZXJ2ZXItZmlsZXMuanNvblwiLFxuICApO1xuICB0cnkge1xuICAgIGF3YWl0IHJlYWRGaWxlKHByb2JlKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGhlIGRlcGxveW1lbnQgcm9vdCBcIiR7ZGVwbG95bWVudFJvb3R9XCIgZG9lcyBub3QgY29udGFpbiB0aGUgc3RhZ2VkIGAgK1xuICAgICAgICBgTmV4dC5qcyBwcm9qZWN0OiBleHBlY3RlZCBcIiR7cHJvYmV9XCIgdG8gZXhpc3QuIEV2ZXJ5IGJ1aWx0IGVudHJ5cG9pbnQgYCArXG4gICAgICAgIGByZXNvbHZlcyBpdHMgb3duIHBhdGhzIGFnYWluc3QgcHJvY2Vzcy5jd2QoKSwgc28gdGhpcyBsYXlvdXQgaXMgcGFydCBgICtcbiAgICAgICAgYG9mIHRoZSBjb250cmFjdCwgbm90IGEgY29udmVuaWVuY2UuYCxcbiAgICAgIHsgY2F1c2U6IGVycm9yIH0sXG4gICAgKTtcbiAgfVxuICAvLyBgbmV4dCBzdGFydGAgZm9yY2VzIHRoaXMsIGFuZCBleHRlcm5hbGl6ZWQgcGFja2FnZXMgKFJlYWN0IGZvciBQYWdlcyBSb3V0ZXJcbiAgLy8gU1NSLCBhbnl0aGluZyBpbiBgc2VydmVyRXh0ZXJuYWxQYWNrYWdlc2ApIHBpY2sgdGhlaXIgZGV2IG9yIHByb2QgYnVpbGQgZnJvbVxuICAvLyBpdCBhdCByZXF1aXJlIHRpbWUuIFRoZSBDb250YWluZXJzIERvY2tlcmZpbGVzIHNldCBpdCBhbmQgdGhlIEZ1bmN0aW9uc1xuICAvLyBjb25zdHJ1Y3RzIGRvIHRvbzsgdGhpcyBjb3ZlcnMgYSBoYW5kLXdpcmVkIGZ1bmN0aW9uLiBCZWZvcmUgYW55IGByZXF1aXJlYC5cbiAgLy8gKGBuZXh0YCdzIHR5cGluZ3MgZGVjbGFyZSBOT0RFX0VOViByZWFkLW9ubHkuKVxuICAocHJvY2Vzcy5lbnYgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPikuTk9ERV9FTlYgPz89IFwicHJvZHVjdGlvblwiO1xuICBwcm9jZXNzLmNoZGlyKHByb2plY3REaXIpO1xuICAvLyBCZWZvcmUgYW55dGhpbmcgY2FuIHNlcnZlIGEgcmVxdWVzdDogdGhlIHJ1bnRpbWUncyBvd24gYG5leHRgIGltcG9ydHMgcmVzb2x2ZVxuICAvLyBvdXQgb2YgdGhlIHN0YWdlZCBhcHAsIG5vdCBvdXQgb2YgdGhlIHNoZWxsJ3MgZGlyZWN0b3J5LiBTZWUgYG5leHQtbW9kdWxlcy50c2AuXG4gIHVzZU5leHRGcm9tKHByb2plY3REaXIpO1xuICAvLyBCZWZvcmUgYW55IGVudHJ5cG9pbnQgY2FuIHJlYWQgdGhlbSBhdCBtb2R1bGUgc2NvcGUuXG4gIGxvYWRFbnZGaWxlcyhwcm9qZWN0RGlyKTtcbiAgLy8gVGhlbiwgYmVmb3JlIGFueSBlbnRyeXBvaW50IChvciBtaWRkbGV3YXJlKSBjYW4gYmUgbG9hZGVkOiBOZXh0J3Mgb3duXG4gIC8vIG5vZGUtZW52aXJvbm1lbnQgYm9vdHN0cmFwLiBTZWUgYHNldHVwTm9kZUVudmlyb25tZW50YC5cbiAgc2V0dXBOb2RlRW52aXJvbm1lbnQoKTtcbiAgLy8gQW5kIGxhc3QsIG9uY2UgdGhlIGVudmlyb25tZW50IGlzIHJlYWR5OiBgcmVnaXN0ZXIoKWAsIGJlZm9yZSBhbnkgZW50cnlwb2ludFxuICAvLyBvciBtaWRkbGV3YXJlIG1vZHVsZSBpcyBldmFsdWF0ZWQuIFNlZSBgcmVnaXN0ZXJJbnN0cnVtZW50YXRpb25gLlxuICBhd2FpdCByZWdpc3Rlckluc3RydW1lbnRhdGlvbihwcm9qZWN0RGlyLCBtYW5pZmVzdC5jb25maWcuZGlzdERpcik7XG5cbiAgcmV0dXJuIG5ldyBOZXh0anNSdW50aW1lKHtcbiAgICBkZXBsb3ltZW50Um9vdCxcbiAgICBtYW5pZmVzdCxcbiAgICBidWNrZXQ6IHByb2Nlc3MuZW52LkNES19ORVhUSlNfU1RBVElDX0FTU0VUU19CVUNLRVRfTkFNRSxcbiAgICBidWNrZXRLZXlQcmVmaXg6IHByb2Nlc3MuZW52LkNES19ORVhUSlNfU1RBVElDX0FTU0VUU19LRVlfUFJFRklYLFxuICB9KTtcbn1cblxuLyoqXG4gKiBBIHN5bnRhY3RpY2FsbHkgdmFsaWQgYGhvc3RbOnBvcnRdYDogYSByZWdpc3RlcmVkIG5hbWUgb3IgYSBicmFja2V0ZWQgSVB2NlxuICogbGl0ZXJhbCwgb3B0aW9uYWxseSB3aXRoIGEgcG9ydC4gQW55dGhpbmcgZWxzZSBjYW5ub3QgYmUgdGhlIGF1dGhvcml0eSBvZiBhXG4gKiBVUkwuXG4gKi9cbmNvbnN0IEhPU1RfQVVUSE9SSVRZID0gL14oPzpcXFtbMC05QS1GYS1mOi5dK1xcXXxbMC05QS1aYS16Ll8tXSspKD86OlxcZHsxLDV9KT8kLztcblxuLyoqXG4gKiBUaGUgZmlyc3QgdmFsdWUgdGhhdCBpcyBhY3R1YWxseSB1c2FibGUgYXMgYW4gYXV0aG9yaXR5LCBvciBgdW5kZWZpbmVkYC5cbiAqXG4gKiBgeC1mb3J3YXJkZWQtaG9zdGAgY2FuIGFycml2ZSBhcyBhIGxpc3Qgd2hlbiBtb3JlIHRoYW4gb25lIHByb3h5IGFwcGVuZHMgdG9cbiAqIGl0LiBWYWxpZGF0aW5nIGlzIHdoYXQga2VlcHMgYSBtYWxmb3JtZWQgdmFsdWUgZnJvbSBtYWtpbmcgdGhlIGBVUkxgXG4gKiBjb25zdHJ1Y3RvciB0aHJvdyDigJQgd2hpY2ggb24gdGhlIExhbWJkYSBzaGVsbHMgaXMgYW4gaW52b2NhdGlvbiBlcnJvciBhbmQgYVxuICogNTAyLCBub3QgYSByZXNwb25zZS5cbiAqL1xuZnVuY3Rpb24gdmFsaWRBdXRob3JpdHkoXG4gIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNhbmRpZGF0ZSA9IGZpcnN0VmFsdWUodmFsdWUpPy5zcGxpdChcIixcIilbMF0udHJpbSgpO1xuICByZXR1cm4gY2FuZGlkYXRlICYmIEhPU1RfQVVUSE9SSVRZLnRlc3QoY2FuZGlkYXRlKSA/IGNhbmRpZGF0ZSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBgcmVzb2x2ZVJvdXRlc2AgbmVlZHMgYW4gYWJzb2x1dGUgVVJMLCBhbmQgaXQgYmVjb21lcyB0aGUgb3JpZ2luIGV2ZXJ5XG4gKiBhYnNvbHV0ZSBVUkwgdGhlIGFwcCBidWlsZHMgc3RhcnRzIHdpdGgg4oCUIGByZXEubmV4dFVybC5vcmlnaW5gIGluIG1pZGRsZXdhcmUsXG4gKiBgaW5pdFVSTGAgZm9yIGEgcm91dGUgaGFuZGxlciDigJQgc28gaXRzIGhvc3QgaGFzIHRvIGJlIG9uZSB0aGUgY2xpZW50IGNhbm5vdFxuICogcGljay5cbiAqXG4gKiBUaGF0IGlzIGBIb3N0YCBvbiBldmVyeSBkZXBsb3ltZW50IGJ1dCBvbmU6IENsb3VkRnJvbnQgZm9yd2FyZHMgdGhlIHZpZXdlcidzXG4gKiBgSG9zdGAgdG8gYSBjb250YWluZXIgb3JpZ2luIChgQUxMX1ZJRVdFUmApLCBhbiBBTEIgcGFzc2VzIGl0IHRocm91Z2gsIGFuZCBBUElcbiAqIEdhdGV3YXkgc2V0cyBpdHMgb3duIGRvbWFpbi4gVGhlIGV4Y2VwdGlvbiBpcyBhIExhbWJkYSBGdW5jdGlvbiBVUkwsIHdoZXJlXG4gKiBDbG91ZEZyb250IGhhcyB0byBzZW5kIHRoZSBVUkwncyBvd24gZG9tYWluIGFzIGBIb3N0YCBhbmQgcHV0cyB0aGUgdmlld2VyJ3MgaW5cbiAqIGB4LWZvcndhcmRlZC1ob3N0YDsgc2VlIHtAbGluayBSdW50aW1lUmVxdWVzdC50cnVzdEZvcndhcmRlZEhvc3R9LiBBbnl3aGVyZVxuICogZWxzZSB0aGUgaGVhZGVyIGlzIHRoZSBjbGllbnQncywgYW5kIGhvbm9yaW5nIGl0IGxldCBhIHJlcXVlc3Qgd2l0aFxuICogYFgtRm9yd2FyZGVkLUhvc3Q6IGV2aWwuZXhhbXBsZWAgcG9pbnQgYSBwYXNzd29yZC1yZXNldCBsaW5rIGF0IGV2aWwuZXhhbXBsZSDigJRcbiAqIGFuZCwgb24gR2xvYmFsIENvbnRhaW5lcnMsIGhhdmUgQ2xvdWRGcm9udCBjYWNoZSB0aGF0IHBhZ2UsIHNpbmNlIHRoZSBoZWFkZXJcbiAqIGlzIG5vdCBpbiBpdHMgY2FjaGUga2V5LlxuICovXG5mdW5jdGlvbiBhYnNvbHV0ZVVybChyZXF1ZXN0OiBSdW50aW1lUmVxdWVzdCk6IFVSTCB7XG4gIGNvbnN0IGhvc3QgPVxuICAgIChyZXF1ZXN0LnRydXN0Rm9yd2FyZGVkSG9zdFxuICAgICAgPyB2YWxpZEF1dGhvcml0eShyZXF1ZXN0LmhlYWRlcnNbXCJ4LWZvcndhcmRlZC1ob3N0XCJdKVxuICAgICAgOiB1bmRlZmluZWQpID8/XG4gICAgdmFsaWRBdXRob3JpdHkocmVxdWVzdC5oZWFkZXJzLmhvc3QpID8/XG4gICAgXCJsb2NhbGhvc3RcIjtcbiAgLy8gQmVoaW5kIENsb3VkRnJvbnQgb24gR2xvYmFsIENvbnRhaW5lcnMgdGhlIGNvbnRhaW5lciBzaGVsbCBoYXMgYWxyZWFkeSBwdXRcbiAgLy8gdGhlIHZpZXdlcidzIHByb3RvY29sIGhlcmU7IHNlZSBgdHJ1c3RDbG91ZEZyb250UHJvdG9gIGluIGh0dHAvbm9kZS1zZXJ2ZXIudHMuXG4gIGNvbnN0IGZvcndhcmRlZFByb3RvID0gZmlyc3RWYWx1ZShyZXF1ZXN0LmhlYWRlcnNbXCJ4LWZvcndhcmRlZC1wcm90b1wiXSlcbiAgICA/LnNwbGl0KFwiLFwiKVswXVxuICAgIC50cmltKClcbiAgICAudG9Mb3dlckNhc2UoKTtcbiAgLy8gQ2xpZW50LXN1cHBsaWVkIHdoZXJlIG5vIHByb3h5IG92ZXJ3cml0ZXMgaXQsIGJ1dCBoYXJtbGVzczogdGhlIGhvc3QgaXNcbiAgLy8gYWxyZWFkeSBmaXhlZCwgYW5kIGFueXRoaW5nIGJ1dCB0aGVzZSB0d28gd291bGQgbm90IHBhcnNlLlxuICBjb25zdCBwcm90byA9XG4gICAgZm9yd2FyZGVkUHJvdG8gPT09IFwiaHR0cFwiIHx8IGZvcndhcmRlZFByb3RvID09PSBcImh0dHBzXCJcbiAgICAgID8gZm9yd2FyZGVkUHJvdG9cbiAgICAgIDogcmVxdWVzdC5lbmNyeXB0ZWQgPT09IGZhbHNlXG4gICAgICAgID8gXCJodHRwXCJcbiAgICAgICAgOiBcImh0dHBzXCI7XG4gIHJldHVybiBuZXcgVVJMKHJlcXVlc3QudXJsLCBgJHtwcm90b306Ly8ke2hvc3R9YCk7XG59XG5cbmZ1bmN0aW9uIHBpY2tEZWZpbmVkKFxuICBoZWFkZXJzOiBJbmNvbWluZ0h0dHBIZWFkZXJzLFxuICBuYW1lczogcmVhZG9ubHkgc3RyaW5nW10sXG4pOiBJbmNvbWluZ0h0dHBIZWFkZXJzIHtcbiAgY29uc3QgcGlja2VkOiBJbmNvbWluZ0h0dHBIZWFkZXJzID0ge307XG4gIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgIGlmIChoZWFkZXJzW25hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBpY2tlZFtuYW1lXSA9IGhlYWRlcnNbbmFtZV07XG4gICAgfVxuICB9XG4gIHJldHVybiBwaWNrZWQ7XG59XG5cbi8qKlxuICogYG5vcm1hbGl6ZVJlcGVhdGVkU2xhc2hlc2AgKGBuZXh0L2Rpc3Qvc2hhcmVkL2xpYi91dGlscy5qc2ApLCBhcHBsaWVkIHdoZXJlXG4gKiBOZXh0LmpzIGFwcGxpZXMgaXQ6IGJlZm9yZSByb3V0aW5nLCBhcyBhIDMwOCB0byB0aGUgY29sbGFwc2VkIHBhdGguXG4gKiBgYmFzZS1zZXJ2ZXIudHNgIGRvZXMgYGlmICh1cmxOb1F1ZXJ5Py5tYXRjaCgvKFxcXFx8XFwvXFwvKS8pKVxuICogcmVzLnJlZGlyZWN0KG5vcm1hbGl6ZVJlcGVhdGVkU2xhc2hlcyhyZXEudXJsKSwgMzA4KWAsIHNvIGAvYS8vYmAgYW5kIGAvYVxcYmBcbiAqIGJvdGggYW5zd2VyIGEgcmVkaXJlY3QgdG8gYC9hL2JgIHJhdGhlciB0aGFuIGEgNDA0IC0gYW5kIGBAbmV4dC9yb3V0aW5nYCdzXG4gKiBgcmVzb2x2ZVJvdXRlc2AgZG9lcyBub3QgZG8gaXQgZm9yIHVzLCB3aGljaCBpcyBob3cgYC8vYCByZWFjaGVkIHRoaXMgcnVudGltZSBhc1xuICogYSA1MDAgYW5kIGAvYXBpLy9qc29uYCBhcyBhIDQwNC5cbiAqXG4gKiBFbmNvZGVkIGJhY2tzbGFzaGVzIGFyZSBsZWZ0IGFsb25lLCBhcyBOZXh0LmpzIGxlYXZlcyB0aGVtOiBgJTVDYCBpcyBhIGxpdGVyYWxcbiAqIGNoYXJhY3RlciBpbiBhIHBhdGggc2VnbWVudCwgbm90IGEgc2VwYXJhdG9yLlxuICpcbiAqIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGVyZSBpcyBub3RoaW5nIHRvIGNvbGxhcHNlLCB3aGljaCBpcyB0aGUgY29tbW9uIGNhc2UuXG4gKi9cbmZ1bmN0aW9uIGNvbGxhcHNlUmVwZWF0ZWRTbGFzaGVzKHRhcmdldDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGFydHMgPSB0YXJnZXQuc3BsaXQoXCI/XCIpO1xuICBjb25zdCBwYXRobmFtZSA9IHBhcnRzWzBdO1xuICBpZiAoIS9cXFxcfFxcL1xcLy8udGVzdChwYXRobmFtZSkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IHF1ZXJ5ID0gcGFydHMubGVuZ3RoID4gMSA/IGA/JHtwYXJ0cy5zbGljZSgxKS5qb2luKFwiP1wiKX1gIDogXCJcIjtcbiAgcmV0dXJuIHBhdGhuYW1lLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpLnJlcGxhY2UoL1xcL1xcLysvZywgXCIvXCIpICsgcXVlcnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3BsaXRCb2R5IHtcbiAgLyoqIFdoYXQgYHJlcWAgcmVhZHM6IHRoZSBlbnRyeXBvaW50J3MgY29weS4gKi9cbiAgcmVhZG9ubHkgZm9yUmVxdWVzdD86IFJlYWRhYmxlIHwgQnVmZmVyO1xuICAvKiogV2hhdCBgcmVzb2x2ZVJvdXRlc2AgaGFuZHMgbWlkZGxld2FyZS4gKi9cbiAgcmVhZG9ubHkgZm9yRGlzcGF0Y2g6IFJlYWRhYmxlU3RyZWFtO1xuICAvKipcbiAgICogQ2FsbGVkIG9uY2UgZGlzcGF0Y2ggaGFzIHJldHVybmVkLCB3aXRoIHdoZXRoZXIgbWlkZGxld2FyZSBhbnN3ZXJlZCB0aGVcbiAgICogcmVxdWVzdCBpdHNlbGYuIExldHMgZ28gb2Ygd2hpY2hldmVyIGNvcHkgbm90aGluZyB3aWxsIHJlYWQgYW55IG1vcmUuXG4gICAqL1xuICByZWxlYXNlVW5yZWFkKG1pZGRsZXdhcmVSZXNwb25kZWQ6IGJvb2xlYW4pOiB2b2lkO1xufVxuXG4vKipcbiAqIGByZXNvbHZlUm91dGVzYCBoYW5kcyBgcmVxdWVzdEJvZHlgIHRvIG1pZGRsZXdhcmUsIHdoaWNoIGNvbnN1bWVzIGl0LCB3aGlsZSB0aGVcbiAqIGVudHJ5cG9pbnQgbmVlZHMgdGhlIHNhbWUgYnl0ZXMg4oCUIHRoZSBzYW1lIHByb2JsZW0gYG5leHQtc2VydmVyYCBzb2x2ZXMgd2l0aFxuICogYGdldENsb25lYWJsZUJvZHkoKWAuIE9ubHkgc3BsaXQgd2hlbiB0aGVyZSBpcyBtaWRkbGV3YXJlIHRvIGZlZWQ6IHRlZWluZyBjb3N0c1xuICogYSBidWZmZXIgY29weSBvZiBldmVyeSB1cGxvYWQgb24gYSBwYXRoIHRoYXQgd291bGQgb3RoZXJ3aXNlIGJlIGEgc3RyYWlnaHQgcGlwZS5cbiAqXG4gKiBBIGB0ZWUoKWAgYnVmZmVycywgZm9yIHRoZSBicmFuY2ggdGhhdCBpcyBiZWhpbmQsIGV2ZXJ5IGNodW5rIHRoZSBvdGhlciBvbmVcbiAqIGhhcyByZWFkIOKAlCBzbyBhIGJyYW5jaCB0aGF0IGlzIG5ldmVyIHJlYWQgaG9sZHMgdGhlIHdob2xlIGJvZHkuIE1pZGRsZXdhcmVcbiAqIHRoYXQgZG9lc24ndCByZWFkIHRoZSBib2R5IGlzIHRoZSBjb21tb24gY2FzZSAoYW5kIGl0cyBtYXRjaGVyIG1heSBub3QgZXZlblxuICogaGF2ZSBydW4gaXQpLCBhZnRlciB3aGljaCB0aGUgZW50cnlwb2ludCBzdHJlYW1pbmcgYW4gdXBsb2FkIHdvdWxkIHBpbGUgYWxsXG4gKiBvZiBpdCB1cCBpbiB0aGUgbWlkZGxld2FyZSBicmFuY2g6IHRoZSB3aG9sZSB1cGxvYWQgaW4gbWVtb3J5LCBvbiBhXG4gKiBjb250YWluZXIgdGhhdCBzZXJ2ZXMgb3RoZXIgcmVxdWVzdHMuIFNvIG9uY2UgZGlzcGF0Y2ggcmV0dXJucywgdGhlIGJyYW5jaFxuICogd2l0aCBubyByZWFkZXIgbGVmdCBpcyBjYW5jZWxsZWQg4oCUIHRoZSBtaWRkbGV3YXJlIG9uZSwgb3IgdGhlIGVudHJ5cG9pbnQgb25lXG4gKiB3aGVuIG1pZGRsZXdhcmUgYW5zd2VyZWQgYW5kIGByZXFgIHdpbGwgbmV2ZXIgYmUgcmVhZC4gQ2FuY2VsbGluZyBvbmVcbiAqIGJyYW5jaCBsZWF2ZXMgdGhlIHNvdXJjZSBhbmQgdGhlIG90aGVyIGJyYW5jaCBydW5uaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRCb2R5KFxuICBib2R5OiBSZWFkYWJsZSB8IEJ1ZmZlciB8IHVuZGVmaW5lZCxcbiAgaGFzTWlkZGxld2FyZTogYm9vbGVhbixcbik6IFNwbGl0Qm9keSB7XG4gIGNvbnN0IHJlbGVhc2VOb3RoaW5nID0gKCk6IHZvaWQgPT4ge307XG4gIGlmIChib2R5ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZm9yRGlzcGF0Y2g6IG5ldyBCbG9iKFtdKS5zdHJlYW0oKSxcbiAgICAgIHJlbGVhc2VVbnJlYWQ6IHJlbGVhc2VOb3RoaW5nLFxuICAgIH07XG4gIH1cbiAgaWYgKCFoYXNNaWRkbGV3YXJlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZvclJlcXVlc3Q6IGJvZHksXG4gICAgICBmb3JEaXNwYXRjaDogbmV3IEJsb2IoW10pLnN0cmVhbSgpLFxuICAgICAgcmVsZWFzZVVucmVhZDogcmVsZWFzZU5vdGhpbmcsXG4gICAgfTtcbiAgfVxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGJvZHkpKSB7XG4gICAgLy8gQWxyZWFkeSBmdWxseSBpbiBtZW1vcnksIHNvIFwidGVlaW5nXCIgaXMganVzdCByZWFkaW5nIGl0IHR3aWNlLlxuICAgIHJldHVybiB7XG4gICAgICBmb3JSZXF1ZXN0OiBib2R5LFxuICAgICAgZm9yRGlzcGF0Y2g6IG5ldyBCbG9iKFtib2R5XSkuc3RyZWFtKCksXG4gICAgICByZWxlYXNlVW5yZWFkOiByZWxlYXNlTm90aGluZyxcbiAgICB9O1xuICB9XG4gIGNvbnN0IFtmb3JNaWRkbGV3YXJlLCBmb3JFbnRyeXBvaW50XSA9IFJlYWRhYmxlLnRvV2ViKGJvZHkpLnRlZSgpO1xuICBjb25zdCBmb3JSZXF1ZXN0ID0gUmVhZGFibGUuZnJvbVdlYihmb3JFbnRyeXBvaW50IGFzIG5ldmVyKTtcbiAgcmV0dXJuIHtcbiAgICBmb3JSZXF1ZXN0LFxuICAgIGZvckRpc3BhdGNoOiBmb3JNaWRkbGV3YXJlIGFzIFJlYWRhYmxlU3RyZWFtLFxuICAgIHJlbGVhc2VVbnJlYWQobWlkZGxld2FyZVJlc3BvbmRlZCkge1xuICAgICAgaWYgKG1pZGRsZXdhcmVSZXNwb25kZWQpIHtcbiAgICAgICAgLy8gYGZyb21XZWJgIGhvbGRzIHRoZSBicmFuY2gncyByZWFkZXIsIHNvIGl0IGlzIGRlc3Ryb3llZCByYXRoZXIgdGhhblxuICAgICAgICAvLyBjYW5jZWxsZWQ7IGl0cyBgX2Rlc3Ryb3lgIGNhbmNlbHMgdGhlIHJlYWRlci5cbiAgICAgICAgZm9yUmVxdWVzdC5kZXN0cm95KCk7XG4gICAgICB9IGVsc2UgaWYgKCFmb3JNaWRkbGV3YXJlLmxvY2tlZCkge1xuICAgICAgICAvLyBMb2NrZWQgbWVhbnMgbWlkZGxld2FyZSB0b29rIGEgcmVhZGVyOiBpdCBpcyByZWFkaW5nLCBvciBoYXMgcmVhZCxcbiAgICAgICAgLy8gdGhlIGJvZHkgaXRzZWxmLCBhbmQgYSBsb2NrZWQgc3RyZWFtIGNhbm5vdCBiZSBjYW5jZWxsZWQgYW55d2F5LlxuICAgICAgICBmb3JNaWRkbGV3YXJlLmNhbmNlbCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuXG4vKiogYEluY29taW5nSHR0cEhlYWRlcnNgIOKGkiB0aGUgZmxhdCBlbnRyaWVzIGEgYEhlYWRlcnNgIGNvbnN0cnVjdG9yIGFjY2VwdHMuICovXG5mdW5jdGlvbiB0b1dlYkhlYWRlcnMoaGVhZGVyczogSW5jb21pbmdIdHRwSGVhZGVycyk6IEFycmF5PFtzdHJpbmcsIHN0cmluZ10+IHtcbiAgY29uc3QgZW50cmllczogQXJyYXk8W3N0cmluZywgc3RyaW5nXT4gPSBbXTtcbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHNpbmdsZSBvZiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXSkge1xuICAgICAgZW50cmllcy5wdXNoKFtuYW1lLCBzaW5nbGVdKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVudHJpZXM7XG59XG5cbi8qKlxuICogYGhlYWRlcnMoKWAgcnVsZXMsIHRoZSBpbW11dGFibGUgYGNhY2hlLWNvbnRyb2xgIGZvciBidWlsZCBhc3NldHMsIGFuZCBhbnl0aGluZ1xuICogbWlkZGxld2FyZSBzZXQgd2l0aCBgTmV4dFJlc3BvbnNlLm5leHQoeyBoZWFkZXJzIH0pYC4gQXBwbGllZCBiZWZvcmUgdGhlXG4gKiBlbnRyeXBvaW50IHJ1bnMgc28gdGhhdCBhIHJvdXRlIGNhbiBzdGlsbCBvdmVycmlkZSBpdHMgb3duLlxuICovXG5mdW5jdGlvbiBhcHBseUhlYWRlcnMocmVzOiBTaGltU2VydmVyUmVzcG9uc2UsIGhlYWRlcnM6IEhlYWRlcnMpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIGhlYWRlcnMuZW50cmllcygpKSB7XG4gICAgLy8gYGVudHJpZXMoKWAgeWllbGRzIGBzZXQtY29va2llYCBvbmNlIHBlciBjb29raWUsIHNvIGFwcGVuZGluZyB0aGUgd2hvbGVcbiAgICAvLyBgZ2V0U2V0Q29va2llKClgIGFycmF5IGhlcmUgd291bGQgZW1pdCBOwrIgb2YgdGhlbSDigJQgdHdvIGNvb2tpZXMgc2V0IGJ5XG4gICAgLy8gbWlkZGxld2FyZSBhcnJpdmVkIGFzIFtcImE9MVwiLFwiYj0yXCIsXCJhPTFcIixcImI9MlwiXS4gSGFuZGxlZCBvbmNlLCBvdXRzaWRlLlxuICAgIGlmIChuYW1lID09PSBcInNldC1jb29raWVcIikge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHJlcy5zZXRIZWFkZXIobmFtZSwgdmFsdWUpO1xuICB9XG4gIGZvciAoY29uc3QgY29va2llIG9mIGhlYWRlcnMuZ2V0U2V0Q29va2llKCkpIHtcbiAgICByZXMuYXBwZW5kSGVhZGVyKFwic2V0LWNvb2tpZVwiLCBjb29raWUpO1xuICB9XG59XG5cbi8qKlxuICogTWlycm9ycyBOZXh0LmpzJ3Mgb3duIHJlZGlyZWN0IHJlc3BvbnNlIChgYmFzZS1zZXJ2ZXIudHNgKTogdGhlIGRlc3RpbmF0aW9uIGlzXG4gKiBhbHNvIHRoZSBib2R5LCBhbmQgYSAzMDggY2FycmllcyBhIGBSZWZyZXNoYCBoZWFkZXIgYmVjYXVzZSBzb21lIGNsaWVudHMgYW5kXG4gKiBpbnRlcm1lZGlhcmllcyBzdGlsbCBkbyBub3QgaW1wbGVtZW50IDMwOC5cbiAqL1xuZnVuY3Rpb24gc2VuZFJlZGlyZWN0KFxuICByZXM6IFNoaW1TZXJ2ZXJSZXNwb25zZSxcbiAgbG9jYXRpb246IHN0cmluZyxcbiAgc3RhdHVzOiBudW1iZXIsXG4pOiB2b2lkIHtcbiAgcmVzLnN0YXR1c0NvZGUgPSBzdGF0dXM7XG4gIHJlcy5zZXRIZWFkZXIoXCJMb2NhdGlvblwiLCBsb2NhdGlvbik7XG4gIGlmIChzdGF0dXMgPT09IDMwOCkge1xuICAgIHJlcy5zZXRIZWFkZXIoXCJSZWZyZXNoXCIsIGAwO3VybD0ke2xvY2F0aW9ufWApO1xuICB9XG4gIHJlcy5zZXRIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04XCIpO1xuICByZXMuZW5kKGxvY2F0aW9uKTtcbn1cblxuLyoqXG4gKiBgbmV4dCBzdGFydGAncyBhbnN3ZXIgdG8gYSBQT1NULCBQVVQgb3IgREVMRVRFIGZvciBhIHN0YXRpYyBmaWxlOiA0MDUgd2l0aFxuICogYEFsbG93OiBHRVQsIEhFQURgIChgcm91dGVyLXNlcnZlci5qc2ApLiBJdCByZW5kZXJzIHRoYXQgdGhyb3VnaCBgL19lcnJvcmA7XG4gKiB0aGlzIGlzIHRoZSBwbGFpbi10ZXh0IGVxdWl2YWxlbnQsIHNpbmNlIHRoZSBzdGF0dXMgYW5kIGBBbGxvd2AgYXJlIHdoYXQgYVxuICogY2xpZW50IGFjdHMgb24uXG4gKi9cbmZ1bmN0aW9uIHNlbmRNZXRob2ROb3RBbGxvd2VkKHJlczogU2hpbVNlcnZlclJlc3BvbnNlKTogdm9pZCB7XG4gIHJlcy5zdGF0dXNDb2RlID0gNDA1O1xuICByZXMuc2V0SGVhZGVyKFwiQWxsb3dcIiwgXCJHRVQsIEhFQURcIik7XG4gIHJlcy5zZXRIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04XCIpO1xuICByZXMuZW5kKFwiTWV0aG9kIE5vdCBBbGxvd2VkXCIpO1xufVxuXG4vKipcbiAqIFJlcXVlc3QgaGVhZGVycyB7QGxpbmsgcHJveHlFeHRlcm5hbH0gZG9lcyBub3QgZm9yd2FyZC4gVGhlIHVwc3RyZWFtJ3Mgb3duXG4gKiBgSG9zdGAgbXVzdCB3aW47IHRoZSByZXN0IGRlc2NyaWJlIG91ciBjb25uZWN0aW9uLCBub3QgdGhlIHByb3hpZWQgb25lLCBhbmRcbiAqIHVuZGljaSB0aHJvd3Mgb24gbW9zdCBvZiB0aGVtLCB3aGljaCB3b3VsZCBhbnN3ZXIgdGhlIHJlcXVlc3Qgd2l0aCBhIDUwMC5cbiAqIE5leHQuanMncyBsaXN0IGZvciB0aGUgcmVxdWVzdHMgaXQgbWFrZXMgd2l0aCB1bmRpY2kgKGBpcGNGb3JiaWRkZW5IZWFkZXJzYCxcbiAqIGBuZXh0L2Rpc3Qvc2VydmVyL2xpYi9zZXJ2ZXItaXBjL3V0aWxzLmpzYCksIHBsdXMgYGhvc3RgIGFuZCBgdXBncmFkZWAsIG1pbnVzXG4gKiBgY29udGVudC1lbmNvZGluZ2A6IE5leHQgc3RyaXBzIHRoYXQgb3ZlciBhIGJvZHkgaXQgaGFzIGFscmVhZHkgZGVjb2RlZCwgd2hpbGVcbiAqIHRoaXMgb25lIGlzIGZvcndhcmRlZCBhcyByZWNlaXZlZCwgc3RpbGwgZW5jb2RlZC5cbiAqL1xuY29uc3QgUFJPWFlfRFJPUFBFRF9IRUFERVJTOiByZWFkb25seSBzdHJpbmdbXSA9IFtcbiAgXCJob3N0XCIsXG4gIFwidXBncmFkZVwiLFxuICBcImFjY2VwdC1lbmNvZGluZ1wiLFxuICBcImtlZXBhbGl2ZVwiLFxuICBcImtlZXAtYWxpdmVcIixcbiAgXCJ0cmFuc2Zlci1lbmNvZGluZ1wiLFxuICBcImNvbm5lY3Rpb25cIixcbiAgXCJleHBlY3RcIixcbl07XG5cbi8qKlxuICogVGhlIFNpZ1Y0IHNpZ25hdHVyZSBPcmlnaW4gQWNjZXNzIENvbnRyb2wgcHV0IG9uIGEgcmVxdWVzdCB0byB0aGUgRnVuY3Rpb25cbiAqIFVSTCwgYWxzbyBkcm9wcGVkIGJ5IHtAbGluayBwcm94eUV4dGVybmFsfSB3aGVuIHRoZSByZXF1ZXN0IHdhcyBJQU0tdmVyaWZpZWQ6XG4gKiBmb3J3YXJkZWQsIGl0IHdvdWxkIGxldCB0aGUgdGhpcmQtcGFydHkgb3JpZ2luIHJlcGxheSB0aGUgcmVxdWVzdCBhZ2FpbnN0XG4gKiB0aGUgRnVuY3Rpb24gVVJMLiBBbnl3aGVyZSBlbHNlIHRoZXNlIGFyZSB0aGUgY2xpZW50J3Mgb3duLCBhbmQgYXJlXG4gKiBmb3J3YXJkZWQgYXMgYG5leHQgc3RhcnRgIGZvcndhcmRzIHRoZW0uXG4gKi9cbmNvbnN0IFNJR1Y0X0hFQURFUlM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICBcImF1dGhvcml6YXRpb25cIixcbiAgXCJ4LWFtei1kYXRlXCIsXG4gIFwieC1hbXotY29udGVudC1zaGEyNTZcIixcbiAgXCJ4LWFtei1zZWN1cml0eS10b2tlblwiLFxuXTtcblxuLyoqIEEgYG5leHQuY29uZmlnYCByZXdyaXRlIHdob3NlIGRlc3RpbmF0aW9uIGlzIGFub3RoZXIgb3JpZ2luLiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJveHlFeHRlcm5hbChcbiAgcmVxOiBTaGltSW5jb21pbmdNZXNzYWdlLFxuICByZXM6IFNoaW1TZXJ2ZXJSZXNwb25zZSxcbiAgdXJsOiBVUkwsXG4gIHJlcXVlc3RIZWFkZXJzOiBIZWFkZXJzLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG1ldGhvZCA9IHJlcS5tZXRob2QgPz8gXCJHRVRcIjtcbiAgY29uc3QgaGFzQm9keSA9IG1ldGhvZCAhPT0gXCJHRVRcIiAmJiBtZXRob2QgIT09IFwiSEVBRFwiO1xuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMocmVxdWVzdEhlYWRlcnMpO1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgUFJPWFlfRFJPUFBFRF9IRUFERVJTKSB7XG4gICAgaGVhZGVycy5kZWxldGUobmFtZSk7XG4gIH1cbiAgaWYgKHJlcS50cnVzdEZvcndhcmRlZEhvc3QpIHtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgU0lHVjRfSEVBREVSUykge1xuICAgICAgaGVhZGVycy5kZWxldGUobmFtZSk7XG4gICAgfVxuICB9XG4gIGNvbnN0IHVwc3RyZWFtID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgbWV0aG9kLFxuICAgIGhlYWRlcnMsXG4gICAgYm9keTogaGFzQm9keSA/IChSZWFkYWJsZS50b1dlYihyZXEpIGFzIFJlYWRhYmxlU3RyZWFtKSA6IHVuZGVmaW5lZCxcbiAgICByZWRpcmVjdDogXCJtYW51YWxcIixcbiAgICAuLi4oaGFzQm9keSA/IHsgZHVwbGV4OiBcImhhbGZcIiB9IDoge30pLFxuICB9IGFzIFJlcXVlc3RJbml0KTtcbiAgYXdhaXQgc2VuZFdlYlJlc3BvbnNlKHJlcywgdXBzdHJlYW0pO1xufVxuXG4vKipcbiAqIEhlYWRlcnMgZGVzY3JpYmluZyB0aGUgZnJhbWluZyBvZiBhIGJvZHkgdGhhdCBpcyBubyBsb25nZXIgdGhlIGJvZHkgYmVpbmdcbiAqIHNlbnQsIGRyb3BwZWQgZnJvbSBldmVyeSBgUmVzcG9uc2VgIHtAbGluayBzZW5kV2ViUmVzcG9uc2V9IGZvcndhcmRzLlxuICpcbiAqIEEgcHJveGllZCBvcmlnaW4ncyBgUmVzcG9uc2VgIGNhbWUgYmFjayBmcm9tIGBmZXRjaGAsIGFuZCBzbywgb2Z0ZW4sIGRpZFxuICogbWlkZGxld2FyZSdzIG93biAoYHJldHVybiBmZXRjaCh1cHN0cmVhbSlgIGluIGBwcm94eS50c2AsIHNpbmNlIG1pZGRsZXdhcmVcbiAqIHJ1bnMgaW4gcHJvY2VzcyBhbmQgaXRzIGBmZXRjaGAgaXMgdW5kaWNpKS4gdW5kaWNpIGRlY29kZXMgdGhlIGJvZHkg4oCUIGd6aXAsXG4gKiBkZWZsYXRlLCBiciwgenN0ZCDigJQgYW5kIGxlYXZlcyBgY29udGVudC1lbmNvZGluZ2AgYW5kIGBjb250ZW50LWxlbmd0aGBcbiAqIGRlc2NyaWJpbmcgdGhlIGVuY29kZWQgYnl0ZXMgaXQgYWxyZWFkeSB0aHJldyBhd2F5LiBGb3J3YXJkaW5nIHRoZW0gZW1pdHNcbiAqIHBsYWludGV4dCBsYWJlbGxlZCBgZ3ppcGAgKHRoZSBicm93c2VyIGZhaWxzIHRoZSB3aG9sZSByZXNwb25zZSB3aXRoXG4gKiBgRVJSX0NPTlRFTlRfREVDT0RJTkdfRkFJTEVEYCkgdW5kZXIgYSBgQ29udGVudC1MZW5ndGhgIHRoYXQgaXMgdG9vIHNob3J0LFxuICogYW5kIGBzaG91bGRHemlwYCB0aGVuIGRlY2xpbmVzIHRvIGNvbXByZXNzIGl0IGJlY2F1c2UgYGNvbnRlbnQtZW5jb2RpbmdgIGlzXG4gKiBhbHJlYWR5IHNldCwgc28gbm90aGluZyBkb3duc3RyZWFtIHJlcGFpcnMgaXQuIGB0cmFuc2Zlci1lbmNvZGluZ2AgaXNcbiAqIGhvcC1ieS1ob3A6IGl0IGRlc2NyaWJlZCB0aGUgdXBzdHJlYW0gY29ubmVjdGlvbiwgbm90IHRoaXMgb25lLlxuICpcbiAqIFN0b2NrIE5leHQuanMgZHJvcHMgdGhlIHNhbWUgdGhyZWUgZnJvbSBldmVyeSBtaWRkbGV3YXJlIHJlc3BvbnNlXG4gKiAoYEZPUkJJRERFTl9IRUFERVJTYCBpbiBgbmV4dC9kaXN0L3NlcnZlci93ZWIvc2FuZGJveC9zYW5kYm94LmpzYCksIHNvXG4gKiBtaWRkbGV3YXJlIGNhbm5vdCBsYWJlbCBhIGJvZHkgaXQgZW5jb2RlZCBpdHNlbGYgdGhlcmUgZWl0aGVyLlxuICovXG5jb25zdCBTVEFMRV9GUkFNSU5HX0hFQURFUlM6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KFtcbiAgXCJjb250ZW50LWVuY29kaW5nXCIsXG4gIFwiY29udGVudC1sZW5ndGhcIixcbiAgXCJ0cmFuc2Zlci1lbmNvZGluZ1wiLFxuXSk7XG5cbi8qKiBTdHJlYW0gYSBgUmVzcG9uc2VgIOKAlCBtaWRkbGV3YXJlJ3Mgb3duLCBvciBhIHByb3hpZWQgb3JpZ2luJ3Mg4oCUIGludG8gYHJlc2AuICovXG5hc3luYyBmdW5jdGlvbiBzZW5kV2ViUmVzcG9uc2UoXG4gIHJlczogU2hpbVNlcnZlclJlc3BvbnNlLFxuICByZXNwb25zZTogUmVzcG9uc2UsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmVzLnN0YXR1c0NvZGUgPSByZXNwb25zZS5zdGF0dXM7XG4gIGlmIChyZXNwb25zZS5zdGF0dXNUZXh0KSB7XG4gICAgcmVzLnN0YXR1c01lc3NhZ2UgPSByZXNwb25zZS5zdGF0dXNUZXh0O1xuICB9XG4gIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyhyZXNwb25zZS5oZWFkZXJzKTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIFNUQUxFX0ZSQU1JTkdfSEVBREVSUykge1xuICAgIGhlYWRlcnMuZGVsZXRlKG5hbWUpO1xuICB9XG4gIGFwcGx5SGVhZGVycyhyZXMsIGhlYWRlcnMpO1xuICBpZiAoIXJlc3BvbnNlLmJvZHkpIHtcbiAgICByZXMuZW5kKCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgcmVzcG9uc2UuYm9keSBhcyB1bmtub3duIGFzIEFzeW5jSXRlcmFibGU8VWludDhBcnJheT4pIHtcbiAgICAvLyBMZWF2aW5nIHRoZSBsb29wIGNhbmNlbHMgdGhlIGJvZHksIHdoaWNoIGlzIHdoYXQgc3RvcHMgYSBwcm94aWVkIG9yaWdpblxuICAgIC8vIGZyb20gYmVpbmcgcmVhZCB0byB0aGUgZW5kIGZvciBhIGNsaWVudCB0aGF0IGhhcyBhbHJlYWR5IGdvbmUuXG4gICAgaWYgKHJlcy5kZXN0cm95ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gTm8gYHJlcy5mbHVzaCgpYCBuZWVkZWQgd2hlbiB0aGUgc2luayBjb21wcmVzc2VzOiBpdHMgZ3ppcCBzdGFnZVxuICAgIC8vIHN5bmMtZmx1c2hlcyBldmVyeSBjaHVuaywgc28gYSBzdHJlYW1lZCBib2R5IChzZXJ2ZXItc2VudCBldmVudHMgdGhyb3VnaFxuICAgIC8vIGEgcmV3cml0ZSwgYSBtaWRkbGV3YXJlIGBSZWFkYWJsZVN0cmVhbWApIHJlYWNoZXMgdGhlIGNsaWVudCBjaHVuayBieVxuICAgIC8vIGNodW5rLlxuICAgIC8vXG4gICAgLy8gUGFjZWQgYnkgdGhlIGNsaWVudDogd2l0aG91dCB3YWl0aW5nIGZvciBgZHJhaW5gLCBhIGxhcmdlIHByb3hpZWQgYm9keVxuICAgIC8vIGhlYWRlZCBmb3IgYSBzbG93IGNsaWVudCBpcyBidWZmZXJlZCB3aG9sZSBpbiBtZW1vcnkuXG4gICAgY29uc3QgYWNjZXB0ZWQgPSByZXMud3JpdGUoY2h1bmspO1xuICAgIGlmICghYWNjZXB0ZWQgJiYgIShhd2FpdCBkcmFpbmVkKHJlcykpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG4gIHJlcy5lbmQoKTtcbn1cbiJdfQ==