fmode-ng 0.0.243 → 0.0.245

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.
@@ -9,8 +9,17 @@ export class MessageManager {
9
9
  constructor(options) {
10
10
  this._messageList = []; // 统一的消息列表
11
11
  this._isLoaded = false;
12
+ options.limitHistory = options?.limitHistory || 10;
12
13
  this.options = options;
13
14
  }
15
+ getCompanyPointer() {
16
+ let cid = this.options?.company?.objectId || this.options?.company?.id || localStorage.getItem("company");
17
+ return {
18
+ __type: "Pointer",
19
+ className: "Company",
20
+ objectId: cid
21
+ };
22
+ }
14
23
  /**
15
24
  * 获取统一的消息列表
16
25
  */
@@ -55,43 +64,34 @@ export class MessageManager {
55
64
  messageObj.set("status", "sent");
56
65
  messageObj.set("createdAt", message.createdAt || new Date());
57
66
  messageObj.set("complete", message.complete || false);
58
- // 设置内容
59
- if (message.content) {
60
- if (typeof message.content === "string") {
61
- messageObj.set("content", {
62
- type: "text",
63
- text: message.content
64
- });
65
- }
66
- else if (Array.isArray(message.content)) {
67
- messageObj.set("content", {
68
- type: "mixed",
69
- items: message.content
70
- });
71
- }
72
- else {
73
- messageObj.set("content", message.content);
74
- }
75
- }
76
- // 设置角色
67
+ // 设置消息角色(user/assistant/system)- 这是消息的发送者角色
77
68
  if (message.role) {
78
- messageObj.set("role", message.role);
69
+ messageObj.set("role", this.options.role.toPointer());
70
+ }
71
+ // 设置内容 - 保持原始格式兼容(string 或 Array)
72
+ // 同时扩展存储格式,支持更多元数据
73
+ if (message.content !== undefined) {
74
+ messageObj.set("content", message);
79
75
  }
80
- // 设置其他属性
81
- if (message.json)
82
- messageObj.set("json", message.json);
83
- if (message.hidden)
84
- messageObj.set("hidden", message.hidden);
85
- if (message.voice)
86
- messageObj.set("voice", message.voice);
87
- if (message.cid)
88
- messageObj.set("cid", message.cid);
89
76
  // 根据场景设置关联对象
77
+ // avatarRole:指向 AvatarRole 表的指针(智能体角色)
90
78
  if (targetScene === MessageScene.ROLE && this.options.role) {
91
- messageObj.set("role", this.options.role.toPointer());
79
+ messageObj.set("avatarRole", this.options.role.toPointer());
92
80
  }
81
+ // company:指向 Company 表的指针
93
82
  if (this.options.company) {
94
- messageObj.set("company", this.options.company.toPointer());
83
+ messageObj.set("company", this.getCompanyPointer());
84
+ }
85
+ // 关键:如果chatSession已存在且有id,立即关联
86
+ // 如果chatSession还没有id(新会话),标记为待关联
87
+ if (this.options.chatSession) {
88
+ if (this.options.chatSession.id) {
89
+ messageObj.set("session", this.options.chatSession.toPointer());
90
+ }
91
+ else {
92
+ // 新会话,标记待关联,等待session保存后再关联
93
+ messageObj.set("_pendingSession", true);
94
+ }
95
95
  }
96
96
  // 直接添加到列表末尾
97
97
  this._messageList.push(messageObj);
@@ -104,50 +104,90 @@ export class MessageManager {
104
104
  }
105
105
  /**
106
106
  * 异步保存消息对象
107
+ * 增强版:处理session关联和延迟保存
107
108
  */
108
109
  async saveMessage(messageObj) {
109
- if (!messageObj.id) {
110
- try {
111
- await messageObj.save();
110
+ if (!messageObj)
111
+ return;
112
+ try {
113
+ // 检查是否需要关联session(对于新会话的消息)
114
+ if (!messageObj.get("session") && this.options.chatSession?.id) {
115
+ messageObj.set("session", this.options.chatSession.toPointer());
116
+ }
117
+ // 确保消息有关联的session才保存到Message表
118
+ // 如果没有session且不是老消息转换的,先不保存(只存在于内存)
119
+ if (!messageObj.get("session") && !messageObj.get("isLegacy")) {
120
+ // 没有session的消息暂时不保存到Message表
121
+ // 等session创建后会再次调用saveMessage
122
+ console.log("消息等待session创建后保存");
123
+ return;
112
124
  }
113
- catch (error) {
114
- console.error("保存消息对象失败:", error);
125
+ await messageObj.save();
126
+ }
127
+ catch (error) {
128
+ console.error("保存消息对象失败:", error);
129
+ }
130
+ }
131
+ /**
132
+ * 在session创建/更新后,保存所有待关联的消息
133
+ * 关键方法:在chatSession保存成功后调用
134
+ */
135
+ async savePendingMessages() {
136
+ if (!this.options.chatSession?.id) {
137
+ console.warn("session未保存,无法保存待处理消息");
138
+ return;
139
+ }
140
+ const savePromises = [];
141
+ for (const messageObj of this._messageList) {
142
+ // 处理待关联的消息
143
+ // if (messageObj.get("_pendingSession")) {
144
+ messageObj.set("session", messageObj?.get("session") || this.options.chatSession.toPointer());
145
+ // messageObj.set("_pendingSession", undefined);
146
+ // }
147
+ // 保存所有没有id的消息(新消息)
148
+ if (!messageObj.id) {
149
+ if (!messageObj?.get("hidden")) {
150
+ savePromises.push(this.saveMessage(messageObj));
151
+ }
115
152
  }
116
153
  }
154
+ if (savePromises.length > 0) {
155
+ await Promise.all(savePromises);
156
+ console.log(`保存了 ${savePromises.length} 条待处理消息`);
157
+ }
158
+ }
159
+ /**
160
+ * 更新chatSession引用(当新会话第一次保存后)
161
+ */
162
+ updateChatSession(chatSession) {
163
+ this.options.chatSession = chatSession;
117
164
  }
118
165
  /**
119
166
  * 更新消息(优化版)
120
- * 直接通过下标更新消息对象属性
167
+ * 直接通过下标更新消息对象属性,返回是否成功
121
168
  */
122
169
  updateMessage(index, message) {
123
170
  if (index < 0 || index >= this._messageList.length)
124
- return;
171
+ return null;
125
172
  const messageObj = this._messageList[index];
126
173
  if (!messageObj)
127
- return;
128
- // 更新内容
174
+ return null;
175
+ // 更新消息角色
176
+ if (message.role) {
177
+ messageObj.set("role", this.options.role.toPointer());
178
+ }
179
+ // 更新内容 - 保持原始格式兼容
180
+ // 从现有 content 中获取完整的 FmodeChatMessage 对象,然后更新字段
129
181
  if (message.content !== undefined) {
130
- if (typeof message.content === "string") {
131
- messageObj.set("content", {
132
- type: "text",
133
- text: message.content
134
- });
135
- }
136
- else if (Array.isArray(message.content)) {
137
- messageObj.set("content", {
138
- type: "mixed",
139
- items: message.content
140
- });
141
- }
142
- else {
143
- messageObj.set("content", message.content);
144
- }
182
+ const existingContent = messageObj.get("content") || {};
183
+ messageObj.set("content", {
184
+ ...existingContent,
185
+ content: message.content
186
+ });
145
187
  }
146
188
  // 更新其他属性
147
189
  if (message.complete !== undefined)
148
190
  messageObj.set("complete", message.complete);
149
- if (message.role)
150
- messageObj.set("role", message.role);
151
191
  if (message.json)
152
192
  messageObj.set("json", message.json);
153
193
  if (message.hidden)
@@ -156,6 +196,16 @@ export class MessageManager {
156
196
  messageObj.set("voice", message.voice);
157
197
  if (message.cid)
158
198
  messageObj.set("cid", message.cid);
199
+ return messageObj;
200
+ }
201
+ /**
202
+ * 更新消息并异步保存
203
+ */
204
+ async updateMessageAndSave(index, message) {
205
+ const messageObj = this.updateMessage(index, message);
206
+ if (!messageObj?.get("hidden")) {
207
+ await this.saveMessage(messageObj);
208
+ }
159
209
  }
160
210
  /**
161
211
  * 重新加载消息
@@ -178,20 +228,35 @@ export class MessageManager {
178
228
  const MessageClass = Parse.Object.extend("Message");
179
229
  const messageObj = new MessageClass();
180
230
  // 复制老版消息属性
181
- messageObj.set("role", legacyMsg.role);
231
+ messageObj.set("role", this.options.role.toPointer());
182
232
  messageObj.set("content", legacyMsg.content);
183
233
  messageObj.set("complete", legacyMsg.complete);
184
234
  messageObj.set("createdAt", legacyMsg.createdAt);
185
235
  messageObj.set("voice", legacyMsg.voice);
186
236
  messageObj.set("cid", legacyMsg.cid);
187
237
  messageObj.set("isLegacy", true);
238
+ // 为老消息同步创建 contentData,保持格式统一
239
+ if (typeof legacyMsg.content === "string") {
240
+ messageObj.set("contentData", {
241
+ type: "text",
242
+ text: legacyMsg.content,
243
+ role: legacyMsg.role
244
+ });
245
+ }
246
+ else if (Array.isArray(legacyMsg.content)) {
247
+ messageObj.set("contentData", {
248
+ type: "mixed",
249
+ items: legacyMsg.content,
250
+ role: legacyMsg.role
251
+ });
252
+ }
188
253
  this._messageList.push(messageObj);
189
254
  }
190
255
  // 2. 加载新版消息
191
256
  let newMessages = [];
192
257
  switch (this.options.scene) {
193
258
  case MessageScene.ROLE:
194
- if (this.options.chatSession) {
259
+ if (this.options.role) {
195
260
  newMessages = await this.loadRoleMessages();
196
261
  }
197
262
  break;
@@ -224,10 +289,11 @@ export class MessageManager {
224
289
  * 加载角色对话消息
225
290
  */
226
291
  async loadRoleMessages() {
227
- if (!this.options.chatSession)
292
+ if (!this.options.role?.id)
228
293
  return [];
229
294
  const query = new Parse.Query("Message");
230
- query.equalTo("session", this.options.chatSession);
295
+ query.exists("content");
296
+ query.equalTo("role", this.options.role?.id);
231
297
  query.addAscending("createdAt");
232
298
  query.limit(1000); // 限制数量避免性能问题
233
299
  return await query.find();
@@ -239,6 +305,7 @@ export class MessageManager {
239
305
  if (!this.options.group)
240
306
  return [];
241
307
  const query = new Parse.Query("Message");
308
+ query.exists("content");
242
309
  query.equalTo("group", this.options.group);
243
310
  query.addAscending("createdAt");
244
311
  query.limit(1000);
@@ -251,6 +318,7 @@ export class MessageManager {
251
318
  if (!this.options.userFrom || !this.options.userTo)
252
319
  return [];
253
320
  const query = new Parse.Query("Message");
321
+ query.exists("content");
254
322
  query.containedIn("userFrom", [this.options.userFrom, this.options.userTo]);
255
323
  query.containedIn("userTo", [this.options.userFrom, this.options.userTo]);
256
324
  query.addAscending("createdAt");
@@ -264,6 +332,7 @@ export class MessageManager {
264
332
  if (!this.options.contact)
265
333
  return [];
266
334
  const query = new Parse.Query("Message");
335
+ query.exists("content");
267
336
  query.equalTo("contact", this.options.contact);
268
337
  query.addAscending("createdAt");
269
338
  query.limit(1000);
@@ -321,4 +390,4 @@ export class MessageManager {
321
390
  });
322
391
  }
323
392
  }
324
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1tYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZm1vZGUtbmcvc3JjL2xpYi9jb3JlL2FnZW50L2NoYXQvbWVzc2FnZS9tZXNzYWdlLW1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFlLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRWpFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDekMsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQWdCdEM7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFLdkIsWUFBWSxPQUE4QjtRQUhsQyxpQkFBWSxHQUFrQixFQUFFLENBQUMsQ0FBQyxVQUFVO1FBQzVDLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFHL0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDM0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFdBQVc7UUFDYixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2xCLE1BQU0sSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQzFCLENBQUM7UUFDRCxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVEOzs7T0FHRztJQUNILGlCQUFpQjtRQUNiLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxjQUFjO1FBQ1YsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzdCLENBQUM7SUFFRDs7T0FFRztJQUNILFVBQVUsQ0FBQyxLQUFhO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FB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Q0FBQztJQUNQLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZtb2RlT2JqZWN0LCBGbW9kZVBhcnNlIH0gZnJvbSBcIi4uLy4uLy4uLy4uL2NvcmUvcGFyc2VcIjtcclxuaW1wb3J0IHsgRm1vZGVDaGF0TWVzc2FnZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VcIjtcclxuaW1wb3J0IHsgTWVzc2FnZVNjZW5lIH0gZnJvbSBcIi4vbWVzc2FnZVwiO1xyXG5jb25zdCBQYXJzZSA9IEZtb2RlUGFyc2Uud2l0aChcIm5vdmFcIik7XHJcblxyXG4vKipcclxuICogTWVzc2FnZU1hbmFnZXJPcHRpb25zIC0g5raI5oGv566h55CG5Zmo6YWN572uXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2VNYW5hZ2VyT3B0aW9ucyB7XHJcbiAgICBjaGF0U2Vzc2lvbj86IEZtb2RlT2JqZWN0OyAgICAgLy8g5Y+v6YCJ55qE5Lya6K+d5a+56LGh77yI5pm66IO95L2T5a+56K+d5Zy65pmv77yJXHJcbiAgICByb2xlPzogRm1vZGVPYmplY3Q7ICAgICAgICAgICAgLy8g5Y+v6YCJ55qE6KeS6Imy5a+56LGh77yI5pm66IO95L2T5a+56K+d5Zy65pmv77yJXHJcbiAgICBjb21wYW55OiBGbW9kZU9iamVjdDsgICAgICAgICAgLy8g5b+F6ZyA55qE5LyB5Lia5a+56LGhXHJcbiAgICBncm91cD86IEZtb2RlT2JqZWN0OyAgICAgICAgICAvLyDnvqTogYrlr7nosaHvvIjnvqTogYrlnLrmma/vvIlcclxuICAgIHVzZXJGcm9tPzogRm1vZGVPYmplY3Q7ICAgICAgIC8vIOWPkemAgeiAhe+8iOengeiBiuWcuuaZr++8iVxyXG4gICAgdXNlclRvPzogRm1vZGVPYmplY3Q7ICAgICAgICAgLy8g5o6l5pS26ICF77yI56eB6IGK5Zy65pmv77yJXHJcbiAgICBjb250YWN0PzogRm1vZGVPYmplY3Q7ICAgICAgICAvLyDogZTns7vkurrvvIjlrqLmnI3lnLrmma/vvIlcclxuICAgIHNjZW5lPzogTWVzc2FnZVNjZW5lOyAgICAgICAgIC8vIOa2iOaBr+WcuuaZr1xyXG59XHJcblxyXG4vKipcclxuICogTWVzc2FnZU1hbmFnZXIgLSDkvJjljJbniYjmtojmga/nrqHnkIblmahcclxuICog6IGM6LSj77ya57uf5LiA566h55CG5raI5oGv5YiX6KGo77yM5pSv5oyB6auY5pWI55qE5aKe6YeP5pu05paw5ZKM5LiL5qCH6K6/6ZeuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgTWVzc2FnZU1hbmFnZXIge1xyXG4gICAgcHJpdmF0ZSBvcHRpb25zOiBNZXNzYWdlTWFuYWdlck9wdGlvbnM7XHJcbiAgICBwcml2YXRlIF9tZXNzYWdlTGlzdDogRm1vZGVPYmplY3RbXSA9IFtdOyAvLyDnu5/kuIDnmoTmtojmga/liJfooahcclxuICAgIHByaXZhdGUgX2lzTG9hZGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogTWVzc2FnZU1hbmFnZXJPcHRpb25zKSB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiOt+WPlue7n+S4gOeahOa2iOaBr+WIl+ihqFxyXG4gICAgICovXHJcbiAgICBhc3luYyBnZXRNZXNzYWdlcygpOiBQcm9taXNlPEZtb2RlT2JqZWN0W10+IHtcclxuICAgICAgICBpZiAoIXRoaXMuX2lzTG9hZGVkKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubG9hZE1lc3NhZ2VzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2lzTG9hZGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLl9tZXNzYWdlTGlzdF07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDojrflj5bnvJPlrZjnmoTmtojmga/liJfooajvvIjlkIzmraXmlrnms5XvvIznlKjkuo7nu4Tku7bnu5HlrprvvIlcclxuICAgICAqIOebtOaOpei/lOWbnuW9k+WJjea2iOaBr+WIl+ihqO+8jOS4jei/m+ihjOW8guatpeWKoOi9vVxyXG4gICAgICovXHJcbiAgICBnZXRDYWNoZWRNZXNzYWdlcygpOiBGbW9kZU9iamVjdFtdIHtcclxuICAgICAgICByZXR1cm4gWy4uLnRoaXMuX21lc3NhZ2VMaXN0XTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOebtOaOpeiuv+mXrua2iOaBr+WIl+ihqO+8iOeUqOS6juS4i+agh+iuv+mXru+8iVxyXG4gICAgICovXHJcbiAgICBnZXRNZXNzYWdlTGlzdCgpOiBGbW9kZU9iamVjdFtdIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbWVzc2FnZUxpc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDpgJrov4fkuIvmoIfojrflj5bmtojmga9cclxuICAgICAqL1xyXG4gICAgZ2V0TWVzc2FnZShpbmRleDogbnVtYmVyKTogRm1vZGVPYmplY3QgfCB1bmRlZmluZWQge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9tZXNzYWdlTGlzdFtpbmRleF07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmt7vliqDmlrDmtojmga/vvIjkvJjljJbniYjvvIlcclxuICAgICAqIOebtOaOpeWIm+W7ukZtb2RlT2JqZWN05bm25re75Yqg5Yiw5YiX6KGo5pyr5bC+77yM5bu26L+f5L+d5a2YXHJcbiAgICAgKi9cclxuICAgIGFkZE1lc3NhZ2UobWVzc2FnZTogRm1vZGVDaGF0TWVzc2FnZSwgc2NlbmU/OiBNZXNzYWdlU2NlbmUpOiBGbW9kZU9iamVjdCB7XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0U2NlbmUgPSBzY2VuZSB8fCB0aGlzLm9wdGlvbnMuc2NlbmUgfHwgTWVzc2FnZVNjZW5lLlJPTEU7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8vIOWIm+W7uuaWsOeahOa2iOaBr+Wvueixoe+8iOacquS/neWtmO+8iVxyXG4gICAgICAgICAgICBjb25zdCBNZXNzYWdlQ2xhc3MgPSBQYXJzZS5PYmplY3QuZXh0ZW5kKFwiTWVzc2FnZVwiKTtcclxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZU9iaiA9IG5ldyBNZXNzYWdlQ2xhc3MoKTtcclxuXHJcbiAgICAgICAgICAgIC8vIOiuvue9ruWfuuacrOS/oeaBr1xyXG4gICAgICAgICAgICBtZXNzYWdlT2JqLnNldChcInNjZW5lXCIsIHRhcmdldFNjZW5lKTtcclxuICAgICAgICAgICAgbWVzc2FnZU9iai5zZXQoXCJzdGF0dXNcIiwgXCJzZW50XCIpO1xyXG4gICAgICAgICAgICBtZXNzYWdlT2JqLnNldChcImNyZWF0ZWRBdFwiLCBtZXNzYWdlLmNyZWF0ZWRBdCB8fCBuZXcgRGF0ZSgpKTtcclxuICAgICAgICAgICAgbWVzc2FnZU9iai5zZXQoXCJjb21wbGV0ZVwiLCBtZXNzYWdlLmNvbXBsZXRlIHx8IGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgIC8vIOiuvue9ruWGheWuuVxyXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5jb250ZW50KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG1lc3NhZ2UuY29udGVudCA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VPYmouc2V0KFwiY29udGVudFwiLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBtZXNzYWdlLmNvbnRlbnRcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShtZXNzYWdlLmNvbnRlbnQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZU9iai5zZXQoXCJjb250ZW50XCIsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJtaXhlZFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtczogbWVzc2FnZS5jb250ZW50XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VPYmouc2V0KFwiY29udGVudFwiLCBtZXNzYWdlLmNvbnRlbnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyDorr7nva7op5LoibJcclxuICAgICAgICAgICAgaWYgKG1lc3NhZ2Uucm9sZSkge1xyXG4gICAgICAgICAgICAgICAgbWVzc2FnZU9iai5zZXQoXCJyb2xlXCIsIG1lc3NhZ2Uucm9sZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIOiuvue9ruWFtuS7luWxnuaAp1xyXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5qc29uKSBtZXNzYWdlT2JqLnNldChcImpzb25cIiwgbWVzc2FnZS5qc29uKTtcclxuICAgICAgICAgICAgaWYgKG1lc3NhZ2UuaGlkZGVuKSBtZXNzYWdlT2JqLnNldChcImhpZGRlblwiLCBtZXNzYWdlLmhpZGRlbik7XHJcbiAgICAgICAgICAgIGlmIChtZXNzYWdlLnZvaWNlKSBtZXNzYWdlT2JqLnNldChcInZvaWNlXCIsIG1lc3NhZ2Uudm9pY2UpO1xyXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5jaWQpIG1lc3NhZ2VPYmouc2V0KFwiY2lkXCIsIG1lc3NhZ2UuY2lkKTtcclxuXHJcbiAgICAgICAgICAgIC8vIOagueaNruWcuuaZr+iuvue9ruWFs+iBlOWvueixoVxyXG4gICAgICAgICAgICBpZiAodGFyZ2V0U2NlbmUgPT09IE1lc3NhZ2VTY2VuZS5ST0xFICYmIHRoaXMub3B0aW9ucy5yb2xlKSB7XHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlT2JqLnNldChcInJvbGVcIiwgdGhpcy5vcHRpb25zLnJvbGUudG9Qb2ludGVyKCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGFueSkge1xyXG4gICAgICAgICAgICAgICAgbWVzc2FnZU9iai5zZXQoXCJjb21wYW55XCIsIHRoaXMub3B0aW9ucy5jb21wYW55LnRvUG9pbnRlcigpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8g55u05o6l5re75Yqg5Yiw5YiX6KGo5pyr5bC+XHJcbiAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VMaXN0LnB1c2gobWVzc2FnZU9iaik7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gbWVzc2FnZU9iajtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwi5Yib5bu65paw5raI5oGv5aSx6LSlOlwiLCBlcnJvcik7XHJcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOW8guatpeS/neWtmOa2iOaBr+WvueixoVxyXG4gICAgICovXHJcbiAgICBhc3luYyBzYXZlTWVzc2FnZShtZXNzYWdlT2JqOiBGbW9kZU9iamVjdCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGlmICghbWVzc2FnZU9iai5pZCkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgbWVzc2FnZU9iai5zYXZlKCk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwi5L+d5a2Y5raI5oGv5a+56LGh5aSx6LSlOlwiLCBlcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmm7TmlrDmtojmga/vvIjkvJjljJbniYjvvIlcclxuICAgICAqIOebtOaOpemAmui/h+S4i+agh+abtOaWsOa2iOaBr+WvueixoeWxnuaAp1xyXG4gICAgICovXHJcbiAgICB1cGRhdGVNZXNzYWdlKGluZGV4OiBudW1iZXIsIG1lc3NhZ2U6IFBhcnRpYWw8Rm1vZGVDaGF0TWVzc2FnZT4pOiB2b2lkIHtcclxuICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMuX21lc3NhZ2VMaXN0Lmxlbmd0aCkgcmV0dXJuO1xyXG5cclxuICAgICAgICBjb25zdCBtZXNzYWdlT2JqID0gdGhpcy5fbWVzc2FnZUxpc3RbaW5kZXhdO1xyXG4gICAgICAgIGlmICghbWVzc2FnZU9iaikgcmV0dXJuO1xyXG5cclxuICAgICAgICAvLyDmm7TmlrDlhoXlrrlcclxuICAgICAgICBpZiAobWVzc2FnZS5jb250ZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlLmNvbnRlbnQgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2VPYmouc2V0KFwiY29udGVudFwiLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogbWVzc2FnZS5jb250ZW50XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG1lc3NhZ2UuY29udGVudCkpIHtcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2VPYmouc2V0KFwiY29udGVudFwiLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJtaXhlZFwiLFxyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBtZXNzYWdlLmNvbnRlbnRcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbWVzc2FnZU9iai5zZXQoXCJjb250ZW50XCIsIG1lc3NhZ2UuY29udGVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIOabtOaWsOWFtuS7luWxnuaAp1xyXG4gICAgICAgIGlmIChtZXNzYWdlLmNvbXBsZXRlICE9PSB1bmRlZmluZWQpIG1lc3NhZ2VPYmouc2V0KFwiY29tcGxldGVcIiwgbWVzc2FnZS5jb21wbGV0ZSk7XHJcbiAgICAgICAgaWYgKG1lc3NhZ2Uucm9sZSkgbWVzc2FnZU9iai5zZXQoXCJyb2xlXCIsIG1lc3NhZ2Uucm9sZSk7XHJcbiAgICAgICAgaWYgKG1lc3NhZ2UuanNvbikgbWVzc2FnZU9iai5zZXQoXCJqc29uXCIsIG1lc3NhZ2UuanNvbik7XHJcbiAgICAgICAgaWYgKG1lc3NhZ2UuaGlkZGVuKSBtZXNzYWdlT2JqLnNldChcImhpZGRlblwiLCBtZXNzYWdlLmhpZGRlbik7XHJcbiAgICAgICAgaWYgKG1lc3NhZ2Uudm9pY2UpIG1lc3NhZ2VPYmouc2V0KFwidm9pY2VcIiwgbWVzc2FnZS52b2ljZSk7XHJcbiAgICAgICAgaWYgKG1lc3NhZ2UuY2lkKSBtZXNzYWdlT2JqLnNldChcImNpZFwiLCBtZXNzYWdlLmNpZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDph43mlrDliqDovb3mtojmga9cclxuICAgICAqL1xyXG4gICAgYXN5bmMgcmVsb2FkTWVzc2FnZXMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgdGhpcy5fbWVzc2FnZUxpc3QgPSBbXTtcclxuICAgICAgICB0aGlzLl9pc0xvYWRlZCA9IGZhbHNlO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuZ2V0TWVzc2FnZXMoKTsgLy8g6Kem5Y+R6YeN5paw5Yqg6L29XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDliqDovb3mtojmga/vvIjkvJjljJbniYjvvIlcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhc3luYyBsb2FkTWVzc2FnZXMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgdGhpcy5fbWVzc2FnZUxpc3QgPSBbXTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy8gMS4g6aaW5YWI5Yqg6L296ICB54mI5raI5oGv77yI5aaC5p6c5pyJ77yJXHJcbiAgICAgICAgICAgIGNvbnN0IGxlZ2FjeU1lc3NhZ2VzID0gdGhpcy5vcHRpb25zLmNoYXRTZXNzaW9uPy5nZXQoXCJtZXNzYWdlTGlzdFwiKSB8fCBbXTtcclxuXHJcbiAgICAgICAgICAgIC8vIOi9rOaNouiAgeeJiOa2iOaBr+S4ukZtb2RlT2JqZWN077yI5LuF55So5LqO5bGV56S677yJXHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGVnYWN5TXNnIG9mIGxlZ2FjeU1lc3NhZ2VzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlQ2xhc3MgPSBQYXJzZS5PYmplY3QuZXh0ZW5kKFwiTWVzc2FnZVwiKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VPYmogPSBuZXcgTWVzc2FnZUNsYXNzKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8g5aSN5Yi26ICB54mI5raI5oGv5bGe5oCnXHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlT2JqLnNldChcInJvbGVcIiwgbGVnYWN5TXNnLnJvbGUpO1xyXG4gICAgICAgICAgICAgICAgbWVzc2FnZU9iai5zZXQoXCJjb250ZW50XCIsIGxlZ2FjeU1zZy5jb250ZW50KTtcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2VPYmouc2V0KFwiY29tcGxldGVcIiwgbGVnYWN5TXNnLmNvbXBsZXRlKTtcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2VPYmouc2V0KFwiY3JlYXRlZEF0XCIsIGxlZ2FjeU1zZy5jcmVhdGVkQXQpO1xyXG4gICAgICAgICAgICAgICAgbWVzc2FnZU9iai5zZXQoXCJ2b2ljZVwiLCBsZWdhY3lNc2cudm9pY2UpO1xyXG4gICAgICAgICAgICAgICAgbWVzc2FnZU9iai5zZXQoXCJjaWRcIiwgbGVnYWN5TXNnLmNpZCk7XHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlT2JqLnNldChcImlzTGVnYWN5XCIsIHRydWUpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VMaXN0LnB1c2gobWVzc2FnZU9iaik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIDIuIOWKoOi9veaWsOeJiOa2iOaBr1xyXG4gICAgICAgICAgICBsZXQgbmV3TWVzc2FnZXM6IEZtb2RlT2JqZWN0W10gPSBbXTtcclxuXHJcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5vcHRpb25zLnNjZW5lKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIE1lc3NhZ2VTY2VuZS5ST0xFOlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY2hhdFNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3TWVzc2FnZXMgPSBhd2FpdCB0aGlzLmxvYWRSb2xlTWVzc2FnZXMoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIE1lc3NhZ2VTY2VuZS5HUk9VUDpcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld01lc3NhZ2VzID0gYXdhaXQgdGhpcy5sb2FkR3JvdXBNZXNzYWdlcygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgTWVzc2FnZVNjZW5lLlVTRVI6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy51c2VyRnJvbSAmJiB0aGlzLm9wdGlvbnMudXNlclRvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld01lc3NhZ2VzID0gYXdhaXQgdGhpcy5sb2FkVXNlck1lc3NhZ2VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBNZXNzYWdlU2NlbmUuU0VSVklDRTpcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbnRhY3QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3TWVzc2FnZXMgPSBhd2FpdCB0aGlzLmxvYWRTZXJ2aWNlTWVzc2FnZXMoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIG5ld01lc3NhZ2VzID0gW107XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIDMuIOWwhuaWsOa2iOaBr+a3u+WKoOWIsOWIl+ihqOacq+WwvlxyXG4gICAgICAgICAgICB0aGlzLl9tZXNzYWdlTGlzdC5wdXNoKC4uLm5ld01lc3NhZ2VzKTtcclxuXHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIuWKoOi9vea2iOaBr+Wksei0pTpcIiwgZXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWKoOi9veinkuiJsuWvueivnea2iOaBr1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFzeW5jIGxvYWRSb2xlTWVzc2FnZXMoKTogUHJvbWlzZTxGbW9kZU9iamVjdFtdPiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuY2hhdFNlc3Npb24pIHJldHVybiBbXTtcclxuXHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBuZXcgUGFyc2UuUXVlcnkoXCJNZXNzYWdlXCIpO1xyXG4gICAgICAgIHF1ZXJ5LmVxdWFsVG8oXCJzZXNzaW9uXCIsIHRoaXMub3B0aW9ucy5jaGF0U2Vzc2lvbik7XHJcbiAgICAgICAgcXVlcnkuYWRkQXNjZW5kaW5nKFwiY3JlYXRlZEF0XCIpO1xyXG4gICAgICAgIHF1ZXJ5LmxpbWl0KDEwMDApOyAvLyDpmZDliLbmlbDph4/pgb/lhY3mgKfog73pl67pophcclxuXHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHF1ZXJ5LmZpbmQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWKoOi9vee+pOiBiua2iOaBr++8iOeugOWMlueJiO+8iVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFzeW5jIGxvYWRHcm91cE1lc3NhZ2VzKCk6IFByb21pc2U8Rm1vZGVPYmplY3RbXT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLmdyb3VwKSByZXR1cm4gW107XHJcblxyXG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFBhcnNlLlF1ZXJ5KFwiTWVzc2FnZVwiKTtcclxuICAgICAgICBxdWVyeS5lcXVhbFRvKFwiZ3JvdXBcIiwgdGhpcy5vcHRpb25zLmdyb3VwKTtcclxuICAgICAgICBxdWVyeS5hZGRBc2NlbmRpbmcoXCJjcmVhdGVkQXRcIik7XHJcbiAgICAgICAgcXVlcnkubGltaXQoMTAwMCk7XHJcblxyXG4gICAgICAgIHJldHVybiBhd2FpdCBxdWVyeS5maW5kKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDliqDovb3np4HogYrmtojmga/vvIjnroDljJbniYjvvIlcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhc3luYyBsb2FkVXNlck1lc3NhZ2VzKCk6IFByb21pc2U8Rm1vZGVPYmplY3RbXT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLnVzZXJGcm9tIHx8ICF0aGlzLm9wdGlvbnMudXNlclRvKSByZXR1cm4gW107XHJcblxyXG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFBhcnNlLlF1ZXJ5KFwiTWVzc2FnZVwiKTtcclxuICAgICAgICBxdWVyeS5jb250YWluZWRJbihcInVzZXJGcm9tXCIsIFt0aGlzLm9wdGlvbnMudXNlckZyb20sIHRoaXMub3B0aW9ucy51c2VyVG9dKTtcclxuICAgICAgICBxdWVyeS5jb250YWluZWRJbihcInVzZXJUb1wiLCBbdGhpcy5vcHRpb25zLnVzZXJGcm9tLCB0aGlzLm9wdGlvbnMudXNlclRvXSk7XHJcbiAgICAgICAgcXVlcnkuYWRkQXNjZW5kaW5nKFwiY3JlYXRlZEF0XCIpO1xyXG4gICAgICAgIHF1ZXJ5LmxpbWl0KDEwMDApO1xyXG5cclxuICAgICAgICByZXR1cm4gYXdhaXQgcXVlcnkuZmluZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yqg6L295a6i5pyN5raI5oGv77yI566A5YyW54mI77yJXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYXN5bmMgbG9hZFNlcnZpY2VNZXNzYWdlcygpOiBQcm9taXNlPEZtb2RlT2JqZWN0W10+IHtcclxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5jb250YWN0KSByZXR1cm4gW107XHJcblxyXG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFBhcnNlLlF1ZXJ5KFwiTWVzc2FnZVwiKTtcclxuICAgICAgICBxdWVyeS5lcXVhbFRvKFwiY29udGFjdFwiLCB0aGlzLm9wdGlvbnMuY29udGFjdCk7XHJcbiAgICAgICAgcXVlcnkuYWRkQXNjZW5kaW5nKFwiY3JlYXRlZEF0XCIpO1xyXG4gICAgICAgIHF1ZXJ5LmxpbWl0KDEwMDApO1xyXG5cclxuICAgICAgICByZXR1cm4gYXdhaXQgcXVlcnkuZmluZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6I635Y+W5raI5oGv57uf6K6hXHJcbiAgICAgKi9cclxuICAgIGdldFN0YXRzKCk6IHtcclxuICAgICAgICB0b3RhbDogbnVtYmVyO1xyXG4gICAgICAgIHVzZXI6IG51bWJlcjtcclxuICAgICAgICBhc3Npc3RhbnQ6IG51bWJlcjtcclxuICAgICAgICBzeXN0ZW06IG51bWJlcjtcclxuICAgIH0ge1xyXG4gICAgICAgIGNvbnN0IHN0YXRzID0ge1xyXG4gICAgICAgICAgICB0b3RhbDogdGhpcy5fbWVzc2FnZUxpc3QubGVuZ3RoLFxyXG4gICAgICAgICAgICB1c2VyOiAwLFxyXG4gICAgICAgICAgICBhc3Npc3RhbnQ6IDAsXHJcbiAgICAgICAgICAgIHN5c3RlbTogMFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuX21lc3NhZ2VMaXN0LmZvckVhY2gobXNnID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgcm9sZSA9IG1zZy5nZXQoXCJyb2xlXCIpO1xyXG4gICAgICAgICAgICBpZiAocm9sZSA9PT0gXCJ1c2VyXCIpIHN0YXRzLnVzZXIrKztcclxuICAgICAgICAgICAgaWYgKHJvbGUgPT09IFwiYXNzaXN0YW50XCIpIHN0YXRzLmFzc2lzdGFudCsrO1xyXG4gICAgICAgICAgICBpZiAocm9sZSA9PT0gXCJzeXN0ZW1cIikgc3RhdHMuc3lzdGVtKys7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBzdGF0cztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOa4heepuua2iOaBr+WIl+ihqFxyXG4gICAgICovXHJcbiAgICBjbGVhckNhY2hlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX21lc3NhZ2VMaXN0ID0gW107XHJcbiAgICAgICAgdGhpcy5faXNMb2FkZWQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiOt+WPluacgOaWsOa2iOaBr1xyXG4gICAgICovXHJcbiAgICBnZXRMYXN0TWVzc2FnZSgpOiBGbW9kZU9iamVjdCB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21lc3NhZ2VMaXN0Lmxlbmd0aCA+IDAgPyB0aGlzLl9tZXNzYWdlTGlzdFt0aGlzLl9tZXNzYWdlTGlzdC5sZW5ndGggLSAxXSA6IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiOt+WPlua2iOaBr+aVsOmHj1xyXG4gICAgICovXHJcbiAgICBnZXRNZXNzYWdlQ291bnQoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbWVzc2FnZUxpc3QubGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yib5bu66Z2Z5oCB5bel5Y6C5pa55rOV77yI5L+d5oyB5YW85a655oCn77yJXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBjcmVhdGVGb3JSb2xlKGNoYXRTZXNzaW9uOiBGbW9kZU9iamVjdCwgcm9sZTogRm1vZGVPYmplY3QsIGNvbXBhbnk6IEZtb2RlT2JqZWN0KTogTWVzc2FnZU1hbmFnZXIge1xyXG4gICAgICAgIHJldHVybiBuZXcgTWVzc2FnZU1hbmFnZXIoe1xyXG4gICAgICAgICAgICBjaGF0U2Vzc2lvbixcclxuICAgICAgICAgICAgcm9sZSxcclxuICAgICAgICAgICAgY29tcGFueSxcclxuICAgICAgICAgICAgc2NlbmU6IE1lc3NhZ2VTY2VuZS5ST0xFXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0iXX0=
393
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1tYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZm1vZGUtbmcvc3JjL2xpYi9jb3JlL2FnZW50L2NoYXQvbWVzc2FnZS9tZXNzYWdlLW1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFlLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRWpFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDekMsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQWlCdEM7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFLdkIsWUFBWSxPQUE4QjtRQUhsQyxpQkFBWSxHQUFrQixFQUFFLENBQUMsQ0FBQyxVQUFVO1FBQzVDLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFHL0IsT0FBTyxDQUFDLFlBQVksR0FBRyxPQUFPLEVBQUUsWUFBWSxJQUFJLEVBQUUsQ0FBQTtRQUNsRCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztJQUMzQixDQUFDO0lBRUQsaUJBQWlCO1FBQ2IsSUFBSSxHQUFHLEdBQUksSUFBWSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ2xILE9BQU87WUFDSCxNQUFNLEVBQUMsU0FBUztZQUNoQixTQUFTLEVBQUMsU0FBUztZQUNuQixRQUFRLEVBQUMsR0FBRztTQUNmLENBQUE7SUFDTCxDQUFDO0lBQ0Q7O09BRUc7SUFDSCxLQUFLLENBQUMsV0FBVztRQUNiLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbEIsTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDMUIsSUFB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O09BRUc7SUFDSCxNQUFNLENBQUMsYUFBYSxDQUFDLFdBQXdCLEVBQUUsSUFBaUIsRUFBRSxPQUFvQjtRQUNsRixPQUFPLElBQUksY0FBYyxDQUFDO1lBQ3RCLFdBQVc7WUFDWCxJQUFJO1lBQ0osT0FBTztZQUNQLEtBQUssRUFBRSxZQUFZLENBQUMsSUFBSTtTQUMzQixDQUFDLENBQUM7SUFDUCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGbW9kZU9iamVjdCwgRm1vZGVQYXJzZSB9IGZyb20gXCIuLi8uLi8uLi8uLi9jb3JlL3BhcnNlXCI7XHJcbmltcG9ydCB7IEZtb2RlQ2hhdE1lc3NhZ2UgfSBmcm9tIFwiLi4vaW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7IE1lc3NhZ2VTY2VuZSB9IGZyb20gXCIuL21lc3NhZ2VcIjtcclxuY29uc3QgUGFyc2UgPSBGbW9kZVBhcnNlLndpdGgoXCJub3ZhXCIpO1xyXG5cclxuLyoqXHJcbiAqIE1lc3NhZ2VNYW5hZ2VyT3B0aW9ucyAtIOa2iOaBr+euoeeQhuWZqOmFjee9rlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlTWFuYWdlck9wdGlvbnMge1xyXG4gICAgY2hhdFNlc3Npb24/OiBGbW9kZU9iamVjdDsgICAgIC8vIOWPr+mAieeahOS8muivneWvueixoe+8iOaZuuiDveS9k+WvueivneWcuuaZr++8iVxyXG4gICAgcm9sZT86IEZtb2RlT2JqZWN0OyAgICAgICAgICAgIC8vIOWPr+mAieeahOinkuiJsuWvueixoe+8iOaZuuiDveS9k+WvueivneWcuuaZr++8iVxyXG4gICAgY29tcGFueTogRm1vZGVPYmplY3Q7ICAgICAgICAgIC8vIOW/hemcgOeahOS8geS4muWvueixoVxyXG4gICAgZ3JvdXA/OiBGbW9kZU9iamVjdDsgICAgICAgICAgLy8g576k6IGK5a+56LGh77yI576k6IGK5Zy65pmv77yJXHJcbiAgICB1c2VyRnJvbT86IEZtb2RlT2JqZWN0OyAgICAgICAvLyDlj5HpgIHogIXvvIjnp4HogYrlnLrmma/vvIlcclxuICAgIHVzZXJUbz86IEZtb2RlT2JqZWN0OyAgICAgICAgIC8vIOaOpeaUtuiAhe+8iOengeiBiuWcuuaZr++8iVxyXG4gICAgY29udGFjdD86IEZtb2RlT2JqZWN0OyAgICAgICAgLy8g6IGU57O75Lq677yI5a6i5pyN5Zy65pmv77yJXHJcbiAgICBzY2VuZT86IE1lc3NhZ2VTY2VuZTsgICAgICAgICAvLyDmtojmga/lnLrmma9cclxuICAgIGxpbWl0SGlzdG9yeT86bnVtYmVyOyAvLyDljoblj7Lmtojmga/mlbDph4/pmZDliLYg6buY6K6kMTBcclxufVxyXG5cclxuLyoqXHJcbiAqIE1lc3NhZ2VNYW5hZ2VyIC0g5LyY5YyW54mI5raI5oGv566h55CG5ZmoXHJcbiAqIOiBjOi0o++8mue7n+S4gOeuoeeQhua2iOaBr+WIl+ihqO+8jOaUr+aMgemrmOaViOeahOWinumHj+abtOaWsOWSjOS4i+agh+iuv+mXrlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIE1lc3NhZ2VNYW5hZ2VyIHtcclxuICAgIHByaXZhdGUgb3B0aW9uczogTWVzc2FnZU1hbmFnZXJPcHRpb25zO1xyXG4gICAgcHJpdmF0ZSBfbWVzc2FnZUxpc3Q6IEZtb2RlT2JqZWN0W10gPSBbXTsgLy8g57uf5LiA55qE5raI5oGv5YiX6KGoXHJcbiAgICBwcml2YXRlIF9pc0xvYWRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE1lc3NhZ2VNYW5hZ2VyT3B0aW9ucykge1xyXG4gICAgICAgIG9wdGlvbnMubGltaXRIaXN0b3J5ID0gb3B0aW9ucz8ubGltaXRIaXN0b3J5IHx8IDEwXHJcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICBnZXRDb21wYW55UG9pbnRlcigpe1xyXG4gICAgICAgIGxldCBjaWQgPSAodGhpcyBhcyBhbnkpLm9wdGlvbnM/LmNvbXBhbnk/Lm9iamVjdElkIHx8IHRoaXMub3B0aW9ucz8uY29tcGFueT8uaWQgfHwgbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJjb21wYW55XCIpXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgX190eXBlOlwiUG9pbnRlclwiLFxyXG4gICAgICAgICAgICBjbGFzc05hbWU6XCJDb21wYW55XCIsXHJcbiAgICAgICAgICAgIG9iamVjdElkOmNpZFxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICog6I635Y+W57uf5LiA55qE5raI5oGv5YiX6KGoXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGdldE1lc3NhZ2VzKCk6IFByb21pc2U8Rm1vZGVPYmplY3RbXT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5faXNMb2FkZWQpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkTWVzc2FnZXMoKTtcclxuICAgICAgICAgICAgdGhpcy5faXNMb2FkZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gWy4uLnRoaXMuX21lc3NhZ2VMaXN0XTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiOt+WPlue8k+WtmOeahOa2iOaBr+WIl+ihqO+8iOWQjOatpeaWueazle+8jOeUqOS6jue7hOS7tue7keWumu+8iVxyXG4gICAgICog55u05o6l6L+U5Zue5b2T5YmN5raI5oGv5YiX6KGo77yM5LiN6L+b6KGM5byC5q2l5Yqg6L29XHJcbiAgICAgKi9cclxuICAgIGdldENhY2hlZE1lc3NhZ2VzKCk6IEZtb2RlT2JqZWN0W10ge1xyXG4gICAgICAgIHJldHVybiBbLi4udGhpcy5fbWVzc2FnZUxpc3RdO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog55u05o6l6K6/6Zeu5raI5oGv5YiX6KGo77yI55So5LqO5LiL5qCH6K6/6Zeu77yJXHJcbiAgICAgKi9cclxuICAgIGdldE1lc3NhZ2VMaXN0KCk6IEZtb2RlT2JqZWN0W10ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9tZXNzYWdlTGlzdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOmAmui/h+S4i+agh+iOt+WPlua2iOaBr1xyXG4gICAgICovXHJcbiAgICBnZXRNZXNzYWdlKGluZGV4OiBudW1iZXIpOiBGbW9kZU9iamVjdCB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21lc3NhZ2VMaXN0W2luZGV4XTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOa3u+WKoOaWsOa2iOaBr++8iOS8mOWMlueJiO+8iVxyXG4gICAgICog55u05o6l5Yib5bu6Rm1vZGVPYmplY3Tlubbmt7vliqDliLDliJfooajmnKvlsL7vvIzlu7bov5/kv53lrZhcclxuICAgICAqL1xyXG4gICAgYWRkTWVzc2FnZShtZXNzYWdlOiBGbW9kZUNoYXRNZXNzYWdlLCBzY2VuZT86IE1lc3NhZ2VTY2VuZSk6IEZtb2RlT2JqZWN0IHtcclxuICAgICAgICBjb25zdCB0YXJnZXRTY2VuZSA9IHNjZW5lIHx8IHRoaXMub3B0aW9ucy5zY2VuZSB8fCBNZXNzYWdlU2NlbmUuUk9MRTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy8g5Yib5bu65paw55qE5raI5oGv5a+56LGh77yI5pyq5L+d5a2Y77yJXHJcbiAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2VDbGFzcyA9IFBhcnNlLk9iamVjdC5leHRlbmQoXCJNZXNzYWdlXCIpO1xyXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlT2JqID0gbmV3IE1lc3NhZ2VDbGFzcygpO1xyXG5cclxuICAgICAgICAgICAgLy8g6K6+572u5Z+65pys5L+h5oGvXHJcbiAgICAgICAgICAgIG1lc3NhZ2VPYmouc2V0KFwic2NlbmVcIiwgdGFyZ2V0U2NlbmUpO1xyXG4gICAgICAgICAgICBtZXNzYWdlT2JqLnNldChcInN0YXR1c1wiLCBcInNlbnRcIik7XHJcbiAgICAgICAgICAgIG1lc3NhZ2VPYmouc2V0KFwiY3JlYXRlZEF0XCIsIG1lc3NhZ2UuY3JlYXRlZEF0IHx8IG5ldyBEYXRlKCkpO1xyXG4gICAgICAgICAgICBtZXNzYWdlT2JqLnNldChcImNvbXBsZXRlXCIsIG1lc3NhZ2UuY29tcGxldGUgfHwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgLy8g6K6+572u5raI5oGv6KeS6Imy77yIdXNlci9hc3Npc3RhbnQvc3lzdGVt77yJLSDov5nmmK/mtojmga/nmoTlj5HpgIHogIXop5LoibJcclxuICAgICAgICAgICAgaWYgKG1lc3NhZ2Uucm9sZSkge1xyXG4gICAgICAgICAgICAgICAgbWVzc2FnZU9iai5zZXQoXCJyb2xlXCIsIHRoaXMub3B0aW9ucy5yb2xlLnRvUG9pbnRlcigpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8g6K6+572u5YaF5a65IC0g5L+d5oyB5Y6f5aeL5qC85byP5YW85a6577yIc3RyaW5nIOaIliBBcnJhee+8iVxyXG4gICAgICAgICAgICAvLyDlkIzml7bmianlsZXlrZjlgqjmoLzlvI/vvIzmlK/mjIHmm7TlpJrlhYPmlbDmja5cclxuICAgICAgICAgICAgaWYgKG1lc3NhZ2UuY29udGVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlT2JqLnNldChcImNvbnRlbnRcIiwgbWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICAvLyDmoLnmja7lnLrmma/orr7nva7lhbPogZTlr7nosaFcclxuICAgICAgICAgICAgLy8gYXZhdGFyUm9sZe+8muaMh+WQkSBBdmF0YXJSb2xlIOihqOeahOaMh+mSiO+8iOaZuuiDveS9k+inkuiJsu+8iVxyXG4gICAgICAgICAgICBpZiAodGFyZ2V0U2NlbmUgPT09IE1lc3NhZ2VTY2VuZS5ST0xFICYmIHRoaXMub3B0aW9ucy5yb2xlKSB7XHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlT2JqLnNldChcImF2YXRhclJvbGVcIiwgdGhpcy5vcHRpb25zLnJvbGUudG9Qb2ludGVyKCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIGNvbXBhbnnvvJrmjIflkJEgQ29tcGFueSDooajnmoTmjIfpkohcclxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jb21wYW55KSB7XHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlT2JqLnNldChcImNvbXBhbnlcIiwgdGhpcy5nZXRDb21wYW55UG9pbnRlcigpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8g5YWz6ZSu77ya5aaC5p6cY2hhdFNlc3Npb27lt7LlrZjlnKjkuJTmnIlpZO+8jOeri+WNs+WFs+iBlFxyXG4gICAgICAgICAgICAvLyDlpoLmnpxjaGF0U2Vzc2lvbui/mOayoeaciWlk77yI5paw5Lya6K+d77yJ77yM5qCH6K6w5Li65b6F5YWz6IGUXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY2hhdFNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY2hhdFNlc3Npb24uaWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlT2JqLnNldChcInNlc3Npb25cIiwgdGhpcy5vcHRpb25zLmNoYXRTZXNzaW9uLnRvUG9pbnRlcigpKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8g5paw5Lya6K+d77yM5qCH6K6w5b6F5YWz6IGU77yM562J5b6Fc2Vzc2lvbuS/neWtmOWQjuWGjeWFs+iBlFxyXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VPYmouc2V0KFwiX3BlbmRpbmdTZXNzaW9uXCIsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyDnm7TmjqXmt7vliqDliLDliJfooajmnKvlsL5cclxuICAgICAgICAgICAgdGhpcy5fbWVzc2FnZUxpc3QucHVzaChtZXNzYWdlT2JqKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBtZXNzYWdlT2JqO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCLliJvlu7rmlrDmtojmga/lpLHotKU6XCIsIGVycm9yKTtcclxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5byC5q2l5L+d5a2Y5raI5oGv5a+56LGhXHJcbiAgICAgKiDlop7lvLrniYjvvJrlpITnkIZzZXNzaW9u5YWz6IGU5ZKM5bu26L+f5L+d5a2YXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHNhdmVNZXNzYWdlKG1lc3NhZ2VPYmo6IEZtb2RlT2JqZWN0KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgaWYgKCFtZXNzYWdlT2JqKSByZXR1cm47XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8vIOajgOafpeaYr+WQpumcgOimgeWFs+iBlHNlc3Npb27vvIjlr7nkuo7mlrDkvJror53nmoTmtojmga/vvIlcclxuICAgICAgICAgICAgaWYgKCFtZXNzYWdlT2JqLmdldChcInNlc3Npb25cIikgJiYgdGhpcy5vcHRpb25zLmNoYXRTZXNzaW9uPy5pZCkge1xyXG4gICAgICAgICAgICAgICAgbWVzc2FnZU9iai5zZXQoXCJzZXNzaW9uXCIsIHRoaXMub3B0aW9ucy5jaGF0U2Vzc2lvbi50b1BvaW50ZXIoKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIOehruS/nea2iOaBr+acieWFs+iBlOeahHNlc3Npb27miY3kv53lrZjliLBNZXNzYWdl6KGoXHJcbiAgICAgICAgICAgIC8vIOWmguaenOayoeaciXNlc3Npb27kuJTkuI3mmK/ogIHmtojmga/ovazmjaLnmoTvvIzlhYjkuI3kv53lrZjvvIjlj6rlrZjlnKjkuo7lhoXlrZjvvIlcclxuICAgICAgICAgICAgaWYgKCFtZXNzYWdlT2JqLmdldChcInNlc3Npb25cIikgJiYgIW1lc3NhZ2VPYmouZ2V0KFwiaXNMZWdhY3lcIikpIHtcclxuICAgICAgICAgICAgICAgIC8vIOayoeaciXNlc3Npb27nmoTmtojmga/mmoLml7bkuI3kv53lrZjliLBNZXNzYWdl6KGoXHJcbiAgICAgICAgICAgICAgICAvLyDnrYlzZXNzaW9u5Yib5bu65ZCO5Lya5YaN5qyh6LCD55Soc2F2ZU1lc3NhZ2VcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5raI5oGv562J5b6Fc2Vzc2lvbuWIm+W7uuWQjuS/neWtmFwiKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgYXdhaXQgbWVzc2FnZU9iai5zYXZlKCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIuS/neWtmOa2iOaBr+WvueixoeWksei0pTpcIiwgZXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWcqHNlc3Npb27liJvlu7ov5pu05paw5ZCO77yM5L+d5a2Y5omA5pyJ5b6F5YWz6IGU55qE5raI5oGvXHJcbiAgICAgKiDlhbPplK7mlrnms5XvvJrlnKhjaGF0U2Vzc2lvbuS/neWtmOaIkOWKn+WQjuiwg+eUqFxyXG4gICAgICovXHJcbiAgICBhc3luYyBzYXZlUGVuZGluZ01lc3NhZ2VzKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLmNoYXRTZXNzaW9uPy5pZCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJzZXNzaW9u5pyq5L+d5a2Y77yM5peg5rOV5L+d5a2Y5b6F5aSE55CG5raI5oGvXCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBzYXZlUHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IG1lc3NhZ2VPYmogb2YgdGhpcy5fbWVzc2FnZUxpc3QpIHtcclxuICAgICAgICAgICAgLy8g5aSE55CG5b6F5YWz6IGU55qE5raI5oGvXHJcbiAgICAgICAgICAgIC8vIGlmIChtZXNzYWdlT2JqLmdldChcIl9wZW5kaW5nU2Vzc2lvblwiKSkge1xyXG4gICAgICAgICAgICAgICAgbWVzc2FnZU9iai5zZXQoXCJzZXNzaW9uXCIsIG1lc3NhZ2VPYmo/LmdldChcInNlc3Npb25cIil8fHRoaXMub3B0aW9ucy5jaGF0U2Vzc2lvbi50b1BvaW50ZXIoKSk7XHJcbiAgICAgICAgICAgICAgICAvLyBtZXNzYWdlT2JqLnNldChcIl9wZW5kaW5nU2Vzc2lvblwiLCB1bmRlZmluZWQpO1xyXG4gICAgICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgICAgICAvLyDkv53lrZjmiYDmnInmsqHmnIlpZOeahOa2iOaBr++8iOaWsOa2iOaBr++8iVxyXG4gICAgICAgICAgICBpZiAoIW1lc3NhZ2VPYmouaWQpIHtcclxuICAgICAgICAgICAgICAgIGlmKCFtZXNzYWdlT2JqPy5nZXQoXCJoaWRkZW5cIikpe1xyXG4gICAgICAgICAgICAgICAgICAgIHNhdmVQcm9taXNlcy5wdXNoKHRoaXMuc2F2ZU1lc3NhZ2UobWVzc2FnZU9iaikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2F2ZVByb21pc2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoc2F2ZVByb21pc2VzKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYOS/neWtmOS6hiAke3NhdmVQcm9taXNlcy5sZW5ndGh9IOadoeW+heWkhOeQhua2iOaBr2ApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOabtOaWsGNoYXRTZXNzaW9u5byV55So77yI5b2T5paw5Lya6K+d56ys5LiA5qyh5L+d5a2Y5ZCO77yJXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZUNoYXRTZXNzaW9uKGNoYXRTZXNzaW9uOiBGbW9kZU9iamVjdCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMub3B0aW9ucy5jaGF0U2Vzc2lvbiA9IGNoYXRTZXNzaW9uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pu05paw5raI5oGv77yI5LyY5YyW54mI77yJXHJcbiAgICAgKiDnm7TmjqXpgJrov4fkuIvmoIfmm7TmlrDmtojmga/lr7nosaHlsZ7mgKfvvIzov5Tlm57mmK/lkKbmiJDlip9cclxuICAgICAqL1xyXG4gICAgdXBkYXRlTWVzc2FnZShpbmRleDogbnVtYmVyLCBtZXNzYWdlOiBQYXJ0aWFsPEZtb2RlQ2hhdE1lc3NhZ2U+KTogRm1vZGVPYmplY3QgfCBudWxsIHtcclxuICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMuX21lc3NhZ2VMaXN0Lmxlbmd0aCkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICAgIGNvbnN0IG1lc3NhZ2VPYmogPSB0aGlzLl9tZXNzYWdlTGlzdFtpbmRleF07XHJcbiAgICAgICAgaWYgKCFtZXNzYWdlT2JqKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgICAgLy8g5pu05paw5raI5oGv6KeS6ImyXHJcbiAgICAgICAgaWYgKG1lc3NhZ2Uucm9sZSkge1xyXG4gICAgICAgICAgICBtZXNzYWdlT2JqLnNldChcInJvbGVcIiwgdGhpcy5vcHRpb25zLnJvbGUudG9Qb2ludGVyKCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8g5pu05paw5YaF5a65IC0g5L+d5oyB5Y6f5aeL5qC85byP5YW85a65XHJcbiAgICAgICAgLy8g5LuO546w5pyJIGNvbnRlbnQg5Lit6I635Y+W5a6M5pW055qEIEZtb2RlQ2hhdE1lc3NhZ2Ug5a+56LGh77yM54S25ZCO5pu05paw5a2X5q61XHJcbiAgICAgICAgaWYgKG1lc3NhZ2UuY29udGVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IG1lc3NhZ2VPYmouZ2V0KFwiY29udGVudFwiKSB8fCB7fTtcclxuICAgICAgICAgICAgbWVzc2FnZU9iai5zZXQoXCJjb250ZW50XCIsIHtcclxuICAgICAgICAgICAgICAgIC4uLmV4aXN0aW5nQ29udGVudCxcclxuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IG1lc3NhZ2UuY29udGVudFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIOabtOaWsOWFtuS7luWxnuaAp1xyXG4gICAgICAgIGlmIChtZXNzYWdlLmNvbXBsZXRlICE9PSB1bmRlZmluZWQpIG1lc3NhZ2VPYmouc2V0KFwiY29tcGxldGVcIiwgbWVzc2FnZS5jb21wbGV0ZSk7XHJcbiAgICAgICAgaWYgKG1lc3NhZ2UuanNvbikgbWVzc2FnZU9iai5zZXQoXCJqc29uXCIsIG1lc3NhZ2UuanNvbik7XHJcbiAgICAgICAgaWYgKG1lc3NhZ2UuaGlkZGVuKSBtZXNzYWdlT2JqLnNldChcImhpZGRlblwiLCBtZXNzYWdlLmhpZGRlbik7XHJcbiAgICAgICAgaWYgKG1lc3NhZ2Uudm9pY2UpIG1lc3NhZ2VPYmouc2V0KFwidm9pY2VcIiwgbWVzc2FnZS52b2ljZSk7XHJcbiAgICAgICAgaWYgKG1lc3NhZ2UuY2lkKSBtZXNzYWdlT2JqLnNldChcImNpZFwiLCBtZXNzYWdlLmNpZCk7XHJcblxyXG4gICAgICAgIHJldHVybiBtZXNzYWdlT2JqO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pu05paw5raI5oGv5bm25byC5q2l5L+d5a2YXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHVwZGF0ZU1lc3NhZ2VBbmRTYXZlKGluZGV4OiBudW1iZXIsIG1lc3NhZ2U6IFBhcnRpYWw8Rm1vZGVDaGF0TWVzc2FnZT4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBjb25zdCBtZXNzYWdlT2JqID0gdGhpcy51cGRhdGVNZXNzYWdlKGluZGV4LCBtZXNzYWdlKTtcclxuICAgICAgICBpZiAoIW1lc3NhZ2VPYmo/LmdldChcImhpZGRlblwiKSkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNhdmVNZXNzYWdlKG1lc3NhZ2VPYmopO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOmHjeaWsOWKoOi9vea2iOaBr1xyXG4gICAgICovXHJcbiAgICBhc3luYyByZWxvYWRNZXNzYWdlcygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICB0aGlzLl9tZXNzYWdlTGlzdCA9IFtdO1xyXG4gICAgICAgIHRoaXMuX2lzTG9hZGVkID0gZmFsc2U7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5nZXRNZXNzYWdlcygpOyAvLyDop6blj5Hph43mlrDliqDovb1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWKoOi9vea2iOaBr++8iOS8mOWMlueJiO+8iVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFzeW5jIGxvYWRNZXNzYWdlcygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICB0aGlzLl9tZXNzYWdlTGlzdCA9IFtdO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvLyAxLiDpppblhYjliqDovb3ogIHniYjmtojmga/vvIjlpoLmnpzmnInvvIlcclxuICAgICAgICAgICAgY29uc3QgbGVnYWN5TWVzc2FnZXMgPSB0aGlzLm9wdGlvbnMuY2hhdFNlc3Npb24/LmdldChcIm1lc3NhZ2VMaXN0XCIpIHx8IFtdO1xyXG5cclxuICAgICAgICAgICAgLy8g6L2s5o2i6ICB54mI5raI5oGv5Li6Rm1vZGVPYmplY3TvvIjku4XnlKjkuo7lsZXnpLrvvIlcclxuICAgICAgICAgICAgZm9yIChjb25zdCBsZWdhY3lNc2cgb2YgbGVnYWN5TWVzc2FnZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2VDbGFzcyA9IFBhcnNlLk9iamVjdC5leHRlbmQoXCJNZXNzYWdlXCIpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZU9iaiA9IG5ldyBNZXNzYWdlQ2xhc3MoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyDlpI3liLbogIHniYjmtojmga/lsZ7mgKdcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2VPYmouc2V0KFwicm9sZVwiLCB0aGlzLm9wdGlvbnMucm9sZS50b1BvaW50ZXIoKSk7XHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlT2JqLnNldChcImNvbnRlbnRcIiwgbGVnYWN5TXNnLmNvbnRlbnQpO1xyXG4gICAgICAgICAgICAgICAgbWVzc2FnZU9iai5zZXQoXCJjb21wbGV0ZVwiLCBsZWdhY3lNc2cuY29tcGxldGUpO1xyXG4gICAgICAgICAgICAgICAgbWVzc2FnZU9iai5zZXQoXCJjcmVhdGVkQXRcIiwgbGVnYWN5TXNnLmNyZWF0ZWRBdCk7XHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlT2JqLnNldChcInZvaWNlXCIsIGxlZ2FjeU1zZy52b2ljZSk7XHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlT2JqLnNldChcImNpZFwiLCBsZWdhY3lNc2cuY2lkKTtcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2VPYmouc2V0KFwiaXNMZWdhY3lcIiwgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8g5Li66ICB5raI5oGv5ZCM5q2l5Yib5bu6IGNvbnRlbnREYXRh77yM5L+d5oyB5qC85byP57uf5LiAXHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGxlZ2FjeU1zZy5jb250ZW50ID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZU9iai5zZXQoXCJjb250ZW50RGF0YVwiLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBsZWdhY3lNc2cuY29udGVudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm9sZTogbGVnYWN5TXNnLnJvbGVcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShsZWdhY3lNc2cuY29udGVudCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlT2JqLnNldChcImNvbnRlbnREYXRhXCIsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJtaXhlZFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtczogbGVnYWN5TXNnLmNvbnRlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU6IGxlZ2FjeU1zZy5yb2xlXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWVzc2FnZUxpc3QucHVzaChtZXNzYWdlT2JqKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gMi4g5Yqg6L295paw54mI5raI5oGvXHJcbiAgICAgICAgICAgIGxldCBuZXdNZXNzYWdlczogRm1vZGVPYmplY3RbXSA9IFtdO1xyXG5cclxuICAgICAgICAgICAgc3dpdGNoICh0aGlzLm9wdGlvbnMuc2NlbmUpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgTWVzc2FnZVNjZW5lLlJPTEU6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yb2xlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld01lc3NhZ2VzID0gYXdhaXQgdGhpcy5sb2FkUm9sZU1lc3NhZ2VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBNZXNzYWdlU2NlbmUuR1JPVVA6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5ncm91cCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdNZXNzYWdlcyA9IGF3YWl0IHRoaXMubG9hZEdyb3VwTWVzc2FnZXMoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIE1lc3NhZ2VTY2VuZS5VU0VSOlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMudXNlckZyb20gJiYgdGhpcy5vcHRpb25zLnVzZXJUbykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdNZXNzYWdlcyA9IGF3YWl0IHRoaXMubG9hZFVzZXJNZXNzYWdlcygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgTWVzc2FnZVNjZW5lLlNFUlZJQ0U6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jb250YWN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld01lc3NhZ2VzID0gYXdhaXQgdGhpcy5sb2FkU2VydmljZU1lc3NhZ2VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBuZXdNZXNzYWdlcyA9IFtdO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyAzLiDlsIbmlrDmtojmga/mt7vliqDliLDliJfooajmnKvlsL5cclxuICAgICAgICAgICAgdGhpcy5fbWVzc2FnZUxpc3QucHVzaCguLi5uZXdNZXNzYWdlcyk7XHJcblxyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCLliqDovb3mtojmga/lpLHotKU6XCIsIGVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDliqDovb3op5LoibLlr7nor53mtojmga9cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhc3luYyBsb2FkUm9sZU1lc3NhZ2VzKCk6IFByb21pc2U8Rm1vZGVPYmplY3RbXT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLnJvbGU/LmlkKSByZXR1cm4gW107XHJcblxyXG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFBhcnNlLlF1ZXJ5KFwiTWVzc2FnZVwiKTtcclxuICAgICAgICBxdWVyeS5leGlzdHMoXCJjb250ZW50XCIpXHJcbiAgICAgICAgcXVlcnkuZXF1YWxUbyhcInJvbGVcIiwgdGhpcy5vcHRpb25zLnJvbGU/LmlkKTtcclxuICAgICAgICBxdWVyeS5hZGRBc2NlbmRpbmcoXCJjcmVhdGVkQXRcIik7XHJcbiAgICAgICAgcXVlcnkubGltaXQoMTAwMCk7IC8vIOmZkOWItuaVsOmHj+mBv+WFjeaAp+iDvemXrumimFxyXG5cclxuICAgICAgICByZXR1cm4gYXdhaXQgcXVlcnkuZmluZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yqg6L29576k6IGK5raI5oGv77yI566A5YyW54mI77yJXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYXN5bmMgbG9hZEdyb3VwTWVzc2FnZXMoKTogUHJvbWlzZTxGbW9kZU9iamVjdFtdPiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZ3JvdXApIHJldHVybiBbXTtcclxuXHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBuZXcgUGFyc2UuUXVlcnkoXCJNZXNzYWdlXCIpO1xyXG4gICAgICAgIHF1ZXJ5LmV4aXN0cyhcImNvbnRlbnRcIilcclxuICAgICAgICBxdWVyeS5lcXVhbFRvKFwiZ3JvdXBcIiwgdGhpcy5vcHRpb25zLmdyb3VwKTtcclxuICAgICAgICBxdWVyeS5hZGRBc2NlbmRpbmcoXCJjcmVhdGVkQXRcIik7XHJcbiAgICAgICAgcXVlcnkubGltaXQoMTAwMCk7XHJcblxyXG4gICAgICAgIHJldHVybiBhd2FpdCBxdWVyeS5maW5kKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDliqDovb3np4HogYrmtojmga/vvIjnroDljJbniYjvvIlcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhc3luYyBsb2FkVXNlck1lc3NhZ2VzKCk6IFByb21pc2U8Rm1vZGVPYmplY3RbXT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLnVzZXJGcm9tIHx8ICF0aGlzLm9wdGlvbnMudXNlclRvKSByZXR1cm4gW107XHJcblxyXG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFBhcnNlLlF1ZXJ5KFwiTWVzc2FnZVwiKTtcclxuICAgICAgICBxdWVyeS5leGlzdHMoXCJjb250ZW50XCIpXHJcbiAgICAgICAgcXVlcnkuY29udGFpbmVkSW4oXCJ1c2VyRnJvbVwiLCBbdGhpcy5vcHRpb25zLnVzZXJGcm9tLCB0aGlzLm9wdGlvbnMudXNlclRvXSk7XHJcbiAgICAgICAgcXVlcnkuY29udGFpbmVkSW4oXCJ1c2VyVG9cIiwgW3RoaXMub3B0aW9ucy51c2VyRnJvbSwgdGhpcy5vcHRpb25zLnVzZXJUb10pO1xyXG4gICAgICAgIHF1ZXJ5LmFkZEFzY2VuZGluZyhcImNyZWF0ZWRBdFwiKTtcclxuICAgICAgICBxdWVyeS5saW1pdCgxMDAwKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHF1ZXJ5LmZpbmQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWKoOi9veWuouacjea2iOaBr++8iOeugOWMlueJiO+8iVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFzeW5jIGxvYWRTZXJ2aWNlTWVzc2FnZXMoKTogUHJvbWlzZTxGbW9kZU9iamVjdFtdPiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuY29udGFjdCkgcmV0dXJuIFtdO1xyXG5cclxuICAgICAgICBjb25zdCBxdWVyeSA9IG5ldyBQYXJzZS5RdWVyeShcIk1lc3NhZ2VcIik7XHJcbiAgICAgICAgcXVlcnkuZXhpc3RzKFwiY29udGVudFwiKVxyXG4gICAgICAgIHF1ZXJ5LmVxdWFsVG8oXCJjb250YWN0XCIsIHRoaXMub3B0aW9ucy5jb250YWN0KTtcclxuICAgICAgICBxdWVyeS5hZGRBc2NlbmRpbmcoXCJjcmVhdGVkQXRcIik7XHJcbiAgICAgICAgcXVlcnkubGltaXQoMTAwMCk7XHJcblxyXG4gICAgICAgIHJldHVybiBhd2FpdCBxdWVyeS5maW5kKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDojrflj5bmtojmga/nu5/orqFcclxuICAgICAqL1xyXG4gICAgZ2V0U3RhdHMoKToge1xyXG4gICAgICAgIHRvdGFsOiBudW1iZXI7XHJcbiAgICAgICAgdXNlcjogbnVtYmVyO1xyXG4gICAgICAgIGFzc2lzdGFudDogbnVtYmVyO1xyXG4gICAgICAgIHN5c3RlbTogbnVtYmVyO1xyXG4gICAgfSB7XHJcbiAgICAgICAgY29uc3Qgc3RhdHMgPSB7XHJcbiAgICAgICAgICAgIHRvdGFsOiB0aGlzLl9tZXNzYWdlTGlzdC5sZW5ndGgsXHJcbiAgICAgICAgICAgIHVzZXI6IDAsXHJcbiAgICAgICAgICAgIGFzc2lzdGFudDogMCxcclxuICAgICAgICAgICAgc3lzdGVtOiAwXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5fbWVzc2FnZUxpc3QuZm9yRWFjaChtc2cgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCByb2xlID0gbXNnLmdldChcInJvbGVcIik7XHJcbiAgICAgICAgICAgIGlmIChyb2xlID09PSBcInVzZXJcIikgc3RhdHMudXNlcisrO1xyXG4gICAgICAgICAgICBpZiAocm9sZSA9PT0gXCJhc3Npc3RhbnRcIikgc3RhdHMuYXNzaXN0YW50Kys7XHJcbiAgICAgICAgICAgIGlmIChyb2xlID09PSBcInN5c3RlbVwiKSBzdGF0cy5zeXN0ZW0rKztcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHN0YXRzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5riF56m65raI5oGv5YiX6KGoXHJcbiAgICAgKi9cclxuICAgIGNsZWFyQ2FjaGUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fbWVzc2FnZUxpc3QgPSBbXTtcclxuICAgICAgICB0aGlzLl9pc0xvYWRlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6I635Y+W5pyA5paw5raI5oGvXHJcbiAgICAgKi9cclxuICAgIGdldExhc3RNZXNzYWdlKCk6IEZtb2RlT2JqZWN0IHwgdW5kZWZpbmVkIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbWVzc2FnZUxpc3QubGVuZ3RoID4gMCA/IHRoaXMuX21lc3NhZ2VMaXN0W3RoaXMuX21lc3NhZ2VMaXN0Lmxlbmd0aCAtIDFdIDogdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6I635Y+W5raI5oGv5pWw6YePXHJcbiAgICAgKi9cclxuICAgIGdldE1lc3NhZ2VDb3VudCgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9tZXNzYWdlTGlzdC5sZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDliJvlu7rpnZnmgIHlt6XljoLmlrnms5XvvIjkv53mjIHlhbzlrrnmgKfvvIlcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGNyZWF0ZUZvclJvbGUoY2hhdFNlc3Npb246IEZtb2RlT2JqZWN0LCByb2xlOiBGbW9kZU9iamVjdCwgY29tcGFueTogRm1vZGVPYmplY3QpOiBNZXNzYWdlTWFuYWdlciB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBNZXNzYWdlTWFuYWdlcih7XHJcbiAgICAgICAgICAgIGNoYXRTZXNzaW9uLFxyXG4gICAgICAgICAgICByb2xlLFxyXG4gICAgICAgICAgICBjb21wYW55LFxyXG4gICAgICAgICAgICBzY2VuZTogTWVzc2FnZVNjZW5lLlJPTEVcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufSJdfQ==
@@ -72,7 +72,8 @@ export class FmodeCloud {
72
72
  }
73
73
  async function(params = {}, options = {}) {
74
74
  const config = this.currentConfig;
75
- const url = `${config.serverURL}/../api/functions`;
75
+ let u = new URL(config.serverURL);
76
+ let url = u.origin + "/api/functions";
76
77
  const requestBody = {
77
78
  ...params,
78
79
  _ApplicationId: config.appId,
@@ -100,7 +101,20 @@ export class FmodeCloud {
100
101
  if (!response.ok) {
101
102
  throw new Error(`HTTP error! status: ${response.status}`);
102
103
  }
103
- const data = await response.json();
104
+ // const data = await response.json();
105
+ // 【关键】直接从 body 获取 reader,只读取一次
106
+ const reader = response.body?.getReader();
107
+ if (!reader) {
108
+ throw new Error('No body reader available');
109
+ }
110
+ // 只读取一次!
111
+ const { value, done } = await reader.read();
112
+ if (!value) {
113
+ throw new Error('Empty response body');
114
+ }
115
+ const decoder = new TextDecoder();
116
+ const text = decoder.decode(value);
117
+ const data = JSON.parse(text);
104
118
  if (data.error) {
105
119
  throw new Error(data.error.message || 'Cloud function error');
106
120
  }
@@ -145,4 +159,4 @@ export class FmodeCloud {
145
159
  }
146
160
  export const Cloud = FmodeCloud.getInstance();
147
161
  export default Cloud;
148
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm1vZGUuY2xvdWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mbW9kZS1uZy9zcmMvbGliL2NvcmUvcGFyc2UvZm1vZGUuY2xvdWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBZ0JBLE1BQU0sT0FBTyxVQUFVO2FBQ04sdUJBQWtCLEdBQXNCLElBQUksQUFBMUIsQ0FBMkI7SUFHNUQ7UUFGUSxvQkFBZSxHQUErQixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBRXZDLENBQUMsQ0FBQyx1QkFBdUI7SUFFbEQsTUFBTSxDQUFDLFdBQVc7UUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQzdDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztJQUNqQyxDQUFDO0lBRUQseUNBQXlDO2FBQ2xDLGNBQVMsR0FBUSxJQUFJLEFBQVosQ0FBYTtJQUU3QixNQUFNLENBQUMsWUFBWSxDQUFDLFFBQWE7UUFDL0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7SUFDNUIsQ0FBQztJQUVELGtDQUFrQztJQUNsQyxJQUFjLGFBQWE7UUFDekIsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQztRQUMzQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDbkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxpRUFBaUUsQ0FBQyxDQUFDO1FBQ3JGLENBQUM7UUFDRCxPQUFPLGFBQWEsQ0FBQyxNQUFNLENBQUM7SUFDOUIsQ0FBQztJQUVELFdBQVc7SUFDWCxNQUFNLEtBQUssUUFBUTtRQUNqQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUVELE1BQU0sQ0FBQyxZQUFvQixFQUFFLGFBQTRCO1FBQ3ZELElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxD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Q0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN2RCxPQUFPLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUM3QixDQUFDO1FBQ0QsT0FBTyxzQ0FBc0MsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLFVBQVMsQ0FBQztZQUN2RSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNqQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUMxQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOztBQUdILE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDOUMsZUFBZSxLQUFLLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGbW9kZUNvbmZpZyB9IGZyb20gJy4vdHlwZXMnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDbG91ZEZ1bmN0aW9uUmVxdWVzdCB7XHJcbiAgcGFyYW1zOiBhbnk7XHJcbiAgdXNlcj86IGFueTtcclxuICBpbnN0YWxsYXRpb25JZD86IHN0cmluZztcclxuICBsb2c/OiBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ2xvdWRGdW5jdGlvblJlc3BvbnNlIHtcclxuICBzdWNjZXNzOiAocmVzdWx0PzogYW55KSA9PiB2b2lkO1xyXG4gIGVycm9yOiAoZXJyb3I/OiBhbnkpID0+IHZvaWQ7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIENsb3VkRnVuY3Rpb24gPSAocmVxdWVzdDogQ2xvdWRGdW5jdGlvblJlcXVlc3QsIHJlc3BvbnNlOiBDbG91ZEZ1bmN0aW9uUmVzcG9uc2UpID0+IHZvaWQ7XHJcblxyXG5leHBvcnQgY2xhc3MgRm1vZGVDbG91ZCB7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgX3NpbmdsZXRvbkluc3RhbmNlOiBGbW9kZUNsb3VkIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfY2xvdWRGdW5jdGlvbnM6IE1hcDxzdHJpbmcsIENsb3VkRnVuY3Rpb24+ID0gbmV3IE1hcCgpO1xyXG5cclxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoKSB7fSAvLyDmlLnkuLogcHJvdGVjdGVkIOS7peWFgeiuuOWtkOexu+e7p+aJv1xyXG5cclxuICBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogRm1vZGVDbG91ZCB7XHJcbiAgICBpZiAoIXRoaXMuX3NpbmdsZXRvbkluc3RhbmNlKSB7XHJcbiAgICAgIHRoaXMuX3NpbmdsZXRvbkluc3RhbmNlID0gbmV3IEZtb2RlQ2xvdWQoKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLl9zaW5nbGV0b25JbnN0YW5jZTtcclxuICB9XHJcblxyXG4gIC8vIOaUr+aMgemdmeaAgeWunuS+i+e7keWumiAtIOS4jkZtb2RlT2JqZWN05ZKMRm1vZGVRdWVyeeS/neaMgeS4gOiHtFxyXG4gIHN0YXRpYyBfaW5zdGFuY2U6IGFueSA9IG51bGw7XHJcblxyXG4gIHN0YXRpYyBiaW5kSW5zdGFuY2UoaW5zdGFuY2U6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5faW5zdGFuY2UgPSBpbnN0YW5jZTtcclxuICB9XHJcblxyXG4gIC8vIOiOt+WPluW9k+WJjeWunuS+i+mFjee9riAtIOS9v+eUqCBwcm90ZWN0ZWQg5Lul5YWB6K645a2Q57G76YeN5YaZXHJcbiAgcHJvdGVjdGVkIGdldCBjdXJyZW50Q29uZmlnKCk6IEZtb2RlQ29uZmlnIHtcclxuICAgIGNvbnN0IHBhcnNlSW5zdGFuY2UgPSBGbW9kZUNsb3VkLl9pbnN0YW5jZTtcclxuICAgIGlmICghcGFyc2VJbnN0YW5jZSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Ztb2RlQ2xvdWQgbm90IGluaXRpYWxpemVkLiBDYWxsIEZtb2RlUGFyc2UuaW5pdGlhbGl6ZSgpIGZpcnN0LicpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBhcnNlSW5zdGFuY2UuY29uZmlnO1xyXG4gIH1cclxuXHJcbiAgLy8g6Z2Z5oCB5pa55rOV6I635Y+W5a6e5L6LXHJcbiAgc3RhdGljIGdldCBpbnN0YW5jZSgpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlO1xyXG4gIH1cclxuXHJcbiAgZGVmaW5lKGZ1bmN0aW9uTmFtZTogc3RyaW5nLCBjbG91ZEZ1bmN0aW9uOiBDbG91ZEZ1bmN0aW9uKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jbG91ZEZ1bmN0aW9ucy5zZXQoZnVuY3Rpb25OYW1lLCBjbG91ZEZ1bmN0aW9uKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHJ1bihmdW5jdGlvbk5hbWU6IHN0cmluZywgcGFyYW1zOiBhbnkgPSB7fSwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPGFueT4ge1xyXG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jdXJyZW50Q29uZmlnO1xyXG4gICAgY29uc3QgdXJsID0gYCR7Y29uZmlnLnNlcnZlclVSTH0vZnVuY3Rpb25zLyR7ZnVuY3Rpb25OYW1lfWA7XHJcblxyXG4gICAgY29uc3QgcmVxdWVzdEJvZHkgPSB7XHJcbiAgICAgIC4uLnBhcmFtcyxcclxuICAgICAgX0FwcGxpY2F0aW9uSWQ6IGNvbmZpZy5hcHBJZCxcclxuICAgICAgLy8gX0NsaWVudFZlcnNpb246ICdqcycgKyAoY29uZmlnLmphdmFzY3JpcHRLZXkgfHwgJycpLFxyXG4gICAgICBfSW5zdGFsbGF0aW9uSWQ6IG9wdGlvbnMuaW5zdGFsbGF0aW9uSWQgfHwgdGhpcy5nZW5lcmF0ZUluc3RhbGxhdGlvbklkKCksXHJcbiAgICB9O1xyXG5cclxuICAgIC8vIEFkZCBzZXNzaW9uIHRva2VuIGlmIGF2YWlsYWJsZVxyXG4gICAgY29uc3Qgc2Vzc2lvblRva2VuID0gY29uZmlnLnNlc3Npb25Ub2tlbjtcclxuICAgIGlmIChzZXNzaW9uVG9rZW4pIHtcclxuICAgICAgcmVxdWVzdEJvZHkuX1Nlc3Npb25Ub2tlbiA9IHNlc3Npb25Ub2tlbjtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zb2xlLmxvZyh1cmwpXHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XHJcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgICAgICdYLVBhcnNlLUFwcGxpY2F0aW9uLUlkJzogY29uZmlnLmFwcElkLFxyXG4gICAgICAgICAgLi4uKGNvbmZpZy5qYXZhc2NyaXB0S2V5ICYmIHsgJ1gtUGFyc2UtSmF2YVNjcmlwdC1LZXknOiBjb25maWcuamF2YXNjcmlwdEtleSB9KSxcclxuICAgICAgICAgIC4uLihjb25maWcubWFzdGVyS2V5ICYmIHsgJ1gtUGFyc2UtTWFzdGVyLUtleSc6IGNvbmZpZy5tYXN0ZXJLZXkgfSksXHJcbiAgICAgICAgICAuLi4oc2Vzc2lvblRva2VuICYmIHsgJ1gtUGFyc2UtU2Vzc2lvbi1Ub2tlbic6IHNlc3Npb25Ub2tlbiB9KSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHJlcXVlc3RCb2R5KSxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBIVFRQIGVycm9yISBzdGF0dXM6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xyXG5cclxuICAgICAgaWYgKGRhdGEuZXJyb3IpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZGF0YS5lcnJvci5tZXNzYWdlIHx8ICdDbG91ZCBmdW5jdGlvbiBlcnJvcicpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gZGF0YS5yZXN1bHQ7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKGBDbG91ZCBmdW5jdGlvbiAke2Z1bmN0aW9uTmFtZX0gZmFpbGVkOmAsIGVycm9yKTtcclxuICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBmdW5jdGlvbihwYXJhbXM6IGFueSA9IHt9LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8YW55PiB7XHJcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmN1cnJlbnRDb25maWc7XHJcbiAgICBjb25zdCB1cmwgPSBgJHtjb25maWcuc2VydmVyVVJMfS8uLi9hcGkvZnVuY3Rpb25zYDtcclxuXHJcbiAgICBjb25zdCByZXF1ZXN0Qm9keSA9IHtcclxuICAgICAgLi4ucGFyYW1zLFxyXG4gICAgICBfQXBwbGljYXRpb25JZDogY29uZmlnLmFwcElkLFxyXG4gICAgICAvLyBfQ2xpZW50VmVyc2lvbjogJ2pzJyArIChjb25maWcuamF2YXNjcmlwdEtleSB8fCAnJyksXHJcbiAgICAgIF9JbnN0YWxsYXRpb25JZDogb3B0aW9ucy5pbnN0YWxsYXRpb25JZCB8fCB0aGlzLmdlbmVyYXRlSW5zdGFsbGF0aW9uSWQoKSxcclxuICAgIH07XHJcblxyXG5cclxuXHJcbiAgICAvLyBBZGQgc2Vzc2lvbiB0b2tlbiBpZiBhdmFpbGFibGVcclxuICAgIGNvbnN0IHNlc3Npb25Ub2tlbiA9IGNvbmZpZy5zZXNzaW9uVG9rZW47XHJcbiAgICBpZiAoc2Vzc2lvblRva2VuKSB7XHJcbiAgICAgIHJlcXVlc3RCb2R5Ll9TZXNzaW9uVG9rZW4gPSBzZXNzaW9uVG9rZW47XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc29sZS5sb2codXJsKVxyXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xyXG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICAgICAnWC1QYXJzZS1BcHBsaWNhdGlvbi1JZCc6IGNvbmZpZy5hcHBJZCxcclxuICAgICAgICAgIC4uLihjb25maWcuamF2YXNjcmlwdEtleSAmJiB7ICdYLVBhcnNlLUphdmFTY3JpcHQtS2V5JzogY29uZmlnLmphdmFzY3JpcHRLZXkgfSksXHJcbiAgICAgICAgICAuLi4oY29uZmlnLm1hc3RlcktleSAmJiB7ICdYLVBhcnNlLU1hc3Rlci1LZXknOiBjb25maWcubWFzdGVyS2V5IH0pLFxyXG4gICAgICAgICAgLi4uKHNlc3Npb25Ub2tlbiAmJiB7ICdYLVBhcnNlLVNlc3Npb24tVG9rZW4nOiBzZXNzaW9uVG9rZW4gfSksXHJcbiAgICAgICAgfSxcclxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShyZXF1ZXN0Qm9keSksXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSFRUUCBlcnJvciEgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcclxuXHJcbiAgICAgIGlmIChkYXRhLmVycm9yKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGRhdGEuZXJyb3IubWVzc2FnZSB8fCAnQ2xvdWQgZnVuY3Rpb24gZXJyb3InKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKGBDbG91ZCBmdW5jdGlvbiBmYWlsZWQ6YCwgZXJyb3IpO1xyXG4gICAgICB0aHJvdyBlcnJvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGFmdGVyRGVsZXRlKGNsYXNzTmFtZTogc3RyaW5nLCBmdW5jOiBDbG91ZEZ1bmN0aW9uKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLmRlZmluZShgYWZ0ZXJEZWxldGVfJHtjbGFzc05hbWV9YCwgZnVuYyk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBhZnRlclNhdmUoY2xhc3NOYW1lOiBzdHJpbmcsIGZ1bmM6IENsb3VkRnVuY3Rpb24pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuZGVmaW5lKGBhZnRlclNhdmVfJHtjbGFzc05hbWV9YCwgZnVuYyk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBiZWZvcmVEZWxldGUoY2xhc3NOYW1lOiBzdHJpbmcsIGZ1bmM6IENsb3VkRnVuY3Rpb24pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuZGVmaW5lKGBiZWZvcmVEZWxldGVfJHtjbGFzc05hbWV9YCwgZnVuYyk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBiZWZvcmVTYXZlKGNsYXNzTmFtZTogc3RyaW5nLCBmdW5jOiBDbG91ZEZ1bmN0aW9uKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLmRlZmluZShgYmVmb3JlU2F2ZV8ke2NsYXNzTmFtZX1gLCBmdW5jKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGJlZm9yZUZpbmQoY2xhc3NOYW1lOiBzdHJpbmcsIGZ1bmM6IENsb3VkRnVuY3Rpb24pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuZGVmaW5lKGBiZWZvcmVGaW5kXyR7Y2xhc3NOYW1lfWAsIGZ1bmMpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgYWZ0ZXJGaW5kKGNsYXNzTmFtZTogc3RyaW5nLCBmdW5jOiBDbG91ZEZ1bmN0aW9uKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLmRlZmluZShgYWZ0ZXJGaW5kXyR7Y2xhc3NOYW1lfWAsIGZ1bmMpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgam9iKGpvYk5hbWU6IHN0cmluZywgZnVuYzogQ2xvdWRGdW5jdGlvbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5kZWZpbmUoYGpvYl8ke2pvYk5hbWV9YCwgZnVuYyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdlbmVyYXRlSW5zdGFsbGF0aW9uSWQoKTogc3RyaW5nIHtcclxuICAgIGlmICh0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiBjcnlwdG8ucmFuZG9tVVVJRCkge1xyXG4gICAgICByZXR1cm4gY3J5cHRvLnJhbmRvbVVVSUQoKTtcclxuICAgIH1cclxuICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uKGMpIHtcclxuICAgICAgY29uc3QgciA9IE1hdGgucmFuZG9tKCkgKiAxNiB8IDA7XHJcbiAgICAgIGNvbnN0IHYgPSBjID09PSAneCcgPyByIDogKHIgJiAweDMgfCAweDgpO1xyXG4gICAgICByZXR1cm4gdi50b1N0cmluZygxNik7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBDbG91ZCA9IEZtb2RlQ2xvdWQuZ2V0SW5zdGFuY2UoKTtcclxuZXhwb3J0IGRlZmF1bHQgQ2xvdWQ7Il19
162
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm1vZGUuY2xvdWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mbW9kZS1uZy9zcmMvbGliL2NvcmUvcGFyc2UvZm1vZGUuY2xvdWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBZ0JBLE1BQU0sT0FBTyxVQUFVO2FBQ04sdUJBQWtCLEdBQXNCLElBQUksQUFBMUIsQ0FBMkI7SUFHNUQ7UUFGUSxvQkFBZSxHQUErQixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBRXZDLENBQUMsQ0FBQyx1QkFBdUI7SUFFbEQsTUFBTSxDQUFDLFdBQVc7UUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQzdDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztJQUNqQyxDQUFDO0lBRUQseUNBQXlDO2FBQ2xDLGNBQVMsR0FBUSxJQUFJLEFBQVosQ0FBYTtJQUU3QixNQUFNLENBQUMsWUFBWSxDQUFDLFFBQWE7UUFDL0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7SUFDNUIsQ0FBQztJQUVELGtDQUFrQztJQUNsQyxJQUFjLGFBQWE7UUFDekIsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQztRQUMzQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDbkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxpRUFBaUUsQ0FBQyxDQUFDO1FBQ3JGLENBQUM7UUFDRCxPQUFPLGFBQWEsQ0FBQyxNQUFNLENBQUM7SUFDOUIsQ0FBQztJQUVELFdBQVc7SUFDWCxNQUFNLEtBQUssUUFBUTtRQUNqQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUVELE1BQU0sQ0FBQyxZQUFvQixFQUFFLGFBQTRCO1FBQ3ZELElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxD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QVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUM5QyxlQUFlLEtBQUssQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZtb2RlQ29uZmlnIH0gZnJvbSAnLi90eXBlcyc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIENsb3VkRnVuY3Rpb25SZXF1ZXN0IHtcclxuICBwYXJhbXM6IGFueTtcclxuICB1c2VyPzogYW55O1xyXG4gIGluc3RhbGxhdGlvbklkPzogc3RyaW5nO1xyXG4gIGxvZz86IGFueTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDbG91ZEZ1bmN0aW9uUmVzcG9uc2Uge1xyXG4gIHN1Y2Nlc3M6IChyZXN1bHQ/OiBhbnkpID0+IHZvaWQ7XHJcbiAgZXJyb3I6IChlcnJvcj86IGFueSkgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgQ2xvdWRGdW5jdGlvbiA9IChyZXF1ZXN0OiBDbG91ZEZ1bmN0aW9uUmVxdWVzdCwgcmVzcG9uc2U6IENsb3VkRnVuY3Rpb25SZXNwb25zZSkgPT4gdm9pZDtcclxuXHJcbmV4cG9ydCBjbGFzcyBGbW9kZUNsb3VkIHtcclxuICBwcml2YXRlIHN0YXRpYyBfc2luZ2xldG9uSW5zdGFuY2U6IEZtb2RlQ2xvdWQgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIF9jbG91ZEZ1bmN0aW9uczogTWFwPHN0cmluZywgQ2xvdWRGdW5jdGlvbj4gPSBuZXcgTWFwKCk7XHJcblxyXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcigpIHt9IC8vIOaUueS4uiBwcm90ZWN0ZWQg5Lul5YWB6K645a2Q57G757un5om/XHJcblxyXG4gIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBGbW9kZUNsb3VkIHtcclxuICAgIGlmICghdGhpcy5fc2luZ2xldG9uSW5zdGFuY2UpIHtcclxuICAgICAgdGhpcy5fc2luZ2xldG9uSW5zdGFuY2UgPSBuZXcgRm1vZGVDbG91ZCgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuX3NpbmdsZXRvbkluc3RhbmNlO1xyXG4gIH1cclxuXHJcbiAgLy8g5pSv5oyB6Z2Z5oCB5a6e5L6L57uR5a6aIC0g5LiORm1vZGVPYmplY3TlkoxGbW9kZVF1ZXJ55L+d5oyB5LiA6Ie0XHJcbiAgc3RhdGljIF9pbnN0YW5jZTogYW55ID0gbnVsbDtcclxuXHJcbiAgc3RhdGljIGJpbmRJbnN0YW5jZShpbnN0YW5jZTogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLl9pbnN0YW5jZSA9IGluc3RhbmNlO1xyXG4gIH1cclxuXHJcbiAgLy8g6I635Y+W5b2T5YmN5a6e5L6L6YWN572uIC0g5L2/55SoIHByb3RlY3RlZCDku6XlhYHorrjlrZDnsbvph43lhplcclxuICBwcm90ZWN0ZWQgZ2V0IGN1cnJlbnRDb25maWcoKTogRm1vZGVDb25maWcge1xyXG4gICAgY29uc3QgcGFyc2VJbnN0YW5jZSA9IEZtb2RlQ2xvdWQuX2luc3RhbmNlO1xyXG4gICAgaWYgKCFwYXJzZUluc3RhbmNlKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignRm1vZGVDbG91ZCBub3QgaW5pdGlhbGl6ZWQuIENhbGwgRm1vZGVQYXJzZS5pbml0aWFsaXplKCkgZmlyc3QuJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGFyc2VJbnN0YW5jZS5jb25maWc7XHJcbiAgfVxyXG5cclxuICAvLyDpnZnmgIHmlrnms5Xojrflj5blrp7kvotcclxuICBzdGF0aWMgZ2V0IGluc3RhbmNlKCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5faW5zdGFuY2U7XHJcbiAgfVxyXG5cclxuICBkZWZpbmUoZnVuY3Rpb25OYW1lOiBzdHJpbmcsIGNsb3VkRnVuY3Rpb246IENsb3VkRnVuY3Rpb24pOiB2b2lkIHtcclxuICAgIHRoaXMuX2Nsb3VkRnVuY3Rpb25zLnNldChmdW5jdGlvbk5hbWUsIGNsb3VkRnVuY3Rpb24pO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgcnVuKGZ1bmN0aW9uTmFtZTogc3RyaW5nLCBwYXJhbXM6IGFueSA9IHt9LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8YW55PiB7XHJcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmN1cnJlbnRDb25maWc7XHJcbiAgICBjb25zdCB1cmwgPSBgJHtjb25maWcuc2VydmVyVVJMfS9mdW5jdGlvbnMvJHtmdW5jdGlvbk5hbWV9YDtcclxuXHJcbiAgICBjb25zdCByZXF1ZXN0Qm9keSA9IHtcclxuICAgICAgLi4ucGFyYW1zLFxyXG4gICAgICBfQXBwbGljYXRpb25JZDogY29uZmlnLmFwcElkLFxyXG4gICAgICAvLyBfQ2xpZW50VmVyc2lvbjogJ2pzJyArIChjb25maWcuamF2YXNjcmlwdEtleSB8fCAnJyksXHJcbiAgICAgIF9JbnN0YWxsYXRpb25JZDogb3B0aW9ucy5pbnN0YWxsYXRpb25JZCB8fCB0aGlzLmdlbmVyYXRlSW5zdGFsbGF0aW9uSWQoKSxcclxuICAgIH07XHJcblxyXG4gICAgLy8gQWRkIHNlc3Npb24gdG9rZW4gaWYgYXZhaWxhYmxlXHJcbiAgICBjb25zdCBzZXNzaW9uVG9rZW4gPSBjb25maWcuc2Vzc2lvblRva2VuO1xyXG4gICAgaWYgKHNlc3Npb25Ub2tlbikge1xyXG4gICAgICByZXF1ZXN0Qm9keS5fU2Vzc2lvblRva2VuID0gc2Vzc2lvblRva2VuO1xyXG4gICAgfVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKHVybClcclxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcclxuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAgICAgJ1gtUGFyc2UtQXBwbGljYXRpb24tSWQnOiBjb25maWcuYXBwSWQsXHJcbiAgICAgICAgICAuLi4oY29uZmlnLmphdmFzY3JpcHRLZXkgJiYgeyAnWC1QYXJzZS1KYXZhU2NyaXB0LUtleSc6IGNvbmZpZy5qYXZhc2NyaXB0S2V5IH0pLFxyXG4gICAgICAgICAgLi4uKGNvbmZpZy5tYXN0ZXJLZXkgJiYgeyAnWC1QYXJzZS1NYXN0ZXItS2V5JzogY29uZmlnLm1hc3RlcktleSB9KSxcclxuICAgICAgICAgIC4uLihzZXNzaW9uVG9rZW4gJiYgeyAnWC1QYXJzZS1TZXNzaW9uLVRva2VuJzogc2Vzc2lvblRva2VuIH0pLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocmVxdWVzdEJvZHkpLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgZXJyb3IhIHN0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9YCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XHJcblxyXG4gICAgICBpZiAoZGF0YS5lcnJvcikge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihkYXRhLmVycm9yLm1lc3NhZ2UgfHwgJ0Nsb3VkIGZ1bmN0aW9uIGVycm9yJyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBkYXRhLnJlc3VsdDtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoYENsb3VkIGZ1bmN0aW9uICR7ZnVuY3Rpb25OYW1lfSBmYWlsZWQ6YCwgZXJyb3IpO1xyXG4gICAgICB0aHJvdyBlcnJvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGZ1bmN0aW9uKHBhcmFtczogYW55ID0ge30sIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY3VycmVudENvbmZpZztcclxuICAgIGxldCB1ID0gbmV3IFVSTChjb25maWcuc2VydmVyVVJMKTtcclxuICAgIGxldCB1cmwgPSB1Lm9yaWdpbiArIFwiL2FwaS9mdW5jdGlvbnNcIlxyXG5cclxuICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0ge1xyXG4gICAgICAuLi5wYXJhbXMsXHJcbiAgICAgIF9BcHBsaWNhdGlvbklkOiBjb25maWcuYXBwSWQsXHJcbiAgICAgIC8vIF9DbGllbnRWZXJzaW9uOiAnanMnICsgKGNvbmZpZy5qYXZhc2NyaXB0S2V5IHx8ICcnKSxcclxuICAgICAgX0luc3RhbGxhdGlvbklkOiBvcHRpb25zLmluc3RhbGxhdGlvbklkIHx8IHRoaXMuZ2VuZXJhdGVJbnN0YWxsYXRpb25JZCgpLFxyXG4gICAgfTtcclxuXHJcblxyXG5cclxuICAgIC8vIEFkZCBzZXNzaW9uIHRva2VuIGlmIGF2YWlsYWJsZVxyXG4gICAgY29uc3Qgc2Vzc2lvblRva2VuID0gY29uZmlnLnNlc3Npb25Ub2tlbjtcclxuICAgIGlmIChzZXNzaW9uVG9rZW4pIHtcclxuICAgICAgcmVxdWVzdEJvZHkuX1Nlc3Npb25Ub2tlbiA9IHNlc3Npb25Ub2tlbjtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zb2xlLmxvZyh1cmwpXHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XHJcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgICAgICdYLVBhcnNlLUFwcGxpY2F0aW9uLUlkJzogY29uZmlnLmFwcElkLFxyXG4gICAgICAgICAgLi4uKGNvbmZpZy5qYXZhc2NyaXB0S2V5ICYmIHsgJ1gtUGFyc2UtSmF2YVNjcmlwdC1LZXknOiBjb25maWcuamF2YXNjcmlwdEtleSB9KSxcclxuICAgICAgICAgIC4uLihjb25maWcubWFzdGVyS2V5ICYmIHsgJ1gtUGFyc2UtTWFzdGVyLUtleSc6IGNvbmZpZy5tYXN0ZXJLZXkgfSksXHJcbiAgICAgICAgICAuLi4oc2Vzc2lvblRva2VuICYmIHsgJ1gtUGFyc2UtU2Vzc2lvbi1Ub2tlbic6IHNlc3Npb25Ub2tlbiB9KSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHJlcXVlc3RCb2R5KSxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBIVFRQIGVycm9yISBzdGF0dXM6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xyXG4gICAgICAvLyDjgJDlhbPplK7jgJHnm7TmjqXku44gYm9keSDojrflj5YgcmVhZGVy77yM5Y+q6K+75Y+W5LiA5qyhXHJcbiAgICAgIGNvbnN0IHJlYWRlciA9IHJlc3BvbnNlLmJvZHk/LmdldFJlYWRlcigpO1xyXG4gICAgICBpZiAoIXJlYWRlcikge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gYm9keSByZWFkZXIgYXZhaWxhYmxlJyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIOWPquivu+WPluS4gOasoe+8gVxyXG4gICAgICBjb25zdCB7IHZhbHVlLCBkb25lIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xyXG5cclxuICAgICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRW1wdHkgcmVzcG9uc2UgYm9keScpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XHJcbiAgICAgIGNvbnN0IHRleHQgPSBkZWNvZGVyLmRlY29kZSh2YWx1ZSk7XHJcbiAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHRleHQpO1xyXG5cclxuICAgICAgaWYgKGRhdGEuZXJyb3IpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZGF0YS5lcnJvci5tZXNzYWdlIHx8ICdDbG91ZCBmdW5jdGlvbiBlcnJvcicpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gZGF0YTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoYENsb3VkIGZ1bmN0aW9uIGZhaWxlZDpgLCBlcnJvcik7XHJcbiAgICAgIHRocm93IGVycm9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgYWZ0ZXJEZWxldGUoY2xhc3NOYW1lOiBzdHJpbmcsIGZ1bmM6IENsb3VkRnVuY3Rpb24pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuZGVmaW5lKGBhZnRlckRlbGV0ZV8ke2NsYXNzTmFtZX1gLCBmdW5jKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGFmdGVyU2F2ZShjbGFzc05hbWU6IHN0cmluZywgZnVuYzogQ2xvdWRGdW5jdGlvbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5kZWZpbmUoYGFmdGVyU2F2ZV8ke2NsYXNzTmFtZX1gLCBmdW5jKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGJlZm9yZURlbGV0ZShjbGFzc05hbWU6IHN0cmluZywgZnVuYzogQ2xvdWRGdW5jdGlvbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5kZWZpbmUoYGJlZm9yZURlbGV0ZV8ke2NsYXNzTmFtZX1gLCBmdW5jKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGJlZm9yZVNhdmUoY2xhc3NOYW1lOiBzdHJpbmcsIGZ1bmM6IENsb3VkRnVuY3Rpb24pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuZGVmaW5lKGBiZWZvcmVTYXZlXyR7Y2xhc3NOYW1lfWAsIGZ1bmMpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgYmVmb3JlRmluZChjbGFzc05hbWU6IHN0cmluZywgZnVuYzogQ2xvdWRGdW5jdGlvbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5kZWZpbmUoYGJlZm9yZUZpbmRfJHtjbGFzc05hbWV9YCwgZnVuYyk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBhZnRlckZpbmQoY2xhc3NOYW1lOiBzdHJpbmcsIGZ1bmM6IENsb3VkRnVuY3Rpb24pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuZGVmaW5lKGBhZnRlckZpbmRfJHtjbGFzc05hbWV9YCwgZnVuYyk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBqb2Ioam9iTmFtZTogc3RyaW5nLCBmdW5jOiBDbG91ZEZ1bmN0aW9uKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLmRlZmluZShgam9iXyR7am9iTmFtZX1gLCBmdW5jKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2VuZXJhdGVJbnN0YWxsYXRpb25JZCgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIGNyeXB0by5yYW5kb21VVUlEKSB7XHJcbiAgICAgIHJldHVybiBjcnlwdG8ucmFuZG9tVVVJRCgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICd4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgnLnJlcGxhY2UoL1t4eV0vZywgZnVuY3Rpb24oYykge1xyXG4gICAgICBjb25zdCByID0gTWF0aC5yYW5kb20oKSAqIDE2IHwgMDtcclxuICAgICAgY29uc3QgdiA9IGMgPT09ICd4JyA/IHIgOiAociAmIDB4MyB8IDB4OCk7XHJcbiAgICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IENsb3VkID0gRm1vZGVDbG91ZC5nZXRJbnN0YW5jZSgpO1xyXG5leHBvcnQgZGVmYXVsdCBDbG91ZDsiXX0=