sonamu 0.8.18 → 0.8.19

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":"decorators.d.ts","sourceRoot":"","sources":["../../src/api/decorators.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/api/decorators.ts"],"names":[],"mappings":"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"}
@@ -88,8 +88,10 @@ export function stream(options) {
88
88
  checkSingleDecorator(target, propertyKey, DECORATOR_TYPES.STREAM);
89
89
  const defaultPath = `/${inflection.camelize(modelName.replace(/Model$/, "").replace(/Frame$/, ""), true)}/${inflection.camelize(propertyKey, true)}`;
90
90
  const path = options.path ?? defaultPath;
91
+ // stream 전용 필드(events, type)는 ApiDecoratorOptions에 속하지 않으므로 제외
92
+ const { events: _, type: _type, ...apiOptions } = options;
91
93
  const optionsWithDefaults = {
92
- ...options,
94
+ ...apiOptions,
93
95
  httpMethod: "GET"
94
96
  };
95
97
  const existingApi = registeredApis.find((api)=>api.modelName === modelName && api.methodName === methodName);
@@ -278,4 +280,4 @@ newOptions) {
278
280
  });
279
281
  }
280
282
 
281
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvZGVjb3JhdG9ycy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEZhc3RpZnlNdWx0aXBhcnRCYXNlT3B0aW9ucyB9IGZyb20gXCJAZmFzdGlmeS9tdWx0aXBhcnRcIjtcbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB0eXBlIHsgSFRUUE1ldGhvZHMgfSBmcm9tIFwiZmFzdGlmeVwiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB7IGlzRXF1YWwgfSBmcm9tIFwicmFkYXNoaVwiO1xuaW1wb3J0IHR5cGUgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHR5cGUgeyBDYWNoZUNvbnRyb2xDb25maWcgfSBmcm9tIFwiLi4vY2FjaGUtY29udHJvbC90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBDb21wcmVzc0NvbmZpZyB9IGZyb20gXCIuLi9jb21wcmVzcy90eXBlc1wiO1xuaW1wb3J0IHsgQmFzZU1vZGVsQ2xhc3MgfSBmcm9tIFwiLi4vZGF0YWJhc2UvYmFzZS1tb2RlbFwiO1xuaW1wb3J0IHsgREIgfSBmcm9tIFwiLi4vZGF0YWJhc2UvZGJcIjtcbmltcG9ydCB7XG4gIFB1cmlUcmFuc2FjdGlvbldyYXBwZXIsXG4gIHR5cGUgUHVyaVdyYXBwZXIsXG4gIHR5cGUgVHJhbnNhY3Rpb25hbE9wdGlvbnMsXG59IGZyb20gXCIuLi9kYXRhYmFzZS9wdXJpLXdyYXBwZXJcIjtcbmltcG9ydCB7IFVwc2VydEJ1aWxkZXIgfSBmcm9tIFwiLi4vZGF0YWJhc2UvdXBzZXJ0LWJ1aWxkZXJcIjtcbmltcG9ydCB7IGNvbnZlcnREb21haW5Ub0NhdGVnb3J5IH0gZnJvbSBcIi4uL2xvZ2dlci9jYXRlZ29yeVwiO1xuaW1wb3J0IHR5cGUgeyBEcml2ZXJLZXkgfSBmcm9tIFwiLi4vc3RvcmFnZS9kcml2ZXJzXCI7XG5pbXBvcnQgdHlwZSB7IEtleUdlbmVyYXRvciB9IGZyb20gXCIuLi9zdG9yYWdlL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IEFwaVBhcmFtLCBBcGlQYXJhbVR5cGUgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IEJhc2VGcmFtZUNsYXNzIH0gZnJvbSBcIi4vYmFzZS1mcmFtZVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEd1YXJkS2V5cyB7XG4gIHF1ZXJ5OiB0cnVlO1xuICBhZG1pbjogdHJ1ZTtcbiAgdXNlcjogdHJ1ZTtcbn1cbmV4cG9ydCB0eXBlIEd1YXJkS2V5ID0ga2V5b2YgR3VhcmRLZXlzO1xuZXhwb3J0IHR5cGUgU2VydmljZUNsaWVudCA9XG4gIHwgXCJheGlvc1wiXG4gIHwgXCJheGlvcy1tdWx0aXBhcnRcIlxuICB8IFwidGFuc3RhY2stcXVlcnlcIlxuICB8IFwidGFuc3RhY2stbXV0YXRpb25cIlxuICB8IFwidGFuc3RhY2stbXV0YXRpb24tbXVsdGlwYXJ0XCJcbiAgfCBcIndpbmRvdy1mZXRjaFwiO1xuZXhwb3J0IHR5cGUgQXBpRGVjb3JhdG9yT3B0aW9ucyA9IHtcbiAgaHR0cE1ldGhvZD86IEhUVFBNZXRob2RzO1xuICBjb250ZW50VHlwZT86XG4gICAgfCBcInRleHQvcGxhaW5cIlxuICAgIHwgXCJ0ZXh0L2h0bWxcIlxuICAgIHwgXCJ0ZXh0L3htbFwiXG4gICAgfCBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgIHwgXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIjtcbiAgY2xpZW50cz86IFNlcnZpY2VDbGllbnRbXTtcbiAgcGF0aD86IHN0cmluZztcbiAgcmVzb3VyY2VOYW1lPzogc3RyaW5nO1xuICBndWFyZHM/OiBHdWFyZEtleVtdO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgdGltZW91dD86IG51bWJlcjtcbiAgLyoqIEFQSSDsnZHri7XsnZggQ2FjaGUtQ29udHJvbCDtl6TrjZQg7ISk7KCVLiDshKTsoJXtlZjsp4Ag7JWK7Jy866m0IGNhY2hlQ29udHJvbEhhbmRsZXIg65iQ64qUIOq4sOuzuOqwkuydtCDsoIHsmqnrkKnri4jri6QuICovXG4gIGNhY2hlQ29udHJvbD86IENhY2hlQ29udHJvbENvbmZpZztcbiAgLyoqIEFQSSDsnZHri7XsnZgg7JWV7LaVIOyEpOyglS4gZmFsc2XroZwg7ISk7KCV7ZWY66m0IOyVley2leydhCDruYTtmZzshLHtmZTtlanri4jri6QuICovXG4gIGNvbXByZXNzPzogQ29tcHJlc3NDb25maWc7XG59O1xuZXhwb3J0IHR5cGUgU3RyZWFtRGVjb3JhdG9yT3B0aW9ucyA9IHtcbiAgdHlwZTogXCJzc2VcIjsgLy8gfCAnd3NcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiDsnbTrsqTtirgg7YKk67OE66GcIOuEmOqyqOyjvOuKlCDqsJLsnbTrr4DroZwg7Ja065akIO2DgOyeheydtOuToCDsg4HqtIDsl4bsnYxcbiAgZXZlbnRzOiB6LlpvZE9iamVjdDxhbnk+O1xuICBwYXRoPzogc3RyaW5nO1xuICByZXNvdXJjZU5hbWU/OiBzdHJpbmc7XG4gIGd1YXJkcz86IEd1YXJkS2V5W107XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufTtcblxudHlwZSBCdWZmZXJVcGxvYWRPcHRpb25zID0ge1xuICBjb25zdW1lPzogXCJidWZmZXJcIjtcbn07XG50eXBlIFN0cmVhbVVwbG9hZE9wdGlvbnMgPSB7XG4gIGNvbnN1bWU6IFwic3RyZWFtXCI7XG4gIGRlc3RpbmF0aW9uOiBEcml2ZXJLZXk7XG4gIGtleUdlbmVyYXRvcj86IEtleUdlbmVyYXRvcjtcbn07XG5leHBvcnQgdHlwZSBVcGxvYWREZWNvcmF0b3JPcHRpb25zID0ge1xuICBndWFyZHM/OiBHdWFyZEtleVtdO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgbGltaXRzPzogRmFzdGlmeU11bHRpcGFydEJhc2VPcHRpb25zW1wibGltaXRzXCJdO1xufSAmIChCdWZmZXJVcGxvYWRPcHRpb25zIHwgU3RyZWFtVXBsb2FkT3B0aW9ucyk7XG5cbmV4cG9ydCBjb25zdCByZWdpc3RlcmVkQXBpczoge1xuICAvKipcbiAgICogbW9kZWxOYW1l7J2AIOuqqOuNuCDtgbTrnpjsiqQg7J2066aE7J6F64uI64ukLiAoZXguIFwiVXNlck1vZGVsXCIpXG4gICAqL1xuICBtb2RlbE5hbWU6IHN0cmluZztcbiAgbWV0aG9kTmFtZTogc3RyaW5nO1xuICBwYXRoOiBzdHJpbmc7XG4gIG9wdGlvbnM6IEFwaURlY29yYXRvck9wdGlvbnM7XG4gIHN0cmVhbU9wdGlvbnM/OiBTdHJlYW1EZWNvcmF0b3JPcHRpb25zO1xuICB1cGxvYWRPcHRpb25zPzogVXBsb2FkRGVjb3JhdG9yT3B0aW9ucztcbn1bXSA9IFtdO1xuZXhwb3J0IHR5cGUgRXh0ZW5kZWRBcGkgPSB7XG4gIG1vZGVsTmFtZTogc3RyaW5nO1xuICBtZXRob2ROYW1lOiBzdHJpbmc7XG4gIHBhdGg6IHN0cmluZztcbiAgb3B0aW9uczogQXBpRGVjb3JhdG9yT3B0aW9ucztcbiAgc3RyZWFtT3B0aW9ucz86IFN0cmVhbURlY29yYXRvck9wdGlvbnM7XG4gIHVwbG9hZE9wdGlvbnM/OiBVcGxvYWREZWNvcmF0b3JPcHRpb25zO1xuICB0eXBlUGFyYW1ldGVyczogQXBpUGFyYW1UeXBlLlR5cGVQYXJhbVtdO1xuICBwYXJhbWV0ZXJzOiBBcGlQYXJhbVtdO1xuICByZXR1cm5UeXBlOiBBcGlQYXJhbVR5cGU7XG59O1xudHlwZSBEZWNvcmF0b3JUYXJnZXQgPSB7IGNvbnN0cnVjdG9yOiB7IG5hbWU6IHN0cmluZyB9IH07XG5cbmNvbnN0IERFQ09SQVRPUl9UWVBFUyA9IHtcbiAgQVBJOiBTeW1ib2woXCJhcGlcIiksXG4gIFNUUkVBTTogU3ltYm9sKFwic3RyZWFtXCIpLFxuICBVUExPQUQ6IFN5bWJvbChcInVwbG9hZFwiKSxcbn0gYXMgY29uc3Q7XG5cbmZ1bmN0aW9uIGNoZWNrU2luZ2xlRGVjb3JhdG9yKHRhcmdldDogRGVjb3JhdG9yVGFyZ2V0LCBwcm9wZXJ0eUtleTogc3RyaW5nLCBkZWNvcmF0b3JUeXBlOiBzeW1ib2wpIHtcbiAgY29uc3QgbWV0aG9kID0gdGFyZ2V0W3Byb3BlcnR5S2V5IGFzIGtleW9mIHR5cGVvZiB0YXJnZXRdIGFzIHsgX19kZWNvcmF0b3JUeXBlPzogc3ltYm9sIH07XG4gIGlmIChtZXRob2Q/Ll9fZGVjb3JhdG9yVHlwZSAmJiBtZXRob2Q/Ll9fZGVjb3JhdG9yVHlwZSAhPT0gZGVjb3JhdG9yVHlwZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBAJHtTdHJpbmcoZGVjb3JhdG9yVHlwZSl9IGRlY29yYXRvciBjYW4gb25seSBiZSB1c2VkIG9uY2Ugb24gJHt0YXJnZXQuY29uc3RydWN0b3IubmFtZX0uJHtwcm9wZXJ0eUtleX0uIFlvdSBjYW4gdXNlIG9ubHkgb25lIG9mIEBhcGkgb3IgQHN0cmVhbSBkZWNvcmF0b3Igb24gdGhlIHNhbWUgbWV0aG9kLmAsXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBtZXRob2QuX19kZWNvcmF0b3JUeXBlID0gZGVjb3JhdG9yVHlwZTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBpKG9wdGlvbnM6IEFwaURlY29yYXRvck9wdGlvbnMgPSB7fSkge1xuICBvcHRpb25zID0ge1xuICAgIGh0dHBNZXRob2Q6IFwiR0VUXCIsXG4gICAgY29udGVudFR5cGU6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgIGNsaWVudHM6IFtcImF4aW9zXCJdLFxuICAgIC4uLm9wdGlvbnMsXG4gIH07XG5cbiAgcmV0dXJuICh0YXJnZXQ6IERlY29yYXRvclRhcmdldCwgcHJvcGVydHlLZXk6IHN0cmluZywgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yKSA9PiB7XG4gICAgY29uc3QgbW9kZWxOYW1lID0gdGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWUubWF0Y2goLyguKylDbGFzcyQvKT8uWzFdO1xuICAgIGFzc2VydChcbiAgICAgIG1vZGVsTmFtZSxcbiAgICAgIGBtb2RlbE5hbWUgaXMgcmVxdWlyZWQgb24gQGFwaSBkZWNvcmF0b3Igb24gJHt0YXJnZXQuY29uc3RydWN0b3IubmFtZX0uJHtwcm9wZXJ0eUtleX1gLFxuICAgICk7XG4gICAgY29uc3QgbWV0aG9kTmFtZSA9IHByb3BlcnR5S2V5O1xuXG4gICAgLy8g66mU7ISc65Oc7JeQIOqxuOumsCDrjbDsvZTroIjsnbTthLAg7KSR67O1IOyytO2BrFxuICAgIGNoZWNrU2luZ2xlRGVjb3JhdG9yKHRhcmdldCwgcHJvcGVydHlLZXksIERFQ09SQVRPUl9UWVBFUy5BUEkpO1xuXG4gICAgY29uc3QgZGVmYXVsdFBhdGggPSBgLyR7aW5mbGVjdGlvbi5jYW1lbGl6ZShcbiAgICAgIG1vZGVsTmFtZS5yZXBsYWNlKC9Nb2RlbCQvLCBcIlwiKS5yZXBsYWNlKC9GcmFtZSQvLCBcIlwiKSxcbiAgICAgIHRydWUsXG4gICAgKX0vJHtpbmZsZWN0aW9uLmNhbWVsaXplKHByb3BlcnR5S2V5LCB0cnVlKX1gO1xuICAgIGNvbnN0IHBhdGggPSBvcHRpb25zLnBhdGggPz8gZGVmYXVsdFBhdGg7XG5cbiAgICAvLyDquLDsobQg64+Z7J287ZWcIOuplOyEnOuTnOqwgCDsnojripTsp4Ag7ZmV7J24IO2bhCDsnojripQg6rK97JqwIG92ZXJyaWRlXG4gICAgY29uc3QgZXhpc3RpbmdBcGkgPSByZWdpc3RlcmVkQXBpcy5maW5kKFxuICAgICAgKGFwaSkgPT4gYXBpLm1vZGVsTmFtZSA9PT0gbW9kZWxOYW1lICYmIGFwaS5tZXRob2ROYW1lID09PSBtZXRob2ROYW1lLFxuICAgICk7XG4gICAgaWYgKGV4aXN0aW5nQXBpKSB7XG4gICAgICAvLyDquLDsobTsnZggcGF0aOyZgCDsg4jroZzsmrQgcGF0aOqwgCDri6TrpbTri6TrqbQoPeu5iCDsiqTtirjrp4HsnbQg7JWE64uI7JeI64qU642wIOuLpOuluCDsiqTtirjrp4HsnLzroZwg67CU64CM6rKMIOuQnOuLpOuptCkg7JeQ65+s66W8IO2EsOucqOugpOykjeuLiOuLpC5cbiAgICAgIGFzc2VydE5vQ29uZmxpY3RpbmdQYXRoKFwiYXBpXCIsIG1vZGVsTmFtZSwgbWV0aG9kTmFtZSwgZXhpc3RpbmdBcGkucGF0aCwgcGF0aCk7XG4gICAgICBleGlzdGluZ0FwaS5wYXRoID0gcGF0aDtcblxuICAgICAgLy8g6riw7KG07J2YIOyYteyFmOqzvCDsg4jroZzsmrQg7Ji17IWY7J20IOqyuey5mOuKlCDrtoDrtoTsnbQg7J6I64uk66m0IOyXkOufrOulvCDthLDrnKjroKTspI3ri4jri6QuXG4gICAgICBhc3NlcnROb0NvbmZsaWN0aW5nT3B0aW9ucyhcImFwaVwiLCBtb2RlbE5hbWUsIG1ldGhvZE5hbWUsIGV4aXN0aW5nQXBpLm9wdGlvbnMsIG9wdGlvbnMpO1xuICAgICAgZXhpc3RpbmdBcGkub3B0aW9ucyA9IHtcbiAgICAgICAgLi4uZXhpc3RpbmdBcGkub3B0aW9ucywgLy8g6riw7KG07J2YIOyYteyFmOydhCDsobTspJHtlZjrkJhcbiAgICAgICAgLi4ub3B0aW9ucywgLy8gQGFwaSDrjbDsvZTroIjsnbTthLDsnZgg7Ji17IWY7J2EIOy2lOqwgO2VqeuLiOuLpC5cbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlZ2lzdGVyZWRBcGlzLnB1c2goe1xuICAgICAgICBtb2RlbE5hbWUsXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIHBhdGgsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBvcmlnaW5hbE1ldGhvZCA9IGRlc2NyaXB0b3IudmFsdWU7XG4gICAgZGVzY3JpcHRvci52YWx1ZSA9IGFzeW5jIGZ1bmN0aW9uICh0aGlzOiBCYXNlTW9kZWxDbGFzcyB8IEJhc2VGcmFtZUNsYXNzLCAuLi5hcmdzOiB1bmtub3duW10pIHtcbiAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgQmFzZU1vZGVsQ2xhc3MpIHtcbiAgICAgICAgZ2V0TG9nZ2VyKGNvbnZlcnREb21haW5Ub0NhdGVnb3J5KHRoaXMubW9kZWxOYW1lLCBcIm1vZGVsXCIpKS5kZWJ1ZyhcbiAgICAgICAgICBcImFwaToge2h0dHBNZXRob2R9IHttb2RlbH0ue21ldGhvZH1cIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBodHRwTWV0aG9kOiBvcHRpb25zLmh0dHBNZXRob2QsXG4gICAgICAgICAgICBtb2RlbDogbW9kZWxOYW1lLFxuICAgICAgICAgICAgbWV0aG9kOiBtZXRob2ROYW1lLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgQmFzZUZyYW1lQ2xhc3MpIHtcbiAgICAgICAgZ2V0TG9nZ2VyKGNvbnZlcnREb21haW5Ub0NhdGVnb3J5KHRoaXMuZnJhbWVOYW1lLCBcImZyYW1lXCIpKS5kZWJ1ZyhcbiAgICAgICAgICBcImFwaToge2h0dHBNZXRob2R9IHttb2RlbH0ue21ldGhvZH1cIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBodHRwTWV0aG9kOiBvcHRpb25zLmh0dHBNZXRob2QsXG4gICAgICAgICAgICBtb2RlbDogbW9kZWxOYW1lLFxuICAgICAgICAgICAgbWV0aG9kOiBtZXRob2ROYW1lLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvcmlnaW5hbE1ldGhvZC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RyZWFtKG9wdGlvbnM6IFN0cmVhbURlY29yYXRvck9wdGlvbnMpIHtcbiAgcmV0dXJuICh0YXJnZXQ6IERlY29yYXRvclRhcmdldCwgcHJvcGVydHlLZXk6IHN0cmluZywgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yKSA9PiB7XG4gICAgY29uc3QgbW9kZWxOYW1lID0gdGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWUubWF0Y2goLyguKylDbGFzcyQvKT8uWzFdO1xuICAgIGFzc2VydChcbiAgICAgIG1vZGVsTmFtZSxcbiAgICAgIGBtb2RlbE5hbWUgaXMgcmVxdWlyZWQgb24gQHN0cmVhbSBkZWNvcmF0b3Igb24gJHt0YXJnZXQuY29uc3RydWN0b3IubmFtZX0uJHtwcm9wZXJ0eUtleX1gLFxuICAgICk7XG4gICAgY29uc3QgbWV0aG9kTmFtZSA9IHByb3BlcnR5S2V5O1xuXG4gICAgLy8g66mU7ISc65Oc7JeQIOqxuOumsCDrjbDsvZTroIjsnbTthLAg7KSR67O1IOyytO2BrFxuICAgIGNoZWNrU2luZ2xlRGVjb3JhdG9yKHRhcmdldCwgcHJvcGVydHlLZXksIERFQ09SQVRPUl9UWVBFUy5TVFJFQU0pO1xuXG4gICAgY29uc3QgZGVmYXVsdFBhdGggPSBgLyR7aW5mbGVjdGlvbi5jYW1lbGl6ZShcbiAgICAgIG1vZGVsTmFtZS5yZXBsYWNlKC9Nb2RlbCQvLCBcIlwiKS5yZXBsYWNlKC9GcmFtZSQvLCBcIlwiKSxcbiAgICAgIHRydWUsXG4gICAgKX0vJHtpbmZsZWN0aW9uLmNhbWVsaXplKHByb3BlcnR5S2V5LCB0cnVlKX1gO1xuICAgIGNvbnN0IHBhdGggPSBvcHRpb25zLnBhdGggPz8gZGVmYXVsdFBhdGg7XG4gICAgY29uc3Qgb3B0aW9uc1dpdGhEZWZhdWx0cyA9IHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBodHRwTWV0aG9kOiBcIkdFVFwiIGFzIEhUVFBNZXRob2RzLFxuICAgIH07XG5cbiAgICBjb25zdCBleGlzdGluZ0FwaSA9IHJlZ2lzdGVyZWRBcGlzLmZpbmQoXG4gICAgICAoYXBpKSA9PiBhcGkubW9kZWxOYW1lID09PSBtb2RlbE5hbWUgJiYgYXBpLm1ldGhvZE5hbWUgPT09IG1ldGhvZE5hbWUsXG4gICAgKTtcbiAgICBpZiAoZXhpc3RpbmdBcGkpIHtcbiAgICAgIC8vIOq4sOyhtOydmCBwYXRo7JmAIOyDiOuhnOyatCBwYXRo6rCAIOuLpOultOuLpOuptCg967mIIOyKpO2KuOungeydtCDslYTri4jsl4jripTrjbAg64uk66W4IOyKpO2KuOungeycvOuhnCDrsJTrgIzqsowg65Cc64uk66m0KSDsl5Drn6zrpbwg7YSw65yo66Ck7KSN64uI64ukLlxuICAgICAgYXNzZXJ0Tm9Db25mbGljdGluZ1BhdGgoXCJzdHJlYW1cIiwgbW9kZWxOYW1lLCBtZXRob2ROYW1lLCBleGlzdGluZ0FwaS5wYXRoLCBwYXRoKTtcbiAgICAgIGV4aXN0aW5nQXBpLnBhdGggPSBwYXRoO1xuXG4gICAgICAvLyDquLDsobTsnZgg7Ji17IWY6rO8IOyDiOuhnOyatCDsmLXshZjsnbQg6rK57LmY64qUIOu2gOu2hOydtCDsnojri6TrqbQg7JeQ65+s66W8IO2EsOucqOugpOykjeuLiOuLpC5cbiAgICAgIGFzc2VydE5vQ29uZmxpY3RpbmdPcHRpb25zKFxuICAgICAgICBcInN0cmVhbVwiLFxuICAgICAgICBtb2RlbE5hbWUsXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIGV4aXN0aW5nQXBpLm9wdGlvbnMsXG4gICAgICAgIG9wdGlvbnNXaXRoRGVmYXVsdHMsXG4gICAgICApO1xuICAgICAgZXhpc3RpbmdBcGkub3B0aW9ucyA9IHtcbiAgICAgICAgLi4uZXhpc3RpbmdBcGkub3B0aW9ucywgLy8g6riw7KG07J2YIOyYteyFmOydhCDsobTspJHtlZjrkJhcbiAgICAgICAgLi4ub3B0aW9uc1dpdGhEZWZhdWx0cywgLy8gQHN0cmVhbSDrjbDsvZTroIjsnbTthLDsnZgg7Ji17IWY7J2EIOy2lOqwgO2VqeuLiOuLpC5cbiAgICAgIH07XG5cbiAgICAgIGV4aXN0aW5nQXBpLnN0cmVhbU9wdGlvbnMgPSBvcHRpb25zO1xuICAgIH0gZWxzZSB7XG4gICAgICByZWdpc3RlcmVkQXBpcy5wdXNoKHtcbiAgICAgICAgbW9kZWxOYW1lLFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICBwYXRoLFxuICAgICAgICBvcHRpb25zOiBvcHRpb25zV2l0aERlZmF1bHRzLFxuICAgICAgICBzdHJlYW1PcHRpb25zOiBvcHRpb25zLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3JpZ2luYWxNZXRob2QgPSBkZXNjcmlwdG9yLnZhbHVlO1xuICAgIGRlc2NyaXB0b3IudmFsdWUgPSBhc3luYyBmdW5jdGlvbiAodGhpczogQmFzZU1vZGVsQ2xhc3MgfCBCYXNlRnJhbWVDbGFzcywgLi4uYXJnczogdW5rbm93bltdKSB7XG4gICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEJhc2VNb2RlbENsYXNzKSB7XG4gICAgICAgIGdldExvZ2dlcihjb252ZXJ0RG9tYWluVG9DYXRlZ29yeSh0aGlzLm1vZGVsTmFtZSwgXCJtb2RlbFwiKSkuZGVidWcoXG4gICAgICAgICAgXCJzdHJlYW06IHttb2RlbH0ue21ldGhvZH1cIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2RlbDogbW9kZWxOYW1lLFxuICAgICAgICAgICAgbWV0aG9kOiBtZXRob2ROYW1lLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgQmFzZUZyYW1lQ2xhc3MpIHtcbiAgICAgICAgZ2V0TG9nZ2VyKGNvbnZlcnREb21haW5Ub0NhdGVnb3J5KHRoaXMuZnJhbWVOYW1lLCBcImZyYW1lXCIpKS5kZWJ1ZyhcbiAgICAgICAgICBcInN0cmVhbToge21vZGVsfS57bWV0aG9kfVwiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZGVsOiBtb2RlbE5hbWUsXG4gICAgICAgICAgICBtZXRob2Q6IG1ldGhvZE5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9yaWdpbmFsTWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH07XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2FjdGlvbmFsKG9wdGlvbnM6IFRyYW5zYWN0aW9uYWxPcHRpb25zID0ge30pIHtcbiAgY29uc3QgeyBpc29sYXRpb24sIHJlYWRPbmx5LCBkYlByZXNldCA9IFwid1wiIH0gPSBvcHRpb25zO1xuXG4gIHJldHVybiAodGFyZ2V0OiBEZWNvcmF0b3JUYXJnZXQsIHByb3BlcnR5S2V5OiBzdHJpbmcsIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvcikgPT4ge1xuICAgIGNvbnN0IG9yaWdpbmFsTWV0aG9kID0gZGVzY3JpcHRvci52YWx1ZTtcbiAgICBjb25zdCBtb2RlbE5hbWUgPSB0YXJnZXQuY29uc3RydWN0b3IubmFtZS5tYXRjaCgvKC4rKUNsYXNzJC8pPy5bMV07XG4gICAgYXNzZXJ0KFxuICAgICAgbW9kZWxOYW1lLFxuICAgICAgYG1vZGVsTmFtZSBpcyByZXF1aXJlZCBvbiBAc3RyZWFtIGRlY29yYXRvciBvbiAke3RhcmdldC5jb25zdHJ1Y3Rvci5uYW1lfS4ke3Byb3BlcnR5S2V5fWAsXG4gICAgKTtcbiAgICBjb25zdCBtZXRob2ROYW1lID0gcHJvcGVydHlLZXk7XG5cbiAgICBkZXNjcmlwdG9yLnZhbHVlID0gYXN5bmMgZnVuY3Rpb24gKHRoaXM6IEJhc2VNb2RlbENsYXNzLCAuLi5hcmdzOiB1bmtub3duW10pIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFwidHJhbnNhY3Rpb25hbDoge21vZGVsfS57bWV0aG9kfVwiLCB7XG4gICAgICAgIG1vZGVsOiBtb2RlbE5hbWUsXG4gICAgICAgIG1ldGhvZDogbWV0aG9kTmFtZSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBleGlzdGluZ0NvbnRleHQgPSBEQi50cmFuc2FjdGlvblN0b3JhZ2UuZ2V0U3RvcmUoKTtcblxuICAgICAgLy8gQXN5bmNMb2NhbFN0b3JhZ2Ug7Luo7YWN7Iqk7Yq4IOyXhuqxsOuCmCDtlbTri7kgcHJlc2V07J2YIO2KuOuenOyereyFmOydtCDsl4bsnLzrqbQg7IOI66GcIOyLnOyekVxuICAgICAgY29uc3Qgc3RhcnRUcmFuc2FjdGlvbiA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcHVyaSA9IHRoaXMuZ2V0UHVyaShkYlByZXNldCkgYXMgUHVyaVdyYXBwZXI7XG5cbiAgICAgICAgcmV0dXJuIHB1cmkua25leC50cmFuc2FjdGlvbihcbiAgICAgICAgICBhc3luYyAodHJ4KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcIm5ldyB0cmFuc2FjdGlvbiBjb250ZXh0OiB7ZGJQcmVzZXR9XCIsIHsgZGJQcmVzZXQgfSk7XG4gICAgICAgICAgICBjb25zdCB0cnhXcmFwcGVyID0gbmV3IFB1cmlUcmFuc2FjdGlvbldyYXBwZXIodHJ4LCBuZXcgVXBzZXJ0QnVpbGRlcigpKTtcbiAgICAgICAgICAgIC8vIFRyYW5zYWN0aW9uQ29udGV4dOyXkCDtirjrnpzsnq3shZgg7KCA7J6lXG4gICAgICAgICAgICBEQi5nZXRUcmFuc2FjdGlvbkNvbnRleHQoKS5zZXRUcmFuc2FjdGlvbihkYlByZXNldCwgdHJ4V3JhcHBlcik7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCBvcmlnaW5hbE1ldGhvZC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgIC8vIO2KuOuenOyereyFmCDsoJzqsbBcbiAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXCJkZWxldGUgdHJhbnNhY3Rpb24gY29udGV4dDoge2RiUHJlc2V0fVwiLCB7IGRiUHJlc2V0IH0pO1xuICAgICAgICAgICAgICBEQi5nZXRUcmFuc2FjdGlvbkNvbnRleHQoKS5kZWxldGVUcmFuc2FjdGlvbihkYlByZXNldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IGlzb2xhdGlvbkxldmVsOiBpc29sYXRpb24sIHJlYWRPbmx5IH0sXG4gICAgICAgICk7XG4gICAgICB9O1xuXG4gICAgICAvLyBBc3luY0xvY2FsU3RvcmFnZSDsu6jthY3siqTtirjqsIAg7JeG7Jy866m0IOyDiOuhnCDsg53shLFcbiAgICAgIGlmICghZXhpc3RpbmdDb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBEQi5ydW5XaXRoVHJhbnNhY3Rpb24oc3RhcnRUcmFuc2FjdGlvbik7XG4gICAgICB9XG5cbiAgICAgIC8vIOydtOuvuCBBc3luY0xvY2FsU3RvcmFnZSDsu6jthY3siqTtirgg7JWI7JeQIOyeiOuKlOyngCDtmZXsnbgg7ZuEIO2VtOuLuSBwcmVzZXTsnZgg7Yq4656c7J6t7IWY7J20IOydtOuvuCDsnojsnLzrqbQg7J6s7IKs7JqpXG4gICAgICBpZiAoZXhpc3RpbmdDb250ZXh0Py5nZXRUcmFuc2FjdGlvbihkYlByZXNldCkpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXCJyZXVzZSB0cmFuc2FjdGlvbiBjb250ZXh0OiB7ZGJQcmVzZXR9XCIsIHsgZGJQcmVzZXQgfSk7XG4gICAgICAgIHJldHVybiBvcmlnaW5hbE1ldGhvZC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgIH1cblxuICAgICAgLy8g7Luo7YWN7Iqk7Yq464qUIOyeiOyngOunjCDsnbQgcHJlc2V07J2YIO2KuOuenOyereyFmOydgCDsl4bripQg6rK97JqwICjqsJnsnYAg7Luo7YWN7Iqk7Yq4IOuCtOyXkOyEnCDsi6TtlokpXG4gICAgICByZXR1cm4gc3RhcnRUcmFuc2FjdGlvbigpO1xuICAgIH07XG5cbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgfTtcbn1cblxuLyoqXG4gKiDtjIzsnbwg7JeF66Gc65OcIEFQSeulvCDsg53shLHtlbTspI3ri4jri6QuIChAYXBpIOuNsOy9lOugiOydtO2EsCDsl4bsnbQg64+F66a97KCB7Jy866GcIOyCrOyaqSlcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXBsb2FkKG9wdGlvbnM6IFVwbG9hZERlY29yYXRvck9wdGlvbnMgPSB7IGNvbnN1bWU6IFwiYnVmZmVyXCIgfSkge1xuICByZXR1cm4gKHRhcmdldDogRGVjb3JhdG9yVGFyZ2V0LCBwcm9wZXJ0eUtleTogc3RyaW5nLCBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3IpID0+IHtcbiAgICBjb25zdCBvcmlnaW5hbE1ldGhvZCA9IGRlc2NyaXB0b3IudmFsdWU7XG4gICAgY29uc3QgbW9kZWxOYW1lID0gdGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWUubWF0Y2goLyguKylDbGFzcyQvKT8uWzFdO1xuICAgIGFzc2VydChcbiAgICAgIG1vZGVsTmFtZSxcbiAgICAgIGBtb2RlbE5hbWUgaXMgcmVxdWlyZWQgb24gQHVwbG9hZCBkZWNvcmF0b3Igb24gJHt0YXJnZXQuY29uc3RydWN0b3IubmFtZX0uJHtwcm9wZXJ0eUtleX1gLFxuICAgICk7XG4gICAgY29uc3QgbWV0aG9kTmFtZSA9IHByb3BlcnR5S2V5O1xuXG4gICAgLy8g66mU7ISc65Oc7JeQIOqxuOumsCDrjbDsvZTroIjsnbTthLAg7KSR67O1IOyytO2BrFxuICAgIGNoZWNrU2luZ2xlRGVjb3JhdG9yKHRhcmdldCwgcHJvcGVydHlLZXksIERFQ09SQVRPUl9UWVBFUy5VUExPQUQpO1xuXG4gICAgY29uc3QgZGVmYXVsdFBhdGggPSBgLyR7aW5mbGVjdGlvbi5jYW1lbGl6ZShcbiAgICAgIG1vZGVsTmFtZS5yZXBsYWNlKC9Nb2RlbCQvLCBcIlwiKS5yZXBsYWNlKC9GcmFtZSQvLCBcIlwiKSxcbiAgICAgIHRydWUsXG4gICAgKX0vJHtpbmZsZWN0aW9uLmNhbWVsaXplKG1ldGhvZE5hbWUsIHRydWUpfWA7XG5cbiAgICAvLyByZWdpc3RlcmVkQXBpc+yXkOyEnCDtlbTri7kgQVBJIOywvuyVhOyEnCB1cGxvYWRPcHRpb25zIOy2lOqwgFxuICAgIGNvbnN0IGV4aXN0aW5nQXBpID0gcmVnaXN0ZXJlZEFwaXMuZmluZChcbiAgICAgIChhcGkpID0+IGFwaS5tb2RlbE5hbWUgPT09IG1vZGVsTmFtZSAmJiBhcGkubWV0aG9kTmFtZSA9PT0gbWV0aG9kTmFtZSxcbiAgICApO1xuXG4gICAgaWYgKGV4aXN0aW5nQXBpKSB7XG4gICAgICAvLyDsnqzrk7HroZ0g7IucIOyXheuhnOuTnCDsmLXshZjrp4wg6rCx7IugXG4gICAgICBleGlzdGluZ0FwaS51cGxvYWRPcHRpb25zID0gb3B0aW9ucztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8g7IOI66GcIOuTseuhnVxuICAgICAgcmVnaXN0ZXJlZEFwaXMucHVzaCh7XG4gICAgICAgIG1vZGVsTmFtZSxcbiAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgcGF0aDogZGVmYXVsdFBhdGgsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBodHRwTWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICBjbGllbnRzOiBbXCJheGlvcy1tdWx0aXBhcnRcIiwgXCJ0YW5zdGFjay1tdXRhdGlvbi1tdWx0aXBhcnRcIl0sXG4gICAgICAgICAgZ3VhcmRzOiBvcHRpb25zLmd1YXJkcyxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogb3B0aW9ucy5kZXNjcmlwdGlvbixcbiAgICAgICAgfSxcbiAgICAgICAgdXBsb2FkT3B0aW9uczogb3B0aW9ucyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGRlc2NyaXB0b3IudmFsdWUgPSBhc3luYyBmdW5jdGlvbiAodGhpczogQmFzZU1vZGVsQ2xhc3MgfCBCYXNlRnJhbWVDbGFzcywgLi4uYXJnczogdW5rbm93bltdKSB7XG4gICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEJhc2VNb2RlbENsYXNzKSB7XG4gICAgICAgIGdldExvZ2dlcihjb252ZXJ0RG9tYWluVG9DYXRlZ29yeSh0aGlzLm1vZGVsTmFtZSwgXCJtb2RlbFwiKSkuZGVidWcoXG4gICAgICAgICAgXCJ1cGxvYWQ6IHttb2RlbH0ue21ldGhvZH1cIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2RlbDogbW9kZWxOYW1lLFxuICAgICAgICAgICAgbWV0aG9kOiBtZXRob2ROYW1lLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgQmFzZUZyYW1lQ2xhc3MpIHtcbiAgICAgICAgZ2V0TG9nZ2VyKGNvbnZlcnREb21haW5Ub0NhdGVnb3J5KHRoaXMuZnJhbWVOYW1lLCBcImZyYW1lXCIpKS5kZWJ1ZyhcbiAgICAgICAgICBcInVwbG9hZDoge21vZGVsfS57bWV0aG9kfVwiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZGVsOiBtb2RlbE5hbWUsXG4gICAgICAgICAgICBtZXRob2Q6IG1ldGhvZE5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9yaWdpbmFsTWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH07XG5cbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgfTtcbn1cblxuLyoqXG4gKiDquLDsobTsnZggcGF0aOyZgCDsg4jroZzsmrQgcGF0aOqwgCDri6TrpbTri6TrqbQoPeqwkuydtCDsnojrjZgg7Iqk7Yq466eB7J20IOuLpOuluCDqsJLsnbQg7J6I64qUIOyKpO2KuOungeycvOuhnCDrsJTrgIzqsowg65Cc64uk66m0KSDsl5Drn6zrpbwg7YSw65yo66Ck7KSN64uI64ukLlxuICogQHBhcmFtIGRlY29yYXRvck5hbWUg642w7L2U66CI7J207YSwIOydtOumhFxuICogQHBhcmFtIG1vZGVsTmFtZSDrqqjrjbgg7J2066aEXG4gKiBAcGFyYW0gbWV0aG9kTmFtZSDrqZTshJzrk5wg7J2066aEXG4gKiBAcGFyYW0gZXhpc3RpbmdQYXRoIOq4sOyhtOydmCBwYXRoXG4gKiBAcGFyYW0gbmV3UGF0aCDsg4jroZzsmrQgcGF0aFxuICovXG5mdW5jdGlvbiBhc3NlcnROb0NvbmZsaWN0aW5nUGF0aChcbiAgZGVjb3JhdG9yTmFtZTogc3RyaW5nLFxuICBtb2RlbE5hbWU6IHN0cmluZyxcbiAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICBleGlzdGluZ1BhdGg6IHN0cmluZyxcbiAgbmV3UGF0aDogc3RyaW5nLFxuKSB7XG4gIGlmIChleGlzdGluZ1BhdGggIT09IFwiXCIgJiYgbmV3UGF0aCAhPT0gXCJcIiAmJiBleGlzdGluZ1BhdGggIT09IG5ld1BhdGgpIHtcbiAgICAvLyDsnbTqsoPsnbQg66y07IqoIOyDge2ZqeydtOuDkOuptOyalCwgYXBpLnBhdGjqsIAg642u7Ja07JSM7JuM7KeA64qUIOyDge2ZqeyeheuLiOuLpC5cbiAgICAvLyDqsIDroLkgQGFwaSh7IHBhdGg6IFwiL2FwaS92MS91c2Vyc1wiIH0pIOuNsOy9lOugiOydtO2EsOqwgCDrtpnslrTsnojripQg66mU7ISc65Oc7JeQXG4gICAgLy8gQHN0cmVhbSh7IHBhdGg6IFwiL2FwaS92MS91c2Vycy9zdHJlYW1cIiB9KSDqsJnsnYAg6rKD7J20IOu2meyWtCDsnojripQg7IOB7Zmp7J6F64uI64ukLlxuICAgIC8vIOydtOugh+qyjCDrkJjrqbQg65GQIOuNsOy9lOugiOydtO2EsOqwgCDqsJnsnYAgYXBp7J2YIHBhdGgg7ZWE65Oc66W8IOqxtOuTnOumrOqyjCDrkJjrr4DroZwsIOyXkOufrOulvCDthLDrnKjroKTspI3ri4jri6QuXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEAke2RlY29yYXRvck5hbWV9IGRlY29yYXRvciBvbiAke21vZGVsTmFtZX0uJHttZXRob2ROYW1lfSBoYXMgY29uZmxpY3RpbmcgcGF0aDogJHtuZXdQYXRofS4gVGhlIGRlY29yYXRvciBpcyB0cnlpbmcgdG8gb3ZlcnJpZGUgdGhlIGV4aXN0aW5nIHBhdGgoJHtleGlzdGluZ1BhdGh9KSB3aXRoIHRoZSBuZXcgcGF0aCgke25ld1BhdGh9KS5gLFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiDquLDsobTsnZgg7Ji17IWY6rO8IOyDiOuhnOyatCDsmLXshZjsnbQg6rK57LmY64qUIOu2gOu2hOydtCDsnojri6TrqbQg7JeQ65+s66W8IO2EsOucqOugpOykjeuLiOuLpC5cbiAqIEBwYXJhbSBkZWNvcmF0b3JOYW1lIOuNsOy9lOugiOydtO2EsCDsnbTrpoRcbiAqIEBwYXJhbSBtb2RlbE5hbWUg66qo6424IOydtOumhFxuICogQHBhcmFtIG1ldGhvZE5hbWUg66mU7ISc65OcIOydtOumhFxuICogQHBhcmFtIGV4aXN0aW5nT3B0aW9ucyDquLDsobTsnZgg7Ji17IWYXG4gKiBAcGFyYW0gbmV3T3B0aW9ucyDsg4jroZzsmrQg7Ji17IWYXG4gKi9cbmZ1bmN0aW9uIGFzc2VydE5vQ29uZmxpY3RpbmdPcHRpb25zKFxuICBkZWNvcmF0b3JOYW1lOiBzdHJpbmcsXG4gIG1vZGVsTmFtZTogc3RyaW5nLFxuICBtZXRob2ROYW1lOiBzdHJpbmcsXG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogPOyVhCDsib3qsozsib3qsowg7KKAIOqwkeyLnOuLpD5cbiAgZXhpc3RpbmdPcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IDzsnbTrn7Qg65WMIOyVhOuLiOuptCBhbnkg7Ja47KCcIOyUgeuLiOq5jD5cbiAgbmV3T3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55Pixcbikge1xuICBPYmplY3Qua2V5cyhuZXdPcHRpb25zKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBpZiAoZXhpc3RpbmdPcHRpb25zW2tleV0gJiYgIWlzRXF1YWwoZXhpc3RpbmdPcHRpb25zW2tleV0sIG5ld09wdGlvbnNba2V5XSkpIHtcbiAgICAgIC8vIOydtOqyg+ydtCDrrLTsiqgg7IOB7Zmp7J2064OQ66m07JqULCBhcGkub3B0aW9uc+qwgCDrja7slrTslIzsm4zsp4DripQg7IOB7Zmp7J6F64uI64ukLlxuICAgICAgLy8g6rCA66C5IEBhcGkoeyByZXNvdXJjZU5hbWU6IFwiVXNlcnNcIiB9KSDrjbDsvZTroIjsnbTthLDqsIAg67aZ7Ja07J6I64qUIOuplOyEnOuTnOyXkFxuICAgICAgLy8gQHN0cmVhbSh7IHJlc291cmNlTmFtZTogXCJQb3N0c1wiIH0pIOqwmeydgCDqsoPsnbQg67aZ7Ja0IOyeiOuKlCDsg4HtmansnoXri4jri6QuXG4gICAgICAvLyDsnbTroIfqsowg65CY66m0IOuRkCDrjbDsvZTroIjsnbTthLDqsIAg6rCZ7J2AIGFwaeydmCBvcHRpb25zIOyGjSDqsJnsnYAg7ZWE65Oc66W8IOqxtOuTnOumrOqyjCDrkJjrr4DroZwsIOyXkOufrOulvCDthLDrnKjroKTspI3ri4jri6QuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBAJHtkZWNvcmF0b3JOYW1lfSBkZWNvcmF0b3Igb24gJHttb2RlbE5hbWV9LiR7bWV0aG9kTmFtZX0gaGFzIGNvbmZsaWN0aW5nIG9wdGlvbnM6ICR7a2V5fS4gVGhlIGRlY29yYXRvciBpcyB0cnlpbmcgdG8gb3ZlcnJpZGUgdGhlIGV4aXN0aW5nIG9wdGlvbigke0pTT04uc3RyaW5naWZ5KGV4aXN0aW5nT3B0aW9uc1trZXldKX0pIHdpdGggdGhlIG5ldyBvcHRpb24oJHtKU09OLnN0cmluZ2lmeShuZXdPcHRpb25zW2tleV0pfSkuYCxcbiAgICAgICk7XG4gICAgfVxuICB9KTtcbn1cbiJdLCJuYW1lcyI6WyJnZXRMb2dnZXIiLCJhc3NlcnQiLCJpbmZsZWN0aW9uIiwiaXNFcXVhbCIsIkJhc2VNb2RlbENsYXNzIiwiREIiLCJQdXJpVHJhbnNhY3Rpb25XcmFwcGVyIiwiVXBzZXJ0QnVpbGRlciIsImNvbnZlcnREb21haW5Ub0NhdGVnb3J5IiwiQmFzZUZyYW1lQ2xhc3MiLCJyZWdpc3RlcmVkQXBpcyIsIkRFQ09SQVRPUl9UWVBFUyIsIkFQSSIsIlN5bWJvbCIsIlNUUkVBTSIsIlVQTE9BRCIsImNoZWNrU2luZ2xlRGVjb3JhdG9yIiwidGFyZ2V0IiwicHJvcGVydHlLZXkiLCJkZWNvcmF0b3JUeXBlIiwibWV0aG9kIiwiX19kZWNvcmF0b3JUeXBlIiwiRXJyb3IiLCJTdHJpbmciLCJuYW1lIiwiYXBpIiwib3B0aW9ucyIsImh0dHBNZXRob2QiLCJjb250ZW50VHlwZSIsImNsaWVudHMiLCJkZXNjcmlwdG9yIiwibW9kZWxOYW1lIiwibWF0Y2giLCJtZXRob2ROYW1lIiwiZGVmYXVsdFBhdGgiLCJjYW1lbGl6ZSIsInJlcGxhY2UiLCJwYXRoIiwiZXhpc3RpbmdBcGkiLCJmaW5kIiwiYXNzZXJ0Tm9Db25mbGljdGluZ1BhdGgiLCJhc3NlcnROb0NvbmZsaWN0aW5nT3B0aW9ucyIsInB1c2giLCJvcmlnaW5hbE1ldGhvZCIsInZhbHVlIiwiYXJncyIsImRlYnVnIiwibW9kZWwiLCJmcmFtZU5hbWUiLCJhcHBseSIsInN0cmVhbSIsIm9wdGlvbnNXaXRoRGVmYXVsdHMiLCJzdHJlYW1PcHRpb25zIiwidHJhbnNhY3Rpb25hbCIsImlzb2xhdGlvbiIsInJlYWRPbmx5IiwiZGJQcmVzZXQiLCJsb2dnZXIiLCJleGlzdGluZ0NvbnRleHQiLCJ0cmFuc2FjdGlvblN0b3JhZ2UiLCJnZXRTdG9yZSIsInN0YXJ0VHJhbnNhY3Rpb24iLCJwdXJpIiwiZ2V0UHVyaSIsImtuZXgiLCJ0cmFuc2FjdGlvbiIsInRyeCIsInRyeFdyYXBwZXIiLCJnZXRUcmFuc2FjdGlvbkNvbnRleHQiLCJzZXRUcmFuc2FjdGlvbiIsImRlbGV0ZVRyYW5zYWN0aW9uIiwiaXNvbGF0aW9uTGV2ZWwiLCJydW5XaXRoVHJhbnNhY3Rpb24iLCJnZXRUcmFuc2FjdGlvbiIsInVwbG9hZCIsImNvbnN1bWUiLCJ1cGxvYWRPcHRpb25zIiwiZ3VhcmRzIiwiZGVzY3JpcHRpb24iLCJkZWNvcmF0b3JOYW1lIiwiZXhpc3RpbmdQYXRoIiwibmV3UGF0aCIsImV4aXN0aW5nT3B0aW9ucyIsIm5ld09wdGlvbnMiLCJPYmplY3QiLCJrZXlzIiwiZm9yRWFjaCIsImtleSIsIkpTT04iLCJzdHJpbmdpZnkiXSwibWFwcGluZ3MiOiJBQUNBLFNBQVNBLFNBQVMsUUFBUSxtQkFBbUI7QUFDN0MsT0FBT0MsWUFBWSxTQUFTO0FBRTVCLE9BQU9DLGdCQUFnQixhQUFhO0FBQ3BDLFNBQVNDLE9BQU8sUUFBUSxVQUFVO0FBSWxDLFNBQVNDLGNBQWMsUUFBUSw0QkFBeUI7QUFDeEQsU0FBU0MsRUFBRSxRQUFRLG9CQUFpQjtBQUNwQyxTQUNFQyxzQkFBc0IsUUFHakIsOEJBQTJCO0FBQ2xDLFNBQVNDLGFBQWEsUUFBUSxnQ0FB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
283
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvZGVjb3JhdG9ycy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEZhc3RpZnlNdWx0aXBhcnRCYXNlT3B0aW9ucyB9IGZyb20gXCJAZmFzdGlmeS9tdWx0aXBhcnRcIjtcbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB0eXBlIHsgSFRUUE1ldGhvZHMgfSBmcm9tIFwiZmFzdGlmeVwiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB7IGlzRXF1YWwgfSBmcm9tIFwicmFkYXNoaVwiO1xuaW1wb3J0IHR5cGUgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHR5cGUgeyBDYWNoZUNvbnRyb2xDb25maWcgfSBmcm9tIFwiLi4vY2FjaGUtY29udHJvbC90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBDb21wcmVzc0NvbmZpZyB9IGZyb20gXCIuLi9jb21wcmVzcy90eXBlc1wiO1xuaW1wb3J0IHsgQmFzZU1vZGVsQ2xhc3MgfSBmcm9tIFwiLi4vZGF0YWJhc2UvYmFzZS1tb2RlbFwiO1xuaW1wb3J0IHsgREIgfSBmcm9tIFwiLi4vZGF0YWJhc2UvZGJcIjtcbmltcG9ydCB7XG4gIFB1cmlUcmFuc2FjdGlvbldyYXBwZXIsXG4gIHR5cGUgUHVyaVdyYXBwZXIsXG4gIHR5cGUgVHJhbnNhY3Rpb25hbE9wdGlvbnMsXG59IGZyb20gXCIuLi9kYXRhYmFzZS9wdXJpLXdyYXBwZXJcIjtcbmltcG9ydCB7IFVwc2VydEJ1aWxkZXIgfSBmcm9tIFwiLi4vZGF0YWJhc2UvdXBzZXJ0LWJ1aWxkZXJcIjtcbmltcG9ydCB7IGNvbnZlcnREb21haW5Ub0NhdGVnb3J5IH0gZnJvbSBcIi4uL2xvZ2dlci9jYXRlZ29yeVwiO1xuaW1wb3J0IHR5cGUgeyBEcml2ZXJLZXkgfSBmcm9tIFwiLi4vc3RvcmFnZS9kcml2ZXJzXCI7XG5pbXBvcnQgdHlwZSB7IEtleUdlbmVyYXRvciB9IGZyb20gXCIuLi9zdG9yYWdlL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IEFwaVBhcmFtLCBBcGlQYXJhbVR5cGUgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IEJhc2VGcmFtZUNsYXNzIH0gZnJvbSBcIi4vYmFzZS1mcmFtZVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEd1YXJkS2V5cyB7XG4gIHF1ZXJ5OiB0cnVlO1xuICBhZG1pbjogdHJ1ZTtcbiAgdXNlcjogdHJ1ZTtcbn1cbmV4cG9ydCB0eXBlIEd1YXJkS2V5ID0ga2V5b2YgR3VhcmRLZXlzO1xuZXhwb3J0IHR5cGUgU2VydmljZUNsaWVudCA9XG4gIHwgXCJheGlvc1wiXG4gIHwgXCJheGlvcy1tdWx0aXBhcnRcIlxuICB8IFwidGFuc3RhY2stcXVlcnlcIlxuICB8IFwidGFuc3RhY2stbXV0YXRpb25cIlxuICB8IFwidGFuc3RhY2stbXV0YXRpb24tbXVsdGlwYXJ0XCJcbiAgfCBcIndpbmRvdy1mZXRjaFwiO1xuZXhwb3J0IHR5cGUgQXBpRGVjb3JhdG9yT3B0aW9ucyA9IHtcbiAgaHR0cE1ldGhvZD86IEhUVFBNZXRob2RzO1xuICBjb250ZW50VHlwZT86XG4gICAgfCBcInRleHQvcGxhaW5cIlxuICAgIHwgXCJ0ZXh0L2h0bWxcIlxuICAgIHwgXCJ0ZXh0L3htbFwiXG4gICAgfCBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgIHwgXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIjtcbiAgY2xpZW50cz86IFNlcnZpY2VDbGllbnRbXTtcbiAgcGF0aD86IHN0cmluZztcbiAgcmVzb3VyY2VOYW1lPzogc3RyaW5nO1xuICBndWFyZHM/OiBHdWFyZEtleVtdO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgdGltZW91dD86IG51bWJlcjtcbiAgLyoqIEFQSSDsnZHri7XsnZggQ2FjaGUtQ29udHJvbCDtl6TrjZQg7ISk7KCVLiDshKTsoJXtlZjsp4Ag7JWK7Jy866m0IGNhY2hlQ29udHJvbEhhbmRsZXIg65iQ64qUIOq4sOuzuOqwkuydtCDsoIHsmqnrkKnri4jri6QuICovXG4gIGNhY2hlQ29udHJvbD86IENhY2hlQ29udHJvbENvbmZpZztcbiAgLyoqIEFQSSDsnZHri7XsnZgg7JWV7LaVIOyEpOyglS4gZmFsc2XroZwg7ISk7KCV7ZWY66m0IOyVley2leydhCDruYTtmZzshLHtmZTtlanri4jri6QuICovXG4gIGNvbXByZXNzPzogQ29tcHJlc3NDb25maWc7XG59O1xuZXhwb3J0IHR5cGUgU3RyZWFtRGVjb3JhdG9yT3B0aW9ucyA9IHtcbiAgdHlwZTogXCJzc2VcIjsgLy8gfCAnd3NcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiDsnbTrsqTtirgg7YKk67OE66GcIOuEmOqyqOyjvOuKlCDqsJLsnbTrr4DroZwg7Ja065akIO2DgOyeheydtOuToCDsg4HqtIDsl4bsnYxcbiAgZXZlbnRzOiB6LlpvZE9iamVjdDxhbnk+O1xuICBwYXRoPzogc3RyaW5nO1xuICByZXNvdXJjZU5hbWU/OiBzdHJpbmc7XG4gIGd1YXJkcz86IEd1YXJkS2V5W107XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufTtcblxudHlwZSBCdWZmZXJVcGxvYWRPcHRpb25zID0ge1xuICBjb25zdW1lPzogXCJidWZmZXJcIjtcbn07XG50eXBlIFN0cmVhbVVwbG9hZE9wdGlvbnMgPSB7XG4gIGNvbnN1bWU6IFwic3RyZWFtXCI7XG4gIGRlc3RpbmF0aW9uOiBEcml2ZXJLZXk7XG4gIGtleUdlbmVyYXRvcj86IEtleUdlbmVyYXRvcjtcbn07XG5leHBvcnQgdHlwZSBVcGxvYWREZWNvcmF0b3JPcHRpb25zID0ge1xuICBndWFyZHM/OiBHdWFyZEtleVtdO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgbGltaXRzPzogRmFzdGlmeU11bHRpcGFydEJhc2VPcHRpb25zW1wibGltaXRzXCJdO1xufSAmIChCdWZmZXJVcGxvYWRPcHRpb25zIHwgU3RyZWFtVXBsb2FkT3B0aW9ucyk7XG5cbmV4cG9ydCBjb25zdCByZWdpc3RlcmVkQXBpczoge1xuICAvKipcbiAgICogbW9kZWxOYW1l7J2AIOuqqOuNuCDtgbTrnpjsiqQg7J2066aE7J6F64uI64ukLiAoZXguIFwiVXNlck1vZGVsXCIpXG4gICAqL1xuICBtb2RlbE5hbWU6IHN0cmluZztcbiAgbWV0aG9kTmFtZTogc3RyaW5nO1xuICBwYXRoOiBzdHJpbmc7XG4gIG9wdGlvbnM6IEFwaURlY29yYXRvck9wdGlvbnM7XG4gIHN0cmVhbU9wdGlvbnM/OiBTdHJlYW1EZWNvcmF0b3JPcHRpb25zO1xuICB1cGxvYWRPcHRpb25zPzogVXBsb2FkRGVjb3JhdG9yT3B0aW9ucztcbn1bXSA9IFtdO1xuZXhwb3J0IHR5cGUgRXh0ZW5kZWRBcGkgPSB7XG4gIG1vZGVsTmFtZTogc3RyaW5nO1xuICBtZXRob2ROYW1lOiBzdHJpbmc7XG4gIHBhdGg6IHN0cmluZztcbiAgb3B0aW9uczogQXBpRGVjb3JhdG9yT3B0aW9ucztcbiAgc3RyZWFtT3B0aW9ucz86IFN0cmVhbURlY29yYXRvck9wdGlvbnM7XG4gIHVwbG9hZE9wdGlvbnM/OiBVcGxvYWREZWNvcmF0b3JPcHRpb25zO1xuICB0eXBlUGFyYW1ldGVyczogQXBpUGFyYW1UeXBlLlR5cGVQYXJhbVtdO1xuICBwYXJhbWV0ZXJzOiBBcGlQYXJhbVtdO1xuICByZXR1cm5UeXBlOiBBcGlQYXJhbVR5cGU7XG59O1xudHlwZSBEZWNvcmF0b3JUYXJnZXQgPSB7IGNvbnN0cnVjdG9yOiB7IG5hbWU6IHN0cmluZyB9IH07XG5cbmNvbnN0IERFQ09SQVRPUl9UWVBFUyA9IHtcbiAgQVBJOiBTeW1ib2woXCJhcGlcIiksXG4gIFNUUkVBTTogU3ltYm9sKFwic3RyZWFtXCIpLFxuICBVUExPQUQ6IFN5bWJvbChcInVwbG9hZFwiKSxcbn0gYXMgY29uc3Q7XG5cbmZ1bmN0aW9uIGNoZWNrU2luZ2xlRGVjb3JhdG9yKHRhcmdldDogRGVjb3JhdG9yVGFyZ2V0LCBwcm9wZXJ0eUtleTogc3RyaW5nLCBkZWNvcmF0b3JUeXBlOiBzeW1ib2wpIHtcbiAgY29uc3QgbWV0aG9kID0gdGFyZ2V0W3Byb3BlcnR5S2V5IGFzIGtleW9mIHR5cGVvZiB0YXJnZXRdIGFzIHsgX19kZWNvcmF0b3JUeXBlPzogc3ltYm9sIH07XG4gIGlmIChtZXRob2Q/Ll9fZGVjb3JhdG9yVHlwZSAmJiBtZXRob2Q/Ll9fZGVjb3JhdG9yVHlwZSAhPT0gZGVjb3JhdG9yVHlwZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBAJHtTdHJpbmcoZGVjb3JhdG9yVHlwZSl9IGRlY29yYXRvciBjYW4gb25seSBiZSB1c2VkIG9uY2Ugb24gJHt0YXJnZXQuY29uc3RydWN0b3IubmFtZX0uJHtwcm9wZXJ0eUtleX0uIFlvdSBjYW4gdXNlIG9ubHkgb25lIG9mIEBhcGkgb3IgQHN0cmVhbSBkZWNvcmF0b3Igb24gdGhlIHNhbWUgbWV0aG9kLmAsXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBtZXRob2QuX19kZWNvcmF0b3JUeXBlID0gZGVjb3JhdG9yVHlwZTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBpKG9wdGlvbnM6IEFwaURlY29yYXRvck9wdGlvbnMgPSB7fSkge1xuICBvcHRpb25zID0ge1xuICAgIGh0dHBNZXRob2Q6IFwiR0VUXCIsXG4gICAgY29udGVudFR5cGU6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgIGNsaWVudHM6IFtcImF4aW9zXCJdLFxuICAgIC4uLm9wdGlvbnMsXG4gIH07XG5cbiAgcmV0dXJuICh0YXJnZXQ6IERlY29yYXRvclRhcmdldCwgcHJvcGVydHlLZXk6IHN0cmluZywgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yKSA9PiB7XG4gICAgY29uc3QgbW9kZWxOYW1lID0gdGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWUubWF0Y2goLyguKylDbGFzcyQvKT8uWzFdO1xuICAgIGFzc2VydChcbiAgICAgIG1vZGVsTmFtZSxcbiAgICAgIGBtb2RlbE5hbWUgaXMgcmVxdWlyZWQgb24gQGFwaSBkZWNvcmF0b3Igb24gJHt0YXJnZXQuY29uc3RydWN0b3IubmFtZX0uJHtwcm9wZXJ0eUtleX1gLFxuICAgICk7XG4gICAgY29uc3QgbWV0aG9kTmFtZSA9IHByb3BlcnR5S2V5O1xuXG4gICAgLy8g66mU7ISc65Oc7JeQIOqxuOumsCDrjbDsvZTroIjsnbTthLAg7KSR67O1IOyytO2BrFxuICAgIGNoZWNrU2luZ2xlRGVjb3JhdG9yKHRhcmdldCwgcHJvcGVydHlLZXksIERFQ09SQVRPUl9UWVBFUy5BUEkpO1xuXG4gICAgY29uc3QgZGVmYXVsdFBhdGggPSBgLyR7aW5mbGVjdGlvbi5jYW1lbGl6ZShcbiAgICAgIG1vZGVsTmFtZS5yZXBsYWNlKC9Nb2RlbCQvLCBcIlwiKS5yZXBsYWNlKC9GcmFtZSQvLCBcIlwiKSxcbiAgICAgIHRydWUsXG4gICAgKX0vJHtpbmZsZWN0aW9uLmNhbWVsaXplKHByb3BlcnR5S2V5LCB0cnVlKX1gO1xuICAgIGNvbnN0IHBhdGggPSBvcHRpb25zLnBhdGggPz8gZGVmYXVsdFBhdGg7XG5cbiAgICAvLyDquLDsobQg64+Z7J287ZWcIOuplOyEnOuTnOqwgCDsnojripTsp4Ag7ZmV7J24IO2bhCDsnojripQg6rK97JqwIG92ZXJyaWRlXG4gICAgY29uc3QgZXhpc3RpbmdBcGkgPSByZWdpc3RlcmVkQXBpcy5maW5kKFxuICAgICAgKGFwaSkgPT4gYXBpLm1vZGVsTmFtZSA9PT0gbW9kZWxOYW1lICYmIGFwaS5tZXRob2ROYW1lID09PSBtZXRob2ROYW1lLFxuICAgICk7XG4gICAgaWYgKGV4aXN0aW5nQXBpKSB7XG4gICAgICAvLyDquLDsobTsnZggcGF0aOyZgCDsg4jroZzsmrQgcGF0aOqwgCDri6TrpbTri6TrqbQoPeu5iCDsiqTtirjrp4HsnbQg7JWE64uI7JeI64qU642wIOuLpOuluCDsiqTtirjrp4HsnLzroZwg67CU64CM6rKMIOuQnOuLpOuptCkg7JeQ65+s66W8IO2EsOucqOugpOykjeuLiOuLpC5cbiAgICAgIGFzc2VydE5vQ29uZmxpY3RpbmdQYXRoKFwiYXBpXCIsIG1vZGVsTmFtZSwgbWV0aG9kTmFtZSwgZXhpc3RpbmdBcGkucGF0aCwgcGF0aCk7XG4gICAgICBleGlzdGluZ0FwaS5wYXRoID0gcGF0aDtcblxuICAgICAgLy8g6riw7KG07J2YIOyYteyFmOqzvCDsg4jroZzsmrQg7Ji17IWY7J20IOqyuey5mOuKlCDrtoDrtoTsnbQg7J6I64uk66m0IOyXkOufrOulvCDthLDrnKjroKTspI3ri4jri6QuXG4gICAgICBhc3NlcnROb0NvbmZsaWN0aW5nT3B0aW9ucyhcImFwaVwiLCBtb2RlbE5hbWUsIG1ldGhvZE5hbWUsIGV4aXN0aW5nQXBpLm9wdGlvbnMsIG9wdGlvbnMpO1xuICAgICAgZXhpc3RpbmdBcGkub3B0aW9ucyA9IHtcbiAgICAgICAgLi4uZXhpc3RpbmdBcGkub3B0aW9ucywgLy8g6riw7KG07J2YIOyYteyFmOydhCDsobTspJHtlZjrkJhcbiAgICAgICAgLi4ub3B0aW9ucywgLy8gQGFwaSDrjbDsvZTroIjsnbTthLDsnZgg7Ji17IWY7J2EIOy2lOqwgO2VqeuLiOuLpC5cbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlZ2lzdGVyZWRBcGlzLnB1c2goe1xuICAgICAgICBtb2RlbE5hbWUsXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIHBhdGgsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBvcmlnaW5hbE1ldGhvZCA9IGRlc2NyaXB0b3IudmFsdWU7XG4gICAgZGVzY3JpcHRvci52YWx1ZSA9IGFzeW5jIGZ1bmN0aW9uICh0aGlzOiBCYXNlTW9kZWxDbGFzcyB8IEJhc2VGcmFtZUNsYXNzLCAuLi5hcmdzOiB1bmtub3duW10pIHtcbiAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgQmFzZU1vZGVsQ2xhc3MpIHtcbiAgICAgICAgZ2V0TG9nZ2VyKGNvbnZlcnREb21haW5Ub0NhdGVnb3J5KHRoaXMubW9kZWxOYW1lLCBcIm1vZGVsXCIpKS5kZWJ1ZyhcbiAgICAgICAgICBcImFwaToge2h0dHBNZXRob2R9IHttb2RlbH0ue21ldGhvZH1cIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBodHRwTWV0aG9kOiBvcHRpb25zLmh0dHBNZXRob2QsXG4gICAgICAgICAgICBtb2RlbDogbW9kZWxOYW1lLFxuICAgICAgICAgICAgbWV0aG9kOiBtZXRob2ROYW1lLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgQmFzZUZyYW1lQ2xhc3MpIHtcbiAgICAgICAgZ2V0TG9nZ2VyKGNvbnZlcnREb21haW5Ub0NhdGVnb3J5KHRoaXMuZnJhbWVOYW1lLCBcImZyYW1lXCIpKS5kZWJ1ZyhcbiAgICAgICAgICBcImFwaToge2h0dHBNZXRob2R9IHttb2RlbH0ue21ldGhvZH1cIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBodHRwTWV0aG9kOiBvcHRpb25zLmh0dHBNZXRob2QsXG4gICAgICAgICAgICBtb2RlbDogbW9kZWxOYW1lLFxuICAgICAgICAgICAgbWV0aG9kOiBtZXRob2ROYW1lLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvcmlnaW5hbE1ldGhvZC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RyZWFtKG9wdGlvbnM6IFN0cmVhbURlY29yYXRvck9wdGlvbnMpIHtcbiAgcmV0dXJuICh0YXJnZXQ6IERlY29yYXRvclRhcmdldCwgcHJvcGVydHlLZXk6IHN0cmluZywgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yKSA9PiB7XG4gICAgY29uc3QgbW9kZWxOYW1lID0gdGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWUubWF0Y2goLyguKylDbGFzcyQvKT8uWzFdO1xuICAgIGFzc2VydChcbiAgICAgIG1vZGVsTmFtZSxcbiAgICAgIGBtb2RlbE5hbWUgaXMgcmVxdWlyZWQgb24gQHN0cmVhbSBkZWNvcmF0b3Igb24gJHt0YXJnZXQuY29uc3RydWN0b3IubmFtZX0uJHtwcm9wZXJ0eUtleX1gLFxuICAgICk7XG4gICAgY29uc3QgbWV0aG9kTmFtZSA9IHByb3BlcnR5S2V5O1xuXG4gICAgLy8g66mU7ISc65Oc7JeQIOqxuOumsCDrjbDsvZTroIjsnbTthLAg7KSR67O1IOyytO2BrFxuICAgIGNoZWNrU2luZ2xlRGVjb3JhdG9yKHRhcmdldCwgcHJvcGVydHlLZXksIERFQ09SQVRPUl9UWVBFUy5TVFJFQU0pO1xuXG4gICAgY29uc3QgZGVmYXVsdFBhdGggPSBgLyR7aW5mbGVjdGlvbi5jYW1lbGl6ZShcbiAgICAgIG1vZGVsTmFtZS5yZXBsYWNlKC9Nb2RlbCQvLCBcIlwiKS5yZXBsYWNlKC9GcmFtZSQvLCBcIlwiKSxcbiAgICAgIHRydWUsXG4gICAgKX0vJHtpbmZsZWN0aW9uLmNhbWVsaXplKHByb3BlcnR5S2V5LCB0cnVlKX1gO1xuICAgIGNvbnN0IHBhdGggPSBvcHRpb25zLnBhdGggPz8gZGVmYXVsdFBhdGg7XG4gICAgLy8gc3RyZWFtIOyghOyaqSDtlYTrk5woZXZlbnRzLCB0eXBlKeuKlCBBcGlEZWNvcmF0b3JPcHRpb25z7JeQIOyGje2VmOyngCDslYrsnLzrr4DroZwg7KCc7Jm4XG4gICAgY29uc3QgeyBldmVudHM6IF8sIHR5cGU6IF90eXBlLCAuLi5hcGlPcHRpb25zIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IG9wdGlvbnNXaXRoRGVmYXVsdHMgPSB7XG4gICAgICAuLi5hcGlPcHRpb25zLFxuICAgICAgaHR0cE1ldGhvZDogXCJHRVRcIiBhcyBIVFRQTWV0aG9kcyxcbiAgICB9O1xuXG4gICAgY29uc3QgZXhpc3RpbmdBcGkgPSByZWdpc3RlcmVkQXBpcy5maW5kKFxuICAgICAgKGFwaSkgPT4gYXBpLm1vZGVsTmFtZSA9PT0gbW9kZWxOYW1lICYmIGFwaS5tZXRob2ROYW1lID09PSBtZXRob2ROYW1lLFxuICAgICk7XG4gICAgaWYgKGV4aXN0aW5nQXBpKSB7XG4gICAgICAvLyDquLDsobTsnZggcGF0aOyZgCDsg4jroZzsmrQgcGF0aOqwgCDri6TrpbTri6TrqbQoPeu5iCDsiqTtirjrp4HsnbQg7JWE64uI7JeI64qU642wIOuLpOuluCDsiqTtirjrp4HsnLzroZwg67CU64CM6rKMIOuQnOuLpOuptCkg7JeQ65+s66W8IO2EsOucqOugpOykjeuLiOuLpC5cbiAgICAgIGFzc2VydE5vQ29uZmxpY3RpbmdQYXRoKFwic3RyZWFtXCIsIG1vZGVsTmFtZSwgbWV0aG9kTmFtZSwgZXhpc3RpbmdBcGkucGF0aCwgcGF0aCk7XG4gICAgICBleGlzdGluZ0FwaS5wYXRoID0gcGF0aDtcblxuICAgICAgLy8g6riw7KG07J2YIOyYteyFmOqzvCDsg4jroZzsmrQg7Ji17IWY7J20IOqyuey5mOuKlCDrtoDrtoTsnbQg7J6I64uk66m0IOyXkOufrOulvCDthLDrnKjroKTspI3ri4jri6QuXG4gICAgICBhc3NlcnROb0NvbmZsaWN0aW5nT3B0aW9ucyhcbiAgICAgICAgXCJzdHJlYW1cIixcbiAgICAgICAgbW9kZWxOYW1lLFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICBleGlzdGluZ0FwaS5vcHRpb25zLFxuICAgICAgICBvcHRpb25zV2l0aERlZmF1bHRzLFxuICAgICAgKTtcbiAgICAgIGV4aXN0aW5nQXBpLm9wdGlvbnMgPSB7XG4gICAgICAgIC4uLmV4aXN0aW5nQXBpLm9wdGlvbnMsIC8vIOq4sOyhtOydmCDsmLXshZjsnYQg7KG07KSR7ZWY65CYXG4gICAgICAgIC4uLm9wdGlvbnNXaXRoRGVmYXVsdHMsIC8vIEBzdHJlYW0g642w7L2U66CI7J207YSw7J2YIOyYteyFmOydhCDstpTqsIDtlanri4jri6QuXG4gICAgICB9O1xuXG4gICAgICBleGlzdGluZ0FwaS5zdHJlYW1PcHRpb25zID0gb3B0aW9ucztcbiAgICB9IGVsc2Uge1xuICAgICAgcmVnaXN0ZXJlZEFwaXMucHVzaCh7XG4gICAgICAgIG1vZGVsTmFtZSxcbiAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgcGF0aCxcbiAgICAgICAgb3B0aW9uczogb3B0aW9uc1dpdGhEZWZhdWx0cyxcbiAgICAgICAgc3RyZWFtT3B0aW9uczogb3B0aW9ucyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IG9yaWdpbmFsTWV0aG9kID0gZGVzY3JpcHRvci52YWx1ZTtcbiAgICBkZXNjcmlwdG9yLnZhbHVlID0gYXN5bmMgZnVuY3Rpb24gKHRoaXM6IEJhc2VNb2RlbENsYXNzIHwgQmFzZUZyYW1lQ2xhc3MsIC4uLmFyZ3M6IHVua25vd25bXSkge1xuICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBCYXNlTW9kZWxDbGFzcykge1xuICAgICAgICBnZXRMb2dnZXIoY29udmVydERvbWFpblRvQ2F0ZWdvcnkodGhpcy5tb2RlbE5hbWUsIFwibW9kZWxcIikpLmRlYnVnKFxuICAgICAgICAgIFwic3RyZWFtOiB7bW9kZWx9LnttZXRob2R9XCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kZWw6IG1vZGVsTmFtZSxcbiAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kTmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEJhc2VGcmFtZUNsYXNzKSB7XG4gICAgICAgIGdldExvZ2dlcihjb252ZXJ0RG9tYWluVG9DYXRlZ29yeSh0aGlzLmZyYW1lTmFtZSwgXCJmcmFtZVwiKSkuZGVidWcoXG4gICAgICAgICAgXCJzdHJlYW06IHttb2RlbH0ue21ldGhvZH1cIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2RlbDogbW9kZWxOYW1lLFxuICAgICAgICAgICAgbWV0aG9kOiBtZXRob2ROYW1lLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvcmlnaW5hbE1ldGhvZC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNhY3Rpb25hbChvcHRpb25zOiBUcmFuc2FjdGlvbmFsT3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHsgaXNvbGF0aW9uLCByZWFkT25seSwgZGJQcmVzZXQgPSBcIndcIiB9ID0gb3B0aW9ucztcblxuICByZXR1cm4gKHRhcmdldDogRGVjb3JhdG9yVGFyZ2V0LCBwcm9wZXJ0eUtleTogc3RyaW5nLCBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3IpID0+IHtcbiAgICBjb25zdCBvcmlnaW5hbE1ldGhvZCA9IGRlc2NyaXB0b3IudmFsdWU7XG4gICAgY29uc3QgbW9kZWxOYW1lID0gdGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWUubWF0Y2goLyguKylDbGFzcyQvKT8uWzFdO1xuICAgIGFzc2VydChcbiAgICAgIG1vZGVsTmFtZSxcbiAgICAgIGBtb2RlbE5hbWUgaXMgcmVxdWlyZWQgb24gQHN0cmVhbSBkZWNvcmF0b3Igb24gJHt0YXJnZXQuY29uc3RydWN0b3IubmFtZX0uJHtwcm9wZXJ0eUtleX1gLFxuICAgICk7XG4gICAgY29uc3QgbWV0aG9kTmFtZSA9IHByb3BlcnR5S2V5O1xuXG4gICAgZGVzY3JpcHRvci52YWx1ZSA9IGFzeW5jIGZ1bmN0aW9uICh0aGlzOiBCYXNlTW9kZWxDbGFzcywgLi4uYXJnczogdW5rbm93bltdKSB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcInRyYW5zYWN0aW9uYWw6IHttb2RlbH0ue21ldGhvZH1cIiwge1xuICAgICAgICBtb2RlbDogbW9kZWxOYW1lLFxuICAgICAgICBtZXRob2Q6IG1ldGhvZE5hbWUsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZXhpc3RpbmdDb250ZXh0ID0gREIudHJhbnNhY3Rpb25TdG9yYWdlLmdldFN0b3JlKCk7XG5cbiAgICAgIC8vIEFzeW5jTG9jYWxTdG9yYWdlIOy7qO2FjeyKpO2KuCDsl4bqsbDrgpgg7ZW064u5IHByZXNldOydmCDtirjrnpzsnq3shZjsnbQg7JeG7Jy866m0IOyDiOuhnCDsi5zsnpFcbiAgICAgIGNvbnN0IHN0YXJ0VHJhbnNhY3Rpb24gPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHB1cmkgPSB0aGlzLmdldFB1cmkoZGJQcmVzZXQpIGFzIFB1cmlXcmFwcGVyO1xuXG4gICAgICAgIHJldHVybiBwdXJpLmtuZXgudHJhbnNhY3Rpb24oXG4gICAgICAgICAgYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXCJuZXcgdHJhbnNhY3Rpb24gY29udGV4dDoge2RiUHJlc2V0fVwiLCB7IGRiUHJlc2V0IH0pO1xuICAgICAgICAgICAgY29uc3QgdHJ4V3JhcHBlciA9IG5ldyBQdXJpVHJhbnNhY3Rpb25XcmFwcGVyKHRyeCwgbmV3IFVwc2VydEJ1aWxkZXIoKSk7XG4gICAgICAgICAgICAvLyBUcmFuc2FjdGlvbkNvbnRleHTsl5Ag7Yq4656c7J6t7IWYIOyggOyepVxuICAgICAgICAgICAgREIuZ2V0VHJhbnNhY3Rpb25Db250ZXh0KCkuc2V0VHJhbnNhY3Rpb24oZGJQcmVzZXQsIHRyeFdyYXBwZXIpO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgb3JpZ2luYWxNZXRob2QuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAvLyDtirjrnpzsnq3shZgg7KCc6rGwXG4gICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFwiZGVsZXRlIHRyYW5zYWN0aW9uIGNvbnRleHQ6IHtkYlByZXNldH1cIiwgeyBkYlByZXNldCB9KTtcbiAgICAgICAgICAgICAgREIuZ2V0VHJhbnNhY3Rpb25Db250ZXh0KCkuZGVsZXRlVHJhbnNhY3Rpb24oZGJQcmVzZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBpc29sYXRpb25MZXZlbDogaXNvbGF0aW9uLCByZWFkT25seSB9LFxuICAgICAgICApO1xuICAgICAgfTtcblxuICAgICAgLy8gQXN5bmNMb2NhbFN0b3JhZ2Ug7Luo7YWN7Iqk7Yq46rCAIOyXhuycvOuptCDsg4jroZwg7IOd7ISxXG4gICAgICBpZiAoIWV4aXN0aW5nQ29udGV4dCkge1xuICAgICAgICByZXR1cm4gREIucnVuV2l0aFRyYW5zYWN0aW9uKHN0YXJ0VHJhbnNhY3Rpb24pO1xuICAgICAgfVxuXG4gICAgICAvLyDsnbTrr7ggQXN5bmNMb2NhbFN0b3JhZ2Ug7Luo7YWN7Iqk7Yq4IOyViOyXkCDsnojripTsp4Ag7ZmV7J24IO2bhCDtlbTri7kgcHJlc2V07J2YIO2KuOuenOyereyFmOydtCDsnbTrr7gg7J6I7Jy866m0IOyerOyCrOyaqVxuICAgICAgaWYgKGV4aXN0aW5nQ29udGV4dD8uZ2V0VHJhbnNhY3Rpb24oZGJQcmVzZXQpKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFwicmV1c2UgdHJhbnNhY3Rpb24gY29udGV4dDoge2RiUHJlc2V0fVwiLCB7IGRiUHJlc2V0IH0pO1xuICAgICAgICByZXR1cm4gb3JpZ2luYWxNZXRob2QuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICB9XG5cbiAgICAgIC8vIOy7qO2FjeyKpO2KuOuKlCDsnojsp4Drp4wg7J20IHByZXNldOydmCDtirjrnpzsnq3shZjsnYAg7JeG64qUIOqyveyasCAo6rCZ7J2AIOy7qO2FjeyKpO2KuCDrgrTsl5DshJwg7Iuk7ZaJKVxuICAgICAgcmV0dXJuIHN0YXJ0VHJhbnNhY3Rpb24oKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gIH07XG59XG5cbi8qKlxuICog7YyM7J28IOyXheuhnOuTnCBBUEnrpbwg7IOd7ISx7ZW07KSN64uI64ukLiAoQGFwaSDrjbDsvZTroIjsnbTthLAg7JeG7J20IOuPheumveyggeycvOuhnCDsgqzsmqkpXG4gKiBAcGFyYW0gb3B0aW9uc1xuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwbG9hZChvcHRpb25zOiBVcGxvYWREZWNvcmF0b3JPcHRpb25zID0geyBjb25zdW1lOiBcImJ1ZmZlclwiIH0pIHtcbiAgcmV0dXJuICh0YXJnZXQ6IERlY29yYXRvclRhcmdldCwgcHJvcGVydHlLZXk6IHN0cmluZywgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yKSA9PiB7XG4gICAgY29uc3Qgb3JpZ2luYWxNZXRob2QgPSBkZXNjcmlwdG9yLnZhbHVlO1xuICAgIGNvbnN0IG1vZGVsTmFtZSA9IHRhcmdldC5jb25zdHJ1Y3Rvci5uYW1lLm1hdGNoKC8oLispQ2xhc3MkLyk/LlsxXTtcbiAgICBhc3NlcnQoXG4gICAgICBtb2RlbE5hbWUsXG4gICAgICBgbW9kZWxOYW1lIGlzIHJlcXVpcmVkIG9uIEB1cGxvYWQgZGVjb3JhdG9yIG9uICR7dGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWV9LiR7cHJvcGVydHlLZXl9YCxcbiAgICApO1xuICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBwcm9wZXJ0eUtleTtcblxuICAgIC8vIOuplOyEnOuTnOyXkCDqsbjrprAg642w7L2U66CI7J207YSwIOykkeuztSDssrTtgaxcbiAgICBjaGVja1NpbmdsZURlY29yYXRvcih0YXJnZXQsIHByb3BlcnR5S2V5LCBERUNPUkFUT1JfVFlQRVMuVVBMT0FEKTtcblxuICAgIGNvbnN0IGRlZmF1bHRQYXRoID0gYC8ke2luZmxlY3Rpb24uY2FtZWxpemUoXG4gICAgICBtb2RlbE5hbWUucmVwbGFjZSgvTW9kZWwkLywgXCJcIikucmVwbGFjZSgvRnJhbWUkLywgXCJcIiksXG4gICAgICB0cnVlLFxuICAgICl9LyR7aW5mbGVjdGlvbi5jYW1lbGl6ZShtZXRob2ROYW1lLCB0cnVlKX1gO1xuXG4gICAgLy8gcmVnaXN0ZXJlZEFwaXPsl5DshJwg7ZW064u5IEFQSSDssL7slYTshJwgdXBsb2FkT3B0aW9ucyDstpTqsIBcbiAgICBjb25zdCBleGlzdGluZ0FwaSA9IHJlZ2lzdGVyZWRBcGlzLmZpbmQoXG4gICAgICAoYXBpKSA9PiBhcGkubW9kZWxOYW1lID09PSBtb2RlbE5hbWUgJiYgYXBpLm1ldGhvZE5hbWUgPT09IG1ldGhvZE5hbWUsXG4gICAgKTtcblxuICAgIGlmIChleGlzdGluZ0FwaSkge1xuICAgICAgLy8g7J6s65Ox66GdIOyLnCDsl4XroZzrk5wg7Ji17IWY66eMIOqwseyLoFxuICAgICAgZXhpc3RpbmdBcGkudXBsb2FkT3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOyDiOuhnCDrk7HroZ1cbiAgICAgIHJlZ2lzdGVyZWRBcGlzLnB1c2goe1xuICAgICAgICBtb2RlbE5hbWUsXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIHBhdGg6IGRlZmF1bHRQYXRoLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgaHR0cE1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgY2xpZW50czogW1wiYXhpb3MtbXVsdGlwYXJ0XCIsIFwidGFuc3RhY2stbXV0YXRpb24tbXVsdGlwYXJ0XCJdLFxuICAgICAgICAgIGd1YXJkczogb3B0aW9ucy5ndWFyZHMsXG4gICAgICAgICAgZGVzY3JpcHRpb246IG9wdGlvbnMuZGVzY3JpcHRpb24sXG4gICAgICAgIH0sXG4gICAgICAgIHVwbG9hZE9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBkZXNjcmlwdG9yLnZhbHVlID0gYXN5bmMgZnVuY3Rpb24gKHRoaXM6IEJhc2VNb2RlbENsYXNzIHwgQmFzZUZyYW1lQ2xhc3MsIC4uLmFyZ3M6IHVua25vd25bXSkge1xuICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBCYXNlTW9kZWxDbGFzcykge1xuICAgICAgICBnZXRMb2dnZXIoY29udmVydERvbWFpblRvQ2F0ZWdvcnkodGhpcy5tb2RlbE5hbWUsIFwibW9kZWxcIikpLmRlYnVnKFxuICAgICAgICAgIFwidXBsb2FkOiB7bW9kZWx9LnttZXRob2R9XCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kZWw6IG1vZGVsTmFtZSxcbiAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kTmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEJhc2VGcmFtZUNsYXNzKSB7XG4gICAgICAgIGdldExvZ2dlcihjb252ZXJ0RG9tYWluVG9DYXRlZ29yeSh0aGlzLmZyYW1lTmFtZSwgXCJmcmFtZVwiKSkuZGVidWcoXG4gICAgICAgICAgXCJ1cGxvYWQ6IHttb2RlbH0ue21ldGhvZH1cIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2RlbDogbW9kZWxOYW1lLFxuICAgICAgICAgICAgbWV0aG9kOiBtZXRob2ROYW1lLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvcmlnaW5hbE1ldGhvZC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gIH07XG59XG5cbi8qKlxuICog6riw7KG07J2YIHBhdGjsmYAg7IOI66Gc7Jq0IHBhdGjqsIAg64uk66W064uk66m0KD3qsJLsnbQg7J6I642YIOyKpO2KuOungeydtCDri6Trpbgg6rCS7J20IOyeiOuKlCDsiqTtirjrp4HsnLzroZwg67CU64CM6rKMIOuQnOuLpOuptCkg7JeQ65+s66W8IO2EsOucqOugpOykjeuLiOuLpC5cbiAqIEBwYXJhbSBkZWNvcmF0b3JOYW1lIOuNsOy9lOugiOydtO2EsCDsnbTrpoRcbiAqIEBwYXJhbSBtb2RlbE5hbWUg66qo6424IOydtOumhFxuICogQHBhcmFtIG1ldGhvZE5hbWUg66mU7ISc65OcIOydtOumhFxuICogQHBhcmFtIGV4aXN0aW5nUGF0aCDquLDsobTsnZggcGF0aFxuICogQHBhcmFtIG5ld1BhdGgg7IOI66Gc7Jq0IHBhdGhcbiAqL1xuZnVuY3Rpb24gYXNzZXJ0Tm9Db25mbGljdGluZ1BhdGgoXG4gIGRlY29yYXRvck5hbWU6IHN0cmluZyxcbiAgbW9kZWxOYW1lOiBzdHJpbmcsXG4gIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgZXhpc3RpbmdQYXRoOiBzdHJpbmcsXG4gIG5ld1BhdGg6IHN0cmluZyxcbikge1xuICBpZiAoZXhpc3RpbmdQYXRoICE9PSBcIlwiICYmIG5ld1BhdGggIT09IFwiXCIgJiYgZXhpc3RpbmdQYXRoICE9PSBuZXdQYXRoKSB7XG4gICAgLy8g7J206rKD7J20IOustOyKqCDsg4HtmansnbTrg5DrqbTsmpQsIGFwaS5wYXRo6rCAIOuNruyWtOyUjOybjOyngOuKlCDsg4HtmansnoXri4jri6QuXG4gICAgLy8g6rCA66C5IEBhcGkoeyBwYXRoOiBcIi9hcGkvdjEvdXNlcnNcIiB9KSDrjbDsvZTroIjsnbTthLDqsIAg67aZ7Ja07J6I64qUIOuplOyEnOuTnOyXkFxuICAgIC8vIEBzdHJlYW0oeyBwYXRoOiBcIi9hcGkvdjEvdXNlcnMvc3RyZWFtXCIgfSkg6rCZ7J2AIOqyg+ydtCDrtpnslrQg7J6I64qUIOyDge2ZqeyeheuLiOuLpC5cbiAgICAvLyDsnbTroIfqsowg65CY66m0IOuRkCDrjbDsvZTroIjsnbTthLDqsIAg6rCZ7J2AIGFwaeydmCBwYXRoIO2VhOuTnOulvCDqsbTrk5zrpqzqsowg65CY66+A66GcLCDsl5Drn6zrpbwg7YSw65yo66Ck7KSN64uI64ukLlxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBAJHtkZWNvcmF0b3JOYW1lfSBkZWNvcmF0b3Igb24gJHttb2RlbE5hbWV9LiR7bWV0aG9kTmFtZX0gaGFzIGNvbmZsaWN0aW5nIHBhdGg6ICR7bmV3UGF0aH0uIFRoZSBkZWNvcmF0b3IgaXMgdHJ5aW5nIHRvIG92ZXJyaWRlIHRoZSBleGlzdGluZyBwYXRoKCR7ZXhpc3RpbmdQYXRofSkgd2l0aCB0aGUgbmV3IHBhdGgoJHtuZXdQYXRofSkuYCxcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICog6riw7KG07J2YIOyYteyFmOqzvCDsg4jroZzsmrQg7Ji17IWY7J20IOqyuey5mOuKlCDrtoDrtoTsnbQg7J6I64uk66m0IOyXkOufrOulvCDthLDrnKjroKTspI3ri4jri6QuXG4gKiBAcGFyYW0gZGVjb3JhdG9yTmFtZSDrjbDsvZTroIjsnbTthLAg7J2066aEXG4gKiBAcGFyYW0gbW9kZWxOYW1lIOuqqOuNuCDsnbTrpoRcbiAqIEBwYXJhbSBtZXRob2ROYW1lIOuplOyEnOuTnCDsnbTrpoRcbiAqIEBwYXJhbSBleGlzdGluZ09wdGlvbnMg6riw7KG07J2YIOyYteyFmFxuICogQHBhcmFtIG5ld09wdGlvbnMg7IOI66Gc7Jq0IOyYteyFmFxuICovXG5mdW5jdGlvbiBhc3NlcnROb0NvbmZsaWN0aW5nT3B0aW9ucyhcbiAgZGVjb3JhdG9yTmFtZTogc3RyaW5nLFxuICBtb2RlbE5hbWU6IHN0cmluZyxcbiAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IDzslYQg7Im96rKM7Im96rKMIOyigCDqsJHsi5zri6Q+XG4gIGV4aXN0aW5nT3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PixcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiA87J2065+0IOuVjCDslYTri4jrqbQgYW55IOyWuOygnCDslIHri4jquYw+XG4gIG5ld09wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4pIHtcbiAgT2JqZWN0LmtleXMobmV3T3B0aW9ucykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgaWYgKGV4aXN0aW5nT3B0aW9uc1trZXldICYmICFpc0VxdWFsKGV4aXN0aW5nT3B0aW9uc1trZXldLCBuZXdPcHRpb25zW2tleV0pKSB7XG4gICAgICAvLyDsnbTqsoPsnbQg66y07IqoIOyDge2ZqeydtOuDkOuptOyalCwgYXBpLm9wdGlvbnPqsIAg642u7Ja07JSM7JuM7KeA64qUIOyDge2ZqeyeheuLiOuLpC5cbiAgICAgIC8vIOqwgOuguSBAYXBpKHsgcmVzb3VyY2VOYW1lOiBcIlVzZXJzXCIgfSkg642w7L2U66CI7J207YSw6rCAIOu2meyWtOyeiOuKlCDrqZTshJzrk5zsl5BcbiAgICAgIC8vIEBzdHJlYW0oeyByZXNvdXJjZU5hbWU6IFwiUG9zdHNcIiB9KSDqsJnsnYAg6rKD7J20IOu2meyWtCDsnojripQg7IOB7Zmp7J6F64uI64ukLlxuICAgICAgLy8g7J2066CH6rKMIOuQmOuptCDrkZAg642w7L2U66CI7J207YSw6rCAIOqwmeydgCBhcGnsnZggb3B0aW9ucyDsho0g6rCZ7J2AIO2VhOuTnOulvCDqsbTrk5zrpqzqsowg65CY66+A66GcLCDsl5Drn6zrpbwg7YSw65yo66Ck7KSN64uI64ukLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQCR7ZGVjb3JhdG9yTmFtZX0gZGVjb3JhdG9yIG9uICR7bW9kZWxOYW1lfS4ke21ldGhvZE5hbWV9IGhhcyBjb25mbGljdGluZyBvcHRpb25zOiAke2tleX0uIFRoZSBkZWNvcmF0b3IgaXMgdHJ5aW5nIHRvIG92ZXJyaWRlIHRoZSBleGlzdGluZyBvcHRpb24oJHtKU09OLnN0cmluZ2lmeShleGlzdGluZ09wdGlvbnNba2V5XSl9KSB3aXRoIHRoZSBuZXcgb3B0aW9uKCR7SlNPTi5zdHJpbmdpZnkobmV3T3B0aW9uc1trZXldKX0pLmAsXG4gICAgICApO1xuICAgIH1cbiAgfSk7XG59XG4iXSwibmFtZXMiOlsiZ2V0TG9nZ2VyIiwiYXNzZXJ0IiwiaW5mbGVjdGlvbiIsImlzRXF1YWwiLCJCYXNlTW9kZWxDbGFzcyIsIkRCIiwiUHVyaVRyYW5zYWN0aW9uV3JhcHBlciIsIlVwc2VydEJ1aWxkZXIiLCJjb252ZXJ0RG9tYWluVG9DYXRlZ29yeSIsIkJhc2VGcmFtZUNsYXNzIiwicmVnaXN0ZXJlZEFwaXMiLCJERUNPUkFUT1JfVFlQRVMiLCJBUEkiLCJTeW1ib2wiLCJTVFJFQU0iLCJVUExPQUQiLCJjaGVja1NpbmdsZURlY29yYXRvciIsInRhcmdldCIsInByb3BlcnR5S2V5IiwiZGVjb3JhdG9yVHlwZSIsIm1ldGhvZCIsIl9fZGVjb3JhdG9yVHlwZSIsIkVycm9yIiwiU3RyaW5nIiwibmFtZSIsImFwaSIsIm9wdGlvbnMiLCJodHRwTWV0aG9kIiwiY29udGVudFR5cGUiLCJjbGllbnRzIiwiZGVzY3JpcHRvciIsIm1vZGVsTmFtZSIsIm1hdGNoIiwibWV0aG9kTmFtZSIsImRlZmF1bHRQYXRoIiwiY2FtZWxpemUiLCJyZXBsYWNlIiwicGF0aCIsImV4aXN0aW5nQXBpIiwiZmluZCIsImFzc2VydE5vQ29uZmxpY3RpbmdQYXRoIiwiYXNzZXJ0Tm9Db25mbGljdGluZ09wdGlvbnMiLCJwdXNoIiwib3JpZ2luYWxNZXRob2QiLCJ2YWx1ZSIsImFyZ3MiLCJkZWJ1ZyIsIm1vZGVsIiwiZnJhbWVOYW1lIiwiYXBwbHkiLCJzdHJlYW0iLCJldmVudHMiLCJfIiwidHlwZSIsIl90eXBlIiwiYXBpT3B0aW9ucyIsIm9wdGlvbnNXaXRoRGVmYXVsdHMiLCJzdHJlYW1PcHRpb25zIiwidHJhbnNhY3Rpb25hbCIsImlzb2xhdGlvbiIsInJlYWRPbmx5IiwiZGJQcmVzZXQiLCJsb2dnZXIiLCJleGlzdGluZ0NvbnRleHQiLCJ0cmFuc2FjdGlvblN0b3JhZ2UiLCJnZXRTdG9yZSIsInN0YXJ0VHJhbnNhY3Rpb24iLCJwdXJpIiwiZ2V0UHVyaSIsImtuZXgiLCJ0cmFuc2FjdGlvbiIsInRyeCIsInRyeFdyYXBwZXIiLCJnZXRUcmFuc2FjdGlvbkNvbnRleHQiLCJzZXRUcmFuc2FjdGlvbiIsImRlbGV0ZVRyYW5zYWN0aW9uIiwiaXNvbGF0aW9uTGV2ZWwiLCJydW5XaXRoVHJhbnNhY3Rpb24iLCJnZXRUcmFuc2FjdGlvbiIsInVwbG9hZCIsImNvbnN1bWUiLCJ1cGxvYWRPcHRpb25zIiwiZ3VhcmRzIiwiZGVzY3JpcHRpb24iLCJkZWNvcmF0b3JOYW1lIiwiZXhpc3RpbmdQYXRoIiwibmV3UGF0aCIsImV4aXN0aW5nT3B0aW9ucyIsIm5ld09wdGlvbnMiLCJPYmplY3QiLCJrZXlzIiwiZm9yRWFjaCIsImtleSIsIkpTT04iLCJzdHJpbmdpZnkiXSwibWFwcGluZ3MiOiJBQUNBLFNBQVNB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
@@ -1 +1 @@
1
- {"version":3,"file":"services.template.d.ts","sourceRoot":"","sources":["../../../src/template/implementations/services.template.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGzD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvC,qBAAa,kBAAmB,SAAQ,QAAQ;;IAK9C,gBAAgB;;;;IAOhB,MAAM,CAAC,EAAE,EAAE,eAAe,CAAC,UAAU,CAAC;;;;;;;CAmWvC"}
1
+ {"version":3,"file":"services.template.d.ts","sourceRoot":"","sources":["../../../src/template/implementations/services.template.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGzD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvC,qBAAa,kBAAmB,SAAQ,QAAQ;;IAK9C,gBAAgB;;;;IAOhB,MAAM,CAAC,EAAE,EAAE,eAAe,CAAC,UAAU,CAAC;;;;;;;CAgWvC"}
@@ -102,9 +102,6 @@ export async function ${methodName}${typeParamsDef}(
102
102
  return fetch({
103
103
  method: 'POST',
104
104
  url: \`${apiBaseUrl}\`,
105
- headers: {
106
- "Content-Type": "multipart/form-data",
107
- },
108
105
  onUploadProgress,
109
106
  data: formData,
110
107
  ${api.options.timeout ? `signal: AbortSignal.timeout(${api.options.timeout}),` : ""}
@@ -268,4 +265,4 @@ export const ${names.capital}AsyncIdConfig: AsyncIdConfig<${names.capital}Subset
268
265
  }
269
266
  }
270
267
 
271
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW1wbGF0ZS9pbXBsZW1lbnRhdGlvbnMvc2VydmljZXMudGVtcGxhdGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB7IGRpZmYsIHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQge1xuICBhcGlQYXJhbVRvVHNDb2RlLFxuICBhcGlQYXJhbVR5cGVUb1RzVHlwZSxcbiAgdW53cmFwUHJvbWlzZU9uY2UsXG59IGZyb20gXCIuLi8uLi9hcGkvY29kZS1jb252ZXJ0ZXJzXCI7XG5pbXBvcnQgdHlwZSB7IEV4dGVuZGVkQXBpIH0gZnJvbSBcIi4uLy4uL2FwaS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi8uLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB0eXBlIHsgVGVtcGxhdGVPcHRpb25zIH0gZnJvbSBcIi4uLy4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBBcGlQYXJhbVR5cGUgfSBmcm9tIFwiLi4vLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGFzc2VydERlZmluZWQgfSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IFRlbXBsYXRlIH0gZnJvbSBcIi4uL3RlbXBsYXRlXCI7XG5pbXBvcnQgeyBCVUlMVF9JTl9UWVBFUywgem9kVHlwZVRvVHNUeXBlRGVmIH0gZnJvbSBcIi4uL3pvZC1jb252ZXJ0ZXJcIjtcblxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlX19zZXJ2aWNlcyBleHRlbmRzIFRlbXBsYXRlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJzZXJ2aWNlc1wiKTtcbiAgfVxuXG4gIGdldFRhcmdldEFuZFBhdGgoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRhcmdldDogXCI6dGFyZ2V0L3NyYy9zZXJ2aWNlc1wiLFxuICAgICAgcGF0aDogYHNlcnZpY2VzLmdlbmVyYXRlZC50c2AsXG4gICAgfTtcbiAgfVxuXG4gIHJlbmRlcih7fTogVGVtcGxhdGVPcHRpb25zW1wic2VydmljZXNcIl0pIHtcbiAgICBjb25zdCB7IGFwaXMgfSA9IFNvbmFtdS5zeW5jZXI7XG5cbiAgICAvLyDrqqjrjbjrs4TroZwg6re466O57ZmUXG4gICAgY29uc3QgYXBpc0J5TW9kZWwgPSBuZXcgTWFwPHN0cmluZywgRXh0ZW5kZWRBcGlbXT4oKTtcbiAgICBmb3IgKGNvbnN0IGFwaSBvZiBhcGlzKSB7XG4gICAgICBjb25zdCBtb2RlbE5hbWUgPSBhcGkubW9kZWxOYW1lLnJlcGxhY2UoL01vZGVsJC8sIFwiXCIpLnJlcGxhY2UoL0ZyYW1lJC8sIFwiXCIpO1xuICAgICAgaWYgKCFhcGlzQnlNb2RlbC5oYXMobW9kZWxOYW1lKSkge1xuICAgICAgICBhcGlzQnlNb2RlbC5zZXQobW9kZWxOYW1lLCBbXSk7XG4gICAgICB9XG4gICAgICBhcGlzQnlNb2RlbC5nZXQobW9kZWxOYW1lKT8ucHVzaChhcGkpO1xuICAgIH1cblxuICAgIGNvbnN0IGltcG9ydEtleXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgbmFtZXNwYWNlczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgdHlwZVBhcmFtTmFtZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFttb2RlbE5hbWUsIG1vZGVsQXBpc10gb2YgYXBpc0J5TW9kZWwpIHtcbiAgICAgIGNvbnN0IGZ1bmN0aW9uczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBhcGkgb2YgbW9kZWxBcGlzKSB7XG4gICAgICAgIC8vIEBzdHJlYW0g642w7L2U66CI7J207YSw6rCAIOyeiOycvOuptCBTU0Ug7Iqk7Yq466a8IO2VqOyImCDsg53shLFcbiAgICAgICAgaWYgKGFwaS5zdHJlYW1PcHRpb25zKSB7XG4gICAgICAgICAgY29uc3QgcGFyYW1zV2l0aG91dENvbnRleHQgPSBhcGkucGFyYW1ldGVycy5maWx0ZXIoXG4gICAgICAgICAgICAocGFyYW0pID0+XG4gICAgICAgICAgICAgICFBcGlQYXJhbVR5cGUuaXNDb250ZXh0KHBhcmFtLnR5cGUpICYmXG4gICAgICAgICAgICAgICFBcGlQYXJhbVR5cGUuaXNSZWZLbmV4KHBhcmFtLnR5cGUpICYmXG4gICAgICAgICAgICAgICEocGFyYW0ub3B0aW9uYWwgPT09IHRydWUgJiYgcGFyYW0ubmFtZS5zdGFydHNXaXRoKFwiX1wiKSksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IGFwaUJhc2VVcmwgPSBgJHtTb25hbXUuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9JHthcGkucGF0aH1gO1xuXG4gICAgICAgICAgY29uc3QgbWV0aG9kTmFtZVN0cmVhbSA9IGFwaS5vcHRpb25zLnJlc291cmNlTmFtZVxuICAgICAgICAgICAgPyBgdXNlJHtpbmZsZWN0aW9uLmNhbWVsaXplKGFwaS5vcHRpb25zLnJlc291cmNlTmFtZSl9YFxuICAgICAgICAgICAgOiBgdXNlJHtpbmZsZWN0aW9uLmNhbWVsaXplKGFwaS5tZXRob2ROYW1lKX1gO1xuICAgICAgICAgIGNvbnN0IG1ldGhvZE5hbWVTdHJlYW1DYW1lbGl6ZWQgPSBpbmZsZWN0aW9uLmNhbWVsaXplKG1ldGhvZE5hbWVTdHJlYW0sIHRydWUpO1xuXG4gICAgICAgICAgY29uc3QgZXZlbnRzVHlwZURlZiA9IHpvZFR5cGVUb1RzVHlwZURlZihhcGkuc3RyZWFtT3B0aW9ucy5ldmVudHMpO1xuXG4gICAgICAgICAgLy8g7YyM652866+47YSw66W8IOqwneyytCDtmJXtg5zroZwg7KCV7J2YICjtg4DsnoXqs7wg7Iuk7KCcIOqwkiDrqqjrkZDsl5Ag7IKs7JqpKVxuICAgICAgICAgIGNvbnN0IHBhcmFtc0RlZkFzT2JqZWN0ID1cbiAgICAgICAgICAgIHBhcmFtc1dpdGhvdXRDb250ZXh0Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgPyBgeyAke3BhcmFtc1dpdGhvdXRDb250ZXh0Lm1hcCgocCkgPT4gYCR7cC5uYW1lfTogJHthcGlQYXJhbVR5cGVUb1RzVHlwZShwLnR5cGUsIGltcG9ydEtleXMpfWApLmpvaW4oXCIsIFwiKX0gfWBcbiAgICAgICAgICAgICAgOiBcInt9XCI7XG5cbiAgICAgICAgICBmdW5jdGlvbnMucHVzaChcbiAgICAgICAgICAgIGBcbmV4cG9ydCBmdW5jdGlvbiAke21ldGhvZE5hbWVTdHJlYW1DYW1lbGl6ZWR9KFxuICBwYXJhbXM6ICR7cGFyYW1zRGVmQXNPYmplY3R9LFxuICBoYW5kbGVyczogRXZlbnRIYW5kbGVyczwke2V2ZW50c1R5cGVEZWZ9ICYgeyBlbmQ/OiAoKSA9PiB2b2lkIH0+LFxuICBvcHRpb25zOiBTU0VTdHJlYW1PcHRpb25zXG4pIHtcbiAgcmV0dXJuIHVzZVNTRVN0cmVhbTwke2V2ZW50c1R5cGVEZWZ9PihcXGAke2FwaUJhc2VVcmx9XFxgLCBwYXJhbXMsIGhhbmRsZXJzLCBvcHRpb25zKTtcbn1cbiAgICAgICAgICAgIGAudHJpbSgpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb250ZXh0IOygnOyZuO2VnCDtjIzrnbzrr7jthLBcbiAgICAgICAgY29uc3QgcGFyYW1zV2l0aG91dENvbnRleHQgPSBhcGkucGFyYW1ldGVycy5maWx0ZXIoXG4gICAgICAgICAgKHBhcmFtKSA9PlxuICAgICAgICAgICAgIUFwaVBhcmFtVHlwZS5pc0NvbnRleHQocGFyYW0udHlwZSkgJiZcbiAgICAgICAgICAgICFBcGlQYXJhbVR5cGUuaXNSZWZLbmV4KHBhcmFtLnR5cGUpICYmXG4gICAgICAgICAgICAhKHBhcmFtLm9wdGlvbmFsID09PSB0cnVlICYmIHBhcmFtLm5hbWUuc3RhcnRzV2l0aChcIl9cIikpLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIO2DgOyehSDtjIzrnbzrr7jthLAg7KCV7J2YXG4gICAgICAgIGNvbnN0IHR5cGVQYXJhbWV0ZXJzQXNUc1R5cGUgPSBhcGkudHlwZVBhcmFtZXRlcnNcbiAgICAgICAgICAubWFwKCh0eXBlUGFyYW0pID0+IGFwaVBhcmFtVHlwZVRvVHNUeXBlKHR5cGVQYXJhbSwgaW1wb3J0S2V5cykpXG4gICAgICAgICAgLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgY29uc3QgdHlwZVBhcmFtc0RlZiA9IHR5cGVQYXJhbWV0ZXJzQXNUc1R5cGUgPyBgPCR7dHlwZVBhcmFtZXRlcnNBc1RzVHlwZX0+YCA6IFwiXCI7XG4gICAgICAgIHR5cGVQYXJhbU5hbWVzID0gdHlwZVBhcmFtTmFtZXMuY29uY2F0KGFwaS50eXBlUGFyYW1ldGVycy5tYXAoKHRwKSA9PiB0cC5pZCkpO1xuXG4gICAgICAgIC8vIO2MjOudvOuvuO2EsCDsoJXsnZhcbiAgICAgICAgY29uc3QgcGFyYW1zRGVmID0gYXBpUGFyYW1Ub1RzQ29kZShwYXJhbXNXaXRob3V0Q29udGV4dCwgaW1wb3J0S2V5cyk7XG4gICAgICAgIGNvbnN0IHBhcmFtTmFtZXMgPSBwYXJhbXNXaXRob3V0Q29udGV4dC5tYXAoKHApID0+IHAubmFtZSkuam9pbihcIiwgXCIpO1xuXG4gICAgICAgIC8vIOumrO2EtCDtg4DsnoUg7KCV7J2YXG4gICAgICAgIGNvbnN0IHJldHVyblR5cGVEZWYgPSBhcGlQYXJhbVR5cGVUb1RzVHlwZShcbiAgICAgICAgICBhc3NlcnREZWZpbmVkKHVud3JhcFByb21pc2VPbmNlKGFwaS5yZXR1cm5UeXBlKSksXG4gICAgICAgICAgaW1wb3J0S2V5cyxcbiAgICAgICAgKTtcblxuICAgICAgICAvLyDquLDrs7ggVVJMXG4gICAgICAgIGNvbnN0IGFwaUJhc2VVcmwgPSBgJHtTb25hbXUuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9JHthcGkucGF0aH1gO1xuXG4gICAgICAgIGNvbnN0IGNsaWVudHMgPSBhcGkub3B0aW9ucy5jbGllbnRzIHx8IFtdO1xuXG4gICAgICAgIC8vIDEuIGF4aW9zIO2VqOyImCDsg53shLFcbiAgICAgICAgLy8gcmVzb3VyY2VOYW1l7J20IOyeiOycvOuptCBnZXQgKyByZXNvdXJjZU5hbWUg7ZiV7YOc66GcIO2VqOyImOuqhSDsg53shLFcbiAgICAgICAgY29uc3QgbWV0aG9kTmFtZSA9IGFwaS5vcHRpb25zLnJlc291cmNlTmFtZVxuICAgICAgICAgID8gYGdldCR7aW5mbGVjdGlvbi5jYW1lbGl6ZShhcGkub3B0aW9ucy5yZXNvdXJjZU5hbWUpfWBcbiAgICAgICAgICA6IGFwaS5tZXRob2ROYW1lO1xuXG4gICAgICAgIC8vIGF4aW9zLW11bHRpcGFydCDsspjrpqwgKO2MjOydvCDsl4XroZzrk5wpXG4gICAgICAgIGlmIChjbGllbnRzLmluY2x1ZGVzKFwiYXhpb3MtbXVsdGlwYXJ0XCIpKSB7XG4gICAgICAgICAgY29uc3QgZm9ybURhdGFBcHBlbmQgPSBgZmlsZXMuZm9yRWFjaChmID0+IHsgZm9ybURhdGEuYXBwZW5kKFwiZmlsZXNcIiwgZik7IH0pO2A7XG5cbiAgICAgICAgICBjb25zdCBvdGhlclBhcmFtc0FwcGVuZCA9IHBhcmFtc1dpdGhvdXRDb250ZXh0XG4gICAgICAgICAgICAubWFwKChwYXJhbSkgPT4ge1xuICAgICAgICAgICAgICAvLyBwcmltaXRpdmUg7YOA7J6F7J247KeAIOyytO2BrFxuICAgICAgICAgICAgICBjb25zdCBpc1ByaW1pdGl2ZSA9XG4gICAgICAgICAgICAgICAgdHlwZW9mIHBhcmFtLnR5cGUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICAgICBbXCJzdHJpbmdcIiwgXCJudW1iZXJcIiwgXCJib29sZWFuXCJdLmluY2x1ZGVzKHBhcmFtLnR5cGUpO1xuXG4gICAgICAgICAgICAgIGlmIChpc1ByaW1pdGl2ZSkge1xuICAgICAgICAgICAgICAgIC8vIHByaW1pdGl2ZTog7KeB7KCRIGZvcm1EYXRhLmFwcGVuZFxuICAgICAgICAgICAgICAgIHJldHVybiBgZm9ybURhdGEuYXBwZW5kKCcke3BhcmFtLm5hbWV9JywgU3RyaW5nKCR7cGFyYW0ubmFtZX0pKTtgO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIG9iamVjdDogdG9Gb3JtRGF0YSDsgqzsmqlcbiAgICAgICAgICAgICAgICByZXR1cm4gYHRvRm9ybURhdGEoJHtwYXJhbS5uYW1lfSwgZm9ybURhdGEsICcke3BhcmFtLm5hbWV9Jyk7YDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5qb2luKFwiXFxuICAgIFwiKTtcblxuICAgICAgICAgIGNvbnN0IHBhcmFtc0RlZkNvbW1hID0gcGFyYW1zRGVmICE9PSBcIlwiID8gXCIsIFwiIDogXCJcIjtcbiAgICAgICAgICBmdW5jdGlvbnMucHVzaChcbiAgICAgICAgICAgIGBcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiAke21ldGhvZE5hbWV9JHt0eXBlUGFyYW1zRGVmfShcbiAgJHtwYXJhbXNEZWZ9JHtwYXJhbXNEZWZDb21tYX1cbiAgZmlsZXM6IEZpbGVbXSxcbiAgb25VcGxvYWRQcm9ncmVzcz86IChwZTogQXhpb3NQcm9ncmVzc0V2ZW50KSA9PiB2b2lkXG4pOiBQcm9taXNlPCR7cmV0dXJuVHlwZURlZn0+IHtcbiAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgJHtmb3JtRGF0YUFwcGVuZH1cbiAgJHtvdGhlclBhcmFtc0FwcGVuZH1cbiAgcmV0dXJuIGZldGNoKHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICB1cmw6IFxcYCR7YXBpQmFzZVVybH1cXGAsXG4gICAgaGVhZGVyczoge1xuICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJtdWx0aXBhcnQvZm9ybS1kYXRhXCIsXG4gICAgfSxcbiAgICBvblVwbG9hZFByb2dyZXNzLFxuICAgIGRhdGE6IGZvcm1EYXRhLFxuICAgICR7YXBpLm9wdGlvbnMudGltZW91dCA/IGBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoJHthcGkub3B0aW9ucy50aW1lb3V0fSksYCA6IFwiXCJ9XG4gIH0pO1xufVxuICAgICAgICAgIGAudHJpbSgpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoYXBpLm9wdGlvbnMuaHR0cE1ldGhvZCA9PT0gXCJHRVRcIikge1xuICAgICAgICAgIGNvbnN0IGhhc1BhcmFtcyA9IHBhcmFtc1dpdGhvdXRDb250ZXh0Lmxlbmd0aCA+IDA7XG4gICAgICAgICAgZnVuY3Rpb25zLnB1c2goXG4gICAgICAgICAgICBgXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gJHttZXRob2ROYW1lfSR7dHlwZVBhcmFtc0RlZn0oJHtwYXJhbXNEZWZ9KTogUHJvbWlzZTwke3JldHVyblR5cGVEZWZ9PiB7XG4gIHJldHVybiBmZXRjaCh7XG4gICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgIHVybDogXFxgJHthcGlCYXNlVXJsfSR7aGFzUGFyYW1zID8gYD9cXCR7cXMuc3RyaW5naWZ5KHsgJHtwYXJhbU5hbWVzfSB9KX1gIDogXCJcIn1cXGAsXG4gICAgJHthcGkub3B0aW9ucy50aW1lb3V0ID8gYHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCgke2FwaS5vcHRpb25zLnRpbWVvdXR9KSxgIDogXCJcIn1cbiAgfSk7XG59XG4gICAgICAgICAgYC50cmltKCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBoYXNQYXJhbXMgPSBwYXJhbXNXaXRob3V0Q29udGV4dC5sZW5ndGggPiAwO1xuICAgICAgICAgIGZ1bmN0aW9ucy5wdXNoKFxuICAgICAgICAgICAgYFxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uICR7bWV0aG9kTmFtZX0ke3R5cGVQYXJhbXNEZWZ9KCR7cGFyYW1zRGVmfSk6IFByb21pc2U8JHtyZXR1cm5UeXBlRGVmfT4ge1xuICByZXR1cm4gZmV0Y2goe1xuICAgIG1ldGhvZDogXCIke2FwaS5vcHRpb25zLmh0dHBNZXRob2R9XCIsXG4gICAgdXJsOiBcXGAke2FwaUJhc2VVcmx9XFxgLFxuICAgICR7aGFzUGFyYW1zID8gYGRhdGE6IHsgJHtwYXJhbU5hbWVzfSB9LGAgOiBcIlwifVxuICAgICR7YXBpLm9wdGlvbnMudGltZW91dCA/IGBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoJHthcGkub3B0aW9ucy50aW1lb3V0fSksYCA6IFwiXCJ9XG4gIH0pO1xufVxuICAgICAgICAgIGAudHJpbSgpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyLiBxdWVyeU9wdGlvbnMgKyB1c2VRdWVyeSAodGFuc3RhY2stcXVlcnkpXG4gICAgICAgIGlmIChjbGllbnRzLmluY2x1ZGVzKFwidGFuc3RhY2stcXVlcnlcIikpIHtcbiAgICAgICAgICBjb25zdCBob29rTmFtZSA9IGFwaS5vcHRpb25zLnJlc291cmNlTmFtZVxuICAgICAgICAgICAgPyBpbmZsZWN0aW9uLmNhbWVsaXplKGFwaS5vcHRpb25zLnJlc291cmNlTmFtZSwgdHJ1ZSlcbiAgICAgICAgICAgIDogaW5mbGVjdGlvbi5jYW1lbGl6ZShhcGkubWV0aG9kTmFtZSwgdHJ1ZSk7XG5cbiAgICAgICAgICAvLyBxdWVyeU9wdGlvbnNcbiAgICAgICAgICBmdW5jdGlvbnMucHVzaChcbiAgICAgICAgICAgIGBcbmV4cG9ydCBjb25zdCAke21ldGhvZE5hbWV9UXVlcnlPcHRpb25zID0gJHt0eXBlUGFyYW1zRGVmfSgke3BhcmFtc0RlZn0pID0+IHF1ZXJ5T3B0aW9ucyh7XG4gIHF1ZXJ5S2V5OiBbJyR7bW9kZWxOYW1lfScsICcke21ldGhvZE5hbWV9JyR7cGFyYW1OYW1lcyA/IGAsICR7cGFyYW1OYW1lc31gIDogXCJcIn1dLFxuICBxdWVyeUZuOiAoKSA9PiAke21ldGhvZE5hbWV9KCR7cGFyYW1OYW1lc30pXG59KTtcbiAgICAgICAgICBgLnRyaW0oKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gdXNlUXVlcnkgaG9va1xuICAgICAgICAgIGZ1bmN0aW9ucy5wdXNoKFxuICAgICAgICAgICAgYFxuZXhwb3J0IGNvbnN0IHVzZSR7aW5mbGVjdGlvbi5jYW1lbGl6ZShob29rTmFtZSl9ID0gJHt0eXBlUGFyYW1zRGVmfSgke3BhcmFtc0RlZn0ke1xuICAgICAgICAgICAgICBwYXJhbXNEZWYgPyBcIiwgXCIgOiBcIlwiXG4gICAgICAgICAgICB9b3B0aW9ucz86IHsgZW5hYmxlZD86IGJvb2xlYW4gfSkgPT5cbiAgdXNlUXVlcnkoe1xuICAgIC4uLiR7bWV0aG9kTmFtZX1RdWVyeU9wdGlvbnMoJHtwYXJhbU5hbWVzfSksXG4gICAgLi4ub3B0aW9uc1xuICB9KTtcbiAgICAgICAgICBgLnRyaW0oKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMy4gdXNlTXV0YXRpb24gKHRhbnN0YWNrLW11dGF0aW9uKVxuICAgICAgICBpZiAoY2xpZW50cy5pbmNsdWRlcyhcInRhbnN0YWNrLW11dGF0aW9uXCIpKSB7XG4gICAgICAgICAgY29uc3QgaG9va05hbWUgPSBpbmZsZWN0aW9uLmNhbWVsaXplKGFwaS5tZXRob2ROYW1lKTtcbiAgICAgICAgICBjb25zdCBtdXRhdGlvblBhcmFtVHlwZSA9XG4gICAgICAgICAgICBwYXJhbXNXaXRob3V0Q29udGV4dC5sZW5ndGggPiAwXG4gICAgICAgICAgICAgID8gYHsgJHtwYXJhbXNXaXRob3V0Q29udGV4dFxuICAgICAgICAgICAgICAgICAgLm1hcCgocCkgPT4gYCR7cC5uYW1lfTogJHthcGlQYXJhbVR5cGVUb1RzVHlwZShwLnR5cGUsIFtdKX1gKVxuICAgICAgICAgICAgICAgICAgLmpvaW4oXCIsIFwiKX0gfWBcbiAgICAgICAgICAgICAgOiBcInZvaWRcIjtcbiAgICAgICAgICBjb25zdCBtdXRhdGlvblBhcmFtTmFtZXMgPVxuICAgICAgICAgICAgcGFyYW1zV2l0aG91dENvbnRleHQubGVuZ3RoID4gMFxuICAgICAgICAgICAgICA/IHBhcmFtc1dpdGhvdXRDb250ZXh0Lm1hcCgocCkgPT4gYHBhcmFtcy4ke3AubmFtZX1gKS5qb2luKFwiLCBcIilcbiAgICAgICAgICAgICAgOiBcIlwiO1xuXG4gICAgICAgICAgZnVuY3Rpb25zLnB1c2goXG4gICAgICAgICAgICBgXG5leHBvcnQgY29uc3QgdXNlJHtob29rTmFtZX1NdXRhdGlvbiA9ICR7dHlwZVBhcmFtc0RlZn0oKSA9PiB1c2VNdXRhdGlvbih7XG4gIG11dGF0aW9uRm46IChwYXJhbXM6ICR7bXV0YXRpb25QYXJhbVR5cGV9KSA9PiAke21ldGhvZE5hbWV9KCR7bXV0YXRpb25QYXJhbU5hbWVzfSlcbn0pO1xuICAgICAgICAgIGAudHJpbSgpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyA0LiB1c2VNdXRhdGlvbiB3aXRoIG11bHRpcGFydCAodGFuc3RhY2stbXV0YXRpb24tbXVsdGlwYXJ0KVxuICAgICAgICBpZiAoY2xpZW50cy5pbmNsdWRlcyhcInRhbnN0YWNrLW11dGF0aW9uLW11bHRpcGFydFwiKSkge1xuICAgICAgICAgIGNvbnN0IGhvb2tOYW1lID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShhcGkubWV0aG9kTmFtZSk7XG5cbiAgICAgICAgICAvLyDtjIzrnbzrr7jthLAg7YOA7J6FIOygleydmDogcGFyYW1zRGVm7JeQ7IScIO2DgOyeheunjCDstpTstpxcbiAgICAgICAgICAvLyBwYXJhbXNEZWYg7JiIOiBcInBhcmFtczogeyBjYXRlZ29yeTogc3RyaW5nIH1cIiDihpIgXCJ7IGNhdGVnb3J5OiBzdHJpbmcgfVwiXG4gICAgICAgICAgY29uc3QgcGFyYW1zVHlwZURlZiA9XG4gICAgICAgICAgICBwYXJhbXNXaXRob3V0Q29udGV4dC5sZW5ndGggPiAwXG4gICAgICAgICAgICAgID8gcGFyYW1zRGVmXG4gICAgICAgICAgICAgICAgICAuc3BsaXQoXCI6XCIpXG4gICAgICAgICAgICAgICAgICAuc2xpY2UoMSlcbiAgICAgICAgICAgICAgICAgIC5qb2luKFwiOlwiKVxuICAgICAgICAgICAgICAgICAgLnRyaW0oKSAvLyBcInBhcmFtczogeyBjYXRlZ29yeTogc3RyaW5nIH1cIiDihpIgXCJ7IGNhdGVnb3J5OiBzdHJpbmcgfVwiXG4gICAgICAgICAgICAgIDogXCJcIjtcblxuICAgICAgICAgIGNvbnN0IG11dGF0aW9uUGFyYW1UeXBlID1cbiAgICAgICAgICAgIHBhcmFtc1dpdGhvdXRDb250ZXh0Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgPyBgeyBwYXJhbXM6ICR7cGFyYW1zVHlwZURlZn0sIGZpbGVzOiBGaWxlW10gfWBcbiAgICAgICAgICAgICAgOiBgeyBmaWxlczogRmlsZVtdIH1gO1xuXG4gICAgICAgICAgLy8gbXV0YXRpb25GbiDtmLjstpwg7YyM652866+47YSwXG4gICAgICAgICAgY29uc3QgbXV0YXRpb25GbkNhbGwgPVxuICAgICAgICAgICAgcGFyYW1zV2l0aG91dENvbnRleHQubGVuZ3RoID4gMFxuICAgICAgICAgICAgICA/IGAke21ldGhvZE5hbWV9KHBhcmFtcy5wYXJhbXMsIHBhcmFtcy5maWxlcylgXG4gICAgICAgICAgICAgIDogYCR7bWV0aG9kTmFtZX0ocGFyYW1zLmZpbGVzKWA7XG5cbiAgICAgICAgICBmdW5jdGlvbnMucHVzaChcbiAgICAgICAgICAgIGBcbmV4cG9ydCBjb25zdCB1c2Uke2hvb2tOYW1lfU11dGF0aW9uID0gJHt0eXBlUGFyYW1zRGVmfShcbiAgb3B0aW9ucz86IFVzZU11dGF0aW9uT3B0aW9uczwke3JldHVyblR5cGVEZWZ9LCBFcnJvciwgJHttdXRhdGlvblBhcmFtVHlwZX0+ICYge1xuICAgIG9uVXBsb2FkUHJvZ3Jlc3M/OiAoZTogQXhpb3NQcm9ncmVzc0V2ZW50KSA9PiB2b2lkO1xuICB9XG4pID0+IHVzZU11dGF0aW9uKHtcbiAgbXV0YXRpb25GbjogKHBhcmFtczogJHttdXRhdGlvblBhcmFtVHlwZX0pID0+ICR7bXV0YXRpb25GbkNhbGx9LFxuICByZXRyeTogZmFsc2UsXG4gIC4uLm9wdGlvbnMsXG59KTtcbiAgICAgICAgICBgLnRyaW0oKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG5hbWVzcGFjZXMucHVzaChcbiAgICAgICAgYFxuZXhwb3J0IG5hbWVzcGFjZSAke21vZGVsTmFtZX1TZXJ2aWNlIHtcbiR7ZnVuY3Rpb25zLmpvaW4oXCJcXG5cXG5cIil9XG59XG4gICAgICBgLnRyaW0oKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQXN5bmNJZENvbmZpZyDsg53shLEgKEVudGl0eeuzhOuhnClcbiAgICBjb25zdCBlbnRpdHlJZHMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgIGNvbnN0IGFzeW5jSWRDb25maWdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBlbnRpdHlJZCBvZiBlbnRpdHlJZHMpIHtcbiAgICAgIGNvbnN0IG5hbWVzID0gRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChlbnRpdHlJZCk7XG5cbiAgICAgIC8vIEFzeW5jSWRDb25maWfsmqkg66as7Iqk7Yq4IOyhsO2ajCBBUEkg7LC+6riwXG4gICAgICBjb25zdCBsaXN0QXBpID0gYXBpc0J5TW9kZWwuZ2V0KG5hbWVzLmNhcGl0YWwpPy5maW5kKChhcGkpID0+IHtcbiAgICAgICAgLy8gcmVzb3VyY2VOYW1l7J20IOyXhuqxsOuCmCB0YW5zdGFjay1xdWVyeeulvCDsgqzsmqntlZjsp4Ag7JWK64qUIEFQSeuKlCDsoJzsmbhcbiAgICAgICAgaWYgKCFhcGkub3B0aW9ucy5yZXNvdXJjZU5hbWUgfHwgIWFwaS5vcHRpb25zLmNsaWVudHM/LmluY2x1ZGVzKFwidGFuc3RhY2stcXVlcnlcIikpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVzb3VyY2VOYW1l7J20IOuzteyImO2YleydtOqzoCDrqZTshJzrk5zrqoXsnbQgZmluZE1hbnnsnbggQVBJXG4gICAgICAgIGNvbnN0IHJlc291cmNlTmFtZSA9IGFwaS5vcHRpb25zLnJlc291cmNlTmFtZTtcbiAgICAgICAgcmV0dXJuIGluZmxlY3Rpb24ucGx1cmFsaXplKHJlc291cmNlTmFtZSkgPT09IHJlc291cmNlTmFtZSAmJiBhcGkubWV0aG9kTmFtZSA9PT0gXCJmaW5kTWFueVwiO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChsaXN0QXBpKSB7XG4gICAgICAgIC8vIHJlc291cmNlTmFtZeyXkOyEnCBob29rIOydtOumhCDsg53shLEgKOq4sOyhtCDroZzsp4Hqs7wg64+Z7J28KVxuICAgICAgICBjb25zdCBob29rTmFtZSA9IGluZmxlY3Rpb24uY2FtZWxpemUoYXNzZXJ0RGVmaW5lZChsaXN0QXBpLm9wdGlvbnMucmVzb3VyY2VOYW1lKSwgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IHVzZUhvb2tOYW1lID0gYHVzZSR7aW5mbGVjdGlvbi5jYW1lbGl6ZShob29rTmFtZSl9YDtcblxuICAgICAgICAvLyBMaXN0UGFyYW1zIO2DgOyeheuqhSDqtazshLFcbiAgICAgICAgY29uc3QgbGlzdFBhcmFtc1R5cGUgPSBgJHtuYW1lcy5jYXBpdGFsfUxpc3RQYXJhbXNgO1xuXG4gICAgICAgIGFzeW5jSWRDb25maWdzLnB1c2goXG4gICAgICAgICAgYFxuLy8gQXN5bmNJZENvbmZpZzogJHtuYW1lcy5jYXBpdGFsfVxuZXhwb3J0IGNvbnN0ICR7bmFtZXMuY2FwaXRhbH1Bc3luY0lkQ29uZmlnOiBBc3luY0lkQ29uZmlnPCR7bmFtZXMuY2FwaXRhbH1TdWJzZXRLZXksICR7bmFtZXMuY2FwaXRhbH1TdWJzZXRNYXBwaW5nLCAke2xpc3RQYXJhbXNUeXBlfT4gPSB7XG4gIHBsYWNlaG9sZGVyS2V5OiBcImVudGl0eS4ke25hbWVzLmNhcGl0YWx9XCIsXG4gIHVzZUxpc3Q6ICR7bmFtZXMuY2FwaXRhbH1TZXJ2aWNlLiR7dXNlSG9va05hbWV9LFxufTtcbiAgICAgICAgICBgLnRyaW0oKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBCVUlMVF9JTl9UWVBFU+yXkOyEnCDsgqzsmqnrkJjripQg7YOA7J6F65Ok7J2EIO2ZleyduO2VmOyXrCDrj5nsoIHsnLzroZwgaW1wb3J0IOq1rOyEsVxuICAgIGNvbnN0IGJ1aWx0SW5UeXBlSW1wb3J0cyA9IE9iamVjdC5rZXlzKEJVSUxUX0lOX1RZUEVTKVxuICAgICAgLmZpbHRlcigodHlwZUtleSkgPT4gaW1wb3J0S2V5cy5pbmNsdWRlcyh0eXBlS2V5KSlcbiAgICAgIC5tYXAoKHR5cGVLZXkpID0+IGB0eXBlICR7dHlwZUtleX1gKTtcblxuICAgIC8vIHNvbmFtdS5zaGFyZWTsl5DshJwgaW1wb3J07ZWgIO2VreuqqeuTpOydhCDrj5nsoIHsnLzroZwg6rWs7ISxXG4gICAgY29uc3Qgc29uYW11U2hhcmVkSW1wb3J0cyA9IFtcbiAgICAgIFwidHlwZSBMaXN0UmVzdWx0XCIsXG4gICAgICBcInR5cGUgRmlsdGVyUXVlcnlcIixcbiAgICAgIC4uLmJ1aWx0SW5UeXBlSW1wb3J0cyxcbiAgICAgIFwiZmV0Y2hcIixcbiAgICAgIFwidHlwZSBFdmVudEhhbmRsZXJzXCIsXG4gICAgICBcInR5cGUgU1NFU3RyZWFtT3B0aW9uc1wiLFxuICAgICAgXCJ1c2VTU0VTdHJlYW1cIixcbiAgICAgIFwidG9Gb3JtRGF0YVwiLFxuICAgIF0uam9pbihcIiwgXCIpO1xuXG4gICAgLy8gYm9keSDqtazshLE6IG5hbWVzcGFjZXMgKyBhc3luY0lkQ29uZmlnc1xuICAgIGNvbnN0IGJvZHlQYXJ0cyA9IFsuLi5uYW1lc3BhY2VzLCAuLi5hc3luY0lkQ29uZmlnc107XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5nZXRUYXJnZXRBbmRQYXRoKCksXG4gICAgICBib2R5OiBib2R5UGFydHMuam9pbihcIlxcblxcblwiKSxcbiAgICAgIGltcG9ydEtleXM6IGRpZmYodW5pcXVlKGltcG9ydEtleXMpLCBbXG4gICAgICAgIC4uLnR5cGVQYXJhbU5hbWVzLFxuICAgICAgICBcIkxpc3RSZXN1bHRcIixcbiAgICAgICAgLi4uT2JqZWN0LmtleXMoQlVJTFRfSU5fVFlQRVMpLFxuICAgICAgXSksXG4gICAgICBjdXN0b21IZWFkZXJzOiBbXG4gICAgICAgIFwiLyoqXCIsXG4gICAgICAgIFwiICogQGdlbmVyYXRlZFwiLFxuICAgICAgICBcIiAqIOyngeygkSDsiJjsoJXtlZjsp4Ag66eI7IS47JqULlwiLFxuICAgICAgICBcIiAqL1wiLFxuICAgICAgICBcIi8qKiBiaW9tZS1pZ25vcmUtYWxsIGxpbnQ6IGdlbmVyYXRlZOuKlCDrrLTsi5wgKi9cIixcbiAgICAgICAgXCIvKiogYmlvbWUtaWdub3JlLWFsbCBhc3Npc3Q6IGdlbmVyYXRlZOuKlCDrrLTsi5wgKi9cIixcbiAgICAgICAgXCJcIixcbiAgICAgICAgYGltcG9ydCB7IHF1ZXJ5T3B0aW9ucywgdXNlUXVlcnksIHVzZU11dGF0aW9uLCB0eXBlIFVzZU11dGF0aW9uT3B0aW9ucyB9IGZyb20gJ0B0YW5zdGFjay9yZWFjdC1xdWVyeSc7YCxcbiAgICAgICAgYGltcG9ydCB0eXBlIHsgQXhpb3NQcm9ncmVzc0V2ZW50IH0gZnJvbSAnYXhpb3MnO2AsXG4gICAgICAgIGBpbXBvcnQgcXMgZnJvbSAncXMnO2AsXG4gICAgICAgIGBpbXBvcnQgeyAke3NvbmFtdVNoYXJlZEltcG9ydHN9IH0gZnJvbSAnLi9zb25hbXUuc2hhcmVkJztgLFxuICAgICAgICBgaW1wb3J0IHR5cGUgeyBBc3luY0lkQ29uZmlnIH0gZnJvbSAnQHNvbmFtdS1raXQvcmVhY3QtY29tcG9uZW50cy9jb21wb25lbnRzJztgLFxuICAgICAgXSxcbiAgICB9O1xuICB9XG59XG4iXSwibmFtZXMiOlsiaW5mbGVjdGlvbiIsImRpZmYiLCJ1bmlxdWUiLCJhcGlQYXJhbVRvVHNDb2RlIiwiYXBpUGFyYW1UeXBlVG9Uc1R5cGUiLCJ1bndyYXBQcm9taXNlT25jZSIsIlNvbmFtdSIsIkVudGl0eU1hbmFnZXIiLCJBcGlQYXJhbVR5cGUiLCJhc3NlcnREZWZpbmVkIiwiVGVtcGxhdGUiLCJCVUlMVF9JTl9UWVBFUyIsInpvZFR5cGVUb1RzVHlwZURlZiIsIlRlbXBsYXRlX19zZXJ2aWNlcyIsImdldFRhcmdldEFuZFBhdGgiLCJ0YXJnZXQiLCJwYXRoIiwicmVuZGVyIiwiYXBpcyIsInN5bmNlciIsImFwaXNCeU1vZGVsIiwiTWFwIiwiYXBpIiwibW9kZWxOYW1lIiwicmVwbGFjZSIsImhhcyIsInNldCIsImdldCIsInB1c2giLCJpbXBvcnRLZXlzIiwibmFtZXNwYWNlcyIsInR5cGVQYXJhbU5hbWVzIiwibW9kZWxBcGlzIiwiZnVuY3Rpb25zIiwic3RyZWFtT3B0aW9ucyIsInBhcmFtc1dpdGhvdXRDb250ZXh0IiwicGFyYW1ldGVycyIsImZpbHRlciIsInBhcmFtIiwiaXNDb250ZXh0IiwidHlwZSIsImlzUmVmS25leCIsIm9wdGlvbmFsIiwibmFtZSIsInN0YXJ0c1dpdGgiLCJhcGlCYXNlVXJsIiwiY29uZmlnIiwicm91dGUiLCJwcmVmaXgiLCJtZXRob2ROYW1lU3RyZWFtIiwib3B0aW9ucyIsInJlc291cmNlTmFtZSIsImNhbWVsaXplIiwibWV0aG9kTmFtZSIsIm1ldGhvZE5hbWVTdHJlYW1DYW1lbGl6ZWQiLCJldmVudHNUeXBlRGVmIiwiZXZlbnRzIiwicGFyYW1zRGVmQXNPYmplY3QiLCJsZW5ndGgiLCJtYXAiLCJwIiwiam9pbiIsInRyaW0iLCJ0eXBlUGFyYW1ldGVyc0FzVHNUeXBlIiwidHlwZVBhcmFtZXRlcnMiLCJ0eXBlUGFyYW0iLCJ0eXBlUGFyYW1zRGVmIiwiY29uY2F0IiwidHAiLCJpZCIsInBhcmFtc0RlZiIsInBhcmFtTmFtZXMiLCJyZXR1cm5UeXBlRGVmIiwicmV0dXJuVHlwZSIsImNsaWVudHMiLCJpbmNsdWRlcyIsImZvcm1EYXRhQXBwZW5kIiwib3RoZXJQYXJhbXNBcHBlbmQiLCJpc1ByaW1pdGl2ZSIsInBhcmFtc0RlZkNvbW1hIiwidGltZW91dCIsImh0dHBNZXRob2QiLCJoYXNQYXJhbXMiLCJob29rTmFtZSIsIm11dGF0aW9uUGFyYW1UeXBlIiwibXV0YXRpb25QYXJhbU5hbWVzIiwicGFyYW1zVHlwZURlZiIsInNwbGl0Iiwic2xpY2UiLCJtdXRhdGlvbkZuQ2FsbCIsImVudGl0eUlkcyIsImdldEFsbElkcyIsImFzeW5jSWRDb25maWdzIiwiZW50aXR5SWQiLCJuYW1lcyIsImdldE5hbWVzRnJvbUlkIiwibGlzdEFwaSIsImNhcGl0YWwiLCJmaW5kIiwicGx1cmFsaXplIiwidXNlSG9va05hbWUiLCJsaXN0UGFyYW1zVHlwZSIsImJ1aWx0SW5UeXBlSW1wb3J0cyIsIk9iamVjdCIsImtleXMiLCJ0eXBlS2V5Iiwic29uYW11U2hhcmVkSW1wb3J0cyIsImJvZHlQYXJ0cyIsImJvZHkiLCJjdXN0b21IZWFkZXJzIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxnQkFBZ0IsYUFBYTtBQUNwQyxTQUFTQyxJQUFJLEVBQUVDLE1BQU0sUUFBUSxVQUFVO0FBQ3ZDLFNBQ0VDLGdCQUFnQixFQUNoQkMsb0JBQW9CLEVBQ3BCQyxpQkFBaUIsUUFDWiwrQkFBNEI7QUFFbkMsU0FBU0MsTUFBTSxRQUFRLHNCQUFtQjtBQUMxQyxTQUFTQyxhQUFhLFFBQVEsaUNBQThCO0FBRTVELFNBQVNDLFlBQVksUUFBUSx1QkFBb0I7QUFDakQsU0FBU0MsYUFBYSxRQUFRLHVCQUFvQjtBQUNsRCxTQUFTQyxRQUFRLFFBQVEsaUJBQWM7QUFDdkMsU0FBU0MsY0FBYyxFQUFFQyxrQkFBa0IsUUFBUSxzQkFBbUI7QUFFdEUsT0FBTyxNQUFNQywyQkFBMkJIO0lBQ3RDLGFBQWM7UUFDWixLQUFLLENBQUM7SUFDUjtJQUVBSSxtQkFBbUI7UUFDakIsT0FBTztZQUNMQyxRQUFRO1lBQ1JDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQztRQUMvQjtJQUNGO0lBRUFDLE9BQU8sRUFBK0IsRUFBRTtRQUN0QyxNQUFNLEVBQUVDLElBQUksRUFBRSxHQUFHWixPQUFPYSxNQUFNO1FBRTlCLFdBQVc7UUFDWCxNQUFNQyxjQUFjLElBQUlDO1FBQ3hCLEtBQUssTUFBTUMsT0FBT0osS0FBTTtZQUN0QixNQUFNSyxZQUFZRCxJQUFJQyxTQUFTLENBQUNDLE9B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
268
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW1wbGF0ZS9pbXBsZW1lbnRhdGlvbnMvc2VydmljZXMudGVtcGxhdGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB7IGRpZmYsIHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQge1xuICBhcGlQYXJhbVRvVHNDb2RlLFxuICBhcGlQYXJhbVR5cGVUb1RzVHlwZSxcbiAgdW53cmFwUHJvbWlzZU9uY2UsXG59IGZyb20gXCIuLi8uLi9hcGkvY29kZS1jb252ZXJ0ZXJzXCI7XG5pbXBvcnQgdHlwZSB7IEV4dGVuZGVkQXBpIH0gZnJvbSBcIi4uLy4uL2FwaS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi8uLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB0eXBlIHsgVGVtcGxhdGVPcHRpb25zIH0gZnJvbSBcIi4uLy4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBBcGlQYXJhbVR5cGUgfSBmcm9tIFwiLi4vLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGFzc2VydERlZmluZWQgfSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IFRlbXBsYXRlIH0gZnJvbSBcIi4uL3RlbXBsYXRlXCI7XG5pbXBvcnQgeyBCVUlMVF9JTl9UWVBFUywgem9kVHlwZVRvVHNUeXBlRGVmIH0gZnJvbSBcIi4uL3pvZC1jb252ZXJ0ZXJcIjtcblxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlX19zZXJ2aWNlcyBleHRlbmRzIFRlbXBsYXRlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJzZXJ2aWNlc1wiKTtcbiAgfVxuXG4gIGdldFRhcmdldEFuZFBhdGgoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRhcmdldDogXCI6dGFyZ2V0L3NyYy9zZXJ2aWNlc1wiLFxuICAgICAgcGF0aDogYHNlcnZpY2VzLmdlbmVyYXRlZC50c2AsXG4gICAgfTtcbiAgfVxuXG4gIHJlbmRlcih7fTogVGVtcGxhdGVPcHRpb25zW1wic2VydmljZXNcIl0pIHtcbiAgICBjb25zdCB7IGFwaXMgfSA9IFNvbmFtdS5zeW5jZXI7XG5cbiAgICAvLyDrqqjrjbjrs4TroZwg6re466O57ZmUXG4gICAgY29uc3QgYXBpc0J5TW9kZWwgPSBuZXcgTWFwPHN0cmluZywgRXh0ZW5kZWRBcGlbXT4oKTtcbiAgICBmb3IgKGNvbnN0IGFwaSBvZiBhcGlzKSB7XG4gICAgICBjb25zdCBtb2RlbE5hbWUgPSBhcGkubW9kZWxOYW1lLnJlcGxhY2UoL01vZGVsJC8sIFwiXCIpLnJlcGxhY2UoL0ZyYW1lJC8sIFwiXCIpO1xuICAgICAgaWYgKCFhcGlzQnlNb2RlbC5oYXMobW9kZWxOYW1lKSkge1xuICAgICAgICBhcGlzQnlNb2RlbC5zZXQobW9kZWxOYW1lLCBbXSk7XG4gICAgICB9XG4gICAgICBhcGlzQnlNb2RlbC5nZXQobW9kZWxOYW1lKT8ucHVzaChhcGkpO1xuICAgIH1cblxuICAgIGNvbnN0IGltcG9ydEtleXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgbmFtZXNwYWNlczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgdHlwZVBhcmFtTmFtZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFttb2RlbE5hbWUsIG1vZGVsQXBpc10gb2YgYXBpc0J5TW9kZWwpIHtcbiAgICAgIGNvbnN0IGZ1bmN0aW9uczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBhcGkgb2YgbW9kZWxBcGlzKSB7XG4gICAgICAgIC8vIEBzdHJlYW0g642w7L2U66CI7J207YSw6rCAIOyeiOycvOuptCBTU0Ug7Iqk7Yq466a8IO2VqOyImCDsg53shLFcbiAgICAgICAgaWYgKGFwaS5zdHJlYW1PcHRpb25zKSB7XG4gICAgICAgICAgY29uc3QgcGFyYW1zV2l0aG91dENvbnRleHQgPSBhcGkucGFyYW1ldGVycy5maWx0ZXIoXG4gICAgICAgICAgICAocGFyYW0pID0+XG4gICAgICAgICAgICAgICFBcGlQYXJhbVR5cGUuaXNDb250ZXh0KHBhcmFtLnR5cGUpICYmXG4gICAgICAgICAgICAgICFBcGlQYXJhbVR5cGUuaXNSZWZLbmV4KHBhcmFtLnR5cGUpICYmXG4gICAgICAgICAgICAgICEocGFyYW0ub3B0aW9uYWwgPT09IHRydWUgJiYgcGFyYW0ubmFtZS5zdGFydHNXaXRoKFwiX1wiKSksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IGFwaUJhc2VVcmwgPSBgJHtTb25hbXUuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9JHthcGkucGF0aH1gO1xuXG4gICAgICAgICAgY29uc3QgbWV0aG9kTmFtZVN0cmVhbSA9IGFwaS5vcHRpb25zLnJlc291cmNlTmFtZVxuICAgICAgICAgICAgPyBgdXNlJHtpbmZsZWN0aW9uLmNhbWVsaXplKGFwaS5vcHRpb25zLnJlc291cmNlTmFtZSl9YFxuICAgICAgICAgICAgOiBgdXNlJHtpbmZsZWN0aW9uLmNhbWVsaXplKGFwaS5tZXRob2ROYW1lKX1gO1xuICAgICAgICAgIGNvbnN0IG1ldGhvZE5hbWVTdHJlYW1DYW1lbGl6ZWQgPSBpbmZsZWN0aW9uLmNhbWVsaXplKG1ldGhvZE5hbWVTdHJlYW0sIHRydWUpO1xuXG4gICAgICAgICAgY29uc3QgZXZlbnRzVHlwZURlZiA9IHpvZFR5cGVUb1RzVHlwZURlZihhcGkuc3RyZWFtT3B0aW9ucy5ldmVudHMpO1xuXG4gICAgICAgICAgLy8g7YyM652866+47YSw66W8IOqwneyytCDtmJXtg5zroZwg7KCV7J2YICjtg4DsnoXqs7wg7Iuk7KCcIOqwkiDrqqjrkZDsl5Ag7IKs7JqpKVxuICAgICAgICAgIGNvbnN0IHBhcmFtc0RlZkFzT2JqZWN0ID1cbiAgICAgICAgICAgIHBhcmFtc1dpdGhvdXRDb250ZXh0Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgPyBgeyAke3BhcmFtc1dpdGhvdXRDb250ZXh0Lm1hcCgocCkgPT4gYCR7cC5uYW1lfTogJHthcGlQYXJhbVR5cGVUb1RzVHlwZShwLnR5cGUsIGltcG9ydEtleXMpfWApLmpvaW4oXCIsIFwiKX0gfWBcbiAgICAgICAgICAgICAgOiBcInt9XCI7XG5cbiAgICAgICAgICBmdW5jdGlvbnMucHVzaChcbiAgICAgICAgICAgIGBcbmV4cG9ydCBmdW5jdGlvbiAke21ldGhvZE5hbWVTdHJlYW1DYW1lbGl6ZWR9KFxuICBwYXJhbXM6ICR7cGFyYW1zRGVmQXNPYmplY3R9LFxuICBoYW5kbGVyczogRXZlbnRIYW5kbGVyczwke2V2ZW50c1R5cGVEZWZ9ICYgeyBlbmQ/OiAoKSA9PiB2b2lkIH0+LFxuICBvcHRpb25zOiBTU0VTdHJlYW1PcHRpb25zXG4pIHtcbiAgcmV0dXJuIHVzZVNTRVN0cmVhbTwke2V2ZW50c1R5cGVEZWZ9PihcXGAke2FwaUJhc2VVcmx9XFxgLCBwYXJhbXMsIGhhbmRsZXJzLCBvcHRpb25zKTtcbn1cbiAgICAgICAgICAgIGAudHJpbSgpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb250ZXh0IOygnOyZuO2VnCDtjIzrnbzrr7jthLBcbiAgICAgICAgY29uc3QgcGFyYW1zV2l0aG91dENvbnRleHQgPSBhcGkucGFyYW1ldGVycy5maWx0ZXIoXG4gICAgICAgICAgKHBhcmFtKSA9PlxuICAgICAgICAgICAgIUFwaVBhcmFtVHlwZS5pc0NvbnRleHQocGFyYW0udHlwZSkgJiZcbiAgICAgICAgICAgICFBcGlQYXJhbVR5cGUuaXNSZWZLbmV4KHBhcmFtLnR5cGUpICYmXG4gICAgICAgICAgICAhKHBhcmFtLm9wdGlvbmFsID09PSB0cnVlICYmIHBhcmFtLm5hbWUuc3RhcnRzV2l0aChcIl9cIikpLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIO2DgOyehSDtjIzrnbzrr7jthLAg7KCV7J2YXG4gICAgICAgIGNvbnN0IHR5cGVQYXJhbWV0ZXJzQXNUc1R5cGUgPSBhcGkudHlwZVBhcmFtZXRlcnNcbiAgICAgICAgICAubWFwKCh0eXBlUGFyYW0pID0+IGFwaVBhcmFtVHlwZVRvVHNUeXBlKHR5cGVQYXJhbSwgaW1wb3J0S2V5cykpXG4gICAgICAgICAgLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgY29uc3QgdHlwZVBhcmFtc0RlZiA9IHR5cGVQYXJhbWV0ZXJzQXNUc1R5cGUgPyBgPCR7dHlwZVBhcmFtZXRlcnNBc1RzVHlwZX0+YCA6IFwiXCI7XG4gICAgICAgIHR5cGVQYXJhbU5hbWVzID0gdHlwZVBhcmFtTmFtZXMuY29uY2F0KGFwaS50eXBlUGFyYW1ldGVycy5tYXAoKHRwKSA9PiB0cC5pZCkpO1xuXG4gICAgICAgIC8vIO2MjOudvOuvuO2EsCDsoJXsnZhcbiAgICAgICAgY29uc3QgcGFyYW1zRGVmID0gYXBpUGFyYW1Ub1RzQ29kZShwYXJhbXNXaXRob3V0Q29udGV4dCwgaW1wb3J0S2V5cyk7XG4gICAgICAgIGNvbnN0IHBhcmFtTmFtZXMgPSBwYXJhbXNXaXRob3V0Q29udGV4dC5tYXAoKHApID0+IHAubmFtZSkuam9pbihcIiwgXCIpO1xuXG4gICAgICAgIC8vIOumrO2EtCDtg4DsnoUg7KCV7J2YXG4gICAgICAgIGNvbnN0IHJldHVyblR5cGVEZWYgPSBhcGlQYXJhbVR5cGVUb1RzVHlwZShcbiAgICAgICAgICBhc3NlcnREZWZpbmVkKHVud3JhcFByb21pc2VPbmNlKGFwaS5yZXR1cm5UeXBlKSksXG4gICAgICAgICAgaW1wb3J0S2V5cyxcbiAgICAgICAgKTtcblxuICAgICAgICAvLyDquLDrs7ggVVJMXG4gICAgICAgIGNvbnN0IGFwaUJhc2VVcmwgPSBgJHtTb25hbXUuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9JHthcGkucGF0aH1gO1xuXG4gICAgICAgIGNvbnN0IGNsaWVudHMgPSBhcGkub3B0aW9ucy5jbGllbnRzIHx8IFtdO1xuXG4gICAgICAgIC8vIDEuIGF4aW9zIO2VqOyImCDsg53shLFcbiAgICAgICAgLy8gcmVzb3VyY2VOYW1l7J20IOyeiOycvOuptCBnZXQgKyByZXNvdXJjZU5hbWUg7ZiV7YOc66GcIO2VqOyImOuqhSDsg53shLFcbiAgICAgICAgY29uc3QgbWV0aG9kTmFtZSA9IGFwaS5vcHRpb25zLnJlc291cmNlTmFtZVxuICAgICAgICAgID8gYGdldCR7aW5mbGVjdGlvbi5jYW1lbGl6ZShhcGkub3B0aW9ucy5yZXNvdXJjZU5hbWUpfWBcbiAgICAgICAgICA6IGFwaS5tZXRob2ROYW1lO1xuXG4gICAgICAgIC8vIGF4aW9zLW11bHRpcGFydCDsspjrpqwgKO2MjOydvCDsl4XroZzrk5wpXG4gICAgICAgIGlmIChjbGllbnRzLmluY2x1ZGVzKFwiYXhpb3MtbXVsdGlwYXJ0XCIpKSB7XG4gICAgICAgICAgY29uc3QgZm9ybURhdGFBcHBlbmQgPSBgZmlsZXMuZm9yRWFjaChmID0+IHsgZm9ybURhdGEuYXBwZW5kKFwiZmlsZXNcIiwgZik7IH0pO2A7XG5cbiAgICAgICAgICBjb25zdCBvdGhlclBhcmFtc0FwcGVuZCA9IHBhcmFtc1dpdGhvdXRDb250ZXh0XG4gICAgICAgICAgICAubWFwKChwYXJhbSkgPT4ge1xuICAgICAgICAgICAgICAvLyBwcmltaXRpdmUg7YOA7J6F7J247KeAIOyytO2BrFxuICAgICAgICAgICAgICBjb25zdCBpc1ByaW1pdGl2ZSA9XG4gICAgICAgICAgICAgICAgdHlwZW9mIHBhcmFtLnR5cGUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICAgICBbXCJzdHJpbmdcIiwgXCJudW1iZXJcIiwgXCJib29sZWFuXCJdLmluY2x1ZGVzKHBhcmFtLnR5cGUpO1xuXG4gICAgICAgICAgICAgIGlmIChpc1ByaW1pdGl2ZSkge1xuICAgICAgICAgICAgICAgIC8vIHByaW1pdGl2ZTog7KeB7KCRIGZvcm1EYXRhLmFwcGVuZFxuICAgICAgICAgICAgICAgIHJldHVybiBgZm9ybURhdGEuYXBwZW5kKCcke3BhcmFtLm5hbWV9JywgU3RyaW5nKCR7cGFyYW0ubmFtZX0pKTtgO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIG9iamVjdDogdG9Gb3JtRGF0YSDsgqzsmqlcbiAgICAgICAgICAgICAgICByZXR1cm4gYHRvRm9ybURhdGEoJHtwYXJhbS5uYW1lfSwgZm9ybURhdGEsICcke3BhcmFtLm5hbWV9Jyk7YDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5qb2luKFwiXFxuICAgIFwiKTtcblxuICAgICAgICAgIGNvbnN0IHBhcmFtc0RlZkNvbW1hID0gcGFyYW1zRGVmICE9PSBcIlwiID8gXCIsIFwiIDogXCJcIjtcbiAgICAgICAgICBmdW5jdGlvbnMucHVzaChcbiAgICAgICAgICAgIGBcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiAke21ldGhvZE5hbWV9JHt0eXBlUGFyYW1zRGVmfShcbiAgJHtwYXJhbXNEZWZ9JHtwYXJhbXNEZWZDb21tYX1cbiAgZmlsZXM6IEZpbGVbXSxcbiAgb25VcGxvYWRQcm9ncmVzcz86IChwZTogQXhpb3NQcm9ncmVzc0V2ZW50KSA9PiB2b2lkXG4pOiBQcm9taXNlPCR7cmV0dXJuVHlwZURlZn0+IHtcbiAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgJHtmb3JtRGF0YUFwcGVuZH1cbiAgJHtvdGhlclBhcmFtc0FwcGVuZH1cbiAgcmV0dXJuIGZldGNoKHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICB1cmw6IFxcYCR7YXBpQmFzZVVybH1cXGAsXG4gICAgb25VcGxvYWRQcm9ncmVzcyxcbiAgICBkYXRhOiBmb3JtRGF0YSxcbiAgICAke2FwaS5vcHRpb25zLnRpbWVvdXQgPyBgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KCR7YXBpLm9wdGlvbnMudGltZW91dH0pLGAgOiBcIlwifVxuICB9KTtcbn1cbiAgICAgICAgICBgLnRyaW0oKSxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKGFwaS5vcHRpb25zLmh0dHBNZXRob2QgPT09IFwiR0VUXCIpIHtcbiAgICAgICAgICBjb25zdCBoYXNQYXJhbXMgPSBwYXJhbXNXaXRob3V0Q29udGV4dC5sZW5ndGggPiAwO1xuICAgICAgICAgIGZ1bmN0aW9ucy5wdXNoKFxuICAgICAgICAgICAgYFxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uICR7bWV0aG9kTmFtZX0ke3R5cGVQYXJhbXNEZWZ9KCR7cGFyYW1zRGVmfSk6IFByb21pc2U8JHtyZXR1cm5UeXBlRGVmfT4ge1xuICByZXR1cm4gZmV0Y2goe1xuICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICB1cmw6IFxcYCR7YXBpQmFzZVVybH0ke2hhc1BhcmFtcyA/IGA/XFwke3FzLnN0cmluZ2lmeSh7ICR7cGFyYW1OYW1lc30gfSl9YCA6IFwiXCJ9XFxgLFxuICAgICR7YXBpLm9wdGlvbnMudGltZW91dCA/IGBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoJHthcGkub3B0aW9ucy50aW1lb3V0fSksYCA6IFwiXCJ9XG4gIH0pO1xufVxuICAgICAgICAgIGAudHJpbSgpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgaGFzUGFyYW1zID0gcGFyYW1zV2l0aG91dENvbnRleHQubGVuZ3RoID4gMDtcbiAgICAgICAgICBmdW5jdGlvbnMucHVzaChcbiAgICAgICAgICAgIGBcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiAke21ldGhvZE5hbWV9JHt0eXBlUGFyYW1zRGVmfSgke3BhcmFtc0RlZn0pOiBQcm9taXNlPCR7cmV0dXJuVHlwZURlZn0+IHtcbiAgcmV0dXJuIGZldGNoKHtcbiAgICBtZXRob2Q6IFwiJHthcGkub3B0aW9ucy5odHRwTWV0aG9kfVwiLFxuICAgIHVybDogXFxgJHthcGlCYXNlVXJsfVxcYCxcbiAgICAke2hhc1BhcmFtcyA/IGBkYXRhOiB7ICR7cGFyYW1OYW1lc30gfSxgIDogXCJcIn1cbiAgICAke2FwaS5vcHRpb25zLnRpbWVvdXQgPyBgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KCR7YXBpLm9wdGlvbnMudGltZW91dH0pLGAgOiBcIlwifVxuICB9KTtcbn1cbiAgICAgICAgICBgLnRyaW0oKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMi4gcXVlcnlPcHRpb25zICsgdXNlUXVlcnkgKHRhbnN0YWNrLXF1ZXJ5KVxuICAgICAgICBpZiAoY2xpZW50cy5pbmNsdWRlcyhcInRhbnN0YWNrLXF1ZXJ5XCIpKSB7XG4gICAgICAgICAgY29uc3QgaG9va05hbWUgPSBhcGkub3B0aW9ucy5yZXNvdXJjZU5hbWVcbiAgICAgICAgICAgID8gaW5mbGVjdGlvbi5jYW1lbGl6ZShhcGkub3B0aW9ucy5yZXNvdXJjZU5hbWUsIHRydWUpXG4gICAgICAgICAgICA6IGluZmxlY3Rpb24uY2FtZWxpemUoYXBpLm1ldGhvZE5hbWUsIHRydWUpO1xuXG4gICAgICAgICAgLy8gcXVlcnlPcHRpb25zXG4gICAgICAgICAgZnVuY3Rpb25zLnB1c2goXG4gICAgICAgICAgICBgXG5leHBvcnQgY29uc3QgJHttZXRob2ROYW1lfVF1ZXJ5T3B0aW9ucyA9ICR7dHlwZVBhcmFtc0RlZn0oJHtwYXJhbXNEZWZ9KSA9PiBxdWVyeU9wdGlvbnMoe1xuICBxdWVyeUtleTogWycke21vZGVsTmFtZX0nLCAnJHttZXRob2ROYW1lfScke3BhcmFtTmFtZXMgPyBgLCAke3BhcmFtTmFtZXN9YCA6IFwiXCJ9XSxcbiAgcXVlcnlGbjogKCkgPT4gJHttZXRob2ROYW1lfSgke3BhcmFtTmFtZXN9KVxufSk7XG4gICAgICAgICAgYC50cmltKCksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIHVzZVF1ZXJ5IGhvb2tcbiAgICAgICAgICBmdW5jdGlvbnMucHVzaChcbiAgICAgICAgICAgIGBcbmV4cG9ydCBjb25zdCB1c2Uke2luZmxlY3Rpb24uY2FtZWxpemUoaG9va05hbWUpfSA9ICR7dHlwZVBhcmFtc0RlZn0oJHtwYXJhbXNEZWZ9JHtcbiAgICAgICAgICAgICAgcGFyYW1zRGVmID8gXCIsIFwiIDogXCJcIlxuICAgICAgICAgICAgfW9wdGlvbnM/OiB7IGVuYWJsZWQ/OiBib29sZWFuIH0pID0+XG4gIHVzZVF1ZXJ5KHtcbiAgICAuLi4ke21ldGhvZE5hbWV9UXVlcnlPcHRpb25zKCR7cGFyYW1OYW1lc30pLFxuICAgIC4uLm9wdGlvbnNcbiAgfSk7XG4gICAgICAgICAgYC50cmltKCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDMuIHVzZU11dGF0aW9uICh0YW5zdGFjay1tdXRhdGlvbilcbiAgICAgICAgaWYgKGNsaWVudHMuaW5jbHVkZXMoXCJ0YW5zdGFjay1tdXRhdGlvblwiKSkge1xuICAgICAgICAgIGNvbnN0IGhvb2tOYW1lID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShhcGkubWV0aG9kTmFtZSk7XG4gICAgICAgICAgY29uc3QgbXV0YXRpb25QYXJhbVR5cGUgPVxuICAgICAgICAgICAgcGFyYW1zV2l0aG91dENvbnRleHQubGVuZ3RoID4gMFxuICAgICAgICAgICAgICA/IGB7ICR7cGFyYW1zV2l0aG91dENvbnRleHRcbiAgICAgICAgICAgICAgICAgIC5tYXAoKHApID0+IGAke3AubmFtZX06ICR7YXBpUGFyYW1UeXBlVG9Uc1R5cGUocC50eXBlLCBbXSl9YClcbiAgICAgICAgICAgICAgICAgIC5qb2luKFwiLCBcIil9IH1gXG4gICAgICAgICAgICAgIDogXCJ2b2lkXCI7XG4gICAgICAgICAgY29uc3QgbXV0YXRpb25QYXJhbU5hbWVzID1cbiAgICAgICAgICAgIHBhcmFtc1dpdGhvdXRDb250ZXh0Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgPyBwYXJhbXNXaXRob3V0Q29udGV4dC5tYXAoKHApID0+IGBwYXJhbXMuJHtwLm5hbWV9YCkuam9pbihcIiwgXCIpXG4gICAgICAgICAgICAgIDogXCJcIjtcblxuICAgICAgICAgIGZ1bmN0aW9ucy5wdXNoKFxuICAgICAgICAgICAgYFxuZXhwb3J0IGNvbnN0IHVzZSR7aG9va05hbWV9TXV0YXRpb24gPSAke3R5cGVQYXJhbXNEZWZ9KCkgPT4gdXNlTXV0YXRpb24oe1xuICBtdXRhdGlvbkZuOiAocGFyYW1zOiAke211dGF0aW9uUGFyYW1UeXBlfSkgPT4gJHttZXRob2ROYW1lfSgke211dGF0aW9uUGFyYW1OYW1lc30pXG59KTtcbiAgICAgICAgICBgLnRyaW0oKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gNC4gdXNlTXV0YXRpb24gd2l0aCBtdWx0aXBhcnQgKHRhbnN0YWNrLW11dGF0aW9uLW11bHRpcGFydClcbiAgICAgICAgaWYgKGNsaWVudHMuaW5jbHVkZXMoXCJ0YW5zdGFjay1tdXRhdGlvbi1tdWx0aXBhcnRcIikpIHtcbiAgICAgICAgICBjb25zdCBob29rTmFtZSA9IGluZmxlY3Rpb24uY2FtZWxpemUoYXBpLm1ldGhvZE5hbWUpO1xuXG4gICAgICAgICAgLy8g7YyM652866+47YSwIO2DgOyehSDsoJXsnZg6IHBhcmFtc0RlZuyXkOyEnCDtg4DsnoXrp4wg7LaU7LacXG4gICAgICAgICAgLy8gcGFyYW1zRGVmIOyYiDogXCJwYXJhbXM6IHsgY2F0ZWdvcnk6IHN0cmluZyB9XCIg4oaSIFwieyBjYXRlZ29yeTogc3RyaW5nIH1cIlxuICAgICAgICAgIGNvbnN0IHBhcmFtc1R5cGVEZWYgPVxuICAgICAgICAgICAgcGFyYW1zV2l0aG91dENvbnRleHQubGVuZ3RoID4gMFxuICAgICAgICAgICAgICA/IHBhcmFtc0RlZlxuICAgICAgICAgICAgICAgICAgLnNwbGl0KFwiOlwiKVxuICAgICAgICAgICAgICAgICAgLnNsaWNlKDEpXG4gICAgICAgICAgICAgICAgICAuam9pbihcIjpcIilcbiAgICAgICAgICAgICAgICAgIC50cmltKCkgLy8gXCJwYXJhbXM6IHsgY2F0ZWdvcnk6IHN0cmluZyB9XCIg4oaSIFwieyBjYXRlZ29yeTogc3RyaW5nIH1cIlxuICAgICAgICAgICAgICA6IFwiXCI7XG5cbiAgICAgICAgICBjb25zdCBtdXRhdGlvblBhcmFtVHlwZSA9XG4gICAgICAgICAgICBwYXJhbXNXaXRob3V0Q29udGV4dC5sZW5ndGggPiAwXG4gICAgICAgICAgICAgID8gYHsgcGFyYW1zOiAke3BhcmFtc1R5cGVEZWZ9LCBmaWxlczogRmlsZVtdIH1gXG4gICAgICAgICAgICAgIDogYHsgZmlsZXM6IEZpbGVbXSB9YDtcblxuICAgICAgICAgIC8vIG11dGF0aW9uRm4g7Zi47LacIO2MjOudvOuvuO2EsFxuICAgICAgICAgIGNvbnN0IG11dGF0aW9uRm5DYWxsID1cbiAgICAgICAgICAgIHBhcmFtc1dpdGhvdXRDb250ZXh0Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgPyBgJHttZXRob2ROYW1lfShwYXJhbXMucGFyYW1zLCBwYXJhbXMuZmlsZXMpYFxuICAgICAgICAgICAgICA6IGAke21ldGhvZE5hbWV9KHBhcmFtcy5maWxlcylgO1xuXG4gICAgICAgICAgZnVuY3Rpb25zLnB1c2goXG4gICAgICAgICAgICBgXG5leHBvcnQgY29uc3QgdXNlJHtob29rTmFtZX1NdXRhdGlvbiA9ICR7dHlwZVBhcmFtc0RlZn0oXG4gIG9wdGlvbnM/OiBVc2VNdXRhdGlvbk9wdGlvbnM8JHtyZXR1cm5UeXBlRGVmfSwgRXJyb3IsICR7bXV0YXRpb25QYXJhbVR5cGV9PiAmIHtcbiAgICBvblVwbG9hZFByb2dyZXNzPzogKGU6IEF4aW9zUHJvZ3Jlc3NFdmVudCkgPT4gdm9pZDtcbiAgfVxuKSA9PiB1c2VNdXRhdGlvbih7XG4gIG11dGF0aW9uRm46IChwYXJhbXM6ICR7bXV0YXRpb25QYXJhbVR5cGV9KSA9PiAke211dGF0aW9uRm5DYWxsfSxcbiAgcmV0cnk6IGZhbHNlLFxuICAuLi5vcHRpb25zLFxufSk7XG4gICAgICAgICAgYC50cmltKCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBuYW1lc3BhY2VzLnB1c2goXG4gICAgICAgIGBcbmV4cG9ydCBuYW1lc3BhY2UgJHttb2RlbE5hbWV9U2VydmljZSB7XG4ke2Z1bmN0aW9ucy5qb2luKFwiXFxuXFxuXCIpfVxufVxuICAgICAgYC50cmltKCksXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEFzeW5jSWRDb25maWcg7IOd7ISxIChFbnRpdHnrs4TroZwpXG4gICAgY29uc3QgZW50aXR5SWRzID0gRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKTtcbiAgICBjb25zdCBhc3luY0lkQ29uZmlnczogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgZW50aXR5SWQgb2YgZW50aXR5SWRzKSB7XG4gICAgICBjb25zdCBuYW1lcyA9IEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQoZW50aXR5SWQpO1xuXG4gICAgICAvLyBBc3luY0lkQ29uZmln7JqpIOumrOyKpO2KuCDsobDtmowgQVBJIOywvuq4sFxuICAgICAgY29uc3QgbGlzdEFwaSA9IGFwaXNCeU1vZGVsLmdldChuYW1lcy5jYXBpdGFsKT8uZmluZCgoYXBpKSA9PiB7XG4gICAgICAgIC8vIHJlc291cmNlTmFtZeydtCDsl4bqsbDrgpggdGFuc3RhY2stcXVlcnnrpbwg7IKs7Jqp7ZWY7KeAIOyViuuKlCBBUEnripQg7KCc7Jm4XG4gICAgICAgIGlmICghYXBpLm9wdGlvbnMucmVzb3VyY2VOYW1lIHx8ICFhcGkub3B0aW9ucy5jbGllbnRzPy5pbmNsdWRlcyhcInRhbnN0YWNrLXF1ZXJ5XCIpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIHJlc291cmNlTmFtZeydtCDrs7XsiJjtmJXsnbTqs6Ag66mU7ISc65Oc66qF7J20IGZpbmRNYW557J24IEFQSVxuICAgICAgICBjb25zdCByZXNvdXJjZU5hbWUgPSBhcGkub3B0aW9ucy5yZXNvdXJjZU5hbWU7XG4gICAgICAgIHJldHVybiBpbmZsZWN0aW9uLnBsdXJhbGl6ZShyZXNvdXJjZU5hbWUpID09PSByZXNvdXJjZU5hbWUgJiYgYXBpLm1ldGhvZE5hbWUgPT09IFwiZmluZE1hbnlcIjtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAobGlzdEFwaSkge1xuICAgICAgICAvLyByZXNvdXJjZU5hbWXsl5DshJwgaG9vayDsnbTrpoQg7IOd7ISxICjquLDsobQg66Gc7KeB6rO8IOuPmeydvClcbiAgICAgICAgY29uc3QgaG9va05hbWUgPSBpbmZsZWN0aW9uLmNhbWVsaXplKGFzc2VydERlZmluZWQobGlzdEFwaS5vcHRpb25zLnJlc291cmNlTmFtZSksIHRydWUpO1xuICAgICAgICBjb25zdCB1c2VIb29rTmFtZSA9IGB1c2Uke2luZmxlY3Rpb24uY2FtZWxpemUoaG9va05hbWUpfWA7XG5cbiAgICAgICAgLy8gTGlzdFBhcmFtcyDtg4DsnoXrqoUg6rWs7ISxXG4gICAgICAgIGNvbnN0IGxpc3RQYXJhbXNUeXBlID0gYCR7bmFtZXMuY2FwaXRhbH1MaXN0UGFyYW1zYDtcblxuICAgICAgICBhc3luY0lkQ29uZmlncy5wdXNoKFxuICAgICAgICAgIGBcbi8vIEFzeW5jSWRDb25maWc6ICR7bmFtZXMuY2FwaXRhbH1cbmV4cG9ydCBjb25zdCAke25hbWVzLmNhcGl0YWx9QXN5bmNJZENvbmZpZzogQXN5bmNJZENvbmZpZzwke25hbWVzLmNhcGl0YWx9U3Vic2V0S2V5LCAke25hbWVzLmNhcGl0YWx9U3Vic2V0TWFwcGluZywgJHtsaXN0UGFyYW1zVHlwZX0+ID0ge1xuICBwbGFjZWhvbGRlcktleTogXCJlbnRpdHkuJHtuYW1lcy5jYXBpdGFsfVwiLFxuICB1c2VMaXN0OiAke25hbWVzLmNhcGl0YWx9U2VydmljZS4ke3VzZUhvb2tOYW1lfSxcbn07XG4gICAgICAgICAgYC50cmltKCksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQlVJTFRfSU5fVFlQRVPsl5DshJwg7IKs7Jqp65CY64qUIO2DgOyeheuTpOydhCDtmZXsnbjtlZjsl6wg64+Z7KCB7Jy866GcIGltcG9ydCDqtazshLFcbiAgICBjb25zdCBidWlsdEluVHlwZUltcG9ydHMgPSBPYmplY3Qua2V5cyhCVUlMVF9JTl9UWVBFUylcbiAgICAgIC5maWx0ZXIoKHR5cGVLZXkpID0+IGltcG9ydEtleXMuaW5jbHVkZXModHlwZUtleSkpXG4gICAgICAubWFwKCh0eXBlS2V5KSA9PiBgdHlwZSAke3R5cGVLZXl9YCk7XG5cbiAgICAvLyBzb25hbXUuc2hhcmVk7JeQ7IScIGltcG9ydO2VoCDtla3rqqnrk6TsnYQg64+Z7KCB7Jy866GcIOq1rOyEsVxuICAgIGNvbnN0IHNvbmFtdVNoYXJlZEltcG9ydHMgPSBbXG4gICAgICBcInR5cGUgTGlzdFJlc3VsdFwiLFxuICAgICAgXCJ0eXBlIEZpbHRlclF1ZXJ5XCIsXG4gICAgICAuLi5idWlsdEluVHlwZUltcG9ydHMsXG4gICAgICBcImZldGNoXCIsXG4gICAgICBcInR5cGUgRXZlbnRIYW5kbGVyc1wiLFxuICAgICAgXCJ0eXBlIFNTRVN0cmVhbU9wdGlvbnNcIixcbiAgICAgIFwidXNlU1NFU3RyZWFtXCIsXG4gICAgICBcInRvRm9ybURhdGFcIixcbiAgICBdLmpvaW4oXCIsIFwiKTtcblxuICAgIC8vIGJvZHkg6rWs7ISxOiBuYW1lc3BhY2VzICsgYXN5bmNJZENvbmZpZ3NcbiAgICBjb25zdCBib2R5UGFydHMgPSBbLi4ubmFtZXNwYWNlcywgLi4uYXN5bmNJZENvbmZpZ3NdO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuZ2V0VGFyZ2V0QW5kUGF0aCgpLFxuICAgICAgYm9keTogYm9keVBhcnRzLmpvaW4oXCJcXG5cXG5cIiksXG4gICAgICBpbXBvcnRLZXlzOiBkaWZmKHVuaXF1ZShpbXBvcnRLZXlzKSwgW1xuICAgICAgICAuLi50eXBlUGFyYW1OYW1lcyxcbiAgICAgICAgXCJMaXN0UmVzdWx0XCIsXG4gICAgICAgIC4uLk9iamVjdC5rZXlzKEJVSUxUX0lOX1RZUEVTKSxcbiAgICAgIF0pLFxuICAgICAgY3VzdG9tSGVhZGVyczogW1xuICAgICAgICBcIi8qKlwiLFxuICAgICAgICBcIiAqIEBnZW5lcmF0ZWRcIixcbiAgICAgICAgXCIgKiDsp4HsoJEg7IiY7KCV7ZWY7KeAIOuniOyEuOyalC5cIixcbiAgICAgICAgXCIgKi9cIixcbiAgICAgICAgXCIvKiogYmlvbWUtaWdub3JlLWFsbCBsaW50OiBnZW5lcmF0ZWTripQg66y07IucICovXCIsXG4gICAgICAgIFwiLyoqIGJpb21lLWlnbm9yZS1hbGwgYXNzaXN0OiBnZW5lcmF0ZWTripQg66y07IucICovXCIsXG4gICAgICAgIFwiXCIsXG4gICAgICAgIGBpbXBvcnQgeyBxdWVyeU9wdGlvbnMsIHVzZVF1ZXJ5LCB1c2VNdXRhdGlvbiwgdHlwZSBVc2VNdXRhdGlvbk9wdGlvbnMgfSBmcm9tICdAdGFuc3RhY2svcmVhY3QtcXVlcnknO2AsXG4gICAgICAgIGBpbXBvcnQgdHlwZSB7IEF4aW9zUHJvZ3Jlc3NFdmVudCB9IGZyb20gJ2F4aW9zJztgLFxuICAgICAgICBgaW1wb3J0IHFzIGZyb20gJ3FzJztgLFxuICAgICAgICBgaW1wb3J0IHsgJHtzb25hbXVTaGFyZWRJbXBvcnRzfSB9IGZyb20gJy4vc29uYW11LnNoYXJlZCc7YCxcbiAgICAgICAgYGltcG9ydCB0eXBlIHsgQXN5bmNJZENvbmZpZyB9IGZyb20gJ0Bzb25hbXUta2l0L3JlYWN0LWNvbXBvbmVudHMvY29tcG9uZW50cyc7YCxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbImluZmxlY3Rpb24iLCJkaWZmIiwidW5pcXVlIiwiYXBpUGFyYW1Ub1RzQ29kZSIsImFwaVBhcmFtVHlwZVRvVHNUeXBlIiwidW53cmFwUHJvbWlzZU9uY2UiLCJTb25hbXUiLCJFbnRpdHlNYW5hZ2VyIiwiQXBpUGFyYW1UeXBlIiwiYXNzZXJ0RGVmaW5lZCIsIlRlbXBsYXRlIiwiQlVJTFRfSU5fVFlQRVMiLCJ6b2RUeXBlVG9Uc1R5cGVEZWYiLCJUZW1wbGF0ZV9fc2VydmljZXMiLCJnZXRUYXJnZXRBbmRQYXRoIiwidGFyZ2V0IiwicGF0aCIsInJlbmRlciIsImFwaXMiLCJzeW5jZXIiLCJhcGlzQnlNb2RlbCIsIk1hcCIsImFwaSIsIm1vZGVsTmFtZSIsInJlcGxhY2UiLCJoYXMiLCJzZXQiLCJnZXQiLCJwdXNoIiwiaW1wb3J0S2V5cyIsIm5hbWVzcGFjZXMiLCJ0eXBlUGFyYW1OYW1lcyIsIm1vZGVsQXBpcyIsImZ1bmN0aW9ucyIsInN0cmVhbU9wdGlvbnMiLCJwYXJhbXNXaXRob3V0Q29udGV4dCIsInBhcmFtZXRlcnMiLCJmaWx0ZXIiLCJwYXJhbSIsImlzQ29udGV4dCIsInR5cGUiLCJpc1JlZktuZXgiLCJvcHRpb25hbCIsIm5hbWUiLCJzdGFydHNXaXRoIiwiYXBpQmFzZVVybCIsImNvbmZpZyIsInJvdXRlIiwicHJlZml4IiwibWV0aG9kTmFtZVN0cmVhbSIsIm9wdGlvbnMiLCJyZXNvdXJjZU5hbWUiLCJjYW1lbGl6ZSIsIm1ldGhvZE5hbWUiLCJtZXRob2ROYW1lU3RyZWFtQ2FtZWxpemVkIiwiZXZlbnRzVHlwZURlZiIsImV2ZW50cyIsInBhcmFtc0RlZkFzT2JqZWN0IiwibGVuZ3RoIiwibWFwIiwicCIsImpvaW4iLCJ0cmltIiwidHlwZVBhcmFtZXRlcnNBc1RzVHlwZSIsInR5cGVQYXJhbWV0ZXJzIiwidHlwZVBhcmFtIiwidHlwZVBhcmFtc0RlZiIsImNvbmNhdCIsInRwIiwiaWQiLCJwYXJhbXNEZWYiLCJwYXJhbU5hbWVzIiwicmV0dXJuVHlwZURlZiIsInJldHVyblR5cGUiLCJjbGllbnRzIiwiaW5jbHVkZXMiLCJmb3JtRGF0YUFwcGVuZCIsIm90aGVyUGFyYW1zQXBwZW5kIiwiaXNQcmltaXRpdmUiLCJwYXJhbXNEZWZDb21tYSIsInRpbWVvdXQiLCJodHRwTWV0aG9kIiwiaGFzUGFyYW1zIiwiaG9va05hbWUiLCJtdXRhdGlvblBhcmFtVHlwZSIsIm11dGF0aW9uUGFyYW1OYW1lcyIsInBhcmFtc1R5cGVEZWYiLCJzcGxpdCIsInNsaWNlIiwibXV0YXRpb25GbkNhbGwiLCJlbnRpdHlJZHMiLCJnZXRBbGxJZHMiLCJhc3luY0lkQ29uZmlncyIsImVudGl0eUlkIiwibmFtZXMiLCJnZXROYW1lc0Zyb21JZCIsImxpc3RBcGkiLCJjYXBpdGFsIiwiZmluZCIsInBsdXJhbGl6ZSIsInVzZUhvb2tOYW1lIiwibGlzdFBhcmFtc1R5cGUiLCJidWlsdEluVHlwZUltcG9ydHMiLCJPYmplY3QiLCJrZXlzIiwidHlwZUtleSIsInNvbmFtdVNoYXJlZEltcG9ydHMiLCJib2R5UGFydHMiLCJib2R5IiwiY3VzdG9tSGVhZGVycyJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsZ0JBQWdCLGFBQWE7QUFDcEMsU0FBU0MsSUFBSSxFQUFFQyxNQUFNLFFBQVEsVUFBVTtBQUN2QyxTQUNFQyxnQkFBZ0IsRUFDaEJDLG9CQUFvQixFQUNwQkMsaUJBQWlCLFFBQ1osK0JBQTRCO0FBRW5DLFNBQVNDLE1BQU0sUUFBUSxzQkFBbUI7QUFDMUMsU0FBU0MsYUFBYSxRQUFRLGlDQUE4QjtBQUU1RCxTQUFTQyxZQUFZLFFBQVEsdUJBQW9CO0FBQ2pELFNBQVNDLGFBQWEsUUFBUSx1QkFBb0I7QUFDbEQsU0FBU0MsUUFBUSxRQUFRLGlCQUFjO0FBQ3ZDLFNBQVNDLGNBQWMsRUFBRUMsa0JBQWtCLFFBQVEsc0JBQW1CO0FBRXRFLE9BQU8sTUFBTUMsMkJBQTJCSDtJQUN0QyxhQUFjO1FBQ1osS0FBSyxDQUFDO0lBQ1I7SUFFQUksbUJBQW1CO1FBQ2pCLE9BQU87WUFDTEMsUUFBUTtZQUNSQyxNQUFNLENBQUMscUJBQXFCLENBQUM7UUFDL0I7SUFDRjtJQUVBQyxPQUFPLEVBQStCLEVBQUU7UUFDdEMsTUFBTSxFQUFFQyxJQUFJLEVBQUUsR0FBR1osT0FBT2EsTUFBTTtRQUU5QixXQUFXO1FBQ1gsTUFBTUMsY0FBYyxJQUFJQztRQUN4QixLQUFLLE1BQU1DLE9BQU9KLEtBQU07WUFDdEIsTUFBTUssWUFBWUQsSUFBSUMsU0FBUyxDQUFDQyxPQUFPLENBQUMsVUFBVSxJQUFJQSxPQUFPLENBQUMsVUFBVTtZQUN4RSxJQUFJLENBQUNKLFlBQVlLLEdBQUcsQ0FBQ0YsWUFBWTtn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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sonamu",
3
- "version": "0.8.18",
3
+ "version": "0.8.19",
4
4
  "description": "Sonamu — TypeScript Fullstack API Framework",
5
5
  "keywords": [
6
6
  "typescript",
@@ -124,8 +124,8 @@
124
124
  "vite": "7.3.0",
125
125
  "vitest": "^4.0.10",
126
126
  "@sonamu-kit/hmr-hook": "^0.4.1",
127
- "@sonamu-kit/tasks": "^0.2.0",
128
127
  "@sonamu-kit/hmr-runner": "^0.1.1",
128
+ "@sonamu-kit/tasks": "^0.2.0",
129
129
  "@sonamu-kit/ts-loader": "^2.1.3"
130
130
  },
131
131
  "devDependencies": {
@@ -213,8 +213,10 @@ export function stream(options: StreamDecoratorOptions) {
213
213
  true,
214
214
  )}/${inflection.camelize(propertyKey, true)}`;
215
215
  const path = options.path ?? defaultPath;
216
+ // stream 전용 필드(events, type)는 ApiDecoratorOptions에 속하지 않으므로 제외
217
+ const { events: _, type: _type, ...apiOptions } = options;
216
218
  const optionsWithDefaults = {
217
- ...options,
219
+ ...apiOptions,
218
220
  httpMethod: "GET" as HTTPMethods,
219
221
  };
220
222
 
@@ -39,3 +39,23 @@ See `.claude/skills/sonamu/SKILL.md` for the full skill list.
39
39
  ## Cross-workspace gate
40
40
 
41
41
  - For changes in this scope, root `pnpm check` (Biome) must pass before handoff.
42
+
43
+ ## TypeScript type safety policy
44
+
45
+ - `as any` and `as unknown as T` are strictly prohibited.
46
+ - Resolve type errors through correct type annotations, generic constraints, type narrowing, or interface extension.
47
+ - Do not use `as any` to work around "excessively deep" or similar TypeScript inference limits — find the correct access pattern instead (e.g. use `getPuri("r")` directly rather than casting the result).
48
+ - Chaining methods after `as any` bypasses all TypeScript signature checks and leads directly to runtime bugs.
49
+
50
+ ## Skill read triggers
51
+
52
+ Read the listed skill file before attempting any workaround or fix in these situations:
53
+
54
+ | Situation | Read before acting |
55
+ |-----------|-------------------|
56
+ | TypeScript error in Model code (type inference, "excessively deep", etc.) | `puri.md`, `model.md` |
57
+ | Writing or modifying a `findMany()` / `executeSubsetQuery()` call | `model.md` |
58
+ | Writing or modifying a `@upload` method | `api.md` |
59
+ | Database query returning unexpected results | `puri.md` |
60
+ | Migration error or schema change | `migration.md` |
61
+ | Spec status gate or testRef validation failing | `cdd.md` |
@@ -247,6 +247,7 @@ confirmed → cancelled (환자/의사 취소, 24시간 전까지만)
247
247
  | Auth Migration | `auth-migration.md` | better-auth 등 외부 인증 통합 시 User.id 타입 변경 |
248
248
  | **Auth Plugins** | `auth-plugins.md` | **better-auth 플러그인 래퍼 (admin, organization, 2fa, passkey 등 10종), snake_case 매핑** |
249
249
  | **벡터 검색** | `vector.md` | **pgvector 임베딩 (Voyage AI/OpenAI), 청킹, 하이브리드 검색** |
250
+ | Puri 쿼리 빌더 | `puri.md` | SELECT, WHERE, JOIN, FTS, pg_trgm fuzzy search, pgvector |
250
251
  | **AI Agents** | `ai-agents.md` | **BaseAgentClass, @tools 데코레이터, ToolLoopAgent, AsyncLocalStorage 상태** |
251
252
  | **Tasks** | `tasks.md` | **백그라운드 워크플로우, cron 스케줄링, durable step, 재시도 정책** |
252
253
  | **스킬 기여** | `skill-contribution.md` | **트러블슈팅 해결 → 스킬 반영 워크플로우 (매칭, 판정, 포맷, 승인)** |
@@ -288,6 +289,7 @@ confirmed → cancelled (환자/의사 취소, 24시간 전까지만)
288
289
  | 다국어/번역 | i18n |
289
290
  | Scaffolding 오류 | scaffolding |
290
291
  | **벡터 검색/임베딩** | **vector** |
292
+ | **pg_trgm Fuzzy Search** | **puri, entity-basic** |
291
293
  | **AI Agent 개발** | **ai-agents** |
292
294
  | **백그라운드 작업/스케줄링** | **tasks** |
293
295
  | **트러블슈팅 → 스킬 반영** | **skill-contribution** |
@@ -99,11 +99,11 @@ async me(): Promise<User | null> {
99
99
  > `@api`를 함께 붙이면 `checkSingleDecorator` 충돌로 **빌드 에러**가 발생한다.
100
100
 
101
101
  ```typescript
102
- // CORRECT
102
+ // CORRECT
103
103
  @upload({ limits: { files: 10 }, guards: ["user"] })
104
104
  async upload(...): Promise<number[]> { }
105
105
 
106
- // WRONG — 빌드 에러 발생
106
+ // WRONG — 빌드 에러 발생
107
107
  @api({ httpMethod: "POST", clients: ["axios-multipart"] })
108
108
  @upload({ limits: { files: 10 } })
109
109
  async upload(...): Promise<number[]> { }
@@ -120,6 +120,30 @@ async upload(...): Promise<number[]> { }
120
120
  | `destination` | 스트림 모드 전용: 스토리지 드라이버 키 |
121
121
  | `keyGenerator` | 스트림 모드 전용: 저장 경로 생성 함수 |
122
122
 
123
+ ### 파라미터 규칙: 반드시 단일 객체로 묶기
124
+
125
+ > **CRITICAL: `@upload` 메서드에 파라미터가 2개 이상이면 반드시 단일 객체로 묶는다.**
126
+ >
127
+ > primitive 파라미터를 여러 개 쓰면 `services.template.ts`의 codegen 버그로 `useUploadMutation`이 잘못 생성된다.
128
+
129
+ ```typescript
130
+ // WRONG — codegen 깨짐 (mutationFn 인수 누락)
131
+ async upload(entity_type: string, entity_id: number, file_type: string)
132
+
133
+ // CORRECT — 단일 객체로 묶기
134
+ async upload(params: { entity_type: string; entity_id: number; file_type: string })
135
+ ```
136
+
137
+ 호출부 패턴:
138
+ ```typescript
139
+ uploadMutation.mutate({
140
+ params: { entity_type, entity_id, file_type },
141
+ files,
142
+ })
143
+ ```
144
+
145
+ > 자세한 원인 분석은 `framework-change.md`의 `@upload 다중 파라미터` 섹션 참고.
146
+
123
147
  ### 버퍼 모드 (기본)
124
148
 
125
149
  ```typescript
@@ -262,6 +262,11 @@ Conditions that must be met for this Spec's implementation to be considered "don
262
262
  - Recommended format: "조건 X이면 Y이다" (input-result).
263
263
  - `testRef`는 `implementing` 단계에서 비워두고, `validating` 단계에서 채운다.
264
264
 
265
+ **testRef 작성 시 주의사항**:
266
+ - `testRef.target`은 실제로 존재하는 파일 경로만 기재한다. 존재하지 않는 경로(예: `admin/` 접두)는 MISSING 오류 발생.
267
+ - `testRef.pattern`은 `it()/test()` 설명문에서 실제로 매칭되는 문자열을 사용한다. 테스트 작성 전이면 작성 예정 테스트명을 그대로 pattern으로 기입한다.
268
+ - 구현이 완료됐음에도 testRef 경로 오류로 누락처럼 보이는 경우가 있다. `pnpm cdd test` 결과 MISSING/NO_MATCH가 나오면 코드가 아닌 testRef 경로/패턴부터 확인한다.
269
+
265
270
  **Validation usage**: `cdd advance <spec>` 실행 시 Layer 1/Layer 2 검증에 사용된다. `testRef.pattern` 매칭은 `validating → done` 전이 시 확인된다.
266
271
 
267
272
  ### Spec detail level
@@ -287,7 +287,7 @@ ALTER TABLE ONLY public.companies ADD CONSTRAINT companies_pkey PRIMARY KEY (id)
287
287
  -- 2010~2017: CREATE INDEX
288
288
  CREATE INDEX projects_name_description_pgroonga_index ON public.projects ...;
289
289
 
290
- -- 2024~: ALTER TABLE ... FOREIGN KEY (FK constraint - 이 전에 데이터 있어야 함!)
290
+ -- WRONG 2024~: ALTER TABLE ... FOREIGN KEY (FK constraint - 이 전에 데이터 있어야 함!)
291
291
  ALTER TABLE ONLY public.departments
292
292
  ADD CONSTRAINT departments_company_id_foreign FOREIGN KEY (company_id) REFERENCES public.companies(id);
293
293
  ```
@@ -298,8 +298,8 @@ ALTER TABLE ONLY public.departments
298
298
 
299
299
  | 위치 | 결과 |
300
300
  |------|------|
301
- | FK CONSTRAINT 전 | 정상 - 데이터 삽입 후 FK 검사 |
302
- | FK CONSTRAINT 후 | 실패 - 참조 테이블 데이터 없어서 FK 위반 |
301
+ | FK CONSTRAINT 전 | OK - 데이터 삽입 후 FK 검사 |
302
+ | FK CONSTRAINT 후 | FAIL - 참조 테이블 데이터 없어서 FK 위반 |
303
303
 
304
304
  ### 테이블 간 의존성 순서
305
305
 
@@ -73,14 +73,14 @@ pnpm sonamu stub entity {EntityId}
73
73
 
74
74
  **올바른 예시:**
75
75
 
76
- - `pnpm sonamu stub entity Course`
77
- - `pnpm sonamu stub entity User`
78
- - `pnpm sonamu stub entity ConsultationHistory`
76
+ - `pnpm sonamu stub entity Course` (correct)
77
+ - `pnpm sonamu stub entity User` (correct)
78
+ - `pnpm sonamu stub entity ConsultationHistory` (correct)
79
79
 
80
80
  **잘못된 예시:**
81
81
 
82
- - `pnpm sonamu stub entity course` (소문자로 시작)
83
- - `pnpm gen stub entity Course` (잘못된 명령어)
82
+ - `pnpm sonamu stub entity course` (wrong - 소문자로 시작)
83
+ - `pnpm gen stub entity Course` (wrong - 잘못된 명령어)
84
84
 
85
85
  생성되는 파일: `api/src/application/{entity}/{entity}.entity.json`
86
86
 
@@ -374,6 +374,49 @@ Sonamu의 `ubUpsert`는 PostgreSQL의 `ON CONFLICT ... DO UPDATE`를 사용하
374
374
  - `id` 필수 (타입명으로 사용)
375
375
  - 별도로 TypeScript 타입 정의 필요
376
376
 
377
+ ### searchText 필드 추가할 때 (pg_trgm Fuzzy Search용)
378
+
379
+ 여러 컬럼을 하나의 generated column으로 통합하는 전용 prop 타입이다. GIN 인덱스와 함께 쓴다.
380
+
381
+ ```json
382
+ {
383
+ "props": [
384
+ { "name": "title_ko", "type": "string" },
385
+ { "name": "title_en", "type": "string" },
386
+ { "name": "tags", "type": "string[]" },
387
+ {
388
+ "name": "search_text",
389
+ "type": "searchText",
390
+ "sourceColumns": [
391
+ { "name": "title_ko" },
392
+ { "name": "title_en", "caseInsensitive": true },
393
+ { "name": "tags" }
394
+ ]
395
+ }
396
+ ],
397
+ "indexes": [
398
+ {
399
+ "name": "idx_items_search_text",
400
+ "type": "index",
401
+ "columns": [{ "name": "search_text", "opclass": "gin_trgm_ops" }],
402
+ "using": "gin"
403
+ }
404
+ ]
405
+ }
406
+ ```
407
+
408
+ source column 타입별 SQL 표현:
409
+
410
+ | source 타입 | caseInsensitive: true | caseInsensitive: false (기본) |
411
+ |------------|----------------------|------------------------------|
412
+ | `string` | `lower(COALESCE(col, ''))` | `COALESCE(col, '')` |
413
+ | `string[]` | `sonamu_text_array_agg(col)` | `sonamu_text_array_agg(col, false)` |
414
+ | `json` (z.array(z.string())) | `sonamu_jsonb_array_agg(col)` | `sonamu_jsonb_array_agg(col, false)` |
415
+
416
+ - `string[]` 또는 `json(string[])` source가 있으면 마이그레이션에 헬퍼 함수 DDL이 자동 삽입됨
417
+ - `searchText` 컬럼은 generated column이므로 SaveParams에서 자동 제외됨 — INSERT/UPDATE 불가
418
+ - 쿼리 사용법: `puri.md` "pg_trgm Fuzzy Search" 섹션 참조
419
+
377
420
  ### 유니크 제약 추가할 때
378
421
 
379
422
  ```json
@@ -12,7 +12,7 @@ Entity를 생성한 후 반드시 다음 단계를 순서대로 수행하세요.
12
12
  ```
13
13
  1. stub 생성
14
14
  2. entity.json 작성
15
- 3. 자동 검증 실행 (이 체크리스트)
15
+ 3. 자동 검증 실행 (이 체크리스트)
16
16
  4. model.ts, types.ts 생성
17
17
  5. sync 실행
18
18
  6. migration 생성
@@ -57,7 +57,7 @@ description: Sonamu 프레임워크 소스 수정 vs. 프로젝트 레벨 우회
57
57
  `@upload` 메서드에 primitive 파라미터가 여러 개이면 `services.template.ts`의 `split(':')` 버그로 `useUploadMutation`이 잘못 생성된다.
58
58
 
59
59
  ```typescript
60
- // 이렇게 쓰면 codegen 깨짐
60
+ // WRONG 이렇게 쓰면 codegen 깨짐
61
61
  async upload(entity_type: string, entity_id: number, file_type: string)
62
62
  ```
63
63
 
@@ -70,7 +70,7 @@ mutationFn: (params: { params: string; ... }) => upload(params.params, params.fi
70
70
  ### 해결: 단일 객체로 묶는다
71
71
 
72
72
  ```typescript
73
- // 단일 객체 파라미터
73
+ // CORRECT 단일 객체 파라미터
74
74
  async upload(params: { entity_type: string; entity_id: number; file_type: string })
75
75
  ```
76
76
 
@@ -136,6 +136,26 @@ return this.executeSubsetQuery({
136
136
  });
137
137
  ```
138
138
 
139
+ > **CRITICAL: `executeSubsetQuery()` 반환 객체를 직접 mutate하지 않는다.**
140
+ >
141
+ > `result.rows = result.rows.map(...)` 또는 `(result as any).rows = ...` 방식으로 rows를 교체하면
142
+ > `total` 카운트가 깨져 pagination이 오동작한다.
143
+ >
144
+ > 추가 계산이 필요한 virtual 필드는 `enhancers` 패턴으로 처리한다:
145
+ >
146
+ > ```typescript
147
+ > // WRONG — pagination 파괴
148
+ > const result = await this.executeSubsetQuery({ subset, qb, params });
149
+ > (result as any).rows = result.rows.map((row) => ({ ...row, extra: "value" }));
150
+ > return result as any;
151
+ >
152
+ > // CORRECT — enhancers 패턴
153
+ > const enhancers = this.createEnhancers({
154
+ > A: (row) => ({ ...row, extra: "value" }),
155
+ > });
156
+ > return this.executeSubsetQuery({ subset, qb, params, enhancers });
157
+ > ```
158
+
139
159
  ### queryMode
140
160
 
141
161
  params에 queryMode를 전달하여 반환값 제어:
@@ -20,6 +20,19 @@ const users = await db.table({ u: "users" }).select({ id: "u.id" });
20
20
 
21
21
  ## SELECT
22
22
 
23
+ > **CRITICAL: `.select()`는 반드시 객체 형식으로 사용한다.**
24
+ >
25
+ > 문자열 인수를 전달하면 문자열이 character 단위로 spread되어 `select "i" as "0", "d" as "1", ...` 같은 잘못된 SQL이 생성된다.
26
+ > `as any` 캐스팅 후 체이닝할 때 특히 주의한다.
27
+ >
28
+ > ```typescript
29
+ > // WRONG — character spread 버그
30
+ > db.table("files").select("files.entity_id", "files.file_type")
31
+ >
32
+ > // CORRECT
33
+ > db.table("files").select({ entity_id: "files.entity_id", file_type: "files.file_type" })
34
+ > ```
35
+
23
36
  ```typescript
24
37
  // 기본 select
25
38
  const users = await db.table("users").select({ id: "id", name: "username" });
@@ -70,8 +83,10 @@ db.select({
70
83
 
71
84
  ### Raw SQL 표현식
72
85
 
86
+ 두 번째 인수 `params`로 바인드 파라미터를 전달할 수 있다. 값을 SQL에 직접 보간하지 말고 params를 사용한다.
87
+
73
88
  ```typescript
74
- // 타입별 raw 헬퍼 (반환 타입 추론)
89
+ // 파라미터 없는 경우
75
90
  db.select({
76
91
  custom: Puri.rawString("COALESCE(nickname, username)"),
77
92
  total: Puri.rawNumber("price * quantity"),
@@ -79,6 +94,15 @@ db.select({
79
94
  expireAt: Puri.rawDate("created_at + INTERVAL '30 days'"),
80
95
  tags: Puri.rawStringArray("string_to_array(tags, ',')"),
81
96
  });
97
+
98
+ // params 배열로 바인드 (SQL injection 방지)
99
+ db.select({
100
+ score: Puri.rawNumber(
101
+ `word_similarity(?, items.title) * 5 + word_similarity(?, items.tags) * 2`,
102
+ [query, query]
103
+ ),
104
+ label: Puri.rawString(`COALESCE(??, ?)`, ["items.name", "미지정"]),
105
+ });
82
106
  ```
83
107
 
84
108
  ## WHERE
@@ -335,25 +359,40 @@ db.select({
335
359
 
336
360
  ### tsRank / tsRankCd (검색 순위)
337
361
 
362
+ 첫 번째 인수에 컬럼명 문자열 대신 `Puri.toTsVector()`를 전달해야 한다.
363
+
338
364
  ```typescript
365
+ // toTsVector()로 감싸서 전달 (필수)
339
366
  db.select({
340
- rank: Puri.tsRank("search_vector", "검색어"),
367
+ rank: Puri.tsRank(Puri.toTsVector("documents.search_vector"), "검색어"),
341
368
  })
342
- .whereTsSearch("search_vector", "검색어")
369
+ .whereTsSearch("documents.search_vector", "검색어")
343
370
  .orderBy("rank", "desc");
344
371
 
372
+ // config 지정
373
+ db.select({
374
+ rank: Puri.tsRank(Puri.toTsVector("documents.title", "korean"), "검색어"),
375
+ });
376
+
345
377
  // 옵션
346
378
  db.select({
347
- rank: Puri.tsRank("search_vector", "검색어", {
348
- config: "korean",
349
- normalization: 1, // 문서 길이 정규화
379
+ rank: Puri.tsRank(Puri.toTsVector("documents.title"), "검색어", {
380
+ normalization: 1, // 문서 길이 정규화
350
381
  weights: [0.1, 0.2, 0.4, 1.0], // D, C, B, A 가중치
351
382
  }),
352
383
  });
353
384
 
354
385
  // tsRankCd (Cover Density)
355
386
  db.select({
356
- rank: Puri.tsRankCd("search_vector", "검색어"),
387
+ rank: Puri.tsRankCd(Puri.toTsVector("documents.title"), "검색어"),
388
+ });
389
+
390
+ // tsRankCd 옵션
391
+ db.select({
392
+ rank: Puri.tsRankCd(Puri.toTsVector("documents.title"), "검색어", {
393
+ parser: "phraseto_tsquery",
394
+ normalization: 16,
395
+ }),
357
396
  });
358
397
  ```
359
398
 
@@ -451,6 +490,59 @@ db.vectorSimilarity("embedding", embedding, {
451
490
 
452
491
  ---
453
492
 
493
+ ## pg_trgm Fuzzy Search
494
+
495
+ `CREATE EXTENSION IF NOT EXISTS pg_trgm` 필요. `searchText` prop으로 생성된 generated column과 GIN 인덱스를 함께 사용하는 것이 일반적이다.
496
+
497
+ ### whereFuzzy — 후보 필터링
498
+
499
+ 연산자별로 SQL 피연산자 순서가 다르다:
500
+
501
+ | operator | 의미 | SQL |
502
+ |----------|------|-----|
503
+ | `<%` (기본) | word similarity | `'query' <% column` |
504
+ | `%` | similarity | `column % 'query'` |
505
+ | `<<%` | strict word similarity | `'query' <<% column` |
506
+
507
+ ```typescript
508
+ puri.whereFuzzy("items.search_text", query);
509
+ puri.whereFuzzy("items.search_text", query, { operator: "%" });
510
+ puri.whereFuzzy("items.search_text", query, { operator: "<<%" });
511
+ ```
512
+
513
+ ### 유사도 점수 — Static 메서드
514
+
515
+ `SqlExpression<"number">`를 반환하므로 select에서 점수 컬럼으로 활용한다:
516
+
517
+ ```typescript
518
+ // Puri.wordSimilarity(column, query) → word_similarity(?, ??)
519
+ // Puri.similarity(column, query) → similarity(??, ?)
520
+ // Puri.strictWordSimilarity(column, query) → strict_word_similarity(?, ??)
521
+
522
+ const results = await this.getPuri("r")
523
+ .table("items")
524
+ .whereFuzzy("items.search_text", query)
525
+ .select({
526
+ id: "items.id",
527
+ title: "items.title_ko",
528
+ score: Puri.rawNumber(
529
+ `word_similarity(?, items.title_ko) * 5 + word_similarity(?, items.title_en) * 3`,
530
+ [query, query]
531
+ ),
532
+ })
533
+ .orderByRaw("score DESC");
534
+ ```
535
+
536
+ ### 언어별 특성
537
+
538
+ | 언어 | 적합성 | 비고 |
539
+ |------|--------|------|
540
+ | 영어 | 우수 | 단어 단위 분리 + word_similarity |
541
+ | 한국어 | 양호 | 1-2글자 검색 시 성능 저하 |
542
+ | 일본어 | 양호 | 1-2글자 검색 시 성능 저하 |
543
+
544
+ ---
545
+
454
546
  ## Rules
455
547
 
456
548
  - MUST use `getPuri("r")` for read queries, `getPuri("w")` for write queries
@@ -143,7 +143,7 @@ export const PostSaveParams = PostBaseSchema
143
143
  ### 완료 확인
144
144
 
145
145
  ```
146
- Scaffolding 후 필수 체크리스트 완료
146
+ Scaffolding 후 필수 체크리스트 완료
147
147
  → 다음 단계: 테스트 작성 (testing.md)
148
148
 
149
149
  ⚠️ types.ts nullable 필드 처리를 하지 않으면
@@ -126,6 +126,7 @@ description: Sonamu 전체 개발 워크플로우. 프로젝트 생성부터 Fro
126
126
  - [ ] 모든 도메인 contract 작성 및 사용자 승인
127
127
  - [ ] 모든 domain spec 파일 작성 완료
128
128
  - [ ] 사용자 spec 검토 완료
129
+ - [ ] `pnpm cdd test` 실행 시 MISSING 0, NO_MATCH 0 확인
129
130
 
130
131
  ---
131
132
 
@@ -141,6 +142,11 @@ description: Sonamu 전체 개발 워크플로우. 프로젝트 생성부터 Fro
141
142
  - 설계하면서 사용자에게 비즈니스 로직에 맞는지 **지속적으로 디테일하게** 확인받을 것
142
143
  - 관계 유형(BelongsToOne, HasMany, ManyToMany) 결정 시 반드시 사용자 확인
143
144
  - 필드 구성, enum 값, nullable 여부 등 세부 사항도 확인
145
+ - **파일 첨부가 필요한 엔티티가 있는지 사용자에게 확인한다.** 있다면 다음을 질문한다:
146
+ - 어떤 엔티티에 파일을 첨부할 것인가?
147
+ - 파일 종류(file_type)를 어떻게 구분할 것인가? (예: `task_order`, `result_report` 등)
148
+ - 파일 첨부 여부에 따라 상태(status)가 자동 변경되는 로직이 있는가?
149
+ - 별도 File 엔티티를 두고 `entity_type` + `entity_id` 조합으로 연결할 것인가, 아니면 다른 방식으로 구현할 것인가?
144
150
  21. 최종 완료된 설계안을 `.claude/skills/project/architecture.md`에 기록
145
151
 
146
152
  **완료 기준:**
@@ -253,9 +253,6 @@ export async function ${api.methodName}${typeParamsDef}(
253
253
  return fetch({
254
254
  method: 'POST',
255
255
  url: \`${apiBaseUrl}\`,
256
- headers: {
257
- "Content-Type": "multipart/form-data",
258
- },
259
256
  onUploadProgress,
260
257
  data: formData,
261
258
  ${api.options.timeout ? `signal: AbortSignal.timeout(${api.options.timeout}),` : ""}
@@ -156,9 +156,6 @@ export async function ${methodName}${typeParamsDef}(
156
156
  return fetch({
157
157
  method: 'POST',
158
158
  url: \`${apiBaseUrl}\`,
159
- headers: {
160
- "Content-Type": "multipart/form-data",
161
- },
162
159
  onUploadProgress,
163
160
  data: formData,
164
161
  ${api.options.timeout ? `signal: AbortSignal.timeout(${api.options.timeout}),` : ""}