@rongcloud/plugin-call 5.2.1 → 5.2.2

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.
package/dist/index.esm.js CHANGED
@@ -1,8 +1,8 @@
1
- var le = Object.defineProperty;
2
- var ce = (s, e, t) => e in s ? le(s, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : s[e] = t;
3
- var f = (s, e, t) => (ce(s, typeof e != "symbol" ? e + "" : e, t), t);
4
- import { EventEmitter as te, ConversationType as b, ErrorCode as j, VersionManage as w, RTCJoinType as se, LogLevel as _e } from "@rongcloud/engine";
5
- import { RCResolution as he, RCRTCCode as O, RCKickReason as X } from "@rongcloud/plugin-rtc";
1
+ var ce = Object.defineProperty;
2
+ var _e = (s, e, t) => e in s ? ce(s, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : s[e] = t;
3
+ var f = (s, e, t) => (_e(s, typeof e != "symbol" ? e + "" : e, t), t);
4
+ import { EventEmitter as se, ConversationType as w, ErrorCode as J, RTCJoinType as ie, LogL as B, VersionManage as z } from "@rongcloud/engine";
5
+ import { RCResolution as he, RCRTCCode as O, RCKickReason as Z } from "@rongcloud/plugin-rtc";
6
6
  const ue = (s) => {
7
7
  const e = "0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ+/".split(""), t = e.length + 1;
8
8
  let i = +s;
@@ -15,20 +15,20 @@ const ue = (s) => {
15
15
  }, ge = () => "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (s) => {
16
16
  const e = Math.random() * 16 | 0;
17
17
  return (s === "x" ? e : e & 3 | 8).toString(16);
18
- }), ie = () => {
18
+ }), ne = () => {
19
19
  let s = ge();
20
20
  return s = `${s.replace(/-/g, "")}0`, s = parseInt(s, 16), s = ue(s), s.length > 22 && (s = s.slice(0, 22)), s;
21
- }, Z = () => {
21
+ }, Q = () => {
22
22
  const s = Math.floor(Math.random() * 1e3);
23
- let e = ie();
23
+ let e = ne();
24
24
  return e = e.replace(/\//g, "0"), [e, Date.now(), s].join("_");
25
- }, de = (s, e) => setTimeout(s, e), ne = new te(), q = (s) => {
25
+ }, de = (s, e) => setTimeout(s, e), oe = new se(), X = (s) => {
26
26
  const e = "RCCallDeviceId";
27
27
  let t = s.sessionStorage.getItem(e);
28
- return t || (t = ie(), s.sessionStorage.setItem(e, t)), t;
28
+ return t || (t = ne(), s.sessionStorage.setItem(e, t)), t;
29
29
  };
30
- var D = /* @__PURE__ */ ((s) => (s[s.OUTGOING = 1] = "OUTGOING", s[s.INCOMING = 2] = "INCOMING", s[s.RINGING = 3] = "RINGING", s[s.CONNECTED = 4] = "CONNECTED", s[s.IDLE = 5] = "IDLE", s[s.ACCEPTED = 6] = "ACCEPTED", s))(D || {}), h = /* @__PURE__ */ ((s) => (s[s.SUCCESS = 1e4] = "SUCCESS", s[s.STATE_MACHINE_EXIT = 53200] = "STATE_MACHINE_EXIT", s[s.SEND_MSG_ERROR = 53201] = "SEND_MSG_ERROR", s[s.REJECTED_BY_BLACKLIST = 53202] = "REJECTED_BY_BLACKLIST", s[s.NOT_IN_GROUP = 53203] = "NOT_IN_GROUP", s[s.GET_LOCAL_AUDIO_TRACK_ERROR = 53301] = "GET_LOCAL_AUDIO_TRACK_ERROR", s[s.GET_LOCAL_VIDEO_TRACK_ERROR = 53302] = "GET_LOCAL_VIDEO_TRACK_ERROR", s[s.GET_LOCAL_AUDIO_AND_VIDEO_TRACK_ERROR = 53303] = "GET_LOCAL_AUDIO_AND_VIDEO_TRACK_ERROR", s[s.JOIN_ROOM_ERROR = 53304] = "JOIN_ROOM_ERROR", s[s.AUDIO_PUBLISH_ERROR = 53305] = "AUDIO_PUBLISH_ERROR", s[s.VIDEO_PUBLISH_ERROR = 53306] = "VIDEO_PUBLISH_ERROR", s[s.AUDIO_AND_VIDEO_PUBLISH_ERROR = 53307] = "AUDIO_AND_VIDEO_PUBLISH_ERROR", s[s.QUERY_JOINED_USER_INFO_ERROR = 53308] = "QUERY_JOINED_USER_INFO_ERROR", s[s.MISSING_VIDEO_TRACK_ERROR = 53309] = "MISSING_VIDEO_TRACK_ERROR", s[s.UNPUBLISH_VIDEO_ERROR = 53310] = "UNPUBLISH_VIDEO_ERROR", s[s.CONVERSATION_NOT_GROUP_ERROR = 53311] = "CONVERSATION_NOT_GROUP_ERROR", s[s.NOT_IN_ROOM_ERROR = 53312] = "NOT_IN_ROOM_ERROR", s))(h || {}), u = /* @__PURE__ */ ((s) => (s[s.CANCEL = 1] = "CANCEL", s[s.REJECT = 2] = "REJECT", s[s.HANGUP = 3] = "HANGUP", s[s.BUSY_LINE = 4] = "BUSY_LINE", s[s.NO_RESPONSE = 5] = "NO_RESPONSE", s[s.ENGINE_UNSUPPORTED = 6] = "ENGINE_UNSUPPORTED", s[s.NETWORK_ERROR = 7] = "NETWORK_ERROR", s[s.GET_MEDIA_RESOURCES_ERROR = 8] = "GET_MEDIA_RESOURCES_ERROR", s[s.PUBLISH_ERROR = 9] = "PUBLISH_ERROR", s[s.SUBSCRIBE_ERROR = 10] = "SUBSCRIBE_ERROR", s[s.REMOTE_CANCEL = 11] = "REMOTE_CANCEL", s[s.REMOTE_REJECT = 12] = "REMOTE_REJECT", s[s.REMOTE_HANGUP = 13] = "REMOTE_HANGUP", s[s.REMOTE_BUSY_LINE = 14] = "REMOTE_BUSY_LINE", s[s.REMOTE_NO_RESPONSE = 15] = "REMOTE_NO_RESPONSE", s[s.REMOTE_ENGINE_UNSUPPORTED = 16] = "REMOTE_ENGINE_UNSUPPORTED", s[s.REMOTE_NETWORK_ERROR = 17] = "REMOTE_NETWORK_ERROR", s[s.REMOTE_GET_MEDIA_RESOURCE_ERROR = 18] = "REMOTE_GET_MEDIA_RESOURCE_ERROR", s[s.REMOTE_PUBLISH_ERROR = 19] = "REMOTE_PUBLISH_ERROR", s[s.REMOTE_SUBSCRIBE_ERROR = 20] = "REMOTE_SUBSCRIBE_ERROR", s[s.OTHER_CLIENT_JOINED_CALL = 21] = "OTHER_CLIENT_JOINED_CALL", s[s.OTHER_CLIENT_IN_CALL = 22] = "OTHER_CLIENT_IN_CALL", s[s.KICKED_BY_SERVER = 23] = "KICKED_BY_SERVER", s[s.ACCEPT_SYSTEM_CALL = 24] = "ACCEPT_SYSTEM_CALL", s[s.REMOTE_OTHER_CLIENT_JOINED_CALL = 31] = "REMOTE_OTHER_CLIENT_JOINED_CALL", s[s.REMOTE_OTHER_CLIENT_IN_CALL = 32] = "REMOTE_OTHER_CLIENT_IN_CALL", s[s.REMOTE_KICKED_BY_SERVER = 33] = "REMOTE_KICKED_BY_SERVER", s[s.REMOTE_ACCEPT_SYSTEM_CALL = 34] = "REMOTE_ACCEPT_SYSTEM_CALL", s[s.ACCEPT_BY_OTHER_CLIENT = 101] = "ACCEPT_BY_OTHER_CLIENT", s[s.HANGUP_BY_OTHER_CLIENT = 102] = "HANGUP_BY_OTHER_CLIENT", s[s.ADDED_TO_BLACKLIST = 103] = "ADDED_TO_BLACKLIST", s[s.SERVICE_NOT_OPENED = 104] = "SERVICE_NOT_OPENED", s))(u || {});
31
- const G = {
30
+ var k = /* @__PURE__ */ ((s) => (s[s.OUTGOING = 1] = "OUTGOING", s[s.INCOMING = 2] = "INCOMING", s[s.RINGING = 3] = "RINGING", s[s.CONNECTED = 4] = "CONNECTED", s[s.IDLE = 5] = "IDLE", s[s.ACCEPTED = 6] = "ACCEPTED", s))(k || {}), h = /* @__PURE__ */ ((s) => (s[s.SUCCESS = 1e4] = "SUCCESS", s[s.STATE_MACHINE_EXIT = 53200] = "STATE_MACHINE_EXIT", s[s.SEND_MSG_ERROR = 53201] = "SEND_MSG_ERROR", s[s.REJECTED_BY_BLACKLIST = 53202] = "REJECTED_BY_BLACKLIST", s[s.NOT_IN_GROUP = 53203] = "NOT_IN_GROUP", s[s.GET_LOCAL_AUDIO_TRACK_ERROR = 53301] = "GET_LOCAL_AUDIO_TRACK_ERROR", s[s.GET_LOCAL_VIDEO_TRACK_ERROR = 53302] = "GET_LOCAL_VIDEO_TRACK_ERROR", s[s.GET_LOCAL_AUDIO_AND_VIDEO_TRACK_ERROR = 53303] = "GET_LOCAL_AUDIO_AND_VIDEO_TRACK_ERROR", s[s.JOIN_ROOM_ERROR = 53304] = "JOIN_ROOM_ERROR", s[s.AUDIO_PUBLISH_ERROR = 53305] = "AUDIO_PUBLISH_ERROR", s[s.VIDEO_PUBLISH_ERROR = 53306] = "VIDEO_PUBLISH_ERROR", s[s.AUDIO_AND_VIDEO_PUBLISH_ERROR = 53307] = "AUDIO_AND_VIDEO_PUBLISH_ERROR", s[s.QUERY_JOINED_USER_INFO_ERROR = 53308] = "QUERY_JOINED_USER_INFO_ERROR", s[s.MISSING_VIDEO_TRACK_ERROR = 53309] = "MISSING_VIDEO_TRACK_ERROR", s[s.UNPUBLISH_VIDEO_ERROR = 53310] = "UNPUBLISH_VIDEO_ERROR", s[s.CONVERSATION_NOT_GROUP_ERROR = 53311] = "CONVERSATION_NOT_GROUP_ERROR", s[s.NOT_IN_ROOM_ERROR = 53312] = "NOT_IN_ROOM_ERROR", s))(h || {}), g = /* @__PURE__ */ ((s) => (s[s.CANCEL = 1] = "CANCEL", s[s.REJECT = 2] = "REJECT", s[s.HANGUP = 3] = "HANGUP", s[s.BUSY_LINE = 4] = "BUSY_LINE", s[s.NO_RESPONSE = 5] = "NO_RESPONSE", s[s.ENGINE_UNSUPPORTED = 6] = "ENGINE_UNSUPPORTED", s[s.NETWORK_ERROR = 7] = "NETWORK_ERROR", s[s.GET_MEDIA_RESOURCES_ERROR = 8] = "GET_MEDIA_RESOURCES_ERROR", s[s.PUBLISH_ERROR = 9] = "PUBLISH_ERROR", s[s.SUBSCRIBE_ERROR = 10] = "SUBSCRIBE_ERROR", s[s.REMOTE_CANCEL = 11] = "REMOTE_CANCEL", s[s.REMOTE_REJECT = 12] = "REMOTE_REJECT", s[s.REMOTE_HANGUP = 13] = "REMOTE_HANGUP", s[s.REMOTE_BUSY_LINE = 14] = "REMOTE_BUSY_LINE", s[s.REMOTE_NO_RESPONSE = 15] = "REMOTE_NO_RESPONSE", s[s.REMOTE_ENGINE_UNSUPPORTED = 16] = "REMOTE_ENGINE_UNSUPPORTED", s[s.REMOTE_NETWORK_ERROR = 17] = "REMOTE_NETWORK_ERROR", s[s.REMOTE_GET_MEDIA_RESOURCE_ERROR = 18] = "REMOTE_GET_MEDIA_RESOURCE_ERROR", s[s.REMOTE_PUBLISH_ERROR = 19] = "REMOTE_PUBLISH_ERROR", s[s.REMOTE_SUBSCRIBE_ERROR = 20] = "REMOTE_SUBSCRIBE_ERROR", s[s.OTHER_CLIENT_JOINED_CALL = 21] = "OTHER_CLIENT_JOINED_CALL", s[s.OTHER_CLIENT_IN_CALL = 22] = "OTHER_CLIENT_IN_CALL", s[s.KICKED_BY_SERVER = 23] = "KICKED_BY_SERVER", s[s.ACCEPT_SYSTEM_CALL = 24] = "ACCEPT_SYSTEM_CALL", s[s.REMOTE_OTHER_CLIENT_JOINED_CALL = 31] = "REMOTE_OTHER_CLIENT_JOINED_CALL", s[s.REMOTE_OTHER_CLIENT_IN_CALL = 32] = "REMOTE_OTHER_CLIENT_IN_CALL", s[s.REMOTE_KICKED_BY_SERVER = 33] = "REMOTE_KICKED_BY_SERVER", s[s.REMOTE_ACCEPT_SYSTEM_CALL = 34] = "REMOTE_ACCEPT_SYSTEM_CALL", s[s.ACCEPT_BY_OTHER_CLIENT = 101] = "ACCEPT_BY_OTHER_CLIENT", s[s.HANGUP_BY_OTHER_CLIENT = 102] = "HANGUP_BY_OTHER_CLIENT", s[s.ADDED_TO_BLACKLIST = 103] = "ADDED_TO_BLACKLIST", s[s.SERVICE_NOT_OPENED = 104] = "SERVICE_NOT_OPENED", s))(g || {});
31
+ const H = {
32
32
  [
33
33
  1
34
34
  /* CANCEL */
@@ -91,8 +91,8 @@ const G = {
91
91
  ]: 34
92
92
  /* REMOTE_ACCEPT_SYSTEM_CALL */
93
93
  };
94
- var E = /* @__PURE__ */ ((s) => (s.VCInvite = "RC:VCInvite", s.VCRinging = "RC:VCRinging", s.VCAccept = "RC:VCAccept", s.VCHangup = "RC:VCHangup", s.VCModifyMem = "RC:VCModifyMem", s.VCModifyMedia = "RC:VCModifyMedia", s))(E || {}), p = /* @__PURE__ */ ((s) => (s[s.WAITING = 0] = "WAITING", s[s.KEEPING = 1] = "KEEPING", s[s.END = 2] = "END", s))(p || {}), m = /* @__PURE__ */ ((s) => (s[s.NONE = 0] = "NONE", s[s.WAITING = 1] = "WAITING", s[s.KEEPING = 2] = "KEEPING", s))(m || {}), x = /* @__PURE__ */ ((s) => (s[s.RCCallRoomTypeNormalCall = 0] = "RCCallRoomTypeNormalCall", s[s.RCCallRoomTypeAcrossCall = 7] = "RCCallRoomTypeAcrossCall", s))(x || {});
95
- let H = class {
94
+ var R = /* @__PURE__ */ ((s) => (s.VCInvite = "RC:VCInvite", s.VCRinging = "RC:VCRinging", s.VCAccept = "RC:VCAccept", s.VCHangup = "RC:VCHangup", s.VCModifyMem = "RC:VCModifyMem", s.VCModifyMedia = "RC:VCModifyMedia", s))(R || {}), m = /* @__PURE__ */ ((s) => (s[s.WAITING = 0] = "WAITING", s[s.KEEPING = 1] = "KEEPING", s[s.END = 2] = "END", s))(m || {}), T = /* @__PURE__ */ ((s) => (s[s.NONE = 0] = "NONE", s[s.WAITING = 1] = "WAITING", s[s.KEEPING = 2] = "KEEPING", s))(T || {}), G = /* @__PURE__ */ ((s) => (s[s.RCCallRoomTypeNormalCall = 0] = "RCCallRoomTypeNormalCall", s[s.RCCallRoomTypeAcrossCall = 7] = "RCCallRoomTypeAcrossCall", s))(G || {});
95
+ let V = class {
96
96
  constructor(e, t) {
97
97
  f(this, "_timerId", 0);
98
98
  f(this, "_startTime", 0);
@@ -188,7 +188,7 @@ class Y {
188
188
  this._logger.warn("_", `[RCCallStateMachine] notifyStateChange -> info: ${JSON.stringify({
189
189
  state: e,
190
190
  reason: t
191
- })}`), this._endReason = t || null, this._sessionState !== e && (this._sessionState = e, (i = this._watchers) == null || i.onStateChange({ state: e, reason: t })), e === p.END && (ne.emit("onStateMachineClose", this._callId), this._callMsgHandler.unregisterStateMachineEvent(this._callId));
191
+ })}`), this._endReason = t || null, this._sessionState !== e && (this._sessionState = e, (i = this._watchers) == null || i.onStateChange({ state: e, reason: t })), e === m.END && (oe.emit("onStateMachineClose", this._callId), this._callMsgHandler.unregisterStateMachineEvent(this._callId));
192
192
  }
193
193
  /**
194
194
  * 通知 call 层人员状态变更及原因
@@ -204,20 +204,20 @@ class Y {
204
204
  const { senderUserId: t, content: { user: i, reason: n }, messageType: o } = e;
205
205
  this._userInfo[t] = {
206
206
  userId: t,
207
- state: m.NONE,
207
+ state: T.NONE,
208
208
  isCaller: !1,
209
209
  isRemote: !1
210
210
  };
211
211
  for (const a in this._userTimers)
212
212
  this._clearTimerById(a);
213
- let r = u.ACCEPT_BY_OTHER_CLIENT;
214
- o === E.VCHangup && (n === u.BUSY_LINE ? r = u.OTHER_CLIENT_IN_CALL : n === u.NO_RESPONSE ? r = u.NO_RESPONSE : r = u.HANGUP_BY_OTHER_CLIENT), Object.assign(this._userInfo[t], i), this._notifyUserStateChange(this._userInfo[t], r), this._notifyStateChange(p.END, r);
213
+ let r = g.ACCEPT_BY_OTHER_CLIENT;
214
+ o === R.VCHangup && (n === g.BUSY_LINE ? r = g.OTHER_CLIENT_IN_CALL : n === g.NO_RESPONSE ? r = g.NO_RESPONSE : r = g.HANGUP_BY_OTHER_CLIENT), Object.assign(this._userInfo[t], i), this._notifyUserStateChange(this._userInfo[t], r), this._notifyStateChange(m.END, r);
215
215
  }
216
216
  /**
217
217
  * 正在通话中,且不是当前已接通用户设备(deviceId)发来的消息
218
218
  */
219
219
  _isRemoteInvalidMsg(e, t) {
220
- return !this._userInfo[e] || !this._userInfo[e].deviceId || !t ? !1 : this._userInfo[e].state === m.KEEPING && this._userInfo[e].deviceId !== t;
220
+ return !this._userInfo[e] || !this._userInfo[e].deviceId || !t ? !1 : this._userInfo[e].state === T.KEEPING && this._userInfo[e].deviceId !== t;
221
221
  }
222
222
  _onRinging(e) {
223
223
  const { senderUserId: t, content: { user: i, deviceId: n } } = e, o = this._isCrossAppkey ? t.split("_")[1] : t;
@@ -237,16 +237,16 @@ class Y {
237
237
  this._otherClientHandle(e);
238
238
  return;
239
239
  }
240
- this._userTimers[r] && this._clearTimerById(r), (this._conversationType === b.PRIVATE ? [a, r] : [r]).forEach((l) => {
240
+ this._userTimers[r] && this._clearTimerById(r), (this._conversationType === w.PRIVATE ? [a, r] : [r]).forEach((l) => {
241
241
  const _ = l === a;
242
242
  this._userInfo[l] = {
243
243
  userId: l,
244
- state: m.KEEPING,
244
+ state: T.KEEPING,
245
245
  isCaller: _,
246
246
  isRemote: _,
247
- deviceId: _ ? q(this._runtime) : n
247
+ deviceId: _ ? X(this._runtime) : n
248
248
  }, _ || (this._beginTimestamp = Date.now(), Object.assign(this._userInfo[r], i)), this._notifyUserStateChange(this._userInfo[l]);
249
- }), this.getCallerId() === a && this._notifyStateChange(p.KEEPING), this._watchers.onAccept({ userId: r });
249
+ }), this.getCallerId() === a && this._notifyStateChange(m.KEEPING), this._watchers.onAccept({ userId: r });
250
250
  }
251
251
  _onMediaModify(e) {
252
252
  const { senderUserId: t, content: { mediaType: i, user: n, deviceId: o } } = e;
@@ -269,13 +269,13 @@ class Y {
269
269
  this._otherClientHandle(e);
270
270
  return;
271
271
  }
272
- if (this._sessionState === p.END) {
272
+ if (this._sessionState === m.END) {
273
273
  this._logger.info("_", `[RCCallStateMachine] Invalid hang up message, current room status has ended -> sessionState: ${this._sessionState}`);
274
274
  return;
275
275
  }
276
- this._userInfo[n] && (this._userInfo[n].state = m.NONE, this._endTimestamp = Date.now(), Object.assign(this._userInfo[n], r), this._notifyUserStateChange(this._userInfo[n], G[o]), delete this._userInfo[n]), G[o] === u.REMOTE_CANCEL ? this.getRemoteUserIds().length < 1 && this._clearTimerById(c) : this.getInviterId() === c ? this._clearTimerById(n) : this.getRemoteUserIds().length < 1 && this._clearTimerById(c);
277
- const l = Object.keys(this._userInfo).length < 2, _ = this._inviterId === n, g = Object.values(this._userInfo).every((I) => I.state !== m.KEEPING);
278
- (l || _ && g) && this._notifyStateChange(p.END, G[o]), this._watchers.onHungup({ userId: n, ...r }, G[o]);
276
+ this._userInfo[n] && (this._userInfo[n].state = T.NONE, this._endTimestamp = Date.now(), Object.assign(this._userInfo[n], r), this._notifyUserStateChange(this._userInfo[n], H[o]), delete this._userInfo[n]), H[o] === g.REMOTE_CANCEL ? this.getRemoteUserIds().length < 1 && this._clearTimerById(c) : this.getInviterId() === c ? this._clearTimerById(n) : this.getRemoteUserIds().length < 1 && this._clearTimerById(c);
277
+ const l = Object.keys(this._userInfo).length < 2, _ = this._inviterId === n, d = Object.values(this._userInfo).every((I) => I.state !== T.KEEPING);
278
+ (l || _ && d) && this._notifyStateChange(m.END, H[o]), this._watchers.onHungup({ userId: n, ...r }, H[o]);
279
279
  }
280
280
  /**
281
281
  * 注册事件监听
@@ -296,7 +296,7 @@ class Y {
296
296
  roomType: c
297
297
  } = i;
298
298
  let l;
299
- c === x.RCCallRoomTypeAcrossCall ? ([, l] = t.split("_"), this._watchers.crossAppkey(!0), this._isCrossAppkey = !0) : l = t;
299
+ c === G.RCCallRoomTypeAcrossCall ? ([, l] = t.split("_"), this._watchers.crossAppkey(!0), this._isCrossAppkey = !0) : l = t;
300
300
  const _ = this._context.getCurrentId();
301
301
  if (this._isRemoteInvalidMsg(l, a)) {
302
302
  this._logger.debug("_", "[RCCallStateMachine] __onInvite -> not the remote device that is currently talking");
@@ -305,26 +305,26 @@ class Y {
305
305
  if (_ === l)
306
306
  return;
307
307
  this._callerId = this._inviterId = l;
308
- const g = [t, ...o];
308
+ const d = [t, ...o];
309
309
  this._callMsgHandler.sendRinging({
310
310
  conversationType: this._conversationType,
311
311
  targetId: this._targetId,
312
312
  channelId: this._channelId,
313
313
  callId: this._callId,
314
- userIds: g.filter((d) => this._isCrossAppkey ? d.split("_")[1] !== _ : d !== _)
314
+ userIds: d.filter((u) => this._isCrossAppkey ? u.split("_")[1] !== _ : u !== _)
315
315
  });
316
316
  const I = this._isCrossAppkey ? [o[0].split("_")[1]] : o;
317
- [l, ...I].forEach((d) => {
318
- this._userInfo[d] = {
319
- userId: d,
320
- state: m.WAITING,
321
- isCaller: d === l,
322
- isRemote: d !== _
323
- }, d === l && Object.assign(this._userInfo[d], r, { deviceId: a }), this._notifyUserStateChange(this._userInfo[d]), d !== l && (this._userTimers[d] = new H(() => {
324
- const M = d === _ ? u.NO_RESPONSE : u.REMOTE_NO_RESPONSE;
325
- d === _ ? this._hungupHandle(M) : (this._userInfo[d] && (this._userInfo[d].state = m.NONE), this._notifyUserStateChange(this._userInfo[d]), this._watchers.onHungup(this._userInfo[d], M), delete this._userInfo[d]);
317
+ [l, ...I].forEach((u) => {
318
+ this._userInfo[u] = {
319
+ userId: u,
320
+ state: T.WAITING,
321
+ isCaller: u === l,
322
+ isRemote: u !== _
323
+ }, u === l && Object.assign(this._userInfo[u], r, { deviceId: a }), this._notifyUserStateChange(this._userInfo[u]), u !== l && (this._userTimers[u] = new V(() => {
324
+ const N = u === _ ? g.NO_RESPONSE : g.REMOTE_NO_RESPONSE;
325
+ u === _ ? this._hungupHandle(N) : (this._userInfo[u] && (this._userInfo[u].state = T.NONE), this._notifyUserStateChange(this._userInfo[u]), this._watchers.onHungup(this._userInfo[u], N), delete this._userInfo[u]);
326
326
  }, this._getTimeout(n)));
327
- }), this._notifyStateChange(p.WAITING);
327
+ }), this._notifyStateChange(m.WAITING);
328
328
  }
329
329
  /**
330
330
  * 收到 memberModify 消息时状态机更新(CallEngine 内部调用)
@@ -338,48 +338,48 @@ class Y {
338
338
  deviceId: c,
339
339
  inviteUserIds: l,
340
340
  mediaType: _
341
- } = i, g = this._context.getCurrentId();
341
+ } = i, d = this._context.getCurrentId();
342
342
  if (this._isRemoteInvalidMsg(t, c)) {
343
343
  this._logger.debug("_", "[RCCallStateMachine] __onMemberModify -> not the remote device that is currently talking");
344
344
  return;
345
345
  }
346
- if (g === t)
346
+ if (d === t)
347
347
  return;
348
- if (this._callerId = a, this._inviterId = t, l.forEach((C) => {
349
- r.push({ userId: C, mediaType: _, callStatus: D.INCOMING });
350
- }), l.includes(g)) {
351
- const C = [];
352
- r.forEach((d) => {
353
- d.userId !== g && C.push(d.userId);
348
+ if (this._callerId = a, this._inviterId = t, l.forEach((E) => {
349
+ r.push({ userId: E, mediaType: _, callStatus: k.INCOMING });
350
+ }), l.includes(d)) {
351
+ const E = [];
352
+ r.forEach((u) => {
353
+ u.userId !== d && E.push(u.userId);
354
354
  }), this._callMsgHandler.sendRinging({
355
355
  conversationType: this._conversationType,
356
356
  targetId: this._targetId,
357
357
  channelId: this._channelId,
358
358
  callId: this._callId,
359
- userIds: C
360
- }), this._notifyStateChange(p.WAITING);
359
+ userIds: E
360
+ }), this._notifyStateChange(m.WAITING);
361
361
  } else
362
362
  this._watchers.onMemberModify({
363
363
  sender: { userId: t, ...o },
364
- invitedUsers: l.map((C) => ({ userId: C }))
364
+ invitedUsers: l.map((E) => ({ userId: E }))
365
365
  });
366
- r.forEach((C) => {
367
- const { userId: d, callStatus: M } = C;
368
- M !== D.IDLE && (this._userInfo[d] = {
369
- userId: d,
370
- state: M !== D.CONNECTED ? m.WAITING : m.KEEPING,
371
- isCaller: t === d,
372
- isRemote: g === d
373
- }, d === t && Object.assign(this._userInfo[d], o, { deviceId: c }), this._notifyUserStateChange(this._userInfo[d]), M !== D.CONNECTED && !this._userTimers[d] && (this._userTimers[d] = new H(() => {
374
- this._userInfo[d] && (this._userInfo[d].state = m.NONE);
375
- const T = d === g ? u.NO_RESPONSE : u.REMOTE_NO_RESPONSE;
376
- this._notifyUserStateChange(this._userInfo[d], T);
366
+ r.forEach((E) => {
367
+ const { userId: u, callStatus: N } = E;
368
+ N !== k.IDLE && (this._userInfo[u] = {
369
+ userId: u,
370
+ state: N !== k.CONNECTED ? T.WAITING : T.KEEPING,
371
+ isCaller: t === u,
372
+ isRemote: d === u
373
+ }, u === t && Object.assign(this._userInfo[u], o, { deviceId: c }), this._notifyUserStateChange(this._userInfo[u]), N !== k.CONNECTED && !this._userTimers[u] && (this._userTimers[u] = new V(() => {
374
+ this._userInfo[u] && (this._userInfo[u].state = T.NONE);
375
+ const M = u === d ? g.NO_RESPONSE : g.REMOTE_NO_RESPONSE;
376
+ this._notifyUserStateChange(this._userInfo[u], M);
377
377
  try {
378
- this._watchers.onHungup(this._userInfo[d], T);
379
- } catch (S) {
380
- this._logger.error("_", `[RCCallStateMachine] call onhungup error -> ${S == null ? void 0 : S.stack}`);
378
+ this._watchers.onHungup(this._userInfo[u], M);
379
+ } catch (p) {
380
+ this._logger.error("_", `[RCCallStateMachine] call onhungup error -> ${p == null ? void 0 : p.stack}`);
381
381
  }
382
- delete this._userInfo[d], (Object.keys(this._userInfo).length < 2 || d === g) && this._notifyStateChange(p.END, T);
382
+ delete this._userInfo[u], (Object.keys(this._userInfo).length < 2 || u === d) && this._notifyStateChange(m.END, M);
383
383
  }, this._getTimeout(n))));
384
384
  });
385
385
  }
@@ -389,13 +389,13 @@ class Y {
389
389
  __handleInviteInSession() {
390
390
  this._logger.info("_", "StateMachine -> __handleInviteInSession");
391
391
  for (const e in this._userInfo)
392
- this._userInfo[e].state && (this._userInfo[e].state = m.NONE), this._notifyUserStateChange(this._userInfo[e]), this._clearTimerById(e);
393
- this._notifyStateChange(p.END, u.BUSY_LINE), this._callMsgHandler.sendHungup({
392
+ this._userInfo[e].state && (this._userInfo[e].state = T.NONE), this._notifyUserStateChange(this._userInfo[e]), this._clearTimerById(e);
393
+ this._notifyStateChange(m.END, g.BUSY_LINE), this._callMsgHandler.sendHungup({
394
394
  channelId: this._channelId,
395
395
  conversationType: this._conversationType,
396
396
  targetId: this._targetId,
397
397
  callId: this._callId,
398
- reason: u.BUSY_LINE,
398
+ reason: g.BUSY_LINE,
399
399
  userIds: this.getRemoteUserIds()
400
400
  });
401
401
  }
@@ -409,7 +409,7 @@ class Y {
409
409
  async __call(e, t = "", i = "", n = "", o = !1) {
410
410
  this._logger.debug("_", `[RCCallStateMachine] invite -> userIds: ${JSON.stringify(e)}`);
411
411
  const r = this._callerId = this._inviterId = this._context.getCurrentId(), { code: a, message: c } = await this._callMsgHandler.sendInvite({
412
- roomType: o ? x.RCCallRoomTypeAcrossCall : x.RCCallRoomTypeNormalCall,
412
+ roomType: o ? G.RCCallRoomTypeAcrossCall : G.RCCallRoomTypeNormalCall,
413
413
  channelId: this._channelId,
414
414
  conversationType: this._conversationType,
415
415
  targetId: this._targetId,
@@ -422,20 +422,20 @@ class Y {
422
422
  });
423
423
  if (this._isCrossAppkey = o, a === h.SUCCESS) {
424
424
  const { sentTime: l } = c;
425
- (o ? [r, e[0].split("_")[1]] : [r, ...e]).forEach((g) => {
426
- const I = g === r;
427
- this._userInfo[g] = {
428
- userId: g,
429
- state: m.WAITING,
425
+ (o ? [r, e[0].split("_")[1]] : [r, ...e]).forEach((d) => {
426
+ const I = d === r;
427
+ this._userInfo[d] = {
428
+ userId: d,
429
+ state: T.WAITING,
430
430
  isCaller: I,
431
431
  isRemote: !I
432
- }, this._notifyUserStateChange(this._userInfo[g]), I || (this._userTimers[g] = new H(() => {
433
- this._userInfo[g] && (this._userInfo[g].state = m.NONE), this._notifyUserStateChange(this._userInfo[g], u.REMOTE_NO_RESPONSE), this._watchers.onHungup(this._userInfo[g], u.REMOTE_NO_RESPONSE), delete this._userInfo[g], Object.keys(this._userInfo).length < 2 && this._notifyStateChange(p.END, u.REMOTE_NO_RESPONSE), this.getRemoteUserIds().length === 0 && this._userInfo[r].state !== m.KEEPING && this._hungupHandle(u.REMOTE_NO_RESPONSE);
432
+ }, this._notifyUserStateChange(this._userInfo[d]), I || (this._userTimers[d] = new V(() => {
433
+ this._userInfo[d] && (this._userInfo[d].state = T.NONE), this._notifyUserStateChange(this._userInfo[d], g.REMOTE_NO_RESPONSE), this._watchers.onHungup(this._userInfo[d], g.REMOTE_NO_RESPONSE), delete this._userInfo[d], Object.keys(this._userInfo).length < 2 && this._notifyStateChange(m.END, g.REMOTE_NO_RESPONSE), this.getRemoteUserIds().length === 0 && this._userInfo[r].state !== T.KEEPING && this._hungupHandle(g.REMOTE_NO_RESPONSE);
434
434
  }, this._getTimeout(l)));
435
- }), this._notifyStateChange(p.WAITING);
435
+ }), this._notifyStateChange(m.WAITING);
436
436
  } else {
437
- const l = a === h.REJECTED_BY_BLACKLIST ? u.ADDED_TO_BLACKLIST : u.NETWORK_ERROR;
438
- this._notifyStateChange(p.END, l);
437
+ const l = a === h.REJECTED_BY_BLACKLIST ? g.ADDED_TO_BLACKLIST : g.NETWORK_ERROR;
438
+ this._notifyStateChange(m.END, l);
439
439
  }
440
440
  return { code: a };
441
441
  }
@@ -453,11 +453,11 @@ class Y {
453
453
  userIds: this.getRemoteUserIds()
454
454
  });
455
455
  if (this._clearTimerById(e), t === h.SUCCESS)
456
- this._userInfo[e] && (this._userInfo[e].state = m.KEEPING), this._beginTimestamp = Date.now(), this._notifyUserStateChange(this._userInfo[e]), this._notifyStateChange(p.KEEPING);
456
+ this._userInfo[e] && (this._userInfo[e].state = T.KEEPING), this._beginTimestamp = Date.now(), this._notifyUserStateChange(this._userInfo[e]), this._notifyStateChange(m.KEEPING);
457
457
  else {
458
- this._userInfo[e] && (this._userInfo[e].state = m.NONE), this._notifyUserStateChange(this._userInfo[e]);
459
- const n = t === h.REJECTED_BY_BLACKLIST ? u.ADDED_TO_BLACKLIST : u.NETWORK_ERROR;
460
- this._notifyStateChange(p.END, n);
458
+ this._userInfo[e] && (this._userInfo[e].state = T.NONE), this._notifyUserStateChange(this._userInfo[e]);
459
+ const n = t === h.REJECTED_BY_BLACKLIST ? g.ADDED_TO_BLACKLIST : g.NETWORK_ERROR;
460
+ this._notifyStateChange(m.END, n);
461
461
  }
462
462
  return { code: t };
463
463
  }
@@ -466,16 +466,16 @@ class Y {
466
466
  * @param userIds 被邀请用户 ID 列表
467
467
  */
468
468
  async invite(e, t = {}) {
469
- if (this._conversationType !== b.GROUP)
469
+ if (this._conversationType !== w.GROUP)
470
470
  return { code: h.CONVERSATION_NOT_GROUP_ERROR };
471
471
  this._logger.debug("_", `[RCCallStateMachine] invite -> userIds: ${JSON.stringify(e)}`);
472
- const i = this._context.getCurrentId(), n = Object.keys(this._userInfo), o = n.map((g) => {
473
- let I = D.CONNECTED;
474
- return (e.includes(g) || this._userInfo[g].state === m.WAITING) && (I = D.RINGING), {
475
- userId: g,
472
+ const i = this._context.getCurrentId(), n = Object.keys(this._userInfo), o = n.map((d) => {
473
+ let I = k.CONNECTED;
474
+ return (e.includes(d) || this._userInfo[d].state === T.WAITING) && (I = k.RINGING), {
475
+ userId: d,
476
476
  mediaType: this._mediaType,
477
477
  callStatus: I,
478
- mediaId: g
478
+ mediaId: d
479
479
  };
480
480
  }), r = t.extra || "", a = t.pushTitle || "", c = t.pushContent || "", { code: l, message: _ } = await this._callMsgHandler.sendMemeberModify({
481
481
  channelId: this._channelId,
@@ -487,33 +487,33 @@ class Y {
487
487
  pushContent: c,
488
488
  mediaType: this._mediaType,
489
489
  // 除自己,其他所有人均需收到 modify 消息,以此更新状态
490
- inviteUserIds: e.filter((g) => g !== i),
490
+ inviteUserIds: e.filter((d) => d !== i),
491
491
  callerId: this.getCallerId(),
492
492
  existedUserPofiles: o,
493
- directionalUserIdList: [...n, ...e].filter((g) => g !== i)
493
+ directionalUserIdList: [...n, ...e].filter((d) => d !== i)
494
494
  });
495
495
  if (l === h.SUCCESS) {
496
- const { sentTime: g } = _;
496
+ const { sentTime: d } = _;
497
497
  e.forEach((I) => {
498
498
  this._userInfo[I] = {
499
499
  userId: I,
500
- state: m.WAITING,
500
+ state: T.WAITING,
501
501
  isCaller: !1,
502
502
  isRemote: !0
503
- }, this._notifyUserStateChange(this._userInfo[I]), this._userTimers[I] = new H(() => {
504
- this._userInfo[I] && (this._userInfo[I].state = m.NONE), this._notifyUserStateChange(this._userInfo[I], u.REMOTE_NO_RESPONSE), this._watchers.onHungup(this._userInfo[I], u.REMOTE_NO_RESPONSE), delete this._userInfo[I], Object.keys(this._userInfo).length < 2 && this._notifyStateChange(p.END, u.REMOTE_NO_RESPONSE);
505
- }, this._getTimeout(g));
503
+ }, this._notifyUserStateChange(this._userInfo[I]), this._userTimers[I] = new V(() => {
504
+ this._userInfo[I] && (this._userInfo[I].state = T.NONE), this._notifyUserStateChange(this._userInfo[I], g.REMOTE_NO_RESPONSE), this._watchers.onHungup(this._userInfo[I], g.REMOTE_NO_RESPONSE), delete this._userInfo[I], Object.keys(this._userInfo).length < 2 && this._notifyStateChange(m.END, g.REMOTE_NO_RESPONSE);
505
+ }, this._getTimeout(d));
506
506
  });
507
507
  } else
508
- e.forEach((g) => {
509
- this._userInfo[g] = {
510
- userId: g,
511
- state: m.NONE,
508
+ e.forEach((d) => {
509
+ this._userInfo[d] = {
510
+ userId: d,
511
+ state: T.NONE,
512
512
  isCaller: !1,
513
513
  isRemote: !0
514
514
  };
515
- const I = l === h.REJECTED_BY_BLACKLIST ? u.ADDED_TO_BLACKLIST : u.NETWORK_ERROR;
516
- this._notifyUserStateChange(this._userInfo[g], I);
515
+ const I = l === h.REJECTED_BY_BLACKLIST ? g.ADDED_TO_BLACKLIST : g.NETWORK_ERROR;
516
+ this._notifyUserStateChange(this._userInfo[d], I);
517
517
  });
518
518
  return { code: l };
519
519
  }
@@ -530,7 +530,7 @@ class Y {
530
530
  pushTitle: this._hungupPushTitle,
531
531
  pushContent: this._hungupPushContent
532
532
  };
533
- if (e === u.OTHER_CLIENT_JOINED_CALL)
533
+ if (e === g.OTHER_CLIENT_JOINED_CALL)
534
534
  this._callMsgHandler.sendHungup(n);
535
535
  else {
536
536
  const { code: o } = await this._callMsgHandler.sendHungup(n);
@@ -538,8 +538,8 @@ class Y {
538
538
  }
539
539
  this._endTimestamp = Date.now();
540
540
  for (const o in this._userInfo)
541
- this._userInfo[o].state = m.NONE, o === t ? this._notifyUserStateChange(this._userInfo[o], e) : this._notifyUserStateChange(this._userInfo[o]), delete this._userInfo[o];
542
- return Object.keys(this._userInfo).length < 2 && this._notifyStateChange(p.END, e), { code: i };
541
+ this._userInfo[o].state = T.NONE, o === t ? this._notifyUserStateChange(this._userInfo[o], e) : this._notifyUserStateChange(this._userInfo[o]), delete this._userInfo[o];
542
+ return Object.keys(this._userInfo).length < 2 && this._notifyStateChange(m.END, e), { code: i };
543
543
  }
544
544
  /**
545
545
  * 挂断
@@ -547,8 +547,8 @@ class Y {
547
547
  async hungup(e = "", t = "") {
548
548
  this._logger.debug("_", "[RCCallStateMachine] hungup");
549
549
  const i = this._context.getCurrentId();
550
- let n = u.HANGUP;
551
- Object.keys(this._userTimers).length > 0 && (this._userInfo[i].isCaller ? n = u.CANCEL : n = u.REJECT);
550
+ let n = g.HANGUP;
551
+ Object.keys(this._userTimers).length > 0 && (this._userInfo[i].isCaller ? n = g.CANCEL : n = g.REJECT);
552
552
  for (const o in this._userTimers)
553
553
  this._clearTimerById(o);
554
554
  return this._hungupHandle(n);
@@ -577,7 +577,7 @@ class Y {
577
577
  this._logger.debug("_", `[RCCallStateMachine] userJoin -> userIds: ${JSON.stringify(e)}`), setTimeout(() => {
578
578
  e.forEach((t) => {
579
579
  const i = this._userInfo[t];
580
- i && i.state !== m.KEEPING && (i.state = m.KEEPING, this._notifyUserStateChange(i)), this._sessionState !== p.KEEPING && this._notifyStateChange(p.KEEPING), this._clearTimerById(t);
580
+ i && i.state !== T.KEEPING && (i.state = T.KEEPING, this._notifyUserStateChange(i)), this._sessionState !== m.KEEPING && this._notifyStateChange(m.KEEPING), this._clearTimerById(t);
581
581
  });
582
582
  }, 300);
583
583
  }
@@ -589,10 +589,10 @@ class Y {
589
589
  this._logger.debug("_", `[RCCallStateMachine] userLeave -> userIds: ${JSON.stringify(e)}`), setTimeout(() => {
590
590
  e.forEach((t) => {
591
591
  const i = this._userInfo[t];
592
- i && i.state !== m.NONE && (i.state = m.NONE, this._notifyUserStateChange(i, u.REMOTE_HANGUP), this._watchers.onHungup(i, u.REMOTE_HANGUP), delete this._userInfo[t]), new H(() => {
592
+ i && i.state !== T.NONE && (i.state = T.NONE, this._notifyUserStateChange(i, g.REMOTE_HANGUP), this._watchers.onHungup(i, g.REMOTE_HANGUP), delete this._userInfo[t]), new V(() => {
593
593
  const n = this.getRemoteUsers();
594
- n.length === 1 && n[0].state === 1 && this._hungupHandle(u.REMOTE_NETWORK_ERROR);
595
- }, 6e4), Object.keys(this._userInfo).length < 2 && this._sessionState !== p.END && (this._endTimestamp = Date.now(), this._notifyStateChange(p.END, u.REMOTE_HANGUP));
594
+ n.length === 1 && n[0].state === 1 && this._hungupHandle(g.REMOTE_NETWORK_ERROR);
595
+ }, 6e4), Object.keys(this._userInfo).length < 2 && this._sessionState !== m.END && (this._endTimestamp = Date.now(), this._notifyStateChange(m.END, g.REMOTE_HANGUP));
596
596
  });
597
597
  }, 300);
598
598
  }
@@ -651,7 +651,7 @@ class Y {
651
651
  * 获取房间状态
652
652
  */
653
653
  getState() {
654
- return this._sessionState === null ? p.END : this._sessionState;
654
+ return this._sessionState === null ? m.END : this._sessionState;
655
655
  }
656
656
  /**
657
657
  * 获取人员状态
@@ -698,7 +698,7 @@ class Y {
698
698
  return this._logger.debug("_", `[RCCallStateMachine] getSummary -> summary: ${JSON.stringify(n)}`), n;
699
699
  }
700
700
  }
701
- var y = /* @__PURE__ */ ((s) => (s[s.AUDIO = 1] = "AUDIO", s[s.AUDIO_VIDEO = 2] = "AUDIO_VIDEO", s))(y || {}), oe = /* @__PURE__ */ ((s) => (s[s.ADD = 1] = "ADD", s[s.REMOVE = 2] = "REMOVE", s))(oe || {}), k = /* @__PURE__ */ ((s) => (s.WEB = "Web", s.IOS = "iOS", s.ANDROID = "Android", s))(k || {});
701
+ var y = /* @__PURE__ */ ((s) => (s[s.AUDIO = 1] = "AUDIO", s[s.AUDIO_VIDEO = 2] = "AUDIO_VIDEO", s))(y || {}), re = /* @__PURE__ */ ((s) => (s[s.ADD = 1] = "ADD", s[s.REMOVE = 2] = "REMOVE", s))(re || {}), b = /* @__PURE__ */ ((s) => (s.WEB = "Web", s.IOS = "iOS", s.ANDROID = "Android", s))(b || {});
702
702
  class fe {
703
703
  constructor(e, t, i) {
704
704
  f(this, "_messages", []);
@@ -728,7 +728,7 @@ class fe {
728
728
  } = e, { callId: c, mediaType: l } = a;
729
729
  this._channelId = i, this._conversationType = n, this._targetId = o, this._callId = c, this._mediaType = l;
730
730
  const _ = r === t;
731
- this._inviterId = r, this._endReason = u.REMOTE_NO_RESPONSE, this._canGenRecord();
731
+ this._inviterId = r, this._endReason = g.REMOTE_NO_RESPONSE, this._canGenRecord();
732
732
  }
733
733
  /**
734
734
  * 到 invite | memberModify 结束
@@ -748,7 +748,7 @@ class fe {
748
748
  * 原因默认己方正常挂断
749
749
  */
750
750
  _doAccept(e) {
751
- this._endReason = u.HANGUP, this._beginTimestamp = e.sentTime, this._canGenRecord();
751
+ this._endReason = g.HANGUP, this._beginTimestamp = e.sentTime, this._canGenRecord();
752
752
  }
753
753
  /**
754
754
  * 到 hungup 说明为正常挂断
@@ -756,7 +756,7 @@ class fe {
756
756
  */
757
757
  _doHungup(e) {
758
758
  const { content: t, sentTime: i, senderUserId: n } = e, { reason: o } = t, r = this._context.getCurrentId(), a = n === r;
759
- this._endReason = a ? o : G[o], this._endTimestamp = i, this._canGenRecord();
759
+ this._endReason = a ? o : H[o], this._endTimestamp = i, this._canGenRecord();
760
760
  }
761
761
  /**
762
762
  * 只修改通话类型
@@ -769,14 +769,14 @@ class fe {
769
769
  if (this._messages.length === 0) {
770
770
  let e = 0;
771
771
  [
772
- u.HANGUP,
773
- u.REMOTE_HANGUP,
774
- u.OTHER_CLIENT_JOINED_CALL,
775
- u.REMOTE_OTHER_CLIENT_JOINED_CALL,
776
- u.KICKED_BY_SERVER,
777
- u.REMOTE_KICKED_BY_SERVER,
778
- u.ACCEPT_SYSTEM_CALL,
779
- u.REMOTE_ACCEPT_SYSTEM_CALL
772
+ g.HANGUP,
773
+ g.REMOTE_HANGUP,
774
+ g.OTHER_CLIENT_JOINED_CALL,
775
+ g.REMOTE_OTHER_CLIENT_JOINED_CALL,
776
+ g.KICKED_BY_SERVER,
777
+ g.REMOTE_KICKED_BY_SERVER,
778
+ g.ACCEPT_SYSTEM_CALL,
779
+ g.REMOTE_ACCEPT_SYSTEM_CALL
780
780
  ].includes(this._endReason) && (e = this._endTimestamp - this._beginTimestamp), this._onRecord({
781
781
  channelId: this._channelId,
782
782
  conversationType: this._conversationType,
@@ -796,22 +796,22 @@ class fe {
796
796
  do {
797
797
  const t = this._messages.shift(), { messageType: i, content: { callId: n } } = t;
798
798
  switch (i) {
799
- case E.VCInvite:
799
+ case R.VCInvite:
800
800
  this._doInvite(t);
801
801
  break;
802
- case E.VCRinging:
802
+ case R.VCRinging:
803
803
  this._doRinging(t);
804
804
  break;
805
- case E.VCAccept:
805
+ case R.VCAccept:
806
806
  this._doAccept(t);
807
807
  break;
808
- case E.VCModifyMem:
808
+ case R.VCModifyMem:
809
809
  this._doMemberModify(t);
810
810
  break;
811
- case E.VCModifyMedia:
811
+ case R.VCModifyMedia:
812
812
  this._doMediaModify(t);
813
813
  break;
814
- case E.VCHangup:
814
+ case R.VCHangup:
815
815
  this._doHungup(t);
816
816
  break;
817
817
  default:
@@ -822,10 +822,10 @@ class fe {
822
822
  }
823
823
  }
824
824
  const Ie = ["RC:VCAccept", "RC:VCRinging", "RC:VCSummary", "RC:VCHangup", "RC:VCInvite", "RC:VCModifyMedia", "RC:VCModifyMem"], Ce = {
825
- [j.REJECTED_BY_BLACKLIST]: h.REJECTED_BY_BLACKLIST,
826
- [j.NOT_IN_GROUP]: h.NOT_IN_GROUP
825
+ [J.REJECTED_BY_BLACKLIST]: h.REJECTED_BY_BLACKLIST,
826
+ [J.NOT_IN_GROUP]: h.NOT_IN_GROUP
827
827
  };
828
- class Re extends te {
828
+ class Re extends se {
829
829
  constructor(t, i, n, o = 60 * 1e3, r) {
830
830
  super();
831
831
  f(this, "_watchers", {});
@@ -834,7 +834,7 @@ class Re extends te {
834
834
  f(this, "_hadHandleMsgTimer", !1);
835
835
  f(this, "_offlineRecorder");
836
836
  f(this, "_deviceId", "");
837
- this._context = t, this._runtime = i, this._logger = n, this._offlineMsgItv = o, this._getStateMachine = r, this._deviceId = q(i), this._context.onmessage = this._onMessage.bind(this), this._offlineRecorder = new fe(this._context, this._logger, (a) => {
837
+ this._context = t, this._runtime = i, this._logger = n, this._offlineMsgItv = o, this._getStateMachine = r, this._deviceId = X(i), this._context.onmessage = this._onMessage.bind(this), this._offlineRecorder = new fe(this._context, this._logger, (a) => {
838
838
  this._logger.info("_", `[CallMessageHandler] offlineRecorder -> ${JSON.stringify(a)}`), this._watchers.onOfflineRecord && this._watchers.onOfflineRecord(a);
839
839
  });
840
840
  }
@@ -864,22 +864,22 @@ class Re extends te {
864
864
  this._logger.info("_", `onMessage -> _onRecvOnlineCallMsg: ${t.messageType}`);
865
865
  const { content: { callId: i } } = t;
866
866
  switch (t.messageType) {
867
- case E.VCInvite:
867
+ case R.VCInvite:
868
868
  this._watchers.onInvite && this._watchers.onInvite(t);
869
869
  break;
870
- case E.VCRinging:
870
+ case R.VCRinging:
871
871
  super.emit(`${i}onRinging`, t);
872
872
  break;
873
- case E.VCAccept:
873
+ case R.VCAccept:
874
874
  super.emit(`${i}onAccept`, t);
875
875
  break;
876
- case E.VCModifyMem:
876
+ case R.VCModifyMem:
877
877
  this._watchers.onInvite && this._watchers.onInvite(t);
878
878
  break;
879
- case E.VCModifyMedia:
879
+ case R.VCModifyMedia:
880
880
  super.emit(`${i}onMediaModify`, t);
881
881
  break;
882
- case E.VCHangup:
882
+ case R.VCHangup:
883
883
  super.emit(`${i}onHungup`, t);
884
884
  break;
885
885
  default:
@@ -913,42 +913,42 @@ class Re extends te {
913
913
  sentTime: a,
914
914
  senderUserId: c,
915
915
  content: { callId: l, inviteUserIds: _ }
916
- } = n[0].msg, g = [E.VCInvite, E.VCModifyMem].includes(r), I = Date.now() - a < this._offlineMsgItv;
917
- if (g) {
918
- const C = [];
919
- for (let T = 0; T < n.length; T++) {
920
- const S = n[T].msg, { content: { callId: N } } = S;
921
- if (l === N)
922
- C.push(S);
916
+ } = n[0].msg, d = [R.VCInvite, R.VCModifyMem].includes(r), I = this._context.getServerTime() - a, E = I < this._offlineMsgItv;
917
+ if (E || this._logger.warn("_", `offline msg delayTime: ${I}ms`), d) {
918
+ const u = [];
919
+ for (let p = 0; p < n.length; p++) {
920
+ const A = n[p].msg, { content: { callId: S } } = A;
921
+ if (l === S)
922
+ u.push(A);
923
923
  else
924
924
  break;
925
925
  }
926
- if (this._logger.warn("_", `taskMsgList length: ${C.length}`), C.length > 0) {
927
- const T = this._msgBufferList.findIndex((N) => N.msg.messageUId === C[C.length - 1].messageUId);
928
- this._msgBufferList = this._msgBufferList.slice(T + 1);
929
- const S = n.findIndex((N) => N.msg.messageUId === C[C.length - 1].messageUId);
930
- n = n.slice(S + 1);
926
+ if (this._logger.warn("_", `taskMsgList length: ${u.length}`), u.length > 0) {
927
+ const p = this._msgBufferList.findIndex((S) => S.msg.messageUId === u[u.length - 1].messageUId);
928
+ this._msgBufferList = this._msgBufferList.slice(p + 1);
929
+ const A = n.findIndex((S) => S.msg.messageUId === u[u.length - 1].messageUId);
930
+ n = n.slice(A + 1);
931
931
  }
932
- const d = (() => {
933
- if (o !== b.PRIVATE)
932
+ const N = (() => {
933
+ if (o !== w.PRIVATE)
934
934
  return !1;
935
- const T = C.length === 1, S = C.every((N) => [E.VCInvite, E.VCModifyMedia, E.VCRinging].includes(N.messageType));
936
- return T || S;
935
+ const p = u.length === 1, A = u.every((S) => [R.VCInvite, R.VCModifyMedia, R.VCRinging].includes(S.messageType));
936
+ return p || A;
937
937
  })(), M = (() => {
938
- if (o !== b.GROUP)
938
+ if (o !== w.GROUP)
939
939
  return !1;
940
- let T = !1, S = !0, N = [c, ..._], A = !1;
941
- for (let U = 0; U < C.length; U++) {
942
- const { senderUserId: R, messageType: v } = C[U];
943
- if (v === E.VCHangup && R === this._context.getCurrentId())
940
+ let p = !1, A = !0, S = [c, ..._], L = !1;
941
+ for (let C = 0; C < u.length; C++) {
942
+ const { senderUserId: U, messageType: v } = u[C];
943
+ if (v === R.VCHangup && U === this._context.getCurrentId())
944
944
  break;
945
- v === E.VCHangup && (A = c === R, N = N.filter((L) => R !== L)), v === E.VCAccept && (S = !1);
945
+ v === R.VCHangup && (L = c === U, S = S.filter((D) => U !== D)), v === R.VCAccept && (A = !1);
946
946
  }
947
- return !(S && A) && N.length > 1 && (T = !0), T;
947
+ return !(A && L) && S.length > 1 && (p = !0), p;
948
948
  })();
949
- I && (d || M) && C.forEach(this._onRecvOnlineCallMsg, this), this._offlineRecorder.onRecvOfflineMsgs(C);
949
+ E && (N || M) && u.forEach(this._onRecvOnlineCallMsg, this), this._offlineRecorder.onRecvOfflineMsgs(u);
950
950
  } else
951
- I && this._getStateMachine(l) ? this._onRecvOnlineCallMsg(n[0].msg) : this._logger.debug("_", `[CallMessageHandler] unexcepted offline msg -> ${JSON.stringify(n[0].msg)}`), n.shift(), this._msgBufferList.shift();
951
+ E && this._getStateMachine(l) ? this._onRecvOnlineCallMsg(n[0].msg) : this._logger.debug("_", `[CallMessageHandler] unexcepted offline msg -> ${JSON.stringify(n[0].msg)}`), n.shift(), this._msgBufferList.shift();
952
952
  } while (n.length > 0);
953
953
  } else {
954
954
  i.forEach(({ msg: o }) => {
@@ -990,27 +990,35 @@ class Re extends te {
990
990
  directionalUserIdList: c,
991
991
  pushTitle: l,
992
992
  pushData: _,
993
- pushContent: g
993
+ pushContent: d
994
994
  } = t, I = {
995
995
  channelId: i,
996
996
  messageType: a,
997
997
  content: r,
998
998
  directionalUserIdList: c
999
999
  };
1000
- let C = {};
1001
- [E.VCInvite, E.VCModifyMem, E.VCHangup].includes(a) && (C = {
1002
- pushTitle: l || "",
1003
- pushContent: g || "",
1004
- pushData: _,
1005
- androidConfig: {
1006
- categoryHW: "VOIP",
1007
- categoryVivo: "IM"
1008
- }
1009
- }, Object.assign(I, { pushConfig: C }));
1010
- const { code: d, data: M } = await this._context.sendMessage(n, o, I);
1011
- return d !== j.SUCCESS ? (this._logger.error("_", `CallMessageHandler] sendCallMesage error -> code: ${d}`), {
1012
- code: Ce[d] || h.SEND_MSG_ERROR
1013
- }) : { code: h.SUCCESS, message: M };
1000
+ if ([R.VCInvite, R.VCModifyMem, R.VCHangup].includes(a)) {
1001
+ const N = {
1002
+ pushTitle: l || "",
1003
+ pushContent: d || "",
1004
+ pushData: _ || "",
1005
+ androidConfig: {
1006
+ categoryHW: "VOIP",
1007
+ categoryVivo: "IM"
1008
+ },
1009
+ iOSConfig: {
1010
+ apnsCollapseId: r.callId
1011
+ },
1012
+ disablePushTitle: !1,
1013
+ forceShowDetailContent: !1,
1014
+ templateId: ""
1015
+ };
1016
+ I.pushConfig = N;
1017
+ }
1018
+ const { code: E, data: u } = await this._context.sendMessage(n, o, I);
1019
+ return E !== J.SUCCESS ? (this._logger.error("_", `CallMessageHandler] sendCallMesage error -> code: ${E}`), {
1020
+ code: Ce[E] || h.SEND_MSG_ERROR
1021
+ }) : { code: h.SUCCESS, message: u };
1014
1022
  }
1015
1023
  /**
1016
1024
  * 发送邀请消息
@@ -1025,12 +1033,12 @@ class Re extends te {
1025
1033
  mediaType: c,
1026
1034
  inviteUserIds: l,
1027
1035
  extra: _,
1028
- pushTitle: g,
1036
+ pushTitle: d,
1029
1037
  pushContent: I
1030
1038
  } = t;
1031
1039
  this._logger.warn("_", "CallMessageHandler] sendCallMesage sendInvite", JSON.stringify(t)), this._watchers.sendAccept && this._watchers.sendAccept({ callId: a });
1032
- const C = {
1033
- platform: k.WEB,
1040
+ const E = {
1041
+ platform: b.WEB,
1034
1042
  deviceId: this._deviceId,
1035
1043
  callId: a,
1036
1044
  roomType: i,
@@ -1046,10 +1054,10 @@ class Re extends te {
1046
1054
  channelId: n,
1047
1055
  conversationType: o,
1048
1056
  targetId: r,
1049
- content: C,
1050
- messageType: E.VCInvite,
1051
- directionalUserIdList: o === b.GROUP ? l : [r],
1052
- pushTitle: g,
1057
+ content: E,
1058
+ messageType: R.VCInvite,
1059
+ directionalUserIdList: o === w.GROUP ? l : [r],
1060
+ pushTitle: d,
1053
1061
  pushContent: I,
1054
1062
  pushData: JSON.stringify({
1055
1063
  mediaType: c,
@@ -1071,12 +1079,12 @@ class Re extends te {
1071
1079
  inviteUserIds: c,
1072
1080
  callerId: l,
1073
1081
  existedUserPofiles: _,
1074
- directionalUserIdList: g,
1082
+ directionalUserIdList: d,
1075
1083
  extra: I,
1076
- pushTitle: C,
1077
- pushContent: d
1078
- } = t, M = {
1079
- platform: k.WEB,
1084
+ pushTitle: E,
1085
+ pushContent: u
1086
+ } = t, N = {
1087
+ platform: b.WEB,
1080
1088
  // TODO 与 IM 一致
1081
1089
  deviceId: this._deviceId,
1082
1090
  callId: r,
@@ -1088,18 +1096,18 @@ class Re extends te {
1088
1096
  observerUserIds: [],
1089
1097
  user: this._userInfo,
1090
1098
  caller: l,
1091
- modifyMemType: oe.ADD,
1099
+ modifyMemType: re.ADD,
1092
1100
  existedUserPofiles: _
1093
1101
  };
1094
1102
  return this._sendCallMessage({
1095
1103
  channelId: i,
1096
1104
  conversationType: n,
1097
1105
  targetId: o,
1098
- content: M,
1099
- messageType: E.VCModifyMem,
1100
- directionalUserIdList: g,
1101
- pushTitle: C,
1102
- pushContent: d,
1106
+ content: N,
1107
+ messageType: R.VCModifyMem,
1108
+ directionalUserIdList: d,
1109
+ pushTitle: E,
1110
+ pushContent: u,
1103
1111
  pushData: JSON.stringify({
1104
1112
  mediaType: a,
1105
1113
  userIdList: c,
@@ -1118,7 +1126,7 @@ class Re extends te {
1118
1126
  callId: r,
1119
1127
  userIds: a
1120
1128
  } = t, c = {
1121
- platform: k.WEB,
1129
+ platform: b.WEB,
1122
1130
  deviceId: this._deviceId,
1123
1131
  callId: r,
1124
1132
  user: this._userInfo
@@ -1128,7 +1136,7 @@ class Re extends te {
1128
1136
  conversationType: n,
1129
1137
  targetId: o,
1130
1138
  content: c,
1131
- messageType: E.VCRinging,
1139
+ messageType: R.VCRinging,
1132
1140
  directionalUserIdList: a
1133
1141
  });
1134
1142
  }
@@ -1144,7 +1152,7 @@ class Re extends te {
1144
1152
  mediaType: a,
1145
1153
  userIds: c
1146
1154
  } = t, l = {
1147
- platform: k.WEB,
1155
+ platform: b.WEB,
1148
1156
  deviceId: this._deviceId,
1149
1157
  callId: r,
1150
1158
  mediaType: a,
@@ -1155,7 +1163,7 @@ class Re extends te {
1155
1163
  conversationType: n,
1156
1164
  targetId: o,
1157
1165
  content: l,
1158
- messageType: E.VCAccept,
1166
+ messageType: R.VCAccept,
1159
1167
  directionalUserIdList: c
1160
1168
  });
1161
1169
  }
@@ -1172,8 +1180,8 @@ class Re extends te {
1172
1180
  userIds: c,
1173
1181
  pushTitle: l,
1174
1182
  pushContent: _
1175
- } = t, g = {
1176
- platform: k.WEB,
1183
+ } = t, d = {
1184
+ platform: b.WEB,
1177
1185
  deviceId: this._deviceId,
1178
1186
  callId: r,
1179
1187
  reason: a,
@@ -1183,8 +1191,8 @@ class Re extends te {
1183
1191
  channelId: i,
1184
1192
  conversationType: n,
1185
1193
  targetId: o,
1186
- content: g,
1187
- messageType: E.VCHangup,
1194
+ content: d,
1195
+ messageType: R.VCHangup,
1188
1196
  pushTitle: l,
1189
1197
  pushContent: _,
1190
1198
  pushData: JSON.stringify({
@@ -1206,7 +1214,7 @@ class Re extends te {
1206
1214
  mediaType: a,
1207
1215
  userIds: c
1208
1216
  } = t, l = {
1209
- platform: k.WEB,
1217
+ platform: b.WEB,
1210
1218
  deviceId: this._deviceId,
1211
1219
  callId: r,
1212
1220
  mediaType: a,
@@ -1217,7 +1225,7 @@ class Re extends te {
1217
1225
  conversationType: n,
1218
1226
  targetId: o,
1219
1227
  content: l,
1220
- messageType: E.VCModifyMedia,
1228
+ messageType: R.VCModifyMedia,
1221
1229
  directionalUserIdList: c
1222
1230
  });
1223
1231
  }
@@ -1234,7 +1242,7 @@ const Ee = {
1234
1242
  VIDEO: "您有一条视频通话"
1235
1243
  }
1236
1244
  };
1237
- class re {
1245
+ class ae {
1238
1246
  static set(e) {
1239
1247
  this._lang = e;
1240
1248
  }
@@ -1242,9 +1250,7 @@ class re {
1242
1250
  return this._lang === P.EN ? Ee : Te;
1243
1251
  }
1244
1252
  }
1245
- f(re, "_lang", P.ZH);
1246
- w.add("call-engine", "5.2.1");
1247
- w.validEngine("5.7.7") || console.error(`The current engine version '${w.getInfo().engine}' error,call-engine required engine version at least '5.7.7'.`);
1253
+ f(ae, "_lang", P.ZH);
1248
1254
  class me {
1249
1255
  /**
1250
1256
  * 初始化
@@ -1252,13 +1258,13 @@ class me {
1252
1258
  constructor(e, t, i, n, o) {
1253
1259
  f(this, "_stateMachine", {});
1254
1260
  f(this, "_callMsgHandler");
1255
- this._context = e, this._runtime = t, this._logger = i, this._watchers = n, this._options = o, this._logger.warn("_", "RCCallEngine Version: 5.2.1 CommitId: ff0169641932396e57155691652985763b06fe25"), q(t), this._callMsgHandler = new Re(this._context, this._runtime, this._logger, this._options.offlineMsgItv, this._getStateMachine.bind(this)), this._callMsgHandler.registerEventListener({
1261
+ this._context = e, this._runtime = t, this._logger = i, this._watchers = n, this._options = o, this._logger.warn("_", "RCCallEngine Version: 5.2.2 CommitId: 86bccfbf7c2cb63551451abd10a7e86d8b330df4"), X(t), this._callMsgHandler = new Re(this._context, this._runtime, this._logger, this._options.offlineMsgItv, this._getStateMachine.bind(this)), this._callMsgHandler.registerEventListener({
1256
1262
  onInvite: this._onInvite.bind(this),
1257
1263
  sendAccept: this._handleSendAccept.bind(this),
1258
1264
  onOfflineRecord: this._watchers.onOfflineRecord
1259
- }), ne.on("onStateMachineClose", (r) => {
1265
+ }), oe.on("onStateMachineClose", (r) => {
1260
1266
  delete this._stateMachine[r];
1261
- }), re.set(o.lang);
1267
+ }), ae.set(o.lang);
1262
1268
  }
1263
1269
  _onInvite(e) {
1264
1270
  const {
@@ -1274,15 +1280,15 @@ class me {
1274
1280
  const {
1275
1281
  mediaType: l,
1276
1282
  callId: _,
1277
- extra: g,
1283
+ extra: d,
1278
1284
  roomType: I
1279
1285
  } = o;
1280
- let C;
1281
- I !== x.RCCallRoomTypeAcrossCall ? C = a : [, C] = a.split("_");
1282
- const d = this._context.getCurrentId();
1283
- if (this._context.getCurrentId() === C || r === E.VCModifyMem && o.existedUserPofiles.some((S) => S.userId === d) && !this._stateMachine[_])
1286
+ let E;
1287
+ I !== G.RCCallRoomTypeAcrossCall ? E = a : [, E] = a.split("_");
1288
+ const u = this._context.getCurrentId();
1289
+ if (this._context.getCurrentId() === E || r === R.VCModifyMem && o.existedUserPofiles.some((p) => p.userId === u) && !this._stateMachine[_])
1284
1290
  return;
1285
- this._stateMachine[_] ? r === E.VCModifyMem && this._stateMachine[_].__onMemberModify(e) : (this._stateMachine[_] = new Y(
1291
+ this._stateMachine[_] ? r === R.VCModifyMem && this._stateMachine[_].__onMemberModify(e) : (this._stateMachine[_] = new Y(
1286
1292
  this._context,
1287
1293
  this._runtime,
1288
1294
  this._logger,
@@ -1292,7 +1298,7 @@ class me {
1292
1298
  n,
1293
1299
  l,
1294
1300
  _
1295
- ), this._logger.info("_", `[RCCallEngine] RCCallStateMachine successfully created -> callId: ${_}`), r === E.VCInvite ? this._stateMachine[_].__onInvite(e) : r === E.VCModifyMem && this._stateMachine[_].__onMemberModify(e), this._watchers.onInvite(this._stateMachine[_], g), Object.keys(this._stateMachine).filter((S) => _ !== S).length > 0 && !this._options.isAllowAcceptNewCall && this._stateMachine[_].__handleInviteInSession());
1301
+ ), this._logger.info("_", `[RCCallEngine] RCCallStateMachine successfully created -> callId: ${_}`), r === R.VCInvite ? this._stateMachine[_].__onInvite(e) : r === R.VCModifyMem && this._stateMachine[_].__onMemberModify(e), this._watchers.onInvite(this._stateMachine[_], d), Object.keys(this._stateMachine).filter((p) => _ !== p).length > 0 && !this._options.isAllowAcceptNewCall && this._stateMachine[_].__handleInviteInSession());
1296
1302
  }
1297
1303
  /**
1298
1304
  * 允许接听新的通话时,接听完新的通话后,挂断其他通话
@@ -1334,7 +1340,7 @@ class me {
1334
1340
  pushTitle: o,
1335
1341
  pushContent: r
1336
1342
  })}`);
1337
- const c = Z();
1343
+ const c = Q();
1338
1344
  if (Object.keys(this._stateMachine).length > 0)
1339
1345
  return { code: h.STATE_MACHINE_EXIT };
1340
1346
  this._stateMachine[c] = new Y(
@@ -1343,7 +1349,7 @@ class me {
1343
1349
  this._logger,
1344
1350
  this._callMsgHandler,
1345
1351
  e,
1346
- b.PRIVATE,
1352
+ w.PRIVATE,
1347
1353
  t,
1348
1354
  i,
1349
1355
  c
@@ -1366,7 +1372,7 @@ class me {
1366
1372
  */
1367
1373
  async callInGroup(e, t, i, n, o = "", r = "", a = "") {
1368
1374
  this._logger.debug("_", `[RCCallEngine] callInGroup -> args: ${JSON.stringify({ channelId: e, targetId: t, mediaType: i })}`);
1369
- const c = Z();
1375
+ const c = Q();
1370
1376
  if (Object.keys(this._stateMachine).length > 0)
1371
1377
  return { code: h.STATE_MACHINE_EXIT };
1372
1378
  this._stateMachine[c] = new Y(
@@ -1375,7 +1381,7 @@ class me {
1375
1381
  this._logger,
1376
1382
  this._callMsgHandler,
1377
1383
  e,
1378
- b.GROUP,
1384
+ w.GROUP,
1379
1385
  t,
1380
1386
  i,
1381
1387
  c
@@ -1393,7 +1399,7 @@ class me {
1393
1399
  this._logger.debug("_", "[RCCallEngine] destroy"), this._stateMachine = {};
1394
1400
  }
1395
1401
  }
1396
- var $ = /* @__PURE__ */ ((s) => (s[s.CALLER = 1] = "CALLER", s[s.CALLEE = 2] = "CALLEE", s))($ || {});
1402
+ var x = /* @__PURE__ */ ((s) => (s[s.CALLER = 1] = "CALLER", s[s.CALLEE = 2] = "CALLEE", s))(x || {});
1397
1403
  class pe {
1398
1404
  constructor() {
1399
1405
  f(this, "list", {});
@@ -1431,15 +1437,15 @@ class pe {
1431
1437
  });
1432
1438
  }
1433
1439
  }
1434
- const B = new pe();
1440
+ const $ = new pe();
1435
1441
  function Se(s) {
1436
1442
  return Object.values(P).includes(s);
1437
1443
  }
1438
1444
  function Oe(s) {
1439
- return Object.values(se).includes(s);
1445
+ return Object.values(ie).includes(s);
1440
1446
  }
1441
1447
  function ye(s) {
1442
- return Object.values(_e).includes(s);
1448
+ return [B.DEBUG, B.INFO, B.WARN, B.ERROR].includes(s);
1443
1449
  }
1444
1450
  const Me = (s) => {
1445
1451
  if (!s)
@@ -1449,7 +1455,7 @@ const Me = (s) => {
1449
1455
  const e = ["rtcClient", "onSession", "onSessionClose"], t = Object.keys(s), i = [];
1450
1456
  return e.forEach((n) => {
1451
1457
  t.includes(n) || i.push(n);
1452
- }), i.length ? { result: !1, msg: `Initialization missing parameter -> "${i.join(",")}"` } : typeof s.rtcClient != "object" ? { result: !1, msg: "Initialization 'rtcClient' parameter must be of type 'object'" } : typeof s.onSession != "function" ? { result: !1, msg: "Initialization 'onSession' parameter must be of type 'function'" } : typeof s.onSessionClose != "function" ? { result: !1, msg: "Initialization 'onSessionClose' parameter must be of type 'function'" } : typeof s.isAllowSubscribeRetry < "u" && typeof s.isAllowSubscribeRetry != "boolean" ? { result: !1, msg: "Initialization 'isAllowSubscribeRetry' parameter must be of type 'boolean'" } : typeof s.isAllowPublishRetry < "u" && typeof s.isAllowPublishRetry != "boolean" ? { result: !1, msg: "Initialization 'isAllowPublishRetry' parameter must be of type 'boolean'" } : typeof s.isOffCameraWhenVideoDisable < "u" && typeof s.isOffCameraWhenVideoDisable != "boolean" ? { result: !1, msg: "Initialization 'isOffCameraWhenVideoDisable' parameter must be of type 'boolean'" } : typeof s.joinType < "u" && !Oe(s.joinType) ? { result: !1, msg: "Initialization 'joinType' parameter must be of type correct type" } : typeof s.isAllowDemotionGetStream < "u" && typeof s.isAllowDemotionGetStream != "boolean" ? { result: !1, msg: "Initialization 'isAllowDemotionGetStream' parameter must be of type 'boolean'" } : typeof s.lang < "u" && !Se(s.lang) ? { result: !1, msg: "Initialization 'lang' parameter must be of type correct type" } : typeof s.logLevel < "u" && !ye(s.logLevel) ? { result: !1, msg: "Initialization 'logLevel' parameter must be of type correct type" } : typeof s.logStdout < "u" && typeof s.logStdout != "function" ? { result: !1, msg: "Initialization 'logStdout' parameter must be of type 'function'" } : { result: !0 };
1458
+ }), i.length ? { result: !1, msg: `Initialization missing parameter -> "${i.join(",")}"` } : typeof s.rtcClient != "object" ? { result: !1, msg: "Initialization 'rtcClient' parameter must be of type 'object'" } : typeof s.onSession != "function" ? { result: !1, msg: "Initialization 'onSession' parameter must be of type 'function'" } : typeof s.onSessionClose != "function" ? { result: !1, msg: "Initialization 'onSessionClose' parameter must be of type 'function'" } : typeof s.isAllowSubscribeRetry < "u" && typeof s.isAllowSubscribeRetry != "boolean" ? { result: !1, msg: "Initialization 'isAllowSubscribeRetry' parameter must be of type 'boolean'" } : typeof s.isAllowPublishRetry < "u" && typeof s.isAllowPublishRetry != "boolean" ? { result: !1, msg: "Initialization 'isAllowPublishRetry' parameter must be of type 'boolean'" } : typeof s.isOffCameraWhenVideoDisable < "u" && typeof s.isOffCameraWhenVideoDisable != "boolean" ? { result: !1, msg: "Initialization 'isOffCameraWhenVideoDisable' parameter must be of type 'boolean'" } : typeof s.joinType < "u" && !Oe(s.joinType) ? { result: !1, msg: "Initialization 'joinType' parameter must be of type correct type" } : typeof s.isAllowDemotionGetStream < "u" && typeof s.isAllowDemotionGetStream != "boolean" ? { result: !1, msg: "Initialization 'isAllowDemotionGetStream' parameter must be of type 'boolean'" } : typeof s.lang < "u" && !Se(s.lang) ? { result: !1, msg: "Initialization 'lang' parameter must be of type correct type" } : typeof s.logOutputLevel < "u" && !ye(s.logOutputLevel) ? { result: !1, msg: "Initialization 'logOutputLevel' parameter must be of type correct type" } : { result: !0 };
1453
1459
  }, K = (s) => {
1454
1460
  if (!s)
1455
1461
  return { result: !1, msg: "missing parameter -> listener" };
@@ -1459,10 +1465,10 @@ const Me = (s) => {
1459
1465
  return e.forEach((n) => {
1460
1466
  t.includes(n) || i.push(n);
1461
1467
  }), i.length ? { result: !1, msg: `missing parameter -> "${i.join(",")}"` } : typeof s.onRinging != "function" ? { result: !1, msg: "'onRinging' parameter must be of type 'function'" } : typeof s.onAccept != "function" ? { result: !1, msg: "'onAccept' parameter must be of type 'function'" } : typeof s.onHungup != "function" ? { result: !1, msg: "'onHungup' parameter must be of type 'function'" } : typeof s.onTrackReady != "function" ? { result: !1, msg: "'onTrackReady' parameter must be of type 'function'" } : { result: !0 };
1462
- }, Q = (s) => s && typeof s == "string" ? { result: !0 } : { result: !1, msg: "'targetId' parameter is required, must be of type 'string'" }, ee = (s) => s === y.AUDIO || s === y.AUDIO_VIDEO ? { result: !0 } : { result: !1, msg: "'mediaType' parameter is required, must be of type 'RCCallMediaType'" }, F = (s) => typeof s == "string" ? { result: !0 } : { result: !1, msg: "'extra' parameter must be of type 'string'" }, J = (s) => typeof s == "string" ? { result: !0 } : { result: !1, msg: "'pushTitle' parameter must be of type 'string'" }, W = (s) => typeof s == "string" ? { result: !0 } : { result: !1, msg: "'pushContent' parameter must be of type 'string'" }, Ne = (s) => {
1468
+ }, ee = (s) => s && typeof s == "string" ? { result: !0 } : { result: !1, msg: "'targetId' parameter is required, must be of type 'string'" }, te = (s) => s === y.AUDIO || s === y.AUDIO_VIDEO ? { result: !0 } : { result: !1, msg: "'mediaType' parameter is required, must be of type 'RCCallMediaType'" }, q = (s) => typeof s == "string" ? { result: !0 } : { result: !1, msg: "'extra' parameter must be of type 'string'" }, j = (s) => typeof s == "string" ? { result: !0 } : { result: !1, msg: "'pushTitle' parameter must be of type 'string'" }, W = (s) => typeof s == "string" ? { result: !0 } : { result: !1, msg: "'pushContent' parameter must be of type 'string'" }, Ne = (s) => {
1463
1469
  const { pushTitle: e = "", pushContent: t = "" } = s, i = [];
1464
- return i.push(J(e)), i.push(W(t)), i;
1465
- }, ae = (s) => Array.isArray(s) ? s.length ? s.every((e) => typeof e == "string" && e.length > 0) ? { result: !0 } : { result: !1, msg: "'userIds' parameter is required" } : { result: !1, msg: "'userIds' parameter is required, must be of type 'string[]'" } : { result: !1, msg: "'userIds' parameter is required, must be of type 'string[]'" };
1470
+ return i.push(j(e)), i.push(W(t)), i;
1471
+ }, le = (s) => Array.isArray(s) ? s.length ? s.every((e) => typeof e == "string" && e.length > 0) ? { result: !0 } : { result: !1, msg: "'userIds' parameter is required" } : { result: !1, msg: "'userIds' parameter is required, must be of type 'string[]'" } : { result: !1, msg: "'userIds' parameter is required, must be of type 'string[]'" };
1466
1472
  function Ae(s) {
1467
1473
  return ["FPS_10", "FPS_15", "FPS_24", "FPS_30"].includes(s);
1468
1474
  }
@@ -1489,7 +1495,7 @@ class De {
1489
1495
  this._startTime = 0;
1490
1496
  }
1491
1497
  }
1492
- class z {
1498
+ class F {
1493
1499
  constructor(e, t, i, n = {}) {
1494
1500
  /**
1495
1501
  * RTC房间实例
@@ -1521,19 +1527,19 @@ class z {
1521
1527
  */
1522
1528
  onStateChange: async (a) => {
1523
1529
  const { state: c, reason: l } = a;
1524
- if (this._logger.info("_", `[RCCallSession onStateChange] : state->${c} reason->${l}`), c === p.KEEPING) {
1530
+ if (this._logger.info("_", `[RCCallSession onStateChange] : state->${c} reason->${l}`), c === m.KEEPING) {
1525
1531
  const _ = this._stateMachine.getCallId();
1526
1532
  this._logger.info("_", `[RCCallSession onStateChange] roomId: ${_}`);
1527
1533
  try {
1528
1534
  await this._joinRoom(_);
1529
- } catch (g) {
1530
- this._exceptionClose(u.NETWORK_ERROR), this._logger.error("_", `[RCCallSession onStateChange] joinRoom throw exception roomId -> ${_}`), console.error(g);
1535
+ } catch (d) {
1536
+ this._exceptionClose(g.NETWORK_ERROR), this._logger.error("_", `[RCCallSession onStateChange] joinRoom throw exception roomId -> ${_}`), console.error(d);
1531
1537
  }
1532
- } else if (c === p.END) {
1538
+ } else if (c === m.END) {
1533
1539
  if (!this._room) {
1534
1540
  this._options.localTracks && this._destroyTracks(this._options.localTracks);
1535
1541
  const _ = this._stateMachine.getSummary();
1536
- B.emit("sessionClose", { session: this, summaryInfo: _ });
1542
+ $.emit("sessionClose", { session: this, summaryInfo: _ });
1537
1543
  return;
1538
1544
  }
1539
1545
  this._options.localTracks && this._destroyTracks(this._options.localTracks), this._logger.info("_", "[RCCallSession onStateChange] localTracks destroyed"), this._leaveRoom(), this._room = null;
@@ -1617,25 +1623,25 @@ class z {
1617
1623
  this._options.isCrossAppkey ? t = await this._rtcClient.joinCrossRTCRoom(e, this._options.joinType) : t = await this._rtcClient.joinRTCRoom(e, this._options.joinType);
1618
1624
  const { code: i, userIds: n, room: o } = t;
1619
1625
  if (i !== O.SUCCESS)
1620
- return i === O.NOT_OPEN_VIDEO_AUDIO_SERVER && this._exceptionClose(u.SERVICE_NOT_OPENED), i === O.SIGNAL_JOIN_RTC_ROOM_REFUSED ? this._exceptionClose(u.OTHER_CLIENT_IN_CALL) : this._exceptionClose(u.NETWORK_ERROR), this._logger.info("_", `[RCCallClient _joinRoom] join room failed: roomId -> ${e} RCRTCCode -> ${i}`), { code: h.JOIN_ROOM_ERROR };
1621
- if (this._stateMachine.getState() === p.END)
1626
+ return i === O.NOT_OPEN_VIDEO_AUDIO_SERVER && this._exceptionClose(g.SERVICE_NOT_OPENED), i === O.SIGNAL_JOIN_RTC_ROOM_REFUSED ? this._exceptionClose(g.OTHER_CLIENT_IN_CALL) : this._exceptionClose(g.NETWORK_ERROR), this._logger.info("_", `[RCCallClient _joinRoom] join room failed: roomId -> ${e} RCRTCCode -> ${i}`), { code: h.JOIN_ROOM_ERROR };
1627
+ if (this._stateMachine.getState() === m.END)
1622
1628
  return await this._rtcClient.leaveRoom(o), this._room = null, { code: h.SUCCESS };
1623
1629
  n.length < 1 && (this.joinRoomTimer = new De(() => {
1624
- this._exceptionClose(u.REMOTE_NETWORK_ERROR);
1630
+ this._exceptionClose(g.REMOTE_NETWORK_ERROR);
1625
1631
  }, 6e4)), this._room = o;
1626
1632
  } catch (i) {
1627
- return this._exceptionClose(u.NETWORK_ERROR), this._logger.error("_", `[RCCallSession _joinRoom] _rtcClient.joinRTCRoom throw exception roomId -> ${e}`), console.error(i), { code: h.JOIN_ROOM_ERROR };
1633
+ return this._exceptionClose(g.NETWORK_ERROR), this._logger.error("_", `[RCCallSession _joinRoom] _rtcClient.joinRTCRoom throw exception roomId -> ${e}`), console.error(i), { code: h.JOIN_ROOM_ERROR };
1628
1634
  }
1629
1635
  this._registerRoomEventListener(), this._registerReportListener();
1630
1636
  try {
1631
1637
  await this._subscribeInRoomRemoteTrack();
1632
1638
  } catch (i) {
1633
- return this._exceptionClose(u.SUBSCRIBE_ERROR), this._logger.error("_", `[RCCallSession _joinRoom] _subscribeInRoomRemoteTrack Exception roomId -> ${e}`), console.error(i), { code: h.JOIN_ROOM_ERROR };
1639
+ return this._exceptionClose(g.SUBSCRIBE_ERROR), this._logger.error("_", `[RCCallSession _joinRoom] _subscribeInRoomRemoteTrack Exception roomId -> ${e}`), console.error(i), { code: h.JOIN_ROOM_ERROR };
1634
1640
  }
1635
1641
  try {
1636
1642
  await this._publish();
1637
1643
  } catch (i) {
1638
- return this._exceptionClose(u.PUBLISH_ERROR), this._logger.error("_", `[RCCallSession _joinRoom] _publish Exception roomId -> ${e}`), console.error(i), { code: h.JOIN_ROOM_ERROR };
1644
+ return this._exceptionClose(g.PUBLISH_ERROR), this._logger.error("_", `[RCCallSession _joinRoom] _publish Exception roomId -> ${e}`), console.error(i), { code: h.JOIN_ROOM_ERROR };
1639
1645
  }
1640
1646
  return { code: h.SUCCESS };
1641
1647
  }
@@ -1646,7 +1652,7 @@ class z {
1646
1652
  const e = this._room.getRemoteTracks();
1647
1653
  if (e.length) {
1648
1654
  const { code: t } = await this._subscribeRetry(e, this._options.isAllowSubscribeRetry, this._RETRYCOUNT);
1649
- t !== O.SUCCESS && (this._exceptionClose(u.SUBSCRIBE_ERROR), this._logger.error("_", `[RCCallSession _subscribeInRoomRemoteTrack] Resource subscription failed roomId -> ${this._stateMachine.getCallId()} RTC code -> ${t}`));
1655
+ t !== O.SUCCESS && (this._exceptionClose(g.SUBSCRIBE_ERROR), this._logger.error("_", `[RCCallSession _subscribeInRoomRemoteTrack] Resource subscription failed roomId -> ${this._stateMachine.getCallId()} RTC code -> ${t}`));
1650
1656
  }
1651
1657
  }
1652
1658
  /**
@@ -1677,10 +1683,10 @@ class z {
1677
1683
  async _publish() {
1678
1684
  const e = this._options.localTracks, { code: t } = await this._publishRetry(e, this._options.isAllowPublishRetry, this._RETRYCOUNT);
1679
1685
  if (t !== O.SUCCESS) {
1680
- this._exceptionClose(u.PUBLISH_ERROR), this._logger.info("_", `[RCCallSession _publist] Resource publishing failed: roomId -> ${this._stateMachine.getCallId()} RCRTCCode -> ${t}`);
1686
+ this._exceptionClose(g.PUBLISH_ERROR), this._logger.info("_", `[RCCallSession _publist] Resource publishing failed: roomId -> ${this._stateMachine.getCallId()} RCRTCCode -> ${t}`);
1681
1687
  return;
1682
1688
  }
1683
- this._options.produceType === $.CALLEE && this._notifyTrackReady(e);
1689
+ this._options.produceType === x.CALLEE && this._notifyTrackReady(e);
1684
1690
  }
1685
1691
  /**
1686
1692
  * 可以重试的发布
@@ -1714,7 +1720,7 @@ class z {
1714
1720
  this._logger.error("_", "[RCCallSession _leaveRoom] leaveRoom throw exception"), console.error(e);
1715
1721
  } finally {
1716
1722
  const e = this._stateMachine.getSummary();
1717
- B.emit("sessionClose", { session: this, summaryInfo: e });
1723
+ $.emit("sessionClose", { session: this, summaryInfo: e });
1718
1724
  }
1719
1725
  }
1720
1726
  /**
@@ -1749,12 +1755,12 @@ class z {
1749
1755
  const { code: o, tracks: r } = await this._getLocalTrackCore(y.AUDIO_VIDEO, t);
1750
1756
  if (o !== h.SUCCESS) {
1751
1757
  const { code: a, tracks: c } = await this._getLocalTrackCore(y.AUDIO, t);
1752
- return a !== h.SUCCESS ? (this._exceptionClose(u.GET_MEDIA_RESOURCES_ERROR), { code: a }) : { code: a, tracks: c };
1758
+ return a !== h.SUCCESS ? (this._exceptionClose(g.GET_MEDIA_RESOURCES_ERROR), { code: a }) : { code: a, tracks: c };
1753
1759
  }
1754
1760
  return { code: o, tracks: r };
1755
1761
  }
1756
1762
  const { code: i, tracks: n } = await this._getLocalTrackCore(e, t);
1757
- return i !== h.SUCCESS ? (this._exceptionClose(u.GET_MEDIA_RESOURCES_ERROR), { code: i }) : { code: i, tracks: n };
1763
+ return i !== h.SUCCESS ? (this._exceptionClose(g.GET_MEDIA_RESOURCES_ERROR), { code: i }) : { code: i, tracks: n };
1758
1764
  }
1759
1765
  /**
1760
1766
  * 通话中更换音频设备
@@ -1780,8 +1786,8 @@ class z {
1780
1786
  * @deprecated 5.1.2 废弃 options.pushContent 通知内容
1781
1787
  */
1782
1788
  async invite(e, t = {}) {
1783
- var _, g;
1784
- const { extra: i = "" } = t, { pushTitle: n = "", pushContent: o = "" } = (_ = this._options.callPushConfig) != null && _.pushTitle || (g = this._options.callPushConfig) != null && g.pushContent ? this._options.callPushConfig : t, r = [ae(e), F(i), J(n), W(o)], a = [];
1789
+ var _, d;
1790
+ const { extra: i = "" } = t, { pushTitle: n = "", pushContent: o = "" } = (_ = this._options.callPushConfig) != null && _.pushTitle || (d = this._options.callPushConfig) != null && d.pushContent ? this._options.callPushConfig : t, r = [le(e), q(i), j(n), W(o)], a = [];
1785
1791
  if (!r.every((I) => (!I.result && a.push(I.msg), I.result)))
1786
1792
  throw new Error(`[RCCallClient invite] ${a.join(`
1787
1793
  `)}`);
@@ -1795,7 +1801,7 @@ class z {
1795
1801
  const t = ve(e);
1796
1802
  if (!t.result)
1797
1803
  throw new Error(`[RCCallSession accept] ${t.msg}`);
1798
- B.emit("hungupOtherSession", { session: this });
1804
+ $.emit("hungupOtherSession", { session: this });
1799
1805
  const i = this._stateMachine.getMediaType(), { code: n, tracks: o } = await this._getLocalTrack(i, e);
1800
1806
  if (n !== h.SUCCESS)
1801
1807
  return { code: n };
@@ -1966,7 +1972,7 @@ class z {
1966
1972
  */
1967
1973
  onKickOff: (e, t) => {
1968
1974
  const i = this._rtcClient.getCurrentId();
1969
- this._stateMachine.userLeave([i]), e ? (t === X.SERVER_KICK && this._exceptionClose(u.KICKED_BY_SERVER), t === X.OTHER_KICK && this._exceptionClose(u.OTHER_CLIENT_JOINED_CALL)) : this._exceptionClose(u.NETWORK_ERROR);
1975
+ this._stateMachine.userLeave([i]), e ? (t === Z.SERVER_KICK && this._exceptionClose(g.KICKED_BY_SERVER), t === Z.OTHER_KICK && this._exceptionClose(g.OTHER_CLIENT_JOINED_CALL)) : this._exceptionClose(g.NETWORK_ERROR);
1970
1976
  },
1971
1977
  /**
1972
1978
  * 接收到房间信令时回调,用户可通过房间实例的 `sendMessage(name, content)` 接口发送信令
@@ -2210,7 +2216,7 @@ class ke {
2210
2216
  * RTCJoinType.REFUSE = 1,当前加入拒绝
2211
2217
  * RTCJoinType.COEXIST = 2 两个设备共存
2212
2218
  */
2213
- joinType: se.COEXIST,
2219
+ joinType: ie.COEXIST,
2214
2220
  /**
2215
2221
  * 允许降级获得流,获得音视频不成功 ,降级获得音频, 默认不允许
2216
2222
  */
@@ -2234,14 +2240,14 @@ class ke {
2234
2240
  * 语言设置 (推送), 不传默认为中文
2235
2241
  */
2236
2242
  lang: this._options.lang || P.ZH
2237
- }), B.on("sessionClose", ({ session: o, summaryInfo: r }) => {
2243
+ }), $.on("sessionClose", ({ session: o, summaryInfo: r }) => {
2238
2244
  this._removeSession(o);
2239
2245
  try {
2240
2246
  this._options.onSessionClose(o, r);
2241
2247
  } catch (a) {
2242
2248
  this._logger.error("_", "[RCCCallClient] options.onSessionClose exception"), console.log(a);
2243
2249
  }
2244
- }), B.on("hungupOtherSession", ({ session: o }) => {
2250
+ }), $.on("hungupOtherSession", ({ session: o }) => {
2245
2251
  const r = o.getSessionId();
2246
2252
  this._logger.info("_", `[RCCallClient hungupOtherSession] sessionId ready to accept -> ${r}`), this._logger.info("_", `[RCCallClient hungupOtherSession] sessionList ->${this._sessionList.map((c) => c.getSessionId()).join(",")}`);
2247
2253
  let a = 0;
@@ -2255,7 +2261,7 @@ class ke {
2255
2261
  */
2256
2262
  _onInvite(e, t) {
2257
2263
  this._logger.info("_", "[RCCallClient _onInvite] Received invite message");
2258
- const i = new z(e, this._rtcClient, this._logger, {
2264
+ const i = new F(e, this._rtcClient, this._logger, {
2259
2265
  // 是否允许订阅重试
2260
2266
  isAllowSubscribeRetry: this._options.isAllowSubscribeRetry,
2261
2267
  // 是否允许发布重试
@@ -2271,7 +2277,7 @@ class ke {
2271
2277
  // 允许降级获得流,获得音视频不成功 ,降级获得音频, 默认不允许
2272
2278
  isAllowDemotionGetStream: this._options.isAllowDemotionGetStream,
2273
2279
  // 标明是被叫产生的session
2274
- produceType: $.CALLEE,
2280
+ produceType: x.CALLEE,
2275
2281
  callPushConfig: this._callPushConfig,
2276
2282
  hungupPushConfig: this._hungupPushConfig
2277
2283
  });
@@ -2393,25 +2399,25 @@ class ke {
2393
2399
  bitrate: l,
2394
2400
  isCrossAppkey: _ = !1
2395
2401
  }) {
2396
- const { pushTitle: g = "", pushContent: I = "" } = this._callPushConfig.pushTitle || this._callPushConfig.pushContent ? this._callPushConfig : { pushTitle: a, pushContent: c };
2397
- this._logger.info("_", `[RCCallClient call] extra->${r} pushTitle->${g} pushContent->${I}`);
2398
- const C = [Q(e), ee(t), K(i), F(r), J(g), W(I)], d = [];
2399
- if (!C.every((R) => (!R.result && d.push(R.msg), R.result)))
2400
- throw new Error(`[RCCallClient call] ${d.join(`
2402
+ const { pushTitle: d = "", pushContent: I = "" } = this._callPushConfig.pushTitle || this._callPushConfig.pushContent ? this._callPushConfig : { pushTitle: a, pushContent: c };
2403
+ this._logger.info("_", `[RCCallClient call] extra->${r} pushTitle->${d} pushContent->${I}`);
2404
+ const E = [ee(e), te(t), K(i), q(r), j(d), W(I)], u = [];
2405
+ if (!E.every((C) => (!C.result && u.push(C.msg), C.result)))
2406
+ throw new Error(`[RCCallClient call] ${u.join(`
2401
2407
  `)}`);
2402
- let T = [];
2403
- const { code: S, tracks: N } = await this._getLocalTrack(t, n);
2404
- if (S !== h.SUCCESS)
2405
- return { code: S };
2406
- T = N, T.forEach((R) => {
2407
- var v, L, V;
2408
- R.isAudioTrack() && (l != null && l.audio) && R.setBitrate(l == null ? void 0 : l.audio), R.isVideoTrack() && (l != null && l.video) && R.setBitrate((v = l == null ? void 0 : l.video) == null ? void 0 : v.max, (L = l == null ? void 0 : l.video) == null ? void 0 : L.min, (V = l == null ? void 0 : l.video) == null ? void 0 : V.start), i.onTrackReady(R);
2408
+ let M = [];
2409
+ const { code: p, tracks: A } = await this._getLocalTrack(t, n);
2410
+ if (p !== h.SUCCESS)
2411
+ return { code: p };
2412
+ M = A, M.forEach((C) => {
2413
+ var U, v, D;
2414
+ C.isAudioTrack() && (l != null && l.audio) && C.setBitrate(l == null ? void 0 : l.audio), C.isVideoTrack() && (l != null && l.video) && C.setBitrate((U = l == null ? void 0 : l.video) == null ? void 0 : U.max, (v = l == null ? void 0 : l.video) == null ? void 0 : v.min, (D = l == null ? void 0 : l.video) == null ? void 0 : D.start), i.onTrackReady(C);
2409
2415
  });
2410
- const { code: A, stateMachine: U } = await this._callEngine.call(o, e, t, r, g, I, _);
2411
- if (A === h.SUCCESS && U) {
2416
+ const { code: S, stateMachine: L } = await this._callEngine.call(o, e, t, r, d, I, _);
2417
+ if (S === h.SUCCESS && L) {
2412
2418
  this._logger.info("_", "[RCCallClient call] successfully created state machine");
2413
- const R = new z(U, this._rtcClient, this._logger, {
2414
- localTracks: T,
2419
+ const C = new F(L, this._rtcClient, this._logger, {
2420
+ localTracks: M,
2415
2421
  // 是否允许订阅重试
2416
2422
  isAllowSubscribeRetry: this._options.isAllowSubscribeRetry,
2417
2423
  // 是否允许订阅重试
@@ -2427,16 +2433,16 @@ class ke {
2427
2433
  // 允许降级获得流,获得音视频不成功 ,降级获得音频, 默认不允许
2428
2434
  isAllowDemotionGetStream: this._options.isAllowDemotionGetStream,
2429
2435
  // 标明是主叫产生的session
2430
- produceType: $.CALLER,
2436
+ produceType: x.CALLER,
2431
2437
  isCrossAppkey: _,
2432
2438
  callPushConfig: this._callPushConfig,
2433
2439
  hungupPushConfig: this._hungupPushConfig
2434
2440
  });
2435
- return R.registerSessionListener(i), this._sessionList.push(R), this._logger.info("_", `[RCCallClient call] successfully created session object, sessionId: ${R.getSessionId()}`), { code: A, session: R };
2441
+ return C.registerSessionListener(i), this._sessionList.push(C), this._logger.info("_", `[RCCallClient call] successfully created session object, sessionId: ${C.getSessionId()}`), { code: S, session: C };
2436
2442
  }
2437
- return this._logger.error("_", `[RCCallClient call] call failed code ->: ${A}`), T.forEach((R) => {
2438
- R.mute(), R.destroy();
2439
- }), { code: A };
2443
+ return this._logger.error("_", `[RCCallClient call] call failed code ->: ${S}`), M.forEach((C) => {
2444
+ C.mute(), C.destroy();
2445
+ }), { code: S };
2440
2446
  }
2441
2447
  /**
2442
2448
  * 发起群组呼叫
@@ -2463,23 +2469,23 @@ class ke {
2463
2469
  pushContent: l = "",
2464
2470
  bitrate: _
2465
2471
  }) {
2466
- const { pushTitle: g = "", pushContent: I = "" } = this._callPushConfig.pushTitle || this._callPushConfig.pushContent ? this._callPushConfig : { pushTitle: c, pushContent: l }, C = [Q(e), ae(t), ee(i), K(n), F(a), J(g), W(I)], d = [];
2467
- if (!C.every((R) => (!R.result && d.push(R.msg), R.result)))
2468
- throw new Error(`[RCCallClient callInGroup] ${d.join(`
2472
+ const { pushTitle: d = "", pushContent: I = "" } = this._callPushConfig.pushTitle || this._callPushConfig.pushContent ? this._callPushConfig : { pushTitle: c, pushContent: l }, E = [ee(e), le(t), te(i), K(n), q(a), j(d), W(I)], u = [];
2473
+ if (!E.every((C) => (!C.result && u.push(C.msg), C.result)))
2474
+ throw new Error(`[RCCallClient callInGroup] ${u.join(`
2469
2475
  `)}`);
2470
- let T = [];
2471
- const { code: S, tracks: N } = await this._getLocalTrack(i, o);
2472
- if (S !== h.SUCCESS)
2473
- return { code: S };
2474
- T = N, T.forEach((R) => {
2475
- var v, L, V;
2476
- R.isAudioTrack() && (_ != null && _.audio) && R.setBitrate(_ == null ? void 0 : _.audio), R.isVideoTrack() && (_ != null && _.video) && R.setBitrate((v = _ == null ? void 0 : _.video) == null ? void 0 : v.max, (L = _ == null ? void 0 : _.video) == null ? void 0 : L.min, (V = _ == null ? void 0 : _.video) == null ? void 0 : V.start), n.onTrackReady(R);
2476
+ let M = [];
2477
+ const { code: p, tracks: A } = await this._getLocalTrack(i, o);
2478
+ if (p !== h.SUCCESS)
2479
+ return { code: p };
2480
+ M = A, M.forEach((C) => {
2481
+ var U, v, D;
2482
+ C.isAudioTrack() && (_ != null && _.audio) && C.setBitrate(_ == null ? void 0 : _.audio), C.isVideoTrack() && (_ != null && _.video) && C.setBitrate((U = _ == null ? void 0 : _.video) == null ? void 0 : U.max, (v = _ == null ? void 0 : _.video) == null ? void 0 : v.min, (D = _ == null ? void 0 : _.video) == null ? void 0 : D.start), n.onTrackReady(C);
2477
2483
  });
2478
- const { code: A, stateMachine: U } = await this._callEngine.callInGroup(r, e, i, t, a, g, I);
2479
- if (A === h.SUCCESS && U) {
2484
+ const { code: S, stateMachine: L } = await this._callEngine.callInGroup(r, e, i, t, a, d, I);
2485
+ if (S === h.SUCCESS && L) {
2480
2486
  this._logger.info("_", "[RCCallClient callInGroup] successfully created state machine");
2481
- const R = new z(U, this._rtcClient, this._logger, {
2482
- localTracks: T,
2487
+ const C = new F(L, this._rtcClient, this._logger, {
2488
+ localTracks: M,
2483
2489
  // 是否允许订阅重试
2484
2490
  isAllowSubscribeRetry: this._options.isAllowSubscribeRetry,
2485
2491
  // 是否允许发布重试
@@ -2495,15 +2501,15 @@ class ke {
2495
2501
  // 允许降级获得流,获得音视频不成功 ,降级获得音频, 默认不允许
2496
2502
  isAllowDemotionGetStream: this._options.isAllowDemotionGetStream,
2497
2503
  // 标明是主叫产生的session
2498
- produceType: $.CALLER,
2504
+ produceType: x.CALLER,
2499
2505
  callPushConfig: this._callPushConfig,
2500
2506
  hungupPushConfig: this._hungupPushConfig
2501
2507
  });
2502
- return R.registerSessionListener(n), this._sessionList.push(R), this._logger.info("_", `[RCCallClient callInGroup] successfully created session object, sessionId: ${R.getSessionId()}`), { code: A, session: R };
2508
+ return C.registerSessionListener(n), this._sessionList.push(C), this._logger.info("_", `[RCCallClient callInGroup] successfully created session object, sessionId: ${C.getSessionId()}`), { code: S, session: C };
2503
2509
  }
2504
- return this._logger.info("_", `[RCCallClient callInGroup] callInGroup failed code -> ${A}`), T.forEach((R) => {
2505
- R.mute(), R.destroy();
2506
- }), { code: A };
2510
+ return this._logger.info("_", `[RCCallClient callInGroup] callInGroup failed code -> ${S}`), M.forEach((C) => {
2511
+ C.mute(), C.destroy();
2512
+ }), { code: S };
2507
2513
  }
2508
2514
  /**
2509
2515
  * 调RTC API 获得本地流
@@ -2540,7 +2546,7 @@ class ke {
2540
2546
  */
2541
2547
  async getJoinedRoomInfo() {
2542
2548
  const { code: e, data: t } = await this._context.getRTCJoinedUserInfo(this._context.getCurrentId());
2543
- return e !== j.SUCCESS ? (this._logger.error("_", `getJoinedUserInfo error code: ${e}`), { code: h.QUERY_JOINED_USER_INFO_ERROR }) : { code: h.SUCCESS, data: t };
2549
+ return e !== J.SUCCESS ? (this._logger.error("_", `getJoinedUserInfo error code: ${e}`), { code: h.QUERY_JOINED_USER_INFO_ERROR }) : { code: h.SUCCESS, data: t };
2544
2550
  }
2545
2551
  /**
2546
2552
  * 设置呼叫、挂断推送数据
@@ -2559,7 +2565,7 @@ class ke {
2559
2565
  this._callPushConfig = e, this._hungupPushConfig = t;
2560
2566
  }
2561
2567
  }
2562
- w.add("plugin-call", "5.2.1");
2568
+ z.add("plugin-call", "5.2.2");
2563
2569
  const He = {
2564
2570
  tag: "RCCall",
2565
2571
  verify(s) {
@@ -2569,21 +2575,21 @@ const He = {
2569
2575
  const i = Me(t);
2570
2576
  if (!i.result)
2571
2577
  throw new Error(`[RCCallLib installer steup]${i.msg}`);
2572
- if (!w.validEngine("5.7.7"))
2573
- throw new Error(`The current engine version '${w.getInfo().engine}' error, plugin-call required engine version at least '5.7.7'.`);
2578
+ if (!z.validEngine("5.7.7"))
2579
+ throw new Error(`The current engine version '${z.getInfo().engine}' error, plugin-call required engine version at least '5.7.7'.`);
2574
2580
  const n = s.createLogger("RCCall", "RTC");
2575
- return n.warn("_", "RCCall Version: 5.2.1, Commit: ff0169641932396e57155691652985763b06fe25"), new ke(s, e, n, t);
2581
+ return t.logOutputLevel && n.setOutputLevel(t.logOutputLevel), typeof t.logLevel < "u" && n.warn("_", "The 'logLevel' parameter is deprecated, please use 'logOutputLevel' instead."), n.warn("_", "RCCall Version: 5.2.2, Commit: 86bccfbf7c2cb63551451abd10a7e86d8b330df4"), new ke(s, e, n, t);
2576
2582
  }
2577
2583
  };
2578
2584
  export {
2579
2585
  ke as RCCallClient,
2580
- u as RCCallEndReason,
2586
+ g as RCCallEndReason,
2581
2587
  h as RCCallErrorCode,
2582
2588
  P as RCCallLanguage,
2583
2589
  y as RCCallMediaType,
2584
- z as RCCallSession,
2585
- p as RCCallSessionState,
2586
- m as RCCallUserState,
2590
+ F as RCCallSession,
2591
+ m as RCCallSessionState,
2592
+ T as RCCallUserState,
2587
2593
  He as installer
2588
2594
  };
2589
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZXNtLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9lbmdpbmUvaGVscGVyLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvZW51bXMvTXNnQ2FsbFN0YXR1cy50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL2VudW1zL1JDQ2FsbENvZGUudHMiLCIuLi8uLi8uLi9lbmdpbmUvY29yZS9lbnVtcy9SQ0NhbGxFbmRSZWFzb24udHMiLCIuLi8uLi8uLi9lbmdpbmUvY29yZS9lbnVtcy9SQ0NhbGxNZXNzYWdlVHlwZS50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL2VudW1zL1JDQ2FsbFNlc3Npb25TdGF0ZS50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL2VudW1zL1JDQ2FsbFVzZXJTdGF0ZS50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL2VudW1zL1JDQ3Jvc3NDYWxsVHlwZS50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL1RpbWVyLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvU3RhdGVNYWNoaW5lLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvZW51bXMvUkNDYWxsTWVkaWFUeXBlLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvZW51bXMvTWVtYmVyTW9kaWZ5VHlwZS50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL2VudW1zL1BsYXRmb3JtLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvT2ZmbGluZVJlY29yZGVyLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvTWVzc2FnZUhhbmRsZXIudHMiLCIuLi8uLi8uLi9lbmdpbmUvY29yZS9lbnVtcy9SQ0NhbGxMYW5nLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvbG9jYWxlL2VuLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvbG9jYWxlL3poLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvbG9jYWxlL2luZGV4LnRzIiwiLi4vLi4vLi4vZW5naW5lL2luZGV4LnRzIiwiLi4vLi4vLi4vc3JjL2VudW1zLnRzIiwiLi4vLi4vLi4vc3JjL3V0aWxzLnRzIiwiLi4vLi4vLi4vc3JjL2V2ZW50RW1pdHRlci50cyIsIi4uLy4uLy4uL3NyYy92YWxpZGF0aW9uLnRzIiwiLi4vLi4vLi4vc3JjL2hlbHBlci50cyIsIi4uLy4uLy4uL3NyYy90aW1lci50cyIsIi4uLy4uLy4uL3NyYy9SQ0NhbGxTZXNzaW9uLnRzIiwiLi4vLi4vLi4vc3JjL1JDQ2FsbENsaWVudC50cyIsIi4uLy4uLy4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIsIElSdW50aW1lIH0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuXG5jb25zdCBzdHJpbmcxMHRvNjQgPSAobnVtYmVyOiBudW1iZXIpID0+IHtcbiAgY29uc3QgY2hhcnMgPSAnMDEyMzQ1Njc4OWFiY2RlZmdoaWdrbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJR0tMTU5PUFFSU1RVVldYWVorLycuc3BsaXQoJycpO1xuICBjb25zdCByYWRpeCA9IGNoYXJzLmxlbmd0aCArIDE7XG4gIGxldCBxdXRpZW50ID0gK251bWJlcjtcbiAgY29uc3QgYXJyID0gW107XG4gIGRvIHtcbiAgICBjb25zdCBtb2QgPSBxdXRpZW50ICUgcmFkaXg7XG4gICAgcXV0aWVudCA9IChxdXRpZW50IC0gbW9kKSAvIHJhZGl4O1xuICAgIGFyci51bnNoaWZ0KGNoYXJzW21vZF0pO1xuICB9IHdoaWxlIChxdXRpZW50KTtcbiAgcmV0dXJuIGFyci5qb2luKCcnKTtcbn07XG5cbmNvbnN0IGdldFVVSUQgPSAoKSA9PiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIChjKSA9PiB7XG4gIGNvbnN0IHIgPSBNYXRoLnJhbmRvbSgpICogMTYgfCAwO1xuICBjb25zdCB2ID0gYyA9PT0gJ3gnID8gciA6IChyICYgMHgzIHwgMHg4KTtcbiAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xufSk7XG5cbi8qIOiOt+WPliAyMiDkvY3nmoQgVVVJRCAqL1xuZXhwb3J0IGNvbnN0IGdldFVVSUQyMiA9ICgpID0+IHtcbiAgbGV0IHV1aWQ6IHN0cmluZyB8IG51bWJlciA9IGdldFVVSUQoKTtcbiAgdXVpZCA9IGAke3V1aWQucmVwbGFjZSgvLS9nLCAnJyl9MGA7XG4gIHV1aWQgPSBwYXJzZUludCh1dWlkLCAxNik7XG4gIHV1aWQgPSBzdHJpbmcxMHRvNjQodXVpZCk7XG4gIGlmICh1dWlkLmxlbmd0aCA+IDIyKSB7XG4gICAgdXVpZCA9IHV1aWQuc2xpY2UoMCwgMjIpO1xuICB9XG4gIHJldHVybiB1dWlkO1xufTtcblxuLyoqXG4gKiDnlJ/miJDpmo/mnLogaWQg5a2X56ym5LiyXG4gKi9cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZVJhbmRvbUlkID0gKCk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHJhbmRvbSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDApO1xuICBsZXQgdXVpZCA9IGdldFVVSUQyMigpO1xuICB1dWlkID0gdXVpZC5yZXBsYWNlKC9cXC8vZywgJzAnKTtcbiAgY29uc3QgaW5mbyA9IFt1dWlkLCBEYXRlLm5vdygpLCByYW5kb21dO1xuICByZXR1cm4gaW5mby5qb2luKCdfJyk7XG59O1xuXG5leHBvcnQgY29uc3QgdGltZXJTZXRUaW1lb3V0ID0gKGZ1bmM6IEZ1bmN0aW9uLCB0aW1lb3V0OiBudW1iZXIpOiBudW1iZXIgPT4gc2V0VGltZW91dChmdW5jLCB0aW1lb3V0KSBhcyBudW1iZXI7XG5cbmV4cG9ydCBjb25zdCB0aW1lckludGVydmFsID0gKGZ1bjogRnVuY3Rpb24sIGl0djogbnVtYmVyKTogbnVtYmVyID0+IHNldEludGVydmFsKGZ1biwgaXR2KSBhcyBudW1iZXI7XG5cbmV4cG9ydCBjb25zdCBldmVudEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbi8qKlxuICogY2FsbCBkZXZpY2VJZCDlrZjlgqjlnKggc2Vzc2lvblN0b3JhZ2Ug5LitXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRDYWxsRGV2aWNlSWQgPSAocnVudGltZTogSVJ1bnRpbWUpID0+IHtcbiAgY29uc3Qga2V5ID0gJ1JDQ2FsbERldmljZUlkJztcbiAgbGV0IHV1aWQgPSBydW50aW1lLnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgaWYgKCF1dWlkKSB7XG4gICAgdXVpZCA9IGdldFVVSUQyMigpO1xuICAgIHJ1bnRpbWUuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShrZXksIHV1aWQpO1xuICB9XG4gIHJldHVybiB1dWlkO1xufTtcbiIsIi8qKlxuICog5rOo6YeKXG4gKiBUT0RPXG4gKi9cbmV4cG9ydCBlbnVtIE1zZ0NhbGxTdGF0dXMge1xuICBPVVRHT0lORyA9IDEsIC8vIHdhaXRpbmdcbiAgSU5DT01JTkcsIC8vIHdhaXRpbmdcbiAgUklOR0lORywgLy8gd2FpdGluZ1xuICBDT05ORUNURUQsIC8vIGtlZXBpbmdcbiAgSURMRSwgLy8gZW5kXG4gIEFDQ0VQVEVEIC8vIHdhaXRpbmdcbn1cbiIsIi8qKlxuICog6ZSZ6K+v56CB77yM5LiO56e75Yqo56uv5a+56b2QXG4gKiBAZGVzY3JpcHRpb25cbiAqIDEuIGA1MTAwMCAtIDUxOTk5YCDkuLogQW5kcm9pZCDkuJPnlKjmrrVcbiAqIDIuIGA1MjAwMCAtIDUyOTk5YCDkuLogaU9TIOS4k+eUqOautVxuICogMy4gYDUzMDAwIC0gNTMxOTlgIOS4uiBXZWIgUlRDIOS4k+eUqOautVxuICogNC4gYDUzMjAwIC0gNTM0OTlgIOS4uiBXZWIgQ2FsbExpYiDkuJPnlKjmrrVcbiAqICogIGA1MzIwMCAtIDUzMjk5YCDkuLogV2ViIENhbGxFbmdpbmUg5LiT55So56uvXG4gKiAqICBgNTMzMDAgLSA1MzQ5OWAg5Li6IFdlYiBDYWxsIOS4k+eUqOerr1xuICogNS4gYDUzNTAwIC0gNTM5OTlgIOS4uiBXZWIg5L+d55WZ5q61XG4gKi9cbmV4cG9ydCBlbnVtIFJDQ2FsbEVycm9yQ29kZSB7XG4gIC8qKlxuICAgKiDmiJDlip9cbiAgICovXG4gIFNVQ0NFU1MgPSAxMDAwMCxcbiAgLyoqXG4gICAqIOWtmOWcqOacque7k+adn+eahOeKtuaAgeaculxuICAgKi9cbiAgU1RBVEVfTUFDSElORV9FWElUID0gNTMyMDAsXG4gIC8qKlxuICAgKiDlj5HpgIEgSU0g5raI5oGv5aSx6LSlXG4gICAqL1xuICBTRU5EX01TR19FUlJPUiA9IDUzMjAxLFxuICAvKipcbiAgICog6KKr5a+55pa55Yqg5YWl6buR5ZCN5Y2VXG4gICAqL1xuICBSRUpFQ1RFRF9CWV9CTEFDS0xJU1QgPSA1MzIwMixcbiAgLyoqXG4gICAqIOW9k+WJjeeUqOaIt+S4jeWGjee+pOe7hOS4rVxuICAgKi9cbiAgTk9UX0lOX0dST1VQID0gNTMyMDMsXG5cbiAgLyoqXG4gICAqIENhbGwg55u45YWzXG4gICAqL1xuICAvKipcbiAgICog6I635b6X5pys5Zyw6Z+z6aKR5rWB5aSx6LSlXG4gICAqL1xuICBHRVRfTE9DQUxfQVVESU9fVFJBQ0tfRVJST1IgPSA1MzMwMSxcblxuICAvKipcbiAgICog6I635b6X5pys5Zyw6KeG6aKR5rWB5aSx6LSlXG4gICAqL1xuICBHRVRfTE9DQUxfVklERU9fVFJBQ0tfRVJST1IgPSA1MzMwMixcblxuICAvKipcbiAgICog6I635b6X5pys5Zyw6Z+z6KeG6aKR5rWB5aSx6LSlXG4gICAqL1xuICBHRVRfTE9DQUxfQVVESU9fQU5EX1ZJREVPX1RSQUNLX0VSUk9SID0gNTMzMDMsXG5cbiAgLyoqXG4gICAqIOWKoOWFpeaIv+mXtOWksei0pVxuICAgKi9cbiAgSk9JTl9ST09NX0VSUk9SID0gNTMzMDQsXG5cbiAgLyoqXG4gICAqIOWPkeW4g+mfs+mikeWksei0pVxuICAgKi9cbiAgQVVESU9fUFVCTElTSF9FUlJPUiA9IDUzMzA1LFxuXG4gIC8qKlxuICAgKiDlj5HluIPop4bpopHlpLHotKVcbiAgICovXG4gIFZJREVPX1BVQkxJU0hfRVJST1IgPSA1MzMwNixcblxuICAvKipcbiAgICog5Y+R5biD6Z+z6KeG6aKR5aSx6LSlXG4gICAqL1xuICBBVURJT19BTkRfVklERU9fUFVCTElTSF9FUlJPUiA9IDUzMzA3LFxuXG4gIC8qKlxuICAgKiDmn6Xor6LmiL/pl7TnlKjmiLfkv6Hmga/lpLHotKVcbiAgICovXG4gIFFVRVJZX0pPSU5FRF9VU0VSX0lORk9fRVJST1IgPSA1MzMwOCxcblxuICAvKipcbiAgICog56aB55So5ZCv55So6KeG6aKR5pe277yM5oi/6Ze05YaF57y65bCR6KeG6aKR5rWBXG4gICAqL1xuICBNSVNTSU5HX1ZJREVPX1RSQUNLX0VSUk9SID0gNTMzMDksXG5cbiAgLyoqXG4gICAqIOWPlua2iOWPkeW4g+inhumikeWksei0pVxuICAgKi9cbiAgVU5QVUJMSVNIX1ZJREVPX0VSUk9SID0gNTMzMTAsXG5cbiAgLyoqXG4gICAqIOS8muivneS4jeaYr+e+pOe7hFxuICAgKi9cbiAgQ09OVkVSU0FUSU9OX05PVF9HUk9VUF9FUlJPUiA9IDUzMzExLFxuXG4gIC8qKlxuICAqIOS4jeWcqHJvb23kuK3npoHnlKjpn7Pop4bpopFcbiAgKi9cbiAgTk9UX0lOX1JPT01fRVJST1IgPSA1MzMxMlxuXG59XG4iLCIvKipcbiAqIOaMguaWreWOn+WboFxuICogQGRlc2NyaXB0aW9uXG4gKiDmoLnmja7ljp/mnIkgSGFuZ3VwUmVhc29uIOiuvuiuoe+8jOW3seaWueWOn+WboOS4juWvueaWueWOn+WboOacieebuOW3riAxMCDnmoTlt67ot50uXG4gKiDnjrDmnInmnKzlnLDljp/lm6Dlj5blgLzojIPlm7Q6IDEgfiAxMCwg6L+c56uv5Y6f5Zug5Y+W5YC86IyD5Zu0OiAxMSB+IDIwLlxuICog5Li65L6/5LqOIEhhbmd1cFJlYXNvbiDmianlsZXvvIzkv53nlZkgMTAwIOS7peWGheeahOWPluWAvC5cbiAqIOmcgOimgeWGjeasoeaJqeWxleaXtu+8jOW3seaWueWOn+WboOS9v+eUqDogMjEgfiAzMCwg5a+55bqU5a+55pa55Y6f5Zug5L2/55SoOiAzMSB+IDQwLFxuICog5Lul5q2k57G75o6o77yMXG4gKiDlt7Hmlrnljp/lm6Dkvb/nlKg6IDQxIH4gNTAsIOWvueaWueWOn+WboOS9v+eUqDogNTEgfiA2MCxcbiAqIOW3seaWueWOn+WboOS9v+eUqDogNjEgfiA3MCwg5a+55pa55Y6f5Zug5L2/55SoOiA3MSB+IDgwLFxuICog5bex5pa55Y6f5Zug5L2/55SoOiA3MSB+IDkwLCDlr7nmlrnljp/lm6Dkvb/nlKg6IDkxIH4gMTAwLlxuICpcbiAqIOWQhOW5s+WPsOeLrOacieWtl+auteiMg+WbtFxuICogQW5kcm9pZCAyMDEgfiAyOTlcbiAqIGlPUyAgICAgMzAxIH4gMzk5XG4gKiBXZWIgICAgIDQwMSB+IDQ5OVxuICog6K+m57uG5paH5qGj77yaaHR0cHM6Ly9naXRib29rLnJvbmdjbG91ZC5uZXQvcnRjLWRvY3MvIy9ydGMtY2xpZW50L2lvcy9hbmFseXNpcy9jYWxsbGliL0hhbmd1cFJlYXNvblxuICovXG5leHBvcnQgZW51bSBSQ0NhbGxFbmRSZWFzb24ge1xuICAvKipcbiAgICog5bex5pa55Y+W5raI5bey5Y+R5Ye655qE6YCa6K+d6K+35rGCXG4gICAqL1xuICBDQU5DRUwgPSAxLFxuICAvKipcbiAgICog5bex5pa55ouS57ud5pS25Yiw55qE6YCa6K+d6K+35rGCXG4gICAqL1xuICBSRUpFQ1QgPSAyLFxuICAvKipcbiAgICog5bex5pa55oyC5patXG4gICAqL1xuICBIQU5HVVAgPSAzLFxuICAvKipcbiAgICog5bex5pa55b+Z56KMXG4gICAqL1xuICBCVVNZX0xJTkUgPSA0LFxuICAvKipcbiAgICog5bex5pa55pyq5o6l5ZCsXG4gICAqL1xuICBOT19SRVNQT05TRSA9IDUsXG4gIC8qKlxuICAgKiDlt7HmlrnkuI3mlK/mjIHlvZPliY3pn7Pop4bpopHlvJXmk45cbiAgICovXG4gIEVOR0lORV9VTlNVUFBPUlRFRCA9IDYsXG4gIC8qKlxuICAgKiDlt7HmlrnnvZHnu5zplJnor69cbiAgICovXG4gIE5FVFdPUktfRVJST1IgPSA3LFxuICAvKipcbiAgICog5bex5pa55pGE5YOP5aS06LWE5rqQ6I635Y+W5aSx6LSl77yM5Y+v6IO95piv5p2D6ZmQ5Y6f5ZugXG4gICAqL1xuICBHRVRfTUVESUFfUkVTT1VSQ0VTX0VSUk9SID0gOCxcbiAgLyoqXG4gICAqIOW3seaWuei1hOa6kOWPkeW4g+Wksei0pVxuICAgKi9cbiAgUFVCTElTSF9FUlJPUiA9IDksXG4gIC8qKlxuICAgKiDlt7HmlrnorqLpmIXotYTmupDlpLHotKVcbiAgICovXG4gIFNVQlNDUklCRV9FUlJPUiA9IDEwLFxuICAvKipcbiAgICog5a+55pa55Y+W5raI5Y+R5Ye655qE6YCa6K+d6K+35rGCXG4gICAqL1xuICBSRU1PVEVfQ0FOQ0VMID0gMTEsXG4gIC8qKlxuICAgKiDlr7nmlrnmi5Lnu53mlLbliLDnmoTpgJror53or7fmsYJcbiAgICovXG4gIFJFTU9URV9SRUpFQ1QgPSAxMixcbiAgLyoqXG4gICAqIOmAmuivnei/h+eoi+S4reWvueaWueaMguaWrVxuICAgKi9cbiAgUkVNT1RFX0hBTkdVUCA9IDEzLFxuICAvKipcbiAgICog5a+55pa55b+Z56KMXG4gICAqL1xuICBSRU1PVEVfQlVTWV9MSU5FID0gMTQsXG4gIC8qKlxuICAgKiDlr7nmlrnmnKrmjqXlkKxcbiAgICovXG4gIFJFTU9URV9OT19SRVNQT05TRSA9IDE1LFxuICAvKipcbiAgICog5a+55pa55byV5pOO5LiN5pSv5oyBXG4gICAqL1xuICBSRU1PVEVfRU5HSU5FX1VOU1VQUE9SVEVEID0gMTYsXG4gIC8qKlxuICAgKiDlr7nmlrnnvZHnu5zplJnor69cbiAgICovXG4gIFJFTU9URV9ORVRXT1JLX0VSUk9SID0gMTcsXG4gIC8qKlxuICAgKiDlr7nmlrnmkYTlg4/lpLTotYTmupDojrflj5blpLHotKXvvIzlj6/og73mmK/mnYPpmZDljp/lm6BcbiAgICovXG4gIFJFTU9URV9HRVRfTUVESUFfUkVTT1VSQ0VfRVJST1IgPSAxOCxcbiAgLyoqXG4gICAqIOi/nOerr+i1hOa6kOWPkeW4g+Wksei0pVxuICAgKi9cbiAgUkVNT1RFX1BVQkxJU0hfRVJST1IgPSAxOSxcbiAgLyoqXG4gICAqIOi/nOerr+iuoumYhei1hOa6kOWksei0pVxuICAgKi9cbiAgUkVNT1RFX1NVQlNDUklCRV9FUlJPUiA9IDIwLFxuICAvKipcbiAgICog5bex5pa55YW25LuW56uv5bey5Yqg5YWl5paw6YCa6K+dXG4gICAqL1xuICBPVEhFUl9DTElFTlRfSk9JTkVEX0NBTEwgPSAyMSxcbiAgLyoqXG4gICAqIOW3seaWueWFtuS7luerr+W3suWcqOmAmuivneS4rVxuICAgKi9cbiAgT1RIRVJfQ0xJRU5UX0lOX0NBTEwgPSAyMixcbiAgLyoqXG4gICAqIOW3seaWueiiq+emgeatoumAmuivnVxuICAgKi9cbiAgS0lDS0VEX0JZX1NFUlZFUiA9IDIzLFxuICAvKipcbiAgICog5bex5pa55o6l5ZCs57O757uf6YCa6K+d77yI56e75Yqo56uv54m55pyJ77yJXG4gICovXG4gIEFDQ0VQVF9TWVNURU1fQ0FMTCA9IDI0LFxuICAvKipcbiAgICog6L+c56uv5YW25LuW56uv5bey5Yqg5YWl5paw6YCa6K+dXG4gICAqL1xuICBSRU1PVEVfT1RIRVJfQ0xJRU5UX0pPSU5FRF9DQUxMID0gMzEsXG4gIC8qKlxuICAgKiDov5znq6/lhbbku5bnq6/lt7LlnKjpgJror53kuK1cbiAgICovXG4gIFJFTU9URV9PVEhFUl9DTElFTlRfSU5fQ0FMTCA9IDMyLFxuICAvKipcbiAgICog6L+c56uv6KKr56aB5q2i6YCa6K+dXG4gICAqL1xuICBSRU1PVEVfS0lDS0VEX0JZX1NFUlZFUiA9IDMzLFxuICAvKipcbiAgICog6L+c56uv5o6l5ZCs57O757uf6YCa6K+d77yI56e75Yqo56uv54m55pyJ77yJXG4gICovXG4gIFJFTU9URV9BQ0NFUFRfU1lTVEVNX0NBTEwgPSAzNCxcbiAgLyoqXG4gICAqIOWFtuS7luerr+aOpeWQrFxuICAgKi9cbiAgQUNDRVBUX0JZX09USEVSX0NMSUVOVCA9IDEwMSxcbiAgLyoqXG4gICAqIOWFtuS7luerr+aMguaWrVxuICAgKi9cbiAgSEFOR1VQX0JZX09USEVSX0NMSUVOVCA9IDEwMixcbiAgLyoqXG4gICAqIOW3seaWueiiq+WvueaWueWKoOWFpem7keWQjeWNlVxuICAgKi9cbiAgQURERURfVE9fQkxBQ0tMSVNUID0gMTAzLFxuICAvKipcbiAgICog6Z+z6KeG6aKR5pyN5Yqh5pyq5byA6YCaXG4gICAqL1xuICBTRVJWSUNFX05PVF9PUEVORUQgPSAxMDRcbn1cblxuLyoqXG4gKiDlt7Hmlrnljp/lm6DovazkuLrlr7nmlrnljp/lm6BcbiAqL1xuZXhwb3J0IGNvbnN0IENhbGxSZW1vdGVFbmRSZWFzb246IHsgW2tleTogbnVtYmVyXTogUkNDYWxsRW5kUmVhc29uIH0gPSB7XG4gIFtSQ0NhbGxFbmRSZWFzb24uQ0FOQ0VMXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9DQU5DRUwsXG4gIFtSQ0NhbGxFbmRSZWFzb24uUkVKRUNUXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9SRUpFQ1QsXG4gIFtSQ0NhbGxFbmRSZWFzb24uSEFOR1VQXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9IQU5HVVAsXG4gIFtSQ0NhbGxFbmRSZWFzb24uQlVTWV9MSU5FXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9CVVNZX0xJTkUsXG4gIFtSQ0NhbGxFbmRSZWFzb24uTk9fUkVTUE9OU0VdOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05PX1JFU1BPTlNFLFxuICBbUkNDYWxsRW5kUmVhc29uLkVOR0lORV9VTlNVUFBPUlRFRF06IFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfRU5HSU5FX1VOU1VQUE9SVEVELFxuICBbUkNDYWxsRW5kUmVhc29uLk5FVFdPUktfRVJST1JdOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05FVFdPUktfRVJST1IsXG4gIFtSQ0NhbGxFbmRSZWFzb24uR0VUX01FRElBX1JFU09VUkNFU19FUlJPUl06IFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfR0VUX01FRElBX1JFU09VUkNFX0VSUk9SLFxuICBbUkNDYWxsRW5kUmVhc29uLlBVQkxJU0hfRVJST1JdOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX1BVQkxJU0hfRVJST1IsXG4gIFtSQ0NhbGxFbmRSZWFzb24uU1VCU0NSSUJFX0VSUk9SXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9TVUJTQ1JJQkVfRVJST1IsXG4gIFtSQ0NhbGxFbmRSZWFzb24uT1RIRVJfQ0xJRU5UX0pPSU5FRF9DQUxMXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9PVEhFUl9DTElFTlRfSk9JTkVEX0NBTEwsXG4gIFtSQ0NhbGxFbmRSZWFzb24uT1RIRVJfQ0xJRU5UX0lOX0NBTExdOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX09USEVSX0NMSUVOVF9JTl9DQUxMLFxuICBbUkNDYWxsRW5kUmVhc29uLktJQ0tFRF9CWV9TRVJWRVJdOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX0tJQ0tFRF9CWV9TRVJWRVIsXG4gIFtSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05PX1JFU1BPTlNFXTogUkNDYWxsRW5kUmVhc29uLk5PX1JFU1BPTlNFLFxuICBbUkNDYWxsRW5kUmVhc29uLkFDQ0VQVF9TWVNURU1fQ0FMTF06IFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfQUNDRVBUX1NZU1RFTV9DQUxMLFxufTtcbiIsImV4cG9ydCBlbnVtIFJDQ2FsbE1lc3NhZ2VUeXBlIHtcbiAgLyoqXG4gICAqIOmCgOivt+a2iOaBr1xuICAgKi9cbiAgVkNJbnZpdGUgPSAnUkM6VkNJbnZpdGUnLFxuICAvKipcbiAgICog5ZON6ZOD5raI5oGvXG4gICAqL1xuICBWQ1JpbmdpbmcgPSAnUkM6VkNSaW5naW5nJyxcbiAgLyoqXG4gICAqIOaOpeWQrOa2iOaBr1xuICAgKi9cbiAgVkNBY2NlcHQgPSAnUkM6VkNBY2NlcHQnLFxuICAvKipcbiAgICog5oyC5pat5raI5oGvXG4gICAqL1xuICBWQ0hhbmd1cCA9ICdSQzpWQ0hhbmd1cCcsXG4gIC8qKlxuICAgKiDnvqTlkbzkuK0g5Lq65ZGY5Y+Y5pu05raI5oGvXG4gICAqL1xuICBWQ01vZGlmeU1lbSA9ICdSQzpWQ01vZGlmeU1lbScsXG4gIC8qKlxuICAgKiDlqpLkvZPnsbvlnovkv67mlLnmtojmga9cbiAgICovXG4gIFZDTW9kaWZ5TWVkaWEgPSAnUkM6VkNNb2RpZnlNZWRpYScsXG59XG4iLCJleHBvcnQgZW51bSBSQ0NhbGxTZXNzaW9uU3RhdGUge1xuICAvKipcbiAgICog562J5b6F5bu656uL6L+e5o6lXG4gICAqL1xuICBXQUlUSU5HLFxuICAvKipcbiAgICog5Lya6K+d57u05oyB5LitXG4gICAqL1xuICBLRUVQSU5HLFxuICAvKipcbiAgICog5Lya6K+d5bey57uT5p2fXG4gICAqL1xuICBFTkRcbn1cbiIsImV4cG9ydCBlbnVtIFJDQ2FsbFVzZXJTdGF0ZSB7XG4gIC8qKlxuICAgKiDnlKjmiLfkuI3lrZjlnKjkuo7pgJror53kuK1cbiAgICovXG4gIE5PTkUgPSAwLFxuICAvKipcbiAgICog562J5b6F5o6l5ZCsXG4gICAqL1xuICBXQUlUSU5HLFxuICAvKipcbiAgICog6YCa6K+d5LitXG4gICAqL1xuICBLRUVQSU5HLFxufVxuIiwiZXhwb3J0IGVudW0gUkNDcm9zc0NhbGxUeXBlIHtcbiAgLyohXG4gIOWQjEFwcOmAmuivnVxuICAqL1xuICBSQ0NhbGxSb29tVHlwZU5vcm1hbENhbGwgPSAwLFxuICAvKiFcbiAg6LeoQXBw6YCa6K+dXG4gICovXG4gIFJDQ2FsbFJvb21UeXBlQWNyb3NzQ2FsbCA9IDdcbn1cbiIsImltcG9ydCB7IHRpbWVyU2V0VGltZW91dCB9IGZyb20gJy4uL2hlbHBlcic7XG5cbmV4cG9ydCBjbGFzcyBUaW1lciB7XG4gIHByaXZhdGUgX3RpbWVySWQ6IG51bWJlciA9IDBcblxuICBwcml2YXRlIF9zdGFydFRpbWU6IG51bWJlciA9IDBcblxuICBjb25zdHJ1Y3RvcihjYWxsYmFjazogRnVuY3Rpb24sIHRpbWVvdXQ6IG51bWJlcikge1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgdGhpcy5fdGltZXJJZCA9IHRpbWVyU2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB9LCB0aW1lb3V0KTtcbiAgICB9XG4gICAgdGhpcy5fc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgfVxuXG4gIHN0b3AoKToge1xuICAgIHN0YXJ0VGltZTogbnVtYmVyLFxuICAgIGVuZFRpbWU6IG51bWJlcixcbiAgICBkdXJhdGlvbjogbnVtYmVyXG4gICAgfSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVySWQpO1xuXG4gICAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCk7XG4gICAgbGV0IGR1cmF0aW9uID0gZW5kVGltZSAtIHRoaXMuX3N0YXJ0VGltZTtcbiAgICBpZiAodGhpcy5fc3RhcnRUaW1lID09PSAwKSB7XG4gICAgICBkdXJhdGlvbiA9IDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXJ0VGltZTogdGhpcy5fc3RhcnRUaW1lLFxuICAgICAgZW5kVGltZSxcbiAgICAgIGR1cmF0aW9uLFxuICAgIH07XG4gIH1cblxuICByZXNldCgpIHtcbiAgICB0aGlzLl9zdGFydFRpbWUgPSAwO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBDb252ZXJzYXRpb25UeXBlLCBJTG9nZ2VyLCBJUmVjZWl2ZWRNZXNzYWdlLCBJUnVudGltZSwgUlRDUGx1Z2luQ29udGV4dCxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgZXZlbnRFbWl0dGVyLCBnZXRDYWxsRGV2aWNlSWQgfSBmcm9tICcuLi9oZWxwZXInO1xuaW1wb3J0IHsgTXNnQ2FsbFN0YXR1cyB9IGZyb20gJy4vZW51bXMvTXNnQ2FsbFN0YXR1cyc7XG5pbXBvcnQgeyBSQ0NhbGxFcnJvckNvZGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbENvZGUnO1xuaW1wb3J0IHsgQ2FsbFJlbW90ZUVuZFJlYXNvbiwgUkNDYWxsRW5kUmVhc29uIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxFbmRSZWFzb24nO1xuaW1wb3J0IHsgUkNDYWxsTWVkaWFUeXBlIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxNZWRpYVR5cGUnO1xuaW1wb3J0IHsgUkNDYWxsTWVzc2FnZVR5cGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbE1lc3NhZ2VUeXBlJztcbmltcG9ydCB7IFJDQ2FsbFNlc3Npb25TdGF0ZSB9IGZyb20gJy4vZW51bXMvUkNDYWxsU2Vzc2lvblN0YXRlJztcbmltcG9ydCB7IFJDQ2FsbFVzZXJTdGF0ZSB9IGZyb20gJy4vZW51bXMvUkNDYWxsVXNlclN0YXRlJztcbmltcG9ydCB7XG4gIElFeGlzdGVkVXNlclBvZmlsZXMsIElIdW5ndXBNc2dDb250ZW50LCBJSW52aXRlTXNnQ29udGVudCwgSU1lbWJlck1vZGlmeU1zZ0NvbnRlbnQsIElSaW5naW5nTXNnQ29udGVudCxcbn0gZnJvbSAnLi9pbnRlcmZhY2VzL0lNZXNzYWdlSGFuZGxlcic7XG5pbXBvcnQge1xuICBJQ2FsbFN0YXRlTWFjaGluZVdhdGNoZXJzLCBJRW5kU3VtbWFyeSwgSUludml0ZWRVc2VycywgSVVzZXJEYXRhLCBJVXNlclByb2ZpbGUsIElJbnZpdGVPcHRpb25zLFxufSBmcm9tICcuL2ludGVyZmFjZXMvSVN0YXRlTWFjaGluZSc7XG5pbXBvcnQgeyBDYWxsTWVzc2FnZUhhbmRsZXIgfSBmcm9tICcuL01lc3NhZ2VIYW5kbGVyJztcbmltcG9ydCB7IFJDQ3Jvc3NDYWxsVHlwZSB9IGZyb20gJy4vZW51bXMvUkNDcm9zc0NhbGxUeXBlJztcbmltcG9ydCB7IFRpbWVyIH0gZnJvbSAnLi9UaW1lcic7XG5cbmV4cG9ydCBjbGFzcyBSQ0NhbGxTdGF0ZU1hY2hpbmUge1xuICAvKipcbiAgICog5oi/6Ze054q25oCBXG4gICAqL1xuICBwcml2YXRlIF9zZXNzaW9uU3RhdGU6IFJDQ2FsbFNlc3Npb25TdGF0ZSB8IG51bGwgPSBudWxsXG5cbiAgLyoqXG4gICAqIOeUqOaIt+eKtuaAgeWPiuS/oeaBr1xuICAgKi9cbiAgcHJpdmF0ZSBfdXNlckluZm86IHsgW3VzZXJJZDogc3RyaW5nXTogSVVzZXJEYXRhIH0gPSB7fVxuXG4gIC8qKlxuICAgKiDnlKjmiLforqHml7blmajmmKDlsIRcbiAgICovXG4gIHByaXZhdGUgX3VzZXJUaW1lcnM6IHsgW3VzZXJJZDogc3RyaW5nXTogVGltZXIgfSA9IHt9XG5cbiAgLyoqXG4gICAqIOebkeWQrOWZqFxuICAgKi9cbiAgcHJpdmF0ZSBfd2F0Y2hlcnMhOiBJQ2FsbFN0YXRlTWFjaGluZVdhdGNoZXJzXG5cbiAgLyoqXG4gICAqIOWRvOWPq+i2heaXtuaXtumXtCAo5Y2V5L2N77ya5q+r56eSKVxuICAgKi9cbiAgcHJpdmF0ZSBfY2FsbFRpbWVvdXQ6IG51bWJlciA9IDYwICogMTAwMFxuXG4gIC8qKlxuICAgKiDpgJror53lu7rnq4vlvIDlp4vml7bpl7RcbiAgICovXG4gIHByaXZhdGUgX2JlZ2luVGltZXN0YW1wOiBudW1iZXIgPSAwXG5cbiAgLyoqXG4gICAqIOmAmuivnee7k+adn+aXtumXtFxuICAgKi9cbiAgcHJpdmF0ZSBfZW5kVGltZXN0YW1wOiBudW1iZXIgPSAwXG5cbiAgLyoqXG4gICAqIOmAmuivnee7k+adn+WOn+WboFxuICAgKi9cbiAgcHJpdmF0ZSBfZW5kUmVhc29uOiBSQ0NhbGxFbmRSZWFzb24gfCBudWxsID0gbnVsbFxuXG4gIC8qKlxuICAgKiDkuLvlj6sgSURcbiAgICog5Y+R6LW36YKA6K+35Li65b2T5YmN55So5oi3IElEXG4gICAqIOaUtuWIsOmCgOivt+S4uiBzZW5kZXJVc2VySWRcbiAgICog5pS25Yiw5Lq65ZGY5Y+Y5pu06YKA6K+35Li65raI5oGv5L2T5LitIGNhbGxlcklkXG4gICAqL1xuICBwcml2YXRlIF9jYWxsZXJJZDogc3RyaW5nIHwgbnVsbCA9IG51bGxcblxuICAvKipcbiAgICog5b2T5qyh6YCa6K+d6YKA6K+36ICFIElEXG4gICAqIOWPkei1t+mCgOivt+S4uuW9k+WJjeeUqOaItyBJROOAgeaUtuWIsOmCgOivt+S4uiBzZW5kZXJVc2VySWTjgIHmlLbliLDkurrlkZjlj5jmm7TpgoDor7fkuLrmtojmga/kvZPkuK0gc2VuZGVyVXNlcklkXG4gICAqL1xuICBwcml2YXRlIF9pbnZpdGVySWQ6IHN0cmluZyB8IG51bGwgPSBudWxsXG5cbiAgLyoqXG4gICAqIOaYr+WQpuaYr+i3qCBhcHBrZXlcbiAgICovXG4gIHByaXZhdGUgX2lzQ3Jvc3NBcHBrZXk6IGJvb2xlYW4gPSBmYWxzZVxuXG4gIHByaXZhdGUgX2h1bmd1cFB1c2hUaXRsZTogc3RyaW5nID0gJydcblxuICBwcml2YXRlIF9odW5ndXBQdXNoQ29udGVudDogc3RyaW5nID0gJydcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb250ZXh0OiBSVENQbHVnaW5Db250ZXh0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3J1bnRpbWU6IElSdW50aW1lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogSUxvZ2dlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jYWxsTXNnSGFuZGxlcjogQ2FsbE1lc3NhZ2VIYW5kbGVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NoYW5uZWxJZDogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnZlcnNhdGlvblR5cGU6IENvbnZlcnNhdGlvblR5cGUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGFyZ2V0SWQ6IHN0cmluZyxcbiAgICBwcml2YXRlIF9tZWRpYVR5cGU6IFJDQ2FsbE1lZGlhVHlwZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jYWxsSWQ6IHN0cmluZyxcbiAgKSB7XG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIucmVnaXN0ZXJTdGF0ZU1hY2hpbmVFdmVudCh0aGlzLl9jYWxsSWQsICdvblJpbmdpbmcnLCB0aGlzLl9vblJpbmdpbmcuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIucmVnaXN0ZXJTdGF0ZU1hY2hpbmVFdmVudCh0aGlzLl9jYWxsSWQsICdvbkFjY2VwdCcsIHRoaXMuX29uQWNjZXB0LmJpbmQodGhpcykpO1xuICAgIHRoaXMuX2NhbGxNc2dIYW5kbGVyLnJlZ2lzdGVyU3RhdGVNYWNoaW5lRXZlbnQodGhpcy5fY2FsbElkLCAnb25NZWRpYU1vZGlmeScsIHRoaXMuX29uTWVkaWFNb2RpZnkuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIucmVnaXN0ZXJTdGF0ZU1hY2hpbmVFdmVudCh0aGlzLl9jYWxsSWQsICdvbkh1bmd1cCcsIHRoaXMuX29uSHVuZ3VwLmJpbmQodGhpcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluagoeato+WQjui2heaXtuaXtumXtFxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0VGltZW91dChzZW50VGltZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBsZXQgZGVsYXlUaW1lID0gdGhpcy5fY29udGV4dC5nZXRTZXJ2ZXJUaW1lKCkgLSBzZW50VGltZTtcbiAgICBpZiAoZGVsYXlUaW1lIDwgMCkge1xuICAgICAgZGVsYXlUaW1lID0gNTAwOyAvLyDlgYforr7lu7bov5/ml7bpl7TkuLogNTAwIG1zXG4gICAgfVxuICAgIGNvbnN0IHRpbWVvdXQgPSB0aGlzLl9jYWxsVGltZW91dCAtIGRlbGF5VGltZTtcbiAgICB0aGlzLl9sb2dnZXIud2FybignXycsIGBfZ2V0VGltZW91dCAtPiB0aW1lb3V0OiAke3RpbWVvdXR9YCk7XG4gICAgcmV0dXJuIHRpbWVvdXQ7XG4gIH1cblxuICBwcml2YXRlIF9jbGVhclRpbWVyQnlJZCh1c2VySWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbUkNDYWxsU3RhdGVNYWNoaW5lXSBiZWZvcmUgX2NsZWFyVGltZXJCeUlkICAtPiB1c2VySWQ6ICR7dXNlcklkfSB1c2VyVGltZXJzOiAke0pTT04uc3RyaW5naWZ5KHRoaXMuX3VzZXJUaW1lcnMpfWApO1xuICAgIGlmICh0aGlzLl91c2VyVGltZXJzW3VzZXJJZF0pIHtcbiAgICAgIHRoaXMuX3VzZXJUaW1lcnNbdXNlcklkXS5zdG9wKCk7XG4gICAgICBkZWxldGUgdGhpcy5fdXNlclRpbWVyc1t1c2VySWRdO1xuICAgIH1cbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gYWZ0ZXIgX2NsZWFyVGltZXJCeUlkIC0+IHVzZXJUaW1lcnM6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5fdXNlclRpbWVycyl9YCk7XG4gIH1cblxuICAvKipcbiAgICog6YCa55+lIGNhbGwg5bGC5oi/6Ze054q25oCB5Y+Y5pu05Y+K5Y6f5ZugXG4gICAqL1xuICBwcml2YXRlIF9ub3RpZnlTdGF0ZUNoYW5nZShzdGF0ZTogUkNDYWxsU2Vzc2lvblN0YXRlLCByZWFzb24/OiBSQ0NhbGxFbmRSZWFzb24pIHtcbiAgICB0aGlzLl9sb2dnZXIud2FybignXycsIGBbUkNDYWxsU3RhdGVNYWNoaW5lXSBub3RpZnlTdGF0ZUNoYW5nZSAtPiBpbmZvOiAke0pTT04uc3RyaW5naWZ5KHtcbiAgICAgIHN0YXRlLCByZWFzb24sXG4gICAgfSl9YCk7XG5cbiAgICB0aGlzLl9lbmRSZWFzb24gPSByZWFzb24gfHwgbnVsbDtcbiAgICBpZiAodGhpcy5fc2Vzc2lvblN0YXRlICE9PSBzdGF0ZSkge1xuICAgICAgdGhpcy5fc2Vzc2lvblN0YXRlID0gc3RhdGU7XG4gICAgICB0aGlzLl93YXRjaGVycz8ub25TdGF0ZUNoYW5nZSh7IHN0YXRlLCByZWFzb24gfSk7XG4gICAgfVxuICAgIGlmIChzdGF0ZSA9PT0gUkNDYWxsU2Vzc2lvblN0YXRlLkVORCkge1xuICAgICAgLy8g5b2T54q25oCB5py657uT5p2f5pe277yM6ZyA5ZyoIENhbGxFbmdpbmUg5riF6ZmkXG4gICAgICBldmVudEVtaXR0ZXIuZW1pdCgnb25TdGF0ZU1hY2hpbmVDbG9zZScsIHRoaXMuX2NhbGxJZCk7XG4gICAgICB0aGlzLl9jYWxsTXNnSGFuZGxlci51bnJlZ2lzdGVyU3RhdGVNYWNoaW5lRXZlbnQodGhpcy5fY2FsbElkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6YCa55+lIGNhbGwg5bGC5Lq65ZGY54q25oCB5Y+Y5pu05Y+K5Y6f5ZugXG4gICAqL1xuICBwcml2YXRlIF9ub3RpZnlVc2VyU3RhdGVDaGFuZ2UodXNlcjogSVVzZXJEYXRhLCByZWFzb24/OiBSQ0NhbGxFbmRSZWFzb24pIHtcbiAgICB0aGlzLl9sb2dnZXIud2FybignXycsIGBbUkNDYWxsU3RhdGVNYWNoaW5lXSBub3RpZnlVc2VyU3RhdGVDaGFuZ2UgLT4gaW5mbzogJHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICB1c2VyLCByZWFzb24sXG4gICAgfSl9YCk7XG4gICAgdGhpcy5fd2F0Y2hlcnM/Lm9uVXNlclN0YXRlQ2hhbmdlKHsgdXNlciwgcmVhc29uIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfb3RoZXJDbGllbnRIYW5kbGUobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIGNvbnN0IHsgc2VuZGVyVXNlcklkLCBjb250ZW50OiB7IHVzZXI6IHVzZXJQcm9maWxlLCByZWFzb246IGh1bmd1cFJlYXNvbiB9LCBtZXNzYWdlVHlwZSB9ID0gbWVzc2FnZTtcbiAgICB0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdID0ge1xuICAgICAgdXNlcklkOiBzZW5kZXJVc2VySWQsXG4gICAgICBzdGF0ZTogUkNDYWxsVXNlclN0YXRlLk5PTkUsXG4gICAgICBpc0NhbGxlcjogZmFsc2UsXG4gICAgICBpc1JlbW90ZTogZmFsc2UsXG4gICAgfTtcbiAgICAvLyDlpJrnq6/mjqXlkKzjgIHlpJrnq6/mi5Lnu53vvIzmuIXpmaTmlLbliLDpgoDor7flkI7otbfnmoTorqHml7blmahcbiAgICBmb3IgKGNvbnN0IHVzZXJJZCBpbiB0aGlzLl91c2VyVGltZXJzKSB7XG4gICAgICB0aGlzLl9jbGVhclRpbWVyQnlJZCh1c2VySWQpO1xuICAgIH1cbiAgICAvLyDlhbbku5bnq6/mjqXlkKxcbiAgICBsZXQgZW5kUmVhc29uID0gUkNDYWxsRW5kUmVhc29uLkFDQ0VQVF9CWV9PVEhFUl9DTElFTlQ7XG4gICAgaWYgKG1lc3NhZ2VUeXBlID09PSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0hhbmd1cCkge1xuICAgICAgaWYgKGh1bmd1cFJlYXNvbiA9PT0gUkNDYWxsRW5kUmVhc29uLkJVU1lfTElORSkge1xuICAgICAgICBlbmRSZWFzb24gPSBSQ0NhbGxFbmRSZWFzb24uT1RIRVJfQ0xJRU5UX0lOX0NBTEw7XG4gICAgICB9IGVsc2UgaWYgKGh1bmd1cFJlYXNvbiA9PT0gUkNDYWxsRW5kUmVhc29uLk5PX1JFU1BPTlNFKSB7XG4gICAgICAgIGVuZFJlYXNvbiA9IFJDQ2FsbEVuZFJlYXNvbi5OT19SRVNQT05TRTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVuZFJlYXNvbiA9IFJDQ2FsbEVuZFJlYXNvbi5IQU5HVVBfQllfT1RIRVJfQ0xJRU5UO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyDmt7vliqDnlKjmiLfnroDopoHkv6Hmga9cbiAgICBPYmplY3QuYXNzaWduKHRoaXMuX3VzZXJJbmZvW3NlbmRlclVzZXJJZF0sIDxJVXNlclByb2ZpbGU+dXNlclByb2ZpbGUpO1xuICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdLCBlbmRSZWFzb24pO1xuICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQsIGVuZFJlYXNvbik7XG4gIH1cblxuICAvKipcbiAgICog5q2j5Zyo6YCa6K+d5Lit77yM5LiU5LiN5piv5b2T5YmN5bey5o6l6YCa55So5oi36K6+5aSH77yIZGV2aWNlSWTvvInlj5HmnaXnmoTmtojmga9cbiAgKi9cbiAgcHJpdmF0ZSBfaXNSZW1vdGVJbnZhbGlkTXNnKHJlbW90ZVVzZXJJZDogc3RyaW5nLCBtc2dEZXZpY2VJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLl91c2VySW5mb1tyZW1vdGVVc2VySWRdKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl91c2VySW5mb1tyZW1vdGVVc2VySWRdLmRldmljZUlkIHx8ICFtc2dEZXZpY2VJZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICgodGhpcy5fdXNlckluZm9bcmVtb3RlVXNlcklkXS5zdGF0ZSA9PT0gUkNDYWxsVXNlclN0YXRlLktFRVBJTkcgJiYgdGhpcy5fdXNlckluZm9bcmVtb3RlVXNlcklkXS5kZXZpY2VJZCAhPT0gbXNnRGV2aWNlSWQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIF9vblJpbmdpbmcobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIGNvbnN0IHsgc2VuZGVyVXNlcklkOiBzdWlkLCBjb250ZW50OiB7IHVzZXI6IHVzZXJQcm9maWxlLCBkZXZpY2VJZCB9IH0gPSBtZXNzYWdlO1xuICAgIGNvbnN0IHNlbmRlclVzZXJJZCA9IHRoaXMuX2lzQ3Jvc3NBcHBrZXkgPyBzdWlkLnNwbGl0KCdfJylbMV0gOiBzdWlkO1xuICAgIC8vIOato+WcqOmAmuivneS4re+8jOi/nOerr+Wkmuerr+WPkeeahOa2iOaBr+ebtOaOpei/h+a7pFxuICAgIGlmICh0aGlzLl9pc1JlbW90ZUludmFsaWRNc2coc2VuZGVyVXNlcklkLCBkZXZpY2VJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsU3RhdGVNYWNoaW5lXSBvblJpbmdpbmcgLT4gbm90IHRoZSByZW1vdGUgZGV2aWNlIHRoYXQgaXMgY3VycmVudGx5IHRhbGtpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSA9PT0gc2VuZGVyVXNlcklkKSB7XG4gICAgICByZXR1cm47IC8vIOWkmuerr+WkhOeQhlxuICAgIH1cbiAgICB0aGlzLl93YXRjaGVycy5vblJpbmdpbmcoeyB1c2VySWQ6IHNlbmRlclVzZXJJZCwgLi4uPElVc2VyUHJvZmlsZT51c2VyUHJvZmlsZSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX29uQWNjZXB0KG1lc3NhZ2U6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICBjb25zdCB7IHNlbmRlclVzZXJJZDogc3VpZCwgY29udGVudDogeyB1c2VyOiB1c2VyUHJvZmlsZSwgZGV2aWNlSWQ6IHNlbmRlckRldmljZUlkIH0sIHNlbnRUaW1lIH0gPSBtZXNzYWdlO1xuICAgIGNvbnN0IHNlbmRlclVzZXJJZCA9IHRoaXMuX2lzQ3Jvc3NBcHBrZXkgPyBzdWlkLnNwbGl0KCdfJylbMV0gOiBzdWlkO1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIC8vIOato+WcqOmAmuivneS4re+8jOi/nOerr+Wkmuerr+WPkeeahOa2iOaBr+ebtOaOpei/h+a7pFxuICAgIGlmICh0aGlzLl9pc1JlbW90ZUludmFsaWRNc2coc2VuZGVyVXNlcklkLCBzZW5kZXJEZXZpY2VJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsU3RhdGVNYWNoaW5lXSBfb25BY2NlcHQgLT4gbm90IHRoZSByZW1vdGUgZGV2aWNlIHRoYXQgaXMgY3VycmVudGx5IHRhbGtpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFVzZXJJZCA9PT0gc2VuZGVyVXNlcklkKSB7XG4gICAgICAvLyDlpJrnq6/lpITnkIZcbiAgICAgIHRoaXMuX290aGVyQ2xpZW50SGFuZGxlKG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOe+pOe7hOmAmuivneaXtu+8miBB44CBQiDpgJror50gQemCgOivt0MsIEPlkIzmhI/mjqXlkKzvvIzov5nml7ZC5rKh5pyJQ+eahHVzZXJJZOWvueW6lOeahOiuoeaXtuWZqO+8jOaJgOS7pei/memHjOWIpOaWreS4gOS4i1xuICAgIGlmICh0aGlzLl91c2VyVGltZXJzW3NlbmRlclVzZXJJZF0pIHtcbiAgICAgIC8vIOa4hemZpOWRvOWPq+i2heaXtuiuoeaXtuWZqFxuICAgICAgdGhpcy5fY2xlYXJUaW1lckJ5SWQoc2VuZGVyVXNlcklkKTtcbiAgICB9XG5cbiAgICAvLyDkv67mlLnlubbpgJrnn6XmiL/pl7TkurrlkZjnirbmgIFcbiAgICBjb25zdCBpZHMgPSAodGhpcy5fY29udmVyc2F0aW9uVHlwZSA9PT0gQ29udmVyc2F0aW9uVHlwZS5QUklWQVRFKSA/IFtjdXJyZW50VXNlcklkLCBzZW5kZXJVc2VySWRdIDogW3NlbmRlclVzZXJJZF07XG4gICAgaWRzLmZvckVhY2goKHVzZXJJZCkgPT4ge1xuICAgICAgY29uc3QgaXNDdXJyZW50VXNlcklkID0gdXNlcklkID09PSBjdXJyZW50VXNlcklkO1xuICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSA9IHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICBzdGF0ZTogUkNDYWxsVXNlclN0YXRlLktFRVBJTkcsXG4gICAgICAgIGlzQ2FsbGVyOiBpc0N1cnJlbnRVc2VySWQsXG4gICAgICAgIGlzUmVtb3RlOiBpc0N1cnJlbnRVc2VySWQsXG4gICAgICAgIGRldmljZUlkOiBpc0N1cnJlbnRVc2VySWQgPyBnZXRDYWxsRGV2aWNlSWQodGhpcy5fcnVudGltZSkgOiBzZW5kZXJEZXZpY2VJZCxcbiAgICAgIH07XG4gICAgICBpZiAoIWlzQ3VycmVudFVzZXJJZCkge1xuICAgICAgICB0aGlzLl9iZWdpblRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICAgIC8vIOa3u+WKoOeUqOaIt+eugOimgeS/oeaBr1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuX3VzZXJJbmZvW3NlbmRlclVzZXJJZF0sIDxJVXNlclByb2ZpbGU+dXNlclByb2ZpbGUpO1xuICAgICAgfVxuICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0pO1xuICAgIH0pO1xuICAgIGlmICh0aGlzLmdldENhbGxlcklkKCkgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5LRUVQSU5HKTtcbiAgICB9XG4gICAgLy8g5oqb5Ye6b25BY2NlcHTml7bnirbmgIHlt7Lnu4/lsLHnu6pcbiAgICB0aGlzLl93YXRjaGVycy5vbkFjY2VwdCh7IHVzZXJJZDogc2VuZGVyVXNlcklkIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25NZWRpYU1vZGlmeShtZXNzYWdlOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgY29uc3QgeyBzZW5kZXJVc2VySWQsIGNvbnRlbnQ6IHsgbWVkaWFUeXBlLCB1c2VyOiB1c2VyUHJvZmlsZSwgZGV2aWNlSWQgfSB9ID0gbWVzc2FnZTtcbiAgICAvLyDmraPlnKjpgJror53kuK3vvIzov5znq6/lpJrnq6/lj5HnmoTmtojmga/nm7TmjqXov4fmu6RcbiAgICBpZiAodGhpcy5faXNSZW1vdGVJbnZhbGlkTXNnKHNlbmRlclVzZXJJZCwgZGV2aWNlSWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCAnW1JDQ2FsbFN0YXRlTWFjaGluZV0gX29uTWVkaWFNb2RpZnkgLT4gbm90IHRoZSByZW1vdGUgZGV2aWNlIHRoYXQgaXMgY3VycmVudGx5IHRhbGtpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSA9PT0gc2VuZGVyVXNlcklkKSB7IC8vIOWkmuerr+WkhOeQhlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOabtOaWsCBtZWRpYVR5cGVcbiAgICB0aGlzLl9tZWRpYVR5cGUgPSBtZWRpYVR5cGU7XG4gICAgdGhpcy5fd2F0Y2hlcnMub25NZWRpYU1vZGlmeSh7XG4gICAgICBzZW5kZXI6IHsgdXNlcklkOiBzZW5kZXJVc2VySWQsIC4uLjxJVXNlclByb2ZpbGU+dXNlclByb2ZpbGUgfSxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX29uSHVuZ3VwKG1lc3NhZ2U6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICBjb25zdCB7IHNlbmRlclVzZXJJZDogc3VpZCwgY29udGVudCB9ID0gbWVzc2FnZTtcbiAgICBjb25zdCBzZW5kZXJVc2VySWQgPSB0aGlzLl9pc0Nyb3NzQXBwa2V5ID8gc3VpZC5zcGxpdCgnXycpWzFdIDogc3VpZDtcbiAgICBjb25zdCB7IHJlYXNvbiwgdXNlcjogdXNlclByb2ZpbGUsIGRldmljZUlkIH0gPSBjb250ZW50IGFzIElIdW5ndXBNc2dDb250ZW50O1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIC8vIOato+WcqOmAmuivneS4re+8jOi/nOerr+Wkmuerr+WPkeeahOa2iOaBr+ebtOaOpei/h+a7pFxuICAgIGlmICh0aGlzLl9pc1JlbW90ZUludmFsaWRNc2coc2VuZGVyVXNlcklkLCBkZXZpY2VJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsU3RhdGVNYWNoaW5lXSBfb25IdW5ndXAgLT4gbm90IHRoZSByZW1vdGUgZGV2aWNlIHRoYXQgaXMgY3VycmVudGx5IHRhbGtpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFVzZXJJZCA9PT0gc2VuZGVyVXNlcklkKSB7IC8vIOWkmuerr+WkhOeQhiDmipvlh7rlpJrnq6/lt7LlpITnkIYgcmVhc29uXG4gICAgICB0aGlzLl9vdGhlckNsaWVudEhhbmRsZShtZXNzYWdlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fc2Vzc2lvblN0YXRlID09PSBSQ0NhbGxTZXNzaW9uU3RhdGUuRU5EKSB7XG4gICAgICAvLyDlpoLmnpzlt7HmlrnmiL/pl7TnirbmgIHlt7Lnu5PmnZ/vvIzlho3mlLbliLAgaHVuZ3VwIOa2iOaBr+S4jeWGjeWkhOeQhlxuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gSW52YWxpZCBoYW5nIHVwIG1lc3NhZ2UsIGN1cnJlbnQgcm9vbSBzdGF0dXMgaGFzIGVuZGVkIC0+IHNlc3Npb25TdGF0ZTogJHt0aGlzLl9zZXNzaW9uU3RhdGV9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3VzZXJJbmZvW3NlbmRlclVzZXJJZF0pIHtcbiAgICAgIC8vIOS/ruaUueWGheWtmOaAgeaVsOaNruW5tumAmuefpVxuICAgICAgdGhpcy5fdXNlckluZm9bc2VuZGVyVXNlcklkXS5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5OT05FO1xuICAgICAgdGhpcy5fZW5kVGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgIC8vIOa3u+WKoOeUqOaIt+eugOimgeS/oeaBr1xuICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdLCA8SVVzZXJQcm9maWxlPnVzZXJQcm9maWxlKTtcbiAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdLCBDYWxsUmVtb3RlRW5kUmVhc29uW3JlYXNvbl0pO1xuICAgICAgZGVsZXRlIHRoaXMuX3VzZXJJbmZvW3NlbmRlclVzZXJJZF07XG4gICAgfVxuXG4gICAgLy8gdGltZXIg5riF6ZmkXG4gICAgaWYgKENhbGxSZW1vdGVFbmRSZWFzb25bcmVhc29uXSA9PT0gUkNDYWxsRW5kUmVhc29uLlJFTU9URV9DQU5DRUwpIHtcbiAgICAgIC8vIOi/nOerr+WPlua2iOmAmuivne+8jOayoeaciei/nOerr+eUqOaIt++8jOa4hemZpOW3seerr+eahOaOpeWQrOi2heaXtuiuoeaXtuWZqFxuICAgICAgdGhpcy5nZXRSZW1vdGVVc2VySWRzKCkubGVuZ3RoIDwgMSAmJiB0aGlzLl9jbGVhclRpbWVyQnlJZChjdXJyZW50VXNlcklkKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZ2V0SW52aXRlcklkKCkgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgIC8vIOi/nOerr+aLkue7neOAgeW/meeijOOAgeacquaOpeWQrOetie+8jOmAmui/h+iHquW3seaYr+WQpuaYr+S4u+WPq+adpeWIpOaWreimgea4hemZpOWRvOWPq+i2heaXtuiuoeaXtuWZqCDmiJYg5o6l5ZCs6LaF5pe26K6h5pe25ZmoXG4gICAgICB0aGlzLl9jbGVhclRpbWVyQnlJZChzZW5kZXJVc2VySWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmdldFJlbW90ZVVzZXJJZHMoKS5sZW5ndGggPCAxICYmIHRoaXMuX2NsZWFyVGltZXJCeUlkKGN1cnJlbnRVc2VySWQpO1xuICAgIH1cblxuICAgIC8vIOaIv+mXtOS6uuWRmOS/oeaBr+WwkeS6juS4pOS4qu+8jOmAmuefpeaIv+mXtOeKtuaAgee7k+adn1xuICAgIGNvbnN0IGlzTGVzc1RoYW5Ud28gPSBPYmplY3Qua2V5cyh0aGlzLl91c2VySW5mbykubGVuZ3RoIDwgMjtcbiAgICAvLyDnvqTlkbzkuK3pgoDor7fogIXmjILmlq3vvIjpnZ7lkbzlj6vlj5HotbfogIXvvInkuJTmiL/pl7TkuK3ooqvpgoDor7fogIXpg73mnKrmjqXlkKzvvIzpgJrnn6XmiL/pl7TnirbmgIHnu5PmnZ9cbiAgICBjb25zdCBpc0ludml0ZVVzZXIgPSB0aGlzLl9pbnZpdGVySWQgPT09IHNlbmRlclVzZXJJZDtcbiAgICBjb25zdCBpc05vT25lQW5zd2VyZWQgPSBPYmplY3QudmFsdWVzKHRoaXMuX3VzZXJJbmZvKS5ldmVyeSgodXNlcikgPT4gdXNlci5zdGF0ZSAhPT0gUkNDYWxsVXNlclN0YXRlLktFRVBJTkcpO1xuICAgIGlmIChpc0xlc3NUaGFuVHdvIHx8IChpc0ludml0ZVVzZXIgJiYgaXNOb09uZUFuc3dlcmVkKSkge1xuICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLkVORCwgQ2FsbFJlbW90ZUVuZFJlYXNvbltyZWFzb25dKTtcbiAgICB9XG5cbiAgICAvLyDmipvlh7ogb25IdW5ndXAg5pe254q25oCB5bey57uP5bCx57uqXG4gICAgdGhpcy5fd2F0Y2hlcnMub25IdW5ndXAoeyB1c2VySWQ6IHNlbmRlclVzZXJJZCwgLi4uPElVc2VyUHJvZmlsZT51c2VyUHJvZmlsZSB9LCBDYWxsUmVtb3RlRW5kUmVhc29uW3JlYXNvbl0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOazqOWGjOS6i+S7tuebkeWQrFxuICAgKiBAcGFyYW1zIHdhdGNoZXJzXG4gICAqL1xuICByZWdpc3RlckV2ZW50TGlzdGVuZXIod2F0Y2hlcnM6IElDYWxsU3RhdGVNYWNoaW5lV2F0Y2hlcnMpIHtcbiAgICB0aGlzLl93YXRjaGVycyA9IHdhdGNoZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsCBpbnZpdGUg5raI5oGv5pe254q25oCB5py65pu05paw77yIQ2FsbEVuZ2luZSDlhoXpg6josIPnlKjvvIlcbiAgICogQHBhcmFtIG1lc3NhZ2Ug5o6l5pS25raI5oGvXG4gICAqL1xuICBfX29uSW52aXRlKG1lc3NhZ2U6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICBjb25zdCB7IHNlbmRlclVzZXJJZDogc3VpZCwgY29udGVudCwgc2VudFRpbWUgfSA9IG1lc3NhZ2U7XG4gICAgY29uc3Qge1xuICAgICAgaW52aXRlVXNlcklkczogaW5pZHMsIHVzZXI6IHVzZXJQcm9maWxlLCBkZXZpY2VJZCwgcm9vbVR5cGUsXG4gICAgfSA9IGNvbnRlbnQgYXMgSUludml0ZU1zZ0NvbnRlbnQ7XG4gICAgLy8g5aSE55CG6LeoIGFwcGtleSDpgoDor7cgc2VuZGVyVXNlcklkIOW4puaciSBhcHBrZXkg5LiO5pys5ZywIGN1cnJlbnRVc2VySWQg5Yy56YWN6Zeu6aKYXG4gICAgLy8g5ZCM5pe26K6w5b2V5pys5Zyw5piv5ZCm5Li66LeoIGFwcGtleSDnirbmgIFcbiAgICBsZXQgc2VuZGVyVXNlcklkOiBzdHJpbmc7XG4gICAgaWYgKHJvb21UeXBlID09PSBSQ0Nyb3NzQ2FsbFR5cGUuUkNDYWxsUm9vbVR5cGVBY3Jvc3NDYWxsKSB7XG4gICAgICBbLCBzZW5kZXJVc2VySWRdID0gc3VpZC5zcGxpdCgnXycpO1xuICAgICAgdGhpcy5fd2F0Y2hlcnMuY3Jvc3NBcHBrZXkodHJ1ZSk7XG4gICAgICB0aGlzLl9pc0Nyb3NzQXBwa2V5ID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VuZGVyVXNlcklkID0gc3VpZDtcbiAgICB9XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgLy8g5q2j5Zyo6YCa6K+d5Lit77yM6L+c56uv5aSa56uv5Y+R55qE5raI5oGv55u05o6l6L+H5rukXG4gICAgaWYgKHRoaXMuX2lzUmVtb3RlSW52YWxpZE1zZyhzZW5kZXJVc2VySWQsIGRldmljZUlkKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgJ1tSQ0NhbGxTdGF0ZU1hY2hpbmVdIF9fb25JbnZpdGUgLT4gbm90IHRoZSByZW1vdGUgZGV2aWNlIHRoYXQgaXMgY3VycmVudGx5IHRhbGtpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFVzZXJJZCA9PT0gc2VuZGVyVXNlcklkKSB7XG4gICAgICAvLyDlpJrnq6/lpITnkIZcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9jYWxsZXJJZCA9IHRoaXMuX2ludml0ZXJJZCA9IHNlbmRlclVzZXJJZDtcbiAgICBjb25zdCB1c2VySWRMaXN0ID0gW3N1aWQsIC4uLmluaWRzXTtcbiAgICAvLyDmlLbliLDpgoDor7flkI7vvIzlhoXpg6jlm57lupTlk43pk4Pmtojmga8sIHVzZXJJZHMg5Lyg6Zmk6Ieq5bex55qE5omA5pyJ5Lq6XG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIuc2VuZFJpbmdpbmcoe1xuICAgICAgY29udmVyc2F0aW9uVHlwZTogdGhpcy5fY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkOiB0aGlzLl90YXJnZXRJZCxcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5fY2hhbm5lbElkLFxuICAgICAgY2FsbElkOiB0aGlzLl9jYWxsSWQsXG4gICAgICB1c2VySWRzOiB1c2VySWRMaXN0LmZpbHRlcigoaWQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2lzQ3Jvc3NBcHBrZXkpIHtcbiAgICAgICAgICByZXR1cm4gaWQuc3BsaXQoJ18nKVsxXSAhPT0gY3VycmVudFVzZXJJZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaWQgIT09IGN1cnJlbnRVc2VySWQ7XG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGludml0ZVVzZXJJZHMgPSB0aGlzLl9pc0Nyb3NzQXBwa2V5ID8gW2luaWRzWzBdLnNwbGl0KCdfJylbMV1dIDogaW5pZHM7XG5cbiAgICAvLyDlkIzmraXmnKzlnLDnlKjmiLfliJfooajpnIDopoHkvb/nlKjmi4bliIblkI7nmoQgVXNlcklkIOS/neivgeacrOWcsOWFtuS7luaWueazleWMuemFjSB1c2VyaWRcbiAgICBjb25zdCBhbGxVc2VySWRzID0gW3NlbmRlclVzZXJJZCwgLi4uaW52aXRlVXNlcklkc107XG5cbiAgICAvLyDkv67mlLnlubbpgJrnn6XmiL/pl7TkurrlkZjnirbmgIFcbiAgICBhbGxVc2VySWRzLmZvckVhY2goKHVzZXJJZCkgPT4ge1xuICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSA9IHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICBzdGF0ZTogUkNDYWxsVXNlclN0YXRlLldBSVRJTkcsXG4gICAgICAgIGlzQ2FsbGVyOiB1c2VySWQgPT09IHNlbmRlclVzZXJJZCxcbiAgICAgICAgaXNSZW1vdGU6IHVzZXJJZCAhPT0gY3VycmVudFVzZXJJZCxcbiAgICAgIH07XG4gICAgICBpZiAodXNlcklkID09PSBzZW5kZXJVc2VySWQpIHtcbiAgICAgICAgLy8g57uZIHNlbmRlclVzZXIg5re75Yqg55So5oi3566A6KaB5L+h5oGv5Y+KIGRldmljZUlkXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5fdXNlckluZm9bdXNlcklkXSwgPElVc2VyUHJvZmlsZT51c2VyUHJvZmlsZSwgeyBkZXZpY2VJZCB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1t1c2VySWRdKTtcbiAgICAgIC8vIOe7meaJgOacieiiq+mCgOivt+S6uuWQr+WKqOaOpeWQrOiuoeaXtuWZqFxuICAgICAgaWYgKHVzZXJJZCAhPT0gc2VuZGVyVXNlcklkKSB7XG4gICAgICAgIHRoaXMuX3VzZXJUaW1lcnNbdXNlcklkXSA9IG5ldyBUaW1lcigoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVhc29uID0gdXNlcklkID09PSBjdXJyZW50VXNlcklkID8gUkNDYWxsRW5kUmVhc29uLk5PX1JFU1BPTlNFIDogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9OT19SRVNQT05TRTtcbiAgICAgICAgICBpZiAodXNlcklkID09PSBjdXJyZW50VXNlcklkKSB7IC8vIOe+pOiBiuS4reW3seaWuei2heaXtumcgOWPkemAgeaMguaWrVxuICAgICAgICAgICAgdGhpcy5faHVuZ3VwSGFuZGxlKHJlYXNvbik7XG4gICAgICAgICAgfSBlbHNlIHsgLy8g5YW25LuW5Lq65ZGY6LaF5pe25Y+q6YCa55+l5Lq65ZGY54q25oCB5Y+Y5pu0XG4gICAgICAgICAgICB0aGlzLl91c2VySW5mb1t1c2VySWRdICYmICh0aGlzLl91c2VySW5mb1t1c2VySWRdLnN0YXRlID0gUkNDYWxsVXNlclN0YXRlLk5PTkUpO1xuICAgICAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0pO1xuICAgICAgICAgICAgdGhpcy5fd2F0Y2hlcnMub25IdW5ndXAodGhpcy5fdXNlckluZm9bdXNlcklkXSwgcmVhc29uKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl91c2VySW5mb1t1c2VySWRdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcy5fZ2V0VGltZW91dChzZW50VGltZSkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIOaIv+mXtOeKtuaAgemAmuefpVxuICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5XQUlUSU5HKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmlLbliLAgbWVtYmVyTW9kaWZ5IOa2iOaBr+aXtueKtuaAgeacuuabtOaWsO+8iENhbGxFbmdpbmUg5YaF6YOo6LCD55So77yJXG4gICAqIEBwYXJhbSBtZXNzYWdlIOaOpeaUtua2iOaBr1xuICAgKi9cbiAgX19vbk1lbWJlck1vZGlmeShtZXNzYWdlOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgY29uc3QgeyBzZW5kZXJVc2VySWQsIGNvbnRlbnQsIHNlbnRUaW1lIH0gPSBtZXNzYWdlO1xuICAgIGNvbnN0IHtcbiAgICAgIHVzZXI6IHVzZXJQcm9maWxlLCBleGlzdGVkVXNlclBvZmlsZXMsIGNhbGxlciwgZGV2aWNlSWQsIGludml0ZVVzZXJJZHMsIG1lZGlhVHlwZSxcbiAgICB9ID0gY29udGVudCBhcyBJTWVtYmVyTW9kaWZ5TXNnQ29udGVudDtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICAvLyDmraPlnKjpgJror53kuK3vvIzov5znq6/lpJrnq6/lj5HnmoTmtojmga/nm7TmjqXov4fmu6RcbiAgICAvLyB0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdICYmICF0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdLmRldmljZUlkICYmICFkZXZpY2VJZCAmJlxuICAgIGlmICh0aGlzLl9pc1JlbW90ZUludmFsaWRNc2coc2VuZGVyVXNlcklkLCBkZXZpY2VJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsU3RhdGVNYWNoaW5lXSBfX29uTWVtYmVyTW9kaWZ5IC0+IG5vdCB0aGUgcmVtb3RlIGRldmljZSB0aGF0IGlzIGN1cnJlbnRseSB0YWxraW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjdXJyZW50VXNlcklkID09PSBzZW5kZXJVc2VySWQpIHtcbiAgICAgIC8vIOWkmuerr+WkhOeQhlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9jYWxsZXJJZCA9IGNhbGxlcjtcbiAgICB0aGlzLl9pbnZpdGVySWQgPSBzZW5kZXJVc2VySWQ7XG4gICAgaW52aXRlVXNlcklkcy5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgZXhpc3RlZFVzZXJQb2ZpbGVzLnB1c2goeyB1c2VySWQ6IGlkLCBtZWRpYVR5cGUsIGNhbGxTdGF0dXM6IE1zZ0NhbGxTdGF0dXMuSU5DT01JTkcgfSk7XG4gICAgfSk7XG4gICAgLy8g5bex5pa554q25oCB5Li6IE5PTkUgKOacquWtmOWcqOW3seaWueeUqOaIt+S/oeaBrykg6K+05piO6Ieq5bex5Li66KKr6YKA6K+36ICFLCDpnIDlj5HpgIEgcmluZ2luZ1xuICAgIGNvbnN0IGlzTmV3SW52aXRlZFVzZXIgPSBpbnZpdGVVc2VySWRzLmluY2x1ZGVzKGN1cnJlbnRVc2VySWQpO1xuICAgIGlmIChpc05ld0ludml0ZWRVc2VyKSB7XG4gICAgICBjb25zdCBuZWVkUmluZ2luZ1VzZXJJZHM6IHN0cmluZ1tdID0gW107XG4gICAgICBleGlzdGVkVXNlclBvZmlsZXMuZm9yRWFjaCgodXNlckluZm8pID0+IHtcbiAgICAgICAgaWYgKHVzZXJJbmZvLnVzZXJJZCAhPT0gY3VycmVudFVzZXJJZCkge1xuICAgICAgICAgIG5lZWRSaW5naW5nVXNlcklkcy5wdXNoKHVzZXJJbmZvLnVzZXJJZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIuc2VuZFJpbmdpbmcoe1xuICAgICAgICBjb252ZXJzYXRpb25UeXBlOiB0aGlzLl9jb252ZXJzYXRpb25UeXBlLFxuICAgICAgICB0YXJnZXRJZDogdGhpcy5fdGFyZ2V0SWQsXG4gICAgICAgIGNoYW5uZWxJZDogdGhpcy5fY2hhbm5lbElkLFxuICAgICAgICBjYWxsSWQ6IHRoaXMuX2NhbGxJZCxcbiAgICAgICAgdXNlcklkczogbmVlZFJpbmdpbmdVc2VySWRzLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIOiiq+mCgOivt+iAhemAmuefpSBjYWxsIOWxguaIv+mXtOeKtuaAgeWPmOabtFxuICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLldBSVRJTkcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyDlt7LlnKjpgJror53mtYHnqIvkuK3nlKjmiLfvvIzmipvlh7rkurrlkZjlj5jmm7Tnm5HlkKxcbiAgICAgIHRoaXMuX3dhdGNoZXJzLm9uTWVtYmVyTW9kaWZ5KHtcbiAgICAgICAgc2VuZGVyOiB7IHVzZXJJZDogc2VuZGVyVXNlcklkLCAuLi51c2VyUHJvZmlsZSB9LFxuICAgICAgICBpbnZpdGVkVXNlcnM6IGludml0ZVVzZXJJZHMubWFwKChpZCkgPT4gKHsgdXNlcklkOiBpZCB9KSksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyDmm7TmlrDlhajph4/nlKjmiLfnirbmgIFcbiAgICBleGlzdGVkVXNlclBvZmlsZXMuZm9yRWFjaCgodXNlckluZm8pID0+IHtcbiAgICAgIGNvbnN0IHsgdXNlcklkLCBjYWxsU3RhdHVzIH0gPSB1c2VySW5mbztcbiAgICAgIC8vIOS6uuWRmOS4uue7k+adn+eKtuaAgeaXtu+8jOS4jeWGjeabtOaWsFxuICAgICAgaWYgKGNhbGxTdGF0dXMgPT09IE1zZ0NhbGxTdGF0dXMuSURMRSkgcmV0dXJuO1xuICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSA9IHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICBzdGF0ZTogY2FsbFN0YXR1cyAhPT0gTXNnQ2FsbFN0YXR1cy5DT05ORUNURUQgPyBSQ0NhbGxVc2VyU3RhdGUuV0FJVElORyA6IFJDQ2FsbFVzZXJTdGF0ZS5LRUVQSU5HLFxuICAgICAgICBpc0NhbGxlcjogc2VuZGVyVXNlcklkID09PSB1c2VySWQsXG4gICAgICAgIGlzUmVtb3RlOiBjdXJyZW50VXNlcklkID09PSB1c2VySWQsXG4gICAgICB9O1xuICAgICAgLy8g57uZIHNlbmRlclVzZXIg5re75Yqg55So5oi3566A6KaB5L+h5oGvIOWPiiBkZXZpY2VJZFxuICAgICAgaWYgKHVzZXJJZCA9PT0gc2VuZGVyVXNlcklkKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5fdXNlckluZm9bdXNlcklkXSwgPElVc2VyUHJvZmlsZT51c2VyUHJvZmlsZSwgeyBkZXZpY2VJZCB9KTtcbiAgICAgIH1cbiAgICAgIC8vIOmAmuefpeS6uuWRmOWPmOabtFxuICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0pO1xuICAgICAgLy8g6Zmk5LqGIGNhbGxNc2dTdGF0dXMuY29ubmVjdGVkICzlhbbku5bkurrpg73otbforqHml7blmahcblxuICAgICAgaWYgKGNhbGxTdGF0dXMgIT09IE1zZ0NhbGxTdGF0dXMuQ09OTkVDVEVEICYmICF0aGlzLl91c2VyVGltZXJzW3VzZXJJZF0pIHtcbiAgICAgICAgLy8g5ZCv5Yqo6K6h5pe25ZmoXG4gICAgICAgIHRoaXMuX3VzZXJUaW1lcnNbdXNlcklkXSA9IG5ldyBUaW1lcigoKSA9PiB7XG4gICAgICAgICAgLy8g5ZG85Y+r6LaF5pe25aSE55CG54q25oCB44CB5bm26YCa55+lIGNhbGwg5bGCXG4gICAgICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSAmJiAodGhpcy5fdXNlckluZm9bdXNlcklkXS5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5OT05FKTtcbiAgICAgICAgICBjb25zdCByZWFzb24gPSB1c2VySWQgPT09IGN1cnJlbnRVc2VySWQgPyBSQ0NhbGxFbmRSZWFzb24uTk9fUkVTUE9OU0UgOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05PX1JFU1BPTlNFO1xuICAgICAgICAgIC8vIOmAmuefpSBjYWxsIOWxguS6uuWRmOeKtuaAgeWPmOabtFxuICAgICAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1t1c2VySWRdLCByZWFzb24pO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyDlkbzlj6votoXml7bmnKrmjqXmipvlh7pvbkh1bmd1cFxuICAgICAgICAgICAgdGhpcy5fd2F0Y2hlcnMub25IdW5ndXAodGhpcy5fdXNlckluZm9bdXNlcklkXSwgcmVhc29uKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gY2FsbCBvbmh1bmd1cCBlcnJvciAtPiAke2Vycm9yPy5zdGFja31gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkZWxldGUgdGhpcy5fdXNlckluZm9bdXNlcklkXTtcbiAgICAgICAgICAvLyDmiL/pl7TkurrlkZjkv6Hmga/lsJHkuo7kuKTkuKog5oiWIOacquaOpeWQrOeahOaYr+iHquW3se+8jOmAmuefpeaIv+mXtOeKtuaAgee7k+adn1xuICAgICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl91c2VySW5mbykubGVuZ3RoIDwgMiB8fCB1c2VySWQgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgICAgICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQsIHJlYXNvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9LCB0aGlzLl9nZXRUaW1lb3V0KHNlbnRUaW1lKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5aSE55CG5bey5pyJIHNlc3Npb24g77yM5LiN5YWB6K645YaN5o6l5ZCs5paw5Lya6K+d5oOF5Ya1XG4gICAqL1xuICBfX2hhbmRsZUludml0ZUluU2Vzc2lvbigpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsICdTdGF0ZU1hY2hpbmUgLT4gX19oYW5kbGVJbnZpdGVJblNlc3Npb24nKTtcbiAgICAvLyDkv67mlLnmiYDmnInnlKjmiLfnirbmgIHlubbmipvlh7rvvIzmuIXnqbrorqHml7blmahcbiAgICBmb3IgKGNvbnN0IHVzZXJJZCBpbiB0aGlzLl91c2VySW5mbykge1xuICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXS5zdGF0ZSAmJiAodGhpcy5fdXNlckluZm9bdXNlcklkXS5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5OT05FKTtcbiAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1t1c2VySWRdKTtcbiAgICAgIC8vIOWwhuW3suWtmOWcqOeahOiuoeaXtuWZqOmDvea4heaOiVxuICAgICAgdGhpcy5fY2xlYXJUaW1lckJ5SWQodXNlcklkKTtcbiAgICB9XG4gICAgLy8g55u05o6l57uI5q2i5b2T5YmNIHNlc3Npb24g54q25oCBXG4gICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLkVORCwgUkNDYWxsRW5kUmVhc29uLkJVU1lfTElORSk7XG4gICAgLy8g5Y+R6YCB5oyC5pat5raI5oGv77yM5bm25pC65bimIOW3seaWueW/meeijCDljp/lm6BcbiAgICB0aGlzLl9jYWxsTXNnSGFuZGxlci5zZW5kSHVuZ3VwKHtcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5fY2hhbm5lbElkLFxuICAgICAgY29udmVyc2F0aW9uVHlwZTogdGhpcy5fY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkOiB0aGlzLl90YXJnZXRJZCxcbiAgICAgIGNhbGxJZDogdGhpcy5fY2FsbElkLFxuICAgICAgcmVhc29uOiBSQ0NhbGxFbmRSZWFzb24uQlVTWV9MSU5FLFxuICAgICAgdXNlcklkczogdGhpcy5nZXRSZW1vdGVVc2VySWRzKCksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5Li75Yqo5ZG85Y+rIChDYWxsRW5naW5lIOWGhemDqOiwg+eUqClcbiAgICogQHBhcmFtIHVzZXJJZHMg6KKr6YKA6K+355So5oi3IElEIOWIl+ihqFxuICAgKiBAcGFyYW0gZXh0cmEg5raI5oGv55qE5omp5bGV5L+h5oGvXG4gICAqIEBwYXJhbSBwdXNoVGl0bGUg6YCa55+l55qE5qCH6aKYXG4gICAqIEBwYXJhbSBwdXNoQ29udGVudCDpgJrnn6XnmoTlhoXlrrlcbiAgICovXG4gIGFzeW5jIF9fY2FsbCh1c2VySWRzOiBzdHJpbmdbXSwgZXh0cmE6IHN0cmluZyA9ICcnLCBwdXNoVGl0bGU6IHN0cmluZyA9ICcnLCBwdXNoQ29udGVudDogc3RyaW5nID0gJycsIGlzQ3Jvc3NBcHBrZXkgPSBmYWxzZSkge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbUkNDYWxsU3RhdGVNYWNoaW5lXSBpbnZpdGUgLT4gdXNlcklkczogJHtKU09OLnN0cmluZ2lmeSh1c2VySWRzKX1gKTtcbiAgICAvLyDlj5HpgIHpgoDor7fmtojmga9cbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY2FsbGVySWQgPSB0aGlzLl9pbnZpdGVySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGNvbnN0IHsgY29kZSwgbWVzc2FnZSB9ID0gYXdhaXQgdGhpcy5fY2FsbE1zZ0hhbmRsZXIuc2VuZEludml0ZSh7XG4gICAgICByb29tVHlwZTogaXNDcm9zc0FwcGtleSA/IFJDQ3Jvc3NDYWxsVHlwZS5SQ0NhbGxSb29tVHlwZUFjcm9zc0NhbGwgOiBSQ0Nyb3NzQ2FsbFR5cGUuUkNDYWxsUm9vbVR5cGVOb3JtYWxDYWxsLFxuICAgICAgY2hhbm5lbElkOiB0aGlzLl9jaGFubmVsSWQsXG4gICAgICBjb252ZXJzYXRpb25UeXBlOiB0aGlzLl9jb252ZXJzYXRpb25UeXBlLFxuICAgICAgdGFyZ2V0SWQ6IHRoaXMuX3RhcmdldElkLFxuICAgICAgY2FsbElkOiB0aGlzLl9jYWxsSWQsXG4gICAgICBleHRyYSxcbiAgICAgIHB1c2hUaXRsZSxcbiAgICAgIHB1c2hDb250ZW50LFxuICAgICAgbWVkaWFUeXBlOiB0aGlzLl9tZWRpYVR5cGUsXG4gICAgICBpbnZpdGVVc2VySWRzOiB1c2VySWRzLmZpbHRlcigoaWQpID0+IGlkICE9PSBjdXJyZW50VXNlcklkKSxcbiAgICB9KTtcblxuICAgIHRoaXMuX2lzQ3Jvc3NBcHBrZXkgPSBpc0Nyb3NzQXBwa2V5O1xuXG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICBjb25zdCB7IHNlbnRUaW1lIH0gPSBtZXNzYWdlITtcblxuICAgICAgLyoqXG4gICAgICAgKiDot6ggYXBwa2V5IOS7heWtmOWcqOWNleiBiu+8jOWvueerryB1c2VySWQg6ZyA5Y+W5LiL5YiS57q/5ZCO6Z2i55qE6YOo5YiGXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IGlkcyA9IGlzQ3Jvc3NBcHBrZXkgPyBbY3VycmVudFVzZXJJZCwgLi4uW3VzZXJJZHNbMF0uc3BsaXQoJ18nKVsxXV1dIDogW2N1cnJlbnRVc2VySWQsIC4uLnVzZXJJZHNdO1xuXG4gICAgICAvLyDpgY3ljobmm7TmlrDmiL/pl7TmiYDmnInkurrlkZjnirbmgIHjgIHlubbnu5nooqvlj6vlkK/liqjorqHml7blmahcbiAgICAgIGlkcy5mb3JFYWNoKCh1c2VySWQpID0+IHtcbiAgICAgICAgY29uc3QgaXNDYWxsZXIgPSB1c2VySWQgPT09IGN1cnJlbnRVc2VySWQ7XG4gICAgICAgIHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0gPSB7XG4gICAgICAgICAgdXNlcklkLFxuICAgICAgICAgIHN0YXRlOiBSQ0NhbGxVc2VyU3RhdGUuV0FJVElORyxcbiAgICAgICAgICBpc0NhbGxlcixcbiAgICAgICAgICBpc1JlbW90ZTogIWlzQ2FsbGVyLFxuICAgICAgICB9O1xuICAgICAgICAvLyDpgJrnn6UgY2FsbCDlsYLkurrlkZjnirbmgIHlj5jmm7RcbiAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0pO1xuXG4gICAgICAgIC8vIOWQr+WKqOWRvOWPq+i2heaXtuiuoeaXtuWZqFxuICAgICAgICBpZiAoIWlzQ2FsbGVyKSB7XG4gICAgICAgICAgdGhpcy5fdXNlclRpbWVyc1t1c2VySWRdID0gbmV3IFRpbWVyKCgpID0+IHtcbiAgICAgICAgICAgIC8vIOWRvOWPq+i2heaXtuWkhOeQhueKtuaAgeOAgeW5tumAmuefpSBjYWxsIOWxglxuICAgICAgICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSAmJiAodGhpcy5fdXNlckluZm9bdXNlcklkXS5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5OT05FKTtcbiAgICAgICAgICAgIC8vIOmAmuefpSBjYWxsIOWxguS6uuWRmOeKtuaAgeWPmOabtFxuICAgICAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0sIFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfTk9fUkVTUE9OU0UpO1xuXG4gICAgICAgICAgICAvLyDlkbzlj6votoXml7bmnKrmjqXmipvlh7pvbkh1bmd1cFxuICAgICAgICAgICAgdGhpcy5fd2F0Y2hlcnMub25IdW5ndXAodGhpcy5fdXNlckluZm9bdXNlcklkXSwgUkNDYWxsRW5kUmVhc29uLlJFTU9URV9OT19SRVNQT05TRSk7XG5cbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl91c2VySW5mb1t1c2VySWRdO1xuICAgICAgICAgICAgLy8g5oi/6Ze05Lq65ZGY5L+h5oGv5bCR5LqO5Lik5Liq77yM6YCa55+l5oi/6Ze054q25oCBXG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fdXNlckluZm8pLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLkVORCwgUkNDYWxsRW5kUmVhc29uLlJFTU9URV9OT19SRVNQT05TRSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyDov5znq6/kurrlkZjlpKfkuo4gMSDkuJTlt7HmlrnkuI3kuLrmraPlnKjpgJror53ml7bvvIzlj5HpgIEgaHVuZ3VwLCDlkYror4nov5znq6/oh6rlt7HpgIDlh7rpgJror51cbiAgICAgICAgICAgIGNvbnN0IGlzTmVlZFNlbmRIdW5ndXAgPSB0aGlzLmdldFJlbW90ZVVzZXJJZHMoKS5sZW5ndGggPT09IDAgJiYgKHRoaXMuX3VzZXJJbmZvW2N1cnJlbnRVc2VySWRdLnN0YXRlICE9PSBSQ0NhbGxVc2VyU3RhdGUuS0VFUElORyk7XG4gICAgICAgICAgICBpZiAoaXNOZWVkU2VuZEh1bmd1cCkge1xuICAgICAgICAgICAgICB0aGlzLl9odW5ndXBIYW5kbGUoUkNDYWxsRW5kUmVhc29uLlJFTU9URV9OT19SRVNQT05TRSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgdGhpcy5fZ2V0VGltZW91dChzZW50VGltZSkpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8g6YCa55+lIGNhbGwg5bGC5oi/6Ze054q25oCB5Y+Y5pu0XG4gICAgICB0aGlzLl9ub3RpZnlTdGF0ZUNoYW5nZShSQ0NhbGxTZXNzaW9uU3RhdGUuV0FJVElORyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGVuZENvZGUgPSBjb2RlID09PSBSQ0NhbGxFcnJvckNvZGUuUkVKRUNURURfQllfQkxBQ0tMSVNUID8gUkNDYWxsRW5kUmVhc29uLkFEREVEX1RPX0JMQUNLTElTVCA6IFJDQ2FsbEVuZFJlYXNvbi5ORVRXT1JLX0VSUk9SO1xuICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLkVORCwgZW5kQ29kZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOaOpeWQrFxuICAgKi9cbiAgYXN5bmMgYWNjZXB0KCk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUgfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsU3RhdGVNYWNoaW5lXSBhY2NlcHQnKTtcblxuICAgIC8vIOWPkemAgeaOpeWQrOa2iOaBr1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGNvbnN0IHsgY29kZSwgbWVzc2FnZSB9ID0gYXdhaXQgdGhpcy5fY2FsbE1zZ0hhbmRsZXIuc2VuZEFjY2VwdCh7XG4gICAgICBjaGFubmVsSWQ6IHRoaXMuX2NoYW5uZWxJZCxcbiAgICAgIGNvbnZlcnNhdGlvblR5cGU6IHRoaXMuX2NvbnZlcnNhdGlvblR5cGUsXG4gICAgICB0YXJnZXRJZDogdGhpcy5fdGFyZ2V0SWQsXG4gICAgICBjYWxsSWQ6IHRoaXMuX2NhbGxJZCxcbiAgICAgIG1lZGlhVHlwZTogdGhpcy5fbWVkaWFUeXBlLFxuICAgICAgdXNlcklkczogdGhpcy5nZXRSZW1vdGVVc2VySWRzKCksXG4gICAgfSk7XG5cbiAgICAvLyDmuIXpmaTmjqXlkKzotoXml7borqHml7blmahcbiAgICB0aGlzLl9jbGVhclRpbWVyQnlJZChjdXJyZW50VXNlcklkKTtcbiAgICBpZiAoY29kZSA9PT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIGNvbnN0IHsgc2VudFRpbWUgfSA9IG1lc3NhZ2UhO1xuICAgICAgdGhpcy5fdXNlckluZm9bY3VycmVudFVzZXJJZF0gJiYgKHRoaXMuX3VzZXJJbmZvW2N1cnJlbnRVc2VySWRdLnN0YXRlID0gUkNDYWxsVXNlclN0YXRlLktFRVBJTkcpO1xuICAgICAgdGhpcy5fYmVnaW5UaW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgICAgLy8g6YCa55+lIGNhbGwg5bGC5Lq65ZGY54q25oCB5Y+Y5pu0XG4gICAgICB0aGlzLl9ub3RpZnlVc2VyU3RhdGVDaGFuZ2UodGhpcy5fdXNlckluZm9bY3VycmVudFVzZXJJZF0pO1xuICAgICAgLy8g5L+u5pS55bm26YCa55+lIGNhbGwg5bGC5oi/6Ze054q25oCB5Y+Y5pu0XG4gICAgICB0aGlzLl9ub3RpZnlTdGF0ZUNoYW5nZShSQ0NhbGxTZXNzaW9uU3RhdGUuS0VFUElORyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3VzZXJJbmZvW2N1cnJlbnRVc2VySWRdICYmICh0aGlzLl91c2VySW5mb1tjdXJyZW50VXNlcklkXS5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5OT05FKTtcbiAgICAgIC8vIOmAmuefpSBjYWxsIOWxguS6uuWRmOeKtuaAgeWPmOabtFxuICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW2N1cnJlbnRVc2VySWRdKTtcbiAgICAgIC8vIOS/ruaUueW5tumAmuefpSBjYWxsIOWxguaIv+mXtOeKtuaAgeWPmOabtFxuICAgICAgY29uc3QgZW5kUmVhc29uID0gY29kZSA9PT0gUkNDYWxsRXJyb3JDb2RlLlJFSkVDVEVEX0JZX0JMQUNLTElTVCA/IFJDQ2FsbEVuZFJlYXNvbi5BRERFRF9UT19CTEFDS0xJU1QgOiBSQ0NhbGxFbmRSZWFzb24uTkVUV09SS19FUlJPUjtcbiAgICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQsIGVuZFJlYXNvbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOe+pOWRvOWPq+S4ree7p+e7remCgOivt1xuICAgKiBAcGFyYW0gdXNlcklkcyDooqvpgoDor7fnlKjmiLcgSUQg5YiX6KGoXG4gICAqL1xuICBhc3luYyBpbnZpdGUodXNlcklkczogc3RyaW5nW10sIG9wdGlvbnM6IElJbnZpdGVPcHRpb25zID0ge30pOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICBpZiAodGhpcy5fY29udmVyc2F0aW9uVHlwZSAhPT0gQ29udmVyc2F0aW9uVHlwZS5HUk9VUCkge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLkNPTlZFUlNBVElPTl9OT1RfR1JPVVBfRVJST1IgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gaW52aXRlIC0+IHVzZXJJZHM6ICR7SlNPTi5zdHJpbmdpZnkodXNlcklkcyl9YCk7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgY29uc3QgZXhpc3RlZFVzZXJJZHMgPSBPYmplY3Qua2V5cyh0aGlzLl91c2VySW5mbyk7XG4gICAgY29uc3QgZXhpc3RlZFVzZXJQb2ZpbGVzOiBJRXhpc3RlZFVzZXJQb2ZpbGVzW10gPSBleGlzdGVkVXNlcklkcy5tYXAoKHVzZXJJZCkgPT4ge1xuICAgICAgbGV0IGNhbGxTdGF0dXMgPSBNc2dDYWxsU3RhdHVzLkNPTk5FQ1RFRDtcbiAgICAgIC8vIOWMheWQq+iiq+mCgOivt+iAhe+8jOaIluiAheeUqOaIt+eKtuaAgeS4uiB3YXRpbmcg5pe277yM54q25oCB5Li6IOWTjemTg1xuICAgICAgaWYgKHVzZXJJZHMuaW5jbHVkZXModXNlcklkKSB8fCB0aGlzLl91c2VySW5mb1t1c2VySWRdLnN0YXRlID09PSBSQ0NhbGxVc2VyU3RhdGUuV0FJVElORykge1xuICAgICAgICBjYWxsU3RhdHVzID0gTXNnQ2FsbFN0YXR1cy5SSU5HSU5HO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICBtZWRpYVR5cGU6IHRoaXMuX21lZGlhVHlwZSxcbiAgICAgICAgY2FsbFN0YXR1cyxcbiAgICAgICAgbWVkaWFJZDogdXNlcklkLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGV4dHJhID0gb3B0aW9ucy5leHRyYSB8fCAnJztcbiAgICBjb25zdCBwdXNoVGl0bGUgPSBvcHRpb25zLnB1c2hUaXRsZSB8fCAnJztcbiAgICBjb25zdCBwdXNoQ29udGVudCA9IG9wdGlvbnMucHVzaENvbnRlbnQgfHwgJyc7XG5cbiAgICAvLyDlj5HpgIHkurrlkZjlj5jmm7Tmtojmga9cbiAgICBjb25zdCB7IGNvZGUsIG1lc3NhZ2UgfSA9IGF3YWl0IHRoaXMuX2NhbGxNc2dIYW5kbGVyLnNlbmRNZW1lYmVyTW9kaWZ5KHtcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5fY2hhbm5lbElkLFxuICAgICAgY29udmVyc2F0aW9uVHlwZTogdGhpcy5fY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkOiB0aGlzLl90YXJnZXRJZCxcbiAgICAgIGNhbGxJZDogdGhpcy5fY2FsbElkLFxuICAgICAgZXh0cmEsXG4gICAgICBwdXNoVGl0bGUsXG4gICAgICBwdXNoQ29udGVudCxcbiAgICAgIG1lZGlhVHlwZTogdGhpcy5fbWVkaWFUeXBlLFxuICAgICAgLy8g6Zmk6Ieq5bex77yM5YW25LuW5omA5pyJ5Lq65Z2H6ZyA5pS25YiwIG1vZGlmeSDmtojmga/vvIzku6XmraTmm7TmlrDnirbmgIFcbiAgICAgIGludml0ZVVzZXJJZHM6IHVzZXJJZHMuZmlsdGVyKChpZCkgPT4gaWQgIT09IGN1cnJlbnRVc2VySWQpLFxuICAgICAgY2FsbGVySWQ6IHRoaXMuZ2V0Q2FsbGVySWQoKSxcbiAgICAgIGV4aXN0ZWRVc2VyUG9maWxlcyxcbiAgICAgIGRpcmVjdGlvbmFsVXNlcklkTGlzdDogWy4uLmV4aXN0ZWRVc2VySWRzLCAuLi51c2VySWRzXS5maWx0ZXIoKGlkKSA9PiBpZCAhPT0gY3VycmVudFVzZXJJZCksXG4gICAgfSk7XG5cbiAgICBpZiAoY29kZSA9PT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIGNvbnN0IHsgc2VudFRpbWUgfSA9IG1lc3NhZ2UhO1xuICAgICAgLy8g5L+u5pS56KKr6YKA6K+35Lq654q25oCB77yM5bm26YCa55+lXG4gICAgICB1c2VySWRzLmZvckVhY2goKHVzZXJJZCkgPT4ge1xuICAgICAgICB0aGlzLl91c2VySW5mb1t1c2VySWRdID0ge1xuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICBzdGF0ZTogUkNDYWxsVXNlclN0YXRlLldBSVRJTkcsXG4gICAgICAgICAgaXNDYWxsZXI6IGZhbHNlLFxuICAgICAgICAgIGlzUmVtb3RlOiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgICAvLyDpgJrnn6UgY2FsbCDlsYLkurrlkZjnirbmgIHlj5jmm7RcbiAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0pO1xuICAgICAgICAvLyDlkK/liqjlkbzlj6vorqHml7blmahcbiAgICAgICAgdGhpcy5fdXNlclRpbWVyc1t1c2VySWRdID0gbmV3IFRpbWVyKCgpID0+IHtcbiAgICAgICAgICAvLyDlkbzlj6votoXml7blpITnkIbnirbmgIHjgIHlubbpgJrnn6UgY2FsbCDlsYJcbiAgICAgICAgICB0aGlzLl91c2VySW5mb1t1c2VySWRdICYmICh0aGlzLl91c2VySW5mb1t1c2VySWRdLnN0YXRlID0gUkNDYWxsVXNlclN0YXRlLk5PTkUpO1xuICAgICAgICAgIC8vIOmAmuefpSBjYWxsIOWxguS6uuWRmOeKtuaAgeWPmOabtFxuICAgICAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1t1c2VySWRdLCBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05PX1JFU1BPTlNFKTtcblxuICAgICAgICAgIC8vIOWRvOWPq+i2heaXtuacquaOpeaKm+WHum9uSHVuZ3VwXG4gICAgICAgICAgdGhpcy5fd2F0Y2hlcnMub25IdW5ndXAodGhpcy5fdXNlckluZm9bdXNlcklkXSwgUkNDYWxsRW5kUmVhc29uLlJFTU9URV9OT19SRVNQT05TRSk7XG5cbiAgICAgICAgICBkZWxldGUgdGhpcy5fdXNlckluZm9bdXNlcklkXTtcbiAgICAgICAgICAvLyDmiL/pl7TkurrlkZjkv6Hmga/lsJHkuo7kuKTkuKrvvIzpgJrnn6XmiL/pl7TnirbmgIFcbiAgICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fdXNlckluZm8pLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQsIFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfTk9fUkVTUE9OU0UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcy5fZ2V0VGltZW91dChzZW50VGltZSkpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOmAmuefpeS6uuWRmOWPmOabtFxuICAgICAgdXNlcklkcy5mb3JFYWNoKCh1c2VySWQpID0+IHtcbiAgICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSA9IHtcbiAgICAgICAgICB1c2VySWQsXG4gICAgICAgICAgc3RhdGU6IFJDQ2FsbFVzZXJTdGF0ZS5OT05FLFxuICAgICAgICAgIGlzQ2FsbGVyOiBmYWxzZSxcbiAgICAgICAgICBpc1JlbW90ZTogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8g6YCa55+lIGNhbGwg5bGC5Lq65ZGY54q25oCB5Y+Y5pu0XG5cbiAgICAgICAgY29uc3QgZW5kUmVhc29uID0gY29kZSA9PT0gUkNDYWxsRXJyb3JDb2RlLlJFSkVDVEVEX0JZX0JMQUNLTElTVCA/IFJDQ2FsbEVuZFJlYXNvbi5BRERFRF9UT19CTEFDS0xJU1QgOiBSQ0NhbGxFbmRSZWFzb24uTkVUV09SS19FUlJPUjtcbiAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0sIGVuZFJlYXNvbik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9odW5ndXBIYW5kbGUocmVhc29uOiBSQ0NhbGxFbmRSZWFzb24pOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICAvLyDlj5HpgIHmjILmlq3nsbvlnovmtojmga9cbiAgICBsZXQgY29kZSA9IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTO1xuXG4gICAgY29uc3QgaGFuZ3VwUGFyYW1zID0ge1xuICAgICAgY2hhbm5lbElkOiB0aGlzLl9jaGFubmVsSWQsXG4gICAgICBjb252ZXJzYXRpb25UeXBlOiB0aGlzLl9jb252ZXJzYXRpb25UeXBlLFxuICAgICAgdGFyZ2V0SWQ6IHRoaXMuX3RhcmdldElkLFxuICAgICAgY2FsbElkOiB0aGlzLl9jYWxsSWQsXG4gICAgICByZWFzb24sXG4gICAgICB1c2VySWRzOiB0aGlzLmdldFJlbW90ZVVzZXJJZHMoKSxcbiAgICAgIHB1c2hUaXRsZTogdGhpcy5faHVuZ3VwUHVzaFRpdGxlLFxuICAgICAgcHVzaENvbnRlbnQ6IHRoaXMuX2h1bmd1cFB1c2hDb250ZW50LFxuICAgIH07XG5cbiAgICBpZiAocmVhc29uID09PSBSQ0NhbGxFbmRSZWFzb24uT1RIRVJfQ0xJRU5UX0pPSU5FRF9DQUxMKSB7XG4gICAgICAvLyDlt7Hnq6/ooqvlpJrnq6/liqDlhaUgUlRDIOaIv+mXtOaMpOaOieWQju+8jOS4jeWGjeetieWPkeaMguaWrea2iOaBr+eahOe7k+aenO+8jOmYsuatoui1sCB1c2VyTGVhdmUg5a+86Ie05oyC5pat5Y6f5Zug5LiN5YeG56GuXG4gICAgICB0aGlzLl9jYWxsTXNnSGFuZGxlci5zZW5kSHVuZ3VwKGhhbmd1cFBhcmFtcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHsgY29kZTogbXNnQ29kZSB9ID0gYXdhaXQgdGhpcy5fY2FsbE1zZ0hhbmRsZXIuc2VuZEh1bmd1cChoYW5ndXBQYXJhbXMpO1xuICAgICAgY29kZSA9IG1zZ0NvZGU7XG4gICAgfVxuXG4gICAgdGhpcy5fZW5kVGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAvLyDmm7TmlrDpgJror53kurrlkZjnirbmgIHjgIHpgJror53nu5PmnZ/ml7bpl7Qg5bm26YCa55+lXG4gICAgZm9yIChjb25zdCB1c2VySWQgaW4gdGhpcy5fdXNlckluZm8pIHtcbiAgICAgIHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0uc3RhdGUgPSBSQ0NhbGxVc2VyU3RhdGUuTk9ORTtcbiAgICAgIGlmICh1c2VySWQgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0sIHJlYXNvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9ub3RpZnlVc2VyU3RhdGVDaGFuZ2UodGhpcy5fdXNlckluZm9bdXNlcklkXSk7XG4gICAgICB9XG4gICAgICBkZWxldGUgdGhpcy5fdXNlckluZm9bdXNlcklkXTtcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fdXNlckluZm8pLmxlbmd0aCA8IDIpIHtcbiAgICAgIC8vIOa4heepuuWGheWtmOaAgeaVsOaNru+8jOW5tumAmuefpVxuICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLkVORCwgcmVhc29uKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog5oyC5patXG4gICAqL1xuICBhc3luYyBodW5ndXAocHVzaFRpdGxlOiBzdHJpbmcgPSAnJywgcHVzaENvbnRlbnQ6IHN0cmluZyA9ICcnKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSB9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgJ1tSQ0NhbGxTdGF0ZU1hY2hpbmVdIGh1bmd1cCcpO1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIC8vIOm7mOiupOaMguaWrSByZWFzb24g5Li66YCa6K+d6L+H56iL5Lit77yM5bex5pa55q2j5bi45Y+W5raI6YCa6K+dXG4gICAgbGV0IHJlYXNvbiA9IFJDQ2FsbEVuZFJlYXNvbi5IQU5HVVA7XG4gICAgLy8g6Iul6LaF5pe26K6h5pe25Zmo5a2Y5ZyoLCDlt7HmlrnkuLogY2FsbGVyIOWOn+WboOS4uuW3seaWueWPlua2iOmAmuivnSwg5bex5pa55Li6IGNhbGxlZSDljp/lm6DkuLrlt7Hmlrnmi5Lnu53pgJror51cbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fdXNlclRpbWVycykubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5fdXNlckluZm9bY3VycmVudFVzZXJJZF0uaXNDYWxsZXIgPyByZWFzb24gPSBSQ0NhbGxFbmRSZWFzb24uQ0FOQ0VMIDogcmVhc29uID0gUkNDYWxsRW5kUmVhc29uLlJFSkVDVDtcbiAgICB9XG5cbiAgICAvLyDmuIXpmaTmiYDmnInotoXml7borqHml7blmahcbiAgICBmb3IgKGNvbnN0IHVzZXJJZCBpbiB0aGlzLl91c2VyVGltZXJzKSB7XG4gICAgICB0aGlzLl9jbGVhclRpbWVyQnlJZCh1c2VySWQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5faHVuZ3VwSGFuZGxlKHJlYXNvbik7XG4gIH1cblxuICAvKipcbiAgICog5L+u5pS56YCa6K+d5aqS5L2T57G75Z6LXG4gICAqIEBwYXJhbSBtZWRpYVR5cGUgUkNDYWxsTWVkaWFUeXBlLkFVRElPIOaUueS4uumfs+mikemAmuivnSB8IFJDQ2FsbE1lZGlhVHlwZS5BVURJT19WSURFTyDmlLnkuLrpn7Pop4bpopHpgJror51cbiAgICovXG4gIGFzeW5jIGNoYW5nZU1lZGlhVHlwZShtZWRpYVR5cGU6IFJDQ2FsbE1lZGlhVHlwZSk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUgfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbUkNDYWxsU3RhdGVNYWNoaW5lXSBjaGFuZ2VNZWRpYVR5cGUgLT4gbWVkaWFUeXBlOiAke21lZGlhVHlwZX1gKTtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX2NhbGxNc2dIYW5kbGVyLnNlbmRNZWRpYU1vZGlmeSh7XG4gICAgICBjaGFubmVsSWQ6IHRoaXMuX2NoYW5uZWxJZCxcbiAgICAgIGNvbnZlcnNhdGlvblR5cGU6IHRoaXMuX2NvbnZlcnNhdGlvblR5cGUsXG4gICAgICB0YXJnZXRJZDogdGhpcy5fdGFyZ2V0SWQsXG4gICAgICBjYWxsSWQ6IHRoaXMuX2NhbGxJZCxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICAgIHVzZXJJZHM6IHRoaXMuZ2V0UmVtb3RlVXNlcklkcygpLFxuICAgIH0pO1xuICAgIGlmIChjb2RlID09PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbWVkaWFUeXBlID0gbWVkaWFUeXBlO1xuICAgIH1cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog55So5oi35Yqg5YWl6YCa6K+d6KGl5YG/5py65Yi277yIcnRjIHVzZXJKb2luIOS6i+S7tuinpuWPke+8iVxuICAgKiDkuLvlj6vlkbzlj6vlkI7vvIzmnKrmlLbliLDooqvlj6sgYWNjZXB0IOa2iOaBr++8jOS9huaUtuWIsOS6hiB1c2VySm9pbiDlkIzmoLfooaXlgb/mm7TmlrDnlKjmiLfjgIHmiL/pl7TnirbmgIHjgIHlkbzlj6vorqHml7blmahcbiAgICovXG4gIHVzZXJKb2luKHVzZXJJZHM6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYFtSQ0NhbGxTdGF0ZU1hY2hpbmVdIHVzZXJKb2luIC0+IHVzZXJJZHM6ICR7SlNPTi5zdHJpbmdpZnkodXNlcklkcyl9YCk7XG4gICAgLy8g5bu26L+fIDMwMG1zIOmYsuatoiB1c2VySmlvbiDlkowgYWNjZXB0IOa2iOaBr+mDveacieeahOaDheWGteS4i++8jCB1c2VySm9pbiDmr5QgYWNjZXB0IOWFiOWIsFxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdXNlcklkcy5mb3JFYWNoKCh1c2VySWQpID0+IHtcbiAgICAgICAgY29uc3QgdXNlckluZm8gPSB0aGlzLl91c2VySW5mb1t1c2VySWRdO1xuICAgICAgICAvLyDmm7TmlrDkurrlkZjnirbmgIEgKC8vIOe+pOe7hOmAmuivneaXtu+8miBB5ZCRQuOAgUPlj5HotbfpgJror50gQuWFiOaOpeWQrO+8jEPlkI7mjqXlkKzvvIzov5nml7ZC5rKh5pyJQ+eahHVzZXJJZOWvueW6lOeahF91c2VySW5mb++8jOaJgOS7pei/memHjOWIpOaWreS4gOS4iylcbiAgICAgICAgaWYgKHVzZXJJbmZvICYmIHVzZXJJbmZvLnN0YXRlICE9PSBSQ0NhbGxVc2VyU3RhdGUuS0VFUElORykge1xuICAgICAgICAgIHVzZXJJbmZvLnN0YXRlID0gUkNDYWxsVXNlclN0YXRlLktFRVBJTkc7XG4gICAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHVzZXJJbmZvKTtcbiAgICAgICAgfVxuICAgICAgICAvLyDmm7TmlrDmiL/pl7TnirbmgIFcbiAgICAgICAgaWYgKHRoaXMuX3Nlc3Npb25TdGF0ZSAhPT0gUkNDYWxsU2Vzc2lvblN0YXRlLktFRVBJTkcpIHtcbiAgICAgICAgICB0aGlzLl9ub3RpZnlTdGF0ZUNoYW5nZShSQ0NhbGxTZXNzaW9uU3RhdGUuS0VFUElORyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8g5YGc5q2i5bm25riF6Zmk5ZG85Y+r6K6h5pe25ZmoXG4gICAgICAgIHRoaXMuX2NsZWFyVGltZXJCeUlkKHVzZXJJZCk7XG4gICAgICB9KTtcbiAgICB9LCAzMDApO1xuICB9XG5cbiAgLyoqXG4gICAqIOeUqOaIt+emu+W8gOmAmuivneihpeWBv+acuuWItu+8iHJ0YyB1c2VyTGVhdmXjgIFraWNrT2ZmIOS6i+S7tuinpuWPke+8iVxuICAgKiDpgJror53kuK3ov5znq6/nlKjmiLfmjILmlq3vvIzmjILmlq3mtojmga/mnKrliLDvvIzkvYbmmK/nm5HlkKzliLAgcnRjIHVzZXJMZWF2ZSDlkIzmoLfooaXlgb/mm7TmlrDnlKjmiLfjgIHmiL/pl7TnirbmgIFcbiAgICovXG4gIHVzZXJMZWF2ZSh1c2VySWRzOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbUkNDYWxsU3RhdGVNYWNoaW5lXSB1c2VyTGVhdmUgLT4gdXNlcklkczogJHtKU09OLnN0cmluZ2lmeSh1c2VySWRzKX1gKTtcbiAgICAvLyDlu7bov58gMzAwbXMg6Ziy5q2iIHVzZXJMZWF2ZSDlkowgaHVuZ3VwIOa2iOaBr+mDveacieeahOaDheWGteS4i++8jHVzZXJMZWF2ZSDmr5QgaHVuZ3VwIOWFiOWIsFxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdXNlcklkcy5mb3JFYWNoKCh1c2VySWQpID0+IHtcbiAgICAgICAgY29uc3QgdXNlckluZm8gPSB0aGlzLl91c2VySW5mb1t1c2VySWRdO1xuICAgICAgICAvLyDmm7TmlrDkurrlkZjnirbmgIFcbiAgICAgICAgaWYgKHVzZXJJbmZvICYmIHVzZXJJbmZvLnN0YXRlICE9PSBSQ0NhbGxVc2VyU3RhdGUuTk9ORSkge1xuICAgICAgICAgIHVzZXJJbmZvLnN0YXRlID0gUkNDYWxsVXNlclN0YXRlLk5PTkU7XG4gICAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHVzZXJJbmZvLCBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX0hBTkdVUCk7XG4gICAgICAgICAgdGhpcy5fd2F0Y2hlcnMub25IdW5ndXAodXNlckluZm8sIFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfSEFOR1VQKTtcbiAgICAgICAgICBkZWxldGUgdGhpcy5fdXNlckluZm9bdXNlcklkXTtcbiAgICAgICAgfVxuICAgICAgICAvLyDkuLvlj6vmlrnnvqTogYrpgoDor7fooqvlj6vmlrnlkI7nprvnur/vvIzkuLvlj6vmlrnmraTml7bkuLrnrYnlvoXnirbmgIHlkI7kuI3lho3kuIrnur/vvIzooqvlj6vmlrnmjqXlkKzlkI7mjILmlq3oh7PliankvZnkuIDkurrml7bnrYnlvoXkuIDliIbpkp/lkI7mjILmlq1cbiAgICAgICAgY29uc3QgcmVtb3RlVXNlcnNUaW1lciA9IG5ldyBUaW1lcigoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVtb3RlVXNlcnMgPSB0aGlzLmdldFJlbW90ZVVzZXJzKCk7XG4gICAgICAgICAgLy8g6L+c56uv5Y+q5pyJ5LiA5Liq55So5oi35LiU5piv562J5b6F54q25oCB77yM562J5b6F5LiA5YiG6ZKf5ZCO5oyC5patXG4gICAgICAgICAgaWYgKHJlbW90ZVVzZXJzLmxlbmd0aCA9PT0gMSAmJiByZW1vdGVVc2Vyc1swXS5zdGF0ZSA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5faHVuZ3VwSGFuZGxlKFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfTkVUV09SS19FUlJPUik7XG4gICAgICAgICAgfVxuICAgICAgICB9LCA2MDAwMCk7XG4gICAgICAgIC8vIOabtOaWsOaIv+mXtOeKtuaAgVxuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fdXNlckluZm8pLmxlbmd0aCA8IDIgJiYgdGhpcy5fc2Vzc2lvblN0YXRlICE9PSBSQ0NhbGxTZXNzaW9uU3RhdGUuRU5EKSB7XG4gICAgICAgICAgdGhpcy5fZW5kVGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICB0aGlzLl9ub3RpZnlTdGF0ZUNoYW5nZShSQ0NhbGxTZXNzaW9uU3RhdGUuRU5ELCBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX0hBTkdVUCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sIDMwMCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbCDlsYLlt7HmlrnlvILluLjlpLHotKXlkI7osIPnlKjnmoTmlrnms5VcbiAgICog6Kem5Y+R5pe25py677ya6Z+z6KeG6aKR5pyN5Yqh5byC5bi444CB6I635Y+W6LWE5rqQ5aSx6LSl44CB5Yqg5YWlIFJUQyDmiL/pl7TlpLHotKXjgIHlj5HluIN86K6i6ZiF5aSx6LSlXG4gICAqL1xuICBjbG9zZShyZWFzb246IFJDQ2FsbEVuZFJlYXNvbikge1xuICAgIHRoaXMuX2h1bmd1cEhhbmRsZShyZWFzb24pO1xuICB9XG5cbiAgc2V0SHVuZ3VwUHVzaENvbmZpZyhwdXNoQ29uZmlnOiBzdHJpbmcgPSAnJywgcHVzaENvbnRlbnQ6IHN0cmluZyA9ICcnKSB7XG4gICAgdGhpcy5faHVuZ3VwUHVzaFRpdGxlID0gcHVzaENvbmZpZztcbiAgICB0aGlzLl9odW5ndXBQdXNoQ29udGVudCA9IHB1c2hDb250ZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIOmAmuivneWUr+S4gOagh+ivhlxuICAgKi9cbiAgZ2V0Q2FsbElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbGxJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDlpJrnu4Tnu4cgSURcbiAgICovXG4gIGdldENoYW5uZWxJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jaGFubmVsSWQ7XG4gIH1cblxuICAvKipcbiAgICog55uu5qCHIElE77yM5Y2V5ZG85a+55pa55Lq65ZGYIElkLCDnvqTlkbznvqTnu4QgSWRcbiAgICovXG4gIGdldFRhcmdldElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3RhcmdldElkO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluS8muivneexu+Wei1xuICAgKi9cbiAgZ2V0Q29udmVyc2F0aW9uVHlwZSgpOiBDb252ZXJzYXRpb25UeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fY29udmVyc2F0aW9uVHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bov5znq6/miJDlkZggSUQg5YiX6KGoXG4gICAqL1xuICBnZXRSZW1vdGVVc2VySWRzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBhbGxVc2VySWRzID0gT2JqZWN0LmtleXModGhpcy5fdXNlckluZm8pO1xuICAgIGNvbnN0IHJlbW90ZVVzZXJJZHMgPSBhbGxVc2VySWRzLmZpbHRlcigoaWQpID0+IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCkgIT09IGlkKTtcbiAgICByZXR1cm4gcmVtb3RlVXNlcklkcztcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bov5znq6/miJDlkZjkv6Hmga/liJfooahcbiAgICovXG4gIGdldFJlbW90ZVVzZXJzKCk6IElVc2VyRGF0YVtdIHtcbiAgICBjb25zdCByZW1vdGVVc2VyOiBJVXNlckRhdGFbXSA9IFtdO1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGZvciAoY29uc3QgdWlkIGluIHRoaXMuX3VzZXJJbmZvKSB7XG4gICAgICBjb25zdCB7IHVzZXJJZCB9ID0gdGhpcy5fdXNlckluZm9bdWlkXTtcbiAgICAgIGlmICh1c2VySWQgIT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgICAgcmVtb3RlVXNlci5wdXNoKHRoaXMuX3VzZXJJbmZvW3VpZF0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVtb3RlVXNlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bmiL/pl7TnirbmgIFcbiAgICovXG4gIGdldFN0YXRlKCk6IFJDQ2FsbFNlc3Npb25TdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuX3Nlc3Npb25TdGF0ZSA9PT0gbnVsbCA/IFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQgOiB0aGlzLl9zZXNzaW9uU3RhdGU7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5Lq65ZGY54q25oCBXG4gICAqL1xuICBnZXRVc2VyU3RhdGUodXNlcklkOiBzdHJpbmcpOiBSQ0NhbGxVc2VyU3RhdGUge1xuICAgIHJldHVybiB0aGlzLl91c2VySW5mb1t1c2VySWRdPy5zdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bkvJror53lj5HotbfogIUgSWRcbiAgICovXG4gIGdldENhbGxlcklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbGxlcklkITtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blvZPmrKHkvJror53pgoDor7fogIUgSWRcbiAgICovXG4gIGdldEludml0ZXJJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9pbnZpdGVySWQhO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluW9k+WJjemAmuivneWqkuS9k+exu+Wei1xuICAgKi9cbiAgZ2V0TWVkaWFUeXBlKCk6IFJDQ2FsbE1lZGlhVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX21lZGlhVHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJror53mjILmlq3lkI7lj6/osIPnlKhcbiAgICovXG4gIGdldFN1bW1hcnkoKTogSUVuZFN1bW1hcnkge1xuICAgIC8vIOmAmuivneaXtumXtOiuoeeul1xuICAgIGNvbnN0IGJlZ2luVGltZXN0YW1wID0gdGhpcy5fYmVnaW5UaW1lc3RhbXA7XG4gICAgY29uc3QgZW5kVGltZXN0YW1wID0gdGhpcy5fZW5kVGltZXN0YW1wO1xuICAgIGxldCBkdXJhdGlvbiA9IDA7XG4gICAgaWYgKGVuZFRpbWVzdGFtcCA+IGJlZ2luVGltZXN0YW1wICYmIGJlZ2luVGltZXN0YW1wICE9PSAwKSB7XG4gICAgICBkdXJhdGlvbiA9IGVuZFRpbWVzdGFtcCAtIGJlZ2luVGltZXN0YW1wO1xuICAgIH1cblxuICAgIGNvbnN0IHN1bW1hcnkgPSB7XG4gICAgICBjb252ZXJzYXRpb25UeXBlOiB0aGlzLl9jb252ZXJzYXRpb25UeXBlLFxuICAgICAgY2hhbm5lbElkOiB0aGlzLl9jaGFubmVsSWQsXG4gICAgICB0YXJnZXRJZDogdGhpcy5fdGFyZ2V0SWQsXG4gICAgICBtZWRpYVR5cGU6IHRoaXMuX21lZGlhVHlwZSxcbiAgICAgIGJlZ2luVGltZXN0YW1wLFxuICAgICAgZW5kVGltZXN0YW1wLFxuICAgICAgZHVyYXRpb24sXG4gICAgICBlbmRSZWFzb246IHRoaXMuX2VuZFJlYXNvbiEsXG4gICAgfTtcblxuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbUkNDYWxsU3RhdGVNYWNoaW5lXSBnZXRTdW1tYXJ5IC0+IHN1bW1hcnk6ICR7SlNPTi5zdHJpbmdpZnkoc3VtbWFyeSl9YCk7XG4gICAgcmV0dXJuIHN1bW1hcnk7XG4gIH1cbn1cbiIsIi8qKlxuICog6YCa6K+d5aqS5L2T57G75Z6LXG4gKi9cbmV4cG9ydCBlbnVtIFJDQ2FsbE1lZGlhVHlwZSB7XG4gIC8qKlxuICAgKiDpn7PpopHpgJror51cbiAgICovXG4gIEFVRElPID0gMSxcbiAgLyoqXG4gICAqIOinhumikemAmuivnVxuICAgKi9cbiAgQVVESU9fVklERU9cbn1cbiIsImV4cG9ydCBlbnVtIE1lbWJlck1vZGlmeVR5cGUge1xuICBBREQgPSAxLFxuICBSRU1PVkVcbn1cbiIsIi8qKlxuICog5bmz5Y+wXG4gKi9cbmV4cG9ydCBlbnVtIFBsYXRmb3JtIHtcbiAgV0VCID0gJ1dlYicsXG4gIElPUyA9ICdpT1MnLFxuICBBTkRST0lEID0gJ0FuZHJvaWQnXG59XG4iLCJpbXBvcnQge1xuICBDb252ZXJzYXRpb25UeXBlLCBJTG9nZ2VyLCBJUmVjZWl2ZWRNZXNzYWdlLCBSVENQbHVnaW5Db250ZXh0LFxufSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBDYWxsUmVtb3RlRW5kUmVhc29uLCBSQ0NhbGxFbmRSZWFzb24gfSBmcm9tICcuL2VudW1zL1JDQ2FsbEVuZFJlYXNvbic7XG5pbXBvcnQgeyBSQ0NhbGxNZWRpYVR5cGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbE1lZGlhVHlwZSc7XG5pbXBvcnQgeyBSQ0NhbGxNZXNzYWdlVHlwZSB9IGZyb20gJy4vZW51bXMvUkNDYWxsTWVzc2FnZVR5cGUnO1xuaW1wb3J0IHsgSUh1bmd1cE1zZ0NvbnRlbnQsIElJbnZpdGVNc2dDb250ZW50LCBJTWVkaWFNb2RpZnlNc2dDb250ZW50IH0gZnJvbSAnLi9pbnRlcmZhY2VzL0lNZXNzYWdlSGFuZGxlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU9mZmxpbmVSZWNvcmQge1xuICBjaGFubmVsSWQ6IHN0cmluZyxcbiAgY29udmVyc2F0aW9uVHlwZTogQ29udmVyc2F0aW9uVHlwZSxcbiAgdGFyZ2V0SWQ6IHN0cmluZyxcbiAgbWVkaWFUeXBlOiBSQ0NhbGxNZWRpYVR5cGUsXG4gIGNhbGxJZDogc3RyaW5nLFxuICBpbnZpdGVySWQ6IHN0cmluZyxcbiAgZW5kUmVhc29uOiBSQ0NhbGxFbmRSZWFzb24sXG4gIGJlZ2luVGltZXN0YW1wOiBudW1iZXIsXG4gIGVuZFRpbWVzdGFtcDogbnVtYmVyLFxuICBkdXJhdGlvbjogbnVtYmVyXG59XG5cbi8qKlxuICog56a757q/6YCa6K+d6K6w5b2V5ZmoXG4gKi9cbmV4cG9ydCBjbGFzcyBPZmZsaW5lUmVjb3JkZXIge1xuICBwcml2YXRlIF9tZXNzYWdlczogSVJlY2VpdmVkTWVzc2FnZVtdIHwgW10gPSBbXVxuXG4gIHByaXZhdGUgX2NoYW5uZWxJZCE6IHN0cmluZ1xuXG4gIHByaXZhdGUgX2NvbnZlcnNhdGlvblR5cGUhOiBDb252ZXJzYXRpb25UeXBlXG5cbiAgcHJpdmF0ZSBfdGFyZ2V0SWQhOiBzdHJpbmdcblxuICBwcml2YXRlIF9tZWRpYVR5cGUhOiBSQ0NhbGxNZWRpYVR5cGVcblxuICBwcml2YXRlIF9jYWxsSWQhOiBzdHJpbmdcblxuICBwcml2YXRlIF9jYWxsZXJJZCE6IHN0cmluZ1xuXG4gIHByaXZhdGUgX2ludml0ZXJJZCE6IHN0cmluZ1xuXG4gIHByaXZhdGUgX2VuZFJlYXNvbiE6IFJDQ2FsbEVuZFJlYXNvblxuXG4gIHByaXZhdGUgX2JlZ2luVGltZXN0YW1wOiBudW1iZXIgPSAwXG5cbiAgcHJpdmF0ZSBfZW5kVGltZXN0YW1wOiBudW1iZXIgPSAwXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29udGV4dDogUlRDUGx1Z2luQ29udGV4dCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IElMb2dnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfb25SZWNvcmQ6IChyZWNvcmQ6IElPZmZsaW5lUmVjb3JkKSA9PiB2b2lkLFxuICApIHtcblxuICB9XG5cbiAgLyoqXG4gICAqIOWIsCBpbnZpdGUgfCBtZW1iZXJNb2RpZnkg57uT5p2fXG4gICAqIOWOn+WboOagueaNruW3seaWueaYr+WQpuS4uuS4u+WPq++8jOS4u+WPq+S4uui/nOerr+acquaOpeWQrCDooqvlj6vooqvlt7Hnq6/mnKrmjqXlkKxcbiAgICovXG4gIHByaXZhdGUgX2RvSW52aXRlKG1lc3NhZ2U6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICBjb25zdCB7XG4gICAgICBjaGFubmVsSWQsIGNvbnZlcnNhdGlvblR5cGUsIHRhcmdldElkLCBzZW5kZXJVc2VySWQsIGNvbnRlbnQsXG4gICAgfSA9IG1lc3NhZ2U7XG4gICAgY29uc3QgeyBjYWxsSWQsIG1lZGlhVHlwZSB9ID0gY29udGVudCBhcyBJSW52aXRlTXNnQ29udGVudDtcbiAgICB0aGlzLl9jaGFubmVsSWQgPSBjaGFubmVsSWQhO1xuICAgIHRoaXMuX2NvbnZlcnNhdGlvblR5cGUgPSBjb252ZXJzYXRpb25UeXBlO1xuICAgIHRoaXMuX3RhcmdldElkID0gdGFyZ2V0SWQ7XG4gICAgdGhpcy5fY2FsbElkID0gY2FsbElkO1xuICAgIHRoaXMuX21lZGlhVHlwZSA9IG1lZGlhVHlwZTtcbiAgICBjb25zdCBpc0NhbGxlciA9IHNlbmRlclVzZXJJZCA9PT0gY3VycmVudFVzZXJJZDtcbiAgICB0aGlzLl9pbnZpdGVySWQgPSBzZW5kZXJVc2VySWQ7XG4gICAgdGhpcy5fZW5kUmVhc29uID0gaXNDYWxsZXIgPyBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05PX1JFU1BPTlNFIDogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9OT19SRVNQT05TRTtcbiAgICB0aGlzLl9jYW5HZW5SZWNvcmQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliLAgaW52aXRlIHwgbWVtYmVyTW9kaWZ5IOe7k+adn1xuICAgKiDljp/lm6DmoLnmja7lt7HmlrnmmK/lkKbkuLrkuLvlj6vvvIzkuLvlj6vkuLrov5znq6/mnKrmjqXlkKwg6KKr5Y+r6KKr5bex56uv5pyq5o6l5ZCsXG4gICAqL1xuICBwcml2YXRlIF9kb01lbWJlck1vZGlmeShtZXNzYWdlOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgdGhpcy5fZG9JbnZpdGUobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICog55SoIGludml0ZSB8IG1lbWJlck1vZGlmeSDorqHnrpfnmoTnprvnur/orrDlvZVcbiAgICovXG4gIHByaXZhdGUgX2RvUmluZ2luZyhtZXNzYWdlOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgdGhpcy5fY2FuR2VuUmVjb3JkKCk7XG4gIH1cblxuICAvKipcbiAgICog5YiwIGFjY2VwdCDor7TmmI7pgJror53lt7Llu7rnq4tcbiAgICog5Y6f5Zug6buY6K6k5bex5pa55q2j5bi45oyC5patXG4gICAqL1xuICBwcml2YXRlIF9kb0FjY2VwdChtZXNzYWdlOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgdGhpcy5fZW5kUmVhc29uID0gUkNDYWxsRW5kUmVhc29uLkhBTkdVUDtcbiAgICB0aGlzLl9iZWdpblRpbWVzdGFtcCA9IG1lc3NhZ2Uuc2VudFRpbWU7XG4gICAgdGhpcy5fY2FuR2VuUmVjb3JkKCk7XG4gIH1cblxuICAvKipcbiAgICog5YiwIGh1bmd1cCDor7TmmI7kuLrmraPluLjmjILmlq1cbiAgICog5Y6f5Zug5Y+W5raI5oGv5L2T6YeM5oyC5pat5Y6f5ZugXG4gICAqL1xuICBwcml2YXRlIF9kb0h1bmd1cChtZXNzYWdlOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgY29uc3QgeyBjb250ZW50LCBzZW50VGltZSwgc2VuZGVyVXNlcklkIH0gPSBtZXNzYWdlO1xuICAgIGNvbnN0IHsgcmVhc29uIH0gPSBjb250ZW50IGFzIElIdW5ndXBNc2dDb250ZW50O1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGNvbnN0IGlzU2VsZlNlbmQgPSBzZW5kZXJVc2VySWQgPT09IGN1cnJlbnRVc2VySWQ7XG4gICAgdGhpcy5fZW5kUmVhc29uID0gaXNTZWxmU2VuZCA/IHJlYXNvbiA6IENhbGxSZW1vdGVFbmRSZWFzb25bcmVhc29uXTtcbiAgICB0aGlzLl9lbmRUaW1lc3RhbXAgPSBzZW50VGltZTtcblxuICAgIHRoaXMuX2NhbkdlblJlY29yZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWPquS/ruaUuemAmuivneexu+Wei1xuICAgKi9cbiAgcHJpdmF0ZSBfZG9NZWRpYU1vZGlmeShtZXNzYWdlOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgY29uc3QgeyBjb250ZW50IH0gPSBtZXNzYWdlO1xuICAgIGNvbnN0IHsgbWVkaWFUeXBlIH0gPSBjb250ZW50IGFzIElNZWRpYU1vZGlmeU1zZ0NvbnRlbnQ7XG4gICAgdGhpcy5fbWVkaWFUeXBlID0gbWVkaWFUeXBlO1xuICAgIHRoaXMuX2NhbkdlblJlY29yZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2FuR2VuUmVjb3JkKCkge1xuICAgIGlmICh0aGlzLl9tZXNzYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGxldCBkdXJhdGlvbiA9IDA7XG4gICAgICBjb25zdCBpc05lZWREdXJhdGlvblJlYXNvbiA9IFtcbiAgICAgICAgUkNDYWxsRW5kUmVhc29uLkhBTkdVUCxcbiAgICAgICAgUkNDYWxsRW5kUmVhc29uLlJFTU9URV9IQU5HVVAsXG4gICAgICAgIFJDQ2FsbEVuZFJlYXNvbi5PVEhFUl9DTElFTlRfSk9JTkVEX0NBTEwsXG4gICAgICAgIFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfT1RIRVJfQ0xJRU5UX0pPSU5FRF9DQUxMLFxuICAgICAgICBSQ0NhbGxFbmRSZWFzb24uS0lDS0VEX0JZX1NFUlZFUixcbiAgICAgICAgUkNDYWxsRW5kUmVhc29uLlJFTU9URV9LSUNLRURfQllfU0VSVkVSLFxuICAgICAgICBSQ0NhbGxFbmRSZWFzb24uQUNDRVBUX1NZU1RFTV9DQUxMLFxuICAgICAgICBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX0FDQ0VQVF9TWVNURU1fQ0FMTCxcbiAgICAgIF0uaW5jbHVkZXModGhpcy5fZW5kUmVhc29uKTtcbiAgICAgIGlmIChpc05lZWREdXJhdGlvblJlYXNvbikge1xuICAgICAgICBkdXJhdGlvbiA9IHRoaXMuX2VuZFRpbWVzdGFtcCAtIHRoaXMuX2JlZ2luVGltZXN0YW1wO1xuICAgICAgfVxuICAgICAgdGhpcy5fb25SZWNvcmQoe1xuICAgICAgICBjaGFubmVsSWQ6IHRoaXMuX2NoYW5uZWxJZCxcbiAgICAgICAgY29udmVyc2F0aW9uVHlwZTogdGhpcy5fY29udmVyc2F0aW9uVHlwZSxcbiAgICAgICAgdGFyZ2V0SWQ6IHRoaXMuX3RhcmdldElkLFxuICAgICAgICBjYWxsSWQ6IHRoaXMuX2NhbGxJZCxcbiAgICAgICAgaW52aXRlcklkOiB0aGlzLl9pbnZpdGVySWQsXG4gICAgICAgIG1lZGlhVHlwZTogdGhpcy5fbWVkaWFUeXBlLFxuICAgICAgICBlbmRSZWFzb246IHRoaXMuX2VuZFJlYXNvbixcbiAgICAgICAgYmVnaW5UaW1lc3RhbXA6IHRoaXMuX2JlZ2luVGltZXN0YW1wLFxuICAgICAgICBlbmRUaW1lc3RhbXA6IHRoaXMuX2VuZFRpbWVzdGFtcCxcbiAgICAgICAgZHVyYXRpb24sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBvblJlY3ZPZmZsaW5lTXNncyhtZXNzYWdlczogSVJlY2VpdmVkTWVzc2FnZVtdKSB7XG4gICAgdGhpcy5fbWVzc2FnZXMgPSBtZXNzYWdlcztcbiAgICBkbyB7XG4gICAgICBjb25zdCBtc2cgPSB0aGlzLl9tZXNzYWdlcy5zaGlmdCgpITtcbiAgICAgIGNvbnN0IHsgbWVzc2FnZVR5cGUsIGNvbnRlbnQ6IHsgY2FsbElkIH0gfSA9IG1zZztcbiAgICAgIHN3aXRjaCAobWVzc2FnZVR5cGUpIHtcbiAgICAgICAgY2FzZSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0ludml0ZTpcbiAgICAgICAgICB0aGlzLl9kb0ludml0ZShtc2cpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDUmluZ2luZzpcbiAgICAgICAgICB0aGlzLl9kb1JpbmdpbmcobXNnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0FjY2VwdDpcbiAgICAgICAgICB0aGlzLl9kb0FjY2VwdChtc2cpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDTW9kaWZ5TWVtOlxuICAgICAgICAgIHRoaXMuX2RvTWVtYmVyTW9kaWZ5KG1zZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUkNDYWxsTWVzc2FnZVR5cGUuVkNNb2RpZnlNZWRpYTpcbiAgICAgICAgICB0aGlzLl9kb01lZGlhTW9kaWZ5KG1zZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUkNDYWxsTWVzc2FnZVR5cGUuVkNIYW5ndXA6XG4gICAgICAgICAgdGhpcy5fZG9IdW5ndXAobXNnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW09mZmxpbmVSZWNvcmRlcl0gb25SZWN2T2ZmbGluZU1zZ3MgLT4gdW5leHBlY3RlZCBtZXNzYWdlOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSB3aGlsZSAodGhpcy5fbWVzc2FnZXMubGVuZ3RoID4gMCk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIENvbnZlcnNhdGlvblR5cGUsIEVycm9yQ29kZSwgRXZlbnRFbWl0dGVyLCBJTG9nZ2VyLCBJUmVjZWl2ZWRNZXNzYWdlLCBJUnVudGltZSwgUlRDUGx1Z2luQ29udGV4dCxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgTWVtYmVyTW9kaWZ5VHlwZSB9IGZyb20gJy4vZW51bXMvTWVtYmVyTW9kaWZ5VHlwZSc7XG5pbXBvcnQgeyBSQ0NhbGxFcnJvckNvZGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbENvZGUnO1xuaW1wb3J0IHsgUkNDYWxsTWVkaWFUeXBlIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxNZWRpYVR5cGUnO1xuaW1wb3J0IHsgUkNDYWxsTWVzc2FnZVR5cGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbE1lc3NhZ2VUeXBlJztcbmltcG9ydCB7IElVc2VyUHJvZmlsZSB9IGZyb20gJy4vaW50ZXJmYWNlcy9JU3RhdGVNYWNoaW5lJztcbmltcG9ydCB7XG4gIElBY2NlcHRNc2dDb250ZW50LCBJQWNjZXB0TXNnT3B0aW9ucywgSUNhbGxNc2dPcHRpb24sIElIdW5ndXBNc2dDb250ZW50LCBJSHVuZ3VwTXNnT3B0aW9ucywgSUludml0ZU1zZ0NvbnRlbnQsIElJbnZpdGVNc2dPcHRpb25zLCBJTWVkaWFNb2RpZnlNc2dDb250ZW50LCBJTWVkaWFNb2RpZnlNc2dPcHRpb25zLCBJTWVtYmVyTW9kaWZ5TXNnQ29udGVudCwgSU1lbWJlck1vZGlmeU1zZ09wdGlvbnMsIElNc2dMaXN0ZW5lciwgSVJpbmdpbmdNc2dDb250ZW50LCBJUmluZ2luZ01zZ09wdGlvbnMsIElTZW5kQmFzZU9wdGlvbnMsXG59IGZyb20gJy4vaW50ZXJmYWNlcy9JTWVzc2FnZUhhbmRsZXInO1xuaW1wb3J0IHsgTG9jYWwgfSBmcm9tICcuL2xvY2FsZSc7XG5pbXBvcnQgeyBQbGF0Zm9ybSB9IGZyb20gJy4vZW51bXMvUGxhdGZvcm0nO1xuaW1wb3J0IHsgZ2V0Q2FsbERldmljZUlkIH0gZnJvbSAnLi4vaGVscGVyJztcbmltcG9ydCB7IElPZmZsaW5lUmVjb3JkLCBPZmZsaW5lUmVjb3JkZXIgfSBmcm9tICcuL09mZmxpbmVSZWNvcmRlcic7XG5pbXBvcnQgeyBSQ0NhbGxTdGF0ZU1hY2hpbmUgfSBmcm9tICcuLic7XG5cbmNvbnN0IGNhbGxNc2dUeXBlcyA9IFsnUkM6VkNBY2NlcHQnLCAnUkM6VkNSaW5naW5nJywgJ1JDOlZDU3VtbWFyeScsICdSQzpWQ0hhbmd1cCcsICdSQzpWQ0ludml0ZScsICdSQzpWQ01vZGlmeU1lZGlhJywgJ1JDOlZDTW9kaWZ5TWVtJ107XG5cbnR5cGUgTXNnTGlzdGVuZXJLZXlzID0ga2V5b2YgSU1zZ0xpc3RlbmVyXG5cbmludGVyZmFjZSBJTXNnQnVmZmVySXRlbSB7XG4gIG1hcmtUaW1lOiBudW1iZXIsXG4gIG1zZzogSVJlY2VpdmVkTWVzc2FnZVxufVxuXG5jb25zdCBFbmdpbmVFcnJvckNvZGVUb0NhbGxFcnJvckNvZGU6IHsgW2tleTogbnVtYmVyXTogUkNDYWxsRXJyb3JDb2RlIH0gPSB7XG4gIFtFcnJvckNvZGUuUkVKRUNURURfQllfQkxBQ0tMSVNUXTogUkNDYWxsRXJyb3JDb2RlLlJFSkVDVEVEX0JZX0JMQUNLTElTVCxcbiAgW0Vycm9yQ29kZS5OT1RfSU5fR1JPVVBdOiBSQ0NhbGxFcnJvckNvZGUuTk9UX0lOX0dST1VQLFxufTtcblxuLyoqXG4gKiDmtojmga/mjqXmlLblpITnkIY6IOWcqOe6v+a2iOaBr+OAgeemu+e6v+a2iOaBr1xuICog5Y+R6YCB5raI5oGv5aSE55CGOiDlj5HpgIHkuI3lkIznsbvlnovmtojmga/lsIHoo4VcbiAqL1xuZXhwb3J0IGNsYXNzIENhbGxNZXNzYWdlSGFuZGxlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIHByaXZhdGUgX3dhdGNoZXJzOiBJTXNnTGlzdGVuZXIgPSB7fVxuXG4gIHByaXZhdGUgX3VzZXJJbmZvOiBJVXNlclByb2ZpbGUgPSB7fVxuXG4gIHByaXZhdGUgX21zZ0J1ZmZlckxpc3Q6IElNc2dCdWZmZXJJdGVtW10gPSBbXVxuXG4gIHByaXZhdGUgX2hhZEhhbmRsZU1zZ1RpbWVyOiBib29sZWFuID0gZmFsc2VcblxuICBwcml2YXRlIF9vZmZsaW5lUmVjb3JkZXIhOiBPZmZsaW5lUmVjb3JkZXJcblxuICBwcml2YXRlIF9kZXZpY2VJZDogc3RyaW5nID0gJydcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb250ZXh0OiBSVENQbHVnaW5Db250ZXh0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3J1bnRpbWU6IElSdW50aW1lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogSUxvZ2dlcixcbiAgICAvKipcbiAgICAgKiDnprvnur/mtojmga/lpITnkIbml7bpl7Tpl7TpmpRcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vZmZsaW5lTXNnSXR2OiBudW1iZXIgPSA2MCAqIDEwMDAsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZ2V0U3RhdGVNYWNoaW5lOiAoY2FsbElkOiBzdHJpbmcpID0+IFJDQ2FsbFN0YXRlTWFjaGluZSB8IG51bGwsXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgLy8gZGV2aWNlSWRcbiAgICB0aGlzLl9kZXZpY2VJZCA9IGdldENhbGxEZXZpY2VJZChfcnVudGltZSk7XG4gICAgLy8g5aSE55CG5raI5oGv5pS25Y+RXG4gICAgdGhpcy5fY29udGV4dC5vbm1lc3NhZ2UgPSB0aGlzLl9vbk1lc3NhZ2UuYmluZCh0aGlzKTtcbiAgICAvLyDlpITnkIbnprvnur/mtojmga/orrDlvZVcbiAgICB0aGlzLl9vZmZsaW5lUmVjb3JkZXIgPSBuZXcgT2ZmbGluZVJlY29yZGVyKHRoaXMuX2NvbnRleHQsIHRoaXMuX2xvZ2dlciwgKHJlY29yZDogSU9mZmxpbmVSZWNvcmQpID0+IHtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtDYWxsTWVzc2FnZUhhbmRsZXJdIG9mZmxpbmVSZWNvcmRlciAtPiAke0pTT04uc3RyaW5naWZ5KHJlY29yZCl9YCk7XG4gICAgICB0aGlzLl93YXRjaGVycy5vbk9mZmxpbmVSZWNvcmQgJiYgdGhpcy5fd2F0Y2hlcnMub25PZmZsaW5lUmVjb3JkKHJlY29yZCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9vbk1lc3NhZ2UobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIGNvbnN0IGlzQ2FsbE1zZyA9IGNhbGxNc2dUeXBlcy5pbmNsdWRlcyhtZXNzYWdlLm1lc3NhZ2VUeXBlKTtcbiAgICBpZiAoaXNDYWxsTXNnKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW0NhbGxNZXNzYWdlSGFuZGxlcl0gX29uTWVzc2FnZSAtPiBjYWxsIG1lc3NhZ2U6ICR7SlNPTi5zdHJpbmdpZnkobWVzc2FnZSl9YCk7XG4gICAgICAvLyDpgJrov4fpgY3ljoYgYnVmZmVyTGlzdCDmn6Xmib7opoHmj5LlhaXnmoToioLngrlcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG1hcmtUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3QgeyBzZW50VGltZTogY3VycmVudE1zZ1NlbnRUaW1lIH0gPSBtZXNzYWdlO1xuICAgICAgICBsZXQgaW5zZXJ0SW5kZXggPSAwO1xuICAgICAgICAvLyDpnIDpgY3ljobmlbDnu4Tlhajpg6jpobnvvIzmlYXkvb/nlKggZm9yRWFjaCwgZmluZEluZGV4IOaJvuWIsOesrOS4gOS4quespuWQiOadoeS7tueahOWwseS8mue7iOatolxuICAgICAgICB0aGlzLl9tc2dCdWZmZXJMaXN0LmZvckVhY2goKHsgbXNnOiB7IHNlbnRUaW1lIH0gfSwgaW5kZXgpID0+IHtcbiAgICAgICAgICBpZiAoY3VycmVudE1zZ1NlbnRUaW1lID49IHNlbnRUaW1lKSB7XG4gICAgICAgICAgICAvLyBpbnNlcnRJbmRleCDpnIDkuLrlvZPliY3nrKblkIjmnaHku7blhYPntKDnmoTlkI7kuIDkvY3vvIzmlYUgKzFcbiAgICAgICAgICAgIGluc2VydEluZGV4ID0gaW5kZXggKyAxO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX21zZ0J1ZmZlckxpc3Quc3BsaWNlKGluc2VydEluZGV4LCAwLCB7XG4gICAgICAgICAgbWFya1RpbWUsXG4gICAgICAgICAgbXNnOiBtZXNzYWdlLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ18nLCBgb25NZXNzYWdlIC0+IG1zZ0J1ZmZlckxpc3Q6ICR7dGhpcy5fbXNnQnVmZmVyTGlzdC5sZW5ndGh9YCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW0NhbGxNZXNzYWdlSGFuZGxlcl0gc3BsaWNlIGJ1ZmZlciBtc2cgZXJyb3IgLT4gJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgICAvLyDlkK/liqjmtojmga/lpITnkIZcbiAgICAgIHRoaXMuX2hhbmRsZUJ1ZmZlck1zZ3MoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICog5Zyo57q/5raI5oGv5oqb57uZ54q25oCB5py65aSE55CGXG4gICAqL1xuICBwcml2YXRlIF9vblJlY3ZPbmxpbmVDYWxsTXNnKG1lc3NhZ2U6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBvbk1lc3NhZ2UgLT4gX29uUmVjdk9ubGluZUNhbGxNc2c6ICR7bWVzc2FnZS5tZXNzYWdlVHlwZX1gKTtcbiAgICBjb25zdCB7IGNvbnRlbnQ6IHsgY2FsbElkIH0gfSA9IG1lc3NhZ2U7XG4gICAgLy8g5Zyo57q/5raI5oGv55u05o6l5oqb5Ye6XG4gICAgc3dpdGNoIChtZXNzYWdlLm1lc3NhZ2VUeXBlKSB7XG4gICAgICBjYXNlIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDSW52aXRlOlxuICAgICAgICB0aGlzLl93YXRjaGVycy5vbkludml0ZSAmJiB0aGlzLl93YXRjaGVycy5vbkludml0ZShtZXNzYWdlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDUmluZ2luZzpcbiAgICAgICAgc3VwZXIuZW1pdChgJHtjYWxsSWR9b25SaW5naW5nYCwgbWVzc2FnZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0FjY2VwdDpcbiAgICAgICAgc3VwZXIuZW1pdChgJHtjYWxsSWR9b25BY2NlcHRgLCBtZXNzYWdlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDTW9kaWZ5TWVtOlxuICAgICAgICAvLyDmlLbliLDkurrlkZjlj5jmm7Tmipvlh7ogb25JbnZpdGUg55Sf5oiQ54q25oCB5py65a6e5L6LXG4gICAgICAgIHRoaXMuX3dhdGNoZXJzLm9uSW52aXRlICYmIHRoaXMuX3dhdGNoZXJzLm9uSW52aXRlKG1lc3NhZ2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUkNDYWxsTWVzc2FnZVR5cGUuVkNNb2RpZnlNZWRpYTpcbiAgICAgICAgc3VwZXIuZW1pdChgJHtjYWxsSWR9b25NZWRpYU1vZGlmeWAsIG1lc3NhZ2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUkNDYWxsTWVzc2FnZVR5cGUuVkNIYW5ndXA6XG4gICAgICAgIHN1cGVyLmVtaXQoYCR7Y2FsbElkfW9uSHVuZ3VwYCwgbWVzc2FnZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ18nLCBgW0NhbGxNZXNzYWdlSGFuZGxlcl0gb25SZWN2T25saW5lQ2FsbE1zZyAtPiB1bmV4cGVjdGVkIG1lc3NhZ2U6ICR7SlNPTi5zdHJpbmdpZnkobWVzc2FnZSl9YCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmtojmga8gYnVmZmVyIOWIl+ihqOWkhOeQhumAu+i+kVxuICAgKiAx44CB5q+PIDIwbXMg5qOA5p+l5LiA5qyhIGJ1ZmZlciBsaXN0XG4gICAqIDLjgIHlj5blh7rlt7Lnu4/lu7bov58gMjAwIOeahOa2iOaBr+WIl+ihqOi/m+ihjOa2iOi0uSB8IOaXoOW7tui/nyAyMDBtcyDlhoXmtojmga/nm7TmjqXpgJLlvZJcbiAgICogM+OAgea2iOi0ueWIhuS4uiDnprvnur/mtojmga/mtojotLnpgLvovpHjgIHlnKjnur/mtojmga/mtojotLnpgLvovpHvvIzmtojotLnlkI7pgJLlvZJcbiAgKi9cbiAgcHJpdmF0ZSBfaGFuZGxlQnVmZmVyTXNncygpIHtcbiAgICAvLyDmtojmga8gYnVmZmVyIOWIl+ihqOmVv+W6puS4uiAwIOaXtuWKoOmUgVxuICAgIGlmICh0aGlzLl9tc2dCdWZmZXJMaXN0Lmxlbmd0aCA9PT0gMCB8fCB0aGlzLl9oYWRIYW5kbGVNc2dUaW1lcikge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ18nLCAnX2hhbmRsZUJ1ZmZlck1zZ3MgcmV0dXJuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIOmcgOimgeWKoOmUge+8jOaUtuWIsOWkmuasoea2iOaBr+WQju+8jOWPr+iDveS8mui1t+WkmuS4qiB0aW1lclxuICAgIHRoaXMuX2hhZEhhbmRsZU1zZ1RpbWVyID0gdHJ1ZTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIC8vIOWPluWHuuWkp+S6jiAyMDAgbXMg5raI5oGv5YiX6KGoXG4gICAgICBjb25zdCBjdXJyZW50VGltZSA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCBidWZmZXJzID0gdGhpcy5fbXNnQnVmZmVyTGlzdC5maWx0ZXIoKGl0ZW0pID0+IGN1cnJlbnRUaW1lIC0gaXRlbS5tYXJrVGltZSA+PSAyMDApO1xuICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYFtDYWxsTWVzc2FnZUhhbmRsZXJdIGhhbmRsZUJ1ZmZlck1zZ3MgLT4gbGlzdHMgb3ZlciAyMDBtcyA6ICR7SlNPTi5zdHJpbmdpZnkoYnVmZmVycy5tYXAoKHsgbXNnOiB7IG1lc3NhZ2VVSWQsIGlzT2ZmTGluZU1lc3NhZ2UsIGNvbnRlbnQ6IHsgY2FsbElkIH0gfSB9KSA9PiAoeyBtZXNzYWdlVUlkLCBpc09mZkxpbmVNZXNzYWdlLCBjYWxsSWQgfSkpKX1gKTtcbiAgICAgIGlmIChidWZmZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyDmsqHmnInlu7bov58gMjAwbXMg55qE5raI5oGv77yM5raI6LS56YC76L6R6Kej6ZSB5bm26YCS5b2S5omn6KGMXG4gICAgICAgIHRoaXMuX2hhZEhhbmRsZU1zZ1RpbWVyID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2hhbmRsZUJ1ZmZlck1zZ3MoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoYnVmZmVyc1swXS5tc2cuaXNPZmZMaW5lTWVzc2FnZSkge1xuICAgICAgICAvLyDlvZPnrKzkuIDmnaHmtojmga/kuLrnprvnur/mtojmga/ml7bvvIznm7TmjqXku44gYnVmZmVyIOS4reWPluWHuuaJgOacieemu+e6v+a2iOaBr++8jOi/m+ihjOa2iOaBr1xuICAgICAgICBsZXQgb2ZmbGluZUJ1ZmZlcnMgPSB0aGlzLl9tc2dCdWZmZXJMaXN0LmZpbHRlcigoaXRlbSkgPT4gaXRlbS5tc2cuaXNPZmZMaW5lTWVzc2FnZSk7XG5cbiAgICAgICAgLy8g56a757q/5raI5oGv5aSE55CG6YC76L6RXG4gICAgICAgIGRvIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBjb252ZXJzYXRpb25UeXBlLCBtZXNzYWdlVHlwZSwgc2VudFRpbWUsIHNlbmRlclVzZXJJZCwgY29udGVudDogeyBjYWxsSWQ6IGludml0ZUNhbGxJZCwgaW52aXRlVXNlcklkcyB9LFxuICAgICAgICAgIH0gPSBvZmZsaW5lQnVmZmVyc1swXS5tc2c7XG5cbiAgICAgICAgICBjb25zdCBpc0ludml0ZU1zZ1R5cGUgPSBbUkNDYWxsTWVzc2FnZVR5cGUuVkNJbnZpdGUsIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDTW9kaWZ5TWVtXS5pbmNsdWRlcyhtZXNzYWdlVHlwZSBhcyBSQ0NhbGxNZXNzYWdlVHlwZSk7XG4gICAgICAgICAgY29uc3QgaXNMZXNzVGhhbk9mZmxpbmVNc2dJdHYgPSBEYXRlLm5vdygpIC0gc2VudFRpbWUgPCB0aGlzLl9vZmZsaW5lTXNnSXR2O1xuXG4gICAgICAgICAgaWYgKGlzSW52aXRlTXNnVHlwZSkgeyAvLyDlj5blh7rnmoTnrKzkuIDmnaHmtojmga/kuLogaW52aXRlIHwgbWVtTW9kaWZ5XG4gICAgICAgICAgICAvLyDlj5blh7rnm7jlkIwgQ2FsbElkIOa2iOaBr+WIl+ihqFxuICAgICAgICAgICAgY29uc3QgdGFza01zZ0xpc3Q6IElSZWNlaXZlZE1lc3NhZ2VbXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvZmZsaW5lQnVmZmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBjb25zdCBpdGVtID0gb2ZmbGluZUJ1ZmZlcnNbaV0ubXNnO1xuICAgICAgICAgICAgICBjb25zdCB7IGNvbnRlbnQ6IHsgY2FsbElkOiBvdGhlckNhbGxJZCB9IH0gPSBpdGVtO1xuICAgICAgICAgICAgICBpZiAoaW52aXRlQ2FsbElkID09PSBvdGhlckNhbGxJZCkge1xuICAgICAgICAgICAgICAgIHRhc2tNc2dMaXN0LnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdfJywgYHRhc2tNc2dMaXN0IGxlbmd0aDogJHt0YXNrTXNnTGlzdC5sZW5ndGh9YCk7XG5cbiAgICAgICAgICAgIGlmICh0YXNrTXNnTGlzdC5sZW5ndGggPiAwKSB7IC8vIOmYsuatoiB0YXNrTXNnTGlzdCDkuLogMFxuICAgICAgICAgICAgICAvLyDmib7lh7ogbXNnQnVmZmVyTGlzdCDkuK3lt7LmtojotLnnmoTmtojmga/mnIDlpKcgaW5kZXhcbiAgICAgICAgICAgICAgY29uc3QgZGVsSW5kZXggPSB0aGlzLl9tc2dCdWZmZXJMaXN0LmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbS5tc2cubWVzc2FnZVVJZCA9PT0gdGFza01zZ0xpc3RbdGFza01zZ0xpc3QubGVuZ3RoIC0gMV0ubWVzc2FnZVVJZCk7XG4gICAgICAgICAgICAgIC8vIOWIoOmZpOa2iOi0uei/hyBtc2dCdWZmZXJMaXN0IOeahOa2iOaBr1xuICAgICAgICAgICAgICB0aGlzLl9tc2dCdWZmZXJMaXN0ID0gdGhpcy5fbXNnQnVmZmVyTGlzdC5zbGljZShkZWxJbmRleCArIDEpO1xuXG4gICAgICAgICAgICAgIC8vIOaJvuWHuiBvZmZsaW5lTXNncyDkuK3lt7LmtojotLnnmoTmtojmga/mnIDlpKcgaW5kZXhcbiAgICAgICAgICAgICAgY29uc3QgZGVsT2ZmbGluZUluZGV4ID0gb2ZmbGluZUJ1ZmZlcnMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLm1zZy5tZXNzYWdlVUlkID09PSB0YXNrTXNnTGlzdFt0YXNrTXNnTGlzdC5sZW5ndGggLSAxXS5tZXNzYWdlVUlkKTtcbiAgICAgICAgICAgICAgLy8g5Yig6Zmk5raI6LS56L+HIG9mZmxpbmVCdWZmZXJzIOeahOa2iOaBr1xuICAgICAgICAgICAgICBvZmZsaW5lQnVmZmVycyA9IG9mZmxpbmVCdWZmZXJzLnNsaWNlKGRlbE9mZmxpbmVJbmRleCArIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiDljZXogYrmnKrnu5PmnZ/pgJror53liKTmlq1cbiAgICAgICAgICAgICAqIOWmguaenOa2iOaBr+WcqCA2MHMg5YaF77yM5Yik5pat5piv5ZCm5pyq5oiQ5a+577yI5Y+q5pyJIGludml0ZSDmiJblj6rmnIkgaW52aXRlIOaIliByaW5naW5nIOaIkOWvueaKm+e7mSDnprvnur/orrDlvZXlmajvvIzmnKrmiJDlr7nmipvnu5nnirbmgIHmnLpcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgY29uc3QgaXNVbmZpbmlzaGVkUHJpdmF0ZUNhbGw6IGJvb2xlYW4gPSAoKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoY29udmVyc2F0aW9uVHlwZSAhPT0gQ29udmVyc2F0aW9uVHlwZS5QUklWQVRFKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIGNvbnN0IGlzT25seUludml0ZSA9IHRhc2tNc2dMaXN0Lmxlbmd0aCA9PT0gMTtcbiAgICAgICAgICAgICAgY29uc3QgaGFzSW52aXRlQW5kUmluZ2luZyA9IHRhc2tNc2dMaXN0LmV2ZXJ5KChpdGVtKSA9PiBbUkNDYWxsTWVzc2FnZVR5cGUuVkNJbnZpdGUsIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDTW9kaWZ5TWVkaWEsIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDUmluZ2luZ10uaW5jbHVkZXMoaXRlbS5tZXNzYWdlVHlwZSBhcyBSQ0NhbGxNZXNzYWdlVHlwZSkpO1xuICAgICAgICAgICAgICByZXR1cm4gaXNPbmx5SW52aXRlIHx8IGhhc0ludml0ZUFuZFJpbmdpbmc7XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiDnvqTogYrmnKrnu5PmnZ/pgJror53liKTmlq1cbiAgICAgICAgICAgICAqIOmAmui/hyBsaXN0IOS4rSBpbnZpdGUg5ZKMIG1lbWJlck1vZGlmeSDmtojmga/kuK3lj5blh7rmiYDmnInlj4LkuI7pgJror53nmoQgdXNlcklkXG4gICAgICAgICAgICAgKiDpgY3ljoYgbGlzdCDmib7lh7rmiYDmnIkgaGFuZ3VwIOeahCBzZW5kVXNlcklkXG4gICAgICAgICAgICAgKiAgICAg5oC75Lq65pWwIC0g5oyC5pat5Lq65pWwID4gMSAg5LiU5Ymp5L2Z5Lq65pWw5YyF5ZCr6Ieq5bex77yM6K6k5Li66YCa6K+d5pyq5oyC5pat6L+b54q25oCB5py6XG4gICAgICAgICAgICAgKiAgICAg5oC75Lq65pWwIC0g5oyC5pat5Lq65pWwIDw9IDEg6YCa6K+d5oyC5pat77yM6L+b56a757q/5raI5oGv5aSE55CG5ZmoXG4gICAgICAgICAgICAgKiAgICAg5Li75Y+r55u05o6l5oyC5pat5LiU5YW25LuW5Lq65pyq5o6l5ZCs55u05o6l6L+b56a757q/5aSE55CG5ZmoXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGNvbnN0IGlzVW5maW5pc2hlZEdycENhbGw6IGJvb2xlYW4gPSAoKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoY29udmVyc2F0aW9uVHlwZSAhPT0gQ29udmVyc2F0aW9uVHlwZS5HUk9VUCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICBsZXQgaXNVbmZpbmlzaGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgIGxldCBub09uZUFjY2VwdCA9IHRydWU7XG4gICAgICAgICAgICAgIGxldCBhbGxVc2VySWRzID0gW3NlbmRlclVzZXJJZCwgLi4uaW52aXRlVXNlcklkc107XG4gICAgICAgICAgICAgIGxldCBpc0NhbGxlckh1bmd1cCA9IGZhbHNlO1xuICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhc2tNc2dMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBzZW5kZXJVc2VySWQ6IHRhc2tNc2dTZW5kZXJVc2VySWQsIG1lc3NhZ2VUeXBlIH0gPSB0YXNrTXNnTGlzdFtpXTtcbiAgICAgICAgICAgICAgICAvLyDlj6ropoHoh6rlt7HmjILmlq3nm7TmjqXot7Plh7rlvqrnjq/vvIzov5vnprvnur/mtojmga9cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZVR5cGUgPT09IFJDQ2FsbE1lc3NhZ2VUeXBlLlZDSGFuZ3VwICYmIHRhc2tNc2dTZW5kZXJVc2VySWQgPT09IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCkpIHtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyDmib7lh7rmiYDmnInmjILmlq3nmoTkurrlkZjvvIzku6Xlj4rpgJror53lj5HotbfogIXmmK/lkKbmjILmlq1cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZVR5cGUgPT09IFJDQ2FsbE1lc3NhZ2VUeXBlLlZDSGFuZ3VwKSB7XG4gICAgICAgICAgICAgICAgICBpc0NhbGxlckh1bmd1cCA9IHNlbmRlclVzZXJJZCA9PT0gdGFza01zZ1NlbmRlclVzZXJJZDtcbiAgICAgICAgICAgICAgICAgIGFsbFVzZXJJZHMgPSBhbGxVc2VySWRzLmZpbHRlcigoaWQpID0+IHRhc2tNc2dTZW5kZXJVc2VySWQgIT09IGlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8g5Yik5pat5piv5ZCm5peg5Lq65o6l5ZCsXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VUeXBlID09PSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0FjY2VwdCkge1xuICAgICAgICAgICAgICAgICAgbm9PbmVBY2NlcHQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8g5LiN5piv5Li75Y+r5oyC5pat5LiU5peg5Lq65o6l5ZCs77yM5LiU5Ymp5L2Z5Lq65pWw5aSn5LqOIDFcbiAgICAgICAgICAgICAgaWYgKCEobm9PbmVBY2NlcHQgJiYgaXNDYWxsZXJIdW5ndXApICYmIGFsbFVzZXJJZHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIGlzVW5maW5pc2hlZCA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGlzVW5maW5pc2hlZDtcbiAgICAgICAgICAgIH0pKCk7XG5cbiAgICAgICAgICAgIGlmIChpc0xlc3NUaGFuT2ZmbGluZU1zZ0l0diAmJiAoaXNVbmZpbmlzaGVkUHJpdmF0ZUNhbGwgfHwgaXNVbmZpbmlzaGVkR3JwQ2FsbCkpIHtcbiAgICAgICAgICAgICAgdGFza01zZ0xpc3QuZm9yRWFjaCh0aGlzLl9vblJlY3ZPbmxpbmVDYWxsTXNnLCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX29mZmxpbmVSZWNvcmRlci5vblJlY3ZPZmZsaW5lTXNncyh0YXNrTXNnTGlzdCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChpc0xlc3NUaGFuT2ZmbGluZU1zZ0l0diAmJiB0aGlzLl9nZXRTdGF0ZU1hY2hpbmUoaW52aXRlQ2FsbElkKSkge1xuICAgICAgICAgICAgICB0aGlzLl9vblJlY3ZPbmxpbmVDYWxsTXNnKG9mZmxpbmVCdWZmZXJzWzBdLm1zZyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW0NhbGxNZXNzYWdlSGFuZGxlcl0gdW5leGNlcHRlZCBvZmZsaW5lIG1zZyAtPiAke0pTT04uc3RyaW5naWZ5KG9mZmxpbmVCdWZmZXJzWzBdLm1zZyl9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmZsaW5lQnVmZmVycy5zaGlmdCgpO1xuICAgICAgICAgICAgdGhpcy5fbXNnQnVmZmVyTGlzdC5zaGlmdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAob2ZmbGluZUJ1ZmZlcnMubGVuZ3RoID4gMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDlnKjnur/mtojmga/lpITnkIbpgLvovpFcbiAgICAgICAgYnVmZmVycy5mb3JFYWNoKCh7IG1zZyB9KSA9PiB7XG4gICAgICAgICAgdGhpcy5fb25SZWN2T25saW5lQ2FsbE1zZyhtc2chKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIOaJvuWHuiBtc2dCdWZmZXJMaXN0IOS4reW3sua2iOi0ueeahOa2iOaBr+acgOWkpyBpbmRleFxuICAgICAgICBjb25zdCBkZWxDb3VudCA9IGJ1ZmZlcnMubGVuZ3RoO1xuICAgICAgICAvLyDliKDpmaTmtojotLnov4fnmoTmtojmga9cbiAgICAgICAgdGhpcy5fbXNnQnVmZmVyTGlzdC5zcGxpY2UoMCwgZGVsQ291bnQpO1xuICAgICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgdGltZXIgb25saW5lIG1zZyBoYW5kbGUgLT4gZGVsQ291bnQ6ICR7ZGVsQ291bnR9IG1zZ0J1ZmZlckxpc3Q6ICR7dGhpcy5fbXNnQnVmZmVyTGlzdC5sZW5ndGh9YCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9oYWRIYW5kbGVNc2dUaW1lciA9IGZhbHNlO1xuICAgICAgdGhpcy5faGFuZGxlQnVmZmVyTXNncygpO1xuICAgIH0sIDIwKTtcbiAgfVxuXG4gIHJlZ2lzdGVyRXZlbnRMaXN0ZW5lcihsaXN0ZW5lcjogSU1zZ0xpc3RlbmVyKSB7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLl93YXRjaGVycywgbGlzdGVuZXIpO1xuICB9XG5cbiAgcmVnaXN0ZXJTdGF0ZU1hY2hpbmVFdmVudChjYWxsSWQ6IHN0cmluZywgZnVuY05hbWU6IE1zZ0xpc3RlbmVyS2V5cywgZXZlbnQ6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgIGNvbnN0IGV2ZW50VHlwZSA9IGNhbGxJZCArIGZ1bmNOYW1lO1xuICAgIHN1cGVyLm9uKGV2ZW50VHlwZSwgZXZlbnQpO1xuICB9XG5cbiAgdW5yZWdpc3RlclN0YXRlTWFjaGluZUV2ZW50KGNhbGxJZDogc3RyaW5nKSB7XG4gICAgWydvblJpbmdpbmcnLCAnb25BY2NlcHQnLCAnb25IdW5ndXAnLCAnb25NZWRpYU1vZGlmeSddLmZvckVhY2goKGZ1bmNOYW1lKSA9PiB7XG4gICAgICBjb25zdCBldmVudFR5cGUgPSBjYWxsSWQgKyBmdW5jTmFtZTtcbiAgICAgIHN1cGVyLnJlbW92ZUFsbChldmVudFR5cGUpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVnaXN0ZXJVc2VySW5mbyh1c2VySW5mbzogSVVzZXJQcm9maWxlKSB7XG4gICAgdGhpcy5fdXNlckluZm8gPSB1c2VySW5mbztcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5HpgIEgSU0g5raI5oGvXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9zZW5kQ2FsbE1lc3NhZ2Uob3B0aW9uczogSUNhbGxNc2dPcHRpb24pOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLCBtZXNzYWdlPzogSVJlY2VpdmVkTWVzc2FnZSB9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYENhbGxNZXNzYWdlSGFuZGxlcl0gc2VuZENhbGxNZXNhZ2UgLT4gbWVzc2FnZTogJHtKU09OLnN0cmluZ2lmeShvcHRpb25zKX1gKTtcbiAgICBjb25zdCB7XG4gICAgICBjaGFubmVsSWQsIGNvbnZlcnNhdGlvblR5cGUsIHRhcmdldElkLCBjb250ZW50LCBtZXNzYWdlVHlwZSwgZGlyZWN0aW9uYWxVc2VySWRMaXN0LCBwdXNoVGl0bGUsIHB1c2hEYXRhLCBwdXNoQ29udGVudCxcbiAgICB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBzZW5kT3B0cyA9IHtcbiAgICAgIGNoYW5uZWxJZCxcbiAgICAgIG1lc3NhZ2VUeXBlLFxuICAgICAgY29udGVudCxcbiAgICAgIGRpcmVjdGlvbmFsVXNlcklkTGlzdCxcbiAgICB9O1xuICAgIGxldCBwdXNoQ29uZmlnID0ge307XG4gICAgaWYgKFtSQ0NhbGxNZXNzYWdlVHlwZS5WQ0ludml0ZSwgUkNDYWxsTWVzc2FnZVR5cGUuVkNNb2RpZnlNZW0sIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDSGFuZ3VwXS5pbmNsdWRlcyhtZXNzYWdlVHlwZSkpIHtcbiAgICAgIHB1c2hDb25maWcgPSB7XG4gICAgICAgIHB1c2hUaXRsZTogcHVzaFRpdGxlIHx8ICcnLFxuICAgICAgICBwdXNoQ29udGVudDogcHVzaENvbnRlbnQgfHwgJycsXG4gICAgICAgIHB1c2hEYXRhLFxuICAgICAgICBhbmRyb2lkQ29uZmlnOiB7XG4gICAgICAgICAgY2F0ZWdvcnlIVzogJ1ZPSVAnLFxuICAgICAgICAgIGNhdGVnb3J5Vml2bzogJ0lNJyxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBPYmplY3QuYXNzaWduKHNlbmRPcHRzLCB7IHB1c2hDb25maWcgfSk7XG4gICAgfVxuICAgIGNvbnN0IHsgY29kZSwgZGF0YTogbWVzc2FnZSB9ID0gYXdhaXQgdGhpcy5fY29udGV4dC5zZW5kTWVzc2FnZShjb252ZXJzYXRpb25UeXBlLCB0YXJnZXRJZCwgc2VuZE9wdHMpO1xuICAgIGlmIChjb2RlICE9PSBFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYENhbGxNZXNzYWdlSGFuZGxlcl0gc2VuZENhbGxNZXNhZ2UgZXJyb3IgLT4gY29kZTogJHtjb2RlfWApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29kZTogRW5naW5lRXJyb3JDb2RlVG9DYWxsRXJyb3JDb2RlW2NvZGVdIHx8IFJDQ2FsbEVycm9yQ29kZS5TRU5EX01TR19FUlJPUixcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTLCBtZXNzYWdlIH07XG4gIH1cblxuICAvKipcbiAgICog5Y+R6YCB6YKA6K+35raI5oGvXG4gICAqL1xuICBhc3luYyBzZW5kSW52aXRlKG9wdGlvbnM6IElJbnZpdGVNc2dPcHRpb25zKSB7XG4gICAgY29uc3Qge1xuICAgICAgcm9vbVR5cGUsIGNoYW5uZWxJZCwgY29udmVyc2F0aW9uVHlwZSwgdGFyZ2V0SWQsIGNhbGxJZCwgbWVkaWFUeXBlLCBpbnZpdGVVc2VySWRzLCBleHRyYSwgcHVzaFRpdGxlLCBwdXNoQ29udGVudCxcbiAgICB9ID0gb3B0aW9ucztcbiAgICB0aGlzLl9sb2dnZXIud2FybignXycsICdDYWxsTWVzc2FnZUhhbmRsZXJdIHNlbmRDYWxsTWVzYWdlIHNlbmRJbnZpdGUnLCBKU09OLnN0cmluZ2lmeShvcHRpb25zKSk7XG4gICAgdGhpcy5fd2F0Y2hlcnMuc2VuZEFjY2VwdCAmJiB0aGlzLl93YXRjaGVycy5zZW5kQWNjZXB0KHsgY2FsbElkIH0pO1xuICAgIGNvbnN0IGNvbnRlbnQ6IElJbnZpdGVNc2dDb250ZW50ID0ge1xuICAgICAgcGxhdGZvcm06IFBsYXRmb3JtLldFQixcbiAgICAgIGRldmljZUlkOiB0aGlzLl9kZXZpY2VJZCxcbiAgICAgIGNhbGxJZCxcbiAgICAgIHJvb21UeXBlLFxuICAgICAgZXh0cmEsXG4gICAgICBlbmdpbmVUeXBlOiA0LFxuICAgICAgY2hhbm5lbEluZm86IHsgSWQ6IGNhbGxJZCwgS2V5OiAnJyB9LFxuICAgICAgbWVkaWFUeXBlLFxuICAgICAgaW52aXRlVXNlcklkcyxcbiAgICAgIG9ic2VydmVyVXNlcklkczogW10sXG4gICAgICB1c2VyOiB0aGlzLl91c2VySW5mbyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbE1lc3NhZ2Uoe1xuICAgICAgY2hhbm5lbElkLFxuICAgICAgY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkLFxuICAgICAgY29udGVudCxcbiAgICAgIG1lc3NhZ2VUeXBlOiBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0ludml0ZSxcbiAgICAgIGRpcmVjdGlvbmFsVXNlcklkTGlzdDogY29udmVyc2F0aW9uVHlwZSA9PT0gQ29udmVyc2F0aW9uVHlwZS5HUk9VUCA/IGludml0ZVVzZXJJZHMgOiBbdGFyZ2V0SWRdLFxuICAgICAgcHVzaFRpdGxlLFxuICAgICAgcHVzaENvbnRlbnQsXG4gICAgICBwdXNoRGF0YTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBtZWRpYVR5cGUsXG4gICAgICAgIHVzZXJJZExpc3Q6IGludml0ZVVzZXJJZHMsXG4gICAgICAgIGNhbGxJZCxcbiAgICAgIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOWPkemAgeS6uuWRmOWPmOabtOa2iOaBr1xuICAgKi9cbiAgYXN5bmMgc2VuZE1lbWViZXJNb2RpZnkob3B0aW9uczogSU1lbWJlck1vZGlmeU1zZ09wdGlvbnMpIHtcbiAgICBjb25zdCB7XG4gICAgICBjaGFubmVsSWQsIGNvbnZlcnNhdGlvblR5cGUsIHRhcmdldElkLCBjYWxsSWQsIG1lZGlhVHlwZSwgaW52aXRlVXNlcklkcywgY2FsbGVySWQsXG4gICAgICBleGlzdGVkVXNlclBvZmlsZXMsIGRpcmVjdGlvbmFsVXNlcklkTGlzdCwgZXh0cmEsIHB1c2hUaXRsZSwgcHVzaENvbnRlbnQsXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgY29udGVudDogSU1lbWJlck1vZGlmeU1zZ0NvbnRlbnQgPSB7XG4gICAgICBwbGF0Zm9ybTogUGxhdGZvcm0uV0VCLCAvLyBUT0RPIOS4jiBJTSDkuIDoh7RcbiAgICAgIGRldmljZUlkOiB0aGlzLl9kZXZpY2VJZCxcbiAgICAgIGNhbGxJZCxcbiAgICAgIGV4dHJhLFxuICAgICAgZW5naW5lVHlwZTogNCxcbiAgICAgIGNoYW5uZWxJbmZvOiB7IElkOiBjYWxsSWQsIEtleTogJycgfSxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICAgIGludml0ZVVzZXJJZHMsXG4gICAgICBvYnNlcnZlclVzZXJJZHM6IFtdLFxuICAgICAgdXNlcjogdGhpcy5fdXNlckluZm8sXG4gICAgICBjYWxsZXI6IGNhbGxlcklkLFxuICAgICAgbW9kaWZ5TWVtVHlwZTogTWVtYmVyTW9kaWZ5VHlwZS5BREQsXG4gICAgICBleGlzdGVkVXNlclBvZmlsZXMsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxNZXNzYWdlKHtcbiAgICAgIGNoYW5uZWxJZCxcbiAgICAgIGNvbnZlcnNhdGlvblR5cGUsXG4gICAgICB0YXJnZXRJZCxcbiAgICAgIGNvbnRlbnQsXG4gICAgICBtZXNzYWdlVHlwZTogUkNDYWxsTWVzc2FnZVR5cGUuVkNNb2RpZnlNZW0sXG4gICAgICBkaXJlY3Rpb25hbFVzZXJJZExpc3QsXG4gICAgICBwdXNoVGl0bGUsXG4gICAgICBwdXNoQ29udGVudCxcbiAgICAgIHB1c2hEYXRhOiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIG1lZGlhVHlwZSxcbiAgICAgICAgdXNlcklkTGlzdDogaW52aXRlVXNlcklkcyxcbiAgICAgICAgY2FsbElkLFxuICAgICAgfSksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5Y+R6YCB5ZON6ZOD5raI5oGvXG4gICAqL1xuICBzZW5kUmluZ2luZyhvcHRpb25zOiBJUmluZ2luZ01zZ09wdGlvbnMpIHtcbiAgICBjb25zdCB7XG4gICAgICBjaGFubmVsSWQsIGNvbnZlcnNhdGlvblR5cGUsIHRhcmdldElkLCBjYWxsSWQsIHVzZXJJZHMsXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgY29udGVudDogSVJpbmdpbmdNc2dDb250ZW50ID0ge1xuICAgICAgcGxhdGZvcm06IFBsYXRmb3JtLldFQixcbiAgICAgIGRldmljZUlkOiB0aGlzLl9kZXZpY2VJZCxcbiAgICAgIGNhbGxJZCxcbiAgICAgIHVzZXI6IHRoaXMuX3VzZXJJbmZvLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsTWVzc2FnZSh7XG4gICAgICBjaGFubmVsSWQsXG4gICAgICBjb252ZXJzYXRpb25UeXBlLFxuICAgICAgdGFyZ2V0SWQsXG4gICAgICBjb250ZW50LFxuICAgICAgbWVzc2FnZVR5cGU6IFJDQ2FsbE1lc3NhZ2VUeXBlLlZDUmluZ2luZyxcbiAgICAgIGRpcmVjdGlvbmFsVXNlcklkTGlzdDogdXNlcklkcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5HpgIHlkIzmhI/mjqXlkKzmtojmga9cbiAgICovXG4gIHNlbmRBY2NlcHQob3B0aW9uczogSUFjY2VwdE1zZ09wdGlvbnMpIHtcbiAgICBjb25zdCB7XG4gICAgICBjaGFubmVsSWQsIGNvbnZlcnNhdGlvblR5cGUsIHRhcmdldElkLCBjYWxsSWQsIG1lZGlhVHlwZSwgdXNlcklkcyxcbiAgICB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBjb250ZW50OiBJQWNjZXB0TXNnQ29udGVudCA9IHtcbiAgICAgIHBsYXRmb3JtOiBQbGF0Zm9ybS5XRUIsXG4gICAgICBkZXZpY2VJZDogdGhpcy5fZGV2aWNlSWQsXG4gICAgICBjYWxsSWQsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICB1c2VyOiB0aGlzLl91c2VySW5mbyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbE1lc3NhZ2Uoe1xuICAgICAgY2hhbm5lbElkLFxuICAgICAgY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkLFxuICAgICAgY29udGVudCxcbiAgICAgIG1lc3NhZ2VUeXBlOiBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0FjY2VwdCxcbiAgICAgIGRpcmVjdGlvbmFsVXNlcklkTGlzdDogdXNlcklkcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5HpgIHmjILmlq3mtojmga9cbiAgICovXG4gIHNlbmRIdW5ndXAob3B0aW9uczogSUh1bmd1cE1zZ09wdGlvbnMpIHtcbiAgICBjb25zdCB7XG4gICAgICBjaGFubmVsSWQsIGNvbnZlcnNhdGlvblR5cGUsIHRhcmdldElkLCBjYWxsSWQsIHJlYXNvbiwgdXNlcklkcywgcHVzaFRpdGxlLCBwdXNoQ29udGVudCxcbiAgICB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBjb250ZW50OiBJSHVuZ3VwTXNnQ29udGVudCA9IHtcbiAgICAgIHBsYXRmb3JtOiBQbGF0Zm9ybS5XRUIsXG4gICAgICBkZXZpY2VJZDogdGhpcy5fZGV2aWNlSWQsXG4gICAgICBjYWxsSWQsXG4gICAgICByZWFzb24sXG4gICAgICB1c2VyOiB0aGlzLl91c2VySW5mbyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbE1lc3NhZ2Uoe1xuICAgICAgY2hhbm5lbElkLFxuICAgICAgY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkLFxuICAgICAgY29udGVudCxcbiAgICAgIG1lc3NhZ2VUeXBlOiBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0hhbmd1cCxcbiAgICAgIHB1c2hUaXRsZSxcbiAgICAgIHB1c2hDb250ZW50LFxuICAgICAgcHVzaERhdGE6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgY2FsbElkLCByZWFzb24sXG4gICAgICB9KSxcbiAgICAgIGRpcmVjdGlvbmFsVXNlcklkTGlzdDogdXNlcklkcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5HpgIHlqpLkvZPlj5jmm7Tmtojmga9cbiAgICovXG4gIHNlbmRNZWRpYU1vZGlmeShvcHRpb25zOiBJTWVkaWFNb2RpZnlNc2dPcHRpb25zKSB7XG4gICAgY29uc3Qge1xuICAgICAgY2hhbm5lbElkLCBjb252ZXJzYXRpb25UeXBlLCB0YXJnZXRJZCwgY2FsbElkLCBtZWRpYVR5cGUsIHVzZXJJZHMsXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgY29udGVudDogSU1lZGlhTW9kaWZ5TXNnQ29udGVudCA9IHtcbiAgICAgIHBsYXRmb3JtOiBQbGF0Zm9ybS5XRUIsXG4gICAgICBkZXZpY2VJZDogdGhpcy5fZGV2aWNlSWQsXG4gICAgICBjYWxsSWQsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICB1c2VyOiB0aGlzLl91c2VySW5mbyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbE1lc3NhZ2Uoe1xuICAgICAgY2hhbm5lbElkLFxuICAgICAgY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkLFxuICAgICAgY29udGVudCxcbiAgICAgIG1lc3NhZ2VUeXBlOiBSQ0NhbGxNZXNzYWdlVHlwZS5WQ01vZGlmeU1lZGlhLFxuICAgICAgZGlyZWN0aW9uYWxVc2VySWRMaXN0OiB1c2VySWRzLFxuICAgIH0pO1xuICB9XG59XG4iLCJleHBvcnQgZW51bSBSQ0NhbGxMYW5ndWFnZSB7XG4gIFpIID0gJ3poJyxcbiAgRU4gPSAnZW4nXG59XG4iLCJleHBvcnQgY29uc3QgRU4gPSB7XG4gIFB1c2hUaXRsZToge1xuICAgIEFVRElPOiAnWW91IGhhdmUgYSB2b2ljZSBjYWxsJyxcbiAgICBWSURFTzogJ1lvdSBoYXZlIGEgdmlkZW8gY2FsbCcsXG4gIH0sXG59O1xuIiwiZXhwb3J0IGNvbnN0IFpIID0ge1xuICBQdXNoVGl0bGU6IHtcbiAgICBBVURJTzogJ+aCqOacieS4gOadoemfs+mikemAmuivnScsXG4gICAgVklERU86ICfmgqjmnInkuIDmnaHop4bpopHpgJror50nLFxuICB9LFxufTtcbiIsImltcG9ydCB7IFJDQ2FsbExhbmd1YWdlIH0gZnJvbSAnLi4vZW51bXMvUkNDYWxsTGFuZyc7XG5pbXBvcnQgeyBFTiB9IGZyb20gJy4vZW4nO1xuaW1wb3J0IHsgWkggfSBmcm9tICcuL3poJztcblxuLyoqXG4gKiBDYWxsRW5naW5lIOWFqOWxgOivreiogOiuvue9ru+8jOW9k+WJjeS7heaUr+aMgeS4reOAgeiLseaWh1xuICovXG5leHBvcnQgY2xhc3MgTG9jYWwge1xuICBzdGF0aWMgX2xhbmc6IFJDQ2FsbExhbmd1YWdlID0gUkNDYWxsTGFuZ3VhZ2UuWkhcblxuICBzdGF0aWMgc2V0KGxhbmc6IFJDQ2FsbExhbmd1YWdlKSB7XG4gICAgdGhpcy5fbGFuZyA9IGxhbmc7XG4gIH1cblxuICBzdGF0aWMgZ2V0KCkge1xuICAgIGlmICh0aGlzLl9sYW5nID09PSBSQ0NhbGxMYW5ndWFnZS5FTikge1xuICAgICAgcmV0dXJuIEVOO1xuICAgIH1cbiAgICByZXR1cm4gWkg7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEJhc2ljTG9nZ2VyLCBDb252ZXJzYXRpb25UeXBlLCBJTG9nZ2VyLCBJUmVjZWl2ZWRNZXNzYWdlLCBJUnVudGltZSwgUlRDUGx1Z2luQ29udGV4dCwgVmVyc2lvbk1hbmFnZSxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgUkNDYWxsU3RhdGVNYWNoaW5lIH0gZnJvbSAnLi9jb3JlL1N0YXRlTWFjaGluZSc7XG5pbXBvcnQge1xuICBJQ2FsbFN0YXRlTWFjaGluZVdhdGNoZXJzLCBJRW5kU3VtbWFyeSwgSUludml0ZWRVc2VycywgSU1lZGlhTW9kaWZ5SW5mbywgSU1lbWJlck1vZGlmeUluZm8sIElTZW5kZXJJbmZvLCBJU3RhdGVDaGFuZ2VJbmZvLCBJVXNlclByb2ZpbGUsIElVc2VyU3RhdGVDaGFuZ2VJbmZvLCBJVXNlckRhdGEsIElJbnZpdGVPcHRpb25zLFxufSBmcm9tICcuL2NvcmUvaW50ZXJmYWNlcy9JU3RhdGVNYWNoaW5lJztcbmltcG9ydCB7IFJDQ2FsbEVycm9yQ29kZSB9IGZyb20gJy4vY29yZS9lbnVtcy9SQ0NhbGxDb2RlJztcbmltcG9ydCB7IFJDQ2FsbFVzZXJTdGF0ZSB9IGZyb20gJy4vY29yZS9lbnVtcy9SQ0NhbGxVc2VyU3RhdGUnO1xuaW1wb3J0IHsgUkNDYWxsU2Vzc2lvblN0YXRlIH0gZnJvbSAnLi9jb3JlL2VudW1zL1JDQ2FsbFNlc3Npb25TdGF0ZSc7XG5pbXBvcnQgeyBSQ0NhbGxFbmRSZWFzb24gfSBmcm9tICcuL2NvcmUvZW51bXMvUkNDYWxsRW5kUmVhc29uJztcbmltcG9ydCB7IFJDQ2FsbE1lZGlhVHlwZSB9IGZyb20gJy4vY29yZS9lbnVtcy9SQ0NhbGxNZWRpYVR5cGUnO1xuaW1wb3J0IHsgQ2FsbE1lc3NhZ2VIYW5kbGVyIH0gZnJvbSAnLi9jb3JlL01lc3NhZ2VIYW5kbGVyJztcbmltcG9ydCB7IGV2ZW50RW1pdHRlciwgZ2VuZXJhdGVSYW5kb21JZCwgZ2V0Q2FsbERldmljZUlkIH0gZnJvbSAnLi9oZWxwZXInO1xuaW1wb3J0IHsgUkNDYWxsTGFuZ3VhZ2UgfSBmcm9tICcuL2NvcmUvZW51bXMvUkNDYWxsTGFuZyc7XG5pbXBvcnQgeyBJQ2FsbEVuZ2luZU9wdGlvbnMsIElDYWxsRW5naW5lV2F0Y2hlcnMgfSBmcm9tICcuL2NvcmUvaW50ZXJmYWNlcy9JQ2FsbEVuZ2luZSc7XG5pbXBvcnQgeyBSQ0NhbGxNZXNzYWdlVHlwZSB9IGZyb20gJy4vY29yZS9lbnVtcy9SQ0NhbGxNZXNzYWdlVHlwZSc7XG5pbXBvcnQgeyBJQWNjZXB0TXNnQ29udGVudCwgSUludml0ZU1zZ0NvbnRlbnQgfSBmcm9tICcuL2NvcmUvaW50ZXJmYWNlcy9JTWVzc2FnZUhhbmRsZXInO1xuaW1wb3J0IHsgTG9jYWwgfSBmcm9tICcuL2NvcmUvbG9jYWxlJztcbmltcG9ydCB7IElPZmZsaW5lUmVjb3JkIH0gZnJvbSAnLi9jb3JlL09mZmxpbmVSZWNvcmRlcic7XG5pbXBvcnQgeyBSQ0Nyb3NzQ2FsbFR5cGUgfSBmcm9tICcuL2NvcmUvZW51bXMvUkNDcm9zc0NhbGxUeXBlJztcbi8vIGNhbGwtZW5naW5lIOeJiOacrOS4iuaKpVxuVmVyc2lvbk1hbmFnZS5hZGQoJ2NhbGwtZW5naW5lJywgX19WRVJTSU9OX18pO1xuXG4vLyDmoKHpqozlvZPliY3lronoo4XnmoQgZW5naW5lIOeJiOacrOaYr+WQpuWPr+eUqFxuaWYgKCFWZXJzaW9uTWFuYWdlLnZhbGlkRW5naW5lKF9fUkVRVUlSRURfRU5HSU5FX1ZFUlNJT05fXykpIHtcbiAgY29uc29sZS5lcnJvcihgVGhlIGN1cnJlbnQgZW5naW5lIHZlcnNpb24gJyR7VmVyc2lvbk1hbmFnZS5nZXRJbmZvKCkuZW5naW5lfScgZXJyb3LvvIxjYWxsLWVuZ2luZSByZXF1aXJlZCBlbmdpbmUgdmVyc2lvbiBhdCBsZWFzdCAnJHtfX1JFUVVJUkVEX0VOR0lORV9WRVJTSU9OX199Jy5gKTtcbn1cbmNsYXNzIFJDQ2FsbEVuZ2luZSB7XG4gIHByaXZhdGUgX3N0YXRlTWFjaGluZTogeyBbY2FsbElkOiBzdHJpbmddOiBSQ0NhbGxTdGF0ZU1hY2hpbmUgfSA9IHt9XG5cbiAgcHJpdmF0ZSBfY2FsbE1zZ0hhbmRsZXI6IENhbGxNZXNzYWdlSGFuZGxlclxuXG4gIC8qKlxuICAgKiDliJ3lp4vljJZcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgICAqIGVuZ2luZSBQbGd1aW5Db250ZXh0IOWunuS+i1xuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRleHQ6IFJUQ1BsdWdpbkNvbnRleHQsXG4gICAgLyoqXG4gICAgICog6L+Q6KGM5pe255u45YWzXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcnVudGltZTogSVJ1bnRpbWUsXG4gICAgLyoqXG4gICAgICogZW5naW5lIOaXpeW/l+aooeWdl+WunuS+i++8jOeUsSBDYWxsTGliIOWxguWIneWni+WMllxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogQmFzaWNMb2dnZXIsXG4gICAgLyoqXG4gICAgICog55uR5ZCs5pa55rOVXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfd2F0Y2hlcnM6IElDYWxsRW5naW5lV2F0Y2hlcnMsXG4gICAgLyoqXG4gICAgICog5YW25LuW6YWN572u6aG5XG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfb3B0aW9uczogSUNhbGxFbmdpbmVPcHRpb25zLFxuICApIHtcbiAgICB0aGlzLl9sb2dnZXIud2FybignXycsIGBSQ0NhbGxFbmdpbmUgVmVyc2lvbjogJHtfX1ZFUlNJT05fX30gQ29tbWl0SWQ6ICR7X19DT01NSVRfSURfX31gKTtcbiAgICAvLyDorr7nva4gRGV2aWNlSWRcbiAgICBnZXRDYWxsRGV2aWNlSWQoX3J1bnRpbWUpO1xuICAgIC8vIOebkeWQrCBJTSDmtojmga9cbiAgICB0aGlzLl9jYWxsTXNnSGFuZGxlciA9IG5ldyBDYWxsTWVzc2FnZUhhbmRsZXIodGhpcy5fY29udGV4dCwgdGhpcy5fcnVudGltZSwgdGhpcy5fbG9nZ2VyLCB0aGlzLl9vcHRpb25zLm9mZmxpbmVNc2dJdHYsIHRoaXMuX2dldFN0YXRlTWFjaGluZS5iaW5kKHRoaXMpKTtcbiAgICAvLyDms6jlhozmtojmga/mqKHlnZfnm5HlkKxcbiAgICB0aGlzLl9jYWxsTXNnSGFuZGxlci5yZWdpc3RlckV2ZW50TGlzdGVuZXIoe1xuICAgICAgb25JbnZpdGU6IHRoaXMuX29uSW52aXRlLmJpbmQodGhpcyksXG4gICAgICBzZW5kQWNjZXB0OiB0aGlzLl9oYW5kbGVTZW5kQWNjZXB0LmJpbmQodGhpcyksXG4gICAgICBvbk9mZmxpbmVSZWNvcmQ6IHRoaXMuX3dhdGNoZXJzLm9uT2ZmbGluZVJlY29yZCxcbiAgICB9KTtcbiAgICAvLyDnm5HlkKznirbmgIHmnLrlhbPpl61cbiAgICBldmVudEVtaXR0ZXIub24oJ29uU3RhdGVNYWNoaW5lQ2xvc2UnLCAoY2FsbElkOiBzdHJpbmcpID0+IHtcbiAgICAgIGRlbGV0ZSB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXTtcbiAgICB9KTtcbiAgICAvLyDorr7nva7or63oqIBcbiAgICBMb2NhbC5zZXQoX29wdGlvbnMubGFuZyk7XG4gIH1cblxuICBwcml2YXRlIF9vbkludml0ZShtc2c6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICBjb25zdCB7XG4gICAgICBjaGFubmVsSWQsIGNvbnZlcnNhdGlvblR5cGUsIHRhcmdldElkLCBjb250ZW50LCBtZXNzYWdlVHlwZSwgc2VuZGVyVXNlcklkOiBzdWlkLCBwdXNoQ29uZmlnLFxuICAgIH0gPSBtc2c7XG4gICAgdGhpcy5fbG9nZ2VyLndhcm4oJ18nLCBgUkNDYWxsRW5naW5lIF9vbkludml0ZTp0YXJnZXRJZCAke3RhcmdldElkfSBzZW5kZXJVc2VySWQ6ICR7c3VpZH1gKTtcbiAgICBjb25zdCB7XG4gICAgICBtZWRpYVR5cGUsIGNhbGxJZCwgZXh0cmEsIHJvb21UeXBlLFxuICAgIH0gPSBjb250ZW50IGFzIElJbnZpdGVNc2dDb250ZW50O1xuICAgIGxldCBzZW5kZXJVc2VySWQ6IHN0cmluZztcbiAgICBpZiAocm9vbVR5cGUgIT09IFJDQ3Jvc3NDYWxsVHlwZS5SQ0NhbGxSb29tVHlwZUFjcm9zc0NhbGwpIHtcbiAgICAgIHNlbmRlclVzZXJJZCA9IHN1aWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIFssIHNlbmRlclVzZXJJZF0gPSBzdWlkLnNwbGl0KCdfJyk7XG4gICAgfVxuICAgIGNvbnN0IGNydFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgaWYgKHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCkgPT09IHNlbmRlclVzZXJJZCkgeyAvLyDlpJrnq6/lpITnkIZcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDnvqTogYrpgJror53mnInlhbbku5bnq6/lpITnkIbml7bvvIzkuI3lho3lpITnkIbmraTpgJror53kuK3nmoTpgoDor7fmtojmga9cbiAgICAgKiDmnaHku7YxOiDmraTkurrlt7LooqvpgoDor7fpgJror51cbiAgICAgKiDmnaHku7YyOiDmnKznq6/ml6DmraTpgJror53nmoTnirbmgIHmnLpcbiAgICAgKi9cbiAgICBpZiAobWVzc2FnZVR5cGUgPT09IFJDQ2FsbE1lc3NhZ2VUeXBlLlZDTW9kaWZ5TWVtKSB7XG4gICAgICBjb25zdCBpc0tlZXBpbmcgPSBjb250ZW50LmV4aXN0ZWRVc2VyUG9maWxlcy5zb21lKChpdGVtOiB7IHVzZXJJZDogc3RyaW5nIH0pID0+IChpdGVtLnVzZXJJZCA9PT0gY3J0VXNlcklkKSk7XG4gICAgICBpZiAoaXNLZWVwaW5nICYmICF0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhdGVNYWNoaW5lID0gdGhpcy5fc3RhdGVNYWNoaW5lW2NhbGxJZF07XG4gICAgaWYgKCFzdGF0ZU1hY2hpbmUpIHtcbiAgICAgIHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdID0gbmV3IFJDQ2FsbFN0YXRlTWFjaGluZShcbiAgICAgICAgdGhpcy5fY29udGV4dCxcbiAgICAgICAgdGhpcy5fcnVudGltZSxcbiAgICAgICAgdGhpcy5fbG9nZ2VyLFxuICAgICAgICB0aGlzLl9jYWxsTXNnSGFuZGxlcixcbiAgICAgICAgY2hhbm5lbElkISxcbiAgICAgICAgY29udmVyc2F0aW9uVHlwZSxcbiAgICAgICAgdGFyZ2V0SWQsXG4gICAgICAgIG1lZGlhVHlwZSxcbiAgICAgICAgY2FsbElkLFxuICAgICAgKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxFbmdpbmVdIFJDQ2FsbFN0YXRlTWFjaGluZSBzdWNjZXNzZnVsbHkgY3JlYXRlZCAtPiBjYWxsSWQ6ICR7Y2FsbElkfWApO1xuXG4gICAgICBpZiAobWVzc2FnZVR5cGUgPT09IFJDQ2FsbE1lc3NhZ2VUeXBlLlZDSW52aXRlKSB7XG4gICAgICAgIC8vIOeKtuaAgeacuuWGhemDqOWkhOeQhiBpbnZpdGUg5raI5oGvXG4gICAgICAgIHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdLl9fb25JbnZpdGUobXNnKTtcbiAgICAgIH0gZWxzZSBpZiAobWVzc2FnZVR5cGUgPT09IFJDQ2FsbE1lc3NhZ2VUeXBlLlZDTW9kaWZ5TWVtKSB7XG4gICAgICAgIHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdLl9fb25NZW1iZXJNb2RpZnkobXNnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3dhdGNoZXJzLm9uSW52aXRlKHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdLCBleHRyYSk7XG5cbiAgICAgIGNvbnN0IGhhc090aGVyU3RhdGVNYWNoaW5lID0gT2JqZWN0LmtleXModGhpcy5fc3RhdGVNYWNoaW5lKS5maWx0ZXIoKG90aGVyQ2FsbElkKSA9PiBjYWxsSWQgIT09IG90aGVyQ2FsbElkKS5sZW5ndGggPiAwO1xuICAgICAgaWYgKGhhc090aGVyU3RhdGVNYWNoaW5lICYmICEodGhpcy5fb3B0aW9ucy5pc0FsbG93QWNjZXB0TmV3Q2FsbCB8fCBmYWxzZSkpIHtcbiAgICAgICAgdGhpcy5fc3RhdGVNYWNoaW5lW2NhbGxJZF0uX19oYW5kbGVJbnZpdGVJblNlc3Npb24oKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG1lc3NhZ2VUeXBlID09PSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ01vZGlmeU1lbSkge1xuICAgICAgdGhpcy5fc3RhdGVNYWNoaW5lW2NhbGxJZF0uX19vbk1lbWJlck1vZGlmeShtc2cpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDlhYHorrjmjqXlkKzmlrDnmoTpgJror53ml7bvvIzmjqXlkKzlrozmlrDnmoTpgJror53lkI7vvIzmjILmlq3lhbbku5bpgJror51cbiAgICovXG4gIHByaXZhdGUgX2hhbmRsZVNlbmRBY2NlcHQoaW5mbzogeyBjYWxsSWQ6IHN0cmluZyB9KSB7XG4gICAgaWYgKHRoaXMuX29wdGlvbnMuaXNBbGxvd0FjY2VwdE5ld0NhbGwpIHtcbiAgICAgIGNvbnN0IHsgY2FsbElkIH0gPSBpbmZvO1xuICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLl9zdGF0ZU1hY2hpbmUpIHtcbiAgICAgICAgaWYgKGNhbGxJZCAhPT0gaWQpIHtcbiAgICAgICAgICB0aGlzLl9zdGF0ZU1hY2hpbmVbaWRdLmh1bmd1cCgpO1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLl9zdGF0ZU1hY2hpbmVbaWRdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOagueaNriBjYWxsSWQg6I635Y+W54q25oCB5py6XG4gICovXG4gIHByaXZhdGUgX2dldFN0YXRlTWFjaGluZShjYWxsSWQ6IHN0cmluZyk6IFJDQ2FsbFN0YXRlTWFjaGluZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXTtcbiAgfVxuXG4gIC8qKlxuICAgKiDms6jlhoznlKjmiLfkv6Hmga8sIOWPkemAgSBjYWxsIOa2iOaBr+aXtueUqOaIt+S/oeaBr+aQuuW4plxuICAgKi9cbiAgcmVnaXN0ZXJVc2VySW5mbyh1c2VySW5mbzogSVVzZXJQcm9maWxlKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYFtSQ0NhbGxFbmdpbmVdIHJlZ2lzdGVyVXNlckluZm8gLT4gdXNlckluZm86ICR7SlNPTi5zdHJpbmdpZnkodXNlckluZm8pfWApO1xuXG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIucmVnaXN0ZXJVc2VySW5mbyh1c2VySW5mbyk7XG4gIH1cblxuICAvKipcbiAgICog5Y2V5ZG8XG4gICAqIEBwYXJhbSBjaGFubmVsSWQg57uE57uHIElEXG4gICAqIEBwYXJhbSB0YXJnZXRJZCAg5a+55pa5IElEXG4gICAqIEBwYXJhbSBtZWRpYVR5cGUg5aqS5L2T57G75Z6LXG4gICAqIEBwYXJhbSBleHRyYSDmtojmga/mianlsZXkv6Hmga9cbiAgICogQHBhcmFtIHB1c2hUaXRsZSDpgJrnn6XnmoTmoIfpophcbiAgICogQHBhcmFtIHB1c2hDb250ZW50IOmAmuefpeeahOWGheWuuVxuICAgKi9cbiAgYXN5bmMgY2FsbChcbiAgICBjaGFubmVsSWQ6IHN0cmluZyxcbiAgICB0YXJnZXRJZDogc3RyaW5nLFxuICAgIG1lZGlhVHlwZTogbnVtYmVyLFxuICAgIGV4dHJhOiBzdHJpbmcgPSAnJyxcbiAgICBwdXNoVGl0bGU6IHN0cmluZyA9ICcnLFxuICAgIHB1c2hDb250ZW50OiBzdHJpbmcgPSAnJyxcbiAgICBpc0Nyb3NzQXBwa2V5ID0gZmFsc2UsXG4gICk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUsIHN0YXRlTWFjaGluZT86IFJDQ2FsbFN0YXRlTWFjaGluZSB9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYFtSQ0NhbGxFbmdpbmVdIGNhbGwgLT4gYXJnczogJHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICBjaGFubmVsSWQsIHRhcmdldElkLCBtZWRpYVR5cGUsIGV4dHJhLCBwdXNoVGl0bGUsIHB1c2hDb250ZW50LFxuICAgIH0pfWApO1xuICAgIGNvbnN0IGNhbGxJZCA9IGdlbmVyYXRlUmFuZG9tSWQoKTtcbiAgICBjb25zdCBoYXNTdGF0ZU1hY2hpbmUgPSBPYmplY3Qua2V5cyh0aGlzLl9zdGF0ZU1hY2hpbmUpLmxlbmd0aCA+IDA7XG4gICAgaWYgKGhhc1N0YXRlTWFjaGluZSkge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNUQVRFX01BQ0hJTkVfRVhJVCB9O1xuICAgIH1cbiAgICB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXSA9IG5ldyBSQ0NhbGxTdGF0ZU1hY2hpbmUoXG4gICAgICB0aGlzLl9jb250ZXh0LFxuICAgICAgdGhpcy5fcnVudGltZSxcbiAgICAgIHRoaXMuX2xvZ2dlcixcbiAgICAgIHRoaXMuX2NhbGxNc2dIYW5kbGVyLFxuICAgICAgY2hhbm5lbElkLFxuICAgICAgQ29udmVyc2F0aW9uVHlwZS5QUklWQVRFLFxuICAgICAgdGFyZ2V0SWQsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICBjYWxsSWQsXG4gICAgKTtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdLl9fY2FsbChbdGFyZ2V0SWRdLCBleHRyYSwgcHVzaFRpdGxlLCBwdXNoQ29udGVudCwgaXNDcm9zc0FwcGtleSk7XG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUyxcbiAgICAgICAgc3RhdGVNYWNoaW5lOiB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnvqTlkbxcbiAgICogQHBhcmFtIGNoYW5uZWxJZCDnu4Tnu4cgSURcbiAgICogQHBhcmFtIHRhcmdldElkICDnvqTnu4QgSURcbiAgICogQHBhcmFtIG1lZGlhVHlwZSDlqpLkvZPnsbvlnotcbiAgICogQHBhcmFtIHVzZXJJZHMg6KKr6YKA6K+35Lq65ZGY5YiX6KGoXG4gICAqIEBwYXJhbSBleHRyYSDmtojmga/mianlsZXkv6Hmga9cbiAgICogQHBhcmFtIHB1c2hUaXRsZSDpgJrnn6XnmoTmoIfpophcbiAgICogQHBhcmFtIHB1c2hDb250ZW50IOmAmuefpeeahOWGheWuuVxuICAgKi9cbiAgYXN5bmMgY2FsbEluR3JvdXAoXG4gICAgY2hhbm5lbElkOiBzdHJpbmcsXG4gICAgdGFyZ2V0SWQ6IHN0cmluZyxcbiAgICBtZWRpYVR5cGU6IG51bWJlcixcbiAgICB1c2VySWRzOiBzdHJpbmdbXSxcbiAgICBleHRyYTogc3RyaW5nID0gJycsXG4gICAgcHVzaFRpdGxlOiBzdHJpbmcgPSAnJyxcbiAgICBwdXNoQ29udGVudDogc3RyaW5nID0gJycsXG4gICk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUsIHN0YXRlTWFjaGluZT86IFJDQ2FsbFN0YXRlTWFjaGluZSB9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYFtSQ0NhbGxFbmdpbmVdIGNhbGxJbkdyb3VwIC0+IGFyZ3M6ICR7SlNPTi5zdHJpbmdpZnkoeyBjaGFubmVsSWQsIHRhcmdldElkLCBtZWRpYVR5cGUgfSl9YCk7XG4gICAgY29uc3QgY2FsbElkID0gZ2VuZXJhdGVSYW5kb21JZCgpO1xuICAgIGNvbnN0IGhhc1N0YXRlTWFjaGluZSA9IE9iamVjdC5rZXlzKHRoaXMuX3N0YXRlTWFjaGluZSkubGVuZ3RoID4gMDtcbiAgICBpZiAoaGFzU3RhdGVNYWNoaW5lKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1RBVEVfTUFDSElORV9FWElUIH07XG4gICAgfVxuICAgIHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdID0gbmV3IFJDQ2FsbFN0YXRlTWFjaGluZShcbiAgICAgIHRoaXMuX2NvbnRleHQsXG4gICAgICB0aGlzLl9ydW50aW1lLFxuICAgICAgdGhpcy5fbG9nZ2VyLFxuICAgICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIsXG4gICAgICBjaGFubmVsSWQsXG4gICAgICBDb252ZXJzYXRpb25UeXBlLkdST1VQLFxuICAgICAgdGFyZ2V0SWQsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICBjYWxsSWQsXG4gICAgKTtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdLl9fY2FsbCh1c2VySWRzLCBleHRyYSwgcHVzaFRpdGxlLCBwdXNoQ29udGVudCk7XG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUyxcbiAgICAgICAgc3RhdGVNYWNoaW5lOiB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDplIDmr4HlvZPliY3nmoTnirbmgIHmnLpcbiAgICovXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgJ1tSQ0NhbGxFbmdpbmVdIGRlc3Ryb3knKTtcbiAgICB0aGlzLl9zdGF0ZU1hY2hpbmUgPSB7fTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBSQ0NhbGxFbmdpbmUsXG4gIFJDQ2FsbFN0YXRlTWFjaGluZSwgUkNDYWxsRXJyb3JDb2RlLFxuICBSQ0NhbGxVc2VyU3RhdGUsXG4gIFJDQ2FsbFNlc3Npb25TdGF0ZSxcbiAgUkNDYWxsRW5kUmVhc29uLFxuICBSQ0NhbGxNZWRpYVR5cGUsXG4gIFJDQ2FsbExhbmd1YWdlLFxufTtcblxuZXhwb3J0IHR5cGUge1xuICBJQ2FsbFN0YXRlTWFjaGluZVdhdGNoZXJzLCBJRW5kU3VtbWFyeSxcbiAgSUNhbGxFbmdpbmVXYXRjaGVycyxcbiAgSVVzZXJTdGF0ZUNoYW5nZUluZm8sXG4gIElTdGF0ZUNoYW5nZUluZm8sXG4gIElTZW5kZXJJbmZvLFxuICBJTWVtYmVyTW9kaWZ5SW5mbyxcbiAgSU1lZGlhTW9kaWZ5SW5mbyxcbiAgSUludml0ZWRVc2VycyxcbiAgSVVzZXJEYXRhLFxuICBJVXNlclByb2ZpbGUsXG4gIElPZmZsaW5lUmVjb3JkLFxuICBJSW52aXRlT3B0aW9ucyxcbn07XG4iLCIvKipcbiAqIOS6p+eUn3Nlc3Npb27nmoTlnLrmma9cbiAqL1xuZXhwb3J0IGVudW0gUHJvZHVjZVR5cGVzIHtcbiAgLyoqXG4gICAqIOS4u+WPq1xuICAgKi9cbiAgQ0FMTEVSID0gMSxcblxuICAvKipcbiAgICog6KKr5Y+rXG4gICAqL1xuICBDQUxMRUUgPSAyXG59XG4iLCJjbGFzcyBFdmVudEVtaXR0ZXIge1xuICBwcml2YXRlIGxpc3Q6IHtbcHJvcE5hbWU6IHN0cmluZ106IGFueVtdfSA9IHt9XG5cbiAgcHVibGljIG9uKGV2ZW50OiBzdHJpbmcsIGZ1bjooZGF0YT86YW55KT0+dm9pZCkge1xuICAgICh0aGlzLmxpc3RbZXZlbnRdIHx8ICh0aGlzLmxpc3RbZXZlbnRdID0gW10pKS5wdXNoKGZ1bik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgb25jZShldmVudDogc3RyaW5nLCBmdW46KGRhdGE/OmFueSk9PnZvaWQpIHtcbiAgICBjb25zdCBvbiA9IChkYXRhPzphbnkpID0+IHtcbiAgICAgIHRoaXMub2ZmKGV2ZW50LCBvbik7XG4gICAgICBmdW4uY2FsbCh0aGlzLCBkYXRhKTtcbiAgICB9O1xuICAgIG9uLmZ1biA9IGZ1bjtcbiAgICB0aGlzLm9uKGV2ZW50LCBvbik7XG4gIH1cblxuICBwdWJsaWMgb2ZmKGV2ZW50OiBzdHJpbmcsIGZ1bj86KGRhdGE/OmFueSk9PnZvaWQpIHtcbiAgICBjb25zdCBmdW5zID0gdGhpcy5saXN0W2V2ZW50XTtcbiAgICBpZiAoIWZ1bnMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFmdW4pIHtcbiAgICAgIC8vIOWmguaenOayoeacieS8oCBmbiDnmoTor53vvIzlsLHkvJrlsIYgZXZlbnQg5YC85a+55bqU57yT5a2Y5YiX6KGo5Lit55qEIGZ1biDpg73muIXnqbpcbiAgICAgIGZ1bnMgJiYgKGZ1bnMubGVuZ3RoID0gMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOiLpeaciSBmdW7vvIzpgY3ljobnvJPlrZjliJfooajvvIznnIvnnIvkvKDlhaXnmoQgZm4g5LiO5ZOq5Liq5Ye95pWw55u45ZCM77yM5aaC5p6c55u45ZCM5bCx55u05o6l5LuO57yT5a2Y5YiX6KGo5Lit5Yig5o6J5Y2z5Y+vXG4gICAgICBsZXQgY2I7XG4gICAgICBmb3IgKGxldCBpID0gMCwgeyBsZW5ndGggfSA9IGZ1bnM7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBjYiA9IGZ1bnNbaV07XG4gICAgICAgIGlmIChjYiA9PT0gZnVuIHx8IGNiLmZ1biA9PT0gZnVuKSB7XG4gICAgICAgICAgZnVucy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZW1pdChldmVudDogc3RyaW5nLCBkYXRhPzphbnkpIHtcbiAgICAvLyDnrKzkuIDkuKrlj4LmlbDmmK/lr7nlupTnmoQgZXZlbnQg5YC877yM55u05o6l55So5pWw57uE55qEIHNoaWZ0IOaWueazleWPluWHulxuICAgIGNvbnN0IGZ1bnMgPSBbLi4udGhpcy5saXN0W2V2ZW50XV07XG5cbiAgICAvLyDlpoLmnpznvJPlrZjliJfooajph4zmsqHmnIkgZnVuIOWwsei/lOWbniBmYWxzZVxuICAgIGlmICghZnVucyB8fCBmdW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyDpgY3ljoYgZXZlbnQg5YC85a+55bqU55qE57yT5a2Y5YiX6KGo77yM5L6d5qyh5omn6KGMIGZuXG4gICAgZnVucy5mb3JFYWNoKChmdW4pID0+IHtcbiAgICAgIGZ1bi5jYWxsKHRoaXMsIGRhdGEpO1xuICAgIH0pO1xuICB9XG59XG5leHBvcnQge1xuICBFdmVudEVtaXR0ZXIsXG59O1xuIiwiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiIsImltcG9ydCB7IFJUQ0pvaW5UeXBlLCBMb2dMZXZlbCB9IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IFJDQ2FsbExhbmd1YWdlLCBSQ0NhbGxNZWRpYVR5cGUgfSBmcm9tICdAcmMtZW1iZWQvY2FsbC1lbmdpbmUnO1xuaW1wb3J0IHsgUkNSZXNvbHV0aW9uIH0gZnJvbSAnQHJvbmdjbG91ZC9wbHVnaW4tcnRjJztcblxuaW1wb3J0IHtcbiAgSVNlc3Npb25MaXN0ZW5lciwgSVJDQ2FsbEluaXRPcHRpb25zLCBJVmFsaWRhdGlvblJlc3VsdCwgSU1lZGlhU3RyZWFtQ29uc3RyYWludHMsIElQdXNoQ29uZmlnLFxufSBmcm9tICcuL2ludGVyZmFjZSc7XG5cbmZ1bmN0aW9uIGlzTGFuZ3VhZ2UodmFsOiBzdHJpbmcpIHtcbiAgY29uc3QgdmFsdWVzOiBzdHJpbmdbXSA9IE9iamVjdC52YWx1ZXMoUkNDYWxsTGFuZ3VhZ2UpO1xuICByZXR1cm4gdmFsdWVzLmluY2x1ZGVzKHZhbCk7XG59XG5cbmZ1bmN0aW9uIGlzSm9pblR5cGUodmFsOiBudW1iZXIpIHtcbiAgY29uc3QgdmFsdWVzID0gT2JqZWN0LnZhbHVlcyhSVENKb2luVHlwZSkgYXMgbnVtYmVyW107XG4gIHJldHVybiB2YWx1ZXMuaW5jbHVkZXModmFsKTtcbn1cblxuZnVuY3Rpb24gaXNMb2dMZXZlbCh2YWw6IG51bWJlcikge1xuICBjb25zdCB2YWx1ZXMgPSBPYmplY3QudmFsdWVzKExvZ0xldmVsKSBhcyBudW1iZXJbXTtcbiAgcmV0dXJuIHZhbHVlcy5pbmNsdWRlcyh2YWwpO1xufVxuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVDYWxsSW5pdE9wdGlvbnMgPSAob3B0aW9uczogSVJDQ2FsbEluaXRPcHRpb25zKTogSVZhbGlkYXRpb25SZXN1bHQgPT4ge1xuICBpZiAoIW9wdGlvbnMpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBtaXNzaW5nIHBhcmFtZXRlciAtPiBvcHRpb25zJyB9O1xuICB9XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0JyB9O1xuICB9XG4gIGNvbnN0IGtleU5hbWVzOiBzdHJpbmdbXSA9IFsncnRjQ2xpZW50JywgJ29uU2Vzc2lvbicsICdvblNlc3Npb25DbG9zZSddO1xuICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKG9wdGlvbnMpO1xuICBjb25zdCBtaXNzaW5nS2V5czogc3RyaW5nW10gPSBbXTtcblxuICAvLyDmoKHpqozloavpobnmmK/lkKbpg73ljIXlkKvvvIzlpoLmnpzlk6rkuKrkuI3ljIXlkKvlsLHmlLbpm4botbfmnaVcbiAga2V5TmFtZXMuZm9yRWFjaCgoa2V5OiBzdHJpbmcpID0+IHtcbiAgICBpZiAoIWtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgbWlzc2luZ0tleXMucHVzaChrZXkpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8g5aaC5p6c57y65bCR5b+F5aGr55qE55uR5ZCs5Ye95pWw5oiW5a+56LGhXG4gIGlmIChtaXNzaW5nS2V5cy5sZW5ndGgpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6IGBJbml0aWFsaXphdGlvbiBtaXNzaW5nIHBhcmFtZXRlciAtPiBcIiR7bWlzc2luZ0tleXMuam9pbignLCcpfVwiYCB9O1xuICB9XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5ydGNDbGllbnQgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gXFwncnRjQ2xpZW50XFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnb2JqZWN0XFwnJyB9O1xuICB9XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5vblNlc3Npb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBcXCdvblNlc3Npb25cXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdmdW5jdGlvblxcJycgfTtcbiAgfVxuICBpZiAodHlwZW9mIG9wdGlvbnMub25TZXNzaW9uQ2xvc2UgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBcXCdvblNlc3Npb25DbG9zZVxcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIFxcJ2Z1bmN0aW9uXFwnJyB9O1xuICB9XG5cbiAgLy8g5aaC5p6c5Lyg5LqGaXNBbGxvd1N1YnNjcmliZVJldHJ5IOS9huS4jeaYr2Jvb2xlYW7nsbvlnotcbiAgaWYgKHR5cGVvZiBvcHRpb25zLmlzQWxsb3dTdWJzY3JpYmVSZXRyeSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdGlvbnMuaXNBbGxvd1N1YnNjcmliZVJldHJ5ICE9PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBcXCdpc0FsbG93U3Vic2NyaWJlUmV0cnlcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdib29sZWFuXFwnJyB9O1xuICB9XG5cbiAgLy8g5aaC5p6c5Lyg5LqG77yM5L2G5LiN5pivYm9vbGVhbuexu+Wei1xuICBpZiAodHlwZW9mIG9wdGlvbnMuaXNBbGxvd1B1Ymxpc2hSZXRyeSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdGlvbnMuaXNBbGxvd1B1Ymxpc2hSZXRyeSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gXFwnaXNBbGxvd1B1Ymxpc2hSZXRyeVxcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIFxcJ2Jvb2xlYW5cXCcnIH07XG4gIH1cblxuICAvLyDlpoLmnpzkvKDkuobvvIzkvYbkuI3mmK9ib29sZWFu57G75Z6LXG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5pc09mZkNhbWVyYVdoZW5WaWRlb0Rpc2FibGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRpb25zLmlzT2ZmQ2FtZXJhV2hlblZpZGVvRGlzYWJsZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gXFwnaXNPZmZDYW1lcmFXaGVuVmlkZW9EaXNhYmxlXFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnYm9vbGVhblxcJycgfTtcbiAgfVxuXG4gIC8vIOWmguaenOS8oOS6hu+8jOS9huS4jeaYr1JUQ0pvaW5UeXBl55qE5p6a5Li+XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5qb2luVHlwZSAhPT0gJ3VuZGVmaW5lZCcgJiYgIWlzSm9pblR5cGUob3B0aW9ucy5qb2luVHlwZSEpKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gXFwnam9pblR5cGVcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBjb3JyZWN0IHR5cGUnIH07XG4gIH1cblxuICAvLyDlpoLmnpzkvKDkuobvvIzkvYbkuI3mmK9ib29sZWFu57G75Z6LXG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5pc0FsbG93RGVtb3Rpb25HZXRTdHJlYW0gIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRpb25zLmlzQWxsb3dEZW1vdGlvbkdldFN0cmVhbSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gXFwnaXNBbGxvd0RlbW90aW9uR2V0U3RyZWFtXFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnYm9vbGVhblxcJycgfTtcbiAgfVxuXG4gIC8vIOWmguaenOS8oOS6hu+8jOS9huS4jeaYr1JDQ2FsbExhbmd1YWdl55qE5p6a5Li+XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5sYW5nICE9PSAndW5kZWZpbmVkJyAmJiAhaXNMYW5ndWFnZShvcHRpb25zLmxhbmchKSkge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ0luaXRpYWxpemF0aW9uIFxcJ2xhbmdcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBjb3JyZWN0IHR5cGUnIH07XG4gIH1cblxuICAvLyDlpoLmnpzkvKDkuobvvIzkvYbkuI3mmK9Mb2dMZXZlbOeahOaemuS4vlxuICBpZiAodHlwZW9mIG9wdGlvbnMubG9nTGV2ZWwgIT09ICd1bmRlZmluZWQnICYmICFpc0xvZ0xldmVsKG9wdGlvbnMubG9nTGV2ZWwhKSkge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ0luaXRpYWxpemF0aW9uIFxcJ2xvZ0xldmVsXFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgY29ycmVjdCB0eXBlJyB9O1xuICB9XG4gIC8vIOWmguaenOS8oOS6hu+8jOS9huS4jeaYr2Z1bmN0aW9u57G75Z6LXG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5sb2dTdGRvdXQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRpb25zLmxvZ1N0ZG91dCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ0luaXRpYWxpemF0aW9uIFxcJ2xvZ1N0ZG91dFxcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIFxcJ2Z1bmN0aW9uXFwnJyB9O1xuICB9XG4gIHJldHVybiB7IHJlc3VsdDogdHJ1ZSB9O1xufTtcblxuLyoqXG4gKiDmoKHpqoxyZWdpc3RlclNlc3Npb25MaXN0ZW5lcuWPguaVsFxuICovXG5leHBvcnQgY29uc3QgdmFsaWRhdGVMaXN0ZW5lciA9IChsaXN0ZW5lcjogSVNlc3Npb25MaXN0ZW5lcik6IElWYWxpZGF0aW9uUmVzdWx0ID0+IHtcbiAgaWYgKCFsaXN0ZW5lcikge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ21pc3NpbmcgcGFyYW1ldGVyIC0+IGxpc3RlbmVyJyB9O1xuICB9XG4gIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnbGlzdGVuZXIgbXVzdCBiZSBhbiBvYmplY3QnIH07XG4gIH1cbiAgY29uc3Qga2V5TmFtZXM6IHN0cmluZ1tdID0gWydvblJpbmdpbmcnLCAnb25BY2NlcHQnLCAnb25IdW5ndXAnLCAnb25UcmFja1JlYWR5J107XG4gIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXMobGlzdGVuZXIpO1xuICBjb25zdCBtaXNzaW5nS2V5czogc3RyaW5nW10gPSBbXTtcbiAga2V5TmFtZXMuZm9yRWFjaCgoa2V5OiBzdHJpbmcpID0+IHtcbiAgICBpZiAoIWtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgbWlzc2luZ0tleXMucHVzaChrZXkpO1xuICAgIH1cbiAgfSk7XG4gIGlmIChtaXNzaW5nS2V5cy5sZW5ndGgpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6IGBtaXNzaW5nIHBhcmFtZXRlciAtPiBcIiR7bWlzc2luZ0tleXMuam9pbignLCcpfVwiYCB9O1xuICB9XG4gIGlmICh0eXBlb2YgbGlzdGVuZXIub25SaW5naW5nICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnb25SaW5naW5nXFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnZnVuY3Rpb25cXCcnIH07XG4gIH1cbiAgaWYgKHR5cGVvZiBsaXN0ZW5lci5vbkFjY2VwdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ29uQWNjZXB0XFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnZnVuY3Rpb25cXCcnIH07XG4gIH1cbiAgaWYgKHR5cGVvZiBsaXN0ZW5lci5vbkh1bmd1cCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ29uSHVuZ3VwXFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnZnVuY3Rpb25cXCcnIH07XG4gIH1cbiAgaWYgKHR5cGVvZiBsaXN0ZW5lci5vblRyYWNrUmVhZHkgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdvblRyYWNrUmVhZHlcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdmdW5jdGlvblxcJycgfTtcbiAgfVxuICByZXR1cm4geyByZXN1bHQ6IHRydWUgfTtcbn07XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZVRhcmdldElkID0gKHRhcmdldElkOiBzdHJpbmcpOiBJVmFsaWRhdGlvblJlc3VsdCA9PiB7XG4gIGlmICh0YXJnZXRJZCAmJiB0eXBlb2YgdGFyZ2V0SWQgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiB0cnVlIH07XG4gIH1cbiAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwndGFyZ2V0SWRcXCcgcGFyYW1ldGVyIGlzIHJlcXVpcmVkLCBtdXN0IGJlIG9mIHR5cGUgXFwnc3RyaW5nXFwnJyB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlTWVkaWFUeXBlID0gKG1lZGlhVHlwZTogbnVtYmVyKTogSVZhbGlkYXRpb25SZXN1bHQgPT4ge1xuICBpZiAobWVkaWFUeXBlID09PSBSQ0NhbGxNZWRpYVR5cGUuQVVESU8gfHwgbWVkaWFUeXBlID09PSBSQ0NhbGxNZWRpYVR5cGUuQVVESU9fVklERU8pIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IHRydWUgfTtcbiAgfVxuICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdtZWRpYVR5cGVcXCcgcGFyYW1ldGVyIGlzIHJlcXVpcmVkLCBtdXN0IGJlIG9mIHR5cGUgXFwnUkNDYWxsTWVkaWFUeXBlXFwnJyB9O1xufTtcbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUV4dHJhID0gKGV4dHJhOiBzdHJpbmcpOiBJVmFsaWRhdGlvblJlc3VsdCA9PiB7XG4gIGlmICh0eXBlb2YgZXh0cmEgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiB0cnVlIH07XG4gIH1cbiAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnZXh0cmFcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdzdHJpbmdcXCcnIH07XG59O1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlUHVzaFRpdGxlID0gKHB1c2hUaXRsZTogc3RyaW5nKTogSVZhbGlkYXRpb25SZXN1bHQgPT4ge1xuICBpZiAodHlwZW9mIHB1c2hUaXRsZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IHRydWUgfTtcbiAgfVxuICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdwdXNoVGl0bGVcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdzdHJpbmdcXCcnIH07XG59O1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlUHVzaENvbnRlbnQgPSAocHVzaENvbnRlbnQ6IHN0cmluZyk6IElWYWxpZGF0aW9uUmVzdWx0ID0+IHtcbiAgaWYgKHR5cGVvZiBwdXNoQ29udGVudCA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IHRydWUgfTtcbiAgfVxuICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdwdXNoQ29udGVudFxcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIFxcJ3N0cmluZ1xcJycgfTtcbn07XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZVB1c2hDb25maWcgPSAocHVzaENvbmZpZzogSVB1c2hDb25maWcpID0+IHtcbiAgY29uc3QgeyBwdXNoVGl0bGUgPSAnJywgcHVzaENvbnRlbnQgPSAnJyB9ID0gcHVzaENvbmZpZztcbiAgY29uc3QgY29uY2x1c2lvbjogSVZhbGlkYXRpb25SZXN1bHRbXSA9IFtdO1xuICBjb25jbHVzaW9uLnB1c2godmFsaWRhdGVQdXNoVGl0bGUocHVzaFRpdGxlKSk7XG4gIGNvbmNsdXNpb24ucHVzaCh2YWxpZGF0ZVB1c2hDb250ZW50KHB1c2hDb250ZW50KSk7XG4gIHJldHVybiBjb25jbHVzaW9uO1xufTtcblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlVXNlcklkcyA9ICh1c2VySWRzOiBzdHJpbmdbXSk6IElWYWxpZGF0aW9uUmVzdWx0ID0+IHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHVzZXJJZHMpKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwndXNlcklkc1xcJyBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQsIG11c3QgYmUgb2YgdHlwZSBcXCdzdHJpbmdbXVxcJycgfTtcbiAgfVxuICBpZiAoIXVzZXJJZHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwndXNlcklkc1xcJyBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQsIG11c3QgYmUgb2YgdHlwZSBcXCdzdHJpbmdbXVxcJycgfTtcbiAgfVxuICBpZiAoIXVzZXJJZHMuZXZlcnkoKHN0cikgPT4gdHlwZW9mIHN0ciA9PT0gJ3N0cmluZycgJiYgc3RyLmxlbmd0aCA+IDApKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwndXNlcklkc1xcJyBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQnIH07XG4gIH1cbiAgcmV0dXJuIHsgcmVzdWx0OiB0cnVlIH07XG59O1xuXG5mdW5jdGlvbiBpc1JDRnJhbWVSYXRlKHZhbDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGFycnMgPSBbJ0ZQU18xMCcsICdGUFNfMTUnLCAnRlBTXzI0JywgJ0ZQU18zMCddO1xuICByZXR1cm4gYXJycy5pbmNsdWRlcyh2YWwpO1xufVxuXG5jb25zdCBpc1ZhbGlkUmVzb2x1dGlvbiA9IChyZXNvbHV0aW9uPzogUkNSZXNvbHV0aW9uKTogYm9vbGVhbiA9PiAhIVJDUmVzb2x1dGlvbltyZXNvbHV0aW9uIV07XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZU1lZGlhU3RyZWFtQ29uc3RyYWludHMgPSAoY29uc3RyYWludHM6IElNZWRpYVN0cmVhbUNvbnN0cmFpbnRzKTogSVZhbGlkYXRpb25SZXN1bHQgPT4ge1xuICBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMuYXVkaW8gJiYgdHlwZW9mIGNvbnN0cmFpbnRzLmF1ZGlvLm1pY3Bob25lSWQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb25zdHJhaW50cy5hdWRpby5taWNwaG9uZUlkICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ2NvbnN0cmFpbnRzLmF1ZGlvLm1pY3Bob25lSWRcXCcgbXVzdCBiZSBvZiB0eXBlIFxcJ3N0cmluZ1xcJycgfTtcbiAgfVxuICBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMuYXVkaW8gJiYgdHlwZW9mIGNvbnN0cmFpbnRzLmF1ZGlvLnNhbXBsZVJhdGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb25zdHJhaW50cy5hdWRpby5zYW1wbGVSYXRlICE9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ2NvbnN0cmFpbnRzLmF1ZGlvLnNhbXBsZVJhdGVcXCcgbXVzdCBiZSBvZiB0eXBlIFxcJ251bWJlclxcJycgfTtcbiAgfVxuICBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMudmlkZW8gJiYgdHlwZW9mIGNvbnN0cmFpbnRzLnZpZGVvLmNhbWVyYUlkICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgY29uc3RyYWludHMudmlkZW8uY2FtZXJhSWQgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnY29uc3RyYWludHMudmlkZW8uY2FtZXJhSWRcXCcgbXVzdCBiZSBvZiB0eXBlIFxcJ3N0cmluZ1xcJycgfTtcbiAgfVxuICAvLyBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMudmlkZW8gJiYgdHlwZW9mIGNvbnN0cmFpbnRzLnZpZGVvLmZhY2VNb2RlICE9PSAndW5kZWZpbmVkJyAmJiBjb25zdHJhaW50cy52aWRlby5jYW1lcmFJZCAhPT0gJ3VzZXInICYmIGNvbnN0cmFpbnRzLnZpZGVvLmZhY2VNb2RlICE9PSAnZW52aXJvbm1lbnQnKSB7XG4gIC8vICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnY29uc3RyYWludHMudmlkZW8uY2FtZXJhSWRcXCcgbXVzdCBiZSAgXFwndXNlclxcJyBvciBcXCdlbnZpcm9ubWVudFxcJycgfVxuICAvLyB9XG5cbiAgaWYgKGNvbnN0cmFpbnRzICYmIGNvbnN0cmFpbnRzLnZpZGVvICYmIHR5cGVvZiBjb25zdHJhaW50cy52aWRlby5mcmFtZVJhdGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb25zdHJhaW50cy52aWRlby5mcmFtZVJhdGUgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnY29uc3RyYWludHMudmlkZW8uZnJhbWVSYXRlXFwnIG11c3QgYmUgb2YgdHlwZSBcXCdzdHJpbmdcXCcnIH07XG4gIH1cblxuICBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMudmlkZW8gJiYgdHlwZW9mIGNvbnN0cmFpbnRzLnZpZGVvLmZyYW1lUmF0ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgIWlzUkNGcmFtZVJhdGUoY29uc3RyYWludHMudmlkZW8uZnJhbWVSYXRlKSkge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ2ZyYW1lUmF0ZVxcJyB2YWx1ZSBpcyBvdXQgb2YgcmFuZ2UnIH07XG4gIH1cblxuICBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMudmlkZW8gJiYgdHlwZW9mIGNvbnN0cmFpbnRzLnZpZGVvLnJlc29sdXRpb24gIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb25zdHJhaW50cy52aWRlby5yZXNvbHV0aW9uICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ2NvbnN0cmFpbnRzLnZpZGVvLmZyYW1lUmF0ZVxcJyBtdXN0IGJlIG9mIHR5cGUgXFwnc3RyaW5nXFwnJyB9O1xuICB9XG5cbiAgaWYgKGNvbnN0cmFpbnRzICYmIGNvbnN0cmFpbnRzLnZpZGVvICYmIHR5cGVvZiBjb25zdHJhaW50cy52aWRlby5yZXNvbHV0aW9uICE9PSAndW5kZWZpbmVkJyAmJiAhaXNWYWxpZFJlc29sdXRpb24oY29uc3RyYWludHMudmlkZW8ucmVzb2x1dGlvbikpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdyZXNvbHV0aW9uXFwnIHZhbHVlIGlzIG91dCBvZiByYW5nZScgfTtcbiAgfVxuICBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMudmlkZW8gJiYgKCFjb25zdHJhaW50cy52aWRlby5mcmFtZVJhdGUgfHwgIWNvbnN0cmFpbnRzLnZpZGVvLnJlc29sdXRpb24pKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwncmVzb2x1dGlvblxcJyBhbmQgXFwncmVzb2x1dGlvblxcJyBpcyByZXF1aXJlZCcgfTtcbiAgfVxuXG4gIHJldHVybiB7IHJlc3VsdDogdHJ1ZSB9O1xufTtcbiIsImV4cG9ydCBjb25zdCB0aW1lclNldFRpbWVvdXQgPSAoZnVuYzogRnVuY3Rpb24sIHRpbWVvdXQ6IG51bWJlcik6IG51bWJlciA9PiBzZXRUaW1lb3V0KGZ1bmMsIHRpbWVvdXQpIGFzIG51bWJlcjtcbiIsImltcG9ydCB7IHRpbWVyU2V0VGltZW91dCB9IGZyb20gJy4vaGVscGVyJztcblxuZXhwb3J0IGNsYXNzIFRpbWVyIHtcbiAgcHJpdmF0ZSBfdGltZXJJZDogbnVtYmVyID0gMFxuXG4gIHByaXZhdGUgX3N0YXJ0VGltZTogbnVtYmVyID0gMFxuXG4gIGNvbnN0cnVjdG9yKGNhbGxiYWNrOiBGdW5jdGlvbiwgdGltZW91dDogbnVtYmVyKSB7XG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICB0aGlzLl90aW1lcklkID0gdGltZXJTZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH0sIHRpbWVvdXQpO1xuICAgIH1cbiAgICB0aGlzLl9zdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICB9XG5cbiAgc3RvcCgpOiB7XG4gICAgc3RhcnRUaW1lOiBudW1iZXIsXG4gICAgZW5kVGltZTogbnVtYmVyLFxuICAgIGR1cmF0aW9uOiBudW1iZXJcbiAgICB9IHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZXJJZCk7XG5cbiAgICBjb25zdCBlbmRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgZHVyYXRpb24gPSBlbmRUaW1lIC0gdGhpcy5fc3RhcnRUaW1lO1xuICAgIGlmICh0aGlzLl9zdGFydFRpbWUgPT09IDApIHtcbiAgICAgIGR1cmF0aW9uID0gMDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3RhcnRUaW1lOiB0aGlzLl9zdGFydFRpbWUsXG4gICAgICBlbmRUaW1lLFxuICAgICAgZHVyYXRpb24sXG4gICAgfTtcbiAgfVxuXG4gIHJlc2V0KCkge1xuICAgIHRoaXMuX3N0YXJ0VGltZSA9IDA7XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbnZlcnNhdGlvblR5cGUsIElMb2dnZXIgfSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQge1xuICBJTWVkaWFNb2RpZnlJbmZvLFxuICBJTWVtYmVyTW9kaWZ5SW5mbyxcbiAgSVNlbmRlckluZm8sXG4gIElTdGF0ZUNoYW5nZUluZm8sXG4gIElVc2VyRGF0YSxcbiAgSVVzZXJTdGF0ZUNoYW5nZUluZm8sXG4gIElJbnZpdGVPcHRpb25zLFxuICBSQ0NhbGxFbmRSZWFzb24sXG4gIFJDQ2FsbEVycm9yQ29kZSxcbiAgUkNDYWxsTWVkaWFUeXBlLFxuICBSQ0NhbGxTZXNzaW9uU3RhdGUsXG4gIFJDQ2FsbFN0YXRlTWFjaGluZSxcbiAgUkNDYWxsVXNlclN0YXRlLFxufSBmcm9tICdAcmMtZW1iZWQvY2FsbC1lbmdpbmUnO1xuaW1wb3J0IHtcbiAgSVJDUlRDU3RhdGVSZXBvcnQsXG4gIFJDS2lja1JlYXNvbixcbiAgUkNMb2NhbFRyYWNrLFxuICBSQ1JlbW90ZUF1ZGlvVHJhY2ssXG4gIFJDUmVtb3RlVHJhY2ssXG4gIFJDUmVtb3RlVmlkZW9UcmFjayxcbiAgUkNSVENDbGllbnQsXG4gIFJDUlRDQ29kZSxcbiAgUkNSVENQaW5nUmVzdWx0LFxuICBSQ1JUQ1Jvb20sXG4gIElNaWNwaG9uZUF1ZGlvUHJvZmlsZSxcbn0gZnJvbSAnQHJvbmdjbG91ZC9wbHVnaW4tcnRjJztcblxuaW1wb3J0IHsgUHJvZHVjZVR5cGVzIH0gZnJvbSAnLi9lbnVtcyc7XG5cbmltcG9ydCB7XG4gIElEZXZpY2VDaGFuZ2VQYXJhbXMsXG4gIElNZWRpYVN0cmVhbUNvbnN0cmFpbnRzLFxuICBJTXV0ZVVzZXIsXG4gIElSQ0NhbGxTZXNzaW9uT3B0aW9ucyxcbiAgSVNlc3Npb25MaXN0ZW5lcixcbiAgSVZhbGlkYXRpb25SZXN1bHQsXG59IGZyb20gJy4vaW50ZXJmYWNlJztcbmltcG9ydCBldmVudEVtaXR0ZXIgZnJvbSAnLi9ldmVudEVtaXR0ZXInO1xuaW1wb3J0IHtcbiAgdmFsaWRhdGVMaXN0ZW5lciwgdmFsaWRhdGVNZWRpYVN0cmVhbUNvbnN0cmFpbnRzLCB2YWxpZGF0ZVVzZXJJZHMsIHZhbGlkYXRlRXh0cmEsIHZhbGlkYXRlUHVzaFRpdGxlLCB2YWxpZGF0ZVB1c2hDb250ZW50LFxufSBmcm9tICcuL3ZhbGlkYXRpb24nO1xuaW1wb3J0IHsgVGltZXIgfSBmcm9tICcuL3RpbWVyJztcblxuZXhwb3J0IGNsYXNzIFJDQ2FsbFNlc3Npb24ge1xuICAvKipcbiAgICogUlRD5oi/6Ze05a6e5L6LXG4gICAqL1xuICBwcml2YXRlIF9yb29tITogUkNSVENSb29tXG5cbiAgLyoqXG4gICAqIOeUqOaIt+S8oOi/m+adpeeahCDlr7lzZXNzaW9u55qE55uR5ZCsICjopoHlnKhSQ0NhbGxDbGllbnTnmoRfb25JbnZpdGXph4zliKTmlq3vvIzopoHmsYLmiafooYzlroxvblNlc3Npb27lv4Xpobvms6jlhoxzZXNzaW9u55qE55uR5ZCs77yM5omA5Lul6L+Z6YeM5pivcHVibGljKVxuICAgKi9cbiAgcHVibGljIF9saXN0ZW5lcjogSVNlc3Npb25MaXN0ZW5lciB8IG51bGwgPSBudWxsXG5cbiAgLyoqXG4gICAqIFJUQ+iuoumYheOAgeWPkeW4g+mHjeivleeahOasoeaVsFxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfUkVUUllDT1VOVDogbnVtYmVyID0gMlxuXG4gIC8qKlxuICAgKiDliqDlhaXmiL/pl7Tlrprml7blmahcbiAgICovXG5cbiAgcHJpdmF0ZSBqb2luUm9vbVRpbWVyOiBhbnkgPSBudWxsXG5cbiAgY29uc3RydWN0b3IoXG5cbiAgICAvKipcbiAgICAgKiDnirbmgIHmnLrlrp7kvotcbiAgICAgKi9cbiAgICBwcml2YXRlIF9zdGF0ZU1hY2hpbmU6IFJDQ2FsbFN0YXRlTWFjaGluZSxcblxuICAgIC8qKlxuICAgICAqIHJ0Y+WunuS+i1xuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3J0Y0NsaWVudDogUkNSVENDbGllbnQsXG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IElMb2dnZXIsXG5cbiAgICAvKipcbiAgICAgKiBzZXNzaW9u55qE5YW25a6D6YCJ6aG5XG4gICAgICovXG4gICAgcHJpdmF0ZSBfb3B0aW9uczogSVJDQ2FsbFNlc3Npb25PcHRpb25zID0ge30sXG5cbiAgKSB7XG4gICAgLy8g55uR5ZCs54q25oCB5py6XG4gICAgdGhpcy5fc3RhdGVNYWNoaW5lLnJlZ2lzdGVyRXZlbnRMaXN0ZW5lcih7XG4gICAgICAvKipcbiAgICAgICAqIOeUqOaIt+eKtuaAgeWPmOabtFxuICAgICAgICogQHBhcmFtIGluZm9cbiAgICAgICAqL1xuICAgICAgb25Vc2VyU3RhdGVDaGFuZ2U6ICh7IHVzZXIsIHJlYXNvbiB9OiBJVXNlclN0YXRlQ2hhbmdlSW5mbykgPT4ge1xuICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBvblVzZXJTdGF0ZUNoYW5nZV0gdXNlcklkLT4ke3VzZXI/LnVzZXJJZH0gc3RhdGUtPiR7dXNlcj8uc3RhdGV9IHJlYXNvbi0+JHtyZWFzb259YCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIOaIv+mXtOeKtuaAgeWPmOabtFxuICAgICAgICogQHBhcmFtXG4gICAgICAgKi9cbiAgICAgIG9uU3RhdGVDaGFuZ2U6IGFzeW5jIChpbmZvOiBJU3RhdGVDaGFuZ2VJbmZvKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgc3RhdGUsIHJlYXNvbiB9ID0gaW5mbztcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gb25TdGF0ZUNoYW5nZV0gOiBzdGF0ZS0+JHtzdGF0ZX0gcmVhc29uLT4ke3JlYXNvbn1gKTtcblxuICAgICAgICAvLyDlpoLmnpzlnKjpgJror53kuK3vvIzlsLHliqDmiL/pl7RcbiAgICAgICAgaWYgKHN0YXRlID09PSBSQ0NhbGxTZXNzaW9uU3RhdGUuS0VFUElORykge1xuICAgICAgICAgIGNvbnN0IHJvb21JZDogc3RyaW5nID0gdGhpcy5fc3RhdGVNYWNoaW5lLmdldENhbGxJZCgpO1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxTZXNzaW9uIG9uU3RhdGVDaGFuZ2VdIHJvb21JZDogJHtyb29tSWR9YCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIOWKoOaIv+mXtFxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fam9pblJvb20ocm9vbUlkKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLk5FVFdPUktfRVJST1IpO1xuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIG9uU3RhdGVDaGFuZ2VdIGpvaW5Sb29tIHRocm93IGV4Y2VwdGlvbiByb29tSWQgLT4gJHtyb29tSWR9YCk7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiAg5Lul5LiL5LiJ5p2h5Y+q6KaB5ruh6Laz5LiA5p2h77yM54q25oCB5Lya5Y+Y5oiQUkNDYWxsU2Vzc2lvblN0YXRlLkVORFxuICAgICAgICAgICAqICAx44CB5pys56uv55So5oi36Ieq5bex5Li75Yqo5oyC5patXG4gICAgICAgICAgICogIDLjgIHmnI3liqHnq6/miormnKznq6/nlKjmiLfouKLlh7pSVEPmiL/pl7RcbiAgICAgICAgICAgKiAgM+OAgeaIv+mXtOmHjOWwj+S6jjLkuKrkurpcbiAgICAgICAgICAgKi9cbiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gUkNDYWxsU2Vzc2lvblN0YXRlLkVORCkge1xuICAgICAgICAgIC8vIOi/mOacquWKoOWFpeaIv+mXtOWwseaMguaWrVxuICAgICAgICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgICAgICAgLy8g6ZSA5q+B5pys5Zyw5rWB77yM5YWz6Zet5pGE5YOP5aS0XG4gICAgICAgICAgICB0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzICYmIHRoaXMuX2Rlc3Ryb3lUcmFja3ModGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyk7XG4gICAgICAgICAgICBjb25zdCBzdW1tYXJ5SW5mbyA9IHRoaXMuX3N0YXRlTWFjaGluZS5nZXRTdW1tYXJ5KCk7XG4gICAgICAgICAgICBldmVudEVtaXR0ZXIuZW1pdCgnc2Vzc2lvbkNsb3NlJywgeyBzZXNzaW9uOiB0aGlzLCBzdW1tYXJ5SW5mbyB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzICYmIHRoaXMuX2Rlc3Ryb3lUcmFja3ModGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyk7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCAnW1JDQ2FsbFNlc3Npb24gb25TdGF0ZUNoYW5nZV0gbG9jYWxUcmFja3MgZGVzdHJveWVkJyk7XG4gICAgICAgICAgdGhpcy5fbGVhdmVSb29tKCk7XG4gICAgICAgICAgdGhpcy5fcm9vbSA9IG51bGwgYXMgdW5rbm93biBhcyBSQ1JUQ1Jvb207XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICog5pS25Yiw5ZON6ZODXG4gICAgICAgKiBAcGFyYW0gc2VuZGVyIOWPkei1t+eUqOaIt+S/oeaBr1xuICAgICAgICovXG4gICAgICBvblJpbmdpbmc6IChzZW5kZXI6IElTZW5kZXJJbmZvKSA9PiB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxTZXNzaW9uIG9uUmluZ2luZ11zZW5kZXI6IHNlbmRlci51c2VySWQgLT4gJHtzZW5kZXIudXNlcklkfWApO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8g6YCa55+l55So5oi35ZON6ZODXG4gICAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uUmluZ2luZyhzZW5kZXIsIHRoaXMpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbiBvblJpbmdpbmddIG1ldGhvZCBleGNlcHRpb24gLT4gb25SaW5naW5nJyk7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICAgKiDlvZPov5znq6/nlKjmiLflkIzmhI/mjqXlkKxcbiAgICAgICAgICovXG4gICAgICBvbkFjY2VwdDogKHNlbmRlcjogSVNlbmRlckluZm8pID0+IHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gb25BY2NlcHRdc2VuZGVyOiBzZW5kZXIudXNlcklkIC0+ICR7c2VuZGVyLnVzZXJJZH1gKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyDpgJrnn6XmnKznq6/vvIzov5znq6/nlKjmiLflt7LmjqXlkKxcbiAgICAgICAgICB0aGlzLl9saXN0ZW5lciEub25BY2NlcHQoc2VuZGVyLCB0aGlzKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbFNlc3Npb24gb25BY2NlcHRdIG1ldGhvZCBleGNlcHRpb24gLT4gb25BY2NlcHQnKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgICAqIOW9k+aciei/nOerr+eUqOaIt+aMguaWrVxuICAgICAgICAgKi9cbiAgICAgIG9uSHVuZ3VwOiAoc2VuZGVyOiBJU2VuZGVySW5mbywgcmVhc29uOiBSQ0NhbGxFbmRSZWFzb24pID0+IHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gb25IdW5ndXBdc2VuZGVyOiBzZW5kZXIudXNlcklkIC0+ICR7c2VuZGVyLnVzZXJJZH0gcmVhc29uLT4ke3JlYXNvbn1gKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyDpgJrnn6XmnKznq6/vvIzov5znq6/nlKjmiLflt7LmjILmlq1cbiAgICAgICAgICB0aGlzLl9saXN0ZW5lciEub25IdW5ndXAoc2VuZGVyLCByZWFzb24sIHRoaXMpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbiBvbkh1bmd1cF0gbWV0aG9kIGV4Y2VwdGlvbiAtPiBvbkh1bmd1cCcpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIOaUtuWIsOS6uuWRmOWPmOabtFxuICAgICAgICogQHBhcmFtIHNlbmRlciDlj5HotbfnlKjmiLfkv6Hmga9cbiAgICAgICAqL1xuICAgICAgb25NZW1iZXJNb2RpZnk6ICh7IHNlbmRlciwgaW52aXRlZFVzZXJzIH06IElNZW1iZXJNb2RpZnlJbmZvKSA9PiB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxTZXNzaW9uIG9uTWVtYmVyTW9kaWZ5XSBzZW5kZXIudXNlcklkIC0+ICR7c2VuZGVyLnVzZXJJZH1gKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyDpgJrnn6XnlKjmiLfkurrlkZjlj5jmm7RcbiAgICAgICAgICB0aGlzLl9saXN0ZW5lciEub25NZW1iZXJNb2RpZnkoc2VuZGVyLCBpbnZpdGVkVXNlcnMsIHRoaXMpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbiBvbk1lbWJlck1vZGlmeV0gbWV0aG9kIGV4Y2VwdGlvbiAtPiBvbk1lbWJlck1vZGlmeScpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIOaUtuWIsOmAmuivneexu+Wei+WPmOabtCAo6YCa6K+d6ZmN57qnKVxuICAgICAgICogQHBhcmFtIHNlbmRlciDlj5HotbfnlKjmiLfkv6Hmga9cbiAgICAgICAqL1xuICAgICAgb25NZWRpYU1vZGlmeTogKHsgc2VuZGVyLCBtZWRpYVR5cGUgfTogSU1lZGlhTW9kaWZ5SW5mbykgPT4ge1xuICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBvbk1lZGlhTW9kaWZ5XXNlbmRlcjogc2VuZGVyLnVzZXJJZCAtPiAke3NlbmRlci51c2VySWR9IG1lZGlhVHlwZTogJHttZWRpYVR5cGV9YCk7XG4gICAgICAgIGlmIChtZWRpYVR5cGUgPT09IFJDQ2FsbE1lZGlhVHlwZS5BVURJTykge1xuICAgICAgICAgIC8vIOi/nOerr+aUtuWIsOmAmuivnemZjee6p+mAmuefpeWQju+8jOi/nOerr+aJp+ihjOmZjee6p+mAmuivnSjkuI3lj5Hmtojmga8pXG4gICAgICAgICAgdGhpcy5fc2V0TWVkaWFUeXBlVG9BdWRpbygpO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uTWVkaWFNb2RpZnkoc2VuZGVyLCBtZWRpYVR5cGUsIHRoaXMpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbiBvbk1lZGlhTW9kaWZ5XSBtZXRob2QgZXhjZXB0aW9uIC0+IG9uTWVkaWFNb2RpZnknKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8qKlxuICAgICAgICog5piv5ZCm6LeoYXBwa2V5XG4gICAgICAgKiBAcGFyYW0gc2VuZGVyIOWPkei1t+eUqOaIt+S/oeaBr1xuICAgICAgICovXG4gICAgICBjcm9zc0FwcGtleTogKGlzQ3Jvc3NBcHBrZXk6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gY3Jvc3NBcHBrZXldIOaYr+WQpui3qCBhcHBrZXk6ICR7aXNDcm9zc0FwcGtleX1gKTtcbiAgICAgICAgdGhpcy5fb3B0aW9ucy5pc0Nyb3NzQXBwa2V5ID0gaXNDcm9zc0FwcGtleTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiDorr7nva7mjILmlq3nmoTmjqjpgIHkv6Hmga9cbiAgICAgKi9cbiAgICBjb25zdCB7IHB1c2hUaXRsZSwgcHVzaENvbnRlbnQgfSA9IHRoaXMuX29wdGlvbnMuaHVuZ3VwUHVzaENvbmZpZyE7XG4gICAgdGhpcy5fc3RhdGVNYWNoaW5lLnNldEh1bmd1cFB1c2hDb25maWcocHVzaFRpdGxlLCBwdXNoQ29udGVudCk7XG4gIH1cblxuICAvKipcbiAgICogIOWKoOWFpeaIv+mXtFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfam9pblJvb20ocm9vbUlkOiBzdHJpbmcpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICBsZXQgY2FsbEJhY2s7XG4gICAgdHJ5IHtcbiAgICAgIC8vIOWKoOaIv+mXtFxuICAgICAgaWYgKHRoaXMuX29wdGlvbnMuaXNDcm9zc0FwcGtleSkge1xuICAgICAgICBjYWxsQmFjayA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5qb2luQ3Jvc3NSVENSb29tKHJvb21JZCwgdGhpcy5fb3B0aW9ucy5qb2luVHlwZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWxsQmFjayA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5qb2luUlRDUm9vbShyb29tSWQsIHRoaXMuX29wdGlvbnMuam9pblR5cGUpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGNvZGUsIHVzZXJJZHMsIHJvb20gfSA9IGNhbGxCYWNrO1xuXG4gICAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgLy8g5aaC5p6c6Z+z6KeG6aKR5pyN5Yqh5pyq5byA6YCaXG4gICAgICAgIGlmIChjb2RlID09PSBSQ1JUQ0NvZGUuTk9UX09QRU5fVklERU9fQVVESU9fU0VSVkVSKSB7XG4gICAgICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLlNFUlZJQ0VfTk9UX09QRU5FRCk7XG4gICAgICAgICAgLy8g5bex5pa55YW25LuW56uv5bey5Zyo6YCa6K+d5LitXG4gICAgICAgIH0gaWYgKGNvZGUgPT09IFJDUlRDQ29kZS5TSUdOQUxfSk9JTl9SVENfUk9PTV9SRUZVU0VEKSB7XG4gICAgICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLk9USEVSX0NMSUVOVF9JTl9DQUxMKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uTkVUV09SS19FUlJPUik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsQ2xpZW50IF9qb2luUm9vbV0gam9pbiByb29tIGZhaWxlZDogcm9vbUlkIC0+ICR7cm9vbUlkfSBSQ1JUQ0NvZGUgLT4gJHtjb2RlfWApO1xuICAgICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuSk9JTl9ST09NX0VSUk9SIH07XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICog6ZKI5a+556eB5pyJ5LqRIEByb25nY2xvdWQvcGx1Z2luLXJ0Y0A1LjEuMTAtZW50ZXJwcmlzZS43IOWinuWKoOihpeS4ge+8jFxuICAgICAgICog56eB5pyJ5LqR5Y2H5a6MIFJUQyBzZGsg54mI5pys5ZCO5Yig5o6J5q2k6KGl5LiBXG4gICAgICAgKiDliqDlrozmiL/pl7TlkI7vvIzlr7nmlrnmjILmlq3kuobvvIzpnIDpgIDlh7rmiL/pl7RcbiAgICAgICAqL1xuICAgICAgaWYgKHRoaXMuX3N0YXRlTWFjaGluZS5nZXRTdGF0ZSgpID09PSBSQ0NhbGxTZXNzaW9uU3RhdGUuRU5EKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5sZWF2ZVJvb20ocm9vbSEpO1xuICAgICAgICB0aGlzLl9yb29tID0gbnVsbCBhcyB1bmtub3duIGFzIFJDUlRDUm9vbTtcbiAgICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MgfTtcbiAgICAgIH1cblxuICAgICAgLy8g6KKr5Y+r5pa55Yqg5YWl5oi/6Ze05oiQ5Yqf77yM5L2G5Li75Y+r5pa55Zyo5Yqg5YWl5oi/6Ze05YmN56a757q/XG4gICAgICBpZiAodXNlcklkcyEubGVuZ3RoIDwgMSkge1xuICAgICAgICB0aGlzLmpvaW5Sb29tVGltZXIgPSBuZXcgVGltZXIoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX2V4Y2VwdGlvbkNsb3NlKFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfTkVUV09SS19FUlJPUik7XG4gICAgICAgIH0sIDYwMDAwKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3Jvb20gPSByb29tIGFzIFJDUlRDUm9vbTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLk5FVFdPUktfRVJST1IpO1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIF9qb2luUm9vbV0gX3J0Y0NsaWVudC5qb2luUlRDUm9vbSB0aHJvdyBleGNlcHRpb24gcm9vbUlkIC0+ICR7cm9vbUlkfWApO1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuSk9JTl9ST09NX0VSUk9SIH07XG4gICAgfVxuXG4gICAgLy8g5oi/6Ze05LiK5rOo5YaM55uR5ZCs5LqL5Lu2XG4gICAgdGhpcy5fcmVnaXN0ZXJSb29tRXZlbnRMaXN0ZW5lcigpO1xuXG4gICAgLy8g5rOo5YaM5oi/6Ze06LSo6YeP5pWw5o2u55uR5ZCs5ZmoXG4gICAgdGhpcy5fcmVnaXN0ZXJSZXBvcnRMaXN0ZW5lcigpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIOiuoumYhei/nOeoi+eahOa1ge+8jOaKiui/nOeoi+eahOa1geaKm+e7meeUqOaIt1xuICAgICAgYXdhaXQgdGhpcy5fc3Vic2NyaWJlSW5Sb29tUmVtb3RlVHJhY2soKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8g57uT5p2f6YCa6K+dc2Vzc2lvblxuICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLlNVQlNDUklCRV9FUlJPUik7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gX2pvaW5Sb29tXSBfc3Vic2NyaWJlSW5Sb29tUmVtb3RlVHJhY2sgRXhjZXB0aW9uIHJvb21JZCAtPiAke3Jvb21JZH1gKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLkpPSU5fUk9PTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyDlvoDmiL/pl7Tph4zlj5HluIPmnKzlnLDotYTmupBcbiAgICAgIGF3YWl0IHRoaXMuX3B1Ymxpc2goKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8g57uT5p2f6YCa6K+dc2Vzc2lvblxuICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLlBVQkxJU0hfRVJST1IpO1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIF9qb2luUm9vbV0gX3B1Ymxpc2ggRXhjZXB0aW9uIHJvb21JZCAtPiAke3Jvb21JZH1gKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLkpPSU5fUk9PTV9FUlJPUiB9O1xuICAgIH1cbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqICjliJ3lp4vljJbmiL/pl7TnmoTml7blgJkpIOiuoumYhei/nOeoi+eahOa1ge+8jOaKiui/nOeoi+eahOa1geaKm+e7meeUqOaIt1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfc3Vic2NyaWJlSW5Sb29tUmVtb3RlVHJhY2soKSB7XG4gICAgLy8g6I635Y+W5omA5pyJ6L+c56iL5bey5Y+R5biD55qE6Z+z6KeG6aKR6LWE5rqQ5YiX6KGoXG4gICAgY29uc3QgdHJhY2tzOiBSQ1JlbW90ZVRyYWNrW10gPSB0aGlzLl9yb29tLmdldFJlbW90ZVRyYWNrcygpO1xuICAgIGlmICh0cmFja3MubGVuZ3RoKSB7XG4gICAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3N1YnNjcmliZVJldHJ5KHRyYWNrcywgdGhpcy5fb3B0aW9ucy5pc0FsbG93U3Vic2NyaWJlUmV0cnksIHRoaXMuX1JFVFJZQ09VTlQpO1xuICAgICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHRoaXMuX2V4Y2VwdGlvbkNsb3NlKFJDQ2FsbEVuZFJlYXNvbi5TVUJTQ1JJQkVfRVJST1IpO1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gX3N1YnNjcmliZUluUm9vbVJlbW90ZVRyYWNrXSBSZXNvdXJjZSBzdWJzY3JpcHRpb24gZmFpbGVkIHJvb21JZCAtPiAke3RoaXMuX3N0YXRlTWFjaGluZS5nZXRDYWxsSWQoKX0gUlRDIGNvZGUgLT4gJHtjb2RlfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDlj6/ku6Xph43or5XnmoTorqLpmIVcbiAgICogQHBhcmFtIHBhcmFtcy50cmFja3MgdHJhY2tzXG4gICAqIEBwYXJhbSBwYXJhbXMuaXNBbGxvd1N1YnNjcmliZVJldHJ5IOaYr+WQpuWFgeiuuOmHjeivlVxuICAgKiBAcGFyYW0gcGFyYW1zLmNvdW50IOWFgeiuuOmHjeivleeahOasoeaVsFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfc3Vic2NyaWJlUmV0cnkodHJhY2tzOiBSQ1JlbW90ZVRyYWNrW10sIGlzQWxsb3dTdWJzY3JpYmVSZXRyeTogYm9vbGVhbiA9IGZhbHNlLCBjb3VudDogbnVtYmVyID0gMCk6IFByb21pc2U8eyBjb2RlOiBSQ1JUQ0NvZGUgfT4ge1xuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fcm9vbS5zdWJzY3JpYmUodHJhY2tzKTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuX2xpc3RlbmVyIS5vblRyYWNrU3Vic2NyaWJlRmFpbCAmJiB0aGlzLl9saXN0ZW5lciEub25UcmFja1N1YnNjcmliZUZhaWwoY29kZSwgdGhpcyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbFNlc3Npb25dIF9saXN0ZW5lci5vblRyYWNrU3Vic2NyaWJlRmFpbCBleGNlcHRpb24nKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB9XG5cbiAgICAgIC8vIOWmguaenOS4jeWFgeiuuOmHjeivle+8jOebtOaOpei/lOWbnlxuICAgICAgaWYgKCFpc0FsbG93U3Vic2NyaWJlUmV0cnkpIHtcbiAgICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgICAgfVxuICAgICAgaWYgKGNvdW50ID4gMCkge1xuICAgICAgICBjb3VudC0tO1xuICAgICAgICByZXR1cm4gdGhpcy5fc3Vic2NyaWJlUmV0cnkodHJhY2tzLCBpc0FsbG93U3Vic2NyaWJlUmV0cnksIGNvdW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWPkeW4g+acrOWcsOi1hOa6kOeahOmAu+i+kVxuICAgKlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfcHVibGlzaCgpIHtcbiAgICBjb25zdCB0cmFja3MgPSB0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzITtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3B1Ymxpc2hSZXRyeSh0cmFja3MsIHRoaXMuX29wdGlvbnMuaXNBbGxvd1B1Ymxpc2hSZXRyeSwgdGhpcy5fUkVUUllDT1VOVCk7XG5cbiAgICAvLyDoi6XotYTmupDlj5HluIPlpLHotKVcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2V4Y2VwdGlvbkNsb3NlKFJDQ2FsbEVuZFJlYXNvbi5QVUJMSVNIX0VSUk9SKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxTZXNzaW9uIF9wdWJsaXN0XSBSZXNvdXJjZSBwdWJsaXNoaW5nIGZhaWxlZDogcm9vbUlkIC0+ICR7dGhpcy5fc3RhdGVNYWNoaW5lLmdldENhbGxJZCgpfSBSQ1JUQ0NvZGUgLT4gJHtjb2RlfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOWmguaenOaYr+S4u+WKqOWPkei1t+eahOWRvOWPq++8jOW3suaPkOWJjeaKm+WHuuS6hui1hOa6kCwg6KKr5Yqo5ZG85Y+r77yM6L+Z6YeM5omN6ZyA6KaB5oqb5Ye6XG4gICAgaWYgKHRoaXMuX29wdGlvbnMucHJvZHVjZVR5cGUgPT09IFByb2R1Y2VUeXBlcy5DQUxMRUUpIHtcbiAgICAgIC8vIOWQkeWkluaKm+WHuuacrOWcsOa1gSwg6YCa55+l5Lia5Yqh5bGCdHJhY2tSZWFkeVxuICAgICAgdGhpcy5fbm90aWZ5VHJhY2tSZWFkeSh0cmFja3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDlj6/ku6Xph43or5XnmoTlj5HluINcbiAgICogQHBhcmFtIHBhcmFtcy50cmFja3MgdHJhY2tzXG4gICAqIEBwYXJhbSBwYXJhbXMuaXNBbGxvd1B1Ymxpc2hSZXRyeSDmmK/lkKblhYHorrjph43or5VcbiAgICogQHBhcmFtIHBhcmFtcy5jb3VudCDlhYHorrjph43or5XnmoTmrKHmlbBcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX3B1Ymxpc2hSZXRyeSh0cmFja3M6IFJDTG9jYWxUcmFja1tdLCBpc0FsbG93UHVibGlzaFJldHJ5OiBib29sZWFuID0gZmFsc2UsIGNvdW50OiBudW1iZXIgPSAwKTogUHJvbWlzZTx7IGNvZGU6IFJDUlRDQ29kZSB9PiB7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9yb29tLnB1Ymxpc2godHJhY2tzKTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuX2xpc3RlbmVyIS5vblRyYWNrUHVibGlzaEZhaWwgJiYgdGhpcy5fbGlzdGVuZXIhLm9uVHJhY2tQdWJsaXNoRmFpbChjb2RlLCB0aGlzKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbl0gX2xpc3RlbmVyLm9uVHJhY2tQdWJsaXNoRmFpbCBleGNlcHRpb24nKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB9XG5cbiAgICAgIC8vIOWmguaenOS4jeWFgeiuuOmHjeivle+8jOebtOaOpei/lOWbnlxuICAgICAgaWYgKCFpc0FsbG93UHVibGlzaFJldHJ5KSB7XG4gICAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICAgIH1cbiAgICAgIGlmIChjb3VudCA+IDApIHtcbiAgICAgICAgY291bnQtLTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1Ymxpc2hSZXRyeSh0cmFja3MsIGlzQWxsb3dQdWJsaXNoUmV0cnksIGNvdW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOmAgOWHuuaIv+mXtFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfbGVhdmVSb29tKCkge1xuICAgIHRyeSB7XG4gICAgICAvLyDpgIDlh7rmiL/pl7RcbiAgICAgIGNvbnN0IGNhbGxCYWNrID0gYXdhaXQgdGhpcy5fcnRjQ2xpZW50LmxlYXZlUm9vbSh0aGlzLl9yb29tKTtcbiAgICAgIC8vIOaIkOWKn+mAgOWHuuaIv+mXtO+8jOinpuWPkVJDQ2FsbENsaWVudOWunuS+i+S4iueahG9uU2Vzc2lvbkNsb3Nl55uR5ZCs77yM5oqb57uZ55So5oi35L+h5oGvXG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBfbGVhdmVSb29tXSBTdWNjZXNzZnVsbHkgZXhpdGVkIHRoZSByb29tIGNvZGU6ICR7Y2FsbEJhY2suY29kZX1gKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxTZXNzaW9uIF9sZWF2ZVJvb21dIGxlYXZlUm9vbSB0aHJvdyBleGNlcHRpb24nKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjb25zdCBzdW1tYXJ5SW5mbyA9IHRoaXMuX3N0YXRlTWFjaGluZS5nZXRTdW1tYXJ5KCk7XG4gICAgICBldmVudEVtaXR0ZXIuZW1pdCgnc2Vzc2lvbkNsb3NlJywgeyBzZXNzaW9uOiB0aGlzLCBzdW1tYXJ5SW5mbyB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5Ye6546w5byC5bi45ZCO6KaB5aSE55CG55qE6YC76L6RLFxuICAgKiBAcGFyYW0gZW5kUmVhc29uIOWOn+WboFxuICAgKi9cbiAgcHJpdmF0ZSBfZXhjZXB0aW9uQ2xvc2UoZW5kUmVhc29uOiBSQ0NhbGxFbmRSZWFzb24pIHtcbiAgICAvLyDplIDmr4HmnKzlnLDmtYFcbiAgICB0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzICYmIHRoaXMuX2Rlc3Ryb3lUcmFja3ModGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyk7XG5cbiAgICAvLyDnu5PmnZ/nirbmgIHmnLpcbiAgICB0aGlzLl9zdGF0ZU1hY2hpbmUuY2xvc2UoZW5kUmVhc29uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnlKjmiLfosIPnlKjnmoTvvIzms6jlhoxzZXNzaW9u5LiK55qE55uR5ZCsXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJTZXNzaW9uTGlzdGVuZXIobGlzdGVuZXI6IElTZXNzaW9uTGlzdGVuZXIpOiB2b2lkIHtcbiAgICAvLyDlhYjmoKHpqoxsaXN0ZW5lciwg5aaC5p6c5LiN6YCa6L+H77yM5LyadHJvdyBlcnJvclxuICAgIGNvbnN0IGNvbmNsdXNpb246IElWYWxpZGF0aW9uUmVzdWx0ID0gdmFsaWRhdGVMaXN0ZW5lcihsaXN0ZW5lcik7XG4gICAgaWYgKCFjb25jbHVzaW9uLnJlc3VsdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBbUkNDYWxsU2Vzc2lvbiByZWdpc3RlclNlc3Npb25MaXN0ZW5lcl0gJHtjb25jbHVzaW9uLm1zZ31gKTtcbiAgICB9XG4gICAgdGhpcy5fbGlzdGVuZXIgPSB7IC4uLmxpc3RlbmVyIH07XG4gIH1cblxuICAvKipcbiAgICog6LCDUlRDIEFQSSDojrflvpfmnKzlnLDmtYFcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2dldExvY2FsVHJhY2tDb3JlKG1lZGlhVHlwZTogUkNDYWxsTWVkaWFUeXBlLCBjb25zdHJhaW50cz86IElNZWRpYVN0cmVhbUNvbnN0cmFpbnRzKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSwgdHJhY2tzPzogUkNMb2NhbFRyYWNrW10gfT4ge1xuICAgIC8vIOajgOa1i+aYr+WQpuiDveWkn+iOt+W+l+acrOWcsOa1gVxuICAgIGlmIChtZWRpYVR5cGUgPT09IFJDQ2FsbE1lZGlhVHlwZS5BVURJTykge1xuICAgICAgY29uc3QgeyBjb2RlLCB0cmFjayB9ID0gYXdhaXQgdGhpcy5fcnRjQ2xpZW50LmNyZWF0ZU1pY3JvcGhvbmVBdWRpb1RyYWNrKCdSb25nQ2xvdWRSVEMnLCBjb25zdHJhaW50cyAmJiBjb25zdHJhaW50cy5hdWRpbyAmJiB7IC4uLmNvbnN0cmFpbnRzLmF1ZGlvIH0pO1xuICAgICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBfZ2V0TG9jYWxUcmFja0NvcmVdIGdldCBBdWRpbyBsb2NhbCB0cmFja3MgZmFpbGVkIFJDVCBjb2RlIC0+ICR7Y29kZX1gKTtcbiAgICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLkdFVF9MT0NBTF9BVURJT19UUkFDS19FUlJPUiB9O1xuICAgICAgfVxuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCAnW1JDQ2FsbFNlc3Npb24gX2dldExvY2FsVHJhY2tDb3JlXSBzdWNjZXNzZnVsbHkgZ2V0IEF1ZGlvIGxvY2FsIHRyYWNrcycpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MsIHRyYWNrczogW3RyYWNrIV0gfTtcbiAgICB9XG4gICAgY29uc3QgeyBjb2RlLCB0cmFja3MgfSA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5jcmVhdGVNaWNyb3Bob25lQW5kQ2FtZXJhVHJhY2tzKCdSb25nQ2xvdWRSVEMnLCBjb25zdHJhaW50cyAmJiB7IC4uLmNvbnN0cmFpbnRzIH0pO1xuICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIF9nZXRMb2NhbFRyYWNrQ29yZV0gZ2V0IEF1ZGlvIGFuZCBWaWRlbyBsb2NhbCB0cmFja3MgZmFpbGVkIFJDVCBjb2RlIC0+ICR7Y29kZX1gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5HRVRfTE9DQUxfQVVESU9fQU5EX1ZJREVPX1RSQUNLX0VSUk9SIH07XG4gICAgfVxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgJ1tSQ0NhbGxTZXNzaW9uIF9nZXRMb2NhbFRyYWNrQ29yZV0gc3VjY2Vzc2Z1bGx5IGdldCBhdWRpbyBhbmQgdmlkZW8gbG9jYWwgdHJhY2tzJyk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MsIHRyYWNrcyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfZ2V0TG9jYWxUcmFjayhtZWRpYVR5cGU6IFJDQ2FsbE1lZGlhVHlwZSwgY29uc3RyYWludHM/OiBJTWVkaWFTdHJlYW1Db25zdHJhaW50cyk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUsIHRyYWNrcz86IFJDTG9jYWxUcmFja1tdIH0+IHtcbiAgICAvLyDlubbkuJTmmK/ojrflvpfpn7Pop4bpopEsIOW5tuS4lCDvvIjlpoLmnpzojrflvpfpn7Pop4bpopHkuI3miJDlip/vvIzlhYHorrjpmY3nuqfojrflvpfpn7PpopHvvIlcbiAgICBpZiAodGhpcy5fb3B0aW9ucy5pc0FsbG93RGVtb3Rpb25HZXRTdHJlYW0gJiYgbWVkaWFUeXBlID09PSBSQ0NhbGxNZWRpYVR5cGUuQVVESU9fVklERU8pIHtcbiAgICAgIGNvbnN0IHsgY29kZSwgdHJhY2tzIH0gPSBhd2FpdCB0aGlzLl9nZXRMb2NhbFRyYWNrQ29yZShSQ0NhbGxNZWRpYVR5cGUuQVVESU9fVklERU8sIGNvbnN0cmFpbnRzKTtcblxuICAgICAgLy8g5aaC5p6c6Z+z6KeG6aKR5LiN6IO96I635b6X77yM5bCx6ZmN57qn6I635b6X6Z+z6aKRXG4gICAgICBpZiAoY29kZSAhPT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgY29uc3QgeyBjb2RlLCB0cmFja3MgfSA9IGF3YWl0IHRoaXMuX2dldExvY2FsVHJhY2tDb3JlKFJDQ2FsbE1lZGlhVHlwZS5BVURJTywgY29uc3RyYWludHMpO1xuICAgICAgICBpZiAoY29kZSAhPT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgICAvLyDojrflj5botYTmupDlpLHotKXvvIzpnIDopoHosIPnirbmgIHmnLpzdGF0ZSDkuLogZW5kXG4gICAgICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLkdFVF9NRURJQV9SRVNPVVJDRVNfRVJST1IpO1xuICAgICAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBjb2RlLCB0cmFja3MgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGNvZGUsIHRyYWNrcyB9O1xuICAgIH1cbiAgICBjb25zdCB7IGNvZGU6IF9jb2RlLCB0cmFja3MgfSA9IGF3YWl0IHRoaXMuX2dldExvY2FsVHJhY2tDb3JlKG1lZGlhVHlwZSwgY29uc3RyYWludHMpO1xuICAgIGlmIChfY29kZSAhPT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIC8vIOiOt+WPlui1hOa6kOWksei0pe+8jOmcgOimgeiwg+eKtuaAgeacunN0YXRlIOS4uiBlbmRcbiAgICAgIHRoaXMuX2V4Y2VwdGlvbkNsb3NlKFJDQ2FsbEVuZFJlYXNvbi5HRVRfTUVESUFfUkVTT1VSQ0VTX0VSUk9SKTtcblxuICAgICAgcmV0dXJuIHsgY29kZTogX2NvZGUgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZTogX2NvZGUsIHRyYWNrcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOmAmuivneS4reabtOaNoumfs+mikeiuvuWkh1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGNoYW5nZUF1ZGlvRGV2aWNlKGF1ZGlvQ29uc3RyYWludHM/OiBJTWljcGhvbmVBdWRpb1Byb2ZpbGUpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICAvLyDmlrDorr7lpIfnmoR0cmFja1xuICAgIGNvbnN0IHJlY2VudFRyYWNrczogUkNMb2NhbFRyYWNrW10gPSBbXTtcblxuICAgIC8vIOaVtOeQhuWQjueahOacrOWcsHRyYWNrXG4gICAgY29uc3QgbG9jYWxUcmFja3M6IFJDTG9jYWxUcmFja1tdID0gW107XG4gICAgY29uc3QgeyBjb2RlLCB0cmFjayB9ID0gYXdhaXQgdGhpcy5fcnRjQ2xpZW50LmNyZWF0ZU1pY3JvcGhvbmVBdWRpb1RyYWNrKCdSb25nQ2xvdWRSVEMnLCBhdWRpb0NvbnN0cmFpbnRzKTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBjaGFuZ2VEZXZpY2VdIGdldCBsb2NhbCBBdWRpbyB0cmFja3MgZmFpbGVkIFJDVExpYiBjb2RlIC0+ICR7Y29kZX1gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5HRVRfTE9DQUxfQVVESU9fVFJBQ0tfRVJST1IgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzICYmIHRoaXMuX29wdGlvbnMubG9jYWxUcmFja3MuZm9yRWFjaCgodHJhY2s6IFJDTG9jYWxUcmFjaykgPT4ge1xuICAgICAgaWYgKHRyYWNrLmlzQXVkaW9UcmFjaygpKSB7XG4gICAgICAgIC8vIOS5i+WJjeeahOmfs+mikemDvemUgOavge+8jO+8iFJUQ0xpYiBTREvlhoXpg6jkvJrlnKggYWRkTG9jYWxUcmFjayDmuIXnkIblkIznsbvlnovovajpgZPmlbDmja7vvIzmiYDku6Xov5nph4zms6jph4rmjonvvIlcbiAgICAgICAgLy8gdHJhY2suZGVzdHJveSgpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDlj6rmiorkuYvliY3nmoTop4bpopHnlZnkuItcbiAgICAgICAgbG9jYWxUcmFja3MucHVzaCh0cmFjayk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZWNlbnRUcmFja3MucHVzaCh0cmFjayEpO1xuXG4gICAgLy8g5Yqg5LiK5pys5Zyw5paw5Lqn55Sf55qE6Z+z6aKRXG4gICAgbG9jYWxUcmFja3MucHVzaCh0cmFjayEpO1xuICAgIHRoaXMuX29wdGlvbnMubG9jYWxUcmFja3MgPSBsb2NhbFRyYWNrcztcbiAgICAvLyDpgJrnn6XkuJrliqHlsYJ0cmFja1JlYWR5XG4gICAgdGhpcy5fbm90aWZ5VHJhY2tSZWFkeShyZWNlbnRUcmFja3MpO1xuXG4gICAgLy8g5aaC5p6c5b2T5YmN5bey5Yqg5YWl5oi/6Ze077yM5Y+R5biD5paw5rWBXG4gICAgaWYgKHRoaXMuX3Jvb20pIHtcbiAgICAgIC8vIOWPkeW4g+aWsOa1gVxuICAgICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9yb29tLnB1Ymxpc2gocmVjZW50VHJhY2tzKTtcbiAgICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuQVVESU9fUFVCTElTSF9FUlJPUiB9O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOe+pOWRvOWPq+S4ree7p+e7remCgOivt1xuICAgKiBAcGFyYW0gdXNlcklkcyDooqvpgoDor7fnlKjmiLcgSUQg5YiX6KGoXG4gICAqIEBwYXJhbSBvcHRpb25zLmV4dHJhIOa2iOaBr+eahOaJqeWxleS/oeaBr1xuICAgKiBAZGVwcmVjYXRlZCA1LjEuMiDlup/lvIMgb3B0aW9ucy5wdXNoVGl0bGUg6YCa55+l55qE5qCH6aKYXG4gICAqIEBkZXByZWNhdGVkIDUuMS4yIOW6n+W8gyBvcHRpb25zLnB1c2hDb250ZW50IOmAmuefpeWGheWuuVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGludml0ZSh1c2VySWRzOiBzdHJpbmdbXSwgb3B0aW9uczogSUludml0ZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUgfT4ge1xuICAgIGNvbnN0IHsgZXh0cmEgPSAnJyB9ID0gb3B0aW9ucztcbiAgICBjb25zdCB7IHB1c2hUaXRsZSA9ICcnLCBwdXNoQ29udGVudCA9ICcnIH0gPSAodGhpcy5fb3B0aW9ucy5jYWxsUHVzaENvbmZpZz8ucHVzaFRpdGxlIHx8IHRoaXMuX29wdGlvbnMuY2FsbFB1c2hDb25maWc/LnB1c2hDb250ZW50KSA/IHRoaXMuX29wdGlvbnMuY2FsbFB1c2hDb25maWcgOiBvcHRpb25zO1xuICAgIGNvbnN0IGNvbmNsdXNpb246IElWYWxpZGF0aW9uUmVzdWx0W10gPSBbdmFsaWRhdGVVc2VySWRzKHVzZXJJZHMpLCB2YWxpZGF0ZUV4dHJhKGV4dHJhKSwgdmFsaWRhdGVQdXNoVGl0bGUocHVzaFRpdGxlKSwgdmFsaWRhdGVQdXNoQ29udGVudChwdXNoQ29udGVudCldO1xuICAgIGNvbnN0IG1lc3NhZ2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHJlc3VsdCA9IGNvbmNsdXNpb24uZXZlcnkoKG9iajogSVZhbGlkYXRpb25SZXN1bHQpID0+IHtcbiAgICAgICFvYmoucmVzdWx0ICYmIG1lc3NhZ2VzLnB1c2gob2JqLm1zZyEpO1xuICAgICAgcmV0dXJuIG9iai5yZXN1bHQ7XG4gICAgfSk7XG5cbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBbUkNDYWxsQ2xpZW50IGludml0ZV0gJHttZXNzYWdlcy5qb2luKCdcXG4nKX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3N0YXRlTWFjaGluZS5pbnZpdGUodXNlcklkcywgeyBleHRyYSwgcHVzaFRpdGxlLCBwdXNoQ29udGVudCB9KTtcbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog5ZCM5oSP5o6l5ZCsXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgYWNjZXB0KGNvbnN0cmFpbnRzPzogSU1lZGlhU3RyZWFtQ29uc3RyYWludHMpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICBjb25zdCBjb25jbHVzaW9uOiBJVmFsaWRhdGlvblJlc3VsdCA9IHZhbGlkYXRlTWVkaWFTdHJlYW1Db25zdHJhaW50cyhjb25zdHJhaW50cyEpO1xuICAgIGlmICghY29uY2x1c2lvbi5yZXN1bHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW1JDQ2FsbFNlc3Npb24gYWNjZXB0XSAke2NvbmNsdXNpb24ubXNnfWApO1xuICAgIH1cblxuICAgIC8vIOaOpeWQrOS5i+WJje+8jOWFiOaMguaWreW9k+WJjeS5i+WklueahHNlc3Npb27vvIznjrDpmLbmrrXkuI3lhYHorrjnlKjmiLflhYjmi6nmjqXlkKxzZXNzaW9u77yM5LqL5YWI5Lya5Zyo54q25oCB5py65YaF6YOo5oyC5pat77yM6L+Z6YeM5oqb5Ye65Y6777yM5Lya5riF55CG5YW25a6D55qEc2Vlc2lvblxuICAgIGV2ZW50RW1pdHRlci5lbWl0KCdodW5ndXBPdGhlclNlc3Npb24nLCB7IHNlc3Npb246IHRoaXMgfSk7XG4gICAgY29uc3QgbWVkaWFUeXBlID0gdGhpcy5fc3RhdGVNYWNoaW5lLmdldE1lZGlhVHlwZSgpO1xuICAgIGNvbnN0IHsgY29kZTogX2NvZGUsIHRyYWNrcyB9ID0gYXdhaXQgdGhpcy5fZ2V0TG9jYWxUcmFjayhtZWRpYVR5cGUsIGNvbnN0cmFpbnRzKTtcbiAgICBpZiAoX2NvZGUgIT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBfY29kZSB9O1xuICAgIH1cbiAgICB0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzID0gdHJhY2tzO1xuXG4gICAgLy8g5Y+R6YCB5o6l5ZCs55qE5raI5oGvXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9zdGF0ZU1hY2hpbmUuYWNjZXB0KCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gYWNjZXB0XVNlbmQgYWNjZXB0IG1lc3NhZ2UgZmFpbGVkIC0+IGNvZGU6ICR7Y29kZX1gKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOaMguaWrVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGh1bmd1cCgpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlOyB9PiB7XG4gICAgLy8gY29uc3Qgc3VtbWFyeUluZm8gPSB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0U3VtbWFyeSgpXG4gICAgLy8gZXZlbnRFbWl0dGVyLmVtaXQoJ3Nlc3Npb25DbG9zZScsIHsgc2Vzc2lvbjogdGhpcywgc3VtbWFyeUluZm8gfSlcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVNYWNoaW5lLmh1bmd1cCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOmAmuivneWqkuS9k+WPmOabtFxuICAgKiAgQHBhcmFtIG1lZGlhVHlwZSBSQ0NhbGxNZWRpYVR5cGUuQVVESU8g5pS55Li66Z+z6aKR6YCa6K+dIHwgUkNDYWxsTWVkaWFUeXBlLkFVRElPX1ZJREVPIOaUueS4uumfs+inhumikemAmuivnVxuICAgKi9cbiAgcHVibGljIGFzeW5jIF9jaGFuZ2VNZWRpYVR5cGUobWVkaWFUeXBlOiBSQ0NhbGxNZWRpYVR5cGUpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3N0YXRlTWFjaGluZS5jaGFuZ2VNZWRpYVR5cGUobWVkaWFUeXBlKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBfY2hhbmdlTWVkaWFUeXBlXSBjaGFuZ2UgbWVkaWEgdHlwZSBmYWlsIGNvZGUtPiAke2NvZGV9YCk7XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflvpfmnKzlnLDop4bpopFcbiAgICovXG4gIHByaXZhdGUgX2dldExvY2FsVmlkZW9UcmFja3MoKTogUkNMb2NhbFRyYWNrW10ge1xuICAgIGxldCBsb2NhbFZpZGVvVHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSA9IFtdO1xuICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgcmV0dXJuIGxvY2FsVmlkZW9UcmFja3M7XG4gICAgfVxuICAgIGlmICh0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzKSB7XG4gICAgICBsb2NhbFZpZGVvVHJhY2tzID0gdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcy5maWx0ZXIoKHRyYWNrKSA9PiB0cmFjay5pc1ZpZGVvVHJhY2soKSk7XG4gICAgfVxuICAgIHJldHVybiBsb2NhbFZpZGVvVHJhY2tzO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+W+l+acrOWcsOmfs+mikVxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0TG9jYWxBdWRpb1RyYWNrcygpOiBSQ0xvY2FsVHJhY2tbXSB7XG4gICAgbGV0IGxvY2FsQXVkaW90cmFja3M6IFJDTG9jYWxUcmFja1tdID0gW107XG4gICAgaWYgKCF0aGlzLl9yb29tKSB7XG4gICAgICByZXR1cm4gbG9jYWxBdWRpb3RyYWNrcztcbiAgICB9XG4gICAgaWYgKHRoaXMuX29wdGlvbnMubG9jYWxUcmFja3MpIHtcbiAgICAgIGxvY2FsQXVkaW90cmFja3MgPSB0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzLmZpbHRlcigodHJhY2spID0+IHRyYWNrLmlzQXVkaW9UcmFjaygpKTtcbiAgICB9XG4gICAgcmV0dXJuIGxvY2FsQXVkaW90cmFja3M7XG4gIH1cblxuICAvKipcbiAgICog5oqK6YCa6K+d55qETWVkaWFUeXBl5Y2H57qn5Yiw6Z+z6KeG6aKRXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9zZXRNZWRpYVR5cGVUb0F1ZGlvQW5kVmlkZW8oKSB7XG4gICAgLy8g6I635b6X5pys56uv6KeG6aKR6LWE5rqQXG4gICAgY29uc3QgeyBjb2RlLCB0cmFjayB9ID0gYXdhaXQgdGhpcy5fcnRjQ2xpZW50LmNyZWF0ZUNhbWVyYVZpZGVvVHJhY2soKTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5HRVRfTE9DQUxfQVVESU9fQU5EX1ZJREVPX1RSQUNLX0VSUk9SIH07XG4gICAgfVxuXG4gICAgLy8g5Y+R5biD5pys56uv6KeG6aKR6LWE5rqQXG4gICAgY29uc3QgeyBjb2RlOiBfY29kZSB9ID0gYXdhaXQgdGhpcy5fcm9vbS5wdWJsaXNoKFt0cmFjayFdKTtcblxuICAgIC8vIOiLpei1hOa6kOWPkeW4g+Wksei0pVxuICAgIGlmIChfY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBfZW5hYmxlVmlkZW9dIFJlc291cmNlIHB1Ymxpc2hpbmcgZmFpbGVkOiBSQ1JUQ0NvZGUgLT4gJHtjb2RlfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOmAmuefpeS4muWKoeWxgnRyYWNrUmVhZHlcbiAgICB0aGlzLl9ub3RpZnlUcmFja1JlYWR5KFt0cmFjayFdKTtcblxuICAgIC8vIOWPkea2iOaBr1xuICAgIHRoaXMuX2NoYW5nZU1lZGlhVHlwZShSQ0NhbGxNZWRpYVR5cGUuQVVESU9fVklERU8pO1xuICB9XG5cbiAgLyoqXG4gICAqIOaKiumAmuivneeahE1lZGlhVHlwZemZjee6p+WIsOmfs+mikVxuICAgKiBAcGFyYW0gaXNTZW5kTWVzc3NhZ2Ug5piv5ZCm6ZyA6KaB5Y+R5raI5oGvLCDpu5jorqTlj5Hmtojmga9cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX3NldE1lZGlhVHlwZVRvQXVkaW8oKSB7XG4gICAgY29uc3QgdHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSA9IHRoaXMuX2dldExvY2FsVmlkZW9UcmFja3MoKTtcbiAgICBpZiAodHJhY2tzLmxlbmd0aCkge1xuICAgICAgLy8g56aB55So6KeG6aKRXG4gICAgICB0cmFja3MuZm9yRWFjaCgodHJhY2s6IFJDTG9jYWxUcmFjaykgPT4ge1xuICAgICAgICB0cmFjay5tdXRlKCk7XG4gICAgICB9KTtcblxuICAgICAgLy8g5Y+W5raI5Y+R5biD6KeG6aKRXG4gICAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3Jvb20udW5wdWJsaXNoKHRyYWNrcyk7XG4gICAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIGRpc2FibGVWaWRlb10gdW5wdWJsaXNoIGZhaWxlZCAtPiAke2NvZGV9YCk7XG4gICAgICB9XG5cbiAgICAgIC8vIOWFs+mXreaRhOWDj+WktFxuICAgICAgdGhpcy5fZGVzdHJveVRyYWNrcyh0cmFja3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDpgJror53pmY3nuqfvvIznm67liY3pnIDmsYLlj6rlgZrpgJror53pmY3nuqfvvIzpn7Pop4bpopHlj6/ku6XpmY3nuqfkuLrpn7PpopHvvIzpn7PpopHkuI3og73ljYfliLDpn7Pop4bpopEsIOWPkea2iOaBr+aIkOWKn+aJjeeul+mZjee6p+aIkOWKn1xuICAgKlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRlc2NlbmRBYmlsaXR5KCk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUgfT4ge1xuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fY2hhbmdlTWVkaWFUeXBlKFJDQ2FsbE1lZGlhVHlwZS5BVURJTyk7XG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9zZXRNZWRpYVR5cGVUb0F1ZGlvKCk7XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnpoHnlKjop4bpopF0cmFja1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGRpc2FibGVWaWRlb1RyYWNrKCk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUgfT4ge1xuICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIGRpc2FibGVBdWRpb1RyYWNrXSBSb29tIG1pc3NpbmcgYXVkaW8gdHJhY2sgLT4gJHtSQ0NhbGxFcnJvckNvZGUuTk9UX0lOX1JPT01fRVJST1J9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuTk9UX0lOX1JPT01fRVJST1IgfTtcbiAgICB9XG5cbiAgICBjb25zdCB0cmFja3M6IFJDTG9jYWxUcmFja1tdID0gdGhpcy5fZ2V0TG9jYWxWaWRlb1RyYWNrcygpO1xuICAgIGlmICghdHJhY2tzLmxlbmd0aCkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIGRpc2FibGVWaWRlb1RyYWNrXSBSb29tIG1pc3NpbmcgdmlkZW8gdHJhY2sgLT4gJHtSQ0NhbGxFcnJvckNvZGUuTUlTU0lOR19WSURFT19UUkFDS19FUlJPUn1gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5NSVNTSU5HX1ZJREVPX1RSQUNLX0VSUk9SIH07XG4gICAgfVxuXG4gICAgLy8g56aB55So6KeG6aKRXG4gICAgdHJhY2tzLmZvckVhY2goKHRyYWNrOiBSQ0xvY2FsVHJhY2spID0+IHtcbiAgICAgIHRyYWNrLm11dGUoKTtcbiAgICB9KTtcblxuICAgIC8vIOWmguaenOS4jemcgOWFs+mXreaRhOWDj+WktFxuICAgIGlmICghdGhpcy5fb3B0aW9ucy5pc09mZkNhbWVyYVdoZW5WaWRlb0Rpc2FibGUpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTIH07XG4gICAgfVxuXG4gICAgLy8g5Y+W5raI5Y+R5biD6KeG6aKRXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9yb29tLnVucHVibGlzaCh0cmFja3MpO1xuICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIGRpc2FibGVWaWRlb10gdW5wdWJsaXNoIGZhaWxlZCAtPiAke2NvZGV9YCk7XG5cbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5VTlBVQkxJU0hfVklERU9fRVJST1IgfTtcbiAgICB9XG5cbiAgICB0cmFja3MuZm9yRWFjaCgodHJhY2s6IFJDTG9jYWxUcmFjaykgPT4ge1xuICAgICAgLy8g5YWz6Zet5pGE5YOP5aS0XG4gICAgICB0cmFjay5kZXN0cm95KCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWQr+eUqOinhumikXRyYWNrXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZW5hYmxlVmlkZW9UcmFjaygpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICBpZiAoIXRoaXMuX3Jvb20pIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBkaXNhYmxlQXVkaW9UcmFja10gUm9vbSBtaXNzaW5nIGF1ZGlvIHRyYWNrIC0+ICR7UkNDYWxsRXJyb3JDb2RlLk5PVF9JTl9ST09NX0VSUk9SfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLk5PVF9JTl9ST09NX0VSUk9SIH07XG4gICAgfVxuXG4gICAgLy8g5aaC5p6c5LiN6ZyA5YWz6Zet5pGE5YOP5aS0XG4gICAgaWYgKCF0aGlzLl9vcHRpb25zLmlzT2ZmQ2FtZXJhV2hlblZpZGVvRGlzYWJsZSkge1xuICAgICAgY29uc3QgdHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSA9IHRoaXMuX2dldExvY2FsVmlkZW9UcmFja3MoKTtcbiAgICAgIGlmICghdHJhY2tzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gRW5hYmxlVmlkZW9UcmFja10gUm9vbSBtaXNzaW5nIHZpZGVvIHRyYWNrIC0+ICR7UkNDYWxsRXJyb3JDb2RlLk1JU1NJTkdfVklERU9fVFJBQ0tfRVJST1J9YCk7XG4gICAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5NSVNTSU5HX1ZJREVPX1RSQUNLX0VSUk9SIH07XG4gICAgICB9XG5cbiAgICAgIC8vIOWQr+eUqOinhumikVxuICAgICAgdHJhY2tzLmZvckVhY2goKHRyYWNrOiBSQ0xvY2FsVHJhY2spID0+IHtcbiAgICAgICAgdHJhY2sudW5tdXRlKCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTIH07XG4gICAgfVxuXG4gICAgLy8g6I635b6X5pys56uv6KeG6aKR6LWE5rqQXG4gICAgY29uc3QgeyBjb2RlLCB0cmFjayB9ID0gYXdhaXQgdGhpcy5fcnRjQ2xpZW50LmNyZWF0ZUNhbWVyYVZpZGVvVHJhY2soKTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBFbmFibGVWaWRlb1RyYWNrXSBHZXQgUmVzb3VyY2UgZmFpbGVkOiBSQ1JUQ0NvZGUgLT4gJHtjb2RlfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLkdFVF9MT0NBTF9WSURFT19UUkFDS19FUlJPUiB9O1xuICAgIH1cbiAgICBjb25zdCBsb2NhbFRyYWNrczogUkNMb2NhbFRyYWNrW10gPSBbXTtcbiAgICB0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzICYmIHRoaXMuX29wdGlvbnMubG9jYWxUcmFja3MuZm9yRWFjaCgodHJhY2s6IFJDTG9jYWxUcmFjaykgPT4ge1xuICAgICAgaWYgKHRyYWNrLmlzVmlkZW9UcmFjaygpKSB7XG4gICAgICAgIC8vIOS5i+WJjeeahOinhumikemDvemUgOavgVxuICAgICAgICB0cmFjay5kZXN0cm95KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDlj6rnlZnkuIvkuYvliY3nmoTpn7PpopFcbiAgICAgICAgbG9jYWxUcmFja3MucHVzaCh0cmFjayk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyDliqDkuIrmnKzlnLDmlrDkuqfnlJ/nmoTop4bpopFcbiAgICBsb2NhbFRyYWNrcy5wdXNoKHRyYWNrISk7XG4gICAgdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyA9IGxvY2FsVHJhY2tzO1xuXG4gICAgLy8g5Li65LqG6Kem5Y+R5a+55pa555qEb25WaWRlb011dGVDaGFuZ2Ug5YWI56aB55SoXG4gICAgdHJhY2shLm11dGUoKTtcblxuICAgIC8vIOWPkeW4g+acrOerr+inhumikei1hOa6kFxuICAgIGNvbnN0IHsgY29kZTogX2NvZGUgfSA9IGF3YWl0IHRoaXMuX3Jvb20ucHVibGlzaChbdHJhY2shXSk7XG5cbiAgICAvLyDoi6XotYTmupDlj5HluIPlpLHotKVcbiAgICBpZiAoX2NvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gRW5hYmxlVmlkZW9UcmFja10gUmVzb3VyY2UgcHVibGlzaGluZyBmYWlsZWQ6IFJDUlRDQ29kZSAtPiAke2NvZGV9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuVklERU9fUFVCTElTSF9FUlJPUiB9O1xuICAgIH1cblxuICAgIC8vIOWQr+eUqFxuICAgIHRyYWNrIS51bm11dGUoKTtcblxuICAgIC8vIOmAmuefpeS4muWKoeWxgnRyYWNrUmVhZHlcbiAgICB0aGlzLl9ub3RpZnlUcmFja1JlYWR5KFt0cmFjayFdKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOemgeeUqOmfs+mikXRyYWNrXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGlzYWJsZUF1ZGlvVHJhY2soKSB7XG4gICAgaWYgKCF0aGlzLl9yb29tKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gZGlzYWJsZUF1ZGlvVHJhY2tdIFJvb20gbWlzc2luZyBhdWRpbyB0cmFjayAtPiAke1JDQ2FsbEVycm9yQ29kZS5OT1RfSU5fUk9PTV9FUlJPUn1gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5OT1RfSU5fUk9PTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGNvbnN0IHRyYWNrczogUkNMb2NhbFRyYWNrW10gPSB0aGlzLl9nZXRMb2NhbEF1ZGlvVHJhY2tzKCk7XG5cbiAgICAvLyDnpoHnlKjpn7PpopFcbiAgICB0cmFja3MuZm9yRWFjaCgodHJhY2s6IFJDTG9jYWxUcmFjaykgPT4ge1xuICAgICAgdHJhY2subXV0ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOWQr+eUqOmfs+mikXRyYWNrXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZW5hYmxlQXVkaW9UcmFjaygpIHtcbiAgICBpZiAoIXRoaXMuX3Jvb20pIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBkaXNhYmxlQXVkaW9UcmFja10gUm9vbSBtaXNzaW5nIGF1ZGlvIHRyYWNrIC0+ICR7UkNDYWxsRXJyb3JDb2RlLk5PVF9JTl9ST09NX0VSUk9SfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLk5PVF9JTl9ST09NX0VSUk9SIH07XG4gICAgfVxuXG4gICAgY29uc3QgdHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSA9IHRoaXMuX2dldExvY2FsQXVkaW9UcmFja3MoKTtcblxuICAgIGlmICghdHJhY2tzLmxlbmd0aCkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIGRpc2FibGVBdWRpb1RyYWNrXSBSb29tIG1pc3NpbmcgYXVkaW8gdHJhY2sgLT4gJHtSQ0NhbGxFcnJvckNvZGUuTUlTU0lOR19WSURFT19UUkFDS19FUlJPUn1gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5NSVNTSU5HX1ZJREVPX1RSQUNLX0VSUk9SIH07XG4gICAgfVxuXG4gICAgLy8g5ZCv55So6Z+z6aKRXG4gICAgdHJhY2tzLmZvckVhY2goKHRyYWNrOiBSQ0xvY2FsVHJhY2spID0+IHtcbiAgICAgIHRyYWNrLnVubXV0ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOmUgOavgeacrOWcsOa1gVxuICAgKi9cbiAgcHJpdmF0ZSBfZGVzdHJveVRyYWNrcyh0cmFja3M6IFJDTG9jYWxUcmFja1tdKSB7XG4gICAgdHJhY2tzLmZvckVhY2goKHRyYWNrOiBSQ0xvY2FsVHJhY2spID0+IHtcbiAgICAgIHRyYWNrLmRlc3Ryb3koKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlkJHlpJbmipvlh7rmnKzlnLDmtYFcbiAgICovXG4gIHByaXZhdGUgX25vdGlmeVRyYWNrUmVhZHkodHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSB8IFJDUmVtb3RlVHJhY2tbXSkge1xuICAgIHRyYWNrcy5mb3JFYWNoKCh0cmFjazogUkNMb2NhbFRyYWNrIHwgUkNSZW1vdGVUcmFjaykgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uVHJhY2tSZWFkeSh0cmFjaywgdGhpcyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbFNlc3Npb24gX25vdGlmeVRyYWNrUmVhZHldIF9saXN0ZW5lciBvblRyYWNrUmVhZHkgZXhjZXB0aW9uJyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOaIv+mXtOS4iuazqOWGjOS6i+S7tlxuICAgKi9cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJSb29tRXZlbnRMaXN0ZW5lcigpIHtcbiAgICB0aGlzLl9yb29tLnJlZ2lzdGVyUm9vbUV2ZW50TGlzdGVuZXIoXG4gICAgICB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiDmnKznq6/ooqvouKLlh7rmiL/pl7Tml7bop6blj5FcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIOiiq+i4ouWHuuaIv+mXtOWPr+iDveaYr+eUseS6juacjeWKoeerr+i2heWHuuS4gOWumuaXtumXtOacquiDveaUtuWIsCBydGNQaW5nIOa2iOaBr++8jOaJgOS7peiupOS4uuW3seaWueemu+e6v+OAglxuICAgICAgICAgKiDlj6bkuIDnp43lj6/og73mmK/lt7HmlrkgcnRjUGluZyDlpLHotKXmrKHmlbDotoXlh7rkuIrpmZDvvIzmlYXogIzkuLvliqjmlq3nur9cbiAgICAgICAgICogQHBhcmFtIGJ5U2VydmVyXG4gICAgICAgICAqIOW9k+WAvOS4uiBmYWxzZSDml7bvvIzor7TmmI7mnKznq68gcnRjUGluZyDotoXml7ZcbiAgICAgICAgICog5b2T5YC85Li6IHRydWUg5pe277yM6K+05piO5pys56uv5pS25Yiw6KKr6Lii5Ye65oi/6Ze06YCa55+lXG4gICAgICAgICAqL1xuICAgICAgICBvbktpY2tPZmY6IChieVNlcnZlcjogYm9vbGVhbiwgc3RhdGU/OiBSQ0tpY2tSZWFzb24gfCB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50VXNlcklkOiBzdHJpbmcgPSB0aGlzLl9ydGNDbGllbnQuZ2V0Q3VycmVudElkKCk7XG4gICAgICAgICAgdGhpcy5fc3RhdGVNYWNoaW5lLnVzZXJMZWF2ZShbY3VycmVudFVzZXJJZF0pO1xuXG4gICAgICAgICAgaWYgKCFieVNlcnZlcikge1xuICAgICAgICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLk5FVFdPUktfRVJST1IpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoc3RhdGUgPT09IFJDS2lja1JlYXNvbi5TRVJWRVJfS0lDSykge1xuICAgICAgICAgICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uS0lDS0VEX0JZX1NFUlZFUik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RhdGUgPT09IFJDS2lja1JlYXNvbi5PVEhFUl9LSUNLKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2V4Y2VwdGlvbkNsb3NlKFJDQ2FsbEVuZFJlYXNvbi5PVEhFUl9DTElFTlRfSk9JTkVEX0NBTEwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOaOpeaUtuWIsOaIv+mXtOS/oeS7pOaXtuWbnuiwg++8jOeUqOaIt+WPr+mAmui/h+aIv+mXtOWunuS+i+eahCBgc2VuZE1lc3NhZ2UobmFtZSwgY29udGVudClgIOaOpeWPo+WPkemAgeS/oeS7pFxuICAgICAgICAgKiBAcGFyYW0gbmFtZSDkv6Hku6TlkI1cbiAgICAgICAgICogQHBhcmFtIGNvbnRlbnQg5L+h5Luk5YaF5a65XG4gICAgICAgICAqIEBwYXJhbSBzZW5kZXJVc2VySWQg5Y+R6YCB6ICFIElkXG4gICAgICAgICAqIEBwYXJhbSBtZXNzYWdlVUlkIOa2iOaBr+WUr+S4gOagh+ivhlxuICAgICAgICAgKi9cbiAgICAgICAgb25NZXNzYWdlUmVjZWl2ZShuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IGFueSwgc2VuZGVyVXNlcklkOiBzdHJpbmcsIG1lc3NhZ2VVSWQ6IHN0cmluZykge1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICog55uR5ZCs5oi/6Ze05bGe5oCn5Y+Y5pu06YCa55+lXG4gICAgICAgICAqIEBwYXJhbSBuYW1lXG4gICAgICAgICAqIEBwYXJhbSBjb250ZW50XG4gICAgICAgICAqL1xuICAgICAgICBvblJvb21BdHRyaWJ1dGVDaGFuZ2UobmFtZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpIHtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOWPkeW4g+iAheemgeeUqC/lkK/nlKjpn7PpopFcbiAgICAgICAgICogQHBhcmFtIGF1ZGlvVHJhY2sgUkNSZW1vdGVBdWRpb1RyYWNrIOexu+WunuS+i1xuICAgICAgICAgKi9cbiAgICAgICAgb25BdWRpb011dGVDaGFuZ2U6IChhdWRpb1RyYWNrOiBSQ1JlbW90ZUF1ZGlvVHJhY2spID0+IHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBvbkF1ZGlvTXV0ZUNoYW5nZV0gdXNlcklkLT4ke2F1ZGlvVHJhY2suZ2V0VXNlcklkKCl9IG11dGVkIC0+ICR7YXVkaW9UcmFjay5pc093bmVyTXV0ZWQoKX1gKTtcbiAgICAgICAgICBjb25zdCBtdXRlVXNlcjogSU11dGVVc2VyID0ge1xuICAgICAgICAgICAgdXNlcklkOiBhdWRpb1RyYWNrLmdldFVzZXJJZCgpLFxuICAgICAgICAgICAgbXV0ZWQ6IGF1ZGlvVHJhY2suaXNPd25lck11dGVkKCksXG4gICAgICAgICAgICBraW5kOiAnYXVkaW8nLFxuICAgICAgICAgICAgdHJhY2tJZDogYXVkaW9UcmFjay5nZXRUcmFja0lkKCksXG4gICAgICAgICAgfTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8g6YCa55+l57uZ5Lia5YqhXG4gICAgICAgICAgICB0aGlzLl9saXN0ZW5lciEub25BdWRpb011dGVDaGFuZ2UobXV0ZVVzZXIsIHRoaXMpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbFNlc3Npb24gb25BdWRpb011dGVDaGFuZ2VdIE1pc3NpbmcgbGlzdGVuaW5nIG1ldGhvZCAtPiBvblRyYWNrTXV0ZUNoYW5nZScpO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICog5Y+R5biD6ICF56aB55SoL+WQr+eUqOinhumikVxuICAgICAgICAgKiBAcGFyYW0gdmlkZW9UcmFjayBSQ1JlbW90ZVZpZGVvVHJhY2sg57G75a6e5L6L5a+56LGhXG4gICAgICAgICAqL1xuICAgICAgICBvblZpZGVvTXV0ZUNoYW5nZTogKHZpZGVvVHJhY2s6IFJDUmVtb3RlVmlkZW9UcmFjaykgPT4ge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxTZXNzaW9uIG9uVmlkZW9NdXRlQ2hhbmdlXXVzZXJJZC0+JHt2aWRlb1RyYWNrLmdldFVzZXJJZCgpfSBtdXRlZCAtPiAke3ZpZGVvVHJhY2suaXNPd25lck11dGVkKCl9YCk7XG4gICAgICAgICAgY29uc3QgbXV0ZVVzZXI6IElNdXRlVXNlciA9IHtcbiAgICAgICAgICAgIHVzZXJJZDogdmlkZW9UcmFjay5nZXRVc2VySWQoKSxcbiAgICAgICAgICAgIG11dGVkOiB2aWRlb1RyYWNrLmlzT3duZXJNdXRlZCgpLFxuICAgICAgICAgICAga2luZDogJ3ZpZGVvJyxcbiAgICAgICAgICAgIHRyYWNrSWQ6IHZpZGVvVHJhY2suZ2V0VHJhY2tJZCgpLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8g6YCa55+l57uZ5Lia5YqhXG4gICAgICAgICAgICB0aGlzLl9saXN0ZW5lciEub25WaWRlb011dGVDaGFuZ2UobXV0ZVVzZXIsIHRoaXMpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbFNlc3Npb24gb25WaWRlb011dGVDaGFuZ2VdIE1pc3NpbmcgbGlzdGVuaW5nIG1ldGhvZCAtPiBvblZpZGVvTXV0ZUNoYW5nZScpO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICog5oi/6Ze05YaF5YW25LuW55So5oi35paw5Y+R5biD6LWE5rqQ5pe26Kem5Y+RXG4gICAgICAgICAqIOWmgumcgOiOt+WPluWKoOWFpeaIv+mXtOS5i+WJjeaIv+mXtOWGheafkOS4queUqOaIt+WPkeW4g+eahOi1hOa6kOWIl+ihqO+8jOWPr+S9v+eUqCByb29tLmdldFJlbW90ZVRyYWNrc0J5VXNlcklkKCd1c2VySWQnKSDojrflj5ZcbiAgICAgICAgICogQHBhcmFtIHRyYWNrcyDmlrDlj5HluIPnmoTpn7PovajkuI7op4bovajmlbDmja7liJfooajvvIzljIXlkKvmlrDlj5HluIPnmoQgUkNSZW1vdGVBdWRpb1RyYWNrIOS4jiBSQ1JlbW90ZVZpZGVvVHJhY2sg5a6e5L6LXG4gICAgICAgICAqL1xuICAgICAgICBvblRyYWNrUHVibGlzaDogYXN5bmMgKHRyYWNrczogUkNSZW1vdGVUcmFja1tdKSA9PiB7XG4gICAgICAgICAgLy8g6YCA5Ye65oi/6Ze05ZCO77yM6L+Y5Lya6LWw5Yiw6L+Z77yf77yf77yM5omA5Lul5Yik5pat5LiA5LiL77yM5rKh5pyJcm9vbeS4jeaJp+ihjOiuoumYhVxuICAgICAgICAgIGlmICh0aGlzLl9yb29tKSB7XG4gICAgICAgICAgICAvLyDmjInkuJrliqHpnIDmsYLpgInmi6npnIDopoHorqLpmIXotYTmupDvvIzpgJrov4cgcm9vbS5zdWJzY3JpYmUg5o6l5Y+j6L+b6KGM6K6i6ZiFXG4gICAgICAgICAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3Jvb20uc3Vic2NyaWJlKHRyYWNrcyk7XG4gICAgICAgICAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIG9uVHJhY2tQdWJsaXNoXSBzdWJzY3JpYmUgZmFpbGVkIFJUQ0NvZGUgLT4ke2NvZGV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICog5oi/6Ze055So5oi35Y+W5raI5Y+R5biD6LWE5rqQXG4gICAgICAgICAqIEBwYXJhbSB0cmFja3Mg6KKr5Y+W5raI5Y+R5biD55qE6Z+z6L2o5LiO6KeG6L2o5pWw5o2u5YiX6KGoXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiDlvZPotYTmupDooqvlj5bmtojlj5HluIPml7bvvIxTREsg5YaF6YOo5Lya5Y+W5raI5a+555u45YWz6LWE5rqQ55qE6K6i6ZiF77yM5Lia5Yqh5bGC5LuF6ZyA5aSE55CGIFVJIOS4muWKoVxuICAgICAgICAgKi9cbiAgICAgICAgb25UcmFja1VucHVibGlzaDogKHRyYWNrczogUkNSZW1vdGVUcmFja1tdKSA9PiB7XG5cbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOiuoumYheeahOmfs+inhumikea1gemAmumBk+W3suW7uueriywgdHJhY2sg5bey5Y+v5Lul6L+b6KGM5pKt5pS+XG4gICAgICAgICAqIEBwYXJhbSB0cmFjayBSQ1JlbW90ZVRyYWNrIOexu+WunuS+i1xuICAgICAgICAgKi9cbiAgICAgICAgb25UcmFja1JlYWR5OiAodHJhY2s6IFJDUmVtb3RlVHJhY2spID0+IHtcbiAgICAgICAgICBjb25zdCBtZWRpYVR5cGUgPSB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0TWVkaWFUeXBlKCk7XG5cbiAgICAgICAgICAvLyDmnInml7blr7nmlrnmsqHmnInpmY3nuqfmiJDlip/vvIzmiZTmipvov4fmnaXop4bpopHvvIzov5nml7bnmoTop4bpopHkuI3lr7nlpJbmipvlh7pcbiAgICAgICAgICBpZiAobWVkaWFUeXBlID09PSBSQ0NhbGxNZWRpYVR5cGUuQVVESU8gJiYgdHJhY2suaXNWaWRlb1RyYWNrKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyDmiafooYznlKjmiLfnmoRvblRyYWNrUmVhZHnnm5HlkKxcbiAgICAgICAgICB0aGlzLl9ub3RpZnlUcmFja1JlYWR5KFt0cmFja10pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICog5Lq65ZGY5Yqg5YWlXG4gICAgICAgICAqIEBwYXJhbSB1c2VySWRzIOWKoOWFpeeahOS6uuWRmCBpZCDliJfooahcbiAgICAgICAgICovXG4gICAgICAgIG9uVXNlckpvaW46ICh1c2VySWRzOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgICAgIC8vIOacieS6uuWKoOWFpea4hemZpOWumuaXtuWZqFxuICAgICAgICAgIGlmICh0aGlzLmpvaW5Sb29tVGltZXIpIHtcbiAgICAgICAgICAgIHRoaXMuam9pblJvb21UaW1lci5zdG9wKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuX3N0YXRlTWFjaGluZS51c2VySm9pbih1c2VySWRzKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOS6uuWRmOmAgOWHulxuICAgICAgICAgKiBAcGFyYW0gdXNlcklkc1xuICAgICAgICAgKi9cbiAgICAgICAgb25Vc2VyTGVhdmU6ICh1c2VySWRzOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxTZXNzaW9uIG9uVXNlckxlYXZlXSBsaXN0ZW5pbmcgb25Vc2VyTGVhdmUgdXNlcklkcyAtPiAke3VzZXJJZHM/LmpvaW4oJywnKX1gKTtcbiAgICAgICAgICB0aGlzLl9zdGF0ZU1hY2hpbmUudXNlckxlYXZlKHVzZXJJZHMpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUlRDIOavj+asoSBQaW5nIOe7k+aenFxuICAgICAgICAgKi9cbiAgICAgICAgb25QaW5nOiAocmVzdWx0OiBSQ1JUQ1BpbmdSZXN1bHQpID0+IHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBvblBpbmddJHtyZXN1bHR9YCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIOmAmuefpee7meS4muWKoVxuICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uUGluZyAmJiB0aGlzLl9saXN0ZW5lciEub25QaW5nKHJlc3VsdCwgdGhpcyk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbiBvblBpbmddIGxpc3RlbmluZyBvblBpbmcgZXhjZXB0aW9uJyk7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog5rOo5YaM5oi/6Ze06LSo6YeP5pWw5o2u55uR5ZCs5ZmoXG4gICAqL1xuICBwcml2YXRlIF9yZWdpc3RlclJlcG9ydExpc3RlbmVyKCkge1xuICAgIC8vIOazqOWGjOaIv+mXtOi0qOmHj+aVsOaNruebkeWQrOWZqFxuICAgIHRoaXMuX3Jvb20ucmVnaXN0ZXJSZXBvcnRMaXN0ZW5lcih7XG4gICAgICAvKipcbiAgICAgICAqIOeUqOS6juaOpeaUtueKtuaAgeaVsOaNruaKpeWRilxuICAgICAgICogQHBhcmFtIHJlcG9ydFxuICAgICAgICovXG4gICAgICBvblN0YXRlUmVwb3J0OiAocmVwb3J0OiBJUkNSVENTdGF0ZVJlcG9ydCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMuX2xpc3RlbmVyIS5vblJUQ1N0YXRlUmVwb3J0ICYmIHRoaXMuX2xpc3RlbmVyIS5vblJUQ1N0YXRlUmVwb3J0KHJlcG9ydCwgdGhpcyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxTZXNzaW9uIG9uU3RhdGVSZXBvcnRdIGxpc3RlbmVyIG9uU3RhdGVSZXBvcnQgZXhjZXB0aW9uJyk7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogfklDRSDov57mjqXnirbmgIHlj5jmm7TpgJrnn6V+XG4gICAgICAgKiBAc2luY2UgdmVyc2lvbiA1LjEuNVxuICAgICAgICovXG4gICAgICBvbklDRUNvbm5lY3Rpb25TdGF0ZUNoYW5nZTogKHN0YXRlOiBSVENJY2VDb25uZWN0aW9uU3RhdGUpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLl9saXN0ZW5lciEub25JQ0VDb25uZWN0aW9uU3RhdGVDaGFuZ2UgJiYgdGhpcy5fbGlzdGVuZXIhLm9uSUNFQ29ubmVjdGlvblN0YXRlQ2hhbmdlKHN0YXRlLCB0aGlzKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbFNlc3Npb24gb25JQ0VDb25uZWN0aW9uU3RhdGVDaGFuZ2VdIG9uSUNFQ29ubmVjdGlvblN0YXRlQ2hhbmdlIGV4Y2VwdGlvbicpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogIOmAmuivneWUr+S4gOagh+ivhlxuICAgKi9cbiAgcHVibGljIGdldFNlc3Npb25JZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0Q2FsbElkKCk7XG4gIH1cblxuICAvKipcbiAgICogIOiOt+WPluaIv+mXtOW9k+WJjeS8muivnSBJZO+8jOW9k+aIv+mXtOWGheW3suaXoOaIkOWRmOaXtuaIv+mXtOS8muWbnuaUtu+8jOmHjeaWsOWKoOWFpeaXtiBzZXNzaW9uSWQg5bCG5pu05paw77yMKOeUqOaIt+W9leWItui1hOa6kOeUqOeahClcbiAgICovXG4gIHB1YmxpYyBnZXRSVENTZXNzaW9uSWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvb20gPyB0aGlzLl9yb29tLmdldFNlc3Npb25JZCgpIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiAg55uu5qCHIElE77yM5Y2V5ZG85a+55pa55Lq65ZGYIElkLCDnvqTlkbznvqTnu4QgSWRcbiAgICovXG4gIHB1YmxpYyBnZXRUYXJnZXRJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0VGFyZ2V0SWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAg6I635Y+W5Lya6K+d57G75Z6LXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29udmVyc2F0aW9uVHlwZSgpOiBDb252ZXJzYXRpb25UeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVNYWNoaW5lLmdldENvbnZlcnNhdGlvblR5cGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAg57uE57uHIElEXG4gICAqL1xuICBwdWJsaWMgZ2V0Q2hhbm5lbElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlTWFjaGluZS5nZXRDaGFubmVsSWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmiL/pl7TkurrlkZjliJfooajvvIzkuI3ljIXlkKvmnKznq6/kv6Hmga9cbiAgICovXG4gIHB1YmxpYyBnZXRSZW1vdGVVc2VycygpOiBJVXNlckRhdGFbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlTWFjaGluZS5nZXRSZW1vdGVVc2VycygpO1xuICB9XG5cbiAgLyoqXG4gKiDmiL/pl7TkurrlkZjliJfooajvvIzkuI3ljIXlkKvmnKznq6/kv6Hmga9cbiAqL1xuICBwdWJsaWMgZ2V0VXNlcnMoKTogSVVzZXJEYXRhW10ge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0UmVtb3RlVXNlcnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bkurrlkZjnirbmgIFcbiAgICovXG4gIHB1YmxpYyBnZXRVc2VyU3RhdGUodXNlcklkOiBzdHJpbmcpOiBSQ0NhbGxVc2VyU3RhdGUge1xuICAgIGlmICghdXNlcklkIHx8IHR5cGVvZiB1c2VySWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZXJJZCBpcyByZXF1aXJlZCwgbXVzdCBiZSBvZiB0eXBlIFxcJ3N0cmluZ1xcJycpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc3RhdGVNYWNoaW5lLmdldFVzZXJTdGF0ZSh1c2VySWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPlnNlc3Npb27nirbmgIFcbiAgICovXG4gIHB1YmxpYyBnZXRTdGF0ZSgpOiBSQ0NhbGxTZXNzaW9uU3RhdGUge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0U3RhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflvpfkvJror53lj5HotbfogIVpZFxuICAgKi9cbiAgcHVibGljIGdldENhbGxlcklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlTWFjaGluZS5nZXRDYWxsZXJJZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+W+l21lZGlhVHlwZVxuICAgKi9cbiAgcHVibGljIGdldE1lZGlhVHlwZSgpOiBSQ0NhbGxNZWRpYVR5cGUge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0TWVkaWFUeXBlKCk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIFJUQ1BsdWdpbkNvbnRleHQsIElSdW50aW1lLCBJUlRDSm9pbmVkSW5mbywgRXJyb3JDb2RlLCBSVENKb2luVHlwZSwgSUxvZ2dlciwgQmFzaWNMb2dnZXIsXG59IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7XG4gIFJDQ2FsbEVuZ2luZSwgUkNDYWxsU3RhdGVNYWNoaW5lLCBSQ0NhbGxFcnJvckNvZGUsIFJDQ2FsbExhbmd1YWdlLCBSQ0NhbGxNZWRpYVR5cGUsIElPZmZsaW5lUmVjb3JkLFxufSBmcm9tICdAcmMtZW1iZWQvY2FsbC1lbmdpbmUnO1xuaW1wb3J0IHsgUkNSVENDbGllbnQsIFJDUlRDQ29kZSwgUkNMb2NhbFRyYWNrIH0gZnJvbSAnQHJvbmdjbG91ZC9wbHVnaW4tcnRjJztcbmltcG9ydCB7XG4gIElSQ0NhbGxJbkdyb3VwUGFyYW1zLCBJUkNDYWxsSW5pdE9wdGlvbnMsIElSQ0NhbGxQYXJhbXMsIElNZWRpYVN0cmVhbUNvbnN0cmFpbnRzLCBJVmFsaWRhdGlvblJlc3VsdCwgSVB1c2hDb25maWcsXG59IGZyb20gJy4vaW50ZXJmYWNlJztcbmltcG9ydCB7IFByb2R1Y2VUeXBlcyB9IGZyb20gJy4vZW51bXMnO1xuaW1wb3J0IGV2ZW50RW1pdHRlciBmcm9tICcuL2V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBSQ0NhbGxTZXNzaW9uIH0gZnJvbSAnLi9SQ0NhbGxTZXNzaW9uJztcbmltcG9ydCB7XG4gIHZhbGlkYXRlTGlzdGVuZXIsIHZhbGlkYXRlVGFyZ2V0SWQsIHZhbGlkYXRlTWVkaWFUeXBlLCB2YWxpZGF0ZVVzZXJJZHMsIHZhbGlkYXRlRXh0cmEsIHZhbGlkYXRlUHVzaFRpdGxlLCB2YWxpZGF0ZVB1c2hDb250ZW50LCB2YWxpZGF0ZVB1c2hDb25maWcsXG59IGZyb20gJy4vdmFsaWRhdGlvbic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJDQ2FsbENsaWVudCB7XG4gIC8qKlxuICAgKiBydGPlrp7kvotcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX3J0Y0NsaWVudDogUkNSVENDbGllbnRcblxuICAvKipcbiAgICogY2FsbEVuZ2luZeWxguWunuS+i1xuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfY2FsbEVuZ2luZTogUkNDYWxsRW5naW5lXG5cbiAgLyoqXG4gICAqIOWFtuWug+WPguaVsFxuICAgKi9cbiAgcHJpdmF0ZSBfb3B0aW9uczogSVJDQ2FsbEluaXRPcHRpb25zXG5cbiAgLyoqXG4gICAqIHNlc3Npb27liJfooahcbiAgICovXG4gIHByaXZhdGUgX3Nlc3Npb25MaXN0OiBSQ0NhbGxTZXNzaW9uW10gPSBbXVxuXG4gIHByaXZhdGUgX2NhbGxQdXNoQ29uZmlnOiBJUHVzaENvbmZpZyA9IHt9XG5cbiAgcHJpdmF0ZSBfaHVuZ3VwUHVzaENvbmZpZzogSVB1c2hDb25maWcgPXt9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfY29udGV4dDogUlRDUGx1Z2luQ29udGV4dCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9ydW50aW1lOiBJUnVudGltZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICAgIF9vcHRpb25zOiBJUkNDYWxsSW5pdE9wdGlvbnMsXG4gICkge1xuICAgIHRoaXMuX3J0Y0NsaWVudCA9IF9vcHRpb25zLnJ0Y0NsaWVudDtcblxuICAgIHRoaXMuX29wdGlvbnMgPSB7IC8qKlxuICAgICAgICog5piv5ZCm5YWB6K645Y+R5biD6YeN6K+V77yMIOm7mOiupOS4jeWFgeiuuFxuICAgICAgICovXG4gICAgICBpc0FsbG93UHVibGlzaFJldHJ5OiBmYWxzZSxcblxuICAgICAgLyoqXG4gICAgICAgKiDmmK/lkKblhYHorrjorqLpmIXph43or5XvvIzpu5jorqTkuI3lhYHorrhcbiAgICAgICAqL1xuICAgICAgaXNBbGxvd1N1YnNjcmliZVJldHJ5OiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICog56aB55So6KeG6aKR5pe25YWz5pGE5YOP5aS0LCDpu5jorqTlhbPpl61cbiAgICAgICAqL1xuICAgICAgaXNPZmZDYW1lcmFXaGVuVmlkZW9EaXNhYmxlOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBSVEMg5oi/6Ze05Yqg5YWl57G75Z6L77yM6buY6K6kICAgUlRDSm9pblR5cGUuQ09FWElTVCA9IDIg5Lik5Liq6K6+5aSH5YWx5a2YXG4gICAgICAgKiAgICAgUlRDSm9pblR5cGUuS0lDSyA9IDAs6Lii5YmN5LiA5Liq6K6+5aSHXG4gICAgICAgKiAgICAgUlRDSm9pblR5cGUuUkVGVVNFID0gMSzlvZPliY3liqDlhaXmi5Lnu51cbiAgICAgICAqICAgICBSVENKb2luVHlwZS5DT0VYSVNUID0gMiDkuKTkuKrorr7lpIflhbHlrZhcbiAgICAgICAqL1xuICAgICAgam9pblR5cGU6IFJUQ0pvaW5UeXBlLkNPRVhJU1QsXG5cbiAgICAgIC8qKlxuICAgICAgICog5YWB6K646ZmN57qn6I635b6X5rWB77yM6I635b6X6Z+z6KeG6aKR5LiN5oiQ5YqfIO+8jOmZjee6p+iOt+W+l+mfs+mikSwg6buY6K6k5LiN5YWB6K64XG4gICAgICAgKi9cbiAgICAgIGlzQWxsb3dEZW1vdGlvbkdldFN0cmVhbTogZmFsc2UsXG5cbiAgICAgIC8qKlxuICAgICAgICog6K+t6KiA6K6+572uICjmjqjpgIEpLCDkuI3kvKDpu5jorqTkuLrkuK3mlodcbiAgICAgICAqL1xuICAgICAgbGFuZzogUkNDYWxsTGFuZ3VhZ2UuWkgsXG4gICAgICAuLi5fb3B0aW9ucyxcbiAgICB9O1xuXG4gICAgLy8g5Yid5aeL5YyWY2FsbEVuZ2luZSwg5bm255uR5ZCsb25JbnZpdGVcbiAgICB0aGlzLl9jYWxsRW5naW5lID0gbmV3IFJDQ2FsbEVuZ2luZSh0aGlzLl9jb250ZXh0LCBfcnVudGltZSwgdGhpcy5fbG9nZ2VyLCB7XG5cbiAgICAgIC8qKlxuICAgICAgICog55uR5ZCs5pS25YiwaW52aXRlXG4gICAgICAgKi9cbiAgICAgIG9uSW52aXRlOiB0aGlzLl9vbkludml0ZS5iaW5kKHRoaXMpLFxuXG4gICAgICAvKipcbiAgICAgICAqIOebkeWQrOemu+e6v+a2iOaBr+aKpeWRilxuICAgICAgICovXG4gICAgICBvbk9mZmxpbmVSZWNvcmQ6IHRoaXMuX29uT2ZmbGluZVJlY29yZC5iaW5kKHRoaXMpLFxuICAgIH0sIHtcblxuICAgICAgLyoqXG4gICAgICAgKiDor63oqIDorr7nva4gKOaOqOmAgSksIOS4jeS8oOm7mOiupOS4uuS4reaWh1xuICAgICAgICovXG4gICAgICBsYW5nOiB0aGlzLl9vcHRpb25zLmxhbmcgfHwgUkNDYWxsTGFuZ3VhZ2UuWkgsXG5cbiAgICB9KTtcblxuICAgIGV2ZW50RW1pdHRlci5vbignc2Vzc2lvbkNsb3NlJywgKHsgc2Vzc2lvbiwgc3VtbWFyeUluZm8gfSkgPT4ge1xuICAgICAgLy8g5LuOc2Vzc2lvbkxpc3Tljrvmjonov5nkuKrlhbPpl63nmoRzZXNzaW9uXG4gICAgICB0aGlzLl9yZW1vdmVTZXNzaW9uKHNlc3Npb24pO1xuXG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9vcHRpb25zLm9uU2Vzc2lvbkNsb3NlKHNlc3Npb24sIHN1bW1hcnlJbmZvKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDQ2FsbENsaWVudF0gb3B0aW9ucy5vblNlc3Npb25DbG9zZSBleGNlcHRpb24nKTtcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8g5o6l5ZCs5LmL5YmN5oyC5pat5YW25a6D55qEc2Vzc2lvblxuICAgIGV2ZW50RW1pdHRlci5vbignaHVuZ3VwT3RoZXJTZXNzaW9uJywgKHsgc2Vzc2lvbiB9KSA9PiB7XG4gICAgICBjb25zdCBpZCA9IHNlc3Npb24uZ2V0U2Vzc2lvbklkKCk7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsQ2xpZW50IGh1bmd1cE90aGVyU2Vzc2lvbl0gc2Vzc2lvbklkIHJlYWR5IHRvIGFjY2VwdCAtPiAke2lkfWApO1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbENsaWVudCBodW5ndXBPdGhlclNlc3Npb25dIHNlc3Npb25MaXN0IC0+JHt0aGlzLl9zZXNzaW9uTGlzdC5tYXAoKHNlcykgPT4gc2VzLmdldFNlc3Npb25JZCgpKS5qb2luKCcsJyl9YCk7XG4gICAgICBsZXQgaSA9IDA7XG4gICAgICB3aGlsZSAodGhpcy5fc2Vzc2lvbkxpc3QubGVuZ3RoID4gMSkge1xuICAgICAgICAvLyDlpoLmnpzkuI7opoHmjqXlkKznmoRzZXNzaW9u5LiN5LiA6Ie0XG4gICAgICAgIGlmICh0aGlzLl9zZXNzaW9uTGlzdFtpXS5nZXRTZXNzaW9uSWQoKSAhPT0gaWQpIHtcbiAgICAgICAgICAvLyDmjILmlq1cbiAgICAgICAgICB0aGlzLl9zZXNzaW9uTGlzdFtpXS5odW5ndXAoKTtcblxuICAgICAgICAgIC8vIOaMguaWreWQjuWIoOmZpFxuICAgICAgICAgIHRoaXMuX3Nlc3Npb25MaXN0LnNwbGljZShpLCAxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyDlpoLmnpzmmK/opoHmjqXlkKznmoRzZXNzaW9u77yM6Lez6L+H6L+Z5Liq57Si5byV77yM5omA5Lul5YqgMVxuICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbENsaWVudCBodW5ndXBPdGhlclNlc3Npb25dIGN1cnJlbnQgc2Vzc2lvbkxpc3QgbGVuZ3RoIC0+JHt0aGlzLl9zZXNzaW9uTGlzdC5sZW5ndGh9YCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog55uR5ZCsb25JbnZpdGVcbiAgICovXG4gIHByaXZhdGUgX29uSW52aXRlKHN0YXRlTWFjaGluZTogUkNDYWxsU3RhdGVNYWNoaW5lLCBleHRyYT86IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgJ1tSQ0NhbGxDbGllbnQgX29uSW52aXRlXSBSZWNlaXZlZCBpbnZpdGUgbWVzc2FnZScpO1xuICAgIGNvbnN0IHNlc3Npb24gPSBuZXcgUkNDYWxsU2Vzc2lvbihzdGF0ZU1hY2hpbmUsIHRoaXMuX3J0Y0NsaWVudCwgdGhpcy5fbG9nZ2VyLCB7XG5cbiAgICAgIC8vIOaYr+WQpuWFgeiuuOiuoumYhemHjeivlVxuICAgICAgaXNBbGxvd1N1YnNjcmliZVJldHJ5OiB0aGlzLl9vcHRpb25zLmlzQWxsb3dTdWJzY3JpYmVSZXRyeSxcblxuICAgICAgLy8g5piv5ZCm5YWB6K645Y+R5biD6YeN6K+VXG4gICAgICBpc0FsbG93UHVibGlzaFJldHJ5OiB0aGlzLl9vcHRpb25zLmlzQWxsb3dQdWJsaXNoUmV0cnksXG5cbiAgICAgIC8qKlxuICAgICAgICog56aB55So6KeG6aKR5pe25YWz5pGE5YOP5aS0XG4gICAgICAgKi9cbiAgICAgIGlzT2ZmQ2FtZXJhV2hlblZpZGVvRGlzYWJsZTogdGhpcy5fb3B0aW9ucy5pc09mZkNhbWVyYVdoZW5WaWRlb0Rpc2FibGUsXG5cbiAgICAgIC8qKlxuICAgICAgICogUlRDIOaIv+mXtOWKoOWFpeexu+Wei1xuICAgICAgICovXG4gICAgICBqb2luVHlwZTogdGhpcy5fb3B0aW9ucy5qb2luVHlwZSxcblxuICAgICAgLy8g5YWB6K646ZmN57qn6I635b6X5rWB77yM6I635b6X6Z+z6KeG6aKR5LiN5oiQ5YqfIO+8jOmZjee6p+iOt+W+l+mfs+mikSwg6buY6K6k5LiN5YWB6K64XG4gICAgICBpc0FsbG93RGVtb3Rpb25HZXRTdHJlYW06IHRoaXMuX29wdGlvbnMuaXNBbGxvd0RlbW90aW9uR2V0U3RyZWFtLFxuXG4gICAgICAvLyDmoIfmmI7mmK/ooqvlj6vkuqfnlJ/nmoRzZXNzaW9uXG4gICAgICBwcm9kdWNlVHlwZTogUHJvZHVjZVR5cGVzLkNBTExFRSxcblxuICAgICAgY2FsbFB1c2hDb25maWc6IHRoaXMuX2NhbGxQdXNoQ29uZmlnLFxuXG4gICAgICBodW5ndXBQdXNoQ29uZmlnOiB0aGlzLl9odW5ndXBQdXNoQ29uZmlnLFxuICAgIH0pO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgJ1tSQ0NhbGxDbGllbnQgX29uSW52aXRlXSBSZWNlaXZlZCBpbnZpdGUgbWVzc2FnZSwgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgc2Vzc2lvbicpO1xuXG4gICAgLyoqXG4gICAgICog5aaC5p6c6YCa6K+d55qE5pe25YCZ5LiN5YWB6K645o6l5ZCs5paw55qE6YCa6K+d77yM55u05o6l5oyC5pat77yMIOi/meS6m+W3peS9nOWcqGNhbGxFbmdpbmXph4zlrozmiJBcbiAgICAgKi9cbiAgICB0aGlzLl9zZXNzaW9uTGlzdC5wdXNoKHNlc3Npb24pO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIOaJp+ihjOeUqOaIt0FQSeeahOebkeWQrFxuICAgICAgdGhpcy5fb3B0aW9ucy5vblNlc3Npb24oc2Vzc2lvbiwgZXh0cmEpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbENsaWVudCBfb3B0aW9ucy5vblNlc3Npb25dIG9uU2Vzc2lvbiBleGNlcHRpb24nKTtcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICB9XG5cbiAgICAvLyDlv4XpobvlnKhvblNlc3Npb27ph4zms6jlhoxzZXNzaW9u55uR5ZCs5LqL5Lu277yM6L+Z6YeM5qOA5rWL5LiA5LiL5pyJ5rKh5pyJ5rOo5YaMXG4gICAgaWYgKHNlc3Npb24uX2xpc3RlbmVyKSB7XG4gICAgICBjb25zdCBjb25jbHVzaW9uOiBJVmFsaWRhdGlvblJlc3VsdCA9IHZhbGlkYXRlTGlzdGVuZXIoc2Vzc2lvbi5fbGlzdGVuZXIpO1xuICAgICAgaWYgKCFjb25jbHVzaW9uLnJlc3VsdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoY29uY2x1c2lvbi5tc2cpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbENsaWVudCBfb3B0aW9ucy5vblNlc3Npb25dIHNlc3Npb24gTXVzdCBIYXZlIExpc3RlbmVyJyk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tSQ0NhbGxTZXNzaW9uICBfb3B0aW9ucy5vblNlc3Npb25dIHNlc3Npb24gTXVzdCBIYXZlIExpc3RlbmVyJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOebkeWQrOemu+e6v+a2iOaBr+aKpeWRilxuICAgKiBAcGFyYW0gcmVjb3JkXG4gICAqL1xuICBwdWJsaWMgX29uT2ZmbGluZVJlY29yZChyZWNvcmQ6IElPZmZsaW5lUmVjb3JkKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIOaJp+ihjOeUqOaIt0FQSeeahOebkeWQrFxuICAgICAgdGhpcy5fb3B0aW9ucy5vbk9mZmxpbmVSZWNvcmQgJiYgdGhpcy5fb3B0aW9ucy5vbk9mZmxpbmVSZWNvcmQocmVjb3JkKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxDbGllbnQgX29wdGlvbnMub25PZmZsaW5lUmVjb3JkXSBvbk9mZmxpbmVSZWNvcmQgZXhjZXB0aW9uJyk7XG4gICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOazqOWGjOeUqOaIt+S/oeaBr+OAguazqOWGjOWQju+8jOWcqOWPkei1t+mCgOivt+aIluaMguaWreetieaTjeS9nOaXtu+8jOS8muWwhuivpeS/oeaBr+S4gOW5tuWPkemAgee7meWvueerr1xuICAgKiBAcGFyYW0gaW5mby5uYW1lICAgICAgICDnlKjmiLflkI3np7BcbiAgICogQHBhcmFtIGluZm8ucG9ydHJhaXRVcmkg55So5oi35aS05YOP5L+h5oGvXG4gICAqIEBwYXJhbSBpbmZvLmV4dHJhICAgICAgIOmihOeVmeaLk+WxleWtl+autVxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVXNlckluZm8oaW5mbzogeyBuYW1lPzogc3RyaW5nOyBwb3J0cmFpdFVyaT86IHN0cmluZzsgZXh0cmE/OiBzdHJpbmc7IH0gPSB7fSkge1xuICAgIHRoaXMuX2NhbGxFbmdpbmUucmVnaXN0ZXJVc2VySW5mbyhpbmZvKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsICdbUkNDYWxsQ2xpZW50IHJlZ2lzdGVyVXNlckluZm9dIHN1Y2Nlc3NmdWxseSByZWdpc3RlciB1c2VyIGluZm8gZGF0YScpO1xuICB9XG5cbiAgLyoqXG4gICog6LeoQXBw5Y2V5ZG877yMXGLlj5HpgIFpbnZpdGXmtojmga/vvIzlm57osIPlm57mnaXmjqXmlLZzdGF0ZU1hY2hpbmUsIOW7unNlc3Npb25cbiAgKiBAcGFyYW0gcGFyYW1zLnRhcmdldElkIOiiq+WRvOWPq+S4gOaWueeahOeUqOaItyBpZCDlv4XloatcbiAgKiBAcGFyYW0gcGFyYW1zLm1lZGlhVHlwZSDpn7PpopHlkbzlj6sgb3Ig6Z+z6KeG6aKR5ZG85Y+rICDlv4XloatcbiAgKiBAcGFyYW0gcGFyYW1zLmxpc3RlbmVyIChzZXNzaW9u5LiK55qE55uR5ZCsKSDlv4XloatcbiAgKiBAcGFyYW0gcGFyYW1zLmNvbnN0cmFpbnRzIOiOt+WPlumfs+mikeaIlumfs+inhumikei1hOa6kOaXtueahOWPguaVsCDlj6/pgIlcbiAgKiBAcGFyYW0gcGFyYW1zLmNoYW5uZWxJZCDnu4Tnu4cgSWQg5Y+v6YCJXG4gICogQHBhcmFtIHBhcmFtcy5leHRyYSDmtojmga/mianlsZXkv6Hmga9cbiAgKiBAZGVwcmVjYXRlZCA1LjEuMiDniYjmnKzlup/lvIMgcGFyYW1zLnB1c2hUaXRsZSDpgJrnn6XnmoTmoIfpophcbiAgKiBAZGVwcmVjYXRlZCA1LjEuMiDniYjmnKzlup/lvIMgcGFyYW1zLnB1c2hDb250ZW50IOmAmuefpeeahOWGheWuuVxuICAqIEBwYXJhbSBwYXJhbXMuYml0cmF0ZSDpnIDopoHorr7nva7nmoTnoIHnjoflj4LmlbBcbiAgKlxuICAqL1xuICBwdWJsaWMgYXN5bmMgc3RhcnRDcm9zc0NhbGwoe1xuICAgIHRhcmdldElkLCBtZWRpYVR5cGUgPSBSQ0NhbGxNZWRpYVR5cGUuQVVESU8sIGxpc3RlbmVyLCBjb25zdHJhaW50cywgY2hhbm5lbElkID0gJycsIGV4dHJhID0gJycsIHB1c2hUaXRsZSA9ICcnLCBwdXNoQ29udGVudCA9ICcnLCBiaXRyYXRlLFxuICB9OiBJUkNDYWxsUGFyYW1zKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSwgc2Vzc2lvbj86IFJDQ2FsbFNlc3Npb24gfT4ge1xuICAgIHJldHVybiB0aGlzLl9fY2FsbCh7XG4gICAgICB0YXJnZXRJZCwgbWVkaWFUeXBlLCBsaXN0ZW5lciwgY29uc3RyYWludHMsIGNoYW5uZWxJZCwgZXh0cmEsIHB1c2hUaXRsZSwgcHVzaENvbnRlbnQsIGJpdHJhdGUsIGlzQ3Jvc3NBcHBrZXk6IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5Y2V5ZG877yMXGLlj5HpgIFpbnZpdGXmtojmga/vvIzlm57osIPlm57mnaXmjqXmlLZzdGF0ZU1hY2hpbmUsIOW7unNlc3Npb25cbiAgICogQHBhcmFtIHBhcmFtcy50YXJnZXRJZCDooqvlkbzlj6vkuIDmlrnnmoTnlKjmiLcgaWQg5b+F5aGrXG4gICAqIEBwYXJhbSBwYXJhbXMubWVkaWFUeXBlIOmfs+mikeWRvOWPqyBvciDpn7Pop4bpopHlkbzlj6sgIOW/heWhq1xuICAgKiBAcGFyYW0gcGFyYW1zLmxpc3RlbmVyIChzZXNzaW9u5LiK55qE55uR5ZCsKSDlv4XloatcbiAgICogQHBhcmFtIHBhcmFtcy5jb25zdHJhaW50cyDojrflj5bpn7PpopHmiJbpn7Pop4bpopHotYTmupDml7bnmoTlj4LmlbAg5Y+v6YCJXG4gICAqIEBwYXJhbSBwYXJhbXMuY2hhbm5lbElkIOe7hOe7hyBJZCDlj6/pgIlcbiAgICogQHBhcmFtIHBhcmFtcy5leHRyYSDmtojmga/mianlsZXkv6Hmga9cbiAgICogQGRlcHJlY2F0ZWQgNS4xLjIg54mI5pys5bqf5byDIHBhcmFtcy5wdXNoVGl0bGUg6YCa55+l55qE5qCH6aKYXG4gICAqIEBkZXByZWNhdGVkIDUuMS4yIOeJiOacrOW6n+W8gyBwYXJhbXMucHVzaENvbnRlbnQg6YCa55+l55qE5YaF5a65XG4gICAqIEBwYXJhbSBwYXJhbXMuYml0cmF0ZSDpnIDopoHorr7nva7nmoTnoIHnjoflj4LmlbBcbiAgICpcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjYWxsKHtcbiAgICB0YXJnZXRJZCwgbWVkaWFUeXBlID0gUkNDYWxsTWVkaWFUeXBlLkFVRElPLCBsaXN0ZW5lciwgY29uc3RyYWludHMsIGNoYW5uZWxJZCA9ICcnLCBleHRyYSA9ICcnLCBwdXNoVGl0bGUgPSAnJywgcHVzaENvbnRlbnQgPSAnJywgYml0cmF0ZSxcbiAgfTogSVJDQ2FsbFBhcmFtcyk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUsIHNlc3Npb24/OiBSQ0NhbGxTZXNzaW9uIH0+IHtcbiAgICByZXR1cm4gdGhpcy5fX2NhbGwoe1xuICAgICAgdGFyZ2V0SWQsIG1lZGlhVHlwZSwgbGlzdGVuZXIsIGNvbnN0cmFpbnRzLCBjaGFubmVsSWQsIGV4dHJhLCBwdXNoVGl0bGUsIHB1c2hDb250ZW50LCBiaXRyYXRlLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfX2NhbGwoe1xuICAgIHRhcmdldElkLCBtZWRpYVR5cGUgPSBSQ0NhbGxNZWRpYVR5cGUuQVVESU8sIGxpc3RlbmVyLCBjb25zdHJhaW50cywgY2hhbm5lbElkID0gJycsIGV4dHJhID0gJycsIHB1c2hUaXRsZSA9ICcnLCBwdXNoQ29udGVudCA9ICcnLCBiaXRyYXRlLCBpc0Nyb3NzQXBwa2V5ID0gZmFsc2UsXG4gIH06IElSQ0NhbGxQYXJhbXMpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLCBzZXNzaW9uPzogUkNDYWxsU2Vzc2lvbiB9PiB7XG4gICAgY29uc3QgeyBwdXNoVGl0bGU6IHB1c2hUaXRsZVZhbHVlID0gJycsIHB1c2hDb250ZW50OiBwdXNoQ29udGVudFZhbHVlID0gJycgfSA9ICh0aGlzLl9jYWxsUHVzaENvbmZpZy5wdXNoVGl0bGUgfHwgdGhpcy5fY2FsbFB1c2hDb25maWcucHVzaENvbnRlbnQpID8gdGhpcy5fY2FsbFB1c2hDb25maWcgOiB7IHB1c2hUaXRsZSwgcHVzaENvbnRlbnQgfTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsQ2xpZW50IGNhbGxdIGV4dHJhLT4ke2V4dHJhfSBwdXNoVGl0bGUtPiR7cHVzaFRpdGxlVmFsdWV9IHB1c2hDb250ZW50LT4ke3B1c2hDb250ZW50VmFsdWV9YCk7XG4gICAgY29uc3QgY29uY2x1c2lvbjogSVZhbGlkYXRpb25SZXN1bHRbXSA9IFt2YWxpZGF0ZVRhcmdldElkKHRhcmdldElkKSwgdmFsaWRhdGVNZWRpYVR5cGUobWVkaWFUeXBlKSwgdmFsaWRhdGVMaXN0ZW5lcihsaXN0ZW5lciksIHZhbGlkYXRlRXh0cmEoZXh0cmEpLCB2YWxpZGF0ZVB1c2hUaXRsZShwdXNoVGl0bGVWYWx1ZSksIHZhbGlkYXRlUHVzaENvbnRlbnQocHVzaENvbnRlbnRWYWx1ZSldO1xuICAgIGNvbnN0IG1lc3NhZ2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHJlc3VsdCA9IGNvbmNsdXNpb24uZXZlcnkoKG9iajogSVZhbGlkYXRpb25SZXN1bHQpID0+IHtcbiAgICAgICFvYmoucmVzdWx0ICYmIG1lc3NhZ2VzLnB1c2gob2JqLm1zZyEpO1xuICAgICAgcmV0dXJuIG9iai5yZXN1bHQ7XG4gICAgfSk7XG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW1JDQ2FsbENsaWVudCBjYWxsXSAke21lc3NhZ2VzLmpvaW4oJ1xcbicpfWApO1xuICAgIH1cblxuICAgIGxldCBsb2NhbFRyYWNrczogUkNMb2NhbFRyYWNrW10gPSBbXTtcblxuICAgIGNvbnN0IHsgY29kZTogX2NvZGUsIHRyYWNrcyB9ID0gYXdhaXQgdGhpcy5fZ2V0TG9jYWxUcmFjayhtZWRpYVR5cGUsIGNvbnN0cmFpbnRzKTtcbiAgICBpZiAoX2NvZGUgIT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBfY29kZSB9O1xuICAgIH1cbiAgICBsb2NhbFRyYWNrcyA9IHRyYWNrcyE7XG5cbiAgICBsb2NhbFRyYWNrcy5mb3JFYWNoKCh0cmFjaykgPT4ge1xuICAgICAgLy8g6K6+572u56CB546HXG4gICAgICBpZiAodHJhY2suaXNBdWRpb1RyYWNrKCkgJiYgYml0cmF0ZT8uYXVkaW8pIHtcbiAgICAgICAgdHJhY2suc2V0Qml0cmF0ZShiaXRyYXRlPy5hdWRpbyk7XG4gICAgICB9XG4gICAgICBpZiAodHJhY2suaXNWaWRlb1RyYWNrKCkgJiYgYml0cmF0ZT8udmlkZW8pIHtcbiAgICAgICAgdHJhY2suc2V0Qml0cmF0ZShiaXRyYXRlPy52aWRlbz8ubWF4LCBiaXRyYXRlPy52aWRlbz8ubWluLCBiaXRyYXRlPy52aWRlbz8uc3RhcnQpO1xuICAgICAgfVxuICAgICAgLy8g5ZCR5aSW5oqb5Ye65pys5Zyw5rWBXG4gICAgICBsaXN0ZW5lci5vblRyYWNrUmVhZHkodHJhY2spO1xuICAgIH0pO1xuXG4gICAgLy8g6LCD55SoY2FsbEVuZ2luZeeahGNhbGzov5Tlm57kuIDkuKrnirbmgIHmnLrnmoTlrp7kvotcbiAgICBjb25zdCB7IGNvZGUsIHN0YXRlTWFjaGluZSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5jYWxsKGNoYW5uZWxJZCwgdGFyZ2V0SWQsIG1lZGlhVHlwZSwgZXh0cmEsIHB1c2hUaXRsZVZhbHVlLCBwdXNoQ29udGVudFZhbHVlLCBpc0Nyb3NzQXBwa2V5KTtcbiAgICBpZiAoY29kZSA9PT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MgJiYgc3RhdGVNYWNoaW5lKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsICdbUkNDYWxsQ2xpZW50IGNhbGxdIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIHN0YXRlIG1hY2hpbmUnKTtcbiAgICAgIGNvbnN0IHNlc3Npb24gPSBuZXcgUkNDYWxsU2Vzc2lvbihzdGF0ZU1hY2hpbmUsIHRoaXMuX3J0Y0NsaWVudCwgdGhpcy5fbG9nZ2VyLCB7XG4gICAgICAgIGxvY2FsVHJhY2tzLFxuXG4gICAgICAgIC8vIOaYr+WQpuWFgeiuuOiuoumYhemHjeivlVxuICAgICAgICBpc0FsbG93U3Vic2NyaWJlUmV0cnk6IHRoaXMuX29wdGlvbnMuaXNBbGxvd1N1YnNjcmliZVJldHJ5LFxuXG4gICAgICAgIC8vIOaYr+WQpuWFgeiuuOiuoumYhemHjeivlVxuICAgICAgICBpc0FsbG93UHVibGlzaFJldHJ5OiB0aGlzLl9vcHRpb25zLmlzQWxsb3dQdWJsaXNoUmV0cnksXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIOemgeeUqOinhumikeaXtuWFs+aRhOWDj+WktFxuICAgICAgICAgKi9cbiAgICAgICAgaXNPZmZDYW1lcmFXaGVuVmlkZW9EaXNhYmxlOiB0aGlzLl9vcHRpb25zLmlzT2ZmQ2FtZXJhV2hlblZpZGVvRGlzYWJsZSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUlRDIOaIv+mXtOWKoOWFpeexu+Wei1xuICAgICAgICAgKi9cbiAgICAgICAgam9pblR5cGU6IHRoaXMuX29wdGlvbnMuam9pblR5cGUsXG5cbiAgICAgICAgLy8g5YWB6K646ZmN57qn6I635b6X5rWB77yM6I635b6X6Z+z6KeG6aKR5LiN5oiQ5YqfIO+8jOmZjee6p+iOt+W+l+mfs+mikSwg6buY6K6k5LiN5YWB6K64XG4gICAgICAgIGlzQWxsb3dEZW1vdGlvbkdldFN0cmVhbTogdGhpcy5fb3B0aW9ucy5pc0FsbG93RGVtb3Rpb25HZXRTdHJlYW0sXG5cbiAgICAgICAgLy8g5qCH5piO5piv5Li75Y+r5Lqn55Sf55qEc2Vzc2lvblxuICAgICAgICBwcm9kdWNlVHlwZTogUHJvZHVjZVR5cGVzLkNBTExFUixcblxuICAgICAgICBpc0Nyb3NzQXBwa2V5LFxuXG4gICAgICAgIGNhbGxQdXNoQ29uZmlnOiB0aGlzLl9jYWxsUHVzaENvbmZpZyxcblxuICAgICAgICBodW5ndXBQdXNoQ29uZmlnOiB0aGlzLl9odW5ndXBQdXNoQ29uZmlnLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIHNlc3Npb27kuIrms6jlhoznm5HlkKzkuovku7ZcbiAgICAgIHNlc3Npb24ucmVnaXN0ZXJTZXNzaW9uTGlzdGVuZXIobGlzdGVuZXIpO1xuXG4gICAgICB0aGlzLl9zZXNzaW9uTGlzdC5wdXNoKHNlc3Npb24pO1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbENsaWVudCBjYWxsXSBzdWNjZXNzZnVsbHkgY3JlYXRlZCBzZXNzaW9uIG9iamVjdCwgc2Vzc2lvbklkOiAke3Nlc3Npb24uZ2V0U2Vzc2lvbklkKCl9YCk7XG4gICAgICByZXR1cm4geyBjb2RlLCBzZXNzaW9uIH07XG4gICAgfVxuICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsQ2xpZW50IGNhbGxdIGNhbGwgZmFpbGVkIGNvZGUgLT46ICR7Y29kZX1gKTtcbiAgICBsb2NhbFRyYWNrcy5mb3JFYWNoKCh0cmFjaykgPT4ge1xuICAgICAgLy8g56aB55So6KeG6aKRXG4gICAgICB0cmFjay5tdXRlKCk7XG5cbiAgICAgIC8vIOWFs+mXreaRhOWDj+WktFxuICAgICAgdHJhY2suZGVzdHJveSgpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWPkei1t+e+pOe7hOWRvOWPq1xuICAgKiBAcGFyYW0gcGFyYW1zLnRhcmdldElkIOe+pOe7hCBJZCDlv4XloatcbiAgICogQHBhcmFtIHBhcmFtcy51c2VySWRzIOiiq+WRvOWPq+eahOe+pOWGheaIkOWRmCBJZCDlv4XloatcbiAgICogQHBhcmFtIHBhcmFtcy5tZWRpYVR5cGUg6Z+z6aKR5ZG85Y+rIG9yIOmfs+inhumikeWRvOWPqyDlv4XloatcbiAgICogQHBhcmFtIHBhcmFtcy5saXN0ZW5lciAoc2Vzc2lvbuS4iueahOebkeWQrCkg5b+F5aGrXG4gICAqIEBwYXJhbSBwYXJhbXMuY29uc3RyYWludHMg6I635Y+W6Z+z6aKR5oiW6Z+z6KeG6aKR6LWE5rqQ5pe255qE5Y+C5pWwIOWPr+mAiVxuICAgKiBAcGFyYW0gcGFyYW1zLmNoYW5uZWxJZCDnu4Tnu4cgSWQg5Y+v6YCJXG4gICAqIEBwYXJhbSBwYXJhbXMuZXh0cmEg5raI5oGv5omp5bGV5L+h5oGvIOWPr+mAiVxuICAgKiBAZGVwcmVjYXRlZCA1LjEuMiDniYjmnKzlup/lvIMgcGFyYW1zLnB1c2hUaXRsZSDpgJrnn6XnmoTmoIfpophcbiAgICogQGRlcHJlY2F0ZWQgNS4xLjIg54mI5pys5bqf5byDIHBhcmFtcy5wdXNoQ29udGVudCDpgJrnn6XnmoTlhoXlrrlcbiAgICogQHBhcmFtIHBhcmFtcy5iaXRyYXRlIOmcgOimgeiuvue9rueahOeggeeOh+WPguaVsFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNhbGxJbkdyb3VwKHtcbiAgICB0YXJnZXRJZCwgdXNlcklkcywgbWVkaWFUeXBlID0gUkNDYWxsTWVkaWFUeXBlLkFVRElPLCBsaXN0ZW5lciwgY29uc3RyYWludHMsIGNoYW5uZWxJZCA9ICcnLCBleHRyYSA9ICcnLCBwdXNoVGl0bGUgPSAnJywgcHVzaENvbnRlbnQgPSAnJywgYml0cmF0ZSxcbiAgfTogSVJDQ2FsbEluR3JvdXBQYXJhbXMpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLCBzZXNzaW9uPzogUkNDYWxsU2Vzc2lvbiB9PiB7XG4gICAgY29uc3QgeyBwdXNoVGl0bGU6IHB1c2hUaXRsZVZhbHVlID0gJycsIHB1c2hDb250ZW50OiBwdXNoQ29udGVudFZhbHVlID0gJycgfSA9ICh0aGlzLl9jYWxsUHVzaENvbmZpZy5wdXNoVGl0bGUgfHwgdGhpcy5fY2FsbFB1c2hDb25maWcucHVzaENvbnRlbnQpID8gdGhpcy5fY2FsbFB1c2hDb25maWcgOiB7IHB1c2hUaXRsZSwgcHVzaENvbnRlbnQgfTtcbiAgICBjb25zdCBjb25jbHVzaW9uOiBJVmFsaWRhdGlvblJlc3VsdFtdID0gW3ZhbGlkYXRlVGFyZ2V0SWQodGFyZ2V0SWQpLCB2YWxpZGF0ZVVzZXJJZHModXNlcklkcyksIHZhbGlkYXRlTWVkaWFUeXBlKG1lZGlhVHlwZSksIHZhbGlkYXRlTGlzdGVuZXIobGlzdGVuZXIpLCB2YWxpZGF0ZUV4dHJhKGV4dHJhKSwgdmFsaWRhdGVQdXNoVGl0bGUocHVzaFRpdGxlVmFsdWUpLCB2YWxpZGF0ZVB1c2hDb250ZW50KHB1c2hDb250ZW50VmFsdWUpXTtcbiAgICBjb25zdCBtZXNzYWdlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCByZXN1bHQgPSBjb25jbHVzaW9uLmV2ZXJ5KChvYmo6IElWYWxpZGF0aW9uUmVzdWx0KSA9PiB7XG4gICAgICAhb2JqLnJlc3VsdCAmJiBtZXNzYWdlcy5wdXNoKG9iai5tc2chKTtcbiAgICAgIHJldHVybiBvYmoucmVzdWx0O1xuICAgIH0pO1xuXG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW1JDQ2FsbENsaWVudCBjYWxsSW5Hcm91cF0gJHttZXNzYWdlcy5qb2luKCdcXG4nKX1gKTtcbiAgICB9XG5cbiAgICBsZXQgbG9jYWxUcmFja3M6IFJDTG9jYWxUcmFja1tdID0gW107XG5cbiAgICBjb25zdCB7IGNvZGU6IF9jb2RlLCB0cmFja3MgfSA9IGF3YWl0IHRoaXMuX2dldExvY2FsVHJhY2sobWVkaWFUeXBlLCBjb25zdHJhaW50cyk7XG4gICAgaWYgKF9jb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZTogX2NvZGUgfTtcbiAgICB9XG4gICAgbG9jYWxUcmFja3MgPSB0cmFja3MhO1xuXG4gICAgbG9jYWxUcmFja3MuZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgIC8vIOiuvue9rueggeeOh1xuICAgICAgaWYgKHRyYWNrLmlzQXVkaW9UcmFjaygpICYmIGJpdHJhdGU/LmF1ZGlvKSB7XG4gICAgICAgIHRyYWNrLnNldEJpdHJhdGUoYml0cmF0ZT8uYXVkaW8pO1xuICAgICAgfVxuICAgICAgaWYgKHRyYWNrLmlzVmlkZW9UcmFjaygpICYmIGJpdHJhdGU/LnZpZGVvKSB7XG4gICAgICAgIHRyYWNrLnNldEJpdHJhdGUoYml0cmF0ZT8udmlkZW8/Lm1heCwgYml0cmF0ZT8udmlkZW8/Lm1pbiwgYml0cmF0ZT8udmlkZW8/LnN0YXJ0KTtcbiAgICAgIH1cbiAgICAgIC8vIOWQkeWkluaKm+WHuuacrOWcsOa1gVxuICAgICAgbGlzdGVuZXIub25UcmFja1JlYWR5KHRyYWNrKTtcbiAgICB9KTtcblxuICAgIC8vIOW+gOe7hOmHjOWPkea2iOaBr1xuICAgIGNvbnN0IHsgY29kZSwgc3RhdGVNYWNoaW5lIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmNhbGxJbkdyb3VwKGNoYW5uZWxJZCwgdGFyZ2V0SWQsIG1lZGlhVHlwZSwgdXNlcklkcywgZXh0cmEsIHB1c2hUaXRsZVZhbHVlLCBwdXNoQ29udGVudFZhbHVlKTtcbiAgICBpZiAoY29kZSA9PT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MgJiYgc3RhdGVNYWNoaW5lKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsICdbUkNDYWxsQ2xpZW50IGNhbGxJbkdyb3VwXSBzdWNjZXNzZnVsbHkgY3JlYXRlZCBzdGF0ZSBtYWNoaW5lJyk7XG4gICAgICBjb25zdCBzZXNzaW9uID0gbmV3IFJDQ2FsbFNlc3Npb24oc3RhdGVNYWNoaW5lLCB0aGlzLl9ydGNDbGllbnQsIHRoaXMuX2xvZ2dlciwge1xuICAgICAgICBsb2NhbFRyYWNrcyxcblxuICAgICAgICAvLyDmmK/lkKblhYHorrjorqLpmIXph43or5VcbiAgICAgICAgaXNBbGxvd1N1YnNjcmliZVJldHJ5OiB0aGlzLl9vcHRpb25zLmlzQWxsb3dTdWJzY3JpYmVSZXRyeSxcblxuICAgICAgICAvLyDmmK/lkKblhYHorrjlj5HluIPph43or5VcbiAgICAgICAgaXNBbGxvd1B1Ymxpc2hSZXRyeTogdGhpcy5fb3B0aW9ucy5pc0FsbG93UHVibGlzaFJldHJ5LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDnpoHnlKjop4bpopHml7blhbPmkYTlg4/lpLRcbiAgICAgICAgICovXG4gICAgICAgIGlzT2ZmQ2FtZXJhV2hlblZpZGVvRGlzYWJsZTogdGhpcy5fb3B0aW9ucy5pc09mZkNhbWVyYVdoZW5WaWRlb0Rpc2FibGUsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJUQyDmiL/pl7TliqDlhaXnsbvlnotcbiAgICAgICAgICovXG4gICAgICAgIGpvaW5UeXBlOiB0aGlzLl9vcHRpb25zLmpvaW5UeXBlLFxuXG4gICAgICAgIC8vIOWFgeiuuOmZjee6p+iOt+W+l+a1ge+8jOiOt+W+l+mfs+inhumikeS4jeaIkOWKnyDvvIzpmY3nuqfojrflvpfpn7PpopEsIOm7mOiupOS4jeWFgeiuuFxuICAgICAgICBpc0FsbG93RGVtb3Rpb25HZXRTdHJlYW06IHRoaXMuX29wdGlvbnMuaXNBbGxvd0RlbW90aW9uR2V0U3RyZWFtLFxuXG4gICAgICAgIC8vIOagh+aYjuaYr+S4u+WPq+S6p+eUn+eahHNlc3Npb25cbiAgICAgICAgcHJvZHVjZVR5cGU6IFByb2R1Y2VUeXBlcy5DQUxMRVIsXG5cbiAgICAgICAgY2FsbFB1c2hDb25maWc6IHRoaXMuX2NhbGxQdXNoQ29uZmlnLFxuXG4gICAgICAgIGh1bmd1cFB1c2hDb25maWc6IHRoaXMuX2h1bmd1cFB1c2hDb25maWcsXG4gICAgICB9KTtcblxuICAgICAgLy8gc2Vzc2lvbuS4iuazqOWGjOebkeWQrOS6i+S7tlxuICAgICAgc2Vzc2lvbi5yZWdpc3RlclNlc3Npb25MaXN0ZW5lcihsaXN0ZW5lcik7XG4gICAgICB0aGlzLl9zZXNzaW9uTGlzdC5wdXNoKHNlc3Npb24pO1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbENsaWVudCBjYWxsSW5Hcm91cF0gc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgc2Vzc2lvbiBvYmplY3QsIHNlc3Npb25JZDogJHtzZXNzaW9uLmdldFNlc3Npb25JZCgpfWApO1xuICAgICAgcmV0dXJuIHsgY29kZSwgc2Vzc2lvbiB9O1xuICAgIH1cbiAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsQ2xpZW50IGNhbGxJbkdyb3VwXSBjYWxsSW5Hcm91cCBmYWlsZWQgY29kZSAtPiAke2NvZGV9YCk7XG4gICAgbG9jYWxUcmFja3MuZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgIC8vIOemgeeUqOinhumikVxuICAgICAgdHJhY2subXV0ZSgpO1xuXG4gICAgICAvLyDlhbPpl63mkYTlg4/lpLRcbiAgICAgIHRyYWNrLmRlc3Ryb3koKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDosINSVEMgQVBJIOiOt+W+l+acrOWcsOa1gVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfZ2V0TG9jYWxUcmFja0NvcmUobWVkaWFUeXBlOiBSQ0NhbGxNZWRpYVR5cGUsIGNvbnN0cmFpbnRzPzogSU1lZGlhU3RyZWFtQ29uc3RyYWludHMpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLCB0cmFja3M/OiBSQ0xvY2FsVHJhY2tbXSB9PiB7XG4gICAgLy8g5qOA5rWL5piv5ZCm6IO95aSf6I635b6X5pys5Zyw5rWBXG4gICAgaWYgKG1lZGlhVHlwZSA9PT0gUkNDYWxsTWVkaWFUeXBlLkFVRElPKSB7XG4gICAgICBjb25zdCB7IGNvZGUsIHRyYWNrIH0gPSBhd2FpdCB0aGlzLl9ydGNDbGllbnQuY3JlYXRlTWljcm9waG9uZUF1ZGlvVHJhY2soJ1JvbmdDbG91ZFJUQycsIGNvbnN0cmFpbnRzICYmIGNvbnN0cmFpbnRzLmF1ZGlvICYmIHsgLi4uY29uc3RyYWludHMuYXVkaW8gfSk7XG4gICAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxDbGllbnQgX2dldFRyYWNrXSBnZXQgQXVkaW8gbG9jYWwgdHJhY2tzIGZhaWxlZCBSQ1QgY29kZSAtPiAke2NvZGV9YCk7XG4gICAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5HRVRfTE9DQUxfQVVESU9fVFJBQ0tfRVJST1IgfTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgJ1tSQ0NhbGxDbGllbnQgX2dldFRyYWNrXSBzdWNjZXNzZnVsbHkgZ2V0IEF1ZGlvIGxvY2FsIHRyYWNrcycpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MsIHRyYWNrczogW3RyYWNrIV0gfTtcbiAgICB9XG4gICAgY29uc3QgeyBjb2RlLCB0cmFja3MgfSA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5jcmVhdGVNaWNyb3Bob25lQW5kQ2FtZXJhVHJhY2tzKCdSb25nQ2xvdWRSVEMnLCBjb25zdHJhaW50cyAmJiB7IC4uLmNvbnN0cmFpbnRzIH0pO1xuICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxDbGllbnQgX2dldFRyYWNrXSBnZXQgQXVkaW8gYW5kIFZpZGVvIGxvY2FsIHRyYWNrcyBmYWlsZWQgUkNUIGNvZGUgLT4gJHtjb2RlfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLkdFVF9MT0NBTF9BVURJT19BTkRfVklERU9fVFJBQ0tfRVJST1IgfTtcbiAgICB9XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCAnW1JDQ2FsbENsaWVudCBfZ2V0VHJhY2tdIHN1Y2Nlc3NmdWxseSBnZXQgYXVkaW8gYW5kIHZpZGVvIGxvY2FsIHRyYWNrcycpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTLCB0cmFja3MgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX2dldExvY2FsVHJhY2sobWVkaWFUeXBlOiBSQ0NhbGxNZWRpYVR5cGUsIGNvbnN0cmFpbnRzPzogSU1lZGlhU3RyZWFtQ29uc3RyYWludHMpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLCB0cmFja3M/OiBSQ0xvY2FsVHJhY2tbXSB9PiB7XG4gICAgLy8g5aaC5p6c5piv5YWB6K646ZmN57qn6I635b6X5rWB77yM5bm25LiU5piv6I635b6X6Z+z6KeG6aKRXG4gICAgaWYgKHRoaXMuX29wdGlvbnMuaXNBbGxvd0RlbW90aW9uR2V0U3RyZWFtICYmIG1lZGlhVHlwZSA9PT0gUkNDYWxsTWVkaWFUeXBlLkFVRElPX1ZJREVPKSB7XG4gICAgICBjb25zdCB7IGNvZGUsIHRyYWNrcyB9ID0gYXdhaXQgdGhpcy5fZ2V0TG9jYWxUcmFja0NvcmUoUkNDYWxsTWVkaWFUeXBlLkFVRElPX1ZJREVPLCBjb25zdHJhaW50cyk7XG5cbiAgICAgIC8vIOWmguaenOmfs+inhumikeS4jeiDveiOt+W+l++8jOWwsemZjee7hOiOt+W+l+mfs+mikVxuICAgICAgaWYgKGNvZGUgIT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIGNvbnN0IHsgY29kZSwgdHJhY2tzIH0gPSBhd2FpdCB0aGlzLl9nZXRMb2NhbFRyYWNrQ29yZShSQ0NhbGxNZWRpYVR5cGUuQVVESU8sIGNvbnN0cmFpbnRzKTtcbiAgICAgICAgaWYgKGNvZGUgIT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGNvZGUsIHRyYWNrcyB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgY29kZSwgdHJhY2tzIH07XG4gICAgfVxuICAgIGNvbnN0IHsgY29kZTogX2NvZGUsIHRyYWNrcyB9ID0gYXdhaXQgdGhpcy5fZ2V0TG9jYWxUcmFja0NvcmUobWVkaWFUeXBlLCBjb25zdHJhaW50cyk7XG4gICAgaWYgKF9jb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZTogX2NvZGUgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZTogX2NvZGUsIHRyYWNrcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOS7jnNlc3Npb25MaXN05Yig6Zmk5p+Q5Liqc2Vzc2lvblxuICAgKi9cbiAgcHJpdmF0ZSBfcmVtb3ZlU2Vzc2lvbihzZXNzaW9uOiBSQ0NhbGxTZXNzaW9uKSB7XG4gICAgY29uc3QgaWQgPSBzZXNzaW9uLmdldFNlc3Npb25JZCgpO1xuICAgIHRoaXMuX3Nlc3Npb25MaXN0ID0gdGhpcy5fc2Vzc2lvbkxpc3QuZmlsdGVyKChzZXNzaW9uKSA9PiBzZXNzaW9uLmdldFNlc3Npb25JZCgpICE9PSBpZCk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5bex5pa55YW25LuW56uv5Yqg5YWl6YCa6K+d77yI5bey5Yqg5YWlIFJUQyDmiL/pl7TvvInnmoTnlKjmiLfkv6Hmga9cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRKb2luZWRSb29tSW5mbygpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLCBkYXRhPzogSVJUQ0pvaW5lZEluZm9bXSB9PiB7XG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9jb250ZXh0LmdldFJUQ0pvaW5lZFVzZXJJbmZvKHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCkpO1xuICAgIGlmIChjb2RlICE9PSBFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYGdldEpvaW5lZFVzZXJJbmZvIGVycm9yIGNvZGU6ICR7Y29kZX1gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5RVUVSWV9KT0lORURfVVNFUl9JTkZPX0VSUk9SIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MsIGRhdGEgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva7lkbzlj6vjgIHmjILmlq3mjqjpgIHmlbDmja5cbiAgICogQHBhcmFtIGNhbGxQdXNoQ29uZmlnIOWRvOWPq+aOqOmAgemFjee9rlxuICAgKiBAcGFyYW0gY2FsbFB1c2hDb25maWcucHVzaFRpdGxlIOWRvOWPq+aOqOmAgeagh+mimFxuICAgKiBAcGFyYW0gY2FsbFB1c2hDb25maWcucHVzaENvbnRlbnQg5ZG85Y+r5o6o6YCB5YaF5a65XG4gICAqIEBwYXJhbSBodW5ndXBQdXNoQ29uZmlnIOaMguaWreaOqOmAgemFjee9rlxuICAgKiBAcGFyYW0gaHVuZ3VwUHVzaENvbmZpZy5wdXNoVGl0bGUg5oyC5pat5o6o6YCB5qCH6aKYXG4gICAqIEBwYXJhbSBodW5ndXBQdXNoQ29uZmlnLnB1c2hDb250ZW50IOaMguaWreaOqOmAgeWGheWuuVxuICAgKi9cbiAgcHVibGljIHNldFB1c2hDb25maWcoY2FsbFB1c2hDb25maWc6IElQdXNoQ29uZmlnID0ge30sIGh1bmd1cFB1c2hDb25maWc6IElQdXNoQ29uZmlnID0ge30pIHtcbiAgICBjb25zdCBjb25jbHVzaW9uID0gW2NhbGxQdXNoQ29uZmlnLCBodW5ndXBQdXNoQ29uZmlnXS5tYXAoKHB1c2hDb25maWc6IElQdXNoQ29uZmlnKSA9PiB2YWxpZGF0ZVB1c2hDb25maWcocHVzaENvbmZpZykpWzBdO1xuXG4gICAgY29uc3QgbWVzc2FnZXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgcmVzdWx0ID0gY29uY2x1c2lvbi5ldmVyeSgob2JqOiBJVmFsaWRhdGlvblJlc3VsdCkgPT4ge1xuICAgICAgIW9iai5yZXN1bHQgJiYgbWVzc2FnZXMucHVzaChvYmoubXNnISk7XG4gICAgICByZXR1cm4gb2JqLnJlc3VsdDtcbiAgICB9KTtcblxuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtSQ0NhbGxDbGllbnQgY2FsbEluR3JvdXAgY2FsbFB1c2hDb25maWcgb3IgaHVuZ3VwUHVzaENvbmZpZ10gJHttZXNzYWdlcy5qb2luKCdcXG4nKX1gKTtcbiAgICB9XG5cbiAgICB0aGlzLl9jYWxsUHVzaENvbmZpZyA9IGNhbGxQdXNoQ29uZmlnO1xuICAgIHRoaXMuX2h1bmd1cFB1c2hDb25maWcgPSBodW5ndXBQdXNoQ29uZmlnO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBJUGx1Z2luR2VuZXJhdG9yLCBJUnVudGltZSwgUlRDUGx1Z2luQ29udGV4dCwgVmVyc2lvbk1hbmFnZSxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHtcbiAgUkNDYWxsRXJyb3JDb2RlLCBSQ0NhbGxMYW5ndWFnZSwgUkNDYWxsRW5kUmVhc29uLCBSQ0NhbGxNZWRpYVR5cGUsIFJDQ2FsbFVzZXJTdGF0ZSwgUkNDYWxsU2Vzc2lvblN0YXRlLCBJRW5kU3VtbWFyeSwgSUludml0ZWRVc2VycywgSVNlbmRlckluZm8sIElPZmZsaW5lUmVjb3JkLFxufSBmcm9tICdAcmMtZW1iZWQvY2FsbC1lbmdpbmUnO1xuaW1wb3J0IHsgSVJDUlRDU3RhdGVSZXBvcnQgfSBmcm9tICdAcm9uZ2Nsb3VkL3BsdWdpbi1ydGMnO1xuaW1wb3J0IHtcbiAgSVJDQ2FsbEluaXRPcHRpb25zLCBJUkNDYWxsUGFyYW1zLCBJUkNDYWxsSW5Hcm91cFBhcmFtcywgSVNlc3Npb25MaXN0ZW5lciwgSU11dGVVc2VyLCBJTWVkaWFTdHJlYW1Db25zdHJhaW50cywgSURldmljZUNoYW5nZVBhcmFtcywgSVZhbGlkYXRpb25SZXN1bHQsIElQdXNoQ29uZmlnLFxufSBmcm9tICcuL2ludGVyZmFjZSc7XG5pbXBvcnQgUkNDYWxsQ2xpZW50IGZyb20gJy4vUkNDYWxsQ2xpZW50JztcbmltcG9ydCB7IFJDQ2FsbFNlc3Npb24gfSBmcm9tICcuL1JDQ2FsbFNlc3Npb24nO1xuaW1wb3J0IHsgdmFsaWRhdGVDYWxsSW5pdE9wdGlvbnMgfSBmcm9tICcuL3ZhbGlkYXRpb24nO1xuXG4vLyBwbHVnaW4tY2FsbCDniYjmnKzkuIrmiqVcblZlcnNpb25NYW5hZ2UuYWRkKCdwbHVnaW4tY2FsbCcsIF9fVkVSU0lPTl9fKTtcblxuY29uc3QgaW5zdGFsbGVyOiBJUGx1Z2luR2VuZXJhdG9yPFJDQ2FsbENsaWVudCwgSVJDQ2FsbEluaXRPcHRpb25zPiA9IHtcbiAgdGFnOiAnUkNDYWxsJyxcbiAgdmVyaWZ5KHJ1bnRpbWU6IElSdW50aW1lKSB7XG4gICAgcmV0dXJuIHJ1bnRpbWUudGFnID09PSAnYnJvd3Nlcic7XG4gIH0sXG4gIHNldHVwKGNvbnRleHQ6IFJUQ1BsdWdpbkNvbnRleHQsIHJ1bnRpbWU6IElSdW50aW1lLCBvcHRpb25zOiBJUkNDYWxsSW5pdE9wdGlvbnMpOiBSQ0NhbGxDbGllbnQge1xuICAgIC8vIOWFiOagoemqjOWPguaVsFxuICAgIGNvbnN0IGNvbmNsdXNpb246IElWYWxpZGF0aW9uUmVzdWx0ID0gdmFsaWRhdGVDYWxsSW5pdE9wdGlvbnMob3B0aW9ucyk7XG4gICAgaWYgKCFjb25jbHVzaW9uLnJlc3VsdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBbUkNDYWxsTGliIGluc3RhbGxlciBzdGV1cF0ke2NvbmNsdXNpb24ubXNnfWApO1xuICAgIH1cblxuICAgIC8vIOagoemqjOW9k+WJjeWuieijheeahCBlbmdpbmUg54mI5pys5piv5ZCm5Y+v55SoXG4gICAgaWYgKCFWZXJzaW9uTWFuYWdlLnZhbGlkRW5naW5lKF9fUkVRVUlSRURfRU5HSU5FX1ZFUlNJT05fXykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGN1cnJlbnQgZW5naW5lIHZlcnNpb24gJyR7VmVyc2lvbk1hbmFnZS5nZXRJbmZvKCkuZW5naW5lfScgZXJyb3IsIHBsdWdpbi1jYWxsIHJlcXVpcmVkIGVuZ2luZSB2ZXJzaW9uIGF0IGxlYXN0ICcke19fUkVRVUlSRURfRU5HSU5FX1ZFUlNJT05fX30nLmApO1xuICAgIH1cblxuICAgIGNvbnN0IGxvZ2dlciA9IGNvbnRleHQuY3JlYXRlTG9nZ2VyKCdSQ0NhbGwnLCAnUlRDJyk7XG4gICAgbG9nZ2VyLndhcm4oJ18nLCBgUkNDYWxsIFZlcnNpb246ICR7X19WRVJTSU9OX199LCBDb21taXQ6ICR7X19DT01NSVRfSURfX31gKTtcblxuICAgIHJldHVybiBuZXcgUkNDYWxsQ2xpZW50KGNvbnRleHQsIHJ1bnRpbWUsIGxvZ2dlciwgb3B0aW9ucyk7XG4gIH0sXG59O1xuXG5leHBvcnQge1xuICBpbnN0YWxsZXIsXG4gIFJDQ2FsbENsaWVudCxcbiAgUkNDYWxsU2Vzc2lvbixcbiAgUkNDYWxsTGFuZ3VhZ2UsXG4gIFJDQ2FsbEVycm9yQ29kZSxcbiAgUkNDYWxsRW5kUmVhc29uLFxuICBSQ0NhbGxNZWRpYVR5cGUsXG4gIFJDQ2FsbFVzZXJTdGF0ZSxcbiAgUkNDYWxsU2Vzc2lvblN0YXRlLFxufTtcblxuZXhwb3J0IHR5cGUge1xuICBJRW5kU3VtbWFyeSxcbiAgSVJDQ2FsbEluaXRPcHRpb25zLFxuICBJUkNDYWxsUGFyYW1zLFxuICBJUkNDYWxsSW5Hcm91cFBhcmFtcyxcbiAgSVNlc3Npb25MaXN0ZW5lcixcbiAgSVNlbmRlckluZm8sXG4gIElNdXRlVXNlcixcbiAgSUludml0ZWRVc2VycyxcbiAgSU1lZGlhU3RyZWFtQ29uc3RyYWludHMsXG4gIElEZXZpY2VDaGFuZ2VQYXJhbXMsXG4gIElPZmZsaW5lUmVjb3JkLFxuICBJUkNSVENTdGF0ZVJlcG9ydCxcbiAgSVB1c2hDb25maWcsXG59O1xuIl0sIm5hbWVzIjpbInN0cmluZzEwdG82NCIsIm51bWJlciIsImNoYXJzIiwicmFkaXgiLCJxdXRpZW50IiwiYXJyIiwibW9kIiwiZ2V0VVVJRCIsImMiLCJyIiwiZ2V0VVVJRDIyIiwidXVpZCIsImdlbmVyYXRlUmFuZG9tSWQiLCJyYW5kb20iLCJ0aW1lclNldFRpbWVvdXQiLCJmdW5jIiwidGltZW91dCIsImV2ZW50RW1pdHRlciIsIkV2ZW50RW1pdHRlciIsImdldENhbGxEZXZpY2VJZCIsInJ1bnRpbWUiLCJrZXkiLCJNc2dDYWxsU3RhdHVzIiwiTXNnQ2FsbFN0YXR1czIiLCJSQ0NhbGxFcnJvckNvZGUiLCJSQ0NhbGxFbmRSZWFzb24iLCJDYWxsUmVtb3RlRW5kUmVhc29uIiwiUkNDYWxsTWVzc2FnZVR5cGUiLCJSQ0NhbGxTZXNzaW9uU3RhdGUiLCJSQ0NhbGxTZXNzaW9uU3RhdGUyIiwiUkNDYWxsVXNlclN0YXRlIiwiUkNDYWxsVXNlclN0YXRlMiIsIlJDQ3Jvc3NDYWxsVHlwZSIsIlRpbWVyJDEiLCJjYWxsYmFjayIsIl9fcHVibGljRmllbGQiLCJlbmRUaW1lIiwiZHVyYXRpb24iLCJSQ0NhbGxTdGF0ZU1hY2hpbmUiLCJfY29udGV4dCIsIl9ydW50aW1lIiwiX2xvZ2dlciIsIl9jYWxsTXNnSGFuZGxlciIsIl9jaGFubmVsSWQiLCJfY29udmVyc2F0aW9uVHlwZSIsIl90YXJnZXRJZCIsIl9tZWRpYVR5cGUiLCJfY2FsbElkIiwic2VudFRpbWUiLCJkZWxheVRpbWUiLCJ1c2VySWQiLCJzdGF0ZSIsInJlYXNvbiIsIl9hIiwidXNlciIsIm1lc3NhZ2UiLCJzZW5kZXJVc2VySWQiLCJ1c2VyUHJvZmlsZSIsImh1bmd1cFJlYXNvbiIsIm1lc3NhZ2VUeXBlIiwiZW5kUmVhc29uIiwicmVtb3RlVXNlcklkIiwibXNnRGV2aWNlSWQiLCJzdWlkIiwiZGV2aWNlSWQiLCJzZW5kZXJEZXZpY2VJZCIsImN1cnJlbnRVc2VySWQiLCJDb252ZXJzYXRpb25UeXBlIiwiaXNDdXJyZW50VXNlcklkIiwibWVkaWFUeXBlIiwiY29udGVudCIsImlzTGVzc1RoYW5Ud28iLCJpc0ludml0ZVVzZXIiLCJpc05vT25lQW5zd2VyZWQiLCJ3YXRjaGVycyIsImluaWRzIiwicm9vbVR5cGUiLCJ1c2VySWRMaXN0IiwiaWQiLCJpbnZpdGVVc2VySWRzIiwiVGltZXIiLCJleGlzdGVkVXNlclBvZmlsZXMiLCJjYWxsZXIiLCJuZWVkUmluZ2luZ1VzZXJJZHMiLCJ1c2VySW5mbyIsImNhbGxTdGF0dXMiLCJlcnJvciIsInVzZXJJZHMiLCJleHRyYSIsInB1c2hUaXRsZSIsInB1c2hDb250ZW50IiwiaXNDcm9zc0FwcGtleSIsImNvZGUiLCJpc0NhbGxlciIsImVuZENvZGUiLCJvcHRpb25zIiwiZXhpc3RlZFVzZXJJZHMiLCJoYW5ndXBQYXJhbXMiLCJtc2dDb2RlIiwicmVtb3RlVXNlcnMiLCJwdXNoQ29uZmlnIiwicmVtb3RlVXNlciIsInVpZCIsImJlZ2luVGltZXN0YW1wIiwiZW5kVGltZXN0YW1wIiwic3VtbWFyeSIsIlJDQ2FsbE1lZGlhVHlwZSIsIlJDQ2FsbE1lZGlhVHlwZTIiLCJNZW1iZXJNb2RpZnlUeXBlIiwiTWVtYmVyTW9kaWZ5VHlwZTIiLCJQbGF0Zm9ybSIsIk9mZmxpbmVSZWNvcmRlciIsIl9vblJlY29yZCIsImNoYW5uZWxJZCIsImNvbnZlcnNhdGlvblR5cGUiLCJ0YXJnZXRJZCIsImNhbGxJZCIsImlzU2VsZlNlbmQiLCJtZXNzYWdlcyIsIm1zZyIsImNhbGxNc2dUeXBlcyIsIkVuZ2luZUVycm9yQ29kZVRvQ2FsbEVycm9yQ29kZSIsIkVycm9yQ29kZSIsIkNhbGxNZXNzYWdlSGFuZGxlciIsIl9vZmZsaW5lTXNnSXR2IiwiX2dldFN0YXRlTWFjaGluZSIsInJlY29yZCIsIm1hcmtUaW1lIiwiY3VycmVudE1zZ1NlbnRUaW1lIiwiaW5zZXJ0SW5kZXgiLCJpbmRleCIsImN1cnJlbnRUaW1lIiwiYnVmZmVycyIsIml0ZW0iLCJtZXNzYWdlVUlkIiwiaXNPZmZMaW5lTWVzc2FnZSIsIm9mZmxpbmVCdWZmZXJzIiwiaW52aXRlQ2FsbElkIiwiaXNJbnZpdGVNc2dUeXBlIiwiaXNMZXNzVGhhbk9mZmxpbmVNc2dJdHYiLCJ0YXNrTXNnTGlzdCIsImkiLCJvdGhlckNhbGxJZCIsImRlbEluZGV4IiwiZGVsT2ZmbGluZUluZGV4IiwiaXNVbmZpbmlzaGVkUHJpdmF0ZUNhbGwiLCJpc09ubHlJbnZpdGUiLCJoYXNJbnZpdGVBbmRSaW5naW5nIiwiaXNVbmZpbmlzaGVkR3JwQ2FsbCIsImlzVW5maW5pc2hlZCIsIm5vT25lQWNjZXB0IiwiYWxsVXNlcklkcyIsImlzQ2FsbGVySHVuZ3VwIiwidGFza01zZ1NlbmRlclVzZXJJZCIsImRlbENvdW50IiwibGlzdGVuZXIiLCJmdW5jTmFtZSIsImV2ZW50IiwiZXZlbnRUeXBlIiwiZGlyZWN0aW9uYWxVc2VySWRMaXN0IiwicHVzaERhdGEiLCJzZW5kT3B0cyIsImNhbGxlcklkIiwiUkNDYWxsTGFuZ3VhZ2UiLCJFTiIsIlpIIiwiTG9jYWwiLCJsYW5nIiwiVmVyc2lvbk1hbmFnZSIsIlJDQ2FsbEVuZ2luZSIsIl93YXRjaGVycyIsIl9vcHRpb25zIiwiY3J0VXNlcklkIiwiaW5mbyIsIlByb2R1Y2VUeXBlcyIsImZ1biIsIm9uIiwiZGF0YSIsImZ1bnMiLCJjYiIsImxlbmd0aCIsImlzTGFuZ3VhZ2UiLCJ2YWwiLCJpc0pvaW5UeXBlIiwiUlRDSm9pblR5cGUiLCJpc0xvZ0xldmVsIiwiTG9nTGV2ZWwiLCJ2YWxpZGF0ZUNhbGxJbml0T3B0aW9ucyIsImtleU5hbWVzIiwia2V5cyIsIm1pc3NpbmdLZXlzIiwidmFsaWRhdGVMaXN0ZW5lciIsInZhbGlkYXRlVGFyZ2V0SWQiLCJ2YWxpZGF0ZU1lZGlhVHlwZSIsInZhbGlkYXRlRXh0cmEiLCJ2YWxpZGF0ZVB1c2hUaXRsZSIsInZhbGlkYXRlUHVzaENvbnRlbnQiLCJ2YWxpZGF0ZVB1c2hDb25maWciLCJjb25jbHVzaW9uIiwidmFsaWRhdGVVc2VySWRzIiwic3RyIiwiaXNSQ0ZyYW1lUmF0ZSIsImlzVmFsaWRSZXNvbHV0aW9uIiwicmVzb2x1dGlvbiIsIlJDUmVzb2x1dGlvbiIsInZhbGlkYXRlTWVkaWFTdHJlYW1Db25zdHJhaW50cyIsImNvbnN0cmFpbnRzIiwiUkNDYWxsU2Vzc2lvbiIsIl9zdGF0ZU1hY2hpbmUiLCJfcnRjQ2xpZW50Iiwicm9vbUlkIiwic3VtbWFyeUluZm8iLCJzZW5kZXIiLCJpbnZpdGVkVXNlcnMiLCJjYWxsQmFjayIsInJvb20iLCJSQ1JUQ0NvZGUiLCJ0cmFja3MiLCJpc0FsbG93U3Vic2NyaWJlUmV0cnkiLCJjb3VudCIsImlzQWxsb3dQdWJsaXNoUmV0cnkiLCJ0cmFjayIsIl9jb2RlIiwiYXVkaW9Db25zdHJhaW50cyIsInJlY2VudFRyYWNrcyIsImxvY2FsVHJhY2tzIiwiX2IiLCJvYmoiLCJsb2NhbFZpZGVvVHJhY2tzIiwibG9jYWxBdWRpb3RyYWNrcyIsImJ5U2VydmVyIiwiUkNLaWNrUmVhc29uIiwibmFtZSIsImF1ZGlvVHJhY2siLCJtdXRlVXNlciIsInZpZGVvVHJhY2siLCJyZXN1bHQiLCJyZXBvcnQiLCJSQ0NhbGxDbGllbnQiLCJzZXNzaW9uIiwic2VzIiwic3RhdGVNYWNoaW5lIiwiYml0cmF0ZSIsInB1c2hUaXRsZVZhbHVlIiwicHVzaENvbnRlbnRWYWx1ZSIsIl9jIiwiY2FsbFB1c2hDb25maWciLCJodW5ndXBQdXNoQ29uZmlnIiwiaW5zdGFsbGVyIiwiY29udGV4dCIsImxvZ2dlciJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFFQSxNQUFNQSxLQUFlLENBQUNDLE1BQW1CO0FBQ2pDLFFBQUFDLElBQVEsbUVBQW1FLE1BQU0sRUFBRSxHQUNuRkMsSUFBUUQsRUFBTSxTQUFTO0FBQzdCLE1BQUlFLElBQVUsQ0FBQ0g7QUFDZixRQUFNSSxJQUFNLENBQUE7QUFDVCxLQUFBO0FBQ0QsVUFBTUMsSUFBTUYsSUFBVUQ7QUFDdEIsSUFBQUMsS0FBV0EsSUFBVUUsS0FBT0gsR0FDeEJFLEVBQUEsUUFBUUgsRUFBTUksQ0FBRyxDQUFDO0FBQUEsV0FDZkY7QUFDRixTQUFBQyxFQUFJLEtBQUssRUFBRTtBQUNwQixHQUVNRSxLQUFVLE1BQU0sdUNBQXVDLFFBQVEsU0FBUyxDQUFDQyxNQUFNO0FBQ25GLFFBQU1DLElBQUksS0FBSyxPQUFPLElBQUksS0FBSztBQUV4QixVQURHRCxNQUFNLE1BQU1DLElBQUtBLElBQUksSUFBTSxHQUM1QixTQUFTLEVBQUU7QUFDdEIsQ0FBQyxHQUdZQyxLQUFZLE1BQU07QUFDN0IsTUFBSUMsSUFBd0JKO0FBQzVCLFNBQUFJLElBQU8sR0FBR0EsRUFBSyxRQUFRLE1BQU0sRUFBRSxNQUN4QkEsSUFBQSxTQUFTQSxHQUFNLEVBQUUsR0FDeEJBLElBQU9YLEdBQWFXLENBQUksR0FDcEJBLEVBQUssU0FBUyxPQUNUQSxJQUFBQSxFQUFLLE1BQU0sR0FBRyxFQUFFLElBRWxCQTtBQUNULEdBS2FDLElBQW1CLE1BQWM7QUFDNUMsUUFBTUMsSUFBUyxLQUFLLE1BQU0sS0FBSyxPQUFBLElBQVcsR0FBSTtBQUM5QyxNQUFJRixJQUFPRDtBQUNKLFNB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
2595
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZXNtLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9lbmdpbmUvaGVscGVyLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvZW51bXMvTXNnQ2FsbFN0YXR1cy50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL2VudW1zL1JDQ2FsbENvZGUudHMiLCIuLi8uLi8uLi9lbmdpbmUvY29yZS9lbnVtcy9SQ0NhbGxFbmRSZWFzb24udHMiLCIuLi8uLi8uLi9lbmdpbmUvY29yZS9lbnVtcy9SQ0NhbGxNZXNzYWdlVHlwZS50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL2VudW1zL1JDQ2FsbFNlc3Npb25TdGF0ZS50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL2VudW1zL1JDQ2FsbFVzZXJTdGF0ZS50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL2VudW1zL1JDQ3Jvc3NDYWxsVHlwZS50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL1RpbWVyLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvU3RhdGVNYWNoaW5lLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvZW51bXMvUkNDYWxsTWVkaWFUeXBlLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvZW51bXMvTWVtYmVyTW9kaWZ5VHlwZS50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL2VudW1zL1BsYXRmb3JtLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvT2ZmbGluZVJlY29yZGVyLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvTWVzc2FnZUhhbmRsZXIudHMiLCIuLi8uLi8uLi9lbmdpbmUvY29yZS9lbnVtcy9SQ0NhbGxMYW5nLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvbG9jYWxlL2VuLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvbG9jYWxlL3poLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvbG9jYWxlL2luZGV4LnRzIiwiLi4vLi4vLi4vZW5naW5lL2luZGV4LnRzIiwiLi4vLi4vLi4vc3JjL2VudW1zLnRzIiwiLi4vLi4vLi4vc3JjL3V0aWxzLnRzIiwiLi4vLi4vLi4vc3JjL2V2ZW50RW1pdHRlci50cyIsIi4uLy4uLy4uL3NyYy92YWxpZGF0aW9uLnRzIiwiLi4vLi4vLi4vc3JjL2hlbHBlci50cyIsIi4uLy4uLy4uL3NyYy90aW1lci50cyIsIi4uLy4uLy4uL3NyYy9SQ0NhbGxTZXNzaW9uLnRzIiwiLi4vLi4vLi4vc3JjL1JDQ2FsbENsaWVudC50cyIsIi4uLy4uLy4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIsIElSdW50aW1lIH0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuXG5jb25zdCBzdHJpbmcxMHRvNjQgPSAobnVtYmVyOiBudW1iZXIpID0+IHtcbiAgY29uc3QgY2hhcnMgPSAnMDEyMzQ1Njc4OWFiY2RlZmdoaWdrbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJR0tMTU5PUFFSU1RVVldYWVorLycuc3BsaXQoJycpO1xuICBjb25zdCByYWRpeCA9IGNoYXJzLmxlbmd0aCArIDE7XG4gIGxldCBxdXRpZW50ID0gK251bWJlcjtcbiAgY29uc3QgYXJyID0gW107XG4gIGRvIHtcbiAgICBjb25zdCBtb2QgPSBxdXRpZW50ICUgcmFkaXg7XG4gICAgcXV0aWVudCA9IChxdXRpZW50IC0gbW9kKSAvIHJhZGl4O1xuICAgIGFyci51bnNoaWZ0KGNoYXJzW21vZF0pO1xuICB9IHdoaWxlIChxdXRpZW50KTtcbiAgcmV0dXJuIGFyci5qb2luKCcnKTtcbn07XG5cbmNvbnN0IGdldFVVSUQgPSAoKSA9PiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIChjKSA9PiB7XG4gIGNvbnN0IHIgPSBNYXRoLnJhbmRvbSgpICogMTYgfCAwO1xuICBjb25zdCB2ID0gYyA9PT0gJ3gnID8gciA6IChyICYgMHgzIHwgMHg4KTtcbiAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xufSk7XG5cbi8qIOiOt+WPliAyMiDkvY3nmoQgVVVJRCAqL1xuZXhwb3J0IGNvbnN0IGdldFVVSUQyMiA9ICgpID0+IHtcbiAgbGV0IHV1aWQ6IHN0cmluZyB8IG51bWJlciA9IGdldFVVSUQoKTtcbiAgdXVpZCA9IGAke3V1aWQucmVwbGFjZSgvLS9nLCAnJyl9MGA7XG4gIHV1aWQgPSBwYXJzZUludCh1dWlkLCAxNik7XG4gIHV1aWQgPSBzdHJpbmcxMHRvNjQodXVpZCk7XG4gIGlmICh1dWlkLmxlbmd0aCA+IDIyKSB7XG4gICAgdXVpZCA9IHV1aWQuc2xpY2UoMCwgMjIpO1xuICB9XG4gIHJldHVybiB1dWlkO1xufTtcblxuLyoqXG4gKiDnlJ/miJDpmo/mnLogaWQg5a2X56ym5LiyXG4gKi9cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZVJhbmRvbUlkID0gKCk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHJhbmRvbSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDApO1xuICBsZXQgdXVpZCA9IGdldFVVSUQyMigpO1xuICB1dWlkID0gdXVpZC5yZXBsYWNlKC9cXC8vZywgJzAnKTtcbiAgY29uc3QgaW5mbyA9IFt1dWlkLCBEYXRlLm5vdygpLCByYW5kb21dO1xuICByZXR1cm4gaW5mby5qb2luKCdfJyk7XG59O1xuXG5leHBvcnQgY29uc3QgdGltZXJTZXRUaW1lb3V0ID0gKGZ1bmM6IEZ1bmN0aW9uLCB0aW1lb3V0OiBudW1iZXIpOiBudW1iZXIgPT4gc2V0VGltZW91dChmdW5jLCB0aW1lb3V0KSBhcyBudW1iZXI7XG5cbmV4cG9ydCBjb25zdCB0aW1lckludGVydmFsID0gKGZ1bjogRnVuY3Rpb24sIGl0djogbnVtYmVyKTogbnVtYmVyID0+IHNldEludGVydmFsKGZ1biwgaXR2KSBhcyBudW1iZXI7XG5cbmV4cG9ydCBjb25zdCBldmVudEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbi8qKlxuICogY2FsbCBkZXZpY2VJZCDlrZjlgqjlnKggc2Vzc2lvblN0b3JhZ2Ug5LitXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRDYWxsRGV2aWNlSWQgPSAocnVudGltZTogSVJ1bnRpbWUpID0+IHtcbiAgY29uc3Qga2V5ID0gJ1JDQ2FsbERldmljZUlkJztcbiAgbGV0IHV1aWQgPSBydW50aW1lLnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgaWYgKCF1dWlkKSB7XG4gICAgdXVpZCA9IGdldFVVSUQyMigpO1xuICAgIHJ1bnRpbWUuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShrZXksIHV1aWQpO1xuICB9XG4gIHJldHVybiB1dWlkO1xufTtcbiIsIi8qKlxuICog5rOo6YeKXG4gKiBUT0RPXG4gKi9cbmV4cG9ydCBlbnVtIE1zZ0NhbGxTdGF0dXMge1xuICBPVVRHT0lORyA9IDEsIC8vIHdhaXRpbmdcbiAgSU5DT01JTkcsIC8vIHdhaXRpbmdcbiAgUklOR0lORywgLy8gd2FpdGluZ1xuICBDT05ORUNURUQsIC8vIGtlZXBpbmdcbiAgSURMRSwgLy8gZW5kXG4gIEFDQ0VQVEVEIC8vIHdhaXRpbmdcbn1cbiIsIi8qKlxuICog6ZSZ6K+v56CB77yM5LiO56e75Yqo56uv5a+56b2QXG4gKiBAZGVzY3JpcHRpb25cbiAqIDEuIGA1MTAwMCAtIDUxOTk5YCDkuLogQW5kcm9pZCDkuJPnlKjmrrVcbiAqIDIuIGA1MjAwMCAtIDUyOTk5YCDkuLogaU9TIOS4k+eUqOautVxuICogMy4gYDUzMDAwIC0gNTMxOTlgIOS4uiBXZWIgUlRDIOS4k+eUqOautVxuICogNC4gYDUzMjAwIC0gNTM0OTlgIOS4uiBXZWIgQ2FsbExpYiDkuJPnlKjmrrVcbiAqICogIGA1MzIwMCAtIDUzMjk5YCDkuLogV2ViIENhbGxFbmdpbmUg5LiT55So56uvXG4gKiAqICBgNTMzMDAgLSA1MzQ5OWAg5Li6IFdlYiBDYWxsIOS4k+eUqOerr1xuICogNS4gYDUzNTAwIC0gNTM5OTlgIOS4uiBXZWIg5L+d55WZ5q61XG4gKi9cbmV4cG9ydCBlbnVtIFJDQ2FsbEVycm9yQ29kZSB7XG4gIC8qKlxuICAgKiDmiJDlip9cbiAgICovXG4gIFNVQ0NFU1MgPSAxMDAwMCxcbiAgLyoqXG4gICAqIOWtmOWcqOacque7k+adn+eahOeKtuaAgeaculxuICAgKi9cbiAgU1RBVEVfTUFDSElORV9FWElUID0gNTMyMDAsXG4gIC8qKlxuICAgKiDlj5HpgIEgSU0g5raI5oGv5aSx6LSlXG4gICAqL1xuICBTRU5EX01TR19FUlJPUiA9IDUzMjAxLFxuICAvKipcbiAgICog6KKr5a+55pa55Yqg5YWl6buR5ZCN5Y2VXG4gICAqL1xuICBSRUpFQ1RFRF9CWV9CTEFDS0xJU1QgPSA1MzIwMixcbiAgLyoqXG4gICAqIOW9k+WJjeeUqOaIt+S4jeWGjee+pOe7hOS4rVxuICAgKi9cbiAgTk9UX0lOX0dST1VQID0gNTMyMDMsXG5cbiAgLyoqXG4gICAqIENhbGwg55u45YWzXG4gICAqL1xuICAvKipcbiAgICog6I635b6X5pys5Zyw6Z+z6aKR5rWB5aSx6LSlXG4gICAqL1xuICBHRVRfTE9DQUxfQVVESU9fVFJBQ0tfRVJST1IgPSA1MzMwMSxcblxuICAvKipcbiAgICog6I635b6X5pys5Zyw6KeG6aKR5rWB5aSx6LSlXG4gICAqL1xuICBHRVRfTE9DQUxfVklERU9fVFJBQ0tfRVJST1IgPSA1MzMwMixcblxuICAvKipcbiAgICog6I635b6X5pys5Zyw6Z+z6KeG6aKR5rWB5aSx6LSlXG4gICAqL1xuICBHRVRfTE9DQUxfQVVESU9fQU5EX1ZJREVPX1RSQUNLX0VSUk9SID0gNTMzMDMsXG5cbiAgLyoqXG4gICAqIOWKoOWFpeaIv+mXtOWksei0pVxuICAgKi9cbiAgSk9JTl9ST09NX0VSUk9SID0gNTMzMDQsXG5cbiAgLyoqXG4gICAqIOWPkeW4g+mfs+mikeWksei0pVxuICAgKi9cbiAgQVVESU9fUFVCTElTSF9FUlJPUiA9IDUzMzA1LFxuXG4gIC8qKlxuICAgKiDlj5HluIPop4bpopHlpLHotKVcbiAgICovXG4gIFZJREVPX1BVQkxJU0hfRVJST1IgPSA1MzMwNixcblxuICAvKipcbiAgICog5Y+R5biD6Z+z6KeG6aKR5aSx6LSlXG4gICAqL1xuICBBVURJT19BTkRfVklERU9fUFVCTElTSF9FUlJPUiA9IDUzMzA3LFxuXG4gIC8qKlxuICAgKiDmn6Xor6LmiL/pl7TnlKjmiLfkv6Hmga/lpLHotKVcbiAgICovXG4gIFFVRVJZX0pPSU5FRF9VU0VSX0lORk9fRVJST1IgPSA1MzMwOCxcblxuICAvKipcbiAgICog56aB55So5ZCv55So6KeG6aKR5pe277yM5oi/6Ze05YaF57y65bCR6KeG6aKR5rWBXG4gICAqL1xuICBNSVNTSU5HX1ZJREVPX1RSQUNLX0VSUk9SID0gNTMzMDksXG5cbiAgLyoqXG4gICAqIOWPlua2iOWPkeW4g+inhumikeWksei0pVxuICAgKi9cbiAgVU5QVUJMSVNIX1ZJREVPX0VSUk9SID0gNTMzMTAsXG5cbiAgLyoqXG4gICAqIOS8muivneS4jeaYr+e+pOe7hFxuICAgKi9cbiAgQ09OVkVSU0FUSU9OX05PVF9HUk9VUF9FUlJPUiA9IDUzMzExLFxuXG4gIC8qKlxuICAqIOS4jeWcqHJvb23kuK3npoHnlKjpn7Pop4bpopFcbiAgKi9cbiAgTk9UX0lOX1JPT01fRVJST1IgPSA1MzMxMlxuXG59XG4iLCIvKipcbiAqIOaMguaWreWOn+WboFxuICogQGRlc2NyaXB0aW9uXG4gKiDmoLnmja7ljp/mnIkgSGFuZ3VwUmVhc29uIOiuvuiuoe+8jOW3seaWueWOn+WboOS4juWvueaWueWOn+WboOacieebuOW3riAxMCDnmoTlt67ot50uXG4gKiDnjrDmnInmnKzlnLDljp/lm6Dlj5blgLzojIPlm7Q6IDEgfiAxMCwg6L+c56uv5Y6f5Zug5Y+W5YC86IyD5Zu0OiAxMSB+IDIwLlxuICog5Li65L6/5LqOIEhhbmd1cFJlYXNvbiDmianlsZXvvIzkv53nlZkgMTAwIOS7peWGheeahOWPluWAvC5cbiAqIOmcgOimgeWGjeasoeaJqeWxleaXtu+8jOW3seaWueWOn+WboOS9v+eUqDogMjEgfiAzMCwg5a+55bqU5a+55pa55Y6f5Zug5L2/55SoOiAzMSB+IDQwLFxuICog5Lul5q2k57G75o6o77yMXG4gKiDlt7Hmlrnljp/lm6Dkvb/nlKg6IDQxIH4gNTAsIOWvueaWueWOn+WboOS9v+eUqDogNTEgfiA2MCxcbiAqIOW3seaWueWOn+WboOS9v+eUqDogNjEgfiA3MCwg5a+55pa55Y6f5Zug5L2/55SoOiA3MSB+IDgwLFxuICog5bex5pa55Y6f5Zug5L2/55SoOiA3MSB+IDkwLCDlr7nmlrnljp/lm6Dkvb/nlKg6IDkxIH4gMTAwLlxuICpcbiAqIOWQhOW5s+WPsOeLrOacieWtl+auteiMg+WbtFxuICogQW5kcm9pZCAyMDEgfiAyOTlcbiAqIGlPUyAgICAgMzAxIH4gMzk5XG4gKiBXZWIgICAgIDQwMSB+IDQ5OVxuICog6K+m57uG5paH5qGj77yaaHR0cHM6Ly9naXRib29rLnJvbmdjbG91ZC5uZXQvcnRjLWRvY3MvIy9ydGMtY2xpZW50L2lvcy9hbmFseXNpcy9jYWxsbGliL0hhbmd1cFJlYXNvblxuICovXG5leHBvcnQgZW51bSBSQ0NhbGxFbmRSZWFzb24ge1xuICAvKipcbiAgICog5bex5pa55Y+W5raI5bey5Y+R5Ye655qE6YCa6K+d6K+35rGCXG4gICAqL1xuICBDQU5DRUwgPSAxLFxuICAvKipcbiAgICog5bex5pa55ouS57ud5pS25Yiw55qE6YCa6K+d6K+35rGCXG4gICAqL1xuICBSRUpFQ1QgPSAyLFxuICAvKipcbiAgICog5bex5pa55oyC5patXG4gICAqL1xuICBIQU5HVVAgPSAzLFxuICAvKipcbiAgICog5bex5pa55b+Z56KMXG4gICAqL1xuICBCVVNZX0xJTkUgPSA0LFxuICAvKipcbiAgICog5bex5pa55pyq5o6l5ZCsXG4gICAqL1xuICBOT19SRVNQT05TRSA9IDUsXG4gIC8qKlxuICAgKiDlt7HmlrnkuI3mlK/mjIHlvZPliY3pn7Pop4bpopHlvJXmk45cbiAgICovXG4gIEVOR0lORV9VTlNVUFBPUlRFRCA9IDYsXG4gIC8qKlxuICAgKiDlt7HmlrnnvZHnu5zplJnor69cbiAgICovXG4gIE5FVFdPUktfRVJST1IgPSA3LFxuICAvKipcbiAgICog5bex5pa55pGE5YOP5aS06LWE5rqQ6I635Y+W5aSx6LSl77yM5Y+v6IO95piv5p2D6ZmQ5Y6f5ZugXG4gICAqL1xuICBHRVRfTUVESUFfUkVTT1VSQ0VTX0VSUk9SID0gOCxcbiAgLyoqXG4gICAqIOW3seaWuei1hOa6kOWPkeW4g+Wksei0pVxuICAgKi9cbiAgUFVCTElTSF9FUlJPUiA9IDksXG4gIC8qKlxuICAgKiDlt7HmlrnorqLpmIXotYTmupDlpLHotKVcbiAgICovXG4gIFNVQlNDUklCRV9FUlJPUiA9IDEwLFxuICAvKipcbiAgICog5a+55pa55Y+W5raI5Y+R5Ye655qE6YCa6K+d6K+35rGCXG4gICAqL1xuICBSRU1PVEVfQ0FOQ0VMID0gMTEsXG4gIC8qKlxuICAgKiDlr7nmlrnmi5Lnu53mlLbliLDnmoTpgJror53or7fmsYJcbiAgICovXG4gIFJFTU9URV9SRUpFQ1QgPSAxMixcbiAgLyoqXG4gICAqIOmAmuivnei/h+eoi+S4reWvueaWueaMguaWrVxuICAgKi9cbiAgUkVNT1RFX0hBTkdVUCA9IDEzLFxuICAvKipcbiAgICog5a+55pa55b+Z56KMXG4gICAqL1xuICBSRU1PVEVfQlVTWV9MSU5FID0gMTQsXG4gIC8qKlxuICAgKiDlr7nmlrnmnKrmjqXlkKxcbiAgICovXG4gIFJFTU9URV9OT19SRVNQT05TRSA9IDE1LFxuICAvKipcbiAgICog5a+55pa55byV5pOO5LiN5pSv5oyBXG4gICAqL1xuICBSRU1PVEVfRU5HSU5FX1VOU1VQUE9SVEVEID0gMTYsXG4gIC8qKlxuICAgKiDlr7nmlrnnvZHnu5zplJnor69cbiAgICovXG4gIFJFTU9URV9ORVRXT1JLX0VSUk9SID0gMTcsXG4gIC8qKlxuICAgKiDlr7nmlrnmkYTlg4/lpLTotYTmupDojrflj5blpLHotKXvvIzlj6/og73mmK/mnYPpmZDljp/lm6BcbiAgICovXG4gIFJFTU9URV9HRVRfTUVESUFfUkVTT1VSQ0VfRVJST1IgPSAxOCxcbiAgLyoqXG4gICAqIOi/nOerr+i1hOa6kOWPkeW4g+Wksei0pVxuICAgKi9cbiAgUkVNT1RFX1BVQkxJU0hfRVJST1IgPSAxOSxcbiAgLyoqXG4gICAqIOi/nOerr+iuoumYhei1hOa6kOWksei0pVxuICAgKi9cbiAgUkVNT1RFX1NVQlNDUklCRV9FUlJPUiA9IDIwLFxuICAvKipcbiAgICog5bex5pa55YW25LuW56uv5bey5Yqg5YWl5paw6YCa6K+dXG4gICAqL1xuICBPVEhFUl9DTElFTlRfSk9JTkVEX0NBTEwgPSAyMSxcbiAgLyoqXG4gICAqIOW3seaWueWFtuS7luerr+W3suWcqOmAmuivneS4rVxuICAgKi9cbiAgT1RIRVJfQ0xJRU5UX0lOX0NBTEwgPSAyMixcbiAgLyoqXG4gICAqIOW3seaWueiiq+emgeatoumAmuivnVxuICAgKi9cbiAgS0lDS0VEX0JZX1NFUlZFUiA9IDIzLFxuICAvKipcbiAgICog5bex5pa55o6l5ZCs57O757uf6YCa6K+d77yI56e75Yqo56uv54m55pyJ77yJXG4gICovXG4gIEFDQ0VQVF9TWVNURU1fQ0FMTCA9IDI0LFxuICAvKipcbiAgICog6L+c56uv5YW25LuW56uv5bey5Yqg5YWl5paw6YCa6K+dXG4gICAqL1xuICBSRU1PVEVfT1RIRVJfQ0xJRU5UX0pPSU5FRF9DQUxMID0gMzEsXG4gIC8qKlxuICAgKiDov5znq6/lhbbku5bnq6/lt7LlnKjpgJror53kuK1cbiAgICovXG4gIFJFTU9URV9PVEhFUl9DTElFTlRfSU5fQ0FMTCA9IDMyLFxuICAvKipcbiAgICog6L+c56uv6KKr56aB5q2i6YCa6K+dXG4gICAqL1xuICBSRU1PVEVfS0lDS0VEX0JZX1NFUlZFUiA9IDMzLFxuICAvKipcbiAgICog6L+c56uv5o6l5ZCs57O757uf6YCa6K+d77yI56e75Yqo56uv54m55pyJ77yJXG4gICovXG4gIFJFTU9URV9BQ0NFUFRfU1lTVEVNX0NBTEwgPSAzNCxcbiAgLyoqXG4gICAqIOWFtuS7luerr+aOpeWQrFxuICAgKi9cbiAgQUNDRVBUX0JZX09USEVSX0NMSUVOVCA9IDEwMSxcbiAgLyoqXG4gICAqIOWFtuS7luerr+aMguaWrVxuICAgKi9cbiAgSEFOR1VQX0JZX09USEVSX0NMSUVOVCA9IDEwMixcbiAgLyoqXG4gICAqIOW3seaWueiiq+WvueaWueWKoOWFpem7keWQjeWNlVxuICAgKi9cbiAgQURERURfVE9fQkxBQ0tMSVNUID0gMTAzLFxuICAvKipcbiAgICog6Z+z6KeG6aKR5pyN5Yqh5pyq5byA6YCaXG4gICAqL1xuICBTRVJWSUNFX05PVF9PUEVORUQgPSAxMDRcbn1cblxuLyoqXG4gKiDlt7Hmlrnljp/lm6DovazkuLrlr7nmlrnljp/lm6BcbiAqL1xuZXhwb3J0IGNvbnN0IENhbGxSZW1vdGVFbmRSZWFzb246IHsgW2tleTogbnVtYmVyXTogUkNDYWxsRW5kUmVhc29uIH0gPSB7XG4gIFtSQ0NhbGxFbmRSZWFzb24uQ0FOQ0VMXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9DQU5DRUwsXG4gIFtSQ0NhbGxFbmRSZWFzb24uUkVKRUNUXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9SRUpFQ1QsXG4gIFtSQ0NhbGxFbmRSZWFzb24uSEFOR1VQXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9IQU5HVVAsXG4gIFtSQ0NhbGxFbmRSZWFzb24uQlVTWV9MSU5FXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9CVVNZX0xJTkUsXG4gIFtSQ0NhbGxFbmRSZWFzb24uTk9fUkVTUE9OU0VdOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05PX1JFU1BPTlNFLFxuICBbUkNDYWxsRW5kUmVhc29uLkVOR0lORV9VTlNVUFBPUlRFRF06IFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfRU5HSU5FX1VOU1VQUE9SVEVELFxuICBbUkNDYWxsRW5kUmVhc29uLk5FVFdPUktfRVJST1JdOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05FVFdPUktfRVJST1IsXG4gIFtSQ0NhbGxFbmRSZWFzb24uR0VUX01FRElBX1JFU09VUkNFU19FUlJPUl06IFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfR0VUX01FRElBX1JFU09VUkNFX0VSUk9SLFxuICBbUkNDYWxsRW5kUmVhc29uLlBVQkxJU0hfRVJST1JdOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX1BVQkxJU0hfRVJST1IsXG4gIFtSQ0NhbGxFbmRSZWFzb24uU1VCU0NSSUJFX0VSUk9SXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9TVUJTQ1JJQkVfRVJST1IsXG4gIFtSQ0NhbGxFbmRSZWFzb24uT1RIRVJfQ0xJRU5UX0pPSU5FRF9DQUxMXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9PVEhFUl9DTElFTlRfSk9JTkVEX0NBTEwsXG4gIFtSQ0NhbGxFbmRSZWFzb24uT1RIRVJfQ0xJRU5UX0lOX0NBTExdOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX09USEVSX0NMSUVOVF9JTl9DQUxMLFxuICBbUkNDYWxsRW5kUmVhc29uLktJQ0tFRF9CWV9TRVJWRVJdOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX0tJQ0tFRF9CWV9TRVJWRVIsXG4gIFtSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05PX1JFU1BPTlNFXTogUkNDYWxsRW5kUmVhc29uLk5PX1JFU1BPTlNFLFxuICBbUkNDYWxsRW5kUmVhc29uLkFDQ0VQVF9TWVNURU1fQ0FMTF06IFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfQUNDRVBUX1NZU1RFTV9DQUxMLFxufTtcbiIsImV4cG9ydCBlbnVtIFJDQ2FsbE1lc3NhZ2VUeXBlIHtcbiAgLyoqXG4gICAqIOmCgOivt+a2iOaBr1xuICAgKi9cbiAgVkNJbnZpdGUgPSAnUkM6VkNJbnZpdGUnLFxuICAvKipcbiAgICog5ZON6ZOD5raI5oGvXG4gICAqL1xuICBWQ1JpbmdpbmcgPSAnUkM6VkNSaW5naW5nJyxcbiAgLyoqXG4gICAqIOaOpeWQrOa2iOaBr1xuICAgKi9cbiAgVkNBY2NlcHQgPSAnUkM6VkNBY2NlcHQnLFxuICAvKipcbiAgICog5oyC5pat5raI5oGvXG4gICAqL1xuICBWQ0hhbmd1cCA9ICdSQzpWQ0hhbmd1cCcsXG4gIC8qKlxuICAgKiDnvqTlkbzkuK0g5Lq65ZGY5Y+Y5pu05raI5oGvXG4gICAqL1xuICBWQ01vZGlmeU1lbSA9ICdSQzpWQ01vZGlmeU1lbScsXG4gIC8qKlxuICAgKiDlqpLkvZPnsbvlnovkv67mlLnmtojmga9cbiAgICovXG4gIFZDTW9kaWZ5TWVkaWEgPSAnUkM6VkNNb2RpZnlNZWRpYScsXG59XG4iLCJleHBvcnQgZW51bSBSQ0NhbGxTZXNzaW9uU3RhdGUge1xuICAvKipcbiAgICog562J5b6F5bu656uL6L+e5o6lXG4gICAqL1xuICBXQUlUSU5HLFxuICAvKipcbiAgICog5Lya6K+d57u05oyB5LitXG4gICAqL1xuICBLRUVQSU5HLFxuICAvKipcbiAgICog5Lya6K+d5bey57uT5p2fXG4gICAqL1xuICBFTkRcbn1cbiIsImV4cG9ydCBlbnVtIFJDQ2FsbFVzZXJTdGF0ZSB7XG4gIC8qKlxuICAgKiDnlKjmiLfkuI3lrZjlnKjkuo7pgJror53kuK1cbiAgICovXG4gIE5PTkUgPSAwLFxuICAvKipcbiAgICog562J5b6F5o6l5ZCsXG4gICAqL1xuICBXQUlUSU5HLFxuICAvKipcbiAgICog6YCa6K+d5LitXG4gICAqL1xuICBLRUVQSU5HLFxufVxuIiwiZXhwb3J0IGVudW0gUkNDcm9zc0NhbGxUeXBlIHtcbiAgLyohXG4gIOWQjEFwcOmAmuivnVxuICAqL1xuICBSQ0NhbGxSb29tVHlwZU5vcm1hbENhbGwgPSAwLFxuICAvKiFcbiAg6LeoQXBw6YCa6K+dXG4gICovXG4gIFJDQ2FsbFJvb21UeXBlQWNyb3NzQ2FsbCA9IDdcbn1cbiIsImltcG9ydCB7IHRpbWVyU2V0VGltZW91dCB9IGZyb20gJy4uL2hlbHBlcic7XG5cbmV4cG9ydCBjbGFzcyBUaW1lciB7XG4gIHByaXZhdGUgX3RpbWVySWQ6IG51bWJlciA9IDBcblxuICBwcml2YXRlIF9zdGFydFRpbWU6IG51bWJlciA9IDBcblxuICBjb25zdHJ1Y3RvcihjYWxsYmFjazogRnVuY3Rpb24sIHRpbWVvdXQ6IG51bWJlcikge1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgdGhpcy5fdGltZXJJZCA9IHRpbWVyU2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB9LCB0aW1lb3V0KTtcbiAgICB9XG4gICAgdGhpcy5fc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgfVxuXG4gIHN0b3AoKToge1xuICAgIHN0YXJ0VGltZTogbnVtYmVyLFxuICAgIGVuZFRpbWU6IG51bWJlcixcbiAgICBkdXJhdGlvbjogbnVtYmVyXG4gICAgfSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVySWQpO1xuXG4gICAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCk7XG4gICAgbGV0IGR1cmF0aW9uID0gZW5kVGltZSAtIHRoaXMuX3N0YXJ0VGltZTtcbiAgICBpZiAodGhpcy5fc3RhcnRUaW1lID09PSAwKSB7XG4gICAgICBkdXJhdGlvbiA9IDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXJ0VGltZTogdGhpcy5fc3RhcnRUaW1lLFxuICAgICAgZW5kVGltZSxcbiAgICAgIGR1cmF0aW9uLFxuICAgIH07XG4gIH1cblxuICByZXNldCgpIHtcbiAgICB0aGlzLl9zdGFydFRpbWUgPSAwO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBDb252ZXJzYXRpb25UeXBlLCBJTG9nZ2VyLCBJUmVjZWl2ZWRNZXNzYWdlLCBJUnVudGltZSwgUlRDUGx1Z2luQ29udGV4dCxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgZXZlbnRFbWl0dGVyLCBnZXRDYWxsRGV2aWNlSWQgfSBmcm9tICcuLi9oZWxwZXInO1xuaW1wb3J0IHsgTXNnQ2FsbFN0YXR1cyB9IGZyb20gJy4vZW51bXMvTXNnQ2FsbFN0YXR1cyc7XG5pbXBvcnQgeyBSQ0NhbGxFcnJvckNvZGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbENvZGUnO1xuaW1wb3J0IHsgQ2FsbFJlbW90ZUVuZFJlYXNvbiwgUkNDYWxsRW5kUmVhc29uIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxFbmRSZWFzb24nO1xuaW1wb3J0IHsgUkNDYWxsTWVkaWFUeXBlIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxNZWRpYVR5cGUnO1xuaW1wb3J0IHsgUkNDYWxsTWVzc2FnZVR5cGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbE1lc3NhZ2VUeXBlJztcbmltcG9ydCB7IFJDQ2FsbFNlc3Npb25TdGF0ZSB9IGZyb20gJy4vZW51bXMvUkNDYWxsU2Vzc2lvblN0YXRlJztcbmltcG9ydCB7IFJDQ2FsbFVzZXJTdGF0ZSB9IGZyb20gJy4vZW51bXMvUkNDYWxsVXNlclN0YXRlJztcbmltcG9ydCB7XG4gIElFeGlzdGVkVXNlclBvZmlsZXMsIElIdW5ndXBNc2dDb250ZW50LCBJSW52aXRlTXNnQ29udGVudCwgSU1lbWJlck1vZGlmeU1zZ0NvbnRlbnQsIElSaW5naW5nTXNnQ29udGVudCxcbn0gZnJvbSAnLi9pbnRlcmZhY2VzL0lNZXNzYWdlSGFuZGxlcic7XG5pbXBvcnQge1xuICBJQ2FsbFN0YXRlTWFjaGluZVdhdGNoZXJzLCBJRW5kU3VtbWFyeSwgSUludml0ZWRVc2VycywgSVVzZXJEYXRhLCBJVXNlclByb2ZpbGUsIElJbnZpdGVPcHRpb25zLFxufSBmcm9tICcuL2ludGVyZmFjZXMvSVN0YXRlTWFjaGluZSc7XG5pbXBvcnQgeyBDYWxsTWVzc2FnZUhhbmRsZXIgfSBmcm9tICcuL01lc3NhZ2VIYW5kbGVyJztcbmltcG9ydCB7IFJDQ3Jvc3NDYWxsVHlwZSB9IGZyb20gJy4vZW51bXMvUkNDcm9zc0NhbGxUeXBlJztcbmltcG9ydCB7IFRpbWVyIH0gZnJvbSAnLi9UaW1lcic7XG5cbmV4cG9ydCBjbGFzcyBSQ0NhbGxTdGF0ZU1hY2hpbmUge1xuICAvKipcbiAgICog5oi/6Ze054q25oCBXG4gICAqL1xuICBwcml2YXRlIF9zZXNzaW9uU3RhdGU6IFJDQ2FsbFNlc3Npb25TdGF0ZSB8IG51bGwgPSBudWxsXG5cbiAgLyoqXG4gICAqIOeUqOaIt+eKtuaAgeWPiuS/oeaBr1xuICAgKi9cbiAgcHJpdmF0ZSBfdXNlckluZm86IHsgW3VzZXJJZDogc3RyaW5nXTogSVVzZXJEYXRhIH0gPSB7fVxuXG4gIC8qKlxuICAgKiDnlKjmiLforqHml7blmajmmKDlsIRcbiAgICovXG4gIHByaXZhdGUgX3VzZXJUaW1lcnM6IHsgW3VzZXJJZDogc3RyaW5nXTogVGltZXIgfSA9IHt9XG5cbiAgLyoqXG4gICAqIOebkeWQrOWZqFxuICAgKi9cbiAgcHJpdmF0ZSBfd2F0Y2hlcnMhOiBJQ2FsbFN0YXRlTWFjaGluZVdhdGNoZXJzXG5cbiAgLyoqXG4gICAqIOWRvOWPq+i2heaXtuaXtumXtCAo5Y2V5L2N77ya5q+r56eSKVxuICAgKi9cbiAgcHJpdmF0ZSBfY2FsbFRpbWVvdXQ6IG51bWJlciA9IDYwICogMTAwMFxuXG4gIC8qKlxuICAgKiDpgJror53lu7rnq4vlvIDlp4vml7bpl7RcbiAgICovXG4gIHByaXZhdGUgX2JlZ2luVGltZXN0YW1wOiBudW1iZXIgPSAwXG5cbiAgLyoqXG4gICAqIOmAmuivnee7k+adn+aXtumXtFxuICAgKi9cbiAgcHJpdmF0ZSBfZW5kVGltZXN0YW1wOiBudW1iZXIgPSAwXG5cbiAgLyoqXG4gICAqIOmAmuivnee7k+adn+WOn+WboFxuICAgKi9cbiAgcHJpdmF0ZSBfZW5kUmVhc29uOiBSQ0NhbGxFbmRSZWFzb24gfCBudWxsID0gbnVsbFxuXG4gIC8qKlxuICAgKiDkuLvlj6sgSURcbiAgICog5Y+R6LW36YKA6K+35Li65b2T5YmN55So5oi3IElEXG4gICAqIOaUtuWIsOmCgOivt+S4uiBzZW5kZXJVc2VySWRcbiAgICog5pS25Yiw5Lq65ZGY5Y+Y5pu06YKA6K+35Li65raI5oGv5L2T5LitIGNhbGxlcklkXG4gICAqL1xuICBwcml2YXRlIF9jYWxsZXJJZDogc3RyaW5nIHwgbnVsbCA9IG51bGxcblxuICAvKipcbiAgICog5b2T5qyh6YCa6K+d6YKA6K+36ICFIElEXG4gICAqIOWPkei1t+mCgOivt+S4uuW9k+WJjeeUqOaItyBJROOAgeaUtuWIsOmCgOivt+S4uiBzZW5kZXJVc2VySWTjgIHmlLbliLDkurrlkZjlj5jmm7TpgoDor7fkuLrmtojmga/kvZPkuK0gc2VuZGVyVXNlcklkXG4gICAqL1xuICBwcml2YXRlIF9pbnZpdGVySWQ6IHN0cmluZyB8IG51bGwgPSBudWxsXG5cbiAgLyoqXG4gICAqIOaYr+WQpuaYr+i3qCBhcHBrZXlcbiAgICovXG4gIHByaXZhdGUgX2lzQ3Jvc3NBcHBrZXk6IGJvb2xlYW4gPSBmYWxzZVxuXG4gIHByaXZhdGUgX2h1bmd1cFB1c2hUaXRsZTogc3RyaW5nID0gJydcblxuICBwcml2YXRlIF9odW5ndXBQdXNoQ29udGVudDogc3RyaW5nID0gJydcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb250ZXh0OiBSVENQbHVnaW5Db250ZXh0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3J1bnRpbWU6IElSdW50aW1lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogSUxvZ2dlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jYWxsTXNnSGFuZGxlcjogQ2FsbE1lc3NhZ2VIYW5kbGVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NoYW5uZWxJZDogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnZlcnNhdGlvblR5cGU6IENvbnZlcnNhdGlvblR5cGUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGFyZ2V0SWQ6IHN0cmluZyxcbiAgICBwcml2YXRlIF9tZWRpYVR5cGU6IFJDQ2FsbE1lZGlhVHlwZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jYWxsSWQ6IHN0cmluZyxcbiAgKSB7XG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIucmVnaXN0ZXJTdGF0ZU1hY2hpbmVFdmVudCh0aGlzLl9jYWxsSWQsICdvblJpbmdpbmcnLCB0aGlzLl9vblJpbmdpbmcuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIucmVnaXN0ZXJTdGF0ZU1hY2hpbmVFdmVudCh0aGlzLl9jYWxsSWQsICdvbkFjY2VwdCcsIHRoaXMuX29uQWNjZXB0LmJpbmQodGhpcykpO1xuICAgIHRoaXMuX2NhbGxNc2dIYW5kbGVyLnJlZ2lzdGVyU3RhdGVNYWNoaW5lRXZlbnQodGhpcy5fY2FsbElkLCAnb25NZWRpYU1vZGlmeScsIHRoaXMuX29uTWVkaWFNb2RpZnkuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIucmVnaXN0ZXJTdGF0ZU1hY2hpbmVFdmVudCh0aGlzLl9jYWxsSWQsICdvbkh1bmd1cCcsIHRoaXMuX29uSHVuZ3VwLmJpbmQodGhpcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluagoeato+WQjui2heaXtuaXtumXtFxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0VGltZW91dChzZW50VGltZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBsZXQgZGVsYXlUaW1lID0gdGhpcy5fY29udGV4dC5nZXRTZXJ2ZXJUaW1lKCkgLSBzZW50VGltZTtcbiAgICBpZiAoZGVsYXlUaW1lIDwgMCkge1xuICAgICAgZGVsYXlUaW1lID0gNTAwOyAvLyDlgYforr7lu7bov5/ml7bpl7TkuLogNTAwIG1zXG4gICAgfVxuICAgIGNvbnN0IHRpbWVvdXQgPSB0aGlzLl9jYWxsVGltZW91dCAtIGRlbGF5VGltZTtcbiAgICB0aGlzLl9sb2dnZXIud2FybignXycsIGBfZ2V0VGltZW91dCAtPiB0aW1lb3V0OiAke3RpbWVvdXR9YCk7XG4gICAgcmV0dXJuIHRpbWVvdXQ7XG4gIH1cblxuICBwcml2YXRlIF9jbGVhclRpbWVyQnlJZCh1c2VySWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbUkNDYWxsU3RhdGVNYWNoaW5lXSBiZWZvcmUgX2NsZWFyVGltZXJCeUlkICAtPiB1c2VySWQ6ICR7dXNlcklkfSB1c2VyVGltZXJzOiAke0pTT04uc3RyaW5naWZ5KHRoaXMuX3VzZXJUaW1lcnMpfWApO1xuICAgIGlmICh0aGlzLl91c2VyVGltZXJzW3VzZXJJZF0pIHtcbiAgICAgIHRoaXMuX3VzZXJUaW1lcnNbdXNlcklkXS5zdG9wKCk7XG4gICAgICBkZWxldGUgdGhpcy5fdXNlclRpbWVyc1t1c2VySWRdO1xuICAgIH1cbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gYWZ0ZXIgX2NsZWFyVGltZXJCeUlkIC0+IHVzZXJUaW1lcnM6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5fdXNlclRpbWVycyl9YCk7XG4gIH1cblxuICAvKipcbiAgICog6YCa55+lIGNhbGwg5bGC5oi/6Ze054q25oCB5Y+Y5pu05Y+K5Y6f5ZugXG4gICAqL1xuICBwcml2YXRlIF9ub3RpZnlTdGF0ZUNoYW5nZShzdGF0ZTogUkNDYWxsU2Vzc2lvblN0YXRlLCByZWFzb24/OiBSQ0NhbGxFbmRSZWFzb24pIHtcbiAgICB0aGlzLl9sb2dnZXIud2FybignXycsIGBbUkNDYWxsU3RhdGVNYWNoaW5lXSBub3RpZnlTdGF0ZUNoYW5nZSAtPiBpbmZvOiAke0pTT04uc3RyaW5naWZ5KHtcbiAgICAgIHN0YXRlLCByZWFzb24sXG4gICAgfSl9YCk7XG5cbiAgICB0aGlzLl9lbmRSZWFzb24gPSByZWFzb24gfHwgbnVsbDtcbiAgICBpZiAodGhpcy5fc2Vzc2lvblN0YXRlICE9PSBzdGF0ZSkge1xuICAgICAgdGhpcy5fc2Vzc2lvblN0YXRlID0gc3RhdGU7XG4gICAgICB0aGlzLl93YXRjaGVycz8ub25TdGF0ZUNoYW5nZSh7IHN0YXRlLCByZWFzb24gfSk7XG4gICAgfVxuICAgIGlmIChzdGF0ZSA9PT0gUkNDYWxsU2Vzc2lvblN0YXRlLkVORCkge1xuICAgICAgLy8g5b2T54q25oCB5py657uT5p2f5pe277yM6ZyA5ZyoIENhbGxFbmdpbmUg5riF6ZmkXG4gICAgICBldmVudEVtaXR0ZXIuZW1pdCgnb25TdGF0ZU1hY2hpbmVDbG9zZScsIHRoaXMuX2NhbGxJZCk7XG4gICAgICB0aGlzLl9jYWxsTXNnSGFuZGxlci51bnJlZ2lzdGVyU3RhdGVNYWNoaW5lRXZlbnQodGhpcy5fY2FsbElkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6YCa55+lIGNhbGwg5bGC5Lq65ZGY54q25oCB5Y+Y5pu05Y+K5Y6f5ZugXG4gICAqL1xuICBwcml2YXRlIF9ub3RpZnlVc2VyU3RhdGVDaGFuZ2UodXNlcjogSVVzZXJEYXRhLCByZWFzb24/OiBSQ0NhbGxFbmRSZWFzb24pIHtcbiAgICB0aGlzLl9sb2dnZXIud2FybignXycsIGBbUkNDYWxsU3RhdGVNYWNoaW5lXSBub3RpZnlVc2VyU3RhdGVDaGFuZ2UgLT4gaW5mbzogJHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICB1c2VyLCByZWFzb24sXG4gICAgfSl9YCk7XG4gICAgdGhpcy5fd2F0Y2hlcnM/Lm9uVXNlclN0YXRlQ2hhbmdlKHsgdXNlciwgcmVhc29uIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfb3RoZXJDbGllbnRIYW5kbGUobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIGNvbnN0IHsgc2VuZGVyVXNlcklkLCBjb250ZW50OiB7IHVzZXI6IHVzZXJQcm9maWxlLCByZWFzb246IGh1bmd1cFJlYXNvbiB9LCBtZXNzYWdlVHlwZSB9ID0gbWVzc2FnZTtcbiAgICB0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdID0ge1xuICAgICAgdXNlcklkOiBzZW5kZXJVc2VySWQsXG4gICAgICBzdGF0ZTogUkNDYWxsVXNlclN0YXRlLk5PTkUsXG4gICAgICBpc0NhbGxlcjogZmFsc2UsXG4gICAgICBpc1JlbW90ZTogZmFsc2UsXG4gICAgfTtcbiAgICAvLyDlpJrnq6/mjqXlkKzjgIHlpJrnq6/mi5Lnu53vvIzmuIXpmaTmlLbliLDpgoDor7flkI7otbfnmoTorqHml7blmahcbiAgICBmb3IgKGNvbnN0IHVzZXJJZCBpbiB0aGlzLl91c2VyVGltZXJzKSB7XG4gICAgICB0aGlzLl9jbGVhclRpbWVyQnlJZCh1c2VySWQpO1xuICAgIH1cbiAgICAvLyDlhbbku5bnq6/mjqXlkKxcbiAgICBsZXQgZW5kUmVhc29uID0gUkNDYWxsRW5kUmVhc29uLkFDQ0VQVF9CWV9PVEhFUl9DTElFTlQ7XG4gICAgaWYgKG1lc3NhZ2VUeXBlID09PSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0hhbmd1cCkge1xuICAgICAgaWYgKGh1bmd1cFJlYXNvbiA9PT0gUkNDYWxsRW5kUmVhc29uLkJVU1lfTElORSkge1xuICAgICAgICBlbmRSZWFzb24gPSBSQ0NhbGxFbmRSZWFzb24uT1RIRVJfQ0xJRU5UX0lOX0NBTEw7XG4gICAgICB9IGVsc2UgaWYgKGh1bmd1cFJlYXNvbiA9PT0gUkNDYWxsRW5kUmVhc29uLk5PX1JFU1BPTlNFKSB7XG4gICAgICAgIGVuZFJlYXNvbiA9IFJDQ2FsbEVuZFJlYXNvbi5OT19SRVNQT05TRTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVuZFJlYXNvbiA9IFJDQ2FsbEVuZFJlYXNvbi5IQU5HVVBfQllfT1RIRVJfQ0xJRU5UO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyDmt7vliqDnlKjmiLfnroDopoHkv6Hmga9cbiAgICBPYmplY3QuYXNzaWduKHRoaXMuX3VzZXJJbmZvW3NlbmRlclVzZXJJZF0sIDxJVXNlclByb2ZpbGU+dXNlclByb2ZpbGUpO1xuICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdLCBlbmRSZWFzb24pO1xuICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQsIGVuZFJlYXNvbik7XG4gIH1cblxuICAvKipcbiAgICog5q2j5Zyo6YCa6K+d5Lit77yM5LiU5LiN5piv5b2T5YmN5bey5o6l6YCa55So5oi36K6+5aSH77yIZGV2aWNlSWTvvInlj5HmnaXnmoTmtojmga9cbiAgKi9cbiAgcHJpdmF0ZSBfaXNSZW1vdGVJbnZhbGlkTXNnKHJlbW90ZVVzZXJJZDogc3RyaW5nLCBtc2dEZXZpY2VJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLl91c2VySW5mb1tyZW1vdGVVc2VySWRdKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl91c2VySW5mb1tyZW1vdGVVc2VySWRdLmRldmljZUlkIHx8ICFtc2dEZXZpY2VJZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICgodGhpcy5fdXNlckluZm9bcmVtb3RlVXNlcklkXS5zdGF0ZSA9PT0gUkNDYWxsVXNlclN0YXRlLktFRVBJTkcgJiYgdGhpcy5fdXNlckluZm9bcmVtb3RlVXNlcklkXS5kZXZpY2VJZCAhPT0gbXNnRGV2aWNlSWQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIF9vblJpbmdpbmcobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIGNvbnN0IHsgc2VuZGVyVXNlcklkOiBzdWlkLCBjb250ZW50OiB7IHVzZXI6IHVzZXJQcm9maWxlLCBkZXZpY2VJZCB9IH0gPSBtZXNzYWdlO1xuICAgIGNvbnN0IHNlbmRlclVzZXJJZCA9IHRoaXMuX2lzQ3Jvc3NBcHBrZXkgPyBzdWlkLnNwbGl0KCdfJylbMV0gOiBzdWlkO1xuICAgIC8vIOato+WcqOmAmuivneS4re+8jOi/nOerr+Wkmuerr+WPkeeahOa2iOaBr+ebtOaOpei/h+a7pFxuICAgIGlmICh0aGlzLl9pc1JlbW90ZUludmFsaWRNc2coc2VuZGVyVXNlcklkLCBkZXZpY2VJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsU3RhdGVNYWNoaW5lXSBvblJpbmdpbmcgLT4gbm90IHRoZSByZW1vdGUgZGV2aWNlIHRoYXQgaXMgY3VycmVudGx5IHRhbGtpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSA9PT0gc2VuZGVyVXNlcklkKSB7XG4gICAgICByZXR1cm47IC8vIOWkmuerr+WkhOeQhlxuICAgIH1cbiAgICB0aGlzLl93YXRjaGVycy5vblJpbmdpbmcoeyB1c2VySWQ6IHNlbmRlclVzZXJJZCwgLi4uPElVc2VyUHJvZmlsZT51c2VyUHJvZmlsZSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX29uQWNjZXB0KG1lc3NhZ2U6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICBjb25zdCB7IHNlbmRlclVzZXJJZDogc3VpZCwgY29udGVudDogeyB1c2VyOiB1c2VyUHJvZmlsZSwgZGV2aWNlSWQ6IHNlbmRlckRldmljZUlkIH0sIHNlbnRUaW1lIH0gPSBtZXNzYWdlO1xuICAgIGNvbnN0IHNlbmRlclVzZXJJZCA9IHRoaXMuX2lzQ3Jvc3NBcHBrZXkgPyBzdWlkLnNwbGl0KCdfJylbMV0gOiBzdWlkO1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIC8vIOato+WcqOmAmuivneS4re+8jOi/nOerr+Wkmuerr+WPkeeahOa2iOaBr+ebtOaOpei/h+a7pFxuICAgIGlmICh0aGlzLl9pc1JlbW90ZUludmFsaWRNc2coc2VuZGVyVXNlcklkLCBzZW5kZXJEZXZpY2VJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsU3RhdGVNYWNoaW5lXSBfb25BY2NlcHQgLT4gbm90IHRoZSByZW1vdGUgZGV2aWNlIHRoYXQgaXMgY3VycmVudGx5IHRhbGtpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFVzZXJJZCA9PT0gc2VuZGVyVXNlcklkKSB7XG4gICAgICAvLyDlpJrnq6/lpITnkIZcbiAgICAgIHRoaXMuX290aGVyQ2xpZW50SGFuZGxlKG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOe+pOe7hOmAmuivneaXtu+8miBB44CBQiDpgJror50gQemCgOivt0MsIEPlkIzmhI/mjqXlkKzvvIzov5nml7ZC5rKh5pyJQ+eahHVzZXJJZOWvueW6lOeahOiuoeaXtuWZqO+8jOaJgOS7pei/memHjOWIpOaWreS4gOS4i1xuICAgIGlmICh0aGlzLl91c2VyVGltZXJzW3NlbmRlclVzZXJJZF0pIHtcbiAgICAgIC8vIOa4hemZpOWRvOWPq+i2heaXtuiuoeaXtuWZqFxuICAgICAgdGhpcy5fY2xlYXJUaW1lckJ5SWQoc2VuZGVyVXNlcklkKTtcbiAgICB9XG5cbiAgICAvLyDkv67mlLnlubbpgJrnn6XmiL/pl7TkurrlkZjnirbmgIFcbiAgICBjb25zdCBpZHMgPSAodGhpcy5fY29udmVyc2F0aW9uVHlwZSA9PT0gQ29udmVyc2F0aW9uVHlwZS5QUklWQVRFKSA/IFtjdXJyZW50VXNlcklkLCBzZW5kZXJVc2VySWRdIDogW3NlbmRlclVzZXJJZF07XG4gICAgaWRzLmZvckVhY2goKHVzZXJJZCkgPT4ge1xuICAgICAgY29uc3QgaXNDdXJyZW50VXNlcklkID0gdXNlcklkID09PSBjdXJyZW50VXNlcklkO1xuICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSA9IHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICBzdGF0ZTogUkNDYWxsVXNlclN0YXRlLktFRVBJTkcsXG4gICAgICAgIGlzQ2FsbGVyOiBpc0N1cnJlbnRVc2VySWQsXG4gICAgICAgIGlzUmVtb3RlOiBpc0N1cnJlbnRVc2VySWQsXG4gICAgICAgIGRldmljZUlkOiBpc0N1cnJlbnRVc2VySWQgPyBnZXRDYWxsRGV2aWNlSWQodGhpcy5fcnVudGltZSkgOiBzZW5kZXJEZXZpY2VJZCxcbiAgICAgIH07XG4gICAgICBpZiAoIWlzQ3VycmVudFVzZXJJZCkge1xuICAgICAgICB0aGlzLl9iZWdpblRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICAgIC8vIOa3u+WKoOeUqOaIt+eugOimgeS/oeaBr1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuX3VzZXJJbmZvW3NlbmRlclVzZXJJZF0sIDxJVXNlclByb2ZpbGU+dXNlclByb2ZpbGUpO1xuICAgICAgfVxuICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0pO1xuICAgIH0pO1xuICAgIGlmICh0aGlzLmdldENhbGxlcklkKCkgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5LRUVQSU5HKTtcbiAgICB9XG4gICAgLy8g5oqb5Ye6b25BY2NlcHTml7bnirbmgIHlt7Lnu4/lsLHnu6pcbiAgICB0aGlzLl93YXRjaGVycy5vbkFjY2VwdCh7IHVzZXJJZDogc2VuZGVyVXNlcklkIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25NZWRpYU1vZGlmeShtZXNzYWdlOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgY29uc3QgeyBzZW5kZXJVc2VySWQsIGNvbnRlbnQ6IHsgbWVkaWFUeXBlLCB1c2VyOiB1c2VyUHJvZmlsZSwgZGV2aWNlSWQgfSB9ID0gbWVzc2FnZTtcbiAgICAvLyDmraPlnKjpgJror53kuK3vvIzov5znq6/lpJrnq6/lj5HnmoTmtojmga/nm7TmjqXov4fmu6RcbiAgICBpZiAodGhpcy5faXNSZW1vdGVJbnZhbGlkTXNnKHNlbmRlclVzZXJJZCwgZGV2aWNlSWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCAnW1JDQ2FsbFN0YXRlTWFjaGluZV0gX29uTWVkaWFNb2RpZnkgLT4gbm90IHRoZSByZW1vdGUgZGV2aWNlIHRoYXQgaXMgY3VycmVudGx5IHRhbGtpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSA9PT0gc2VuZGVyVXNlcklkKSB7IC8vIOWkmuerr+WkhOeQhlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOabtOaWsCBtZWRpYVR5cGVcbiAgICB0aGlzLl9tZWRpYVR5cGUgPSBtZWRpYVR5cGU7XG4gICAgdGhpcy5fd2F0Y2hlcnMub25NZWRpYU1vZGlmeSh7XG4gICAgICBzZW5kZXI6IHsgdXNlcklkOiBzZW5kZXJVc2VySWQsIC4uLjxJVXNlclByb2ZpbGU+dXNlclByb2ZpbGUgfSxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX29uSHVuZ3VwKG1lc3NhZ2U6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICBjb25zdCB7IHNlbmRlclVzZXJJZDogc3VpZCwgY29udGVudCB9ID0gbWVzc2FnZTtcbiAgICBjb25zdCBzZW5kZXJVc2VySWQgPSB0aGlzLl9pc0Nyb3NzQXBwa2V5ID8gc3VpZC5zcGxpdCgnXycpWzFdIDogc3VpZDtcbiAgICBjb25zdCB7IHJlYXNvbiwgdXNlcjogdXNlclByb2ZpbGUsIGRldmljZUlkIH0gPSBjb250ZW50IGFzIElIdW5ndXBNc2dDb250ZW50O1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIC8vIOato+WcqOmAmuivneS4re+8jOi/nOerr+Wkmuerr+WPkeeahOa2iOaBr+ebtOaOpei/h+a7pFxuICAgIGlmICh0aGlzLl9pc1JlbW90ZUludmFsaWRNc2coc2VuZGVyVXNlcklkLCBkZXZpY2VJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsU3RhdGVNYWNoaW5lXSBfb25IdW5ndXAgLT4gbm90IHRoZSByZW1vdGUgZGV2aWNlIHRoYXQgaXMgY3VycmVudGx5IHRhbGtpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFVzZXJJZCA9PT0gc2VuZGVyVXNlcklkKSB7IC8vIOWkmuerr+WkhOeQhiDmipvlh7rlpJrnq6/lt7LlpITnkIYgcmVhc29uXG4gICAgICB0aGlzLl9vdGhlckNsaWVudEhhbmRsZShtZXNzYWdlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fc2Vzc2lvblN0YXRlID09PSBSQ0NhbGxTZXNzaW9uU3RhdGUuRU5EKSB7XG4gICAgICAvLyDlpoLmnpzlt7HmlrnmiL/pl7TnirbmgIHlt7Lnu5PmnZ/vvIzlho3mlLbliLAgaHVuZ3VwIOa2iOaBr+S4jeWGjeWkhOeQhlxuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gSW52YWxpZCBoYW5nIHVwIG1lc3NhZ2UsIGN1cnJlbnQgcm9vbSBzdGF0dXMgaGFzIGVuZGVkIC0+IHNlc3Npb25TdGF0ZTogJHt0aGlzLl9zZXNzaW9uU3RhdGV9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3VzZXJJbmZvW3NlbmRlclVzZXJJZF0pIHtcbiAgICAgIC8vIOS/ruaUueWGheWtmOaAgeaVsOaNruW5tumAmuefpVxuICAgICAgdGhpcy5fdXNlckluZm9bc2VuZGVyVXNlcklkXS5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5OT05FO1xuICAgICAgdGhpcy5fZW5kVGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgIC8vIOa3u+WKoOeUqOaIt+eugOimgeS/oeaBr1xuICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdLCA8SVVzZXJQcm9maWxlPnVzZXJQcm9maWxlKTtcbiAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdLCBDYWxsUmVtb3RlRW5kUmVhc29uW3JlYXNvbl0pO1xuICAgICAgZGVsZXRlIHRoaXMuX3VzZXJJbmZvW3NlbmRlclVzZXJJZF07XG4gICAgfVxuXG4gICAgLy8gdGltZXIg5riF6ZmkXG4gICAgaWYgKENhbGxSZW1vdGVFbmRSZWFzb25bcmVhc29uXSA9PT0gUkNDYWxsRW5kUmVhc29uLlJFTU9URV9DQU5DRUwpIHtcbiAgICAgIC8vIOi/nOerr+WPlua2iOmAmuivne+8jOayoeaciei/nOerr+eUqOaIt++8jOa4hemZpOW3seerr+eahOaOpeWQrOi2heaXtuiuoeaXtuWZqFxuICAgICAgdGhpcy5nZXRSZW1vdGVVc2VySWRzKCkubGVuZ3RoIDwgMSAmJiB0aGlzLl9jbGVhclRpbWVyQnlJZChjdXJyZW50VXNlcklkKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZ2V0SW52aXRlcklkKCkgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgIC8vIOi/nOerr+aLkue7neOAgeW/meeijOOAgeacquaOpeWQrOetie+8jOmAmui/h+iHquW3seaYr+WQpuaYr+S4u+WPq+adpeWIpOaWreimgea4hemZpOWRvOWPq+i2heaXtuiuoeaXtuWZqCDmiJYg5o6l5ZCs6LaF5pe26K6h5pe25ZmoXG4gICAgICB0aGlzLl9jbGVhclRpbWVyQnlJZChzZW5kZXJVc2VySWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmdldFJlbW90ZVVzZXJJZHMoKS5sZW5ndGggPCAxICYmIHRoaXMuX2NsZWFyVGltZXJCeUlkKGN1cnJlbnRVc2VySWQpO1xuICAgIH1cblxuICAgIC8vIOaIv+mXtOS6uuWRmOS/oeaBr+WwkeS6juS4pOS4qu+8jOmAmuefpeaIv+mXtOeKtuaAgee7k+adn1xuICAgIGNvbnN0IGlzTGVzc1RoYW5Ud28gPSBPYmplY3Qua2V5cyh0aGlzLl91c2VySW5mbykubGVuZ3RoIDwgMjtcbiAgICAvLyDnvqTlkbzkuK3pgoDor7fogIXmjILmlq3vvIjpnZ7lkbzlj6vlj5HotbfogIXvvInkuJTmiL/pl7TkuK3ooqvpgoDor7fogIXpg73mnKrmjqXlkKzvvIzpgJrnn6XmiL/pl7TnirbmgIHnu5PmnZ9cbiAgICBjb25zdCBpc0ludml0ZVVzZXIgPSB0aGlzLl9pbnZpdGVySWQgPT09IHNlbmRlclVzZXJJZDtcbiAgICBjb25zdCBpc05vT25lQW5zd2VyZWQgPSBPYmplY3QudmFsdWVzKHRoaXMuX3VzZXJJbmZvKS5ldmVyeSgodXNlcikgPT4gdXNlci5zdGF0ZSAhPT0gUkNDYWxsVXNlclN0YXRlLktFRVBJTkcpO1xuICAgIGlmIChpc0xlc3NUaGFuVHdvIHx8IChpc0ludml0ZVVzZXIgJiYgaXNOb09uZUFuc3dlcmVkKSkge1xuICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLkVORCwgQ2FsbFJlbW90ZUVuZFJlYXNvbltyZWFzb25dKTtcbiAgICB9XG5cbiAgICAvLyDmipvlh7ogb25IdW5ndXAg5pe254q25oCB5bey57uP5bCx57uqXG4gICAgdGhpcy5fd2F0Y2hlcnMub25IdW5ndXAoeyB1c2VySWQ6IHNlbmRlclVzZXJJZCwgLi4uPElVc2VyUHJvZmlsZT51c2VyUHJvZmlsZSB9LCBDYWxsUmVtb3RlRW5kUmVhc29uW3JlYXNvbl0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOazqOWGjOS6i+S7tuebkeWQrFxuICAgKiBAcGFyYW1zIHdhdGNoZXJzXG4gICAqL1xuICByZWdpc3RlckV2ZW50TGlzdGVuZXIod2F0Y2hlcnM6IElDYWxsU3RhdGVNYWNoaW5lV2F0Y2hlcnMpIHtcbiAgICB0aGlzLl93YXRjaGVycyA9IHdhdGNoZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsCBpbnZpdGUg5raI5oGv5pe254q25oCB5py65pu05paw77yIQ2FsbEVuZ2luZSDlhoXpg6josIPnlKjvvIlcbiAgICogQHBhcmFtIG1lc3NhZ2Ug5o6l5pS25raI5oGvXG4gICAqL1xuICBfX29uSW52aXRlKG1lc3NhZ2U6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICBjb25zdCB7IHNlbmRlclVzZXJJZDogc3VpZCwgY29udGVudCwgc2VudFRpbWUgfSA9IG1lc3NhZ2U7XG4gICAgY29uc3Qge1xuICAgICAgaW52aXRlVXNlcklkczogaW5pZHMsIHVzZXI6IHVzZXJQcm9maWxlLCBkZXZpY2VJZCwgcm9vbVR5cGUsXG4gICAgfSA9IGNvbnRlbnQgYXMgSUludml0ZU1zZ0NvbnRlbnQ7XG4gICAgLy8g5aSE55CG6LeoIGFwcGtleSDpgoDor7cgc2VuZGVyVXNlcklkIOW4puaciSBhcHBrZXkg5LiO5pys5ZywIGN1cnJlbnRVc2VySWQg5Yy56YWN6Zeu6aKYXG4gICAgLy8g5ZCM5pe26K6w5b2V5pys5Zyw5piv5ZCm5Li66LeoIGFwcGtleSDnirbmgIFcbiAgICBsZXQgc2VuZGVyVXNlcklkOiBzdHJpbmc7XG4gICAgaWYgKHJvb21UeXBlID09PSBSQ0Nyb3NzQ2FsbFR5cGUuUkNDYWxsUm9vbVR5cGVBY3Jvc3NDYWxsKSB7XG4gICAgICBbLCBzZW5kZXJVc2VySWRdID0gc3VpZC5zcGxpdCgnXycpO1xuICAgICAgdGhpcy5fd2F0Y2hlcnMuY3Jvc3NBcHBrZXkodHJ1ZSk7XG4gICAgICB0aGlzLl9pc0Nyb3NzQXBwa2V5ID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VuZGVyVXNlcklkID0gc3VpZDtcbiAgICB9XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgLy8g5q2j5Zyo6YCa6K+d5Lit77yM6L+c56uv5aSa56uv5Y+R55qE5raI5oGv55u05o6l6L+H5rukXG4gICAgaWYgKHRoaXMuX2lzUmVtb3RlSW52YWxpZE1zZyhzZW5kZXJVc2VySWQsIGRldmljZUlkKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgJ1tSQ0NhbGxTdGF0ZU1hY2hpbmVdIF9fb25JbnZpdGUgLT4gbm90IHRoZSByZW1vdGUgZGV2aWNlIHRoYXQgaXMgY3VycmVudGx5IHRhbGtpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFVzZXJJZCA9PT0gc2VuZGVyVXNlcklkKSB7XG4gICAgICAvLyDlpJrnq6/lpITnkIZcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9jYWxsZXJJZCA9IHRoaXMuX2ludml0ZXJJZCA9IHNlbmRlclVzZXJJZDtcbiAgICBjb25zdCB1c2VySWRMaXN0ID0gW3N1aWQsIC4uLmluaWRzXTtcbiAgICAvLyDmlLbliLDpgoDor7flkI7vvIzlhoXpg6jlm57lupTlk43pk4Pmtojmga8sIHVzZXJJZHMg5Lyg6Zmk6Ieq5bex55qE5omA5pyJ5Lq6XG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIuc2VuZFJpbmdpbmcoe1xuICAgICAgY29udmVyc2F0aW9uVHlwZTogdGhpcy5fY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkOiB0aGlzLl90YXJnZXRJZCxcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5fY2hhbm5lbElkLFxuICAgICAgY2FsbElkOiB0aGlzLl9jYWxsSWQsXG4gICAgICB1c2VySWRzOiB1c2VySWRMaXN0LmZpbHRlcigoaWQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2lzQ3Jvc3NBcHBrZXkpIHtcbiAgICAgICAgICByZXR1cm4gaWQuc3BsaXQoJ18nKVsxXSAhPT0gY3VycmVudFVzZXJJZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaWQgIT09IGN1cnJlbnRVc2VySWQ7XG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGludml0ZVVzZXJJZHMgPSB0aGlzLl9pc0Nyb3NzQXBwa2V5ID8gW2luaWRzWzBdLnNwbGl0KCdfJylbMV1dIDogaW5pZHM7XG5cbiAgICAvLyDlkIzmraXmnKzlnLDnlKjmiLfliJfooajpnIDopoHkvb/nlKjmi4bliIblkI7nmoQgVXNlcklkIOS/neivgeacrOWcsOWFtuS7luaWueazleWMuemFjSB1c2VyaWRcbiAgICBjb25zdCBhbGxVc2VySWRzID0gW3NlbmRlclVzZXJJZCwgLi4uaW52aXRlVXNlcklkc107XG5cbiAgICAvLyDkv67mlLnlubbpgJrnn6XmiL/pl7TkurrlkZjnirbmgIFcbiAgICBhbGxVc2VySWRzLmZvckVhY2goKHVzZXJJZCkgPT4ge1xuICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSA9IHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICBzdGF0ZTogUkNDYWxsVXNlclN0YXRlLldBSVRJTkcsXG4gICAgICAgIGlzQ2FsbGVyOiB1c2VySWQgPT09IHNlbmRlclVzZXJJZCxcbiAgICAgICAgaXNSZW1vdGU6IHVzZXJJZCAhPT0gY3VycmVudFVzZXJJZCxcbiAgICAgIH07XG4gICAgICBpZiAodXNlcklkID09PSBzZW5kZXJVc2VySWQpIHtcbiAgICAgICAgLy8g57uZIHNlbmRlclVzZXIg5re75Yqg55So5oi3566A6KaB5L+h5oGv5Y+KIGRldmljZUlkXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5fdXNlckluZm9bdXNlcklkXSwgPElVc2VyUHJvZmlsZT51c2VyUHJvZmlsZSwgeyBkZXZpY2VJZCB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1t1c2VySWRdKTtcbiAgICAgIC8vIOe7meaJgOacieiiq+mCgOivt+S6uuWQr+WKqOaOpeWQrOiuoeaXtuWZqFxuICAgICAgaWYgKHVzZXJJZCAhPT0gc2VuZGVyVXNlcklkKSB7XG4gICAgICAgIHRoaXMuX3VzZXJUaW1lcnNbdXNlcklkXSA9IG5ldyBUaW1lcigoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVhc29uID0gdXNlcklkID09PSBjdXJyZW50VXNlcklkID8gUkNDYWxsRW5kUmVhc29uLk5PX1JFU1BPTlNFIDogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9OT19SRVNQT05TRTtcbiAgICAgICAgICBpZiAodXNlcklkID09PSBjdXJyZW50VXNlcklkKSB7IC8vIOe+pOiBiuS4reW3seaWuei2heaXtumcgOWPkemAgeaMguaWrVxuICAgICAgICAgICAgdGhpcy5faHVuZ3VwSGFuZGxlKHJlYXNvbik7XG4gICAgICAgICAgfSBlbHNlIHsgLy8g5YW25LuW5Lq65ZGY6LaF5pe25Y+q6YCa55+l5Lq65ZGY54q25oCB5Y+Y5pu0XG4gICAgICAgICAgICB0aGlzLl91c2VySW5mb1t1c2VySWRdICYmICh0aGlzLl91c2VySW5mb1t1c2VySWRdLnN0YXRlID0gUkNDYWxsVXNlclN0YXRlLk5PTkUpO1xuICAgICAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0pO1xuICAgICAgICAgICAgdGhpcy5fd2F0Y2hlcnMub25IdW5ndXAodGhpcy5fdXNlckluZm9bdXNlcklkXSwgcmVhc29uKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl91c2VySW5mb1t1c2VySWRdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcy5fZ2V0VGltZW91dChzZW50VGltZSkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIOaIv+mXtOeKtuaAgemAmuefpVxuICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5XQUlUSU5HKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmlLbliLAgbWVtYmVyTW9kaWZ5IOa2iOaBr+aXtueKtuaAgeacuuabtOaWsO+8iENhbGxFbmdpbmUg5YaF6YOo6LCD55So77yJXG4gICAqIEBwYXJhbSBtZXNzYWdlIOaOpeaUtua2iOaBr1xuICAgKi9cbiAgX19vbk1lbWJlck1vZGlmeShtZXNzYWdlOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgY29uc3QgeyBzZW5kZXJVc2VySWQsIGNvbnRlbnQsIHNlbnRUaW1lIH0gPSBtZXNzYWdlO1xuICAgIGNvbnN0IHtcbiAgICAgIHVzZXI6IHVzZXJQcm9maWxlLCBleGlzdGVkVXNlclBvZmlsZXMsIGNhbGxlciwgZGV2aWNlSWQsIGludml0ZVVzZXJJZHMsIG1lZGlhVHlwZSxcbiAgICB9ID0gY29udGVudCBhcyBJTWVtYmVyTW9kaWZ5TXNnQ29udGVudDtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICAvLyDmraPlnKjpgJror53kuK3vvIzov5znq6/lpJrnq6/lj5HnmoTmtojmga/nm7TmjqXov4fmu6RcbiAgICAvLyB0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdICYmICF0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdLmRldmljZUlkICYmICFkZXZpY2VJZCAmJlxuICAgIGlmICh0aGlzLl9pc1JlbW90ZUludmFsaWRNc2coc2VuZGVyVXNlcklkLCBkZXZpY2VJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsU3RhdGVNYWNoaW5lXSBfX29uTWVtYmVyTW9kaWZ5IC0+IG5vdCB0aGUgcmVtb3RlIGRldmljZSB0aGF0IGlzIGN1cnJlbnRseSB0YWxraW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjdXJyZW50VXNlcklkID09PSBzZW5kZXJVc2VySWQpIHtcbiAgICAgIC8vIOWkmuerr+WkhOeQhlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9jYWxsZXJJZCA9IGNhbGxlcjtcbiAgICB0aGlzLl9pbnZpdGVySWQgPSBzZW5kZXJVc2VySWQ7XG4gICAgaW52aXRlVXNlcklkcy5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgZXhpc3RlZFVzZXJQb2ZpbGVzLnB1c2goeyB1c2VySWQ6IGlkLCBtZWRpYVR5cGUsIGNhbGxTdGF0dXM6IE1zZ0NhbGxTdGF0dXMuSU5DT01JTkcgfSk7XG4gICAgfSk7XG4gICAgLy8g5bex5pa554q25oCB5Li6IE5PTkUgKOacquWtmOWcqOW3seaWueeUqOaIt+S/oeaBrykg6K+05piO6Ieq5bex5Li66KKr6YKA6K+36ICFLCDpnIDlj5HpgIEgcmluZ2luZ1xuICAgIGNvbnN0IGlzTmV3SW52aXRlZFVzZXIgPSBpbnZpdGVVc2VySWRzLmluY2x1ZGVzKGN1cnJlbnRVc2VySWQpO1xuICAgIGlmIChpc05ld0ludml0ZWRVc2VyKSB7XG4gICAgICBjb25zdCBuZWVkUmluZ2luZ1VzZXJJZHM6IHN0cmluZ1tdID0gW107XG4gICAgICBleGlzdGVkVXNlclBvZmlsZXMuZm9yRWFjaCgodXNlckluZm8pID0+IHtcbiAgICAgICAgaWYgKHVzZXJJbmZvLnVzZXJJZCAhPT0gY3VycmVudFVzZXJJZCkge1xuICAgICAgICAgIG5lZWRSaW5naW5nVXNlcklkcy5wdXNoKHVzZXJJbmZvLnVzZXJJZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIuc2VuZFJpbmdpbmcoe1xuICAgICAgICBjb252ZXJzYXRpb25UeXBlOiB0aGlzLl9jb252ZXJzYXRpb25UeXBlLFxuICAgICAgICB0YXJnZXRJZDogdGhpcy5fdGFyZ2V0SWQsXG4gICAgICAgIGNoYW5uZWxJZDogdGhpcy5fY2hhbm5lbElkLFxuICAgICAgICBjYWxsSWQ6IHRoaXMuX2NhbGxJZCxcbiAgICAgICAgdXNlcklkczogbmVlZFJpbmdpbmdVc2VySWRzLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIOiiq+mCgOivt+iAhemAmuefpSBjYWxsIOWxguaIv+mXtOeKtuaAgeWPmOabtFxuICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLldBSVRJTkcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyDlt7LlnKjpgJror53mtYHnqIvkuK3nlKjmiLfvvIzmipvlh7rkurrlkZjlj5jmm7Tnm5HlkKxcbiAgICAgIHRoaXMuX3dhdGNoZXJzLm9uTWVtYmVyTW9kaWZ5KHtcbiAgICAgICAgc2VuZGVyOiB7IHVzZXJJZDogc2VuZGVyVXNlcklkLCAuLi51c2VyUHJvZmlsZSB9LFxuICAgICAgICBpbnZpdGVkVXNlcnM6IGludml0ZVVzZXJJZHMubWFwKChpZCkgPT4gKHsgdXNlcklkOiBpZCB9KSksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyDmm7TmlrDlhajph4/nlKjmiLfnirbmgIFcbiAgICBleGlzdGVkVXNlclBvZmlsZXMuZm9yRWFjaCgodXNlckluZm8pID0+IHtcbiAgICAgIGNvbnN0IHsgdXNlcklkLCBjYWxsU3RhdHVzIH0gPSB1c2VySW5mbztcbiAgICAgIC8vIOS6uuWRmOS4uue7k+adn+eKtuaAgeaXtu+8jOS4jeWGjeabtOaWsFxuICAgICAgaWYgKGNhbGxTdGF0dXMgPT09IE1zZ0NhbGxTdGF0dXMuSURMRSkgcmV0dXJuO1xuICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSA9IHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICBzdGF0ZTogY2FsbFN0YXR1cyAhPT0gTXNnQ2FsbFN0YXR1cy5DT05ORUNURUQgPyBSQ0NhbGxVc2VyU3RhdGUuV0FJVElORyA6IFJDQ2FsbFVzZXJTdGF0ZS5LRUVQSU5HLFxuICAgICAgICBpc0NhbGxlcjogc2VuZGVyVXNlcklkID09PSB1c2VySWQsXG4gICAgICAgIGlzUmVtb3RlOiBjdXJyZW50VXNlcklkID09PSB1c2VySWQsXG4gICAgICB9O1xuICAgICAgLy8g57uZIHNlbmRlclVzZXIg5re75Yqg55So5oi3566A6KaB5L+h5oGvIOWPiiBkZXZpY2VJZFxuICAgICAgaWYgKHVzZXJJZCA9PT0gc2VuZGVyVXNlcklkKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5fdXNlckluZm9bdXNlcklkXSwgPElVc2VyUHJvZmlsZT51c2VyUHJvZmlsZSwgeyBkZXZpY2VJZCB9KTtcbiAgICAgIH1cbiAgICAgIC8vIOmAmuefpeS6uuWRmOWPmOabtFxuICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0pO1xuICAgICAgLy8g6Zmk5LqGIGNhbGxNc2dTdGF0dXMuY29ubmVjdGVkICzlhbbku5bkurrpg73otbforqHml7blmahcblxuICAgICAgaWYgKGNhbGxTdGF0dXMgIT09IE1zZ0NhbGxTdGF0dXMuQ09OTkVDVEVEICYmICF0aGlzLl91c2VyVGltZXJzW3VzZXJJZF0pIHtcbiAgICAgICAgLy8g5ZCv5Yqo6K6h5pe25ZmoXG4gICAgICAgIHRoaXMuX3VzZXJUaW1lcnNbdXNlcklkXSA9IG5ldyBUaW1lcigoKSA9PiB7XG4gICAgICAgICAgLy8g5ZG85Y+r6LaF5pe25aSE55CG54q25oCB44CB5bm26YCa55+lIGNhbGwg5bGCXG4gICAgICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSAmJiAodGhpcy5fdXNlckluZm9bdXNlcklkXS5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5OT05FKTtcbiAgICAgICAgICBjb25zdCByZWFzb24gPSB1c2VySWQgPT09IGN1cnJlbnRVc2VySWQgPyBSQ0NhbGxFbmRSZWFzb24uTk9fUkVTUE9OU0UgOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05PX1JFU1BPTlNFO1xuICAgICAgICAgIC8vIOmAmuefpSBjYWxsIOWxguS6uuWRmOeKtuaAgeWPmOabtFxuICAgICAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1t1c2VySWRdLCByZWFzb24pO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyDlkbzlj6votoXml7bmnKrmjqXmipvlh7pvbkh1bmd1cFxuICAgICAgICAgICAgdGhpcy5fd2F0Y2hlcnMub25IdW5ndXAodGhpcy5fdXNlckluZm9bdXNlcklkXSwgcmVhc29uKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gY2FsbCBvbmh1bmd1cCBlcnJvciAtPiAke2Vycm9yPy5zdGFja31gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkZWxldGUgdGhpcy5fdXNlckluZm9bdXNlcklkXTtcbiAgICAgICAgICAvLyDmiL/pl7TkurrlkZjkv6Hmga/lsJHkuo7kuKTkuKog5oiWIOacquaOpeWQrOeahOaYr+iHquW3se+8jOmAmuefpeaIv+mXtOeKtuaAgee7k+adn1xuICAgICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl91c2VySW5mbykubGVuZ3RoIDwgMiB8fCB1c2VySWQgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgICAgICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQsIHJlYXNvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9LCB0aGlzLl9nZXRUaW1lb3V0KHNlbnRUaW1lKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5aSE55CG5bey5pyJIHNlc3Npb24g77yM5LiN5YWB6K645YaN5o6l5ZCs5paw5Lya6K+d5oOF5Ya1XG4gICAqL1xuICBfX2hhbmRsZUludml0ZUluU2Vzc2lvbigpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsICdTdGF0ZU1hY2hpbmUgLT4gX19oYW5kbGVJbnZpdGVJblNlc3Npb24nKTtcbiAgICAvLyDkv67mlLnmiYDmnInnlKjmiLfnirbmgIHlubbmipvlh7rvvIzmuIXnqbrorqHml7blmahcbiAgICBmb3IgKGNvbnN0IHVzZXJJZCBpbiB0aGlzLl91c2VySW5mbykge1xuICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXS5zdGF0ZSAmJiAodGhpcy5fdXNlckluZm9bdXNlcklkXS5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5OT05FKTtcbiAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1t1c2VySWRdKTtcbiAgICAgIC8vIOWwhuW3suWtmOWcqOeahOiuoeaXtuWZqOmDvea4heaOiVxuICAgICAgdGhpcy5fY2xlYXJUaW1lckJ5SWQodXNlcklkKTtcbiAgICB9XG4gICAgLy8g55u05o6l57uI5q2i5b2T5YmNIHNlc3Npb24g54q25oCBXG4gICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLkVORCwgUkNDYWxsRW5kUmVhc29uLkJVU1lfTElORSk7XG4gICAgLy8g5Y+R6YCB5oyC5pat5raI5oGv77yM5bm25pC65bimIOW3seaWueW/meeijCDljp/lm6BcbiAgICB0aGlzLl9jYWxsTXNnSGFuZGxlci5zZW5kSHVuZ3VwKHtcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5fY2hhbm5lbElkLFxuICAgICAgY29udmVyc2F0aW9uVHlwZTogdGhpcy5fY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkOiB0aGlzLl90YXJnZXRJZCxcbiAgICAgIGNhbGxJZDogdGhpcy5fY2FsbElkLFxuICAgICAgcmVhc29uOiBSQ0NhbGxFbmRSZWFzb24uQlVTWV9MSU5FLFxuICAgICAgdXNlcklkczogdGhpcy5nZXRSZW1vdGVVc2VySWRzKCksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5Li75Yqo5ZG85Y+rIChDYWxsRW5naW5lIOWGhemDqOiwg+eUqClcbiAgICogQHBhcmFtIHVzZXJJZHMg6KKr6YKA6K+355So5oi3IElEIOWIl+ihqFxuICAgKiBAcGFyYW0gZXh0cmEg5raI5oGv55qE5omp5bGV5L+h5oGvXG4gICAqIEBwYXJhbSBwdXNoVGl0bGUg6YCa55+l55qE5qCH6aKYXG4gICAqIEBwYXJhbSBwdXNoQ29udGVudCDpgJrnn6XnmoTlhoXlrrlcbiAgICovXG4gIGFzeW5jIF9fY2FsbCh1c2VySWRzOiBzdHJpbmdbXSwgZXh0cmE6IHN0cmluZyA9ICcnLCBwdXNoVGl0bGU6IHN0cmluZyA9ICcnLCBwdXNoQ29udGVudDogc3RyaW5nID0gJycsIGlzQ3Jvc3NBcHBrZXkgPSBmYWxzZSkge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbUkNDYWxsU3RhdGVNYWNoaW5lXSBpbnZpdGUgLT4gdXNlcklkczogJHtKU09OLnN0cmluZ2lmeSh1c2VySWRzKX1gKTtcbiAgICAvLyDlj5HpgIHpgoDor7fmtojmga9cbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY2FsbGVySWQgPSB0aGlzLl9pbnZpdGVySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGNvbnN0IHsgY29kZSwgbWVzc2FnZSB9ID0gYXdhaXQgdGhpcy5fY2FsbE1zZ0hhbmRsZXIuc2VuZEludml0ZSh7XG4gICAgICByb29tVHlwZTogaXNDcm9zc0FwcGtleSA/IFJDQ3Jvc3NDYWxsVHlwZS5SQ0NhbGxSb29tVHlwZUFjcm9zc0NhbGwgOiBSQ0Nyb3NzQ2FsbFR5cGUuUkNDYWxsUm9vbVR5cGVOb3JtYWxDYWxsLFxuICAgICAgY2hhbm5lbElkOiB0aGlzLl9jaGFubmVsSWQsXG4gICAgICBjb252ZXJzYXRpb25UeXBlOiB0aGlzLl9jb252ZXJzYXRpb25UeXBlLFxuICAgICAgdGFyZ2V0SWQ6IHRoaXMuX3RhcmdldElkLFxuICAgICAgY2FsbElkOiB0aGlzLl9jYWxsSWQsXG4gICAgICBleHRyYSxcbiAgICAgIHB1c2hUaXRsZSxcbiAgICAgIHB1c2hDb250ZW50LFxuICAgICAgbWVkaWFUeXBlOiB0aGlzLl9tZWRpYVR5cGUsXG4gICAgICBpbnZpdGVVc2VySWRzOiB1c2VySWRzLmZpbHRlcigoaWQpID0+IGlkICE9PSBjdXJyZW50VXNlcklkKSxcbiAgICB9KTtcblxuICAgIHRoaXMuX2lzQ3Jvc3NBcHBrZXkgPSBpc0Nyb3NzQXBwa2V5O1xuXG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICBjb25zdCB7IHNlbnRUaW1lIH0gPSBtZXNzYWdlITtcblxuICAgICAgLyoqXG4gICAgICAgKiDot6ggYXBwa2V5IOS7heWtmOWcqOWNleiBiu+8jOWvueerryB1c2VySWQg6ZyA5Y+W5LiL5YiS57q/5ZCO6Z2i55qE6YOo5YiGXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IGlkcyA9IGlzQ3Jvc3NBcHBrZXkgPyBbY3VycmVudFVzZXJJZCwgLi4uW3VzZXJJZHNbMF0uc3BsaXQoJ18nKVsxXV1dIDogW2N1cnJlbnRVc2VySWQsIC4uLnVzZXJJZHNdO1xuXG4gICAgICAvLyDpgY3ljobmm7TmlrDmiL/pl7TmiYDmnInkurrlkZjnirbmgIHjgIHlubbnu5nooqvlj6vlkK/liqjorqHml7blmahcbiAgICAgIGlkcy5mb3JFYWNoKCh1c2VySWQpID0+IHtcbiAgICAgICAgY29uc3QgaXNDYWxsZXIgPSB1c2VySWQgPT09IGN1cnJlbnRVc2VySWQ7XG4gICAgICAgIHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0gPSB7XG4gICAgICAgICAgdXNlcklkLFxuICAgICAgICAgIHN0YXRlOiBSQ0NhbGxVc2VyU3RhdGUuV0FJVElORyxcbiAgICAgICAgICBpc0NhbGxlcixcbiAgICAgICAgICBpc1JlbW90ZTogIWlzQ2FsbGVyLFxuICAgICAgICB9O1xuICAgICAgICAvLyDpgJrnn6UgY2FsbCDlsYLkurrlkZjnirbmgIHlj5jmm7RcbiAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0pO1xuXG4gICAgICAgIC8vIOWQr+WKqOWRvOWPq+i2heaXtuiuoeaXtuWZqFxuICAgICAgICBpZiAoIWlzQ2FsbGVyKSB7XG4gICAgICAgICAgdGhpcy5fdXNlclRpbWVyc1t1c2VySWRdID0gbmV3IFRpbWVyKCgpID0+IHtcbiAgICAgICAgICAgIC8vIOWRvOWPq+i2heaXtuWkhOeQhueKtuaAgeOAgeW5tumAmuefpSBjYWxsIOWxglxuICAgICAgICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSAmJiAodGhpcy5fdXNlckluZm9bdXNlcklkXS5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5OT05FKTtcbiAgICAgICAgICAgIC8vIOmAmuefpSBjYWxsIOWxguS6uuWRmOeKtuaAgeWPmOabtFxuICAgICAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0sIFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfTk9fUkVTUE9OU0UpO1xuXG4gICAgICAgICAgICAvLyDlkbzlj6votoXml7bmnKrmjqXmipvlh7pvbkh1bmd1cFxuICAgICAgICAgICAgdGhpcy5fd2F0Y2hlcnMub25IdW5ndXAodGhpcy5fdXNlckluZm9bdXNlcklkXSwgUkNDYWxsRW5kUmVhc29uLlJFTU9URV9OT19SRVNQT05TRSk7XG5cbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl91c2VySW5mb1t1c2VySWRdO1xuICAgICAgICAgICAgLy8g5oi/6Ze05Lq65ZGY5L+h5oGv5bCR5LqO5Lik5Liq77yM6YCa55+l5oi/6Ze054q25oCBXG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fdXNlckluZm8pLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLkVORCwgUkNDYWxsRW5kUmVhc29uLlJFTU9URV9OT19SRVNQT05TRSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyDov5znq6/kurrlkZjlpKfkuo4gMSDkuJTlt7HmlrnkuI3kuLrmraPlnKjpgJror53ml7bvvIzlj5HpgIEgaHVuZ3VwLCDlkYror4nov5znq6/oh6rlt7HpgIDlh7rpgJror51cbiAgICAgICAgICAgIGNvbnN0IGlzTmVlZFNlbmRIdW5ndXAgPSB0aGlzLmdldFJlbW90ZVVzZXJJZHMoKS5sZW5ndGggPT09IDAgJiYgKHRoaXMuX3VzZXJJbmZvW2N1cnJlbnRVc2VySWRdLnN0YXRlICE9PSBSQ0NhbGxVc2VyU3RhdGUuS0VFUElORyk7XG4gICAgICAgICAgICBpZiAoaXNOZWVkU2VuZEh1bmd1cCkge1xuICAgICAgICAgICAgICB0aGlzLl9odW5ndXBIYW5kbGUoUkNDYWxsRW5kUmVhc29uLlJFTU9URV9OT19SRVNQT05TRSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgdGhpcy5fZ2V0VGltZW91dChzZW50VGltZSkpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8g6YCa55+lIGNhbGwg5bGC5oi/6Ze054q25oCB5Y+Y5pu0XG4gICAgICB0aGlzLl9ub3RpZnlTdGF0ZUNoYW5nZShSQ0NhbGxTZXNzaW9uU3RhdGUuV0FJVElORyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGVuZENvZGUgPSBjb2RlID09PSBSQ0NhbGxFcnJvckNvZGUuUkVKRUNURURfQllfQkxBQ0tMSVNUID8gUkNDYWxsRW5kUmVhc29uLkFEREVEX1RPX0JMQUNLTElTVCA6IFJDQ2FsbEVuZFJlYXNvbi5ORVRXT1JLX0VSUk9SO1xuICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLkVORCwgZW5kQ29kZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOaOpeWQrFxuICAgKi9cbiAgYXN5bmMgYWNjZXB0KCk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUgfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsU3RhdGVNYWNoaW5lXSBhY2NlcHQnKTtcblxuICAgIC8vIOWPkemAgeaOpeWQrOa2iOaBr1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGNvbnN0IHsgY29kZSwgbWVzc2FnZSB9ID0gYXdhaXQgdGhpcy5fY2FsbE1zZ0hhbmRsZXIuc2VuZEFjY2VwdCh7XG4gICAgICBjaGFubmVsSWQ6IHRoaXMuX2NoYW5uZWxJZCxcbiAgICAgIGNvbnZlcnNhdGlvblR5cGU6IHRoaXMuX2NvbnZlcnNhdGlvblR5cGUsXG4gICAgICB0YXJnZXRJZDogdGhpcy5fdGFyZ2V0SWQsXG4gICAgICBjYWxsSWQ6IHRoaXMuX2NhbGxJZCxcbiAgICAgIG1lZGlhVHlwZTogdGhpcy5fbWVkaWFUeXBlLFxuICAgICAgdXNlcklkczogdGhpcy5nZXRSZW1vdGVVc2VySWRzKCksXG4gICAgfSk7XG5cbiAgICAvLyDmuIXpmaTmjqXlkKzotoXml7borqHml7blmahcbiAgICB0aGlzLl9jbGVhclRpbWVyQnlJZChjdXJyZW50VXNlcklkKTtcbiAgICBpZiAoY29kZSA9PT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIGNvbnN0IHsgc2VudFRpbWUgfSA9IG1lc3NhZ2UhO1xuICAgICAgdGhpcy5fdXNlckluZm9bY3VycmVudFVzZXJJZF0gJiYgKHRoaXMuX3VzZXJJbmZvW2N1cnJlbnRVc2VySWRdLnN0YXRlID0gUkNDYWxsVXNlclN0YXRlLktFRVBJTkcpO1xuICAgICAgdGhpcy5fYmVnaW5UaW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgICAgLy8g6YCa55+lIGNhbGwg5bGC5Lq65ZGY54q25oCB5Y+Y5pu0XG4gICAgICB0aGlzLl9ub3RpZnlVc2VyU3RhdGVDaGFuZ2UodGhpcy5fdXNlckluZm9bY3VycmVudFVzZXJJZF0pO1xuICAgICAgLy8g5L+u5pS55bm26YCa55+lIGNhbGwg5bGC5oi/6Ze054q25oCB5Y+Y5pu0XG4gICAgICB0aGlzLl9ub3RpZnlTdGF0ZUNoYW5nZShSQ0NhbGxTZXNzaW9uU3RhdGUuS0VFUElORyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3VzZXJJbmZvW2N1cnJlbnRVc2VySWRdICYmICh0aGlzLl91c2VySW5mb1tjdXJyZW50VXNlcklkXS5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5OT05FKTtcbiAgICAgIC8vIOmAmuefpSBjYWxsIOWxguS6uuWRmOeKtuaAgeWPmOabtFxuICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW2N1cnJlbnRVc2VySWRdKTtcbiAgICAgIC8vIOS/ruaUueW5tumAmuefpSBjYWxsIOWxguaIv+mXtOeKtuaAgeWPmOabtFxuICAgICAgY29uc3QgZW5kUmVhc29uID0gY29kZSA9PT0gUkNDYWxsRXJyb3JDb2RlLlJFSkVDVEVEX0JZX0JMQUNLTElTVCA/IFJDQ2FsbEVuZFJlYXNvbi5BRERFRF9UT19CTEFDS0xJU1QgOiBSQ0NhbGxFbmRSZWFzb24uTkVUV09SS19FUlJPUjtcbiAgICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQsIGVuZFJlYXNvbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOe+pOWRvOWPq+S4ree7p+e7remCgOivt1xuICAgKiBAcGFyYW0gdXNlcklkcyDooqvpgoDor7fnlKjmiLcgSUQg5YiX6KGoXG4gICAqL1xuICBhc3luYyBpbnZpdGUodXNlcklkczogc3RyaW5nW10sIG9wdGlvbnM6IElJbnZpdGVPcHRpb25zID0ge30pOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICBpZiAodGhpcy5fY29udmVyc2F0aW9uVHlwZSAhPT0gQ29udmVyc2F0aW9uVHlwZS5HUk9VUCkge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLkNPTlZFUlNBVElPTl9OT1RfR1JPVVBfRVJST1IgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gaW52aXRlIC0+IHVzZXJJZHM6ICR7SlNPTi5zdHJpbmdpZnkodXNlcklkcyl9YCk7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgY29uc3QgZXhpc3RlZFVzZXJJZHMgPSBPYmplY3Qua2V5cyh0aGlzLl91c2VySW5mbyk7XG4gICAgY29uc3QgZXhpc3RlZFVzZXJQb2ZpbGVzOiBJRXhpc3RlZFVzZXJQb2ZpbGVzW10gPSBleGlzdGVkVXNlcklkcy5tYXAoKHVzZXJJZCkgPT4ge1xuICAgICAgbGV0IGNhbGxTdGF0dXMgPSBNc2dDYWxsU3RhdHVzLkNPTk5FQ1RFRDtcbiAgICAgIC8vIOWMheWQq+iiq+mCgOivt+iAhe+8jOaIluiAheeUqOaIt+eKtuaAgeS4uiB3YXRpbmcg5pe277yM54q25oCB5Li6IOWTjemTg1xuICAgICAgaWYgKHVzZXJJZHMuaW5jbHVkZXModXNlcklkKSB8fCB0aGlzLl91c2VySW5mb1t1c2VySWRdLnN0YXRlID09PSBSQ0NhbGxVc2VyU3RhdGUuV0FJVElORykge1xuICAgICAgICBjYWxsU3RhdHVzID0gTXNnQ2FsbFN0YXR1cy5SSU5HSU5HO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICBtZWRpYVR5cGU6IHRoaXMuX21lZGlhVHlwZSxcbiAgICAgICAgY2FsbFN0YXR1cyxcbiAgICAgICAgbWVkaWFJZDogdXNlcklkLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGV4dHJhID0gb3B0aW9ucy5leHRyYSB8fCAnJztcbiAgICBjb25zdCBwdXNoVGl0bGUgPSBvcHRpb25zLnB1c2hUaXRsZSB8fCAnJztcbiAgICBjb25zdCBwdXNoQ29udGVudCA9IG9wdGlvbnMucHVzaENvbnRlbnQgfHwgJyc7XG5cbiAgICAvLyDlj5HpgIHkurrlkZjlj5jmm7Tmtojmga9cbiAgICBjb25zdCB7IGNvZGUsIG1lc3NhZ2UgfSA9IGF3YWl0IHRoaXMuX2NhbGxNc2dIYW5kbGVyLnNlbmRNZW1lYmVyTW9kaWZ5KHtcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5fY2hhbm5lbElkLFxuICAgICAgY29udmVyc2F0aW9uVHlwZTogdGhpcy5fY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkOiB0aGlzLl90YXJnZXRJZCxcbiAgICAgIGNhbGxJZDogdGhpcy5fY2FsbElkLFxuICAgICAgZXh0cmEsXG4gICAgICBwdXNoVGl0bGUsXG4gICAgICBwdXNoQ29udGVudCxcbiAgICAgIG1lZGlhVHlwZTogdGhpcy5fbWVkaWFUeXBlLFxuICAgICAgLy8g6Zmk6Ieq5bex77yM5YW25LuW5omA5pyJ5Lq65Z2H6ZyA5pS25YiwIG1vZGlmeSDmtojmga/vvIzku6XmraTmm7TmlrDnirbmgIFcbiAgICAgIGludml0ZVVzZXJJZHM6IHVzZXJJZHMuZmlsdGVyKChpZCkgPT4gaWQgIT09IGN1cnJlbnRVc2VySWQpLFxuICAgICAgY2FsbGVySWQ6IHRoaXMuZ2V0Q2FsbGVySWQoKSxcbiAgICAgIGV4aXN0ZWRVc2VyUG9maWxlcyxcbiAgICAgIGRpcmVjdGlvbmFsVXNlcklkTGlzdDogWy4uLmV4aXN0ZWRVc2VySWRzLCAuLi51c2VySWRzXS5maWx0ZXIoKGlkKSA9PiBpZCAhPT0gY3VycmVudFVzZXJJZCksXG4gICAgfSk7XG5cbiAgICBpZiAoY29kZSA9PT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIGNvbnN0IHsgc2VudFRpbWUgfSA9IG1lc3NhZ2UhO1xuICAgICAgLy8g5L+u5pS56KKr6YKA6K+35Lq654q25oCB77yM5bm26YCa55+lXG4gICAgICB1c2VySWRzLmZvckVhY2goKHVzZXJJZCkgPT4ge1xuICAgICAgICB0aGlzLl91c2VySW5mb1t1c2VySWRdID0ge1xuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICBzdGF0ZTogUkNDYWxsVXNlclN0YXRlLldBSVRJTkcsXG4gICAgICAgICAgaXNDYWxsZXI6IGZhbHNlLFxuICAgICAgICAgIGlzUmVtb3RlOiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgICAvLyDpgJrnn6UgY2FsbCDlsYLkurrlkZjnirbmgIHlj5jmm7RcbiAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0pO1xuICAgICAgICAvLyDlkK/liqjlkbzlj6vorqHml7blmahcbiAgICAgICAgdGhpcy5fdXNlclRpbWVyc1t1c2VySWRdID0gbmV3IFRpbWVyKCgpID0+IHtcbiAgICAgICAgICAvLyDlkbzlj6votoXml7blpITnkIbnirbmgIHjgIHlubbpgJrnn6UgY2FsbCDlsYJcbiAgICAgICAgICB0aGlzLl91c2VySW5mb1t1c2VySWRdICYmICh0aGlzLl91c2VySW5mb1t1c2VySWRdLnN0YXRlID0gUkNDYWxsVXNlclN0YXRlLk5PTkUpO1xuICAgICAgICAgIC8vIOmAmuefpSBjYWxsIOWxguS6uuWRmOeKtuaAgeWPmOabtFxuICAgICAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1t1c2VySWRdLCBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05PX1JFU1BPTlNFKTtcblxuICAgICAgICAgIC8vIOWRvOWPq+i2heaXtuacquaOpeaKm+WHum9uSHVuZ3VwXG4gICAgICAgICAgdGhpcy5fd2F0Y2hlcnMub25IdW5ndXAodGhpcy5fdXNlckluZm9bdXNlcklkXSwgUkNDYWxsRW5kUmVhc29uLlJFTU9URV9OT19SRVNQT05TRSk7XG5cbiAgICAgICAgICBkZWxldGUgdGhpcy5fdXNlckluZm9bdXNlcklkXTtcbiAgICAgICAgICAvLyDmiL/pl7TkurrlkZjkv6Hmga/lsJHkuo7kuKTkuKrvvIzpgJrnn6XmiL/pl7TnirbmgIFcbiAgICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fdXNlckluZm8pLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQsIFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfTk9fUkVTUE9OU0UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcy5fZ2V0VGltZW91dChzZW50VGltZSkpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOmAmuefpeS6uuWRmOWPmOabtFxuICAgICAgdXNlcklkcy5mb3JFYWNoKCh1c2VySWQpID0+IHtcbiAgICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSA9IHtcbiAgICAgICAgICB1c2VySWQsXG4gICAgICAgICAgc3RhdGU6IFJDQ2FsbFVzZXJTdGF0ZS5OT05FLFxuICAgICAgICAgIGlzQ2FsbGVyOiBmYWxzZSxcbiAgICAgICAgICBpc1JlbW90ZTogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8g6YCa55+lIGNhbGwg5bGC5Lq65ZGY54q25oCB5Y+Y5pu0XG5cbiAgICAgICAgY29uc3QgZW5kUmVhc29uID0gY29kZSA9PT0gUkNDYWxsRXJyb3JDb2RlLlJFSkVDVEVEX0JZX0JMQUNLTElTVCA/IFJDQ2FsbEVuZFJlYXNvbi5BRERFRF9UT19CTEFDS0xJU1QgOiBSQ0NhbGxFbmRSZWFzb24uTkVUV09SS19FUlJPUjtcbiAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0sIGVuZFJlYXNvbik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9odW5ndXBIYW5kbGUocmVhc29uOiBSQ0NhbGxFbmRSZWFzb24pOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICAvLyDlj5HpgIHmjILmlq3nsbvlnovmtojmga9cbiAgICBsZXQgY29kZSA9IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTO1xuXG4gICAgY29uc3QgaGFuZ3VwUGFyYW1zID0ge1xuICAgICAgY2hhbm5lbElkOiB0aGlzLl9jaGFubmVsSWQsXG4gICAgICBjb252ZXJzYXRpb25UeXBlOiB0aGlzLl9jb252ZXJzYXRpb25UeXBlLFxuICAgICAgdGFyZ2V0SWQ6IHRoaXMuX3RhcmdldElkLFxuICAgICAgY2FsbElkOiB0aGlzLl9jYWxsSWQsXG4gICAgICByZWFzb24sXG4gICAgICB1c2VySWRzOiB0aGlzLmdldFJlbW90ZVVzZXJJZHMoKSxcbiAgICAgIHB1c2hUaXRsZTogdGhpcy5faHVuZ3VwUHVzaFRpdGxlLFxuICAgICAgcHVzaENvbnRlbnQ6IHRoaXMuX2h1bmd1cFB1c2hDb250ZW50LFxuICAgIH07XG5cbiAgICBpZiAocmVhc29uID09PSBSQ0NhbGxFbmRSZWFzb24uT1RIRVJfQ0xJRU5UX0pPSU5FRF9DQUxMKSB7XG4gICAgICAvLyDlt7Hnq6/ooqvlpJrnq6/liqDlhaUgUlRDIOaIv+mXtOaMpOaOieWQju+8jOS4jeWGjeetieWPkeaMguaWrea2iOaBr+eahOe7k+aenO+8jOmYsuatoui1sCB1c2VyTGVhdmUg5a+86Ie05oyC5pat5Y6f5Zug5LiN5YeG56GuXG4gICAgICB0aGlzLl9jYWxsTXNnSGFuZGxlci5zZW5kSHVuZ3VwKGhhbmd1cFBhcmFtcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHsgY29kZTogbXNnQ29kZSB9ID0gYXdhaXQgdGhpcy5fY2FsbE1zZ0hhbmRsZXIuc2VuZEh1bmd1cChoYW5ndXBQYXJhbXMpO1xuICAgICAgY29kZSA9IG1zZ0NvZGU7XG4gICAgfVxuXG4gICAgdGhpcy5fZW5kVGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAvLyDmm7TmlrDpgJror53kurrlkZjnirbmgIHjgIHpgJror53nu5PmnZ/ml7bpl7Qg5bm26YCa55+lXG4gICAgZm9yIChjb25zdCB1c2VySWQgaW4gdGhpcy5fdXNlckluZm8pIHtcbiAgICAgIHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0uc3RhdGUgPSBSQ0NhbGxVc2VyU3RhdGUuTk9ORTtcbiAgICAgIGlmICh1c2VySWQgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0sIHJlYXNvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9ub3RpZnlVc2VyU3RhdGVDaGFuZ2UodGhpcy5fdXNlckluZm9bdXNlcklkXSk7XG4gICAgICB9XG4gICAgICBkZWxldGUgdGhpcy5fdXNlckluZm9bdXNlcklkXTtcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fdXNlckluZm8pLmxlbmd0aCA8IDIpIHtcbiAgICAgIC8vIOa4heepuuWGheWtmOaAgeaVsOaNru+8jOW5tumAmuefpVxuICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLkVORCwgcmVhc29uKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog5oyC5patXG4gICAqL1xuICBhc3luYyBodW5ndXAocHVzaFRpdGxlOiBzdHJpbmcgPSAnJywgcHVzaENvbnRlbnQ6IHN0cmluZyA9ICcnKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSB9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgJ1tSQ0NhbGxTdGF0ZU1hY2hpbmVdIGh1bmd1cCcpO1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIC8vIOm7mOiupOaMguaWrSByZWFzb24g5Li66YCa6K+d6L+H56iL5Lit77yM5bex5pa55q2j5bi45Y+W5raI6YCa6K+dXG4gICAgbGV0IHJlYXNvbiA9IFJDQ2FsbEVuZFJlYXNvbi5IQU5HVVA7XG4gICAgLy8g6Iul6LaF5pe26K6h5pe25Zmo5a2Y5ZyoLCDlt7HmlrnkuLogY2FsbGVyIOWOn+WboOS4uuW3seaWueWPlua2iOmAmuivnSwg5bex5pa55Li6IGNhbGxlZSDljp/lm6DkuLrlt7Hmlrnmi5Lnu53pgJror51cbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fdXNlclRpbWVycykubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5fdXNlckluZm9bY3VycmVudFVzZXJJZF0uaXNDYWxsZXIgPyByZWFzb24gPSBSQ0NhbGxFbmRSZWFzb24uQ0FOQ0VMIDogcmVhc29uID0gUkNDYWxsRW5kUmVhc29uLlJFSkVDVDtcbiAgICB9XG5cbiAgICAvLyDmuIXpmaTmiYDmnInotoXml7borqHml7blmahcbiAgICBmb3IgKGNvbnN0IHVzZXJJZCBpbiB0aGlzLl91c2VyVGltZXJzKSB7XG4gICAgICB0aGlzLl9jbGVhclRpbWVyQnlJZCh1c2VySWQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5faHVuZ3VwSGFuZGxlKHJlYXNvbik7XG4gIH1cblxuICAvKipcbiAgICog5L+u5pS56YCa6K+d5aqS5L2T57G75Z6LXG4gICAqIEBwYXJhbSBtZWRpYVR5cGUgUkNDYWxsTWVkaWFUeXBlLkFVRElPIOaUueS4uumfs+mikemAmuivnSB8IFJDQ2FsbE1lZGlhVHlwZS5BVURJT19WSURFTyDmlLnkuLrpn7Pop4bpopHpgJror51cbiAgICovXG4gIGFzeW5jIGNoYW5nZU1lZGlhVHlwZShtZWRpYVR5cGU6IFJDQ2FsbE1lZGlhVHlwZSk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUgfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbUkNDYWxsU3RhdGVNYWNoaW5lXSBjaGFuZ2VNZWRpYVR5cGUgLT4gbWVkaWFUeXBlOiAke21lZGlhVHlwZX1gKTtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX2NhbGxNc2dIYW5kbGVyLnNlbmRNZWRpYU1vZGlmeSh7XG4gICAgICBjaGFubmVsSWQ6IHRoaXMuX2NoYW5uZWxJZCxcbiAgICAgIGNvbnZlcnNhdGlvblR5cGU6IHRoaXMuX2NvbnZlcnNhdGlvblR5cGUsXG4gICAgICB0YXJnZXRJZDogdGhpcy5fdGFyZ2V0SWQsXG4gICAgICBjYWxsSWQ6IHRoaXMuX2NhbGxJZCxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICAgIHVzZXJJZHM6IHRoaXMuZ2V0UmVtb3RlVXNlcklkcygpLFxuICAgIH0pO1xuICAgIGlmIChjb2RlID09PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbWVkaWFUeXBlID0gbWVkaWFUeXBlO1xuICAgIH1cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog55So5oi35Yqg5YWl6YCa6K+d6KGl5YG/5py65Yi277yIcnRjIHVzZXJKb2luIOS6i+S7tuinpuWPke+8iVxuICAgKiDkuLvlj6vlkbzlj6vlkI7vvIzmnKrmlLbliLDooqvlj6sgYWNjZXB0IOa2iOaBr++8jOS9huaUtuWIsOS6hiB1c2VySm9pbiDlkIzmoLfooaXlgb/mm7TmlrDnlKjmiLfjgIHmiL/pl7TnirbmgIHjgIHlkbzlj6vorqHml7blmahcbiAgICovXG4gIHVzZXJKb2luKHVzZXJJZHM6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYFtSQ0NhbGxTdGF0ZU1hY2hpbmVdIHVzZXJKb2luIC0+IHVzZXJJZHM6ICR7SlNPTi5zdHJpbmdpZnkodXNlcklkcyl9YCk7XG4gICAgLy8g5bu26L+fIDMwMG1zIOmYsuatoiB1c2VySmlvbiDlkowgYWNjZXB0IOa2iOaBr+mDveacieeahOaDheWGteS4i++8jCB1c2VySm9pbiDmr5QgYWNjZXB0IOWFiOWIsFxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdXNlcklkcy5mb3JFYWNoKCh1c2VySWQpID0+IHtcbiAgICAgICAgY29uc3QgdXNlckluZm8gPSB0aGlzLl91c2VySW5mb1t1c2VySWRdO1xuICAgICAgICAvLyDmm7TmlrDkurrlkZjnirbmgIEgKC8vIOe+pOe7hOmAmuivneaXtu+8miBB5ZCRQuOAgUPlj5HotbfpgJror50gQuWFiOaOpeWQrO+8jEPlkI7mjqXlkKzvvIzov5nml7ZC5rKh5pyJQ+eahHVzZXJJZOWvueW6lOeahF91c2VySW5mb++8jOaJgOS7pei/memHjOWIpOaWreS4gOS4iylcbiAgICAgICAgaWYgKHVzZXJJbmZvICYmIHVzZXJJbmZvLnN0YXRlICE9PSBSQ0NhbGxVc2VyU3RhdGUuS0VFUElORykge1xuICAgICAgICAgIHVzZXJJbmZvLnN0YXRlID0gUkNDYWxsVXNlclN0YXRlLktFRVBJTkc7XG4gICAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHVzZXJJbmZvKTtcbiAgICAgICAgfVxuICAgICAgICAvLyDmm7TmlrDmiL/pl7TnirbmgIFcbiAgICAgICAgaWYgKHRoaXMuX3Nlc3Npb25TdGF0ZSAhPT0gUkNDYWxsU2Vzc2lvblN0YXRlLktFRVBJTkcpIHtcbiAgICAgICAgICB0aGlzLl9ub3RpZnlTdGF0ZUNoYW5nZShSQ0NhbGxTZXNzaW9uU3RhdGUuS0VFUElORyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8g5YGc5q2i5bm25riF6Zmk5ZG85Y+r6K6h5pe25ZmoXG4gICAgICAgIHRoaXMuX2NsZWFyVGltZXJCeUlkKHVzZXJJZCk7XG4gICAgICB9KTtcbiAgICB9LCAzMDApO1xuICB9XG5cbiAgLyoqXG4gICAqIOeUqOaIt+emu+W8gOmAmuivneihpeWBv+acuuWItu+8iHJ0YyB1c2VyTGVhdmXjgIFraWNrT2ZmIOS6i+S7tuinpuWPke+8iVxuICAgKiDpgJror53kuK3ov5znq6/nlKjmiLfmjILmlq3vvIzmjILmlq3mtojmga/mnKrliLDvvIzkvYbmmK/nm5HlkKzliLAgcnRjIHVzZXJMZWF2ZSDlkIzmoLfooaXlgb/mm7TmlrDnlKjmiLfjgIHmiL/pl7TnirbmgIFcbiAgICovXG4gIHVzZXJMZWF2ZSh1c2VySWRzOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbUkNDYWxsU3RhdGVNYWNoaW5lXSB1c2VyTGVhdmUgLT4gdXNlcklkczogJHtKU09OLnN0cmluZ2lmeSh1c2VySWRzKX1gKTtcbiAgICAvLyDlu7bov58gMzAwbXMg6Ziy5q2iIHVzZXJMZWF2ZSDlkowgaHVuZ3VwIOa2iOaBr+mDveacieeahOaDheWGteS4i++8jHVzZXJMZWF2ZSDmr5QgaHVuZ3VwIOWFiOWIsFxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdXNlcklkcy5mb3JFYWNoKCh1c2VySWQpID0+IHtcbiAgICAgICAgY29uc3QgdXNlckluZm8gPSB0aGlzLl91c2VySW5mb1t1c2VySWRdO1xuICAgICAgICAvLyDmm7TmlrDkurrlkZjnirbmgIFcbiAgICAgICAgaWYgKHVzZXJJbmZvICYmIHVzZXJJbmZvLnN0YXRlICE9PSBSQ0NhbGxVc2VyU3RhdGUuTk9ORSkge1xuICAgICAgICAgIHVzZXJJbmZvLnN0YXRlID0gUkNDYWxsVXNlclN0YXRlLk5PTkU7XG4gICAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHVzZXJJbmZvLCBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX0hBTkdVUCk7XG4gICAgICAgICAgdGhpcy5fd2F0Y2hlcnMub25IdW5ndXAodXNlckluZm8sIFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfSEFOR1VQKTtcbiAgICAgICAgICBkZWxldGUgdGhpcy5fdXNlckluZm9bdXNlcklkXTtcbiAgICAgICAgfVxuICAgICAgICAvLyDkuLvlj6vmlrnnvqTogYrpgoDor7fooqvlj6vmlrnlkI7nprvnur/vvIzkuLvlj6vmlrnmraTml7bkuLrnrYnlvoXnirbmgIHlkI7kuI3lho3kuIrnur/vvIzooqvlj6vmlrnmjqXlkKzlkI7mjILmlq3oh7PliankvZnkuIDkurrml7bnrYnlvoXkuIDliIbpkp/lkI7mjILmlq1cbiAgICAgICAgY29uc3QgcmVtb3RlVXNlcnNUaW1lciA9IG5ldyBUaW1lcigoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVtb3RlVXNlcnMgPSB0aGlzLmdldFJlbW90ZVVzZXJzKCk7XG4gICAgICAgICAgLy8g6L+c56uv5Y+q5pyJ5LiA5Liq55So5oi35LiU5piv562J5b6F54q25oCB77yM562J5b6F5LiA5YiG6ZKf5ZCO5oyC5patXG4gICAgICAgICAgaWYgKHJlbW90ZVVzZXJzLmxlbmd0aCA9PT0gMSAmJiByZW1vdGVVc2Vyc1swXS5zdGF0ZSA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5faHVuZ3VwSGFuZGxlKFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfTkVUV09SS19FUlJPUik7XG4gICAgICAgICAgfVxuICAgICAgICB9LCA2MDAwMCk7XG4gICAgICAgIC8vIOabtOaWsOaIv+mXtOeKtuaAgVxuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fdXNlckluZm8pLmxlbmd0aCA8IDIgJiYgdGhpcy5fc2Vzc2lvblN0YXRlICE9PSBSQ0NhbGxTZXNzaW9uU3RhdGUuRU5EKSB7XG4gICAgICAgICAgdGhpcy5fZW5kVGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICB0aGlzLl9ub3RpZnlTdGF0ZUNoYW5nZShSQ0NhbGxTZXNzaW9uU3RhdGUuRU5ELCBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX0hBTkdVUCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sIDMwMCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbCDlsYLlt7HmlrnlvILluLjlpLHotKXlkI7osIPnlKjnmoTmlrnms5VcbiAgICog6Kem5Y+R5pe25py677ya6Z+z6KeG6aKR5pyN5Yqh5byC5bi444CB6I635Y+W6LWE5rqQ5aSx6LSl44CB5Yqg5YWlIFJUQyDmiL/pl7TlpLHotKXjgIHlj5HluIN86K6i6ZiF5aSx6LSlXG4gICAqL1xuICBjbG9zZShyZWFzb246IFJDQ2FsbEVuZFJlYXNvbikge1xuICAgIHRoaXMuX2h1bmd1cEhhbmRsZShyZWFzb24pO1xuICB9XG5cbiAgc2V0SHVuZ3VwUHVzaENvbmZpZyhwdXNoQ29uZmlnOiBzdHJpbmcgPSAnJywgcHVzaENvbnRlbnQ6IHN0cmluZyA9ICcnKSB7XG4gICAgdGhpcy5faHVuZ3VwUHVzaFRpdGxlID0gcHVzaENvbmZpZztcbiAgICB0aGlzLl9odW5ndXBQdXNoQ29udGVudCA9IHB1c2hDb250ZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIOmAmuivneWUr+S4gOagh+ivhlxuICAgKi9cbiAgZ2V0Q2FsbElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbGxJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDlpJrnu4Tnu4cgSURcbiAgICovXG4gIGdldENoYW5uZWxJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jaGFubmVsSWQ7XG4gIH1cblxuICAvKipcbiAgICog55uu5qCHIElE77yM5Y2V5ZG85a+55pa55Lq65ZGYIElkLCDnvqTlkbznvqTnu4QgSWRcbiAgICovXG4gIGdldFRhcmdldElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3RhcmdldElkO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluS8muivneexu+Wei1xuICAgKi9cbiAgZ2V0Q29udmVyc2F0aW9uVHlwZSgpOiBDb252ZXJzYXRpb25UeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fY29udmVyc2F0aW9uVHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bov5znq6/miJDlkZggSUQg5YiX6KGoXG4gICAqL1xuICBnZXRSZW1vdGVVc2VySWRzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBhbGxVc2VySWRzID0gT2JqZWN0LmtleXModGhpcy5fdXNlckluZm8pO1xuICAgIGNvbnN0IHJlbW90ZVVzZXJJZHMgPSBhbGxVc2VySWRzLmZpbHRlcigoaWQpID0+IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCkgIT09IGlkKTtcbiAgICByZXR1cm4gcmVtb3RlVXNlcklkcztcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bov5znq6/miJDlkZjkv6Hmga/liJfooahcbiAgICovXG4gIGdldFJlbW90ZVVzZXJzKCk6IElVc2VyRGF0YVtdIHtcbiAgICBjb25zdCByZW1vdGVVc2VyOiBJVXNlckRhdGFbXSA9IFtdO1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGZvciAoY29uc3QgdWlkIGluIHRoaXMuX3VzZXJJbmZvKSB7XG4gICAgICBjb25zdCB7IHVzZXJJZCB9ID0gdGhpcy5fdXNlckluZm9bdWlkXTtcbiAgICAgIGlmICh1c2VySWQgIT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgICAgcmVtb3RlVXNlci5wdXNoKHRoaXMuX3VzZXJJbmZvW3VpZF0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVtb3RlVXNlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bmiL/pl7TnirbmgIFcbiAgICovXG4gIGdldFN0YXRlKCk6IFJDQ2FsbFNlc3Npb25TdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuX3Nlc3Npb25TdGF0ZSA9PT0gbnVsbCA/IFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQgOiB0aGlzLl9zZXNzaW9uU3RhdGU7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5Lq65ZGY54q25oCBXG4gICAqL1xuICBnZXRVc2VyU3RhdGUodXNlcklkOiBzdHJpbmcpOiBSQ0NhbGxVc2VyU3RhdGUge1xuICAgIHJldHVybiB0aGlzLl91c2VySW5mb1t1c2VySWRdPy5zdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bkvJror53lj5HotbfogIUgSWRcbiAgICovXG4gIGdldENhbGxlcklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbGxlcklkITtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blvZPmrKHkvJror53pgoDor7fogIUgSWRcbiAgICovXG4gIGdldEludml0ZXJJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9pbnZpdGVySWQhO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluW9k+WJjemAmuivneWqkuS9k+exu+Wei1xuICAgKi9cbiAgZ2V0TWVkaWFUeXBlKCk6IFJDQ2FsbE1lZGlhVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX21lZGlhVHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJror53mjILmlq3lkI7lj6/osIPnlKhcbiAgICovXG4gIGdldFN1bW1hcnkoKTogSUVuZFN1bW1hcnkge1xuICAgIC8vIOmAmuivneaXtumXtOiuoeeul1xuICAgIGNvbnN0IGJlZ2luVGltZXN0YW1wID0gdGhpcy5fYmVnaW5UaW1lc3RhbXA7XG4gICAgY29uc3QgZW5kVGltZXN0YW1wID0gdGhpcy5fZW5kVGltZXN0YW1wO1xuICAgIGxldCBkdXJhdGlvbiA9IDA7XG4gICAgaWYgKGVuZFRpbWVzdGFtcCA+IGJlZ2luVGltZXN0YW1wICYmIGJlZ2luVGltZXN0YW1wICE9PSAwKSB7XG4gICAgICBkdXJhdGlvbiA9IGVuZFRpbWVzdGFtcCAtIGJlZ2luVGltZXN0YW1wO1xuICAgIH1cblxuICAgIGNvbnN0IHN1bW1hcnkgPSB7XG4gICAgICBjb252ZXJzYXRpb25UeXBlOiB0aGlzLl9jb252ZXJzYXRpb25UeXBlLFxuICAgICAgY2hhbm5lbElkOiB0aGlzLl9jaGFubmVsSWQsXG4gICAgICB0YXJnZXRJZDogdGhpcy5fdGFyZ2V0SWQsXG4gICAgICBtZWRpYVR5cGU6IHRoaXMuX21lZGlhVHlwZSxcbiAgICAgIGJlZ2luVGltZXN0YW1wLFxuICAgICAgZW5kVGltZXN0YW1wLFxuICAgICAgZHVyYXRpb24sXG4gICAgICBlbmRSZWFzb246IHRoaXMuX2VuZFJlYXNvbiEsXG4gICAgfTtcblxuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbUkNDYWxsU3RhdGVNYWNoaW5lXSBnZXRTdW1tYXJ5IC0+IHN1bW1hcnk6ICR7SlNPTi5zdHJpbmdpZnkoc3VtbWFyeSl9YCk7XG4gICAgcmV0dXJuIHN1bW1hcnk7XG4gIH1cbn1cbiIsIi8qKlxuICog6YCa6K+d5aqS5L2T57G75Z6LXG4gKi9cbmV4cG9ydCBlbnVtIFJDQ2FsbE1lZGlhVHlwZSB7XG4gIC8qKlxuICAgKiDpn7PpopHpgJror51cbiAgICovXG4gIEFVRElPID0gMSxcbiAgLyoqXG4gICAqIOinhumikemAmuivnVxuICAgKi9cbiAgQVVESU9fVklERU9cbn1cbiIsImV4cG9ydCBlbnVtIE1lbWJlck1vZGlmeVR5cGUge1xuICBBREQgPSAxLFxuICBSRU1PVkVcbn1cbiIsIi8qKlxuICog5bmz5Y+wXG4gKi9cbmV4cG9ydCBlbnVtIFBsYXRmb3JtIHtcbiAgV0VCID0gJ1dlYicsXG4gIElPUyA9ICdpT1MnLFxuICBBTkRST0lEID0gJ0FuZHJvaWQnXG59XG4iLCJpbXBvcnQge1xuICBDb252ZXJzYXRpb25UeXBlLCBJTG9nZ2VyLCBJUmVjZWl2ZWRNZXNzYWdlLCBSVENQbHVnaW5Db250ZXh0LFxufSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBDYWxsUmVtb3RlRW5kUmVhc29uLCBSQ0NhbGxFbmRSZWFzb24gfSBmcm9tICcuL2VudW1zL1JDQ2FsbEVuZFJlYXNvbic7XG5pbXBvcnQgeyBSQ0NhbGxNZWRpYVR5cGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbE1lZGlhVHlwZSc7XG5pbXBvcnQgeyBSQ0NhbGxNZXNzYWdlVHlwZSB9IGZyb20gJy4vZW51bXMvUkNDYWxsTWVzc2FnZVR5cGUnO1xuaW1wb3J0IHsgSUh1bmd1cE1zZ0NvbnRlbnQsIElJbnZpdGVNc2dDb250ZW50LCBJTWVkaWFNb2RpZnlNc2dDb250ZW50IH0gZnJvbSAnLi9pbnRlcmZhY2VzL0lNZXNzYWdlSGFuZGxlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU9mZmxpbmVSZWNvcmQge1xuICBjaGFubmVsSWQ6IHN0cmluZyxcbiAgY29udmVyc2F0aW9uVHlwZTogQ29udmVyc2F0aW9uVHlwZSxcbiAgdGFyZ2V0SWQ6IHN0cmluZyxcbiAgbWVkaWFUeXBlOiBSQ0NhbGxNZWRpYVR5cGUsXG4gIGNhbGxJZDogc3RyaW5nLFxuICBpbnZpdGVySWQ6IHN0cmluZyxcbiAgZW5kUmVhc29uOiBSQ0NhbGxFbmRSZWFzb24sXG4gIGJlZ2luVGltZXN0YW1wOiBudW1iZXIsXG4gIGVuZFRpbWVzdGFtcDogbnVtYmVyLFxuICBkdXJhdGlvbjogbnVtYmVyXG59XG5cbi8qKlxuICog56a757q/6YCa6K+d6K6w5b2V5ZmoXG4gKi9cbmV4cG9ydCBjbGFzcyBPZmZsaW5lUmVjb3JkZXIge1xuICBwcml2YXRlIF9tZXNzYWdlczogSVJlY2VpdmVkTWVzc2FnZVtdIHwgW10gPSBbXVxuXG4gIHByaXZhdGUgX2NoYW5uZWxJZCE6IHN0cmluZ1xuXG4gIHByaXZhdGUgX2NvbnZlcnNhdGlvblR5cGUhOiBDb252ZXJzYXRpb25UeXBlXG5cbiAgcHJpdmF0ZSBfdGFyZ2V0SWQhOiBzdHJpbmdcblxuICBwcml2YXRlIF9tZWRpYVR5cGUhOiBSQ0NhbGxNZWRpYVR5cGVcblxuICBwcml2YXRlIF9jYWxsSWQhOiBzdHJpbmdcblxuICBwcml2YXRlIF9jYWxsZXJJZCE6IHN0cmluZ1xuXG4gIHByaXZhdGUgX2ludml0ZXJJZCE6IHN0cmluZ1xuXG4gIHByaXZhdGUgX2VuZFJlYXNvbiE6IFJDQ2FsbEVuZFJlYXNvblxuXG4gIHByaXZhdGUgX2JlZ2luVGltZXN0YW1wOiBudW1iZXIgPSAwXG5cbiAgcHJpdmF0ZSBfZW5kVGltZXN0YW1wOiBudW1iZXIgPSAwXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29udGV4dDogUlRDUGx1Z2luQ29udGV4dCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IElMb2dnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfb25SZWNvcmQ6IChyZWNvcmQ6IElPZmZsaW5lUmVjb3JkKSA9PiB2b2lkLFxuICApIHtcblxuICB9XG5cbiAgLyoqXG4gICAqIOWIsCBpbnZpdGUgfCBtZW1iZXJNb2RpZnkg57uT5p2fXG4gICAqIOWOn+WboOagueaNruW3seaWueaYr+WQpuS4uuS4u+WPq++8jOS4u+WPq+S4uui/nOerr+acquaOpeWQrCDooqvlj6vooqvlt7Hnq6/mnKrmjqXlkKxcbiAgICovXG4gIHByaXZhdGUgX2RvSW52aXRlKG1lc3NhZ2U6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICBjb25zdCB7XG4gICAgICBjaGFubmVsSWQsIGNvbnZlcnNhdGlvblR5cGUsIHRhcmdldElkLCBzZW5kZXJVc2VySWQsIGNvbnRlbnQsXG4gICAgfSA9IG1lc3NhZ2U7XG4gICAgY29uc3QgeyBjYWxsSWQsIG1lZGlhVHlwZSB9ID0gY29udGVudCBhcyBJSW52aXRlTXNnQ29udGVudDtcbiAgICB0aGlzLl9jaGFubmVsSWQgPSBjaGFubmVsSWQhO1xuICAgIHRoaXMuX2NvbnZlcnNhdGlvblR5cGUgPSBjb252ZXJzYXRpb25UeXBlO1xuICAgIHRoaXMuX3RhcmdldElkID0gdGFyZ2V0SWQ7XG4gICAgdGhpcy5fY2FsbElkID0gY2FsbElkO1xuICAgIHRoaXMuX21lZGlhVHlwZSA9IG1lZGlhVHlwZTtcbiAgICBjb25zdCBpc0NhbGxlciA9IHNlbmRlclVzZXJJZCA9PT0gY3VycmVudFVzZXJJZDtcbiAgICB0aGlzLl9pbnZpdGVySWQgPSBzZW5kZXJVc2VySWQ7XG4gICAgdGhpcy5fZW5kUmVhc29uID0gaXNDYWxsZXIgPyBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05PX1JFU1BPTlNFIDogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9OT19SRVNQT05TRTtcbiAgICB0aGlzLl9jYW5HZW5SZWNvcmQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliLAgaW52aXRlIHwgbWVtYmVyTW9kaWZ5IOe7k+adn1xuICAgKiDljp/lm6DmoLnmja7lt7HmlrnmmK/lkKbkuLrkuLvlj6vvvIzkuLvlj6vkuLrov5znq6/mnKrmjqXlkKwg6KKr5Y+r6KKr5bex56uv5pyq5o6l5ZCsXG4gICAqL1xuICBwcml2YXRlIF9kb01lbWJlck1vZGlmeShtZXNzYWdlOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgdGhpcy5fZG9JbnZpdGUobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICog55SoIGludml0ZSB8IG1lbWJlck1vZGlmeSDorqHnrpfnmoTnprvnur/orrDlvZVcbiAgICovXG4gIHByaXZhdGUgX2RvUmluZ2luZyhtZXNzYWdlOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgdGhpcy5fY2FuR2VuUmVjb3JkKCk7XG4gIH1cblxuICAvKipcbiAgICog5YiwIGFjY2VwdCDor7TmmI7pgJror53lt7Llu7rnq4tcbiAgICog5Y6f5Zug6buY6K6k5bex5pa55q2j5bi45oyC5patXG4gICAqL1xuICBwcml2YXRlIF9kb0FjY2VwdChtZXNzYWdlOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgdGhpcy5fZW5kUmVhc29uID0gUkNDYWxsRW5kUmVhc29uLkhBTkdVUDtcbiAgICB0aGlzLl9iZWdpblRpbWVzdGFtcCA9IG1lc3NhZ2Uuc2VudFRpbWU7XG4gICAgdGhpcy5fY2FuR2VuUmVjb3JkKCk7XG4gIH1cblxuICAvKipcbiAgICog5YiwIGh1bmd1cCDor7TmmI7kuLrmraPluLjmjILmlq1cbiAgICog5Y6f5Zug5Y+W5raI5oGv5L2T6YeM5oyC5pat5Y6f5ZugXG4gICAqL1xuICBwcml2YXRlIF9kb0h1bmd1cChtZXNzYWdlOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgY29uc3QgeyBjb250ZW50LCBzZW50VGltZSwgc2VuZGVyVXNlcklkIH0gPSBtZXNzYWdlO1xuICAgIGNvbnN0IHsgcmVhc29uIH0gPSBjb250ZW50IGFzIElIdW5ndXBNc2dDb250ZW50O1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGNvbnN0IGlzU2VsZlNlbmQgPSBzZW5kZXJVc2VySWQgPT09IGN1cnJlbnRVc2VySWQ7XG4gICAgdGhpcy5fZW5kUmVhc29uID0gaXNTZWxmU2VuZCA/IHJlYXNvbiA6IENhbGxSZW1vdGVFbmRSZWFzb25bcmVhc29uXTtcbiAgICB0aGlzLl9lbmRUaW1lc3RhbXAgPSBzZW50VGltZTtcblxuICAgIHRoaXMuX2NhbkdlblJlY29yZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWPquS/ruaUuemAmuivneexu+Wei1xuICAgKi9cbiAgcHJpdmF0ZSBfZG9NZWRpYU1vZGlmeShtZXNzYWdlOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgY29uc3QgeyBjb250ZW50IH0gPSBtZXNzYWdlO1xuICAgIGNvbnN0IHsgbWVkaWFUeXBlIH0gPSBjb250ZW50IGFzIElNZWRpYU1vZGlmeU1zZ0NvbnRlbnQ7XG4gICAgdGhpcy5fbWVkaWFUeXBlID0gbWVkaWFUeXBlO1xuICAgIHRoaXMuX2NhbkdlblJlY29yZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2FuR2VuUmVjb3JkKCkge1xuICAgIGlmICh0aGlzLl9tZXNzYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGxldCBkdXJhdGlvbiA9IDA7XG4gICAgICBjb25zdCBpc05lZWREdXJhdGlvblJlYXNvbiA9IFtcbiAgICAgICAgUkNDYWxsRW5kUmVhc29uLkhBTkdVUCxcbiAgICAgICAgUkNDYWxsRW5kUmVhc29uLlJFTU9URV9IQU5HVVAsXG4gICAgICAgIFJDQ2FsbEVuZFJlYXNvbi5PVEhFUl9DTElFTlRfSk9JTkVEX0NBTEwsXG4gICAgICAgIFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfT1RIRVJfQ0xJRU5UX0pPSU5FRF9DQUxMLFxuICAgICAgICBSQ0NhbGxFbmRSZWFzb24uS0lDS0VEX0JZX1NFUlZFUixcbiAgICAgICAgUkNDYWxsRW5kUmVhc29uLlJFTU9URV9LSUNLRURfQllfU0VSVkVSLFxuICAgICAgICBSQ0NhbGxFbmRSZWFzb24uQUNDRVBUX1NZU1RFTV9DQUxMLFxuICAgICAgICBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX0FDQ0VQVF9TWVNURU1fQ0FMTCxcbiAgICAgIF0uaW5jbHVkZXModGhpcy5fZW5kUmVhc29uKTtcbiAgICAgIGlmIChpc05lZWREdXJhdGlvblJlYXNvbikge1xuICAgICAgICBkdXJhdGlvbiA9IHRoaXMuX2VuZFRpbWVzdGFtcCAtIHRoaXMuX2JlZ2luVGltZXN0YW1wO1xuICAgICAgfVxuICAgICAgdGhpcy5fb25SZWNvcmQoe1xuICAgICAgICBjaGFubmVsSWQ6IHRoaXMuX2NoYW5uZWxJZCxcbiAgICAgICAgY29udmVyc2F0aW9uVHlwZTogdGhpcy5fY29udmVyc2F0aW9uVHlwZSxcbiAgICAgICAgdGFyZ2V0SWQ6IHRoaXMuX3RhcmdldElkLFxuICAgICAgICBjYWxsSWQ6IHRoaXMuX2NhbGxJZCxcbiAgICAgICAgaW52aXRlcklkOiB0aGlzLl9pbnZpdGVySWQsXG4gICAgICAgIG1lZGlhVHlwZTogdGhpcy5fbWVkaWFUeXBlLFxuICAgICAgICBlbmRSZWFzb246IHRoaXMuX2VuZFJlYXNvbixcbiAgICAgICAgYmVnaW5UaW1lc3RhbXA6IHRoaXMuX2JlZ2luVGltZXN0YW1wLFxuICAgICAgICBlbmRUaW1lc3RhbXA6IHRoaXMuX2VuZFRpbWVzdGFtcCxcbiAgICAgICAgZHVyYXRpb24sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBvblJlY3ZPZmZsaW5lTXNncyhtZXNzYWdlczogSVJlY2VpdmVkTWVzc2FnZVtdKSB7XG4gICAgdGhpcy5fbWVzc2FnZXMgPSBtZXNzYWdlcztcbiAgICBkbyB7XG4gICAgICBjb25zdCBtc2cgPSB0aGlzLl9tZXNzYWdlcy5zaGlmdCgpITtcbiAgICAgIGNvbnN0IHsgbWVzc2FnZVR5cGUsIGNvbnRlbnQ6IHsgY2FsbElkIH0gfSA9IG1zZztcbiAgICAgIHN3aXRjaCAobWVzc2FnZVR5cGUpIHtcbiAgICAgICAgY2FzZSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0ludml0ZTpcbiAgICAgICAgICB0aGlzLl9kb0ludml0ZShtc2cpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDUmluZ2luZzpcbiAgICAgICAgICB0aGlzLl9kb1JpbmdpbmcobXNnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0FjY2VwdDpcbiAgICAgICAgICB0aGlzLl9kb0FjY2VwdChtc2cpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDTW9kaWZ5TWVtOlxuICAgICAgICAgIHRoaXMuX2RvTWVtYmVyTW9kaWZ5KG1zZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUkNDYWxsTWVzc2FnZVR5cGUuVkNNb2RpZnlNZWRpYTpcbiAgICAgICAgICB0aGlzLl9kb01lZGlhTW9kaWZ5KG1zZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUkNDYWxsTWVzc2FnZVR5cGUuVkNIYW5ndXA6XG4gICAgICAgICAgdGhpcy5fZG9IdW5ndXAobXNnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW09mZmxpbmVSZWNvcmRlcl0gb25SZWN2T2ZmbGluZU1zZ3MgLT4gdW5leHBlY3RlZCBtZXNzYWdlOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSB3aGlsZSAodGhpcy5fbWVzc2FnZXMubGVuZ3RoID4gMCk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIENvbnZlcnNhdGlvblR5cGUsIEVycm9yQ29kZSwgRXZlbnRFbWl0dGVyLCBJTG9nZ2VyLCBJUHVzaENvbmZpZywgSVJlY2VpdmVkTWVzc2FnZSwgSVJ1bnRpbWUsIElTZW5kTXNnT3B0aW9ucywgUlRDUGx1Z2luQ29udGV4dCxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgTWVtYmVyTW9kaWZ5VHlwZSB9IGZyb20gJy4vZW51bXMvTWVtYmVyTW9kaWZ5VHlwZSc7XG5pbXBvcnQgeyBSQ0NhbGxFcnJvckNvZGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbENvZGUnO1xuaW1wb3J0IHsgUkNDYWxsTWVzc2FnZVR5cGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbE1lc3NhZ2VUeXBlJztcbmltcG9ydCB7IElVc2VyUHJvZmlsZSB9IGZyb20gJy4vaW50ZXJmYWNlcy9JU3RhdGVNYWNoaW5lJztcbmltcG9ydCB7XG4gIElBY2NlcHRNc2dDb250ZW50LCBJQWNjZXB0TXNnT3B0aW9ucywgSUNhbGxNc2dPcHRpb24sIElIdW5ndXBNc2dDb250ZW50LCBJSHVuZ3VwTXNnT3B0aW9ucyxcbiAgSUludml0ZU1zZ0NvbnRlbnQsIElJbnZpdGVNc2dPcHRpb25zLCBJTWVkaWFNb2RpZnlNc2dDb250ZW50LCBJTWVkaWFNb2RpZnlNc2dPcHRpb25zLCBJTWVtYmVyTW9kaWZ5TXNnQ29udGVudCxcbiAgSU1lbWJlck1vZGlmeU1zZ09wdGlvbnMsIElNc2dMaXN0ZW5lciwgSVJpbmdpbmdNc2dDb250ZW50LCBJUmluZ2luZ01zZ09wdGlvbnMsXG59IGZyb20gJy4vaW50ZXJmYWNlcy9JTWVzc2FnZUhhbmRsZXInO1xuaW1wb3J0IHsgUGxhdGZvcm0gfSBmcm9tICcuL2VudW1zL1BsYXRmb3JtJztcbmltcG9ydCB7IGdldENhbGxEZXZpY2VJZCB9IGZyb20gJy4uL2hlbHBlcic7XG5pbXBvcnQgeyBJT2ZmbGluZVJlY29yZCwgT2ZmbGluZVJlY29yZGVyIH0gZnJvbSAnLi9PZmZsaW5lUmVjb3JkZXInO1xuaW1wb3J0IHsgUkNDYWxsU3RhdGVNYWNoaW5lIH0gZnJvbSAnLi4nO1xuXG5jb25zdCBjYWxsTXNnVHlwZXMgPSBbJ1JDOlZDQWNjZXB0JywgJ1JDOlZDUmluZ2luZycsICdSQzpWQ1N1bW1hcnknLCAnUkM6VkNIYW5ndXAnLCAnUkM6VkNJbnZpdGUnLCAnUkM6VkNNb2RpZnlNZWRpYScsICdSQzpWQ01vZGlmeU1lbSddO1xuXG50eXBlIE1zZ0xpc3RlbmVyS2V5cyA9IGtleW9mIElNc2dMaXN0ZW5lclxuXG5pbnRlcmZhY2UgSU1zZ0J1ZmZlckl0ZW0ge1xuICBtYXJrVGltZTogbnVtYmVyLFxuICBtc2c6IElSZWNlaXZlZE1lc3NhZ2Vcbn1cblxuY29uc3QgRW5naW5lRXJyb3JDb2RlVG9DYWxsRXJyb3JDb2RlOiB7IFtrZXk6IG51bWJlcl06IFJDQ2FsbEVycm9yQ29kZSB9ID0ge1xuICBbRXJyb3JDb2RlLlJFSkVDVEVEX0JZX0JMQUNLTElTVF06IFJDQ2FsbEVycm9yQ29kZS5SRUpFQ1RFRF9CWV9CTEFDS0xJU1QsXG4gIFtFcnJvckNvZGUuTk9UX0lOX0dST1VQXTogUkNDYWxsRXJyb3JDb2RlLk5PVF9JTl9HUk9VUCxcbn07XG5cbi8qKlxuICog5raI5oGv5o6l5pS25aSE55CGOiDlnKjnur/mtojmga/jgIHnprvnur/mtojmga9cbiAqIOWPkemAgea2iOaBr+WkhOeQhjog5Y+R6YCB5LiN5ZCM57G75Z6L5raI5oGv5bCB6KOFXG4gKi9cbmV4cG9ydCBjbGFzcyBDYWxsTWVzc2FnZUhhbmRsZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICBwcml2YXRlIF93YXRjaGVyczogSU1zZ0xpc3RlbmVyID0ge31cblxuICBwcml2YXRlIF91c2VySW5mbzogSVVzZXJQcm9maWxlID0ge31cblxuICBwcml2YXRlIF9tc2dCdWZmZXJMaXN0OiBJTXNnQnVmZmVySXRlbVtdID0gW11cblxuICBwcml2YXRlIF9oYWRIYW5kbGVNc2dUaW1lcjogYm9vbGVhbiA9IGZhbHNlXG5cbiAgcHJpdmF0ZSBfb2ZmbGluZVJlY29yZGVyITogT2ZmbGluZVJlY29yZGVyXG5cbiAgcHJpdmF0ZSBfZGV2aWNlSWQ6IHN0cmluZyA9ICcnXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29udGV4dDogUlRDUGx1Z2luQ29udGV4dCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9ydW50aW1lOiBJUnVudGltZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IElMb2dnZXIsXG4gICAgLyoqXG4gICAgICog56a757q/5raI5oGv5aSE55CG5pe26Ze06Ze06ZqUXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfb2ZmbGluZU1zZ0l0djogbnVtYmVyID0gNjAgKiAxMDAwLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2dldFN0YXRlTWFjaGluZTogKGNhbGxJZDogc3RyaW5nKSA9PiBSQ0NhbGxTdGF0ZU1hY2hpbmUgfCBudWxsLFxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIC8vIGRldmljZUlkXG4gICAgdGhpcy5fZGV2aWNlSWQgPSBnZXRDYWxsRGV2aWNlSWQoX3J1bnRpbWUpO1xuICAgIC8vIOWkhOeQhua2iOaBr+aUtuWPkVxuICAgIHRoaXMuX2NvbnRleHQub25tZXNzYWdlID0gdGhpcy5fb25NZXNzYWdlLmJpbmQodGhpcyk7XG4gICAgLy8g5aSE55CG56a757q/5raI5oGv6K6w5b2VXG4gICAgdGhpcy5fb2ZmbGluZVJlY29yZGVyID0gbmV3IE9mZmxpbmVSZWNvcmRlcih0aGlzLl9jb250ZXh0LCB0aGlzLl9sb2dnZXIsIChyZWNvcmQ6IElPZmZsaW5lUmVjb3JkKSA9PiB7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbQ2FsbE1lc3NhZ2VIYW5kbGVyXSBvZmZsaW5lUmVjb3JkZXIgLT4gJHtKU09OLnN0cmluZ2lmeShyZWNvcmQpfWApO1xuICAgICAgdGhpcy5fd2F0Y2hlcnMub25PZmZsaW5lUmVjb3JkICYmIHRoaXMuX3dhdGNoZXJzLm9uT2ZmbGluZVJlY29yZChyZWNvcmQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25NZXNzYWdlKG1lc3NhZ2U6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICBjb25zdCBpc0NhbGxNc2cgPSBjYWxsTXNnVHlwZXMuaW5jbHVkZXMobWVzc2FnZS5tZXNzYWdlVHlwZSk7XG4gICAgaWYgKGlzQ2FsbE1zZykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYFtDYWxsTWVzc2FnZUhhbmRsZXJdIF9vbk1lc3NhZ2UgLT4gY2FsbCBtZXNzYWdlOiAke0pTT04uc3RyaW5naWZ5KG1lc3NhZ2UpfWApO1xuICAgICAgLy8g6YCa6L+H6YGN5Y6GIGJ1ZmZlckxpc3Qg5p+l5om+6KaB5o+S5YWl55qE6IqC54K5XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBtYXJrVGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIGNvbnN0IHsgc2VudFRpbWU6IGN1cnJlbnRNc2dTZW50VGltZSB9ID0gbWVzc2FnZTtcbiAgICAgICAgbGV0IGluc2VydEluZGV4ID0gMDtcbiAgICAgICAgLy8g6ZyA6YGN5Y6G5pWw57uE5YWo6YOo6aG577yM5pWF5L2/55SoIGZvckVhY2gsIGZpbmRJbmRleCDmib7liLDnrKzkuIDkuKrnrKblkIjmnaHku7bnmoTlsLHkvJrnu4jmraJcbiAgICAgICAgdGhpcy5fbXNnQnVmZmVyTGlzdC5mb3JFYWNoKCh7IG1zZzogeyBzZW50VGltZSB9IH0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgaWYgKGN1cnJlbnRNc2dTZW50VGltZSA+PSBzZW50VGltZSkge1xuICAgICAgICAgICAgLy8gaW5zZXJ0SW5kZXgg6ZyA5Li65b2T5YmN56ym5ZCI5p2h5Lu25YWD57Sg55qE5ZCO5LiA5L2N77yM5pWFICsxXG4gICAgICAgICAgICBpbnNlcnRJbmRleCA9IGluZGV4ICsgMTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9tc2dCdWZmZXJMaXN0LnNwbGljZShpbnNlcnRJbmRleCwgMCwge1xuICAgICAgICAgIG1hcmtUaW1lLFxuICAgICAgICAgIG1zZzogbWVzc2FnZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdfJywgYG9uTWVzc2FnZSAtPiBtc2dCdWZmZXJMaXN0OiAke3RoaXMuX21zZ0J1ZmZlckxpc3QubGVuZ3RofWApO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtDYWxsTWVzc2FnZUhhbmRsZXJdIHNwbGljZSBidWZmZXIgbXNnIGVycm9yIC0+ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgICAgLy8g5ZCv5Yqo5raI5oGv5aSE55CGXG4gICAgICB0aGlzLl9oYW5kbGVCdWZmZXJNc2dzKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIOWcqOe6v+a2iOaBr+aKm+e7meeKtuaAgeacuuWkhOeQhlxuICAgKi9cbiAgcHJpdmF0ZSBfb25SZWN2T25saW5lQ2FsbE1zZyhtZXNzYWdlOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgb25NZXNzYWdlIC0+IF9vblJlY3ZPbmxpbmVDYWxsTXNnOiAke21lc3NhZ2UubWVzc2FnZVR5cGV9YCk7XG4gICAgY29uc3QgeyBjb250ZW50OiB7IGNhbGxJZCB9IH0gPSBtZXNzYWdlO1xuICAgIC8vIOWcqOe6v+a2iOaBr+ebtOaOpeaKm+WHulxuICAgIHN3aXRjaCAobWVzc2FnZS5tZXNzYWdlVHlwZSkge1xuICAgICAgY2FzZSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0ludml0ZTpcbiAgICAgICAgdGhpcy5fd2F0Y2hlcnMub25JbnZpdGUgJiYgdGhpcy5fd2F0Y2hlcnMub25JbnZpdGUobWVzc2FnZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ1Jpbmdpbmc6XG4gICAgICAgIHN1cGVyLmVtaXQoYCR7Y2FsbElkfW9uUmluZ2luZ2AsIG1lc3NhZ2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUkNDYWxsTWVzc2FnZVR5cGUuVkNBY2NlcHQ6XG4gICAgICAgIHN1cGVyLmVtaXQoYCR7Y2FsbElkfW9uQWNjZXB0YCwgbWVzc2FnZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ01vZGlmeU1lbTpcbiAgICAgICAgLy8g5pS25Yiw5Lq65ZGY5Y+Y5pu05oqb5Ye6IG9uSW52aXRlIOeUn+aIkOeKtuaAgeacuuWunuS+i1xuICAgICAgICB0aGlzLl93YXRjaGVycy5vbkludml0ZSAmJiB0aGlzLl93YXRjaGVycy5vbkludml0ZShtZXNzYWdlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDTW9kaWZ5TWVkaWE6XG4gICAgICAgIHN1cGVyLmVtaXQoYCR7Y2FsbElkfW9uTWVkaWFNb2RpZnlgLCBtZXNzYWdlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDSGFuZ3VwOlxuICAgICAgICBzdXBlci5lbWl0KGAke2NhbGxJZH1vbkh1bmd1cGAsIG1lc3NhZ2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdfJywgYFtDYWxsTWVzc2FnZUhhbmRsZXJdIG9uUmVjdk9ubGluZUNhbGxNc2cgLT4gdW5leHBlY3RlZCBtZXNzYWdlOiAke0pTT04uc3RyaW5naWZ5KG1lc3NhZ2UpfWApO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5raI5oGvIGJ1ZmZlciDliJfooajlpITnkIbpgLvovpFcbiAgICogMeOAgeavjyAyMG1zIOajgOafpeS4gOasoSBidWZmZXIgbGlzdFxuICAgKiAy44CB5Y+W5Ye65bey57uP5bu26L+fIDIwMCDnmoTmtojmga/liJfooajov5vooYzmtojotLkgfCDml6Dlu7bov58gMjAwbXMg5YaF5raI5oGv55u05o6l6YCS5b2SXG4gICAqIDPjgIHmtojotLnliIbkuLog56a757q/5raI5oGv5raI6LS56YC76L6R44CB5Zyo57q/5raI5oGv5raI6LS56YC76L6R77yM5raI6LS55ZCO6YCS5b2SXG4gICovXG4gIHByaXZhdGUgX2hhbmRsZUJ1ZmZlck1zZ3MoKSB7XG4gICAgLy8g5raI5oGvIGJ1ZmZlciDliJfooajplb/luqbkuLogMCDml7bliqDplIFcbiAgICBpZiAodGhpcy5fbXNnQnVmZmVyTGlzdC5sZW5ndGggPT09IDAgfHwgdGhpcy5faGFkSGFuZGxlTXNnVGltZXIpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdfJywgJ19oYW5kbGVCdWZmZXJNc2dzIHJldHVybicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyDpnIDopoHliqDplIHvvIzmlLbliLDlpJrmrKHmtojmga/lkI7vvIzlj6/og73kvJrotbflpJrkuKogdGltZXJcbiAgICB0aGlzLl9oYWRIYW5kbGVNc2dUaW1lciA9IHRydWU7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAvLyDlj5blh7rlpKfkuo4gMjAwIG1zIOa2iOaBr+WIl+ihqFxuICAgICAgY29uc3QgY3VycmVudFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgYnVmZmVycyA9IHRoaXMuX21zZ0J1ZmZlckxpc3QuZmlsdGVyKChpdGVtKSA9PiBjdXJyZW50VGltZSAtIGl0ZW0ubWFya1RpbWUgPj0gMjAwKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbQ2FsbE1lc3NhZ2VIYW5kbGVyXSBoYW5kbGVCdWZmZXJNc2dzIC0+IGxpc3RzIG92ZXIgMjAwbXMgOiAke0pTT04uc3RyaW5naWZ5KGJ1ZmZlcnMubWFwKCh7IG1zZzogeyBtZXNzYWdlVUlkLCBpc09mZkxpbmVNZXNzYWdlLCBjb250ZW50OiB7IGNhbGxJZCB9IH0gfSkgPT4gKHsgbWVzc2FnZVVJZCwgaXNPZmZMaW5lTWVzc2FnZSwgY2FsbElkIH0pKSl9YCk7XG4gICAgICBpZiAoYnVmZmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8g5rKh5pyJ5bu26L+fIDIwMG1zIOeahOa2iOaBr++8jOa2iOi0uemAu+i+keino+mUgeW5tumAkuW9kuaJp+ihjFxuICAgICAgICB0aGlzLl9oYWRIYW5kbGVNc2dUaW1lciA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9oYW5kbGVCdWZmZXJNc2dzKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGJ1ZmZlcnNbMF0ubXNnLmlzT2ZmTGluZU1lc3NhZ2UpIHtcbiAgICAgICAgLy8g5b2T56ys5LiA5p2h5raI5oGv5Li656a757q/5raI5oGv5pe277yM55u05o6l5LuOIGJ1ZmZlciDkuK3lj5blh7rmiYDmnInnprvnur/mtojmga/vvIzov5vooYzmtojmga9cbiAgICAgICAgbGV0IG9mZmxpbmVCdWZmZXJzID0gdGhpcy5fbXNnQnVmZmVyTGlzdC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0ubXNnLmlzT2ZmTGluZU1lc3NhZ2UpO1xuXG4gICAgICAgIC8vIOemu+e6v+a2iOaBr+WkhOeQhumAu+i+kVxuICAgICAgICBkbyB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgY29udmVyc2F0aW9uVHlwZSwgbWVzc2FnZVR5cGUsIHNlbnRUaW1lLCBzZW5kZXJVc2VySWQsIGNvbnRlbnQ6IHsgY2FsbElkOiBpbnZpdGVDYWxsSWQsIGludml0ZVVzZXJJZHMgfSxcbiAgICAgICAgICB9ID0gb2ZmbGluZUJ1ZmZlcnNbMF0ubXNnO1xuXG4gICAgICAgICAgY29uc3QgaXNJbnZpdGVNc2dUeXBlID0gW1JDQ2FsbE1lc3NhZ2VUeXBlLlZDSW52aXRlLCBSQ0NhbGxNZXNzYWdlVHlwZS5WQ01vZGlmeU1lbV0uaW5jbHVkZXMobWVzc2FnZVR5cGUgYXMgUkNDYWxsTWVzc2FnZVR5cGUpO1xuXG4gICAgICAgICAgLy8g6K6h566X5b2T5YmN5pe26Ze05LiO5raI5oGv5Y+R6YCB5pe26Ze05beuXG4gICAgICAgICAgY29uc3QgZGVsYXlUaW1lID0gdGhpcy5fY29udGV4dC5nZXRTZXJ2ZXJUaW1lKCkgLSBzZW50VGltZTtcbiAgICAgICAgICBjb25zdCBpc0xlc3NUaGFuT2ZmbGluZU1zZ0l0diA9IGRlbGF5VGltZSA8IHRoaXMuX29mZmxpbmVNc2dJdHY7XG5cbiAgICAgICAgICBpZiAoIWlzTGVzc1RoYW5PZmZsaW5lTXNnSXR2KSB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIud2FybignXycsIGBvZmZsaW5lIG1zZyBkZWxheVRpbWU6ICR7ZGVsYXlUaW1lfW1zYCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGlzSW52aXRlTXNnVHlwZSkgeyAvLyDlj5blh7rnmoTnrKzkuIDmnaHmtojmga/kuLogaW52aXRlIHwgbWVtTW9kaWZ5XG4gICAgICAgICAgICAvLyDlj5blh7rnm7jlkIwgQ2FsbElkIOa2iOaBr+WIl+ihqFxuICAgICAgICAgICAgY29uc3QgdGFza01zZ0xpc3Q6IElSZWNlaXZlZE1lc3NhZ2VbXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvZmZsaW5lQnVmZmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBjb25zdCBpdGVtID0gb2ZmbGluZUJ1ZmZlcnNbaV0ubXNnO1xuICAgICAgICAgICAgICBjb25zdCB7IGNvbnRlbnQ6IHsgY2FsbElkOiBvdGhlckNhbGxJZCB9IH0gPSBpdGVtO1xuICAgICAgICAgICAgICBpZiAoaW52aXRlQ2FsbElkID09PSBvdGhlckNhbGxJZCkge1xuICAgICAgICAgICAgICAgIHRhc2tNc2dMaXN0LnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdfJywgYHRhc2tNc2dMaXN0IGxlbmd0aDogJHt0YXNrTXNnTGlzdC5sZW5ndGh9YCk7XG5cbiAgICAgICAgICAgIGlmICh0YXNrTXNnTGlzdC5sZW5ndGggPiAwKSB7IC8vIOmYsuatoiB0YXNrTXNnTGlzdCDkuLogMFxuICAgICAgICAgICAgICAvLyDmib7lh7ogbXNnQnVmZmVyTGlzdCDkuK3lt7LmtojotLnnmoTmtojmga/mnIDlpKcgaW5kZXhcbiAgICAgICAgICAgICAgY29uc3QgZGVsSW5kZXggPSB0aGlzLl9tc2dCdWZmZXJMaXN0LmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbS5tc2cubWVzc2FnZVVJZCA9PT0gdGFza01zZ0xpc3RbdGFza01zZ0xpc3QubGVuZ3RoIC0gMV0ubWVzc2FnZVVJZCk7XG4gICAgICAgICAgICAgIC8vIOWIoOmZpOa2iOi0uei/hyBtc2dCdWZmZXJMaXN0IOeahOa2iOaBr1xuICAgICAgICAgICAgICB0aGlzLl9tc2dCdWZmZXJMaXN0ID0gdGhpcy5fbXNnQnVmZmVyTGlzdC5zbGljZShkZWxJbmRleCArIDEpO1xuXG4gICAgICAgICAgICAgIC8vIOaJvuWHuiBvZmZsaW5lTXNncyDkuK3lt7LmtojotLnnmoTmtojmga/mnIDlpKcgaW5kZXhcbiAgICAgICAgICAgICAgY29uc3QgZGVsT2ZmbGluZUluZGV4ID0gb2ZmbGluZUJ1ZmZlcnMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLm1zZy5tZXNzYWdlVUlkID09PSB0YXNrTXNnTGlzdFt0YXNrTXNnTGlzdC5sZW5ndGggLSAxXS5tZXNzYWdlVUlkKTtcbiAgICAgICAgICAgICAgLy8g5Yig6Zmk5raI6LS56L+HIG9mZmxpbmVCdWZmZXJzIOeahOa2iOaBr1xuICAgICAgICAgICAgICBvZmZsaW5lQnVmZmVycyA9IG9mZmxpbmVCdWZmZXJzLnNsaWNlKGRlbE9mZmxpbmVJbmRleCArIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiDljZXogYrmnKrnu5PmnZ/pgJror53liKTmlq1cbiAgICAgICAgICAgICAqIOWmguaenOa2iOaBr+WcqCA2MHMg5YaF77yM5Yik5pat5piv5ZCm5pyq5oiQ5a+577yI5Y+q5pyJIGludml0ZSDmiJblj6rmnIkgaW52aXRlIOaIliByaW5naW5nIOaIkOWvueaKm+e7mSDnprvnur/orrDlvZXlmajvvIzmnKrmiJDlr7nmipvnu5nnirbmgIHmnLpcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgY29uc3QgaXNVbmZpbmlzaGVkUHJpdmF0ZUNhbGw6IGJvb2xlYW4gPSAoKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoY29udmVyc2F0aW9uVHlwZSAhPT0gQ29udmVyc2F0aW9uVHlwZS5QUklWQVRFKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIGNvbnN0IGlzT25seUludml0ZSA9IHRhc2tNc2dMaXN0Lmxlbmd0aCA9PT0gMTtcbiAgICAgICAgICAgICAgY29uc3QgaGFzSW52aXRlQW5kUmluZ2luZyA9IHRhc2tNc2dMaXN0LmV2ZXJ5KChpdGVtKSA9PiBbUkNDYWxsTWVzc2FnZVR5cGUuVkNJbnZpdGUsIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDTW9kaWZ5TWVkaWEsIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDUmluZ2luZ10uaW5jbHVkZXMoaXRlbS5tZXNzYWdlVHlwZSBhcyBSQ0NhbGxNZXNzYWdlVHlwZSkpO1xuICAgICAgICAgICAgICByZXR1cm4gaXNPbmx5SW52aXRlIHx8IGhhc0ludml0ZUFuZFJpbmdpbmc7XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiDnvqTogYrmnKrnu5PmnZ/pgJror53liKTmlq1cbiAgICAgICAgICAgICAqIOmAmui/hyBsaXN0IOS4rSBpbnZpdGUg5ZKMIG1lbWJlck1vZGlmeSDmtojmga/kuK3lj5blh7rmiYDmnInlj4LkuI7pgJror53nmoQgdXNlcklkXG4gICAgICAgICAgICAgKiDpgY3ljoYgbGlzdCDmib7lh7rmiYDmnIkgaGFuZ3VwIOeahCBzZW5kVXNlcklkXG4gICAgICAgICAgICAgKiAgICAg5oC75Lq65pWwIC0g5oyC5pat5Lq65pWwID4gMSAg5LiU5Ymp5L2Z5Lq65pWw5YyF5ZCr6Ieq5bex77yM6K6k5Li66YCa6K+d5pyq5oyC5pat6L+b54q25oCB5py6XG4gICAgICAgICAgICAgKiAgICAg5oC75Lq65pWwIC0g5oyC5pat5Lq65pWwIDw9IDEg6YCa6K+d5oyC5pat77yM6L+b56a757q/5raI5oGv5aSE55CG5ZmoXG4gICAgICAgICAgICAgKiAgICAg5Li75Y+r55u05o6l5oyC5pat5LiU5YW25LuW5Lq65pyq5o6l5ZCs55u05o6l6L+b56a757q/5aSE55CG5ZmoXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGNvbnN0IGlzVW5maW5pc2hlZEdycENhbGw6IGJvb2xlYW4gPSAoKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoY29udmVyc2F0aW9uVHlwZSAhPT0gQ29udmVyc2F0aW9uVHlwZS5HUk9VUCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICBsZXQgaXNVbmZpbmlzaGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgIGxldCBub09uZUFjY2VwdCA9IHRydWU7XG4gICAgICAgICAgICAgIGxldCBhbGxVc2VySWRzID0gW3NlbmRlclVzZXJJZCwgLi4uaW52aXRlVXNlcklkc107XG4gICAgICAgICAgICAgIGxldCBpc0NhbGxlckh1bmd1cCA9IGZhbHNlO1xuICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhc2tNc2dMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBzZW5kZXJVc2VySWQ6IHRhc2tNc2dTZW5kZXJVc2VySWQsIG1lc3NhZ2VUeXBlIH0gPSB0YXNrTXNnTGlzdFtpXTtcbiAgICAgICAgICAgICAgICAvLyDlj6ropoHoh6rlt7HmjILmlq3nm7TmjqXot7Plh7rlvqrnjq/vvIzov5vnprvnur/mtojmga9cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZVR5cGUgPT09IFJDQ2FsbE1lc3NhZ2VUeXBlLlZDSGFuZ3VwICYmIHRhc2tNc2dTZW5kZXJVc2VySWQgPT09IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCkpIHtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyDmib7lh7rmiYDmnInmjILmlq3nmoTkurrlkZjvvIzku6Xlj4rpgJror53lj5HotbfogIXmmK/lkKbmjILmlq1cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZVR5cGUgPT09IFJDQ2FsbE1lc3NhZ2VUeXBlLlZDSGFuZ3VwKSB7XG4gICAgICAgICAgICAgICAgICBpc0NhbGxlckh1bmd1cCA9IHNlbmRlclVzZXJJZCA9PT0gdGFza01zZ1NlbmRlclVzZXJJZDtcbiAgICAgICAgICAgICAgICAgIGFsbFVzZXJJZHMgPSBhbGxVc2VySWRzLmZpbHRlcigoaWQpID0+IHRhc2tNc2dTZW5kZXJVc2VySWQgIT09IGlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8g5Yik5pat5piv5ZCm5peg5Lq65o6l5ZCsXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VUeXBlID09PSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0FjY2VwdCkge1xuICAgICAgICAgICAgICAgICAgbm9PbmVBY2NlcHQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8g5LiN5piv5Li75Y+r5oyC5pat5LiU5peg5Lq65o6l5ZCs77yM5LiU5Ymp5L2Z5Lq65pWw5aSn5LqOIDFcbiAgICAgICAgICAgICAgaWYgKCEobm9PbmVBY2NlcHQgJiYgaXNDYWxsZXJIdW5ndXApICYmIGFsbFVzZXJJZHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIGlzVW5maW5pc2hlZCA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGlzVW5maW5pc2hlZDtcbiAgICAgICAgICAgIH0pKCk7XG5cbiAgICAgICAgICAgIGlmIChpc0xlc3NUaGFuT2ZmbGluZU1zZ0l0diAmJiAoaXNVbmZpbmlzaGVkUHJpdmF0ZUNhbGwgfHwgaXNVbmZpbmlzaGVkR3JwQ2FsbCkpIHtcbiAgICAgICAgICAgICAgdGFza01zZ0xpc3QuZm9yRWFjaCh0aGlzLl9vblJlY3ZPbmxpbmVDYWxsTXNnLCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX29mZmxpbmVSZWNvcmRlci5vblJlY3ZPZmZsaW5lTXNncyh0YXNrTXNnTGlzdCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChpc0xlc3NUaGFuT2ZmbGluZU1zZ0l0diAmJiB0aGlzLl9nZXRTdGF0ZU1hY2hpbmUoaW52aXRlQ2FsbElkKSkge1xuICAgICAgICAgICAgICB0aGlzLl9vblJlY3ZPbmxpbmVDYWxsTXNnKG9mZmxpbmVCdWZmZXJzWzBdLm1zZyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW0NhbGxNZXNzYWdlSGFuZGxlcl0gdW5leGNlcHRlZCBvZmZsaW5lIG1zZyAtPiAke0pTT04uc3RyaW5naWZ5KG9mZmxpbmVCdWZmZXJzWzBdLm1zZyl9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmZsaW5lQnVmZmVycy5zaGlmdCgpO1xuICAgICAgICAgICAgdGhpcy5fbXNnQnVmZmVyTGlzdC5zaGlmdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAob2ZmbGluZUJ1ZmZlcnMubGVuZ3RoID4gMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDlnKjnur/mtojmga/lpITnkIbpgLvovpFcbiAgICAgICAgYnVmZmVycy5mb3JFYWNoKCh7IG1zZyB9KSA9PiB7XG4gICAgICAgICAgdGhpcy5fb25SZWN2T25saW5lQ2FsbE1zZyhtc2chKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIOaJvuWHuiBtc2dCdWZmZXJMaXN0IOS4reW3sua2iOi0ueeahOa2iOaBr+acgOWkpyBpbmRleFxuICAgICAgICBjb25zdCBkZWxDb3VudCA9IGJ1ZmZlcnMubGVuZ3RoO1xuICAgICAgICAvLyDliKDpmaTmtojotLnov4fnmoTmtojmga9cbiAgICAgICAgdGhpcy5fbXNnQnVmZmVyTGlzdC5zcGxpY2UoMCwgZGVsQ291bnQpO1xuICAgICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgdGltZXIgb25saW5lIG1zZyBoYW5kbGUgLT4gZGVsQ291bnQ6ICR7ZGVsQ291bnR9IG1zZ0J1ZmZlckxpc3Q6ICR7dGhpcy5fbXNnQnVmZmVyTGlzdC5sZW5ndGh9YCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9oYWRIYW5kbGVNc2dUaW1lciA9IGZhbHNlO1xuICAgICAgdGhpcy5faGFuZGxlQnVmZmVyTXNncygpO1xuICAgIH0sIDIwKTtcbiAgfVxuXG4gIHJlZ2lzdGVyRXZlbnRMaXN0ZW5lcihsaXN0ZW5lcjogSU1zZ0xpc3RlbmVyKSB7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLl93YXRjaGVycywgbGlzdGVuZXIpO1xuICB9XG5cbiAgcmVnaXN0ZXJTdGF0ZU1hY2hpbmVFdmVudChjYWxsSWQ6IHN0cmluZywgZnVuY05hbWU6IE1zZ0xpc3RlbmVyS2V5cywgZXZlbnQ6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgIGNvbnN0IGV2ZW50VHlwZSA9IGNhbGxJZCArIGZ1bmNOYW1lO1xuICAgIHN1cGVyLm9uKGV2ZW50VHlwZSwgZXZlbnQpO1xuICB9XG5cbiAgdW5yZWdpc3RlclN0YXRlTWFjaGluZUV2ZW50KGNhbGxJZDogc3RyaW5nKSB7XG4gICAgWydvblJpbmdpbmcnLCAnb25BY2NlcHQnLCAnb25IdW5ndXAnLCAnb25NZWRpYU1vZGlmeSddLmZvckVhY2goKGZ1bmNOYW1lKSA9PiB7XG4gICAgICBjb25zdCBldmVudFR5cGUgPSBjYWxsSWQgKyBmdW5jTmFtZTtcbiAgICAgIHN1cGVyLnJlbW92ZUFsbChldmVudFR5cGUpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVnaXN0ZXJVc2VySW5mbyh1c2VySW5mbzogSVVzZXJQcm9maWxlKSB7XG4gICAgdGhpcy5fdXNlckluZm8gPSB1c2VySW5mbztcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5HpgIEgSU0g5raI5oGvXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9zZW5kQ2FsbE1lc3NhZ2Uob3B0aW9uczogSUNhbGxNc2dPcHRpb24pOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLCBtZXNzYWdlPzogSVJlY2VpdmVkTWVzc2FnZSB9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYENhbGxNZXNzYWdlSGFuZGxlcl0gc2VuZENhbGxNZXNhZ2UgLT4gbWVzc2FnZTogJHtKU09OLnN0cmluZ2lmeShvcHRpb25zKX1gKTtcbiAgICBjb25zdCB7XG4gICAgICBjaGFubmVsSWQsIGNvbnZlcnNhdGlvblR5cGUsIHRhcmdldElkLCBjb250ZW50LCBtZXNzYWdlVHlwZSwgZGlyZWN0aW9uYWxVc2VySWRMaXN0LCBwdXNoVGl0bGUsIHB1c2hEYXRhLCBwdXNoQ29udGVudCxcbiAgICB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBzZW5kT3B0czogSVNlbmRNc2dPcHRpb25zID0ge1xuICAgICAgY2hhbm5lbElkLFxuICAgICAgbWVzc2FnZVR5cGUsXG4gICAgICBjb250ZW50LFxuICAgICAgZGlyZWN0aW9uYWxVc2VySWRMaXN0LFxuICAgIH07XG5cbiAgICBpZiAoW1JDQ2FsbE1lc3NhZ2VUeXBlLlZDSW52aXRlLCBSQ0NhbGxNZXNzYWdlVHlwZS5WQ01vZGlmeU1lbSwgUkNDYWxsTWVzc2FnZVR5cGUuVkNIYW5ndXBdLmluY2x1ZGVzKG1lc3NhZ2VUeXBlKSkge1xuICAgICAgY29uc3QgcHVzaENvbmlmZzogSVB1c2hDb25maWcgPSB7XG4gICAgICAgIHB1c2hUaXRsZTogcHVzaFRpdGxlIHx8ICcnLFxuICAgICAgICBwdXNoQ29udGVudDogcHVzaENvbnRlbnQgfHwgJycsXG4gICAgICAgIHB1c2hEYXRhOiBwdXNoRGF0YSB8fCAnJyxcbiAgICAgICAgYW5kcm9pZENvbmZpZzoge1xuICAgICAgICAgIGNhdGVnb3J5SFc6ICdWT0lQJyxcbiAgICAgICAgICBjYXRlZ29yeVZpdm86ICdJTScsXG4gICAgICAgIH0sXG4gICAgICAgIGlPU0NvbmZpZzoge1xuICAgICAgICAgIGFwbnNDb2xsYXBzZUlkOiBjb250ZW50LmNhbGxJZCxcbiAgICAgICAgfSxcbiAgICAgICAgZGlzYWJsZVB1c2hUaXRsZTogZmFsc2UsXG4gICAgICAgIGZvcmNlU2hvd0RldGFpbENvbnRlbnQ6IGZhbHNlLFxuICAgICAgICB0ZW1wbGF0ZUlkOiAnJyxcbiAgICAgIH07XG4gICAgICBzZW5kT3B0cy5wdXNoQ29uZmlnID0gcHVzaENvbmlmZztcbiAgICB9XG4gICAgY29uc3QgeyBjb2RlLCBkYXRhOiBtZXNzYWdlIH0gPSBhd2FpdCB0aGlzLl9jb250ZXh0LnNlbmRNZXNzYWdlKGNvbnZlcnNhdGlvblR5cGUsIHRhcmdldElkLCBzZW5kT3B0cyk7XG4gICAgaWYgKGNvZGUgIT09IEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgQ2FsbE1lc3NhZ2VIYW5kbGVyXSBzZW5kQ2FsbE1lc2FnZSBlcnJvciAtPiBjb2RlOiAke2NvZGV9YCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2RlOiBFbmdpbmVFcnJvckNvZGVUb0NhbGxFcnJvckNvZGVbY29kZV0gfHwgUkNDYWxsRXJyb3JDb2RlLlNFTkRfTVNHX0VSUk9SLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MsIG1lc3NhZ2UgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5HpgIHpgoDor7fmtojmga9cbiAgICovXG4gIGFzeW5jIHNlbmRJbnZpdGUob3B0aW9uczogSUludml0ZU1zZ09wdGlvbnMpIHtcbiAgICBjb25zdCB7XG4gICAgICByb29tVHlwZSwgY2hhbm5lbElkLCBjb252ZXJzYXRpb25UeXBlLCB0YXJnZXRJZCwgY2FsbElkLCBtZWRpYVR5cGUsIGludml0ZVVzZXJJZHMsIGV4dHJhLCBwdXNoVGl0bGUsIHB1c2hDb250ZW50LFxuICAgIH0gPSBvcHRpb25zO1xuICAgIHRoaXMuX2xvZ2dlci53YXJuKCdfJywgJ0NhbGxNZXNzYWdlSGFuZGxlcl0gc2VuZENhbGxNZXNhZ2Ugc2VuZEludml0ZScsIEpTT04uc3RyaW5naWZ5KG9wdGlvbnMpKTtcbiAgICB0aGlzLl93YXRjaGVycy5zZW5kQWNjZXB0ICYmIHRoaXMuX3dhdGNoZXJzLnNlbmRBY2NlcHQoeyBjYWxsSWQgfSk7XG4gICAgY29uc3QgY29udGVudDogSUludml0ZU1zZ0NvbnRlbnQgPSB7XG4gICAgICBwbGF0Zm9ybTogUGxhdGZvcm0uV0VCLFxuICAgICAgZGV2aWNlSWQ6IHRoaXMuX2RldmljZUlkLFxuICAgICAgY2FsbElkLFxuICAgICAgcm9vbVR5cGUsXG4gICAgICBleHRyYSxcbiAgICAgIGVuZ2luZVR5cGU6IDQsXG4gICAgICBjaGFubmVsSW5mbzogeyBJZDogY2FsbElkLCBLZXk6ICcnIH0sXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICBpbnZpdGVVc2VySWRzLFxuICAgICAgb2JzZXJ2ZXJVc2VySWRzOiBbXSxcbiAgICAgIHVzZXI6IHRoaXMuX3VzZXJJbmZvLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsTWVzc2FnZSh7XG4gICAgICBjaGFubmVsSWQsXG4gICAgICBjb252ZXJzYXRpb25UeXBlLFxuICAgICAgdGFyZ2V0SWQsXG4gICAgICBjb250ZW50LFxuICAgICAgbWVzc2FnZVR5cGU6IFJDQ2FsbE1lc3NhZ2VUeXBlLlZDSW52aXRlLFxuICAgICAgZGlyZWN0aW9uYWxVc2VySWRMaXN0OiBjb252ZXJzYXRpb25UeXBlID09PSBDb252ZXJzYXRpb25UeXBlLkdST1VQID8gaW52aXRlVXNlcklkcyA6IFt0YXJnZXRJZF0sXG4gICAgICBwdXNoVGl0bGUsXG4gICAgICBwdXNoQ29udGVudCxcbiAgICAgIHB1c2hEYXRhOiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIG1lZGlhVHlwZSxcbiAgICAgICAgdXNlcklkTGlzdDogaW52aXRlVXNlcklkcyxcbiAgICAgICAgY2FsbElkLFxuICAgICAgfSksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5Y+R6YCB5Lq65ZGY5Y+Y5pu05raI5oGvXG4gICAqL1xuICBhc3luYyBzZW5kTWVtZWJlck1vZGlmeShvcHRpb25zOiBJTWVtYmVyTW9kaWZ5TXNnT3B0aW9ucykge1xuICAgIGNvbnN0IHtcbiAgICAgIGNoYW5uZWxJZCwgY29udmVyc2F0aW9uVHlwZSwgdGFyZ2V0SWQsIGNhbGxJZCwgbWVkaWFUeXBlLCBpbnZpdGVVc2VySWRzLCBjYWxsZXJJZCxcbiAgICAgIGV4aXN0ZWRVc2VyUG9maWxlcywgZGlyZWN0aW9uYWxVc2VySWRMaXN0LCBleHRyYSwgcHVzaFRpdGxlLCBwdXNoQ29udGVudCxcbiAgICB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBjb250ZW50OiBJTWVtYmVyTW9kaWZ5TXNnQ29udGVudCA9IHtcbiAgICAgIHBsYXRmb3JtOiBQbGF0Zm9ybS5XRUIsIC8vIFRPRE8g5LiOIElNIOS4gOiHtFxuICAgICAgZGV2aWNlSWQ6IHRoaXMuX2RldmljZUlkLFxuICAgICAgY2FsbElkLFxuICAgICAgZXh0cmEsXG4gICAgICBlbmdpbmVUeXBlOiA0LFxuICAgICAgY2hhbm5lbEluZm86IHsgSWQ6IGNhbGxJZCwgS2V5OiAnJyB9LFxuICAgICAgbWVkaWFUeXBlLFxuICAgICAgaW52aXRlVXNlcklkcyxcbiAgICAgIG9ic2VydmVyVXNlcklkczogW10sXG4gICAgICB1c2VyOiB0aGlzLl91c2VySW5mbyxcbiAgICAgIGNhbGxlcjogY2FsbGVySWQsXG4gICAgICBtb2RpZnlNZW1UeXBlOiBNZW1iZXJNb2RpZnlUeXBlLkFERCxcbiAgICAgIGV4aXN0ZWRVc2VyUG9maWxlcyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbE1lc3NhZ2Uoe1xuICAgICAgY2hhbm5lbElkLFxuICAgICAgY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkLFxuICAgICAgY29udGVudCxcbiAgICAgIG1lc3NhZ2VUeXBlOiBSQ0NhbGxNZXNzYWdlVHlwZS5WQ01vZGlmeU1lbSxcbiAgICAgIGRpcmVjdGlvbmFsVXNlcklkTGlzdCxcbiAgICAgIHB1c2hUaXRsZSxcbiAgICAgIHB1c2hDb250ZW50LFxuICAgICAgcHVzaERhdGE6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgbWVkaWFUeXBlLFxuICAgICAgICB1c2VySWRMaXN0OiBpbnZpdGVVc2VySWRzLFxuICAgICAgICBjYWxsSWQsXG4gICAgICB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5HpgIHlk43pk4Pmtojmga9cbiAgICovXG4gIHNlbmRSaW5naW5nKG9wdGlvbnM6IElSaW5naW5nTXNnT3B0aW9ucykge1xuICAgIGNvbnN0IHtcbiAgICAgIGNoYW5uZWxJZCwgY29udmVyc2F0aW9uVHlwZSwgdGFyZ2V0SWQsIGNhbGxJZCwgdXNlcklkcyxcbiAgICB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBjb250ZW50OiBJUmluZ2luZ01zZ0NvbnRlbnQgPSB7XG4gICAgICBwbGF0Zm9ybTogUGxhdGZvcm0uV0VCLFxuICAgICAgZGV2aWNlSWQ6IHRoaXMuX2RldmljZUlkLFxuICAgICAgY2FsbElkLFxuICAgICAgdXNlcjogdGhpcy5fdXNlckluZm8sXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxNZXNzYWdlKHtcbiAgICAgIGNoYW5uZWxJZCxcbiAgICAgIGNvbnZlcnNhdGlvblR5cGUsXG4gICAgICB0YXJnZXRJZCxcbiAgICAgIGNvbnRlbnQsXG4gICAgICBtZXNzYWdlVHlwZTogUkNDYWxsTWVzc2FnZVR5cGUuVkNSaW5naW5nLFxuICAgICAgZGlyZWN0aW9uYWxVc2VySWRMaXN0OiB1c2VySWRzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOWPkemAgeWQjOaEj+aOpeWQrOa2iOaBr1xuICAgKi9cbiAgc2VuZEFjY2VwdChvcHRpb25zOiBJQWNjZXB0TXNnT3B0aW9ucykge1xuICAgIGNvbnN0IHtcbiAgICAgIGNoYW5uZWxJZCwgY29udmVyc2F0aW9uVHlwZSwgdGFyZ2V0SWQsIGNhbGxJZCwgbWVkaWFUeXBlLCB1c2VySWRzLFxuICAgIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGNvbnRlbnQ6IElBY2NlcHRNc2dDb250ZW50ID0ge1xuICAgICAgcGxhdGZvcm06IFBsYXRmb3JtLldFQixcbiAgICAgIGRldmljZUlkOiB0aGlzLl9kZXZpY2VJZCxcbiAgICAgIGNhbGxJZCxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICAgIHVzZXI6IHRoaXMuX3VzZXJJbmZvLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsTWVzc2FnZSh7XG4gICAgICBjaGFubmVsSWQsXG4gICAgICBjb252ZXJzYXRpb25UeXBlLFxuICAgICAgdGFyZ2V0SWQsXG4gICAgICBjb250ZW50LFxuICAgICAgbWVzc2FnZVR5cGU6IFJDQ2FsbE1lc3NhZ2VUeXBlLlZDQWNjZXB0LFxuICAgICAgZGlyZWN0aW9uYWxVc2VySWRMaXN0OiB1c2VySWRzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOWPkemAgeaMguaWrea2iOaBr1xuICAgKi9cbiAgc2VuZEh1bmd1cChvcHRpb25zOiBJSHVuZ3VwTXNnT3B0aW9ucykge1xuICAgIGNvbnN0IHtcbiAgICAgIGNoYW5uZWxJZCwgY29udmVyc2F0aW9uVHlwZSwgdGFyZ2V0SWQsIGNhbGxJZCwgcmVhc29uLCB1c2VySWRzLCBwdXNoVGl0bGUsIHB1c2hDb250ZW50LFxuICAgIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGNvbnRlbnQ6IElIdW5ndXBNc2dDb250ZW50ID0ge1xuICAgICAgcGxhdGZvcm06IFBsYXRmb3JtLldFQixcbiAgICAgIGRldmljZUlkOiB0aGlzLl9kZXZpY2VJZCxcbiAgICAgIGNhbGxJZCxcbiAgICAgIHJlYXNvbixcbiAgICAgIHVzZXI6IHRoaXMuX3VzZXJJbmZvLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsTWVzc2FnZSh7XG4gICAgICBjaGFubmVsSWQsXG4gICAgICBjb252ZXJzYXRpb25UeXBlLFxuICAgICAgdGFyZ2V0SWQsXG4gICAgICBjb250ZW50LFxuICAgICAgbWVzc2FnZVR5cGU6IFJDQ2FsbE1lc3NhZ2VUeXBlLlZDSGFuZ3VwLFxuICAgICAgcHVzaFRpdGxlLFxuICAgICAgcHVzaENvbnRlbnQsXG4gICAgICBwdXNoRGF0YTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBjYWxsSWQsIHJlYXNvbixcbiAgICAgIH0pLFxuICAgICAgZGlyZWN0aW9uYWxVc2VySWRMaXN0OiB1c2VySWRzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOWPkemAgeWqkuS9k+WPmOabtOa2iOaBr1xuICAgKi9cbiAgc2VuZE1lZGlhTW9kaWZ5KG9wdGlvbnM6IElNZWRpYU1vZGlmeU1zZ09wdGlvbnMpIHtcbiAgICBjb25zdCB7XG4gICAgICBjaGFubmVsSWQsIGNvbnZlcnNhdGlvblR5cGUsIHRhcmdldElkLCBjYWxsSWQsIG1lZGlhVHlwZSwgdXNlcklkcyxcbiAgICB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBjb250ZW50OiBJTWVkaWFNb2RpZnlNc2dDb250ZW50ID0ge1xuICAgICAgcGxhdGZvcm06IFBsYXRmb3JtLldFQixcbiAgICAgIGRldmljZUlkOiB0aGlzLl9kZXZpY2VJZCxcbiAgICAgIGNhbGxJZCxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICAgIHVzZXI6IHRoaXMuX3VzZXJJbmZvLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsTWVzc2FnZSh7XG4gICAgICBjaGFubmVsSWQsXG4gICAgICBjb252ZXJzYXRpb25UeXBlLFxuICAgICAgdGFyZ2V0SWQsXG4gICAgICBjb250ZW50LFxuICAgICAgbWVzc2FnZVR5cGU6IFJDQ2FsbE1lc3NhZ2VUeXBlLlZDTW9kaWZ5TWVkaWEsXG4gICAgICBkaXJlY3Rpb25hbFVzZXJJZExpc3Q6IHVzZXJJZHMsXG4gICAgfSk7XG4gIH1cbn1cbiIsImV4cG9ydCBlbnVtIFJDQ2FsbExhbmd1YWdlIHtcbiAgWkggPSAnemgnLFxuICBFTiA9ICdlbidcbn1cbiIsImV4cG9ydCBjb25zdCBFTiA9IHtcbiAgUHVzaFRpdGxlOiB7XG4gICAgQVVESU86ICdZb3UgaGF2ZSBhIHZvaWNlIGNhbGwnLFxuICAgIFZJREVPOiAnWW91IGhhdmUgYSB2aWRlbyBjYWxsJyxcbiAgfSxcbn07XG4iLCJleHBvcnQgY29uc3QgWkggPSB7XG4gIFB1c2hUaXRsZToge1xuICAgIEFVRElPOiAn5oKo5pyJ5LiA5p2h6Z+z6aKR6YCa6K+dJyxcbiAgICBWSURFTzogJ+aCqOacieS4gOadoeinhumikemAmuivnScsXG4gIH0sXG59O1xuIiwiaW1wb3J0IHsgUkNDYWxsTGFuZ3VhZ2UgfSBmcm9tICcuLi9lbnVtcy9SQ0NhbGxMYW5nJztcbmltcG9ydCB7IEVOIH0gZnJvbSAnLi9lbic7XG5pbXBvcnQgeyBaSCB9IGZyb20gJy4vemgnO1xuXG4vKipcbiAqIENhbGxFbmdpbmUg5YWo5bGA6K+t6KiA6K6+572u77yM5b2T5YmN5LuF5pSv5oyB5Lit44CB6Iux5paHXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2NhbCB7XG4gIHN0YXRpYyBfbGFuZzogUkNDYWxsTGFuZ3VhZ2UgPSBSQ0NhbGxMYW5ndWFnZS5aSFxuXG4gIHN0YXRpYyBzZXQobGFuZzogUkNDYWxsTGFuZ3VhZ2UpIHtcbiAgICB0aGlzLl9sYW5nID0gbGFuZztcbiAgfVxuXG4gIHN0YXRpYyBnZXQoKSB7XG4gICAgaWYgKHRoaXMuX2xhbmcgPT09IFJDQ2FsbExhbmd1YWdlLkVOKSB7XG4gICAgICByZXR1cm4gRU47XG4gICAgfVxuICAgIHJldHVybiBaSDtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQmFzaWNMb2dnZXIsIENvbnZlcnNhdGlvblR5cGUsIElSZWNlaXZlZE1lc3NhZ2UsIElSdW50aW1lLCBSVENQbHVnaW5Db250ZXh0LFxufSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBSQ0NhbGxTdGF0ZU1hY2hpbmUgfSBmcm9tICcuL2NvcmUvU3RhdGVNYWNoaW5lJztcbmltcG9ydCB7XG4gIElDYWxsU3RhdGVNYWNoaW5lV2F0Y2hlcnMsIElFbmRTdW1tYXJ5LCBJSW52aXRlZFVzZXJzLCBJTWVkaWFNb2RpZnlJbmZvLCBJTWVtYmVyTW9kaWZ5SW5mbywgSVNlbmRlckluZm8sIElTdGF0ZUNoYW5nZUluZm8sIElVc2VyUHJvZmlsZSwgSVVzZXJTdGF0ZUNoYW5nZUluZm8sIElVc2VyRGF0YSwgSUludml0ZU9wdGlvbnMsXG59IGZyb20gJy4vY29yZS9pbnRlcmZhY2VzL0lTdGF0ZU1hY2hpbmUnO1xuaW1wb3J0IHsgUkNDYWxsRXJyb3JDb2RlIH0gZnJvbSAnLi9jb3JlL2VudW1zL1JDQ2FsbENvZGUnO1xuaW1wb3J0IHsgUkNDYWxsVXNlclN0YXRlIH0gZnJvbSAnLi9jb3JlL2VudW1zL1JDQ2FsbFVzZXJTdGF0ZSc7XG5pbXBvcnQgeyBSQ0NhbGxTZXNzaW9uU3RhdGUgfSBmcm9tICcuL2NvcmUvZW51bXMvUkNDYWxsU2Vzc2lvblN0YXRlJztcbmltcG9ydCB7IFJDQ2FsbEVuZFJlYXNvbiB9IGZyb20gJy4vY29yZS9lbnVtcy9SQ0NhbGxFbmRSZWFzb24nO1xuaW1wb3J0IHsgUkNDYWxsTWVkaWFUeXBlIH0gZnJvbSAnLi9jb3JlL2VudW1zL1JDQ2FsbE1lZGlhVHlwZSc7XG5pbXBvcnQgeyBDYWxsTWVzc2FnZUhhbmRsZXIgfSBmcm9tICcuL2NvcmUvTWVzc2FnZUhhbmRsZXInO1xuaW1wb3J0IHsgZXZlbnRFbWl0dGVyLCBnZW5lcmF0ZVJhbmRvbUlkLCBnZXRDYWxsRGV2aWNlSWQgfSBmcm9tICcuL2hlbHBlcic7XG5pbXBvcnQgeyBSQ0NhbGxMYW5ndWFnZSB9IGZyb20gJy4vY29yZS9lbnVtcy9SQ0NhbGxMYW5nJztcbmltcG9ydCB7IElDYWxsRW5naW5lT3B0aW9ucywgSUNhbGxFbmdpbmVXYXRjaGVycyB9IGZyb20gJy4vY29yZS9pbnRlcmZhY2VzL0lDYWxsRW5naW5lJztcbmltcG9ydCB7IFJDQ2FsbE1lc3NhZ2VUeXBlIH0gZnJvbSAnLi9jb3JlL2VudW1zL1JDQ2FsbE1lc3NhZ2VUeXBlJztcbmltcG9ydCB7IElJbnZpdGVNc2dDb250ZW50IH0gZnJvbSAnLi9jb3JlL2ludGVyZmFjZXMvSU1lc3NhZ2VIYW5kbGVyJztcbmltcG9ydCB7IExvY2FsIH0gZnJvbSAnLi9jb3JlL2xvY2FsZSc7XG5pbXBvcnQgeyBJT2ZmbGluZVJlY29yZCB9IGZyb20gJy4vY29yZS9PZmZsaW5lUmVjb3JkZXInO1xuaW1wb3J0IHsgUkNDcm9zc0NhbGxUeXBlIH0gZnJvbSAnLi9jb3JlL2VudW1zL1JDQ3Jvc3NDYWxsVHlwZSc7XG5cbmNsYXNzIFJDQ2FsbEVuZ2luZSB7XG4gIHByaXZhdGUgX3N0YXRlTWFjaGluZTogeyBbY2FsbElkOiBzdHJpbmddOiBSQ0NhbGxTdGF0ZU1hY2hpbmUgfSA9IHt9XG5cbiAgcHJpdmF0ZSBfY2FsbE1zZ0hhbmRsZXI6IENhbGxNZXNzYWdlSGFuZGxlclxuXG4gIC8qKlxuICAgKiDliJ3lp4vljJZcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgICAqIGVuZ2luZSBQbGd1aW5Db250ZXh0IOWunuS+i1xuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRleHQ6IFJUQ1BsdWdpbkNvbnRleHQsXG4gICAgLyoqXG4gICAgICog6L+Q6KGM5pe255u45YWzXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcnVudGltZTogSVJ1bnRpbWUsXG4gICAgLyoqXG4gICAgICogZW5naW5lIOaXpeW/l+aooeWdl+WunuS+i++8jOeUsSBDYWxsTGliIOWxguWIneWni+WMllxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogQmFzaWNMb2dnZXIsXG4gICAgLyoqXG4gICAgICog55uR5ZCs5pa55rOVXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfd2F0Y2hlcnM6IElDYWxsRW5naW5lV2F0Y2hlcnMsXG4gICAgLyoqXG4gICAgICog5YW25LuW6YWN572u6aG5XG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfb3B0aW9uczogSUNhbGxFbmdpbmVPcHRpb25zLFxuICApIHtcbiAgICB0aGlzLl9sb2dnZXIud2FybignXycsIGBSQ0NhbGxFbmdpbmUgVmVyc2lvbjogJHtfX1ZFUlNJT05fX30gQ29tbWl0SWQ6ICR7X19DT01NSVRfSURfX31gKTtcbiAgICAvLyDorr7nva4gRGV2aWNlSWRcbiAgICBnZXRDYWxsRGV2aWNlSWQoX3J1bnRpbWUpO1xuICAgIC8vIOebkeWQrCBJTSDmtojmga9cbiAgICB0aGlzLl9jYWxsTXNnSGFuZGxlciA9IG5ldyBDYWxsTWVzc2FnZUhhbmRsZXIodGhpcy5fY29udGV4dCwgdGhpcy5fcnVudGltZSwgdGhpcy5fbG9nZ2VyLCB0aGlzLl9vcHRpb25zLm9mZmxpbmVNc2dJdHYsIHRoaXMuX2dldFN0YXRlTWFjaGluZS5iaW5kKHRoaXMpKTtcbiAgICAvLyDms6jlhozmtojmga/mqKHlnZfnm5HlkKxcbiAgICB0aGlzLl9jYWxsTXNnSGFuZGxlci5yZWdpc3RlckV2ZW50TGlzdGVuZXIoe1xuICAgICAgb25JbnZpdGU6IHRoaXMuX29uSW52aXRlLmJpbmQodGhpcyksXG4gICAgICBzZW5kQWNjZXB0OiB0aGlzLl9oYW5kbGVTZW5kQWNjZXB0LmJpbmQodGhpcyksXG4gICAgICBvbk9mZmxpbmVSZWNvcmQ6IHRoaXMuX3dhdGNoZXJzLm9uT2ZmbGluZVJlY29yZCxcbiAgICB9KTtcbiAgICAvLyDnm5HlkKznirbmgIHmnLrlhbPpl61cbiAgICBldmVudEVtaXR0ZXIub24oJ29uU3RhdGVNYWNoaW5lQ2xvc2UnLCAoY2FsbElkOiBzdHJpbmcpID0+IHtcbiAgICAgIGRlbGV0ZSB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXTtcbiAgICB9KTtcbiAgICAvLyDorr7nva7or63oqIBcbiAgICBMb2NhbC5zZXQoX29wdGlvbnMubGFuZyk7XG4gIH1cblxuICBwcml2YXRlIF9vbkludml0ZShtc2c6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICBjb25zdCB7XG4gICAgICBjaGFubmVsSWQsIGNvbnZlcnNhdGlvblR5cGUsIHRhcmdldElkLCBjb250ZW50LCBtZXNzYWdlVHlwZSwgc2VuZGVyVXNlcklkOiBzdWlkLCBwdXNoQ29uZmlnLFxuICAgIH0gPSBtc2c7XG4gICAgdGhpcy5fbG9nZ2VyLndhcm4oJ18nLCBgUkNDYWxsRW5naW5lIF9vbkludml0ZTp0YXJnZXRJZCAke3RhcmdldElkfSBzZW5kZXJVc2VySWQ6ICR7c3VpZH1gKTtcbiAgICBjb25zdCB7XG4gICAgICBtZWRpYVR5cGUsIGNhbGxJZCwgZXh0cmEsIHJvb21UeXBlLFxuICAgIH0gPSBjb250ZW50IGFzIElJbnZpdGVNc2dDb250ZW50O1xuICAgIGxldCBzZW5kZXJVc2VySWQ6IHN0cmluZztcbiAgICBpZiAocm9vbVR5cGUgIT09IFJDQ3Jvc3NDYWxsVHlwZS5SQ0NhbGxSb29tVHlwZUFjcm9zc0NhbGwpIHtcbiAgICAgIHNlbmRlclVzZXJJZCA9IHN1aWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIFssIHNlbmRlclVzZXJJZF0gPSBzdWlkLnNwbGl0KCdfJyk7XG4gICAgfVxuICAgIGNvbnN0IGNydFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgaWYgKHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCkgPT09IHNlbmRlclVzZXJJZCkgeyAvLyDlpJrnq6/lpITnkIZcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDnvqTogYrpgJror53mnInlhbbku5bnq6/lpITnkIbml7bvvIzkuI3lho3lpITnkIbmraTpgJror53kuK3nmoTpgoDor7fmtojmga9cbiAgICAgKiDmnaHku7YxOiDmraTkurrlt7LooqvpgoDor7fpgJror51cbiAgICAgKiDmnaHku7YyOiDmnKznq6/ml6DmraTpgJror53nmoTnirbmgIHmnLpcbiAgICAgKi9cbiAgICBpZiAobWVzc2FnZVR5cGUgPT09IFJDQ2FsbE1lc3NhZ2VUeXBlLlZDTW9kaWZ5TWVtKSB7XG4gICAgICBjb25zdCBpc0tlZXBpbmcgPSBjb250ZW50LmV4aXN0ZWRVc2VyUG9maWxlcy5zb21lKChpdGVtOiB7IHVzZXJJZDogc3RyaW5nIH0pID0+IChpdGVtLnVzZXJJZCA9PT0gY3J0VXNlcklkKSk7XG4gICAgICBpZiAoaXNLZWVwaW5nICYmICF0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhdGVNYWNoaW5lID0gdGhpcy5fc3RhdGVNYWNoaW5lW2NhbGxJZF07XG4gICAgaWYgKCFzdGF0ZU1hY2hpbmUpIHtcbiAgICAgIHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdID0gbmV3IFJDQ2FsbFN0YXRlTWFjaGluZShcbiAgICAgICAgdGhpcy5fY29udGV4dCxcbiAgICAgICAgdGhpcy5fcnVudGltZSxcbiAgICAgICAgdGhpcy5fbG9nZ2VyLFxuICAgICAgICB0aGlzLl9jYWxsTXNnSGFuZGxlcixcbiAgICAgICAgY2hhbm5lbElkISxcbiAgICAgICAgY29udmVyc2F0aW9uVHlwZSxcbiAgICAgICAgdGFyZ2V0SWQsXG4gICAgICAgIG1lZGlhVHlwZSxcbiAgICAgICAgY2FsbElkLFxuICAgICAgKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxFbmdpbmVdIFJDQ2FsbFN0YXRlTWFjaGluZSBzdWNjZXNzZnVsbHkgY3JlYXRlZCAtPiBjYWxsSWQ6ICR7Y2FsbElkfWApO1xuXG4gICAgICBpZiAobWVzc2FnZVR5cGUgPT09IFJDQ2FsbE1lc3NhZ2VUeXBlLlZDSW52aXRlKSB7XG4gICAgICAgIC8vIOeKtuaAgeacuuWGhemDqOWkhOeQhiBpbnZpdGUg5raI5oGvXG4gICAgICAgIHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdLl9fb25JbnZpdGUobXNnKTtcbiAgICAgIH0gZWxzZSBpZiAobWVzc2FnZVR5cGUgPT09IFJDQ2FsbE1lc3NhZ2VUeXBlLlZDTW9kaWZ5TWVtKSB7XG4gICAgICAgIHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdLl9fb25NZW1iZXJNb2RpZnkobXNnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3dhdGNoZXJzLm9uSW52aXRlKHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdLCBleHRyYSk7XG5cbiAgICAgIGNvbnN0IGhhc090aGVyU3RhdGVNYWNoaW5lID0gT2JqZWN0LmtleXModGhpcy5fc3RhdGVNYWNoaW5lKS5maWx0ZXIoKG90aGVyQ2FsbElkKSA9PiBjYWxsSWQgIT09IG90aGVyQ2FsbElkKS5sZW5ndGggPiAwO1xuICAgICAgaWYgKGhhc090aGVyU3RhdGVNYWNoaW5lICYmICEodGhpcy5fb3B0aW9ucy5pc0FsbG93QWNjZXB0TmV3Q2FsbCB8fCBmYWxzZSkpIHtcbiAgICAgICAgdGhpcy5fc3RhdGVNYWNoaW5lW2NhbGxJZF0uX19oYW5kbGVJbnZpdGVJblNlc3Npb24oKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG1lc3NhZ2VUeXBlID09PSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ01vZGlmeU1lbSkge1xuICAgICAgdGhpcy5fc3RhdGVNYWNoaW5lW2NhbGxJZF0uX19vbk1lbWJlck1vZGlmeShtc2cpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDlhYHorrjmjqXlkKzmlrDnmoTpgJror53ml7bvvIzmjqXlkKzlrozmlrDnmoTpgJror53lkI7vvIzmjILmlq3lhbbku5bpgJror51cbiAgICovXG4gIHByaXZhdGUgX2hhbmRsZVNlbmRBY2NlcHQoaW5mbzogeyBjYWxsSWQ6IHN0cmluZyB9KSB7XG4gICAgaWYgKHRoaXMuX29wdGlvbnMuaXNBbGxvd0FjY2VwdE5ld0NhbGwpIHtcbiAgICAgIGNvbnN0IHsgY2FsbElkIH0gPSBpbmZvO1xuICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLl9zdGF0ZU1hY2hpbmUpIHtcbiAgICAgICAgaWYgKGNhbGxJZCAhPT0gaWQpIHtcbiAgICAgICAgICB0aGlzLl9zdGF0ZU1hY2hpbmVbaWRdLmh1bmd1cCgpO1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLl9zdGF0ZU1hY2hpbmVbaWRdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOagueaNriBjYWxsSWQg6I635Y+W54q25oCB5py6XG4gICovXG4gIHByaXZhdGUgX2dldFN0YXRlTWFjaGluZShjYWxsSWQ6IHN0cmluZyk6IFJDQ2FsbFN0YXRlTWFjaGluZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXTtcbiAgfVxuXG4gIC8qKlxuICAgKiDms6jlhoznlKjmiLfkv6Hmga8sIOWPkemAgSBjYWxsIOa2iOaBr+aXtueUqOaIt+S/oeaBr+aQuuW4plxuICAgKi9cbiAgcmVnaXN0ZXJVc2VySW5mbyh1c2VySW5mbzogSVVzZXJQcm9maWxlKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYFtSQ0NhbGxFbmdpbmVdIHJlZ2lzdGVyVXNlckluZm8gLT4gdXNlckluZm86ICR7SlNPTi5zdHJpbmdpZnkodXNlckluZm8pfWApO1xuXG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIucmVnaXN0ZXJVc2VySW5mbyh1c2VySW5mbyk7XG4gIH1cblxuICAvKipcbiAgICog5Y2V5ZG8XG4gICAqIEBwYXJhbSBjaGFubmVsSWQg57uE57uHIElEXG4gICAqIEBwYXJhbSB0YXJnZXRJZCAg5a+55pa5IElEXG4gICAqIEBwYXJhbSBtZWRpYVR5cGUg5aqS5L2T57G75Z6LXG4gICAqIEBwYXJhbSBleHRyYSDmtojmga/mianlsZXkv6Hmga9cbiAgICogQHBhcmFtIHB1c2hUaXRsZSDpgJrnn6XnmoTmoIfpophcbiAgICogQHBhcmFtIHB1c2hDb250ZW50IOmAmuefpeeahOWGheWuuVxuICAgKi9cbiAgYXN5bmMgY2FsbChcbiAgICBjaGFubmVsSWQ6IHN0cmluZyxcbiAgICB0YXJnZXRJZDogc3RyaW5nLFxuICAgIG1lZGlhVHlwZTogbnVtYmVyLFxuICAgIGV4dHJhOiBzdHJpbmcgPSAnJyxcbiAgICBwdXNoVGl0bGU6IHN0cmluZyA9ICcnLFxuICAgIHB1c2hDb250ZW50OiBzdHJpbmcgPSAnJyxcbiAgICBpc0Nyb3NzQXBwa2V5ID0gZmFsc2UsXG4gICk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUsIHN0YXRlTWFjaGluZT86IFJDQ2FsbFN0YXRlTWFjaGluZSB9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYFtSQ0NhbGxFbmdpbmVdIGNhbGwgLT4gYXJnczogJHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICBjaGFubmVsSWQsIHRhcmdldElkLCBtZWRpYVR5cGUsIGV4dHJhLCBwdXNoVGl0bGUsIHB1c2hDb250ZW50LFxuICAgIH0pfWApO1xuICAgIGNvbnN0IGNhbGxJZCA9IGdlbmVyYXRlUmFuZG9tSWQoKTtcbiAgICBjb25zdCBoYXNTdGF0ZU1hY2hpbmUgPSBPYmplY3Qua2V5cyh0aGlzLl9zdGF0ZU1hY2hpbmUpLmxlbmd0aCA+IDA7XG4gICAgaWYgKGhhc1N0YXRlTWFjaGluZSkge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNUQVRFX01BQ0hJTkVfRVhJVCB9O1xuICAgIH1cbiAgICB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXSA9IG5ldyBSQ0NhbGxTdGF0ZU1hY2hpbmUoXG4gICAgICB0aGlzLl9jb250ZXh0LFxuICAgICAgdGhpcy5fcnVudGltZSxcbiAgICAgIHRoaXMuX2xvZ2dlcixcbiAgICAgIHRoaXMuX2NhbGxNc2dIYW5kbGVyLFxuICAgICAgY2hhbm5lbElkLFxuICAgICAgQ29udmVyc2F0aW9uVHlwZS5QUklWQVRFLFxuICAgICAgdGFyZ2V0SWQsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICBjYWxsSWQsXG4gICAgKTtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdLl9fY2FsbChbdGFyZ2V0SWRdLCBleHRyYSwgcHVzaFRpdGxlLCBwdXNoQ29udGVudCwgaXNDcm9zc0FwcGtleSk7XG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUyxcbiAgICAgICAgc3RhdGVNYWNoaW5lOiB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnvqTlkbxcbiAgICogQHBhcmFtIGNoYW5uZWxJZCDnu4Tnu4cgSURcbiAgICogQHBhcmFtIHRhcmdldElkICDnvqTnu4QgSURcbiAgICogQHBhcmFtIG1lZGlhVHlwZSDlqpLkvZPnsbvlnotcbiAgICogQHBhcmFtIHVzZXJJZHMg6KKr6YKA6K+35Lq65ZGY5YiX6KGoXG4gICAqIEBwYXJhbSBleHRyYSDmtojmga/mianlsZXkv6Hmga9cbiAgICogQHBhcmFtIHB1c2hUaXRsZSDpgJrnn6XnmoTmoIfpophcbiAgICogQHBhcmFtIHB1c2hDb250ZW50IOmAmuefpeeahOWGheWuuVxuICAgKi9cbiAgYXN5bmMgY2FsbEluR3JvdXAoXG4gICAgY2hhbm5lbElkOiBzdHJpbmcsXG4gICAgdGFyZ2V0SWQ6IHN0cmluZyxcbiAgICBtZWRpYVR5cGU6IG51bWJlcixcbiAgICB1c2VySWRzOiBzdHJpbmdbXSxcbiAgICBleHRyYTogc3RyaW5nID0gJycsXG4gICAgcHVzaFRpdGxlOiBzdHJpbmcgPSAnJyxcbiAgICBwdXNoQ29udGVudDogc3RyaW5nID0gJycsXG4gICk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUsIHN0YXRlTWFjaGluZT86IFJDQ2FsbFN0YXRlTWFjaGluZSB9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYFtSQ0NhbGxFbmdpbmVdIGNhbGxJbkdyb3VwIC0+IGFyZ3M6ICR7SlNPTi5zdHJpbmdpZnkoeyBjaGFubmVsSWQsIHRhcmdldElkLCBtZWRpYVR5cGUgfSl9YCk7XG4gICAgY29uc3QgY2FsbElkID0gZ2VuZXJhdGVSYW5kb21JZCgpO1xuICAgIGNvbnN0IGhhc1N0YXRlTWFjaGluZSA9IE9iamVjdC5rZXlzKHRoaXMuX3N0YXRlTWFjaGluZSkubGVuZ3RoID4gMDtcbiAgICBpZiAoaGFzU3RhdGVNYWNoaW5lKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1RBVEVfTUFDSElORV9FWElUIH07XG4gICAgfVxuICAgIHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdID0gbmV3IFJDQ2FsbFN0YXRlTWFjaGluZShcbiAgICAgIHRoaXMuX2NvbnRleHQsXG4gICAgICB0aGlzLl9ydW50aW1lLFxuICAgICAgdGhpcy5fbG9nZ2VyLFxuICAgICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIsXG4gICAgICBjaGFubmVsSWQsXG4gICAgICBDb252ZXJzYXRpb25UeXBlLkdST1VQLFxuICAgICAgdGFyZ2V0SWQsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICBjYWxsSWQsXG4gICAgKTtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdLl9fY2FsbCh1c2VySWRzLCBleHRyYSwgcHVzaFRpdGxlLCBwdXNoQ29udGVudCk7XG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUyxcbiAgICAgICAgc3RhdGVNYWNoaW5lOiB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDplIDmr4HlvZPliY3nmoTnirbmgIHmnLpcbiAgICovXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgJ1tSQ0NhbGxFbmdpbmVdIGRlc3Ryb3knKTtcbiAgICB0aGlzLl9zdGF0ZU1hY2hpbmUgPSB7fTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBSQ0NhbGxFbmdpbmUsXG4gIFJDQ2FsbFN0YXRlTWFjaGluZSwgUkNDYWxsRXJyb3JDb2RlLFxuICBSQ0NhbGxVc2VyU3RhdGUsXG4gIFJDQ2FsbFNlc3Npb25TdGF0ZSxcbiAgUkNDYWxsRW5kUmVhc29uLFxuICBSQ0NhbGxNZWRpYVR5cGUsXG4gIFJDQ2FsbExhbmd1YWdlLFxufTtcblxuZXhwb3J0IHR5cGUge1xuICBJQ2FsbFN0YXRlTWFjaGluZVdhdGNoZXJzLCBJRW5kU3VtbWFyeSxcbiAgSUNhbGxFbmdpbmVXYXRjaGVycyxcbiAgSVVzZXJTdGF0ZUNoYW5nZUluZm8sXG4gIElTdGF0ZUNoYW5nZUluZm8sXG4gIElTZW5kZXJJbmZvLFxuICBJTWVtYmVyTW9kaWZ5SW5mbyxcbiAgSU1lZGlhTW9kaWZ5SW5mbyxcbiAgSUludml0ZWRVc2VycyxcbiAgSVVzZXJEYXRhLFxuICBJVXNlclByb2ZpbGUsXG4gIElPZmZsaW5lUmVjb3JkLFxuICBJSW52aXRlT3B0aW9ucyxcbn07XG4iLCIvKipcbiAqIOS6p+eUn3Nlc3Npb27nmoTlnLrmma9cbiAqL1xuZXhwb3J0IGVudW0gUHJvZHVjZVR5cGVzIHtcbiAgLyoqXG4gICAqIOS4u+WPq1xuICAgKi9cbiAgQ0FMTEVSID0gMSxcblxuICAvKipcbiAgICog6KKr5Y+rXG4gICAqL1xuICBDQUxMRUUgPSAyXG59XG4iLCJjbGFzcyBFdmVudEVtaXR0ZXIge1xuICBwcml2YXRlIGxpc3Q6IHtbcHJvcE5hbWU6IHN0cmluZ106IGFueVtdfSA9IHt9XG5cbiAgcHVibGljIG9uKGV2ZW50OiBzdHJpbmcsIGZ1bjooZGF0YT86YW55KT0+dm9pZCkge1xuICAgICh0aGlzLmxpc3RbZXZlbnRdIHx8ICh0aGlzLmxpc3RbZXZlbnRdID0gW10pKS5wdXNoKGZ1bik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgb25jZShldmVudDogc3RyaW5nLCBmdW46KGRhdGE/OmFueSk9PnZvaWQpIHtcbiAgICBjb25zdCBvbiA9IChkYXRhPzphbnkpID0+IHtcbiAgICAgIHRoaXMub2ZmKGV2ZW50LCBvbik7XG4gICAgICBmdW4uY2FsbCh0aGlzLCBkYXRhKTtcbiAgICB9O1xuICAgIG9uLmZ1biA9IGZ1bjtcbiAgICB0aGlzLm9uKGV2ZW50LCBvbik7XG4gIH1cblxuICBwdWJsaWMgb2ZmKGV2ZW50OiBzdHJpbmcsIGZ1bj86KGRhdGE/OmFueSk9PnZvaWQpIHtcbiAgICBjb25zdCBmdW5zID0gdGhpcy5saXN0W2V2ZW50XTtcbiAgICBpZiAoIWZ1bnMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFmdW4pIHtcbiAgICAgIC8vIOWmguaenOayoeacieS8oCBmbiDnmoTor53vvIzlsLHkvJrlsIYgZXZlbnQg5YC85a+55bqU57yT5a2Y5YiX6KGo5Lit55qEIGZ1biDpg73muIXnqbpcbiAgICAgIGZ1bnMgJiYgKGZ1bnMubGVuZ3RoID0gMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOiLpeaciSBmdW7vvIzpgY3ljobnvJPlrZjliJfooajvvIznnIvnnIvkvKDlhaXnmoQgZm4g5LiO5ZOq5Liq5Ye95pWw55u45ZCM77yM5aaC5p6c55u45ZCM5bCx55u05o6l5LuO57yT5a2Y5YiX6KGo5Lit5Yig5o6J5Y2z5Y+vXG4gICAgICBsZXQgY2I7XG4gICAgICBmb3IgKGxldCBpID0gMCwgeyBsZW5ndGggfSA9IGZ1bnM7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBjYiA9IGZ1bnNbaV07XG4gICAgICAgIGlmIChjYiA9PT0gZnVuIHx8IGNiLmZ1biA9PT0gZnVuKSB7XG4gICAgICAgICAgZnVucy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZW1pdChldmVudDogc3RyaW5nLCBkYXRhPzphbnkpIHtcbiAgICAvLyDnrKzkuIDkuKrlj4LmlbDmmK/lr7nlupTnmoQgZXZlbnQg5YC877yM55u05o6l55So5pWw57uE55qEIHNoaWZ0IOaWueazleWPluWHulxuICAgIGNvbnN0IGZ1bnMgPSBbLi4udGhpcy5saXN0W2V2ZW50XV07XG5cbiAgICAvLyDlpoLmnpznvJPlrZjliJfooajph4zmsqHmnIkgZnVuIOWwsei/lOWbniBmYWxzZVxuICAgIGlmICghZnVucyB8fCBmdW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyDpgY3ljoYgZXZlbnQg5YC85a+55bqU55qE57yT5a2Y5YiX6KGo77yM5L6d5qyh5omn6KGMIGZuXG4gICAgZnVucy5mb3JFYWNoKChmdW4pID0+IHtcbiAgICAgIGZ1bi5jYWxsKHRoaXMsIGRhdGEpO1xuICAgIH0pO1xuICB9XG59XG5leHBvcnQge1xuICBFdmVudEVtaXR0ZXIsXG59O1xuIiwiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiIsImltcG9ydCB7IFJUQ0pvaW5UeXBlLCBMb2dMIH0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgUkNDYWxsTGFuZ3VhZ2UsIFJDQ2FsbE1lZGlhVHlwZSB9IGZyb20gJ0ByYy1lbWJlZC9jYWxsLWVuZ2luZSc7XG5pbXBvcnQgeyBSQ1Jlc29sdXRpb24gfSBmcm9tICdAcm9uZ2Nsb3VkL3BsdWdpbi1ydGMnO1xuXG5pbXBvcnQge1xuICBJU2Vzc2lvbkxpc3RlbmVyLCBJUkNDYWxsSW5pdE9wdGlvbnMsIElWYWxpZGF0aW9uUmVzdWx0LCBJTWVkaWFTdHJlYW1Db25zdHJhaW50cywgSVB1c2hDb25maWcsXG59IGZyb20gJy4vaW50ZXJmYWNlJztcblxuZnVuY3Rpb24gaXNMYW5ndWFnZSh2YWw6IHN0cmluZykge1xuICBjb25zdCB2YWx1ZXM6IHN0cmluZ1tdID0gT2JqZWN0LnZhbHVlcyhSQ0NhbGxMYW5ndWFnZSk7XG4gIHJldHVybiB2YWx1ZXMuaW5jbHVkZXModmFsKTtcbn1cblxuZnVuY3Rpb24gaXNKb2luVHlwZSh2YWw6IG51bWJlcikge1xuICBjb25zdCB2YWx1ZXMgPSBPYmplY3QudmFsdWVzKFJUQ0pvaW5UeXBlKSBhcyBudW1iZXJbXTtcbiAgcmV0dXJuIHZhbHVlcy5pbmNsdWRlcyh2YWwpO1xufVxuXG5mdW5jdGlvbiBpc0xvZ0xldmVsKHZhbDogbnVtYmVyKSB7XG4gIHJldHVybiBbTG9nTC5ERUJVRywgTG9nTC5JTkZPLCBMb2dMLldBUk4sIExvZ0wuRVJST1JdLmluY2x1ZGVzKHZhbCk7XG59XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUNhbGxJbml0T3B0aW9ucyA9IChvcHRpb25zOiBJUkNDYWxsSW5pdE9wdGlvbnMpOiBJVmFsaWRhdGlvblJlc3VsdCA9PiB7XG4gIGlmICghb3B0aW9ucykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ0luaXRpYWxpemF0aW9uIG1pc3NpbmcgcGFyYW1ldGVyIC0+IG9wdGlvbnMnIH07XG4gIH1cbiAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ0luaXRpYWxpemF0aW9uIG9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QnIH07XG4gIH1cbiAgY29uc3Qga2V5TmFtZXM6IHN0cmluZ1tdID0gWydydGNDbGllbnQnLCAnb25TZXNzaW9uJywgJ29uU2Vzc2lvbkNsb3NlJ107XG4gIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXMob3B0aW9ucyk7XG4gIGNvbnN0IG1pc3NpbmdLZXlzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIOagoemqjOWhq+mhueaYr+WQpumDveWMheWQq++8jOWmguaenOWTquS4quS4jeWMheWQq+WwseaUtumbhui1t+adpVxuICBrZXlOYW1lcy5mb3JFYWNoKChrZXk6IHN0cmluZykgPT4ge1xuICAgIGlmICgha2V5cy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICBtaXNzaW5nS2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICB9KTtcblxuICAvLyDlpoLmnpznvLrlsJHlv4XloavnmoTnm5HlkKzlh73mlbDmiJblr7nosaFcbiAgaWYgKG1pc3NpbmdLZXlzLmxlbmd0aCkge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogYEluaXRpYWxpemF0aW9uIG1pc3NpbmcgcGFyYW1ldGVyIC0+IFwiJHttaXNzaW5nS2V5cy5qb2luKCcsJyl9XCJgIH07XG4gIH1cbiAgaWYgKHR5cGVvZiBvcHRpb25zLnJ0Y0NsaWVudCAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBcXCdydGNDbGllbnRcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdvYmplY3RcXCcnIH07XG4gIH1cbiAgaWYgKHR5cGVvZiBvcHRpb25zLm9uU2Vzc2lvbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ0luaXRpYWxpemF0aW9uIFxcJ29uU2Vzc2lvblxcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIFxcJ2Z1bmN0aW9uXFwnJyB9O1xuICB9XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5vblNlc3Npb25DbG9zZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ0luaXRpYWxpemF0aW9uIFxcJ29uU2Vzc2lvbkNsb3NlXFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnZnVuY3Rpb25cXCcnIH07XG4gIH1cblxuICAvLyDlpoLmnpzkvKDkuoZpc0FsbG93U3Vic2NyaWJlUmV0cnkg5L2G5LiN5pivYm9vbGVhbuexu+Wei1xuICBpZiAodHlwZW9mIG9wdGlvbnMuaXNBbGxvd1N1YnNjcmliZVJldHJ5ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygb3B0aW9ucy5pc0FsbG93U3Vic2NyaWJlUmV0cnkgIT09ICdib29sZWFuJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ0luaXRpYWxpemF0aW9uIFxcJ2lzQWxsb3dTdWJzY3JpYmVSZXRyeVxcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIFxcJ2Jvb2xlYW5cXCcnIH07XG4gIH1cblxuICAvLyDlpoLmnpzkvKDkuobvvIzkvYbkuI3mmK9ib29sZWFu57G75Z6LXG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5pc0FsbG93UHVibGlzaFJldHJ5ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygb3B0aW9ucy5pc0FsbG93UHVibGlzaFJldHJ5ICE9PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBcXCdpc0FsbG93UHVibGlzaFJldHJ5XFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnYm9vbGVhblxcJycgfTtcbiAgfVxuXG4gIC8vIOWmguaenOS8oOS6hu+8jOS9huS4jeaYr2Jvb2xlYW7nsbvlnotcbiAgaWYgKHR5cGVvZiBvcHRpb25zLmlzT2ZmQ2FtZXJhV2hlblZpZGVvRGlzYWJsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdGlvbnMuaXNPZmZDYW1lcmFXaGVuVmlkZW9EaXNhYmxlICE9PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBcXCdpc09mZkNhbWVyYVdoZW5WaWRlb0Rpc2FibGVcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdib29sZWFuXFwnJyB9O1xuICB9XG5cbiAgLy8g5aaC5p6c5Lyg5LqG77yM5L2G5LiN5pivUlRDSm9pblR5cGXnmoTmnprkuL5cbiAgaWYgKHR5cGVvZiBvcHRpb25zLmpvaW5UeXBlICE9PSAndW5kZWZpbmVkJyAmJiAhaXNKb2luVHlwZShvcHRpb25zLmpvaW5UeXBlISkpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBcXCdqb2luVHlwZVxcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIGNvcnJlY3QgdHlwZScgfTtcbiAgfVxuXG4gIC8vIOWmguaenOS8oOS6hu+8jOS9huS4jeaYr2Jvb2xlYW7nsbvlnotcbiAgaWYgKHR5cGVvZiBvcHRpb25zLmlzQWxsb3dEZW1vdGlvbkdldFN0cmVhbSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdGlvbnMuaXNBbGxvd0RlbW90aW9uR2V0U3RyZWFtICE9PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBcXCdpc0FsbG93RGVtb3Rpb25HZXRTdHJlYW1cXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdib29sZWFuXFwnJyB9O1xuICB9XG5cbiAgLy8g5aaC5p6c5Lyg5LqG77yM5L2G5LiN5pivUkNDYWxsTGFuZ3VhZ2XnmoTmnprkuL5cbiAgaWYgKHR5cGVvZiBvcHRpb25zLmxhbmcgIT09ICd1bmRlZmluZWQnICYmICFpc0xhbmd1YWdlKG9wdGlvbnMubGFuZyEpKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gXFwnbGFuZ1xcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIGNvcnJlY3QgdHlwZScgfTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5sb2dPdXRwdXRMZXZlbCAhPT0gJ3VuZGVmaW5lZCcgJiYgIWlzTG9nTGV2ZWwob3B0aW9ucy5sb2dPdXRwdXRMZXZlbCEpKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gXFwnbG9nT3V0cHV0TGV2ZWxcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBjb3JyZWN0IHR5cGUnIH07XG4gIH1cbiAgcmV0dXJuIHsgcmVzdWx0OiB0cnVlIH07XG59O1xuXG4vKipcbiAqIOagoemqjHJlZ2lzdGVyU2Vzc2lvbkxpc3RlbmVy5Y+C5pWwXG4gKi9cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUxpc3RlbmVyID0gKGxpc3RlbmVyOiBJU2Vzc2lvbkxpc3RlbmVyKTogSVZhbGlkYXRpb25SZXN1bHQgPT4ge1xuICBpZiAoIWxpc3RlbmVyKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnbWlzc2luZyBwYXJhbWV0ZXIgLT4gbGlzdGVuZXInIH07XG4gIH1cbiAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdsaXN0ZW5lciBtdXN0IGJlIGFuIG9iamVjdCcgfTtcbiAgfVxuICBjb25zdCBrZXlOYW1lczogc3RyaW5nW10gPSBbJ29uUmluZ2luZycsICdvbkFjY2VwdCcsICdvbkh1bmd1cCcsICdvblRyYWNrUmVhZHknXTtcbiAgY29uc3Qga2V5czogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhsaXN0ZW5lcik7XG4gIGNvbnN0IG1pc3NpbmdLZXlzOiBzdHJpbmdbXSA9IFtdO1xuICBrZXlOYW1lcy5mb3JFYWNoKChrZXk6IHN0cmluZykgPT4ge1xuICAgIGlmICgha2V5cy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICBtaXNzaW5nS2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICB9KTtcbiAgaWYgKG1pc3NpbmdLZXlzLmxlbmd0aCkge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogYG1pc3NpbmcgcGFyYW1ldGVyIC0+IFwiJHttaXNzaW5nS2V5cy5qb2luKCcsJyl9XCJgIH07XG4gIH1cbiAgaWYgKHR5cGVvZiBsaXN0ZW5lci5vblJpbmdpbmcgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdvblJpbmdpbmdcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdmdW5jdGlvblxcJycgfTtcbiAgfVxuICBpZiAodHlwZW9mIGxpc3RlbmVyLm9uQWNjZXB0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnb25BY2NlcHRcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdmdW5jdGlvblxcJycgfTtcbiAgfVxuICBpZiAodHlwZW9mIGxpc3RlbmVyLm9uSHVuZ3VwICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnb25IdW5ndXBcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdmdW5jdGlvblxcJycgfTtcbiAgfVxuICBpZiAodHlwZW9mIGxpc3RlbmVyLm9uVHJhY2tSZWFkeSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ29uVHJhY2tSZWFkeVxcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIFxcJ2Z1bmN0aW9uXFwnJyB9O1xuICB9XG4gIHJldHVybiB7IHJlc3VsdDogdHJ1ZSB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlVGFyZ2V0SWQgPSAodGFyZ2V0SWQ6IHN0cmluZyk6IElWYWxpZGF0aW9uUmVzdWx0ID0+IHtcbiAgaWYgKHRhcmdldElkICYmIHR5cGVvZiB0YXJnZXRJZCA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IHRydWUgfTtcbiAgfVxuICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCd0YXJnZXRJZFxcJyBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQsIG11c3QgYmUgb2YgdHlwZSBcXCdzdHJpbmdcXCcnIH07XG59O1xuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVNZWRpYVR5cGUgPSAobWVkaWFUeXBlOiBudW1iZXIpOiBJVmFsaWRhdGlvblJlc3VsdCA9PiB7XG4gIGlmIChtZWRpYVR5cGUgPT09IFJDQ2FsbE1lZGlhVHlwZS5BVURJTyB8fCBtZWRpYVR5cGUgPT09IFJDQ2FsbE1lZGlhVHlwZS5BVURJT19WSURFTykge1xuICAgIHJldHVybiB7IHJlc3VsdDogdHJ1ZSB9O1xuICB9XG4gIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ21lZGlhVHlwZVxcJyBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQsIG11c3QgYmUgb2YgdHlwZSBcXCdSQ0NhbGxNZWRpYVR5cGVcXCcnIH07XG59O1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlRXh0cmEgPSAoZXh0cmE6IHN0cmluZyk6IElWYWxpZGF0aW9uUmVzdWx0ID0+IHtcbiAgaWYgKHR5cGVvZiBleHRyYSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IHRydWUgfTtcbiAgfVxuICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdleHRyYVxcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIFxcJ3N0cmluZ1xcJycgfTtcbn07XG5leHBvcnQgY29uc3QgdmFsaWRhdGVQdXNoVGl0bGUgPSAocHVzaFRpdGxlOiBzdHJpbmcpOiBJVmFsaWRhdGlvblJlc3VsdCA9PiB7XG4gIGlmICh0eXBlb2YgcHVzaFRpdGxlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogdHJ1ZSB9O1xuICB9XG4gIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ3B1c2hUaXRsZVxcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIFxcJ3N0cmluZ1xcJycgfTtcbn07XG5leHBvcnQgY29uc3QgdmFsaWRhdGVQdXNoQ29udGVudCA9IChwdXNoQ29udGVudDogc3RyaW5nKTogSVZhbGlkYXRpb25SZXN1bHQgPT4ge1xuICBpZiAodHlwZW9mIHB1c2hDb250ZW50ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogdHJ1ZSB9O1xuICB9XG4gIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ3B1c2hDb250ZW50XFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnc3RyaW5nXFwnJyB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlUHVzaENvbmZpZyA9IChwdXNoQ29uZmlnOiBJUHVzaENvbmZpZykgPT4ge1xuICBjb25zdCB7IHB1c2hUaXRsZSA9ICcnLCBwdXNoQ29udGVudCA9ICcnIH0gPSBwdXNoQ29uZmlnO1xuICBjb25zdCBjb25jbHVzaW9uOiBJVmFsaWRhdGlvblJlc3VsdFtdID0gW107XG4gIGNvbmNsdXNpb24ucHVzaCh2YWxpZGF0ZVB1c2hUaXRsZShwdXNoVGl0bGUpKTtcbiAgY29uY2x1c2lvbi5wdXNoKHZhbGlkYXRlUHVzaENvbnRlbnQocHVzaENvbnRlbnQpKTtcbiAgcmV0dXJuIGNvbmNsdXNpb247XG59O1xuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVVc2VySWRzID0gKHVzZXJJZHM6IHN0cmluZ1tdKTogSVZhbGlkYXRpb25SZXN1bHQgPT4ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkodXNlcklkcykpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCd1c2VySWRzXFwnIHBhcmFtZXRlciBpcyByZXF1aXJlZCwgbXVzdCBiZSBvZiB0eXBlIFxcJ3N0cmluZ1tdXFwnJyB9O1xuICB9XG4gIGlmICghdXNlcklkcy5sZW5ndGgpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCd1c2VySWRzXFwnIHBhcmFtZXRlciBpcyByZXF1aXJlZCwgbXVzdCBiZSBvZiB0eXBlIFxcJ3N0cmluZ1tdXFwnJyB9O1xuICB9XG4gIGlmICghdXNlcklkcy5ldmVyeSgoc3RyKSA9PiB0eXBlb2Ygc3RyID09PSAnc3RyaW5nJyAmJiBzdHIubGVuZ3RoID4gMCkpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCd1c2VySWRzXFwnIHBhcmFtZXRlciBpcyByZXF1aXJlZCcgfTtcbiAgfVxuICByZXR1cm4geyByZXN1bHQ6IHRydWUgfTtcbn07XG5cbmZ1bmN0aW9uIGlzUkNGcmFtZVJhdGUodmFsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgYXJycyA9IFsnRlBTXzEwJywgJ0ZQU18xNScsICdGUFNfMjQnLCAnRlBTXzMwJ107XG4gIHJldHVybiBhcnJzLmluY2x1ZGVzKHZhbCk7XG59XG5cbmNvbnN0IGlzVmFsaWRSZXNvbHV0aW9uID0gKHJlc29sdXRpb24/OiBSQ1Jlc29sdXRpb24pOiBib29sZWFuID0+ICEhUkNSZXNvbHV0aW9uW3Jlc29sdXRpb24hXTtcblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlTWVkaWFTdHJlYW1Db25zdHJhaW50cyA9IChjb25zdHJhaW50czogSU1lZGlhU3RyZWFtQ29uc3RyYWludHMpOiBJVmFsaWRhdGlvblJlc3VsdCA9PiB7XG4gIGlmIChjb25zdHJhaW50cyAmJiBjb25zdHJhaW50cy5hdWRpbyAmJiB0eXBlb2YgY29uc3RyYWludHMuYXVkaW8ubWljcGhvbmVJZCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnN0cmFpbnRzLmF1ZGlvLm1pY3Bob25lSWQgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnY29uc3RyYWludHMuYXVkaW8ubWljcGhvbmVJZFxcJyBtdXN0IGJlIG9mIHR5cGUgXFwnc3RyaW5nXFwnJyB9O1xuICB9XG4gIGlmIChjb25zdHJhaW50cyAmJiBjb25zdHJhaW50cy5hdWRpbyAmJiB0eXBlb2YgY29uc3RyYWludHMuYXVkaW8uc2FtcGxlUmF0ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnN0cmFpbnRzLmF1ZGlvLnNhbXBsZVJhdGUgIT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnY29uc3RyYWludHMuYXVkaW8uc2FtcGxlUmF0ZVxcJyBtdXN0IGJlIG9mIHR5cGUgXFwnbnVtYmVyXFwnJyB9O1xuICB9XG4gIGlmIChjb25zdHJhaW50cyAmJiBjb25zdHJhaW50cy52aWRlbyAmJiB0eXBlb2YgY29uc3RyYWludHMudmlkZW8uY2FtZXJhSWQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb25zdHJhaW50cy52aWRlby5jYW1lcmFJZCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdjb25zdHJhaW50cy52aWRlby5jYW1lcmFJZFxcJyBtdXN0IGJlIG9mIHR5cGUgXFwnc3RyaW5nXFwnJyB9O1xuICB9XG4gIC8vIGlmIChjb25zdHJhaW50cyAmJiBjb25zdHJhaW50cy52aWRlbyAmJiB0eXBlb2YgY29uc3RyYWludHMudmlkZW8uZmFjZU1vZGUgIT09ICd1bmRlZmluZWQnICYmIGNvbnN0cmFpbnRzLnZpZGVvLmNhbWVyYUlkICE9PSAndXNlcicgJiYgY29uc3RyYWludHMudmlkZW8uZmFjZU1vZGUgIT09ICdlbnZpcm9ubWVudCcpIHtcbiAgLy8gICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdjb25zdHJhaW50cy52aWRlby5jYW1lcmFJZFxcJyBtdXN0IGJlICBcXCd1c2VyXFwnIG9yIFxcJ2Vudmlyb25tZW50XFwnJyB9XG4gIC8vIH1cblxuICBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMudmlkZW8gJiYgdHlwZW9mIGNvbnN0cmFpbnRzLnZpZGVvLmZyYW1lUmF0ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnN0cmFpbnRzLnZpZGVvLmZyYW1lUmF0ZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdjb25zdHJhaW50cy52aWRlby5mcmFtZVJhdGVcXCcgbXVzdCBiZSBvZiB0eXBlIFxcJ3N0cmluZ1xcJycgfTtcbiAgfVxuXG4gIGlmIChjb25zdHJhaW50cyAmJiBjb25zdHJhaW50cy52aWRlbyAmJiB0eXBlb2YgY29uc3RyYWludHMudmlkZW8uZnJhbWVSYXRlICE9PSAndW5kZWZpbmVkJyAmJiAhaXNSQ0ZyYW1lUmF0ZShjb25zdHJhaW50cy52aWRlby5mcmFtZVJhdGUpKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnZnJhbWVSYXRlXFwnIHZhbHVlIGlzIG91dCBvZiByYW5nZScgfTtcbiAgfVxuXG4gIGlmIChjb25zdHJhaW50cyAmJiBjb25zdHJhaW50cy52aWRlbyAmJiB0eXBlb2YgY29uc3RyYWludHMudmlkZW8ucmVzb2x1dGlvbiAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnN0cmFpbnRzLnZpZGVvLnJlc29sdXRpb24gIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnY29uc3RyYWludHMudmlkZW8uZnJhbWVSYXRlXFwnIG11c3QgYmUgb2YgdHlwZSBcXCdzdHJpbmdcXCcnIH07XG4gIH1cblxuICBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMudmlkZW8gJiYgdHlwZW9mIGNvbnN0cmFpbnRzLnZpZGVvLnJlc29sdXRpb24gIT09ICd1bmRlZmluZWQnICYmICFpc1ZhbGlkUmVzb2x1dGlvbihjb25zdHJhaW50cy52aWRlby5yZXNvbHV0aW9uKSkge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ3Jlc29sdXRpb25cXCcgdmFsdWUgaXMgb3V0IG9mIHJhbmdlJyB9O1xuICB9XG4gIGlmIChjb25zdHJhaW50cyAmJiBjb25zdHJhaW50cy52aWRlbyAmJiAoIWNvbnN0cmFpbnRzLnZpZGVvLmZyYW1lUmF0ZSB8fCAhY29uc3RyYWludHMudmlkZW8ucmVzb2x1dGlvbikpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdyZXNvbHV0aW9uXFwnIGFuZCBcXCdyZXNvbHV0aW9uXFwnIGlzIHJlcXVpcmVkJyB9O1xuICB9XG5cbiAgcmV0dXJuIHsgcmVzdWx0OiB0cnVlIH07XG59O1xuIiwiZXhwb3J0IGNvbnN0IHRpbWVyU2V0VGltZW91dCA9IChmdW5jOiBGdW5jdGlvbiwgdGltZW91dDogbnVtYmVyKTogbnVtYmVyID0+IHNldFRpbWVvdXQoZnVuYywgdGltZW91dCkgYXMgbnVtYmVyO1xuIiwiaW1wb3J0IHsgdGltZXJTZXRUaW1lb3V0IH0gZnJvbSAnLi9oZWxwZXInO1xuXG5leHBvcnQgY2xhc3MgVGltZXIge1xuICBwcml2YXRlIF90aW1lcklkOiBudW1iZXIgPSAwXG5cbiAgcHJpdmF0ZSBfc3RhcnRUaW1lOiBudW1iZXIgPSAwXG5cbiAgY29uc3RydWN0b3IoY2FsbGJhY2s6IEZ1bmN0aW9uLCB0aW1lb3V0OiBudW1iZXIpIHtcbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIHRoaXMuX3RpbWVySWQgPSB0aW1lclNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfSwgdGltZW91dCk7XG4gICAgfVxuICAgIHRoaXMuX3N0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gIH1cblxuICBzdG9wKCk6IHtcbiAgICBzdGFydFRpbWU6IG51bWJlcixcbiAgICBlbmRUaW1lOiBudW1iZXIsXG4gICAgZHVyYXRpb246IG51bWJlclxuICAgIH0ge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lcklkKTtcblxuICAgIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGxldCBkdXJhdGlvbiA9IGVuZFRpbWUgLSB0aGlzLl9zdGFydFRpbWU7XG4gICAgaWYgKHRoaXMuX3N0YXJ0VGltZSA9PT0gMCkge1xuICAgICAgZHVyYXRpb24gPSAwO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzdGFydFRpbWU6IHRoaXMuX3N0YXJ0VGltZSxcbiAgICAgIGVuZFRpbWUsXG4gICAgICBkdXJhdGlvbixcbiAgICB9O1xuICB9XG5cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy5fc3RhcnRUaW1lID0gMDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29udmVyc2F0aW9uVHlwZSwgSUxvZ2dlciB9IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7XG4gIElNZWRpYU1vZGlmeUluZm8sXG4gIElNZW1iZXJNb2RpZnlJbmZvLFxuICBJU2VuZGVySW5mbyxcbiAgSVN0YXRlQ2hhbmdlSW5mbyxcbiAgSVVzZXJEYXRhLFxuICBJVXNlclN0YXRlQ2hhbmdlSW5mbyxcbiAgSUludml0ZU9wdGlvbnMsXG4gIFJDQ2FsbEVuZFJlYXNvbixcbiAgUkNDYWxsRXJyb3JDb2RlLFxuICBSQ0NhbGxNZWRpYVR5cGUsXG4gIFJDQ2FsbFNlc3Npb25TdGF0ZSxcbiAgUkNDYWxsU3RhdGVNYWNoaW5lLFxuICBSQ0NhbGxVc2VyU3RhdGUsXG59IGZyb20gJ0ByYy1lbWJlZC9jYWxsLWVuZ2luZSc7XG5pbXBvcnQge1xuICBJUkNSVENTdGF0ZVJlcG9ydCxcbiAgUkNLaWNrUmVhc29uLFxuICBSQ0xvY2FsVHJhY2ssXG4gIFJDUmVtb3RlQXVkaW9UcmFjayxcbiAgUkNSZW1vdGVUcmFjayxcbiAgUkNSZW1vdGVWaWRlb1RyYWNrLFxuICBSQ1JUQ0NsaWVudCxcbiAgUkNSVENDb2RlLFxuICBSQ1JUQ1BpbmdSZXN1bHQsXG4gIFJDUlRDUm9vbSxcbiAgSU1pY3Bob25lQXVkaW9Qcm9maWxlLFxufSBmcm9tICdAcm9uZ2Nsb3VkL3BsdWdpbi1ydGMnO1xuXG5pbXBvcnQgeyBQcm9kdWNlVHlwZXMgfSBmcm9tICcuL2VudW1zJztcblxuaW1wb3J0IHtcbiAgSURldmljZUNoYW5nZVBhcmFtcyxcbiAgSU1lZGlhU3RyZWFtQ29uc3RyYWludHMsXG4gIElNdXRlVXNlcixcbiAgSVJDQ2FsbFNlc3Npb25PcHRpb25zLFxuICBJU2Vzc2lvbkxpc3RlbmVyLFxuICBJVmFsaWRhdGlvblJlc3VsdCxcbn0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuaW1wb3J0IGV2ZW50RW1pdHRlciBmcm9tICcuL2V2ZW50RW1pdHRlcic7XG5pbXBvcnQge1xuICB2YWxpZGF0ZUxpc3RlbmVyLCB2YWxpZGF0ZU1lZGlhU3RyZWFtQ29uc3RyYWludHMsIHZhbGlkYXRlVXNlcklkcywgdmFsaWRhdGVFeHRyYSwgdmFsaWRhdGVQdXNoVGl0bGUsIHZhbGlkYXRlUHVzaENvbnRlbnQsXG59IGZyb20gJy4vdmFsaWRhdGlvbic7XG5pbXBvcnQgeyBUaW1lciB9IGZyb20gJy4vdGltZXInO1xuXG5leHBvcnQgY2xhc3MgUkNDYWxsU2Vzc2lvbiB7XG4gIC8qKlxuICAgKiBSVEPmiL/pl7Tlrp7kvotcbiAgICovXG4gIHByaXZhdGUgX3Jvb20hOiBSQ1JUQ1Jvb21cblxuICAvKipcbiAgICog55So5oi35Lyg6L+b5p2l55qEIOWvuXNlc3Npb27nmoTnm5HlkKwgKOimgeWcqFJDQ2FsbENsaWVudOeahF9vbkludml0ZemHjOWIpOaWre+8jOimgeaxguaJp+ihjOWujG9uU2Vzc2lvbuW/hemhu+azqOWGjHNlc3Npb27nmoTnm5HlkKzvvIzmiYDku6Xov5nph4zmmK9wdWJsaWMpXG4gICAqL1xuICBwdWJsaWMgX2xpc3RlbmVyOiBJU2Vzc2lvbkxpc3RlbmVyIHwgbnVsbCA9IG51bGxcblxuICAvKipcbiAgICogUlRD6K6i6ZiF44CB5Y+R5biD6YeN6K+V55qE5qyh5pWwXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9SRVRSWUNPVU5UOiBudW1iZXIgPSAyXG5cbiAgLyoqXG4gICAqIOWKoOWFpeaIv+mXtOWumuaXtuWZqFxuICAgKi9cblxuICBwcml2YXRlIGpvaW5Sb29tVGltZXI6IGFueSA9IG51bGxcblxuICBjb25zdHJ1Y3RvcihcblxuICAgIC8qKlxuICAgICAqIOeKtuaAgeacuuWunuS+i1xuICAgICAqL1xuICAgIHByaXZhdGUgX3N0YXRlTWFjaGluZTogUkNDYWxsU3RhdGVNYWNoaW5lLFxuXG4gICAgLyoqXG4gICAgICogcnRj5a6e5L6LXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcnRjQ2xpZW50OiBSQ1JUQ0NsaWVudCxcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogSUxvZ2dlcixcblxuICAgIC8qKlxuICAgICAqIHNlc3Npb27nmoTlhbblroPpgInpoblcbiAgICAgKi9cbiAgICBwcml2YXRlIF9vcHRpb25zOiBJUkNDYWxsU2Vzc2lvbk9wdGlvbnMgPSB7fSxcblxuICApIHtcbiAgICAvLyDnm5HlkKznirbmgIHmnLpcbiAgICB0aGlzLl9zdGF0ZU1hY2hpbmUucmVnaXN0ZXJFdmVudExpc3RlbmVyKHtcbiAgICAgIC8qKlxuICAgICAgICog55So5oi354q25oCB5Y+Y5pu0XG4gICAgICAgKiBAcGFyYW0gaW5mb1xuICAgICAgICovXG4gICAgICBvblVzZXJTdGF0ZUNoYW5nZTogKHsgdXNlciwgcmVhc29uIH06IElVc2VyU3RhdGVDaGFuZ2VJbmZvKSA9PiB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxTZXNzaW9uIG9uVXNlclN0YXRlQ2hhbmdlXSB1c2VySWQtPiR7dXNlcj8udXNlcklkfSBzdGF0ZS0+JHt1c2VyPy5zdGF0ZX0gcmVhc29uLT4ke3JlYXNvbn1gKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICog5oi/6Ze054q25oCB5Y+Y5pu0XG4gICAgICAgKiBAcGFyYW1cbiAgICAgICAqL1xuICAgICAgb25TdGF0ZUNoYW5nZTogYXN5bmMgKGluZm86IElTdGF0ZUNoYW5nZUluZm8pID0+IHtcbiAgICAgICAgY29uc3QgeyBzdGF0ZSwgcmVhc29uIH0gPSBpbmZvO1xuICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBvblN0YXRlQ2hhbmdlXSA6IHN0YXRlLT4ke3N0YXRlfSByZWFzb24tPiR7cmVhc29ufWApO1xuXG4gICAgICAgIC8vIOWmguaenOWcqOmAmuivneS4re+8jOWwseWKoOaIv+mXtFxuICAgICAgICBpZiAoc3RhdGUgPT09IFJDQ2FsbFNlc3Npb25TdGF0ZS5LRUVQSU5HKSB7XG4gICAgICAgICAgY29uc3Qgcm9vbUlkOiBzdHJpbmcgPSB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0Q2FsbElkKCk7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gb25TdGF0ZUNoYW5nZV0gcm9vbUlkOiAke3Jvb21JZH1gKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8g5Yqg5oi/6Ze0XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9qb2luUm9vbShyb29tSWQpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uTkVUV09SS19FUlJPUik7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gb25TdGF0ZUNoYW5nZV0gam9pblJvb20gdGhyb3cgZXhjZXB0aW9uIHJvb21JZCAtPiAke3Jvb21JZH1gKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqICDku6XkuIvkuInmnaHlj6ropoHmu6HotrPkuIDmnaHvvIznirbmgIHkvJrlj5jmiJBSQ0NhbGxTZXNzaW9uU3RhdGUuRU5EXG4gICAgICAgICAgICogIDHjgIHmnKznq6/nlKjmiLfoh6rlt7HkuLvliqjmjILmlq1cbiAgICAgICAgICAgKiAgMuOAgeacjeWKoeerr+aKiuacrOerr+eUqOaIt+i4ouWHulJUQ+aIv+mXtFxuICAgICAgICAgICAqICAz44CB5oi/6Ze06YeM5bCP5LqOMuS4quS6ulxuICAgICAgICAgICAqL1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSBSQ0NhbGxTZXNzaW9uU3RhdGUuRU5EKSB7XG4gICAgICAgICAgLy8g6L+Y5pyq5Yqg5YWl5oi/6Ze05bCx5oyC5patXG4gICAgICAgICAgaWYgKCF0aGlzLl9yb29tKSB7XG4gICAgICAgICAgICAvLyDplIDmr4HmnKzlnLDmtYHvvIzlhbPpl63mkYTlg4/lpLRcbiAgICAgICAgICAgIHRoaXMuX29wdGlvbnMubG9jYWxUcmFja3MgJiYgdGhpcy5fZGVzdHJveVRyYWNrcyh0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzKTtcbiAgICAgICAgICAgIGNvbnN0IHN1bW1hcnlJbmZvID0gdGhpcy5fc3RhdGVNYWNoaW5lLmdldFN1bW1hcnkoKTtcbiAgICAgICAgICAgIGV2ZW50RW1pdHRlci5lbWl0KCdzZXNzaW9uQ2xvc2UnLCB7IHNlc3Npb246IHRoaXMsIHN1bW1hcnlJbmZvIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuX29wdGlvbnMubG9jYWxUcmFja3MgJiYgdGhpcy5fZGVzdHJveVRyYWNrcyh0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzKTtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsICdbUkNDYWxsU2Vzc2lvbiBvblN0YXRlQ2hhbmdlXSBsb2NhbFRyYWNrcyBkZXN0cm95ZWQnKTtcbiAgICAgICAgICB0aGlzLl9sZWF2ZVJvb20oKTtcbiAgICAgICAgICB0aGlzLl9yb29tID0gbnVsbCBhcyB1bmtub3duIGFzIFJDUlRDUm9vbTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiDmlLbliLDlk43pk4NcbiAgICAgICAqIEBwYXJhbSBzZW5kZXIg5Y+R6LW355So5oi35L+h5oGvXG4gICAgICAgKi9cbiAgICAgIG9uUmluZ2luZzogKHNlbmRlcjogSVNlbmRlckluZm8pID0+IHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gb25SaW5naW5nXXNlbmRlcjogc2VuZGVyLnVzZXJJZCAtPiAke3NlbmRlci51c2VySWR9YCk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyDpgJrnn6XnlKjmiLflk43pk4NcbiAgICAgICAgICB0aGlzLl9saXN0ZW5lciEub25SaW5naW5nKHNlbmRlciwgdGhpcyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxTZXNzaW9uIG9uUmluZ2luZ10gbWV0aG9kIGV4Y2VwdGlvbiAtPiBvblJpbmdpbmcnKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgICAqIOW9k+i/nOerr+eUqOaIt+WQjOaEj+aOpeWQrFxuICAgICAgICAgKi9cbiAgICAgIG9uQWNjZXB0OiAoc2VuZGVyOiBJU2VuZGVySW5mbykgPT4ge1xuICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBvbkFjY2VwdF1zZW5kZXI6IHNlbmRlci51c2VySWQgLT4gJHtzZW5kZXIudXNlcklkfWApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIOmAmuefpeacrOerr++8jOi/nOerr+eUqOaIt+W3suaOpeWQrFxuICAgICAgICAgIHRoaXMuX2xpc3RlbmVyIS5vbkFjY2VwdChzZW5kZXIsIHRoaXMpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbiBvbkFjY2VwdF0gbWV0aG9kIGV4Y2VwdGlvbiAtPiBvbkFjY2VwdCcpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAgICog5b2T5pyJ6L+c56uv55So5oi35oyC5patXG4gICAgICAgICAqL1xuICAgICAgb25IdW5ndXA6IChzZW5kZXI6IElTZW5kZXJJbmZvLCByZWFzb246IFJDQ2FsbEVuZFJlYXNvbikgPT4ge1xuICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBvbkh1bmd1cF1zZW5kZXI6IHNlbmRlci51c2VySWQgLT4gJHtzZW5kZXIudXNlcklkfSByZWFzb24tPiR7cmVhc29ufWApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIOmAmuefpeacrOerr++8jOi/nOerr+eUqOaIt+W3suaMguaWrVxuICAgICAgICAgIHRoaXMuX2xpc3RlbmVyIS5vbkh1bmd1cChzZW5kZXIsIHJlYXNvbiwgdGhpcyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxTZXNzaW9uIG9uSHVuZ3VwXSBtZXRob2QgZXhjZXB0aW9uIC0+IG9uSHVuZ3VwJyk7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICog5pS25Yiw5Lq65ZGY5Y+Y5pu0XG4gICAgICAgKiBAcGFyYW0gc2VuZGVyIOWPkei1t+eUqOaIt+S/oeaBr1xuICAgICAgICovXG4gICAgICBvbk1lbWJlck1vZGlmeTogKHsgc2VuZGVyLCBpbnZpdGVkVXNlcnMgfTogSU1lbWJlck1vZGlmeUluZm8pID0+IHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gb25NZW1iZXJNb2RpZnldIHNlbmRlci51c2VySWQgLT4gJHtzZW5kZXIudXNlcklkfWApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIOmAmuefpeeUqOaIt+S6uuWRmOWPmOabtFxuICAgICAgICAgIHRoaXMuX2xpc3RlbmVyIS5vbk1lbWJlck1vZGlmeShzZW5kZXIsIGludml0ZWRVc2VycywgdGhpcyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxTZXNzaW9uIG9uTWVtYmVyTW9kaWZ5XSBtZXRob2QgZXhjZXB0aW9uIC0+IG9uTWVtYmVyTW9kaWZ5Jyk7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICog5pS25Yiw6YCa6K+d57G75Z6L5Y+Y5pu0ICjpgJror53pmY3nuqcpXG4gICAgICAgKiBAcGFyYW0gc2VuZGVyIOWPkei1t+eUqOaIt+S/oeaBr1xuICAgICAgICovXG4gICAgICBvbk1lZGlhTW9kaWZ5OiAoeyBzZW5kZXIsIG1lZGlhVHlwZSB9OiBJTWVkaWFNb2RpZnlJbmZvKSA9PiB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxTZXNzaW9uIG9uTWVkaWFNb2RpZnldc2VuZGVyOiBzZW5kZXIudXNlcklkIC0+ICR7c2VuZGVyLnVzZXJJZH0gbWVkaWFUeXBlOiAke21lZGlhVHlwZX1gKTtcbiAgICAgICAgaWYgKG1lZGlhVHlwZSA9PT0gUkNDYWxsTWVkaWFUeXBlLkFVRElPKSB7XG4gICAgICAgICAgLy8g6L+c56uv5pS25Yiw6YCa6K+d6ZmN57qn6YCa55+l5ZCO77yM6L+c56uv5omn6KGM6ZmN57qn6YCa6K+dKOS4jeWPkea2iOaBrylcbiAgICAgICAgICB0aGlzLl9zZXRNZWRpYVR5cGVUb0F1ZGlvKCk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLl9saXN0ZW5lciEub25NZWRpYU1vZGlmeShzZW5kZXIsIG1lZGlhVHlwZSwgdGhpcyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxTZXNzaW9uIG9uTWVkaWFNb2RpZnldIG1ldGhvZCBleGNlcHRpb24gLT4gb25NZWRpYU1vZGlmeScpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiDmmK/lkKbot6hhcHBrZXlcbiAgICAgICAqIEBwYXJhbSBzZW5kZXIg5Y+R6LW355So5oi35L+h5oGvXG4gICAgICAgKi9cbiAgICAgIGNyb3NzQXBwa2V5OiAoaXNDcm9zc0FwcGtleTogYm9vbGVhbikgPT4ge1xuICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBjcm9zc0FwcGtleV0g5piv5ZCm6LeoIGFwcGtleTogJHtpc0Nyb3NzQXBwa2V5fWApO1xuICAgICAgICB0aGlzLl9vcHRpb25zLmlzQ3Jvc3NBcHBrZXkgPSBpc0Nyb3NzQXBwa2V5O1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIOiuvue9ruaMguaWreeahOaOqOmAgeS/oeaBr1xuICAgICAqL1xuICAgIGNvbnN0IHsgcHVzaFRpdGxlLCBwdXNoQ29udGVudCB9ID0gdGhpcy5fb3B0aW9ucy5odW5ndXBQdXNoQ29uZmlnITtcbiAgICB0aGlzLl9zdGF0ZU1hY2hpbmUuc2V0SHVuZ3VwUHVzaENvbmZpZyhwdXNoVGl0bGUsIHB1c2hDb250ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiAg5Yqg5YWl5oi/6Ze0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9qb2luUm9vbShyb29tSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUgfT4ge1xuICAgIGxldCBjYWxsQmFjaztcbiAgICB0cnkge1xuICAgICAgLy8g5Yqg5oi/6Ze0XG4gICAgICBpZiAodGhpcy5fb3B0aW9ucy5pc0Nyb3NzQXBwa2V5KSB7XG4gICAgICAgIGNhbGxCYWNrID0gYXdhaXQgdGhpcy5fcnRjQ2xpZW50LmpvaW5Dcm9zc1JUQ1Jvb20ocm9vbUlkLCB0aGlzLl9vcHRpb25zLmpvaW5UeXBlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxCYWNrID0gYXdhaXQgdGhpcy5fcnRjQ2xpZW50LmpvaW5SVENSb29tKHJvb21JZCwgdGhpcy5fb3B0aW9ucy5qb2luVHlwZSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgY29kZSwgdXNlcklkcywgcm9vbSB9ID0gY2FsbEJhY2s7XG5cbiAgICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgICAvLyDlpoLmnpzpn7Pop4bpopHmnI3liqHmnKrlvIDpgJpcbiAgICAgICAgaWYgKGNvZGUgPT09IFJDUlRDQ29kZS5OT1RfT1BFTl9WSURFT19BVURJT19TRVJWRVIpIHtcbiAgICAgICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uU0VSVklDRV9OT1RfT1BFTkVEKTtcbiAgICAgICAgICAvLyDlt7Hmlrnlhbbku5bnq6/lt7LlnKjpgJror53kuK1cbiAgICAgICAgfSBpZiAoY29kZSA9PT0gUkNSVENDb2RlLlNJR05BTF9KT0lOX1JUQ19ST09NX1JFRlVTRUQpIHtcbiAgICAgICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uT1RIRVJfQ0xJRU5UX0lOX0NBTEwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX2V4Y2VwdGlvbkNsb3NlKFJDQ2FsbEVuZFJlYXNvbi5ORVRXT1JLX0VSUk9SKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxDbGllbnQgX2pvaW5Sb29tXSBqb2luIHJvb20gZmFpbGVkOiByb29tSWQgLT4gJHtyb29tSWR9IFJDUlRDQ29kZSAtPiAke2NvZGV9YCk7XG4gICAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5KT0lOX1JPT01fRVJST1IgfTtcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiDpkojlr7nnp4HmnInkupEgQHJvbmdjbG91ZC9wbHVnaW4tcnRjQDUuMS4xMC1lbnRlcnByaXNlLjcg5aKe5Yqg6KGl5LiB77yMXG4gICAgICAgKiDnp4HmnInkupHljYflrowgUlRDIHNkayDniYjmnKzlkI7liKDmjonmraTooaXkuIFcbiAgICAgICAqIOWKoOWujOaIv+mXtOWQju+8jOWvueaWueaMguaWreS6hu+8jOmcgOmAgOWHuuaIv+mXtFxuICAgICAgICovXG4gICAgICBpZiAodGhpcy5fc3RhdGVNYWNoaW5lLmdldFN0YXRlKCkgPT09IFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5fcnRjQ2xpZW50LmxlYXZlUm9vbShyb29tISk7XG4gICAgICAgIHRoaXMuX3Jvb20gPSBudWxsIGFzIHVua25vd24gYXMgUkNSVENSb29tO1xuICAgICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUyB9O1xuICAgICAgfVxuXG4gICAgICAvLyDooqvlj6vmlrnliqDlhaXmiL/pl7TmiJDlip/vvIzkvYbkuLvlj6vmlrnlnKjliqDlhaXmiL/pl7TliY3nprvnur9cbiAgICAgIGlmICh1c2VySWRzIS5sZW5ndGggPCAxKSB7XG4gICAgICAgIHRoaXMuam9pblJvb21UaW1lciA9IG5ldyBUaW1lcigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLlJFTU9URV9ORVRXT1JLX0VSUk9SKTtcbiAgICAgICAgfSwgNjAwMDApO1xuICAgICAgfVxuICAgICAgdGhpcy5fcm9vbSA9IHJvb20gYXMgUkNSVENSb29tO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uTkVUV09SS19FUlJPUik7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gX2pvaW5Sb29tXSBfcnRjQ2xpZW50LmpvaW5SVENSb29tIHRocm93IGV4Y2VwdGlvbiByb29tSWQgLT4gJHtyb29tSWR9YCk7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5KT0lOX1JPT01fRVJST1IgfTtcbiAgICB9XG5cbiAgICAvLyDmiL/pl7TkuIrms6jlhoznm5HlkKzkuovku7ZcbiAgICB0aGlzLl9yZWdpc3RlclJvb21FdmVudExpc3RlbmVyKCk7XG5cbiAgICAvLyDms6jlhozmiL/pl7TotKjph4/mlbDmja7nm5HlkKzlmahcbiAgICB0aGlzLl9yZWdpc3RlclJlcG9ydExpc3RlbmVyKCk7XG5cbiAgICB0cnkge1xuICAgICAgLy8g6K6i6ZiF6L+c56iL55qE5rWB77yM5oqK6L+c56iL55qE5rWB5oqb57uZ55So5oi3XG4gICAgICBhd2FpdCB0aGlzLl9zdWJzY3JpYmVJblJvb21SZW1vdGVUcmFjaygpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyDnu5PmnZ/pgJror51zZXNzaW9uXG4gICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uU1VCU0NSSUJFX0VSUk9SKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBfam9pblJvb21dIF9zdWJzY3JpYmVJblJvb21SZW1vdGVUcmFjayBFeGNlcHRpb24gcm9vbUlkIC0+ICR7cm9vbUlkfWApO1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuSk9JTl9ST09NX0VSUk9SIH07XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIOW+gOaIv+mXtOmHjOWPkeW4g+acrOWcsOi1hOa6kFxuICAgICAgYXdhaXQgdGhpcy5fcHVibGlzaCgpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyDnu5PmnZ/pgJror51zZXNzaW9uXG4gICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uUFVCTElTSF9FUlJPUik7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gX2pvaW5Sb29tXSBfcHVibGlzaCBFeGNlcHRpb24gcm9vbUlkIC0+ICR7cm9vbUlkfWApO1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuSk9JTl9ST09NX0VSUk9SIH07XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICAvKipcbiAgICogKOWIneWni+WMluaIv+mXtOeahOaXtuWAmSkg6K6i6ZiF6L+c56iL55qE5rWB77yM5oqK6L+c56iL55qE5rWB5oqb57uZ55So5oi3XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9zdWJzY3JpYmVJblJvb21SZW1vdGVUcmFjaygpIHtcbiAgICAvLyDojrflj5bmiYDmnInov5znqIvlt7Llj5HluIPnmoTpn7Pop4bpopHotYTmupDliJfooahcbiAgICBjb25zdCB0cmFja3M6IFJDUmVtb3RlVHJhY2tbXSA9IHRoaXMuX3Jvb20uZ2V0UmVtb3RlVHJhY2tzKCk7XG4gICAgaWYgKHRyYWNrcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fc3Vic2NyaWJlUmV0cnkodHJhY2tzLCB0aGlzLl9vcHRpb25zLmlzQWxsb3dTdWJzY3JpYmVSZXRyeSwgdGhpcy5fUkVUUllDT1VOVCk7XG4gICAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLlNVQlNDUklCRV9FUlJPUik7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBfc3Vic2NyaWJlSW5Sb29tUmVtb3RlVHJhY2tdIFJlc291cmNlIHN1YnNjcmlwdGlvbiBmYWlsZWQgcm9vbUlkIC0+ICR7dGhpcy5fc3RhdGVNYWNoaW5lLmdldENhbGxJZCgpfSBSVEMgY29kZSAtPiAke2NvZGV9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOWPr+S7pemHjeivleeahOiuoumYhVxuICAgKiBAcGFyYW0gcGFyYW1zLnRyYWNrcyB0cmFja3NcbiAgICogQHBhcmFtIHBhcmFtcy5pc0FsbG93U3Vic2NyaWJlUmV0cnkg5piv5ZCm5YWB6K646YeN6K+VXG4gICAqIEBwYXJhbSBwYXJhbXMuY291bnQg5YWB6K646YeN6K+V55qE5qyh5pWwXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9zdWJzY3JpYmVSZXRyeSh0cmFja3M6IFJDUmVtb3RlVHJhY2tbXSwgaXNBbGxvd1N1YnNjcmliZVJldHJ5OiBib29sZWFuID0gZmFsc2UsIGNvdW50OiBudW1iZXIgPSAwKTogUHJvbWlzZTx7IGNvZGU6IFJDUlRDQ29kZSB9PiB7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9yb29tLnN1YnNjcmliZSh0cmFja3MpO1xuICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uVHJhY2tTdWJzY3JpYmVGYWlsICYmIHRoaXMuX2xpc3RlbmVyIS5vblRyYWNrU3Vic2NyaWJlRmFpbChjb2RlLCB0aGlzKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbl0gX2xpc3RlbmVyLm9uVHJhY2tTdWJzY3JpYmVGYWlsIGV4Y2VwdGlvbicpO1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIH1cblxuICAgICAgLy8g5aaC5p6c5LiN5YWB6K646YeN6K+V77yM55u05o6l6L+U5ZueXG4gICAgICBpZiAoIWlzQWxsb3dTdWJzY3JpYmVSZXRyeSkge1xuICAgICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgICB9XG4gICAgICBpZiAoY291bnQgPiAwKSB7XG4gICAgICAgIGNvdW50LS07XG4gICAgICAgIHJldHVybiB0aGlzLl9zdWJzY3JpYmVSZXRyeSh0cmFja3MsIGlzQWxsb3dTdWJzY3JpYmVSZXRyeSwgY291bnQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog5Y+R5biD5pys5Zyw6LWE5rqQ55qE6YC76L6RXG4gICAqXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9wdWJsaXNoKCkge1xuICAgIGNvbnN0IHRyYWNrcyA9IHRoaXMuX29wdGlvbnMubG9jYWxUcmFja3MhO1xuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fcHVibGlzaFJldHJ5KHRyYWNrcywgdGhpcy5fb3B0aW9ucy5pc0FsbG93UHVibGlzaFJldHJ5LCB0aGlzLl9SRVRSWUNPVU5UKTtcblxuICAgIC8vIOiLpei1hOa6kOWPkeW4g+Wksei0pVxuICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLlBVQkxJU0hfRVJST1IpO1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gX3B1Ymxpc3RdIFJlc291cmNlIHB1Ymxpc2hpbmcgZmFpbGVkOiByb29tSWQgLT4gJHt0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0Q2FsbElkKCl9IFJDUlRDQ29kZSAtPiAke2NvZGV9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g5aaC5p6c5piv5Li75Yqo5Y+R6LW355qE5ZG85Y+r77yM5bey5o+Q5YmN5oqb5Ye65LqG6LWE5rqQLCDooqvliqjlkbzlj6vvvIzov5nph4zmiY3pnIDopoHmipvlh7pcbiAgICBpZiAodGhpcy5fb3B0aW9ucy5wcm9kdWNlVHlwZSA9PT0gUHJvZHVjZVR5cGVzLkNBTExFRSkge1xuICAgICAgLy8g5ZCR5aSW5oqb5Ye65pys5Zyw5rWBLCDpgJrnn6XkuJrliqHlsYJ0cmFja1JlYWR5XG4gICAgICB0aGlzLl9ub3RpZnlUcmFja1JlYWR5KHRyYWNrcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOWPr+S7pemHjeivleeahOWPkeW4g1xuICAgKiBAcGFyYW0gcGFyYW1zLnRyYWNrcyB0cmFja3NcbiAgICogQHBhcmFtIHBhcmFtcy5pc0FsbG93UHVibGlzaFJldHJ5IOaYr+WQpuWFgeiuuOmHjeivlVxuICAgKiBAcGFyYW0gcGFyYW1zLmNvdW50IOWFgeiuuOmHjeivleeahOasoeaVsFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfcHVibGlzaFJldHJ5KHRyYWNrczogUkNMb2NhbFRyYWNrW10sIGlzQWxsb3dQdWJsaXNoUmV0cnk6IGJvb2xlYW4gPSBmYWxzZSwgY291bnQ6IG51bWJlciA9IDApOiBQcm9taXNlPHsgY29kZTogUkNSVENDb2RlIH0+IHtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3Jvb20ucHVibGlzaCh0cmFja3MpO1xuICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uVHJhY2tQdWJsaXNoRmFpbCAmJiB0aGlzLl9saXN0ZW5lciEub25UcmFja1B1Ymxpc2hGYWlsKGNvZGUsIHRoaXMpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxTZXNzaW9uXSBfbGlzdGVuZXIub25UcmFja1B1Ymxpc2hGYWlsIGV4Y2VwdGlvbicpO1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIH1cblxuICAgICAgLy8g5aaC5p6c5LiN5YWB6K646YeN6K+V77yM55u05o6l6L+U5ZueXG4gICAgICBpZiAoIWlzQWxsb3dQdWJsaXNoUmV0cnkpIHtcbiAgICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgICAgfVxuICAgICAgaWYgKGNvdW50ID4gMCkge1xuICAgICAgICBjb3VudC0tO1xuICAgICAgICByZXR1cm4gdGhpcy5fcHVibGlzaFJldHJ5KHRyYWNrcywgaXNBbGxvd1B1Ymxpc2hSZXRyeSwgY291bnQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog6YCA5Ye65oi/6Ze0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9sZWF2ZVJvb20oKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIOmAgOWHuuaIv+mXtFxuICAgICAgY29uc3QgY2FsbEJhY2sgPSBhd2FpdCB0aGlzLl9ydGNDbGllbnQubGVhdmVSb29tKHRoaXMuX3Jvb20pO1xuICAgICAgLy8g5oiQ5Yqf6YCA5Ye65oi/6Ze077yM6Kem5Y+RUkNDYWxsQ2xpZW505a6e5L6L5LiK55qEb25TZXNzaW9uQ2xvc2Xnm5HlkKzvvIzmipvnu5nnlKjmiLfkv6Hmga9cbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxTZXNzaW9uIF9sZWF2ZVJvb21dIFN1Y2Nlc3NmdWxseSBleGl0ZWQgdGhlIHJvb20gY29kZTogJHtjYWxsQmFjay5jb2RlfWApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbFNlc3Npb24gX2xlYXZlUm9vbV0gbGVhdmVSb29tIHRocm93IGV4Y2VwdGlvbicpO1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGNvbnN0IHN1bW1hcnlJbmZvID0gdGhpcy5fc3RhdGVNYWNoaW5lLmdldFN1bW1hcnkoKTtcbiAgICAgIGV2ZW50RW1pdHRlci5lbWl0KCdzZXNzaW9uQ2xvc2UnLCB7IHNlc3Npb246IHRoaXMsIHN1bW1hcnlJbmZvIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDlh7rnjrDlvILluLjlkI7opoHlpITnkIbnmoTpgLvovpEsXG4gICAqIEBwYXJhbSBlbmRSZWFzb24g5Y6f5ZugXG4gICAqL1xuICBwcml2YXRlIF9leGNlcHRpb25DbG9zZShlbmRSZWFzb246IFJDQ2FsbEVuZFJlYXNvbikge1xuICAgIC8vIOmUgOavgeacrOWcsOa1gVxuICAgIHRoaXMuX29wdGlvbnMubG9jYWxUcmFja3MgJiYgdGhpcy5fZGVzdHJveVRyYWNrcyh0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzKTtcblxuICAgIC8vIOe7k+adn+eKtuaAgeaculxuICAgIHRoaXMuX3N0YXRlTWFjaGluZS5jbG9zZShlbmRSZWFzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIOeUqOaIt+iwg+eUqOeahO+8jOazqOWGjHNlc3Npb27kuIrnmoTnm5HlkKxcbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclNlc3Npb25MaXN0ZW5lcihsaXN0ZW5lcjogSVNlc3Npb25MaXN0ZW5lcik6IHZvaWQge1xuICAgIC8vIOWFiOagoemqjGxpc3RlbmVyLCDlpoLmnpzkuI3pgJrov4fvvIzkvJp0cm93IGVycm9yXG4gICAgY29uc3QgY29uY2x1c2lvbjogSVZhbGlkYXRpb25SZXN1bHQgPSB2YWxpZGF0ZUxpc3RlbmVyKGxpc3RlbmVyKTtcbiAgICBpZiAoIWNvbmNsdXNpb24ucmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtSQ0NhbGxTZXNzaW9uIHJlZ2lzdGVyU2Vzc2lvbkxpc3RlbmVyXSAke2NvbmNsdXNpb24ubXNnfWApO1xuICAgIH1cbiAgICB0aGlzLl9saXN0ZW5lciA9IHsgLi4ubGlzdGVuZXIgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDosINSVEMgQVBJIOiOt+W+l+acrOWcsOa1gVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfZ2V0TG9jYWxUcmFja0NvcmUobWVkaWFUeXBlOiBSQ0NhbGxNZWRpYVR5cGUsIGNvbnN0cmFpbnRzPzogSU1lZGlhU3RyZWFtQ29uc3RyYWludHMpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLCB0cmFja3M/OiBSQ0xvY2FsVHJhY2tbXSB9PiB7XG4gICAgLy8g5qOA5rWL5piv5ZCm6IO95aSf6I635b6X5pys5Zyw5rWBXG4gICAgaWYgKG1lZGlhVHlwZSA9PT0gUkNDYWxsTWVkaWFUeXBlLkFVRElPKSB7XG4gICAgICBjb25zdCB7IGNvZGUsIHRyYWNrIH0gPSBhd2FpdCB0aGlzLl9ydGNDbGllbnQuY3JlYXRlTWljcm9waG9uZUF1ZGlvVHJhY2soJ1JvbmdDbG91ZFJUQycsIGNvbnN0cmFpbnRzICYmIGNvbnN0cmFpbnRzLmF1ZGlvICYmIHsgLi4uY29uc3RyYWludHMuYXVkaW8gfSk7XG4gICAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIF9nZXRMb2NhbFRyYWNrQ29yZV0gZ2V0IEF1ZGlvIGxvY2FsIHRyYWNrcyBmYWlsZWQgUkNUIGNvZGUgLT4gJHtjb2RlfWApO1xuICAgICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuR0VUX0xPQ0FMX0FVRElPX1RSQUNLX0VSUk9SIH07XG4gICAgICB9XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsICdbUkNDYWxsU2Vzc2lvbiBfZ2V0TG9jYWxUcmFja0NvcmVdIHN1Y2Nlc3NmdWxseSBnZXQgQXVkaW8gbG9jYWwgdHJhY2tzJyk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUywgdHJhY2tzOiBbdHJhY2shXSB9O1xuICAgIH1cbiAgICBjb25zdCB7IGNvZGUsIHRyYWNrcyB9ID0gYXdhaXQgdGhpcy5fcnRjQ2xpZW50LmNyZWF0ZU1pY3JvcGhvbmVBbmRDYW1lcmFUcmFja3MoJ1JvbmdDbG91ZFJUQycsIGNvbnN0cmFpbnRzICYmIHsgLi4uY29uc3RyYWludHMgfSk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gX2dldExvY2FsVHJhY2tDb3JlXSBnZXQgQXVkaW8gYW5kIFZpZGVvIGxvY2FsIHRyYWNrcyBmYWlsZWQgUkNUIGNvZGUgLT4gJHtjb2RlfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLkdFVF9MT0NBTF9BVURJT19BTkRfVklERU9fVFJBQ0tfRVJST1IgfTtcbiAgICB9XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCAnW1JDQ2FsbFNlc3Npb24gX2dldExvY2FsVHJhY2tDb3JlXSBzdWNjZXNzZnVsbHkgZ2V0IGF1ZGlvIGFuZCB2aWRlbyBsb2NhbCB0cmFja3MnKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUywgdHJhY2tzIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9nZXRMb2NhbFRyYWNrKG1lZGlhVHlwZTogUkNDYWxsTWVkaWFUeXBlLCBjb25zdHJhaW50cz86IElNZWRpYVN0cmVhbUNvbnN0cmFpbnRzKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSwgdHJhY2tzPzogUkNMb2NhbFRyYWNrW10gfT4ge1xuICAgIC8vIOW5tuS4lOaYr+iOt+W+l+mfs+inhumikSwg5bm25LiUIO+8iOWmguaenOiOt+W+l+mfs+inhumikeS4jeaIkOWKn++8jOWFgeiuuOmZjee6p+iOt+W+l+mfs+mike+8iVxuICAgIGlmICh0aGlzLl9vcHRpb25zLmlzQWxsb3dEZW1vdGlvbkdldFN0cmVhbSAmJiBtZWRpYVR5cGUgPT09IFJDQ2FsbE1lZGlhVHlwZS5BVURJT19WSURFTykge1xuICAgICAgY29uc3QgeyBjb2RlLCB0cmFja3MgfSA9IGF3YWl0IHRoaXMuX2dldExvY2FsVHJhY2tDb3JlKFJDQ2FsbE1lZGlhVHlwZS5BVURJT19WSURFTywgY29uc3RyYWludHMpO1xuXG4gICAgICAvLyDlpoLmnpzpn7Pop4bpopHkuI3og73ojrflvpfvvIzlsLHpmY3nuqfojrflvpfpn7PpopFcbiAgICAgIGlmIChjb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgICBjb25zdCB7IGNvZGUsIHRyYWNrcyB9ID0gYXdhaXQgdGhpcy5fZ2V0TG9jYWxUcmFja0NvcmUoUkNDYWxsTWVkaWFUeXBlLkFVRElPLCBjb25zdHJhaW50cyk7XG4gICAgICAgIGlmIChjb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgICAgIC8vIOiOt+WPlui1hOa6kOWksei0pe+8jOmcgOimgeiwg+eKtuaAgeacunN0YXRlIOS4uiBlbmRcbiAgICAgICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uR0VUX01FRElBX1JFU09VUkNFU19FUlJPUik7XG4gICAgICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGNvZGUsIHRyYWNrcyB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgY29kZSwgdHJhY2tzIH07XG4gICAgfVxuICAgIGNvbnN0IHsgY29kZTogX2NvZGUsIHRyYWNrcyB9ID0gYXdhaXQgdGhpcy5fZ2V0TG9jYWxUcmFja0NvcmUobWVkaWFUeXBlLCBjb25zdHJhaW50cyk7XG4gICAgaWYgKF9jb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgLy8g6I635Y+W6LWE5rqQ5aSx6LSl77yM6ZyA6KaB6LCD54q25oCB5py6c3RhdGUg5Li6IGVuZFxuICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLkdFVF9NRURJQV9SRVNPVVJDRVNfRVJST1IpO1xuXG4gICAgICByZXR1cm4geyBjb2RlOiBfY29kZSB9O1xuICAgIH1cbiAgICByZXR1cm4geyBjb2RlOiBfY29kZSwgdHJhY2tzIH07XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d5Lit5pu05o2i6Z+z6aKR6K6+5aSHXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY2hhbmdlQXVkaW9EZXZpY2UoYXVkaW9Db25zdHJhaW50cz86IElNaWNwaG9uZUF1ZGlvUHJvZmlsZSk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUgfT4ge1xuICAgIC8vIOaWsOiuvuWkh+eahHRyYWNrXG4gICAgY29uc3QgcmVjZW50VHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSA9IFtdO1xuXG4gICAgLy8g5pW055CG5ZCO55qE5pys5ZywdHJhY2tcbiAgICBjb25zdCBsb2NhbFRyYWNrczogUkNMb2NhbFRyYWNrW10gPSBbXTtcbiAgICBjb25zdCB7IGNvZGUsIHRyYWNrIH0gPSBhd2FpdCB0aGlzLl9ydGNDbGllbnQuY3JlYXRlTWljcm9waG9uZUF1ZGlvVHJhY2soJ1JvbmdDbG91ZFJUQycsIGF1ZGlvQ29uc3RyYWludHMpO1xuICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIGNoYW5nZURldmljZV0gZ2V0IGxvY2FsIEF1ZGlvIHRyYWNrcyBmYWlsZWQgUkNUTGliIGNvZGUgLT4gJHtjb2RlfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLkdFVF9MT0NBTF9BVURJT19UUkFDS19FUlJPUiB9O1xuICAgIH1cblxuICAgIHRoaXMuX29wdGlvbnMubG9jYWxUcmFja3MgJiYgdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcy5mb3JFYWNoKCh0cmFjazogUkNMb2NhbFRyYWNrKSA9PiB7XG4gICAgICBpZiAodHJhY2suaXNBdWRpb1RyYWNrKCkpIHtcbiAgICAgICAgLy8g5LmL5YmN55qE6Z+z6aKR6YO96ZSA5q+B77yM77yIUlRDTGliIFNES+WGhemDqOS8muWcqCBhZGRMb2NhbFRyYWNrIOa4heeQhuWQjOexu+Wei+i9qOmBk+aVsOaNru+8jOaJgOS7pei/memHjOazqOmHiuaOie+8iVxuICAgICAgICAvLyB0cmFjay5kZXN0cm95KClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOWPquaKiuS5i+WJjeeahOinhumikeeVmeS4i1xuICAgICAgICBsb2NhbFRyYWNrcy5wdXNoKHRyYWNrKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJlY2VudFRyYWNrcy5wdXNoKHRyYWNrISk7XG5cbiAgICAvLyDliqDkuIrmnKzlnLDmlrDkuqfnlJ/nmoTpn7PpopFcbiAgICBsb2NhbFRyYWNrcy5wdXNoKHRyYWNrISk7XG4gICAgdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyA9IGxvY2FsVHJhY2tzO1xuICAgIC8vIOmAmuefpeS4muWKoeWxgnRyYWNrUmVhZHlcbiAgICB0aGlzLl9ub3RpZnlUcmFja1JlYWR5KHJlY2VudFRyYWNrcyk7XG5cbiAgICAvLyDlpoLmnpzlvZPliY3lt7LliqDlhaXmiL/pl7TvvIzlj5HluIPmlrDmtYFcbiAgICBpZiAodGhpcy5fcm9vbSkge1xuICAgICAgLy8g5Y+R5biD5paw5rWBXG4gICAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3Jvb20ucHVibGlzaChyZWNlbnRUcmFja3MpO1xuICAgICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5BVURJT19QVUJMSVNIX0VSUk9SIH07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICAvKipcbiAgICog576k5ZG85Y+r5Lit57un57ut6YKA6K+3XG4gICAqIEBwYXJhbSB1c2VySWRzIOiiq+mCgOivt+eUqOaItyBJRCDliJfooahcbiAgICogQHBhcmFtIG9wdGlvbnMuZXh0cmEg5raI5oGv55qE5omp5bGV5L+h5oGvXG4gICAqIEBkZXByZWNhdGVkIDUuMS4yIOW6n+W8gyBvcHRpb25zLnB1c2hUaXRsZSDpgJrnn6XnmoTmoIfpophcbiAgICogQGRlcHJlY2F0ZWQgNS4xLjIg5bqf5byDIG9wdGlvbnMucHVzaENvbnRlbnQg6YCa55+l5YaF5a65XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaW52aXRlKHVzZXJJZHM6IHN0cmluZ1tdLCBvcHRpb25zOiBJSW52aXRlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSB9PiB7XG4gICAgY29uc3QgeyBleHRyYSA9ICcnIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHsgcHVzaFRpdGxlID0gJycsIHB1c2hDb250ZW50ID0gJycgfSA9ICh0aGlzLl9vcHRpb25zLmNhbGxQdXNoQ29uZmlnPy5wdXNoVGl0bGUgfHwgdGhpcy5fb3B0aW9ucy5jYWxsUHVzaENvbmZpZz8ucHVzaENvbnRlbnQpID8gdGhpcy5fb3B0aW9ucy5jYWxsUHVzaENvbmZpZyA6IG9wdGlvbnM7XG4gICAgY29uc3QgY29uY2x1c2lvbjogSVZhbGlkYXRpb25SZXN1bHRbXSA9IFt2YWxpZGF0ZVVzZXJJZHModXNlcklkcyksIHZhbGlkYXRlRXh0cmEoZXh0cmEpLCB2YWxpZGF0ZVB1c2hUaXRsZShwdXNoVGl0bGUpLCB2YWxpZGF0ZVB1c2hDb250ZW50KHB1c2hDb250ZW50KV07XG4gICAgY29uc3QgbWVzc2FnZXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgcmVzdWx0ID0gY29uY2x1c2lvbi5ldmVyeSgob2JqOiBJVmFsaWRhdGlvblJlc3VsdCkgPT4ge1xuICAgICAgIW9iai5yZXN1bHQgJiYgbWVzc2FnZXMucHVzaChvYmoubXNnISk7XG4gICAgICByZXR1cm4gb2JqLnJlc3VsdDtcbiAgICB9KTtcblxuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtSQ0NhbGxDbGllbnQgaW52aXRlXSAke21lc3NhZ2VzLmpvaW4oJ1xcbicpfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fc3RhdGVNYWNoaW5lLmludml0ZSh1c2VySWRzLCB7IGV4dHJhLCBwdXNoVGl0bGUsIHB1c2hDb250ZW50IH0pO1xuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlkIzmhI/mjqXlkKxcbiAgICovXG4gIHB1YmxpYyBhc3luYyBhY2NlcHQoY29uc3RyYWludHM/OiBJTWVkaWFTdHJlYW1Db25zdHJhaW50cyk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUgfT4ge1xuICAgIGNvbnN0IGNvbmNsdXNpb246IElWYWxpZGF0aW9uUmVzdWx0ID0gdmFsaWRhdGVNZWRpYVN0cmVhbUNvbnN0cmFpbnRzKGNvbnN0cmFpbnRzISk7XG4gICAgaWYgKCFjb25jbHVzaW9uLnJlc3VsdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBbUkNDYWxsU2Vzc2lvbiBhY2NlcHRdICR7Y29uY2x1c2lvbi5tc2d9YCk7XG4gICAgfVxuXG4gICAgLy8g5o6l5ZCs5LmL5YmN77yM5YWI5oyC5pat5b2T5YmN5LmL5aSW55qEc2Vzc2lvbu+8jOeOsOmYtuauteS4jeWFgeiuuOeUqOaIt+WFiOaLqeaOpeWQrHNlc3Npb27vvIzkuovlhYjkvJrlnKjnirbmgIHmnLrlhoXpg6jmjILmlq3vvIzov5nph4zmipvlh7rljrvvvIzkvJrmuIXnkIblhbblroPnmoRzZWVzaW9uXG4gICAgZXZlbnRFbWl0dGVyLmVtaXQoJ2h1bmd1cE90aGVyU2Vzc2lvbicsIHsgc2Vzc2lvbjogdGhpcyB9KTtcbiAgICBjb25zdCBtZWRpYVR5cGUgPSB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0TWVkaWFUeXBlKCk7XG4gICAgY29uc3QgeyBjb2RlOiBfY29kZSwgdHJhY2tzIH0gPSBhd2FpdCB0aGlzLl9nZXRMb2NhbFRyYWNrKG1lZGlhVHlwZSwgY29uc3RyYWludHMpO1xuICAgIGlmIChfY29kZSAhPT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IF9jb2RlIH07XG4gICAgfVxuICAgIHRoaXMuX29wdGlvbnMubG9jYWxUcmFja3MgPSB0cmFja3M7XG5cbiAgICAvLyDlj5HpgIHmjqXlkKznmoTmtojmga9cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3N0YXRlTWFjaGluZS5hY2NlcHQoKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBhY2NlcHRdU2VuZCBhY2NlcHQgbWVzc2FnZSBmYWlsZWQgLT4gY29kZTogJHtjb2RlfWApO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog5oyC5patXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaHVuZ3VwKCk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGU7IH0+IHtcbiAgICAvLyBjb25zdCBzdW1tYXJ5SW5mbyA9IHRoaXMuX3N0YXRlTWFjaGluZS5nZXRTdW1tYXJ5KClcbiAgICAvLyBldmVudEVtaXR0ZXIuZW1pdCgnc2Vzc2lvbkNsb3NlJywgeyBzZXNzaW9uOiB0aGlzLCBzdW1tYXJ5SW5mbyB9KVxuICAgIHJldHVybiB0aGlzLl9zdGF0ZU1hY2hpbmUuaHVuZ3VwKCk7XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d5aqS5L2T5Y+Y5pu0XG4gICAqICBAcGFyYW0gbWVkaWFUeXBlIFJDQ2FsbE1lZGlhVHlwZS5BVURJTyDmlLnkuLrpn7PpopHpgJror50gfCBSQ0NhbGxNZWRpYVR5cGUuQVVESU9fVklERU8g5pS55Li66Z+z6KeG6aKR6YCa6K+dXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgX2NoYW5nZU1lZGlhVHlwZShtZWRpYVR5cGU6IFJDQ2FsbE1lZGlhVHlwZSk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUgfT4ge1xuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fc3RhdGVNYWNoaW5lLmNoYW5nZU1lZGlhVHlwZShtZWRpYVR5cGUpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIF9jaGFuZ2VNZWRpYVR5cGVdIGNoYW5nZSBtZWRpYSB0eXBlIGZhaWwgY29kZS0+ICR7Y29kZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+W+l+acrOWcsOinhumikVxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0TG9jYWxWaWRlb1RyYWNrcygpOiBSQ0xvY2FsVHJhY2tbXSB7XG4gICAgbGV0IGxvY2FsVmlkZW9UcmFja3M6IFJDTG9jYWxUcmFja1tdID0gW107XG4gICAgaWYgKCF0aGlzLl9yb29tKSB7XG4gICAgICByZXR1cm4gbG9jYWxWaWRlb1RyYWNrcztcbiAgICB9XG4gICAgaWYgKHRoaXMuX29wdGlvbnMubG9jYWxUcmFja3MpIHtcbiAgICAgIGxvY2FsVmlkZW9UcmFja3MgPSB0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzLmZpbHRlcigodHJhY2spID0+IHRyYWNrLmlzVmlkZW9UcmFjaygpKTtcbiAgICB9XG4gICAgcmV0dXJuIGxvY2FsVmlkZW9UcmFja3M7XG4gIH1cblxuICAvKipcbiAgICog6I635b6X5pys5Zyw6Z+z6aKRXG4gICAqL1xuICBwcml2YXRlIF9nZXRMb2NhbEF1ZGlvVHJhY2tzKCk6IFJDTG9jYWxUcmFja1tdIHtcbiAgICBsZXQgbG9jYWxBdWRpb3RyYWNrczogUkNMb2NhbFRyYWNrW10gPSBbXTtcbiAgICBpZiAoIXRoaXMuX3Jvb20pIHtcbiAgICAgIHJldHVybiBsb2NhbEF1ZGlvdHJhY2tzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcykge1xuICAgICAgbG9jYWxBdWRpb3RyYWNrcyA9IHRoaXMuX29wdGlvbnMubG9jYWxUcmFja3MuZmlsdGVyKCh0cmFjaykgPT4gdHJhY2suaXNBdWRpb1RyYWNrKCkpO1xuICAgIH1cbiAgICByZXR1cm4gbG9jYWxBdWRpb3RyYWNrcztcbiAgfVxuXG4gIC8qKlxuICAgKiDmiorpgJror53nmoRNZWRpYVR5cGXljYfnuqfliLDpn7Pop4bpopFcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX3NldE1lZGlhVHlwZVRvQXVkaW9BbmRWaWRlbygpIHtcbiAgICAvLyDojrflvpfmnKznq6/op4bpopHotYTmupBcbiAgICBjb25zdCB7IGNvZGUsIHRyYWNrIH0gPSBhd2FpdCB0aGlzLl9ydGNDbGllbnQuY3JlYXRlQ2FtZXJhVmlkZW9UcmFjaygpO1xuICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLkdFVF9MT0NBTF9BVURJT19BTkRfVklERU9fVFJBQ0tfRVJST1IgfTtcbiAgICB9XG5cbiAgICAvLyDlj5HluIPmnKznq6/op4bpopHotYTmupBcbiAgICBjb25zdCB7IGNvZGU6IF9jb2RlIH0gPSBhd2FpdCB0aGlzLl9yb29tLnB1Ymxpc2goW3RyYWNrIV0pO1xuXG4gICAgLy8g6Iul6LWE5rqQ5Y+R5biD5aSx6LSlXG4gICAgaWYgKF9jb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIF9lbmFibGVWaWRlb10gUmVzb3VyY2UgcHVibGlzaGluZyBmYWlsZWQ6IFJDUlRDQ29kZSAtPiAke2NvZGV9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g6YCa55+l5Lia5Yqh5bGCdHJhY2tSZWFkeVxuICAgIHRoaXMuX25vdGlmeVRyYWNrUmVhZHkoW3RyYWNrIV0pO1xuXG4gICAgLy8g5Y+R5raI5oGvXG4gICAgdGhpcy5fY2hhbmdlTWVkaWFUeXBlKFJDQ2FsbE1lZGlhVHlwZS5BVURJT19WSURFTyk7XG4gIH1cblxuICAvKipcbiAgICog5oqK6YCa6K+d55qETWVkaWFUeXBl6ZmN57qn5Yiw6Z+z6aKRXG4gICAqIEBwYXJhbSBpc1NlbmRNZXNzc2FnZSDmmK/lkKbpnIDopoHlj5Hmtojmga8sIOm7mOiupOWPkea2iOaBr1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfc2V0TWVkaWFUeXBlVG9BdWRpbygpIHtcbiAgICBjb25zdCB0cmFja3M6IFJDTG9jYWxUcmFja1tdID0gdGhpcy5fZ2V0TG9jYWxWaWRlb1RyYWNrcygpO1xuICAgIGlmICh0cmFja3MubGVuZ3RoKSB7XG4gICAgICAvLyDnpoHnlKjop4bpopFcbiAgICAgIHRyYWNrcy5mb3JFYWNoKCh0cmFjazogUkNMb2NhbFRyYWNrKSA9PiB7XG4gICAgICAgIHRyYWNrLm11dGUoKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyDlj5bmtojlj5HluIPop4bpopFcbiAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fcm9vbS51bnB1Ymxpc2godHJhY2tzKTtcbiAgICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gZGlzYWJsZVZpZGVvXSB1bnB1Ymxpc2ggZmFpbGVkIC0+ICR7Y29kZX1gKTtcbiAgICAgIH1cblxuICAgICAgLy8g5YWz6Zet5pGE5YOP5aS0XG4gICAgICB0aGlzLl9kZXN0cm95VHJhY2tzKHRyYWNrcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOmAmuivnemZjee6p++8jOebruWJjemcgOaxguWPquWBmumAmuivnemZjee6p++8jOmfs+inhumikeWPr+S7pemZjee6p+S4uumfs+mike+8jOmfs+mikeS4jeiDveWNh+WIsOmfs+inhumikSwg5Y+R5raI5oGv5oiQ5Yqf5omN566X6ZmN57qn5oiQ5YqfXG4gICAqXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGVzY2VuZEFiaWxpdHkoKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSB9PiB7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9jaGFuZ2VNZWRpYVR5cGUoUkNDYWxsTWVkaWFUeXBlLkFVRElPKTtcbiAgICBpZiAoY29kZSA9PT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX3NldE1lZGlhVHlwZVRvQXVkaW8oKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOemgeeUqOinhumikXRyYWNrXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGlzYWJsZVZpZGVvVHJhY2soKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSB9PiB7XG4gICAgaWYgKCF0aGlzLl9yb29tKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gZGlzYWJsZUF1ZGlvVHJhY2tdIFJvb20gbWlzc2luZyBhdWRpbyB0cmFjayAtPiAke1JDQ2FsbEVycm9yQ29kZS5OT1RfSU5fUk9PTV9FUlJPUn1gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5OT1RfSU5fUk9PTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGNvbnN0IHRyYWNrczogUkNMb2NhbFRyYWNrW10gPSB0aGlzLl9nZXRMb2NhbFZpZGVvVHJhY2tzKCk7XG4gICAgaWYgKCF0cmFja3MubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gZGlzYWJsZVZpZGVvVHJhY2tdIFJvb20gbWlzc2luZyB2aWRlbyB0cmFjayAtPiAke1JDQ2FsbEVycm9yQ29kZS5NSVNTSU5HX1ZJREVPX1RSQUNLX0VSUk9SfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLk1JU1NJTkdfVklERU9fVFJBQ0tfRVJST1IgfTtcbiAgICB9XG5cbiAgICAvLyDnpoHnlKjop4bpopFcbiAgICB0cmFja3MuZm9yRWFjaCgodHJhY2s6IFJDTG9jYWxUcmFjaykgPT4ge1xuICAgICAgdHJhY2subXV0ZSgpO1xuICAgIH0pO1xuXG4gICAgLy8g5aaC5p6c5LiN6ZyA5YWz6Zet5pGE5YOP5aS0XG4gICAgaWYgKCF0aGlzLl9vcHRpb25zLmlzT2ZmQ2FtZXJhV2hlblZpZGVvRGlzYWJsZSkge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG5cbiAgICAvLyDlj5bmtojlj5HluIPop4bpopFcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3Jvb20udW5wdWJsaXNoKHRyYWNrcyk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gZGlzYWJsZVZpZGVvXSB1bnB1Ymxpc2ggZmFpbGVkIC0+ICR7Y29kZX1gKTtcblxuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlVOUFVCTElTSF9WSURFT19FUlJPUiB9O1xuICAgIH1cblxuICAgIHRyYWNrcy5mb3JFYWNoKCh0cmFjazogUkNMb2NhbFRyYWNrKSA9PiB7XG4gICAgICAvLyDlhbPpl63mkYTlg4/lpLRcbiAgICAgIHRyYWNrLmRlc3Ryb3koKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICAvKipcbiAgICog5ZCv55So6KeG6aKRdHJhY2tcbiAgICovXG4gIHB1YmxpYyBhc3luYyBlbmFibGVWaWRlb1RyYWNrKCk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUgfT4ge1xuICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIGRpc2FibGVBdWRpb1RyYWNrXSBSb29tIG1pc3NpbmcgYXVkaW8gdHJhY2sgLT4gJHtSQ0NhbGxFcnJvckNvZGUuTk9UX0lOX1JPT01fRVJST1J9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuTk9UX0lOX1JPT01fRVJST1IgfTtcbiAgICB9XG5cbiAgICAvLyDlpoLmnpzkuI3pnIDlhbPpl63mkYTlg4/lpLRcbiAgICBpZiAoIXRoaXMuX29wdGlvbnMuaXNPZmZDYW1lcmFXaGVuVmlkZW9EaXNhYmxlKSB7XG4gICAgICBjb25zdCB0cmFja3M6IFJDTG9jYWxUcmFja1tdID0gdGhpcy5fZ2V0TG9jYWxWaWRlb1RyYWNrcygpO1xuICAgICAgaWYgKCF0cmFja3MubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBFbmFibGVWaWRlb1RyYWNrXSBSb29tIG1pc3NpbmcgdmlkZW8gdHJhY2sgLT4gJHtSQ0NhbGxFcnJvckNvZGUuTUlTU0lOR19WSURFT19UUkFDS19FUlJPUn1gKTtcbiAgICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLk1JU1NJTkdfVklERU9fVFJBQ0tfRVJST1IgfTtcbiAgICAgIH1cblxuICAgICAgLy8g5ZCv55So6KeG6aKRXG4gICAgICB0cmFja3MuZm9yRWFjaCgodHJhY2s6IFJDTG9jYWxUcmFjaykgPT4ge1xuICAgICAgICB0cmFjay51bm11dGUoKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG5cbiAgICAvLyDojrflvpfmnKznq6/op4bpopHotYTmupBcbiAgICBjb25zdCB7IGNvZGUsIHRyYWNrIH0gPSBhd2FpdCB0aGlzLl9ydGNDbGllbnQuY3JlYXRlQ2FtZXJhVmlkZW9UcmFjaygpO1xuICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIEVuYWJsZVZpZGVvVHJhY2tdIEdldCBSZXNvdXJjZSBmYWlsZWQ6IFJDUlRDQ29kZSAtPiAke2NvZGV9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuR0VUX0xPQ0FMX1ZJREVPX1RSQUNLX0VSUk9SIH07XG4gICAgfVxuICAgIGNvbnN0IGxvY2FsVHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSA9IFtdO1xuICAgIHRoaXMuX29wdGlvbnMubG9jYWxUcmFja3MgJiYgdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcy5mb3JFYWNoKCh0cmFjazogUkNMb2NhbFRyYWNrKSA9PiB7XG4gICAgICBpZiAodHJhY2suaXNWaWRlb1RyYWNrKCkpIHtcbiAgICAgICAgLy8g5LmL5YmN55qE6KeG6aKR6YO96ZSA5q+BXG4gICAgICAgIHRyYWNrLmRlc3Ryb3koKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOWPqueVmeS4i+S5i+WJjeeahOmfs+mikVxuICAgICAgICBsb2NhbFRyYWNrcy5wdXNoKHRyYWNrKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIOWKoOS4iuacrOWcsOaWsOS6p+eUn+eahOinhumikVxuICAgIGxvY2FsVHJhY2tzLnB1c2godHJhY2shKTtcbiAgICB0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzID0gbG9jYWxUcmFja3M7XG5cbiAgICAvLyDkuLrkuobop6blj5Hlr7nmlrnnmoRvblZpZGVvTXV0ZUNoYW5nZSDlhYjnpoHnlKhcbiAgICB0cmFjayEubXV0ZSgpO1xuXG4gICAgLy8g5Y+R5biD5pys56uv6KeG6aKR6LWE5rqQXG4gICAgY29uc3QgeyBjb2RlOiBfY29kZSB9ID0gYXdhaXQgdGhpcy5fcm9vbS5wdWJsaXNoKFt0cmFjayFdKTtcblxuICAgIC8vIOiLpei1hOa6kOWPkeW4g+Wksei0pVxuICAgIGlmIChfY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBFbmFibGVWaWRlb1RyYWNrXSBSZXNvdXJjZSBwdWJsaXNoaW5nIGZhaWxlZDogUkNSVENDb2RlIC0+ICR7Y29kZX1gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5WSURFT19QVUJMSVNIX0VSUk9SIH07XG4gICAgfVxuXG4gICAgLy8g5ZCv55SoXG4gICAgdHJhY2shLnVubXV0ZSgpO1xuXG4gICAgLy8g6YCa55+l5Lia5Yqh5bGCdHJhY2tSZWFkeVxuICAgIHRoaXMuX25vdGlmeVRyYWNrUmVhZHkoW3RyYWNrIV0pO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICAvKipcbiAgICog56aB55So6Z+z6aKRdHJhY2tcbiAgICovXG4gIHB1YmxpYyBhc3luYyBkaXNhYmxlQXVkaW9UcmFjaygpIHtcbiAgICBpZiAoIXRoaXMuX3Jvb20pIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBkaXNhYmxlQXVkaW9UcmFja10gUm9vbSBtaXNzaW5nIGF1ZGlvIHRyYWNrIC0+ICR7UkNDYWxsRXJyb3JDb2RlLk5PVF9JTl9ST09NX0VSUk9SfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLk5PVF9JTl9ST09NX0VSUk9SIH07XG4gICAgfVxuXG4gICAgY29uc3QgdHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSA9IHRoaXMuX2dldExvY2FsQXVkaW9UcmFja3MoKTtcblxuICAgIC8vIOemgeeUqOmfs+mikVxuICAgIHRyYWNrcy5mb3JFYWNoKCh0cmFjazogUkNMb2NhbFRyYWNrKSA9PiB7XG4gICAgICB0cmFjay5tdXRlKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5ZCv55So6Z+z6aKRdHJhY2tcbiAgICovXG4gIHB1YmxpYyBhc3luYyBlbmFibGVBdWRpb1RyYWNrKCkge1xuICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIGRpc2FibGVBdWRpb1RyYWNrXSBSb29tIG1pc3NpbmcgYXVkaW8gdHJhY2sgLT4gJHtSQ0NhbGxFcnJvckNvZGUuTk9UX0lOX1JPT01fRVJST1J9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuTk9UX0lOX1JPT01fRVJST1IgfTtcbiAgICB9XG5cbiAgICBjb25zdCB0cmFja3M6IFJDTG9jYWxUcmFja1tdID0gdGhpcy5fZ2V0TG9jYWxBdWRpb1RyYWNrcygpO1xuXG4gICAgaWYgKCF0cmFja3MubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gZGlzYWJsZUF1ZGlvVHJhY2tdIFJvb20gbWlzc2luZyBhdWRpbyB0cmFjayAtPiAke1JDQ2FsbEVycm9yQ29kZS5NSVNTSU5HX1ZJREVPX1RSQUNLX0VSUk9SfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLk1JU1NJTkdfVklERU9fVFJBQ0tfRVJST1IgfTtcbiAgICB9XG5cbiAgICAvLyDlkK/nlKjpn7PpopFcbiAgICB0cmFja3MuZm9yRWFjaCgodHJhY2s6IFJDTG9jYWxUcmFjaykgPT4ge1xuICAgICAgdHJhY2sudW5tdXRlKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog6ZSA5q+B5pys5Zyw5rWBXG4gICAqL1xuICBwcml2YXRlIF9kZXN0cm95VHJhY2tzKHRyYWNrczogUkNMb2NhbFRyYWNrW10pIHtcbiAgICB0cmFja3MuZm9yRWFjaCgodHJhY2s6IFJDTG9jYWxUcmFjaykgPT4ge1xuICAgICAgdHJhY2suZGVzdHJveSgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOWQkeWkluaKm+WHuuacrOWcsOa1gVxuICAgKi9cbiAgcHJpdmF0ZSBfbm90aWZ5VHJhY2tSZWFkeSh0cmFja3M6IFJDTG9jYWxUcmFja1tdIHwgUkNSZW1vdGVUcmFja1tdKSB7XG4gICAgdHJhY2tzLmZvckVhY2goKHRyYWNrOiBSQ0xvY2FsVHJhY2sgfCBSQ1JlbW90ZVRyYWNrKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9saXN0ZW5lciEub25UcmFja1JlYWR5KHRyYWNrLCB0aGlzKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbiBfbm90aWZ5VHJhY2tSZWFkeV0gX2xpc3RlbmVyIG9uVHJhY2tSZWFkeSBleGNlcHRpb24nKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5oi/6Ze05LiK5rOo5YaM5LqL5Lu2XG4gICAqL1xuICBwcml2YXRlIF9yZWdpc3RlclJvb21FdmVudExpc3RlbmVyKCkge1xuICAgIHRoaXMuX3Jvb20ucmVnaXN0ZXJSb29tRXZlbnRMaXN0ZW5lcihcbiAgICAgIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOacrOerr+iiq+i4ouWHuuaIv+mXtOaXtuinpuWPkVxuICAgICAgICAgKiBAZGVzY3JpcHRpb24g6KKr6Lii5Ye65oi/6Ze05Y+v6IO95piv55Sx5LqO5pyN5Yqh56uv6LaF5Ye65LiA5a6a5pe26Ze05pyq6IO95pS25YiwIHJ0Y1Bpbmcg5raI5oGv77yM5omA5Lul6K6k5Li65bex5pa556a757q/44CCXG4gICAgICAgICAqIOWPpuS4gOenjeWPr+iDveaYr+W3seaWuSBydGNQaW5nIOWksei0peasoeaVsOi2heWHuuS4iumZkO+8jOaVheiAjOS4u+WKqOaWree6v1xuICAgICAgICAgKiBAcGFyYW0gYnlTZXJ2ZXJcbiAgICAgICAgICog5b2T5YC85Li6IGZhbHNlIOaXtu+8jOivtOaYjuacrOerryBydGNQaW5nIOi2heaXtlxuICAgICAgICAgKiDlvZPlgLzkuLogdHJ1ZSDml7bvvIzor7TmmI7mnKznq6/mlLbliLDooqvouKLlh7rmiL/pl7TpgJrnn6VcbiAgICAgICAgICovXG4gICAgICAgIG9uS2lja09mZjogKGJ5U2VydmVyOiBib29sZWFuLCBzdGF0ZT86IFJDS2lja1JlYXNvbiB8IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRVc2VySWQ6IHN0cmluZyA9IHRoaXMuX3J0Y0NsaWVudC5nZXRDdXJyZW50SWQoKTtcbiAgICAgICAgICB0aGlzLl9zdGF0ZU1hY2hpbmUudXNlckxlYXZlKFtjdXJyZW50VXNlcklkXSk7XG5cbiAgICAgICAgICBpZiAoIWJ5U2VydmVyKSB7XG4gICAgICAgICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uTkVUV09SS19FUlJPUik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZSA9PT0gUkNLaWNrUmVhc29uLlNFUlZFUl9LSUNLKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2V4Y2VwdGlvbkNsb3NlKFJDQ2FsbEVuZFJlYXNvbi5LSUNLRURfQllfU0VSVkVSKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdGF0ZSA9PT0gUkNLaWNrUmVhc29uLk9USEVSX0tJQ0spIHtcbiAgICAgICAgICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLk9USEVSX0NMSUVOVF9KT0lORURfQ0FMTCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICog5o6l5pS25Yiw5oi/6Ze05L+h5Luk5pe25Zue6LCD77yM55So5oi35Y+v6YCa6L+H5oi/6Ze05a6e5L6L55qEIGBzZW5kTWVzc2FnZShuYW1lLCBjb250ZW50KWAg5o6l5Y+j5Y+R6YCB5L+h5LukXG4gICAgICAgICAqIEBwYXJhbSBuYW1lIOS/oeS7pOWQjVxuICAgICAgICAgKiBAcGFyYW0gY29udGVudCDkv6Hku6TlhoXlrrlcbiAgICAgICAgICogQHBhcmFtIHNlbmRlclVzZXJJZCDlj5HpgIHogIUgSWRcbiAgICAgICAgICogQHBhcmFtIG1lc3NhZ2VVSWQg5raI5oGv5ZSv5LiA5qCH6K+GXG4gICAgICAgICAqL1xuICAgICAgICBvbk1lc3NhZ2VSZWNlaXZlKG5hbWU6IHN0cmluZywgY29udGVudDogYW55LCBzZW5kZXJVc2VySWQ6IHN0cmluZywgbWVzc2FnZVVJZDogc3RyaW5nKSB7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDnm5HlkKzmiL/pl7TlsZ7mgKflj5jmm7TpgJrnn6VcbiAgICAgICAgICogQHBhcmFtIG5hbWVcbiAgICAgICAgICogQHBhcmFtIGNvbnRlbnRcbiAgICAgICAgICovXG4gICAgICAgIG9uUm9vbUF0dHJpYnV0ZUNoYW5nZShuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZykge1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICog5Y+R5biD6ICF56aB55SoL+WQr+eUqOmfs+mikVxuICAgICAgICAgKiBAcGFyYW0gYXVkaW9UcmFjayBSQ1JlbW90ZUF1ZGlvVHJhY2sg57G75a6e5L6LXG4gICAgICAgICAqL1xuICAgICAgICBvbkF1ZGlvTXV0ZUNoYW5nZTogKGF1ZGlvVHJhY2s6IFJDUmVtb3RlQXVkaW9UcmFjaykgPT4ge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxTZXNzaW9uIG9uQXVkaW9NdXRlQ2hhbmdlXSB1c2VySWQtPiR7YXVkaW9UcmFjay5nZXRVc2VySWQoKX0gbXV0ZWQgLT4gJHthdWRpb1RyYWNrLmlzT3duZXJNdXRlZCgpfWApO1xuICAgICAgICAgIGNvbnN0IG11dGVVc2VyOiBJTXV0ZVVzZXIgPSB7XG4gICAgICAgICAgICB1c2VySWQ6IGF1ZGlvVHJhY2suZ2V0VXNlcklkKCksXG4gICAgICAgICAgICBtdXRlZDogYXVkaW9UcmFjay5pc093bmVyTXV0ZWQoKSxcbiAgICAgICAgICAgIGtpbmQ6ICdhdWRpbycsXG4gICAgICAgICAgICB0cmFja0lkOiBhdWRpb1RyYWNrLmdldFRyYWNrSWQoKSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyDpgJrnn6Xnu5nkuJrliqFcbiAgICAgICAgICAgIHRoaXMuX2xpc3RlbmVyIS5vbkF1ZGlvTXV0ZUNoYW5nZShtdXRlVXNlciwgdGhpcyk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbiBvbkF1ZGlvTXV0ZUNoYW5nZV0gTWlzc2luZyBsaXN0ZW5pbmcgbWV0aG9kIC0+IG9uVHJhY2tNdXRlQ2hhbmdlJyk7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDlj5HluIPogIXnpoHnlKgv5ZCv55So6KeG6aKRXG4gICAgICAgICAqIEBwYXJhbSB2aWRlb1RyYWNrIFJDUmVtb3RlVmlkZW9UcmFjayDnsbvlrp7kvovlr7nosaFcbiAgICAgICAgICovXG4gICAgICAgIG9uVmlkZW9NdXRlQ2hhbmdlOiAodmlkZW9UcmFjazogUkNSZW1vdGVWaWRlb1RyYWNrKSA9PiB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gb25WaWRlb011dGVDaGFuZ2VddXNlcklkLT4ke3ZpZGVvVHJhY2suZ2V0VXNlcklkKCl9IG11dGVkIC0+ICR7dmlkZW9UcmFjay5pc093bmVyTXV0ZWQoKX1gKTtcbiAgICAgICAgICBjb25zdCBtdXRlVXNlcjogSU11dGVVc2VyID0ge1xuICAgICAgICAgICAgdXNlcklkOiB2aWRlb1RyYWNrLmdldFVzZXJJZCgpLFxuICAgICAgICAgICAgbXV0ZWQ6IHZpZGVvVHJhY2suaXNPd25lck11dGVkKCksXG4gICAgICAgICAgICBraW5kOiAndmlkZW8nLFxuICAgICAgICAgICAgdHJhY2tJZDogdmlkZW9UcmFjay5nZXRUcmFja0lkKCksXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyDpgJrnn6Xnu5nkuJrliqFcbiAgICAgICAgICAgIHRoaXMuX2xpc3RlbmVyIS5vblZpZGVvTXV0ZUNoYW5nZShtdXRlVXNlciwgdGhpcyk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbiBvblZpZGVvTXV0ZUNoYW5nZV0gTWlzc2luZyBsaXN0ZW5pbmcgbWV0aG9kIC0+IG9uVmlkZW9NdXRlQ2hhbmdlJyk7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDmiL/pl7TlhoXlhbbku5bnlKjmiLfmlrDlj5HluIPotYTmupDml7bop6blj5FcbiAgICAgICAgICog5aaC6ZyA6I635Y+W5Yqg5YWl5oi/6Ze05LmL5YmN5oi/6Ze05YaF5p+Q5Liq55So5oi35Y+R5biD55qE6LWE5rqQ5YiX6KGo77yM5Y+v5L2/55SoIHJvb20uZ2V0UmVtb3RlVHJhY2tzQnlVc2VySWQoJ3VzZXJJZCcpIOiOt+WPllxuICAgICAgICAgKiBAcGFyYW0gdHJhY2tzIOaWsOWPkeW4g+eahOmfs+i9qOS4juinhui9qOaVsOaNruWIl+ihqO+8jOWMheWQq+aWsOWPkeW4g+eahCBSQ1JlbW90ZUF1ZGlvVHJhY2sg5LiOIFJDUmVtb3RlVmlkZW9UcmFjayDlrp7kvotcbiAgICAgICAgICovXG4gICAgICAgIG9uVHJhY2tQdWJsaXNoOiBhc3luYyAodHJhY2tzOiBSQ1JlbW90ZVRyYWNrW10pID0+IHtcbiAgICAgICAgICAvLyDpgIDlh7rmiL/pl7TlkI7vvIzov5jkvJrotbDliLDov5nvvJ/vvJ/vvIzmiYDku6XliKTmlq3kuIDkuIvvvIzmsqHmnIlyb29t5LiN5omn6KGM6K6i6ZiFXG4gICAgICAgICAgaWYgKHRoaXMuX3Jvb20pIHtcbiAgICAgICAgICAgIC8vIOaMieS4muWKoemcgOaxgumAieaLqemcgOimgeiuoumYhei1hOa6kO+8jOmAmui/hyByb29tLnN1YnNjcmliZSDmjqXlj6Pov5vooYzorqLpmIVcbiAgICAgICAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fcm9vbS5zdWJzY3JpYmUodHJhY2tzKTtcbiAgICAgICAgICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gb25UcmFja1B1Ymxpc2hdIHN1YnNjcmliZSBmYWlsZWQgUlRDQ29kZSAtPiR7Y29kZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDmiL/pl7TnlKjmiLflj5bmtojlj5HluIPotYTmupBcbiAgICAgICAgICogQHBhcmFtIHRyYWNrcyDooqvlj5bmtojlj5HluIPnmoTpn7PovajkuI7op4bovajmlbDmja7liJfooahcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIOW9k+i1hOa6kOiiq+WPlua2iOWPkeW4g+aXtu+8jFNESyDlhoXpg6jkvJrlj5bmtojlr7nnm7jlhbPotYTmupDnmoTorqLpmIXvvIzkuJrliqHlsYLku4XpnIDlpITnkIYgVUkg5Lia5YqhXG4gICAgICAgICAqL1xuICAgICAgICBvblRyYWNrVW5wdWJsaXNoOiAodHJhY2tzOiBSQ1JlbW90ZVRyYWNrW10pID0+IHtcblxuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICog6K6i6ZiF55qE6Z+z6KeG6aKR5rWB6YCa6YGT5bey5bu656uLLCB0cmFjayDlt7Llj6/ku6Xov5vooYzmkq3mlL5cbiAgICAgICAgICogQHBhcmFtIHRyYWNrIFJDUmVtb3RlVHJhY2sg57G75a6e5L6LXG4gICAgICAgICAqL1xuICAgICAgICBvblRyYWNrUmVhZHk6ICh0cmFjazogUkNSZW1vdGVUcmFjaykgPT4ge1xuICAgICAgICAgIGNvbnN0IG1lZGlhVHlwZSA9IHRoaXMuX3N0YXRlTWFjaGluZS5nZXRNZWRpYVR5cGUoKTtcblxuICAgICAgICAgIC8vIOacieaXtuWvueaWueayoeaciemZjee6p+aIkOWKn++8jOaJlOaKm+i/h+adpeinhumike+8jOi/meaXtueahOinhumikeS4jeWvueWkluaKm+WHulxuICAgICAgICAgIGlmIChtZWRpYVR5cGUgPT09IFJDQ2FsbE1lZGlhVHlwZS5BVURJTyAmJiB0cmFjay5pc1ZpZGVvVHJhY2soKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIOaJp+ihjOeUqOaIt+eahG9uVHJhY2tSZWFkeeebkeWQrFxuICAgICAgICAgIHRoaXMuX25vdGlmeVRyYWNrUmVhZHkoW3RyYWNrXSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDkurrlkZjliqDlhaVcbiAgICAgICAgICogQHBhcmFtIHVzZXJJZHMg5Yqg5YWl55qE5Lq65ZGYIGlkIOWIl+ihqFxuICAgICAgICAgKi9cbiAgICAgICAgb25Vc2VySm9pbjogKHVzZXJJZHM6IHN0cmluZ1tdKSA9PiB7XG4gICAgICAgICAgLy8g5pyJ5Lq65Yqg5YWl5riF6Zmk5a6a5pe25ZmoXG4gICAgICAgICAgaWYgKHRoaXMuam9pblJvb21UaW1lcikge1xuICAgICAgICAgICAgdGhpcy5qb2luUm9vbVRpbWVyLnN0b3AoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fc3RhdGVNYWNoaW5lLnVzZXJKb2luKHVzZXJJZHMpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICog5Lq65ZGY6YCA5Ye6XG4gICAgICAgICAqIEBwYXJhbSB1c2VySWRzXG4gICAgICAgICAqL1xuICAgICAgICBvblVzZXJMZWF2ZTogKHVzZXJJZHM6IHN0cmluZ1tdKSA9PiB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gb25Vc2VyTGVhdmVdIGxpc3RlbmluZyBvblVzZXJMZWF2ZSB1c2VySWRzIC0+ICR7dXNlcklkcz8uam9pbignLCcpfWApO1xuICAgICAgICAgIHRoaXMuX3N0YXRlTWFjaGluZS51c2VyTGVhdmUodXNlcklkcyk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSVEMg5q+P5qyhIFBpbmcg57uT5p6cXG4gICAgICAgICAqL1xuICAgICAgICBvblBpbmc6IChyZXN1bHQ6IFJDUlRDUGluZ1Jlc3VsdCkgPT4ge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxTZXNzaW9uIG9uUGluZ10ke3Jlc3VsdH1gKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8g6YCa55+l57uZ5Lia5YqhXG4gICAgICAgICAgICB0aGlzLl9saXN0ZW5lciEub25QaW5nICYmIHRoaXMuX2xpc3RlbmVyIS5vblBpbmcocmVzdWx0LCB0aGlzKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxTZXNzaW9uIG9uUGluZ10gbGlzdGVuaW5nIG9uUGluZyBleGNlcHRpb24nKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDms6jlhozmiL/pl7TotKjph4/mlbDmja7nm5HlkKzlmahcbiAgICovXG4gIHByaXZhdGUgX3JlZ2lzdGVyUmVwb3J0TGlzdGVuZXIoKSB7XG4gICAgLy8g5rOo5YaM5oi/6Ze06LSo6YeP5pWw5o2u55uR5ZCs5ZmoXG4gICAgdGhpcy5fcm9vbS5yZWdpc3RlclJlcG9ydExpc3RlbmVyKHtcbiAgICAgIC8qKlxuICAgICAgICog55So5LqO5o6l5pS254q25oCB5pWw5o2u5oql5ZGKXG4gICAgICAgKiBAcGFyYW0gcmVwb3J0XG4gICAgICAgKi9cbiAgICAgIG9uU3RhdGVSZXBvcnQ6IChyZXBvcnQ6IElSQ1JUQ1N0YXRlUmVwb3J0KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uUlRDU3RhdGVSZXBvcnQgJiYgdGhpcy5fbGlzdGVuZXIhLm9uUlRDU3RhdGVSZXBvcnQocmVwb3J0LCB0aGlzKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbFNlc3Npb24gb25TdGF0ZVJlcG9ydF0gbGlzdGVuZXIgb25TdGF0ZVJlcG9ydCBleGNlcHRpb24nKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiB+SUNFIOi/nuaOpeeKtuaAgeWPmOabtOmAmuefpX5cbiAgICAgICAqIEBzaW5jZSB2ZXJzaW9uIDUuMS41XG4gICAgICAgKi9cbiAgICAgIG9uSUNFQ29ubmVjdGlvblN0YXRlQ2hhbmdlOiAoc3RhdGU6IFJUQ0ljZUNvbm5lY3Rpb25TdGF0ZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMuX2xpc3RlbmVyIS5vbklDRUNvbm5lY3Rpb25TdGF0ZUNoYW5nZSAmJiB0aGlzLl9saXN0ZW5lciEub25JQ0VDb25uZWN0aW9uU3RhdGVDaGFuZ2Uoc3RhdGUsIHRoaXMpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbiBvbklDRUNvbm5lY3Rpb25TdGF0ZUNoYW5nZV0gb25JQ0VDb25uZWN0aW9uU3RhdGVDaGFuZ2UgZXhjZXB0aW9uJyk7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiAg6YCa6K+d5ZSv5LiA5qCH6K+GXG4gICAqL1xuICBwdWJsaWMgZ2V0U2Vzc2lvbklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlTWFjaGluZS5nZXRDYWxsSWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAg6I635Y+W5oi/6Ze05b2T5YmN5Lya6K+dIElk77yM5b2T5oi/6Ze05YaF5bey5peg5oiQ5ZGY5pe25oi/6Ze05Lya5Zue5pS277yM6YeN5paw5Yqg5YWl5pe2IHNlc3Npb25JZCDlsIbmm7TmlrDvvIwo55So5oi35b2V5Yi26LWE5rqQ55So55qEKVxuICAgKi9cbiAgcHVibGljIGdldFJUQ1Nlc3Npb25JZCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fcm9vbSA/IHRoaXMuX3Jvb20uZ2V0U2Vzc2lvbklkKCkgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqICDnm67moIcgSUTvvIzljZXlkbzlr7nmlrnkurrlkZggSWQsIOe+pOWRvOe+pOe7hCBJZFxuICAgKi9cbiAgcHVibGljIGdldFRhcmdldElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlTWFjaGluZS5nZXRUYXJnZXRJZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqICDojrflj5bkvJror53nsbvlnotcbiAgICovXG4gIHB1YmxpYyBnZXRDb252ZXJzYXRpb25UeXBlKCk6IENvbnZlcnNhdGlvblR5cGUge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0Q29udmVyc2F0aW9uVHlwZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqICDnu4Tnu4cgSURcbiAgICovXG4gIHB1YmxpYyBnZXRDaGFubmVsSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVNYWNoaW5lLmdldENoYW5uZWxJZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOaIv+mXtOS6uuWRmOWIl+ihqO+8jOS4jeWMheWQq+acrOerr+S/oeaBr1xuICAgKi9cbiAgcHVibGljIGdldFJlbW90ZVVzZXJzKCk6IElVc2VyRGF0YVtdIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVNYWNoaW5lLmdldFJlbW90ZVVzZXJzKCk7XG4gIH1cblxuICAvKipcbiAqIOaIv+mXtOS6uuWRmOWIl+ihqO+8jOS4jeWMheWQq+acrOerr+S/oeaBr1xuICovXG4gIHB1YmxpYyBnZXRVc2VycygpOiBJVXNlckRhdGFbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlTWFjaGluZS5nZXRSZW1vdGVVc2VycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluS6uuWRmOeKtuaAgVxuICAgKi9cbiAgcHVibGljIGdldFVzZXJTdGF0ZSh1c2VySWQ6IHN0cmluZyk6IFJDQ2FsbFVzZXJTdGF0ZSB7XG4gICAgaWYgKCF1c2VySWQgfHwgdHlwZW9mIHVzZXJJZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndXNlcklkIGlzIHJlcXVpcmVkLCBtdXN0IGJlIG9mIHR5cGUgXFwnc3RyaW5nXFwnJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0VXNlclN0YXRlKHVzZXJJZCk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+Wc2Vzc2lvbueKtuaAgVxuICAgKi9cbiAgcHVibGljIGdldFN0YXRlKCk6IFJDQ2FsbFNlc3Npb25TdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlTWFjaGluZS5nZXRTdGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+W+l+S8muivneWPkei1t+iAhWlkXG4gICAqL1xuICBwdWJsaWMgZ2V0Q2FsbGVySWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVNYWNoaW5lLmdldENhbGxlcklkKCk7XG4gIH1cblxuICAvKipcbiAgICog6I635b6XbWVkaWFUeXBlXG4gICAqL1xuICBwdWJsaWMgZ2V0TWVkaWFUeXBlKCk6IFJDQ2FsbE1lZGlhVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlTWFjaGluZS5nZXRNZWRpYVR5cGUoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgUlRDUGx1Z2luQ29udGV4dCwgSVJ1bnRpbWUsIElSVENKb2luZWRJbmZvLCBFcnJvckNvZGUsIFJUQ0pvaW5UeXBlLCBJTG9nZ2VyLCBCYXNpY0xvZ2dlcixcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHtcbiAgUkNDYWxsRW5naW5lLCBSQ0NhbGxTdGF0ZU1hY2hpbmUsIFJDQ2FsbEVycm9yQ29kZSwgUkNDYWxsTGFuZ3VhZ2UsIFJDQ2FsbE1lZGlhVHlwZSwgSU9mZmxpbmVSZWNvcmQsXG59IGZyb20gJ0ByYy1lbWJlZC9jYWxsLWVuZ2luZSc7XG5pbXBvcnQgeyBSQ1JUQ0NsaWVudCwgUkNSVENDb2RlLCBSQ0xvY2FsVHJhY2sgfSBmcm9tICdAcm9uZ2Nsb3VkL3BsdWdpbi1ydGMnO1xuaW1wb3J0IHtcbiAgSVJDQ2FsbEluR3JvdXBQYXJhbXMsIElSQ0NhbGxJbml0T3B0aW9ucywgSVJDQ2FsbFBhcmFtcywgSU1lZGlhU3RyZWFtQ29uc3RyYWludHMsIElWYWxpZGF0aW9uUmVzdWx0LCBJUHVzaENvbmZpZyxcbn0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUHJvZHVjZVR5cGVzIH0gZnJvbSAnLi9lbnVtcyc7XG5pbXBvcnQgZXZlbnRFbWl0dGVyIGZyb20gJy4vZXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IFJDQ2FsbFNlc3Npb24gfSBmcm9tICcuL1JDQ2FsbFNlc3Npb24nO1xuaW1wb3J0IHtcbiAgdmFsaWRhdGVMaXN0ZW5lciwgdmFsaWRhdGVUYXJnZXRJZCwgdmFsaWRhdGVNZWRpYVR5cGUsIHZhbGlkYXRlVXNlcklkcywgdmFsaWRhdGVFeHRyYSwgdmFsaWRhdGVQdXNoVGl0bGUsIHZhbGlkYXRlUHVzaENvbnRlbnQsIHZhbGlkYXRlUHVzaENvbmZpZyxcbn0gZnJvbSAnLi92YWxpZGF0aW9uJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUkNDYWxsQ2xpZW50IHtcbiAgLyoqXG4gICAqIHJ0Y+WunuS+i1xuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfcnRjQ2xpZW50OiBSQ1JUQ0NsaWVudFxuXG4gIC8qKlxuICAgKiBjYWxsRW5naW5l5bGC5a6e5L6LXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9jYWxsRW5naW5lOiBSQ0NhbGxFbmdpbmVcblxuICAvKipcbiAgICog5YW25a6D5Y+C5pWwXG4gICAqL1xuICBwcml2YXRlIF9vcHRpb25zOiBJUkNDYWxsSW5pdE9wdGlvbnNcblxuICAvKipcbiAgICogc2Vzc2lvbuWIl+ihqFxuICAgKi9cbiAgcHJpdmF0ZSBfc2Vzc2lvbkxpc3Q6IFJDQ2FsbFNlc3Npb25bXSA9IFtdXG5cbiAgcHJpdmF0ZSBfY2FsbFB1c2hDb25maWc6IElQdXNoQ29uZmlnID0ge31cblxuICBwcml2YXRlIF9odW5ndXBQdXNoQ29uZmlnOiBJUHVzaENvbmZpZyA9e31cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9jb250ZXh0OiBSVENQbHVnaW5Db250ZXh0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3J1bnRpbWU6IElSdW50aW1lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogQmFzaWNMb2dnZXIsXG4gICAgX29wdGlvbnM6IElSQ0NhbGxJbml0T3B0aW9ucyxcbiAgKSB7XG4gICAgdGhpcy5fcnRjQ2xpZW50ID0gX29wdGlvbnMucnRjQ2xpZW50O1xuXG4gICAgdGhpcy5fb3B0aW9ucyA9IHsgLyoqXG4gICAgICAgKiDmmK/lkKblhYHorrjlj5HluIPph43or5XvvIwg6buY6K6k5LiN5YWB6K64XG4gICAgICAgKi9cbiAgICAgIGlzQWxsb3dQdWJsaXNoUmV0cnk6IGZhbHNlLFxuXG4gICAgICAvKipcbiAgICAgICAqIOaYr+WQpuWFgeiuuOiuoumYhemHjeivle+8jOm7mOiupOS4jeWFgeiuuFxuICAgICAgICovXG4gICAgICBpc0FsbG93U3Vic2NyaWJlUmV0cnk6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiDnpoHnlKjop4bpopHml7blhbPmkYTlg4/lpLQsIOm7mOiupOWFs+mXrVxuICAgICAgICovXG4gICAgICBpc09mZkNhbWVyYVdoZW5WaWRlb0Rpc2FibGU6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFJUQyDmiL/pl7TliqDlhaXnsbvlnovvvIzpu5jorqQgICBSVENKb2luVHlwZS5DT0VYSVNUID0gMiDkuKTkuKrorr7lpIflhbHlrZhcbiAgICAgICAqICAgICBSVENKb2luVHlwZS5LSUNLID0gMCzouKLliY3kuIDkuKrorr7lpIdcbiAgICAgICAqICAgICBSVENKb2luVHlwZS5SRUZVU0UgPSAxLOW9k+WJjeWKoOWFpeaLkue7nVxuICAgICAgICogICAgIFJUQ0pvaW5UeXBlLkNPRVhJU1QgPSAyIOS4pOS4quiuvuWkh+WFseWtmFxuICAgICAgICovXG4gICAgICBqb2luVHlwZTogUlRDSm9pblR5cGUuQ09FWElTVCxcblxuICAgICAgLyoqXG4gICAgICAgKiDlhYHorrjpmY3nuqfojrflvpfmtYHvvIzojrflvpfpn7Pop4bpopHkuI3miJDlip8g77yM6ZmN57qn6I635b6X6Z+z6aKRLCDpu5jorqTkuI3lhYHorrhcbiAgICAgICAqL1xuICAgICAgaXNBbGxvd0RlbW90aW9uR2V0U3RyZWFtOiBmYWxzZSxcblxuICAgICAgLyoqXG4gICAgICAgKiDor63oqIDorr7nva4gKOaOqOmAgSksIOS4jeS8oOm7mOiupOS4uuS4reaWh1xuICAgICAgICovXG4gICAgICBsYW5nOiBSQ0NhbGxMYW5ndWFnZS5aSCxcbiAgICAgIC4uLl9vcHRpb25zLFxuICAgIH07XG5cbiAgICAvLyDliJ3lp4vljJZjYWxsRW5naW5lLCDlubbnm5HlkKxvbkludml0ZVxuICAgIHRoaXMuX2NhbGxFbmdpbmUgPSBuZXcgUkNDYWxsRW5naW5lKHRoaXMuX2NvbnRleHQsIF9ydW50aW1lLCB0aGlzLl9sb2dnZXIsIHtcblxuICAgICAgLyoqXG4gICAgICAgKiDnm5HlkKzmlLbliLBpbnZpdGVcbiAgICAgICAqL1xuICAgICAgb25JbnZpdGU6IHRoaXMuX29uSW52aXRlLmJpbmQodGhpcyksXG5cbiAgICAgIC8qKlxuICAgICAgICog55uR5ZCs56a757q/5raI5oGv5oql5ZGKXG4gICAgICAgKi9cbiAgICAgIG9uT2ZmbGluZVJlY29yZDogdGhpcy5fb25PZmZsaW5lUmVjb3JkLmJpbmQodGhpcyksXG4gICAgfSwge1xuXG4gICAgICAvKipcbiAgICAgICAqIOivreiogOiuvue9riAo5o6o6YCBKSwg5LiN5Lyg6buY6K6k5Li65Lit5paHXG4gICAgICAgKi9cbiAgICAgIGxhbmc6IHRoaXMuX29wdGlvbnMubGFuZyB8fCBSQ0NhbGxMYW5ndWFnZS5aSCxcblxuICAgIH0pO1xuXG4gICAgZXZlbnRFbWl0dGVyLm9uKCdzZXNzaW9uQ2xvc2UnLCAoeyBzZXNzaW9uLCBzdW1tYXJ5SW5mbyB9KSA9PiB7XG4gICAgICAvLyDku45zZXNzaW9uTGlzdOWOu+aOiei/meS4quWFs+mXreeahHNlc3Npb25cbiAgICAgIHRoaXMuX3JlbW92ZVNlc3Npb24oc2Vzc2lvbik7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuX29wdGlvbnMub25TZXNzaW9uQ2xvc2Uoc2Vzc2lvbiwgc3VtbWFyeUluZm8pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NDYWxsQ2xpZW50XSBvcHRpb25zLm9uU2Vzc2lvbkNsb3NlIGV4Y2VwdGlvbicpO1xuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyDmjqXlkKzkuYvliY3mjILmlq3lhbblroPnmoRzZXNzaW9uXG4gICAgZXZlbnRFbWl0dGVyLm9uKCdodW5ndXBPdGhlclNlc3Npb24nLCAoeyBzZXNzaW9uIH0pID0+IHtcbiAgICAgIGNvbnN0IGlkID0gc2Vzc2lvbi5nZXRTZXNzaW9uSWQoKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxDbGllbnQgaHVuZ3VwT3RoZXJTZXNzaW9uXSBzZXNzaW9uSWQgcmVhZHkgdG8gYWNjZXB0IC0+ICR7aWR9YCk7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsQ2xpZW50IGh1bmd1cE90aGVyU2Vzc2lvbl0gc2Vzc2lvbkxpc3QgLT4ke3RoaXMuX3Nlc3Npb25MaXN0Lm1hcCgoc2VzKSA9PiBzZXMuZ2V0U2Vzc2lvbklkKCkpLmpvaW4oJywnKX1gKTtcbiAgICAgIGxldCBpID0gMDtcbiAgICAgIHdoaWxlICh0aGlzLl9zZXNzaW9uTGlzdC5sZW5ndGggPiAxKSB7XG4gICAgICAgIC8vIOWmguaenOS4juimgeaOpeWQrOeahHNlc3Npb27kuI3kuIDoh7RcbiAgICAgICAgaWYgKHRoaXMuX3Nlc3Npb25MaXN0W2ldLmdldFNlc3Npb25JZCgpICE9PSBpZCkge1xuICAgICAgICAgIC8vIOaMguaWrVxuICAgICAgICAgIHRoaXMuX3Nlc3Npb25MaXN0W2ldLmh1bmd1cCgpO1xuXG4gICAgICAgICAgLy8g5oyC5pat5ZCO5Yig6ZmkXG4gICAgICAgICAgdGhpcy5fc2Vzc2lvbkxpc3Quc3BsaWNlKGksIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIOWmguaenOaYr+imgeaOpeWQrOeahHNlc3Npb27vvIzot7Pov4fov5nkuKrntKLlvJXvvIzmiYDku6XliqAxXG4gICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsQ2xpZW50IGh1bmd1cE90aGVyU2Vzc2lvbl0gY3VycmVudCBzZXNzaW9uTGlzdCBsZW5ndGggLT4ke3RoaXMuX3Nlc3Npb25MaXN0Lmxlbmd0aH1gKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnm5HlkKxvbkludml0ZVxuICAgKi9cbiAgcHJpdmF0ZSBfb25JbnZpdGUoc3RhdGVNYWNoaW5lOiBSQ0NhbGxTdGF0ZU1hY2hpbmUsIGV4dHJhPzogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCAnW1JDQ2FsbENsaWVudCBfb25JbnZpdGVdIFJlY2VpdmVkIGludml0ZSBtZXNzYWdlJyk7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IG5ldyBSQ0NhbGxTZXNzaW9uKHN0YXRlTWFjaGluZSwgdGhpcy5fcnRjQ2xpZW50LCB0aGlzLl9sb2dnZXIsIHtcblxuICAgICAgLy8g5piv5ZCm5YWB6K646K6i6ZiF6YeN6K+VXG4gICAgICBpc0FsbG93U3Vic2NyaWJlUmV0cnk6IHRoaXMuX29wdGlvbnMuaXNBbGxvd1N1YnNjcmliZVJldHJ5LFxuXG4gICAgICAvLyDmmK/lkKblhYHorrjlj5HluIPph43or5VcbiAgICAgIGlzQWxsb3dQdWJsaXNoUmV0cnk6IHRoaXMuX29wdGlvbnMuaXNBbGxvd1B1Ymxpc2hSZXRyeSxcblxuICAgICAgLyoqXG4gICAgICAgKiDnpoHnlKjop4bpopHml7blhbPmkYTlg4/lpLRcbiAgICAgICAqL1xuICAgICAgaXNPZmZDYW1lcmFXaGVuVmlkZW9EaXNhYmxlOiB0aGlzLl9vcHRpb25zLmlzT2ZmQ2FtZXJhV2hlblZpZGVvRGlzYWJsZSxcblxuICAgICAgLyoqXG4gICAgICAgKiBSVEMg5oi/6Ze05Yqg5YWl57G75Z6LXG4gICAgICAgKi9cbiAgICAgIGpvaW5UeXBlOiB0aGlzLl9vcHRpb25zLmpvaW5UeXBlLFxuXG4gICAgICAvLyDlhYHorrjpmY3nuqfojrflvpfmtYHvvIzojrflvpfpn7Pop4bpopHkuI3miJDlip8g77yM6ZmN57qn6I635b6X6Z+z6aKRLCDpu5jorqTkuI3lhYHorrhcbiAgICAgIGlzQWxsb3dEZW1vdGlvbkdldFN0cmVhbTogdGhpcy5fb3B0aW9ucy5pc0FsbG93RGVtb3Rpb25HZXRTdHJlYW0sXG5cbiAgICAgIC8vIOagh+aYjuaYr+iiq+WPq+S6p+eUn+eahHNlc3Npb25cbiAgICAgIHByb2R1Y2VUeXBlOiBQcm9kdWNlVHlwZXMuQ0FMTEVFLFxuXG4gICAgICBjYWxsUHVzaENvbmZpZzogdGhpcy5fY2FsbFB1c2hDb25maWcsXG5cbiAgICAgIGh1bmd1cFB1c2hDb25maWc6IHRoaXMuX2h1bmd1cFB1c2hDb25maWcsXG4gICAgfSk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCAnW1JDQ2FsbENsaWVudCBfb25JbnZpdGVdIFJlY2VpdmVkIGludml0ZSBtZXNzYWdlLCBzdWNjZXNzZnVsbHkgY3JlYXRlZCBzZXNzaW9uJyk7XG5cbiAgICAvKipcbiAgICAgKiDlpoLmnpzpgJror53nmoTml7blgJnkuI3lhYHorrjmjqXlkKzmlrDnmoTpgJror53vvIznm7TmjqXmjILmlq3vvIwg6L+Z5Lqb5bel5L2c5ZyoY2FsbEVuZ2luZemHjOWujOaIkFxuICAgICAqL1xuICAgIHRoaXMuX3Nlc3Npb25MaXN0LnB1c2goc2Vzc2lvbik7XG5cbiAgICB0cnkge1xuICAgICAgLy8g5omn6KGM55So5oi3QVBJ55qE55uR5ZCsXG4gICAgICB0aGlzLl9vcHRpb25zLm9uU2Vzc2lvbihzZXNzaW9uLCBleHRyYSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsQ2xpZW50IF9vcHRpb25zLm9uU2Vzc2lvbl0gb25TZXNzaW9uIGV4Y2VwdGlvbicpO1xuICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgIH1cblxuICAgIC8vIOW/hemhu+WcqG9uU2Vzc2lvbumHjOazqOWGjHNlc3Npb27nm5HlkKzkuovku7bvvIzov5nph4zmo4DmtYvkuIDkuIvmnInmsqHmnInms6jlhoxcbiAgICBpZiAoc2Vzc2lvbi5fbGlzdGVuZXIpIHtcbiAgICAgIGNvbnN0IGNvbmNsdXNpb246IElWYWxpZGF0aW9uUmVzdWx0ID0gdmFsaWRhdGVMaXN0ZW5lcihzZXNzaW9uLl9saXN0ZW5lcik7XG4gICAgICBpZiAoIWNvbmNsdXNpb24ucmVzdWx0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihjb25jbHVzaW9uLm1zZyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsQ2xpZW50IF9vcHRpb25zLm9uU2Vzc2lvbl0gc2Vzc2lvbiBNdXN0IEhhdmUgTGlzdGVuZXInKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcignW1JDQ2FsbFNlc3Npb24gIF9vcHRpb25zLm9uU2Vzc2lvbl0gc2Vzc2lvbiBNdXN0IEhhdmUgTGlzdGVuZXInKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog55uR5ZCs56a757q/5raI5oGv5oql5ZGKXG4gICAqIEBwYXJhbSByZWNvcmRcbiAgICovXG4gIHB1YmxpYyBfb25PZmZsaW5lUmVjb3JkKHJlY29yZDogSU9mZmxpbmVSZWNvcmQpIHtcbiAgICB0cnkge1xuICAgICAgLy8g5omn6KGM55So5oi3QVBJ55qE55uR5ZCsXG4gICAgICB0aGlzLl9vcHRpb25zLm9uT2ZmbGluZVJlY29yZCAmJiB0aGlzLl9vcHRpb25zLm9uT2ZmbGluZVJlY29yZChyZWNvcmQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbENsaWVudCBfb3B0aW9ucy5vbk9mZmxpbmVSZWNvcmRdIG9uT2ZmbGluZVJlY29yZCBleGNlcHRpb24nKTtcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5rOo5YaM55So5oi35L+h5oGv44CC5rOo5YaM5ZCO77yM5Zyo5Y+R6LW36YKA6K+35oiW5oyC5pat562J5pON5L2c5pe277yM5Lya5bCG6K+l5L+h5oGv5LiA5bm25Y+R6YCB57uZ5a+556uvXG4gICAqIEBwYXJhbSBpbmZvLm5hbWUgICAgICAgIOeUqOaIt+WQjeensFxuICAgKiBAcGFyYW0gaW5mby5wb3J0cmFpdFVyaSDnlKjmiLflpLTlg4/kv6Hmga9cbiAgICogQHBhcmFtIGluZm8uZXh0cmEgICAgICAg6aKE55WZ5ouT5bGV5a2X5q61XG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJVc2VySW5mbyhpbmZvOiB7IG5hbWU/OiBzdHJpbmc7IHBvcnRyYWl0VXJpPzogc3RyaW5nOyBleHRyYT86IHN0cmluZzsgfSA9IHt9KSB7XG4gICAgdGhpcy5fY2FsbEVuZ2luZS5yZWdpc3RlclVzZXJJbmZvKGluZm8pO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgJ1tSQ0NhbGxDbGllbnQgcmVnaXN0ZXJVc2VySW5mb10gc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyIHVzZXIgaW5mbyBkYXRhJyk7XG4gIH1cblxuICAvKipcbiAgKiDot6hBcHDljZXlkbzvvIxcYuWPkemAgWludml0Zea2iOaBr++8jOWbnuiwg+WbnuadpeaOpeaUtnN0YXRlTWFjaGluZSwg5bu6c2Vzc2lvblxuICAqIEBwYXJhbSBwYXJhbXMudGFyZ2V0SWQg6KKr5ZG85Y+r5LiA5pa555qE55So5oi3IGlkIOW/heWhq1xuICAqIEBwYXJhbSBwYXJhbXMubWVkaWFUeXBlIOmfs+mikeWRvOWPqyBvciDpn7Pop4bpopHlkbzlj6sgIOW/heWhq1xuICAqIEBwYXJhbSBwYXJhbXMubGlzdGVuZXIgKHNlc3Npb27kuIrnmoTnm5HlkKwpIOW/heWhq1xuICAqIEBwYXJhbSBwYXJhbXMuY29uc3RyYWludHMg6I635Y+W6Z+z6aKR5oiW6Z+z6KeG6aKR6LWE5rqQ5pe255qE5Y+C5pWwIOWPr+mAiVxuICAqIEBwYXJhbSBwYXJhbXMuY2hhbm5lbElkIOe7hOe7hyBJZCDlj6/pgIlcbiAgKiBAcGFyYW0gcGFyYW1zLmV4dHJhIOa2iOaBr+aJqeWxleS/oeaBr1xuICAqIEBkZXByZWNhdGVkIDUuMS4yIOeJiOacrOW6n+W8gyBwYXJhbXMucHVzaFRpdGxlIOmAmuefpeeahOagh+mimFxuICAqIEBkZXByZWNhdGVkIDUuMS4yIOeJiOacrOW6n+W8gyBwYXJhbXMucHVzaENvbnRlbnQg6YCa55+l55qE5YaF5a65XG4gICogQHBhcmFtIHBhcmFtcy5iaXRyYXRlIOmcgOimgeiuvue9rueahOeggeeOh+WPguaVsFxuICAqXG4gICovXG4gIHB1YmxpYyBhc3luYyBzdGFydENyb3NzQ2FsbCh7XG4gICAgdGFyZ2V0SWQsIG1lZGlhVHlwZSA9IFJDQ2FsbE1lZGlhVHlwZS5BVURJTywgbGlzdGVuZXIsIGNvbnN0cmFpbnRzLCBjaGFubmVsSWQgPSAnJywgZXh0cmEgPSAnJywgcHVzaFRpdGxlID0gJycsIHB1c2hDb250ZW50ID0gJycsIGJpdHJhdGUsXG4gIH06IElSQ0NhbGxQYXJhbXMpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLCBzZXNzaW9uPzogUkNDYWxsU2Vzc2lvbiB9PiB7XG4gICAgcmV0dXJuIHRoaXMuX19jYWxsKHtcbiAgICAgIHRhcmdldElkLCBtZWRpYVR5cGUsIGxpc3RlbmVyLCBjb25zdHJhaW50cywgY2hhbm5lbElkLCBleHRyYSwgcHVzaFRpdGxlLCBwdXNoQ29udGVudCwgYml0cmF0ZSwgaXNDcm9zc0FwcGtleTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDljZXlkbzvvIxcYuWPkemAgWludml0Zea2iOaBr++8jOWbnuiwg+WbnuadpeaOpeaUtnN0YXRlTWFjaGluZSwg5bu6c2Vzc2lvblxuICAgKiBAcGFyYW0gcGFyYW1zLnRhcmdldElkIOiiq+WRvOWPq+S4gOaWueeahOeUqOaItyBpZCDlv4XloatcbiAgICogQHBhcmFtIHBhcmFtcy5tZWRpYVR5cGUg6Z+z6aKR5ZG85Y+rIG9yIOmfs+inhumikeWRvOWPqyAg5b+F5aGrXG4gICAqIEBwYXJhbSBwYXJhbXMubGlzdGVuZXIgKHNlc3Npb27kuIrnmoTnm5HlkKwpIOW/heWhq1xuICAgKiBAcGFyYW0gcGFyYW1zLmNvbnN0cmFpbnRzIOiOt+WPlumfs+mikeaIlumfs+inhumikei1hOa6kOaXtueahOWPguaVsCDlj6/pgIlcbiAgICogQHBhcmFtIHBhcmFtcy5jaGFubmVsSWQg57uE57uHIElkIOWPr+mAiVxuICAgKiBAcGFyYW0gcGFyYW1zLmV4dHJhIOa2iOaBr+aJqeWxleS/oeaBr1xuICAgKiBAZGVwcmVjYXRlZCA1LjEuMiDniYjmnKzlup/lvIMgcGFyYW1zLnB1c2hUaXRsZSDpgJrnn6XnmoTmoIfpophcbiAgICogQGRlcHJlY2F0ZWQgNS4xLjIg54mI5pys5bqf5byDIHBhcmFtcy5wdXNoQ29udGVudCDpgJrnn6XnmoTlhoXlrrlcbiAgICogQHBhcmFtIHBhcmFtcy5iaXRyYXRlIOmcgOimgeiuvue9rueahOeggeeOh+WPguaVsFxuICAgKlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNhbGwoe1xuICAgIHRhcmdldElkLCBtZWRpYVR5cGUgPSBSQ0NhbGxNZWRpYVR5cGUuQVVESU8sIGxpc3RlbmVyLCBjb25zdHJhaW50cywgY2hhbm5lbElkID0gJycsIGV4dHJhID0gJycsIHB1c2hUaXRsZSA9ICcnLCBwdXNoQ29udGVudCA9ICcnLCBiaXRyYXRlLFxuICB9OiBJUkNDYWxsUGFyYW1zKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSwgc2Vzc2lvbj86IFJDQ2FsbFNlc3Npb24gfT4ge1xuICAgIHJldHVybiB0aGlzLl9fY2FsbCh7XG4gICAgICB0YXJnZXRJZCwgbWVkaWFUeXBlLCBsaXN0ZW5lciwgY29uc3RyYWludHMsIGNoYW5uZWxJZCwgZXh0cmEsIHB1c2hUaXRsZSwgcHVzaENvbnRlbnQsIGJpdHJhdGUsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9fY2FsbCh7XG4gICAgdGFyZ2V0SWQsIG1lZGlhVHlwZSA9IFJDQ2FsbE1lZGlhVHlwZS5BVURJTywgbGlzdGVuZXIsIGNvbnN0cmFpbnRzLCBjaGFubmVsSWQgPSAnJywgZXh0cmEgPSAnJywgcHVzaFRpdGxlID0gJycsIHB1c2hDb250ZW50ID0gJycsIGJpdHJhdGUsIGlzQ3Jvc3NBcHBrZXkgPSBmYWxzZSxcbiAgfTogSVJDQ2FsbFBhcmFtcyk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUsIHNlc3Npb24/OiBSQ0NhbGxTZXNzaW9uIH0+IHtcbiAgICBjb25zdCB7IHB1c2hUaXRsZTogcHVzaFRpdGxlVmFsdWUgPSAnJywgcHVzaENvbnRlbnQ6IHB1c2hDb250ZW50VmFsdWUgPSAnJyB9ID0gKHRoaXMuX2NhbGxQdXNoQ29uZmlnLnB1c2hUaXRsZSB8fCB0aGlzLl9jYWxsUHVzaENvbmZpZy5wdXNoQ29udGVudCkgPyB0aGlzLl9jYWxsUHVzaENvbmZpZyA6IHsgcHVzaFRpdGxlLCBwdXNoQ29udGVudCB9O1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxDbGllbnQgY2FsbF0gZXh0cmEtPiR7ZXh0cmF9IHB1c2hUaXRsZS0+JHtwdXNoVGl0bGVWYWx1ZX0gcHVzaENvbnRlbnQtPiR7cHVzaENvbnRlbnRWYWx1ZX1gKTtcbiAgICBjb25zdCBjb25jbHVzaW9uOiBJVmFsaWRhdGlvblJlc3VsdFtdID0gW3ZhbGlkYXRlVGFyZ2V0SWQodGFyZ2V0SWQpLCB2YWxpZGF0ZU1lZGlhVHlwZShtZWRpYVR5cGUpLCB2YWxpZGF0ZUxpc3RlbmVyKGxpc3RlbmVyKSwgdmFsaWRhdGVFeHRyYShleHRyYSksIHZhbGlkYXRlUHVzaFRpdGxlKHB1c2hUaXRsZVZhbHVlKSwgdmFsaWRhdGVQdXNoQ29udGVudChwdXNoQ29udGVudFZhbHVlKV07XG4gICAgY29uc3QgbWVzc2FnZXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgcmVzdWx0ID0gY29uY2x1c2lvbi5ldmVyeSgob2JqOiBJVmFsaWRhdGlvblJlc3VsdCkgPT4ge1xuICAgICAgIW9iai5yZXN1bHQgJiYgbWVzc2FnZXMucHVzaChvYmoubXNnISk7XG4gICAgICByZXR1cm4gb2JqLnJlc3VsdDtcbiAgICB9KTtcbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBbUkNDYWxsQ2xpZW50IGNhbGxdICR7bWVzc2FnZXMuam9pbignXFxuJyl9YCk7XG4gICAgfVxuXG4gICAgbGV0IGxvY2FsVHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSA9IFtdO1xuXG4gICAgY29uc3QgeyBjb2RlOiBfY29kZSwgdHJhY2tzIH0gPSBhd2FpdCB0aGlzLl9nZXRMb2NhbFRyYWNrKG1lZGlhVHlwZSwgY29uc3RyYWludHMpO1xuICAgIGlmIChfY29kZSAhPT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IF9jb2RlIH07XG4gICAgfVxuICAgIGxvY2FsVHJhY2tzID0gdHJhY2tzITtcblxuICAgIGxvY2FsVHJhY2tzLmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICAvLyDorr7nva7noIHnjodcbiAgICAgIGlmICh0cmFjay5pc0F1ZGlvVHJhY2soKSAmJiBiaXRyYXRlPy5hdWRpbykge1xuICAgICAgICB0cmFjay5zZXRCaXRyYXRlKGJpdHJhdGU/LmF1ZGlvKTtcbiAgICAgIH1cbiAgICAgIGlmICh0cmFjay5pc1ZpZGVvVHJhY2soKSAmJiBiaXRyYXRlPy52aWRlbykge1xuICAgICAgICB0cmFjay5zZXRCaXRyYXRlKGJpdHJhdGU/LnZpZGVvPy5tYXgsIGJpdHJhdGU/LnZpZGVvPy5taW4sIGJpdHJhdGU/LnZpZGVvPy5zdGFydCk7XG4gICAgICB9XG4gICAgICAvLyDlkJHlpJbmipvlh7rmnKzlnLDmtYFcbiAgICAgIGxpc3RlbmVyLm9uVHJhY2tSZWFkeSh0cmFjayk7XG4gICAgfSk7XG5cbiAgICAvLyDosIPnlKhjYWxsRW5naW5l55qEY2FsbOi/lOWbnuS4gOS4queKtuaAgeacuueahOWunuS+i1xuICAgIGNvbnN0IHsgY29kZSwgc3RhdGVNYWNoaW5lIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmNhbGwoY2hhbm5lbElkLCB0YXJnZXRJZCwgbWVkaWFUeXBlLCBleHRyYSwgcHVzaFRpdGxlVmFsdWUsIHB1c2hDb250ZW50VmFsdWUsIGlzQ3Jvc3NBcHBrZXkpO1xuICAgIGlmIChjb2RlID09PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUyAmJiBzdGF0ZU1hY2hpbmUpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgJ1tSQ0NhbGxDbGllbnQgY2FsbF0gc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgc3RhdGUgbWFjaGluZScpO1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IG5ldyBSQ0NhbGxTZXNzaW9uKHN0YXRlTWFjaGluZSwgdGhpcy5fcnRjQ2xpZW50LCB0aGlzLl9sb2dnZXIsIHtcbiAgICAgICAgbG9jYWxUcmFja3MsXG5cbiAgICAgICAgLy8g5piv5ZCm5YWB6K646K6i6ZiF6YeN6K+VXG4gICAgICAgIGlzQWxsb3dTdWJzY3JpYmVSZXRyeTogdGhpcy5fb3B0aW9ucy5pc0FsbG93U3Vic2NyaWJlUmV0cnksXG5cbiAgICAgICAgLy8g5piv5ZCm5YWB6K646K6i6ZiF6YeN6K+VXG4gICAgICAgIGlzQWxsb3dQdWJsaXNoUmV0cnk6IHRoaXMuX29wdGlvbnMuaXNBbGxvd1B1Ymxpc2hSZXRyeSxcblxuICAgICAgICAvKipcbiAgICAgICAgICog56aB55So6KeG6aKR5pe25YWz5pGE5YOP5aS0XG4gICAgICAgICAqL1xuICAgICAgICBpc09mZkNhbWVyYVdoZW5WaWRlb0Rpc2FibGU6IHRoaXMuX29wdGlvbnMuaXNPZmZDYW1lcmFXaGVuVmlkZW9EaXNhYmxlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSVEMg5oi/6Ze05Yqg5YWl57G75Z6LXG4gICAgICAgICAqL1xuICAgICAgICBqb2luVHlwZTogdGhpcy5fb3B0aW9ucy5qb2luVHlwZSxcblxuICAgICAgICAvLyDlhYHorrjpmY3nuqfojrflvpfmtYHvvIzojrflvpfpn7Pop4bpopHkuI3miJDlip8g77yM6ZmN57qn6I635b6X6Z+z6aKRLCDpu5jorqTkuI3lhYHorrhcbiAgICAgICAgaXNBbGxvd0RlbW90aW9uR2V0U3RyZWFtOiB0aGlzLl9vcHRpb25zLmlzQWxsb3dEZW1vdGlvbkdldFN0cmVhbSxcblxuICAgICAgICAvLyDmoIfmmI7mmK/kuLvlj6vkuqfnlJ/nmoRzZXNzaW9uXG4gICAgICAgIHByb2R1Y2VUeXBlOiBQcm9kdWNlVHlwZXMuQ0FMTEVSLFxuXG4gICAgICAgIGlzQ3Jvc3NBcHBrZXksXG5cbiAgICAgICAgY2FsbFB1c2hDb25maWc6IHRoaXMuX2NhbGxQdXNoQ29uZmlnLFxuXG4gICAgICAgIGh1bmd1cFB1c2hDb25maWc6IHRoaXMuX2h1bmd1cFB1c2hDb25maWcsXG4gICAgICB9KTtcblxuICAgICAgLy8gc2Vzc2lvbuS4iuazqOWGjOebkeWQrOS6i+S7tlxuICAgICAgc2Vzc2lvbi5yZWdpc3RlclNlc3Npb25MaXN0ZW5lcihsaXN0ZW5lcik7XG5cbiAgICAgIHRoaXMuX3Nlc3Npb25MaXN0LnB1c2goc2Vzc2lvbik7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsQ2xpZW50IGNhbGxdIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIHNlc3Npb24gb2JqZWN0LCBzZXNzaW9uSWQ6ICR7c2Vzc2lvbi5nZXRTZXNzaW9uSWQoKX1gKTtcbiAgICAgIHJldHVybiB7IGNvZGUsIHNlc3Npb24gfTtcbiAgICB9XG4gICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxDbGllbnQgY2FsbF0gY2FsbCBmYWlsZWQgY29kZSAtPjogJHtjb2RlfWApO1xuICAgIGxvY2FsVHJhY2tzLmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICAvLyDnpoHnlKjop4bpopFcbiAgICAgIHRyYWNrLm11dGUoKTtcblxuICAgICAgLy8g5YWz6Zet5pGE5YOP5aS0XG4gICAgICB0cmFjay5kZXN0cm95KCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog5Y+R6LW3576k57uE5ZG85Y+rXG4gICAqIEBwYXJhbSBwYXJhbXMudGFyZ2V0SWQg576k57uEIElkIOW/heWhq1xuICAgKiBAcGFyYW0gcGFyYW1zLnVzZXJJZHMg6KKr5ZG85Y+r55qE576k5YaF5oiQ5ZGYIElkIOW/heWhq1xuICAgKiBAcGFyYW0gcGFyYW1zLm1lZGlhVHlwZSDpn7PpopHlkbzlj6sgb3Ig6Z+z6KeG6aKR5ZG85Y+rIOW/heWhq1xuICAgKiBAcGFyYW0gcGFyYW1zLmxpc3RlbmVyIChzZXNzaW9u5LiK55qE55uR5ZCsKSDlv4XloatcbiAgICogQHBhcmFtIHBhcmFtcy5jb25zdHJhaW50cyDojrflj5bpn7PpopHmiJbpn7Pop4bpopHotYTmupDml7bnmoTlj4LmlbAg5Y+v6YCJXG4gICAqIEBwYXJhbSBwYXJhbXMuY2hhbm5lbElkIOe7hOe7hyBJZCDlj6/pgIlcbiAgICogQHBhcmFtIHBhcmFtcy5leHRyYSDmtojmga/mianlsZXkv6Hmga8g5Y+v6YCJXG4gICAqIEBkZXByZWNhdGVkIDUuMS4yIOeJiOacrOW6n+W8gyBwYXJhbXMucHVzaFRpdGxlIOmAmuefpeeahOagh+mimFxuICAgKiBAZGVwcmVjYXRlZCA1LjEuMiDniYjmnKzlup/lvIMgcGFyYW1zLnB1c2hDb250ZW50IOmAmuefpeeahOWGheWuuVxuICAgKiBAcGFyYW0gcGFyYW1zLmJpdHJhdGUg6ZyA6KaB6K6+572u55qE56CB546H5Y+C5pWwXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY2FsbEluR3JvdXAoe1xuICAgIHRhcmdldElkLCB1c2VySWRzLCBtZWRpYVR5cGUgPSBSQ0NhbGxNZWRpYVR5cGUuQVVESU8sIGxpc3RlbmVyLCBjb25zdHJhaW50cywgY2hhbm5lbElkID0gJycsIGV4dHJhID0gJycsIHB1c2hUaXRsZSA9ICcnLCBwdXNoQ29udGVudCA9ICcnLCBiaXRyYXRlLFxuICB9OiBJUkNDYWxsSW5Hcm91cFBhcmFtcyk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUsIHNlc3Npb24/OiBSQ0NhbGxTZXNzaW9uIH0+IHtcbiAgICBjb25zdCB7IHB1c2hUaXRsZTogcHVzaFRpdGxlVmFsdWUgPSAnJywgcHVzaENvbnRlbnQ6IHB1c2hDb250ZW50VmFsdWUgPSAnJyB9ID0gKHRoaXMuX2NhbGxQdXNoQ29uZmlnLnB1c2hUaXRsZSB8fCB0aGlzLl9jYWxsUHVzaENvbmZpZy5wdXNoQ29udGVudCkgPyB0aGlzLl9jYWxsUHVzaENvbmZpZyA6IHsgcHVzaFRpdGxlLCBwdXNoQ29udGVudCB9O1xuICAgIGNvbnN0IGNvbmNsdXNpb246IElWYWxpZGF0aW9uUmVzdWx0W10gPSBbdmFsaWRhdGVUYXJnZXRJZCh0YXJnZXRJZCksIHZhbGlkYXRlVXNlcklkcyh1c2VySWRzKSwgdmFsaWRhdGVNZWRpYVR5cGUobWVkaWFUeXBlKSwgdmFsaWRhdGVMaXN0ZW5lcihsaXN0ZW5lciksIHZhbGlkYXRlRXh0cmEoZXh0cmEpLCB2YWxpZGF0ZVB1c2hUaXRsZShwdXNoVGl0bGVWYWx1ZSksIHZhbGlkYXRlUHVzaENvbnRlbnQocHVzaENvbnRlbnRWYWx1ZSldO1xuICAgIGNvbnN0IG1lc3NhZ2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHJlc3VsdCA9IGNvbmNsdXNpb24uZXZlcnkoKG9iajogSVZhbGlkYXRpb25SZXN1bHQpID0+IHtcbiAgICAgICFvYmoucmVzdWx0ICYmIG1lc3NhZ2VzLnB1c2gob2JqLm1zZyEpO1xuICAgICAgcmV0dXJuIG9iai5yZXN1bHQ7XG4gICAgfSk7XG5cbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBbUkNDYWxsQ2xpZW50IGNhbGxJbkdyb3VwXSAke21lc3NhZ2VzLmpvaW4oJ1xcbicpfWApO1xuICAgIH1cblxuICAgIGxldCBsb2NhbFRyYWNrczogUkNMb2NhbFRyYWNrW10gPSBbXTtcblxuICAgIGNvbnN0IHsgY29kZTogX2NvZGUsIHRyYWNrcyB9ID0gYXdhaXQgdGhpcy5fZ2V0TG9jYWxUcmFjayhtZWRpYVR5cGUsIGNvbnN0cmFpbnRzKTtcbiAgICBpZiAoX2NvZGUgIT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBfY29kZSB9O1xuICAgIH1cbiAgICBsb2NhbFRyYWNrcyA9IHRyYWNrcyE7XG5cbiAgICBsb2NhbFRyYWNrcy5mb3JFYWNoKCh0cmFjaykgPT4ge1xuICAgICAgLy8g6K6+572u56CB546HXG4gICAgICBpZiAodHJhY2suaXNBdWRpb1RyYWNrKCkgJiYgYml0cmF0ZT8uYXVkaW8pIHtcbiAgICAgICAgdHJhY2suc2V0Qml0cmF0ZShiaXRyYXRlPy5hdWRpbyk7XG4gICAgICB9XG4gICAgICBpZiAodHJhY2suaXNWaWRlb1RyYWNrKCkgJiYgYml0cmF0ZT8udmlkZW8pIHtcbiAgICAgICAgdHJhY2suc2V0Qml0cmF0ZShiaXRyYXRlPy52aWRlbz8ubWF4LCBiaXRyYXRlPy52aWRlbz8ubWluLCBiaXRyYXRlPy52aWRlbz8uc3RhcnQpO1xuICAgICAgfVxuICAgICAgLy8g5ZCR5aSW5oqb5Ye65pys5Zyw5rWBXG4gICAgICBsaXN0ZW5lci5vblRyYWNrUmVhZHkodHJhY2spO1xuICAgIH0pO1xuXG4gICAgLy8g5b6A57uE6YeM5Y+R5raI5oGvXG4gICAgY29uc3QgeyBjb2RlLCBzdGF0ZU1hY2hpbmUgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuY2FsbEluR3JvdXAoY2hhbm5lbElkLCB0YXJnZXRJZCwgbWVkaWFUeXBlLCB1c2VySWRzLCBleHRyYSwgcHVzaFRpdGxlVmFsdWUsIHB1c2hDb250ZW50VmFsdWUpO1xuICAgIGlmIChjb2RlID09PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUyAmJiBzdGF0ZU1hY2hpbmUpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgJ1tSQ0NhbGxDbGllbnQgY2FsbEluR3JvdXBdIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIHN0YXRlIG1hY2hpbmUnKTtcbiAgICAgIGNvbnN0IHNlc3Npb24gPSBuZXcgUkNDYWxsU2Vzc2lvbihzdGF0ZU1hY2hpbmUsIHRoaXMuX3J0Y0NsaWVudCwgdGhpcy5fbG9nZ2VyLCB7XG4gICAgICAgIGxvY2FsVHJhY2tzLFxuXG4gICAgICAgIC8vIOaYr+WQpuWFgeiuuOiuoumYhemHjeivlVxuICAgICAgICBpc0FsbG93U3Vic2NyaWJlUmV0cnk6IHRoaXMuX29wdGlvbnMuaXNBbGxvd1N1YnNjcmliZVJldHJ5LFxuXG4gICAgICAgIC8vIOaYr+WQpuWFgeiuuOWPkeW4g+mHjeivlVxuICAgICAgICBpc0FsbG93UHVibGlzaFJldHJ5OiB0aGlzLl9vcHRpb25zLmlzQWxsb3dQdWJsaXNoUmV0cnksXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIOemgeeUqOinhumikeaXtuWFs+aRhOWDj+WktFxuICAgICAgICAgKi9cbiAgICAgICAgaXNPZmZDYW1lcmFXaGVuVmlkZW9EaXNhYmxlOiB0aGlzLl9vcHRpb25zLmlzT2ZmQ2FtZXJhV2hlblZpZGVvRGlzYWJsZSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUlRDIOaIv+mXtOWKoOWFpeexu+Wei1xuICAgICAgICAgKi9cbiAgICAgICAgam9pblR5cGU6IHRoaXMuX29wdGlvbnMuam9pblR5cGUsXG5cbiAgICAgICAgLy8g5YWB6K646ZmN57qn6I635b6X5rWB77yM6I635b6X6Z+z6KeG6aKR5LiN5oiQ5YqfIO+8jOmZjee6p+iOt+W+l+mfs+mikSwg6buY6K6k5LiN5YWB6K64XG4gICAgICAgIGlzQWxsb3dEZW1vdGlvbkdldFN0cmVhbTogdGhpcy5fb3B0aW9ucy5pc0FsbG93RGVtb3Rpb25HZXRTdHJlYW0sXG5cbiAgICAgICAgLy8g5qCH5piO5piv5Li75Y+r5Lqn55Sf55qEc2Vzc2lvblxuICAgICAgICBwcm9kdWNlVHlwZTogUHJvZHVjZVR5cGVzLkNBTExFUixcblxuICAgICAgICBjYWxsUHVzaENvbmZpZzogdGhpcy5fY2FsbFB1c2hDb25maWcsXG5cbiAgICAgICAgaHVuZ3VwUHVzaENvbmZpZzogdGhpcy5faHVuZ3VwUHVzaENvbmZpZyxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBzZXNzaW9u5LiK5rOo5YaM55uR5ZCs5LqL5Lu2XG4gICAgICBzZXNzaW9uLnJlZ2lzdGVyU2Vzc2lvbkxpc3RlbmVyKGxpc3RlbmVyKTtcbiAgICAgIHRoaXMuX3Nlc3Npb25MaXN0LnB1c2goc2Vzc2lvbik7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsQ2xpZW50IGNhbGxJbkdyb3VwXSBzdWNjZXNzZnVsbHkgY3JlYXRlZCBzZXNzaW9uIG9iamVjdCwgc2Vzc2lvbklkOiAke3Nlc3Npb24uZ2V0U2Vzc2lvbklkKCl9YCk7XG4gICAgICByZXR1cm4geyBjb2RlLCBzZXNzaW9uIH07XG4gICAgfVxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxDbGllbnQgY2FsbEluR3JvdXBdIGNhbGxJbkdyb3VwIGZhaWxlZCBjb2RlIC0+ICR7Y29kZX1gKTtcbiAgICBsb2NhbFRyYWNrcy5mb3JFYWNoKCh0cmFjaykgPT4ge1xuICAgICAgLy8g56aB55So6KeG6aKRXG4gICAgICB0cmFjay5tdXRlKCk7XG5cbiAgICAgIC8vIOWFs+mXreaRhOWDj+WktFxuICAgICAgdHJhY2suZGVzdHJveSgpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOiwg1JUQyBBUEkg6I635b6X5pys5Zyw5rWBXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9nZXRMb2NhbFRyYWNrQ29yZShtZWRpYVR5cGU6IFJDQ2FsbE1lZGlhVHlwZSwgY29uc3RyYWludHM/OiBJTWVkaWFTdHJlYW1Db25zdHJhaW50cyk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUsIHRyYWNrcz86IFJDTG9jYWxUcmFja1tdIH0+IHtcbiAgICAvLyDmo4DmtYvmmK/lkKbog73lpJ/ojrflvpfmnKzlnLDmtYFcbiAgICBpZiAobWVkaWFUeXBlID09PSBSQ0NhbGxNZWRpYVR5cGUuQVVESU8pIHtcbiAgICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5jcmVhdGVNaWNyb3Bob25lQXVkaW9UcmFjaygnUm9uZ0Nsb3VkUlRDJywgY29uc3RyYWludHMgJiYgY29uc3RyYWludHMuYXVkaW8gJiYgeyAuLi5jb25zdHJhaW50cy5hdWRpbyB9KTtcbiAgICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbENsaWVudCBfZ2V0VHJhY2tdIGdldCBBdWRpbyBsb2NhbCB0cmFja3MgZmFpbGVkIFJDVCBjb2RlIC0+ICR7Y29kZX1gKTtcbiAgICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLkdFVF9MT0NBTF9BVURJT19UUkFDS19FUlJPUiB9O1xuICAgICAgfVxuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCAnW1JDQ2FsbENsaWVudCBfZ2V0VHJhY2tdIHN1Y2Nlc3NmdWxseSBnZXQgQXVkaW8gbG9jYWwgdHJhY2tzJyk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUywgdHJhY2tzOiBbdHJhY2shXSB9O1xuICAgIH1cbiAgICBjb25zdCB7IGNvZGUsIHRyYWNrcyB9ID0gYXdhaXQgdGhpcy5fcnRjQ2xpZW50LmNyZWF0ZU1pY3JvcGhvbmVBbmRDYW1lcmFUcmFja3MoJ1JvbmdDbG91ZFJUQycsIGNvbnN0cmFpbnRzICYmIHsgLi4uY29uc3RyYWludHMgfSk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbENsaWVudCBfZ2V0VHJhY2tdIGdldCBBdWRpbyBhbmQgVmlkZW8gbG9jYWwgdHJhY2tzIGZhaWxlZCBSQ1QgY29kZSAtPiAke2NvZGV9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuR0VUX0xPQ0FMX0FVRElPX0FORF9WSURFT19UUkFDS19FUlJPUiB9O1xuICAgIH1cbiAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsICdbUkNDYWxsQ2xpZW50IF9nZXRUcmFja10gc3VjY2Vzc2Z1bGx5IGdldCBhdWRpbyBhbmQgdmlkZW8gbG9jYWwgdHJhY2tzJyk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MsIHRyYWNrcyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfZ2V0TG9jYWxUcmFjayhtZWRpYVR5cGU6IFJDQ2FsbE1lZGlhVHlwZSwgY29uc3RyYWludHM/OiBJTWVkaWFTdHJlYW1Db25zdHJhaW50cyk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUsIHRyYWNrcz86IFJDTG9jYWxUcmFja1tdIH0+IHtcbiAgICAvLyDlpoLmnpzmmK/lhYHorrjpmY3nuqfojrflvpfmtYHvvIzlubbkuJTmmK/ojrflvpfpn7Pop4bpopFcbiAgICBpZiAodGhpcy5fb3B0aW9ucy5pc0FsbG93RGVtb3Rpb25HZXRTdHJlYW0gJiYgbWVkaWFUeXBlID09PSBSQ0NhbGxNZWRpYVR5cGUuQVVESU9fVklERU8pIHtcbiAgICAgIGNvbnN0IHsgY29kZSwgdHJhY2tzIH0gPSBhd2FpdCB0aGlzLl9nZXRMb2NhbFRyYWNrQ29yZShSQ0NhbGxNZWRpYVR5cGUuQVVESU9fVklERU8sIGNvbnN0cmFpbnRzKTtcblxuICAgICAgLy8g5aaC5p6c6Z+z6KeG6aKR5LiN6IO96I635b6X77yM5bCx6ZmN57uE6I635b6X6Z+z6aKRXG4gICAgICBpZiAoY29kZSAhPT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgY29uc3QgeyBjb2RlLCB0cmFja3MgfSA9IGF3YWl0IHRoaXMuX2dldExvY2FsVHJhY2tDb3JlKFJDQ2FsbE1lZGlhVHlwZS5BVURJTywgY29uc3RyYWludHMpO1xuICAgICAgICBpZiAoY29kZSAhPT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgY29kZSwgdHJhY2tzIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyBjb2RlLCB0cmFja3MgfTtcbiAgICB9XG4gICAgY29uc3QgeyBjb2RlOiBfY29kZSwgdHJhY2tzIH0gPSBhd2FpdCB0aGlzLl9nZXRMb2NhbFRyYWNrQ29yZShtZWRpYVR5cGUsIGNvbnN0cmFpbnRzKTtcbiAgICBpZiAoX2NvZGUgIT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBfY29kZSB9O1xuICAgIH1cbiAgICByZXR1cm4geyBjb2RlOiBfY29kZSwgdHJhY2tzIH07XG4gIH1cblxuICAvKipcbiAgICog5LuOc2Vzc2lvbkxpc3TliKDpmaTmn5DkuKpzZXNzaW9uXG4gICAqL1xuICBwcml2YXRlIF9yZW1vdmVTZXNzaW9uKHNlc3Npb246IFJDQ2FsbFNlc3Npb24pIHtcbiAgICBjb25zdCBpZCA9IHNlc3Npb24uZ2V0U2Vzc2lvbklkKCk7XG4gICAgdGhpcy5fc2Vzc2lvbkxpc3QgPSB0aGlzLl9zZXNzaW9uTGlzdC5maWx0ZXIoKHNlc3Npb24pID0+IHNlc3Npb24uZ2V0U2Vzc2lvbklkKCkgIT09IGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blt7Hmlrnlhbbku5bnq6/liqDlhaXpgJror53vvIjlt7LliqDlhaUgUlRDIOaIv+mXtO+8ieeahOeUqOaIt+S/oeaBr1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldEpvaW5lZFJvb21JbmZvKCk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUsIGRhdGE/OiBJUlRDSm9pbmVkSW5mb1tdIH0+IHtcbiAgICBjb25zdCB7IGNvZGUsIGRhdGEgfSA9IGF3YWl0IHRoaXMuX2NvbnRleHQuZ2V0UlRDSm9pbmVkVXNlckluZm8odGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSk7XG4gICAgaWYgKGNvZGUgIT09IEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgZ2V0Sm9pbmVkVXNlckluZm8gZXJyb3IgY29kZTogJHtjb2RlfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlFVRVJZX0pPSU5FRF9VU0VSX0lORk9fRVJST1IgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUywgZGF0YSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOiuvue9ruWRvOWPq+OAgeaMguaWreaOqOmAgeaVsOaNrlxuICAgKiBAcGFyYW0gY2FsbFB1c2hDb25maWcg5ZG85Y+r5o6o6YCB6YWN572uXG4gICAqIEBwYXJhbSBjYWxsUHVzaENvbmZpZy5wdXNoVGl0bGUg5ZG85Y+r5o6o6YCB5qCH6aKYXG4gICAqIEBwYXJhbSBjYWxsUHVzaENvbmZpZy5wdXNoQ29udGVudCDlkbzlj6vmjqjpgIHlhoXlrrlcbiAgICogQHBhcmFtIGh1bmd1cFB1c2hDb25maWcg5oyC5pat5o6o6YCB6YWN572uXG4gICAqIEBwYXJhbSBodW5ndXBQdXNoQ29uZmlnLnB1c2hUaXRsZSDmjILmlq3mjqjpgIHmoIfpophcbiAgICogQHBhcmFtIGh1bmd1cFB1c2hDb25maWcucHVzaENvbnRlbnQg5oyC5pat5o6o6YCB5YaF5a65XG4gICAqL1xuICBwdWJsaWMgc2V0UHVzaENvbmZpZyhjYWxsUHVzaENvbmZpZzogSVB1c2hDb25maWcgPSB7fSwgaHVuZ3VwUHVzaENvbmZpZzogSVB1c2hDb25maWcgPSB7fSkge1xuICAgIGNvbnN0IGNvbmNsdXNpb24gPSBbY2FsbFB1c2hDb25maWcsIGh1bmd1cFB1c2hDb25maWddLm1hcCgocHVzaENvbmZpZzogSVB1c2hDb25maWcpID0+IHZhbGlkYXRlUHVzaENvbmZpZyhwdXNoQ29uZmlnKSlbMF07XG5cbiAgICBjb25zdCBtZXNzYWdlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCByZXN1bHQgPSBjb25jbHVzaW9uLmV2ZXJ5KChvYmo6IElWYWxpZGF0aW9uUmVzdWx0KSA9PiB7XG4gICAgICAhb2JqLnJlc3VsdCAmJiBtZXNzYWdlcy5wdXNoKG9iai5tc2chKTtcbiAgICAgIHJldHVybiBvYmoucmVzdWx0O1xuICAgIH0pO1xuXG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW1JDQ2FsbENsaWVudCBjYWxsSW5Hcm91cCBjYWxsUHVzaENvbmZpZyBvciBodW5ndXBQdXNoQ29uZmlnXSAke21lc3NhZ2VzLmpvaW4oJ1xcbicpfWApO1xuICAgIH1cblxuICAgIHRoaXMuX2NhbGxQdXNoQ29uZmlnID0gY2FsbFB1c2hDb25maWc7XG4gICAgdGhpcy5faHVuZ3VwUHVzaENvbmZpZyA9IGh1bmd1cFB1c2hDb25maWc7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIElQbHVnaW5HZW5lcmF0b3IsIElSdW50aW1lLCBSVENQbHVnaW5Db250ZXh0LCBWZXJzaW9uTWFuYWdlLFxufSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQge1xuICBSQ0NhbGxFcnJvckNvZGUsIFJDQ2FsbExhbmd1YWdlLCBSQ0NhbGxFbmRSZWFzb24sIFJDQ2FsbE1lZGlhVHlwZSwgUkNDYWxsVXNlclN0YXRlLCBSQ0NhbGxTZXNzaW9uU3RhdGUsIElFbmRTdW1tYXJ5LCBJSW52aXRlZFVzZXJzLCBJU2VuZGVySW5mbywgSU9mZmxpbmVSZWNvcmQsXG59IGZyb20gJ0ByYy1lbWJlZC9jYWxsLWVuZ2luZSc7XG5pbXBvcnQgeyBJUkNSVENTdGF0ZVJlcG9ydCB9IGZyb20gJ0Byb25nY2xvdWQvcGx1Z2luLXJ0Yyc7XG5pbXBvcnQge1xuICBJUkNDYWxsSW5pdE9wdGlvbnMsIElSQ0NhbGxQYXJhbXMsIElSQ0NhbGxJbkdyb3VwUGFyYW1zLCBJU2Vzc2lvbkxpc3RlbmVyLCBJTXV0ZVVzZXIsIElNZWRpYVN0cmVhbUNvbnN0cmFpbnRzLCBJRGV2aWNlQ2hhbmdlUGFyYW1zLCBJVmFsaWRhdGlvblJlc3VsdCwgSVB1c2hDb25maWcsXG59IGZyb20gJy4vaW50ZXJmYWNlJztcbmltcG9ydCBSQ0NhbGxDbGllbnQgZnJvbSAnLi9SQ0NhbGxDbGllbnQnO1xuaW1wb3J0IHsgUkNDYWxsU2Vzc2lvbiB9IGZyb20gJy4vUkNDYWxsU2Vzc2lvbic7XG5pbXBvcnQgeyB2YWxpZGF0ZUNhbGxJbml0T3B0aW9ucyB9IGZyb20gJy4vdmFsaWRhdGlvbic7XG5cbi8vIHBsdWdpbi1jYWxsIOeJiOacrOS4iuaKpVxuVmVyc2lvbk1hbmFnZS5hZGQoJ3BsdWdpbi1jYWxsJywgX19WRVJTSU9OX18pO1xuXG5jb25zdCBpbnN0YWxsZXI6IElQbHVnaW5HZW5lcmF0b3I8UkNDYWxsQ2xpZW50LCBJUkNDYWxsSW5pdE9wdGlvbnM+ID0ge1xuICB0YWc6ICdSQ0NhbGwnLFxuICB2ZXJpZnkocnVudGltZTogSVJ1bnRpbWUpIHtcbiAgICByZXR1cm4gcnVudGltZS50YWcgPT09ICdicm93c2VyJztcbiAgfSxcbiAgc2V0dXAoY29udGV4dDogUlRDUGx1Z2luQ29udGV4dCwgcnVudGltZTogSVJ1bnRpbWUsIG9wdGlvbnM6IElSQ0NhbGxJbml0T3B0aW9ucyk6IFJDQ2FsbENsaWVudCB7XG4gICAgLy8g5YWI5qCh6aqM5Y+C5pWwXG4gICAgY29uc3QgY29uY2x1c2lvbjogSVZhbGlkYXRpb25SZXN1bHQgPSB2YWxpZGF0ZUNhbGxJbml0T3B0aW9ucyhvcHRpb25zKTtcbiAgICBpZiAoIWNvbmNsdXNpb24ucmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtSQ0NhbGxMaWIgaW5zdGFsbGVyIHN0ZXVwXSR7Y29uY2x1c2lvbi5tc2d9YCk7XG4gICAgfVxuXG4gICAgLy8g5qCh6aqM5b2T5YmN5a6J6KOF55qEIGVuZ2luZSDniYjmnKzmmK/lkKblj6/nlKhcbiAgICBpZiAoIVZlcnNpb25NYW5hZ2UudmFsaWRFbmdpbmUoX19SRVFVSVJFRF9FTkdJTkVfVkVSU0lPTl9fKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgY3VycmVudCBlbmdpbmUgdmVyc2lvbiAnJHtWZXJzaW9uTWFuYWdlLmdldEluZm8oKS5lbmdpbmV9JyBlcnJvciwgcGx1Z2luLWNhbGwgcmVxdWlyZWQgZW5naW5lIHZlcnNpb24gYXQgbGVhc3QgJyR7X19SRVFVSVJFRF9FTkdJTkVfVkVSU0lPTl9ffScuYCk7XG4gICAgfVxuXG4gICAgY29uc3QgbG9nZ2VyID0gY29udGV4dC5jcmVhdGVMb2dnZXIoJ1JDQ2FsbCcsICdSVEMnKTtcbiAgICBvcHRpb25zLmxvZ091dHB1dExldmVsICYmIGxvZ2dlci5zZXRPdXRwdXRMZXZlbChvcHRpb25zLmxvZ091dHB1dExldmVsKTtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5sb2dMZXZlbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdfJywgJ1RoZSBcXCdsb2dMZXZlbFxcJyBwYXJhbWV0ZXIgaXMgZGVwcmVjYXRlZCwgcGxlYXNlIHVzZSBcXCdsb2dPdXRwdXRMZXZlbFxcJyBpbnN0ZWFkLicpO1xuICAgIH1cblxuICAgIGxvZ2dlci53YXJuKCdfJywgYFJDQ2FsbCBWZXJzaW9uOiAke19fVkVSU0lPTl9ffSwgQ29tbWl0OiAke19fQ09NTUlUX0lEX199YCk7XG5cbiAgICByZXR1cm4gbmV3IFJDQ2FsbENsaWVudChjb250ZXh0LCBydW50aW1lLCBsb2dnZXIsIG9wdGlvbnMpO1xuICB9LFxufTtcblxuZXhwb3J0IHtcbiAgaW5zdGFsbGVyLFxuICBSQ0NhbGxDbGllbnQsXG4gIFJDQ2FsbFNlc3Npb24sXG4gIFJDQ2FsbExhbmd1YWdlLFxuICBSQ0NhbGxFcnJvckNvZGUsXG4gIFJDQ2FsbEVuZFJlYXNvbixcbiAgUkNDYWxsTWVkaWFUeXBlLFxuICBSQ0NhbGxVc2VyU3RhdGUsXG4gIFJDQ2FsbFNlc3Npb25TdGF0ZSxcbn07XG5cbmV4cG9ydCB0eXBlIHtcbiAgSUVuZFN1bW1hcnksXG4gIElSQ0NhbGxJbml0T3B0aW9ucyxcbiAgSVJDQ2FsbFBhcmFtcyxcbiAgSVJDQ2FsbEluR3JvdXBQYXJhbXMsXG4gIElTZXNzaW9uTGlzdGVuZXIsXG4gIElTZW5kZXJJbmZvLFxuICBJTXV0ZVVzZXIsXG4gIElJbnZpdGVkVXNlcnMsXG4gIElNZWRpYVN0cmVhbUNvbnN0cmFpbnRzLFxuICBJRGV2aWNlQ2hhbmdlUGFyYW1zLFxuICBJT2ZmbGluZVJlY29yZCxcbiAgSVJDUlRDU3RhdGVSZXBvcnQsXG4gIElQdXNoQ29uZmlnLFxufTtcbiJdLCJuYW1lcyI6WyJzdHJpbmcxMHRvNjQiLCJudW1iZXIiLCJjaGFycyIsInJhZGl4IiwicXV0aWVudCIsImFyciIsIm1vZCIsImdldFVVSUQiLCJjIiwiciIsImdldFVVSUQyMiIsInV1aWQiLCJnZW5lcmF0ZVJhbmRvbUlkIiwicmFuZG9tIiwidGltZXJTZXRUaW1lb3V0IiwiZnVuYyIsInRpbWVvdXQiLCJldmVudEVtaXR0ZXIiLCJFdmVudEVtaXR0ZXIiLCJnZXRDYWxsRGV2aWNlSWQiLCJydW50aW1lIiwia2V5IiwiTXNnQ2FsbFN0YXR1cyIsIk1zZ0NhbGxTdGF0dXMyIiwiUkNDYWxsRXJyb3JDb2RlIiwiUkNDYWxsRW5kUmVhc29uIiwiQ2FsbFJlbW90ZUVuZFJlYXNvbiIsIlJDQ2FsbE1lc3NhZ2VUeXBlIiwiUkNDYWxsU2Vzc2lvblN0YXRlIiwiUkNDYWxsU2Vzc2lvblN0YXRlMiIsIlJDQ2FsbFVzZXJTdGF0ZSIsIlJDQ2FsbFVzZXJTdGF0ZTIiLCJSQ0Nyb3NzQ2FsbFR5cGUiLCJUaW1lciQxIiwiY2FsbGJhY2siLCJfX3B1YmxpY0ZpZWxkIiwiZW5kVGltZSIsImR1cmF0aW9uIiwiUkNDYWxsU3RhdGVNYWNoaW5lIiwiX2NvbnRleHQiLCJfcnVudGltZSIsIl9sb2dnZXIiLCJfY2FsbE1zZ0hhbmRsZXIiLCJfY2hhbm5lbElkIiwiX2NvbnZlcnNhdGlvblR5cGUiLCJfdGFyZ2V0SWQiLCJfbWVkaWFUeXBlIiwiX2NhbGxJZCIsInNlbnRUaW1lIiwiZGVsYXlUaW1lIiwidXNlcklkIiwic3RhdGUiLCJyZWFzb24iLCJfYSIsInVzZXIiLCJtZXNzYWdlIiwic2VuZGVyVXNlcklkIiwidXNlclByb2ZpbGUiLCJodW5ndXBSZWFzb24iLCJtZXNzYWdlVHlwZSIsImVuZFJlYXNvbiIsInJlbW90ZVVzZXJJZCIsIm1zZ0RldmljZUlkIiwic3VpZCIsImRldmljZUlkIiwic2VuZGVyRGV2aWNlSWQiLCJjdXJyZW50VXNlcklkIiwiQ29udmVyc2F0aW9uVHlwZSIsImlzQ3VycmVudFVzZXJJZCIsIm1lZGlhVHlwZSIsImNvbnRlbnQiLCJpc0xlc3NUaGFuVHdvIiwiaXNJbnZpdGVVc2VyIiwiaXNOb09uZUFuc3dlcmVkIiwid2F0Y2hlcnMiLCJpbmlkcyIsInJvb21UeXBlIiwidXNlcklkTGlzdCIsImlkIiwiaW52aXRlVXNlcklkcyIsIlRpbWVyIiwiZXhpc3RlZFVzZXJQb2ZpbGVzIiwiY2FsbGVyIiwibmVlZFJpbmdpbmdVc2VySWRzIiwidXNlckluZm8iLCJjYWxsU3RhdHVzIiwiZXJyb3IiLCJ1c2VySWRzIiwiZXh0cmEiLCJwdXNoVGl0bGUiLCJwdXNoQ29udGVudCIsImlzQ3Jvc3NBcHBrZXkiLCJjb2RlIiwiaXNDYWxsZXIiLCJlbmRDb2RlIiwib3B0aW9ucyIsImV4aXN0ZWRVc2VySWRzIiwiaGFuZ3VwUGFyYW1zIiwibXNnQ29kZSIsInJlbW90ZVVzZXJzIiwicHVzaENvbmZpZyIsInJlbW90ZVVzZXIiLCJ1aWQiLCJiZWdpblRpbWVzdGFtcCIsImVuZFRpbWVzdGFtcCIsInN1bW1hcnkiLCJSQ0NhbGxNZWRpYVR5cGUiLCJSQ0NhbGxNZWRpYVR5cGUyIiwiTWVtYmVyTW9kaWZ5VHlwZSIsIk1lbWJlck1vZGlmeVR5cGUyIiwiUGxhdGZvcm0iLCJPZmZsaW5lUmVjb3JkZXIiLCJfb25SZWNvcmQiLCJjaGFubmVsSWQiLCJjb252ZXJzYXRpb25UeXBlIiwidGFyZ2V0SWQiLCJjYWxsSWQiLCJpc1NlbGZTZW5kIiwibWVzc2FnZXMiLCJtc2ciLCJjYWxsTXNnVHlwZXMiLCJFbmdpbmVFcnJvckNvZGVUb0NhbGxFcnJvckNvZGUiLCJFcnJvckNvZGUiLCJDYWxsTWVzc2FnZUhhbmRsZXIiLCJfb2ZmbGluZU1zZ0l0diIsIl9nZXRTdGF0ZU1hY2hpbmUiLCJyZWNvcmQiLCJtYXJrVGltZSIsImN1cnJlbnRNc2dTZW50VGltZSIsImluc2VydEluZGV4IiwiaW5kZXgiLCJjdXJyZW50VGltZSIsImJ1ZmZlcnMiLCJpdGVtIiwibWVzc2FnZVVJZCIsImlzT2ZmTGluZU1lc3NhZ2UiLCJvZmZsaW5lQnVmZmVycyIsImludml0ZUNhbGxJZCIsImlzSW52aXRlTXNnVHlwZSIsImlzTGVzc1RoYW5PZmZsaW5lTXNnSXR2IiwidGFza01zZ0xpc3QiLCJpIiwib3RoZXJDYWxsSWQiLCJkZWxJbmRleCIsImRlbE9mZmxpbmVJbmRleCIsImlzVW5maW5pc2hlZFByaXZhdGVDYWxsIiwiaXNPbmx5SW52aXRlIiwiaGFzSW52aXRlQW5kUmluZ2luZyIsImlzVW5maW5pc2hlZEdycENhbGwiLCJpc1VuZmluaXNoZWQiLCJub09uZUFjY2VwdCIsImFsbFVzZXJJZHMiLCJpc0NhbGxlckh1bmd1cCIsInRhc2tNc2dTZW5kZXJVc2VySWQiLCJkZWxDb3VudCIsImxpc3RlbmVyIiwiZnVuY05hbWUiLCJldmVudCIsImV2ZW50VHlwZSIsImRpcmVjdGlvbmFsVXNlcklkTGlzdCIsInB1c2hEYXRhIiwic2VuZE9wdHMiLCJwdXNoQ29uaWZnIiwiY2FsbGVySWQiLCJSQ0NhbGxMYW5ndWFnZSIsIkVOIiwiWkgiLCJMb2NhbCIsImxhbmciLCJSQ0NhbGxFbmdpbmUiLCJfd2F0Y2hlcnMiLCJfb3B0aW9ucyIsImNydFVzZXJJZCIsImluZm8iLCJQcm9kdWNlVHlwZXMiLCJmdW4iLCJvbiIsImRhdGEiLCJmdW5zIiwiY2IiLCJsZW5ndGgiLCJpc0xhbmd1YWdlIiwidmFsIiwiaXNKb2luVHlwZSIsIlJUQ0pvaW5UeXBlIiwiaXNMb2dMZXZlbCIsIkxvZ0wiLCJ2YWxpZGF0ZUNhbGxJbml0T3B0aW9ucyIsImtleU5hbWVzIiwia2V5cyIsIm1pc3NpbmdLZXlzIiwidmFsaWRhdGVMaXN0ZW5lciIsInZhbGlkYXRlVGFyZ2V0SWQiLCJ2YWxpZGF0ZU1lZGlhVHlwZSIsInZhbGlkYXRlRXh0cmEiLCJ2YWxpZGF0ZVB1c2hUaXRsZSIsInZhbGlkYXRlUHVzaENvbnRlbnQiLCJ2YWxpZGF0ZVB1c2hDb25maWciLCJjb25jbHVzaW9uIiwidmFsaWRhdGVVc2VySWRzIiwic3RyIiwiaXNSQ0ZyYW1lUmF0ZSIsImlzVmFsaWRSZXNvbHV0aW9uIiwicmVzb2x1dGlvbiIsIlJDUmVzb2x1dGlvbiIsInZhbGlkYXRlTWVkaWFTdHJlYW1Db25zdHJhaW50cyIsImNvbnN0cmFpbnRzIiwiUkNDYWxsU2Vzc2lvbiIsIl9zdGF0ZU1hY2hpbmUiLCJfcnRjQ2xpZW50Iiwicm9vbUlkIiwic3VtbWFyeUluZm8iLCJzZW5kZXIiLCJpbnZpdGVkVXNlcnMiLCJjYWxsQmFjayIsInJvb20iLCJSQ1JUQ0NvZGUiLCJ0cmFja3MiLCJpc0FsbG93U3Vic2NyaWJlUmV0cnkiLCJjb3VudCIsImlzQWxsb3dQdWJsaXNoUmV0cnkiLCJ0cmFjayIsIl9jb2RlIiwiYXVkaW9Db25zdHJhaW50cyIsInJlY2VudFRyYWNrcyIsImxvY2FsVHJhY2tzIiwiX2IiLCJvYmoiLCJsb2NhbFZpZGVvVHJhY2tzIiwibG9jYWxBdWRpb3RyYWNrcyIsImJ5U2VydmVyIiwiUkNLaWNrUmVhc29uIiwibmFtZSIsImF1ZGlvVHJhY2siLCJtdXRlVXNlciIsInZpZGVvVHJhY2siLCJyZXN1bHQiLCJyZXBvcnQiLCJSQ0NhbGxDbGllbnQiLCJzZXNzaW9uIiwic2VzIiwic3RhdGVNYWNoaW5lIiwiYml0cmF0ZSIsInB1c2hUaXRsZVZhbHVlIiwicHVzaENvbnRlbnRWYWx1ZSIsIl9jIiwiY2FsbFB1c2hDb25maWciLCJodW5ndXBQdXNoQ29uZmlnIiwiVmVyc2lvbk1hbmFnZSIsImluc3RhbGxlciIsImNvbnRleHQiLCJsb2dnZXIiXSwibWFwcGluZ3MiOiI7Ozs7O0FBRUEsTUFBTUEsS0FBZSxDQUFDQyxNQUFtQjtBQUNqQyxRQUFBQyxJQUFRLG1FQUFtRSxNQUFNLEVBQUUsR0FDbkZDLElBQVFELEVBQU0sU0FBUztBQUM3QixNQUFJRSxJQUFVLENBQUNIO0FBQ2YsUUFBTUksSUFBTSxDQUFBO0FBQ1QsS0FBQTtBQUNELFVBQU1DLElBQU1GLElBQVVEO0FBQ3RCLElBQUFDLEtBQVdBLElBQVVFLEtBQU9ILEdBQ3hCRSxFQUFBLFFBQVFILEVBQU1JLENBQUcsQ0FBQztBQUFBLFdBQ2ZGO0FBQ0YsU0FBQUMsRUFBSSxLQUFLLEVBQUU7QUFDcEIsR0FFTUUsS0FBVSxNQUFNLHVDQUF1QyxRQUFRLFNBQVMsQ0FBQ0MsTUFBTTtBQUNuRixRQUFNQyxJQUFJLEtBQUssT0FBTyxJQUFJLEtBQUs7QUFFeEIsVUFER0QsTUFBTSxNQUFNQyxJQUFLQSxJQUFJLElBQU0sR0FDNUIsU0FBUyxFQUFFO0FBQ3RCLENBQUMsR0FHWUMsS0FBWSxNQUFNO0FBQzdCLE1BQUlDLElBQXdCSjtBQUM1QixTQUFBSSxJQUFPLEdBQUdBLEVBQUssUUFBUSxNQUFNLEVBQUUsTUFDeEJBLElBQUEsU0FBU0EsR0FBTSxFQUFFLEdBQ3hCQSxJQUFPWCxHQUFhVyxDQUFJLEdBQ3BCQSxFQUFLLFNBQVMsT0FDVEEsSUFBQUEsRUFBSyxNQUFNLEdBQUcsRUFBRSxJQUVsQkE7QUFDVCxHQUthQyxJQUFtQixNQUFjO0FBQzVDLFFBQU1DLElBQVMsS0FBSyxNQUFNLEtBQUssT0FBQSxJQUFXLEdBQUk7QUFDOUMsTUFBSUYsSUFBT0Q7QUFDSixTQUFBQyxJQUFBQSxFQUFLLFFBQVEsT0FBTyxHQUFHLEdBQ2pCLENBQUNBLEdBQU0sS0FBSyxJQUFBLEdBQU9FLENBQU0sRUFDMUIsS0FB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