@decohere/create 0.0.1-dev.36 → 0.0.1-dev.38

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.
@@ -54,6 +54,10 @@ import { WELL_KNOWN_FILES } from "./const.js";
54
54
  if (svc.container_name) lines.push(` container_name: ${svc.container_name}`);
55
55
  if (svc.command) lines.push(` command: ${svc.command}`);
56
56
  if (svc.restart) lines.push(` restart: ${svc.restart}`);
57
+ if (svc.profiles && svc.profiles.length > 0) {
58
+ lines.push(" profiles:");
59
+ for (const p of svc.profiles)lines.push(` - ${p}`);
60
+ }
57
61
  if (svc.env_file && svc.env_file.length > 0) {
58
62
  lines.push(" env_file:");
59
63
  for (const f of svc.env_file)lines.push(` - ${f}`);
@@ -125,4 +129,4 @@ import { WELL_KNOWN_FILES } from "./const.js";
125
129
  }
126
130
  }
127
131
 
128
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvbW9kZWxzL2NvbXBvc2UubW9kZWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV0VMTF9LTk9XTl9GSUxFUyB9IGZyb20gXCIuL2NvbnN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IEtleWVkTW9kZWwgfSBmcm9tIFwiLi9zb3VyY2UtZmlsZS5qc1wiO1xuXG5leHBvcnQgdHlwZSBDb21wb3NlTmV0d29ya1JlZiA9XG5cdHwgc3RyaW5nXG5cdHwge1xuXHRcdFx0LyoqIE5ldHdvcmsga2V5IHVuZGVyIGBuZXR3b3JrczpgIG9uIHRoaXMgc2VydmljZSAqL1xuXHRcdFx0W25ldHdvcmtLZXk6IHN0cmluZ106IHsgYWxpYXNlcz86IHN0cmluZ1tdIH07XG5cdCAgfTtcblxuZXhwb3J0IGludGVyZmFjZSBDb21wb3NlSGVhbHRoY2hlY2sge1xuXHR0ZXN0OiBzdHJpbmdbXTtcblx0aW50ZXJ2YWw/OiBzdHJpbmc7XG5cdHRpbWVvdXQ/OiBzdHJpbmc7XG5cdHJldHJpZXM/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9zZVNlcnZpY2Uge1xuXHRidWlsZD86IHN0cmluZztcblx0aW1hZ2U/OiBzdHJpbmc7XG5cdGNvbnRhaW5lcl9uYW1lPzogc3RyaW5nO1xuXHRlbnZfZmlsZT86IHN0cmluZ1tdO1xuXHRlbnZpcm9ubWVudD86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cdHBvcnRzPzogc3RyaW5nW107XG5cdHZvbHVtZXM/OiBzdHJpbmdbXTtcblx0Y29tbWFuZD86IHN0cmluZztcblx0cmVzdGFydD86IHN0cmluZztcblx0ZGVwZW5kc19vbj86IHN0cmluZ1tdO1xuXHQvKiogQXR0YWNoIHRvIGNvbXBvc2UgbmV0d29ya3MgKHN0cmluZyBuYW1lIG9yIG1hcCB3aXRoIGFsaWFzZXMpLiAqL1xuXHRuZXR3b3Jrcz86IENvbXBvc2VOZXR3b3JrUmVmW107XG5cdGhlYWx0aGNoZWNrPzogQ29tcG9zZUhlYWx0aGNoZWNrO1xufVxuXG5leHBvcnQgdHlwZSBDb21wb3NlTmV0d29yayA9IHtcblx0LyoqIEZpeGVkIERvY2tlciBuZXR3b3JrIG5hbWUgKHNoYXJlYWJsZSBhY3Jvc3MgY29tcG9zZSBwcm9qZWN0cykuICovXG5cdG5hbWU6IHN0cmluZztcblx0ZXh0ZXJuYWw/OiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBMaXZlIGJ1aWxkZXIgZm9yIGBkb2NrZXItY29tcG9zZS55bWxgLlxuICpcbiAqIEZlYXR1cmVzIGNhbGwgYGFkZFNlcnZpY2VgIC8gYGFkZFZvbHVtZWAgLyBgYWRkTmV0d29ya2AgaW4gdGhlaXIgc2NhZmZvbGQgcGhhc2VzLlxuICovXG5leHBvcnQgY2xhc3MgRG9ja2VyQ29tcG9zZSBpbXBsZW1lbnRzIEtleWVkTW9kZWwge1xuXHRwdWJsaWMgcmVhZG9ubHkga2V5ID0gV0VMTF9LTk9XTl9GSUxFUy5ET0NLRVJfQ09NUE9TRTtcblx0cHJpdmF0ZSBfcHJvamVjdE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0cHJpdmF0ZSByZWFkb25seSBfc2VydmljZXM6IE1hcDxzdHJpbmcsIENvbXBvc2VTZXJ2aWNlPiA9IG5ldyBNYXAoKTtcblx0cHJpdmF0ZSByZWFkb25seSBfdm9sdW1lczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cdHByaXZhdGUgcmVhZG9ubHkgX25ldHdvcmtzOiBNYXA8c3RyaW5nLCBDb21wb3NlTmV0d29yaz4gPSBuZXcgTWFwKCk7XG5cblx0LyoqIENvbXBvc2UgcHJvamVjdCBuYW1lIChgbmFtZTpgIHRvcC1sZXZlbCkg4oCUIGlzb2xhdGVzIGNvbnRhaW5lcnMvdm9sdW1lcy4gKi9cblx0cHVibGljIHNldFByb2plY3ROYW1lKG5hbWU6IHN0cmluZyk6IHRoaXMge1xuXHRcdHRoaXMuX3Byb2plY3ROYW1lID0gbmFtZTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHB1YmxpYyBhZGRTZXJ2aWNlKG5hbWU6IHN0cmluZywgY29uZmlnOiBDb21wb3NlU2VydmljZSk6IHRoaXMge1xuXHRcdHRoaXMuX3NlcnZpY2VzLnNldChuYW1lLCBjb25maWcpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIGZpbGVzKCkge1xuXHRcdHJldHVybiBbXG5cdFx0XHR7XG5cdFx0XHRcdGZpbGVQYXRoOiBcIi5kZXZjb250YWluZXIvZG9ja2VyLWNvbXBvc2UueW1sXCIsXG5cdFx0XHRcdGNvbnRlbnQ6IHRoaXMuZ2V0Q29udGVudCgpLFxuXHRcdFx0fSxcblx0XHRdO1xuXHR9XG5cblx0cHVibGljIGFkZFZvbHVtZShuYW1lOiBzdHJpbmcpOiB0aGlzIHtcblx0XHR0aGlzLl92b2x1bWVzLmFkZChuYW1lKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHB1YmxpYyBhZGROZXR3b3JrKGtleTogc3RyaW5nLCBuZXR3b3JrOiBDb21wb3NlTmV0d29yayk6IHRoaXMge1xuXHRcdHRoaXMuX25ldHdvcmtzLnNldChrZXksIG5ldHdvcmspO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqIEFwcGVuZCBhbiBlbnZfZmlsZSBwYXRoIHRvIGFuIGV4aXN0aW5nIHNlcnZpY2UuICovXG5cdHB1YmxpYyBhZGRFbnZGaWxlKHNlcnZpY2VOYW1lOiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpOiB0aGlzIHtcblx0XHRjb25zdCBzdmMgPSB0aGlzLl9zZXJ2aWNlcy5nZXQoc2VydmljZU5hbWUpO1xuXHRcdGlmIChzdmMpIHN2Yy5lbnZfZmlsZSA9IFsuLi4oc3ZjLmVudl9maWxlID8/IFtdKSwgZmlsZVBhdGhdO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIGdldENvbnRlbnQoKTogc3RyaW5nIHtcblx0XHRjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblx0XHRpZiAodGhpcy5fcHJvamVjdE5hbWUpIHtcblx0XHRcdGxpbmVzLnB1c2goYG5hbWU6ICR7dGhpcy5fcHJvamVjdE5hbWV9YCwgXCJcIik7XG5cdFx0fVxuXHRcdGxpbmVzLnB1c2goXCJzZXJ2aWNlczpcIik7XG5cblx0XHRmb3IgKGNvbnN0IFtuYW1lLCBzdmNdIG9mIHRoaXMuX3NlcnZpY2VzKSB7XG5cdFx0XHRsaW5lcy5wdXNoKGAgICR7bmFtZX06YCk7XG5cdFx0XHRpZiAoc3ZjLmJ1aWxkKSBsaW5lcy5wdXNoKGAgICAgYnVpbGQ6ICR7c3ZjLmJ1aWxkfWApO1xuXHRcdFx0aWYgKHN2Yy5pbWFnZSkgbGluZXMucHVzaChgICAgIGltYWdlOiAke3N2Yy5pbWFnZX1gKTtcblx0XHRcdGlmIChzdmMuY29udGFpbmVyX25hbWUpIGxpbmVzLnB1c2goYCAgICBjb250YWluZXJfbmFtZTogJHtzdmMuY29udGFpbmVyX25hbWV9YCk7XG5cdFx0XHRpZiAoc3ZjLmNvbW1hbmQpIGxpbmVzLnB1c2goYCAgICBjb21tYW5kOiAke3N2Yy5jb21tYW5kfWApO1xuXHRcdFx0aWYgKHN2Yy5yZXN0YXJ0KSBsaW5lcy5wdXNoKGAgICAgcmVzdGFydDogJHtzdmMucmVzdGFydH1gKTtcblxuXHRcdFx0aWYgKHN2Yy5lbnZfZmlsZSAmJiBzdmMuZW52X2ZpbGUubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRsaW5lcy5wdXNoKFwiICAgIGVudl9maWxlOlwiKTtcblx0XHRcdFx0Zm9yIChjb25zdCBmIG9mIHN2Yy5lbnZfZmlsZSkgbGluZXMucHVzaChgICAgICAgLSAke2Z9YCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzdmMuZW52aXJvbm1lbnQgJiYgT2JqZWN0LmtleXMoc3ZjLmVudmlyb25tZW50KS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGxpbmVzLnB1c2goXCIgICAgZW52aXJvbm1lbnQ6XCIpO1xuXHRcdFx0XHRmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhzdmMuZW52aXJvbm1lbnQpKSB7XG5cdFx0XHRcdFx0bGluZXMucHVzaChgICAgICAgJHtrfTogJHt2fWApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzdmMucG9ydHMgJiYgc3ZjLnBvcnRzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0bGluZXMucHVzaChcIiAgICBwb3J0czpcIik7XG5cdFx0XHRcdGZvciAoY29uc3QgcCBvZiBzdmMucG9ydHMpIGxpbmVzLnB1c2goYCAgICAgIC0gXCIke3B9XCJgKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHN2Yy52b2x1bWVzICYmIHN2Yy52b2x1bWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0bGluZXMucHVzaChcIiAgICB2b2x1bWVzOlwiKTtcblx0XHRcdFx0Zm9yIChjb25zdCB2IG9mIHN2Yy52b2x1bWVzKSBsaW5lcy5wdXNoKGAgICAgICAtICR7dn1gKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHN2Yy5uZXR3b3JrcyAmJiBzdmMubmV0d29ya3MubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRjb25zdCBvbmx5U3RyaW5ncyA9IHN2Yy5uZXR3b3Jrcy5ldmVyeSgobikgPT4gdHlwZW9mIG4gPT09IFwic3RyaW5nXCIpO1xuXHRcdFx0XHRpZiAob25seVN0cmluZ3MpIHtcblx0XHRcdFx0XHRsaW5lcy5wdXNoKFwiICAgIG5ldHdvcmtzOlwiKTtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IG4gb2Ygc3ZjLm5ldHdvcmtzKSBsaW5lcy5wdXNoKGAgICAgICAtICR7biBhcyBzdHJpbmd9YCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bGluZXMucHVzaChcIiAgICBuZXR3b3JrczpcIik7XG5cdFx0XHRcdFx0Zm9yIChjb25zdCBuIG9mIHN2Yy5uZXR3b3Jrcykge1xuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZiBuID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdFx0XHRcdGxpbmVzLnB1c2goYCAgICAgICR7bn06YCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IFtuZXRLZXksIGNmZ10gb2YgT2JqZWN0LmVudHJpZXMobikpIHtcblx0XHRcdFx0XHRcdFx0XHRsaW5lcy5wdXNoKGAgICAgICAke25ldEtleX06YCk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGNmZy5hbGlhc2VzICYmIGNmZy5hbGlhc2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGxpbmVzLnB1c2goXCIgICAgICAgIGFsaWFzZXM6XCIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBhIG9mIGNmZy5hbGlhc2VzKSBsaW5lcy5wdXNoKGAgICAgICAgICAgLSAke2F9YCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzdmMuZGVwZW5kc19vbiAmJiBzdmMuZGVwZW5kc19vbi5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGxpbmVzLnB1c2goXCIgICAgZGVwZW5kc19vbjpcIik7XG5cdFx0XHRcdGZvciAoY29uc3QgZCBvZiBzdmMuZGVwZW5kc19vbikgbGluZXMucHVzaChgICAgICAgLSAke2R9YCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzdmMuaGVhbHRoY2hlY2spIHtcblx0XHRcdFx0Y29uc3QgaGMgPSBzdmMuaGVhbHRoY2hlY2s7XG5cdFx0XHRcdGxpbmVzLnB1c2goXCIgICAgaGVhbHRoY2hlY2s6XCIpO1xuXHRcdFx0XHRsaW5lcy5wdXNoKGAgICAgICB0ZXN0OiAke0pTT04uc3RyaW5naWZ5KGhjLnRlc3QpfWApO1xuXHRcdFx0XHRpZiAoaGMuaW50ZXJ2YWwpIGxpbmVzLnB1c2goYCAgICAgIGludGVydmFsOiAke2hjLmludGVydmFsfWApO1xuXHRcdFx0XHRpZiAoaGMudGltZW91dCkgbGluZXMucHVzaChgICAgICAgdGltZW91dDogJHtoYy50aW1lb3V0fWApO1xuXHRcdFx0XHRpZiAoaGMucmV0cmllcyAhPSBudWxsKSBsaW5lcy5wdXNoKGAgICAgICByZXRyaWVzOiAke2hjLnJldHJpZXN9YCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuX25ldHdvcmtzLnNpemUgPiAwKSB7XG5cdFx0XHRsaW5lcy5wdXNoKFwiXCIpO1xuXHRcdFx0bGluZXMucHVzaChcIm5ldHdvcmtzOlwiKTtcblx0XHRcdGZvciAoY29uc3QgW2tleSwgbmV0XSBvZiB0aGlzLl9uZXR3b3Jrcykge1xuXHRcdFx0XHRsaW5lcy5wdXNoKGAgICR7a2V5fTpgKTtcblx0XHRcdFx0bGluZXMucHVzaChgICAgIG5hbWU6ICR7bmV0Lm5hbWV9YCk7XG5cdFx0XHRcdGlmIChuZXQuZXh0ZXJuYWwpIGxpbmVzLnB1c2goXCIgICAgZXh0ZXJuYWw6IHRydWVcIik7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuX3ZvbHVtZXMuc2l6ZSA+IDApIHtcblx0XHRcdGxpbmVzLnB1c2goXCJcIik7XG5cdFx0XHRsaW5lcy5wdXNoKFwidm9sdW1lczpcIik7XG5cdFx0XHRmb3IgKGNvbnN0IHYgb2YgdGhpcy5fdm9sdW1lcykgbGluZXMucHVzaChgICAke3Z9OmApO1xuXHRcdH1cblxuXHRcdHJldHVybiBgJHtsaW5lcy5qb2luKFwiXFxuXCIpfVxcbmA7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJXRUxMX0tOT1dOX0ZJTEVTIiwiRG9ja2VyQ29tcG9zZSIsImtleSIsIkRPQ0tFUl9DT01QT1NFIiwiX3Byb2plY3ROYW1lIiwiX3NlcnZpY2VzIiwiTWFwIiwiX3ZvbHVtZXMiLCJTZXQiLCJfbmV0d29ya3MiLCJzZXRQcm9qZWN0TmFtZSIsIm5hbWUiLCJhZGRTZXJ2aWNlIiwiY29uZmlnIiwic2V0IiwiZmlsZXMiLCJmaWxlUGF0aCIsImNvbnRlbnQiLCJnZXRDb250ZW50IiwiYWRkVm9sdW1lIiwiYWRkIiwiYWRkTmV0d29yayIsIm5ldHdvcmsiLCJhZGRFbnZGaWxlIiwic2VydmljZU5hbWUiLCJzdmMiLCJnZXQiLCJlbnZfZmlsZSIsImxpbmVzIiwicHVzaCIsImJ1aWxkIiwiaW1hZ2UiLCJjb250YWluZXJfbmFtZSIsImNvbW1hbmQiLCJyZXN0YXJ0IiwibGVuZ3RoIiwiZiIsImVudmlyb25tZW50IiwiT2JqZWN0Iiwia2V5cyIsImsiLCJ2IiwiZW50cmllcyIsInBvcnRzIiwicCIsInZvbHVtZXMiLCJuZXR3b3JrcyIsIm9ubHlTdHJpbmdzIiwiZXZlcnkiLCJuIiwibmV0S2V5IiwiY2ZnIiwiYWxpYXNlcyIsImEiLCJkZXBlbmRzX29uIiwiZCIsImhlYWx0aGNoZWNrIiwiaGMiLCJKU09OIiwic3RyaW5naWZ5IiwidGVzdCIsImludGVydmFsIiwidGltZW91dCIsInJldHJpZXMiLCJzaXplIiwibmV0IiwiZXh0ZXJuYWwiLCJqb2luIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxnQkFBZ0IsUUFBUSxhQUFhO0FBdUM5Qzs7OztDQUlDLEdBQ0QsT0FBTyxNQUFNQztJQUNJQyxNQUFNRixpQkFBaUJHLGNBQWMsQ0FBQztJQUM5Q0MsYUFBaUM7SUFDeEJDLFlBQXlDLElBQUlDLE1BQU07SUFDbkRDLFdBQXdCLElBQUlDLE1BQU07SUFDbENDLFlBQXlDLElBQUlILE1BQU07SUFFcEUsNEVBQTRFLEdBQzVFLEFBQU9JLGVBQWVDLElBQVksRUFBUTtRQUN6QyxJQUFJLENBQUNQLFlBQVksR0FBR087UUFDcEIsT0FBTyxJQUFJO0lBQ1o7SUFFT0MsV0FBV0QsSUFBWSxFQUFFRSxNQUFzQixFQUFRO1FBQzdELElBQUksQ0FBQ1IsU0FBUyxDQUFDUyxHQUFHLENBQUNILE1BQU1FO1FBQ3pCLE9BQU8sSUFBSTtJQUNaO0lBRU9FLFFBQVE7UUFDZCxPQUFPO1lBQ047Z0JBQ0NDLFVBQVU7Z0JBQ1ZDLFNBQVMsSUFBSSxDQUFDQyxVQUFVO1lBQ3pCO1NBQ0E7SUFDRjtJQUVPQyxVQUFVUixJQUFZLEVBQVE7UUFDcEMsSUFBSSxDQUFDSixRQUFRLENBQUNhLEdBQUcsQ0FBQ1Q7UUFDbEIsT0FBTyxJQUFJO0lBQ1o7SUFFT1UsV0FBV25CLEdBQVcsRUFBRW9CLE9BQXVCLEVBQVE7UUFDN0QsSUFBSSxD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
132
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvbW9kZWxzL2NvbXBvc2UubW9kZWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV0VMTF9LTk9XTl9GSUxFUyB9IGZyb20gXCIuL2NvbnN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IEtleWVkTW9kZWwgfSBmcm9tIFwiLi9zb3VyY2UtZmlsZS5qc1wiO1xuXG5leHBvcnQgdHlwZSBDb21wb3NlTmV0d29ya1JlZiA9XG5cdHwgc3RyaW5nXG5cdHwge1xuXHRcdFx0LyoqIE5ldHdvcmsga2V5IHVuZGVyIGBuZXR3b3JrczpgIG9uIHRoaXMgc2VydmljZSAqL1xuXHRcdFx0W25ldHdvcmtLZXk6IHN0cmluZ106IHsgYWxpYXNlcz86IHN0cmluZ1tdIH07XG5cdCAgfTtcblxuZXhwb3J0IGludGVyZmFjZSBDb21wb3NlSGVhbHRoY2hlY2sge1xuXHR0ZXN0OiBzdHJpbmdbXTtcblx0aW50ZXJ2YWw/OiBzdHJpbmc7XG5cdHRpbWVvdXQ/OiBzdHJpbmc7XG5cdHJldHJpZXM/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9zZVNlcnZpY2Uge1xuXHRidWlsZD86IHN0cmluZztcblx0aW1hZ2U/OiBzdHJpbmc7XG5cdGNvbnRhaW5lcl9uYW1lPzogc3RyaW5nO1xuXHRlbnZfZmlsZT86IHN0cmluZ1tdO1xuXHRlbnZpcm9ubWVudD86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cdHBvcnRzPzogc3RyaW5nW107XG5cdHZvbHVtZXM/OiBzdHJpbmdbXTtcblx0Y29tbWFuZD86IHN0cmluZztcblx0cmVzdGFydD86IHN0cmluZztcblx0ZGVwZW5kc19vbj86IHN0cmluZ1tdO1xuXHQvKiogQ29tcG9zZSBwcm9maWxlcyAoc2VydmljZSBvbmx5IHN0YXJ0cyB3aGVuIHByb2ZpbGUgaXMgZW5hYmxlZCkuICovXG5cdHByb2ZpbGVzPzogc3RyaW5nW107XG5cdC8qKiBBdHRhY2ggdG8gY29tcG9zZSBuZXR3b3JrcyAoc3RyaW5nIG5hbWUgb3IgbWFwIHdpdGggYWxpYXNlcykuICovXG5cdG5ldHdvcmtzPzogQ29tcG9zZU5ldHdvcmtSZWZbXTtcblx0aGVhbHRoY2hlY2s/OiBDb21wb3NlSGVhbHRoY2hlY2s7XG59XG5cbmV4cG9ydCB0eXBlIENvbXBvc2VOZXR3b3JrID0ge1xuXHQvKiogRml4ZWQgRG9ja2VyIG5ldHdvcmsgbmFtZSAoc2hhcmVhYmxlIGFjcm9zcyBjb21wb3NlIHByb2plY3RzKS4gKi9cblx0bmFtZTogc3RyaW5nO1xuXHRleHRlcm5hbD86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIExpdmUgYnVpbGRlciBmb3IgYGRvY2tlci1jb21wb3NlLnltbGAuXG4gKlxuICogRmVhdHVyZXMgY2FsbCBgYWRkU2VydmljZWAgLyBgYWRkVm9sdW1lYCAvIGBhZGROZXR3b3JrYCBpbiB0aGVpciBzY2FmZm9sZCBwaGFzZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBEb2NrZXJDb21wb3NlIGltcGxlbWVudHMgS2V5ZWRNb2RlbCB7XG5cdHB1YmxpYyByZWFkb25seSBrZXkgPSBXRUxMX0tOT1dOX0ZJTEVTLkRPQ0tFUl9DT01QT1NFO1xuXHRwcml2YXRlIF9wcm9qZWN0TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRwcml2YXRlIHJlYWRvbmx5IF9zZXJ2aWNlczogTWFwPHN0cmluZywgQ29tcG9zZVNlcnZpY2U+ID0gbmV3IE1hcCgpO1xuXHRwcml2YXRlIHJlYWRvbmx5IF92b2x1bWVzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblx0cHJpdmF0ZSByZWFkb25seSBfbmV0d29ya3M6IE1hcDxzdHJpbmcsIENvbXBvc2VOZXR3b3JrPiA9IG5ldyBNYXAoKTtcblxuXHQvKiogQ29tcG9zZSBwcm9qZWN0IG5hbWUgKGBuYW1lOmAgdG9wLWxldmVsKSDigJQgaXNvbGF0ZXMgY29udGFpbmVycy92b2x1bWVzLiAqL1xuXHRwdWJsaWMgc2V0UHJvamVjdE5hbWUobmFtZTogc3RyaW5nKTogdGhpcyB7XG5cdFx0dGhpcy5fcHJvamVjdE5hbWUgPSBuYW1lO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIGFkZFNlcnZpY2UobmFtZTogc3RyaW5nLCBjb25maWc6IENvbXBvc2VTZXJ2aWNlKTogdGhpcyB7XG5cdFx0dGhpcy5fc2VydmljZXMuc2V0KG5hbWUsIGNvbmZpZyk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgZmlsZXMoKSB7XG5cdFx0cmV0dXJuIFtcblx0XHRcdHtcblx0XHRcdFx0ZmlsZVBhdGg6IFwiLmRldmNvbnRhaW5lci9kb2NrZXItY29tcG9zZS55bWxcIixcblx0XHRcdFx0Y29udGVudDogdGhpcy5nZXRDb250ZW50KCksXG5cdFx0XHR9LFxuXHRcdF07XG5cdH1cblxuXHRwdWJsaWMgYWRkVm9sdW1lKG5hbWU6IHN0cmluZyk6IHRoaXMge1xuXHRcdHRoaXMuX3ZvbHVtZXMuYWRkKG5hbWUpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIGFkZE5ldHdvcmsoa2V5OiBzdHJpbmcsIG5ldHdvcms6IENvbXBvc2VOZXR3b3JrKTogdGhpcyB7XG5cdFx0dGhpcy5fbmV0d29ya3Muc2V0KGtleSwgbmV0d29yayk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKiogQXBwZW5kIGFuIGVudl9maWxlIHBhdGggdG8gYW4gZXhpc3Rpbmcgc2VydmljZS4gKi9cblx0cHVibGljIGFkZEVudkZpbGUoc2VydmljZU5hbWU6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZyk6IHRoaXMge1xuXHRcdGNvbnN0IHN2YyA9IHRoaXMuX3NlcnZpY2VzLmdldChzZXJ2aWNlTmFtZSk7XG5cdFx0aWYgKHN2Yykgc3ZjLmVudl9maWxlID0gWy4uLihzdmMuZW52X2ZpbGUgPz8gW10pLCBmaWxlUGF0aF07XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgZ2V0Q29udGVudCgpOiBzdHJpbmcge1xuXHRcdGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGlmICh0aGlzLl9wcm9qZWN0TmFtZSkge1xuXHRcdFx0bGluZXMucHVzaChgbmFtZTogJHt0aGlzLl9wcm9qZWN0TmFtZX1gLCBcIlwiKTtcblx0XHR9XG5cdFx0bGluZXMucHVzaChcInNlcnZpY2VzOlwiKTtcblxuXHRcdGZvciAoY29uc3QgW25hbWUsIHN2Y10gb2YgdGhpcy5fc2VydmljZXMpIHtcblx0XHRcdGxpbmVzLnB1c2goYCAgJHtuYW1lfTpgKTtcblx0XHRcdGlmIChzdmMuYnVpbGQpIGxpbmVzLnB1c2goYCAgICBidWlsZDogJHtzdmMuYnVpbGR9YCk7XG5cdFx0XHRpZiAoc3ZjLmltYWdlKSBsaW5lcy5wdXNoKGAgICAgaW1hZ2U6ICR7c3ZjLmltYWdlfWApO1xuXHRcdFx0aWYgKHN2Yy5jb250YWluZXJfbmFtZSkgbGluZXMucHVzaChgICAgIGNvbnRhaW5lcl9uYW1lOiAke3N2Yy5jb250YWluZXJfbmFtZX1gKTtcblx0XHRcdGlmIChzdmMuY29tbWFuZCkgbGluZXMucHVzaChgICAgIGNvbW1hbmQ6ICR7c3ZjLmNvbW1hbmR9YCk7XG5cdFx0XHRpZiAoc3ZjLnJlc3RhcnQpIGxpbmVzLnB1c2goYCAgICByZXN0YXJ0OiAke3N2Yy5yZXN0YXJ0fWApO1xuXG5cdFx0XHRpZiAoc3ZjLnByb2ZpbGVzICYmIHN2Yy5wcm9maWxlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGxpbmVzLnB1c2goXCIgICAgcHJvZmlsZXM6XCIpO1xuXHRcdFx0XHRmb3IgKGNvbnN0IHAgb2Ygc3ZjLnByb2ZpbGVzKSBsaW5lcy5wdXNoKGAgICAgICAtICR7cH1gKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHN2Yy5lbnZfZmlsZSAmJiBzdmMuZW52X2ZpbGUubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRsaW5lcy5wdXNoKFwiICAgIGVudl9maWxlOlwiKTtcblx0XHRcdFx0Zm9yIChjb25zdCBmIG9mIHN2Yy5lbnZfZmlsZSkgbGluZXMucHVzaChgICAgICAgLSAke2Z9YCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzdmMuZW52aXJvbm1lbnQgJiYgT2JqZWN0LmtleXMoc3ZjLmVudmlyb25tZW50KS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGxpbmVzLnB1c2goXCIgICAgZW52aXJvbm1lbnQ6XCIpO1xuXHRcdFx0XHRmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhzdmMuZW52aXJvbm1lbnQpKSB7XG5cdFx0XHRcdFx0bGluZXMucHVzaChgICAgICAgJHtrfTogJHt2fWApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzdmMucG9ydHMgJiYgc3ZjLnBvcnRzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0bGluZXMucHVzaChcIiAgICBwb3J0czpcIik7XG5cdFx0XHRcdGZvciAoY29uc3QgcCBvZiBzdmMucG9ydHMpIGxpbmVzLnB1c2goYCAgICAgIC0gXCIke3B9XCJgKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHN2Yy52b2x1bWVzICYmIHN2Yy52b2x1bWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0bGluZXMucHVzaChcIiAgICB2b2x1bWVzOlwiKTtcblx0XHRcdFx0Zm9yIChjb25zdCB2IG9mIHN2Yy52b2x1bWVzKSBsaW5lcy5wdXNoKGAgICAgICAtICR7dn1gKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHN2Yy5uZXR3b3JrcyAmJiBzdmMubmV0d29ya3MubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRjb25zdCBvbmx5U3RyaW5ncyA9IHN2Yy5uZXR3b3Jrcy5ldmVyeSgobikgPT4gdHlwZW9mIG4gPT09IFwic3RyaW5nXCIpO1xuXHRcdFx0XHRpZiAob25seVN0cmluZ3MpIHtcblx0XHRcdFx0XHRsaW5lcy5wdXNoKFwiICAgIG5ldHdvcmtzOlwiKTtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IG4gb2Ygc3ZjLm5ldHdvcmtzKSBsaW5lcy5wdXNoKGAgICAgICAtICR7biBhcyBzdHJpbmd9YCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bGluZXMucHVzaChcIiAgICBuZXR3b3JrczpcIik7XG5cdFx0XHRcdFx0Zm9yIChjb25zdCBuIG9mIHN2Yy5uZXR3b3Jrcykge1xuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZiBuID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdFx0XHRcdGxpbmVzLnB1c2goYCAgICAgICR7bn06YCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IFtuZXRLZXksIGNmZ10gb2YgT2JqZWN0LmVudHJpZXMobikpIHtcblx0XHRcdFx0XHRcdFx0XHRsaW5lcy5wdXNoKGAgICAgICAke25ldEtleX06YCk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGNmZy5hbGlhc2VzICYmIGNmZy5hbGlhc2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGxpbmVzLnB1c2goXCIgICAgICAgIGFsaWFzZXM6XCIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBhIG9mIGNmZy5hbGlhc2VzKSBsaW5lcy5wdXNoKGAgICAgICAgICAgLSAke2F9YCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzdmMuZGVwZW5kc19vbiAmJiBzdmMuZGVwZW5kc19vbi5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGxpbmVzLnB1c2goXCIgICAgZGVwZW5kc19vbjpcIik7XG5cdFx0XHRcdGZvciAoY29uc3QgZCBvZiBzdmMuZGVwZW5kc19vbikgbGluZXMucHVzaChgICAgICAgLSAke2R9YCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzdmMuaGVhbHRoY2hlY2spIHtcblx0XHRcdFx0Y29uc3QgaGMgPSBzdmMuaGVhbHRoY2hlY2s7XG5cdFx0XHRcdGxpbmVzLnB1c2goXCIgICAgaGVhbHRoY2hlY2s6XCIpO1xuXHRcdFx0XHRsaW5lcy5wdXNoKGAgICAgICB0ZXN0OiAke0pTT04uc3RyaW5naWZ5KGhjLnRlc3QpfWApO1xuXHRcdFx0XHRpZiAoaGMuaW50ZXJ2YWwpIGxpbmVzLnB1c2goYCAgICAgIGludGVydmFsOiAke2hjLmludGVydmFsfWApO1xuXHRcdFx0XHRpZiAoaGMudGltZW91dCkgbGluZXMucHVzaChgICAgICAgdGltZW91dDogJHtoYy50aW1lb3V0fWApO1xuXHRcdFx0XHRpZiAoaGMucmV0cmllcyAhPSBudWxsKSBsaW5lcy5wdXNoKGAgICAgICByZXRyaWVzOiAke2hjLnJldHJpZXN9YCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuX25ldHdvcmtzLnNpemUgPiAwKSB7XG5cdFx0XHRsaW5lcy5wdXNoKFwiXCIpO1xuXHRcdFx0bGluZXMucHVzaChcIm5ldHdvcmtzOlwiKTtcblx0XHRcdGZvciAoY29uc3QgW2tleSwgbmV0XSBvZiB0aGlzLl9uZXR3b3Jrcykge1xuXHRcdFx0XHRsaW5lcy5wdXNoKGAgICR7a2V5fTpgKTtcblx0XHRcdFx0bGluZXMucHVzaChgICAgIG5hbWU6ICR7bmV0Lm5hbWV9YCk7XG5cdFx0XHRcdGlmIChuZXQuZXh0ZXJuYWwpIGxpbmVzLnB1c2goXCIgICAgZXh0ZXJuYWw6IHRydWVcIik7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuX3ZvbHVtZXMuc2l6ZSA+IDApIHtcblx0XHRcdGxpbmVzLnB1c2goXCJcIik7XG5cdFx0XHRsaW5lcy5wdXNoKFwidm9sdW1lczpcIik7XG5cdFx0XHRmb3IgKGNvbnN0IHYgb2YgdGhpcy5fdm9sdW1lcykgbGluZXMucHVzaChgICAke3Z9OmApO1xuXHRcdH1cblxuXHRcdHJldHVybiBgJHtsaW5lcy5qb2luKFwiXFxuXCIpfVxcbmA7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJXRUxMX0tOT1dOX0ZJTEVTIiwiRG9ja2VyQ29tcG9zZSIsImtleSIsIkRPQ0tFUl9DT01QT1NFIiwiX3Byb2plY3ROYW1lIiwiX3NlcnZpY2VzIiwiTWFwIiwiX3ZvbHVtZXMiLCJTZXQiLCJfbmV0d29ya3MiLCJzZXRQcm9qZWN0TmFtZSIsIm5hbWUiLCJhZGRTZXJ2aWNlIiwiY29uZmlnIiwic2V0IiwiZmlsZXMiLCJmaWxlUGF0aCIsImNvbnRlbnQiLCJnZXRDb250ZW50IiwiYWRkVm9sdW1lIiwiYWRkIiwiYWRkTmV0d29yayIsIm5ldHdvcmsiLCJhZGRFbnZGaWxlIiwic2VydmljZU5hbWUiLCJzdmMiLCJnZXQiLCJlbnZfZmlsZSIsImxpbmVzIiwicHVzaCIsImJ1aWxkIiwiaW1hZ2UiLCJjb250YWluZXJfbmFtZSIsImNvbW1hbmQiLCJyZXN0YXJ0IiwicHJvZmlsZXMiLCJsZW5ndGgiLCJwIiwiZiIsImVudmlyb25tZW50IiwiT2JqZWN0Iiwia2V5cyIsImsiLCJ2IiwiZW50cmllcyIsInBvcnRzIiwidm9sdW1lcyIsIm5ldHdvcmtzIiwib25seVN0cmluZ3MiLCJldmVyeSIsIm4iLCJuZXRLZXkiLCJjZmciLCJhbGlhc2VzIiwiYSIsImRlcGVuZHNfb24iLCJkIiwiaGVhbHRoY2hlY2siLCJoYyIsIkpTT04iLCJzdHJpbmdpZnkiLCJ0ZXN0IiwiaW50ZXJ2YWwiLCJ0aW1lb3V0IiwicmV0cmllcyIsInNpemUiLCJuZXQiLCJleHRlcm5hbCIsImpvaW4iXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLGdCQUFnQixRQUFRLGFBQWE7QUF5QzlDOzs7O0NBSUMsR0FDRCxPQUFPLE1BQU1DO0lBQ0lDLE1BQU1GLGlCQUFpQkcsY0FBYyxDQUFDO0lBQzlDQyxhQUFpQztJQUN4QkMsWUFBeUMsSUFBSUMsTUFBTTtJQUNuREMsV0FBd0IsSUFBSUMsTUFBTTtJQUNsQ0MsWUFBeUMsSUFBSUgsTUFBTTtJQUVwRSw0RUFBNEUsR0FDNUUsQUFBT0ksZUFBZUMsSUFBWSxFQUFRO1FBQ3pDLElBQUksQ0FBQ1AsWUFBWSxHQUFHTztRQUNwQixPQUFPLElBQUk7SUFDWjtJQUVPQyxXQUFXRCxJQUFZLEVBQUVFLE1BQXNCLEVB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
@@ -15,8 +15,23 @@ import { WEBAPI_PROJECT_DIR } from "../create-api.js";
15
15
  return undefined;
