sonamu 0.11.3 → 0.11.4

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.
@@ -1 +1 @@
1
- {"version":3,"file":"cli-tooling.d.ts","sourceRoot":"","sources":["../../src/tooling/cli-tooling.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,QAAA,MAAM,eAAe,iBAAW,CAAC;AACjC,KAAK,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,GAAG,SAAS,CAAC;AAChE,KAAK,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AACjD,KAAK,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;AAC9F,KAAK,gBAAgB,GAAG,CAAC,KAAK,EAAE,YAAY,KAAK,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;AACxF,KAAK,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;AACrD,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AA+4BhE,eAAO,MAAM,OAAO,EAAE,oBAUrB,CAAC"}
1
+ {"version":3,"file":"cli-tooling.d.ts","sourceRoot":"","sources":["../../src/tooling/cli-tooling.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,QAAA,MAAM,eAAe,iBAAW,CAAC;AACjC,KAAK,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,GAAG,SAAS,CAAC;AAChE,KAAK,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AACjD,KAAK,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;AAC9F,KAAK,gBAAgB,GAAG,CAAC,KAAK,EAAE,YAAY,KAAK,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;AACxF,KAAK,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;AACrD,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AA06BhE,eAAO,MAAM,OAAO,EAAE,oBAUrB,CAAC"}
@@ -340,6 +340,19 @@ async function renderScaffolds(input) {
340
340
  }
341
341
  return rendered;
342
342
  }
343
+ /**
344
+ * 템플릿이 요구하는 dict 키를 프로젝트 사전에 채웁니다.
345
+ *
346
+ * 생성 코드에는 SD("error.entityNotFound") 같은 호출이 박히는데, 키가 프로젝트 사전에
347
+ * 없으면 번역이 되지 않아 사람이 매번 손으로 채우거나 다른 키로 바꿔야 한다.
348
+ * Sonamu UI 경로(ui/api.ts)는 이미 같은 처리를 하므로, CLI도 동일하게 맞춘다.
349
+ */
350
+ async function ensureTemplateDictKeys(templateKeys) {
351
+ const [{ TemplateManager }, { sonamuDictionary }] = await Promise.all([import("../template/template-manager.js"), import("../dict/sonamu-dictionary.js")]);
352
+ const requiredKeys = templateKeys.flatMap((templateKey) => TemplateManager.get(templateKey).getRequiredDictKeys() ?? []);
353
+ if (requiredKeys.length === 0) return;
354
+ await sonamuDictionary.ensureDictKeys([...new Set(requiredKeys)]);
355
+ }
343
356
  async function scaffoldOperation(method, input) {
344
357
  const directTemplate = z.enum([
345
358
  "model",
@@ -351,6 +364,7 @@ async function scaffoldOperation(method, input) {
351
364
  await ensureSonamu();
352
365
  const { Sonamu } = await import("../api/sonamu.js");
353
366
  const entityId = requiredText(input, "entityId");
367
+ await ensureTemplateDictKeys([directTemplate.data]);
354
368
  return directTemplate.data === "view_list" ? Sonamu.syncer.generateTemplate("view_list", {
355
369
  entityId,
356
370
  extra: input.extra
@@ -378,6 +392,7 @@ async function scaffoldOperation(method, input) {
378
392
  })));
379
393
  if (method === "status") return items.map(({ content: _content, ...item }) => item);
380
394
  if (method === "preview" || method === "batch" && explicitlyDryRun(input)) return items;
395
+ await ensureTemplateDictKeys([...new Set(items.map((item) => item.template))]);
381
396
  const results = [];
382
397
  for (const item of items) {
383
398
  const { content: _content, ...summary } = item;
@@ -898,4 +913,4 @@ Object.defineProperty(tooling.migration, "apply", {
898
913
  //#endregion
899
914
  export { tooling };
900
915
 
901
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLXRvb2xpbmcuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rvb2xpbmcvY2xpLXRvb2xpbmcudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgdHlwZSBGaXh0dXJlQ29tbWFuZE9wdGlvbnMgfSBmcm9tIFwiLi4vYmluL2ZpeHR1cmVcIjtcblxuY29uc3QganNvblZhbHVlU2NoZW1hID0gei5qc29uKCk7XG50eXBlIENvbW1hbmRWYWx1ZSA9IHouaW5mZXI8dHlwZW9mIGpzb25WYWx1ZVNjaGVtYT4gfCB1bmRlZmluZWQ7XG50eXBlIENvbW1hbmRJbnB1dCA9IFJlY29yZDxzdHJpbmcsIENvbW1hbmRWYWx1ZT47XG50eXBlIFRvb2xpbmdSZXN1bHQgPSBvYmplY3QgfCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbCB8IHZvaWQgfCBBc3luY0l0ZXJhYmxlPG9iamVjdD47XG50eXBlIFRvb2xpbmdPcGVyYXRpb24gPSAoaW5wdXQ6IENvbW1hbmRJbnB1dCkgPT4gVG9vbGluZ1Jlc3VsdCB8IFByb21pc2U8VG9vbGluZ1Jlc3VsdD47XG50eXBlIFRvb2xpbmdHcm91cCA9IFJlY29yZDxzdHJpbmcsIFRvb2xpbmdPcGVyYXRpb24+O1xuZXhwb3J0IHR5cGUgQ2xpVG9vbGluZ09wZXJhdGlvbnMgPSBSZWNvcmQ8c3RyaW5nLCBUb29saW5nR3JvdXA+O1xuXG50eXBlIE1pZ3JhdGlvblRhcmdldCA9IFwiZGV2ZWxvcG1lbnRcIiB8IFwic3RhZ2luZ1wiIHwgXCJwcm9kdWN0aW9uXCIgfCBcImZpeHR1cmVcIiB8IFwidGVzdFwiO1xuXG5jb25zdCBNSUdSQVRJT05fVEFSR0VUUyA9IG5ldyBTZXQ8c3RyaW5nPihbXG4gIFwiZGV2ZWxvcG1lbnRcIixcbiAgXCJzdGFnaW5nXCIsXG4gIFwicHJvZHVjdGlvblwiLFxuICBcImZpeHR1cmVcIixcbiAgXCJ0ZXN0XCIsXG5dKTtcblxuZnVuY3Rpb24gYXNzZXJ0TWlncmF0aW9uVGFyZ2V0KHRhcmdldDogc3RyaW5nKTogYXNzZXJ0cyB0YXJnZXQgaXMgTWlncmF0aW9uVGFyZ2V0IHtcbiAgLy8gREIg7IOB7YOc66W8IOyhsO2ajO2VmOqxsOuCmCDrs4Dqsr3tlZjquLAg7KCE7JeQIOuqqOuToCDsmbjrtoAg64yA7IOB7J2EIOqygOymne2VqeuLiOuLpC5cbiAgaWYgKE1JR1JBVElPTl9UQVJHRVRTLmhhcyh0YXJnZXQpKSByZXR1cm47XG4gIHRocm93IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKGBVbnN1cHBvcnRlZCBtaWdyYXRpb24gdGFyZ2V0OiAke3RhcmdldH1gKSwge1xuICAgIGNvZGU6IFwiSU5WQUxJRF9NSUdSQVRJT05fVEFSR0VUXCIsXG4gICAgZXhpdENvZGU6IDIsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhc3NlcnRTaGFkb3dNaWdyYXRpb25UYXJnZXQoXG4gIHRhcmdldDogTWlncmF0aW9uVGFyZ2V0LFxuKTogYXNzZXJ0cyB0YXJnZXQgaXMgRXh0cmFjdDxNaWdyYXRpb25UYXJnZXQsIFwiZml4dHVyZVwiIHwgXCJ0ZXN0XCI+IHtcbiAgaWYgKHRhcmdldCA9PT0gXCJmaXh0dXJlXCIgfHwgdGFyZ2V0ID09PSBcInRlc3RcIikgcmV0dXJuO1xuXG4gIC8vIFNoYWRvdyBEQuuKlCDsmrTsmIEg6rOE7Je0IOyXsOqysOyXkCDsoJHqt7ztlZjquLAg7KCE7JeQIO2XiOyaqSDrjIDsg4HsnYQg7KCc7ZWc7ZWp64uI64ukLlxuICB0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihgSW52YWxpZCBzaGFkb3cgbWlncmF0aW9uIHRhcmdldDogJHt0YXJnZXR9YCksIHtcbiAgICBjb2RlOiBcIklOVkFMSURfU0hBRE9XX01JR1JBVElPTl9UQVJHRVRcIixcbiAgICB0YXJnZXQsXG4gICAgZXhpdENvZGU6IDIsXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtaWdyYXRpb25QbGFuKFxuICB0YXJnZXQ6IE1pZ3JhdGlvblRhcmdldCxcbiAgbWlncmF0aW9uczogc3RyaW5nW10sXG4gIGFjdGlvbjogXCJhcHBseVwiIHwgXCJyb2xsYmFja1wiID0gXCJhcHBseVwiLFxuKSB7XG4gIGNvbnN0IGRpZ2VzdCA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGlnZXN0KFxuICAgIFwiU0hBLTI1NlwiLFxuICAgIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShKU09OLnN0cmluZ2lmeSh7IGFjdGlvbiwgdGFyZ2V0LCBtaWdyYXRpb25zIH0pKSxcbiAgKTtcbiAgcmV0dXJuIHtcbiAgICBraW5kOiBcIm1pZ3JhdGlvbi1wbGFuXCIgYXMgY29uc3QsXG4gICAgYWN0aW9uLFxuICAgIHRhcmdldCxcbiAgICBtaWdyYXRpb25zLFxuICAgIGZpbmdlcnByaW50OiBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KGRpZ2VzdCksIChieXRlKSA9PlxuICAgICAgYnl0ZS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpLFxuICAgICkuam9pbihcIlwiKSxcbiAgfTtcbn1cblxuY29uc3QgUkVRVUlSRURfTUVUSE9EUyA9IHtcbiAgY29yZTogW1wic3luY1wiXSxcbiAgZW50aXR5OiBbXCJsaXN0XCIsIFwic2hvd1wiLCBcInNlYXJjaFwiLCBcImFwcGx5UGF0Y2hcIiwgXCJjcmVhdGVcIiwgXCJjb25lc1wiXSxcbiAgc2NhZmZvbGQ6IFtcIm1vZGVsXCIsIFwibW9kZWxfdGVzdFwiLCBcInZpZXdfbGlzdFwiLCBcInZpZXdfZm9ybVwiLCBcInN0YXR1c1wiLCBcInByZXZpZXdcIiwgXCJiYXRjaFwiXSxcbiAgbWlncmF0aW9uOiBbXCJydW5cIiwgXCJnZW5lcmF0ZVwiLCBcInN0YXR1c1wiLCBcImNvbm5lY3Rpb25zXCIsIFwiY29kZVwiLCBcInByZXZpZXdcIiwgXCJzaGFkb3dcIiwgXCJyb2xsYmFja1wiXSxcbiAgZml4dHVyZTogW1wiaW5pdFwiLCBcImltcG9ydFwiLCBcInN5bmNcIiwgXCJnZW5cIiwgXCJmZXRjaFwiLCBcImV4cGxvcmVcIl0sXG4gIGJ1aWxkOiBbXCJhbGxcIiwgXCJhcGlcIiwgXCJ3ZWJcIl0sXG4gIHRlc3Q6IFtcInJ1blwiLCBcInN0YXR1c1wiXSxcbiAgYXV0aDogW1wiZ2VuZXJhdGVcIiwgXCJhZGRDb21wYW5pb25zXCJdLFxuICBpMThuOiBbXCJsaXN0XCIsIFwiY2hlY2tcIiwgXCJpbXBvcnRcIiwgXCJleHBvcnRcIiwgXCJjcmVhdGVcIiwgXCJ1cGRhdGVcIiwgXCJyZW1vdmVcIl0sXG4gIHRhc2s6IFtcImRlZmluaXRpb25zXCIsIFwicnVuc1wiLCBcInNob3dcIiwgXCJzdGVwc1wiLCBcIndhdGNoXCIsIFwicGF1c2VcIiwgXCJyZXN1bWVcIiwgXCJjYW5jZWxcIl0sXG4gIGNkZDogW1widHJlZVwiLCBcInJlYWRcIiwgXCJydWxlc1wiLCBcInNob3dSdWxlXCIsIFwiYWRkUnVsZVwiLCBcImFkZEFjY2VwdGFuY2VDcml0ZXJpb25cIl0sXG4gIHN0dWI6IFtcInByYWN0aWNlXCJdLFxufSBhcyBjb25zdDtcblxubGV0IGluaXRpYWxpemF0aW9uOiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkO1xuXG5hc3luYyBmdW5jdGlvbiBlbnN1cmVTb25hbXUoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgU29uYW11IH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9hcGkvc29uYW11XCIpO1xuICBpZiAoU29uYW11LmlzSW5pdGlhbGl6ZWQpIHJldHVybjtcbiAgaW5pdGlhbGl6YXRpb24gPz89IFNvbmFtdS5pbml0KHRydWUsIGZhbHNlKTtcbiAgYXdhaXQgaW5pdGlhbGl6YXRpb247XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN5bmNPcGVyYXRpb24oaW5wdXQ6IENvbW1hbmRJbnB1dCk6IFByb21pc2U8VG9vbGluZ1Jlc3VsdD4ge1xuICBhd2FpdCBlbnN1cmVTb25hbXUoKTtcbiAgY29uc3QgeyBTb25hbXUgfSA9IGF3YWl0IGltcG9ydChcIi4uL2FwaS9zb25hbXVcIik7XG4gIHJldHVybiBpbnB1dC5mb3JjZSA9PT0gdHJ1ZSA/IFNvbmFtdS5zeW5jZXIuZm9yY2VTeW5jKCkgOiBTb25hbXUuc3luY2VyLnN5bmMoKTtcbn1cblxuZnVuY3Rpb24gdGV4dChpbnB1dDogQ29tbWFuZElucHV0LCBrZXk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHZhbHVlID0gei5zdHJpbmcoKS5zYWZlUGFyc2UoaW5wdXRba2V5XSk7XG4gIHJldHVybiB2YWx1ZS5zdWNjZXNzID8gdmFsdWUuZGF0YSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gc3RyaW5ncyhpbnB1dDogQ29tbWFuZElucHV0LCBrZXk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgdmFsdWUgPSB6LmFycmF5KHouc3RyaW5nKCkpLnNhZmVQYXJzZShpbnB1dFtrZXldKTtcbiAgcmV0dXJuIHZhbHVlLnN1Y2Nlc3MgPyB2YWx1ZS5kYXRhIDogW107XG59XG5cbmZ1bmN0aW9uIHJlcXVpcmVkVGV4dChpbnB1dDogQ29tbWFuZElucHV0LCBrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHZhbHVlID0gdGV4dChpbnB1dCwga2V5KTtcbiAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUubGVuZ3RoID4gMCkgcmV0dXJuIHZhbHVlO1xuICB0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihgTWlzc2luZyAke2tleX0uYCksIHsgY29kZTogXCJNSVNTSU5HX0FSR1VNRU5UXCIsIGV4aXRDb2RlOiAyIH0pO1xufVxuXG4vKipcbiAqIOyDneuete2VnCDqsJLsnYAgYHVuZGVmaW5lZGDroZwg7Ya16rO87Iuc7YKk65CYLCDqsJLsnbQg7J6I64qU642wIOusuOyekOyXtOydtCDslYTri4jrqbQg7J247J6QIOyYpOulmOuhnCDqsbDsoIjtlanri4jri6QuXG4gKlxuICogYHRleHQoKWDsspjrn7wg7KGw7Jqp7Z6IIOustOyLnO2VmOuptCDsnpjrqrvrkJwg7YOA7J6F7J2YIOyeheugpeydtCDquLDrs7jqsJLsnLzroZwg65GU6rCR7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiBvcHRpb25hbFRleHQoaW5wdXQ6IENvbW1hbmRJbnB1dCwga2V5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB2YWx1ZSA9IGlucHV0W2tleV07XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBwYXJzZWQgPSB6LnN0cmluZygpLnNhZmVQYXJzZSh2YWx1ZSk7XG4gIGlmIChwYXJzZWQuc3VjY2VzcykgcmV0dXJuIHBhcnNlZC5kYXRhO1xuICB0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihgSW52YWxpZCAke2tleX0uYCksIHsgY29kZTogXCJJTlZBTElEX0FSR1VNRU5UXCIsIGV4aXRDb2RlOiAyIH0pO1xufVxuXG5mdW5jdGlvbiBwYXJzZUpzb248U2NoZW1hIGV4dGVuZHMgei5ab2RUeXBlPihcbiAgY29udGVudHM6IHN0cmluZyxcbiAgY29kZTogc3RyaW5nLFxuICBzY2hlbWE6IFNjaGVtYSxcbik6IHouaW5mZXI8U2NoZW1hPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHNjaGVtYS5wYXJzZShKU09OLnBhcnNlKGNvbnRlbnRzKSk7XG4gIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgdGhyb3cgT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoXCJJbnZhbGlkIEpTT04gaW5wdXQuXCIpLCB7IGNvZGUsIGV4aXRDb2RlOiAyLCBjYXVzZSB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtdXRhdGlvblJlcXVlc3RlZChpbnB1dDogQ29tbWFuZElucHV0KTogYm9vbGVhbiB7XG4gIHJldHVybiBpbnB1dC5leGVjdXRlID09PSB0cnVlIHx8IGlucHV0LmRyeVJ1biA9PT0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGV4cGxpY2l0bHlEcnlSdW4oaW5wdXQ6IENvbW1hbmRJbnB1dCk6IGJvb2xlYW4ge1xuICByZXR1cm4gaW5wdXQuZHJ5UnVuID09PSB0cnVlIHx8IGlucHV0LmV4ZWN1dGUgPT09IGZhbHNlO1xufVxuXG5jb25zdCBlbnRpdHlQYXRjaFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgZW50aXR5SWQ6IHouc3RyaW5nKCkubWluKDEpLFxuICBvcGVyYXRpb25zOiB6LmFycmF5KFxuICAgIHoub2JqZWN0KHtcbiAgICAgIG9wOiB6LmxpdGVyYWwoXCJhZGRcIiksXG4gICAgICBwYXRoOiB6LmxpdGVyYWwoXCIvcHJvcHMvLVwiKSxcbiAgICAgIHZhbHVlOiB6XG4gICAgICAgIC5vYmplY3QoeyBuYW1lOiB6LnN0cmluZygpLm1pbigxKSwgdHlwZTogei5zdHJpbmcoKS5taW4oMSkgfSlcbiAgICAgICAgLmNhdGNoYWxsKGpzb25WYWx1ZVNjaGVtYSksXG4gICAgfSksXG4gICksXG59KTtcbmNvbnN0IGkxOG5FbnRyaWVzU2NoZW1hID0gei5hcnJheShcbiAgei5vYmplY3QoeyBrZXk6IHouc3RyaW5nKCksIHZhbHVlczogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkgfSksXG4pO1xuY29uc3QgZGljdGlvbmFyeVZhbHVlc1NjaGVtYSA9IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpO1xuY29uc3QgZGljdGlvbmFyeVNvdXJjZVNjaGVtYSA9IHouZW51bShbXCJlbnRpdHlcIiwgXCJwcm9qZWN0XCIsIFwic29uYW11XCJdKTtcbmNvbnN0IGNvbmVMb2NhbGVTY2hlbWEgPSB6LmVudW0oW1wia29cIiwgXCJlblwiLCBcImphXCJdKTtcblxuLyoqXG4gKiBjb25lIOyDneyEseyXkCDsgqzsmqntlaAgbG9jYWxl7J2EIOqysOygle2VqeuLiOuLpC5cbiAqXG4gKiDrqoXsi5ztlZwgbG9jYWxl7J20IOy1nOyasOyEoOydtOqzoCwg7JeG7Jy866m0IO2UhOuhnOygne2KuCBpMThuIOq4sOuzuCBsb2NhbGUsIOq3uOuniOyggCDsl4bsnLzrqbQgXCJrb1wi66W8IOyCrOyaqe2VqeuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUNvbmVMb2NhbGUoaW5wdXQ6IENvbW1hbmRJbnB1dCk6IFByb21pc2U8ei5pbmZlcjx0eXBlb2YgY29uZUxvY2FsZVNjaGVtYT4+IHtcbiAgY29uc3QgZXhwbGljaXQgPSBjb25lTG9jYWxlU2NoZW1hLnNhZmVQYXJzZShpbnB1dC5sb2NhbGUpO1xuICBpZiAoZXhwbGljaXQuc3VjY2VzcykgcmV0dXJuIGV4cGxpY2l0LmRhdGE7XG5cbiAgY29uc3QgeyBTb25hbXUgfSA9IGF3YWl0IGltcG9ydChcIi4uL2FwaS9zb25hbXVcIik7XG4gIGxldCBjb25maWd1cmVkTG9jYWxlOiB1bmtub3duO1xuICB0cnkge1xuICAgIGNvbmZpZ3VyZWRMb2NhbGUgPSBTb25hbXUuY29uZmlnLmkxOG4/LmRlZmF1bHRMb2NhbGU7XG4gIH0gY2F0Y2gge1xuICAgIC8vIOyEpOygleydhCDslYTsp4Eg7J297J2EIOyImCDsl4bripQg7Iuk7ZaJIOqyveuhnOyXkOyEnOuKlCDquLDrs7ggbG9jYWxl66GcIO2PtOuwse2VqeuLiOuLpC5cbiAgfVxuICBjb25zdCBjb25maWd1cmVkID0gY29uZUxvY2FsZVNjaGVtYS5zYWZlUGFyc2UoY29uZmlndXJlZExvY2FsZSk7XG4gIHJldHVybiBjb25maWd1cmVkLnN1Y2Nlc3MgPyBjb25maWd1cmVkLmRhdGEgOiBcImtvXCI7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGVudGl0eU9wZXJhdGlvbihtZXRob2Q6IHN0cmluZywgaW5wdXQ6IENvbW1hbmRJbnB1dCk6IFByb21pc2U8VG9vbGluZ1Jlc3VsdD4ge1xuICBhd2FpdCBlbnN1cmVTb25hbXUoKTtcbiAgY29uc3QgeyBFbnRpdHlNYW5hZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIik7XG4gIGNvbnN0IGVudGl0aWVzID0gRW50aXR5TWFuYWdlci5nZXRBbGxFbnRpdGllcygpO1xuXG4gIGlmIChtZXRob2QgPT09IFwibGlzdFwiKSByZXR1cm4gZW50aXRpZXMubWFwKChlbnRpdHkpID0+IGVudGl0eS50b0pzb24oKSk7XG4gIGlmIChtZXRob2QgPT09IFwic2hvd1wiKSB7XG4gICAgY29uc3QgZW50aXR5SWQgPSByZXF1aXJlZFRleHQoaW5wdXQsIFwiZW50aXR5SWRcIik7XG4gICAgaWYgKCFFbnRpdHlNYW5hZ2VyLmV4aXN0cyhlbnRpdHlJZCkpIHtcbiAgICAgIHRocm93IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKGBFbnRpdHkgbm90IGZvdW5kOiAke2VudGl0eUlkfWApLCB7XG4gICAgICAgIGNvZGU6IFwiRU5USVRZX05PVF9GT1VORFwiLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCkudG9Kc29uKCk7XG4gIH1cbiAgaWYgKG1ldGhvZCA9PT0gXCJzZWFyY2hcIikge1xuICAgIGNvbnN0IHF1ZXJ5ID0gcmVxdWlyZWRUZXh0KGlucHV0LCBcInF1ZXJ5XCIpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIGVudGl0aWVzXG4gICAgICAubWFwKChlbnRpdHkpID0+IGVudGl0eS50b0pzb24oKSlcbiAgICAgIC5maWx0ZXIoKGVudGl0eSkgPT4gSlNPTi5zdHJpbmdpZnkoZW50aXR5KS50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XG4gIH1cbiAgaWYgKG1ldGhvZCA9PT0gXCJjcmVhdGVcIikge1xuICAgIGNvbnN0IGVudGl0eUlkID0gcmVxdWlyZWRUZXh0KGlucHV0LCBcIm5hbWVcIik7XG4gICAgY29uc3QgeyBTb25hbXUgfSA9IGF3YWl0IGltcG9ydChcIi4uL2FwaS9zb25hbXVcIik7XG4gICAgYXdhaXQgU29uYW11LnN5bmNlci5jcmVhdGVFbnRpdHkoeyBlbnRpdHlJZCwgdGl0bGU6IGVudGl0eUlkIH0pO1xuICAgIGlmIChpbnB1dC5ub0NvbmVzID09PSB0cnVlKSByZXR1cm4geyBlbnRpdHlJZCwgY29uZXM6IFwic2tpcHBlZFwiIH07XG4gICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgIGlmIChpbnB1dC5haSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIGVudGl0eS5nZW5lcmF0ZUNvbmVzKHtcbiAgICAgICAgcHJlc2VydmVFeGlzdGluZzogZmFsc2UsXG4gICAgICAgIG9ubHlFbXB0eTogZmFsc2UsXG4gICAgICAgIGxvY2FsZTogYXdhaXQgcmVzb2x2ZUNvbmVMb2NhbGUoaW5wdXQpLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGF3YWl0IGVudGl0eS5nZW5lcmF0ZVRlbXBsYXRlQ29uZXMoKTtcbiAgICByZXR1cm4geyBlbnRpdHlJZCwgY29uZXM6IFwidGVtcGxhdGVcIiB9O1xuICB9XG4gIGlmIChtZXRob2QgPT09IFwiY29uZXNcIikge1xuICAgIGNvbnN0IGVudGl0eUlkID0gcmVxdWlyZWRUZXh0KGlucHV0LCBcImVudGl0eUlkXCIpO1xuICAgIGNvbnN0IHRhcmdldHMgPVxuICAgICAgaW5wdXQuYWxsID09PSB0cnVlIHx8IGVudGl0eUlkID09PSBcImFsbFwiXG4gICAgICAgID8gRW50aXR5TWFuYWdlci5nZXRBbGxFbnRpdGllcygpXG4gICAgICAgIDogRW50aXR5TWFuYWdlci5leGlzdHMoZW50aXR5SWQpXG4gICAgICAgICAgPyBbRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpXVxuICAgICAgICAgIDogW107XG4gICAgaWYgKHRhcmdldHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihgRW50aXR5IG5vdCBmb3VuZDogJHtlbnRpdHlJZH1gKSwge1xuICAgICAgICBjb2RlOiBcIkVOVElUWV9OT1RfRk9VTkRcIixcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCByZWdlbmVyYXRlID0gaW5wdXQucmVnZW5lcmF0ZSA9PT0gdHJ1ZTtcbiAgICBjb25zdCBzZWxlY3RlZExvY2FsZSA9IGF3YWl0IHJlc29sdmVDb25lTG9jYWxlKGlucHV0KTtcbiAgICAvLyDtlZwg7JeU7Yuw7Yuw7J2YIOyLpO2MqOqwgCDrgpjrqLjsp4Ag7JeU7Yuw7Yuw7J2YIGNvbmUg7IOd7ISx7J2EIOy3qOyGjO2VmOyngCDslYrrj4TroZ0g7KCE67aAIOuBneq5jOyngCDsi6Ttlontlanri4jri6QuXG4gICAgY29uc3Qgc2V0dGxlZCA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgIHRhcmdldHMubWFwKGFzeW5jIChlbnRpdHkpID0+ICh7XG4gICAgICAgIGVudGl0eUlkOiBlbnRpdHkuaWQsXG4gICAgICAgIC4uLihhd2FpdCBlbnRpdHkuZ2VuZXJhdGVDb25lcyh7XG4gICAgICAgICAgcHJlc2VydmVFeGlzdGluZzogIXJlZ2VuZXJhdGUsXG4gICAgICAgICAgb25seUVtcHR5OiAhcmVnZW5lcmF0ZSxcbiAgICAgICAgICBsb2NhbGU6IHNlbGVjdGVkTG9jYWxlLFxuICAgICAgICB9KSksXG4gICAgICB9KSksXG4gICAgKTtcbiAgICBjb25zdCByZXN1bHRzID0gW107XG4gICAgY29uc3QgZmFpbHVyZXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgb3V0Y29tZV0gb2Ygc2V0dGxlZC5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChvdXRjb21lLnN0YXR1cyA9PT0gXCJmdWxmaWxsZWRcIikge1xuICAgICAgICByZXN1bHRzLnB1c2gob3V0Y29tZS52YWx1ZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZmFpbHVyZXMucHVzaCh7XG4gICAgICAgIGVudGl0eUlkOiB0YXJnZXRzW2luZGV4XS5pZCxcbiAgICAgICAgbWVzc2FnZTogb3V0Y29tZS5yZWFzb24gaW5zdGFuY2VvZiBFcnJvciA/IG91dGNvbWUucmVhc29uLm1lc3NhZ2UgOiBTdHJpbmcob3V0Y29tZS5yZWFzb24pLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChmYWlsdXJlcy5sZW5ndGggPT09IDApIHJldHVybiByZXN1bHRzO1xuICAgIHRocm93IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKGBDb25lIGdlbmVyYXRpb24gZmFpbGVkIGZvciAke2ZhaWx1cmVzLmxlbmd0aH0gZW50aXR5KHMpLmApLCB7XG4gICAgICBjb2RlOiBcIkNPTkVfR0VORVJBVElPTl9GQUlMRURcIixcbiAgICAgIGRldGFpbHM6IHsgcmVzdWx0cywgZmFpbHVyZXMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IGZpbGUgPSByZXF1aXJlZFRleHQoaW5wdXQsIFwiZmlsZVwiKTtcbiAgY29uc3QgeyByZWFkRmlsZSB9ID0gYXdhaXQgaW1wb3J0KFwibm9kZTpmcy9wcm9taXNlc1wiKTtcbiAgY29uc3QgY29udGVudHMgPVxuICAgIGZpbGUgPT09IFwiLVwiXG4gICAgICA/IGF3YWl0IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2h1bmtzID0gW107XG4gICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiBwcm9jZXNzLnN0ZGluKSBjaHVua3MucHVzaChCdWZmZXIuZnJvbShjaHVuaykpO1xuICAgICAgICAgIHJldHVybiBCdWZmZXIuY29uY2F0KGNodW5rcykudG9TdHJpbmcoXCJ1dGY4XCIpO1xuICAgICAgICB9KSgpXG4gICAgICA6IGF3YWl0IHJlYWRGaWxlKGZpbGUsIFwidXRmOFwiKTtcbiAgY29uc3QgcGF0Y2ggPSBwYXJzZUpzb24oY29udGVudHMsIFwiSU5WQUxJRF9FTlRJVFlfUEFUQ0hcIiwgZW50aXR5UGF0Y2hTY2hlbWEpO1xuICBpZiAoIUVudGl0eU1hbmFnZXIuZXhpc3RzKHBhdGNoLmVudGl0eUlkKSkge1xuICAgIHRocm93IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKGBFbnRpdHkgbm90IGZvdW5kOiAke3BhdGNoLmVudGl0eUlkfWApLCB7XG4gICAgICBjb2RlOiBcIkVOVElUWV9OT1RfRk9VTkRcIixcbiAgICB9KTtcbiAgfVxuICBjb25zdCB0YXJnZXQgPSBFbnRpdHlNYW5hZ2VyLmdldChwYXRjaC5lbnRpdHlJZCk7XG4gIGNvbnN0IGJlZm9yZSA9IHRhcmdldC50b0pzb24oKTtcbiAgY29uc3QgYWZ0ZXIgPSBzdHJ1Y3R1cmVkQ2xvbmUoYmVmb3JlKTtcbiAgY29uc3QgbmV4dFByb3BzID0gW1xuICAgIC4uLmFmdGVyLnByb3BzLFxuICAgIC4uLnBhdGNoLm9wZXJhdGlvbnMubWFwKCh7IHZhbHVlIH0pID0+IHN0cnVjdHVyZWRDbG9uZSh2YWx1ZSkpLFxuICBdO1xuICAvLyDtjIzsnbzsnbTrgpgg65Ox66Gd65CcIOyXlO2LsO2LsOulvCDqsbTrk5zrpqzquLAg7KCE7JeQIHBhdGNoIOyggeyaqSDqsrDqs7wg7KCE7LK066W8IGVudGl0eSDsiqTtgqTrp4jroZwg6rKA7Kad7ZWp64uI64ukLlxuICBjb25zdCB7IEVudGl0eUpzb25TY2hlbWEgfSA9IGF3YWl0IGltcG9ydChcIi4uL3R5cGVzL3R5cGVzXCIpO1xuICBjb25zdCB2YWxpZGF0aW9uID0gRW50aXR5SnNvblNjaGVtYS5zYWZlUGFyc2UoeyAuLi5hZnRlciwgcHJvcHM6IG5leHRQcm9wcyB9KTtcbiAgaWYgKCF2YWxpZGF0aW9uLnN1Y2Nlc3MpIHtcbiAgICB0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihcIkludmFsaWQgZW50aXR5IHBhdGNoLlwiKSwge1xuICAgICAgY29kZTogXCJJTlZBTElEX0VOVElUWV9QQVRDSFwiLFxuICAgICAgZXhpdENvZGU6IDIsXG4gICAgICBjYXVzZTogdmFsaWRhdGlvbi5lcnJvcixcbiAgICB9KTtcbiAgfVxuICAvLyBTQUZFVFk6IEVudGl0eUpzb25TY2hlbWHqsIAgcGF0Y2gg7KCB7JqpIOqysOqzvCDsoITssrTrpbwg6rKA7Kad7ZaI7Iq164uI64ukLlxuICBhZnRlci5wcm9wcyA9IG5leHRQcm9wcyBhcyB0eXBlb2YgYWZ0ZXIucHJvcHM7XG4gIGlmIChtdXRhdGlvblJlcXVlc3RlZChpbnB1dCkpIHtcbiAgICAvLyBTQUZFVFk6IGFmdGVyLnByb3BzIG9yaWdpbmF0ZXMgZnJvbSB0aGUgY3VycmVudCBlbnRpdHkgcGx1cyBzY2hlbWEtdmFsaWRhdGVkIHByb3AgYWRkaXRpb25zLlxuICAgIHRhcmdldC5wcm9wcyA9IGFmdGVyLnByb3BzIGFzIHR5cGVvZiB0YXJnZXQucHJvcHM7XG4gICAgYXdhaXQgdGFyZ2V0LnNhdmUoKTtcbiAgfVxuICByZXR1cm4geyBjaGFuZ2VkOiBwYXRjaC5vcGVyYXRpb25zLmxlbmd0aCA+IDAsIGJlZm9yZSwgYWZ0ZXIgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVuZGVyU2NhZmZvbGRzKGlucHV0OiBDb21tYW5kSW5wdXQpIHtcbiAgYXdhaXQgZW5zdXJlU29uYW11KCk7XG4gIGNvbnN0IHsgcmVuZGVyVGVtcGxhdGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL3N5bmNlci9jb2RlLWdlbmVyYXRvclwiKTtcbiAgY29uc3QgZW50aXRpZXMgPSBzdHJpbmdzKGlucHV0LCBcImVudGl0aWVzXCIpO1xuICBjb25zdCB0ZW1wbGF0ZXMgPSBzdHJpbmdzKGlucHV0LCBcInRlbXBsYXRlc1wiKTtcbiAgY29uc3QgcmVuZGVyZWQgPSBbXTtcbiAgZm9yIChjb25zdCBlbnRpdHlJZCBvZiBlbnRpdGllcykge1xuICAgIGZvciAoY29uc3QgdGVtcGxhdGUgb2YgdGVtcGxhdGVzKSB7XG4gICAgICBjb25zdCB0ZW1wbGF0ZUtleSA9IHpcbiAgICAgICAgLmVudW0oW1wibW9kZWxcIiwgXCJtb2RlbF90ZXN0XCIsIFwidmlld19saXN0XCIsIFwidmlld19mb3JtXCIsIFwidmlld19zZWFyY2hfaW5wdXRcIl0pXG4gICAgICAgIC5wYXJzZSh0ZW1wbGF0ZSk7XG4gICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHJlbmRlclRlbXBsYXRlKHRlbXBsYXRlS2V5LCB7IGVudGl0eUlkIH0pO1xuICAgICAgcmVuZGVyZWQucHVzaCh7IGVudGl0eUlkLCB0ZW1wbGF0ZTogdGVtcGxhdGVLZXksIGZpbGVzIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVuZGVyZWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNjYWZmb2xkT3BlcmF0aW9uKG1ldGhvZDogc3RyaW5nLCBpbnB1dDogQ29tbWFuZElucHV0KTogUHJvbWlzZTxUb29saW5nUmVzdWx0PiB7XG4gIGNvbnN0IGRpcmVjdFRlbXBsYXRlID0gelxuICAgIC5lbnVtKFtcIm1vZGVsXCIsIFwibW9kZWxfdGVzdFwiLCBcInZpZXdfbGlzdFwiLCBcInZpZXdfZm9ybVwiXSlcbiAgICAuc2FmZVBhcnNlKG1ldGhvZCk7XG4gIGlmIChkaXJlY3RUZW1wbGF0ZS5zdWNjZXNzKSB7XG4gICAgYXdhaXQgZW5zdXJlU29uYW11KCk7XG4gICAgY29uc3QgeyBTb25hbXUgfSA9IGF3YWl0IGltcG9ydChcIi4uL2FwaS9zb25hbXVcIik7XG4gICAgY29uc3QgZW50aXR5SWQgPSByZXF1aXJlZFRleHQoaW5wdXQsIFwiZW50aXR5SWRcIik7XG4gICAgcmV0dXJuIGRpcmVjdFRlbXBsYXRlLmRhdGEgPT09IFwidmlld19saXN0XCJcbiAgICAgID8gU29uYW11LnN5bmNlci5nZW5lcmF0ZVRlbXBsYXRlKFwidmlld19saXN0XCIsIHsgZW50aXR5SWQsIGV4dHJhOiBpbnB1dC5leHRyYSB9KVxuICAgICAgOiBTb25hbXUuc3luY2VyLmdlbmVyYXRlVGVtcGxhdGUoZGlyZWN0VGVtcGxhdGUuZGF0YSwgeyBlbnRpdHlJZCB9KTtcbiAgfVxuICBjb25zdCByZW5kZXJlZCA9IGF3YWl0IHJlbmRlclNjYWZmb2xkcyhpbnB1dCk7XG4gIGNvbnN0IHsgYWNjZXNzIH0gPSBhd2FpdCBpbXBvcnQoXCJub2RlOmZzL3Byb21pc2VzXCIpO1xuICBjb25zdCBwYXRoID0gYXdhaXQgaW1wb3J0KFwibm9kZTpwYXRoXCIpO1xuICBjb25zdCB7IFNvbmFtdSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vYXBpL3NvbmFtdVwiKTtcbiAgY29uc3QgaXRlbXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICByZW5kZXJlZC5mbGF0TWFwKCh7IGVudGl0eUlkLCB0ZW1wbGF0ZSwgZmlsZXMgfSkgPT5cbiAgICAgIGZpbGVzLm1hcChhc3luYyAoZmlsZSkgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBwYXRoLmRlZmF1bHQuam9pbihcbiAgICAgICAgICBTb25hbXUuYXBwUm9vdFBhdGgsXG4gICAgICAgICAgZmlsZS5wYXRoLnJlcGxhY2UoXCIvOnRhcmdldC9cIiwgXCIvd2ViL1wiKSxcbiAgICAgICAgKTtcbiAgICAgICAgbGV0IGV4aXN0cyA9IHRydWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgYWNjZXNzKHRhcmdldCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIGV4aXN0cyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGVudGl0eUlkLCB0ZW1wbGF0ZSwgdGFyZ2V0LCBleGlzdHMsIGNvbnRlbnQ6IGZpbGUuY29kZSB9O1xuICAgICAgfSksXG4gICAgKSxcbiAgKTtcbiAgaWYgKG1ldGhvZCA9PT0gXCJzdGF0dXNcIikgcmV0dXJuIGl0ZW1zLm1hcCgoeyBjb250ZW50OiBfY29udGVudCwgLi4uaXRlbSB9KSA9PiBpdGVtKTtcbiAgaWYgKG1ldGhvZCA9PT0gXCJwcmV2aWV3XCIgfHwgKG1ldGhvZCA9PT0gXCJiYXRjaFwiICYmIGV4cGxpY2l0bHlEcnlSdW4oaW5wdXQpKSkgcmV0dXJuIGl0ZW1zO1xuXG4gIGNvbnN0IHJlc3VsdHMgPSBbXTtcbiAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgY29uc3QgeyBjb250ZW50OiBfY29udGVudCwgLi4uc3VtbWFyeSB9ID0gaXRlbTtcbiAgICBpZiAoaXRlbS5leGlzdHMgJiYgaW5wdXQub3ZlcndyaXRlICE9PSB0cnVlKSB7XG4gICAgICByZXN1bHRzLnB1c2goeyAuLi5zdW1tYXJ5LCBzdGF0dXM6IFwic2tpcHBlZFwiIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGF3YWl0IFNvbmFtdS5zeW5jZXIuZ2VuZXJhdGVUZW1wbGF0ZShcbiAgICAgIGl0ZW0udGVtcGxhdGUsXG4gICAgICB7IGVudGl0eUlkOiBpdGVtLmVudGl0eUlkIH0sXG4gICAgICB7IG92ZXJ3cml0ZTogaW5wdXQub3ZlcndyaXRlID09PSB0cnVlIH0sXG4gICAgKTtcbiAgICByZXN1bHRzLnB1c2goeyAuLi5zdW1tYXJ5LCBzdGF0dXM6IFwid3JpdHRlblwiIH0pO1xuICB9XG4gIHJldHVybiB7IGl0ZW1zOiByZXN1bHRzIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1pZ3JhdGlvbk9wZXJhdGlvbihtZXRob2Q6IHN0cmluZywgaW5wdXQ6IENvbW1hbmRJbnB1dCk6IFByb21pc2U8VG9vbGluZ1Jlc3VsdD4ge1xuICBsZXQgc2hhZG93VGFyZ2V0OiBFeHRyYWN0PE1pZ3JhdGlvblRhcmdldCwgXCJmaXh0dXJlXCIgfCBcInRlc3RcIj4gfCB1bmRlZmluZWQ7XG4gIGlmIChtZXRob2QgPT09IFwic2hhZG93XCIpIHtcbiAgICBjb25zdCByZXF1ZXN0ZWRUYXJnZXQgPSByZXF1aXJlZFRleHQoaW5wdXQsIFwidGFyZ2V0XCIpO1xuICAgIGFzc2VydE1pZ3JhdGlvblRhcmdldChyZXF1ZXN0ZWRUYXJnZXQpO1xuICAgIGFzc2VydFNoYWRvd01pZ3JhdGlvblRhcmdldChyZXF1ZXN0ZWRUYXJnZXQpO1xuICAgIHNoYWRvd1RhcmdldCA9IHJlcXVlc3RlZFRhcmdldDtcbiAgfVxuXG4gIGF3YWl0IGVuc3VyZVNvbmFtdSgpO1xuICBjb25zdCB7IE1pZ3JhdG9yIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9taWdyYXRpb24vbWlncmF0b3JcIik7XG4gIGNvbnN0IG1pZ3JhdG9yID0gbmV3IE1pZ3JhdG9yKCk7XG4gIGlmIChtZXRob2QgPT09IFwic3RhdHVzXCIpIHJldHVybiBtaWdyYXRvci5nZXRTdGF0dXMoKTtcbiAgaWYgKG1ldGhvZCA9PT0gXCJnZW5lcmF0ZVwiKSB7XG4gICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgbWlncmF0b3IuZ2V0U3RhdHVzKCk7XG4gICAgaWYgKCFzdGF0dXMuY29ubnMuc29tZSgoY29ubmVjdGlvbikgPT4gY29ubmVjdGlvbi5zdGF0dXMgPT09IDApKSB7XG4gICAgICB0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihcIlBlbmRpbmcgbWlncmF0aW9ucyBtdXN0IGJlIGFwcGxpZWQgYmVmb3JlIGdlbmVyYXRpb24uXCIpLCB7XG4gICAgICAgIGNvZGU6IFwiTUlHUkFUSU9OX05PVF9SRUFEWVwiLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB7IGNvdW50OiBhd2FpdCBtaWdyYXRvci5nZW5lcmF0ZVByZXBhcmVkQ29kZXMoKSB9O1xuICB9XG4gIGlmIChtZXRob2QgPT09IFwicnVuXCIpIHtcbiAgICBpZiAoIW11dGF0aW9uUmVxdWVzdGVkKGlucHV0KSkgcmV0dXJuIHsgZHJ5UnVuOiB0cnVlIH07XG4gICAgY29uc3QgeyBnZXRTb25hbXVFbnZpcm9ubWVudCB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZW52XCIpO1xuICAgIGNvbnN0IGVudmlyb25tZW50ID0gZ2V0U29uYW11RW52aXJvbm1lbnQoKTtcbiAgICByZXR1cm4gbWlncmF0b3IuYXBwbHkoZW52aXJvbm1lbnQgPT09IFwidGVzdFwiID8gW1widGVzdFwiLCBcImZpeHR1cmVcIl0gOiBbZW52aXJvbm1lbnRdKTtcbiAgfVxuICBpZiAobWV0aG9kID09PSBcImNvbm5lY3Rpb25zXCIpIHJldHVybiBtaWdyYXRvci5nZXRDb25uZWN0aW9ucygpO1xuICBpZiAobWV0aG9kID09PSBcImFwcGx5XCIpIHtcbiAgICBjb25zdCByYXdUYXJnZXRzID0gc3RyaW5ncyhpbnB1dCwgXCJ0YXJnZXRzXCIpO1xuICAgIGlmIChyYXdUYXJnZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoXCJNaXNzaW5nIHRhcmdldHMuXCIpLCB7IGNvZGU6IFwiTUlTU0lOR19BUkdVTUVOVFwiLCBleGl0Q29kZTogMiB9KTtcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0cyA9IHJhd1RhcmdldHMubWFwKCh0YXJnZXQpID0+IHtcbiAgICAgIGFzc2VydE1pZ3JhdGlvblRhcmdldCh0YXJnZXQpO1xuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9KTtcbiAgICBpZiAobXV0YXRpb25SZXF1ZXN0ZWQoaW5wdXQpKSByZXR1cm4gbWlncmF0b3IuYXBwbHkodGFyZ2V0cyk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgdGFyZ2V0cy5tYXAoYXN5bmMgKHRhcmdldCkgPT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCBtaWdyYXRvci5nZXRDb25uZWN0aW9uU3RhdHVzKHRhcmdldCk7XG4gICAgICAgIHJldHVybiBtaWdyYXRpb25QbGFuKHRhcmdldCwgc3RhdHVzLnBlbmRpbmcpO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuICBpZiAobWV0aG9kID09PSBcInNoYWRvd1wiKSB7XG4gICAgaWYgKHNoYWRvd1RhcmdldCA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoXCJTaGFkb3cgdGFyZ2V0IHZhbGlkYXRpb24gd2FzIHNraXBwZWQuXCIpO1xuICAgIGlmIChtdXRhdGlvblJlcXVlc3RlZChpbnB1dCkpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1pZ3JhdG9yLnJ1blNoYWRvd1Rlc3QoeyB0YXJnZXQ6IHNoYWRvd1RhcmdldCB9KTtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHJlc3VsdClcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBvazogdHJ1ZSxcbiAgICAgICAgICAgIHRhcmdldDogc2hhZG93VGFyZ2V0LFxuICAgICAgICAgICAgbWlncmF0aW9uczogcmVzdWx0LmZsYXRNYXAoKHsgYXBwbGllZCB9KSA9PiBhcHBsaWVkKSxcbiAgICAgICAgICB9XG4gICAgICAgIDogcmVzdWx0O1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IG1pZ3JhdG9yLmdldENvbm5lY3Rpb25TdGF0dXMoc2hhZG93VGFyZ2V0KTtcbiAgICByZXR1cm4gbWlncmF0aW9uUGxhbihzaGFkb3dUYXJnZXQsIHN0YXR1cy5wZW5kaW5nKTtcbiAgfVxuXG4gIGNvbnN0IHRhcmdldCA9IHJlcXVpcmVkVGV4dChpbnB1dCwgXCJ0YXJnZXRcIik7XG4gIGFzc2VydE1pZ3JhdGlvblRhcmdldCh0YXJnZXQpO1xuICBpZiAobWV0aG9kID09PSBcImNvZGVcIikgcmV0dXJuIG1pZ3JhdG9yLmdldFByZXBhcmVkQ29kZXModGFyZ2V0KTtcblxuICBjb25zdCBhY3Rpb24gPVxuICAgIG1ldGhvZCA9PT0gXCJyb2xsYmFja1wiIHx8IHRleHQoaW5wdXQsIFwiYWN0aW9uXCIpID09PSBcInJvbGxiYWNrXCIgPyBcInJvbGxiYWNrXCIgOiBcImFwcGx5XCI7XG4gIGNvbnN0IG1pZ3JhdGlvbnMgPVxuICAgIGFjdGlvbiA9PT0gXCJhcHBseVwiXG4gICAgICA/IChhd2FpdCBtaWdyYXRvci5nZXRDb25uZWN0aW9uU3RhdHVzKHRhcmdldCkpLnBlbmRpbmdcbiAgICAgIDogKGF3YWl0IG1pZ3JhdG9yLmdldExhdGVzdEFwcGxpZWRCYXRjaCh0YXJnZXQpKS5maWxlcztcbiAgY29uc3QgcGxhbiA9IGF3YWl0IG1pZ3JhdGlvblBsYW4odGFyZ2V0LCBtaWdyYXRpb25zLCBhY3Rpb24pO1xuICBpZiAobWV0aG9kICE9PSBcInJvbGxiYWNrXCIgfHwgIW11dGF0aW9uUmVxdWVzdGVkKGlucHV0KSkgcmV0dXJuIHBsYW47XG4gIHJldHVybiBtaWdyYXRvci5yb2xsYmFjayhbdGFyZ2V0XSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpeHR1cmVPcGVyYXRpb24obWV0aG9kOiBzdHJpbmcsIGlucHV0OiBDb21tYW5kSW5wdXQpOiBQcm9taXNlPFRvb2xpbmdSZXN1bHQ+IHtcbiAgYXdhaXQgZW5zdXJlU29uYW11KCk7XG4gIGNvbnN0IFtmaXh0dXJlQ29tbWFuZHMsIHsgRml4dHVyZU1hbmFnZXIgfSwgZml4dHVyZVNlcnZpY2UsIHsgU29uYW11IH1dID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGltcG9ydChcIi4uL2Jpbi9maXh0dXJlXCIpLFxuICAgIGltcG9ydChcIi4uL3Rlc3RpbmcvZml4dHVyZS1tYW5hZ2VyXCIpLFxuICAgIGltcG9ydChcIi4vZml4dHVyZS1zZXJ2aWNlXCIpLFxuICAgIGltcG9ydChcIi4uL2FwaS9zb25hbXVcIiksXG4gIF0pO1xuICBpZiAobWV0aG9kID09PSBcImluaXRcIikge1xuICAgIHJldHVybiBtdXRhdGlvblJlcXVlc3RlZChpbnB1dCkgPyBmaXh0dXJlQ29tbWFuZHMuZml4dHVyZUluaXRDb21tYW5kKCkgOiB7IGRyeVJ1bjogdHJ1ZSB9O1xuICB9XG4gIGlmIChtZXRob2QgPT09IFwiaW1wb3J0XCIpIHtcbiAgICBpZiAoIW11dGF0aW9uUmVxdWVzdGVkKGlucHV0KSkgcmV0dXJuIHsgZHJ5UnVuOiB0cnVlIH07XG4gICAgRml4dHVyZU1hbmFnZXIuaW5pdCgpO1xuICAgIGF3YWl0IEZpeHR1cmVNYW5hZ2VyLmltcG9ydEZpeHR1cmUoXG4gICAgICByZXF1aXJlZFRleHQoaW5wdXQsIFwiZW50aXR5SWRcIiksXG4gICAgICB6LmFycmF5KHoubnVtYmVyKCkpLnBhcnNlKGlucHV0LnJlY29yZElkcyksXG4gICAgKTtcbiAgICBhd2FpdCBGaXh0dXJlTWFuYWdlci5zeW5jKCk7XG4gICAgcmV0dXJuIHsgaW1wb3J0ZWQ6IHRydWUgfTtcbiAgfVxuICBpZiAobWV0aG9kID09PSBcInN5bmNcIikge1xuICAgIGlmICghbXV0YXRpb25SZXF1ZXN0ZWQoaW5wdXQpKSByZXR1cm4geyBkcnlSdW46IHRydWUgfTtcbiAgICBGaXh0dXJlTWFuYWdlci5pbml0KCk7XG4gICAgYXdhaXQgRml4dHVyZU1hbmFnZXIuc3luYygpO1xuICAgIHJldHVybiB7IHN5bmNlZDogdHJ1ZSB9O1xuICB9XG4gIGNvbnN0IGxlZ2FjeUNvbW1hbmQgPSB6LmVudW0oW1wiZ2VuXCIsIFwiZmV0Y2hcIiwgXCJleHBsb3JlXCJdKS5wYXJzZShtZXRob2QpO1xuICBjb25zdCBpc1RyYW5zZmVyID0gW1wiZW50aXR5SWRcIiwgXCJzb3VyY2VcIiwgXCJ0YXJnZXRcIiwgXCJmaWVsZFwiLCBcInZhbHVlc1wiLCBcInJlbGF0aW9uc1wiLCBcImRlcHRoXCJdLnNvbWUoXG4gICAgKGtleSkgPT4gaW5wdXRba2V5XSAhPT0gdW5kZWZpbmVkLFxuICApO1xuICBpZiAoIWlzVHJhbnNmZXIpIHtcbiAgICBjb25zdCBvcHRpb25zID0gZml4dHVyZVNlcnZpY2Uubm9ybWFsaXplTGVnYWN5Rml4dHVyZUNvbW1hbmRPcHRpb25zKGxlZ2FjeUNvbW1hbmQsIGlucHV0KTtcbiAgICBjb25zdCBzdHJhdGVneSA9IHpcbiAgICAgIC5lbnVtKFtcInNhbXBsZVwiLCBcImlkc1wiLCBcInF1ZXJ5XCIsIFwiZmlsZVwiLCBcInJlY2VudFwiLCBcInJhbmRvbVwiXSlcbiAgICAgIC5vcHRpb25hbCgpXG4gICAgICAucGFyc2Uob3B0aW9ucy5zdHJhdGVneSk7XG4gICAgY29uc3QgZml4dHVyZU9wdGlvbnMgPSB7IC4uLm9wdGlvbnMsIHN0cmF0ZWd5IH0gc2F0aXNmaWVzIEZpeHR1cmVDb21tYW5kT3B0aW9ucztcbiAgICBpZiAobGVnYWN5Q29tbWFuZCAhPT0gXCJleHBsb3JlXCIgJiYgIW11dGF0aW9uUmVxdWVzdGVkKGlucHV0KSkge1xuICAgICAgcmV0dXJuIHsgZHJ5UnVuOiB0cnVlLCByZXF1ZXN0OiBmaXh0dXJlT3B0aW9ucyB9O1xuICAgIH1cbiAgICBpZiAobGVnYWN5Q29tbWFuZCA9PT0gXCJnZW5cIikgcmV0dXJuIGZpeHR1cmVDb21tYW5kcy5maXh0dXJlR2VuQ29tbWFuZChmaXh0dXJlT3B0aW9ucyk7XG4gICAgaWYgKGxlZ2FjeUNvbW1hbmQgPT09IFwiZXhwbG9yZVwiKSByZXR1cm4gZml4dHVyZUNvbW1hbmRzLmZpeHR1cmVFeHBsb3JlQ29tbWFuZChmaXh0dXJlT3B0aW9ucyk7XG4gICAgcmV0dXJuIGZpeHR1cmVDb21tYW5kcy5maXh0dXJlRmV0Y2hDb21tYW5kKGZpeHR1cmVPcHRpb25zKTtcbiAgfVxuXG4gIGNvbnN0IGVudGl0eUlkID0gcmVxdWlyZWRUZXh0KGlucHV0LCBcImVudGl0eUlkXCIpO1xuICBjb25zdCBzb3VyY2UgPSByZXF1aXJlZFRleHQoaW5wdXQsIFwic291cmNlXCIpO1xuICBjb25zdCB0YXJnZXQgPSByZXF1aXJlZFRleHQoaW5wdXQsIFwidGFyZ2V0XCIpO1xuICBjb25zdCBmaWVsZCA9IHJlcXVpcmVkVGV4dChpbnB1dCwgXCJmaWVsZFwiKTtcbiAgY29uc3QgdmFsdWVzID0gc3RyaW5ncyhpbnB1dCwgXCJ2YWx1ZXNcIik7XG4gIGNvbnN0IHJlbGF0aW9ucyA9IHJlcXVpcmVkVGV4dChpbnB1dCwgXCJyZWxhdGlvbnNcIik7XG4gIC8vIENMSSDrrLjrspXsnbQgaW50ZWdlcih7IG1pbjogMCB9KeydtOuvgOuhnCDqtIDqs4Qg7Iic7ZqM66W8IOuBhOuKlCBkZXB0aCAw7J2EIO2XiOyaqe2VqeuLiOuLpC5cbiAgY29uc3QgZGVwdGggPSB6Lm51bWJlcigpLmludCgpLm5vbm5lZ2F0aXZlKCkuc2FmZVBhcnNlKGlucHV0LmRlcHRoKTtcbiAgaWYgKFxuICAgICFPYmplY3QuaGFzT3duKFNvbmFtdS5kYkNvbmZpZywgc291cmNlKSB8fFxuICAgICFPYmplY3QuaGFzT3duKFNvbmFtdS5kYkNvbmZpZywgdGFyZ2V0KSB8fFxuICAgIHZhbHVlcy5sZW5ndGggPT09IDAgfHxcbiAgICAhW1wiaW5jbHVkZVwiLCBcImV4Y2x1ZGVcIiwgXCJub25lXCJdLmluY2x1ZGVzKHJlbGF0aW9ucykgfHxcbiAgICAhZGVwdGguc3VjY2Vzc1xuICApIHtcbiAgICB0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihcIkludmFsaWQgZml4dHVyZSB0cmFuc2ZlciBzZWxlY3Rvci5cIiksIHtcbiAgICAgIGNvZGU6IFwiSU5WQUxJRF9GSVhUVVJFX1RSQU5TRkVSXCIsXG4gICAgICBleGl0Q29kZTogMixcbiAgICB9KTtcbiAgfVxuICAvLyBTQUZFVFk6IE9iamVjdC5oYXNPd24gY2hlY2tzIGFib3ZlIGVzdGFibGlzaCBib3RoIGtleXMgYXMgY29uZmlndXJlZCBEQiBwcmVzZXRzLlxuICBjb25zdCBzb3VyY2VLZXkgPSBzb3VyY2UgYXMga2V5b2YgdHlwZW9mIFNvbmFtdS5kYkNvbmZpZztcbiAgLy8gU0FGRVRZOiBPYmplY3QuaGFzT3duIGNoZWNrcyBhYm92ZSBlc3RhYmxpc2ggYm90aCBrZXlzIGFzIGNvbmZpZ3VyZWQgREIgcHJlc2V0cy5cbiAgY29uc3QgdGFyZ2V0S2V5ID0gdGFyZ2V0IGFzIGtleW9mIHR5cGVvZiBTb25hbXUuZGJDb25maWc7XG4gIGNvbnN0IHJlY29yZHMgPSAoXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICB2YWx1ZXMubWFwKCh2YWx1ZSkgPT5cbiAgICAgICAgRml4dHVyZU1hbmFnZXIuZ2V0Rml4dHVyZXMoXG4gICAgICAgICAgc291cmNlS2V5LFxuICAgICAgICAgIHRhcmdldEtleSxcbiAgICAgICAgICB7IGVudGl0eUlkLCBmaWVsZCwgdmFsdWUsIHNlYXJjaFR5cGU6IFwiZXF1YWxzXCIgfSxcbiAgICAgICAgICB7IGluY2x1ZGVSZWxhdGlvbnM6IHJlbGF0aW9ucyA9PT0gXCJpbmNsdWRlXCIsIG1heERlcHRoOiBkZXB0aC5kYXRhIH0sXG4gICAgICAgICksXG4gICAgICApLFxuICAgIClcbiAgKS5mbGF0KCk7XG4gIGlmIChleHBsaWNpdGx5RHJ5UnVuKGlucHV0KSkgcmV0dXJuIHsgZHJ5UnVuOiB0cnVlLCByZWNvcmRzIH07XG4gIGlmIChyZWNvcmRzLmxlbmd0aCA+IDApIGF3YWl0IEZpeHR1cmVNYW5hZ2VyLmluc2VydEZpeHR1cmVzKHRhcmdldEtleSwgcmVjb3Jkcyk7XG4gIHJldHVybiB7IHJlY29yZHMgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYnVpbGRPcGVyYXRpb24obWV0aG9kOiBzdHJpbmcpOiBQcm9taXNlPFRvb2xpbmdSZXN1bHQ+IHtcbiAgY29uc3QgeyBidWlsZEFwaUNvbW1hbmQsIGJ1aWxkV2ViQ29tbWFuZCB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vYmluL2J1aWxkLWNvbmZpZ1wiKTtcbiAgaWYgKG1ldGhvZCA9PT0gXCJhcGlcIikgcmV0dXJuIGJ1aWxkQXBpQ29tbWFuZCgpO1xuICBpZiAobWV0aG9kID09PSBcIndlYlwiKSByZXR1cm4gYnVpbGRXZWJDb21tYW5kKCk7XG4gIGF3YWl0IGJ1aWxkQXBpQ29tbWFuZCgpO1xuICByZXR1cm4gYnVpbGRXZWJDb21tYW5kKHsgc2tpcElmTWlzc2luZzogdHJ1ZSB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdGVzdE9wZXJhdGlvbihtZXRob2Q6IHN0cmluZywgaW5wdXQ6IENvbW1hbmRJbnB1dCk6IFByb21pc2U8VG9vbGluZ1Jlc3VsdD4ge1xuICBjb25zdCB7IGNyZWF0ZURlZmF1bHRUZXN0UnVuQ2xpZW50IH0gPSBhd2FpdCBpbXBvcnQoXCIuL3Rlc3QtcnVuLWNsaWVudFwiKTtcbiAgY29uc3QgY2xpZW50ID0gY3JlYXRlRGVmYXVsdFRlc3RSdW5DbGllbnQoKTtcbiAgaWYgKG1ldGhvZCA9PT0gXCJzdGF0dXNcIikgcmV0dXJuIGNsaWVudC5zdGF0dXMoKTtcbiAgY29uc3QgcmVxdWVzdCA9IHtcbiAgICBmaWxlczogei5hcnJheSh6LnN0cmluZygpKS5jYXRjaChbXSkucGFyc2UoaW5wdXQuZmlsZXMpLFxuICAgIHBhdHRlcm46IHouc3RyaW5nKCkub3B0aW9uYWwoKS5wYXJzZShpbnB1dC5wYXR0ZXJuKSxcbiAgICB0cmFjZXM6IGlucHV0LnRyYWNlcyA9PT0gdHJ1ZSxcbiAgfTtcbiAgcmV0dXJuIHsgcmVxdWVzdCwgcmVzdWx0OiBhd2FpdCBjbGllbnQucnVuKHJlcXVlc3QpIH07XG59XG5cbmNvbnN0IGJldHRlckF1dGhQbHVnaW5TY2hlbWEgPSB6LmVudW0oW1xuICBcIjJmYVwiLFxuICBcImFkbWluXCIsXG4gIFwiYW5vbnltb3VzXCIsXG4gIFwiYXBpLWtleVwiLFxuICBcImF1ZGl0LWxvZ1wiLFxuICBcImp3dFwiLFxuICBcIm9yZ2FuaXphdGlvblwiLFxuICBcInBhc3NrZXlcIixcbiAgXCJwaG9uZS1udW1iZXJcIixcbiAgXCJzc29cIixcbiAgXCJ1c2VybmFtZVwiLFxuXSk7XG5cbmFzeW5jIGZ1bmN0aW9uIGF1dGhPcGVyYXRpb24obWV0aG9kOiBzdHJpbmcsIGlucHV0OiBDb21tYW5kSW5wdXQpOiBQcm9taXNlPFRvb2xpbmdSZXN1bHQ+IHtcbiAgY29uc3QgeyBhZGRDb21wYW5pb25zVG9FbnRpdGllcywgZ2VuZXJhdGVCZXR0ZXJBdXRoRW50aXRpZXMgfSA9IGF3YWl0IGltcG9ydChcIi4uL2F1dGhcIik7XG4gIGlmIChtZXRob2QgPT09IFwiYWRkQ29tcGFuaW9uc1wiKSByZXR1cm4gYWRkQ29tcGFuaW9uc1RvRW50aXRpZXMoKTtcbiAgLy8gcGx1Z2luc+uKlCDshKDtg50g7Ji17IWY7J2066+A66GcIOyDneuete2VmOuptCBjb3JlIOyXlO2LsO2LsOunjCDsg53shLHtlanri4jri6QuXG4gIGNvbnN0IHBsdWdpbnMgPSB6LmFycmF5KGJldHRlckF1dGhQbHVnaW5TY2hlbWEpLnBhcnNlKFxuICAgIChvcHRpb25hbFRleHQoaW5wdXQsIFwicGx1Z2luc1wiKSA/PyBcIlwiKVxuICAgICAgLnNwbGl0KFwiLFwiKVxuICAgICAgLm1hcCgocGx1Z2luKSA9PiBwbHVnaW4udHJpbSgpKVxuICAgICAgLmZpbHRlcihCb29sZWFuKSxcbiAgKTtcbiAgcmV0dXJuIGdlbmVyYXRlQmV0dGVyQXV0aEVudGl0aWVzKHsgcGx1Z2lucyB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaTE4bk9wZXJhdGlvbihtZXRob2Q6IHN0cmluZywgaW5wdXQ6IENvbW1hbmRJbnB1dCk6IFByb21pc2U8VG9vbGluZ1Jlc3VsdD4ge1xuICBhd2FpdCBlbnN1cmVTb25hbXUoKTtcbiAgY29uc3QgeyBzb25hbXVEaWN0aW9uYXJ5IH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9kaWN0L3NvbmFtdS1kaWN0aW9uYXJ5XCIpO1xuICBpZiAobWV0aG9kID09PSBcImxpc3RcIikge1xuICAgIGNvbnN0IGRpY3Rpb25hcnkgPSBhd2FpdCBzb25hbXVEaWN0aW9uYXJ5LmdldERpY3Rpb25hcnkoKTtcbiAgICBjb25zdCBsb2NhbGUgPSB0ZXh0KGlucHV0LCBcImxvY2FsZVwiKTtcbiAgICByZXR1cm4gbG9jYWxlID09PSB1bmRlZmluZWRcbiAgICAgID8gZGljdGlvbmFyeVxuICAgICAgOiB7XG4gICAgICAgICAgLi4uZGljdGlvbmFyeSxcbiAgICAgICAgICBsb2NhbGVzOiBbbG9jYWxlXSxcbiAgICAgICAgICByb3dzOiBkaWN0aW9uYXJ5LnJvd3MubWFwKChyb3cpID0+ICh7XG4gICAgICAgICAgICBrZXk6IHJvdy5rZXksXG4gICAgICAgICAgICBzb3VyY2U6IHJvdy5zb3VyY2UsXG4gICAgICAgICAgICBbbG9jYWxlXTogcm93W2xvY2FsZV0sXG4gICAgICAgICAgfSkpLFxuICAgICAgICB9O1xuICB9XG4gIGlmIChtZXRob2QgPT09IFwiY2hlY2tcIikge1xuICAgIGNvbnN0IGRpY3Rpb25hcnkgPSBhd2FpdCBzb25hbXVEaWN0aW9uYXJ5LmdldERpY3Rpb25hcnkoKTtcbiAgICByZXR1cm4gc29uYW11RGljdGlvbmFyeS5jaGVja1VzYWdlKGRpY3Rpb25hcnkucm93cy5tYXAoKHJvdykgPT4gcm93LmtleSkpO1xuICB9XG4gIGlmIChtZXRob2QgPT09IFwiZXhwb3J0XCIgfHwgbWV0aG9kID09PSBcImltcG9ydFwiKSB7XG4gICAgY29uc3QgZmlsZSA9IHJlcXVpcmVkVGV4dChpbnB1dCwgXCJmaWxlXCIpO1xuICAgIGlmIChleHBsaWNpdGx5RHJ5UnVuKGlucHV0KSkgcmV0dXJuIHsgb3BlcmF0aW9uOiBtZXRob2QsIGRyeVJ1bjogdHJ1ZSB9O1xuICAgIGNvbnN0IHsgcmVhZEZpbGUsIHdyaXRlRmlsZSB9ID0gYXdhaXQgaW1wb3J0KFwibm9kZTpmcy9wcm9taXNlc1wiKTtcbiAgICBjb25zdCBmb3JtYXQgPSB0ZXh0KGlucHV0LCBcImZvcm1hdFwiKSA9PT0gXCJqc29uXCIgPyBcImpzb25cIiA6IFwid29ya2Jvb2tcIjtcbiAgICBpZiAobWV0aG9kID09PSBcImV4cG9ydFwiICYmIGZvcm1hdCA9PT0gXCJ3b3JrYm9va1wiKSB7XG4gICAgICBjb25zdCB7IGJ1ZmZlciB9ID0gYXdhaXQgc29uYW11RGljdGlvbmFyeS5leHBvcnRUb0V4Y2VsKCk7XG4gICAgICBhd2FpdCB3cml0ZUZpbGUoZmlsZSwgYnVmZmVyKTtcbiAgICAgIHJldHVybiB7IGV4cG9ydGVkOiAxIH07XG4gICAgfVxuICAgIGlmIChtZXRob2QgPT09IFwiaW1wb3J0XCIgJiYgZm9ybWF0ID09PSBcIndvcmtib29rXCIpIHtcbiAgICAgIHJldHVybiBzb25hbXVEaWN0aW9uYXJ5LmltcG9ydEZyb21FeGNlbChhd2FpdCByZWFkRmlsZShmaWxlKSk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJleHBvcnRcIikge1xuICAgICAgY29uc3QgZGljdGlvbmFyeSA9IGF3YWl0IHNvbmFtdURpY3Rpb25hcnkuZ2V0RGljdGlvbmFyeSgpO1xuICAgICAgY29uc3QgbG9jYWxlID0gdGV4dChpbnB1dCwgXCJsb2NhbGVcIik7XG4gICAgICBjb25zdCByb3dzID0gZGljdGlvbmFyeS5yb3dzLm1hcChcbiAgICAgICAgKHsga2V5LCBzb3VyY2U6IF9zb3VyY2UsIGlzRnVuY3Rpb246IF9pc0Z1bmN0aW9uLCAuLi52YWx1ZXMgfSkgPT4gKHtcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgdmFsdWVzOlxuICAgICAgICAgICAgbG9jYWxlID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgPyB2YWx1ZXNcbiAgICAgICAgICAgICAgOiB7IFtsb2NhbGVdOiB6LnN0cmluZygpLmNhdGNoKFwiXCIpLnBhcnNlKHZhbHVlc1tsb2NhbGVdKSB9LFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgICBhd2FpdCB3cml0ZUZpbGUoZmlsZSwgSlNPTi5zdHJpbmdpZnkocm93cywgbnVsbCwgMikpO1xuICAgICAgcmV0dXJuIHsgZXhwb3J0ZWQ6IHJvd3MubGVuZ3RoIH07XG4gICAgfVxuXG4gICAgY29uc3QgZW50cmllcyA9IHBhcnNlSnNvbihcbiAgICAgIChhd2FpdCByZWFkRmlsZShmaWxlKSkudG9TdHJpbmcoXCJ1dGY4XCIpLFxuICAgICAgXCJJMThOX0lOVkFMSURfSlNPTlwiLFxuICAgICAgaTE4bkVudHJpZXNTY2hlbWEsXG4gICAgKTtcbiAgICBjb25zdCBjdXJyZW50ID0gYXdhaXQgc29uYW11RGljdGlvbmFyeS5nZXREaWN0aW9uYXJ5KCk7XG4gICAgY29uc3QgZXhpc3RpbmdLZXlzID0gbmV3IFNldChjdXJyZW50LnJvd3MubWFwKCh7IGtleSB9KSA9PiBrZXkpKTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGlmIChleGlzdGluZ0tleXMuaGFzKGVudHJ5LmtleSkpIHtcbiAgICAgICAgYXdhaXQgc29uYW11RGljdGlvbmFyeS51cGRhdGVFbnRyeSh7XG4gICAgICAgICAgb2xkS2V5OiBlbnRyeS5rZXksXG4gICAgICAgICAgbmV3S2V5OiBlbnRyeS5rZXksXG4gICAgICAgICAgc291cmNlOiBcInByb2plY3RcIixcbiAgICAgICAgICB2YWx1ZXM6IGVudHJ5LnZhbHVlcyxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBzb25hbXVEaWN0aW9uYXJ5LmNyZWF0ZUVudHJ5KGVudHJ5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgaW1wb3J0ZWQ6IGVudHJpZXMubGVuZ3RoIH07XG4gIH1cbiAgY29uc3Qga2V5ID0gcmVxdWlyZWRUZXh0KGlucHV0LCBcImtleVwiKTtcbiAgaWYgKG1ldGhvZCA9PT0gXCJjcmVhdGVcIikge1xuICAgIGlmIChleHBsaWNpdGx5RHJ5UnVuKGlucHV0KSkgcmV0dXJuIHsgb3BlcmF0aW9uOiBcImNyZWF0ZVwiLCBpbnB1dCwgZHJ5UnVuOiB0cnVlIH07XG4gICAgcmV0dXJuIHNvbmFtdURpY3Rpb25hcnkuY3JlYXRlRW50cnkoe1xuICAgICAga2V5LFxuICAgICAgdmFsdWVzOiBkaWN0aW9uYXJ5VmFsdWVzU2NoZW1hLnBhcnNlKGlucHV0LnZhbHVlcyksXG4gICAgfSk7XG4gIH1cbiAgaWYgKG1ldGhvZCA9PT0gXCJ1cGRhdGVcIikge1xuICAgIGlmIChleHBsaWNpdGx5RHJ5UnVuKGlucHV0KSkgcmV0dXJuIHsgb3BlcmF0aW9uOiBcInVwZGF0ZVwiLCBpbnB1dCwgZHJ5UnVuOiB0cnVlIH07XG4gICAgY29uc3QgZXhwbGljaXRTb3VyY2UgPSB0ZXh0KGlucHV0LCBcInNvdXJjZVwiKTtcbiAgICAvLyBzb3VyY2Xrpbwg7IOd65617ZWY66m0IOyCrOyghOyXkCDrk7HroZ3rkJwg6riw7KG0IHNvdXJjZeulvCDsnKDsp4DtlbQgZW50aXR5IO2VreuqqeydtCBwcm9qZWN0IG92ZXJyaWRl66GcIOuNruydtOyngCDslYrqsowg7ZWp64uI64ukLlxuICAgIGNvbnN0IHJlc29sdmVkU291cmNlID1cbiAgICAgIGV4cGxpY2l0U291cmNlID09PSB1bmRlZmluZWRcbiAgICAgICAgPyAoKGF3YWl0IHNvbmFtdURpY3Rpb25hcnkuZ2V0RGljdGlvbmFyeSgpKS5yb3dzLmZpbmQoKHJvdykgPT4gcm93LmtleSA9PT0ga2V5KT8uc291cmNlID8/XG4gICAgICAgICAgXCJwcm9qZWN0XCIpXG4gICAgICAgIDogZXhwbGljaXRTb3VyY2U7XG4gICAgcmV0dXJuIHNvbmFtdURpY3Rpb25hcnkudXBkYXRlRW50cnkoe1xuICAgICAgb2xkS2V5OiBrZXksXG4gICAgICBuZXdLZXk6IHRleHQoaW5wdXQsIFwibmV3S2V5XCIpID8/IGtleSxcbiAgICAgIHNvdXJjZTogZGljdGlvbmFyeVNvdXJjZVNjaGVtYS5wYXJzZShyZXNvbHZlZFNvdXJjZSksXG4gICAgICB2YWx1ZXM6IGRpY3Rpb25hcnlWYWx1ZXNTY2hlbWEucGFyc2UoaW5wdXQudmFsdWVzKSxcbiAgICB9KTtcbiAgfVxuICBpZiAoIW11dGF0aW9uUmVxdWVzdGVkKGlucHV0KSkgcmV0dXJuIHsga2V5LCBvcGVyYXRpb246IFwicmVtb3ZlXCIsIGRyeVJ1bjogdHJ1ZSB9O1xuICByZXR1cm4gc29uYW11RGljdGlvbmFyeS5kZWxldGVFbnRyeShrZXkpO1xufVxuXG5hc3luYyBmdW5jdGlvbiB0YXNrT3BlcmF0aW9uKG1ldGhvZDogc3RyaW5nLCBpbnB1dDogQ29tbWFuZElucHV0KTogUHJvbWlzZTxUb29saW5nUmVzdWx0PiB7XG4gIGF3YWl0IGVuc3VyZVNvbmFtdSgpO1xuICBjb25zdCB7IFNvbmFtdSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vYXBpL3NvbmFtdVwiKTtcbiAgY29uc3Qgd29ya2Zsb3dzID0gU29uYW11LndvcmtmbG93cztcbiAgY29uc3QgYmFja2VuZCA9IHdvcmtmbG93cy5iYWNrZW5kO1xuICBpZiAobWV0aG9kID09PSBcImRlZmluaXRpb25zXCIpIHJldHVybiB7IGRlZmluaXRpb25zOiB3b3JrZmxvd3Mud29ya2Zsb3dEZWZpbml0aW9ucyB9O1xuICBpZiAobWV0aG9kID09PSBcInJ1bnNcIikgcmV0dXJuIGJhY2tlbmQubGlzdFdvcmtmbG93UnVucyh7IGxpbWl0OiA1MCB9KTtcbiAgY29uc3Qgd29ya2Zsb3dSdW5JZCA9IHJlcXVpcmVkVGV4dChpbnB1dCwgXCJydW5JZFwiKTtcbiAgaWYgKG1ldGhvZCA9PT0gXCJzaG93XCIpIHJldHVybiBiYWNrZW5kLmdldFdvcmtmbG93UnVuKHsgd29ya2Zsb3dSdW5JZCB9KTtcbiAgaWYgKG1ldGhvZCA9PT0gXCJ3YXRjaFwiKSB7XG4gICAgY29uc3QgeyBpc0RlZXBTdHJpY3RFcXVhbCB9ID0gYXdhaXQgaW1wb3J0KFwibm9kZTp1dGlsXCIpO1xuICAgIHJldHVybiAoYXN5bmMgZnVuY3Rpb24qIHdhdGNoKCkge1xuICAgICAgbGV0IHByZXZpb3VzOiBvYmplY3QgfCB1bmRlZmluZWQ7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IGJhY2tlbmQuZ2V0V29ya2Zsb3dSdW4oeyB3b3JrZmxvd1J1bklkIH0pO1xuICAgICAgICBpZiAoc25hcHNob3QgPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihgV29ya2Zsb3cgcnVuIG5vdCBmb3VuZDogJHt3b3JrZmxvd1J1bklkfWApLCB7XG4gICAgICAgICAgICBjb2RlOiBcIlRBU0tfUlVOX05PVF9GT1VORFwiLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJhd1N0YXRlID0gc25hcHNob3Quc3RhdHVzID09PSBcInN1Y2NlZWRlZFwiID8gXCJjb21wbGV0ZWRcIiA6IHNuYXBzaG90LnN0YXR1cztcbiAgICAgICAgY29uc3Qgc3RhdGUgPSByYXdTdGF0ZSA9PT0gXCJjYW5jZWxlZFwiID8gXCJjYW5jZWxsZWRcIiA6IHJhd1N0YXRlO1xuICAgICAgICBjb25zdCBjdXJyZW50ID0geyAuLi5zbmFwc2hvdCwgc3RhdGUgfTtcbiAgICAgICAgaWYgKCFpc0RlZXBTdHJpY3RFcXVhbChjdXJyZW50LCBwcmV2aW91cykpIHtcbiAgICAgICAgICBwcmV2aW91cyA9IHN0cnVjdHVyZWRDbG9uZShjdXJyZW50KTtcbiAgICAgICAgICB5aWVsZCBjdXJyZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmIChbXCJjb21wbGV0ZWRcIiwgXCJmYWlsZWRcIiwgXCJjYW5jZWxsZWRcIl0uaW5jbHVkZXMoc3RhdGUpKSByZXR1cm47XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDFfMDAwKSk7XG4gICAgICB9XG4gICAgfSkoKTtcbiAgfVxuICBpZiAobWV0aG9kID09PSBcInN0ZXBzXCIpIHJldHVybiBiYWNrZW5kLmxpc3RTdGVwQXR0ZW1wdHMoeyB3b3JrZmxvd1J1bklkLCBsaW1pdDogMTAwIH0pO1xuICBpZiAoIW11dGF0aW9uUmVxdWVzdGVkKGlucHV0KSkgcmV0dXJuIHsgb3BlcmF0aW9uOiBtZXRob2QsIHdvcmtmbG93UnVuSWQsIGRyeVJ1bjogdHJ1ZSB9O1xuICBpZiAobWV0aG9kID09PSBcInBhdXNlXCIpIHJldHVybiBiYWNrZW5kLnBhdXNlV29ya2Zsb3dSdW4oeyB3b3JrZmxvd1J1bklkIH0pO1xuICBpZiAobWV0aG9kID09PSBcInJlc3VtZVwiKSByZXR1cm4gYmFja2VuZC5yZXN1bWVXb3JrZmxvd1J1bih7IHdvcmtmbG93UnVuSWQgfSk7XG4gIHJldHVybiBiYWNrZW5kLmNhbmNlbFdvcmtmbG93UnVuKHsgd29ya2Zsb3dSdW5JZCB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2RkUm9vdFBhdGgoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgW3sgU29uYW11IH0sIHBhdGhdID0gYXdhaXQgUHJvbWlzZS5hbGwoW2ltcG9ydChcIi4uL2FwaS9zb25hbXVcIiksIGltcG9ydChcIm5vZGU6cGF0aFwiKV0pO1xuICByZXR1cm4gcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgXCJjb250cmFjdFwiKTtcbn1cblxuY29uc3QgcHJhY3RpY2VTZXF1ZW5jZVBhdHRlcm4gPSAvXnAoWzAtOV0rKS0vO1xuXG4vLyDsnbTrpoTsnYAg7YyM7J2866qF6rO8IOyKpO2FgSDrs7jrrLjsnZgg66y47J6Q7Je0IOumrO2EsOuftOyXkCDqt7jrjIDroZwg65Ok7Ja06rCA66+A66GcLFxuLy8g6rK966GcIOq1rOu2hOyekC/sg4HsnIQg6rK966GcIOywuOyhsC/rlLDsmLTtkZwv7Jet7Iqs656Y7Iuc66W8IOybkOyynCDssKjri6jtlZjripQg66y47J6Q66eMIO2XiOyaqe2VqeuLiOuLpC5cbmNvbnN0IHByYWN0aWNlTmFtZVBhdHRlcm4gPSAvXltBLVphLXowLTldW0EtWmEtejAtOS5fLV0qJC87XG5cbmZ1bmN0aW9uIGludmFsaWRQcmFjdGljZU5hbWUobmFtZTogc3RyaW5nKTogRXJyb3Ige1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihcbiAgICBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBwcmFjdGljZSBuYW1lOiAke25hbWV9LiBVc2UgbGV0dGVycywgZGlnaXRzLCBcIi5cIiwgXCItXCIsIGFuZCBcIl9cIiBvbmx5LCBzdGFydGluZyB3aXRoIGEgbGV0dGVyIG9yIGRpZ2l0LmAsXG4gICAgKSxcbiAgICB7IGNvZGU6IFwiSU5WQUxJRF9QUkFDVElDRV9OQU1FXCIsIGV4aXRDb2RlOiAyIH0sXG4gICk7XG59XG5cbmZ1bmN0aW9uIGludmFsaWRQcmFjdGljZURpcmVjdG9yeShkaXJlY3Rvcnk6IHN0cmluZyk6IEVycm9yIHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IEVycm9yKGBQcmFjdGljZSBkaXJlY3RvcnkgZXNjYXBlcyB0aGUgQVBJIHJvb3Q6ICR7ZGlyZWN0b3J5fWApLCB7XG4gICAgY29kZTogXCJJTlZBTElEX1BSQUNUSUNFX1BBVEhcIixcbiAgICBleGl0Q29kZTogMixcbiAgfSk7XG59XG5cbi8qKlxuICogYHNyYy9wcmFjdGljZXNgIOyVhOuemOyXkCDri6TsnYwg7Iuc7YCA7IqkIOuyiO2YuOulvCDqsIDsp4QgcHJhY3RpY2Ug7Iqk7YWBIO2MjOydvOydhCDrp4zrk63ri4jri6QuXG4gKlxuICog6rWsIENMSShgc3R1YiBwcmFjdGljZWAp7J2YIO2MjOydvOuqhSDqt5zsuZnqs7wg7Iqk7YWBIOuzuOusuOydhCDqt7jrjIDroZwg7Jyg7KeA7ZWp64uI64ukLlxuICovXG5hc3luYyBmdW5jdGlvbiBzdHViUHJhY3RpY2VPcGVyYXRpb24oaW5wdXQ6IENvbW1hbmRJbnB1dCk6IFByb21pc2U8VG9vbGluZ1Jlc3VsdD4ge1xuICBjb25zdCBuYW1lID0gcmVxdWlyZWRUZXh0KGlucHV0LCBcIm5hbWVcIik7XG4gIGlmICghcHJhY3RpY2VOYW1lUGF0dGVybi50ZXN0KG5hbWUpKSB0aHJvdyBpbnZhbGlkUHJhY3RpY2VOYW1lKG5hbWUpO1xuICBhd2FpdCBlbnN1cmVTb25hbXUoKTtcbiAgY29uc3QgW3sgU29uYW11IH0sIHsgY29uc3RhbnRzIH0sIHsgbWtkaXIsIG9wZW4sIHJlYWRkaXIsIHJlYWxwYXRoIH0sIHBhdGhdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGltcG9ydChcIi4uL2FwaS9zb25hbXVcIiksXG4gICAgaW1wb3J0KFwibm9kZTpmc1wiKSxcbiAgICBpbXBvcnQoXCJub2RlOmZzL3Byb21pc2VzXCIpLFxuICAgIGltcG9ydChcIm5vZGU6cGF0aFwiKSxcbiAgXSk7XG4gIGNvbnN0IHByYWN0aWNlRGlyZWN0b3J5ID0gcGF0aC5kZWZhdWx0LmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyY1wiLCBcInByYWN0aWNlc1wiKTtcbiAgYXdhaXQgbWtkaXIocHJhY3RpY2VEaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAvLyBjZGQtc2VydmljZeyZgCDqsJnsnbQg7Iuk7KCcIOqyveuhnOq5jOyngCDtmZXsnbjtlbQsIHN5bWxpbmvroZwg7Jew6rKw65CcIHByYWN0aWNlcyDrlJTroInthLDrpqzqsIBcbiAgLy8gYXBpIHJvb3Qg67CW7J2EIOqwgOumrO2CpOuKlCDqsr3smrDrpbwg7LCo64uo7ZWp64uI64ukLlxuICBjb25zdCBbY2Fub25pY2FsQXBpUm9vdCwgY2Fub25pY2FsRGlyZWN0b3J5XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICByZWFscGF0aChTb25hbXUuYXBpUm9vdFBhdGgpLFxuICAgIHJlYWxwYXRoKHByYWN0aWNlRGlyZWN0b3J5KSxcbiAgXSk7XG4gIGNvbnN0IGRpcmVjdG9yeVJlbGF0aXZlID0gcGF0aC5kZWZhdWx0LnJlbGF0aXZlKGNhbm9uaWNhbEFwaVJvb3QsIGNhbm9uaWNhbERpcmVjdG9yeSk7XG4gIGlmIChkaXJlY3RvcnlSZWxhdGl2ZS5zdGFydHNXaXRoKFwiLi5cIikgfHwgcGF0aC5kZWZhdWx0LmlzQWJzb2x1dGUoZGlyZWN0b3J5UmVsYXRpdmUpKSB7XG4gICAgdGhyb3cgaW52YWxpZFByYWN0aWNlRGlyZWN0b3J5KHByYWN0aWNlRGlyZWN0b3J5KTtcbiAgfVxuICBjb25zdCBmaWxlTmFtZXMgPSBhd2FpdCByZWFkZGlyKHByYWN0aWNlRGlyZWN0b3J5KTtcbiAgY29uc3QgbWF4U2VxdWVuY2UgPSBmaWxlTmFtZXNcbiAgICAuZmlsdGVyKChmaWxlTmFtZSkgPT4gZmlsZU5hbWUuc3RhcnRzV2l0aChcInBcIikgJiYgZmlsZU5hbWUuZW5kc1dpdGgoXCIudHNcIikpXG4gICAgLnJlZHVjZSgobGFyZ2VzdCwgZmlsZU5hbWUpID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoZWQgPSBwcmFjdGljZVNlcXVlbmNlUGF0dGVybi5leGVjKGZpbGVOYW1lKTtcbiAgICAgIHJldHVybiBtYXRjaGVkID09PSBudWxsID8gbGFyZ2VzdCA6IE1hdGgubWF4KGxhcmdlc3QsIE51bWJlci5wYXJzZUludChtYXRjaGVkWzFdLCAxMCkpO1xuICAgIH0sIDApO1xuXG4gIGNvbnN0IGZpbGVOYW1lID0gYHAke21heFNlcXVlbmNlICsgMX0tJHtuYW1lfS50c2A7XG4gIC8vIOydtOumhCDtjKjthLTsnbQg6rK966GcIOq1rOu2hOyekOulvCDssKjri6jtlZjrr4DroZwg7YyM7J2866qF7J2AIO2VreyDgSDsnbQg65SU66CJ7YSw66as7J2YIOyngeqzhCDsnpDsi53snoXri4jri6QuXG4gIC8vIOqyveuhnOuKlCDshKTsoJXrkJwg6rCSIOq3uOuMgOuhnCDrj4zroKTso7zqs6AsIO2DiOy2nCDsl6zrtoDripQg7JyE7J2YIGNhbm9uaWNhbCDqsoDsgqzroZwg7YyQ64uo7ZWp64uI64ukLlxuICBjb25zdCBmaWxlUGF0aCA9IHBhdGguZGVmYXVsdC5yZXNvbHZlKHByYWN0aWNlRGlyZWN0b3J5LCBmaWxlTmFtZSk7XG4gIGNvbnN0IHN0dWJDb2RlID0gW1xuICAgIGBpbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwic29uYW11XCI7YCxcbiAgICBcIlwiLFxuICAgIGBjb25zb2xlLmNsZWFyKCk7YCxcbiAgICBgY29uc29sZS5sb2coXCIke2ZpbGVOYW1lfVwiKTtgLFxuICAgIFwiXCIsXG4gICAgYFNvbmFtdS5ydW5TY3JpcHQoYXN5bmMgKCkgPT4ge2AsXG4gICAgYCAvLyBUT0RPYCxcbiAgICBgfSk7YCxcbiAgICBcIlwiLFxuICBdLmpvaW4oXCJcXG5cIik7XG4gIGxldCBoYW5kbGU7XG4gIHRyeSB7XG4gICAgLy8g6riw7KG0IO2MjOydvOydhCB0cnVuY2F0Ze2VmOyngCDslYrrj4TroZ0g67Cw7YOAIOyDneyEse2VmOqzoCwg7LWc7KKFIOqyveuhnOydmCBzeW1saW5r64qUIOuUsOudvOqwgOyngCDslYrsirXri4jri6QuXG4gICAgaGFuZGxlID0gYXdhaXQgb3BlbihcbiAgICAgIGZpbGVQYXRoLFxuICAgICAgY29uc3RhbnRzLk9fV1JPTkxZIHwgY29uc3RhbnRzLk9fQ1JFQVQgfCBjb25zdGFudHMuT19FWENMIHwgY29uc3RhbnRzLk9fTk9GT0xMT1csXG4gICAgICAwbzY2NixcbiAgICApO1xuICAgIGF3YWl0IGhhbmRsZS53cml0ZUZpbGUoc3R1YkNvZGUsIFwidXRmOFwiKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBTQUZFVFk6IG5vZGU6ZnMgb3BlbiDsi6TtjKjsnZggY29kZeunjCDsnb3slrQg6riw7KG0IO2MjOydvC9zeW1saW5rIOy2qeuPjOydhCDsoJXqt5ztmZTtlanri4jri6QuXG4gICAgY29uc3QgZXJyb3JDb2RlID0gKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZTtcbiAgICBpZiAoZXJyb3JDb2RlID09PSBcIkVFWElTVFwiIHx8IGVycm9yQ29kZSA9PT0gXCJFTE9PUFwiKSB7XG4gICAgICB0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihgUHJhY3RpY2UgZmlsZSBhbHJlYWR5IGV4aXN0czogJHtmaWxlUGF0aH1gKSwge1xuICAgICAgICBjb2RlOiBcIlBSQUNUSUNFX0ZJTEVfRVhJU1RTXCIsXG4gICAgICAgIGV4aXRDb2RlOiAyLFxuICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgaGFuZGxlPy5jbG9zZSgpO1xuICB9XG4gIC8vIOyXkOuUlO2EsCDsl7TquLAv7YG066a967O065OcIOuzteyCrCDqsJnsnYAg64yA7ZmU7ZiVIOu2gOyImO2aqOqzvOuKlCDruYTrjIDtmZTtmJUg7Iuk7ZaJ7J2EIOq5qOucqOumrOuvgOuhnCDtmLjstpzsnpDsl5Dqsowg66eh6rmB64uI64ukLlxuICByZXR1cm4geyBmaWxlTmFtZSwgcGF0aDogZmlsZVBhdGggfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZENkZFRyZWUoZGlyZWN0b3J5OiBzdHJpbmcsIHJvb3Q6IHN0cmluZyk6IFByb21pc2U8b2JqZWN0W10+IHtcbiAgY29uc3QgW3sgcmVhZGRpciB9LCBwYXRoXSA9IGF3YWl0IFByb21pc2UuYWxsKFtpbXBvcnQoXCJub2RlOmZzL3Byb21pc2VzXCIpLCBpbXBvcnQoXCJub2RlOnBhdGhcIildKTtcbiAgY29uc3QgZW50cmllcyA9IGF3YWl0IHJlYWRkaXIoZGlyZWN0b3J5LCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gIGNvbnN0IG5vZGVzID0gW107XG4gIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgIGlmIChlbnRyeS5uYW1lID09PSBcInJ1bGVzXCIpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGguam9pbihkaXJlY3RvcnksIGVudHJ5Lm5hbWUpO1xuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocm9vdCwgYWJzb2x1dGVQYXRoKTtcbiAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBhd2FpdCByZWFkQ2RkVHJlZShhYnNvbHV0ZVBhdGgsIHJvb3QpO1xuICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbm9kZXMucHVzaCh7IG5hbWU6IGVudHJ5Lm5hbWUsIHBhdGg6IHJlbGF0aXZlUGF0aCwgdHlwZTogXCJkaXJlY3RvcnlcIiwgY2hpbGRyZW4gfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChlbnRyeS5pc0ZpbGUoKSAmJiBlbnRyeS5uYW1lLmVuZHNXaXRoKFwiLmNvbnRyYWN0Lm1kXCIpKSB7XG4gICAgICBub2Rlcy5wdXNoKHsgbmFtZTogZW50cnkubmFtZSwgcGF0aDogcmVsYXRpdmVQYXRoLCB0eXBlOiBcImZpbGVcIiwgZmlsZVR5cGU6IFwiY29udHJhY3RcIiB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5vZGVzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjZGRPcGVyYXRpb24obWV0aG9kOiBzdHJpbmcsIGlucHV0OiBDb21tYW5kSW5wdXQpOiBQcm9taXNlPFRvb2xpbmdSZXN1bHQ+IHtcbiAgYXdhaXQgZW5zdXJlU29uYW11KCk7XG4gIGNvbnN0IFt7IGFjY2VzcyB9LCB7IGNyZWF0ZURlZmF1bHRDZGRUb29saW5nQWRhcHRlciB9XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBpbXBvcnQoXCJub2RlOmZzL3Byb21pc2VzXCIpLFxuICAgIGltcG9ydChcIi4vY2RkLXNlcnZpY2VcIiksXG4gIF0pO1xuICBjb25zdCBhZGFwdGVyID0gY3JlYXRlRGVmYXVsdENkZFRvb2xpbmdBZGFwdGVyKHsgY29udHJhY3RSb290OiBhd2FpdCBjZGRSb290UGF0aCgpIH0pO1xuICBpZiAobWV0aG9kID09PSBcInRyZWVcIikge1xuICAgIGNvbnN0IHJvb3QgPSBhd2FpdCBjZGRSb290UGF0aCgpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBhY2Nlc3Mocm9vdCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4geyBleGlzdHM6IGZhbHNlLCB0cmVlOiBbXSB9O1xuICAgIH1cbiAgICByZXR1cm4geyBleGlzdHM6IHRydWUsIHRyZWU6IGF3YWl0IHJlYWRDZGRUcmVlKHJvb3QsIHJvb3QpIH07XG4gIH1cbiAgaWYgKG1ldGhvZCA9PT0gXCJyZWFkXCIpIHtcbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSByZXF1aXJlZFRleHQoaW5wdXQsIFwicGF0aFwiKTtcbiAgICByZXR1cm4gYWRhcHRlci5yZWFkKHsgcGF0aDogcmVsYXRpdmVQYXRoIH0pO1xuICB9XG4gIGlmIChtZXRob2QgPT09IFwicnVsZXNcIikgcmV0dXJuIGFkYXB0ZXIucnVsZXMoKTtcbiAgaWYgKG1ldGhvZCA9PT0gXCJzaG93UnVsZVwiKSB7XG4gICAgY29uc3QgcnVsZUlkID0gcmVxdWlyZWRUZXh0KGlucHV0LCBcInJ1bGVJZFwiKTtcbiAgICByZXR1cm4gYWRhcHRlci5zaG93UnVsZSh7IHJ1bGVJZCB9KTtcbiAgfVxuICBpZiAobWV0aG9kID09PSBcImFkZFJ1bGVcIikge1xuICAgIGNvbnN0IHJ1bGVLZXkgPSByZXF1aXJlZFRleHQoaW5wdXQsIFwicnVsZUtleVwiKTtcbiAgICBjb25zdCBpZCA9IHJlcXVpcmVkVGV4dChpbnB1dCwgXCJpZFwiKTtcbiAgICBjb25zdCB3aGVuID0gcmVxdWlyZWRUZXh0KGlucHV0LCBcIndoZW5cIik7XG4gICAgY29uc3QgcnVsZVRleHQgPSB0ZXh0KGlucHV0LCBcImluc3RydWN0aW9uXCIpID8/IHJlcXVpcmVkVGV4dChpbnB1dCwgXCJ0ZXh0XCIpO1xuICAgIHJldHVybiBhZGFwdGVyLmFkZFJ1bGUoe1xuICAgICAgcnVsZUtleSxcbiAgICAgIGlkLFxuICAgICAgd2hlbixcbiAgICAgIHRleHQ6IHJ1bGVUZXh0LFxuICAgICAgZXhhbXBsZXM6IHN0cmluZ3MoaW5wdXQsIFwiZXhhbXBsZXNcIiksXG4gICAgICBkcnlSdW46IGV4cGxpY2l0bHlEcnlSdW4oaW5wdXQpLFxuICAgIH0pO1xuICB9XG4gIGlmIChleHBsaWNpdGx5RHJ5UnVuKGlucHV0KSkge1xuICAgIHJldHVybiB7IG9wZXJhdGlvbjogXCJhZGRBY2NlcHRhbmNlQ3JpdGVyaW9uXCIsIGlucHV0LCBkcnlSdW46IHRydWUgfTtcbiAgfVxuICBjb25zdCBkb2N1bWVudCA9IHJlcXVpcmVkVGV4dChpbnB1dCwgXCJkb2N1bWVudFwiKTtcbiAgY29uc3QgY3JpdGVyaW9uID0gcmVxdWlyZWRUZXh0KGlucHV0LCBcInRleHRcIik7XG4gIHJldHVybiBhZGFwdGVyLmFkZEFjY2VwdGFuY2VDcml0ZXJpb24oeyBkb2N1bWVudCwgdGV4dDogY3JpdGVyaW9uLCBkcnlSdW46IGZhbHNlIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBpbnZva2VEZWZhdWx0KFxuICBncm91cDogc3RyaW5nLFxuICBtZXRob2Q6IHN0cmluZyxcbiAgaW5wdXQ6IENvbW1hbmRJbnB1dCxcbik6IFByb21pc2U8VG9vbGluZ1Jlc3VsdD4ge1xuICBpZiAoZ3JvdXAgPT09IFwiY29yZVwiKSByZXR1cm4gc3luY09wZXJhdGlvbihpbnB1dCk7XG4gIGlmIChncm91cCA9PT0gXCJlbnRpdHlcIikgcmV0dXJuIGVudGl0eU9wZXJhdGlvbihtZXRob2QsIGlucHV0KTtcbiAgaWYgKGdyb3VwID09PSBcInNjYWZmb2xkXCIpIHJldHVybiBzY2FmZm9sZE9wZXJhdGlvbihtZXRob2QsIGlucHV0KTtcbiAgaWYgKGdyb3VwID09PSBcIm1pZ3JhdGlvblwiKSByZXR1cm4gbWlncmF0aW9uT3BlcmF0aW9uKG1ldGhvZCwgaW5wdXQpO1xuICBpZiAoZ3JvdXAgPT09IFwiZml4dHVyZVwiKSByZXR1cm4gZml4dHVyZU9wZXJhdGlvbihtZXRob2QsIGlucHV0KTtcbiAgaWYgKGdyb3VwID09PSBcImJ1aWxkXCIpIHJldHVybiBidWlsZE9wZXJhdGlvbihtZXRob2QpO1xuICBpZiAoZ3JvdXAgPT09IFwidGVzdFwiKSByZXR1cm4gdGVzdE9wZXJhdGlvbihtZXRob2QsIGlucHV0KTtcbiAgaWYgKGdyb3VwID09PSBcImF1dGhcIikgcmV0dXJuIGF1dGhPcGVyYXRpb24obWV0aG9kLCBpbnB1dCk7XG4gIGlmIChncm91cCA9PT0gXCJpMThuXCIpIHJldHVybiBpMThuT3BlcmF0aW9uKG1ldGhvZCwgaW5wdXQpO1xuICBpZiAoZ3JvdXAgPT09IFwidGFza1wiKSByZXR1cm4gdGFza09wZXJhdGlvbihtZXRob2QsIGlucHV0KTtcbiAgaWYgKGdyb3VwID09PSBcInN0dWJcIikgcmV0dXJuIHN0dWJQcmFjdGljZU9wZXJhdGlvbihpbnB1dCk7XG4gIHJldHVybiBjZGRPcGVyYXRpb24obWV0aG9kLCBpbnB1dCk7XG59XG5cbi8vIOq4sOuzuCByZWdpc3RyeeuKlCDtmLjstpwg7Iuc7KCQ6rmM7KeAIFNvbmFtdSDstIjquLDtmZTsmYAg7Jm467aAIOyekeyXheydhCDrqqjrkZAg66+466O564uI64ukLlxuZXhwb3J0IGNvbnN0IHRvb2xpbmc6IENsaVRvb2xpbmdPcGVyYXRpb25zID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICBPYmplY3QuZW50cmllcyhSRVFVSVJFRF9NRVRIT0RTKS5tYXAoKFtncm91cCwgbWV0aG9kc10pID0+IFtcbiAgICBncm91cCxcbiAgICBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBtZXRob2RzLm1hcCgobWV0aG9kKSA9PiBbXG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgKGlucHV0OiBDb21tYW5kSW5wdXQpID0+IGludm9rZURlZmF1bHQoZ3JvdXAsIG1ldGhvZCwgaW5wdXQpLFxuICAgICAgXSksXG4gICAgKSxcbiAgXSksXG4pO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkodG9vbGluZy5taWdyYXRpb24sIFwiYXBwbHlcIiwge1xuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgdmFsdWU6IChpbnB1dDogQ29tbWFuZElucHV0KSA9PiBpbnZva2VEZWZhdWx0KFwibWlncmF0aW9uXCIsIFwiYXBwbHlcIiwgaW5wdXQpLFxufSk7XG4iXSwibWFwcGluZ3MiOiI7O0FBSUEsTUFBTSxrQkFBa0IsRUFBRSxLQUFLO0FBVS9CLE1BQU0sb0NBQW9CLElBQUksSUFBWTtDQUN4QztDQUNBO0NBQ0E7Q0FDQTtDQUNB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
916
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLXRvb2xpbmcuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rvb2xpbmcvY2xpLXRvb2xpbmcudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgdHlwZSBGaXh0dXJlQ29tbWFuZE9wdGlvbnMgfSBmcm9tIFwiLi4vYmluL2ZpeHR1cmVcIjtcbmltcG9ydCB7IHR5cGUgVGVtcGxhdGVLZXkgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcblxuY29uc3QganNvblZhbHVlU2NoZW1hID0gei5qc29uKCk7XG50eXBlIENvbW1hbmRWYWx1ZSA9IHouaW5mZXI8dHlwZW9mIGpzb25WYWx1ZVNjaGVtYT4gfCB1bmRlZmluZWQ7XG50eXBlIENvbW1hbmRJbnB1dCA9IFJlY29yZDxzdHJpbmcsIENvbW1hbmRWYWx1ZT47XG50eXBlIFRvb2xpbmdSZXN1bHQgPSBvYmplY3QgfCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbCB8IHZvaWQgfCBBc3luY0l0ZXJhYmxlPG9iamVjdD47XG50eXBlIFRvb2xpbmdPcGVyYXRpb24gPSAoaW5wdXQ6IENvbW1hbmRJbnB1dCkgPT4gVG9vbGluZ1Jlc3VsdCB8IFByb21pc2U8VG9vbGluZ1Jlc3VsdD47XG50eXBlIFRvb2xpbmdHcm91cCA9IFJlY29yZDxzdHJpbmcsIFRvb2xpbmdPcGVyYXRpb24+O1xuZXhwb3J0IHR5cGUgQ2xpVG9vbGluZ09wZXJhdGlvbnMgPSBSZWNvcmQ8c3RyaW5nLCBUb29saW5nR3JvdXA+O1xuXG50eXBlIE1pZ3JhdGlvblRhcmdldCA9IFwiZGV2ZWxvcG1lbnRcIiB8IFwic3RhZ2luZ1wiIHwgXCJwcm9kdWN0aW9uXCIgfCBcImZpeHR1cmVcIiB8IFwidGVzdFwiO1xuXG5jb25zdCBNSUdSQVRJT05fVEFSR0VUUyA9IG5ldyBTZXQ8c3RyaW5nPihbXG4gIFwiZGV2ZWxvcG1lbnRcIixcbiAgXCJzdGFnaW5nXCIsXG4gIFwicHJvZHVjdGlvblwiLFxuICBcImZpeHR1cmVcIixcbiAgXCJ0ZXN0XCIsXG5dKTtcblxuZnVuY3Rpb24gYXNzZXJ0TWlncmF0aW9uVGFyZ2V0KHRhcmdldDogc3RyaW5nKTogYXNzZXJ0cyB0YXJnZXQgaXMgTWlncmF0aW9uVGFyZ2V0IHtcbiAgLy8gREIg7IOB7YOc66W8IOyhsO2ajO2VmOqxsOuCmCDrs4Dqsr3tlZjquLAg7KCE7JeQIOuqqOuToCDsmbjrtoAg64yA7IOB7J2EIOqygOymne2VqeuLiOuLpC5cbiAgaWYgKE1JR1JBVElPTl9UQVJHRVRTLmhhcyh0YXJnZXQpKSByZXR1cm47XG4gIHRocm93IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKGBVbnN1cHBvcnRlZCBtaWdyYXRpb24gdGFyZ2V0OiAke3RhcmdldH1gKSwge1xuICAgIGNvZGU6IFwiSU5WQUxJRF9NSUdSQVRJT05fVEFSR0VUXCIsXG4gICAgZXhpdENvZGU6IDIsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhc3NlcnRTaGFkb3dNaWdyYXRpb25UYXJnZXQoXG4gIHRhcmdldDogTWlncmF0aW9uVGFyZ2V0LFxuKTogYXNzZXJ0cyB0YXJnZXQgaXMgRXh0cmFjdDxNaWdyYXRpb25UYXJnZXQsIFwiZml4dHVyZVwiIHwgXCJ0ZXN0XCI+IHtcbiAgaWYgKHRhcmdldCA9PT0gXCJmaXh0dXJlXCIgfHwgdGFyZ2V0ID09PSBcInRlc3RcIikgcmV0dXJuO1xuXG4gIC8vIFNoYWRvdyBEQuuKlCDsmrTsmIEg6rOE7Je0IOyXsOqysOyXkCDsoJHqt7ztlZjquLAg7KCE7JeQIO2XiOyaqSDrjIDsg4HsnYQg7KCc7ZWc7ZWp64uI64ukLlxuICB0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihgSW52YWxpZCBzaGFkb3cgbWlncmF0aW9uIHRhcmdldDogJHt0YXJnZXR9YCksIHtcbiAgICBjb2RlOiBcIklOVkFMSURfU0hBRE9XX01JR1JBVElPTl9UQVJHRVRcIixcbiAgICB0YXJnZXQsXG4gICAgZXhpdENvZGU6IDIsXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtaWdyYXRpb25QbGFuKFxuICB0YXJnZXQ6IE1pZ3JhdGlvblRhcmdldCxcbiAgbWlncmF0aW9uczogc3RyaW5nW10sXG4gIGFjdGlvbjogXCJhcHBseVwiIHwgXCJyb2xsYmFja1wiID0gXCJhcHBseVwiLFxuKSB7XG4gIGNvbnN0IGRpZ2VzdCA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGlnZXN0KFxuICAgIFwiU0hBLTI1NlwiLFxuICAgIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShKU09OLnN0cmluZ2lmeSh7IGFjdGlvbiwgdGFyZ2V0LCBtaWdyYXRpb25zIH0pKSxcbiAgKTtcbiAgcmV0dXJuIHtcbiAgICBraW5kOiBcIm1pZ3JhdGlvbi1wbGFuXCIgYXMgY29uc3QsXG4gICAgYWN0aW9uLFxuICAgIHRhcmdldCxcbiAgICBtaWdyYXRpb25zLFxuICAgIGZpbmdlcnByaW50OiBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KGRpZ2VzdCksIChieXRlKSA9PlxuICAgICAgYnl0ZS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpLFxuICAgICkuam9pbihcIlwiKSxcbiAgfTtcbn1cblxuY29uc3QgUkVRVUlSRURfTUVUSE9EUyA9IHtcbiAgY29yZTogW1wic3luY1wiXSxcbiAgZW50aXR5OiBbXCJsaXN0XCIsIFwic2hvd1wiLCBcInNlYXJjaFwiLCBcImFwcGx5UGF0Y2hcIiwgXCJjcmVhdGVcIiwgXCJjb25lc1wiXSxcbiAgc2NhZmZvbGQ6IFtcIm1vZGVsXCIsIFwibW9kZWxfdGVzdFwiLCBcInZpZXdfbGlzdFwiLCBcInZpZXdfZm9ybVwiLCBcInN0YXR1c1wiLCBcInByZXZpZXdcIiwgXCJiYXRjaFwiXSxcbiAgbWlncmF0aW9uOiBbXCJydW5cIiwgXCJnZW5lcmF0ZVwiLCBcInN0YXR1c1wiLCBcImNvbm5lY3Rpb25zXCIsIFwiY29kZVwiLCBcInByZXZpZXdcIiwgXCJzaGFkb3dcIiwgXCJyb2xsYmFja1wiXSxcbiAgZml4dHVyZTogW1wiaW5pdFwiLCBcImltcG9ydFwiLCBcInN5bmNcIiwgXCJnZW5cIiwgXCJmZXRjaFwiLCBcImV4cGxvcmVcIl0sXG4gIGJ1aWxkOiBbXCJhbGxcIiwgXCJhcGlcIiwgXCJ3ZWJcIl0sXG4gIHRlc3Q6IFtcInJ1blwiLCBcInN0YXR1c1wiXSxcbiAgYXV0aDogW1wiZ2VuZXJhdGVcIiwgXCJhZGRDb21wYW5pb25zXCJdLFxuICBpMThuOiBbXCJsaXN0XCIsIFwiY2hlY2tcIiwgXCJpbXBvcnRcIiwgXCJleHBvcnRcIiwgXCJjcmVhdGVcIiwgXCJ1cGRhdGVcIiwgXCJyZW1vdmVcIl0sXG4gIHRhc2s6IFtcImRlZmluaXRpb25zXCIsIFwicnVuc1wiLCBcInNob3dcIiwgXCJzdGVwc1wiLCBcIndhdGNoXCIsIFwicGF1c2VcIiwgXCJyZXN1bWVcIiwgXCJjYW5jZWxcIl0sXG4gIGNkZDogW1widHJlZVwiLCBcInJlYWRcIiwgXCJydWxlc1wiLCBcInNob3dSdWxlXCIsIFwiYWRkUnVsZVwiLCBcImFkZEFjY2VwdGFuY2VDcml0ZXJpb25cIl0sXG4gIHN0dWI6IFtcInByYWN0aWNlXCJdLFxufSBhcyBjb25zdDtcblxubGV0IGluaXRpYWxpemF0aW9uOiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkO1xuXG5hc3luYyBmdW5jdGlvbiBlbnN1cmVTb25hbXUoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgU29uYW11IH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9hcGkvc29uYW11XCIpO1xuICBpZiAoU29uYW11LmlzSW5pdGlhbGl6ZWQpIHJldHVybjtcbiAgaW5pdGlhbGl6YXRpb24gPz89IFNvbmFtdS5pbml0KHRydWUsIGZhbHNlKTtcbiAgYXdhaXQgaW5pdGlhbGl6YXRpb247XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN5bmNPcGVyYXRpb24oaW5wdXQ6IENvbW1hbmRJbnB1dCk6IFByb21pc2U8VG9vbGluZ1Jlc3VsdD4ge1xuICBhd2FpdCBlbnN1cmVTb25hbXUoKTtcbiAgY29uc3QgeyBTb25hbXUgfSA9IGF3YWl0IGltcG9ydChcIi4uL2FwaS9zb25hbXVcIik7XG4gIHJldHVybiBpbnB1dC5mb3JjZSA9PT0gdHJ1ZSA/IFNvbmFtdS5zeW5jZXIuZm9yY2VTeW5jKCkgOiBTb25hbXUuc3luY2VyLnN5bmMoKTtcbn1cblxuZnVuY3Rpb24gdGV4dChpbnB1dDogQ29tbWFuZElucHV0LCBrZXk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHZhbHVlID0gei5zdHJpbmcoKS5zYWZlUGFyc2UoaW5wdXRba2V5XSk7XG4gIHJldHVybiB2YWx1ZS5zdWNjZXNzID8gdmFsdWUuZGF0YSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gc3RyaW5ncyhpbnB1dDogQ29tbWFuZElucHV0LCBrZXk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgdmFsdWUgPSB6LmFycmF5KHouc3RyaW5nKCkpLnNhZmVQYXJzZShpbnB1dFtrZXldKTtcbiAgcmV0dXJuIHZhbHVlLnN1Y2Nlc3MgPyB2YWx1ZS5kYXRhIDogW107XG59XG5cbmZ1bmN0aW9uIHJlcXVpcmVkVGV4dChpbnB1dDogQ29tbWFuZElucHV0LCBrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHZhbHVlID0gdGV4dChpbnB1dCwga2V5KTtcbiAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUubGVuZ3RoID4gMCkgcmV0dXJuIHZhbHVlO1xuICB0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihgTWlzc2luZyAke2tleX0uYCksIHsgY29kZTogXCJNSVNTSU5HX0FSR1VNRU5UXCIsIGV4aXRDb2RlOiAyIH0pO1xufVxuXG4vKipcbiAqIOyDneuete2VnCDqsJLsnYAgYHVuZGVmaW5lZGDroZwg7Ya16rO87Iuc7YKk65CYLCDqsJLsnbQg7J6I64qU642wIOusuOyekOyXtOydtCDslYTri4jrqbQg7J247J6QIOyYpOulmOuhnCDqsbDsoIjtlanri4jri6QuXG4gKlxuICogYHRleHQoKWDsspjrn7wg7KGw7Jqp7Z6IIOustOyLnO2VmOuptCDsnpjrqrvrkJwg7YOA7J6F7J2YIOyeheugpeydtCDquLDrs7jqsJLsnLzroZwg65GU6rCR7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiBvcHRpb25hbFRleHQoaW5wdXQ6IENvbW1hbmRJbnB1dCwga2V5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB2YWx1ZSA9IGlucHV0W2tleV07XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBwYXJzZWQgPSB6LnN0cmluZygpLnNhZmVQYXJzZSh2YWx1ZSk7XG4gIGlmIChwYXJzZWQuc3VjY2VzcykgcmV0dXJuIHBhcnNlZC5kYXRhO1xuICB0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihgSW52YWxpZCAke2tleX0uYCksIHsgY29kZTogXCJJTlZBTElEX0FSR1VNRU5UXCIsIGV4aXRDb2RlOiAyIH0pO1xufVxuXG5mdW5jdGlvbiBwYXJzZUpzb248U2NoZW1hIGV4dGVuZHMgei5ab2RUeXBlPihcbiAgY29udGVudHM6IHN0cmluZyxcbiAgY29kZTogc3RyaW5nLFxuICBzY2hlbWE6IFNjaGVtYSxcbik6IHouaW5mZXI8U2NoZW1hPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHNjaGVtYS5wYXJzZShKU09OLnBhcnNlKGNvbnRlbnRzKSk7XG4gIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgdGhyb3cgT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoXCJJbnZhbGlkIEpTT04gaW5wdXQuXCIpLCB7IGNvZGUsIGV4aXRDb2RlOiAyLCBjYXVzZSB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtdXRhdGlvblJlcXVlc3RlZChpbnB1dDogQ29tbWFuZElucHV0KTogYm9vbGVhbiB7XG4gIHJldHVybiBpbnB1dC5leGVjdXRlID09PSB0cnVlIHx8IGlucHV0LmRyeVJ1biA9PT0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGV4cGxpY2l0bHlEcnlSdW4oaW5wdXQ6IENvbW1hbmRJbnB1dCk6IGJvb2xlYW4ge1xuICByZXR1cm4gaW5wdXQuZHJ5UnVuID09PSB0cnVlIHx8IGlucHV0LmV4ZWN1dGUgPT09IGZhbHNlO1xufVxuXG5jb25zdCBlbnRpdHlQYXRjaFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgZW50aXR5SWQ6IHouc3RyaW5nKCkubWluKDEpLFxuICBvcGVyYXRpb25zOiB6LmFycmF5KFxuICAgIHoub2JqZWN0KHtcbiAgICAgIG9wOiB6LmxpdGVyYWwoXCJhZGRcIiksXG4gICAgICBwYXRoOiB6LmxpdGVyYWwoXCIvcHJvcHMvLVwiKSxcbiAgICAgIHZhbHVlOiB6XG4gICAgICAgIC5vYmplY3QoeyBuYW1lOiB6LnN0cmluZygpLm1pbigxKSwgdHlwZTogei5zdHJpbmcoKS5taW4oMSkgfSlcbiAgICAgICAgLmNhdGNoYWxsKGpzb25WYWx1ZVNjaGVtYSksXG4gICAgfSksXG4gICksXG59KTtcbmNvbnN0IGkxOG5FbnRyaWVzU2NoZW1hID0gei5hcnJheShcbiAgei5vYmplY3QoeyBrZXk6IHouc3RyaW5nKCksIHZhbHVlczogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkgfSksXG4pO1xuY29uc3QgZGljdGlvbmFyeVZhbHVlc1NjaGVtYSA9IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpO1xuY29uc3QgZGljdGlvbmFyeVNvdXJjZVNjaGVtYSA9IHouZW51bShbXCJlbnRpdHlcIiwgXCJwcm9qZWN0XCIsIFwic29uYW11XCJdKTtcbmNvbnN0IGNvbmVMb2NhbGVTY2hlbWEgPSB6LmVudW0oW1wia29cIiwgXCJlblwiLCBcImphXCJdKTtcblxuLyoqXG4gKiBjb25lIOyDneyEseyXkCDsgqzsmqntlaAgbG9jYWxl7J2EIOqysOygle2VqeuLiOuLpC5cbiAqXG4gKiDrqoXsi5ztlZwgbG9jYWxl7J20IOy1nOyasOyEoOydtOqzoCwg7JeG7Jy866m0IO2UhOuhnOygne2KuCBpMThuIOq4sOuzuCBsb2NhbGUsIOq3uOuniOyggCDsl4bsnLzrqbQgXCJrb1wi66W8IOyCrOyaqe2VqeuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUNvbmVMb2NhbGUoaW5wdXQ6IENvbW1hbmRJbnB1dCk6IFByb21pc2U8ei5pbmZlcjx0eXBlb2YgY29uZUxvY2FsZVNjaGVtYT4+IHtcbiAgY29uc3QgZXhwbGljaXQgPSBjb25lTG9jYWxlU2NoZW1hLnNhZmVQYXJzZShpbnB1dC5sb2NhbGUpO1xuICBpZiAoZXhwbGljaXQuc3VjY2VzcykgcmV0dXJuIGV4cGxpY2l0LmRhdGE7XG5cbiAgY29uc3QgeyBTb25hbXUgfSA9IGF3YWl0IGltcG9ydChcIi4uL2FwaS9zb25hbXVcIik7XG4gIGxldCBjb25maWd1cmVkTG9jYWxlOiB1bmtub3duO1xuICB0cnkge1xuICAgIGNvbmZpZ3VyZWRMb2NhbGUgPSBTb25hbXUuY29uZmlnLmkxOG4/LmRlZmF1bHRMb2NhbGU7XG4gIH0gY2F0Y2gge1xuICAgIC8vIOyEpOygleydhCDslYTsp4Eg7J297J2EIOyImCDsl4bripQg7Iuk7ZaJIOqyveuhnOyXkOyEnOuKlCDquLDrs7ggbG9jYWxl66GcIO2PtOuwse2VqeuLiOuLpC5cbiAgfVxuICBjb25zdCBjb25maWd1cmVkID0gY29uZUxvY2FsZVNjaGVtYS5zYWZlUGFyc2UoY29uZmlndXJlZExvY2FsZSk7XG4gIHJldHVybiBjb25maWd1cmVkLnN1Y2Nlc3MgPyBjb25maWd1cmVkLmRhdGEgOiBcImtvXCI7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGVudGl0eU9wZXJhdGlvbihtZXRob2Q6IHN0cmluZywgaW5wdXQ6IENvbW1hbmRJbnB1dCk6IFByb21pc2U8VG9vbGluZ1Jlc3VsdD4ge1xuICBhd2FpdCBlbnN1cmVTb25hbXUoKTtcbiAgY29uc3QgeyBFbnRpdHlNYW5hZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIik7XG4gIGNvbnN0IGVudGl0aWVzID0gRW50aXR5TWFuYWdlci5nZXRBbGxFbnRpdGllcygpO1xuXG4gIGlmIChtZXRob2QgPT09IFwibGlzdFwiKSByZXR1cm4gZW50aXRpZXMubWFwKChlbnRpdHkpID0+IGVudGl0eS50b0pzb24oKSk7XG4gIGlmIChtZXRob2QgPT09IFwic2hvd1wiKSB7XG4gICAgY29uc3QgZW50aXR5SWQgPSByZXF1aXJlZFRleHQoaW5wdXQsIFwiZW50aXR5SWRcIik7XG4gICAgaWYgKCFFbnRpdHlNYW5hZ2VyLmV4aXN0cyhlbnRpdHlJZCkpIHtcbiAgICAgIHRocm93IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKGBFbnRpdHkgbm90IGZvdW5kOiAke2VudGl0eUlkfWApLCB7XG4gICAgICAgIGNvZGU6IFwiRU5USVRZX05PVF9GT1VORFwiLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCkudG9Kc29uKCk7XG4gIH1cbiAgaWYgKG1ldGhvZCA9PT0gXCJzZWFyY2hcIikge1xuICAgIGNvbnN0IHF1ZXJ5ID0gcmVxdWlyZWRUZXh0KGlucHV0LCBcInF1ZXJ5XCIpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIGVudGl0aWVzXG4gICAgICAubWFwKChlbnRpdHkpID0+IGVudGl0eS50b0pzb24oKSlcbiAgICAgIC5maWx0ZXIoKGVudGl0eSkgPT4gSlNPTi5zdHJpbmdpZnkoZW50aXR5KS50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XG4gIH1cbiAgaWYgKG1ldGhvZCA9PT0gXCJjcmVhdGVcIikge1xuICAgIGNvbnN0IGVudGl0eUlkID0gcmVxdWlyZWRUZXh0KGlucHV0LCBcIm5hbWVcIik7XG4gICAgY29uc3QgeyBTb25hbXUgfSA9IGF3YWl0IGltcG9ydChcIi4uL2FwaS9zb25hbXVcIik7XG4gICAgYXdhaXQgU29uYW11LnN5bmNlci5jcmVhdGVFbnRpdHkoeyBlbnRpdHlJZCwgdGl0bGU6IGVudGl0eUlkIH0pO1xuICAgIGlmIChpbnB1dC5ub0NvbmVzID09PSB0cnVlKSByZXR1cm4geyBlbnRpdHlJZCwgY29uZXM6IFwic2tpcHBlZFwiIH07XG4gICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgIGlmIChpbnB1dC5haSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIGVudGl0eS5nZW5lcmF0ZUNvbmVzKHtcbiAgICAgICAgcHJlc2VydmVFeGlzdGluZzogZmFsc2UsXG4gICAgICAgIG9ubHlFbXB0eTogZmFsc2UsXG4gICAgICAgIGxvY2FsZTogYXdhaXQgcmVzb2x2ZUNvbmVMb2NhbGUoaW5wdXQpLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGF3YWl0IGVudGl0eS5nZW5lcmF0ZVRlbXBsYXRlQ29uZXMoKTtcbiAgICByZXR1cm4geyBlbnRpdHlJZCwgY29uZXM6IFwidGVtcGxhdGVcIiB9O1xuICB9XG4gIGlmIChtZXRob2QgPT09IFwiY29uZXNcIikge1xuICAgIGNvbnN0IGVudGl0eUlkID0gcmVxdWlyZWRUZXh0KGlucHV0LCBcImVudGl0eUlkXCIpO1xuICAgIGNvbnN0IHRhcmdldHMgPVxuICAgICAgaW5wdXQuYWxsID09PSB0cnVlIHx8IGVudGl0eUlkID09PSBcImFsbFwiXG4gICAgICAgID8gRW50aXR5TWFuYWdlci5nZXRBbGxFbnRpdGllcygpXG4gICAgICAgIDogRW50aXR5TWFuYWdlci5leGlzdHMoZW50aXR5SWQpXG4gICAgICAgICAgPyBbRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpXVxuICAgICAgICAgIDogW107XG4gICAgaWYgKHRhcmdldHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihgRW50aXR5IG5vdCBmb3VuZDogJHtlbnRpdHlJZH1gKSwge1xuICAgICAgICBjb2RlOiBcIkVOVElUWV9OT1RfRk9VTkRcIixcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCByZWdlbmVyYXRlID0gaW5wdXQucmVnZW5lcmF0ZSA9PT0gdHJ1ZTtcbiAgICBjb25zdCBzZWxlY3RlZExvY2FsZSA9IGF3YWl0IHJlc29sdmVDb25lTG9jYWxlKGlucHV0KTtcbiAgICAvLyDtlZwg7JeU7Yuw7Yuw7J2YIOyLpO2MqOqwgCDrgpjrqLjsp4Ag7JeU7Yuw7Yuw7J2YIGNvbmUg7IOd7ISx7J2EIOy3qOyGjO2VmOyngCDslYrrj4TroZ0g7KCE67aAIOuBneq5jOyngCDsi6Ttlontlanri4jri6QuXG4gICAgY29uc3Qgc2V0dGxlZCA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgIHRhcmdldHMubWFwKGFzeW5jIChlbnRpdHkpID0+ICh7XG4gICAgICAgIGVudGl0eUlkOiBlbnRpdHkuaWQsXG4gICAgICAgIC4uLihhd2FpdCBlbnRpdHkuZ2VuZXJhdGVDb25lcyh7XG4gICAgICAgICAgcHJlc2VydmVFeGlzdGluZzogIXJlZ2VuZXJhdGUsXG4gICAgICAgICAgb25seUVtcHR5OiAhcmVnZW5lcmF0ZSxcbiAgICAgICAgICBsb2NhbGU6IHNlbGVjdGVkTG9jYWxlLFxuICAgICAgICB9KSksXG4gICAgICB9KSksXG4gICAgKTtcbiAgICBjb25zdCByZXN1bHRzID0gW107XG4gICAgY29uc3QgZmFpbHVyZXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgb3V0Y29tZV0gb2Ygc2V0dGxlZC5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChvdXRjb21lLnN0YXR1cyA9PT0gXCJmdWxmaWxsZWRcIikge1xuICAgICAgICByZXN1bHRzLnB1c2gob3V0Y29tZS52YWx1ZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZmFpbHVyZXMucHVzaCh7XG4gICAgICAgIGVudGl0eUlkOiB0YXJnZXRzW2luZGV4XS5pZCxcbiAgICAgICAgbWVzc2FnZTogb3V0Y29tZS5yZWFzb24gaW5zdGFuY2VvZiBFcnJvciA/IG91dGNvbWUucmVhc29uLm1lc3NhZ2UgOiBTdHJpbmcob3V0Y29tZS5yZWFzb24pLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChmYWlsdXJlcy5sZW5ndGggPT09IDApIHJldHVybiByZXN1bHRzO1xuICAgIHRocm93IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKGBDb25lIGdlbmVyYXRpb24gZmFpbGVkIGZvciAke2ZhaWx1cmVzLmxlbmd0aH0gZW50aXR5KHMpLmApLCB7XG4gICAgICBjb2RlOiBcIkNPTkVfR0VORVJBVElPTl9GQUlMRURcIixcbiAgICAgIGRldGFpbHM6IHsgcmVzdWx0cywgZmFpbHVyZXMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IGZpbGUgPSByZXF1aXJlZFRleHQoaW5wdXQsIFwiZmlsZVwiKTtcbiAgY29uc3QgeyByZWFkRmlsZSB9ID0gYXdhaXQgaW1wb3J0KFwibm9kZTpmcy9wcm9taXNlc1wiKTtcbiAgY29uc3QgY29udGVudHMgPVxuICAgIGZpbGUgPT09IFwiLVwiXG4gICAgICA/IGF3YWl0IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2h1bmtzID0gW107XG4gICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiBwcm9jZXNzLnN0ZGluKSBjaHVua3MucHVzaChCdWZmZXIuZnJvbShjaHVuaykpO1xuICAgICAgICAgIHJldHVybiBCdWZmZXIuY29uY2F0KGNodW5rcykudG9TdHJpbmcoXCJ1dGY4XCIpO1xuICAgICAgICB9KSgpXG4gICAgICA6IGF3YWl0IHJlYWRGaWxlKGZpbGUsIFwidXRmOFwiKTtcbiAgY29uc3QgcGF0Y2ggPSBwYXJzZUpzb24oY29udGVudHMsIFwiSU5WQUxJRF9FTlRJVFlfUEFUQ0hcIiwgZW50aXR5UGF0Y2hTY2hlbWEpO1xuICBpZiAoIUVudGl0eU1hbmFnZXIuZXhpc3RzKHBhdGNoLmVudGl0eUlkKSkge1xuICAgIHRocm93IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKGBFbnRpdHkgbm90IGZvdW5kOiAke3BhdGNoLmVudGl0eUlkfWApLCB7XG4gICAgICBjb2RlOiBcIkVOVElUWV9OT1RfRk9VTkRcIixcbiAgICB9KTtcbiAgfVxuICBjb25zdCB0YXJnZXQgPSBFbnRpdHlNYW5hZ2VyLmdldChwYXRjaC5lbnRpdHlJZCk7XG4gIGNvbnN0IGJlZm9yZSA9IHRhcmdldC50b0pzb24oKTtcbiAgY29uc3QgYWZ0ZXIgPSBzdHJ1Y3R1cmVkQ2xvbmUoYmVmb3JlKTtcbiAgY29uc3QgbmV4dFByb3BzID0gW1xuICAgIC4uLmFmdGVyLnByb3BzLFxuICAgIC4uLnBhdGNoLm9wZXJhdGlvbnMubWFwKCh7IHZhbHVlIH0pID0+IHN0cnVjdHVyZWRDbG9uZSh2YWx1ZSkpLFxuICBdO1xuICAvLyDtjIzsnbzsnbTrgpgg65Ox66Gd65CcIOyXlO2LsO2LsOulvCDqsbTrk5zrpqzquLAg7KCE7JeQIHBhdGNoIOyggeyaqSDqsrDqs7wg7KCE7LK066W8IGVudGl0eSDsiqTtgqTrp4jroZwg6rKA7Kad7ZWp64uI64ukLlxuICBjb25zdCB7IEVudGl0eUpzb25TY2hlbWEgfSA9IGF3YWl0IGltcG9ydChcIi4uL3R5cGVzL3R5cGVzXCIpO1xuICBjb25zdCB2YWxpZGF0aW9uID0gRW50aXR5SnNvblNjaGVtYS5zYWZlUGFyc2UoeyAuLi5hZnRlciwgcHJvcHM6IG5leHRQcm9wcyB9KTtcbiAgaWYgKCF2YWxpZGF0aW9uLnN1Y2Nlc3MpIHtcbiAgICB0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihcIkludmFsaWQgZW50aXR5IHBhdGNoLlwiKSwge1xuICAgICAgY29kZTogXCJJTlZBTElEX0VOVElUWV9QQVRDSFwiLFxuICAgICAgZXhpdENvZGU6IDIsXG4gICAgICBjYXVzZTogdmFsaWRhdGlvbi5lcnJvcixcbiAgICB9KTtcbiAgfVxuICAvLyBTQUZFVFk6IEVudGl0eUpzb25TY2hlbWHqsIAgcGF0Y2gg7KCB7JqpIOqysOqzvCDsoITssrTrpbwg6rKA7Kad7ZaI7Iq164uI64ukLlxuICBhZnRlci5wcm9wcyA9IG5leHRQcm9wcyBhcyB0eXBlb2YgYWZ0ZXIucHJvcHM7XG4gIGlmIChtdXRhdGlvblJlcXVlc3RlZChpbnB1dCkpIHtcbiAgICAvLyBTQUZFVFk6IGFmdGVyLnByb3BzIG9yaWdpbmF0ZXMgZnJvbSB0aGUgY3VycmVudCBlbnRpdHkgcGx1cyBzY2hlbWEtdmFsaWRhdGVkIHByb3AgYWRkaXRpb25zLlxuICAgIHRhcmdldC5wcm9wcyA9IGFmdGVyLnByb3BzIGFzIHR5cGVvZiB0YXJnZXQucHJvcHM7XG4gICAgYXdhaXQgdGFyZ2V0LnNhdmUoKTtcbiAgfVxuICByZXR1cm4geyBjaGFuZ2VkOiBwYXRjaC5vcGVyYXRpb25zLmxlbmd0aCA+IDAsIGJlZm9yZSwgYWZ0ZXIgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVuZGVyU2NhZmZvbGRzKGlucHV0OiBDb21tYW5kSW5wdXQpIHtcbiAgYXdhaXQgZW5zdXJlU29uYW11KCk7XG4gIGNvbnN0IHsgcmVuZGVyVGVtcGxhdGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL3N5bmNlci9jb2RlLWdlbmVyYXRvclwiKTtcbiAgY29uc3QgZW50aXRpZXMgPSBzdHJpbmdzKGlucHV0LCBcImVudGl0aWVzXCIpO1xuICBjb25zdCB0ZW1wbGF0ZXMgPSBzdHJpbmdzKGlucHV0LCBcInRlbXBsYXRlc1wiKTtcbiAgY29uc3QgcmVuZGVyZWQgPSBbXTtcbiAgZm9yIChjb25zdCBlbnRpdHlJZCBvZiBlbnRpdGllcykge1xuICAgIGZvciAoY29uc3QgdGVtcGxhdGUgb2YgdGVtcGxhdGVzKSB7XG4gICAgICBjb25zdCB0ZW1wbGF0ZUtleSA9IHpcbiAgICAgICAgLmVudW0oW1wibW9kZWxcIiwgXCJtb2RlbF90ZXN0XCIsIFwidmlld19saXN0XCIsIFwidmlld19mb3JtXCIsIFwidmlld19zZWFyY2hfaW5wdXRcIl0pXG4gICAgICAgIC5wYXJzZSh0ZW1wbGF0ZSk7XG4gICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHJlbmRlclRlbXBsYXRlKHRlbXBsYXRlS2V5LCB7IGVudGl0eUlkIH0pO1xuICAgICAgcmVuZGVyZWQucHVzaCh7IGVudGl0eUlkLCB0ZW1wbGF0ZTogdGVtcGxhdGVLZXksIGZpbGVzIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVuZGVyZWQ7XG59XG5cbi8qKlxuICog7YWc7ZSM66a/7J20IOyalOq1rO2VmOuKlCBkaWN0IO2CpOulvCDtlITroZzsoJ3tirgg7IKs7KCE7JeQIOyxhOybgeuLiOuLpC5cbiAqXG4gKiDsg53shLEg7L2U65Oc7JeQ64qUIFNEKFwiZXJyb3IuZW50aXR5Tm90Rm91bmRcIikg6rCZ7J2AIO2YuOy2nOydtCDrsJXtnojripTrjbAsIO2CpOqwgCDtlITroZzsoJ3tirgg7IKs7KCE7JeQXG4gKiDsl4bsnLzrqbQg67KI7Jet7J20IOuQmOyngCDslYrslYQg7IKs656M7J20IOunpOuyiCDshpDsnLzroZwg7LGE7Jqw6rGw64KYIOuLpOuluCDtgqTroZwg67CU6r+U7JW8IO2VnOuLpC5cbiAqIFNvbmFtdSBVSSDqsr3roZwodWkvYXBpLnRzKeuKlCDsnbTrr7gg6rCZ7J2AIOyymOumrOulvCDtlZjrr4DroZwsIENMSeuPhCDrj5nsnbztlZjqsowg66ee7LaY64ukLlxuICovXG5hc3luYyBmdW5jdGlvbiBlbnN1cmVUZW1wbGF0ZURpY3RLZXlzKHRlbXBsYXRlS2V5czogVGVtcGxhdGVLZXlbXSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBbeyBUZW1wbGF0ZU1hbmFnZXIgfSwgeyBzb25hbXVEaWN0aW9uYXJ5IH1dID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGltcG9ydChcIi4uL3RlbXBsYXRlL3RlbXBsYXRlLW1hbmFnZXJcIiksXG4gICAgaW1wb3J0KFwiLi4vZGljdC9zb25hbXUtZGljdGlvbmFyeVwiKSxcbiAgXSk7XG5cbiAgY29uc3QgcmVxdWlyZWRLZXlzID0gdGVtcGxhdGVLZXlzLmZsYXRNYXAoXG4gICAgKHRlbXBsYXRlS2V5KSA9PiBUZW1wbGF0ZU1hbmFnZXIuZ2V0KHRlbXBsYXRlS2V5KS5nZXRSZXF1aXJlZERpY3RLZXlzKCkgPz8gW10sXG4gICk7XG4gIGlmIChyZXF1aXJlZEtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXdhaXQgc29uYW11RGljdGlvbmFyeS5lbnN1cmVEaWN0S2V5cyhbLi4ubmV3IFNldChyZXF1aXJlZEtleXMpXSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNjYWZmb2xkT3BlcmF0aW9uKG1ldGhvZDogc3RyaW5nLCBpbnB1dDogQ29tbWFuZElucHV0KTogUHJvbWlzZTxUb29saW5nUmVzdWx0PiB7XG4gIGNvbnN0IGRpcmVjdFRlbXBsYXRlID0gelxuICAgIC5lbnVtKFtcIm1vZGVsXCIsIFwibW9kZWxfdGVzdFwiLCBcInZpZXdfbGlzdFwiLCBcInZpZXdfZm9ybVwiXSlcbiAgICAuc2FmZVBhcnNlKG1ldGhvZCk7XG4gIGlmIChkaXJlY3RUZW1wbGF0ZS5zdWNjZXNzKSB7XG4gICAgYXdhaXQgZW5zdXJlU29uYW11KCk7XG4gICAgY29uc3QgeyBTb25hbXUgfSA9IGF3YWl0IGltcG9ydChcIi4uL2FwaS9zb25hbXVcIik7XG4gICAgY29uc3QgZW50aXR5SWQgPSByZXF1aXJlZFRleHQoaW5wdXQsIFwiZW50aXR5SWRcIik7XG4gICAgYXdhaXQgZW5zdXJlVGVtcGxhdGVEaWN0S2V5cyhbZGlyZWN0VGVtcGxhdGUuZGF0YV0pO1xuICAgIHJldHVybiBkaXJlY3RUZW1wbGF0ZS5kYXRhID09PSBcInZpZXdfbGlzdFwiXG4gICAgICA/IFNvbmFtdS5zeW5jZXIuZ2VuZXJhdGVUZW1wbGF0ZShcInZpZXdfbGlzdFwiLCB7IGVudGl0eUlkLCBleHRyYTogaW5wdXQuZXh0cmEgfSlcbiAgICAgIDogU29uYW11LnN5bmNlci5nZW5lcmF0ZVRlbXBsYXRlKGRpcmVjdFRlbXBsYXRlLmRhdGEsIHsgZW50aXR5SWQgfSk7XG4gIH1cbiAgY29uc3QgcmVuZGVyZWQgPSBhd2FpdCByZW5kZXJTY2FmZm9sZHMoaW5wdXQpO1xuICBjb25zdCB7IGFjY2VzcyB9ID0gYXdhaXQgaW1wb3J0KFwibm9kZTpmcy9wcm9taXNlc1wiKTtcbiAgY29uc3QgcGF0aCA9IGF3YWl0IGltcG9ydChcIm5vZGU6cGF0aFwiKTtcbiAgY29uc3QgeyBTb25hbXUgfSA9IGF3YWl0IGltcG9ydChcIi4uL2FwaS9zb25hbXVcIik7XG4gIGNvbnN0IGl0ZW1zID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgcmVuZGVyZWQuZmxhdE1hcCgoeyBlbnRpdHlJZCwgdGVtcGxhdGUsIGZpbGVzIH0pID0+XG4gICAgICBmaWxlcy5tYXAoYXN5bmMgKGZpbGUpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gcGF0aC5kZWZhdWx0LmpvaW4oXG4gICAgICAgICAgU29uYW11LmFwcFJvb3RQYXRoLFxuICAgICAgICAgIGZpbGUucGF0aC5yZXBsYWNlKFwiLzp0YXJnZXQvXCIsIFwiL3dlYi9cIiksXG4gICAgICAgICk7XG4gICAgICAgIGxldCBleGlzdHMgPSB0cnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGFjY2Vzcyh0YXJnZXQpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICBleGlzdHMgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBlbnRpdHlJZCwgdGVtcGxhdGUsIHRhcmdldCwgZXhpc3RzLCBjb250ZW50OiBmaWxlLmNvZGUgfTtcbiAgICAgIH0pLFxuICAgICksXG4gICk7XG4gIGlmIChtZXRob2QgPT09IFwic3RhdHVzXCIpIHJldHVybiBpdGVtcy5tYXAoKHsgY29udGVudDogX2NvbnRlbnQsIC4uLml0ZW0gfSkgPT4gaXRlbSk7XG4gIGlmIChtZXRob2QgPT09IFwicHJldmlld1wiIHx8IChtZXRob2QgPT09IFwiYmF0Y2hcIiAmJiBleHBsaWNpdGx5RHJ5UnVuKGlucHV0KSkpIHJldHVybiBpdGVtcztcblxuICAvLyDsi6TsoJzroZwg7YyM7J287J2EIOyTsOuKlCDqsr3smrDsl5Drp4wg7IKs7KCE7J2EIOqxtOuTnOumsOuLpChzdGF0dXMvcHJldmlldy9kcnktcnVu7J2AIOychOyXkOyEnCDrsJjtmZjrkKgpLlxuICBhd2FpdCBlbnN1cmVUZW1wbGF0ZURpY3RLZXlzKFsuLi5uZXcgU2V0KGl0ZW1zLm1hcCgoaXRlbSkgPT4gaXRlbS50ZW1wbGF0ZSkpXSk7XG5cbiAgY29uc3QgcmVzdWx0cyA9IFtdO1xuICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICBjb25zdCB7IGNvbnRlbnQ6IF9jb250ZW50LCAuLi5zdW1tYXJ5IH0gPSBpdGVtO1xuICAgIGlmIChpdGVtLmV4aXN0cyAmJiBpbnB1dC5vdmVyd3JpdGUgIT09IHRydWUpIHtcbiAgICAgIHJlc3VsdHMucHVzaCh7IC4uLnN1bW1hcnksIHN0YXR1czogXCJza2lwcGVkXCIgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgYXdhaXQgU29uYW11LnN5bmNlci5nZW5lcmF0ZVRlbXBsYXRlKFxuICAgICAgaXRlbS50ZW1wbGF0ZSxcbiAgICAgIHsgZW50aXR5SWQ6IGl0ZW0uZW50aXR5SWQgfSxcbiAgICAgIHsgb3ZlcndyaXRlOiBpbnB1dC5vdmVyd3JpdGUgPT09IHRydWUgfSxcbiAgICApO1xuICAgIHJlc3VsdHMucHVzaCh7IC4uLnN1bW1hcnksIHN0YXR1czogXCJ3cml0dGVuXCIgfSk7XG4gIH1cbiAgcmV0dXJuIHsgaXRlbXM6IHJlc3VsdHMgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbWlncmF0aW9uT3BlcmF0aW9uKG1ldGhvZDogc3RyaW5nLCBpbnB1dDogQ29tbWFuZElucHV0KTogUHJvbWlzZTxUb29saW5nUmVzdWx0PiB7XG4gIGxldCBzaGFkb3dUYXJnZXQ6IEV4dHJhY3Q8TWlncmF0aW9uVGFyZ2V0LCBcImZpeHR1cmVcIiB8IFwidGVzdFwiPiB8IHVuZGVmaW5lZDtcbiAgaWYgKG1ldGhvZCA9PT0gXCJzaGFkb3dcIikge1xuICAgIGNvbnN0IHJlcXVlc3RlZFRhcmdldCA9IHJlcXVpcmVkVGV4dChpbnB1dCwgXCJ0YXJnZXRcIik7XG4gICAgYXNzZXJ0TWlncmF0aW9uVGFyZ2V0KHJlcXVlc3RlZFRhcmdldCk7XG4gICAgYXNzZXJ0U2hhZG93TWlncmF0aW9uVGFyZ2V0KHJlcXVlc3RlZFRhcmdldCk7XG4gICAgc2hhZG93VGFyZ2V0ID0gcmVxdWVzdGVkVGFyZ2V0O1xuICB9XG5cbiAgYXdhaXQgZW5zdXJlU29uYW11KCk7XG4gIGNvbnN0IHsgTWlncmF0b3IgfSA9IGF3YWl0IGltcG9ydChcIi4uL21pZ3JhdGlvbi9taWdyYXRvclwiKTtcbiAgY29uc3QgbWlncmF0b3IgPSBuZXcgTWlncmF0b3IoKTtcbiAgaWYgKG1ldGhvZCA9PT0gXCJzdGF0dXNcIikgcmV0dXJuIG1pZ3JhdG9yLmdldFN0YXR1cygpO1xuICBpZiAobWV0aG9kID09PSBcImdlbmVyYXRlXCIpIHtcbiAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCBtaWdyYXRvci5nZXRTdGF0dXMoKTtcbiAgICBpZiAoIXN0YXR1cy5jb25ucy5zb21lKChjb25uZWN0aW9uKSA9PiBjb25uZWN0aW9uLnN0YXR1cyA9PT0gMCkpIHtcbiAgICAgIHRocm93IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKFwiUGVuZGluZyBtaWdyYXRpb25zIG11c3QgYmUgYXBwbGllZCBiZWZvcmUgZ2VuZXJhdGlvbi5cIiksIHtcbiAgICAgICAgY29kZTogXCJNSUdSQVRJT05fTk9UX1JFQURZXCIsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY291bnQ6IGF3YWl0IG1pZ3JhdG9yLmdlbmVyYXRlUHJlcGFyZWRDb2RlcygpIH07XG4gIH1cbiAgaWYgKG1ldGhvZCA9PT0gXCJydW5cIikge1xuICAgIGlmICghbXV0YXRpb25SZXF1ZXN0ZWQoaW5wdXQpKSByZXR1cm4geyBkcnlSdW46IHRydWUgfTtcbiAgICBjb25zdCB7IGdldFNvbmFtdUVudmlyb25tZW50IH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9lbnZcIik7XG4gICAgY29uc3QgZW52aXJvbm1lbnQgPSBnZXRTb25hbXVFbnZpcm9ubWVudCgpO1xuICAgIHJldHVybiBtaWdyYXRvci5hcHBseShlbnZpcm9ubWVudCA9PT0gXCJ0ZXN0XCIgPyBbXCJ0ZXN0XCIsIFwiZml4dHVyZVwiXSA6IFtlbnZpcm9ubWVudF0pO1xuICB9XG4gIGlmIChtZXRob2QgPT09IFwiY29ubmVjdGlvbnNcIikgcmV0dXJuIG1pZ3JhdG9yLmdldENvbm5lY3Rpb25zKCk7XG4gIGlmIChtZXRob2QgPT09IFwiYXBwbHlcIikge1xuICAgIGNvbnN0IHJhd1RhcmdldHMgPSBzdHJpbmdzKGlucHV0LCBcInRhcmdldHNcIik7XG4gICAgaWYgKHJhd1RhcmdldHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihcIk1pc3NpbmcgdGFyZ2V0cy5cIiksIHsgY29kZTogXCJNSVNTSU5HX0FSR1VNRU5UXCIsIGV4aXRDb2RlOiAyIH0pO1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXRzID0gcmF3VGFyZ2V0cy5tYXAoKHRhcmdldCkgPT4ge1xuICAgICAgYXNzZXJ0TWlncmF0aW9uVGFyZ2V0KHRhcmdldCk7XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH0pO1xuICAgIGlmIChtdXRhdGlvblJlcXVlc3RlZChpbnB1dCkpIHJldHVybiBtaWdyYXRvci5hcHBseSh0YXJnZXRzKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICB0YXJnZXRzLm1hcChhc3luYyAodGFyZ2V0KSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IG1pZ3JhdG9yLmdldENvbm5lY3Rpb25TdGF0dXModGFyZ2V0KTtcbiAgICAgICAgcmV0dXJuIG1pZ3JhdGlvblBsYW4odGFyZ2V0LCBzdGF0dXMucGVuZGluZyk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG4gIGlmIChtZXRob2QgPT09IFwic2hhZG93XCIpIHtcbiAgICBpZiAoc2hhZG93VGFyZ2V0ID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcihcIlNoYWRvdyB0YXJnZXQgdmFsaWRhdGlvbiB3YXMgc2tpcHBlZC5cIik7XG4gICAgaWYgKG11dGF0aW9uUmVxdWVzdGVkKGlucHV0KSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbWlncmF0b3IucnVuU2hhZG93VGVzdCh7IHRhcmdldDogc2hhZG93VGFyZ2V0IH0pO1xuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkocmVzdWx0KVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIG9rOiB0cnVlLFxuICAgICAgICAgICAgdGFyZ2V0OiBzaGFkb3dUYXJnZXQsXG4gICAgICAgICAgICBtaWdyYXRpb25zOiByZXN1bHQuZmxhdE1hcCgoeyBhcHBsaWVkIH0pID0+IGFwcGxpZWQpLFxuICAgICAgICAgIH1cbiAgICAgICAgOiByZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgbWlncmF0b3IuZ2V0Q29ubmVjdGlvblN0YXR1cyhzaGFkb3dUYXJnZXQpO1xuICAgIHJldHVybiBtaWdyYXRpb25QbGFuKHNoYWRvd1RhcmdldCwgc3RhdHVzLnBlbmRpbmcpO1xuICB9XG5cbiAgY29uc3QgdGFyZ2V0ID0gcmVxdWlyZWRUZXh0KGlucHV0LCBcInRhcmdldFwiKTtcbiAgYXNzZXJ0TWlncmF0aW9uVGFyZ2V0KHRhcmdldCk7XG4gIGlmIChtZXRob2QgPT09IFwiY29kZVwiKSByZXR1cm4gbWlncmF0b3IuZ2V0UHJlcGFyZWRDb2Rlcyh0YXJnZXQpO1xuXG4gIGNvbnN0IGFjdGlvbiA9XG4gICAgbWV0aG9kID09PSBcInJvbGxiYWNrXCIgfHwgdGV4dChpbnB1dCwgXCJhY3Rpb25cIikgPT09IFwicm9sbGJhY2tcIiA/IFwicm9sbGJhY2tcIiA6IFwiYXBwbHlcIjtcbiAgY29uc3QgbWlncmF0aW9ucyA9XG4gICAgYWN0aW9uID09PSBcImFwcGx5XCJcbiAgICAgID8gKGF3YWl0IG1pZ3JhdG9yLmdldENvbm5lY3Rpb25TdGF0dXModGFyZ2V0KSkucGVuZGluZ1xuICAgICAgOiAoYXdhaXQgbWlncmF0b3IuZ2V0TGF0ZXN0QXBwbGllZEJhdGNoKHRhcmdldCkpLmZpbGVzO1xuICBjb25zdCBwbGFuID0gYXdhaXQgbWlncmF0aW9uUGxhbih0YXJnZXQsIG1pZ3JhdGlvbnMsIGFjdGlvbik7XG4gIGlmIChtZXRob2QgIT09IFwicm9sbGJhY2tcIiB8fCAhbXV0YXRpb25SZXF1ZXN0ZWQoaW5wdXQpKSByZXR1cm4gcGxhbjtcbiAgcmV0dXJuIG1pZ3JhdG9yLnJvbGxiYWNrKFt0YXJnZXRdKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZml4dHVyZU9wZXJhdGlvbihtZXRob2Q6IHN0cmluZywgaW5wdXQ6IENvbW1hbmRJbnB1dCk6IFByb21pc2U8VG9vbGluZ1Jlc3VsdD4ge1xuICBhd2FpdCBlbnN1cmVTb25hbXUoKTtcbiAgY29uc3QgW2ZpeHR1cmVDb21tYW5kcywgeyBGaXh0dXJlTWFuYWdlciB9LCBmaXh0dXJlU2VydmljZSwgeyBTb25hbXUgfV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgaW1wb3J0KFwiLi4vYmluL2ZpeHR1cmVcIiksXG4gICAgaW1wb3J0KFwiLi4vdGVzdGluZy9maXh0dXJlLW1hbmFnZXJcIiksXG4gICAgaW1wb3J0KFwiLi9maXh0dXJlLXNlcnZpY2VcIiksXG4gICAgaW1wb3J0KFwiLi4vYXBpL3NvbmFtdVwiKSxcbiAgXSk7XG4gIGlmIChtZXRob2QgPT09IFwiaW5pdFwiKSB7XG4gICAgcmV0dXJuIG11dGF0aW9uUmVxdWVzdGVkKGlucHV0KSA/IGZpeHR1cmVDb21tYW5kcy5maXh0dXJlSW5pdENvbW1hbmQoKSA6IHsgZHJ5UnVuOiB0cnVlIH07XG4gIH1cbiAgaWYgKG1ldGhvZCA9PT0gXCJpbXBvcnRcIikge1xuICAgIGlmICghbXV0YXRpb25SZXF1ZXN0ZWQoaW5wdXQpKSByZXR1cm4geyBkcnlSdW46IHRydWUgfTtcbiAgICBGaXh0dXJlTWFuYWdlci5pbml0KCk7XG4gICAgYXdhaXQgRml4dHVyZU1hbmFnZXIuaW1wb3J0Rml4dHVyZShcbiAgICAgIHJlcXVpcmVkVGV4dChpbnB1dCwgXCJlbnRpdHlJZFwiKSxcbiAgICAgIHouYXJyYXkoei5udW1iZXIoKSkucGFyc2UoaW5wdXQucmVjb3JkSWRzKSxcbiAgICApO1xuICAgIGF3YWl0IEZpeHR1cmVNYW5hZ2VyLnN5bmMoKTtcbiAgICByZXR1cm4geyBpbXBvcnRlZDogdHJ1ZSB9O1xuICB9XG4gIGlmIChtZXRob2QgPT09IFwic3luY1wiKSB7XG4gICAgaWYgKCFtdXRhdGlvblJlcXVlc3RlZChpbnB1dCkpIHJldHVybiB7IGRyeVJ1bjogdHJ1ZSB9O1xuICAgIEZpeHR1cmVNYW5hZ2VyLmluaXQoKTtcbiAgICBhd2FpdCBGaXh0dXJlTWFuYWdlci5zeW5jKCk7XG4gICAgcmV0dXJuIHsgc3luY2VkOiB0cnVlIH07XG4gIH1cbiAgY29uc3QgbGVnYWN5Q29tbWFuZCA9IHouZW51bShbXCJnZW5cIiwgXCJmZXRjaFwiLCBcImV4cGxvcmVcIl0pLnBhcnNlKG1ldGhvZCk7XG4gIGNvbnN0IGlzVHJhbnNmZXIgPSBbXCJlbnRpdHlJZFwiLCBcInNvdXJjZVwiLCBcInRhcmdldFwiLCBcImZpZWxkXCIsIFwidmFsdWVzXCIsIFwicmVsYXRpb25zXCIsIFwiZGVwdGhcIl0uc29tZShcbiAgICAoa2V5KSA9PiBpbnB1dFtrZXldICE9PSB1bmRlZmluZWQsXG4gICk7XG4gIGlmICghaXNUcmFuc2Zlcikge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBmaXh0dXJlU2VydmljZS5ub3JtYWxpemVMZWdhY3lGaXh0dXJlQ29tbWFuZE9wdGlvbnMobGVnYWN5Q29tbWFuZCwgaW5wdXQpO1xuICAgIGNvbnN0IHN0cmF0ZWd5ID0gelxuICAgICAgLmVudW0oW1wic2FtcGxlXCIsIFwiaWRzXCIsIFwicXVlcnlcIiwgXCJmaWxlXCIsIFwicmVjZW50XCIsIFwicmFuZG9tXCJdKVxuICAgICAgLm9wdGlvbmFsKClcbiAgICAgIC5wYXJzZShvcHRpb25zLnN0cmF0ZWd5KTtcbiAgICBjb25zdCBmaXh0dXJlT3B0aW9ucyA9IHsgLi4ub3B0aW9ucywgc3RyYXRlZ3kgfSBzYXRpc2ZpZXMgRml4dHVyZUNvbW1hbmRPcHRpb25zO1xuICAgIGlmIChsZWdhY3lDb21tYW5kICE9PSBcImV4cGxvcmVcIiAmJiAhbXV0YXRpb25SZXF1ZXN0ZWQoaW5wdXQpKSB7XG4gICAgICByZXR1cm4geyBkcnlSdW46IHRydWUsIHJlcXVlc3Q6IGZpeHR1cmVPcHRpb25zIH07XG4gICAgfVxuICAgIGlmIChsZWdhY3lDb21tYW5kID09PSBcImdlblwiKSByZXR1cm4gZml4dHVyZUNvbW1hbmRzLmZpeHR1cmVHZW5Db21tYW5kKGZpeHR1cmVPcHRpb25zKTtcbiAgICBpZiAobGVnYWN5Q29tbWFuZCA9PT0gXCJleHBsb3JlXCIpIHJldHVybiBmaXh0dXJlQ29tbWFuZHMuZml4dHVyZUV4cGxvcmVDb21tYW5kKGZpeHR1cmVPcHRpb25zKTtcbiAgICByZXR1cm4gZml4dHVyZUNvbW1hbmRzLmZpeHR1cmVGZXRjaENvbW1hbmQoZml4dHVyZU9wdGlvbnMpO1xuICB9XG5cbiAgY29uc3QgZW50aXR5SWQgPSByZXF1aXJlZFRleHQoaW5wdXQsIFwiZW50aXR5SWRcIik7XG4gIGNvbnN0IHNvdXJjZSA9IHJlcXVpcmVkVGV4dChpbnB1dCwgXCJzb3VyY2VcIik7XG4gIGNvbnN0IHRhcmdldCA9IHJlcXVpcmVkVGV4dChpbnB1dCwgXCJ0YXJnZXRcIik7XG4gIGNvbnN0IGZpZWxkID0gcmVxdWlyZWRUZXh0KGlucHV0LCBcImZpZWxkXCIpO1xuICBjb25zdCB2YWx1ZXMgPSBzdHJpbmdzKGlucHV0LCBcInZhbHVlc1wiKTtcbiAgY29uc3QgcmVsYXRpb25zID0gcmVxdWlyZWRUZXh0KGlucHV0LCBcInJlbGF0aW9uc1wiKTtcbiAgLy8gQ0xJIOusuOuyleydtCBpbnRlZ2VyKHsgbWluOiAwIH0p7J2066+A66GcIOq0gOqzhCDsiJztmozrpbwg64GE64qUIGRlcHRoIDDsnYQg7ZeI7Jqp7ZWp64uI64ukLlxuICBjb25zdCBkZXB0aCA9IHoubnVtYmVyKCkuaW50KCkubm9ubmVnYXRpdmUoKS5zYWZlUGFyc2UoaW5wdXQuZGVwdGgpO1xuICBpZiAoXG4gICAgIU9iamVjdC5oYXNPd24oU29uYW11LmRiQ29uZmlnLCBzb3VyY2UpIHx8XG4gICAgIU9iamVjdC5oYXNPd24oU29uYW11LmRiQ29uZmlnLCB0YXJnZXQpIHx8XG4gICAgdmFsdWVzLmxlbmd0aCA9PT0gMCB8fFxuICAgICFbXCJpbmNsdWRlXCIsIFwiZXhjbHVkZVwiLCBcIm5vbmVcIl0uaW5jbHVkZXMocmVsYXRpb25zKSB8fFxuICAgICFkZXB0aC5zdWNjZXNzXG4gICkge1xuICAgIHRocm93IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKFwiSW52YWxpZCBmaXh0dXJlIHRyYW5zZmVyIHNlbGVjdG9yLlwiKSwge1xuICAgICAgY29kZTogXCJJTlZBTElEX0ZJWFRVUkVfVFJBTlNGRVJcIixcbiAgICAgIGV4aXRDb2RlOiAyLFxuICAgIH0pO1xuICB9XG4gIC8vIFNBRkVUWTogT2JqZWN0Lmhhc093biBjaGVja3MgYWJvdmUgZXN0YWJsaXNoIGJvdGgga2V5cyBhcyBjb25maWd1cmVkIERCIHByZXNldHMuXG4gIGNvbnN0IHNvdXJjZUtleSA9IHNvdXJjZSBhcyBrZXlvZiB0eXBlb2YgU29uYW11LmRiQ29uZmlnO1xuICAvLyBTQUZFVFk6IE9iamVjdC5oYXNPd24gY2hlY2tzIGFib3ZlIGVzdGFibGlzaCBib3RoIGtleXMgYXMgY29uZmlndXJlZCBEQiBwcmVzZXRzLlxuICBjb25zdCB0YXJnZXRLZXkgPSB0YXJnZXQgYXMga2V5b2YgdHlwZW9mIFNvbmFtdS5kYkNvbmZpZztcbiAgY29uc3QgcmVjb3JkcyA9IChcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHZhbHVlcy5tYXAoKHZhbHVlKSA9PlxuICAgICAgICBGaXh0dXJlTWFuYWdlci5nZXRGaXh0dXJlcyhcbiAgICAgICAgICBzb3VyY2VLZXksXG4gICAgICAgICAgdGFyZ2V0S2V5LFxuICAgICAgICAgIHsgZW50aXR5SWQsIGZpZWxkLCB2YWx1ZSwgc2VhcmNoVHlwZTogXCJlcXVhbHNcIiB9LFxuICAgICAgICAgIHsgaW5jbHVkZVJlbGF0aW9uczogcmVsYXRpb25zID09PSBcImluY2x1ZGVcIiwgbWF4RGVwdGg6IGRlcHRoLmRhdGEgfSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKVxuICApLmZsYXQoKTtcbiAgaWYgKGV4cGxpY2l0bHlEcnlSdW4oaW5wdXQpKSByZXR1cm4geyBkcnlSdW46IHRydWUsIHJlY29yZHMgfTtcbiAgaWYgKHJlY29yZHMubGVuZ3RoID4gMCkgYXdhaXQgRml4dHVyZU1hbmFnZXIuaW5zZXJ0Rml4dHVyZXModGFyZ2V0S2V5LCByZWNvcmRzKTtcbiAgcmV0dXJuIHsgcmVjb3JkcyB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBidWlsZE9wZXJhdGlvbihtZXRob2Q6IHN0cmluZyk6IFByb21pc2U8VG9vbGluZ1Jlc3VsdD4ge1xuICBjb25zdCB7IGJ1aWxkQXBpQ29tbWFuZCwgYnVpbGRXZWJDb21tYW5kIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9iaW4vYnVpbGQtY29uZmlnXCIpO1xuICBpZiAobWV0aG9kID09PSBcImFwaVwiKSByZXR1cm4gYnVpbGRBcGlDb21tYW5kKCk7XG4gIGlmIChtZXRob2QgPT09IFwid2ViXCIpIHJldHVybiBidWlsZFdlYkNvbW1hbmQoKTtcbiAgYXdhaXQgYnVpbGRBcGlDb21tYW5kKCk7XG4gIHJldHVybiBidWlsZFdlYkNvbW1hbmQoeyBza2lwSWZNaXNzaW5nOiB0cnVlIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiB0ZXN0T3BlcmF0aW9uKG1ldGhvZDogc3RyaW5nLCBpbnB1dDogQ29tbWFuZElucHV0KTogUHJvbWlzZTxUb29saW5nUmVzdWx0PiB7XG4gIGNvbnN0IHsgY3JlYXRlRGVmYXVsdFRlc3RSdW5DbGllbnQgfSA9IGF3YWl0IGltcG9ydChcIi4vdGVzdC1ydW4tY2xpZW50XCIpO1xuICBjb25zdCBjbGllbnQgPSBjcmVhdGVEZWZhdWx0VGVzdFJ1bkNsaWVudCgpO1xuICBpZiAobWV0aG9kID09PSBcInN0YXR1c1wiKSByZXR1cm4gY2xpZW50LnN0YXR1cygpO1xuICBjb25zdCByZXF1ZXN0ID0ge1xuICAgIGZpbGVzOiB6LmFycmF5KHouc3RyaW5nKCkpLmNhdGNoKFtdKS5wYXJzZShpbnB1dC5maWxlcyksXG4gICAgcGF0dGVybjogei5zdHJpbmcoKS5vcHRpb25hbCgpLnBhcnNlKGlucHV0LnBhdHRlcm4pLFxuICAgIHRyYWNlczogaW5wdXQudHJhY2VzID09PSB0cnVlLFxuICB9O1xuICByZXR1cm4geyByZXF1ZXN0LCByZXN1bHQ6IGF3YWl0IGNsaWVudC5ydW4ocmVxdWVzdCkgfTtcbn1cblxuY29uc3QgYmV0dGVyQXV0aFBsdWdpblNjaGVtYSA9IHouZW51bShbXG4gIFwiMmZhXCIsXG4gIFwiYWRtaW5cIixcbiAgXCJhbm9ueW1vdXNcIixcbiAgXCJhcGkta2V5XCIsXG4gIFwiYXVkaXQtbG9nXCIsXG4gIFwiand0XCIsXG4gIFwib3JnYW5pemF0aW9uXCIsXG4gIFwicGFzc2tleVwiLFxuICBcInBob25lLW51bWJlclwiLFxuICBcInNzb1wiLFxuICBcInVzZXJuYW1lXCIsXG5dKTtcblxuYXN5bmMgZnVuY3Rpb24gYXV0aE9wZXJhdGlvbihtZXRob2Q6IHN0cmluZywgaW5wdXQ6IENvbW1hbmRJbnB1dCk6IFByb21pc2U8VG9vbGluZ1Jlc3VsdD4ge1xuICBjb25zdCB7IGFkZENvbXBhbmlvbnNUb0VudGl0aWVzLCBnZW5lcmF0ZUJldHRlckF1dGhFbnRpdGllcyB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vYXV0aFwiKTtcbiAgaWYgKG1ldGhvZCA9PT0gXCJhZGRDb21wYW5pb25zXCIpIHJldHVybiBhZGRDb21wYW5pb25zVG9FbnRpdGllcygpO1xuICAvLyBwbHVnaW5z64qUIOyEoO2DnSDsmLXshZjsnbTrr4DroZwg7IOd65617ZWY66m0IGNvcmUg7JeU7Yuw7Yuw66eMIOyDneyEse2VqeuLiOuLpC5cbiAgY29uc3QgcGx1Z2lucyA9IHouYXJyYXkoYmV0dGVyQXV0aFBsdWdpblNjaGVtYSkucGFyc2UoXG4gICAgKG9wdGlvbmFsVGV4dChpbnB1dCwgXCJwbHVnaW5zXCIpID8/IFwiXCIpXG4gICAgICAuc3BsaXQoXCIsXCIpXG4gICAgICAubWFwKChwbHVnaW4pID0+IHBsdWdpbi50cmltKCkpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pLFxuICApO1xuICByZXR1cm4gZ2VuZXJhdGVCZXR0ZXJBdXRoRW50aXRpZXMoeyBwbHVnaW5zIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBpMThuT3BlcmF0aW9uKG1ldGhvZDogc3RyaW5nLCBpbnB1dDogQ29tbWFuZElucHV0KTogUHJvbWlzZTxUb29saW5nUmVzdWx0PiB7XG4gIGF3YWl0IGVuc3VyZVNvbmFtdSgpO1xuICBjb25zdCB7IHNvbmFtdURpY3Rpb25hcnkgfSA9IGF3YWl0IGltcG9ydChcIi4uL2RpY3Qvc29uYW11LWRpY3Rpb25hcnlcIik7XG4gIGlmIChtZXRob2QgPT09IFwibGlzdFwiKSB7XG4gICAgY29uc3QgZGljdGlvbmFyeSA9IGF3YWl0IHNvbmFtdURpY3Rpb25hcnkuZ2V0RGljdGlvbmFyeSgpO1xuICAgIGNvbnN0IGxvY2FsZSA9IHRleHQoaW5wdXQsIFwibG9jYWxlXCIpO1xuICAgIHJldHVybiBsb2NhbGUgPT09IHVuZGVmaW5lZFxuICAgICAgPyBkaWN0aW9uYXJ5XG4gICAgICA6IHtcbiAgICAgICAgICAuLi5kaWN0aW9uYXJ5LFxuICAgICAgICAgIGxvY2FsZXM6IFtsb2NhbGVdLFxuICAgICAgICAgIHJvd3M6IGRpY3Rpb25hcnkucm93cy5tYXAoKHJvdykgPT4gKHtcbiAgICAgICAgICAgIGtleTogcm93LmtleSxcbiAgICAgICAgICAgIHNvdXJjZTogcm93LnNvdXJjZSxcbiAgICAgICAgICAgIFtsb2NhbGVdOiByb3dbbG9jYWxlXSxcbiAgICAgICAgICB9KSksXG4gICAgICAgIH07XG4gIH1cbiAgaWYgKG1ldGhvZCA9PT0gXCJjaGVja1wiKSB7XG4gICAgY29uc3QgZGljdGlvbmFyeSA9IGF3YWl0IHNvbmFtdURpY3Rpb25hcnkuZ2V0RGljdGlvbmFyeSgpO1xuICAgIHJldHVybiBzb25hbXVEaWN0aW9uYXJ5LmNoZWNrVXNhZ2UoZGljdGlvbmFyeS5yb3dzLm1hcCgocm93KSA9PiByb3cua2V5KSk7XG4gIH1cbiAgaWYgKG1ldGhvZCA9PT0gXCJleHBvcnRcIiB8fCBtZXRob2QgPT09IFwiaW1wb3J0XCIpIHtcbiAgICBjb25zdCBmaWxlID0gcmVxdWlyZWRUZXh0KGlucHV0LCBcImZpbGVcIik7XG4gICAgaWYgKGV4cGxpY2l0bHlEcnlSdW4oaW5wdXQpKSByZXR1cm4geyBvcGVyYXRpb246IG1ldGhvZCwgZHJ5UnVuOiB0cnVlIH07XG4gICAgY29uc3QgeyByZWFkRmlsZSwgd3JpdGVGaWxlIH0gPSBhd2FpdCBpbXBvcnQoXCJub2RlOmZzL3Byb21pc2VzXCIpO1xuICAgIGNvbnN0IGZvcm1hdCA9IHRleHQoaW5wdXQsIFwiZm9ybWF0XCIpID09PSBcImpzb25cIiA/IFwianNvblwiIDogXCJ3b3JrYm9va1wiO1xuICAgIGlmIChtZXRob2QgPT09IFwiZXhwb3J0XCIgJiYgZm9ybWF0ID09PSBcIndvcmtib29rXCIpIHtcbiAgICAgIGNvbnN0IHsgYnVmZmVyIH0gPSBhd2FpdCBzb25hbXVEaWN0aW9uYXJ5LmV4cG9ydFRvRXhjZWwoKTtcbiAgICAgIGF3YWl0IHdyaXRlRmlsZShmaWxlLCBidWZmZXIpO1xuICAgICAgcmV0dXJuIHsgZXhwb3J0ZWQ6IDEgfTtcbiAgICB9XG4gICAgaWYgKG1ldGhvZCA9PT0gXCJpbXBvcnRcIiAmJiBmb3JtYXQgPT09IFwid29ya2Jvb2tcIikge1xuICAgICAgcmV0dXJuIHNvbmFtdURpY3Rpb25hcnkuaW1wb3J0RnJvbUV4Y2VsKGF3YWl0IHJlYWRGaWxlKGZpbGUpKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcImV4cG9ydFwiKSB7XG4gICAgICBjb25zdCBkaWN0aW9uYXJ5ID0gYXdhaXQgc29uYW11RGljdGlvbmFyeS5nZXREaWN0aW9uYXJ5KCk7XG4gICAgICBjb25zdCBsb2NhbGUgPSB0ZXh0KGlucHV0LCBcImxvY2FsZVwiKTtcbiAgICAgIGNvbnN0IHJvd3MgPSBkaWN0aW9uYXJ5LnJvd3MubWFwKFxuICAgICAgICAoeyBrZXksIHNvdXJjZTogX3NvdXJjZSwgaXNGdW5jdGlvbjogX2lzRnVuY3Rpb24sIC4uLnZhbHVlcyB9KSA9PiAoe1xuICAgICAgICAgIGtleSxcbiAgICAgICAgICB2YWx1ZXM6XG4gICAgICAgICAgICBsb2NhbGUgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IHZhbHVlc1xuICAgICAgICAgICAgICA6IHsgW2xvY2FsZV06IHouc3RyaW5nKCkuY2F0Y2goXCJcIikucGFyc2UodmFsdWVzW2xvY2FsZV0pIH0sXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICAgIGF3YWl0IHdyaXRlRmlsZShmaWxlLCBKU09OLnN0cmluZ2lmeShyb3dzLCBudWxsLCAyKSk7XG4gICAgICByZXR1cm4geyBleHBvcnRlZDogcm93cy5sZW5ndGggfTtcbiAgICB9XG5cbiAgICBjb25zdCBlbnRyaWVzID0gcGFyc2VKc29uKFxuICAgICAgKGF3YWl0IHJlYWRGaWxlKGZpbGUpKS50b1N0cmluZyhcInV0ZjhcIiksXG4gICAgICBcIkkxOE5fSU5WQUxJRF9KU09OXCIsXG4gICAgICBpMThuRW50cmllc1NjaGVtYSxcbiAgICApO1xuICAgIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCBzb25hbXVEaWN0aW9uYXJ5LmdldERpY3Rpb25hcnkoKTtcbiAgICBjb25zdCBleGlzdGluZ0tleXMgPSBuZXcgU2V0KGN1cnJlbnQucm93cy5tYXAoKHsga2V5IH0pID0+IGtleSkpO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgaWYgKGV4aXN0aW5nS2V5cy5oYXMoZW50cnkua2V5KSkge1xuICAgICAgICBhd2FpdCBzb25hbXVEaWN0aW9uYXJ5LnVwZGF0ZUVudHJ5KHtcbiAgICAgICAgICBvbGRLZXk6IGVudHJ5LmtleSxcbiAgICAgICAgICBuZXdLZXk6IGVudHJ5LmtleSxcbiAgICAgICAgICBzb3VyY2U6IFwicHJvamVjdFwiLFxuICAgICAgICAgIHZhbHVlczogZW50cnkudmFsdWVzLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHNvbmFtdURpY3Rpb25hcnkuY3JlYXRlRW50cnkoZW50cnkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBpbXBvcnRlZDogZW50cmllcy5sZW5ndGggfTtcbiAgfVxuICBjb25zdCBrZXkgPSByZXF1aXJlZFRleHQoaW5wdXQsIFwia2V5XCIpO1xuICBpZiAobWV0aG9kID09PSBcImNyZWF0ZVwiKSB7XG4gICAgaWYgKGV4cGxpY2l0bHlEcnlSdW4oaW5wdXQpKSByZXR1cm4geyBvcGVyYXRpb246IFwiY3JlYXRlXCIsIGlucHV0LCBkcnlSdW46IHRydWUgfTtcbiAgICByZXR1cm4gc29uYW11RGljdGlvbmFyeS5jcmVhdGVFbnRyeSh7XG4gICAgICBrZXksXG4gICAgICB2YWx1ZXM6IGRpY3Rpb25hcnlWYWx1ZXNTY2hlbWEucGFyc2UoaW5wdXQudmFsdWVzKSxcbiAgICB9KTtcbiAgfVxuICBpZiAobWV0aG9kID09PSBcInVwZGF0ZVwiKSB7XG4gICAgaWYgKGV4cGxpY2l0bHlEcnlSdW4oaW5wdXQpKSByZXR1cm4geyBvcGVyYXRpb246IFwidXBkYXRlXCIsIGlucHV0LCBkcnlSdW46IHRydWUgfTtcbiAgICBjb25zdCBleHBsaWNpdFNvdXJjZSA9IHRleHQoaW5wdXQsIFwic291cmNlXCIpO1xuICAgIC8vIHNvdXJjZeulvCDsg53rnrXtlZjrqbQg7IKs7KCE7JeQIOuTseuhneuQnCDquLDsobQgc291cmNl66W8IOycoOyngO2VtCBlbnRpdHkg7ZWt66qp7J20IHByb2plY3Qgb3ZlcnJpZGXroZwg642u7J207KeAIOyViuqyjCDtlanri4jri6QuXG4gICAgY29uc3QgcmVzb2x2ZWRTb3VyY2UgPVxuICAgICAgZXhwbGljaXRTb3VyY2UgPT09IHVuZGVmaW5lZFxuICAgICAgICA/ICgoYXdhaXQgc29uYW11RGljdGlvbmFyeS5nZXREaWN0aW9uYXJ5KCkpLnJvd3MuZmluZCgocm93KSA9PiByb3cua2V5ID09PSBrZXkpPy5zb3VyY2UgPz9cbiAgICAgICAgICBcInByb2plY3RcIilcbiAgICAgICAgOiBleHBsaWNpdFNvdXJjZTtcbiAgICByZXR1cm4gc29uYW11RGljdGlvbmFyeS51cGRhdGVFbnRyeSh7XG4gICAgICBvbGRLZXk6IGtleSxcbiAgICAgIG5ld0tleTogdGV4dChpbnB1dCwgXCJuZXdLZXlcIikgPz8ga2V5LFxuICAgICAgc291cmNlOiBkaWN0aW9uYXJ5U291cmNlU2NoZW1hLnBhcnNlKHJlc29sdmVkU291cmNlKSxcbiAgICAgIHZhbHVlczogZGljdGlvbmFyeVZhbHVlc1NjaGVtYS5wYXJzZShpbnB1dC52YWx1ZXMpLFxuICAgIH0pO1xuICB9XG4gIGlmICghbXV0YXRpb25SZXF1ZXN0ZWQoaW5wdXQpKSByZXR1cm4geyBrZXksIG9wZXJhdGlvbjogXCJyZW1vdmVcIiwgZHJ5UnVuOiB0cnVlIH07XG4gIHJldHVybiBzb25hbXVEaWN0aW9uYXJ5LmRlbGV0ZUVudHJ5KGtleSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRhc2tPcGVyYXRpb24obWV0aG9kOiBzdHJpbmcsIGlucHV0OiBDb21tYW5kSW5wdXQpOiBQcm9taXNlPFRvb2xpbmdSZXN1bHQ+IHtcbiAgYXdhaXQgZW5zdXJlU29uYW11KCk7XG4gIGNvbnN0IHsgU29uYW11IH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9hcGkvc29uYW11XCIpO1xuICBjb25zdCB3b3JrZmxvd3MgPSBTb25hbXUud29ya2Zsb3dzO1xuICBjb25zdCBiYWNrZW5kID0gd29ya2Zsb3dzLmJhY2tlbmQ7XG4gIGlmIChtZXRob2QgPT09IFwiZGVmaW5pdGlvbnNcIikgcmV0dXJuIHsgZGVmaW5pdGlvbnM6IHdvcmtmbG93cy53b3JrZmxvd0RlZmluaXRpb25zIH07XG4gIGlmIChtZXRob2QgPT09IFwicnVuc1wiKSByZXR1cm4gYmFja2VuZC5saXN0V29ya2Zsb3dSdW5zKHsgbGltaXQ6IDUwIH0pO1xuICBjb25zdCB3b3JrZmxvd1J1bklkID0gcmVxdWlyZWRUZXh0KGlucHV0LCBcInJ1bklkXCIpO1xuICBpZiAobWV0aG9kID09PSBcInNob3dcIikgcmV0dXJuIGJhY2tlbmQuZ2V0V29ya2Zsb3dSdW4oeyB3b3JrZmxvd1J1bklkIH0pO1xuICBpZiAobWV0aG9kID09PSBcIndhdGNoXCIpIHtcbiAgICBjb25zdCB7IGlzRGVlcFN0cmljdEVxdWFsIH0gPSBhd2FpdCBpbXBvcnQoXCJub2RlOnV0aWxcIik7XG4gICAgcmV0dXJuIChhc3luYyBmdW5jdGlvbiogd2F0Y2goKSB7XG4gICAgICBsZXQgcHJldmlvdXM6IG9iamVjdCB8IHVuZGVmaW5lZDtcbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgYmFja2VuZC5nZXRXb3JrZmxvd1J1bih7IHdvcmtmbG93UnVuSWQgfSk7XG4gICAgICAgIGlmIChzbmFwc2hvdCA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKGBXb3JrZmxvdyBydW4gbm90IGZvdW5kOiAke3dvcmtmbG93UnVuSWR9YCksIHtcbiAgICAgICAgICAgIGNvZGU6IFwiVEFTS19SVU5fTk9UX0ZPVU5EXCIsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmF3U3RhdGUgPSBzbmFwc2hvdC5zdGF0dXMgPT09IFwic3VjY2VlZGVkXCIgPyBcImNvbXBsZXRlZFwiIDogc25hcHNob3Quc3RhdHVzO1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHJhd1N0YXRlID09PSBcImNhbmNlbGVkXCIgPyBcImNhbmNlbGxlZFwiIDogcmF3U3RhdGU7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB7IC4uLnNuYXBzaG90LCBzdGF0ZSB9O1xuICAgICAgICBpZiAoIWlzRGVlcFN0cmljdEVxdWFsKGN1cnJlbnQsIHByZXZpb3VzKSkge1xuICAgICAgICAgIHByZXZpb3VzID0gc3RydWN0dXJlZENsb25lKGN1cnJlbnQpO1xuICAgICAgICAgIHlpZWxkIGN1cnJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFtcImNvbXBsZXRlZFwiLCBcImZhaWxlZFwiLCBcImNhbmNlbGxlZFwiXS5pbmNsdWRlcyhzdGF0ZSkpIHJldHVybjtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMV8wMDApKTtcbiAgICAgIH1cbiAgICB9KSgpO1xuICB9XG4gIGlmIChtZXRob2QgPT09IFwic3RlcHNcIikgcmV0dXJuIGJhY2tlbmQubGlzdFN0ZXBBdHRlbXB0cyh7IHdvcmtmbG93UnVuSWQsIGxpbWl0OiAxMDAgfSk7XG4gIGlmICghbXV0YXRpb25SZXF1ZXN0ZWQoaW5wdXQpKSByZXR1cm4geyBvcGVyYXRpb246IG1ldGhvZCwgd29ya2Zsb3dSdW5JZCwgZHJ5UnVuOiB0cnVlIH07XG4gIGlmIChtZXRob2QgPT09IFwicGF1c2VcIikgcmV0dXJuIGJhY2tlbmQucGF1c2VXb3JrZmxvd1J1bih7IHdvcmtmbG93UnVuSWQgfSk7XG4gIGlmIChtZXRob2QgPT09IFwicmVzdW1lXCIpIHJldHVybiBiYWNrZW5kLnJlc3VtZVdvcmtmbG93UnVuKHsgd29ya2Zsb3dSdW5JZCB9KTtcbiAgcmV0dXJuIGJhY2tlbmQuY2FuY2VsV29ya2Zsb3dSdW4oeyB3b3JrZmxvd1J1bklkIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjZGRSb290UGF0aCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBbeyBTb25hbXUgfSwgcGF0aF0gPSBhd2FpdCBQcm9taXNlLmFsbChbaW1wb3J0KFwiLi4vYXBpL3NvbmFtdVwiKSwgaW1wb3J0KFwibm9kZTpwYXRoXCIpXSk7XG4gIHJldHVybiBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCBcImNvbnRyYWN0XCIpO1xufVxuXG5jb25zdCBwcmFjdGljZVNlcXVlbmNlUGF0dGVybiA9IC9ecChbMC05XSspLS87XG5cbi8vIOydtOumhOydgCDtjIzsnbzrqoXqs7wg7Iqk7YWBIOuzuOusuOydmCDrrLjsnpDsl7Qg66as7YSw65+07JeQIOq3uOuMgOuhnCDrk6TslrTqsIDrr4DroZwsXG4vLyDqsr3roZwg6rWs67aE7J6QL+yDgeychCDqsr3roZwg7LC47KGwL+uUsOyYtO2RnC/sl63siqzrnpjsi5zrpbwg7JuQ7LKcIOywqOuLqO2VmOuKlCDrrLjsnpDrp4wg7ZeI7Jqp7ZWp64uI64ukLlxuY29uc3QgcHJhY3RpY2VOYW1lUGF0dGVybiA9IC9eW0EtWmEtejAtOV1bQS1aYS16MC05Ll8tXSokLztcblxuZnVuY3Rpb24gaW52YWxpZFByYWN0aWNlTmFtZShuYW1lOiBzdHJpbmcpOiBFcnJvciB7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKFxuICAgIG5ldyBFcnJvcihcbiAgICAgIGBJbnZhbGlkIHByYWN0aWNlIG5hbWU6ICR7bmFtZX0uIFVzZSBsZXR0ZXJzLCBkaWdpdHMsIFwiLlwiLCBcIi1cIiwgYW5kIFwiX1wiIG9ubHksIHN0YXJ0aW5nIHdpdGggYSBsZXR0ZXIgb3IgZGlnaXQuYCxcbiAgICApLFxuICAgIHsgY29kZTogXCJJTlZBTElEX1BSQUNUSUNFX05BTUVcIiwgZXhpdENvZGU6IDIgfSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gaW52YWxpZFByYWN0aWNlRGlyZWN0b3J5KGRpcmVjdG9yeTogc3RyaW5nKTogRXJyb3Ige1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoYFByYWN0aWNlIGRpcmVjdG9yeSBlc2NhcGVzIHRoZSBBUEkgcm9vdDogJHtkaXJlY3Rvcnl9YCksIHtcbiAgICBjb2RlOiBcIklOVkFMSURfUFJBQ1RJQ0VfUEFUSFwiLFxuICAgIGV4aXRDb2RlOiAyLFxuICB9KTtcbn1cblxuLyoqXG4gKiBgc3JjL3ByYWN0aWNlc2Ag7JWE656Y7JeQIOuLpOydjCDsi5ztgIDsiqQg67KI7Zi466W8IOqwgOynhCBwcmFjdGljZSDsiqTthYEg7YyM7J287J2EIOunjOuTreuLiOuLpC5cbiAqXG4gKiDqtawgQ0xJKGBzdHViIHByYWN0aWNlYCnsnZgg7YyM7J2866qFIOq3nOy5meqzvCDsiqTthYEg67O466y47J2EIOq3uOuMgOuhnCDsnKDsp4Dtlanri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0dWJQcmFjdGljZU9wZXJhdGlvbihpbnB1dDogQ29tbWFuZElucHV0KTogUHJvbWlzZTxUb29saW5nUmVzdWx0PiB7XG4gIGNvbnN0IG5hbWUgPSByZXF1aXJlZFRleHQoaW5wdXQsIFwibmFtZVwiKTtcbiAgaWYgKCFwcmFjdGljZU5hbWVQYXR0ZXJuLnRlc3QobmFtZSkpIHRocm93IGludmFsaWRQcmFjdGljZU5hbWUobmFtZSk7XG4gIGF3YWl0IGVuc3VyZVNvbmFtdSgpO1xuICBjb25zdCBbeyBTb25hbXUgfSwgeyBjb25zdGFudHMgfSwgeyBta2Rpciwgb3BlbiwgcmVhZGRpciwgcmVhbHBhdGggfSwgcGF0aF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgaW1wb3J0KFwiLi4vYXBpL3NvbmFtdVwiKSxcbiAgICBpbXBvcnQoXCJub2RlOmZzXCIpLFxuICAgIGltcG9ydChcIm5vZGU6ZnMvcHJvbWlzZXNcIiksXG4gICAgaW1wb3J0KFwibm9kZTpwYXRoXCIpLFxuICBdKTtcbiAgY29uc3QgcHJhY3RpY2VEaXJlY3RvcnkgPSBwYXRoLmRlZmF1bHQuam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwic3JjXCIsIFwicHJhY3RpY2VzXCIpO1xuICBhd2FpdCBta2RpcihwcmFjdGljZURpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIC8vIGNkZC1zZXJ2aWNl7JmAIOqwmeydtCDsi6TsoJwg6rK966Gc6rmM7KeAIO2ZleyduO2VtCwgc3ltbGlua+uhnCDsl7DqsrDrkJwgcHJhY3RpY2VzIOuUlOugie2EsOumrOqwgFxuICAvLyBhcGkgcm9vdCDrsJbsnYQg6rCA66as7YKk64qUIOqyveyasOulvCDssKjri6jtlanri4jri6QuXG4gIGNvbnN0IFtjYW5vbmljYWxBcGlSb290LCBjYW5vbmljYWxEaXJlY3RvcnldID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIHJlYWxwYXRoKFNvbmFtdS5hcGlSb290UGF0aCksXG4gICAgcmVhbHBhdGgocHJhY3RpY2VEaXJlY3RvcnkpLFxuICBdKTtcbiAgY29uc3QgZGlyZWN0b3J5UmVsYXRpdmUgPSBwYXRoLmRlZmF1bHQucmVsYXRpdmUoY2Fub25pY2FsQXBpUm9vdCwgY2Fub25pY2FsRGlyZWN0b3J5KTtcbiAgaWYgKGRpcmVjdG9yeVJlbGF0aXZlLnN0YXJ0c1dpdGgoXCIuLlwiKSB8fCBwYXRoLmRlZmF1bHQuaXNBYnNvbHV0ZShkaXJlY3RvcnlSZWxhdGl2ZSkpIHtcbiAgICB0aHJvdyBpbnZhbGlkUHJhY3RpY2VEaXJlY3RvcnkocHJhY3RpY2VEaXJlY3RvcnkpO1xuICB9XG4gIGNvbnN0IGZpbGVOYW1lcyA9IGF3YWl0IHJlYWRkaXIocHJhY3RpY2VEaXJlY3RvcnkpO1xuICBjb25zdCBtYXhTZXF1ZW5jZSA9IGZpbGVOYW1lc1xuICAgIC5maWx0ZXIoKGZpbGVOYW1lKSA9PiBmaWxlTmFtZS5zdGFydHNXaXRoKFwicFwiKSAmJiBmaWxlTmFtZS5lbmRzV2l0aChcIi50c1wiKSlcbiAgICAucmVkdWNlKChsYXJnZXN0LCBmaWxlTmFtZSkgPT4ge1xuICAgICAgY29uc3QgbWF0Y2hlZCA9IHByYWN0aWNlU2VxdWVuY2VQYXR0ZXJuLmV4ZWMoZmlsZU5hbWUpO1xuICAgICAgcmV0dXJuIG1hdGNoZWQgPT09IG51bGwgPyBsYXJnZXN0IDogTWF0aC5tYXgobGFyZ2VzdCwgTnVtYmVyLnBhcnNlSW50KG1hdGNoZWRbMV0sIDEwKSk7XG4gICAgfSwgMCk7XG5cbiAgY29uc3QgZmlsZU5hbWUgPSBgcCR7bWF4U2VxdWVuY2UgKyAxfS0ke25hbWV9LnRzYDtcbiAgLy8g7J2066aEIO2MqO2EtOydtCDqsr3roZwg6rWs67aE7J6Q66W8IOywqOuLqO2VmOuvgOuhnCDtjIzsnbzrqoXsnYAg7ZWt7IOBIOydtCDrlJTroInthLDrpqzsnZgg7KeB6rOEIOyekOyLneyeheuLiOuLpC5cbiAgLy8g6rK966Gc64qUIOyEpOygleuQnCDqsJIg6re464yA66GcIOuPjOugpOyjvOqzoCwg7YOI7LacIOyXrOu2gOuKlCDsnITsnZggY2Fub25pY2FsIOqygOyCrOuhnCDtjJDri6jtlanri4jri6QuXG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5kZWZhdWx0LnJlc29sdmUocHJhY3RpY2VEaXJlY3RvcnksIGZpbGVOYW1lKTtcbiAgY29uc3Qgc3R1YkNvZGUgPSBbXG4gICAgYGltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCJzb25hbXVcIjtgLFxuICAgIFwiXCIsXG4gICAgYGNvbnNvbGUuY2xlYXIoKTtgLFxuICAgIGBjb25zb2xlLmxvZyhcIiR7ZmlsZU5hbWV9XCIpO2AsXG4gICAgXCJcIixcbiAgICBgU29uYW11LnJ1blNjcmlwdChhc3luYyAoKSA9PiB7YCxcbiAgICBgIC8vIFRPRE9gLFxuICAgIGB9KTtgLFxuICAgIFwiXCIsXG4gIF0uam9pbihcIlxcblwiKTtcbiAgbGV0IGhhbmRsZTtcbiAgdHJ5IHtcbiAgICAvLyDquLDsobQg7YyM7J287J2EIHRydW5jYXRl7ZWY7KeAIOyViuuPhOuhnSDrsLDtg4Ag7IOd7ISx7ZWY6rOgLCDstZzsooUg6rK966Gc7J2YIHN5bWxpbmvripQg65Sw65286rCA7KeAIOyViuyKteuLiOuLpC5cbiAgICBoYW5kbGUgPSBhd2FpdCBvcGVuKFxuICAgICAgZmlsZVBhdGgsXG4gICAgICBjb25zdGFudHMuT19XUk9OTFkgfCBjb25zdGFudHMuT19DUkVBVCB8IGNvbnN0YW50cy5PX0VYQ0wgfCBjb25zdGFudHMuT19OT0ZPTExPVyxcbiAgICAgIDBvNjY2LFxuICAgICk7XG4gICAgYXdhaXQgaGFuZGxlLndyaXRlRmlsZShzdHViQ29kZSwgXCJ1dGY4XCIpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIFNBRkVUWTogbm9kZTpmcyBvcGVuIOyLpO2MqOydmCBjb2Rl66eMIOydveyWtCDquLDsobQg7YyM7J28L3N5bWxpbmsg7Lap64+M7J2EIOygleq3nO2ZlO2VqeuLiOuLpC5cbiAgICBjb25zdCBlcnJvckNvZGUgPSAoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlO1xuICAgIGlmIChlcnJvckNvZGUgPT09IFwiRUVYSVNUXCIgfHwgZXJyb3JDb2RlID09PSBcIkVMT09QXCIpIHtcbiAgICAgIHRocm93IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKGBQcmFjdGljZSBmaWxlIGFscmVhZHkgZXhpc3RzOiAke2ZpbGVQYXRofWApLCB7XG4gICAgICAgIGNvZGU6IFwiUFJBQ1RJQ0VfRklMRV9FWElTVFNcIixcbiAgICAgICAgZXhpdENvZGU6IDIsXG4gICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBoYW5kbGU/LmNsb3NlKCk7XG4gIH1cbiAgLy8g7JeQ65SU7YSwIOyXtOq4sC/tgbTrpr3rs7Trk5wg67O17IKsIOqwmeydgCDrjIDtmZTtmJUg67aA7IiY7Zqo6rO864qUIOu5hOuMgO2ZlO2YlSDsi6TtlonsnYQg6rmo65yo66as66+A66GcIO2YuOy2nOyekOyXkOqyjCDrp6HquYHri4jri6QuXG4gIHJldHVybiB7IGZpbGVOYW1lLCBwYXRoOiBmaWxlUGF0aCB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkQ2RkVHJlZShkaXJlY3Rvcnk6IHN0cmluZywgcm9vdDogc3RyaW5nKTogUHJvbWlzZTxvYmplY3RbXT4ge1xuICBjb25zdCBbeyByZWFkZGlyIH0sIHBhdGhdID0gYXdhaXQgUHJvbWlzZS5hbGwoW2ltcG9ydChcIm5vZGU6ZnMvcHJvbWlzZXNcIiksIGltcG9ydChcIm5vZGU6cGF0aFwiKV0pO1xuICBjb25zdCBlbnRyaWVzID0gYXdhaXQgcmVhZGRpcihkaXJlY3RvcnksIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgY29uc3Qgbm9kZXMgPSBbXTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgaWYgKGVudHJ5Lm5hbWUgPT09IFwicnVsZXNcIikgY29udGludWU7XG4gICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5qb2luKGRpcmVjdG9yeSwgZW50cnkubmFtZSk7XG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShyb290LCBhYnNvbHV0ZVBhdGgpO1xuICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IGF3YWl0IHJlYWRDZGRUcmVlKGFic29sdXRlUGF0aCwgcm9vdCk7XG4gICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICBub2Rlcy5wdXNoKHsgbmFtZTogZW50cnkubmFtZSwgcGF0aDogcmVsYXRpdmVQYXRoLCB0eXBlOiBcImRpcmVjdG9yeVwiLCBjaGlsZHJlbiB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGVudHJ5LmlzRmlsZSgpICYmIGVudHJ5Lm5hbWUuZW5kc1dpdGgoXCIuY29udHJhY3QubWRcIikpIHtcbiAgICAgIG5vZGVzLnB1c2goeyBuYW1lOiBlbnRyeS5uYW1lLCBwYXRoOiByZWxhdGl2ZVBhdGgsIHR5cGU6IFwiZmlsZVwiLCBmaWxlVHlwZTogXCJjb250cmFjdFwiIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbm9kZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNkZE9wZXJhdGlvbihtZXRob2Q6IHN0cmluZywgaW5wdXQ6IENvbW1hbmRJbnB1dCk6IFByb21pc2U8VG9vbGluZ1Jlc3VsdD4ge1xuICBhd2FpdCBlbnN1cmVTb25hbXUoKTtcbiAgY29uc3QgW3sgYWNjZXNzIH0sIHsgY3JlYXRlRGVmYXVsdENkZFRvb2xpbmdBZGFwdGVyIH1dID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGltcG9ydChcIm5vZGU6ZnMvcHJvbWlzZXNcIiksXG4gICAgaW1wb3J0KFwiLi9jZGQtc2VydmljZVwiKSxcbiAgXSk7XG4gIGNvbnN0IGFkYXB0ZXIgPSBjcmVhdGVEZWZhdWx0Q2RkVG9vbGluZ0FkYXB0ZXIoeyBjb250cmFjdFJvb3Q6IGF3YWl0IGNkZFJvb3RQYXRoKCkgfSk7XG4gIGlmIChtZXRob2QgPT09IFwidHJlZVwiKSB7XG4gICAgY29uc3Qgcm9vdCA9IGF3YWl0IGNkZFJvb3RQYXRoKCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGFjY2Vzcyhyb290KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB7IGV4aXN0czogZmFsc2UsIHRyZWU6IFtdIH07XG4gICAgfVxuICAgIHJldHVybiB7IGV4aXN0czogdHJ1ZSwgdHJlZTogYXdhaXQgcmVhZENkZFRyZWUocm9vdCwgcm9vdCkgfTtcbiAgfVxuICBpZiAobWV0aG9kID09PSBcInJlYWRcIikge1xuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHJlcXVpcmVkVGV4dChpbnB1dCwgXCJwYXRoXCIpO1xuICAgIHJldHVybiBhZGFwdGVyLnJlYWQoeyBwYXRoOiByZWxhdGl2ZVBhdGggfSk7XG4gIH1cbiAgaWYgKG1ldGhvZCA9PT0gXCJydWxlc1wiKSByZXR1cm4gYWRhcHRlci5ydWxlcygpO1xuICBpZiAobWV0aG9kID09PSBcInNob3dSdWxlXCIpIHtcbiAgICBjb25zdCBydWxlSWQgPSByZXF1aXJlZFRleHQoaW5wdXQsIFwicnVsZUlkXCIpO1xuICAgIHJldHVybiBhZGFwdGVyLnNob3dSdWxlKHsgcnVsZUlkIH0pO1xuICB9XG4gIGlmIChtZXRob2QgPT09IFwiYWRkUnVsZVwiKSB7XG4gICAgY29uc3QgcnVsZUtleSA9IHJlcXVpcmVkVGV4dChpbnB1dCwgXCJydWxlS2V5XCIpO1xuICAgIGNvbnN0IGlkID0gcmVxdWlyZWRUZXh0KGlucHV0LCBcImlkXCIpO1xuICAgIGNvbnN0IHdoZW4gPSByZXF1aXJlZFRleHQoaW5wdXQsIFwid2hlblwiKTtcbiAgICBjb25zdCBydWxlVGV4dCA9IHRleHQoaW5wdXQsIFwiaW5zdHJ1Y3Rpb25cIikgPz8gcmVxdWlyZWRUZXh0KGlucHV0LCBcInRleHRcIik7XG4gICAgcmV0dXJuIGFkYXB0ZXIuYWRkUnVsZSh7XG4gICAgICBydWxlS2V5LFxuICAgICAgaWQsXG4gICAgICB3aGVuLFxuICAgICAgdGV4dDogcnVsZVRleHQsXG4gICAgICBleGFtcGxlczogc3RyaW5ncyhpbnB1dCwgXCJleGFtcGxlc1wiKSxcbiAgICAgIGRyeVJ1bjogZXhwbGljaXRseURyeVJ1bihpbnB1dCksXG4gICAgfSk7XG4gIH1cbiAgaWYgKGV4cGxpY2l0bHlEcnlSdW4oaW5wdXQpKSB7XG4gICAgcmV0dXJuIHsgb3BlcmF0aW9uOiBcImFkZEFjY2VwdGFuY2VDcml0ZXJpb25cIiwgaW5wdXQsIGRyeVJ1bjogdHJ1ZSB9O1xuICB9XG4gIGNvbnN0IGRvY3VtZW50ID0gcmVxdWlyZWRUZXh0KGlucHV0LCBcImRvY3VtZW50XCIpO1xuICBjb25zdCBjcml0ZXJpb24gPSByZXF1aXJlZFRleHQoaW5wdXQsIFwidGV4dFwiKTtcbiAgcmV0dXJuIGFkYXB0ZXIuYWRkQWNjZXB0YW5jZUNyaXRlcmlvbih7IGRvY3VtZW50LCB0ZXh0OiBjcml0ZXJpb24sIGRyeVJ1bjogZmFsc2UgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGludm9rZURlZmF1bHQoXG4gIGdyb3VwOiBzdHJpbmcsXG4gIG1ldGhvZDogc3RyaW5nLFxuICBpbnB1dDogQ29tbWFuZElucHV0LFxuKTogUHJvbWlzZTxUb29saW5nUmVzdWx0PiB7XG4gIGlmIChncm91cCA9PT0gXCJjb3JlXCIpIHJldHVybiBzeW5jT3BlcmF0aW9uKGlucHV0KTtcbiAgaWYgKGdyb3VwID09PSBcImVudGl0eVwiKSByZXR1cm4gZW50aXR5T3BlcmF0aW9uKG1ldGhvZCwgaW5wdXQpO1xuICBpZiAoZ3JvdXAgPT09IFwic2NhZmZvbGRcIikgcmV0dXJuIHNjYWZmb2xkT3BlcmF0aW9uKG1ldGhvZCwgaW5wdXQpO1xuICBpZiAoZ3JvdXAgPT09IFwibWlncmF0aW9uXCIpIHJldHVybiBtaWdyYXRpb25PcGVyYXRpb24obWV0aG9kLCBpbnB1dCk7XG4gIGlmIChncm91cCA9PT0gXCJmaXh0dXJlXCIpIHJldHVybiBmaXh0dXJlT3BlcmF0aW9uKG1ldGhvZCwgaW5wdXQpO1xuICBpZiAoZ3JvdXAgPT09IFwiYnVpbGRcIikgcmV0dXJuIGJ1aWxkT3BlcmF0aW9uKG1ldGhvZCk7XG4gIGlmIChncm91cCA9PT0gXCJ0ZXN0XCIpIHJldHVybiB0ZXN0T3BlcmF0aW9uKG1ldGhvZCwgaW5wdXQpO1xuICBpZiAoZ3JvdXAgPT09IFwiYXV0aFwiKSByZXR1cm4gYXV0aE9wZXJhdGlvbihtZXRob2QsIGlucHV0KTtcbiAgaWYgKGdyb3VwID09PSBcImkxOG5cIikgcmV0dXJuIGkxOG5PcGVyYXRpb24obWV0aG9kLCBpbnB1dCk7XG4gIGlmIChncm91cCA9PT0gXCJ0YXNrXCIpIHJldHVybiB0YXNrT3BlcmF0aW9uKG1ldGhvZCwgaW5wdXQpO1xuICBpZiAoZ3JvdXAgPT09IFwic3R1YlwiKSByZXR1cm4gc3R1YlByYWN0aWNlT3BlcmF0aW9uKGlucHV0KTtcbiAgcmV0dXJuIGNkZE9wZXJhdGlvbihtZXRob2QsIGlucHV0KTtcbn1cblxuLy8g6riw67O4IHJlZ2lzdHJ564qUIO2YuOy2nCDsi5zsoJDquYzsp4AgU29uYW11IOy0iOq4sO2ZlOyZgCDsmbjrtoAg7J6R7JeF7J2EIOuqqOuRkCDrr7jro7nri4jri6QuXG5leHBvcnQgY29uc3QgdG9vbGluZzogQ2xpVG9vbGluZ09wZXJhdGlvbnMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gIE9iamVjdC5lbnRyaWVzKFJFUVVJUkVEX01FVEhPRFMpLm1hcCgoW2dyb3VwLCBtZXRob2RzXSkgPT4gW1xuICAgIGdyb3VwLFxuICAgIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIG1ldGhvZHMubWFwKChtZXRob2QpID0+IFtcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICAoaW5wdXQ6IENvbW1hbmRJbnB1dCkgPT4gaW52b2tlRGVmYXVsdChncm91cCwgbWV0aG9kLCBpbnB1dCksXG4gICAgICBdKSxcbiAgICApLFxuICBdKSxcbik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0b29saW5nLm1pZ3JhdGlvbiwgXCJhcHBseVwiLCB7XG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICB2YWx1ZTogKGlucHV0OiBDb21tYW5kSW5wdXQpID0+IGludm9rZURlZmF1bHQoXCJtaWdyYXRpb25cIiwgXCJhcHBseVwiLCBpbnB1dCksXG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFLQSxNQUFNLGtCQUFrQixFQUFFLEtBQUs7QUFVL0IsTUFBTSxvQ0FBb0IsSUFBSSxJQUFZO0NBQ3hDO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7QUFDRixDQUFDO0FBRUQsU0FBUyxzQkFBc0IsUUFBbUQ7Q0FFaEYsSUFBSSxrQkFBa0IsSUFBSSxNQUFNLEdBQUc7Q0FDbkMsTUFBTSxPQUFPLHVCQUFPLElBQUksTUFBTSxpQ0FBaUMsUUFBUSxHQUFHO0VBQ3hFLE1BQU07RUFDTixVQUFVO0NBQ1osQ0FBQztBQUNIO0FBRUEsU0FBUyw0QkFDUCxRQUNnRTtDQUNoRSxJQUFJLFdBQVcsYUFBYSxXQUFXLFFBQVE7Q0FHL0MsTUFBTSxPQUFPLHVCQUFPLElBQUksTUFBTSxvQ0FBb0MsUUFBUSxHQUFHO0VBQzNFLE1BQU07RUFDTjtFQUNBLFVBQVU7Q0FDWixDQUFDO0FBQ0g7QUFFQSxlQUFlLGNBQ2IsUUFDQSxZQUNBLFNBQStCLFNBQy9CO0NBQ0EsTUFBTSxTQUFTLE1BQU0sT0FBTyxPQUFPLE9BQ2pDLFdBQ0EsSUFBSSxZQUFZLENBQUMsQ0FBQyxPQUFPLEtBQUssVUFBVTtFQUFFO0VBQVE7RUFBUTtDQUFXLENBQUMsQ0FBQyxDQUN6RTtDQUNBLE9BQU87RUFDTCxNQUFNO0VBQ047RUFDQTtFQUNBO0VBQ0EsYUFBYSxNQUFNLEtBQUssSUFBSSxXQUFXLE1BQU0sSUFBSSxTQUMvQyxLQUFLLFNBQVMsRUFBRSxD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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sonamu",
3
- "version": "0.11.3",
3
+ "version": "0.11.4",
4
4
  "description": "Sonamu — TypeScript Fullstack API Framework",
5
5
  "keywords": [
6
6
  "framework",
@@ -1,6 +1,7 @@
1
1
  import { z } from "zod";
2
2
 
3
3
  import { type FixtureCommandOptions } from "../bin/fixture";
4
+ import { type TemplateKey } from "../types/types";
4
5
 
5
6
  const jsonValueSchema = z.json();
6
7
  type CommandValue = z.infer<typeof jsonValueSchema> | undefined;
@@ -323,6 +324,29 @@ async function renderScaffolds(input: CommandInput) {
323
324
  return rendered;
324
325
  }
325
326
 
327
+ /**
328
+ * 템플릿이 요구하는 dict 키를 프로젝트 사전에 채웁니다.
329
+ *
330
+ * 생성 코드에는 SD("error.entityNotFound") 같은 호출이 박히는데, 키가 프로젝트 사전에
331
+ * 없으면 번역이 되지 않아 사람이 매번 손으로 채우거나 다른 키로 바꿔야 한다.
332
+ * Sonamu UI 경로(ui/api.ts)는 이미 같은 처리를 하므로, CLI도 동일하게 맞춘다.
333
+ */
334
+ async function ensureTemplateDictKeys(templateKeys: TemplateKey[]): Promise<void> {
335
+ const [{ TemplateManager }, { sonamuDictionary }] = await Promise.all([
336
+ import("../template/template-manager"),
337
+ import("../dict/sonamu-dictionary"),
338
+ ]);
339
+
340
+ const requiredKeys = templateKeys.flatMap(
341
+ (templateKey) => TemplateManager.get(templateKey).getRequiredDictKeys() ?? [],
342
+ );
343
+ if (requiredKeys.length === 0) {
344
+ return;
345
+ }
346
+
347
+ await sonamuDictionary.ensureDictKeys([...new Set(requiredKeys)]);
348
+ }
349
+
326
350
  async function scaffoldOperation(method: string, input: CommandInput): Promise<ToolingResult> {
327
351
  const directTemplate = z
328
352
  .enum(["model", "model_test", "view_list", "view_form"])
@@ -331,6 +355,7 @@ async function scaffoldOperation(method: string, input: CommandInput): Promise<T
331
355
  await ensureSonamu();
332
356
  const { Sonamu } = await import("../api/sonamu");
333
357
  const entityId = requiredText(input, "entityId");
358
+ await ensureTemplateDictKeys([directTemplate.data]);
334
359
  return directTemplate.data === "view_list"
335
360
  ? Sonamu.syncer.generateTemplate("view_list", { entityId, extra: input.extra })
336
361
  : Sonamu.syncer.generateTemplate(directTemplate.data, { entityId });
@@ -359,6 +384,9 @@ async function scaffoldOperation(method: string, input: CommandInput): Promise<T
359
384
  if (method === "status") return items.map(({ content: _content, ...item }) => item);
360
385
  if (method === "preview" || (method === "batch" && explicitlyDryRun(input))) return items;
361
386
 
387
+ // 실제로 파일을 쓰는 경우에만 사전을 건드린다(status/preview/dry-run은 위에서 반환됨).
388
+ await ensureTemplateDictKeys([...new Set(items.map((item) => item.template))]);
389
+
362
390
  const results = [];
363
391
  for (const item of items) {
364
392
  const { content: _content, ...summary } = item;