@cloudflare/realtimekit 1.5.0-staging.1 → 1.5.0-staging.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,193 +1,193 @@
1
- var Wl = Object.defineProperty, ml = Object.defineProperties;
2
- var Gl = Object.getOwnPropertyDescriptors;
3
- var Q = Object.getOwnPropertySymbols;
1
+ var Xl = Object.defineProperty, Gl = Object.defineProperties;
2
+ var ml = Object.getOwnPropertyDescriptors;
3
+ var e = Object.getOwnPropertySymbols;
4
4
  var Rl = Object.prototype.hasOwnProperty, pl = Object.prototype.propertyIsEnumerable;
5
- var z = (Z, d, l) => d in Z ? Wl(Z, d, { enumerable: !0, configurable: !0, writable: !0, value: l }) : Z[d] = l, n = (Z, d) => {
5
+ var K = (Z, d, l) => d in Z ? Xl(Z, d, { enumerable: !0, configurable: !0, writable: !0, value: l }) : Z[d] = l, n = (Z, d) => {
6
6
  for (var l in d || (d = {}))
7
- Rl.call(d, l) && z(Z, l, d[l]);
8
- if (Q)
9
- for (var l of Q(d))
10
- pl.call(d, l) && z(Z, l, d[l]);
7
+ Rl.call(d, l) && K(Z, l, d[l]);
8
+ if (e)
9
+ for (var l of e(d))
10
+ pl.call(d, l) && K(Z, l, d[l]);
11
11
  return Z;
12
- }, e = (Z, d) => ml(Z, Gl(d));
13
- var R = (Z, d, l) => (z(Z, typeof d != "symbol" ? d + "" : d, l), l), B = (Z, d, l) => {
12
+ }, Q = (Z, d) => Gl(Z, ml(d));
13
+ var R = (Z, d, l) => (K(Z, typeof d != "symbol" ? d + "" : d, l), l), B = (Z, d, l) => {
14
14
  if (!d.has(Z))
15
15
  throw TypeError("Cannot " + l);
16
16
  };
17
- var M = (Z, d, l) => (B(Z, d, "read from private field"), l ? l.call(Z) : d.get(Z)), p = (Z, d, l) => {
17
+ var w = (Z, d, l) => (B(Z, d, "read from private field"), l ? l.call(Z) : d.get(Z)), p = (Z, d, l) => {
18
18
  if (d.has(Z))
19
19
  throw TypeError("Cannot add the same private member more than once");
20
20
  d instanceof WeakSet ? d.add(Z) : d.set(Z, l);
21
21
  };
22
- var y = (Z, d, l) => (B(Z, d, "access private method"), l);
23
- var i = (Z, d, l) => new Promise((c, b) => {
24
- var X = (G) => {
22
+ var Y = (Z, d, l) => (B(Z, d, "access private method"), l);
23
+ var J = (Z, d, l) => new Promise((c, b) => {
24
+ var W = (m) => {
25
25
  try {
26
- W(l.next(G));
27
- } catch (Y) {
28
- b(Y);
26
+ X(l.next(m));
27
+ } catch (u) {
28
+ b(u);
29
29
  }
30
- }, V = (G) => {
30
+ }, V = (m) => {
31
31
  try {
32
- W(l.throw(G));
33
- } catch (Y) {
34
- b(Y);
32
+ X(l.throw(m));
33
+ } catch (u) {
34
+ b(u);
35
35
  }
36
- }, W = (G) => G.done ? c(G.value) : Promise.resolve(G.value).then(X, V);
37
- W((l = l.apply(Z, d)).next());
36
+ }, X = (m) => m.done ? c(m.value) : Promise.resolve(m.value).then(W, V);
37
+ X((l = l.apply(Z, d)).next());
38
38
  });
39
- var L = {}, yl = {
39
+ var L = {}, Yl = {
40
40
  get exports() {
41
41
  return L;
42
42
  },
43
43
  set exports(Z) {
44
44
  L = Z;
45
45
  }
46
- }, h = typeof Reflect == "object" ? Reflect : null, j = h && typeof h.apply == "function" ? h.apply : function(d, l, c) {
46
+ }, h = typeof Reflect == "object" ? Reflect : null, M = h && typeof h.apply == "function" ? h.apply : function(d, l, c) {
47
47
  return Function.prototype.apply.call(d, l, c);
48
- }, I;
49
- h && typeof h.ownKeys == "function" ? I = h.ownKeys : Object.getOwnPropertySymbols ? I = function(d) {
48
+ }, s;
49
+ h && typeof h.ownKeys == "function" ? s = h.ownKeys : Object.getOwnPropertySymbols ? s = function(d) {
50
50
  return Object.getOwnPropertyNames(d).concat(Object.getOwnPropertySymbols(d));
51
- } : I = function(d) {
51
+ } : s = function(d) {
52
52
  return Object.getOwnPropertyNames(d);
53
53
  };
54
- function Yl(Z) {
54
+ function ul(Z) {
55
55
  console && console.warn && console.warn(Z);
56
56
  }
57
57
  var P = Number.isNaN || function(d) {
58
58
  return d !== d;
59
59
  };
60
- function m() {
61
- m.init.call(this);
60
+ function G() {
61
+ G.init.call(this);
62
62
  }
63
- yl.exports = m;
64
- L.once = Jl;
65
- m.EventEmitter = m;
66
- m.prototype._events = void 0;
67
- m.prototype._eventsCount = 0;
68
- m.prototype._maxListeners = void 0;
69
- var w = 10;
70
- function o(Z) {
63
+ Yl.exports = G;
64
+ L.once = il;
65
+ G.EventEmitter = G;
66
+ G.prototype._events = void 0;
67
+ G.prototype._eventsCount = 0;
68
+ G.prototype._maxListeners = void 0;
69
+ var j = 10;
70
+ function z(Z) {
71
71
  if (typeof Z != "function")
72
72
  throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof Z);
73
73
  }
74
- Object.defineProperty(m, "defaultMaxListeners", {
74
+ Object.defineProperty(G, "defaultMaxListeners", {
75
75
  enumerable: !0,
76
76
  get: function() {
77
- return w;
77
+ return j;
78
78
  },
79
79
  set: function(Z) {
80
80
  if (typeof Z != "number" || Z < 0 || P(Z))
81
81
  throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + Z + ".");
82
- w = Z;
82
+ j = Z;
83
83
  }
84
84
  });
85
- m.init = function() {
85
+ G.init = function() {
86
86
  (this._events === void 0 || this._events === Object.getPrototypeOf(this)._events) && (this._events = /* @__PURE__ */ Object.create(null), this._eventsCount = 0), this._maxListeners = this._maxListeners || void 0;
87
87
  };
88
- m.prototype.setMaxListeners = function(d) {
88
+ G.prototype.setMaxListeners = function(d) {
89
89
  if (typeof d != "number" || d < 0 || P(d))
90
90
  throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + d + ".");
91
91
  return this._maxListeners = d, this;
92
92
  };
93
- function f(Z) {
94
- return Z._maxListeners === void 0 ? m.defaultMaxListeners : Z._maxListeners;
93
+ function O(Z) {
94
+ return Z._maxListeners === void 0 ? G.defaultMaxListeners : Z._maxListeners;
95
95
  }
96
- m.prototype.getMaxListeners = function() {
97
- return f(this);
96
+ G.prototype.getMaxListeners = function() {
97
+ return O(this);
98
98
  };
99
- m.prototype.emit = function(d) {
99
+ G.prototype.emit = function(d) {
100
100
  for (var l = [], c = 1; c < arguments.length; c++)
101
101
  l.push(arguments[c]);
102
- var b = d === "error", X = this._events;
103
- if (X !== void 0)
104
- b = b && X.error === void 0;
102
+ var b = d === "error", W = this._events;
103
+ if (W !== void 0)
104
+ b = b && W.error === void 0;
105
105
  else if (!b)
106
106
  return !1;
107
107
  if (b) {
108
108
  var V;
109
109
  if (l.length > 0 && (V = l[0]), V instanceof Error)
110
110
  throw V;
111
- var W = new Error("Unhandled error." + (V ? " (" + V.message + ")" : ""));
112
- throw W.context = V, W;
111
+ var X = new Error("Unhandled error." + (V ? " (" + V.message + ")" : ""));
112
+ throw X.context = V, X;
113
113
  }
114
- var G = X[d];
115
- if (G === void 0)
114
+ var m = W[d];
115
+ if (m === void 0)
116
116
  return !1;
117
- if (typeof G == "function")
118
- j(G, this, l);
117
+ if (typeof m == "function")
118
+ M(m, this, l);
119
119
  else
120
- for (var Y = G.length, u = _(G, Y), c = 0; c < Y; ++c)
121
- j(u[c], this, l);
120
+ for (var u = m.length, y = _(m, u), c = 0; c < u; ++c)
121
+ M(y[c], this, l);
122
122
  return !0;
123
123
  };
124
- function O(Z, d, l, c) {
125
- var b, X, V;
126
- if (o(l), X = Z._events, X === void 0 ? (X = Z._events = /* @__PURE__ */ Object.create(null), Z._eventsCount = 0) : (X.newListener !== void 0 && (Z.emit(
124
+ function f(Z, d, l, c) {
125
+ var b, W, V;
126
+ if (z(l), W = Z._events, W === void 0 ? (W = Z._events = /* @__PURE__ */ Object.create(null), Z._eventsCount = 0) : (W.newListener !== void 0 && (Z.emit(
127
127
  "newListener",
128
128
  d,
129
129
  l.listener ? l.listener : l
130
- ), X = Z._events), V = X[d]), V === void 0)
131
- V = X[d] = l, ++Z._eventsCount;
132
- else if (typeof V == "function" ? V = X[d] = c ? [l, V] : [V, l] : c ? V.unshift(l) : V.push(l), b = f(Z), b > 0 && V.length > b && !V.warned) {
130
+ ), W = Z._events), V = W[d]), V === void 0)
131
+ V = W[d] = l, ++Z._eventsCount;
132
+ else if (typeof V == "function" ? V = W[d] = c ? [l, V] : [V, l] : c ? V.unshift(l) : V.push(l), b = O(Z), b > 0 && V.length > b && !V.warned) {
133
133
  V.warned = !0;
134
- var W = new Error("Possible EventEmitter memory leak detected. " + V.length + " " + String(d) + " listeners added. Use emitter.setMaxListeners() to increase limit");
135
- W.name = "MaxListenersExceededWarning", W.emitter = Z, W.type = d, W.count = V.length, Yl(W);
134
+ var X = new Error("Possible EventEmitter memory leak detected. " + V.length + " " + String(d) + " listeners added. Use emitter.setMaxListeners() to increase limit");
135
+ X.name = "MaxListenersExceededWarning", X.emitter = Z, X.type = d, X.count = V.length, ul(X);
136
136
  }
137
137
  return Z;
138
138
  }
139
- m.prototype.addListener = function(d, l) {
140
- return O(this, d, l, !1);
139
+ G.prototype.addListener = function(d, l) {
140
+ return f(this, d, l, !1);
141
141
  };
142
- m.prototype.on = m.prototype.addListener;
143
- m.prototype.prependListener = function(d, l) {
144
- return O(this, d, l, !0);
142
+ G.prototype.on = G.prototype.addListener;
143
+ G.prototype.prependListener = function(d, l) {
144
+ return f(this, d, l, !0);
145
145
  };
146
- function ul() {
146
+ function yl() {
147
147
  if (!this.fired)
148
148
  return this.target.removeListener(this.type, this.wrapFn), this.fired = !0, arguments.length === 0 ? this.listener.call(this.target) : this.listener.apply(this.target, arguments);
149
149
  }
150
- function D(Z, d, l) {
151
- var c = { fired: !1, wrapFn: void 0, target: Z, type: d, listener: l }, b = ul.bind(c);
150
+ function r(Z, d, l) {
151
+ var c = { fired: !1, wrapFn: void 0, target: Z, type: d, listener: l }, b = yl.bind(c);
152
152
  return b.listener = l, c.wrapFn = b, b;
153
153
  }
154
- m.prototype.once = function(d, l) {
155
- return o(l), this.on(d, D(this, d, l)), this;
154
+ G.prototype.once = function(d, l) {
155
+ return z(l), this.on(d, r(this, d, l)), this;
156
156
  };
157
- m.prototype.prependOnceListener = function(d, l) {
158
- return o(l), this.prependListener(d, D(this, d, l)), this;
157
+ G.prototype.prependOnceListener = function(d, l) {
158
+ return z(l), this.prependListener(d, r(this, d, l)), this;
159
159
  };
160
- m.prototype.removeListener = function(d, l) {
161
- var c, b, X, V, W;
162
- if (o(l), b = this._events, b === void 0)
160
+ G.prototype.removeListener = function(d, l) {
161
+ var c, b, W, V, X;
162
+ if (z(l), b = this._events, b === void 0)
163
163
  return this;
164
164
  if (c = b[d], c === void 0)
165
165
  return this;
166
166
  if (c === l || c.listener === l)
167
167
  --this._eventsCount === 0 ? this._events = /* @__PURE__ */ Object.create(null) : (delete b[d], b.removeListener && this.emit("removeListener", d, c.listener || l));
168
168
  else if (typeof c != "function") {
169
- for (X = -1, V = c.length - 1; V >= 0; V--)
169
+ for (W = -1, V = c.length - 1; V >= 0; V--)
170
170
  if (c[V] === l || c[V].listener === l) {
171
- W = c[V].listener, X = V;
171
+ X = c[V].listener, W = V;
172
172
  break;
173
173
  }
174
- if (X < 0)
174
+ if (W < 0)
175
175
  return this;
176
- X === 0 ? c.shift() : hl(c, X), c.length === 1 && (b[d] = c[0]), b.removeListener !== void 0 && this.emit("removeListener", d, W || l);
176
+ W === 0 ? c.shift() : hl(c, W), c.length === 1 && (b[d] = c[0]), b.removeListener !== void 0 && this.emit("removeListener", d, X || l);
177
177
  }
178
178
  return this;
179
179
  };
180
- m.prototype.off = m.prototype.removeListener;
181
- m.prototype.removeAllListeners = function(d) {
180
+ G.prototype.off = G.prototype.removeListener;
181
+ G.prototype.removeAllListeners = function(d) {
182
182
  var l, c, b;
183
183
  if (c = this._events, c === void 0)
184
184
  return this;
185
185
  if (c.removeListener === void 0)
186
186
  return arguments.length === 0 ? (this._events = /* @__PURE__ */ Object.create(null), this._eventsCount = 0) : c[d] !== void 0 && (--this._eventsCount === 0 ? this._events = /* @__PURE__ */ Object.create(null) : delete c[d]), this;
187
187
  if (arguments.length === 0) {
188
- var X = Object.keys(c), V;
189
- for (b = 0; b < X.length; ++b)
190
- V = X[b], V !== "removeListener" && this.removeAllListeners(V);
188
+ var W = Object.keys(c), V;
189
+ for (b = 0; b < W.length; ++b)
190
+ V = W[b], V !== "removeListener" && this.removeAllListeners(V);
191
191
  return this.removeAllListeners("removeListener"), this._events = /* @__PURE__ */ Object.create(null), this._eventsCount = 0, this;
192
192
  }
193
193
  if (l = c[d], typeof l == "function")
@@ -197,23 +197,23 @@ m.prototype.removeAllListeners = function(d) {
197
197
  this.removeListener(d, l[b]);
198
198
  return this;
199
199
  };
200
- function r(Z, d, l) {
200
+ function D(Z, d, l) {
201
201
  var c = Z._events;
202
202
  if (c === void 0)
203
203
  return [];
204
204
  var b = c[d];
205
- return b === void 0 ? [] : typeof b == "function" ? l ? [b.listener || b] : [b] : l ? il(b) : _(b, b.length);
205
+ return b === void 0 ? [] : typeof b == "function" ? l ? [b.listener || b] : [b] : l ? Jl(b) : _(b, b.length);
206
206
  }
207
- m.prototype.listeners = function(d) {
208
- return r(this, d, !0);
207
+ G.prototype.listeners = function(d) {
208
+ return D(this, d, !0);
209
209
  };
210
- m.prototype.rawListeners = function(d) {
211
- return r(this, d, !1);
210
+ G.prototype.rawListeners = function(d) {
211
+ return D(this, d, !1);
212
212
  };
213
- m.listenerCount = function(Z, d) {
213
+ G.listenerCount = function(Z, d) {
214
214
  return typeof Z.listenerCount == "function" ? Z.listenerCount(d) : A.call(Z, d);
215
215
  };
216
- m.prototype.listenerCount = A;
216
+ G.prototype.listenerCount = A;
217
217
  function A(Z) {
218
218
  var d = this._events;
219
219
  if (d !== void 0) {
@@ -225,8 +225,8 @@ function A(Z) {
225
225
  }
226
226
  return 0;
227
227
  }
228
- m.prototype.eventNames = function() {
229
- return this._eventsCount > 0 ? I(this._events) : [];
228
+ G.prototype.eventNames = function() {
229
+ return this._eventsCount > 0 ? s(this._events) : [];
230
230
  };
231
231
  function _(Z, d) {
232
232
  for (var l = new Array(d), c = 0; c < d; ++c)
@@ -238,20 +238,20 @@ function hl(Z, d) {
238
238
  Z[d] = Z[d + 1];
239
239
  Z.pop();
240
240
  }
241
- function il(Z) {
241
+ function Jl(Z) {
242
242
  for (var d = new Array(Z.length), l = 0; l < d.length; ++l)
243
243
  d[l] = Z[l].listener || Z[l];
244
244
  return d;
245
245
  }
246
- function Jl(Z, d) {
246
+ function il(Z, d) {
247
247
  return new Promise(function(l, c) {
248
248
  function b(V) {
249
- Z.removeListener(d, X), c(V);
249
+ Z.removeListener(d, W), c(V);
250
250
  }
251
- function X() {
251
+ function W() {
252
252
  typeof Z.removeListener == "function" && Z.removeListener("error", b), l([].slice.call(arguments));
253
253
  }
254
- q(Z, d, X, { once: !0 }), d !== "error" && Nl(Z, b, { once: !0 });
254
+ q(Z, d, W, { once: !0 }), d !== "error" && Nl(Z, b, { once: !0 });
255
255
  });
256
256
  }
257
257
  function Nl(Z, d, l) {
@@ -261,8 +261,8 @@ function q(Z, d, l, c) {
261
261
  if (typeof Z.on == "function")
262
262
  c.once ? Z.once(d, l) : Z.on(d, l);
263
263
  else if (typeof Z.addEventListener == "function")
264
- Z.addEventListener(d, function b(X) {
265
- c.once && Z.removeEventListener(d, b), l(X);
264
+ Z.addEventListener(d, function b(W) {
265
+ c.once && Z.removeEventListener(d, b), l(W);
266
266
  });
267
267
  else
268
268
  throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof Z);
@@ -279,28 +279,28 @@ class $ extends L.EventEmitter {
279
279
  on(l, c) {
280
280
  var b;
281
281
  try {
282
- const X = this.listenerCount(l);
283
- X > 25 && X % 25 === 0 && ((b = this.logger) == null || b.warn("CustomEventEmitter::maxListenersExceeded", {
282
+ const W = this.listenerCount(l);
283
+ W > 25 && W % 25 === 0 && ((b = this.logger) == null || b.warn("CustomEventEmitter::maxListenersExceeded", {
284
284
  eventListener: {
285
285
  eventName: l.toString(),
286
286
  listenerCount: this.listenerCount(l)
287
287
  }
288
288
  }));
289
- } catch (X) {
289
+ } catch (W) {
290
290
  }
291
291
  return super.on(l, c);
292
292
  }
293
293
  addListener(l, c) {
294
294
  var b;
295
295
  try {
296
- const X = this.listenerCount(l);
297
- X > 25 && X % 25 === 0 && ((b = this.logger) == null || b.warn("CustomEventEmitter::maxListenersExceeded", {
296
+ const W = this.listenerCount(l);
297
+ W > 25 && W % 25 === 0 && ((b = this.logger) == null || b.warn("CustomEventEmitter::maxListenersExceeded", {
298
298
  eventListener: {
299
299
  eventName: l.toString(),
300
300
  listenerCount: this.listenerCount(l)
301
301
  }
302
302
  }));
303
- } catch (X) {
303
+ } catch (W) {
304
304
  }
305
305
  return super.addListener(l, c);
306
306
  }
@@ -340,8 +340,8 @@ function x() {
340
340
  function Fl() {
341
341
  return typeof window.RTCRtpSender != "undefined" && typeof window.RTCRtpSender.prototype.createEncodedStreams != "undefined";
342
342
  }
343
- function Il(Z) {
344
- return i(this, null, function* () {
343
+ function sl(Z) {
344
+ return J(this, null, function* () {
345
345
  const d = new TextEncoder();
346
346
  return yield crypto.subtle.importKey(
347
347
  "raw",
@@ -357,7 +357,7 @@ function Il(Z) {
357
357
  function Ll() {
358
358
  return Fl() || x();
359
359
  }
360
- class sl extends $ {
360
+ class kl extends $ {
361
361
  constructor(l = {}) {
362
362
  super(void 0);
363
363
  R(this, "keyInfoMap");
@@ -380,8 +380,8 @@ class sl extends $ {
380
380
  * @param keyIndex
381
381
  */
382
382
  onSetEncryptionKey(l, c, b) {
383
- const X = { key: l, participantId: c, keyIndex: b };
384
- this.keyInfoMap.set(`${c != null ? c : "shared"}-${b != null ? b : 0}`, X), this.emit("setKey", X);
383
+ const W = { key: l, participantId: c, keyIndex: b };
384
+ this.keyInfoMap.set(`${c != null ? c : "shared"}-${b != null ? b : 0}`, W), this.emit("setKey", W);
385
385
  }
386
386
  getKeys() {
387
387
  return Array.from(this.keyInfoMap.values());
@@ -393,9 +393,9 @@ class sl extends $ {
393
393
  this.emit("ratchetRequest", l, c);
394
394
  }
395
395
  }
396
- class kl extends sl {
396
+ class Ul extends kl {
397
397
  constructor(l = {}) {
398
- const c = e(n({}, l), { sharedKey: !0 });
398
+ const c = Q(n({}, l), { sharedKey: !0 });
399
399
  super(c);
400
400
  R(this, "ratchetInterval");
401
401
  }
@@ -404,8 +404,8 @@ class kl extends sl {
404
404
  * @param key
405
405
  */
406
406
  setKey(l) {
407
- return i(this, null, function* () {
408
- const c = yield Il(l);
407
+ return J(this, null, function* () {
408
+ const c = yield sl(l);
409
409
  this.onSetEncryptionKey(c);
410
410
  });
411
411
  }
@@ -414,9 +414,9 @@ const E = {
414
414
  ParticipantEncryptionStatusChanged: "participantEncryptionStatusChanged",
415
415
  Error: "encryptionError"
416
416
  };
417
- var J = /* @__PURE__ */ ((Z) => (Z.NEW_PRODUCER = "NEW_PRODUCER", Z.ROOM_NODE_CONNECTION_ERROR = "ROOM_NODE_CONNECTION_ERROR", Z.SOCKET_SERVICE_ROOM_JOINED = "SOCKET_SERVICE_ROOM_JOINED", Z.SOCKET_SERVICE_RECONNECTED = "SOCKET_SERVICE_RECONNECTED", Z.SOCKET_SERVICE_DISCONNECTED = "SOCKET_SERVICE_DISCONNECTED", Z.SOCKET_SERVICE_FAILED = "SOCKET_SERVICE_FAILED", Z.SOCKET_STATE_UPDATE = "SOCKET_STATE_UPDATE", Z.ROOM_NODE_RECONNECTED = "ROOM_NODE_RECONNECTED", Z.ROOM_NODE_DISCONNECTED = "ROOM_NODE_DISCONNECTED", Z.ROOM_NODE_FAILED = "ROOM_NODE_FAILED", Z.TRANSPORT_STATE_UPDATE = "TRANSPORT_STATE_UPDATE", Z.PRODUCER_SCORE_UPDATE = "PRODUCER_SCORE_UPDATE", Z.CONSUMER_SCORE_UPDATE = "CONSUMER_SCORE_UPDATE", Z.PRODUCER_STATUS_UPDATE = "PRODUCER_STATUS_UPDATE", Z.CONSUMER_STATUS_UPDATE = "CONSUMER_STATUS_UPDATE", Z.LOW_CONSUMER_SCORE = "LOW_CONSUMER_SCORE", Z.MEDIA_PERMISSION_ERROR = "MEDIA_PERMISSION_ERROR", Z.MEDIA_PERMISSION_UPDATE = "MEDIA_PERMISSION_UPDATE", Z.MESSAGE = "websocket/message", Z.ROOM_MESSAGE = "websocket/room-message", Z.PEER_JOINED_INTERNAL = "peer/joined-internal", Z.PEER_CLOSED = "websocket/peer-closed", Z.CONSUMER_CLOSED = "websocket/consumer-closed", Z.CONSUMER_PAUSED = "websocket/consumer-paused", Z.CONSUMER_RESUMED = "websocket/consumer-resumed", Z.PRODUCER_CLOSED = "websocket/producer-closed", Z.NEW_CONSUMER = "websocket/new-consumer", Z.PRODUCER_SCORE = "websocket/producer-score", Z.CONSUMER_SCORE = "websocket/consumer-score", Z.PRODUCER_TOGGLE = "cf/producer-toggle", Z.UPDATE_ACTIVE = "media/update-active", Z.RESET_PRODUCER_STATE = "cf/reset-producer-state", Z.ROOM_STATE = "sockethub/room-state", Z.GET_STAGE_REQUESTS = "GET_STAGE_REQUESTS", Z.UPDATE_STAGE_REQUESTS = "UPDATE_STAGE_REQUESTS", Z.KICK_PEER = "KICK_PEER", Z.UPDATE_PEER_STAGE_STATUS = "UPDATE_PEER_STAGE_STATUS", Z.JOIN_MEDIA_ROOM = "JOIN_MEDIA_ROOM", Z.LEAVE_MEDIA_ROOM = "LEAVE_MEDIA_ROOM", Z.PIP_HANGUP = "PIP_HANGUP", Z.E2EE_ACTIVE_PRODUCER = "E2EE_ACTIVE_PRODUCER", Z.E2EE_INACTIVE_PRODUCER = "E2EE_INACTIVE_PRODUCER", Z.E2EE_ACTIVE_CONSUMER = "E2EE_ACTIVE_CONSUMER", Z.E2EE_INACTIVE_CONSUMER = "E2EE_INACTIVE_CONSUMER", Z.SOCKET_PEERS = "SOCKET_PEERS", Z.UPDATE_PERMISSIONS = "UPDATE_PERMISSIONS", Z.MAX_SPATIAL_LAYER_CHANGE = "MAX_SPATIAL_LAYER_CHANGE", Z.MUTE_SELF = "MUTE_SELF", Z.MUTE_SELF_VIDEO = "MUTE_SELF_VIDEO", Z))(J || {});
418
- const ll = "dmFyIHdkPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxNZD1PYmplY3QuZGVmaW5lUHJvcGVydGllczt2YXIgQWQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7dmFyIGVuPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsa2Q9T2JqZWN0LmdldFByb3RvdHlwZU9mLE9kPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksTGQ9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxEZD1SZWZsZWN0LmdldDt2YXIgc3I9KGssTyxBKT0+TyBpbiBrP3dkKGssTyx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6QX0pOmtbT109QSxRPShrLE8pPT57Zm9yKHZhciBBIGluIE98fChPPXt9KSlPZC5jYWxsKE8sQSkmJnNyKGssQSxPW0FdKTtpZihlbilmb3IodmFyIEEgb2YgZW4oTykpTGQuY2FsbChPLEEpJiZzcihrLEEsT1tBXSk7cmV0dXJuIGt9LG90PShrLE8pPT5NZChrLEFkKE8pKTt2YXIgcD0oayxPLEEpPT4oc3Ioayx0eXBlb2YgTyE9InN5bWJvbCI/TysiIjpPLEEpLEEpLHRuPShrLE8sQSk9PntpZighTy5oYXMoaykpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgIitBKX07dmFyIGVlPShrLE8sQSk9Pih0bihrLE8sInJlYWQgZnJvbSBwcml2YXRlIGZpZWxkIiksQT9BLmNhbGwoayk6Ty5nZXQoaykpLEl0PShrLE8sQSk9PntpZihPLmhhcyhrKSl0aHJvdyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgdGhlIHNhbWUgcHJpdmF0ZSBtZW1iZXIgbW9yZSB0aGFuIG9uY2UiKTtPIGluc3RhbmNlb2YgV2Vha1NldD9PLmFkZChrKTpPLnNldChrLEEpfSxDZT0oayxPLEEsZGUpPT4odG4oayxPLCJ3cml0ZSB0byBwcml2YXRlIGZpZWxkIiksZGU/ZGUuY2FsbChrLEEpOk8uc2V0KGssQSksQSk7dmFyIHJuPShrLE8sQSk9PkRkKGtkKGspLEEsTyk7dmFyIEk9KGssTyxBKT0+bmV3IFByb21pc2UoKGRlLHd0KT0+e3ZhciBNdD1ZPT57dHJ5e0llKEEubmV4dChZKSl9Y2F0Y2goYmUpe3d0KGJlKX19LHE9WT0+e3RyeXtJZShBLnRocm93KFkpKX1jYXRjaChiZSl7d3QoYmUpfX0sSWU9WT0+WS5kb25lP2RlKFkudmFsdWUpOlByb21pc2UucmVzb2x2ZShZLnZhbHVlKS50aGVuKE10LHEpO0llKChBPUEuYXBwbHkoayxPKSkubmV4dCgpKX0pOyhmdW5jdGlvbigpe3ZhciBacyxGZSxuZSxpZTsidXNlIHN0cmljdCI7Y29uc3Qgaz0iQUVTLUdDTSIsQT17a2V5OjEwLGRlbHRhOjMsYXVkaW86MSxlbXB0eTowfSxkZT0xMixNdD17c2hhcmVkS2V5OiExLHJhdGNoZXRTYWx0OiJSZWFsdGltZUtpdEZyYW1lRW5jcnlwdGlvbktleSIscmF0Y2hldFdpbmRvd1NpemU6OH07dmFyIHE9e30sSWU9e2dldCBleHBvcnRzKCl7cmV0dXJuIHF9LHNldCBleHBvcnRzKHQpe3E9dH19LFk9dHlwZW9mIFJlZmxlY3Q9PSJvYmplY3QiP1JlZmxlY3Q6bnVsbCxiZT1ZJiZ0eXBlb2YgWS5hcHBseT09ImZ1bmN0aW9uIj9ZLmFwcGx5OmZ1bmN0aW9uKHIsZSxzKXtyZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwocixlLHMpfSxjdDtZJiZ0eXBlb2YgWS5vd25LZXlzPT0iZnVuY3Rpb24iP2N0PVkub3duS2V5czpPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzP2N0PWZ1bmN0aW9uKHIpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhyKS5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhyKSl9OmN0PWZ1bmN0aW9uKHIpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhyKX07ZnVuY3Rpb24gc24odCl7Y29uc29sZSYmY29uc29sZS53YXJuJiZjb25zb2xlLndhcm4odCl9dmFyIG5yPU51bWJlci5pc05hTnx8ZnVuY3Rpb24ocil7cmV0dXJuIHIhPT1yfTtmdW5jdGlvbiBEKCl7RC5pbml0LmNhbGwodGhpcyl9SWUuZXhwb3J0cz1ELHEub25jZT1jbixELkV2ZW50RW1pdHRlcj1ELEQucHJvdG90eXBlLl9ldmVudHM9dm9pZCAwLEQucHJvdG90eXBlLl9ldmVudHNDb3VudD0wLEQucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnM9dm9pZCAwO3ZhciBpcj0xMDtmdW5jdGlvbiBkdCh0KXtpZih0eXBlb2YgdCE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgImxpc3RlbmVyIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRnVuY3Rpb24uIFJlY2VpdmVkIHR5cGUgJyt0eXBlb2YgdCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KEQsImRlZmF1bHRNYXhMaXN0ZW5lcnMiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBpcn0sc2V0OmZ1bmN0aW9uKHQpe2lmKHR5cGVvZiB0IT0ibnVtYmVyInx8dDwwfHxucih0KSl0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mICJkZWZhdWx0TWF4TGlzdGVuZXJzIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnK3QrIi4iKTtpcj10fX0pLEQuaW5pdD1mdW5jdGlvbigpeyh0aGlzLl9ldmVudHM9PT12b2lkIDB8fHRoaXMuX2V2ZW50cz09PU9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS5fZXZlbnRzKSYmKHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTApLHRoaXMuX21heExpc3RlbmVycz10aGlzLl9tYXhMaXN0ZW5lcnN8fHZvaWQgMH0sRC5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzPWZ1bmN0aW9uKHIpe2lmKHR5cGVvZiByIT0ibnVtYmVyInx8cjwwfHxucihyKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mICJuIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnK3IrIi4iKTtyZXR1cm4gdGhpcy5fbWF4TGlzdGVuZXJzPXIsdGhpc307ZnVuY3Rpb24gYXIodCl7cmV0dXJuIHQuX21heExpc3RlbmVycz09PXZvaWQgMD9ELmRlZmF1bHRNYXhMaXN0ZW5lcnM6dC5fbWF4TGlzdGVuZXJzfUQucHJvdG90eXBlLmdldE1heExpc3RlbmVycz1mdW5jdGlvbigpe3JldHVybiBhcih0aGlzKX0sRC5wcm90b3R5cGUuZW1pdD1mdW5jdGlvbihyKXtmb3IodmFyIGU9W10scz0xO3M8YXJndW1lbnRzLmxlbmd0aDtzKyspZS5wdXNoKGFyZ3VtZW50c1tzXSk7dmFyIG49cj09PSJlcnJvciIsaT10aGlzLl9ldmVudHM7aWYoaSE9PXZvaWQgMCluPW4mJmkuZXJyb3I9PT12b2lkIDA7ZWxzZSBpZighbilyZXR1cm4hMTtpZihuKXt2YXIgYTtpZihlLmxlbmd0aD4wJiYoYT1lWzBdKSxhIGluc3RhbmNlb2YgRXJyb3IpdGhyb3cgYTt2YXIgZD1uZXcgRXJyb3IoIlVuaGFuZGxlZCBlcnJvci4iKyhhPyIgKCIrYS5tZXNzYWdlKyIpIjoiIikpO3Rocm93IGQuY29udGV4dD1hLGR9dmFyIG89aVtyXTtpZihvPT09dm9pZCAwKXJldHVybiExO2lmKHR5cGVvZiBvPT0iZnVuY3Rpb24iKWJlKG8sdGhpcyxlKTtlbHNlIGZvcih2YXIgbD1vLmxlbmd0aCxmPXVyKG8sbCkscz0wO3M8bDsrK3MpYmUoZltzXSx0aGlzLGUpO3JldHVybiEwfTtmdW5jdGlvbiBvcih0LHIsZSxzKXt2YXIgbixpLGE7aWYoZHQoZSksaT10Ll9ldmVudHMsaT09PXZvaWQgMD8oaT10Ll9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0Ll9ldmVudHNDb3VudD0wKTooaS5uZXdMaXN0ZW5lciE9PXZvaWQgMCYmKHQuZW1pdCgibmV3TGlzdGVuZXIiLHIsZS5saXN0ZW5lcj9lLmxpc3RlbmVyOmUpLGk9dC5fZXZlbnRzKSxhPWlbcl0pLGE9PT12b2lkIDApYT1pW3JdPWUsKyt0Ll9ldmVudHNDb3VudDtlbHNlIGlmKHR5cGVvZiBhPT0iZnVuY3Rpb24iP2E9aVtyXT1zP1tlLGFdOlthLGVdOnM/YS51bnNoaWZ0KGUpOmEucHVzaChlKSxuPWFyKHQpLG4+MCYmYS5sZW5ndGg+biYmIWEud2FybmVkKXthLndhcm5lZD0hMDt2YXIgZD1uZXcgRXJyb3IoIlBvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gIithLmxlbmd0aCsiICIrU3RyaW5nKHIpKyIgbGlzdGVuZXJzIGFkZGVkLiBVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdCIpO2QubmFtZT0iTWF4TGlzdGVuZXJzRXhjZWVkZWRXYXJuaW5nIixkLmVtaXR0ZXI9dCxkLnR5cGU9cixkLmNvdW50PWEubGVuZ3RoLHNuKGQpfXJldHVybiB0fUQucHJvdG90eXBlLmFkZExpc3RlbmVyPWZ1bmN0aW9uKHIsZSl7cmV0dXJuIG9yKHRoaXMscixlLCExKX0sRC5wcm90b3R5cGUub249RC5wcm90b3R5cGUuYWRkTGlzdGVuZXIsRC5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyPWZ1bmN0aW9uKHIsZSl7cmV0dXJuIG9yKHRoaXMscixlLCEwKX07ZnVuY3Rpb24gbm4oKXtpZighdGhpcy5maXJlZClyZXR1cm4gdGhpcy50YXJnZXQucmVtb3ZlTGlzdGVuZXIodGhpcy50eXBlLHRoaXMud3JhcEZuKSx0aGlzLmZpcmVkPSEwLGFyZ3VtZW50cy5sZW5ndGg9PT0wP3RoaXMubGlzdGVuZXIuY2FsbCh0aGlzLnRhcmdldCk6dGhpcy5saXN0ZW5lci5hcHBseSh0aGlzLnRhcmdldCxhcmd1bWVudHMpfWZ1bmN0aW9uIGNyKHQscixlKXt2YXIgcz17ZmlyZWQ6ITEsd3JhcEZuOnZvaWQgMCx0YXJnZXQ6dCx0eXBlOnIsbGlzdGVuZXI6ZX0sbj1ubi5iaW5kKHMpO3JldHVybiBuLmxpc3RlbmVyPWUscy53cmFwRm49bixufUQucHJvdG90eXBlLm9uY2U9ZnVuY3Rpb24ocixlKXtyZXR1cm4gZHQoZSksdGhpcy5vbihyLGNyKHRoaXMscixlKSksdGhpc30sRC5wcm90b3R5cGUucHJlcGVuZE9uY2VMaXN0ZW5lcj1mdW5jdGlvbihyLGUpe3JldHVybiBkdChlKSx0aGlzLnByZXBlbmRMaXN0ZW5lcihyLGNyKHRoaXMscixlKSksdGhpc30sRC5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI9ZnVuY3Rpb24ocixlKXt2YXIgcyxuLGksYSxkO2lmKGR0KGUpLG49dGhpcy5fZXZlbnRzLG49PT12b2lkIDApcmV0dXJuIHRoaXM7aWYocz1uW3JdLHM9PT12b2lkIDApcmV0dXJuIHRoaXM7aWYocz09PWV8fHMubGlzdGVuZXI9PT1lKS0tdGhpcy5fZXZlbnRzQ291bnQ9PT0wP3RoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpOihkZWxldGUgbltyXSxuLnJlbW92ZUxpc3RlbmVyJiZ0aGlzLmVtaXQoInJlbW92ZUxpc3RlbmVyIixyLHMubGlzdGVuZXJ8fGUpKTtlbHNlIGlmKHR5cGVvZiBzIT0iZnVuY3Rpb24iKXtmb3IoaT0tMSxhPXMubGVuZ3RoLTE7YT49MDthLS0paWYoc1thXT09PWV8fHNbYV0ubGlzdGVuZXI9PT1lKXtkPXNbYV0ubGlzdGVuZXIsaT1hO2JyZWFrfWlmKGk8MClyZXR1cm4gdGhpcztpPT09MD9zLnNoaWZ0KCk6YW4ocyxpKSxzLmxlbmd0aD09PTEmJihuW3JdPXNbMF0pLG4ucmVtb3ZlTGlzdGVuZXIhPT12b2lkIDAmJnRoaXMuZW1pdCgicmVtb3ZlTGlzdGVuZXIiLHIsZHx8ZSl9cmV0dXJuIHRoaXN9LEQucHJvdG90eXBlLm9mZj1ELnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcixELnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnM9ZnVuY3Rpb24ocil7dmFyIGUscyxuO2lmKHM9dGhpcy5fZXZlbnRzLHM9PT12b2lkIDApcmV0dXJuIHRoaXM7aWYocy5yZW1vdmVMaXN0ZW5lcj09PXZvaWQgMClyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09PTA/KHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTApOnNbcl0hPT12b2lkIDAmJigtLXRoaXMuX2V2ZW50c0NvdW50PT09MD90aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKTpkZWxldGUgc1tyXSksdGhpcztpZihhcmd1bWVudHMubGVuZ3RoPT09MCl7dmFyIGk9T2JqZWN0LmtleXMocyksYTtmb3Iobj0wO248aS5sZW5ndGg7KytuKWE9aVtuXSxhIT09InJlbW92ZUxpc3RlbmVyIiYmdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoYSk7cmV0dXJuIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCJyZW1vdmVMaXN0ZW5lciIpLHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTAsdGhpc31pZihlPXNbcl0sdHlwZW9mIGU9PSJmdW5jdGlvbiIpdGhpcy5yZW1vdmVMaXN0ZW5lcihyLGUpO2Vsc2UgaWYoZSE9PXZvaWQgMClmb3Iobj1lLmxlbmd0aC0xO24+PTA7bi0tKXRoaXMucmVtb3ZlTGlzdGVuZXIocixlW25dKTtyZXR1cm4gdGhpc307ZnVuY3Rpb24gZHIodCxyLGUpe3ZhciBzPXQuX2V2ZW50cztpZihzPT09dm9pZCAwKXJldHVybltdO3ZhciBuPXNbcl07cmV0dXJuIG49PT12b2lkIDA/W106dHlwZW9mIG49PSJmdW5jdGlvbiI/ZT9bbi5saXN0ZW5lcnx8bl06W25dOmU/b24obik6dXIobixuLmxlbmd0aCl9RC5wcm90b3R5cGUubGlzdGVuZXJzPWZ1bmN0aW9uKHIpe3JldHVybiBkcih0aGlzLHIsITApfSxELnByb3RvdHlwZS5yYXdMaXN0ZW5lcnM9ZnVuY3Rpb24ocil7cmV0dXJuIGRyKHRoaXMsciwhMSl9LEQubGlzdGVuZXJDb3VudD1mdW5jdGlvbih0LHIpe3JldHVybiB0eXBlb2YgdC5saXN0ZW5lckNvdW50PT0iZnVuY3Rpb24iP3QubGlzdGVuZXJDb3VudChyKTpsci5jYWxsKHQscil9LEQucHJvdG90eXBlLmxpc3RlbmVyQ291bnQ9bHI7ZnVuY3Rpb24gbHIodCl7dmFyIHI9dGhpcy5fZXZlbnRzO2lmKHIhPT12b2lkIDApe3ZhciBlPXJbdF07aWYodHlwZW9mIGU9PSJmdW5jdGlvbiIpcmV0dXJuIDE7aWYoZSE9PXZvaWQgMClyZXR1cm4gZS5sZW5ndGh9cmV0dXJuIDB9RC5wcm90b3R5cGUuZXZlbnROYW1lcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ldmVudHNDb3VudD4wP2N0KHRoaXMuX2V2ZW50cyk6W119O2Z1bmN0aW9uIHVyKHQscil7Zm9yKHZhciBlPW5ldyBBcnJheShyKSxzPTA7czxyOysrcyllW3NdPXRbc107cmV0dXJuIGV9ZnVuY3Rpb24gYW4odCxyKXtmb3IoO3IrMTx0Lmxlbmd0aDtyKyspdFtyXT10W3IrMV07dC5wb3AoKX1mdW5jdGlvbiBvbih0KXtmb3IodmFyIHI9bmV3IEFycmF5KHQubGVuZ3RoKSxlPTA7ZTxyLmxlbmd0aDsrK2UpcltlXT10W2VdLmxpc3RlbmVyfHx0W2VdO3JldHVybiByfWZ1bmN0aW9uIGNuKHQscil7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUscyl7ZnVuY3Rpb24gbihhKXt0LnJlbW92ZUxpc3RlbmVyKHIsaSkscyhhKX1mdW5jdGlvbiBpKCl7dHlwZW9mIHQucmVtb3ZlTGlzdGVuZXI9PSJmdW5jdGlvbiImJnQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixuKSxlKFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKSl9cHIodCxyLGkse29uY2U6ITB9KSxyIT09ImVycm9yIiYmZG4odCxuLHtvbmNlOiEwfSl9KX1mdW5jdGlvbiBkbih0LHIsZSl7dHlwZW9mIHQub249PSJmdW5jdGlvbiImJnByKHQsImVycm9yIixyLGUpfWZ1bmN0aW9uIHByKHQscixlLHMpe2lmKHR5cGVvZiB0Lm9uPT0iZnVuY3Rpb24iKXMub25jZT90Lm9uY2UocixlKTp0Lm9uKHIsZSk7ZWxzZSBpZih0eXBlb2YgdC5hZGRFdmVudExpc3RlbmVyPT0iZnVuY3Rpb24iKXQuYWRkRXZlbnRMaXN0ZW5lcihyLGZ1bmN0aW9uIG4oaSl7cy5vbmNlJiZ0LnJlbW92ZUV2ZW50TGlzdGVuZXIocixuKSxlKGkpfSk7ZWxzZSB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgImVtaXR0ZXIiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBFdmVudEVtaXR0ZXIuIFJlY2VpdmVkIHR5cGUgJyt0eXBlb2YgdCl9dmFyIF87KGZ1bmN0aW9uKHQpe3RbdC5NQUpPUl9FVkVOVD0wXT0iTUFKT1JfRVZFTlQiLHRbdC5NSU5PUl9FVkVOVD0xXT0iTUlOT1JfRVZFTlQifSkoX3x8KF89e30pKTt2YXIgUzsoZnVuY3Rpb24odCl7dC5QUkVDQUxMX1RFU1RfQkVHSU49InByZWNhbGxfYmVnaW4iLHQuUFJFQ0FMTF9URVNUX0NPTVBMRVRFPSJwcmVjYWxsX2VuZCIsdC5DQUxMX0pPSU5fQkVHSU49ImNhbGxfam9pbiIsdC5ORVRfUVVBTElUWV9URVNUX0JFR0lOPSJuZXRfcXVhbGl0eV90ZXN0X2JlZ2luIix0Lk5FVF9RVUFMSVRZX1RFU1RfRU5EPSJuZXRfcXVhbGl0eV90ZXN0X2VuZCIsdC5XRUJTT0NLRVRfQ09OTkVDVEVEPSJ3ZWJzb2NrZXRfY29ubmVjdGVkIix0LlRSQU5TUE9SVF9DT05ORUNURUQ9InRyYW5zcG9ydF9jb25uZWN0ZWQiLHQuQVVESU9fT049ImF1ZGlvX29uIix0LkFVRElPX09GRj0iYXVkaW9fb2ZmIix0LlZJREVPX09OPSJ2aWRlb19vbiIsdC5WSURFT19PRkY9InZpZGVvX29mZiIsdC5QQVJUSUNJUEFOVF9ST0xFPSJwYXJ0aWNpcGFudF9yb2xlIix0LlBJTkdfU1RBVD0icGluZ19zdGF0Iix0LkRJU0NPTk5FQ1Q9ImRpc2Nvbm5lY3QiLHQuUkVDT05ORUNUX0FUVEVNUFQ9InJlY29ubmVjdF9hdHRlbXB0Iix0LlNDUkVFTlNIQVJFX1NUQVJUX1JFUVVFU1RFRD0ic2NyZWVuc2hhcmVfc3RhcnRfcmVxdWVzdGVkIix0LlNDUkVFTlNIQVJFX1NUQVJURUQ9InNjcmVlbnNoYXJlX3N0YXJ0ZWQiLHQuU0NSRUVOU0hBUkVfU1RPUFBFRD0ic2NyZWVuc2hhcmVfc3RvcHBlZCIsdC5UQUJfQ0hBTkdFPSJ0YWJfY2hhbmdlIix0LkJST1dTRVJfQkFDS0dST1VOREVEPSJicm93c2VyX2JhY2tncm91bmRlZCIsdC5CUk9XU0VSX0ZPUkVHUk9VTkRFRD0iYnJvd3Nlcl9mb3JlZ3JvdW5kZWQiLHQuRE9NSU5BTlRfU1BFQUtFUj0iZG9taW5hbnRfc3BlYWtlciIsdC5BVURJT19ERVZJQ0VTX1VQREFURVM9ImF1ZGlvX2RldmljZXNfdXBkYXRlcyIsdC5WSURFT19ERVZJQ0VTX1VQREFURVM9InZpZGVvX2RldmljZXNfdXBkYXRlcyIsdC5TUEVBS0VSX0RFVklDRVNfVVBEQVRFUz0ic3BlYWtlcl9kZXZpY2VzX3VwZGF0ZXMiLHQuU0VMRUNURURfTUlDUk9IUE9ORV9VUERBVEU9InNlbGVjdGVkX21pY3JvcGhvbmVfdXBkYXRlIix0LlNFTEVDVEVEX0NBTUVSQV9VUERBVEU9InNlbGVjdGVkX2NhbWVyYV91cGRhdGUiLHQuU0VMRUNURURfU1BFQUtFUl9VUERBVEU9InNlbGVjdGVkX3NwZWFrZXJfdXBkYXRlIix0LkVYUEVDVEVEX1ZJREVPX1JFU09MVVRJT049ImV4cGVjdGVkX3ZpZGVvX3Jlc29sdXRpb24iLHQuRVhQRUNURURfU0NSRUVOU0hBUkVfUkVTT0xVVElPTj0iZXhwZWN0ZWRfc2NyZWVuc2hhcmVfcmVzb2x1dGlvbiIsdC5NRURJQV9QRVJNSVNTSU9OPSJtZWRpYV9wZXJtaXNzaW9uIix0LkxFR0FDWV9TV0lUQ0g9ImxlZ2FjeV9zd2l0Y2giLHQuQVVESU9fUExBWV9GQUlMRUQ9ImF1ZGlvX3BsYXlfZmFpbGVkIix0LlZJREVPX1BMQVlfRkFJTEVEPSJ2aWRlb19wbGF5X2ZhaWxlZCIsdC5BVURJT19UUkFDS19NVVRFRD0iYXVkaW9fdHJhY2tfbXV0ZWQiLHQuVklERU9fVFJBQ0tfTVVURUQ9InZpZGVvX3RyYWNrX211dGVkIix0LklWU19QTEFZRVJfUkVCVUZGRVJJTkc9Iml2c19wbGF5ZXJfcmVidWZmZXJpbmciLHQuSVZTX1BMQVlFUl9BVURJT19CTE9DS0VEPSJpdnNfcGxheWVyX2F1ZGlvX2Jsb2NrZWQiLHQuSVZTX1BMQVlFUl9QTEFZQkFDS19CTE9DS0VEPSJpdnNfcGxheWVyX3BsYXliYWNrX2Jsb2NrZWQiLHQuSVZTX1BMQVlFUl9FUlJPUj0iaXZzX3BsYXllcl9lcnJvciIsdC5JVlNfUExBWUVSX1JFQ09WRVJBQkxFX0VSUk9SPSJpdnNfcGxheWVyX3JlY292ZXJhYmxlX2Vycm9yIix0LklWU19QTEFZRVJfV09SS0VSX0VSUk9SPSJpdnNfcGxheWVyX3dvcmtlcl9lcnJvciIsdC5JVlNfUExBWUVSX05FVFdPUktfVU5BVkFJTEFCTEU9Iml2c19wbGF5ZXJfbmV0d29ya191bmF2YWlsYWJsZSIsdC5MSVZFU1RSRUFNX0xBVEVOQ1k9ImxpdmVzdHJlYW1fbGF0ZW5jeSIsdC5JVlNfUExBWUVSX0FOQUxZVElDU19FVkVOVD0iaXZzX3BsYXllcl9hbmFseXRpY3NfZXZlbnQiLHQuSVZTX1BMQVlFUl9QTEFZQkFDS19SQVRFX0NIQU5HRUQ9Iml2c19wbGF5ZXJfcGxheWJhY2tfcmF0ZV9jaGFuZ2VkIix0LklWU19QTEFZRVJfUVVBTElUWV9DSEFOR0VEPSJpdnNfcGxheWVyX3F1YWxpdHlfY2hhbmdlZCIsdC5JVlNfUExBWUVSX0lOSVRJQUxJWkVEPSJpdnNfcGxheWVyX2luaXRpYWxpemVkIn0pKFN8fChTPXt9KSk7Y29uc3QgbG49bmV3IE1hcChbW1MuUFJFQ0FMTF9URVNUX0JFR0lOLF8uTUlOT1JfRVZFTlRdLFtTLlBSRUNBTExfVEVTVF9DT01QTEVURSxfLk1JTk9SX0VWRU5UXSxbUy5DQUxMX0pPSU5fQkVHSU4sXy5NQUpPUl9FVkVOVF0sW1MuTkVUX1FVQUxJVFlfVEVTVF9CRUdJTixfLk1JTk9SX0VWRU5UXSxbUy5ORVRfUVVBTElUWV9URVNUX0VORCxfLk1JTk9SX0VWRU5UXSxbUy5XRUJTT0NLRVRfQ09OTkVDVEVELF8uTUlOT1JfRVZFTlRdLFtTLlRSQU5TUE9SVF9DT05ORUNURUQsXy5NQUpPUl9FVkVOVF0sW1MuQVVESU9fT04sXy5NSU5PUl9FVkVOVF0sW1MuQVVESU9fT0ZGLF8uTUlOT1JfRVZFTlRdLFtTLlZJREVPX09OLF8uTUlOT1JfRVZFTlRdLFtTLlZJREVPX09GRixfLk1JTk9SX0VWRU5UXSxbUy5QQVJUSUNJUEFOVF9ST0xFLF8uTUlOT1JfRVZFTlRdLFtTLlBJTkdfU1RBVCxfLk1BSk9SX0VWRU5UXSxbUy5ESVNDT05ORUNULF8uTUFKT1JfRVZFTlRdLFtTLlJFQ09OTkVDVF9BVFRFTVBULF8uTUFKT1JfRVZFTlRdLFtTLlNDUkVFTlNIQVJFX1NUQVJUX1JFUVVFU1RFRCxfLk1JTk9SX0VWRU5UXSxbUy5TQ1JFRU5TSEFSRV9TVEFSVEVELF8uTUlOT1JfRVZFTlRdLFtTLlNDUkVFTlNIQVJFX1NUT1BQRUQsXy5NSU5PUl9FVkVOVF0sW1MuVEFCX0NIQU5HRSxfLk1JTk9SX0VWRU5UXSxbUy5CUk9XU0VSX0JBQ0tHUk9VTkRFRCxfLk1JTk9SX0VWRU5UXSxbUy5CUk9XU0VSX0ZPUkVHUk9VTkRFRCxfLk1JTk9SX0VWRU5UXSxbUy5ET01JTkFOVF9TUEVBS0VSLF8uTUlOT1JfRVZFTlRdLFtTLkFVRElPX0RFVklDRVNfVVBEQVRFUyxfLk1JTk9SX0VWRU5UXSxbUy5WSURFT19ERVZJQ0VTX1VQREFURVMsXy5NSU5PUl9FVkVOVF0sW1MuU1BFQUtFUl9ERVZJQ0VTX1VQREFURVMsXy5NSU5PUl9FVkVOVF0sW1MuU0VMRUNURURfTUlDUk9IUE9ORV9VUERBVEUsXy5NSU5PUl9FVkVOVF0sW1MuU0VMRUNURURfQ0FNRVJBX1VQREFURSxfLk1JTk9SX0VWRU5UXSxbUy5TRUxFQ1RFRF9TUEVBS0VSX1VQREFURSxfLk1JTk9SX0VWRU5UXSxbUy5NRURJQV9QRVJNSVNTSU9OLF8uTUlOT1JfRVZFTlRdLFtTLkxFR0FDWV9TV0lUQ0gsXy5NSU5PUl9FVkVOVF0sW1MuQVVESU9fUExBWV9GQUlMRUQsXy5NSU5PUl9FVkVOVF0sW1MuVklERU9fUExBWV9GQUlMRUQsXy5NSU5PUl9FVkVOVF0sW1MuQVVESU9fVFJBQ0tfTVVURUQsXy5NSU5PUl9FVkVOVF0sW1MuVklERU9fVFJBQ0tfTVVURUQsXy5NSU5PUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9SRUJVRkZFUklORyxfLk1BSk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX0FVRElPX0JMT0NLRUQsXy5NQUpPUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9QTEFZQkFDS19CTE9DS0VELF8uTUFKT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfRVJST1IsXy5NQUpPUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9SRUNPVkVSQUJMRV9FUlJPUixfLk1BSk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX1dPUktFUl9FUlJPUixfLk1BSk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX05FVFdPUktfVU5BVkFJTEFCTEUsXy5NQUpPUl9FVkVOVF0sW1MuTElWRVNUUkVBTV9MQVRFTkNZLF8uTUFKT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfQU5BTFlUSUNTX0VWRU5ULF8uTUlOT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfUExBWUJBQ0tfUkFURV9DSEFOR0VELF8uTUlOT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfUVVBTElUWV9DSEFOR0VELF8uTUlOT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfSU5JVElBTElaRUQsXy5NSU5PUl9FVkVOVF0sW1MuRVhQRUNURURfVklERU9fUkVTT0xVVElPTixfLk1JTk9SX0VWRU5UXSxbUy5FWFBFQ1RFRF9TQ1JFRU5TSEFSRV9SRVNPTFVUSU9OLF8uTUlOT1JfRVZFTlRdXSk7Y2xhc3MgdW57Y29uc3RydWN0b3IoKXtwKHRoaXMsImV2ZW50cyIpO3RoaXMuZXZlbnRzPVtdfWFkZChyKXt0aGlzLmV2ZW50cy5wdXNoKHIpfWZsdXNoKCl7cmV0dXJue2VudHJpZXM6dGhpcy5ldmVudHMuc3BsaWNlKDAsMjUpfX19Y2xhc3MgcG4gZXh0ZW5kcyBxe2NvbnN0cnVjdG9yKHtsb2dnZXI6ZSxwZWVySWQ6cyxhcGlIb3N0bmFtZXM6bixhdXRoVG9rZW46aX0pe3N1cGVyKCk7cCh0aGlzLCJsb2dnZXIiKTtwKHRoaXMsInBlZXJJZCIpO3AodGhpcywiZXZlbnRTdG9yZSIpO3AodGhpcywiYXBpRW5kcG9pbnQiKTtwKHRoaXMsImF1dGhUb2tlbiIpO3RoaXMubG9nZ2VyPWUsdGhpcy5wZWVySWQ9cyx0aGlzLmF1dGhUb2tlbj1pLHRoaXMuYXBpRW5kcG9pbnQ9YGh0dHBzOi8vJHtuLmRhQ29sbGVjdG9yfS9hcGkvdjEvbWVzc2FnZWAsdGhpcy5ldmVudFN0b3JlPW5ldyB1bn1zZW5kRXZlbnRzQ2h1bmtUb1NlcnZlcihlKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgcz17cGF5bG9hZDplLHBlZXJJZDp0aGlzLnBlZXJJZH0sbj1uZXcgQWJvcnRDb250cm9sbGVyLGk9c2V0VGltZW91dCgoKT0+bi5hYm9ydCgpLDNlMyk7dHJ5e3JldHVybiB5aWVsZCBmZXRjaCh0aGlzLmFwaUVuZHBvaW50LHttZXRob2Q6IlBPU1QiLGhlYWRlcnM6eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIixBdXRob3JpemF0aW9uOmBCZWFyZXIgJHt0aGlzLmF1dGhUb2tlbn1gfSxib2R5OkpTT04uc3RyaW5naWZ5KHMpLHNpZ25hbDpuLnNpZ25hbH0pLCEwfWNhdGNoKGEpe3JldHVybiB0aGlzLmxvZ2dlci5lcnJvcigiY2FsbFN0YXRzOjpzZW5kRXZlbnRzQ2h1bmtUb1NlcnZlcjo6Y2F0Y2giLHtwZWVySWQ6dGhpcy5wZWVySWQsZW5kcG9pbnQ6dGhpcy5hcGlFbmRwb2ludCxlcnJvcjphIGluc3RhbmNlb2YgRXJyb3I/YS5tZXNzYWdlOlN0cmluZyhhKSxzdGFjazphIGluc3RhbmNlb2YgRXJyb3I/YS5zdGFjazp2b2lkIDB9KSwhMX1maW5hbGx5e2NsZWFyVGltZW91dChpKX19KX1jYWxsRXZlbnQoZSl7ZS50aW1lc3RhbXA9bmV3IERhdGUsdGhpcy5ldmVudFN0b3JlLmFkZChlKSx0aGlzLmVtaXQoZS5ldmVudCxlLm1ldGFEYXRhKSxsbi5nZXQoZS5ldmVudCk9PT1fLk1BSk9SX0VWRU5UJiZ0aGlzLmZsdXNoKCl9Zmx1c2goKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIHM7Y29uc3QgZT10aGlzLmV2ZW50U3RvcmUuZmx1c2goKTtpZigocz1lPT1udWxsP3ZvaWQgMDplLmVudHJpZXMpIT1udWxsJiZzLmxlbmd0aCl7Y29uc3Qgbj15aWVsZCB0aGlzLnNlbmRFdmVudHNDaHVua1RvU2VydmVyKGUpO3JldHVybiBufHxlLmVudHJpZXMuZm9yRWFjaChpPT57dGhpcy5ldmVudFN0b3JlLmFkZChpKX0pLG59cmV0dXJuITF9KX19dmFyIGhyOyhmdW5jdGlvbih0KXt0LkNIUk9NSVVNPSJjaHJvbXVtIix0LkZJUkVGT1g9ImZpcmVmb3giLHQuU0FGQVJJPSJzYWZhcmkifSkoaHJ8fChocj17fSkpO2NvbnN0IGZyPXtERVZFTDoiZGV2ZWwiLFBSRVBST0Q6InByZXByb2QiLFBST0Q6InByb2QifTt2YXIgSjsoZnVuY3Rpb24odCl7dC5BVURJTz0iQVVESU8iLHQuVklERU89IlZJREVPIix0LlNQRUFLRVI9IlNQRUFLRVIiLHQuU0NSRUVOU0hBUkU9IlNDUkVFTlNIQVJFIn0pKEp8fChKPXt9KSk7dmFyIG1yOyhmdW5jdGlvbih0KXt0W3QuSU5JVD0wXT0iSU5JVCIsdFt0LkFDQ0VQVEVEPTFdPSJBQ0NFUFRFRCIsdFt0LkRFTklFRD0yXT0iREVOSUVEIix0W3QuU1lTX0RFTklFRD0zXT0iU1lTX0RFTklFRCIsdFt0LkZBSUxFRD00XT0iRkFJTEVEIix0W3QuTk9URk9VTkQ9NV09Ik5PVEZPVU5EIix0W3QuTk9UX0FQUExJQ0FCTEU9Nl09Ik5PVF9BUFBMSUNBQkxFIn0pKG1yfHwobXI9e30pKTtmdW5jdGlvbiBhZSh0KXtyZXR1cm4gdD90LnNwbGl0KCIuIikuc2xpY2UoMCwyKS5jb25jYXQoWyIwIiwiMCJdKS5qb2luKCIuIik6IiJ9ZnVuY3Rpb24gbHQoe3BhY2tldHNMb3N0OnQscGFja2V0c1NlbnQ6cn0pe3JldHVybiByPjA/dCoxMDAvcjowfWZ1bmN0aW9uIHV0KHtwYWNrZXRzTG9zdDp0LHBhY2tldHNSZWNlaXZlZDpyfSl7cmV0dXJuIHIrdD4wP3QqMTAwLyhyK3QpOjB9Y29uc3QgZ3I9MjQwLFNyPTcyMCx5cj04LHZyPTMscHQ9MTAsaHQ9LjAyLGZ0PS4wMztmdW5jdGlvbiB0ZSh7c3RhdDp0LHdlaWdodDpyLHJhbmdlTWluOmUscmFuZ2VNYXg6cyxyYW5nZVJhbmtpbmdEaXJlY3Rpb246bn0pe3JldHVybiB0PT1udWxsP3I6ZT09PXM/bj09PSJVUCI/dDw9ZT9yOjA6dD49cz9yOjA6bj09PSJVUCI/KDEtTWF0aC5tYXgoTWF0aC5taW4ocyxNYXRoLmFicyh0KSktZSwwKS8ocy1lKSkqcjpuPT09IkRPV04iP01hdGgubWF4KE1hdGgubWluKHMsTWF0aC5hYnModCkpLWUsMCkvKHMtZSkqcjpyfWZ1bmN0aW9uIGJyKHtpc0xvd1F1YWxpdHlWaWRlbzp0LGlzVmlkZW9TdHVjazpyLGlzVmlkZW9MYWdnaW5nOmUsaml0dGVyUXVhbGl0eTpzLHBhY2tldHNMb3N0UXVhbGl0eTpufSl7Y29uc3QgaT0uOCooKHQ/Ljg1OjEpKihlPy43OjEpKihyPy41OjEpKSsuMioocypuKTtyZXR1cm4gTWF0aC5yb3VuZCgoaStOdW1iZXIuRVBTSUxPTikqMTAwKS8xMDB9ZnVuY3Rpb24gRXIoe3BhY2tldHNMb3N0OnQscGFja2V0c1NlbnQ6cn0pe3JldHVybiByPjA/dCoxMDAvcjowfWZ1bmN0aW9uIFRyKHtwYWNrZXRzTG9zdDp0LHBhY2tldHNTZW50OnIsaml0dGVyOmV9KXtjb25zdCBuPXRlKHtzdGF0OkVyKHtwYWNrZXRzTG9zdDp0LHBhY2tldHNTZW50OnJ9KSx3ZWlnaHQ6LjcscmFuZ2VNaW46MCxyYW5nZU1heDpwdCxyYW5nZVJhbmtpbmdEaXJlY3Rpb246IlVQIn0pLGE9dGUoe3N0YXQ6ZSx3ZWlnaHQ6LjMscmFuZ2VNaW46aHQscmFuZ2VNYXg6ZnQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KTtyZXR1cm4gbithfWZ1bmN0aW9uIGhuKHtmcmFtZVdpZHRoOnQsaXNTY3JlZW5TaGFyZTpyfSl7cmV0dXJuIHQ8KHI/U3I6Z3IpfWZ1bmN0aW9uIGZuKHtmcmFtZXNQZXJTZWNvbmQ6dCxpc1NjcmVlblNoYXJlOnJ9KXtyZXR1cm4gdDwocj92cjp5cil9ZnVuY3Rpb24gbW4oe2ZyYW1lc0VuY29kZWQ6dH0pe3JldHVybiB0PT09MH1mdW5jdGlvbiBfcih7ZnJhbWVXaWR0aDp0LGZyYW1lc1BlclNlY29uZDpyLHBhY2tldHNMb3N0OmUscGFja2V0c1NlbnQ6cyxqaXR0ZXI6bixpc1NjcmVlblNoYXJlOmksZnJhbWVzRW5jb2RlZDphfSl7Y29uc3QgZD10ZSh7c3RhdDpFcih7cGFja2V0c0xvc3Q6ZSxwYWNrZXRzU2VudDpzfSksd2VpZ2h0OjEscmFuZ2VNaW46MCxyYW5nZU1heDpwdCxyYW5nZVJhbmtpbmdEaXJlY3Rpb246IlVQIn0pLG89dGUoe3N0YXQ6bix3ZWlnaHQ6MSxyYW5nZU1pbjpodCxyYW5nZU1heDpmdCxyYW5nZVJhbmtpbmdEaXJlY3Rpb246IlVQIn0pLGw9aG4oe2ZyYW1lV2lkdGg6dCxpc1NjcmVlblNoYXJlOml9KSxmPWZuKHtmcmFtZXNQZXJTZWNvbmQ6cixpc1NjcmVlblNoYXJlOml9KSx5PW1uKHtmcmFtZXNFbmNvZGVkOmEsaXNTY3JlZW5TaGFyZTppfSk7cmV0dXJuIGJyKHtpc0xvd1F1YWxpdHlWaWRlbzpsLGlzVmlkZW9MYWdnaW5nOmYsaXNWaWRlb1N0dWNrOnksaml0dGVyUXVhbGl0eTpvLHBhY2tldHNMb3N0UXVhbGl0eTpkfSl9ZnVuY3Rpb24gUnIoe3BhY2tldHNMb3N0OnQscGFja2V0c1JlY2VpdmVkOnJ9KXtyZXR1cm4gcit0PjA/dCoxMDAvKHIrdCk6MH1mdW5jdGlvbiBQcih7Y29uY2VhbG1lbnRFdmVudHM6dCxwYWNrZXRzTG9zdDpyLHBhY2tldHNSZWNlaXZlZDplLGppdHRlcjpzfSl7Y29uc3QgaT10ZSh7c3RhdDp0LHdlaWdodDouMixyYW5nZU1pbjowLHJhbmdlTWF4OjMscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KSxhPS41LGQ9dGUoe3N0YXQ6UnIoe3BhY2tldHNMb3N0OnIscGFja2V0c1JlY2VpdmVkOmV9KSx3ZWlnaHQ6YSxyYW5nZU1pbjowLHJhbmdlTWF4OnB0LHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSksbD10ZSh7c3RhdDpzLHdlaWdodDouMyxyYW5nZU1pbjpodCxyYW5nZU1heDpmdCxyYW5nZVJhbmtpbmdEaXJlY3Rpb246IlVQIn0pO3JldHVybiBpK2QrbH1mdW5jdGlvbiBnbih7ZnJhbWVzRGVjb2RlZDp0fSl7cmV0dXJuIHQ9PT0wfWZ1bmN0aW9uIFNuKHtmcmFtZXNQZXJTZWNvbmQ6dCxpc1NjcmVlblNoYXJlOnJ9KXtyZXR1cm4gdDwocj92cjp5cil9ZnVuY3Rpb24geW4oe2ZyYW1lV2lkdGg6dCxpc1NjcmVlblNoYXJlOnJ9KXtyZXR1cm4gdDwocj9Tcjpncil9ZnVuY3Rpb24gQ3Ioe2ZyYW1lV2lkdGg6dCxmcmFtZXNQZXJTZWNvbmQ6cixwYWNrZXRzTG9zdDplLHBhY2tldHNSZWNlaXZlZDpzLGppdHRlcjpuLGlzU2NyZWVuU2hhcmU6aSxmcmFtZXNEZWNvZGVkOmF9KXtjb25zdCBkPXRlKHtzdGF0OlJyKHtwYWNrZXRzTG9zdDplLHBhY2tldHNSZWNlaXZlZDpzfSksd2VpZ2h0OjEscmFuZ2VNaW46MCxyYW5nZU1heDpwdCxyYW5nZVJhbmtpbmdEaXJlY3Rpb246IlVQIn0pLG89dGUoe3N0YXQ6bix3ZWlnaHQ6MSxyYW5nZU1pbjpodCxyYW5nZU1heDpmdCxyYW5nZVJhbmtpbmdEaXJlY3Rpb246IlVQIn0pLGw9eW4oe2ZyYW1lV2lkdGg6dCxpc1NjcmVlblNoYXJlOml9KSxmPVNuKHtmcmFtZXNQZXJTZWNvbmQ6cixpc1NjcmVlblNoYXJlOml9KSx5PWduKHtmcmFtZXNEZWNvZGVkOmEsaXNTY3JlZW5TaGFyZTppfSk7cmV0dXJuIGJyKHtpc0xvd1F1YWxpdHlWaWRlbzpsLGlzVmlkZW9MYWdnaW5nOmYsaXNWaWRlb1N0dWNrOnksaml0dGVyUXVhbGl0eTpvLHBhY2tldHNMb3N0UXVhbGl0eTpkfSl9Y2xhc3MgcmV7Y29uc3RydWN0b3Iocil7cCh0aGlzLCJwYzEiKTtwKHRoaXMsInBjMiIpO3AodGhpcywiY29uc3RyYWluVmlkZW9CaXRyYXRlS2JwcyIpO3AodGhpcywiY29uc3RyYWluT2ZmZXJUb1JlbW92ZVZpZGVvRmVjIiwhMSk7cCh0aGlzLCJpY2VDYW5kaWRhdGVGaWx0ZXIiKTtjb25zdCBlPW5ldyBSVENQZWVyQ29ubmVjdGlvbihyKSxzPW5ldyBSVENQZWVyQ29ubmVjdGlvbihyKTt0aGlzLnBjMT1lLHRoaXMucGMyPXMsdGhpcy5pY2VDYW5kaWRhdGVGaWx0ZXI9cmUubm9GaWx0ZXIsdGhpcy5wYzEuYWRkRXZlbnRMaXN0ZW5lcigiaWNlY2FuZGlkYXRlIix0aGlzLm9uSWNlQ2FuZGlkYXRlLmJpbmQodGhpcyx0aGlzLnBjMikpLHRoaXMucGMyLmFkZEV2ZW50TGlzdGVuZXIoImljZWNhbmRpZGF0ZSIsdGhpcy5vbkljZUNhbmRpZGF0ZS5iaW5kKHRoaXMsdGhpcy5wYzEpKX1zdGF0aWMgcGFyc2VDYW5kaWRhdGUocil7Y29uc3QgZT0iY2FuZGlkYXRlOiIscz1yLmluZGV4T2YoZSkrZS5sZW5ndGgsbj1yLnN1YnN0cihzKS5zcGxpdCgiICIpO3JldHVybnt0eXBlOm5bN10scHJvdG9jb2w6blsyXSxhZGRyZXNzOm5bNF19fXN0YXRpYyBpc05vdEhvc3RDYW5kaWRhdGUocil7cmV0dXJuIHIudHlwZSE9PSJob3N0In1zdGF0aWMgaXNIb3N0KHIpe3JldHVybiByLnR5cGU9PT0iaG9zdCJ9c3RhdGljIGlzUmVsYXkocil7cmV0dXJuIHIudHlwZT09PSJyZWxheSJ9c3RhdGljIGlzUmVmbGV4aXZlKHIpe3JldHVybiByLnR5cGU9PT0ic3JmbHgifXN0YXRpYyBub0ZpbHRlcihyKXtyZXR1cm4hMH1vbkljZUNhbmRpZGF0ZShyLGUpe2lmKGUuY2FuZGlkYXRlKXtjb25zdCBzPXJlLnBhcnNlQ2FuZGlkYXRlKGUuY2FuZGlkYXRlLmNhbmRpZGF0ZSk7dGhpcy5pY2VDYW5kaWRhdGVGaWx0ZXIocykmJnIuYWRkSWNlQ2FuZGlkYXRlKGUuY2FuZGlkYXRlKX19c2V0SWNlQ2FuZGlkYXRlRmlsdGVyKHIpe3RoaXMuaWNlQ2FuZGlkYXRlRmlsdGVyPXJ9Y29uc3RyYWluVmlkZW9CaXRyYXRlKHIpe3RoaXMuY29uc3RyYWluVmlkZW9CaXRyYXRlS2Jwcz1yfWRpc2FibGVWaWRlb0ZlYygpe3RoaXMuY29uc3RyYWluT2ZmZXJUb1JlbW92ZVZpZGVvRmVjPSEwfWdvdE9mZmVyKHIpe3RoaXMuY29uc3RyYWluT2ZmZXJUb1JlbW92ZVZpZGVvRmVjJiYoci5zZHA9ci5zZHAucmVwbGFjZSgvKG09dmlkZW8gMSBbXlxyXSspKDExNiAxMTcpKFxyXG4pL2csYCQxXHIKYCksci5zZHA9ci5zZHAucmVwbGFjZSgvYT1ydHBtYXA6MTE2IHJlZFwvOTAwMDBcclxuL2csIiIpLHIuc2RwPXIuc2RwLnJlcGxhY2UoL2E9cnRwbWFwOjExNyB1bHBmZWNcLzkwMDAwXHJcbi9nLCIiKSxyLnNkcD1yLnNkcC5yZXBsYWNlKC9hPXJ0cG1hcDo5OCBydHhcLzkwMDAwXHJcbi9nLCIiKSxyLnNkcD1yLnNkcC5yZXBsYWNlKC9hPWZtdHA6OTggYXB0PTExNlxyXG4vZywiIikpLHRoaXMucGMxLnNldExvY2FsRGVzY3JpcHRpb24ociksdGhpcy5wYzIuc2V0UmVtb3RlRGVzY3JpcHRpb24ociksdGhpcy5wYzIuY3JlYXRlQW5zd2VyKCkudGhlbih0aGlzLmdvdEFuc3dlci5iaW5kKHRoaXMpLHRoaXMucmVwb3J0RmF0YWwuYmluZCh0aGlzKSl9Z290QW5zd2VyKHIpe3RoaXMuY29uc3RyYWluVmlkZW9CaXRyYXRlS2JwcyYmKHIuc2RwPXIuc2RwLnJlcGxhY2UoL2E9bWlkOnZpZGVvXHJcbi9nLGBhPW1pZDp2aWRlb1xyCmI9QVM6JHt0aGlzLmNvbnN0cmFpblZpZGVvQml0cmF0ZUticHN9XHIKYCkpLHRoaXMucGMyLnNldExvY2FsRGVzY3JpcHRpb24ociksdGhpcy5wYzEuc2V0UmVtb3RlRGVzY3JpcHRpb24ocil9ZXN0YWJsaXNoQ29ubmVjdGlvbigpe3RoaXMucGMxLmNyZWF0ZU9mZmVyKCkudGhlbih0aGlzLmdvdE9mZmVyLmJpbmQodGhpcyksdGhpcy5yZXBvcnRGYXRhbC5iaW5kKHRoaXMpKX1yZXBvcnRGYXRhbChyKXtjb25zb2xlLmVycm9yKCJFcnJvcjoiLHIpfWdldFJvdW5kVHJpcFRpbWUoKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3RbcixlXT15aWVsZCBQcm9taXNlLmFsbChbdGhpcy5wYzEuZ2V0U3RhdHMoKSx0aGlzLnBjMi5nZXRTdGF0cygpXSk7bGV0IHMsbjtpZihyLmZvckVhY2goaT0+e2kudHlwZT09PSJjYW5kaWRhdGUtcGFpciImJmkubm9taW5hdGVkPT09ITAmJmkuYnl0ZXNTZW50PjAmJihzPWkpfSksZS5mb3JFYWNoKGk9PntpLnR5cGU9PT0iY2FuZGlkYXRlLXBhaXIiJiZpLm5vbWluYXRlZD09PSEwJiZpLmJ5dGVzUmVjZWl2ZWQ+MCYmKG49aSl9KSxzJiZuKXRyeXtpZihzLmN1cnJlbnRSb3VuZFRyaXBUaW1lJiZuLmN1cnJlbnRSb3VuZFRyaXBUaW1lKXJldHVybntydHQ6cy5jdXJyZW50Um91bmRUcmlwVGltZSxiYWNrZW5kUlRUOm4uY3VycmVudFJvdW5kVHJpcFRpbWV9O2NvbnN0IGk9KG4ubGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wLXMubGFzdFBhY2tldFNlbnRUaW1lc3RhbXApLzFlMztyZXR1cm57cnR0OmksYmFja2VuZFJUVDppfX1jYXRjaChpKXtyZXR1cm59fSl9Y2xvc2UoKXt0aGlzLnBjMS5jbG9zZSgpLHRoaXMucGMyLmNsb3NlKCl9fWNsYXNzIElyIGV4dGVuZHMgcXtjb25zdHJ1Y3RvcihlKXtzdXBlcigpO3AodGhpcywiY2FsbCIpO3AodGhpcywidGltZU91dCIpO3RoaXMuY2FsbD1uZXcgcmUoZSl9c3RhcnQoZT0xZTQpe3RoaXMuY2FsbC5lc3RhYmxpc2hDb25uZWN0aW9uKCksdGhpcy50aW1lT3V0PXNldFRpbWVvdXQodGhpcy50ZXN0RmFpbGVkLmJpbmQodGhpcyksZSl9dGVzdENvbXBsZXRlKGUpe2NsZWFyVGltZW91dCh0aGlzLnRpbWVPdXQpLHRoaXMuY2FsbC5jbG9zZSgpLHRoaXMuZW1pdCgiZG9uZSIsZSl9dGVzdEZhaWxlZChlKXt0aGlzLmNhbGwuY2xvc2UoKSx0aGlzLmVtaXQoImZhaWxlZCIsZSl9fWNvbnN0IHZuPTgsYm49MS8xZTM7Y2xhc3MgRW4gZXh0ZW5kcyBJcntjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTtwKHRoaXMsInNlbmRlckNoYW5uZWwiKTtwKHRoaXMsInJlY2lldmVDaGFubmVsIik7cCh0aGlzLCJzdGFydFRpbWUiKTtwKHRoaXMsImxhc3RCaXRyYXRlTWVhc3VyZVRpbWUiKTtwKHRoaXMsInNlbnRQYXlsb2FkQnl0ZXMiLDApO3AodGhpcywicmVjaWV2ZWRQYXlsb2FkQnl0ZXMiLDApO3AodGhpcywibGFzdFJlY2VpdmVkUGF5bG9hZEJ5dGVzIiwwKTtwKHRoaXMsInN0b3BTZW5kaW5nIiwhMSk7cCh0aGlzLCJ0ZXN0UHJvZ3Jlc3MiLDApO3AodGhpcywic2FtcGxlUGFja2V0IiwiIik7cCh0aGlzLCJmaW5hbEJpdHJhdGVTdW0iLDApO3AodGhpcywiYml0UmF0ZVNhbXBlbHMiLDApO3AodGhpcywibWF4TnVtYmVyT2ZQYWNrZXRzVG9TZW5kIiwwKTtwKHRoaXMsImJ5dGVzVG9LZWVwQnVmZmVyZWQiLDApO3AodGhpcywidGVzdER1cmF0aW9uU2Vjb25kcyIsNSk7dGhpcy5jYWxsLnNldEljZUNhbmRpZGF0ZUZpbHRlcihyZS5pc05vdEhvc3RDYW5kaWRhdGUpLHRoaXMuc2VuZGVyQ2hhbm5lbD10aGlzLmNhbGwucGMxLmNyZWF0ZURhdGFDaGFubmVsKG51bGwpO2ZvcihsZXQgcz0wO3M8MTAyNCoyNTY7cys9MSl0aGlzLnNhbXBsZVBhY2tldCs9ImgiO3RoaXMubWF4TnVtYmVyT2ZQYWNrZXRzVG9TZW5kPTEsdGhpcy5ieXRlc1RvS2VlcEJ1ZmZlcmVkPTEwMjQqdGhpcy5tYXhOdW1iZXJPZlBhY2tldHNUb1NlbmQsdGhpcy50ZXN0RHVyYXRpb25TZWNvbmRzPTQsdGhpcy5zZW5kZXJDaGFubmVsLmFkZEV2ZW50TGlzdGVuZXIoIm9wZW4iLHRoaXMuc2VuZGluZ1N0ZXAuYmluZCh0aGlzKSksdGhpcy5jYWxsLnBjMi5hZGRFdmVudExpc3RlbmVyKCJkYXRhY2hhbm5lbCIsdGhpcy5vblJlY2lldmVyQ2hhbm5lbC5iaW5kKHRoaXMpKX1zZW5kaW5nU3RlcCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5zdGFydFRpbWV8fCh0aGlzLnN0YXJ0VGltZT1lLHRoaXMubGFzdEJpdHJhdGVNZWFzdXJlVGltZT1lKTtmb3IobGV0IG49MDtuIT09dGhpcy5tYXhOdW1iZXJPZlBhY2tldHNUb1NlbmQmJiEodGhpcy5zZW5kZXJDaGFubmVsLmJ1ZmZlcmVkQW1vdW50Pj10aGlzLmJ5dGVzVG9LZWVwQnVmZmVyZWQpO24rPTEpe3RoaXMuc2VudFBheWxvYWRCeXRlcys9dGhpcy5zYW1wbGVQYWNrZXQubGVuZ3RoO3RyeXt0aGlzLnNlbmRlckNoYW5uZWwuc2VuZCh0aGlzLnNhbXBsZVBhY2tldCl9Y2F0Y2goaSl7fX1jb25zdCBzPWUuZ2V0VGltZSgpLXRoaXMuc3RhcnRUaW1lLmdldFRpbWUoKTtzPj0xZTMqdGhpcy50ZXN0RHVyYXRpb25TZWNvbmRzPyh0aGlzLnN0b3BTZW5kaW5nPSEwLHRoaXMudGVzdFByb2dyZXNzPTEwMCk6KHRoaXMudGVzdFByb2dyZXNzPXMvKDEwKnRoaXMudGVzdER1cmF0aW9uU2Vjb25kcyksc2V0VGltZW91dCh0aGlzLnNlbmRpbmdTdGVwLmJpbmQodGhpcyksMSkpfW9uTWVzc2FnZVJlY2lldmVkKGUpe3RoaXMucmVjaWV2ZWRQYXlsb2FkQnl0ZXMrPWUuZGF0YS5sZW5ndGg7Y29uc3Qgcz1uZXcgRGF0ZSxuPXMuZ2V0VGltZSgpLXRoaXMubGFzdEJpdHJhdGVNZWFzdXJlVGltZS5nZXRUaW1lKCk7aWYobj49MWUzKXtjb25zdCBhPSh0aGlzLnJlY2lldmVkUGF5bG9hZEJ5dGVzLXRoaXMubGFzdFJlY2VpdmVkUGF5bG9hZEJ5dGVzKSp2bi8obi8xZTMpO3RoaXMuZmluYWxCaXRyYXRlU3VtKz1hLHRoaXMuYml0UmF0ZVNhbXBlbHMrPTEsdGhpcy5sYXN0UmVjZWl2ZWRQYXlsb2FkQnl0ZXM9dGhpcy5yZWNpZXZlZFBheWxvYWRCeXRlcyx0aGlzLmxhc3RCaXRyYXRlTWVhc3VyZVRpbWU9c31pZih0aGlzLnN0b3BTZW5kaW5nJiZ0aGlzLnNlbnRQYXlsb2FkQnl0ZXM9PT10aGlzLnJlY2lldmVkUGF5bG9hZEJ5dGVzKXtjb25zdCBpPXRoaXMuZmluYWxCaXRyYXRlU3VtL3RoaXMuYml0UmF0ZVNhbXBlbHM7dGhpcy50ZXN0Q29tcGxldGUoe3Rocm91Z2hwdXQ6TWF0aC5yb3VuZChpKmJuKX0pfX10ZXN0Q29tcGxldGUoZSl7dGhpcy5jYWxsLmdldFJvdW5kVHJpcFRpbWUoKS50aGVuKCh7cnR0OnMsYmFja2VuZFJUVDpufSk9PnN1cGVyLnRlc3RDb21wbGV0ZSh7UlRUOnMsYmFja2VuZFJUVDpuLHRocm91Z2hwdXQ6ZS50aHJvdWdocHV0fSkpfW9uUmVjaWV2ZXJDaGFubmVsKGUpe3RoaXMucmVjaWV2ZUNoYW5uZWw9ZS5jaGFubmVsLHRoaXMucmVjaWV2ZUNoYW5uZWwuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5vbk1lc3NhZ2VSZWNpZXZlZC5iaW5kKHRoaXMpKX19Y2xhc3MgQXQgZXh0ZW5kcyBJcntjb25zdHJ1Y3RvcihlLHM9cmUubm9GaWx0ZXIpe3N1cGVyKGUpO3AodGhpcywiY2gxIik7cCh0aGlzLCJjaDIiKTt0aGlzLmNhbGwuc2V0SWNlQ2FuZGlkYXRlRmlsdGVyKHMpO2NvbnN0IG49dGhpcy5jYWxsLnBjMS5jcmVhdGVEYXRhQ2hhbm5lbChudWxsKTt0aGlzLmNoMT1uLG4uYWRkRXZlbnRMaXN0ZW5lcigib3BlbiIsKCk9PntuLnNlbmQoImhlbGxvIil9KSxuLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMub25DaDFSZWNpZXZlLmJpbmQodGhpcykpLHRoaXMuY2FsbC5wYzIuYWRkRXZlbnRMaXN0ZW5lcigiZGF0YWNoYW5uZWwiLHRoaXMuZGF0YUNoYW5uZWxIYW5kbGVyLmJpbmQodGhpcykpfW9uQ2gxUmVjaWV2ZShlKXtlLmRhdGEhPT0id29ybGQiP3RoaXMuaGFuZ3VwKCJJbnZhbGlkIGRhdGEgdHJhbnNtaXR0ZWQuIik6dGhpcy50ZXN0Q29tcGxldGUoe2Nvbm5lY3Rpdml0eTohMH0pfW9uQ2gyUmVjaWV2ZShlKXtpZihlLmRhdGEhPT0iaGVsbG8iKXRoaXMuaGFuZ3VwKCJJbnZhbGlkIGRhdGEgdHJhbnNtaXR0ZWQuIik7ZWxzZSB0cnl7dGhpcy5jaDIuc2VuZCgid29ybGQiKX1jYXRjaChzKXt9fWRhdGFDaGFubmVsSGFuZGxlcihlKXtjb25zdCBzPWUuY2hhbm5lbDt0aGlzLmNoMj1zLHMuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5vbkNoMlJlY2lldmUuYmluZCh0aGlzKSl9aGFuZ3VwKGUpe3RoaXMudGVzdEZhaWxlZChlKX19Y2xhc3MgVG4gZXh0ZW5kcyBBdHtjb25zdHJ1Y3RvcihyKXtzdXBlcihyLHJlLmlzSG9zdCl9fWNsYXNzIF9uIGV4dGVuZHMgQXR7Y29uc3RydWN0b3Iocil7c3VwZXIocixyZS5pc1JlbGF5KX19Y2xhc3MgUm4gZXh0ZW5kcyBBdHtjb25zdHJ1Y3RvcihyKXtzdXBlcihyLHJlLmlzUmVmbGV4aXZlKX19Y2xhc3MgUG57Y29uc3RydWN0b3IoKXtwKHRoaXMsImlwSW5mb3JtYXRpb24iLG51bGwpfWdldElQRGV0YWlscyhuKXtyZXR1cm4gSSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbiooe3BlZXJJZDpyLGFwaUhvc3RuYW1lczplLGxvZ2dlcjpzfSl7dmFyIGksYSxkO2lmKCF0aGlzLmlwSW5mb3JtYXRpb24pe3RyeXtjb25zdCBvPWBodHRwczovLyR7ZS5sb2NhdGlvbn1gLGY9eWllbGQoeWllbGQgZmV0Y2gobykpLmpzb24oKTtpZigoKGk9Zi5sb2MpPT1udWxsP3ZvaWQgMDppLmxlbmd0aCk+NSlyZXR1cm4gdGhpcy5pcEluZm9ybWF0aW9uPWYsKGE9dGhpcy5pcEluZm9ybWF0aW9uKSE9bnVsbCYmYS5pcCYmKHRoaXMuaXBJbmZvcm1hdGlvbi5pcD1hZSh0aGlzLmlwSW5mb3JtYXRpb24uaXApKSxmO3Rocm93IEVycm9yKCJJbnN1ZmZpY2llbnQgZGF0YSIpfWNhdGNoKG8pe3MuZXJyb3IoImNhbGxzdGF0czo6aXBEZXRhaWxzOjogZmFpbGVkIHRvIGZldGNoIGlwIHVzaW5nIGxvY2F0aW9uIHNlcnZpY2UiLHtlcnJvcjpvfSl9dHJ5e2NvbnN0IG89eWllbGQgZmV0Y2goYGh0dHBzOi8vJHtlLmxvY2F0aW9uTGVnYWN5fS8/dG9rZW49M2M0OTM5MzJiMDYyNGMmcGVlcklkPSR7cn1gLHttZXRob2Q6IlBPU1QifSk7dGhpcy5pcEluZm9ybWF0aW9uPXlpZWxkIG8uanNvbigpLChkPXRoaXMuaXBJbmZvcm1hdGlvbikhPW51bGwmJmQuaXAmJih0aGlzLmlwSW5mb3JtYXRpb24uaXA9YWUodGhpcy5pcEluZm9ybWF0aW9uLmlwKSl9Y2F0Y2gobyl7cy5lcnJvcigiY2FsbHN0YXRzOjppcERldGFpbHM6OiBmYWlsZWQgdG8gZmV0Y2ggaXAgdXNpbmcgbGVnYWN5IGxvY2F0aW9uIHNlcnZpY2UiLHtlcnJvcjpvfSl9fXJldHVybiB0aGlzLmlwSW5mb3JtYXRpb259KX1yZXNldENhY2hlKCl7dGhpcy5pcEluZm9ybWF0aW9uPW51bGx9fWNvbnN0IHdyPW5ldyBQbixNcj1be3VybHM6InR1cm46dHVybi5keXRlLmluOjQ0Mz90cmFuc3BvcnQ9dGNwIix1c2VybmFtZToiZHl0ZSIsY3JlZGVudGlhbDoiZHl0ZWluIixjcmVkZW50aWFsVHlwZToicGFzc3dvcmQifSx7dXJsczoidHVybjp0dXJuLmR5dGUuaW46MzQ3OD90cmFuc3BvcnQ9dWRwIix1c2VybmFtZToiZHl0ZSIsY3JlZGVudGlhbDoiZHl0ZWluIixjcmVkZW50aWFsVHlwZToicGFzc3dvcmQifV07ZnVuY3Rpb24gQXIodCl7Y29uc3RbcixlXT10LnNwbGl0KCIsIik7cmV0dXJue2Nvb3Jkczp7bGF0aXR1ZGU6TnVtYmVyKHIpLGxvbmdpdHVkZTpOdW1iZXIoZSl9fX1jbGFzcyBrcntjb25zdHJ1Y3Rvcigpe3AodGhpcywidHJhbnNwb3J0Iik7cCh0aGlzLCJjYW5kaWRhdGVQYWlyIik7cCh0aGlzLCJvdXRib3VuZFZpZGVvUnRwIixuZXcgTWFwKTtwKHRoaXMsImluYm91bmRWaWRlb1J0cCIsbmV3IE1hcCk7cCh0aGlzLCJvdXRib3VuZEF1ZGlvUnRwIixuZXcgTWFwKTtwKHRoaXMsImluYm91bmRBdWRpb1J0cCIsbmV3IE1hcCk7cCh0aGlzLCJyZW1vdGVJbmJvdW5kUnRwIixuZXcgTWFwKTtwKHRoaXMsInByb2R1Y2VyU3RyZWFtTWFwIixuZXcgTWFwKTtwKHRoaXMsImNvbnN1bWVyU3RyZWFtTWFwIixuZXcgTWFwKTtwKHRoaXMsInN0YWxlUHJvZHVjZXJTdHJlYW1NYXAiLCExKTtwKHRoaXMsInN0YWxlQ29uc3VtZXJTdHJlYW1NYXAiLCExKX19Y2xhc3MgT3IgZXh0ZW5kcyBxe2NvbnN0cnVjdG9yKCl7c3VwZXIoKTtwKHRoaXMsIm9ic2VydmVyIik7cCh0aGlzLCJvdXRib3VuZFByb2R1Y2VyTWFwIixuZXcgTWFwKTtwKHRoaXMsImluYm91bmRDb25zdW1lck1hcCIsbmV3IE1hcCk7cCh0aGlzLCJjb25zdW1lclBlZXJJZE1hcCIsbmV3IE1hcCk7cCh0aGlzLCJwYXVzZWRDb25zdW1lck1hcCIsbmV3IE1hcCk7cCh0aGlzLCJwYXVzZWRQcm9kdWNlck1hcCIsbmV3IE1hcCk7cCh0aGlzLCJvdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwIix7fSk7cCh0aGlzLCJvdmVyYWxsQ29uc3VtaW5nVHJhbnNwb3J0c1N0YXRzTWFwIix7fSk7cCh0aGlzLCJvdmVyYWxsQ29uc3VtZXJzU3RhdHNNYXAiLHt9KTtwKHRoaXMsIm92ZXJhbGxQcm9kdWNlcnNTdGF0c01hcCIse30pO3AodGhpcywidmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAiLG5ldyBNYXApO3AodGhpcywiYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAiLG5ldyBNYXApO3AodGhpcywidmlkZW9Db25zdW1lclRvU3RhdHNNYXAiLG5ldyBNYXApO3AodGhpcywiYXVkaW9Db25zdW1lclRvU3RhdHNNYXAiLG5ldyBNYXApO3AodGhpcywiY29uc3VtZXJJZHNXaXRoRnJlZXplZFZpZGVvIixuZXcgU2V0KTtwKHRoaXMsImNvbnN1bWVySWRzV2l0aEZyZWV6ZWRBdWRpbyIsbmV3IFNldCk7cCh0aGlzLCJwcm9kdWNlcklkc1dpdGhGcmVlemVkVmlkZW8iLG5ldyBTZXQpO3AodGhpcywicHJvZHVjZXJJZHNXaXRoRnJlZXplZEF1ZGlvIixuZXcgU2V0KTtwKHRoaXMsImZyZWV6ZWRQcm9kdWNpbmdUcmFuc3BvcnRJZHMiLG5ldyBTZXQpO3AodGhpcywiZnJlZXplZENvbnN1bWluZ1RyYW5zcG9ydElkcyIsbmV3IFNldCk7cCh0aGlzLCJzY3JlZW5TaGFyZVByb2R1Y2VycyIsbmV3IFNldCk7cCh0aGlzLCJzY3JlZW5TaGFyZUNvbnN1bWVycyIsbmV3IFNldCk7cCh0aGlzLCJpcERldGFpbHMiKTtwKHRoaXMsImNhbGxTdGF0c0luc3RhbmNlIik7dGhpcy5vYnNlcnZlcj1uZXcgcX1yZWdpc3RlclByb2R1Y2VyKGUpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt5aWVsZCB0aGlzLmdlbmVyYXRlUHJvZHVjZXJTdHJlYW1NYXAoZSksZS5vbigiY2xvc2UiLHRoaXMuZGVyZWdpc3RlclByb2R1Y2VyLmJpbmQodGhpcyxlKSksZS5vbigicGF1c2UiLHRoaXMucGF1c2VQcm9kdWNlci5iaW5kKHRoaXMsZS5pZCkpLGUub24oInJlc3VtZSIsdGhpcy5yZXN1bWVQcm9kdWNlci5iaW5kKHRoaXMsZS5pZCkpLGUuYXBwRGF0YS5zY3JlZW5TaGFyZT09PSEwJiZ0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmFkZChlLmlkKX0pfXBhdXNlUHJvZHVjZXIoZSl7dGhpcy5wYXVzZWRQcm9kdWNlck1hcC5zZXQoZSx7bGFzdFJlcG9ydENhbGN1bGF0ZWQ6ITF9KX1yZXN1bWVQcm9kdWNlcihlKXt0aGlzLnBhdXNlZFByb2R1Y2VyTWFwLmRlbGV0ZShlKX1wcm9jZXNzSW5ib3VuZENvbnN1bWVyVmlkZW9TdGF0cyhlLHMsbil7dmFyIGEsZDtjb25zdCBpPSgoZD0oYT10aGlzPT1udWxsP3ZvaWQgMDp0aGlzLmNhbGxTdGF0c0luc3RhbmNlKT09bnVsbD92b2lkIDA6YS5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwKT09bnVsbD92b2lkIDA6ZC5nZXQoZSkpfHx7fTtzLnRvdGFsVmlkZW9QYWNrZXRzUmVjZWl2ZWQ9PT1uLnBhY2tldHNSZWNlaXZlZD8odGhpcy5jb25zdW1lcklkc1dpdGhGcmVlemVkVmlkZW8uYWRkKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkudmlkZW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbHN0YXRzOjptZWFzdXJlbWVudHM6OmNvbnN1bWVyVmlkZW9GcmVlemVkIix7Y29uc3VtZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgiY29uc3VtZXJfdmlkZW9fc3RhdHVzIiwicGF1c2UiLGUpKSk6KHMudG90YWxWaWRlb1BhY2tldHNSZWNlaXZlZD1uLnBhY2tldHNSZWNlaXZlZCx0aGlzLmNvbnN1bWVySWRzV2l0aEZyZWV6ZWRWaWRlby5oYXMoZSkmJih0aGlzLmNvbnN1bWVySWRzV2l0aEZyZWV6ZWRWaWRlby5kZWxldGUoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmaS52aWRlbyYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsc3RhdHM6Om1lYXN1cmVtZW50czo6Y29uc3VtZXJWaWRlb0RlZnJlZXplZCIse2NvbnN1bWVySWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoImNvbnN1bWVyX3ZpZGVvX3N0YXR1cyIsInJlc3VtZSIsZSkpKSl9cHJvY2Vzc0luYm91bmRDb25zdW1lckF1ZGlvU3RhdHMoZSxzLG4pe3ZhciBhLGQ7Y29uc3QgaT0oKGQ9KGE9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmEuY29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlc01hcCk9PW51bGw/dm9pZCAwOmQuZ2V0KGUpKXx8e307cy50b3RhbEF1ZGlvUGFja2V0c1JlY2VpdmVkPT09bi5wYWNrZXRzUmVjZWl2ZWQ/KHRoaXMuY29uc3VtZXJJZHNXaXRoRnJlZXplZEF1ZGlvLmFkZChlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLmF1ZGlvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpjb25zdW1lckF1ZGlvRnJlZXplZCIse2NvbnN1bWVySWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoImNvbnN1bWVyX2F1ZGlvX3N0YXR1cyIsInBhdXNlIixlKSkpOihzLnRvdGFsQXVkaW9QYWNrZXRzUmVjZWl2ZWQ9bi5wYWNrZXRzUmVjZWl2ZWQsdGhpcy5jb25zdW1lcklkc1dpdGhGcmVlemVkQXVkaW8uaGFzKGUpJiYodGhpcy5jb25zdW1lcklkc1dpdGhGcmVlemVkQXVkaW8uZGVsZXRlKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkuYXVkaW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OmNvbnN1bWVyQXVkaW9EZWZyZWV6ZWQiLHtjb25zdW1lcklkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJjb25zdW1lcl9hdWRpb19zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NPdXRib3VuZFByb2R1Y2VyVmlkZW9TdGF0cyhlLHMsbil7dmFyIGE7Y29uc3QgaT0oKGE9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmEuY3VycmVudFVzZXJNZWRpYVN0YXRlcyl8fHt9O3MudG90YWxWaWRlb1BhY2tldHNTZW50PT09bi5wYWNrZXRzU2VudD8odGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkVmlkZW8uYWRkKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkudmlkZW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2VyVmlkZW9GcmVlemVkIix7cHJvZHVjZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfdmlkZW9fc3RhdHVzIiwicGF1c2UiLGUpKSk6KHMudG90YWxWaWRlb1BhY2tldHNTZW50PW4ucGFja2V0c1NlbnQsdGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkVmlkZW8uaGFzKGUpJiYodGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkVmlkZW8uZGVsZXRlKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkudmlkZW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2VyVmlkZW9EZWZyZWV6ZWQiLHtwcm9kdWNlcklkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJwcm9kdWNlcl92aWRlb19zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NPdXRib3VuZFByb2R1Y2VyQXVkaW9TdGF0cyhlLHMsbil7dmFyIGE7Y29uc3QgaT0oKGE9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmEuY3VycmVudFVzZXJNZWRpYVN0YXRlcyl8fHt9O3MudG90YWxBdWRpb1BhY2tldHNTZW50PT09bi5wYWNrZXRzU2VudD8odGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkQXVkaW8uYWRkKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkuYXVkaW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2VyQXVkaW9GcmVlemVkIix7cHJvZHVjZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfYXVkaW9fc3RhdHVzIiwicGF1c2UiLGUpKSk6KHMudG90YWxBdWRpb1BhY2tldHNTZW50PW4ucGFja2V0c1NlbnQsdGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkQXVkaW8uaGFzKGUpJiYodGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkQXVkaW8uZGVsZXRlKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkuYXVkaW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2VyQXVkaW9EZWZyZWV6ZWQiLHtwcm9kdWNlcklkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJwcm9kdWNlcl9hdWRpb19zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NQcm9kdWNpbmdUcmFuc3BvcnRTdGF0cyhlLHMsbil7dmFyIGY7Y29uc3QgaT0oKGY9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmYuY3VycmVudFVzZXJNZWRpYVN0YXRlcyl8fHt9LHthdWRpbzphLHZpZGVvOmQsc2NyZWVuOm99PWksbD1hfHxkfHxvO3MudG90YWxQYWNrZXRzU2VudD09PW4ucGFja2V0c1NlbnQ/KHRoaXMuZnJlZXplZFByb2R1Y2luZ1RyYW5zcG9ydElkcy5hZGQoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmbCYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6Om1lYXN1cmVtZW50czo6cHJvZHVjaW5nVHJhbnNwb3J0RnJlZXplZCIse3RyYW5zcG9ydElkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJwcm9kdWNpbmdfdHJhbnNwb3J0X3N0YXR1cyIsInBhdXNlIixlKSkpOihzLnRvdGFsUGFja2V0c1NlbnQ9bi5wYWNrZXRzU2VudCx0aGlzLmZyZWV6ZWRQcm9kdWNpbmdUcmFuc3BvcnRJZHMuaGFzKGUpJiYodGhpcy5mcmVlemVkUHJvZHVjaW5nVHJhbnNwb3J0SWRzLmRlbGV0ZShlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZsJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpwcm9kdWNpbmdUcmFuc3BvcnREZWZyZWV6ZWQiLHt0cmFuc3BvcnRJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjaW5nX3RyYW5zcG9ydF9zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NDb25zdW1pbmdUcmFuc3BvcnRTdGF0cyhlLHMsbil7dmFyIGQsbztjb25zdCBhPSEhQXJyYXkuZnJvbSgoKG89KGQ9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmQuY29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlc01hcCk9PW51bGw/dm9pZCAwOm8udmFsdWVzKCkpfHxbXSkucmVkdWNlKChsLGYpPT5sfHxmLmF1ZGlvfHxmLnZpZGVvfHxmLnNjcmVlbiwhMSk7cy50b3RhbFBhY2tldHNSZWNlaXZlZD09PW4ucGFja2V0c1NlbnQ/KHRoaXMuZnJlZXplZENvbnN1bWluZ1RyYW5zcG9ydElkcy5hZGQoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmYSYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6Om1lYXN1cmVtZW50czo6Y29uc3VtaW5nVHJhbnNwb3J0RnJlZXplZCIse3RyYW5zcG9ydElkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJjb25zdW1pbmdfdHJhbnNwb3J0X3N0YXR1cyIsInBhdXNlIixlKSkpOihzLnRvdGFsUGFja2V0c1JlY2VpdmVkPW4ucGFja2V0c1NlbnQsdGhpcy5mcmVlemVkQ29uc3VtaW5nVHJhbnNwb3J0SWRzLmhhcyhlKSYmKHRoaXMuZnJlZXplZENvbnN1bWluZ1RyYW5zcG9ydElkcy5kZWxldGUoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmYSYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6Om1lYXN1cmVtZW50czo6Y29uc3VtaW5nVHJhbnNwb3J0RGVmcmVlemVkIix7dHJhbnNwb3J0SWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoImNvbnN1bWluZ190cmFuc3BvcnRfc3RhdHVzIiwicmVzdW1lIixlKSkpKX1yZWdpc3RlckNvbnN1bWVyKGUpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt5aWVsZCB0aGlzLmdlbmVyYXRlQ29uc3VtZXJTdHJlYW1NYXAoZSksdGhpcy5jb25zdW1lclBlZXJJZE1hcC5zZXQoZS5pZCx7cHJvZHVjZXJJZDplLnByb2R1Y2VySWQscGVlcklkOmUuYXBwRGF0YS5wZWVySWQsYXBwRGF0YTplLmFwcERhdGF9KSxlLm9uKCJjbG9zZSIsdGhpcy5kZXJlZ2lzdGVyQ29uc3VtZXIuYmluZCh0aGlzLGUpKSxlLm9uKCJwYXVzZSIsdGhpcy5wYXVzZUNvbnN1bWVyLmJpbmQodGhpcyxlLmlkKSksZS5vbigicmVzdW1lIix0aGlzLnJlc3VtZUNvbnN1bWVyLmJpbmQodGhpcyxlLmlkKSksZS5hcHBEYXRhLnNjcmVlblNoYXJlPT09ITAmJnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuYWRkKGUuaWQpfSl9cGF1c2VDb25zdW1lcihlKXt0aGlzLnBhdXNlZENvbnN1bWVyTWFwLnNldChlLHtsYXN0UmVwb3J0Q2FsY3VsYXRlZDohMX0pfXJlc3VtZUNvbnN1bWVyKGUpe3RoaXMucGF1c2VkQ29uc3VtZXJNYXAuZGVsZXRlKGUpfWdlbmVyYXRlUHJvZHVjZXJTdHJlYW1NYXAoZSxzPSExKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgbj15aWVsZCBlLmdldFN0YXRzKCksaT1zP3RoaXMuZ2V0UHJvZHVjZXJTdGF0c0Zyb21SZXBvcnQodGhpcy5wYXJzZVJUQ1JlcG9ydChuLFsib3V0Ym91bmQtcnRwIiwicmVtb3RlLWluYm91bmQtcnRwIl0sITEsZS5pZCkpWzBdOnZvaWQgMDtmb3IoY29uc3QgYSBvZiBuLnZhbHVlcygpKXN3aXRjaChhLnR5cGUpe2Nhc2Uib3V0Ym91bmQtcnRwIjp7dGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLnNldChhLmlkLGUuaWQpO2JyZWFrfX1yZXR1cm4gaX0pfWdlbmVyYXRlQ29uc3VtZXJTdHJlYW1NYXAoZSxzPSExKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgbj15aWVsZCBlLmdldFN0YXRzKCksaT1zP3RoaXMuZ2V0Q29uc3VtZXJTdGF0c0Zyb21SZXBvcnQodGhpcy5wYXJzZVJUQ1JlcG9ydChuLFsiaW5ib3VuZC1ydHAiXSwhMSxlLmlkKSlbMF06dm9pZCAwO2Zvcihjb25zdCBhIG9mIG4udmFsdWVzKCkpc3dpdGNoKGEudHlwZSl7Y2FzZSJpbmJvdW5kLXJ0cCI6e3RoaXMuaW5ib3VuZENvbnN1bWVyTWFwLnNldChhLmlkLGUuaWQpO2JyZWFrfX1yZXR1cm4gaX0pfWRlcmVnaXN0ZXJQcm9kdWNlcihlKXt0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuZm9yRWFjaCgocyxuKT0+e3M9PT1lLmlkJiZ0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuZGVsZXRlKG4pfSksdGhpcy5wYXVzZWRQcm9kdWNlck1hcC5kZWxldGUoZS5pZCksdGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5kZWxldGUoZS5pZCl9ZGVyZWdpc3RlckNvbnN1bWVyKGUpe3RoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmZvckVhY2goKHMsbik9PntzPT09ZS5pZCYmdGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuZGVsZXRlKG4pfSksdGhpcy5jb25zdW1lclBlZXJJZE1hcC5kZWxldGUoZS5pZCksdGhpcy5wYXVzZWRDb25zdW1lck1hcC5kZWxldGUoZS5pZCksdGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5kZWxldGUoZS5pZCl9Z2V0SWNlQ2FuZGlkYXRlU3RhdHMoZSl7dmFyIHM7cmV0dXJue2lkOmUuaWQsdHlwZTplLmNhbmRpZGF0ZVR5cGV8fGUudHlwZSxhZGRyZXNzOmUuYWRkcmVzcyxwb3J0OmUucG9ydCx1cmw6ZS51cmwscHJvdG9jb2w6KHM9ZS5yZWxheVByb3RvY29sKSE9bnVsbD9zOmUucHJvdG9jb2wsbmV0d29ya1R5cGU6ZS5uZXR3b3JrVHlwZSxyZWxhdGVkQWRkcmVzczplLnJlbGF0ZWRBZGRyZXNzLHJlbGF0ZWRQb3J0OmUucmVsYXRlZFBvcnR9fWdldFdvcmtpbmdTaW11bGNhc3RWaWRlb1N0YXRzKGUpe3JldHVybiBlLmZpbmQobj0+e2NvbnN0IGk9bi5mcmFtZXNFbmNvZGVkPjAsYT1uLnBhY2tldHNTZW50PjAsZD1uLmZyYW1lV2lkdGgmJm4uZnJhbWVIZWlnaHQ7cmV0dXJuIGkmJmEmJiEhZH0pfHxlW2UubGVuZ3RoLTFdfXBhcnNlUlRDUmVwb3J0KGUscz1bXSxuPSExLGk9dm9pZCAwLGE9dm9pZCAwKXt2YXIgVSxMLEgsWix5ZSx2ZSxCZSx4ZSxqZSxVZSwkZSxIZSxLZTtjb25zdCBkPWUsbz1uZXcga3IsbD1zLmxlbmd0aD9uZXcgU2V0KHMpOnZvaWQgMCxmPVtdLHk9W10sRT1bXSx3PW5ldyBNYXAseD1uZXcgTWFwO2Zvcihjb25zdCBtIG9mIGQudmFsdWVzKCkpe2lmKGwpe2lmKGwuc2l6ZT09PTApYnJlYWs7aWYobC5oYXMobS50eXBlKSluJiZsLmRlbGV0ZShtLnR5cGUpO2Vsc2UgY29udGludWV9c3dpdGNoKG0udHlwZSl7Y2FzZSJsb2NhbC1jYW5kaWRhdGUiOntmLnB1c2godGhpcy5nZXRJY2VDYW5kaWRhdGVTdGF0cyhtKSk7YnJlYWt9Y2FzZSJyZW1vdGUtY2FuZGlkYXRlIjp7eS5wdXNoKHRoaXMuZ2V0SWNlQ2FuZGlkYXRlU3RhdHMobSkpO2JyZWFrfWNhc2UiY2FuZGlkYXRlLXBhaXIiOntjb25zdHtub21pbmF0ZWQ6Y309bSx7c2VsZWN0ZWQ6dX09bSxiPW0saj17bm9taW5hdGVkOmMhPW51bGw/Yzp1LGN1cnJlbnRSb3VuZFRyaXBUaW1lOmIuY3VycmVudFJvdW5kVHJpcFRpbWUsdG90YWxSb3VuZFRyaXBUaW1lOmIudG90YWxSb3VuZFRyaXBUaW1lLGJ5dGVzUmVjZWl2ZWQ6Yi5ieXRlc1JlY2VpdmVkLGJ5dGVzU2VudDpiLmJ5dGVzU2VudCxhdmFpbGFibGVPdXRnb2luZ0JpdHJhdGU6Yi5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGUsYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlOmIuYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlLGxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcDpiLmxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcCxsYXN0UGFja2V0U2VudFRpbWVzdGFtcDpiLmxhc3RQYWNrZXRTZW50VGltZXN0YW1wLGxvY2FsQ2FuZGlkYXRlSWQ6Yi5sb2NhbENhbmRpZGF0ZUlkLHJlbW90ZUNhbmRpZGF0ZUlkOmIucmVtb3RlQ2FuZGlkYXRlSWQsYnl0ZXNEaXNjYXJkZWRPblNlbmQ6Yi5ieXRlc0Rpc2NhcmRlZE9uU2VuZCxwYWNrZXRzU2VudDpiLnBhY2tldHNTZW50LHBhY2tldHNSZWNlaXZlZDpiLnBhY2tldHNSZWNlaXZlZCxwYWNrZXRzRGlzY2FyZGVkT25TZW5kOmIucGFja2V0c0Rpc2NhcmRlZE9uU2VuZH07RS5wdXNoKGopLChtLm5vbWluYXRlZD09PSEwfHxtLnNlbGVjdGVkPT09ITApJiYoby5jYW5kaWRhdGVQYWlyPWopO2JyZWFrfWNhc2UidHJhbnNwb3J0Ijp7Y29uc3QgYz1tO2EmJihhLnByb2R1Y2luZyYmKHRoaXMub3ZlcmFsbFByb2R1Y2luZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXXx8KHRoaXMub3ZlcmFsbFByb2R1Y2luZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXT17dG90YWxQYWNrZXRzU2VudDowfSkpLGEuY29uc3VtaW5nJiYodGhpcy5vdmVyYWxsQ29uc3VtaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdfHwodGhpcy5vdmVyYWxsQ29uc3VtaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdPXt0b3RhbFBhY2tldHNSZWNlaXZlZDowfSkpKTtjb25zdCB1PXtieXRlc1JlY2VpdmVkOmMuYnl0ZXNSZWNlaXZlZCxieXRlc1NlbnQ6Yy5ieXRlc1NlbnQscGFja2V0c1NlbnQ6Yy5wYWNrZXRzU2VudCxwYWNrZXRzUmVjZWl2ZWQ6Yy5wYWNrZXRzUmVjZWl2ZWQsZHRsc0NpcGhlcjpjLmR0bHNDaXBoZXIsZHRsc1N0YXRlOmMuZHRsc1N0YXRlLGljZVJvbGU6Yy5pY2VSb2xlfTtpZihvLnRyYW5zcG9ydD11LGEpe2lmKGEucHJvZHVjaW5nKXtjb25zdCBiPXRoaXMub3ZlcmFsbFByb2R1Y2luZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXTt0aGlzLnByb2Nlc3NQcm9kdWNpbmdUcmFuc3BvcnRTdGF0cyhhLmlkLGIsdSl9aWYoYS5jb25zdW1pbmcpe2NvbnN0IGI9dGhpcy5vdmVyYWxsQ29uc3VtaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdO3RoaXMucHJvY2Vzc0NvbnN1bWluZ1RyYW5zcG9ydFN0YXRzKGEuaWQsYix1KX19YnJlYWt9Y2FzZSJyZW1vdGUtaW5ib3VuZC1ydHAiOntjb25zdCBjPW0sdT17aml0dGVyOmMuaml0dGVyLGZyYWN0aW9uTG9zdDpjLmZyYWN0aW9uTG9zdCxyb3VuZFRyaXBUaW1lOmMucm91bmRUcmlwVGltZSxyb3VuZFRyaXBUaW1lTWVhc3VyZW1lbnRzOmMucm91bmRUcmlwVGltZU1lYXN1cmVtZW50cyx0b3RhbFJvdW5kVHJpcFRpbWU6Yy50b3RhbFJvdW5kVHJpcFRpbWUscGFja2V0c0xvc3Q6Yy5wYWNrZXRzTG9zdH07by5yZW1vdGVJbmJvdW5kUnRwLnNldChjLmxvY2FsSWQsdSk7YnJlYWt9Y2FzZSJvdXRib3VuZC1ydHAiOntpZighdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmhhcyhtLmlkKSlicmVhaztjb25zdCBjPW0sdT1pfHx0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuZ2V0KG0uaWQpLGI9dGhpcy5wYXVzZWRQcm9kdWNlck1hcC5nZXQodSk7aWYoYil7aWYoYi5sYXN0UmVwb3J0Q2FsY3VsYXRlZD09PSEwKWJyZWFrO3RoaXMucGF1c2VkUHJvZHVjZXJNYXAuc2V0KHUse2xhc3RSZXBvcnRDYWxjdWxhdGVkOiEwfSl9dGhpcy5vdmVyYWxsUHJvZHVjZXJzU3RhdHNNYXBbdV18fCh0aGlzLm92ZXJhbGxQcm9kdWNlcnNTdGF0c01hcFt1XT17dG90YWxWaWRlb1BhY2tldHNTZW50OjAsdG90YWxBdWRpb1BhY2tldHNTZW50OjB9KTtjb25zdCBqPXRoaXMub3ZlcmFsbFByb2R1Y2Vyc1N0YXRzTWFwW3VdO2lmKFsidmlkZW8iLCJhdWRpbyJdLmluY2x1ZGVzKGMubWVkaWFUeXBlKXx8WyJ2aWRlbyIsImF1ZGlvIl0uaW5jbHVkZXMoYy5raW5kKSl7aWYoIXRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5oYXMobS5pZCkpe28uc3RhbGVQcm9kdWNlclN0cmVhbU1hcD0hMDticmVha31jb25zdCBLPXRoaXMuY2FsbFN0YXRzSW5zdGFuY2UucHJvZHVjZXJzLmdldCh1KTtpZigoKFU9Sz09bnVsbD92b2lkIDA6Sy50cmFjayk9PW51bGw/dm9pZCAwOlUucmVhZHlTdGF0ZSk9PT0iZW5kZWQiKWJyZWFrO28ucHJvZHVjZXJTdHJlYW1NYXAuaGFzKHUpfHxvLnByb2R1Y2VyU3RyZWFtTWFwLnNldCh1LHtvdXRib3VuZFZpZGVvUnRwSWQ6W10sb3V0Ym91bmRBdWRpb1J0cElkOltdfSk7Y29uc3Qgdj17Ynl0ZXNTZW50OmMuYnl0ZXNTZW50LHBhY2tldHNTZW50OmMucGFja2V0c1NlbnQsbmFja0NvdW50OmMubmFja0NvdW50LHNzcmM6Yy5zc3JjLG1pZDpjLm1pZCxhY3RpdmU6Yy5hY3RpdmUsY29kZWNJZDpjLmNvZGVjSWQsaGVhZGVyQnl0ZXNTZW50OmMuaGVhZGVyQnl0ZXNTZW50fHwwLHRvdGFsUGFja2V0U2VuZERlbGF5OmMudG90YWxQYWNrZXRTZW5kRGVsYXl8fDB9O2lmKGMubWVkaWFUeXBlPT09InZpZGVvInx8Yy5raW5kPT09InZpZGVvIil7Y29uc3QgaD1jLFc9USh7ZnJhbWVIZWlnaHQ6aC5mcmFtZUhlaWdodCxmcmFtZVdpZHRoOmguZnJhbWVXaWR0aCxmcmFtZXNFbmNvZGVkOmguZnJhbWVzRW5jb2RlZCxmcmFtZXNEcm9wcGVkOmguZnJhbWVzRHJvcHBlZCxmcmFtZXNQZXJTZWNvbmQ6aC5mcmFtZXNQZXJTZWNvbmQsZnJhbWVzU2VudDpoLmZyYW1lc1NlbnQsa2V5RnJhbWVzRW5jb2RlZDpoLmtleUZyYW1lc0VuY29kZWQsZmlyQ291bnQ6aC5maXJDb3VudCxlbmNvZGVySW1wbGVtZW50YXRpb246aC5lbmNvZGVySW1wbGVtZW50YXRpb24saHVnZUZyYW1lc1NlbnQ6aC5odWdlRnJhbWVzU2VudCxwbGlDb3VudDpoLnBsaUNvdW50LHFwU3VtOmgucXBTdW0scXVhbGl0eUxpbWl0YXRpb25EdXJhdGlvbnM6aC5xdWFsaXR5TGltaXRhdGlvbkR1cmF0aW9ucyxxdWFsaXR5TGltaXRhdGlvblJlYXNvbjpoLnF1YWxpdHlMaW1pdGF0aW9uUmVhc29uLHF1YWxpdHlMaW1pdGF0aW9uUmVzb2x1dGlvbkNoYW5nZXM6aC5xdWFsaXR5TGltaXRhdGlvblJlc29sdXRpb25DaGFuZ2VzLHRvdGFsRW5jb2RlVGltZTpoLnRhcmdldEJpdHJhdGUsdG90YWxQYWNrZXRTZW5kRGVsYXk6aC50b3RhbFBhY2tldFNlbmREZWxheSxyZXRyYW5zbWl0dGVkQnl0ZXNTZW50OmgucmV0cmFuc21pdHRlZEJ5dGVzU2VudCxyZXRyYW5zbWl0dGVkUGFja2V0c1NlbnQ6aC5yZXRyYW5zbWl0dGVkUGFja2V0c1NlbnQsc2NhbGFiaWxpdHlNb2RlOmguc2NhbGFiaWxpdHlNb2RlLHBvd2VyRWZmaWNpZW50RW5jb2RlcjpoLnBvd2VyRWZmaWNpZW50RW5jb2Rlcn0sdik7by5vdXRib3VuZFZpZGVvUnRwLnNldChtLmlkLFcpLG8ucHJvZHVjZXJTdHJlYW1NYXAuZ2V0KHUpLm91dGJvdW5kVmlkZW9SdHBJZC5wdXNoKG0uaWQpLHRoaXMucHJvY2Vzc091dGJvdW5kUHJvZHVjZXJWaWRlb1N0YXRzKHUsaixXKX1lbHNlIGlmKGMubWVkaWFUeXBlPT09ImF1ZGlvInx8Yy5raW5kPT09ImF1ZGlvIil7Y29uc3QgaD1jLFc9USh7cmV0cmFuc21pdHRlZEJ5dGVzU2VudDpoLnJldHJhbnNtaXR0ZWRCeXRlc1NlbnQscmV0cmFuc21pdHRlZFBhY2tldHNTZW50OmgucmV0cmFuc21pdHRlZFBhY2tldHNTZW50fSx2KTtvLm91dGJvdW5kQXVkaW9SdHAuc2V0KG0uaWQsVyksby5wcm9kdWNlclN0cmVhbU1hcC5nZXQodSkub3V0Ym91bmRBdWRpb1J0cElkLnB1c2gobS5pZCksdGhpcy5wcm9jZXNzT3V0Ym91bmRQcm9kdWNlckF1ZGlvU3RhdHModSxqLFcpfX1lbHNlIHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmVycm9yKGBDYWxsc3RhdHM6IFVua25vd24gT3V0Ym91bmQtcnRwLiBtZWRpYXR5cGU6ICR7Yy5tZWRpYVR5cGV9IGtpbmQ6ICR7Yy5raW5kfWApO2JyZWFrfWNhc2UiaW5ib3VuZC1ydHAiOntpZighdGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuaGFzKG0uaWQpKWJyZWFrO2NvbnN0IGM9bSx1PWl8fHRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmdldChtLmlkKSxiPXRoaXMucGF1c2VkQ29uc3VtZXJNYXAuZ2V0KHUpO2lmKGIpe2lmKGIubGFzdFJlcG9ydENhbGN1bGF0ZWQ9PT0hMClicmVhazt0aGlzLnBhdXNlZENvbnN1bWVyTWFwLnNldCh1LHtsYXN0UmVwb3J0Q2FsY3VsYXRlZDohMH0pfWlmKGMuc3NyYz09PTEyMzQpYnJlYWs7dGhpcy5vdmVyYWxsQ29uc3VtZXJzU3RhdHNNYXBbdV18fCh0aGlzLm92ZXJhbGxDb25zdW1lcnNTdGF0c01hcFt1XT17dG90YWxWaWRlb1BhY2tldHNSZWNlaXZlZDowLHRvdGFsQXVkaW9QYWNrZXRzUmVjZWl2ZWQ6MH0pO2NvbnN0IGo9dGhpcy5vdmVyYWxsQ29uc3VtZXJzU3RhdHNNYXBbdV07aWYoWyJ2aWRlbyIsImF1ZGlvIl0uaW5jbHVkZXMoYy5tZWRpYVR5cGUpfHxbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLmtpbmQpKXtpZighdGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuaGFzKG0uaWQpKXtvLnN0YWxlQ29uc3VtZXJTdHJlYW1NYXA9ITA7YnJlYWt9by5jb25zdW1lclN0cmVhbU1hcC5oYXModSl8fG8uY29uc3VtZXJTdHJlYW1NYXAuc2V0KHUse2luYm91bmRWaWRlb1J0cElkOltdLGluYm91bmRBdWRpb1J0cElkOltdfSk7Y29uc3QgSz17Ynl0ZXNSZWNlaXZlZDpjLmJ5dGVzUmVjZWl2ZWQscGFja2V0c1JlY2VpdmVkOmMucGFja2V0c1JlY2VpdmVkLHBhY2tldHNMb3N0OmMucGFja2V0c0xvc3Q+PTA/Yy5wYWNrZXRzTG9zdDowLGppdHRlcjpjLmppdHRlcixuYWNrQ291bnQ6Yy5uYWNrQ291bnQsaml0dGVyQnVmZmVyRGVsYXk6Yy5qaXR0ZXJCdWZmZXJEZWxheSxqaXR0ZXJCdWZmZXJFbWl0dGVkQ291bnQ6Yy5qaXR0ZXJCdWZmZXJFbWl0dGVkQ291bnQsbGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wOmMubGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wLHNzcmM6Yy5zc3JjLG1pZDpjLm1pZCxjb2RlY0lkOmMuY29kZWNJZCxoZWFkZXJCeXRlc1JlY2VpdmVkOmMuaGVhZGVyQnl0ZXNSZWNlaXZlZHx8MCxwYWNrZXRzRGlzY2FyZGVkOmMucGFja2V0c0Rpc2NhcmRlZHx8MCxqaXR0ZXJCdWZmZXJNaW5pbXVtRGVsYXk6Yy5qaXR0ZXJCdWZmZXJNaW5pbXVtRGVsYXl8fDAsaml0dGVyQnVmZmVyVGFyZ2V0RGVsYXk6Yy5qaXR0ZXJCdWZmZXJUYXJnZXREZWxheXx8MH07aWYoYy5tZWRpYVR5cGU9PT0idmlkZW8ifHxjLmtpbmQ9PT0idmlkZW8iKXtjb25zdCB2PWMsaD1RKHtmcmFtZUhlaWdodDp2LmZyYW1lSGVpZ2h0LGZyYW1lV2lkdGg6di5mcmFtZVdpZHRoLGZyYW1lc0RlY29kZWQ6di5mcmFtZXNEZWNvZGVkLGZyYW1lc0Ryb3BwZWQ6di5mcmFtZXNEcm9wcGVkLGZyYW1lc1BlclNlY29uZDp2LmZyYW1lc1BlclNlY29uZCxmcmFtZXNSZWNlaXZlZDp2LmZyYW1lc1JlY2VpdmVkLGtleUZyYW1lc0RlY29kZWQ6di5rZXlGcmFtZXNEZWNvZGVkLGZpckNvdW50OnYuZmlyQ291bnQsZGVjb2RlckltcGxlbWVudGF0aW9uOnYuZGVjb2RlckltcGxlbWVudGF0aW9uLHBsaUNvdW50OnYucGxpQ291bnQsdG90YWxQcm9jZXNzaW5nRGVsYXk6di50b3RhbFByb2Nlc3NpbmdEZWxheSxxcFN1bTp2LnFwU3VtfHwwLHRvdGFsQXNzZW1ibHlUaW1lOnYudG90YWxBc3NlbWJseVRpbWV8fDAsdG90YWxEZWNvZGVUaW1lOnYudG90YWxEZWNvZGVUaW1lfHwwLHRvdGFsRnJlZXplc0R1cmF0aW9uOnYudG90YWxGcmVlemVzRHVyYXRpb258fDAsdG90YWxJbnRlckZyYW1lRGVsYXk6di50b3RhbEludGVyRnJhbWVEZWxheXx8MCx0b3RhbFBhdXNlc0R1cmF0aW9uOnYudG90YWxQYXVzZXNEdXJhdGlvbnx8MCx0b3RhbFNxdWFyZWRJbnRlckZyYW1lRGVsYXk6di50b3RhbFNxdWFyZWRJbnRlckZyYW1lRGVsYXl8fDAsZnJlZXplQ291bnQ6di5mcmVlemVDb3VudHx8MCxwYXVzZUNvdW50OnYucGF1c2VDb3VudHx8MCxwb3dlckVmZmljaWVudERlY29kZXI6di5wb3dlckVmZmljaWVudERlY29kZXJ9LEspO2guc2NvcmU9Q3Ioe2ZyYW1lV2lkdGg6aC5mcmFtZVdpZHRofHwwLGZyYW1lc0RlY29kZWQ6KGguZnJhbWVzRGVjb2RlZHx8MCktKCgoTD10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOkwuZnJhbWVzRGVjb2RlZCl8fDApLGZyYW1lc1BlclNlY29uZDpoLmZyYW1lc1BlclNlY29uZHx8MCxwYWNrZXRzTG9zdDooaC5wYWNrZXRzTG9zdHx8MCktKCgoSD10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOkgucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KGgucGFja2V0c1JlY2VpdmVkfHwwKS0oKChaPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6Wi5wYWNrZXRzUmVjZWl2ZWQpfHwwKSxqaXR0ZXI6aC5qaXR0ZXJ8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlQ29uc3VtZXJzLmhhcyh1KX0pLHguc2V0KHUse3Njb3JlOisoaC5zY29yZSoxMCkudG9GaXhlZCgpLGZyYW1lV2lkdGg6aC5mcmFtZVdpZHRofHwwLGZyYW1lSGVpZ2h0OmguZnJhbWVIZWlnaHR8fDAsZnJhbWVzUGVyU2Vjb25kOmguZnJhbWVzUGVyU2Vjb25kfHwwLHBhY2tldHNMb3N0UGVyY2VudGFnZTp1dCh7cGFja2V0c0xvc3Q6KGgucGFja2V0c0xvc3R8fDApLSgoKHllPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6eWUucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KGgucGFja2V0c1JlY2VpdmVkfHwwKS0oKCh2ZT10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOnZlLnBhY2tldHNSZWNlaXZlZCl8fDApfSksaml0dGVyOmguaml0dGVyfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5oYXModSksYml0cmF0ZTooKGguYnl0ZXNSZWNlaXZlZHx8MCktKCgoQmU9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpCZS5ieXRlc1JlY2VpdmVkKXx8MCkpKjgvN30pLHRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuc2V0KHUsaCksby5pbmJvdW5kVmlkZW9SdHAuc2V0KG0uaWQsaCksby5jb25zdW1lclN0cmVhbU1hcC5nZXQodSkuaW5ib3VuZFZpZGVvUnRwSWQucHVzaChtLmlkKSx0aGlzLnByb2Nlc3NJbmJvdW5kQ29uc3VtZXJWaWRlb1N0YXRzKHUsaixoKX1lbHNlIGlmKGMubWVkaWFUeXBlPT09ImF1ZGlvInx8Yy5raW5kPT09ImF1ZGlvIil7Y29uc3Qgdj1jLGg9USh7YXVkaW9MZXZlbDp2LmF1ZGlvTGV2ZWwsY29uY2VhbGVkU2FtcGxlczp2LmNvbmNlYWxlZFNhbXBsZXMsY29uY2VhbG1lbnRFdmVudHM6di5jb25jZWFsbWVudEV2ZW50cyx0b3RhbEF1ZGlvRW5lcmd5OnYudG90YWxBdWRpb0VuZXJneSx0b3RhbFNhbXBsZXNEdXJhdGlvbjp2LnRvdGFsU2FtcGxlc0R1cmF0aW9uLHRvdGFsU2FtcGxlc1JlY2VpdmVkOnYudG90YWxTYW1wbGVzUmVjZWl2ZWQsZmVjUGFja2V0c0Rpc2NhcmRlZDp2LmZlY1BhY2tldHNEaXNjYXJkZWR8fDAsZmVjUGFja2V0c1JlY2VpdmVkOnYuZmVjUGFja2V0c1JlY2VpdmVkfHwwLGluc2VydGVkU2FtcGxlc0ZvckRlY2VsZXJhdGlvbjp2Lmluc2VydGVkU2FtcGxlc0ZvckRlY2VsZXJhdGlvbnx8MCxyZW1vdmVkU2FtcGxlc0ZvckFjY2VsZXJhdGlvbjp2LnJlbW92ZWRTYW1wbGVzRm9yQWNjZWxlcmF0aW9ufHwwLHNpbGVudENvbmNlYWxlZFNhbXBsZXM6di5zaWxlbnRDb25jZWFsZWRTYW1wbGVzfHwwLHBsYXlvdXRJZDp2LnBsYXlvdXRJZH0sSyk7aC5zY29yZT1Qcih7Y29uY2VhbG1lbnRFdmVudHM6KGguY29uY2VhbG1lbnRFdmVudHN8fDApLSgoKHhlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6eGUuY29uY2VhbG1lbnRFdmVudHMpfHwwKSxwYWNrZXRzTG9zdDooaC5wYWNrZXRzTG9zdHx8MCktKCgoamU9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpqZS5wYWNrZXRzTG9zdCl8fDApLHBhY2tldHNSZWNlaXZlZDooaC5wYWNrZXRzUmVjZWl2ZWR8fDApLSgoKFVlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6VWUucGFja2V0c1JlY2VpdmVkKXx8MCksaml0dGVyOmguaml0dGVyfHwwfSkseC5zZXQodSx7c2NvcmU6KyhoLnNjb3JlKjEwKS50b0ZpeGVkKCkscGFja2V0c0xvc3RQZXJjZW50YWdlOnV0KHtwYWNrZXRzTG9zdDooaC5wYWNrZXRzTG9zdHx8MCktKCgoJGU9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDokZS5wYWNrZXRzTG9zdCl8fDApLHBhY2tldHNSZWNlaXZlZDooaC5wYWNrZXRzUmVjZWl2ZWR8fDApLSgoKEhlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6SGUucGFja2V0c1JlY2VpdmVkKXx8MCl9KSxqaXR0ZXI6aC5qaXR0ZXJ8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlQ29uc3VtZXJzLmhhcyh1KSxiaXRyYXRlOigoaC5ieXRlc1JlY2VpdmVkfHwwKS0oKChLZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOktlLmJ5dGVzUmVjZWl2ZWQpfHwwKSkqOC83fSksdGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5zZXQodSxoKSxvLmluYm91bmRBdWRpb1J0cC5zZXQobS5pZCxoKSxvLmNvbnN1bWVyU3RyZWFtTWFwLmdldCh1KS5pbmJvdW5kQXVkaW9SdHBJZC5wdXNoKG0uaWQpLHRoaXMucHJvY2Vzc0luYm91bmRDb25zdW1lckF1ZGlvU3RhdHModSxqLGgpfX1lbHNlIHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmVycm9yKGBDYWxsc3RhdHM6IFVua25vd24gSW5ib3VuZC1ydHAuIG1lZGlhdHlwZTogJHtjLm1lZGlhVHlwZX0ga2luZDogJHtjLmtpbmR9YCk7YnJlYWt9fX1pZihvLnByb2R1Y2VyU3RyZWFtTWFwLmZvckVhY2goKG0sYyk9Pnt2YXIgdSxiLGosSyx2LGgsVyx6ZSxXZSxHZSxxZSxZZSxRZSxKZSxYZSxaZSxldCx0dCxydCxzdCxudCxpdCxhdDtpZihtLm91dGJvdW5kVmlkZW9SdHBJZC5sZW5ndGg+MCl7Y29uc3QgVj1bXTttLm91dGJvdW5kVmlkZW9SdHBJZC5mb3JFYWNoKHJyPT57Vi5wdXNoKG8ub3V0Ym91bmRWaWRlb1J0cC5nZXQocnIpKX0pO2NvbnN0IE09dGhpcy5nZXRXb3JraW5nU2ltdWxjYXN0VmlkZW9TdGF0cyhWKTtNLnNjb3JlPV9yKHtmcmFtZVdpZHRoOk0uZnJhbWVXaWR0aHx8MCxmcmFtZXNQZXJTZWNvbmQ6TS5mcmFtZXNQZXJTZWNvbmR8fDAsaml0dGVyOigodT1NLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDp1LmppdHRlcil8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmhhcyhjKSxwYWNrZXRzU2VudDooTS5wYWNrZXRzU2VudHx8MCktKCgoYj10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOmIucGFja2V0c1NlbnQpfHwwKSxwYWNrZXRzTG9zdDooKChqPU0ucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOmoucGFja2V0c0xvc3QpfHwwKS0oKCh2PShLPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6Sy5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6di5wYWNrZXRzTG9zdCl8fDApLGZyYW1lc0VuY29kZWQ6KE0uZnJhbWVzRW5jb2RlZHx8MCktKCgoaD10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOmguZnJhbWVzRW5jb2RlZCl8fDApfSksdy5zZXQoYyx7c2NvcmU6KyhNLnNjb3JlKjEwKS50b0ZpeGVkKCksZnJhbWVXaWR0aDpNLmZyYW1lV2lkdGh8fDAsZnJhbWVIZWlnaHQ6TS5mcmFtZUhlaWdodHx8MCxmcmFtZXNQZXJTZWNvbmQ6TS5mcmFtZXNQZXJTZWNvbmR8fDAsaml0dGVyOigoVz1NLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpXLmppdHRlcil8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmhhcyhjKSxwYWNrZXRzTG9zdFBlcmNlbnRhZ2U6bHQoe3BhY2tldHNTZW50OihNLnBhY2tldHNTZW50fHwwKS0oKCh6ZT10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnplLnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoV2U9TS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6V2UucGFja2V0c0xvc3QpfHwwKS0oKChxZT0oR2U9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpHZS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6cWUucGFja2V0c0xvc3QpfHwwKX0pLGJpdHJhdGU6KChNLmJ5dGVzU2VudHx8MCktKCgoWWU9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpZZS5ieXRlc1NlbnQpfHwwKSkqOC83LGNwdUxpbWl0YXRpb25zOk0ucXVhbGl0eUxpbWl0YXRpb25SZWFzb249PT0iY3B1IixiYW5kd2lkdGhMaW1pdGF0aW9uczpNLnF1YWxpdHlMaW1pdGF0aW9uUmVhc29uPT09ImJhbmR3aWR0aCJ9KSx0aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLnNldChjLE0pfWVsc2UgaWYobS5vdXRib3VuZEF1ZGlvUnRwSWQubGVuZ3RoPjApe2NvbnN0IFY9by5vdXRib3VuZEF1ZGlvUnRwLmdldChtLm91dGJvdW5kQXVkaW9SdHBJZFswXSk7Vi5zY29yZT1Ucih7cGFja2V0c1NlbnQ6KFYucGFja2V0c1NlbnR8fDApLSgoKFFlPXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6UWUucGFja2V0c1NlbnQpfHwwKSxwYWNrZXRzTG9zdDooKChKZT1WLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpKZS5wYWNrZXRzTG9zdCl8fDApLSgoKFplPShYZT10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOlhlLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpaZS5wYWNrZXRzTG9zdCl8fDApLGppdHRlcjooKGV0PVYucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOmV0LmppdHRlcil8fDB9KSx3LnNldChjLHtzY29yZTorKFYuc2NvcmUqMTApLnRvRml4ZWQoKSxiaXRyYXRlOigoVi5ieXRlc1NlbnR8fDApLSgoKHR0PXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6dHQuYnl0ZXNTZW50KXx8MCkpKjgvNyxwYWNrZXRzTG9zdFBlcmNlbnRhZ2U6bHQoe3BhY2tldHNTZW50OihWLnBhY2tldHNTZW50fHwwKS0oKChydD10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnJ0LnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoc3Q9Vi5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6c3QucGFja2V0c0xvc3QpfHwwKS0oKChpdD0obnQ9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpudC5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6aXQucGFja2V0c0xvc3QpfHwwKX0pLGppdHRlcjooKGF0PVYucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOmF0LmppdHRlcil8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmhhcyhjKX0pLHRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuc2V0KGMsVil9fSksRS5mb3JFYWNoKG09Pntjb25zdCBjPWYuZmluZChiPT5iLmlkPT09bS5sb2NhbENhbmRpZGF0ZUlkPyhtLmxvY2FsQ2FuZGlkYXRlSWQ9Yi5pZCxiKTpudWxsKSx1PXkuZmluZChiPT5iLmlkPT09bS5yZW1vdGVDYW5kaWRhdGVJZD8obS5yZW1vdGVDYW5kaWRhdGVJZD1iLmlkLGIpOm51bGwpO2MmJihtLmxvY2FsQ2FuZGlkYXRlVHlwZT1jLnR5cGUsbS5sb2NhbENhbmRpZGF0ZUFkZHJlc3M9YWUoYy5hZGRyZXNzKSxtLmxvY2FsQ2FuZGlkYXRlUG9ydD1jLnBvcnQsbS5sb2NhbENhbmRpZGF0ZVByb3RvY29sPWMucHJvdG9jb2wsbS5sb2NhbENhbmRpZGF0ZVVybD1jLnVybCxtLmxvY2FsQ2FuZGlkYXRlTmV0d29ya1R5cGU9Yy5uZXR3b3JrVHlwZSxtLmxvY2FsQ2FuZGlkYXRlUmVsYXRlZEFkZHJlc3M9YWUoYy5yZWxhdGVkQWRkcmVzcyksbS5sb2NhbENhbmRpZGF0ZVJlbGF0ZWRQb3J0PWMucmVsYXRlZFBvcnQpLHUmJihtLnJlbW90ZUNhbmRpZGF0ZVR5cGU9dS50eXBlLG0ucmVtb3RlQ2FuZGlkYXRlQWRkcmVzcz1hZSh1LmFkZHJlc3MpLG0ucmVtb3RlQ2FuZGlkYXRlUG9ydD11LnBvcnQsbS5yZW1vdGVDYW5kaWRhdGVQcm90b2NvbD11LnByb3RvY29sLG0ucmVtb3RlQ2FuZGlkYXRlVXJsPXUudXJsKX0pLG8uY2FuZGlkYXRlUGFpciYmKG8udHJhbnNwb3J0PyhvLnRyYW5zcG9ydC50b3RhbFJvdW5kVHJpcFRpbWU9by5jYW5kaWRhdGVQYWlyLnRvdGFsUm91bmRUcmlwVGltZSxvLnRyYW5zcG9ydC5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGU9by5jYW5kaWRhdGVQYWlyLmF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZSxvLnRyYW5zcG9ydC5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGU9by5jYW5kaWRhdGVQYWlyLmF2YWlsYWJsZUluY29taW5nQml0cmF0ZSxvLnRyYW5zcG9ydC5yb3VuZFRyaXBUaW1lPW8uY2FuZGlkYXRlUGFpci5jdXJyZW50Um91bmRUcmlwVGltZSk6by50cmFuc3BvcnQ9e2J5dGVzUmVjZWl2ZWQ6by5jYW5kaWRhdGVQYWlyLmJ5dGVzUmVjZWl2ZWQsYnl0ZXNTZW50Om8uY2FuZGlkYXRlUGFpci5ieXRlc1NlbnQsdG90YWxSb3VuZFRyaXBUaW1lOm8uY2FuZGlkYXRlUGFpci50b3RhbFJvdW5kVHJpcFRpbWUsYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlOm8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGUsYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlOm8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUscm91bmRUcmlwVGltZTpvLmNhbmRpZGF0ZVBhaXIuY3VycmVudFJvdW5kVHJpcFRpbWV9KSxvLnRyYW5zcG9ydCYmKG8udHJhbnNwb3J0LmNhbmRpZGF0ZVBhaXJzPUUpLG8udHJhbnNwb3J0JiYhby50cmFuc3BvcnQucm91bmRUcmlwVGltZSl7bGV0IG09MCxjPTA7by5yZW1vdGVJbmJvdW5kUnRwLmZvckVhY2goKHUsYik9Pnt1LnJvdW5kVHJpcFRpbWUmJnUucm91bmRUcmlwVGltZT5tJiYobT11LnJvdW5kVHJpcFRpbWUsYz11LnRvdGFsUm91bmRUcmlwVGltZSl9KSxvLnRyYW5zcG9ydC5yb3VuZFRyaXBUaW1lPW0sby50cmFuc3BvcnQudG90YWxSb3VuZFRyaXBUaW1lPWN9aWYoeC5zaXplPjApdHJ5e3RoaXMub2JzZXJ2ZXIuZW1pdCgiY29uc3VtZXJfc2NvcmUiLHgpfWNhdGNoKG0pe31pZih3LnNpemU+MCl0cnl7dGhpcy5vYnNlcnZlci5lbWl0KCJwcm9kdWNlcl9zY29yZSIsdyl9Y2F0Y2gobSl7fXJldHVybiBvfWdldFByb2R1Y2Vyc1JlcG9ydChlKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgcz1lLm1hcChuPT50aGlzLmdlbmVyYXRlUHJvZHVjZXJTdHJlYW1NYXAobiwhMCkpO3JldHVybiBzLmxlbmd0aD4wP1Byb21pc2UuYWxsKHMpOnZvaWQgMH0pfWdldENvbnN1bWVyc1JlcG9ydChlKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgcz1lLm1hcChuPT50aGlzLmdlbmVyYXRlQ29uc3VtZXJTdHJlYW1NYXAobiwhMCkpO3JldHVybiBzLmxlbmd0aD4wP1Byb21pc2UuYWxsKHMpOnZvaWQgMH0pfWdldFRyYW5zcG9ydFJlcG9ydChlKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7cmV0dXJuIGUuZ2V0U3RhdHMoKX0pfWdldFByb2Nlc3NlZFN0YXRzKGUscyxuKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3QgaT15aWVsZCB0aGlzLmdldFRyYW5zcG9ydFJlcG9ydChlKSxhPXtwcm9kdWNpbmc6bixjb25zdW1pbmc6cyxpZDplLmlkfSxkPWksbz10aGlzLnBhcnNlUlRDUmVwb3J0KGQsWyJ0cmFuc3BvcnQiLCJjYW5kaWRhdGUtcGFpciIsImluYm91bmQtcnRwIiwib3V0Ym91bmQtcnRwIiwicmVtb3RlLWluYm91bmQtcnRwIiwibG9jYWwtY2FuZGlkYXRlIiwicmVtb3RlLWNhbmRpZGF0ZSJdLCExLHZvaWQgMCxhKTtpZighbylyZXR1cm47Y29uc3QgbD17c3RhdHM6by50cmFuc3BvcnQsdHJhbnNwb3J0SWQ6ZS5pZCxjb25zdW1pbmc6cyxwcm9kdWNpbmc6bn0sZj1vLnN0YWxlUHJvZHVjZXJTdHJlYW1NYXA/dm9pZCAwOnRoaXMuZ2V0UHJvZHVjZXJTdGF0c0Zyb21SZXBvcnQobykseT1vLnN0YWxlQ29uc3VtZXJTdHJlYW1NYXA/dm9pZCAwOnRoaXMuZ2V0Q29uc3VtZXJTdGF0c0Zyb21SZXBvcnQobyk7cmV0dXJue3RyYW5zcG9ydFJlcG9ydDpsLHByb2R1Y2VyUmVwb3J0OmYsY29uc3VtZXJSZXBvcnQ6eX19KX1nZXRQcm9kdWNlclN0YXRzRnJvbVJlcG9ydChlKXtjb25zdCBzPVtdO3RyeXtlLnByb2R1Y2VyU3RyZWFtTWFwLmZvckVhY2goKG4saSk9Pnt2YXIgYSxkO3MucHVzaCh7cHJvZHVjZXJJZDppLHZpZGVvU3RhdHM6bi5vdXRib3VuZFZpZGVvUnRwSWQubWFwKG89PmUub3V0Ym91bmRWaWRlb1J0cC5nZXQobykpLGF1ZGlvU3RhdHM6bi5vdXRib3VuZEF1ZGlvUnRwSWQubWFwKG89PmUub3V0Ym91bmRBdWRpb1J0cC5nZXQobykpLGFwcERhdGE6KChkPShhPXRoaXMuY2FsbFN0YXRzSW5zdGFuY2UucHJvZHVjZXJzKT09bnVsbD92b2lkIDA6YS5nZXQoaSkpPT1udWxsP3ZvaWQgMDpkLmFwcERhdGEpfHxudWxsfSl9KX1jYXRjaChuKXt0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5lcnJvcigiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OmdldFByb2R1Y2VyU3RhdHNGcm9tUmVwb3J0Iix7ZXJyb3I6e3JlYXNvbjpuLnJlYXNvbixtZXNzYWdlOm4ubWVzc2FnZX19KX1yZXR1cm4gc31nZXRDb25zdW1lclN0YXRzRnJvbVJlcG9ydChlKXtjb25zdCBzPVtdO3RyeXtlLmNvbnN1bWVyU3RyZWFtTWFwLmZvckVhY2goKG4saSk9Pntjb25zdHtwZWVySWQ6YSxwcm9kdWNlcklkOmQsYXBwRGF0YTpvfT10aGlzLmNvbnN1bWVyUGVlcklkTWFwLmdldChpKTtzLnB1c2goe2NvbnN1bWVySWQ6aSxwZWVySWQ6YSxwcm9kdWNlcklkOmQsYXBwRGF0YTpvLHZpZGVvU3RhdHM6bi5pbmJvdW5kVmlkZW9SdHBJZC5tYXAobD0+ZS5pbmJvdW5kVmlkZW9SdHAuZ2V0KGwpKSxhdWRpb1N0YXRzOm4uaW5ib3VuZEF1ZGlvUnRwSWQubWFwKGw9PmUuaW5ib3VuZEF1ZGlvUnRwLmdldChsKSl9KX0pfWNhdGNoKG4pe2NvbnNvbGUuZXJyb3IoImdldENvbnN1bWVyc1JlcG9ydDogIixuLGUpfXJldHVybiBzfWdldFVzZXJMb2NhdGlvbigpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtyZXR1cm4gbmV3IFByb21pc2UoKGUscyk9Pnt0cnl7bmF2aWdhdG9yLmdlb2xvY2F0aW9uP25hdmlnYXRvci5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24obj0+e2Uobil9KTpzKCl9Y2F0Y2gobil7cyhuKX19KX0pfWdldENvbm5lY3Rpdml0eShlKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dHJ5e2NvbnN0IHM9e2ljZVNlcnZlcnM6ZXx8TXJ9LG49bmV3IFByb21pc2UoKGYseSk9Pnt0cnl7Y29uc3QgRT1uZXcgVG4ocyk7RS5hZGRMaXN0ZW5lcigiZG9uZSIsZiksRS5hZGRMaXN0ZW5lcigiZmFpbGVkIiwoKT0+e2Yoe2Nvbm5lY3Rpdml0eTohMX0pfSksRS5zdGFydCgyZTMpfWNhdGNoKEUpe3koRSl9fSksaT1uZXcgUHJvbWlzZSgoZix5KT0+e3RyeXtjb25zdCBFPW5ldyBfbihzKTtFLmFkZExpc3RlbmVyKCJkb25lIixmKSxFLmFkZExpc3RlbmVyKCJmYWlsZWQiLCgpPT57Zih7Y29ubmVjdGl2aXR5OiExfSl9KSxFLnN0YXJ0KDJlMyl9Y2F0Y2goRSl7eShFKX19KSxhPW5ldyBQcm9taXNlKChmLHkpPT57dHJ5e2NvbnN0IEU9bmV3IFJuKHMpO0UuYWRkTGlzdGVuZXIoImRvbmUiLGYpLEUuYWRkTGlzdGVuZXIoImZhaWxlZCIsKCk9PntmKHtjb25uZWN0aXZpdHk6ITF9KX0pLEUuc3RhcnQoMmUzKX1jYXRjaChFKXt5KEUpfX0pLFtkLG8sbF09eWllbGQgUHJvbWlzZS5hbGwoW24saSxhXSk7cmV0dXJue2hvc3Q6ZD09bnVsbD92b2lkIDA6ZC5jb25uZWN0aXZpdHkscmVsYXk6bz09bnVsbD92b2lkIDA6by5jb25uZWN0aXZpdHkscmVmbGV4aXZlOmw9PW51bGw/dm9pZCAwOmwuY29ubmVjdGl2aXR5fX1jYXRjaChzKXtyZXR1cm57aG9zdDohMSxyZWxheTohMSxyZWZsZXhpdmU6ITF9fX0pfWdldFRocm91Z2hwdXQoZSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3RyeXtjb25zdCBuPXlpZWxkIG5ldyBQcm9taXNlKChpLGEpPT57dHJ5e2NvbnN0IGQ9e2ljZVNlcnZlcnM6ZXx8TXJ9LG89bmV3IEVuKGQpO28uYWRkTGlzdGVuZXIoImRvbmUiLGkpLG8uYWRkTGlzdGVuZXIoImZhaWxlZCIsYSksby5zdGFydCgxZTQpfWNhdGNoKGQpe2EoZCl9fSk7cmV0dXJue3Rocm91Z2hwdXQ6bi50aHJvdWdocHV0LGZyYWN0aW9uYWxMb3NzOjAsUlRUOm4uUlRULGppdHRlcjowLGJhY2tlbmRSVFQ6bi5iYWNrZW5kUlRUfX1jYXRjaChzKXtyZXR1cm59fSl9Z2V0SVBEZXRhaWxzKCl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3ZhciBlLHM7dHJ5e3JldHVybiB0aGlzLmlwRGV0YWlsc3x8KHRoaXMuaXBEZXRhaWxzPXlpZWxkIHdyLmdldElQRGV0YWlscyh7cGVlcklkOihlPXRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDplLnBlZXJJZCxhcGlIb3N0bmFtZXM6KHM9dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOnMuYXBpSG9zdG5hbWVzLGxvZ2dlcjp0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlcn0pKSx0aGlzLmlwRGV0YWlsc31jYXRjaChuKXtyZXR1cm59fSl9Z2V0TmV0d29ya1F1YWxpdHkoZSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0W3Msbl09eWllbGQgUHJvbWlzZS5hbGwoW3RoaXMuZ2V0Q29ubmVjdGl2aXR5KGUpLHRoaXMuZ2V0VGhyb3VnaHB1dChlKV0pO3JldHVybntjb25uZWN0aXZpdHk6cyx0aHJvdWdocHV0Om49PW51bGw/dm9pZCAwOm4udGhyb3VnaHB1dCxmcmFjdGlvbmFsTG9zczpuPT1udWxsP3ZvaWQgMDpuLmZyYWN0aW9uYWxMb3NzLFJUVDpuPT1udWxsP3ZvaWQgMDpuLlJUVCxqaXR0ZXI6bj09bnVsbD92b2lkIDA6bi5qaXR0ZXIsYmFja2VuZFJUVDpuPT1udWxsP3ZvaWQgMDpuLmJhY2tlbmRSVFR9fSl9Z2V0TmV0d29ya0luZm8oZSxzPSExKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIGQsbztpZihzKXtjb25zdCBsPXlpZWxkIHRoaXMuZ2V0SVBEZXRhaWxzKCk7cmV0dXJue2lwRGV0YWlsczpsLGVmZmVjdGl2ZU5ldHdvcmtUeXBlOihkPW5hdmlnYXRvci5jb25uZWN0aW9uKT09bnVsbD92b2lkIDA6ZC5lZmZlY3RpdmVUeXBlLGxvY2F0aW9uOmwhPW51bGwmJmwubG9jP0FyKGw9PW51bGw/dm9pZCAwOmwubG9jKTp2b2lkIDB9fWNvbnN0W24saSxhXT15aWVsZCBQcm9taXNlLmFsbChbdGhpcy5nZXRDb25uZWN0aXZpdHkoZSksdGhpcy5nZXRUaHJvdWdocHV0KGUpLHRoaXMuZ2V0SVBEZXRhaWxzKCldKTtyZXR1cm57aXBEZXRhaWxzOmEsZWZmZWN0aXZlTmV0d29ya1R5cGU6KG89bmF2aWdhdG9yLmNvbm5lY3Rpb24pPT1udWxsP3ZvaWQgMDpvLmVmZmVjdGl2ZVR5cGUsbG9jYXRpb246YSE9bnVsbCYmYS5sb2M/QXIoYT09bnVsbD92b2lkIDA6YS5sb2MpOnZvaWQgMCx0dXJuQ29ubmVjdGl2aXR5Om4/bi5ob3N0fHxuLnJlbGF5fHxuLnJlZmxleGl2ZTohMSxjb25uZWN0aXZpdHk6bix0aHJvdWdocHV0Omk9PW51bGw/dm9pZCAwOmkudGhyb3VnaHB1dCxmcmFjdGlvbmFsTG9zczppPT1udWxsP3ZvaWQgMDppLmZyYWN0aW9uYWxMb3NzLFJUVDppPT1udWxsP3ZvaWQgMDppLlJUVCxqaXR0ZXI6aT09bnVsbD92b2lkIDA6aS5qaXR0ZXIsYmFja2VuZFJUVDppPT1udWxsP3ZvaWQgMDppLmJhY2tlbmRSVFR9fSl9fWNsYXNzIENuIGV4dGVuZHMgT3J7fWNsYXNzIExyIGV4dGVuZHMgT3J7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3AodGhpcywicHJvZHVjZXJNYXAiLG5ldyBNYXApO3AodGhpcywiY29uc3VtZXJNYXAiLG5ldyBNYXApfXJlZ2lzdGVyUHJvZHVjZXIoZSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3RoaXMucHJvZHVjZXJNYXAuc2V0KGUuaWQsZSkseWllbGQgdGhpcy5nZW5lcmF0ZVByb2R1Y2VyU3RyZWFtTWFwKGUpLGUub24oImNsb3NlIix0aGlzLmRlcmVnaXN0ZXJQcm9kdWNlci5iaW5kKHRoaXMsZSkpLGUub24oInBhdXNlIix0aGlzLnBhdXNlUHJvZHVjZXIuYmluZCh0aGlzLGUuaWQpKSxlLm9uKCJyZXN1bWUiLHRoaXMucmVzdW1lUHJvZHVjZXIuYmluZCh0aGlzLGUuaWQpKSxlLmFwcERhdGEuc2NyZWVuU2hhcmU9PT0hMCYmdGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5hZGQoZS5pZCl9KX1yZWdpc3RlckNvbnN1bWVyKGUpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt0aGlzLmNvbnN1bWVyTWFwLnNldChlLmlkLGUpLHlpZWxkIHRoaXMuZ2VuZXJhdGVDb25zdW1lclN0cmVhbU1hcChlKSx0aGlzLmNvbnN1bWVyUGVlcklkTWFwLnNldChlLmlkLHtwcm9kdWNlcklkOmUucHJvZHVjZXJJZCxwZWVySWQ6ZS5hcHBEYXRhLnBlZXJJZCxhcHBEYXRhOmUuYXBwRGF0YX0pLGUub24oImNsb3NlIix0aGlzLmRlcmVnaXN0ZXJDb25zdW1lci5iaW5kKHRoaXMsZSkpLGUub24oInBhdXNlIix0aGlzLnBhdXNlQ29uc3VtZXIuYmluZCh0aGlzLGUuaWQpKSxlLm9uKCJyZXN1bWUiLHRoaXMucmVzdW1lQ29uc3VtZXIuYmluZCh0aGlzLGUuaWQpKSxlLmFwcERhdGEuc2NyZWVuU2hhcmU9PT0hMCYmdGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5hZGQoZS5pZCl9KX1nZW5lcmF0ZUNvbnN1bWVyU3RyZWFtTWFwKGUscz0hMSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IG49eWllbGQgZS5nZXRTdGF0cygpLGk9dGhpcy5wYXJzZVJUQ1JlcG9ydChuLFsiaW5ib3VuZC1ydHAiXSwhMSxlLmlkKSxhPVsuLi5pLmNvbnN1bWVyU3RyZWFtTWFwLnZhbHVlcygpXVswXSxkPXM/dGhpcy5nZXRDb25zdW1lclN0YXRzRnJvbVBhcnNlZENvbnN1bWVyU3RhdHMoaSxhLGUuaWQpOnZvaWQgMDtmb3IoY29uc3QgbyBvZiBuLnZhbHVlcygpKXN3aXRjaChvLnR5cGUpe2Nhc2UiaW5ib3VuZC1ydHAiOnt0aGlzLmluYm91bmRDb25zdW1lck1hcC5zZXQoby5pZCxlLmlkKTticmVha319cmV0dXJuIGR9KX1kZXJlZ2lzdGVyUHJvZHVjZXIoZSl7dGhpcy5wcm9kdWNlck1hcC5kZWxldGUoZS5pZCksdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmZvckVhY2goKHMsbik9PntzPT09ZS5pZCYmdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmRlbGV0ZShuKX0pLHRoaXMucGF1c2VkUHJvZHVjZXJNYXAuZGVsZXRlKGUuaWQpLHRoaXMuc2NyZWVuU2hhcmVQcm9kdWNlcnMuZGVsZXRlKGUuaWQpfWRlcmVnaXN0ZXJDb25zdW1lcihlKXt0aGlzLmNvbnN1bWVyTWFwLmRlbGV0ZShlLmlkKSx0aGlzLmluYm91bmRDb25zdW1lck1hcC5mb3JFYWNoKChzLG4pPT57cz09PWUuaWQmJnRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmRlbGV0ZShuKX0pLHRoaXMuY29uc3VtZXJQZWVySWRNYXAuZGVsZXRlKGUuaWQpLHRoaXMucGF1c2VkQ29uc3VtZXJNYXAuZGVsZXRlKGUuaWQpLHRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuZGVsZXRlKGUuaWQpfWdldEljZUNhbmRpZGF0ZVN0YXRzKGUpe3ZhciBzO3JldHVybntpZDplLmlkLHR5cGU6ZS5jYW5kaWRhdGVUeXBlfHxlLnR5cGUsYWRkcmVzczplLmFkZHJlc3MscG9ydDplLnBvcnQsdXJsOmUudXJsLHByb3RvY29sOihzPWUucmVsYXlQcm90b2NvbCkhPW51bGw/czplLnByb3RvY29sLG5ldHdvcmtUeXBlOmUubmV0d29ya1R5cGUscmVsYXRlZEFkZHJlc3M6ZS5yZWxhdGVkQWRkcmVzcyxyZWxhdGVkUG9ydDplLnJlbGF0ZWRQb3J0fX1wYXJzZVJUQ1JlcG9ydChlLHM9W10sbj0hMSxpPXZvaWQgMCxhPXZvaWQgMCl7dmFyIFUsTCxILFoseWUsdmUsQmUseGUsamUsVWUsJGUsSGUsS2U7Y29uc3QgZD1lLG89bmV3IGtyLGw9cy5sZW5ndGg/bmV3IFNldChzKTp2b2lkIDAsZj1bXSx5PVtdLEU9W10sdz1uZXcgTWFwLHg9bmV3IE1hcDtmb3IoY29uc3QgbSBvZiBkLnZhbHVlcygpKXtpZihsKXtpZihsLnNpemU9PT0wKWJyZWFrO2lmKGwuaGFzKG0udHlwZSkpbiYmbC5kZWxldGUobS50eXBlKTtlbHNlIGNvbnRpbnVlfXN3aXRjaChtLnR5cGUpe2Nhc2UibG9jYWwtY2FuZGlkYXRlIjp7Zi5wdXNoKHRoaXMuZ2V0SWNlQ2FuZGlkYXRlU3RhdHMobSkpO2JyZWFrfWNhc2UicmVtb3RlLWNhbmRpZGF0ZSI6e3kucHVzaCh0aGlzLmdldEljZUNhbmRpZGF0ZVN0YXRzKG0pKTticmVha31jYXNlImNhbmRpZGF0ZS1wYWlyIjp7Y29uc3R7bm9taW5hdGVkOmN9PW0se3NlbGVjdGVkOnV9PW0sYj1tLGo9e25vbWluYXRlZDpjIT1udWxsP2M6dSxjdXJyZW50Um91bmRUcmlwVGltZTpiLmN1cnJlbnRSb3VuZFRyaXBUaW1lLHRvdGFsUm91bmRUcmlwVGltZTpiLnRvdGFsUm91bmRUcmlwVGltZSxieXRlc1JlY2VpdmVkOmIuYnl0ZXNSZWNlaXZlZCxieXRlc1NlbnQ6Yi5ieXRlc1NlbnQsYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlOmIuYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlLGF2YWlsYWJsZUluY29taW5nQml0cmF0ZTpiLmF2YWlsYWJsZUluY29taW5nQml0cmF0ZSxsYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXA6Yi5sYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXAsbGFzdFBhY2tldFNlbnRUaW1lc3RhbXA6Yi5sYXN0UGFja2V0U2VudFRpbWVzdGFtcCxsb2NhbENhbmRpZGF0ZUlkOmIubG9jYWxDYW5kaWRhdGVJZCxyZW1vdGVDYW5kaWRhdGVJZDpiLnJlbW90ZUNhbmRpZGF0ZUlkLGJ5dGVzRGlzY2FyZGVkT25TZW5kOmIuYnl0ZXNEaXNjYXJkZWRPblNlbmQscGFja2V0c1NlbnQ6Yi5wYWNrZXRzU2VudCxwYWNrZXRzUmVjZWl2ZWQ6Yi5wYWNrZXRzUmVjZWl2ZWQscGFja2V0c0Rpc2NhcmRlZE9uU2VuZDpiLnBhY2tldHNEaXNjYXJkZWRPblNlbmR9O0UucHVzaChqKSwobS5ub21pbmF0ZWQ9PT0hMHx8bS5zZWxlY3RlZD09PSEwKSYmKG8uY2FuZGlkYXRlUGFpcj1qKTticmVha31jYXNlInRyYW5zcG9ydCI6e2NvbnN0IGM9bTthJiYoYS5wcm9kdWNpbmcmJih0aGlzLm92ZXJhbGxQcm9kdWNpbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF18fCh0aGlzLm92ZXJhbGxQcm9kdWNpbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF09e3RvdGFsUGFja2V0c1NlbnQ6MH0pKSxhLmNvbnN1bWluZyYmKHRoaXMub3ZlcmFsbENvbnN1bWluZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXXx8KHRoaXMub3ZlcmFsbENvbnN1bWluZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXT17dG90YWxQYWNrZXRzUmVjZWl2ZWQ6MH0pKSk7Y29uc3QgdT17Ynl0ZXNSZWNlaXZlZDpjLmJ5dGVzUmVjZWl2ZWQsYnl0ZXNTZW50OmMuYnl0ZXNTZW50LHBhY2tldHNTZW50OmMucGFja2V0c1NlbnQscGFja2V0c1JlY2VpdmVkOmMucGFja2V0c1JlY2VpdmVkLGR0bHNDaXBoZXI6Yy5kdGxzQ2lwaGVyLGR0bHNTdGF0ZTpjLmR0bHNTdGF0ZSxpY2VSb2xlOmMuaWNlUm9sZX07aWYoby50cmFuc3BvcnQ9dSxhKXtpZihhLnByb2R1Y2luZyl7Y29uc3QgYj10aGlzLm92ZXJhbGxQcm9kdWNpbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF07dGhpcy5wcm9jZXNzUHJvZHVjaW5nVHJhbnNwb3J0U3RhdHMoYS5pZCxiLHUpfWlmKGEuY29uc3VtaW5nKXtjb25zdCBiPXRoaXMub3ZlcmFsbENvbnN1bWluZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXTt0aGlzLnByb2Nlc3NDb25zdW1pbmdUcmFuc3BvcnRTdGF0cyhhLmlkLGIsdSl9fWJyZWFrfWNhc2UicmVtb3RlLWluYm91bmQtcnRwIjp7Y29uc3QgYz1tLHU9e2ppdHRlcjpjLmppdHRlcixmcmFjdGlvbkxvc3Q6Yy5mcmFjdGlvbkxvc3Qscm91bmRUcmlwVGltZTpjLnJvdW5kVHJpcFRpbWUscm91bmRUcmlwVGltZU1lYXN1cmVtZW50czpjLnJvdW5kVHJpcFRpbWVNZWFzdXJlbWVudHMsdG90YWxSb3VuZFRyaXBUaW1lOmMudG90YWxSb3VuZFRyaXBUaW1lLHBhY2tldHNMb3N0OmMucGFja2V0c0xvc3R9O28ucmVtb3RlSW5ib3VuZFJ0cC5zZXQoYy5sb2NhbElkLHUpO2JyZWFrfWNhc2Uib3V0Ym91bmQtcnRwIjp7aWYoIXRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5oYXMobS5pZCkpYnJlYWs7Y29uc3QgYz1tLHU9aXx8dGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmdldChtLmlkKSxiPXRoaXMucGF1c2VkUHJvZHVjZXJNYXAuZ2V0KHUpO2lmKGIpe2lmKGIubGFzdFJlcG9ydENhbGN1bGF0ZWQ9PT0hMClicmVhazt0aGlzLnBhdXNlZFByb2R1Y2VyTWFwLnNldCh1LHtsYXN0UmVwb3J0Q2FsY3VsYXRlZDohMH0pfXRoaXMub3ZlcmFsbFByb2R1Y2Vyc1N0YXRzTWFwW3VdfHwodGhpcy5vdmVyYWxsUHJvZHVjZXJzU3RhdHNNYXBbdV09e3RvdGFsVmlkZW9QYWNrZXRzU2VudDowLHRvdGFsQXVkaW9QYWNrZXRzU2VudDowfSk7Y29uc3Qgaj10aGlzLm92ZXJhbGxQcm9kdWNlcnNTdGF0c01hcFt1XTtpZihbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLm1lZGlhVHlwZSl8fFsidmlkZW8iLCJhdWRpbyJdLmluY2x1ZGVzKGMua2luZCkpe2lmKCF0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuaGFzKG0uaWQpKXtvLnN0YWxlUHJvZHVjZXJTdHJlYW1NYXA9ITA7YnJlYWt9Y29uc3QgSz10aGlzLmNhbGxTdGF0c0luc3RhbmNlLnByb2R1Y2Vycy5nZXQodSk7aWYoKChVPUs9PW51bGw/dm9pZCAwOksudHJhY2spPT1udWxsP3ZvaWQgMDpVLnJlYWR5U3RhdGUpPT09ImVuZGVkIilicmVhaztvLnByb2R1Y2VyU3RyZWFtTWFwLmhhcyh1KXx8by5wcm9kdWNlclN0cmVhbU1hcC5zZXQodSx7b3V0Ym91bmRWaWRlb1J0cElkOltdLG91dGJvdW5kQXVkaW9SdHBJZDpbXX0pO2NvbnN0IHY9e2J5dGVzU2VudDpjLmJ5dGVzU2VudCxwYWNrZXRzU2VudDpjLnBhY2tldHNTZW50LG5hY2tDb3VudDpjLm5hY2tDb3VudCxzc3JjOmMuc3NyYyxtaWQ6Yy5taWQsYWN0aXZlOmMuYWN0aXZlLGNvZGVjSWQ6Yy5jb2RlY0lkLGhlYWRlckJ5dGVzU2VudDpjLmhlYWRlckJ5dGVzU2VudHx8MCx0b3RhbFBhY2tldFNlbmREZWxheTpjLnRvdGFsUGFja2V0U2VuZERlbGF5fHwwfTtpZihjLm1lZGlhVHlwZT09PSJ2aWRlbyJ8fGMua2luZD09PSJ2aWRlbyIpe2NvbnN0IGg9YyxXPVEoe2ZyYW1lSGVpZ2h0OmguZnJhbWVIZWlnaHQsZnJhbWVXaWR0aDpoLmZyYW1lV2lkdGgsZnJhbWVzRW5jb2RlZDpoLmZyYW1lc0VuY29kZWQsZnJhbWVzRHJvcHBlZDpoLmZyYW1lc0Ryb3BwZWQ/aC5mcmFtZXNEcm9wcGVkOmguZHJvcHBlZEZyYW1lcyxmcmFtZXNQZXJTZWNvbmQ6aC5mcmFtZXNQZXJTZWNvbmQ/aC5mcmFtZXNQZXJTZWNvbmQ6aC5mcmFtZXJhdGVNZWFuLGZyYW1lc1NlbnQ6aC5mcmFtZXNTZW50LGtleUZyYW1lc0VuY29kZWQ6aC5rZXlGcmFtZXNFbmNvZGVkLGZpckNvdW50OmguZmlyQ291bnQsZW5jb2RlckltcGxlbWVudGF0aW9uOmguZW5jb2RlckltcGxlbWVudGF0aW9uLGh1Z2VGcmFtZXNTZW50OmguaHVnZUZyYW1lc1NlbnQscGxpQ291bnQ6aC5wbGlDb3VudCxxcFN1bTpoLnFwU3VtLHF1YWxpdHlMaW1pdGF0aW9uUmVhc29uOmgucXVhbGl0eUxpbWl0YXRpb25SZWFzb24scXVhbGl0eUxpbWl0YXRpb25EdXJhdGlvbnM6aC5xdWFsaXR5TGltaXRhdGlvbkR1cmF0aW9ucyxxdWFsaXR5TGltaXRhdGlvblJlc29sdXRpb25DaGFuZ2VzOmgucXVhbGl0eUxpbWl0YXRpb25SZXNvbHV0aW9uQ2hhbmdlcyx0b3RhbEVuY29kZVRpbWU6aC50b3RhbEVuY29kZVRpbWUsdG90YWxQYWNrZXRTZW5kRGVsYXk6aC50b3RhbEVuY29kZVRpbWUscmV0cmFuc21pdHRlZEJ5dGVzU2VudDpoLnJldHJhbnNtaXR0ZWRCeXRlc1NlbnQscmV0cmFuc21pdHRlZFBhY2tldHNTZW50OmgucmV0cmFuc21pdHRlZFBhY2tldHNTZW50LHNjYWxhYmlsaXR5TW9kZTpoLnNjYWxhYmlsaXR5TW9kZSxwb3dlckVmZmljaWVudEVuY29kZXI6aC5wb3dlckVmZmljaWVudEVuY29kZXJ9LHYpO28ub3V0Ym91bmRWaWRlb1J0cC5zZXQobS5pZCxXKSxvLnByb2R1Y2VyU3RyZWFtTWFwLmdldCh1KS5vdXRib3VuZFZpZGVvUnRwSWQucHVzaChtLmlkKSx0aGlzLnByb2Nlc3NPdXRib3VuZFByb2R1Y2VyVmlkZW9TdGF0cyh1LGosVyl9ZWxzZSBpZihjLm1lZGlhVHlwZT09PSJhdWRpbyJ8fGMua2luZD09PSJhdWRpbyIpe2NvbnN0IGg9YyxXPVEoe3JldHJhbnNtaXR0ZWRCeXRlc1NlbnQ6aC5yZXRyYW5zbWl0dGVkQnl0ZXNTZW50LHJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudDpoLnJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudH0sdik7by5vdXRib3VuZEF1ZGlvUnRwLnNldChtLmlkLFcpLG8ucHJvZHVjZXJTdHJlYW1NYXAuZ2V0KHUpLm91dGJvdW5kQXVkaW9SdHBJZC5wdXNoKG0uaWQpLHRoaXMucHJvY2Vzc091dGJvdW5kUHJvZHVjZXJBdWRpb1N0YXRzKHUsaixXKX19ZWxzZSB0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5lcnJvcihgQ2FsbHN0YXRzOiBVbmtub3duIE91dGJvdW5kLXJ0cC4gbWVkaWF0eXBlOiAke2MubWVkaWFUeXBlfSBraW5kOiAke2Mua2luZH1gKTticmVha31jYXNlImluYm91bmQtcnRwIjp7aWYoIXRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmhhcyhtLmlkKSlicmVhaztjb25zdCBjPW0sdT1pfHx0aGlzLmluYm91bmRDb25zdW1lck1hcC5nZXQobS5pZCksYj10aGlzLnBhdXNlZENvbnN1bWVyTWFwLmdldCh1KTtpZihiKXtpZihiLmxhc3RSZXBvcnRDYWxjdWxhdGVkPT09ITApYnJlYWs7dGhpcy5wYXVzZWRDb25zdW1lck1hcC5zZXQodSx7bGFzdFJlcG9ydENhbGN1bGF0ZWQ6ITB9KX1pZihjLnNzcmM9PT0xMjM0KWJyZWFrO3RoaXMub3ZlcmFsbENvbnN1bWVyc1N0YXRzTWFwW3VdfHwodGhpcy5vdmVyYWxsQ29uc3VtZXJzU3RhdHNNYXBbdV09e3RvdGFsVmlkZW9QYWNrZXRzUmVjZWl2ZWQ6MCx0b3RhbEF1ZGlvUGFja2V0c1JlY2VpdmVkOjB9KTtjb25zdCBqPXRoaXMub3ZlcmFsbENvbnN1bWVyc1N0YXRzTWFwW3VdO2lmKFsidmlkZW8iLCJhdWRpbyJdLmluY2x1ZGVzKGMubWVkaWFUeXBlKXx8WyJ2aWRlbyIsImF1ZGlvIl0uaW5jbHVkZXMoYy5raW5kKSl7aWYoIXRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmhhcyhtLmlkKSl7by5zdGFsZUNvbnN1bWVyU3RyZWFtTWFwPSEwO2JyZWFrfW8uY29uc3VtZXJTdHJlYW1NYXAuaGFzKHUpfHxvLmNvbnN1bWVyU3RyZWFtTWFwLnNldCh1LHtpbmJvdW5kVmlkZW9SdHBJZDpbXSxpbmJvdW5kQXVkaW9SdHBJZDpbXX0pO2NvbnN0IEs9e2J5dGVzUmVjZWl2ZWQ6Yy5ieXRlc1JlY2VpdmVkLHBhY2tldHNSZWNlaXZlZDpjLnBhY2tldHNSZWNlaXZlZCxwYWNrZXRzTG9zdDpjLnBhY2tldHNMb3N0Pj0wP2MucGFja2V0c0xvc3Q6MCxqaXR0ZXI6Yy5qaXR0ZXIsbmFja0NvdW50OmMubmFja0NvdW50LGppdHRlckJ1ZmZlckRlbGF5OmMuaml0dGVyQnVmZmVyRGVsYXksaml0dGVyQnVmZmVyRW1pdHRlZENvdW50OmMuaml0dGVyQnVmZmVyRW1pdHRlZENvdW50LGxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcDpjLmxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcCxzc3JjOmMuc3NyYyxtaWQ6Yy5taWQsY29kZWNJZDpjLmNvZGVjSWQsaGVhZGVyQnl0ZXNSZWNlaXZlZDpjLmhlYWRlckJ5dGVzUmVjZWl2ZWR8fDAscGFja2V0c0Rpc2NhcmRlZDpjLnBhY2tldHNEaXNjYXJkZWR8fDAsaml0dGVyQnVmZmVyTWluaW11bURlbGF5OmMuaml0dGVyQnVmZmVyTWluaW11bURlbGF5fHwwLGppdHRlckJ1ZmZlclRhcmdldERlbGF5OmMuaml0dGVyQnVmZmVyVGFyZ2V0RGVsYXl8fDB9O2lmKGMubWVkaWFUeXBlPT09InZpZGVvInx8Yy5raW5kPT09InZpZGVvIil7Y29uc3Qgdj1jLGg9USh7ZnJhbWVIZWlnaHQ6di5mcmFtZUhlaWdodCxmcmFtZVdpZHRoOnYuZnJhbWVXaWR0aCxmcmFtZXNEZWNvZGVkOnYuZnJhbWVzRGVjb2RlZCxmcmFtZXNEcm9wcGVkOnYuZnJhbWVzRHJvcHBlZD92LmZyYW1lc0Ryb3BwZWQ6di5kcm9wcGVkRnJhbWVzLGZyYW1lc1BlclNlY29uZDp2LmZyYW1lc1BlclNlY29uZD92LmZyYW1lc1BlclNlY29uZDp2LmZyYW1lcmF0ZU1lYW4sZnJhbWVzUmVjZWl2ZWQ6di5mcmFtZXNSZWNlaXZlZCxrZXlGcmFtZXNEZWNvZGVkOnYua2V5RnJhbWVzRGVjb2RlZCxmaXJDb3VudDp2LmZpckNvdW50LGRlY29kZXJJbXBsZW1lbnRhdGlvbjp2LmRlY29kZXJJbXBsZW1lbnRhdGlvbixwbGlDb3VudDp2LnBsaUNvdW50LHRvdGFsUHJvY2Vzc2luZ0RlbGF5OnYudG90YWxQcm9jZXNzaW5nRGVsYXkscXBTdW06di5xcFN1bXx8MCx0b3RhbEFzc2VtYmx5VGltZTp2LnRvdGFsQXNzZW1ibHlUaW1lfHwwLHRvdGFsRGVjb2RlVGltZTp2LnRvdGFsRGVjb2RlVGltZXx8MCx0b3RhbEZyZWV6ZXNEdXJhdGlvbjp2LnRvdGFsRnJlZXplc0R1cmF0aW9ufHwwLHRvdGFsSW50ZXJGcmFtZURlbGF5OnYudG90YWxJbnRlckZyYW1lRGVsYXl8fDAsdG90YWxQYXVzZXNEdXJhdGlvbjp2LnRvdGFsUGF1c2VzRHVyYXRpb258fDAsdG90YWxTcXVhcmVkSW50ZXJGcmFtZURlbGF5OnYudG90YWxTcXVhcmVkSW50ZXJGcmFtZURlbGF5fHwwLGZyZWV6ZUNvdW50OnYuZnJlZXplQ291bnR8fDAscGF1c2VDb3VudDp2LnBhdXNlQ291bnR8fDAscG93ZXJFZmZpY2llbnREZWNvZGVyOnYucG93ZXJFZmZpY2llbnREZWNvZGVyfSxLKTtoLnNjb3JlPUNyKHtmcmFtZVdpZHRoOmguZnJhbWVXaWR0aHx8MCxmcmFtZXNEZWNvZGVkOihoLmZyYW1lc0RlY29kZWR8fDApLSgoKEw9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpMLmZyYW1lc0RlY29kZWQpfHwwKSxmcmFtZXNQZXJTZWNvbmQ6aC5mcmFtZXNQZXJTZWNvbmR8fDAscGFja2V0c0xvc3Q6KGgucGFja2V0c0xvc3R8fDApLSgoKEg9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpILnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihoLnBhY2tldHNSZWNlaXZlZHx8MCktKCgoWj10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOloucGFja2V0c1JlY2VpdmVkKXx8MCksaml0dGVyOmguaml0dGVyfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5oYXModSl9KSx4LnNldCh1LHtzY29yZTorKGguc2NvcmUqMTApLnRvRml4ZWQoKSxmcmFtZVdpZHRoOmguZnJhbWVXaWR0aHx8MCxmcmFtZUhlaWdodDpoLmZyYW1lSGVpZ2h0fHwwLGZyYW1lc1BlclNlY29uZDpoLmZyYW1lc1BlclNlY29uZHx8MCxwYWNrZXRzTG9zdFBlcmNlbnRhZ2U6dXQoe3BhY2tldHNMb3N0OihoLnBhY2tldHNMb3N0fHwwKS0oKCh5ZT10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOnllLnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihoLnBhY2tldHNSZWNlaXZlZHx8MCktKCgodmU9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDp2ZS5wYWNrZXRzUmVjZWl2ZWQpfHwwKX0pLGppdHRlcjpoLmppdHRlcnx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuaGFzKHUpLGJpdHJhdGU6KChoLmJ5dGVzUmVjZWl2ZWR8fDApLSgoKEJlPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6QmUuYnl0ZXNSZWNlaXZlZCl8fDApKSo4Lzd9KSx0aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLnNldCh1LGgpLG8uaW5ib3VuZFZpZGVvUnRwLnNldChtLmlkLGgpLG8uY29uc3VtZXJTdHJlYW1NYXAuZ2V0KHUpLmluYm91bmRWaWRlb1J0cElkLnB1c2gobS5pZCksdGhpcy5wcm9jZXNzSW5ib3VuZENvbnN1bWVyVmlkZW9TdGF0cyh1LGosaCl9ZWxzZSBpZihjLm1lZGlhVHlwZT09PSJhdWRpbyJ8fGMua2luZD09PSJhdWRpbyIpe2NvbnN0IHY9YyxoPVEoe2F1ZGlvTGV2ZWw6di5hdWRpb0xldmVsLGNvbmNlYWxlZFNhbXBsZXM6di5jb25jZWFsZWRTYW1wbGVzLGNvbmNlYWxtZW50RXZlbnRzOnYuY29uY2VhbG1lbnRFdmVudHMsdG90YWxBdWRpb0VuZXJneTp2LnRvdGFsQXVkaW9FbmVyZ3ksdG90YWxTYW1wbGVzRHVyYXRpb246di50b3RhbFNhbXBsZXNEdXJhdGlvbix0b3RhbFNhbXBsZXNSZWNlaXZlZDp2LnRvdGFsU2FtcGxlc1JlY2VpdmVkLGZlY1BhY2tldHNEaXNjYXJkZWQ6di5mZWNQYWNrZXRzRGlzY2FyZGVkfHwwLGZlY1BhY2tldHNSZWNlaXZlZDp2LmZlY1BhY2tldHNSZWNlaXZlZHx8MCxpbnNlcnRlZFNhbXBsZXNGb3JEZWNlbGVyYXRpb246di5pbnNlcnRlZFNhbXBsZXNGb3JEZWNlbGVyYXRpb258fDAscmVtb3ZlZFNhbXBsZXNGb3JBY2NlbGVyYXRpb246di5yZW1vdmVkU2FtcGxlc0ZvckFjY2VsZXJhdGlvbnx8MCxzaWxlbnRDb25jZWFsZWRTYW1wbGVzOnYuc2lsZW50Q29uY2VhbGVkU2FtcGxlc3x8MCxwbGF5b3V0SWQ6di5wbGF5b3V0SWR9LEspO2guc2NvcmU9UHIoe2NvbmNlYWxtZW50RXZlbnRzOihoLmNvbmNlYWxtZW50RXZlbnRzfHwwKS0oKCh4ZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOnhlLmNvbmNlYWxtZW50RXZlbnRzKXx8MCkscGFja2V0c0xvc3Q6KGgucGFja2V0c0xvc3R8fDApLSgoKGplPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6amUucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KGgucGFja2V0c1JlY2VpdmVkfHwwKS0oKChVZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOlVlLnBhY2tldHNSZWNlaXZlZCl8fDApLGppdHRlcjpoLmppdHRlcnx8MH0pLHguc2V0KHUse3Njb3JlOisoaC5zY29yZSoxMCkudG9GaXhlZCgpLHBhY2tldHNMb3N0UGVyY2VudGFnZTp1dCh7cGFja2V0c0xvc3Q6KGgucGFja2V0c0xvc3R8fDApLSgoKCRlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6JGUucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KGgucGFja2V0c1JlY2VpdmVkfHwwKS0oKChIZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOkhlLnBhY2tldHNSZWNlaXZlZCl8fDApfSksaml0dGVyOmguaml0dGVyfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5oYXModSksYml0cmF0ZTooKGguYnl0ZXNSZWNlaXZlZHx8MCktKCgoS2U9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpLZS5ieXRlc1JlY2VpdmVkKXx8MCkpKjgvN30pLHRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuc2V0KHUsaCksby5pbmJvdW5kQXVkaW9SdHAuc2V0KG0uaWQsaCksby5jb25zdW1lclN0cmVhbU1hcC5nZXQodSkuaW5ib3VuZEF1ZGlvUnRwSWQucHVzaChtLmlkKSx0aGlzLnByb2Nlc3NJbmJvdW5kQ29uc3VtZXJBdWRpb1N0YXRzKHUsaixoKX19ZWxzZSB0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5lcnJvcihgQ2FsbHN0YXRzOiBVbmtub3duIEluYm91bmQtcnRwLiBtZWRpYXR5cGU6ICR7Yy5tZWRpYVR5cGV9IGtpbmQ6ICR7Yy5raW5kfWApO2JyZWFrfX19aWYoby5wcm9kdWNlclN0cmVhbU1hcC5mb3JFYWNoKChtLGMpPT57dmFyIHUsYixqLEssdixoLFcsemUsV2UsR2UscWUsWWUsUWUsSmUsWGUsWmUsZXQsdHQscnQsc3QsbnQsaXQsYXQ7aWYobS5vdXRib3VuZFZpZGVvUnRwSWQubGVuZ3RoPjApe2NvbnN0IFY9W107bS5vdXRib3VuZFZpZGVvUnRwSWQuZm9yRWFjaChycj0+e1YucHVzaChvLm91dGJvdW5kVmlkZW9SdHAuZ2V0KHJyKSl9KTtjb25zdCBNPXRoaXMuZ2V0V29ya2luZ1NpbXVsY2FzdFZpZGVvU3RhdHMoVik7TS5zY29yZT1fcih7ZnJhbWVXaWR0aDpNLmZyYW1lV2lkdGh8fDAsZnJhbWVzUGVyU2Vjb25kOk0uZnJhbWVzUGVyU2Vjb25kfHwwLGppdHRlcjooKHU9TS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6dS5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYykscGFja2V0c1NlbnQ6KE0ucGFja2V0c1NlbnR8fDApLSgoKGI9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpiLnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoaj1NLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpqLnBhY2tldHNMb3N0KXx8MCktKCgodj0oSz10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOksucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnYucGFja2V0c0xvc3QpfHwwKSxmcmFtZXNFbmNvZGVkOihNLmZyYW1lc0VuY29kZWR8fDApLSgoKGg9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpoLmZyYW1lc0VuY29kZWQpfHwwKX0pLHcuc2V0KGMse3Njb3JlOisoTS5zY29yZSoxMCkudG9GaXhlZCgpLGZyYW1lV2lkdGg6TS5mcmFtZVdpZHRofHwwLGZyYW1lSGVpZ2h0Ok0uZnJhbWVIZWlnaHR8fDAsZnJhbWVzUGVyU2Vjb25kOk0uZnJhbWVzUGVyU2Vjb25kfHwwLGppdHRlcjooKFc9TS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6Vy5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYykscGFja2V0c0xvc3RQZXJjZW50YWdlOmx0KHtwYWNrZXRzU2VudDooTS5wYWNrZXRzU2VudHx8MCktKCgoemU9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDp6ZS5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKFdlPU0ucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOldlLnBhY2tldHNMb3N0KXx8MCktKCgocWU9KEdlPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6R2UucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnFlLnBhY2tldHNMb3N0KXx8MCl9KSxiaXRyYXRlOigoTS5ieXRlc1NlbnR8fDApLSgoKFllPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6WWUuYnl0ZXNTZW50KXx8MCkpKjgvNyxjcHVMaW1pdGF0aW9uczpNLnF1YWxpdHlMaW1pdGF0aW9uUmVhc29uPT09ImNwdSIsYmFuZHdpZHRoTGltaXRhdGlvbnM6TS5xdWFsaXR5TGltaXRhdGlvblJlYXNvbj09PSJiYW5kd2lkdGgifSksdGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5zZXQoYyxNKX1lbHNlIGlmKG0ub3V0Ym91bmRBdWRpb1J0cElkLmxlbmd0aD4wKXtjb25zdCBWPW8ub3V0Ym91bmRBdWRpb1J0cC5nZXQobS5vdXRib3VuZEF1ZGlvUnRwSWRbMF0pO1Yuc2NvcmU9VHIoe3BhY2tldHNTZW50OihWLnBhY2tldHNTZW50fHwwKS0oKChRZT10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOlFlLnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoSmU9Vi5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6SmUucGFja2V0c0xvc3QpfHwwKS0oKChaZT0oWGU9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpYZS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6WmUucGFja2V0c0xvc3QpfHwwKSxqaXR0ZXI6KChldD1WLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpldC5qaXR0ZXIpfHwwfSksdy5zZXQoYyx7c2NvcmU6KyhWLnNjb3JlKjEwKS50b0ZpeGVkKCksYml0cmF0ZTooKFYuYnl0ZXNTZW50fHwwKS0oKCh0dD10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnR0LmJ5dGVzU2VudCl8fDApKSo4LzcscGFja2V0c0xvc3RQZXJjZW50YWdlOmx0KHtwYWNrZXRzU2VudDooVi5wYWNrZXRzU2VudHx8MCktKCgocnQ9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpydC5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKHN0PVYucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnN0LnBhY2tldHNMb3N0KXx8MCktKCgoaXQ9KG50PXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6bnQucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOml0LnBhY2tldHNMb3N0KXx8MCl9KSxqaXR0ZXI6KChhdD1WLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDphdC5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYyl9KSx0aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLnNldChjLFYpfX0pLEUuZm9yRWFjaChtPT57Y29uc3QgYz1mLmZpbmQoYj0+Yi5pZD09PW0ubG9jYWxDYW5kaWRhdGVJZD8obS5sb2NhbENhbmRpZGF0ZUlkPWIuaWQsYik6bnVsbCksdT15LmZpbmQoYj0+Yi5pZD09PW0ucmVtb3RlQ2FuZGlkYXRlSWQ/KG0ucmVtb3RlQ2FuZGlkYXRlSWQ9Yi5pZCxiKTpudWxsKTtjJiYobS5sb2NhbENhbmRpZGF0ZVR5cGU9Yy50eXBlLG0ubG9jYWxDYW5kaWRhdGVBZGRyZXNzPWFlKGMuYWRkcmVzcyksbS5sb2NhbENhbmRpZGF0ZVBvcnQ9Yy5wb3J0LG0ubG9jYWxDYW5kaWRhdGVQcm90b2NvbD1jLnByb3RvY29sLG0ubG9jYWxDYW5kaWRhdGVVcmw9Yy51cmwsbS5sb2NhbENhbmRpZGF0ZU5ldHdvcmtUeXBlPWMubmV0d29ya1R5cGUsbS5sb2NhbENhbmRpZGF0ZVJlbGF0ZWRBZGRyZXNzPWFlKGMucmVsYXRlZEFkZHJlc3MpLG0ubG9jYWxDYW5kaWRhdGVSZWxhdGVkUG9ydD1jLnJlbGF0ZWRQb3J0KSx1JiYobS5yZW1vdGVDYW5kaWRhdGVUeXBlPXUudHlwZSxtLnJlbW90ZUNhbmRpZGF0ZUFkZHJlc3M9YWUodS5hZGRyZXNzKSxtLnJlbW90ZUNhbmRpZGF0ZVBvcnQ9dS5wb3J0LG0ucmVtb3RlQ2FuZGlkYXRlUHJvdG9jb2w9dS5wcm90b2NvbCxtLnJlbW90ZUNhbmRpZGF0ZVVybD11LnVybCl9KSxvLmNhbmRpZGF0ZVBhaXImJihvLnRyYW5zcG9ydD8oby50cmFuc3BvcnQuYnl0ZXNSZWNlaXZlZD1vLmNhbmRpZGF0ZVBhaXIuYnl0ZXNSZWNlaXZlZCxvLnRyYW5zcG9ydC5ieXRlc1NlbnQ9by5jYW5kaWRhdGVQYWlyLmJ5dGVzU2VudCxvLnRyYW5zcG9ydC50b3RhbFJvdW5kVHJpcFRpbWU9by5jYW5kaWRhdGVQYWlyLnRvdGFsUm91bmRUcmlwVGltZSxvLnRyYW5zcG9ydC5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGU9by5jYW5kaWRhdGVQYWlyLmF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZSxvLnRyYW5zcG9ydC5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGU9by5jYW5kaWRhdGVQYWlyLmF2YWlsYWJsZUluY29taW5nQml0cmF0ZSxvLnRyYW5zcG9ydC5yb3VuZFRyaXBUaW1lPW8uY2FuZGlkYXRlUGFpci5jdXJyZW50Um91bmRUcmlwVGltZSk6by50cmFuc3BvcnQ9e2J5dGVzUmVjZWl2ZWQ6by5jYW5kaWRhdGVQYWlyLmJ5dGVzUmVjZWl2ZWQsYnl0ZXNTZW50Om8uY2FuZGlkYXRlUGFpci5ieXRlc1NlbnQsdG90YWxSb3VuZFRyaXBUaW1lOm8uY2FuZGlkYXRlUGFpci50b3RhbFJvdW5kVHJpcFRpbWUsYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlOm8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGUsYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlOm8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUscm91bmRUcmlwVGltZTpvLmNhbmRpZGF0ZVBhaXIuY3VycmVudFJvdW5kVHJpcFRpbWV9KSxvLnRyYW5zcG9ydCYmKG8udHJhbnNwb3J0LmNhbmRpZGF0ZVBhaXJzPUUpLG8udHJhbnNwb3J0JiYhby50cmFuc3BvcnQucm91bmRUcmlwVGltZSl7bGV0IG09MCxjPTA7by5yZW1vdGVJbmJvdW5kUnRwLmZvckVhY2goKHUsYik9Pnt1LnJvdW5kVHJpcFRpbWUmJnUucm91bmRUcmlwVGltZT5tJiYobT11LnJvdW5kVHJpcFRpbWUsYz11LnRvdGFsUm91bmRUcmlwVGltZSl9KSxvLnRyYW5zcG9ydC5yb3VuZFRyaXBUaW1lPW0sby50cmFuc3BvcnQudG90YWxSb3VuZFRyaXBUaW1lPWN9aWYoeC5zaXplPjApdHJ5e3RoaXMub2JzZXJ2ZXIuZW1pdCgiY29uc3VtZXJfc2NvcmUiLHgpfWNhdGNoKG0pe31pZih3LnNpemU+MCl0cnl7dGhpcy5vYnNlcnZlci5lbWl0KCJwcm9kdWNlcl9zY29yZSIsdyl9Y2F0Y2gobSl7fXJldHVybiBvfWdldFByb2R1Y2VyU3RhdHNGcm9tUmVwb3J0KGUpe2NvbnN0IHM9W107dHJ5e2UucHJvZHVjZXJTdHJlYW1NYXAuZm9yRWFjaCgobixpKT0+e2NvbnN0IGE9dGhpcy5wcm9kdWNlck1hcC5nZXQoaSksZD1hLnRyYWNrLmdldFNldHRpbmdzKCksbz1uLm91dGJvdW5kVmlkZW9SdHBJZC5tYXAoZj0+e2NvbnN0IHk9ZS5vdXRib3VuZFZpZGVvUnRwLmdldChmKTtyZXR1cm4geS5mcmFtZUhlaWdodHx8KHkuZnJhbWVIZWlnaHQ9ZC5oZWlnaHQseS5mcmFtZVdpZHRoPWQud2lkdGgseS5mcmFtZXNQZXJTZWNvbmQ9ZC5mcmFtZVJhdGUpLHl9KSxsPXtwcm9kdWNlcklkOmksYXBwRGF0YTphLmFwcERhdGEsdmlkZW9TdGF0czpvLGF1ZGlvU3RhdHM6bi5vdXRib3VuZEF1ZGlvUnRwSWQubWFwKGY9PmUub3V0Ym91bmRBdWRpb1J0cC5nZXQoZikpfTtzLnB1c2gobCl9KX1jYXRjaChuKXtjb25zb2xlLmVycm9yKCJnZXRQcm9kdWNlcnNSZXBvcnQ6ICIsbixlKX1yZXR1cm4gc31nZXRDb25zdW1lclN0YXRzRnJvbVBhcnNlZENvbnN1bWVyU3RhdHMoZSxzLG4pe2xldCBpO3RyeXtjb25zdHtwZWVySWQ6YSxwcm9kdWNlcklkOmQsYXBwRGF0YTpvfT10aGlzLmNvbnN1bWVyUGVlcklkTWFwLmdldChuKSxsPXM9PW51bGw/dm9pZCAwOnMuaW5ib3VuZFZpZGVvUnRwSWQubWFwKGY9Pntjb25zdCBFPXRoaXMuY29uc3VtZXJNYXAuZ2V0KG4pLnRyYWNrLmdldFNldHRpbmdzKCksdz1lLmluYm91bmRWaWRlb1J0cC5nZXQoZik7cmV0dXJuIHcuZnJhbWVIZWlnaHR8fCh3LmZyYW1lSGVpZ2h0PUUuaGVpZ2h0LHcuZnJhbWVXaWR0aD1FLndpZHRoLHcuZnJhbWVzUGVyU2Vjb25kPUUuZnJhbWVSYXRlKSx3fSk7aT17Y29uc3VtZXJJZDpuLHBlZXJJZDphLHByb2R1Y2VySWQ6ZCxhcHBEYXRhOm8sdmlkZW9TdGF0czpsLGF1ZGlvU3RhdHM6cz09bnVsbD92b2lkIDA6cy5pbmJvdW5kQXVkaW9SdHBJZC5tYXAoZj0+ZS5pbmJvdW5kQXVkaW9SdHAuZ2V0KGYpKX19Y2F0Y2goYSl7Y29uc29sZS5lcnJvcigiZ2V0Q29uc3VtZXJTdGF0c0Zyb21QYXJzZWRDb25zdW1lclN0YXRzOiAiLGEsZSl9cmV0dXJuIGl9Z2V0Q29uc3VtZXJTdGF0c0Zyb21SZXBvcnQoZSl7Y29uc3Qgcz1bXTt0cnl7ZS5jb25zdW1lclN0cmVhbU1hcC5mb3JFYWNoKChuLGkpPT57cy5wdXNoKHRoaXMuZ2V0Q29uc3VtZXJTdGF0c0Zyb21QYXJzZWRDb25zdW1lclN0YXRzKGUsbixpKSl9KX1jYXRjaChuKXtjb25zb2xlLmVycm9yKCJnZXRDb25zdW1lclN0YXRzRnJvbVJlcG9ydDogIixuLGUpfXJldHVybiBzfX1jbGFzcyBJbiBleHRlbmRzIExye31mdW5jdGlvbiBtdCh0LHIsZSxzKXtpZih0IT1udWxsJiZ0LmxvZ2dlciYmdC5sb2dnZXIuZXJyb3IoIkNhbGxzdGF0czo6aGFuZGxlRXJyb3IiLHtlcnJvcjpzfSksdHlwZW9mIGU9PSJmdW5jdGlvbiImJnMgaW5zdGFuY2VvZiByKWUuY2FsbChudWxsLHMsdCk7ZWxzZSB0aHJvdyBzfWZ1bmN0aW9uIERyKHQscixlKXtjb25zdCBzPXQudmFsdWU7cmV0dXJuIHQudmFsdWU9ZnVuY3Rpb24oLi4ubil7dHJ5e2NvbnN0IGk9cy5hcHBseSh0aGlzLG4pO3JldHVybiBpJiZpIGluc3RhbmNlb2YgUHJvbWlzZT9pLmNhdGNoKGE9PnttdCh0aGlzLHIsZSxhKX0pOml9Y2F0Y2goaSl7bXQodGhpcyxyLGUsaSl9cmV0dXJuIG51bGx9LHR9Y29uc3QgQz0odCxyKT0+KGUscyxuKT0+e2NvbnN0IGk9bi52YWx1ZTtyZXR1cm4gbi52YWx1ZT1mdW5jdGlvbiguLi5hKXt0cnl7Y29uc3QgZD1pLmFwcGx5KHRoaXMsYSk7cmV0dXJuIGQmJmQgaW5zdGFuY2VvZiBQcm9taXNlP2QuY2F0Y2gobz0+e210KHRoaXMsdCxyLG8pfSk6ZH1jYXRjaChkKXttdCh0aGlzLHQscixkKX1yZXR1cm4gbnVsbH0sbn0sd249KHQscik9PihlLHMsbik9PntpZihuKXJldHVybiBEcihuLHQscik7Zm9yKGNvbnN0IGkgb2YgUmVmbGVjdC5vd25LZXlzKGUucHJvdG90eXBlKS5maWx0ZXIoYT0+YSE9PSJjb25zdHJ1Y3RvciIpKXtjb25zdCBhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZS5wcm90b3R5cGUsaSk7YS52YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsaSxEcihhLHQscikpfX07dmFyIFI9ZnVuY3Rpb24odCxyLGUscyl7dmFyIG49YXJndW1lbnRzLmxlbmd0aCxpPW48Mz9yOnM9PT1udWxsP3M9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyLGUpOnMsYTtpZih0eXBlb2YgUmVmbGVjdD09Im9iamVjdCImJnR5cGVvZiBSZWZsZWN0LmRlY29yYXRlPT0iZnVuY3Rpb24iKWk9UmVmbGVjdC5kZWNvcmF0ZSh0LHIsZSxzKTtlbHNlIGZvcih2YXIgZD10Lmxlbmd0aC0xO2Q+PTA7ZC0tKShhPXRbZF0pJiYoaT0objwzP2EoaSk6bj4zP2EocixlLGkpOmEocixlKSl8fGkpO3JldHVybiBuPjMmJmkmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLGUsaSksaX07Y29uc3QgUD1jb25zb2xlO2xldCBUPWNsYXNzIGV4dGVuZHMgcXtjb25zdHJ1Y3RvcihlPSJodHRwczovL2FwaS50ZXN0aW5ndjMuZHl0ZS5pbiIscz0iQmxpbmsiLG49ZnIuUFJPRCxpLGEsZCxvLGwpe3N1cGVyKCk7cCh0aGlzLCJvYnNlcnZlciIpO3AodGhpcywiZXZlbnRIYW5kbGVyIik7cCh0aGlzLCJtZWFzdXJlbWVudHMiKTtwKHRoaXMsInByb2R1Y2luZ1RyYW5zcG9ydCIpO3AodGhpcywiY29uc3VtaW5nVHJhbnNwb3J0Iik7cCh0aGlzLCJwcm9kdWNlcnMiLG5ldyBNYXApO3AodGhpcywiY29uc3VtZXJzIixuZXcgTWFwKTtwKHRoaXMsImljZVNlcnZlcnMiKTtwKHRoaXMsImNvbm5lY3Rpb25JbmZvUHJvbWlzZSIpO3AodGhpcywicGluZ1N0YXRzVGltZW91dCIpO3AodGhpcywibG9nZ2VyIik7cCh0aGlzLCJlbnYiKTtwKHRoaXMsImFwaUhvc3RuYW1lcyIpO3AodGhpcywicGVlcklkIik7cCh0aGlzLCJjb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwIixuZXcgTWFwKTtwKHRoaXMsImN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMiLHt9KTtpZighbCl0aHJvdyBFcnJvcigiYXV0aFRva2VuIGlzIG1pc3NpbmcgYnV0IHJlcXVpcmVkIHRvIGluaXRpYWxpemUgQ2FsbFN0YXRzISIpO3N3aXRjaCh0aGlzLmVudj1uLHRoaXMuYXBpSG9zdG5hbWVzPW8sdGhpcy5sb2dnZXI9YSx0aGlzLnBlZXJJZD1kLHRoaXMuZXZlbnRIYW5kbGVyPW5ldyBwbih7bG9nZ2VyOmEscGVlcklkOmQsYXBpSG9zdG5hbWVzOm8sYXV0aFRva2VuOmx9KSx0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjplbmdpbmVOYW1lOiAiLHtlbmdpbmVOYW1lOnN9KSxzKXtjYXNlIkJsaW5rIjp0aGlzLm1lYXN1cmVtZW50cz1uZXcgQ247YnJlYWs7Y2FzZSJHZWNrbyI6dGhpcy5tZWFzdXJlbWVudHM9bmV3IExyO2JyZWFrO2Nhc2UiV2ViS2l0Ijp0aGlzLm1lYXN1cmVtZW50cz1uZXcgSW47YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihgVW5rbm93biBlbmdpbmVOYW1lISAke3N9YCl9dGhpcy5tZWFzdXJlbWVudHMuY2FsbFN0YXRzSW5zdGFuY2U9dGhpcyx0aGlzLnJlZ2lzdGVyUHJvZHVjZXI9dGhpcy5yZWdpc3RlclByb2R1Y2VyLmJpbmQodGhpcyksdGhpcy5yZWdpc3RlckNvbnN1bWVyPXRoaXMucmVnaXN0ZXJDb25zdW1lci5iaW5kKHRoaXMpLHRoaXMub2JzZXJ2ZXI9bmV3IHEsdGhpcy5tZWFzdXJlbWVudHMub2JzZXJ2ZXIub24oImNvbnN1bWVyX3Njb3JlIixmPT57YS5kZWJ1ZyhgY2FsbFN0YXRzOjpjb25zdW1lcl9zY29yZSAke1suLi5mLmVudHJpZXMoKV19YCksdGhpcy5ldmVudEhhbmRsZXIuZW1pdCgiY29uc3VtZXJfc2NvcmUiLGYpfSksdGhpcy5tZWFzdXJlbWVudHMub2JzZXJ2ZXIub24oInByb2R1Y2VyX3Njb3JlIixmPT57YS5kZWJ1ZyhgY2FsbFN0YXRzOjpwcm9kdWNlcl9zY29yZSAke1suLi5mLmVudHJpZXMoKV19YCksdGhpcy5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfc2NvcmUiLGYpfSl9cmVnaXN0ZXJJY2VTZXJ2ZXJzKGUpe3RoaXMuaWNlU2VydmVycz1lfXJlZ2lzdGVyQ29uc3VtZXIoZSl7dmFyIHM7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLmhhcyhlLmlkKXx8dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLmlkLHt9KSx0aGlzLmNvbnN1bWVycy5zZXQoZS5pZCxlKSx0aGlzLm1lYXN1cmVtZW50cy5yZWdpc3RlckNvbnN1bWVyKGUpLHRoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnJlZ2lzdGVyQ29uc3VtZXIiLHtjb25zdW1lcklkOmUuaWQsY29uc3VtZXJraW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChzPWUuYXBwRGF0YSkhPW51bGwmJnMuc2NyZWVuU2hhcmUpfSksZS5vbigiY2xvc2UiLHRoaXMuZGVSZWdpc3RlckNvbnN1bWVyLmJpbmQodGhpcyxlKSl9cmVnaXN0ZXJQcm9kdWNlcihlKXt2YXIgczt0aGlzLnByb2R1Y2Vycy5zZXQoZS5pZCxlKSx0aGlzLm1lYXN1cmVtZW50cy5yZWdpc3RlclByb2R1Y2VyKGUpLHRoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnJlZ2lzdGVyUHJvZHVjZXIiLHtwcm9kdWNlcklkOmUuaWQscHJvZHVjZXJLaW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChzPWUuYXBwRGF0YSkhPW51bGwmJnMuc2NyZWVuU2hhcmUpfSksZS5vbigiY2xvc2UiLHRoaXMuZGVSZWdpc3RlclByb2R1Y2VyLmJpbmQodGhpcyxlKSl9c2VuZENvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZUV2ZW50KGUscyl7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLmhhcyhlKXx8dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLHt9KTtjb25zdCBuPXRoaXMuY29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlc01hcC5nZXQoZSk7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLE9iamVjdC5hc3NpZ24obixzKSl9cmVnaXN0ZXJQcm9kdWNpbmdUcmFuc3BvcnQoZSl7dmFyIG47dGhpcy5wcm9kdWNpbmdUcmFuc3BvcnQ9ZSxlLm9uKCJjbG9zZSIsdGhpcy5kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0LmJpbmQodGhpcyxlKSksZS5vbigiZGlzY29ubmVjdCIsdGhpcy5kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0LmJpbmQodGhpcyxlKSksQXJyYXkuZnJvbSgoKG49ZS5fcHJvZHVjZXJzKT09bnVsbD92b2lkIDA6bi52YWx1ZXMoKSl8fFtdKS5mb3JFYWNoKGk9Pnt0aGlzLnJlZ2lzdGVyUHJvZHVjZXIoaSl9KSxlLm9uKCJuZXdwcm9kdWNlciIsdGhpcy5yZWdpc3RlclByb2R1Y2VyKX1yZWdpc3RlckNvbnN1bWluZ1RyYW5zcG9ydChlKXt2YXIgbjt0aGlzLmNvbnN1bWluZ1RyYW5zcG9ydD1lLGUub24oImNsb3NlIix0aGlzLmRpc2Nvbm5lY3RDb25zdW1pbmdUcmFuc3BvcnQuYmluZCh0aGlzLGUpKSxlLm9uKCJkaXNjb25uZWN0Iix0aGlzLmRpc2Nvbm5lY3RDb25zdW1pbmdUcmFuc3BvcnQuYmluZCh0aGlzLGUpKSxBcnJheS5mcm9tKCgobj1lLl9jb25zdW1lcnMpPT1udWxsP3ZvaWQgMDpuLnZhbHVlcygpKXx8W10pLmZvckVhY2goaT0+e3RoaXMucmVnaXN0ZXJDb25zdW1lcihpKX0pLGUub24oIm5ld2NvbnN1bWVyIix0aGlzLnJlZ2lzdGVyQ29uc3VtZXIpfWRlUmVnaXN0ZXJDb25zdW1lcihlKXt0aGlzLmNvbnN1bWVycy5kZWxldGUoZS5pZCl9ZGVSZWdpc3RlclByb2R1Y2VyKGUpe3ZhciBzO3RoaXMucHJvZHVjZXJzLmRlbGV0ZShlLmlkKSx0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpkZVJlZ2lzdGVyUHJvZHVjZXIiLHtwcm9kdWNlcklkOmUuaWQscHJvZHVjZXJLaW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChzPWUuYXBwRGF0YSkhPW51bGwmJnMuc2NyZWVuU2hhcmUpfSl9ZGlzY29ubmVjdENvbnN1bWluZ1RyYW5zcG9ydCgpe3RoaXMuY29uc3VtaW5nVHJhbnNwb3J0PXZvaWQgMH1kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0KCl7dGhpcy5wcm9kdWNpbmdUcmFuc3BvcnQ9dm9pZCAwfWNhbGxFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoZSl9c2VuZFByZUNhbGxUZXN0QmVnaW5FdmVudChlPSExLHMpe3RoaXMuY29ubmVjdGlvbkluZm9Qcm9taXNlPXRoaXMubWVhc3VyZW1lbnRzLmdldE5ldHdvcmtJbmZvKHRoaXMuaWNlU2VydmVycyxlKSx0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuUFJFQ0FMTF9URVNUX0JFR0lOLHRpbWVzdGFtcDpzfSksdGhpcy5jb25uZWN0aW9uSW5mb1Byb21pc2UmJnRoaXMuY29ubmVjdGlvbkluZm9Qcm9taXNlLnRoZW4obj0+e3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5QUkVDQUxMX1RFU1RfQ09NUExFVEUsbWV0YURhdGE6e2Nvbm5lY3Rpb25JbmZvOm59LHRpbWVzdGFtcDpzfSl9KX1zZW5kU2NyZWVuU2hhcmVUb2dnbGVFdmVudChlLHM9bnVsbCxuKXt0aGlzLmN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMuc2NyZWVuPWUsdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDplP1MuU0NSRUVOU0hBUkVfU1RBUlRFRDpTLlNDUkVFTlNIQVJFX1NUT1BQRUQsbWV0YURhdGE6e3NzcmM6c30sdGltZXN0YW1wOm59KX1zZW5kU2NyZWVuU2hhcmVSZXF1ZXN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuU0NSRUVOU0hBUkVfU1RBUlRfUkVRVUVTVEVELHRpbWVzdGFtcDplfSl9c2VuZEFjdGl2ZVNwZWFrZXJFdmVudChlLHMpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5ET01JTkFOVF9TUEVBS0VSLG1ldGFEYXRhOntwZWVySWQ6ZX0sdGltZXN0YW1wOnN9KX1kZXZpY2VzKGUscyxuKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OmU9PT1KLkFVRElPJiZTLkFVRElPX0RFVklDRVNfVVBEQVRFU3x8ZT09PUouVklERU8mJlMuVklERU9fREVWSUNFU19VUERBVEVTfHxlPT09Si5TUEVBS0VSJiZTLlNQRUFLRVJfREVWSUNFU19VUERBVEVTLG1ldGFEYXRhOntkZXZpY2VMaXN0OnN9LHRpbWVzdGFtcDpufSl9c2VsZWN0ZWREZXZpY2UoZSxzLG4pe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6ZT09PUouQVVESU8mJlMuU0VMRUNURURfTUlDUk9IUE9ORV9VUERBVEV8fGU9PT1KLlZJREVPJiZTLlNFTEVDVEVEX0NBTUVSQV9VUERBVEV8fGU9PT1KLlNQRUFLRVImJlMuU0VMRUNURURfU1BFQUtFUl9VUERBVEUsbWV0YURhdGE6e2RldmljZTpzfSx0aW1lc3RhbXA6bn0pfW1lZGlhUGVybWlzc2lvbihlLHMsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLk1FRElBX1BFUk1JU1NJT04sbWV0YURhdGE6e2RldmljZVR5cGU6ZSxwZXJtaXNzaW9uOnN9LHRpbWVzdGFtcDpufSl9bWVkaWFQbGF5YmFja0ZhaWxlZChlLHMpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6ZT09PUouQVVESU8mJlMuQVVESU9fUExBWV9GQUlMRUR8fGU9PT1KLlZJREVPJiZTLlZJREVPX1BMQVlfRkFJTEVELG1ldGFEYXRhOntkZXZpY2VUeXBlOmV9LHRpbWVzdGFtcDpzfSl9bWVkaWFUcmFja011dGVkKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDplPT09Si5BVURJTyYmUy5BVURJT19UUkFDS19NVVRFRHx8ZT09PUouVklERU8mJlMuVklERU9fVFJBQ0tfTVVURUQsbWV0YURhdGE6e2RldmljZVR5cGU6ZX0sdGltZXN0YW1wOnN9KX10YWJDaGFuZ2VkKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlRBQl9DSEFOR0UsbWV0YURhdGE6e2lzTWVldGluZ3NUYWJBY3RpdmU6ZX0sdGltZXN0YW1wOnN9KX1icm93c2VyQmFja2dyb3VuZGVkKGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5CUk9XU0VSX0JBQ0tHUk9VTkRFRCx0aW1lc3RhbXA6ZX0pfWJyb3dzZXJGb3JlZ3JvdW5kZWQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkJST1dTRVJfRk9SRUdST1VOREVELHRpbWVzdGFtcDplfSl9bGVnYWN5U3dpdGNoKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkxFR0FDWV9TV0lUQ0gsbWV0YWRhdGE6e29uOmV9LHRpbWVzdGFtcDpzfSl9Z2V0UHJlQ2FsbFRlc3RSZXN1bHRzKCl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLmNvbm5lY3Rpb25JbmZvUHJvbWlzZX0pfXNlbmRDYWxsSm9pbkJlZ2luRXZlbnQoZSxzKXtlPW90KFEoe30sZSkse21lZXRpbmdFbnY6dGhpcy5lbnZ9KSxlLmRldmljZUluZm89b3QoUSh7fSxlLmRldmljZUluZm8pLHt1c2VyQWdlbnQ6bmF2aWdhdG9yLnVzZXJBZ2VudCxjcHVzOm5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5LG1lbW9yeTpuYXZpZ2F0b3IuZGV2aWNlTWVtb3J5fSksdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkNBTExfSk9JTl9CRUdJTixtZXRhRGF0YTp7cGVlck1ldGFEYXRhOmV9LHRpbWVzdGFtcDpzfSl9c2VuZE5ldHdvcmtRdWFsaXR5VGVzdEJlZ2luRXZlbnQoZSxzKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuTkVUX1FVQUxJVFlfVEVTVF9CRUdJTix0aW1lc3RhbXA6c30pLG5ldyBQcm9taXNlKChpLGEpPT5JKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBkPVtdO3RyeXtmb3IoY29uc3QgbyBvZiBlKXRyeXtpZihvLmljZVNlcnZlcnMmJm8uaWNlU2VydmVycy5sZW5ndGg+MCl7Y29uc3QgbD15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXROZXR3b3JrUXVhbGl0eShvLmljZVNlcnZlcnMpO2QucHVzaChvdChRKHt9LG8pLHtuZXR3b3JrUmVzdWx0czpsfSkpfX1jYXRjaChsKXtjb25zb2xlLndhcm4oIkVycm9yIGhhbmRsaW5nICIsbCl9aSh7cmVnaW9uRGF0YTpkfSl9Y2F0Y2gobyl7Y29uc29sZS53YXJuKCJFcnJvciBpbiBjYWxsc3RhdHMsICIsbyksYShvKX19KSkudGhlbihpPT57dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLk5FVF9RVUFMSVRZX1RFU1RfRU5ELHRpbWVzdGFtcDpzLG1ldGFEYXRhOml9KX0pfXNlbmRXZWJTb2NrZXRDb25uZWN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuV0VCU09DS0VUX0NPTk5FQ1RFRCx0aW1lc3RhbXA6ZX0pfXNlbmRUcmFuc3BvcnRDb25uZWN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuVFJBTlNQT1JUX0NPTk5FQ1RFRCx0aW1lc3RhbXA6ZX0pfXNlbmRBdWRpb1RvZ2dsZUV2ZW50KGUscyl7dGhpcy5jdXJyZW50VXNlck1lZGlhU3RhdGVzLmF1ZGlvPWU7bGV0IG47ZT9uPVMuQVVESU9fT046bj1TLkFVRElPX09GRix0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50Om4sdGltZXN0YW1wOnN9KX1zZW5kVmlkZW9Ub2dnbGVFdmVudChlLHMpe3RoaXMuY3VycmVudFVzZXJNZWRpYVN0YXRlcy52aWRlbz1lO2xldCBuO2U/bj1TLlZJREVPX09OOm49Uy5WSURFT19PRkYsdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpuLHRpbWVzdGFtcDpzfSl9c2VuZFBhcnRpY2lwYW50Um9sZVRvZ2dsZUV2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlBBUlRJQ0lQQU5UX1JPTEUsdGltZXN0YW1wOnMsbWV0YURhdGE6ZX0pfXN0YXJ0UGluZ1N0YXRzKGU9N2UzKXt0aGlzLnNlbmRQaW5nU3RhdHNFdmVudCghMSxuZXcgRGF0ZSksdGhpcy5waW5nU3RhdHNUaW1lb3V0PXNldEludGVydmFsKHRoaXMuc2VuZFBpbmdTdGF0c0V2ZW50LmJpbmQodGhpcyksZSl9c3RvcFBpbmdTdGF0cygpe2NsZWFySW50ZXJ2YWwodGhpcy5waW5nU3RhdHNUaW1lb3V0KX1zZW5kUGluZ1N0YXRzRXZlbnQoZT0hMCxzKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIGQsbztsZXQgbixpO2lmKHRoaXMucHJvZHVjaW5nVHJhbnNwb3J0JiYobj15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXRQcm9jZXNzZWRTdGF0cyh0aGlzLnByb2R1Y2luZ1RyYW5zcG9ydCwhMSwhMCksIW58fCEoKGQ9bj09bnVsbD92b2lkIDA6bi5wcm9kdWNlclJlcG9ydCkhPW51bGwmJmQubGVuZ3RoKSkpe3RoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnNlbmRQaW5nU3RhdHNFdmVudDo6c3RhbGVQcm9kdWNpbmdUcmFuc3BvcnQiLHtkaXNjbGFpbWVyOiJTdGFsZSBwcm9kdWNlcj8gUmVnZW5lcmF0aW5nIFN0cmVhbSBNYXBzISJ9KTtjb25zdCBsPXlpZWxkIHRoaXMubWVhc3VyZW1lbnRzLmdldFByb2R1Y2Vyc1JlcG9ydChbLi4udGhpcy5wcm9kdWNlcnMudmFsdWVzKCldKTtuJiZsP24ucHJvZHVjZXJSZXBvcnQ9bDoobj15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXRQcm9jZXNzZWRTdGF0cyh0aGlzLnByb2R1Y2luZ1RyYW5zcG9ydCwhMSwhMCksKCFufHwhKG4hPW51bGwmJm4ucHJvZHVjZXJSZXBvcnQpKSYmdGhpcy5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6c2VuZFBpbmdTdGF0c0V2ZW50Ojpub1Byb2R1Y2luZ1RyYW5zcG9ydFJlcG9ydCIse2Rpc2NsYWltZXI6IlN0cmVhbSBtYXBzIGludmFsaWQgZGVzcGl0ZSByZWdlbmVyYXRpbmchIn0pKX1pZih0aGlzLmNvbnN1bWluZ1RyYW5zcG9ydCYmKGk9eWllbGQgdGhpcy5tZWFzdXJlbWVudHMuZ2V0UHJvY2Vzc2VkU3RhdHModGhpcy5jb25zdW1pbmdUcmFuc3BvcnQsITAsITEpLCFpfHwhKChvPWkuY29uc3VtZXJSZXBvcnQpIT1udWxsJiZvLmxlbmd0aCkpKXt0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpzZW5kUGluZ1N0YXRzRXZlbnQ6OnN0YWxlQ29uc3VtaW5nVHJhbnNwb3J0Iix7ZGlzY2xhaW1lcjoiU3RhbGUgY29uc3VtZXI/IFJlZ2VuZXJhdGluZyBTdHJlYW0gTWFwcyEifSk7Y29uc3QgbD15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXRDb25zdW1lcnNSZXBvcnQoWy4uLnRoaXMuY29uc3VtZXJzLnZhbHVlcygpXSk7aSYmbD9pLmNvbnN1bWVyUmVwb3J0PWw6KGk9eWllbGQgdGhpcy5tZWFzdXJlbWVudHMuZ2V0UHJvY2Vzc2VkU3RhdHModGhpcy5jb25zdW1pbmdUcmFuc3BvcnQsITAsITEpLCghaXx8IWkuY29uc3VtZXJSZXBvcnQpJiZ0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpzZW5kUGluZ1N0YXRzRXZlbnQ6Om5vQ29uc3VtaW5nVHJhbnNwb3J0UmVwb3J0Iix7ZGlzY2xhaW1lcjoiU3RyZWFtIG1hcHMgaW52YWxpZCBkZXNwaXRlIHJlZ2VuZXJhdGluZyEifSkpfWNvbnN0IGE9e3Byb2R1Y2luZ1RyYW5zcG9ydFN0YXRzOm4/bj09bnVsbD92b2lkIDA6bi50cmFuc3BvcnRSZXBvcnQ6dm9pZCAwLGNvbnN1bWluZ1RyYW5zcG9ydFN0YXRzOmk/aT09bnVsbD92b2lkIDA6aS50cmFuc3BvcnRSZXBvcnQ6dm9pZCAwLHByb2R1Y2VyU3RhdHM6W10uY29uY2F0KChuPT1udWxsP3ZvaWQgMDpuLnByb2R1Y2VyUmVwb3J0KXx8W10pLmNvbmNhdCgoaT09bnVsbD92b2lkIDA6aS5wcm9kdWNlclJlcG9ydCl8fFtdKSxjb25zdW1lclN0YXRzOltdLmNvbmNhdCgoaT09bnVsbD92b2lkIDA6aS5jb25zdW1lclJlcG9ydCl8fFtdKS5jb25jYXQoKG49PW51bGw/dm9pZCAwOm4uY29uc3VtZXJSZXBvcnQpfHxbXSl9O2lmKGUmJmEucHJvZHVjZXJTdGF0cy5sZW5ndGg9PT0wJiZhLmNvbnN1bWVyU3RhdHMubGVuZ3RoPT09MCl7eWllbGQgdGhpcy5ldmVudEhhbmRsZXIuZmx1c2goKTtyZXR1cm59dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlBJTkdfU1RBVCxtZXRhRGF0YTphLHRpbWVzdGFtcDpzfSl9KX1zZW5kSVZTUGxheWVyUmVidWZmZXJFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9SRUJVRkZFUklORyx0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJBdWRpb0Jsb2NrRXZlbnQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfQVVESU9fQkxPQ0tFRCx0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJQbGF5YmFja0Jsb2NrZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9QTEFZQkFDS19CTE9DS0VELHRpbWVzdGFtcDplfSl9c2VuZElWU1BsYXllck5ldHdvcmtVbmF2YWlsYWJsZUV2ZW50KGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5JVlNfUExBWUVSX05FVFdPUktfVU5BVkFJTEFCTEUsdGltZXN0YW1wOmV9KX1zZW5kSVZTUGxheWVySW5pdGlhbGl6ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9JTklUSUFMSVpFRCx0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJXb3JrZXJFcnJvckV2ZW50KGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5JVlNfUExBWUVSX1dPUktFUl9FUlJPUix0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJFcnJvckV2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfRVJST1IsdGltZXN0YW1wOnMsbWV0YURhdGE6ZX0pfXNlbmRJVlNQbGF5ZXJSZWNvdmVyYWJsZUVycm9yRXZlbnQoZSxzKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9SRUNPVkVSQUJMRV9FUlJPUix0aW1lc3RhbXA6cyxtZXRhRGF0YTplfSl9c2VuZElWU1BsYXllckFuYWx5dGljc0V2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfQU5BTFlUSUNTX0VWRU5ULHRpbWVzdGFtcDpzLG1ldGFEYXRhOmV9KX1zZW5kSVZTUGxheWVyUGxheWJhY2tSYXRlQ2hhbmdlZEV2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfUExBWUJBQ0tfUkFURV9DSEFOR0VELHRpbWVzdGFtcDpzLG1ldGFEYXRhOnt1cGRhdGVkUGxheWJhY2tSYXRlOmV9fSl9c2VuZElWU1BsYXllclF1YWxpdHlDaGFuZ2VkKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfUVVBTElUWV9DSEFOR0VELHRpbWVzdGFtcDpzLG1ldGFEYXRhOmV9KX1zZW5kUGxheWVyTGl2ZUxhdGVuY3koZSxzKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuTElWRVNUUkVBTV9MQVRFTkNZLHRpbWVzdGFtcDpzLG1ldGFEYXRhOntsYXRlbmN5OmV9fSl9c2VuZERpc2Nvbm5lY3RFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuRElTQ09OTkVDVCx0aW1lc3RhbXA6ZX0pfXNlbmRSZWNvbm5lY3RFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuUkVDT05ORUNUX0FUVEVNUFQsdGltZXN0YW1wOmV9KX1leHBlY3RlZFZpZGVvUmVzb2x1dGlvbihlLHMsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkVYUEVDVEVEX1ZJREVPX1JFU09MVVRJT04sdGltZXN0YW1wOm4sbWV0YURhdGE6e2ZyYW1lV2lkdGg6ZSxmcmFtZUhlaWdodDpzfX0pfWV4cGVjdGVkU2NyZWVuc2hhcmVSZXNvbHV0aW9uKGUscyxuKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuRVhQRUNURURfU0NSRUVOU0hBUkVfUkVTT0xVVElPTix0aW1lc3RhbXA6bixtZXRhRGF0YTp7ZnJhbWVXaWR0aDplLGZyYW1lSGVpZ2h0OnN9fSl9fTtSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInJlZ2lzdGVySWNlU2VydmVycyIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJyZWdpc3RlckNvbnN1bWVyIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInJlZ2lzdGVyUHJvZHVjZXIiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwic2VuZENvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZUV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInJlZ2lzdGVyUHJvZHVjaW5nVHJhbnNwb3J0IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInJlZ2lzdGVyQ29uc3VtaW5nVHJhbnNwb3J0IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsImRlUmVnaXN0ZXJDb25zdW1lciIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJkZVJlZ2lzdGVyUHJvZHVjZXIiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwiZGlzY29ubmVjdENvbnN1bWluZ1RyYW5zcG9ydCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJkaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInNlbmRQcmVDYWxsVGVzdEJlZ2luRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwic2VuZFNjcmVlblNoYXJlVG9nZ2xlRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwic2VuZFNjcmVlblNoYXJlUmVxdWVzdGVkRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwic2VuZEFjdGl2ZVNwZWFrZXJFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJkZXZpY2VzIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInNlbGVjdGVkRGV2aWNlIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsIm1lZGlhUGVybWlzc2lvbiIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJtZWRpYVBsYXliYWNrRmFpbGVkIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsIm1lZGlhVHJhY2tNdXRlZCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJ0YWJDaGFuZ2VkIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsImJyb3dzZXJCYWNrZ3JvdW5kZWQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwiYnJvd3NlckZvcmVncm91bmRlZCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJsZWdhY3lTd2l0Y2giLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwiZ2V0UHJlQ2FsbFRlc3RSZXN1bHRzIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInNlbmRDYWxsSm9pbkJlZ2luRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwic2VuZE5ldHdvcmtRdWFsaXR5VGVzdEJlZ2luRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwic2VuZFdlYlNvY2tldENvbm5lY3RlZEV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInNlbmRUcmFuc3BvcnRDb25uZWN0ZWRFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJzZW5kQXVkaW9Ub2dnbGVFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJzZW5kVmlkZW9Ub2dnbGVFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJzZW5kUGFydGljaXBhbnRSb2xlVG9nZ2xlRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwic3RhcnRQaW5nU3RhdHMiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwic3RvcFBpbmdTdGF0cyIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJzZW5kUGluZ1N0YXRzRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwic2VuZElWU1BsYXllclJlYnVmZmVyRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwic2VuZElWU1BsYXllckF1ZGlvQmxvY2tFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJzZW5kSVZTUGxheWVyUGxheWJhY2tCbG9ja2VkRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwic2VuZElWU1BsYXllck5ldHdvcmtVbmF2YWlsYWJsZUV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJJbml0aWFsaXplZEV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJXb3JrZXJFcnJvckV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJFcnJvckV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJSZWNvdmVyYWJsZUVycm9yRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwic2VuZElWU1BsYXllckFuYWx5dGljc0V2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJQbGF5YmFja1JhdGVDaGFuZ2VkRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwic2VuZElWU1BsYXllclF1YWxpdHlDaGFuZ2VkIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInNlbmRQbGF5ZXJMaXZlTGF0ZW5jeSIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJzZW5kRGlzY29ubmVjdEV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInNlbmRSZWNvbm5lY3RFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJleHBlY3RlZFZpZGVvUmVzb2x1dGlvbiIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJleHBlY3RlZFNjcmVlbnNoYXJlUmVzb2x1dGlvbiIsbnVsbCksVD1SKFt3bihUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQpO3ZhciBNbj1UO2NsYXNzIE5yIGV4dGVuZHMgcXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7cCh0aGlzLCJzdGF0cyIpO3AodGhpcywicGVlcklkIik7cCh0aGlzLCJiYWNrZW5kIik7cCh0aGlzLCJpY2VTZXJ2ZXJzIik7cCh0aGlzLCJpbml0aWFsaXplZCIsITEpO3AodGhpcywic3RhbGxlZCIsITEpO3AodGhpcywiaXBJbmZvcm1hdGlvbiIpO3AodGhpcywibG9nZ2VyIil9aW5pdGlhbGl6ZShFKXtyZXR1cm4gSSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbiooe3BlZXJJZDplLGVuZ2luZU5hbWU6cyxlbnY6bj1mci5QUk9ELGljZVNlcnZlcnM6aSxhcGlCYXNlOmE9Imh0dHBzOi8vYXBpLmNsdXN0ZXIuZHl0ZS5pbiIsZmxhZ3M6ZCxsb2dnZXI6bz1jb25zb2xlLGFwaUhvc3RuYW1lczpsLHNraXBDb25uZWN0aXZpdHlDaGVja3M6Zj0hMSxhdXRoVG9rZW46eX0pe3ZhciB3LHgsVTt0cnl7aWYodGhpcy5wZWVySWQ9ZSx0aGlzLmxvZ2dlcj1vLCF5KXt0aGlzLmxvZ2dlci5lcnJvcigiY2FsbFN0YXRzOjppbml0aWFsaXplIix7ZXZlbnQ6ImF1dGhfdG9rZW5fbWlzc2luZyIscGVlcklkOnRoaXMucGVlcklkfSksdGhpcy5zdGFsbENhbGxTdGF0cygpO3JldHVybn10aGlzLmlwSW5mb3JtYXRpb249eWllbGQgd3IuZ2V0SVBEZXRhaWxzKHtwZWVySWQ6ZSxhcGlIb3N0bmFtZXM6bCxsb2dnZXI6b30pLHRoaXMuYmFja2VuZD1uZXcgTW4oYSxzLG4sZCxvLGUsbCx5KSx0aGlzLmljZVNlcnZlcnM9aSwodz10aGlzLmJhY2tlbmQpPT1udWxsfHx3LnJlZ2lzdGVySWNlU2VydmVycyh0aGlzLmljZVNlcnZlcnMpLHRoaXMuaW5pdGlhbGl6ZWQ9ITAsKFU9KHg9dGhpcy5iYWNrZW5kKT09bnVsbD92b2lkIDA6eC5ldmVudEhhbmRsZXIpPT1udWxsfHxVLmVtaXQoImluaXRpYWxpemVkIix0aGlzLmlwSW5mb3JtYXRpb24pLHRoaXMuZW1pdCgiaW5pdGlhbGl6ZWQiLHRoaXMuaXBJbmZvcm1hdGlvbiksdGhpcy5zdGFydFByZUNhbGxUZXN0KGYpfWNhdGNoKEwpe3RoaXMubG9nZ2VyLmVycm9yKCJjYWxsU3RhdHM6OkNhbGxTdGF0c0ludGVncmF0aW9uIix7cGVlcklkOnRoaXMucGVlcklkLGVycm9yOkwgaW5zdGFuY2VvZiBFcnJvcj9MLm1lc3NhZ2U6U3RyaW5nKEwpLHN0YWNrOkwgaW5zdGFuY2VvZiBFcnJvcj9MLnN0YWNrOnZvaWQgMH0pLHRoaXMuc3RhbGxDYWxsU3RhdHMoKX19KX1jb25maWd1cmVTZW5kVHJhbnNwb3J0KGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLnJlZ2lzdGVyUHJvZHVjaW5nVHJhbnNwb3J0KGUpfSl9Y29uZmlndXJlUmVjdlRyYW5zcG9ydChlKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5yZWdpc3RlckNvbnN1bWluZ1RyYW5zcG9ydChlKX0pfWNhbmRpZGF0ZVJlZ2lvbmFsTmV0d29ya1F1YWxpdHlUZXN0KGUpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjt0cnl7KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kTmV0d29ya1F1YWxpdHlUZXN0QmVnaW5FdmVudChlLHMpfWNhdGNoKGkpe3RoaXMubG9nZ2VyLmVycm9yKCJjYWxsU3RhdHM6OnNlbmROZXR3b3JrUXVhbGl0eVRlc3RCZWdpbkV2ZW50Iix7ZXJyb3I6e3JlYXNvbjppLnJlYXNvbn19KX19KX0pfXJvb21Kb2luZWQoZSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuLGk7KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kQ2FsbEpvaW5CZWdpbkV2ZW50KGUscyksdGhpcy5iYWNrZW5kLChpPXRoaXMuYmFja2VuZCk9PW51bGx8fGkuc3RhcnRQaW5nU3RhdHMoKX0pfSl9YXVkaW9PZmYoKXtjb25zdCBlPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLnNlbmRBdWRpb1RvZ2dsZUV2ZW50KCExLGUpfSl9YXVkaW9Pbigpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuc2VuZEF1ZGlvVG9nZ2xlRXZlbnQoITAsZSl9KX12aWRlb09mZigpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuc2VuZFZpZGVvVG9nZ2xlRXZlbnQoITEsZSl9KX12aWRlb09uKCl7Y29uc3QgZT1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5zZW5kVmlkZW9Ub2dnbGVFdmVudCghMCxlKX0pfWNhbGxFbmRlZCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzLG47KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5zdG9wUGluZ1N0YXRzKCksKG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kRGlzY29ubmVjdEV2ZW50KGUpfSl9c2NyZWVuU2hhcmVTdGFydChlKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmRTY3JlZW5TaGFyZVRvZ2dsZUV2ZW50KCEwLGUscyl9KX1jb25zdW1lclNoYXJlZE1lZGlhU3RhdGUoZSxzKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kQ29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlRXZlbnQoZSxzKX0pfXNjcmVlblNoYXJlU3RvcChlKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmRTY3JlZW5TaGFyZVRvZ2dsZUV2ZW50KCExLGUscyl9KX1zY3JlZW5TaGFyZVJlcXVlc3RlZCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuc2VuZFNjcmVlblNoYXJlUmVxdWVzdGVkRXZlbnQoZSl9KX1hY3RpdmVTcGVha2VyKGUpe2lmKGUhPT10aGlzLnBlZXJJZClyZXR1cm47Y29uc3Qgcz1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kQWN0aXZlU3BlYWtlckV2ZW50KGUscyl9KX1kZXZpY2VzKGUscyl7Y29uc3Qgbj1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIGk7KGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5kZXZpY2VzKGUscyxuKX0pfXNlbGVjdGVkRGV2aWNlKGUscyl7Y29uc3Qgbj1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIGk7KGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5zZWxlY3RlZERldmljZShlLHMsbil9KX1tZWRpYVBlcm1pc3Npb24oZSxzKXtjb25zdCBuPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgaTsoaT10aGlzLmJhY2tlbmQpPT1udWxsfHxpLm1lZGlhUGVybWlzc2lvbihlLHMsbil9KX1tZWRpYVBsYXliYWNrRmFpbGVkKGUpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4ubWVkaWFQbGF5YmFja0ZhaWxlZChlLHMpfSl9bWVkaWFUcmFja011dGVkKGUpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4ubWVkaWFUcmFja011dGVkKGUscyl9KX10YWJDaGFuZ2VkKGU9ITEpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4udGFiQ2hhbmdlZChlLHMpfSl9YnJvd3NlckJhY2tncm91bmRlZCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuYnJvd3NlckJhY2tncm91bmRlZChlKX0pfWJyb3dzZXJGb3JlZ3JvdW5kZWQoKXtjb25zdCBlPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLmJyb3dzZXJGb3JlZ3JvdW5kZWQoZSl9KX1sZWdhY3lTd2l0Y2goZSl7Y29uc3Qgcz1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5sZWdhY3lTd2l0Y2goZSxzKX0pfXN0YXJ0UHJlQ2FsbFRlc3QoZT0hMSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uc2VuZFByZUNhbGxUZXN0QmVnaW5FdmVudChlLHMpfSl9KX1vblByZUNhbGxUZXN0UmVzdWx0cyhlKXtyZXR1cm4gdGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uY2UoInByZWNhbGxfZW5kIixlKX0pLGV9b25SZWNlaXZpbmdDb25zdW1lckF1ZGlvU3RhdHVzKGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLmV2ZW50SGFuZGxlci5vbigiY29uc3VtZXJfYXVkaW9fc3RhdHVzIixlKX0pfW9uUmVjZWl2aW5nQ29uc3VtZXJWaWRlb1N0YXR1cyhlKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5ldmVudEhhbmRsZXIub24oImNvbnN1bWVyX3ZpZGVvX3N0YXR1cyIsZSl9KX1vblJlY2VpdmluZ1Byb2R1Y2VyQXVkaW9TdGF0dXMoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJwcm9kdWNlcl9hdWRpb19zdGF0dXMiLGUpfSl9b25SZWNlaXZpbmdQcm9kdWNlclZpZGVvU3RhdHVzKGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLmV2ZW50SGFuZGxlci5vbigicHJvZHVjZXJfdmlkZW9fc3RhdHVzIixlKX0pfW9uUmVjZWl2aW5nUHJvZHVjaW5nVHJhbnNwb3J0U3RhdHVzKGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLmV2ZW50SGFuZGxlci5vbigicHJvZHVjaW5nX3RyYW5zcG9ydF9zdGF0dXMiLGUpfSl9b25SZWNlaXZpbmdDb25zdW1pbmdUcmFuc3BvcnRTdGF0dXMoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJjb25zdW1pbmdfdHJhbnNwb3J0X3N0YXR1cyIsZSl9KX1vblByb2R1Y2VyU2NvcmUoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJwcm9kdWNlcl9zY29yZSIsZSl9KX1vbkNvbnN1bWVyU2NvcmUoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJjb25zdW1lcl9zY29yZSIsZSl9KX1vblNhZmVJbml0aWFsaXphdGlvbihlKXtpZih0aGlzLmluaXRpYWxpemVkKWUodGhpcy5pcEluZm9ybWF0aW9uLCExKTtlbHNlIGlmKCF0aGlzLnN0YWxsZWQpe2NvbnN0IHM9bj0+e2UobiwhMCl9O3JldHVybiB0aGlzLm9uY2UoImluaXRpYWxpemVkIixzKSxzfXJldHVybigpPT57fX1yZW1vdmVJbml0aWFsaXphdGlvbkxpc3RlbmVyKGUpe3RoaXMucmVtb3ZlTGlzdGVuZXIoImluaXRpYWxpemVkIixlKX1zdGFsbENhbGxTdGF0cygpe3RoaXMuc3RhbGxlZD0hMCx0aGlzLnJlbW92ZUFsbExpc3RlbmVycygiaW5pdGlhbGl6ZWQiKX1pdnNQbGF5ZXJFdmVudChlLHMpe2NvbnN0IG49bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBpLGEsZCxvLGwsZix5LEUsdyx4LFU7c3dpdGNoKGUpe2Nhc2UiUGxheWVyUmVidWZmZXJpbmciOihpPXRoaXMuYmFja2VuZCk9PW51bGx8fGkuc2VuZElWU1BsYXllclJlYnVmZmVyRXZlbnQobik7YnJlYWs7Y2FzZSJQbGF5ZXJBdWRpb0Jsb2NrZWQiOihhPXRoaXMuYmFja2VuZCk9PW51bGx8fGEuc2VuZElWU1BsYXllckF1ZGlvQmxvY2tFdmVudChuKTticmVhaztjYXNlIlBsYXllclBsYXliYWNrQmxvY2tlZCI6KGQ9dGhpcy5iYWNrZW5kKT09bnVsbHx8ZC5zZW5kSVZTUGxheWVyUGxheWJhY2tCbG9ja2VkRXZlbnQobik7YnJlYWs7Y2FzZSJQbGF5ZXJOZXR3b3JrVW5hdmFpbGFibGUiOihvPXRoaXMuYmFja2VuZCk9PW51bGx8fG8uc2VuZElWU1BsYXllck5ldHdvcmtVbmF2YWlsYWJsZUV2ZW50KG4pO2JyZWFrO2Nhc2UiUGxheWVySW5pdGlhbGl6ZWQiOihsPXRoaXMuYmFja2VuZCk9PW51bGx8fGwuc2VuZElWU1BsYXllckluaXRpYWxpemVkRXZlbnQobik7YnJlYWs7Y2FzZSJQbGF5ZXJXb3JrZXJFcnJvciI6KGY9dGhpcy5iYWNrZW5kKT09bnVsbHx8Zi5zZW5kSVZTUGxheWVyV29ya2VyRXJyb3JFdmVudChuKTticmVhaztjYXNlIlBsYXllckVycm9yIjooeT10aGlzLmJhY2tlbmQpPT1udWxsfHx5LnNlbmRJVlNQbGF5ZXJFcnJvckV2ZW50KHMsbik7YnJlYWs7Y2FzZSJQbGF5ZXJSZWNvdmVyYWJsZUVycm9yIjooRT10aGlzLmJhY2tlbmQpPT1udWxsfHxFLnNlbmRJVlNQbGF5ZXJSZWNvdmVyYWJsZUVycm9yRXZlbnQocyxuKTticmVhaztjYXNlIlBsYXllckFuYWx5dGljc0V2ZW50Ijoodz10aGlzLmJhY2tlbmQpPT1udWxsfHx3LnNlbmRJVlNQbGF5ZXJBbmFseXRpY3NFdmVudChzLG4pO2JyZWFrO2Nhc2UiUGxheWVyUGxheWJhY2tSYXRlQ2hhbmdlZCI6KHg9dGhpcy5iYWNrZW5kKT09bnVsbHx8eC5zZW5kSVZTUGxheWVyUGxheWJhY2tSYXRlQ2hhbmdlZEV2ZW50KHMsbik7YnJlYWs7Y2FzZSJQbGF5ZXJRdWFsaXR5Q2hhbmdlZCI6KFU9dGhpcy5iYWNrZW5kKT09bnVsbHx8VS5zZW5kSVZTUGxheWVyUXVhbGl0eUNoYW5nZWQocyxuKTticmVha319KX1saXZlc3RyZWFtTGF0ZW5jeShlKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmRQbGF5ZXJMaXZlTGF0ZW5jeShlLHMpfSl9ZXhwZWN0ZWRWaWRlb1Jlc29sdXRpb24oZSxzKXtjb25zdCBuPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgaTsoaT10aGlzLmJhY2tlbmQpPT1udWxsfHxpLmV4cGVjdGVkVmlkZW9SZXNvbHV0aW9uKGUscyxuKX0pfWV4cGVjdGVkU2NyZWVuc2hhcmVSZXNvbHV0aW9uKGUscyl7Y29uc3Qgbj1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIGk7KGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5leHBlY3RlZFNjcmVlbnNoYXJlUmVzb2x1dGlvbihlLHMsbil9KX19bmV3IE5yKCkuc2V0TWF4TGlzdGVuZXJzKDMwKTtmdW5jdGlvbiBBbigpe3RoaXMuX19kYXRhX189W10sdGhpcy5zaXplPTB9ZnVuY3Rpb24gVnIodCxyKXtyZXR1cm4gdD09PXJ8fHQhPT10JiZyIT09cn1mdW5jdGlvbiBndCh0LHIpe2Zvcih2YXIgZT10Lmxlbmd0aDtlLS07KWlmKFZyKHRbZV1bMF0scikpcmV0dXJuIGU7cmV0dXJuLTF9dmFyIGtuPUFycmF5LnByb3RvdHlwZSxPbj1rbi5zcGxpY2U7ZnVuY3Rpb24gTG4odCl7dmFyIHI9dGhpcy5fX2RhdGFfXyxlPWd0KHIsdCk7aWYoZTwwKXJldHVybiExO3ZhciBzPXIubGVuZ3RoLTE7cmV0dXJuIGU9PXM/ci5wb3AoKTpPbi5jYWxsKHIsZSwxKSwtLXRoaXMuc2l6ZSwhMH1mdW5jdGlvbiBEbih0KXt2YXIgcj10aGlzLl9fZGF0YV9fLGU9Z3Qocix0KTtyZXR1cm4gZTwwP3ZvaWQgMDpyW2VdWzFdfWZ1bmN0aW9uIE5uKHQpe3JldHVybiBndCh0aGlzLl9fZGF0YV9fLHQpPi0xfWZ1bmN0aW9uIFZuKHQscil7dmFyIGU9dGhpcy5fX2RhdGFfXyxzPWd0KGUsdCk7cmV0dXJuIHM8MD8oKyt0aGlzLnNpemUsZS5wdXNoKFt0LHJdKSk6ZVtzXVsxXT1yLHRoaXN9ZnVuY3Rpb24gc2UodCl7dmFyIHI9LTEsZT10PT1udWxsPzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK3I8ZTspe3ZhciBzPXRbcl07dGhpcy5zZXQoc1swXSxzWzFdKX19c2UucHJvdG90eXBlLmNsZWFyPUFuLHNlLnByb3RvdHlwZS5kZWxldGU9TG4sc2UucHJvdG90eXBlLmdldD1EbixzZS5wcm90b3R5cGUuaGFzPU5uLHNlLnByb3RvdHlwZS5zZXQ9Vm47ZnVuY3Rpb24gRm4oKXt0aGlzLl9fZGF0YV9fPW5ldyBzZSx0aGlzLnNpemU9MH1mdW5jdGlvbiBCbih0KXt2YXIgcj10aGlzLl9fZGF0YV9fLGU9ci5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZT1yLnNpemUsZX1mdW5jdGlvbiB4bih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQodCl9ZnVuY3Rpb24gam4odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfXZhciBVbj10eXBlb2YgZ2xvYmFsPT0ib2JqZWN0IiYmZ2xvYmFsJiZnbG9iYWwuT2JqZWN0PT09T2JqZWN0JiZnbG9iYWwsRnI9VW4sJG49dHlwZW9mIHNlbGY9PSJvYmplY3QiJiZzZWxmJiZzZWxmLk9iamVjdD09PU9iamVjdCYmc2VsZixIbj1Gcnx8JG58fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCksWD1IbixLbj1YLlN5bWJvbCxFZT1LbixCcj1PYmplY3QucHJvdG90eXBlLHpuPUJyLmhhc093blByb3BlcnR5LFduPUJyLnRvU3RyaW5nLHdlPUVlP0VlLnRvU3RyaW5nVGFnOnZvaWQgMDtmdW5jdGlvbiBHbih0KXt2YXIgcj16bi5jYWxsKHQsd2UpLGU9dFt3ZV07dHJ5e3Rbd2VdPXZvaWQgMDt2YXIgcz0hMH1jYXRjaChpKXt9dmFyIG49V24uY2FsbCh0KTtyZXR1cm4gcyYmKHI/dFt3ZV09ZTpkZWxldGUgdFt3ZV0pLG59dmFyIHFuPU9iamVjdC5wcm90b3R5cGUsWW49cW4udG9TdHJpbmc7ZnVuY3Rpb24gUW4odCl7cmV0dXJuIFluLmNhbGwodCl9dmFyIEpuPSJbb2JqZWN0IE51bGxdIixYbj0iW29iamVjdCBVbmRlZmluZWRdIix4cj1FZT9FZS50b1N0cmluZ1RhZzp2b2lkIDA7ZnVuY3Rpb24gTWUodCl7cmV0dXJuIHQ9PW51bGw/dD09PXZvaWQgMD9YbjpKbjp4ciYmeHIgaW4gT2JqZWN0KHQpP0duKHQpOlFuKHQpfWZ1bmN0aW9uIEFlKHQpe3ZhciByPXR5cGVvZiB0O3JldHVybiB0IT1udWxsJiYocj09Im9iamVjdCJ8fHI9PSJmdW5jdGlvbiIpfXZhciBabj0iW29iamVjdCBBc3luY0Z1bmN0aW9uXSIsZWk9IltvYmplY3QgRnVuY3Rpb25dIix0aT0iW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iLHJpPSJbb2JqZWN0IFByb3h5XSI7ZnVuY3Rpb24ganIodCl7aWYoIUFlKHQpKXJldHVybiExO3ZhciByPU1lKHQpO3JldHVybiByPT1laXx8cj09dGl8fHI9PVpufHxyPT1yaX12YXIgc2k9WFsiX19jb3JlLWpzX3NoYXJlZF9fIl0sa3Q9c2ksVXI9ZnVuY3Rpb24oKXt2YXIgdD0vW14uXSskLy5leGVjKGt0JiZrdC5rZXlzJiZrdC5rZXlzLklFX1BST1RPfHwiIik7cmV0dXJuIHQ/IlN5bWJvbChzcmMpXzEuIit0OiIifSgpO2Z1bmN0aW9uIG5pKHQpe3JldHVybiEhVXImJlVyIGluIHR9dmFyIGlpPUZ1bmN0aW9uLnByb3RvdHlwZSxhaT1paS50b1N0cmluZztmdW5jdGlvbiBsZSh0KXtpZih0IT1udWxsKXt0cnl7cmV0dXJuIGFpLmNhbGwodCl9Y2F0Y2gocil7fXRyeXtyZXR1cm4gdCsiIn1jYXRjaChyKXt9fXJldHVybiIifXZhciBvaT0vW1xcXiQuKis/KClbXF17fXxdL2csY2k9L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8sZGk9RnVuY3Rpb24ucHJvdG90eXBlLGxpPU9iamVjdC5wcm90b3R5cGUsdWk9ZGkudG9TdHJpbmcscGk9bGkuaGFzT3duUHJvcGVydHksaGk9UmVnRXhwKCJeIit1aS5jYWxsKHBpKS5yZXBsYWNlKG9pLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO2Z1bmN0aW9uIGZpKHQpe2lmKCFBZSh0KXx8bmkodCkpcmV0dXJuITE7dmFyIHI9anIodCk/aGk6Y2k7cmV0dXJuIHIudGVzdChsZSh0KSl9ZnVuY3Rpb24gbWkodCxyKXtyZXR1cm4gdD09bnVsbD92b2lkIDA6dFtyXX1mdW5jdGlvbiB1ZSh0LHIpe3ZhciBlPW1pKHQscik7cmV0dXJuIGZpKGUpP2U6dm9pZCAwfXZhciBnaT11ZShYLCJNYXAiKSxrZT1naSxTaT11ZShPYmplY3QsImNyZWF0ZSIpLE9lPVNpO2Z1bmN0aW9uIHlpKCl7dGhpcy5fX2RhdGFfXz1PZT9PZShudWxsKTp7fSx0aGlzLnNpemU9MH1mdW5jdGlvbiB2aSh0KXt2YXIgcj10aGlzLmhhcyh0KSYmZGVsZXRlIHRoaXMuX19kYXRhX19bdF07cmV0dXJuIHRoaXMuc2l6ZS09cj8xOjAscn12YXIgYmk9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iLEVpPU9iamVjdC5wcm90b3R5cGUsVGk9RWkuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gX2kodCl7dmFyIHI9dGhpcy5fX2RhdGFfXztpZihPZSl7dmFyIGU9clt0XTtyZXR1cm4gZT09PWJpP3ZvaWQgMDplfXJldHVybiBUaS5jYWxsKHIsdCk/clt0XTp2b2lkIDB9dmFyIFJpPU9iamVjdC5wcm90b3R5cGUsUGk9UmkuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gQ2kodCl7dmFyIHI9dGhpcy5fX2RhdGFfXztyZXR1cm4gT2U/clt0XSE9PXZvaWQgMDpQaS5jYWxsKHIsdCl9dmFyIElpPSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjtmdW5jdGlvbiB3aSh0LHIpe3ZhciBlPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLGVbdF09T2UmJnI9PT12b2lkIDA/SWk6cix0aGlzfWZ1bmN0aW9uIHBlKHQpe3ZhciByPS0xLGU9dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytyPGU7KXt2YXIgcz10W3JdO3RoaXMuc2V0KHNbMF0sc1sxXSl9fXBlLnByb3RvdHlwZS5jbGVhcj15aSxwZS5wcm90b3R5cGUuZGVsZXRlPXZpLHBlLnByb3RvdHlwZS5nZXQ9X2kscGUucHJvdG90eXBlLmhhcz1DaSxwZS5wcm90b3R5cGUuc2V0PXdpO2Z1bmN0aW9uIE1pKCl7dGhpcy5zaXplPTAsdGhpcy5fX2RhdGFfXz17aGFzaDpuZXcgcGUsbWFwOm5ldyhrZXx8c2UpLHN0cmluZzpuZXcgcGV9fWZ1bmN0aW9uIEFpKHQpe3ZhciByPXR5cGVvZiB0O3JldHVybiByPT0ic3RyaW5nInx8cj09Im51bWJlciJ8fHI9PSJzeW1ib2wifHxyPT0iYm9vbGVhbiI/dCE9PSJfX3Byb3RvX18iOnQ9PT1udWxsfWZ1bmN0aW9uIFN0KHQscil7dmFyIGU9dC5fX2RhdGFfXztyZXR1cm4gQWkocik/ZVt0eXBlb2Ygcj09InN0cmluZyI/InN0cmluZyI6Imhhc2giXTplLm1hcH1mdW5jdGlvbiBraSh0KXt2YXIgcj1TdCh0aGlzLHQpLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplLT1yPzE6MCxyfWZ1bmN0aW9uIE9pKHQpe3JldHVybiBTdCh0aGlzLHQpLmdldCh0KX1mdW5jdGlvbiBMaSh0KXtyZXR1cm4gU3QodGhpcyx0KS5oYXModCl9ZnVuY3Rpb24gRGkodCxyKXt2YXIgZT1TdCh0aGlzLHQpLHM9ZS5zaXplO3JldHVybiBlLnNldCh0LHIpLHRoaXMuc2l6ZSs9ZS5zaXplPT1zPzA6MSx0aGlzfWZ1bmN0aW9uIFRlKHQpe3ZhciByPS0xLGU9dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytyPGU7KXt2YXIgcz10W3JdO3RoaXMuc2V0KHNbMF0sc1sxXSl9fVRlLnByb3RvdHlwZS5jbGVhcj1NaSxUZS5wcm90b3R5cGUuZGVsZXRlPWtpLFRlLnByb3RvdHlwZS5nZXQ9T2ksVGUucHJvdG90eXBlLmhhcz1MaSxUZS5wcm90b3R5cGUuc2V0PURpO3ZhciBOaT0yMDA7ZnVuY3Rpb24gVmkodCxyKXt2YXIgZT10aGlzLl9fZGF0YV9fO2lmKGUgaW5zdGFuY2VvZiBzZSl7dmFyIHM9ZS5fX2RhdGFfXztpZigha2V8fHMubGVuZ3RoPE5pLTEpcmV0dXJuIHMucHVzaChbdCxyXSksdGhpcy5zaXplPSsrZS5zaXplLHRoaXM7ZT10aGlzLl9fZGF0YV9fPW5ldyBUZShzKX1yZXR1cm4gZS5zZXQodCxyKSx0aGlzLnNpemU9ZS5zaXplLHRoaXN9ZnVuY3Rpb24gX2UodCl7dmFyIHI9dGhpcy5fX2RhdGFfXz1uZXcgc2UodCk7dGhpcy5zaXplPXIuc2l6ZX1fZS5wcm90b3R5cGUuY2xlYXI9Rm4sX2UucHJvdG90eXBlLmRlbGV0ZT1CbixfZS5wcm90b3R5cGUuZ2V0PXhuLF9lLnByb3RvdHlwZS5oYXM9am4sX2UucHJvdG90eXBlLnNldD1WaTtmdW5jdGlvbiBGaSh0LHIpe2Zvcih2YXIgZT0tMSxzPXQ9PW51bGw/MDp0Lmxlbmd0aDsrK2U8cyYmcih0W2VdLGUsdCkhPT0hMTspO3JldHVybiB0fXZhciBCaT1mdW5jdGlvbigpe3RyeXt2YXIgdD11ZShPYmplY3QsImRlZmluZVByb3BlcnR5Iik7cmV0dXJuIHQoe30sIiIse30pLHR9Y2F0Y2gocil7fX0oKSwkcj1CaTtmdW5jdGlvbiBIcih0LHIsZSl7cj09Il9fcHJvdG9fXyImJiRyPyRyKHQscix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6ZSx3cml0YWJsZTohMH0pOnRbcl09ZX12YXIgeGk9T2JqZWN0LnByb3RvdHlwZSxqaT14aS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBLcih0LHIsZSl7dmFyIHM9dFtyXTsoIShqaS5jYWxsKHQscikmJlZyKHMsZSkpfHxlPT09dm9pZCAwJiYhKHIgaW4gdCkpJiZIcih0LHIsZSl9ZnVuY3Rpb24geXQodCxyLGUscyl7dmFyIG49IWU7ZXx8KGU9e30pO2Zvcih2YXIgaT0tMSxhPXIubGVuZ3RoOysraTxhOyl7dmFyIGQ9cltpXSxvPXM/cyhlW2RdLHRbZF0sZCxlLHQpOnZvaWQgMDtvPT09dm9pZCAwJiYobz10W2RdKSxuP0hyKGUsZCxvKTpLcihlLGQsbyl9cmV0dXJuIGV9ZnVuY3Rpb24gVWkodCxyKXtmb3IodmFyIGU9LTEscz1BcnJheSh0KTsrK2U8dDspc1tlXT1yKGUpO3JldHVybiBzfWZ1bmN0aW9uIExlKHQpe3JldHVybiB0IT1udWxsJiZ0eXBlb2YgdD09Im9iamVjdCJ9dmFyICRpPSJbb2JqZWN0IEFyZ3VtZW50c10iO2Z1bmN0aW9uIHpyKHQpe3JldHVybiBMZSh0KSYmTWUodCk9PSRpfXZhciBXcj1PYmplY3QucHJvdG90eXBlLEhpPVdyLmhhc093blByb3BlcnR5LEtpPVdyLnByb3BlcnR5SXNFbnVtZXJhYmxlLHppPXpyKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk/enI6ZnVuY3Rpb24odCl7cmV0dXJuIExlKHQpJiZIaS5jYWxsKHQsImNhbGxlZSIpJiYhS2kuY2FsbCh0LCJjYWxsZWUiKX0sR3I9emksV2k9QXJyYXkuaXNBcnJheSx2dD1XaTtmdW5jdGlvbiBHaSgpe3JldHVybiExfXZhciBxcj10eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzLFlyPXFyJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IiYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGUscWk9WXImJllyLmV4cG9ydHM9PT1xcixRcj1xaT9YLkJ1ZmZlcjp2b2lkIDAsWWk9UXI/UXIuaXNCdWZmZXI6dm9pZCAwLFFpPVlpfHxHaSxPdD1RaSxKaT05MDA3MTk5MjU0NzQwOTkxLFhpPS9eKD86MHxbMS05XVxkKikkLztmdW5jdGlvbiBaaSh0LHIpe3ZhciBlPXR5cGVvZiB0O3JldHVybiByPXI9PW51bGw/Smk6ciwhIXImJihlPT0ibnVtYmVyInx8ZSE9InN5bWJvbCImJlhpLnRlc3QodCkpJiZ0Pi0xJiZ0JTE9PTAmJnQ8cn12YXIgZWE9OTAwNzE5OTI1NDc0MDk5MTtmdW5jdGlvbiBKcih0KXtyZXR1cm4gdHlwZW9mIHQ9PSJudW1iZXIiJiZ0Pi0xJiZ0JTE9PTAmJnQ8PWVhfXZhciB0YT0iW29iamVjdCBBcmd1bWVudHNdIixyYT0iW29iamVjdCBBcnJheV0iLHNhPSJbb2JqZWN0IEJvb2xlYW5dIixuYT0iW29iamVjdCBEYXRlXSIsaWE9IltvYmplY3QgRXJyb3JdIixhYT0iW29iamVjdCBGdW5jdGlvbl0iLG9hPSJbb2JqZWN0IE1hcF0iLGNhPSJbb2JqZWN0IE51bWJlcl0iLGRhPSJbb2JqZWN0IE9iamVjdF0iLGxhPSJbb2JqZWN0IFJlZ0V4cF0iLHVhPSJbb2JqZWN0IFNldF0iLHBhPSJbb2JqZWN0IFN0cmluZ10iLGhhPSJbb2JqZWN0IFdlYWtNYXBdIixmYT0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLG1hPSJbb2JqZWN0IERhdGFWaWV3XSIsZ2E9IltvYmplY3QgRmxvYXQzMkFycmF5XSIsU2E9IltvYmplY3QgRmxvYXQ2NEFycmF5XSIseWE9IltvYmplY3QgSW50OEFycmF5XSIsdmE9IltvYmplY3QgSW50MTZBcnJheV0iLGJhPSJbb2JqZWN0IEludDMyQXJyYXldIixFYT0iW29iamVjdCBVaW50OEFycmF5XSIsVGE9IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIixfYT0iW29iamVjdCBVaW50MTZBcnJheV0iLFJhPSJbb2JqZWN0IFVpbnQzMkFycmF5XSIsQj17fTtCW2dhXT1CW1NhXT1CW3lhXT1CW3ZhXT1CW2JhXT1CW0VhXT1CW1RhXT1CW19hXT1CW1JhXT0hMCxCW3RhXT1CW3JhXT1CW2ZhXT1CW3NhXT1CW21hXT1CW25hXT1CW2lhXT1CW2FhXT1CW29hXT1CW2NhXT1CW2RhXT1CW2xhXT1CW3VhXT1CW3BhXT1CW2hhXT0hMTtmdW5jdGlvbiBQYSh0KXtyZXR1cm4gTGUodCkmJkpyKHQubGVuZ3RoKSYmISFCW01lKHQpXX1mdW5jdGlvbiBMdCh0KXtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIHQocil9fXZhciBYcj10eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzLERlPVhyJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IiYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGUsQ2E9RGUmJkRlLmV4cG9ydHM9PT1YcixEdD1DYSYmRnIucHJvY2VzcyxJYT1mdW5jdGlvbigpe3RyeXt2YXIgdD1EZSYmRGUucmVxdWlyZSYmRGUucmVxdWlyZSgidXRpbCIpLnR5cGVzO3JldHVybiB0fHxEdCYmRHQuYmluZGluZyYmRHQuYmluZGluZygidXRpbCIpfWNhdGNoKHIpe319KCksUmU9SWEsWnI9UmUmJlJlLmlzVHlwZWRBcnJheSx3YT1acj9MdChacik6UGEsZXM9d2EsTWE9T2JqZWN0LnByb3RvdHlwZSxBYT1NYS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiB0cyh0LHIpe3ZhciBlPXZ0KHQpLHM9IWUmJkdyKHQpLG49IWUmJiFzJiZPdCh0KSxpPSFlJiYhcyYmIW4mJmVzKHQpLGE9ZXx8c3x8bnx8aSxkPWE/VWkodC5sZW5ndGgsU3RyaW5nKTpbXSxvPWQubGVuZ3RoO2Zvcih2YXIgbCBpbiB0KShyfHxBYS5jYWxsKHQsbCkpJiYhKGEmJihsPT0ibGVuZ3RoInx8biYmKGw9PSJvZmZzZXQifHxsPT0icGFyZW50Iil8fGkmJihsPT0iYnVmZmVyInx8bD09ImJ5dGVMZW5ndGgifHxsPT0iYnl0ZU9mZnNldCIpfHxaaShsLG8pKSkmJmQucHVzaChsKTtyZXR1cm4gZH12YXIga2E9T2JqZWN0LnByb3RvdHlwZTtmdW5jdGlvbiBidCh0KXt2YXIgcj10JiZ0LmNvbnN0cnVjdG9yLGU9dHlwZW9mIHI9PSJmdW5jdGlvbiImJnIucHJvdG90eXBlfHxrYTtyZXR1cm4gdD09PWV9ZnVuY3Rpb24gcnModCxyKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQocihlKSl9fXZhciBPYT1ycyhPYmplY3Qua2V5cyxPYmplY3QpLExhPU9hLERhPU9iamVjdC5wcm90b3R5cGUsTmE9RGEuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gc3ModCl7aWYoIWJ0KHQpKXJldHVybiBMYSh0KTt2YXIgcj1bXTtmb3IodmFyIGUgaW4gT2JqZWN0KHQpKU5hLmNhbGwodCxlKSYmZSE9ImNvbnN0cnVjdG9yIiYmci5wdXNoKGUpO3JldHVybiByfWZ1bmN0aW9uIE50KHQpe3JldHVybiB0IT1udWxsJiZKcih0Lmxlbmd0aCkmJiFqcih0KX1mdW5jdGlvbiBWdCh0KXtyZXR1cm4gTnQodCk/dHModCk6c3ModCl9ZnVuY3Rpb24gVmEodCxyKXtyZXR1cm4gdCYmeXQocixWdChyKSx0KX1mdW5jdGlvbiBGYSh0KXt2YXIgcj1bXTtpZih0IT1udWxsKWZvcih2YXIgZSBpbiBPYmplY3QodCkpci5wdXNoKGUpO3JldHVybiByfXZhciBCYT1PYmplY3QucHJvdG90eXBlLHhhPUJhLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIGphKHQpe2lmKCFBZSh0KSlyZXR1cm4gRmEodCk7dmFyIHI9YnQodCksZT1bXTtmb3IodmFyIHMgaW4gdClzPT0iY29uc3RydWN0b3IiJiYocnx8IXhhLmNhbGwodCxzKSl8fGUucHVzaChzKTtyZXR1cm4gZX1mdW5jdGlvbiBGdCh0KXtyZXR1cm4gTnQodCk/dHModCwhMCk6amEodCl9ZnVuY3Rpb24gVWEodCxyKXtyZXR1cm4gdCYmeXQocixGdChyKSx0KX12YXIgbnM9dHlwZW9mIGV4cG9ydHM9PSJvYmplY3QiJiZleHBvcnRzJiYhZXhwb3J0cy5ub2RlVHlwZSYmZXhwb3J0cyxpcz1ucyYmdHlwZW9mIG1vZHVsZT09Im9iamVjdCImJm1vZHVsZSYmIW1vZHVsZS5ub2RlVHlwZSYmbW9kdWxlLCRhPWlzJiZpcy5leHBvcnRzPT09bnMsYXM9JGE/WC5CdWZmZXI6dm9pZCAwLG9zPWFzP2FzLmFsbG9jVW5zYWZlOnZvaWQgMDtmdW5jdGlvbiBIYSh0LHIpe2lmKHIpcmV0dXJuIHQuc2xpY2UoKTt2YXIgZT10Lmxlbmd0aCxzPW9zP29zKGUpOm5ldyB0LmNvbnN0cnVjdG9yKGUpO3JldHVybiB0LmNvcHkocyksc31mdW5jdGlvbiBLYSh0LHIpe3ZhciBlPS0xLHM9dC5sZW5ndGg7Zm9yKHJ8fChyPUFycmF5KHMpKTsrK2U8czspcltlXT10W2VdO3JldHVybiByfWZ1bmN0aW9uIHphKHQscil7Zm9yKHZhciBlPS0xLHM9dD09bnVsbD8wOnQubGVuZ3RoLG49MCxpPVtdOysrZTxzOyl7dmFyIGE9dFtlXTtyKGEsZSx0KSYmKGlbbisrXT1hKX1yZXR1cm4gaX1mdW5jdGlvbiBjcygpe3JldHVybltdfXZhciBXYT1PYmplY3QucHJvdG90eXBlLEdhPVdhLnByb3BlcnR5SXNFbnVtZXJhYmxlLGRzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMscWE9ZHM/ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PW51bGw/W106KHQ9T2JqZWN0KHQpLHphKGRzKHQpLGZ1bmN0aW9uKHIpe3JldHVybiBHYS5jYWxsKHQscil9KSl9OmNzLEJ0PXFhO2Z1bmN0aW9uIFlhKHQscil7cmV0dXJuIHl0KHQsQnQodCkscil9ZnVuY3Rpb24gbHModCxyKXtmb3IodmFyIGU9LTEscz1yLmxlbmd0aCxuPXQubGVuZ3RoOysrZTxzOyl0W24rZV09cltlXTtyZXR1cm4gdH12YXIgUWE9cnMoT2JqZWN0LmdldFByb3RvdHlwZU9mLE9iamVjdCksdXM9UWEsSmE9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxYYT1KYT9mdW5jdGlvbih0KXtmb3IodmFyIHI9W107dDspbHMocixCdCh0KSksdD11cyh0KTtyZXR1cm4gcn06Y3MscHM9WGE7ZnVuY3Rpb24gWmEodCxyKXtyZXR1cm4geXQodCxwcyh0KSxyKX1mdW5jdGlvbiBocyh0LHIsZSl7dmFyIHM9cih0KTtyZXR1cm4gdnQodCk/czpscyhzLGUodCkpfWZ1bmN0aW9uIGVvKHQpe3JldHVybiBocyh0LFZ0LEJ0KX1mdW5jdGlvbiB0byh0KXtyZXR1cm4gaHModCxGdCxwcyl9dmFyIHJvPXVlKFgsIkRhdGFWaWV3IikseHQ9cm8sc289dWUoWCwiUHJvbWlzZSIpLGp0PXNvLG5vPXVlKFgsIlNldCIpLFV0PW5vLGlvPXVlKFgsIldlYWtNYXAiKSwkdD1pbyxmcz0iW29iamVjdCBNYXBdIixhbz0iW29iamVjdCBPYmplY3RdIixtcz0iW29iamVjdCBQcm9taXNlXSIsZ3M9IltvYmplY3QgU2V0XSIsU3M9IltvYmplY3QgV2Vha01hcF0iLHlzPSJbb2JqZWN0IERhdGFWaWV3XSIsb289bGUoeHQpLGNvPWxlKGtlKSxsbz1sZShqdCksdW89bGUoVXQpLHBvPWxlKCR0KSxoZT1NZTsoeHQmJmhlKG5ldyB4dChuZXcgQXJyYXlCdWZmZXIoMSkpKSE9eXN8fGtlJiZoZShuZXcga2UpIT1mc3x8anQmJmhlKGp0LnJlc29sdmUoKSkhPW1zfHxVdCYmaGUobmV3IFV0KSE9Z3N8fCR0JiZoZShuZXcgJHQpIT1TcykmJihoZT1mdW5jdGlvbih0KXt2YXIgcj1NZSh0KSxlPXI9PWFvP3QuY29uc3RydWN0b3I6dm9pZCAwLHM9ZT9sZShlKToiIjtpZihzKXN3aXRjaChzKXtjYXNlIG9vOnJldHVybiB5cztjYXNlIGNvOnJldHVybiBmcztjYXNlIGxvOnJldHVybiBtcztjYXNlIHVvOnJldHVybiBncztjYXNlIHBvOnJldHVybiBTc31yZXR1cm4gcn0pO3ZhciBFdD1oZSxobz1PYmplY3QucHJvdG90eXBlLGZvPWhvLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIG1vKHQpe3ZhciByPXQubGVuZ3RoLGU9bmV3IHQuY29uc3RydWN0b3Iocik7cmV0dXJuIHImJnR5cGVvZiB0WzBdPT0ic3RyaW5nIiYmZm8uY2FsbCh0LCJpbmRleCIpJiYoZS5pbmRleD10LmluZGV4LGUuaW5wdXQ9dC5pbnB1dCksZX12YXIgZ289WC5VaW50OEFycmF5LHZzPWdvO2Z1bmN0aW9uIEh0KHQpe3ZhciByPW5ldyB0LmNvbnN0cnVjdG9yKHQuYnl0ZUxlbmd0aCk7cmV0dXJuIG5ldyB2cyhyKS5zZXQobmV3IHZzKHQpKSxyfWZ1bmN0aW9uIFNvKHQscil7dmFyIGU9cj9IdCh0LmJ1ZmZlcik6dC5idWZmZXI7cmV0dXJuIG5ldyB0LmNvbnN0cnVjdG9yKGUsdC5ieXRlT2Zmc2V0LHQuYnl0ZUxlbmd0aCl9dmFyIHlvPS9cdyokLztmdW5jdGlvbiB2byh0KXt2YXIgcj1uZXcgdC5jb25zdHJ1Y3Rvcih0LnNvdXJjZSx5by5leGVjKHQpKTtyZXR1cm4gci5sYXN0SW5kZXg9dC5sYXN0SW5kZXgscn12YXIgYnM9RWU/RWUucHJvdG90eXBlOnZvaWQgMCxFcz1icz9icy52YWx1ZU9mOnZvaWQgMDtmdW5jdGlvbiBibyh0KXtyZXR1cm4gRXM/T2JqZWN0KEVzLmNhbGwodCkpOnt9fWZ1bmN0aW9uIEVvKHQscil7dmFyIGU9cj9IdCh0LmJ1ZmZlcik6dC5idWZmZXI7cmV0dXJuIG5ldyB0LmNvbnN0cnVjdG9yKGUsdC5ieXRlT2Zmc2V0LHQubGVuZ3RoKX12YXIgVG89IltvYmplY3QgQm9vbGVhbl0iLF9vPSJbb2JqZWN0IERhdGVdIixSbz0iW29iamVjdCBNYXBdIixQbz0iW29iamVjdCBOdW1iZXJdIixDbz0iW29iamVjdCBSZWdFeHBdIixJbz0iW29iamVjdCBTZXRdIix3bz0iW29iamVjdCBTdHJpbmddIixNbz0iW29iamVjdCBTeW1ib2xdIixBbz0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLGtvPSJbb2JqZWN0IERhdGFWaWV3XSIsT289IltvYmplY3QgRmxvYXQzMkFycmF5XSIsTG89IltvYmplY3QgRmxvYXQ2NEFycmF5XSIsRG89IltvYmplY3QgSW50OEFycmF5XSIsTm89IltvYmplY3QgSW50MTZBcnJheV0iLFZvPSJbb2JqZWN0IEludDMyQXJyYXldIixGbz0iW29iamVjdCBVaW50OEFycmF5XSIsQm89IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIix4bz0iW29iamVjdCBVaW50MTZBcnJheV0iLGpvPSJbb2JqZWN0IFVpbnQzMkFycmF5XSI7ZnVuY3Rpb24gVW8odCxyLGUpe3ZhciBzPXQuY29uc3RydWN0b3I7c3dpdGNoKHIpe2Nhc2UgQW86cmV0dXJuIEh0KHQpO2Nhc2UgVG86Y2FzZSBfbzpyZXR1cm4gbmV3IHMoK3QpO2Nhc2Uga286cmV0dXJuIFNvKHQsZSk7Y2FzZSBPbzpjYXNlIExvOmNhc2UgRG86Y2FzZSBObzpjYXNlIFZvOmNhc2UgRm86Y2FzZSBCbzpjYXNlIHhvOmNhc2Ugam86cmV0dXJuIEVvKHQsZSk7Y2FzZSBSbzpyZXR1cm4gbmV3IHM7Y2FzZSBQbzpjYXNlIHdvOnJldHVybiBuZXcgcyh0KTtjYXNlIENvOnJldHVybiB2byh0KTtjYXNlIElvOnJldHVybiBuZXcgcztjYXNlIE1vOnJldHVybiBibyh0KX19dmFyIFRzPU9iamVjdC5jcmVhdGUsJG89ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiBmdW5jdGlvbihyKXtpZighQWUocikpcmV0dXJue307aWYoVHMpcmV0dXJuIFRzKHIpO3QucHJvdG90eXBlPXI7dmFyIGU9bmV3IHQ7cmV0dXJuIHQucHJvdG90eXBlPXZvaWQgMCxlfX0oKSxIbz0kbztmdW5jdGlvbiBLbyh0KXtyZXR1cm4gdHlwZW9mIHQuY29uc3RydWN0b3I9PSJmdW5jdGlvbiImJiFidCh0KT9Ibyh1cyh0KSk6e319dmFyIHpvPSJbb2JqZWN0IE1hcF0iO2Z1bmN0aW9uIFdvKHQpe3JldHVybiBMZSh0KSYmRXQodCk9PXpvfXZhciBfcz1SZSYmUmUuaXNNYXAsR289X3M/THQoX3MpOldvLHFvPUdvLFlvPSJbb2JqZWN0IFNldF0iO2Z1bmN0aW9uIFFvKHQpe3JldHVybiBMZSh0KSYmRXQodCk9PVlvfXZhciBScz1SZSYmUmUuaXNTZXQsSm89UnM/THQoUnMpOlFvLFhvPUpvLFpvPTEsZWM9Mix0Yz00LFBzPSJbb2JqZWN0IEFyZ3VtZW50c10iLHJjPSJbb2JqZWN0IEFycmF5XSIsc2M9IltvYmplY3QgQm9vbGVhbl0iLG5jPSJbb2JqZWN0IERhdGVdIixpYz0iW29iamVjdCBFcnJvcl0iLENzPSJbb2JqZWN0IEZ1bmN0aW9uXSIsYWM9IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIixvYz0iW29iamVjdCBNYXBdIixjYz0iW29iamVjdCBOdW1iZXJdIixJcz0iW29iamVjdCBPYmplY3RdIixkYz0iW29iamVjdCBSZWdFeHBdIixsYz0iW29iamVjdCBTZXRdIix1Yz0iW29iamVjdCBTdHJpbmddIixwYz0iW29iamVjdCBTeW1ib2xdIixoYz0iW29iamVjdCBXZWFrTWFwXSIsZmM9IltvYmplY3QgQXJyYXlCdWZmZXJdIixtYz0iW29iamVjdCBEYXRhVmlld10iLGdjPSJbb2JqZWN0IEZsb2F0MzJBcnJheV0iLFNjPSJbb2JqZWN0IEZsb2F0NjRBcnJheV0iLHljPSJbb2JqZWN0IEludDhBcnJheV0iLHZjPSJbb2JqZWN0IEludDE2QXJyYXldIixiYz0iW29iamVjdCBJbnQzMkFycmF5XSIsRWM9IltvYmplY3QgVWludDhBcnJheV0iLFRjPSJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSIsX2M9IltvYmplY3QgVWludDE2QXJyYXldIixSYz0iW29iamVjdCBVaW50MzJBcnJheV0iLEY9e307RltQc109RltyY109RltmY109RlttY109RltzY109RltuY109RltnY109RltTY109Rlt5Y109Rlt2Y109RltiY109RltvY109RltjY109RltJc109RltkY109RltsY109Rlt1Y109RltwY109RltFY109RltUY109RltfY109RltSY109ITAsRltpY109RltDc109RltoY109ITE7ZnVuY3Rpb24gVHQodCxyLGUscyxuLGkpe3ZhciBhLGQ9ciZabyxvPXImZWMsbD1yJnRjO2lmKGUmJihhPW4/ZSh0LHMsbixpKTplKHQpKSxhIT09dm9pZCAwKXJldHVybiBhO2lmKCFBZSh0KSlyZXR1cm4gdDt2YXIgZj12dCh0KTtpZihmKXtpZihhPW1vKHQpLCFkKXJldHVybiBLYSh0LGEpfWVsc2V7dmFyIHk9RXQodCksRT15PT1Dc3x8eT09YWM7aWYoT3QodCkpcmV0dXJuIEhhKHQsZCk7aWYoeT09SXN8fHk9PVBzfHxFJiYhbil7aWYoYT1vfHxFP3t9OktvKHQpLCFkKXJldHVybiBvP1phKHQsVWEoYSx0KSk6WWEodCxWYShhLHQpKX1lbHNle2lmKCFGW3ldKXJldHVybiBuP3Q6e307YT1Vbyh0LHksZCl9fWl8fChpPW5ldyBfZSk7dmFyIHc9aS5nZXQodCk7aWYodylyZXR1cm4gdztpLnNldCh0LGEpLFhvKHQpP3QuZm9yRWFjaChmdW5jdGlvbihMKXthLmFkZChUdChMLHIsZSxMLHQsaSkpfSk6cW8odCkmJnQuZm9yRWFjaChmdW5jdGlvbihMLEgpe2Euc2V0KEgsVHQoTCxyLGUsSCx0LGkpKX0pO3ZhciB4PWw/bz90bzplbzpvP0Z0OlZ0LFU9Zj92b2lkIDA6eCh0KTtyZXR1cm4gRmkoVXx8dCxmdW5jdGlvbihMLEgpe1UmJihIPUwsTD10W0hdKSxLcihhLEgsVHQoTCxyLGUsSCx0LGkpKX0pLGF9dmFyIFBjPTEsQ2M9NDtmdW5jdGlvbiBJYyh0KXtyZXR1cm4gVHQodCxQY3xDYyl9dmFyIHdzPSJoWGdVOFdjOHB3dUdOcTltczVxOUhoIjt0eXBlb2YgcHJvY2VzcyE9InVuZGVmaW5lZCImJihacz1wcm9jZXNzPT1udWxsP3ZvaWQgMDpwcm9jZXNzLmVudikhPW51bGwmJlpzLkZMQUdTTUlUSF9FTlZJUk9OTUVOVF9LRVkmJih3cz1wcm9jZXNzLmVudi5GTEFHU01JVEhfRU5WSVJPTk1FTlRfS0VZKTtmdW5jdGlvbiB3Yyh0PVtdKXtjb25zdCByPXt9O3JldHVybiB0LmZvckVhY2goZT0+e3JbZS5mZWF0dXJlLm5hbWVdPXtlbmFibGVkOmUuZW5hYmxlZCx2YWx1ZTplLmZlYXR1cmVfc3RhdGVfdmFsdWV9fSkscn12YXIgTWM9Y2xhc3N7Y29uc3RydWN0b3IodD13cyl7cCh0aGlzLCJmbGFncyIse30pO3AodGhpcywiZW52aXJvbm1lbnRLZXkiLG51bGwpO3RoaXMuZW52aXJvbm1lbnRLZXk9dH1pZGVudGlmeUFuZEZldGNoRmxhZ3NXaXRoUmV0cnkoZCl7cmV0dXJuIEkodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24qKHtwcmltYXJ5RW5kcG9pbnQ6dCxzZWNvbmRhcnlFbmRwb2ludDpyLGZvcmNlRXZhbHVhdGU6ZSx0aW1lb3V0OnMsdW5pcXVlSWRlbnRpZmllcjpuLHRyYWl0c09iajppLGxvZ2dlcjphfSl7Y29uc3Qgbz1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGkpKSxsPU9iamVjdC5lbnRyaWVzKG8pLm1hcCh5PT4oe3RyYWl0X2tleTp5WzBdLHRyYWl0X3ZhbHVlOnlbMV19KSksZj1bdCxyLHJdO2Zvcihjb25zdCB5IG9mIGYpdHJ5e2NvbnN0IEU9bmV3IEFib3J0Q29udHJvbGxlcix3PXNldFRpbWVvdXQoKCk9PkUuYWJvcnQoKSxzKSx4PWBfJHsoTWF0aC5yYW5kb20oKSsxKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIpfWAsVT15aWVsZCBmZXRjaChgaHR0cHM6Ly8ke3l9L2FwaS92MS9pZGVudGl0aWVzL2Ase21ldGhvZDoiUE9TVCIsaGVhZGVyczp7IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24iLCJYLUVudmlyb25tZW50LUtleSI6dGhpcy5lbnZpcm9ubWVudEtleX0sYm9keTpKU09OLnN0cmluZ2lmeSh7aWRlbnRpZmllcjpuKyhlP3g6IiIpLHRyYWl0czpsfSksc2lnbmFsOkUuc2lnbmFsfSk7aWYoY2xlYXJUaW1lb3V0KHcpLCFVLm9rKXRocm93IG5ldyBFcnJvcihgUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgJHtVLnN0YXR1c31gKTtjb25zdCBMPXlpZWxkIFUuanNvbigpO3JldHVybiB3YyhMLmZsYWdzfHxbXSl9Y2F0Y2goRSl7YS5lcnJvcigiRmxhZ3NtaXRoIGlkZW50aWZ5IGZhaWxlZCEhIix7ZXJyb3I6RSx1cmw6eX0pfXJldHVybnt9fSl9aWRlbnRpZnkoYSl7cmV0dXJuIEkodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24qKHQscj17fSxlPSExLHM9NWUzLG49ImVkZ2UuYXBpLmZsYWdzbWl0aC5jb20iLGk9Y29uc29sZSl7cmV0dXJuIHRoaXMuZmxhZ3M9eWllbGQgdGhpcy5pZGVudGlmeUFuZEZldGNoRmxhZ3NXaXRoUmV0cnkoe3RyYWl0c09iajpyLHVuaXF1ZUlkZW50aWZpZXI6dCxmb3JjZUV2YWx1YXRlOmUsdGltZW91dDpzLHByaW1hcnlFbmRwb2ludDpuLHNlY29uZGFyeUVuZHBvaW50OiJlZGdlLmFwaS5mbGFnc21pdGguY29tIixsb2dnZXI6aX0pLHRoaXMuZmxhZ3N9KX1nZXRWYWx1ZSh0KXtyZXR1cm4gdGhpcy5mbGFncyYmdGhpcy5mbGFnc1t0XSYmdGhpcy5mbGFnc1t0XS52YWx1ZX1oYXNGZWF0dXJlKHQpe3JldHVybiB0aGlzLmZsYWdzJiZ0aGlzLmZsYWdzW3RdJiZ0aGlzLmZsYWdzW3RdLmVuYWJsZWR9Z2V0QWxsRmxhZ3MoKXtyZXR1cm4gdGhpcy5mbGFnc319O2Z1bmN0aW9uIEFjKHQpe3JldHVybiBuZXcgTWModCl9dmFyIE1zPVstMiwtMSwwLDEsMl0sa2M9WzAsMSwyLDMsNF07ZnVuY3Rpb24gT2ModCl7dD10LnRyaW0oKTtsZXQgcj0iMCIsZT0iMCIscz0iMCI7cmV0dXJuIHQubGVuZ3RoPT00PyhyPWAweCR7dFsxXX0ke3RbMV19YCxlPWAweCR7dFsyXX0ke3RbMl19YCxzPWAweCR7dFszXX0ke3RbM119YCk6dC5sZW5ndGg+NiYmKHI9YDB4JHt0WzFdfSR7dFsyXX1gLGU9YDB4JHt0WzNdfSR7dFs0XX1gLHM9YDB4JHt0WzVdfSR7dFs2XX1gKSxbK3IsK2UsK3NdfXZhciBMYz0odCxyLGUpPT57bGV0IHMsbixpO2lmKHI9PTApcz1uPWk9ZTtlbHNle2NvbnN0IGE9KGwsZix5KT0+KHk8MCYmKHkrPTEpLHk+MSYmKHktPTEpLHk8LjE2NjY2NjY2NjY2NjY2NjY2P2wrKGYtbCkqNip5Onk8LjU/Zjp5PC42NjY2NjY2NjY2NjY2NjY2P2wrKGYtbCkqKC42NjY2NjY2NjY2NjY2NjY2LXkpKjY6bCksZD1lPC41P2UqKDErcik6ZStyLWUqcixvPTIqZS1kO3M9YShvLGQsdCsxLzMpLG49YShvLGQsdCksaT1hKG8sZCx0LTEvMyl9cmV0dXJuW01hdGgucm91bmQocyoyNTUpLE1hdGgucm91bmQobioyNTUpLE1hdGgucm91bmQoaSoyNTUpXX0sRGM9KHQscixlKT0+e3QvPTI1NSxyLz0yNTUsZS89MjU1O2NvbnN0IHM9TWF0aC5tYXgodCxyLGUpLG49TWF0aC5taW4odCxyLGUpO2xldCBpLGE7Y29uc3QgZD0ocytuKS8yO2lmKHM9PW4paT1hPTA7ZWxzZXtjb25zdCBvPXMtbjtzd2l0Y2goYT1kPi41P28vKDItcy1uKTpvLyhzK24pLHMpe2Nhc2UgdDppPShyLWUpL28rKHI8ZT82OjApO2JyZWFrO2Nhc2UgcjppPShlLXQpL28rMjticmVhaztjYXNlIGU6aT0odC1yKS9vKzQ7YnJlYWt9aS89Nn1yZXR1cm5baSxhLGRdfSxOYz0odCxyLGUpPT57Y29uc3Qgcz1uPT5uLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCIwIik7cmV0dXJuYCMke3ModCl9JHtzKHIpfSR7cyhlKX1gfSxBcz0odCxyPU1zLGU9LjQpPT57Y29uc3Qgcz1bXSxbbixpLGFdPU9jKHQpLFtkLG8sbF09RGMobixpLGEpLGY9TWF0aC5yb3VuZChsKjEwMCk7Zj43MD9lPS44OmY+NjA/ZT0uOTpmPDEwP2U9LjA3NTpmPDQyJiYoZT0uMyk7Y29uc3QgeT1yLmZpbmRJbmRleChMPT5MPT09MCk7aWYoeT09PS0xKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCByZWR1Y2VyIHByb3ZpZGVkLCBpdCBtdXN0IGNvbnRhaW4gYXRsZWFzdCBvbmUgemVybyIpO2NvbnN0IEU9NS15LHc9eSsxLHg9KDEwMC1mKS9FLFU9Zi93O2Zvcihjb25zdCBMIG9mIHIpe2xldCBIO0w8MD9IPWYrTCpVKmU6TD4wP0g9ZitMKngqZTpIPWY7Y29uc3RbWix5ZSx2ZV09TGMoZCxvLEgvMTAwKTtzLnB1c2goTmMoWix5ZSx2ZSkpfXJldHVybiBzfSxrcz17ZGFyazp7YmFja2dyb3VuZDp7MWUzOiIjMjUyNTI1Iiw5MDA6IiMyRjJGMkYiLDgwMDoiIzMyMzIzMiIsNzAwOiIjM0UzRTNFIiw2MDA6IiM0QTRBNEEifSx0ZXh0OiIjRjVGNUY1IiwidmlkZW8tYmciOiIjMUMxQzFDIn0sbGlnaHQ6e2JhY2tncm91bmQ6ezFlMzoiI0ZGRkZGRiIsOTAwOiIjRjVGNUY1Iiw4MDA6IiNFQkVCRUIiLDcwMDoiI0UwRTBFMCIsNjAwOiIjRDZENkQ2In0sdGV4dDoiIzExMTExMSIsInRleHQtb24tYnJhbmQiOiIjZmZmZmZmIiwidmlkZW8tYmciOiIjREFEQURBIn19LFZjPXQ9Pntjb25zdFtyLGUscyxuLGldPUFzKHQsTXMpO3JldHVybnszMDA6ciw0MDA6ZSw1MDA6cyw2MDA6biw3MDA6aX19LEZjPXQ9PntpZih0PT09IiNGRkZGRkYiKXJldHVybiBrcy5saWdodC5iYWNrZ3JvdW5kO2lmKHQ9PT0iIzAwMDAwMCIpcmV0dXJuIGtzLmRhcmsuYmFja2dyb3VuZDtjb25zdFtyLGUscyxuLGldPUFzKHQsa2MpO3JldHVybnsxZTM6ciw5MDA6ZSw4MDA6cyw3MDA6biw2MDA6aX19LEJjPXtib3JkZXJfcmFkaXVzOiJyb3VuZGVkIixib3JkZXJfd2lkdGg6InRoaW4iLHNwYWNpbmdfYmFzZTo0LHRoZW1lOiJkYXJrIixjb2xvcnM6e2JyYW5kOlZjKCIjMjE2MEZEIiksYmFja2dyb3VuZDpGYygiIzE0MTQxNCIpLGRhbmdlcjoiI0ZGMkQyRCIsdGV4dDoiI0VFRUVFRSIsdGV4dF9vbl9icmFuZDoiI0VFRUVFRSIsc3VjY2VzczoiIzYyQTUwNCIsdmlkZW9fYmc6IiMxOTE5MTkiLHdhcm5pbmc6IiNGRkNEMDcifX07ZnVuY3Rpb24gT3MoKXtyZXR1cm4gSWMoQmMpfU9zKCksT3MoKTtjbGFzcyB4Y3tjb25zdHJ1Y3Rvcigpe0l0KHRoaXMsRmUsdm9pZCAwKX1nZXQgdGVsZW1ldHJ5KCl7dmFyIHI7cmV0dXJuKHI9ZWUodGhpcyxGZSkpPT1udWxsP3ZvaWQgMDpyLmdldFZhbHVlKCJ0ZWxlbWV0cnkiKX1pbml0KHIpe0NlKHRoaXMsRmUscil9aW5mbyhyLGUscyl7dmFyIG47KG49dGhpcy50ZWxlbWV0cnkpPT1udWxsfHxuLmFkZExvZ0luQ3VycmVudFNwYW4oImluZm8iLHIsZSxzKX1lcnJvcihyLGUscyl7dmFyIG47KG49dGhpcy50ZWxlbWV0cnkpPT1udWxsfHxuLmFkZExvZ0luQ3VycmVudFNwYW4oImVycm9yIixyLGUscyl9ZGVidWcocixlLHMpe3ZhciBuOyhuPXRoaXMudGVsZW1ldHJ5KT09bnVsbHx8bi5hZGRMb2dJbkN1cnJlbnRTcGFuKCJkZWJ1ZyIscixlLHMpfWxvZyhyLGUscyl7dmFyIG47KG49dGhpcy50ZWxlbWV0cnkpPT1udWxsfHxuLmFkZExvZ0luQ3VycmVudFNwYW4oImxvZyIscixlLHMpfXdhcm4ocixlLHMpe3ZhciBuOyhuPXRoaXMudGVsZW1ldHJ5KT09bnVsbHx8bi5hZGRMb2dJbkN1cnJlbnRTcGFuKCJ3YXJuIixyLGUscyl9fUZlPW5ldyBXZWFrTWFwO2NvbnN0IHRyPWNsYXNzIGV4dGVuZHMgcS5FdmVudEVtaXR0ZXJ7Y29uc3RydWN0b3IoZSl7c3VwZXIoKTtJdCh0aGlzLG5lLHZvaWQgMCk7SXQodGhpcyxpZSx2b2lkIDApO3AodGhpcywiYXN5bmNQcm9taXNlVGltZW91dCIpO3AodGhpcywibG9nZ2VyIik7dGhpcy5sb2dnZXI9ZSxDZSh0aGlzLG5lLG5ldyBNYXApLENlKHRoaXMsaWUsbmV3IE1hcCksdGhpcy5hc3luY1Byb21pc2VUaW1lb3V0PThlM31lbWl0QXN5bmMoZSwuLi5zKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7ZWUodGhpcyxuZSkuc2V0KGUsW10pO2NvbnN0IG49ZWUodGhpcyxpZSkuZ2V0KGUpLm1hcCgoKT0+bmV3IFByb21pc2UoaT0+e2VlKHRoaXMsbmUpLmdldChlKS5wdXNoKGkpfSkpO3JuKHRyLnByb3RvdHlwZSx0aGlzLCJlbWl0IikuY2FsbCh0aGlzLGUsLi4ucykseWllbGQgUHJvbWlzZS5yYWNlKFtQcm9taXNlLmFsbChuKSxuZXcgUHJvbWlzZSgoaSxhKT0+c2V0VGltZW91dCgoKT0+YShuZXcgRXJyb3IoYGVtaXRBc3luYyBmYWlsZWQgdG8gcmVzb2x2ZSBmb3IgZXZlbnQgJHtlfS5gKSksdGhpcy5hc3luY1Byb21pc2VUaW1lb3V0KSldKSxlZSh0aGlzLG5lKS5kZWxldGUoZSl9KX1vbkFzeW5jKGUscyl7Y29uc3Qgbj1lZSh0aGlzLG5lKSxpPSguLi5hKT0+SSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIG87dHJ5e3lpZWxkIHMoLi4uYSl9Y2F0Y2gobCl7dGhpcy5sb2dnZXIuZXJyb3IoIltvbkFzeW5jXSIse2Vycm9yOmx9KX1jb25zdCBkPShvPW4uZ2V0KGUpKT09bnVsbD92b2lkIDA6by5zaGlmdCgpO2Q9PW51bGx8fGQoKX0pO3JldHVybiBlZSh0aGlzLGllKS5nZXQoZSl8fGVlKHRoaXMsaWUpLnNldChlLFtdKSxlZSh0aGlzLGllKS5nZXQoZSkucHVzaChpKSxzdXBlci5vbihlLGkpfXJlc2V0KCl7Q2UodGhpcyxuZSxuZXcgTWFwKSxDZSh0aGlzLGllLG5ldyBNYXApLHN1cGVyLnJlbW92ZUFsbExpc3RlbmVycygpfX07bGV0IEt0PXRyO25lPW5ldyBXZWFrTWFwLGllPW5ldyBXZWFrTWFwO3ZhciBfdCxqYz1uZXcgVWludDhBcnJheSgxNik7ZnVuY3Rpb24gVWMoKXtpZighX3QmJihfdD10eXBlb2YgY3J5cHRvIT0idW5kZWZpbmVkIiYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcyYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKGNyeXB0byl8fHR5cGVvZiBtc0NyeXB0byE9InVuZGVmaW5lZCImJnR5cGVvZiBtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXM9PSJmdW5jdGlvbiImJm1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKG1zQ3J5cHRvKSwhX3QpKXRocm93IG5ldyBFcnJvcigiY3J5cHRvLmdldFJhbmRvbVZhbHVlcygpIG5vdCBzdXBwb3J0ZWQuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQjZ2V0cmFuZG9tdmFsdWVzLW5vdC1zdXBwb3J0ZWQiKTtyZXR1cm4gX3QoamMpfXZhciAkYz0vXig/OlswLTlhLWZdezh9LVswLTlhLWZdezR9LVsxLTVdWzAtOWEtZl17M30tWzg5YWJdWzAtOWEtZl17M30tWzAtOWEtZl17MTJ9fDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCkkL2k7ZnVuY3Rpb24gSGModCl7cmV0dXJuIHR5cGVvZiB0PT0ic3RyaW5nIiYmJGMudGVzdCh0KX1mb3IodmFyIHo9W10senQ9MDt6dDwyNTY7Kyt6dCl6LnB1c2goKHp0KzI1NikudG9TdHJpbmcoMTYpLnN1YnN0cigxKSk7ZnVuY3Rpb24gS2ModCl7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOjAsZT0oelt0W3IrMF1dK3pbdFtyKzFdXSt6W3RbcisyXV0relt0W3IrM11dKyItIit6W3Rbcis0XV0relt0W3IrNV1dKyItIit6W3Rbcis2XV0relt0W3IrN11dKyItIit6W3Rbcis4XV0relt0W3IrOV1dKyItIit6W3RbcisxMF1dK3pbdFtyKzExXV0relt0W3IrMTJdXSt6W3RbcisxM11dK3pbdFtyKzE0XV0relt0W3IrMTVdXSkudG9Mb3dlckNhc2UoKTtpZighSGMoZSkpdGhyb3cgVHlwZUVycm9yKCJTdHJpbmdpZmllZCBVVUlEIGlzIGludmFsaWQiKTtyZXR1cm4gZX1mdW5jdGlvbiB6Yyh0LHIsZSl7dD10fHx7fTt2YXIgcz10LnJhbmRvbXx8KHQucm5nfHxVYykoKTtpZihzWzZdPXNbNl0mMTV8NjQsc1s4XT1zWzhdJjYzfDEyOCxyKXtlPWV8fDA7Zm9yKHZhciBuPTA7bjwxNjsrK24pcltlK25dPXNbbl07cmV0dXJuIHJ9cmV0dXJuIEtjKHMpfXZhciBXYz0iW29iamVjdCBNYXBdIixHYz0iW29iamVjdCBTZXRdIixxYz1PYmplY3QucHJvdG90eXBlLFljPXFjLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIFFjKHQpe2lmKHQ9PW51bGwpcmV0dXJuITA7aWYoTnQodCkmJih2dCh0KXx8dHlwZW9mIHQ9PSJzdHJpbmcifHx0eXBlb2YgdC5zcGxpY2U9PSJmdW5jdGlvbiJ8fE90KHQpfHxlcyh0KXx8R3IodCkpKXJldHVybiF0Lmxlbmd0aDt2YXIgcj1FdCh0KTtpZihyPT1XY3x8cj09R2MpcmV0dXJuIXQuc2l6ZTtpZihidCh0KSlyZXR1cm4hc3ModCkubGVuZ3RoO2Zvcih2YXIgZSBpbiB0KWlmKFljLmNhbGwodCxlKSlyZXR1cm4hMTtyZXR1cm4hMH1jb25zdCBXdD17UFJPUEFHQVRFX0tJQ0tfQUxMOiJwcm9wYWdhdGVfa2lja19hY3Jvc3Nfcm9vbXMiLFJFRlJFU0hfSURfT05fRElTQ09OTkVDVElPTjoicmVmcmVzaF9pZF9vbl9kaXNjb25uZWN0aW9uIixTS0lQX09URUxfVFJBQ0VTOiJza2lwX290ZWxfdHJhY2VzIixDRl9UUkFOU1BPUlRfRk9SQ0VfUkVMQVlfT05fSUNFX0ZBSUxFRDoiY2ZfdHJhbnNwb3J0X2ZvcmNlX3JlbGF5X29uX2ljZV9mYWlsZWQiLExPR19MRVZFTDoibG9nX2xldmVsIixWMV9QTFVHSU5TOiJ2MV9wbHVnaW5zIixMSVZFU1RSRUFNOiJmZWF0X2xpdmVzdHJlYW0iLFZBTF9NSU5fRlJBTUVSQVRFOiJ2YWxfbWluX2ZyYW1lcmF0ZSIsU0NSRUVFTlNIQVJFX0VSUl9IQUNLOiJzY3JlZW5zaGFyZV9lcnJfaGFjayIsU0NSRUVFTlNIQVJFX0NPTlNUUkFJTlRTX1JFVFJZOiJzY3JlZW5zaGFyZV9jb25zdHJhaW50c19yZXRyeSIsU0NSRUVOU0hBUkVfQ09OU1RSQUlOVFM6InNjcmVlbnNoYXJlX2NvbnN0cmFpbnRzIixPQlNfUVVBTElUWToib2JzX3F1YWxpdHkiLEFMTE9XX1NBRkFSSV9NRURJQV9NSURETEVXQVJFUzoiYWxsb3dfc2FmYXJpX21lZGlhX21pZGRsZXdhcmVzIixFWFBfUkVTSEFSRToiZXhwX3Jlc2hhcmUiLFNLSVBfU0VUVElOR19JTl9VU0VfREVWSUNFOiJza2lwX3NldHRpbmdfaW5fdXNlX2RldmljZSIsUFJFQ0FMTF9CQU5EV0lEVEhfVEVTVDoicHJlY2FsbF9iYW5kd2lkdGhfdGVzdCIsREVCVUdfU09DS0VUX0pPSU46ImRlYnVnX3NvY2tldF9qb2luIixGT1JDRV9SRUxBWToiZm9yY2VfcmVsYXkiLEZPUkNFX1ZJREVPX0NPREVDOiJmb3JjZV92aWRlb19jb2RlYyIsVFJBQ0tfSElOVDoidHJhY2tfaGludCIsUFJFQ1JFQVRFX1BST0RVQ0VSUzoicHJlY3JlYXRlX3Byb2R1Y2VycyIsRElTQUJMRV9PUFVTX0RUWF9DRjoiZGlzYWJsZV9vcHVzX2R0eF9jZiIsRU5BQkxFX0FVRElPX0FDVElWSVRZX0RFQlVHX0xPR1M6ImVuYWJsZV9hdWRpb19hY3Rpdml0eV9kZWJ1Z19sb2dzIixESVNBQkxFX0xBWUVSX1NXSVRDSDoiZGlzYWJsZV9sYXllcl9zd2l0Y2gifTtmdW5jdGlvbiBSdCh0KXtjb25zdCByPXt9O3JldHVybiB0eXBlb2YodD09bnVsbD92b2lkIDA6dC5jb2RlKT09Im51bWJlciImJihyLmNvZGU9dC5jb2RlKSx0eXBlb2YodD09bnVsbD92b2lkIDA6dC5jb2RlKT09InN0cmluZyImJihyLmNvZGU9dC5jb2RlLnN1YnN0cmluZygwLDEwMCkpLHR5cGVvZih0PT1udWxsP3ZvaWQgMDp0Lm5hbWUpPT0ic3RyaW5nIiYmKHIubmFtZT10Lm5hbWUuc3Vic3RyaW5nKDAsNTAwKSksdHlwZW9mKHQ9PW51bGw/dm9pZCAwOnQubWVzc2FnZSk9PSJzdHJpbmciJiYoci5tZXNzYWdlPXQubWVzc2FnZS5zdWJzdHJpbmcoMCw1MDApKSx0eXBlb2YodD09bnVsbD92b2lkIDA6dC5yZWFzb24pPT0ic3RyaW5nIiYmKHIucmVhc29uPXQucmVhc29uLnN1YnN0cmluZygwLDUwMCkpLHR5cGVvZih0PT1udWxsP3ZvaWQgMDp0LnN0YWNrKT09InN0cmluZyImJihyLnN0YWNrPXQuc3RhY2suc3Vic3RyaW5nKDAsNTAwKSkscn1mdW5jdGlvbiBKYyh7c2VydmljZVByZWZpeDp0LGJhc2VVUkk6cn0pe3JldHVybmAke3R9LiR7cn1gfWNvbnN0IFhjPXtsb2dzOiJodHRwczovL2FwaS5yZWFsdGltZS5jbG91ZGZsYXJlLmNvbS9sb2dzL290ZWwvbG9ncyIsbW9jazp7dXJsOiJodHRwczovL2FwaS5yZWFsdGltZS5jbG91ZGZsYXJlLmNvbS9tb2NrIixkb21haW46Im1vY2sucmVhbHRpbWUuY2xvdWRmbGFyZS5jb20iLGFwcDoiaHR0cHM6Ly9leGFtcGxlcy5yZWFsdGltZS5jbG91ZGZsYXJlLmNvbS9tZWV0aW5nIixzdGFnaW5nQXBwOiJodHRwczovL2V4YW1wbGVzLnN0YWdpbmcucmVhbHRpbWUuY2xvdWRmbGFyZS5jb20vbWVldGluZyJ9LGFwaUJhc2U6e3Byb2Q6Imh0dHBzOi8vYXBpLnJlYWx0aW1lLmNsb3VkZmxhcmUuY29tIixzdGFnaW5nOiJodHRwczovL2FwaS5zdGFnaW5nLnJlYWx0aW1lLmNsb3VkZmxhcmUuY29tIixwcm9kQWx0ZXJuYXRlOiJodHRwczovL2FwaS5yZWFsdGltZS5jbG91ZGZsYXJlLmNvbSJ9LGJhc2VVUkk6e3Byb2Q6InJlYWx0aW1lLmNsb3VkZmxhcmUuY29tIixzdGFnaW5nOiJzdGFnaW5nLnJlYWx0aW1lLmNsb3VkZmxhcmUuY29tIn19O2Z1bmN0aW9uIExzKHQpe3ZhciBzLG4saTtjb25zdCByPXR5cGVvZiBuYXZpZ2F0b3IhPSJ1bmRlZmluZWQiJiYhbmF2aWdhdG9yLmlzUmVhY3ROYXRpdmUmJnR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiJiYoKHM9d2luZG93LmxvY2F0aW9uLmhvc3QpPT1udWxsP3ZvaWQgMDpzLmluY2x1ZGVzKFhjLmJhc2VVUkkuc3RhZ2luZykpLGU9ISEoKGk9KG49dD09bnVsbD92b2lkIDA6dC5nZXRWYWx1ZSgibW9kdWxlcyIpKT09bnVsbD92b2lkIDA6bi5kZXZUb29scykhPW51bGwmJmkubG9ncyk7cmV0dXJuIHJ8fGV9ZnVuY3Rpb24gWmModCxyKXt2YXIgZTtpZih0IT1udWxsJiZ0LmdldFZhbHVlKCJmbGFnc21pdGgiKS5oYXNGZWF0dXJlKFd0LkxPR19MRVZFTCkpe2xldCBzPSgoZT10LmdldFZhbHVlKCJmbGFnc21pdGgiKS5nZXRWYWx1ZShXdC5MT0dfTEVWRUwpKT09bnVsbD92b2lkIDA6ZS50b1N0cmluZygpKXx8ImFsbCI7aWYocz1zLnRvTG93ZXJDYXNlKCkudHJpbSgpLHM9PT0ib2ZmIilyZXR1cm4hMTtpZihzIT09ImFsbCIpe2NvbnN0IG49WyJkZWJ1ZyIsImxvZyIsImluZm8iLCJ3YXJuIiwiZXJyb3IiXSxpPW4uaW5kZXhPZihyKSxhPW4uaW5kZXhPZihzKTtpZihpPGEpcmV0dXJuITF9fXJldHVybiEwfWZ1bmN0aW9uIERzKHQscixlPXt9KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModCkuZm9yRWFjaChzPT57dmFyIGk7aWYoW251bGwsdm9pZCAwLE5hTl0uaW5jbHVkZXModFtzXSl8fHImJigoKGk9ci5tYXRjaCgvXC4vZykpPT1udWxsP3ZvaWQgMDppLmxlbmd0aCl8fDApPj0xMClyZXR1cm47Y29uc3Qgbj1yP2Ake3J9LiR7c31gOnM7dHlwZW9mIHRbc109PSJvYmplY3QiP0RzKHRbc10sbixlKTpbIm51bWJlciIsInN0cmluZyIsImJvb2xlYW4iXS5pbmNsdWRlcyh0eXBlb2YgdFtzXSkmJihlW25dPXRbc10pfSksZX1mdW5jdGlvbiBOcyh0LHIsZT17fSxzPSIiKXtjb25zdCBuPXt9O3RyeXtjb25zdCBpPUpTT04uc3RyaW5naWZ5KGUpLGE9SlNPTi5wYXJzZShpKSxkPURzKGEscyksbz1KU09OLnN0cmluZ2lmeShkKTtpZighKHI9PW51bGw/dm9pZCAwOnIuc3RhcnRzV2l0aCgiW1NEUF0iKSkmJm8ubGVuZ3RoPjVlMyl7Y29uc3QgZj1gTG9nIG5hbWVkOiAiJHtyfSIgaXMgdHJ5aW5nIHRvIGxvZyBhbiBmbGF0dGVuZWQgb2JqZWN0IG9mIHNpemUgCgkJCSR7by5sZW5ndGh9IGNoYXJzIHRoYXQgaXMgYmV5b25kIHBlcm1pdHRlZCBsaW1pdCBvZiA1MDAwIGNoYXJzLiBQbGVhc2Ugb3B0aW1pemUuYDt0aHJvdyBMcyh0KSYmY29uc29sZS5lcnJvcihmLHtsb2c6ZSxmbGF0dGVuZWQ6b30pLG5ldyBFcnJvcihmKX1yZXR1cm4gSlNPTi5wYXJzZShvKX1jYXRjaChpKXtjb25zdCBhPVJ0KGkpO25bYCR7c30uZXJyb3IubWVzc2FnZWBdPWEubWVzc2FnZXx8IiIsbltgJHtzfS5lcnJvci5zdGFja2BdPWEuc3RhY2t8fCIiLG5bYCR7c30uZXJyb3IucmVhc29uYF09YS5yZWFzb258fCIiLG5bYCR7c30uZXJyb3Iuc291cmNlYF09InNhZmVseUZsYXR0ZW5PYmpGb3JPcGVuVGVsZW1ldHJ5In1yZXR1cm4gbn1jb25zdCBlZD17IkFtYXpvbiBTaWxrIjoiYW1hem9uX3NpbGsiLCJBbmRyb2lkIEJyb3dzZXIiOiJhbmRyb2lkIixCYWRhOiJiYWRhIixCbGFja0JlcnJ5OiJibGFja2JlcnJ5IixDaHJvbWU6ImNocm9tZSIsQ2hyb21pdW06ImNocm9taXVtIixFbGVjdHJvbjoiZWxlY3Ryb24iLEVwaXBoYW55OiJlcGlwaGFueSIsRmlyZWZveDoiZmlyZWZveCIsRm9jdXM6ImZvY3VzIixHZW5lcmljOiJnZW5lcmljIiwiR29vZ2xlIFNlYXJjaCI6Imdvb2dsZV9zZWFyY2giLEdvb2dsZWJvdDoiZ29vZ2xlYm90IiwiSW50ZXJuZXQgRXhwbG9yZXIiOiJpZSIsIkstTWVsZW9uIjoia19tZWxlb24iLE1heHRob246Im1heHRob24iLCJNaWNyb3NvZnQgRWRnZSI6ImVkZ2UiLCJNWiBCcm93c2VyIjoibXoiLCJOQVZFUiBXaGFsZSBCcm93c2VyIjoibmF2ZXIiLE9wZXJhOiJvcGVyYSIsIk9wZXJhIENvYXN0Ijoib3BlcmFfY29hc3QiLFBoYW50b21KUzoicGhhbnRvbWpzIixQdWZmaW46InB1ZmZpbiIsUXVwWmlsbGE6InF1cHppbGxhIixRUToicXEiLFFRTGl0ZToicXFsaXRlIixTYWZhcmk6InNhZmFyaSIsU2FpbGZpc2g6InNhaWxmaXNoIiwiU2Ftc3VuZyBJbnRlcm5ldCBmb3IgQW5kcm9pZCI6InNhbXN1bmdfaW50ZXJuZXQiLFNlYU1vbmtleToic2VhbW9ua2V5IixTbGVpcG5pcjoic2xlaXBuaXIiLFN3aW5nOiJzd2luZyIsVGl6ZW46InRpemVuIiwiVUMgQnJvd3NlciI6InVjIixWaXZhbGRpOiJ2aXZhbGRpIiwiV2ViT1MgQnJvd3NlciI6IndlYm9zIixXZUNoYXQ6IndlY2hhdCIsIllhbmRleCBCcm93c2VyIjoieWFuZGV4IixSb2t1OiJyb2t1In0sVnM9e2FtYXpvbl9zaWxrOiJBbWF6b24gU2lsayIsYW5kcm9pZDoiQW5kcm9pZCBCcm93c2VyIixiYWRhOiJCYWRhIixibGFja2JlcnJ5OiJCbGFja0JlcnJ5IixjaHJvbWU6IkNocm9tZSIsY2hyb21pdW06IkNocm9taXVtIixlbGVjdHJvbjoiRWxlY3Ryb24iLGVwaXBoYW55OiJFcGlwaGFueSIsZmlyZWZveDoiRmlyZWZveCIsZm9jdXM6IkZvY3VzIixnZW5lcmljOiJHZW5lcmljIixnb29nbGVib3Q6Ikdvb2dsZWJvdCIsZ29vZ2xlX3NlYXJjaDoiR29vZ2xlIFNlYXJjaCIsaWU6IkludGVybmV0IEV4cGxvcmVyIixrX21lbGVvbjoiSy1NZWxlb24iLG1heHRob246Ik1heHRob24iLGVkZ2U6Ik1pY3Jvc29mdCBFZGdlIixtejoiTVogQnJvd3NlciIsbmF2ZXI6Ik5BVkVSIFdoYWxlIEJyb3dzZXIiLG9wZXJhOiJPcGVyYSIsb3BlcmFfY29hc3Q6Ik9wZXJhIENvYXN0IixwaGFudG9tanM6IlBoYW50b21KUyIscHVmZmluOiJQdWZmaW4iLHF1cHppbGxhOiJRdXBaaWxsYSIscXE6IlFRIEJyb3dzZXIiLHFxbGl0ZToiUVEgQnJvd3NlciBMaXRlIixzYWZhcmk6IlNhZmFyaSIsc2FpbGZpc2g6IlNhaWxmaXNoIixzYW1zdW5nX2ludGVybmV0OiJTYW1zdW5nIEludGVybmV0IGZvciBBbmRyb2lkIixzZWFtb25rZXk6IlNlYU1vbmtleSIsc2xlaXBuaXI6IlNsZWlwbmlyIixzd2luZzoiU3dpbmciLHRpemVuOiJUaXplbiIsdWM6IlVDIEJyb3dzZXIiLHZpdmFsZGk6IlZpdmFsZGkiLHdlYm9zOiJXZWJPUyBCcm93c2VyIix3ZWNoYXQ6IldlQ2hhdCIseWFuZGV4OiJZYW5kZXggQnJvd3NlciJ9LCQ9e3RhYmxldDoidGFibGV0Iixtb2JpbGU6Im1vYmlsZSIsZGVza3RvcDoiZGVza3RvcCIsdHY6InR2In0sRz17V2luZG93c1Bob25lOiJXaW5kb3dzIFBob25lIixXaW5kb3dzOiJXaW5kb3dzIixNYWNPUzoibWFjT1MiLGlPUzoiaU9TIixBbmRyb2lkOiJBbmRyb2lkIixXZWJPUzoiV2ViT1MiLEJsYWNrQmVycnk6IkJsYWNrQmVycnkiLEJhZGE6IkJhZGEiLFRpemVuOiJUaXplbiIsTGludXg6IkxpbnV4IixDaHJvbWVPUzoiQ2hyb21lIE9TIixQbGF5U3RhdGlvbjQ6IlBsYXlTdGF0aW9uIDQiLFJva3U6IlJva3UifSxvZT17RWRnZUhUTUw6IkVkZ2VIVE1MIixCbGluazoiQmxpbmsiLFRyaWRlbnQ6IlRyaWRlbnQiLFByZXN0bzoiUHJlc3RvIixHZWNrbzoiR2Vja28iLFdlYktpdDoiV2ViS2l0In07Y2xhc3MgZ3tzdGF0aWMgZ2V0Rmlyc3RNYXRjaChyLGUpe2NvbnN0IHM9ZS5tYXRjaChyKTtyZXR1cm4gcyYmcy5sZW5ndGg+MCYmc1sxXXx8IiJ9c3RhdGljIGdldFNlY29uZE1hdGNoKHIsZSl7Y29uc3Qgcz1lLm1hdGNoKHIpO3JldHVybiBzJiZzLmxlbmd0aD4xJiZzWzJdfHwiIn1zdGF0aWMgbWF0Y2hBbmRSZXR1cm5Db25zdChyLGUscyl7aWYoci50ZXN0KGUpKXJldHVybiBzfXN0YXRpYyBnZXRXaW5kb3dzVmVyc2lvbk5hbWUocil7c3dpdGNoKHIpe2Nhc2UiTlQiOnJldHVybiJOVCI7Y2FzZSJYUCI6cmV0dXJuIlhQIjtjYXNlIk5UIDUuMCI6cmV0dXJuIjIwMDAiO2Nhc2UiTlQgNS4xIjpyZXR1cm4iWFAiO2Nhc2UiTlQgNS4yIjpyZXR1cm4iMjAwMyI7Y2FzZSJOVCA2LjAiOnJldHVybiJWaXN0YSI7Y2FzZSJOVCA2LjEiOnJldHVybiI3IjtjYXNlIk5UIDYuMiI6cmV0dXJuIjgiO2Nhc2UiTlQgNi4zIjpyZXR1cm4iOC4xIjtjYXNlIk5UIDEwLjAiOnJldHVybiIxMCI7ZGVmYXVsdDpyZXR1cm59fXN0YXRpYyBnZXRNYWNPU1ZlcnNpb25OYW1lKHIpe2NvbnN0IGU9ci5zcGxpdCgiLiIpLnNwbGljZSgwLDIpLm1hcChzPT5wYXJzZUludChzLDEwKXx8MCk7aWYoZS5wdXNoKDApLGVbMF09PT0xMClzd2l0Y2goZVsxXSl7Y2FzZSA1OnJldHVybiJMZW9wYXJkIjtjYXNlIDY6cmV0dXJuIlNub3cgTGVvcGFyZCI7Y2FzZSA3OnJldHVybiJMaW9uIjtjYXNlIDg6cmV0dXJuIk1vdW50YWluIExpb24iO2Nhc2UgOTpyZXR1cm4iTWF2ZXJpY2tzIjtjYXNlIDEwOnJldHVybiJZb3NlbWl0ZSI7Y2FzZSAxMTpyZXR1cm4iRWwgQ2FwaXRhbiI7Y2FzZSAxMjpyZXR1cm4iU2llcnJhIjtjYXNlIDEzOnJldHVybiJIaWdoIFNpZXJyYSI7Y2FzZSAxNDpyZXR1cm4iTW9qYXZlIjtjYXNlIDE1OnJldHVybiJDYXRhbGluYSI7ZGVmYXVsdDpyZXR1cm59fXN0YXRpYyBnZXRBbmRyb2lkVmVyc2lvbk5hbWUocil7Y29uc3QgZT1yLnNwbGl0KCIuIikuc3BsaWNlKDAsMikubWFwKHM9PnBhcnNlSW50KHMsMTApfHwwKTtpZihlLnB1c2goMCksIShlWzBdPT09MSYmZVsxXTw1KSl7aWYoZVswXT09PTEmJmVbMV08NilyZXR1cm4iQ3VwY2FrZSI7aWYoZVswXT09PTEmJmVbMV0+PTYpcmV0dXJuIkRvbnV0IjtpZihlWzBdPT09MiYmZVsxXTwyKXJldHVybiJFY2xhaXIiO2lmKGVbMF09PT0yJiZlWzFdPT09MilyZXR1cm4iRnJveW8iO2lmKGVbMF09PT0yJiZlWzFdPjIpcmV0dXJuIkdpbmdlcmJyZWFkIjtpZihlWzBdPT09MylyZXR1cm4iSG9uZXljb21iIjtpZihlWzBdPT09NCYmZVsxXTwxKXJldHVybiJJY2UgQ3JlYW0gU2FuZHdpY2giO2lmKGVbMF09PT00JiZlWzFdPDQpcmV0dXJuIkplbGx5IEJlYW4iO2lmKGVbMF09PT00JiZlWzFdPj00KXJldHVybiJLaXRLYXQiO2lmKGVbMF09PT01KXJldHVybiJMb2xsaXBvcCI7aWYoZVswXT09PTYpcmV0dXJuIk1hcnNobWFsbG93IjtpZihlWzBdPT09NylyZXR1cm4iTm91Z2F0IjtpZihlWzBdPT09OClyZXR1cm4iT3JlbyI7aWYoZVswXT09PTkpcmV0dXJuIlBpZSJ9fXN0YXRpYyBnZXRWZXJzaW9uUHJlY2lzaW9uKHIpe3JldHVybiByLnNwbGl0KCIuIikubGVuZ3RofXN0YXRpYyBjb21wYXJlVmVyc2lvbnMocixlLHM9ITEpe2NvbnN0IG49Zy5nZXRWZXJzaW9uUHJlY2lzaW9uKHIpLGk9Zy5nZXRWZXJzaW9uUHJlY2lzaW9uKGUpO2xldCBhPU1hdGgubWF4KG4saSksZD0wO2NvbnN0IG89Zy5tYXAoW3IsZV0sbD0+e2NvbnN0IGY9YS1nLmdldFZlcnNpb25QcmVjaXNpb24obCkseT1sK25ldyBBcnJheShmKzEpLmpvaW4oIi4wIik7cmV0dXJuIGcubWFwKHkuc3BsaXQoIi4iKSxFPT5uZXcgQXJyYXkoMjAtRS5sZW5ndGgpLmpvaW4oIjAiKStFKS5yZXZlcnNlKCl9KTtmb3IocyYmKGQ9YS1NYXRoLm1pbihuLGkpKSxhLT0xO2E+PWQ7KXtpZihvWzBdW2FdPm9bMV1bYV0pcmV0dXJuIDE7aWYob1swXVthXT09PW9bMV1bYV0pe2lmKGE9PT1kKXJldHVybiAwO2EtPTF9ZWxzZSBpZihvWzBdW2FdPG9bMV1bYV0pcmV0dXJuLTF9fXN0YXRpYyBtYXAocixlKXtjb25zdCBzPVtdO2xldCBuO2lmKEFycmF5LnByb3RvdHlwZS5tYXApcmV0dXJuIEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbChyLGUpO2ZvcihuPTA7bjxyLmxlbmd0aDtuKz0xKXMucHVzaChlKHJbbl0pKTtyZXR1cm4gc31zdGF0aWMgZmluZChyLGUpe2xldCBzLG47aWYoQXJyYXkucHJvdG90eXBlLmZpbmQpcmV0dXJuIEFycmF5LnByb3RvdHlwZS5maW5kLmNhbGwocixlKTtmb3Iocz0wLG49ci5sZW5ndGg7czxuO3MrPTEpe2NvbnN0IGk9cltzXTtpZihlKGkscykpcmV0dXJuIGl9fXN0YXRpYyBhc3NpZ24ociwuLi5lKXtjb25zdCBzPXI7bGV0IG4saTtpZihPYmplY3QuYXNzaWduKXJldHVybiBPYmplY3QuYXNzaWduKHIsLi4uZSk7Zm9yKG49MCxpPWUubGVuZ3RoO248aTtuKz0xKXtjb25zdCBhPWVbbl07dHlwZW9mIGE9PSJvYmplY3QiJiZhIT09bnVsbCYmT2JqZWN0LmtleXMoYSkuZm9yRWFjaChvPT57c1tvXT1hW29dfSl9cmV0dXJuIHJ9c3RhdGljIGdldEJyb3dzZXJBbGlhcyhyKXtyZXR1cm4gZWRbcl19c3RhdGljIGdldEJyb3dzZXJUeXBlQnlBbGlhcyhyKXtyZXR1cm4gVnNbcl18fCIifX1jb25zdCBOPS92ZXJzaW9uXC8oXGQrKFwuP18/XGQrKSspL2ksdGQ9W3t0ZXN0OlsvZ29vZ2xlYm90L2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6Ikdvb2dsZWJvdCJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC9nb29nbGVib3RcLyhcZCsoXC5cZCspKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goTix0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9vcGVyYS9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJPcGVyYSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKE4sdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86b3BlcmEpW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0Olsvb3ByXC98b3Bpb3MvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiT3BlcmEifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86b3ByfG9waW9zKVtccy9dKFxTKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvU2Ftc3VuZ0Jyb3dzZXIvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiU2Ftc3VuZyBJbnRlcm5ldCBmb3IgQW5kcm9pZCJ9LGU9Zy5nZXRGaXJzdE1hdGNoKE4sdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86U2Ftc3VuZ0Jyb3dzZXIpW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvV2hhbGUvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiTkFWRVIgV2hhbGUgQnJvd3NlciJ9LGU9Zy5nZXRGaXJzdE1hdGNoKE4sdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86d2hhbGUpW1xzL10oXGQrKD86XC5cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9NWkJyb3dzZXIvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiTVogQnJvd3NlciJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzpNWkJyb3dzZXIpW1xzL10oXGQrKD86XC5cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvZm9jdXMvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiRm9jdXMifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86Zm9jdXMpW1xzL10oXGQrKD86XC5cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0Olsvc3dpbmcvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiU3dpbmcifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86c3dpbmcpW1xzL10oXGQrKD86XC5cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvY29hc3QvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiT3BlcmEgQ29hc3QifSxlPWcuZ2V0Rmlyc3RNYXRjaChOLHQpfHxnLmdldEZpcnN0TWF0Y2goLyg/OmNvYXN0KVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL29wdFwvXGQrKD86Lj9fP1xkKykrL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6Ik9wZXJhIFRvdWNoIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/Om9wdClbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsveWFicm93c2VyL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IllhbmRleCBCcm93c2VyIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/OnlhYnJvd3NlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvdWNicm93c2VyL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IlVDIEJyb3dzZXIifSxlPWcuZ2V0Rmlyc3RNYXRjaChOLHQpfHxnLmdldEZpcnN0TWF0Y2goLyg/OnVjYnJvd3NlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9NYXh0aG9ufG14aW9zL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6Ik1heHRob24ifSxlPWcuZ2V0Rmlyc3RNYXRjaChOLHQpfHxnLmdldEZpcnN0TWF0Y2goLyg/Ok1heHRob258bXhpb3MpW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvZXBpcGhhbnkvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiRXBpcGhhbnkifSxlPWcuZ2V0Rmlyc3RNYXRjaChOLHQpfHxnLmdldEZpcnN0TWF0Y2goLyg/OmVwaXBoYW55KVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL3B1ZmZpbi9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJQdWZmaW4ifSxlPWcuZ2V0Rmlyc3RNYXRjaChOLHQpfHxnLmdldEZpcnN0TWF0Y2goLyg/OnB1ZmZpbilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9zbGVpcG5pci9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJTbGVpcG5pciJ9LGU9Zy5nZXRGaXJzdE1hdGNoKE4sdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86c2xlaXBuaXIpW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0Olsvay1tZWxlb24vaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiSy1NZWxlb24ifSxlPWcuZ2V0Rmlyc3RNYXRjaChOLHQpfHxnLmdldEZpcnN0TWF0Y2goLyg/OmstbWVsZW9uKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL21pY3JvbWVzc2VuZ2VyL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IldlQ2hhdCJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzptaWNyb21lc3NlbmdlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvcXFicm93c2VyL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6L3FxYnJvd3NlcmxpdGUvaS50ZXN0KHQpPyJRUSBCcm93c2VyIExpdGUiOiJRUSBCcm93c2VyIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/OnFxYnJvd3NlcmxpdGV8cXFicm93c2VyKVsvXShcZCsoXC4/Xz9cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvbXNpZXx0cmlkZW50L2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IkludGVybmV0IEV4cGxvcmVyIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/Om1zaWUgfHJ2OikoXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvXHNlZGdcLy9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJNaWNyb3NvZnQgRWRnZSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC9cc2VkZ1wvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL2VkZyhbZWFdfGlvcykvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiTWljcm9zb2Z0IEVkZ2UifSxlPWcuZ2V0U2Vjb25kTWF0Y2goL2VkZyhbZWFdfGlvcylcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy92aXZhbGRpL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IlZpdmFsZGkifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvdml2YWxkaVwvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL3NlYW1vbmtleS9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJTZWFNb25rZXkifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvc2VhbW9ua2V5XC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0Olsvc2FpbGZpc2gvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiU2FpbGZpc2gifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvc2FpbGZpc2hccz9icm93c2VyXC8oXGQrKFwuXGQrKT8pL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0Olsvc2lsay9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJBbWF6b24gU2lsayJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC9zaWxrXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvcGhhbnRvbS9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJQaGFudG9tSlMifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvcGhhbnRvbWpzXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0Olsvc2xpbWVyanMvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiU2xpbWVySlMifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvc2xpbWVyanNcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9ibGFja2JlcnJ5fFxiYmJcZCsvaSwvcmltXHN0YWJsZXQvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiQmxhY2tCZXJyeSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKE4sdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvYmxhY2tiZXJyeVtcZF0rXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvKHdlYnxocHcpW28wXXMvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiV2ViT1MgQnJvd3NlciJ9LGU9Zy5nZXRGaXJzdE1hdGNoKE4sdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvdyg/OmViKT9bbzBdc2Jyb3dzZXJcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9iYWRhL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IkJhZGEifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvZG9sZmluXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvdGl6ZW4vaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiVGl6ZW4ifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86dGl6ZW5ccz8pP2Jyb3dzZXJcLyhcZCsoXC4/Xz9cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvcXVwemlsbGEvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiUXVwWmlsbGEifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86cXVwemlsbGEpW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCl8fGcuZ2V0Rmlyc3RNYXRjaChOLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL2ZpcmVmb3h8aWNld2Vhc2VsfGZ4aW9zL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IkZpcmVmb3gifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86ZmlyZWZveHxpY2V3ZWFzZWx8Znhpb3MpW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvZWxlY3Ryb24vaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiRWxlY3Ryb24ifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86ZWxlY3Ryb24pXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvTWl1aUJyb3dzZXIvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiTWl1aSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzpNaXVpQnJvd3NlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9jaHJvbWl1bS9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJDaHJvbWl1bSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzpjaHJvbWl1bSlbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvY2hyb21lfGNyaW9zfGNybW8vaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiQ2hyb21lIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/OmNocm9tZXxjcmlvc3xjcm1vKVwvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL0dTQS9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJHb29nbGUgU2VhcmNoIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/OkdTQSlcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3QodCl7Y29uc3Qgcj0hdC50ZXN0KC9saWtlIGFuZHJvaWQvaSksZT10LnRlc3QoL2FuZHJvaWQvaSk7cmV0dXJuIHImJmV9LGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IkFuZHJvaWQgQnJvd3NlciJ9LGU9Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvcGxheXN0YXRpb24gNC9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJQbGF5U3RhdGlvbiA0In0sZT1nLmdldEZpcnN0TWF0Y2goTix0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9zYWZhcml8YXBwbGV3ZWJraXQvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiU2FmYXJpIn0sZT1nLmdldEZpcnN0TWF0Y2goTix0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy8uKi9pXSxkZXNjcmliZSh0KXtjb25zdCByPS9eKC4qKVwvKC4qKSAvLGU9L14oLiopXC8oLiopWyBcdF1cKCguKikvLG49dC5zZWFyY2goIlxcKCIpIT09LTE/ZTpyO3JldHVybntuYW1lOmcuZ2V0Rmlyc3RNYXRjaChuLHQpLHZlcnNpb246Zy5nZXRTZWNvbmRNYXRjaChuLHQpfX19XTt2YXIgcmQ9W3t0ZXN0OlsvUm9rdVwvRFZQL10sZGVzY3JpYmUodCl7Y29uc3Qgcj1nLmdldEZpcnN0TWF0Y2goL1Jva3VcL0RWUC0oXGQrXC5cZCspL2ksdCk7cmV0dXJue25hbWU6Ry5Sb2t1LHZlcnNpb246cn19fSx7dGVzdDpbL3dpbmRvd3MgcGhvbmUvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj1nLmdldEZpcnN0TWF0Y2goL3dpbmRvd3MgcGhvbmUgKD86b3MpP1xzPyhcZCsoXC5cZCspKikvaSx0KTtyZXR1cm57bmFtZTpHLldpbmRvd3NQaG9uZSx2ZXJzaW9uOnJ9fX0se3Rlc3Q6Wy93aW5kb3dzIC9pXSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvV2luZG93cyAoKE5UfFhQKSggXGRcZD8uXGQpPykvaSx0KSxlPWcuZ2V0V2luZG93c1ZlcnNpb25OYW1lKHIpO3JldHVybntuYW1lOkcuV2luZG93cyx2ZXJzaW9uOnIsdmVyc2lvbk5hbWU6ZX19fSx7dGVzdDpbL01hY2ludG9zaCguKj8pIEZ4aU9TKC4qPylcLy9dLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6Ry5pT1N9LGU9Zy5nZXRTZWNvbmRNYXRjaCgvKFZlcnNpb25cLykoXGRbXGQuXSspLyx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9tYWNpbnRvc2gvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj1nLmdldEZpcnN0TWF0Y2goL21hYyBvcyB4IChcZCsoXC4/Xz9cZCspKykvaSx0KS5yZXBsYWNlKC9bX1xzXS9nLCIuIiksZT1nLmdldE1hY09TVmVyc2lvbk5hbWUocikscz17bmFtZTpHLk1hY09TLHZlcnNpb246cn07cmV0dXJuIGUmJihzLnZlcnNpb25OYW1lPWUpLHN9fSx7dGVzdDpbLyhpcG9kfGlwaG9uZXxpcGFkKS9pXSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvb3MgKFxkKyhbX1xzXVxkKykqKSBsaWtlIG1hYyBvcyB4L2ksdCkucmVwbGFjZSgvW19cc10vZywiLiIpO3JldHVybntuYW1lOkcuaU9TLHZlcnNpb246cn19fSx7dGVzdCh0KXtjb25zdCByPSF0LnRlc3QoL2xpa2UgYW5kcm9pZC9pKSxlPXQudGVzdCgvYW5kcm9pZC9pKTtyZXR1cm4gciYmZX0sZGVzY3JpYmUodCl7Y29uc3Qgcj1nLmdldEZpcnN0TWF0Y2goL2FuZHJvaWRbXHMvLV0oXGQrKFwuXGQrKSopL2ksdCksZT1nLmdldEFuZHJvaWRWZXJzaW9uTmFtZShyKSxzPXtuYW1lOkcuQW5kcm9pZCx2ZXJzaW9uOnJ9O3JldHVybiBlJiYocy52ZXJzaW9uTmFtZT1lKSxzfX0se3Rlc3Q6Wy8od2VifGhwdylbbzBdcy9pXSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvKD86d2VifGhwdylbbzBdc1wvKFxkKyhcLlxkKykqKS9pLHQpLGU9e25hbWU6Ry5XZWJPU307cmV0dXJuIHImJnIubGVuZ3RoJiYoZS52ZXJzaW9uPXIpLGV9fSx7dGVzdDpbL2JsYWNrYmVycnl8XGJiYlxkKy9pLC9yaW1cc3RhYmxldC9pXSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvcmltXHN0YWJsZXRcc29zXHMoXGQrKFwuXGQrKSopL2ksdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvYmxhY2tiZXJyeVxkK1wvKFxkKyhbX1xzXVxkKykqKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goL1xiYmIoXGQrKS9pLHQpO3JldHVybntuYW1lOkcuQmxhY2tCZXJyeSx2ZXJzaW9uOnJ9fX0se3Rlc3Q6Wy9iYWRhL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9Zy5nZXRGaXJzdE1hdGNoKC9iYWRhXC8oXGQrKFwuXGQrKSopL2ksdCk7cmV0dXJue25hbWU6Ry5CYWRhLHZlcnNpb246cn19fSx7dGVzdDpbL3RpemVuL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9Zy5nZXRGaXJzdE1hdGNoKC90aXplblsvXHNdKFxkKyhcLlxkKykqKS9pLHQpO3JldHVybntuYW1lOkcuVGl6ZW4sdmVyc2lvbjpyfX19LHt0ZXN0OlsvbGludXgvaV0sZGVzY3JpYmUoKXtyZXR1cm57bmFtZTpHLkxpbnV4fX19LHt0ZXN0OlsvQ3JPUy9dLGRlc2NyaWJlKCl7cmV0dXJue25hbWU6Ry5DaHJvbWVPU319fSx7dGVzdDpbL1BsYXlTdGF0aW9uIDQvXSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvUGxheVN0YXRpb24gNFsvXHNdKFxkKyhcLlxkKykqKS9pLHQpO3JldHVybntuYW1lOkcuUGxheVN0YXRpb240LHZlcnNpb246cn19fV0sc2Q9W3t0ZXN0OlsvZ29vZ2xlYm90L2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6ImJvdCIsdmVuZG9yOiJHb29nbGUifX19LHt0ZXN0OlsvaHVhd2VpL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9Zy5nZXRGaXJzdE1hdGNoKC8oY2FuLWwwMSkvaSx0KSYmIk5vdmEiLGU9e3R5cGU6JC5tb2JpbGUsdmVuZG9yOiJIdWF3ZWkifTtyZXR1cm4gciYmKGUubW9kZWw9ciksZX19LHt0ZXN0OlsvbmV4dXNccyooPzo3fDh8OXwxMCkuKi9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOiQudGFibGV0LHZlbmRvcjoiTmV4dXMifX19LHt0ZXN0OlsvaXBhZC9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOiQudGFibGV0LHZlbmRvcjoiQXBwbGUiLG1vZGVsOiJpUGFkIn19fSx7dGVzdDpbL01hY2ludG9zaCguKj8pIEZ4aU9TKC4qPylcLy9dLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6JC50YWJsZXQsdmVuZG9yOiJBcHBsZSIsbW9kZWw6ImlQYWQifX19LHt0ZXN0Olsva2Z0dCBidWlsZC9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOiQudGFibGV0LHZlbmRvcjoiQW1hem9uIixtb2RlbDoiS2luZGxlIEZpcmUgSEQgNyJ9fX0se3Rlc3Q6Wy9zaWxrL2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6JC50YWJsZXQsdmVuZG9yOiJBbWF6b24ifX19LHt0ZXN0OlsvdGFibGV0KD8hIHBjKS9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOiQudGFibGV0fX19LHt0ZXN0KHQpe2NvbnN0IHI9dC50ZXN0KC9pcG9kfGlwaG9uZS9pKSxlPXQudGVzdCgvbGlrZSAoaXBvZHxpcGhvbmUpL2kpO3JldHVybiByJiYhZX0sZGVzY3JpYmUodCl7Y29uc3Qgcj1nLmdldEZpcnN0TWF0Y2goLyhpcG9kfGlwaG9uZSkvaSx0KTtyZXR1cm57dHlwZTokLm1vYmlsZSx2ZW5kb3I6IkFwcGxlIixtb2RlbDpyfX19LHt0ZXN0OlsvbmV4dXNccypbMC02XS4qL2ksL2dhbGF4eSBuZXh1cy9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOiQubW9iaWxlLHZlbmRvcjoiTmV4dXMifX19LHt0ZXN0OlsvW14tXW1vYmkvaV0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTokLm1vYmlsZX19fSx7dGVzdCh0KXtyZXR1cm4gdC5nZXRCcm93c2VyTmFtZSghMCk9PT0iYmxhY2tiZXJyeSJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6JC5tb2JpbGUsdmVuZG9yOiJCbGFja0JlcnJ5In19fSx7dGVzdCh0KXtyZXR1cm4gdC5nZXRCcm93c2VyTmFtZSghMCk9PT0iYmFkYSJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6JC5tb2JpbGV9fX0se3Rlc3QodCl7cmV0dXJuIHQuZ2V0QnJvd3Nlck5hbWUoKT09PSJ3aW5kb3dzIHBob25lIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTokLm1vYmlsZSx2ZW5kb3I6Ik1pY3Jvc29mdCJ9fX0se3Rlc3QodCl7Y29uc3Qgcj1OdW1iZXIoU3RyaW5nKHQuZ2V0T1NWZXJzaW9uKCkpLnNwbGl0KCIuIilbMF0pO3JldHVybiB0LmdldE9TTmFtZSghMCk9PT0iYW5kcm9pZCImJnI+PTN9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6JC50YWJsZXR9fX0se3Rlc3QodCl7cmV0dXJuIHQuZ2V0T1NOYW1lKCEwKT09PSJhbmRyb2lkIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTokLm1vYmlsZX19fSx7dGVzdCh0KXtyZXR1cm4gdC5nZXRPU05hbWUoITApPT09Im1hY29zIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTokLmRlc2t0b3AsdmVuZG9yOiJBcHBsZSJ9fX0se3Rlc3QodCl7cmV0dXJuIHQuZ2V0T1NOYW1lKCEwKT09PSJ3aW5kb3dzIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTokLmRlc2t0b3B9fX0se3Rlc3QodCl7cmV0dXJuIHQuZ2V0T1NOYW1lKCEwKT09PSJsaW51eCJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6JC5kZXNrdG9wfX19LHt0ZXN0KHQpe3JldHVybiB0LmdldE9TTmFtZSghMCk9PT0icGxheXN0YXRpb24gNCJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6JC50dn19fSx7dGVzdCh0KXtyZXR1cm4gdC5nZXRPU05hbWUoITApPT09InJva3UifSxkZXNjcmliZSgpe3JldHVybnt0eXBlOiQudHZ9fX1dLG5kPVt7dGVzdCh0KXtyZXR1cm4gdC5nZXRCcm93c2VyTmFtZSghMCk9PT0ibWljcm9zb2Z0IGVkZ2UifSxkZXNjcmliZSh0KXtpZigvXHNlZGdcLy9pLnRlc3QodCkpcmV0dXJue25hbWU6b2UuQmxpbmt9O2NvbnN0IGU9Zy5nZXRGaXJzdE1hdGNoKC9lZGdlXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJue25hbWU6b2UuRWRnZUhUTUwsdmVyc2lvbjplfX19LHt0ZXN0OlsvdHJpZGVudC9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOm9lLlRyaWRlbnR9LGU9Zy5nZXRGaXJzdE1hdGNoKC90cmlkZW50XC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0KHQpe3JldHVybiB0LnRlc3QoL3ByZXN0by9pKX0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZTpvZS5QcmVzdG99LGU9Zy5nZXRGaXJzdE1hdGNoKC9wcmVzdG9cLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3QodCl7Y29uc3Qgcj10LnRlc3QoL2dlY2tvL2kpLGU9dC50ZXN0KC9saWtlIGdlY2tvL2kpO3JldHVybiByJiYhZX0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZTpvZS5HZWNrb30sZT1nLmdldEZpcnN0TWF0Y2goL2dlY2tvXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvKGFwcGxlKT93ZWJraXRcLzUzN1wuMzYvaV0sZGVzY3JpYmUoKXtyZXR1cm57bmFtZTpvZS5CbGlua319fSx7dGVzdDpbLyhhcHBsZSk/d2Via2l0L2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6b2UuV2ViS2l0fSxlPWcuZ2V0Rmlyc3RNYXRjaCgvd2Via2l0XC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19XTtjbGFzcyBGc3tjb25zdHJ1Y3RvcihyLGU9ITEpe2lmKHI9PW51bGx8fHI9PT0iIil0aHJvdyBuZXcgRXJyb3IoIlVzZXJBZ2VudCBwYXJhbWV0ZXIgY2FuJ3QgYmUgZW1wdHkiKTt0aGlzLl91YT1yLHRoaXMucGFyc2VkUmVzdWx0PXt9LGUhPT0hMCYmdGhpcy5wYXJzZSgpfWdldFVBKCl7cmV0dXJuIHRoaXMuX3VhfXRlc3Qocil7cmV0dXJuIHIudGVzdCh0aGlzLl91YSl9cGFyc2VCcm93c2VyKCl7dGhpcy5wYXJzZWRSZXN1bHQuYnJvd3Nlcj17fTtjb25zdCByPWcuZmluZCh0ZCxlPT57aWYodHlwZW9mIGUudGVzdD09ImZ1bmN0aW9uIilyZXR1cm4gZS50ZXN0KHRoaXMpO2lmKGUudGVzdCBpbnN0YW5jZW9mIEFycmF5KXJldHVybiBlLnRlc3Quc29tZShzPT50aGlzLnRlc3QocykpO3Rocm93IG5ldyBFcnJvcigiQnJvd3NlcidzIHRlc3QgZnVuY3Rpb24gaXMgbm90IHZhbGlkIil9KTtyZXR1cm4gciYmKHRoaXMucGFyc2VkUmVzdWx0LmJyb3dzZXI9ci5kZXNjcmliZSh0aGlzLmdldFVBKCkpKSx0aGlzLnBhcnNlZFJlc3VsdC5icm93c2VyfWdldEJyb3dzZXIoKXtyZXR1cm4gdGhpcy5wYXJzZWRSZXN1bHQuYnJvd3Nlcj90aGlzLnBhcnNlZFJlc3VsdC5icm93c2VyOnRoaXMucGFyc2VCcm93c2VyKCl9Z2V0QnJvd3Nlck5hbWUocil7cmV0dXJuIHI/U3RyaW5nKHRoaXMuZ2V0QnJvd3NlcigpLm5hbWUpLnRvTG93ZXJDYXNlKCl8fCIiOnRoaXMuZ2V0QnJvd3NlcigpLm5hbWV8fCIifWdldEJyb3dzZXJWZXJzaW9uKCl7cmV0dXJuIHRoaXMuZ2V0QnJvd3NlcigpLnZlcnNpb259Z2V0T1MoKXtyZXR1cm4gdGhpcy5wYXJzZWRSZXN1bHQub3M/dGhpcy5wYXJzZWRSZXN1bHQub3M6dGhpcy5wYXJzZU9TKCl9cGFyc2VPUygpe3RoaXMucGFyc2VkUmVzdWx0Lm9zPXt9O2NvbnN0IHI9Zy5maW5kKHJkLGU9PntpZih0eXBlb2YgZS50ZXN0PT0iZnVuY3Rpb24iKXJldHVybiBlLnRlc3QodGhpcyk7aWYoZS50ZXN0IGluc3RhbmNlb2YgQXJyYXkpcmV0dXJuIGUudGVzdC5zb21lKHM9PnRoaXMudGVzdChzKSk7dGhyb3cgbmV3IEVycm9yKCJCcm93c2VyJ3MgdGVzdCBmdW5jdGlvbiBpcyBub3QgdmFsaWQiKX0pO3JldHVybiByJiYodGhpcy5wYXJzZWRSZXN1bHQub3M9ci5kZXNjcmliZSh0aGlzLmdldFVBKCkpKSx0aGlzLnBhcnNlZFJlc3VsdC5vc31nZXRPU05hbWUocil7Y29uc3R7bmFtZTplfT10aGlzLmdldE9TKCk7cmV0dXJuIHI/U3RyaW5nKGUpLnRvTG93ZXJDYXNlKCl8fCIiOmV8fCIifWdldE9TVmVyc2lvbigpe3JldHVybiB0aGlzLmdldE9TKCkudmVyc2lvbn1nZXRQbGF0Zm9ybSgpe3JldHVybiB0aGlzLnBhcnNlZFJlc3VsdC5wbGF0Zm9ybT90aGlzLnBhcnNlZFJlc3VsdC5wbGF0Zm9ybTp0aGlzLnBhcnNlUGxhdGZvcm0oKX1nZXRQbGF0Zm9ybVR5cGUocj0hMSl7Y29uc3R7dHlwZTplfT10aGlzLmdldFBsYXRmb3JtKCk7cmV0dXJuIHI/U3RyaW5nKGUpLnRvTG93ZXJDYXNlKCl8fCIiOmV8fCIifXBhcnNlUGxhdGZvcm0oKXt0aGlzLnBhcnNlZFJlc3VsdC5wbGF0Zm9ybT17fTtjb25zdCByPWcuZmluZChzZCxlPT57aWYodHlwZW9mIGUudGVzdD09ImZ1bmN0aW9uIilyZXR1cm4gZS50ZXN0KHRoaXMpO2lmKGUudGVzdCBpbnN0YW5jZW9mIEFycmF5KXJldHVybiBlLnRlc3Quc29tZShzPT50aGlzLnRlc3QocykpO3Rocm93IG5ldyBFcnJvcigiQnJvd3NlcidzIHRlc3QgZnVuY3Rpb24gaXMgbm90IHZhbGlkIil9KTtyZXR1cm4gciYmKHRoaXMucGFyc2VkUmVzdWx0LnBsYXRmb3JtPXIuZGVzY3JpYmUodGhpcy5nZXRVQSgpKSksdGhpcy5wYXJzZWRSZXN1bHQucGxhdGZvcm19Z2V0RW5naW5lKCl7cmV0dXJuIHRoaXMucGFyc2VkUmVzdWx0LmVuZ2luZT90aGlzLnBhcnNlZFJlc3VsdC5lbmdpbmU6dGhpcy5wYXJzZUVuZ2luZSgpfWdldEVuZ2luZU5hbWUocil7cmV0dXJuIHI/U3RyaW5nKHRoaXMuZ2V0RW5naW5lKCkubmFtZSkudG9Mb3dlckNhc2UoKXx8IiI6dGhpcy5nZXRFbmdpbmUoKS5uYW1lfHwiIn1wYXJzZUVuZ2luZSgpe3RoaXMucGFyc2VkUmVzdWx0LmVuZ2luZT17fTtjb25zdCByPWcuZmluZChuZCxlPT57aWYodHlwZW9mIGUudGVzdD09ImZ1bmN0aW9uIilyZXR1cm4gZS50ZXN0KHRoaXMpO2lmKGUudGVzdCBpbnN0YW5jZW9mIEFycmF5KXJldHVybiBlLnRlc3Quc29tZShzPT50aGlzLnRlc3QocykpO3Rocm93IG5ldyBFcnJvcigiQnJvd3NlcidzIHRlc3QgZnVuY3Rpb24gaXMgbm90IHZhbGlkIil9KTtyZXR1cm4gciYmKHRoaXMucGFyc2VkUmVzdWx0LmVuZ2luZT1yLmRlc2NyaWJlKHRoaXMuZ2V0VUEoKSkpLHRoaXMucGFyc2VkUmVzdWx0LmVuZ2luZX1wYXJzZSgpe3JldHVybiB0aGlzLnBhcnNlQnJvd3NlcigpLHRoaXMucGFyc2VPUygpLHRoaXMucGFyc2VQbGF0Zm9ybSgpLHRoaXMucGFyc2VFbmdpbmUoKSx0aGlzfWdldFJlc3VsdCgpe3JldHVybiBnLmFzc2lnbih7fSx0aGlzLnBhcnNlZFJlc3VsdCl9c2F0aXNmaWVzKHIpe2NvbnN0IGU9e307bGV0IHM9MDtjb25zdCBuPXt9O2xldCBpPTA7aWYoT2JqZWN0LmtleXMocikuZm9yRWFjaChkPT57Y29uc3Qgbz1yW2RdO3R5cGVvZiBvPT0ic3RyaW5nIj8obltkXT1vLGkrPTEpOnR5cGVvZiBvPT0ib2JqZWN0IiYmKGVbZF09byxzKz0xKX0pLHM+MCl7Y29uc3QgZD1PYmplY3Qua2V5cyhlKSxvPWcuZmluZChkLGY9PnRoaXMuaXNPUyhmKSk7aWYobyl7Y29uc3QgZj10aGlzLnNhdGlzZmllcyhlW29dKTtpZihmIT09dm9pZCAwKXJldHVybiBmfWNvbnN0IGw9Zy5maW5kKGQsZj0+dGhpcy5pc1BsYXRmb3JtKGYpKTtpZihsKXtjb25zdCBmPXRoaXMuc2F0aXNmaWVzKGVbbF0pO2lmKGYhPT12b2lkIDApcmV0dXJuIGZ9fWlmKGk+MCl7Y29uc3QgZD1PYmplY3Qua2V5cyhuKSxvPWcuZmluZChkLGw9PnRoaXMuaXNCcm93c2VyKGwsITApKTtpZihvIT09dm9pZCAwKXJldHVybiB0aGlzLmNvbXBhcmVWZXJzaW9uKG5bb10pfX1pc0Jyb3dzZXIocixlPSExKXtjb25zdCBzPXRoaXMuZ2V0QnJvd3Nlck5hbWUoKS50b0xvd2VyQ2FzZSgpO2xldCBuPXIudG9Mb3dlckNhc2UoKTtjb25zdCBpPWcuZ2V0QnJvd3NlclR5cGVCeUFsaWFzKG4pO3JldHVybiBlJiZpJiYobj1pLnRvTG93ZXJDYXNlKCkpLG49PT1zfWNvbXBhcmVWZXJzaW9uKHIpe2xldCBlPVswXSxzPXIsbj0hMTtjb25zdCBpPXRoaXMuZ2V0QnJvd3NlclZlcnNpb24oKTtpZih0eXBlb2YgaT09InN0cmluZyIpcmV0dXJuIHJbMF09PT0iPiJ8fHJbMF09PT0iPCI/KHM9ci5zdWJzdHIoMSksclsxXT09PSI9Ij8obj0hMCxzPXIuc3Vic3RyKDIpKTplPVtdLHJbMF09PT0iPiI/ZS5wdXNoKDEpOmUucHVzaCgtMSkpOnJbMF09PT0iPSI/cz1yLnN1YnN0cigxKTpyWzBdPT09In4iJiYobj0hMCxzPXIuc3Vic3RyKDEpKSxlLmluZGV4T2YoZy5jb21wYXJlVmVyc2lvbnMoaSxzLG4pKT4tMX1pc09TKHIpe3JldHVybiB0aGlzLmdldE9TTmFtZSghMCk9PT1TdHJpbmcocikudG9Mb3dlckNhc2UoKX1pc1BsYXRmb3JtKHIpe3JldHVybiB0aGlzLmdldFBsYXRmb3JtVHlwZSghMCk9PT1TdHJpbmcocikudG9Mb3dlckNhc2UoKX1pc0VuZ2luZShyKXtyZXR1cm4gdGhpcy5nZXRFbmdpbmVOYW1lKCEwKT09PVN0cmluZyhyKS50b0xvd2VyQ2FzZSgpfWlzKHIsZT0hMSl7cmV0dXJuIHRoaXMuaXNCcm93c2VyKHIsZSl8fHRoaXMuaXNPUyhyKXx8dGhpcy5pc1BsYXRmb3JtKHIpfXNvbWUocj1bXSl7cmV0dXJuIHIuc29tZShlPT50aGlzLmlzKGUpKX19LyohCiAqIEJvd3NlciAtIGEgYnJvd3NlciBkZXRlY3RvcgogKiBodHRwczovL2dpdGh1Yi5jb20vbGFuY2VkaWtzb24vYm93c2VyCiAqIE1JVCBMaWNlbnNlIHwgKGMpIER1c3RpbiBEaWF6IDIwMTItMjAxNQogKiBNSVQgTGljZW5zZSB8IChjKSBEZW5pcyBEZW1jaGVua28gMjAxNS0yMDE5CiAqL2NsYXNzIGlke3N0YXRpYyBnZXRQYXJzZXIocixlPSExKXtpZih0eXBlb2YgciE9InN0cmluZyIpdGhyb3cgbmV3IEVycm9yKCJVc2VyQWdlbnQgc2hvdWxkIGJlIGEgc3RyaW5nIik7cmV0dXJuIG5ldyBGcyhyLGUpfXN0YXRpYyBwYXJzZShyKXtyZXR1cm4gbmV3IEZzKHIpLmdldFJlc3VsdCgpfXN0YXRpYyBnZXQgQlJPV1NFUl9NQVAoKXtyZXR1cm4gVnN9c3RhdGljIGdldCBFTkdJTkVfTUFQKCl7cmV0dXJuIG9lfXN0YXRpYyBnZXQgT1NfTUFQKCl7cmV0dXJuIEd9c3RhdGljIGdldCBQTEFURk9STVNfTUFQKCl7cmV0dXJuICR9fWNvbnN0IE5lPSJjaHJvbWUiLEJzPSJvcGVyYSIseHM9ImZpcmVmb3giLGpzPSJpZXhwbG9yZXIiLFVzPSJzYWZhcmkiLCRzPSJud2pzIixIcz0iZWxlY3Ryb24iLEtzPSJyZWFjdC1uYXRpdmUiLEd0PSJ1bmtub3duIixQdD17Q2hyb21lOk5lLENocm9taXVtOk5lLE9wZXJhOkJzLEZpcmVmb3g6eHMsIkludGVybmV0IEV4cGxvcmVyIjpqcyxTYWZhcmk6VXN9O2Z1bmN0aW9uIGFkKCl7Y29uc3R7dXNlckFnZW50OnR9PW5hdmlnYXRvcixyPXtuYW1lOkd0LHZlcnNpb246dm9pZCAwfTtpZih0Lm1hdGNoKC9DaHJvbWUvKSYmIXQubWF0Y2goL0VkZ2UvKSlpZih0Lm1hdGNoKC9FZGcoQT8pLykpe2NvbnN0IGU9dC5tYXRjaCgvQ2hyb21lXC8oW1xkLl0rKS8pWzFdO051bWJlci5wYXJzZUludChlLDEwKT43MiYmKHIubmFtZT1OZSxyLnZlcnNpb249ZSl9ZWxzZSByLm5hbWU9TmUsci52ZXJzaW9uPXQubWF0Y2goL0Nocm9tZVwvKFtcZC5dKykvKVsxXTtyZXR1cm4gcn1mdW5jdGlvbiBvZCgpe2NvbnN0e3VzZXJBZ2VudDp0fT1uYXZpZ2F0b3I7aWYodC5tYXRjaCgvRWxlY3Ryb24vKSl7Y29uc3Qgcj10Lm1hdGNoKC9FbGVjdHJvblwvKFtcZC5dKykvKVsxXTtyZXR1cm57bmFtZTpIcyx2ZXJzaW9uOnJ9fXJldHVybiBudWxsfWZ1bmN0aW9uIGNkKCl7Y29uc3R7dXNlckFnZW50OnR9PW5hdmlnYXRvcjtpZih0Lm1hdGNoKC9KaXRzaU1lZXROVy8pKXtjb25zdCByPXQubWF0Y2goL0ppdHNpTWVldE5XXC8oW1xkLl0rKS8pWzFdO3JldHVybntuYW1lOiRzLHZlcnNpb246cn19fWZ1bmN0aW9uIGRkKCl7Y29uc3QgdD1uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9cYihyZWFjdFsgXHRfLV0qbmF0aXZlKSg/OlwvKFxTKykpPy9pKTtsZXQgcjtpZih0fHxuYXZpZ2F0b3IucHJvZHVjdD09PSJSZWFjdE5hdGl2ZSIpcmV0dXJuIHQmJnQubGVuZ3RoPjImJih0WzFdLHI9dFsyXSkscnx8KHI9InVua25vd24iKSx7bmFtZTpLcyx2ZXJzaW9uOnJ9fWZ1bmN0aW9uIGxkKHQpe2xldCByO2NvbnN0IGU9W2RkLG9kLGNkXTtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rPTEpaWYocj1lW25dKCkscilyZXR1cm4gcjtjb25zdCBzPXQuZ2V0QnJvd3Nlck5hbWUoKTtyZXR1cm4gcyBpbiBQdD97bmFtZTpQdFtzXSx2ZXJzaW9uOnQuZ2V0QnJvd3NlclZlcnNpb24oKX06KHI9YWQoKSxyfHx7bmFtZTpHdCx2ZXJzaW9uOnZvaWQgMH0pfWNsYXNzIHVke2NvbnN0cnVjdG9yKCl7cCh0aGlzLCJfYm93c2VyIik7cCh0aGlzLCJfbmFtZSIpO3AodGhpcywiX3ZlcnNpb24iKTtwKHRoaXMsImdldERldmljZUluZm8iLCgpPT4oe2lzTW9iaWxlOnRoaXMuaXNNb2JpbGUoKSxicm93c2VyTmFtZTp0aGlzLl9ib3dzZXIuZ2V0QnJvd3Nlck5hbWUoKSxvc05hbWU6dGhpcy5fYm93c2VyLmdldE9TTmFtZSgpLGJyb3dzZXJWZXJzaW9uOnRoaXMuX2Jvd3Nlci5nZXRCcm93c2VyVmVyc2lvbigpLG9zVmVyc2lvbk5hbWU6dGhpcy5fYm93c2VyLmdldE9TVmVyc2lvbigpLGVuZ2luZU5hbWU6dGhpcy5fYm93c2VyLmdldEVuZ2luZU5hbWUoKX0pKX1pbml0KHIpe2xldCBlLHM7aWYodGhpcy5fYm93c2VyPWlkLmdldFBhcnNlcihuYXZpZ2F0b3IudXNlckFnZW50KSx0eXBlb2Ygcj09InVuZGVmaW5lZCIpe2NvbnN0IG49bGQodGhpcy5fYm93c2VyKTtlPW4ubmFtZSxzPW4udmVyc2lvbn1lbHNlIHIubmFtZSBpbiBQdD8oZT1QdFtyLm5hbWVdLHM9ci52ZXJzaW9uKTooZT1HdCxzPXZvaWQgMCk7dGhpcy5fbmFtZT1lLHRoaXMuX3ZlcnNpb249c31nZXROYW1lKCl7cmV0dXJuIHRoaXMuX25hbWV9aXNDaHJvbWUoKXtyZXR1cm4gdGhpcy5fbmFtZT09PU5lfWlzT3BlcmEoKXtyZXR1cm4gdGhpcy5fbmFtZT09PUJzfWlzRmlyZWZveCgpe3JldHVybiB0aGlzLl9uYW1lPT09eHN9aXNJRXhwbG9yZXIoKXtyZXR1cm4gdGhpcy5fbmFtZT09PWpzfWlzU2FmYXJpKCl7cmV0dXJuIHRoaXMuX25hbWU9PT1Vc31pc05XSlMoKXtyZXR1cm4gdGhpcy5fbmFtZT09PSRzfWlzRWxlY3Ryb24oKXtyZXR1cm4gdGhpcy5fbmFtZT09PUhzfWlzUmVhY3ROYXRpdmUoKXtyZXR1cm4gdGhpcy5fbmFtZT09PUtzfHxuYXZpZ2F0b3IuaXNSZWFjdE5hdGl2ZT09PSEwfWdldFZlcnNpb24oKXtyZXR1cm4gdGhpcy5fdmVyc2lvbn1pc01vYmlsZSgpe3JldHVybiB0aGlzLl9ib3dzZXIuZ2V0UGxhdGZvcm1UeXBlKCk9PT0ibW9iaWxlIn1fY2hlY2tDb25kaXRpb24ocil7aWYodGhpcy5fdmVyc2lvbilyZXR1cm4gdGhpcy5fYm93c2VyLnNhdGlzZmllcyhyKX1pc1ZlcnNpb25HcmVhdGVyVGhhbihyKXtyZXR1cm4gdGhpcy5fY2hlY2tDb25kaXRpb24oe1t0aGlzLl9uYW1lXTpgPiR7cn1gfSl9aXNWZXJzaW9uTGVzc1RoYW4ocil7cmV0dXJuIHRoaXMuX2NoZWNrQ29uZGl0aW9uKHtbdGhpcy5fbmFtZV06YDwke3J9YH0pfWlzVmVyc2lvbkVxdWFsVG8ocil7cmV0dXJuIHRoaXMuX2NoZWNrQ29uZGl0aW9uKHtbdGhpcy5fbmFtZV06YH4ke3J9YH0pfX1jbGFzcyBwZCBleHRlbmRzIHVke2RvZXNWaWRlb011dGVCeVN0cmVhbVJlbW92ZSgpe3JldHVybiB0aGlzLmlzQ2hyb21pdW1CYXNlZCgpfHx0aGlzLmlzV2ViS2l0QmFzZWQoKX1zdXBwb3J0c1AyUCgpe3JldHVybiF0aGlzLnVzZXNVbmlmaWVkUGxhbigpfWlzQ2hyb21pdW1CYXNlZCgpe3JldHVybiB0aGlzLmlzQ2hyb21lKCl8fHRoaXMuaXNFbGVjdHJvbigpfHx0aGlzLmlzTldKUygpfHx0aGlzLmlzT3BlcmEoKX1pc1dlYktpdEJhc2VkKCl7cmV0dXJuIHRoaXMuX2Jvd3Nlci5pc0VuZ2luZSgid2Via2l0IikmJnR5cGVvZiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzIT0idW5kZWZpbmVkIiYmdHlwZW9mIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhIT0idW5kZWZpbmVkIiYmdHlwZW9mIHdpbmRvdy5SVENSdHBUcmFuc2NlaXZlciE9InVuZGVmaW5lZCImJk9iamVjdC5rZXlzKFJUQ1J0cFRyYW5zY2VpdmVyLnByb3RvdHlwZSkuaW5kZXhPZigiY3VycmVudERpcmVjdGlvbiIpPi0xfWlzU3VwcG9ydGVkKCl7cmV0dXJuIHR5cGVvZiBSVENQZWVyQ29ubmVjdGlvbiE9InVuZGVmaW5lZCJ9aXNVc2VySW50ZXJhY3Rpb25SZXF1aXJlZEZvclVubXV0ZSgpe3JldHVybiB0aGlzLmlzRmlyZWZveCgpJiZ0aGlzLmlzVmVyc2lvbkxlc3NUaGFuKCI2OCIpfXN1cHBvcnRzVmlkZW9NdXRlT25Db25uSW50ZXJydXB0ZWQoKXtyZXR1cm4gdGhpcy5pc0Nocm9taXVtQmFzZWQoKXx8dGhpcy5pc1JlYWN0TmF0aXZlKCl8fHRoaXMuaXNXZWJLaXRCYXNlZCgpfXN1cHBvcnRzQmFuZHdpZHRoU3RhdGlzdGljcygpe3JldHVybiF0aGlzLmlzRmlyZWZveCgpJiYhdGhpcy5pc1dlYktpdEJhc2VkKCl9c3VwcG9ydHNDb2RlY1ByZWZlcmVuY2VzKCl7cmV0dXJuIHRoaXMudXNlc1VuaWZpZWRQbGFuKCkmJnR5cGVvZiB3aW5kb3cuUlRDUnRwVHJhbnNjZWl2ZXIhPSJ1bmRlZmluZWQiJiZPYmplY3Qua2V5cyh3aW5kb3cuUlRDUnRwVHJhbnNjZWl2ZXIucHJvdG90eXBlKS5pbmRleE9mKCJzZXRDb2RlY1ByZWZlcmVuY2VzIik+LTEmJk9iamVjdC5rZXlzKFJUQ1J0cFNlbmRlci5wcm90b3R5cGUpLmluZGV4T2YoImdldENhcGFiaWxpdGllcyIpPi0xJiYhdGhpcy5pc1dlYktpdEJhc2VkKCl9c3VwcG9ydHNEZXZpY2VDaGFuZ2VFdmVudCgpe3JldHVybiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzJiZ0eXBlb2YgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5vbmRldmljZWNoYW5nZSE9InVuZGVmaW5lZCImJnR5cGVvZiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmFkZEV2ZW50TGlzdGVuZXIhPSJ1bmRlZmluZWQifXN1cHBvcnRzTG9jYWxDYW5kaWRhdGVSdHRTdGF0aXN0aWNzKCl7cmV0dXJuIHRoaXMuaXNDaHJvbWl1bUJhc2VkKCl8fHRoaXMuaXNSZWFjdE5hdGl2ZSgpfHx0aGlzLmlzV2ViS2l0QmFzZWQoKX1zdXBwb3J0c1BlcmZvcm1hbmNlT2JzZXJ2ZXIoKXtyZXR1cm4gdHlwZW9mIHdpbmRvdy5QZXJmb3JtYW5jZU9ic2VydmVyIT0idW5kZWZpbmVkIiYmUGVyZm9ybWFuY2VPYnNlcnZlci5zdXBwb3J0ZWRFbnRyeVR5cGVzLmluZGV4T2YoImxvbmd0YXNrIik+LTF9c3VwcG9ydHNSZWNlaXZlclN0YXRzKCl7cmV0dXJuIHR5cGVvZiB3aW5kb3cuUlRDUnRwUmVjZWl2ZXIhPSJ1bmRlZmluZWQiJiZPYmplY3Qua2V5cyhSVENSdHBSZWNlaXZlci5wcm90b3R5cGUpLmluZGV4T2YoImdldFN5bmNocm9uaXphdGlvblNvdXJjZXMiKT4tMX1zdXBwb3J0c1JUVFN0YXRpc3RpY3MoKXtyZXR1cm4hdGhpcy5pc0ZpcmVmb3goKX11c2VzUGxhbkIoKXtyZXR1cm4hdGhpcy51c2VzVW5pZmllZFBsYW4oKX11c2VzU2RwTXVuZ2luZ0ZvclNpbXVsY2FzdCgpe3JldHVybiB0aGlzLmlzQ2hyb21pdW1CYXNlZCgpfHx0aGlzLmlzUmVhY3ROYXRpdmUoKXx8dGhpcy5pc1dlYktpdEJhc2VkKCl9dXNlc1VuaWZpZWRQbGFuKCl7cmV0dXJuISEodGhpcy5pc0ZpcmVmb3goKXx8dGhpcy5pc1dlYktpdEJhc2VkKCkpfXVzZXNOZXdHdW1GbG93KCl7cmV0dXJuISEodGhpcy5pc0Nocm9taXVtQmFzZWQoKXx8dGhpcy5pc0ZpcmVmb3goKXx8dGhpcy5pc1dlYktpdEJhc2VkKCkpfXVzZXNBZGFwdGVyKCl7cmV0dXJuIHRoaXMudXNlc05ld0d1bUZsb3coKX11c2VzUmlkc0ZvclNpbXVsY2FzdCgpe3JldHVybiExfXN1cHBvcnRzR2V0RGlzcGxheU1lZGlhKCl7cmV0dXJuIHR5cGVvZiBuYXZpZ2F0b3IuZ2V0RGlzcGxheU1lZGlhIT0idW5kZWZpbmVkInx8dHlwZW9mIG5hdmlnYXRvci5tZWRpYURldmljZXMhPSJ1bmRlZmluZWQiJiZ0eXBlb2YgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXREaXNwbGF5TWVkaWEhPSJ1bmRlZmluZWQifXN1cHBvcnRzSW5zZXJ0YWJsZVN0cmVhbXMoKXtpZighKHR5cGVvZiB3aW5kb3cuUlRDUnRwU2VuZGVyIT0idW5kZWZpbmVkIiYmKHdpbmRvdy5SVENSdHBTZW5kZXIucHJvdG90eXBlLmNyZWF0ZUVuY29kZWRTdHJlYW1zfHx3aW5kb3cuUlRDUnRwU2VuZGVyLnByb3RvdHlwZS5jcmVhdGVFbmNvZGVkVmlkZW9TdHJlYW1zKSkpcmV0dXJuITE7Y29uc3Qgcj1uZXcgUmVhZGFibGVTdHJlYW07dHJ5e3JldHVybiB3aW5kb3cucG9zdE1lc3NhZ2UociwiKiIsW3JdKSwhMH1jYXRjaChlKXtyZXR1cm4hMX19c3VwcG9ydHNBdWRpb1JlZCgpe3JldHVybiBCb29sZWFuKHdpbmRvdy5SVENSdHBTZW5kZXImJndpbmRvdy5SVENSdHBTZW5kZXIuZ2V0Q2FwYWJpbGl0aWVzJiZ3aW5kb3cuUlRDUnRwU2VuZGVyLmdldENhcGFiaWxpdGllcygiYXVkaW8iKS5jb2RlY3Muc29tZShyPT5yLm1pbWVUeXBlPT09ImF1ZGlvL3JlZCIpJiZ3aW5kb3cuUlRDUnRwUmVjZWl2ZXImJndpbmRvdy5SVENSdHBSZWNlaXZlci5nZXRDYXBhYmlsaXRpZXMmJndpbmRvdy5SVENSdHBSZWNlaXZlci5nZXRDYXBhYmlsaXRpZXMoImF1ZGlvIikuY29kZWNzLnNvbWUocj0+ci5taW1lVHlwZT09PSJhdWRpby9yZWQiKSl9c3VwcG9ydHNTZHBTZW1hbnRpY3MoKXtyZXR1cm4gdGhpcy5pc0Nocm9taXVtQmFzZWQoKX1fZ2V0Q2hyb21pdW1CYXNlZFZlcnNpb24oKXtpZih0aGlzLmlzQ2hyb21pdW1CYXNlZCgpKXtpZih0aGlzLmlzTldKUygpKXJldHVybiBOdW1iZXIucGFyc2VJbnQocHJvY2Vzcy52ZXJzaW9ucy5jaHJvbWl1bSwxMCk7Y29uc3Qgcj1uYXZpZ2F0b3IudXNlckFnZW50O2lmKHIubWF0Y2goL0Nocm9tZS8pKXJldHVybiBOdW1iZXIucGFyc2VJbnQoci5tYXRjaCgvQ2hyb21lXC8oW1xkLl0rKS8pWzFdLDEwKX1yZXR1cm4tMX1pc0lPU01vYmlsZSgpe3JldHVybiB0aGlzLmlzTW9iaWxlJiZ0aGlzLl9ib3dzZXIuZ2V0T1NOYW1lKCk9PT0iaU9TIn19Y29uc3QgaGQ9bmV3IHBkO2NsYXNzIGZke2NvbnN0cnVjdG9yKCl7cCh0aGlzLCJsb2dzQ2FjaGUiLFtdKTtwKHRoaXMsImxvZ3NQcm9jZXNzb3JUaW1lciIpO3AodGhpcywiY29tcHJlc3Npb25TdXBwb3J0ZWQiLG51bGwpO3AodGhpcywidHJhY2luZ0VuYWJsZWQiLCEwKTtwKHRoaXMsImluaXRpYWxpemVkIiwhMSk7cCh0aGlzLCJsb2dzUHJvY2Vzc2luZ0ludGVydmFsIiw3ZTMpO3AodGhpcywibG9nRXhjbHVzaW9uTGlzdCIsWyJtZXNzYWdlIiwid2Vic29ja2V0L21lc3NhZ2UiLCJyb29tTWVzc2FnZSIsIndlYnNvY2tldC9yb29tLW1lc3NhZ2UiLCJ3ZWJzb2NrZXQvcm9vbS1sZWdhY3ktbW9kZSIsImNoYXRNZXNzYWdlIiwid2Vic29ja2V0L25ldy1jaGF0LW1lc3NhZ2UiLCJ3ZWJzb2NrZXQvbm8tYWN0aXZlLXNwZWFrZXIiLCJ3ZWJzb2NrZXQvc2VsZWN0ZWQtcGVlcnMiLCJ3ZWJzb2NrZXQvYWN0aXZlLXNwZWFrZXIiLCJwaW5nIiwid2Vic29ja2V0L25ldy1jb25zdW1lciIsIndlYnNvY2tldC9wcm9kdWNlci1zY29yZSIsIndlYnNvY2tldC9jb25zdW1lci1zY29yZSIsIndlYnNvY2tldC9wbHVnaW4tZXZlbnQiLCJ3ZWJzb2NrZXQvcGx1Z2luLWRhdGEiLCJ3ZWJzb2NrZXQvcGx1Z2luLWludGVybmFsLWRhdGEiXSk7cCh0aGlzLCJtZWV0aW5nTWV0YWRhdGEiLHt9KX1pc0NvbXByZXNzaW9uU3VwcG9ydGVkKCl7aWYodGhpcy5jb21wcmVzc2lvblN1cHBvcnRlZD09PW51bGwpdHJ5e3RoaXMuY29tcHJlc3Npb25TdXBwb3J0ZWQ9dHlwZW9mIENvbXByZXNzaW9uU3RyZWFtIT0idW5kZWZpbmVkIiYmdHlwZW9mIEJsb2IhPSJ1bmRlZmluZWQiJiZ0eXBlb2YgQmxvYi5wcm90b3R5cGUuc3RyZWFtPT0iZnVuY3Rpb24iJiZ0eXBlb2YgUmVzcG9uc2UhPSJ1bmRlZmluZWQifWNhdGNoKHIpe3RoaXMuY29tcHJlc3Npb25TdXBwb3J0ZWQ9ITEsdGhpcy5hZGRMb2dJbkN1cnJlbnRTcGFuKCJ3YXJuIiwiQ29tcHJlc3Npb24gZmVhdHVyZSBkZXRlY3Rpb24gZmFpbGVkLCB1c2luZyB1bmNvbXByZXNzZWQgbG9ncyIse2Vycm9yOnJ9KX1yZXR1cm4gdGhpcy5jb21wcmVzc2lvblN1cHBvcnRlZH1nZXQgbG9nc0VuZHBvaW50KCl7Y29uc3Qgcj1QZS5nZXRDb250ZXh0KHRoaXMubWVldGluZ01ldGFkYXRhLnBlZXJJZCk7cmV0dXJuYGh0dHBzOi8vJHtKYyh7c2VydmljZVByZWZpeDoiYXBpLXNpbG9zIixiYXNlVVJJOnIuZ2V0VmFsdWUoImJhc2VVUkkiKX0pfS9vdGVsL2xvZ3NgfWdldCBsb2dzQmF0Y2hTaXplKCl7cmV0dXJuIHRoaXMuaXNDb21wcmVzc2lvblN1cHBvcnRlZCgpPzEwMDoyNX1yZXNldFBlZXJJZChyKXt0aGlzLm1lZXRpbmdNZXRhZGF0YS5wZWVySWQ9cn1pbml0KHIsZSxzKXt0aGlzLnRyYWNpbmdFbmFibGVkPSEwLHRoaXMuaW5pdGlhbGl6ZWQ9ITEsdGhpcy5sb2dzQ2FjaGU9W107Y29uc3Qgbj1yLmdldFZhbHVlKCJwZWVySWQiKTt0aGlzLm1lZXRpbmdNZXRhZGF0YT1lLHRoaXMudHJhY2luZ0VuYWJsZWQ9cyx0aGlzLm1lZXRpbmdNZXRhZGF0YS5wZWVySWQ9bix0aGlzLm1lZXRpbmdNZXRhZGF0YS5zZGtWZXJzaW9uPXIuZ2V0VmFsdWUoInNka1ZlcnNpb24iKTtjb25zdHtSTkRldmljZUluZm9JbXBsOml9PW5hdmlnYXRvcjt0aGlzLm1lZXRpbmdNZXRhZGF0YS5kZXZpY2VJbmZvPW5hdmlnYXRvci5pc1JlYWN0TmF0aXZlP2k9PW51bGw/dm9pZCAwOmkuZ2V0RGV2aWNlSW5mbygpOmhkLmdldERldmljZUluZm8oKSx0aGlzLm1lZXRpbmdNZXRhZGF0YS52aXNpdGVkVXJsPSFuYXZpZ2F0b3IuaXNSZWFjdE5hdGl2ZSYmdHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJndpbmRvdy5sb2NhdGlvbi5ocmVmLHRoaXMubG9nc1Byb2Nlc3NvclRpbWVyPXNldEludGVydmFsKCgpPT50aGlzLnByb2Nlc3NDYWNoZWRMb2dzKCkuY2F0Y2goKCk9Pnt9KSx0aGlzLmxvZ3NQcm9jZXNzaW5nSW50ZXJ2YWwpLHMmJih0aGlzLmluaXRpYWxpemVkPSEwKX1zdGF0aWMgdHJhY2UocixlPXZvaWQgMCl7cmV0dXJuKHMsbixpKT0+e2NvbnN0IGE9aS52YWx1ZTtyZXR1cm4gaS52YWx1ZT1mdW5jdGlvbiguLi5vKXt2YXIgRTtjb25zdCBsPXRoaXM9PW51bGw/dm9pZCAwOnRoaXMudGVsZW1ldHJ5O2lmKCFsfHwhbC5pbml0aWFsaXplZHx8bmF2aWdhdG9yLmlzUmVhY3ROYXRpdmV8fCFsLnRyYWNpbmdFbmFibGVkfHwoRT1QZS5nZXRDb250ZXh0KGwubWVldGluZ01ldGFkYXRhLnBlZXJJZCkpIT1udWxsJiZFLmdldFZhbHVlKCJmbGFnc21pdGgiKS5oYXNGZWF0dXJlKFd0LlNLSVBfT1RFTF9UUkFDRVMpKXJldHVybiBhLmFwcGx5KHRoaXMsbyk7bC5hZGRMb2dJbkN1cnJlbnRTcGFuKCJpbmZvIixyLGUpO2NvbnN0IGY9cGVyZm9ybWFuY2Uubm93KCkseT1hLmFwcGx5KHRoaXMsbyk7cmV0dXJuIFByb21pc2UucmVzb2x2ZSh5KS50aGVuKCgpPT57Y29uc3Qgdz1wZXJmb3JtYW5jZS5ub3coKTt3LWY+MTAmJmwuYWRkTG9nSW5DdXJyZW50U3BhbigiaW5mbyIsYCR7cn1fdGltaW5nYCx7ZXhlY1RpbWU6dy1mfSl9KS5jYXRjaCgoKT0+e2NvbnN0IHc9cGVyZm9ybWFuY2Uubm93KCk7bC5hZGRMb2dJbkN1cnJlbnRTcGFuKCJpbmZvIixgJHtyfV90aW1pbmdgLHtleGVjVGltZTp3LWZ9KX0pLHl9LGl9fWluamVjdENvbnRleHQocil7dmFyIG47Y29uc3QgZT16YygpLnJlcGxhY2UoLy0vZywiIikuc3Vic3RyaW5nKDAsMTYpLHM9KG49dGhpcy5tZWV0aW5nTWV0YWRhdGEucGVlcklkKT09bnVsbD92b2lkIDA6bi5yZXBsYWNlKC8tL2csIiIpO3IuVFJBQ0VQQVJFTlQ9YDAwLSR7c30tJHtlfS0wMWB9YWRkTG9nSW5DdXJyZW50U3BhbihyLGUscz17fSxuPSExKXtzIT1udWxsJiZzLmVycm9yJiZPYmplY3QuYXNzaWduKHMse2Vycm9yOlJ0KHMuZXJyb3IpfSk7Y29uc3QgaT1QZS5nZXRDb250ZXh0KHRoaXMubWVldGluZ01ldGFkYXRhLnBlZXJJZCk7aWYoTHMoaSkmJihRYyhzKT9jb25zb2xlW3JdKCJJbnRlcm5hbExvZ3M6OiAiLHIsZSk6Y29uc29sZVtyXSgiSW50ZXJuYWxMb2dzOjogIixyLGUscykpLCEhWmMoaSxyKSl0cnl7Y29uc3QgZD1OcyhpLGUscywibWV0YWRhdGEiKSxvPW5ldyBEYXRlLGw9b3QoUSh7bWVzc2FnZTplLGxldmVsOnJ9LGQpLHtsb2dnZWRBdDpvLnRvSVNPU3RyaW5nKCksbG9nZ2VkQXRUek9mZnNldDpvLmdldFRpbWV6b25lT2Zmc2V0KCl9KTtuP3RoaXMuc2VuZE90ZWxMb2dzVG9OZXdSZWxpYyhbbF0se2lzSW5EZXN0cnVjdGlvbk1vZGU6ITF9KS5jYXRjaCgoKT0+e30pOnRoaXMubG9nc0NhY2hlLnB1c2gobCl9Y2F0Y2goZCl7dGhpcy5hZGRMb2dJbkN1cnJlbnRTcGFuKCJlcnJvciIsIm9wZW50ZWxlbWV0cnk6OmFkZExvZ0luQ3VycmVudFNwYW5fZmFpbGVkIix7ZXJyb3I6UnQoZCl9KX19c2VuZE90ZWxMb2dzVG9OZXdSZWxpYyhzKXtyZXR1cm4gSSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbioocix7aXNJbkRlc3RydWN0aW9uTW9kZTplPSExfT17aXNJbkRlc3RydWN0aW9uTW9kZTohMX0pe2NvbnN0IG49bmV3IEFib3J0Q29udHJvbGxlcixpPXNldFRpbWVvdXQoKCk9Pm4uYWJvcnQoIkxvZ3MgcmVxdWVzdCB0aW1lZCBvdXQgYWZ0ZXIgOCBzZWNvbmRzIiksOGUzKTt0cnl7Y29uc3QgYT1QZS5nZXRDb250ZXh0KHRoaXMubWVldGluZ01ldGFkYXRhLnBlZXJJZCksZD1KU09OLnN0cmluZ2lmeSh7bWVldGluZ01ldGFkYXRhOk5zKGEsInNlbmRPdGVsTG9nc1RvTmV3UmVsaWMiLHRoaXMubWVldGluZ01ldGFkYXRhLCJtZWV0aW5nTWV0YWRhdGEiKSxzZXJ2aWNlTmFtZTphLmdldFZhbHVlKCJzZGtOYW1lIiksbG9nczpyfSk7bGV0IG87Y29uc3QgbD17QXV0aG9yaXphdGlvbjpgQmVhcmVyICR7YS5nZXRWYWx1ZSgiYXV0aFRva2VuIil9YH07aWYodGhpcy5pc0NvbXByZXNzaW9uU3VwcG9ydGVkKCkpe2NvbnN0IGY9bmV3IEJsb2IoW2RdKS5zdHJlYW0oKS5waXBlVGhyb3VnaChuZXcgQ29tcHJlc3Npb25TdHJlYW0oImd6aXAiKSk7bz15aWVsZCBuZXcgUmVzcG9uc2UoZikuYXJyYXlCdWZmZXIoKSxsWyJDb250ZW50LVR5cGUiXT0iYXBwbGljYXRpb24vZ3ppcCIsbFsiQ29udGVudC1FbmNvZGluZyJdPSJnemlwIn1lbHNlIG89ZCxsWyJDb250ZW50LVR5cGUiXT0iYXBwbGljYXRpb24vanNvbiI7eWllbGQgZmV0Y2godGhpcy5sb2dzRW5kcG9pbnQse21ldGhvZDoiUE9TVCIsaGVhZGVyczpsLGJvZHk6byxzaWduYWw6bi5zaWduYWwsa2VlcGFsaXZlOiEhZX0pfWNhdGNoKGEpe2V8fCh0aGlzLmFkZExvZ0luQ3VycmVudFNwYW4oImVycm9yIiwib3BlbnRlbGVtZXRyeTo6c2VuZE90ZWxMb2dUb05ld1JlbGljX2ZhaWxlZCIse2Vycm9yOlJ0KGEpfSksdGhpcy5sb2dzQ2FjaGUucHVzaCguLi5yKSl9ZmluYWxseXtjbGVhclRpbWVvdXQoaSl9fSl9cHJvY2Vzc0NhY2hlZExvZ3MoKXtyZXR1cm4gSSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbiooe2lzSW5EZXN0cnVjdGlvbk1vZGU6cj0hMX09e2lzSW5EZXN0cnVjdGlvbk1vZGU6ITF9KXtjb25zdCBlPXRoaXMubG9nc0NhY2hlLnNwbGljZSgwLHRoaXMubG9nc0JhdGNoU2l6ZSk7ZSE9bnVsbCYmZS5sZW5ndGgmJih5aWVsZCB0aGlzLnNlbmRPdGVsTG9nc1RvTmV3UmVsaWMoZSx7aXNJbkRlc3RydWN0aW9uTW9kZTpyfSkpfSl9ZGVzdHJ1Y3QoKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Zm9yKGNsZWFySW50ZXJ2YWwodGhpcy5sb2dzUHJvY2Vzc29yVGltZXIpO3RoaXMubG9nc0NhY2hlLmxlbmd0aDspeWllbGQgdGhpcy5wcm9jZXNzQ2FjaGVkTG9ncyh7aXNJbkRlc3RydWN0aW9uTW9kZTohMH0pfSl9fWZ1bmN0aW9uIG1kKHQpe2NvbnN0IHI9USh7fSx0KSxlPW5ldyBNYXAscz0obCxmKT0+KGUuaGFzKGwpfHxlLnNldChsLG5ldyBTZXQpLGUuZ2V0KGwpLmFkZChmKSwoKT0+e3ZhciB5O3JldHVybih5PWUuZ2V0KGwpKT09bnVsbD92b2lkIDA6eS5kZWxldGUoZil9KSxuPShsLGYpPT57dmFyIHk7KHk9ZS5nZXQobCkpPT1udWxsfHx5LmRlbGV0ZShmKX0saT1sPT57dmFyIGY7KGY9ZS5nZXQobCkpPT1udWxsfHxmLmZvckVhY2goeT0+e3RyeXt5KHJbbF0pfWNhdGNoKEUpe319KX07cmV0dXJue3N1YnNjcmliZTpzLHVuc3Vic2NyaWJlOm4sbm90aWZ5Omksc2V0VmFsdWU6KGwsZix5PSEwKT0+e3JbbF09Zix5JiZpKGwpfSxnZXRWYWx1ZTpsPT5yW2xdLGdldEFsbFZhbHVlczooKT0+cn19Y2xhc3MgZ2R7Y29uc3RydWN0b3IoKXtwKHRoaXMsImNvbnRleHRzIixuZXcgTWFwKTtwKHRoaXMsIm1vc3RSZWNlbnRQZWVySWQiLG51bGwpfWNyZWF0ZUNvbnRleHQocixlKXtpZih0aGlzLmNvbnRleHRzLmhhcyhyKSlyZXR1cm4gdGhpcy5jb250ZXh0cy5nZXQocik7Y29uc3Qgcz1uZXcgZmQsbj1uZXcgeGM7dGhpcy5jb250ZXh0cy5zZXQocixtZChlKSksdGhpcy5jb250ZXh0cy5nZXQocikuc2V0VmFsdWUoInBlZXJTZXNzaW9uU3RvcmUiLG5ldyBLdChuKSk7Y29uc3QgaT1uZXcgTnI7cmV0dXJuIGkuc2V0TWF4TGlzdGVuZXJzKDUwKSx0aGlzLmNvbnRleHRzLmdldChyKS5zZXRWYWx1ZSgibG9nZ2VyIixuKSx0aGlzLmNvbnRleHRzLmdldChyKS5zZXRWYWx1ZSgidGVsZW1ldHJ5IixzKSx0aGlzLmNvbnRleHRzLmdldChyKS5zZXRWYWx1ZSgiY2FsbHN0YXRzIixpKSx0aGlzLmNvbnRleHRzLmdldChyKS5zZXRWYWx1ZSgiZmxhZ3NtaXRoIixBYygpKSx0aGlzLm1vc3RSZWNlbnRQZWVySWQ9cix0aGlzLmNvbnRleHRzLmdldChyKX1yZW1hcENvbnRleHQocixlKXtjb25zdCBzPWUuZ2V0VmFsdWUoInBlZXJJZCIpO3MhPT1yJiYoZS5zZXRWYWx1ZSgicGVlcklkIixyKSx0aGlzLm1vc3RSZWNlbnRQZWVySWQ9cix0aGlzLmNvbnRleHRzLnNldChyLGUpLHRoaXMuY29udGV4dHMuZGVsZXRlKHMpKX1nZXRDb250ZXh0KHIpe3JldHVybiB0aGlzLmNvbnRleHRzLmdldChyKX1nZXRNb3N0UmVjZW50UGVlcklkKCl7cmV0dXJuIHRoaXMubW9zdFJlY2VudFBlZXJJZH19dmFyIFBlPW5ldyBnZDtjb25zdCBTZD17IjAwIjoiQ2xpZW50IiwiMDEiOiJDb250cm9sbGVyIiwiMDIiOiJSb29tTm9kZUNsaWVudCIsIjAzIjoiSGl2ZU5vZGVDbGllbnQiLCIwNCI6IlNvY2tldFNlcnZpY2UiLCIwNSI6IkNoYXQiLCIwNiI6IlBsdWdpbiIsIjA3IjoiUG9sbHMiLCIwOCI6Ik1ldGEiLCIwOSI6IlByZXNldCIsMTA6IlJlY29yZGluZyIsMTE6IlNlbGYiLDEyOiJQYXJ0aWNpcGFudCIsMTM6IlNwb3RsaWdodCIsMTQ6IlJlbW90ZSBSZXF1ZXN0IiwxNToiV2ViaW5hciIsMTY6IkxvY2FsTWVkaWFIYW5kbGVyIiwxNzoiRW5kLUVuZCBFbmNyeXB0aW9uIiwxODoiQUkiLDE5OiJMaXZlc3RyZWFtIiwyMDoiU3RhZ2UifSxDdD17IjAwMDAiOiJJbnRlcm5hbCBleGNlcHRpb24uIiwiMDAwMSI6IkZhaWxlZCB0byBpbml0aWFsaXplLiIsIjAwMDIiOiJGYWlsZWQgdG8gam9pbiByb29tLiIsIjAwMDMiOiJGYWlsZWQgdG8gbGVhdmUgcm9vbS4iLCIwMDA0IjoiSW52YWxpZCBhdXRoIHRva2VuIiwiMDAxMCI6IkJyb3dzZXIgbm90IHN1cHBvcnRlZCIsIjAwMTEiOiJIVFRQIE5ldHdvcmsgRXJyb3IiLCIwMDEyIjoiV2Vic29ja2V0IE5ldHdvcmsgRXJyb3IiLCIwMDEzIjoiUmF0ZSBMaW1pdGVkIiwiMDEwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjAxMDEiOiJQZXJtaXNzaW9uIGRlbmllZCIsIjAxMDIiOiJQcmVyZXF1aXNpdGUgbW9kdWxlIG1pc3NpbmciLCIwMjAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uLiIsIjAzMDAiOiJJbnRlcm5hbCBleGNlcHRpb24iLCIwNDAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDQwNCI6Ik1pc3NpbmcgcHJlcmVxdWlzaXRlcyB0byBlc3RhYmxpc2ggYSB3ZWJzb2NrZXQgY29ubmVjdGlvbiIsIjA1MDAiOiJJbnRlcm5hbCBleGNlcHRpb24iLCIwNTAxIjoiUGVybWlzc2lvbiBkZW5pZWQuIiwiMDUwMiI6IkludmFsaWQgbWVzc2FnZSBib2R5LiIsIjA1MDMiOiJUZXh0IE1lc3NhZ2UgaXMgdG9vIGxhcmdlIiwiMDUwNCI6Ik1lc3NhZ2Ugbm90IGZvdW5kIGJ5IHRoZSBnaXZlbiBpZCIsIjA1MDUiOiJBY3Rpb24gbm90IHBlcm1pdHRlZCB3aXRob3V0IGpvaW5pbmcgcm9vbSIsIjA1MDYiOiJNZXNzYWdlIHNlYXJjaCBpcyBkaXNhYmxlZCIsIjA2MDAiOiJJbnRlcm5hbCBleGNlcHRpb24iLCIwNjAxIjoiUGVybWlzc2lvbiBkZW5pZWQuIiwiMDYwMiI6IkF1dGggdG9rZW4gbm90IHNldCBmb3IgcGx1Z2luIiwiMDYwMyI6IklmcmFtZSB3YXMgbm90IHByb3ZpZGVkIiwiMDcwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjA3MDUiOiJBY3Rpb24gbm90IHBlcm1pdHRlZCB3aXRob3V0IGpvaW5pbmcgcm9vbSIsIjA4MDAiOiJJbnRlcm5hbCBleGNlcHRpb24iLCIwODAxIjoiUGVybWlzc2lvbiBkZW5pZWQiLCIwOTAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDkwNCI6IkNvdWxkIG5vdCBsb2FkIHByZXNldCIsMWUzOiJJbnRlcm5hbCBleGNlcHRpb24iLDEwMDE6IlBlcm1pc3Npb24gZGVuaWVkIiwxMDA0OiJDb3VsZCBub3QgZmluZCBzcGVjaWZpZWQgcmVjb3JkaW5nIiwxMDA1OiJBY3Rpb24gbm90IHBlcm1pdHRlZCBpbiBnaXZlbiByZWNvcmRpbmcgc3RhdGUiLDExMDA6IkludGVybmFsIGV4Y2VwdGlvbiIsMTEwMToiUGVybWlzc2lvbiBkZW5pZWQiLDExMDI6IlVuc3VwcG9ydGVkIiwxMTAzOiJOYW1lIGNhbm5vdCBiZSBlbXB0eSIsMTEwNDoiTm8gZGV2aWNlIHNlbGVjdGVkIHdoaWxlIGNhbGxpbmcgbWVldGluZy5zZWxmLnNldERldmljZSIsMTEwNToiQWN0aW9uIG5vdCBwZXJtaXR0ZWQgd2l0aG91dCBqb2luaW5nIHJvb20iLDExMDY6IkNhbid0IHNldCBjdXJyZW50bHkgdXNlZCBkZXZpY2UiLDEyMDA6IkludGVybmFsIGV4Y2VwdGlvbiIsMTIwMToiUGVybWlzc2lvbiBkZW5pZWQiLDEyMDI6IkludmFsaWQgcGFnZSBudW1iZXIgd2FzIHJlcXVlc3RlZCIsMTIwMzoiSW52YWxpZCBwYXJ0aWNpcGFudCBjb3VudCBwZXIgcGFnZSB3YXMgcmVxdWVzdGVkIiwxMjA0OiJObyBwYXJ0aWNpcGFudHMgZXhpc3RzIHdpdGggdGhlIGdpdmVuIFVzZXJJZHMiLDEyMDU6IkFjdGlvbiBub3QgcGVybWl0dGVkIHdpdGhvdXQgam9pbmluZyByb29tIiwxMjA2OiJNYW51YWwgU3Vic2NyaXB0aW9uIE1vZGUgd2FzIG5vdCBBQ1RJVkFURUQiLDEyMDc6IkludmFsaWQgdmlldyBtb2RlIiwxMjA4OiJNYW51YWwgU3Vic2NyaXB0aW9uIG5vdCBlbmFibGVkIGZvciBvcmdhbml6YXRpb24iLDEyMDk6IkJyb2FkY2FzdCBtZXNzYWdlIHR5cGUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmciLDEzMDA6IkludGVybmFsIGV4Y2VwdGlvbiIsMTQwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxNDAyOiJObyBleGlzdGluZyByZW1vdGUgcmVxdWVzdHMiLDE0MDM6Ik5vIHBlZXIgZXhpc3RzIHdpdGggZ2l2ZW4gaWQiLDE1MDA6IkludGVybmFsIGV4Y2VwdGlvbiIsMTYwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxNjAxOiJGYWlsZWQgdG8gZ2V0IGF1ZGlvIHRyYWNrIiwxNjAyOiJGYWlsZWQgdG8gZ2V0IHZpZGVvIHRyYWNrIiwxNjAzOiJJbmNvcnJlY3QgZGV2aWNlIiwxNjA0OiJGYWlsZWQgdG8gY2hhbmdlIGRldmljZSIsMTYwNToiRmFpbGVkIHRvIGdldCBhdWRpbyAmIHZpZGVvIHRyYWNrIiwxNjA2OiJObyBhdWRpbyBpbnB1dCBkZXZpY2VzIGFyZSBhdmFpbGFibGUiLDE2MDc6Ik5vIHZpZGVvIGlucHV0IGRldmljZXMgYXJlIGF2YWlsYWJsZSIsMTYwODoiTm8gYXVkaW8gb3V0cHV0IGRldmljZXMgKHNwZWFrZXJzKSBhcmUgYXZhaWxhYmxlIiwxNjA5OiJGYWlsZWQgdG8gZmV0Y2ggbGlzdCBvZiBtZWRpYSBkZXZpY2VzIiwxNjEwOiJObyBtZWRpYSB0cmFjayBleGlzdHMiLDE2MTE6IkZhaWxlZCB0byB1bm11dGUgdHJhY2siLDE2MTI6IkZhaWxlZCB0byBnZXQgc2NyZWVuc2hhcmUgdHJhY2tzIiwxNzAxOiJDcnlwdG8gZXJyb3IiLDE4MDA6IkludGVybmFsIGV4Y2VwdGlvbiIsMTgwMToiQ2FuJ3QgZmV0Y2ggdHJhbnNjcmlwdCBmaWxlIiwxOTAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDE5MDE6IlBlcm1pc3Npb24gZGVuaWVkLiIsMTkwMjoiTGl2ZXN0cmVhbSB0aGF0IGhhcyBub3QgeWV0IHN0YXJ0ZWQsIGNhbid0IGJlIHN0b3BwZWQiLDJlMzoiSW50ZXJuYWwgZXhjZXB0aW9uIiwyMDAxOiJQZXJtaXNzaW9uIGRlbmllZCIsMjAwMjoiVW5zdXBwb3J0ZWQiLDIwMDM6IlN0YWdlIGlzIGRpc2FibGVkIiwyMDA0OiJNZXRob2Qgbm90IGltcGxlbWVudGVkIiwyMDA1OiJBY3Rpb24gbm90IHBlcm1pdHRlZCB3aXRob3V0IGpvaW5pbmcgcm9vbSIsMjAwNjoiQWN0aW9uIG5vdCBwZXJtaXR0ZWQgaW4gY3VycmVudCBzdGFnZSBzdGF0dXMiLDk5MDA6IkludGVybmFsIGV4Y2VwdGlvbiJ9O09iamVjdC5rZXlzKEN0KS5mb3JFYWNoKHQ9PntDdFt0XT1geyR7U2RbdC5zbGljZSgwLDIpXX19ICR7Q3RbdF19YH0pO2NsYXNzIHlkIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoZSxzLG49dm9pZCAwLGk9ITEpe3N1cGVyKGUpO3AodGhpcywiY29kZSIpO3RoaXMuY29kZT1zLHRoaXMubmFtZT0iQ2xpZW50RXJyb3IiO2NvbnN0IGE9dGhpcy5jb2RlP2BbRVJSJHt0aGlzLmNvZGV9XWA6IltFUlJdIixkPXRoaXMuY29kZT9DdFt0aGlzLmNvZGVdOiIiO3RoaXMubWVzc2FnZT1gJHthfTogJHtkfQoke3RoaXMubWVzc2FnZX1gO3RyeXtsZXQgbz1pJiYhIW47cyYmcy5lbmRzV2l0aCgiMDAiKSYmbiYmKG89ITApLG8mJm4uZXJyb3IoIkNsaWVudEVycm9yIix7ZXJyb3I6e21lc3NhZ2U6dGhpcy5tZXNzYWdlLG5hbWU6dGhpcy5uYW1lLGNvZGU6c319KTtjb25zdCBsPVBlLmdldENvbnRleHQoUGUuZ2V0TW9zdFJlY2VudFBlZXJJZCgpKTtpZihsKXtjb25zdCBmPWwuZ2V0VmFsdWUoIm9uRXJyb3IiKTt0cnl7Zih0aGlzKX1jYXRjaCh5KXt9fXR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiJiZ3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoIkNsaWVudEVycm9yIix7ZGV0YWlsOnRoaXN9KSl9Y2F0Y2gobyl7fX19dmFyIGZlPSh0PT4odFt0LkludmFsaWRLZXk9MF09IkludmFsaWRLZXkiLHRbdC5NaXNzaW5nS2V5PTFdPSJNaXNzaW5nS2V5Iix0W3QuSW50ZXJuYWxFcnJvcj0yXT0iSW50ZXJuYWxFcnJvciIsdCkpKGZlfHx7fSk7Y2xhc3MgbWUgZXh0ZW5kcyB5ZHtjb25zdHJ1Y3RvcihlLHM9Mil7c3VwZXIoZSwiMTcwMSIpO3AodGhpcywicmVhc29uIik7dGhpcy5yZWFzb249c319Y2xhc3MgenMgZXh0ZW5kcyBxLkV2ZW50RW1pdHRlcntjb25zdHJ1Y3RvcihlKXtzdXBlcigpO3AodGhpcywibG9nZ2VyIik7dGhpcy5sb2dnZXI9ZSxzdXBlci5zZXRNYXhMaXN0ZW5lcnMoMjUpfWVtaXQoZSwuLi5zKXtyZXR1cm4gc3VwZXIuZW1pdCgiKiIsZSwuLi5zKSxzdXBlci5lbWl0KGUsLi4ucyl9b24oZSxzKXt2YXIgbjt0cnl7Y29uc3QgaT10aGlzLmxpc3RlbmVyQ291bnQoZSk7aT4yNSYmaSUyNT09PTAmJigobj10aGlzLmxvZ2dlcik9PW51bGx8fG4ud2FybigiQ3VzdG9tRXZlbnRFbWl0dGVyOjptYXhMaXN0ZW5lcnNFeGNlZWRlZCIse2V2ZW50TGlzdGVuZXI6e2V2ZW50TmFtZTplLnRvU3RyaW5nKCksbGlzdGVuZXJDb3VudDp0aGlzLmxpc3RlbmVyQ291bnQoZSl9fSkpfWNhdGNoKGkpe31yZXR1cm4gc3VwZXIub24oZSxzKX1hZGRMaXN0ZW5lcihlLHMpe3ZhciBuO3RyeXtjb25zdCBpPXRoaXMubGlzdGVuZXJDb3VudChlKTtpPjI1JiZpJTI1PT09MCYmKChuPXRoaXMubG9nZ2VyKT09bnVsbHx8bi53YXJuKCJDdXN0b21FdmVudEVtaXR0ZXI6Om1heExpc3RlbmVyc0V4Y2VlZGVkIix7ZXZlbnRMaXN0ZW5lcjp7ZXZlbnROYW1lOmUudG9TdHJpbmcoKSxsaXN0ZW5lckNvdW50OnRoaXMubGlzdGVuZXJDb3VudChlKX19KSl9Y2F0Y2goaSl7fXJldHVybiBzdXBlci5hZGRMaXN0ZW5lcihlLHMpfW9mZihlLHMpe3JldHVybiBzdXBlci5vZmYoZSxzKX1vbmNlKGUscyl7cmV0dXJuIHN1cGVyLm9uY2UoZSxzKX1wcmVwZW5kTGlzdGVuZXIoZSxzKXtyZXR1cm4gc3VwZXIucHJlcGVuZExpc3RlbmVyKGUscyl9cHJlcGVuZE9uY2VMaXN0ZW5lcihlLHMpe3JldHVybiBzdXBlci5wcmVwZW5kT25jZUxpc3RlbmVyKGUscyl9cmVtb3ZlTGlzdGVuZXIoZSxzKXtyZXR1cm4gc3VwZXIucmVtb3ZlTGlzdGVuZXIoZSxzKX1yZW1vdmVBbGxMaXN0ZW5lcnMoZSl7cmV0dXJuIHN1cGVyLnJlbW92ZUFsbExpc3RlbmVycyhlKX1saXN0ZW5lcnMoZSl7cmV0dXJuIHN1cGVyLmxpc3RlbmVycyhlKX1saXN0ZW5lckNvdW50KGUpe3JldHVybiBzdXBlci5saXN0ZW5lckNvdW50KGUpfX1jb25zdCBxdD17RXJyb3I6ImNyeXB0b3JFcnJvciJ9O2Z1bmN0aW9uIHZkKHQpe3JldHVybiJ0eXBlImluIHR9ZnVuY3Rpb24gYmQocyl7cmV0dXJuIEkodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24qKHQscj17bmFtZTprfSxlPSJlbmNyeXB0Iil7cmV0dXJuIGNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KCJyYXciLHQsciwhMSxlPT09ImRlcml2ZSI/WyJkZXJpdmVCaXRzIiwiZGVyaXZlS2V5Il06WyJlbmNyeXB0IiwiZGVjcnlwdCJdKX0pfWZ1bmN0aW9uIFdzKHQscil7Y29uc3Qgcz1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUocik7c3dpdGNoKHQpe2Nhc2UiSEtERiI6cmV0dXJue25hbWU6IkhLREYiLHNhbHQ6cyxoYXNoOiJTSEEtMjU2IixpbmZvOm5ldyBBcnJheUJ1ZmZlcigxMjgpfTtjYXNlIlBCS0RGMiI6cmV0dXJue25hbWU6IlBCS0RGMiIsc2FsdDpzLGhhc2g6IlNIQS0yNTYiLGl0ZXJhdGlvbnM6MWU1fTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgYWxnb3JpdGhtICR7dH0gaXMgY3VycmVudGx5IHVuc3VwcG9ydGVkYCl9fWZ1bmN0aW9uIEdzKHQscil7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IGU9V3ModC5hbGdvcml0aG0ubmFtZSxyKSxzPXlpZWxkIGNyeXB0by5zdWJ0bGUuZGVyaXZlS2V5KGUsdCx7bmFtZTprLGxlbmd0aDoxMjh9LCExLFsiZW5jcnlwdCIsImRlY3J5cHQiXSk7cmV0dXJue21hdGVyaWFsOnQsZW5jcnlwdGlvbktleTpzfX0pfWZ1bmN0aW9uIEVkKHQscil7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IGU9V3ModC5hbGdvcml0aG0ubmFtZSxyKTtyZXR1cm4gY3J5cHRvLnN1YnRsZS5kZXJpdmVCaXRzKGUsdCwyNTYpfSl9Y2xhc3MgVGQgZXh0ZW5kcyB6c3t9Y2xhc3MgcXMgZXh0ZW5kcyBUZHtjb25zdHJ1Y3RvcihlKXt2YXIgcztzdXBlcih2b2lkIDApO3AodGhpcywic2VuZENvdW50cyIpO3AodGhpcywiaXNLZXlJbnZhbGlkIiwhMSk7cCh0aGlzLCJwYXJ0aWNpcGFudElkIik7cCh0aGlzLCJ0cmFja0lkIik7cCh0aGlzLCJrZXlzIik7cCh0aGlzLCJ2aWRlb0NvZGVjIik7cCh0aGlzLCJydHBNYXAiKTtwKHRoaXMsImtleVByb3ZpZGVyT3B0aW9ucyIpO3AodGhpcywidW5lbmNyeXB0ZWRGcmFtZUJ5dGVUcmFpbGVyIik7dGhpcy5zZW5kQ291bnRzPW5ldyBNYXAsdGhpcy5rZXlzPWUua2V5cyx0aGlzLnBhcnRpY2lwYW50SWQ9ZS5wYXJ0aWNpcGFudElkLHRoaXMucnRwTWFwPW5ldyBNYXAsdGhpcy5rZXlQcm92aWRlck9wdGlvbnM9ZS5rZXlQcm92aWRlck9wdGlvbnMsdGhpcy51bmVuY3J5cHRlZEZyYW1lQnl0ZVRyYWlsZXI9KHM9ZS51bmVuY3J5cHRlZEZyYW1lQnl0ZXMpIT1udWxsP3M6bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKCJMS1JPQ0tTIil9c2V0UGFydGljaXBhbnQoZSxzKXt0aGlzLnBhcnRpY2lwYW50SWQ9ZSx0aGlzLmtleXM9c311bnNldFBhcnRpY2lwYW50KCl7dGhpcy5wYXJ0aWNpcGFudElkPXZvaWQgMH1nZXRQYXJ0aWNpcGFudElkKCl7cmV0dXJuIHRoaXMucGFydGljaXBhbnRJZH1nZXRUcmFja0lkKCl7cmV0dXJuIHRoaXMudHJhY2tJZH1zZXRWaWRlb0NvZGVjKGUpe3RoaXMudmlkZW9Db2RlYz1lfXNldFJ0cE1hcChlKXt0aGlzLnJ0cE1hcD1lfXNldHVwVHJhbnNmb3JtKGUscyxuLGksYSl7YSYmKHRoaXMudmlkZW9Db2RlYz1hKTtjb25zdCBkPWU9PT0iZW5jb2RlIj90aGlzLmVuY29kZUZ1bmN0aW9uOnRoaXMuZGVjb2RlRnVuY3Rpb24sbz1uZXcgVHJhbnNmb3JtU3RyZWFtKHt0cmFuc2Zvcm06ZC5iaW5kKHRoaXMpfSk7cy5waXBlVGhyb3VnaChvKS5waXBlVG8obikuY2F0Y2gobD0+e3RoaXMuZW1pdCgiY3J5cHRvckVycm9yIixsIGluc3RhbmNlb2YgbWU/bDpuZXcgbWUobC5tZXNzYWdlKSl9KSx0aGlzLnRyYWNrSWQ9aX1lbmNvZGVGdW5jdGlvbihlLHMpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt2YXIgYTtpZighdGhpcy5rZXlzLmlzRW5hYmxlZCgpfHxlLmRhdGEuYnl0ZUxlbmd0aD09PTApcmV0dXJuIHMuZW5xdWV1ZShlKTtjb25zdHtlbmNyeXB0aW9uS2V5Om59PXRoaXMua2V5cy5nZXRLZXlTZXQoKSxpPXRoaXMua2V5cy5nZXRDdXJyZW50S2V5SW5kZXgoKTtpZihuKXtjb25zdCBkPXRoaXMubWFrZUlWKChhPWUuZ2V0TWV0YWRhdGEoKS5zeW5jaHJvbml6YXRpb25Tb3VyY2UpIT1udWxsP2E6LTEsZS50aW1lc3RhbXApLG89bmV3IFVpbnQ4QXJyYXkoZS5kYXRhLDAsdGhpcy5nZXRVbmVuY3J5cHRlZEJ5dGVzKGUpKSxsPW5ldyBVaW50OEFycmF5KDIpO2xbMF09ZGUsbFsxXT1pO3RyeXtjb25zdCBmPXlpZWxkIGNyeXB0by5zdWJ0bGUuZW5jcnlwdCh7bmFtZTprLGl2OmQsYWRkaXRpb25hbERhdGE6bmV3IFVpbnQ4QXJyYXkoZS5kYXRhLDAsby5ieXRlTGVuZ3RoKX0sbixuZXcgVWludDhBcnJheShlLmRhdGEsdGhpcy5nZXRVbmVuY3J5cHRlZEJ5dGVzKGUpKSkseT1uZXcgQXJyYXlCdWZmZXIoby5ieXRlTGVuZ3RoK2YuYnl0ZUxlbmd0aCtkLmJ5dGVMZW5ndGgrbC5ieXRlTGVuZ3RoKSxFPW5ldyBVaW50OEFycmF5KHkpO3JldHVybiBFLnNldChvKSxFLnNldChuZXcgVWludDhBcnJheShmKSxvLmJ5dGVMZW5ndGgpLEUuc2V0KG5ldyBVaW50OEFycmF5KGQpLG8uYnl0ZUxlbmd0aCtmLmJ5dGVMZW5ndGgpLEUuc2V0KGwsby5ieXRlTGVuZ3RoK2YuYnl0ZUxlbmd0aCtkLmJ5dGVMZW5ndGgpLGUuZGF0YT15LHMuZW5xdWV1ZShlKX1jYXRjaChmKXt9fWVsc2UgdGhpcy5lbWl0KHF0LkVycm9yLG5ldyBtZSgiZW5jcnlwdGlvbiBrZXkgbWlzc2luZyBmb3IgZW5jb2RpbmciLGZlLk1pc3NpbmdLZXkpKX0pfWRlY29kZUZ1bmN0aW9uKGUscyl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2lmKCF0aGlzLmtleXMuaXNFbmFibGVkKCl8fGUuZGF0YS5ieXRlTGVuZ3RoPT09MHx8X2QoZS5kYXRhLHRoaXMudW5lbmNyeXB0ZWRGcmFtZUJ5dGVUcmFpbGVyKSlyZXR1cm4gcy5lbnF1ZXVlKGUpO2NvbnN0IGk9bmV3IFVpbnQ4QXJyYXkoZS5kYXRhKVtlLmRhdGEuYnl0ZUxlbmd0aC0xXTtpZih0aGlzLmtleXMuZ2V0S2V5U2V0KGkpKXRyeXtjb25zdCBhPXlpZWxkIHRoaXMuZGVjcnlwdEZyYW1lKGUsaSk7aWYoYSlyZXR1cm4gcy5lbnF1ZXVlKGEpO3RoaXMuaXNLZXlJbnZhbGlkPSExfWNhdGNoKGEpe2EgaW5zdGFuY2VvZiBtZSYmYS5yZWFzb249PT1mZS5JbnZhbGlkS2V5JiYodGhpcy5pc0tleUludmFsaWR8fCh0aGlzLmVtaXQocXQuRXJyb3IsbmV3IG1lKGBpbnZhbGlkIGtleSBmb3IgcGFydGljaXBhbnQgJHt0aGlzLnBhcnRpY2lwYW50SWR9YCxmZS5JbnZhbGlkS2V5KSksdGhpcy5pc0tleUludmFsaWQ9ITApKX1lbHNlIHRoaXMuZW1pdChxdC5FcnJvcixuZXcgbWUoYGtleSBtaXNzaW5nIGZvciBwYXJ0aWNpcGFudCAke3RoaXMucGFydGljaXBhbnRJZH1gLGZlLk1pc3NpbmdLZXkpKTtyZXR1cm4gcy5lbnF1ZXVlKGUpfSl9ZGVjcnlwdEZyYW1lKGEsZCl7cmV0dXJuIEkodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24qKGUscyxuPXZvaWQgMCxpPXtyYXRjaGV0Q291bnQ6MH0pe3ZhciBsO2NvbnN0IG89dGhpcy5rZXlzLmdldEtleVNldChzKTt0cnl7Y29uc3QgZj1uZXcgVWludDhBcnJheShlLmRhdGEsMCx0aGlzLmdldFVuZW5jcnlwdGVkQnl0ZXMoZSkpLHk9bmV3IFVpbnQ4QXJyYXkoZS5kYXRhLGUuZGF0YS5ieXRlTGVuZ3RoLTIsMiksRT15WzBdLHc9bmV3IFVpbnQ4QXJyYXkoZS5kYXRhLGUuZGF0YS5ieXRlTGVuZ3RoLUUteS5ieXRlTGVuZ3RoLEUpLHg9Zi5ieXRlTGVuZ3RoLFU9ZS5kYXRhLmJ5dGVMZW5ndGgtKGYuYnl0ZUxlbmd0aCtFK3kuYnl0ZUxlbmd0aCksTD15aWVsZCBjcnlwdG8uc3VidGxlLmRlY3J5cHQoe25hbWU6ayxpdjp3LGFkZGl0aW9uYWxEYXRhOm5ldyBVaW50OEFycmF5KGUuZGF0YSwwLGYuYnl0ZUxlbmd0aCl9LChsPWkuZW5jcnlwdGlvbktleSkhPW51bGw/bDpvLmVuY3J5cHRpb25LZXksbmV3IFVpbnQ4QXJyYXkoZS5kYXRhLHgsVSkpLEg9bmV3IEFycmF5QnVmZmVyKGYuYnl0ZUxlbmd0aCtMLmJ5dGVMZW5ndGgpLFo9bmV3IFVpbnQ4QXJyYXkoSCk7cmV0dXJuIFouc2V0KG5ldyBVaW50OEFycmF5KGUuZGF0YSwwLGYuYnl0ZUxlbmd0aCkpLFouc2V0KG5ldyBVaW50OEFycmF5KEwpLGYuYnl0ZUxlbmd0aCksZS5kYXRhPUgsZX1jYXRjaChmKXtpZih0aGlzLmtleVByb3ZpZGVyT3B0aW9ucy5yYXRjaGV0V2luZG93U2l6ZT4wKXtpZihpLnJhdGNoZXRDb3VudDx0aGlzLmtleVByb3ZpZGVyT3B0aW9ucy5yYXRjaGV0V2luZG93U2l6ZSl7bGV0IHk7aWYobz09PXRoaXMua2V5cy5nZXRLZXlTZXQocykpe2NvbnN0IHc9eWllbGQgdGhpcy5rZXlzLnJhdGNoZXRLZXkocywhMSk7eT15aWVsZCBHcyh3LHRoaXMua2V5UHJvdmlkZXJPcHRpb25zLnJhdGNoZXRTYWx0KX1jb25zdCBFPXlpZWxkIHRoaXMuZGVjcnlwdEZyYW1lKGUscyxufHxvLHtyYXRjaGV0Q291bnQ6aS5yYXRjaGV0Q291bnQrMSxlbmNyeXB0aW9uS2V5Onk9PW51bGw/dm9pZCAwOnkuZW5jcnlwdGlvbktleX0pO3JldHVybiBFJiZ5JiYodGhpcy5rZXlzLnNldEtleVNldCh5LHMsITApLHRoaXMua2V5cy5zZXRDdXJyZW50S2V5SW5kZXgocykpLEV9biYmdGhpcy5rZXlzLnNldEtleUZyb21NYXRlcmlhbChuLm1hdGVyaWFsLHMpfWVsc2UgdGhyb3cgbmV3IG1lKCJEZWNyeXB0aW9uIGZhaWxlZCwgbW9zdCBsaWtlbHkgYmVjYXVzZSBvZiBhbiBpbnZhbGlkIGtleSIsZmUuSW52YWxpZEtleSl9fSl9bWFrZUlWKGUscyl7dmFyIGQ7Y29uc3Qgbj1uZXcgQXJyYXlCdWZmZXIoZGUpLGk9bmV3IERhdGFWaWV3KG4pO3RoaXMuc2VuZENvdW50cy5oYXMoZSl8fHRoaXMuc2VuZENvdW50cy5zZXQoZSxNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqNjU1MzUpKTtjb25zdCBhPShkPXRoaXMuc2VuZENvdW50cy5nZXQoZSkpIT1udWxsP2Q6MDtyZXR1cm4gaS5zZXRVaW50MzIoMCxlKSxpLnNldFVpbnQzMig0LHMpLGkuc2V0VWludDMyKDgscy1hJTY1NTM1KSx0aGlzLnNlbmRDb3VudHMuc2V0KGUsYSsxKSxufWdldFVuZW5jcnlwdGVkQnl0ZXMoZSl7dmFyIHM7aWYodmQoZSkpe2NvbnN0IG49KHM9dGhpcy5nZXRWaWRlb0NvZGVjKGUpKSE9bnVsbD9zOnRoaXMudmlkZW9Db2RlYztpZihuPT09ImF2MSJ8fG49PT0idnA5Iil0aHJvdyBuZXcgRXJyb3IoYCR7bn0gaXMgbm90IHlldCBzdXBwb3J0ZWQgZm9yIGVuZCB0byBlbmQgZW5jcnlwdGlvbmApO3JldHVybiBBW2UudHlwZV19cmV0dXJuIEEuYXVkaW99Z2V0VmlkZW9Db2RlYyhlKXtpZih0aGlzLnJ0cE1hcC5zaXplPT09MClyZXR1cm47Y29uc3R7cGF5bG9hZFR5cGU6c309ZS5nZXRNZXRhZGF0YSgpO3JldHVybiBzP3RoaXMucnRwTWFwLmdldChzKTp2b2lkIDB9fWZ1bmN0aW9uIF9kKHQscil7Y29uc3QgZT1uZXcgVWludDhBcnJheSh0LnNsaWNlKHQuYnl0ZUxlbmd0aC1yLmJ5dGVMZW5ndGgpKTtyZXR1cm4gci5ldmVyeSgocyxuKT0+cz09PWVbbl0pfWNsYXNzIFlzIGV4dGVuZHMgenN7Y29uc3RydWN0b3IoZSxzLG4pe3N1cGVyKHZvaWQgMCk7cCh0aGlzLCJjdXJyZW50S2V5SW5kZXgiKTtwKHRoaXMsImNyeXB0b0tleVJpbmciKTtwKHRoaXMsImVuYWJsZWQiKTtwKHRoaXMsImtleVByb3ZpZGVyT3B0aW9ucyIpO3AodGhpcywicmF0Y2hldFByb21pc2VNYXAiKTtwKHRoaXMsInBhcnRpY2lwYW50SWQiKTt0aGlzLmN1cnJlbnRLZXlJbmRleD0wLHRoaXMuY3J5cHRvS2V5UmluZz1uZXcgQXJyYXkoMTYpLHRoaXMuZW5hYmxlZD1zLHRoaXMua2V5UHJvdmlkZXJPcHRpb25zPW4sdGhpcy5yYXRjaGV0UHJvbWlzZU1hcD1uZXcgTWFwLHRoaXMucGFydGljaXBhbnRJZD1lfXNldEVuYWJsZWQoZSl7dGhpcy5lbmFibGVkPWV9cmF0Y2hldEtleShlLHM9ITApe2NvbnN0IG49ZSE9bnVsbD9lOnRoaXMuZ2V0Q3VycmVudEtleUluZGV4KCksaT1uLGE9dGhpcy5yYXRjaGV0UHJvbWlzZU1hcC5nZXQoaSk7aWYodHlwZW9mIGEhPSJ1bmRlZmluZWQiKXJldHVybiBhO2NvbnN0IGQ9bmV3IFByb21pc2UoKG8sbCk9PkkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3RyeXtjb25zdCBmPXRoaXMuZ2V0S2V5U2V0KGkpLm1hdGVyaWFsLHk9eWllbGQgYmQoeWllbGQgRWQoZix0aGlzLmtleVByb3ZpZGVyT3B0aW9ucy5yYXRjaGV0U2FsdCksZi5hbGdvcml0aG0ubmFtZSwiZGVyaXZlIik7cyYmdGhpcy5zZXRLZXlGcm9tTWF0ZXJpYWwoeSxpLCEwKSx0aGlzLmVtaXQoImtleVJhdGNoZXRlZCIseSxuLHRoaXMucGFydGljaXBhbnRJZCksbyh5KX1jYXRjaChmKXtsKGYpfWZpbmFsbHl7dGhpcy5yYXRjaGV0UHJvbWlzZU1hcC5kZWxldGUoaSl9fSkpO3JldHVybiB0aGlzLnJhdGNoZXRQcm9taXNlTWFwLnNldChpLGQpLGR9c2V0S2V5RnJvbU1hdGVyaWFsKGUscz0wLG49ITEpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtzPj0wJiYodGhpcy5jdXJyZW50S2V5SW5kZXg9cyV0aGlzLmNyeXB0b0tleVJpbmcubGVuZ3RoKTtjb25zdCBpPXlpZWxkIEdzKGUsdGhpcy5rZXlQcm92aWRlck9wdGlvbnMucmF0Y2hldFNhbHQpO3RoaXMuc2V0S2V5U2V0KGksdGhpcy5jdXJyZW50S2V5SW5kZXgsbil9KX1zZXRLZXlTZXQoZSxzLG49ITEpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt0aGlzLmNyeXB0b0tleVJpbmdbcyV0aGlzLmNyeXB0b0tleVJpbmcubGVuZ3RoXT1lLG4mJnRoaXMuZW1pdCgia2V5UmF0Y2hldGVkIixlLm1hdGVyaWFsLHMsdGhpcy5wYXJ0aWNpcGFudElkKX0pfXNldEN1cnJlbnRLZXlJbmRleChlKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dGhpcy5jdXJyZW50S2V5SW5kZXg9ZSV0aGlzLmNyeXB0b0tleVJpbmcubGVuZ3RofSl9aXNFbmFibGVkKCl7cmV0dXJuIHRoaXMuZW5hYmxlZH1nZXRDdXJyZW50S2V5SW5kZXgoKXtyZXR1cm4gdGhpcy5jdXJyZW50S2V5SW5kZXh9Z2V0S2V5U2V0KGUpe3JldHVybiB0aGlzLmNyeXB0b0tleVJpbmdbZSE9bnVsbD9lOnRoaXMuY3VycmVudEtleUluZGV4XX19Y29uc3QgWXQ9W10sUXQ9bmV3IE1hcCxKdD1bXTtsZXQgY2UsWHQ9ITEsUXM9ITEsWnQsZ2U9TXQ7ZnVuY3Rpb24gU2UodCxyKXtwb3N0TWVzc2FnZSh7a2luZDoibG9nIixkYXRhOntsZXZlbDp0LHN0cjpyfX0pfWZ1bmN0aW9uIFJkKHQscil7cG9zdE1lc3NhZ2Uoe2tpbmQ6InJhdGNoZXRLZXkiLGRhdGE6e2tleUluZGV4OnIsbWF0ZXJpYWw6dH19KX1mdW5jdGlvbiBWZSh0KXtpZighdClyZXR1cm4gY2U7bGV0IHI9UXQuZ2V0KHQpO3JldHVybiByfHwocj1uZXcgWXModCwhMCxnZSksWnQmJnIuc2V0S2V5RnJvbU1hdGVyaWFsKFp0KSxRdC5zZXQodCxyKSkscn1mdW5jdGlvbiBQZCh0LHIpe3I/VmUocikuc2V0RW5hYmxlZCh0KTooWHQ9dCxjZS5zZXRFbmFibGVkKHQpKX1mdW5jdGlvbiBKcyh0KXt0Lm9uKCJjcnlwdG9yRXJyb3IiLHI9Pntjb25zdCBlPXtraW5kOiJlcnJvciIsZGF0YTp7ZXJyb3I6bmV3IEVycm9yKGAke2ZlW3IucmVhc29uXX06ICR7ci5tZXNzYWdlfWApfX07cG9zdE1lc3NhZ2UoZSl9KX1mdW5jdGlvbiBlcih0LHIpe2xldCBlPVl0LmZpbmQocz0+cy5nZXRUcmFja0lkKCk9PT1yKTtpZihlKXQhPT1lLmdldFBhcnRpY2lwYW50SWQoKSYmZS5zZXRQYXJ0aWNpcGFudCh0LFZlKHQpKTtlbHNle2lmKFNlKCJpbmZvIixgY3JlYXRpbmcgbmV3IGNyeXB0b3IgZm9yICR7dH1gKSwhZ2UpdGhyb3cgRXJyb3IoIk1pc3Npbmcga2V5UHJvdmlkZXIgb3B0aW9ucyIpO2U9bmV3IHFzKHtwYXJ0aWNpcGFudElkOnQsa2V5czpWZSh0KSxrZXlQcm92aWRlck9wdGlvbnM6Z2V9KSxKcyhlKSxZdC5wdXNoKGUpfXJldHVybiBlfWZ1bmN0aW9uIFhzKHQpe2xldCByPUp0LmZpbmQoZT0+ZS5nZXRUcmFja0lkKCk9PT10KTtpZighcil7aWYoIWdlKXRocm93IG5ldyBUeXBlRXJyb3IoIk1pc3Npbmcga2V5UHJvdmlkZXIgb3B0aW9ucyIpO3I9bmV3IHFzKHtrZXlzOmNlLHBhcnRpY2lwYW50SWQ6InB1Ymxpc2hlciIsa2V5UHJvdmlkZXJPcHRpb25zOmdlfSksSnMociksSnQucHVzaChyKX1yZXR1cm4gcn1mdW5jdGlvbiBDZCh0KXt2YXIgcjsocj1ZdC5maW5kKGU9PmUuZ2V0VHJhY2tJZCgpPT09dCkpPT1udWxsfHxyLnVuc2V0UGFydGljaXBhbnQoKX1mdW5jdGlvbiBJZCh0LHIpe1NlKCJkZWJ1ZyIsInNldHRpbmcgc2hhcmVkIGtleSIpLFp0PXQsY2U9PW51bGx8fGNlLnNldEtleUZyb21NYXRlcmlhbCh0LHIpO2Zvcihjb25zdFssZV1vZiBRdCllLnNldEtleUZyb21NYXRlcmlhbCh0LHIpfW9ubWVzc2FnZT10PT57Y29uc3R7a2luZDpyLGRhdGE6ZX09dC5kYXRhO3N3aXRjaChyKXtjYXNlImluaXQiOlNlKCJpbmZvIiwid29ya2VyIGluaXRpYWxpemVkIiksZ2U9ZS5rZXlQcm92aWRlck9wdGlvbnMsUXM9ISFlLmtleVByb3ZpZGVyT3B0aW9ucy5zaGFyZWRLZXk7Y29uc3Qgcz17a2luZDoiZW5hYmxlIixkYXRhOntlbmFibGVkOlh0fX07Y2U9bmV3IFlzKHZvaWQgMCxYdCxnZSksY2Uub24oImtleVJhdGNoZXRlZCIsUmQpLHBvc3RNZXNzYWdlKHMpO2JyZWFrO2Nhc2UiZW5hYmxlIjpQZChlLmVuYWJsZWQsZS5wYXJ0aWNpcGFudElkKSxTZSgiaW5mbyIsInVwZGF0ZWQgZTJlZSBlbmFibGVkIHN0YXR1cyIpLHBvc3RNZXNzYWdlKHQuZGF0YSk7YnJlYWs7Y2FzZSJkZWNvZGUiOmVyKGUucGFydGljaXBhbnRJZCxlLnRyYWNrSWQpLnNldHVwVHJhbnNmb3JtKHIsZS5yZWFkYWJsZVN0cmVhbSxlLndyaXRhYmxlU3RyZWFtLGUudHJhY2tJZCxlLmNvZGVjKTticmVhaztjYXNlImVuY29kZSI6WHMoZS50cmFja0lkKS5zZXR1cFRyYW5zZm9ybShyLGUucmVhZGFibGVTdHJlYW0sZS53cml0YWJsZVN0cmVhbSxlLnRyYWNrSWQsZS5jb2RlYyk7YnJlYWs7Y2FzZSJzZXRLZXkiOlFzPyhTZSgiZGVidWciLCJzZXQgc2hhcmVkIGtleSIpLElkKGUua2V5LGUua2V5SW5kZXgpKTplLnBhcnRpY2lwYW50SWQ/VmUoZS5wYXJ0aWNpcGFudElkKS5zZXRLZXlGcm9tTWF0ZXJpYWwoZS5rZXksZS5rZXlJbmRleCk6U2UoImVycm9yIiwibm8gcGFydGljaXBhbnQgSWQgd2FzIHByb3ZpZGVkIGFuZCBzaGFyZWQga2V5IHVzYWdlIGlzIGRpc2FibGVkIik7YnJlYWs7Y2FzZSJyZW1vdmVUcmFuc2Zvcm0iOkNkKGUudHJhY2tJZCk7YnJlYWs7Y2FzZSJ1cGRhdGVDb2RlYyI6ZXIoZS5wYXJ0aWNpcGFudElkLGUudHJhY2tJZCkuc2V0VmlkZW9Db2RlYyhlLmNvZGVjKTticmVhaztjYXNlInNldFJUUE1hcCI6SnQuZm9yRWFjaChhPT57YS5zZXRSdHBNYXAoZS5tYXApfSk7YnJlYWs7Y2FzZSJyYXRjaGV0UmVxdWVzdCI6VmUoZS5wYXJ0aWNpcGFudElkKS5yYXRjaGV0S2V5KGUua2V5SW5kZXgpO2JyZWFrfX0sc2VsZi5SVENUcmFuc2Zvcm1FdmVudCYmKFNlKCJkZWJ1ZyIsInNldHVwIHRyYW5zZm9ybSBldmVudCIpLHNlbGYub25ydGN0cmFuc2Zvcm09dD0+e2NvbnN0e3RyYW5zZm9ybWVyOnJ9PXQ7ci5oYW5kbGVkPSEwO2NvbnN0e2tpbmQ6ZSxwYXJ0aWNpcGFudElkOnMsdHJhY2tJZDpuLGNvZGVjOml9PXIub3B0aW9uczsoZT09PSJlbmNvZGUiP1hzKG4pOmVyKHMsbikpLnNldHVwVHJhbnNmb3JtKGUsci5yZWFkYWJsZSxyLndyaXRhYmxlLG4saSl9KX0pKCk7Cg==", g = typeof window != "undefined" && window.Blob && new Blob([atob(ll)], { type: "text/javascript;charset=utf-8" });
419
- function Hl() {
417
+ var i = /* @__PURE__ */ ((Z) => (Z.NEW_PRODUCER = "NEW_PRODUCER", Z.ROOM_NODE_CONNECTION_ERROR = "ROOM_NODE_CONNECTION_ERROR", Z.SOCKET_SERVICE_ROOM_JOINED = "SOCKET_SERVICE_ROOM_JOINED", Z.SOCKET_SERVICE_RECONNECTED = "SOCKET_SERVICE_RECONNECTED", Z.SOCKET_SERVICE_DISCONNECTED = "SOCKET_SERVICE_DISCONNECTED", Z.SOCKET_SERVICE_FAILED = "SOCKET_SERVICE_FAILED", Z.SOCKET_STATE_UPDATE = "SOCKET_STATE_UPDATE", Z.ROOM_NODE_RECONNECTED = "ROOM_NODE_RECONNECTED", Z.ROOM_NODE_DISCONNECTED = "ROOM_NODE_DISCONNECTED", Z.ROOM_NODE_FAILED = "ROOM_NODE_FAILED", Z.TRANSPORT_STATE_UPDATE = "TRANSPORT_STATE_UPDATE", Z.PRODUCER_SCORE_UPDATE = "PRODUCER_SCORE_UPDATE", Z.CONSUMER_SCORE_UPDATE = "CONSUMER_SCORE_UPDATE", Z.PRODUCER_STATUS_UPDATE = "PRODUCER_STATUS_UPDATE", Z.CONSUMER_STATUS_UPDATE = "CONSUMER_STATUS_UPDATE", Z.LOW_CONSUMER_SCORE = "LOW_CONSUMER_SCORE", Z.MEDIA_PERMISSION_ERROR = "MEDIA_PERMISSION_ERROR", Z.MEDIA_PERMISSION_UPDATE = "MEDIA_PERMISSION_UPDATE", Z.MESSAGE = "websocket/message", Z.ROOM_MESSAGE = "websocket/room-message", Z.PEER_JOINED_INTERNAL = "peer/joined-internal", Z.PEER_CLOSED = "websocket/peer-closed", Z.CONSUMER_CLOSED = "websocket/consumer-closed", Z.CONSUMER_PAUSED = "websocket/consumer-paused", Z.CONSUMER_RESUMED = "websocket/consumer-resumed", Z.PRODUCER_CLOSED = "websocket/producer-closed", Z.NEW_CONSUMER = "websocket/new-consumer", Z.PRODUCER_SCORE = "websocket/producer-score", Z.CONSUMER_SCORE = "websocket/consumer-score", Z.PRODUCER_TOGGLE = "cf/producer-toggle", Z.UPDATE_ACTIVE = "media/update-active", Z.RESET_PRODUCER_STATE = "cf/reset-producer-state", Z.ROOM_STATE = "sockethub/room-state", Z.GET_STAGE_REQUESTS = "GET_STAGE_REQUESTS", Z.UPDATE_STAGE_REQUESTS = "UPDATE_STAGE_REQUESTS", Z.KICK_PEER = "KICK_PEER", Z.UPDATE_PEER_STAGE_STATUS = "UPDATE_PEER_STAGE_STATUS", Z.JOIN_MEDIA_ROOM = "JOIN_MEDIA_ROOM", Z.LEAVE_MEDIA_ROOM = "LEAVE_MEDIA_ROOM", Z.PIP_HANGUP = "PIP_HANGUP", Z.E2EE_ACTIVE_PRODUCER = "E2EE_ACTIVE_PRODUCER", Z.E2EE_INACTIVE_PRODUCER = "E2EE_INACTIVE_PRODUCER", Z.E2EE_ACTIVE_CONSUMER = "E2EE_ACTIVE_CONSUMER", Z.E2EE_INACTIVE_CONSUMER = "E2EE_INACTIVE_CONSUMER", Z.SOCKET_PEERS = "SOCKET_PEERS", Z.UPDATE_PERMISSIONS = "UPDATE_PERMISSIONS", Z.MAX_SPATIAL_LAYER_CHANGE = "MAX_SPATIAL_LAYER_CHANGE", Z.MUTE_SELF = "MUTE_SELF", Z.MUTE_SELF_VIDEO = "MUTE_SELF_VIDEO", Z))(i || {});
418
+ const ll = "dmFyIHNhPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxuYT1PYmplY3QuZGVmaW5lUHJvcGVydGllczt2YXIgaWE9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7dmFyIGVzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsYWE9T2JqZWN0LmdldFByb3RvdHlwZU9mLG9hPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksY2E9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxkYT1SZWZsZWN0LmdldDt2YXIgRHQ9KF8sQSxNKT0+QSBpbiBfP3NhKF8sQSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6TX0pOl9bQV09TSxHPShfLEEpPT57Zm9yKHZhciBNIGluIEF8fChBPXt9KSlvYS5jYWxsKEEsTSkmJkR0KF8sTSxBW01dKTtpZihlcylmb3IodmFyIE0gb2YgZXMoQSkpY2EuY2FsbChBLE0pJiZEdChfLE0sQVtNXSk7cmV0dXJuIF99LFFlPShfLEEpPT5uYShfLGlhKEEpKTt2YXIgdT0oXyxBLE0pPT4oRHQoXyx0eXBlb2YgQSE9InN5bWJvbCI/QSsiIjpBLE0pLE0pLHRzPShfLEEsTSk9PntpZighQS5oYXMoXykpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgIitNKX07dmFyIFE9KF8sQSxNKT0+KHRzKF8sQSwicmVhZCBmcm9tIHByaXZhdGUgZmllbGQiKSxNP00uY2FsbChfKTpBLmdldChfKSksbHQ9KF8sQSxNKT0+e2lmKEEuaGFzKF8pKXRocm93IFR5cGVFcnJvcigiQ2Fubm90IGFkZCB0aGUgc2FtZSBwcml2YXRlIG1lbWJlciBtb3JlIHRoYW4gb25jZSIpO0EgaW5zdGFuY2VvZiBXZWFrU2V0P0EuYWRkKF8pOkEuc2V0KF8sTSl9LGZlPShfLEEsTSxvZSk9Pih0cyhfLEEsIndyaXRlIHRvIHByaXZhdGUgZmllbGQiKSxvZT9vZS5jYWxsKF8sTSk6QS5zZXQoXyxNKSxNKTt2YXIgcnM9KF8sQSxNKT0+ZGEoYWEoXyksTSxBKTt2YXIgdz0oXyxBLE0pPT5uZXcgUHJvbWlzZSgob2UsdXQpPT57dmFyIHB0PXo9Pnt0cnl7Z2UoTS5uZXh0KHopKX1jYXRjaChtZSl7dXQobWUpfX0sVz16PT57dHJ5e2dlKE0udGhyb3coeikpfWNhdGNoKG1lKXt1dChtZSl9fSxnZT16PT56LmRvbmU/b2Uoei52YWx1ZSk6UHJvbWlzZS5yZXNvbHZlKHoudmFsdWUpLnRoZW4ocHQsVyk7Z2UoKE09TS5hcHBseShfLEEpKS5uZXh0KCkpfSk7KGZ1bmN0aW9uKCl7dmFyIFBlLFosZWU7InVzZSBzdHJpY3QiO2NvbnN0IF89IkFFUy1HQ00iLE09e2tleToxMCxkZWx0YTozLGF1ZGlvOjEsZW1wdHk6MH0sb2U9MTIscHQ9e3NoYXJlZEtleTohMSxyYXRjaGV0U2FsdDoiUmVhbHRpbWVLaXRGcmFtZUVuY3J5cHRpb25LZXkiLHJhdGNoZXRXaW5kb3dTaXplOjh9O3ZhciBXPXt9LGdlPXtnZXQgZXhwb3J0cygpe3JldHVybiBXfSxzZXQgZXhwb3J0cyhyKXtXPXJ9fSx6PXR5cGVvZiBSZWZsZWN0PT0ib2JqZWN0Ij9SZWZsZWN0Om51bGwsbWU9eiYmdHlwZW9mIHouYXBwbHk9PSJmdW5jdGlvbiI/ei5hcHBseTpmdW5jdGlvbih0LGUscyl7cmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKHQsZSxzKX0sSmU7eiYmdHlwZW9mIHoub3duS2V5cz09ImZ1bmN0aW9uIj9KZT16Lm93bktleXM6T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scz9KZT1mdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModCkuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCkpfTpKZT1mdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModCl9O2Z1bmN0aW9uIHNzKHIpe2NvbnNvbGUmJmNvbnNvbGUud2FybiYmY29uc29sZS53YXJuKHIpfXZhciBOdD1OdW1iZXIuaXNOYU58fGZ1bmN0aW9uKHQpe3JldHVybiB0IT09dH07ZnVuY3Rpb24gTCgpe0wuaW5pdC5jYWxsKHRoaXMpfWdlLmV4cG9ydHM9TCxXLm9uY2U9b3MsTC5FdmVudEVtaXR0ZXI9TCxMLnByb3RvdHlwZS5fZXZlbnRzPXZvaWQgMCxMLnByb3RvdHlwZS5fZXZlbnRzQ291bnQ9MCxMLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzPXZvaWQgMDt2YXIgVnQ9MTA7ZnVuY3Rpb24gWGUocil7aWYodHlwZW9mIHIhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlICJsaXN0ZW5lciIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uLiBSZWNlaXZlZCB0eXBlICcrdHlwZW9mIHIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShMLCJkZWZhdWx0TWF4TGlzdGVuZXJzIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gVnR9LHNldDpmdW5jdGlvbihyKXtpZih0eXBlb2YgciE9Im51bWJlciJ8fHI8MHx8TnQocikpdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiAiZGVmYXVsdE1heExpc3RlbmVycyIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJytyKyIuIik7VnQ9cn19KSxMLmluaXQ9ZnVuY3Rpb24oKXsodGhpcy5fZXZlbnRzPT09dm9pZCAwfHx0aGlzLl9ldmVudHM9PT1PYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykuX2V2ZW50cykmJih0aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9ldmVudHNDb3VudD0wKSx0aGlzLl9tYXhMaXN0ZW5lcnM9dGhpcy5fbWF4TGlzdGVuZXJzfHx2b2lkIDB9LEwucHJvdG90eXBlLnNldE1heExpc3RlbmVycz1mdW5jdGlvbih0KXtpZih0eXBlb2YgdCE9Im51bWJlciJ8fHQ8MHx8TnQodCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiAibiIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJyt0KyIuIik7cmV0dXJuIHRoaXMuX21heExpc3RlbmVycz10LHRoaXN9O2Z1bmN0aW9uIEJ0KHIpe3JldHVybiByLl9tYXhMaXN0ZW5lcnM9PT12b2lkIDA/TC5kZWZhdWx0TWF4TGlzdGVuZXJzOnIuX21heExpc3RlbmVyc31MLnByb3RvdHlwZS5nZXRNYXhMaXN0ZW5lcnM9ZnVuY3Rpb24oKXtyZXR1cm4gQnQodGhpcyl9LEwucHJvdG90eXBlLmVtaXQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLHM9MTtzPGFyZ3VtZW50cy5sZW5ndGg7cysrKWUucHVzaChhcmd1bWVudHNbc10pO3ZhciBuPXQ9PT0iZXJyb3IiLGk9dGhpcy5fZXZlbnRzO2lmKGkhPT12b2lkIDApbj1uJiZpLmVycm9yPT09dm9pZCAwO2Vsc2UgaWYoIW4pcmV0dXJuITE7aWYobil7dmFyIGE7aWYoZS5sZW5ndGg+MCYmKGE9ZVswXSksYSBpbnN0YW5jZW9mIEVycm9yKXRocm93IGE7dmFyIGQ9bmV3IEVycm9yKCJVbmhhbmRsZWQgZXJyb3IuIisoYT8iICgiK2EubWVzc2FnZSsiKSI6IiIpKTt0aHJvdyBkLmNvbnRleHQ9YSxkfXZhciBvPWlbdF07aWYobz09PXZvaWQgMClyZXR1cm4hMTtpZih0eXBlb2Ygbz09ImZ1bmN0aW9uIiltZShvLHRoaXMsZSk7ZWxzZSBmb3IodmFyIGg9by5sZW5ndGgsZz1IdChvLGgpLHM9MDtzPGg7KytzKW1lKGdbc10sdGhpcyxlKTtyZXR1cm4hMH07ZnVuY3Rpb24gRnQocix0LGUscyl7dmFyIG4saSxhO2lmKFhlKGUpLGk9ci5fZXZlbnRzLGk9PT12b2lkIDA/KGk9ci5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCksci5fZXZlbnRzQ291bnQ9MCk6KGkubmV3TGlzdGVuZXIhPT12b2lkIDAmJihyLmVtaXQoIm5ld0xpc3RlbmVyIix0LGUubGlzdGVuZXI/ZS5saXN0ZW5lcjplKSxpPXIuX2V2ZW50cyksYT1pW3RdKSxhPT09dm9pZCAwKWE9aVt0XT1lLCsrci5fZXZlbnRzQ291bnQ7ZWxzZSBpZih0eXBlb2YgYT09ImZ1bmN0aW9uIj9hPWlbdF09cz9bZSxhXTpbYSxlXTpzP2EudW5zaGlmdChlKTphLnB1c2goZSksbj1CdChyKSxuPjAmJmEubGVuZ3RoPm4mJiFhLndhcm5lZCl7YS53YXJuZWQ9ITA7dmFyIGQ9bmV3IEVycm9yKCJQb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5IGxlYWsgZGV0ZWN0ZWQuICIrYS5sZW5ndGgrIiAiK1N0cmluZyh0KSsiIGxpc3RlbmVycyBhZGRlZC4gVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gaW5jcmVhc2UgbGltaXQiKTtkLm5hbWU9Ik1heExpc3RlbmVyc0V4Y2VlZGVkV2FybmluZyIsZC5lbWl0dGVyPXIsZC50eXBlPXQsZC5jb3VudD1hLmxlbmd0aCxzcyhkKX1yZXR1cm4gcn1MLnByb3RvdHlwZS5hZGRMaXN0ZW5lcj1mdW5jdGlvbih0LGUpe3JldHVybiBGdCh0aGlzLHQsZSwhMSl9LEwucHJvdG90eXBlLm9uPUwucHJvdG90eXBlLmFkZExpc3RlbmVyLEwucHJvdG90eXBlLnByZXBlbmRMaXN0ZW5lcj1mdW5jdGlvbih0LGUpe3JldHVybiBGdCh0aGlzLHQsZSwhMCl9O2Z1bmN0aW9uIG5zKCl7aWYoIXRoaXMuZmlyZWQpcmV0dXJuIHRoaXMudGFyZ2V0LnJlbW92ZUxpc3RlbmVyKHRoaXMudHlwZSx0aGlzLndyYXBGbiksdGhpcy5maXJlZD0hMCxhcmd1bWVudHMubGVuZ3RoPT09MD90aGlzLmxpc3RlbmVyLmNhbGwodGhpcy50YXJnZXQpOnRoaXMubGlzdGVuZXIuYXBwbHkodGhpcy50YXJnZXQsYXJndW1lbnRzKX1mdW5jdGlvbiB4dChyLHQsZSl7dmFyIHM9e2ZpcmVkOiExLHdyYXBGbjp2b2lkIDAsdGFyZ2V0OnIsdHlwZTp0LGxpc3RlbmVyOmV9LG49bnMuYmluZChzKTtyZXR1cm4gbi5saXN0ZW5lcj1lLHMud3JhcEZuPW4sbn1MLnByb3RvdHlwZS5vbmNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFhlKGUpLHRoaXMub24odCx4dCh0aGlzLHQsZSkpLHRoaXN9LEwucHJvdG90eXBlLnByZXBlbmRPbmNlTGlzdGVuZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gWGUoZSksdGhpcy5wcmVwZW5kTGlzdGVuZXIodCx4dCh0aGlzLHQsZSkpLHRoaXN9LEwucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7dmFyIHMsbixpLGEsZDtpZihYZShlKSxuPXRoaXMuX2V2ZW50cyxuPT09dm9pZCAwKXJldHVybiB0aGlzO2lmKHM9blt0XSxzPT09dm9pZCAwKXJldHVybiB0aGlzO2lmKHM9PT1lfHxzLmxpc3RlbmVyPT09ZSktLXRoaXMuX2V2ZW50c0NvdW50PT09MD90aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKTooZGVsZXRlIG5bdF0sbi5yZW1vdmVMaXN0ZW5lciYmdGhpcy5lbWl0KCJyZW1vdmVMaXN0ZW5lciIsdCxzLmxpc3RlbmVyfHxlKSk7ZWxzZSBpZih0eXBlb2YgcyE9ImZ1bmN0aW9uIil7Zm9yKGk9LTEsYT1zLmxlbmd0aC0xO2E+PTA7YS0tKWlmKHNbYV09PT1lfHxzW2FdLmxpc3RlbmVyPT09ZSl7ZD1zW2FdLmxpc3RlbmVyLGk9YTticmVha31pZihpPDApcmV0dXJuIHRoaXM7aT09PTA/cy5zaGlmdCgpOmlzKHMsaSkscy5sZW5ndGg9PT0xJiYoblt0XT1zWzBdKSxuLnJlbW92ZUxpc3RlbmVyIT09dm9pZCAwJiZ0aGlzLmVtaXQoInJlbW92ZUxpc3RlbmVyIix0LGR8fGUpfXJldHVybiB0aGlzfSxMLnByb3RvdHlwZS5vZmY9TC5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIsTC5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzPWZ1bmN0aW9uKHQpe3ZhciBlLHMsbjtpZihzPXRoaXMuX2V2ZW50cyxzPT09dm9pZCAwKXJldHVybiB0aGlzO2lmKHMucmVtb3ZlTGlzdGVuZXI9PT12b2lkIDApcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PT0wPyh0aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9ldmVudHNDb3VudD0wKTpzW3RdIT09dm9pZCAwJiYoLS10aGlzLl9ldmVudHNDb3VudD09PTA/dGhpcy5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCk6ZGVsZXRlIHNbdF0pLHRoaXM7aWYoYXJndW1lbnRzLmxlbmd0aD09PTApe3ZhciBpPU9iamVjdC5rZXlzKHMpLGE7Zm9yKG49MDtuPGkubGVuZ3RoOysrbilhPWlbbl0sYSE9PSJyZW1vdmVMaXN0ZW5lciImJnRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGEpO3JldHVybiB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygicmVtb3ZlTGlzdGVuZXIiKSx0aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9ldmVudHNDb3VudD0wLHRoaXN9aWYoZT1zW3RdLHR5cGVvZiBlPT0iZnVuY3Rpb24iKXRoaXMucmVtb3ZlTGlzdGVuZXIodCxlKTtlbHNlIGlmKGUhPT12b2lkIDApZm9yKG49ZS5sZW5ndGgtMTtuPj0wO24tLSl0aGlzLnJlbW92ZUxpc3RlbmVyKHQsZVtuXSk7cmV0dXJuIHRoaXN9O2Z1bmN0aW9uIGp0KHIsdCxlKXt2YXIgcz1yLl9ldmVudHM7aWYocz09PXZvaWQgMClyZXR1cm5bXTt2YXIgbj1zW3RdO3JldHVybiBuPT09dm9pZCAwP1tdOnR5cGVvZiBuPT0iZnVuY3Rpb24iP2U/W24ubGlzdGVuZXJ8fG5dOltuXTplP2FzKG4pOkh0KG4sbi5sZW5ndGgpfUwucHJvdG90eXBlLmxpc3RlbmVycz1mdW5jdGlvbih0KXtyZXR1cm4ganQodGhpcyx0LCEwKX0sTC5wcm90b3R5cGUucmF3TGlzdGVuZXJzPWZ1bmN0aW9uKHQpe3JldHVybiBqdCh0aGlzLHQsITEpfSxMLmxpc3RlbmVyQ291bnQ9ZnVuY3Rpb24ocix0KXtyZXR1cm4gdHlwZW9mIHIubGlzdGVuZXJDb3VudD09ImZ1bmN0aW9uIj9yLmxpc3RlbmVyQ291bnQodCk6VXQuY2FsbChyLHQpfSxMLnByb3RvdHlwZS5saXN0ZW5lckNvdW50PVV0O2Z1bmN0aW9uIFV0KHIpe3ZhciB0PXRoaXMuX2V2ZW50cztpZih0IT09dm9pZCAwKXt2YXIgZT10W3JdO2lmKHR5cGVvZiBlPT0iZnVuY3Rpb24iKXJldHVybiAxO2lmKGUhPT12b2lkIDApcmV0dXJuIGUubGVuZ3RofXJldHVybiAwfUwucHJvdG90eXBlLmV2ZW50TmFtZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXZlbnRzQ291bnQ+MD9KZSh0aGlzLl9ldmVudHMpOltdfTtmdW5jdGlvbiBIdChyLHQpe2Zvcih2YXIgZT1uZXcgQXJyYXkodCkscz0wO3M8dDsrK3MpZVtzXT1yW3NdO3JldHVybiBlfWZ1bmN0aW9uIGlzKHIsdCl7Zm9yKDt0KzE8ci5sZW5ndGg7dCsrKXJbdF09clt0KzFdO3IucG9wKCl9ZnVuY3Rpb24gYXMocil7Zm9yKHZhciB0PW5ldyBBcnJheShyLmxlbmd0aCksZT0wO2U8dC5sZW5ndGg7KytlKXRbZV09cltlXS5saXN0ZW5lcnx8cltlXTtyZXR1cm4gdH1mdW5jdGlvbiBvcyhyLHQpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlLHMpe2Z1bmN0aW9uIG4oYSl7ci5yZW1vdmVMaXN0ZW5lcih0LGkpLHMoYSl9ZnVuY3Rpb24gaSgpe3R5cGVvZiByLnJlbW92ZUxpc3RlbmVyPT0iZnVuY3Rpb24iJiZyLnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsbiksZShbXS5zbGljZS5jYWxsKGFyZ3VtZW50cykpfUt0KHIsdCxpLHtvbmNlOiEwfSksdCE9PSJlcnJvciImJmNzKHIsbix7b25jZTohMH0pfSl9ZnVuY3Rpb24gY3Mocix0LGUpe3R5cGVvZiByLm9uPT0iZnVuY3Rpb24iJiZLdChyLCJlcnJvciIsdCxlKX1mdW5jdGlvbiBLdChyLHQsZSxzKXtpZih0eXBlb2Ygci5vbj09ImZ1bmN0aW9uIilzLm9uY2U/ci5vbmNlKHQsZSk6ci5vbih0LGUpO2Vsc2UgaWYodHlwZW9mIHIuYWRkRXZlbnRMaXN0ZW5lcj09ImZ1bmN0aW9uIilyLmFkZEV2ZW50TGlzdGVuZXIodCxmdW5jdGlvbiBuKGkpe3Mub25jZSYmci5yZW1vdmVFdmVudExpc3RlbmVyKHQsbiksZShpKX0pO2Vsc2UgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlICJlbWl0dGVyIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRXZlbnRFbWl0dGVyLiBSZWNlaXZlZCB0eXBlICcrdHlwZW9mIHIpfXZhciBSOyhmdW5jdGlvbihyKXtyW3IuTUFKT1JfRVZFTlQ9MF09Ik1BSk9SX0VWRU5UIixyW3IuTUlOT1JfRVZFTlQ9MV09Ik1JTk9SX0VWRU5UIn0pKFJ8fChSPXt9KSk7dmFyIFM7KGZ1bmN0aW9uKHIpe3IuUFJFQ0FMTF9URVNUX0JFR0lOPSJwcmVjYWxsX2JlZ2luIixyLlBSRUNBTExfVEVTVF9DT01QTEVURT0icHJlY2FsbF9lbmQiLHIuQ0FMTF9KT0lOX0JFR0lOPSJjYWxsX2pvaW4iLHIuTkVUX1FVQUxJVFlfVEVTVF9CRUdJTj0ibmV0X3F1YWxpdHlfdGVzdF9iZWdpbiIsci5ORVRfUVVBTElUWV9URVNUX0VORD0ibmV0X3F1YWxpdHlfdGVzdF9lbmQiLHIuV0VCU09DS0VUX0NPTk5FQ1RFRD0id2Vic29ja2V0X2Nvbm5lY3RlZCIsci5UUkFOU1BPUlRfQ09OTkVDVEVEPSJ0cmFuc3BvcnRfY29ubmVjdGVkIixyLkFVRElPX09OPSJhdWRpb19vbiIsci5BVURJT19PRkY9ImF1ZGlvX29mZiIsci5WSURFT19PTj0idmlkZW9fb24iLHIuVklERU9fT0ZGPSJ2aWRlb19vZmYiLHIuUEFSVElDSVBBTlRfUk9MRT0icGFydGljaXBhbnRfcm9sZSIsci5QSU5HX1NUQVQ9InBpbmdfc3RhdCIsci5ESVNDT05ORUNUPSJkaXNjb25uZWN0IixyLlJFQ09OTkVDVF9BVFRFTVBUPSJyZWNvbm5lY3RfYXR0ZW1wdCIsci5TQ1JFRU5TSEFSRV9TVEFSVF9SRVFVRVNURUQ9InNjcmVlbnNoYXJlX3N0YXJ0X3JlcXVlc3RlZCIsci5TQ1JFRU5TSEFSRV9TVEFSVEVEPSJzY3JlZW5zaGFyZV9zdGFydGVkIixyLlNDUkVFTlNIQVJFX1NUT1BQRUQ9InNjcmVlbnNoYXJlX3N0b3BwZWQiLHIuVEFCX0NIQU5HRT0idGFiX2NoYW5nZSIsci5CUk9XU0VSX0JBQ0tHUk9VTkRFRD0iYnJvd3Nlcl9iYWNrZ3JvdW5kZWQiLHIuQlJPV1NFUl9GT1JFR1JPVU5ERUQ9ImJyb3dzZXJfZm9yZWdyb3VuZGVkIixyLkRPTUlOQU5UX1NQRUFLRVI9ImRvbWluYW50X3NwZWFrZXIiLHIuQVVESU9fREVWSUNFU19VUERBVEVTPSJhdWRpb19kZXZpY2VzX3VwZGF0ZXMiLHIuVklERU9fREVWSUNFU19VUERBVEVTPSJ2aWRlb19kZXZpY2VzX3VwZGF0ZXMiLHIuU1BFQUtFUl9ERVZJQ0VTX1VQREFURVM9InNwZWFrZXJfZGV2aWNlc191cGRhdGVzIixyLlNFTEVDVEVEX01JQ1JPSFBPTkVfVVBEQVRFPSJzZWxlY3RlZF9taWNyb3Bob25lX3VwZGF0ZSIsci5TRUxFQ1RFRF9DQU1FUkFfVVBEQVRFPSJzZWxlY3RlZF9jYW1lcmFfdXBkYXRlIixyLlNFTEVDVEVEX1NQRUFLRVJfVVBEQVRFPSJzZWxlY3RlZF9zcGVha2VyX3VwZGF0ZSIsci5FWFBFQ1RFRF9WSURFT19SRVNPTFVUSU9OPSJleHBlY3RlZF92aWRlb19yZXNvbHV0aW9uIixyLkVYUEVDVEVEX1NDUkVFTlNIQVJFX1JFU09MVVRJT049ImV4cGVjdGVkX3NjcmVlbnNoYXJlX3Jlc29sdXRpb24iLHIuTUVESUFfUEVSTUlTU0lPTj0ibWVkaWFfcGVybWlzc2lvbiIsci5MRUdBQ1lfU1dJVENIPSJsZWdhY3lfc3dpdGNoIixyLkFVRElPX1BMQVlfRkFJTEVEPSJhdWRpb19wbGF5X2ZhaWxlZCIsci5WSURFT19QTEFZX0ZBSUxFRD0idmlkZW9fcGxheV9mYWlsZWQiLHIuQVVESU9fVFJBQ0tfTVVURUQ9ImF1ZGlvX3RyYWNrX211dGVkIixyLlZJREVPX1RSQUNLX01VVEVEPSJ2aWRlb190cmFja19tdXRlZCIsci5JVlNfUExBWUVSX1JFQlVGRkVSSU5HPSJpdnNfcGxheWVyX3JlYnVmZmVyaW5nIixyLklWU19QTEFZRVJfQVVESU9fQkxPQ0tFRD0iaXZzX3BsYXllcl9hdWRpb19ibG9ja2VkIixyLklWU19QTEFZRVJfUExBWUJBQ0tfQkxPQ0tFRD0iaXZzX3BsYXllcl9wbGF5YmFja19ibG9ja2VkIixyLklWU19QTEFZRVJfRVJST1I9Iml2c19wbGF5ZXJfZXJyb3IiLHIuSVZTX1BMQVlFUl9SRUNPVkVSQUJMRV9FUlJPUj0iaXZzX3BsYXllcl9yZWNvdmVyYWJsZV9lcnJvciIsci5JVlNfUExBWUVSX1dPUktFUl9FUlJPUj0iaXZzX3BsYXllcl93b3JrZXJfZXJyb3IiLHIuSVZTX1BMQVlFUl9ORVRXT1JLX1VOQVZBSUxBQkxFPSJpdnNfcGxheWVyX25ldHdvcmtfdW5hdmFpbGFibGUiLHIuTElWRVNUUkVBTV9MQVRFTkNZPSJsaXZlc3RyZWFtX2xhdGVuY3kiLHIuSVZTX1BMQVlFUl9BTkFMWVRJQ1NfRVZFTlQ9Iml2c19wbGF5ZXJfYW5hbHl0aWNzX2V2ZW50IixyLklWU19QTEFZRVJfUExBWUJBQ0tfUkFURV9DSEFOR0VEPSJpdnNfcGxheWVyX3BsYXliYWNrX3JhdGVfY2hhbmdlZCIsci5JVlNfUExBWUVSX1FVQUxJVFlfQ0hBTkdFRD0iaXZzX3BsYXllcl9xdWFsaXR5X2NoYW5nZWQiLHIuSVZTX1BMQVlFUl9JTklUSUFMSVpFRD0iaXZzX3BsYXllcl9pbml0aWFsaXplZCJ9KShTfHwoUz17fSkpO2NvbnN0IGRzPW5ldyBNYXAoW1tTLlBSRUNBTExfVEVTVF9CRUdJTixSLk1JTk9SX0VWRU5UXSxbUy5QUkVDQUxMX1RFU1RfQ09NUExFVEUsUi5NSU5PUl9FVkVOVF0sW1MuQ0FMTF9KT0lOX0JFR0lOLFIuTUFKT1JfRVZFTlRdLFtTLk5FVF9RVUFMSVRZX1RFU1RfQkVHSU4sUi5NSU5PUl9FVkVOVF0sW1MuTkVUX1FVQUxJVFlfVEVTVF9FTkQsUi5NSU5PUl9FVkVOVF0sW1MuV0VCU09DS0VUX0NPTk5FQ1RFRCxSLk1JTk9SX0VWRU5UXSxbUy5UUkFOU1BPUlRfQ09OTkVDVEVELFIuTUFKT1JfRVZFTlRdLFtTLkFVRElPX09OLFIuTUlOT1JfRVZFTlRdLFtTLkFVRElPX09GRixSLk1JTk9SX0VWRU5UXSxbUy5WSURFT19PTixSLk1JTk9SX0VWRU5UXSxbUy5WSURFT19PRkYsUi5NSU5PUl9FVkVOVF0sW1MuUEFSVElDSVBBTlRfUk9MRSxSLk1JTk9SX0VWRU5UXSxbUy5QSU5HX1NUQVQsUi5NQUpPUl9FVkVOVF0sW1MuRElTQ09OTkVDVCxSLk1BSk9SX0VWRU5UXSxbUy5SRUNPTk5FQ1RfQVRURU1QVCxSLk1BSk9SX0VWRU5UXSxbUy5TQ1JFRU5TSEFSRV9TVEFSVF9SRVFVRVNURUQsUi5NSU5PUl9FVkVOVF0sW1MuU0NSRUVOU0hBUkVfU1RBUlRFRCxSLk1JTk9SX0VWRU5UXSxbUy5TQ1JFRU5TSEFSRV9TVE9QUEVELFIuTUlOT1JfRVZFTlRdLFtTLlRBQl9DSEFOR0UsUi5NSU5PUl9FVkVOVF0sW1MuQlJPV1NFUl9CQUNLR1JPVU5ERUQsUi5NSU5PUl9FVkVOVF0sW1MuQlJPV1NFUl9GT1JFR1JPVU5ERUQsUi5NSU5PUl9FVkVOVF0sW1MuRE9NSU5BTlRfU1BFQUtFUixSLk1JTk9SX0VWRU5UXSxbUy5BVURJT19ERVZJQ0VTX1VQREFURVMsUi5NSU5PUl9FVkVOVF0sW1MuVklERU9fREVWSUNFU19VUERBVEVTLFIuTUlOT1JfRVZFTlRdLFtTLlNQRUFLRVJfREVWSUNFU19VUERBVEVTLFIuTUlOT1JfRVZFTlRdLFtTLlNFTEVDVEVEX01JQ1JPSFBPTkVfVVBEQVRFLFIuTUlOT1JfRVZFTlRdLFtTLlNFTEVDVEVEX0NBTUVSQV9VUERBVEUsUi5NSU5PUl9FVkVOVF0sW1MuU0VMRUNURURfU1BFQUtFUl9VUERBVEUsUi5NSU5PUl9FVkVOVF0sW1MuTUVESUFfUEVSTUlTU0lPTixSLk1JTk9SX0VWRU5UXSxbUy5MRUdBQ1lfU1dJVENILFIuTUlOT1JfRVZFTlRdLFtTLkFVRElPX1BMQVlfRkFJTEVELFIuTUlOT1JfRVZFTlRdLFtTLlZJREVPX1BMQVlfRkFJTEVELFIuTUlOT1JfRVZFTlRdLFtTLkFVRElPX1RSQUNLX01VVEVELFIuTUlOT1JfRVZFTlRdLFtTLlZJREVPX1RSQUNLX01VVEVELFIuTUlOT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfUkVCVUZGRVJJTkcsUi5NQUpPUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9BVURJT19CTE9DS0VELFIuTUFKT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfUExBWUJBQ0tfQkxPQ0tFRCxSLk1BSk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX0VSUk9SLFIuTUFKT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfUkVDT1ZFUkFCTEVfRVJST1IsUi5NQUpPUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9XT1JLRVJfRVJST1IsUi5NQUpPUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9ORVRXT1JLX1VOQVZBSUxBQkxFLFIuTUFKT1JfRVZFTlRdLFtTLkxJVkVTVFJFQU1fTEFURU5DWSxSLk1BSk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX0FOQUxZVElDU19FVkVOVCxSLk1JTk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX1BMQVlCQUNLX1JBVEVfQ0hBTkdFRCxSLk1JTk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX1FVQUxJVFlfQ0hBTkdFRCxSLk1JTk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX0lOSVRJQUxJWkVELFIuTUlOT1JfRVZFTlRdLFtTLkVYUEVDVEVEX1ZJREVPX1JFU09MVVRJT04sUi5NSU5PUl9FVkVOVF0sW1MuRVhQRUNURURfU0NSRUVOU0hBUkVfUkVTT0xVVElPTixSLk1JTk9SX0VWRU5UXV0pO2NsYXNzIGxze2NvbnN0cnVjdG9yKCl7dSh0aGlzLCJldmVudHMiKTt0aGlzLmV2ZW50cz1bXX1hZGQodCl7dGhpcy5ldmVudHMucHVzaCh0KX1mbHVzaCgpe3JldHVybntlbnRyaWVzOnRoaXMuZXZlbnRzLnNwbGljZSgwLDI1KX19fWNsYXNzIHVzIGV4dGVuZHMgV3tjb25zdHJ1Y3Rvcih7bG9nZ2VyOmUscGVlcklkOnMsYXBpSG9zdG5hbWVzOm4sYXV0aFRva2VuOml9KXtzdXBlcigpO3UodGhpcywibG9nZ2VyIik7dSh0aGlzLCJwZWVySWQiKTt1KHRoaXMsImV2ZW50U3RvcmUiKTt1KHRoaXMsImFwaUVuZHBvaW50Iik7dSh0aGlzLCJhdXRoVG9rZW4iKTt0aGlzLmxvZ2dlcj1lLHRoaXMucGVlcklkPXMsdGhpcy5hdXRoVG9rZW49aSx0aGlzLmFwaUVuZHBvaW50PWBodHRwczovLyR7bi5kYUNvbGxlY3Rvcn0vYXBpL3YxL21lc3NhZ2VgLHRoaXMuZXZlbnRTdG9yZT1uZXcgbHN9c2VuZEV2ZW50c0NodW5rVG9TZXJ2ZXIoZSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IHM9e3BheWxvYWQ6ZSxwZWVySWQ6dGhpcy5wZWVySWR9LG49bmV3IEFib3J0Q29udHJvbGxlcixpPXNldFRpbWVvdXQoKCk9Pm4uYWJvcnQoKSwzZTMpO3RyeXtyZXR1cm4geWllbGQgZmV0Y2godGhpcy5hcGlFbmRwb2ludCx7bWV0aG9kOiJQT1NUIixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiIsQXV0aG9yaXphdGlvbjpgQmVhcmVyICR7dGhpcy5hdXRoVG9rZW59YH0sYm9keTpKU09OLnN0cmluZ2lmeShzKSxzaWduYWw6bi5zaWduYWx9KSwhMH1jYXRjaChhKXtyZXR1cm4gdGhpcy5sb2dnZXIuZXJyb3IoImNhbGxTdGF0czo6c2VuZEV2ZW50c0NodW5rVG9TZXJ2ZXI6OmNhdGNoIix7cGVlcklkOnRoaXMucGVlcklkLGVuZHBvaW50OnRoaXMuYXBpRW5kcG9pbnQsZXJyb3I6YSBpbnN0YW5jZW9mIEVycm9yP2EubWVzc2FnZTpTdHJpbmcoYSksc3RhY2s6YSBpbnN0YW5jZW9mIEVycm9yP2Euc3RhY2s6dm9pZCAwfSksITF9ZmluYWxseXtjbGVhclRpbWVvdXQoaSl9fSl9Y2FsbEV2ZW50KGUpe2UudGltZXN0YW1wPW5ldyBEYXRlLHRoaXMuZXZlbnRTdG9yZS5hZGQoZSksdGhpcy5lbWl0KGUuZXZlbnQsZS5tZXRhRGF0YSksZHMuZ2V0KGUuZXZlbnQpPT09Ui5NQUpPUl9FVkVOVCYmdGhpcy5mbHVzaCgpfWZsdXNoKCl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3ZhciBzO2NvbnN0IGU9dGhpcy5ldmVudFN0b3JlLmZsdXNoKCk7aWYoKHM9ZT09bnVsbD92b2lkIDA6ZS5lbnRyaWVzKSE9bnVsbCYmcy5sZW5ndGgpe2NvbnN0IG49eWllbGQgdGhpcy5zZW5kRXZlbnRzQ2h1bmtUb1NlcnZlcihlKTtyZXR1cm4gbnx8ZS5lbnRyaWVzLmZvckVhY2goaT0+e3RoaXMuZXZlbnRTdG9yZS5hZGQoaSl9KSxufXJldHVybiExfSl9fXZhciBXdDsoZnVuY3Rpb24ocil7ci5DSFJPTUlVTT0iY2hyb211bSIsci5GSVJFRk9YPSJmaXJlZm94IixyLlNBRkFSST0ic2FmYXJpIn0pKFd0fHwoV3Q9e30pKTtjb25zdCB6dD17REVWRUw6ImRldmVsIixQUkVQUk9EOiJwcmVwcm9kIixQUk9EOiJwcm9kIn07dmFyIFk7KGZ1bmN0aW9uKHIpe3IuQVVESU89IkFVRElPIixyLlZJREVPPSJWSURFTyIsci5TUEVBS0VSPSJTUEVBS0VSIixyLlNDUkVFTlNIQVJFPSJTQ1JFRU5TSEFSRSJ9KShZfHwoWT17fSkpO3ZhciAkdDsoZnVuY3Rpb24ocil7cltyLklOSVQ9MF09IklOSVQiLHJbci5BQ0NFUFRFRD0xXT0iQUNDRVBURUQiLHJbci5ERU5JRUQ9Ml09IkRFTklFRCIscltyLlNZU19ERU5JRUQ9M109IlNZU19ERU5JRUQiLHJbci5GQUlMRUQ9NF09IkZBSUxFRCIscltyLk5PVEZPVU5EPTVdPSJOT1RGT1VORCIscltyLk5PVF9BUFBMSUNBQkxFPTZdPSJOT1RfQVBQTElDQUJMRSJ9KSgkdHx8KCR0PXt9KSk7ZnVuY3Rpb24gdGUocil7cmV0dXJuIHI/ci5zcGxpdCgiLiIpLnNsaWNlKDAsMikuY29uY2F0KFsiMCIsIjAiXSkuam9pbigiLiIpOiIifWZ1bmN0aW9uIFplKHtwYWNrZXRzTG9zdDpyLHBhY2tldHNTZW50OnR9KXtyZXR1cm4gdD4wP3IqMTAwL3Q6MH1mdW5jdGlvbiBldCh7cGFja2V0c0xvc3Q6cixwYWNrZXRzUmVjZWl2ZWQ6dH0pe3JldHVybiB0K3I+MD9yKjEwMC8odCtyKTowfWNvbnN0IEd0PTI0MCxxdD03MjAsWXQ9OCxRdD0zLHR0PTEwLHJ0PS4wMixzdD0uMDM7ZnVuY3Rpb24gSih7c3RhdDpyLHdlaWdodDp0LHJhbmdlTWluOmUscmFuZ2VNYXg6cyxyYW5nZVJhbmtpbmdEaXJlY3Rpb246bn0pe3JldHVybiByPT1udWxsP3Q6ZT09PXM/bj09PSJVUCI/cjw9ZT90OjA6cj49cz90OjA6bj09PSJVUCI/KDEtTWF0aC5tYXgoTWF0aC5taW4ocyxNYXRoLmFicyhyKSktZSwwKS8ocy1lKSkqdDpuPT09IkRPV04iP01hdGgubWF4KE1hdGgubWluKHMsTWF0aC5hYnMocikpLWUsMCkvKHMtZSkqdDp0fWZ1bmN0aW9uIEp0KHtpc0xvd1F1YWxpdHlWaWRlbzpyLGlzVmlkZW9TdHVjazp0LGlzVmlkZW9MYWdnaW5nOmUsaml0dGVyUXVhbGl0eTpzLHBhY2tldHNMb3N0UXVhbGl0eTpufSl7Y29uc3QgaT0uOCooKHI/Ljg1OjEpKihlPy43OjEpKih0Py41OjEpKSsuMioocypuKTtyZXR1cm4gTWF0aC5yb3VuZCgoaStOdW1iZXIuRVBTSUxPTikqMTAwKS8xMDB9ZnVuY3Rpb24gWHQoe3BhY2tldHNMb3N0OnIscGFja2V0c1NlbnQ6dH0pe3JldHVybiB0PjA/cioxMDAvdDowfWZ1bmN0aW9uIFp0KHtwYWNrZXRzTG9zdDpyLHBhY2tldHNTZW50OnQsaml0dGVyOmV9KXtjb25zdCBuPUooe3N0YXQ6WHQoe3BhY2tldHNMb3N0OnIscGFja2V0c1NlbnQ6dH0pLHdlaWdodDouNyxyYW5nZU1pbjowLHJhbmdlTWF4OnR0LHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSksYT1KKHtzdGF0OmUsd2VpZ2h0Oi4zLHJhbmdlTWluOnJ0LHJhbmdlTWF4OnN0LHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSk7cmV0dXJuIG4rYX1mdW5jdGlvbiBwcyh7ZnJhbWVXaWR0aDpyLGlzU2NyZWVuU2hhcmU6dH0pe3JldHVybiByPCh0P3F0Okd0KX1mdW5jdGlvbiBocyh7ZnJhbWVzUGVyU2Vjb25kOnIsaXNTY3JlZW5TaGFyZTp0fSl7cmV0dXJuIHI8KHQ/UXQ6WXQpfWZ1bmN0aW9uIG1zKHtmcmFtZXNFbmNvZGVkOnJ9KXtyZXR1cm4gcj09PTB9ZnVuY3Rpb24gZXIoe2ZyYW1lV2lkdGg6cixmcmFtZXNQZXJTZWNvbmQ6dCxwYWNrZXRzTG9zdDplLHBhY2tldHNTZW50OnMsaml0dGVyOm4saXNTY3JlZW5TaGFyZTppLGZyYW1lc0VuY29kZWQ6YX0pe2NvbnN0IGQ9Sih7c3RhdDpYdCh7cGFja2V0c0xvc3Q6ZSxwYWNrZXRzU2VudDpzfSksd2VpZ2h0OjEscmFuZ2VNaW46MCxyYW5nZU1heDp0dCxyYW5nZVJhbmtpbmdEaXJlY3Rpb246IlVQIn0pLG89Sih7c3RhdDpuLHdlaWdodDoxLHJhbmdlTWluOnJ0LHJhbmdlTWF4OnN0LHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSksaD1wcyh7ZnJhbWVXaWR0aDpyLGlzU2NyZWVuU2hhcmU6aX0pLGc9aHMoe2ZyYW1lc1BlclNlY29uZDp0LGlzU2NyZWVuU2hhcmU6aX0pLGI9bXMoe2ZyYW1lc0VuY29kZWQ6YSxpc1NjcmVlblNoYXJlOml9KTtyZXR1cm4gSnQoe2lzTG93UXVhbGl0eVZpZGVvOmgsaXNWaWRlb0xhZ2dpbmc6Zyxpc1ZpZGVvU3R1Y2s6YixqaXR0ZXJRdWFsaXR5Om8scGFja2V0c0xvc3RRdWFsaXR5OmR9KX1mdW5jdGlvbiB0cih7cGFja2V0c0xvc3Q6cixwYWNrZXRzUmVjZWl2ZWQ6dH0pe3JldHVybiB0K3I+MD9yKjEwMC8odCtyKTowfWZ1bmN0aW9uIHJyKHtjb25jZWFsbWVudEV2ZW50czpyLHBhY2tldHNMb3N0OnQscGFja2V0c1JlY2VpdmVkOmUsaml0dGVyOnN9KXtjb25zdCBpPUooe3N0YXQ6cix3ZWlnaHQ6LjIscmFuZ2VNaW46MCxyYW5nZU1heDozLHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSksYT0uNSxkPUooe3N0YXQ6dHIoe3BhY2tldHNMb3N0OnQscGFja2V0c1JlY2VpdmVkOmV9KSx3ZWlnaHQ6YSxyYW5nZU1pbjowLHJhbmdlTWF4OnR0LHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSksaD1KKHtzdGF0OnMsd2VpZ2h0Oi4zLHJhbmdlTWluOnJ0LHJhbmdlTWF4OnN0LHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSk7cmV0dXJuIGkrZCtofWZ1bmN0aW9uIGZzKHtmcmFtZXNEZWNvZGVkOnJ9KXtyZXR1cm4gcj09PTB9ZnVuY3Rpb24gZ3Moe2ZyYW1lc1BlclNlY29uZDpyLGlzU2NyZWVuU2hhcmU6dH0pe3JldHVybiByPCh0P1F0Oll0KX1mdW5jdGlvbiBTcyh7ZnJhbWVXaWR0aDpyLGlzU2NyZWVuU2hhcmU6dH0pe3JldHVybiByPCh0P3F0Okd0KX1mdW5jdGlvbiBzcih7ZnJhbWVXaWR0aDpyLGZyYW1lc1BlclNlY29uZDp0LHBhY2tldHNMb3N0OmUscGFja2V0c1JlY2VpdmVkOnMsaml0dGVyOm4saXNTY3JlZW5TaGFyZTppLGZyYW1lc0RlY29kZWQ6YX0pe2NvbnN0IGQ9Sih7c3RhdDp0cih7cGFja2V0c0xvc3Q6ZSxwYWNrZXRzUmVjZWl2ZWQ6c30pLHdlaWdodDoxLHJhbmdlTWluOjAscmFuZ2VNYXg6dHQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KSxvPUooe3N0YXQ6bix3ZWlnaHQ6MSxyYW5nZU1pbjpydCxyYW5nZU1heDpzdCxyYW5nZVJhbmtpbmdEaXJlY3Rpb246IlVQIn0pLGg9U3Moe2ZyYW1lV2lkdGg6cixpc1NjcmVlblNoYXJlOml9KSxnPWdzKHtmcmFtZXNQZXJTZWNvbmQ6dCxpc1NjcmVlblNoYXJlOml9KSxiPWZzKHtmcmFtZXNEZWNvZGVkOmEsaXNTY3JlZW5TaGFyZTppfSk7cmV0dXJuIEp0KHtpc0xvd1F1YWxpdHlWaWRlbzpoLGlzVmlkZW9MYWdnaW5nOmcsaXNWaWRlb1N0dWNrOmIsaml0dGVyUXVhbGl0eTpvLHBhY2tldHNMb3N0UXVhbGl0eTpkfSl9Y2xhc3MgWHtjb25zdHJ1Y3Rvcih0KXt1KHRoaXMsInBjMSIpO3UodGhpcywicGMyIik7dSh0aGlzLCJjb25zdHJhaW5WaWRlb0JpdHJhdGVLYnBzIik7dSh0aGlzLCJjb25zdHJhaW5PZmZlclRvUmVtb3ZlVmlkZW9GZWMiLCExKTt1KHRoaXMsImljZUNhbmRpZGF0ZUZpbHRlciIpO2NvbnN0IGU9bmV3IFJUQ1BlZXJDb25uZWN0aW9uKHQpLHM9bmV3IFJUQ1BlZXJDb25uZWN0aW9uKHQpO3RoaXMucGMxPWUsdGhpcy5wYzI9cyx0aGlzLmljZUNhbmRpZGF0ZUZpbHRlcj1YLm5vRmlsdGVyLHRoaXMucGMxLmFkZEV2ZW50TGlzdGVuZXIoImljZWNhbmRpZGF0ZSIsdGhpcy5vbkljZUNhbmRpZGF0ZS5iaW5kKHRoaXMsdGhpcy5wYzIpKSx0aGlzLnBjMi5hZGRFdmVudExpc3RlbmVyKCJpY2VjYW5kaWRhdGUiLHRoaXMub25JY2VDYW5kaWRhdGUuYmluZCh0aGlzLHRoaXMucGMxKSl9c3RhdGljIHBhcnNlQ2FuZGlkYXRlKHQpe2NvbnN0IGU9ImNhbmRpZGF0ZToiLHM9dC5pbmRleE9mKGUpK2UubGVuZ3RoLG49dC5zdWJzdHIocykuc3BsaXQoIiAiKTtyZXR1cm57dHlwZTpuWzddLHByb3RvY29sOm5bMl0sYWRkcmVzczpuWzRdfX1zdGF0aWMgaXNOb3RIb3N0Q2FuZGlkYXRlKHQpe3JldHVybiB0LnR5cGUhPT0iaG9zdCJ9c3RhdGljIGlzSG9zdCh0KXtyZXR1cm4gdC50eXBlPT09Imhvc3QifXN0YXRpYyBpc1JlbGF5KHQpe3JldHVybiB0LnR5cGU9PT0icmVsYXkifXN0YXRpYyBpc1JlZmxleGl2ZSh0KXtyZXR1cm4gdC50eXBlPT09InNyZmx4In1zdGF0aWMgbm9GaWx0ZXIodCl7cmV0dXJuITB9b25JY2VDYW5kaWRhdGUodCxlKXtpZihlLmNhbmRpZGF0ZSl7Y29uc3Qgcz1YLnBhcnNlQ2FuZGlkYXRlKGUuY2FuZGlkYXRlLmNhbmRpZGF0ZSk7dGhpcy5pY2VDYW5kaWRhdGVGaWx0ZXIocykmJnQuYWRkSWNlQ2FuZGlkYXRlKGUuY2FuZGlkYXRlKX19c2V0SWNlQ2FuZGlkYXRlRmlsdGVyKHQpe3RoaXMuaWNlQ2FuZGlkYXRlRmlsdGVyPXR9Y29uc3RyYWluVmlkZW9CaXRyYXRlKHQpe3RoaXMuY29uc3RyYWluVmlkZW9CaXRyYXRlS2Jwcz10fWRpc2FibGVWaWRlb0ZlYygpe3RoaXMuY29uc3RyYWluT2ZmZXJUb1JlbW92ZVZpZGVvRmVjPSEwfWdvdE9mZmVyKHQpe3RoaXMuY29uc3RyYWluT2ZmZXJUb1JlbW92ZVZpZGVvRmVjJiYodC5zZHA9dC5zZHAucmVwbGFjZSgvKG09dmlkZW8gMSBbXlxyXSspKDExNiAxMTcpKFxyXG4pL2csYCQxXHIKYCksdC5zZHA9dC5zZHAucmVwbGFjZSgvYT1ydHBtYXA6MTE2IHJlZFwvOTAwMDBcclxuL2csIiIpLHQuc2RwPXQuc2RwLnJlcGxhY2UoL2E9cnRwbWFwOjExNyB1bHBmZWNcLzkwMDAwXHJcbi9nLCIiKSx0LnNkcD10LnNkcC5yZXBsYWNlKC9hPXJ0cG1hcDo5OCBydHhcLzkwMDAwXHJcbi9nLCIiKSx0LnNkcD10LnNkcC5yZXBsYWNlKC9hPWZtdHA6OTggYXB0PTExNlxyXG4vZywiIikpLHRoaXMucGMxLnNldExvY2FsRGVzY3JpcHRpb24odCksdGhpcy5wYzIuc2V0UmVtb3RlRGVzY3JpcHRpb24odCksdGhpcy5wYzIuY3JlYXRlQW5zd2VyKCkudGhlbih0aGlzLmdvdEFuc3dlci5iaW5kKHRoaXMpLHRoaXMucmVwb3J0RmF0YWwuYmluZCh0aGlzKSl9Z290QW5zd2VyKHQpe3RoaXMuY29uc3RyYWluVmlkZW9CaXRyYXRlS2JwcyYmKHQuc2RwPXQuc2RwLnJlcGxhY2UoL2E9bWlkOnZpZGVvXHJcbi9nLGBhPW1pZDp2aWRlb1xyCmI9QVM6JHt0aGlzLmNvbnN0cmFpblZpZGVvQml0cmF0ZUticHN9XHIKYCkpLHRoaXMucGMyLnNldExvY2FsRGVzY3JpcHRpb24odCksdGhpcy5wYzEuc2V0UmVtb3RlRGVzY3JpcHRpb24odCl9ZXN0YWJsaXNoQ29ubmVjdGlvbigpe3RoaXMucGMxLmNyZWF0ZU9mZmVyKCkudGhlbih0aGlzLmdvdE9mZmVyLmJpbmQodGhpcyksdGhpcy5yZXBvcnRGYXRhbC5iaW5kKHRoaXMpKX1yZXBvcnRGYXRhbCh0KXtjb25zb2xlLmVycm9yKCJFcnJvcjoiLHQpfWdldFJvdW5kVHJpcFRpbWUoKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3RbdCxlXT15aWVsZCBQcm9taXNlLmFsbChbdGhpcy5wYzEuZ2V0U3RhdHMoKSx0aGlzLnBjMi5nZXRTdGF0cygpXSk7bGV0IHMsbjtpZih0LmZvckVhY2goaT0+e2kudHlwZT09PSJjYW5kaWRhdGUtcGFpciImJmkubm9taW5hdGVkPT09ITAmJmkuYnl0ZXNTZW50PjAmJihzPWkpfSksZS5mb3JFYWNoKGk9PntpLnR5cGU9PT0iY2FuZGlkYXRlLXBhaXIiJiZpLm5vbWluYXRlZD09PSEwJiZpLmJ5dGVzUmVjZWl2ZWQ+MCYmKG49aSl9KSxzJiZuKXRyeXtpZihzLmN1cnJlbnRSb3VuZFRyaXBUaW1lJiZuLmN1cnJlbnRSb3VuZFRyaXBUaW1lKXJldHVybntydHQ6cy5jdXJyZW50Um91bmRUcmlwVGltZSxiYWNrZW5kUlRUOm4uY3VycmVudFJvdW5kVHJpcFRpbWV9O2NvbnN0IGk9KG4ubGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wLXMubGFzdFBhY2tldFNlbnRUaW1lc3RhbXApLzFlMztyZXR1cm57cnR0OmksYmFja2VuZFJUVDppfX1jYXRjaChpKXtyZXR1cm59fSl9Y2xvc2UoKXt0aGlzLnBjMS5jbG9zZSgpLHRoaXMucGMyLmNsb3NlKCl9fWNsYXNzIG5yIGV4dGVuZHMgV3tjb25zdHJ1Y3RvcihlKXtzdXBlcigpO3UodGhpcywiY2FsbCIpO3UodGhpcywidGltZU91dCIpO3RoaXMuY2FsbD1uZXcgWChlKX1zdGFydChlPTFlNCl7dGhpcy5jYWxsLmVzdGFibGlzaENvbm5lY3Rpb24oKSx0aGlzLnRpbWVPdXQ9c2V0VGltZW91dCh0aGlzLnRlc3RGYWlsZWQuYmluZCh0aGlzKSxlKX10ZXN0Q29tcGxldGUoZSl7Y2xlYXJUaW1lb3V0KHRoaXMudGltZU91dCksdGhpcy5jYWxsLmNsb3NlKCksdGhpcy5lbWl0KCJkb25lIixlKX10ZXN0RmFpbGVkKGUpe3RoaXMuY2FsbC5jbG9zZSgpLHRoaXMuZW1pdCgiZmFpbGVkIixlKX19Y29uc3QgeXM9OCx2cz0xLzFlMztjbGFzcyBicyBleHRlbmRzIG5ye2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpO3UodGhpcywic2VuZGVyQ2hhbm5lbCIpO3UodGhpcywicmVjaWV2ZUNoYW5uZWwiKTt1KHRoaXMsInN0YXJ0VGltZSIpO3UodGhpcywibGFzdEJpdHJhdGVNZWFzdXJlVGltZSIpO3UodGhpcywic2VudFBheWxvYWRCeXRlcyIsMCk7dSh0aGlzLCJyZWNpZXZlZFBheWxvYWRCeXRlcyIsMCk7dSh0aGlzLCJsYXN0UmVjZWl2ZWRQYXlsb2FkQnl0ZXMiLDApO3UodGhpcywic3RvcFNlbmRpbmciLCExKTt1KHRoaXMsInRlc3RQcm9ncmVzcyIsMCk7dSh0aGlzLCJzYW1wbGVQYWNrZXQiLCIiKTt1KHRoaXMsImZpbmFsQml0cmF0ZVN1bSIsMCk7dSh0aGlzLCJiaXRSYXRlU2FtcGVscyIsMCk7dSh0aGlzLCJtYXhOdW1iZXJPZlBhY2tldHNUb1NlbmQiLDApO3UodGhpcywiYnl0ZXNUb0tlZXBCdWZmZXJlZCIsMCk7dSh0aGlzLCJ0ZXN0RHVyYXRpb25TZWNvbmRzIiw1KTt0aGlzLmNhbGwuc2V0SWNlQ2FuZGlkYXRlRmlsdGVyKFguaXNOb3RIb3N0Q2FuZGlkYXRlKSx0aGlzLnNlbmRlckNoYW5uZWw9dGhpcy5jYWxsLnBjMS5jcmVhdGVEYXRhQ2hhbm5lbChudWxsKTtmb3IobGV0IHM9MDtzPDEwMjQqMjU2O3MrPTEpdGhpcy5zYW1wbGVQYWNrZXQrPSJoIjt0aGlzLm1heE51bWJlck9mUGFja2V0c1RvU2VuZD0xLHRoaXMuYnl0ZXNUb0tlZXBCdWZmZXJlZD0xMDI0KnRoaXMubWF4TnVtYmVyT2ZQYWNrZXRzVG9TZW5kLHRoaXMudGVzdER1cmF0aW9uU2Vjb25kcz00LHRoaXMuc2VuZGVyQ2hhbm5lbC5hZGRFdmVudExpc3RlbmVyKCJvcGVuIix0aGlzLnNlbmRpbmdTdGVwLmJpbmQodGhpcykpLHRoaXMuY2FsbC5wYzIuYWRkRXZlbnRMaXN0ZW5lcigiZGF0YWNoYW5uZWwiLHRoaXMub25SZWNpZXZlckNoYW5uZWwuYmluZCh0aGlzKSl9c2VuZGluZ1N0ZXAoKXtjb25zdCBlPW5ldyBEYXRlO3RoaXMuc3RhcnRUaW1lfHwodGhpcy5zdGFydFRpbWU9ZSx0aGlzLmxhc3RCaXRyYXRlTWVhc3VyZVRpbWU9ZSk7Zm9yKGxldCBuPTA7biE9PXRoaXMubWF4TnVtYmVyT2ZQYWNrZXRzVG9TZW5kJiYhKHRoaXMuc2VuZGVyQ2hhbm5lbC5idWZmZXJlZEFtb3VudD49dGhpcy5ieXRlc1RvS2VlcEJ1ZmZlcmVkKTtuKz0xKXt0aGlzLnNlbnRQYXlsb2FkQnl0ZXMrPXRoaXMuc2FtcGxlUGFja2V0Lmxlbmd0aDt0cnl7dGhpcy5zZW5kZXJDaGFubmVsLnNlbmQodGhpcy5zYW1wbGVQYWNrZXQpfWNhdGNoKGkpe319Y29uc3Qgcz1lLmdldFRpbWUoKS10aGlzLnN0YXJ0VGltZS5nZXRUaW1lKCk7cz49MWUzKnRoaXMudGVzdER1cmF0aW9uU2Vjb25kcz8odGhpcy5zdG9wU2VuZGluZz0hMCx0aGlzLnRlc3RQcm9ncmVzcz0xMDApOih0aGlzLnRlc3RQcm9ncmVzcz1zLygxMCp0aGlzLnRlc3REdXJhdGlvblNlY29uZHMpLHNldFRpbWVvdXQodGhpcy5zZW5kaW5nU3RlcC5iaW5kKHRoaXMpLDEpKX1vbk1lc3NhZ2VSZWNpZXZlZChlKXt0aGlzLnJlY2lldmVkUGF5bG9hZEJ5dGVzKz1lLmRhdGEubGVuZ3RoO2NvbnN0IHM9bmV3IERhdGUsbj1zLmdldFRpbWUoKS10aGlzLmxhc3RCaXRyYXRlTWVhc3VyZVRpbWUuZ2V0VGltZSgpO2lmKG4+PTFlMyl7Y29uc3QgYT0odGhpcy5yZWNpZXZlZFBheWxvYWRCeXRlcy10aGlzLmxhc3RSZWNlaXZlZFBheWxvYWRCeXRlcykqeXMvKG4vMWUzKTt0aGlzLmZpbmFsQml0cmF0ZVN1bSs9YSx0aGlzLmJpdFJhdGVTYW1wZWxzKz0xLHRoaXMubGFzdFJlY2VpdmVkUGF5bG9hZEJ5dGVzPXRoaXMucmVjaWV2ZWRQYXlsb2FkQnl0ZXMsdGhpcy5sYXN0Qml0cmF0ZU1lYXN1cmVUaW1lPXN9aWYodGhpcy5zdG9wU2VuZGluZyYmdGhpcy5zZW50UGF5bG9hZEJ5dGVzPT09dGhpcy5yZWNpZXZlZFBheWxvYWRCeXRlcyl7Y29uc3QgaT10aGlzLmZpbmFsQml0cmF0ZVN1bS90aGlzLmJpdFJhdGVTYW1wZWxzO3RoaXMudGVzdENvbXBsZXRlKHt0aHJvdWdocHV0Ok1hdGgucm91bmQoaSp2cyl9KX19dGVzdENvbXBsZXRlKGUpe3RoaXMuY2FsbC5nZXRSb3VuZFRyaXBUaW1lKCkudGhlbigoe3J0dDpzLGJhY2tlbmRSVFQ6bn0pPT5zdXBlci50ZXN0Q29tcGxldGUoe1JUVDpzLGJhY2tlbmRSVFQ6bix0aHJvdWdocHV0OmUudGhyb3VnaHB1dH0pKX1vblJlY2lldmVyQ2hhbm5lbChlKXt0aGlzLnJlY2lldmVDaGFubmVsPWUuY2hhbm5lbCx0aGlzLnJlY2lldmVDaGFubmVsLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMub25NZXNzYWdlUmVjaWV2ZWQuYmluZCh0aGlzKSl9fWNsYXNzIGh0IGV4dGVuZHMgbnJ7Y29uc3RydWN0b3IoZSxzPVgubm9GaWx0ZXIpe3N1cGVyKGUpO3UodGhpcywiY2gxIik7dSh0aGlzLCJjaDIiKTt0aGlzLmNhbGwuc2V0SWNlQ2FuZGlkYXRlRmlsdGVyKHMpO2NvbnN0IG49dGhpcy5jYWxsLnBjMS5jcmVhdGVEYXRhQ2hhbm5lbChudWxsKTt0aGlzLmNoMT1uLG4uYWRkRXZlbnRMaXN0ZW5lcigib3BlbiIsKCk9PntuLnNlbmQoImhlbGxvIil9KSxuLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMub25DaDFSZWNpZXZlLmJpbmQodGhpcykpLHRoaXMuY2FsbC5wYzIuYWRkRXZlbnRMaXN0ZW5lcigiZGF0YWNoYW5uZWwiLHRoaXMuZGF0YUNoYW5uZWxIYW5kbGVyLmJpbmQodGhpcykpfW9uQ2gxUmVjaWV2ZShlKXtlLmRhdGEhPT0id29ybGQiP3RoaXMuaGFuZ3VwKCJJbnZhbGlkIGRhdGEgdHJhbnNtaXR0ZWQuIik6dGhpcy50ZXN0Q29tcGxldGUoe2Nvbm5lY3Rpdml0eTohMH0pfW9uQ2gyUmVjaWV2ZShlKXtpZihlLmRhdGEhPT0iaGVsbG8iKXRoaXMuaGFuZ3VwKCJJbnZhbGlkIGRhdGEgdHJhbnNtaXR0ZWQuIik7ZWxzZSB0cnl7dGhpcy5jaDIuc2VuZCgid29ybGQiKX1jYXRjaChzKXt9fWRhdGFDaGFubmVsSGFuZGxlcihlKXtjb25zdCBzPWUuY2hhbm5lbDt0aGlzLmNoMj1zLHMuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5vbkNoMlJlY2lldmUuYmluZCh0aGlzKSl9aGFuZ3VwKGUpe3RoaXMudGVzdEZhaWxlZChlKX19Y2xhc3MgRXMgZXh0ZW5kcyBodHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0LFguaXNIb3N0KX19Y2xhc3MgVHMgZXh0ZW5kcyBodHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0LFguaXNSZWxheSl9fWNsYXNzIFJzIGV4dGVuZHMgaHR7Y29uc3RydWN0b3IodCl7c3VwZXIodCxYLmlzUmVmbGV4aXZlKX19Y2xhc3MgUHN7Y29uc3RydWN0b3IoKXt1KHRoaXMsImlwSW5mb3JtYXRpb24iLG51bGwpfWdldElQRGV0YWlscyhuKXtyZXR1cm4gdyh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbiooe3BlZXJJZDp0LGFwaUhvc3RuYW1lczplLGxvZ2dlcjpzfSl7dmFyIGksYSxkO2lmKCF0aGlzLmlwSW5mb3JtYXRpb24pe3RyeXtjb25zdCBvPWBodHRwczovLyR7ZS5sb2NhdGlvbn1gLGc9eWllbGQoeWllbGQgZmV0Y2gobykpLmpzb24oKTtpZigoKGk9Zy5sb2MpPT1udWxsP3ZvaWQgMDppLmxlbmd0aCk+NSlyZXR1cm4gdGhpcy5pcEluZm9ybWF0aW9uPWcsKGE9dGhpcy5pcEluZm9ybWF0aW9uKSE9bnVsbCYmYS5pcCYmKHRoaXMuaXBJbmZvcm1hdGlvbi5pcD10ZSh0aGlzLmlwSW5mb3JtYXRpb24uaXApKSxnO3Rocm93IEVycm9yKCJJbnN1ZmZpY2llbnQgZGF0YSIpfWNhdGNoKG8pe3MuZXJyb3IoImNhbGxzdGF0czo6aXBEZXRhaWxzOjogZmFpbGVkIHRvIGZldGNoIGlwIHVzaW5nIGxvY2F0aW9uIHNlcnZpY2UiLHtlcnJvcjpvfSl9dHJ5e2NvbnN0IG89eWllbGQgZmV0Y2goYGh0dHBzOi8vJHtlLmxvY2F0aW9uTGVnYWN5fS8/dG9rZW49M2M0OTM5MzJiMDYyNGMmcGVlcklkPSR7dH1gLHttZXRob2Q6IlBPU1QifSk7dGhpcy5pcEluZm9ybWF0aW9uPXlpZWxkIG8uanNvbigpLChkPXRoaXMuaXBJbmZvcm1hdGlvbikhPW51bGwmJmQuaXAmJih0aGlzLmlwSW5mb3JtYXRpb24uaXA9dGUodGhpcy5pcEluZm9ybWF0aW9uLmlwKSl9Y2F0Y2gobyl7cy5lcnJvcigiY2FsbHN0YXRzOjppcERldGFpbHM6OiBmYWlsZWQgdG8gZmV0Y2ggaXAgdXNpbmcgbGVnYWN5IGxvY2F0aW9uIHNlcnZpY2UiLHtlcnJvcjpvfSl9fXJldHVybiB0aGlzLmlwSW5mb3JtYXRpb259KX1yZXNldENhY2hlKCl7dGhpcy5pcEluZm9ybWF0aW9uPW51bGx9fWNvbnN0IGlyPW5ldyBQcyxhcj1be3VybHM6InR1cm46dHVybi5keXRlLmluOjQ0Mz90cmFuc3BvcnQ9dGNwIix1c2VybmFtZToiZHl0ZSIsY3JlZGVudGlhbDoiZHl0ZWluIixjcmVkZW50aWFsVHlwZToicGFzc3dvcmQifSx7dXJsczoidHVybjp0dXJuLmR5dGUuaW46MzQ3OD90cmFuc3BvcnQ9dWRwIix1c2VybmFtZToiZHl0ZSIsY3JlZGVudGlhbDoiZHl0ZWluIixjcmVkZW50aWFsVHlwZToicGFzc3dvcmQifV07ZnVuY3Rpb24gb3Iocil7Y29uc3RbdCxlXT1yLnNwbGl0KCIsIik7cmV0dXJue2Nvb3Jkczp7bGF0aXR1ZGU6TnVtYmVyKHQpLGxvbmdpdHVkZTpOdW1iZXIoZSl9fX1jbGFzcyBjcntjb25zdHJ1Y3Rvcigpe3UodGhpcywidHJhbnNwb3J0Iik7dSh0aGlzLCJjYW5kaWRhdGVQYWlyIik7dSh0aGlzLCJvdXRib3VuZFZpZGVvUnRwIixuZXcgTWFwKTt1KHRoaXMsImluYm91bmRWaWRlb1J0cCIsbmV3IE1hcCk7dSh0aGlzLCJvdXRib3VuZEF1ZGlvUnRwIixuZXcgTWFwKTt1KHRoaXMsImluYm91bmRBdWRpb1J0cCIsbmV3IE1hcCk7dSh0aGlzLCJyZW1vdGVJbmJvdW5kUnRwIixuZXcgTWFwKTt1KHRoaXMsInByb2R1Y2VyU3RyZWFtTWFwIixuZXcgTWFwKTt1KHRoaXMsImNvbnN1bWVyU3RyZWFtTWFwIixuZXcgTWFwKTt1KHRoaXMsInN0YWxlUHJvZHVjZXJTdHJlYW1NYXAiLCExKTt1KHRoaXMsInN0YWxlQ29uc3VtZXJTdHJlYW1NYXAiLCExKX19Y2xhc3MgZHIgZXh0ZW5kcyBXe2NvbnN0cnVjdG9yKCl7c3VwZXIoKTt1KHRoaXMsIm9ic2VydmVyIik7dSh0aGlzLCJvdXRib3VuZFByb2R1Y2VyTWFwIixuZXcgTWFwKTt1KHRoaXMsImluYm91bmRDb25zdW1lck1hcCIsbmV3IE1hcCk7dSh0aGlzLCJjb25zdW1lclBlZXJJZE1hcCIsbmV3IE1hcCk7dSh0aGlzLCJwYXVzZWRDb25zdW1lck1hcCIsbmV3IE1hcCk7dSh0aGlzLCJwYXVzZWRQcm9kdWNlck1hcCIsbmV3IE1hcCk7dSh0aGlzLCJvdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwIix7fSk7dSh0aGlzLCJvdmVyYWxsQ29uc3VtaW5nVHJhbnNwb3J0c1N0YXRzTWFwIix7fSk7dSh0aGlzLCJvdmVyYWxsQ29uc3VtZXJzU3RhdHNNYXAiLHt9KTt1KHRoaXMsIm92ZXJhbGxQcm9kdWNlcnNTdGF0c01hcCIse30pO3UodGhpcywidmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAiLG5ldyBNYXApO3UodGhpcywiYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAiLG5ldyBNYXApO3UodGhpcywidmlkZW9Db25zdW1lclRvU3RhdHNNYXAiLG5ldyBNYXApO3UodGhpcywiYXVkaW9Db25zdW1lclRvU3RhdHNNYXAiLG5ldyBNYXApO3UodGhpcywiY29uc3VtZXJJZHNXaXRoRnJlZXplZFZpZGVvIixuZXcgU2V0KTt1KHRoaXMsImNvbnN1bWVySWRzV2l0aEZyZWV6ZWRBdWRpbyIsbmV3IFNldCk7dSh0aGlzLCJwcm9kdWNlcklkc1dpdGhGcmVlemVkVmlkZW8iLG5ldyBTZXQpO3UodGhpcywicHJvZHVjZXJJZHNXaXRoRnJlZXplZEF1ZGlvIixuZXcgU2V0KTt1KHRoaXMsImZyZWV6ZWRQcm9kdWNpbmdUcmFuc3BvcnRJZHMiLG5ldyBTZXQpO3UodGhpcywiZnJlZXplZENvbnN1bWluZ1RyYW5zcG9ydElkcyIsbmV3IFNldCk7dSh0aGlzLCJzY3JlZW5TaGFyZVByb2R1Y2VycyIsbmV3IFNldCk7dSh0aGlzLCJzY3JlZW5TaGFyZUNvbnN1bWVycyIsbmV3IFNldCk7dSh0aGlzLCJpcERldGFpbHMiKTt1KHRoaXMsImNhbGxTdGF0c0luc3RhbmNlIik7dGhpcy5vYnNlcnZlcj1uZXcgV31yZWdpc3RlclByb2R1Y2VyKGUpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXt5aWVsZCB0aGlzLmdlbmVyYXRlUHJvZHVjZXJTdHJlYW1NYXAoZSksZS5vbigiY2xvc2UiLHRoaXMuZGVyZWdpc3RlclByb2R1Y2VyLmJpbmQodGhpcyxlKSksZS5vbigicGF1c2UiLHRoaXMucGF1c2VQcm9kdWNlci5iaW5kKHRoaXMsZS5pZCkpLGUub24oInJlc3VtZSIsdGhpcy5yZXN1bWVQcm9kdWNlci5iaW5kKHRoaXMsZS5pZCkpLGUuYXBwRGF0YS5zY3JlZW5TaGFyZT09PSEwJiZ0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmFkZChlLmlkKX0pfXBhdXNlUHJvZHVjZXIoZSl7dGhpcy5wYXVzZWRQcm9kdWNlck1hcC5zZXQoZSx7bGFzdFJlcG9ydENhbGN1bGF0ZWQ6ITF9KX1yZXN1bWVQcm9kdWNlcihlKXt0aGlzLnBhdXNlZFByb2R1Y2VyTWFwLmRlbGV0ZShlKX1wcm9jZXNzSW5ib3VuZENvbnN1bWVyVmlkZW9TdGF0cyhlLHMsbil7dmFyIGEsZDtjb25zdCBpPSgoZD0oYT10aGlzPT1udWxsP3ZvaWQgMDp0aGlzLmNhbGxTdGF0c0luc3RhbmNlKT09bnVsbD92b2lkIDA6YS5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwKT09bnVsbD92b2lkIDA6ZC5nZXQoZSkpfHx7fTtzLnRvdGFsVmlkZW9QYWNrZXRzUmVjZWl2ZWQ9PT1uLnBhY2tldHNSZWNlaXZlZD8odGhpcy5jb25zdW1lcklkc1dpdGhGcmVlemVkVmlkZW8uYWRkKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkudmlkZW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbHN0YXRzOjptZWFzdXJlbWVudHM6OmNvbnN1bWVyVmlkZW9GcmVlemVkIix7Y29uc3VtZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgiY29uc3VtZXJfdmlkZW9fc3RhdHVzIiwicGF1c2UiLGUpKSk6KHMudG90YWxWaWRlb1BhY2tldHNSZWNlaXZlZD1uLnBhY2tldHNSZWNlaXZlZCx0aGlzLmNvbnN1bWVySWRzV2l0aEZyZWV6ZWRWaWRlby5oYXMoZSkmJih0aGlzLmNvbnN1bWVySWRzV2l0aEZyZWV6ZWRWaWRlby5kZWxldGUoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmaS52aWRlbyYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsc3RhdHM6Om1lYXN1cmVtZW50czo6Y29uc3VtZXJWaWRlb0RlZnJlZXplZCIse2NvbnN1bWVySWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoImNvbnN1bWVyX3ZpZGVvX3N0YXR1cyIsInJlc3VtZSIsZSkpKSl9cHJvY2Vzc0luYm91bmRDb25zdW1lckF1ZGlvU3RhdHMoZSxzLG4pe3ZhciBhLGQ7Y29uc3QgaT0oKGQ9KGE9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmEuY29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlc01hcCk9PW51bGw/dm9pZCAwOmQuZ2V0KGUpKXx8e307cy50b3RhbEF1ZGlvUGFja2V0c1JlY2VpdmVkPT09bi5wYWNrZXRzUmVjZWl2ZWQ/KHRoaXMuY29uc3VtZXJJZHNXaXRoRnJlZXplZEF1ZGlvLmFkZChlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLmF1ZGlvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpjb25zdW1lckF1ZGlvRnJlZXplZCIse2NvbnN1bWVySWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoImNvbnN1bWVyX2F1ZGlvX3N0YXR1cyIsInBhdXNlIixlKSkpOihzLnRvdGFsQXVkaW9QYWNrZXRzUmVjZWl2ZWQ9bi5wYWNrZXRzUmVjZWl2ZWQsdGhpcy5jb25zdW1lcklkc1dpdGhGcmVlemVkQXVkaW8uaGFzKGUpJiYodGhpcy5jb25zdW1lcklkc1dpdGhGcmVlemVkQXVkaW8uZGVsZXRlKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkuYXVkaW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OmNvbnN1bWVyQXVkaW9EZWZyZWV6ZWQiLHtjb25zdW1lcklkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJjb25zdW1lcl9hdWRpb19zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NPdXRib3VuZFByb2R1Y2VyVmlkZW9TdGF0cyhlLHMsbil7dmFyIGE7Y29uc3QgaT0oKGE9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmEuY3VycmVudFVzZXJNZWRpYVN0YXRlcyl8fHt9O3MudG90YWxWaWRlb1BhY2tldHNTZW50PT09bi5wYWNrZXRzU2VudD8odGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkVmlkZW8uYWRkKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkudmlkZW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2VyVmlkZW9GcmVlemVkIix7cHJvZHVjZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfdmlkZW9fc3RhdHVzIiwicGF1c2UiLGUpKSk6KHMudG90YWxWaWRlb1BhY2tldHNTZW50PW4ucGFja2V0c1NlbnQsdGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkVmlkZW8uaGFzKGUpJiYodGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkVmlkZW8uZGVsZXRlKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkudmlkZW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2VyVmlkZW9EZWZyZWV6ZWQiLHtwcm9kdWNlcklkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJwcm9kdWNlcl92aWRlb19zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NPdXRib3VuZFByb2R1Y2VyQXVkaW9TdGF0cyhlLHMsbil7dmFyIGE7Y29uc3QgaT0oKGE9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmEuY3VycmVudFVzZXJNZWRpYVN0YXRlcyl8fHt9O3MudG90YWxBdWRpb1BhY2tldHNTZW50PT09bi5wYWNrZXRzU2VudD8odGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkQXVkaW8uYWRkKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkuYXVkaW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2VyQXVkaW9GcmVlemVkIix7cHJvZHVjZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfYXVkaW9fc3RhdHVzIiwicGF1c2UiLGUpKSk6KHMudG90YWxBdWRpb1BhY2tldHNTZW50PW4ucGFja2V0c1NlbnQsdGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkQXVkaW8uaGFzKGUpJiYodGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkQXVkaW8uZGVsZXRlKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkuYXVkaW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2VyQXVkaW9EZWZyZWV6ZWQiLHtwcm9kdWNlcklkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJwcm9kdWNlcl9hdWRpb19zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NQcm9kdWNpbmdUcmFuc3BvcnRTdGF0cyhlLHMsbil7dmFyIGc7Y29uc3QgaT0oKGc9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmcuY3VycmVudFVzZXJNZWRpYVN0YXRlcyl8fHt9LHthdWRpbzphLHZpZGVvOmQsc2NyZWVuOm99PWksaD1hfHxkfHxvO3MudG90YWxQYWNrZXRzU2VudD09PW4ucGFja2V0c1NlbnQ/KHRoaXMuZnJlZXplZFByb2R1Y2luZ1RyYW5zcG9ydElkcy5hZGQoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmaCYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6Om1lYXN1cmVtZW50czo6cHJvZHVjaW5nVHJhbnNwb3J0RnJlZXplZCIse3RyYW5zcG9ydElkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJwcm9kdWNpbmdfdHJhbnNwb3J0X3N0YXR1cyIsInBhdXNlIixlKSkpOihzLnRvdGFsUGFja2V0c1NlbnQ9bi5wYWNrZXRzU2VudCx0aGlzLmZyZWV6ZWRQcm9kdWNpbmdUcmFuc3BvcnRJZHMuaGFzKGUpJiYodGhpcy5mcmVlemVkUHJvZHVjaW5nVHJhbnNwb3J0SWRzLmRlbGV0ZShlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZoJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpwcm9kdWNpbmdUcmFuc3BvcnREZWZyZWV6ZWQiLHt0cmFuc3BvcnRJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjaW5nX3RyYW5zcG9ydF9zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NDb25zdW1pbmdUcmFuc3BvcnRTdGF0cyhlLHMsbil7dmFyIGQsbztjb25zdCBhPSEhQXJyYXkuZnJvbSgoKG89KGQ9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmQuY29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlc01hcCk9PW51bGw/dm9pZCAwOm8udmFsdWVzKCkpfHxbXSkucmVkdWNlKChoLGcpPT5ofHxnLmF1ZGlvfHxnLnZpZGVvfHxnLnNjcmVlbiwhMSk7cy50b3RhbFBhY2tldHNSZWNlaXZlZD09PW4ucGFja2V0c1NlbnQ/KHRoaXMuZnJlZXplZENvbnN1bWluZ1RyYW5zcG9ydElkcy5hZGQoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmYSYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6Om1lYXN1cmVtZW50czo6Y29uc3VtaW5nVHJhbnNwb3J0RnJlZXplZCIse3RyYW5zcG9ydElkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJjb25zdW1pbmdfdHJhbnNwb3J0X3N0YXR1cyIsInBhdXNlIixlKSkpOihzLnRvdGFsUGFja2V0c1JlY2VpdmVkPW4ucGFja2V0c1NlbnQsdGhpcy5mcmVlemVkQ29uc3VtaW5nVHJhbnNwb3J0SWRzLmhhcyhlKSYmKHRoaXMuZnJlZXplZENvbnN1bWluZ1RyYW5zcG9ydElkcy5kZWxldGUoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmYSYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6Om1lYXN1cmVtZW50czo6Y29uc3VtaW5nVHJhbnNwb3J0RGVmcmVlemVkIix7dHJhbnNwb3J0SWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoImNvbnN1bWluZ190cmFuc3BvcnRfc3RhdHVzIiwicmVzdW1lIixlKSkpKX1yZWdpc3RlckNvbnN1bWVyKGUpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXt5aWVsZCB0aGlzLmdlbmVyYXRlQ29uc3VtZXJTdHJlYW1NYXAoZSksdGhpcy5jb25zdW1lclBlZXJJZE1hcC5zZXQoZS5pZCx7cHJvZHVjZXJJZDplLnByb2R1Y2VySWQscGVlcklkOmUuYXBwRGF0YS5wZWVySWQsYXBwRGF0YTplLmFwcERhdGF9KSxlLm9uKCJjbG9zZSIsdGhpcy5kZXJlZ2lzdGVyQ29uc3VtZXIuYmluZCh0aGlzLGUpKSxlLm9uKCJwYXVzZSIsdGhpcy5wYXVzZUNvbnN1bWVyLmJpbmQodGhpcyxlLmlkKSksZS5vbigicmVzdW1lIix0aGlzLnJlc3VtZUNvbnN1bWVyLmJpbmQodGhpcyxlLmlkKSksZS5hcHBEYXRhLnNjcmVlblNoYXJlPT09ITAmJnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuYWRkKGUuaWQpfSl9cGF1c2VDb25zdW1lcihlKXt0aGlzLnBhdXNlZENvbnN1bWVyTWFwLnNldChlLHtsYXN0UmVwb3J0Q2FsY3VsYXRlZDohMX0pfXJlc3VtZUNvbnN1bWVyKGUpe3RoaXMucGF1c2VkQ29uc3VtZXJNYXAuZGVsZXRlKGUpfWdlbmVyYXRlUHJvZHVjZXJTdHJlYW1NYXAoZSxzPSExKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgbj15aWVsZCBlLmdldFN0YXRzKCksaT1zP3RoaXMuZ2V0UHJvZHVjZXJTdGF0c0Zyb21SZXBvcnQodGhpcy5wYXJzZVJUQ1JlcG9ydChuLFsib3V0Ym91bmQtcnRwIiwicmVtb3RlLWluYm91bmQtcnRwIl0sITEsZS5pZCkpWzBdOnZvaWQgMDtmb3IoY29uc3QgYSBvZiBuLnZhbHVlcygpKXN3aXRjaChhLnR5cGUpe2Nhc2Uib3V0Ym91bmQtcnRwIjp7dGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLnNldChhLmlkLGUuaWQpO2JyZWFrfX1yZXR1cm4gaX0pfWdlbmVyYXRlQ29uc3VtZXJTdHJlYW1NYXAoZSxzPSExKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgbj15aWVsZCBlLmdldFN0YXRzKCksaT1zP3RoaXMuZ2V0Q29uc3VtZXJTdGF0c0Zyb21SZXBvcnQodGhpcy5wYXJzZVJUQ1JlcG9ydChuLFsiaW5ib3VuZC1ydHAiXSwhMSxlLmlkKSlbMF06dm9pZCAwO2Zvcihjb25zdCBhIG9mIG4udmFsdWVzKCkpc3dpdGNoKGEudHlwZSl7Y2FzZSJpbmJvdW5kLXJ0cCI6e3RoaXMuaW5ib3VuZENvbnN1bWVyTWFwLnNldChhLmlkLGUuaWQpO2JyZWFrfX1yZXR1cm4gaX0pfWRlcmVnaXN0ZXJQcm9kdWNlcihlKXt0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuZm9yRWFjaCgocyxuKT0+e3M9PT1lLmlkJiZ0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuZGVsZXRlKG4pfSksdGhpcy5wYXVzZWRQcm9kdWNlck1hcC5kZWxldGUoZS5pZCksdGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5kZWxldGUoZS5pZCl9ZGVyZWdpc3RlckNvbnN1bWVyKGUpe3RoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmZvckVhY2goKHMsbik9PntzPT09ZS5pZCYmdGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuZGVsZXRlKG4pfSksdGhpcy5jb25zdW1lclBlZXJJZE1hcC5kZWxldGUoZS5pZCksdGhpcy5wYXVzZWRDb25zdW1lck1hcC5kZWxldGUoZS5pZCksdGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5kZWxldGUoZS5pZCl9Z2V0SWNlQ2FuZGlkYXRlU3RhdHMoZSl7dmFyIHM7cmV0dXJue2lkOmUuaWQsdHlwZTplLmNhbmRpZGF0ZVR5cGV8fGUudHlwZSxhZGRyZXNzOmUuYWRkcmVzcyxwb3J0OmUucG9ydCx1cmw6ZS51cmwscHJvdG9jb2w6KHM9ZS5yZWxheVByb3RvY29sKSE9bnVsbD9zOmUucHJvdG9jb2wsbmV0d29ya1R5cGU6ZS5uZXR3b3JrVHlwZSxyZWxhdGVkQWRkcmVzczplLnJlbGF0ZWRBZGRyZXNzLHJlbGF0ZWRQb3J0OmUucmVsYXRlZFBvcnR9fWdldFdvcmtpbmdTaW11bGNhc3RWaWRlb1N0YXRzKGUpe3JldHVybiBlLmZpbmQobj0+e2NvbnN0IGk9bi5mcmFtZXNFbmNvZGVkPjAsYT1uLnBhY2tldHNTZW50PjAsZD1uLmZyYW1lV2lkdGgmJm4uZnJhbWVIZWlnaHQ7cmV0dXJuIGkmJmEmJiEhZH0pfHxlW2UubGVuZ3RoLTFdfXBhcnNlUlRDUmVwb3J0KGUscz1bXSxuPSExLGk9dm9pZCAwLGE9dm9pZCAwKXt2YXIgcSwkLGllLGFlLENlLEllLHdlLGtlLE1lLF9lLEFlLExlLE9lO2NvbnN0IGQ9ZSxvPW5ldyBjcixoPXMubGVuZ3RoP25ldyBTZXQocyk6dm9pZCAwLGc9W10sYj1bXSxUPVtdLFY9bmV3IE1hcCxVPW5ldyBNYXA7Zm9yKGNvbnN0IG0gb2YgZC52YWx1ZXMoKSl7aWYoaCl7aWYoaC5zaXplPT09MClicmVhaztpZihoLmhhcyhtLnR5cGUpKW4mJmguZGVsZXRlKG0udHlwZSk7ZWxzZSBjb250aW51ZX1zd2l0Y2gobS50eXBlKXtjYXNlImxvY2FsLWNhbmRpZGF0ZSI6e2cucHVzaCh0aGlzLmdldEljZUNhbmRpZGF0ZVN0YXRzKG0pKTticmVha31jYXNlInJlbW90ZS1jYW5kaWRhdGUiOntiLnB1c2godGhpcy5nZXRJY2VDYW5kaWRhdGVTdGF0cyhtKSk7YnJlYWt9Y2FzZSJjYW5kaWRhdGUtcGFpciI6e2NvbnN0e25vbWluYXRlZDpjfT1tLHtzZWxlY3RlZDpsfT1tLHY9bSxCPXtub21pbmF0ZWQ6YyE9bnVsbD9jOmwsY3VycmVudFJvdW5kVHJpcFRpbWU6di5jdXJyZW50Um91bmRUcmlwVGltZSx0b3RhbFJvdW5kVHJpcFRpbWU6di50b3RhbFJvdW5kVHJpcFRpbWUsYnl0ZXNSZWNlaXZlZDp2LmJ5dGVzUmVjZWl2ZWQsYnl0ZXNTZW50OnYuYnl0ZXNTZW50LGF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZTp2LmF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZSxhdmFpbGFibGVJbmNvbWluZ0JpdHJhdGU6di5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUsbGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wOnYubGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wLGxhc3RQYWNrZXRTZW50VGltZXN0YW1wOnYubGFzdFBhY2tldFNlbnRUaW1lc3RhbXAsbG9jYWxDYW5kaWRhdGVJZDp2LmxvY2FsQ2FuZGlkYXRlSWQscmVtb3RlQ2FuZGlkYXRlSWQ6di5yZW1vdGVDYW5kaWRhdGVJZCxieXRlc0Rpc2NhcmRlZE9uU2VuZDp2LmJ5dGVzRGlzY2FyZGVkT25TZW5kLHBhY2tldHNTZW50OnYucGFja2V0c1NlbnQscGFja2V0c1JlY2VpdmVkOnYucGFja2V0c1JlY2VpdmVkLHBhY2tldHNEaXNjYXJkZWRPblNlbmQ6di5wYWNrZXRzRGlzY2FyZGVkT25TZW5kfTtULnB1c2goQiksKG0ubm9taW5hdGVkPT09ITB8fG0uc2VsZWN0ZWQ9PT0hMCkmJihvLmNhbmRpZGF0ZVBhaXI9Qik7YnJlYWt9Y2FzZSJ0cmFuc3BvcnQiOntjb25zdCBjPW07YSYmKGEucHJvZHVjaW5nJiYodGhpcy5vdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdfHwodGhpcy5vdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdPXt0b3RhbFBhY2tldHNTZW50OjB9KSksYS5jb25zdW1pbmcmJih0aGlzLm92ZXJhbGxDb25zdW1pbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF18fCh0aGlzLm92ZXJhbGxDb25zdW1pbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF09e3RvdGFsUGFja2V0c1JlY2VpdmVkOjB9KSkpO2NvbnN0IGw9e2J5dGVzUmVjZWl2ZWQ6Yy5ieXRlc1JlY2VpdmVkLGJ5dGVzU2VudDpjLmJ5dGVzU2VudCxwYWNrZXRzU2VudDpjLnBhY2tldHNTZW50LHBhY2tldHNSZWNlaXZlZDpjLnBhY2tldHNSZWNlaXZlZCxkdGxzQ2lwaGVyOmMuZHRsc0NpcGhlcixkdGxzU3RhdGU6Yy5kdGxzU3RhdGUsaWNlUm9sZTpjLmljZVJvbGV9O2lmKG8udHJhbnNwb3J0PWwsYSl7aWYoYS5wcm9kdWNpbmcpe2NvbnN0IHY9dGhpcy5vdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdO3RoaXMucHJvY2Vzc1Byb2R1Y2luZ1RyYW5zcG9ydFN0YXRzKGEuaWQsdixsKX1pZihhLmNvbnN1bWluZyl7Y29uc3Qgdj10aGlzLm92ZXJhbGxDb25zdW1pbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF07dGhpcy5wcm9jZXNzQ29uc3VtaW5nVHJhbnNwb3J0U3RhdHMoYS5pZCx2LGwpfX1icmVha31jYXNlInJlbW90ZS1pbmJvdW5kLXJ0cCI6e2NvbnN0IGM9bSxsPXtqaXR0ZXI6Yy5qaXR0ZXIsZnJhY3Rpb25Mb3N0OmMuZnJhY3Rpb25Mb3N0LHJvdW5kVHJpcFRpbWU6Yy5yb3VuZFRyaXBUaW1lLHJvdW5kVHJpcFRpbWVNZWFzdXJlbWVudHM6Yy5yb3VuZFRyaXBUaW1lTWVhc3VyZW1lbnRzLHRvdGFsUm91bmRUcmlwVGltZTpjLnRvdGFsUm91bmRUcmlwVGltZSxwYWNrZXRzTG9zdDpjLnBhY2tldHNMb3N0fTtvLnJlbW90ZUluYm91bmRSdHAuc2V0KGMubG9jYWxJZCxsKTticmVha31jYXNlIm91dGJvdW5kLXJ0cCI6e2lmKCF0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuaGFzKG0uaWQpKWJyZWFrO2NvbnN0IGM9bSxsPWl8fHRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5nZXQobS5pZCksdj10aGlzLnBhdXNlZFByb2R1Y2VyTWFwLmdldChsKTtpZih2KXtpZih2Lmxhc3RSZXBvcnRDYWxjdWxhdGVkPT09ITApYnJlYWs7dGhpcy5wYXVzZWRQcm9kdWNlck1hcC5zZXQobCx7bGFzdFJlcG9ydENhbGN1bGF0ZWQ6ITB9KX10aGlzLm92ZXJhbGxQcm9kdWNlcnNTdGF0c01hcFtsXXx8KHRoaXMub3ZlcmFsbFByb2R1Y2Vyc1N0YXRzTWFwW2xdPXt0b3RhbFZpZGVvUGFja2V0c1NlbnQ6MCx0b3RhbEF1ZGlvUGFja2V0c1NlbnQ6MH0pO2NvbnN0IEI9dGhpcy5vdmVyYWxsUHJvZHVjZXJzU3RhdHNNYXBbbF07aWYoWyJ2aWRlbyIsImF1ZGlvIl0uaW5jbHVkZXMoYy5tZWRpYVR5cGUpfHxbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLmtpbmQpKXtpZighdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmhhcyhtLmlkKSl7by5zdGFsZVByb2R1Y2VyU3RyZWFtTWFwPSEwO2JyZWFrfWNvbnN0IHg9dGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5wcm9kdWNlcnMuZ2V0KGwpO2lmKCgocT14PT1udWxsP3ZvaWQgMDp4LnRyYWNrKT09bnVsbD92b2lkIDA6cS5yZWFkeVN0YXRlKT09PSJlbmRlZCIpYnJlYWs7by5wcm9kdWNlclN0cmVhbU1hcC5oYXMobCl8fG8ucHJvZHVjZXJTdHJlYW1NYXAuc2V0KGwse291dGJvdW5kVmlkZW9SdHBJZDpbXSxvdXRib3VuZEF1ZGlvUnRwSWQ6W119KTtjb25zdCB5PXtieXRlc1NlbnQ6Yy5ieXRlc1NlbnQscGFja2V0c1NlbnQ6Yy5wYWNrZXRzU2VudCxuYWNrQ291bnQ6Yy5uYWNrQ291bnQsc3NyYzpjLnNzcmMsbWlkOmMubWlkLGFjdGl2ZTpjLmFjdGl2ZSxjb2RlY0lkOmMuY29kZWNJZCxoZWFkZXJCeXRlc1NlbnQ6Yy5oZWFkZXJCeXRlc1NlbnR8fDAsdG90YWxQYWNrZXRTZW5kRGVsYXk6Yy50b3RhbFBhY2tldFNlbmREZWxheXx8MH07aWYoYy5tZWRpYVR5cGU9PT0idmlkZW8ifHxjLmtpbmQ9PT0idmlkZW8iKXtjb25zdCBwPWMsSD1HKHtmcmFtZUhlaWdodDpwLmZyYW1lSGVpZ2h0LGZyYW1lV2lkdGg6cC5mcmFtZVdpZHRoLGZyYW1lc0VuY29kZWQ6cC5mcmFtZXNFbmNvZGVkLGZyYW1lc0Ryb3BwZWQ6cC5mcmFtZXNEcm9wcGVkLGZyYW1lc1BlclNlY29uZDpwLmZyYW1lc1BlclNlY29uZCxmcmFtZXNTZW50OnAuZnJhbWVzU2VudCxrZXlGcmFtZXNFbmNvZGVkOnAua2V5RnJhbWVzRW5jb2RlZCxmaXJDb3VudDpwLmZpckNvdW50LGVuY29kZXJJbXBsZW1lbnRhdGlvbjpwLmVuY29kZXJJbXBsZW1lbnRhdGlvbixodWdlRnJhbWVzU2VudDpwLmh1Z2VGcmFtZXNTZW50LHBsaUNvdW50OnAucGxpQ291bnQscXBTdW06cC5xcFN1bSxxdWFsaXR5TGltaXRhdGlvbkR1cmF0aW9uczpwLnF1YWxpdHlMaW1pdGF0aW9uRHVyYXRpb25zLHF1YWxpdHlMaW1pdGF0aW9uUmVhc29uOnAucXVhbGl0eUxpbWl0YXRpb25SZWFzb24scXVhbGl0eUxpbWl0YXRpb25SZXNvbHV0aW9uQ2hhbmdlczpwLnF1YWxpdHlMaW1pdGF0aW9uUmVzb2x1dGlvbkNoYW5nZXMsdG90YWxFbmNvZGVUaW1lOnAudGFyZ2V0Qml0cmF0ZSx0b3RhbFBhY2tldFNlbmREZWxheTpwLnRvdGFsUGFja2V0U2VuZERlbGF5LHJldHJhbnNtaXR0ZWRCeXRlc1NlbnQ6cC5yZXRyYW5zbWl0dGVkQnl0ZXNTZW50LHJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudDpwLnJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudCxzY2FsYWJpbGl0eU1vZGU6cC5zY2FsYWJpbGl0eU1vZGUscG93ZXJFZmZpY2llbnRFbmNvZGVyOnAucG93ZXJFZmZpY2llbnRFbmNvZGVyfSx5KTtvLm91dGJvdW5kVmlkZW9SdHAuc2V0KG0uaWQsSCksby5wcm9kdWNlclN0cmVhbU1hcC5nZXQobCkub3V0Ym91bmRWaWRlb1J0cElkLnB1c2gobS5pZCksdGhpcy5wcm9jZXNzT3V0Ym91bmRQcm9kdWNlclZpZGVvU3RhdHMobCxCLEgpfWVsc2UgaWYoYy5tZWRpYVR5cGU9PT0iYXVkaW8ifHxjLmtpbmQ9PT0iYXVkaW8iKXtjb25zdCBwPWMsSD1HKHtyZXRyYW5zbWl0dGVkQnl0ZXNTZW50OnAucmV0cmFuc21pdHRlZEJ5dGVzU2VudCxyZXRyYW5zbWl0dGVkUGFja2V0c1NlbnQ6cC5yZXRyYW5zbWl0dGVkUGFja2V0c1NlbnR9LHkpO28ub3V0Ym91bmRBdWRpb1J0cC5zZXQobS5pZCxIKSxvLnByb2R1Y2VyU3RyZWFtTWFwLmdldChsKS5vdXRib3VuZEF1ZGlvUnRwSWQucHVzaChtLmlkKSx0aGlzLnByb2Nlc3NPdXRib3VuZFByb2R1Y2VyQXVkaW9TdGF0cyhsLEIsSCl9fWVsc2UgdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZXJyb3IoYENhbGxzdGF0czogVW5rbm93biBPdXRib3VuZC1ydHAuIG1lZGlhdHlwZTogJHtjLm1lZGlhVHlwZX0ga2luZDogJHtjLmtpbmR9YCk7YnJlYWt9Y2FzZSJpbmJvdW5kLXJ0cCI6e2lmKCF0aGlzLmluYm91bmRDb25zdW1lck1hcC5oYXMobS5pZCkpYnJlYWs7Y29uc3QgYz1tLGw9aXx8dGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuZ2V0KG0uaWQpLHY9dGhpcy5wYXVzZWRDb25zdW1lck1hcC5nZXQobCk7aWYodil7aWYodi5sYXN0UmVwb3J0Q2FsY3VsYXRlZD09PSEwKWJyZWFrO3RoaXMucGF1c2VkQ29uc3VtZXJNYXAuc2V0KGwse2xhc3RSZXBvcnRDYWxjdWxhdGVkOiEwfSl9aWYoYy5zc3JjPT09MTIzNClicmVhazt0aGlzLm92ZXJhbGxDb25zdW1lcnNTdGF0c01hcFtsXXx8KHRoaXMub3ZlcmFsbENvbnN1bWVyc1N0YXRzTWFwW2xdPXt0b3RhbFZpZGVvUGFja2V0c1JlY2VpdmVkOjAsdG90YWxBdWRpb1BhY2tldHNSZWNlaXZlZDowfSk7Y29uc3QgQj10aGlzLm92ZXJhbGxDb25zdW1lcnNTdGF0c01hcFtsXTtpZihbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLm1lZGlhVHlwZSl8fFsidmlkZW8iLCJhdWRpbyJdLmluY2x1ZGVzKGMua2luZCkpe2lmKCF0aGlzLmluYm91bmRDb25zdW1lck1hcC5oYXMobS5pZCkpe28uc3RhbGVDb25zdW1lclN0cmVhbU1hcD0hMDticmVha31vLmNvbnN1bWVyU3RyZWFtTWFwLmhhcyhsKXx8by5jb25zdW1lclN0cmVhbU1hcC5zZXQobCx7aW5ib3VuZFZpZGVvUnRwSWQ6W10saW5ib3VuZEF1ZGlvUnRwSWQ6W119KTtjb25zdCB4PXtieXRlc1JlY2VpdmVkOmMuYnl0ZXNSZWNlaXZlZCxwYWNrZXRzUmVjZWl2ZWQ6Yy5wYWNrZXRzUmVjZWl2ZWQscGFja2V0c0xvc3Q6Yy5wYWNrZXRzTG9zdD49MD9jLnBhY2tldHNMb3N0OjAsaml0dGVyOmMuaml0dGVyLG5hY2tDb3VudDpjLm5hY2tDb3VudCxqaXR0ZXJCdWZmZXJEZWxheTpjLmppdHRlckJ1ZmZlckRlbGF5LGppdHRlckJ1ZmZlckVtaXR0ZWRDb3VudDpjLmppdHRlckJ1ZmZlckVtaXR0ZWRDb3VudCxsYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXA6Yy5sYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXAsc3NyYzpjLnNzcmMsbWlkOmMubWlkLGNvZGVjSWQ6Yy5jb2RlY0lkLGhlYWRlckJ5dGVzUmVjZWl2ZWQ6Yy5oZWFkZXJCeXRlc1JlY2VpdmVkfHwwLHBhY2tldHNEaXNjYXJkZWQ6Yy5wYWNrZXRzRGlzY2FyZGVkfHwwLGppdHRlckJ1ZmZlck1pbmltdW1EZWxheTpjLmppdHRlckJ1ZmZlck1pbmltdW1EZWxheXx8MCxqaXR0ZXJCdWZmZXJUYXJnZXREZWxheTpjLmppdHRlckJ1ZmZlclRhcmdldERlbGF5fHwwfTtpZihjLm1lZGlhVHlwZT09PSJ2aWRlbyJ8fGMua2luZD09PSJ2aWRlbyIpe2NvbnN0IHk9YyxwPUcoe2ZyYW1lSGVpZ2h0OnkuZnJhbWVIZWlnaHQsZnJhbWVXaWR0aDp5LmZyYW1lV2lkdGgsZnJhbWVzRGVjb2RlZDp5LmZyYW1lc0RlY29kZWQsZnJhbWVzRHJvcHBlZDp5LmZyYW1lc0Ryb3BwZWQsZnJhbWVzUGVyU2Vjb25kOnkuZnJhbWVzUGVyU2Vjb25kLGZyYW1lc1JlY2VpdmVkOnkuZnJhbWVzUmVjZWl2ZWQsa2V5RnJhbWVzRGVjb2RlZDp5LmtleUZyYW1lc0RlY29kZWQsZmlyQ291bnQ6eS5maXJDb3VudCxkZWNvZGVySW1wbGVtZW50YXRpb246eS5kZWNvZGVySW1wbGVtZW50YXRpb24scGxpQ291bnQ6eS5wbGlDb3VudCx0b3RhbFByb2Nlc3NpbmdEZWxheTp5LnRvdGFsUHJvY2Vzc2luZ0RlbGF5LHFwU3VtOnkucXBTdW18fDAsdG90YWxBc3NlbWJseVRpbWU6eS50b3RhbEFzc2VtYmx5VGltZXx8MCx0b3RhbERlY29kZVRpbWU6eS50b3RhbERlY29kZVRpbWV8fDAsdG90YWxGcmVlemVzRHVyYXRpb246eS50b3RhbEZyZWV6ZXNEdXJhdGlvbnx8MCx0b3RhbEludGVyRnJhbWVEZWxheTp5LnRvdGFsSW50ZXJGcmFtZURlbGF5fHwwLHRvdGFsUGF1c2VzRHVyYXRpb246eS50b3RhbFBhdXNlc0R1cmF0aW9ufHwwLHRvdGFsU3F1YXJlZEludGVyRnJhbWVEZWxheTp5LnRvdGFsU3F1YXJlZEludGVyRnJhbWVEZWxheXx8MCxmcmVlemVDb3VudDp5LmZyZWV6ZUNvdW50fHwwLHBhdXNlQ291bnQ6eS5wYXVzZUNvdW50fHwwLHBvd2VyRWZmaWNpZW50RGVjb2Rlcjp5LnBvd2VyRWZmaWNpZW50RGVjb2Rlcn0seCk7cC5zY29yZT1zcih7ZnJhbWVXaWR0aDpwLmZyYW1lV2lkdGh8fDAsZnJhbWVzRGVjb2RlZDoocC5mcmFtZXNEZWNvZGVkfHwwKS0oKCgkPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6JC5mcmFtZXNEZWNvZGVkKXx8MCksZnJhbWVzUGVyU2Vjb25kOnAuZnJhbWVzUGVyU2Vjb25kfHwwLHBhY2tldHNMb3N0OihwLnBhY2tldHNMb3N0fHwwKS0oKChpZT10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldChsKSk9PW51bGw/dm9pZCAwOmllLnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihwLnBhY2tldHNSZWNlaXZlZHx8MCktKCgoYWU9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQobCkpPT1udWxsP3ZvaWQgMDphZS5wYWNrZXRzUmVjZWl2ZWQpfHwwKSxqaXR0ZXI6cC5qaXR0ZXJ8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlQ29uc3VtZXJzLmhhcyhsKX0pLFUuc2V0KGwse3Njb3JlOisocC5zY29yZSoxMCkudG9GaXhlZCgpLGZyYW1lV2lkdGg6cC5mcmFtZVdpZHRofHwwLGZyYW1lSGVpZ2h0OnAuZnJhbWVIZWlnaHR8fDAsZnJhbWVzUGVyU2Vjb25kOnAuZnJhbWVzUGVyU2Vjb25kfHwwLHBhY2tldHNMb3N0UGVyY2VudGFnZTpldCh7cGFja2V0c0xvc3Q6KHAucGFja2V0c0xvc3R8fDApLSgoKENlPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6Q2UucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KHAucGFja2V0c1JlY2VpdmVkfHwwKS0oKChJZT10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldChsKSk9PW51bGw/dm9pZCAwOkllLnBhY2tldHNSZWNlaXZlZCl8fDApfSksaml0dGVyOnAuaml0dGVyfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5oYXMobCksYml0cmF0ZTooKHAuYnl0ZXNSZWNlaXZlZHx8MCktKCgod2U9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQobCkpPT1udWxsP3ZvaWQgMDp3ZS5ieXRlc1JlY2VpdmVkKXx8MCkpKjgvN30pLHRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuc2V0KGwscCksby5pbmJvdW5kVmlkZW9SdHAuc2V0KG0uaWQscCksby5jb25zdW1lclN0cmVhbU1hcC5nZXQobCkuaW5ib3VuZFZpZGVvUnRwSWQucHVzaChtLmlkKSx0aGlzLnByb2Nlc3NJbmJvdW5kQ29uc3VtZXJWaWRlb1N0YXRzKGwsQixwKX1lbHNlIGlmKGMubWVkaWFUeXBlPT09ImF1ZGlvInx8Yy5raW5kPT09ImF1ZGlvIil7Y29uc3QgeT1jLHA9Ryh7YXVkaW9MZXZlbDp5LmF1ZGlvTGV2ZWwsY29uY2VhbGVkU2FtcGxlczp5LmNvbmNlYWxlZFNhbXBsZXMsY29uY2VhbG1lbnRFdmVudHM6eS5jb25jZWFsbWVudEV2ZW50cyx0b3RhbEF1ZGlvRW5lcmd5OnkudG90YWxBdWRpb0VuZXJneSx0b3RhbFNhbXBsZXNEdXJhdGlvbjp5LnRvdGFsU2FtcGxlc0R1cmF0aW9uLHRvdGFsU2FtcGxlc1JlY2VpdmVkOnkudG90YWxTYW1wbGVzUmVjZWl2ZWQsZmVjUGFja2V0c0Rpc2NhcmRlZDp5LmZlY1BhY2tldHNEaXNjYXJkZWR8fDAsZmVjUGFja2V0c1JlY2VpdmVkOnkuZmVjUGFja2V0c1JlY2VpdmVkfHwwLGluc2VydGVkU2FtcGxlc0ZvckRlY2VsZXJhdGlvbjp5Lmluc2VydGVkU2FtcGxlc0ZvckRlY2VsZXJhdGlvbnx8MCxyZW1vdmVkU2FtcGxlc0ZvckFjY2VsZXJhdGlvbjp5LnJlbW92ZWRTYW1wbGVzRm9yQWNjZWxlcmF0aW9ufHwwLHNpbGVudENvbmNlYWxlZFNhbXBsZXM6eS5zaWxlbnRDb25jZWFsZWRTYW1wbGVzfHwwLHBsYXlvdXRJZDp5LnBsYXlvdXRJZH0seCk7cC5zY29yZT1ycih7Y29uY2VhbG1lbnRFdmVudHM6KHAuY29uY2VhbG1lbnRFdmVudHN8fDApLSgoKGtlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6a2UuY29uY2VhbG1lbnRFdmVudHMpfHwwKSxwYWNrZXRzTG9zdDoocC5wYWNrZXRzTG9zdHx8MCktKCgoTWU9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQobCkpPT1udWxsP3ZvaWQgMDpNZS5wYWNrZXRzTG9zdCl8fDApLHBhY2tldHNSZWNlaXZlZDoocC5wYWNrZXRzUmVjZWl2ZWR8fDApLSgoKF9lPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6X2UucGFja2V0c1JlY2VpdmVkKXx8MCksaml0dGVyOnAuaml0dGVyfHwwfSksVS5zZXQobCx7c2NvcmU6KyhwLnNjb3JlKjEwKS50b0ZpeGVkKCkscGFja2V0c0xvc3RQZXJjZW50YWdlOmV0KHtwYWNrZXRzTG9zdDoocC5wYWNrZXRzTG9zdHx8MCktKCgoQWU9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQobCkpPT1udWxsP3ZvaWQgMDpBZS5wYWNrZXRzTG9zdCl8fDApLHBhY2tldHNSZWNlaXZlZDoocC5wYWNrZXRzUmVjZWl2ZWR8fDApLSgoKExlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6TGUucGFja2V0c1JlY2VpdmVkKXx8MCl9KSxqaXR0ZXI6cC5qaXR0ZXJ8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlQ29uc3VtZXJzLmhhcyhsKSxiaXRyYXRlOigocC5ieXRlc1JlY2VpdmVkfHwwKS0oKChPZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldChsKSk9PW51bGw/dm9pZCAwOk9lLmJ5dGVzUmVjZWl2ZWQpfHwwKSkqOC83fSksdGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5zZXQobCxwKSxvLmluYm91bmRBdWRpb1J0cC5zZXQobS5pZCxwKSxvLmNvbnN1bWVyU3RyZWFtTWFwLmdldChsKS5pbmJvdW5kQXVkaW9SdHBJZC5wdXNoKG0uaWQpLHRoaXMucHJvY2Vzc0luYm91bmRDb25zdW1lckF1ZGlvU3RhdHMobCxCLHApfX1lbHNlIHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmVycm9yKGBDYWxsc3RhdHM6IFVua25vd24gSW5ib3VuZC1ydHAuIG1lZGlhdHlwZTogJHtjLm1lZGlhVHlwZX0ga2luZDogJHtjLmtpbmR9YCk7YnJlYWt9fX1pZihvLnByb2R1Y2VyU3RyZWFtTWFwLmZvckVhY2goKG0sYyk9Pnt2YXIgbCx2LEIseCx5LHAsSCxEZSxOZSxWZSxCZSxGZSx4ZSxqZSxVZSxIZSxLZSxXZSx6ZSwkZSxHZSxxZSxZZTtpZihtLm91dGJvdW5kVmlkZW9SdHBJZC5sZW5ndGg+MCl7Y29uc3QgRD1bXTttLm91dGJvdW5kVmlkZW9SdHBJZC5mb3JFYWNoKE90PT57RC5wdXNoKG8ub3V0Ym91bmRWaWRlb1J0cC5nZXQoT3QpKX0pO2NvbnN0IGs9dGhpcy5nZXRXb3JraW5nU2ltdWxjYXN0VmlkZW9TdGF0cyhEKTtrLnNjb3JlPWVyKHtmcmFtZVdpZHRoOmsuZnJhbWVXaWR0aHx8MCxmcmFtZXNQZXJTZWNvbmQ6ay5mcmFtZXNQZXJTZWNvbmR8fDAsaml0dGVyOigobD1rLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpsLmppdHRlcil8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmhhcyhjKSxwYWNrZXRzU2VudDooay5wYWNrZXRzU2VudHx8MCktKCgodj10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnYucGFja2V0c1NlbnQpfHwwKSxwYWNrZXRzTG9zdDooKChCPWsucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOkIucGFja2V0c0xvc3QpfHwwKS0oKCh5PSh4PXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6eC5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6eS5wYWNrZXRzTG9zdCl8fDApLGZyYW1lc0VuY29kZWQ6KGsuZnJhbWVzRW5jb2RlZHx8MCktKCgocD10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnAuZnJhbWVzRW5jb2RlZCl8fDApfSksVi5zZXQoYyx7c2NvcmU6KyhrLnNjb3JlKjEwKS50b0ZpeGVkKCksZnJhbWVXaWR0aDprLmZyYW1lV2lkdGh8fDAsZnJhbWVIZWlnaHQ6ay5mcmFtZUhlaWdodHx8MCxmcmFtZXNQZXJTZWNvbmQ6ay5mcmFtZXNQZXJTZWNvbmR8fDAsaml0dGVyOigoSD1rLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpILmppdHRlcil8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmhhcyhjKSxwYWNrZXRzTG9zdFBlcmNlbnRhZ2U6WmUoe3BhY2tldHNTZW50OihrLnBhY2tldHNTZW50fHwwKS0oKChEZT10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOkRlLnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoTmU9ay5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6TmUucGFja2V0c0xvc3QpfHwwKS0oKChCZT0oVmU9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpWZS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6QmUucGFja2V0c0xvc3QpfHwwKX0pLGJpdHJhdGU6KChrLmJ5dGVzU2VudHx8MCktKCgoRmU9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpGZS5ieXRlc1NlbnQpfHwwKSkqOC83LGNwdUxpbWl0YXRpb25zOmsucXVhbGl0eUxpbWl0YXRpb25SZWFzb249PT0iY3B1IixiYW5kd2lkdGhMaW1pdGF0aW9uczprLnF1YWxpdHlMaW1pdGF0aW9uUmVhc29uPT09ImJhbmR3aWR0aCJ9KSx0aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLnNldChjLGspfWVsc2UgaWYobS5vdXRib3VuZEF1ZGlvUnRwSWQubGVuZ3RoPjApe2NvbnN0IEQ9by5vdXRib3VuZEF1ZGlvUnRwLmdldChtLm91dGJvdW5kQXVkaW9SdHBJZFswXSk7RC5zY29yZT1adCh7cGFja2V0c1NlbnQ6KEQucGFja2V0c1NlbnR8fDApLSgoKHhlPXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6eGUucGFja2V0c1NlbnQpfHwwKSxwYWNrZXRzTG9zdDooKChqZT1ELnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpqZS5wYWNrZXRzTG9zdCl8fDApLSgoKEhlPShVZT10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOlVlLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpIZS5wYWNrZXRzTG9zdCl8fDApLGppdHRlcjooKEtlPUQucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOktlLmppdHRlcil8fDB9KSxWLnNldChjLHtzY29yZTorKEQuc2NvcmUqMTApLnRvRml4ZWQoKSxiaXRyYXRlOigoRC5ieXRlc1NlbnR8fDApLSgoKFdlPXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6V2UuYnl0ZXNTZW50KXx8MCkpKjgvNyxwYWNrZXRzTG9zdFBlcmNlbnRhZ2U6WmUoe3BhY2tldHNTZW50OihELnBhY2tldHNTZW50fHwwKS0oKCh6ZT10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnplLnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoJGU9RC5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6JGUucGFja2V0c0xvc3QpfHwwKS0oKChxZT0oR2U9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpHZS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6cWUucGFja2V0c0xvc3QpfHwwKX0pLGppdHRlcjooKFllPUQucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOlllLmppdHRlcil8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmhhcyhjKX0pLHRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuc2V0KGMsRCl9fSksVC5mb3JFYWNoKG09Pntjb25zdCBjPWcuZmluZCh2PT52LmlkPT09bS5sb2NhbENhbmRpZGF0ZUlkPyhtLmxvY2FsQ2FuZGlkYXRlSWQ9di5pZCx2KTpudWxsKSxsPWIuZmluZCh2PT52LmlkPT09bS5yZW1vdGVDYW5kaWRhdGVJZD8obS5yZW1vdGVDYW5kaWRhdGVJZD12LmlkLHYpOm51bGwpO2MmJihtLmxvY2FsQ2FuZGlkYXRlVHlwZT1jLnR5cGUsbS5sb2NhbENhbmRpZGF0ZUFkZHJlc3M9dGUoYy5hZGRyZXNzKSxtLmxvY2FsQ2FuZGlkYXRlUG9ydD1jLnBvcnQsbS5sb2NhbENhbmRpZGF0ZVByb3RvY29sPWMucHJvdG9jb2wsbS5sb2NhbENhbmRpZGF0ZVVybD1jLnVybCxtLmxvY2FsQ2FuZGlkYXRlTmV0d29ya1R5cGU9Yy5uZXR3b3JrVHlwZSxtLmxvY2FsQ2FuZGlkYXRlUmVsYXRlZEFkZHJlc3M9dGUoYy5yZWxhdGVkQWRkcmVzcyksbS5sb2NhbENhbmRpZGF0ZVJlbGF0ZWRQb3J0PWMucmVsYXRlZFBvcnQpLGwmJihtLnJlbW90ZUNhbmRpZGF0ZVR5cGU9bC50eXBlLG0ucmVtb3RlQ2FuZGlkYXRlQWRkcmVzcz10ZShsLmFkZHJlc3MpLG0ucmVtb3RlQ2FuZGlkYXRlUG9ydD1sLnBvcnQsbS5yZW1vdGVDYW5kaWRhdGVQcm90b2NvbD1sLnByb3RvY29sLG0ucmVtb3RlQ2FuZGlkYXRlVXJsPWwudXJsKX0pLG8uY2FuZGlkYXRlUGFpciYmKG8udHJhbnNwb3J0PyhvLnRyYW5zcG9ydC50b3RhbFJvdW5kVHJpcFRpbWU9by5jYW5kaWRhdGVQYWlyLnRvdGFsUm91bmRUcmlwVGltZSxvLnRyYW5zcG9ydC5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGU9by5jYW5kaWRhdGVQYWlyLmF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZSxvLnRyYW5zcG9ydC5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGU9by5jYW5kaWRhdGVQYWlyLmF2YWlsYWJsZUluY29taW5nQml0cmF0ZSxvLnRyYW5zcG9ydC5yb3VuZFRyaXBUaW1lPW8uY2FuZGlkYXRlUGFpci5jdXJyZW50Um91bmRUcmlwVGltZSk6by50cmFuc3BvcnQ9e2J5dGVzUmVjZWl2ZWQ6by5jYW5kaWRhdGVQYWlyLmJ5dGVzUmVjZWl2ZWQsYnl0ZXNTZW50Om8uY2FuZGlkYXRlUGFpci5ieXRlc1NlbnQsdG90YWxSb3VuZFRyaXBUaW1lOm8uY2FuZGlkYXRlUGFpci50b3RhbFJvdW5kVHJpcFRpbWUsYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlOm8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGUsYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlOm8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUscm91bmRUcmlwVGltZTpvLmNhbmRpZGF0ZVBhaXIuY3VycmVudFJvdW5kVHJpcFRpbWV9KSxvLnRyYW5zcG9ydCYmKG8udHJhbnNwb3J0LmNhbmRpZGF0ZVBhaXJzPVQpLG8udHJhbnNwb3J0JiYhby50cmFuc3BvcnQucm91bmRUcmlwVGltZSl7bGV0IG09MCxjPTA7by5yZW1vdGVJbmJvdW5kUnRwLmZvckVhY2goKGwsdik9PntsLnJvdW5kVHJpcFRpbWUmJmwucm91bmRUcmlwVGltZT5tJiYobT1sLnJvdW5kVHJpcFRpbWUsYz1sLnRvdGFsUm91bmRUcmlwVGltZSl9KSxvLnRyYW5zcG9ydC5yb3VuZFRyaXBUaW1lPW0sby50cmFuc3BvcnQudG90YWxSb3VuZFRyaXBUaW1lPWN9aWYoVS5zaXplPjApdHJ5e3RoaXMub2JzZXJ2ZXIuZW1pdCgiY29uc3VtZXJfc2NvcmUiLFUpfWNhdGNoKG0pe31pZihWLnNpemU+MCl0cnl7dGhpcy5vYnNlcnZlci5lbWl0KCJwcm9kdWNlcl9zY29yZSIsVil9Y2F0Y2gobSl7fXJldHVybiBvfWdldFByb2R1Y2Vyc1JlcG9ydChlKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgcz1lLm1hcChuPT50aGlzLmdlbmVyYXRlUHJvZHVjZXJTdHJlYW1NYXAobiwhMCkpO3JldHVybiBzLmxlbmd0aD4wP1Byb21pc2UuYWxsKHMpOnZvaWQgMH0pfWdldENvbnN1bWVyc1JlcG9ydChlKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgcz1lLm1hcChuPT50aGlzLmdlbmVyYXRlQ29uc3VtZXJTdHJlYW1NYXAobiwhMCkpO3JldHVybiBzLmxlbmd0aD4wP1Byb21pc2UuYWxsKHMpOnZvaWQgMH0pfWdldFRyYW5zcG9ydFJlcG9ydChlKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7cmV0dXJuIGUuZ2V0U3RhdHMoKX0pfWdldFByb2Nlc3NlZFN0YXRzKGUscyxuKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3QgaT15aWVsZCB0aGlzLmdldFRyYW5zcG9ydFJlcG9ydChlKSxhPXtwcm9kdWNpbmc6bixjb25zdW1pbmc6cyxpZDplLmlkfSxkPWksbz10aGlzLnBhcnNlUlRDUmVwb3J0KGQsWyJ0cmFuc3BvcnQiLCJjYW5kaWRhdGUtcGFpciIsImluYm91bmQtcnRwIiwib3V0Ym91bmQtcnRwIiwicmVtb3RlLWluYm91bmQtcnRwIiwibG9jYWwtY2FuZGlkYXRlIiwicmVtb3RlLWNhbmRpZGF0ZSJdLCExLHZvaWQgMCxhKTtpZighbylyZXR1cm47Y29uc3QgaD17c3RhdHM6by50cmFuc3BvcnQsdHJhbnNwb3J0SWQ6ZS5pZCxjb25zdW1pbmc6cyxwcm9kdWNpbmc6bn0sZz1vLnN0YWxlUHJvZHVjZXJTdHJlYW1NYXA/dm9pZCAwOnRoaXMuZ2V0UHJvZHVjZXJTdGF0c0Zyb21SZXBvcnQobyksYj1vLnN0YWxlQ29uc3VtZXJTdHJlYW1NYXA/dm9pZCAwOnRoaXMuZ2V0Q29uc3VtZXJTdGF0c0Zyb21SZXBvcnQobyk7cmV0dXJue3RyYW5zcG9ydFJlcG9ydDpoLHByb2R1Y2VyUmVwb3J0OmcsY29uc3VtZXJSZXBvcnQ6Yn19KX1nZXRQcm9kdWNlclN0YXRzRnJvbVJlcG9ydChlKXtjb25zdCBzPVtdO3RyeXtlLnByb2R1Y2VyU3RyZWFtTWFwLmZvckVhY2goKG4saSk9Pnt2YXIgYSxkO3MucHVzaCh7cHJvZHVjZXJJZDppLHZpZGVvU3RhdHM6bi5vdXRib3VuZFZpZGVvUnRwSWQubWFwKG89PmUub3V0Ym91bmRWaWRlb1J0cC5nZXQobykpLGF1ZGlvU3RhdHM6bi5vdXRib3VuZEF1ZGlvUnRwSWQubWFwKG89PmUub3V0Ym91bmRBdWRpb1J0cC5nZXQobykpLGFwcERhdGE6KChkPShhPXRoaXMuY2FsbFN0YXRzSW5zdGFuY2UucHJvZHVjZXJzKT09bnVsbD92b2lkIDA6YS5nZXQoaSkpPT1udWxsP3ZvaWQgMDpkLmFwcERhdGEpfHxudWxsfSl9KX1jYXRjaChuKXt0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5lcnJvcigiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OmdldFByb2R1Y2VyU3RhdHNGcm9tUmVwb3J0Iix7ZXJyb3I6e3JlYXNvbjpuLnJlYXNvbixtZXNzYWdlOm4ubWVzc2FnZX19KX1yZXR1cm4gc31nZXRDb25zdW1lclN0YXRzRnJvbVJlcG9ydChlKXtjb25zdCBzPVtdO3RyeXtlLmNvbnN1bWVyU3RyZWFtTWFwLmZvckVhY2goKG4saSk9Pntjb25zdHtwZWVySWQ6YSxwcm9kdWNlcklkOmQsYXBwRGF0YTpvfT10aGlzLmNvbnN1bWVyUGVlcklkTWFwLmdldChpKTtzLnB1c2goe2NvbnN1bWVySWQ6aSxwZWVySWQ6YSxwcm9kdWNlcklkOmQsYXBwRGF0YTpvLHZpZGVvU3RhdHM6bi5pbmJvdW5kVmlkZW9SdHBJZC5tYXAoaD0+ZS5pbmJvdW5kVmlkZW9SdHAuZ2V0KGgpKSxhdWRpb1N0YXRzOm4uaW5ib3VuZEF1ZGlvUnRwSWQubWFwKGg9PmUuaW5ib3VuZEF1ZGlvUnRwLmdldChoKSl9KX0pfWNhdGNoKG4pe2NvbnNvbGUuZXJyb3IoImdldENvbnN1bWVyc1JlcG9ydDogIixuLGUpfXJldHVybiBzfWdldFVzZXJMb2NhdGlvbigpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXtyZXR1cm4gbmV3IFByb21pc2UoKGUscyk9Pnt0cnl7bmF2aWdhdG9yLmdlb2xvY2F0aW9uP25hdmlnYXRvci5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24obj0+e2Uobil9KTpzKCl9Y2F0Y2gobil7cyhuKX19KX0pfWdldENvbm5lY3Rpdml0eShlKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dHJ5e2NvbnN0IHM9e2ljZVNlcnZlcnM6ZXx8YXJ9LG49bmV3IFByb21pc2UoKGcsYik9Pnt0cnl7Y29uc3QgVD1uZXcgRXMocyk7VC5hZGRMaXN0ZW5lcigiZG9uZSIsZyksVC5hZGRMaXN0ZW5lcigiZmFpbGVkIiwoKT0+e2coe2Nvbm5lY3Rpdml0eTohMX0pfSksVC5zdGFydCgyZTMpfWNhdGNoKFQpe2IoVCl9fSksaT1uZXcgUHJvbWlzZSgoZyxiKT0+e3RyeXtjb25zdCBUPW5ldyBUcyhzKTtULmFkZExpc3RlbmVyKCJkb25lIixnKSxULmFkZExpc3RlbmVyKCJmYWlsZWQiLCgpPT57Zyh7Y29ubmVjdGl2aXR5OiExfSl9KSxULnN0YXJ0KDJlMyl9Y2F0Y2goVCl7YihUKX19KSxhPW5ldyBQcm9taXNlKChnLGIpPT57dHJ5e2NvbnN0IFQ9bmV3IFJzKHMpO1QuYWRkTGlzdGVuZXIoImRvbmUiLGcpLFQuYWRkTGlzdGVuZXIoImZhaWxlZCIsKCk9PntnKHtjb25uZWN0aXZpdHk6ITF9KX0pLFQuc3RhcnQoMmUzKX1jYXRjaChUKXtiKFQpfX0pLFtkLG8saF09eWllbGQgUHJvbWlzZS5hbGwoW24saSxhXSk7cmV0dXJue2hvc3Q6ZD09bnVsbD92b2lkIDA6ZC5jb25uZWN0aXZpdHkscmVsYXk6bz09bnVsbD92b2lkIDA6by5jb25uZWN0aXZpdHkscmVmbGV4aXZlOmg9PW51bGw/dm9pZCAwOmguY29ubmVjdGl2aXR5fX1jYXRjaChzKXtyZXR1cm57aG9zdDohMSxyZWxheTohMSxyZWZsZXhpdmU6ITF9fX0pfWdldFRocm91Z2hwdXQoZSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3RyeXtjb25zdCBuPXlpZWxkIG5ldyBQcm9taXNlKChpLGEpPT57dHJ5e2NvbnN0IGQ9e2ljZVNlcnZlcnM6ZXx8YXJ9LG89bmV3IGJzKGQpO28uYWRkTGlzdGVuZXIoImRvbmUiLGkpLG8uYWRkTGlzdGVuZXIoImZhaWxlZCIsYSksby5zdGFydCgxZTQpfWNhdGNoKGQpe2EoZCl9fSk7cmV0dXJue3Rocm91Z2hwdXQ6bi50aHJvdWdocHV0LGZyYWN0aW9uYWxMb3NzOjAsUlRUOm4uUlRULGppdHRlcjowLGJhY2tlbmRSVFQ6bi5iYWNrZW5kUlRUfX1jYXRjaChzKXtyZXR1cm59fSl9Z2V0SVBEZXRhaWxzKCl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3ZhciBlLHM7dHJ5e3JldHVybiB0aGlzLmlwRGV0YWlsc3x8KHRoaXMuaXBEZXRhaWxzPXlpZWxkIGlyLmdldElQRGV0YWlscyh7cGVlcklkOihlPXRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDplLnBlZXJJZCxhcGlIb3N0bmFtZXM6KHM9dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOnMuYXBpSG9zdG5hbWVzLGxvZ2dlcjp0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlcn0pKSx0aGlzLmlwRGV0YWlsc31jYXRjaChuKXtyZXR1cm59fSl9Z2V0TmV0d29ya1F1YWxpdHkoZSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0W3Msbl09eWllbGQgUHJvbWlzZS5hbGwoW3RoaXMuZ2V0Q29ubmVjdGl2aXR5KGUpLHRoaXMuZ2V0VGhyb3VnaHB1dChlKV0pO3JldHVybntjb25uZWN0aXZpdHk6cyx0aHJvdWdocHV0Om49PW51bGw/dm9pZCAwOm4udGhyb3VnaHB1dCxmcmFjdGlvbmFsTG9zczpuPT1udWxsP3ZvaWQgMDpuLmZyYWN0aW9uYWxMb3NzLFJUVDpuPT1udWxsP3ZvaWQgMDpuLlJUVCxqaXR0ZXI6bj09bnVsbD92b2lkIDA6bi5qaXR0ZXIsYmFja2VuZFJUVDpuPT1udWxsP3ZvaWQgMDpuLmJhY2tlbmRSVFR9fSl9Z2V0TmV0d29ya0luZm8oZSxzPSExKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIGQsbztpZihzKXtjb25zdCBoPXlpZWxkIHRoaXMuZ2V0SVBEZXRhaWxzKCk7cmV0dXJue2lwRGV0YWlsczpoLGVmZmVjdGl2ZU5ldHdvcmtUeXBlOihkPW5hdmlnYXRvci5jb25uZWN0aW9uKT09bnVsbD92b2lkIDA6ZC5lZmZlY3RpdmVUeXBlLGxvY2F0aW9uOmghPW51bGwmJmgubG9jP29yKGg9PW51bGw/dm9pZCAwOmgubG9jKTp2b2lkIDB9fWNvbnN0W24saSxhXT15aWVsZCBQcm9taXNlLmFsbChbdGhpcy5nZXRDb25uZWN0aXZpdHkoZSksdGhpcy5nZXRUaHJvdWdocHV0KGUpLHRoaXMuZ2V0SVBEZXRhaWxzKCldKTtyZXR1cm57aXBEZXRhaWxzOmEsZWZmZWN0aXZlTmV0d29ya1R5cGU6KG89bmF2aWdhdG9yLmNvbm5lY3Rpb24pPT1udWxsP3ZvaWQgMDpvLmVmZmVjdGl2ZVR5cGUsbG9jYXRpb246YSE9bnVsbCYmYS5sb2M/b3IoYT09bnVsbD92b2lkIDA6YS5sb2MpOnZvaWQgMCx0dXJuQ29ubmVjdGl2aXR5Om4/bi5ob3N0fHxuLnJlbGF5fHxuLnJlZmxleGl2ZTohMSxjb25uZWN0aXZpdHk6bix0aHJvdWdocHV0Omk9PW51bGw/dm9pZCAwOmkudGhyb3VnaHB1dCxmcmFjdGlvbmFsTG9zczppPT1udWxsP3ZvaWQgMDppLmZyYWN0aW9uYWxMb3NzLFJUVDppPT1udWxsP3ZvaWQgMDppLlJUVCxqaXR0ZXI6aT09bnVsbD92b2lkIDA6aS5qaXR0ZXIsYmFja2VuZFJUVDppPT1udWxsP3ZvaWQgMDppLmJhY2tlbmRSVFR9fSl9fWNsYXNzIENzIGV4dGVuZHMgZHJ7fWNsYXNzIGxyIGV4dGVuZHMgZHJ7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3UodGhpcywicHJvZHVjZXJNYXAiLG5ldyBNYXApO3UodGhpcywiY29uc3VtZXJNYXAiLG5ldyBNYXApfXJlZ2lzdGVyUHJvZHVjZXIoZSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3RoaXMucHJvZHVjZXJNYXAuc2V0KGUuaWQsZSkseWllbGQgdGhpcy5nZW5lcmF0ZVByb2R1Y2VyU3RyZWFtTWFwKGUpLGUub24oImNsb3NlIix0aGlzLmRlcmVnaXN0ZXJQcm9kdWNlci5iaW5kKHRoaXMsZSkpLGUub24oInBhdXNlIix0aGlzLnBhdXNlUHJvZHVjZXIuYmluZCh0aGlzLGUuaWQpKSxlLm9uKCJyZXN1bWUiLHRoaXMucmVzdW1lUHJvZHVjZXIuYmluZCh0aGlzLGUuaWQpKSxlLmFwcERhdGEuc2NyZWVuU2hhcmU9PT0hMCYmdGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5hZGQoZS5pZCl9KX1yZWdpc3RlckNvbnN1bWVyKGUpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXt0aGlzLmNvbnN1bWVyTWFwLnNldChlLmlkLGUpLHlpZWxkIHRoaXMuZ2VuZXJhdGVDb25zdW1lclN0cmVhbU1hcChlKSx0aGlzLmNvbnN1bWVyUGVlcklkTWFwLnNldChlLmlkLHtwcm9kdWNlcklkOmUucHJvZHVjZXJJZCxwZWVySWQ6ZS5hcHBEYXRhLnBlZXJJZCxhcHBEYXRhOmUuYXBwRGF0YX0pLGUub24oImNsb3NlIix0aGlzLmRlcmVnaXN0ZXJDb25zdW1lci5iaW5kKHRoaXMsZSkpLGUub24oInBhdXNlIix0aGlzLnBhdXNlQ29uc3VtZXIuYmluZCh0aGlzLGUuaWQpKSxlLm9uKCJyZXN1bWUiLHRoaXMucmVzdW1lQ29uc3VtZXIuYmluZCh0aGlzLGUuaWQpKSxlLmFwcERhdGEuc2NyZWVuU2hhcmU9PT0hMCYmdGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5hZGQoZS5pZCl9KX1nZW5lcmF0ZUNvbnN1bWVyU3RyZWFtTWFwKGUscz0hMSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IG49eWllbGQgZS5nZXRTdGF0cygpLGk9dGhpcy5wYXJzZVJUQ1JlcG9ydChuLFsiaW5ib3VuZC1ydHAiXSwhMSxlLmlkKSxhPVsuLi5pLmNvbnN1bWVyU3RyZWFtTWFwLnZhbHVlcygpXVswXSxkPXM/dGhpcy5nZXRDb25zdW1lclN0YXRzRnJvbVBhcnNlZENvbnN1bWVyU3RhdHMoaSxhLGUuaWQpOnZvaWQgMDtmb3IoY29uc3QgbyBvZiBuLnZhbHVlcygpKXN3aXRjaChvLnR5cGUpe2Nhc2UiaW5ib3VuZC1ydHAiOnt0aGlzLmluYm91bmRDb25zdW1lck1hcC5zZXQoby5pZCxlLmlkKTticmVha319cmV0dXJuIGR9KX1kZXJlZ2lzdGVyUHJvZHVjZXIoZSl7dGhpcy5wcm9kdWNlck1hcC5kZWxldGUoZS5pZCksdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmZvckVhY2goKHMsbik9PntzPT09ZS5pZCYmdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmRlbGV0ZShuKX0pLHRoaXMucGF1c2VkUHJvZHVjZXJNYXAuZGVsZXRlKGUuaWQpLHRoaXMuc2NyZWVuU2hhcmVQcm9kdWNlcnMuZGVsZXRlKGUuaWQpfWRlcmVnaXN0ZXJDb25zdW1lcihlKXt0aGlzLmNvbnN1bWVyTWFwLmRlbGV0ZShlLmlkKSx0aGlzLmluYm91bmRDb25zdW1lck1hcC5mb3JFYWNoKChzLG4pPT57cz09PWUuaWQmJnRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmRlbGV0ZShuKX0pLHRoaXMuY29uc3VtZXJQZWVySWRNYXAuZGVsZXRlKGUuaWQpLHRoaXMucGF1c2VkQ29uc3VtZXJNYXAuZGVsZXRlKGUuaWQpLHRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuZGVsZXRlKGUuaWQpfWdldEljZUNhbmRpZGF0ZVN0YXRzKGUpe3ZhciBzO3JldHVybntpZDplLmlkLHR5cGU6ZS5jYW5kaWRhdGVUeXBlfHxlLnR5cGUsYWRkcmVzczplLmFkZHJlc3MscG9ydDplLnBvcnQsdXJsOmUudXJsLHByb3RvY29sOihzPWUucmVsYXlQcm90b2NvbCkhPW51bGw/czplLnByb3RvY29sLG5ldHdvcmtUeXBlOmUubmV0d29ya1R5cGUscmVsYXRlZEFkZHJlc3M6ZS5yZWxhdGVkQWRkcmVzcyxyZWxhdGVkUG9ydDplLnJlbGF0ZWRQb3J0fX1wYXJzZVJUQ1JlcG9ydChlLHM9W10sbj0hMSxpPXZvaWQgMCxhPXZvaWQgMCl7dmFyIHEsJCxpZSxhZSxDZSxJZSx3ZSxrZSxNZSxfZSxBZSxMZSxPZTtjb25zdCBkPWUsbz1uZXcgY3IsaD1zLmxlbmd0aD9uZXcgU2V0KHMpOnZvaWQgMCxnPVtdLGI9W10sVD1bXSxWPW5ldyBNYXAsVT1uZXcgTWFwO2Zvcihjb25zdCBtIG9mIGQudmFsdWVzKCkpe2lmKGgpe2lmKGguc2l6ZT09PTApYnJlYWs7aWYoaC5oYXMobS50eXBlKSluJiZoLmRlbGV0ZShtLnR5cGUpO2Vsc2UgY29udGludWV9c3dpdGNoKG0udHlwZSl7Y2FzZSJsb2NhbC1jYW5kaWRhdGUiOntnLnB1c2godGhpcy5nZXRJY2VDYW5kaWRhdGVTdGF0cyhtKSk7YnJlYWt9Y2FzZSJyZW1vdGUtY2FuZGlkYXRlIjp7Yi5wdXNoKHRoaXMuZ2V0SWNlQ2FuZGlkYXRlU3RhdHMobSkpO2JyZWFrfWNhc2UiY2FuZGlkYXRlLXBhaXIiOntjb25zdHtub21pbmF0ZWQ6Y309bSx7c2VsZWN0ZWQ6bH09bSx2PW0sQj17bm9taW5hdGVkOmMhPW51bGw/YzpsLGN1cnJlbnRSb3VuZFRyaXBUaW1lOnYuY3VycmVudFJvdW5kVHJpcFRpbWUsdG90YWxSb3VuZFRyaXBUaW1lOnYudG90YWxSb3VuZFRyaXBUaW1lLGJ5dGVzUmVjZWl2ZWQ6di5ieXRlc1JlY2VpdmVkLGJ5dGVzU2VudDp2LmJ5dGVzU2VudCxhdmFpbGFibGVPdXRnb2luZ0JpdHJhdGU6di5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGUsYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlOnYuYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlLGxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcDp2Lmxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcCxsYXN0UGFja2V0U2VudFRpbWVzdGFtcDp2Lmxhc3RQYWNrZXRTZW50VGltZXN0YW1wLGxvY2FsQ2FuZGlkYXRlSWQ6di5sb2NhbENhbmRpZGF0ZUlkLHJlbW90ZUNhbmRpZGF0ZUlkOnYucmVtb3RlQ2FuZGlkYXRlSWQsYnl0ZXNEaXNjYXJkZWRPblNlbmQ6di5ieXRlc0Rpc2NhcmRlZE9uU2VuZCxwYWNrZXRzU2VudDp2LnBhY2tldHNTZW50LHBhY2tldHNSZWNlaXZlZDp2LnBhY2tldHNSZWNlaXZlZCxwYWNrZXRzRGlzY2FyZGVkT25TZW5kOnYucGFja2V0c0Rpc2NhcmRlZE9uU2VuZH07VC5wdXNoKEIpLChtLm5vbWluYXRlZD09PSEwfHxtLnNlbGVjdGVkPT09ITApJiYoby5jYW5kaWRhdGVQYWlyPUIpO2JyZWFrfWNhc2UidHJhbnNwb3J0Ijp7Y29uc3QgYz1tO2EmJihhLnByb2R1Y2luZyYmKHRoaXMub3ZlcmFsbFByb2R1Y2luZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXXx8KHRoaXMub3ZlcmFsbFByb2R1Y2luZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXT17dG90YWxQYWNrZXRzU2VudDowfSkpLGEuY29uc3VtaW5nJiYodGhpcy5vdmVyYWxsQ29uc3VtaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdfHwodGhpcy5vdmVyYWxsQ29uc3VtaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdPXt0b3RhbFBhY2tldHNSZWNlaXZlZDowfSkpKTtjb25zdCBsPXtieXRlc1JlY2VpdmVkOmMuYnl0ZXNSZWNlaXZlZCxieXRlc1NlbnQ6Yy5ieXRlc1NlbnQscGFja2V0c1NlbnQ6Yy5wYWNrZXRzU2VudCxwYWNrZXRzUmVjZWl2ZWQ6Yy5wYWNrZXRzUmVjZWl2ZWQsZHRsc0NpcGhlcjpjLmR0bHNDaXBoZXIsZHRsc1N0YXRlOmMuZHRsc1N0YXRlLGljZVJvbGU6Yy5pY2VSb2xlfTtpZihvLnRyYW5zcG9ydD1sLGEpe2lmKGEucHJvZHVjaW5nKXtjb25zdCB2PXRoaXMub3ZlcmFsbFByb2R1Y2luZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXTt0aGlzLnByb2Nlc3NQcm9kdWNpbmdUcmFuc3BvcnRTdGF0cyhhLmlkLHYsbCl9aWYoYS5jb25zdW1pbmcpe2NvbnN0IHY9dGhpcy5vdmVyYWxsQ29uc3VtaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdO3RoaXMucHJvY2Vzc0NvbnN1bWluZ1RyYW5zcG9ydFN0YXRzKGEuaWQsdixsKX19YnJlYWt9Y2FzZSJyZW1vdGUtaW5ib3VuZC1ydHAiOntjb25zdCBjPW0sbD17aml0dGVyOmMuaml0dGVyLGZyYWN0aW9uTG9zdDpjLmZyYWN0aW9uTG9zdCxyb3VuZFRyaXBUaW1lOmMucm91bmRUcmlwVGltZSxyb3VuZFRyaXBUaW1lTWVhc3VyZW1lbnRzOmMucm91bmRUcmlwVGltZU1lYXN1cmVtZW50cyx0b3RhbFJvdW5kVHJpcFRpbWU6Yy50b3RhbFJvdW5kVHJpcFRpbWUscGFja2V0c0xvc3Q6Yy5wYWNrZXRzTG9zdH07by5yZW1vdGVJbmJvdW5kUnRwLnNldChjLmxvY2FsSWQsbCk7YnJlYWt9Y2FzZSJvdXRib3VuZC1ydHAiOntpZighdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmhhcyhtLmlkKSlicmVhaztjb25zdCBjPW0sbD1pfHx0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuZ2V0KG0uaWQpLHY9dGhpcy5wYXVzZWRQcm9kdWNlck1hcC5nZXQobCk7aWYodil7aWYodi5sYXN0UmVwb3J0Q2FsY3VsYXRlZD09PSEwKWJyZWFrO3RoaXMucGF1c2VkUHJvZHVjZXJNYXAuc2V0KGwse2xhc3RSZXBvcnRDYWxjdWxhdGVkOiEwfSl9dGhpcy5vdmVyYWxsUHJvZHVjZXJzU3RhdHNNYXBbbF18fCh0aGlzLm92ZXJhbGxQcm9kdWNlcnNTdGF0c01hcFtsXT17dG90YWxWaWRlb1BhY2tldHNTZW50OjAsdG90YWxBdWRpb1BhY2tldHNTZW50OjB9KTtjb25zdCBCPXRoaXMub3ZlcmFsbFByb2R1Y2Vyc1N0YXRzTWFwW2xdO2lmKFsidmlkZW8iLCJhdWRpbyJdLmluY2x1ZGVzKGMubWVkaWFUeXBlKXx8WyJ2aWRlbyIsImF1ZGlvIl0uaW5jbHVkZXMoYy5raW5kKSl7aWYoIXRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5oYXMobS5pZCkpe28uc3RhbGVQcm9kdWNlclN0cmVhbU1hcD0hMDticmVha31jb25zdCB4PXRoaXMuY2FsbFN0YXRzSW5zdGFuY2UucHJvZHVjZXJzLmdldChsKTtpZigoKHE9eD09bnVsbD92b2lkIDA6eC50cmFjayk9PW51bGw/dm9pZCAwOnEucmVhZHlTdGF0ZSk9PT0iZW5kZWQiKWJyZWFrO28ucHJvZHVjZXJTdHJlYW1NYXAuaGFzKGwpfHxvLnByb2R1Y2VyU3RyZWFtTWFwLnNldChsLHtvdXRib3VuZFZpZGVvUnRwSWQ6W10sb3V0Ym91bmRBdWRpb1J0cElkOltdfSk7Y29uc3QgeT17Ynl0ZXNTZW50OmMuYnl0ZXNTZW50LHBhY2tldHNTZW50OmMucGFja2V0c1NlbnQsbmFja0NvdW50OmMubmFja0NvdW50LHNzcmM6Yy5zc3JjLG1pZDpjLm1pZCxhY3RpdmU6Yy5hY3RpdmUsY29kZWNJZDpjLmNvZGVjSWQsaGVhZGVyQnl0ZXNTZW50OmMuaGVhZGVyQnl0ZXNTZW50fHwwLHRvdGFsUGFja2V0U2VuZERlbGF5OmMudG90YWxQYWNrZXRTZW5kRGVsYXl8fDB9O2lmKGMubWVkaWFUeXBlPT09InZpZGVvInx8Yy5raW5kPT09InZpZGVvIil7Y29uc3QgcD1jLEg9Ryh7ZnJhbWVIZWlnaHQ6cC5mcmFtZUhlaWdodCxmcmFtZVdpZHRoOnAuZnJhbWVXaWR0aCxmcmFtZXNFbmNvZGVkOnAuZnJhbWVzRW5jb2RlZCxmcmFtZXNEcm9wcGVkOnAuZnJhbWVzRHJvcHBlZD9wLmZyYW1lc0Ryb3BwZWQ6cC5kcm9wcGVkRnJhbWVzLGZyYW1lc1BlclNlY29uZDpwLmZyYW1lc1BlclNlY29uZD9wLmZyYW1lc1BlclNlY29uZDpwLmZyYW1lcmF0ZU1lYW4sZnJhbWVzU2VudDpwLmZyYW1lc1NlbnQsa2V5RnJhbWVzRW5jb2RlZDpwLmtleUZyYW1lc0VuY29kZWQsZmlyQ291bnQ6cC5maXJDb3VudCxlbmNvZGVySW1wbGVtZW50YXRpb246cC5lbmNvZGVySW1wbGVtZW50YXRpb24saHVnZUZyYW1lc1NlbnQ6cC5odWdlRnJhbWVzU2VudCxwbGlDb3VudDpwLnBsaUNvdW50LHFwU3VtOnAucXBTdW0scXVhbGl0eUxpbWl0YXRpb25SZWFzb246cC5xdWFsaXR5TGltaXRhdGlvblJlYXNvbixxdWFsaXR5TGltaXRhdGlvbkR1cmF0aW9uczpwLnF1YWxpdHlMaW1pdGF0aW9uRHVyYXRpb25zLHF1YWxpdHlMaW1pdGF0aW9uUmVzb2x1dGlvbkNoYW5nZXM6cC5xdWFsaXR5TGltaXRhdGlvblJlc29sdXRpb25DaGFuZ2VzLHRvdGFsRW5jb2RlVGltZTpwLnRvdGFsRW5jb2RlVGltZSx0b3RhbFBhY2tldFNlbmREZWxheTpwLnRvdGFsRW5jb2RlVGltZSxyZXRyYW5zbWl0dGVkQnl0ZXNTZW50OnAucmV0cmFuc21pdHRlZEJ5dGVzU2VudCxyZXRyYW5zbWl0dGVkUGFja2V0c1NlbnQ6cC5yZXRyYW5zbWl0dGVkUGFja2V0c1NlbnQsc2NhbGFiaWxpdHlNb2RlOnAuc2NhbGFiaWxpdHlNb2RlLHBvd2VyRWZmaWNpZW50RW5jb2RlcjpwLnBvd2VyRWZmaWNpZW50RW5jb2Rlcn0seSk7by5vdXRib3VuZFZpZGVvUnRwLnNldChtLmlkLEgpLG8ucHJvZHVjZXJTdHJlYW1NYXAuZ2V0KGwpLm91dGJvdW5kVmlkZW9SdHBJZC5wdXNoKG0uaWQpLHRoaXMucHJvY2Vzc091dGJvdW5kUHJvZHVjZXJWaWRlb1N0YXRzKGwsQixIKX1lbHNlIGlmKGMubWVkaWFUeXBlPT09ImF1ZGlvInx8Yy5raW5kPT09ImF1ZGlvIil7Y29uc3QgcD1jLEg9Ryh7cmV0cmFuc21pdHRlZEJ5dGVzU2VudDpwLnJldHJhbnNtaXR0ZWRCeXRlc1NlbnQscmV0cmFuc21pdHRlZFBhY2tldHNTZW50OnAucmV0cmFuc21pdHRlZFBhY2tldHNTZW50fSx5KTtvLm91dGJvdW5kQXVkaW9SdHAuc2V0KG0uaWQsSCksby5wcm9kdWNlclN0cmVhbU1hcC5nZXQobCkub3V0Ym91bmRBdWRpb1J0cElkLnB1c2gobS5pZCksdGhpcy5wcm9jZXNzT3V0Ym91bmRQcm9kdWNlckF1ZGlvU3RhdHMobCxCLEgpfX1lbHNlIHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmVycm9yKGBDYWxsc3RhdHM6IFVua25vd24gT3V0Ym91bmQtcnRwLiBtZWRpYXR5cGU6ICR7Yy5tZWRpYVR5cGV9IGtpbmQ6ICR7Yy5raW5kfWApO2JyZWFrfWNhc2UiaW5ib3VuZC1ydHAiOntpZighdGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuaGFzKG0uaWQpKWJyZWFrO2NvbnN0IGM9bSxsPWl8fHRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmdldChtLmlkKSx2PXRoaXMucGF1c2VkQ29uc3VtZXJNYXAuZ2V0KGwpO2lmKHYpe2lmKHYubGFzdFJlcG9ydENhbGN1bGF0ZWQ9PT0hMClicmVhazt0aGlzLnBhdXNlZENvbnN1bWVyTWFwLnNldChsLHtsYXN0UmVwb3J0Q2FsY3VsYXRlZDohMH0pfWlmKGMuc3NyYz09PTEyMzQpYnJlYWs7dGhpcy5vdmVyYWxsQ29uc3VtZXJzU3RhdHNNYXBbbF18fCh0aGlzLm92ZXJhbGxDb25zdW1lcnNTdGF0c01hcFtsXT17dG90YWxWaWRlb1BhY2tldHNSZWNlaXZlZDowLHRvdGFsQXVkaW9QYWNrZXRzUmVjZWl2ZWQ6MH0pO2NvbnN0IEI9dGhpcy5vdmVyYWxsQ29uc3VtZXJzU3RhdHNNYXBbbF07aWYoWyJ2aWRlbyIsImF1ZGlvIl0uaW5jbHVkZXMoYy5tZWRpYVR5cGUpfHxbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLmtpbmQpKXtpZighdGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuaGFzKG0uaWQpKXtvLnN0YWxlQ29uc3VtZXJTdHJlYW1NYXA9ITA7YnJlYWt9by5jb25zdW1lclN0cmVhbU1hcC5oYXMobCl8fG8uY29uc3VtZXJTdHJlYW1NYXAuc2V0KGwse2luYm91bmRWaWRlb1J0cElkOltdLGluYm91bmRBdWRpb1J0cElkOltdfSk7Y29uc3QgeD17Ynl0ZXNSZWNlaXZlZDpjLmJ5dGVzUmVjZWl2ZWQscGFja2V0c1JlY2VpdmVkOmMucGFja2V0c1JlY2VpdmVkLHBhY2tldHNMb3N0OmMucGFja2V0c0xvc3Q+PTA/Yy5wYWNrZXRzTG9zdDowLGppdHRlcjpjLmppdHRlcixuYWNrQ291bnQ6Yy5uYWNrQ291bnQsaml0dGVyQnVmZmVyRGVsYXk6Yy5qaXR0ZXJCdWZmZXJEZWxheSxqaXR0ZXJCdWZmZXJFbWl0dGVkQ291bnQ6Yy5qaXR0ZXJCdWZmZXJFbWl0dGVkQ291bnQsbGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wOmMubGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wLHNzcmM6Yy5zc3JjLG1pZDpjLm1pZCxjb2RlY0lkOmMuY29kZWNJZCxoZWFkZXJCeXRlc1JlY2VpdmVkOmMuaGVhZGVyQnl0ZXNSZWNlaXZlZHx8MCxwYWNrZXRzRGlzY2FyZGVkOmMucGFja2V0c0Rpc2NhcmRlZHx8MCxqaXR0ZXJCdWZmZXJNaW5pbXVtRGVsYXk6Yy5qaXR0ZXJCdWZmZXJNaW5pbXVtRGVsYXl8fDAsaml0dGVyQnVmZmVyVGFyZ2V0RGVsYXk6Yy5qaXR0ZXJCdWZmZXJUYXJnZXREZWxheXx8MH07aWYoYy5tZWRpYVR5cGU9PT0idmlkZW8ifHxjLmtpbmQ9PT0idmlkZW8iKXtjb25zdCB5PWMscD1HKHtmcmFtZUhlaWdodDp5LmZyYW1lSGVpZ2h0LGZyYW1lV2lkdGg6eS5mcmFtZVdpZHRoLGZyYW1lc0RlY29kZWQ6eS5mcmFtZXNEZWNvZGVkLGZyYW1lc0Ryb3BwZWQ6eS5mcmFtZXNEcm9wcGVkP3kuZnJhbWVzRHJvcHBlZDp5LmRyb3BwZWRGcmFtZXMsZnJhbWVzUGVyU2Vjb25kOnkuZnJhbWVzUGVyU2Vjb25kP3kuZnJhbWVzUGVyU2Vjb25kOnkuZnJhbWVyYXRlTWVhbixmcmFtZXNSZWNlaXZlZDp5LmZyYW1lc1JlY2VpdmVkLGtleUZyYW1lc0RlY29kZWQ6eS5rZXlGcmFtZXNEZWNvZGVkLGZpckNvdW50OnkuZmlyQ291bnQsZGVjb2RlckltcGxlbWVudGF0aW9uOnkuZGVjb2RlckltcGxlbWVudGF0aW9uLHBsaUNvdW50OnkucGxpQ291bnQsdG90YWxQcm9jZXNzaW5nRGVsYXk6eS50b3RhbFByb2Nlc3NpbmdEZWxheSxxcFN1bTp5LnFwU3VtfHwwLHRvdGFsQXNzZW1ibHlUaW1lOnkudG90YWxBc3NlbWJseVRpbWV8fDAsdG90YWxEZWNvZGVUaW1lOnkudG90YWxEZWNvZGVUaW1lfHwwLHRvdGFsRnJlZXplc0R1cmF0aW9uOnkudG90YWxGcmVlemVzRHVyYXRpb258fDAsdG90YWxJbnRlckZyYW1lRGVsYXk6eS50b3RhbEludGVyRnJhbWVEZWxheXx8MCx0b3RhbFBhdXNlc0R1cmF0aW9uOnkudG90YWxQYXVzZXNEdXJhdGlvbnx8MCx0b3RhbFNxdWFyZWRJbnRlckZyYW1lRGVsYXk6eS50b3RhbFNxdWFyZWRJbnRlckZyYW1lRGVsYXl8fDAsZnJlZXplQ291bnQ6eS5mcmVlemVDb3VudHx8MCxwYXVzZUNvdW50OnkucGF1c2VDb3VudHx8MCxwb3dlckVmZmljaWVudERlY29kZXI6eS5wb3dlckVmZmljaWVudERlY29kZXJ9LHgpO3Auc2NvcmU9c3Ioe2ZyYW1lV2lkdGg6cC5mcmFtZVdpZHRofHwwLGZyYW1lc0RlY29kZWQ6KHAuZnJhbWVzRGVjb2RlZHx8MCktKCgoJD10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldChsKSk9PW51bGw/dm9pZCAwOiQuZnJhbWVzRGVjb2RlZCl8fDApLGZyYW1lc1BlclNlY29uZDpwLmZyYW1lc1BlclNlY29uZHx8MCxwYWNrZXRzTG9zdDoocC5wYWNrZXRzTG9zdHx8MCktKCgoaWU9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQobCkpPT1udWxsP3ZvaWQgMDppZS5wYWNrZXRzTG9zdCl8fDApLHBhY2tldHNSZWNlaXZlZDoocC5wYWNrZXRzUmVjZWl2ZWR8fDApLSgoKGFlPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6YWUucGFja2V0c1JlY2VpdmVkKXx8MCksaml0dGVyOnAuaml0dGVyfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5oYXMobCl9KSxVLnNldChsLHtzY29yZTorKHAuc2NvcmUqMTApLnRvRml4ZWQoKSxmcmFtZVdpZHRoOnAuZnJhbWVXaWR0aHx8MCxmcmFtZUhlaWdodDpwLmZyYW1lSGVpZ2h0fHwwLGZyYW1lc1BlclNlY29uZDpwLmZyYW1lc1BlclNlY29uZHx8MCxwYWNrZXRzTG9zdFBlcmNlbnRhZ2U6ZXQoe3BhY2tldHNMb3N0OihwLnBhY2tldHNMb3N0fHwwKS0oKChDZT10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldChsKSk9PW51bGw/dm9pZCAwOkNlLnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihwLnBhY2tldHNSZWNlaXZlZHx8MCktKCgoSWU9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQobCkpPT1udWxsP3ZvaWQgMDpJZS5wYWNrZXRzUmVjZWl2ZWQpfHwwKX0pLGppdHRlcjpwLmppdHRlcnx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuaGFzKGwpLGJpdHJhdGU6KChwLmJ5dGVzUmVjZWl2ZWR8fDApLSgoKHdlPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6d2UuYnl0ZXNSZWNlaXZlZCl8fDApKSo4Lzd9KSx0aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLnNldChsLHApLG8uaW5ib3VuZFZpZGVvUnRwLnNldChtLmlkLHApLG8uY29uc3VtZXJTdHJlYW1NYXAuZ2V0KGwpLmluYm91bmRWaWRlb1J0cElkLnB1c2gobS5pZCksdGhpcy5wcm9jZXNzSW5ib3VuZENvbnN1bWVyVmlkZW9TdGF0cyhsLEIscCl9ZWxzZSBpZihjLm1lZGlhVHlwZT09PSJhdWRpbyJ8fGMua2luZD09PSJhdWRpbyIpe2NvbnN0IHk9YyxwPUcoe2F1ZGlvTGV2ZWw6eS5hdWRpb0xldmVsLGNvbmNlYWxlZFNhbXBsZXM6eS5jb25jZWFsZWRTYW1wbGVzLGNvbmNlYWxtZW50RXZlbnRzOnkuY29uY2VhbG1lbnRFdmVudHMsdG90YWxBdWRpb0VuZXJneTp5LnRvdGFsQXVkaW9FbmVyZ3ksdG90YWxTYW1wbGVzRHVyYXRpb246eS50b3RhbFNhbXBsZXNEdXJhdGlvbix0b3RhbFNhbXBsZXNSZWNlaXZlZDp5LnRvdGFsU2FtcGxlc1JlY2VpdmVkLGZlY1BhY2tldHNEaXNjYXJkZWQ6eS5mZWNQYWNrZXRzRGlzY2FyZGVkfHwwLGZlY1BhY2tldHNSZWNlaXZlZDp5LmZlY1BhY2tldHNSZWNlaXZlZHx8MCxpbnNlcnRlZFNhbXBsZXNGb3JEZWNlbGVyYXRpb246eS5pbnNlcnRlZFNhbXBsZXNGb3JEZWNlbGVyYXRpb258fDAscmVtb3ZlZFNhbXBsZXNGb3JBY2NlbGVyYXRpb246eS5yZW1vdmVkU2FtcGxlc0ZvckFjY2VsZXJhdGlvbnx8MCxzaWxlbnRDb25jZWFsZWRTYW1wbGVzOnkuc2lsZW50Q29uY2VhbGVkU2FtcGxlc3x8MCxwbGF5b3V0SWQ6eS5wbGF5b3V0SWR9LHgpO3Auc2NvcmU9cnIoe2NvbmNlYWxtZW50RXZlbnRzOihwLmNvbmNlYWxtZW50RXZlbnRzfHwwKS0oKChrZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldChsKSk9PW51bGw/dm9pZCAwOmtlLmNvbmNlYWxtZW50RXZlbnRzKXx8MCkscGFja2V0c0xvc3Q6KHAucGFja2V0c0xvc3R8fDApLSgoKE1lPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6TWUucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KHAucGFja2V0c1JlY2VpdmVkfHwwKS0oKChfZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldChsKSk9PW51bGw/dm9pZCAwOl9lLnBhY2tldHNSZWNlaXZlZCl8fDApLGppdHRlcjpwLmppdHRlcnx8MH0pLFUuc2V0KGwse3Njb3JlOisocC5zY29yZSoxMCkudG9GaXhlZCgpLHBhY2tldHNMb3N0UGVyY2VudGFnZTpldCh7cGFja2V0c0xvc3Q6KHAucGFja2V0c0xvc3R8fDApLSgoKEFlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6QWUucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KHAucGFja2V0c1JlY2VpdmVkfHwwKS0oKChMZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldChsKSk9PW51bGw/dm9pZCAwOkxlLnBhY2tldHNSZWNlaXZlZCl8fDApfSksaml0dGVyOnAuaml0dGVyfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5oYXMobCksYml0cmF0ZTooKHAuYnl0ZXNSZWNlaXZlZHx8MCktKCgoT2U9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQobCkpPT1udWxsP3ZvaWQgMDpPZS5ieXRlc1JlY2VpdmVkKXx8MCkpKjgvN30pLHRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuc2V0KGwscCksby5pbmJvdW5kQXVkaW9SdHAuc2V0KG0uaWQscCksby5jb25zdW1lclN0cmVhbU1hcC5nZXQobCkuaW5ib3VuZEF1ZGlvUnRwSWQucHVzaChtLmlkKSx0aGlzLnByb2Nlc3NJbmJvdW5kQ29uc3VtZXJBdWRpb1N0YXRzKGwsQixwKX19ZWxzZSB0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5lcnJvcihgQ2FsbHN0YXRzOiBVbmtub3duIEluYm91bmQtcnRwLiBtZWRpYXR5cGU6ICR7Yy5tZWRpYVR5cGV9IGtpbmQ6ICR7Yy5raW5kfWApO2JyZWFrfX19aWYoby5wcm9kdWNlclN0cmVhbU1hcC5mb3JFYWNoKChtLGMpPT57dmFyIGwsdixCLHgseSxwLEgsRGUsTmUsVmUsQmUsRmUseGUsamUsVWUsSGUsS2UsV2UsemUsJGUsR2UscWUsWWU7aWYobS5vdXRib3VuZFZpZGVvUnRwSWQubGVuZ3RoPjApe2NvbnN0IEQ9W107bS5vdXRib3VuZFZpZGVvUnRwSWQuZm9yRWFjaChPdD0+e0QucHVzaChvLm91dGJvdW5kVmlkZW9SdHAuZ2V0KE90KSl9KTtjb25zdCBrPXRoaXMuZ2V0V29ya2luZ1NpbXVsY2FzdFZpZGVvU3RhdHMoRCk7ay5zY29yZT1lcih7ZnJhbWVXaWR0aDprLmZyYW1lV2lkdGh8fDAsZnJhbWVzUGVyU2Vjb25kOmsuZnJhbWVzUGVyU2Vjb25kfHwwLGppdHRlcjooKGw9ay5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6bC5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYykscGFja2V0c1NlbnQ6KGsucGFja2V0c1NlbnR8fDApLSgoKHY9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDp2LnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoQj1rLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpCLnBhY2tldHNMb3N0KXx8MCktKCgoeT0oeD10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOngucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnkucGFja2V0c0xvc3QpfHwwKSxmcmFtZXNFbmNvZGVkOihrLmZyYW1lc0VuY29kZWR8fDApLSgoKHA9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpwLmZyYW1lc0VuY29kZWQpfHwwKX0pLFYuc2V0KGMse3Njb3JlOisoay5zY29yZSoxMCkudG9GaXhlZCgpLGZyYW1lV2lkdGg6ay5mcmFtZVdpZHRofHwwLGZyYW1lSGVpZ2h0OmsuZnJhbWVIZWlnaHR8fDAsZnJhbWVzUGVyU2Vjb25kOmsuZnJhbWVzUGVyU2Vjb25kfHwwLGppdHRlcjooKEg9ay5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6SC5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYykscGFja2V0c0xvc3RQZXJjZW50YWdlOlplKHtwYWNrZXRzU2VudDooay5wYWNrZXRzU2VudHx8MCktKCgoRGU9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpEZS5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKE5lPWsucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOk5lLnBhY2tldHNMb3N0KXx8MCktKCgoQmU9KFZlPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6VmUucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOkJlLnBhY2tldHNMb3N0KXx8MCl9KSxiaXRyYXRlOigoay5ieXRlc1NlbnR8fDApLSgoKEZlPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6RmUuYnl0ZXNTZW50KXx8MCkpKjgvNyxjcHVMaW1pdGF0aW9uczprLnF1YWxpdHlMaW1pdGF0aW9uUmVhc29uPT09ImNwdSIsYmFuZHdpZHRoTGltaXRhdGlvbnM6ay5xdWFsaXR5TGltaXRhdGlvblJlYXNvbj09PSJiYW5kd2lkdGgifSksdGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5zZXQoYyxrKX1lbHNlIGlmKG0ub3V0Ym91bmRBdWRpb1J0cElkLmxlbmd0aD4wKXtjb25zdCBEPW8ub3V0Ym91bmRBdWRpb1J0cC5nZXQobS5vdXRib3VuZEF1ZGlvUnRwSWRbMF0pO0Quc2NvcmU9WnQoe3BhY2tldHNTZW50OihELnBhY2tldHNTZW50fHwwKS0oKCh4ZT10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnhlLnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoamU9RC5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6amUucGFja2V0c0xvc3QpfHwwKS0oKChIZT0oVWU9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpVZS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6SGUucGFja2V0c0xvc3QpfHwwKSxqaXR0ZXI6KChLZT1ELnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpLZS5qaXR0ZXIpfHwwfSksVi5zZXQoYyx7c2NvcmU6KyhELnNjb3JlKjEwKS50b0ZpeGVkKCksYml0cmF0ZTooKEQuYnl0ZXNTZW50fHwwKS0oKChXZT10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOldlLmJ5dGVzU2VudCl8fDApKSo4LzcscGFja2V0c0xvc3RQZXJjZW50YWdlOlplKHtwYWNrZXRzU2VudDooRC5wYWNrZXRzU2VudHx8MCktKCgoemU9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDp6ZS5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKCRlPUQucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOiRlLnBhY2tldHNMb3N0KXx8MCktKCgocWU9KEdlPXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6R2UucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnFlLnBhY2tldHNMb3N0KXx8MCl9KSxqaXR0ZXI6KChZZT1ELnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpZZS5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYyl9KSx0aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLnNldChjLEQpfX0pLFQuZm9yRWFjaChtPT57Y29uc3QgYz1nLmZpbmQodj0+di5pZD09PW0ubG9jYWxDYW5kaWRhdGVJZD8obS5sb2NhbENhbmRpZGF0ZUlkPXYuaWQsdik6bnVsbCksbD1iLmZpbmQodj0+di5pZD09PW0ucmVtb3RlQ2FuZGlkYXRlSWQ/KG0ucmVtb3RlQ2FuZGlkYXRlSWQ9di5pZCx2KTpudWxsKTtjJiYobS5sb2NhbENhbmRpZGF0ZVR5cGU9Yy50eXBlLG0ubG9jYWxDYW5kaWRhdGVBZGRyZXNzPXRlKGMuYWRkcmVzcyksbS5sb2NhbENhbmRpZGF0ZVBvcnQ9Yy5wb3J0LG0ubG9jYWxDYW5kaWRhdGVQcm90b2NvbD1jLnByb3RvY29sLG0ubG9jYWxDYW5kaWRhdGVVcmw9Yy51cmwsbS5sb2NhbENhbmRpZGF0ZU5ldHdvcmtUeXBlPWMubmV0d29ya1R5cGUsbS5sb2NhbENhbmRpZGF0ZVJlbGF0ZWRBZGRyZXNzPXRlKGMucmVsYXRlZEFkZHJlc3MpLG0ubG9jYWxDYW5kaWRhdGVSZWxhdGVkUG9ydD1jLnJlbGF0ZWRQb3J0KSxsJiYobS5yZW1vdGVDYW5kaWRhdGVUeXBlPWwudHlwZSxtLnJlbW90ZUNhbmRpZGF0ZUFkZHJlc3M9dGUobC5hZGRyZXNzKSxtLnJlbW90ZUNhbmRpZGF0ZVBvcnQ9bC5wb3J0LG0ucmVtb3RlQ2FuZGlkYXRlUHJvdG9jb2w9bC5wcm90b2NvbCxtLnJlbW90ZUNhbmRpZGF0ZVVybD1sLnVybCl9KSxvLmNhbmRpZGF0ZVBhaXImJihvLnRyYW5zcG9ydD8oby50cmFuc3BvcnQuYnl0ZXNSZWNlaXZlZD1vLmNhbmRpZGF0ZVBhaXIuYnl0ZXNSZWNlaXZlZCxvLnRyYW5zcG9ydC5ieXRlc1NlbnQ9by5jYW5kaWRhdGVQYWlyLmJ5dGVzU2VudCxvLnRyYW5zcG9ydC50b3RhbFJvdW5kVHJpcFRpbWU9by5jYW5kaWRhdGVQYWlyLnRvdGFsUm91bmRUcmlwVGltZSxvLnRyYW5zcG9ydC5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGU9by5jYW5kaWRhdGVQYWlyLmF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZSxvLnRyYW5zcG9ydC5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGU9by5jYW5kaWRhdGVQYWlyLmF2YWlsYWJsZUluY29taW5nQml0cmF0ZSxvLnRyYW5zcG9ydC5yb3VuZFRyaXBUaW1lPW8uY2FuZGlkYXRlUGFpci5jdXJyZW50Um91bmRUcmlwVGltZSk6by50cmFuc3BvcnQ9e2J5dGVzUmVjZWl2ZWQ6by5jYW5kaWRhdGVQYWlyLmJ5dGVzUmVjZWl2ZWQsYnl0ZXNTZW50Om8uY2FuZGlkYXRlUGFpci5ieXRlc1NlbnQsdG90YWxSb3VuZFRyaXBUaW1lOm8uY2FuZGlkYXRlUGFpci50b3RhbFJvdW5kVHJpcFRpbWUsYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlOm8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGUsYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlOm8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUscm91bmRUcmlwVGltZTpvLmNhbmRpZGF0ZVBhaXIuY3VycmVudFJvdW5kVHJpcFRpbWV9KSxvLnRyYW5zcG9ydCYmKG8udHJhbnNwb3J0LmNhbmRpZGF0ZVBhaXJzPVQpLG8udHJhbnNwb3J0JiYhby50cmFuc3BvcnQucm91bmRUcmlwVGltZSl7bGV0IG09MCxjPTA7by5yZW1vdGVJbmJvdW5kUnRwLmZvckVhY2goKGwsdik9PntsLnJvdW5kVHJpcFRpbWUmJmwucm91bmRUcmlwVGltZT5tJiYobT1sLnJvdW5kVHJpcFRpbWUsYz1sLnRvdGFsUm91bmRUcmlwVGltZSl9KSxvLnRyYW5zcG9ydC5yb3VuZFRyaXBUaW1lPW0sby50cmFuc3BvcnQudG90YWxSb3VuZFRyaXBUaW1lPWN9aWYoVS5zaXplPjApdHJ5e3RoaXMub2JzZXJ2ZXIuZW1pdCgiY29uc3VtZXJfc2NvcmUiLFUpfWNhdGNoKG0pe31pZihWLnNpemU+MCl0cnl7dGhpcy5vYnNlcnZlci5lbWl0KCJwcm9kdWNlcl9zY29yZSIsVil9Y2F0Y2gobSl7fXJldHVybiBvfWdldFByb2R1Y2VyU3RhdHNGcm9tUmVwb3J0KGUpe2NvbnN0IHM9W107dHJ5e2UucHJvZHVjZXJTdHJlYW1NYXAuZm9yRWFjaCgobixpKT0+e2NvbnN0IGE9dGhpcy5wcm9kdWNlck1hcC5nZXQoaSksZD1hLnRyYWNrLmdldFNldHRpbmdzKCksbz1uLm91dGJvdW5kVmlkZW9SdHBJZC5tYXAoZz0+e2NvbnN0IGI9ZS5vdXRib3VuZFZpZGVvUnRwLmdldChnKTtyZXR1cm4gYi5mcmFtZUhlaWdodHx8KGIuZnJhbWVIZWlnaHQ9ZC5oZWlnaHQsYi5mcmFtZVdpZHRoPWQud2lkdGgsYi5mcmFtZXNQZXJTZWNvbmQ9ZC5mcmFtZVJhdGUpLGJ9KSxoPXtwcm9kdWNlcklkOmksYXBwRGF0YTphLmFwcERhdGEsdmlkZW9TdGF0czpvLGF1ZGlvU3RhdHM6bi5vdXRib3VuZEF1ZGlvUnRwSWQubWFwKGc9PmUub3V0Ym91bmRBdWRpb1J0cC5nZXQoZykpfTtzLnB1c2goaCl9KX1jYXRjaChuKXtjb25zb2xlLmVycm9yKCJnZXRQcm9kdWNlcnNSZXBvcnQ6ICIsbixlKX1yZXR1cm4gc31nZXRDb25zdW1lclN0YXRzRnJvbVBhcnNlZENvbnN1bWVyU3RhdHMoZSxzLG4pe2xldCBpO3RyeXtjb25zdHtwZWVySWQ6YSxwcm9kdWNlcklkOmQsYXBwRGF0YTpvfT10aGlzLmNvbnN1bWVyUGVlcklkTWFwLmdldChuKSxoPXM9PW51bGw/dm9pZCAwOnMuaW5ib3VuZFZpZGVvUnRwSWQubWFwKGc9Pntjb25zdCBUPXRoaXMuY29uc3VtZXJNYXAuZ2V0KG4pLnRyYWNrLmdldFNldHRpbmdzKCksVj1lLmluYm91bmRWaWRlb1J0cC5nZXQoZyk7cmV0dXJuIFYuZnJhbWVIZWlnaHR8fChWLmZyYW1lSGVpZ2h0PVQuaGVpZ2h0LFYuZnJhbWVXaWR0aD1ULndpZHRoLFYuZnJhbWVzUGVyU2Vjb25kPVQuZnJhbWVSYXRlKSxWfSk7aT17Y29uc3VtZXJJZDpuLHBlZXJJZDphLHByb2R1Y2VySWQ6ZCxhcHBEYXRhOm8sdmlkZW9TdGF0czpoLGF1ZGlvU3RhdHM6cz09bnVsbD92b2lkIDA6cy5pbmJvdW5kQXVkaW9SdHBJZC5tYXAoZz0+ZS5pbmJvdW5kQXVkaW9SdHAuZ2V0KGcpKX19Y2F0Y2goYSl7Y29uc29sZS5lcnJvcigiZ2V0Q29uc3VtZXJTdGF0c0Zyb21QYXJzZWRDb25zdW1lclN0YXRzOiAiLGEsZSl9cmV0dXJuIGl9Z2V0Q29uc3VtZXJTdGF0c0Zyb21SZXBvcnQoZSl7Y29uc3Qgcz1bXTt0cnl7ZS5jb25zdW1lclN0cmVhbU1hcC5mb3JFYWNoKChuLGkpPT57cy5wdXNoKHRoaXMuZ2V0Q29uc3VtZXJTdGF0c0Zyb21QYXJzZWRDb25zdW1lclN0YXRzKGUsbixpKSl9KX1jYXRjaChuKXtjb25zb2xlLmVycm9yKCJnZXRDb25zdW1lclN0YXRzRnJvbVJlcG9ydDogIixuLGUpfXJldHVybiBzfX1jbGFzcyBJcyBleHRlbmRzIGxye31mdW5jdGlvbiBudChyLHQsZSxzKXtpZihyIT1udWxsJiZyLmxvZ2dlciYmci5sb2dnZXIuZXJyb3IoIkNhbGxzdGF0czo6aGFuZGxlRXJyb3IiLHtlcnJvcjpzfSksdHlwZW9mIGU9PSJmdW5jdGlvbiImJnMgaW5zdGFuY2VvZiB0KWUuY2FsbChudWxsLHMscik7ZWxzZSB0aHJvdyBzfWZ1bmN0aW9uIHVyKHIsdCxlKXtjb25zdCBzPXIudmFsdWU7cmV0dXJuIHIudmFsdWU9ZnVuY3Rpb24oLi4ubil7dHJ5e2NvbnN0IGk9cy5hcHBseSh0aGlzLG4pO3JldHVybiBpJiZpIGluc3RhbmNlb2YgUHJvbWlzZT9pLmNhdGNoKGE9PntudCh0aGlzLHQsZSxhKX0pOml9Y2F0Y2goaSl7bnQodGhpcyx0LGUsaSl9cmV0dXJuIG51bGx9LHJ9Y29uc3QgST0ocix0KT0+KGUscyxuKT0+e2NvbnN0IGk9bi52YWx1ZTtyZXR1cm4gbi52YWx1ZT1mdW5jdGlvbiguLi5hKXt0cnl7Y29uc3QgZD1pLmFwcGx5KHRoaXMsYSk7cmV0dXJuIGQmJmQgaW5zdGFuY2VvZiBQcm9taXNlP2QuY2F0Y2gobz0+e250KHRoaXMscix0LG8pfSk6ZH1jYXRjaChkKXtudCh0aGlzLHIsdCxkKX1yZXR1cm4gbnVsbH0sbn0sd3M9KHIsdCk9PihlLHMsbik9PntpZihuKXJldHVybiB1cihuLHIsdCk7Zm9yKGNvbnN0IGkgb2YgUmVmbGVjdC5vd25LZXlzKGUucHJvdG90eXBlKS5maWx0ZXIoYT0+YSE9PSJjb25zdHJ1Y3RvciIpKXtjb25zdCBhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZS5wcm90b3R5cGUsaSk7YS52YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsaSx1cihhLHIsdCkpfX07dmFyIFA9ZnVuY3Rpb24ocix0LGUscyl7dmFyIG49YXJndW1lbnRzLmxlbmd0aCxpPW48Mz90OnM9PT1udWxsP3M9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGUpOnMsYTtpZih0eXBlb2YgUmVmbGVjdD09Im9iamVjdCImJnR5cGVvZiBSZWZsZWN0LmRlY29yYXRlPT0iZnVuY3Rpb24iKWk9UmVmbGVjdC5kZWNvcmF0ZShyLHQsZSxzKTtlbHNlIGZvcih2YXIgZD1yLmxlbmd0aC0xO2Q+PTA7ZC0tKShhPXJbZF0pJiYoaT0objwzP2EoaSk6bj4zP2EodCxlLGkpOmEodCxlKSl8fGkpO3JldHVybiBuPjMmJmkmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUsaSksaX07Y29uc3QgQz1jb25zb2xlO2xldCBFPWNsYXNzIGV4dGVuZHMgV3tjb25zdHJ1Y3RvcihlPSJodHRwczovL2FwaS50ZXN0aW5ndjMuZHl0ZS5pbiIscz0iQmxpbmsiLG49enQuUFJPRCxpLGEsZCxvLGgpe3N1cGVyKCk7dSh0aGlzLCJvYnNlcnZlciIpO3UodGhpcywiZXZlbnRIYW5kbGVyIik7dSh0aGlzLCJtZWFzdXJlbWVudHMiKTt1KHRoaXMsInByb2R1Y2luZ1RyYW5zcG9ydCIpO3UodGhpcywiY29uc3VtaW5nVHJhbnNwb3J0Iik7dSh0aGlzLCJwcm9kdWNlcnMiLG5ldyBNYXApO3UodGhpcywiY29uc3VtZXJzIixuZXcgTWFwKTt1KHRoaXMsImljZVNlcnZlcnMiKTt1KHRoaXMsImNvbm5lY3Rpb25JbmZvUHJvbWlzZSIpO3UodGhpcywicGluZ1N0YXRzVGltZW91dCIpO3UodGhpcywibG9nZ2VyIik7dSh0aGlzLCJlbnYiKTt1KHRoaXMsImFwaUhvc3RuYW1lcyIpO3UodGhpcywicGVlcklkIik7dSh0aGlzLCJjb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwIixuZXcgTWFwKTt1KHRoaXMsImN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMiLHt9KTtpZighaCl0aHJvdyBFcnJvcigiYXV0aFRva2VuIGlzIG1pc3NpbmcgYnV0IHJlcXVpcmVkIHRvIGluaXRpYWxpemUgQ2FsbFN0YXRzISIpO3N3aXRjaCh0aGlzLmVudj1uLHRoaXMuYXBpSG9zdG5hbWVzPW8sdGhpcy5sb2dnZXI9YSx0aGlzLnBlZXJJZD1kLHRoaXMuZXZlbnRIYW5kbGVyPW5ldyB1cyh7bG9nZ2VyOmEscGVlcklkOmQsYXBpSG9zdG5hbWVzOm8sYXV0aFRva2VuOmh9KSx0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjplbmdpbmVOYW1lOiAiLHtlbmdpbmVOYW1lOnN9KSxzKXtjYXNlIkJsaW5rIjp0aGlzLm1lYXN1cmVtZW50cz1uZXcgQ3M7YnJlYWs7Y2FzZSJHZWNrbyI6dGhpcy5tZWFzdXJlbWVudHM9bmV3IGxyO2JyZWFrO2Nhc2UiV2ViS2l0Ijp0aGlzLm1lYXN1cmVtZW50cz1uZXcgSXM7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihgVW5rbm93biBlbmdpbmVOYW1lISAke3N9YCl9dGhpcy5tZWFzdXJlbWVudHMuY2FsbFN0YXRzSW5zdGFuY2U9dGhpcyx0aGlzLnJlZ2lzdGVyUHJvZHVjZXI9dGhpcy5yZWdpc3RlclByb2R1Y2VyLmJpbmQodGhpcyksdGhpcy5yZWdpc3RlckNvbnN1bWVyPXRoaXMucmVnaXN0ZXJDb25zdW1lci5iaW5kKHRoaXMpLHRoaXMub2JzZXJ2ZXI9bmV3IFcsdGhpcy5tZWFzdXJlbWVudHMub2JzZXJ2ZXIub24oImNvbnN1bWVyX3Njb3JlIixnPT57YS5kZWJ1ZyhgY2FsbFN0YXRzOjpjb25zdW1lcl9zY29yZSAke1suLi5nLmVudHJpZXMoKV19YCksdGhpcy5ldmVudEhhbmRsZXIuZW1pdCgiY29uc3VtZXJfc2NvcmUiLGcpfSksdGhpcy5tZWFzdXJlbWVudHMub2JzZXJ2ZXIub24oInByb2R1Y2VyX3Njb3JlIixnPT57YS5kZWJ1ZyhgY2FsbFN0YXRzOjpwcm9kdWNlcl9zY29yZSAke1suLi5nLmVudHJpZXMoKV19YCksdGhpcy5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfc2NvcmUiLGcpfSl9cmVnaXN0ZXJJY2VTZXJ2ZXJzKGUpe3RoaXMuaWNlU2VydmVycz1lfXJlZ2lzdGVyQ29uc3VtZXIoZSl7dmFyIHM7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLmhhcyhlLmlkKXx8dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLmlkLHt9KSx0aGlzLmNvbnN1bWVycy5zZXQoZS5pZCxlKSx0aGlzLm1lYXN1cmVtZW50cy5yZWdpc3RlckNvbnN1bWVyKGUpLHRoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnJlZ2lzdGVyQ29uc3VtZXIiLHtjb25zdW1lcklkOmUuaWQsY29uc3VtZXJraW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChzPWUuYXBwRGF0YSkhPW51bGwmJnMuc2NyZWVuU2hhcmUpfSksZS5vbigiY2xvc2UiLHRoaXMuZGVSZWdpc3RlckNvbnN1bWVyLmJpbmQodGhpcyxlKSl9cmVnaXN0ZXJQcm9kdWNlcihlKXt2YXIgczt0aGlzLnByb2R1Y2Vycy5zZXQoZS5pZCxlKSx0aGlzLm1lYXN1cmVtZW50cy5yZWdpc3RlclByb2R1Y2VyKGUpLHRoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnJlZ2lzdGVyUHJvZHVjZXIiLHtwcm9kdWNlcklkOmUuaWQscHJvZHVjZXJLaW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChzPWUuYXBwRGF0YSkhPW51bGwmJnMuc2NyZWVuU2hhcmUpfSksZS5vbigiY2xvc2UiLHRoaXMuZGVSZWdpc3RlclByb2R1Y2VyLmJpbmQodGhpcyxlKSl9c2VuZENvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZUV2ZW50KGUscyl7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLmhhcyhlKXx8dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLHt9KTtjb25zdCBuPXRoaXMuY29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlc01hcC5nZXQoZSk7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLE9iamVjdC5hc3NpZ24obixzKSl9cmVnaXN0ZXJQcm9kdWNpbmdUcmFuc3BvcnQoZSl7dmFyIG47dGhpcy5wcm9kdWNpbmdUcmFuc3BvcnQ9ZSxlLm9uKCJjbG9zZSIsdGhpcy5kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0LmJpbmQodGhpcyxlKSksZS5vbigiZGlzY29ubmVjdCIsdGhpcy5kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0LmJpbmQodGhpcyxlKSksQXJyYXkuZnJvbSgoKG49ZS5fcHJvZHVjZXJzKT09bnVsbD92b2lkIDA6bi52YWx1ZXMoKSl8fFtdKS5mb3JFYWNoKGk9Pnt0aGlzLnJlZ2lzdGVyUHJvZHVjZXIoaSl9KSxlLm9uKCJuZXdwcm9kdWNlciIsdGhpcy5yZWdpc3RlclByb2R1Y2VyKX1yZWdpc3RlckNvbnN1bWluZ1RyYW5zcG9ydChlKXt2YXIgbjt0aGlzLmNvbnN1bWluZ1RyYW5zcG9ydD1lLGUub24oImNsb3NlIix0aGlzLmRpc2Nvbm5lY3RDb25zdW1pbmdUcmFuc3BvcnQuYmluZCh0aGlzLGUpKSxlLm9uKCJkaXNjb25uZWN0Iix0aGlzLmRpc2Nvbm5lY3RDb25zdW1pbmdUcmFuc3BvcnQuYmluZCh0aGlzLGUpKSxBcnJheS5mcm9tKCgobj1lLl9jb25zdW1lcnMpPT1udWxsP3ZvaWQgMDpuLnZhbHVlcygpKXx8W10pLmZvckVhY2goaT0+e3RoaXMucmVnaXN0ZXJDb25zdW1lcihpKX0pLGUub24oIm5ld2NvbnN1bWVyIix0aGlzLnJlZ2lzdGVyQ29uc3VtZXIpfWRlUmVnaXN0ZXJDb25zdW1lcihlKXt0aGlzLmNvbnN1bWVycy5kZWxldGUoZS5pZCl9ZGVSZWdpc3RlclByb2R1Y2VyKGUpe3ZhciBzO3RoaXMucHJvZHVjZXJzLmRlbGV0ZShlLmlkKSx0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpkZVJlZ2lzdGVyUHJvZHVjZXIiLHtwcm9kdWNlcklkOmUuaWQscHJvZHVjZXJLaW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChzPWUuYXBwRGF0YSkhPW51bGwmJnMuc2NyZWVuU2hhcmUpfSl9ZGlzY29ubmVjdENvbnN1bWluZ1RyYW5zcG9ydCgpe3RoaXMuY29uc3VtaW5nVHJhbnNwb3J0PXZvaWQgMH1kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0KCl7dGhpcy5wcm9kdWNpbmdUcmFuc3BvcnQ9dm9pZCAwfWNhbGxFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoZSl9c2VuZFByZUNhbGxUZXN0QmVnaW5FdmVudChlPSExLHMpe3RoaXMuY29ubmVjdGlvbkluZm9Qcm9taXNlPXRoaXMubWVhc3VyZW1lbnRzLmdldE5ldHdvcmtJbmZvKHRoaXMuaWNlU2VydmVycyxlKSx0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuUFJFQ0FMTF9URVNUX0JFR0lOLHRpbWVzdGFtcDpzfSksdGhpcy5jb25uZWN0aW9uSW5mb1Byb21pc2UmJnRoaXMuY29ubmVjdGlvbkluZm9Qcm9taXNlLnRoZW4obj0+e3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5QUkVDQUxMX1RFU1RfQ09NUExFVEUsbWV0YURhdGE6e2Nvbm5lY3Rpb25JbmZvOm59LHRpbWVzdGFtcDpzfSl9KX1zZW5kU2NyZWVuU2hhcmVUb2dnbGVFdmVudChlLHM9bnVsbCxuKXt0aGlzLmN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMuc2NyZWVuPWUsdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDplP1MuU0NSRUVOU0hBUkVfU1RBUlRFRDpTLlNDUkVFTlNIQVJFX1NUT1BQRUQsbWV0YURhdGE6e3NzcmM6c30sdGltZXN0YW1wOm59KX1zZW5kU2NyZWVuU2hhcmVSZXF1ZXN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuU0NSRUVOU0hBUkVfU1RBUlRfUkVRVUVTVEVELHRpbWVzdGFtcDplfSl9c2VuZEFjdGl2ZVNwZWFrZXJFdmVudChlLHMpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5ET01JTkFOVF9TUEVBS0VSLG1ldGFEYXRhOntwZWVySWQ6ZX0sdGltZXN0YW1wOnN9KX1kZXZpY2VzKGUscyxuKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OmU9PT1ZLkFVRElPJiZTLkFVRElPX0RFVklDRVNfVVBEQVRFU3x8ZT09PVkuVklERU8mJlMuVklERU9fREVWSUNFU19VUERBVEVTfHxlPT09WS5TUEVBS0VSJiZTLlNQRUFLRVJfREVWSUNFU19VUERBVEVTLG1ldGFEYXRhOntkZXZpY2VMaXN0OnN9LHRpbWVzdGFtcDpufSl9c2VsZWN0ZWREZXZpY2UoZSxzLG4pe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6ZT09PVkuQVVESU8mJlMuU0VMRUNURURfTUlDUk9IUE9ORV9VUERBVEV8fGU9PT1ZLlZJREVPJiZTLlNFTEVDVEVEX0NBTUVSQV9VUERBVEV8fGU9PT1ZLlNQRUFLRVImJlMuU0VMRUNURURfU1BFQUtFUl9VUERBVEUsbWV0YURhdGE6e2RldmljZTpzfSx0aW1lc3RhbXA6bn0pfW1lZGlhUGVybWlzc2lvbihlLHMsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLk1FRElBX1BFUk1JU1NJT04sbWV0YURhdGE6e2RldmljZVR5cGU6ZSxwZXJtaXNzaW9uOnN9LHRpbWVzdGFtcDpufSl9bWVkaWFQbGF5YmFja0ZhaWxlZChlLHMpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6ZT09PVkuQVVESU8mJlMuQVVESU9fUExBWV9GQUlMRUR8fGU9PT1ZLlZJREVPJiZTLlZJREVPX1BMQVlfRkFJTEVELG1ldGFEYXRhOntkZXZpY2VUeXBlOmV9LHRpbWVzdGFtcDpzfSl9bWVkaWFUcmFja011dGVkKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDplPT09WS5BVURJTyYmUy5BVURJT19UUkFDS19NVVRFRHx8ZT09PVkuVklERU8mJlMuVklERU9fVFJBQ0tfTVVURUQsbWV0YURhdGE6e2RldmljZVR5cGU6ZX0sdGltZXN0YW1wOnN9KX10YWJDaGFuZ2VkKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlRBQl9DSEFOR0UsbWV0YURhdGE6e2lzTWVldGluZ3NUYWJBY3RpdmU6ZX0sdGltZXN0YW1wOnN9KX1icm93c2VyQmFja2dyb3VuZGVkKGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5CUk9XU0VSX0JBQ0tHUk9VTkRFRCx0aW1lc3RhbXA6ZX0pfWJyb3dzZXJGb3JlZ3JvdW5kZWQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkJST1dTRVJfRk9SRUdST1VOREVELHRpbWVzdGFtcDplfSl9bGVnYWN5U3dpdGNoKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkxFR0FDWV9TV0lUQ0gsbWV0YWRhdGE6e29uOmV9LHRpbWVzdGFtcDpzfSl9Z2V0UHJlQ2FsbFRlc3RSZXN1bHRzKCl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLmNvbm5lY3Rpb25JbmZvUHJvbWlzZX0pfXNlbmRDYWxsSm9pbkJlZ2luRXZlbnQoZSxzKXtlPVFlKEcoe30sZSkse21lZXRpbmdFbnY6dGhpcy5lbnZ9KSxlLmRldmljZUluZm89UWUoRyh7fSxlLmRldmljZUluZm8pLHt1c2VyQWdlbnQ6bmF2aWdhdG9yLnVzZXJBZ2VudCxjcHVzOm5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5LG1lbW9yeTpuYXZpZ2F0b3IuZGV2aWNlTWVtb3J5fSksdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkNBTExfSk9JTl9CRUdJTixtZXRhRGF0YTp7cGVlck1ldGFEYXRhOmV9LHRpbWVzdGFtcDpzfSl9c2VuZE5ldHdvcmtRdWFsaXR5VGVzdEJlZ2luRXZlbnQoZSxzKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuTkVUX1FVQUxJVFlfVEVTVF9CRUdJTix0aW1lc3RhbXA6c30pLG5ldyBQcm9taXNlKChpLGEpPT53KHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBkPVtdO3RyeXtmb3IoY29uc3QgbyBvZiBlKXRyeXtpZihvLmljZVNlcnZlcnMmJm8uaWNlU2VydmVycy5sZW5ndGg+MCl7Y29uc3QgaD15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXROZXR3b3JrUXVhbGl0eShvLmljZVNlcnZlcnMpO2QucHVzaChRZShHKHt9LG8pLHtuZXR3b3JrUmVzdWx0czpofSkpfX1jYXRjaChoKXtjb25zb2xlLndhcm4oIkVycm9yIGhhbmRsaW5nICIsaCl9aSh7cmVnaW9uRGF0YTpkfSl9Y2F0Y2gobyl7Y29uc29sZS53YXJuKCJFcnJvciBpbiBjYWxsc3RhdHMsICIsbyksYShvKX19KSkudGhlbihpPT57dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLk5FVF9RVUFMSVRZX1RFU1RfRU5ELHRpbWVzdGFtcDpzLG1ldGFEYXRhOml9KX0pfXNlbmRXZWJTb2NrZXRDb25uZWN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuV0VCU09DS0VUX0NPTk5FQ1RFRCx0aW1lc3RhbXA6ZX0pfXNlbmRUcmFuc3BvcnRDb25uZWN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuVFJBTlNQT1JUX0NPTk5FQ1RFRCx0aW1lc3RhbXA6ZX0pfXNlbmRBdWRpb1RvZ2dsZUV2ZW50KGUscyl7dGhpcy5jdXJyZW50VXNlck1lZGlhU3RhdGVzLmF1ZGlvPWU7bGV0IG47ZT9uPVMuQVVESU9fT046bj1TLkFVRElPX09GRix0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50Om4sdGltZXN0YW1wOnN9KX1zZW5kVmlkZW9Ub2dnbGVFdmVudChlLHMpe3RoaXMuY3VycmVudFVzZXJNZWRpYVN0YXRlcy52aWRlbz1lO2xldCBuO2U/bj1TLlZJREVPX09OOm49Uy5WSURFT19PRkYsdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpuLHRpbWVzdGFtcDpzfSl9c2VuZFBhcnRpY2lwYW50Um9sZVRvZ2dsZUV2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlBBUlRJQ0lQQU5UX1JPTEUsdGltZXN0YW1wOnMsbWV0YURhdGE6ZX0pfXN0YXJ0UGluZ1N0YXRzKGU9N2UzKXt0aGlzLnNlbmRQaW5nU3RhdHNFdmVudCghMSxuZXcgRGF0ZSksdGhpcy5waW5nU3RhdHNUaW1lb3V0PXNldEludGVydmFsKHRoaXMuc2VuZFBpbmdTdGF0c0V2ZW50LmJpbmQodGhpcyksZSl9c3RvcFBpbmdTdGF0cygpe2NsZWFySW50ZXJ2YWwodGhpcy5waW5nU3RhdHNUaW1lb3V0KX1zZW5kUGluZ1N0YXRzRXZlbnQoZT0hMCxzKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIGQsbztsZXQgbixpO2lmKHRoaXMucHJvZHVjaW5nVHJhbnNwb3J0JiYobj15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXRQcm9jZXNzZWRTdGF0cyh0aGlzLnByb2R1Y2luZ1RyYW5zcG9ydCwhMSwhMCksIW58fCEoKGQ9bj09bnVsbD92b2lkIDA6bi5wcm9kdWNlclJlcG9ydCkhPW51bGwmJmQubGVuZ3RoKSkpe3RoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnNlbmRQaW5nU3RhdHNFdmVudDo6c3RhbGVQcm9kdWNpbmdUcmFuc3BvcnQiLHtkaXNjbGFpbWVyOiJTdGFsZSBwcm9kdWNlcj8gUmVnZW5lcmF0aW5nIFN0cmVhbSBNYXBzISJ9KTtjb25zdCBoPXlpZWxkIHRoaXMubWVhc3VyZW1lbnRzLmdldFByb2R1Y2Vyc1JlcG9ydChbLi4udGhpcy5wcm9kdWNlcnMudmFsdWVzKCldKTtuJiZoP24ucHJvZHVjZXJSZXBvcnQ9aDoobj15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXRQcm9jZXNzZWRTdGF0cyh0aGlzLnByb2R1Y2luZ1RyYW5zcG9ydCwhMSwhMCksKCFufHwhKG4hPW51bGwmJm4ucHJvZHVjZXJSZXBvcnQpKSYmdGhpcy5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6c2VuZFBpbmdTdGF0c0V2ZW50Ojpub1Byb2R1Y2luZ1RyYW5zcG9ydFJlcG9ydCIse2Rpc2NsYWltZXI6IlN0cmVhbSBtYXBzIGludmFsaWQgZGVzcGl0ZSByZWdlbmVyYXRpbmchIn0pKX1pZih0aGlzLmNvbnN1bWluZ1RyYW5zcG9ydCYmKGk9eWllbGQgdGhpcy5tZWFzdXJlbWVudHMuZ2V0UHJvY2Vzc2VkU3RhdHModGhpcy5jb25zdW1pbmdUcmFuc3BvcnQsITAsITEpLCFpfHwhKChvPWkuY29uc3VtZXJSZXBvcnQpIT1udWxsJiZvLmxlbmd0aCkpKXt0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpzZW5kUGluZ1N0YXRzRXZlbnQ6OnN0YWxlQ29uc3VtaW5nVHJhbnNwb3J0Iix7ZGlzY2xhaW1lcjoiU3RhbGUgY29uc3VtZXI/IFJlZ2VuZXJhdGluZyBTdHJlYW0gTWFwcyEifSk7Y29uc3QgaD15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXRDb25zdW1lcnNSZXBvcnQoWy4uLnRoaXMuY29uc3VtZXJzLnZhbHVlcygpXSk7aSYmaD9pLmNvbnN1bWVyUmVwb3J0PWg6KGk9eWllbGQgdGhpcy5tZWFzdXJlbWVudHMuZ2V0UHJvY2Vzc2VkU3RhdHModGhpcy5jb25zdW1pbmdUcmFuc3BvcnQsITAsITEpLCghaXx8IWkuY29uc3VtZXJSZXBvcnQpJiZ0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpzZW5kUGluZ1N0YXRzRXZlbnQ6Om5vQ29uc3VtaW5nVHJhbnNwb3J0UmVwb3J0Iix7ZGlzY2xhaW1lcjoiU3RyZWFtIG1hcHMgaW52YWxpZCBkZXNwaXRlIHJlZ2VuZXJhdGluZyEifSkpfWNvbnN0IGE9e3Byb2R1Y2luZ1RyYW5zcG9ydFN0YXRzOm4/bj09bnVsbD92b2lkIDA6bi50cmFuc3BvcnRSZXBvcnQ6dm9pZCAwLGNvbnN1bWluZ1RyYW5zcG9ydFN0YXRzOmk/aT09bnVsbD92b2lkIDA6aS50cmFuc3BvcnRSZXBvcnQ6dm9pZCAwLHByb2R1Y2VyU3RhdHM6W10uY29uY2F0KChuPT1udWxsP3ZvaWQgMDpuLnByb2R1Y2VyUmVwb3J0KXx8W10pLmNvbmNhdCgoaT09bnVsbD92b2lkIDA6aS5wcm9kdWNlclJlcG9ydCl8fFtdKSxjb25zdW1lclN0YXRzOltdLmNvbmNhdCgoaT09bnVsbD92b2lkIDA6aS5jb25zdW1lclJlcG9ydCl8fFtdKS5jb25jYXQoKG49PW51bGw/dm9pZCAwOm4uY29uc3VtZXJSZXBvcnQpfHxbXSl9O2lmKGUmJmEucHJvZHVjZXJTdGF0cy5sZW5ndGg9PT0wJiZhLmNvbnN1bWVyU3RhdHMubGVuZ3RoPT09MCl7eWllbGQgdGhpcy5ldmVudEhhbmRsZXIuZmx1c2goKTtyZXR1cm59dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlBJTkdfU1RBVCxtZXRhRGF0YTphLHRpbWVzdGFtcDpzfSl9KX1zZW5kSVZTUGxheWVyUmVidWZmZXJFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9SRUJVRkZFUklORyx0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJBdWRpb0Jsb2NrRXZlbnQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfQVVESU9fQkxPQ0tFRCx0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJQbGF5YmFja0Jsb2NrZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9QTEFZQkFDS19CTE9DS0VELHRpbWVzdGFtcDplfSl9c2VuZElWU1BsYXllck5ldHdvcmtVbmF2YWlsYWJsZUV2ZW50KGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5JVlNfUExBWUVSX05FVFdPUktfVU5BVkFJTEFCTEUsdGltZXN0YW1wOmV9KX1zZW5kSVZTUGxheWVySW5pdGlhbGl6ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9JTklUSUFMSVpFRCx0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJXb3JrZXJFcnJvckV2ZW50KGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5JVlNfUExBWUVSX1dPUktFUl9FUlJPUix0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJFcnJvckV2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfRVJST1IsdGltZXN0YW1wOnMsbWV0YURhdGE6ZX0pfXNlbmRJVlNQbGF5ZXJSZWNvdmVyYWJsZUVycm9yRXZlbnQoZSxzKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9SRUNPVkVSQUJMRV9FUlJPUix0aW1lc3RhbXA6cyxtZXRhRGF0YTplfSl9c2VuZElWU1BsYXllckFuYWx5dGljc0V2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfQU5BTFlUSUNTX0VWRU5ULHRpbWVzdGFtcDpzLG1ldGFEYXRhOmV9KX1zZW5kSVZTUGxheWVyUGxheWJhY2tSYXRlQ2hhbmdlZEV2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfUExBWUJBQ0tfUkFURV9DSEFOR0VELHRpbWVzdGFtcDpzLG1ldGFEYXRhOnt1cGRhdGVkUGxheWJhY2tSYXRlOmV9fSl9c2VuZElWU1BsYXllclF1YWxpdHlDaGFuZ2VkKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfUVVBTElUWV9DSEFOR0VELHRpbWVzdGFtcDpzLG1ldGFEYXRhOmV9KX1zZW5kUGxheWVyTGl2ZUxhdGVuY3koZSxzKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuTElWRVNUUkVBTV9MQVRFTkNZLHRpbWVzdGFtcDpzLG1ldGFEYXRhOntsYXRlbmN5OmV9fSl9c2VuZERpc2Nvbm5lY3RFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuRElTQ09OTkVDVCx0aW1lc3RhbXA6ZX0pfXNlbmRSZWNvbm5lY3RFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuUkVDT05ORUNUX0FUVEVNUFQsdGltZXN0YW1wOmV9KX1leHBlY3RlZFZpZGVvUmVzb2x1dGlvbihlLHMsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkVYUEVDVEVEX1ZJREVPX1JFU09MVVRJT04sdGltZXN0YW1wOm4sbWV0YURhdGE6e2ZyYW1lV2lkdGg6ZSxmcmFtZUhlaWdodDpzfX0pfWV4cGVjdGVkU2NyZWVuc2hhcmVSZXNvbHV0aW9uKGUscyxuKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuRVhQRUNURURfU0NSRUVOU0hBUkVfUkVTT0xVVElPTix0aW1lc3RhbXA6bixtZXRhRGF0YTp7ZnJhbWVXaWR0aDplLGZyYW1lSGVpZ2h0OnN9fSl9fTtQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInJlZ2lzdGVySWNlU2VydmVycyIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJyZWdpc3RlckNvbnN1bWVyIixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInJlZ2lzdGVyUHJvZHVjZXIiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZENvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZUV2ZW50IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInJlZ2lzdGVyUHJvZHVjaW5nVHJhbnNwb3J0IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInJlZ2lzdGVyQ29uc3VtaW5nVHJhbnNwb3J0IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsImRlUmVnaXN0ZXJDb25zdW1lciIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJkZVJlZ2lzdGVyUHJvZHVjZXIiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwiZGlzY29ubmVjdENvbnN1bWluZ1RyYW5zcG9ydCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJkaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRQcmVDYWxsVGVzdEJlZ2luRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZFNjcmVlblNoYXJlVG9nZ2xlRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZFNjcmVlblNoYXJlUmVxdWVzdGVkRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZEFjdGl2ZVNwZWFrZXJFdmVudCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJkZXZpY2VzIixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbGVjdGVkRGV2aWNlIixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsIm1lZGlhUGVybWlzc2lvbiIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJtZWRpYVBsYXliYWNrRmFpbGVkIixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsIm1lZGlhVHJhY2tNdXRlZCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJ0YWJDaGFuZ2VkIixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsImJyb3dzZXJCYWNrZ3JvdW5kZWQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwiYnJvd3NlckZvcmVncm91bmRlZCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJsZWdhY3lTd2l0Y2giLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwiZ2V0UHJlQ2FsbFRlc3RSZXN1bHRzIixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRDYWxsSm9pbkJlZ2luRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZE5ldHdvcmtRdWFsaXR5VGVzdEJlZ2luRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZFdlYlNvY2tldENvbm5lY3RlZEV2ZW50IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRUcmFuc3BvcnRDb25uZWN0ZWRFdmVudCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJzZW5kQXVkaW9Ub2dnbGVFdmVudCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJzZW5kVmlkZW9Ub2dnbGVFdmVudCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJzZW5kUGFydGljaXBhbnRSb2xlVG9nZ2xlRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic3RhcnRQaW5nU3RhdHMiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic3RvcFBpbmdTdGF0cyIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJzZW5kUGluZ1N0YXRzRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZElWU1BsYXllclJlYnVmZmVyRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZElWU1BsYXllckF1ZGlvQmxvY2tFdmVudCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJzZW5kSVZTUGxheWVyUGxheWJhY2tCbG9ja2VkRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZElWU1BsYXllck5ldHdvcmtVbmF2YWlsYWJsZUV2ZW50IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJJbml0aWFsaXplZEV2ZW50IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJXb3JrZXJFcnJvckV2ZW50IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJFcnJvckV2ZW50IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJSZWNvdmVyYWJsZUVycm9yRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZElWU1BsYXllckFuYWx5dGljc0V2ZW50IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJQbGF5YmFja1JhdGVDaGFuZ2VkRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZElWU1BsYXllclF1YWxpdHlDaGFuZ2VkIixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRQbGF5ZXJMaXZlTGF0ZW5jeSIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJzZW5kRGlzY29ubmVjdEV2ZW50IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRSZWNvbm5lY3RFdmVudCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJleHBlY3RlZFZpZGVvUmVzb2x1dGlvbiIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJleHBlY3RlZFNjcmVlbnNoYXJlUmVzb2x1dGlvbiIsbnVsbCksRT1QKFt3cyhUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUpO3ZhciBrcz1FO2NsYXNzIHByIGV4dGVuZHMgV3tjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7dSh0aGlzLCJzdGF0cyIpO3UodGhpcywicGVlcklkIik7dSh0aGlzLCJiYWNrZW5kIik7dSh0aGlzLCJpY2VTZXJ2ZXJzIik7dSh0aGlzLCJpbml0aWFsaXplZCIsITEpO3UodGhpcywic3RhbGxlZCIsITEpO3UodGhpcywiaXBJbmZvcm1hdGlvbiIpO3UodGhpcywibG9nZ2VyIil9aW5pdGlhbGl6ZShUKXtyZXR1cm4gdyh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbiooe3BlZXJJZDplLGVuZ2luZU5hbWU6cyxlbnY6bj16dC5QUk9ELGljZVNlcnZlcnM6aSxhcGlCYXNlOmE9Imh0dHBzOi8vYXBpLmNsdXN0ZXIuZHl0ZS5pbiIsZmxhZ3M6ZCxsb2dnZXI6bz1jb25zb2xlLGFwaUhvc3RuYW1lczpoLHNraXBDb25uZWN0aXZpdHlDaGVja3M6Zz0hMSxhdXRoVG9rZW46Yn0pe3ZhciBWLFUscTt0cnl7aWYodGhpcy5wZWVySWQ9ZSx0aGlzLmxvZ2dlcj1vLCFiKXt0aGlzLmxvZ2dlci5lcnJvcigiY2FsbFN0YXRzOjppbml0aWFsaXplIix7ZXZlbnQ6ImF1dGhfdG9rZW5fbWlzc2luZyIscGVlcklkOnRoaXMucGVlcklkfSksdGhpcy5zdGFsbENhbGxTdGF0cygpO3JldHVybn10aGlzLmlwSW5mb3JtYXRpb249eWllbGQgaXIuZ2V0SVBEZXRhaWxzKHtwZWVySWQ6ZSxhcGlIb3N0bmFtZXM6aCxsb2dnZXI6b30pLHRoaXMuYmFja2VuZD1uZXcga3MoYSxzLG4sZCxvLGUsaCxiKSx0aGlzLmljZVNlcnZlcnM9aSwoVj10aGlzLmJhY2tlbmQpPT1udWxsfHxWLnJlZ2lzdGVySWNlU2VydmVycyh0aGlzLmljZVNlcnZlcnMpLHRoaXMuaW5pdGlhbGl6ZWQ9ITAsKHE9KFU9dGhpcy5iYWNrZW5kKT09bnVsbD92b2lkIDA6VS5ldmVudEhhbmRsZXIpPT1udWxsfHxxLmVtaXQoImluaXRpYWxpemVkIix0aGlzLmlwSW5mb3JtYXRpb24pLHRoaXMuZW1pdCgiaW5pdGlhbGl6ZWQiLHRoaXMuaXBJbmZvcm1hdGlvbiksdGhpcy5zdGFydFByZUNhbGxUZXN0KGcpfWNhdGNoKCQpe3RoaXMubG9nZ2VyLmVycm9yKCJjYWxsU3RhdHM6OkNhbGxTdGF0c0ludGVncmF0aW9uIix7cGVlcklkOnRoaXMucGVlcklkLGVycm9yOiQgaW5zdGFuY2VvZiBFcnJvcj8kLm1lc3NhZ2U6U3RyaW5nKCQpLHN0YWNrOiQgaW5zdGFuY2VvZiBFcnJvcj8kLnN0YWNrOnZvaWQgMH0pLHRoaXMuc3RhbGxDYWxsU3RhdHMoKX19KX1jb25maWd1cmVTZW5kVHJhbnNwb3J0KGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLnJlZ2lzdGVyUHJvZHVjaW5nVHJhbnNwb3J0KGUpfSl9Y29uZmlndXJlUmVjdlRyYW5zcG9ydChlKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5yZWdpc3RlckNvbnN1bWluZ1RyYW5zcG9ydChlKX0pfWNhbmRpZGF0ZVJlZ2lvbmFsTmV0d29ya1F1YWxpdHlUZXN0KGUpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjt0cnl7KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kTmV0d29ya1F1YWxpdHlUZXN0QmVnaW5FdmVudChlLHMpfWNhdGNoKGkpe3RoaXMubG9nZ2VyLmVycm9yKCJjYWxsU3RhdHM6OnNlbmROZXR3b3JrUXVhbGl0eVRlc3RCZWdpbkV2ZW50Iix7ZXJyb3I6e3JlYXNvbjppLnJlYXNvbn19KX19KX0pfXJvb21Kb2luZWQoZSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuLGk7KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kQ2FsbEpvaW5CZWdpbkV2ZW50KGUscyksdGhpcy5iYWNrZW5kLChpPXRoaXMuYmFja2VuZCk9PW51bGx8fGkuc3RhcnRQaW5nU3RhdHMoKX0pfSl9YXVkaW9PZmYoKXtjb25zdCBlPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLnNlbmRBdWRpb1RvZ2dsZUV2ZW50KCExLGUpfSl9YXVkaW9Pbigpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuc2VuZEF1ZGlvVG9nZ2xlRXZlbnQoITAsZSl9KX12aWRlb09mZigpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuc2VuZFZpZGVvVG9nZ2xlRXZlbnQoITEsZSl9KX12aWRlb09uKCl7Y29uc3QgZT1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5zZW5kVmlkZW9Ub2dnbGVFdmVudCghMCxlKX0pfWNhbGxFbmRlZCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzLG47KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5zdG9wUGluZ1N0YXRzKCksKG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kRGlzY29ubmVjdEV2ZW50KGUpfSl9c2NyZWVuU2hhcmVTdGFydChlKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmRTY3JlZW5TaGFyZVRvZ2dsZUV2ZW50KCEwLGUscyl9KX1jb25zdW1lclNoYXJlZE1lZGlhU3RhdGUoZSxzKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kQ29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlRXZlbnQoZSxzKX0pfXNjcmVlblNoYXJlU3RvcChlKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmRTY3JlZW5TaGFyZVRvZ2dsZUV2ZW50KCExLGUscyl9KX1zY3JlZW5TaGFyZVJlcXVlc3RlZCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuc2VuZFNjcmVlblNoYXJlUmVxdWVzdGVkRXZlbnQoZSl9KX1hY3RpdmVTcGVha2VyKGUpe2lmKGUhPT10aGlzLnBlZXJJZClyZXR1cm47Y29uc3Qgcz1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kQWN0aXZlU3BlYWtlckV2ZW50KGUscyl9KX1kZXZpY2VzKGUscyl7Y29uc3Qgbj1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIGk7KGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5kZXZpY2VzKGUscyxuKX0pfXNlbGVjdGVkRGV2aWNlKGUscyl7Y29uc3Qgbj1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIGk7KGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5zZWxlY3RlZERldmljZShlLHMsbil9KX1tZWRpYVBlcm1pc3Npb24oZSxzKXtjb25zdCBuPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgaTsoaT10aGlzLmJhY2tlbmQpPT1udWxsfHxpLm1lZGlhUGVybWlzc2lvbihlLHMsbil9KX1tZWRpYVBsYXliYWNrRmFpbGVkKGUpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4ubWVkaWFQbGF5YmFja0ZhaWxlZChlLHMpfSl9bWVkaWFUcmFja011dGVkKGUpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4ubWVkaWFUcmFja011dGVkKGUscyl9KX10YWJDaGFuZ2VkKGU9ITEpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4udGFiQ2hhbmdlZChlLHMpfSl9YnJvd3NlckJhY2tncm91bmRlZCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuYnJvd3NlckJhY2tncm91bmRlZChlKX0pfWJyb3dzZXJGb3JlZ3JvdW5kZWQoKXtjb25zdCBlPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLmJyb3dzZXJGb3JlZ3JvdW5kZWQoZSl9KX1sZWdhY3lTd2l0Y2goZSl7Y29uc3Qgcz1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5sZWdhY3lTd2l0Y2goZSxzKX0pfXN0YXJ0UHJlQ2FsbFRlc3QoZT0hMSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uc2VuZFByZUNhbGxUZXN0QmVnaW5FdmVudChlLHMpfSl9KX1vblByZUNhbGxUZXN0UmVzdWx0cyhlKXtyZXR1cm4gdGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uY2UoInByZWNhbGxfZW5kIixlKX0pLGV9b25SZWNlaXZpbmdDb25zdW1lckF1ZGlvU3RhdHVzKGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLmV2ZW50SGFuZGxlci5vbigiY29uc3VtZXJfYXVkaW9fc3RhdHVzIixlKX0pfW9uUmVjZWl2aW5nQ29uc3VtZXJWaWRlb1N0YXR1cyhlKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5ldmVudEhhbmRsZXIub24oImNvbnN1bWVyX3ZpZGVvX3N0YXR1cyIsZSl9KX1vblJlY2VpdmluZ1Byb2R1Y2VyQXVkaW9TdGF0dXMoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJwcm9kdWNlcl9hdWRpb19zdGF0dXMiLGUpfSl9b25SZWNlaXZpbmdQcm9kdWNlclZpZGVvU3RhdHVzKGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLmV2ZW50SGFuZGxlci5vbigicHJvZHVjZXJfdmlkZW9fc3RhdHVzIixlKX0pfW9uUmVjZWl2aW5nUHJvZHVjaW5nVHJhbnNwb3J0U3RhdHVzKGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLmV2ZW50SGFuZGxlci5vbigicHJvZHVjaW5nX3RyYW5zcG9ydF9zdGF0dXMiLGUpfSl9b25SZWNlaXZpbmdDb25zdW1pbmdUcmFuc3BvcnRTdGF0dXMoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJjb25zdW1pbmdfdHJhbnNwb3J0X3N0YXR1cyIsZSl9KX1vblByb2R1Y2VyU2NvcmUoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJwcm9kdWNlcl9zY29yZSIsZSl9KX1vbkNvbnN1bWVyU2NvcmUoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJjb25zdW1lcl9zY29yZSIsZSl9KX1vblNhZmVJbml0aWFsaXphdGlvbihlKXtpZih0aGlzLmluaXRpYWxpemVkKWUodGhpcy5pcEluZm9ybWF0aW9uLCExKTtlbHNlIGlmKCF0aGlzLnN0YWxsZWQpe2NvbnN0IHM9bj0+e2UobiwhMCl9O3JldHVybiB0aGlzLm9uY2UoImluaXRpYWxpemVkIixzKSxzfXJldHVybigpPT57fX1yZW1vdmVJbml0aWFsaXphdGlvbkxpc3RlbmVyKGUpe3RoaXMucmVtb3ZlTGlzdGVuZXIoImluaXRpYWxpemVkIixlKX1zdGFsbENhbGxTdGF0cygpe3RoaXMuc3RhbGxlZD0hMCx0aGlzLnJlbW92ZUFsbExpc3RlbmVycygiaW5pdGlhbGl6ZWQiKX1pdnNQbGF5ZXJFdmVudChlLHMpe2NvbnN0IG49bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBpLGEsZCxvLGgsZyxiLFQsVixVLHE7c3dpdGNoKGUpe2Nhc2UiUGxheWVyUmVidWZmZXJpbmciOihpPXRoaXMuYmFja2VuZCk9PW51bGx8fGkuc2VuZElWU1BsYXllclJlYnVmZmVyRXZlbnQobik7YnJlYWs7Y2FzZSJQbGF5ZXJBdWRpb0Jsb2NrZWQiOihhPXRoaXMuYmFja2VuZCk9PW51bGx8fGEuc2VuZElWU1BsYXllckF1ZGlvQmxvY2tFdmVudChuKTticmVhaztjYXNlIlBsYXllclBsYXliYWNrQmxvY2tlZCI6KGQ9dGhpcy5iYWNrZW5kKT09bnVsbHx8ZC5zZW5kSVZTUGxheWVyUGxheWJhY2tCbG9ja2VkRXZlbnQobik7YnJlYWs7Y2FzZSJQbGF5ZXJOZXR3b3JrVW5hdmFpbGFibGUiOihvPXRoaXMuYmFja2VuZCk9PW51bGx8fG8uc2VuZElWU1BsYXllck5ldHdvcmtVbmF2YWlsYWJsZUV2ZW50KG4pO2JyZWFrO2Nhc2UiUGxheWVySW5pdGlhbGl6ZWQiOihoPXRoaXMuYmFja2VuZCk9PW51bGx8fGguc2VuZElWU1BsYXllckluaXRpYWxpemVkRXZlbnQobik7YnJlYWs7Y2FzZSJQbGF5ZXJXb3JrZXJFcnJvciI6KGc9dGhpcy5iYWNrZW5kKT09bnVsbHx8Zy5zZW5kSVZTUGxheWVyV29ya2VyRXJyb3JFdmVudChuKTticmVhaztjYXNlIlBsYXllckVycm9yIjooYj10aGlzLmJhY2tlbmQpPT1udWxsfHxiLnNlbmRJVlNQbGF5ZXJFcnJvckV2ZW50KHMsbik7YnJlYWs7Y2FzZSJQbGF5ZXJSZWNvdmVyYWJsZUVycm9yIjooVD10aGlzLmJhY2tlbmQpPT1udWxsfHxULnNlbmRJVlNQbGF5ZXJSZWNvdmVyYWJsZUVycm9yRXZlbnQocyxuKTticmVhaztjYXNlIlBsYXllckFuYWx5dGljc0V2ZW50IjooVj10aGlzLmJhY2tlbmQpPT1udWxsfHxWLnNlbmRJVlNQbGF5ZXJBbmFseXRpY3NFdmVudChzLG4pO2JyZWFrO2Nhc2UiUGxheWVyUGxheWJhY2tSYXRlQ2hhbmdlZCI6KFU9dGhpcy5iYWNrZW5kKT09bnVsbHx8VS5zZW5kSVZTUGxheWVyUGxheWJhY2tSYXRlQ2hhbmdlZEV2ZW50KHMsbik7YnJlYWs7Y2FzZSJQbGF5ZXJRdWFsaXR5Q2hhbmdlZCI6KHE9dGhpcy5iYWNrZW5kKT09bnVsbHx8cS5zZW5kSVZTUGxheWVyUXVhbGl0eUNoYW5nZWQocyxuKTticmVha319KX1saXZlc3RyZWFtTGF0ZW5jeShlKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmRQbGF5ZXJMaXZlTGF0ZW5jeShlLHMpfSl9ZXhwZWN0ZWRWaWRlb1Jlc29sdXRpb24oZSxzKXtjb25zdCBuPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgaTsoaT10aGlzLmJhY2tlbmQpPT1udWxsfHxpLmV4cGVjdGVkVmlkZW9SZXNvbHV0aW9uKGUscyxuKX0pfWV4cGVjdGVkU2NyZWVuc2hhcmVSZXNvbHV0aW9uKGUscyl7Y29uc3Qgbj1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIGk7KGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5leHBlY3RlZFNjcmVlbnNoYXJlUmVzb2x1dGlvbihlLHMsbil9KX19bmV3IHByKCkuc2V0TWF4TGlzdGVuZXJzKDMwKTtjbGFzcyBNc3tjb25zdHJ1Y3Rvcigpe2x0KHRoaXMsUGUsdm9pZCAwKX1nZXQgdGVsZW1ldHJ5KCl7dmFyIHQ7cmV0dXJuKHQ9USh0aGlzLFBlKSk9PW51bGw/dm9pZCAwOnQuZ2V0VmFsdWUoInRlbGVtZXRyeSIpfWluaXQodCl7ZmUodGhpcyxQZSx0KX1pbmZvKHQsZSxzKXt2YXIgbjsobj10aGlzLnRlbGVtZXRyeSk9PW51bGx8fG4uYWRkTG9nSW5DdXJyZW50U3BhbigiaW5mbyIsdCxlLHMpfWVycm9yKHQsZSxzKXt2YXIgbjsobj10aGlzLnRlbGVtZXRyeSk9PW51bGx8fG4uYWRkTG9nSW5DdXJyZW50U3BhbigiZXJyb3IiLHQsZSxzKX1kZWJ1Zyh0LGUscyl7dmFyIG47KG49dGhpcy50ZWxlbWV0cnkpPT1udWxsfHxuLmFkZExvZ0luQ3VycmVudFNwYW4oImRlYnVnIix0LGUscyl9bG9nKHQsZSxzKXt2YXIgbjsobj10aGlzLnRlbGVtZXRyeSk9PW51bGx8fG4uYWRkTG9nSW5DdXJyZW50U3BhbigibG9nIix0LGUscyl9d2Fybih0LGUscyl7dmFyIG47KG49dGhpcy50ZWxlbWV0cnkpPT1udWxsfHxuLmFkZExvZ0luQ3VycmVudFNwYW4oIndhcm4iLHQsZSxzKX19UGU9bmV3IFdlYWtNYXA7Y29uc3QgTHQ9Y2xhc3MgZXh0ZW5kcyBXLkV2ZW50RW1pdHRlcntjb25zdHJ1Y3RvcihlKXtzdXBlcigpO2x0KHRoaXMsWix2b2lkIDApO2x0KHRoaXMsZWUsdm9pZCAwKTt1KHRoaXMsImFzeW5jUHJvbWlzZVRpbWVvdXQiKTt1KHRoaXMsImxvZ2dlciIpO3RoaXMubG9nZ2VyPWUsZmUodGhpcyxaLG5ldyBNYXApLGZlKHRoaXMsZWUsbmV3IE1hcCksdGhpcy5hc3luY1Byb21pc2VUaW1lb3V0PThlM31lbWl0QXN5bmMoZSwuLi5zKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7USh0aGlzLFopLnNldChlLFtdKTtjb25zdCBuPVEodGhpcyxlZSkuZ2V0KGUpLm1hcCgoKT0+bmV3IFByb21pc2UoaT0+e1EodGhpcyxaKS5nZXQoZSkucHVzaChpKX0pKTtycyhMdC5wcm90b3R5cGUsdGhpcywiZW1pdCIpLmNhbGwodGhpcyxlLC4uLnMpLHlpZWxkIFByb21pc2UucmFjZShbUHJvbWlzZS5hbGwobiksbmV3IFByb21pc2UoKGksYSk9PnNldFRpbWVvdXQoKCk9PmEobmV3IEVycm9yKGBlbWl0QXN5bmMgZmFpbGVkIHRvIHJlc29sdmUgZm9yIGV2ZW50ICR7ZX0uYCkpLHRoaXMuYXN5bmNQcm9taXNlVGltZW91dCkpXSksUSh0aGlzLFopLmRlbGV0ZShlKX0pfW9uQXN5bmMoZSxzKXtjb25zdCBuPVEodGhpcyxaKSxpPSguLi5hKT0+dyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIG87dHJ5e3lpZWxkIHMoLi4uYSl9Y2F0Y2goaCl7dGhpcy5sb2dnZXIuZXJyb3IoIltvbkFzeW5jXSIse2Vycm9yOmh9KX1jb25zdCBkPShvPW4uZ2V0KGUpKT09bnVsbD92b2lkIDA6by5zaGlmdCgpO2Q9PW51bGx8fGQoKX0pO3JldHVybiBRKHRoaXMsZWUpLmdldChlKXx8USh0aGlzLGVlKS5zZXQoZSxbXSksUSh0aGlzLGVlKS5nZXQoZSkucHVzaChpKSxzdXBlci5vbihlLGkpfXJlc2V0KCl7ZmUodGhpcyxaLG5ldyBNYXApLGZlKHRoaXMsZWUsbmV3IE1hcCksc3VwZXIucmVtb3ZlQWxsTGlzdGVuZXJzKCl9fTtsZXQgbXQ9THQ7Wj1uZXcgV2Vha01hcCxlZT1uZXcgV2Vha01hcDt2YXIgaXQsX3M9bmV3IFVpbnQ4QXJyYXkoMTYpO2Z1bmN0aW9uIEFzKCl7aWYoIWl0JiYoaXQ9dHlwZW9mIGNyeXB0byE9InVuZGVmaW5lZCImJmNyeXB0by5nZXRSYW5kb21WYWx1ZXMmJmNyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChjcnlwdG8pfHx0eXBlb2YgbXNDcnlwdG8hPSJ1bmRlZmluZWQiJiZ0eXBlb2YgbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzPT0iZnVuY3Rpb24iJiZtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChtc0NyeXB0byksIWl0KSl0aHJvdyBuZXcgRXJyb3IoImNyeXB0by5nZXRSYW5kb21WYWx1ZXMoKSBub3Qgc3VwcG9ydGVkLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkI2dldHJhbmRvbXZhbHVlcy1ub3Qtc3VwcG9ydGVkIik7cmV0dXJuIGl0KF9zKX12YXIgTHM9L14oPzpbMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMS01XVswLTlhLWZdezN9LVs4OWFiXVswLTlhLWZdezN9LVswLTlhLWZdezEyfXwwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDApJC9pO2Z1bmN0aW9uIE9zKHIpe3JldHVybiB0eXBlb2Ygcj09InN0cmluZyImJkxzLnRlc3Qocil9Zm9yKHZhciBqPVtdLGZ0PTA7ZnQ8MjU2OysrZnQpai5wdXNoKChmdCsyNTYpLnRvU3RyaW5nKDE2KS5zdWJzdHIoMSkpO2Z1bmN0aW9uIERzKHIpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTowLGU9KGpbclt0KzBdXStqW3JbdCsxXV0raltyW3QrMl1dK2pbclt0KzNdXSsiLSIraltyW3QrNF1dK2pbclt0KzVdXSsiLSIraltyW3QrNl1dK2pbclt0KzddXSsiLSIraltyW3QrOF1dK2pbclt0KzldXSsiLSIraltyW3QrMTBdXStqW3JbdCsxMV1dK2pbclt0KzEyXV0raltyW3QrMTNdXStqW3JbdCsxNF1dK2pbclt0KzE1XV0pLnRvTG93ZXJDYXNlKCk7aWYoIU9zKGUpKXRocm93IFR5cGVFcnJvcigiU3RyaW5naWZpZWQgVVVJRCBpcyBpbnZhbGlkIik7cmV0dXJuIGV9ZnVuY3Rpb24gTnMocix0LGUpe3I9cnx8e307dmFyIHM9ci5yYW5kb218fChyLnJuZ3x8QXMpKCk7aWYoc1s2XT1zWzZdJjE1fDY0LHNbOF09c1s4XSY2M3wxMjgsdCl7ZT1lfHwwO2Zvcih2YXIgbj0wO248MTY7KytuKXRbZStuXT1zW25dO3JldHVybiB0fXJldHVybiBEcyhzKX12YXIgVnM9dHlwZW9mIGdsb2JhbD09Im9iamVjdCImJmdsb2JhbCYmZ2xvYmFsLk9iamVjdD09PU9iamVjdCYmZ2xvYmFsLGhyPVZzLEJzPXR5cGVvZiBzZWxmPT0ib2JqZWN0IiYmc2VsZiYmc2VsZi5PYmplY3Q9PT1PYmplY3QmJnNlbGYsRnM9aHJ8fEJzfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpLHJlPUZzLHhzPXJlLlN5bWJvbCxhdD14cyxtcj1PYmplY3QucHJvdG90eXBlLGpzPW1yLmhhc093blByb3BlcnR5LFVzPW1yLnRvU3RyaW5nLFNlPWF0P2F0LnRvU3RyaW5nVGFnOnZvaWQgMDtmdW5jdGlvbiBIcyhyKXt2YXIgdD1qcy5jYWxsKHIsU2UpLGU9cltTZV07dHJ5e3JbU2VdPXZvaWQgMDt2YXIgcz0hMH1jYXRjaChpKXt9dmFyIG49VXMuY2FsbChyKTtyZXR1cm4gcyYmKHQ/cltTZV09ZTpkZWxldGUgcltTZV0pLG59dmFyIEtzPU9iamVjdC5wcm90b3R5cGUsV3M9S3MudG9TdHJpbmc7ZnVuY3Rpb24genMocil7cmV0dXJuIFdzLmNhbGwocil9dmFyICRzPSJbb2JqZWN0IE51bGxdIixHcz0iW29iamVjdCBVbmRlZmluZWRdIixmcj1hdD9hdC50b1N0cmluZ1RhZzp2b2lkIDA7ZnVuY3Rpb24geWUocil7cmV0dXJuIHI9PW51bGw/cj09PXZvaWQgMD9HczokczpmciYmZnIgaW4gT2JqZWN0KHIpP0hzKHIpOnpzKHIpfWZ1bmN0aW9uIGd0KHIpe3JldHVybiByIT1udWxsJiZ0eXBlb2Ygcj09Im9iamVjdCJ9dmFyIHFzPUFycmF5LmlzQXJyYXksWXM9cXM7ZnVuY3Rpb24gZ3Iocil7dmFyIHQ9dHlwZW9mIHI7cmV0dXJuIHIhPW51bGwmJih0PT0ib2JqZWN0Inx8dD09ImZ1bmN0aW9uIil9dmFyIFFzPSJbb2JqZWN0IEFzeW5jRnVuY3Rpb25dIixKcz0iW29iamVjdCBGdW5jdGlvbl0iLFhzPSJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSIsWnM9IltvYmplY3QgUHJveHldIjtmdW5jdGlvbiBTcihyKXtpZighZ3IocikpcmV0dXJuITE7dmFyIHQ9eWUocik7cmV0dXJuIHQ9PUpzfHx0PT1Yc3x8dD09UXN8fHQ9PVpzfXZhciBlbj1yZVsiX19jb3JlLWpzX3NoYXJlZF9fIl0sU3Q9ZW4seXI9ZnVuY3Rpb24oKXt2YXIgcj0vW14uXSskLy5leGVjKFN0JiZTdC5rZXlzJiZTdC5rZXlzLklFX1BST1RPfHwiIik7cmV0dXJuIHI/IlN5bWJvbChzcmMpXzEuIityOiIifSgpO2Z1bmN0aW9uIHRuKHIpe3JldHVybiEheXImJnlyIGluIHJ9dmFyIHJuPUZ1bmN0aW9uLnByb3RvdHlwZSxzbj1ybi50b1N0cmluZztmdW5jdGlvbiBjZShyKXtpZihyIT1udWxsKXt0cnl7cmV0dXJuIHNuLmNhbGwocil9Y2F0Y2godCl7fXRyeXtyZXR1cm4gcisiIn1jYXRjaCh0KXt9fXJldHVybiIifXZhciBubj0vW1xcXiQuKis/KClbXF17fXxdL2csYW49L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8sb249RnVuY3Rpb24ucHJvdG90eXBlLGNuPU9iamVjdC5wcm90b3R5cGUsZG49b24udG9TdHJpbmcsbG49Y24uaGFzT3duUHJvcGVydHksdW49UmVnRXhwKCJeIitkbi5jYWxsKGxuKS5yZXBsYWNlKG5uLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO2Z1bmN0aW9uIHBuKHIpe2lmKCFncihyKXx8dG4ocikpcmV0dXJuITE7dmFyIHQ9U3Iocik/dW46YW47cmV0dXJuIHQudGVzdChjZShyKSl9ZnVuY3Rpb24gaG4ocix0KXtyZXR1cm4gcj09bnVsbD92b2lkIDA6clt0XX1mdW5jdGlvbiB2ZShyLHQpe3ZhciBlPWhuKHIsdCk7cmV0dXJuIHBuKGUpP2U6dm9pZCAwfXZhciBtbj12ZShyZSwiV2Vha01hcCIpLHl0PW1uLGZuPTkwMDcxOTkyNTQ3NDA5OTE7ZnVuY3Rpb24gdnIocil7cmV0dXJuIHR5cGVvZiByPT0ibnVtYmVyIiYmcj4tMSYmciUxPT0wJiZyPD1mbn1mdW5jdGlvbiBnbihyKXtyZXR1cm4gciE9bnVsbCYmdnIoci5sZW5ndGgpJiYhU3Iocil9dmFyIFNuPU9iamVjdC5wcm90b3R5cGU7ZnVuY3Rpb24gYnIocil7dmFyIHQ9ciYmci5jb25zdHJ1Y3RvcixlPXR5cGVvZiB0PT0iZnVuY3Rpb24iJiZ0LnByb3RvdHlwZXx8U247cmV0dXJuIHI9PT1lfXZhciB5bj0iW29iamVjdCBBcmd1bWVudHNdIjtmdW5jdGlvbiBFcihyKXtyZXR1cm4gZ3QocikmJnllKHIpPT15bn12YXIgVHI9T2JqZWN0LnByb3RvdHlwZSx2bj1Uci5oYXNPd25Qcm9wZXJ0eSxibj1Uci5wcm9wZXJ0eUlzRW51bWVyYWJsZSxFbj1FcihmdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHN9KCkpP0VyOmZ1bmN0aW9uKHIpe3JldHVybiBndChyKSYmdm4uY2FsbChyLCJjYWxsZWUiKSYmIWJuLmNhbGwociwiY2FsbGVlIil9LFRuPUVuO2Z1bmN0aW9uIFJuKCl7cmV0dXJuITF9dmFyIFJyPXR5cGVvZiBleHBvcnRzPT0ib2JqZWN0IiYmZXhwb3J0cyYmIWV4cG9ydHMubm9kZVR5cGUmJmV4cG9ydHMsUHI9UnImJnR5cGVvZiBtb2R1bGU9PSJvYmplY3QiJiZtb2R1bGUmJiFtb2R1bGUubm9kZVR5cGUmJm1vZHVsZSxQbj1QciYmUHIuZXhwb3J0cz09PVJyLENyPVBuP3JlLkJ1ZmZlcjp2b2lkIDAsQ249Q3I/Q3IuaXNCdWZmZXI6dm9pZCAwLEluPUNufHxSbix3bj1Jbixrbj0iW29iamVjdCBBcmd1bWVudHNdIixNbj0iW29iamVjdCBBcnJheV0iLF9uPSJbb2JqZWN0IEJvb2xlYW5dIixBbj0iW29iamVjdCBEYXRlXSIsTG49IltvYmplY3QgRXJyb3JdIixPbj0iW29iamVjdCBGdW5jdGlvbl0iLERuPSJbb2JqZWN0IE1hcF0iLE5uPSJbb2JqZWN0IE51bWJlcl0iLFZuPSJbb2JqZWN0IE9iamVjdF0iLEJuPSJbb2JqZWN0IFJlZ0V4cF0iLEZuPSJbb2JqZWN0IFNldF0iLHhuPSJbb2JqZWN0IFN0cmluZ10iLGpuPSJbb2JqZWN0IFdlYWtNYXBdIixVbj0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLEhuPSJbb2JqZWN0IERhdGFWaWV3XSIsS249IltvYmplY3QgRmxvYXQzMkFycmF5XSIsV249IltvYmplY3QgRmxvYXQ2NEFycmF5XSIsem49IltvYmplY3QgSW50OEFycmF5XSIsJG49IltvYmplY3QgSW50MTZBcnJheV0iLEduPSJbb2JqZWN0IEludDMyQXJyYXldIixxbj0iW29iamVjdCBVaW50OEFycmF5XSIsWW49IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIixRbj0iW29iamVjdCBVaW50MTZBcnJheV0iLEpuPSJbb2JqZWN0IFVpbnQzMkFycmF5XSIsTj17fTtOW0tuXT1OW1duXT1OW3puXT1OWyRuXT1OW0duXT1OW3FuXT1OW1luXT1OW1FuXT1OW0puXT0hMCxOW2tuXT1OW01uXT1OW1VuXT1OW19uXT1OW0huXT1OW0FuXT1OW0xuXT1OW09uXT1OW0RuXT1OW05uXT1OW1ZuXT1OW0JuXT1OW0ZuXT1OW3huXT1OW2puXT0hMTtmdW5jdGlvbiBYbihyKXtyZXR1cm4gZ3QocikmJnZyKHIubGVuZ3RoKSYmISFOW3llKHIpXX1mdW5jdGlvbiBabihyKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHIodCl9fXZhciBJcj10eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzLGJlPUlyJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IiYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGUsZWk9YmUmJmJlLmV4cG9ydHM9PT1Jcix2dD1laSYmaHIucHJvY2Vzcyx0aT1mdW5jdGlvbigpe3RyeXt2YXIgcj1iZSYmYmUucmVxdWlyZSYmYmUucmVxdWlyZSgidXRpbCIpLnR5cGVzO3JldHVybiByfHx2dCYmdnQuYmluZGluZyYmdnQuYmluZGluZygidXRpbCIpfWNhdGNoKHQpe319KCksd3I9dGksa3I9d3ImJndyLmlzVHlwZWRBcnJheSxyaT1rcj9abihrcik6WG4sc2k9cmk7ZnVuY3Rpb24gbmkocix0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHIodChlKSl9fXZhciBpaT1uaShPYmplY3Qua2V5cyxPYmplY3QpLGFpPWlpLG9pPU9iamVjdC5wcm90b3R5cGUsY2k9b2kuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gZGkocil7aWYoIWJyKHIpKXJldHVybiBhaShyKTt2YXIgdD1bXTtmb3IodmFyIGUgaW4gT2JqZWN0KHIpKWNpLmNhbGwocixlKSYmZSE9ImNvbnN0cnVjdG9yIiYmdC5wdXNoKGUpO3JldHVybiB0fXZhciBsaT12ZShyZSwiTWFwIiksYnQ9bGksdWk9dmUocmUsIkRhdGFWaWV3IiksRXQ9dWkscGk9dmUocmUsIlByb21pc2UiKSxUdD1waSxoaT12ZShyZSwiU2V0IiksUnQ9aGksTXI9IltvYmplY3QgTWFwXSIsbWk9IltvYmplY3QgT2JqZWN0XSIsX3I9IltvYmplY3QgUHJvbWlzZV0iLEFyPSJbb2JqZWN0IFNldF0iLExyPSJbb2JqZWN0IFdlYWtNYXBdIixPcj0iW29iamVjdCBEYXRhVmlld10iLGZpPWNlKEV0KSxnaT1jZShidCksU2k9Y2UoVHQpLHlpPWNlKFJ0KSx2aT1jZSh5dCksZGU9eWU7KEV0JiZkZShuZXcgRXQobmV3IEFycmF5QnVmZmVyKDEpKSkhPU9yfHxidCYmZGUobmV3IGJ0KSE9TXJ8fFR0JiZkZShUdC5yZXNvbHZlKCkpIT1fcnx8UnQmJmRlKG5ldyBSdCkhPUFyfHx5dCYmZGUobmV3IHl0KSE9THIpJiYoZGU9ZnVuY3Rpb24ocil7dmFyIHQ9eWUociksZT10PT1taT9yLmNvbnN0cnVjdG9yOnZvaWQgMCxzPWU/Y2UoZSk6IiI7aWYocylzd2l0Y2gocyl7Y2FzZSBmaTpyZXR1cm4gT3I7Y2FzZSBnaTpyZXR1cm4gTXI7Y2FzZSBTaTpyZXR1cm4gX3I7Y2FzZSB5aTpyZXR1cm4gQXI7Y2FzZSB2aTpyZXR1cm4gTHJ9cmV0dXJuIHR9KTt2YXIgYmk9ZGUsRWk9IltvYmplY3QgTWFwXSIsVGk9IltvYmplY3QgU2V0XSIsUmk9T2JqZWN0LnByb3RvdHlwZSxQaT1SaS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBDaShyKXtpZihyPT1udWxsKXJldHVybiEwO2lmKGduKHIpJiYoWXMocil8fHR5cGVvZiByPT0ic3RyaW5nInx8dHlwZW9mIHIuc3BsaWNlPT0iZnVuY3Rpb24ifHx3bihyKXx8c2kocil8fFRuKHIpKSlyZXR1cm4hci5sZW5ndGg7dmFyIHQ9Ymkocik7aWYodD09RWl8fHQ9PVRpKXJldHVybiFyLnNpemU7aWYoYnIocikpcmV0dXJuIWRpKHIpLmxlbmd0aDtmb3IodmFyIGUgaW4gcilpZihQaS5jYWxsKHIsZSkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gb3Qocil7Y29uc3QgdD17fTtyZXR1cm4gdHlwZW9mKHI9PW51bGw/dm9pZCAwOnIuY29kZSk9PSJudW1iZXIiJiYodC5jb2RlPXIuY29kZSksdHlwZW9mKHI9PW51bGw/dm9pZCAwOnIuY29kZSk9PSJzdHJpbmciJiYodC5jb2RlPXIuY29kZS5zdWJzdHJpbmcoMCwxMDApKSx0eXBlb2Yocj09bnVsbD92b2lkIDA6ci5uYW1lKT09InN0cmluZyImJih0Lm5hbWU9ci5uYW1lLnN1YnN0cmluZygwLDUwMCkpLHR5cGVvZihyPT1udWxsP3ZvaWQgMDpyLm1lc3NhZ2UpPT0ic3RyaW5nIiYmKHQubWVzc2FnZT1yLm1lc3NhZ2Uuc3Vic3RyaW5nKDAsNTAwKSksdHlwZW9mKHI9PW51bGw/dm9pZCAwOnIucmVhc29uKT09InN0cmluZyImJih0LnJlYXNvbj1yLnJlYXNvbi5zdWJzdHJpbmcoMCw1MDApKSx0eXBlb2Yocj09bnVsbD92b2lkIDA6ci5zdGFjayk9PSJzdHJpbmciJiYodC5zdGFjaz1yLnN0YWNrLnN1YnN0cmluZygwLDUwMCkpLHR9ZnVuY3Rpb24gSWkoe3NlcnZpY2VQcmVmaXg6cixiYXNlVVJJOnR9KXtyZXR1cm5gJHtyfS4ke3R9YH1jb25zdCB3aT17bG9nczoiaHR0cHM6Ly9hcGkucmVhbHRpbWUuY2xvdWRmbGFyZS5jb20vbG9ncy9vdGVsL2xvZ3MiLG1vY2s6e3VybDoiaHR0cHM6Ly9hcGkucmVhbHRpbWUuY2xvdWRmbGFyZS5jb20vbW9jayIsZG9tYWluOiJtb2NrLnJlYWx0aW1lLmNsb3VkZmxhcmUuY29tIixhcHA6Imh0dHBzOi8vZXhhbXBsZXMucmVhbHRpbWUuY2xvdWRmbGFyZS5jb20vbWVldGluZyIsc3RhZ2luZ0FwcDoiaHR0cHM6Ly9leGFtcGxlcy5zdGFnaW5nLnJlYWx0aW1lLmNsb3VkZmxhcmUuY29tL21lZXRpbmcifSxhcGlCYXNlOntwcm9kOiJodHRwczovL2FwaS5yZWFsdGltZS5jbG91ZGZsYXJlLmNvbSIsc3RhZ2luZzoiaHR0cHM6Ly9hcGkuc3RhZ2luZy5yZWFsdGltZS5jbG91ZGZsYXJlLmNvbSIscHJvZEFsdGVybmF0ZToiaHR0cHM6Ly9hcGkucmVhbHRpbWUuY2xvdWRmbGFyZS5jb20ifSxiYXNlVVJJOntwcm9kOiJyZWFsdGltZS5jbG91ZGZsYXJlLmNvbSIsc3RhZ2luZzoic3RhZ2luZy5yZWFsdGltZS5jbG91ZGZsYXJlLmNvbSJ9fTtmdW5jdGlvbiBEcihyKXt2YXIgcyxuLGk7Y29uc3QgdD10eXBlb2YgbmF2aWdhdG9yIT0idW5kZWZpbmVkIiYmIW5hdmlnYXRvci5pc1JlYWN0TmF0aXZlJiZ0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmKChzPXdpbmRvdy5sb2NhdGlvbi5ob3N0KT09bnVsbD92b2lkIDA6cy5pbmNsdWRlcyh3aS5iYXNlVVJJLnN0YWdpbmcpKSxlPSEhKChpPShuPXI9PW51bGw/dm9pZCAwOnIuZ2V0VmFsdWUoIm1vZHVsZXMiKSk9PW51bGw/dm9pZCAwOm4uZGV2VG9vbHMpIT1udWxsJiZpLmxvZ3MpO3JldHVybiB0fHxlfWZ1bmN0aW9uIGtpKHIsdCl7dmFyIHM7Y29uc3QgZT0ocz1yPT1udWxsP3ZvaWQgMDpyLmdldFZhbHVlKCJ0ZWxlbWV0cnkiKSk9PW51bGw/dm9pZCAwOnMubG9nTGV2ZWw7aWYoZT09PSJvZmYiKXJldHVybiExO2lmKGUhPT0iYWxsIil7Y29uc3Qgbj1bImRlYnVnIiwibG9nIiwiaW5mbyIsIndhcm4iLCJlcnJvciJdLGk9bi5pbmRleE9mKHQudG9Mb3dlckNhc2UoKSksYT1uLmluZGV4T2YoZSk7aWYoaTxhKXJldHVybiExfXJldHVybiEwfWZ1bmN0aW9uIE5yKHIsdCxlPXt9KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocikuZm9yRWFjaChzPT57dmFyIGk7aWYoW251bGwsdm9pZCAwLE5hTl0uaW5jbHVkZXMocltzXSl8fHQmJigoKGk9dC5tYXRjaCgvXC4vZykpPT1udWxsP3ZvaWQgMDppLmxlbmd0aCl8fDApPj0xMClyZXR1cm47Y29uc3Qgbj10P2Ake3R9LiR7c31gOnM7dHlwZW9mIHJbc109PSJvYmplY3QiP05yKHJbc10sbixlKTpbIm51bWJlciIsInN0cmluZyIsImJvb2xlYW4iXS5pbmNsdWRlcyh0eXBlb2YgcltzXSkmJihlW25dPXJbc10pfSksZX1mdW5jdGlvbiBWcihyLHQsZT17fSxzPSIiKXtjb25zdCBuPXt9O3RyeXtjb25zdCBpPUpTT04uc3RyaW5naWZ5KGUpLGE9SlNPTi5wYXJzZShpKSxkPU5yKGEscyksbz1KU09OLnN0cmluZ2lmeShkKTtpZighKHQ9PW51bGw/dm9pZCAwOnQuc3RhcnRzV2l0aCgiW1NEUF0iKSkmJm8ubGVuZ3RoPjVlMyl7Y29uc3QgZz1gTG9nIG5hbWVkOiAiJHt0fSIgaXMgdHJ5aW5nIHRvIGxvZyBhbiBmbGF0dGVuZWQgb2JqZWN0IG9mIHNpemUgCgkJCSR7by5sZW5ndGh9IGNoYXJzIHRoYXQgaXMgYmV5b25kIHBlcm1pdHRlZCBsaW1pdCBvZiA1MDAwIGNoYXJzLiBQbGVhc2Ugb3B0aW1pemUuYDt0aHJvdyBEcihyKSYmY29uc29sZS5lcnJvcihnLHtsb2c6ZSxmbGF0dGVuZWQ6b30pLG5ldyBFcnJvcihnKX1yZXR1cm4gSlNPTi5wYXJzZShvKX1jYXRjaChpKXtjb25zdCBhPW90KGkpO25bYCR7c30uZXJyb3IubWVzc2FnZWBdPWEubWVzc2FnZXx8IiIsbltgJHtzfS5lcnJvci5zdGFja2BdPWEuc3RhY2t8fCIiLG5bYCR7c30uZXJyb3IucmVhc29uYF09YS5yZWFzb258fCIiLG5bYCR7c30uZXJyb3Iuc291cmNlYF09InNhZmVseUZsYXR0ZW5PYmpGb3JPcGVuVGVsZW1ldHJ5In1yZXR1cm4gbn1jb25zdCBNaT17IkFtYXpvbiBTaWxrIjoiYW1hem9uX3NpbGsiLCJBbmRyb2lkIEJyb3dzZXIiOiJhbmRyb2lkIixCYWRhOiJiYWRhIixCbGFja0JlcnJ5OiJibGFja2JlcnJ5IixDaHJvbWU6ImNocm9tZSIsQ2hyb21pdW06ImNocm9taXVtIixFbGVjdHJvbjoiZWxlY3Ryb24iLEVwaXBoYW55OiJlcGlwaGFueSIsRmlyZWZveDoiZmlyZWZveCIsRm9jdXM6ImZvY3VzIixHZW5lcmljOiJnZW5lcmljIiwiR29vZ2xlIFNlYXJjaCI6Imdvb2dsZV9zZWFyY2giLEdvb2dsZWJvdDoiZ29vZ2xlYm90IiwiSW50ZXJuZXQgRXhwbG9yZXIiOiJpZSIsIkstTWVsZW9uIjoia19tZWxlb24iLE1heHRob246Im1heHRob24iLCJNaWNyb3NvZnQgRWRnZSI6ImVkZ2UiLCJNWiBCcm93c2VyIjoibXoiLCJOQVZFUiBXaGFsZSBCcm93c2VyIjoibmF2ZXIiLE9wZXJhOiJvcGVyYSIsIk9wZXJhIENvYXN0Ijoib3BlcmFfY29hc3QiLFBoYW50b21KUzoicGhhbnRvbWpzIixQdWZmaW46InB1ZmZpbiIsUXVwWmlsbGE6InF1cHppbGxhIixRUToicXEiLFFRTGl0ZToicXFsaXRlIixTYWZhcmk6InNhZmFyaSIsU2FpbGZpc2g6InNhaWxmaXNoIiwiU2Ftc3VuZyBJbnRlcm5ldCBmb3IgQW5kcm9pZCI6InNhbXN1bmdfaW50ZXJuZXQiLFNlYU1vbmtleToic2VhbW9ua2V5IixTbGVpcG5pcjoic2xlaXBuaXIiLFN3aW5nOiJzd2luZyIsVGl6ZW46InRpemVuIiwiVUMgQnJvd3NlciI6InVjIixWaXZhbGRpOiJ2aXZhbGRpIiwiV2ViT1MgQnJvd3NlciI6IndlYm9zIixXZUNoYXQ6IndlY2hhdCIsIllhbmRleCBCcm93c2VyIjoieWFuZGV4IixSb2t1OiJyb2t1In0sQnI9e2FtYXpvbl9zaWxrOiJBbWF6b24gU2lsayIsYW5kcm9pZDoiQW5kcm9pZCBCcm93c2VyIixiYWRhOiJCYWRhIixibGFja2JlcnJ5OiJCbGFja0JlcnJ5IixjaHJvbWU6IkNocm9tZSIsY2hyb21pdW06IkNocm9taXVtIixlbGVjdHJvbjoiRWxlY3Ryb24iLGVwaXBoYW55OiJFcGlwaGFueSIsZmlyZWZveDoiRmlyZWZveCIsZm9jdXM6IkZvY3VzIixnZW5lcmljOiJHZW5lcmljIixnb29nbGVib3Q6Ikdvb2dsZWJvdCIsZ29vZ2xlX3NlYXJjaDoiR29vZ2xlIFNlYXJjaCIsaWU6IkludGVybmV0IEV4cGxvcmVyIixrX21lbGVvbjoiSy1NZWxlb24iLG1heHRob246Ik1heHRob24iLGVkZ2U6Ik1pY3Jvc29mdCBFZGdlIixtejoiTVogQnJvd3NlciIsbmF2ZXI6Ik5BVkVSIFdoYWxlIEJyb3dzZXIiLG9wZXJhOiJPcGVyYSIsb3BlcmFfY29hc3Q6Ik9wZXJhIENvYXN0IixwaGFudG9tanM6IlBoYW50b21KUyIscHVmZmluOiJQdWZmaW4iLHF1cHppbGxhOiJRdXBaaWxsYSIscXE6IlFRIEJyb3dzZXIiLHFxbGl0ZToiUVEgQnJvd3NlciBMaXRlIixzYWZhcmk6IlNhZmFyaSIsc2FpbGZpc2g6IlNhaWxmaXNoIixzYW1zdW5nX2ludGVybmV0OiJTYW1zdW5nIEludGVybmV0IGZvciBBbmRyb2lkIixzZWFtb25rZXk6IlNlYU1vbmtleSIsc2xlaXBuaXI6IlNsZWlwbmlyIixzd2luZzoiU3dpbmciLHRpemVuOiJUaXplbiIsdWM6IlVDIEJyb3dzZXIiLHZpdmFsZGk6IlZpdmFsZGkiLHdlYm9zOiJXZWJPUyBCcm93c2VyIix3ZWNoYXQ6IldlQ2hhdCIseWFuZGV4OiJZYW5kZXggQnJvd3NlciJ9LEY9e3RhYmxldDoidGFibGV0Iixtb2JpbGU6Im1vYmlsZSIsZGVza3RvcDoiZGVza3RvcCIsdHY6InR2In0sSz17V2luZG93c1Bob25lOiJXaW5kb3dzIFBob25lIixXaW5kb3dzOiJXaW5kb3dzIixNYWNPUzoibWFjT1MiLGlPUzoiaU9TIixBbmRyb2lkOiJBbmRyb2lkIixXZWJPUzoiV2ViT1MiLEJsYWNrQmVycnk6IkJsYWNrQmVycnkiLEJhZGE6IkJhZGEiLFRpemVuOiJUaXplbiIsTGludXg6IkxpbnV4IixDaHJvbWVPUzoiQ2hyb21lIE9TIixQbGF5U3RhdGlvbjQ6IlBsYXlTdGF0aW9uIDQiLFJva3U6IlJva3UifSxzZT17RWRnZUhUTUw6IkVkZ2VIVE1MIixCbGluazoiQmxpbmsiLFRyaWRlbnQ6IlRyaWRlbnQiLFByZXN0bzoiUHJlc3RvIixHZWNrbzoiR2Vja28iLFdlYktpdDoiV2ViS2l0In07Y2xhc3MgZntzdGF0aWMgZ2V0Rmlyc3RNYXRjaCh0LGUpe2NvbnN0IHM9ZS5tYXRjaCh0KTtyZXR1cm4gcyYmcy5sZW5ndGg+MCYmc1sxXXx8IiJ9c3RhdGljIGdldFNlY29uZE1hdGNoKHQsZSl7Y29uc3Qgcz1lLm1hdGNoKHQpO3JldHVybiBzJiZzLmxlbmd0aD4xJiZzWzJdfHwiIn1zdGF0aWMgbWF0Y2hBbmRSZXR1cm5Db25zdCh0LGUscyl7aWYodC50ZXN0KGUpKXJldHVybiBzfXN0YXRpYyBnZXRXaW5kb3dzVmVyc2lvbk5hbWUodCl7c3dpdGNoKHQpe2Nhc2UiTlQiOnJldHVybiJOVCI7Y2FzZSJYUCI6cmV0dXJuIlhQIjtjYXNlIk5UIDUuMCI6cmV0dXJuIjIwMDAiO2Nhc2UiTlQgNS4xIjpyZXR1cm4iWFAiO2Nhc2UiTlQgNS4yIjpyZXR1cm4iMjAwMyI7Y2FzZSJOVCA2LjAiOnJldHVybiJWaXN0YSI7Y2FzZSJOVCA2LjEiOnJldHVybiI3IjtjYXNlIk5UIDYuMiI6cmV0dXJuIjgiO2Nhc2UiTlQgNi4zIjpyZXR1cm4iOC4xIjtjYXNlIk5UIDEwLjAiOnJldHVybiIxMCI7ZGVmYXVsdDpyZXR1cm59fXN0YXRpYyBnZXRNYWNPU1ZlcnNpb25OYW1lKHQpe2NvbnN0IGU9dC5zcGxpdCgiLiIpLnNwbGljZSgwLDIpLm1hcChzPT5wYXJzZUludChzLDEwKXx8MCk7aWYoZS5wdXNoKDApLGVbMF09PT0xMClzd2l0Y2goZVsxXSl7Y2FzZSA1OnJldHVybiJMZW9wYXJkIjtjYXNlIDY6cmV0dXJuIlNub3cgTGVvcGFyZCI7Y2FzZSA3OnJldHVybiJMaW9uIjtjYXNlIDg6cmV0dXJuIk1vdW50YWluIExpb24iO2Nhc2UgOTpyZXR1cm4iTWF2ZXJpY2tzIjtjYXNlIDEwOnJldHVybiJZb3NlbWl0ZSI7Y2FzZSAxMTpyZXR1cm4iRWwgQ2FwaXRhbiI7Y2FzZSAxMjpyZXR1cm4iU2llcnJhIjtjYXNlIDEzOnJldHVybiJIaWdoIFNpZXJyYSI7Y2FzZSAxNDpyZXR1cm4iTW9qYXZlIjtjYXNlIDE1OnJldHVybiJDYXRhbGluYSI7ZGVmYXVsdDpyZXR1cm59fXN0YXRpYyBnZXRBbmRyb2lkVmVyc2lvbk5hbWUodCl7Y29uc3QgZT10LnNwbGl0KCIuIikuc3BsaWNlKDAsMikubWFwKHM9PnBhcnNlSW50KHMsMTApfHwwKTtpZihlLnB1c2goMCksIShlWzBdPT09MSYmZVsxXTw1KSl7aWYoZVswXT09PTEmJmVbMV08NilyZXR1cm4iQ3VwY2FrZSI7aWYoZVswXT09PTEmJmVbMV0+PTYpcmV0dXJuIkRvbnV0IjtpZihlWzBdPT09MiYmZVsxXTwyKXJldHVybiJFY2xhaXIiO2lmKGVbMF09PT0yJiZlWzFdPT09MilyZXR1cm4iRnJveW8iO2lmKGVbMF09PT0yJiZlWzFdPjIpcmV0dXJuIkdpbmdlcmJyZWFkIjtpZihlWzBdPT09MylyZXR1cm4iSG9uZXljb21iIjtpZihlWzBdPT09NCYmZVsxXTwxKXJldHVybiJJY2UgQ3JlYW0gU2FuZHdpY2giO2lmKGVbMF09PT00JiZlWzFdPDQpcmV0dXJuIkplbGx5IEJlYW4iO2lmKGVbMF09PT00JiZlWzFdPj00KXJldHVybiJLaXRLYXQiO2lmKGVbMF09PT01KXJldHVybiJMb2xsaXBvcCI7aWYoZVswXT09PTYpcmV0dXJuIk1hcnNobWFsbG93IjtpZihlWzBdPT09NylyZXR1cm4iTm91Z2F0IjtpZihlWzBdPT09OClyZXR1cm4iT3JlbyI7aWYoZVswXT09PTkpcmV0dXJuIlBpZSJ9fXN0YXRpYyBnZXRWZXJzaW9uUHJlY2lzaW9uKHQpe3JldHVybiB0LnNwbGl0KCIuIikubGVuZ3RofXN0YXRpYyBjb21wYXJlVmVyc2lvbnModCxlLHM9ITEpe2NvbnN0IG49Zi5nZXRWZXJzaW9uUHJlY2lzaW9uKHQpLGk9Zi5nZXRWZXJzaW9uUHJlY2lzaW9uKGUpO2xldCBhPU1hdGgubWF4KG4saSksZD0wO2NvbnN0IG89Zi5tYXAoW3QsZV0saD0+e2NvbnN0IGc9YS1mLmdldFZlcnNpb25QcmVjaXNpb24oaCksYj1oK25ldyBBcnJheShnKzEpLmpvaW4oIi4wIik7cmV0dXJuIGYubWFwKGIuc3BsaXQoIi4iKSxUPT5uZXcgQXJyYXkoMjAtVC5sZW5ndGgpLmpvaW4oIjAiKStUKS5yZXZlcnNlKCl9KTtmb3IocyYmKGQ9YS1NYXRoLm1pbihuLGkpKSxhLT0xO2E+PWQ7KXtpZihvWzBdW2FdPm9bMV1bYV0pcmV0dXJuIDE7aWYob1swXVthXT09PW9bMV1bYV0pe2lmKGE9PT1kKXJldHVybiAwO2EtPTF9ZWxzZSBpZihvWzBdW2FdPG9bMV1bYV0pcmV0dXJuLTF9fXN0YXRpYyBtYXAodCxlKXtjb25zdCBzPVtdO2xldCBuO2lmKEFycmF5LnByb3RvdHlwZS5tYXApcmV0dXJuIEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbCh0LGUpO2ZvcihuPTA7bjx0Lmxlbmd0aDtuKz0xKXMucHVzaChlKHRbbl0pKTtyZXR1cm4gc31zdGF0aWMgZmluZCh0LGUpe2xldCBzLG47aWYoQXJyYXkucHJvdG90eXBlLmZpbmQpcmV0dXJuIEFycmF5LnByb3RvdHlwZS5maW5kLmNhbGwodCxlKTtmb3Iocz0wLG49dC5sZW5ndGg7czxuO3MrPTEpe2NvbnN0IGk9dFtzXTtpZihlKGkscykpcmV0dXJuIGl9fXN0YXRpYyBhc3NpZ24odCwuLi5lKXtjb25zdCBzPXQ7bGV0IG4saTtpZihPYmplY3QuYXNzaWduKXJldHVybiBPYmplY3QuYXNzaWduKHQsLi4uZSk7Zm9yKG49MCxpPWUubGVuZ3RoO248aTtuKz0xKXtjb25zdCBhPWVbbl07dHlwZW9mIGE9PSJvYmplY3QiJiZhIT09bnVsbCYmT2JqZWN0LmtleXMoYSkuZm9yRWFjaChvPT57c1tvXT1hW29dfSl9cmV0dXJuIHR9c3RhdGljIGdldEJyb3dzZXJBbGlhcyh0KXtyZXR1cm4gTWlbdF19c3RhdGljIGdldEJyb3dzZXJUeXBlQnlBbGlhcyh0KXtyZXR1cm4gQnJbdF18fCIifX1jb25zdCBPPS92ZXJzaW9uXC8oXGQrKFwuP18/XGQrKSspL2ksX2k9W3t0ZXN0OlsvZ29vZ2xlYm90L2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6Ikdvb2dsZWJvdCJ9LGU9Zi5nZXRGaXJzdE1hdGNoKC9nb29nbGVib3RcLyhcZCsoXC5cZCspKS9pLHIpfHxmLmdldEZpcnN0TWF0Y2goTyxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9vcGVyYS9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJPcGVyYSJ9LGU9Zi5nZXRGaXJzdE1hdGNoKE8scil8fGYuZ2V0Rmlyc3RNYXRjaCgvKD86b3BlcmEpW1xzL10oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0Olsvb3ByXC98b3Bpb3MvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiT3BlcmEifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvKD86b3ByfG9waW9zKVtccy9dKFxTKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvU2Ftc3VuZ0Jyb3dzZXIvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiU2Ftc3VuZyBJbnRlcm5ldCBmb3IgQW5kcm9pZCJ9LGU9Zi5nZXRGaXJzdE1hdGNoKE8scil8fGYuZ2V0Rmlyc3RNYXRjaCgvKD86U2Ftc3VuZ0Jyb3dzZXIpW1xzL10oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvV2hhbGUvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiTkFWRVIgV2hhbGUgQnJvd3NlciJ9LGU9Zi5nZXRGaXJzdE1hdGNoKE8scil8fGYuZ2V0Rmlyc3RNYXRjaCgvKD86d2hhbGUpW1xzL10oXGQrKD86XC5cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9NWkJyb3dzZXIvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiTVogQnJvd3NlciJ9LGU9Zi5nZXRGaXJzdE1hdGNoKC8oPzpNWkJyb3dzZXIpW1xzL10oXGQrKD86XC5cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvZm9jdXMvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiRm9jdXMifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvKD86Zm9jdXMpW1xzL10oXGQrKD86XC5cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0Olsvc3dpbmcvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiU3dpbmcifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvKD86c3dpbmcpW1xzL10oXGQrKD86XC5cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvY29hc3QvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiT3BlcmEgQ29hc3QifSxlPWYuZ2V0Rmlyc3RNYXRjaChPLHIpfHxmLmdldEZpcnN0TWF0Y2goLyg/OmNvYXN0KVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL29wdFwvXGQrKD86Lj9fP1xkKykrL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6Ik9wZXJhIFRvdWNoIn0sZT1mLmdldEZpcnN0TWF0Y2goLyg/Om9wdClbXHMvXShcZCsoXC4/Xz9cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsveWFicm93c2VyL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IllhbmRleCBCcm93c2VyIn0sZT1mLmdldEZpcnN0TWF0Y2goLyg/OnlhYnJvd3NlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvdWNicm93c2VyL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IlVDIEJyb3dzZXIifSxlPWYuZ2V0Rmlyc3RNYXRjaChPLHIpfHxmLmdldEZpcnN0TWF0Y2goLyg/OnVjYnJvd3NlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9NYXh0aG9ufG14aW9zL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6Ik1heHRob24ifSxlPWYuZ2V0Rmlyc3RNYXRjaChPLHIpfHxmLmdldEZpcnN0TWF0Y2goLyg/Ok1heHRob258bXhpb3MpW1xzL10oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvZXBpcGhhbnkvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiRXBpcGhhbnkifSxlPWYuZ2V0Rmlyc3RNYXRjaChPLHIpfHxmLmdldEZpcnN0TWF0Y2goLyg/OmVwaXBoYW55KVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL3B1ZmZpbi9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJQdWZmaW4ifSxlPWYuZ2V0Rmlyc3RNYXRjaChPLHIpfHxmLmdldEZpcnN0TWF0Y2goLyg/OnB1ZmZpbilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9zbGVpcG5pci9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJTbGVpcG5pciJ9LGU9Zi5nZXRGaXJzdE1hdGNoKE8scil8fGYuZ2V0Rmlyc3RNYXRjaCgvKD86c2xlaXBuaXIpW1xzL10oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0Olsvay1tZWxlb24vaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiSy1NZWxlb24ifSxlPWYuZ2V0Rmlyc3RNYXRjaChPLHIpfHxmLmdldEZpcnN0TWF0Y2goLyg/OmstbWVsZW9uKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL21pY3JvbWVzc2VuZ2VyL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IldlQ2hhdCJ9LGU9Zi5nZXRGaXJzdE1hdGNoKC8oPzptaWNyb21lc3NlbmdlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvcXFicm93c2VyL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6L3FxYnJvd3NlcmxpdGUvaS50ZXN0KHIpPyJRUSBCcm93c2VyIExpdGUiOiJRUSBCcm93c2VyIn0sZT1mLmdldEZpcnN0TWF0Y2goLyg/OnFxYnJvd3NlcmxpdGV8cXFicm93c2VyKVsvXShcZCsoXC4/Xz9cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvbXNpZXx0cmlkZW50L2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IkludGVybmV0IEV4cGxvcmVyIn0sZT1mLmdldEZpcnN0TWF0Y2goLyg/Om1zaWUgfHJ2OikoXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvXHNlZGdcLy9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJNaWNyb3NvZnQgRWRnZSJ9LGU9Zi5nZXRGaXJzdE1hdGNoKC9cc2VkZ1wvKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL2VkZyhbZWFdfGlvcykvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiTWljcm9zb2Z0IEVkZ2UifSxlPWYuZ2V0U2Vjb25kTWF0Y2goL2VkZyhbZWFdfGlvcylcLyhcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy92aXZhbGRpL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IlZpdmFsZGkifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvdml2YWxkaVwvKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL3NlYW1vbmtleS9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJTZWFNb25rZXkifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvc2VhbW9ua2V5XC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0Olsvc2FpbGZpc2gvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiU2FpbGZpc2gifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvc2FpbGZpc2hccz9icm93c2VyXC8oXGQrKFwuXGQrKT8pL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0Olsvc2lsay9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJBbWF6b24gU2lsayJ9LGU9Zi5nZXRGaXJzdE1hdGNoKC9zaWxrXC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvcGhhbnRvbS9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJQaGFudG9tSlMifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvcGhhbnRvbWpzXC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0Olsvc2xpbWVyanMvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiU2xpbWVySlMifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvc2xpbWVyanNcLyhcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9ibGFja2JlcnJ5fFxiYmJcZCsvaSwvcmltXHN0YWJsZXQvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiQmxhY2tCZXJyeSJ9LGU9Zi5nZXRGaXJzdE1hdGNoKE8scil8fGYuZ2V0Rmlyc3RNYXRjaCgvYmxhY2tiZXJyeVtcZF0rXC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvKHdlYnxocHcpW28wXXMvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiV2ViT1MgQnJvd3NlciJ9LGU9Zi5nZXRGaXJzdE1hdGNoKE8scil8fGYuZ2V0Rmlyc3RNYXRjaCgvdyg/OmViKT9bbzBdc2Jyb3dzZXJcLyhcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9iYWRhL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IkJhZGEifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvZG9sZmluXC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvdGl6ZW4vaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiVGl6ZW4ifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvKD86dGl6ZW5ccz8pP2Jyb3dzZXJcLyhcZCsoXC4/Xz9cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvcXVwemlsbGEvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiUXVwWmlsbGEifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvKD86cXVwemlsbGEpW1xzL10oXGQrKFwuP18/XGQrKSspL2kscil8fGYuZ2V0Rmlyc3RNYXRjaChPLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL2ZpcmVmb3h8aWNld2Vhc2VsfGZ4aW9zL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IkZpcmVmb3gifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvKD86ZmlyZWZveHxpY2V3ZWFzZWx8Znhpb3MpW1xzL10oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvZWxlY3Ryb24vaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiRWxlY3Ryb24ifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvKD86ZWxlY3Ryb24pXC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvTWl1aUJyb3dzZXIvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiTWl1aSJ9LGU9Zi5nZXRGaXJzdE1hdGNoKC8oPzpNaXVpQnJvd3NlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9jaHJvbWl1bS9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJDaHJvbWl1bSJ9LGU9Zi5nZXRGaXJzdE1hdGNoKC8oPzpjaHJvbWl1bSlbXHMvXShcZCsoXC4/Xz9cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvY2hyb21lfGNyaW9zfGNybW8vaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiQ2hyb21lIn0sZT1mLmdldEZpcnN0TWF0Y2goLyg/OmNocm9tZXxjcmlvc3xjcm1vKVwvKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL0dTQS9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJHb29nbGUgU2VhcmNoIn0sZT1mLmdldEZpcnN0TWF0Y2goLyg/OkdTQSlcLyhcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Qocil7Y29uc3QgdD0hci50ZXN0KC9saWtlIGFuZHJvaWQvaSksZT1yLnRlc3QoL2FuZHJvaWQvaSk7cmV0dXJuIHQmJmV9LGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IkFuZHJvaWQgQnJvd3NlciJ9LGU9Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvcGxheXN0YXRpb24gNC9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJQbGF5U3RhdGlvbiA0In0sZT1mLmdldEZpcnN0TWF0Y2goTyxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9zYWZhcml8YXBwbGV3ZWJraXQvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiU2FmYXJpIn0sZT1mLmdldEZpcnN0TWF0Y2goTyxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy8uKi9pXSxkZXNjcmliZShyKXtjb25zdCB0PS9eKC4qKVwvKC4qKSAvLGU9L14oLiopXC8oLiopWyBcdF1cKCguKikvLG49ci5zZWFyY2goIlxcKCIpIT09LTE/ZTp0O3JldHVybntuYW1lOmYuZ2V0Rmlyc3RNYXRjaChuLHIpLHZlcnNpb246Zi5nZXRTZWNvbmRNYXRjaChuLHIpfX19XTt2YXIgQWk9W3t0ZXN0OlsvUm9rdVwvRFZQL10sZGVzY3JpYmUocil7Y29uc3QgdD1mLmdldEZpcnN0TWF0Y2goL1Jva3VcL0RWUC0oXGQrXC5cZCspL2kscik7cmV0dXJue25hbWU6Sy5Sb2t1LHZlcnNpb246dH19fSx7dGVzdDpbL3dpbmRvd3MgcGhvbmUvaV0sZGVzY3JpYmUocil7Y29uc3QgdD1mLmdldEZpcnN0TWF0Y2goL3dpbmRvd3MgcGhvbmUgKD86b3MpP1xzPyhcZCsoXC5cZCspKikvaSxyKTtyZXR1cm57bmFtZTpLLldpbmRvd3NQaG9uZSx2ZXJzaW9uOnR9fX0se3Rlc3Q6Wy93aW5kb3dzIC9pXSxkZXNjcmliZShyKXtjb25zdCB0PWYuZ2V0Rmlyc3RNYXRjaCgvV2luZG93cyAoKE5UfFhQKSggXGRcZD8uXGQpPykvaSxyKSxlPWYuZ2V0V2luZG93c1ZlcnNpb25OYW1lKHQpO3JldHVybntuYW1lOksuV2luZG93cyx2ZXJzaW9uOnQsdmVyc2lvbk5hbWU6ZX19fSx7dGVzdDpbL01hY2ludG9zaCguKj8pIEZ4aU9TKC4qPylcLy9dLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6Sy5pT1N9LGU9Zi5nZXRTZWNvbmRNYXRjaCgvKFZlcnNpb25cLykoXGRbXGQuXSspLyxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9tYWNpbnRvc2gvaV0sZGVzY3JpYmUocil7Y29uc3QgdD1mLmdldEZpcnN0TWF0Y2goL21hYyBvcyB4IChcZCsoXC4/Xz9cZCspKykvaSxyKS5yZXBsYWNlKC9bX1xzXS9nLCIuIiksZT1mLmdldE1hY09TVmVyc2lvbk5hbWUodCkscz17bmFtZTpLLk1hY09TLHZlcnNpb246dH07cmV0dXJuIGUmJihzLnZlcnNpb25OYW1lPWUpLHN9fSx7dGVzdDpbLyhpcG9kfGlwaG9uZXxpcGFkKS9pXSxkZXNjcmliZShyKXtjb25zdCB0PWYuZ2V0Rmlyc3RNYXRjaCgvb3MgKFxkKyhbX1xzXVxkKykqKSBsaWtlIG1hYyBvcyB4L2kscikucmVwbGFjZSgvW19cc10vZywiLiIpO3JldHVybntuYW1lOksuaU9TLHZlcnNpb246dH19fSx7dGVzdChyKXtjb25zdCB0PSFyLnRlc3QoL2xpa2UgYW5kcm9pZC9pKSxlPXIudGVzdCgvYW5kcm9pZC9pKTtyZXR1cm4gdCYmZX0sZGVzY3JpYmUocil7Y29uc3QgdD1mLmdldEZpcnN0TWF0Y2goL2FuZHJvaWRbXHMvLV0oXGQrKFwuXGQrKSopL2ksciksZT1mLmdldEFuZHJvaWRWZXJzaW9uTmFtZSh0KSxzPXtuYW1lOksuQW5kcm9pZCx2ZXJzaW9uOnR9O3JldHVybiBlJiYocy52ZXJzaW9uTmFtZT1lKSxzfX0se3Rlc3Q6Wy8od2VifGhwdylbbzBdcy9pXSxkZXNjcmliZShyKXtjb25zdCB0PWYuZ2V0Rmlyc3RNYXRjaCgvKD86d2VifGhwdylbbzBdc1wvKFxkKyhcLlxkKykqKS9pLHIpLGU9e25hbWU6Sy5XZWJPU307cmV0dXJuIHQmJnQubGVuZ3RoJiYoZS52ZXJzaW9uPXQpLGV9fSx7dGVzdDpbL2JsYWNrYmVycnl8XGJiYlxkKy9pLC9yaW1cc3RhYmxldC9pXSxkZXNjcmliZShyKXtjb25zdCB0PWYuZ2V0Rmlyc3RNYXRjaCgvcmltXHN0YWJsZXRcc29zXHMoXGQrKFwuXGQrKSopL2kscil8fGYuZ2V0Rmlyc3RNYXRjaCgvYmxhY2tiZXJyeVxkK1wvKFxkKyhbX1xzXVxkKykqKS9pLHIpfHxmLmdldEZpcnN0TWF0Y2goL1xiYmIoXGQrKS9pLHIpO3JldHVybntuYW1lOksuQmxhY2tCZXJyeSx2ZXJzaW9uOnR9fX0se3Rlc3Q6Wy9iYWRhL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9Zi5nZXRGaXJzdE1hdGNoKC9iYWRhXC8oXGQrKFwuXGQrKSopL2kscik7cmV0dXJue25hbWU6Sy5CYWRhLHZlcnNpb246dH19fSx7dGVzdDpbL3RpemVuL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9Zi5nZXRGaXJzdE1hdGNoKC90aXplblsvXHNdKFxkKyhcLlxkKykqKS9pLHIpO3JldHVybntuYW1lOksuVGl6ZW4sdmVyc2lvbjp0fX19LHt0ZXN0OlsvbGludXgvaV0sZGVzY3JpYmUoKXtyZXR1cm57bmFtZTpLLkxpbnV4fX19LHt0ZXN0OlsvQ3JPUy9dLGRlc2NyaWJlKCl7cmV0dXJue25hbWU6Sy5DaHJvbWVPU319fSx7dGVzdDpbL1BsYXlTdGF0aW9uIDQvXSxkZXNjcmliZShyKXtjb25zdCB0PWYuZ2V0Rmlyc3RNYXRjaCgvUGxheVN0YXRpb24gNFsvXHNdKFxkKyhcLlxkKykqKS9pLHIpO3JldHVybntuYW1lOksuUGxheVN0YXRpb240LHZlcnNpb246dH19fV0sTGk9W3t0ZXN0OlsvZ29vZ2xlYm90L2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6ImJvdCIsdmVuZG9yOiJHb29nbGUifX19LHt0ZXN0OlsvaHVhd2VpL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9Zi5nZXRGaXJzdE1hdGNoKC8oY2FuLWwwMSkvaSxyKSYmIk5vdmEiLGU9e3R5cGU6Ri5tb2JpbGUsdmVuZG9yOiJIdWF3ZWkifTtyZXR1cm4gdCYmKGUubW9kZWw9dCksZX19LHt0ZXN0OlsvbmV4dXNccyooPzo3fDh8OXwxMCkuKi9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOkYudGFibGV0LHZlbmRvcjoiTmV4dXMifX19LHt0ZXN0OlsvaXBhZC9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOkYudGFibGV0LHZlbmRvcjoiQXBwbGUiLG1vZGVsOiJpUGFkIn19fSx7dGVzdDpbL01hY2ludG9zaCguKj8pIEZ4aU9TKC4qPylcLy9dLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6Ri50YWJsZXQsdmVuZG9yOiJBcHBsZSIsbW9kZWw6ImlQYWQifX19LHt0ZXN0Olsva2Z0dCBidWlsZC9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOkYudGFibGV0LHZlbmRvcjoiQW1hem9uIixtb2RlbDoiS2luZGxlIEZpcmUgSEQgNyJ9fX0se3Rlc3Q6Wy9zaWxrL2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6Ri50YWJsZXQsdmVuZG9yOiJBbWF6b24ifX19LHt0ZXN0OlsvdGFibGV0KD8hIHBjKS9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOkYudGFibGV0fX19LHt0ZXN0KHIpe2NvbnN0IHQ9ci50ZXN0KC9pcG9kfGlwaG9uZS9pKSxlPXIudGVzdCgvbGlrZSAoaXBvZHxpcGhvbmUpL2kpO3JldHVybiB0JiYhZX0sZGVzY3JpYmUocil7Y29uc3QgdD1mLmdldEZpcnN0TWF0Y2goLyhpcG9kfGlwaG9uZSkvaSxyKTtyZXR1cm57dHlwZTpGLm1vYmlsZSx2ZW5kb3I6IkFwcGxlIixtb2RlbDp0fX19LHt0ZXN0OlsvbmV4dXNccypbMC02XS4qL2ksL2dhbGF4eSBuZXh1cy9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOkYubW9iaWxlLHZlbmRvcjoiTmV4dXMifX19LHt0ZXN0OlsvW14tXW1vYmkvaV0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpGLm1vYmlsZX19fSx7dGVzdChyKXtyZXR1cm4gci5nZXRCcm93c2VyTmFtZSghMCk9PT0iYmxhY2tiZXJyeSJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6Ri5tb2JpbGUsdmVuZG9yOiJCbGFja0JlcnJ5In19fSx7dGVzdChyKXtyZXR1cm4gci5nZXRCcm93c2VyTmFtZSghMCk9PT0iYmFkYSJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6Ri5tb2JpbGV9fX0se3Rlc3Qocil7cmV0dXJuIHIuZ2V0QnJvd3Nlck5hbWUoKT09PSJ3aW5kb3dzIHBob25lIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpGLm1vYmlsZSx2ZW5kb3I6Ik1pY3Jvc29mdCJ9fX0se3Rlc3Qocil7Y29uc3QgdD1OdW1iZXIoU3RyaW5nKHIuZ2V0T1NWZXJzaW9uKCkpLnNwbGl0KCIuIilbMF0pO3JldHVybiByLmdldE9TTmFtZSghMCk9PT0iYW5kcm9pZCImJnQ+PTN9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6Ri50YWJsZXR9fX0se3Rlc3Qocil7cmV0dXJuIHIuZ2V0T1NOYW1lKCEwKT09PSJhbmRyb2lkIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpGLm1vYmlsZX19fSx7dGVzdChyKXtyZXR1cm4gci5nZXRPU05hbWUoITApPT09Im1hY29zIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpGLmRlc2t0b3AsdmVuZG9yOiJBcHBsZSJ9fX0se3Rlc3Qocil7cmV0dXJuIHIuZ2V0T1NOYW1lKCEwKT09PSJ3aW5kb3dzIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpGLmRlc2t0b3B9fX0se3Rlc3Qocil7cmV0dXJuIHIuZ2V0T1NOYW1lKCEwKT09PSJsaW51eCJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6Ri5kZXNrdG9wfX19LHt0ZXN0KHIpe3JldHVybiByLmdldE9TTmFtZSghMCk9PT0icGxheXN0YXRpb24gNCJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6Ri50dn19fSx7dGVzdChyKXtyZXR1cm4gci5nZXRPU05hbWUoITApPT09InJva3UifSxkZXNjcmliZSgpe3JldHVybnt0eXBlOkYudHZ9fX1dLE9pPVt7dGVzdChyKXtyZXR1cm4gci5nZXRCcm93c2VyTmFtZSghMCk9PT0ibWljcm9zb2Z0IGVkZ2UifSxkZXNjcmliZShyKXtpZigvXHNlZGdcLy9pLnRlc3QocikpcmV0dXJue25hbWU6c2UuQmxpbmt9O2NvbnN0IGU9Zi5nZXRGaXJzdE1hdGNoKC9lZGdlXC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJue25hbWU6c2UuRWRnZUhUTUwsdmVyc2lvbjplfX19LHt0ZXN0OlsvdHJpZGVudC9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOnNlLlRyaWRlbnR9LGU9Zi5nZXRGaXJzdE1hdGNoKC90cmlkZW50XC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0KHIpe3JldHVybiByLnRlc3QoL3ByZXN0by9pKX0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZTpzZS5QcmVzdG99LGU9Zi5nZXRGaXJzdE1hdGNoKC9wcmVzdG9cLyhcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Qocil7Y29uc3QgdD1yLnRlc3QoL2dlY2tvL2kpLGU9ci50ZXN0KC9saWtlIGdlY2tvL2kpO3JldHVybiB0JiYhZX0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZTpzZS5HZWNrb30sZT1mLmdldEZpcnN0TWF0Y2goL2dlY2tvXC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvKGFwcGxlKT93ZWJraXRcLzUzN1wuMzYvaV0sZGVzY3JpYmUoKXtyZXR1cm57bmFtZTpzZS5CbGlua319fSx7dGVzdDpbLyhhcHBsZSk/d2Via2l0L2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6c2UuV2ViS2l0fSxlPWYuZ2V0Rmlyc3RNYXRjaCgvd2Via2l0XC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19XTtjbGFzcyBGcntjb25zdHJ1Y3Rvcih0LGU9ITEpe2lmKHQ9PW51bGx8fHQ9PT0iIil0aHJvdyBuZXcgRXJyb3IoIlVzZXJBZ2VudCBwYXJhbWV0ZXIgY2FuJ3QgYmUgZW1wdHkiKTt0aGlzLl91YT10LHRoaXMucGFyc2VkUmVzdWx0PXt9LGUhPT0hMCYmdGhpcy5wYXJzZSgpfWdldFVBKCl7cmV0dXJuIHRoaXMuX3VhfXRlc3QodCl7cmV0dXJuIHQudGVzdCh0aGlzLl91YSl9cGFyc2VCcm93c2VyKCl7dGhpcy5wYXJzZWRSZXN1bHQuYnJvd3Nlcj17fTtjb25zdCB0PWYuZmluZChfaSxlPT57aWYodHlwZW9mIGUudGVzdD09ImZ1bmN0aW9uIilyZXR1cm4gZS50ZXN0KHRoaXMpO2lmKGUudGVzdCBpbnN0YW5jZW9mIEFycmF5KXJldHVybiBlLnRlc3Quc29tZShzPT50aGlzLnRlc3QocykpO3Rocm93IG5ldyBFcnJvcigiQnJvd3NlcidzIHRlc3QgZnVuY3Rpb24gaXMgbm90IHZhbGlkIil9KTtyZXR1cm4gdCYmKHRoaXMucGFyc2VkUmVzdWx0LmJyb3dzZXI9dC5kZXNjcmliZSh0aGlzLmdldFVBKCkpKSx0aGlzLnBhcnNlZFJlc3VsdC5icm93c2VyfWdldEJyb3dzZXIoKXtyZXR1cm4gdGhpcy5wYXJzZWRSZXN1bHQuYnJvd3Nlcj90aGlzLnBhcnNlZFJlc3VsdC5icm93c2VyOnRoaXMucGFyc2VCcm93c2VyKCl9Z2V0QnJvd3Nlck5hbWUodCl7cmV0dXJuIHQ/U3RyaW5nKHRoaXMuZ2V0QnJvd3NlcigpLm5hbWUpLnRvTG93ZXJDYXNlKCl8fCIiOnRoaXMuZ2V0QnJvd3NlcigpLm5hbWV8fCIifWdldEJyb3dzZXJWZXJzaW9uKCl7cmV0dXJuIHRoaXMuZ2V0QnJvd3NlcigpLnZlcnNpb259Z2V0T1MoKXtyZXR1cm4gdGhpcy5wYXJzZWRSZXN1bHQub3M/dGhpcy5wYXJzZWRSZXN1bHQub3M6dGhpcy5wYXJzZU9TKCl9cGFyc2VPUygpe3RoaXMucGFyc2VkUmVzdWx0Lm9zPXt9O2NvbnN0IHQ9Zi5maW5kKEFpLGU9PntpZih0eXBlb2YgZS50ZXN0PT0iZnVuY3Rpb24iKXJldHVybiBlLnRlc3QodGhpcyk7aWYoZS50ZXN0IGluc3RhbmNlb2YgQXJyYXkpcmV0dXJuIGUudGVzdC5zb21lKHM9PnRoaXMudGVzdChzKSk7dGhyb3cgbmV3IEVycm9yKCJCcm93c2VyJ3MgdGVzdCBmdW5jdGlvbiBpcyBub3QgdmFsaWQiKX0pO3JldHVybiB0JiYodGhpcy5wYXJzZWRSZXN1bHQub3M9dC5kZXNjcmliZSh0aGlzLmdldFVBKCkpKSx0aGlzLnBhcnNlZFJlc3VsdC5vc31nZXRPU05hbWUodCl7Y29uc3R7bmFtZTplfT10aGlzLmdldE9TKCk7cmV0dXJuIHQ/U3RyaW5nKGUpLnRvTG93ZXJDYXNlKCl8fCIiOmV8fCIifWdldE9TVmVyc2lvbigpe3JldHVybiB0aGlzLmdldE9TKCkudmVyc2lvbn1nZXRQbGF0Zm9ybSgpe3JldHVybiB0aGlzLnBhcnNlZFJlc3VsdC5wbGF0Zm9ybT90aGlzLnBhcnNlZFJlc3VsdC5wbGF0Zm9ybTp0aGlzLnBhcnNlUGxhdGZvcm0oKX1nZXRQbGF0Zm9ybVR5cGUodD0hMSl7Y29uc3R7dHlwZTplfT10aGlzLmdldFBsYXRmb3JtKCk7cmV0dXJuIHQ/U3RyaW5nKGUpLnRvTG93ZXJDYXNlKCl8fCIiOmV8fCIifXBhcnNlUGxhdGZvcm0oKXt0aGlzLnBhcnNlZFJlc3VsdC5wbGF0Zm9ybT17fTtjb25zdCB0PWYuZmluZChMaSxlPT57aWYodHlwZW9mIGUudGVzdD09ImZ1bmN0aW9uIilyZXR1cm4gZS50ZXN0KHRoaXMpO2lmKGUudGVzdCBpbnN0YW5jZW9mIEFycmF5KXJldHVybiBlLnRlc3Quc29tZShzPT50aGlzLnRlc3QocykpO3Rocm93IG5ldyBFcnJvcigiQnJvd3NlcidzIHRlc3QgZnVuY3Rpb24gaXMgbm90IHZhbGlkIil9KTtyZXR1cm4gdCYmKHRoaXMucGFyc2VkUmVzdWx0LnBsYXRmb3JtPXQuZGVzY3JpYmUodGhpcy5nZXRVQSgpKSksdGhpcy5wYXJzZWRSZXN1bHQucGxhdGZvcm19Z2V0RW5naW5lKCl7cmV0dXJuIHRoaXMucGFyc2VkUmVzdWx0LmVuZ2luZT90aGlzLnBhcnNlZFJlc3VsdC5lbmdpbmU6dGhpcy5wYXJzZUVuZ2luZSgpfWdldEVuZ2luZU5hbWUodCl7cmV0dXJuIHQ/U3RyaW5nKHRoaXMuZ2V0RW5naW5lKCkubmFtZSkudG9Mb3dlckNhc2UoKXx8IiI6dGhpcy5nZXRFbmdpbmUoKS5uYW1lfHwiIn1wYXJzZUVuZ2luZSgpe3RoaXMucGFyc2VkUmVzdWx0LmVuZ2luZT17fTtjb25zdCB0PWYuZmluZChPaSxlPT57aWYodHlwZW9mIGUudGVzdD09ImZ1bmN0aW9uIilyZXR1cm4gZS50ZXN0KHRoaXMpO2lmKGUudGVzdCBpbnN0YW5jZW9mIEFycmF5KXJldHVybiBlLnRlc3Quc29tZShzPT50aGlzLnRlc3QocykpO3Rocm93IG5ldyBFcnJvcigiQnJvd3NlcidzIHRlc3QgZnVuY3Rpb24gaXMgbm90IHZhbGlkIil9KTtyZXR1cm4gdCYmKHRoaXMucGFyc2VkUmVzdWx0LmVuZ2luZT10LmRlc2NyaWJlKHRoaXMuZ2V0VUEoKSkpLHRoaXMucGFyc2VkUmVzdWx0LmVuZ2luZX1wYXJzZSgpe3JldHVybiB0aGlzLnBhcnNlQnJvd3NlcigpLHRoaXMucGFyc2VPUygpLHRoaXMucGFyc2VQbGF0Zm9ybSgpLHRoaXMucGFyc2VFbmdpbmUoKSx0aGlzfWdldFJlc3VsdCgpe3JldHVybiBmLmFzc2lnbih7fSx0aGlzLnBhcnNlZFJlc3VsdCl9c2F0aXNmaWVzKHQpe2NvbnN0IGU9e307bGV0IHM9MDtjb25zdCBuPXt9O2xldCBpPTA7aWYoT2JqZWN0LmtleXModCkuZm9yRWFjaChkPT57Y29uc3Qgbz10W2RdO3R5cGVvZiBvPT0ic3RyaW5nIj8obltkXT1vLGkrPTEpOnR5cGVvZiBvPT0ib2JqZWN0IiYmKGVbZF09byxzKz0xKX0pLHM+MCl7Y29uc3QgZD1PYmplY3Qua2V5cyhlKSxvPWYuZmluZChkLGc9PnRoaXMuaXNPUyhnKSk7aWYobyl7Y29uc3QgZz10aGlzLnNhdGlzZmllcyhlW29dKTtpZihnIT09dm9pZCAwKXJldHVybiBnfWNvbnN0IGg9Zi5maW5kKGQsZz0+dGhpcy5pc1BsYXRmb3JtKGcpKTtpZihoKXtjb25zdCBnPXRoaXMuc2F0aXNmaWVzKGVbaF0pO2lmKGchPT12b2lkIDApcmV0dXJuIGd9fWlmKGk+MCl7Y29uc3QgZD1PYmplY3Qua2V5cyhuKSxvPWYuZmluZChkLGg9PnRoaXMuaXNCcm93c2VyKGgsITApKTtpZihvIT09dm9pZCAwKXJldHVybiB0aGlzLmNvbXBhcmVWZXJzaW9uKG5bb10pfX1pc0Jyb3dzZXIodCxlPSExKXtjb25zdCBzPXRoaXMuZ2V0QnJvd3Nlck5hbWUoKS50b0xvd2VyQ2FzZSgpO2xldCBuPXQudG9Mb3dlckNhc2UoKTtjb25zdCBpPWYuZ2V0QnJvd3NlclR5cGVCeUFsaWFzKG4pO3JldHVybiBlJiZpJiYobj1pLnRvTG93ZXJDYXNlKCkpLG49PT1zfWNvbXBhcmVWZXJzaW9uKHQpe2xldCBlPVswXSxzPXQsbj0hMTtjb25zdCBpPXRoaXMuZ2V0QnJvd3NlclZlcnNpb24oKTtpZih0eXBlb2YgaT09InN0cmluZyIpcmV0dXJuIHRbMF09PT0iPiJ8fHRbMF09PT0iPCI/KHM9dC5zdWJzdHIoMSksdFsxXT09PSI9Ij8obj0hMCxzPXQuc3Vic3RyKDIpKTplPVtdLHRbMF09PT0iPiI/ZS5wdXNoKDEpOmUucHVzaCgtMSkpOnRbMF09PT0iPSI/cz10LnN1YnN0cigxKTp0WzBdPT09In4iJiYobj0hMCxzPXQuc3Vic3RyKDEpKSxlLmluZGV4T2YoZi5jb21wYXJlVmVyc2lvbnMoaSxzLG4pKT4tMX1pc09TKHQpe3JldHVybiB0aGlzLmdldE9TTmFtZSghMCk9PT1TdHJpbmcodCkudG9Mb3dlckNhc2UoKX1pc1BsYXRmb3JtKHQpe3JldHVybiB0aGlzLmdldFBsYXRmb3JtVHlwZSghMCk9PT1TdHJpbmcodCkudG9Mb3dlckNhc2UoKX1pc0VuZ2luZSh0KXtyZXR1cm4gdGhpcy5nZXRFbmdpbmVOYW1lKCEwKT09PVN0cmluZyh0KS50b0xvd2VyQ2FzZSgpfWlzKHQsZT0hMSl7cmV0dXJuIHRoaXMuaXNCcm93c2VyKHQsZSl8fHRoaXMuaXNPUyh0KXx8dGhpcy5pc1BsYXRmb3JtKHQpfXNvbWUodD1bXSl7cmV0dXJuIHQuc29tZShlPT50aGlzLmlzKGUpKX19LyohCiAqIEJvd3NlciAtIGEgYnJvd3NlciBkZXRlY3RvcgogKiBodHRwczovL2dpdGh1Yi5jb20vbGFuY2VkaWtzb24vYm93c2VyCiAqIE1JVCBMaWNlbnNlIHwgKGMpIER1c3RpbiBEaWF6IDIwMTItMjAxNQogKiBNSVQgTGljZW5zZSB8IChjKSBEZW5pcyBEZW1jaGVua28gMjAxNS0yMDE5CiAqL2NsYXNzIERpe3N0YXRpYyBnZXRQYXJzZXIodCxlPSExKXtpZih0eXBlb2YgdCE9InN0cmluZyIpdGhyb3cgbmV3IEVycm9yKCJVc2VyQWdlbnQgc2hvdWxkIGJlIGEgc3RyaW5nIik7cmV0dXJuIG5ldyBGcih0LGUpfXN0YXRpYyBwYXJzZSh0KXtyZXR1cm4gbmV3IEZyKHQpLmdldFJlc3VsdCgpfXN0YXRpYyBnZXQgQlJPV1NFUl9NQVAoKXtyZXR1cm4gQnJ9c3RhdGljIGdldCBFTkdJTkVfTUFQKCl7cmV0dXJuIHNlfXN0YXRpYyBnZXQgT1NfTUFQKCl7cmV0dXJuIEt9c3RhdGljIGdldCBQTEFURk9STVNfTUFQKCl7cmV0dXJuIEZ9fWNvbnN0IEVlPSJjaHJvbWUiLHhyPSJvcGVyYSIsanI9ImZpcmVmb3giLFVyPSJpZXhwbG9yZXIiLEhyPSJzYWZhcmkiLEtyPSJud2pzIixXcj0iZWxlY3Ryb24iLHpyPSJyZWFjdC1uYXRpdmUiLFB0PSJ1bmtub3duIixjdD17Q2hyb21lOkVlLENocm9taXVtOkVlLE9wZXJhOnhyLEZpcmVmb3g6anIsIkludGVybmV0IEV4cGxvcmVyIjpVcixTYWZhcmk6SHJ9O2Z1bmN0aW9uIE5pKCl7Y29uc3R7dXNlckFnZW50OnJ9PW5hdmlnYXRvcix0PXtuYW1lOlB0LHZlcnNpb246dm9pZCAwfTtpZihyLm1hdGNoKC9DaHJvbWUvKSYmIXIubWF0Y2goL0VkZ2UvKSlpZihyLm1hdGNoKC9FZGcoQT8pLykpe2NvbnN0IGU9ci5tYXRjaCgvQ2hyb21lXC8oW1xkLl0rKS8pWzFdO051bWJlci5wYXJzZUludChlLDEwKT43MiYmKHQubmFtZT1FZSx0LnZlcnNpb249ZSl9ZWxzZSB0Lm5hbWU9RWUsdC52ZXJzaW9uPXIubWF0Y2goL0Nocm9tZVwvKFtcZC5dKykvKVsxXTtyZXR1cm4gdH1mdW5jdGlvbiBWaSgpe2NvbnN0e3VzZXJBZ2VudDpyfT1uYXZpZ2F0b3I7aWYoci5tYXRjaCgvRWxlY3Ryb24vKSl7Y29uc3QgdD1yLm1hdGNoKC9FbGVjdHJvblwvKFtcZC5dKykvKVsxXTtyZXR1cm57bmFtZTpXcix2ZXJzaW9uOnR9fXJldHVybiBudWxsfWZ1bmN0aW9uIEJpKCl7Y29uc3R7dXNlckFnZW50OnJ9PW5hdmlnYXRvcjtpZihyLm1hdGNoKC9KaXRzaU1lZXROVy8pKXtjb25zdCB0PXIubWF0Y2goL0ppdHNpTWVldE5XXC8oW1xkLl0rKS8pWzFdO3JldHVybntuYW1lOktyLHZlcnNpb246dH19fWZ1bmN0aW9uIEZpKCl7Y29uc3Qgcj1uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9cYihyZWFjdFsgXHRfLV0qbmF0aXZlKSg/OlwvKFxTKykpPy9pKTtsZXQgdDtpZihyfHxuYXZpZ2F0b3IucHJvZHVjdD09PSJSZWFjdE5hdGl2ZSIpcmV0dXJuIHImJnIubGVuZ3RoPjImJihyWzFdLHQ9clsyXSksdHx8KHQ9InVua25vd24iKSx7bmFtZTp6cix2ZXJzaW9uOnR9fWZ1bmN0aW9uIHhpKHIpe2xldCB0O2NvbnN0IGU9W0ZpLFZpLEJpXTtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rPTEpaWYodD1lW25dKCksdClyZXR1cm4gdDtjb25zdCBzPXIuZ2V0QnJvd3Nlck5hbWUoKTtyZXR1cm4gcyBpbiBjdD97bmFtZTpjdFtzXSx2ZXJzaW9uOnIuZ2V0QnJvd3NlclZlcnNpb24oKX06KHQ9TmkoKSx0fHx7bmFtZTpQdCx2ZXJzaW9uOnZvaWQgMH0pfWNsYXNzIGppe2NvbnN0cnVjdG9yKCl7dSh0aGlzLCJfYm93c2VyIik7dSh0aGlzLCJfbmFtZSIpO3UodGhpcywiX3ZlcnNpb24iKTt1KHRoaXMsImdldERldmljZUluZm8iLCgpPT4oe2lzTW9iaWxlOnRoaXMuaXNNb2JpbGUoKSxicm93c2VyTmFtZTp0aGlzLl9ib3dzZXIuZ2V0QnJvd3Nlck5hbWUoKSxvc05hbWU6dGhpcy5fYm93c2VyLmdldE9TTmFtZSgpLGJyb3dzZXJWZXJzaW9uOnRoaXMuX2Jvd3Nlci5nZXRCcm93c2VyVmVyc2lvbigpLG9zVmVyc2lvbk5hbWU6dGhpcy5fYm93c2VyLmdldE9TVmVyc2lvbigpLGVuZ2luZU5hbWU6dGhpcy5fYm93c2VyLmdldEVuZ2luZU5hbWUoKX0pKX1pbml0KHQpe2xldCBlLHM7aWYodGhpcy5fYm93c2VyPURpLmdldFBhcnNlcihuYXZpZ2F0b3IudXNlckFnZW50KSx0eXBlb2YgdD09InVuZGVmaW5lZCIpe2NvbnN0IG49eGkodGhpcy5fYm93c2VyKTtlPW4ubmFtZSxzPW4udmVyc2lvbn1lbHNlIHQubmFtZSBpbiBjdD8oZT1jdFt0Lm5hbWVdLHM9dC52ZXJzaW9uKTooZT1QdCxzPXZvaWQgMCk7dGhpcy5fbmFtZT1lLHRoaXMuX3ZlcnNpb249c31nZXROYW1lKCl7cmV0dXJuIHRoaXMuX25hbWV9aXNDaHJvbWUoKXtyZXR1cm4gdGhpcy5fbmFtZT09PUVlfWlzT3BlcmEoKXtyZXR1cm4gdGhpcy5fbmFtZT09PXhyfWlzRmlyZWZveCgpe3JldHVybiB0aGlzLl9uYW1lPT09anJ9aXNJRXhwbG9yZXIoKXtyZXR1cm4gdGhpcy5fbmFtZT09PVVyfWlzU2FmYXJpKCl7cmV0dXJuIHRoaXMuX25hbWU9PT1Icn1pc05XSlMoKXtyZXR1cm4gdGhpcy5fbmFtZT09PUtyfWlzRWxlY3Ryb24oKXtyZXR1cm4gdGhpcy5fbmFtZT09PVdyfWlzUmVhY3ROYXRpdmUoKXtyZXR1cm4gdGhpcy5fbmFtZT09PXpyfHxuYXZpZ2F0b3IuaXNSZWFjdE5hdGl2ZT09PSEwfWdldFZlcnNpb24oKXtyZXR1cm4gdGhpcy5fdmVyc2lvbn1pc01vYmlsZSgpe3JldHVybiB0aGlzLl9ib3dzZXIuZ2V0UGxhdGZvcm1UeXBlKCk9PT0ibW9iaWxlIn1fY2hlY2tDb25kaXRpb24odCl7aWYodGhpcy5fdmVyc2lvbilyZXR1cm4gdGhpcy5fYm93c2VyLnNhdGlzZmllcyh0KX1pc1ZlcnNpb25HcmVhdGVyVGhhbih0KXtyZXR1cm4gdGhpcy5fY2hlY2tDb25kaXRpb24oe1t0aGlzLl9uYW1lXTpgPiR7dH1gfSl9aXNWZXJzaW9uTGVzc1RoYW4odCl7cmV0dXJuIHRoaXMuX2NoZWNrQ29uZGl0aW9uKHtbdGhpcy5fbmFtZV06YDwke3R9YH0pfWlzVmVyc2lvbkVxdWFsVG8odCl7cmV0dXJuIHRoaXMuX2NoZWNrQ29uZGl0aW9uKHtbdGhpcy5fbmFtZV06YH4ke3R9YH0pfX1jbGFzcyBVaSBleHRlbmRzIGppe2RvZXNWaWRlb011dGVCeVN0cmVhbVJlbW92ZSgpe3JldHVybiB0aGlzLmlzQ2hyb21pdW1CYXNlZCgpfHx0aGlzLmlzV2ViS2l0QmFzZWQoKX1zdXBwb3J0c1AyUCgpe3JldHVybiF0aGlzLnVzZXNVbmlmaWVkUGxhbigpfWlzQ2hyb21pdW1CYXNlZCgpe3JldHVybiB0aGlzLmlzQ2hyb21lKCl8fHRoaXMuaXNFbGVjdHJvbigpfHx0aGlzLmlzTldKUygpfHx0aGlzLmlzT3BlcmEoKX1pc1dlYktpdEJhc2VkKCl7cmV0dXJuIHRoaXMuX2Jvd3Nlci5pc0VuZ2luZSgid2Via2l0IikmJnR5cGVvZiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzIT0idW5kZWZpbmVkIiYmdHlwZW9mIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhIT0idW5kZWZpbmVkIiYmdHlwZW9mIHdpbmRvdy5SVENSdHBUcmFuc2NlaXZlciE9InVuZGVmaW5lZCImJk9iamVjdC5rZXlzKFJUQ1J0cFRyYW5zY2VpdmVyLnByb3RvdHlwZSkuaW5kZXhPZigiY3VycmVudERpcmVjdGlvbiIpPi0xfWlzU3VwcG9ydGVkKCl7cmV0dXJuIHR5cGVvZiBSVENQZWVyQ29ubmVjdGlvbiE9InVuZGVmaW5lZCJ9aXNVc2VySW50ZXJhY3Rpb25SZXF1aXJlZEZvclVubXV0ZSgpe3JldHVybiB0aGlzLmlzRmlyZWZveCgpJiZ0aGlzLmlzVmVyc2lvbkxlc3NUaGFuKCI2OCIpfXN1cHBvcnRzVmlkZW9NdXRlT25Db25uSW50ZXJydXB0ZWQoKXtyZXR1cm4gdGhpcy5pc0Nocm9taXVtQmFzZWQoKXx8dGhpcy5pc1JlYWN0TmF0aXZlKCl8fHRoaXMuaXNXZWJLaXRCYXNlZCgpfXN1cHBvcnRzQmFuZHdpZHRoU3RhdGlzdGljcygpe3JldHVybiF0aGlzLmlzRmlyZWZveCgpJiYhdGhpcy5pc1dlYktpdEJhc2VkKCl9c3VwcG9ydHNDb2RlY1ByZWZlcmVuY2VzKCl7cmV0dXJuIHRoaXMudXNlc1VuaWZpZWRQbGFuKCkmJnR5cGVvZiB3aW5kb3cuUlRDUnRwVHJhbnNjZWl2ZXIhPSJ1bmRlZmluZWQiJiZPYmplY3Qua2V5cyh3aW5kb3cuUlRDUnRwVHJhbnNjZWl2ZXIucHJvdG90eXBlKS5pbmRleE9mKCJzZXRDb2RlY1ByZWZlcmVuY2VzIik+LTEmJk9iamVjdC5rZXlzKFJUQ1J0cFNlbmRlci5wcm90b3R5cGUpLmluZGV4T2YoImdldENhcGFiaWxpdGllcyIpPi0xJiYhdGhpcy5pc1dlYktpdEJhc2VkKCl9c3VwcG9ydHNEZXZpY2VDaGFuZ2VFdmVudCgpe3JldHVybiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzJiZ0eXBlb2YgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5vbmRldmljZWNoYW5nZSE9InVuZGVmaW5lZCImJnR5cGVvZiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmFkZEV2ZW50TGlzdGVuZXIhPSJ1bmRlZmluZWQifXN1cHBvcnRzTG9jYWxDYW5kaWRhdGVSdHRTdGF0aXN0aWNzKCl7cmV0dXJuIHRoaXMuaXNDaHJvbWl1bUJhc2VkKCl8fHRoaXMuaXNSZWFjdE5hdGl2ZSgpfHx0aGlzLmlzV2ViS2l0QmFzZWQoKX1zdXBwb3J0c1BlcmZvcm1hbmNlT2JzZXJ2ZXIoKXtyZXR1cm4gdHlwZW9mIHdpbmRvdy5QZXJmb3JtYW5jZU9ic2VydmVyIT0idW5kZWZpbmVkIiYmUGVyZm9ybWFuY2VPYnNlcnZlci5zdXBwb3J0ZWRFbnRyeVR5cGVzLmluZGV4T2YoImxvbmd0YXNrIik+LTF9c3VwcG9ydHNSZWNlaXZlclN0YXRzKCl7cmV0dXJuIHR5cGVvZiB3aW5kb3cuUlRDUnRwUmVjZWl2ZXIhPSJ1bmRlZmluZWQiJiZPYmplY3Qua2V5cyhSVENSdHBSZWNlaXZlci5wcm90b3R5cGUpLmluZGV4T2YoImdldFN5bmNocm9uaXphdGlvblNvdXJjZXMiKT4tMX1zdXBwb3J0c1JUVFN0YXRpc3RpY3MoKXtyZXR1cm4hdGhpcy5pc0ZpcmVmb3goKX11c2VzUGxhbkIoKXtyZXR1cm4hdGhpcy51c2VzVW5pZmllZFBsYW4oKX11c2VzU2RwTXVuZ2luZ0ZvclNpbXVsY2FzdCgpe3JldHVybiB0aGlzLmlzQ2hyb21pdW1CYXNlZCgpfHx0aGlzLmlzUmVhY3ROYXRpdmUoKXx8dGhpcy5pc1dlYktpdEJhc2VkKCl9dXNlc1VuaWZpZWRQbGFuKCl7cmV0dXJuISEodGhpcy5pc0ZpcmVmb3goKXx8dGhpcy5pc1dlYktpdEJhc2VkKCkpfXVzZXNOZXdHdW1GbG93KCl7cmV0dXJuISEodGhpcy5pc0Nocm9taXVtQmFzZWQoKXx8dGhpcy5pc0ZpcmVmb3goKXx8dGhpcy5pc1dlYktpdEJhc2VkKCkpfXVzZXNBZGFwdGVyKCl7cmV0dXJuIHRoaXMudXNlc05ld0d1bUZsb3coKX11c2VzUmlkc0ZvclNpbXVsY2FzdCgpe3JldHVybiExfXN1cHBvcnRzR2V0RGlzcGxheU1lZGlhKCl7cmV0dXJuIHR5cGVvZiBuYXZpZ2F0b3IuZ2V0RGlzcGxheU1lZGlhIT0idW5kZWZpbmVkInx8dHlwZW9mIG5hdmlnYXRvci5tZWRpYURldmljZXMhPSJ1bmRlZmluZWQiJiZ0eXBlb2YgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXREaXNwbGF5TWVkaWEhPSJ1bmRlZmluZWQifXN1cHBvcnRzSW5zZXJ0YWJsZVN0cmVhbXMoKXtpZighKHR5cGVvZiB3aW5kb3cuUlRDUnRwU2VuZGVyIT0idW5kZWZpbmVkIiYmKHdpbmRvdy5SVENSdHBTZW5kZXIucHJvdG90eXBlLmNyZWF0ZUVuY29kZWRTdHJlYW1zfHx3aW5kb3cuUlRDUnRwU2VuZGVyLnByb3RvdHlwZS5jcmVhdGVFbmNvZGVkVmlkZW9TdHJlYW1zKSkpcmV0dXJuITE7Y29uc3QgdD1uZXcgUmVhZGFibGVTdHJlYW07dHJ5e3JldHVybiB3aW5kb3cucG9zdE1lc3NhZ2UodCwiKiIsW3RdKSwhMH1jYXRjaChlKXtyZXR1cm4hMX19c3VwcG9ydHNBdWRpb1JlZCgpe3JldHVybiBCb29sZWFuKHdpbmRvdy5SVENSdHBTZW5kZXImJndpbmRvdy5SVENSdHBTZW5kZXIuZ2V0Q2FwYWJpbGl0aWVzJiZ3aW5kb3cuUlRDUnRwU2VuZGVyLmdldENhcGFiaWxpdGllcygiYXVkaW8iKS5jb2RlY3Muc29tZSh0PT50Lm1pbWVUeXBlPT09ImF1ZGlvL3JlZCIpJiZ3aW5kb3cuUlRDUnRwUmVjZWl2ZXImJndpbmRvdy5SVENSdHBSZWNlaXZlci5nZXRDYXBhYmlsaXRpZXMmJndpbmRvdy5SVENSdHBSZWNlaXZlci5nZXRDYXBhYmlsaXRpZXMoImF1ZGlvIikuY29kZWNzLnNvbWUodD0+dC5taW1lVHlwZT09PSJhdWRpby9yZWQiKSl9c3VwcG9ydHNTZHBTZW1hbnRpY3MoKXtyZXR1cm4gdGhpcy5pc0Nocm9taXVtQmFzZWQoKX1fZ2V0Q2hyb21pdW1CYXNlZFZlcnNpb24oKXtpZih0aGlzLmlzQ2hyb21pdW1CYXNlZCgpKXtpZih0aGlzLmlzTldKUygpKXJldHVybiBOdW1iZXIucGFyc2VJbnQocHJvY2Vzcy52ZXJzaW9ucy5jaHJvbWl1bSwxMCk7Y29uc3QgdD1uYXZpZ2F0b3IudXNlckFnZW50O2lmKHQubWF0Y2goL0Nocm9tZS8pKXJldHVybiBOdW1iZXIucGFyc2VJbnQodC5tYXRjaCgvQ2hyb21lXC8oW1xkLl0rKS8pWzFdLDEwKX1yZXR1cm4tMX1pc0lPU01vYmlsZSgpe3JldHVybiB0aGlzLmlzTW9iaWxlJiZ0aGlzLl9ib3dzZXIuZ2V0T1NOYW1lKCk9PT0iaU9TIn19Y29uc3QgSGk9bmV3IFVpO2NsYXNzIEtpe2NvbnN0cnVjdG9yKCl7dSh0aGlzLCJsb2dzQ2FjaGUiLFtdKTt1KHRoaXMsImxvZ3NQcm9jZXNzb3JUaW1lciIpO3UodGhpcywiY29tcHJlc3Npb25TdXBwb3J0ZWQiLG51bGwpO3UodGhpcywidHJhY2luZ0VuYWJsZWQiLCEwKTt1KHRoaXMsImluaXRpYWxpemVkIiwhMSk7dSh0aGlzLCJsb2dMZXZlbCIsImxvZyIpO3UodGhpcywibG9nc1Byb2Nlc3NpbmdJbnRlcnZhbCIsN2UzKTt1KHRoaXMsImxvZ0V4Y2x1c2lvbkxpc3QiLFsibWVzc2FnZSIsIndlYnNvY2tldC9tZXNzYWdlIiwicm9vbU1lc3NhZ2UiLCJ3ZWJzb2NrZXQvcm9vbS1tZXNzYWdlIiwid2Vic29ja2V0L3Jvb20tbGVnYWN5LW1vZGUiLCJjaGF0TWVzc2FnZSIsIndlYnNvY2tldC9uZXctY2hhdC1tZXNzYWdlIiwid2Vic29ja2V0L25vLWFjdGl2ZS1zcGVha2VyIiwid2Vic29ja2V0L3NlbGVjdGVkLXBlZXJzIiwid2Vic29ja2V0L2FjdGl2ZS1zcGVha2VyIiwicGluZyIsIndlYnNvY2tldC9uZXctY29uc3VtZXIiLCJ3ZWJzb2NrZXQvcHJvZHVjZXItc2NvcmUiLCJ3ZWJzb2NrZXQvY29uc3VtZXItc2NvcmUiLCJ3ZWJzb2NrZXQvcGx1Z2luLWV2ZW50Iiwid2Vic29ja2V0L3BsdWdpbi1kYXRhIiwid2Vic29ja2V0L3BsdWdpbi1pbnRlcm5hbC1kYXRhIl0pO3UodGhpcywibWVldGluZ01ldGFkYXRhIix7fSl9aXNDb21wcmVzc2lvblN1cHBvcnRlZCgpe2lmKHRoaXMuY29tcHJlc3Npb25TdXBwb3J0ZWQ9PT1udWxsKXRyeXt0aGlzLmNvbXByZXNzaW9uU3VwcG9ydGVkPXR5cGVvZiBDb21wcmVzc2lvblN0cmVhbSE9InVuZGVmaW5lZCImJnR5cGVvZiBCbG9iIT0idW5kZWZpbmVkIiYmdHlwZW9mIEJsb2IucHJvdG90eXBlLnN0cmVhbT09ImZ1bmN0aW9uIiYmdHlwZW9mIFJlc3BvbnNlIT0idW5kZWZpbmVkIn1jYXRjaCh0KXt0aGlzLmNvbXByZXNzaW9uU3VwcG9ydGVkPSExLHRoaXMuYWRkTG9nSW5DdXJyZW50U3Bhbigid2FybiIsIkNvbXByZXNzaW9uIGZlYXR1cmUgZGV0ZWN0aW9uIGZhaWxlZCwgdXNpbmcgdW5jb21wcmVzc2VkIGxvZ3MiLHtlcnJvcjp0fSl9cmV0dXJuIHRoaXMuY29tcHJlc3Npb25TdXBwb3J0ZWR9Z2V0IGxvZ3NFbmRwb2ludCgpe2NvbnN0IHQ9VGUuZ2V0Q29udGV4dCh0aGlzLm1lZXRpbmdNZXRhZGF0YS5wZWVySWQpO3JldHVybmBodHRwczovLyR7SWkoe3NlcnZpY2VQcmVmaXg6ImFwaS1zaWxvcyIsYmFzZVVSSTp0LmdldFZhbHVlKCJiYXNlVVJJIil9KX0vb3RlbC9sb2dzYH1nZXQgbG9nc0JhdGNoU2l6ZSgpe3JldHVybiB0aGlzLmlzQ29tcHJlc3Npb25TdXBwb3J0ZWQoKT81MDoyNX1yZXNldFBlZXJJZCh0KXt0aGlzLm1lZXRpbmdNZXRhZGF0YS5wZWVySWQ9dH1pbml0KHQsZSxzLG4pe3RoaXMudHJhY2luZ0VuYWJsZWQ9ITAsdGhpcy5pbml0aWFsaXplZD0hMSxuJiYodGhpcy5sb2dMZXZlbD1uKSx0aGlzLmxvZ3NDYWNoZT1bXTtjb25zdCBpPXQuZ2V0VmFsdWUoInBlZXJJZCIpO3RoaXMubWVldGluZ01ldGFkYXRhPWUsdGhpcy50cmFjaW5nRW5hYmxlZD1zLHRoaXMubWVldGluZ01ldGFkYXRhLnBlZXJJZD1pLHRoaXMubWVldGluZ01ldGFkYXRhLnNka1ZlcnNpb249dC5nZXRWYWx1ZSgic2RrVmVyc2lvbiIpO2NvbnN0e1JORGV2aWNlSW5mb0ltcGw6YX09bmF2aWdhdG9yO3RoaXMubWVldGluZ01ldGFkYXRhLmRldmljZUluZm89bmF2aWdhdG9yLmlzUmVhY3ROYXRpdmU/YT09bnVsbD92b2lkIDA6YS5nZXREZXZpY2VJbmZvKCk6SGkuZ2V0RGV2aWNlSW5mbygpLHRoaXMubWVldGluZ01ldGFkYXRhLnZpc2l0ZWRVcmw9IW5hdmlnYXRvci5pc1JlYWN0TmF0aXZlJiZ0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmd2luZG93LmxvY2F0aW9uLmhyZWYsdGhpcy5sb2dzUHJvY2Vzc29yVGltZXI9c2V0SW50ZXJ2YWwoKCk9PnRoaXMucHJvY2Vzc0NhY2hlZExvZ3MoKS5jYXRjaCgoKT0+e30pLHRoaXMubG9nc1Byb2Nlc3NpbmdJbnRlcnZhbCkscyYmKHRoaXMuaW5pdGlhbGl6ZWQ9ITApfXN0YXRpYyB0cmFjZSh0LGU9dm9pZCAwKXtyZXR1cm4ocyxuLGkpPT57Y29uc3QgYT1pLnZhbHVlO3JldHVybiBpLnZhbHVlPWZ1bmN0aW9uKC4uLm8pe2NvbnN0IGg9dGhpcz09bnVsbD92b2lkIDA6dGhpcy50ZWxlbWV0cnk7aWYoIWh8fCFoLmluaXRpYWxpemVkfHxuYXZpZ2F0b3IuaXNSZWFjdE5hdGl2ZXx8IWgudHJhY2luZ0VuYWJsZWQpcmV0dXJuIGEuYXBwbHkodGhpcyxvKTtoLmFkZExvZ0luQ3VycmVudFNwYW4oImluZm8iLHQsZSk7Y29uc3QgZz1wZXJmb3JtYW5jZS5ub3coKSxiPWEuYXBwbHkodGhpcyxvKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGIpLnRoZW4oKCk9Pntjb25zdCBUPXBlcmZvcm1hbmNlLm5vdygpO1QtZz4xMCYmaC5hZGRMb2dJbkN1cnJlbnRTcGFuKCJpbmZvIixgJHt0fV90aW1pbmdgLHtleGVjVGltZTpULWd9KX0pLmNhdGNoKCgpPT57Y29uc3QgVD1wZXJmb3JtYW5jZS5ub3coKTtoLmFkZExvZ0luQ3VycmVudFNwYW4oImluZm8iLGAke3R9X3RpbWluZ2Ase2V4ZWNUaW1lOlQtZ30pfSksYn0saX19aW5qZWN0Q29udGV4dCh0KXt2YXIgbjtjb25zdCBlPU5zKCkucmVwbGFjZSgvLS9nLCIiKS5zdWJzdHJpbmcoMCwxNikscz0obj10aGlzLm1lZXRpbmdNZXRhZGF0YS5wZWVySWQpPT1udWxsP3ZvaWQgMDpuLnJlcGxhY2UoLy0vZywiIik7dC5UUkFDRVBBUkVOVD1gMDAtJHtzfS0ke2V9LTAxYH1hZGRMb2dJbkN1cnJlbnRTcGFuKHQsZSxzPXt9LG49ITEpe3MhPW51bGwmJnMuZXJyb3ImJk9iamVjdC5hc3NpZ24ocyx7ZXJyb3I6b3Qocy5lcnJvcil9KTtjb25zdCBpPVRlLmdldENvbnRleHQodGhpcy5tZWV0aW5nTWV0YWRhdGEucGVlcklkKTtpZihEcihpKSYmKENpKHMpP2NvbnNvbGVbdF0oIkludGVybmFsTG9nczo6ICIsdCxlKTpjb25zb2xlW3RdKCJJbnRlcm5hbExvZ3M6OiAiLHQsZSxzKSksISFraShpLHQpKXRyeXtjb25zdCBkPVZyKGksZSxzLCJtZXRhZGF0YSIpLG89bmV3IERhdGUsaD1RZShHKHttZXNzYWdlOmUsbGV2ZWw6dH0sZCkse2xvZ2dlZEF0Om8udG9JU09TdHJpbmcoKSxsb2dnZWRBdFR6T2Zmc2V0Om8uZ2V0VGltZXpvbmVPZmZzZXQoKX0pO24/dGhpcy5zZW5kT3RlbExvZ3NUb05ld1JlbGljKFtoXSx7aXNJbkRlc3RydWN0aW9uTW9kZTohMX0pLmNhdGNoKCgpPT57fSk6dGhpcy5sb2dzQ2FjaGUucHVzaChoKX1jYXRjaChkKXt0aGlzLmFkZExvZ0luQ3VycmVudFNwYW4oImVycm9yIiwib3BlbnRlbGVtZXRyeTo6YWRkTG9nSW5DdXJyZW50U3Bhbl9mYWlsZWQiLHtlcnJvcjpvdChkKX0pfX1zZW5kT3RlbExvZ3NUb05ld1JlbGljKHMpe3JldHVybiB3KHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKih0LHtpc0luRGVzdHJ1Y3Rpb25Nb2RlOmU9ITF9PXtpc0luRGVzdHJ1Y3Rpb25Nb2RlOiExfSl7Y29uc3Qgbj1uZXcgQWJvcnRDb250cm9sbGVyLGk9c2V0VGltZW91dCgoKT0+bi5hYm9ydCgiTG9ncyByZXF1ZXN0IHRpbWVkIG91dCBhZnRlciA4IHNlY29uZHMiKSw4ZTMpO3RyeXtjb25zdCBhPVRlLmdldENvbnRleHQodGhpcy5tZWV0aW5nTWV0YWRhdGEucGVlcklkKSxkPUpTT04uc3RyaW5naWZ5KHttZWV0aW5nTWV0YWRhdGE6VnIoYSwic2VuZE90ZWxMb2dzVG9OZXdSZWxpYyIsdGhpcy5tZWV0aW5nTWV0YWRhdGEsIm1lZXRpbmdNZXRhZGF0YSIpLHNlcnZpY2VOYW1lOmEuZ2V0VmFsdWUoInNka05hbWUiKSxsb2dzOnR9KTtsZXQgbztjb25zdCBoPXtBdXRob3JpemF0aW9uOmBCZWFyZXIgJHthLmdldFZhbHVlKCJhdXRoVG9rZW4iKX1gfTtpZih0aGlzLmlzQ29tcHJlc3Npb25TdXBwb3J0ZWQoKSl7Y29uc3QgZz1uZXcgQmxvYihbZF0pLnN0cmVhbSgpLnBpcGVUaHJvdWdoKG5ldyBDb21wcmVzc2lvblN0cmVhbSgiZ3ppcCIpKTtvPXlpZWxkIG5ldyBSZXNwb25zZShnKS5hcnJheUJ1ZmZlcigpLGhbIkNvbnRlbnQtVHlwZSJdPSJhcHBsaWNhdGlvbi9nemlwIixoWyJDb250ZW50LUVuY29kaW5nIl09Imd6aXAifWVsc2Ugbz1kLGhbIkNvbnRlbnQtVHlwZSJdPSJhcHBsaWNhdGlvbi9qc29uIjt5aWVsZCBmZXRjaCh0aGlzLmxvZ3NFbmRwb2ludCx7bWV0aG9kOiJQT1NUIixoZWFkZXJzOmgsYm9keTpvLHNpZ25hbDpuLnNpZ25hbCxrZWVwYWxpdmU6ISFlfSl9Y2F0Y2goYSl7ZXx8KHRoaXMuYWRkTG9nSW5DdXJyZW50U3BhbigiZXJyb3IiLCJvcGVudGVsZW1ldHJ5OjpzZW5kT3RlbExvZ1RvTmV3UmVsaWNfZmFpbGVkIix7ZXJyb3I6b3QoYSl9KSx0aGlzLmxvZ3NDYWNoZS5wdXNoKC4uLnQpKX1maW5hbGx5e2NsZWFyVGltZW91dChpKX19KX1wcm9jZXNzQ2FjaGVkTG9ncygpe3JldHVybiB3KHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKih7aXNJbkRlc3RydWN0aW9uTW9kZTp0PSExfT17aXNJbkRlc3RydWN0aW9uTW9kZTohMX0pe2NvbnN0IGU9dGhpcy5sb2dzQ2FjaGUuc3BsaWNlKDAsdGhpcy5sb2dzQmF0Y2hTaXplKTtlIT1udWxsJiZlLmxlbmd0aCYmKHlpZWxkIHRoaXMuc2VuZE90ZWxMb2dzVG9OZXdSZWxpYyhlLHtpc0luRGVzdHJ1Y3Rpb25Nb2RlOnR9KSl9KX1kZXN0cnVjdCgpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXtmb3IoY2xlYXJJbnRlcnZhbCh0aGlzLmxvZ3NQcm9jZXNzb3JUaW1lcik7dGhpcy5sb2dzQ2FjaGUubGVuZ3RoOyl5aWVsZCB0aGlzLnByb2Nlc3NDYWNoZWRMb2dzKHtpc0luRGVzdHJ1Y3Rpb25Nb2RlOiEwfSl9KX19ZnVuY3Rpb24gV2kocil7Y29uc3QgdD1HKHt9LHIpLGU9bmV3IE1hcCxzPShoLGcpPT4oZS5oYXMoaCl8fGUuc2V0KGgsbmV3IFNldCksZS5nZXQoaCkuYWRkKGcpLCgpPT57dmFyIGI7cmV0dXJuKGI9ZS5nZXQoaCkpPT1udWxsP3ZvaWQgMDpiLmRlbGV0ZShnKX0pLG49KGgsZyk9Pnt2YXIgYjsoYj1lLmdldChoKSk9PW51bGx8fGIuZGVsZXRlKGcpfSxpPWg9Pnt2YXIgZzsoZz1lLmdldChoKSk9PW51bGx8fGcuZm9yRWFjaChiPT57dHJ5e2IodFtoXSl9Y2F0Y2goVCl7fX0pfTtyZXR1cm57c3Vic2NyaWJlOnMsdW5zdWJzY3JpYmU6bixub3RpZnk6aSxzZXRWYWx1ZTooaCxnLGI9ITApPT57dFtoXT1nLGImJmkoaCl9LGdldFZhbHVlOmg9PnRbaF0sZ2V0QWxsVmFsdWVzOigpPT50fX1jbGFzcyB6aXtjb25zdHJ1Y3Rvcigpe3UodGhpcywiY29udGV4dHMiLG5ldyBNYXApO3UodGhpcywibW9zdFJlY2VudFBlZXJJZCIsbnVsbCl9Y3JlYXRlQ29udGV4dCh0LGUpe2lmKHRoaXMuY29udGV4dHMuaGFzKHQpKXJldHVybiB0aGlzLmNvbnRleHRzLmdldCh0KTtjb25zdCBzPW5ldyBLaSxuPW5ldyBNczt0aGlzLmNvbnRleHRzLnNldCh0LFdpKGUpKSx0aGlzLmNvbnRleHRzLmdldCh0KS5zZXRWYWx1ZSgicGVlclNlc3Npb25TdG9yZSIsbmV3IG10KG4pKTtjb25zdCBpPW5ldyBwcjtyZXR1cm4gaS5zZXRNYXhMaXN0ZW5lcnMoNTApLHRoaXMuY29udGV4dHMuZ2V0KHQpLnNldFZhbHVlKCJsb2dnZXIiLG4pLHRoaXMuY29udGV4dHMuZ2V0KHQpLnNldFZhbHVlKCJ0ZWxlbWV0cnkiLHMpLHRoaXMuY29udGV4dHMuZ2V0KHQpLnNldFZhbHVlKCJjYWxsc3RhdHMiLGkpLHRoaXMubW9zdFJlY2VudFBlZXJJZD10LHRoaXMuY29udGV4dHMuZ2V0KHQpfXJlbWFwQ29udGV4dCh0LGUpe2NvbnN0IHM9ZS5nZXRWYWx1ZSgicGVlcklkIik7cyE9PXQmJihlLnNldFZhbHVlKCJwZWVySWQiLHQpLHRoaXMubW9zdFJlY2VudFBlZXJJZD10LHRoaXMuY29udGV4dHMuc2V0KHQsZSksdGhpcy5jb250ZXh0cy5kZWxldGUocykpfWdldENvbnRleHQodCl7cmV0dXJuIHRoaXMuY29udGV4dHMuZ2V0KHQpfWdldE1vc3RSZWNlbnRQZWVySWQoKXtyZXR1cm4gdGhpcy5tb3N0UmVjZW50UGVlcklkfX12YXIgVGU9bmV3IHppO2NvbnN0ICRpPXsiMDAiOiJDbGllbnQiLCIwMSI6IkNvbnRyb2xsZXIiLCIwMiI6IlJvb21Ob2RlQ2xpZW50IiwiMDMiOiJIaXZlTm9kZUNsaWVudCIsIjA0IjoiU29ja2V0U2VydmljZSIsIjA1IjoiQ2hhdCIsIjA2IjoiUGx1Z2luIiwiMDciOiJQb2xscyIsIjA4IjoiTWV0YSIsIjA5IjoiUHJlc2V0IiwxMDoiUmVjb3JkaW5nIiwxMToiU2VsZiIsMTI6IlBhcnRpY2lwYW50IiwxMzoiU3BvdGxpZ2h0IiwxNDoiUmVtb3RlIFJlcXVlc3QiLDE1OiJXZWJpbmFyIiwxNjoiTG9jYWxNZWRpYUhhbmRsZXIiLDE3OiJFbmQtRW5kIEVuY3J5cHRpb24iLDE4OiJBSSIsMTk6IkxpdmVzdHJlYW0iLDIwOiJTdGFnZSJ9LGR0PXsiMDAwMCI6IkludGVybmFsIGV4Y2VwdGlvbi4iLCIwMDAxIjoiRmFpbGVkIHRvIGluaXRpYWxpemUuIiwiMDAwMiI6IkZhaWxlZCB0byBqb2luIHJvb20uIiwiMDAwMyI6IkZhaWxlZCB0byBsZWF2ZSByb29tLiIsIjAwMDQiOiJJbnZhbGlkIGF1dGggdG9rZW4iLCIwMDEwIjoiQnJvd3NlciBub3Qgc3VwcG9ydGVkIiwiMDAxMSI6IkhUVFAgTmV0d29yayBFcnJvciIsIjAwMTIiOiJXZWJzb2NrZXQgTmV0d29yayBFcnJvciIsIjAwMTMiOiJSYXRlIExpbWl0ZWQiLCIwMTAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDEwMSI6IlBlcm1pc3Npb24gZGVuaWVkIiwiMDEwMiI6IlByZXJlcXVpc2l0ZSBtb2R1bGUgbWlzc2luZyIsIjAyMDAiOiJJbnRlcm5hbCBleGNlcHRpb24uIiwiMDMwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjA0MDAiOiJJbnRlcm5hbCBleGNlcHRpb24iLCIwNDA0IjoiTWlzc2luZyBwcmVyZXF1aXNpdGVzIHRvIGVzdGFibGlzaCBhIHdlYnNvY2tldCBjb25uZWN0aW9uIiwiMDUwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjA1MDEiOiJQZXJtaXNzaW9uIGRlbmllZC4iLCIwNTAyIjoiSW52YWxpZCBtZXNzYWdlIGJvZHkuIiwiMDUwMyI6IlRleHQgTWVzc2FnZSBpcyB0b28gbGFyZ2UiLCIwNTA0IjoiTWVzc2FnZSBub3QgZm91bmQgYnkgdGhlIGdpdmVuIGlkIiwiMDUwNSI6IkFjdGlvbiBub3QgcGVybWl0dGVkIHdpdGhvdXQgam9pbmluZyByb29tIiwiMDUwNiI6Ik1lc3NhZ2Ugc2VhcmNoIGlzIGRpc2FibGVkIiwiMDYwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjA2MDEiOiJQZXJtaXNzaW9uIGRlbmllZC4iLCIwNjAyIjoiQXV0aCB0b2tlbiBub3Qgc2V0IGZvciBwbHVnaW4iLCIwNjAzIjoiSWZyYW1lIHdhcyBub3QgcHJvdmlkZWQiLCIwNzAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDcwNSI6IkFjdGlvbiBub3QgcGVybWl0dGVkIHdpdGhvdXQgam9pbmluZyByb29tIiwiMDgwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjA4MDEiOiJQZXJtaXNzaW9uIGRlbmllZCIsIjA5MDAiOiJJbnRlcm5hbCBleGNlcHRpb24iLCIwOTA0IjoiQ291bGQgbm90IGxvYWQgcHJlc2V0IiwxZTM6IkludGVybmFsIGV4Y2VwdGlvbiIsMTAwMToiUGVybWlzc2lvbiBkZW5pZWQiLDEwMDQ6IkNvdWxkIG5vdCBmaW5kIHNwZWNpZmllZCByZWNvcmRpbmciLDEwMDU6IkFjdGlvbiBub3QgcGVybWl0dGVkIGluIGdpdmVuIHJlY29yZGluZyBzdGF0ZSIsMTEwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxMTAxOiJQZXJtaXNzaW9uIGRlbmllZCIsMTEwMjoiVW5zdXBwb3J0ZWQiLDExMDM6Ik5hbWUgY2Fubm90IGJlIGVtcHR5IiwxMTA0OiJObyBkZXZpY2Ugc2VsZWN0ZWQgd2hpbGUgY2FsbGluZyBtZWV0aW5nLnNlbGYuc2V0RGV2aWNlIiwxMTA1OiJBY3Rpb24gbm90IHBlcm1pdHRlZCB3aXRob3V0IGpvaW5pbmcgcm9vbSIsMTEwNjoiQ2FuJ3Qgc2V0IGN1cnJlbnRseSB1c2VkIGRldmljZSIsMTIwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxMjAxOiJQZXJtaXNzaW9uIGRlbmllZCIsMTIwMjoiSW52YWxpZCBwYWdlIG51bWJlciB3YXMgcmVxdWVzdGVkIiwxMjAzOiJJbnZhbGlkIHBhcnRpY2lwYW50IGNvdW50IHBlciBwYWdlIHdhcyByZXF1ZXN0ZWQiLDEyMDQ6Ik5vIHBhcnRpY2lwYW50cyBleGlzdHMgd2l0aCB0aGUgZ2l2ZW4gVXNlcklkcyIsMTIwNToiQWN0aW9uIG5vdCBwZXJtaXR0ZWQgd2l0aG91dCBqb2luaW5nIHJvb20iLDEyMDY6Ik1hbnVhbCBTdWJzY3JpcHRpb24gTW9kZSB3YXMgbm90IEFDVElWQVRFRCIsMTIwNzoiSW52YWxpZCB2aWV3IG1vZGUiLDEyMDg6Ik1hbnVhbCBTdWJzY3JpcHRpb24gbm90IGVuYWJsZWQgZm9yIG9yZ2FuaXphdGlvbiIsMTIwOToiQnJvYWRjYXN0IG1lc3NhZ2UgdHlwZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZyIsMTMwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxNDAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDE0MDI6Ik5vIGV4aXN0aW5nIHJlbW90ZSByZXF1ZXN0cyIsMTQwMzoiTm8gcGVlciBleGlzdHMgd2l0aCBnaXZlbiBpZCIsMTUwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxNjAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDE2MDE6IkZhaWxlZCB0byBnZXQgYXVkaW8gdHJhY2siLDE2MDI6IkZhaWxlZCB0byBnZXQgdmlkZW8gdHJhY2siLDE2MDM6IkluY29ycmVjdCBkZXZpY2UiLDE2MDQ6IkZhaWxlZCB0byBjaGFuZ2UgZGV2aWNlIiwxNjA1OiJGYWlsZWQgdG8gZ2V0IGF1ZGlvICYgdmlkZW8gdHJhY2siLDE2MDY6Ik5vIGF1ZGlvIGlucHV0IGRldmljZXMgYXJlIGF2YWlsYWJsZSIsMTYwNzoiTm8gdmlkZW8gaW5wdXQgZGV2aWNlcyBhcmUgYXZhaWxhYmxlIiwxNjA4OiJObyBhdWRpbyBvdXRwdXQgZGV2aWNlcyAoc3BlYWtlcnMpIGFyZSBhdmFpbGFibGUiLDE2MDk6IkZhaWxlZCB0byBmZXRjaCBsaXN0IG9mIG1lZGlhIGRldmljZXMiLDE2MTA6Ik5vIG1lZGlhIHRyYWNrIGV4aXN0cyIsMTYxMToiRmFpbGVkIHRvIHVubXV0ZSB0cmFjayIsMTYxMjoiRmFpbGVkIHRvIGdldCBzY3JlZW5zaGFyZSB0cmFja3MiLDE3MDE6IkNyeXB0byBlcnJvciIsMTgwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxODAxOiJDYW4ndCBmZXRjaCB0cmFuc2NyaXB0IGZpbGUiLDE5MDA6IkludGVybmFsIGV4Y2VwdGlvbiIsMTkwMToiUGVybWlzc2lvbiBkZW5pZWQuIiwxOTAyOiJMaXZlc3RyZWFtIHRoYXQgaGFzIG5vdCB5ZXQgc3RhcnRlZCwgY2FuJ3QgYmUgc3RvcHBlZCIsMmUzOiJJbnRlcm5hbCBleGNlcHRpb24iLDIwMDE6IlBlcm1pc3Npb24gZGVuaWVkIiwyMDAyOiJVbnN1cHBvcnRlZCIsMjAwMzoiU3RhZ2UgaXMgZGlzYWJsZWQiLDIwMDQ6Ik1ldGhvZCBub3QgaW1wbGVtZW50ZWQiLDIwMDU6IkFjdGlvbiBub3QgcGVybWl0dGVkIHdpdGhvdXQgam9pbmluZyByb29tIiwyMDA2OiJBY3Rpb24gbm90IHBlcm1pdHRlZCBpbiBjdXJyZW50IHN0YWdlIHN0YXR1cyIsOTkwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIn07T2JqZWN0LmtleXMoZHQpLmZvckVhY2gocj0+e2R0W3JdPWB7JHskaVtyLnNsaWNlKDAsMildfX0gJHtkdFtyXX1gfSk7Y2xhc3MgR2kgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihlLHMsbj12b2lkIDAsaT0hMSl7c3VwZXIoZSk7dSh0aGlzLCJjb2RlIik7dGhpcy5jb2RlPXMsdGhpcy5uYW1lPSJDbGllbnRFcnJvciI7Y29uc3QgYT10aGlzLmNvZGU/YFtFUlIke3RoaXMuY29kZX1dYDoiW0VSUl0iLGQ9dGhpcy5jb2RlP2R0W3RoaXMuY29kZV06IiI7dGhpcy5tZXNzYWdlPWAke2F9OiAke2R9CiR7dGhpcy5tZXNzYWdlfWA7dHJ5e2xldCBvPWkmJiEhbjtzJiZzLmVuZHNXaXRoKCIwMCIpJiZuJiYobz0hMCksbyYmbi5lcnJvcigiQ2xpZW50RXJyb3IiLHtlcnJvcjp7bWVzc2FnZTp0aGlzLm1lc3NhZ2UsbmFtZTp0aGlzLm5hbWUsY29kZTpzfX0pO2NvbnN0IGg9VGUuZ2V0Q29udGV4dChUZS5nZXRNb3N0UmVjZW50UGVlcklkKCkpO2lmKGgpe2NvbnN0IGc9aC5nZXRWYWx1ZSgib25FcnJvciIpO3RyeXtnKHRoaXMpfWNhdGNoKGIpe319dHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJndpbmRvdy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiQ2xpZW50RXJyb3IiLHtkZXRhaWw6dGhpc30pKX1jYXRjaChvKXt9fX12YXIgbGU9KHI9PihyW3IuSW52YWxpZEtleT0wXT0iSW52YWxpZEtleSIscltyLk1pc3NpbmdLZXk9MV09Ik1pc3NpbmdLZXkiLHJbci5JbnRlcm5hbEVycm9yPTJdPSJJbnRlcm5hbEVycm9yIixyKSkobGV8fHt9KTtjbGFzcyB1ZSBleHRlbmRzIEdpe2NvbnN0cnVjdG9yKGUscz0yKXtzdXBlcihlLCIxNzAxIik7dSh0aGlzLCJyZWFzb24iKTt0aGlzLnJlYXNvbj1zfX1jbGFzcyAkciBleHRlbmRzIFcuRXZlbnRFbWl0dGVye2NvbnN0cnVjdG9yKGUpe3N1cGVyKCk7dSh0aGlzLCJsb2dnZXIiKTt0aGlzLmxvZ2dlcj1lLHN1cGVyLnNldE1heExpc3RlbmVycygyNSl9ZW1pdChlLC4uLnMpe3JldHVybiBzdXBlci5lbWl0KCIqIixlLC4uLnMpLHN1cGVyLmVtaXQoZSwuLi5zKX1vbihlLHMpe3ZhciBuO3RyeXtjb25zdCBpPXRoaXMubGlzdGVuZXJDb3VudChlKTtpPjI1JiZpJTI1PT09MCYmKChuPXRoaXMubG9nZ2VyKT09bnVsbHx8bi53YXJuKCJDdXN0b21FdmVudEVtaXR0ZXI6Om1heExpc3RlbmVyc0V4Y2VlZGVkIix7ZXZlbnRMaXN0ZW5lcjp7ZXZlbnROYW1lOmUudG9TdHJpbmcoKSxsaXN0ZW5lckNvdW50OnRoaXMubGlzdGVuZXJDb3VudChlKX19KSl9Y2F0Y2goaSl7fXJldHVybiBzdXBlci5vbihlLHMpfWFkZExpc3RlbmVyKGUscyl7dmFyIG47dHJ5e2NvbnN0IGk9dGhpcy5saXN0ZW5lckNvdW50KGUpO2k+MjUmJmklMjU9PT0wJiYoKG49dGhpcy5sb2dnZXIpPT1udWxsfHxuLndhcm4oIkN1c3RvbUV2ZW50RW1pdHRlcjo6bWF4TGlzdGVuZXJzRXhjZWVkZWQiLHtldmVudExpc3RlbmVyOntldmVudE5hbWU6ZS50b1N0cmluZygpLGxpc3RlbmVyQ291bnQ6dGhpcy5saXN0ZW5lckNvdW50KGUpfX0pKX1jYXRjaChpKXt9cmV0dXJuIHN1cGVyLmFkZExpc3RlbmVyKGUscyl9b2ZmKGUscyl7cmV0dXJuIHN1cGVyLm9mZihlLHMpfW9uY2UoZSxzKXtyZXR1cm4gc3VwZXIub25jZShlLHMpfXByZXBlbmRMaXN0ZW5lcihlLHMpe3JldHVybiBzdXBlci5wcmVwZW5kTGlzdGVuZXIoZSxzKX1wcmVwZW5kT25jZUxpc3RlbmVyKGUscyl7cmV0dXJuIHN1cGVyLnByZXBlbmRPbmNlTGlzdGVuZXIoZSxzKX1yZW1vdmVMaXN0ZW5lcihlLHMpe3JldHVybiBzdXBlci5yZW1vdmVMaXN0ZW5lcihlLHMpfXJlbW92ZUFsbExpc3RlbmVycyhlKXtyZXR1cm4gc3VwZXIucmVtb3ZlQWxsTGlzdGVuZXJzKGUpfWxpc3RlbmVycyhlKXtyZXR1cm4gc3VwZXIubGlzdGVuZXJzKGUpfWxpc3RlbmVyQ291bnQoZSl7cmV0dXJuIHN1cGVyLmxpc3RlbmVyQ291bnQoZSl9fWNvbnN0IEN0PXtFcnJvcjoiY3J5cHRvckVycm9yIn07ZnVuY3Rpb24gcWkocil7cmV0dXJuInR5cGUiaW4gcn1mdW5jdGlvbiBZaShzKXtyZXR1cm4gdyh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbioocix0PXtuYW1lOl99LGU9ImVuY3J5cHQiKXtyZXR1cm4gY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoInJhdyIscix0LCExLGU9PT0iZGVyaXZlIj9bImRlcml2ZUJpdHMiLCJkZXJpdmVLZXkiXTpbImVuY3J5cHQiLCJkZWNyeXB0Il0pfSl9ZnVuY3Rpb24gR3Iocix0KXtjb25zdCBzPW5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSh0KTtzd2l0Y2gocil7Y2FzZSJIS0RGIjpyZXR1cm57bmFtZToiSEtERiIsc2FsdDpzLGhhc2g6IlNIQS0yNTYiLGluZm86bmV3IEFycmF5QnVmZmVyKDEyOCl9O2Nhc2UiUEJLREYyIjpyZXR1cm57bmFtZToiUEJLREYyIixzYWx0OnMsaGFzaDoiU0hBLTI1NiIsaXRlcmF0aW9uczoxZTV9O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBhbGdvcml0aG0gJHtyfSBpcyBjdXJyZW50bHkgdW5zdXBwb3J0ZWRgKX19ZnVuY3Rpb24gcXIocix0KXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3QgZT1HcihyLmFsZ29yaXRobS5uYW1lLHQpLHM9eWllbGQgY3J5cHRvLnN1YnRsZS5kZXJpdmVLZXkoZSxyLHtuYW1lOl8sbGVuZ3RoOjEyOH0sITEsWyJlbmNyeXB0IiwiZGVjcnlwdCJdKTtyZXR1cm57bWF0ZXJpYWw6cixlbmNyeXB0aW9uS2V5OnN9fSl9ZnVuY3Rpb24gUWkocix0KXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3QgZT1HcihyLmFsZ29yaXRobS5uYW1lLHQpO3JldHVybiBjcnlwdG8uc3VidGxlLmRlcml2ZUJpdHMoZSxyLDI1Nil9KX1jbGFzcyBKaSBleHRlbmRzICRye31jbGFzcyBZciBleHRlbmRzIEppe2NvbnN0cnVjdG9yKGUpe3ZhciBzO3N1cGVyKHZvaWQgMCk7dSh0aGlzLCJzZW5kQ291bnRzIik7dSh0aGlzLCJpc0tleUludmFsaWQiLCExKTt1KHRoaXMsInBhcnRpY2lwYW50SWQiKTt1KHRoaXMsInRyYWNrSWQiKTt1KHRoaXMsImtleXMiKTt1KHRoaXMsInZpZGVvQ29kZWMiKTt1KHRoaXMsInJ0cE1hcCIpO3UodGhpcywia2V5UHJvdmlkZXJPcHRpb25zIik7dSh0aGlzLCJ1bmVuY3J5cHRlZEZyYW1lQnl0ZVRyYWlsZXIiKTt0aGlzLnNlbmRDb3VudHM9bmV3IE1hcCx0aGlzLmtleXM9ZS5rZXlzLHRoaXMucGFydGljaXBhbnRJZD1lLnBhcnRpY2lwYW50SWQsdGhpcy5ydHBNYXA9bmV3IE1hcCx0aGlzLmtleVByb3ZpZGVyT3B0aW9ucz1lLmtleVByb3ZpZGVyT3B0aW9ucyx0aGlzLnVuZW5jcnlwdGVkRnJhbWVCeXRlVHJhaWxlcj0ocz1lLnVuZW5jcnlwdGVkRnJhbWVCeXRlcykhPW51bGw/czpuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoIkxLUk9DS1MiKX1zZXRQYXJ0aWNpcGFudChlLHMpe3RoaXMucGFydGljaXBhbnRJZD1lLHRoaXMua2V5cz1zfXVuc2V0UGFydGljaXBhbnQoKXt0aGlzLnBhcnRpY2lwYW50SWQ9dm9pZCAwfWdldFBhcnRpY2lwYW50SWQoKXtyZXR1cm4gdGhpcy5wYXJ0aWNpcGFudElkfWdldFRyYWNrSWQoKXtyZXR1cm4gdGhpcy50cmFja0lkfXNldFZpZGVvQ29kZWMoZSl7dGhpcy52aWRlb0NvZGVjPWV9c2V0UnRwTWFwKGUpe3RoaXMucnRwTWFwPWV9c2V0dXBUcmFuc2Zvcm0oZSxzLG4saSxhKXthJiYodGhpcy52aWRlb0NvZGVjPWEpO2NvbnN0IGQ9ZT09PSJlbmNvZGUiP3RoaXMuZW5jb2RlRnVuY3Rpb246dGhpcy5kZWNvZGVGdW5jdGlvbixvPW5ldyBUcmFuc2Zvcm1TdHJlYW0oe3RyYW5zZm9ybTpkLmJpbmQodGhpcyl9KTtzLnBpcGVUaHJvdWdoKG8pLnBpcGVUbyhuKS5jYXRjaChoPT57dGhpcy5lbWl0KCJjcnlwdG9yRXJyb3IiLGggaW5zdGFuY2VvZiB1ZT9oOm5ldyB1ZShoLm1lc3NhZ2UpKX0pLHRoaXMudHJhY2tJZD1pfWVuY29kZUZ1bmN0aW9uKGUscyl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3ZhciBhO2lmKCF0aGlzLmtleXMuaXNFbmFibGVkKCl8fGUuZGF0YS5ieXRlTGVuZ3RoPT09MClyZXR1cm4gcy5lbnF1ZXVlKGUpO2NvbnN0e2VuY3J5cHRpb25LZXk6bn09dGhpcy5rZXlzLmdldEtleVNldCgpLGk9dGhpcy5rZXlzLmdldEN1cnJlbnRLZXlJbmRleCgpO2lmKG4pe2NvbnN0IGQ9dGhpcy5tYWtlSVYoKGE9ZS5nZXRNZXRhZGF0YSgpLnN5bmNocm9uaXphdGlvblNvdXJjZSkhPW51bGw/YTotMSxlLnRpbWVzdGFtcCksbz1uZXcgVWludDhBcnJheShlLmRhdGEsMCx0aGlzLmdldFVuZW5jcnlwdGVkQnl0ZXMoZSkpLGg9bmV3IFVpbnQ4QXJyYXkoMik7aFswXT1vZSxoWzFdPWk7dHJ5e2NvbnN0IGc9eWllbGQgY3J5cHRvLnN1YnRsZS5lbmNyeXB0KHtuYW1lOl8saXY6ZCxhZGRpdGlvbmFsRGF0YTpuZXcgVWludDhBcnJheShlLmRhdGEsMCxvLmJ5dGVMZW5ndGgpfSxuLG5ldyBVaW50OEFycmF5KGUuZGF0YSx0aGlzLmdldFVuZW5jcnlwdGVkQnl0ZXMoZSkpKSxiPW5ldyBBcnJheUJ1ZmZlcihvLmJ5dGVMZW5ndGgrZy5ieXRlTGVuZ3RoK2QuYnl0ZUxlbmd0aCtoLmJ5dGVMZW5ndGgpLFQ9bmV3IFVpbnQ4QXJyYXkoYik7cmV0dXJuIFQuc2V0KG8pLFQuc2V0KG5ldyBVaW50OEFycmF5KGcpLG8uYnl0ZUxlbmd0aCksVC5zZXQobmV3IFVpbnQ4QXJyYXkoZCksby5ieXRlTGVuZ3RoK2cuYnl0ZUxlbmd0aCksVC5zZXQoaCxvLmJ5dGVMZW5ndGgrZy5ieXRlTGVuZ3RoK2QuYnl0ZUxlbmd0aCksZS5kYXRhPWIscy5lbnF1ZXVlKGUpfWNhdGNoKGcpe319ZWxzZSB0aGlzLmVtaXQoQ3QuRXJyb3IsbmV3IHVlKCJlbmNyeXB0aW9uIGtleSBtaXNzaW5nIGZvciBlbmNvZGluZyIsbGUuTWlzc2luZ0tleSkpfSl9ZGVjb2RlRnVuY3Rpb24oZSxzKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7aWYoIXRoaXMua2V5cy5pc0VuYWJsZWQoKXx8ZS5kYXRhLmJ5dGVMZW5ndGg9PT0wfHxYaShlLmRhdGEsdGhpcy51bmVuY3J5cHRlZEZyYW1lQnl0ZVRyYWlsZXIpKXJldHVybiBzLmVucXVldWUoZSk7Y29uc3QgaT1uZXcgVWludDhBcnJheShlLmRhdGEpW2UuZGF0YS5ieXRlTGVuZ3RoLTFdO2lmKHRoaXMua2V5cy5nZXRLZXlTZXQoaSkpdHJ5e2NvbnN0IGE9eWllbGQgdGhpcy5kZWNyeXB0RnJhbWUoZSxpKTtpZihhKXJldHVybiBzLmVucXVldWUoYSk7dGhpcy5pc0tleUludmFsaWQ9ITF9Y2F0Y2goYSl7YSBpbnN0YW5jZW9mIHVlJiZhLnJlYXNvbj09PWxlLkludmFsaWRLZXkmJih0aGlzLmlzS2V5SW52YWxpZHx8KHRoaXMuZW1pdChDdC5FcnJvcixuZXcgdWUoYGludmFsaWQga2V5IGZvciBwYXJ0aWNpcGFudCAke3RoaXMucGFydGljaXBhbnRJZH1gLGxlLkludmFsaWRLZXkpKSx0aGlzLmlzS2V5SW52YWxpZD0hMCkpfWVsc2UgdGhpcy5lbWl0KEN0LkVycm9yLG5ldyB1ZShga2V5IG1pc3NpbmcgZm9yIHBhcnRpY2lwYW50ICR7dGhpcy5wYXJ0aWNpcGFudElkfWAsbGUuTWlzc2luZ0tleSkpO3JldHVybiBzLmVucXVldWUoZSl9KX1kZWNyeXB0RnJhbWUoYSxkKXtyZXR1cm4gdyh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbiooZSxzLG49dm9pZCAwLGk9e3JhdGNoZXRDb3VudDowfSl7dmFyIGg7Y29uc3Qgbz10aGlzLmtleXMuZ2V0S2V5U2V0KHMpO3RyeXtjb25zdCBnPW5ldyBVaW50OEFycmF5KGUuZGF0YSwwLHRoaXMuZ2V0VW5lbmNyeXB0ZWRCeXRlcyhlKSksYj1uZXcgVWludDhBcnJheShlLmRhdGEsZS5kYXRhLmJ5dGVMZW5ndGgtMiwyKSxUPWJbMF0sVj1uZXcgVWludDhBcnJheShlLmRhdGEsZS5kYXRhLmJ5dGVMZW5ndGgtVC1iLmJ5dGVMZW5ndGgsVCksVT1nLmJ5dGVMZW5ndGgscT1lLmRhdGEuYnl0ZUxlbmd0aC0oZy5ieXRlTGVuZ3RoK1QrYi5ieXRlTGVuZ3RoKSwkPXlpZWxkIGNyeXB0by5zdWJ0bGUuZGVjcnlwdCh7bmFtZTpfLGl2OlYsYWRkaXRpb25hbERhdGE6bmV3IFVpbnQ4QXJyYXkoZS5kYXRhLDAsZy5ieXRlTGVuZ3RoKX0sKGg9aS5lbmNyeXB0aW9uS2V5KSE9bnVsbD9oOm8uZW5jcnlwdGlvbktleSxuZXcgVWludDhBcnJheShlLmRhdGEsVSxxKSksaWU9bmV3IEFycmF5QnVmZmVyKGcuYnl0ZUxlbmd0aCskLmJ5dGVMZW5ndGgpLGFlPW5ldyBVaW50OEFycmF5KGllKTtyZXR1cm4gYWUuc2V0KG5ldyBVaW50OEFycmF5KGUuZGF0YSwwLGcuYnl0ZUxlbmd0aCkpLGFlLnNldChuZXcgVWludDhBcnJheSgkKSxnLmJ5dGVMZW5ndGgpLGUuZGF0YT1pZSxlfWNhdGNoKGcpe2lmKHRoaXMua2V5UHJvdmlkZXJPcHRpb25zLnJhdGNoZXRXaW5kb3dTaXplPjApe2lmKGkucmF0Y2hldENvdW50PHRoaXMua2V5UHJvdmlkZXJPcHRpb25zLnJhdGNoZXRXaW5kb3dTaXplKXtsZXQgYjtpZihvPT09dGhpcy5rZXlzLmdldEtleVNldChzKSl7Y29uc3QgVj15aWVsZCB0aGlzLmtleXMucmF0Y2hldEtleShzLCExKTtiPXlpZWxkIHFyKFYsdGhpcy5rZXlQcm92aWRlck9wdGlvbnMucmF0Y2hldFNhbHQpfWNvbnN0IFQ9eWllbGQgdGhpcy5kZWNyeXB0RnJhbWUoZSxzLG58fG8se3JhdGNoZXRDb3VudDppLnJhdGNoZXRDb3VudCsxLGVuY3J5cHRpb25LZXk6Yj09bnVsbD92b2lkIDA6Yi5lbmNyeXB0aW9uS2V5fSk7cmV0dXJuIFQmJmImJih0aGlzLmtleXMuc2V0S2V5U2V0KGIscywhMCksdGhpcy5rZXlzLnNldEN1cnJlbnRLZXlJbmRleChzKSksVH1uJiZ0aGlzLmtleXMuc2V0S2V5RnJvbU1hdGVyaWFsKG4ubWF0ZXJpYWwscyl9ZWxzZSB0aHJvdyBuZXcgdWUoIkRlY3J5cHRpb24gZmFpbGVkLCBtb3N0IGxpa2VseSBiZWNhdXNlIG9mIGFuIGludmFsaWQga2V5IixsZS5JbnZhbGlkS2V5KX19KX1tYWtlSVYoZSxzKXt2YXIgZDtjb25zdCBuPW5ldyBBcnJheUJ1ZmZlcihvZSksaT1uZXcgRGF0YVZpZXcobik7dGhpcy5zZW5kQ291bnRzLmhhcyhlKXx8dGhpcy5zZW5kQ291bnRzLnNldChlLE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSo2NTUzNSkpO2NvbnN0IGE9KGQ9dGhpcy5zZW5kQ291bnRzLmdldChlKSkhPW51bGw/ZDowO3JldHVybiBpLnNldFVpbnQzMigwLGUpLGkuc2V0VWludDMyKDQscyksaS5zZXRVaW50MzIoOCxzLWElNjU1MzUpLHRoaXMuc2VuZENvdW50cy5zZXQoZSxhKzEpLG59Z2V0VW5lbmNyeXB0ZWRCeXRlcyhlKXt2YXIgcztpZihxaShlKSl7Y29uc3Qgbj0ocz10aGlzLmdldFZpZGVvQ29kZWMoZSkpIT1udWxsP3M6dGhpcy52aWRlb0NvZGVjO2lmKG49PT0iYXYxInx8bj09PSJ2cDkiKXRocm93IG5ldyBFcnJvcihgJHtufSBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgZW5kIHRvIGVuZCBlbmNyeXB0aW9uYCk7cmV0dXJuIE1bZS50eXBlXX1yZXR1cm4gTS5hdWRpb31nZXRWaWRlb0NvZGVjKGUpe2lmKHRoaXMucnRwTWFwLnNpemU9PT0wKXJldHVybjtjb25zdHtwYXlsb2FkVHlwZTpzfT1lLmdldE1ldGFkYXRhKCk7cmV0dXJuIHM/dGhpcy5ydHBNYXAuZ2V0KHMpOnZvaWQgMH19ZnVuY3Rpb24gWGkocix0KXtjb25zdCBlPW5ldyBVaW50OEFycmF5KHIuc2xpY2Uoci5ieXRlTGVuZ3RoLXQuYnl0ZUxlbmd0aCkpO3JldHVybiB0LmV2ZXJ5KChzLG4pPT5zPT09ZVtuXSl9Y2xhc3MgUXIgZXh0ZW5kcyAkcntjb25zdHJ1Y3RvcihlLHMsbil7c3VwZXIodm9pZCAwKTt1KHRoaXMsImN1cnJlbnRLZXlJbmRleCIpO3UodGhpcywiY3J5cHRvS2V5UmluZyIpO3UodGhpcywiZW5hYmxlZCIpO3UodGhpcywia2V5UHJvdmlkZXJPcHRpb25zIik7dSh0aGlzLCJyYXRjaGV0UHJvbWlzZU1hcCIpO3UodGhpcywicGFydGljaXBhbnRJZCIpO3RoaXMuY3VycmVudEtleUluZGV4PTAsdGhpcy5jcnlwdG9LZXlSaW5nPW5ldyBBcnJheSgxNiksdGhpcy5lbmFibGVkPXMsdGhpcy5rZXlQcm92aWRlck9wdGlvbnM9bix0aGlzLnJhdGNoZXRQcm9taXNlTWFwPW5ldyBNYXAsdGhpcy5wYXJ0aWNpcGFudElkPWV9c2V0RW5hYmxlZChlKXt0aGlzLmVuYWJsZWQ9ZX1yYXRjaGV0S2V5KGUscz0hMCl7Y29uc3Qgbj1lIT1udWxsP2U6dGhpcy5nZXRDdXJyZW50S2V5SW5kZXgoKSxpPW4sYT10aGlzLnJhdGNoZXRQcm9taXNlTWFwLmdldChpKTtpZih0eXBlb2YgYSE9InVuZGVmaW5lZCIpcmV0dXJuIGE7Y29uc3QgZD1uZXcgUHJvbWlzZSgobyxoKT0+dyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dHJ5e2NvbnN0IGc9dGhpcy5nZXRLZXlTZXQoaSkubWF0ZXJpYWwsYj15aWVsZCBZaSh5aWVsZCBRaShnLHRoaXMua2V5UHJvdmlkZXJPcHRpb25zLnJhdGNoZXRTYWx0KSxnLmFsZ29yaXRobS5uYW1lLCJkZXJpdmUiKTtzJiZ0aGlzLnNldEtleUZyb21NYXRlcmlhbChiLGksITApLHRoaXMuZW1pdCgia2V5UmF0Y2hldGVkIixiLG4sdGhpcy5wYXJ0aWNpcGFudElkKSxvKGIpfWNhdGNoKGcpe2goZyl9ZmluYWxseXt0aGlzLnJhdGNoZXRQcm9taXNlTWFwLmRlbGV0ZShpKX19KSk7cmV0dXJuIHRoaXMucmF0Y2hldFByb21pc2VNYXAuc2V0KGksZCksZH1zZXRLZXlGcm9tTWF0ZXJpYWwoZSxzPTAsbj0hMSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3M+PTAmJih0aGlzLmN1cnJlbnRLZXlJbmRleD1zJXRoaXMuY3J5cHRvS2V5UmluZy5sZW5ndGgpO2NvbnN0IGk9eWllbGQgcXIoZSx0aGlzLmtleVByb3ZpZGVyT3B0aW9ucy5yYXRjaGV0U2FsdCk7dGhpcy5zZXRLZXlTZXQoaSx0aGlzLmN1cnJlbnRLZXlJbmRleCxuKX0pfXNldEtleVNldChlLHMsbj0hMSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3RoaXMuY3J5cHRvS2V5UmluZ1tzJXRoaXMuY3J5cHRvS2V5UmluZy5sZW5ndGhdPWUsbiYmdGhpcy5lbWl0KCJrZXlSYXRjaGV0ZWQiLGUubWF0ZXJpYWwscyx0aGlzLnBhcnRpY2lwYW50SWQpfSl9c2V0Q3VycmVudEtleUluZGV4KGUpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXt0aGlzLmN1cnJlbnRLZXlJbmRleD1lJXRoaXMuY3J5cHRvS2V5UmluZy5sZW5ndGh9KX1pc0VuYWJsZWQoKXtyZXR1cm4gdGhpcy5lbmFibGVkfWdldEN1cnJlbnRLZXlJbmRleCgpe3JldHVybiB0aGlzLmN1cnJlbnRLZXlJbmRleH1nZXRLZXlTZXQoZSl7cmV0dXJuIHRoaXMuY3J5cHRvS2V5UmluZ1tlIT1udWxsP2U6dGhpcy5jdXJyZW50S2V5SW5kZXhdfX1jb25zdCBJdD1bXSx3dD1uZXcgTWFwLGt0PVtdO2xldCBuZSxNdD0hMSxKcj0hMSxfdCxwZT1wdDtmdW5jdGlvbiBoZShyLHQpe3Bvc3RNZXNzYWdlKHtraW5kOiJsb2ciLGRhdGE6e2xldmVsOnIsc3RyOnR9fSl9ZnVuY3Rpb24gWmkocix0KXtwb3N0TWVzc2FnZSh7a2luZDoicmF0Y2hldEtleSIsZGF0YTp7a2V5SW5kZXg6dCxtYXRlcmlhbDpyfX0pfWZ1bmN0aW9uIFJlKHIpe2lmKCFyKXJldHVybiBuZTtsZXQgdD13dC5nZXQocik7cmV0dXJuIHR8fCh0PW5ldyBRcihyLCEwLHBlKSxfdCYmdC5zZXRLZXlGcm9tTWF0ZXJpYWwoX3QpLHd0LnNldChyLHQpKSx0fWZ1bmN0aW9uIGVhKHIsdCl7dD9SZSh0KS5zZXRFbmFibGVkKHIpOihNdD1yLG5lLnNldEVuYWJsZWQocikpfWZ1bmN0aW9uIFhyKHIpe3Iub24oImNyeXB0b3JFcnJvciIsdD0+e2NvbnN0IGU9e2tpbmQ6ImVycm9yIixkYXRhOntlcnJvcjpuZXcgRXJyb3IoYCR7bGVbdC5yZWFzb25dfTogJHt0Lm1lc3NhZ2V9YCl9fTtwb3N0TWVzc2FnZShlKX0pfWZ1bmN0aW9uIEF0KHIsdCl7bGV0IGU9SXQuZmluZChzPT5zLmdldFRyYWNrSWQoKT09PXQpO2lmKGUpciE9PWUuZ2V0UGFydGljaXBhbnRJZCgpJiZlLnNldFBhcnRpY2lwYW50KHIsUmUocikpO2Vsc2V7aWYoaGUoImluZm8iLGBjcmVhdGluZyBuZXcgY3J5cHRvciBmb3IgJHtyfWApLCFwZSl0aHJvdyBFcnJvcigiTWlzc2luZyBrZXlQcm92aWRlciBvcHRpb25zIik7ZT1uZXcgWXIoe3BhcnRpY2lwYW50SWQ6cixrZXlzOlJlKHIpLGtleVByb3ZpZGVyT3B0aW9uczpwZX0pLFhyKGUpLEl0LnB1c2goZSl9cmV0dXJuIGV9ZnVuY3Rpb24gWnIocil7bGV0IHQ9a3QuZmluZChlPT5lLmdldFRyYWNrSWQoKT09PXIpO2lmKCF0KXtpZighcGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiTWlzc2luZyBrZXlQcm92aWRlciBvcHRpb25zIik7dD1uZXcgWXIoe2tleXM6bmUscGFydGljaXBhbnRJZDoicHVibGlzaGVyIixrZXlQcm92aWRlck9wdGlvbnM6cGV9KSxYcih0KSxrdC5wdXNoKHQpfXJldHVybiB0fWZ1bmN0aW9uIHRhKHIpe3ZhciB0Oyh0PUl0LmZpbmQoZT0+ZS5nZXRUcmFja0lkKCk9PT1yKSk9PW51bGx8fHQudW5zZXRQYXJ0aWNpcGFudCgpfWZ1bmN0aW9uIHJhKHIsdCl7aGUoImRlYnVnIiwic2V0dGluZyBzaGFyZWQga2V5IiksX3Q9cixuZT09bnVsbHx8bmUuc2V0S2V5RnJvbU1hdGVyaWFsKHIsdCk7Zm9yKGNvbnN0WyxlXW9mIHd0KWUuc2V0S2V5RnJvbU1hdGVyaWFsKHIsdCl9b25tZXNzYWdlPXI9Pntjb25zdHtraW5kOnQsZGF0YTplfT1yLmRhdGE7c3dpdGNoKHQpe2Nhc2UiaW5pdCI6aGUoImluZm8iLCJ3b3JrZXIgaW5pdGlhbGl6ZWQiKSxwZT1lLmtleVByb3ZpZGVyT3B0aW9ucyxKcj0hIWUua2V5UHJvdmlkZXJPcHRpb25zLnNoYXJlZEtleTtjb25zdCBzPXtraW5kOiJlbmFibGUiLGRhdGE6e2VuYWJsZWQ6TXR9fTtuZT1uZXcgUXIodm9pZCAwLE10LHBlKSxuZS5vbigia2V5UmF0Y2hldGVkIixaaSkscG9zdE1lc3NhZ2Uocyk7YnJlYWs7Y2FzZSJlbmFibGUiOmVhKGUuZW5hYmxlZCxlLnBhcnRpY2lwYW50SWQpLGhlKCJpbmZvIiwidXBkYXRlZCBlMmVlIGVuYWJsZWQgc3RhdHVzIikscG9zdE1lc3NhZ2Uoci5kYXRhKTticmVhaztjYXNlImRlY29kZSI6QXQoZS5wYXJ0aWNpcGFudElkLGUudHJhY2tJZCkuc2V0dXBUcmFuc2Zvcm0odCxlLnJlYWRhYmxlU3RyZWFtLGUud3JpdGFibGVTdHJlYW0sZS50cmFja0lkLGUuY29kZWMpO2JyZWFrO2Nhc2UiZW5jb2RlIjpacihlLnRyYWNrSWQpLnNldHVwVHJhbnNmb3JtKHQsZS5yZWFkYWJsZVN0cmVhbSxlLndyaXRhYmxlU3RyZWFtLGUudHJhY2tJZCxlLmNvZGVjKTticmVhaztjYXNlInNldEtleSI6SnI/KGhlKCJkZWJ1ZyIsInNldCBzaGFyZWQga2V5IikscmEoZS5rZXksZS5rZXlJbmRleCkpOmUucGFydGljaXBhbnRJZD9SZShlLnBhcnRpY2lwYW50SWQpLnNldEtleUZyb21NYXRlcmlhbChlLmtleSxlLmtleUluZGV4KTpoZSgiZXJyb3IiLCJubyBwYXJ0aWNpcGFudCBJZCB3YXMgcHJvdmlkZWQgYW5kIHNoYXJlZCBrZXkgdXNhZ2UgaXMgZGlzYWJsZWQiKTticmVhaztjYXNlInJlbW92ZVRyYW5zZm9ybSI6dGEoZS50cmFja0lkKTticmVhaztjYXNlInVwZGF0ZUNvZGVjIjpBdChlLnBhcnRpY2lwYW50SWQsZS50cmFja0lkKS5zZXRWaWRlb0NvZGVjKGUuY29kZWMpO2JyZWFrO2Nhc2Uic2V0UlRQTWFwIjprdC5mb3JFYWNoKGE9PnthLnNldFJ0cE1hcChlLm1hcCl9KTticmVhaztjYXNlInJhdGNoZXRSZXF1ZXN0IjpSZShlLnBhcnRpY2lwYW50SWQpLnJhdGNoZXRLZXkoZS5rZXlJbmRleCk7YnJlYWt9fSxzZWxmLlJUQ1RyYW5zZm9ybUV2ZW50JiYoaGUoImRlYnVnIiwic2V0dXAgdHJhbnNmb3JtIGV2ZW50Iiksc2VsZi5vbnJ0Y3RyYW5zZm9ybT1yPT57Y29uc3R7dHJhbnNmb3JtZXI6dH09cjt0LmhhbmRsZWQ9ITA7Y29uc3R7a2luZDplLHBhcnRpY2lwYW50SWQ6cyx0cmFja0lkOm4sY29kZWM6aX09dC5vcHRpb25zOyhlPT09ImVuY29kZSI/WnIobik6QXQocyxuKSkuc2V0dXBUcmFuc2Zvcm0oZSx0LnJlYWRhYmxlLHQud3JpdGFibGUsbixpKX0pfSkoKTsK", g = typeof window != "undefined" && window.Blob && new Blob([atob(ll)], { type: "text/javascript;charset=utf-8" });
419
+ function Il() {
420
420
  const Z = g && (window.URL || window.webkitURL).createObjectURL(g);
421
421
  try {
422
422
  return Z ? new Worker(Z) : new Worker("data:application/javascript;base64," + ll);
@@ -424,8 +424,8 @@ function Hl() {
424
424
  Z && (window.URL || window.webkitURL).revokeObjectURL(Z);
425
425
  }
426
426
  }
427
- var N, C, s, k, Zl, H, dl, a, T, v, Sl, U, cl, S, bl, K, Xl, t, Vl;
428
- class Ul extends $ {
427
+ var N, C, k, U, Zl, I, dl, a, T, v, Sl, H, cl, S, bl, o, Wl, t, Vl;
428
+ class Hl extends $ {
429
429
  constructor(l) {
430
430
  super(void 0);
431
431
  p(this, N);
@@ -434,11 +434,11 @@ class Ul extends $ {
434
434
  // this.postRTPMap(rtpMap);
435
435
  // });
436
436
  // }
437
- p(this, k);
438
- p(this, H);
437
+ p(this, U);
438
+ p(this, I);
439
439
  p(this, a);
440
440
  p(this, v);
441
- p(this, U);
441
+ p(this, H);
442
442
  p(this, S);
443
443
  /**
444
444
  * Handles the given {@code RTCRtpReceiver} by
@@ -446,7 +446,7 @@ class Ul extends $ {
446
446
  * a frame decoder.
447
447
  *
448
448
  */
449
- p(this, K);
449
+ p(this, o);
450
450
  /**
451
451
  * Handles the given {@code RTCRtpSender} by creating a {@code TransformStream} which will inject
452
452
  * a frame encoder.
@@ -464,8 +464,8 @@ class Ul extends $ {
464
464
  this.logger.error("error in worker", { error: b.error }), this.emit(E.Error, b.error);
465
465
  break;
466
466
  case "enable":
467
- this.encryptionEnabled !== b.enabled && !b.participantId ? this.encryptionEnabled = b.enabled : b.participantId, this.encryptionEnabled && this.keyProvider.getKeys().forEach((X) => {
468
- y(this, a, T).call(this, X);
467
+ this.encryptionEnabled !== b.enabled && !b.participantId ? this.encryptionEnabled = b.enabled : b.participantId, this.encryptionEnabled && this.keyProvider.getKeys().forEach((W) => {
468
+ Y(this, a, T).call(this, W);
469
469
  });
470
470
  break;
471
471
  case "ratchetKey":
@@ -476,10 +476,10 @@ class Ul extends $ {
476
476
  break;
477
477
  }
478
478
  });
479
- p(this, s, (l) => {
479
+ p(this, k, (l) => {
480
480
  this.logger.error("e2ee worker encountered an error:", { error: l.error }), this.emit(E.Error, l.error);
481
481
  });
482
- this.keyProvider = l.keyProvider, this.worker = new Hl(), this.encryptionEnabled = !1;
482
+ this.keyProvider = l.keyProvider, this.worker = new Il(), this.encryptionEnabled = !1;
483
483
  }
484
484
  get isEnabled() {
485
485
  return this.encryptionEnabled;
@@ -495,18 +495,18 @@ class Ul extends $ {
495
495
  throw new Error(
496
496
  "tried to setup end-to-end encryption on an unsupported browser"
497
497
  );
498
- this.logger.info("setting up e2ee"), y(this, k, Zl).call(this, this.keyProvider);
498
+ this.logger.info("setting up e2ee"), Y(this, U, Zl).call(this, this.keyProvider);
499
499
  const l = {
500
500
  kind: "init",
501
501
  data: {
502
502
  keyProviderOptions: this.keyProvider.getOptions()
503
503
  }
504
504
  };
505
- this.worker && (this.logger.info("initializing worker"), this.worker.onmessage = this.onWorkerMessage, this.worker.onerror = M(this, s), this.worker.postMessage(l)), y(this, N, C).call(this, !0);
505
+ this.worker && (this.logger.info("initializing worker"), this.worker.onmessage = this.onWorkerMessage, this.worker.onerror = w(this, k), this.worker.postMessage(l)), Y(this, N, C).call(this, !0);
506
506
  }
507
507
  }
508
508
  N = new WeakSet(), C = function(l, c) {
509
- return i(this, null, function* () {
509
+ return J(this, null, function* () {
510
510
  if (this.logger.info(`set e2ee to ${l} for ${c || "self"}`), this.worker) {
511
511
  const b = {
512
512
  kind: "enable",
@@ -516,44 +516,44 @@ N = new WeakSet(), C = function(l, c) {
516
516
  } else
517
517
  throw new ReferenceError("failed to enable e2ee, worker is not ready");
518
518
  });
519
- }, s = new WeakMap(), k = new WeakSet(), Zl = function(l) {
519
+ }, k = new WeakMap(), U = new WeakSet(), Zl = function(l) {
520
520
  this.peerSessionStore.on(
521
- J.NEW_CONSUMER,
521
+ i.NEW_CONSUMER,
522
522
  ({ appData: c, peerId: b }) => {
523
- c.e2ee && y(this, N, C).call(this, c.e2ee, b);
523
+ c.e2ee && Y(this, N, C).call(this, c.e2ee, b);
524
524
  }
525
525
  ), this.peerSessionStore.on(
526
- J.E2EE_INACTIVE_CONSUMER,
526
+ i.E2EE_INACTIVE_CONSUMER,
527
527
  ({ peerId: c, trackId: b }) => {
528
528
  var V;
529
- const X = {
529
+ const W = {
530
530
  kind: "removeTransform",
531
531
  data: {
532
532
  participantId: c,
533
533
  trackId: b
534
534
  }
535
535
  };
536
- (V = this.worker) == null || V.postMessage(X);
536
+ (V = this.worker) == null || V.postMessage(W);
537
537
  }
538
538
  ), this.peerSessionStore.on(
539
- J.E2EE_ACTIVE_CONSUMER,
539
+ i.E2EE_ACTIVE_CONSUMER,
540
540
  ({
541
541
  track: c,
542
542
  rtpReceiver: b,
543
- peerId: X
544
- }) => y(this, U, cl).call(this, c, b, X)
543
+ peerId: W
544
+ }) => Y(this, H, cl).call(this, c, b, W)
545
545
  ), this.peerSessionStore.on(
546
- J.E2EE_ACTIVE_PRODUCER,
546
+ i.E2EE_ACTIVE_PRODUCER,
547
547
  ({
548
548
  track: c,
549
549
  rtpSender: b,
550
- appData: X
551
- }) => y(this, S, bl).call(this, c, b, X.peerId)
552
- ), l.on("setKey", (c) => y(this, a, T).call(this, c)).on(
550
+ appData: W
551
+ }) => Y(this, S, bl).call(this, c, b, W.peerId)
552
+ ), l.on("setKey", (c) => Y(this, a, T).call(this, c)).on(
553
553
  "ratchetRequest",
554
- (c, b) => y(this, H, dl).call(this, c, b)
554
+ (c, b) => Y(this, I, dl).call(this, c, b)
555
555
  );
556
- }, H = new WeakSet(), dl = function(l, c) {
556
+ }, I = new WeakSet(), dl = function(l, c) {
557
557
  if (!this.worker)
558
558
  throw Error("could not ratchet key, worker is missing");
559
559
  const b = {
@@ -567,7 +567,7 @@ N = new WeakSet(), C = function(l, c) {
567
567
  }, a = new WeakSet(), T = function({ key: l, participantId: c, keyIndex: b }) {
568
568
  if (!this.worker)
569
569
  throw Error("could not set key, worker is missing");
570
- const X = {
570
+ const W = {
571
571
  kind: "setKey",
572
572
  data: {
573
573
  participantId: c,
@@ -575,7 +575,7 @@ N = new WeakSet(), C = function(l, c) {
575
575
  keyIndex: b
576
576
  }
577
577
  };
578
- this.worker.postMessage(X);
578
+ this.worker.postMessage(W);
579
579
  }, v = new WeakSet(), Sl = function(l) {
580
580
  if (!this.worker)
581
581
  throw Error("could not post rtp map, worker is missing");
@@ -586,84 +586,84 @@ N = new WeakSet(), C = function(l, c) {
586
586
  }
587
587
  };
588
588
  this.worker.postMessage(c);
589
- }, U = new WeakSet(), cl = function(l, c, b) {
590
- y(this, K, Xl).call(this, c, l.id, b);
589
+ }, H = new WeakSet(), cl = function(l, c, b) {
590
+ Y(this, o, Wl).call(this, c, l.id, b);
591
591
  }, S = new WeakSet(), bl = function(l, c, b) {
592
- y(this, t, Vl).call(this, c, l.id, b);
593
- }, K = new WeakSet(), Xl = function(l, c, b, X) {
594
- return i(this, null, function* () {
592
+ Y(this, t, Vl).call(this, c, l.id, b);
593
+ }, o = new WeakSet(), Wl = function(l, c, b, W) {
594
+ return J(this, null, function* () {
595
595
  if (!this.worker)
596
596
  return;
597
597
  const V = l;
598
598
  if (x()) {
599
- const W = {
599
+ const X = {
600
600
  kind: "decode",
601
601
  participantId: b,
602
602
  trackId: c,
603
- codec: X
603
+ codec: W
604
604
  };
605
- V.transform = new RTCRtpScriptTransform(this.worker, W);
605
+ V.transform = new RTCRtpScriptTransform(this.worker, X);
606
606
  } else {
607
- if (F in V && X) {
608
- const u = {
607
+ if (F in V && W) {
608
+ const y = {
609
609
  kind: "updateCodec",
610
610
  data: {
611
611
  trackId: c,
612
- codec: X,
612
+ codec: W,
613
613
  participantId: b
614
614
  }
615
615
  };
616
- this.worker.postMessage(u);
616
+ this.worker.postMessage(y);
617
617
  return;
618
618
  }
619
- let W = V.writableStream, G = V.readableStream;
620
- if (!W || !G) {
621
- const u = V.createEncodedStreams();
622
- V.writableStream = u.writable, W = u.writable, V.readableStream = u.readable, G = u.readable;
619
+ let X = V.writableStream, m = V.readableStream;
620
+ if (!X || !m) {
621
+ const y = V.createEncodedStreams();
622
+ V.writableStream = y.writable, X = y.writable, V.readableStream = y.readable, m = y.readable;
623
623
  }
624
- const Y = {
624
+ const u = {
625
625
  kind: "decode",
626
626
  data: {
627
- readableStream: G,
628
- writableStream: W,
627
+ readableStream: m,
628
+ writableStream: X,
629
629
  trackId: c,
630
- codec: X,
630
+ codec: W,
631
631
  participantId: b
632
632
  }
633
633
  };
634
- this.worker.postMessage(Y, [G, W]);
634
+ this.worker.postMessage(u, [m, X]);
635
635
  }
636
636
  V[F] = !0;
637
637
  });
638
- }, t = new WeakSet(), Vl = function(l, c, b, X) {
638
+ }, t = new WeakSet(), Vl = function(l, c, b, W) {
639
639
  if (F in l || !this.worker)
640
640
  return;
641
641
  const V = l;
642
642
  if (x()) {
643
643
  this.logger.warn("initialize script transform");
644
- const W = {
644
+ const X = {
645
645
  kind: "encode",
646
646
  participantId: b,
647
647
  trackId: c,
648
- codec: X
648
+ codec: W
649
649
  };
650
- V.transform = new RTCRtpScriptTransform(this.worker, W);
650
+ V.transform = new RTCRtpScriptTransform(this.worker, X);
651
651
  } else {
652
652
  this.logger.warn("initialize encoded streams");
653
- const W = V.createEncodedStreams(), G = {
653
+ const X = V.createEncodedStreams(), m = {
654
654
  kind: "encode",
655
655
  data: {
656
- readableStream: W.readable,
657
- writableStream: W.writable,
658
- codec: X,
656
+ readableStream: X.readable,
657
+ writableStream: X.writable,
658
+ codec: W,
659
659
  trackId: c,
660
660
  participantId: b || "publisher"
661
661
  }
662
662
  };
663
- this.worker.postMessage(G, [W.readable, W.writable]);
663
+ this.worker.postMessage(m, [X.readable, X.writable]);
664
664
  }
665
665
  V[F] = !0;
666
- }, R(Ul, "SharedKeyProvider", kl);
666
+ }, R(Hl, "SharedKeyProvider", Ul);
667
667
  export {
668
- Ul as default
668
+ Hl as default
669
669
  };