16
16
  }
17
17
  }
18
- // Base config uses env-var references for production; the dev config section
19
- // written below overrides only the concrete values needed locally.
18
+ function randomPassword() {
19
+ return randomBytes(16).toString("hex");
20
+ }
21
+ /** Safe Postgres identifier fragment from the project name. */ function toSqlIdentFragment(name) {
22
+ const cleaned = name.replace(/[^A-Za-z0-9_]/g, "_").replace(/^([^A-Za-z_])/, "p_$1");
23
+ return cleaned.length > 0 ? cleaned.slice(0, 40) : "app";
24
+ }
25
+ function passwordOrExisting(workspace, key, fallbackExistingKeys = []) {
26
+ const existing = readExistingEnvValue(workspace, key);
27
+ if (existing) return existing;
28
+ for (const alt of fallbackExistingKeys){
29
+ const v = readExistingEnvValue(workspace, alt);
30
+ if (v) return v;
31
+ }
32
+ return randomPassword();
33
+ }
34
+ // Production base: runtime app role only — no bootstrap, no admin/migrate secrets required.
20
35
  const DATABASE_BASE_CONFIG_YAML = `database:
21
36
  dataSources:
22
37
  - name: default
@@ -28,15 +43,43 @@ const DATABASE_BASE_CONFIG_YAML = `database:
28
43
  password: \${DB_PASSWORD}
29
44
  synchronize: false
30
45
  seed: false
31
- adminUser: \${DB_ADMIN_USER}
32
- adminPassword: \${DB_ADMIN_PASSWORD}
46
+ bootstrap: false
33
47
  `;
34
- // Dev config only overrides what differs from base — credentials come from .env via env-var references.
35
- // Host comes from DB_HOST in .env (postgres on the compose network; 127.0.0.1 from the host).
48
+ // Dev: enable bootstrap + migrate role; synchronize uses app DDL (dev-only exception).
36
49
  const DATABASE_DEV_CONFIG_YAML = `database:
37
50
  dataSources:
38
51
  - synchronize: true
39
52
  seed: true
53
+ bootstrap: true
54
+ adminUser: \${DB_ADMIN_USER}
55
+ adminPassword: \${DB_ADMIN_PASSWORD}
56
+ migrateUsername: \${DB_MIGRATE_USER}
57
+ migratePassword: \${DB_MIGRATE_PASSWORD}
58
+ `;
59
+ /** Runs once on first Postgres volume init — creates restricted bootstrap role (not superuser). */ const POSTGRES_INIT_BOOTSTRAP_SH = `#!/bin/bash
60
+ set -euo pipefail
61
+ # Container superuser (POSTGRES_USER) creates a restricted provisioner role.
62
+ # App/migrate roles are created later by codex-typeorm prepareDatabase (dev bootstrap).
63
+ : "\${DB_ADMIN_USER:?DB_ADMIN_USER is required}"
64
+ : "\${DB_ADMIN_PASSWORD:?DB_ADMIN_PASSWORD is required}"
65
+
66
+ psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" \\
67
+ \t--set=bootstrap_user="$DB_ADMIN_USER" \\
68
+ \t--set=bootstrap_password="$DB_ADMIN_PASSWORD" <<'EOSQL'
69
+ SELECT format(
70
+ \t'CREATE ROLE %I LOGIN PASSWORD %L CREATEDB CREATEROLE NOSUPERUSER NOBYPASSRLS',
71
+ \t:'bootstrap_user',
72
+ \t:'bootstrap_password'
73
+ )
74
+ WHERE NOT EXISTS (
75
+ \tSELECT 1 FROM pg_catalog.pg_roles WHERE rolname = :'bootstrap_user'
76
+ )\\gexec
77
+
78
+ GRANT ALL ON SCHEMA public TO :"bootstrap_user";
79
+ EOSQL
80
+
81
+ psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" \\
82
+ \t-c "GRANT ALL PRIVILEGES ON DATABASE \\"$POSTGRES_DB\\" TO \\"$DB_ADMIN_USER\\""
40
83
  `;
41
84
  const SAMPLE_ENTITY_TS = `import { Column, Entity, PrimaryGeneratedColumn } from "typeorm";
42
85
  import type { Entity as IEntity } from "@decohere/codex";
@@ -80,13 +123,19 @@ async function getOptions(_workspace, cliOptions) {
80
123
  function scaffold(workspace, options) {
81
124
  if (options.databaseProvider !== "postgres/typeorm") return;
82
125
  const name = workspace.name;
83
- // Prefer an existing POSTGRES_PASSWORD so re-scaffold does not rotate credentials
84
- // out from under an already-initialized Docker volume (Postgres only applies
85
- // POSTGRES_PASSWORD on first data-dir init).
86
- const existingPassword = readExistingEnvValue(workspace, "POSTGRES_PASSWORD");
87
- const password = existingPassword || randomBytes(16).toString("hex");
88
- const db = `${name}_dev`;
89
- const user = "postgres";
126
+ const ident = toSqlIdentFragment(name);
127
+ const db = `${ident}_dev`;
128
+ // Container init superuser — never reused as the API runtime role.
129
+ const postgresSuperuser = "postgres";
130
+ const postgresPassword = passwordOrExisting(workspace, "POSTGRES_PASSWORD");
131
+ const bootstrapUser = "decohere_bootstrap";
132
+ const bootstrapPassword = passwordOrExisting(workspace, "DB_ADMIN_PASSWORD", [
133
+ "POSTGRES_PASSWORD"
134
+ ]);
135
+ const appUser = `${ident}_app`;
136
+ const appPassword = passwordOrExisting(workspace, "DB_PASSWORD");
137
+ const migrateUser = `${ident}_migrate`;
138
+ const migratePassword = passwordOrExisting(workspace, "DB_MIGRATE_PASSWORD");
90
139
  const devContainer = workspace.getModel(WELL_KNOWN_FILES.DEVCONTAINER_JSON);
91
140
  const compose = workspace.getModel(WELL_KNOWN_FILES.DOCKER_COMPOSE);
92
141
  const networkKey = name;
@@ -97,12 +146,14 @@ function scaffold(workspace, options) {
97
146
  image: "postgres:16",
98
147
  container_name: `samples-${name}-postgres`,
99
148
  restart: "unless-stopped",
149
+ // Loopback-only: avoid exposing Postgres on LAN/public interfaces.
100
150
  // Host 5433 avoids clashing with a local/other Postgres on 5432.
101
151
  ports: [
102
- "5433:5432"
152
+ "127.0.0.1:5433:5432"
103
153
  ],
104
154
  volumes: [
105
- `${volumeName}:/var/lib/postgresql/data`
155
+ `${volumeName}:/var/lib/postgresql/data`,
156
+ "../.devcontainer/postgres-init:/docker-entrypoint-initdb.d:ro"
106
157
  ],
107
158
  networks: [
108
159
  {
@@ -116,22 +167,34 @@ function scaffold(workspace, options) {
116
167
  healthcheck: {
117
168
  test: [
118
169
  "CMD-SHELL",
119
- `pg_isready -U ${user} -d ${db}`
170
+ `pg_isready -U ${postgresSuperuser} -d ${db}`
120
171
  ],
121
172
  interval: "2s",
122
173
  timeout: "5s",
123
174
  retries: 15
124
175
  }
125
176
  }).addEnvFile("postgres", "../.env").addVolume(volumeName);
177
+ // Optional DB UI — enable with: docker compose --profile tools up -d
126
178
  compose?.addService("adminer", {
127
179
  image: "adminer",
180
+ profiles: [
181
+ "tools"
182
+ ],
128
183
  ports: [
129
- "8081:8080"
184
+ "127.0.0.1:8081:8080"
130
185
  ],
131
186
  networks: [
132
187
  networkKey
133
188
  ]
134
189
  });
190
+ workspace.addFile({
191
+ files: ()=>[
192
+ {
193
+ filePath: ".devcontainer/postgres-init/01-create-bootstrap-role.sh",
194
+ content: POSTGRES_INIT_BOOTSTRAP_SH
195
+ }
196
+ ]
197
+ });
135
198
  // Add SQLTools extension for DB browsing in VS Code
136
199
  devContainer?.addExtension("mtxr.sqltools");
137
200
  // Wire up main.ts
@@ -163,11 +226,11 @@ function scaffold(workspace, options) {
163
226
  });
164
227
  // .env at workspace root — postgres reads it via env_file above; devcontainer gets it here
165
228
  compose?.addEnvFile("devcontainer", "../.env");
166
- workspace.getModel(WELL_KNOWN_FILES.ENV_FILE)?.addEntry("POSTGRES_DB", db).addEntry("POSTGRES_USER", user).addEntry("POSTGRES_PASSWORD", password).addEntry("DB_HOST", "postgres").addEntry("DB_PORT", "5432").addEntry("DB_NAME", db).addEntry("DB_USER", user).addEntry("DB_PASSWORD", password).addEntry("DB_ADMIN_USER", user).addEntry("DB_ADMIN_PASSWORD", password);
229
+ workspace.getModel(WELL_KNOWN_FILES.ENV_FILE)?.addEntry("POSTGRES_DB", db).addEntry("POSTGRES_USER", postgresSuperuser).addEntry("POSTGRES_PASSWORD", postgresPassword).addEntry("DB_HOST", "postgres").addEntry("DB_PORT", "5432").addEntry("DB_NAME", db).addEntry("DB_USER", appUser).addEntry("DB_PASSWORD", appPassword).addEntry("DB_ADMIN_USER", bootstrapUser).addEntry("DB_ADMIN_PASSWORD", bootstrapPassword).addEntry("DB_MIGRATE_USER", migrateUser).addEntry("DB_MIGRATE_PASSWORD", migratePassword);
167
230
  }
168
231
  export const DatabaseFeature = {
169
232
  getOptions,
170
233
  scaffold
171
234
  };
172
235
 
173
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL2ZlYXR1cmVzL2RhdGFiYXNlLmZlYXR1cmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tIFwibm9kZTpjcnlwdG9cIjtcbmltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgcGljayB9IGZyb20gXCIuLi8uLi9kb21haW4vcHJvbXB0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IERvY2tlckNvbXBvc2UgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbXBvc2UubW9kZWwuanNcIjtcbmltcG9ydCB0eXBlIHsgQ29uZmlnWWFtbCB9IGZyb20gXCIuLi8uLi9tb2RlbHMvY29uZmlnLXlhbWwubW9kZWwuanNcIjtcbmltcG9ydCB7IFdFTExfS05PV05fRklMRVMgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbnN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IERldkNvbnRhaW5lciB9IGZyb20gXCIuLi8uLi9tb2RlbHMvZGV2LWNvbnRhaW5lci5tb2RlbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBFbnZGaWxlIH0gZnJvbSBcIi4uLy4uL21vZGVscy9lbnYtZmlsZS5tb2RlbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gXCIuLi8uLi9tb2RlbHMvcGFja2FnZS1qc29uLm1vZGVsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtzcGFjZVNjYWZmb2xkIH0gZnJvbSBcIi4uLy4uL21vZGVscy9wcm9qZWN0Lm1vZGVsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEZlYXR1cmUgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvc2NhZmZvbGQuc2VydmljZS5qc1wiO1xuaW1wb3J0IHsgQ1JFQVRFX1ZFUlNJT04gfSBmcm9tIFwiLi4vLi4vdmVyc2lvbi5qc1wiO1xuaW1wb3J0IHsgV0VCQVBJX1BST0pFQ1RfRElSIH0gZnJvbSBcIi4uL2NyZWF0ZS1hcGkuanNcIjtcbmltcG9ydCB0eXBlIHsgQXBpUGFja2FnZUpzb24gfSBmcm9tIFwiLi4vbW9kZWxzL2FwaS1wYWNrYWdlLWpzb24ubW9kZWwuanNcIjtcbmltcG9ydCB0eXBlIHsgTWFpblNvdXJjZUZpbGUgfSBmcm9tIFwiLi4vbW9kZWxzL21haW4tc291cmNlLWZpbGUubW9kZWwuanNcIjtcblxuZXhwb3J0IHR5cGUgRGF0YWJhc2VPcHRpb25zID0ge1xuXHRkYXRhYmFzZVByb3ZpZGVyPzogXCJub25lXCIgfCBcInBvc3RncmVzL3R5cGVvcm1cIjtcbn07XG5cbi8qKiBSZWFkIGEgc2luZ2xlIEtFWT0gZnJvbSBhbiBleGlzdGluZyB0YXJnZXQgYC5lbnZgIChpZiBhbnkpLiAqL1xuZnVuY3Rpb24gcmVhZEV4aXN0aW5nRW52VmFsdWUod29ya3NwYWNlOiBXb3Jrc3BhY2VTY2FmZm9sZCwga2V5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHR0cnkge1xuXHRcdGNvbnN0IHJhdyA9IHJlYWRGaWxlU3luYyhqb2luKHdvcmtzcGFjZS50YXJnZXREaXIsIFwiLmVudlwiKSwgXCJ1dGY4XCIpO1xuXHRcdGNvbnN0IGxpbmUgPSByYXcuc3BsaXQoXCJcXG5cIikuZmluZCgobCkgPT4gbC5zdGFydHNXaXRoKGAke2tleX09YCkpO1xuXHRcdGNvbnN0IHZhbHVlID0gbGluZT8uc2xpY2Uoa2V5Lmxlbmd0aCArIDEpLnRyaW0oKTtcblx0XHRyZXR1cm4gdmFsdWUgfHwgdW5kZWZpbmVkO1xuXHR9IGNhdGNoIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG59XG5cbi8vIEJhc2UgY29uZmlnIHVzZXMgZW52LXZhciByZWZlcmVuY2VzIGZvciBwcm9kdWN0aW9uOyB0aGUgZGV2IGNvbmZpZyBzZWN0aW9uXG4vLyB3cml0dGVuIGJlbG93IG92ZXJyaWRlcyBvbmx5IHRoZSBjb25jcmV0ZSB2YWx1ZXMgbmVlZGVkIGxvY2FsbHkuXG5jb25zdCBEQVRBQkFTRV9CQVNFX0NPTkZJR19ZQU1MID0gYGRhdGFiYXNlOlxuICBkYXRhU291cmNlczpcbiAgICAtIG5hbWU6IGRlZmF1bHRcbiAgICAgIHByb3ZpZGVyOiBwb3N0Z3Jlc1xuICAgICAgaG9zdDogXFwke0RCX0hPU1R9XG4gICAgICBwb3J0OiBcXCR7REJfUE9SVH1cbiAgICAgIGRhdGFiYXNlOiBcXCR7REJfTkFNRX1cbiAgICAgIHVzZXJuYW1lOiBcXCR7REJfVVNFUn1cbiAgICAgIHBhc3N3b3JkOiBcXCR7REJfUEFTU1dPUkR9XG4gICAgICBzeW5jaHJvbml6ZTogZmFsc2VcbiAgICAgIHNlZWQ6IGZhbHNlXG4gICAgICBhZG1pblVzZXI6IFxcJHtEQl9BRE1JTl9VU0VSfVxuICAgICAgYWRtaW5QYXNzd29yZDogXFwke0RCX0FETUlOX1BBU1NXT1JEfVxuYDtcblxuLy8gRGV2IGNvbmZpZyBvbmx5IG92ZXJyaWRlcyB3aGF0IGRpZmZlcnMgZnJvbSBiYXNlIOKAlCBjcmVkZW50aWFscyBjb21lIGZyb20gLmVudiB2aWEgZW52LXZhciByZWZlcmVuY2VzLlxuLy8gSG9zdCBjb21lcyBmcm9tIERCX0hPU1QgaW4gLmVudiAocG9zdGdyZXMgb24gdGhlIGNvbXBvc2UgbmV0d29yazsgMTI3LjAuMC4xIGZyb20gdGhlIGhvc3QpLlxuY29uc3QgREFUQUJBU0VfREVWX0NPTkZJR19ZQU1MID0gYGRhdGFiYXNlOlxuICBkYXRhU291cmNlczpcbiAgICAtIHN5bmNocm9uaXplOiB0cnVlXG4gICAgICBzZWVkOiB0cnVlXG5gO1xuXG5jb25zdCBTQU1QTEVfRU5USVRZX1RTID0gYGltcG9ydCB7IENvbHVtbiwgRW50aXR5LCBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uIH0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB0eXBlIHsgRW50aXR5IGFzIElFbnRpdHkgfSBmcm9tIFwiQGRlY29oZXJlL2NvZGV4XCI7XG5cbkBFbnRpdHkoKVxuZXhwb3J0IGNsYXNzIFNhbXBsZUVudGl0eSBpbXBsZW1lbnRzIElFbnRpdHkge1xuXFx0QFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oKVxuXFx0cHVibGljIGlkITogbnVtYmVyO1xuXG5cXHRAQ29sdW1uKClcblxcdHB1YmxpYyBuYW1lITogc3RyaW5nO1xufVxuYDtcblxuY29uc3QgU0FNUExFX1JFUE9TSVRPUllfVFMgPSBgaW1wb3J0IHsgaW5qZWN0YWJsZSB9IGZyb20gXCJAZGVjb2hlcmUvY3J1Y2libGUvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgaW5qZWN0VW5pdE9mV29yayB9IGZyb20gXCJAZGVjb2hlcmUvY29kZXhcIjtcbmltcG9ydCB7IFR5cGVPcm1SZXBvc2l0b3J5LCBUeXBlT3JtVW5pdE9mV29yayB9IGZyb20gXCJAZGVjb2hlcmUvY29kZXgtdHlwZW9ybVwiO1xuaW1wb3J0IHsgU2FtcGxlRW50aXR5IH0gZnJvbSBcIi4uL2VudGl0aWVzL3NhbXBsZS5lbnRpdHkuanNcIjtcblxuQGluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFNhbXBsZUVudGl0eVJlcG9zaXRvcnkgZXh0ZW5kcyBUeXBlT3JtUmVwb3NpdG9yeTxTYW1wbGVFbnRpdHk+IHtcblxcdHB1YmxpYyBjb25zdHJ1Y3RvcihAaW5qZWN0VW5pdE9mV29yaygpIHVuaXRPZldvcms6IFR5cGVPcm1Vbml0T2ZXb3JrKSB7XG5cXHRcXHRzdXBlcih1bml0T2ZXb3JrLCBTYW1wbGVFbnRpdHkpO1xuXFx0fVxufVxuYDtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0T3B0aW9ucyhcblx0X3dvcmtzcGFjZTogV29ya3NwYWNlU2NhZmZvbGQsXG5cdGNsaU9wdGlvbnM6IFBhcnRpYWw8RGF0YWJhc2VPcHRpb25zPixcbik6IFByb21pc2U8UGFydGlhbDxEYXRhYmFzZU9wdGlvbnM+PiB7XG5cdGlmIChjbGlPcHRpb25zLmRhdGFiYXNlUHJvdmlkZXIgIT0gbnVsbCkgcmV0dXJuIHt9O1xuXG5cdGNvbnN0IGNob2ljZXMgPSBbeyBsYWJlbDogXCJub25lXCIgYXMgY29uc3QgfSwgeyBsYWJlbDogXCJwb3N0Z3Jlcy90eXBlb3JtXCIgYXMgY29uc3QgfV07XG5cdGNvbnN0IHNlbGVjdGVkID0gYXdhaXQgcGljayhcIlxcbiAgRGF0YWJhc2U6IFwiLCBjaG9pY2VzLCAoYykgPT4gYy5sYWJlbCk7XG5cdHJldHVybiB7IGRhdGFiYXNlUHJvdmlkZXI6IHNlbGVjdGVkPy5sYWJlbCA/PyBcIm5vbmVcIiB9O1xufVxuXG5mdW5jdGlvbiBzY2FmZm9sZCh3b3Jrc3BhY2U6IFdvcmtzcGFjZVNjYWZmb2xkLCBvcHRpb25zOiBEYXRhYmFzZU9wdGlvbnMpOiB2b2lkIHtcblx0aWYgKG9wdGlvbnMuZGF0YWJhc2VQcm92aWRlciAhPT0gXCJwb3N0Z3Jlcy90eXBlb3JtXCIpIHJldHVybjtcblxuXHRjb25zdCBuYW1lID0gd29ya3NwYWNlLm5hbWU7XG5cdC8vIFByZWZlciBhbiBleGlzdGluZyBQT1NUR1JFU19QQVNTV09SRCBzbyByZS1zY2FmZm9sZCBkb2VzIG5vdCByb3RhdGUgY3JlZGVudGlhbHNcblx0Ly8gb3V0IGZyb20gdW5kZXIgYW4gYWxyZWFkeS1pbml0aWFsaXplZCBEb2NrZXIgdm9sdW1lIChQb3N0Z3JlcyBvbmx5IGFwcGxpZXNcblx0Ly8gUE9TVEdSRVNfUEFTU1dPUkQgb24gZmlyc3QgZGF0YS1kaXIgaW5pdCkuXG5cdGNvbnN0IGV4aXN0aW5nUGFzc3dvcmQgPSByZWFkRXhpc3RpbmdFbnZWYWx1ZSh3b3Jrc3BhY2UsIFwiUE9TVEdSRVNfUEFTU1dPUkRcIik7XG5cdGNvbnN0IHBhc3N3b3JkID0gZXhpc3RpbmdQYXNzd29yZCB8fCByYW5kb21CeXRlcygxNikudG9TdHJpbmcoXCJoZXhcIik7XG5cdGNvbnN0IGRiID0gYCR7bmFtZX1fZGV2YDtcblx0Y29uc3QgdXNlciA9IFwicG9zdGdyZXNcIjtcblxuXHRjb25zdCBkZXZDb250YWluZXIgPSB3b3Jrc3BhY2UuZ2V0TW9kZWw8RGV2Q29udGFpbmVyPihXRUxMX0tOT1dOX0ZJTEVTLkRFVkNPTlRBSU5FUl9KU09OKTtcblx0Y29uc3QgY29tcG9zZSA9IHdvcmtzcGFjZS5nZXRNb2RlbDxEb2NrZXJDb21wb3NlPihXRUxMX0tOT1dOX0ZJTEVTLkRPQ0tFUl9DT01QT1NFKTtcblxuXHRjb25zdCBuZXR3b3JrS2V5ID0gbmFtZTtcblx0Y29uc3Qgdm9sdW1lTmFtZSA9IGAke25hbWV9LXBvc3RncmVzLWRhdGFgO1xuXG5cdC8vIElzb2xhdGVkIGNvbXBvc2UgcHJvamVjdCBuZXR3b3JrICsgdm9sdW1lIChub3QgYXJrJ3Mgc2hhcmVkIFBvc3RncmVzKS5cblx0Ly8gQWxpYXMgYHBvc3RncmVzYCBzbyBvdGhlciBzdGFja3Mgb24gdGhlIHNhbWUgbmFtZWQgbmV0d29yayBjYW4gdXNlIERCX0hPU1Q9cG9zdGdyZXMuXG5cdGNvbXBvc2Vcblx0XHQ/LmFkZFNlcnZpY2UoXCJwb3N0Z3Jlc1wiLCB7XG5cdFx0XHRpbWFnZTogXCJwb3N0Z3JlczoxNlwiLFxuXHRcdFx0Y29udGFpbmVyX25hbWU6IGBzYW1wbGVzLSR7bmFtZX0tcG9zdGdyZXNgLFxuXHRcdFx0cmVzdGFydDogXCJ1bmxlc3Mtc3RvcHBlZFwiLFxuXHRcdFx0Ly8gSG9zdCA1NDMzIGF2b2lkcyBjbGFzaGluZyB3aXRoIGEgbG9jYWwvb3RoZXIgUG9zdGdyZXMgb24gNTQzMi5cblx0XHRcdHBvcnRzOiBbXCI1NDMzOjU0MzJcIl0sXG5cdFx0XHR2b2x1bWVzOiBbYCR7dm9sdW1lTmFtZX06L3Zhci9saWIvcG9zdGdyZXNxbC9kYXRhYF0sXG5cdFx0XHRuZXR3b3JrczogW3sgW25ldHdvcmtLZXldOiB7IGFsaWFzZXM6IFtcInBvc3RncmVzXCJdIH0gfV0sXG5cdFx0XHRoZWFsdGhjaGVjazoge1xuXHRcdFx0XHR0ZXN0OiBbXCJDTUQtU0hFTExcIiwgYHBnX2lzcmVhZHkgLVUgJHt1c2VyfSAtZCAke2RifWBdLFxuXHRcdFx0XHRpbnRlcnZhbDogXCIyc1wiLFxuXHRcdFx0XHR0aW1lb3V0OiBcIjVzXCIsXG5cdFx0XHRcdHJldHJpZXM6IDE1LFxuXHRcdFx0fSxcblx0XHR9KVxuXHRcdC5hZGRFbnZGaWxlKFwicG9zdGdyZXNcIiwgXCIuLi8uZW52XCIpXG5cdFx0LmFkZFZvbHVtZSh2b2x1bWVOYW1lKTtcblxuXHRjb21wb3NlPy5hZGRTZXJ2aWNlKFwiYWRtaW5lclwiLCB7XG5cdFx0aW1hZ2U6IFwiYWRtaW5lclwiLFxuXHRcdHBvcnRzOiBbXCI4MDgxOjgwODBcIl0sXG5cdFx0bmV0d29ya3M6IFtuZXR3b3JrS2V5XSxcblx0fSk7XG5cblx0Ly8gQWRkIFNRTFRvb2xzIGV4dGVuc2lvbiBmb3IgREIgYnJvd3NpbmcgaW4gVlMgQ29kZVxuXHRkZXZDb250YWluZXI/LmFkZEV4dGVuc2lvbihcIm10eHIuc3FsdG9vbHNcIik7XG5cblx0Ly8gV2lyZSB1cCBtYWluLnRzXG5cdHdvcmtzcGFjZVxuXHRcdC5nZXRNb2RlbDxNYWluU291cmNlRmlsZT4oV0VMTF9LTk9XTl9GSUxFUy5NQUlOX1RTKVxuXHRcdD8uYWRkU2lkZUVmZmVjdEltcG9ydChcIkBkZWNvaGVyZS9jb2RleC10eXBlb3JtXCIpXG5cdFx0LmFkZEVudGl0eSh7IGNsYXNzTmFtZTogXCJTYW1wbGVFbnRpdHlcIiwgaW1wb3J0UGF0aDogXCIuL2VudGl0aWVzL3NhbXBsZS5lbnRpdHkuanNcIiB9KVxuXHRcdC5hZGRSZXBvc2l0b3J5KHtcblx0XHRcdGNsYXNzTmFtZTogXCJTYW1wbGVFbnRpdHlSZXBvc2l0b3J5XCIsXG5cdFx0XHRpbXBvcnRQYXRoOiBcIi4vcmVwb3NpdG9yaWVzL3NhbXBsZS5yZXBvc2l0b3J5LmpzXCIsXG5cdFx0fSk7XG5cblx0d29ya3NwYWNlXG5cdFx0LmdldE1vZGVsPFBhY2thZ2VKc29uPihXRUxMX0tOT1dOX0ZJTEVTLlBBQ0tBR0VfSlNPTilcblx0XHQ/LmFkZERlcGVuZGVuY3koXCJAZGVjb2hlcmUvY29kZXhcIiwgQ1JFQVRFX1ZFUlNJT04pXG5cdFx0LmFkZERlcGVuZGVuY3koXCJ0eXBlb3JtXCIsIFwiXjAuMy4yOFwiKVxuXHRcdC5hZGREZXBlbmRlbmN5KFwiQGRlY29oZXJlL2NvZGV4LXR5cGVvcm1cIiwgQ1JFQVRFX1ZFUlNJT04pXG5cdFx0LmFkZFNjcmlwdChcImRiOnVwXCIsIFwiZG9ja2VyIGNvbXBvc2UgLWYgLmRldmNvbnRhaW5lci9kb2NrZXItY29tcG9zZS55bWwgdXAgLWQgcG9zdGdyZXNcIilcblx0XHQuYWRkU2NyaXB0KFwiZGI6ZG93blwiLCBcImRvY2tlciBjb21wb3NlIC1mIC5kZXZjb250YWluZXIvZG9ja2VyLWNvbXBvc2UueW1sIGRvd25cIilcblx0XHQuYWRkU2NyaXB0KFxuXHRcdFx0XCJkYjpyZXNldFwiLFxuXHRcdFx0XCJkb2NrZXIgY29tcG9zZSAtZiAuZGV2Y29udGFpbmVyL2RvY2tlci1jb21wb3NlLnltbCBkb3duIC12ICYmIGRvY2tlciBjb21wb3NlIC1mIC5kZXZjb250YWluZXIvZG9ja2VyLWNvbXBvc2UueW1sIHVwIC1kIHBvc3RncmVzXCIsXG5cdFx0KTtcblxuXHQvLyBBZGQgY29kZXggZGVwcyB0byBhcGkgcGFja2FnZS5qc29uXG5cdHdvcmtzcGFjZVxuXHRcdC5nZXRNb2RlbDxBcGlQYWNrYWdlSnNvbj4oV0VMTF9LTk9XTl9GSUxFUy5BUElfUEFDS0FHRV9KU09OKVxuXHRcdD8uYWRkRGVwZW5kZW5jeShcIkBkZWNvaGVyZS9jb2RleFwiLCBDUkVBVEVfVkVSU0lPTilcblx0XHQuYWRkRGVwZW5kZW5jeShcIkBkZWNvaGVyZS9jb2RleC10eXBlb3JtXCIsIENSRUFURV9WRVJTSU9OKTtcblxuXHQvLyBBcHBlbmQgZGF0YWJhc2UgY29uZmlnIHNlY3Rpb25zXG5cdHdvcmtzcGFjZVxuXHRcdC5nZXRNb2RlbDxDb25maWdZYW1sPihXRUxMX0tOT1dOX0ZJTEVTLkNPTkZJR19ZQU1MKVxuXHRcdD8uYWRkU2VjdGlvbihEQVRBQkFTRV9CQVNFX0NPTkZJR19ZQU1MKTtcblx0d29ya3NwYWNlXG5cdFx0LmdldE1vZGVsPENvbmZpZ1lhbWw+KFdFTExfS05PV05fRklMRVMuQ09ORklHX0RFVl9ZQU1MKVxuXHRcdD8uYWRkU2VjdGlvbihEQVRBQkFTRV9ERVZfQ09ORklHX1lBTUwpO1xuXG5cdC8vIFJlZ2lzdGVyIGVudGl0eSBhbmQgcmVwb3NpdG9yeSBzb3VyY2UgZmlsZXMgaW4gdGhlIGFwaSBwcm9qZWN0XG5cdHdvcmtzcGFjZS5nZXRQcm9qZWN0KFdFQkFQSV9QUk9KRUNUX0RJUik/LmFkZEZpbGUoe1xuXHRcdGZpbGVzOiAoKSA9PiBbXG5cdFx0XHR7XG5cdFx0XHRcdGZpbGVQYXRoOiBcInNyYy9lbnRpdGllcy9zYW1wbGUuZW50aXR5LnRzXCIsXG5cdFx0XHRcdGNvbnRlbnQ6IFNBTVBMRV9FTlRJVFlfVFMsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRmaWxlUGF0aDogXCJzcmMvcmVwb3NpdG9yaWVzL3NhbXBsZS5yZXBvc2l0b3J5LnRzXCIsXG5cdFx0XHRcdGNvbnRlbnQ6IFNBTVBMRV9SRVBPU0lUT1JZX1RTLFxuXHRcdFx0fSxcblx0XHRdLFxuXHR9KTtcblxuXHQvLyAuZW52IGF0IHdvcmtzcGFjZSByb290IOKAlCBwb3N0Z3JlcyByZWFkcyBpdCB2aWEgZW52X2ZpbGUgYWJvdmU7IGRldmNvbnRhaW5lciBnZXRzIGl0IGhlcmVcblx0Y29tcG9zZT8uYWRkRW52RmlsZShcImRldmNvbnRhaW5lclwiLCBcIi4uLy5lbnZcIik7XG5cblx0d29ya3NwYWNlXG5cdFx0LmdldE1vZGVsPEVudkZpbGU+KFdFTExfS05PV05fRklMRVMuRU5WX0ZJTEUpXG5cdFx0Py5hZGRFbnRyeShcIlBPU1RHUkVTX0RCXCIsIGRiKVxuXHRcdC5hZGRFbnRyeShcIlBPU1RHUkVTX1VTRVJcIiwgdXNlcilcblx0XHQuYWRkRW50cnkoXCJQT1NUR1JFU19QQVNTV09SRFwiLCBwYXNzd29yZClcblx0XHQuYWRkRW50cnkoXCJEQl9IT1NUXCIsIFwicG9zdGdyZXNcIilcblx0XHQuYWRkRW50cnkoXCJEQl9QT1JUXCIsIFwiNTQzMlwiKVxuXHRcdC5hZGRFbnRyeShcIkRCX05BTUVcIiwgZGIpXG5cdFx0LmFkZEVudHJ5KFwiREJfVVNFUlwiLCB1c2VyKVxuXHRcdC5hZGRFbnRyeShcIkRCX1BBU1NXT1JEXCIsIHBhc3N3b3JkKVxuXHRcdC5hZGRFbnRyeShcIkRCX0FETUlOX1VTRVJcIiwgdXNlcilcblx0XHQuYWRkRW50cnkoXCJEQl9BRE1JTl9QQVNTV09SRFwiLCBwYXNzd29yZCk7XG59XG5cbmV4cG9ydCBjb25zdCBEYXRhYmFzZUZlYXR1cmU6IEZlYXR1cmU8RGF0YWJhc2VPcHRpb25zPiA9IHsgZ2V0T3B0aW9ucywgc2NhZmZvbGQgfTtcbiJdLCJuYW1lcyI6WyJyYW5kb21CeXRlcyIsInJlYWRGaWxlU3luYyIsImpvaW4iLCJwaWNrIiwiV0VMTF9LTk9XTl9GSUxFUyIsIkNSRUFURV9WRVJTSU9OIiwiV0VCQVBJX1BST0pFQ1RfRElSIiwicmVhZEV4aXN0aW5nRW52VmFsdWUiLCJ3b3Jrc3BhY2UiLCJrZXkiLCJyYXciLCJ0YXJnZXREaXIiLCJsaW5lIiwic3BsaXQiLCJmaW5kIiwibCIsInN0YXJ0c1dpdGgiLCJ2YWx1ZSIsInNsaWNlIiwibGVuZ3RoIiwidHJpbSIsInVuZGVmaW5lZCIsIkRBVEFCQVNFX0JBU0VfQ09ORklHX1lBTUwiLCJEQVRBQkFTRV9ERVZfQ09ORklHX1lBTUwiLCJTQU1QTEVfRU5USVRZX1RTIiwiU0FNUExFX1JFUE9TSVRPUllfVFMiLCJnZXRPcHRpb25zIiwiX3dvcmtzcGFjZSIsImNsaU9wdGlvbnMiLCJkYXRhYmFzZVByb3ZpZGVyIiwiY2hvaWNlcyIsImxhYmVsIiwic2VsZWN0ZWQiLCJjIiwic2NhZmZvbGQiLCJvcHRpb25zIiwibmFtZSIsImV4aXN0aW5nUGFzc3dvcmQiLCJwYXNzd29yZCIsInRvU3RyaW5nIiwiZGIiLCJ1c2VyIiwiZGV2Q29udGFpbmVyIiwiZ2V0TW9kZWwiLCJERVZDT05UQUlORVJfSlNPTiIsImNvbXBvc2UiLCJET0NLRVJfQ09NUE9TRSIsIm5ldHdvcmtLZXkiLCJ2b2x1bWVOYW1lIiwiYWRkU2VydmljZSIsImltYWdlIiwiY29udGFpbmVyX25hbWUiLCJyZXN0YXJ0IiwicG9ydHMiLCJ2b2x1bWVzIiwibmV0d29ya3MiLCJhbGlhc2VzIiwiaGVhbHRoY2hlY2siLCJ0ZXN0IiwiaW50ZXJ2YWwiLCJ0aW1lb3V0IiwicmV0cmllcyIsImFkZEVudkZpbGUiLCJhZGRWb2x1bWUiLCJhZGRFeHRlbnNpb24iLCJNQUlOX1RTIiwiYWRkU2lkZUVmZmVjdEltcG9ydCIsImFkZEVudGl0eSIsImNsYXNzTmFtZSIsImltcG9ydFBhdGgiLCJhZGRSZXBvc2l0b3J5IiwiUEFDS0FHRV9KU09OIiwiYWRkRGVwZW5kZW5jeSIsImFkZFNjcmlwdCIsIkFQSV9QQUNLQUdFX0pTT04iLCJDT05GSUdfWUFNTCIsImFkZFNlY3Rpb24iLCJDT05GSUdfREVWX1lBTUwiLCJnZXRQcm9qZWN0IiwiYWRkRmlsZSIsImZpbGVzIiwiZmlsZVBhdGgiLCJjb250ZW50IiwiRU5WX0ZJTEUiLCJhZGRFbnRyeSIsIkRhdGFiYXNlRmVhdHVyZSJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsV0FBVyxRQUFRLGNBQWM7QUFDMUMsU0FBU0MsWUFBWSxRQUFRLFVBQVU7QUFDdkMsU0FBU0MsSUFBSSxRQUFRLFlBQVk7QUFDakMsU0FBU0MsSUFBSSxRQUFRLHlCQUF5QjtBQUc5QyxTQUFTQyxnQkFBZ0IsUUFBUSx3QkFBd0I7QUFNekQsU0FBU0MsY0FBYyxRQUFRLG1CQUFtQjtBQUNsRCxTQUFTQyxrQkFBa0IsUUFBUSxtQkFBbUI7QUFRdEQsZ0VBQWdFLEdBQ2hFLFNBQVNDLHFCQUFxQkMsU0FBNEIsRUFBRUMsR0FBVztJQUN0RSxJQUFJO1FBQ0gsTUFBTUMsTUFBTVQsYUFBYUMsS0FBS00sVUFBVUcsU0FBUyxFQUFFLFNBQVM7UUFDNUQsTUFBTUMsT0FBT0YsSUFBSUcsS0FBSyxDQUFDLE1BQU1DLElBQUksQ0FBQyxDQUFDQyxJQUFNQSxFQUFFQyxVQUFVLENBQUMsR0FBR1AsSUFBSSxDQUFDLENBQUM7UUFDL0Qs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
236
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL2ZlYXR1cmVzL2RhdGFiYXNlLmZlYXR1cmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tIFwibm9kZTpjcnlwdG9cIjtcbmltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgcGljayB9IGZyb20gXCIuLi8uLi9kb21haW4vcHJvbXB0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IERvY2tlckNvbXBvc2UgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbXBvc2UubW9kZWwuanNcIjtcbmltcG9ydCB0eXBlIHsgQ29uZmlnWWFtbCB9IGZyb20gXCIuLi8uLi9tb2RlbHMvY29uZmlnLXlhbWwubW9kZWwuanNcIjtcbmltcG9ydCB7IFdFTExfS05PV05fRklMRVMgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbnN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IERldkNvbnRhaW5lciB9IGZyb20gXCIuLi8uLi9tb2RlbHMvZGV2LWNvbnRhaW5lci5tb2RlbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBFbnZGaWxlIH0gZnJvbSBcIi4uLy4uL21vZGVscy9lbnYtZmlsZS5tb2RlbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gXCIuLi8uLi9tb2RlbHMvcGFja2FnZS1qc29uLm1vZGVsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtzcGFjZVNjYWZmb2xkIH0gZnJvbSBcIi4uLy4uL21vZGVscy9wcm9qZWN0Lm1vZGVsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEZlYXR1cmUgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvc2NhZmZvbGQuc2VydmljZS5qc1wiO1xuaW1wb3J0IHsgQ1JFQVRFX1ZFUlNJT04gfSBmcm9tIFwiLi4vLi4vdmVyc2lvbi5qc1wiO1xuaW1wb3J0IHsgV0VCQVBJX1BST0pFQ1RfRElSIH0gZnJvbSBcIi4uL2NyZWF0ZS1hcGkuanNcIjtcbmltcG9ydCB0eXBlIHsgQXBpUGFja2FnZUpzb24gfSBmcm9tIFwiLi4vbW9kZWxzL2FwaS1wYWNrYWdlLWpzb24ubW9kZWwuanNcIjtcbmltcG9ydCB0eXBlIHsgTWFpblNvdXJjZUZpbGUgfSBmcm9tIFwiLi4vbW9kZWxzL21haW4tc291cmNlLWZpbGUubW9kZWwuanNcIjtcblxuZXhwb3J0IHR5cGUgRGF0YWJhc2VPcHRpb25zID0ge1xuXHRkYXRhYmFzZVByb3ZpZGVyPzogXCJub25lXCIgfCBcInBvc3RncmVzL3R5cGVvcm1cIjtcbn07XG5cbi8qKiBSZWFkIGEgc2luZ2xlIEtFWT0gZnJvbSBhbiBleGlzdGluZyB0YXJnZXQgYC5lbnZgIChpZiBhbnkpLiAqL1xuZnVuY3Rpb24gcmVhZEV4aXN0aW5nRW52VmFsdWUod29ya3NwYWNlOiBXb3Jrc3BhY2VTY2FmZm9sZCwga2V5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHR0cnkge1xuXHRcdGNvbnN0IHJhdyA9IHJlYWRGaWxlU3luYyhqb2luKHdvcmtzcGFjZS50YXJnZXREaXIsIFwiLmVudlwiKSwgXCJ1dGY4XCIpO1xuXHRcdGNvbnN0IGxpbmUgPSByYXcuc3BsaXQoXCJcXG5cIikuZmluZCgobCkgPT4gbC5zdGFydHNXaXRoKGAke2tleX09YCkpO1xuXHRcdGNvbnN0IHZhbHVlID0gbGluZT8uc2xpY2Uoa2V5Lmxlbmd0aCArIDEpLnRyaW0oKTtcblx0XHRyZXR1cm4gdmFsdWUgfHwgdW5kZWZpbmVkO1xuXHR9IGNhdGNoIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHJhbmRvbVBhc3N3b3JkKCk6IHN0cmluZyB7XG5cdHJldHVybiByYW5kb21CeXRlcygxNikudG9TdHJpbmcoXCJoZXhcIik7XG59XG5cbi8qKiBTYWZlIFBvc3RncmVzIGlkZW50aWZpZXIgZnJhZ21lbnQgZnJvbSB0aGUgcHJvamVjdCBuYW1lLiAqL1xuZnVuY3Rpb24gdG9TcWxJZGVudEZyYWdtZW50KG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG5cdGNvbnN0IGNsZWFuZWQgPSBuYW1lLnJlcGxhY2UoL1teQS1aYS16MC05X10vZywgXCJfXCIpLnJlcGxhY2UoL14oW15BLVphLXpfXSkvLCBcInBfJDFcIik7XG5cdHJldHVybiBjbGVhbmVkLmxlbmd0aCA+IDAgPyBjbGVhbmVkLnNsaWNlKDAsIDQwKSA6IFwiYXBwXCI7XG59XG5cbmZ1bmN0aW9uIHBhc3N3b3JkT3JFeGlzdGluZyhcblx0d29ya3NwYWNlOiBXb3Jrc3BhY2VTY2FmZm9sZCxcblx0a2V5OiBzdHJpbmcsXG5cdGZhbGxiYWNrRXhpc3RpbmdLZXlzOiBzdHJpbmdbXSA9IFtdLFxuKTogc3RyaW5nIHtcblx0Y29uc3QgZXhpc3RpbmcgPSByZWFkRXhpc3RpbmdFbnZWYWx1ZSh3b3Jrc3BhY2UsIGtleSk7XG5cdGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nO1xuXHRmb3IgKGNvbnN0IGFsdCBvZiBmYWxsYmFja0V4aXN0aW5nS2V5cykge1xuXHRcdGNvbnN0IHYgPSByZWFkRXhpc3RpbmdFbnZWYWx1ZSh3b3Jrc3BhY2UsIGFsdCk7XG5cdFx0aWYgKHYpIHJldHVybiB2O1xuXHR9XG5cdHJldHVybiByYW5kb21QYXNzd29yZCgpO1xufVxuXG4vLyBQcm9kdWN0aW9uIGJhc2U6IHJ1bnRpbWUgYXBwIHJvbGUgb25seSDigJQgbm8gYm9vdHN0cmFwLCBubyBhZG1pbi9taWdyYXRlIHNlY3JldHMgcmVxdWlyZWQuXG5jb25zdCBEQVRBQkFTRV9CQVNFX0NPTkZJR19ZQU1MID0gYGRhdGFiYXNlOlxuICBkYXRhU291cmNlczpcbiAgICAtIG5hbWU6IGRlZmF1bHRcbiAgICAgIHByb3ZpZGVyOiBwb3N0Z3Jlc1xuICAgICAgaG9zdDogXFwke0RCX0hPU1R9XG4gICAgICBwb3J0OiBcXCR7REJfUE9SVH1cbiAgICAgIGRhdGFiYXNlOiBcXCR7REJfTkFNRX1cbiAgICAgIHVzZXJuYW1lOiBcXCR7REJfVVNFUn1cbiAgICAgIHBhc3N3b3JkOiBcXCR7REJfUEFTU1dPUkR9XG4gICAgICBzeW5jaHJvbml6ZTogZmFsc2VcbiAgICAgIHNlZWQ6IGZhbHNlXG4gICAgICBib290c3RyYXA6IGZhbHNlXG5gO1xuXG4vLyBEZXY6IGVuYWJsZSBib290c3RyYXAgKyBtaWdyYXRlIHJvbGU7IHN5bmNocm9uaXplIHVzZXMgYXBwIERETCAoZGV2LW9ubHkgZXhjZXB0aW9uKS5cbmNvbnN0IERBVEFCQVNFX0RFVl9DT05GSUdfWUFNTCA9IGBkYXRhYmFzZTpcbiAgZGF0YVNvdXJjZXM6XG4gICAgLSBzeW5jaHJvbml6ZTogdHJ1ZVxuICAgICAgc2VlZDogdHJ1ZVxuICAgICAgYm9vdHN0cmFwOiB0cnVlXG4gICAgICBhZG1pblVzZXI6IFxcJHtEQl9BRE1JTl9VU0VSfVxuICAgICAgYWRtaW5QYXNzd29yZDogXFwke0RCX0FETUlOX1BBU1NXT1JEfVxuICAgICAgbWlncmF0ZVVzZXJuYW1lOiBcXCR7REJfTUlHUkFURV9VU0VSfVxuICAgICAgbWlncmF0ZVBhc3N3b3JkOiBcXCR7REJfTUlHUkFURV9QQVNTV09SRH1cbmA7XG5cbi8qKiBSdW5zIG9uY2Ugb24gZmlyc3QgUG9zdGdyZXMgdm9sdW1lIGluaXQg4oCUIGNyZWF0ZXMgcmVzdHJpY3RlZCBib290c3RyYXAgcm9sZSAobm90IHN1cGVydXNlcikuICovXG5jb25zdCBQT1NUR1JFU19JTklUX0JPT1RTVFJBUF9TSCA9IGAjIS9iaW4vYmFzaFxuc2V0IC1ldW8gcGlwZWZhaWxcbiMgQ29udGFpbmVyIHN1cGVydXNlciAoUE9TVEdSRVNfVVNFUikgY3JlYXRlcyBhIHJlc3RyaWN0ZWQgcHJvdmlzaW9uZXIgcm9sZS5cbiMgQXBwL21pZ3JhdGUgcm9sZXMgYXJlIGNyZWF0ZWQgbGF0ZXIgYnkgY29kZXgtdHlwZW9ybSBwcmVwYXJlRGF0YWJhc2UgKGRldiBib290c3RyYXApLlxuOiBcIlxcJHtEQl9BRE1JTl9VU0VSOj9EQl9BRE1JTl9VU0VSIGlzIHJlcXVpcmVkfVwiXG46IFwiXFwke0RCX0FETUlOX1BBU1NXT1JEOj9EQl9BRE1JTl9QQVNTV09SRCBpcyByZXF1aXJlZH1cIlxuXG5wc3FsIC12IE9OX0VSUk9SX1NUT1A9MSAtLXVzZXJuYW1lIFwiJFBPU1RHUkVTX1VTRVJcIiAtLWRibmFtZSBcIiRQT1NUR1JFU19EQlwiIFxcXFxcblxcdC0tc2V0PWJvb3RzdHJhcF91c2VyPVwiJERCX0FETUlOX1VTRVJcIiBcXFxcXG5cXHQtLXNldD1ib290c3RyYXBfcGFzc3dvcmQ9XCIkREJfQURNSU5fUEFTU1dPUkRcIiA8PCdFT1NRTCdcblNFTEVDVCBmb3JtYXQoXG5cXHQnQ1JFQVRFIFJPTEUgJUkgTE9HSU4gUEFTU1dPUkQgJUwgQ1JFQVRFREIgQ1JFQVRFUk9MRSBOT1NVUEVSVVNFUiBOT0JZUEFTU1JMUycsXG5cXHQ6J2Jvb3RzdHJhcF91c2VyJyxcblxcdDonYm9vdHN0cmFwX3Bhc3N3b3JkJ1xuKVxuV0hFUkUgTk9UIEVYSVNUUyAoXG5cXHRTRUxFQ1QgMSBGUk9NIHBnX2NhdGFsb2cucGdfcm9sZXMgV0hFUkUgcm9sbmFtZSA9IDonYm9vdHN0cmFwX3VzZXInXG4pXFxcXGdleGVjXG5cbkdSQU5UIEFMTCBPTiBTQ0hFTUEgcHVibGljIFRPIDpcImJvb3RzdHJhcF91c2VyXCI7XG5FT1NRTFxuXG5wc3FsIC12IE9OX0VSUk9SX1NUT1A9MSAtLXVzZXJuYW1lIFwiJFBPU1RHUkVTX1VTRVJcIiAtLWRibmFtZSBcIiRQT1NUR1JFU19EQlwiIFxcXFxcblxcdC1jIFwiR1JBTlQgQUxMIFBSSVZJTEVHRVMgT04gREFUQUJBU0UgXFxcXFwiJFBPU1RHUkVTX0RCXFxcXFwiIFRPIFxcXFxcIiREQl9BRE1JTl9VU0VSXFxcXFwiXCJcbmA7XG5cbmNvbnN0IFNBTVBMRV9FTlRJVFlfVFMgPSBgaW1wb3J0IHsgQ29sdW1uLCBFbnRpdHksIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4gfSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHR5cGUgeyBFbnRpdHkgYXMgSUVudGl0eSB9IGZyb20gXCJAZGVjb2hlcmUvY29kZXhcIjtcblxuQEVudGl0eSgpXG5leHBvcnQgY2xhc3MgU2FtcGxlRW50aXR5IGltcGxlbWVudHMgSUVudGl0eSB7XG5cXHRAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpXG5cXHRwdWJsaWMgaWQhOiBudW1iZXI7XG5cblxcdEBDb2x1bW4oKVxuXFx0cHVibGljIG5hbWUhOiBzdHJpbmc7XG59XG5gO1xuXG5jb25zdCBTQU1QTEVfUkVQT1NJVE9SWV9UUyA9IGBpbXBvcnQgeyBpbmplY3RhYmxlIH0gZnJvbSBcIkBkZWNvaGVyZS9jcnVjaWJsZS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBpbmplY3RVbml0T2ZXb3JrIH0gZnJvbSBcIkBkZWNvaGVyZS9jb2RleFwiO1xuaW1wb3J0IHsgVHlwZU9ybVJlcG9zaXRvcnksIFR5cGVPcm1Vbml0T2ZXb3JrIH0gZnJvbSBcIkBkZWNvaGVyZS9jb2RleC10eXBlb3JtXCI7XG5pbXBvcnQgeyBTYW1wbGVFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXRpZXMvc2FtcGxlLmVudGl0eS5qc1wiO1xuXG5AaW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgU2FtcGxlRW50aXR5UmVwb3NpdG9yeSBleHRlbmRzIFR5cGVPcm1SZXBvc2l0b3J5PFNhbXBsZUVudGl0eT4ge1xuXFx0cHVibGljIGNvbnN0cnVjdG9yKEBpbmplY3RVbml0T2ZXb3JrKCkgdW5pdE9mV29yazogVHlwZU9ybVVuaXRPZldvcmspIHtcblxcdFxcdHN1cGVyKHVuaXRPZldvcmssIFNhbXBsZUVudGl0eSk7XG5cXHR9XG59XG5gO1xuXG5hc3luYyBmdW5jdGlvbiBnZXRPcHRpb25zKFxuXHRfd29ya3NwYWNlOiBXb3Jrc3BhY2VTY2FmZm9sZCxcblx0Y2xpT3B0aW9uczogUGFydGlhbDxEYXRhYmFzZU9wdGlvbnM+LFxuKTogUHJvbWlzZTxQYXJ0aWFsPERhdGFiYXNlT3B0aW9ucz4+IHtcblx0aWYgKGNsaU9wdGlvbnMuZGF0YWJhc2VQcm92aWRlciAhPSBudWxsKSByZXR1cm4ge307XG5cblx0Y29uc3QgY2hvaWNlcyA9IFt7IGxhYmVsOiBcIm5vbmVcIiBhcyBjb25zdCB9LCB7IGxhYmVsOiBcInBvc3RncmVzL3R5cGVvcm1cIiBhcyBjb25zdCB9XTtcblx0Y29uc3Qgc2VsZWN0ZWQgPSBhd2FpdCBwaWNrKFwiXFxuICBEYXRhYmFzZTogXCIsIGNob2ljZXMsIChjKSA9PiBjLmxhYmVsKTtcblx0cmV0dXJuIHsgZGF0YWJhc2VQcm92aWRlcjogc2VsZWN0ZWQ/LmxhYmVsID8/IFwibm9uZVwiIH07XG59XG5cbmZ1bmN0aW9uIHNjYWZmb2xkKHdvcmtzcGFjZTogV29ya3NwYWNlU2NhZmZvbGQsIG9wdGlvbnM6IERhdGFiYXNlT3B0aW9ucyk6IHZvaWQge1xuXHRpZiAob3B0aW9ucy5kYXRhYmFzZVByb3ZpZGVyICE9PSBcInBvc3RncmVzL3R5cGVvcm1cIikgcmV0dXJuO1xuXG5cdGNvbnN0IG5hbWUgPSB3b3Jrc3BhY2UubmFtZTtcblx0Y29uc3QgaWRlbnQgPSB0b1NxbElkZW50RnJhZ21lbnQobmFtZSk7XG5cdGNvbnN0IGRiID0gYCR7aWRlbnR9X2RldmA7XG5cdC8vIENvbnRhaW5lciBpbml0IHN1cGVydXNlciDigJQgbmV2ZXIgcmV1c2VkIGFzIHRoZSBBUEkgcnVudGltZSByb2xlLlxuXHRjb25zdCBwb3N0Z3Jlc1N1cGVydXNlciA9IFwicG9zdGdyZXNcIjtcblx0Y29uc3QgcG9zdGdyZXNQYXNzd29yZCA9IHBhc3N3b3JkT3JFeGlzdGluZyh3b3Jrc3BhY2UsIFwiUE9TVEdSRVNfUEFTU1dPUkRcIik7XG5cdGNvbnN0IGJvb3RzdHJhcFVzZXIgPSBcImRlY29oZXJlX2Jvb3RzdHJhcFwiO1xuXHRjb25zdCBib290c3RyYXBQYXNzd29yZCA9IHBhc3N3b3JkT3JFeGlzdGluZyh3b3Jrc3BhY2UsIFwiREJfQURNSU5fUEFTU1dPUkRcIiwgW1xuXHRcdFwiUE9TVEdSRVNfUEFTU1dPUkRcIixcblx0XSk7XG5cdGNvbnN0IGFwcFVzZXIgPSBgJHtpZGVudH1fYXBwYDtcblx0Y29uc3QgYXBwUGFzc3dvcmQgPSBwYXNzd29yZE9yRXhpc3Rpbmcod29ya3NwYWNlLCBcIkRCX1BBU1NXT1JEXCIpO1xuXHRjb25zdCBtaWdyYXRlVXNlciA9IGAke2lkZW50fV9taWdyYXRlYDtcblx0Y29uc3QgbWlncmF0ZVBhc3N3b3JkID0gcGFzc3dvcmRPckV4aXN0aW5nKHdvcmtzcGFjZSwgXCJEQl9NSUdSQVRFX1BBU1NXT1JEXCIpO1xuXG5cdGNvbnN0IGRldkNvbnRhaW5lciA9IHdvcmtzcGFjZS5nZXRNb2RlbDxEZXZDb250YWluZXI+KFdFTExfS05PV05fRklMRVMuREVWQ09OVEFJTkVSX0pTT04pO1xuXHRjb25zdCBjb21wb3NlID0gd29ya3NwYWNlLmdldE1vZGVsPERvY2tlckNvbXBvc2U+KFdFTExfS05PV05fRklMRVMuRE9DS0VSX0NPTVBPU0UpO1xuXG5cdGNvbnN0IG5ldHdvcmtLZXkgPSBuYW1lO1xuXHRjb25zdCB2b2x1bWVOYW1lID0gYCR7bmFtZX0tcG9zdGdyZXMtZGF0YWA7XG5cblx0Ly8gSXNvbGF0ZWQgY29tcG9zZSBwcm9qZWN0IG5ldHdvcmsgKyB2b2x1bWUgKG5vdCBhcmsncyBzaGFyZWQgUG9zdGdyZXMpLlxuXHQvLyBBbGlhcyBgcG9zdGdyZXNgIHNvIG90aGVyIHN0YWNrcyBvbiB0aGUgc2FtZSBuYW1lZCBuZXR3b3JrIGNhbiB1c2UgREJfSE9TVD1wb3N0Z3Jlcy5cblx0Y29tcG9zZVxuXHRcdD8uYWRkU2VydmljZShcInBvc3RncmVzXCIsIHtcblx0XHRcdGltYWdlOiBcInBvc3RncmVzOjE2XCIsXG5cdFx0XHRjb250YWluZXJfbmFtZTogYHNhbXBsZXMtJHtuYW1lfS1wb3N0Z3Jlc2AsXG5cdFx0XHRyZXN0YXJ0OiBcInVubGVzcy1zdG9wcGVkXCIsXG5cdFx0XHQvLyBMb29wYmFjay1vbmx5OiBhdm9pZCBleHBvc2luZyBQb3N0Z3JlcyBvbiBMQU4vcHVibGljIGludGVyZmFjZXMuXG5cdFx0XHQvLyBIb3N0IDU0MzMgYXZvaWRzIGNsYXNoaW5nIHdpdGggYSBsb2NhbC9vdGhlciBQb3N0Z3JlcyBvbiA1NDMyLlxuXHRcdFx0cG9ydHM6IFtcIjEyNy4wLjAuMTo1NDMzOjU0MzJcIl0sXG5cdFx0XHR2b2x1bWVzOiBbXG5cdFx0XHRcdGAke3ZvbHVtZU5hbWV9Oi92YXIvbGliL3Bvc3RncmVzcWwvZGF0YWAsXG5cdFx0XHRcdFwiLi4vLmRldmNvbnRhaW5lci9wb3N0Z3Jlcy1pbml0Oi9kb2NrZXItZW50cnlwb2ludC1pbml0ZGIuZDpyb1wiLFxuXHRcdFx0XSxcblx0XHRcdG5ldHdvcmtzOiBbeyBbbmV0d29ya0tleV06IHsgYWxpYXNlczogW1wicG9zdGdyZXNcIl0gfSB9XSxcblx0XHRcdGhlYWx0aGNoZWNrOiB7XG5cdFx0XHRcdHRlc3Q6IFtcIkNNRC1TSEVMTFwiLCBgcGdfaXNyZWFkeSAtVSAke3Bvc3RncmVzU3VwZXJ1c2VyfSAtZCAke2RifWBdLFxuXHRcdFx0XHRpbnRlcnZhbDogXCIyc1wiLFxuXHRcdFx0XHR0aW1lb3V0OiBcIjVzXCIsXG5cdFx0XHRcdHJldHJpZXM6IDE1LFxuXHRcdFx0fSxcblx0XHR9KVxuXHRcdC5hZGRFbnZGaWxlKFwicG9zdGdyZXNcIiwgXCIuLi8uZW52XCIpXG5cdFx0LmFkZFZvbHVtZSh2b2x1bWVOYW1lKTtcblxuXHQvLyBPcHRpb25hbCBEQiBVSSDigJQgZW5hYmxlIHdpdGg6IGRvY2tlciBjb21wb3NlIC0tcHJvZmlsZSB0b29scyB1cCAtZFxuXHRjb21wb3NlPy5hZGRTZXJ2aWNlKFwiYWRtaW5lclwiLCB7XG5cdFx0aW1hZ2U6IFwiYWRtaW5lclwiLFxuXHRcdHByb2ZpbGVzOiBbXCJ0b29sc1wiXSxcblx0XHRwb3J0czogW1wiMTI3LjAuMC4xOjgwODE6ODA4MFwiXSxcblx0XHRuZXR3b3JrczogW25ldHdvcmtLZXldLFxuXHR9KTtcblxuXHR3b3Jrc3BhY2UuYWRkRmlsZSh7XG5cdFx0ZmlsZXM6ICgpID0+IFtcblx0XHRcdHtcblx0XHRcdFx0ZmlsZVBhdGg6IFwiLmRldmNvbnRhaW5lci9wb3N0Z3Jlcy1pbml0LzAxLWNyZWF0ZS1ib290c3RyYXAtcm9sZS5zaFwiLFxuXHRcdFx0XHRjb250ZW50OiBQT1NUR1JFU19JTklUX0JPT1RTVFJBUF9TSCxcblx0XHRcdH0sXG5cdFx0XSxcblx0fSk7XG5cblx0Ly8gQWRkIFNRTFRvb2xzIGV4dGVuc2lvbiBmb3IgREIgYnJvd3NpbmcgaW4gVlMgQ29kZVxuXHRkZXZDb250YWluZXI/LmFkZEV4dGVuc2lvbihcIm10eHIuc3FsdG9vbHNcIik7XG5cblx0Ly8gV2lyZSB1cCBtYWluLnRzXG5cdHdvcmtzcGFjZVxuXHRcdC5nZXRNb2RlbDxNYWluU291cmNlRmlsZT4oV0VMTF9LTk9XTl9GSUxFUy5NQUlOX1RTKVxuXHRcdD8uYWRkU2lkZUVmZmVjdEltcG9ydChcIkBkZWNvaGVyZS9jb2RleC10eXBlb3JtXCIpXG5cdFx0LmFkZEVudGl0eSh7IGNsYXNzTmFtZTogXCJTYW1wbGVFbnRpdHlcIiwgaW1wb3J0UGF0aDogXCIuL2VudGl0aWVzL3NhbXBsZS5lbnRpdHkuanNcIiB9KVxuXHRcdC5hZGRSZXBvc2l0b3J5KHtcblx0XHRcdGNsYXNzTmFtZTogXCJTYW1wbGVFbnRpdHlSZXBvc2l0b3J5XCIsXG5cdFx0XHRpbXBvcnRQYXRoOiBcIi4vcmVwb3NpdG9yaWVzL3NhbXBsZS5yZXBvc2l0b3J5LmpzXCIsXG5cdFx0fSk7XG5cblx0d29ya3NwYWNlXG5cdFx0LmdldE1vZGVsPFBhY2thZ2VKc29uPihXRUxMX0tOT1dOX0ZJTEVTLlBBQ0tBR0VfSlNPTilcblx0XHQ/LmFkZERlcGVuZGVuY3koXCJAZGVjb2hlcmUvY29kZXhcIiwgQ1JFQVRFX1ZFUlNJT04pXG5cdFx0LmFkZERlcGVuZGVuY3koXCJ0eXBlb3JtXCIsIFwiXjAuMy4yOFwiKVxuXHRcdC5hZGREZXBlbmRlbmN5KFwiQGRlY29oZXJlL2NvZGV4LXR5cGVvcm1cIiwgQ1JFQVRFX1ZFUlNJT04pXG5cdFx0LmFkZFNjcmlwdChcImRiOnVwXCIsIFwiZG9ja2VyIGNvbXBvc2UgLWYgLmRldmNvbnRhaW5lci9kb2NrZXItY29tcG9zZS55bWwgdXAgLWQgcG9zdGdyZXNcIilcblx0XHQuYWRkU2NyaXB0KFwiZGI6ZG93blwiLCBcImRvY2tlciBjb21wb3NlIC1mIC5kZXZjb250YWluZXIvZG9ja2VyLWNvbXBvc2UueW1sIGRvd25cIilcblx0XHQuYWRkU2NyaXB0KFxuXHRcdFx0XCJkYjpyZXNldFwiLFxuXHRcdFx0XCJkb2NrZXIgY29tcG9zZSAtZiAuZGV2Y29udGFpbmVyL2RvY2tlci1jb21wb3NlLnltbCBkb3duIC12ICYmIGRvY2tlciBjb21wb3NlIC1mIC5kZXZjb250YWluZXIvZG9ja2VyLWNvbXBvc2UueW1sIHVwIC1kIHBvc3RncmVzXCIsXG5cdFx0KTtcblxuXHQvLyBBZGQgY29kZXggZGVwcyB0byBhcGkgcGFja2FnZS5qc29uXG5cdHdvcmtzcGFjZVxuXHRcdC5nZXRNb2RlbDxBcGlQYWNrYWdlSnNvbj4oV0VMTF9LTk9XTl9GSUxFUy5BUElfUEFDS0FHRV9KU09OKVxuXHRcdD8uYWRkRGVwZW5kZW5jeShcIkBkZWNvaGVyZS9jb2RleFwiLCBDUkVBVEVfVkVSU0lPTilcblx0XHQuYWRkRGVwZW5kZW5jeShcIkBkZWNvaGVyZS9jb2RleC10eXBlb3JtXCIsIENSRUFURV9WRVJTSU9OKTtcblxuXHQvLyBBcHBlbmQgZGF0YWJhc2UgY29uZmlnIHNlY3Rpb25zXG5cdHdvcmtzcGFjZVxuXHRcdC5nZXRNb2RlbDxDb25maWdZYW1sPihXRUxMX0tOT1dOX0ZJTEVTLkNPTkZJR19ZQU1MKVxuXHRcdD8uYWRkU2VjdGlvbihEQVRBQkFTRV9CQVNFX0NPTkZJR19ZQU1MKTtcblx0d29ya3NwYWNlXG5cdFx0LmdldE1vZGVsPENvbmZpZ1lhbWw+KFdFTExfS05PV05fRklMRVMuQ09ORklHX0RFVl9ZQU1MKVxuXHRcdD8uYWRkU2VjdGlvbihEQVRBQkFTRV9ERVZfQ09ORklHX1lBTUwpO1xuXG5cdC8vIFJlZ2lzdGVyIGVudGl0eSBhbmQgcmVwb3NpdG9yeSBzb3VyY2UgZmlsZXMgaW4gdGhlIGFwaSBwcm9qZWN0XG5cdHdvcmtzcGFjZS5nZXRQcm9qZWN0KFdFQkFQSV9QUk9KRUNUX0RJUik/LmFkZEZpbGUoe1xuXHRcdGZpbGVzOiAoKSA9PiBbXG5cdFx0XHR7XG5cdFx0XHRcdGZpbGVQYXRoOiBcInNyYy9lbnRpdGllcy9zYW1wbGUuZW50aXR5LnRzXCIsXG5cdFx0XHRcdGNvbnRlbnQ6IFNBTVBMRV9FTlRJVFlfVFMsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRmaWxlUGF0aDogXCJzcmMvcmVwb3NpdG9yaWVzL3NhbXBsZS5yZXBvc2l0b3J5LnRzXCIsXG5cdFx0XHRcdGNvbnRlbnQ6IFNBTVBMRV9SRVBPU0lUT1JZX1RTLFxuXHRcdFx0fSxcblx0XHRdLFxuXHR9KTtcblxuXHQvLyAuZW52IGF0IHdvcmtzcGFjZSByb290IOKAlCBwb3N0Z3JlcyByZWFkcyBpdCB2aWEgZW52X2ZpbGUgYWJvdmU7IGRldmNvbnRhaW5lciBnZXRzIGl0IGhlcmVcblx0Y29tcG9zZT8uYWRkRW52RmlsZShcImRldmNvbnRhaW5lclwiLCBcIi4uLy5lbnZcIik7XG5cblx0d29ya3NwYWNlXG5cdFx0LmdldE1vZGVsPEVudkZpbGU+KFdFTExfS05PV05fRklMRVMuRU5WX0ZJTEUpXG5cdFx0Py5hZGRFbnRyeShcIlBPU1RHUkVTX0RCXCIsIGRiKVxuXHRcdC5hZGRFbnRyeShcIlBPU1RHUkVTX1VTRVJcIiwgcG9zdGdyZXNTdXBlcnVzZXIpXG5cdFx0LmFkZEVudHJ5KFwiUE9TVEdSRVNfUEFTU1dPUkRcIiwgcG9zdGdyZXNQYXNzd29yZClcblx0XHQuYWRkRW50cnkoXCJEQl9IT1NUXCIsIFwicG9zdGdyZXNcIilcblx0XHQuYWRkRW50cnkoXCJEQl9QT1JUXCIsIFwiNTQzMlwiKVxuXHRcdC5hZGRFbnRyeShcIkRCX05BTUVcIiwgZGIpXG5cdFx0Ly8gUnVudGltZSBhcHAgcm9sZSAobGVhc3QgcHJpdmlsZWdlKSDigJQgdXNlZCBieSBUeXBlT1JNXG5cdFx0LmFkZEVudHJ5KFwiREJfVVNFUlwiLCBhcHBVc2VyKVxuXHRcdC5hZGRFbnRyeShcIkRCX1BBU1NXT1JEXCIsIGFwcFBhc3N3b3JkKVxuXHRcdC8vIEJvb3RzdHJhcCBwcm92aXNpb25lciAoQ1JFQVRFREIvQ1JFQVRFUk9MRSwgbm90IHN1cGVydXNlcikg4oCUIGRldiBwcmVwYXJlRGF0YWJhc2Ugb25seVxuXHRcdC5hZGRFbnRyeShcIkRCX0FETUlOX1VTRVJcIiwgYm9vdHN0cmFwVXNlcilcblx0XHQuYWRkRW50cnkoXCJEQl9BRE1JTl9QQVNTV09SRFwiLCBib290c3RyYXBQYXNzd29yZClcblx0XHQvLyBNaWdyYXRpb24vRERMIHJvbGUg4oCUIENJL2RlcGxveTsgbm90IG1vdW50ZWQgb24gQVBJIHBvZHMgaW4gcHJvZHVjdGlvblxuXHRcdC5hZGRFbnRyeShcIkRCX01JR1JBVEVfVVNFUlwiLCBtaWdyYXRlVXNlcilcblx0XHQuYWRkRW50cnkoXCJEQl9NSUdSQVRFX1BBU1NXT1JEXCIsIG1pZ3JhdGVQYXNzd29yZCk7XG59XG5cbmV4cG9ydCBjb25zdCBEYXRhYmFzZUZlYXR1cmU6IEZlYXR1cmU8RGF0YWJhc2VPcHRpb25zPiA9IHsgZ2V0T3B0aW9ucywgc2NhZmZvbGQgfTtcbiJdLCJuYW1lcyI6WyJyYW5kb21CeXRlcyIsInJlYWRGaWxlU3luYyIsImpvaW4iLCJwaWNrIiwiV0VMTF9LTk9XTl9GSUxFUyIsIkNSRUFURV9WRVJTSU9OIiwiV0VCQVBJX1BST0pFQ1RfRElSIiwicmVhZEV4aXN0aW5nRW52VmFsdWUiLCJ3b3Jrc3BhY2UiLCJrZXkiLCJyYXciLCJ0YXJnZXREaXIiLCJsaW5lIiwic3BsaXQiLCJmaW5kIiwibCIsInN0YXJ0c1dpdGgiLCJ2YWx1ZSIsInNsaWNlIiwibGVuZ3RoIiwidHJpbSIsInVuZGVmaW5lZCIsInJhbmRvbVBhc3N3b3JkIiwidG9TdHJpbmciLCJ0b1NxbElkZW50RnJhZ21lbnQiLCJuYW1lIiwiY2xlYW5lZCIsInJlcGxhY2UiLCJwYXNzd29yZE9yRXhpc3RpbmciLCJmYWxsYmFja0V4aXN0aW5nS2V5cyIsImV4aXN0aW5nIiwiYWx0IiwidiIsIkRBVEFCQVNFX0JBU0VfQ09ORklHX1lBTUwiLCJEQVRBQkFTRV9ERVZfQ09ORklHX1lBTUwiLCJQT1NUR1JFU19JTklUX0JPT1RTVFJBUF9TSCIsIlNBTVBMRV9FTlRJVFlfVFMiLCJTQU1QTEVfUkVQT1NJVE9SWV9UUyIsImdldE9wdGlvbnMiLCJfd29ya3NwYWNlIiwiY2xpT3B0aW9ucyIsImRhdGFiYXNlUHJvdmlkZXIiLCJjaG9pY2VzIiwibGFiZWwiLCJzZWxlY3RlZCIsImMiLCJzY2FmZm9sZCIsIm9wdGlvbnMiLCJpZGVudCIsImRiIiwicG9zdGdyZXNTdXBlcnVzZXIiLCJwb3N0Z3Jlc1Bhc3N3b3JkIiwiYm9vdHN0cmFwVXNlciIsImJvb3RzdHJhcFBhc3N3b3JkIiwiYXBwVXNlciIsImFwcFBhc3N3b3JkIiwibWlncmF0ZVVzZXIiLCJtaWdyYXRlUGFzc3dvcmQiLCJkZXZDb250YWluZXIiLCJnZXRNb2RlbCIsIkRFVkNPTlRBSU5FUl9KU09OIiwiY29tcG9zZSIsIkRPQ0tFUl9DT01QT1NFIiwibmV0d29ya0tleSIsInZvbHVtZU5hbWUiLCJhZGRTZXJ2aWNlIiwiaW1hZ2UiLCJjb250YWluZXJfbmFtZSIsInJlc3RhcnQiLCJwb3J0cyIsInZvbHVtZXMiLCJuZXR3b3JrcyIsImFsaWFzZXMiLCJoZWFsdGhjaGVjayIsInRlc3QiLCJpbnRlcnZhbCIsInRpbWVvdXQiLCJyZXRyaWVzIiwiYWRkRW52RmlsZSIsImFkZFZvbHVtZSIsInByb2ZpbGVzIiwiYWRkRmlsZSIsImZpbGVzIiwiZmlsZVBhdGgiLCJjb250ZW50IiwiYWRkRXh0ZW5zaW9uIiwiTUFJTl9UUyIsImFkZFNpZGVFZmZlY3RJbXBvcnQiLCJhZGRFbnRpdHkiLCJjbGFzc05hbWUiLCJpbXBvcnRQYXRoIiwiYWRkUmVwb3NpdG9yeSIsIlBBQ0tBR0VfSlNPTiIsImFkZERlcGVuZGVuY3kiLCJhZGRTY3JpcHQiLCJBUElfUEFDS0FHRV9KU09OIiwiQ09ORklHX1lBTUwiLCJhZGRTZWN0aW9uIiwiQ09ORklHX0RFVl9ZQU1MIiwiZ2V0UHJvamVjdCIsIkVOVl9GSUxFIiwiYWRkRW50cnkiLCJEYXRhYmFzZUZlYXR1cmUiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFdBQVcsUUFBUSxjQUFjO0FBQzFDLFNBQVNDLFlBQVksUUFBUSxVQUFVO0FBQ3ZDLFNBQVNDLElBQUksUUFBUSxZQUFZO0FBQ2pDLFNBQVNDLElBQUksUUFBUSx5QkFBeUI7QUFHOUMsU0FBU0MsZ0JBQWdCLFFBQVEsd0JBQXdCO0FBTXpELFNBQVNDLGNBQWMsUUFBUSxtQkFBbUI7QUFDbEQsU0FBU0Msa0JBQWtCLFFBQVEsbUJBQW1CO0FBUXRELGdFQUFnRSxHQUNoRSxTQUFTQyxxQkFBcUJDLFNBQTRCLEVBQUVDLEdBQVc7SUFDdEUsSUFBSTtRQUNILE1BQU1DLE1BQU1ULGFBQWFDLEtBQUtNLFVBQVVHLFNBQVMsRUFBRSxTQUFTO1FBQzVELE1BQU1DLE9BQU9GLElBQUlHLEtBQUssQ0FBQyxNQUFNQyxJQUFJLENBQUMsQ0FBQ0MsSUFBTUEsRUFBRUMsVUFBVSxDQUFDLEdBQUdQLElBQUksQ0FBQyxDQUFDO1FBQy9ELE1BQU1RLFFBQVFMLE1BQU1NLE1BQU1ULElBQUlVLE1BQU0sR0FBRyxHQUFHQztRQUMxQyxPQUFPSCxTQUFTSTtJQUNqQixFQUFFLE9BQU07UUFDUCxPQUFPQTtJQUNSO0FBQ0Q7QUFFQSxTQUFTQztJQUNSLE9BQU90QixZQUFZLElBQUl1QixRQUFRLENBQUM7QUFDakM7QUFFQSw2REFBNkQsR0FDN0QsU0FBU0MsbUJBQW1CQyxJQUFZO0lBQ3ZDLE1BQU1DLFVBQVVELEtBQUtFLE9BQU8sQ0FBQyxrQkFBa0IsS0FBS0EsT0FBTyxDQUFDLGlCQUFpQjtJQUM3RSxPQUFPRCxRQUFRUCxNQUFNLEdBQUcsSUFBSU8sUUFBUVIsS0FBSyxDQUFDLEdBQUcsTUFBTTtB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