@cloudflare/realtimekit 1.2.5-staging.1 → 1.2.5-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.
- package/AGENTS.md +63 -0
- package/dist/ClientMock.cjs.js +2 -2
- package/dist/ClientMock.es.js +1439 -1707
- package/dist/EncryptionManager.cjs.js +1 -1
- package/dist/EncryptionManager.d.ts +13 -947
- package/dist/EncryptionManager.es.js +156 -156
- package/dist/browser.js +10 -10
- package/dist/dependencies.txt +8 -229
- package/dist/index.cjs.js +10 -13
- package/dist/index.d.ts +15 -948
- package/dist/index.es.js +6979 -11036
- package/dist/index.es5.js +9868 -13315
- package/dist/index.rn.js +10 -13
- package/dist/ts3.4/dist/EncryptionManager.d.ts +13 -940
- package/dist/ts3.4/dist/index.d.ts +15 -941
- package/package.json +5 -5
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
var
|
|
1
|
+
var Xl = Object.defineProperty, ml = Object.defineProperties;
|
|
2
2
|
var Gl = Object.getOwnPropertyDescriptors;
|
|
3
|
-
var
|
|
3
|
+
var v = Object.getOwnPropertySymbols;
|
|
4
4
|
var Rl = Object.prototype.hasOwnProperty, pl = Object.prototype.propertyIsEnumerable;
|
|
5
|
-
var x = (Z, d, l) => d in Z ?
|
|
5
|
+
var x = (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
7
|
Rl.call(d, l) && x(Z, l, d[l]);
|
|
8
|
-
if (
|
|
9
|
-
for (var l of
|
|
8
|
+
if (v)
|
|
9
|
+
for (var l of v(d))
|
|
10
10
|
pl.call(d, l) && x(Z, l, d[l]);
|
|
11
11
|
return Z;
|
|
12
12
|
}, e = (Z, d) => ml(Z, Gl(d));
|
|
@@ -19,49 +19,49 @@ var j = (Z, d, l) => (B(Z, d, "read from private field"), l ? l.call(Z) : d.get(
|
|
|
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
|
|
23
|
-
var
|
|
24
|
-
var
|
|
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 V = (G) => {
|
|
25
25
|
try {
|
|
26
|
-
|
|
27
|
-
} catch (
|
|
28
|
-
b(
|
|
26
|
+
X(l.next(G));
|
|
27
|
+
} catch (u) {
|
|
28
|
+
b(u);
|
|
29
29
|
}
|
|
30
|
-
},
|
|
30
|
+
}, W = (G) => {
|
|
31
31
|
try {
|
|
32
|
-
|
|
33
|
-
} catch (
|
|
34
|
-
b(
|
|
32
|
+
X(l.throw(G));
|
|
33
|
+
} catch (u) {
|
|
34
|
+
b(u);
|
|
35
35
|
}
|
|
36
|
-
},
|
|
37
|
-
|
|
36
|
+
}, X = (G) => G.done ? c(G.value) : Promise.resolve(G.value).then(V, W);
|
|
37
|
+
X((l = l.apply(Z, d)).next());
|
|
38
38
|
});
|
|
39
|
-
var
|
|
39
|
+
var I = {}, Yl = {
|
|
40
40
|
get exports() {
|
|
41
|
-
return
|
|
41
|
+
return I;
|
|
42
42
|
},
|
|
43
43
|
set exports(Z) {
|
|
44
|
-
|
|
44
|
+
I = Z;
|
|
45
45
|
}
|
|
46
|
-
},
|
|
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
|
-
},
|
|
49
|
-
|
|
48
|
+
}, L;
|
|
49
|
+
h && typeof h.ownKeys == "function" ? L = h.ownKeys : Object.getOwnPropertySymbols ? L = function(d) {
|
|
50
50
|
return Object.getOwnPropertyNames(d).concat(Object.getOwnPropertySymbols(d));
|
|
51
|
-
} :
|
|
51
|
+
} : L = function(d) {
|
|
52
52
|
return Object.getOwnPropertyNames(d);
|
|
53
53
|
};
|
|
54
|
-
function
|
|
54
|
+
function ul(Z) {
|
|
55
55
|
console && console.warn && console.warn(Z);
|
|
56
56
|
}
|
|
57
|
-
var
|
|
57
|
+
var P = Number.isNaN || function(d) {
|
|
58
58
|
return d !== d;
|
|
59
59
|
};
|
|
60
60
|
function m() {
|
|
61
61
|
m.init.call(this);
|
|
62
62
|
}
|
|
63
|
-
|
|
64
|
-
|
|
63
|
+
Yl.exports = m;
|
|
64
|
+
I.once = il;
|
|
65
65
|
m.EventEmitter = m;
|
|
66
66
|
m.prototype._events = void 0;
|
|
67
67
|
m.prototype._eventsCount = 0;
|
|
@@ -77,7 +77,7 @@ Object.defineProperty(m, "defaultMaxListeners", {
|
|
|
77
77
|
return w;
|
|
78
78
|
},
|
|
79
79
|
set: function(Z) {
|
|
80
|
-
if (typeof Z != "number" || Z < 0 ||
|
|
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
82
|
w = Z;
|
|
83
83
|
}
|
|
@@ -86,62 +86,62 @@ m.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
88
|
m.prototype.setMaxListeners = function(d) {
|
|
89
|
-
if (typeof d != "number" || d < 0 ||
|
|
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
|
|
93
|
+
function f(Z) {
|
|
94
94
|
return Z._maxListeners === void 0 ? m.defaultMaxListeners : Z._maxListeners;
|
|
95
95
|
}
|
|
96
96
|
m.prototype.getMaxListeners = function() {
|
|
97
|
-
return
|
|
97
|
+
return f(this);
|
|
98
98
|
};
|
|
99
99
|
m.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",
|
|
103
|
-
if (
|
|
104
|
-
b = b &&
|
|
102
|
+
var b = d === "error", V = this._events;
|
|
103
|
+
if (V !== void 0)
|
|
104
|
+
b = b && V.error === void 0;
|
|
105
105
|
else if (!b)
|
|
106
106
|
return !1;
|
|
107
107
|
if (b) {
|
|
108
|
-
var
|
|
109
|
-
if (l.length > 0 && (
|
|
110
|
-
throw
|
|
111
|
-
var
|
|
112
|
-
throw
|
|
108
|
+
var W;
|
|
109
|
+
if (l.length > 0 && (W = l[0]), W instanceof Error)
|
|
110
|
+
throw W;
|
|
111
|
+
var X = new Error("Unhandled error." + (W ? " (" + W.message + ")" : ""));
|
|
112
|
+
throw X.context = W, X;
|
|
113
113
|
}
|
|
114
|
-
var G =
|
|
114
|
+
var G = V[d];
|
|
115
115
|
if (G === void 0)
|
|
116
116
|
return !1;
|
|
117
117
|
if (typeof G == "function")
|
|
118
118
|
M(G, this, l);
|
|
119
119
|
else
|
|
120
|
-
for (var
|
|
120
|
+
for (var u = G.length, y = _(G, u), c = 0; c < u; ++c)
|
|
121
121
|
M(y[c], this, l);
|
|
122
122
|
return !0;
|
|
123
123
|
};
|
|
124
|
-
function
|
|
125
|
-
var b,
|
|
126
|
-
if (t(l),
|
|
124
|
+
function O(Z, d, l, c) {
|
|
125
|
+
var b, V, W;
|
|
126
|
+
if (t(l), V = Z._events, V === void 0 ? (V = Z._events = /* @__PURE__ */ Object.create(null), Z._eventsCount = 0) : (V.newListener !== void 0 && (Z.emit(
|
|
127
127
|
"newListener",
|
|
128
128
|
d,
|
|
129
129
|
l.listener ? l.listener : l
|
|
130
|
-
),
|
|
131
|
-
|
|
132
|
-
else if (typeof
|
|
133
|
-
|
|
134
|
-
var
|
|
135
|
-
|
|
130
|
+
), V = Z._events), W = V[d]), W === void 0)
|
|
131
|
+
W = V[d] = l, ++Z._eventsCount;
|
|
132
|
+
else if (typeof W == "function" ? W = V[d] = c ? [l, W] : [W, l] : c ? W.unshift(l) : W.push(l), b = f(Z), b > 0 && W.length > b && !W.warned) {
|
|
133
|
+
W.warned = !0;
|
|
134
|
+
var X = new Error("Possible EventEmitter memory leak detected. " + W.length + " " + String(d) + " listeners added. Use emitter.setMaxListeners() to increase limit");
|
|
135
|
+
X.name = "MaxListenersExceededWarning", X.emitter = Z, X.type = d, X.count = W.length, ul(X);
|
|
136
136
|
}
|
|
137
137
|
return Z;
|
|
138
138
|
}
|
|
139
139
|
m.prototype.addListener = function(d, l) {
|
|
140
|
-
return
|
|
140
|
+
return O(this, d, l, !1);
|
|
141
141
|
};
|
|
142
142
|
m.prototype.on = m.prototype.addListener;
|
|
143
143
|
m.prototype.prependListener = function(d, l) {
|
|
144
|
-
return
|
|
144
|
+
return O(this, d, l, !0);
|
|
145
145
|
};
|
|
146
146
|
function yl() {
|
|
147
147
|
if (!this.fired)
|
|
@@ -158,7 +158,7 @@ m.prototype.prependOnceListener = function(d, l) {
|
|
|
158
158
|
return t(l), this.prependListener(d, D(this, d, l)), this;
|
|
159
159
|
};
|
|
160
160
|
m.prototype.removeListener = function(d, l) {
|
|
161
|
-
var c, b,
|
|
161
|
+
var c, b, V, W, X;
|
|
162
162
|
if (t(l), b = this._events, b === void 0)
|
|
163
163
|
return this;
|
|
164
164
|
if (c = b[d], c === void 0)
|
|
@@ -166,14 +166,14 @@ m.prototype.removeListener = function(d, l) {
|
|
|
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 (
|
|
170
|
-
if (c[
|
|
171
|
-
|
|
169
|
+
for (V = -1, W = c.length - 1; W >= 0; W--)
|
|
170
|
+
if (c[W] === l || c[W].listener === l) {
|
|
171
|
+
X = c[W].listener, V = W;
|
|
172
172
|
break;
|
|
173
173
|
}
|
|
174
|
-
if (
|
|
174
|
+
if (V < 0)
|
|
175
175
|
return this;
|
|
176
|
-
|
|
176
|
+
V === 0 ? c.shift() : hl(c, V), 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
|
};
|
|
@@ -185,9 +185,9 @@ m.prototype.removeAllListeners = function(d) {
|
|
|
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
|
|
189
|
-
for (b = 0; b <
|
|
190
|
-
|
|
188
|
+
var V = Object.keys(c), W;
|
|
189
|
+
for (b = 0; b < V.length; ++b)
|
|
190
|
+
W = V[b], W !== "removeListener" && this.removeAllListeners(W);
|
|
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")
|
|
@@ -202,7 +202,7 @@ function r(Z, d, l) {
|
|
|
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 ?
|
|
205
|
+
return b === void 0 ? [] : typeof b == "function" ? l ? [b.listener || b] : [b] : l ? Jl(b) : _(b, b.length);
|
|
206
206
|
}
|
|
207
207
|
m.prototype.listeners = function(d) {
|
|
208
208
|
return r(this, d, !0);
|
|
@@ -226,32 +226,32 @@ function A(Z) {
|
|
|
226
226
|
return 0;
|
|
227
227
|
}
|
|
228
228
|
m.prototype.eventNames = function() {
|
|
229
|
-
return this._eventsCount > 0 ?
|
|
229
|
+
return this._eventsCount > 0 ? L(this._events) : [];
|
|
230
230
|
};
|
|
231
231
|
function _(Z, d) {
|
|
232
232
|
for (var l = new Array(d), c = 0; c < d; ++c)
|
|
233
233
|
l[c] = Z[c];
|
|
234
234
|
return l;
|
|
235
235
|
}
|
|
236
|
-
function
|
|
236
|
+
function hl(Z, d) {
|
|
237
237
|
for (; d + 1 < Z.length; d++)
|
|
238
238
|
Z[d] = Z[d + 1];
|
|
239
239
|
Z.pop();
|
|
240
240
|
}
|
|
241
|
-
function
|
|
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
|
|
246
|
+
function il(Z, d) {
|
|
247
247
|
return new Promise(function(l, c) {
|
|
248
|
-
function b(
|
|
249
|
-
Z.removeListener(d,
|
|
248
|
+
function b(W) {
|
|
249
|
+
Z.removeListener(d, V), c(W);
|
|
250
250
|
}
|
|
251
|
-
function
|
|
251
|
+
function V() {
|
|
252
252
|
typeof Z.removeListener == "function" && Z.removeListener("error", b), l([].slice.call(arguments));
|
|
253
253
|
}
|
|
254
|
-
q(Z, d,
|
|
254
|
+
q(Z, d, V, { once: !0 }), d !== "error" && Nl(Z, b, { once: !0 });
|
|
255
255
|
});
|
|
256
256
|
}
|
|
257
257
|
function Nl(Z, d, l) {
|
|
@@ -261,13 +261,13 @@ 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(
|
|
265
|
-
c.once && Z.removeEventListener(d, b), l(
|
|
264
|
+
Z.addEventListener(d, function b(V) {
|
|
265
|
+
c.once && Z.removeEventListener(d, b), l(V);
|
|
266
266
|
});
|
|
267
267
|
else
|
|
268
268
|
throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof Z);
|
|
269
269
|
}
|
|
270
|
-
class $ extends
|
|
270
|
+
class $ extends I.EventEmitter {
|
|
271
271
|
constructor(l) {
|
|
272
272
|
super();
|
|
273
273
|
R(this, "logger");
|
|
@@ -279,28 +279,28 @@ class $ extends L.EventEmitter {
|
|
|
279
279
|
on(l, c) {
|
|
280
280
|
var b;
|
|
281
281
|
try {
|
|
282
|
-
const
|
|
283
|
-
|
|
282
|
+
const V = this.listenerCount(l);
|
|
283
|
+
V > 25 && V % 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 (
|
|
289
|
+
} catch (V) {
|
|
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
|
|
297
|
-
|
|
296
|
+
const V = this.listenerCount(l);
|
|
297
|
+
V > 25 && V % 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 (
|
|
303
|
+
} catch (V) {
|
|
304
304
|
}
|
|
305
305
|
return super.addListener(l, c);
|
|
306
306
|
}
|
|
@@ -340,8 +340,8 @@ function z() {
|
|
|
340
340
|
function Fl() {
|
|
341
341
|
return typeof window.RTCRtpSender != "undefined" && typeof window.RTCRtpSender.prototype.createEncodedStreams != "undefined";
|
|
342
342
|
}
|
|
343
|
-
function
|
|
344
|
-
return
|
|
343
|
+
function Ll(Z) {
|
|
344
|
+
return J(this, null, function* () {
|
|
345
345
|
const d = new TextEncoder();
|
|
346
346
|
return yield crypto.subtle.importKey(
|
|
347
347
|
"raw",
|
|
@@ -354,7 +354,7 @@ function Il(Z) {
|
|
|
354
354
|
);
|
|
355
355
|
});
|
|
356
356
|
}
|
|
357
|
-
function
|
|
357
|
+
function Il() {
|
|
358
358
|
return Fl() || z();
|
|
359
359
|
}
|
|
360
360
|
class sl extends $ {
|
|
@@ -380,8 +380,8 @@ class sl extends $ {
|
|
|
380
380
|
* @param keyIndex
|
|
381
381
|
*/
|
|
382
382
|
onSetEncryptionKey(l, c, b) {
|
|
383
|
-
const
|
|
384
|
-
this.keyInfoMap.set(`${c != null ? c : "shared"}-${b != null ? b : 0}`,
|
|
383
|
+
const V = { key: l, participantId: c, keyIndex: b };
|
|
384
|
+
this.keyInfoMap.set(`${c != null ? c : "shared"}-${b != null ? b : 0}`, V), this.emit("setKey", V);
|
|
385
385
|
}
|
|
386
386
|
getKeys() {
|
|
387
387
|
return Array.from(this.keyInfoMap.values());
|
|
@@ -393,7 +393,7 @@ class sl extends $ {
|
|
|
393
393
|
this.emit("ratchetRequest", l, c);
|
|
394
394
|
}
|
|
395
395
|
}
|
|
396
|
-
class
|
|
396
|
+
class Hl extends sl {
|
|
397
397
|
constructor(l = {}) {
|
|
398
398
|
const c = e(n({}, l), { sharedKey: !0 });
|
|
399
399
|
super(c);
|
|
@@ -404,8 +404,8 @@ class kl extends sl {
|
|
|
404
404
|
* @param key
|
|
405
405
|
*/
|
|
406
406
|
setKey(l) {
|
|
407
|
-
return
|
|
408
|
-
const c = yield
|
|
407
|
+
return J(this, null, function* () {
|
|
408
|
+
const c = yield Ll(l);
|
|
409
409
|
this.onSetEncryptionKey(c);
|
|
410
410
|
});
|
|
411
411
|
}
|
|
@@ -414,18 +414,18 @@ const E = {
|
|
|
414
414
|
ParticipantEncryptionStatusChanged: "participantEncryptionStatusChanged",
|
|
415
415
|
Error: "encryptionError"
|
|
416
416
|
};
|
|
417
|
-
var
|
|
418
|
-
const ll = "dmFyIERkPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxOZD1PYmplY3QuZGVmaW5lUHJvcGVydGllczt2YXIgVmQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7dmFyIHJzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsRmQ9T2JqZWN0LmdldFByb3RvdHlwZU9mLEJkPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkseGQ9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxqZD1SZWZsZWN0LmdldDt2YXIgaXI9KGssTyxNKT0+TyBpbiBrP0RkKGssTyx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6TX0pOmtbT109TSxRPShrLE8pPT57Zm9yKHZhciBNIGluIE98fChPPXt9KSlCZC5jYWxsKE8sTSkmJmlyKGssTSxPW01dKTtpZihycylmb3IodmFyIE0gb2YgcnMoTykpeGQuY2FsbChPLE0pJiZpcihrLE0sT1tNXSk7cmV0dXJuIGt9LG90PShrLE8pPT5OZChrLFZkKE8pKTt2YXIgcD0oayxPLE0pPT4oaXIoayx0eXBlb2YgTyE9InN5bWJvbCI/TysiIjpPLE0pLE0pLG5zPShrLE8sTSk9PntpZighTy5oYXMoaykpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgIitNKX07dmFyIGVlPShrLE8sTSk9PihucyhrLE8sInJlYWQgZnJvbSBwcml2YXRlIGZpZWxkIiksTT9NLmNhbGwoayk6Ty5nZXQoaykpLEl0PShrLE8sTSk9PntpZihPLmhhcyhrKSl0aHJvdyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgdGhlIHNhbWUgcHJpdmF0ZSBtZW1iZXIgbW9yZSB0aGFuIG9uY2UiKTtPIGluc3RhbmNlb2YgV2Vha1NldD9PLmFkZChrKTpPLnNldChrLE0pfSxDZT0oayxPLE0sZGUpPT4obnMoayxPLCJ3cml0ZSB0byBwcml2YXRlIGZpZWxkIiksZGU/ZGUuY2FsbChrLE0pOk8uc2V0KGssTSksTSk7dmFyIHNzPShrLE8sTSk9PmpkKEZkKGspLE0sTyk7dmFyIHc9KGssTyxNKT0+bmV3IFByb21pc2UoKGRlLEF0KT0+e3ZhciBNdD1ZPT57dHJ5e3dlKE0ubmV4dChZKSl9Y2F0Y2goYmUpe0F0KGJlKX19LHE9WT0+e3RyeXt3ZShNLnRocm93KFkpKX1jYXRjaChiZSl7QXQoYmUpfX0sd2U9WT0+WS5kb25lP2RlKFkudmFsdWUpOlByb21pc2UucmVzb2x2ZShZLnZhbHVlKS50aGVuKE10LHEpO3dlKChNPU0uYXBwbHkoayxPKSkubmV4dCgpKX0pOyhmdW5jdGlvbigpe3ZhciB0cyxGZSxzZSxpZTsidXNlIHN0cmljdCI7Y29uc3Qgaz0iQUVTLUdDTSIsTT17a2V5OjEwLGRlbHRhOjMsYXVkaW86MSxlbXB0eTowfSxkZT0xMixNdD17c2hhcmVkS2V5OiExLHJhdGNoZXRTYWx0OiJSZWFsdGltZUtpdEZyYW1lRW5jcnlwdGlvbktleSIscmF0Y2hldFdpbmRvd1NpemU6OH07dmFyIHE9e30sd2U9e2dldCBleHBvcnRzKCl7cmV0dXJuIHF9LHNldCBleHBvcnRzKHQpe3E9dH19LFk9dHlwZW9mIFJlZmxlY3Q9PSJvYmplY3QiP1JlZmxlY3Q6bnVsbCxiZT1ZJiZ0eXBlb2YgWS5hcHBseT09ImZ1bmN0aW9uIj9ZLmFwcGx5OmZ1bmN0aW9uKHIsZSxuKXtyZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwocixlLG4pfSxjdDtZJiZ0eXBlb2YgWS5vd25LZXlzPT0iZnVuY3Rpb24iP2N0PVkub3duS2V5czpPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzP2N0PWZ1bmN0aW9uKHIpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhyKS5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhyKSl9OmN0PWZ1bmN0aW9uKHIpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhyKX07ZnVuY3Rpb24gaXModCl7Y29uc29sZSYmY29uc29sZS53YXJuJiZjb25zb2xlLndhcm4odCl9dmFyIGFyPU51bWJlci5pc05hTnx8ZnVuY3Rpb24ocil7cmV0dXJuIHIhPT1yfTtmdW5jdGlvbiBMKCl7TC5pbml0LmNhbGwodGhpcyl9d2UuZXhwb3J0cz1MLHEub25jZT1kcyxMLkV2ZW50RW1pdHRlcj1MLEwucHJvdG90eXBlLl9ldmVudHM9dm9pZCAwLEwucHJvdG90eXBlLl9ldmVudHNDb3VudD0wLEwucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnM9dm9pZCAwO3ZhciBvcj0xMDtmdW5jdGlvbiBkdCh0KXtpZih0eXBlb2YgdCE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgImxpc3RlbmVyIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRnVuY3Rpb24uIFJlY2VpdmVkIHR5cGUgJyt0eXBlb2YgdCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KEwsImRlZmF1bHRNYXhMaXN0ZW5lcnMiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBvcn0sc2V0OmZ1bmN0aW9uKHQpe2lmKHR5cGVvZiB0IT0ibnVtYmVyInx8dDwwfHxhcih0KSl0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mICJkZWZhdWx0TWF4TGlzdGVuZXJzIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnK3QrIi4iKTtvcj10fX0pLEwuaW5pdD1mdW5jdGlvbigpeyh0aGlzLl9ldmVudHM9PT12b2lkIDB8fHRoaXMuX2V2ZW50cz09PU9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS5fZXZlbnRzKSYmKHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTApLHRoaXMuX21heExpc3RlbmVycz10aGlzLl9tYXhMaXN0ZW5lcnN8fHZvaWQgMH0sTC5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzPWZ1bmN0aW9uKHIpe2lmKHR5cGVvZiByIT0ibnVtYmVyInx8cjwwfHxhcihyKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mICJuIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnK3IrIi4iKTtyZXR1cm4gdGhpcy5fbWF4TGlzdGVuZXJzPXIsdGhpc307ZnVuY3Rpb24gY3IodCl7cmV0dXJuIHQuX21heExpc3RlbmVycz09PXZvaWQgMD9MLmRlZmF1bHRNYXhMaXN0ZW5lcnM6dC5fbWF4TGlzdGVuZXJzfUwucHJvdG90eXBlLmdldE1heExpc3RlbmVycz1mdW5jdGlvbigpe3JldHVybiBjcih0aGlzKX0sTC5wcm90b3R5cGUuZW1pdD1mdW5jdGlvbihyKXtmb3IodmFyIGU9W10sbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspZS5wdXNoKGFyZ3VtZW50c1tuXSk7dmFyIHM9cj09PSJlcnJvciIsaT10aGlzLl9ldmVudHM7aWYoaSE9PXZvaWQgMClzPXMmJmkuZXJyb3I9PT12b2lkIDA7ZWxzZSBpZighcylyZXR1cm4hMTtpZihzKXt2YXIgYTtpZihlLmxlbmd0aD4wJiYoYT1lWzBdKSxhIGluc3RhbmNlb2YgRXJyb3IpdGhyb3cgYTt2YXIgZD1uZXcgRXJyb3IoIlVuaGFuZGxlZCBlcnJvci4iKyhhPyIgKCIrYS5tZXNzYWdlKyIpIjoiIikpO3Rocm93IGQuY29udGV4dD1hLGR9dmFyIG89aVtyXTtpZihvPT09dm9pZCAwKXJldHVybiExO2lmKHR5cGVvZiBvPT0iZnVuY3Rpb24iKWJlKG8sdGhpcyxlKTtlbHNlIGZvcih2YXIgbD1vLmxlbmd0aCxtPWhyKG8sbCksbj0wO248bDsrK24pYmUobVtuXSx0aGlzLGUpO3JldHVybiEwfTtmdW5jdGlvbiBkcih0LHIsZSxuKXt2YXIgcyxpLGE7aWYoZHQoZSksaT10Ll9ldmVudHMsaT09PXZvaWQgMD8oaT10Ll9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0Ll9ldmVudHNDb3VudD0wKTooaS5uZXdMaXN0ZW5lciE9PXZvaWQgMCYmKHQuZW1pdCgibmV3TGlzdGVuZXIiLHIsZS5saXN0ZW5lcj9lLmxpc3RlbmVyOmUpLGk9dC5fZXZlbnRzKSxhPWlbcl0pLGE9PT12b2lkIDApYT1pW3JdPWUsKyt0Ll9ldmVudHNDb3VudDtlbHNlIGlmKHR5cGVvZiBhPT0iZnVuY3Rpb24iP2E9aVtyXT1uP1tlLGFdOlthLGVdOm4/YS51bnNoaWZ0KGUpOmEucHVzaChlKSxzPWNyKHQpLHM+MCYmYS5sZW5ndGg+cyYmIWEud2FybmVkKXthLndhcm5lZD0hMDt2YXIgZD1uZXcgRXJyb3IoIlBvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gIithLmxlbmd0aCsiICIrU3RyaW5nKHIpKyIgbGlzdGVuZXJzIGFkZGVkLiBVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdCIpO2QubmFtZT0iTWF4TGlzdGVuZXJzRXhjZWVkZWRXYXJuaW5nIixkLmVtaXR0ZXI9dCxkLnR5cGU9cixkLmNvdW50PWEubGVuZ3RoLGlzKGQpfXJldHVybiB0fUwucHJvdG90eXBlLmFkZExpc3RlbmVyPWZ1bmN0aW9uKHIsZSl7cmV0dXJuIGRyKHRoaXMscixlLCExKX0sTC5wcm90b3R5cGUub249TC5wcm90b3R5cGUuYWRkTGlzdGVuZXIsTC5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyPWZ1bmN0aW9uKHIsZSl7cmV0dXJuIGRyKHRoaXMscixlLCEwKX07ZnVuY3Rpb24gYXMoKXtpZighdGhpcy5maXJlZClyZXR1cm4gdGhpcy50YXJnZXQucmVtb3ZlTGlzdGVuZXIodGhpcy50eXBlLHRoaXMud3JhcEZuKSx0aGlzLmZpcmVkPSEwLGFyZ3VtZW50cy5sZW5ndGg9PT0wP3RoaXMubGlzdGVuZXIuY2FsbCh0aGlzLnRhcmdldCk6dGhpcy5saXN0ZW5lci5hcHBseSh0aGlzLnRhcmdldCxhcmd1bWVudHMpfWZ1bmN0aW9uIGxyKHQscixlKXt2YXIgbj17ZmlyZWQ6ITEsd3JhcEZuOnZvaWQgMCx0YXJnZXQ6dCx0eXBlOnIsbGlzdGVuZXI6ZX0scz1hcy5iaW5kKG4pO3JldHVybiBzLmxpc3RlbmVyPWUsbi53cmFwRm49cyxzfUwucHJvdG90eXBlLm9uY2U9ZnVuY3Rpb24ocixlKXtyZXR1cm4gZHQoZSksdGhpcy5vbihyLGxyKHRoaXMscixlKSksdGhpc30sTC5wcm90b3R5cGUucHJlcGVuZE9uY2VMaXN0ZW5lcj1mdW5jdGlvbihyLGUpe3JldHVybiBkdChlKSx0aGlzLnByZXBlbmRMaXN0ZW5lcihyLGxyKHRoaXMscixlKSksdGhpc30sTC5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI9ZnVuY3Rpb24ocixlKXt2YXIgbixzLGksYSxkO2lmKGR0KGUpLHM9dGhpcy5fZXZlbnRzLHM9PT12b2lkIDApcmV0dXJuIHRoaXM7aWYobj1zW3JdLG49PT12b2lkIDApcmV0dXJuIHRoaXM7aWYobj09PWV8fG4ubGlzdGVuZXI9PT1lKS0tdGhpcy5fZXZlbnRzQ291bnQ9PT0wP3RoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpOihkZWxldGUgc1tyXSxzLnJlbW92ZUxpc3RlbmVyJiZ0aGlzLmVtaXQoInJlbW92ZUxpc3RlbmVyIixyLG4ubGlzdGVuZXJ8fGUpKTtlbHNlIGlmKHR5cGVvZiBuIT0iZnVuY3Rpb24iKXtmb3IoaT0tMSxhPW4ubGVuZ3RoLTE7YT49MDthLS0paWYoblthXT09PWV8fG5bYV0ubGlzdGVuZXI9PT1lKXtkPW5bYV0ubGlzdGVuZXIsaT1hO2JyZWFrfWlmKGk8MClyZXR1cm4gdGhpcztpPT09MD9uLnNoaWZ0KCk6b3MobixpKSxuLmxlbmd0aD09PTEmJihzW3JdPW5bMF0pLHMucmVtb3ZlTGlzdGVuZXIhPT12b2lkIDAmJnRoaXMuZW1pdCgicmVtb3ZlTGlzdGVuZXIiLHIsZHx8ZSl9cmV0dXJuIHRoaXN9LEwucHJvdG90eXBlLm9mZj1MLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcixMLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnM9ZnVuY3Rpb24ocil7dmFyIGUsbixzO2lmKG49dGhpcy5fZXZlbnRzLG49PT12b2lkIDApcmV0dXJuIHRoaXM7aWYobi5yZW1vdmVMaXN0ZW5lcj09PXZvaWQgMClyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09PTA/KHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTApOm5bcl0hPT12b2lkIDAmJigtLXRoaXMuX2V2ZW50c0NvdW50PT09MD90aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKTpkZWxldGUgbltyXSksdGhpcztpZihhcmd1bWVudHMubGVuZ3RoPT09MCl7dmFyIGk9T2JqZWN0LmtleXMobiksYTtmb3Iocz0wO3M8aS5sZW5ndGg7KytzKWE9aVtzXSxhIT09InJlbW92ZUxpc3RlbmVyIiYmdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoYSk7cmV0dXJuIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCJyZW1vdmVMaXN0ZW5lciIpLHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTAsdGhpc31pZihlPW5bcl0sdHlwZW9mIGU9PSJmdW5jdGlvbiIpdGhpcy5yZW1vdmVMaXN0ZW5lcihyLGUpO2Vsc2UgaWYoZSE9PXZvaWQgMClmb3Iocz1lLmxlbmd0aC0xO3M+PTA7cy0tKXRoaXMucmVtb3ZlTGlzdGVuZXIocixlW3NdKTtyZXR1cm4gdGhpc307ZnVuY3Rpb24gdXIodCxyLGUpe3ZhciBuPXQuX2V2ZW50cztpZihuPT09dm9pZCAwKXJldHVybltdO3ZhciBzPW5bcl07cmV0dXJuIHM9PT12b2lkIDA/W106dHlwZW9mIHM9PSJmdW5jdGlvbiI/ZT9bcy5saXN0ZW5lcnx8c106W3NdOmU/Y3Mocyk6aHIocyxzLmxlbmd0aCl9TC5wcm90b3R5cGUubGlzdGVuZXJzPWZ1bmN0aW9uKHIpe3JldHVybiB1cih0aGlzLHIsITApfSxMLnByb3RvdHlwZS5yYXdMaXN0ZW5lcnM9ZnVuY3Rpb24ocil7cmV0dXJuIHVyKHRoaXMsciwhMSl9LEwubGlzdGVuZXJDb3VudD1mdW5jdGlvbih0LHIpe3JldHVybiB0eXBlb2YgdC5saXN0ZW5lckNvdW50PT0iZnVuY3Rpb24iP3QubGlzdGVuZXJDb3VudChyKTpwci5jYWxsKHQscil9LEwucHJvdG90eXBlLmxpc3RlbmVyQ291bnQ9cHI7ZnVuY3Rpb24gcHIodCl7dmFyIHI9dGhpcy5fZXZlbnRzO2lmKHIhPT12b2lkIDApe3ZhciBlPXJbdF07aWYodHlwZW9mIGU9PSJmdW5jdGlvbiIpcmV0dXJuIDE7aWYoZSE9PXZvaWQgMClyZXR1cm4gZS5sZW5ndGh9cmV0dXJuIDB9TC5wcm90b3R5cGUuZXZlbnROYW1lcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ldmVudHNDb3VudD4wP2N0KHRoaXMuX2V2ZW50cyk6W119O2Z1bmN0aW9uIGhyKHQscil7Zm9yKHZhciBlPW5ldyBBcnJheShyKSxuPTA7bjxyOysrbillW25dPXRbbl07cmV0dXJuIGV9ZnVuY3Rpb24gb3ModCxyKXtmb3IoO3IrMTx0Lmxlbmd0aDtyKyspdFtyXT10W3IrMV07dC5wb3AoKX1mdW5jdGlvbiBjcyh0KXtmb3IodmFyIHI9bmV3IEFycmF5KHQubGVuZ3RoKSxlPTA7ZTxyLmxlbmd0aDsrK2UpcltlXT10W2VdLmxpc3RlbmVyfHx0W2VdO3JldHVybiByfWZ1bmN0aW9uIGRzKHQscil7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUsbil7ZnVuY3Rpb24gcyhhKXt0LnJlbW92ZUxpc3RlbmVyKHIsaSksbihhKX1mdW5jdGlvbiBpKCl7dHlwZW9mIHQucmVtb3ZlTGlzdGVuZXI9PSJmdW5jdGlvbiImJnQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixzKSxlKFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKSl9ZnIodCxyLGkse29uY2U6ITB9KSxyIT09ImVycm9yIiYmbHModCxzLHtvbmNlOiEwfSl9KX1mdW5jdGlvbiBscyh0LHIsZSl7dHlwZW9mIHQub249PSJmdW5jdGlvbiImJmZyKHQsImVycm9yIixyLGUpfWZ1bmN0aW9uIGZyKHQscixlLG4pe2lmKHR5cGVvZiB0Lm9uPT0iZnVuY3Rpb24iKW4ub25jZT90Lm9uY2UocixlKTp0Lm9uKHIsZSk7ZWxzZSBpZih0eXBlb2YgdC5hZGRFdmVudExpc3RlbmVyPT0iZnVuY3Rpb24iKXQuYWRkRXZlbnRMaXN0ZW5lcihyLGZ1bmN0aW9uIHMoaSl7bi5vbmNlJiZ0LnJlbW92ZUV2ZW50TGlzdGVuZXIocixzKSxlKGkpfSk7ZWxzZSB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgImVtaXR0ZXIiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBFdmVudEVtaXR0ZXIuIFJlY2VpdmVkIHR5cGUgJyt0eXBlb2YgdCl9dmFyIFQ7KGZ1bmN0aW9uKHQpe3RbdC5NQUpPUl9FVkVOVD0wXT0iTUFKT1JfRVZFTlQiLHRbdC5NSU5PUl9FVkVOVD0xXT0iTUlOT1JfRVZFTlQifSkoVHx8KFQ9e30pKTt2YXIgUzsoZnVuY3Rpb24odCl7dC5QUkVDQUxMX1RFU1RfQkVHSU49InByZWNhbGxfYmVnaW4iLHQuUFJFQ0FMTF9URVNUX0NPTVBMRVRFPSJwcmVjYWxsX2VuZCIsdC5DQUxMX0pPSU5fQkVHSU49ImNhbGxfam9pbiIsdC5ORVRfUVVBTElUWV9URVNUX0JFR0lOPSJuZXRfcXVhbGl0eV90ZXN0X2JlZ2luIix0Lk5FVF9RVUFMSVRZX1RFU1RfRU5EPSJuZXRfcXVhbGl0eV90ZXN0X2VuZCIsdC5XRUJTT0NLRVRfQ09OTkVDVEVEPSJ3ZWJzb2NrZXRfY29ubmVjdGVkIix0LlRSQU5TUE9SVF9DT05ORUNURUQ9InRyYW5zcG9ydF9jb25uZWN0ZWQiLHQuQVVESU9fT049ImF1ZGlvX29uIix0LkFVRElPX09GRj0iYXVkaW9fb2ZmIix0LlZJREVPX09OPSJ2aWRlb19vbiIsdC5WSURFT19PRkY9InZpZGVvX29mZiIsdC5QQVJUSUNJUEFOVF9ST0xFPSJwYXJ0aWNpcGFudF9yb2xlIix0LlBJTkdfU1RBVD0icGluZ19zdGF0Iix0LkRJU0NPTk5FQ1Q9ImRpc2Nvbm5lY3QiLHQuUkVDT05ORUNUX0FUVEVNUFQ9InJlY29ubmVjdF9hdHRlbXB0Iix0LlNDUkVFTlNIQVJFX1NUQVJUX1JFUVVFU1RFRD0ic2NyZWVuc2hhcmVfc3RhcnRfcmVxdWVzdGVkIix0LlNDUkVFTlNIQVJFX1NUQVJURUQ9InNjcmVlbnNoYXJlX3N0YXJ0ZWQiLHQuU0NSRUVOU0hBUkVfU1RPUFBFRD0ic2NyZWVuc2hhcmVfc3RvcHBlZCIsdC5UQUJfQ0hBTkdFPSJ0YWJfY2hhbmdlIix0LkJST1dTRVJfQkFDS0dST1VOREVEPSJicm93c2VyX2JhY2tncm91bmRlZCIsdC5CUk9XU0VSX0ZPUkVHUk9VTkRFRD0iYnJvd3Nlcl9mb3JlZ3JvdW5kZWQiLHQuRE9NSU5BTlRfU1BFQUtFUj0iZG9taW5hbnRfc3BlYWtlciIsdC5BVURJT19ERVZJQ0VTX1VQREFURVM9ImF1ZGlvX2RldmljZXNfdXBkYXRlcyIsdC5WSURFT19ERVZJQ0VTX1VQREFURVM9InZpZGVvX2RldmljZXNfdXBkYXRlcyIsdC5TUEVBS0VSX0RFVklDRVNfVVBEQVRFUz0ic3BlYWtlcl9kZXZpY2VzX3VwZGF0ZXMiLHQuU0VMRUNURURfTUlDUk9IUE9ORV9VUERBVEU9InNlbGVjdGVkX21pY3JvcGhvbmVfdXBkYXRlIix0LlNFTEVDVEVEX0NBTUVSQV9VUERBVEU9InNlbGVjdGVkX2NhbWVyYV91cGRhdGUiLHQuU0VMRUNURURfU1BFQUtFUl9VUERBVEU9InNlbGVjdGVkX3NwZWFrZXJfdXBkYXRlIix0LkVYUEVDVEVEX1ZJREVPX1JFU09MVVRJT049ImV4cGVjdGVkX3ZpZGVvX3Jlc29sdXRpb24iLHQuRVhQRUNURURfU0NSRUVOU0hBUkVfUkVTT0xVVElPTj0iZXhwZWN0ZWRfc2NyZWVuc2hhcmVfcmVzb2x1dGlvbiIsdC5NRURJQV9QRVJNSVNTSU9OPSJtZWRpYV9wZXJtaXNzaW9uIix0LkxFR0FDWV9TV0lUQ0g9ImxlZ2FjeV9zd2l0Y2giLHQuQVVESU9fUExBWV9GQUlMRUQ9ImF1ZGlvX3BsYXlfZmFpbGVkIix0LlZJREVPX1BMQVlfRkFJTEVEPSJ2aWRlb19wbGF5X2ZhaWxlZCIsdC5BVURJT19UUkFDS19NVVRFRD0iYXVkaW9fdHJhY2tfbXV0ZWQiLHQuVklERU9fVFJBQ0tfTVVURUQ9InZpZGVvX3RyYWNrX211dGVkIix0LklWU19QTEFZRVJfUkVCVUZGRVJJTkc9Iml2c19wbGF5ZXJfcmVidWZmZXJpbmciLHQuSVZTX1BMQVlFUl9BVURJT19CTE9DS0VEPSJpdnNfcGxheWVyX2F1ZGlvX2Jsb2NrZWQiLHQuSVZTX1BMQVlFUl9QTEFZQkFDS19CTE9DS0VEPSJpdnNfcGxheWVyX3BsYXliYWNrX2Jsb2NrZWQiLHQuSVZTX1BMQVlFUl9FUlJPUj0iaXZzX3BsYXllcl9lcnJvciIsdC5JVlNfUExBWUVSX1JFQ09WRVJBQkxFX0VSUk9SPSJpdnNfcGxheWVyX3JlY292ZXJhYmxlX2Vycm9yIix0LklWU19QTEFZRVJfV09SS0VSX0VSUk9SPSJpdnNfcGxheWVyX3dvcmtlcl9lcnJvciIsdC5JVlNfUExBWUVSX05FVFdPUktfVU5BVkFJTEFCTEU9Iml2c19wbGF5ZXJfbmV0d29ya191bmF2YWlsYWJsZSIsdC5MSVZFU1RSRUFNX0xBVEVOQ1k9ImxpdmVzdHJlYW1fbGF0ZW5jeSIsdC5JVlNfUExBWUVSX0FOQUxZVElDU19FVkVOVD0iaXZzX3BsYXllcl9hbmFseXRpY3NfZXZlbnQiLHQuSVZTX1BMQVlFUl9QTEFZQkFDS19SQVRFX0NIQU5HRUQ9Iml2c19wbGF5ZXJfcGxheWJhY2tfcmF0ZV9jaGFuZ2VkIix0LklWU19QTEFZRVJfUVVBTElUWV9DSEFOR0VEPSJpdnNfcGxheWVyX3F1YWxpdHlfY2hhbmdlZCIsdC5JVlNfUExBWUVSX0lOSVRJQUxJWkVEPSJpdnNfcGxheWVyX2luaXRpYWxpemVkIn0pKFN8fChTPXt9KSk7Y29uc3QgdXM9bmV3IE1hcChbW1MuUFJFQ0FMTF9URVNUX0JFR0lOLFQuTUlOT1JfRVZFTlRdLFtTLlBSRUNBTExfVEVTVF9DT01QTEVURSxULk1JTk9SX0VWRU5UXSxbUy5DQUxMX0pPSU5fQkVHSU4sVC5NQUpPUl9FVkVOVF0sW1MuTkVUX1FVQUxJVFlfVEVTVF9CRUdJTixULk1JTk9SX0VWRU5UXSxbUy5ORVRfUVVBTElUWV9URVNUX0VORCxULk1JTk9SX0VWRU5UXSxbUy5XRUJTT0NLRVRfQ09OTkVDVEVELFQuTUlOT1JfRVZFTlRdLFtTLlRSQU5TUE9SVF9DT05ORUNURUQsVC5NQUpPUl9FVkVOVF0sW1MuQVVESU9fT04sVC5NSU5PUl9FVkVOVF0sW1MuQVVESU9fT0ZGLFQuTUlOT1JfRVZFTlRdLFtTLlZJREVPX09OLFQuTUlOT1JfRVZFTlRdLFtTLlZJREVPX09GRixULk1JTk9SX0VWRU5UXSxbUy5QQVJUSUNJUEFOVF9ST0xFLFQuTUlOT1JfRVZFTlRdLFtTLlBJTkdfU1RBVCxULk1BSk9SX0VWRU5UXSxbUy5ESVNDT05ORUNULFQuTUFKT1JfRVZFTlRdLFtTLlJFQ09OTkVDVF9BVFRFTVBULFQuTUFKT1JfRVZFTlRdLFtTLlNDUkVFTlNIQVJFX1NUQVJUX1JFUVVFU1RFRCxULk1JTk9SX0VWRU5UXSxbUy5TQ1JFRU5TSEFSRV9TVEFSVEVELFQuTUlOT1JfRVZFTlRdLFtTLlNDUkVFTlNIQVJFX1NUT1BQRUQsVC5NSU5PUl9FVkVOVF0sW1MuVEFCX0NIQU5HRSxULk1JTk9SX0VWRU5UXSxbUy5CUk9XU0VSX0JBQ0tHUk9VTkRFRCxULk1JTk9SX0VWRU5UXSxbUy5CUk9XU0VSX0ZPUkVHUk9VTkRFRCxULk1JTk9SX0VWRU5UXSxbUy5ET01JTkFOVF9TUEVBS0VSLFQuTUlOT1JfRVZFTlRdLFtTLkFVRElPX0RFVklDRVNfVVBEQVRFUyxULk1JTk9SX0VWRU5UXSxbUy5WSURFT19ERVZJQ0VTX1VQREFURVMsVC5NSU5PUl9FVkVOVF0sW1MuU1BFQUtFUl9ERVZJQ0VTX1VQREFURVMsVC5NSU5PUl9FVkVOVF0sW1MuU0VMRUNURURfTUlDUk9IUE9ORV9VUERBVEUsVC5NSU5PUl9FVkVOVF0sW1MuU0VMRUNURURfQ0FNRVJBX1VQREFURSxULk1JTk9SX0VWRU5UXSxbUy5TRUxFQ1RFRF9TUEVBS0VSX1VQREFURSxULk1JTk9SX0VWRU5UXSxbUy5NRURJQV9QRVJNSVNTSU9OLFQuTUlOT1JfRVZFTlRdLFtTLkxFR0FDWV9TV0lUQ0gsVC5NSU5PUl9FVkVOVF0sW1MuQVVESU9fUExBWV9GQUlMRUQsVC5NSU5PUl9FVkVOVF0sW1MuVklERU9fUExBWV9GQUlMRUQsVC5NSU5PUl9FVkVOVF0sW1MuQVVESU9fVFJBQ0tfTVVURUQsVC5NSU5PUl9FVkVOVF0sW1MuVklERU9fVFJBQ0tfTVVURUQsVC5NSU5PUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9SRUJVRkZFUklORyxULk1BSk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX0FVRElPX0JMT0NLRUQsVC5NQUpPUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9QTEFZQkFDS19CTE9DS0VELFQuTUFKT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfRVJST1IsVC5NQUpPUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9SRUNPVkVSQUJMRV9FUlJPUixULk1BSk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX1dPUktFUl9FUlJPUixULk1BSk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX05FVFdPUktfVU5BVkFJTEFCTEUsVC5NQUpPUl9FVkVOVF0sW1MuTElWRVNUUkVBTV9MQVRFTkNZLFQuTUFKT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfQU5BTFlUSUNTX0VWRU5ULFQuTUlOT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfUExBWUJBQ0tfUkFURV9DSEFOR0VELFQuTUlOT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfUVVBTElUWV9DSEFOR0VELFQuTUlOT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfSU5JVElBTElaRUQsVC5NSU5PUl9FVkVOVF0sW1MuRVhQRUNURURfVklERU9fUkVTT0xVVElPTixULk1JTk9SX0VWRU5UXSxbUy5FWFBFQ1RFRF9TQ1JFRU5TSEFSRV9SRVNPTFVUSU9OLFQuTUlOT1JfRVZFTlRdXSk7Y2xhc3MgcHN7Y29uc3RydWN0b3IoKXtwKHRoaXMsImV2ZW50cyIpO3RoaXMuZXZlbnRzPVtdfWFkZChyKXt0aGlzLmV2ZW50cy5wdXNoKHIpfWZsdXNoKCl7cmV0dXJue2VudHJpZXM6dGhpcy5ldmVudHMuc3BsaWNlKDAsMjUpfX19Y2xhc3MgaHMgZXh0ZW5kcyBxe2NvbnN0cnVjdG9yKHtsb2dnZXI6ZSxwZWVySWQ6bixhcGlIb3N0bmFtZXM6c30pe3N1cGVyKCk7cCh0aGlzLCJsb2dnZXIiKTtwKHRoaXMsInBlZXJJZCIpO3AodGhpcywiZXZlbnRTdG9yZSIpO3AodGhpcywiYXBpRW5kcG9pbnQiKTt0aGlzLmxvZ2dlcj1lLHRoaXMucGVlcklkPW4sdGhpcy5hcGlFbmRwb2ludD1gaHR0cHM6Ly8ke3MuZGFDb2xsZWN0b3J9L2FwaS92MS9tZXNzYWdlYCx0aGlzLmV2ZW50U3RvcmU9bmV3IHBzfXNlbmRFdmVudHNDaHVua1RvU2VydmVyKGUpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXt2YXIgcztjb25zdCBuPXtwYXlsb2FkOmUscGVlcklkOnRoaXMucGVlcklkfTt0cnl7cmV0dXJuIHlpZWxkIGZldGNoKHRoaXMuYXBpRW5kcG9pbnQse21ldGhvZDoiUE9TVCIsYm9keTpKU09OLnN0cmluZ2lmeShuKX0pLCEwfWNhdGNoKGkpe3JldHVybiB0aGlzLmxvZ2dlci5lcnJvcigiY2FsbFN0YXRzOjpzZW5kRXZlbnRzQ2h1bmtUb1NlcnZlcjo6Y2F0Y2giLHtlcnJvcjppfSksKHM9ZS5lbnRyaWVzKT09bnVsbHx8cy5mb3JFYWNoKGE9Pnt0aGlzLmV2ZW50U3RvcmUuYWRkKGEpfSksITF9fSl9Y2FsbEV2ZW50KGUpe2UudGltZXN0YW1wPW5ldyBEYXRlLHRoaXMuZXZlbnRTdG9yZS5hZGQoZSksdGhpcy5lbWl0KGUuZXZlbnQsZS5tZXRhRGF0YSksdXMuZ2V0KGUuZXZlbnQpPT09VC5NQUpPUl9FVkVOVCYmdGhpcy5mbHVzaCgpfWZsdXNoKCl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3ZhciBuO2NvbnN0IGU9dGhpcy5ldmVudFN0b3JlLmZsdXNoKCk7cmV0dXJuKG49ZT09bnVsbD92b2lkIDA6ZS5lbnRyaWVzKSE9bnVsbCYmbi5sZW5ndGg/KHlpZWxkIHRoaXMuc2VuZEV2ZW50c0NodW5rVG9TZXJ2ZXIoZSksITApOiExfSl9fXZhciBtcjsoZnVuY3Rpb24odCl7dC5DSFJPTUlVTT0iY2hyb211bSIsdC5GSVJFRk9YPSJmaXJlZm94Iix0LlNBRkFSST0ic2FmYXJpIn0pKG1yfHwobXI9e30pKTtjb25zdCBncj17REVWRUw6ImRldmVsIixQUkVQUk9EOiJwcmVwcm9kIixQUk9EOiJwcm9kIn07dmFyIEo7KGZ1bmN0aW9uKHQpe3QuQVVESU89IkFVRElPIix0LlZJREVPPSJWSURFTyIsdC5TUEVBS0VSPSJTUEVBS0VSIix0LlNDUkVFTlNIQVJFPSJTQ1JFRU5TSEFSRSJ9KShKfHwoSj17fSkpO3ZhciBTcjsoZnVuY3Rpb24odCl7dFt0LklOSVQ9MF09IklOSVQiLHRbdC5BQ0NFUFRFRD0xXT0iQUNDRVBURUQiLHRbdC5ERU5JRUQ9Ml09IkRFTklFRCIsdFt0LlNZU19ERU5JRUQ9M109IlNZU19ERU5JRUQiLHRbdC5GQUlMRUQ9NF09IkZBSUxFRCIsdFt0Lk5PVEZPVU5EPTVdPSJOT1RGT1VORCIsdFt0Lk5PVF9BUFBMSUNBQkxFPTZdPSJOT1RfQVBQTElDQUJMRSJ9KShTcnx8KFNyPXt9KSk7ZnVuY3Rpb24gYWUodCl7cmV0dXJuIHQ/dC5zcGxpdCgiLiIpLnNsaWNlKDAsMikuY29uY2F0KFsiMCIsIjAiXSkuam9pbigiLiIpOiIifWZ1bmN0aW9uIGx0KHtwYWNrZXRzTG9zdDp0LHBhY2tldHNTZW50OnJ9KXtyZXR1cm4gcj4wP3QqMTAwL3I6MH1mdW5jdGlvbiB1dCh7cGFja2V0c0xvc3Q6dCxwYWNrZXRzUmVjZWl2ZWQ6cn0pe3JldHVybiByK3Q+MD90KjEwMC8ocit0KTowfWNvbnN0IHZyPTI0MCx5cj03MjAsYnI9OCxFcj0zLHB0PTEwLGh0PS4wMixmdD0uMDM7ZnVuY3Rpb24gdGUoe3N0YXQ6dCx3ZWlnaHQ6cixyYW5nZU1pbjplLHJhbmdlTWF4Om4scmFuZ2VSYW5raW5nRGlyZWN0aW9uOnN9KXtyZXR1cm4gdD09bnVsbD9yOmU9PT1uP3M9PT0iVVAiP3Q8PWU/cjowOnQ+PW4/cjowOnM9PT0iVVAiPygxLU1hdGgubWF4KE1hdGgubWluKG4sTWF0aC5hYnModCkpLWUsMCkvKG4tZSkpKnI6cz09PSJET1dOIj9NYXRoLm1heChNYXRoLm1pbihuLE1hdGguYWJzKHQpKS1lLDApLyhuLWUpKnI6cn1mdW5jdGlvbiBfcih7aXNMb3dRdWFsaXR5VmlkZW86dCxpc1ZpZGVvU3R1Y2s6cixpc1ZpZGVvTGFnZ2luZzplLGppdHRlclF1YWxpdHk6bixwYWNrZXRzTG9zdFF1YWxpdHk6c30pe2NvbnN0IGk9LjgqKCh0Py44NToxKSooZT8uNzoxKSoocj8uNToxKSkrLjIqKG4qcyk7cmV0dXJuIE1hdGgucm91bmQoKGkrTnVtYmVyLkVQU0lMT04pKjEwMCkvMTAwfWZ1bmN0aW9uIFRyKHtwYWNrZXRzTG9zdDp0LHBhY2tldHNTZW50OnJ9KXtyZXR1cm4gcj4wP3QqMTAwL3I6MH1mdW5jdGlvbiBScih7cGFja2V0c0xvc3Q6dCxwYWNrZXRzU2VudDpyLGppdHRlcjplfSl7Y29uc3Qgcz10ZSh7c3RhdDpUcih7cGFja2V0c0xvc3Q6dCxwYWNrZXRzU2VudDpyfSksd2VpZ2h0Oi43LHJhbmdlTWluOjAscmFuZ2VNYXg6cHQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KSxhPXRlKHtzdGF0OmUsd2VpZ2h0Oi4zLHJhbmdlTWluOmh0LHJhbmdlTWF4OmZ0LHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSk7cmV0dXJuIHMrYX1mdW5jdGlvbiBmcyh7ZnJhbWVXaWR0aDp0LGlzU2NyZWVuU2hhcmU6cn0pe3JldHVybiB0PChyP3lyOnZyKX1mdW5jdGlvbiBtcyh7ZnJhbWVzUGVyU2Vjb25kOnQsaXNTY3JlZW5TaGFyZTpyfSl7cmV0dXJuIHQ8KHI/RXI6YnIpfWZ1bmN0aW9uIGdzKHtmcmFtZXNFbmNvZGVkOnR9KXtyZXR1cm4gdD09PTB9ZnVuY3Rpb24gUHIoe2ZyYW1lV2lkdGg6dCxmcmFtZXNQZXJTZWNvbmQ6cixwYWNrZXRzTG9zdDplLHBhY2tldHNTZW50Om4saml0dGVyOnMsaXNTY3JlZW5TaGFyZTppLGZyYW1lc0VuY29kZWQ6YX0pe2NvbnN0IGQ9dGUoe3N0YXQ6VHIoe3BhY2tldHNMb3N0OmUscGFja2V0c1NlbnQ6bn0pLHdlaWdodDoxLHJhbmdlTWluOjAscmFuZ2VNYXg6cHQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KSxvPXRlKHtzdGF0OnMsd2VpZ2h0OjEscmFuZ2VNaW46aHQscmFuZ2VNYXg6ZnQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KSxsPWZzKHtmcmFtZVdpZHRoOnQsaXNTY3JlZW5TaGFyZTppfSksbT1tcyh7ZnJhbWVzUGVyU2Vjb25kOnIsaXNTY3JlZW5TaGFyZTppfSksdj1ncyh7ZnJhbWVzRW5jb2RlZDphLGlzU2NyZWVuU2hhcmU6aX0pO3JldHVybiBfcih7aXNMb3dRdWFsaXR5VmlkZW86bCxpc1ZpZGVvTGFnZ2luZzptLGlzVmlkZW9TdHVjazp2LGppdHRlclF1YWxpdHk6byxwYWNrZXRzTG9zdFF1YWxpdHk6ZH0pfWZ1bmN0aW9uIENyKHtwYWNrZXRzTG9zdDp0LHBhY2tldHNSZWNlaXZlZDpyfSl7cmV0dXJuIHIrdD4wP3QqMTAwLyhyK3QpOjB9ZnVuY3Rpb24gd3Ioe2NvbmNlYWxtZW50RXZlbnRzOnQscGFja2V0c0xvc3Q6cixwYWNrZXRzUmVjZWl2ZWQ6ZSxqaXR0ZXI6bn0pe2NvbnN0IGk9dGUoe3N0YXQ6dCx3ZWlnaHQ6LjIscmFuZ2VNaW46MCxyYW5nZU1heDozLHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSksYT0uNSxkPXRlKHtzdGF0OkNyKHtwYWNrZXRzTG9zdDpyLHBhY2tldHNSZWNlaXZlZDplfSksd2VpZ2h0OmEscmFuZ2VNaW46MCxyYW5nZU1heDpwdCxyYW5nZVJhbmtpbmdEaXJlY3Rpb246IlVQIn0pLGw9dGUoe3N0YXQ6bix3ZWlnaHQ6LjMscmFuZ2VNaW46aHQscmFuZ2VNYXg6ZnQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KTtyZXR1cm4gaStkK2x9ZnVuY3Rpb24gU3Moe2ZyYW1lc0RlY29kZWQ6dH0pe3JldHVybiB0PT09MH1mdW5jdGlvbiB2cyh7ZnJhbWVzUGVyU2Vjb25kOnQsaXNTY3JlZW5TaGFyZTpyfSl7cmV0dXJuIHQ8KHI/RXI6YnIpfWZ1bmN0aW9uIHlzKHtmcmFtZVdpZHRoOnQsaXNTY3JlZW5TaGFyZTpyfSl7cmV0dXJuIHQ8KHI/eXI6dnIpfWZ1bmN0aW9uIElyKHtmcmFtZVdpZHRoOnQsZnJhbWVzUGVyU2Vjb25kOnIscGFja2V0c0xvc3Q6ZSxwYWNrZXRzUmVjZWl2ZWQ6bixqaXR0ZXI6cyxpc1NjcmVlblNoYXJlOmksZnJhbWVzRGVjb2RlZDphfSl7Y29uc3QgZD10ZSh7c3RhdDpDcih7cGFja2V0c0xvc3Q6ZSxwYWNrZXRzUmVjZWl2ZWQ6bn0pLHdlaWdodDoxLHJhbmdlTWluOjAscmFuZ2VNYXg6cHQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KSxvPXRlKHtzdGF0OnMsd2VpZ2h0OjEscmFuZ2VNaW46aHQscmFuZ2VNYXg6ZnQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KSxsPXlzKHtmcmFtZVdpZHRoOnQsaXNTY3JlZW5TaGFyZTppfSksbT12cyh7ZnJhbWVzUGVyU2Vjb25kOnIsaXNTY3JlZW5TaGFyZTppfSksdj1Tcyh7ZnJhbWVzRGVjb2RlZDphLGlzU2NyZWVuU2hhcmU6aX0pO3JldHVybiBfcih7aXNMb3dRdWFsaXR5VmlkZW86bCxpc1ZpZGVvTGFnZ2luZzptLGlzVmlkZW9TdHVjazp2LGppdHRlclF1YWxpdHk6byxwYWNrZXRzTG9zdFF1YWxpdHk6ZH0pfWNsYXNzIHJle2NvbnN0cnVjdG9yKHIpe3AodGhpcywicGMxIik7cCh0aGlzLCJwYzIiKTtwKHRoaXMsImNvbnN0cmFpblZpZGVvQml0cmF0ZUticHMiKTtwKHRoaXMsImNvbnN0cmFpbk9mZmVyVG9SZW1vdmVWaWRlb0ZlYyIsITEpO3AodGhpcywiaWNlQ2FuZGlkYXRlRmlsdGVyIik7Y29uc3QgZT1uZXcgUlRDUGVlckNvbm5lY3Rpb24ociksbj1uZXcgUlRDUGVlckNvbm5lY3Rpb24ocik7dGhpcy5wYzE9ZSx0aGlzLnBjMj1uLHRoaXMuaWNlQ2FuZGlkYXRlRmlsdGVyPXJlLm5vRmlsdGVyLHRoaXMucGMxLmFkZEV2ZW50TGlzdGVuZXIoImljZWNhbmRpZGF0ZSIsdGhpcy5vbkljZUNhbmRpZGF0ZS5iaW5kKHRoaXMsdGhpcy5wYzIpKSx0aGlzLnBjMi5hZGRFdmVudExpc3RlbmVyKCJpY2VjYW5kaWRhdGUiLHRoaXMub25JY2VDYW5kaWRhdGUuYmluZCh0aGlzLHRoaXMucGMxKSl9c3RhdGljIHBhcnNlQ2FuZGlkYXRlKHIpe2NvbnN0IGU9ImNhbmRpZGF0ZToiLG49ci5pbmRleE9mKGUpK2UubGVuZ3RoLHM9ci5zdWJzdHIobikuc3BsaXQoIiAiKTtyZXR1cm57dHlwZTpzWzddLHByb3RvY29sOnNbMl0sYWRkcmVzczpzWzRdfX1zdGF0aWMgaXNOb3RIb3N0Q2FuZGlkYXRlKHIpe3JldHVybiByLnR5cGUhPT0iaG9zdCJ9c3RhdGljIGlzSG9zdChyKXtyZXR1cm4gci50eXBlPT09Imhvc3QifXN0YXRpYyBpc1JlbGF5KHIpe3JldHVybiByLnR5cGU9PT0icmVsYXkifXN0YXRpYyBpc1JlZmxleGl2ZShyKXtyZXR1cm4gci50eXBlPT09InNyZmx4In1zdGF0aWMgbm9GaWx0ZXIocil7cmV0dXJuITB9b25JY2VDYW5kaWRhdGUocixlKXtpZihlLmNhbmRpZGF0ZSl7Y29uc3Qgbj1yZS5wYXJzZUNhbmRpZGF0ZShlLmNhbmRpZGF0ZS5jYW5kaWRhdGUpO3RoaXMuaWNlQ2FuZGlkYXRlRmlsdGVyKG4pJiZyLmFkZEljZUNhbmRpZGF0ZShlLmNhbmRpZGF0ZSl9fXNldEljZUNhbmRpZGF0ZUZpbHRlcihyKXt0aGlzLmljZUNhbmRpZGF0ZUZpbHRlcj1yfWNvbnN0cmFpblZpZGVvQml0cmF0ZShyKXt0aGlzLmNvbnN0cmFpblZpZGVvQml0cmF0ZUticHM9cn1kaXNhYmxlVmlkZW9GZWMoKXt0aGlzLmNvbnN0cmFpbk9mZmVyVG9SZW1vdmVWaWRlb0ZlYz0hMH1nb3RPZmZlcihyKXt0aGlzLmNvbnN0cmFpbk9mZmVyVG9SZW1vdmVWaWRlb0ZlYyYmKHIuc2RwPXIuc2RwLnJlcGxhY2UoLyhtPXZpZGVvIDEgW15ccl0rKSgxMTYgMTE3KShcclxuKS9nLGAkMVxyCmApLHIuc2RwPXIuc2RwLnJlcGxhY2UoL2E9cnRwbWFwOjExNiByZWRcLzkwMDAwXHJcbi9nLCIiKSxyLnNkcD1yLnNkcC5yZXBsYWNlKC9hPXJ0cG1hcDoxMTcgdWxwZmVjXC85MDAwMFxyXG4vZywiIiksci5zZHA9ci5zZHAucmVwbGFjZSgvYT1ydHBtYXA6OTggcnR4XC85MDAwMFxyXG4vZywiIiksci5zZHA9ci5zZHAucmVwbGFjZSgvYT1mbXRwOjk4IGFwdD0xMTZcclxuL2csIiIpKSx0aGlzLnBjMS5zZXRMb2NhbERlc2NyaXB0aW9uKHIpLHRoaXMucGMyLnNldFJlbW90ZURlc2NyaXB0aW9uKHIpLHRoaXMucGMyLmNyZWF0ZUFuc3dlcigpLnRoZW4odGhpcy5nb3RBbnN3ZXIuYmluZCh0aGlzKSx0aGlzLnJlcG9ydEZhdGFsLmJpbmQodGhpcykpfWdvdEFuc3dlcihyKXt0aGlzLmNvbnN0cmFpblZpZGVvQml0cmF0ZUticHMmJihyLnNkcD1yLnNkcC5yZXBsYWNlKC9hPW1pZDp2aWRlb1xyXG4vZyxgYT1taWQ6dmlkZW9ccgpiPUFTOiR7dGhpcy5jb25zdHJhaW5WaWRlb0JpdHJhdGVLYnBzfVxyCmApKSx0aGlzLnBjMi5zZXRMb2NhbERlc2NyaXB0aW9uKHIpLHRoaXMucGMxLnNldFJlbW90ZURlc2NyaXB0aW9uKHIpfWVzdGFibGlzaENvbm5lY3Rpb24oKXt0aGlzLnBjMS5jcmVhdGVPZmZlcigpLnRoZW4odGhpcy5nb3RPZmZlci5iaW5kKHRoaXMpLHRoaXMucmVwb3J0RmF0YWwuYmluZCh0aGlzKSl9cmVwb3J0RmF0YWwocil7Y29uc29sZS5lcnJvcigiRXJyb3I6IixyKX1nZXRSb3VuZFRyaXBUaW1lKCl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0W3IsZV09eWllbGQgUHJvbWlzZS5hbGwoW3RoaXMucGMxLmdldFN0YXRzKCksdGhpcy5wYzIuZ2V0U3RhdHMoKV0pO2xldCBuLHM7aWYoci5mb3JFYWNoKGk9PntpLnR5cGU9PT0iY2FuZGlkYXRlLXBhaXIiJiZpLm5vbWluYXRlZD09PSEwJiZpLmJ5dGVzU2VudD4wJiYobj1pKX0pLGUuZm9yRWFjaChpPT57aS50eXBlPT09ImNhbmRpZGF0ZS1wYWlyIiYmaS5ub21pbmF0ZWQ9PT0hMCYmaS5ieXRlc1JlY2VpdmVkPjAmJihzPWkpfSksbiYmcyl0cnl7aWYobi5jdXJyZW50Um91bmRUcmlwVGltZSYmcy5jdXJyZW50Um91bmRUcmlwVGltZSlyZXR1cm57cnR0Om4uY3VycmVudFJvdW5kVHJpcFRpbWUsYmFja2VuZFJUVDpzLmN1cnJlbnRSb3VuZFRyaXBUaW1lfTtjb25zdCBpPShzLmxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcC1uLmxhc3RQYWNrZXRTZW50VGltZXN0YW1wKS8xZTM7cmV0dXJue3J0dDppLGJhY2tlbmRSVFQ6aX19Y2F0Y2goaSl7cmV0dXJufX0pfWNsb3NlKCl7dGhpcy5wYzEuY2xvc2UoKSx0aGlzLnBjMi5jbG9zZSgpfX1jbGFzcyBBciBleHRlbmRzIHF7Y29uc3RydWN0b3IoZSl7c3VwZXIoKTtwKHRoaXMsImNhbGwiKTtwKHRoaXMsInRpbWVPdXQiKTt0aGlzLmNhbGw9bmV3IHJlKGUpfXN0YXJ0KGU9MWU0KXt0aGlzLmNhbGwuZXN0YWJsaXNoQ29ubmVjdGlvbigpLHRoaXMudGltZU91dD1zZXRUaW1lb3V0KHRoaXMudGVzdEZhaWxlZC5iaW5kKHRoaXMpLGUpfXRlc3RDb21wbGV0ZShlKXtjbGVhclRpbWVvdXQodGhpcy50aW1lT3V0KSx0aGlzLmNhbGwuY2xvc2UoKSx0aGlzLmVtaXQoImRvbmUiLGUpfXRlc3RGYWlsZWQoZSl7dGhpcy5jYWxsLmNsb3NlKCksdGhpcy5lbWl0KCJmYWlsZWQiLGUpfX1jb25zdCBicz04LEVzPTEvMWUzO2NsYXNzIF9zIGV4dGVuZHMgQXJ7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSk7cCh0aGlzLCJzZW5kZXJDaGFubmVsIik7cCh0aGlzLCJyZWNpZXZlQ2hhbm5lbCIpO3AodGhpcywic3RhcnRUaW1lIik7cCh0aGlzLCJsYXN0Qml0cmF0ZU1lYXN1cmVUaW1lIik7cCh0aGlzLCJzZW50UGF5bG9hZEJ5dGVzIiwwKTtwKHRoaXMsInJlY2lldmVkUGF5bG9hZEJ5dGVzIiwwKTtwKHRoaXMsImxhc3RSZWNlaXZlZFBheWxvYWRCeXRlcyIsMCk7cCh0aGlzLCJzdG9wU2VuZGluZyIsITEpO3AodGhpcywidGVzdFByb2dyZXNzIiwwKTtwKHRoaXMsInNhbXBsZVBhY2tldCIsIiIpO3AodGhpcywiZmluYWxCaXRyYXRlU3VtIiwwKTtwKHRoaXMsImJpdFJhdGVTYW1wZWxzIiwwKTtwKHRoaXMsIm1heE51bWJlck9mUGFja2V0c1RvU2VuZCIsMCk7cCh0aGlzLCJieXRlc1RvS2VlcEJ1ZmZlcmVkIiwwKTtwKHRoaXMsInRlc3REdXJhdGlvblNlY29uZHMiLDUpO3RoaXMuY2FsbC5zZXRJY2VDYW5kaWRhdGVGaWx0ZXIocmUuaXNOb3RIb3N0Q2FuZGlkYXRlKSx0aGlzLnNlbmRlckNoYW5uZWw9dGhpcy5jYWxsLnBjMS5jcmVhdGVEYXRhQ2hhbm5lbChudWxsKTtmb3IobGV0IG49MDtuPDEwMjQqMjU2O24rPTEpdGhpcy5zYW1wbGVQYWNrZXQrPSJoIjt0aGlzLm1heE51bWJlck9mUGFja2V0c1RvU2VuZD0xLHRoaXMuYnl0ZXNUb0tlZXBCdWZmZXJlZD0xMDI0KnRoaXMubWF4TnVtYmVyT2ZQYWNrZXRzVG9TZW5kLHRoaXMudGVzdER1cmF0aW9uU2Vjb25kcz00LHRoaXMuc2VuZGVyQ2hhbm5lbC5hZGRFdmVudExpc3RlbmVyKCJvcGVuIix0aGlzLnNlbmRpbmdTdGVwLmJpbmQodGhpcykpLHRoaXMuY2FsbC5wYzIuYWRkRXZlbnRMaXN0ZW5lcigiZGF0YWNoYW5uZWwiLHRoaXMub25SZWNpZXZlckNoYW5uZWwuYmluZCh0aGlzKSl9c2VuZGluZ1N0ZXAoKXtjb25zdCBlPW5ldyBEYXRlO3RoaXMuc3RhcnRUaW1lfHwodGhpcy5zdGFydFRpbWU9ZSx0aGlzLmxhc3RCaXRyYXRlTWVhc3VyZVRpbWU9ZSk7Zm9yKGxldCBzPTA7cyE9PXRoaXMubWF4TnVtYmVyT2ZQYWNrZXRzVG9TZW5kJiYhKHRoaXMuc2VuZGVyQ2hhbm5lbC5idWZmZXJlZEFtb3VudD49dGhpcy5ieXRlc1RvS2VlcEJ1ZmZlcmVkKTtzKz0xKXt0aGlzLnNlbnRQYXlsb2FkQnl0ZXMrPXRoaXMuc2FtcGxlUGFja2V0Lmxlbmd0aDt0cnl7dGhpcy5zZW5kZXJDaGFubmVsLnNlbmQodGhpcy5zYW1wbGVQYWNrZXQpfWNhdGNoKGkpe319Y29uc3Qgbj1lLmdldFRpbWUoKS10aGlzLnN0YXJ0VGltZS5nZXRUaW1lKCk7bj49MWUzKnRoaXMudGVzdER1cmF0aW9uU2Vjb25kcz8odGhpcy5zdG9wU2VuZGluZz0hMCx0aGlzLnRlc3RQcm9ncmVzcz0xMDApOih0aGlzLnRlc3RQcm9ncmVzcz1uLygxMCp0aGlzLnRlc3REdXJhdGlvblNlY29uZHMpLHNldFRpbWVvdXQodGhpcy5zZW5kaW5nU3RlcC5iaW5kKHRoaXMpLDEpKX1vbk1lc3NhZ2VSZWNpZXZlZChlKXt0aGlzLnJlY2lldmVkUGF5bG9hZEJ5dGVzKz1lLmRhdGEubGVuZ3RoO2NvbnN0IG49bmV3IERhdGUscz1uLmdldFRpbWUoKS10aGlzLmxhc3RCaXRyYXRlTWVhc3VyZVRpbWUuZ2V0VGltZSgpO2lmKHM+PTFlMyl7Y29uc3QgYT0odGhpcy5yZWNpZXZlZFBheWxvYWRCeXRlcy10aGlzLmxhc3RSZWNlaXZlZFBheWxvYWRCeXRlcykqYnMvKHMvMWUzKTt0aGlzLmZpbmFsQml0cmF0ZVN1bSs9YSx0aGlzLmJpdFJhdGVTYW1wZWxzKz0xLHRoaXMubGFzdFJlY2VpdmVkUGF5bG9hZEJ5dGVzPXRoaXMucmVjaWV2ZWRQYXlsb2FkQnl0ZXMsdGhpcy5sYXN0Qml0cmF0ZU1lYXN1cmVUaW1lPW59aWYodGhpcy5zdG9wU2VuZGluZyYmdGhpcy5zZW50UGF5bG9hZEJ5dGVzPT09dGhpcy5yZWNpZXZlZFBheWxvYWRCeXRlcyl7Y29uc3QgaT10aGlzLmZpbmFsQml0cmF0ZVN1bS90aGlzLmJpdFJhdGVTYW1wZWxzO3RoaXMudGVzdENvbXBsZXRlKHt0aHJvdWdocHV0Ok1hdGgucm91bmQoaSpFcyl9KX19dGVzdENvbXBsZXRlKGUpe3RoaXMuY2FsbC5nZXRSb3VuZFRyaXBUaW1lKCkudGhlbigoe3J0dDpuLGJhY2tlbmRSVFQ6c30pPT5zdXBlci50ZXN0Q29tcGxldGUoe1JUVDpuLGJhY2tlbmRSVFQ6cyx0aHJvdWdocHV0OmUudGhyb3VnaHB1dH0pKX1vblJlY2lldmVyQ2hhbm5lbChlKXt0aGlzLnJlY2lldmVDaGFubmVsPWUuY2hhbm5lbCx0aGlzLnJlY2lldmVDaGFubmVsLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMub25NZXNzYWdlUmVjaWV2ZWQuYmluZCh0aGlzKSl9fWNsYXNzIGt0IGV4dGVuZHMgQXJ7Y29uc3RydWN0b3IoZSxuPXJlLm5vRmlsdGVyKXtzdXBlcihlKTtwKHRoaXMsImNoMSIpO3AodGhpcywiY2gyIik7dGhpcy5jYWxsLnNldEljZUNhbmRpZGF0ZUZpbHRlcihuKTtjb25zdCBzPXRoaXMuY2FsbC5wYzEuY3JlYXRlRGF0YUNoYW5uZWwobnVsbCk7dGhpcy5jaDE9cyxzLmFkZEV2ZW50TGlzdGVuZXIoIm9wZW4iLCgpPT57cy5zZW5kKCJoZWxsbyIpfSkscy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLm9uQ2gxUmVjaWV2ZS5iaW5kKHRoaXMpKSx0aGlzLmNhbGwucGMyLmFkZEV2ZW50TGlzdGVuZXIoImRhdGFjaGFubmVsIix0aGlzLmRhdGFDaGFubmVsSGFuZGxlci5iaW5kKHRoaXMpKX1vbkNoMVJlY2lldmUoZSl7ZS5kYXRhIT09IndvcmxkIj90aGlzLmhhbmd1cCgiSW52YWxpZCBkYXRhIHRyYW5zbWl0dGVkLiIpOnRoaXMudGVzdENvbXBsZXRlKHtjb25uZWN0aXZpdHk6ITB9KX1vbkNoMlJlY2lldmUoZSl7aWYoZS5kYXRhIT09ImhlbGxvIil0aGlzLmhhbmd1cCgiSW52YWxpZCBkYXRhIHRyYW5zbWl0dGVkLiIpO2Vsc2UgdHJ5e3RoaXMuY2gyLnNlbmQoIndvcmxkIil9Y2F0Y2gobil7fX1kYXRhQ2hhbm5lbEhhbmRsZXIoZSl7Y29uc3Qgbj1lLmNoYW5uZWw7dGhpcy5jaDI9bixuLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMub25DaDJSZWNpZXZlLmJpbmQodGhpcykpfWhhbmd1cChlKXt0aGlzLnRlc3RGYWlsZWQoZSl9fWNsYXNzIFRzIGV4dGVuZHMga3R7Y29uc3RydWN0b3Iocil7c3VwZXIocixyZS5pc0hvc3QpfX1jbGFzcyBScyBleHRlbmRzIGt0e2NvbnN0cnVjdG9yKHIpe3N1cGVyKHIscmUuaXNSZWxheSl9fWNsYXNzIFBzIGV4dGVuZHMga3R7Y29uc3RydWN0b3Iocil7c3VwZXIocixyZS5pc1JlZmxleGl2ZSl9fWNsYXNzIENze2NvbnN0cnVjdG9yKCl7cCh0aGlzLCJpcEluZm9ybWF0aW9uIixudWxsKX1nZXRJUERldGFpbHMocyl7cmV0dXJuIHcodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24qKHtwZWVySWQ6cixhcGlIb3N0bmFtZXM6ZSxsb2dnZXI6bn0pe3ZhciBpLGEsZDtpZighdGhpcy5pcEluZm9ybWF0aW9uKXt0cnl7Y29uc3Qgbz1gaHR0cHM6Ly8ke2UubG9jYXRpb259YCxtPXlpZWxkKHlpZWxkIGZldGNoKG8pKS5qc29uKCk7aWYoKChpPW0ubG9jKT09bnVsbD92b2lkIDA6aS5sZW5ndGgpPjUpcmV0dXJuIHRoaXMuaXBJbmZvcm1hdGlvbj1tLChhPXRoaXMuaXBJbmZvcm1hdGlvbikhPW51bGwmJmEuaXAmJih0aGlzLmlwSW5mb3JtYXRpb24uaXA9YWUodGhpcy5pcEluZm9ybWF0aW9uLmlwKSksbTt0aHJvdyBFcnJvcigiSW5zdWZmaWNpZW50IGRhdGEiKX1jYXRjaChvKXtuLmVycm9yKCJjYWxsc3RhdHM6OmlwRGV0YWlsczo6IGZhaWxlZCB0byBmZXRjaCBpcCB1c2luZyBsb2NhdGlvbiBzZXJ2aWNlIix7ZXJyb3I6b30pfXRyeXtjb25zdCBvPXlpZWxkIGZldGNoKGBodHRwczovLyR7ZS5sb2NhdGlvbkxlZ2FjeX0vP3Rva2VuPTNjNDkzOTMyYjA2MjRjJnBlZXJJZD0ke3J9YCx7bWV0aG9kOiJQT1NUIn0pO3RoaXMuaXBJbmZvcm1hdGlvbj15aWVsZCBvLmpzb24oKSwoZD10aGlzLmlwSW5mb3JtYXRpb24pIT1udWxsJiZkLmlwJiYodGhpcy5pcEluZm9ybWF0aW9uLmlwPWFlKHRoaXMuaXBJbmZvcm1hdGlvbi5pcCkpfWNhdGNoKG8pe24uZXJyb3IoImNhbGxzdGF0czo6aXBEZXRhaWxzOjogZmFpbGVkIHRvIGZldGNoIGlwIHVzaW5nIGxlZ2FjeSBsb2NhdGlvbiBzZXJ2aWNlIix7ZXJyb3I6b30pfX1yZXR1cm4gdGhpcy5pcEluZm9ybWF0aW9ufSl9cmVzZXRDYWNoZSgpe3RoaXMuaXBJbmZvcm1hdGlvbj1udWxsfX1jb25zdCBNcj1uZXcgQ3Msa3I9W3t1cmxzOiJ0dXJuOnR1cm4uZHl0ZS5pbjo0NDM/dHJhbnNwb3J0PXRjcCIsdXNlcm5hbWU6ImR5dGUiLGNyZWRlbnRpYWw6ImR5dGVpbiIsY3JlZGVudGlhbFR5cGU6InBhc3N3b3JkIn0se3VybHM6InR1cm46dHVybi5keXRlLmluOjM0Nzg/dHJhbnNwb3J0PXVkcCIsdXNlcm5hbWU6ImR5dGUiLGNyZWRlbnRpYWw6ImR5dGVpbiIsY3JlZGVudGlhbFR5cGU6InBhc3N3b3JkIn1dO2Z1bmN0aW9uIE9yKHQpe2NvbnN0W3IsZV09dC5zcGxpdCgiLCIpO3JldHVybntjb29yZHM6e2xhdGl0dWRlOk51bWJlcihyKSxsb25naXR1ZGU6TnVtYmVyKGUpfX19Y2xhc3MgTHJ7Y29uc3RydWN0b3IoKXtwKHRoaXMsInRyYW5zcG9ydCIpO3AodGhpcywiY2FuZGlkYXRlUGFpciIpO3AodGhpcywib3V0Ym91bmRWaWRlb1J0cCIsbmV3IE1hcCk7cCh0aGlzLCJpbmJvdW5kVmlkZW9SdHAiLG5ldyBNYXApO3AodGhpcywib3V0Ym91bmRBdWRpb1J0cCIsbmV3IE1hcCk7cCh0aGlzLCJpbmJvdW5kQXVkaW9SdHAiLG5ldyBNYXApO3AodGhpcywicmVtb3RlSW5ib3VuZFJ0cCIsbmV3IE1hcCk7cCh0aGlzLCJwcm9kdWNlclN0cmVhbU1hcCIsbmV3IE1hcCk7cCh0aGlzLCJjb25zdW1lclN0cmVhbU1hcCIsbmV3IE1hcCk7cCh0aGlzLCJzdGFsZVByb2R1Y2VyU3RyZWFtTWFwIiwhMSk7cCh0aGlzLCJzdGFsZUNvbnN1bWVyU3RyZWFtTWFwIiwhMSl9fWNsYXNzIERyIGV4dGVuZHMgcXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7cCh0aGlzLCJvYnNlcnZlciIpO3AodGhpcywib3V0Ym91bmRQcm9kdWNlck1hcCIsbmV3IE1hcCk7cCh0aGlzLCJpbmJvdW5kQ29uc3VtZXJNYXAiLG5ldyBNYXApO3AodGhpcywiY29uc3VtZXJQZWVySWRNYXAiLG5ldyBNYXApO3AodGhpcywicGF1c2VkQ29uc3VtZXJNYXAiLG5ldyBNYXApO3AodGhpcywicGF1c2VkUHJvZHVjZXJNYXAiLG5ldyBNYXApO3AodGhpcywib3ZlcmFsbFByb2R1Y2luZ1RyYW5zcG9ydHNTdGF0c01hcCIse30pO3AodGhpcywib3ZlcmFsbENvbnN1bWluZ1RyYW5zcG9ydHNTdGF0c01hcCIse30pO3AodGhpcywib3ZlcmFsbENvbnN1bWVyc1N0YXRzTWFwIix7fSk7cCh0aGlzLCJvdmVyYWxsUHJvZHVjZXJzU3RhdHNNYXAiLHt9KTtwKHRoaXMsInZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwIixuZXcgTWFwKTtwKHRoaXMsImF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwIixuZXcgTWFwKTtwKHRoaXMsInZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwIixuZXcgTWFwKTtwKHRoaXMsImF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwIixuZXcgTWFwKTtwKHRoaXMsImNvbnN1bWVySWRzV2l0aEZyZWV6ZWRWaWRlbyIsbmV3IFNldCk7cCh0aGlzLCJjb25zdW1lcklkc1dpdGhGcmVlemVkQXVkaW8iLG5ldyBTZXQpO3AodGhpcywicHJvZHVjZXJJZHNXaXRoRnJlZXplZFZpZGVvIixuZXcgU2V0KTtwKHRoaXMsInByb2R1Y2VySWRzV2l0aEZyZWV6ZWRBdWRpbyIsbmV3IFNldCk7cCh0aGlzLCJmcmVlemVkUHJvZHVjaW5nVHJhbnNwb3J0SWRzIixuZXcgU2V0KTtwKHRoaXMsImZyZWV6ZWRDb25zdW1pbmdUcmFuc3BvcnRJZHMiLG5ldyBTZXQpO3AodGhpcywic2NyZWVuU2hhcmVQcm9kdWNlcnMiLG5ldyBTZXQpO3AodGhpcywic2NyZWVuU2hhcmVDb25zdW1lcnMiLG5ldyBTZXQpO3AodGhpcywiaXBEZXRhaWxzIik7cCh0aGlzLCJjYWxsU3RhdHNJbnN0YW5jZSIpO3RoaXMub2JzZXJ2ZXI9bmV3IHF9cmVnaXN0ZXJQcm9kdWNlcihlKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5nZW5lcmF0ZVByb2R1Y2VyU3RyZWFtTWFwKGUpLGUub24oImNsb3NlIix0aGlzLmRlcmVnaXN0ZXJQcm9kdWNlci5iaW5kKHRoaXMsZSkpLGUub24oInBhdXNlIix0aGlzLnBhdXNlUHJvZHVjZXIuYmluZCh0aGlzLGUuaWQpKSxlLm9uKCJyZXN1bWUiLHRoaXMucmVzdW1lUHJvZHVjZXIuYmluZCh0aGlzLGUuaWQpKSxlLmFwcERhdGEuc2NyZWVuU2hhcmU9PT0hMCYmdGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5hZGQoZS5pZCl9KX1wYXVzZVByb2R1Y2VyKGUpe3RoaXMucGF1c2VkUHJvZHVjZXJNYXAuc2V0KGUse2xhc3RSZXBvcnRDYWxjdWxhdGVkOiExfSl9cmVzdW1lUHJvZHVjZXIoZSl7dGhpcy5wYXVzZWRQcm9kdWNlck1hcC5kZWxldGUoZSl9cHJvY2Vzc0luYm91bmRDb25zdW1lclZpZGVvU3RhdHMoZSxuLHMpe3ZhciBhLGQ7Y29uc3QgaT0oKGQ9KGE9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmEuY29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlc01hcCk9PW51bGw/dm9pZCAwOmQuZ2V0KGUpKXx8e307bi50b3RhbFZpZGVvUGFja2V0c1JlY2VpdmVkPT09cy5wYWNrZXRzUmVjZWl2ZWQ/KHRoaXMuY29uc3VtZXJJZHNXaXRoRnJlZXplZFZpZGVvLmFkZChlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLnZpZGVvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxzdGF0czo6bWVhc3VyZW1lbnRzOjpjb25zdW1lclZpZGVvRnJlZXplZCIse2NvbnN1bWVySWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoImNvbnN1bWVyX3ZpZGVvX3N0YXR1cyIsInBhdXNlIixlKSkpOihuLnRvdGFsVmlkZW9QYWNrZXRzUmVjZWl2ZWQ9cy5wYWNrZXRzUmVjZWl2ZWQsdGhpcy5jb25zdW1lcklkc1dpdGhGcmVlemVkVmlkZW8uaGFzKGUpJiYodGhpcy5jb25zdW1lcklkc1dpdGhGcmVlemVkVmlkZW8uZGVsZXRlKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkudmlkZW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbHN0YXRzOjptZWFzdXJlbWVudHM6OmNvbnN1bWVyVmlkZW9EZWZyZWV6ZWQiLHtjb25zdW1lcklkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJjb25zdW1lcl92aWRlb19zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NJbmJvdW5kQ29uc3VtZXJBdWRpb1N0YXRzKGUsbixzKXt2YXIgYSxkO2NvbnN0IGk9KChkPShhPXRoaXM9PW51bGw/dm9pZCAwOnRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDphLmNvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZXNNYXApPT1udWxsP3ZvaWQgMDpkLmdldChlKSl8fHt9O24udG90YWxBdWRpb1BhY2tldHNSZWNlaXZlZD09PXMucGFja2V0c1JlY2VpdmVkPyh0aGlzLmNvbnN1bWVySWRzV2l0aEZyZWV6ZWRBdWRpby5hZGQoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmaS5hdWRpbyYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6Om1lYXN1cmVtZW50czo6Y29uc3VtZXJBdWRpb0ZyZWV6ZWQiLHtjb25zdW1lcklkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJjb25zdW1lcl9hdWRpb19zdGF0dXMiLCJwYXVzZSIsZSkpKToobi50b3RhbEF1ZGlvUGFja2V0c1JlY2VpdmVkPXMucGFja2V0c1JlY2VpdmVkLHRoaXMuY29uc3VtZXJJZHNXaXRoRnJlZXplZEF1ZGlvLmhhcyhlKSYmKHRoaXMuY29uc3VtZXJJZHNXaXRoRnJlZXplZEF1ZGlvLmRlbGV0ZShlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLmF1ZGlvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpjb25zdW1lckF1ZGlvRGVmcmVlemVkIix7Y29uc3VtZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgiY29uc3VtZXJfYXVkaW9fc3RhdHVzIiwicmVzdW1lIixlKSkpKX1wcm9jZXNzT3V0Ym91bmRQcm9kdWNlclZpZGVvU3RhdHMoZSxuLHMpe3ZhciBhO2NvbnN0IGk9KChhPXRoaXM9PW51bGw/dm9pZCAwOnRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDphLmN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMpfHx7fTtuLnRvdGFsVmlkZW9QYWNrZXRzU2VudD09PXMucGFja2V0c1NlbnQ/KHRoaXMucHJvZHVjZXJJZHNXaXRoRnJlZXplZFZpZGVvLmFkZChlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLnZpZGVvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpwcm9kdWNlclZpZGVvRnJlZXplZCIse3Byb2R1Y2VySWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoInByb2R1Y2VyX3ZpZGVvX3N0YXR1cyIsInBhdXNlIixlKSkpOihuLnRvdGFsVmlkZW9QYWNrZXRzU2VudD1zLnBhY2tldHNTZW50LHRoaXMucHJvZHVjZXJJZHNXaXRoRnJlZXplZFZpZGVvLmhhcyhlKSYmKHRoaXMucHJvZHVjZXJJZHNXaXRoRnJlZXplZFZpZGVvLmRlbGV0ZShlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLnZpZGVvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpwcm9kdWNlclZpZGVvRGVmcmVlemVkIix7cHJvZHVjZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfdmlkZW9fc3RhdHVzIiwicmVzdW1lIixlKSkpKX1wcm9jZXNzT3V0Ym91bmRQcm9kdWNlckF1ZGlvU3RhdHMoZSxuLHMpe3ZhciBhO2NvbnN0IGk9KChhPXRoaXM9PW51bGw/dm9pZCAwOnRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDphLmN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMpfHx7fTtuLnRvdGFsQXVkaW9QYWNrZXRzU2VudD09PXMucGFja2V0c1NlbnQ/KHRoaXMucHJvZHVjZXJJZHNXaXRoRnJlZXplZEF1ZGlvLmFkZChlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLmF1ZGlvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpwcm9kdWNlckF1ZGlvRnJlZXplZCIse3Byb2R1Y2VySWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoInByb2R1Y2VyX2F1ZGlvX3N0YXR1cyIsInBhdXNlIixlKSkpOihuLnRvdGFsQXVkaW9QYWNrZXRzU2VudD1zLnBhY2tldHNTZW50LHRoaXMucHJvZHVjZXJJZHNXaXRoRnJlZXplZEF1ZGlvLmhhcyhlKSYmKHRoaXMucHJvZHVjZXJJZHNXaXRoRnJlZXplZEF1ZGlvLmRlbGV0ZShlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLmF1ZGlvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpwcm9kdWNlckF1ZGlvRGVmcmVlemVkIix7cHJvZHVjZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfYXVkaW9fc3RhdHVzIiwicmVzdW1lIixlKSkpKX1wcm9jZXNzUHJvZHVjaW5nVHJhbnNwb3J0U3RhdHMoZSxuLHMpe3ZhciBtO2NvbnN0IGk9KChtPXRoaXM9PW51bGw/dm9pZCAwOnRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDptLmN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMpfHx7fSx7YXVkaW86YSx2aWRlbzpkLHNjcmVlbjpvfT1pLGw9YXx8ZHx8bztuLnRvdGFsUGFja2V0c1NlbnQ9PT1zLnBhY2tldHNTZW50Pyh0aGlzLmZyZWV6ZWRQcm9kdWNpbmdUcmFuc3BvcnRJZHMuYWRkKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmwmJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2luZ1RyYW5zcG9ydEZyZWV6ZWQiLHt0cmFuc3BvcnRJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjaW5nX3RyYW5zcG9ydF9zdGF0dXMiLCJwYXVzZSIsZSkpKToobi50b3RhbFBhY2tldHNTZW50PXMucGFja2V0c1NlbnQsdGhpcy5mcmVlemVkUHJvZHVjaW5nVHJhbnNwb3J0SWRzLmhhcyhlKSYmKHRoaXMuZnJlZXplZFByb2R1Y2luZ1RyYW5zcG9ydElkcy5kZWxldGUoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmbCYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6Om1lYXN1cmVtZW50czo6cHJvZHVjaW5nVHJhbnNwb3J0RGVmcmVlemVkIix7dHJhbnNwb3J0SWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoInByb2R1Y2luZ190cmFuc3BvcnRfc3RhdHVzIiwicmVzdW1lIixlKSkpKX1wcm9jZXNzQ29uc3VtaW5nVHJhbnNwb3J0U3RhdHMoZSxuLHMpe3ZhciBkLG87Y29uc3QgYT0hIUFycmF5LmZyb20oKChvPShkPXRoaXM9PW51bGw/dm9pZCAwOnRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDpkLmNvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZXNNYXApPT1udWxsP3ZvaWQgMDpvLnZhbHVlcygpKXx8W10pLnJlZHVjZSgobCxtKT0+bHx8bS5hdWRpb3x8bS52aWRlb3x8bS5zY3JlZW4sITEpO24udG90YWxQYWNrZXRzUmVjZWl2ZWQ9PT1zLnBhY2tldHNTZW50Pyh0aGlzLmZyZWV6ZWRDb25zdW1pbmdUcmFuc3BvcnRJZHMuYWRkKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmEmJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OmNvbnN1bWluZ1RyYW5zcG9ydEZyZWV6ZWQiLHt0cmFuc3BvcnRJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgiY29uc3VtaW5nX3RyYW5zcG9ydF9zdGF0dXMiLCJwYXVzZSIsZSkpKToobi50b3RhbFBhY2tldHNSZWNlaXZlZD1zLnBhY2tldHNTZW50LHRoaXMuZnJlZXplZENvbnN1bWluZ1RyYW5zcG9ydElkcy5oYXMoZSkmJih0aGlzLmZyZWV6ZWRDb25zdW1pbmdUcmFuc3BvcnRJZHMuZGVsZXRlKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmEmJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OmNvbnN1bWluZ1RyYW5zcG9ydERlZnJlZXplZCIse3RyYW5zcG9ydElkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJjb25zdW1pbmdfdHJhbnNwb3J0X3N0YXR1cyIsInJlc3VtZSIsZSkpKSl9cmVnaXN0ZXJDb25zdW1lcihlKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5nZW5lcmF0ZUNvbnN1bWVyU3RyZWFtTWFwKGUpLHRoaXMuY29uc3VtZXJQZWVySWRNYXAuc2V0KGUuaWQse3Byb2R1Y2VySWQ6ZS5wcm9kdWNlcklkLHBlZXJJZDplLmFwcERhdGEucGVlcklkLGFwcERhdGE6ZS5hcHBEYXRhfSksZS5vbigiY2xvc2UiLHRoaXMuZGVyZWdpc3RlckNvbnN1bWVyLmJpbmQodGhpcyxlKSksZS5vbigicGF1c2UiLHRoaXMucGF1c2VDb25zdW1lci5iaW5kKHRoaXMsZS5pZCkpLGUub24oInJlc3VtZSIsdGhpcy5yZXN1bWVDb25zdW1lci5iaW5kKHRoaXMsZS5pZCkpLGUuYXBwRGF0YS5zY3JlZW5TaGFyZT09PSEwJiZ0aGlzLnNjcmVlblNoYXJlQ29uc3VtZXJzLmFkZChlLmlkKX0pfXBhdXNlQ29uc3VtZXIoZSl7dGhpcy5wYXVzZWRDb25zdW1lck1hcC5zZXQoZSx7bGFzdFJlcG9ydENhbGN1bGF0ZWQ6ITF9KX1yZXN1bWVDb25zdW1lcihlKXt0aGlzLnBhdXNlZENvbnN1bWVyTWFwLmRlbGV0ZShlKX1nZW5lcmF0ZVByb2R1Y2VyU3RyZWFtTWFwKGUsbj0hMSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IHM9eWllbGQgZS5nZXRTdGF0cygpLGk9bj90aGlzLmdldFByb2R1Y2VyU3RhdHNGcm9tUmVwb3J0KHRoaXMucGFyc2VSVENSZXBvcnQocyxbIm91dGJvdW5kLXJ0cCIsInJlbW90ZS1pbmJvdW5kLXJ0cCJdLCExLGUuaWQpKVswXTp2b2lkIDA7Zm9yKGNvbnN0IGEgb2Ygcy52YWx1ZXMoKSlzd2l0Y2goYS50eXBlKXtjYXNlIm91dGJvdW5kLXJ0cCI6e3RoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5zZXQoYS5pZCxlLmlkKTticmVha319cmV0dXJuIGl9KX1nZW5lcmF0ZUNvbnN1bWVyU3RyZWFtTWFwKGUsbj0hMSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IHM9eWllbGQgZS5nZXRTdGF0cygpLGk9bj90aGlzLmdldENvbnN1bWVyU3RhdHNGcm9tUmVwb3J0KHRoaXMucGFyc2VSVENSZXBvcnQocyxbImluYm91bmQtcnRwIl0sITEsZS5pZCkpWzBdOnZvaWQgMDtmb3IoY29uc3QgYSBvZiBzLnZhbHVlcygpKXN3aXRjaChhLnR5cGUpe2Nhc2UiaW5ib3VuZC1ydHAiOnt0aGlzLmluYm91bmRDb25zdW1lck1hcC5zZXQoYS5pZCxlLmlkKTticmVha319cmV0dXJuIGl9KX1kZXJlZ2lzdGVyUHJvZHVjZXIoZSl7dGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmZvckVhY2goKG4scyk9PntuPT09ZS5pZCYmdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmRlbGV0ZShzKX0pLHRoaXMucGF1c2VkUHJvZHVjZXJNYXAuZGVsZXRlKGUuaWQpLHRoaXMuc2NyZWVuU2hhcmVQcm9kdWNlcnMuZGVsZXRlKGUuaWQpfWRlcmVnaXN0ZXJDb25zdW1lcihlKXt0aGlzLmluYm91bmRDb25zdW1lck1hcC5mb3JFYWNoKChuLHMpPT57bj09PWUuaWQmJnRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmRlbGV0ZShzKX0pLHRoaXMuY29uc3VtZXJQZWVySWRNYXAuZGVsZXRlKGUuaWQpLHRoaXMucGF1c2VkQ29uc3VtZXJNYXAuZGVsZXRlKGUuaWQpLHRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuZGVsZXRlKGUuaWQpfWdldEljZUNhbmRpZGF0ZVN0YXRzKGUpe3ZhciBuO3JldHVybntpZDplLmlkLHR5cGU6ZS5jYW5kaWRhdGVUeXBlfHxlLnR5cGUsYWRkcmVzczplLmFkZHJlc3MscG9ydDplLnBvcnQsdXJsOmUudXJsLHByb3RvY29sOihuPWUucmVsYXlQcm90b2NvbCkhPW51bGw/bjplLnByb3RvY29sLG5ldHdvcmtUeXBlOmUubmV0d29ya1R5cGUscmVsYXRlZEFkZHJlc3M6ZS5yZWxhdGVkQWRkcmVzcyxyZWxhdGVkUG9ydDplLnJlbGF0ZWRQb3J0fX1nZXRXb3JraW5nU2ltdWxjYXN0VmlkZW9TdGF0cyhlKXtyZXR1cm4gZS5maW5kKHM9Pntjb25zdCBpPXMuZnJhbWVzRW5jb2RlZD4wLGE9cy5wYWNrZXRzU2VudD4wLGQ9cy5mcmFtZVdpZHRoJiZzLmZyYW1lSGVpZ2h0O3JldHVybiBpJiZhJiYhIWR9KXx8ZVtlLmxlbmd0aC0xXX1wYXJzZVJUQ1JlcG9ydChlLG49W10scz0hMSxpPXZvaWQgMCxhPXZvaWQgMCl7dmFyIEgsRixLLFosdmUseWUsQmUseGUsamUsVWUsSGUsS2UsJGU7Y29uc3QgZD1lLG89bmV3IExyLGw9bi5sZW5ndGg/bmV3IFNldChuKTp2b2lkIDAsbT1bXSx2PVtdLEU9W10sST1uZXcgTWFwLHg9bmV3IE1hcDtmb3IoY29uc3QgZiBvZiBkLnZhbHVlcygpKXtpZihsKXtpZihsLnNpemU9PT0wKWJyZWFrO2lmKGwuaGFzKGYudHlwZSkpcyYmbC5kZWxldGUoZi50eXBlKTtlbHNlIGNvbnRpbnVlfXN3aXRjaChmLnR5cGUpe2Nhc2UibG9jYWwtY2FuZGlkYXRlIjp7bS5wdXNoKHRoaXMuZ2V0SWNlQ2FuZGlkYXRlU3RhdHMoZikpO2JyZWFrfWNhc2UicmVtb3RlLWNhbmRpZGF0ZSI6e3YucHVzaCh0aGlzLmdldEljZUNhbmRpZGF0ZVN0YXRzKGYpKTticmVha31jYXNlImNhbmRpZGF0ZS1wYWlyIjp7Y29uc3R7bm9taW5hdGVkOmN9PWYse3NlbGVjdGVkOnV9PWYsYj1mLGo9e25vbWluYXRlZDpjIT1udWxsP2M6dSxjdXJyZW50Um91bmRUcmlwVGltZTpiLmN1cnJlbnRSb3VuZFRyaXBUaW1lLHRvdGFsUm91bmRUcmlwVGltZTpiLnRvdGFsUm91bmRUcmlwVGltZSxieXRlc1JlY2VpdmVkOmIuYnl0ZXNSZWNlaXZlZCxieXRlc1NlbnQ6Yi5ieXRlc1NlbnQsYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlOmIuYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlLGF2YWlsYWJsZUluY29taW5nQml0cmF0ZTpiLmF2YWlsYWJsZUluY29taW5nQml0cmF0ZSxsYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXA6Yi5sYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXAsbGFzdFBhY2tldFNlbnRUaW1lc3RhbXA6Yi5sYXN0UGFja2V0U2VudFRpbWVzdGFtcCxsb2NhbENhbmRpZGF0ZUlkOmIubG9jYWxDYW5kaWRhdGVJZCxyZW1vdGVDYW5kaWRhdGVJZDpiLnJlbW90ZUNhbmRpZGF0ZUlkLGJ5dGVzRGlzY2FyZGVkT25TZW5kOmIuYnl0ZXNEaXNjYXJkZWRPblNlbmQscGFja2V0c1NlbnQ6Yi5wYWNrZXRzU2VudCxwYWNrZXRzUmVjZWl2ZWQ6Yi5wYWNrZXRzUmVjZWl2ZWQscGFja2V0c0Rpc2NhcmRlZE9uU2VuZDpiLnBhY2tldHNEaXNjYXJkZWRPblNlbmR9O0UucHVzaChqKSwoZi5ub21pbmF0ZWQ9PT0hMHx8Zi5zZWxlY3RlZD09PSEwKSYmKG8uY2FuZGlkYXRlUGFpcj1qKTticmVha31jYXNlInRyYW5zcG9ydCI6e2NvbnN0IGM9ZjthJiYoYS5wcm9kdWNpbmcmJih0aGlzLm92ZXJhbGxQcm9kdWNpbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF18fCh0aGlzLm92ZXJhbGxQcm9kdWNpbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF09e3RvdGFsUGFja2V0c1NlbnQ6MH0pKSxhLmNvbnN1bWluZyYmKHRoaXMub3ZlcmFsbENvbnN1bWluZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXXx8KHRoaXMub3ZlcmFsbENvbnN1bWluZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXT17dG90YWxQYWNrZXRzUmVjZWl2ZWQ6MH0pKSk7Y29uc3QgdT17Ynl0ZXNSZWNlaXZlZDpjLmJ5dGVzUmVjZWl2ZWQsYnl0ZXNTZW50OmMuYnl0ZXNTZW50LHBhY2tldHNTZW50OmMucGFja2V0c1NlbnQscGFja2V0c1JlY2VpdmVkOmMucGFja2V0c1JlY2VpdmVkLGR0bHNDaXBoZXI6Yy5kdGxzQ2lwaGVyLGR0bHNTdGF0ZTpjLmR0bHNTdGF0ZSxpY2VSb2xlOmMuaWNlUm9sZX07aWYoby50cmFuc3BvcnQ9dSxhKXtpZihhLnByb2R1Y2luZyl7Y29uc3QgYj10aGlzLm92ZXJhbGxQcm9kdWNpbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF07dGhpcy5wcm9jZXNzUHJvZHVjaW5nVHJhbnNwb3J0U3RhdHMoYS5pZCxiLHUpfWlmKGEuY29uc3VtaW5nKXtjb25zdCBiPXRoaXMub3ZlcmFsbENvbnN1bWluZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXTt0aGlzLnByb2Nlc3NDb25zdW1pbmdUcmFuc3BvcnRTdGF0cyhhLmlkLGIsdSl9fWJyZWFrfWNhc2UicmVtb3RlLWluYm91bmQtcnRwIjp7Y29uc3QgYz1mLHU9e2ppdHRlcjpjLmppdHRlcixmcmFjdGlvbkxvc3Q6Yy5mcmFjdGlvbkxvc3Qscm91bmRUcmlwVGltZTpjLnJvdW5kVHJpcFRpbWUscm91bmRUcmlwVGltZU1lYXN1cmVtZW50czpjLnJvdW5kVHJpcFRpbWVNZWFzdXJlbWVudHMsdG90YWxSb3VuZFRyaXBUaW1lOmMudG90YWxSb3VuZFRyaXBUaW1lLHBhY2tldHNMb3N0OmMucGFja2V0c0xvc3R9O28ucmVtb3RlSW5ib3VuZFJ0cC5zZXQoYy5sb2NhbElkLHUpO2JyZWFrfWNhc2Uib3V0Ym91bmQtcnRwIjp7aWYoIXRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5oYXMoZi5pZCkpYnJlYWs7Y29uc3QgYz1mLHU9aXx8dGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmdldChmLmlkKSxiPXRoaXMucGF1c2VkUHJvZHVjZXJNYXAuZ2V0KHUpO2lmKGIpe2lmKGIubGFzdFJlcG9ydENhbGN1bGF0ZWQ9PT0hMClicmVhazt0aGlzLnBhdXNlZFByb2R1Y2VyTWFwLnNldCh1LHtsYXN0UmVwb3J0Q2FsY3VsYXRlZDohMH0pfXRoaXMub3ZlcmFsbFByb2R1Y2Vyc1N0YXRzTWFwW3VdfHwodGhpcy5vdmVyYWxsUHJvZHVjZXJzU3RhdHNNYXBbdV09e3RvdGFsVmlkZW9QYWNrZXRzU2VudDowLHRvdGFsQXVkaW9QYWNrZXRzU2VudDowfSk7Y29uc3Qgaj10aGlzLm92ZXJhbGxQcm9kdWNlcnNTdGF0c01hcFt1XTtpZihbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLm1lZGlhVHlwZSl8fFsidmlkZW8iLCJhdWRpbyJdLmluY2x1ZGVzKGMua2luZCkpe2lmKCF0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuaGFzKGYuaWQpKXtvLnN0YWxlUHJvZHVjZXJTdHJlYW1NYXA9ITA7YnJlYWt9Y29uc3QgJD10aGlzLmNhbGxTdGF0c0luc3RhbmNlLnByb2R1Y2Vycy5nZXQodSk7aWYoKChIPSQ9PW51bGw/dm9pZCAwOiQudHJhY2spPT1udWxsP3ZvaWQgMDpILnJlYWR5U3RhdGUpPT09ImVuZGVkIilicmVhaztvLnByb2R1Y2VyU3RyZWFtTWFwLmhhcyh1KXx8by5wcm9kdWNlclN0cmVhbU1hcC5zZXQodSx7b3V0Ym91bmRWaWRlb1J0cElkOltdLG91dGJvdW5kQXVkaW9SdHBJZDpbXX0pO2NvbnN0IHk9e2J5dGVzU2VudDpjLmJ5dGVzU2VudCxwYWNrZXRzU2VudDpjLnBhY2tldHNTZW50LG5hY2tDb3VudDpjLm5hY2tDb3VudCxzc3JjOmMuc3NyYyxtaWQ6Yy5taWQsYWN0aXZlOmMuYWN0aXZlLGNvZGVjSWQ6Yy5jb2RlY0lkLGhlYWRlckJ5dGVzU2VudDpjLmhlYWRlckJ5dGVzU2VudHx8MCx0b3RhbFBhY2tldFNlbmREZWxheTpjLnRvdGFsUGFja2V0U2VuZERlbGF5fHwwfTtpZihjLm1lZGlhVHlwZT09PSJ2aWRlbyJ8fGMua2luZD09PSJ2aWRlbyIpe2NvbnN0IGg9Yyx6PVEoe2ZyYW1lSGVpZ2h0OmguZnJhbWVIZWlnaHQsZnJhbWVXaWR0aDpoLmZyYW1lV2lkdGgsZnJhbWVzRW5jb2RlZDpoLmZyYW1lc0VuY29kZWQsZnJhbWVzRHJvcHBlZDpoLmZyYW1lc0Ryb3BwZWQsZnJhbWVzUGVyU2Vjb25kOmguZnJhbWVzUGVyU2Vjb25kLGZyYW1lc1NlbnQ6aC5mcmFtZXNTZW50LGtleUZyYW1lc0VuY29kZWQ6aC5rZXlGcmFtZXNFbmNvZGVkLGZpckNvdW50OmguZmlyQ291bnQsZW5jb2RlckltcGxlbWVudGF0aW9uOmguZW5jb2RlckltcGxlbWVudGF0aW9uLGh1Z2VGcmFtZXNTZW50OmguaHVnZUZyYW1lc1NlbnQscGxpQ291bnQ6aC5wbGlDb3VudCxxcFN1bTpoLnFwU3VtLHF1YWxpdHlMaW1pdGF0aW9uRHVyYXRpb25zOmgucXVhbGl0eUxpbWl0YXRpb25EdXJhdGlvbnMscXVhbGl0eUxpbWl0YXRpb25SZWFzb246aC5xdWFsaXR5TGltaXRhdGlvblJlYXNvbixxdWFsaXR5TGltaXRhdGlvblJlc29sdXRpb25DaGFuZ2VzOmgucXVhbGl0eUxpbWl0YXRpb25SZXNvbHV0aW9uQ2hhbmdlcyx0b3RhbEVuY29kZVRpbWU6aC50YXJnZXRCaXRyYXRlLHRvdGFsUGFja2V0U2VuZERlbGF5OmgudG90YWxQYWNrZXRTZW5kRGVsYXkscmV0cmFuc21pdHRlZEJ5dGVzU2VudDpoLnJldHJhbnNtaXR0ZWRCeXRlc1NlbnQscmV0cmFuc21pdHRlZFBhY2tldHNTZW50OmgucmV0cmFuc21pdHRlZFBhY2tldHNTZW50LHNjYWxhYmlsaXR5TW9kZTpoLnNjYWxhYmlsaXR5TW9kZSxwb3dlckVmZmljaWVudEVuY29kZXI6aC5wb3dlckVmZmljaWVudEVuY29kZXJ9LHkpO28ub3V0Ym91bmRWaWRlb1J0cC5zZXQoZi5pZCx6KSxvLnByb2R1Y2VyU3RyZWFtTWFwLmdldCh1KS5vdXRib3VuZFZpZGVvUnRwSWQucHVzaChmLmlkKSx0aGlzLnByb2Nlc3NPdXRib3VuZFByb2R1Y2VyVmlkZW9TdGF0cyh1LGoseil9ZWxzZSBpZihjLm1lZGlhVHlwZT09PSJhdWRpbyJ8fGMua2luZD09PSJhdWRpbyIpe2NvbnN0IGg9Yyx6PVEoe3JldHJhbnNtaXR0ZWRCeXRlc1NlbnQ6aC5yZXRyYW5zbWl0dGVkQnl0ZXNTZW50LHJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudDpoLnJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudH0seSk7by5vdXRib3VuZEF1ZGlvUnRwLnNldChmLmlkLHopLG8ucHJvZHVjZXJTdHJlYW1NYXAuZ2V0KHUpLm91dGJvdW5kQXVkaW9SdHBJZC5wdXNoKGYuaWQpLHRoaXMucHJvY2Vzc091dGJvdW5kUHJvZHVjZXJBdWRpb1N0YXRzKHUsaix6KX19ZWxzZSB0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5lcnJvcihgQ2FsbHN0YXRzOiBVbmtub3duIE91dGJvdW5kLXJ0cC4gbWVkaWF0eXBlOiAke2MubWVkaWFUeXBlfSBraW5kOiAke2Mua2luZH1gKTticmVha31jYXNlImluYm91bmQtcnRwIjp7aWYoIXRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmhhcyhmLmlkKSlicmVhaztjb25zdCBjPWYsdT1pfHx0aGlzLmluYm91bmRDb25zdW1lck1hcC5nZXQoZi5pZCksYj10aGlzLnBhdXNlZENvbnN1bWVyTWFwLmdldCh1KTtpZihiKXtpZihiLmxhc3RSZXBvcnRDYWxjdWxhdGVkPT09ITApYnJlYWs7dGhpcy5wYXVzZWRDb25zdW1lck1hcC5zZXQodSx7bGFzdFJlcG9ydENhbGN1bGF0ZWQ6ITB9KX1pZihjLnNzcmM9PT0xMjM0KWJyZWFrO3RoaXMub3ZlcmFsbENvbnN1bWVyc1N0YXRzTWFwW3VdfHwodGhpcy5vdmVyYWxsQ29uc3VtZXJzU3RhdHNNYXBbdV09e3RvdGFsVmlkZW9QYWNrZXRzUmVjZWl2ZWQ6MCx0b3RhbEF1ZGlvUGFja2V0c1JlY2VpdmVkOjB9KTtjb25zdCBqPXRoaXMub3ZlcmFsbENvbnN1bWVyc1N0YXRzTWFwW3VdO2lmKFsidmlkZW8iLCJhdWRpbyJdLmluY2x1ZGVzKGMubWVkaWFUeXBlKXx8WyJ2aWRlbyIsImF1ZGlvIl0uaW5jbHVkZXMoYy5raW5kKSl7aWYoIXRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmhhcyhmLmlkKSl7by5zdGFsZUNvbnN1bWVyU3RyZWFtTWFwPSEwO2JyZWFrfW8uY29uc3VtZXJTdHJlYW1NYXAuaGFzKHUpfHxvLmNvbnN1bWVyU3RyZWFtTWFwLnNldCh1LHtpbmJvdW5kVmlkZW9SdHBJZDpbXSxpbmJvdW5kQXVkaW9SdHBJZDpbXX0pO2NvbnN0ICQ9e2J5dGVzUmVjZWl2ZWQ6Yy5ieXRlc1JlY2VpdmVkLHBhY2tldHNSZWNlaXZlZDpjLnBhY2tldHNSZWNlaXZlZCxwYWNrZXRzTG9zdDpjLnBhY2tldHNMb3N0Pj0wP2MucGFja2V0c0xvc3Q6MCxqaXR0ZXI6Yy5qaXR0ZXIsbmFja0NvdW50OmMubmFja0NvdW50LGppdHRlckJ1ZmZlckRlbGF5OmMuaml0dGVyQnVmZmVyRGVsYXksaml0dGVyQnVmZmVyRW1pdHRlZENvdW50OmMuaml0dGVyQnVmZmVyRW1pdHRlZENvdW50LGxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcDpjLmxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcCxzc3JjOmMuc3NyYyxtaWQ6Yy5taWQsY29kZWNJZDpjLmNvZGVjSWQsaGVhZGVyQnl0ZXNSZWNlaXZlZDpjLmhlYWRlckJ5dGVzUmVjZWl2ZWR8fDAscGFja2V0c0Rpc2NhcmRlZDpjLnBhY2tldHNEaXNjYXJkZWR8fDAsaml0dGVyQnVmZmVyTWluaW11bURlbGF5OmMuaml0dGVyQnVmZmVyTWluaW11bURlbGF5fHwwLGppdHRlckJ1ZmZlclRhcmdldERlbGF5OmMuaml0dGVyQnVmZmVyVGFyZ2V0RGVsYXl8fDB9O2lmKGMubWVkaWFUeXBlPT09InZpZGVvInx8Yy5raW5kPT09InZpZGVvIil7Y29uc3QgeT1jLGg9USh7ZnJhbWVIZWlnaHQ6eS5mcmFtZUhlaWdodCxmcmFtZVdpZHRoOnkuZnJhbWVXaWR0aCxmcmFtZXNEZWNvZGVkOnkuZnJhbWVzRGVjb2RlZCxmcmFtZXNEcm9wcGVkOnkuZnJhbWVzRHJvcHBlZCxmcmFtZXNQZXJTZWNvbmQ6eS5mcmFtZXNQZXJTZWNvbmQsZnJhbWVzUmVjZWl2ZWQ6eS5mcmFtZXNSZWNlaXZlZCxrZXlGcmFtZXNEZWNvZGVkOnkua2V5RnJhbWVzRGVjb2RlZCxmaXJDb3VudDp5LmZpckNvdW50LGRlY29kZXJJbXBsZW1lbnRhdGlvbjp5LmRlY29kZXJJbXBsZW1lbnRhdGlvbixwbGlDb3VudDp5LnBsaUNvdW50LHRvdGFsUHJvY2Vzc2luZ0RlbGF5OnkudG90YWxQcm9jZXNzaW5nRGVsYXkscXBTdW06eS5xcFN1bXx8MCx0b3RhbEFzc2VtYmx5VGltZTp5LnRvdGFsQXNzZW1ibHlUaW1lfHwwLHRvdGFsRGVjb2RlVGltZTp5LnRvdGFsRGVjb2RlVGltZXx8MCx0b3RhbEZyZWV6ZXNEdXJhdGlvbjp5LnRvdGFsRnJlZXplc0R1cmF0aW9ufHwwLHRvdGFsSW50ZXJGcmFtZURlbGF5OnkudG90YWxJbnRlckZyYW1lRGVsYXl8fDAsdG90YWxQYXVzZXNEdXJhdGlvbjp5LnRvdGFsUGF1c2VzRHVyYXRpb258fDAsdG90YWxTcXVhcmVkSW50ZXJGcmFtZURlbGF5OnkudG90YWxTcXVhcmVkSW50ZXJGcmFtZURlbGF5fHwwLGZyZWV6ZUNvdW50OnkuZnJlZXplQ291bnR8fDAscGF1c2VDb3VudDp5LnBhdXNlQ291bnR8fDAscG93ZXJFZmZpY2llbnREZWNvZGVyOnkucG93ZXJFZmZpY2llbnREZWNvZGVyfSwkKTtoLnNjb3JlPUlyKHtmcmFtZVdpZHRoOmguZnJhbWVXaWR0aHx8MCxmcmFtZXNEZWNvZGVkOihoLmZyYW1lc0RlY29kZWR8fDApLSgoKEY9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpGLmZyYW1lc0RlY29kZWQpfHwwKSxmcmFtZXNQZXJTZWNvbmQ6aC5mcmFtZXNQZXJTZWNvbmR8fDAscGFja2V0c0xvc3Q6KGgucGFja2V0c0xvc3R8fDApLSgoKEs9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpLLnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihoLnBhY2tldHNSZWNlaXZlZHx8MCktKCgoWj10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOloucGFja2V0c1JlY2VpdmVkKXx8MCksaml0dGVyOmguaml0dGVyfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5oYXModSl9KSx4LnNldCh1LHtzY29yZTorKGguc2NvcmUqMTApLnRvRml4ZWQoKSxmcmFtZVdpZHRoOmguZnJhbWVXaWR0aHx8MCxmcmFtZUhlaWdodDpoLmZyYW1lSGVpZ2h0fHwwLGZyYW1lc1BlclNlY29uZDpoLmZyYW1lc1BlclNlY29uZHx8MCxwYWNrZXRzTG9zdFBlcmNlbnRhZ2U6dXQoe3BhY2tldHNMb3N0OihoLnBhY2tldHNMb3N0fHwwKS0oKCh2ZT10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOnZlLnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihoLnBhY2tldHNSZWNlaXZlZHx8MCktKCgoeWU9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDp5ZS5wYWNrZXRzUmVjZWl2ZWQpfHwwKX0pLGppdHRlcjpoLmppdHRlcnx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuaGFzKHUpLGJpdHJhdGU6KChoLmJ5dGVzUmVjZWl2ZWR8fDApLSgoKEJlPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6QmUuYnl0ZXNSZWNlaXZlZCl8fDApKSo4Lzd9KSx0aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLnNldCh1LGgpLG8uaW5ib3VuZFZpZGVvUnRwLnNldChmLmlkLGgpLG8uY29uc3VtZXJTdHJlYW1NYXAuZ2V0KHUpLmluYm91bmRWaWRlb1J0cElkLnB1c2goZi5pZCksdGhpcy5wcm9jZXNzSW5ib3VuZENvbnN1bWVyVmlkZW9TdGF0cyh1LGosaCl9ZWxzZSBpZihjLm1lZGlhVHlwZT09PSJhdWRpbyJ8fGMua2luZD09PSJhdWRpbyIpe2NvbnN0IHk9YyxoPVEoe2F1ZGlvTGV2ZWw6eS5hdWRpb0xldmVsLGNvbmNlYWxlZFNhbXBsZXM6eS5jb25jZWFsZWRTYW1wbGVzLGNvbmNlYWxtZW50RXZlbnRzOnkuY29uY2VhbG1lbnRFdmVudHMsdG90YWxBdWRpb0VuZXJneTp5LnRvdGFsQXVkaW9FbmVyZ3ksdG90YWxTYW1wbGVzRHVyYXRpb246eS50b3RhbFNhbXBsZXNEdXJhdGlvbix0b3RhbFNhbXBsZXNSZWNlaXZlZDp5LnRvdGFsU2FtcGxlc1JlY2VpdmVkLGZlY1BhY2tldHNEaXNjYXJkZWQ6eS5mZWNQYWNrZXRzRGlzY2FyZGVkfHwwLGZlY1BhY2tldHNSZWNlaXZlZDp5LmZlY1BhY2tldHNSZWNlaXZlZHx8MCxpbnNlcnRlZFNhbXBsZXNGb3JEZWNlbGVyYXRpb246eS5pbnNlcnRlZFNhbXBsZXNGb3JEZWNlbGVyYXRpb258fDAscmVtb3ZlZFNhbXBsZXNGb3JBY2NlbGVyYXRpb246eS5yZW1vdmVkU2FtcGxlc0ZvckFjY2VsZXJhdGlvbnx8MCxzaWxlbnRDb25jZWFsZWRTYW1wbGVzOnkuc2lsZW50Q29uY2VhbGVkU2FtcGxlc3x8MCxwbGF5b3V0SWQ6eS5wbGF5b3V0SWR9LCQpO2guc2NvcmU9d3Ioe2NvbmNlYWxtZW50RXZlbnRzOihoLmNvbmNlYWxtZW50RXZlbnRzfHwwKS0oKCh4ZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOnhlLmNvbmNlYWxtZW50RXZlbnRzKXx8MCkscGFja2V0c0xvc3Q6KGgucGFja2V0c0xvc3R8fDApLSgoKGplPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6amUucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KGgucGFja2V0c1JlY2VpdmVkfHwwKS0oKChVZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOlVlLnBhY2tldHNSZWNlaXZlZCl8fDApLGppdHRlcjpoLmppdHRlcnx8MH0pLHguc2V0KHUse3Njb3JlOisoaC5zY29yZSoxMCkudG9GaXhlZCgpLHBhY2tldHNMb3N0UGVyY2VudGFnZTp1dCh7cGFja2V0c0xvc3Q6KGgucGFja2V0c0xvc3R8fDApLSgoKEhlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6SGUucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KGgucGFja2V0c1JlY2VpdmVkfHwwKS0oKChLZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOktlLnBhY2tldHNSZWNlaXZlZCl8fDApfSksaml0dGVyOmguaml0dGVyfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5oYXModSksYml0cmF0ZTooKGguYnl0ZXNSZWNlaXZlZHx8MCktKCgoJGU9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDokZS5ieXRlc1JlY2VpdmVkKXx8MCkpKjgvN30pLHRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuc2V0KHUsaCksby5pbmJvdW5kQXVkaW9SdHAuc2V0KGYuaWQsaCksby5jb25zdW1lclN0cmVhbU1hcC5nZXQodSkuaW5ib3VuZEF1ZGlvUnRwSWQucHVzaChmLmlkKSx0aGlzLnByb2Nlc3NJbmJvdW5kQ29uc3VtZXJBdWRpb1N0YXRzKHUsaixoKX19ZWxzZSB0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5lcnJvcihgQ2FsbHN0YXRzOiBVbmtub3duIEluYm91bmQtcnRwLiBtZWRpYXR5cGU6ICR7Yy5tZWRpYVR5cGV9IGtpbmQ6ICR7Yy5raW5kfWApO2JyZWFrfX19aWYoby5wcm9kdWNlclN0cmVhbU1hcC5mb3JFYWNoKChmLGMpPT57dmFyIHUsYixqLCQseSxoLHosV2UsemUsR2UscWUsWWUsUWUsSmUsWGUsWmUsZXQsdHQscnQsbnQsc3QsaXQsYXQ7aWYoZi5vdXRib3VuZFZpZGVvUnRwSWQubGVuZ3RoPjApe2NvbnN0IE49W107Zi5vdXRib3VuZFZpZGVvUnRwSWQuZm9yRWFjaChzcj0+e04ucHVzaChvLm91dGJvdW5kVmlkZW9SdHAuZ2V0KHNyKSl9KTtjb25zdCBBPXRoaXMuZ2V0V29ya2luZ1NpbXVsY2FzdFZpZGVvU3RhdHMoTik7QS5zY29yZT1Qcih7ZnJhbWVXaWR0aDpBLmZyYW1lV2lkdGh8fDAsZnJhbWVzUGVyU2Vjb25kOkEuZnJhbWVzUGVyU2Vjb25kfHwwLGppdHRlcjooKHU9QS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6dS5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYykscGFja2V0c1NlbnQ6KEEucGFja2V0c1NlbnR8fDApLSgoKGI9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpiLnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoaj1BLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpqLnBhY2tldHNMb3N0KXx8MCktKCgoeT0oJD10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOiQucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnkucGFja2V0c0xvc3QpfHwwKSxmcmFtZXNFbmNvZGVkOihBLmZyYW1lc0VuY29kZWR8fDApLSgoKGg9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpoLmZyYW1lc0VuY29kZWQpfHwwKX0pLEkuc2V0KGMse3Njb3JlOisoQS5zY29yZSoxMCkudG9GaXhlZCgpLGZyYW1lV2lkdGg6QS5mcmFtZVdpZHRofHwwLGZyYW1lSGVpZ2h0OkEuZnJhbWVIZWlnaHR8fDAsZnJhbWVzUGVyU2Vjb25kOkEuZnJhbWVzUGVyU2Vjb25kfHwwLGppdHRlcjooKHo9QS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6ei5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYykscGFja2V0c0xvc3RQZXJjZW50YWdlOmx0KHtwYWNrZXRzU2VudDooQS5wYWNrZXRzU2VudHx8MCktKCgoV2U9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpXZS5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKHplPUEucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnplLnBhY2tldHNMb3N0KXx8MCktKCgocWU9KEdlPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6R2UucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnFlLnBhY2tldHNMb3N0KXx8MCl9KSxiaXRyYXRlOigoQS5ieXRlc1NlbnR8fDApLSgoKFllPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6WWUuYnl0ZXNTZW50KXx8MCkpKjgvNyxjcHVMaW1pdGF0aW9uczpBLnF1YWxpdHlMaW1pdGF0aW9uUmVhc29uPT09ImNwdSIsYmFuZHdpZHRoTGltaXRhdGlvbnM6QS5xdWFsaXR5TGltaXRhdGlvblJlYXNvbj09PSJiYW5kd2lkdGgifSksdGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5zZXQoYyxBKX1lbHNlIGlmKGYub3V0Ym91bmRBdWRpb1J0cElkLmxlbmd0aD4wKXtjb25zdCBOPW8ub3V0Ym91bmRBdWRpb1J0cC5nZXQoZi5vdXRib3VuZEF1ZGlvUnRwSWRbMF0pO04uc2NvcmU9UnIoe3BhY2tldHNTZW50OihOLnBhY2tldHNTZW50fHwwKS0oKChRZT10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOlFlLnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoSmU9Ti5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6SmUucGFja2V0c0xvc3QpfHwwKS0oKChaZT0oWGU9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpYZS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6WmUucGFja2V0c0xvc3QpfHwwKSxqaXR0ZXI6KChldD1OLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpldC5qaXR0ZXIpfHwwfSksSS5zZXQoYyx7c2NvcmU6KyhOLnNjb3JlKjEwKS50b0ZpeGVkKCksYml0cmF0ZTooKE4uYnl0ZXNTZW50fHwwKS0oKCh0dD10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnR0LmJ5dGVzU2VudCl8fDApKSo4LzcscGFja2V0c0xvc3RQZXJjZW50YWdlOmx0KHtwYWNrZXRzU2VudDooTi5wYWNrZXRzU2VudHx8MCktKCgocnQ9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpydC5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKG50PU4ucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOm50LnBhY2tldHNMb3N0KXx8MCktKCgoaXQ9KHN0PXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6c3QucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOml0LnBhY2tldHNMb3N0KXx8MCl9KSxqaXR0ZXI6KChhdD1OLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDphdC5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYyl9KSx0aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLnNldChjLE4pfX0pLEUuZm9yRWFjaChmPT57Y29uc3QgYz1tLmZpbmQoYj0+Yi5pZD09PWYubG9jYWxDYW5kaWRhdGVJZD8oZi5sb2NhbENhbmRpZGF0ZUlkPWIuaWQsYik6bnVsbCksdT12LmZpbmQoYj0+Yi5pZD09PWYucmVtb3RlQ2FuZGlkYXRlSWQ/KGYucmVtb3RlQ2FuZGlkYXRlSWQ9Yi5pZCxiKTpudWxsKTtjJiYoZi5sb2NhbENhbmRpZGF0ZVR5cGU9Yy50eXBlLGYubG9jYWxDYW5kaWRhdGVBZGRyZXNzPWFlKGMuYWRkcmVzcyksZi5sb2NhbENhbmRpZGF0ZVBvcnQ9Yy5wb3J0LGYubG9jYWxDYW5kaWRhdGVQcm90b2NvbD1jLnByb3RvY29sLGYubG9jYWxDYW5kaWRhdGVVcmw9Yy51cmwsZi5sb2NhbENhbmRpZGF0ZU5ldHdvcmtUeXBlPWMubmV0d29ya1R5cGUsZi5sb2NhbENhbmRpZGF0ZVJlbGF0ZWRBZGRyZXNzPWFlKGMucmVsYXRlZEFkZHJlc3MpLGYubG9jYWxDYW5kaWRhdGVSZWxhdGVkUG9ydD1jLnJlbGF0ZWRQb3J0KSx1JiYoZi5yZW1vdGVDYW5kaWRhdGVUeXBlPXUudHlwZSxmLnJlbW90ZUNhbmRpZGF0ZUFkZHJlc3M9YWUodS5hZGRyZXNzKSxmLnJlbW90ZUNhbmRpZGF0ZVBvcnQ9dS5wb3J0LGYucmVtb3RlQ2FuZGlkYXRlUHJvdG9jb2w9dS5wcm90b2NvbCxmLnJlbW90ZUNhbmRpZGF0ZVVybD11LnVybCl9KSxvLmNhbmRpZGF0ZVBhaXImJihvLnRyYW5zcG9ydD8oby50cmFuc3BvcnQudG90YWxSb3VuZFRyaXBUaW1lPW8uY2FuZGlkYXRlUGFpci50b3RhbFJvdW5kVHJpcFRpbWUsby50cmFuc3BvcnQuYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlPW8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGUsby50cmFuc3BvcnQuYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlPW8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUsby50cmFuc3BvcnQucm91bmRUcmlwVGltZT1vLmNhbmRpZGF0ZVBhaXIuY3VycmVudFJvdW5kVHJpcFRpbWUpOm8udHJhbnNwb3J0PXtieXRlc1JlY2VpdmVkOm8uY2FuZGlkYXRlUGFpci5ieXRlc1JlY2VpdmVkLGJ5dGVzU2VudDpvLmNhbmRpZGF0ZVBhaXIuYnl0ZXNTZW50LHRvdGFsUm91bmRUcmlwVGltZTpvLmNhbmRpZGF0ZVBhaXIudG90YWxSb3VuZFRyaXBUaW1lLGF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZTpvLmNhbmRpZGF0ZVBhaXIuYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlLGF2YWlsYWJsZUluY29taW5nQml0cmF0ZTpvLmNhbmRpZGF0ZVBhaXIuYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlLHJvdW5kVHJpcFRpbWU6by5jYW5kaWRhdGVQYWlyLmN1cnJlbnRSb3VuZFRyaXBUaW1lfSksby50cmFuc3BvcnQmJihvLnRyYW5zcG9ydC5jYW5kaWRhdGVQYWlycz1FKSxvLnRyYW5zcG9ydCYmIW8udHJhbnNwb3J0LnJvdW5kVHJpcFRpbWUpe2xldCBmPTAsYz0wO28ucmVtb3RlSW5ib3VuZFJ0cC5mb3JFYWNoKCh1LGIpPT57dS5yb3VuZFRyaXBUaW1lJiZ1LnJvdW5kVHJpcFRpbWU+ZiYmKGY9dS5yb3VuZFRyaXBUaW1lLGM9dS50b3RhbFJvdW5kVHJpcFRpbWUpfSksby50cmFuc3BvcnQucm91bmRUcmlwVGltZT1mLG8udHJhbnNwb3J0LnRvdGFsUm91bmRUcmlwVGltZT1jfWlmKHguc2l6ZT4wKXRyeXt0aGlzLm9ic2VydmVyLmVtaXQoImNvbnN1bWVyX3Njb3JlIix4KX1jYXRjaChmKXt9aWYoSS5zaXplPjApdHJ5e3RoaXMub2JzZXJ2ZXIuZW1pdCgicHJvZHVjZXJfc2NvcmUiLEkpfWNhdGNoKGYpe31yZXR1cm4gb31nZXRQcm9kdWNlcnNSZXBvcnQoZSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IG49ZS5tYXAocz0+dGhpcy5nZW5lcmF0ZVByb2R1Y2VyU3RyZWFtTWFwKHMsITApKTtyZXR1cm4gbi5sZW5ndGg+MD9Qcm9taXNlLmFsbChuKTp2b2lkIDB9KX1nZXRDb25zdW1lcnNSZXBvcnQoZSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IG49ZS5tYXAocz0+dGhpcy5nZW5lcmF0ZUNvbnN1bWVyU3RyZWFtTWFwKHMsITApKTtyZXR1cm4gbi5sZW5ndGg+MD9Qcm9taXNlLmFsbChuKTp2b2lkIDB9KX1nZXRUcmFuc3BvcnRSZXBvcnQoZSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3JldHVybiBlLmdldFN0YXRzKCl9KX1nZXRQcm9jZXNzZWRTdGF0cyhlLG4scyl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IGk9eWllbGQgdGhpcy5nZXRUcmFuc3BvcnRSZXBvcnQoZSksYT17cHJvZHVjaW5nOnMsY29uc3VtaW5nOm4saWQ6ZS5pZH0sZD1pLG89dGhpcy5wYXJzZVJUQ1JlcG9ydChkLFsidHJhbnNwb3J0IiwiY2FuZGlkYXRlLXBhaXIiLCJpbmJvdW5kLXJ0cCIsIm91dGJvdW5kLXJ0cCIsInJlbW90ZS1pbmJvdW5kLXJ0cCIsImxvY2FsLWNhbmRpZGF0ZSIsInJlbW90ZS1jYW5kaWRhdGUiXSwhMSx2b2lkIDAsYSk7aWYoIW8pcmV0dXJuO2NvbnN0IGw9e3N0YXRzOm8udHJhbnNwb3J0LHRyYW5zcG9ydElkOmUuaWQsY29uc3VtaW5nOm4scHJvZHVjaW5nOnN9LG09by5zdGFsZVByb2R1Y2VyU3RyZWFtTWFwP3ZvaWQgMDp0aGlzLmdldFByb2R1Y2VyU3RhdHNGcm9tUmVwb3J0KG8pLHY9by5zdGFsZUNvbnN1bWVyU3RyZWFtTWFwP3ZvaWQgMDp0aGlzLmdldENvbnN1bWVyU3RhdHNGcm9tUmVwb3J0KG8pO3JldHVybnt0cmFuc3BvcnRSZXBvcnQ6bCxwcm9kdWNlclJlcG9ydDptLGNvbnN1bWVyUmVwb3J0OnZ9fSl9Z2V0UHJvZHVjZXJTdGF0c0Zyb21SZXBvcnQoZSl7Y29uc3Qgbj1bXTt0cnl7ZS5wcm9kdWNlclN0cmVhbU1hcC5mb3JFYWNoKChzLGkpPT57dmFyIGEsZDtuLnB1c2goe3Byb2R1Y2VySWQ6aSx2aWRlb1N0YXRzOnMub3V0Ym91bmRWaWRlb1J0cElkLm1hcChvPT5lLm91dGJvdW5kVmlkZW9SdHAuZ2V0KG8pKSxhdWRpb1N0YXRzOnMub3V0Ym91bmRBdWRpb1J0cElkLm1hcChvPT5lLm91dGJvdW5kQXVkaW9SdHAuZ2V0KG8pKSxhcHBEYXRhOigoZD0oYT10aGlzLmNhbGxTdGF0c0luc3RhbmNlLnByb2R1Y2Vycyk9PW51bGw/dm9pZCAwOmEuZ2V0KGkpKT09bnVsbD92b2lkIDA6ZC5hcHBEYXRhKXx8bnVsbH0pfSl9Y2F0Y2gocyl7dGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZXJyb3IoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpnZXRQcm9kdWNlclN0YXRzRnJvbVJlcG9ydCIse2Vycm9yOntyZWFzb246cy5yZWFzb24sbWVzc2FnZTpzLm1lc3NhZ2V9fSl9cmV0dXJuIG59Z2V0Q29uc3VtZXJTdGF0c0Zyb21SZXBvcnQoZSl7Y29uc3Qgbj1bXTt0cnl7ZS5jb25zdW1lclN0cmVhbU1hcC5mb3JFYWNoKChzLGkpPT57Y29uc3R7cGVlcklkOmEscHJvZHVjZXJJZDpkLGFwcERhdGE6b309dGhpcy5jb25zdW1lclBlZXJJZE1hcC5nZXQoaSk7bi5wdXNoKHtjb25zdW1lcklkOmkscGVlcklkOmEscHJvZHVjZXJJZDpkLGFwcERhdGE6byx2aWRlb1N0YXRzOnMuaW5ib3VuZFZpZGVvUnRwSWQubWFwKGw9PmUuaW5ib3VuZFZpZGVvUnRwLmdldChsKSksYXVkaW9TdGF0czpzLmluYm91bmRBdWRpb1J0cElkLm1hcChsPT5lLmluYm91bmRBdWRpb1J0cC5nZXQobCkpfSl9KX1jYXRjaChzKXtjb25zb2xlLmVycm9yKCJnZXRDb25zdW1lcnNSZXBvcnQ6ICIscyxlKX1yZXR1cm4gbn1nZXRVc2VyTG9jYXRpb24oKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7cmV0dXJuIG5ldyBQcm9taXNlKChlLG4pPT57dHJ5e25hdmlnYXRvci5nZW9sb2NhdGlvbj9uYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKHM9PntlKHMpfSk6bigpfWNhdGNoKHMpe24ocyl9fSl9KX1nZXRDb25uZWN0aXZpdHkoZSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3RyeXtjb25zdCBuPXtpY2VTZXJ2ZXJzOmV8fGtyfSxzPW5ldyBQcm9taXNlKChtLHYpPT57dHJ5e2NvbnN0IEU9bmV3IFRzKG4pO0UuYWRkTGlzdGVuZXIoImRvbmUiLG0pLEUuYWRkTGlzdGVuZXIoImZhaWxlZCIsKCk9PnttKHtjb25uZWN0aXZpdHk6ITF9KX0pLEUuc3RhcnQoMmUzKX1jYXRjaChFKXt2KEUpfX0pLGk9bmV3IFByb21pc2UoKG0sdik9Pnt0cnl7Y29uc3QgRT1uZXcgUnMobik7RS5hZGRMaXN0ZW5lcigiZG9uZSIsbSksRS5hZGRMaXN0ZW5lcigiZmFpbGVkIiwoKT0+e20oe2Nvbm5lY3Rpdml0eTohMX0pfSksRS5zdGFydCgyZTMpfWNhdGNoKEUpe3YoRSl9fSksYT1uZXcgUHJvbWlzZSgobSx2KT0+e3RyeXtjb25zdCBFPW5ldyBQcyhuKTtFLmFkZExpc3RlbmVyKCJkb25lIixtKSxFLmFkZExpc3RlbmVyKCJmYWlsZWQiLCgpPT57bSh7Y29ubmVjdGl2aXR5OiExfSl9KSxFLnN0YXJ0KDJlMyl9Y2F0Y2goRSl7dihFKX19KSxbZCxvLGxdPXlpZWxkIFByb21pc2UuYWxsKFtzLGksYV0pO3JldHVybntob3N0OmQ9PW51bGw/dm9pZCAwOmQuY29ubmVjdGl2aXR5LHJlbGF5Om89PW51bGw/dm9pZCAwOm8uY29ubmVjdGl2aXR5LHJlZmxleGl2ZTpsPT1udWxsP3ZvaWQgMDpsLmNvbm5lY3Rpdml0eX19Y2F0Y2gobil7cmV0dXJue2hvc3Q6ITEscmVsYXk6ITEscmVmbGV4aXZlOiExfX19KX1nZXRUaHJvdWdocHV0KGUpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXt0cnl7Y29uc3Qgcz15aWVsZCBuZXcgUHJvbWlzZSgoaSxhKT0+e3RyeXtjb25zdCBkPXtpY2VTZXJ2ZXJzOmV8fGtyfSxvPW5ldyBfcyhkKTtvLmFkZExpc3RlbmVyKCJkb25lIixpKSxvLmFkZExpc3RlbmVyKCJmYWlsZWQiLGEpLG8uc3RhcnQoMWU0KX1jYXRjaChkKXthKGQpfX0pO3JldHVybnt0aHJvdWdocHV0OnMudGhyb3VnaHB1dCxmcmFjdGlvbmFsTG9zczowLFJUVDpzLlJUVCxqaXR0ZXI6MCxiYWNrZW5kUlRUOnMuYmFja2VuZFJUVH19Y2F0Y2gobil7cmV0dXJufX0pfWdldElQRGV0YWlscygpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXt2YXIgZSxuO3RyeXtyZXR1cm4gdGhpcy5pcERldGFpbHN8fCh0aGlzLmlwRGV0YWlscz15aWVsZCBNci5nZXRJUERldGFpbHMoe3BlZXJJZDooZT10aGlzLmNhbGxTdGF0c0luc3RhbmNlKT09bnVsbD92b2lkIDA6ZS5wZWVySWQsYXBpSG9zdG5hbWVzOihuPXRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDpuLmFwaUhvc3RuYW1lcyxsb2dnZXI6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXJ9KSksdGhpcy5pcERldGFpbHN9Y2F0Y2gocyl7cmV0dXJufX0pfWdldE5ldHdvcmtRdWFsaXR5KGUpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdFtuLHNdPXlpZWxkIFByb21pc2UuYWxsKFt0aGlzLmdldENvbm5lY3Rpdml0eShlKSx0aGlzLmdldFRocm91Z2hwdXQoZSldKTtyZXR1cm57Y29ubmVjdGl2aXR5Om4sdGhyb3VnaHB1dDpzPT1udWxsP3ZvaWQgMDpzLnRocm91Z2hwdXQsZnJhY3Rpb25hbExvc3M6cz09bnVsbD92b2lkIDA6cy5mcmFjdGlvbmFsTG9zcyxSVFQ6cz09bnVsbD92b2lkIDA6cy5SVFQsaml0dGVyOnM9PW51bGw/dm9pZCAwOnMuaml0dGVyLGJhY2tlbmRSVFQ6cz09bnVsbD92b2lkIDA6cy5iYWNrZW5kUlRUfX0pfWdldE5ldHdvcmtJbmZvKGUsbj0hMSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3ZhciBkLG87aWYobil7Y29uc3QgbD15aWVsZCB0aGlzLmdldElQRGV0YWlscygpO3JldHVybntpcERldGFpbHM6bCxlZmZlY3RpdmVOZXR3b3JrVHlwZTooZD1uYXZpZ2F0b3IuY29ubmVjdGlvbik9PW51bGw/dm9pZCAwOmQuZWZmZWN0aXZlVHlwZSxsb2NhdGlvbjpsIT1udWxsJiZsLmxvYz9PcihsPT1udWxsP3ZvaWQgMDpsLmxvYyk6dm9pZCAwfX1jb25zdFtzLGksYV09eWllbGQgUHJvbWlzZS5hbGwoW3RoaXMuZ2V0Q29ubmVjdGl2aXR5KGUpLHRoaXMuZ2V0VGhyb3VnaHB1dChlKSx0aGlzLmdldElQRGV0YWlscygpXSk7cmV0dXJue2lwRGV0YWlsczphLGVmZmVjdGl2ZU5ldHdvcmtUeXBlOihvPW5hdmlnYXRvci5jb25uZWN0aW9uKT09bnVsbD92b2lkIDA6by5lZmZlY3RpdmVUeXBlLGxvY2F0aW9uOmEhPW51bGwmJmEubG9jP09yKGE9PW51bGw/dm9pZCAwOmEubG9jKTp2b2lkIDAsdHVybkNvbm5lY3Rpdml0eTpzP3MuaG9zdHx8cy5yZWxheXx8cy5yZWZsZXhpdmU6ITEsY29ubmVjdGl2aXR5OnMsdGhyb3VnaHB1dDppPT1udWxsP3ZvaWQgMDppLnRocm91Z2hwdXQsZnJhY3Rpb25hbExvc3M6aT09bnVsbD92b2lkIDA6aS5mcmFjdGlvbmFsTG9zcyxSVFQ6aT09bnVsbD92b2lkIDA6aS5SVFQsaml0dGVyOmk9PW51bGw/dm9pZCAwOmkuaml0dGVyLGJhY2tlbmRSVFQ6aT09bnVsbD92b2lkIDA6aS5iYWNrZW5kUlRUfX0pfX1jbGFzcyB3cyBleHRlbmRzIERye31jbGFzcyBOciBleHRlbmRzIERye2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKTtwKHRoaXMsInByb2R1Y2VyTWFwIixuZXcgTWFwKTtwKHRoaXMsImNvbnN1bWVyTWFwIixuZXcgTWFwKX1yZWdpc3RlclByb2R1Y2VyKGUpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXt0aGlzLnByb2R1Y2VyTWFwLnNldChlLmlkLGUpLHlpZWxkIHRoaXMuZ2VuZXJhdGVQcm9kdWNlclN0cmVhbU1hcChlKSxlLm9uKCJjbG9zZSIsdGhpcy5kZXJlZ2lzdGVyUHJvZHVjZXIuYmluZCh0aGlzLGUpKSxlLm9uKCJwYXVzZSIsdGhpcy5wYXVzZVByb2R1Y2VyLmJpbmQodGhpcyxlLmlkKSksZS5vbigicmVzdW1lIix0aGlzLnJlc3VtZVByb2R1Y2VyLmJpbmQodGhpcyxlLmlkKSksZS5hcHBEYXRhLnNjcmVlblNoYXJlPT09ITAmJnRoaXMuc2NyZWVuU2hhcmVQcm9kdWNlcnMuYWRkKGUuaWQpfSl9cmVnaXN0ZXJDb25zdW1lcihlKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dGhpcy5jb25zdW1lck1hcC5zZXQoZS5pZCxlKSx5aWVsZCB0aGlzLmdlbmVyYXRlQ29uc3VtZXJTdHJlYW1NYXAoZSksdGhpcy5jb25zdW1lclBlZXJJZE1hcC5zZXQoZS5pZCx7cHJvZHVjZXJJZDplLnByb2R1Y2VySWQscGVlcklkOmUuYXBwRGF0YS5wZWVySWQsYXBwRGF0YTplLmFwcERhdGF9KSxlLm9uKCJjbG9zZSIsdGhpcy5kZXJlZ2lzdGVyQ29uc3VtZXIuYmluZCh0aGlzLGUpKSxlLm9uKCJwYXVzZSIsdGhpcy5wYXVzZUNvbnN1bWVyLmJpbmQodGhpcyxlLmlkKSksZS5vbigicmVzdW1lIix0aGlzLnJlc3VtZUNvbnN1bWVyLmJpbmQodGhpcyxlLmlkKSksZS5hcHBEYXRhLnNjcmVlblNoYXJlPT09ITAmJnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuYWRkKGUuaWQpfSl9Z2VuZXJhdGVDb25zdW1lclN0cmVhbU1hcChlLG49ITEpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBzPXlpZWxkIGUuZ2V0U3RhdHMoKSxpPXRoaXMucGFyc2VSVENSZXBvcnQocyxbImluYm91bmQtcnRwIl0sITEsZS5pZCksYT1bLi4uaS5jb25zdW1lclN0cmVhbU1hcC52YWx1ZXMoKV1bMF0sZD1uP3RoaXMuZ2V0Q29uc3VtZXJTdGF0c0Zyb21QYXJzZWRDb25zdW1lclN0YXRzKGksYSxlLmlkKTp2b2lkIDA7Zm9yKGNvbnN0IG8gb2Ygcy52YWx1ZXMoKSlzd2l0Y2goby50eXBlKXtjYXNlImluYm91bmQtcnRwIjp7dGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuc2V0KG8uaWQsZS5pZCk7YnJlYWt9fXJldHVybiBkfSl9ZGVyZWdpc3RlclByb2R1Y2VyKGUpe3RoaXMucHJvZHVjZXJNYXAuZGVsZXRlKGUuaWQpLHRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5mb3JFYWNoKChuLHMpPT57bj09PWUuaWQmJnRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5kZWxldGUocyl9KSx0aGlzLnBhdXNlZFByb2R1Y2VyTWFwLmRlbGV0ZShlLmlkKSx0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmRlbGV0ZShlLmlkKX1kZXJlZ2lzdGVyQ29uc3VtZXIoZSl7dGhpcy5jb25zdW1lck1hcC5kZWxldGUoZS5pZCksdGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuZm9yRWFjaCgobixzKT0+e249PT1lLmlkJiZ0aGlzLmluYm91bmRDb25zdW1lck1hcC5kZWxldGUocyl9KSx0aGlzLmNvbnN1bWVyUGVlcklkTWFwLmRlbGV0ZShlLmlkKSx0aGlzLnBhdXNlZENvbnN1bWVyTWFwLmRlbGV0ZShlLmlkKSx0aGlzLnNjcmVlblNoYXJlQ29uc3VtZXJzLmRlbGV0ZShlLmlkKX1nZXRJY2VDYW5kaWRhdGVTdGF0cyhlKXt2YXIgbjtyZXR1cm57aWQ6ZS5pZCx0eXBlOmUuY2FuZGlkYXRlVHlwZXx8ZS50eXBlLGFkZHJlc3M6ZS5hZGRyZXNzLHBvcnQ6ZS5wb3J0LHVybDplLnVybCxwcm90b2NvbDoobj1lLnJlbGF5UHJvdG9jb2wpIT1udWxsP246ZS5wcm90b2NvbCxuZXR3b3JrVHlwZTplLm5ldHdvcmtUeXBlLHJlbGF0ZWRBZGRyZXNzOmUucmVsYXRlZEFkZHJlc3MscmVsYXRlZFBvcnQ6ZS5yZWxhdGVkUG9ydH19cGFyc2VSVENSZXBvcnQoZSxuPVtdLHM9ITEsaT12b2lkIDAsYT12b2lkIDApe3ZhciBILEYsSyxaLHZlLHllLEJlLHhlLGplLFVlLEhlLEtlLCRlO2NvbnN0IGQ9ZSxvPW5ldyBMcixsPW4ubGVuZ3RoP25ldyBTZXQobik6dm9pZCAwLG09W10sdj1bXSxFPVtdLEk9bmV3IE1hcCx4PW5ldyBNYXA7Zm9yKGNvbnN0IGYgb2YgZC52YWx1ZXMoKSl7aWYobCl7aWYobC5zaXplPT09MClicmVhaztpZihsLmhhcyhmLnR5cGUpKXMmJmwuZGVsZXRlKGYudHlwZSk7ZWxzZSBjb250aW51ZX1zd2l0Y2goZi50eXBlKXtjYXNlImxvY2FsLWNhbmRpZGF0ZSI6e20ucHVzaCh0aGlzLmdldEljZUNhbmRpZGF0ZVN0YXRzKGYpKTticmVha31jYXNlInJlbW90ZS1jYW5kaWRhdGUiOnt2LnB1c2godGhpcy5nZXRJY2VDYW5kaWRhdGVTdGF0cyhmKSk7YnJlYWt9Y2FzZSJjYW5kaWRhdGUtcGFpciI6e2NvbnN0e25vbWluYXRlZDpjfT1mLHtzZWxlY3RlZDp1fT1mLGI9ZixqPXtub21pbmF0ZWQ6YyE9bnVsbD9jOnUsY3VycmVudFJvdW5kVHJpcFRpbWU6Yi5jdXJyZW50Um91bmRUcmlwVGltZSx0b3RhbFJvdW5kVHJpcFRpbWU6Yi50b3RhbFJvdW5kVHJpcFRpbWUsYnl0ZXNSZWNlaXZlZDpiLmJ5dGVzUmVjZWl2ZWQsYnl0ZXNTZW50OmIuYnl0ZXNTZW50LGF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZTpiLmF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZSxhdmFpbGFibGVJbmNvbWluZ0JpdHJhdGU6Yi5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUsbGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wOmIubGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wLGxhc3RQYWNrZXRTZW50VGltZXN0YW1wOmIubGFzdFBhY2tldFNlbnRUaW1lc3RhbXAsbG9jYWxDYW5kaWRhdGVJZDpiLmxvY2FsQ2FuZGlkYXRlSWQscmVtb3RlQ2FuZGlkYXRlSWQ6Yi5yZW1vdGVDYW5kaWRhdGVJZCxieXRlc0Rpc2NhcmRlZE9uU2VuZDpiLmJ5dGVzRGlzY2FyZGVkT25TZW5kLHBhY2tldHNTZW50OmIucGFja2V0c1NlbnQscGFja2V0c1JlY2VpdmVkOmIucGFja2V0c1JlY2VpdmVkLHBhY2tldHNEaXNjYXJkZWRPblNlbmQ6Yi5wYWNrZXRzRGlzY2FyZGVkT25TZW5kfTtFLnB1c2goaiksKGYubm9taW5hdGVkPT09ITB8fGYuc2VsZWN0ZWQ9PT0hMCkmJihvLmNhbmRpZGF0ZVBhaXI9aik7YnJlYWt9Y2FzZSJ0cmFuc3BvcnQiOntjb25zdCBjPWY7YSYmKGEucHJvZHVjaW5nJiYodGhpcy5vdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdfHwodGhpcy5vdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdPXt0b3RhbFBhY2tldHNTZW50OjB9KSksYS5jb25zdW1pbmcmJih0aGlzLm92ZXJhbGxDb25zdW1pbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF18fCh0aGlzLm92ZXJhbGxDb25zdW1pbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF09e3RvdGFsUGFja2V0c1JlY2VpdmVkOjB9KSkpO2NvbnN0IHU9e2J5dGVzUmVjZWl2ZWQ6Yy5ieXRlc1JlY2VpdmVkLGJ5dGVzU2VudDpjLmJ5dGVzU2VudCxwYWNrZXRzU2VudDpjLnBhY2tldHNTZW50LHBhY2tldHNSZWNlaXZlZDpjLnBhY2tldHNSZWNlaXZlZCxkdGxzQ2lwaGVyOmMuZHRsc0NpcGhlcixkdGxzU3RhdGU6Yy5kdGxzU3RhdGUsaWNlUm9sZTpjLmljZVJvbGV9O2lmKG8udHJhbnNwb3J0PXUsYSl7aWYoYS5wcm9kdWNpbmcpe2NvbnN0IGI9dGhpcy5vdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdO3RoaXMucHJvY2Vzc1Byb2R1Y2luZ1RyYW5zcG9ydFN0YXRzKGEuaWQsYix1KX1pZihhLmNvbnN1bWluZyl7Y29uc3QgYj10aGlzLm92ZXJhbGxDb25zdW1pbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF07dGhpcy5wcm9jZXNzQ29uc3VtaW5nVHJhbnNwb3J0U3RhdHMoYS5pZCxiLHUpfX1icmVha31jYXNlInJlbW90ZS1pbmJvdW5kLXJ0cCI6e2NvbnN0IGM9Zix1PXtqaXR0ZXI6Yy5qaXR0ZXIsZnJhY3Rpb25Mb3N0OmMuZnJhY3Rpb25Mb3N0LHJvdW5kVHJpcFRpbWU6Yy5yb3VuZFRyaXBUaW1lLHJvdW5kVHJpcFRpbWVNZWFzdXJlbWVudHM6Yy5yb3VuZFRyaXBUaW1lTWVhc3VyZW1lbnRzLHRvdGFsUm91bmRUcmlwVGltZTpjLnRvdGFsUm91bmRUcmlwVGltZSxwYWNrZXRzTG9zdDpjLnBhY2tldHNMb3N0fTtvLnJlbW90ZUluYm91bmRSdHAuc2V0KGMubG9jYWxJZCx1KTticmVha31jYXNlIm91dGJvdW5kLXJ0cCI6e2lmKCF0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuaGFzKGYuaWQpKWJyZWFrO2NvbnN0IGM9Zix1PWl8fHRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5nZXQoZi5pZCksYj10aGlzLnBhdXNlZFByb2R1Y2VyTWFwLmdldCh1KTtpZihiKXtpZihiLmxhc3RSZXBvcnRDYWxjdWxhdGVkPT09ITApYnJlYWs7dGhpcy5wYXVzZWRQcm9kdWNlck1hcC5zZXQodSx7bGFzdFJlcG9ydENhbGN1bGF0ZWQ6ITB9KX10aGlzLm92ZXJhbGxQcm9kdWNlcnNTdGF0c01hcFt1XXx8KHRoaXMub3ZlcmFsbFByb2R1Y2Vyc1N0YXRzTWFwW3VdPXt0b3RhbFZpZGVvUGFja2V0c1NlbnQ6MCx0b3RhbEF1ZGlvUGFja2V0c1NlbnQ6MH0pO2NvbnN0IGo9dGhpcy5vdmVyYWxsUHJvZHVjZXJzU3RhdHNNYXBbdV07aWYoWyJ2aWRlbyIsImF1ZGlvIl0uaW5jbHVkZXMoYy5tZWRpYVR5cGUpfHxbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLmtpbmQpKXtpZighdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmhhcyhmLmlkKSl7by5zdGFsZVByb2R1Y2VyU3RyZWFtTWFwPSEwO2JyZWFrfWNvbnN0ICQ9dGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5wcm9kdWNlcnMuZ2V0KHUpO2lmKCgoSD0kPT1udWxsP3ZvaWQgMDokLnRyYWNrKT09bnVsbD92b2lkIDA6SC5yZWFkeVN0YXRlKT09PSJlbmRlZCIpYnJlYWs7by5wcm9kdWNlclN0cmVhbU1hcC5oYXModSl8fG8ucHJvZHVjZXJTdHJlYW1NYXAuc2V0KHUse291dGJvdW5kVmlkZW9SdHBJZDpbXSxvdXRib3VuZEF1ZGlvUnRwSWQ6W119KTtjb25zdCB5PXtieXRlc1NlbnQ6Yy5ieXRlc1NlbnQscGFja2V0c1NlbnQ6Yy5wYWNrZXRzU2VudCxuYWNrQ291bnQ6Yy5uYWNrQ291bnQsc3NyYzpjLnNzcmMsbWlkOmMubWlkLGFjdGl2ZTpjLmFjdGl2ZSxjb2RlY0lkOmMuY29kZWNJZCxoZWFkZXJCeXRlc1NlbnQ6Yy5oZWFkZXJCeXRlc1NlbnR8fDAsdG90YWxQYWNrZXRTZW5kRGVsYXk6Yy50b3RhbFBhY2tldFNlbmREZWxheXx8MH07aWYoYy5tZWRpYVR5cGU9PT0idmlkZW8ifHxjLmtpbmQ9PT0idmlkZW8iKXtjb25zdCBoPWMsej1RKHtmcmFtZUhlaWdodDpoLmZyYW1lSGVpZ2h0LGZyYW1lV2lkdGg6aC5mcmFtZVdpZHRoLGZyYW1lc0VuY29kZWQ6aC5mcmFtZXNFbmNvZGVkLGZyYW1lc0Ryb3BwZWQ6aC5mcmFtZXNEcm9wcGVkP2guZnJhbWVzRHJvcHBlZDpoLmRyb3BwZWRGcmFtZXMsZnJhbWVzUGVyU2Vjb25kOmguZnJhbWVzUGVyU2Vjb25kP2guZnJhbWVzUGVyU2Vjb25kOmguZnJhbWVyYXRlTWVhbixmcmFtZXNTZW50OmguZnJhbWVzU2VudCxrZXlGcmFtZXNFbmNvZGVkOmgua2V5RnJhbWVzRW5jb2RlZCxmaXJDb3VudDpoLmZpckNvdW50LGVuY29kZXJJbXBsZW1lbnRhdGlvbjpoLmVuY29kZXJJbXBsZW1lbnRhdGlvbixodWdlRnJhbWVzU2VudDpoLmh1Z2VGcmFtZXNTZW50LHBsaUNvdW50OmgucGxpQ291bnQscXBTdW06aC5xcFN1bSxxdWFsaXR5TGltaXRhdGlvblJlYXNvbjpoLnF1YWxpdHlMaW1pdGF0aW9uUmVhc29uLHF1YWxpdHlMaW1pdGF0aW9uRHVyYXRpb25zOmgucXVhbGl0eUxpbWl0YXRpb25EdXJhdGlvbnMscXVhbGl0eUxpbWl0YXRpb25SZXNvbHV0aW9uQ2hhbmdlczpoLnF1YWxpdHlMaW1pdGF0aW9uUmVzb2x1dGlvbkNoYW5nZXMsdG90YWxFbmNvZGVUaW1lOmgudG90YWxFbmNvZGVUaW1lLHRvdGFsUGFja2V0U2VuZERlbGF5OmgudG90YWxFbmNvZGVUaW1lLHJldHJhbnNtaXR0ZWRCeXRlc1NlbnQ6aC5yZXRyYW5zbWl0dGVkQnl0ZXNTZW50LHJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudDpoLnJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudCxzY2FsYWJpbGl0eU1vZGU6aC5zY2FsYWJpbGl0eU1vZGUscG93ZXJFZmZpY2llbnRFbmNvZGVyOmgucG93ZXJFZmZpY2llbnRFbmNvZGVyfSx5KTtvLm91dGJvdW5kVmlkZW9SdHAuc2V0KGYuaWQseiksby5wcm9kdWNlclN0cmVhbU1hcC5nZXQodSkub3V0Ym91bmRWaWRlb1J0cElkLnB1c2goZi5pZCksdGhpcy5wcm9jZXNzT3V0Ym91bmRQcm9kdWNlclZpZGVvU3RhdHModSxqLHopfWVsc2UgaWYoYy5tZWRpYVR5cGU9PT0iYXVkaW8ifHxjLmtpbmQ9PT0iYXVkaW8iKXtjb25zdCBoPWMsej1RKHtyZXRyYW5zbWl0dGVkQnl0ZXNTZW50OmgucmV0cmFuc21pdHRlZEJ5dGVzU2VudCxyZXRyYW5zbWl0dGVkUGFja2V0c1NlbnQ6aC5yZXRyYW5zbWl0dGVkUGFja2V0c1NlbnR9LHkpO28ub3V0Ym91bmRBdWRpb1J0cC5zZXQoZi5pZCx6KSxvLnByb2R1Y2VyU3RyZWFtTWFwLmdldCh1KS5vdXRib3VuZEF1ZGlvUnRwSWQucHVzaChmLmlkKSx0aGlzLnByb2Nlc3NPdXRib3VuZFByb2R1Y2VyQXVkaW9TdGF0cyh1LGoseil9fWVsc2UgdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZXJyb3IoYENhbGxzdGF0czogVW5rbm93biBPdXRib3VuZC1ydHAuIG1lZGlhdHlwZTogJHtjLm1lZGlhVHlwZX0ga2luZDogJHtjLmtpbmR9YCk7YnJlYWt9Y2FzZSJpbmJvdW5kLXJ0cCI6e2lmKCF0aGlzLmluYm91bmRDb25zdW1lck1hcC5oYXMoZi5pZCkpYnJlYWs7Y29uc3QgYz1mLHU9aXx8dGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuZ2V0KGYuaWQpLGI9dGhpcy5wYXVzZWRDb25zdW1lck1hcC5nZXQodSk7aWYoYil7aWYoYi5sYXN0UmVwb3J0Q2FsY3VsYXRlZD09PSEwKWJyZWFrO3RoaXMucGF1c2VkQ29uc3VtZXJNYXAuc2V0KHUse2xhc3RSZXBvcnRDYWxjdWxhdGVkOiEwfSl9aWYoYy5zc3JjPT09MTIzNClicmVhazt0aGlzLm92ZXJhbGxDb25zdW1lcnNTdGF0c01hcFt1XXx8KHRoaXMub3ZlcmFsbENvbnN1bWVyc1N0YXRzTWFwW3VdPXt0b3RhbFZpZGVvUGFja2V0c1JlY2VpdmVkOjAsdG90YWxBdWRpb1BhY2tldHNSZWNlaXZlZDowfSk7Y29uc3Qgaj10aGlzLm92ZXJhbGxDb25zdW1lcnNTdGF0c01hcFt1XTtpZihbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLm1lZGlhVHlwZSl8fFsidmlkZW8iLCJhdWRpbyJdLmluY2x1ZGVzKGMua2luZCkpe2lmKCF0aGlzLmluYm91bmRDb25zdW1lck1hcC5oYXMoZi5pZCkpe28uc3RhbGVDb25zdW1lclN0cmVhbU1hcD0hMDticmVha31vLmNvbnN1bWVyU3RyZWFtTWFwLmhhcyh1KXx8by5jb25zdW1lclN0cmVhbU1hcC5zZXQodSx7aW5ib3VuZFZpZGVvUnRwSWQ6W10saW5ib3VuZEF1ZGlvUnRwSWQ6W119KTtjb25zdCAkPXtieXRlc1JlY2VpdmVkOmMuYnl0ZXNSZWNlaXZlZCxwYWNrZXRzUmVjZWl2ZWQ6Yy5wYWNrZXRzUmVjZWl2ZWQscGFja2V0c0xvc3Q6Yy5wYWNrZXRzTG9zdD49MD9jLnBhY2tldHNMb3N0OjAsaml0dGVyOmMuaml0dGVyLG5hY2tDb3VudDpjLm5hY2tDb3VudCxqaXR0ZXJCdWZmZXJEZWxheTpjLmppdHRlckJ1ZmZlckRlbGF5LGppdHRlckJ1ZmZlckVtaXR0ZWRDb3VudDpjLmppdHRlckJ1ZmZlckVtaXR0ZWRDb3VudCxsYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXA6Yy5sYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXAsc3NyYzpjLnNzcmMsbWlkOmMubWlkLGNvZGVjSWQ6Yy5jb2RlY0lkLGhlYWRlckJ5dGVzUmVjZWl2ZWQ6Yy5oZWFkZXJCeXRlc1JlY2VpdmVkfHwwLHBhY2tldHNEaXNjYXJkZWQ6Yy5wYWNrZXRzRGlzY2FyZGVkfHwwLGppdHRlckJ1ZmZlck1pbmltdW1EZWxheTpjLmppdHRlckJ1ZmZlck1pbmltdW1EZWxheXx8MCxqaXR0ZXJCdWZmZXJUYXJnZXREZWxheTpjLmppdHRlckJ1ZmZlclRhcmdldERlbGF5fHwwfTtpZihjLm1lZGlhVHlwZT09PSJ2aWRlbyJ8fGMua2luZD09PSJ2aWRlbyIpe2NvbnN0IHk9YyxoPVEoe2ZyYW1lSGVpZ2h0OnkuZnJhbWVIZWlnaHQsZnJhbWVXaWR0aDp5LmZyYW1lV2lkdGgsZnJhbWVzRGVjb2RlZDp5LmZyYW1lc0RlY29kZWQsZnJhbWVzRHJvcHBlZDp5LmZyYW1lc0Ryb3BwZWQ/eS5mcmFtZXNEcm9wcGVkOnkuZHJvcHBlZEZyYW1lcyxmcmFtZXNQZXJTZWNvbmQ6eS5mcmFtZXNQZXJTZWNvbmQ/eS5mcmFtZXNQZXJTZWNvbmQ6eS5mcmFtZXJhdGVNZWFuLGZyYW1lc1JlY2VpdmVkOnkuZnJhbWVzUmVjZWl2ZWQsa2V5RnJhbWVzRGVjb2RlZDp5LmtleUZyYW1lc0RlY29kZWQsZmlyQ291bnQ6eS5maXJDb3VudCxkZWNvZGVySW1wbGVtZW50YXRpb246eS5kZWNvZGVySW1wbGVtZW50YXRpb24scGxpQ291bnQ6eS5wbGlDb3VudCx0b3RhbFByb2Nlc3NpbmdEZWxheTp5LnRvdGFsUHJvY2Vzc2luZ0RlbGF5LHFwU3VtOnkucXBTdW18fDAsdG90YWxBc3NlbWJseVRpbWU6eS50b3RhbEFzc2VtYmx5VGltZXx8MCx0b3RhbERlY29kZVRpbWU6eS50b3RhbERlY29kZVRpbWV8fDAsdG90YWxGcmVlemVzRHVyYXRpb246eS50b3RhbEZyZWV6ZXNEdXJhdGlvbnx8MCx0b3RhbEludGVyRnJhbWVEZWxheTp5LnRvdGFsSW50ZXJGcmFtZURlbGF5fHwwLHRvdGFsUGF1c2VzRHVyYXRpb246eS50b3RhbFBhdXNlc0R1cmF0aW9ufHwwLHRvdGFsU3F1YXJlZEludGVyRnJhbWVEZWxheTp5LnRvdGFsU3F1YXJlZEludGVyRnJhbWVEZWxheXx8MCxmcmVlemVDb3VudDp5LmZyZWV6ZUNvdW50fHwwLHBhdXNlQ291bnQ6eS5wYXVzZUNvdW50fHwwLHBvd2VyRWZmaWNpZW50RGVjb2Rlcjp5LnBvd2VyRWZmaWNpZW50RGVjb2Rlcn0sJCk7aC5zY29yZT1Jcih7ZnJhbWVXaWR0aDpoLmZyYW1lV2lkdGh8fDAsZnJhbWVzRGVjb2RlZDooaC5mcmFtZXNEZWNvZGVkfHwwKS0oKChGPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6Ri5mcmFtZXNEZWNvZGVkKXx8MCksZnJhbWVzUGVyU2Vjb25kOmguZnJhbWVzUGVyU2Vjb25kfHwwLHBhY2tldHNMb3N0OihoLnBhY2tldHNMb3N0fHwwKS0oKChLPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6Sy5wYWNrZXRzTG9zdCl8fDApLHBhY2tldHNSZWNlaXZlZDooaC5wYWNrZXRzUmVjZWl2ZWR8fDApLSgoKFo9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpaLnBhY2tldHNSZWNlaXZlZCl8fDApLGppdHRlcjpoLmppdHRlcnx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuaGFzKHUpfSkseC5zZXQodSx7c2NvcmU6KyhoLnNjb3JlKjEwKS50b0ZpeGVkKCksZnJhbWVXaWR0aDpoLmZyYW1lV2lkdGh8fDAsZnJhbWVIZWlnaHQ6aC5mcmFtZUhlaWdodHx8MCxmcmFtZXNQZXJTZWNvbmQ6aC5mcmFtZXNQZXJTZWNvbmR8fDAscGFja2V0c0xvc3RQZXJjZW50YWdlOnV0KHtwYWNrZXRzTG9zdDooaC5wYWNrZXRzTG9zdHx8MCktKCgodmU9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDp2ZS5wYWNrZXRzTG9zdCl8fDApLHBhY2tldHNSZWNlaXZlZDooaC5wYWNrZXRzUmVjZWl2ZWR8fDApLSgoKHllPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6eWUucGFja2V0c1JlY2VpdmVkKXx8MCl9KSxqaXR0ZXI6aC5qaXR0ZXJ8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlQ29uc3VtZXJzLmhhcyh1KSxiaXRyYXRlOigoaC5ieXRlc1JlY2VpdmVkfHwwKS0oKChCZT10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOkJlLmJ5dGVzUmVjZWl2ZWQpfHwwKSkqOC83fSksdGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5zZXQodSxoKSxvLmluYm91bmRWaWRlb1J0cC5zZXQoZi5pZCxoKSxvLmNvbnN1bWVyU3RyZWFtTWFwLmdldCh1KS5pbmJvdW5kVmlkZW9SdHBJZC5wdXNoKGYuaWQpLHRoaXMucHJvY2Vzc0luYm91bmRDb25zdW1lclZpZGVvU3RhdHModSxqLGgpfWVsc2UgaWYoYy5tZWRpYVR5cGU9PT0iYXVkaW8ifHxjLmtpbmQ9PT0iYXVkaW8iKXtjb25zdCB5PWMsaD1RKHthdWRpb0xldmVsOnkuYXVkaW9MZXZlbCxjb25jZWFsZWRTYW1wbGVzOnkuY29uY2VhbGVkU2FtcGxlcyxjb25jZWFsbWVudEV2ZW50czp5LmNvbmNlYWxtZW50RXZlbnRzLHRvdGFsQXVkaW9FbmVyZ3k6eS50b3RhbEF1ZGlvRW5lcmd5LHRvdGFsU2FtcGxlc0R1cmF0aW9uOnkudG90YWxTYW1wbGVzRHVyYXRpb24sdG90YWxTYW1wbGVzUmVjZWl2ZWQ6eS50b3RhbFNhbXBsZXNSZWNlaXZlZCxmZWNQYWNrZXRzRGlzY2FyZGVkOnkuZmVjUGFja2V0c0Rpc2NhcmRlZHx8MCxmZWNQYWNrZXRzUmVjZWl2ZWQ6eS5mZWNQYWNrZXRzUmVjZWl2ZWR8fDAsaW5zZXJ0ZWRTYW1wbGVzRm9yRGVjZWxlcmF0aW9uOnkuaW5zZXJ0ZWRTYW1wbGVzRm9yRGVjZWxlcmF0aW9ufHwwLHJlbW92ZWRTYW1wbGVzRm9yQWNjZWxlcmF0aW9uOnkucmVtb3ZlZFNhbXBsZXNGb3JBY2NlbGVyYXRpb258fDAsc2lsZW50Q29uY2VhbGVkU2FtcGxlczp5LnNpbGVudENvbmNlYWxlZFNhbXBsZXN8fDAscGxheW91dElkOnkucGxheW91dElkfSwkKTtoLnNjb3JlPXdyKHtjb25jZWFsbWVudEV2ZW50czooaC5jb25jZWFsbWVudEV2ZW50c3x8MCktKCgoeGU9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDp4ZS5jb25jZWFsbWVudEV2ZW50cyl8fDApLHBhY2tldHNMb3N0OihoLnBhY2tldHNMb3N0fHwwKS0oKChqZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOmplLnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihoLnBhY2tldHNSZWNlaXZlZHx8MCktKCgoVWU9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpVZS5wYWNrZXRzUmVjZWl2ZWQpfHwwKSxqaXR0ZXI6aC5qaXR0ZXJ8fDB9KSx4LnNldCh1LHtzY29yZTorKGguc2NvcmUqMTApLnRvRml4ZWQoKSxwYWNrZXRzTG9zdFBlcmNlbnRhZ2U6dXQoe3BhY2tldHNMb3N0OihoLnBhY2tldHNMb3N0fHwwKS0oKChIZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOkhlLnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihoLnBhY2tldHNSZWNlaXZlZHx8MCktKCgoS2U9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpLZS5wYWNrZXRzUmVjZWl2ZWQpfHwwKX0pLGppdHRlcjpoLmppdHRlcnx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuaGFzKHUpLGJpdHJhdGU6KChoLmJ5dGVzUmVjZWl2ZWR8fDApLSgoKCRlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6JGUuYnl0ZXNSZWNlaXZlZCl8fDApKSo4Lzd9KSx0aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLnNldCh1LGgpLG8uaW5ib3VuZEF1ZGlvUnRwLnNldChmLmlkLGgpLG8uY29uc3VtZXJTdHJlYW1NYXAuZ2V0KHUpLmluYm91bmRBdWRpb1J0cElkLnB1c2goZi5pZCksdGhpcy5wcm9jZXNzSW5ib3VuZENvbnN1bWVyQXVkaW9TdGF0cyh1LGosaCl9fWVsc2UgdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZXJyb3IoYENhbGxzdGF0czogVW5rbm93biBJbmJvdW5kLXJ0cC4gbWVkaWF0eXBlOiAke2MubWVkaWFUeXBlfSBraW5kOiAke2Mua2luZH1gKTticmVha319fWlmKG8ucHJvZHVjZXJTdHJlYW1NYXAuZm9yRWFjaCgoZixjKT0+e3ZhciB1LGIsaiwkLHksaCx6LFdlLHplLEdlLHFlLFllLFFlLEplLFhlLFplLGV0LHR0LHJ0LG50LHN0LGl0LGF0O2lmKGYub3V0Ym91bmRWaWRlb1J0cElkLmxlbmd0aD4wKXtjb25zdCBOPVtdO2Yub3V0Ym91bmRWaWRlb1J0cElkLmZvckVhY2goc3I9PntOLnB1c2goby5vdXRib3VuZFZpZGVvUnRwLmdldChzcikpfSk7Y29uc3QgQT10aGlzLmdldFdvcmtpbmdTaW11bGNhc3RWaWRlb1N0YXRzKE4pO0Euc2NvcmU9UHIoe2ZyYW1lV2lkdGg6QS5mcmFtZVdpZHRofHwwLGZyYW1lc1BlclNlY29uZDpBLmZyYW1lc1BlclNlY29uZHx8MCxqaXR0ZXI6KCh1PUEucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnUuaml0dGVyKXx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVQcm9kdWNlcnMuaGFzKGMpLHBhY2tldHNTZW50OihBLnBhY2tldHNTZW50fHwwKS0oKChiPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6Yi5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKGo9QS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6ai5wYWNrZXRzTG9zdCl8fDApLSgoKHk9KCQ9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDokLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDp5LnBhY2tldHNMb3N0KXx8MCksZnJhbWVzRW5jb2RlZDooQS5mcmFtZXNFbmNvZGVkfHwwKS0oKChoPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6aC5mcmFtZXNFbmNvZGVkKXx8MCl9KSxJLnNldChjLHtzY29yZTorKEEuc2NvcmUqMTApLnRvRml4ZWQoKSxmcmFtZVdpZHRoOkEuZnJhbWVXaWR0aHx8MCxmcmFtZUhlaWdodDpBLmZyYW1lSGVpZ2h0fHwwLGZyYW1lc1BlclNlY29uZDpBLmZyYW1lc1BlclNlY29uZHx8MCxqaXR0ZXI6KCh6PUEucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnouaml0dGVyKXx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVQcm9kdWNlcnMuaGFzKGMpLHBhY2tldHNMb3N0UGVyY2VudGFnZTpsdCh7cGFja2V0c1NlbnQ6KEEucGFja2V0c1NlbnR8fDApLSgoKFdlPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6V2UucGFja2V0c1NlbnQpfHwwKSxwYWNrZXRzTG9zdDooKCh6ZT1BLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDp6ZS5wYWNrZXRzTG9zdCl8fDApLSgoKHFlPShHZT10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOkdlLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpxZS5wYWNrZXRzTG9zdCl8fDApfSksYml0cmF0ZTooKEEuYnl0ZXNTZW50fHwwKS0oKChZZT10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOlllLmJ5dGVzU2VudCl8fDApKSo4LzcsY3B1TGltaXRhdGlvbnM6QS5xdWFsaXR5TGltaXRhdGlvblJlYXNvbj09PSJjcHUiLGJhbmR3aWR0aExpbWl0YXRpb25zOkEucXVhbGl0eUxpbWl0YXRpb25SZWFzb249PT0iYmFuZHdpZHRoIn0pLHRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuc2V0KGMsQSl9ZWxzZSBpZihmLm91dGJvdW5kQXVkaW9SdHBJZC5sZW5ndGg+MCl7Y29uc3QgTj1vLm91dGJvdW5kQXVkaW9SdHAuZ2V0KGYub3V0Ym91bmRBdWRpb1J0cElkWzBdKTtOLnNjb3JlPVJyKHtwYWNrZXRzU2VudDooTi5wYWNrZXRzU2VudHx8MCktKCgoUWU9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpRZS5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKEplPU4ucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOkplLnBhY2tldHNMb3N0KXx8MCktKCgoWmU9KFhlPXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6WGUucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOlplLnBhY2tldHNMb3N0KXx8MCksaml0dGVyOigoZXQ9Ti5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6ZXQuaml0dGVyKXx8MH0pLEkuc2V0KGMse3Njb3JlOisoTi5zY29yZSoxMCkudG9GaXhlZCgpLGJpdHJhdGU6KChOLmJ5dGVzU2VudHx8MCktKCgodHQ9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDp0dC5ieXRlc1NlbnQpfHwwKSkqOC83LHBhY2tldHNMb3N0UGVyY2VudGFnZTpsdCh7cGFja2V0c1NlbnQ6KE4ucGFja2V0c1NlbnR8fDApLSgoKHJ0PXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6cnQucGFja2V0c1NlbnQpfHwwKSxwYWNrZXRzTG9zdDooKChudD1OLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpudC5wYWNrZXRzTG9zdCl8fDApLSgoKGl0PShzdD10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnN0LnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDppdC5wYWNrZXRzTG9zdCl8fDApfSksaml0dGVyOigoYXQ9Ti5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6YXQuaml0dGVyKXx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVQcm9kdWNlcnMuaGFzKGMpfSksdGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5zZXQoYyxOKX19KSxFLmZvckVhY2goZj0+e2NvbnN0IGM9bS5maW5kKGI9PmIuaWQ9PT1mLmxvY2FsQ2FuZGlkYXRlSWQ/KGYubG9jYWxDYW5kaWRhdGVJZD1iLmlkLGIpOm51bGwpLHU9di5maW5kKGI9PmIuaWQ9PT1mLnJlbW90ZUNhbmRpZGF0ZUlkPyhmLnJlbW90ZUNhbmRpZGF0ZUlkPWIuaWQsYik6bnVsbCk7YyYmKGYubG9jYWxDYW5kaWRhdGVUeXBlPWMudHlwZSxmLmxvY2FsQ2FuZGlkYXRlQWRkcmVzcz1hZShjLmFkZHJlc3MpLGYubG9jYWxDYW5kaWRhdGVQb3J0PWMucG9ydCxmLmxvY2FsQ2FuZGlkYXRlUHJvdG9jb2w9Yy5wcm90b2NvbCxmLmxvY2FsQ2FuZGlkYXRlVXJsPWMudXJsLGYubG9jYWxDYW5kaWRhdGVOZXR3b3JrVHlwZT1jLm5ldHdvcmtUeXBlLGYubG9jYWxDYW5kaWRhdGVSZWxhdGVkQWRkcmVzcz1hZShjLnJlbGF0ZWRBZGRyZXNzKSxmLmxvY2FsQ2FuZGlkYXRlUmVsYXRlZFBvcnQ9Yy5yZWxhdGVkUG9ydCksdSYmKGYucmVtb3RlQ2FuZGlkYXRlVHlwZT11LnR5cGUsZi5yZW1vdGVDYW5kaWRhdGVBZGRyZXNzPWFlKHUuYWRkcmVzcyksZi5yZW1vdGVDYW5kaWRhdGVQb3J0PXUucG9ydCxmLnJlbW90ZUNhbmRpZGF0ZVByb3RvY29sPXUucHJvdG9jb2wsZi5yZW1vdGVDYW5kaWRhdGVVcmw9dS51cmwpfSksby5jYW5kaWRhdGVQYWlyJiYoby50cmFuc3BvcnQ/KG8udHJhbnNwb3J0LmJ5dGVzUmVjZWl2ZWQ9by5jYW5kaWRhdGVQYWlyLmJ5dGVzUmVjZWl2ZWQsby50cmFuc3BvcnQuYnl0ZXNTZW50PW8uY2FuZGlkYXRlUGFpci5ieXRlc1NlbnQsby50cmFuc3BvcnQudG90YWxSb3VuZFRyaXBUaW1lPW8uY2FuZGlkYXRlUGFpci50b3RhbFJvdW5kVHJpcFRpbWUsby50cmFuc3BvcnQuYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlPW8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGUsby50cmFuc3BvcnQuYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlPW8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUsby50cmFuc3BvcnQucm91bmRUcmlwVGltZT1vLmNhbmRpZGF0ZVBhaXIuY3VycmVudFJvdW5kVHJpcFRpbWUpOm8udHJhbnNwb3J0PXtieXRlc1JlY2VpdmVkOm8uY2FuZGlkYXRlUGFpci5ieXRlc1JlY2VpdmVkLGJ5dGVzU2VudDpvLmNhbmRpZGF0ZVBhaXIuYnl0ZXNTZW50LHRvdGFsUm91bmRUcmlwVGltZTpvLmNhbmRpZGF0ZVBhaXIudG90YWxSb3VuZFRyaXBUaW1lLGF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZTpvLmNhbmRpZGF0ZVBhaXIuYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlLGF2YWlsYWJsZUluY29taW5nQml0cmF0ZTpvLmNhbmRpZGF0ZVBhaXIuYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlLHJvdW5kVHJpcFRpbWU6by5jYW5kaWRhdGVQYWlyLmN1cnJlbnRSb3VuZFRyaXBUaW1lfSksby50cmFuc3BvcnQmJihvLnRyYW5zcG9ydC5jYW5kaWRhdGVQYWlycz1FKSxvLnRyYW5zcG9ydCYmIW8udHJhbnNwb3J0LnJvdW5kVHJpcFRpbWUpe2xldCBmPTAsYz0wO28ucmVtb3RlSW5ib3VuZFJ0cC5mb3JFYWNoKCh1LGIpPT57dS5yb3VuZFRyaXBUaW1lJiZ1LnJvdW5kVHJpcFRpbWU+ZiYmKGY9dS5yb3VuZFRyaXBUaW1lLGM9dS50b3RhbFJvdW5kVHJpcFRpbWUpfSksby50cmFuc3BvcnQucm91bmRUcmlwVGltZT1mLG8udHJhbnNwb3J0LnRvdGFsUm91bmRUcmlwVGltZT1jfWlmKHguc2l6ZT4wKXRyeXt0aGlzLm9ic2VydmVyLmVtaXQoImNvbnN1bWVyX3Njb3JlIix4KX1jYXRjaChmKXt9aWYoSS5zaXplPjApdHJ5e3RoaXMub2JzZXJ2ZXIuZW1pdCgicHJvZHVjZXJfc2NvcmUiLEkpfWNhdGNoKGYpe31yZXR1cm4gb31nZXRQcm9kdWNlclN0YXRzRnJvbVJlcG9ydChlKXtjb25zdCBuPVtdO3RyeXtlLnByb2R1Y2VyU3RyZWFtTWFwLmZvckVhY2goKHMsaSk9Pntjb25zdCBhPXRoaXMucHJvZHVjZXJNYXAuZ2V0KGkpLGQ9YS50cmFjay5nZXRTZXR0aW5ncygpLG89cy5vdXRib3VuZFZpZGVvUnRwSWQubWFwKG09Pntjb25zdCB2PWUub3V0Ym91bmRWaWRlb1J0cC5nZXQobSk7cmV0dXJuIHYuZnJhbWVIZWlnaHR8fCh2LmZyYW1lSGVpZ2h0PWQuaGVpZ2h0LHYuZnJhbWVXaWR0aD1kLndpZHRoLHYuZnJhbWVzUGVyU2Vjb25kPWQuZnJhbWVSYXRlKSx2fSksbD17cHJvZHVjZXJJZDppLGFwcERhdGE6YS5hcHBEYXRhLHZpZGVvU3RhdHM6byxhdWRpb1N0YXRzOnMub3V0Ym91bmRBdWRpb1J0cElkLm1hcChtPT5lLm91dGJvdW5kQXVkaW9SdHAuZ2V0KG0pKX07bi5wdXNoKGwpfSl9Y2F0Y2gocyl7Y29uc29sZS5lcnJvcigiZ2V0UHJvZHVjZXJzUmVwb3J0OiAiLHMsZSl9cmV0dXJuIG59Z2V0Q29uc3VtZXJTdGF0c0Zyb21QYXJzZWRDb25zdW1lclN0YXRzKGUsbixzKXtsZXQgaTt0cnl7Y29uc3R7cGVlcklkOmEscHJvZHVjZXJJZDpkLGFwcERhdGE6b309dGhpcy5jb25zdW1lclBlZXJJZE1hcC5nZXQocyksbD1uPT1udWxsP3ZvaWQgMDpuLmluYm91bmRWaWRlb1J0cElkLm1hcChtPT57Y29uc3QgRT10aGlzLmNvbnN1bWVyTWFwLmdldChzKS50cmFjay5nZXRTZXR0aW5ncygpLEk9ZS5pbmJvdW5kVmlkZW9SdHAuZ2V0KG0pO3JldHVybiBJLmZyYW1lSGVpZ2h0fHwoSS5mcmFtZUhlaWdodD1FLmhlaWdodCxJLmZyYW1lV2lkdGg9RS53aWR0aCxJLmZyYW1lc1BlclNlY29uZD1FLmZyYW1lUmF0ZSksSX0pO2k9e2NvbnN1bWVySWQ6cyxwZWVySWQ6YSxwcm9kdWNlcklkOmQsYXBwRGF0YTpvLHZpZGVvU3RhdHM6bCxhdWRpb1N0YXRzOm49PW51bGw/dm9pZCAwOm4uaW5ib3VuZEF1ZGlvUnRwSWQubWFwKG09PmUuaW5ib3VuZEF1ZGlvUnRwLmdldChtKSl9fWNhdGNoKGEpe2NvbnNvbGUuZXJyb3IoImdldENvbnN1bWVyU3RhdHNGcm9tUGFyc2VkQ29uc3VtZXJTdGF0czogIixhLGUpfXJldHVybiBpfWdldENvbnN1bWVyU3RhdHNGcm9tUmVwb3J0KGUpe2NvbnN0IG49W107dHJ5e2UuY29uc3VtZXJTdHJlYW1NYXAuZm9yRWFjaCgocyxpKT0+e24ucHVzaCh0aGlzLmdldENvbnN1bWVyU3RhdHNGcm9tUGFyc2VkQ29uc3VtZXJTdGF0cyhlLHMsaSkpfSl9Y2F0Y2gocyl7Y29uc29sZS5lcnJvcigiZ2V0Q29uc3VtZXJTdGF0c0Zyb21SZXBvcnQ6ICIscyxlKX1yZXR1cm4gbn19Y2xhc3MgSXMgZXh0ZW5kcyBOcnt9ZnVuY3Rpb24gbXQodCxyLGUsbil7aWYodCE9bnVsbCYmdC5sb2dnZXImJnQubG9nZ2VyLmVycm9yKCJDYWxsc3RhdHM6OmhhbmRsZUVycm9yIix7ZXJyb3I6bn0pLHR5cGVvZiBlPT0iZnVuY3Rpb24iJiZuIGluc3RhbmNlb2YgcillLmNhbGwobnVsbCxuLHQpO2Vsc2UgdGhyb3cgbn1mdW5jdGlvbiBWcih0LHIsZSl7Y29uc3Qgbj10LnZhbHVlO3JldHVybiB0LnZhbHVlPWZ1bmN0aW9uKC4uLnMpe3RyeXtjb25zdCBpPW4uYXBwbHkodGhpcyxzKTtyZXR1cm4gaSYmaSBpbnN0YW5jZW9mIFByb21pc2U/aS5jYXRjaChhPT57bXQodGhpcyxyLGUsYSl9KTppfWNhdGNoKGkpe210KHRoaXMscixlLGkpfXJldHVybiBudWxsfSx0fWNvbnN0IEM9KHQscik9PihlLG4scyk9Pntjb25zdCBpPXMudmFsdWU7cmV0dXJuIHMudmFsdWU9ZnVuY3Rpb24oLi4uYSl7dHJ5e2NvbnN0IGQ9aS5hcHBseSh0aGlzLGEpO3JldHVybiBkJiZkIGluc3RhbmNlb2YgUHJvbWlzZT9kLmNhdGNoKG89PnttdCh0aGlzLHQscixvKX0pOmR9Y2F0Y2goZCl7bXQodGhpcyx0LHIsZCl9cmV0dXJuIG51bGx9LHN9LEFzPSh0LHIpPT4oZSxuLHMpPT57aWYocylyZXR1cm4gVnIocyx0LHIpO2Zvcihjb25zdCBpIG9mIFJlZmxlY3Qub3duS2V5cyhlLnByb3RvdHlwZSkuZmlsdGVyKGE9PmEhPT0iY29uc3RydWN0b3IiKSl7Y29uc3QgYT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUucHJvdG90eXBlLGkpO2EudmFsdWUgaW5zdGFuY2VvZiBGdW5jdGlvbiYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLGksVnIoYSx0LHIpKX19O3ZhciBSPWZ1bmN0aW9uKHQscixlLG4pe3ZhciBzPWFyZ3VtZW50cy5sZW5ndGgsaT1zPDM/cjpuPT09bnVsbD9uPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocixlKTpuLGE7aWYodHlwZW9mIFJlZmxlY3Q9PSJvYmplY3QiJiZ0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZT09ImZ1bmN0aW9uIilpPVJlZmxlY3QuZGVjb3JhdGUodCxyLGUsbik7ZWxzZSBmb3IodmFyIGQ9dC5sZW5ndGgtMTtkPj0wO2QtLSkoYT10W2RdKSYmKGk9KHM8Mz9hKGkpOnM+Mz9hKHIsZSxpKTphKHIsZSkpfHxpKTtyZXR1cm4gcz4zJiZpJiZPYmplY3QuZGVmaW5lUHJvcGVydHkocixlLGkpLGl9O2NvbnN0IFA9Y29uc29sZTtsZXQgXz1jbGFzcyBleHRlbmRzIHF7Y29uc3RydWN0b3IoZT0iaHR0cHM6Ly9hcGkudGVzdGluZ3YzLmR5dGUuaW4iLG49IkJsaW5rIixzPWdyLlBST0QsaSxhLGQsbyl7c3VwZXIoKTtwKHRoaXMsIm9ic2VydmVyIik7cCh0aGlzLCJldmVudEhhbmRsZXIiKTtwKHRoaXMsIm1lYXN1cmVtZW50cyIpO3AodGhpcywicHJvZHVjaW5nVHJhbnNwb3J0Iik7cCh0aGlzLCJjb25zdW1pbmdUcmFuc3BvcnQiKTtwKHRoaXMsInByb2R1Y2VycyIsbmV3IE1hcCk7cCh0aGlzLCJjb25zdW1lcnMiLG5ldyBNYXApO3AodGhpcywiaWNlU2VydmVycyIpO3AodGhpcywiY29ubmVjdGlvbkluZm9Qcm9taXNlIik7cCh0aGlzLCJwaW5nU3RhdHNUaW1lb3V0Iik7cCh0aGlzLCJsb2dnZXIiKTtwKHRoaXMsImVudiIpO3AodGhpcywiYXBpSG9zdG5hbWVzIik7cCh0aGlzLCJwZWVySWQiKTtwKHRoaXMsImNvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZXNNYXAiLG5ldyBNYXApO3AodGhpcywiY3VycmVudFVzZXJNZWRpYVN0YXRlcyIse30pO3N3aXRjaCh0aGlzLmVudj1zLHRoaXMuYXBpSG9zdG5hbWVzPW8sdGhpcy5sb2dnZXI9YSx0aGlzLnBlZXJJZD1kLHRoaXMuZXZlbnRIYW5kbGVyPW5ldyBocyh7bG9nZ2VyOmEscGVlcklkOmQsYXBpSG9zdG5hbWVzOm99KSx0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjplbmdpbmVOYW1lOiAiLHtlbmdpbmVOYW1lOm59KSxuKXtjYXNlIkJsaW5rIjp0aGlzLm1lYXN1cmVtZW50cz1uZXcgd3M7YnJlYWs7Y2FzZSJHZWNrbyI6dGhpcy5tZWFzdXJlbWVudHM9bmV3IE5yO2JyZWFrO2Nhc2UiV2ViS2l0Ijp0aGlzLm1lYXN1cmVtZW50cz1uZXcgSXM7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihgVW5rbm93biBlbmdpbmVOYW1lISAke259YCl9dGhpcy5tZWFzdXJlbWVudHMuY2FsbFN0YXRzSW5zdGFuY2U9dGhpcyx0aGlzLnJlZ2lzdGVyUHJvZHVjZXI9dGhpcy5yZWdpc3RlclByb2R1Y2VyLmJpbmQodGhpcyksdGhpcy5yZWdpc3RlckNvbnN1bWVyPXRoaXMucmVnaXN0ZXJDb25zdW1lci5iaW5kKHRoaXMpLHRoaXMub2JzZXJ2ZXI9bmV3IHEsdGhpcy5tZWFzdXJlbWVudHMub2JzZXJ2ZXIub24oImNvbnN1bWVyX3Njb3JlIixsPT57YS5kZWJ1ZyhgY2FsbFN0YXRzOjpjb25zdW1lcl9zY29yZSAke1suLi5sLmVudHJpZXMoKV19YCksdGhpcy5ldmVudEhhbmRsZXIuZW1pdCgiY29uc3VtZXJfc2NvcmUiLGwpfSksdGhpcy5tZWFzdXJlbWVudHMub2JzZXJ2ZXIub24oInByb2R1Y2VyX3Njb3JlIixsPT57YS5kZWJ1ZyhgY2FsbFN0YXRzOjpwcm9kdWNlcl9zY29yZSAke1suLi5sLmVudHJpZXMoKV19YCksdGhpcy5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfc2NvcmUiLGwpfSl9cmVnaXN0ZXJJY2VTZXJ2ZXJzKGUpe3RoaXMuaWNlU2VydmVycz1lfXJlZ2lzdGVyQ29uc3VtZXIoZSl7dmFyIG47dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLmhhcyhlLmlkKXx8dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLmlkLHt9KSx0aGlzLmNvbnN1bWVycy5zZXQoZS5pZCxlKSx0aGlzLm1lYXN1cmVtZW50cy5yZWdpc3RlckNvbnN1bWVyKGUpLHRoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnJlZ2lzdGVyQ29uc3VtZXIiLHtjb25zdW1lcklkOmUuaWQsY29uc3VtZXJraW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChuPWUuYXBwRGF0YSkhPW51bGwmJm4uc2NyZWVuU2hhcmUpfSksZS5vbigiY2xvc2UiLHRoaXMuZGVSZWdpc3RlckNvbnN1bWVyLmJpbmQodGhpcyxlKSl9cmVnaXN0ZXJQcm9kdWNlcihlKXt2YXIgbjt0aGlzLnByb2R1Y2Vycy5zZXQoZS5pZCxlKSx0aGlzLm1lYXN1cmVtZW50cy5yZWdpc3RlclByb2R1Y2VyKGUpLHRoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnJlZ2lzdGVyUHJvZHVjZXIiLHtwcm9kdWNlcklkOmUuaWQscHJvZHVjZXJLaW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChuPWUuYXBwRGF0YSkhPW51bGwmJm4uc2NyZWVuU2hhcmUpfSksZS5vbigiY2xvc2UiLHRoaXMuZGVSZWdpc3RlclByb2R1Y2VyLmJpbmQodGhpcyxlKSl9c2VuZENvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZUV2ZW50KGUsbil7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLmhhcyhlKXx8dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLHt9KTtjb25zdCBzPXRoaXMuY29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlc01hcC5nZXQoZSk7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLE9iamVjdC5hc3NpZ24ocyxuKSl9cmVnaXN0ZXJQcm9kdWNpbmdUcmFuc3BvcnQoZSl7dmFyIHM7dGhpcy5wcm9kdWNpbmdUcmFuc3BvcnQ9ZSxlLm9uKCJjbG9zZSIsdGhpcy5kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0LmJpbmQodGhpcyxlKSksZS5vbigiZGlzY29ubmVjdCIsdGhpcy5kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0LmJpbmQodGhpcyxlKSksQXJyYXkuZnJvbSgoKHM9ZS5fcHJvZHVjZXJzKT09bnVsbD92b2lkIDA6cy52YWx1ZXMoKSl8fFtdKS5mb3JFYWNoKGk9Pnt0aGlzLnJlZ2lzdGVyUHJvZHVjZXIoaSl9KSxlLm9uKCJuZXdwcm9kdWNlciIsdGhpcy5yZWdpc3RlclByb2R1Y2VyKX1yZWdpc3RlckNvbnN1bWluZ1RyYW5zcG9ydChlKXt2YXIgczt0aGlzLmNvbnN1bWluZ1RyYW5zcG9ydD1lLGUub24oImNsb3NlIix0aGlzLmRpc2Nvbm5lY3RDb25zdW1pbmdUcmFuc3BvcnQuYmluZCh0aGlzLGUpKSxlLm9uKCJkaXNjb25uZWN0Iix0aGlzLmRpc2Nvbm5lY3RDb25zdW1pbmdUcmFuc3BvcnQuYmluZCh0aGlzLGUpKSxBcnJheS5mcm9tKCgocz1lLl9jb25zdW1lcnMpPT1udWxsP3ZvaWQgMDpzLnZhbHVlcygpKXx8W10pLmZvckVhY2goaT0+e3RoaXMucmVnaXN0ZXJDb25zdW1lcihpKX0pLGUub24oIm5ld2NvbnN1bWVyIix0aGlzLnJlZ2lzdGVyQ29uc3VtZXIpfWRlUmVnaXN0ZXJDb25zdW1lcihlKXt0aGlzLmNvbnN1bWVycy5kZWxldGUoZS5pZCl9ZGVSZWdpc3RlclByb2R1Y2VyKGUpe3ZhciBuO3RoaXMucHJvZHVjZXJzLmRlbGV0ZShlLmlkKSx0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpkZVJlZ2lzdGVyUHJvZHVjZXIiLHtwcm9kdWNlcklkOmUuaWQscHJvZHVjZXJLaW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChuPWUuYXBwRGF0YSkhPW51bGwmJm4uc2NyZWVuU2hhcmUpfSl9ZGlzY29ubmVjdENvbnN1bWluZ1RyYW5zcG9ydCgpe3RoaXMuY29uc3VtaW5nVHJhbnNwb3J0PXZvaWQgMH1kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0KCl7dGhpcy5wcm9kdWNpbmdUcmFuc3BvcnQ9dm9pZCAwfWNhbGxFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoZSl9c2VuZFByZUNhbGxUZXN0QmVnaW5FdmVudChlPSExLG4pe3RoaXMuY29ubmVjdGlvbkluZm9Qcm9taXNlPXRoaXMubWVhc3VyZW1lbnRzLmdldE5ldHdvcmtJbmZvKHRoaXMuaWNlU2VydmVycyxlKSx0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuUFJFQ0FMTF9URVNUX0JFR0lOLHRpbWVzdGFtcDpufSksdGhpcy5jb25uZWN0aW9uSW5mb1Byb21pc2UmJnRoaXMuY29ubmVjdGlvbkluZm9Qcm9taXNlLnRoZW4ocz0+e3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5QUkVDQUxMX1RFU1RfQ09NUExFVEUsbWV0YURhdGE6e2Nvbm5lY3Rpb25JbmZvOnN9LHRpbWVzdGFtcDpufSl9KX1zZW5kU2NyZWVuU2hhcmVUb2dnbGVFdmVudChlLG49bnVsbCxzKXt0aGlzLmN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMuc2NyZWVuPWUsdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDplP1MuU0NSRUVOU0hBUkVfU1RBUlRFRDpTLlNDUkVFTlNIQVJFX1NUT1BQRUQsbWV0YURhdGE6e3NzcmM6bn0sdGltZXN0YW1wOnN9KX1zZW5kU2NyZWVuU2hhcmVSZXF1ZXN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuU0NSRUVOU0hBUkVfU1RBUlRfUkVRVUVTVEVELHRpbWVzdGFtcDplfSl9c2VuZEFjdGl2ZVNwZWFrZXJFdmVudChlLG4pe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5ET01JTkFOVF9TUEVBS0VSLG1ldGFEYXRhOntwZWVySWQ6ZX0sdGltZXN0YW1wOm59KX1kZXZpY2VzKGUsbixzKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OmU9PT1KLkFVRElPJiZTLkFVRElPX0RFVklDRVNfVVBEQVRFU3x8ZT09PUouVklERU8mJlMuVklERU9fREVWSUNFU19VUERBVEVTfHxlPT09Si5TUEVBS0VSJiZTLlNQRUFLRVJfREVWSUNFU19VUERBVEVTLG1ldGFEYXRhOntkZXZpY2VMaXN0Om59LHRpbWVzdGFtcDpzfSl9c2VsZWN0ZWREZXZpY2UoZSxuLHMpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6ZT09PUouQVVESU8mJlMuU0VMRUNURURfTUlDUk9IUE9ORV9VUERBVEV8fGU9PT1KLlZJREVPJiZTLlNFTEVDVEVEX0NBTUVSQV9VUERBVEV8fGU9PT1KLlNQRUFLRVImJlMuU0VMRUNURURfU1BFQUtFUl9VUERBVEUsbWV0YURhdGE6e2RldmljZTpufSx0aW1lc3RhbXA6c30pfW1lZGlhUGVybWlzc2lvbihlLG4scyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLk1FRElBX1BFUk1JU1NJT04sbWV0YURhdGE6e2RldmljZVR5cGU6ZSxwZXJtaXNzaW9uOm59LHRpbWVzdGFtcDpzfSl9bWVkaWFQbGF5YmFja0ZhaWxlZChlLG4pe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6ZT09PUouQVVESU8mJlMuQVVESU9fUExBWV9GQUlMRUR8fGU9PT1KLlZJREVPJiZTLlZJREVPX1BMQVlfRkFJTEVELG1ldGFEYXRhOntkZXZpY2VUeXBlOmV9LHRpbWVzdGFtcDpufSl9bWVkaWFUcmFja011dGVkKGUsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDplPT09Si5BVURJTyYmUy5BVURJT19UUkFDS19NVVRFRHx8ZT09PUouVklERU8mJlMuVklERU9fVFJBQ0tfTVVURUQsbWV0YURhdGE6e2RldmljZVR5cGU6ZX0sdGltZXN0YW1wOm59KX10YWJDaGFuZ2VkKGUsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlRBQl9DSEFOR0UsbWV0YURhdGE6e2lzTWVldGluZ3NUYWJBY3RpdmU6ZX0sdGltZXN0YW1wOm59KX1icm93c2VyQmFja2dyb3VuZGVkKGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5CUk9XU0VSX0JBQ0tHUk9VTkRFRCx0aW1lc3RhbXA6ZX0pfWJyb3dzZXJGb3JlZ3JvdW5kZWQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkJST1dTRVJfRk9SRUdST1VOREVELHRpbWVzdGFtcDplfSl9bGVnYWN5U3dpdGNoKGUsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkxFR0FDWV9TV0lUQ0gsbWV0YWRhdGE6e29uOmV9LHRpbWVzdGFtcDpufSl9Z2V0UHJlQ2FsbFRlc3RSZXN1bHRzKCl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLmNvbm5lY3Rpb25JbmZvUHJvbWlzZX0pfXNlbmRDYWxsSm9pbkJlZ2luRXZlbnQoZSxuKXtlPW90KFEoe30sZSkse21lZXRpbmdFbnY6dGhpcy5lbnZ9KSxlLmRldmljZUluZm89b3QoUSh7fSxlLmRldmljZUluZm8pLHt1c2VyQWdlbnQ6bmF2aWdhdG9yLnVzZXJBZ2VudCxjcHVzOm5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5LG1lbW9yeTpuYXZpZ2F0b3IuZGV2aWNlTWVtb3J5fSksdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkNBTExfSk9JTl9CRUdJTixtZXRhRGF0YTp7cGVlck1ldGFEYXRhOmV9LHRpbWVzdGFtcDpufSl9c2VuZE5ldHdvcmtRdWFsaXR5VGVzdEJlZ2luRXZlbnQoZSxuKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuTkVUX1FVQUxJVFlfVEVTVF9CRUdJTix0aW1lc3RhbXA6bn0pLG5ldyBQcm9taXNlKChpLGEpPT53KHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBkPVtdO3RyeXtmb3IoY29uc3QgbyBvZiBlKXRyeXtpZihvLmljZVNlcnZlcnMmJm8uaWNlU2VydmVycy5sZW5ndGg+MCl7Y29uc3QgbD15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXROZXR3b3JrUXVhbGl0eShvLmljZVNlcnZlcnMpO2QucHVzaChvdChRKHt9LG8pLHtuZXR3b3JrUmVzdWx0czpsfSkpfX1jYXRjaChsKXtjb25zb2xlLndhcm4oIkVycm9yIGhhbmRsaW5nICIsbCl9aSh7cmVnaW9uRGF0YTpkfSl9Y2F0Y2gobyl7Y29uc29sZS53YXJuKCJFcnJvciBpbiBjYWxsc3RhdHMsICIsbyksYShvKX19KSkudGhlbihpPT57dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLk5FVF9RVUFMSVRZX1RFU1RfRU5ELHRpbWVzdGFtcDpuLG1ldGFEYXRhOml9KX0pfXNlbmRXZWJTb2NrZXRDb25uZWN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuV0VCU09DS0VUX0NPTk5FQ1RFRCx0aW1lc3RhbXA6ZX0pfXNlbmRUcmFuc3BvcnRDb25uZWN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuVFJBTlNQT1JUX0NPTk5FQ1RFRCx0aW1lc3RhbXA6ZX0pfXNlbmRBdWRpb1RvZ2dsZUV2ZW50KGUsbil7dGhpcy5jdXJyZW50VXNlck1lZGlhU3RhdGVzLmF1ZGlvPWU7bGV0IHM7ZT9zPVMuQVVESU9fT046cz1TLkFVRElPX09GRix0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OnMsdGltZXN0YW1wOm59KX1zZW5kVmlkZW9Ub2dnbGVFdmVudChlLG4pe3RoaXMuY3VycmVudFVzZXJNZWRpYVN0YXRlcy52aWRlbz1lO2xldCBzO2U/cz1TLlZJREVPX09OOnM9Uy5WSURFT19PRkYsdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpzLHRpbWVzdGFtcDpufSl9c2VuZFBhcnRpY2lwYW50Um9sZVRvZ2dsZUV2ZW50KGUsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlBBUlRJQ0lQQU5UX1JPTEUsdGltZXN0YW1wOm4sbWV0YURhdGE6ZX0pfXN0YXJ0UGluZ1N0YXRzKGU9N2UzKXt0aGlzLnNlbmRQaW5nU3RhdHNFdmVudCghMSxuZXcgRGF0ZSksdGhpcy5waW5nU3RhdHNUaW1lb3V0PXNldEludGVydmFsKHRoaXMuc2VuZFBpbmdTdGF0c0V2ZW50LmJpbmQodGhpcyksZSl9c3RvcFBpbmdTdGF0cygpe2NsZWFySW50ZXJ2YWwodGhpcy5waW5nU3RhdHNUaW1lb3V0KX1zZW5kUGluZ1N0YXRzRXZlbnQoZT0hMCxuKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7bGV0IHMsaTtpZih0aGlzLnByb2R1Y2luZ1RyYW5zcG9ydCYmKHM9eWllbGQgdGhpcy5tZWFzdXJlbWVudHMuZ2V0UHJvY2Vzc2VkU3RhdHModGhpcy5wcm9kdWNpbmdUcmFuc3BvcnQsITEsITApLCFzfHwhKHMhPW51bGwmJnMucHJvZHVjZXJSZXBvcnQpKSl7dGhpcy5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6c2VuZFBpbmdTdGF0c0V2ZW50OjpzdGFsZVByb2R1Y2luZ1RyYW5zcG9ydCIse2Rpc2NsYWltZXI6IlN0YWxlIHByb2R1Y2VyPyBSZWdlbmVyYXRpbmcgU3RyZWFtIE1hcHMhIn0pO2NvbnN0IGQ9eWllbGQgdGhpcy5tZWFzdXJlbWVudHMuZ2V0UHJvZHVjZXJzUmVwb3J0KFsuLi50aGlzLnByb2R1Y2Vycy52YWx1ZXMoKV0pO3MmJmQ/cy5wcm9kdWNlclJlcG9ydD1kOihzPXlpZWxkIHRoaXMubWVhc3VyZW1lbnRzLmdldFByb2Nlc3NlZFN0YXRzKHRoaXMucHJvZHVjaW5nVHJhbnNwb3J0LCExLCEwKSwoIXN8fCEocyE9bnVsbCYmcy5wcm9kdWNlclJlcG9ydCkpJiZ0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpzZW5kUGluZ1N0YXRzRXZlbnQ6Om5vUHJvZHVjaW5nVHJhbnNwb3J0UmVwb3J0Iix7ZGlzY2xhaW1lcjoiU3RyZWFtIG1hcHMgaW52YWxpZCBkZXNwaXRlIHJlZ2VuZXJhdGluZyEifSkpfWlmKHRoaXMuY29uc3VtaW5nVHJhbnNwb3J0JiYoaT15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXRQcm9jZXNzZWRTdGF0cyh0aGlzLmNvbnN1bWluZ1RyYW5zcG9ydCwhMCwhMSksIWl8fCFpLmNvbnN1bWVyUmVwb3J0KSl7dGhpcy5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6c2VuZFBpbmdTdGF0c0V2ZW50OjpzdGFsZUNvbnN1bWluZ1RyYW5zcG9ydCIse2Rpc2NsYWltZXI6IlN0YWxlIGNvbnN1bWVyPyBSZWdlbmVyYXRpbmcgU3RyZWFtIE1hcHMhIn0pO2NvbnN0IGQ9eWllbGQgdGhpcy5tZWFzdXJlbWVudHMuZ2V0Q29uc3VtZXJzUmVwb3J0KFsuLi50aGlzLmNvbnN1bWVycy52YWx1ZXMoKV0pO2kmJmQ/aS5jb25zdW1lclJlcG9ydD1kOihpPXlpZWxkIHRoaXMubWVhc3VyZW1lbnRzLmdldFByb2Nlc3NlZFN0YXRzKHRoaXMuY29uc3VtaW5nVHJhbnNwb3J0LCEwLCExKSwoIWl8fCFpLmNvbnN1bWVyUmVwb3J0KSYmdGhpcy5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6c2VuZFBpbmdTdGF0c0V2ZW50Ojpub0NvbnN1bWluZ1RyYW5zcG9ydFJlcG9ydCIse2Rpc2NsYWltZXI6IlN0cmVhbSBtYXBzIGludmFsaWQgZGVzcGl0ZSByZWdlbmVyYXRpbmchIn0pKX1jb25zdCBhPXtwcm9kdWNpbmdUcmFuc3BvcnRTdGF0czpzP3M9PW51bGw/dm9pZCAwOnMudHJhbnNwb3J0UmVwb3J0OnZvaWQgMCxjb25zdW1pbmdUcmFuc3BvcnRTdGF0czppP2k9PW51bGw/dm9pZCAwOmkudHJhbnNwb3J0UmVwb3J0OnZvaWQgMCxwcm9kdWNlclN0YXRzOltdLmNvbmNhdCgocz09bnVsbD92b2lkIDA6cy5wcm9kdWNlclJlcG9ydCl8fFtdKS5jb25jYXQoKGk9PW51bGw/dm9pZCAwOmkucHJvZHVjZXJSZXBvcnQpfHxbXSksY29uc3VtZXJTdGF0czpbXS5jb25jYXQoKGk9PW51bGw/dm9pZCAwOmkuY29uc3VtZXJSZXBvcnQpfHxbXSkuY29uY2F0KChzPT1udWxsP3ZvaWQgMDpzLmNvbnN1bWVyUmVwb3J0KXx8W10pfTtpZihlJiZhLnByb2R1Y2VyU3RhdHMubGVuZ3RoPT09MCYmYS5jb25zdW1lclN0YXRzLmxlbmd0aD09PTApe3lpZWxkIHRoaXMuZXZlbnRIYW5kbGVyLmZsdXNoKCk7cmV0dXJufXRoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5QSU5HX1NUQVQsbWV0YURhdGE6YSx0aW1lc3RhbXA6bn0pfSl9c2VuZElWU1BsYXllclJlYnVmZmVyRXZlbnQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfUkVCVUZGRVJJTkcsdGltZXN0YW1wOmV9KX1zZW5kSVZTUGxheWVyQXVkaW9CbG9ja0V2ZW50KGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5JVlNfUExBWUVSX0FVRElPX0JMT0NLRUQsdGltZXN0YW1wOmV9KX1zZW5kSVZTUGxheWVyUGxheWJhY2tCbG9ja2VkRXZlbnQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfUExBWUJBQ0tfQkxPQ0tFRCx0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJOZXR3b3JrVW5hdmFpbGFibGVFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9ORVRXT1JLX1VOQVZBSUxBQkxFLHRpbWVzdGFtcDplfSl9c2VuZElWU1BsYXllckluaXRpYWxpemVkRXZlbnQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfSU5JVElBTElaRUQsdGltZXN0YW1wOmV9KX1zZW5kSVZTUGxheWVyV29ya2VyRXJyb3JFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9XT1JLRVJfRVJST1IsdGltZXN0YW1wOmV9KX1zZW5kSVZTUGxheWVyRXJyb3JFdmVudChlLG4pe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5JVlNfUExBWUVSX0VSUk9SLHRpbWVzdGFtcDpuLG1ldGFEYXRhOmV9KX1zZW5kSVZTUGxheWVyUmVjb3ZlcmFibGVFcnJvckV2ZW50KGUsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfUkVDT1ZFUkFCTEVfRVJST1IsdGltZXN0YW1wOm4sbWV0YURhdGE6ZX0pfXNlbmRJVlNQbGF5ZXJBbmFseXRpY3NFdmVudChlLG4pe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5JVlNfUExBWUVSX0FOQUxZVElDU19FVkVOVCx0aW1lc3RhbXA6bixtZXRhRGF0YTplfSl9c2VuZElWU1BsYXllclBsYXliYWNrUmF0ZUNoYW5nZWRFdmVudChlLG4pe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5JVlNfUExBWUVSX1BMQVlCQUNLX1JBVEVfQ0hBTkdFRCx0aW1lc3RhbXA6bixtZXRhRGF0YTp7dXBkYXRlZFBsYXliYWNrUmF0ZTplfX0pfXNlbmRJVlNQbGF5ZXJRdWFsaXR5Q2hhbmdlZChlLG4pe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5JVlNfUExBWUVSX1FVQUxJVFlfQ0hBTkdFRCx0aW1lc3RhbXA6bixtZXRhRGF0YTplfSl9c2VuZFBsYXllckxpdmVMYXRlbmN5KGUsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkxJVkVTVFJFQU1fTEFURU5DWSx0aW1lc3RhbXA6bixtZXRhRGF0YTp7bGF0ZW5jeTplfX0pfXNlbmREaXNjb25uZWN0RXZlbnQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkRJU0NPTk5FQ1QsdGltZXN0YW1wOmV9KX1zZW5kUmVjb25uZWN0RXZlbnQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlJFQ09OTkVDVF9BVFRFTVBULHRpbWVzdGFtcDplfSl9ZXhwZWN0ZWRWaWRlb1Jlc29sdXRpb24oZSxuLHMpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5FWFBFQ1RFRF9WSURFT19SRVNPTFVUSU9OLHRpbWVzdGFtcDpzLG1ldGFEYXRhOntmcmFtZVdpZHRoOmUsZnJhbWVIZWlnaHQ6bn19KX1leHBlY3RlZFNjcmVlbnNoYXJlUmVzb2x1dGlvbihlLG4scyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkVYUEVDVEVEX1NDUkVFTlNIQVJFX1JFU09MVVRJT04sdGltZXN0YW1wOnMsbWV0YURhdGE6e2ZyYW1lV2lkdGg6ZSxmcmFtZUhlaWdodDpufX0pfX07UihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJyZWdpc3RlckljZVNlcnZlcnMiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwicmVnaXN0ZXJDb25zdW1lciIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJyZWdpc3RlclByb2R1Y2VyIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRDb25zdW1lclNoYXJlZE1lZGlhU3RhdGVFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJyZWdpc3RlclByb2R1Y2luZ1RyYW5zcG9ydCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJyZWdpc3RlckNvbnN1bWluZ1RyYW5zcG9ydCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJkZVJlZ2lzdGVyQ29uc3VtZXIiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwiZGVSZWdpc3RlclByb2R1Y2VyIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsImRpc2Nvbm5lY3RDb25zdW1pbmdUcmFuc3BvcnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwiZGlzY29ubmVjdFByb2R1Y2luZ1RyYW5zcG9ydCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kUHJlQ2FsbFRlc3RCZWdpbkV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRTY3JlZW5TaGFyZVRvZ2dsZUV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRTY3JlZW5TaGFyZVJlcXVlc3RlZEV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRBY3RpdmVTcGVha2VyRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwiZGV2aWNlcyIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZWxlY3RlZERldmljZSIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJtZWRpYVBlcm1pc3Npb24iLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwibWVkaWFQbGF5YmFja0ZhaWxlZCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJtZWRpYVRyYWNrTXV0ZWQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwidGFiQ2hhbmdlZCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJicm93c2VyQmFja2dyb3VuZGVkIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsImJyb3dzZXJGb3JlZ3JvdW5kZWQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwibGVnYWN5U3dpdGNoIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsImdldFByZUNhbGxUZXN0UmVzdWx0cyIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kQ2FsbEpvaW5CZWdpbkV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmROZXR3b3JrUXVhbGl0eVRlc3RCZWdpbkV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRXZWJTb2NrZXRDb25uZWN0ZWRFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kVHJhbnNwb3J0Q29ubmVjdGVkRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZEF1ZGlvVG9nZ2xlRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZFZpZGVvVG9nZ2xlRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZFBhcnRpY2lwYW50Um9sZVRvZ2dsZUV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInN0YXJ0UGluZ1N0YXRzIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInN0b3BQaW5nU3RhdHMiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZFBpbmdTdGF0c0V2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJSZWJ1ZmZlckV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJBdWRpb0Jsb2NrRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZElWU1BsYXllclBsYXliYWNrQmxvY2tlZEV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJOZXR3b3JrVW5hdmFpbGFibGVFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kSVZTUGxheWVySW5pdGlhbGl6ZWRFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kSVZTUGxheWVyV29ya2VyRXJyb3JFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kSVZTUGxheWVyRXJyb3JFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kSVZTUGxheWVyUmVjb3ZlcmFibGVFcnJvckV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJBbmFseXRpY3NFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kSVZTUGxheWVyUGxheWJhY2tSYXRlQ2hhbmdlZEV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJRdWFsaXR5Q2hhbmdlZCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kUGxheWVyTGl2ZUxhdGVuY3kiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZERpc2Nvbm5lY3RFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kUmVjb25uZWN0RXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwiZXhwZWN0ZWRWaWRlb1Jlc29sdXRpb24iLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwiZXhwZWN0ZWRTY3JlZW5zaGFyZVJlc29sdXRpb24iLG51bGwpLF89UihbQXMoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfKTt2YXIgTXM9XztjbGFzcyBGciBleHRlbmRzIHF7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3AodGhpcywic3RhdHMiKTtwKHRoaXMsInBlZXJJZCIpO3AodGhpcywiYmFja2VuZCIpO3AodGhpcywiaWNlU2VydmVycyIpO3AodGhpcywiaW5pdGlhbGl6ZWQiLCExKTtwKHRoaXMsInN0YWxsZWQiLCExKTtwKHRoaXMsImlwSW5mb3JtYXRpb24iKTtwKHRoaXMsImxvZ2dlciIpfWluaXRpYWxpemUodil7cmV0dXJuIHcodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24qKHtwZWVySWQ6ZSxlbmdpbmVOYW1lOm4sZW52OnM9Z3IuUFJPRCxpY2VTZXJ2ZXJzOmksYXBpQmFzZTphPSJodHRwczovL2FwaS5jbHVzdGVyLmR5dGUuaW4iLGZsYWdzOmQsbG9nZ2VyOm89Y29uc29sZSxhcGlIb3N0bmFtZXM6bCxza2lwQ29ubmVjdGl2aXR5Q2hlY2tzOm09ITF9KXt2YXIgRSxJLHg7dHJ5e3RoaXMucGVlcklkPWUsdGhpcy5sb2dnZXI9byx0aGlzLmlwSW5mb3JtYXRpb249eWllbGQgTXIuZ2V0SVBEZXRhaWxzKHtwZWVySWQ6ZSxhcGlIb3N0bmFtZXM6bCxsb2dnZXI6b30pLHRoaXMuYmFja2VuZD1uZXcgTXMoYSxuLHMsZCxvLGUsbCksdGhpcy5pY2VTZXJ2ZXJzPWksKEU9dGhpcy5iYWNrZW5kKT09bnVsbHx8RS5yZWdpc3RlckljZVNlcnZlcnModGhpcy5pY2VTZXJ2ZXJzKSx0aGlzLmluaXRpYWxpemVkPSEwLCh4PShJPXRoaXMuYmFja2VuZCk9PW51bGw/dm9pZCAwOkkuZXZlbnRIYW5kbGVyKT09bnVsbHx8eC5lbWl0KCJpbml0aWFsaXplZCIsdGhpcy5pcEluZm9ybWF0aW9uKSx0aGlzLmVtaXQoImluaXRpYWxpemVkIix0aGlzLmlwSW5mb3JtYXRpb24pLHRoaXMuc3RhcnRQcmVDYWxsVGVzdChtKX1jYXRjaChIKXt0aGlzLmxvZ2dlci5lcnJvcigiY2FsbFN0YXRzOjpDYWxsU3RhdHNJbnRlZ3JhdGlvbjogIix7ZXJyb3I6SH0pLHRoaXMuc3RhbGxDYWxsU3RhdHMoKX19KX1jb25maWd1cmVTZW5kVHJhbnNwb3J0KGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnJlZ2lzdGVyUHJvZHVjaW5nVHJhbnNwb3J0KGUpfSl9Y29uZmlndXJlUmVjdlRyYW5zcG9ydChlKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5yZWdpc3RlckNvbnN1bWluZ1RyYW5zcG9ydChlKX0pfWNhbmRpZGF0ZVJlZ2lvbmFsTmV0d29ya1F1YWxpdHlUZXN0KGUpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBuPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczt0cnl7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5zZW5kTmV0d29ya1F1YWxpdHlUZXN0QmVnaW5FdmVudChlLG4pfWNhdGNoKGkpe3RoaXMubG9nZ2VyLmVycm9yKCJjYWxsU3RhdHM6OnNlbmROZXR3b3JrUXVhbGl0eVRlc3RCZWdpbkV2ZW50Iix7ZXJyb3I6e3JlYXNvbjppLnJlYXNvbn19KX19KX0pfXJvb21Kb2luZWQoZSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IG49bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzLGk7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5zZW5kQ2FsbEpvaW5CZWdpbkV2ZW50KGUsbiksdGhpcy5iYWNrZW5kLChpPXRoaXMuYmFja2VuZCk9PW51bGx8fGkuc3RhcnRQaW5nU3RhdHMoKX0pfSl9YXVkaW9PZmYoKXtjb25zdCBlPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmRBdWRpb1RvZ2dsZUV2ZW50KCExLGUpfSl9YXVkaW9Pbigpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uc2VuZEF1ZGlvVG9nZ2xlRXZlbnQoITAsZSl9KX12aWRlb09mZigpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uc2VuZFZpZGVvVG9nZ2xlRXZlbnQoITEsZSl9KX12aWRlb09uKCl7Y29uc3QgZT1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kVmlkZW9Ub2dnbGVFdmVudCghMCxlKX0pfWNhbGxFbmRlZCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuLHM7KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zdG9wUGluZ1N0YXRzKCksKHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5zZW5kRGlzY29ubmVjdEV2ZW50KGUpfSl9c2NyZWVuU2hhcmVTdGFydChlKXtjb25zdCBuPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLnNlbmRTY3JlZW5TaGFyZVRvZ2dsZUV2ZW50KCEwLGUsbil9KX1jb25zdW1lclNoYXJlZE1lZGlhU3RhdGUoZSxuKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5zZW5kQ29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlRXZlbnQoZSxuKX0pfXNjcmVlblNoYXJlU3RvcChlKXtjb25zdCBuPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLnNlbmRTY3JlZW5TaGFyZVRvZ2dsZUV2ZW50KCExLGUsbil9KX1zY3JlZW5TaGFyZVJlcXVlc3RlZCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uc2VuZFNjcmVlblNoYXJlUmVxdWVzdGVkRXZlbnQoZSl9KX1hY3RpdmVTcGVha2VyKGUpe2lmKGUhPT10aGlzLnBlZXJJZClyZXR1cm47Y29uc3Qgbj1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5zZW5kQWN0aXZlU3BlYWtlckV2ZW50KGUsbil9KX1kZXZpY2VzKGUsbil7Y29uc3Qgcz1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIGk7KGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5kZXZpY2VzKGUsbixzKX0pfXNlbGVjdGVkRGV2aWNlKGUsbil7Y29uc3Qgcz1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIGk7KGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5zZWxlY3RlZERldmljZShlLG4scyl9KX1tZWRpYVBlcm1pc3Npb24oZSxuKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgaTsoaT10aGlzLmJhY2tlbmQpPT1udWxsfHxpLm1lZGlhUGVybWlzc2lvbihlLG4scyl9KX1tZWRpYVBsYXliYWNrRmFpbGVkKGUpe2NvbnN0IG49bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMubWVkaWFQbGF5YmFja0ZhaWxlZChlLG4pfSl9bWVkaWFUcmFja011dGVkKGUpe2NvbnN0IG49bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMubWVkaWFUcmFja011dGVkKGUsbil9KX10YWJDaGFuZ2VkKGU9ITEpe2NvbnN0IG49bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMudGFiQ2hhbmdlZChlLG4pfSl9YnJvd3NlckJhY2tncm91bmRlZCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uYnJvd3NlckJhY2tncm91bmRlZChlKX0pfWJyb3dzZXJGb3JlZ3JvdW5kZWQoKXtjb25zdCBlPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLmJyb3dzZXJGb3JlZ3JvdW5kZWQoZSl9KX1sZWdhY3lTd2l0Y2goZSl7Y29uc3Qgbj1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5sZWdhY3lTd2l0Y2goZSxuKX0pfXN0YXJ0UHJlQ2FsbFRlc3QoZT0hMSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IG49bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuc2VuZFByZUNhbGxUZXN0QmVnaW5FdmVudChlLG4pfSl9KX1vblByZUNhbGxUZXN0UmVzdWx0cyhlKXtyZXR1cm4gdGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uZXZlbnRIYW5kbGVyLm9uY2UoInByZWNhbGxfZW5kIixlKX0pLGV9b25SZWNlaXZpbmdDb25zdW1lckF1ZGlvU3RhdHVzKGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLmV2ZW50SGFuZGxlci5vbigiY29uc3VtZXJfYXVkaW9fc3RhdHVzIixlKX0pfW9uUmVjZWl2aW5nQ29uc3VtZXJWaWRlb1N0YXR1cyhlKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5ldmVudEhhbmRsZXIub24oImNvbnN1bWVyX3ZpZGVvX3N0YXR1cyIsZSl9KX1vblJlY2VpdmluZ1Byb2R1Y2VyQXVkaW9TdGF0dXMoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uZXZlbnRIYW5kbGVyLm9uKCJwcm9kdWNlcl9hdWRpb19zdGF0dXMiLGUpfSl9b25SZWNlaXZpbmdQcm9kdWNlclZpZGVvU3RhdHVzKGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLmV2ZW50SGFuZGxlci5vbigicHJvZHVjZXJfdmlkZW9fc3RhdHVzIixlKX0pfW9uUmVjZWl2aW5nUHJvZHVjaW5nVHJhbnNwb3J0U3RhdHVzKGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLmV2ZW50SGFuZGxlci5vbigicHJvZHVjaW5nX3RyYW5zcG9ydF9zdGF0dXMiLGUpfSl9b25SZWNlaXZpbmdDb25zdW1pbmdUcmFuc3BvcnRTdGF0dXMoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uZXZlbnRIYW5kbGVyLm9uKCJjb25zdW1pbmdfdHJhbnNwb3J0X3N0YXR1cyIsZSl9KX1vblByb2R1Y2VyU2NvcmUoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uZXZlbnRIYW5kbGVyLm9uKCJwcm9kdWNlcl9zY29yZSIsZSl9KX1vbkNvbnN1bWVyU2NvcmUoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uZXZlbnRIYW5kbGVyLm9uKCJjb25zdW1lcl9zY29yZSIsZSl9KX1vblNhZmVJbml0aWFsaXphdGlvbihlKXtpZih0aGlzLmluaXRpYWxpemVkKWUodGhpcy5pcEluZm9ybWF0aW9uLCExKTtlbHNlIGlmKCF0aGlzLnN0YWxsZWQpe2NvbnN0IG49cz0+e2UocywhMCl9O3JldHVybiB0aGlzLm9uY2UoImluaXRpYWxpemVkIixuKSxufXJldHVybigpPT57fX1yZW1vdmVJbml0aWFsaXphdGlvbkxpc3RlbmVyKGUpe3RoaXMucmVtb3ZlTGlzdGVuZXIoImluaXRpYWxpemVkIixlKX1zdGFsbENhbGxTdGF0cygpe3RoaXMuc3RhbGxlZD0hMCx0aGlzLnJlbW92ZUFsbExpc3RlbmVycygiaW5pdGlhbGl6ZWQiKX1pdnNQbGF5ZXJFdmVudChlLG4pe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBpLGEsZCxvLGwsbSx2LEUsSSx4LEg7c3dpdGNoKGUpe2Nhc2UiUGxheWVyUmVidWZmZXJpbmciOihpPXRoaXMuYmFja2VuZCk9PW51bGx8fGkuc2VuZElWU1BsYXllclJlYnVmZmVyRXZlbnQocyk7YnJlYWs7Y2FzZSJQbGF5ZXJBdWRpb0Jsb2NrZWQiOihhPXRoaXMuYmFja2VuZCk9PW51bGx8fGEuc2VuZElWU1BsYXllckF1ZGlvQmxvY2tFdmVudChzKTticmVhaztjYXNlIlBsYXllclBsYXliYWNrQmxvY2tlZCI6KGQ9dGhpcy5iYWNrZW5kKT09bnVsbHx8ZC5zZW5kSVZTUGxheWVyUGxheWJhY2tCbG9ja2VkRXZlbnQocyk7YnJlYWs7Y2FzZSJQbGF5ZXJOZXR3b3JrVW5hdmFpbGFibGUiOihvPXRoaXMuYmFja2VuZCk9PW51bGx8fG8uc2VuZElWU1BsYXllck5ldHdvcmtVbmF2YWlsYWJsZUV2ZW50KHMpO2JyZWFrO2Nhc2UiUGxheWVySW5pdGlhbGl6ZWQiOihsPXRoaXMuYmFja2VuZCk9PW51bGx8fGwuc2VuZElWU1BsYXllckluaXRpYWxpemVkRXZlbnQocyk7YnJlYWs7Y2FzZSJQbGF5ZXJXb3JrZXJFcnJvciI6KG09dGhpcy5iYWNrZW5kKT09bnVsbHx8bS5zZW5kSVZTUGxheWVyV29ya2VyRXJyb3JFdmVudChzKTticmVhaztjYXNlIlBsYXllckVycm9yIjoodj10aGlzLmJhY2tlbmQpPT1udWxsfHx2LnNlbmRJVlNQbGF5ZXJFcnJvckV2ZW50KG4scyk7YnJlYWs7Y2FzZSJQbGF5ZXJSZWNvdmVyYWJsZUVycm9yIjooRT10aGlzLmJhY2tlbmQpPT1udWxsfHxFLnNlbmRJVlNQbGF5ZXJSZWNvdmVyYWJsZUVycm9yRXZlbnQobixzKTticmVhaztjYXNlIlBsYXllckFuYWx5dGljc0V2ZW50IjooST10aGlzLmJhY2tlbmQpPT1udWxsfHxJLnNlbmRJVlNQbGF5ZXJBbmFseXRpY3NFdmVudChuLHMpO2JyZWFrO2Nhc2UiUGxheWVyUGxheWJhY2tSYXRlQ2hhbmdlZCI6KHg9dGhpcy5iYWNrZW5kKT09bnVsbHx8eC5zZW5kSVZTUGxheWVyUGxheWJhY2tSYXRlQ2hhbmdlZEV2ZW50KG4scyk7YnJlYWs7Y2FzZSJQbGF5ZXJRdWFsaXR5Q2hhbmdlZCI6KEg9dGhpcy5iYWNrZW5kKT09bnVsbHx8SC5zZW5kSVZTUGxheWVyUXVhbGl0eUNoYW5nZWQobixzKTticmVha319KX1saXZlc3RyZWFtTGF0ZW5jeShlKXtjb25zdCBuPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLnNlbmRQbGF5ZXJMaXZlTGF0ZW5jeShlLG4pfSl9ZXhwZWN0ZWRWaWRlb1Jlc29sdXRpb24oZSxuKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgaTsoaT10aGlzLmJhY2tlbmQpPT1udWxsfHxpLmV4cGVjdGVkVmlkZW9SZXNvbHV0aW9uKGUsbixzKX0pfWV4cGVjdGVkU2NyZWVuc2hhcmVSZXNvbHV0aW9uKGUsbil7Y29uc3Qgcz1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIGk7KGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5leHBlY3RlZFNjcmVlbnNoYXJlUmVzb2x1dGlvbihlLG4scyl9KX19bmV3IEZyKCkuc2V0TWF4TGlzdGVuZXJzKDMwKTtmdW5jdGlvbiBrcygpe3RoaXMuX19kYXRhX189W10sdGhpcy5zaXplPTB9ZnVuY3Rpb24gQnIodCxyKXtyZXR1cm4gdD09PXJ8fHQhPT10JiZyIT09cn1mdW5jdGlvbiBndCh0LHIpe2Zvcih2YXIgZT10Lmxlbmd0aDtlLS07KWlmKEJyKHRbZV1bMF0scikpcmV0dXJuIGU7cmV0dXJuLTF9dmFyIE9zPUFycmF5LnByb3RvdHlwZSxMcz1Pcy5zcGxpY2U7ZnVuY3Rpb24gRHModCl7dmFyIHI9dGhpcy5fX2RhdGFfXyxlPWd0KHIsdCk7aWYoZTwwKXJldHVybiExO3ZhciBuPXIubGVuZ3RoLTE7cmV0dXJuIGU9PW4/ci5wb3AoKTpMcy5jYWxsKHIsZSwxKSwtLXRoaXMuc2l6ZSwhMH1mdW5jdGlvbiBOcyh0KXt2YXIgcj10aGlzLl9fZGF0YV9fLGU9Z3Qocix0KTtyZXR1cm4gZTwwP3ZvaWQgMDpyW2VdWzFdfWZ1bmN0aW9uIFZzKHQpe3JldHVybiBndCh0aGlzLl9fZGF0YV9fLHQpPi0xfWZ1bmN0aW9uIEZzKHQscil7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPWd0KGUsdCk7cmV0dXJuIG48MD8oKyt0aGlzLnNpemUsZS5wdXNoKFt0LHJdKSk6ZVtuXVsxXT1yLHRoaXN9ZnVuY3Rpb24gbmUodCl7dmFyIHI9LTEsZT10PT1udWxsPzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK3I8ZTspe3ZhciBuPXRbcl07dGhpcy5zZXQoblswXSxuWzFdKX19bmUucHJvdG90eXBlLmNsZWFyPWtzLG5lLnByb3RvdHlwZS5kZWxldGU9RHMsbmUucHJvdG90eXBlLmdldD1OcyxuZS5wcm90b3R5cGUuaGFzPVZzLG5lLnByb3RvdHlwZS5zZXQ9RnM7ZnVuY3Rpb24gQnMoKXt0aGlzLl9fZGF0YV9fPW5ldyBuZSx0aGlzLnNpemU9MH1mdW5jdGlvbiB4cyh0KXt2YXIgcj10aGlzLl9fZGF0YV9fLGU9ci5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZT1yLnNpemUsZX1mdW5jdGlvbiBqcyh0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQodCl9ZnVuY3Rpb24gVXModCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfXZhciBIcz10eXBlb2YgZ2xvYmFsPT0ib2JqZWN0IiYmZ2xvYmFsJiZnbG9iYWwuT2JqZWN0PT09T2JqZWN0JiZnbG9iYWwseHI9SHMsS3M9dHlwZW9mIHNlbGY9PSJvYmplY3QiJiZzZWxmJiZzZWxmLk9iamVjdD09PU9iamVjdCYmc2VsZiwkcz14cnx8S3N8fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCksWD0kcyxXcz1YLlN5bWJvbCxFZT1Xcyxqcj1PYmplY3QucHJvdG90eXBlLHpzPWpyLmhhc093blByb3BlcnR5LEdzPWpyLnRvU3RyaW5nLEllPUVlP0VlLnRvU3RyaW5nVGFnOnZvaWQgMDtmdW5jdGlvbiBxcyh0KXt2YXIgcj16cy5jYWxsKHQsSWUpLGU9dFtJZV07dHJ5e3RbSWVdPXZvaWQgMDt2YXIgbj0hMH1jYXRjaChpKXt9dmFyIHM9R3MuY2FsbCh0KTtyZXR1cm4gbiYmKHI/dFtJZV09ZTpkZWxldGUgdFtJZV0pLHN9dmFyIFlzPU9iamVjdC5wcm90b3R5cGUsUXM9WXMudG9TdHJpbmc7ZnVuY3Rpb24gSnModCl7cmV0dXJuIFFzLmNhbGwodCl9dmFyIFhzPSJbb2JqZWN0IE51bGxdIixacz0iW29iamVjdCBVbmRlZmluZWRdIixVcj1FZT9FZS50b1N0cmluZ1RhZzp2b2lkIDA7ZnVuY3Rpb24gQWUodCl7cmV0dXJuIHQ9PW51bGw/dD09PXZvaWQgMD9aczpYczpVciYmVXIgaW4gT2JqZWN0KHQpP3FzKHQpOkpzKHQpfWZ1bmN0aW9uIE1lKHQpe3ZhciByPXR5cGVvZiB0O3JldHVybiB0IT1udWxsJiYocj09Im9iamVjdCJ8fHI9PSJmdW5jdGlvbiIpfXZhciBlaT0iW29iamVjdCBBc3luY0Z1bmN0aW9uXSIsdGk9IltvYmplY3QgRnVuY3Rpb25dIixyaT0iW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iLG5pPSJbb2JqZWN0IFByb3h5XSI7ZnVuY3Rpb24gSHIodCl7aWYoIU1lKHQpKXJldHVybiExO3ZhciByPUFlKHQpO3JldHVybiByPT10aXx8cj09cml8fHI9PWVpfHxyPT1uaX12YXIgc2k9WFsiX19jb3JlLWpzX3NoYXJlZF9fIl0sT3Q9c2ksS3I9ZnVuY3Rpb24oKXt2YXIgdD0vW14uXSskLy5leGVjKE90JiZPdC5rZXlzJiZPdC5rZXlzLklFX1BST1RPfHwiIik7cmV0dXJuIHQ/IlN5bWJvbChzcmMpXzEuIit0OiIifSgpO2Z1bmN0aW9uIGlpKHQpe3JldHVybiEhS3ImJktyIGluIHR9dmFyIGFpPUZ1bmN0aW9uLnByb3RvdHlwZSxvaT1haS50b1N0cmluZztmdW5jdGlvbiBsZSh0KXtpZih0IT1udWxsKXt0cnl7cmV0dXJuIG9pLmNhbGwodCl9Y2F0Y2gocil7fXRyeXtyZXR1cm4gdCsiIn1jYXRjaChyKXt9fXJldHVybiIifXZhciBjaT0vW1xcXiQuKis/KClbXF17fXxdL2csZGk9L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8sbGk9RnVuY3Rpb24ucHJvdG90eXBlLHVpPU9iamVjdC5wcm90b3R5cGUscGk9bGkudG9TdHJpbmcsaGk9dWkuaGFzT3duUHJvcGVydHksZmk9UmVnRXhwKCJeIitwaS5jYWxsKGhpKS5yZXBsYWNlKGNpLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO2Z1bmN0aW9uIG1pKHQpe2lmKCFNZSh0KXx8aWkodCkpcmV0dXJuITE7dmFyIHI9SHIodCk/Zmk6ZGk7cmV0dXJuIHIudGVzdChsZSh0KSl9ZnVuY3Rpb24gZ2kodCxyKXtyZXR1cm4gdD09bnVsbD92b2lkIDA6dFtyXX1mdW5jdGlvbiB1ZSh0LHIpe3ZhciBlPWdpKHQscik7cmV0dXJuIG1pKGUpP2U6dm9pZCAwfXZhciBTaT11ZShYLCJNYXAiKSxrZT1TaSx2aT11ZShPYmplY3QsImNyZWF0ZSIpLE9lPXZpO2Z1bmN0aW9uIHlpKCl7dGhpcy5fX2RhdGFfXz1PZT9PZShudWxsKTp7fSx0aGlzLnNpemU9MH1mdW5jdGlvbiBiaSh0KXt2YXIgcj10aGlzLmhhcyh0KSYmZGVsZXRlIHRoaXMuX19kYXRhX19bdF07cmV0dXJuIHRoaXMuc2l6ZS09cj8xOjAscn12YXIgRWk9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iLF9pPU9iamVjdC5wcm90b3R5cGUsVGk9X2kuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gUmkodCl7dmFyIHI9dGhpcy5fX2RhdGFfXztpZihPZSl7dmFyIGU9clt0XTtyZXR1cm4gZT09PUVpP3ZvaWQgMDplfXJldHVybiBUaS5jYWxsKHIsdCk/clt0XTp2b2lkIDB9dmFyIFBpPU9iamVjdC5wcm90b3R5cGUsQ2k9UGkuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gd2kodCl7dmFyIHI9dGhpcy5fX2RhdGFfXztyZXR1cm4gT2U/clt0XSE9PXZvaWQgMDpDaS5jYWxsKHIsdCl9dmFyIElpPSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjtmdW5jdGlvbiBBaSh0LHIpe3ZhciBlPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLGVbdF09T2UmJnI9PT12b2lkIDA/SWk6cix0aGlzfWZ1bmN0aW9uIHBlKHQpe3ZhciByPS0xLGU9dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytyPGU7KXt2YXIgbj10W3JdO3RoaXMuc2V0KG5bMF0sblsxXSl9fXBlLnByb3RvdHlwZS5jbGVhcj15aSxwZS5wcm90b3R5cGUuZGVsZXRlPWJpLHBlLnByb3RvdHlwZS5nZXQ9UmkscGUucHJvdG90eXBlLmhhcz13aSxwZS5wcm90b3R5cGUuc2V0PUFpO2Z1bmN0aW9uIE1pKCl7dGhpcy5zaXplPTAsdGhpcy5fX2RhdGFfXz17aGFzaDpuZXcgcGUsbWFwOm5ldyhrZXx8bmUpLHN0cmluZzpuZXcgcGV9fWZ1bmN0aW9uIGtpKHQpe3ZhciByPXR5cGVvZiB0O3JldHVybiByPT0ic3RyaW5nInx8cj09Im51bWJlciJ8fHI9PSJzeW1ib2wifHxyPT0iYm9vbGVhbiI/dCE9PSJfX3Byb3RvX18iOnQ9PT1udWxsfWZ1bmN0aW9uIFN0KHQscil7dmFyIGU9dC5fX2RhdGFfXztyZXR1cm4ga2kocik/ZVt0eXBlb2Ygcj09InN0cmluZyI/InN0cmluZyI6Imhhc2giXTplLm1hcH1mdW5jdGlvbiBPaSh0KXt2YXIgcj1TdCh0aGlzLHQpLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplLT1yPzE6MCxyfWZ1bmN0aW9uIExpKHQpe3JldHVybiBTdCh0aGlzLHQpLmdldCh0KX1mdW5jdGlvbiBEaSh0KXtyZXR1cm4gU3QodGhpcyx0KS5oYXModCl9ZnVuY3Rpb24gTmkodCxyKXt2YXIgZT1TdCh0aGlzLHQpLG49ZS5zaXplO3JldHVybiBlLnNldCh0LHIpLHRoaXMuc2l6ZSs9ZS5zaXplPT1uPzA6MSx0aGlzfWZ1bmN0aW9uIF9lKHQpe3ZhciByPS0xLGU9dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytyPGU7KXt2YXIgbj10W3JdO3RoaXMuc2V0KG5bMF0sblsxXSl9fV9lLnByb3RvdHlwZS5jbGVhcj1NaSxfZS5wcm90b3R5cGUuZGVsZXRlPU9pLF9lLnByb3RvdHlwZS5nZXQ9TGksX2UucHJvdG90eXBlLmhhcz1EaSxfZS5wcm90b3R5cGUuc2V0PU5pO3ZhciBWaT0yMDA7ZnVuY3Rpb24gRmkodCxyKXt2YXIgZT10aGlzLl9fZGF0YV9fO2lmKGUgaW5zdGFuY2VvZiBuZSl7dmFyIG49ZS5fX2RhdGFfXztpZigha2V8fG4ubGVuZ3RoPFZpLTEpcmV0dXJuIG4ucHVzaChbdCxyXSksdGhpcy5zaXplPSsrZS5zaXplLHRoaXM7ZT10aGlzLl9fZGF0YV9fPW5ldyBfZShuKX1yZXR1cm4gZS5zZXQodCxyKSx0aGlzLnNpemU9ZS5zaXplLHRoaXN9ZnVuY3Rpb24gVGUodCl7dmFyIHI9dGhpcy5fX2RhdGFfXz1uZXcgbmUodCk7dGhpcy5zaXplPXIuc2l6ZX1UZS5wcm90b3R5cGUuY2xlYXI9QnMsVGUucHJvdG90eXBlLmRlbGV0ZT14cyxUZS5wcm90b3R5cGUuZ2V0PWpzLFRlLnByb3RvdHlwZS5oYXM9VXMsVGUucHJvdG90eXBlLnNldD1GaTtmdW5jdGlvbiBCaSh0LHIpe2Zvcih2YXIgZT0tMSxuPXQ9PW51bGw/MDp0Lmxlbmd0aDsrK2U8biYmcih0W2VdLGUsdCkhPT0hMTspO3JldHVybiB0fXZhciB4aT1mdW5jdGlvbigpe3RyeXt2YXIgdD11ZShPYmplY3QsImRlZmluZVByb3BlcnR5Iik7cmV0dXJuIHQoe30sIiIse30pLHR9Y2F0Y2gocil7fX0oKSwkcj14aTtmdW5jdGlvbiBXcih0LHIsZSl7cj09Il9fcHJvdG9fXyImJiRyPyRyKHQscix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6ZSx3cml0YWJsZTohMH0pOnRbcl09ZX12YXIgamk9T2JqZWN0LnByb3RvdHlwZSxVaT1qaS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiB6cih0LHIsZSl7dmFyIG49dFtyXTsoIShVaS5jYWxsKHQscikmJkJyKG4sZSkpfHxlPT09dm9pZCAwJiYhKHIgaW4gdCkpJiZXcih0LHIsZSl9ZnVuY3Rpb24gdnQodCxyLGUsbil7dmFyIHM9IWU7ZXx8KGU9e30pO2Zvcih2YXIgaT0tMSxhPXIubGVuZ3RoOysraTxhOyl7dmFyIGQ9cltpXSxvPW4/bihlW2RdLHRbZF0sZCxlLHQpOnZvaWQgMDtvPT09dm9pZCAwJiYobz10W2RdKSxzP1dyKGUsZCxvKTp6cihlLGQsbyl9cmV0dXJuIGV9ZnVuY3Rpb24gSGkodCxyKXtmb3IodmFyIGU9LTEsbj1BcnJheSh0KTsrK2U8dDspbltlXT1yKGUpO3JldHVybiBufWZ1bmN0aW9uIExlKHQpe3JldHVybiB0IT1udWxsJiZ0eXBlb2YgdD09Im9iamVjdCJ9dmFyIEtpPSJbb2JqZWN0IEFyZ3VtZW50c10iO2Z1bmN0aW9uIEdyKHQpe3JldHVybiBMZSh0KSYmQWUodCk9PUtpfXZhciBxcj1PYmplY3QucHJvdG90eXBlLCRpPXFyLmhhc093blByb3BlcnR5LFdpPXFyLnByb3BlcnR5SXNFbnVtZXJhYmxlLHppPUdyKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk/R3I6ZnVuY3Rpb24odCl7cmV0dXJuIExlKHQpJiYkaS5jYWxsKHQsImNhbGxlZSIpJiYhV2kuY2FsbCh0LCJjYWxsZWUiKX0sWXI9emksR2k9QXJyYXkuaXNBcnJheSx5dD1HaTtmdW5jdGlvbiBxaSgpe3JldHVybiExfXZhciBRcj10eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzLEpyPVFyJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IiYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGUsWWk9SnImJkpyLmV4cG9ydHM9PT1RcixYcj1ZaT9YLkJ1ZmZlcjp2b2lkIDAsUWk9WHI/WHIuaXNCdWZmZXI6dm9pZCAwLEppPVFpfHxxaSxMdD1KaSxYaT05MDA3MTk5MjU0NzQwOTkxLFppPS9eKD86MHxbMS05XVxkKikkLztmdW5jdGlvbiBlYSh0LHIpe3ZhciBlPXR5cGVvZiB0O3JldHVybiByPXI9PW51bGw/WGk6ciwhIXImJihlPT0ibnVtYmVyInx8ZSE9InN5bWJvbCImJlppLnRlc3QodCkpJiZ0Pi0xJiZ0JTE9PTAmJnQ8cn12YXIgdGE9OTAwNzE5OTI1NDc0MDk5MTtmdW5jdGlvbiBacih0KXtyZXR1cm4gdHlwZW9mIHQ9PSJudW1iZXIiJiZ0Pi0xJiZ0JTE9PTAmJnQ8PXRhfXZhciByYT0iW29iamVjdCBBcmd1bWVudHNdIixuYT0iW29iamVjdCBBcnJheV0iLHNhPSJbb2JqZWN0IEJvb2xlYW5dIixpYT0iW29iamVjdCBEYXRlXSIsYWE9IltvYmplY3QgRXJyb3JdIixvYT0iW29iamVjdCBGdW5jdGlvbl0iLGNhPSJbb2JqZWN0IE1hcF0iLGRhPSJbb2JqZWN0IE51bWJlcl0iLGxhPSJbb2JqZWN0IE9iamVjdF0iLHVhPSJbb2JqZWN0IFJlZ0V4cF0iLHBhPSJbb2JqZWN0IFNldF0iLGhhPSJbb2JqZWN0IFN0cmluZ10iLGZhPSJbb2JqZWN0IFdlYWtNYXBdIixtYT0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLGdhPSJbb2JqZWN0IERhdGFWaWV3XSIsU2E9IltvYmplY3QgRmxvYXQzMkFycmF5XSIsdmE9IltvYmplY3QgRmxvYXQ2NEFycmF5XSIseWE9IltvYmplY3QgSW50OEFycmF5XSIsYmE9IltvYmplY3QgSW50MTZBcnJheV0iLEVhPSJbb2JqZWN0IEludDMyQXJyYXldIixfYT0iW29iamVjdCBVaW50OEFycmF5XSIsVGE9IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIixSYT0iW29iamVjdCBVaW50MTZBcnJheV0iLFBhPSJbb2JqZWN0IFVpbnQzMkFycmF5XSIsQj17fTtCW1NhXT1CW3ZhXT1CW3lhXT1CW2JhXT1CW0VhXT1CW19hXT1CW1RhXT1CW1JhXT1CW1BhXT0hMCxCW3JhXT1CW25hXT1CW21hXT1CW3NhXT1CW2dhXT1CW2lhXT1CW2FhXT1CW29hXT1CW2NhXT1CW2RhXT1CW2xhXT1CW3VhXT1CW3BhXT1CW2hhXT1CW2ZhXT0hMTtmdW5jdGlvbiBDYSh0KXtyZXR1cm4gTGUodCkmJlpyKHQubGVuZ3RoKSYmISFCW0FlKHQpXX1mdW5jdGlvbiBEdCh0KXtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIHQocil9fXZhciBlbj10eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzLERlPWVuJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IiYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGUsd2E9RGUmJkRlLmV4cG9ydHM9PT1lbixOdD13YSYmeHIucHJvY2VzcyxJYT1mdW5jdGlvbigpe3RyeXt2YXIgdD1EZSYmRGUucmVxdWlyZSYmRGUucmVxdWlyZSgidXRpbCIpLnR5cGVzO3JldHVybiB0fHxOdCYmTnQuYmluZGluZyYmTnQuYmluZGluZygidXRpbCIpfWNhdGNoKHIpe319KCksUmU9SWEsdG49UmUmJlJlLmlzVHlwZWRBcnJheSxBYT10bj9EdCh0bik6Q2Escm49QWEsTWE9T2JqZWN0LnByb3RvdHlwZSxrYT1NYS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBubih0LHIpe3ZhciBlPXl0KHQpLG49IWUmJllyKHQpLHM9IWUmJiFuJiZMdCh0KSxpPSFlJiYhbiYmIXMmJnJuKHQpLGE9ZXx8bnx8c3x8aSxkPWE/SGkodC5sZW5ndGgsU3RyaW5nKTpbXSxvPWQubGVuZ3RoO2Zvcih2YXIgbCBpbiB0KShyfHxrYS5jYWxsKHQsbCkpJiYhKGEmJihsPT0ibGVuZ3RoInx8cyYmKGw9PSJvZmZzZXQifHxsPT0icGFyZW50Iil8fGkmJihsPT0iYnVmZmVyInx8bD09ImJ5dGVMZW5ndGgifHxsPT0iYnl0ZU9mZnNldCIpfHxlYShsLG8pKSkmJmQucHVzaChsKTtyZXR1cm4gZH12YXIgT2E9T2JqZWN0LnByb3RvdHlwZTtmdW5jdGlvbiBidCh0KXt2YXIgcj10JiZ0LmNvbnN0cnVjdG9yLGU9dHlwZW9mIHI9PSJmdW5jdGlvbiImJnIucHJvdG90eXBlfHxPYTtyZXR1cm4gdD09PWV9ZnVuY3Rpb24gc24odCxyKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQocihlKSl9fXZhciBMYT1zbihPYmplY3Qua2V5cyxPYmplY3QpLERhPUxhLE5hPU9iamVjdC5wcm90b3R5cGUsVmE9TmEuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gYW4odCl7aWYoIWJ0KHQpKXJldHVybiBEYSh0KTt2YXIgcj1bXTtmb3IodmFyIGUgaW4gT2JqZWN0KHQpKVZhLmNhbGwodCxlKSYmZSE9ImNvbnN0cnVjdG9yIiYmci5wdXNoKGUpO3JldHVybiByfWZ1bmN0aW9uIFZ0KHQpe3JldHVybiB0IT1udWxsJiZacih0Lmxlbmd0aCkmJiFIcih0KX1mdW5jdGlvbiBGdCh0KXtyZXR1cm4gVnQodCk/bm4odCk6YW4odCl9ZnVuY3Rpb24gRmEodCxyKXtyZXR1cm4gdCYmdnQocixGdChyKSx0KX1mdW5jdGlvbiBCYSh0KXt2YXIgcj1bXTtpZih0IT1udWxsKWZvcih2YXIgZSBpbiBPYmplY3QodCkpci5wdXNoKGUpO3JldHVybiByfXZhciB4YT1PYmplY3QucHJvdG90eXBlLGphPXhhLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIFVhKHQpe2lmKCFNZSh0KSlyZXR1cm4gQmEodCk7dmFyIHI9YnQodCksZT1bXTtmb3IodmFyIG4gaW4gdCluPT0iY29uc3RydWN0b3IiJiYocnx8IWphLmNhbGwodCxuKSl8fGUucHVzaChuKTtyZXR1cm4gZX1mdW5jdGlvbiBCdCh0KXtyZXR1cm4gVnQodCk/bm4odCwhMCk6VWEodCl9ZnVuY3Rpb24gSGEodCxyKXtyZXR1cm4gdCYmdnQocixCdChyKSx0KX12YXIgb249dHlwZW9mIGV4cG9ydHM9PSJvYmplY3QiJiZleHBvcnRzJiYhZXhwb3J0cy5ub2RlVHlwZSYmZXhwb3J0cyxjbj1vbiYmdHlwZW9mIG1vZHVsZT09Im9iamVjdCImJm1vZHVsZSYmIW1vZHVsZS5ub2RlVHlwZSYmbW9kdWxlLEthPWNuJiZjbi5leHBvcnRzPT09b24sZG49S2E/WC5CdWZmZXI6dm9pZCAwLGxuPWRuP2RuLmFsbG9jVW5zYWZlOnZvaWQgMDtmdW5jdGlvbiAkYSh0LHIpe2lmKHIpcmV0dXJuIHQuc2xpY2UoKTt2YXIgZT10Lmxlbmd0aCxuPWxuP2xuKGUpOm5ldyB0LmNvbnN0cnVjdG9yKGUpO3JldHVybiB0LmNvcHkobiksbn1mdW5jdGlvbiBXYSh0LHIpe3ZhciBlPS0xLG49dC5sZW5ndGg7Zm9yKHJ8fChyPUFycmF5KG4pKTsrK2U8bjspcltlXT10W2VdO3JldHVybiByfWZ1bmN0aW9uIHphKHQscil7Zm9yKHZhciBlPS0xLG49dD09bnVsbD8wOnQubGVuZ3RoLHM9MCxpPVtdOysrZTxuOyl7dmFyIGE9dFtlXTtyKGEsZSx0KSYmKGlbcysrXT1hKX1yZXR1cm4gaX1mdW5jdGlvbiB1bigpe3JldHVybltdfXZhciBHYT1PYmplY3QucHJvdG90eXBlLHFhPUdhLnByb3BlcnR5SXNFbnVtZXJhYmxlLHBuPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsWWE9cG4/ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PW51bGw/W106KHQ9T2JqZWN0KHQpLHphKHBuKHQpLGZ1bmN0aW9uKHIpe3JldHVybiBxYS5jYWxsKHQscil9KSl9OnVuLHh0PVlhO2Z1bmN0aW9uIFFhKHQscil7cmV0dXJuIHZ0KHQseHQodCkscil9ZnVuY3Rpb24gaG4odCxyKXtmb3IodmFyIGU9LTEsbj1yLmxlbmd0aCxzPXQubGVuZ3RoOysrZTxuOyl0W3MrZV09cltlXTtyZXR1cm4gdH12YXIgSmE9c24oT2JqZWN0LmdldFByb3RvdHlwZU9mLE9iamVjdCksZm49SmEsWGE9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxaYT1YYT9mdW5jdGlvbih0KXtmb3IodmFyIHI9W107dDspaG4ocix4dCh0KSksdD1mbih0KTtyZXR1cm4gcn06dW4sbW49WmE7ZnVuY3Rpb24gZW8odCxyKXtyZXR1cm4gdnQodCxtbih0KSxyKX1mdW5jdGlvbiBnbih0LHIsZSl7dmFyIG49cih0KTtyZXR1cm4geXQodCk/bjpobihuLGUodCkpfWZ1bmN0aW9uIHRvKHQpe3JldHVybiBnbih0LEZ0LHh0KX1mdW5jdGlvbiBybyh0KXtyZXR1cm4gZ24odCxCdCxtbil9dmFyIG5vPXVlKFgsIkRhdGFWaWV3IiksanQ9bm8sc289dWUoWCwiUHJvbWlzZSIpLFV0PXNvLGlvPXVlKFgsIlNldCIpLEh0PWlvLGFvPXVlKFgsIldlYWtNYXAiKSxLdD1hbyxTbj0iW29iamVjdCBNYXBdIixvbz0iW29iamVjdCBPYmplY3RdIix2bj0iW29iamVjdCBQcm9taXNlXSIseW49IltvYmplY3QgU2V0XSIsYm49IltvYmplY3QgV2Vha01hcF0iLEVuPSJbb2JqZWN0IERhdGFWaWV3XSIsY289bGUoanQpLGxvPWxlKGtlKSx1bz1sZShVdCkscG89bGUoSHQpLGhvPWxlKEt0KSxoZT1BZTsoanQmJmhlKG5ldyBqdChuZXcgQXJyYXlCdWZmZXIoMSkpKSE9RW58fGtlJiZoZShuZXcga2UpIT1Tbnx8VXQmJmhlKFV0LnJlc29sdmUoKSkhPXZufHxIdCYmaGUobmV3IEh0KSE9eW58fEt0JiZoZShuZXcgS3QpIT1ibikmJihoZT1mdW5jdGlvbih0KXt2YXIgcj1BZSh0KSxlPXI9PW9vP3QuY29uc3RydWN0b3I6dm9pZCAwLG49ZT9sZShlKToiIjtpZihuKXN3aXRjaChuKXtjYXNlIGNvOnJldHVybiBFbjtjYXNlIGxvOnJldHVybiBTbjtjYXNlIHVvOnJldHVybiB2bjtjYXNlIHBvOnJldHVybiB5bjtjYXNlIGhvOnJldHVybiBibn1yZXR1cm4gcn0pO3ZhciBFdD1oZSxmbz1PYmplY3QucHJvdG90eXBlLG1vPWZvLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIGdvKHQpe3ZhciByPXQubGVuZ3RoLGU9bmV3IHQuY29uc3RydWN0b3Iocik7cmV0dXJuIHImJnR5cGVvZiB0WzBdPT0ic3RyaW5nIiYmbW8uY2FsbCh0LCJpbmRleCIpJiYoZS5pbmRleD10LmluZGV4LGUuaW5wdXQ9dC5pbnB1dCksZX12YXIgU289WC5VaW50OEFycmF5LF9uPVNvO2Z1bmN0aW9uICR0KHQpe3ZhciByPW5ldyB0LmNvbnN0cnVjdG9yKHQuYnl0ZUxlbmd0aCk7cmV0dXJuIG5ldyBfbihyKS5zZXQobmV3IF9uKHQpKSxyfWZ1bmN0aW9uIHZvKHQscil7dmFyIGU9cj8kdCh0LmJ1ZmZlcik6dC5idWZmZXI7cmV0dXJuIG5ldyB0LmNvbnN0cnVjdG9yKGUsdC5ieXRlT2Zmc2V0LHQuYnl0ZUxlbmd0aCl9dmFyIHlvPS9cdyokLztmdW5jdGlvbiBibyh0KXt2YXIgcj1uZXcgdC5jb25zdHJ1Y3Rvcih0LnNvdXJjZSx5by5leGVjKHQpKTtyZXR1cm4gci5sYXN0SW5kZXg9dC5sYXN0SW5kZXgscn12YXIgVG49RWU/RWUucHJvdG90eXBlOnZvaWQgMCxSbj1Ubj9Ubi52YWx1ZU9mOnZvaWQgMDtmdW5jdGlvbiBFbyh0KXtyZXR1cm4gUm4/T2JqZWN0KFJuLmNhbGwodCkpOnt9fWZ1bmN0aW9uIF9vKHQscil7dmFyIGU9cj8kdCh0LmJ1ZmZlcik6dC5idWZmZXI7cmV0dXJuIG5ldyB0LmNvbnN0cnVjdG9yKGUsdC5ieXRlT2Zmc2V0LHQubGVuZ3RoKX12YXIgVG89IltvYmplY3QgQm9vbGVhbl0iLFJvPSJbb2JqZWN0IERhdGVdIixQbz0iW29iamVjdCBNYXBdIixDbz0iW29iamVjdCBOdW1iZXJdIix3bz0iW29iamVjdCBSZWdFeHBdIixJbz0iW29iamVjdCBTZXRdIixBbz0iW29iamVjdCBTdHJpbmddIixNbz0iW29iamVjdCBTeW1ib2xdIixrbz0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLE9vPSJbb2JqZWN0IERhdGFWaWV3XSIsTG89IltvYmplY3QgRmxvYXQzMkFycmF5XSIsRG89IltvYmplY3QgRmxvYXQ2NEFycmF5XSIsTm89IltvYmplY3QgSW50OEFycmF5XSIsVm89IltvYmplY3QgSW50MTZBcnJheV0iLEZvPSJbb2JqZWN0IEludDMyQXJyYXldIixCbz0iW29iamVjdCBVaW50OEFycmF5XSIseG89IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIixqbz0iW29iamVjdCBVaW50MTZBcnJheV0iLFVvPSJbb2JqZWN0IFVpbnQzMkFycmF5XSI7ZnVuY3Rpb24gSG8odCxyLGUpe3ZhciBuPXQuY29uc3RydWN0b3I7c3dpdGNoKHIpe2Nhc2Uga286cmV0dXJuICR0KHQpO2Nhc2UgVG86Y2FzZSBSbzpyZXR1cm4gbmV3IG4oK3QpO2Nhc2UgT286cmV0dXJuIHZvKHQsZSk7Y2FzZSBMbzpjYXNlIERvOmNhc2UgTm86Y2FzZSBWbzpjYXNlIEZvOmNhc2UgQm86Y2FzZSB4bzpjYXNlIGpvOmNhc2UgVW86cmV0dXJuIF9vKHQsZSk7Y2FzZSBQbzpyZXR1cm4gbmV3IG47Y2FzZSBDbzpjYXNlIEFvOnJldHVybiBuZXcgbih0KTtjYXNlIHdvOnJldHVybiBibyh0KTtjYXNlIElvOnJldHVybiBuZXcgbjtjYXNlIE1vOnJldHVybiBFbyh0KX19dmFyIFBuPU9iamVjdC5jcmVhdGUsS289ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiBmdW5jdGlvbihyKXtpZighTWUocikpcmV0dXJue307aWYoUG4pcmV0dXJuIFBuKHIpO3QucHJvdG90eXBlPXI7dmFyIGU9bmV3IHQ7cmV0dXJuIHQucHJvdG90eXBlPXZvaWQgMCxlfX0oKSwkbz1LbztmdW5jdGlvbiBXbyh0KXtyZXR1cm4gdHlwZW9mIHQuY29uc3RydWN0b3I9PSJmdW5jdGlvbiImJiFidCh0KT8kbyhmbih0KSk6e319dmFyIHpvPSJbb2JqZWN0IE1hcF0iO2Z1bmN0aW9uIEdvKHQpe3JldHVybiBMZSh0KSYmRXQodCk9PXpvfXZhciBDbj1SZSYmUmUuaXNNYXAscW89Q24/RHQoQ24pOkdvLFlvPXFvLFFvPSJbb2JqZWN0IFNldF0iO2Z1bmN0aW9uIEpvKHQpe3JldHVybiBMZSh0KSYmRXQodCk9PVFvfXZhciB3bj1SZSYmUmUuaXNTZXQsWG89d24/RHQod24pOkpvLFpvPVhvLGVjPTEsdGM9MixyYz00LEluPSJbb2JqZWN0IEFyZ3VtZW50c10iLG5jPSJbb2JqZWN0IEFycmF5XSIsc2M9IltvYmplY3QgQm9vbGVhbl0iLGljPSJbb2JqZWN0IERhdGVdIixhYz0iW29iamVjdCBFcnJvcl0iLEFuPSJbb2JqZWN0IEZ1bmN0aW9uXSIsb2M9IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIixjYz0iW29iamVjdCBNYXBdIixkYz0iW29iamVjdCBOdW1iZXJdIixNbj0iW29iamVjdCBPYmplY3RdIixsYz0iW29iamVjdCBSZWdFeHBdIix1Yz0iW29iamVjdCBTZXRdIixwYz0iW29iamVjdCBTdHJpbmddIixoYz0iW29iamVjdCBTeW1ib2xdIixmYz0iW29iamVjdCBXZWFrTWFwXSIsbWM9IltvYmplY3QgQXJyYXlCdWZmZXJdIixnYz0iW29iamVjdCBEYXRhVmlld10iLFNjPSJbb2JqZWN0IEZsb2F0MzJBcnJheV0iLHZjPSJbb2JqZWN0IEZsb2F0NjRBcnJheV0iLHljPSJbb2JqZWN0IEludDhBcnJheV0iLGJjPSJbb2JqZWN0IEludDE2QXJyYXldIixFYz0iW29iamVjdCBJbnQzMkFycmF5XSIsX2M9IltvYmplY3QgVWludDhBcnJheV0iLFRjPSJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSIsUmM9IltvYmplY3QgVWludDE2QXJyYXldIixQYz0iW29iamVjdCBVaW50MzJBcnJheV0iLFY9e307VltJbl09VltuY109VlttY109VltnY109VltzY109VltpY109VltTY109Vlt2Y109Vlt5Y109VltiY109VltFY109VltjY109VltkY109VltNbl09VltsY109Vlt1Y109VltwY109VltoY109VltfY109VltUY109VltSY109VltQY109ITAsVlthY109VltBbl09VltmY109ITE7ZnVuY3Rpb24gX3QodCxyLGUsbixzLGkpe3ZhciBhLGQ9ciZlYyxvPXImdGMsbD1yJnJjO2lmKGUmJihhPXM/ZSh0LG4scyxpKTplKHQpKSxhIT09dm9pZCAwKXJldHVybiBhO2lmKCFNZSh0KSlyZXR1cm4gdDt2YXIgbT15dCh0KTtpZihtKXtpZihhPWdvKHQpLCFkKXJldHVybiBXYSh0LGEpfWVsc2V7dmFyIHY9RXQodCksRT12PT1Bbnx8dj09b2M7aWYoTHQodCkpcmV0dXJuICRhKHQsZCk7aWYodj09TW58fHY9PUlufHxFJiYhcyl7aWYoYT1vfHxFP3t9OldvKHQpLCFkKXJldHVybiBvP2VvKHQsSGEoYSx0KSk6UWEodCxGYShhLHQpKX1lbHNle2lmKCFWW3ZdKXJldHVybiBzP3Q6e307YT1Ibyh0LHYsZCl9fWl8fChpPW5ldyBUZSk7dmFyIEk9aS5nZXQodCk7aWYoSSlyZXR1cm4gSTtpLnNldCh0LGEpLFpvKHQpP3QuZm9yRWFjaChmdW5jdGlvbihGKXthLmFkZChfdChGLHIsZSxGLHQsaSkpfSk6WW8odCkmJnQuZm9yRWFjaChmdW5jdGlvbihGLEspe2Euc2V0KEssX3QoRixyLGUsSyx0LGkpKX0pO3ZhciB4PWw/bz9ybzp0bzpvP0J0OkZ0LEg9bT92b2lkIDA6eCh0KTtyZXR1cm4gQmkoSHx8dCxmdW5jdGlvbihGLEspe0gmJihLPUYsRj10W0tdKSx6cihhLEssX3QoRixyLGUsSyx0LGkpKX0pLGF9dmFyIENjPTEsd2M9NDtmdW5jdGlvbiBJYyh0KXtyZXR1cm4gX3QodCxDY3x3Yyl9dmFyIEFjPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxNYz0odCxyKT0+e2Zvcih2YXIgZSBpbiByKUFjKHQsZSx7Z2V0OnJbZV0sZW51bWVyYWJsZTohMH0pfSxrYz17fTtNYyhrYyx7cGVybWlzc2lvbnM6KCk9Pk9jLHRoZW1lOigpPT5MY30pO3ZhciBPYz17dmlld190eXBlOiJHUk9VUF9DQUxMIixhY2NlcHRfd2FpdGluZ19yZXF1ZXN0czohMSxhY2NlcHRfcHJlc2VudF9yZXF1ZXN0czohMSxyZXF1ZXN0X3Byb2R1Y2U6ITEsY2FuX2FsbG93X3BhcnRpY2lwYW50X2F1ZGlvOiExLGNhbl9hbGxvd19wYXJ0aWNpcGFudF9zY3JlZW5zaGFyaW5nOiExLGNhbl9hbGxvd19wYXJ0aWNpcGFudF92aWRlbzohMSxjYW5fc3BvdGxpZ2h0OiExLHJlcXVlc3Rfa2lja19wYXJ0aWNpcGFudDohMSxraWNrX3BhcnRpY2lwYW50OiExLHBpbl9wYXJ0aWNpcGFudDohMSxjYW5fZWRpdF9kaXNwbGF5X25hbWU6ITEsY2FuX3JlY29yZDohMSxjYW5fbGl2ZXN0cmVhbTohMSxjYW5fcHJlc2VudDohMCx3YWl0aW5nX3Jvb21fdHlwZToiU0tJUF9PTl9BQ0NFUFQiLHJlY29yZGVyX3R5cGU6Ik5PTkUiLHBsdWdpbnM6e2Nhbl9jbG9zZTohMCxjYW5fc3RhcnQ6ITB9LHBvbGxzOntjYW5fY3JlYXRlOiEwLGNhbl92b3RlOiEwLGNhbl92aWV3OiEwfSxwcm9kdWNlOnt2aWRlbzp7YWxsb3c6ITAscXVhbGl0eToidmdhIixmcmFtZV9yYXRlOjI0fSxhdWRpbzohMCxzY3JlZW5zaGFyZTp7YWxsb3c6ITAscXVhbGl0eToiaGQiLGZyYW1lX3JhdGU6NX19LGNoYXQ6e3B1YmxpYzp7Y2FuX3NlbmQ6ITAsdGV4dDohMCxmaWxlczohMH0scHJpdmF0ZTp7Y2FuX3NlbmQ6ITEsY2FuX3JlY2VpdmU6ITEsdGV4dDohMSxmaWxlczohMX19LGNvbm5lY3RlZF9tZWV0aW5nczp7Y2FuX2FsdGVyX2Nvbm5lY3RlZF9tZWV0aW5nczohMSxjYW5fc3dpdGNoX2Nvbm5lY3RlZF9tZWV0aW5nczohMSxjYW5fc3dpdGNoX3RvX3BhcmVudF9tZWV0aW5nOiExfSxyZWFjdGlvbnM6ITEsaGlkZGVuX3BhcnRpY2lwYW50OiExLGlzX3JlY29yZGVyOiExLHNob3dfcGFydGljaXBhbnRfbGlzdDohMCxjYW5fY2hhbmdlX3BhcnRpY2lwYW50X3JvbGU6ITEsY2FuX2NoYW5nZV90aGVtZTohMSxtYXhfc2NyZWVuc2hhcmVfY291bnQ6MX0sTGM9e3NldHVwX3NjcmVlbjp7aXNfZW5hYmxlZDohMH0sYWxvbmVfaGVyZTp7aXNfZW5hYmxlZDohMH0sd2FpdGluZ19yb29tOntpc19lbmFibGVkOiExLGVuYWJsZV9wcmV2aWV3OiEwfSxjb250cm9sX2Jhcjp7aXNfZW5hYmxlZDohMCxlbGVtZW50czp7cGx1Z2luczohMCxzY3JlZW5zaGFyZTohMCxpbnZpdGU6ITAscGFydGljaXBhbnRzOiEwLGNoYXQ6ITAscmVhY3Rpb25zOiExLHBvbGxzOiEwLGZ1bGxzY3JlZW46ITAsbGF5b3V0OiEwfX0saGVhZGVyOntpc19lbmFibGVkOiEwLGVsZW1lbnRzOnt0aW1lcjohMCx0aXRsZTohMCxwYXJ0aWNpcGFudF9jb3VudDohMCxjaGFuZ2VfbGF5b3V0OiEwfX0scGlwX21vZGU6ITAsYXV0b190dW5lOiEwLGdyaWQ6e211bHRpOnttYXhWaWRlb0NvdW50OjYsdmlkZW9GaXQ6ImNvdmVyIn0sc2luZ2xlOnttYXhWaWRlb0NvdW50OjYsdmlkZW9GaXQ6ImNvdmVyIn0sZGVmYXVsdFZpZXc6Im11bHRpIn0sY29udHJvbHM6e3BpcF90b2dnbGU6ITF9fSxrbj0iaFhnVThXYzhwd3VHTnE5bXM1cTlIaCI7dHlwZW9mIHByb2Nlc3MhPSJ1bmRlZmluZWQiJiYodHM9cHJvY2Vzcz09bnVsbD92b2lkIDA6cHJvY2Vzcy5lbnYpIT1udWxsJiZ0cy5GTEFHU01JVEhfRU5WSVJPTk1FTlRfS0VZJiYoa249cHJvY2Vzcy5lbnYuRkxBR1NNSVRIX0VOVklST05NRU5UX0tFWSk7ZnVuY3Rpb24gRGModD1bXSl7Y29uc3Qgcj17fTtyZXR1cm4gdC5mb3JFYWNoKGU9PntyW2UuZmVhdHVyZS5uYW1lXT17ZW5hYmxlZDplLmVuYWJsZWQsdmFsdWU6ZS5mZWF0dXJlX3N0YXRlX3ZhbHVlfX0pLHJ9dmFyIE5jPWNsYXNze2NvbnN0cnVjdG9yKHQ9a24pe3AodGhpcywiZmxhZ3MiLHt9KTtwKHRoaXMsImVudmlyb25tZW50S2V5IixudWxsKTt0aGlzLmVudmlyb25tZW50S2V5PXR9aWRlbnRpZnlBbmRGZXRjaEZsYWdzV2l0aFJldHJ5KGQpe3JldHVybiB3KHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKih7cHJpbWFyeUVuZHBvaW50OnQsc2Vjb25kYXJ5RW5kcG9pbnQ6cixmb3JjZUV2YWx1YXRlOmUsdGltZW91dDpuLHVuaXF1ZUlkZW50aWZpZXI6cyx0cmFpdHNPYmo6aSxsb2dnZXI6YX0pe2NvbnN0IG89SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShpKSksbD1PYmplY3QuZW50cmllcyhvKS5tYXAodj0+KHt0cmFpdF9rZXk6dlswXSx0cmFpdF92YWx1ZTp2WzFdfSkpLG09W3QscixyXTtmb3IoY29uc3QgdiBvZiBtKXRyeXtjb25zdCBFPW5ldyBBYm9ydENvbnRyb2xsZXIsST1zZXRUaW1lb3V0KCgpPT5FLmFib3J0KCksbikseD0iXyIrKE1hdGgucmFuZG9tKCkrMSkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyKSxIPXlpZWxkIGZldGNoKGBodHRwczovLyR7dn0vYXBpL3YxL2lkZW50aXRpZXMvYCx7bWV0aG9kOiJQT1NUIixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiIsIlgtRW52aXJvbm1lbnQtS2V5Ijp0aGlzLmVudmlyb25tZW50S2V5fSxib2R5OkpTT04uc3RyaW5naWZ5KHtpZGVudGlmaWVyOnMrKGU/eDoiIiksdHJhaXRzOmx9KSxzaWduYWw6RS5zaWduYWx9KTtpZihjbGVhclRpbWVvdXQoSSksIUgub2spdGhyb3cgbmV3IEVycm9yKGBSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyAke0guc3RhdHVzfWApO2NvbnN0IEY9eWllbGQgSC5qc29uKCk7cmV0dXJuIERjKEYuZmxhZ3N8fFtdKX1jYXRjaChFKXthLmVycm9yKCJGbGFnc21pdGggaWRlbnRpZnkgZmFpbGVkISEiLHtlcnJvcjpFLHVybDp2fSl9cmV0dXJue319KX1pZGVudGlmeShhKXtyZXR1cm4gdyh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbioodCxyPXt9LGU9ITEsbj01ZTMscz0iZWRnZS5hcGkuZmxhZ3NtaXRoLmNvbSIsaT1jb25zb2xlKXtyZXR1cm4gdGhpcy5mbGFncz15aWVsZCB0aGlzLmlkZW50aWZ5QW5kRmV0Y2hGbGFnc1dpdGhSZXRyeSh7dHJhaXRzT2JqOnIsdW5pcXVlSWRlbnRpZmllcjp0LGZvcmNlRXZhbHVhdGU6ZSx0aW1lb3V0Om4scHJpbWFyeUVuZHBvaW50OnMsc2Vjb25kYXJ5RW5kcG9pbnQ6ImVkZ2UuYXBpLmZsYWdzbWl0aC5jb20iLGxvZ2dlcjppfSksdGhpcy5mbGFnc30pfWdldFZhbHVlKHQpe3JldHVybiB0aGlzLmZsYWdzJiZ0aGlzLmZsYWdzW3RdJiZ0aGlzLmZsYWdzW3RdLnZhbHVlfWhhc0ZlYXR1cmUodCl7cmV0dXJuIHRoaXMuZmxhZ3MmJnRoaXMuZmxhZ3NbdF0mJnRoaXMuZmxhZ3NbdF0uZW5hYmxlZH1nZXRBbGxGbGFncygpe3JldHVybiB0aGlzLmZsYWdzfX07ZnVuY3Rpb24gVmModCl7cmV0dXJuIG5ldyBOYyh0KX12YXIgT249Wy0yLC0xLDAsMSwyXSxGYz1bMCwxLDIsMyw0XTtmdW5jdGlvbiBCYyh0KXt0PXQudHJpbSgpO2xldCByPSIwIixlPSIwIixuPSIwIjtyZXR1cm4gdC5sZW5ndGg9PTQ/KHI9IjB4Iit0WzFdK3RbMV0sZT0iMHgiK3RbMl0rdFsyXSxuPSIweCIrdFszXSt0WzNdKTp0Lmxlbmd0aD42JiYocj0iMHgiK3RbMV0rdFsyXSxlPSIweCIrdFszXSt0WzRdLG49IjB4Iit0WzVdK3RbNl0pLFsrciwrZSwrbl19dmFyIHhjPSh0LHIsZSk9PntsZXQgbixzLGk7aWYocj09MCluPXM9aT1lO2Vsc2V7Y29uc3QgYT0obCxtLHYpPT4odjwwJiYodis9MSksdj4xJiYodi09MSksdjwuMTY2NjY2NjY2NjY2NjY2NjY/bCsobS1sKSo2KnY6djwuNT9tOnY8LjY2NjY2NjY2NjY2NjY2NjY/bCsobS1sKSooLjY2NjY2NjY2NjY2NjY2NjYtdikqNjpsKSxkPWU8LjU/ZSooMStyKTplK3ItZSpyLG89MiplLWQ7bj1hKG8sZCx0KzEvMykscz1hKG8sZCx0KSxpPWEobyxkLHQtMS8zKX1yZXR1cm5bTWF0aC5yb3VuZChuKjI1NSksTWF0aC5yb3VuZChzKjI1NSksTWF0aC5yb3VuZChpKjI1NSldfSxqYz0odCxyLGUpPT57dC89MjU1LHIvPTI1NSxlLz0yNTU7Y29uc3Qgbj1NYXRoLm1heCh0LHIsZSkscz1NYXRoLm1pbih0LHIsZSk7bGV0IGksYTtjb25zdCBkPShuK3MpLzI7aWYobj09cylpPWE9MDtlbHNle2NvbnN0IG89bi1zO3N3aXRjaChhPWQ+LjU/by8oMi1uLXMpOm8vKG4rcyksbil7Y2FzZSB0Omk9KHItZSkvbysocjxlPzY6MCk7YnJlYWs7Y2FzZSByOmk9KGUtdCkvbysyO2JyZWFrO2Nhc2UgZTppPSh0LXIpL28rNDticmVha31pLz02fXJldHVybltpLGEsZF19LFVjPSh0LHIsZSk9Pntjb25zdCBuPXM9PnMudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIjAiKTtyZXR1cm5gIyR7bih0KX0ke24ocil9JHtuKGUpfWB9LExuPSh0LHI9T24sZT0uNCk9Pntjb25zdCBuPVtdLFtzLGksYV09QmModCksW2QsbyxsXT1qYyhzLGksYSksbT1NYXRoLnJvdW5kKGwqMTAwKTttPjcwP2U9Ljg6bT42MD9lPS45Om08MTA/ZT0uMDc1Om08NDImJihlPS4zKTtjb25zdCB2PXIuZmluZEluZGV4KEY9PkY9PT0wKTtpZih2PT09LTEpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHJlZHVjZXIgcHJvdmlkZWQsIGl0IG11c3QgY29udGFpbiBhdGxlYXN0IG9uZSB6ZXJvIik7Y29uc3QgRT01LXYsST12KzEseD0oMTAwLW0pL0UsSD1tL0k7Zm9yKGNvbnN0IEYgb2Ygcil7bGV0IEs7RjwwP0s9bStGKkgqZTpGPjA/Sz1tK0YqeCplOks9bTtjb25zdFtaLHZlLHllXT14YyhkLG8sSy8xMDApO24ucHVzaChVYyhaLHZlLHllKSl9cmV0dXJuIG59LERuPXtkYXJrOntiYWNrZ3JvdW5kOnsxZTM6IiMyNTI1MjUiLDkwMDoiIzJGMkYyRiIsODAwOiIjMzIzMjMyIiw3MDA6IiMzRTNFM0UiLDYwMDoiIzRBNEE0QSJ9LHRleHQ6IiNGNUY1RjUiLCJ2aWRlby1iZyI6IiMxQzFDMUMifSxsaWdodDp7YmFja2dyb3VuZDp7MWUzOiIjRkZGRkZGIiw5MDA6IiNGNUY1RjUiLDgwMDoiI0VCRUJFQiIsNzAwOiIjRTBFMEUwIiw2MDA6IiNENkQ2RDYifSx0ZXh0OiIjMTExMTExIiwidGV4dC1vbi1icmFuZCI6IiNmZmZmZmYiLCJ2aWRlby1iZyI6IiNEQURBREEifX0sSGM9dD0+e2NvbnN0W3IsZSxuLHMsaV09TG4odCxPbik7cmV0dXJuezMwMDpyLDQwMDplLDUwMDpuLDYwMDpzLDcwMDppfX0sS2M9dD0+e2lmKHQ9PT0iI0ZGRkZGRiIpcmV0dXJuIERuLmxpZ2h0LmJhY2tncm91bmQ7aWYodD09PSIjMDAwMDAwIilyZXR1cm4gRG4uZGFyay5iYWNrZ3JvdW5kO2NvbnN0W3IsZSxuLHMsaV09TG4odCxGYyk7cmV0dXJuezFlMzpyLDkwMDplLDgwMDpuLDcwMDpzLDYwMDppfX0sJGM9e2JvcmRlcl9yYWRpdXM6InJvdW5kZWQiLGJvcmRlcl93aWR0aDoidGhpbiIsc3BhY2luZ19iYXNlOjQsdGhlbWU6ImRhcmsiLGNvbG9yczp7YnJhbmQ6SGMoIiMyMTYwRkQiKSxiYWNrZ3JvdW5kOktjKCIjMTQxNDE0IiksZGFuZ2VyOiIjRkYyRDJEIix0ZXh0OiIjRUVFRUVFIix0ZXh0X29uX2JyYW5kOiIjRUVFRUVFIixzdWNjZXNzOiIjNjJBNTA0Iix2aWRlb19iZzoiIzE5MTkxOSIsd2FybmluZzoiI0ZGQ0QwNyJ9fTtmdW5jdGlvbiBObigpe3JldHVybiBJYygkYyl9Tm4oKSxObigpO2NsYXNzIFdje2NvbnN0cnVjdG9yKCl7SXQodGhpcyxGZSx2b2lkIDApfWdldCB0ZWxlbWV0cnkoKXt2YXIgcjtyZXR1cm4ocj1lZSh0aGlzLEZlKSk9PW51bGw/dm9pZCAwOnIuZ2V0VmFsdWUoInRlbGVtZXRyeSIpfWluaXQocil7Q2UodGhpcyxGZSxyKX1pbmZvKHIsZSxuKXt2YXIgczsocz10aGlzLnRlbGVtZXRyeSk9PW51bGx8fHMuYWRkTG9nSW5DdXJyZW50U3BhbigiaW5mbyIscixlLG4pfWVycm9yKHIsZSxuKXt2YXIgczsocz10aGlzLnRlbGVtZXRyeSk9PW51bGx8fHMuYWRkTG9nSW5DdXJyZW50U3BhbigiZXJyb3IiLHIsZSxuKX1kZWJ1ZyhyLGUsbil7dmFyIHM7KHM9dGhpcy50ZWxlbWV0cnkpPT1udWxsfHxzLmFkZExvZ0luQ3VycmVudFNwYW4oImRlYnVnIixyLGUsbil9bG9nKHIsZSxuKXt2YXIgczsocz10aGlzLnRlbGVtZXRyeSk9PW51bGx8fHMuYWRkTG9nSW5DdXJyZW50U3BhbigibG9nIixyLGUsbil9d2FybihyLGUsbil7dmFyIHM7KHM9dGhpcy50ZWxlbWV0cnkpPT1udWxsfHxzLmFkZExvZ0luQ3VycmVudFNwYW4oIndhcm4iLHIsZSxuKX19RmU9bmV3IFdlYWtNYXA7Y29uc3QgcnI9Y2xhc3MgZXh0ZW5kcyBxLkV2ZW50RW1pdHRlcntjb25zdHJ1Y3RvcihlKXtzdXBlcigpO0l0KHRoaXMsc2Usdm9pZCAwKTtJdCh0aGlzLGllLHZvaWQgMCk7cCh0aGlzLCJhc3luY1Byb21pc2VUaW1lb3V0Iik7cCh0aGlzLCJsb2dnZXIiKTt0aGlzLmxvZ2dlcj1lLENlKHRoaXMsc2UsbmV3IE1hcCksQ2UodGhpcyxpZSxuZXcgTWFwKSx0aGlzLmFzeW5jUHJvbWlzZVRpbWVvdXQ9OGUzfWVtaXRBc3luYyhlLC4uLm4pe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXtlZSh0aGlzLHNlKS5zZXQoZSxbXSk7Y29uc3Qgcz1lZSh0aGlzLGllKS5nZXQoZSkubWFwKCgpPT5uZXcgUHJvbWlzZShpPT57ZWUodGhpcyxzZSkuZ2V0KGUpLnB1c2goaSl9KSk7c3MocnIucHJvdG90eXBlLHRoaXMsImVtaXQiKS5jYWxsKHRoaXMsZSwuLi5uKSx5aWVsZCBQcm9taXNlLnJhY2UoW1Byb21pc2UuYWxsKHMpLG5ldyBQcm9taXNlKChpLGEpPT5zZXRUaW1lb3V0KCgpPT5hKG5ldyBFcnJvcihgZW1pdEFzeW5jIGZhaWxlZCB0byByZXNvbHZlIGZvciBldmVudCAke2V9LmApKSx0aGlzLmFzeW5jUHJvbWlzZVRpbWVvdXQpKV0pLGVlKHRoaXMsc2UpLmRlbGV0ZShlKX0pfW9uQXN5bmMoZSxuKXtjb25zdCBzPWVlKHRoaXMsc2UpLGk9KC4uLmEpPT53KHRoaXMsbnVsbCxmdW5jdGlvbiooKXt2YXIgbzt0cnl7eWllbGQgbiguLi5hKX1jYXRjaChsKXt0aGlzLmxvZ2dlci5lcnJvcigiW29uQXN5bmNdIix7ZXJyb3I6bH0pfWNvbnN0IGQ9KG89cy5nZXQoZSkpPT1udWxsP3ZvaWQgMDpvLnNoaWZ0KCk7ZD09bnVsbHx8ZCgpfSk7cmV0dXJuIGVlKHRoaXMsaWUpLmdldChlKXx8ZWUodGhpcyxpZSkuc2V0KGUsW10pLGVlKHRoaXMsaWUpLmdldChlKS5wdXNoKGkpLHN1cGVyLm9uKGUsaSl9cmVzZXQoKXtDZSh0aGlzLHNlLG5ldyBNYXApLENlKHRoaXMsaWUsbmV3IE1hcCksc3VwZXIucmVtb3ZlQWxsTGlzdGVuZXJzKCl9fTtsZXQgV3Q9cnI7c2U9bmV3IFdlYWtNYXAsaWU9bmV3IFdlYWtNYXA7dmFyIFR0LHpjPW5ldyBVaW50OEFycmF5KDE2KTtmdW5jdGlvbiBHYygpe2lmKCFUdCYmKFR0PXR5cGVvZiBjcnlwdG8hPSJ1bmRlZmluZWQiJiZjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzJiZjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQoY3J5cHRvKXx8dHlwZW9mIG1zQ3J5cHRvIT0idW5kZWZpbmVkIiYmdHlwZW9mIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcz09ImZ1bmN0aW9uIiYmbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQobXNDcnlwdG8pLCFUdCkpdGhyb3cgbmV3IEVycm9yKCJjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKCkgbm90IHN1cHBvcnRlZC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCNnZXRyYW5kb212YWx1ZXMtbm90LXN1cHBvcnRlZCIpO3JldHVybiBUdCh6Yyl9dmFyIHFjPS9eKD86WzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtNV1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn18MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwKSQvaTtmdW5jdGlvbiBZYyh0KXtyZXR1cm4gdHlwZW9mIHQ9PSJzdHJpbmciJiZxYy50ZXN0KHQpfWZvcih2YXIgVz1bXSx6dD0wO3p0PDI1NjsrK3p0KVcucHVzaCgoenQrMjU2KS50b1N0cmluZygxNikuc3Vic3RyKDEpKTtmdW5jdGlvbiBRYyh0KXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06MCxlPShXW3RbciswXV0rV1t0W3IrMV1dK1dbdFtyKzJdXStXW3RbciszXV0rIi0iK1dbdFtyKzRdXStXW3Rbcis1XV0rIi0iK1dbdFtyKzZdXStXW3Rbcis3XV0rIi0iK1dbdFtyKzhdXStXW3Rbcis5XV0rIi0iK1dbdFtyKzEwXV0rV1t0W3IrMTFdXStXW3RbcisxMl1dK1dbdFtyKzEzXV0rV1t0W3IrMTRdXStXW3RbcisxNV1dKS50b0xvd2VyQ2FzZSgpO2lmKCFZYyhlKSl0aHJvdyBUeXBlRXJyb3IoIlN0cmluZ2lmaWVkIFVVSUQgaXMgaW52YWxpZCIpO3JldHVybiBlfWZ1bmN0aW9uIEpjKHQscixlKXt0PXR8fHt9O3ZhciBuPXQucmFuZG9tfHwodC5ybmd8fEdjKSgpO2lmKG5bNl09bls2XSYxNXw2NCxuWzhdPW5bOF0mNjN8MTI4LHIpe2U9ZXx8MDtmb3IodmFyIHM9MDtzPDE2OysrcylyW2Urc109bltzXTtyZXR1cm4gcn1yZXR1cm4gUWMobil9dmFyIFhjPSJbb2JqZWN0IE1hcF0iLFpjPSJbb2JqZWN0IFNldF0iLGVkPU9iamVjdC5wcm90b3R5cGUsdGQ9ZWQuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gcmQodCl7aWYodD09bnVsbClyZXR1cm4hMDtpZihWdCh0KSYmKHl0KHQpfHx0eXBlb2YgdD09InN0cmluZyJ8fHR5cGVvZiB0LnNwbGljZT09ImZ1bmN0aW9uInx8THQodCl8fHJuKHQpfHxZcih0KSkpcmV0dXJuIXQubGVuZ3RoO3ZhciByPUV0KHQpO2lmKHI9PVhjfHxyPT1aYylyZXR1cm4hdC5zaXplO2lmKGJ0KHQpKXJldHVybiFhbih0KS5sZW5ndGg7Zm9yKHZhciBlIGluIHQpaWYodGQuY2FsbCh0LGUpKXJldHVybiExO3JldHVybiEwfWNvbnN0IEd0PXtQUk9QQUdBVEVfS0lDS19BTEw6InByb3BhZ2F0ZV9raWNrX2Fjcm9zc19yb29tcyIsUkVGUkVTSF9JRF9PTl9ESVNDT05ORUNUSU9OOiJyZWZyZXNoX2lkX29uX2Rpc2Nvbm5lY3Rpb24iLFNLSVBfT1RFTF9UUkFDRVM6InNraXBfb3RlbF90cmFjZXMiLEVOQUJMRV9DRl9TSU1VTENBU1Q6ImVuYWJsZV9jZl9zaW11bGNhc3QiLENGX1RSQU5TUE9SVF9GT1JDRV9SRUxBWV9PTl9JQ0VfRkFJTEVEOiJjZl90cmFuc3BvcnRfZm9yY2VfcmVsYXlfb25faWNlX2ZhaWxlZCIsTE9HX0xFVkVMOiJsb2dfbGV2ZWwiLFYxX1BMVUdJTlM6InYxX3BsdWdpbnMiLExJVkVTVFJFQU06ImZlYXRfbGl2ZXN0cmVhbSIsVkFMX01JTl9GUkFNRVJBVEU6InZhbF9taW5fZnJhbWVyYXRlIixTQ1JFRUVOU0hBUkVfRVJSX0hBQ0s6InNjcmVlbnNoYXJlX2Vycl9oYWNrIixTQ1JFRUVOU0hBUkVfQ09OU1RSQUlOVFNfUkVUUlk6InNjcmVlbnNoYXJlX2NvbnN0cmFpbnRzX3JldHJ5IixWSURFT19DT05TVFJBSU5UUzoidmlkZW9fY29uc3RyYWludHMiLFNDUkVFTlNIQVJFX0NPTlNUUkFJTlRTOiJzY3JlZW5zaGFyZV9jb25zdHJhaW50cyIsT0JTX1FVQUxJVFk6Im9ic19xdWFsaXR5IixBTExPV19TQUZBUklfTUVESUFfTUlERExFV0FSRVM6ImFsbG93X3NhZmFyaV9tZWRpYV9taWRkbGV3YXJlcyIsRVhQX1JFU0hBUkU6ImV4cF9yZXNoYXJlIixTS0lQX1NFVFRJTkdfSU5fVVNFX0RFVklDRToic2tpcF9zZXR0aW5nX2luX3VzZV9kZXZpY2UiLFBSRUNBTExfQkFORFdJRFRIX1RFU1Q6InByZWNhbGxfYmFuZHdpZHRoX3Rlc3QiLERFQlVHX1NPQ0tFVF9KT0lOOiJkZWJ1Z19zb2NrZXRfam9pbiIsRk9SQ0VfUkVMQVk6ImZvcmNlX3JlbGF5IixGT1JDRV9WSURFT19DT0RFQzoiZm9yY2VfdmlkZW9fY29kZWMiLFRSQUNLX0hJTlQ6InRyYWNrX2hpbnQiLE9WRVJSSURFX1NJTVVMQ0FTVF9EWU5BTUlDOiJvdmVycmlkZV9zaW11bGNhc3RfZHluYW1pYyIsUFJFQ1JFQVRFX1BST0RVQ0VSUzoicHJlY3JlYXRlX3Byb2R1Y2VycyIsRElTQUJMRV9PUFVTX0RUWF9DRjoiZGlzYWJsZV9vcHVzX2R0eF9jZiIsRU5BQkxFX0FVRElPX0FDVElWSVRZX0RFQlVHX0xPR1M6ImVuYWJsZV9hdWRpb19hY3Rpdml0eV9kZWJ1Z19sb2dzIixESVNBQkxFX0xBWUVSX1NXSVRDSDoiZGlzYWJsZV9sYXllcl9zd2l0Y2gifTtmdW5jdGlvbiBSdCh0KXtjb25zdCByPXt9O3JldHVybiB0eXBlb2YodD09bnVsbD92b2lkIDA6dC5jb2RlKT09Im51bWJlciImJihyLmNvZGU9dC5jb2RlKSx0eXBlb2YodD09bnVsbD92b2lkIDA6dC5jb2RlKT09InN0cmluZyImJihyLmNvZGU9dC5jb2RlLnN1YnN0cmluZygwLDEwMCkpLHR5cGVvZih0PT1udWxsP3ZvaWQgMDp0Lm5hbWUpPT0ic3RyaW5nIiYmKHIubmFtZT10Lm5hbWUuc3Vic3RyaW5nKDAsNTAwKSksdHlwZW9mKHQ9PW51bGw/dm9pZCAwOnQubWVzc2FnZSk9PSJzdHJpbmciJiYoci5tZXNzYWdlPXQubWVzc2FnZS5zdWJzdHJpbmcoMCw1MDApKSx0eXBlb2YodD09bnVsbD92b2lkIDA6dC5yZWFzb24pPT0ic3RyaW5nIiYmKHIucmVhc29uPXQucmVhc29uLnN1YnN0cmluZygwLDUwMCkpLHR5cGVvZih0PT1udWxsP3ZvaWQgMDp0LnN0YWNrKT09InN0cmluZyImJihyLnN0YWNrPXQuc3RhY2suc3Vic3RyaW5nKDAsNTAwKSkscn1mdW5jdGlvbiBuZCh7c2VydmljZVByZWZpeDp0LGJhc2VVUkk6cn0pe3JldHVybmAke3R9LiR7cn1gfWNvbnN0IHNkPXtsb2dzOiJodHRwczovL2FwaS1zaWxvcy5keXRlLmlvL290ZWwvbG9ncyIsbW9jazp7dXJsOiJodHRwczovL21vY2suZHl0ZS5pbyIsZG9tYWluOiJtb2NrLmR5dGUuaW8iLGFwcDoiaHR0cHM6Ly9hcHAuZHl0ZS5pby92Mi9tZWV0aW5nIixzdGFnaW5nQXBwOiJodHRwczovL2FwcC5kZXZlbC5keXRlLmlvL3YyL21lZXRpbmcifSxhcGlCYXNlOntwcm9kOiJodHRwczovL2FwaS5keXRlLmlvIixzdGFnaW5nOiJodHRwczovL2FwaS5kZXZlbC5keXRlLmlvIixwcm9kQWx0ZXJuYXRlOiJodHRwczovL2FwaS5jbHVzdGVyLmR5dGUuaW4ifSxiYXNlVVJJOntwcm9kOiJkeXRlLmlvIixzdGFnaW5nOiJkZXZlbC5keXRlLmlvIn19O2Z1bmN0aW9uIGlkKHQpe3ZhciBuLHMsaTtjb25zdCByPXR5cGVvZiBuYXZpZ2F0b3IhPSJ1bmRlZmluZWQiJiYhbmF2aWdhdG9yLmlzUmVhY3ROYXRpdmUmJnR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiJiYoKG49d2luZG93LmxvY2F0aW9uLmhvc3QpPT1udWxsP3ZvaWQgMDpuLmluY2x1ZGVzKHNkLmJhc2VVUkkuc3RhZ2luZykpLGU9ISEoKGk9KHM9dD09bnVsbD92b2lkIDA6dC5nZXRWYWx1ZSgibW9kdWxlcyIpKT09bnVsbD92b2lkIDA6cy5kZXZUb29scykhPW51bGwmJmkubG9ncyk7cmV0dXJuIHJ8fGV9ZnVuY3Rpb24gYWQodCxyKXt2YXIgZTtpZih0IT1udWxsJiZ0LmdldFZhbHVlKCJmbGFnc21pdGgiKS5oYXNGZWF0dXJlKEd0LkxPR19MRVZFTCkpe2xldCBuPSgoZT10LmdldFZhbHVlKCJmbGFnc21pdGgiKS5nZXRWYWx1ZShHdC5MT0dfTEVWRUwpKT09bnVsbD92b2lkIDA6ZS50b1N0cmluZygpKXx8ImFsbCI7aWYobj1uLnRvTG93ZXJDYXNlKCkudHJpbSgpLG49PT0ib2ZmIilyZXR1cm4hMTtpZihuIT09ImFsbCIpe2NvbnN0IHM9WyJkZWJ1ZyIsImxvZyIsImluZm8iLCJ3YXJuIiwiZXJyb3IiXSxpPXMuaW5kZXhPZihyKSxhPXMuaW5kZXhPZihuKTtpZihpPGEpcmV0dXJuITF9fXJldHVybiEwfWZ1bmN0aW9uIFZuKHQscixlPXt9KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModCkuZm9yRWFjaChuPT57dmFyIGk7aWYoW251bGwsdm9pZCAwLE5hTl0uaW5jbHVkZXModFtuXSl8fHImJigoKGk9ci5tYXRjaCgvXC4vZykpPT1udWxsP3ZvaWQgMDppLmxlbmd0aCl8fDApPj0xMClyZXR1cm47Y29uc3Qgcz1yP2Ake3J9LiR7bn1gOm47dHlwZW9mIHRbbl09PSJvYmplY3QiP1ZuKHRbbl0scyxlKTpbIm51bWJlciIsInN0cmluZyIsImJvb2xlYW4iXS5pbmNsdWRlcyh0eXBlb2YgdFtuXSkmJihlW3NdPXRbbl0pfSksZX1mdW5jdGlvbiBGbih0LHIsZT17fSxuPSIiKXtjb25zdCBzPXt9O3RyeXtjb25zdCBpPUpTT04uc3RyaW5naWZ5KGUpLGE9SlNPTi5wYXJzZShpKSxkPVZuKGEsbiksbz1KU09OLnN0cmluZ2lmeShkKTtyZXR1cm4gSlNPTi5wYXJzZShvKX1jYXRjaChpKXtjb25zdCBhPVJ0KGkpO3NbYCR7bn0uZXJyb3IubWVzc2FnZWBdPWEubWVzc2FnZXx8IiIsc1tgJHtufS5lcnJvci5zdGFja2BdPWEuc3RhY2t8fCIiLHNbYCR7bn0uZXJyb3IucmVhc29uYF09YS5yZWFzb258fCIiLHNbYCR7bn0uZXJyb3Iuc291cmNlYF09InNhZmVseUZsYXR0ZW5PYmpGb3JPcGVuVGVsZW1ldHJ5In1yZXR1cm4gc31jb25zdCBvZD17IkFtYXpvbiBTaWxrIjoiYW1hem9uX3NpbGsiLCJBbmRyb2lkIEJyb3dzZXIiOiJhbmRyb2lkIixCYWRhOiJiYWRhIixCbGFja0JlcnJ5OiJibGFja2JlcnJ5IixDaHJvbWU6ImNocm9tZSIsQ2hyb21pdW06ImNocm9taXVtIixFbGVjdHJvbjoiZWxlY3Ryb24iLEVwaXBoYW55OiJlcGlwaGFueSIsRmlyZWZveDoiZmlyZWZveCIsRm9jdXM6ImZvY3VzIixHZW5lcmljOiJnZW5lcmljIiwiR29vZ2xlIFNlYXJjaCI6Imdvb2dsZV9zZWFyY2giLEdvb2dsZWJvdDoiZ29vZ2xlYm90IiwiSW50ZXJuZXQgRXhwbG9yZXIiOiJpZSIsIkstTWVsZW9uIjoia19tZWxlb24iLE1heHRob246Im1heHRob24iLCJNaWNyb3NvZnQgRWRnZSI6ImVkZ2UiLCJNWiBCcm93c2VyIjoibXoiLCJOQVZFUiBXaGFsZSBCcm93c2VyIjoibmF2ZXIiLE9wZXJhOiJvcGVyYSIsIk9wZXJhIENvYXN0Ijoib3BlcmFfY29hc3QiLFBoYW50b21KUzoicGhhbnRvbWpzIixQdWZmaW46InB1ZmZpbiIsUXVwWmlsbGE6InF1cHppbGxhIixRUToicXEiLFFRTGl0ZToicXFsaXRlIixTYWZhcmk6InNhZmFyaSIsU2FpbGZpc2g6InNhaWxmaXNoIiwiU2Ftc3VuZyBJbnRlcm5ldCBmb3IgQW5kcm9pZCI6InNhbXN1bmdfaW50ZXJuZXQiLFNlYU1vbmtleToic2VhbW9ua2V5IixTbGVpcG5pcjoic2xlaXBuaXIiLFN3aW5nOiJzd2luZyIsVGl6ZW46InRpemVuIiwiVUMgQnJvd3NlciI6InVjIixWaXZhbGRpOiJ2aXZhbGRpIiwiV2ViT1MgQnJvd3NlciI6IndlYm9zIixXZUNoYXQ6IndlY2hhdCIsIllhbmRleCBCcm93c2VyIjoieWFuZGV4IixSb2t1OiJyb2t1In0sQm49e2FtYXpvbl9zaWxrOiJBbWF6b24gU2lsayIsYW5kcm9pZDoiQW5kcm9pZCBCcm93c2VyIixiYWRhOiJCYWRhIixibGFja2JlcnJ5OiJCbGFja0JlcnJ5IixjaHJvbWU6IkNocm9tZSIsY2hyb21pdW06IkNocm9taXVtIixlbGVjdHJvbjoiRWxlY3Ryb24iLGVwaXBoYW55OiJFcGlwaGFueSIsZmlyZWZveDoiRmlyZWZveCIsZm9jdXM6IkZvY3VzIixnZW5lcmljOiJHZW5lcmljIixnb29nbGVib3Q6Ikdvb2dsZWJvdCIsZ29vZ2xlX3NlYXJjaDoiR29vZ2xlIFNlYXJjaCIsaWU6IkludGVybmV0IEV4cGxvcmVyIixrX21lbGVvbjoiSy1NZWxlb24iLG1heHRob246Ik1heHRob24iLGVkZ2U6Ik1pY3Jvc29mdCBFZGdlIixtejoiTVogQnJvd3NlciIsbmF2ZXI6Ik5BVkVSIFdoYWxlIEJyb3dzZXIiLG9wZXJhOiJPcGVyYSIsb3BlcmFfY29hc3Q6Ik9wZXJhIENvYXN0IixwaGFudG9tanM6IlBoYW50b21KUyIscHVmZmluOiJQdWZmaW4iLHF1cHppbGxhOiJRdXBaaWxsYSIscXE6IlFRIEJyb3dzZXIiLHFxbGl0ZToiUVEgQnJvd3NlciBMaXRlIixzYWZhcmk6IlNhZmFyaSIsc2FpbGZpc2g6IlNhaWxmaXNoIixzYW1zdW5nX2ludGVybmV0OiJTYW1zdW5nIEludGVybmV0IGZvciBBbmRyb2lkIixzZWFtb25rZXk6IlNlYU1vbmtleSIsc2xlaXBuaXI6IlNsZWlwbmlyIixzd2luZzoiU3dpbmciLHRpemVuOiJUaXplbiIsdWM6IlVDIEJyb3dzZXIiLHZpdmFsZGk6IlZpdmFsZGkiLHdlYm9zOiJXZWJPUyBCcm93c2VyIix3ZWNoYXQ6IldlQ2hhdCIseWFuZGV4OiJZYW5kZXggQnJvd3NlciJ9LFU9e3RhYmxldDoidGFibGV0Iixtb2JpbGU6Im1vYmlsZSIsZGVza3RvcDoiZGVza3RvcCIsdHY6InR2In0sRz17V2luZG93c1Bob25lOiJXaW5kb3dzIFBob25lIixXaW5kb3dzOiJXaW5kb3dzIixNYWNPUzoibWFjT1MiLGlPUzoiaU9TIixBbmRyb2lkOiJBbmRyb2lkIixXZWJPUzoiV2ViT1MiLEJsYWNrQmVycnk6IkJsYWNrQmVycnkiLEJhZGE6IkJhZGEiLFRpemVuOiJUaXplbiIsTGludXg6IkxpbnV4IixDaHJvbWVPUzoiQ2hyb21lIE9TIixQbGF5U3RhdGlvbjQ6IlBsYXlTdGF0aW9uIDQiLFJva3U6IlJva3UifSxvZT17RWRnZUhUTUw6IkVkZ2VIVE1MIixCbGluazoiQmxpbmsiLFRyaWRlbnQ6IlRyaWRlbnQiLFByZXN0bzoiUHJlc3RvIixHZWNrbzoiR2Vja28iLFdlYktpdDoiV2ViS2l0In07Y2xhc3MgZ3tzdGF0aWMgZ2V0Rmlyc3RNYXRjaChyLGUpe2NvbnN0IG49ZS5tYXRjaChyKTtyZXR1cm4gbiYmbi5sZW5ndGg+MCYmblsxXXx8IiJ9c3RhdGljIGdldFNlY29uZE1hdGNoKHIsZSl7Y29uc3Qgbj1lLm1hdGNoKHIpO3JldHVybiBuJiZuLmxlbmd0aD4xJiZuWzJdfHwiIn1zdGF0aWMgbWF0Y2hBbmRSZXR1cm5Db25zdChyLGUsbil7aWYoci50ZXN0KGUpKXJldHVybiBufXN0YXRpYyBnZXRXaW5kb3dzVmVyc2lvbk5hbWUocil7c3dpdGNoKHIpe2Nhc2UiTlQiOnJldHVybiJOVCI7Y2FzZSJYUCI6cmV0dXJuIlhQIjtjYXNlIk5UIDUuMCI6cmV0dXJuIjIwMDAiO2Nhc2UiTlQgNS4xIjpyZXR1cm4iWFAiO2Nhc2UiTlQgNS4yIjpyZXR1cm4iMjAwMyI7Y2FzZSJOVCA2LjAiOnJldHVybiJWaXN0YSI7Y2FzZSJOVCA2LjEiOnJldHVybiI3IjtjYXNlIk5UIDYuMiI6cmV0dXJuIjgiO2Nhc2UiTlQgNi4zIjpyZXR1cm4iOC4xIjtjYXNlIk5UIDEwLjAiOnJldHVybiIxMCI7ZGVmYXVsdDpyZXR1cm59fXN0YXRpYyBnZXRNYWNPU1ZlcnNpb25OYW1lKHIpe2NvbnN0IGU9ci5zcGxpdCgiLiIpLnNwbGljZSgwLDIpLm1hcChuPT5wYXJzZUludChuLDEwKXx8MCk7aWYoZS5wdXNoKDApLGVbMF09PT0xMClzd2l0Y2goZVsxXSl7Y2FzZSA1OnJldHVybiJMZW9wYXJkIjtjYXNlIDY6cmV0dXJuIlNub3cgTGVvcGFyZCI7Y2FzZSA3OnJldHVybiJMaW9uIjtjYXNlIDg6cmV0dXJuIk1vdW50YWluIExpb24iO2Nhc2UgOTpyZXR1cm4iTWF2ZXJpY2tzIjtjYXNlIDEwOnJldHVybiJZb3NlbWl0ZSI7Y2FzZSAxMTpyZXR1cm4iRWwgQ2FwaXRhbiI7Y2FzZSAxMjpyZXR1cm4iU2llcnJhIjtjYXNlIDEzOnJldHVybiJIaWdoIFNpZXJyYSI7Y2FzZSAxNDpyZXR1cm4iTW9qYXZlIjtjYXNlIDE1OnJldHVybiJDYXRhbGluYSI7ZGVmYXVsdDpyZXR1cm59fXN0YXRpYyBnZXRBbmRyb2lkVmVyc2lvbk5hbWUocil7Y29uc3QgZT1yLnNwbGl0KCIuIikuc3BsaWNlKDAsMikubWFwKG49PnBhcnNlSW50KG4sMTApfHwwKTtpZihlLnB1c2goMCksIShlWzBdPT09MSYmZVsxXTw1KSl7aWYoZVswXT09PTEmJmVbMV08NilyZXR1cm4iQ3VwY2FrZSI7aWYoZVswXT09PTEmJmVbMV0+PTYpcmV0dXJuIkRvbnV0IjtpZihlWzBdPT09MiYmZVsxXTwyKXJldHVybiJFY2xhaXIiO2lmKGVbMF09PT0yJiZlWzFdPT09MilyZXR1cm4iRnJveW8iO2lmKGVbMF09PT0yJiZlWzFdPjIpcmV0dXJuIkdpbmdlcmJyZWFkIjtpZihlWzBdPT09MylyZXR1cm4iSG9uZXljb21iIjtpZihlWzBdPT09NCYmZVsxXTwxKXJldHVybiJJY2UgQ3JlYW0gU2FuZHdpY2giO2lmKGVbMF09PT00JiZlWzFdPDQpcmV0dXJuIkplbGx5IEJlYW4iO2lmKGVbMF09PT00JiZlWzFdPj00KXJldHVybiJLaXRLYXQiO2lmKGVbMF09PT01KXJldHVybiJMb2xsaXBvcCI7aWYoZVswXT09PTYpcmV0dXJuIk1hcnNobWFsbG93IjtpZihlWzBdPT09NylyZXR1cm4iTm91Z2F0IjtpZihlWzBdPT09OClyZXR1cm4iT3JlbyI7aWYoZVswXT09PTkpcmV0dXJuIlBpZSJ9fXN0YXRpYyBnZXRWZXJzaW9uUHJlY2lzaW9uKHIpe3JldHVybiByLnNwbGl0KCIuIikubGVuZ3RofXN0YXRpYyBjb21wYXJlVmVyc2lvbnMocixlLG49ITEpe2NvbnN0IHM9Zy5nZXRWZXJzaW9uUHJlY2lzaW9uKHIpLGk9Zy5nZXRWZXJzaW9uUHJlY2lzaW9uKGUpO2xldCBhPU1hdGgubWF4KHMsaSksZD0wO2NvbnN0IG89Zy5tYXAoW3IsZV0sbD0+e2NvbnN0IG09YS1nLmdldFZlcnNpb25QcmVjaXNpb24obCksdj1sK25ldyBBcnJheShtKzEpLmpvaW4oIi4wIik7cmV0dXJuIGcubWFwKHYuc3BsaXQoIi4iKSxFPT5uZXcgQXJyYXkoMjAtRS5sZW5ndGgpLmpvaW4oIjAiKStFKS5yZXZlcnNlKCl9KTtmb3IobiYmKGQ9YS1NYXRoLm1pbihzLGkpKSxhLT0xO2E+PWQ7KXtpZihvWzBdW2FdPm9bMV1bYV0pcmV0dXJuIDE7aWYob1swXVthXT09PW9bMV1bYV0pe2lmKGE9PT1kKXJldHVybiAwO2EtPTF9ZWxzZSBpZihvWzBdW2FdPG9bMV1bYV0pcmV0dXJuLTF9fXN0YXRpYyBtYXAocixlKXtjb25zdCBuPVtdO2xldCBzO2lmKEFycmF5LnByb3RvdHlwZS5tYXApcmV0dXJuIEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbChyLGUpO2ZvcihzPTA7czxyLmxlbmd0aDtzKz0xKW4ucHVzaChlKHJbc10pKTtyZXR1cm4gbn1zdGF0aWMgZmluZChyLGUpe2xldCBuLHM7aWYoQXJyYXkucHJvdG90eXBlLmZpbmQpcmV0dXJuIEFycmF5LnByb3RvdHlwZS5maW5kLmNhbGwocixlKTtmb3Iobj0wLHM9ci5sZW5ndGg7bjxzO24rPTEpe2NvbnN0IGk9cltuXTtpZihlKGksbikpcmV0dXJuIGl9fXN0YXRpYyBhc3NpZ24ociwuLi5lKXtjb25zdCBuPXI7bGV0IHMsaTtpZihPYmplY3QuYXNzaWduKXJldHVybiBPYmplY3QuYXNzaWduKHIsLi4uZSk7Zm9yKHM9MCxpPWUubGVuZ3RoO3M8aTtzKz0xKXtjb25zdCBhPWVbc107dHlwZW9mIGE9PSJvYmplY3QiJiZhIT09bnVsbCYmT2JqZWN0LmtleXMoYSkuZm9yRWFjaChvPT57bltvXT1hW29dfSl9cmV0dXJuIHJ9c3RhdGljIGdldEJyb3dzZXJBbGlhcyhyKXtyZXR1cm4gb2Rbcl19c3RhdGljIGdldEJyb3dzZXJUeXBlQnlBbGlhcyhyKXtyZXR1cm4gQm5bcl18fCIifX1jb25zdCBEPS92ZXJzaW9uXC8oXGQrKFwuP18/XGQrKSspL2ksY2Q9W3t0ZXN0OlsvZ29vZ2xlYm90L2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6Ikdvb2dsZWJvdCJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC9nb29nbGVib3RcLyhcZCsoXC5cZCspKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9vcGVyYS9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJPcGVyYSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKEQsdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86b3BlcmEpW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0Olsvb3ByXC98b3Bpb3MvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiT3BlcmEifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86b3ByfG9waW9zKVtccy9dKFxTKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKEQsdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvU2Ftc3VuZ0Jyb3dzZXIvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiU2Ftc3VuZyBJbnRlcm5ldCBmb3IgQW5kcm9pZCJ9LGU9Zy5nZXRGaXJzdE1hdGNoKEQsdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86U2Ftc3VuZ0Jyb3dzZXIpW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvV2hhbGUvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiTkFWRVIgV2hhbGUgQnJvd3NlciJ9LGU9Zy5nZXRGaXJzdE1hdGNoKEQsdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86d2hhbGUpW1xzL10oXGQrKD86XC5cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9NWkJyb3dzZXIvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiTVogQnJvd3NlciJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzpNWkJyb3dzZXIpW1xzL10oXGQrKD86XC5cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKEQsdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvZm9jdXMvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiRm9jdXMifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86Zm9jdXMpW1xzL10oXGQrKD86XC5cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKEQsdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0Olsvc3dpbmcvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiU3dpbmcifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86c3dpbmcpW1xzL10oXGQrKD86XC5cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKEQsdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvY29hc3QvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiT3BlcmEgQ29hc3QifSxlPWcuZ2V0Rmlyc3RNYXRjaChELHQpfHxnLmdldEZpcnN0TWF0Y2goLyg/OmNvYXN0KVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL29wdFwvXGQrKD86Lj9fP1xkKykrL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6Ik9wZXJhIFRvdWNoIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/Om9wdClbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKEQsdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsveWFicm93c2VyL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IllhbmRleCBCcm93c2VyIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/OnlhYnJvd3NlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKEQsdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvdWNicm93c2VyL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IlVDIEJyb3dzZXIifSxlPWcuZ2V0Rmlyc3RNYXRjaChELHQpfHxnLmdldEZpcnN0TWF0Y2goLyg/OnVjYnJvd3NlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9NYXh0aG9ufG14aW9zL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6Ik1heHRob24ifSxlPWcuZ2V0Rmlyc3RNYXRjaChELHQpfHxnLmdldEZpcnN0TWF0Y2goLyg/Ok1heHRob258bXhpb3MpW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvZXBpcGhhbnkvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiRXBpcGhhbnkifSxlPWcuZ2V0Rmlyc3RNYXRjaChELHQpfHxnLmdldEZpcnN0TWF0Y2goLyg/OmVwaXBoYW55KVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL3B1ZmZpbi9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJQdWZmaW4ifSxlPWcuZ2V0Rmlyc3RNYXRjaChELHQpfHxnLmdldEZpcnN0TWF0Y2goLyg/OnB1ZmZpbilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9zbGVpcG5pci9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJTbGVpcG5pciJ9LGU9Zy5nZXRGaXJzdE1hdGNoKEQsdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86c2xlaXBuaXIpW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0Olsvay1tZWxlb24vaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiSy1NZWxlb24ifSxlPWcuZ2V0Rmlyc3RNYXRjaChELHQpfHxnLmdldEZpcnN0TWF0Y2goLyg/OmstbWVsZW9uKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL21pY3JvbWVzc2VuZ2VyL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IldlQ2hhdCJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzptaWNyb21lc3NlbmdlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKEQsdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvcXFicm93c2VyL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6L3FxYnJvd3NlcmxpdGUvaS50ZXN0KHQpPyJRUSBCcm93c2VyIExpdGUiOiJRUSBCcm93c2VyIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/OnFxYnJvd3NlcmxpdGV8cXFicm93c2VyKVsvXShcZCsoXC4/Xz9cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKEQsdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvbXNpZXx0cmlkZW50L2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IkludGVybmV0IEV4cGxvcmVyIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/Om1zaWUgfHJ2OikoXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvXHNlZGdcLy9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJNaWNyb3NvZnQgRWRnZSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC9cc2VkZ1wvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL2VkZyhbZWFdfGlvcykvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiTWljcm9zb2Z0IEVkZ2UifSxlPWcuZ2V0U2Vjb25kTWF0Y2goL2VkZyhbZWFdfGlvcylcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy92aXZhbGRpL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IlZpdmFsZGkifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvdml2YWxkaVwvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL3NlYW1vbmtleS9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJTZWFNb25rZXkifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvc2VhbW9ua2V5XC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0Olsvc2FpbGZpc2gvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiU2FpbGZpc2gifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvc2FpbGZpc2hccz9icm93c2VyXC8oXGQrKFwuXGQrKT8pL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0Olsvc2lsay9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJBbWF6b24gU2lsayJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC9zaWxrXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvcGhhbnRvbS9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJQaGFudG9tSlMifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvcGhhbnRvbWpzXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0Olsvc2xpbWVyanMvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiU2xpbWVySlMifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvc2xpbWVyanNcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9ibGFja2JlcnJ5fFxiYmJcZCsvaSwvcmltXHN0YWJsZXQvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiQmxhY2tCZXJyeSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKEQsdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvYmxhY2tiZXJyeVtcZF0rXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvKHdlYnxocHcpW28wXXMvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiV2ViT1MgQnJvd3NlciJ9LGU9Zy5nZXRGaXJzdE1hdGNoKEQsdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvdyg/OmViKT9bbzBdc2Jyb3dzZXJcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9iYWRhL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IkJhZGEifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvZG9sZmluXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvdGl6ZW4vaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiVGl6ZW4ifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86dGl6ZW5ccz8pP2Jyb3dzZXJcLyhcZCsoXC4/Xz9cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKEQsdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvcXVwemlsbGEvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiUXVwWmlsbGEifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86cXVwemlsbGEpW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCl8fGcuZ2V0Rmlyc3RNYXRjaChELHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL2ZpcmVmb3h8aWNld2Vhc2VsfGZ4aW9zL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IkZpcmVmb3gifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86ZmlyZWZveHxpY2V3ZWFzZWx8Znhpb3MpW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvZWxlY3Ryb24vaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiRWxlY3Ryb24ifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86ZWxlY3Ryb24pXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvTWl1aUJyb3dzZXIvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiTWl1aSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzpNaXVpQnJvd3NlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9jaHJvbWl1bS9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJDaHJvbWl1bSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzpjaHJvbWl1bSlbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKEQsdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvY2hyb21lfGNyaW9zfGNybW8vaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiQ2hyb21lIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/OmNocm9tZXxjcmlvc3xjcm1vKVwvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL0dTQS9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJHb29nbGUgU2VhcmNoIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/OkdTQSlcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3QodCl7Y29uc3Qgcj0hdC50ZXN0KC9saWtlIGFuZHJvaWQvaSksZT10LnRlc3QoL2FuZHJvaWQvaSk7cmV0dXJuIHImJmV9LGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IkFuZHJvaWQgQnJvd3NlciJ9LGU9Zy5nZXRGaXJzdE1hdGNoKEQsdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvcGxheXN0YXRpb24gNC9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJQbGF5U3RhdGlvbiA0In0sZT1nLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9zYWZhcml8YXBwbGV3ZWJraXQvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiU2FmYXJpIn0sZT1nLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy8uKi9pXSxkZXNjcmliZSh0KXtjb25zdCByPS9eKC4qKVwvKC4qKSAvLGU9L14oLiopXC8oLiopWyBcdF1cKCguKikvLHM9dC5zZWFyY2goIlxcKCIpIT09LTE/ZTpyO3JldHVybntuYW1lOmcuZ2V0Rmlyc3RNYXRjaChzLHQpLHZlcnNpb246Zy5nZXRTZWNvbmRNYXRjaChzLHQpfX19XTt2YXIgZGQ9W3t0ZXN0OlsvUm9rdVwvRFZQL10sZGVzY3JpYmUodCl7Y29uc3Qgcj1nLmdldEZpcnN0TWF0Y2goL1Jva3VcL0RWUC0oXGQrXC5cZCspL2ksdCk7cmV0dXJue25hbWU6Ry5Sb2t1LHZlcnNpb246cn19fSx7dGVzdDpbL3dpbmRvd3MgcGhvbmUvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj1nLmdldEZpcnN0TWF0Y2goL3dpbmRvd3MgcGhvbmUgKD86b3MpP1xzPyhcZCsoXC5cZCspKikvaSx0KTtyZXR1cm57bmFtZTpHLldpbmRvd3NQaG9uZSx2ZXJzaW9uOnJ9fX0se3Rlc3Q6Wy93aW5kb3dzIC9pXSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvV2luZG93cyAoKE5UfFhQKSggXGRcZD8uXGQpPykvaSx0KSxlPWcuZ2V0V2luZG93c1ZlcnNpb25OYW1lKHIpO3JldHVybntuYW1lOkcuV2luZG93cyx2ZXJzaW9uOnIsdmVyc2lvbk5hbWU6ZX19fSx7dGVzdDpbL01hY2ludG9zaCguKj8pIEZ4aU9TKC4qPylcLy9dLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6Ry5pT1N9LGU9Zy5nZXRTZWNvbmRNYXRjaCgvKFZlcnNpb25cLykoXGRbXGQuXSspLyx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9tYWNpbnRvc2gvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj1nLmdldEZpcnN0TWF0Y2goL21hYyBvcyB4IChcZCsoXC4/Xz9cZCspKykvaSx0KS5yZXBsYWNlKC9bX1xzXS9nLCIuIiksZT1nLmdldE1hY09TVmVyc2lvbk5hbWUociksbj17bmFtZTpHLk1hY09TLHZlcnNpb246cn07cmV0dXJuIGUmJihuLnZlcnNpb25OYW1lPWUpLG59fSx7dGVzdDpbLyhpcG9kfGlwaG9uZXxpcGFkKS9pXSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvb3MgKFxkKyhbX1xzXVxkKykqKSBsaWtlIG1hYyBvcyB4L2ksdCkucmVwbGFjZSgvW19cc10vZywiLiIpO3JldHVybntuYW1lOkcuaU9TLHZlcnNpb246cn19fSx7dGVzdCh0KXtjb25zdCByPSF0LnRlc3QoL2xpa2UgYW5kcm9pZC9pKSxlPXQudGVzdCgvYW5kcm9pZC9pKTtyZXR1cm4gciYmZX0sZGVzY3JpYmUodCl7Y29uc3Qgcj1nLmdldEZpcnN0TWF0Y2goL2FuZHJvaWRbXHMvLV0oXGQrKFwuXGQrKSopL2ksdCksZT1nLmdldEFuZHJvaWRWZXJzaW9uTmFtZShyKSxuPXtuYW1lOkcuQW5kcm9pZCx2ZXJzaW9uOnJ9O3JldHVybiBlJiYobi52ZXJzaW9uTmFtZT1lKSxufX0se3Rlc3Q6Wy8od2VifGhwdylbbzBdcy9pXSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvKD86d2VifGhwdylbbzBdc1wvKFxkKyhcLlxkKykqKS9pLHQpLGU9e25hbWU6Ry5XZWJPU307cmV0dXJuIHImJnIubGVuZ3RoJiYoZS52ZXJzaW9uPXIpLGV9fSx7dGVzdDpbL2JsYWNrYmVycnl8XGJiYlxkKy9pLC9yaW1cc3RhYmxldC9pXSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvcmltXHN0YWJsZXRcc29zXHMoXGQrKFwuXGQrKSopL2ksdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvYmxhY2tiZXJyeVxkK1wvKFxkKyhbX1xzXVxkKykqKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goL1xiYmIoXGQrKS9pLHQpO3JldHVybntuYW1lOkcuQmxhY2tCZXJyeSx2ZXJzaW9uOnJ9fX0se3Rlc3Q6Wy9iYWRhL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9Zy5nZXRGaXJzdE1hdGNoKC9iYWRhXC8oXGQrKFwuXGQrKSopL2ksdCk7cmV0dXJue25hbWU6Ry5CYWRhLHZlcnNpb246cn19fSx7dGVzdDpbL3RpemVuL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9Zy5nZXRGaXJzdE1hdGNoKC90aXplblsvXHNdKFxkKyhcLlxkKykqKS9pLHQpO3JldHVybntuYW1lOkcuVGl6ZW4sdmVyc2lvbjpyfX19LHt0ZXN0OlsvbGludXgvaV0sZGVzY3JpYmUoKXtyZXR1cm57bmFtZTpHLkxpbnV4fX19LHt0ZXN0OlsvQ3JPUy9dLGRlc2NyaWJlKCl7cmV0dXJue25hbWU6Ry5DaHJvbWVPU319fSx7dGVzdDpbL1BsYXlTdGF0aW9uIDQvXSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvUGxheVN0YXRpb24gNFsvXHNdKFxkKyhcLlxkKykqKS9pLHQpO3JldHVybntuYW1lOkcuUGxheVN0YXRpb240LHZlcnNpb246cn19fV0sbGQ9W3t0ZXN0OlsvZ29vZ2xlYm90L2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6ImJvdCIsdmVuZG9yOiJHb29nbGUifX19LHt0ZXN0OlsvaHVhd2VpL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9Zy5nZXRGaXJzdE1hdGNoKC8oY2FuLWwwMSkvaSx0KSYmIk5vdmEiLGU9e3R5cGU6VS5tb2JpbGUsdmVuZG9yOiJIdWF3ZWkifTtyZXR1cm4gciYmKGUubW9kZWw9ciksZX19LHt0ZXN0OlsvbmV4dXNccyooPzo3fDh8OXwxMCkuKi9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOlUudGFibGV0LHZlbmRvcjoiTmV4dXMifX19LHt0ZXN0OlsvaXBhZC9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOlUudGFibGV0LHZlbmRvcjoiQXBwbGUiLG1vZGVsOiJpUGFkIn19fSx7dGVzdDpbL01hY2ludG9zaCguKj8pIEZ4aU9TKC4qPylcLy9dLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6VS50YWJsZXQsdmVuZG9yOiJBcHBsZSIsbW9kZWw6ImlQYWQifX19LHt0ZXN0Olsva2Z0dCBidWlsZC9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOlUudGFibGV0LHZlbmRvcjoiQW1hem9uIixtb2RlbDoiS2luZGxlIEZpcmUgSEQgNyJ9fX0se3Rlc3Q6Wy9zaWxrL2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6VS50YWJsZXQsdmVuZG9yOiJBbWF6b24ifX19LHt0ZXN0OlsvdGFibGV0KD8hIHBjKS9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOlUudGFibGV0fX19LHt0ZXN0KHQpe2NvbnN0IHI9dC50ZXN0KC9pcG9kfGlwaG9uZS9pKSxlPXQudGVzdCgvbGlrZSAoaXBvZHxpcGhvbmUpL2kpO3JldHVybiByJiYhZX0sZGVzY3JpYmUodCl7Y29uc3Qgcj1nLmdldEZpcnN0TWF0Y2goLyhpcG9kfGlwaG9uZSkvaSx0KTtyZXR1cm57dHlwZTpVLm1vYmlsZSx2ZW5kb3I6IkFwcGxlIixtb2RlbDpyfX19LHt0ZXN0OlsvbmV4dXNccypbMC02XS4qL2ksL2dhbGF4eSBuZXh1cy9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOlUubW9iaWxlLHZlbmRvcjoiTmV4dXMifX19LHt0ZXN0OlsvW14tXW1vYmkvaV0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpVLm1vYmlsZX19fSx7dGVzdCh0KXtyZXR1cm4gdC5nZXRCcm93c2VyTmFtZSghMCk9PT0iYmxhY2tiZXJyeSJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6VS5tb2JpbGUsdmVuZG9yOiJCbGFja0JlcnJ5In19fSx7dGVzdCh0KXtyZXR1cm4gdC5nZXRCcm93c2VyTmFtZSghMCk9PT0iYmFkYSJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6VS5tb2JpbGV9fX0se3Rlc3QodCl7cmV0dXJuIHQuZ2V0QnJvd3Nlck5hbWUoKT09PSJ3aW5kb3dzIHBob25lIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpVLm1vYmlsZSx2ZW5kb3I6Ik1pY3Jvc29mdCJ9fX0se3Rlc3QodCl7Y29uc3Qgcj1OdW1iZXIoU3RyaW5nKHQuZ2V0T1NWZXJzaW9uKCkpLnNwbGl0KCIuIilbMF0pO3JldHVybiB0LmdldE9TTmFtZSghMCk9PT0iYW5kcm9pZCImJnI+PTN9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6VS50YWJsZXR9fX0se3Rlc3QodCl7cmV0dXJuIHQuZ2V0T1NOYW1lKCEwKT09PSJhbmRyb2lkIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpVLm1vYmlsZX19fSx7dGVzdCh0KXtyZXR1cm4gdC5nZXRPU05hbWUoITApPT09Im1hY29zIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpVLmRlc2t0b3AsdmVuZG9yOiJBcHBsZSJ9fX0se3Rlc3QodCl7cmV0dXJuIHQuZ2V0T1NOYW1lKCEwKT09PSJ3aW5kb3dzIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpVLmRlc2t0b3B9fX0se3Rlc3QodCl7cmV0dXJuIHQuZ2V0T1NOYW1lKCEwKT09PSJsaW51eCJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6VS5kZXNrdG9wfX19LHt0ZXN0KHQpe3JldHVybiB0LmdldE9TTmFtZSghMCk9PT0icGxheXN0YXRpb24gNCJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6VS50dn19fSx7dGVzdCh0KXtyZXR1cm4gdC5nZXRPU05hbWUoITApPT09InJva3UifSxkZXNjcmliZSgpe3JldHVybnt0eXBlOlUudHZ9fX1dLHVkPVt7dGVzdCh0KXtyZXR1cm4gdC5nZXRCcm93c2VyTmFtZSghMCk9PT0ibWljcm9zb2Z0IGVkZ2UifSxkZXNjcmliZSh0KXtpZigvXHNlZGdcLy9pLnRlc3QodCkpcmV0dXJue25hbWU6b2UuQmxpbmt9O2NvbnN0IGU9Zy5nZXRGaXJzdE1hdGNoKC9lZGdlXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJue25hbWU6b2UuRWRnZUhUTUwsdmVyc2lvbjplfX19LHt0ZXN0OlsvdHJpZGVudC9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOm9lLlRyaWRlbnR9LGU9Zy5nZXRGaXJzdE1hdGNoKC90cmlkZW50XC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0KHQpe3JldHVybiB0LnRlc3QoL3ByZXN0by9pKX0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZTpvZS5QcmVzdG99LGU9Zy5nZXRGaXJzdE1hdGNoKC9wcmVzdG9cLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3QodCl7Y29uc3Qgcj10LnRlc3QoL2dlY2tvL2kpLGU9dC50ZXN0KC9saWtlIGdlY2tvL2kpO3JldHVybiByJiYhZX0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZTpvZS5HZWNrb30sZT1nLmdldEZpcnN0TWF0Y2goL2dlY2tvXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvKGFwcGxlKT93ZWJraXRcLzUzN1wuMzYvaV0sZGVzY3JpYmUoKXtyZXR1cm57bmFtZTpvZS5CbGlua319fSx7dGVzdDpbLyhhcHBsZSk/d2Via2l0L2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6b2UuV2ViS2l0fSxlPWcuZ2V0Rmlyc3RNYXRjaCgvd2Via2l0XC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19XTtjbGFzcyB4bntjb25zdHJ1Y3RvcihyLGU9ITEpe2lmKHI9PW51bGx8fHI9PT0iIil0aHJvdyBuZXcgRXJyb3IoIlVzZXJBZ2VudCBwYXJhbWV0ZXIgY2FuJ3QgYmUgZW1wdHkiKTt0aGlzLl91YT1yLHRoaXMucGFyc2VkUmVzdWx0PXt9LGUhPT0hMCYmdGhpcy5wYXJzZSgpfWdldFVBKCl7cmV0dXJuIHRoaXMuX3VhfXRlc3Qocil7cmV0dXJuIHIudGVzdCh0aGlzLl91YSl9cGFyc2VCcm93c2VyKCl7dGhpcy5wYXJzZWRSZXN1bHQuYnJvd3Nlcj17fTtjb25zdCByPWcuZmluZChjZCxlPT57aWYodHlwZW9mIGUudGVzdD09ImZ1bmN0aW9uIilyZXR1cm4gZS50ZXN0KHRoaXMpO2lmKGUudGVzdCBpbnN0YW5jZW9mIEFycmF5KXJldHVybiBlLnRlc3Quc29tZShuPT50aGlzLnRlc3QobikpO3Rocm93IG5ldyBFcnJvcigiQnJvd3NlcidzIHRlc3QgZnVuY3Rpb24gaXMgbm90IHZhbGlkIil9KTtyZXR1cm4gciYmKHRoaXMucGFyc2VkUmVzdWx0LmJyb3dzZXI9ci5kZXNjcmliZSh0aGlzLmdldFVBKCkpKSx0aGlzLnBhcnNlZFJlc3VsdC5icm93c2VyfWdldEJyb3dzZXIoKXtyZXR1cm4gdGhpcy5wYXJzZWRSZXN1bHQuYnJvd3Nlcj90aGlzLnBhcnNlZFJlc3VsdC5icm93c2VyOnRoaXMucGFyc2VCcm93c2VyKCl9Z2V0QnJvd3Nlck5hbWUocil7cmV0dXJuIHI/U3RyaW5nKHRoaXMuZ2V0QnJvd3NlcigpLm5hbWUpLnRvTG93ZXJDYXNlKCl8fCIiOnRoaXMuZ2V0QnJvd3NlcigpLm5hbWV8fCIifWdldEJyb3dzZXJWZXJzaW9uKCl7cmV0dXJuIHRoaXMuZ2V0QnJvd3NlcigpLnZlcnNpb259Z2V0T1MoKXtyZXR1cm4gdGhpcy5wYXJzZWRSZXN1bHQub3M/dGhpcy5wYXJzZWRSZXN1bHQub3M6dGhpcy5wYXJzZU9TKCl9cGFyc2VPUygpe3RoaXMucGFyc2VkUmVzdWx0Lm9zPXt9O2NvbnN0IHI9Zy5maW5kKGRkLGU9PntpZih0eXBlb2YgZS50ZXN0PT0iZnVuY3Rpb24iKXJldHVybiBlLnRlc3QodGhpcyk7aWYoZS50ZXN0IGluc3RhbmNlb2YgQXJyYXkpcmV0dXJuIGUudGVzdC5zb21lKG49PnRoaXMudGVzdChuKSk7dGhyb3cgbmV3IEVycm9yKCJCcm93c2VyJ3MgdGVzdCBmdW5jdGlvbiBpcyBub3QgdmFsaWQiKX0pO3JldHVybiByJiYodGhpcy5wYXJzZWRSZXN1bHQub3M9ci5kZXNjcmliZSh0aGlzLmdldFVBKCkpKSx0aGlzLnBhcnNlZFJlc3VsdC5vc31nZXRPU05hbWUocil7Y29uc3R7bmFtZTplfT10aGlzLmdldE9TKCk7cmV0dXJuIHI/U3RyaW5nKGUpLnRvTG93ZXJDYXNlKCl8fCIiOmV8fCIifWdldE9TVmVyc2lvbigpe3JldHVybiB0aGlzLmdldE9TKCkudmVyc2lvbn1nZXRQbGF0Zm9ybSgpe3JldHVybiB0aGlzLnBhcnNlZFJlc3VsdC5wbGF0Zm9ybT90aGlzLnBhcnNlZFJlc3VsdC5wbGF0Zm9ybTp0aGlzLnBhcnNlUGxhdGZvcm0oKX1nZXRQbGF0Zm9ybVR5cGUocj0hMSl7Y29uc3R7dHlwZTplfT10aGlzLmdldFBsYXRmb3JtKCk7cmV0dXJuIHI/U3RyaW5nKGUpLnRvTG93ZXJDYXNlKCl8fCIiOmV8fCIifXBhcnNlUGxhdGZvcm0oKXt0aGlzLnBhcnNlZFJlc3VsdC5wbGF0Zm9ybT17fTtjb25zdCByPWcuZmluZChsZCxlPT57aWYodHlwZW9mIGUudGVzdD09ImZ1bmN0aW9uIilyZXR1cm4gZS50ZXN0KHRoaXMpO2lmKGUudGVzdCBpbnN0YW5jZW9mIEFycmF5KXJldHVybiBlLnRlc3Quc29tZShuPT50aGlzLnRlc3QobikpO3Rocm93IG5ldyBFcnJvcigiQnJvd3NlcidzIHRlc3QgZnVuY3Rpb24gaXMgbm90IHZhbGlkIil9KTtyZXR1cm4gciYmKHRoaXMucGFyc2VkUmVzdWx0LnBsYXRmb3JtPXIuZGVzY3JpYmUodGhpcy5nZXRVQSgpKSksdGhpcy5wYXJzZWRSZXN1bHQucGxhdGZvcm19Z2V0RW5naW5lKCl7cmV0dXJuIHRoaXMucGFyc2VkUmVzdWx0LmVuZ2luZT90aGlzLnBhcnNlZFJlc3VsdC5lbmdpbmU6dGhpcy5wYXJzZUVuZ2luZSgpfWdldEVuZ2luZU5hbWUocil7cmV0dXJuIHI/U3RyaW5nKHRoaXMuZ2V0RW5naW5lKCkubmFtZSkudG9Mb3dlckNhc2UoKXx8IiI6dGhpcy5nZXRFbmdpbmUoKS5uYW1lfHwiIn1wYXJzZUVuZ2luZSgpe3RoaXMucGFyc2VkUmVzdWx0LmVuZ2luZT17fTtjb25zdCByPWcuZmluZCh1ZCxlPT57aWYodHlwZW9mIGUudGVzdD09ImZ1bmN0aW9uIilyZXR1cm4gZS50ZXN0KHRoaXMpO2lmKGUudGVzdCBpbnN0YW5jZW9mIEFycmF5KXJldHVybiBlLnRlc3Quc29tZShuPT50aGlzLnRlc3QobikpO3Rocm93IG5ldyBFcnJvcigiQnJvd3NlcidzIHRlc3QgZnVuY3Rpb24gaXMgbm90IHZhbGlkIil9KTtyZXR1cm4gciYmKHRoaXMucGFyc2VkUmVzdWx0LmVuZ2luZT1yLmRlc2NyaWJlKHRoaXMuZ2V0VUEoKSkpLHRoaXMucGFyc2VkUmVzdWx0LmVuZ2luZX1wYXJzZSgpe3JldHVybiB0aGlzLnBhcnNlQnJvd3NlcigpLHRoaXMucGFyc2VPUygpLHRoaXMucGFyc2VQbGF0Zm9ybSgpLHRoaXMucGFyc2VFbmdpbmUoKSx0aGlzfWdldFJlc3VsdCgpe3JldHVybiBnLmFzc2lnbih7fSx0aGlzLnBhcnNlZFJlc3VsdCl9c2F0aXNmaWVzKHIpe2NvbnN0IGU9e307bGV0IG49MDtjb25zdCBzPXt9O2xldCBpPTA7aWYoT2JqZWN0LmtleXMocikuZm9yRWFjaChkPT57Y29uc3Qgbz1yW2RdO3R5cGVvZiBvPT0ic3RyaW5nIj8oc1tkXT1vLGkrPTEpOnR5cGVvZiBvPT0ib2JqZWN0IiYmKGVbZF09byxuKz0xKX0pLG4+MCl7Y29uc3QgZD1PYmplY3Qua2V5cyhlKSxvPWcuZmluZChkLG09PnRoaXMuaXNPUyhtKSk7aWYobyl7Y29uc3QgbT10aGlzLnNhdGlzZmllcyhlW29dKTtpZihtIT09dm9pZCAwKXJldHVybiBtfWNvbnN0IGw9Zy5maW5kKGQsbT0+dGhpcy5pc1BsYXRmb3JtKG0pKTtpZihsKXtjb25zdCBtPXRoaXMuc2F0aXNmaWVzKGVbbF0pO2lmKG0hPT12b2lkIDApcmV0dXJuIG19fWlmKGk+MCl7Y29uc3QgZD1PYmplY3Qua2V5cyhzKSxvPWcuZmluZChkLGw9PnRoaXMuaXNCcm93c2VyKGwsITApKTtpZihvIT09dm9pZCAwKXJldHVybiB0aGlzLmNvbXBhcmVWZXJzaW9uKHNbb10pfX1pc0Jyb3dzZXIocixlPSExKXtjb25zdCBuPXRoaXMuZ2V0QnJvd3Nlck5hbWUoKS50b0xvd2VyQ2FzZSgpO2xldCBzPXIudG9Mb3dlckNhc2UoKTtjb25zdCBpPWcuZ2V0QnJvd3NlclR5cGVCeUFsaWFzKHMpO3JldHVybiBlJiZpJiYocz1pLnRvTG93ZXJDYXNlKCkpLHM9PT1ufWNvbXBhcmVWZXJzaW9uKHIpe2xldCBlPVswXSxuPXIscz0hMTtjb25zdCBpPXRoaXMuZ2V0QnJvd3NlclZlcnNpb24oKTtpZih0eXBlb2YgaT09InN0cmluZyIpcmV0dXJuIHJbMF09PT0iPiJ8fHJbMF09PT0iPCI/KG49ci5zdWJzdHIoMSksclsxXT09PSI9Ij8ocz0hMCxuPXIuc3Vic3RyKDIpKTplPVtdLHJbMF09PT0iPiI/ZS5wdXNoKDEpOmUucHVzaCgtMSkpOnJbMF09PT0iPSI/bj1yLnN1YnN0cigxKTpyWzBdPT09In4iJiYocz0hMCxuPXIuc3Vic3RyKDEpKSxlLmluZGV4T2YoZy5jb21wYXJlVmVyc2lvbnMoaSxuLHMpKT4tMX1pc09TKHIpe3JldHVybiB0aGlzLmdldE9TTmFtZSghMCk9PT1TdHJpbmcocikudG9Mb3dlckNhc2UoKX1pc1BsYXRmb3JtKHIpe3JldHVybiB0aGlzLmdldFBsYXRmb3JtVHlwZSghMCk9PT1TdHJpbmcocikudG9Mb3dlckNhc2UoKX1pc0VuZ2luZShyKXtyZXR1cm4gdGhpcy5nZXRFbmdpbmVOYW1lKCEwKT09PVN0cmluZyhyKS50b0xvd2VyQ2FzZSgpfWlzKHIsZT0hMSl7cmV0dXJuIHRoaXMuaXNCcm93c2VyKHIsZSl8fHRoaXMuaXNPUyhyKXx8dGhpcy5pc1BsYXRmb3JtKHIpfXNvbWUocj1bXSl7cmV0dXJuIHIuc29tZShlPT50aGlzLmlzKGUpKX19LyohCiAqIEJvd3NlciAtIGEgYnJvd3NlciBkZXRlY3RvcgogKiBodHRwczovL2dpdGh1Yi5jb20vbGFuY2VkaWtzb24vYm93c2VyCiAqIE1JVCBMaWNlbnNlIHwgKGMpIER1c3RpbiBEaWF6IDIwMTItMjAxNQogKiBNSVQgTGljZW5zZSB8IChjKSBEZW5pcyBEZW1jaGVua28gMjAxNS0yMDE5CiAqL2NsYXNzIHBke3N0YXRpYyBnZXRQYXJzZXIocixlPSExKXtpZih0eXBlb2YgciE9InN0cmluZyIpdGhyb3cgbmV3IEVycm9yKCJVc2VyQWdlbnQgc2hvdWxkIGJlIGEgc3RyaW5nIik7cmV0dXJuIG5ldyB4bihyLGUpfXN0YXRpYyBwYXJzZShyKXtyZXR1cm4gbmV3IHhuKHIpLmdldFJlc3VsdCgpfXN0YXRpYyBnZXQgQlJPV1NFUl9NQVAoKXtyZXR1cm4gQm59c3RhdGljIGdldCBFTkdJTkVfTUFQKCl7cmV0dXJuIG9lfXN0YXRpYyBnZXQgT1NfTUFQKCl7cmV0dXJuIEd9c3RhdGljIGdldCBQTEFURk9STVNfTUFQKCl7cmV0dXJuIFV9fWNvbnN0IE5lPSJjaHJvbWUiLGpuPSJvcGVyYSIsVW49ImZpcmVmb3giLEhuPSJpZXhwbG9yZXIiLEtuPSJzYWZhcmkiLCRuPSJud2pzIixXbj0iZWxlY3Ryb24iLHpuPSJyZWFjdC1uYXRpdmUiLHF0PSJ1bmtub3duIixQdD17Q2hyb21lOk5lLENocm9taXVtOk5lLE9wZXJhOmpuLEZpcmVmb3g6VW4sIkludGVybmV0IEV4cGxvcmVyIjpIbixTYWZhcmk6S259O2Z1bmN0aW9uIGhkKCl7Y29uc3R7dXNlckFnZW50OnR9PW5hdmlnYXRvcixyPXtuYW1lOnF0LHZlcnNpb246dm9pZCAwfTtpZih0Lm1hdGNoKC9DaHJvbWUvKSYmIXQubWF0Y2goL0VkZ2UvKSlpZih0Lm1hdGNoKC9FZGcoQT8pLykpe2NvbnN0IGU9dC5tYXRjaCgvQ2hyb21lXC8oW1xkLl0rKS8pWzFdO051bWJlci5wYXJzZUludChlLDEwKT43MiYmKHIubmFtZT1OZSxyLnZlcnNpb249ZSl9ZWxzZSByLm5hbWU9TmUsci52ZXJzaW9uPXQubWF0Y2goL0Nocm9tZVwvKFtcZC5dKykvKVsxXTtyZXR1cm4gcn1mdW5jdGlvbiBmZCgpe2NvbnN0e3VzZXJBZ2VudDp0fT1uYXZpZ2F0b3I7aWYodC5tYXRjaCgvRWxlY3Ryb24vKSl7Y29uc3Qgcj10Lm1hdGNoKC9FbGVjdHJvblwvKFtcZC5dKykvKVsxXTtyZXR1cm57bmFtZTpXbix2ZXJzaW9uOnJ9fXJldHVybiBudWxsfWZ1bmN0aW9uIG1kKCl7Y29uc3R7dXNlckFnZW50OnR9PW5hdmlnYXRvcjtpZih0Lm1hdGNoKC9KaXRzaU1lZXROVy8pKXtjb25zdCByPXQubWF0Y2goL0ppdHNpTWVldE5XXC8oW1xkLl0rKS8pWzFdO3JldHVybntuYW1lOiRuLHZlcnNpb246cn19fWZ1bmN0aW9uIGdkKCl7Y29uc3QgdD1uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9cYihyZWFjdFsgXHRfLV0qbmF0aXZlKSg/OlwvKFxTKykpPy9pKTtsZXQgcjtpZih0fHxuYXZpZ2F0b3IucHJvZHVjdD09PSJSZWFjdE5hdGl2ZSIpcmV0dXJuIHQmJnQubGVuZ3RoPjImJih0WzFdLHI9dFsyXSkscnx8KHI9InVua25vd24iKSx7bmFtZTp6bix2ZXJzaW9uOnJ9fWZ1bmN0aW9uIFNkKHQpe2xldCByO2NvbnN0IGU9W2dkLGZkLG1kXTtmb3IobGV0IHM9MDtzPGUubGVuZ3RoO3MrPTEpaWYocj1lW3NdKCkscilyZXR1cm4gcjtjb25zdCBuPXQuZ2V0QnJvd3Nlck5hbWUoKTtyZXR1cm4gbiBpbiBQdD97bmFtZTpQdFtuXSx2ZXJzaW9uOnQuZ2V0QnJvd3NlclZlcnNpb24oKX06KHI9aGQoKSxyfHx7bmFtZTpxdCx2ZXJzaW9uOnZvaWQgMH0pfWNsYXNzIHZke2NvbnN0cnVjdG9yKCl7cCh0aGlzLCJfYm93c2VyIik7cCh0aGlzLCJfbmFtZSIpO3AodGhpcywiX3ZlcnNpb24iKTtwKHRoaXMsImdldERldmljZUluZm8iLCgpPT4oe2lzTW9iaWxlOnRoaXMuaXNNb2JpbGUoKSxicm93c2VyTmFtZTp0aGlzLl9ib3dzZXIuZ2V0QnJvd3Nlck5hbWUoKSxvc05hbWU6dGhpcy5fYm93c2VyLmdldE9TTmFtZSgpLGJyb3dzZXJWZXJzaW9uOnRoaXMuX2Jvd3Nlci5nZXRCcm93c2VyVmVyc2lvbigpLG9zVmVyc2lvbk5hbWU6dGhpcy5fYm93c2VyLmdldE9TVmVyc2lvbigpLGVuZ2luZU5hbWU6dGhpcy5fYm93c2VyLmdldEVuZ2luZU5hbWUoKX0pKX1pbml0KHIpe2xldCBlLG47aWYodGhpcy5fYm93c2VyPXBkLmdldFBhcnNlcihuYXZpZ2F0b3IudXNlckFnZW50KSx0eXBlb2Ygcj09InVuZGVmaW5lZCIpe2NvbnN0IHM9U2QodGhpcy5fYm93c2VyKTtlPXMubmFtZSxuPXMudmVyc2lvbn1lbHNlIHIubmFtZSBpbiBQdD8oZT1QdFtyLm5hbWVdLG49ci52ZXJzaW9uKTooZT1xdCxuPXZvaWQgMCk7dGhpcy5fbmFtZT1lLHRoaXMuX3ZlcnNpb249bn1nZXROYW1lKCl7cmV0dXJuIHRoaXMuX25hbWV9aXNDaHJvbWUoKXtyZXR1cm4gdGhpcy5fbmFtZT09PU5lfWlzT3BlcmEoKXtyZXR1cm4gdGhpcy5fbmFtZT09PWpufWlzRmlyZWZveCgpe3JldHVybiB0aGlzLl9uYW1lPT09VW59aXNJRXhwbG9yZXIoKXtyZXR1cm4gdGhpcy5fbmFtZT09PUhufWlzU2FmYXJpKCl7cmV0dXJuIHRoaXMuX25hbWU9PT1Lbn1pc05XSlMoKXtyZXR1cm4gdGhpcy5fbmFtZT09PSRufWlzRWxlY3Ryb24oKXtyZXR1cm4gdGhpcy5fbmFtZT09PVdufWlzUmVhY3ROYXRpdmUoKXtyZXR1cm4gdGhpcy5fbmFtZT09PXpufHxuYXZpZ2F0b3IuaXNSZWFjdE5hdGl2ZT09PSEwfWdldFZlcnNpb24oKXtyZXR1cm4gdGhpcy5fdmVyc2lvbn1pc01vYmlsZSgpe3JldHVybiB0aGlzLl9ib3dzZXIuZ2V0UGxhdGZvcm1UeXBlKCk9PT0ibW9iaWxlIn1fY2hlY2tDb25kaXRpb24ocil7aWYodGhpcy5fdmVyc2lvbilyZXR1cm4gdGhpcy5fYm93c2VyLnNhdGlzZmllcyhyKX1pc1ZlcnNpb25HcmVhdGVyVGhhbihyKXtyZXR1cm4gdGhpcy5fY2hlY2tDb25kaXRpb24oe1t0aGlzLl9uYW1lXTpgPiR7cn1gfSl9aXNWZXJzaW9uTGVzc1RoYW4ocil7cmV0dXJuIHRoaXMuX2NoZWNrQ29uZGl0aW9uKHtbdGhpcy5fbmFtZV06YDwke3J9YH0pfWlzVmVyc2lvbkVxdWFsVG8ocil7cmV0dXJuIHRoaXMuX2NoZWNrQ29uZGl0aW9uKHtbdGhpcy5fbmFtZV06YH4ke3J9YH0pfX1jbGFzcyB5ZCBleHRlbmRzIHZke2RvZXNWaWRlb011dGVCeVN0cmVhbVJlbW92ZSgpe3JldHVybiB0aGlzLmlzQ2hyb21pdW1CYXNlZCgpfHx0aGlzLmlzV2ViS2l0QmFzZWQoKX1zdXBwb3J0c1AyUCgpe3JldHVybiF0aGlzLnVzZXNVbmlmaWVkUGxhbigpfWlzQ2hyb21pdW1CYXNlZCgpe3JldHVybiB0aGlzLmlzQ2hyb21lKCl8fHRoaXMuaXNFbGVjdHJvbigpfHx0aGlzLmlzTldKUygpfHx0aGlzLmlzT3BlcmEoKX1pc1dlYktpdEJhc2VkKCl7cmV0dXJuIHRoaXMuX2Jvd3Nlci5pc0VuZ2luZSgid2Via2l0IikmJnR5cGVvZiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzIT0idW5kZWZpbmVkIiYmdHlwZW9mIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhIT0idW5kZWZpbmVkIiYmdHlwZW9mIHdpbmRvdy5SVENSdHBUcmFuc2NlaXZlciE9InVuZGVmaW5lZCImJk9iamVjdC5rZXlzKFJUQ1J0cFRyYW5zY2VpdmVyLnByb3RvdHlwZSkuaW5kZXhPZigiY3VycmVudERpcmVjdGlvbiIpPi0xfWlzU3VwcG9ydGVkKCl7cmV0dXJuIHR5cGVvZiBSVENQZWVyQ29ubmVjdGlvbiE9InVuZGVmaW5lZCJ9aXNVc2VySW50ZXJhY3Rpb25SZXF1aXJlZEZvclVubXV0ZSgpe3JldHVybiB0aGlzLmlzRmlyZWZveCgpJiZ0aGlzLmlzVmVyc2lvbkxlc3NUaGFuKCI2OCIpfXN1cHBvcnRzVmlkZW9NdXRlT25Db25uSW50ZXJydXB0ZWQoKXtyZXR1cm4gdGhpcy5pc0Nocm9taXVtQmFzZWQoKXx8dGhpcy5pc1JlYWN0TmF0aXZlKCl8fHRoaXMuaXNXZWJLaXRCYXNlZCgpfXN1cHBvcnRzQmFuZHdpZHRoU3RhdGlzdGljcygpe3JldHVybiF0aGlzLmlzRmlyZWZveCgpJiYhdGhpcy5pc1dlYktpdEJhc2VkKCl9c3VwcG9ydHNDb2RlY1ByZWZlcmVuY2VzKCl7cmV0dXJuIHRoaXMudXNlc1VuaWZpZWRQbGFuKCkmJnR5cGVvZiB3aW5kb3cuUlRDUnRwVHJhbnNjZWl2ZXIhPSJ1bmRlZmluZWQiJiZPYmplY3Qua2V5cyh3aW5kb3cuUlRDUnRwVHJhbnNjZWl2ZXIucHJvdG90eXBlKS5pbmRleE9mKCJzZXRDb2RlY1ByZWZlcmVuY2VzIik+LTEmJk9iamVjdC5rZXlzKFJUQ1J0cFNlbmRlci5wcm90b3R5cGUpLmluZGV4T2YoImdldENhcGFiaWxpdGllcyIpPi0xJiYhdGhpcy5pc1dlYktpdEJhc2VkKCl9c3VwcG9ydHNEZXZpY2VDaGFuZ2VFdmVudCgpe3JldHVybiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzJiZ0eXBlb2YgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5vbmRldmljZWNoYW5nZSE9InVuZGVmaW5lZCImJnR5cGVvZiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmFkZEV2ZW50TGlzdGVuZXIhPSJ1bmRlZmluZWQifXN1cHBvcnRzTG9jYWxDYW5kaWRhdGVSdHRTdGF0aXN0aWNzKCl7cmV0dXJuIHRoaXMuaXNDaHJvbWl1bUJhc2VkKCl8fHRoaXMuaXNSZWFjdE5hdGl2ZSgpfHx0aGlzLmlzV2ViS2l0QmFzZWQoKX1zdXBwb3J0c1BlcmZvcm1hbmNlT2JzZXJ2ZXIoKXtyZXR1cm4gdHlwZW9mIHdpbmRvdy5QZXJmb3JtYW5jZU9ic2VydmVyIT0idW5kZWZpbmVkIiYmUGVyZm9ybWFuY2VPYnNlcnZlci5zdXBwb3J0ZWRFbnRyeVR5cGVzLmluZGV4T2YoImxvbmd0YXNrIik+LTF9c3VwcG9ydHNSZWNlaXZlclN0YXRzKCl7cmV0dXJuIHR5cGVvZiB3aW5kb3cuUlRDUnRwUmVjZWl2ZXIhPSJ1bmRlZmluZWQiJiZPYmplY3Qua2V5cyhSVENSdHBSZWNlaXZlci5wcm90b3R5cGUpLmluZGV4T2YoImdldFN5bmNocm9uaXphdGlvblNvdXJjZXMiKT4tMX1zdXBwb3J0c1JUVFN0YXRpc3RpY3MoKXtyZXR1cm4hdGhpcy5pc0ZpcmVmb3goKX11c2VzUGxhbkIoKXtyZXR1cm4hdGhpcy51c2VzVW5pZmllZFBsYW4oKX11c2VzU2RwTXVuZ2luZ0ZvclNpbXVsY2FzdCgpe3JldHVybiB0aGlzLmlzQ2hyb21pdW1CYXNlZCgpfHx0aGlzLmlzUmVhY3ROYXRpdmUoKXx8dGhpcy5pc1dlYktpdEJhc2VkKCl9dXNlc1VuaWZpZWRQbGFuKCl7cmV0dXJuISEodGhpcy5pc0ZpcmVmb3goKXx8dGhpcy5pc1dlYktpdEJhc2VkKCkpfXVzZXNOZXdHdW1GbG93KCl7cmV0dXJuISEodGhpcy5pc0Nocm9taXVtQmFzZWQoKXx8dGhpcy5pc0ZpcmVmb3goKXx8dGhpcy5pc1dlYktpdEJhc2VkKCkpfXVzZXNBZGFwdGVyKCl7cmV0dXJuIHRoaXMudXNlc05ld0d1bUZsb3coKX11c2VzUmlkc0ZvclNpbXVsY2FzdCgpe3JldHVybiExfXN1cHBvcnRzR2V0RGlzcGxheU1lZGlhKCl7cmV0dXJuIHR5cGVvZiBuYXZpZ2F0b3IuZ2V0RGlzcGxheU1lZGlhIT0idW5kZWZpbmVkInx8dHlwZW9mIG5hdmlnYXRvci5tZWRpYURldmljZXMhPSJ1bmRlZmluZWQiJiZ0eXBlb2YgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXREaXNwbGF5TWVkaWEhPSJ1bmRlZmluZWQifXN1cHBvcnRzSW5zZXJ0YWJsZVN0cmVhbXMoKXtpZighKHR5cGVvZiB3aW5kb3cuUlRDUnRwU2VuZGVyIT0idW5kZWZpbmVkIiYmKHdpbmRvdy5SVENSdHBTZW5kZXIucHJvdG90eXBlLmNyZWF0ZUVuY29kZWRTdHJlYW1zfHx3aW5kb3cuUlRDUnRwU2VuZGVyLnByb3RvdHlwZS5jcmVhdGVFbmNvZGVkVmlkZW9TdHJlYW1zKSkpcmV0dXJuITE7Y29uc3Qgcj1uZXcgUmVhZGFibGVTdHJlYW07dHJ5e3JldHVybiB3aW5kb3cucG9zdE1lc3NhZ2UociwiKiIsW3JdKSwhMH1jYXRjaChlKXtyZXR1cm4hMX19c3VwcG9ydHNBdWRpb1JlZCgpe3JldHVybiBCb29sZWFuKHdpbmRvdy5SVENSdHBTZW5kZXImJndpbmRvdy5SVENSdHBTZW5kZXIuZ2V0Q2FwYWJpbGl0aWVzJiZ3aW5kb3cuUlRDUnRwU2VuZGVyLmdldENhcGFiaWxpdGllcygiYXVkaW8iKS5jb2RlY3Muc29tZShyPT5yLm1pbWVUeXBlPT09ImF1ZGlvL3JlZCIpJiZ3aW5kb3cuUlRDUnRwUmVjZWl2ZXImJndpbmRvdy5SVENSdHBSZWNlaXZlci5nZXRDYXBhYmlsaXRpZXMmJndpbmRvdy5SVENSdHBSZWNlaXZlci5nZXRDYXBhYmlsaXRpZXMoImF1ZGlvIikuY29kZWNzLnNvbWUocj0+ci5taW1lVHlwZT09PSJhdWRpby9yZWQiKSl9c3VwcG9ydHNTZHBTZW1hbnRpY3MoKXtyZXR1cm4gdGhpcy5pc0Nocm9taXVtQmFzZWQoKX1fZ2V0Q2hyb21pdW1CYXNlZFZlcnNpb24oKXtpZih0aGlzLmlzQ2hyb21pdW1CYXNlZCgpKXtpZih0aGlzLmlzTldKUygpKXJldHVybiBOdW1iZXIucGFyc2VJbnQocHJvY2Vzcy52ZXJzaW9ucy5jaHJvbWl1bSwxMCk7Y29uc3Qgcj1uYXZpZ2F0b3IudXNlckFnZW50O2lmKHIubWF0Y2goL0Nocm9tZS8pKXJldHVybiBOdW1iZXIucGFyc2VJbnQoci5tYXRjaCgvQ2hyb21lXC8oW1xkLl0rKS8pWzFdLDEwKX1yZXR1cm4tMX1pc0lPU01vYmlsZSgpe3JldHVybiB0aGlzLmlzTW9iaWxlJiZ0aGlzLl9ib3dzZXIuZ2V0T1NOYW1lKCk9PT0iaU9TIn19Y29uc3QgYmQ9bmV3IHlkLG5yPWNsYXNze2NvbnN0cnVjdG9yKCl7cCh0aGlzLCJsb2dzQ2FjaGUiLFtdKTtwKHRoaXMsImxvZ3NQcm9jZXNzb3JUaW1lciIpO3AodGhpcywidHJhY2luZ0VuYWJsZWQiLCEwKTtwKHRoaXMsImluaXRpYWxpemVkIiwhMSk7cCh0aGlzLCJsb2dzUHJvY2Vzc2luZ0ludGVydmFsIiw3ZTMpO3AodGhpcywibG9nRXhjbHVzaW9uTGlzdCIsWyJtZXNzYWdlIiwid2Vic29ja2V0L21lc3NhZ2UiLCJyb29tTWVzc2FnZSIsIndlYnNvY2tldC9yb29tLW1lc3NhZ2UiLCJ3ZWJzb2NrZXQvcm9vbS1sZWdhY3ktbW9kZSIsImNoYXRNZXNzYWdlIiwid2Vic29ja2V0L25ldy1jaGF0LW1lc3NhZ2UiLCJ3ZWJzb2NrZXQvbm8tYWN0aXZlLXNwZWFrZXIiLCJ3ZWJzb2NrZXQvc2VsZWN0ZWQtcGVlcnMiLCJ3ZWJzb2NrZXQvYWN0aXZlLXNwZWFrZXIiLCJwaW5nIiwid2Vic29ja2V0L25ldy1jb25zdW1lciIsIndlYnNvY2tldC9wcm9kdWNlci1zY29yZSIsIndlYnNvY2tldC9jb25zdW1lci1zY29yZSIsIndlYnNvY2tldC9wbHVnaW4tZXZlbnQiLCJ3ZWJzb2NrZXQvcGx1Z2luLWRhdGEiLCJ3ZWJzb2NrZXQvcGx1Z2luLWludGVybmFsLWRhdGEiXSk7cCh0aGlzLCJtZWV0aW5nTWV0YWRhdGEiLHt9KX1nZXQgbG9nc0VuZHBvaW50KCl7Y29uc3Qgcj1QZS5nZXRDb250ZXh0KHRoaXMubWVldGluZ01ldGFkYXRhLnBlZXJJZCk7cmV0dXJuYGh0dHBzOi8vJHtuZCh7c2VydmljZVByZWZpeDoiYXBpLXNpbG9zIixiYXNlVVJJOnIuZ2V0VmFsdWUoImJhc2VVUkkiKX0pfS9vdGVsL2xvZ3NgfXJlc2V0UGVlcklkKHIpe3RoaXMubWVldGluZ01ldGFkYXRhLnBlZXJJZD1yfWluaXQocixlLG4pe3RoaXMudHJhY2luZ0VuYWJsZWQ9ITAsdGhpcy5pbml0aWFsaXplZD0hMSx0aGlzLmxvZ3NDYWNoZT1bXTtjb25zdCBzPXIuZ2V0VmFsdWUoInBlZXJJZCIpO3RoaXMubWVldGluZ01ldGFkYXRhPWUsdGhpcy50cmFjaW5nRW5hYmxlZD1uLHRoaXMubWVldGluZ01ldGFkYXRhLnBlZXJJZD1zLHRoaXMubWVldGluZ01ldGFkYXRhLnNka1ZlcnNpb249ci5nZXRWYWx1ZSgic2RrVmVyc2lvbiIpO2NvbnN0e1JORGV2aWNlSW5mb0ltcGw6aX09bmF2aWdhdG9yO3RoaXMubWVldGluZ01ldGFkYXRhLmRldmljZUluZm89bmF2aWdhdG9yLmlzUmVhY3ROYXRpdmU/aT09bnVsbD92b2lkIDA6aS5nZXREZXZpY2VJbmZvKCk6YmQuZ2V0RGV2aWNlSW5mbygpLHRoaXMubWVldGluZ01ldGFkYXRhLnZpc2l0ZWRVcmw9IW5hdmlnYXRvci5pc1JlYWN0TmF0aXZlJiZ0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmd2luZG93LmxvY2F0aW9uLmhyZWYsdGhpcy5sb2dzUHJvY2Vzc29yVGltZXI9c2V0SW50ZXJ2YWwodGhpcy5wcm9jZXNzQ2FjaGVkTG9ncy5iaW5kKHRoaXMpLHRoaXMubG9nc1Byb2Nlc3NpbmdJbnRlcnZhbCksbiYmKHRoaXMuaW5pdGlhbGl6ZWQ9ITApfXN0YXRpYyB0cmFjZShyLGU9dm9pZCAwKXtyZXR1cm4obixzLGkpPT57Y29uc3QgYT1pLnZhbHVlO3JldHVybiBpLnZhbHVlPWZ1bmN0aW9uKC4uLm8pe3ZhciBFO2NvbnN0IGw9dGhpcz09bnVsbD92b2lkIDA6dGhpcy50ZWxlbWV0cnk7aWYoIWx8fCFsLmluaXRpYWxpemVkfHxuYXZpZ2F0b3IuaXNSZWFjdE5hdGl2ZXx8IWwudHJhY2luZ0VuYWJsZWR8fChFPVBlLmdldENvbnRleHQobC5tZWV0aW5nTWV0YWRhdGEucGVlcklkKSkhPW51bGwmJkUuZ2V0VmFsdWUoImZsYWdzbWl0aCIpLmhhc0ZlYXR1cmUoR3QuU0tJUF9PVEVMX1RSQUNFUykpcmV0dXJuIGEuYXBwbHkodGhpcyxvKTtsLmFkZExvZ0luQ3VycmVudFNwYW4oImluZm8iLHIsZSk7Y29uc3QgbT1wZXJmb3JtYW5jZS5ub3coKSx2PWEuYXBwbHkodGhpcyxvKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oKCk9Pntjb25zdCBJPXBlcmZvcm1hbmNlLm5vdygpO0ktbT4xMCYmbC5hZGRMb2dJbkN1cnJlbnRTcGFuKCJpbmZvIixgJHtyfV90aW1pbmdgLHtleGVjVGltZTpJLW0sY291bnRyeTpuci5sb2NhdGlvbi5jb3VudHJ5fSl9KS5jYXRjaCgoKT0+e2NvbnN0IEk9cGVyZm9ybWFuY2Uubm93KCk7bC5hZGRMb2dJbkN1cnJlbnRTcGFuKCJpbmZvIixgJHtyfV90aW1pbmdgLHtleGVjVGltZTpJLW19KX0pLHZ9LGl9fWluamVjdENvbnRleHQocil7dmFyIHM7Y29uc3QgZT1KYygpLnJlcGxhY2UoLy0vZywiIikuc3Vic3RyaW5nKDAsMTYpLG49KHM9dGhpcy5tZWV0aW5nTWV0YWRhdGEucGVlcklkKT09bnVsbD92b2lkIDA6cy5yZXBsYWNlKC8tL2csIiIpO3IuVFJBQ0VQQVJFTlQ9YDAwLSR7bn0tJHtlfS0wMWB9YWRkTG9nSW5DdXJyZW50U3BhbihyLGUsbj17fSxzPSExKXtuIT1udWxsJiZuLmVycm9yJiZPYmplY3QuYXNzaWduKG4se2Vycm9yOlJ0KG4uZXJyb3IpfSk7Y29uc3QgaT1QZS5nZXRDb250ZXh0KHRoaXMubWVldGluZ01ldGFkYXRhLnBlZXJJZCk7aWYoaWQoaSkmJihyZChuKT9jb25zb2xlW3JdKCJJbnRlcm5hbExvZ3M6OiAiLHIsZSk6Y29uc29sZVtyXSgiSW50ZXJuYWxMb2dzOjogIixyLGUsbikpLCEhYWQoaSxyKSl0cnl7Y29uc3QgZD1GbihpLGUsbiwibWV0YWRhdGEiKSxvPW5ldyBEYXRlLGw9b3QoUSh7bWVzc2FnZTplLGxldmVsOnJ9LGQpLHtsb2dnZWRBdDpvLnRvSVNPU3RyaW5nKCksbG9nZ2VkQXRUek9mZnNldDpvLmdldFRpbWV6b25lT2Zmc2V0KCl9KTtzP3RoaXMuc2VuZE90ZWxMb2dzVG9OZXdSZWxpYyhbbF0pOnRoaXMubG9nc0NhY2hlLnB1c2gobCl9Y2F0Y2goZCl7dGhpcy5hZGRMb2dJbkN1cnJlbnRTcGFuKCJlcnJvciIsIm9wZW50ZWxlbWV0cnk6OmFkZExvZ0luQ3VycmVudFNwYW5fZmFpbGVkIix7ZXJyb3I6UnQoZCl9KX19c2VuZE90ZWxMb2dzVG9OZXdSZWxpYyhyKXtjb25zdCBlPVBlLmdldENvbnRleHQodGhpcy5tZWV0aW5nTWV0YWRhdGEucGVlcklkKTtmZXRjaCh0aGlzLmxvZ3NFbmRwb2ludCx7bWV0aG9kOiJQT1NUIixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiJ9LGJvZHk6SlNPTi5zdHJpbmdpZnkoe21lZXRpbmdNZXRhZGF0YTpGbihlLCJzZW5kT3RlbExvZ3NUb05ld1JlbGljIix0aGlzLm1lZXRpbmdNZXRhZGF0YSwibWVldGluZ01ldGFkYXRhIiksc2VydmljZU5hbWU6ZS5nZXRWYWx1ZSgic2RrTmFtZSIpLGxvZ3M6cn0pfSkuY2F0Y2gobj0+e3RoaXMuYWRkTG9nSW5DdXJyZW50U3BhbigiZXJyb3IiLCJvcGVudGVsZW1ldHJ5OjpzZW5kT3RlbExvZ1RvTmV3UmVsaWNfZmFpbGVkIix7ZXJyb3I6UnQobil9KSx0aGlzLmxvZ3NDYWNoZS5wdXNoKC4uLnIpfSl9cHJvY2Vzc0NhY2hlZExvZ3MoKXtjb25zdCByPXRoaXMubG9nc0NhY2hlLnNwbGljZSgwLDI1KTtyIT1udWxsJiZyLmxlbmd0aCYmdGhpcy5zZW5kT3RlbExvZ3NUb05ld1JlbGljKHIpfWRlc3RydWN0KCl7Y2xlYXJJbnRlcnZhbCh0aGlzLmxvZ3NQcm9jZXNzb3JUaW1lciksdGhpcy5wcm9jZXNzQ2FjaGVkTG9ncygpfX07bGV0IEN0PW5yO3AoQ3QsImxvY2F0aW9uIix7Y291bnRyeTp2b2lkIDB9KTtmdW5jdGlvbiBFZCh0KXtjb25zdCByPVEoe30sdCksZT1uZXcgTWFwLG49KGwsbSk9PihlLmhhcyhsKXx8ZS5zZXQobCxuZXcgU2V0KSxlLmdldChsKS5hZGQobSksKCk9Pnt2YXIgdjtyZXR1cm4odj1lLmdldChsKSk9PW51bGw/dm9pZCAwOnYuZGVsZXRlKG0pfSkscz0obCxtKT0+e3ZhciB2Oyh2PWUuZ2V0KGwpKT09bnVsbHx8di5kZWxldGUobSl9LGk9bD0+e3ZhciBtOyhtPWUuZ2V0KGwpKT09bnVsbHx8bS5mb3JFYWNoKHY9Pnt0cnl7dihyW2xdKX1jYXRjaChFKXt9fSl9O3JldHVybntzdWJzY3JpYmU6bix1bnN1YnNjcmliZTpzLG5vdGlmeTppLHNldFZhbHVlOihsLG0sdj0hMCk9PntyW2xdPW0sdiYmaShsKX0sZ2V0VmFsdWU6bD0+cltsXSxnZXRBbGxWYWx1ZXM6KCk9PnJ9fWNsYXNzIF9ke2NvbnN0cnVjdG9yKCl7cCh0aGlzLCJjb250ZXh0cyIsbmV3IE1hcCk7cCh0aGlzLCJtb3N0UmVjZW50UGVlcklkIixudWxsKX1jcmVhdGVDb250ZXh0KHIsZSl7aWYodGhpcy5jb250ZXh0cy5oYXMocikpcmV0dXJuIHRoaXMuY29udGV4dHMuZ2V0KHIpO2NvbnN0IG49bmV3IEN0LHM9bmV3IFdjO3RoaXMuY29udGV4dHMuc2V0KHIsRWQoZSkpLHRoaXMuY29udGV4dHMuZ2V0KHIpLnNldFZhbHVlKCJwZWVyU2Vzc2lvblN0b3JlIixuZXcgV3QocykpO2NvbnN0IGk9bmV3IEZyO3JldHVybiBpLnNldE1heExpc3RlbmVycyg1MCksdGhpcy5jb250ZXh0cy5nZXQocikuc2V0VmFsdWUoImxvZ2dlciIscyksdGhpcy5jb250ZXh0cy5nZXQocikuc2V0VmFsdWUoInRlbGVtZXRyeSIsbiksdGhpcy5jb250ZXh0cy5nZXQocikuc2V0VmFsdWUoImNhbGxzdGF0cyIsaSksdGhpcy5jb250ZXh0cy5nZXQocikuc2V0VmFsdWUoImZsYWdzbWl0aCIsVmMoKSksdGhpcy5tb3N0UmVjZW50UGVlcklkPXIsdGhpcy5jb250ZXh0cy5nZXQocil9cmVtYXBDb250ZXh0KHIsZSl7Y29uc3Qgbj1lLmdldFZhbHVlKCJwZWVySWQiKTtuIT09ciYmKGUuc2V0VmFsdWUoInBlZXJJZCIsciksdGhpcy5tb3N0UmVjZW50UGVlcklkPXIsdGhpcy5jb250ZXh0cy5zZXQocixlKSx0aGlzLmNvbnRleHRzLmRlbGV0ZShuKSl9Z2V0Q29udGV4dChyKXtyZXR1cm4gdGhpcy5jb250ZXh0cy5nZXQocil9Z2V0TW9zdFJlY2VudFBlZXJJZCgpe3JldHVybiB0aGlzLm1vc3RSZWNlbnRQZWVySWR9fXZhciBQZT1uZXcgX2Q7Y29uc3QgVGQ9eyIwMCI6IkNsaWVudCIsIjAxIjoiQ29udHJvbGxlciIsIjAyIjoiUm9vbU5vZGVDbGllbnQiLCIwMyI6IkhpdmVOb2RlQ2xpZW50IiwiMDQiOiJTb2NrZXRTZXJ2aWNlIiwiMDUiOiJDaGF0IiwiMDYiOiJQbHVnaW4iLCIwNyI6IlBvbGxzIiwiMDgiOiJNZXRhIiwiMDkiOiJQcmVzZXQiLDEwOiJSZWNvcmRpbmciLDExOiJTZWxmIiwxMjoiUGFydGljaXBhbnQiLDEzOiJTcG90bGlnaHQiLDE0OiJSZW1vdGUgUmVxdWVzdCIsMTU6IldlYmluYXIiLDE2OiJMb2NhbE1lZGlhSGFuZGxlciIsMTc6IkVuZC1FbmQgRW5jcnlwdGlvbiIsMTg6IkFJIiwxOToiTGl2ZXN0cmVhbSIsMjA6IlN0YWdlIn0sd3Q9eyIwMDAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uLiIsIjAwMDEiOiJGYWlsZWQgdG8gaW5pdGlhbGl6ZS4iLCIwMDAyIjoiRmFpbGVkIHRvIGpvaW4gcm9vbS4iLCIwMDAzIjoiRmFpbGVkIHRvIGxlYXZlIHJvb20uIiwiMDAwNCI6IkludmFsaWQgYXV0aCB0b2tlbiIsIjAwMTAiOiJCcm93c2VyIG5vdCBzdXBwb3J0ZWQiLCIwMDExIjoiSFRUUCBOZXR3b3JrIEVycm9yIiwiMDAxMiI6IldlYnNvY2tldCBOZXR3b3JrIEVycm9yIiwiMDAxMyI6IlJhdGUgTGltaXRlZCIsIjAxMDAiOiJJbnRlcm5hbCBleGNlcHRpb24iLCIwMTAxIjoiUGVybWlzc2lvbiBkZW5pZWQiLCIwMTAyIjoiUHJlcmVxdWlzaXRlIG1vZHVsZSBtaXNzaW5nIiwiMDIwMCI6IkludGVybmFsIGV4Y2VwdGlvbi4iLCIwMzAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDQwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjA0MDQiOiJNaXNzaW5nIHByZXJlcXVpc2l0ZXMgdG8gZXN0YWJsaXNoIGEgd2Vic29ja2V0IGNvbm5lY3Rpb24iLCIwNTAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDUwMSI6IlBlcm1pc3Npb24gZGVuaWVkLiIsIjA1MDIiOiJJbnZhbGlkIG1lc3NhZ2UgYm9keS4iLCIwNTAzIjoiVGV4dCBNZXNzYWdlIGlzIHRvbyBsYXJnZSIsIjA1MDQiOiJNZXNzYWdlIG5vdCBmb3VuZCBieSB0aGUgZ2l2ZW4gaWQiLCIwNTA1IjoiQWN0aW9uIG5vdCBwZXJtaXR0ZWQgd2l0aG91dCBqb2luaW5nIHJvb20iLCIwNTA2IjoiTWVzc2FnZSBzZWFyY2ggaXMgZGlzYWJsZWQiLCIwNjAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDYwMSI6IlBlcm1pc3Npb24gZGVuaWVkLiIsIjA2MDIiOiJBdXRoIHRva2VuIG5vdCBzZXQgZm9yIHBsdWdpbiIsIjA2MDMiOiJJZnJhbWUgd2FzIG5vdCBwcm92aWRlZCIsIjA3MDAiOiJJbnRlcm5hbCBleGNlcHRpb24iLCIwNzA1IjoiQWN0aW9uIG5vdCBwZXJtaXR0ZWQgd2l0aG91dCBqb2luaW5nIHJvb20iLCIwODAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDgwMSI6IlBlcm1pc3Npb24gZGVuaWVkIiwiMDkwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjA5MDQiOiJDb3VsZCBub3QgbG9hZCBwcmVzZXQiLDFlMzoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxMDAxOiJQZXJtaXNzaW9uIGRlbmllZCIsMTAwNDoiQ291bGQgbm90IGZpbmQgc3BlY2lmaWVkIHJlY29yZGluZyIsMTAwNToiQWN0aW9uIG5vdCBwZXJtaXR0ZWQgaW4gZ2l2ZW4gcmVjb3JkaW5nIHN0YXRlIiwxMTAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDExMDE6IlBlcm1pc3Npb24gZGVuaWVkIiwxMTAyOiJVbnN1cHBvcnRlZCIsMTEwMzoiTmFtZSBjYW5ub3QgYmUgZW1wdHkiLDExMDQ6Ik5vIGRldmljZSBzZWxlY3RlZCB3aGlsZSBjYWxsaW5nIG1lZXRpbmcuc2VsZi5zZXREZXZpY2UiLDExMDU6IkFjdGlvbiBub3QgcGVybWl0dGVkIHdpdGhvdXQgam9pbmluZyByb29tIiwxMTA2OiJDYW4ndCBzZXQgY3VycmVudGx5IHVzZWQgZGV2aWNlIiwxMjAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDEyMDE6IlBlcm1pc3Npb24gZGVuaWVkIiwxMjAyOiJJbnZhbGlkIHBhZ2UgbnVtYmVyIHdhcyByZXF1ZXN0ZWQiLDEyMDM6IkludmFsaWQgcGFydGljaXBhbnQgY291bnQgcGVyIHBhZ2Ugd2FzIHJlcXVlc3RlZCIsMTIwNDoiTm8gcGFydGljaXBhbnRzIGV4aXN0cyB3aXRoIHRoZSBnaXZlbiBVc2VySWRzIiwxMjA1OiJBY3Rpb24gbm90IHBlcm1pdHRlZCB3aXRob3V0IGpvaW5pbmcgcm9vbSIsMTIwNjoiTWFudWFsIFN1YnNjcmlwdGlvbiBNb2RlIHdhcyBub3QgQUNUSVZBVEVEIiwxMjA3OiJJbnZhbGlkIHZpZXcgbW9kZSIsMTIwODoiTWFudWFsIFN1YnNjcmlwdGlvbiBub3QgZW5hYmxlZCBmb3Igb3JnYW5pemF0aW9uIiwxMjA5OiJCcm9hZGNhc3QgbWVzc2FnZSB0eXBlIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nIiwxMzAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDE0MDA6IkludGVybmFsIGV4Y2VwdGlvbiIsMTQwMjoiTm8gZXhpc3RpbmcgcmVtb3RlIHJlcXVlc3RzIiwxNDAzOiJObyBwZWVyIGV4aXN0cyB3aXRoIGdpdmVuIGlkIiwxNTAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDE2MDA6IkludGVybmFsIGV4Y2VwdGlvbiIsMTYwMToiRmFpbGVkIHRvIGdldCBhdWRpbyB0cmFjayIsMTYwMjoiRmFpbGVkIHRvIGdldCB2aWRlbyB0cmFjayIsMTYwMzoiSW5jb3JyZWN0IGRldmljZSIsMTYwNDoiRmFpbGVkIHRvIGNoYW5nZSBkZXZpY2UiLDE2MDU6IkZhaWxlZCB0byBnZXQgYXVkaW8gJiB2aWRlbyB0cmFjayIsMTYwNjoiTm8gYXVkaW8gaW5wdXQgZGV2aWNlcyBhcmUgYXZhaWxhYmxlIiwxNjA3OiJObyB2aWRlbyBpbnB1dCBkZXZpY2VzIGFyZSBhdmFpbGFibGUiLDE2MDg6Ik5vIGF1ZGlvIG91dHB1dCBkZXZpY2VzIChzcGVha2VycykgYXJlIGF2YWlsYWJsZSIsMTYwOToiRmFpbGVkIHRvIGZldGNoIGxpc3Qgb2YgbWVkaWEgZGV2aWNlcyIsMTYxMDoiTm8gbWVkaWEgdHJhY2sgZXhpc3RzIiwxNjExOiJGYWlsZWQgdG8gdW5tdXRlIHRyYWNrIiwxNjEyOiJGYWlsZWQgdG8gZ2V0IHNjcmVlbnNoYXJlIHRyYWNrcyIsMTcwMToiQ3J5cHRvIGVycm9yIiwxODAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDE4MDE6IkNhbid0IGZldGNoIHRyYW5zY3JpcHQgZmlsZSIsMTkwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxOTAxOiJQZXJtaXNzaW9uIGRlbmllZC4iLDE5MDI6IkxpdmVzdHJlYW0gdGhhdCBoYXMgbm90IHlldCBzdGFydGVkLCBjYW4ndCBiZSBzdG9wcGVkIiwyZTM6IkludGVybmFsIGV4Y2VwdGlvbiIsMjAwMToiUGVybWlzc2lvbiBkZW5pZWQiLDIwMDI6IlVuc3VwcG9ydGVkIiwyMDAzOiJTdGFnZSBpcyBkaXNhYmxlZCIsMjAwNDoiTWV0aG9kIG5vdCBpbXBsZW1lbnRlZCIsMjAwNToiQWN0aW9uIG5vdCBwZXJtaXR0ZWQgd2l0aG91dCBqb2luaW5nIHJvb20iLDIwMDY6IkFjdGlvbiBub3QgcGVybWl0dGVkIGluIGN1cnJlbnQgc3RhZ2Ugc3RhdHVzIiw5OTAwOiJJbnRlcm5hbCBleGNlcHRpb24ifTtPYmplY3Qua2V5cyh3dCkuZm9yRWFjaCh0PT57d3RbdF09YHske1RkW3Quc2xpY2UoMCwyKV19fSAke3d0W3RdfWB9KTtjbGFzcyBSZCBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKGUsbixzPXZvaWQgMCxpPSExKXtzdXBlcihlKTtwKHRoaXMsImNvZGUiKTt0aGlzLmNvZGU9bix0aGlzLm5hbWU9IkNsaWVudEVycm9yIix0aGlzLm1lc3NhZ2U9YFtFUlIke3RoaXMuY29kZX1dOiAke3d0W3RoaXMuY29kZV19CiR7dGhpcy5tZXNzYWdlfWA7dHJ5e2xldCBhPWkmJiEhcztuJiZuLmVuZHNXaXRoKCIwMCIpJiZzJiYoYT0hMCksYSYmcy5lcnJvcigiQ2xpZW50RXJyb3IiLHtlcnJvcjp7bWVzc2FnZTp0aGlzLm1lc3NhZ2UsbmFtZTp0aGlzLm5hbWUsY29kZTpufX0pO2NvbnN0IGQ9UGUuZ2V0Q29udGV4dChQZS5nZXRNb3N0UmVjZW50UGVlcklkKCkpO2lmKGQpe2NvbnN0IG89ZC5nZXRWYWx1ZSgib25FcnJvciIpO3RyeXtvKHRoaXMpfWNhdGNoKGwpe319dHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJndpbmRvdy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiQ2xpZW50RXJyb3IiLHtkZXRhaWw6dGhpc30pKX1jYXRjaChhKXt9fX12YXIgZmU9KHQ9Pih0W3QuSW52YWxpZEtleT0wXT0iSW52YWxpZEtleSIsdFt0Lk1pc3NpbmdLZXk9MV09Ik1pc3NpbmdLZXkiLHRbdC5JbnRlcm5hbEVycm9yPTJdPSJJbnRlcm5hbEVycm9yIix0KSkoZmV8fHt9KTtjbGFzcyBtZSBleHRlbmRzIFJke2NvbnN0cnVjdG9yKGUsbj0yKXtzdXBlcihlLCIxNzAxIik7cCh0aGlzLCJyZWFzb24iKTt0aGlzLnJlYXNvbj1ufX1jbGFzcyBHbiBleHRlbmRzIHEuRXZlbnRFbWl0dGVye2NvbnN0cnVjdG9yKGUpe3N1cGVyKCk7cCh0aGlzLCJsb2dnZXIiKTt0aGlzLmxvZ2dlcj1lLHN1cGVyLnNldE1heExpc3RlbmVycygyNSl9ZW1pdChlLC4uLm4pe3JldHVybiBzdXBlci5lbWl0KCIqIixlLC4uLm4pLHN1cGVyLmVtaXQoZSwuLi5uKX1vbihlLG4pe3ZhciBzO3RyeXtjb25zdCBpPXRoaXMubGlzdGVuZXJDb3VudChlKTtpPjI1JiZpJTI1PT09MCYmKChzPXRoaXMubG9nZ2VyKT09bnVsbHx8cy53YXJuKCJDdXN0b21FdmVudEVtaXR0ZXI6Om1heExpc3RlbmVyc0V4Y2VlZGVkIix7ZXZlbnRMaXN0ZW5lcjp7ZXZlbnROYW1lOmUudG9TdHJpbmcoKSxsaXN0ZW5lckNvdW50OnRoaXMubGlzdGVuZXJDb3VudChlKX19KSl9Y2F0Y2goaSl7fXJldHVybiBzdXBlci5vbihlLG4pfWFkZExpc3RlbmVyKGUsbil7dmFyIHM7dHJ5e2NvbnN0IGk9dGhpcy5saXN0ZW5lckNvdW50KGUpO2k+MjUmJmklMjU9PT0wJiYoKHM9dGhpcy5sb2dnZXIpPT1udWxsfHxzLndhcm4oIkN1c3RvbUV2ZW50RW1pdHRlcjo6bWF4TGlzdGVuZXJzRXhjZWVkZWQiLHtldmVudExpc3RlbmVyOntldmVudE5hbWU6ZS50b1N0cmluZygpLGxpc3RlbmVyQ291bnQ6dGhpcy5saXN0ZW5lckNvdW50KGUpfX0pKX1jYXRjaChpKXt9cmV0dXJuIHN1cGVyLmFkZExpc3RlbmVyKGUsbil9b2ZmKGUsbil7cmV0dXJuIHN1cGVyLm9mZihlLG4pfW9uY2UoZSxuKXtyZXR1cm4gc3VwZXIub25jZShlLG4pfXByZXBlbmRMaXN0ZW5lcihlLG4pe3JldHVybiBzdXBlci5wcmVwZW5kTGlzdGVuZXIoZSxuKX1wcmVwZW5kT25jZUxpc3RlbmVyKGUsbil7cmV0dXJuIHN1cGVyLnByZXBlbmRPbmNlTGlzdGVuZXIoZSxuKX1yZW1vdmVMaXN0ZW5lcihlLG4pe3JldHVybiBzdXBlci5yZW1vdmVMaXN0ZW5lcihlLG4pfXJlbW92ZUFsbExpc3RlbmVycyhlKXtyZXR1cm4gc3VwZXIucmVtb3ZlQWxsTGlzdGVuZXJzKGUpfWxpc3RlbmVycyhlKXtyZXR1cm4gc3VwZXIubGlzdGVuZXJzKGUpfWxpc3RlbmVyQ291bnQoZSl7cmV0dXJuIHN1cGVyLmxpc3RlbmVyQ291bnQoZSl9fWNvbnN0IFl0PXtFcnJvcjoiY3J5cHRvckVycm9yIn07ZnVuY3Rpb24gUGQodCl7cmV0dXJuInR5cGUiaW4gdH1mdW5jdGlvbiBDZChuKXtyZXR1cm4gdyh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbioodCxyPXtuYW1lOmt9LGU9ImVuY3J5cHQiKXtyZXR1cm4gY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoInJhdyIsdCxyLCExLGU9PT0iZGVyaXZlIj9bImRlcml2ZUJpdHMiLCJkZXJpdmVLZXkiXTpbImVuY3J5cHQiLCJkZWNyeXB0Il0pfSl9ZnVuY3Rpb24gcW4odCxyKXtjb25zdCBuPW5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShyKTtzd2l0Y2godCl7Y2FzZSJIS0RGIjpyZXR1cm57bmFtZToiSEtERiIsc2FsdDpuLGhhc2g6IlNIQS0yNTYiLGluZm86bmV3IEFycmF5QnVmZmVyKDEyOCl9O2Nhc2UiUEJLREYyIjpyZXR1cm57bmFtZToiUEJLREYyIixzYWx0Om4saGFzaDoiU0hBLTI1NiIsaXRlcmF0aW9uczoxZTV9O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBhbGdvcml0aG0gJHt0fSBpcyBjdXJyZW50bHkgdW5zdXBwb3J0ZWRgKX19ZnVuY3Rpb24gWW4odCxyKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3QgZT1xbih0LmFsZ29yaXRobS5uYW1lLHIpLG49eWllbGQgY3J5cHRvLnN1YnRsZS5kZXJpdmVLZXkoZSx0LHtuYW1lOmssbGVuZ3RoOjEyOH0sITEsWyJlbmNyeXB0IiwiZGVjcnlwdCJdKTtyZXR1cm57bWF0ZXJpYWw6dCxlbmNyeXB0aW9uS2V5Om59fSl9ZnVuY3Rpb24gd2QodCxyKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3QgZT1xbih0LmFsZ29yaXRobS5uYW1lLHIpO3JldHVybiBjcnlwdG8uc3VidGxlLmRlcml2ZUJpdHMoZSx0LDI1Nil9KX1jbGFzcyBJZCBleHRlbmRzIEdue31jbGFzcyBRbiBleHRlbmRzIElke2NvbnN0cnVjdG9yKGUpe3ZhciBuO3N1cGVyKHZvaWQgMCk7cCh0aGlzLCJzZW5kQ291bnRzIik7cCh0aGlzLCJpc0tleUludmFsaWQiLCExKTtwKHRoaXMsInBhcnRpY2lwYW50SWQiKTtwKHRoaXMsInRyYWNrSWQiKTtwKHRoaXMsImtleXMiKTtwKHRoaXMsInZpZGVvQ29kZWMiKTtwKHRoaXMsInJ0cE1hcCIpO3AodGhpcywia2V5UHJvdmlkZXJPcHRpb25zIik7cCh0aGlzLCJ1bmVuY3J5cHRlZEZyYW1lQnl0ZVRyYWlsZXIiKTt0aGlzLnNlbmRDb3VudHM9bmV3IE1hcCx0aGlzLmtleXM9ZS5rZXlzLHRoaXMucGFydGljaXBhbnRJZD1lLnBhcnRpY2lwYW50SWQsdGhpcy5ydHBNYXA9bmV3IE1hcCx0aGlzLmtleVByb3ZpZGVyT3B0aW9ucz1lLmtleVByb3ZpZGVyT3B0aW9ucyx0aGlzLnVuZW5jcnlwdGVkRnJhbWVCeXRlVHJhaWxlcj0obj1lLnVuZW5jcnlwdGVkRnJhbWVCeXRlcykhPW51bGw/bjpuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoIkxLUk9DS1MiKX1zZXRQYXJ0aWNpcGFudChlLG4pe3RoaXMucGFydGljaXBhbnRJZD1lLHRoaXMua2V5cz1ufXVuc2V0UGFydGljaXBhbnQoKXt0aGlzLnBhcnRpY2lwYW50SWQ9dm9pZCAwfWdldFBhcnRpY2lwYW50SWQoKXtyZXR1cm4gdGhpcy5wYXJ0aWNpcGFudElkfWdldFRyYWNrSWQoKXtyZXR1cm4gdGhpcy50cmFja0lkfXNldFZpZGVvQ29kZWMoZSl7dGhpcy52aWRlb0NvZGVjPWV9c2V0UnRwTWFwKGUpe3RoaXMucnRwTWFwPWV9c2V0dXBUcmFuc2Zvcm0oZSxuLHMsaSxhKXthJiYodGhpcy52aWRlb0NvZGVjPWEpO2NvbnN0IGQ9ZT09PSJlbmNvZGUiP3RoaXMuZW5jb2RlRnVuY3Rpb246dGhpcy5kZWNvZGVGdW5jdGlvbixvPW5ldyBUcmFuc2Zvcm1TdHJlYW0oe3RyYW5zZm9ybTpkLmJpbmQodGhpcyl9KTtuLnBpcGVUaHJvdWdoKG8pLnBpcGVUbyhzKS5jYXRjaChsPT57dGhpcy5lbWl0KCJjcnlwdG9yRXJyb3IiLGwgaW5zdGFuY2VvZiBtZT9sOm5ldyBtZShsLm1lc3NhZ2UpKX0pLHRoaXMudHJhY2tJZD1pfWVuY29kZUZ1bmN0aW9uKGUsbil7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3ZhciBhO2lmKCF0aGlzLmtleXMuaXNFbmFibGVkKCl8fGUuZGF0YS5ieXRlTGVuZ3RoPT09MClyZXR1cm4gbi5lbnF1ZXVlKGUpO2NvbnN0e2VuY3J5cHRpb25LZXk6c309dGhpcy5rZXlzLmdldEtleVNldCgpLGk9dGhpcy5rZXlzLmdldEN1cnJlbnRLZXlJbmRleCgpO2lmKHMpe2NvbnN0IGQ9dGhpcy5tYWtlSVYoKGE9ZS5nZXRNZXRhZGF0YSgpLnN5bmNocm9uaXphdGlvblNvdXJjZSkhPW51bGw/YTotMSxlLnRpbWVzdGFtcCksbz1uZXcgVWludDhBcnJheShlLmRhdGEsMCx0aGlzLmdldFVuZW5jcnlwdGVkQnl0ZXMoZSkpLGw9bmV3IFVpbnQ4QXJyYXkoMik7bFswXT1kZSxsWzFdPWk7dHJ5e2NvbnN0IG09eWllbGQgY3J5cHRvLnN1YnRsZS5lbmNyeXB0KHtuYW1lOmssaXY6ZCxhZGRpdGlvbmFsRGF0YTpuZXcgVWludDhBcnJheShlLmRhdGEsMCxvLmJ5dGVMZW5ndGgpfSxzLG5ldyBVaW50OEFycmF5KGUuZGF0YSx0aGlzLmdldFVuZW5jcnlwdGVkQnl0ZXMoZSkpKSx2PW5ldyBBcnJheUJ1ZmZlcihvLmJ5dGVMZW5ndGgrbS5ieXRlTGVuZ3RoK2QuYnl0ZUxlbmd0aCtsLmJ5dGVMZW5ndGgpLEU9bmV3IFVpbnQ4QXJyYXkodik7cmV0dXJuIEUuc2V0KG8pLEUuc2V0KG5ldyBVaW50OEFycmF5KG0pLG8uYnl0ZUxlbmd0aCksRS5zZXQobmV3IFVpbnQ4QXJyYXkoZCksby5ieXRlTGVuZ3RoK20uYnl0ZUxlbmd0aCksRS5zZXQobCxvLmJ5dGVMZW5ndGgrbS5ieXRlTGVuZ3RoK2QuYnl0ZUxlbmd0aCksZS5kYXRhPXYsbi5lbnF1ZXVlKGUpfWNhdGNoKG0pe319ZWxzZSB0aGlzLmVtaXQoWXQuRXJyb3IsbmV3IG1lKCJlbmNyeXB0aW9uIGtleSBtaXNzaW5nIGZvciBlbmNvZGluZyIsZmUuTWlzc2luZ0tleSkpfSl9ZGVjb2RlRnVuY3Rpb24oZSxuKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7aWYoIXRoaXMua2V5cy5pc0VuYWJsZWQoKXx8ZS5kYXRhLmJ5dGVMZW5ndGg9PT0wfHxBZChlLmRhdGEsdGhpcy51bmVuY3J5cHRlZEZyYW1lQnl0ZVRyYWlsZXIpKXJldHVybiBuLmVucXVldWUoZSk7Y29uc3QgaT1uZXcgVWludDhBcnJheShlLmRhdGEpW2UuZGF0YS5ieXRlTGVuZ3RoLTFdO2lmKHRoaXMua2V5cy5nZXRLZXlTZXQoaSkpdHJ5e2NvbnN0IGE9eWllbGQgdGhpcy5kZWNyeXB0RnJhbWUoZSxpKTtpZihhKXJldHVybiBuLmVucXVldWUoYSk7dGhpcy5pc0tleUludmFsaWQ9ITF9Y2F0Y2goYSl7YSBpbnN0YW5jZW9mIG1lJiZhLnJlYXNvbj09PWZlLkludmFsaWRLZXkmJih0aGlzLmlzS2V5SW52YWxpZHx8KHRoaXMuZW1pdChZdC5FcnJvcixuZXcgbWUoYGludmFsaWQga2V5IGZvciBwYXJ0aWNpcGFudCAke3RoaXMucGFydGljaXBhbnRJZH1gLGZlLkludmFsaWRLZXkpKSx0aGlzLmlzS2V5SW52YWxpZD0hMCkpfWVsc2UgdGhpcy5lbWl0KFl0LkVycm9yLG5ldyBtZShga2V5IG1pc3NpbmcgZm9yIHBhcnRpY2lwYW50ICR7dGhpcy5wYXJ0aWNpcGFudElkfWAsZmUuTWlzc2luZ0tleSkpO3JldHVybiBuLmVucXVldWUoZSl9KX1kZWNyeXB0RnJhbWUoYSxkKXtyZXR1cm4gdyh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbiooZSxuLHM9dm9pZCAwLGk9e3JhdGNoZXRDb3VudDowfSl7dmFyIGw7Y29uc3Qgbz10aGlzLmtleXMuZ2V0S2V5U2V0KG4pO3RyeXtjb25zdCBtPW5ldyBVaW50OEFycmF5KGUuZGF0YSwwLHRoaXMuZ2V0VW5lbmNyeXB0ZWRCeXRlcyhlKSksdj1uZXcgVWludDhBcnJheShlLmRhdGEsZS5kYXRhLmJ5dGVMZW5ndGgtMiwyKSxFPXZbMF0sST1uZXcgVWludDhBcnJheShlLmRhdGEsZS5kYXRhLmJ5dGVMZW5ndGgtRS12LmJ5dGVMZW5ndGgsRSkseD1tLmJ5dGVMZW5ndGgsSD1lLmRhdGEuYnl0ZUxlbmd0aC0obS5ieXRlTGVuZ3RoK0Urdi5ieXRlTGVuZ3RoKSxGPXlpZWxkIGNyeXB0by5zdWJ0bGUuZGVjcnlwdCh7bmFtZTprLGl2OkksYWRkaXRpb25hbERhdGE6bmV3IFVpbnQ4QXJyYXkoZS5kYXRhLDAsbS5ieXRlTGVuZ3RoKX0sKGw9aS5lbmNyeXB0aW9uS2V5KSE9bnVsbD9sOm8uZW5jcnlwdGlvbktleSxuZXcgVWludDhBcnJheShlLmRhdGEseCxIKSksSz1uZXcgQXJyYXlCdWZmZXIobS5ieXRlTGVuZ3RoK0YuYnl0ZUxlbmd0aCksWj1uZXcgVWludDhBcnJheShLKTtyZXR1cm4gWi5zZXQobmV3IFVpbnQ4QXJyYXkoZS5kYXRhLDAsbS5ieXRlTGVuZ3RoKSksWi5zZXQobmV3IFVpbnQ4QXJyYXkoRiksbS5ieXRlTGVuZ3RoKSxlLmRhdGE9SyxlfWNhdGNoKG0pe2lmKHRoaXMua2V5UHJvdmlkZXJPcHRpb25zLnJhdGNoZXRXaW5kb3dTaXplPjApe2lmKGkucmF0Y2hldENvdW50PHRoaXMua2V5UHJvdmlkZXJPcHRpb25zLnJhdGNoZXRXaW5kb3dTaXplKXtsZXQgdjtpZihvPT09dGhpcy5rZXlzLmdldEtleVNldChuKSl7Y29uc3QgST15aWVsZCB0aGlzLmtleXMucmF0Y2hldEtleShuLCExKTt2PXlpZWxkIFluKEksdGhpcy5rZXlQcm92aWRlck9wdGlvbnMucmF0Y2hldFNhbHQpfWNvbnN0IEU9eWllbGQgdGhpcy5kZWNyeXB0RnJhbWUoZSxuLHN8fG8se3JhdGNoZXRDb3VudDppLnJhdGNoZXRDb3VudCsxLGVuY3J5cHRpb25LZXk6dj09bnVsbD92b2lkIDA6di5lbmNyeXB0aW9uS2V5fSk7cmV0dXJuIEUmJnYmJih0aGlzLmtleXMuc2V0S2V5U2V0KHYsbiwhMCksdGhpcy5rZXlzLnNldEN1cnJlbnRLZXlJbmRleChuKSksRX1zJiZ0aGlzLmtleXMuc2V0S2V5RnJvbU1hdGVyaWFsKHMubWF0ZXJpYWwsbil9ZWxzZSB0aHJvdyBuZXcgbWUoIkRlY3J5cHRpb24gZmFpbGVkLCBtb3N0IGxpa2VseSBiZWNhdXNlIG9mIGFuIGludmFsaWQga2V5IixmZS5JbnZhbGlkS2V5KX19KX1tYWtlSVYoZSxuKXt2YXIgZDtjb25zdCBzPW5ldyBBcnJheUJ1ZmZlcihkZSksaT1uZXcgRGF0YVZpZXcocyk7dGhpcy5zZW5kQ291bnRzLmhhcyhlKXx8dGhpcy5zZW5kQ291bnRzLnNldChlLE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSo2NTUzNSkpO2NvbnN0IGE9KGQ9dGhpcy5zZW5kQ291bnRzLmdldChlKSkhPW51bGw/ZDowO3JldHVybiBpLnNldFVpbnQzMigwLGUpLGkuc2V0VWludDMyKDQsbiksaS5zZXRVaW50MzIoOCxuLWElNjU1MzUpLHRoaXMuc2VuZENvdW50cy5zZXQoZSxhKzEpLHN9Z2V0VW5lbmNyeXB0ZWRCeXRlcyhlKXt2YXIgbjtpZihQZChlKSl7Y29uc3Qgcz0obj10aGlzLmdldFZpZGVvQ29kZWMoZSkpIT1udWxsP246dGhpcy52aWRlb0NvZGVjO2lmKHM9PT0iYXYxInx8cz09PSJ2cDkiKXRocm93IG5ldyBFcnJvcihgJHtzfSBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgZW5kIHRvIGVuZCBlbmNyeXB0aW9uYCk7cmV0dXJuIE1bZS50eXBlXX1yZXR1cm4gTS5hdWRpb31nZXRWaWRlb0NvZGVjKGUpe2lmKHRoaXMucnRwTWFwLnNpemU9PT0wKXJldHVybjtjb25zdHtwYXlsb2FkVHlwZTpufT1lLmdldE1ldGFkYXRhKCk7cmV0dXJuIG4/dGhpcy5ydHBNYXAuZ2V0KG4pOnZvaWQgMH19ZnVuY3Rpb24gQWQodCxyKXtjb25zdCBlPW5ldyBVaW50OEFycmF5KHQuc2xpY2UodC5ieXRlTGVuZ3RoLXIuYnl0ZUxlbmd0aCkpO3JldHVybiByLmV2ZXJ5KChuLHMpPT5uPT09ZVtzXSl9Y2xhc3MgSm4gZXh0ZW5kcyBHbntjb25zdHJ1Y3RvcihlLG4scyl7c3VwZXIodm9pZCAwKTtwKHRoaXMsImN1cnJlbnRLZXlJbmRleCIpO3AodGhpcywiY3J5cHRvS2V5UmluZyIpO3AodGhpcywiZW5hYmxlZCIpO3AodGhpcywia2V5UHJvdmlkZXJPcHRpb25zIik7cCh0aGlzLCJyYXRjaGV0UHJvbWlzZU1hcCIpO3AodGhpcywicGFydGljaXBhbnRJZCIpO3RoaXMuY3VycmVudEtleUluZGV4PTAsdGhpcy5jcnlwdG9LZXlSaW5nPW5ldyBBcnJheSgxNiksdGhpcy5lbmFibGVkPW4sdGhpcy5rZXlQcm92aWRlck9wdGlvbnM9cyx0aGlzLnJhdGNoZXRQcm9taXNlTWFwPW5ldyBNYXAsdGhpcy5wYXJ0aWNpcGFudElkPWV9c2V0RW5hYmxlZChlKXt0aGlzLmVuYWJsZWQ9ZX1yYXRjaGV0S2V5KGUsbj0hMCl7Y29uc3Qgcz1lIT1udWxsP2U6dGhpcy5nZXRDdXJyZW50S2V5SW5kZXgoKSxpPXMsYT10aGlzLnJhdGNoZXRQcm9taXNlTWFwLmdldChpKTtpZih0eXBlb2YgYSE9InVuZGVmaW5lZCIpcmV0dXJuIGE7Y29uc3QgZD1uZXcgUHJvbWlzZSgobyxsKT0+dyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dHJ5e2NvbnN0IG09dGhpcy5nZXRLZXlTZXQoaSkubWF0ZXJpYWwsdj15aWVsZCBDZCh5aWVsZCB3ZChtLHRoaXMua2V5UHJvdmlkZXJPcHRpb25zLnJhdGNoZXRTYWx0KSxtLmFsZ29yaXRobS5uYW1lLCJkZXJpdmUiKTtuJiZ0aGlzLnNldEtleUZyb21NYXRlcmlhbCh2LGksITApLHRoaXMuZW1pdCgia2V5UmF0Y2hldGVkIix2LHMsdGhpcy5wYXJ0aWNpcGFudElkKSxvKHYpfWNhdGNoKG0pe2wobSl9ZmluYWxseXt0aGlzLnJhdGNoZXRQcm9taXNlTWFwLmRlbGV0ZShpKX19KSk7cmV0dXJuIHRoaXMucmF0Y2hldFByb21pc2VNYXAuc2V0KGksZCksZH1zZXRLZXlGcm9tTWF0ZXJpYWwoZSxuPTAscz0hMSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe24+PTAmJih0aGlzLmN1cnJlbnRLZXlJbmRleD1uJXRoaXMuY3J5cHRvS2V5UmluZy5sZW5ndGgpO2NvbnN0IGk9eWllbGQgWW4oZSx0aGlzLmtleVByb3ZpZGVyT3B0aW9ucy5yYXRjaGV0U2FsdCk7dGhpcy5zZXRLZXlTZXQoaSx0aGlzLmN1cnJlbnRLZXlJbmRleCxzKX0pfXNldEtleVNldChlLG4scz0hMSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3RoaXMuY3J5cHRvS2V5UmluZ1tuJXRoaXMuY3J5cHRvS2V5UmluZy5sZW5ndGhdPWUscyYmdGhpcy5lbWl0KCJrZXlSYXRjaGV0ZWQiLGUubWF0ZXJpYWwsbix0aGlzLnBhcnRpY2lwYW50SWQpfSl9c2V0Q3VycmVudEtleUluZGV4KGUpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXt0aGlzLmN1cnJlbnRLZXlJbmRleD1lJXRoaXMuY3J5cHRvS2V5UmluZy5sZW5ndGh9KX1pc0VuYWJsZWQoKXtyZXR1cm4gdGhpcy5lbmFibGVkfWdldEN1cnJlbnRLZXlJbmRleCgpe3JldHVybiB0aGlzLmN1cnJlbnRLZXlJbmRleH1nZXRLZXlTZXQoZSl7cmV0dXJuIHRoaXMuY3J5cHRvS2V5UmluZ1tlIT1udWxsP2U6dGhpcy5jdXJyZW50S2V5SW5kZXhdfX1jb25zdCBRdD1bXSxKdD1uZXcgTWFwLFh0PVtdO2xldCBjZSxadD0hMSxYbj0hMSxlcixnZT1NdDtmdW5jdGlvbiBTZSh0LHIpe3Bvc3RNZXNzYWdlKHtraW5kOiJsb2ciLGRhdGE6e2xldmVsOnQsc3RyOnJ9fSl9ZnVuY3Rpb24gTWQodCxyKXtwb3N0TWVzc2FnZSh7a2luZDoicmF0Y2hldEtleSIsZGF0YTp7a2V5SW5kZXg6cixtYXRlcmlhbDp0fX0pfWZ1bmN0aW9uIFZlKHQpe2lmKCF0KXJldHVybiBjZTtsZXQgcj1KdC5nZXQodCk7cmV0dXJuIHJ8fChyPW5ldyBKbih0LCEwLGdlKSxlciYmci5zZXRLZXlGcm9tTWF0ZXJpYWwoZXIpLEp0LnNldCh0LHIpKSxyfWZ1bmN0aW9uIGtkKHQscil7cj9WZShyKS5zZXRFbmFibGVkKHQpOihadD10LGNlLnNldEVuYWJsZWQodCkpfWZ1bmN0aW9uIFpuKHQpe3Qub24oImNyeXB0b3JFcnJvciIscj0+e2NvbnN0IGU9e2tpbmQ6ImVycm9yIixkYXRhOntlcnJvcjpuZXcgRXJyb3IoYCR7ZmVbci5yZWFzb25dfTogJHtyLm1lc3NhZ2V9YCl9fTtwb3N0TWVzc2FnZShlKX0pfWZ1bmN0aW9uIHRyKHQscil7bGV0IGU9UXQuZmluZChuPT5uLmdldFRyYWNrSWQoKT09PXIpO2lmKGUpdCE9PWUuZ2V0UGFydGljaXBhbnRJZCgpJiZlLnNldFBhcnRpY2lwYW50KHQsVmUodCkpO2Vsc2V7aWYoU2UoImluZm8iLGBjcmVhdGluZyBuZXcgY3J5cHRvciBmb3IgJHt0fWApLCFnZSl0aHJvdyBFcnJvcigiTWlzc2luZyBrZXlQcm92aWRlciBvcHRpb25zIik7ZT1uZXcgUW4oe3BhcnRpY2lwYW50SWQ6dCxrZXlzOlZlKHQpLGtleVByb3ZpZGVyT3B0aW9uczpnZX0pLFpuKGUpLFF0LnB1c2goZSl9cmV0dXJuIGV9ZnVuY3Rpb24gZXModCl7bGV0IHI9WHQuZmluZChlPT5lLmdldFRyYWNrSWQoKT09PXQpO2lmKCFyKXtpZighZ2UpdGhyb3cgbmV3IFR5cGVFcnJvcigiTWlzc2luZyBrZXlQcm92aWRlciBvcHRpb25zIik7cj1uZXcgUW4oe2tleXM6Y2UscGFydGljaXBhbnRJZDoicHVibGlzaGVyIixrZXlQcm92aWRlck9wdGlvbnM6Z2V9KSxabihyKSxYdC5wdXNoKHIpfXJldHVybiByfWZ1bmN0aW9uIE9kKHQpe3ZhciByOyhyPVF0LmZpbmQoZT0+ZS5nZXRUcmFja0lkKCk9PT10KSk9PW51bGx8fHIudW5zZXRQYXJ0aWNpcGFudCgpfWZ1bmN0aW9uIExkKHQscil7U2UoImRlYnVnIiwic2V0dGluZyBzaGFyZWQga2V5IiksZXI9dCxjZT09bnVsbHx8Y2Uuc2V0S2V5RnJvbU1hdGVyaWFsKHQscik7Zm9yKGNvbnN0WyxlXW9mIEp0KWUuc2V0S2V5RnJvbU1hdGVyaWFsKHQscil9b25tZXNzYWdlPXQ9Pntjb25zdHtraW5kOnIsZGF0YTplfT10LmRhdGE7c3dpdGNoKHIpe2Nhc2UiaW5pdCI6U2UoImluZm8iLCJ3b3JrZXIgaW5pdGlhbGl6ZWQiKSxnZT1lLmtleVByb3ZpZGVyT3B0aW9ucyxYbj0hIWUua2V5UHJvdmlkZXJPcHRpb25zLnNoYXJlZEtleTtjb25zdCBuPXtraW5kOiJlbmFibGUiLGRhdGE6e2VuYWJsZWQ6WnR9fTtjZT1uZXcgSm4odm9pZCAwLFp0LGdlKSxjZS5vbigia2V5UmF0Y2hldGVkIixNZCkscG9zdE1lc3NhZ2Uobik7YnJlYWs7Y2FzZSJlbmFibGUiOmtkKGUuZW5hYmxlZCxlLnBhcnRpY2lwYW50SWQpLFNlKCJpbmZvIiwidXBkYXRlZCBlMmVlIGVuYWJsZWQgc3RhdHVzIikscG9zdE1lc3NhZ2UodC5kYXRhKTticmVhaztjYXNlImRlY29kZSI6dHIoZS5wYXJ0aWNpcGFudElkLGUudHJhY2tJZCkuc2V0dXBUcmFuc2Zvcm0ocixlLnJlYWRhYmxlU3RyZWFtLGUud3JpdGFibGVTdHJlYW0sZS50cmFja0lkLGUuY29kZWMpO2JyZWFrO2Nhc2UiZW5jb2RlIjplcyhlLnRyYWNrSWQpLnNldHVwVHJhbnNmb3JtKHIsZS5yZWFkYWJsZVN0cmVhbSxlLndyaXRhYmxlU3RyZWFtLGUudHJhY2tJZCxlLmNvZGVjKTticmVhaztjYXNlInNldEtleSI6WG4/KFNlKCJkZWJ1ZyIsInNldCBzaGFyZWQga2V5IiksTGQoZS5rZXksZS5rZXlJbmRleCkpOmUucGFydGljaXBhbnRJZD9WZShlLnBhcnRpY2lwYW50SWQpLnNldEtleUZyb21NYXRlcmlhbChlLmtleSxlLmtleUluZGV4KTpTZSgiZXJyb3IiLCJubyBwYXJ0aWNpcGFudCBJZCB3YXMgcHJvdmlkZWQgYW5kIHNoYXJlZCBrZXkgdXNhZ2UgaXMgZGlzYWJsZWQiKTticmVhaztjYXNlInJlbW92ZVRyYW5zZm9ybSI6T2QoZS50cmFja0lkKTticmVhaztjYXNlInVwZGF0ZUNvZGVjIjp0cihlLnBhcnRpY2lwYW50SWQsZS50cmFja0lkKS5zZXRWaWRlb0NvZGVjKGUuY29kZWMpO2JyZWFrO2Nhc2Uic2V0UlRQTWFwIjpYdC5mb3JFYWNoKGE9PnthLnNldFJ0cE1hcChlLm1hcCl9KTticmVhaztjYXNlInJhdGNoZXRSZXF1ZXN0IjpWZShlLnBhcnRpY2lwYW50SWQpLnJhdGNoZXRLZXkoZS5rZXlJbmRleCk7YnJlYWt9fSxzZWxmLlJUQ1RyYW5zZm9ybUV2ZW50JiYoU2UoImRlYnVnIiwic2V0dXAgdHJhbnNmb3JtIGV2ZW50Iiksc2VsZi5vbnJ0Y3RyYW5zZm9ybT10PT57Y29uc3R7dHJhbnNmb3JtZXI6cn09dDtyLmhhbmRsZWQ9ITA7Y29uc3R7a2luZDplLHBhcnRpY2lwYW50SWQ6bix0cmFja0lkOnMsY29kZWM6aX09ci5vcHRpb25zOyhlPT09ImVuY29kZSI/ZXMocyk6dHIobixzKSkuc2V0dXBUcmFuc2Zvcm0oZSxyLnJlYWRhYmxlLHIud3JpdGFibGUscyxpKX0pfSkoKTsK", P = typeof window != "undefined" && window.Blob && new Blob([atob(ll)], { type: "text/javascript;charset=utf-8" });
|
|
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 = "dmFyIERkPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxOZD1PYmplY3QuZGVmaW5lUHJvcGVydGllczt2YXIgVmQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7dmFyIHJzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsRmQ9T2JqZWN0LmdldFByb3RvdHlwZU9mLEJkPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkseGQ9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxqZD1SZWZsZWN0LmdldDt2YXIgaXI9KGssTyxNKT0+TyBpbiBrP0RkKGssTyx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6TX0pOmtbT109TSxRPShrLE8pPT57Zm9yKHZhciBNIGluIE98fChPPXt9KSlCZC5jYWxsKE8sTSkmJmlyKGssTSxPW01dKTtpZihycylmb3IodmFyIE0gb2YgcnMoTykpeGQuY2FsbChPLE0pJiZpcihrLE0sT1tNXSk7cmV0dXJuIGt9LG90PShrLE8pPT5OZChrLFZkKE8pKTt2YXIgcD0oayxPLE0pPT4oaXIoayx0eXBlb2YgTyE9InN5bWJvbCI/TysiIjpPLE0pLE0pLG5zPShrLE8sTSk9PntpZighTy5oYXMoaykpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgIitNKX07dmFyIGVlPShrLE8sTSk9PihucyhrLE8sInJlYWQgZnJvbSBwcml2YXRlIGZpZWxkIiksTT9NLmNhbGwoayk6Ty5nZXQoaykpLEl0PShrLE8sTSk9PntpZihPLmhhcyhrKSl0aHJvdyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgdGhlIHNhbWUgcHJpdmF0ZSBtZW1iZXIgbW9yZSB0aGFuIG9uY2UiKTtPIGluc3RhbmNlb2YgV2Vha1NldD9PLmFkZChrKTpPLnNldChrLE0pfSxDZT0oayxPLE0sZGUpPT4obnMoayxPLCJ3cml0ZSB0byBwcml2YXRlIGZpZWxkIiksZGU/ZGUuY2FsbChrLE0pOk8uc2V0KGssTSksTSk7dmFyIHNzPShrLE8sTSk9PmpkKEZkKGspLE0sTyk7dmFyIHc9KGssTyxNKT0+bmV3IFByb21pc2UoKGRlLEF0KT0+e3ZhciBNdD1ZPT57dHJ5e3dlKE0ubmV4dChZKSl9Y2F0Y2goYmUpe0F0KGJlKX19LHE9WT0+e3RyeXt3ZShNLnRocm93KFkpKX1jYXRjaChiZSl7QXQoYmUpfX0sd2U9WT0+WS5kb25lP2RlKFkudmFsdWUpOlByb21pc2UucmVzb2x2ZShZLnZhbHVlKS50aGVuKE10LHEpO3dlKChNPU0uYXBwbHkoayxPKSkubmV4dCgpKX0pOyhmdW5jdGlvbigpe3ZhciB0cyxGZSxzZSxpZTsidXNlIHN0cmljdCI7Y29uc3Qgaz0iQUVTLUdDTSIsTT17a2V5OjEwLGRlbHRhOjMsYXVkaW86MSxlbXB0eTowfSxkZT0xMixNdD17c2hhcmVkS2V5OiExLHJhdGNoZXRTYWx0OiJSZWFsdGltZUtpdEZyYW1lRW5jcnlwdGlvbktleSIscmF0Y2hldFdpbmRvd1NpemU6OH07dmFyIHE9e30sd2U9e2dldCBleHBvcnRzKCl7cmV0dXJuIHF9LHNldCBleHBvcnRzKHQpe3E9dH19LFk9dHlwZW9mIFJlZmxlY3Q9PSJvYmplY3QiP1JlZmxlY3Q6bnVsbCxiZT1ZJiZ0eXBlb2YgWS5hcHBseT09ImZ1bmN0aW9uIj9ZLmFwcGx5OmZ1bmN0aW9uKHIsZSxuKXtyZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwocixlLG4pfSxjdDtZJiZ0eXBlb2YgWS5vd25LZXlzPT0iZnVuY3Rpb24iP2N0PVkub3duS2V5czpPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzP2N0PWZ1bmN0aW9uKHIpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhyKS5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhyKSl9OmN0PWZ1bmN0aW9uKHIpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhyKX07ZnVuY3Rpb24gaXModCl7Y29uc29sZSYmY29uc29sZS53YXJuJiZjb25zb2xlLndhcm4odCl9dmFyIGFyPU51bWJlci5pc05hTnx8ZnVuY3Rpb24ocil7cmV0dXJuIHIhPT1yfTtmdW5jdGlvbiBMKCl7TC5pbml0LmNhbGwodGhpcyl9d2UuZXhwb3J0cz1MLHEub25jZT1kcyxMLkV2ZW50RW1pdHRlcj1MLEwucHJvdG90eXBlLl9ldmVudHM9dm9pZCAwLEwucHJvdG90eXBlLl9ldmVudHNDb3VudD0wLEwucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnM9dm9pZCAwO3ZhciBvcj0xMDtmdW5jdGlvbiBkdCh0KXtpZih0eXBlb2YgdCE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgImxpc3RlbmVyIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRnVuY3Rpb24uIFJlY2VpdmVkIHR5cGUgJyt0eXBlb2YgdCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KEwsImRlZmF1bHRNYXhMaXN0ZW5lcnMiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBvcn0sc2V0OmZ1bmN0aW9uKHQpe2lmKHR5cGVvZiB0IT0ibnVtYmVyInx8dDwwfHxhcih0KSl0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mICJkZWZhdWx0TWF4TGlzdGVuZXJzIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnK3QrIi4iKTtvcj10fX0pLEwuaW5pdD1mdW5jdGlvbigpeyh0aGlzLl9ldmVudHM9PT12b2lkIDB8fHRoaXMuX2V2ZW50cz09PU9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS5fZXZlbnRzKSYmKHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTApLHRoaXMuX21heExpc3RlbmVycz10aGlzLl9tYXhMaXN0ZW5lcnN8fHZvaWQgMH0sTC5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzPWZ1bmN0aW9uKHIpe2lmKHR5cGVvZiByIT0ibnVtYmVyInx8cjwwfHxhcihyKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mICJuIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnK3IrIi4iKTtyZXR1cm4gdGhpcy5fbWF4TGlzdGVuZXJzPXIsdGhpc307ZnVuY3Rpb24gY3IodCl7cmV0dXJuIHQuX21heExpc3RlbmVycz09PXZvaWQgMD9MLmRlZmF1bHRNYXhMaXN0ZW5lcnM6dC5fbWF4TGlzdGVuZXJzfUwucHJvdG90eXBlLmdldE1heExpc3RlbmVycz1mdW5jdGlvbigpe3JldHVybiBjcih0aGlzKX0sTC5wcm90b3R5cGUuZW1pdD1mdW5jdGlvbihyKXtmb3IodmFyIGU9W10sbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspZS5wdXNoKGFyZ3VtZW50c1tuXSk7dmFyIHM9cj09PSJlcnJvciIsaT10aGlzLl9ldmVudHM7aWYoaSE9PXZvaWQgMClzPXMmJmkuZXJyb3I9PT12b2lkIDA7ZWxzZSBpZighcylyZXR1cm4hMTtpZihzKXt2YXIgYTtpZihlLmxlbmd0aD4wJiYoYT1lWzBdKSxhIGluc3RhbmNlb2YgRXJyb3IpdGhyb3cgYTt2YXIgZD1uZXcgRXJyb3IoIlVuaGFuZGxlZCBlcnJvci4iKyhhPyIgKCIrYS5tZXNzYWdlKyIpIjoiIikpO3Rocm93IGQuY29udGV4dD1hLGR9dmFyIG89aVtyXTtpZihvPT09dm9pZCAwKXJldHVybiExO2lmKHR5cGVvZiBvPT0iZnVuY3Rpb24iKWJlKG8sdGhpcyxlKTtlbHNlIGZvcih2YXIgbD1vLmxlbmd0aCxtPWhyKG8sbCksbj0wO248bDsrK24pYmUobVtuXSx0aGlzLGUpO3JldHVybiEwfTtmdW5jdGlvbiBkcih0LHIsZSxuKXt2YXIgcyxpLGE7aWYoZHQoZSksaT10Ll9ldmVudHMsaT09PXZvaWQgMD8oaT10Ll9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0Ll9ldmVudHNDb3VudD0wKTooaS5uZXdMaXN0ZW5lciE9PXZvaWQgMCYmKHQuZW1pdCgibmV3TGlzdGVuZXIiLHIsZS5saXN0ZW5lcj9lLmxpc3RlbmVyOmUpLGk9dC5fZXZlbnRzKSxhPWlbcl0pLGE9PT12b2lkIDApYT1pW3JdPWUsKyt0Ll9ldmVudHNDb3VudDtlbHNlIGlmKHR5cGVvZiBhPT0iZnVuY3Rpb24iP2E9aVtyXT1uP1tlLGFdOlthLGVdOm4/YS51bnNoaWZ0KGUpOmEucHVzaChlKSxzPWNyKHQpLHM+MCYmYS5sZW5ndGg+cyYmIWEud2FybmVkKXthLndhcm5lZD0hMDt2YXIgZD1uZXcgRXJyb3IoIlBvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gIithLmxlbmd0aCsiICIrU3RyaW5nKHIpKyIgbGlzdGVuZXJzIGFkZGVkLiBVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdCIpO2QubmFtZT0iTWF4TGlzdGVuZXJzRXhjZWVkZWRXYXJuaW5nIixkLmVtaXR0ZXI9dCxkLnR5cGU9cixkLmNvdW50PWEubGVuZ3RoLGlzKGQpfXJldHVybiB0fUwucHJvdG90eXBlLmFkZExpc3RlbmVyPWZ1bmN0aW9uKHIsZSl7cmV0dXJuIGRyKHRoaXMscixlLCExKX0sTC5wcm90b3R5cGUub249TC5wcm90b3R5cGUuYWRkTGlzdGVuZXIsTC5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyPWZ1bmN0aW9uKHIsZSl7cmV0dXJuIGRyKHRoaXMscixlLCEwKX07ZnVuY3Rpb24gYXMoKXtpZighdGhpcy5maXJlZClyZXR1cm4gdGhpcy50YXJnZXQucmVtb3ZlTGlzdGVuZXIodGhpcy50eXBlLHRoaXMud3JhcEZuKSx0aGlzLmZpcmVkPSEwLGFyZ3VtZW50cy5sZW5ndGg9PT0wP3RoaXMubGlzdGVuZXIuY2FsbCh0aGlzLnRhcmdldCk6dGhpcy5saXN0ZW5lci5hcHBseSh0aGlzLnRhcmdldCxhcmd1bWVudHMpfWZ1bmN0aW9uIGxyKHQscixlKXt2YXIgbj17ZmlyZWQ6ITEsd3JhcEZuOnZvaWQgMCx0YXJnZXQ6dCx0eXBlOnIsbGlzdGVuZXI6ZX0scz1hcy5iaW5kKG4pO3JldHVybiBzLmxpc3RlbmVyPWUsbi53cmFwRm49cyxzfUwucHJvdG90eXBlLm9uY2U9ZnVuY3Rpb24ocixlKXtyZXR1cm4gZHQoZSksdGhpcy5vbihyLGxyKHRoaXMscixlKSksdGhpc30sTC5wcm90b3R5cGUucHJlcGVuZE9uY2VMaXN0ZW5lcj1mdW5jdGlvbihyLGUpe3JldHVybiBkdChlKSx0aGlzLnByZXBlbmRMaXN0ZW5lcihyLGxyKHRoaXMscixlKSksdGhpc30sTC5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI9ZnVuY3Rpb24ocixlKXt2YXIgbixzLGksYSxkO2lmKGR0KGUpLHM9dGhpcy5fZXZlbnRzLHM9PT12b2lkIDApcmV0dXJuIHRoaXM7aWYobj1zW3JdLG49PT12b2lkIDApcmV0dXJuIHRoaXM7aWYobj09PWV8fG4ubGlzdGVuZXI9PT1lKS0tdGhpcy5fZXZlbnRzQ291bnQ9PT0wP3RoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpOihkZWxldGUgc1tyXSxzLnJlbW92ZUxpc3RlbmVyJiZ0aGlzLmVtaXQoInJlbW92ZUxpc3RlbmVyIixyLG4ubGlzdGVuZXJ8fGUpKTtlbHNlIGlmKHR5cGVvZiBuIT0iZnVuY3Rpb24iKXtmb3IoaT0tMSxhPW4ubGVuZ3RoLTE7YT49MDthLS0paWYoblthXT09PWV8fG5bYV0ubGlzdGVuZXI9PT1lKXtkPW5bYV0ubGlzdGVuZXIsaT1hO2JyZWFrfWlmKGk8MClyZXR1cm4gdGhpcztpPT09MD9uLnNoaWZ0KCk6b3MobixpKSxuLmxlbmd0aD09PTEmJihzW3JdPW5bMF0pLHMucmVtb3ZlTGlzdGVuZXIhPT12b2lkIDAmJnRoaXMuZW1pdCgicmVtb3ZlTGlzdGVuZXIiLHIsZHx8ZSl9cmV0dXJuIHRoaXN9LEwucHJvdG90eXBlLm9mZj1MLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcixMLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnM9ZnVuY3Rpb24ocil7dmFyIGUsbixzO2lmKG49dGhpcy5fZXZlbnRzLG49PT12b2lkIDApcmV0dXJuIHRoaXM7aWYobi5yZW1vdmVMaXN0ZW5lcj09PXZvaWQgMClyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09PTA/KHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTApOm5bcl0hPT12b2lkIDAmJigtLXRoaXMuX2V2ZW50c0NvdW50PT09MD90aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKTpkZWxldGUgbltyXSksdGhpcztpZihhcmd1bWVudHMubGVuZ3RoPT09MCl7dmFyIGk9T2JqZWN0LmtleXMobiksYTtmb3Iocz0wO3M8aS5sZW5ndGg7KytzKWE9aVtzXSxhIT09InJlbW92ZUxpc3RlbmVyIiYmdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoYSk7cmV0dXJuIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCJyZW1vdmVMaXN0ZW5lciIpLHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTAsdGhpc31pZihlPW5bcl0sdHlwZW9mIGU9PSJmdW5jdGlvbiIpdGhpcy5yZW1vdmVMaXN0ZW5lcihyLGUpO2Vsc2UgaWYoZSE9PXZvaWQgMClmb3Iocz1lLmxlbmd0aC0xO3M+PTA7cy0tKXRoaXMucmVtb3ZlTGlzdGVuZXIocixlW3NdKTtyZXR1cm4gdGhpc307ZnVuY3Rpb24gdXIodCxyLGUpe3ZhciBuPXQuX2V2ZW50cztpZihuPT09dm9pZCAwKXJldHVybltdO3ZhciBzPW5bcl07cmV0dXJuIHM9PT12b2lkIDA/W106dHlwZW9mIHM9PSJmdW5jdGlvbiI/ZT9bcy5saXN0ZW5lcnx8c106W3NdOmU/Y3Mocyk6aHIocyxzLmxlbmd0aCl9TC5wcm90b3R5cGUubGlzdGVuZXJzPWZ1bmN0aW9uKHIpe3JldHVybiB1cih0aGlzLHIsITApfSxMLnByb3RvdHlwZS5yYXdMaXN0ZW5lcnM9ZnVuY3Rpb24ocil7cmV0dXJuIHVyKHRoaXMsciwhMSl9LEwubGlzdGVuZXJDb3VudD1mdW5jdGlvbih0LHIpe3JldHVybiB0eXBlb2YgdC5saXN0ZW5lckNvdW50PT0iZnVuY3Rpb24iP3QubGlzdGVuZXJDb3VudChyKTpwci5jYWxsKHQscil9LEwucHJvdG90eXBlLmxpc3RlbmVyQ291bnQ9cHI7ZnVuY3Rpb24gcHIodCl7dmFyIHI9dGhpcy5fZXZlbnRzO2lmKHIhPT12b2lkIDApe3ZhciBlPXJbdF07aWYodHlwZW9mIGU9PSJmdW5jdGlvbiIpcmV0dXJuIDE7aWYoZSE9PXZvaWQgMClyZXR1cm4gZS5sZW5ndGh9cmV0dXJuIDB9TC5wcm90b3R5cGUuZXZlbnROYW1lcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ldmVudHNDb3VudD4wP2N0KHRoaXMuX2V2ZW50cyk6W119O2Z1bmN0aW9uIGhyKHQscil7Zm9yKHZhciBlPW5ldyBBcnJheShyKSxuPTA7bjxyOysrbillW25dPXRbbl07cmV0dXJuIGV9ZnVuY3Rpb24gb3ModCxyKXtmb3IoO3IrMTx0Lmxlbmd0aDtyKyspdFtyXT10W3IrMV07dC5wb3AoKX1mdW5jdGlvbiBjcyh0KXtmb3IodmFyIHI9bmV3IEFycmF5KHQubGVuZ3RoKSxlPTA7ZTxyLmxlbmd0aDsrK2UpcltlXT10W2VdLmxpc3RlbmVyfHx0W2VdO3JldHVybiByfWZ1bmN0aW9uIGRzKHQscil7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUsbil7ZnVuY3Rpb24gcyhhKXt0LnJlbW92ZUxpc3RlbmVyKHIsaSksbihhKX1mdW5jdGlvbiBpKCl7dHlwZW9mIHQucmVtb3ZlTGlzdGVuZXI9PSJmdW5jdGlvbiImJnQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixzKSxlKFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKSl9ZnIodCxyLGkse29uY2U6ITB9KSxyIT09ImVycm9yIiYmbHModCxzLHtvbmNlOiEwfSl9KX1mdW5jdGlvbiBscyh0LHIsZSl7dHlwZW9mIHQub249PSJmdW5jdGlvbiImJmZyKHQsImVycm9yIixyLGUpfWZ1bmN0aW9uIGZyKHQscixlLG4pe2lmKHR5cGVvZiB0Lm9uPT0iZnVuY3Rpb24iKW4ub25jZT90Lm9uY2UocixlKTp0Lm9uKHIsZSk7ZWxzZSBpZih0eXBlb2YgdC5hZGRFdmVudExpc3RlbmVyPT0iZnVuY3Rpb24iKXQuYWRkRXZlbnRMaXN0ZW5lcihyLGZ1bmN0aW9uIHMoaSl7bi5vbmNlJiZ0LnJlbW92ZUV2ZW50TGlzdGVuZXIocixzKSxlKGkpfSk7ZWxzZSB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgImVtaXR0ZXIiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBFdmVudEVtaXR0ZXIuIFJlY2VpdmVkIHR5cGUgJyt0eXBlb2YgdCl9dmFyIFQ7KGZ1bmN0aW9uKHQpe3RbdC5NQUpPUl9FVkVOVD0wXT0iTUFKT1JfRVZFTlQiLHRbdC5NSU5PUl9FVkVOVD0xXT0iTUlOT1JfRVZFTlQifSkoVHx8KFQ9e30pKTt2YXIgUzsoZnVuY3Rpb24odCl7dC5QUkVDQUxMX1RFU1RfQkVHSU49InByZWNhbGxfYmVnaW4iLHQuUFJFQ0FMTF9URVNUX0NPTVBMRVRFPSJwcmVjYWxsX2VuZCIsdC5DQUxMX0pPSU5fQkVHSU49ImNhbGxfam9pbiIsdC5ORVRfUVVBTElUWV9URVNUX0JFR0lOPSJuZXRfcXVhbGl0eV90ZXN0X2JlZ2luIix0Lk5FVF9RVUFMSVRZX1RFU1RfRU5EPSJuZXRfcXVhbGl0eV90ZXN0X2VuZCIsdC5XRUJTT0NLRVRfQ09OTkVDVEVEPSJ3ZWJzb2NrZXRfY29ubmVjdGVkIix0LlRSQU5TUE9SVF9DT05ORUNURUQ9InRyYW5zcG9ydF9jb25uZWN0ZWQiLHQuQVVESU9fT049ImF1ZGlvX29uIix0LkFVRElPX09GRj0iYXVkaW9fb2ZmIix0LlZJREVPX09OPSJ2aWRlb19vbiIsdC5WSURFT19PRkY9InZpZGVvX29mZiIsdC5QQVJUSUNJUEFOVF9ST0xFPSJwYXJ0aWNpcGFudF9yb2xlIix0LlBJTkdfU1RBVD0icGluZ19zdGF0Iix0LkRJU0NPTk5FQ1Q9ImRpc2Nvbm5lY3QiLHQuUkVDT05ORUNUX0FUVEVNUFQ9InJlY29ubmVjdF9hdHRlbXB0Iix0LlNDUkVFTlNIQVJFX1NUQVJUX1JFUVVFU1RFRD0ic2NyZWVuc2hhcmVfc3RhcnRfcmVxdWVzdGVkIix0LlNDUkVFTlNIQVJFX1NUQVJURUQ9InNjcmVlbnNoYXJlX3N0YXJ0ZWQiLHQuU0NSRUVOU0hBUkVfU1RPUFBFRD0ic2NyZWVuc2hhcmVfc3RvcHBlZCIsdC5UQUJfQ0hBTkdFPSJ0YWJfY2hhbmdlIix0LkJST1dTRVJfQkFDS0dST1VOREVEPSJicm93c2VyX2JhY2tncm91bmRlZCIsdC5CUk9XU0VSX0ZPUkVHUk9VTkRFRD0iYnJvd3Nlcl9mb3JlZ3JvdW5kZWQiLHQuRE9NSU5BTlRfU1BFQUtFUj0iZG9taW5hbnRfc3BlYWtlciIsdC5BVURJT19ERVZJQ0VTX1VQREFURVM9ImF1ZGlvX2RldmljZXNfdXBkYXRlcyIsdC5WSURFT19ERVZJQ0VTX1VQREFURVM9InZpZGVvX2RldmljZXNfdXBkYXRlcyIsdC5TUEVBS0VSX0RFVklDRVNfVVBEQVRFUz0ic3BlYWtlcl9kZXZpY2VzX3VwZGF0ZXMiLHQuU0VMRUNURURfTUlDUk9IUE9ORV9VUERBVEU9InNlbGVjdGVkX21pY3JvcGhvbmVfdXBkYXRlIix0LlNFTEVDVEVEX0NBTUVSQV9VUERBVEU9InNlbGVjdGVkX2NhbWVyYV91cGRhdGUiLHQuU0VMRUNURURfU1BFQUtFUl9VUERBVEU9InNlbGVjdGVkX3NwZWFrZXJfdXBkYXRlIix0LkVYUEVDVEVEX1ZJREVPX1JFU09MVVRJT049ImV4cGVjdGVkX3ZpZGVvX3Jlc29sdXRpb24iLHQuRVhQRUNURURfU0NSRUVOU0hBUkVfUkVTT0xVVElPTj0iZXhwZWN0ZWRfc2NyZWVuc2hhcmVfcmVzb2x1dGlvbiIsdC5NRURJQV9QRVJNSVNTSU9OPSJtZWRpYV9wZXJtaXNzaW9uIix0LkxFR0FDWV9TV0lUQ0g9ImxlZ2FjeV9zd2l0Y2giLHQuQVVESU9fUExBWV9GQUlMRUQ9ImF1ZGlvX3BsYXlfZmFpbGVkIix0LlZJREVPX1BMQVlfRkFJTEVEPSJ2aWRlb19wbGF5X2ZhaWxlZCIsdC5BVURJT19UUkFDS19NVVRFRD0iYXVkaW9fdHJhY2tfbXV0ZWQiLHQuVklERU9fVFJBQ0tfTVVURUQ9InZpZGVvX3RyYWNrX211dGVkIix0LklWU19QTEFZRVJfUkVCVUZGRVJJTkc9Iml2c19wbGF5ZXJfcmVidWZmZXJpbmciLHQuSVZTX1BMQVlFUl9BVURJT19CTE9DS0VEPSJpdnNfcGxheWVyX2F1ZGlvX2Jsb2NrZWQiLHQuSVZTX1BMQVlFUl9QTEFZQkFDS19CTE9DS0VEPSJpdnNfcGxheWVyX3BsYXliYWNrX2Jsb2NrZWQiLHQuSVZTX1BMQVlFUl9FUlJPUj0iaXZzX3BsYXllcl9lcnJvciIsdC5JVlNfUExBWUVSX1JFQ09WRVJBQkxFX0VSUk9SPSJpdnNfcGxheWVyX3JlY292ZXJhYmxlX2Vycm9yIix0LklWU19QTEFZRVJfV09SS0VSX0VSUk9SPSJpdnNfcGxheWVyX3dvcmtlcl9lcnJvciIsdC5JVlNfUExBWUVSX05FVFdPUktfVU5BVkFJTEFCTEU9Iml2c19wbGF5ZXJfbmV0d29ya191bmF2YWlsYWJsZSIsdC5MSVZFU1RSRUFNX0xBVEVOQ1k9ImxpdmVzdHJlYW1fbGF0ZW5jeSIsdC5JVlNfUExBWUVSX0FOQUxZVElDU19FVkVOVD0iaXZzX3BsYXllcl9hbmFseXRpY3NfZXZlbnQiLHQuSVZTX1BMQVlFUl9QTEFZQkFDS19SQVRFX0NIQU5HRUQ9Iml2c19wbGF5ZXJfcGxheWJhY2tfcmF0ZV9jaGFuZ2VkIix0LklWU19QTEFZRVJfUVVBTElUWV9DSEFOR0VEPSJpdnNfcGxheWVyX3F1YWxpdHlfY2hhbmdlZCIsdC5JVlNfUExBWUVSX0lOSVRJQUxJWkVEPSJpdnNfcGxheWVyX2luaXRpYWxpemVkIn0pKFN8fChTPXt9KSk7Y29uc3QgdXM9bmV3IE1hcChbW1MuUFJFQ0FMTF9URVNUX0JFR0lOLFQuTUlOT1JfRVZFTlRdLFtTLlBSRUNBTExfVEVTVF9DT01QTEVURSxULk1JTk9SX0VWRU5UXSxbUy5DQUxMX0pPSU5fQkVHSU4sVC5NQUpPUl9FVkVOVF0sW1MuTkVUX1FVQUxJVFlfVEVTVF9CRUdJTixULk1JTk9SX0VWRU5UXSxbUy5ORVRfUVVBTElUWV9URVNUX0VORCxULk1JTk9SX0VWRU5UXSxbUy5XRUJTT0NLRVRfQ09OTkVDVEVELFQuTUlOT1JfRVZFTlRdLFtTLlRSQU5TUE9SVF9DT05ORUNURUQsVC5NQUpPUl9FVkVOVF0sW1MuQVVESU9fT04sVC5NSU5PUl9FVkVOVF0sW1MuQVVESU9fT0ZGLFQuTUlOT1JfRVZFTlRdLFtTLlZJREVPX09OLFQuTUlOT1JfRVZFTlRdLFtTLlZJREVPX09GRixULk1JTk9SX0VWRU5UXSxbUy5QQVJUSUNJUEFOVF9ST0xFLFQuTUlOT1JfRVZFTlRdLFtTLlBJTkdfU1RBVCxULk1BSk9SX0VWRU5UXSxbUy5ESVNDT05ORUNULFQuTUFKT1JfRVZFTlRdLFtTLlJFQ09OTkVDVF9BVFRFTVBULFQuTUFKT1JfRVZFTlRdLFtTLlNDUkVFTlNIQVJFX1NUQVJUX1JFUVVFU1RFRCxULk1JTk9SX0VWRU5UXSxbUy5TQ1JFRU5TSEFSRV9TVEFSVEVELFQuTUlOT1JfRVZFTlRdLFtTLlNDUkVFTlNIQVJFX1NUT1BQRUQsVC5NSU5PUl9FVkVOVF0sW1MuVEFCX0NIQU5HRSxULk1JTk9SX0VWRU5UXSxbUy5CUk9XU0VSX0JBQ0tHUk9VTkRFRCxULk1JTk9SX0VWRU5UXSxbUy5CUk9XU0VSX0ZPUkVHUk9VTkRFRCxULk1JTk9SX0VWRU5UXSxbUy5ET01JTkFOVF9TUEVBS0VSLFQuTUlOT1JfRVZFTlRdLFtTLkFVRElPX0RFVklDRVNfVVBEQVRFUyxULk1JTk9SX0VWRU5UXSxbUy5WSURFT19ERVZJQ0VTX1VQREFURVMsVC5NSU5PUl9FVkVOVF0sW1MuU1BFQUtFUl9ERVZJQ0VTX1VQREFURVMsVC5NSU5PUl9FVkVOVF0sW1MuU0VMRUNURURfTUlDUk9IUE9ORV9VUERBVEUsVC5NSU5PUl9FVkVOVF0sW1MuU0VMRUNURURfQ0FNRVJBX1VQREFURSxULk1JTk9SX0VWRU5UXSxbUy5TRUxFQ1RFRF9TUEVBS0VSX1VQREFURSxULk1JTk9SX0VWRU5UXSxbUy5NRURJQV9QRVJNSVNTSU9OLFQuTUlOT1JfRVZFTlRdLFtTLkxFR0FDWV9TV0lUQ0gsVC5NSU5PUl9FVkVOVF0sW1MuQVVESU9fUExBWV9GQUlMRUQsVC5NSU5PUl9FVkVOVF0sW1MuVklERU9fUExBWV9GQUlMRUQsVC5NSU5PUl9FVkVOVF0sW1MuQVVESU9fVFJBQ0tfTVVURUQsVC5NSU5PUl9FVkVOVF0sW1MuVklERU9fVFJBQ0tfTVVURUQsVC5NSU5PUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9SRUJVRkZFUklORyxULk1BSk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX0FVRElPX0JMT0NLRUQsVC5NQUpPUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9QTEFZQkFDS19CTE9DS0VELFQuTUFKT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfRVJST1IsVC5NQUpPUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9SRUNPVkVSQUJMRV9FUlJPUixULk1BSk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX1dPUktFUl9FUlJPUixULk1BSk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX05FVFdPUktfVU5BVkFJTEFCTEUsVC5NQUpPUl9FVkVOVF0sW1MuTElWRVNUUkVBTV9MQVRFTkNZLFQuTUFKT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfQU5BTFlUSUNTX0VWRU5ULFQuTUlOT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfUExBWUJBQ0tfUkFURV9DSEFOR0VELFQuTUlOT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfUVVBTElUWV9DSEFOR0VELFQuTUlOT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfSU5JVElBTElaRUQsVC5NSU5PUl9FVkVOVF0sW1MuRVhQRUNURURfVklERU9fUkVTT0xVVElPTixULk1JTk9SX0VWRU5UXSxbUy5FWFBFQ1RFRF9TQ1JFRU5TSEFSRV9SRVNPTFVUSU9OLFQuTUlOT1JfRVZFTlRdXSk7Y2xhc3MgcHN7Y29uc3RydWN0b3IoKXtwKHRoaXMsImV2ZW50cyIpO3RoaXMuZXZlbnRzPVtdfWFkZChyKXt0aGlzLmV2ZW50cy5wdXNoKHIpfWZsdXNoKCl7cmV0dXJue2VudHJpZXM6dGhpcy5ldmVudHMuc3BsaWNlKDAsMjUpfX19Y2xhc3MgaHMgZXh0ZW5kcyBxe2NvbnN0cnVjdG9yKHtsb2dnZXI6ZSxwZWVySWQ6bixhcGlIb3N0bmFtZXM6c30pe3N1cGVyKCk7cCh0aGlzLCJsb2dnZXIiKTtwKHRoaXMsInBlZXJJZCIpO3AodGhpcywiZXZlbnRTdG9yZSIpO3AodGhpcywiYXBpRW5kcG9pbnQiKTt0aGlzLmxvZ2dlcj1lLHRoaXMucGVlcklkPW4sdGhpcy5hcGlFbmRwb2ludD1gaHR0cHM6Ly8ke3MuZGFDb2xsZWN0b3J9L2FwaS92MS9tZXNzYWdlYCx0aGlzLmV2ZW50U3RvcmU9bmV3IHBzfXNlbmRFdmVudHNDaHVua1RvU2VydmVyKGUpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXt2YXIgcztjb25zdCBuPXtwYXlsb2FkOmUscGVlcklkOnRoaXMucGVlcklkfTt0cnl7cmV0dXJuIHlpZWxkIGZldGNoKHRoaXMuYXBpRW5kcG9pbnQse21ldGhvZDoiUE9TVCIsYm9keTpKU09OLnN0cmluZ2lmeShuKX0pLCEwfWNhdGNoKGkpe3JldHVybiB0aGlzLmxvZ2dlci5lcnJvcigiY2FsbFN0YXRzOjpzZW5kRXZlbnRzQ2h1bmtUb1NlcnZlcjo6Y2F0Y2giLHtlcnJvcjppfSksKHM9ZS5lbnRyaWVzKT09bnVsbHx8cy5mb3JFYWNoKGE9Pnt0aGlzLmV2ZW50U3RvcmUuYWRkKGEpfSksITF9fSl9Y2FsbEV2ZW50KGUpe2UudGltZXN0YW1wPW5ldyBEYXRlLHRoaXMuZXZlbnRTdG9yZS5hZGQoZSksdGhpcy5lbWl0KGUuZXZlbnQsZS5tZXRhRGF0YSksdXMuZ2V0KGUuZXZlbnQpPT09VC5NQUpPUl9FVkVOVCYmdGhpcy5mbHVzaCgpfWZsdXNoKCl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3ZhciBuO2NvbnN0IGU9dGhpcy5ldmVudFN0b3JlLmZsdXNoKCk7cmV0dXJuKG49ZT09bnVsbD92b2lkIDA6ZS5lbnRyaWVzKSE9bnVsbCYmbi5sZW5ndGg/KHlpZWxkIHRoaXMuc2VuZEV2ZW50c0NodW5rVG9TZXJ2ZXIoZSksITApOiExfSl9fXZhciBtcjsoZnVuY3Rpb24odCl7dC5DSFJPTUlVTT0iY2hyb211bSIsdC5GSVJFRk9YPSJmaXJlZm94Iix0LlNBRkFSST0ic2FmYXJpIn0pKG1yfHwobXI9e30pKTtjb25zdCBncj17REVWRUw6ImRldmVsIixQUkVQUk9EOiJwcmVwcm9kIixQUk9EOiJwcm9kIn07dmFyIEo7KGZ1bmN0aW9uKHQpe3QuQVVESU89IkFVRElPIix0LlZJREVPPSJWSURFTyIsdC5TUEVBS0VSPSJTUEVBS0VSIix0LlNDUkVFTlNIQVJFPSJTQ1JFRU5TSEFSRSJ9KShKfHwoSj17fSkpO3ZhciBTcjsoZnVuY3Rpb24odCl7dFt0LklOSVQ9MF09IklOSVQiLHRbdC5BQ0NFUFRFRD0xXT0iQUNDRVBURUQiLHRbdC5ERU5JRUQ9Ml09IkRFTklFRCIsdFt0LlNZU19ERU5JRUQ9M109IlNZU19ERU5JRUQiLHRbdC5GQUlMRUQ9NF09IkZBSUxFRCIsdFt0Lk5PVEZPVU5EPTVdPSJOT1RGT1VORCIsdFt0Lk5PVF9BUFBMSUNBQkxFPTZdPSJOT1RfQVBQTElDQUJMRSJ9KShTcnx8KFNyPXt9KSk7ZnVuY3Rpb24gYWUodCl7cmV0dXJuIHQ/dC5zcGxpdCgiLiIpLnNsaWNlKDAsMikuY29uY2F0KFsiMCIsIjAiXSkuam9pbigiLiIpOiIifWZ1bmN0aW9uIGx0KHtwYWNrZXRzTG9zdDp0LHBhY2tldHNTZW50OnJ9KXtyZXR1cm4gcj4wP3QqMTAwL3I6MH1mdW5jdGlvbiB1dCh7cGFja2V0c0xvc3Q6dCxwYWNrZXRzUmVjZWl2ZWQ6cn0pe3JldHVybiByK3Q+MD90KjEwMC8ocit0KTowfWNvbnN0IHZyPTI0MCx5cj03MjAsYnI9OCxFcj0zLHB0PTEwLGh0PS4wMixmdD0uMDM7ZnVuY3Rpb24gdGUoe3N0YXQ6dCx3ZWlnaHQ6cixyYW5nZU1pbjplLHJhbmdlTWF4Om4scmFuZ2VSYW5raW5nRGlyZWN0aW9uOnN9KXtyZXR1cm4gdD09bnVsbD9yOmU9PT1uP3M9PT0iVVAiP3Q8PWU/cjowOnQ+PW4/cjowOnM9PT0iVVAiPygxLU1hdGgubWF4KE1hdGgubWluKG4sTWF0aC5hYnModCkpLWUsMCkvKG4tZSkpKnI6cz09PSJET1dOIj9NYXRoLm1heChNYXRoLm1pbihuLE1hdGguYWJzKHQpKS1lLDApLyhuLWUpKnI6cn1mdW5jdGlvbiBfcih7aXNMb3dRdWFsaXR5VmlkZW86dCxpc1ZpZGVvU3R1Y2s6cixpc1ZpZGVvTGFnZ2luZzplLGppdHRlclF1YWxpdHk6bixwYWNrZXRzTG9zdFF1YWxpdHk6c30pe2NvbnN0IGk9LjgqKCh0Py44NToxKSooZT8uNzoxKSoocj8uNToxKSkrLjIqKG4qcyk7cmV0dXJuIE1hdGgucm91bmQoKGkrTnVtYmVyLkVQU0lMT04pKjEwMCkvMTAwfWZ1bmN0aW9uIFRyKHtwYWNrZXRzTG9zdDp0LHBhY2tldHNTZW50OnJ9KXtyZXR1cm4gcj4wP3QqMTAwL3I6MH1mdW5jdGlvbiBScih7cGFja2V0c0xvc3Q6dCxwYWNrZXRzU2VudDpyLGppdHRlcjplfSl7Y29uc3Qgcz10ZSh7c3RhdDpUcih7cGFja2V0c0xvc3Q6dCxwYWNrZXRzU2VudDpyfSksd2VpZ2h0Oi43LHJhbmdlTWluOjAscmFuZ2VNYXg6cHQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KSxhPXRlKHtzdGF0OmUsd2VpZ2h0Oi4zLHJhbmdlTWluOmh0LHJhbmdlTWF4OmZ0LHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSk7cmV0dXJuIHMrYX1mdW5jdGlvbiBmcyh7ZnJhbWVXaWR0aDp0LGlzU2NyZWVuU2hhcmU6cn0pe3JldHVybiB0PChyP3lyOnZyKX1mdW5jdGlvbiBtcyh7ZnJhbWVzUGVyU2Vjb25kOnQsaXNTY3JlZW5TaGFyZTpyfSl7cmV0dXJuIHQ8KHI/RXI6YnIpfWZ1bmN0aW9uIGdzKHtmcmFtZXNFbmNvZGVkOnR9KXtyZXR1cm4gdD09PTB9ZnVuY3Rpb24gUHIoe2ZyYW1lV2lkdGg6dCxmcmFtZXNQZXJTZWNvbmQ6cixwYWNrZXRzTG9zdDplLHBhY2tldHNTZW50Om4saml0dGVyOnMsaXNTY3JlZW5TaGFyZTppLGZyYW1lc0VuY29kZWQ6YX0pe2NvbnN0IGQ9dGUoe3N0YXQ6VHIoe3BhY2tldHNMb3N0OmUscGFja2V0c1NlbnQ6bn0pLHdlaWdodDoxLHJhbmdlTWluOjAscmFuZ2VNYXg6cHQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KSxvPXRlKHtzdGF0OnMsd2VpZ2h0OjEscmFuZ2VNaW46aHQscmFuZ2VNYXg6ZnQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KSxsPWZzKHtmcmFtZVdpZHRoOnQsaXNTY3JlZW5TaGFyZTppfSksbT1tcyh7ZnJhbWVzUGVyU2Vjb25kOnIsaXNTY3JlZW5TaGFyZTppfSksdj1ncyh7ZnJhbWVzRW5jb2RlZDphLGlzU2NyZWVuU2hhcmU6aX0pO3JldHVybiBfcih7aXNMb3dRdWFsaXR5VmlkZW86bCxpc1ZpZGVvTGFnZ2luZzptLGlzVmlkZW9TdHVjazp2LGppdHRlclF1YWxpdHk6byxwYWNrZXRzTG9zdFF1YWxpdHk6ZH0pfWZ1bmN0aW9uIENyKHtwYWNrZXRzTG9zdDp0LHBhY2tldHNSZWNlaXZlZDpyfSl7cmV0dXJuIHIrdD4wP3QqMTAwLyhyK3QpOjB9ZnVuY3Rpb24gd3Ioe2NvbmNlYWxtZW50RXZlbnRzOnQscGFja2V0c0xvc3Q6cixwYWNrZXRzUmVjZWl2ZWQ6ZSxqaXR0ZXI6bn0pe2NvbnN0IGk9dGUoe3N0YXQ6dCx3ZWlnaHQ6LjIscmFuZ2VNaW46MCxyYW5nZU1heDozLHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSksYT0uNSxkPXRlKHtzdGF0OkNyKHtwYWNrZXRzTG9zdDpyLHBhY2tldHNSZWNlaXZlZDplfSksd2VpZ2h0OmEscmFuZ2VNaW46MCxyYW5nZU1heDpwdCxyYW5nZVJhbmtpbmdEaXJlY3Rpb246IlVQIn0pLGw9dGUoe3N0YXQ6bix3ZWlnaHQ6LjMscmFuZ2VNaW46aHQscmFuZ2VNYXg6ZnQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KTtyZXR1cm4gaStkK2x9ZnVuY3Rpb24gU3Moe2ZyYW1lc0RlY29kZWQ6dH0pe3JldHVybiB0PT09MH1mdW5jdGlvbiB2cyh7ZnJhbWVzUGVyU2Vjb25kOnQsaXNTY3JlZW5TaGFyZTpyfSl7cmV0dXJuIHQ8KHI/RXI6YnIpfWZ1bmN0aW9uIHlzKHtmcmFtZVdpZHRoOnQsaXNTY3JlZW5TaGFyZTpyfSl7cmV0dXJuIHQ8KHI/eXI6dnIpfWZ1bmN0aW9uIElyKHtmcmFtZVdpZHRoOnQsZnJhbWVzUGVyU2Vjb25kOnIscGFja2V0c0xvc3Q6ZSxwYWNrZXRzUmVjZWl2ZWQ6bixqaXR0ZXI6cyxpc1NjcmVlblNoYXJlOmksZnJhbWVzRGVjb2RlZDphfSl7Y29uc3QgZD10ZSh7c3RhdDpDcih7cGFja2V0c0xvc3Q6ZSxwYWNrZXRzUmVjZWl2ZWQ6bn0pLHdlaWdodDoxLHJhbmdlTWluOjAscmFuZ2VNYXg6cHQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KSxvPXRlKHtzdGF0OnMsd2VpZ2h0OjEscmFuZ2VNaW46aHQscmFuZ2VNYXg6ZnQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KSxsPXlzKHtmcmFtZVdpZHRoOnQsaXNTY3JlZW5TaGFyZTppfSksbT12cyh7ZnJhbWVzUGVyU2Vjb25kOnIsaXNTY3JlZW5TaGFyZTppfSksdj1Tcyh7ZnJhbWVzRGVjb2RlZDphLGlzU2NyZWVuU2hhcmU6aX0pO3JldHVybiBfcih7aXNMb3dRdWFsaXR5VmlkZW86bCxpc1ZpZGVvTGFnZ2luZzptLGlzVmlkZW9TdHVjazp2LGppdHRlclF1YWxpdHk6byxwYWNrZXRzTG9zdFF1YWxpdHk6ZH0pfWNsYXNzIHJle2NvbnN0cnVjdG9yKHIpe3AodGhpcywicGMxIik7cCh0aGlzLCJwYzIiKTtwKHRoaXMsImNvbnN0cmFpblZpZGVvQml0cmF0ZUticHMiKTtwKHRoaXMsImNvbnN0cmFpbk9mZmVyVG9SZW1vdmVWaWRlb0ZlYyIsITEpO3AodGhpcywiaWNlQ2FuZGlkYXRlRmlsdGVyIik7Y29uc3QgZT1uZXcgUlRDUGVlckNvbm5lY3Rpb24ociksbj1uZXcgUlRDUGVlckNvbm5lY3Rpb24ocik7dGhpcy5wYzE9ZSx0aGlzLnBjMj1uLHRoaXMuaWNlQ2FuZGlkYXRlRmlsdGVyPXJlLm5vRmlsdGVyLHRoaXMucGMxLmFkZEV2ZW50TGlzdGVuZXIoImljZWNhbmRpZGF0ZSIsdGhpcy5vbkljZUNhbmRpZGF0ZS5iaW5kKHRoaXMsdGhpcy5wYzIpKSx0aGlzLnBjMi5hZGRFdmVudExpc3RlbmVyKCJpY2VjYW5kaWRhdGUiLHRoaXMub25JY2VDYW5kaWRhdGUuYmluZCh0aGlzLHRoaXMucGMxKSl9c3RhdGljIHBhcnNlQ2FuZGlkYXRlKHIpe2NvbnN0IGU9ImNhbmRpZGF0ZToiLG49ci5pbmRleE9mKGUpK2UubGVuZ3RoLHM9ci5zdWJzdHIobikuc3BsaXQoIiAiKTtyZXR1cm57dHlwZTpzWzddLHByb3RvY29sOnNbMl0sYWRkcmVzczpzWzRdfX1zdGF0aWMgaXNOb3RIb3N0Q2FuZGlkYXRlKHIpe3JldHVybiByLnR5cGUhPT0iaG9zdCJ9c3RhdGljIGlzSG9zdChyKXtyZXR1cm4gci50eXBlPT09Imhvc3QifXN0YXRpYyBpc1JlbGF5KHIpe3JldHVybiByLnR5cGU9PT0icmVsYXkifXN0YXRpYyBpc1JlZmxleGl2ZShyKXtyZXR1cm4gci50eXBlPT09InNyZmx4In1zdGF0aWMgbm9GaWx0ZXIocil7cmV0dXJuITB9b25JY2VDYW5kaWRhdGUocixlKXtpZihlLmNhbmRpZGF0ZSl7Y29uc3Qgbj1yZS5wYXJzZUNhbmRpZGF0ZShlLmNhbmRpZGF0ZS5jYW5kaWRhdGUpO3RoaXMuaWNlQ2FuZGlkYXRlRmlsdGVyKG4pJiZyLmFkZEljZUNhbmRpZGF0ZShlLmNhbmRpZGF0ZSl9fXNldEljZUNhbmRpZGF0ZUZpbHRlcihyKXt0aGlzLmljZUNhbmRpZGF0ZUZpbHRlcj1yfWNvbnN0cmFpblZpZGVvQml0cmF0ZShyKXt0aGlzLmNvbnN0cmFpblZpZGVvQml0cmF0ZUticHM9cn1kaXNhYmxlVmlkZW9GZWMoKXt0aGlzLmNvbnN0cmFpbk9mZmVyVG9SZW1vdmVWaWRlb0ZlYz0hMH1nb3RPZmZlcihyKXt0aGlzLmNvbnN0cmFpbk9mZmVyVG9SZW1vdmVWaWRlb0ZlYyYmKHIuc2RwPXIuc2RwLnJlcGxhY2UoLyhtPXZpZGVvIDEgW15ccl0rKSgxMTYgMTE3KShcclxuKS9nLGAkMVxyCmApLHIuc2RwPXIuc2RwLnJlcGxhY2UoL2E9cnRwbWFwOjExNiByZWRcLzkwMDAwXHJcbi9nLCIiKSxyLnNkcD1yLnNkcC5yZXBsYWNlKC9hPXJ0cG1hcDoxMTcgdWxwZmVjXC85MDAwMFxyXG4vZywiIiksci5zZHA9ci5zZHAucmVwbGFjZSgvYT1ydHBtYXA6OTggcnR4XC85MDAwMFxyXG4vZywiIiksci5zZHA9ci5zZHAucmVwbGFjZSgvYT1mbXRwOjk4IGFwdD0xMTZcclxuL2csIiIpKSx0aGlzLnBjMS5zZXRMb2NhbERlc2NyaXB0aW9uKHIpLHRoaXMucGMyLnNldFJlbW90ZURlc2NyaXB0aW9uKHIpLHRoaXMucGMyLmNyZWF0ZUFuc3dlcigpLnRoZW4odGhpcy5nb3RBbnN3ZXIuYmluZCh0aGlzKSx0aGlzLnJlcG9ydEZhdGFsLmJpbmQodGhpcykpfWdvdEFuc3dlcihyKXt0aGlzLmNvbnN0cmFpblZpZGVvQml0cmF0ZUticHMmJihyLnNkcD1yLnNkcC5yZXBsYWNlKC9hPW1pZDp2aWRlb1xyXG4vZyxgYT1taWQ6dmlkZW9ccgpiPUFTOiR7dGhpcy5jb25zdHJhaW5WaWRlb0JpdHJhdGVLYnBzfVxyCmApKSx0aGlzLnBjMi5zZXRMb2NhbERlc2NyaXB0aW9uKHIpLHRoaXMucGMxLnNldFJlbW90ZURlc2NyaXB0aW9uKHIpfWVzdGFibGlzaENvbm5lY3Rpb24oKXt0aGlzLnBjMS5jcmVhdGVPZmZlcigpLnRoZW4odGhpcy5nb3RPZmZlci5iaW5kKHRoaXMpLHRoaXMucmVwb3J0RmF0YWwuYmluZCh0aGlzKSl9cmVwb3J0RmF0YWwocil7Y29uc29sZS5lcnJvcigiRXJyb3I6IixyKX1nZXRSb3VuZFRyaXBUaW1lKCl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0W3IsZV09eWllbGQgUHJvbWlzZS5hbGwoW3RoaXMucGMxLmdldFN0YXRzKCksdGhpcy5wYzIuZ2V0U3RhdHMoKV0pO2xldCBuLHM7aWYoci5mb3JFYWNoKGk9PntpLnR5cGU9PT0iY2FuZGlkYXRlLXBhaXIiJiZpLm5vbWluYXRlZD09PSEwJiZpLmJ5dGVzU2VudD4wJiYobj1pKX0pLGUuZm9yRWFjaChpPT57aS50eXBlPT09ImNhbmRpZGF0ZS1wYWlyIiYmaS5ub21pbmF0ZWQ9PT0hMCYmaS5ieXRlc1JlY2VpdmVkPjAmJihzPWkpfSksbiYmcyl0cnl7aWYobi5jdXJyZW50Um91bmRUcmlwVGltZSYmcy5jdXJyZW50Um91bmRUcmlwVGltZSlyZXR1cm57cnR0Om4uY3VycmVudFJvdW5kVHJpcFRpbWUsYmFja2VuZFJUVDpzLmN1cnJlbnRSb3VuZFRyaXBUaW1lfTtjb25zdCBpPShzLmxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcC1uLmxhc3RQYWNrZXRTZW50VGltZXN0YW1wKS8xZTM7cmV0dXJue3J0dDppLGJhY2tlbmRSVFQ6aX19Y2F0Y2goaSl7cmV0dXJufX0pfWNsb3NlKCl7dGhpcy5wYzEuY2xvc2UoKSx0aGlzLnBjMi5jbG9zZSgpfX1jbGFzcyBBciBleHRlbmRzIHF7Y29uc3RydWN0b3IoZSl7c3VwZXIoKTtwKHRoaXMsImNhbGwiKTtwKHRoaXMsInRpbWVPdXQiKTt0aGlzLmNhbGw9bmV3IHJlKGUpfXN0YXJ0KGU9MWU0KXt0aGlzLmNhbGwuZXN0YWJsaXNoQ29ubmVjdGlvbigpLHRoaXMudGltZU91dD1zZXRUaW1lb3V0KHRoaXMudGVzdEZhaWxlZC5iaW5kKHRoaXMpLGUpfXRlc3RDb21wbGV0ZShlKXtjbGVhclRpbWVvdXQodGhpcy50aW1lT3V0KSx0aGlzLmNhbGwuY2xvc2UoKSx0aGlzLmVtaXQoImRvbmUiLGUpfXRlc3RGYWlsZWQoZSl7dGhpcy5jYWxsLmNsb3NlKCksdGhpcy5lbWl0KCJmYWlsZWQiLGUpfX1jb25zdCBicz04LEVzPTEvMWUzO2NsYXNzIF9zIGV4dGVuZHMgQXJ7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSk7cCh0aGlzLCJzZW5kZXJDaGFubmVsIik7cCh0aGlzLCJyZWNpZXZlQ2hhbm5lbCIpO3AodGhpcywic3RhcnRUaW1lIik7cCh0aGlzLCJsYXN0Qml0cmF0ZU1lYXN1cmVUaW1lIik7cCh0aGlzLCJzZW50UGF5bG9hZEJ5dGVzIiwwKTtwKHRoaXMsInJlY2lldmVkUGF5bG9hZEJ5dGVzIiwwKTtwKHRoaXMsImxhc3RSZWNlaXZlZFBheWxvYWRCeXRlcyIsMCk7cCh0aGlzLCJzdG9wU2VuZGluZyIsITEpO3AodGhpcywidGVzdFByb2dyZXNzIiwwKTtwKHRoaXMsInNhbXBsZVBhY2tldCIsIiIpO3AodGhpcywiZmluYWxCaXRyYXRlU3VtIiwwKTtwKHRoaXMsImJpdFJhdGVTYW1wZWxzIiwwKTtwKHRoaXMsIm1heE51bWJlck9mUGFja2V0c1RvU2VuZCIsMCk7cCh0aGlzLCJieXRlc1RvS2VlcEJ1ZmZlcmVkIiwwKTtwKHRoaXMsInRlc3REdXJhdGlvblNlY29uZHMiLDUpO3RoaXMuY2FsbC5zZXRJY2VDYW5kaWRhdGVGaWx0ZXIocmUuaXNOb3RIb3N0Q2FuZGlkYXRlKSx0aGlzLnNlbmRlckNoYW5uZWw9dGhpcy5jYWxsLnBjMS5jcmVhdGVEYXRhQ2hhbm5lbChudWxsKTtmb3IobGV0IG49MDtuPDEwMjQqMjU2O24rPTEpdGhpcy5zYW1wbGVQYWNrZXQrPSJoIjt0aGlzLm1heE51bWJlck9mUGFja2V0c1RvU2VuZD0xLHRoaXMuYnl0ZXNUb0tlZXBCdWZmZXJlZD0xMDI0KnRoaXMubWF4TnVtYmVyT2ZQYWNrZXRzVG9TZW5kLHRoaXMudGVzdER1cmF0aW9uU2Vjb25kcz00LHRoaXMuc2VuZGVyQ2hhbm5lbC5hZGRFdmVudExpc3RlbmVyKCJvcGVuIix0aGlzLnNlbmRpbmdTdGVwLmJpbmQodGhpcykpLHRoaXMuY2FsbC5wYzIuYWRkRXZlbnRMaXN0ZW5lcigiZGF0YWNoYW5uZWwiLHRoaXMub25SZWNpZXZlckNoYW5uZWwuYmluZCh0aGlzKSl9c2VuZGluZ1N0ZXAoKXtjb25zdCBlPW5ldyBEYXRlO3RoaXMuc3RhcnRUaW1lfHwodGhpcy5zdGFydFRpbWU9ZSx0aGlzLmxhc3RCaXRyYXRlTWVhc3VyZVRpbWU9ZSk7Zm9yKGxldCBzPTA7cyE9PXRoaXMubWF4TnVtYmVyT2ZQYWNrZXRzVG9TZW5kJiYhKHRoaXMuc2VuZGVyQ2hhbm5lbC5idWZmZXJlZEFtb3VudD49dGhpcy5ieXRlc1RvS2VlcEJ1ZmZlcmVkKTtzKz0xKXt0aGlzLnNlbnRQYXlsb2FkQnl0ZXMrPXRoaXMuc2FtcGxlUGFja2V0Lmxlbmd0aDt0cnl7dGhpcy5zZW5kZXJDaGFubmVsLnNlbmQodGhpcy5zYW1wbGVQYWNrZXQpfWNhdGNoKGkpe319Y29uc3Qgbj1lLmdldFRpbWUoKS10aGlzLnN0YXJ0VGltZS5nZXRUaW1lKCk7bj49MWUzKnRoaXMudGVzdER1cmF0aW9uU2Vjb25kcz8odGhpcy5zdG9wU2VuZGluZz0hMCx0aGlzLnRlc3RQcm9ncmVzcz0xMDApOih0aGlzLnRlc3RQcm9ncmVzcz1uLygxMCp0aGlzLnRlc3REdXJhdGlvblNlY29uZHMpLHNldFRpbWVvdXQodGhpcy5zZW5kaW5nU3RlcC5iaW5kKHRoaXMpLDEpKX1vbk1lc3NhZ2VSZWNpZXZlZChlKXt0aGlzLnJlY2lldmVkUGF5bG9hZEJ5dGVzKz1lLmRhdGEubGVuZ3RoO2NvbnN0IG49bmV3IERhdGUscz1uLmdldFRpbWUoKS10aGlzLmxhc3RCaXRyYXRlTWVhc3VyZVRpbWUuZ2V0VGltZSgpO2lmKHM+PTFlMyl7Y29uc3QgYT0odGhpcy5yZWNpZXZlZFBheWxvYWRCeXRlcy10aGlzLmxhc3RSZWNlaXZlZFBheWxvYWRCeXRlcykqYnMvKHMvMWUzKTt0aGlzLmZpbmFsQml0cmF0ZVN1bSs9YSx0aGlzLmJpdFJhdGVTYW1wZWxzKz0xLHRoaXMubGFzdFJlY2VpdmVkUGF5bG9hZEJ5dGVzPXRoaXMucmVjaWV2ZWRQYXlsb2FkQnl0ZXMsdGhpcy5sYXN0Qml0cmF0ZU1lYXN1cmVUaW1lPW59aWYodGhpcy5zdG9wU2VuZGluZyYmdGhpcy5zZW50UGF5bG9hZEJ5dGVzPT09dGhpcy5yZWNpZXZlZFBheWxvYWRCeXRlcyl7Y29uc3QgaT10aGlzLmZpbmFsQml0cmF0ZVN1bS90aGlzLmJpdFJhdGVTYW1wZWxzO3RoaXMudGVzdENvbXBsZXRlKHt0aHJvdWdocHV0Ok1hdGgucm91bmQoaSpFcyl9KX19dGVzdENvbXBsZXRlKGUpe3RoaXMuY2FsbC5nZXRSb3VuZFRyaXBUaW1lKCkudGhlbigoe3J0dDpuLGJhY2tlbmRSVFQ6c30pPT5zdXBlci50ZXN0Q29tcGxldGUoe1JUVDpuLGJhY2tlbmRSVFQ6cyx0aHJvdWdocHV0OmUudGhyb3VnaHB1dH0pKX1vblJlY2lldmVyQ2hhbm5lbChlKXt0aGlzLnJlY2lldmVDaGFubmVsPWUuY2hhbm5lbCx0aGlzLnJlY2lldmVDaGFubmVsLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMub25NZXNzYWdlUmVjaWV2ZWQuYmluZCh0aGlzKSl9fWNsYXNzIGt0IGV4dGVuZHMgQXJ7Y29uc3RydWN0b3IoZSxuPXJlLm5vRmlsdGVyKXtzdXBlcihlKTtwKHRoaXMsImNoMSIpO3AodGhpcywiY2gyIik7dGhpcy5jYWxsLnNldEljZUNhbmRpZGF0ZUZpbHRlcihuKTtjb25zdCBzPXRoaXMuY2FsbC5wYzEuY3JlYXRlRGF0YUNoYW5uZWwobnVsbCk7dGhpcy5jaDE9cyxzLmFkZEV2ZW50TGlzdGVuZXIoIm9wZW4iLCgpPT57cy5zZW5kKCJoZWxsbyIpfSkscy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLm9uQ2gxUmVjaWV2ZS5iaW5kKHRoaXMpKSx0aGlzLmNhbGwucGMyLmFkZEV2ZW50TGlzdGVuZXIoImRhdGFjaGFubmVsIix0aGlzLmRhdGFDaGFubmVsSGFuZGxlci5iaW5kKHRoaXMpKX1vbkNoMVJlY2lldmUoZSl7ZS5kYXRhIT09IndvcmxkIj90aGlzLmhhbmd1cCgiSW52YWxpZCBkYXRhIHRyYW5zbWl0dGVkLiIpOnRoaXMudGVzdENvbXBsZXRlKHtjb25uZWN0aXZpdHk6ITB9KX1vbkNoMlJlY2lldmUoZSl7aWYoZS5kYXRhIT09ImhlbGxvIil0aGlzLmhhbmd1cCgiSW52YWxpZCBkYXRhIHRyYW5zbWl0dGVkLiIpO2Vsc2UgdHJ5e3RoaXMuY2gyLnNlbmQoIndvcmxkIil9Y2F0Y2gobil7fX1kYXRhQ2hhbm5lbEhhbmRsZXIoZSl7Y29uc3Qgbj1lLmNoYW5uZWw7dGhpcy5jaDI9bixuLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMub25DaDJSZWNpZXZlLmJpbmQodGhpcykpfWhhbmd1cChlKXt0aGlzLnRlc3RGYWlsZWQoZSl9fWNsYXNzIFRzIGV4dGVuZHMga3R7Y29uc3RydWN0b3Iocil7c3VwZXIocixyZS5pc0hvc3QpfX1jbGFzcyBScyBleHRlbmRzIGt0e2NvbnN0cnVjdG9yKHIpe3N1cGVyKHIscmUuaXNSZWxheSl9fWNsYXNzIFBzIGV4dGVuZHMga3R7Y29uc3RydWN0b3Iocil7c3VwZXIocixyZS5pc1JlZmxleGl2ZSl9fWNsYXNzIENze2NvbnN0cnVjdG9yKCl7cCh0aGlzLCJpcEluZm9ybWF0aW9uIixudWxsKX1nZXRJUERldGFpbHMocyl7cmV0dXJuIHcodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24qKHtwZWVySWQ6cixhcGlIb3N0bmFtZXM6ZSxsb2dnZXI6bn0pe3ZhciBpLGEsZDtpZighdGhpcy5pcEluZm9ybWF0aW9uKXt0cnl7Y29uc3Qgbz1gaHR0cHM6Ly8ke2UubG9jYXRpb259YCxtPXlpZWxkKHlpZWxkIGZldGNoKG8pKS5qc29uKCk7aWYoKChpPW0ubG9jKT09bnVsbD92b2lkIDA6aS5sZW5ndGgpPjUpcmV0dXJuIHRoaXMuaXBJbmZvcm1hdGlvbj1tLChhPXRoaXMuaXBJbmZvcm1hdGlvbikhPW51bGwmJmEuaXAmJih0aGlzLmlwSW5mb3JtYXRpb24uaXA9YWUodGhpcy5pcEluZm9ybWF0aW9uLmlwKSksbTt0aHJvdyBFcnJvcigiSW5zdWZmaWNpZW50IGRhdGEiKX1jYXRjaChvKXtuLmVycm9yKCJjYWxsc3RhdHM6OmlwRGV0YWlsczo6IGZhaWxlZCB0byBmZXRjaCBpcCB1c2luZyBsb2NhdGlvbiBzZXJ2aWNlIix7ZXJyb3I6b30pfXRyeXtjb25zdCBvPXlpZWxkIGZldGNoKGBodHRwczovLyR7ZS5sb2NhdGlvbkxlZ2FjeX0vP3Rva2VuPTNjNDkzOTMyYjA2MjRjJnBlZXJJZD0ke3J9YCx7bWV0aG9kOiJQT1NUIn0pO3RoaXMuaXBJbmZvcm1hdGlvbj15aWVsZCBvLmpzb24oKSwoZD10aGlzLmlwSW5mb3JtYXRpb24pIT1udWxsJiZkLmlwJiYodGhpcy5pcEluZm9ybWF0aW9uLmlwPWFlKHRoaXMuaXBJbmZvcm1hdGlvbi5pcCkpfWNhdGNoKG8pe24uZXJyb3IoImNhbGxzdGF0czo6aXBEZXRhaWxzOjogZmFpbGVkIHRvIGZldGNoIGlwIHVzaW5nIGxlZ2FjeSBsb2NhdGlvbiBzZXJ2aWNlIix7ZXJyb3I6b30pfX1yZXR1cm4gdGhpcy5pcEluZm9ybWF0aW9ufSl9cmVzZXRDYWNoZSgpe3RoaXMuaXBJbmZvcm1hdGlvbj1udWxsfX1jb25zdCBNcj1uZXcgQ3Msa3I9W3t1cmxzOiJ0dXJuOnR1cm4uZHl0ZS5pbjo0NDM/dHJhbnNwb3J0PXRjcCIsdXNlcm5hbWU6ImR5dGUiLGNyZWRlbnRpYWw6ImR5dGVpbiIsY3JlZGVudGlhbFR5cGU6InBhc3N3b3JkIn0se3VybHM6InR1cm46dHVybi5keXRlLmluOjM0Nzg/dHJhbnNwb3J0PXVkcCIsdXNlcm5hbWU6ImR5dGUiLGNyZWRlbnRpYWw6ImR5dGVpbiIsY3JlZGVudGlhbFR5cGU6InBhc3N3b3JkIn1dO2Z1bmN0aW9uIE9yKHQpe2NvbnN0W3IsZV09dC5zcGxpdCgiLCIpO3JldHVybntjb29yZHM6e2xhdGl0dWRlOk51bWJlcihyKSxsb25naXR1ZGU6TnVtYmVyKGUpfX19Y2xhc3MgTHJ7Y29uc3RydWN0b3IoKXtwKHRoaXMsInRyYW5zcG9ydCIpO3AodGhpcywiY2FuZGlkYXRlUGFpciIpO3AodGhpcywib3V0Ym91bmRWaWRlb1J0cCIsbmV3IE1hcCk7cCh0aGlzLCJpbmJvdW5kVmlkZW9SdHAiLG5ldyBNYXApO3AodGhpcywib3V0Ym91bmRBdWRpb1J0cCIsbmV3IE1hcCk7cCh0aGlzLCJpbmJvdW5kQXVkaW9SdHAiLG5ldyBNYXApO3AodGhpcywicmVtb3RlSW5ib3VuZFJ0cCIsbmV3IE1hcCk7cCh0aGlzLCJwcm9kdWNlclN0cmVhbU1hcCIsbmV3IE1hcCk7cCh0aGlzLCJjb25zdW1lclN0cmVhbU1hcCIsbmV3IE1hcCk7cCh0aGlzLCJzdGFsZVByb2R1Y2VyU3RyZWFtTWFwIiwhMSk7cCh0aGlzLCJzdGFsZUNvbnN1bWVyU3RyZWFtTWFwIiwhMSl9fWNsYXNzIERyIGV4dGVuZHMgcXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7cCh0aGlzLCJvYnNlcnZlciIpO3AodGhpcywib3V0Ym91bmRQcm9kdWNlck1hcCIsbmV3IE1hcCk7cCh0aGlzLCJpbmJvdW5kQ29uc3VtZXJNYXAiLG5ldyBNYXApO3AodGhpcywiY29uc3VtZXJQZWVySWRNYXAiLG5ldyBNYXApO3AodGhpcywicGF1c2VkQ29uc3VtZXJNYXAiLG5ldyBNYXApO3AodGhpcywicGF1c2VkUHJvZHVjZXJNYXAiLG5ldyBNYXApO3AodGhpcywib3ZlcmFsbFByb2R1Y2luZ1RyYW5zcG9ydHNTdGF0c01hcCIse30pO3AodGhpcywib3ZlcmFsbENvbnN1bWluZ1RyYW5zcG9ydHNTdGF0c01hcCIse30pO3AodGhpcywib3ZlcmFsbENvbnN1bWVyc1N0YXRzTWFwIix7fSk7cCh0aGlzLCJvdmVyYWxsUHJvZHVjZXJzU3RhdHNNYXAiLHt9KTtwKHRoaXMsInZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwIixuZXcgTWFwKTtwKHRoaXMsImF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwIixuZXcgTWFwKTtwKHRoaXMsInZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwIixuZXcgTWFwKTtwKHRoaXMsImF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwIixuZXcgTWFwKTtwKHRoaXMsImNvbnN1bWVySWRzV2l0aEZyZWV6ZWRWaWRlbyIsbmV3IFNldCk7cCh0aGlzLCJjb25zdW1lcklkc1dpdGhGcmVlemVkQXVkaW8iLG5ldyBTZXQpO3AodGhpcywicHJvZHVjZXJJZHNXaXRoRnJlZXplZFZpZGVvIixuZXcgU2V0KTtwKHRoaXMsInByb2R1Y2VySWRzV2l0aEZyZWV6ZWRBdWRpbyIsbmV3IFNldCk7cCh0aGlzLCJmcmVlemVkUHJvZHVjaW5nVHJhbnNwb3J0SWRzIixuZXcgU2V0KTtwKHRoaXMsImZyZWV6ZWRDb25zdW1pbmdUcmFuc3BvcnRJZHMiLG5ldyBTZXQpO3AodGhpcywic2NyZWVuU2hhcmVQcm9kdWNlcnMiLG5ldyBTZXQpO3AodGhpcywic2NyZWVuU2hhcmVDb25zdW1lcnMiLG5ldyBTZXQpO3AodGhpcywiaXBEZXRhaWxzIik7cCh0aGlzLCJjYWxsU3RhdHNJbnN0YW5jZSIpO3RoaXMub2JzZXJ2ZXI9bmV3IHF9cmVnaXN0ZXJQcm9kdWNlcihlKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5nZW5lcmF0ZVByb2R1Y2VyU3RyZWFtTWFwKGUpLGUub24oImNsb3NlIix0aGlzLmRlcmVnaXN0ZXJQcm9kdWNlci5iaW5kKHRoaXMsZSkpLGUub24oInBhdXNlIix0aGlzLnBhdXNlUHJvZHVjZXIuYmluZCh0aGlzLGUuaWQpKSxlLm9uKCJyZXN1bWUiLHRoaXMucmVzdW1lUHJvZHVjZXIuYmluZCh0aGlzLGUuaWQpKSxlLmFwcERhdGEuc2NyZWVuU2hhcmU9PT0hMCYmdGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5hZGQoZS5pZCl9KX1wYXVzZVByb2R1Y2VyKGUpe3RoaXMucGF1c2VkUHJvZHVjZXJNYXAuc2V0KGUse2xhc3RSZXBvcnRDYWxjdWxhdGVkOiExfSl9cmVzdW1lUHJvZHVjZXIoZSl7dGhpcy5wYXVzZWRQcm9kdWNlck1hcC5kZWxldGUoZSl9cHJvY2Vzc0luYm91bmRDb25zdW1lclZpZGVvU3RhdHMoZSxuLHMpe3ZhciBhLGQ7Y29uc3QgaT0oKGQ9KGE9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmEuY29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlc01hcCk9PW51bGw/dm9pZCAwOmQuZ2V0KGUpKXx8e307bi50b3RhbFZpZGVvUGFja2V0c1JlY2VpdmVkPT09cy5wYWNrZXRzUmVjZWl2ZWQ/KHRoaXMuY29uc3VtZXJJZHNXaXRoRnJlZXplZFZpZGVvLmFkZChlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLnZpZGVvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxzdGF0czo6bWVhc3VyZW1lbnRzOjpjb25zdW1lclZpZGVvRnJlZXplZCIse2NvbnN1bWVySWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoImNvbnN1bWVyX3ZpZGVvX3N0YXR1cyIsInBhdXNlIixlKSkpOihuLnRvdGFsVmlkZW9QYWNrZXRzUmVjZWl2ZWQ9cy5wYWNrZXRzUmVjZWl2ZWQsdGhpcy5jb25zdW1lcklkc1dpdGhGcmVlemVkVmlkZW8uaGFzKGUpJiYodGhpcy5jb25zdW1lcklkc1dpdGhGcmVlemVkVmlkZW8uZGVsZXRlKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkudmlkZW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbHN0YXRzOjptZWFzdXJlbWVudHM6OmNvbnN1bWVyVmlkZW9EZWZyZWV6ZWQiLHtjb25zdW1lcklkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJjb25zdW1lcl92aWRlb19zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NJbmJvdW5kQ29uc3VtZXJBdWRpb1N0YXRzKGUsbixzKXt2YXIgYSxkO2NvbnN0IGk9KChkPShhPXRoaXM9PW51bGw/dm9pZCAwOnRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDphLmNvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZXNNYXApPT1udWxsP3ZvaWQgMDpkLmdldChlKSl8fHt9O24udG90YWxBdWRpb1BhY2tldHNSZWNlaXZlZD09PXMucGFja2V0c1JlY2VpdmVkPyh0aGlzLmNvbnN1bWVySWRzV2l0aEZyZWV6ZWRBdWRpby5hZGQoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmaS5hdWRpbyYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6Om1lYXN1cmVtZW50czo6Y29uc3VtZXJBdWRpb0ZyZWV6ZWQiLHtjb25zdW1lcklkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJjb25zdW1lcl9hdWRpb19zdGF0dXMiLCJwYXVzZSIsZSkpKToobi50b3RhbEF1ZGlvUGFja2V0c1JlY2VpdmVkPXMucGFja2V0c1JlY2VpdmVkLHRoaXMuY29uc3VtZXJJZHNXaXRoRnJlZXplZEF1ZGlvLmhhcyhlKSYmKHRoaXMuY29uc3VtZXJJZHNXaXRoRnJlZXplZEF1ZGlvLmRlbGV0ZShlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLmF1ZGlvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpjb25zdW1lckF1ZGlvRGVmcmVlemVkIix7Y29uc3VtZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgiY29uc3VtZXJfYXVkaW9fc3RhdHVzIiwicmVzdW1lIixlKSkpKX1wcm9jZXNzT3V0Ym91bmRQcm9kdWNlclZpZGVvU3RhdHMoZSxuLHMpe3ZhciBhO2NvbnN0IGk9KChhPXRoaXM9PW51bGw/dm9pZCAwOnRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDphLmN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMpfHx7fTtuLnRvdGFsVmlkZW9QYWNrZXRzU2VudD09PXMucGFja2V0c1NlbnQ/KHRoaXMucHJvZHVjZXJJZHNXaXRoRnJlZXplZFZpZGVvLmFkZChlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLnZpZGVvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpwcm9kdWNlclZpZGVvRnJlZXplZCIse3Byb2R1Y2VySWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoInByb2R1Y2VyX3ZpZGVvX3N0YXR1cyIsInBhdXNlIixlKSkpOihuLnRvdGFsVmlkZW9QYWNrZXRzU2VudD1zLnBhY2tldHNTZW50LHRoaXMucHJvZHVjZXJJZHNXaXRoRnJlZXplZFZpZGVvLmhhcyhlKSYmKHRoaXMucHJvZHVjZXJJZHNXaXRoRnJlZXplZFZpZGVvLmRlbGV0ZShlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLnZpZGVvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpwcm9kdWNlclZpZGVvRGVmcmVlemVkIix7cHJvZHVjZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfdmlkZW9fc3RhdHVzIiwicmVzdW1lIixlKSkpKX1wcm9jZXNzT3V0Ym91bmRQcm9kdWNlckF1ZGlvU3RhdHMoZSxuLHMpe3ZhciBhO2NvbnN0IGk9KChhPXRoaXM9PW51bGw/dm9pZCAwOnRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDphLmN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMpfHx7fTtuLnRvdGFsQXVkaW9QYWNrZXRzU2VudD09PXMucGFja2V0c1NlbnQ/KHRoaXMucHJvZHVjZXJJZHNXaXRoRnJlZXplZEF1ZGlvLmFkZChlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLmF1ZGlvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpwcm9kdWNlckF1ZGlvRnJlZXplZCIse3Byb2R1Y2VySWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoInByb2R1Y2VyX2F1ZGlvX3N0YXR1cyIsInBhdXNlIixlKSkpOihuLnRvdGFsQXVkaW9QYWNrZXRzU2VudD1zLnBhY2tldHNTZW50LHRoaXMucHJvZHVjZXJJZHNXaXRoRnJlZXplZEF1ZGlvLmhhcyhlKSYmKHRoaXMucHJvZHVjZXJJZHNXaXRoRnJlZXplZEF1ZGlvLmRlbGV0ZShlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLmF1ZGlvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpwcm9kdWNlckF1ZGlvRGVmcmVlemVkIix7cHJvZHVjZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfYXVkaW9fc3RhdHVzIiwicmVzdW1lIixlKSkpKX1wcm9jZXNzUHJvZHVjaW5nVHJhbnNwb3J0U3RhdHMoZSxuLHMpe3ZhciBtO2NvbnN0IGk9KChtPXRoaXM9PW51bGw/dm9pZCAwOnRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDptLmN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMpfHx7fSx7YXVkaW86YSx2aWRlbzpkLHNjcmVlbjpvfT1pLGw9YXx8ZHx8bztuLnRvdGFsUGFja2V0c1NlbnQ9PT1zLnBhY2tldHNTZW50Pyh0aGlzLmZyZWV6ZWRQcm9kdWNpbmdUcmFuc3BvcnRJZHMuYWRkKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmwmJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2luZ1RyYW5zcG9ydEZyZWV6ZWQiLHt0cmFuc3BvcnRJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjaW5nX3RyYW5zcG9ydF9zdGF0dXMiLCJwYXVzZSIsZSkpKToobi50b3RhbFBhY2tldHNTZW50PXMucGFja2V0c1NlbnQsdGhpcy5mcmVlemVkUHJvZHVjaW5nVHJhbnNwb3J0SWRzLmhhcyhlKSYmKHRoaXMuZnJlZXplZFByb2R1Y2luZ1RyYW5zcG9ydElkcy5kZWxldGUoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmbCYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6Om1lYXN1cmVtZW50czo6cHJvZHVjaW5nVHJhbnNwb3J0RGVmcmVlemVkIix7dHJhbnNwb3J0SWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoInByb2R1Y2luZ190cmFuc3BvcnRfc3RhdHVzIiwicmVzdW1lIixlKSkpKX1wcm9jZXNzQ29uc3VtaW5nVHJhbnNwb3J0U3RhdHMoZSxuLHMpe3ZhciBkLG87Y29uc3QgYT0hIUFycmF5LmZyb20oKChvPShkPXRoaXM9PW51bGw/dm9pZCAwOnRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDpkLmNvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZXNNYXApPT1udWxsP3ZvaWQgMDpvLnZhbHVlcygpKXx8W10pLnJlZHVjZSgobCxtKT0+bHx8bS5hdWRpb3x8bS52aWRlb3x8bS5zY3JlZW4sITEpO24udG90YWxQYWNrZXRzUmVjZWl2ZWQ9PT1zLnBhY2tldHNTZW50Pyh0aGlzLmZyZWV6ZWRDb25zdW1pbmdUcmFuc3BvcnRJZHMuYWRkKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmEmJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OmNvbnN1bWluZ1RyYW5zcG9ydEZyZWV6ZWQiLHt0cmFuc3BvcnRJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgiY29uc3VtaW5nX3RyYW5zcG9ydF9zdGF0dXMiLCJwYXVzZSIsZSkpKToobi50b3RhbFBhY2tldHNSZWNlaXZlZD1zLnBhY2tldHNTZW50LHRoaXMuZnJlZXplZENvbnN1bWluZ1RyYW5zcG9ydElkcy5oYXMoZSkmJih0aGlzLmZyZWV6ZWRDb25zdW1pbmdUcmFuc3BvcnRJZHMuZGVsZXRlKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmEmJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OmNvbnN1bWluZ1RyYW5zcG9ydERlZnJlZXplZCIse3RyYW5zcG9ydElkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJjb25zdW1pbmdfdHJhbnNwb3J0X3N0YXR1cyIsInJlc3VtZSIsZSkpKSl9cmVnaXN0ZXJDb25zdW1lcihlKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5nZW5lcmF0ZUNvbnN1bWVyU3RyZWFtTWFwKGUpLHRoaXMuY29uc3VtZXJQZWVySWRNYXAuc2V0KGUuaWQse3Byb2R1Y2VySWQ6ZS5wcm9kdWNlcklkLHBlZXJJZDplLmFwcERhdGEucGVlcklkLGFwcERhdGE6ZS5hcHBEYXRhfSksZS5vbigiY2xvc2UiLHRoaXMuZGVyZWdpc3RlckNvbnN1bWVyLmJpbmQodGhpcyxlKSksZS5vbigicGF1c2UiLHRoaXMucGF1c2VDb25zdW1lci5iaW5kKHRoaXMsZS5pZCkpLGUub24oInJlc3VtZSIsdGhpcy5yZXN1bWVDb25zdW1lci5iaW5kKHRoaXMsZS5pZCkpLGUuYXBwRGF0YS5zY3JlZW5TaGFyZT09PSEwJiZ0aGlzLnNjcmVlblNoYXJlQ29uc3VtZXJzLmFkZChlLmlkKX0pfXBhdXNlQ29uc3VtZXIoZSl7dGhpcy5wYXVzZWRDb25zdW1lck1hcC5zZXQoZSx7bGFzdFJlcG9ydENhbGN1bGF0ZWQ6ITF9KX1yZXN1bWVDb25zdW1lcihlKXt0aGlzLnBhdXNlZENvbnN1bWVyTWFwLmRlbGV0ZShlKX1nZW5lcmF0ZVByb2R1Y2VyU3RyZWFtTWFwKGUsbj0hMSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IHM9eWllbGQgZS5nZXRTdGF0cygpLGk9bj90aGlzLmdldFByb2R1Y2VyU3RhdHNGcm9tUmVwb3J0KHRoaXMucGFyc2VSVENSZXBvcnQocyxbIm91dGJvdW5kLXJ0cCIsInJlbW90ZS1pbmJvdW5kLXJ0cCJdLCExLGUuaWQpKVswXTp2b2lkIDA7Zm9yKGNvbnN0IGEgb2Ygcy52YWx1ZXMoKSlzd2l0Y2goYS50eXBlKXtjYXNlIm91dGJvdW5kLXJ0cCI6e3RoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5zZXQoYS5pZCxlLmlkKTticmVha319cmV0dXJuIGl9KX1nZW5lcmF0ZUNvbnN1bWVyU3RyZWFtTWFwKGUsbj0hMSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IHM9eWllbGQgZS5nZXRTdGF0cygpLGk9bj90aGlzLmdldENvbnN1bWVyU3RhdHNGcm9tUmVwb3J0KHRoaXMucGFyc2VSVENSZXBvcnQocyxbImluYm91bmQtcnRwIl0sITEsZS5pZCkpWzBdOnZvaWQgMDtmb3IoY29uc3QgYSBvZiBzLnZhbHVlcygpKXN3aXRjaChhLnR5cGUpe2Nhc2UiaW5ib3VuZC1ydHAiOnt0aGlzLmluYm91bmRDb25zdW1lck1hcC5zZXQoYS5pZCxlLmlkKTticmVha319cmV0dXJuIGl9KX1kZXJlZ2lzdGVyUHJvZHVjZXIoZSl7dGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmZvckVhY2goKG4scyk9PntuPT09ZS5pZCYmdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmRlbGV0ZShzKX0pLHRoaXMucGF1c2VkUHJvZHVjZXJNYXAuZGVsZXRlKGUuaWQpLHRoaXMuc2NyZWVuU2hhcmVQcm9kdWNlcnMuZGVsZXRlKGUuaWQpfWRlcmVnaXN0ZXJDb25zdW1lcihlKXt0aGlzLmluYm91bmRDb25zdW1lck1hcC5mb3JFYWNoKChuLHMpPT57bj09PWUuaWQmJnRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmRlbGV0ZShzKX0pLHRoaXMuY29uc3VtZXJQZWVySWRNYXAuZGVsZXRlKGUuaWQpLHRoaXMucGF1c2VkQ29uc3VtZXJNYXAuZGVsZXRlKGUuaWQpLHRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuZGVsZXRlKGUuaWQpfWdldEljZUNhbmRpZGF0ZVN0YXRzKGUpe3ZhciBuO3JldHVybntpZDplLmlkLHR5cGU6ZS5jYW5kaWRhdGVUeXBlfHxlLnR5cGUsYWRkcmVzczplLmFkZHJlc3MscG9ydDplLnBvcnQsdXJsOmUudXJsLHByb3RvY29sOihuPWUucmVsYXlQcm90b2NvbCkhPW51bGw/bjplLnByb3RvY29sLG5ldHdvcmtUeXBlOmUubmV0d29ya1R5cGUscmVsYXRlZEFkZHJlc3M6ZS5yZWxhdGVkQWRkcmVzcyxyZWxhdGVkUG9ydDplLnJlbGF0ZWRQb3J0fX1nZXRXb3JraW5nU2ltdWxjYXN0VmlkZW9TdGF0cyhlKXtyZXR1cm4gZS5maW5kKHM9Pntjb25zdCBpPXMuZnJhbWVzRW5jb2RlZD4wLGE9cy5wYWNrZXRzU2VudD4wLGQ9cy5mcmFtZVdpZHRoJiZzLmZyYW1lSGVpZ2h0O3JldHVybiBpJiZhJiYhIWR9KXx8ZVtlLmxlbmd0aC0xXX1wYXJzZVJUQ1JlcG9ydChlLG49W10scz0hMSxpPXZvaWQgMCxhPXZvaWQgMCl7dmFyICQsRixILFosdmUseWUsQmUseGUsamUsVWUsJGUsSGUsS2U7Y29uc3QgZD1lLG89bmV3IExyLGw9bi5sZW5ndGg/bmV3IFNldChuKTp2b2lkIDAsbT1bXSx2PVtdLEU9W10sST1uZXcgTWFwLHg9bmV3IE1hcDtmb3IoY29uc3QgZiBvZiBkLnZhbHVlcygpKXtpZihsKXtpZihsLnNpemU9PT0wKWJyZWFrO2lmKGwuaGFzKGYudHlwZSkpcyYmbC5kZWxldGUoZi50eXBlKTtlbHNlIGNvbnRpbnVlfXN3aXRjaChmLnR5cGUpe2Nhc2UibG9jYWwtY2FuZGlkYXRlIjp7bS5wdXNoKHRoaXMuZ2V0SWNlQ2FuZGlkYXRlU3RhdHMoZikpO2JyZWFrfWNhc2UicmVtb3RlLWNhbmRpZGF0ZSI6e3YucHVzaCh0aGlzLmdldEljZUNhbmRpZGF0ZVN0YXRzKGYpKTticmVha31jYXNlImNhbmRpZGF0ZS1wYWlyIjp7Y29uc3R7bm9taW5hdGVkOmN9PWYse3NlbGVjdGVkOnV9PWYsYj1mLGo9e25vbWluYXRlZDpjIT1udWxsP2M6dSxjdXJyZW50Um91bmRUcmlwVGltZTpiLmN1cnJlbnRSb3VuZFRyaXBUaW1lLHRvdGFsUm91bmRUcmlwVGltZTpiLnRvdGFsUm91bmRUcmlwVGltZSxieXRlc1JlY2VpdmVkOmIuYnl0ZXNSZWNlaXZlZCxieXRlc1NlbnQ6Yi5ieXRlc1NlbnQsYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlOmIuYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlLGF2YWlsYWJsZUluY29taW5nQml0cmF0ZTpiLmF2YWlsYWJsZUluY29taW5nQml0cmF0ZSxsYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXA6Yi5sYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXAsbGFzdFBhY2tldFNlbnRUaW1lc3RhbXA6Yi5sYXN0UGFja2V0U2VudFRpbWVzdGFtcCxsb2NhbENhbmRpZGF0ZUlkOmIubG9jYWxDYW5kaWRhdGVJZCxyZW1vdGVDYW5kaWRhdGVJZDpiLnJlbW90ZUNhbmRpZGF0ZUlkLGJ5dGVzRGlzY2FyZGVkT25TZW5kOmIuYnl0ZXNEaXNjYXJkZWRPblNlbmQscGFja2V0c1NlbnQ6Yi5wYWNrZXRzU2VudCxwYWNrZXRzUmVjZWl2ZWQ6Yi5wYWNrZXRzUmVjZWl2ZWQscGFja2V0c0Rpc2NhcmRlZE9uU2VuZDpiLnBhY2tldHNEaXNjYXJkZWRPblNlbmR9O0UucHVzaChqKSwoZi5ub21pbmF0ZWQ9PT0hMHx8Zi5zZWxlY3RlZD09PSEwKSYmKG8uY2FuZGlkYXRlUGFpcj1qKTticmVha31jYXNlInRyYW5zcG9ydCI6e2NvbnN0IGM9ZjthJiYoYS5wcm9kdWNpbmcmJih0aGlzLm92ZXJhbGxQcm9kdWNpbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF18fCh0aGlzLm92ZXJhbGxQcm9kdWNpbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF09e3RvdGFsUGFja2V0c1NlbnQ6MH0pKSxhLmNvbnN1bWluZyYmKHRoaXMub3ZlcmFsbENvbnN1bWluZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXXx8KHRoaXMub3ZlcmFsbENvbnN1bWluZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXT17dG90YWxQYWNrZXRzUmVjZWl2ZWQ6MH0pKSk7Y29uc3QgdT17Ynl0ZXNSZWNlaXZlZDpjLmJ5dGVzUmVjZWl2ZWQsYnl0ZXNTZW50OmMuYnl0ZXNTZW50LHBhY2tldHNTZW50OmMucGFja2V0c1NlbnQscGFja2V0c1JlY2VpdmVkOmMucGFja2V0c1JlY2VpdmVkLGR0bHNDaXBoZXI6Yy5kdGxzQ2lwaGVyLGR0bHNTdGF0ZTpjLmR0bHNTdGF0ZSxpY2VSb2xlOmMuaWNlUm9sZX07aWYoby50cmFuc3BvcnQ9dSxhKXtpZihhLnByb2R1Y2luZyl7Y29uc3QgYj10aGlzLm92ZXJhbGxQcm9kdWNpbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF07dGhpcy5wcm9jZXNzUHJvZHVjaW5nVHJhbnNwb3J0U3RhdHMoYS5pZCxiLHUpfWlmKGEuY29uc3VtaW5nKXtjb25zdCBiPXRoaXMub3ZlcmFsbENvbnN1bWluZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXTt0aGlzLnByb2Nlc3NDb25zdW1pbmdUcmFuc3BvcnRTdGF0cyhhLmlkLGIsdSl9fWJyZWFrfWNhc2UicmVtb3RlLWluYm91bmQtcnRwIjp7Y29uc3QgYz1mLHU9e2ppdHRlcjpjLmppdHRlcixmcmFjdGlvbkxvc3Q6Yy5mcmFjdGlvbkxvc3Qscm91bmRUcmlwVGltZTpjLnJvdW5kVHJpcFRpbWUscm91bmRUcmlwVGltZU1lYXN1cmVtZW50czpjLnJvdW5kVHJpcFRpbWVNZWFzdXJlbWVudHMsdG90YWxSb3VuZFRyaXBUaW1lOmMudG90YWxSb3VuZFRyaXBUaW1lLHBhY2tldHNMb3N0OmMucGFja2V0c0xvc3R9O28ucmVtb3RlSW5ib3VuZFJ0cC5zZXQoYy5sb2NhbElkLHUpO2JyZWFrfWNhc2Uib3V0Ym91bmQtcnRwIjp7aWYoIXRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5oYXMoZi5pZCkpYnJlYWs7Y29uc3QgYz1mLHU9aXx8dGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmdldChmLmlkKSxiPXRoaXMucGF1c2VkUHJvZHVjZXJNYXAuZ2V0KHUpO2lmKGIpe2lmKGIubGFzdFJlcG9ydENhbGN1bGF0ZWQ9PT0hMClicmVhazt0aGlzLnBhdXNlZFByb2R1Y2VyTWFwLnNldCh1LHtsYXN0UmVwb3J0Q2FsY3VsYXRlZDohMH0pfXRoaXMub3ZlcmFsbFByb2R1Y2Vyc1N0YXRzTWFwW3VdfHwodGhpcy5vdmVyYWxsUHJvZHVjZXJzU3RhdHNNYXBbdV09e3RvdGFsVmlkZW9QYWNrZXRzU2VudDowLHRvdGFsQXVkaW9QYWNrZXRzU2VudDowfSk7Y29uc3Qgaj10aGlzLm92ZXJhbGxQcm9kdWNlcnNTdGF0c01hcFt1XTtpZihbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLm1lZGlhVHlwZSl8fFsidmlkZW8iLCJhdWRpbyJdLmluY2x1ZGVzKGMua2luZCkpe2lmKCF0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuaGFzKGYuaWQpKXtvLnN0YWxlUHJvZHVjZXJTdHJlYW1NYXA9ITA7YnJlYWt9Y29uc3QgSz10aGlzLmNhbGxTdGF0c0luc3RhbmNlLnByb2R1Y2Vycy5nZXQodSk7aWYoKCgkPUs9PW51bGw/dm9pZCAwOksudHJhY2spPT1udWxsP3ZvaWQgMDokLnJlYWR5U3RhdGUpPT09ImVuZGVkIilicmVhaztvLnByb2R1Y2VyU3RyZWFtTWFwLmhhcyh1KXx8by5wcm9kdWNlclN0cmVhbU1hcC5zZXQodSx7b3V0Ym91bmRWaWRlb1J0cElkOltdLG91dGJvdW5kQXVkaW9SdHBJZDpbXX0pO2NvbnN0IHk9e2J5dGVzU2VudDpjLmJ5dGVzU2VudCxwYWNrZXRzU2VudDpjLnBhY2tldHNTZW50LG5hY2tDb3VudDpjLm5hY2tDb3VudCxzc3JjOmMuc3NyYyxtaWQ6Yy5taWQsYWN0aXZlOmMuYWN0aXZlLGNvZGVjSWQ6Yy5jb2RlY0lkLGhlYWRlckJ5dGVzU2VudDpjLmhlYWRlckJ5dGVzU2VudHx8MCx0b3RhbFBhY2tldFNlbmREZWxheTpjLnRvdGFsUGFja2V0U2VuZERlbGF5fHwwfTtpZihjLm1lZGlhVHlwZT09PSJ2aWRlbyJ8fGMua2luZD09PSJ2aWRlbyIpe2NvbnN0IGg9Yyx6PVEoe2ZyYW1lSGVpZ2h0OmguZnJhbWVIZWlnaHQsZnJhbWVXaWR0aDpoLmZyYW1lV2lkdGgsZnJhbWVzRW5jb2RlZDpoLmZyYW1lc0VuY29kZWQsZnJhbWVzRHJvcHBlZDpoLmZyYW1lc0Ryb3BwZWQsZnJhbWVzUGVyU2Vjb25kOmguZnJhbWVzUGVyU2Vjb25kLGZyYW1lc1NlbnQ6aC5mcmFtZXNTZW50LGtleUZyYW1lc0VuY29kZWQ6aC5rZXlGcmFtZXNFbmNvZGVkLGZpckNvdW50OmguZmlyQ291bnQsZW5jb2RlckltcGxlbWVudGF0aW9uOmguZW5jb2RlckltcGxlbWVudGF0aW9uLGh1Z2VGcmFtZXNTZW50OmguaHVnZUZyYW1lc1NlbnQscGxpQ291bnQ6aC5wbGlDb3VudCxxcFN1bTpoLnFwU3VtLHF1YWxpdHlMaW1pdGF0aW9uRHVyYXRpb25zOmgucXVhbGl0eUxpbWl0YXRpb25EdXJhdGlvbnMscXVhbGl0eUxpbWl0YXRpb25SZWFzb246aC5xdWFsaXR5TGltaXRhdGlvblJlYXNvbixxdWFsaXR5TGltaXRhdGlvblJlc29sdXRpb25DaGFuZ2VzOmgucXVhbGl0eUxpbWl0YXRpb25SZXNvbHV0aW9uQ2hhbmdlcyx0b3RhbEVuY29kZVRpbWU6aC50YXJnZXRCaXRyYXRlLHRvdGFsUGFja2V0U2VuZERlbGF5OmgudG90YWxQYWNrZXRTZW5kRGVsYXkscmV0cmFuc21pdHRlZEJ5dGVzU2VudDpoLnJldHJhbnNtaXR0ZWRCeXRlc1NlbnQscmV0cmFuc21pdHRlZFBhY2tldHNTZW50OmgucmV0cmFuc21pdHRlZFBhY2tldHNTZW50LHNjYWxhYmlsaXR5TW9kZTpoLnNjYWxhYmlsaXR5TW9kZSxwb3dlckVmZmljaWVudEVuY29kZXI6aC5wb3dlckVmZmljaWVudEVuY29kZXJ9LHkpO28ub3V0Ym91bmRWaWRlb1J0cC5zZXQoZi5pZCx6KSxvLnByb2R1Y2VyU3RyZWFtTWFwLmdldCh1KS5vdXRib3VuZFZpZGVvUnRwSWQucHVzaChmLmlkKSx0aGlzLnByb2Nlc3NPdXRib3VuZFByb2R1Y2VyVmlkZW9TdGF0cyh1LGoseil9ZWxzZSBpZihjLm1lZGlhVHlwZT09PSJhdWRpbyJ8fGMua2luZD09PSJhdWRpbyIpe2NvbnN0IGg9Yyx6PVEoe3JldHJhbnNtaXR0ZWRCeXRlc1NlbnQ6aC5yZXRyYW5zbWl0dGVkQnl0ZXNTZW50LHJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudDpoLnJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudH0seSk7by5vdXRib3VuZEF1ZGlvUnRwLnNldChmLmlkLHopLG8ucHJvZHVjZXJTdHJlYW1NYXAuZ2V0KHUpLm91dGJvdW5kQXVkaW9SdHBJZC5wdXNoKGYuaWQpLHRoaXMucHJvY2Vzc091dGJvdW5kUHJvZHVjZXJBdWRpb1N0YXRzKHUsaix6KX19ZWxzZSB0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5lcnJvcihgQ2FsbHN0YXRzOiBVbmtub3duIE91dGJvdW5kLXJ0cC4gbWVkaWF0eXBlOiAke2MubWVkaWFUeXBlfSBraW5kOiAke2Mua2luZH1gKTticmVha31jYXNlImluYm91bmQtcnRwIjp7aWYoIXRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmhhcyhmLmlkKSlicmVhaztjb25zdCBjPWYsdT1pfHx0aGlzLmluYm91bmRDb25zdW1lck1hcC5nZXQoZi5pZCksYj10aGlzLnBhdXNlZENvbnN1bWVyTWFwLmdldCh1KTtpZihiKXtpZihiLmxhc3RSZXBvcnRDYWxjdWxhdGVkPT09ITApYnJlYWs7dGhpcy5wYXVzZWRDb25zdW1lck1hcC5zZXQodSx7bGFzdFJlcG9ydENhbGN1bGF0ZWQ6ITB9KX1pZihjLnNzcmM9PT0xMjM0KWJyZWFrO3RoaXMub3ZlcmFsbENvbnN1bWVyc1N0YXRzTWFwW3VdfHwodGhpcy5vdmVyYWxsQ29uc3VtZXJzU3RhdHNNYXBbdV09e3RvdGFsVmlkZW9QYWNrZXRzUmVjZWl2ZWQ6MCx0b3RhbEF1ZGlvUGFja2V0c1JlY2VpdmVkOjB9KTtjb25zdCBqPXRoaXMub3ZlcmFsbENvbnN1bWVyc1N0YXRzTWFwW3VdO2lmKFsidmlkZW8iLCJhdWRpbyJdLmluY2x1ZGVzKGMubWVkaWFUeXBlKXx8WyJ2aWRlbyIsImF1ZGlvIl0uaW5jbHVkZXMoYy5raW5kKSl7aWYoIXRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmhhcyhmLmlkKSl7by5zdGFsZUNvbnN1bWVyU3RyZWFtTWFwPSEwO2JyZWFrfW8uY29uc3VtZXJTdHJlYW1NYXAuaGFzKHUpfHxvLmNvbnN1bWVyU3RyZWFtTWFwLnNldCh1LHtpbmJvdW5kVmlkZW9SdHBJZDpbXSxpbmJvdW5kQXVkaW9SdHBJZDpbXX0pO2NvbnN0IEs9e2J5dGVzUmVjZWl2ZWQ6Yy5ieXRlc1JlY2VpdmVkLHBhY2tldHNSZWNlaXZlZDpjLnBhY2tldHNSZWNlaXZlZCxwYWNrZXRzTG9zdDpjLnBhY2tldHNMb3N0Pj0wP2MucGFja2V0c0xvc3Q6MCxqaXR0ZXI6Yy5qaXR0ZXIsbmFja0NvdW50OmMubmFja0NvdW50LGppdHRlckJ1ZmZlckRlbGF5OmMuaml0dGVyQnVmZmVyRGVsYXksaml0dGVyQnVmZmVyRW1pdHRlZENvdW50OmMuaml0dGVyQnVmZmVyRW1pdHRlZENvdW50LGxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcDpjLmxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcCxzc3JjOmMuc3NyYyxtaWQ6Yy5taWQsY29kZWNJZDpjLmNvZGVjSWQsaGVhZGVyQnl0ZXNSZWNlaXZlZDpjLmhlYWRlckJ5dGVzUmVjZWl2ZWR8fDAscGFja2V0c0Rpc2NhcmRlZDpjLnBhY2tldHNEaXNjYXJkZWR8fDAsaml0dGVyQnVmZmVyTWluaW11bURlbGF5OmMuaml0dGVyQnVmZmVyTWluaW11bURlbGF5fHwwLGppdHRlckJ1ZmZlclRhcmdldERlbGF5OmMuaml0dGVyQnVmZmVyVGFyZ2V0RGVsYXl8fDB9O2lmKGMubWVkaWFUeXBlPT09InZpZGVvInx8Yy5raW5kPT09InZpZGVvIil7Y29uc3QgeT1jLGg9USh7ZnJhbWVIZWlnaHQ6eS5mcmFtZUhlaWdodCxmcmFtZVdpZHRoOnkuZnJhbWVXaWR0aCxmcmFtZXNEZWNvZGVkOnkuZnJhbWVzRGVjb2RlZCxmcmFtZXNEcm9wcGVkOnkuZnJhbWVzRHJvcHBlZCxmcmFtZXNQZXJTZWNvbmQ6eS5mcmFtZXNQZXJTZWNvbmQsZnJhbWVzUmVjZWl2ZWQ6eS5mcmFtZXNSZWNlaXZlZCxrZXlGcmFtZXNEZWNvZGVkOnkua2V5RnJhbWVzRGVjb2RlZCxmaXJDb3VudDp5LmZpckNvdW50LGRlY29kZXJJbXBsZW1lbnRhdGlvbjp5LmRlY29kZXJJbXBsZW1lbnRhdGlvbixwbGlDb3VudDp5LnBsaUNvdW50LHRvdGFsUHJvY2Vzc2luZ0RlbGF5OnkudG90YWxQcm9jZXNzaW5nRGVsYXkscXBTdW06eS5xcFN1bXx8MCx0b3RhbEFzc2VtYmx5VGltZTp5LnRvdGFsQXNzZW1ibHlUaW1lfHwwLHRvdGFsRGVjb2RlVGltZTp5LnRvdGFsRGVjb2RlVGltZXx8MCx0b3RhbEZyZWV6ZXNEdXJhdGlvbjp5LnRvdGFsRnJlZXplc0R1cmF0aW9ufHwwLHRvdGFsSW50ZXJGcmFtZURlbGF5OnkudG90YWxJbnRlckZyYW1lRGVsYXl8fDAsdG90YWxQYXVzZXNEdXJhdGlvbjp5LnRvdGFsUGF1c2VzRHVyYXRpb258fDAsdG90YWxTcXVhcmVkSW50ZXJGcmFtZURlbGF5OnkudG90YWxTcXVhcmVkSW50ZXJGcmFtZURlbGF5fHwwLGZyZWV6ZUNvdW50OnkuZnJlZXplQ291bnR8fDAscGF1c2VDb3VudDp5LnBhdXNlQ291bnR8fDAscG93ZXJFZmZpY2llbnREZWNvZGVyOnkucG93ZXJFZmZpY2llbnREZWNvZGVyfSxLKTtoLnNjb3JlPUlyKHtmcmFtZVdpZHRoOmguZnJhbWVXaWR0aHx8MCxmcmFtZXNEZWNvZGVkOihoLmZyYW1lc0RlY29kZWR8fDApLSgoKEY9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpGLmZyYW1lc0RlY29kZWQpfHwwKSxmcmFtZXNQZXJTZWNvbmQ6aC5mcmFtZXNQZXJTZWNvbmR8fDAscGFja2V0c0xvc3Q6KGgucGFja2V0c0xvc3R8fDApLSgoKEg9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpILnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihoLnBhY2tldHNSZWNlaXZlZHx8MCktKCgoWj10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOloucGFja2V0c1JlY2VpdmVkKXx8MCksaml0dGVyOmguaml0dGVyfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5oYXModSl9KSx4LnNldCh1LHtzY29yZTorKGguc2NvcmUqMTApLnRvRml4ZWQoKSxmcmFtZVdpZHRoOmguZnJhbWVXaWR0aHx8MCxmcmFtZUhlaWdodDpoLmZyYW1lSGVpZ2h0fHwwLGZyYW1lc1BlclNlY29uZDpoLmZyYW1lc1BlclNlY29uZHx8MCxwYWNrZXRzTG9zdFBlcmNlbnRhZ2U6dXQoe3BhY2tldHNMb3N0OihoLnBhY2tldHNMb3N0fHwwKS0oKCh2ZT10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOnZlLnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihoLnBhY2tldHNSZWNlaXZlZHx8MCktKCgoeWU9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDp5ZS5wYWNrZXRzUmVjZWl2ZWQpfHwwKX0pLGppdHRlcjpoLmppdHRlcnx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuaGFzKHUpLGJpdHJhdGU6KChoLmJ5dGVzUmVjZWl2ZWR8fDApLSgoKEJlPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6QmUuYnl0ZXNSZWNlaXZlZCl8fDApKSo4Lzd9KSx0aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLnNldCh1LGgpLG8uaW5ib3VuZFZpZGVvUnRwLnNldChmLmlkLGgpLG8uY29uc3VtZXJTdHJlYW1NYXAuZ2V0KHUpLmluYm91bmRWaWRlb1J0cElkLnB1c2goZi5pZCksdGhpcy5wcm9jZXNzSW5ib3VuZENvbnN1bWVyVmlkZW9TdGF0cyh1LGosaCl9ZWxzZSBpZihjLm1lZGlhVHlwZT09PSJhdWRpbyJ8fGMua2luZD09PSJhdWRpbyIpe2NvbnN0IHk9YyxoPVEoe2F1ZGlvTGV2ZWw6eS5hdWRpb0xldmVsLGNvbmNlYWxlZFNhbXBsZXM6eS5jb25jZWFsZWRTYW1wbGVzLGNvbmNlYWxtZW50RXZlbnRzOnkuY29uY2VhbG1lbnRFdmVudHMsdG90YWxBdWRpb0VuZXJneTp5LnRvdGFsQXVkaW9FbmVyZ3ksdG90YWxTYW1wbGVzRHVyYXRpb246eS50b3RhbFNhbXBsZXNEdXJhdGlvbix0b3RhbFNhbXBsZXNSZWNlaXZlZDp5LnRvdGFsU2FtcGxlc1JlY2VpdmVkLGZlY1BhY2tldHNEaXNjYXJkZWQ6eS5mZWNQYWNrZXRzRGlzY2FyZGVkfHwwLGZlY1BhY2tldHNSZWNlaXZlZDp5LmZlY1BhY2tldHNSZWNlaXZlZHx8MCxpbnNlcnRlZFNhbXBsZXNGb3JEZWNlbGVyYXRpb246eS5pbnNlcnRlZFNhbXBsZXNGb3JEZWNlbGVyYXRpb258fDAscmVtb3ZlZFNhbXBsZXNGb3JBY2NlbGVyYXRpb246eS5yZW1vdmVkU2FtcGxlc0ZvckFjY2VsZXJhdGlvbnx8MCxzaWxlbnRDb25jZWFsZWRTYW1wbGVzOnkuc2lsZW50Q29uY2VhbGVkU2FtcGxlc3x8MCxwbGF5b3V0SWQ6eS5wbGF5b3V0SWR9LEspO2guc2NvcmU9d3Ioe2NvbmNlYWxtZW50RXZlbnRzOihoLmNvbmNlYWxtZW50RXZlbnRzfHwwKS0oKCh4ZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOnhlLmNvbmNlYWxtZW50RXZlbnRzKXx8MCkscGFja2V0c0xvc3Q6KGgucGFja2V0c0xvc3R8fDApLSgoKGplPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6amUucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KGgucGFja2V0c1JlY2VpdmVkfHwwKS0oKChVZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOlVlLnBhY2tldHNSZWNlaXZlZCl8fDApLGppdHRlcjpoLmppdHRlcnx8MH0pLHguc2V0KHUse3Njb3JlOisoaC5zY29yZSoxMCkudG9GaXhlZCgpLHBhY2tldHNMb3N0UGVyY2VudGFnZTp1dCh7cGFja2V0c0xvc3Q6KGgucGFja2V0c0xvc3R8fDApLSgoKCRlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6JGUucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KGgucGFja2V0c1JlY2VpdmVkfHwwKS0oKChIZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOkhlLnBhY2tldHNSZWNlaXZlZCl8fDApfSksaml0dGVyOmguaml0dGVyfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5oYXModSksYml0cmF0ZTooKGguYnl0ZXNSZWNlaXZlZHx8MCktKCgoS2U9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpLZS5ieXRlc1JlY2VpdmVkKXx8MCkpKjgvN30pLHRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuc2V0KHUsaCksby5pbmJvdW5kQXVkaW9SdHAuc2V0KGYuaWQsaCksby5jb25zdW1lclN0cmVhbU1hcC5nZXQodSkuaW5ib3VuZEF1ZGlvUnRwSWQucHVzaChmLmlkKSx0aGlzLnByb2Nlc3NJbmJvdW5kQ29uc3VtZXJBdWRpb1N0YXRzKHUsaixoKX19ZWxzZSB0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5lcnJvcihgQ2FsbHN0YXRzOiBVbmtub3duIEluYm91bmQtcnRwLiBtZWRpYXR5cGU6ICR7Yy5tZWRpYVR5cGV9IGtpbmQ6ICR7Yy5raW5kfWApO2JyZWFrfX19aWYoby5wcm9kdWNlclN0cmVhbU1hcC5mb3JFYWNoKChmLGMpPT57dmFyIHUsYixqLEsseSxoLHosV2UsemUsR2UscWUsWWUsUWUsSmUsWGUsWmUsZXQsdHQscnQsbnQsc3QsaXQsYXQ7aWYoZi5vdXRib3VuZFZpZGVvUnRwSWQubGVuZ3RoPjApe2NvbnN0IE49W107Zi5vdXRib3VuZFZpZGVvUnRwSWQuZm9yRWFjaChzcj0+e04ucHVzaChvLm91dGJvdW5kVmlkZW9SdHAuZ2V0KHNyKSl9KTtjb25zdCBBPXRoaXMuZ2V0V29ya2luZ1NpbXVsY2FzdFZpZGVvU3RhdHMoTik7QS5zY29yZT1Qcih7ZnJhbWVXaWR0aDpBLmZyYW1lV2lkdGh8fDAsZnJhbWVzUGVyU2Vjb25kOkEuZnJhbWVzUGVyU2Vjb25kfHwwLGppdHRlcjooKHU9QS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6dS5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYykscGFja2V0c1NlbnQ6KEEucGFja2V0c1NlbnR8fDApLSgoKGI9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpiLnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoaj1BLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpqLnBhY2tldHNMb3N0KXx8MCktKCgoeT0oSz10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOksucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnkucGFja2V0c0xvc3QpfHwwKSxmcmFtZXNFbmNvZGVkOihBLmZyYW1lc0VuY29kZWR8fDApLSgoKGg9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpoLmZyYW1lc0VuY29kZWQpfHwwKX0pLEkuc2V0KGMse3Njb3JlOisoQS5zY29yZSoxMCkudG9GaXhlZCgpLGZyYW1lV2lkdGg6QS5mcmFtZVdpZHRofHwwLGZyYW1lSGVpZ2h0OkEuZnJhbWVIZWlnaHR8fDAsZnJhbWVzUGVyU2Vjb25kOkEuZnJhbWVzUGVyU2Vjb25kfHwwLGppdHRlcjooKHo9QS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6ei5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYykscGFja2V0c0xvc3RQZXJjZW50YWdlOmx0KHtwYWNrZXRzU2VudDooQS5wYWNrZXRzU2VudHx8MCktKCgoV2U9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpXZS5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKHplPUEucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnplLnBhY2tldHNMb3N0KXx8MCktKCgocWU9KEdlPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6R2UucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnFlLnBhY2tldHNMb3N0KXx8MCl9KSxiaXRyYXRlOigoQS5ieXRlc1NlbnR8fDApLSgoKFllPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6WWUuYnl0ZXNTZW50KXx8MCkpKjgvNyxjcHVMaW1pdGF0aW9uczpBLnF1YWxpdHlMaW1pdGF0aW9uUmVhc29uPT09ImNwdSIsYmFuZHdpZHRoTGltaXRhdGlvbnM6QS5xdWFsaXR5TGltaXRhdGlvblJlYXNvbj09PSJiYW5kd2lkdGgifSksdGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5zZXQoYyxBKX1lbHNlIGlmKGYub3V0Ym91bmRBdWRpb1J0cElkLmxlbmd0aD4wKXtjb25zdCBOPW8ub3V0Ym91bmRBdWRpb1J0cC5nZXQoZi5vdXRib3VuZEF1ZGlvUnRwSWRbMF0pO04uc2NvcmU9UnIoe3BhY2tldHNTZW50OihOLnBhY2tldHNTZW50fHwwKS0oKChRZT10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOlFlLnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoSmU9Ti5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6SmUucGFja2V0c0xvc3QpfHwwKS0oKChaZT0oWGU9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpYZS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6WmUucGFja2V0c0xvc3QpfHwwKSxqaXR0ZXI6KChldD1OLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpldC5qaXR0ZXIpfHwwfSksSS5zZXQoYyx7c2NvcmU6KyhOLnNjb3JlKjEwKS50b0ZpeGVkKCksYml0cmF0ZTooKE4uYnl0ZXNTZW50fHwwKS0oKCh0dD10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnR0LmJ5dGVzU2VudCl8fDApKSo4LzcscGFja2V0c0xvc3RQZXJjZW50YWdlOmx0KHtwYWNrZXRzU2VudDooTi5wYWNrZXRzU2VudHx8MCktKCgocnQ9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpydC5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKG50PU4ucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOm50LnBhY2tldHNMb3N0KXx8MCktKCgoaXQ9KHN0PXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6c3QucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOml0LnBhY2tldHNMb3N0KXx8MCl9KSxqaXR0ZXI6KChhdD1OLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDphdC5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYyl9KSx0aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLnNldChjLE4pfX0pLEUuZm9yRWFjaChmPT57Y29uc3QgYz1tLmZpbmQoYj0+Yi5pZD09PWYubG9jYWxDYW5kaWRhdGVJZD8oZi5sb2NhbENhbmRpZGF0ZUlkPWIuaWQsYik6bnVsbCksdT12LmZpbmQoYj0+Yi5pZD09PWYucmVtb3RlQ2FuZGlkYXRlSWQ/KGYucmVtb3RlQ2FuZGlkYXRlSWQ9Yi5pZCxiKTpudWxsKTtjJiYoZi5sb2NhbENhbmRpZGF0ZVR5cGU9Yy50eXBlLGYubG9jYWxDYW5kaWRhdGVBZGRyZXNzPWFlKGMuYWRkcmVzcyksZi5sb2NhbENhbmRpZGF0ZVBvcnQ9Yy5wb3J0LGYubG9jYWxDYW5kaWRhdGVQcm90b2NvbD1jLnByb3RvY29sLGYubG9jYWxDYW5kaWRhdGVVcmw9Yy51cmwsZi5sb2NhbENhbmRpZGF0ZU5ldHdvcmtUeXBlPWMubmV0d29ya1R5cGUsZi5sb2NhbENhbmRpZGF0ZVJlbGF0ZWRBZGRyZXNzPWFlKGMucmVsYXRlZEFkZHJlc3MpLGYubG9jYWxDYW5kaWRhdGVSZWxhdGVkUG9ydD1jLnJlbGF0ZWRQb3J0KSx1JiYoZi5yZW1vdGVDYW5kaWRhdGVUeXBlPXUudHlwZSxmLnJlbW90ZUNhbmRpZGF0ZUFkZHJlc3M9YWUodS5hZGRyZXNzKSxmLnJlbW90ZUNhbmRpZGF0ZVBvcnQ9dS5wb3J0LGYucmVtb3RlQ2FuZGlkYXRlUHJvdG9jb2w9dS5wcm90b2NvbCxmLnJlbW90ZUNhbmRpZGF0ZVVybD11LnVybCl9KSxvLmNhbmRpZGF0ZVBhaXImJihvLnRyYW5zcG9ydD8oby50cmFuc3BvcnQudG90YWxSb3VuZFRyaXBUaW1lPW8uY2FuZGlkYXRlUGFpci50b3RhbFJvdW5kVHJpcFRpbWUsby50cmFuc3BvcnQuYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlPW8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGUsby50cmFuc3BvcnQuYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlPW8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUsby50cmFuc3BvcnQucm91bmRUcmlwVGltZT1vLmNhbmRpZGF0ZVBhaXIuY3VycmVudFJvdW5kVHJpcFRpbWUpOm8udHJhbnNwb3J0PXtieXRlc1JlY2VpdmVkOm8uY2FuZGlkYXRlUGFpci5ieXRlc1JlY2VpdmVkLGJ5dGVzU2VudDpvLmNhbmRpZGF0ZVBhaXIuYnl0ZXNTZW50LHRvdGFsUm91bmRUcmlwVGltZTpvLmNhbmRpZGF0ZVBhaXIudG90YWxSb3VuZFRyaXBUaW1lLGF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZTpvLmNhbmRpZGF0ZVBhaXIuYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlLGF2YWlsYWJsZUluY29taW5nQml0cmF0ZTpvLmNhbmRpZGF0ZVBhaXIuYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlLHJvdW5kVHJpcFRpbWU6by5jYW5kaWRhdGVQYWlyLmN1cnJlbnRSb3VuZFRyaXBUaW1lfSksby50cmFuc3BvcnQmJihvLnRyYW5zcG9ydC5jYW5kaWRhdGVQYWlycz1FKSxvLnRyYW5zcG9ydCYmIW8udHJhbnNwb3J0LnJvdW5kVHJpcFRpbWUpe2xldCBmPTAsYz0wO28ucmVtb3RlSW5ib3VuZFJ0cC5mb3JFYWNoKCh1LGIpPT57dS5yb3VuZFRyaXBUaW1lJiZ1LnJvdW5kVHJpcFRpbWU+ZiYmKGY9dS5yb3VuZFRyaXBUaW1lLGM9dS50b3RhbFJvdW5kVHJpcFRpbWUpfSksby50cmFuc3BvcnQucm91bmRUcmlwVGltZT1mLG8udHJhbnNwb3J0LnRvdGFsUm91bmRUcmlwVGltZT1jfWlmKHguc2l6ZT4wKXRyeXt0aGlzLm9ic2VydmVyLmVtaXQoImNvbnN1bWVyX3Njb3JlIix4KX1jYXRjaChmKXt9aWYoSS5zaXplPjApdHJ5e3RoaXMub2JzZXJ2ZXIuZW1pdCgicHJvZHVjZXJfc2NvcmUiLEkpfWNhdGNoKGYpe31yZXR1cm4gb31nZXRQcm9kdWNlcnNSZXBvcnQoZSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IG49ZS5tYXAocz0+dGhpcy5nZW5lcmF0ZVByb2R1Y2VyU3RyZWFtTWFwKHMsITApKTtyZXR1cm4gbi5sZW5ndGg+MD9Qcm9taXNlLmFsbChuKTp2b2lkIDB9KX1nZXRDb25zdW1lcnNSZXBvcnQoZSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IG49ZS5tYXAocz0+dGhpcy5nZW5lcmF0ZUNvbnN1bWVyU3RyZWFtTWFwKHMsITApKTtyZXR1cm4gbi5sZW5ndGg+MD9Qcm9taXNlLmFsbChuKTp2b2lkIDB9KX1nZXRUcmFuc3BvcnRSZXBvcnQoZSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3JldHVybiBlLmdldFN0YXRzKCl9KX1nZXRQcm9jZXNzZWRTdGF0cyhlLG4scyl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IGk9eWllbGQgdGhpcy5nZXRUcmFuc3BvcnRSZXBvcnQoZSksYT17cHJvZHVjaW5nOnMsY29uc3VtaW5nOm4saWQ6ZS5pZH0sZD1pLG89dGhpcy5wYXJzZVJUQ1JlcG9ydChkLFsidHJhbnNwb3J0IiwiY2FuZGlkYXRlLXBhaXIiLCJpbmJvdW5kLXJ0cCIsIm91dGJvdW5kLXJ0cCIsInJlbW90ZS1pbmJvdW5kLXJ0cCIsImxvY2FsLWNhbmRpZGF0ZSIsInJlbW90ZS1jYW5kaWRhdGUiXSwhMSx2b2lkIDAsYSk7aWYoIW8pcmV0dXJuO2NvbnN0IGw9e3N0YXRzOm8udHJhbnNwb3J0LHRyYW5zcG9ydElkOmUuaWQsY29uc3VtaW5nOm4scHJvZHVjaW5nOnN9LG09by5zdGFsZVByb2R1Y2VyU3RyZWFtTWFwP3ZvaWQgMDp0aGlzLmdldFByb2R1Y2VyU3RhdHNGcm9tUmVwb3J0KG8pLHY9by5zdGFsZUNvbnN1bWVyU3RyZWFtTWFwP3ZvaWQgMDp0aGlzLmdldENvbnN1bWVyU3RhdHNGcm9tUmVwb3J0KG8pO3JldHVybnt0cmFuc3BvcnRSZXBvcnQ6bCxwcm9kdWNlclJlcG9ydDptLGNvbnN1bWVyUmVwb3J0OnZ9fSl9Z2V0UHJvZHVjZXJTdGF0c0Zyb21SZXBvcnQoZSl7Y29uc3Qgbj1bXTt0cnl7ZS5wcm9kdWNlclN0cmVhbU1hcC5mb3JFYWNoKChzLGkpPT57dmFyIGEsZDtuLnB1c2goe3Byb2R1Y2VySWQ6aSx2aWRlb1N0YXRzOnMub3V0Ym91bmRWaWRlb1J0cElkLm1hcChvPT5lLm91dGJvdW5kVmlkZW9SdHAuZ2V0KG8pKSxhdWRpb1N0YXRzOnMub3V0Ym91bmRBdWRpb1J0cElkLm1hcChvPT5lLm91dGJvdW5kQXVkaW9SdHAuZ2V0KG8pKSxhcHBEYXRhOigoZD0oYT10aGlzLmNhbGxTdGF0c0luc3RhbmNlLnByb2R1Y2Vycyk9PW51bGw/dm9pZCAwOmEuZ2V0KGkpKT09bnVsbD92b2lkIDA6ZC5hcHBEYXRhKXx8bnVsbH0pfSl9Y2F0Y2gocyl7dGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZXJyb3IoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpnZXRQcm9kdWNlclN0YXRzRnJvbVJlcG9ydCIse2Vycm9yOntyZWFzb246cy5yZWFzb24sbWVzc2FnZTpzLm1lc3NhZ2V9fSl9cmV0dXJuIG59Z2V0Q29uc3VtZXJTdGF0c0Zyb21SZXBvcnQoZSl7Y29uc3Qgbj1bXTt0cnl7ZS5jb25zdW1lclN0cmVhbU1hcC5mb3JFYWNoKChzLGkpPT57Y29uc3R7cGVlcklkOmEscHJvZHVjZXJJZDpkLGFwcERhdGE6b309dGhpcy5jb25zdW1lclBlZXJJZE1hcC5nZXQoaSk7bi5wdXNoKHtjb25zdW1lcklkOmkscGVlcklkOmEscHJvZHVjZXJJZDpkLGFwcERhdGE6byx2aWRlb1N0YXRzOnMuaW5ib3VuZFZpZGVvUnRwSWQubWFwKGw9PmUuaW5ib3VuZFZpZGVvUnRwLmdldChsKSksYXVkaW9TdGF0czpzLmluYm91bmRBdWRpb1J0cElkLm1hcChsPT5lLmluYm91bmRBdWRpb1J0cC5nZXQobCkpfSl9KX1jYXRjaChzKXtjb25zb2xlLmVycm9yKCJnZXRDb25zdW1lcnNSZXBvcnQ6ICIscyxlKX1yZXR1cm4gbn1nZXRVc2VyTG9jYXRpb24oKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7cmV0dXJuIG5ldyBQcm9taXNlKChlLG4pPT57dHJ5e25hdmlnYXRvci5nZW9sb2NhdGlvbj9uYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKHM9PntlKHMpfSk6bigpfWNhdGNoKHMpe24ocyl9fSl9KX1nZXRDb25uZWN0aXZpdHkoZSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3RyeXtjb25zdCBuPXtpY2VTZXJ2ZXJzOmV8fGtyfSxzPW5ldyBQcm9taXNlKChtLHYpPT57dHJ5e2NvbnN0IEU9bmV3IFRzKG4pO0UuYWRkTGlzdGVuZXIoImRvbmUiLG0pLEUuYWRkTGlzdGVuZXIoImZhaWxlZCIsKCk9PnttKHtjb25uZWN0aXZpdHk6ITF9KX0pLEUuc3RhcnQoMmUzKX1jYXRjaChFKXt2KEUpfX0pLGk9bmV3IFByb21pc2UoKG0sdik9Pnt0cnl7Y29uc3QgRT1uZXcgUnMobik7RS5hZGRMaXN0ZW5lcigiZG9uZSIsbSksRS5hZGRMaXN0ZW5lcigiZmFpbGVkIiwoKT0+e20oe2Nvbm5lY3Rpdml0eTohMX0pfSksRS5zdGFydCgyZTMpfWNhdGNoKEUpe3YoRSl9fSksYT1uZXcgUHJvbWlzZSgobSx2KT0+e3RyeXtjb25zdCBFPW5ldyBQcyhuKTtFLmFkZExpc3RlbmVyKCJkb25lIixtKSxFLmFkZExpc3RlbmVyKCJmYWlsZWQiLCgpPT57bSh7Y29ubmVjdGl2aXR5OiExfSl9KSxFLnN0YXJ0KDJlMyl9Y2F0Y2goRSl7dihFKX19KSxbZCxvLGxdPXlpZWxkIFByb21pc2UuYWxsKFtzLGksYV0pO3JldHVybntob3N0OmQ9PW51bGw/dm9pZCAwOmQuY29ubmVjdGl2aXR5LHJlbGF5Om89PW51bGw/dm9pZCAwOm8uY29ubmVjdGl2aXR5LHJlZmxleGl2ZTpsPT1udWxsP3ZvaWQgMDpsLmNvbm5lY3Rpdml0eX19Y2F0Y2gobil7cmV0dXJue2hvc3Q6ITEscmVsYXk6ITEscmVmbGV4aXZlOiExfX19KX1nZXRUaHJvdWdocHV0KGUpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXt0cnl7Y29uc3Qgcz15aWVsZCBuZXcgUHJvbWlzZSgoaSxhKT0+e3RyeXtjb25zdCBkPXtpY2VTZXJ2ZXJzOmV8fGtyfSxvPW5ldyBfcyhkKTtvLmFkZExpc3RlbmVyKCJkb25lIixpKSxvLmFkZExpc3RlbmVyKCJmYWlsZWQiLGEpLG8uc3RhcnQoMWU0KX1jYXRjaChkKXthKGQpfX0pO3JldHVybnt0aHJvdWdocHV0OnMudGhyb3VnaHB1dCxmcmFjdGlvbmFsTG9zczowLFJUVDpzLlJUVCxqaXR0ZXI6MCxiYWNrZW5kUlRUOnMuYmFja2VuZFJUVH19Y2F0Y2gobil7cmV0dXJufX0pfWdldElQRGV0YWlscygpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXt2YXIgZSxuO3RyeXtyZXR1cm4gdGhpcy5pcERldGFpbHN8fCh0aGlzLmlwRGV0YWlscz15aWVsZCBNci5nZXRJUERldGFpbHMoe3BlZXJJZDooZT10aGlzLmNhbGxTdGF0c0luc3RhbmNlKT09bnVsbD92b2lkIDA6ZS5wZWVySWQsYXBpSG9zdG5hbWVzOihuPXRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDpuLmFwaUhvc3RuYW1lcyxsb2dnZXI6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXJ9KSksdGhpcy5pcERldGFpbHN9Y2F0Y2gocyl7cmV0dXJufX0pfWdldE5ldHdvcmtRdWFsaXR5KGUpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdFtuLHNdPXlpZWxkIFByb21pc2UuYWxsKFt0aGlzLmdldENvbm5lY3Rpdml0eShlKSx0aGlzLmdldFRocm91Z2hwdXQoZSldKTtyZXR1cm57Y29ubmVjdGl2aXR5Om4sdGhyb3VnaHB1dDpzPT1udWxsP3ZvaWQgMDpzLnRocm91Z2hwdXQsZnJhY3Rpb25hbExvc3M6cz09bnVsbD92b2lkIDA6cy5mcmFjdGlvbmFsTG9zcyxSVFQ6cz09bnVsbD92b2lkIDA6cy5SVFQsaml0dGVyOnM9PW51bGw/dm9pZCAwOnMuaml0dGVyLGJhY2tlbmRSVFQ6cz09bnVsbD92b2lkIDA6cy5iYWNrZW5kUlRUfX0pfWdldE5ldHdvcmtJbmZvKGUsbj0hMSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3ZhciBkLG87aWYobil7Y29uc3QgbD15aWVsZCB0aGlzLmdldElQRGV0YWlscygpO3JldHVybntpcERldGFpbHM6bCxlZmZlY3RpdmVOZXR3b3JrVHlwZTooZD1uYXZpZ2F0b3IuY29ubmVjdGlvbik9PW51bGw/dm9pZCAwOmQuZWZmZWN0aXZlVHlwZSxsb2NhdGlvbjpsIT1udWxsJiZsLmxvYz9PcihsPT1udWxsP3ZvaWQgMDpsLmxvYyk6dm9pZCAwfX1jb25zdFtzLGksYV09eWllbGQgUHJvbWlzZS5hbGwoW3RoaXMuZ2V0Q29ubmVjdGl2aXR5KGUpLHRoaXMuZ2V0VGhyb3VnaHB1dChlKSx0aGlzLmdldElQRGV0YWlscygpXSk7cmV0dXJue2lwRGV0YWlsczphLGVmZmVjdGl2ZU5ldHdvcmtUeXBlOihvPW5hdmlnYXRvci5jb25uZWN0aW9uKT09bnVsbD92b2lkIDA6by5lZmZlY3RpdmVUeXBlLGxvY2F0aW9uOmEhPW51bGwmJmEubG9jP09yKGE9PW51bGw/dm9pZCAwOmEubG9jKTp2b2lkIDAsdHVybkNvbm5lY3Rpdml0eTpzP3MuaG9zdHx8cy5yZWxheXx8cy5yZWZsZXhpdmU6ITEsY29ubmVjdGl2aXR5OnMsdGhyb3VnaHB1dDppPT1udWxsP3ZvaWQgMDppLnRocm91Z2hwdXQsZnJhY3Rpb25hbExvc3M6aT09bnVsbD92b2lkIDA6aS5mcmFjdGlvbmFsTG9zcyxSVFQ6aT09bnVsbD92b2lkIDA6aS5SVFQsaml0dGVyOmk9PW51bGw/dm9pZCAwOmkuaml0dGVyLGJhY2tlbmRSVFQ6aT09bnVsbD92b2lkIDA6aS5iYWNrZW5kUlRUfX0pfX1jbGFzcyB3cyBleHRlbmRzIERye31jbGFzcyBOciBleHRlbmRzIERye2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKTtwKHRoaXMsInByb2R1Y2VyTWFwIixuZXcgTWFwKTtwKHRoaXMsImNvbnN1bWVyTWFwIixuZXcgTWFwKX1yZWdpc3RlclByb2R1Y2VyKGUpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXt0aGlzLnByb2R1Y2VyTWFwLnNldChlLmlkLGUpLHlpZWxkIHRoaXMuZ2VuZXJhdGVQcm9kdWNlclN0cmVhbU1hcChlKSxlLm9uKCJjbG9zZSIsdGhpcy5kZXJlZ2lzdGVyUHJvZHVjZXIuYmluZCh0aGlzLGUpKSxlLm9uKCJwYXVzZSIsdGhpcy5wYXVzZVByb2R1Y2VyLmJpbmQodGhpcyxlLmlkKSksZS5vbigicmVzdW1lIix0aGlzLnJlc3VtZVByb2R1Y2VyLmJpbmQodGhpcyxlLmlkKSksZS5hcHBEYXRhLnNjcmVlblNoYXJlPT09ITAmJnRoaXMuc2NyZWVuU2hhcmVQcm9kdWNlcnMuYWRkKGUuaWQpfSl9cmVnaXN0ZXJDb25zdW1lcihlKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dGhpcy5jb25zdW1lck1hcC5zZXQoZS5pZCxlKSx5aWVsZCB0aGlzLmdlbmVyYXRlQ29uc3VtZXJTdHJlYW1NYXAoZSksdGhpcy5jb25zdW1lclBlZXJJZE1hcC5zZXQoZS5pZCx7cHJvZHVjZXJJZDplLnByb2R1Y2VySWQscGVlcklkOmUuYXBwRGF0YS5wZWVySWQsYXBwRGF0YTplLmFwcERhdGF9KSxlLm9uKCJjbG9zZSIsdGhpcy5kZXJlZ2lzdGVyQ29uc3VtZXIuYmluZCh0aGlzLGUpKSxlLm9uKCJwYXVzZSIsdGhpcy5wYXVzZUNvbnN1bWVyLmJpbmQodGhpcyxlLmlkKSksZS5vbigicmVzdW1lIix0aGlzLnJlc3VtZUNvbnN1bWVyLmJpbmQodGhpcyxlLmlkKSksZS5hcHBEYXRhLnNjcmVlblNoYXJlPT09ITAmJnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuYWRkKGUuaWQpfSl9Z2VuZXJhdGVDb25zdW1lclN0cmVhbU1hcChlLG49ITEpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBzPXlpZWxkIGUuZ2V0U3RhdHMoKSxpPXRoaXMucGFyc2VSVENSZXBvcnQocyxbImluYm91bmQtcnRwIl0sITEsZS5pZCksYT1bLi4uaS5jb25zdW1lclN0cmVhbU1hcC52YWx1ZXMoKV1bMF0sZD1uP3RoaXMuZ2V0Q29uc3VtZXJTdGF0c0Zyb21QYXJzZWRDb25zdW1lclN0YXRzKGksYSxlLmlkKTp2b2lkIDA7Zm9yKGNvbnN0IG8gb2Ygcy52YWx1ZXMoKSlzd2l0Y2goby50eXBlKXtjYXNlImluYm91bmQtcnRwIjp7dGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuc2V0KG8uaWQsZS5pZCk7YnJlYWt9fXJldHVybiBkfSl9ZGVyZWdpc3RlclByb2R1Y2VyKGUpe3RoaXMucHJvZHVjZXJNYXAuZGVsZXRlKGUuaWQpLHRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5mb3JFYWNoKChuLHMpPT57bj09PWUuaWQmJnRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5kZWxldGUocyl9KSx0aGlzLnBhdXNlZFByb2R1Y2VyTWFwLmRlbGV0ZShlLmlkKSx0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmRlbGV0ZShlLmlkKX1kZXJlZ2lzdGVyQ29uc3VtZXIoZSl7dGhpcy5jb25zdW1lck1hcC5kZWxldGUoZS5pZCksdGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuZm9yRWFjaCgobixzKT0+e249PT1lLmlkJiZ0aGlzLmluYm91bmRDb25zdW1lck1hcC5kZWxldGUocyl9KSx0aGlzLmNvbnN1bWVyUGVlcklkTWFwLmRlbGV0ZShlLmlkKSx0aGlzLnBhdXNlZENvbnN1bWVyTWFwLmRlbGV0ZShlLmlkKSx0aGlzLnNjcmVlblNoYXJlQ29uc3VtZXJzLmRlbGV0ZShlLmlkKX1nZXRJY2VDYW5kaWRhdGVTdGF0cyhlKXt2YXIgbjtyZXR1cm57aWQ6ZS5pZCx0eXBlOmUuY2FuZGlkYXRlVHlwZXx8ZS50eXBlLGFkZHJlc3M6ZS5hZGRyZXNzLHBvcnQ6ZS5wb3J0LHVybDplLnVybCxwcm90b2NvbDoobj1lLnJlbGF5UHJvdG9jb2wpIT1udWxsP246ZS5wcm90b2NvbCxuZXR3b3JrVHlwZTplLm5ldHdvcmtUeXBlLHJlbGF0ZWRBZGRyZXNzOmUucmVsYXRlZEFkZHJlc3MscmVsYXRlZFBvcnQ6ZS5yZWxhdGVkUG9ydH19cGFyc2VSVENSZXBvcnQoZSxuPVtdLHM9ITEsaT12b2lkIDAsYT12b2lkIDApe3ZhciAkLEYsSCxaLHZlLHllLEJlLHhlLGplLFVlLCRlLEhlLEtlO2NvbnN0IGQ9ZSxvPW5ldyBMcixsPW4ubGVuZ3RoP25ldyBTZXQobik6dm9pZCAwLG09W10sdj1bXSxFPVtdLEk9bmV3IE1hcCx4PW5ldyBNYXA7Zm9yKGNvbnN0IGYgb2YgZC52YWx1ZXMoKSl7aWYobCl7aWYobC5zaXplPT09MClicmVhaztpZihsLmhhcyhmLnR5cGUpKXMmJmwuZGVsZXRlKGYudHlwZSk7ZWxzZSBjb250aW51ZX1zd2l0Y2goZi50eXBlKXtjYXNlImxvY2FsLWNhbmRpZGF0ZSI6e20ucHVzaCh0aGlzLmdldEljZUNhbmRpZGF0ZVN0YXRzKGYpKTticmVha31jYXNlInJlbW90ZS1jYW5kaWRhdGUiOnt2LnB1c2godGhpcy5nZXRJY2VDYW5kaWRhdGVTdGF0cyhmKSk7YnJlYWt9Y2FzZSJjYW5kaWRhdGUtcGFpciI6e2NvbnN0e25vbWluYXRlZDpjfT1mLHtzZWxlY3RlZDp1fT1mLGI9ZixqPXtub21pbmF0ZWQ6YyE9bnVsbD9jOnUsY3VycmVudFJvdW5kVHJpcFRpbWU6Yi5jdXJyZW50Um91bmRUcmlwVGltZSx0b3RhbFJvdW5kVHJpcFRpbWU6Yi50b3RhbFJvdW5kVHJpcFRpbWUsYnl0ZXNSZWNlaXZlZDpiLmJ5dGVzUmVjZWl2ZWQsYnl0ZXNTZW50OmIuYnl0ZXNTZW50LGF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZTpiLmF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZSxhdmFpbGFibGVJbmNvbWluZ0JpdHJhdGU6Yi5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUsbGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wOmIubGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wLGxhc3RQYWNrZXRTZW50VGltZXN0YW1wOmIubGFzdFBhY2tldFNlbnRUaW1lc3RhbXAsbG9jYWxDYW5kaWRhdGVJZDpiLmxvY2FsQ2FuZGlkYXRlSWQscmVtb3RlQ2FuZGlkYXRlSWQ6Yi5yZW1vdGVDYW5kaWRhdGVJZCxieXRlc0Rpc2NhcmRlZE9uU2VuZDpiLmJ5dGVzRGlzY2FyZGVkT25TZW5kLHBhY2tldHNTZW50OmIucGFja2V0c1NlbnQscGFja2V0c1JlY2VpdmVkOmIucGFja2V0c1JlY2VpdmVkLHBhY2tldHNEaXNjYXJkZWRPblNlbmQ6Yi5wYWNrZXRzRGlzY2FyZGVkT25TZW5kfTtFLnB1c2goaiksKGYubm9taW5hdGVkPT09ITB8fGYuc2VsZWN0ZWQ9PT0hMCkmJihvLmNhbmRpZGF0ZVBhaXI9aik7YnJlYWt9Y2FzZSJ0cmFuc3BvcnQiOntjb25zdCBjPWY7YSYmKGEucHJvZHVjaW5nJiYodGhpcy5vdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdfHwodGhpcy5vdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdPXt0b3RhbFBhY2tldHNTZW50OjB9KSksYS5jb25zdW1pbmcmJih0aGlzLm92ZXJhbGxDb25zdW1pbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF18fCh0aGlzLm92ZXJhbGxDb25zdW1pbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF09e3RvdGFsUGFja2V0c1JlY2VpdmVkOjB9KSkpO2NvbnN0IHU9e2J5dGVzUmVjZWl2ZWQ6Yy5ieXRlc1JlY2VpdmVkLGJ5dGVzU2VudDpjLmJ5dGVzU2VudCxwYWNrZXRzU2VudDpjLnBhY2tldHNTZW50LHBhY2tldHNSZWNlaXZlZDpjLnBhY2tldHNSZWNlaXZlZCxkdGxzQ2lwaGVyOmMuZHRsc0NpcGhlcixkdGxzU3RhdGU6Yy5kdGxzU3RhdGUsaWNlUm9sZTpjLmljZVJvbGV9O2lmKG8udHJhbnNwb3J0PXUsYSl7aWYoYS5wcm9kdWNpbmcpe2NvbnN0IGI9dGhpcy5vdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdO3RoaXMucHJvY2Vzc1Byb2R1Y2luZ1RyYW5zcG9ydFN0YXRzKGEuaWQsYix1KX1pZihhLmNvbnN1bWluZyl7Y29uc3QgYj10aGlzLm92ZXJhbGxDb25zdW1pbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF07dGhpcy5wcm9jZXNzQ29uc3VtaW5nVHJhbnNwb3J0U3RhdHMoYS5pZCxiLHUpfX1icmVha31jYXNlInJlbW90ZS1pbmJvdW5kLXJ0cCI6e2NvbnN0IGM9Zix1PXtqaXR0ZXI6Yy5qaXR0ZXIsZnJhY3Rpb25Mb3N0OmMuZnJhY3Rpb25Mb3N0LHJvdW5kVHJpcFRpbWU6Yy5yb3VuZFRyaXBUaW1lLHJvdW5kVHJpcFRpbWVNZWFzdXJlbWVudHM6Yy5yb3VuZFRyaXBUaW1lTWVhc3VyZW1lbnRzLHRvdGFsUm91bmRUcmlwVGltZTpjLnRvdGFsUm91bmRUcmlwVGltZSxwYWNrZXRzTG9zdDpjLnBhY2tldHNMb3N0fTtvLnJlbW90ZUluYm91bmRSdHAuc2V0KGMubG9jYWxJZCx1KTticmVha31jYXNlIm91dGJvdW5kLXJ0cCI6e2lmKCF0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuaGFzKGYuaWQpKWJyZWFrO2NvbnN0IGM9Zix1PWl8fHRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5nZXQoZi5pZCksYj10aGlzLnBhdXNlZFByb2R1Y2VyTWFwLmdldCh1KTtpZihiKXtpZihiLmxhc3RSZXBvcnRDYWxjdWxhdGVkPT09ITApYnJlYWs7dGhpcy5wYXVzZWRQcm9kdWNlck1hcC5zZXQodSx7bGFzdFJlcG9ydENhbGN1bGF0ZWQ6ITB9KX10aGlzLm92ZXJhbGxQcm9kdWNlcnNTdGF0c01hcFt1XXx8KHRoaXMub3ZlcmFsbFByb2R1Y2Vyc1N0YXRzTWFwW3VdPXt0b3RhbFZpZGVvUGFja2V0c1NlbnQ6MCx0b3RhbEF1ZGlvUGFja2V0c1NlbnQ6MH0pO2NvbnN0IGo9dGhpcy5vdmVyYWxsUHJvZHVjZXJzU3RhdHNNYXBbdV07aWYoWyJ2aWRlbyIsImF1ZGlvIl0uaW5jbHVkZXMoYy5tZWRpYVR5cGUpfHxbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLmtpbmQpKXtpZighdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmhhcyhmLmlkKSl7by5zdGFsZVByb2R1Y2VyU3RyZWFtTWFwPSEwO2JyZWFrfWNvbnN0IEs9dGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5wcm9kdWNlcnMuZ2V0KHUpO2lmKCgoJD1LPT1udWxsP3ZvaWQgMDpLLnRyYWNrKT09bnVsbD92b2lkIDA6JC5yZWFkeVN0YXRlKT09PSJlbmRlZCIpYnJlYWs7by5wcm9kdWNlclN0cmVhbU1hcC5oYXModSl8fG8ucHJvZHVjZXJTdHJlYW1NYXAuc2V0KHUse291dGJvdW5kVmlkZW9SdHBJZDpbXSxvdXRib3VuZEF1ZGlvUnRwSWQ6W119KTtjb25zdCB5PXtieXRlc1NlbnQ6Yy5ieXRlc1NlbnQscGFja2V0c1NlbnQ6Yy5wYWNrZXRzU2VudCxuYWNrQ291bnQ6Yy5uYWNrQ291bnQsc3NyYzpjLnNzcmMsbWlkOmMubWlkLGFjdGl2ZTpjLmFjdGl2ZSxjb2RlY0lkOmMuY29kZWNJZCxoZWFkZXJCeXRlc1NlbnQ6Yy5oZWFkZXJCeXRlc1NlbnR8fDAsdG90YWxQYWNrZXRTZW5kRGVsYXk6Yy50b3RhbFBhY2tldFNlbmREZWxheXx8MH07aWYoYy5tZWRpYVR5cGU9PT0idmlkZW8ifHxjLmtpbmQ9PT0idmlkZW8iKXtjb25zdCBoPWMsej1RKHtmcmFtZUhlaWdodDpoLmZyYW1lSGVpZ2h0LGZyYW1lV2lkdGg6aC5mcmFtZVdpZHRoLGZyYW1lc0VuY29kZWQ6aC5mcmFtZXNFbmNvZGVkLGZyYW1lc0Ryb3BwZWQ6aC5mcmFtZXNEcm9wcGVkP2guZnJhbWVzRHJvcHBlZDpoLmRyb3BwZWRGcmFtZXMsZnJhbWVzUGVyU2Vjb25kOmguZnJhbWVzUGVyU2Vjb25kP2guZnJhbWVzUGVyU2Vjb25kOmguZnJhbWVyYXRlTWVhbixmcmFtZXNTZW50OmguZnJhbWVzU2VudCxrZXlGcmFtZXNFbmNvZGVkOmgua2V5RnJhbWVzRW5jb2RlZCxmaXJDb3VudDpoLmZpckNvdW50LGVuY29kZXJJbXBsZW1lbnRhdGlvbjpoLmVuY29kZXJJbXBsZW1lbnRhdGlvbixodWdlRnJhbWVzU2VudDpoLmh1Z2VGcmFtZXNTZW50LHBsaUNvdW50OmgucGxpQ291bnQscXBTdW06aC5xcFN1bSxxdWFsaXR5TGltaXRhdGlvblJlYXNvbjpoLnF1YWxpdHlMaW1pdGF0aW9uUmVhc29uLHF1YWxpdHlMaW1pdGF0aW9uRHVyYXRpb25zOmgucXVhbGl0eUxpbWl0YXRpb25EdXJhdGlvbnMscXVhbGl0eUxpbWl0YXRpb25SZXNvbHV0aW9uQ2hhbmdlczpoLnF1YWxpdHlMaW1pdGF0aW9uUmVzb2x1dGlvbkNoYW5nZXMsdG90YWxFbmNvZGVUaW1lOmgudG90YWxFbmNvZGVUaW1lLHRvdGFsUGFja2V0U2VuZERlbGF5OmgudG90YWxFbmNvZGVUaW1lLHJldHJhbnNtaXR0ZWRCeXRlc1NlbnQ6aC5yZXRyYW5zbWl0dGVkQnl0ZXNTZW50LHJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudDpoLnJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudCxzY2FsYWJpbGl0eU1vZGU6aC5zY2FsYWJpbGl0eU1vZGUscG93ZXJFZmZpY2llbnRFbmNvZGVyOmgucG93ZXJFZmZpY2llbnRFbmNvZGVyfSx5KTtvLm91dGJvdW5kVmlkZW9SdHAuc2V0KGYuaWQseiksby5wcm9kdWNlclN0cmVhbU1hcC5nZXQodSkub3V0Ym91bmRWaWRlb1J0cElkLnB1c2goZi5pZCksdGhpcy5wcm9jZXNzT3V0Ym91bmRQcm9kdWNlclZpZGVvU3RhdHModSxqLHopfWVsc2UgaWYoYy5tZWRpYVR5cGU9PT0iYXVkaW8ifHxjLmtpbmQ9PT0iYXVkaW8iKXtjb25zdCBoPWMsej1RKHtyZXRyYW5zbWl0dGVkQnl0ZXNTZW50OmgucmV0cmFuc21pdHRlZEJ5dGVzU2VudCxyZXRyYW5zbWl0dGVkUGFja2V0c1NlbnQ6aC5yZXRyYW5zbWl0dGVkUGFja2V0c1NlbnR9LHkpO28ub3V0Ym91bmRBdWRpb1J0cC5zZXQoZi5pZCx6KSxvLnByb2R1Y2VyU3RyZWFtTWFwLmdldCh1KS5vdXRib3VuZEF1ZGlvUnRwSWQucHVzaChmLmlkKSx0aGlzLnByb2Nlc3NPdXRib3VuZFByb2R1Y2VyQXVkaW9TdGF0cyh1LGoseil9fWVsc2UgdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZXJyb3IoYENhbGxzdGF0czogVW5rbm93biBPdXRib3VuZC1ydHAuIG1lZGlhdHlwZTogJHtjLm1lZGlhVHlwZX0ga2luZDogJHtjLmtpbmR9YCk7YnJlYWt9Y2FzZSJpbmJvdW5kLXJ0cCI6e2lmKCF0aGlzLmluYm91bmRDb25zdW1lck1hcC5oYXMoZi5pZCkpYnJlYWs7Y29uc3QgYz1mLHU9aXx8dGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuZ2V0KGYuaWQpLGI9dGhpcy5wYXVzZWRDb25zdW1lck1hcC5nZXQodSk7aWYoYil7aWYoYi5sYXN0UmVwb3J0Q2FsY3VsYXRlZD09PSEwKWJyZWFrO3RoaXMucGF1c2VkQ29uc3VtZXJNYXAuc2V0KHUse2xhc3RSZXBvcnRDYWxjdWxhdGVkOiEwfSl9aWYoYy5zc3JjPT09MTIzNClicmVhazt0aGlzLm92ZXJhbGxDb25zdW1lcnNTdGF0c01hcFt1XXx8KHRoaXMub3ZlcmFsbENvbnN1bWVyc1N0YXRzTWFwW3VdPXt0b3RhbFZpZGVvUGFja2V0c1JlY2VpdmVkOjAsdG90YWxBdWRpb1BhY2tldHNSZWNlaXZlZDowfSk7Y29uc3Qgaj10aGlzLm92ZXJhbGxDb25zdW1lcnNTdGF0c01hcFt1XTtpZihbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLm1lZGlhVHlwZSl8fFsidmlkZW8iLCJhdWRpbyJdLmluY2x1ZGVzKGMua2luZCkpe2lmKCF0aGlzLmluYm91bmRDb25zdW1lck1hcC5oYXMoZi5pZCkpe28uc3RhbGVDb25zdW1lclN0cmVhbU1hcD0hMDticmVha31vLmNvbnN1bWVyU3RyZWFtTWFwLmhhcyh1KXx8by5jb25zdW1lclN0cmVhbU1hcC5zZXQodSx7aW5ib3VuZFZpZGVvUnRwSWQ6W10saW5ib3VuZEF1ZGlvUnRwSWQ6W119KTtjb25zdCBLPXtieXRlc1JlY2VpdmVkOmMuYnl0ZXNSZWNlaXZlZCxwYWNrZXRzUmVjZWl2ZWQ6Yy5wYWNrZXRzUmVjZWl2ZWQscGFja2V0c0xvc3Q6Yy5wYWNrZXRzTG9zdD49MD9jLnBhY2tldHNMb3N0OjAsaml0dGVyOmMuaml0dGVyLG5hY2tDb3VudDpjLm5hY2tDb3VudCxqaXR0ZXJCdWZmZXJEZWxheTpjLmppdHRlckJ1ZmZlckRlbGF5LGppdHRlckJ1ZmZlckVtaXR0ZWRDb3VudDpjLmppdHRlckJ1ZmZlckVtaXR0ZWRDb3VudCxsYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXA6Yy5sYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXAsc3NyYzpjLnNzcmMsbWlkOmMubWlkLGNvZGVjSWQ6Yy5jb2RlY0lkLGhlYWRlckJ5dGVzUmVjZWl2ZWQ6Yy5oZWFkZXJCeXRlc1JlY2VpdmVkfHwwLHBhY2tldHNEaXNjYXJkZWQ6Yy5wYWNrZXRzRGlzY2FyZGVkfHwwLGppdHRlckJ1ZmZlck1pbmltdW1EZWxheTpjLmppdHRlckJ1ZmZlck1pbmltdW1EZWxheXx8MCxqaXR0ZXJCdWZmZXJUYXJnZXREZWxheTpjLmppdHRlckJ1ZmZlclRhcmdldERlbGF5fHwwfTtpZihjLm1lZGlhVHlwZT09PSJ2aWRlbyJ8fGMua2luZD09PSJ2aWRlbyIpe2NvbnN0IHk9YyxoPVEoe2ZyYW1lSGVpZ2h0OnkuZnJhbWVIZWlnaHQsZnJhbWVXaWR0aDp5LmZyYW1lV2lkdGgsZnJhbWVzRGVjb2RlZDp5LmZyYW1lc0RlY29kZWQsZnJhbWVzRHJvcHBlZDp5LmZyYW1lc0Ryb3BwZWQ/eS5mcmFtZXNEcm9wcGVkOnkuZHJvcHBlZEZyYW1lcyxmcmFtZXNQZXJTZWNvbmQ6eS5mcmFtZXNQZXJTZWNvbmQ/eS5mcmFtZXNQZXJTZWNvbmQ6eS5mcmFtZXJhdGVNZWFuLGZyYW1lc1JlY2VpdmVkOnkuZnJhbWVzUmVjZWl2ZWQsa2V5RnJhbWVzRGVjb2RlZDp5LmtleUZyYW1lc0RlY29kZWQsZmlyQ291bnQ6eS5maXJDb3VudCxkZWNvZGVySW1wbGVtZW50YXRpb246eS5kZWNvZGVySW1wbGVtZW50YXRpb24scGxpQ291bnQ6eS5wbGlDb3VudCx0b3RhbFByb2Nlc3NpbmdEZWxheTp5LnRvdGFsUHJvY2Vzc2luZ0RlbGF5LHFwU3VtOnkucXBTdW18fDAsdG90YWxBc3NlbWJseVRpbWU6eS50b3RhbEFzc2VtYmx5VGltZXx8MCx0b3RhbERlY29kZVRpbWU6eS50b3RhbERlY29kZVRpbWV8fDAsdG90YWxGcmVlemVzRHVyYXRpb246eS50b3RhbEZyZWV6ZXNEdXJhdGlvbnx8MCx0b3RhbEludGVyRnJhbWVEZWxheTp5LnRvdGFsSW50ZXJGcmFtZURlbGF5fHwwLHRvdGFsUGF1c2VzRHVyYXRpb246eS50b3RhbFBhdXNlc0R1cmF0aW9ufHwwLHRvdGFsU3F1YXJlZEludGVyRnJhbWVEZWxheTp5LnRvdGFsU3F1YXJlZEludGVyRnJhbWVEZWxheXx8MCxmcmVlemVDb3VudDp5LmZyZWV6ZUNvdW50fHwwLHBhdXNlQ291bnQ6eS5wYXVzZUNvdW50fHwwLHBvd2VyRWZmaWNpZW50RGVjb2Rlcjp5LnBvd2VyRWZmaWNpZW50RGVjb2Rlcn0sSyk7aC5zY29yZT1Jcih7ZnJhbWVXaWR0aDpoLmZyYW1lV2lkdGh8fDAsZnJhbWVzRGVjb2RlZDooaC5mcmFtZXNEZWNvZGVkfHwwKS0oKChGPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6Ri5mcmFtZXNEZWNvZGVkKXx8MCksZnJhbWVzUGVyU2Vjb25kOmguZnJhbWVzUGVyU2Vjb25kfHwwLHBhY2tldHNMb3N0OihoLnBhY2tldHNMb3N0fHwwKS0oKChIPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6SC5wYWNrZXRzTG9zdCl8fDApLHBhY2tldHNSZWNlaXZlZDooaC5wYWNrZXRzUmVjZWl2ZWR8fDApLSgoKFo9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpaLnBhY2tldHNSZWNlaXZlZCl8fDApLGppdHRlcjpoLmppdHRlcnx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuaGFzKHUpfSkseC5zZXQodSx7c2NvcmU6KyhoLnNjb3JlKjEwKS50b0ZpeGVkKCksZnJhbWVXaWR0aDpoLmZyYW1lV2lkdGh8fDAsZnJhbWVIZWlnaHQ6aC5mcmFtZUhlaWdodHx8MCxmcmFtZXNQZXJTZWNvbmQ6aC5mcmFtZXNQZXJTZWNvbmR8fDAscGFja2V0c0xvc3RQZXJjZW50YWdlOnV0KHtwYWNrZXRzTG9zdDooaC5wYWNrZXRzTG9zdHx8MCktKCgodmU9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDp2ZS5wYWNrZXRzTG9zdCl8fDApLHBhY2tldHNSZWNlaXZlZDooaC5wYWNrZXRzUmVjZWl2ZWR8fDApLSgoKHllPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6eWUucGFja2V0c1JlY2VpdmVkKXx8MCl9KSxqaXR0ZXI6aC5qaXR0ZXJ8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlQ29uc3VtZXJzLmhhcyh1KSxiaXRyYXRlOigoaC5ieXRlc1JlY2VpdmVkfHwwKS0oKChCZT10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOkJlLmJ5dGVzUmVjZWl2ZWQpfHwwKSkqOC83fSksdGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5zZXQodSxoKSxvLmluYm91bmRWaWRlb1J0cC5zZXQoZi5pZCxoKSxvLmNvbnN1bWVyU3RyZWFtTWFwLmdldCh1KS5pbmJvdW5kVmlkZW9SdHBJZC5wdXNoKGYuaWQpLHRoaXMucHJvY2Vzc0luYm91bmRDb25zdW1lclZpZGVvU3RhdHModSxqLGgpfWVsc2UgaWYoYy5tZWRpYVR5cGU9PT0iYXVkaW8ifHxjLmtpbmQ9PT0iYXVkaW8iKXtjb25zdCB5PWMsaD1RKHthdWRpb0xldmVsOnkuYXVkaW9MZXZlbCxjb25jZWFsZWRTYW1wbGVzOnkuY29uY2VhbGVkU2FtcGxlcyxjb25jZWFsbWVudEV2ZW50czp5LmNvbmNlYWxtZW50RXZlbnRzLHRvdGFsQXVkaW9FbmVyZ3k6eS50b3RhbEF1ZGlvRW5lcmd5LHRvdGFsU2FtcGxlc0R1cmF0aW9uOnkudG90YWxTYW1wbGVzRHVyYXRpb24sdG90YWxTYW1wbGVzUmVjZWl2ZWQ6eS50b3RhbFNhbXBsZXNSZWNlaXZlZCxmZWNQYWNrZXRzRGlzY2FyZGVkOnkuZmVjUGFja2V0c0Rpc2NhcmRlZHx8MCxmZWNQYWNrZXRzUmVjZWl2ZWQ6eS5mZWNQYWNrZXRzUmVjZWl2ZWR8fDAsaW5zZXJ0ZWRTYW1wbGVzRm9yRGVjZWxlcmF0aW9uOnkuaW5zZXJ0ZWRTYW1wbGVzRm9yRGVjZWxlcmF0aW9ufHwwLHJlbW92ZWRTYW1wbGVzRm9yQWNjZWxlcmF0aW9uOnkucmVtb3ZlZFNhbXBsZXNGb3JBY2NlbGVyYXRpb258fDAsc2lsZW50Q29uY2VhbGVkU2FtcGxlczp5LnNpbGVudENvbmNlYWxlZFNhbXBsZXN8fDAscGxheW91dElkOnkucGxheW91dElkfSxLKTtoLnNjb3JlPXdyKHtjb25jZWFsbWVudEV2ZW50czooaC5jb25jZWFsbWVudEV2ZW50c3x8MCktKCgoeGU9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDp4ZS5jb25jZWFsbWVudEV2ZW50cyl8fDApLHBhY2tldHNMb3N0OihoLnBhY2tldHNMb3N0fHwwKS0oKChqZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOmplLnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihoLnBhY2tldHNSZWNlaXZlZHx8MCktKCgoVWU9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpVZS5wYWNrZXRzUmVjZWl2ZWQpfHwwKSxqaXR0ZXI6aC5qaXR0ZXJ8fDB9KSx4LnNldCh1LHtzY29yZTorKGguc2NvcmUqMTApLnRvRml4ZWQoKSxwYWNrZXRzTG9zdFBlcmNlbnRhZ2U6dXQoe3BhY2tldHNMb3N0OihoLnBhY2tldHNMb3N0fHwwKS0oKCgkZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOiRlLnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihoLnBhY2tldHNSZWNlaXZlZHx8MCktKCgoSGU9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpIZS5wYWNrZXRzUmVjZWl2ZWQpfHwwKX0pLGppdHRlcjpoLmppdHRlcnx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuaGFzKHUpLGJpdHJhdGU6KChoLmJ5dGVzUmVjZWl2ZWR8fDApLSgoKEtlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6S2UuYnl0ZXNSZWNlaXZlZCl8fDApKSo4Lzd9KSx0aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLnNldCh1LGgpLG8uaW5ib3VuZEF1ZGlvUnRwLnNldChmLmlkLGgpLG8uY29uc3VtZXJTdHJlYW1NYXAuZ2V0KHUpLmluYm91bmRBdWRpb1J0cElkLnB1c2goZi5pZCksdGhpcy5wcm9jZXNzSW5ib3VuZENvbnN1bWVyQXVkaW9TdGF0cyh1LGosaCl9fWVsc2UgdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZXJyb3IoYENhbGxzdGF0czogVW5rbm93biBJbmJvdW5kLXJ0cC4gbWVkaWF0eXBlOiAke2MubWVkaWFUeXBlfSBraW5kOiAke2Mua2luZH1gKTticmVha319fWlmKG8ucHJvZHVjZXJTdHJlYW1NYXAuZm9yRWFjaCgoZixjKT0+e3ZhciB1LGIsaixLLHksaCx6LFdlLHplLEdlLHFlLFllLFFlLEplLFhlLFplLGV0LHR0LHJ0LG50LHN0LGl0LGF0O2lmKGYub3V0Ym91bmRWaWRlb1J0cElkLmxlbmd0aD4wKXtjb25zdCBOPVtdO2Yub3V0Ym91bmRWaWRlb1J0cElkLmZvckVhY2goc3I9PntOLnB1c2goby5vdXRib3VuZFZpZGVvUnRwLmdldChzcikpfSk7Y29uc3QgQT10aGlzLmdldFdvcmtpbmdTaW11bGNhc3RWaWRlb1N0YXRzKE4pO0Euc2NvcmU9UHIoe2ZyYW1lV2lkdGg6QS5mcmFtZVdpZHRofHwwLGZyYW1lc1BlclNlY29uZDpBLmZyYW1lc1BlclNlY29uZHx8MCxqaXR0ZXI6KCh1PUEucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnUuaml0dGVyKXx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVQcm9kdWNlcnMuaGFzKGMpLHBhY2tldHNTZW50OihBLnBhY2tldHNTZW50fHwwKS0oKChiPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6Yi5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKGo9QS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6ai5wYWNrZXRzTG9zdCl8fDApLSgoKHk9KEs9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpLLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDp5LnBhY2tldHNMb3N0KXx8MCksZnJhbWVzRW5jb2RlZDooQS5mcmFtZXNFbmNvZGVkfHwwKS0oKChoPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6aC5mcmFtZXNFbmNvZGVkKXx8MCl9KSxJLnNldChjLHtzY29yZTorKEEuc2NvcmUqMTApLnRvRml4ZWQoKSxmcmFtZVdpZHRoOkEuZnJhbWVXaWR0aHx8MCxmcmFtZUhlaWdodDpBLmZyYW1lSGVpZ2h0fHwwLGZyYW1lc1BlclNlY29uZDpBLmZyYW1lc1BlclNlY29uZHx8MCxqaXR0ZXI6KCh6PUEucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnouaml0dGVyKXx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVQcm9kdWNlcnMuaGFzKGMpLHBhY2tldHNMb3N0UGVyY2VudGFnZTpsdCh7cGFja2V0c1NlbnQ6KEEucGFja2V0c1NlbnR8fDApLSgoKFdlPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6V2UucGFja2V0c1NlbnQpfHwwKSxwYWNrZXRzTG9zdDooKCh6ZT1BLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDp6ZS5wYWNrZXRzTG9zdCl8fDApLSgoKHFlPShHZT10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOkdlLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpxZS5wYWNrZXRzTG9zdCl8fDApfSksYml0cmF0ZTooKEEuYnl0ZXNTZW50fHwwKS0oKChZZT10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOlllLmJ5dGVzU2VudCl8fDApKSo4LzcsY3B1TGltaXRhdGlvbnM6QS5xdWFsaXR5TGltaXRhdGlvblJlYXNvbj09PSJjcHUiLGJhbmR3aWR0aExpbWl0YXRpb25zOkEucXVhbGl0eUxpbWl0YXRpb25SZWFzb249PT0iYmFuZHdpZHRoIn0pLHRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuc2V0KGMsQSl9ZWxzZSBpZihmLm91dGJvdW5kQXVkaW9SdHBJZC5sZW5ndGg+MCl7Y29uc3QgTj1vLm91dGJvdW5kQXVkaW9SdHAuZ2V0KGYub3V0Ym91bmRBdWRpb1J0cElkWzBdKTtOLnNjb3JlPVJyKHtwYWNrZXRzU2VudDooTi5wYWNrZXRzU2VudHx8MCktKCgoUWU9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpRZS5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKEplPU4ucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOkplLnBhY2tldHNMb3N0KXx8MCktKCgoWmU9KFhlPXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6WGUucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOlplLnBhY2tldHNMb3N0KXx8MCksaml0dGVyOigoZXQ9Ti5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6ZXQuaml0dGVyKXx8MH0pLEkuc2V0KGMse3Njb3JlOisoTi5zY29yZSoxMCkudG9GaXhlZCgpLGJpdHJhdGU6KChOLmJ5dGVzU2VudHx8MCktKCgodHQ9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDp0dC5ieXRlc1NlbnQpfHwwKSkqOC83LHBhY2tldHNMb3N0UGVyY2VudGFnZTpsdCh7cGFja2V0c1NlbnQ6KE4ucGFja2V0c1NlbnR8fDApLSgoKHJ0PXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6cnQucGFja2V0c1NlbnQpfHwwKSxwYWNrZXRzTG9zdDooKChudD1OLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpudC5wYWNrZXRzTG9zdCl8fDApLSgoKGl0PShzdD10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnN0LnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDppdC5wYWNrZXRzTG9zdCl8fDApfSksaml0dGVyOigoYXQ9Ti5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6YXQuaml0dGVyKXx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVQcm9kdWNlcnMuaGFzKGMpfSksdGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5zZXQoYyxOKX19KSxFLmZvckVhY2goZj0+e2NvbnN0IGM9bS5maW5kKGI9PmIuaWQ9PT1mLmxvY2FsQ2FuZGlkYXRlSWQ/KGYubG9jYWxDYW5kaWRhdGVJZD1iLmlkLGIpOm51bGwpLHU9di5maW5kKGI9PmIuaWQ9PT1mLnJlbW90ZUNhbmRpZGF0ZUlkPyhmLnJlbW90ZUNhbmRpZGF0ZUlkPWIuaWQsYik6bnVsbCk7YyYmKGYubG9jYWxDYW5kaWRhdGVUeXBlPWMudHlwZSxmLmxvY2FsQ2FuZGlkYXRlQWRkcmVzcz1hZShjLmFkZHJlc3MpLGYubG9jYWxDYW5kaWRhdGVQb3J0PWMucG9ydCxmLmxvY2FsQ2FuZGlkYXRlUHJvdG9jb2w9Yy5wcm90b2NvbCxmLmxvY2FsQ2FuZGlkYXRlVXJsPWMudXJsLGYubG9jYWxDYW5kaWRhdGVOZXR3b3JrVHlwZT1jLm5ldHdvcmtUeXBlLGYubG9jYWxDYW5kaWRhdGVSZWxhdGVkQWRkcmVzcz1hZShjLnJlbGF0ZWRBZGRyZXNzKSxmLmxvY2FsQ2FuZGlkYXRlUmVsYXRlZFBvcnQ9Yy5yZWxhdGVkUG9ydCksdSYmKGYucmVtb3RlQ2FuZGlkYXRlVHlwZT11LnR5cGUsZi5yZW1vdGVDYW5kaWRhdGVBZGRyZXNzPWFlKHUuYWRkcmVzcyksZi5yZW1vdGVDYW5kaWRhdGVQb3J0PXUucG9ydCxmLnJlbW90ZUNhbmRpZGF0ZVByb3RvY29sPXUucHJvdG9jb2wsZi5yZW1vdGVDYW5kaWRhdGVVcmw9dS51cmwpfSksby5jYW5kaWRhdGVQYWlyJiYoby50cmFuc3BvcnQ/KG8udHJhbnNwb3J0LmJ5dGVzUmVjZWl2ZWQ9by5jYW5kaWRhdGVQYWlyLmJ5dGVzUmVjZWl2ZWQsby50cmFuc3BvcnQuYnl0ZXNTZW50PW8uY2FuZGlkYXRlUGFpci5ieXRlc1NlbnQsby50cmFuc3BvcnQudG90YWxSb3VuZFRyaXBUaW1lPW8uY2FuZGlkYXRlUGFpci50b3RhbFJvdW5kVHJpcFRpbWUsby50cmFuc3BvcnQuYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlPW8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGUsby50cmFuc3BvcnQuYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlPW8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUsby50cmFuc3BvcnQucm91bmRUcmlwVGltZT1vLmNhbmRpZGF0ZVBhaXIuY3VycmVudFJvdW5kVHJpcFRpbWUpOm8udHJhbnNwb3J0PXtieXRlc1JlY2VpdmVkOm8uY2FuZGlkYXRlUGFpci5ieXRlc1JlY2VpdmVkLGJ5dGVzU2VudDpvLmNhbmRpZGF0ZVBhaXIuYnl0ZXNTZW50LHRvdGFsUm91bmRUcmlwVGltZTpvLmNhbmRpZGF0ZVBhaXIudG90YWxSb3VuZFRyaXBUaW1lLGF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZTpvLmNhbmRpZGF0ZVBhaXIuYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlLGF2YWlsYWJsZUluY29taW5nQml0cmF0ZTpvLmNhbmRpZGF0ZVBhaXIuYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlLHJvdW5kVHJpcFRpbWU6by5jYW5kaWRhdGVQYWlyLmN1cnJlbnRSb3VuZFRyaXBUaW1lfSksby50cmFuc3BvcnQmJihvLnRyYW5zcG9ydC5jYW5kaWRhdGVQYWlycz1FKSxvLnRyYW5zcG9ydCYmIW8udHJhbnNwb3J0LnJvdW5kVHJpcFRpbWUpe2xldCBmPTAsYz0wO28ucmVtb3RlSW5ib3VuZFJ0cC5mb3JFYWNoKCh1LGIpPT57dS5yb3VuZFRyaXBUaW1lJiZ1LnJvdW5kVHJpcFRpbWU+ZiYmKGY9dS5yb3VuZFRyaXBUaW1lLGM9dS50b3RhbFJvdW5kVHJpcFRpbWUpfSksby50cmFuc3BvcnQucm91bmRUcmlwVGltZT1mLG8udHJhbnNwb3J0LnRvdGFsUm91bmRUcmlwVGltZT1jfWlmKHguc2l6ZT4wKXRyeXt0aGlzLm9ic2VydmVyLmVtaXQoImNvbnN1bWVyX3Njb3JlIix4KX1jYXRjaChmKXt9aWYoSS5zaXplPjApdHJ5e3RoaXMub2JzZXJ2ZXIuZW1pdCgicHJvZHVjZXJfc2NvcmUiLEkpfWNhdGNoKGYpe31yZXR1cm4gb31nZXRQcm9kdWNlclN0YXRzRnJvbVJlcG9ydChlKXtjb25zdCBuPVtdO3RyeXtlLnByb2R1Y2VyU3RyZWFtTWFwLmZvckVhY2goKHMsaSk9Pntjb25zdCBhPXRoaXMucHJvZHVjZXJNYXAuZ2V0KGkpLGQ9YS50cmFjay5nZXRTZXR0aW5ncygpLG89cy5vdXRib3VuZFZpZGVvUnRwSWQubWFwKG09Pntjb25zdCB2PWUub3V0Ym91bmRWaWRlb1J0cC5nZXQobSk7cmV0dXJuIHYuZnJhbWVIZWlnaHR8fCh2LmZyYW1lSGVpZ2h0PWQuaGVpZ2h0LHYuZnJhbWVXaWR0aD1kLndpZHRoLHYuZnJhbWVzUGVyU2Vjb25kPWQuZnJhbWVSYXRlKSx2fSksbD17cHJvZHVjZXJJZDppLGFwcERhdGE6YS5hcHBEYXRhLHZpZGVvU3RhdHM6byxhdWRpb1N0YXRzOnMub3V0Ym91bmRBdWRpb1J0cElkLm1hcChtPT5lLm91dGJvdW5kQXVkaW9SdHAuZ2V0KG0pKX07bi5wdXNoKGwpfSl9Y2F0Y2gocyl7Y29uc29sZS5lcnJvcigiZ2V0UHJvZHVjZXJzUmVwb3J0OiAiLHMsZSl9cmV0dXJuIG59Z2V0Q29uc3VtZXJTdGF0c0Zyb21QYXJzZWRDb25zdW1lclN0YXRzKGUsbixzKXtsZXQgaTt0cnl7Y29uc3R7cGVlcklkOmEscHJvZHVjZXJJZDpkLGFwcERhdGE6b309dGhpcy5jb25zdW1lclBlZXJJZE1hcC5nZXQocyksbD1uPT1udWxsP3ZvaWQgMDpuLmluYm91bmRWaWRlb1J0cElkLm1hcChtPT57Y29uc3QgRT10aGlzLmNvbnN1bWVyTWFwLmdldChzKS50cmFjay5nZXRTZXR0aW5ncygpLEk9ZS5pbmJvdW5kVmlkZW9SdHAuZ2V0KG0pO3JldHVybiBJLmZyYW1lSGVpZ2h0fHwoSS5mcmFtZUhlaWdodD1FLmhlaWdodCxJLmZyYW1lV2lkdGg9RS53aWR0aCxJLmZyYW1lc1BlclNlY29uZD1FLmZyYW1lUmF0ZSksSX0pO2k9e2NvbnN1bWVySWQ6cyxwZWVySWQ6YSxwcm9kdWNlcklkOmQsYXBwRGF0YTpvLHZpZGVvU3RhdHM6bCxhdWRpb1N0YXRzOm49PW51bGw/dm9pZCAwOm4uaW5ib3VuZEF1ZGlvUnRwSWQubWFwKG09PmUuaW5ib3VuZEF1ZGlvUnRwLmdldChtKSl9fWNhdGNoKGEpe2NvbnNvbGUuZXJyb3IoImdldENvbnN1bWVyU3RhdHNGcm9tUGFyc2VkQ29uc3VtZXJTdGF0czogIixhLGUpfXJldHVybiBpfWdldENvbnN1bWVyU3RhdHNGcm9tUmVwb3J0KGUpe2NvbnN0IG49W107dHJ5e2UuY29uc3VtZXJTdHJlYW1NYXAuZm9yRWFjaCgocyxpKT0+e24ucHVzaCh0aGlzLmdldENvbnN1bWVyU3RhdHNGcm9tUGFyc2VkQ29uc3VtZXJTdGF0cyhlLHMsaSkpfSl9Y2F0Y2gocyl7Y29uc29sZS5lcnJvcigiZ2V0Q29uc3VtZXJTdGF0c0Zyb21SZXBvcnQ6ICIscyxlKX1yZXR1cm4gbn19Y2xhc3MgSXMgZXh0ZW5kcyBOcnt9ZnVuY3Rpb24gbXQodCxyLGUsbil7aWYodCE9bnVsbCYmdC5sb2dnZXImJnQubG9nZ2VyLmVycm9yKCJDYWxsc3RhdHM6OmhhbmRsZUVycm9yIix7ZXJyb3I6bn0pLHR5cGVvZiBlPT0iZnVuY3Rpb24iJiZuIGluc3RhbmNlb2YgcillLmNhbGwobnVsbCxuLHQpO2Vsc2UgdGhyb3cgbn1mdW5jdGlvbiBWcih0LHIsZSl7Y29uc3Qgbj10LnZhbHVlO3JldHVybiB0LnZhbHVlPWZ1bmN0aW9uKC4uLnMpe3RyeXtjb25zdCBpPW4uYXBwbHkodGhpcyxzKTtyZXR1cm4gaSYmaSBpbnN0YW5jZW9mIFByb21pc2U/aS5jYXRjaChhPT57bXQodGhpcyxyLGUsYSl9KTppfWNhdGNoKGkpe210KHRoaXMscixlLGkpfXJldHVybiBudWxsfSx0fWNvbnN0IEM9KHQscik9PihlLG4scyk9Pntjb25zdCBpPXMudmFsdWU7cmV0dXJuIHMudmFsdWU9ZnVuY3Rpb24oLi4uYSl7dHJ5e2NvbnN0IGQ9aS5hcHBseSh0aGlzLGEpO3JldHVybiBkJiZkIGluc3RhbmNlb2YgUHJvbWlzZT9kLmNhdGNoKG89PnttdCh0aGlzLHQscixvKX0pOmR9Y2F0Y2goZCl7bXQodGhpcyx0LHIsZCl9cmV0dXJuIG51bGx9LHN9LEFzPSh0LHIpPT4oZSxuLHMpPT57aWYocylyZXR1cm4gVnIocyx0LHIpO2Zvcihjb25zdCBpIG9mIFJlZmxlY3Qub3duS2V5cyhlLnByb3RvdHlwZSkuZmlsdGVyKGE9PmEhPT0iY29uc3RydWN0b3IiKSl7Y29uc3QgYT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUucHJvdG90eXBlLGkpO2EudmFsdWUgaW5zdGFuY2VvZiBGdW5jdGlvbiYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLGksVnIoYSx0LHIpKX19O3ZhciBSPWZ1bmN0aW9uKHQscixlLG4pe3ZhciBzPWFyZ3VtZW50cy5sZW5ndGgsaT1zPDM/cjpuPT09bnVsbD9uPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocixlKTpuLGE7aWYodHlwZW9mIFJlZmxlY3Q9PSJvYmplY3QiJiZ0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZT09ImZ1bmN0aW9uIilpPVJlZmxlY3QuZGVjb3JhdGUodCxyLGUsbik7ZWxzZSBmb3IodmFyIGQ9dC5sZW5ndGgtMTtkPj0wO2QtLSkoYT10W2RdKSYmKGk9KHM8Mz9hKGkpOnM+Mz9hKHIsZSxpKTphKHIsZSkpfHxpKTtyZXR1cm4gcz4zJiZpJiZPYmplY3QuZGVmaW5lUHJvcGVydHkocixlLGkpLGl9O2NvbnN0IFA9Y29uc29sZTtsZXQgXz1jbGFzcyBleHRlbmRzIHF7Y29uc3RydWN0b3IoZT0iaHR0cHM6Ly9hcGkudGVzdGluZ3YzLmR5dGUuaW4iLG49IkJsaW5rIixzPWdyLlBST0QsaSxhLGQsbyl7c3VwZXIoKTtwKHRoaXMsIm9ic2VydmVyIik7cCh0aGlzLCJldmVudEhhbmRsZXIiKTtwKHRoaXMsIm1lYXN1cmVtZW50cyIpO3AodGhpcywicHJvZHVjaW5nVHJhbnNwb3J0Iik7cCh0aGlzLCJjb25zdW1pbmdUcmFuc3BvcnQiKTtwKHRoaXMsInByb2R1Y2VycyIsbmV3IE1hcCk7cCh0aGlzLCJjb25zdW1lcnMiLG5ldyBNYXApO3AodGhpcywiaWNlU2VydmVycyIpO3AodGhpcywiY29ubmVjdGlvbkluZm9Qcm9taXNlIik7cCh0aGlzLCJwaW5nU3RhdHNUaW1lb3V0Iik7cCh0aGlzLCJsb2dnZXIiKTtwKHRoaXMsImVudiIpO3AodGhpcywiYXBpSG9zdG5hbWVzIik7cCh0aGlzLCJwZWVySWQiKTtwKHRoaXMsImNvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZXNNYXAiLG5ldyBNYXApO3AodGhpcywiY3VycmVudFVzZXJNZWRpYVN0YXRlcyIse30pO3N3aXRjaCh0aGlzLmVudj1zLHRoaXMuYXBpSG9zdG5hbWVzPW8sdGhpcy5sb2dnZXI9YSx0aGlzLnBlZXJJZD1kLHRoaXMuZXZlbnRIYW5kbGVyPW5ldyBocyh7bG9nZ2VyOmEscGVlcklkOmQsYXBpSG9zdG5hbWVzOm99KSx0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjplbmdpbmVOYW1lOiAiLHtlbmdpbmVOYW1lOm59KSxuKXtjYXNlIkJsaW5rIjp0aGlzLm1lYXN1cmVtZW50cz1uZXcgd3M7YnJlYWs7Y2FzZSJHZWNrbyI6dGhpcy5tZWFzdXJlbWVudHM9bmV3IE5yO2JyZWFrO2Nhc2UiV2ViS2l0Ijp0aGlzLm1lYXN1cmVtZW50cz1uZXcgSXM7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihgVW5rbm93biBlbmdpbmVOYW1lISAke259YCl9dGhpcy5tZWFzdXJlbWVudHMuY2FsbFN0YXRzSW5zdGFuY2U9dGhpcyx0aGlzLnJlZ2lzdGVyUHJvZHVjZXI9dGhpcy5yZWdpc3RlclByb2R1Y2VyLmJpbmQodGhpcyksdGhpcy5yZWdpc3RlckNvbnN1bWVyPXRoaXMucmVnaXN0ZXJDb25zdW1lci5iaW5kKHRoaXMpLHRoaXMub2JzZXJ2ZXI9bmV3IHEsdGhpcy5tZWFzdXJlbWVudHMub2JzZXJ2ZXIub24oImNvbnN1bWVyX3Njb3JlIixsPT57YS5kZWJ1ZyhgY2FsbFN0YXRzOjpjb25zdW1lcl9zY29yZSAke1suLi5sLmVudHJpZXMoKV19YCksdGhpcy5ldmVudEhhbmRsZXIuZW1pdCgiY29uc3VtZXJfc2NvcmUiLGwpfSksdGhpcy5tZWFzdXJlbWVudHMub2JzZXJ2ZXIub24oInByb2R1Y2VyX3Njb3JlIixsPT57YS5kZWJ1ZyhgY2FsbFN0YXRzOjpwcm9kdWNlcl9zY29yZSAke1suLi5sLmVudHJpZXMoKV19YCksdGhpcy5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfc2NvcmUiLGwpfSl9cmVnaXN0ZXJJY2VTZXJ2ZXJzKGUpe3RoaXMuaWNlU2VydmVycz1lfXJlZ2lzdGVyQ29uc3VtZXIoZSl7dmFyIG47dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLmhhcyhlLmlkKXx8dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLmlkLHt9KSx0aGlzLmNvbnN1bWVycy5zZXQoZS5pZCxlKSx0aGlzLm1lYXN1cmVtZW50cy5yZWdpc3RlckNvbnN1bWVyKGUpLHRoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnJlZ2lzdGVyQ29uc3VtZXIiLHtjb25zdW1lcklkOmUuaWQsY29uc3VtZXJraW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChuPWUuYXBwRGF0YSkhPW51bGwmJm4uc2NyZWVuU2hhcmUpfSksZS5vbigiY2xvc2UiLHRoaXMuZGVSZWdpc3RlckNvbnN1bWVyLmJpbmQodGhpcyxlKSl9cmVnaXN0ZXJQcm9kdWNlcihlKXt2YXIgbjt0aGlzLnByb2R1Y2Vycy5zZXQoZS5pZCxlKSx0aGlzLm1lYXN1cmVtZW50cy5yZWdpc3RlclByb2R1Y2VyKGUpLHRoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnJlZ2lzdGVyUHJvZHVjZXIiLHtwcm9kdWNlcklkOmUuaWQscHJvZHVjZXJLaW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChuPWUuYXBwRGF0YSkhPW51bGwmJm4uc2NyZWVuU2hhcmUpfSksZS5vbigiY2xvc2UiLHRoaXMuZGVSZWdpc3RlclByb2R1Y2VyLmJpbmQodGhpcyxlKSl9c2VuZENvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZUV2ZW50KGUsbil7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLmhhcyhlKXx8dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLHt9KTtjb25zdCBzPXRoaXMuY29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlc01hcC5nZXQoZSk7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLE9iamVjdC5hc3NpZ24ocyxuKSl9cmVnaXN0ZXJQcm9kdWNpbmdUcmFuc3BvcnQoZSl7dmFyIHM7dGhpcy5wcm9kdWNpbmdUcmFuc3BvcnQ9ZSxlLm9uKCJjbG9zZSIsdGhpcy5kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0LmJpbmQodGhpcyxlKSksZS5vbigiZGlzY29ubmVjdCIsdGhpcy5kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0LmJpbmQodGhpcyxlKSksQXJyYXkuZnJvbSgoKHM9ZS5fcHJvZHVjZXJzKT09bnVsbD92b2lkIDA6cy52YWx1ZXMoKSl8fFtdKS5mb3JFYWNoKGk9Pnt0aGlzLnJlZ2lzdGVyUHJvZHVjZXIoaSl9KSxlLm9uKCJuZXdwcm9kdWNlciIsdGhpcy5yZWdpc3RlclByb2R1Y2VyKX1yZWdpc3RlckNvbnN1bWluZ1RyYW5zcG9ydChlKXt2YXIgczt0aGlzLmNvbnN1bWluZ1RyYW5zcG9ydD1lLGUub24oImNsb3NlIix0aGlzLmRpc2Nvbm5lY3RDb25zdW1pbmdUcmFuc3BvcnQuYmluZCh0aGlzLGUpKSxlLm9uKCJkaXNjb25uZWN0Iix0aGlzLmRpc2Nvbm5lY3RDb25zdW1pbmdUcmFuc3BvcnQuYmluZCh0aGlzLGUpKSxBcnJheS5mcm9tKCgocz1lLl9jb25zdW1lcnMpPT1udWxsP3ZvaWQgMDpzLnZhbHVlcygpKXx8W10pLmZvckVhY2goaT0+e3RoaXMucmVnaXN0ZXJDb25zdW1lcihpKX0pLGUub24oIm5ld2NvbnN1bWVyIix0aGlzLnJlZ2lzdGVyQ29uc3VtZXIpfWRlUmVnaXN0ZXJDb25zdW1lcihlKXt0aGlzLmNvbnN1bWVycy5kZWxldGUoZS5pZCl9ZGVSZWdpc3RlclByb2R1Y2VyKGUpe3ZhciBuO3RoaXMucHJvZHVjZXJzLmRlbGV0ZShlLmlkKSx0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpkZVJlZ2lzdGVyUHJvZHVjZXIiLHtwcm9kdWNlcklkOmUuaWQscHJvZHVjZXJLaW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChuPWUuYXBwRGF0YSkhPW51bGwmJm4uc2NyZWVuU2hhcmUpfSl9ZGlzY29ubmVjdENvbnN1bWluZ1RyYW5zcG9ydCgpe3RoaXMuY29uc3VtaW5nVHJhbnNwb3J0PXZvaWQgMH1kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0KCl7dGhpcy5wcm9kdWNpbmdUcmFuc3BvcnQ9dm9pZCAwfWNhbGxFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoZSl9c2VuZFByZUNhbGxUZXN0QmVnaW5FdmVudChlPSExLG4pe3RoaXMuY29ubmVjdGlvbkluZm9Qcm9taXNlPXRoaXMubWVhc3VyZW1lbnRzLmdldE5ldHdvcmtJbmZvKHRoaXMuaWNlU2VydmVycyxlKSx0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuUFJFQ0FMTF9URVNUX0JFR0lOLHRpbWVzdGFtcDpufSksdGhpcy5jb25uZWN0aW9uSW5mb1Byb21pc2UmJnRoaXMuY29ubmVjdGlvbkluZm9Qcm9taXNlLnRoZW4ocz0+e3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5QUkVDQUxMX1RFU1RfQ09NUExFVEUsbWV0YURhdGE6e2Nvbm5lY3Rpb25JbmZvOnN9LHRpbWVzdGFtcDpufSl9KX1zZW5kU2NyZWVuU2hhcmVUb2dnbGVFdmVudChlLG49bnVsbCxzKXt0aGlzLmN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMuc2NyZWVuPWUsdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDplP1MuU0NSRUVOU0hBUkVfU1RBUlRFRDpTLlNDUkVFTlNIQVJFX1NUT1BQRUQsbWV0YURhdGE6e3NzcmM6bn0sdGltZXN0YW1wOnN9KX1zZW5kU2NyZWVuU2hhcmVSZXF1ZXN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuU0NSRUVOU0hBUkVfU1RBUlRfUkVRVUVTVEVELHRpbWVzdGFtcDplfSl9c2VuZEFjdGl2ZVNwZWFrZXJFdmVudChlLG4pe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5ET01JTkFOVF9TUEVBS0VSLG1ldGFEYXRhOntwZWVySWQ6ZX0sdGltZXN0YW1wOm59KX1kZXZpY2VzKGUsbixzKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OmU9PT1KLkFVRElPJiZTLkFVRElPX0RFVklDRVNfVVBEQVRFU3x8ZT09PUouVklERU8mJlMuVklERU9fREVWSUNFU19VUERBVEVTfHxlPT09Si5TUEVBS0VSJiZTLlNQRUFLRVJfREVWSUNFU19VUERBVEVTLG1ldGFEYXRhOntkZXZpY2VMaXN0Om59LHRpbWVzdGFtcDpzfSl9c2VsZWN0ZWREZXZpY2UoZSxuLHMpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6ZT09PUouQVVESU8mJlMuU0VMRUNURURfTUlDUk9IUE9ORV9VUERBVEV8fGU9PT1KLlZJREVPJiZTLlNFTEVDVEVEX0NBTUVSQV9VUERBVEV8fGU9PT1KLlNQRUFLRVImJlMuU0VMRUNURURfU1BFQUtFUl9VUERBVEUsbWV0YURhdGE6e2RldmljZTpufSx0aW1lc3RhbXA6c30pfW1lZGlhUGVybWlzc2lvbihlLG4scyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLk1FRElBX1BFUk1JU1NJT04sbWV0YURhdGE6e2RldmljZVR5cGU6ZSxwZXJtaXNzaW9uOm59LHRpbWVzdGFtcDpzfSl9bWVkaWFQbGF5YmFja0ZhaWxlZChlLG4pe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6ZT09PUouQVVESU8mJlMuQVVESU9fUExBWV9GQUlMRUR8fGU9PT1KLlZJREVPJiZTLlZJREVPX1BMQVlfRkFJTEVELG1ldGFEYXRhOntkZXZpY2VUeXBlOmV9LHRpbWVzdGFtcDpufSl9bWVkaWFUcmFja011dGVkKGUsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDplPT09Si5BVURJTyYmUy5BVURJT19UUkFDS19NVVRFRHx8ZT09PUouVklERU8mJlMuVklERU9fVFJBQ0tfTVVURUQsbWV0YURhdGE6e2RldmljZVR5cGU6ZX0sdGltZXN0YW1wOm59KX10YWJDaGFuZ2VkKGUsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlRBQl9DSEFOR0UsbWV0YURhdGE6e2lzTWVldGluZ3NUYWJBY3RpdmU6ZX0sdGltZXN0YW1wOm59KX1icm93c2VyQmFja2dyb3VuZGVkKGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5CUk9XU0VSX0JBQ0tHUk9VTkRFRCx0aW1lc3RhbXA6ZX0pfWJyb3dzZXJGb3JlZ3JvdW5kZWQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkJST1dTRVJfRk9SRUdST1VOREVELHRpbWVzdGFtcDplfSl9bGVnYWN5U3dpdGNoKGUsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkxFR0FDWV9TV0lUQ0gsbWV0YWRhdGE6e29uOmV9LHRpbWVzdGFtcDpufSl9Z2V0UHJlQ2FsbFRlc3RSZXN1bHRzKCl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLmNvbm5lY3Rpb25JbmZvUHJvbWlzZX0pfXNlbmRDYWxsSm9pbkJlZ2luRXZlbnQoZSxuKXtlPW90KFEoe30sZSkse21lZXRpbmdFbnY6dGhpcy5lbnZ9KSxlLmRldmljZUluZm89b3QoUSh7fSxlLmRldmljZUluZm8pLHt1c2VyQWdlbnQ6bmF2aWdhdG9yLnVzZXJBZ2VudCxjcHVzOm5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5LG1lbW9yeTpuYXZpZ2F0b3IuZGV2aWNlTWVtb3J5fSksdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkNBTExfSk9JTl9CRUdJTixtZXRhRGF0YTp7cGVlck1ldGFEYXRhOmV9LHRpbWVzdGFtcDpufSl9c2VuZE5ldHdvcmtRdWFsaXR5VGVzdEJlZ2luRXZlbnQoZSxuKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuTkVUX1FVQUxJVFlfVEVTVF9CRUdJTix0aW1lc3RhbXA6bn0pLG5ldyBQcm9taXNlKChpLGEpPT53KHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBkPVtdO3RyeXtmb3IoY29uc3QgbyBvZiBlKXRyeXtpZihvLmljZVNlcnZlcnMmJm8uaWNlU2VydmVycy5sZW5ndGg+MCl7Y29uc3QgbD15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXROZXR3b3JrUXVhbGl0eShvLmljZVNlcnZlcnMpO2QucHVzaChvdChRKHt9LG8pLHtuZXR3b3JrUmVzdWx0czpsfSkpfX1jYXRjaChsKXtjb25zb2xlLndhcm4oIkVycm9yIGhhbmRsaW5nICIsbCl9aSh7cmVnaW9uRGF0YTpkfSl9Y2F0Y2gobyl7Y29uc29sZS53YXJuKCJFcnJvciBpbiBjYWxsc3RhdHMsICIsbyksYShvKX19KSkudGhlbihpPT57dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLk5FVF9RVUFMSVRZX1RFU1RfRU5ELHRpbWVzdGFtcDpuLG1ldGFEYXRhOml9KX0pfXNlbmRXZWJTb2NrZXRDb25uZWN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuV0VCU09DS0VUX0NPTk5FQ1RFRCx0aW1lc3RhbXA6ZX0pfXNlbmRUcmFuc3BvcnRDb25uZWN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuVFJBTlNQT1JUX0NPTk5FQ1RFRCx0aW1lc3RhbXA6ZX0pfXNlbmRBdWRpb1RvZ2dsZUV2ZW50KGUsbil7dGhpcy5jdXJyZW50VXNlck1lZGlhU3RhdGVzLmF1ZGlvPWU7bGV0IHM7ZT9zPVMuQVVESU9fT046cz1TLkFVRElPX09GRix0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OnMsdGltZXN0YW1wOm59KX1zZW5kVmlkZW9Ub2dnbGVFdmVudChlLG4pe3RoaXMuY3VycmVudFVzZXJNZWRpYVN0YXRlcy52aWRlbz1lO2xldCBzO2U/cz1TLlZJREVPX09OOnM9Uy5WSURFT19PRkYsdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpzLHRpbWVzdGFtcDpufSl9c2VuZFBhcnRpY2lwYW50Um9sZVRvZ2dsZUV2ZW50KGUsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlBBUlRJQ0lQQU5UX1JPTEUsdGltZXN0YW1wOm4sbWV0YURhdGE6ZX0pfXN0YXJ0UGluZ1N0YXRzKGU9N2UzKXt0aGlzLnNlbmRQaW5nU3RhdHNFdmVudCghMSxuZXcgRGF0ZSksdGhpcy5waW5nU3RhdHNUaW1lb3V0PXNldEludGVydmFsKHRoaXMuc2VuZFBpbmdTdGF0c0V2ZW50LmJpbmQodGhpcyksZSl9c3RvcFBpbmdTdGF0cygpe2NsZWFySW50ZXJ2YWwodGhpcy5waW5nU3RhdHNUaW1lb3V0KX1zZW5kUGluZ1N0YXRzRXZlbnQoZT0hMCxuKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIGQsbztsZXQgcyxpO2lmKHRoaXMucHJvZHVjaW5nVHJhbnNwb3J0JiYocz15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXRQcm9jZXNzZWRTdGF0cyh0aGlzLnByb2R1Y2luZ1RyYW5zcG9ydCwhMSwhMCksIXN8fCEoKGQ9cz09bnVsbD92b2lkIDA6cy5wcm9kdWNlclJlcG9ydCkhPW51bGwmJmQubGVuZ3RoKSkpe3RoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnNlbmRQaW5nU3RhdHNFdmVudDo6c3RhbGVQcm9kdWNpbmdUcmFuc3BvcnQiLHtkaXNjbGFpbWVyOiJTdGFsZSBwcm9kdWNlcj8gUmVnZW5lcmF0aW5nIFN0cmVhbSBNYXBzISJ9KTtjb25zdCBsPXlpZWxkIHRoaXMubWVhc3VyZW1lbnRzLmdldFByb2R1Y2Vyc1JlcG9ydChbLi4udGhpcy5wcm9kdWNlcnMudmFsdWVzKCldKTtzJiZsP3MucHJvZHVjZXJSZXBvcnQ9bDoocz15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXRQcm9jZXNzZWRTdGF0cyh0aGlzLnByb2R1Y2luZ1RyYW5zcG9ydCwhMSwhMCksKCFzfHwhKHMhPW51bGwmJnMucHJvZHVjZXJSZXBvcnQpKSYmdGhpcy5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6c2VuZFBpbmdTdGF0c0V2ZW50Ojpub1Byb2R1Y2luZ1RyYW5zcG9ydFJlcG9ydCIse2Rpc2NsYWltZXI6IlN0cmVhbSBtYXBzIGludmFsaWQgZGVzcGl0ZSByZWdlbmVyYXRpbmchIn0pKX1pZih0aGlzLmNvbnN1bWluZ1RyYW5zcG9ydCYmKGk9eWllbGQgdGhpcy5tZWFzdXJlbWVudHMuZ2V0UHJvY2Vzc2VkU3RhdHModGhpcy5jb25zdW1pbmdUcmFuc3BvcnQsITAsITEpLCFpfHwhKChvPWkuY29uc3VtZXJSZXBvcnQpIT1udWxsJiZvLmxlbmd0aCkpKXt0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpzZW5kUGluZ1N0YXRzRXZlbnQ6OnN0YWxlQ29uc3VtaW5nVHJhbnNwb3J0Iix7ZGlzY2xhaW1lcjoiU3RhbGUgY29uc3VtZXI/IFJlZ2VuZXJhdGluZyBTdHJlYW0gTWFwcyEifSk7Y29uc3QgbD15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXRDb25zdW1lcnNSZXBvcnQoWy4uLnRoaXMuY29uc3VtZXJzLnZhbHVlcygpXSk7aSYmbD9pLmNvbnN1bWVyUmVwb3J0PWw6KGk9eWllbGQgdGhpcy5tZWFzdXJlbWVudHMuZ2V0UHJvY2Vzc2VkU3RhdHModGhpcy5jb25zdW1pbmdUcmFuc3BvcnQsITAsITEpLCghaXx8IWkuY29uc3VtZXJSZXBvcnQpJiZ0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpzZW5kUGluZ1N0YXRzRXZlbnQ6Om5vQ29uc3VtaW5nVHJhbnNwb3J0UmVwb3J0Iix7ZGlzY2xhaW1lcjoiU3RyZWFtIG1hcHMgaW52YWxpZCBkZXNwaXRlIHJlZ2VuZXJhdGluZyEifSkpfWNvbnN0IGE9e3Byb2R1Y2luZ1RyYW5zcG9ydFN0YXRzOnM/cz09bnVsbD92b2lkIDA6cy50cmFuc3BvcnRSZXBvcnQ6dm9pZCAwLGNvbnN1bWluZ1RyYW5zcG9ydFN0YXRzOmk/aT09bnVsbD92b2lkIDA6aS50cmFuc3BvcnRSZXBvcnQ6dm9pZCAwLHByb2R1Y2VyU3RhdHM6W10uY29uY2F0KChzPT1udWxsP3ZvaWQgMDpzLnByb2R1Y2VyUmVwb3J0KXx8W10pLmNvbmNhdCgoaT09bnVsbD92b2lkIDA6aS5wcm9kdWNlclJlcG9ydCl8fFtdKSxjb25zdW1lclN0YXRzOltdLmNvbmNhdCgoaT09bnVsbD92b2lkIDA6aS5jb25zdW1lclJlcG9ydCl8fFtdKS5jb25jYXQoKHM9PW51bGw/dm9pZCAwOnMuY29uc3VtZXJSZXBvcnQpfHxbXSl9O2lmKGUmJmEucHJvZHVjZXJTdGF0cy5sZW5ndGg9PT0wJiZhLmNvbnN1bWVyU3RhdHMubGVuZ3RoPT09MCl7eWllbGQgdGhpcy5ldmVudEhhbmRsZXIuZmx1c2goKTtyZXR1cm59dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlBJTkdfU1RBVCxtZXRhRGF0YTphLHRpbWVzdGFtcDpufSl9KX1zZW5kSVZTUGxheWVyUmVidWZmZXJFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9SRUJVRkZFUklORyx0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJBdWRpb0Jsb2NrRXZlbnQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfQVVESU9fQkxPQ0tFRCx0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJQbGF5YmFja0Jsb2NrZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9QTEFZQkFDS19CTE9DS0VELHRpbWVzdGFtcDplfSl9c2VuZElWU1BsYXllck5ldHdvcmtVbmF2YWlsYWJsZUV2ZW50KGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5JVlNfUExBWUVSX05FVFdPUktfVU5BVkFJTEFCTEUsdGltZXN0YW1wOmV9KX1zZW5kSVZTUGxheWVySW5pdGlhbGl6ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9JTklUSUFMSVpFRCx0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJXb3JrZXJFcnJvckV2ZW50KGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5JVlNfUExBWUVSX1dPUktFUl9FUlJPUix0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJFcnJvckV2ZW50KGUsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfRVJST1IsdGltZXN0YW1wOm4sbWV0YURhdGE6ZX0pfXNlbmRJVlNQbGF5ZXJSZWNvdmVyYWJsZUVycm9yRXZlbnQoZSxuKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9SRUNPVkVSQUJMRV9FUlJPUix0aW1lc3RhbXA6bixtZXRhRGF0YTplfSl9c2VuZElWU1BsYXllckFuYWx5dGljc0V2ZW50KGUsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfQU5BTFlUSUNTX0VWRU5ULHRpbWVzdGFtcDpuLG1ldGFEYXRhOmV9KX1zZW5kSVZTUGxheWVyUGxheWJhY2tSYXRlQ2hhbmdlZEV2ZW50KGUsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfUExBWUJBQ0tfUkFURV9DSEFOR0VELHRpbWVzdGFtcDpuLG1ldGFEYXRhOnt1cGRhdGVkUGxheWJhY2tSYXRlOmV9fSl9c2VuZElWU1BsYXllclF1YWxpdHlDaGFuZ2VkKGUsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfUVVBTElUWV9DSEFOR0VELHRpbWVzdGFtcDpuLG1ldGFEYXRhOmV9KX1zZW5kUGxheWVyTGl2ZUxhdGVuY3koZSxuKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuTElWRVNUUkVBTV9MQVRFTkNZLHRpbWVzdGFtcDpuLG1ldGFEYXRhOntsYXRlbmN5OmV9fSl9c2VuZERpc2Nvbm5lY3RFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuRElTQ09OTkVDVCx0aW1lc3RhbXA6ZX0pfXNlbmRSZWNvbm5lY3RFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuUkVDT05ORUNUX0FUVEVNUFQsdGltZXN0YW1wOmV9KX1leHBlY3RlZFZpZGVvUmVzb2x1dGlvbihlLG4scyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkVYUEVDVEVEX1ZJREVPX1JFU09MVVRJT04sdGltZXN0YW1wOnMsbWV0YURhdGE6e2ZyYW1lV2lkdGg6ZSxmcmFtZUhlaWdodDpufX0pfWV4cGVjdGVkU2NyZWVuc2hhcmVSZXNvbHV0aW9uKGUsbixzKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuRVhQRUNURURfU0NSRUVOU0hBUkVfUkVTT0xVVElPTix0aW1lc3RhbXA6cyxtZXRhRGF0YTp7ZnJhbWVXaWR0aDplLGZyYW1lSGVpZ2h0Om59fSl9fTtSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInJlZ2lzdGVySWNlU2VydmVycyIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJyZWdpc3RlckNvbnN1bWVyIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInJlZ2lzdGVyUHJvZHVjZXIiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZENvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZUV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInJlZ2lzdGVyUHJvZHVjaW5nVHJhbnNwb3J0IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInJlZ2lzdGVyQ29uc3VtaW5nVHJhbnNwb3J0IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsImRlUmVnaXN0ZXJDb25zdW1lciIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJkZVJlZ2lzdGVyUHJvZHVjZXIiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwiZGlzY29ubmVjdENvbnN1bWluZ1RyYW5zcG9ydCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJkaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRQcmVDYWxsVGVzdEJlZ2luRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZFNjcmVlblNoYXJlVG9nZ2xlRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZFNjcmVlblNoYXJlUmVxdWVzdGVkRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZEFjdGl2ZVNwZWFrZXJFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJkZXZpY2VzIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbGVjdGVkRGV2aWNlIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsIm1lZGlhUGVybWlzc2lvbiIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJtZWRpYVBsYXliYWNrRmFpbGVkIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsIm1lZGlhVHJhY2tNdXRlZCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJ0YWJDaGFuZ2VkIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsImJyb3dzZXJCYWNrZ3JvdW5kZWQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwiYnJvd3NlckZvcmVncm91bmRlZCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJsZWdhY3lTd2l0Y2giLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwiZ2V0UHJlQ2FsbFRlc3RSZXN1bHRzIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRDYWxsSm9pbkJlZ2luRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZE5ldHdvcmtRdWFsaXR5VGVzdEJlZ2luRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZFdlYlNvY2tldENvbm5lY3RlZEV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRUcmFuc3BvcnRDb25uZWN0ZWRFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kQXVkaW9Ub2dnbGVFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kVmlkZW9Ub2dnbGVFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kUGFydGljaXBhbnRSb2xlVG9nZ2xlRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic3RhcnRQaW5nU3RhdHMiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic3RvcFBpbmdTdGF0cyIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kUGluZ1N0YXRzRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZElWU1BsYXllclJlYnVmZmVyRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZElWU1BsYXllckF1ZGlvQmxvY2tFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kSVZTUGxheWVyUGxheWJhY2tCbG9ja2VkRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZElWU1BsYXllck5ldHdvcmtVbmF2YWlsYWJsZUV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJJbml0aWFsaXplZEV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJXb3JrZXJFcnJvckV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJFcnJvckV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJSZWNvdmVyYWJsZUVycm9yRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZElWU1BsYXllckFuYWx5dGljc0V2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJQbGF5YmFja1JhdGVDaGFuZ2VkRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZElWU1BsYXllclF1YWxpdHlDaGFuZ2VkIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRQbGF5ZXJMaXZlTGF0ZW5jeSIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kRGlzY29ubmVjdEV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRSZWNvbm5lY3RFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJleHBlY3RlZFZpZGVvUmVzb2x1dGlvbiIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJleHBlY3RlZFNjcmVlbnNoYXJlUmVzb2x1dGlvbiIsbnVsbCksXz1SKFtBcyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8pO3ZhciBNcz1fO2NsYXNzIEZyIGV4dGVuZHMgcXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7cCh0aGlzLCJzdGF0cyIpO3AodGhpcywicGVlcklkIik7cCh0aGlzLCJiYWNrZW5kIik7cCh0aGlzLCJpY2VTZXJ2ZXJzIik7cCh0aGlzLCJpbml0aWFsaXplZCIsITEpO3AodGhpcywic3RhbGxlZCIsITEpO3AodGhpcywiaXBJbmZvcm1hdGlvbiIpO3AodGhpcywibG9nZ2VyIil9aW5pdGlhbGl6ZSh2KXtyZXR1cm4gdyh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbiooe3BlZXJJZDplLGVuZ2luZU5hbWU6bixlbnY6cz1nci5QUk9ELGljZVNlcnZlcnM6aSxhcGlCYXNlOmE9Imh0dHBzOi8vYXBpLmNsdXN0ZXIuZHl0ZS5pbiIsZmxhZ3M6ZCxsb2dnZXI6bz1jb25zb2xlLGFwaUhvc3RuYW1lczpsLHNraXBDb25uZWN0aXZpdHlDaGVja3M6bT0hMX0pe3ZhciBFLEkseDt0cnl7dGhpcy5wZWVySWQ9ZSx0aGlzLmxvZ2dlcj1vLHRoaXMuaXBJbmZvcm1hdGlvbj15aWVsZCBNci5nZXRJUERldGFpbHMoe3BlZXJJZDplLGFwaUhvc3RuYW1lczpsLGxvZ2dlcjpvfSksdGhpcy5iYWNrZW5kPW5ldyBNcyhhLG4scyxkLG8sZSxsKSx0aGlzLmljZVNlcnZlcnM9aSwoRT10aGlzLmJhY2tlbmQpPT1udWxsfHxFLnJlZ2lzdGVySWNlU2VydmVycyh0aGlzLmljZVNlcnZlcnMpLHRoaXMuaW5pdGlhbGl6ZWQ9ITAsKHg9KEk9dGhpcy5iYWNrZW5kKT09bnVsbD92b2lkIDA6SS5ldmVudEhhbmRsZXIpPT1udWxsfHx4LmVtaXQoImluaXRpYWxpemVkIix0aGlzLmlwSW5mb3JtYXRpb24pLHRoaXMuZW1pdCgiaW5pdGlhbGl6ZWQiLHRoaXMuaXBJbmZvcm1hdGlvbiksdGhpcy5zdGFydFByZUNhbGxUZXN0KG0pfWNhdGNoKCQpe3RoaXMubG9nZ2VyLmVycm9yKCJjYWxsU3RhdHM6OkNhbGxTdGF0c0ludGVncmF0aW9uOiAiLHtlcnJvcjokfSksdGhpcy5zdGFsbENhbGxTdGF0cygpfX0pfWNvbmZpZ3VyZVNlbmRUcmFuc3BvcnQoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4ucmVnaXN0ZXJQcm9kdWNpbmdUcmFuc3BvcnQoZSl9KX1jb25maWd1cmVSZWN2VHJhbnNwb3J0KGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnJlZ2lzdGVyQ29uc3VtaW5nVHJhbnNwb3J0KGUpfSl9Y2FuZGlkYXRlUmVnaW9uYWxOZXR3b3JrUXVhbGl0eVRlc3QoZSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IG49bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzO3RyeXsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLnNlbmROZXR3b3JrUXVhbGl0eVRlc3RCZWdpbkV2ZW50KGUsbil9Y2F0Y2goaSl7dGhpcy5sb2dnZXIuZXJyb3IoImNhbGxTdGF0czo6c2VuZE5ldHdvcmtRdWFsaXR5VGVzdEJlZ2luRXZlbnQiLHtlcnJvcjp7cmVhc29uOmkucmVhc29ufX0pfX0pfSl9cm9vbUpvaW5lZChlKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgbj1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHMsaTsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLnNlbmRDYWxsSm9pbkJlZ2luRXZlbnQoZSxuKSx0aGlzLmJhY2tlbmQsKGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5zdGFydFBpbmdTdGF0cygpfSl9KX1hdWRpb09mZigpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uc2VuZEF1ZGlvVG9nZ2xlRXZlbnQoITEsZSl9KX1hdWRpb09uKCl7Y29uc3QgZT1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kQXVkaW9Ub2dnbGVFdmVudCghMCxlKX0pfXZpZGVvT2ZmKCl7Y29uc3QgZT1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kVmlkZW9Ub2dnbGVFdmVudCghMSxlKX0pfXZpZGVvT24oKXtjb25zdCBlPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmRWaWRlb1RvZ2dsZUV2ZW50KCEwLGUpfSl9Y2FsbEVuZGVkKCl7Y29uc3QgZT1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG4sczsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnN0b3BQaW5nU3RhdHMoKSwocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLnNlbmREaXNjb25uZWN0RXZlbnQoZSl9KX1zY3JlZW5TaGFyZVN0YXJ0KGUpe2NvbnN0IG49bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuc2VuZFNjcmVlblNoYXJlVG9nZ2xlRXZlbnQoITAsZSxuKX0pfWNvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZShlLG4pe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLnNlbmRDb25zdW1lclNoYXJlZE1lZGlhU3RhdGVFdmVudChlLG4pfSl9c2NyZWVuU2hhcmVTdG9wKGUpe2NvbnN0IG49bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuc2VuZFNjcmVlblNoYXJlVG9nZ2xlRXZlbnQoITEsZSxuKX0pfXNjcmVlblNoYXJlUmVxdWVzdGVkKCl7Y29uc3QgZT1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kU2NyZWVuU2hhcmVSZXF1ZXN0ZWRFdmVudChlKX0pfWFjdGl2ZVNwZWFrZXIoZSl7aWYoZSE9PXRoaXMucGVlcklkKXJldHVybjtjb25zdCBuPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLnNlbmRBY3RpdmVTcGVha2VyRXZlbnQoZSxuKX0pfWRldmljZXMoZSxuKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgaTsoaT10aGlzLmJhY2tlbmQpPT1udWxsfHxpLmRldmljZXMoZSxuLHMpfSl9c2VsZWN0ZWREZXZpY2UoZSxuKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgaTsoaT10aGlzLmJhY2tlbmQpPT1udWxsfHxpLnNlbGVjdGVkRGV2aWNlKGUsbixzKX0pfW1lZGlhUGVybWlzc2lvbihlLG4pe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBpOyhpPXRoaXMuYmFja2VuZCk9PW51bGx8fGkubWVkaWFQZXJtaXNzaW9uKGUsbixzKX0pfW1lZGlhUGxheWJhY2tGYWlsZWQoZSl7Y29uc3Qgbj1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5tZWRpYVBsYXliYWNrRmFpbGVkKGUsbil9KX1tZWRpYVRyYWNrTXV0ZWQoZSl7Y29uc3Qgbj1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5tZWRpYVRyYWNrTXV0ZWQoZSxuKX0pfXRhYkNoYW5nZWQoZT0hMSl7Y29uc3Qgbj1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy50YWJDaGFuZ2VkKGUsbil9KX1icm93c2VyQmFja2dyb3VuZGVkKCl7Y29uc3QgZT1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5icm93c2VyQmFja2dyb3VuZGVkKGUpfSl9YnJvd3NlckZvcmVncm91bmRlZCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uYnJvd3NlckZvcmVncm91bmRlZChlKX0pfWxlZ2FjeVN3aXRjaChlKXtjb25zdCBuPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLmxlZ2FjeVN3aXRjaChlLG4pfSl9c3RhcnRQcmVDYWxsVGVzdChlPSExKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgbj1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5zZW5kUHJlQ2FsbFRlc3RCZWdpbkV2ZW50KGUsbil9KX0pfW9uUHJlQ2FsbFRlc3RSZXN1bHRzKGUpe3JldHVybiB0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5ldmVudEhhbmRsZXIub25jZSgicHJlY2FsbF9lbmQiLGUpfSksZX1vblJlY2VpdmluZ0NvbnN1bWVyQXVkaW9TdGF0dXMoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uZXZlbnRIYW5kbGVyLm9uKCJjb25zdW1lcl9hdWRpb19zdGF0dXMiLGUpfSl9b25SZWNlaXZpbmdDb25zdW1lclZpZGVvU3RhdHVzKGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLmV2ZW50SGFuZGxlci5vbigiY29uc3VtZXJfdmlkZW9fc3RhdHVzIixlKX0pfW9uUmVjZWl2aW5nUHJvZHVjZXJBdWRpb1N0YXR1cyhlKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5ldmVudEhhbmRsZXIub24oInByb2R1Y2VyX2F1ZGlvX3N0YXR1cyIsZSl9KX1vblJlY2VpdmluZ1Byb2R1Y2VyVmlkZW9TdGF0dXMoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uZXZlbnRIYW5kbGVyLm9uKCJwcm9kdWNlcl92aWRlb19zdGF0dXMiLGUpfSl9b25SZWNlaXZpbmdQcm9kdWNpbmdUcmFuc3BvcnRTdGF0dXMoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uZXZlbnRIYW5kbGVyLm9uKCJwcm9kdWNpbmdfdHJhbnNwb3J0X3N0YXR1cyIsZSl9KX1vblJlY2VpdmluZ0NvbnN1bWluZ1RyYW5zcG9ydFN0YXR1cyhlKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5ldmVudEhhbmRsZXIub24oImNvbnN1bWluZ190cmFuc3BvcnRfc3RhdHVzIixlKX0pfW9uUHJvZHVjZXJTY29yZShlKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5ldmVudEhhbmRsZXIub24oInByb2R1Y2VyX3Njb3JlIixlKX0pfW9uQ29uc3VtZXJTY29yZShlKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5ldmVudEhhbmRsZXIub24oImNvbnN1bWVyX3Njb3JlIixlKX0pfW9uU2FmZUluaXRpYWxpemF0aW9uKGUpe2lmKHRoaXMuaW5pdGlhbGl6ZWQpZSh0aGlzLmlwSW5mb3JtYXRpb24sITEpO2Vsc2UgaWYoIXRoaXMuc3RhbGxlZCl7Y29uc3Qgbj1zPT57ZShzLCEwKX07cmV0dXJuIHRoaXMub25jZSgiaW5pdGlhbGl6ZWQiLG4pLG59cmV0dXJuKCk9Pnt9fXJlbW92ZUluaXRpYWxpemF0aW9uTGlzdGVuZXIoZSl7dGhpcy5yZW1vdmVMaXN0ZW5lcigiaW5pdGlhbGl6ZWQiLGUpfXN0YWxsQ2FsbFN0YXRzKCl7dGhpcy5zdGFsbGVkPSEwLHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCJpbml0aWFsaXplZCIpfWl2c1BsYXllckV2ZW50KGUsbil7Y29uc3Qgcz1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIGksYSxkLG8sbCxtLHYsRSxJLHgsJDtzd2l0Y2goZSl7Y2FzZSJQbGF5ZXJSZWJ1ZmZlcmluZyI6KGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5zZW5kSVZTUGxheWVyUmVidWZmZXJFdmVudChzKTticmVhaztjYXNlIlBsYXllckF1ZGlvQmxvY2tlZCI6KGE9dGhpcy5iYWNrZW5kKT09bnVsbHx8YS5zZW5kSVZTUGxheWVyQXVkaW9CbG9ja0V2ZW50KHMpO2JyZWFrO2Nhc2UiUGxheWVyUGxheWJhY2tCbG9ja2VkIjooZD10aGlzLmJhY2tlbmQpPT1udWxsfHxkLnNlbmRJVlNQbGF5ZXJQbGF5YmFja0Jsb2NrZWRFdmVudChzKTticmVhaztjYXNlIlBsYXllck5ldHdvcmtVbmF2YWlsYWJsZSI6KG89dGhpcy5iYWNrZW5kKT09bnVsbHx8by5zZW5kSVZTUGxheWVyTmV0d29ya1VuYXZhaWxhYmxlRXZlbnQocyk7YnJlYWs7Y2FzZSJQbGF5ZXJJbml0aWFsaXplZCI6KGw9dGhpcy5iYWNrZW5kKT09bnVsbHx8bC5zZW5kSVZTUGxheWVySW5pdGlhbGl6ZWRFdmVudChzKTticmVhaztjYXNlIlBsYXllcldvcmtlckVycm9yIjoobT10aGlzLmJhY2tlbmQpPT1udWxsfHxtLnNlbmRJVlNQbGF5ZXJXb3JrZXJFcnJvckV2ZW50KHMpO2JyZWFrO2Nhc2UiUGxheWVyRXJyb3IiOih2PXRoaXMuYmFja2VuZCk9PW51bGx8fHYuc2VuZElWU1BsYXllckVycm9yRXZlbnQobixzKTticmVhaztjYXNlIlBsYXllclJlY292ZXJhYmxlRXJyb3IiOihFPXRoaXMuYmFja2VuZCk9PW51bGx8fEUuc2VuZElWU1BsYXllclJlY292ZXJhYmxlRXJyb3JFdmVudChuLHMpO2JyZWFrO2Nhc2UiUGxheWVyQW5hbHl0aWNzRXZlbnQiOihJPXRoaXMuYmFja2VuZCk9PW51bGx8fEkuc2VuZElWU1BsYXllckFuYWx5dGljc0V2ZW50KG4scyk7YnJlYWs7Y2FzZSJQbGF5ZXJQbGF5YmFja1JhdGVDaGFuZ2VkIjooeD10aGlzLmJhY2tlbmQpPT1udWxsfHx4LnNlbmRJVlNQbGF5ZXJQbGF5YmFja1JhdGVDaGFuZ2VkRXZlbnQobixzKTticmVhaztjYXNlIlBsYXllclF1YWxpdHlDaGFuZ2VkIjooJD10aGlzLmJhY2tlbmQpPT1udWxsfHwkLnNlbmRJVlNQbGF5ZXJRdWFsaXR5Q2hhbmdlZChuLHMpO2JyZWFrfX0pfWxpdmVzdHJlYW1MYXRlbmN5KGUpe2NvbnN0IG49bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuc2VuZFBsYXllckxpdmVMYXRlbmN5KGUsbil9KX1leHBlY3RlZFZpZGVvUmVzb2x1dGlvbihlLG4pe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBpOyhpPXRoaXMuYmFja2VuZCk9PW51bGx8fGkuZXhwZWN0ZWRWaWRlb1Jlc29sdXRpb24oZSxuLHMpfSl9ZXhwZWN0ZWRTY3JlZW5zaGFyZVJlc29sdXRpb24oZSxuKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgaTsoaT10aGlzLmJhY2tlbmQpPT1udWxsfHxpLmV4cGVjdGVkU2NyZWVuc2hhcmVSZXNvbHV0aW9uKGUsbixzKX0pfX1uZXcgRnIoKS5zZXRNYXhMaXN0ZW5lcnMoMzApO2Z1bmN0aW9uIGtzKCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH1mdW5jdGlvbiBCcih0LHIpe3JldHVybiB0PT09cnx8dCE9PXQmJnIhPT1yfWZ1bmN0aW9uIGd0KHQscil7Zm9yKHZhciBlPXQubGVuZ3RoO2UtLTspaWYoQnIodFtlXVswXSxyKSlyZXR1cm4gZTtyZXR1cm4tMX12YXIgT3M9QXJyYXkucHJvdG90eXBlLExzPU9zLnNwbGljZTtmdW5jdGlvbiBEcyh0KXt2YXIgcj10aGlzLl9fZGF0YV9fLGU9Z3Qocix0KTtpZihlPDApcmV0dXJuITE7dmFyIG49ci5sZW5ndGgtMTtyZXR1cm4gZT09bj9yLnBvcCgpOkxzLmNhbGwocixlLDEpLC0tdGhpcy5zaXplLCEwfWZ1bmN0aW9uIE5zKHQpe3ZhciByPXRoaXMuX19kYXRhX18sZT1ndChyLHQpO3JldHVybiBlPDA/dm9pZCAwOnJbZV1bMV19ZnVuY3Rpb24gVnModCl7cmV0dXJuIGd0KHRoaXMuX19kYXRhX18sdCk+LTF9ZnVuY3Rpb24gRnModCxyKXt2YXIgZT10aGlzLl9fZGF0YV9fLG49Z3QoZSx0KTtyZXR1cm4gbjwwPygrK3RoaXMuc2l6ZSxlLnB1c2goW3Qscl0pKTplW25dWzFdPXIsdGhpc31mdW5jdGlvbiBuZSh0KXt2YXIgcj0tMSxlPXQ9PW51bGw/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrcjxlOyl7dmFyIG49dFtyXTt0aGlzLnNldChuWzBdLG5bMV0pfX1uZS5wcm90b3R5cGUuY2xlYXI9a3MsbmUucHJvdG90eXBlLmRlbGV0ZT1EcyxuZS5wcm90b3R5cGUuZ2V0PU5zLG5lLnByb3RvdHlwZS5oYXM9VnMsbmUucHJvdG90eXBlLnNldD1GcztmdW5jdGlvbiBCcygpe3RoaXMuX19kYXRhX189bmV3IG5lLHRoaXMuc2l6ZT0wfWZ1bmN0aW9uIHhzKHQpe3ZhciByPXRoaXMuX19kYXRhX18sZT1yLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplPXIuc2l6ZSxlfWZ1bmN0aW9uIGpzKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmdldCh0KX1mdW5jdGlvbiBVcyh0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModCl9dmFyICRzPXR5cGVvZiBnbG9iYWw9PSJvYmplY3QiJiZnbG9iYWwmJmdsb2JhbC5PYmplY3Q9PT1PYmplY3QmJmdsb2JhbCx4cj0kcyxIcz10eXBlb2Ygc2VsZj09Im9iamVjdCImJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLEtzPXhyfHxIc3x8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKSxYPUtzLFdzPVguU3ltYm9sLEVlPVdzLGpyPU9iamVjdC5wcm90b3R5cGUsenM9anIuaGFzT3duUHJvcGVydHksR3M9anIudG9TdHJpbmcsSWU9RWU/RWUudG9TdHJpbmdUYWc6dm9pZCAwO2Z1bmN0aW9uIHFzKHQpe3ZhciByPXpzLmNhbGwodCxJZSksZT10W0llXTt0cnl7dFtJZV09dm9pZCAwO3ZhciBuPSEwfWNhdGNoKGkpe312YXIgcz1Hcy5jYWxsKHQpO3JldHVybiBuJiYocj90W0llXT1lOmRlbGV0ZSB0W0llXSksc312YXIgWXM9T2JqZWN0LnByb3RvdHlwZSxRcz1Zcy50b1N0cmluZztmdW5jdGlvbiBKcyh0KXtyZXR1cm4gUXMuY2FsbCh0KX12YXIgWHM9IltvYmplY3QgTnVsbF0iLFpzPSJbb2JqZWN0IFVuZGVmaW5lZF0iLFVyPUVlP0VlLnRvU3RyaW5nVGFnOnZvaWQgMDtmdW5jdGlvbiBBZSh0KXtyZXR1cm4gdD09bnVsbD90PT09dm9pZCAwP1pzOlhzOlVyJiZVciBpbiBPYmplY3QodCk/cXModCk6SnModCl9ZnVuY3Rpb24gTWUodCl7dmFyIHI9dHlwZW9mIHQ7cmV0dXJuIHQhPW51bGwmJihyPT0ib2JqZWN0Inx8cj09ImZ1bmN0aW9uIil9dmFyIGVpPSJbb2JqZWN0IEFzeW5jRnVuY3Rpb25dIix0aT0iW29iamVjdCBGdW5jdGlvbl0iLHJpPSJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSIsbmk9IltvYmplY3QgUHJveHldIjtmdW5jdGlvbiAkcih0KXtpZighTWUodCkpcmV0dXJuITE7dmFyIHI9QWUodCk7cmV0dXJuIHI9PXRpfHxyPT1yaXx8cj09ZWl8fHI9PW5pfXZhciBzaT1YWyJfX2NvcmUtanNfc2hhcmVkX18iXSxPdD1zaSxIcj1mdW5jdGlvbigpe3ZhciB0PS9bXi5dKyQvLmV4ZWMoT3QmJk90LmtleXMmJk90LmtleXMuSUVfUFJPVE98fCIiKTtyZXR1cm4gdD8iU3ltYm9sKHNyYylfMS4iK3Q6IiJ9KCk7ZnVuY3Rpb24gaWkodCl7cmV0dXJuISFIciYmSHIgaW4gdH12YXIgYWk9RnVuY3Rpb24ucHJvdG90eXBlLG9pPWFpLnRvU3RyaW5nO2Z1bmN0aW9uIGxlKHQpe2lmKHQhPW51bGwpe3RyeXtyZXR1cm4gb2kuY2FsbCh0KX1jYXRjaChyKXt9dHJ5e3JldHVybiB0KyIifWNhdGNoKHIpe319cmV0dXJuIiJ9dmFyIGNpPS9bXFxeJC4qKz8oKVtcXXt9fF0vZyxkaT0vXlxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXF0kLyxsaT1GdW5jdGlvbi5wcm90b3R5cGUsdWk9T2JqZWN0LnByb3RvdHlwZSxwaT1saS50b1N0cmluZyxoaT11aS5oYXNPd25Qcm9wZXJ0eSxmaT1SZWdFeHAoIl4iK3BpLmNhbGwoaGkpLnJlcGxhY2UoY2ksIlxcJCYiKS5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcKCl8IGZvciAuKz8oPz1cXFxdKS9nLCIkMS4qPyIpKyIkIik7ZnVuY3Rpb24gbWkodCl7aWYoIU1lKHQpfHxpaSh0KSlyZXR1cm4hMTt2YXIgcj0kcih0KT9maTpkaTtyZXR1cm4gci50ZXN0KGxlKHQpKX1mdW5jdGlvbiBnaSh0LHIpe3JldHVybiB0PT1udWxsP3ZvaWQgMDp0W3JdfWZ1bmN0aW9uIHVlKHQscil7dmFyIGU9Z2kodCxyKTtyZXR1cm4gbWkoZSk/ZTp2b2lkIDB9dmFyIFNpPXVlKFgsIk1hcCIpLGtlPVNpLHZpPXVlKE9iamVjdCwiY3JlYXRlIiksT2U9dmk7ZnVuY3Rpb24geWkoKXt0aGlzLl9fZGF0YV9fPU9lP09lKG51bGwpOnt9LHRoaXMuc2l6ZT0wfWZ1bmN0aW9uIGJpKHQpe3ZhciByPXRoaXMuaGFzKHQpJiZkZWxldGUgdGhpcy5fX2RhdGFfX1t0XTtyZXR1cm4gdGhpcy5zaXplLT1yPzE6MCxyfXZhciBFaT0iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyIsX2k9T2JqZWN0LnByb3RvdHlwZSxUaT1faS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBSaSh0KXt2YXIgcj10aGlzLl9fZGF0YV9fO2lmKE9lKXt2YXIgZT1yW3RdO3JldHVybiBlPT09RWk/dm9pZCAwOmV9cmV0dXJuIFRpLmNhbGwocix0KT9yW3RdOnZvaWQgMH12YXIgUGk9T2JqZWN0LnByb3RvdHlwZSxDaT1QaS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiB3aSh0KXt2YXIgcj10aGlzLl9fZGF0YV9fO3JldHVybiBPZT9yW3RdIT09dm9pZCAwOkNpLmNhbGwocix0KX12YXIgSWk9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iO2Z1bmN0aW9uIEFpKHQscil7dmFyIGU9dGhpcy5fX2RhdGFfXztyZXR1cm4gdGhpcy5zaXplKz10aGlzLmhhcyh0KT8wOjEsZVt0XT1PZSYmcj09PXZvaWQgMD9JaTpyLHRoaXN9ZnVuY3Rpb24gcGUodCl7dmFyIHI9LTEsZT10PT1udWxsPzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK3I8ZTspe3ZhciBuPXRbcl07dGhpcy5zZXQoblswXSxuWzFdKX19cGUucHJvdG90eXBlLmNsZWFyPXlpLHBlLnByb3RvdHlwZS5kZWxldGU9YmkscGUucHJvdG90eXBlLmdldD1SaSxwZS5wcm90b3R5cGUuaGFzPXdpLHBlLnByb3RvdHlwZS5zZXQ9QWk7ZnVuY3Rpb24gTWkoKXt0aGlzLnNpemU9MCx0aGlzLl9fZGF0YV9fPXtoYXNoOm5ldyBwZSxtYXA6bmV3KGtlfHxuZSksc3RyaW5nOm5ldyBwZX19ZnVuY3Rpb24ga2kodCl7dmFyIHI9dHlwZW9mIHQ7cmV0dXJuIHI9PSJzdHJpbmcifHxyPT0ibnVtYmVyInx8cj09InN5bWJvbCJ8fHI9PSJib29sZWFuIj90IT09Il9fcHJvdG9fXyI6dD09PW51bGx9ZnVuY3Rpb24gU3QodCxyKXt2YXIgZT10Ll9fZGF0YV9fO3JldHVybiBraShyKT9lW3R5cGVvZiByPT0ic3RyaW5nIj8ic3RyaW5nIjoiaGFzaCJdOmUubWFwfWZ1bmN0aW9uIE9pKHQpe3ZhciByPVN0KHRoaXMsdCkuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemUtPXI/MTowLHJ9ZnVuY3Rpb24gTGkodCl7cmV0dXJuIFN0KHRoaXMsdCkuZ2V0KHQpfWZ1bmN0aW9uIERpKHQpe3JldHVybiBTdCh0aGlzLHQpLmhhcyh0KX1mdW5jdGlvbiBOaSh0LHIpe3ZhciBlPVN0KHRoaXMsdCksbj1lLnNpemU7cmV0dXJuIGUuc2V0KHQsciksdGhpcy5zaXplKz1lLnNpemU9PW4/MDoxLHRoaXN9ZnVuY3Rpb24gX2UodCl7dmFyIHI9LTEsZT10PT1udWxsPzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK3I8ZTspe3ZhciBuPXRbcl07dGhpcy5zZXQoblswXSxuWzFdKX19X2UucHJvdG90eXBlLmNsZWFyPU1pLF9lLnByb3RvdHlwZS5kZWxldGU9T2ksX2UucHJvdG90eXBlLmdldD1MaSxfZS5wcm90b3R5cGUuaGFzPURpLF9lLnByb3RvdHlwZS5zZXQ9Tmk7dmFyIFZpPTIwMDtmdW5jdGlvbiBGaSh0LHIpe3ZhciBlPXRoaXMuX19kYXRhX187aWYoZSBpbnN0YW5jZW9mIG5lKXt2YXIgbj1lLl9fZGF0YV9fO2lmKCFrZXx8bi5sZW5ndGg8VmktMSlyZXR1cm4gbi5wdXNoKFt0LHJdKSx0aGlzLnNpemU9KytlLnNpemUsdGhpcztlPXRoaXMuX19kYXRhX189bmV3IF9lKG4pfXJldHVybiBlLnNldCh0LHIpLHRoaXMuc2l6ZT1lLnNpemUsdGhpc31mdW5jdGlvbiBUZSh0KXt2YXIgcj10aGlzLl9fZGF0YV9fPW5ldyBuZSh0KTt0aGlzLnNpemU9ci5zaXplfVRlLnByb3RvdHlwZS5jbGVhcj1CcyxUZS5wcm90b3R5cGUuZGVsZXRlPXhzLFRlLnByb3RvdHlwZS5nZXQ9anMsVGUucHJvdG90eXBlLmhhcz1VcyxUZS5wcm90b3R5cGUuc2V0PUZpO2Z1bmN0aW9uIEJpKHQscil7Zm9yKHZhciBlPS0xLG49dD09bnVsbD8wOnQubGVuZ3RoOysrZTxuJiZyKHRbZV0sZSx0KSE9PSExOyk7cmV0dXJuIHR9dmFyIHhpPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PXVlKE9iamVjdCwiZGVmaW5lUHJvcGVydHkiKTtyZXR1cm4gdCh7fSwiIix7fSksdH1jYXRjaChyKXt9fSgpLEtyPXhpO2Z1bmN0aW9uIFdyKHQscixlKXtyPT0iX19wcm90b19fIiYmS3I/S3IodCxyLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTplLHdyaXRhYmxlOiEwfSk6dFtyXT1lfXZhciBqaT1PYmplY3QucHJvdG90eXBlLFVpPWppLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIHpyKHQscixlKXt2YXIgbj10W3JdOyghKFVpLmNhbGwodCxyKSYmQnIobixlKSl8fGU9PT12b2lkIDAmJiEociBpbiB0KSkmJldyKHQscixlKX1mdW5jdGlvbiB2dCh0LHIsZSxuKXt2YXIgcz0hZTtlfHwoZT17fSk7Zm9yKHZhciBpPS0xLGE9ci5sZW5ndGg7KytpPGE7KXt2YXIgZD1yW2ldLG89bj9uKGVbZF0sdFtkXSxkLGUsdCk6dm9pZCAwO289PT12b2lkIDAmJihvPXRbZF0pLHM/V3IoZSxkLG8pOnpyKGUsZCxvKX1yZXR1cm4gZX1mdW5jdGlvbiAkaSh0LHIpe2Zvcih2YXIgZT0tMSxuPUFycmF5KHQpOysrZTx0OyluW2VdPXIoZSk7cmV0dXJuIG59ZnVuY3Rpb24gTGUodCl7cmV0dXJuIHQhPW51bGwmJnR5cGVvZiB0PT0ib2JqZWN0In12YXIgSGk9IltvYmplY3QgQXJndW1lbnRzXSI7ZnVuY3Rpb24gR3IodCl7cmV0dXJuIExlKHQpJiZBZSh0KT09SGl9dmFyIHFyPU9iamVjdC5wcm90b3R5cGUsS2k9cXIuaGFzT3duUHJvcGVydHksV2k9cXIucHJvcGVydHlJc0VudW1lcmFibGUsemk9R3IoZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKT9HcjpmdW5jdGlvbih0KXtyZXR1cm4gTGUodCkmJktpLmNhbGwodCwiY2FsbGVlIikmJiFXaS5jYWxsKHQsImNhbGxlZSIpfSxZcj16aSxHaT1BcnJheS5pc0FycmF5LHl0PUdpO2Z1bmN0aW9uIHFpKCl7cmV0dXJuITF9dmFyIFFyPXR5cGVvZiBleHBvcnRzPT0ib2JqZWN0IiYmZXhwb3J0cyYmIWV4cG9ydHMubm9kZVR5cGUmJmV4cG9ydHMsSnI9UXImJnR5cGVvZiBtb2R1bGU9PSJvYmplY3QiJiZtb2R1bGUmJiFtb2R1bGUubm9kZVR5cGUmJm1vZHVsZSxZaT1KciYmSnIuZXhwb3J0cz09PVFyLFhyPVlpP1guQnVmZmVyOnZvaWQgMCxRaT1Ycj9Yci5pc0J1ZmZlcjp2b2lkIDAsSmk9UWl8fHFpLEx0PUppLFhpPTkwMDcxOTkyNTQ3NDA5OTEsWmk9L14oPzowfFsxLTldXGQqKSQvO2Z1bmN0aW9uIGVhKHQscil7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuIHI9cj09bnVsbD9YaTpyLCEhciYmKGU9PSJudW1iZXIifHxlIT0ic3ltYm9sIiYmWmkudGVzdCh0KSkmJnQ+LTEmJnQlMT09MCYmdDxyfXZhciB0YT05MDA3MTk5MjU0NzQwOTkxO2Z1bmN0aW9uIFpyKHQpe3JldHVybiB0eXBlb2YgdD09Im51bWJlciImJnQ+LTEmJnQlMT09MCYmdDw9dGF9dmFyIHJhPSJbb2JqZWN0IEFyZ3VtZW50c10iLG5hPSJbb2JqZWN0IEFycmF5XSIsc2E9IltvYmplY3QgQm9vbGVhbl0iLGlhPSJbb2JqZWN0IERhdGVdIixhYT0iW29iamVjdCBFcnJvcl0iLG9hPSJbb2JqZWN0IEZ1bmN0aW9uXSIsY2E9IltvYmplY3QgTWFwXSIsZGE9IltvYmplY3QgTnVtYmVyXSIsbGE9IltvYmplY3QgT2JqZWN0XSIsdWE9IltvYmplY3QgUmVnRXhwXSIscGE9IltvYmplY3QgU2V0XSIsaGE9IltvYmplY3QgU3RyaW5nXSIsZmE9IltvYmplY3QgV2Vha01hcF0iLG1hPSJbb2JqZWN0IEFycmF5QnVmZmVyXSIsZ2E9IltvYmplY3QgRGF0YVZpZXddIixTYT0iW29iamVjdCBGbG9hdDMyQXJyYXldIix2YT0iW29iamVjdCBGbG9hdDY0QXJyYXldIix5YT0iW29iamVjdCBJbnQ4QXJyYXldIixiYT0iW29iamVjdCBJbnQxNkFycmF5XSIsRWE9IltvYmplY3QgSW50MzJBcnJheV0iLF9hPSJbb2JqZWN0IFVpbnQ4QXJyYXldIixUYT0iW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iLFJhPSJbb2JqZWN0IFVpbnQxNkFycmF5XSIsUGE9IltvYmplY3QgVWludDMyQXJyYXldIixCPXt9O0JbU2FdPUJbdmFdPUJbeWFdPUJbYmFdPUJbRWFdPUJbX2FdPUJbVGFdPUJbUmFdPUJbUGFdPSEwLEJbcmFdPUJbbmFdPUJbbWFdPUJbc2FdPUJbZ2FdPUJbaWFdPUJbYWFdPUJbb2FdPUJbY2FdPUJbZGFdPUJbbGFdPUJbdWFdPUJbcGFdPUJbaGFdPUJbZmFdPSExO2Z1bmN0aW9uIENhKHQpe3JldHVybiBMZSh0KSYmWnIodC5sZW5ndGgpJiYhIUJbQWUodCldfWZ1bmN0aW9uIER0KHQpe3JldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gdChyKX19dmFyIGVuPXR5cGVvZiBleHBvcnRzPT0ib2JqZWN0IiYmZXhwb3J0cyYmIWV4cG9ydHMubm9kZVR5cGUmJmV4cG9ydHMsRGU9ZW4mJnR5cGVvZiBtb2R1bGU9PSJvYmplY3QiJiZtb2R1bGUmJiFtb2R1bGUubm9kZVR5cGUmJm1vZHVsZSx3YT1EZSYmRGUuZXhwb3J0cz09PWVuLE50PXdhJiZ4ci5wcm9jZXNzLElhPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PURlJiZEZS5yZXF1aXJlJiZEZS5yZXF1aXJlKCJ1dGlsIikudHlwZXM7cmV0dXJuIHR8fE50JiZOdC5iaW5kaW5nJiZOdC5iaW5kaW5nKCJ1dGlsIil9Y2F0Y2gocil7fX0oKSxSZT1JYSx0bj1SZSYmUmUuaXNUeXBlZEFycmF5LEFhPXRuP0R0KHRuKTpDYSxybj1BYSxNYT1PYmplY3QucHJvdG90eXBlLGthPU1hLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIG5uKHQscil7dmFyIGU9eXQodCksbj0hZSYmWXIodCkscz0hZSYmIW4mJkx0KHQpLGk9IWUmJiFuJiYhcyYmcm4odCksYT1lfHxufHxzfHxpLGQ9YT8kaSh0Lmxlbmd0aCxTdHJpbmcpOltdLG89ZC5sZW5ndGg7Zm9yKHZhciBsIGluIHQpKHJ8fGthLmNhbGwodCxsKSkmJiEoYSYmKGw9PSJsZW5ndGgifHxzJiYobD09Im9mZnNldCJ8fGw9PSJwYXJlbnQiKXx8aSYmKGw9PSJidWZmZXIifHxsPT0iYnl0ZUxlbmd0aCJ8fGw9PSJieXRlT2Zmc2V0Iil8fGVhKGwsbykpKSYmZC5wdXNoKGwpO3JldHVybiBkfXZhciBPYT1PYmplY3QucHJvdG90eXBlO2Z1bmN0aW9uIGJ0KHQpe3ZhciByPXQmJnQuY29uc3RydWN0b3IsZT10eXBlb2Ygcj09ImZ1bmN0aW9uIiYmci5wcm90b3R5cGV8fE9hO3JldHVybiB0PT09ZX1mdW5jdGlvbiBzbih0LHIpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdChyKGUpKX19dmFyIExhPXNuKE9iamVjdC5rZXlzLE9iamVjdCksRGE9TGEsTmE9T2JqZWN0LnByb3RvdHlwZSxWYT1OYS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBhbih0KXtpZighYnQodCkpcmV0dXJuIERhKHQpO3ZhciByPVtdO2Zvcih2YXIgZSBpbiBPYmplY3QodCkpVmEuY2FsbCh0LGUpJiZlIT0iY29uc3RydWN0b3IiJiZyLnB1c2goZSk7cmV0dXJuIHJ9ZnVuY3Rpb24gVnQodCl7cmV0dXJuIHQhPW51bGwmJlpyKHQubGVuZ3RoKSYmISRyKHQpfWZ1bmN0aW9uIEZ0KHQpe3JldHVybiBWdCh0KT9ubih0KTphbih0KX1mdW5jdGlvbiBGYSh0LHIpe3JldHVybiB0JiZ2dChyLEZ0KHIpLHQpfWZ1bmN0aW9uIEJhKHQpe3ZhciByPVtdO2lmKHQhPW51bGwpZm9yKHZhciBlIGluIE9iamVjdCh0KSlyLnB1c2goZSk7cmV0dXJuIHJ9dmFyIHhhPU9iamVjdC5wcm90b3R5cGUsamE9eGEuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gVWEodCl7aWYoIU1lKHQpKXJldHVybiBCYSh0KTt2YXIgcj1idCh0KSxlPVtdO2Zvcih2YXIgbiBpbiB0KW49PSJjb25zdHJ1Y3RvciImJihyfHwhamEuY2FsbCh0LG4pKXx8ZS5wdXNoKG4pO3JldHVybiBlfWZ1bmN0aW9uIEJ0KHQpe3JldHVybiBWdCh0KT9ubih0LCEwKTpVYSh0KX1mdW5jdGlvbiAkYSh0LHIpe3JldHVybiB0JiZ2dChyLEJ0KHIpLHQpfXZhciBvbj10eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzLGNuPW9uJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IiYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGUsSGE9Y24mJmNuLmV4cG9ydHM9PT1vbixkbj1IYT9YLkJ1ZmZlcjp2b2lkIDAsbG49ZG4/ZG4uYWxsb2NVbnNhZmU6dm9pZCAwO2Z1bmN0aW9uIEthKHQscil7aWYocilyZXR1cm4gdC5zbGljZSgpO3ZhciBlPXQubGVuZ3RoLG49bG4/bG4oZSk6bmV3IHQuY29uc3RydWN0b3IoZSk7cmV0dXJuIHQuY29weShuKSxufWZ1bmN0aW9uIFdhKHQscil7dmFyIGU9LTEsbj10Lmxlbmd0aDtmb3Iocnx8KHI9QXJyYXkobikpOysrZTxuOylyW2VdPXRbZV07cmV0dXJuIHJ9ZnVuY3Rpb24gemEodCxyKXtmb3IodmFyIGU9LTEsbj10PT1udWxsPzA6dC5sZW5ndGgscz0wLGk9W107KytlPG47KXt2YXIgYT10W2VdO3IoYSxlLHQpJiYoaVtzKytdPWEpfXJldHVybiBpfWZ1bmN0aW9uIHVuKCl7cmV0dXJuW119dmFyIEdhPU9iamVjdC5wcm90b3R5cGUscWE9R2EucHJvcGVydHlJc0VudW1lcmFibGUscG49T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxZYT1wbj9mdW5jdGlvbih0KXtyZXR1cm4gdD09bnVsbD9bXToodD1PYmplY3QodCksemEocG4odCksZnVuY3Rpb24ocil7cmV0dXJuIHFhLmNhbGwodCxyKX0pKX06dW4seHQ9WWE7ZnVuY3Rpb24gUWEodCxyKXtyZXR1cm4gdnQodCx4dCh0KSxyKX1mdW5jdGlvbiBobih0LHIpe2Zvcih2YXIgZT0tMSxuPXIubGVuZ3RoLHM9dC5sZW5ndGg7KytlPG47KXRbcytlXT1yW2VdO3JldHVybiB0fXZhciBKYT1zbihPYmplY3QuZ2V0UHJvdG90eXBlT2YsT2JqZWN0KSxmbj1KYSxYYT1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLFphPVhhP2Z1bmN0aW9uKHQpe2Zvcih2YXIgcj1bXTt0OylobihyLHh0KHQpKSx0PWZuKHQpO3JldHVybiByfTp1bixtbj1aYTtmdW5jdGlvbiBlbyh0LHIpe3JldHVybiB2dCh0LG1uKHQpLHIpfWZ1bmN0aW9uIGduKHQscixlKXt2YXIgbj1yKHQpO3JldHVybiB5dCh0KT9uOmhuKG4sZSh0KSl9ZnVuY3Rpb24gdG8odCl7cmV0dXJuIGduKHQsRnQseHQpfWZ1bmN0aW9uIHJvKHQpe3JldHVybiBnbih0LEJ0LG1uKX12YXIgbm89dWUoWCwiRGF0YVZpZXciKSxqdD1ubyxzbz11ZShYLCJQcm9taXNlIiksVXQ9c28saW89dWUoWCwiU2V0IiksJHQ9aW8sYW89dWUoWCwiV2Vha01hcCIpLEh0PWFvLFNuPSJbb2JqZWN0IE1hcF0iLG9vPSJbb2JqZWN0IE9iamVjdF0iLHZuPSJbb2JqZWN0IFByb21pc2VdIix5bj0iW29iamVjdCBTZXRdIixibj0iW29iamVjdCBXZWFrTWFwXSIsRW49IltvYmplY3QgRGF0YVZpZXddIixjbz1sZShqdCksbG89bGUoa2UpLHVvPWxlKFV0KSxwbz1sZSgkdCksaG89bGUoSHQpLGhlPUFlOyhqdCYmaGUobmV3IGp0KG5ldyBBcnJheUJ1ZmZlcigxKSkpIT1Fbnx8a2UmJmhlKG5ldyBrZSkhPVNufHxVdCYmaGUoVXQucmVzb2x2ZSgpKSE9dm58fCR0JiZoZShuZXcgJHQpIT15bnx8SHQmJmhlKG5ldyBIdCkhPWJuKSYmKGhlPWZ1bmN0aW9uKHQpe3ZhciByPUFlKHQpLGU9cj09b28/dC5jb25zdHJ1Y3Rvcjp2b2lkIDAsbj1lP2xlKGUpOiIiO2lmKG4pc3dpdGNoKG4pe2Nhc2UgY286cmV0dXJuIEVuO2Nhc2UgbG86cmV0dXJuIFNuO2Nhc2UgdW86cmV0dXJuIHZuO2Nhc2UgcG86cmV0dXJuIHluO2Nhc2UgaG86cmV0dXJuIGJufXJldHVybiByfSk7dmFyIEV0PWhlLGZvPU9iamVjdC5wcm90b3R5cGUsbW89Zm8uaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gZ28odCl7dmFyIHI9dC5sZW5ndGgsZT1uZXcgdC5jb25zdHJ1Y3RvcihyKTtyZXR1cm4gciYmdHlwZW9mIHRbMF09PSJzdHJpbmciJiZtby5jYWxsKHQsImluZGV4IikmJihlLmluZGV4PXQuaW5kZXgsZS5pbnB1dD10LmlucHV0KSxlfXZhciBTbz1YLlVpbnQ4QXJyYXksX249U287ZnVuY3Rpb24gS3QodCl7dmFyIHI9bmV3IHQuY29uc3RydWN0b3IodC5ieXRlTGVuZ3RoKTtyZXR1cm4gbmV3IF9uKHIpLnNldChuZXcgX24odCkpLHJ9ZnVuY3Rpb24gdm8odCxyKXt2YXIgZT1yP0t0KHQuYnVmZmVyKTp0LmJ1ZmZlcjtyZXR1cm4gbmV3IHQuY29uc3RydWN0b3IoZSx0LmJ5dGVPZmZzZXQsdC5ieXRlTGVuZ3RoKX12YXIgeW89L1x3KiQvO2Z1bmN0aW9uIGJvKHQpe3ZhciByPW5ldyB0LmNvbnN0cnVjdG9yKHQuc291cmNlLHlvLmV4ZWModCkpO3JldHVybiByLmxhc3RJbmRleD10Lmxhc3RJbmRleCxyfXZhciBUbj1FZT9FZS5wcm90b3R5cGU6dm9pZCAwLFJuPVRuP1RuLnZhbHVlT2Y6dm9pZCAwO2Z1bmN0aW9uIEVvKHQpe3JldHVybiBSbj9PYmplY3QoUm4uY2FsbCh0KSk6e319ZnVuY3Rpb24gX28odCxyKXt2YXIgZT1yP0t0KHQuYnVmZmVyKTp0LmJ1ZmZlcjtyZXR1cm4gbmV3IHQuY29uc3RydWN0b3IoZSx0LmJ5dGVPZmZzZXQsdC5sZW5ndGgpfXZhciBUbz0iW29iamVjdCBCb29sZWFuXSIsUm89IltvYmplY3QgRGF0ZV0iLFBvPSJbb2JqZWN0IE1hcF0iLENvPSJbb2JqZWN0IE51bWJlcl0iLHdvPSJbb2JqZWN0IFJlZ0V4cF0iLElvPSJbb2JqZWN0IFNldF0iLEFvPSJbb2JqZWN0IFN0cmluZ10iLE1vPSJbb2JqZWN0IFN5bWJvbF0iLGtvPSJbb2JqZWN0IEFycmF5QnVmZmVyXSIsT289IltvYmplY3QgRGF0YVZpZXddIixMbz0iW29iamVjdCBGbG9hdDMyQXJyYXldIixEbz0iW29iamVjdCBGbG9hdDY0QXJyYXldIixObz0iW29iamVjdCBJbnQ4QXJyYXldIixWbz0iW29iamVjdCBJbnQxNkFycmF5XSIsRm89IltvYmplY3QgSW50MzJBcnJheV0iLEJvPSJbb2JqZWN0IFVpbnQ4QXJyYXldIix4bz0iW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iLGpvPSJbb2JqZWN0IFVpbnQxNkFycmF5XSIsVW89IltvYmplY3QgVWludDMyQXJyYXldIjtmdW5jdGlvbiAkbyh0LHIsZSl7dmFyIG49dC5jb25zdHJ1Y3Rvcjtzd2l0Y2gocil7Y2FzZSBrbzpyZXR1cm4gS3QodCk7Y2FzZSBUbzpjYXNlIFJvOnJldHVybiBuZXcgbigrdCk7Y2FzZSBPbzpyZXR1cm4gdm8odCxlKTtjYXNlIExvOmNhc2UgRG86Y2FzZSBObzpjYXNlIFZvOmNhc2UgRm86Y2FzZSBCbzpjYXNlIHhvOmNhc2Ugam86Y2FzZSBVbzpyZXR1cm4gX28odCxlKTtjYXNlIFBvOnJldHVybiBuZXcgbjtjYXNlIENvOmNhc2UgQW86cmV0dXJuIG5ldyBuKHQpO2Nhc2Ugd286cmV0dXJuIGJvKHQpO2Nhc2UgSW86cmV0dXJuIG5ldyBuO2Nhc2UgTW86cmV0dXJuIEVvKHQpfX12YXIgUG49T2JqZWN0LmNyZWF0ZSxIbz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIGZ1bmN0aW9uKHIpe2lmKCFNZShyKSlyZXR1cm57fTtpZihQbilyZXR1cm4gUG4ocik7dC5wcm90b3R5cGU9cjt2YXIgZT1uZXcgdDtyZXR1cm4gdC5wcm90b3R5cGU9dm9pZCAwLGV9fSgpLEtvPUhvO2Z1bmN0aW9uIFdvKHQpe3JldHVybiB0eXBlb2YgdC5jb25zdHJ1Y3Rvcj09ImZ1bmN0aW9uIiYmIWJ0KHQpP0tvKGZuKHQpKTp7fX12YXIgem89IltvYmplY3QgTWFwXSI7ZnVuY3Rpb24gR28odCl7cmV0dXJuIExlKHQpJiZFdCh0KT09em99dmFyIENuPVJlJiZSZS5pc01hcCxxbz1Dbj9EdChDbik6R28sWW89cW8sUW89IltvYmplY3QgU2V0XSI7ZnVuY3Rpb24gSm8odCl7cmV0dXJuIExlKHQpJiZFdCh0KT09UW99dmFyIHduPVJlJiZSZS5pc1NldCxYbz13bj9EdCh3bik6Sm8sWm89WG8sZWM9MSx0Yz0yLHJjPTQsSW49IltvYmplY3QgQXJndW1lbnRzXSIsbmM9IltvYmplY3QgQXJyYXldIixzYz0iW29iamVjdCBCb29sZWFuXSIsaWM9IltvYmplY3QgRGF0ZV0iLGFjPSJbb2JqZWN0IEVycm9yXSIsQW49IltvYmplY3QgRnVuY3Rpb25dIixvYz0iW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iLGNjPSJbb2JqZWN0IE1hcF0iLGRjPSJbb2JqZWN0IE51bWJlcl0iLE1uPSJbb2JqZWN0IE9iamVjdF0iLGxjPSJbb2JqZWN0IFJlZ0V4cF0iLHVjPSJbb2JqZWN0IFNldF0iLHBjPSJbb2JqZWN0IFN0cmluZ10iLGhjPSJbb2JqZWN0IFN5bWJvbF0iLGZjPSJbb2JqZWN0IFdlYWtNYXBdIixtYz0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLGdjPSJbb2JqZWN0IERhdGFWaWV3XSIsU2M9IltvYmplY3QgRmxvYXQzMkFycmF5XSIsdmM9IltvYmplY3QgRmxvYXQ2NEFycmF5XSIseWM9IltvYmplY3QgSW50OEFycmF5XSIsYmM9IltvYmplY3QgSW50MTZBcnJheV0iLEVjPSJbb2JqZWN0IEludDMyQXJyYXldIixfYz0iW29iamVjdCBVaW50OEFycmF5XSIsVGM9IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIixSYz0iW29iamVjdCBVaW50MTZBcnJheV0iLFBjPSJbb2JqZWN0IFVpbnQzMkFycmF5XSIsVj17fTtWW0luXT1WW25jXT1WW21jXT1WW2djXT1WW3NjXT1WW2ljXT1WW1NjXT1WW3ZjXT1WW3ljXT1WW2JjXT1WW0VjXT1WW2NjXT1WW2RjXT1WW01uXT1WW2xjXT1WW3VjXT1WW3BjXT1WW2hjXT1WW19jXT1WW1RjXT1WW1JjXT1WW1BjXT0hMCxWW2FjXT1WW0FuXT1WW2ZjXT0hMTtmdW5jdGlvbiBfdCh0LHIsZSxuLHMsaSl7dmFyIGEsZD1yJmVjLG89ciZ0YyxsPXImcmM7aWYoZSYmKGE9cz9lKHQsbixzLGkpOmUodCkpLGEhPT12b2lkIDApcmV0dXJuIGE7aWYoIU1lKHQpKXJldHVybiB0O3ZhciBtPXl0KHQpO2lmKG0pe2lmKGE9Z28odCksIWQpcmV0dXJuIFdhKHQsYSl9ZWxzZXt2YXIgdj1FdCh0KSxFPXY9PUFufHx2PT1vYztpZihMdCh0KSlyZXR1cm4gS2EodCxkKTtpZih2PT1Nbnx8dj09SW58fEUmJiFzKXtpZihhPW98fEU/e306V28odCksIWQpcmV0dXJuIG8/ZW8odCwkYShhLHQpKTpRYSh0LEZhKGEsdCkpfWVsc2V7aWYoIVZbdl0pcmV0dXJuIHM/dDp7fTthPSRvKHQsdixkKX19aXx8KGk9bmV3IFRlKTt2YXIgST1pLmdldCh0KTtpZihJKXJldHVybiBJO2kuc2V0KHQsYSksWm8odCk/dC5mb3JFYWNoKGZ1bmN0aW9uKEYpe2EuYWRkKF90KEYscixlLEYsdCxpKSl9KTpZbyh0KSYmdC5mb3JFYWNoKGZ1bmN0aW9uKEYsSCl7YS5zZXQoSCxfdChGLHIsZSxILHQsaSkpfSk7dmFyIHg9bD9vP3JvOnRvOm8/QnQ6RnQsJD1tP3ZvaWQgMDp4KHQpO3JldHVybiBCaSgkfHx0LGZ1bmN0aW9uKEYsSCl7JCYmKEg9RixGPXRbSF0pLHpyKGEsSCxfdChGLHIsZSxILHQsaSkpfSksYX12YXIgQ2M9MSx3Yz00O2Z1bmN0aW9uIEljKHQpe3JldHVybiBfdCh0LENjfHdjKX12YXIgQWM9T2JqZWN0LmRlZmluZVByb3BlcnR5LE1jPSh0LHIpPT57Zm9yKHZhciBlIGluIHIpQWModCxlLHtnZXQ6cltlXSxlbnVtZXJhYmxlOiEwfSl9LGtjPXt9O01jKGtjLHtwZXJtaXNzaW9uczooKT0+T2MsdGhlbWU6KCk9PkxjfSk7dmFyIE9jPXt2aWV3X3R5cGU6IkdST1VQX0NBTEwiLGFjY2VwdF93YWl0aW5nX3JlcXVlc3RzOiExLGFjY2VwdF9wcmVzZW50X3JlcXVlc3RzOiExLHJlcXVlc3RfcHJvZHVjZTohMSxjYW5fYWxsb3dfcGFydGljaXBhbnRfYXVkaW86ITEsY2FuX2FsbG93X3BhcnRpY2lwYW50X3NjcmVlbnNoYXJpbmc6ITEsY2FuX2FsbG93X3BhcnRpY2lwYW50X3ZpZGVvOiExLGNhbl9zcG90bGlnaHQ6ITEscmVxdWVzdF9raWNrX3BhcnRpY2lwYW50OiExLGtpY2tfcGFydGljaXBhbnQ6ITEscGluX3BhcnRpY2lwYW50OiExLGNhbl9lZGl0X2Rpc3BsYXlfbmFtZTohMSxjYW5fcmVjb3JkOiExLGNhbl9saXZlc3RyZWFtOiExLGNhbl9wcmVzZW50OiEwLHdhaXRpbmdfcm9vbV90eXBlOiJTS0lQX09OX0FDQ0VQVCIscmVjb3JkZXJfdHlwZToiTk9ORSIscGx1Z2luczp7Y2FuX2Nsb3NlOiEwLGNhbl9zdGFydDohMH0scG9sbHM6e2Nhbl9jcmVhdGU6ITAsY2FuX3ZvdGU6ITAsY2FuX3ZpZXc6ITB9LHByb2R1Y2U6e3ZpZGVvOnthbGxvdzohMCxxdWFsaXR5OiJ2Z2EiLGZyYW1lX3JhdGU6MjR9LGF1ZGlvOiEwLHNjcmVlbnNoYXJlOnthbGxvdzohMCxxdWFsaXR5OiJoZCIsZnJhbWVfcmF0ZTo1fX0sY2hhdDp7cHVibGljOntjYW5fc2VuZDohMCx0ZXh0OiEwLGZpbGVzOiEwfSxwcml2YXRlOntjYW5fc2VuZDohMSxjYW5fcmVjZWl2ZTohMSx0ZXh0OiExLGZpbGVzOiExfX0sY29ubmVjdGVkX21lZXRpbmdzOntjYW5fYWx0ZXJfY29ubmVjdGVkX21lZXRpbmdzOiExLGNhbl9zd2l0Y2hfY29ubmVjdGVkX21lZXRpbmdzOiExLGNhbl9zd2l0Y2hfdG9fcGFyZW50X21lZXRpbmc6ITF9LHJlYWN0aW9uczohMSxoaWRkZW5fcGFydGljaXBhbnQ6ITEsaXNfcmVjb3JkZXI6ITEsc2hvd19wYXJ0aWNpcGFudF9saXN0OiEwLGNhbl9jaGFuZ2VfcGFydGljaXBhbnRfcm9sZTohMSxjYW5fY2hhbmdlX3RoZW1lOiExLG1heF9zY3JlZW5zaGFyZV9jb3VudDoxfSxMYz17c2V0dXBfc2NyZWVuOntpc19lbmFibGVkOiEwfSxhbG9uZV9oZXJlOntpc19lbmFibGVkOiEwfSx3YWl0aW5nX3Jvb206e2lzX2VuYWJsZWQ6ITEsZW5hYmxlX3ByZXZpZXc6ITB9LGNvbnRyb2xfYmFyOntpc19lbmFibGVkOiEwLGVsZW1lbnRzOntwbHVnaW5zOiEwLHNjcmVlbnNoYXJlOiEwLGludml0ZTohMCxwYXJ0aWNpcGFudHM6ITAsY2hhdDohMCxyZWFjdGlvbnM6ITEscG9sbHM6ITAsZnVsbHNjcmVlbjohMCxsYXlvdXQ6ITB9fSxoZWFkZXI6e2lzX2VuYWJsZWQ6ITAsZWxlbWVudHM6e3RpbWVyOiEwLHRpdGxlOiEwLHBhcnRpY2lwYW50X2NvdW50OiEwLGNoYW5nZV9sYXlvdXQ6ITB9fSxwaXBfbW9kZTohMCxhdXRvX3R1bmU6ITAsZ3JpZDp7bXVsdGk6e21heFZpZGVvQ291bnQ6Nix2aWRlb0ZpdDoiY292ZXIifSxzaW5nbGU6e21heFZpZGVvQ291bnQ6Nix2aWRlb0ZpdDoiY292ZXIifSxkZWZhdWx0VmlldzoibXVsdGkifSxjb250cm9sczp7cGlwX3RvZ2dsZTohMX19LGtuPSJoWGdVOFdjOHB3dUdOcTltczVxOUhoIjt0eXBlb2YgcHJvY2VzcyE9InVuZGVmaW5lZCImJih0cz1wcm9jZXNzPT1udWxsP3ZvaWQgMDpwcm9jZXNzLmVudikhPW51bGwmJnRzLkZMQUdTTUlUSF9FTlZJUk9OTUVOVF9LRVkmJihrbj1wcm9jZXNzLmVudi5GTEFHU01JVEhfRU5WSVJPTk1FTlRfS0VZKTtmdW5jdGlvbiBEYyh0PVtdKXtjb25zdCByPXt9O3JldHVybiB0LmZvckVhY2goZT0+e3JbZS5mZWF0dXJlLm5hbWVdPXtlbmFibGVkOmUuZW5hYmxlZCx2YWx1ZTplLmZlYXR1cmVfc3RhdGVfdmFsdWV9fSkscn12YXIgTmM9Y2xhc3N7Y29uc3RydWN0b3IodD1rbil7cCh0aGlzLCJmbGFncyIse30pO3AodGhpcywiZW52aXJvbm1lbnRLZXkiLG51bGwpO3RoaXMuZW52aXJvbm1lbnRLZXk9dH1pZGVudGlmeUFuZEZldGNoRmxhZ3NXaXRoUmV0cnkoZCl7cmV0dXJuIHcodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24qKHtwcmltYXJ5RW5kcG9pbnQ6dCxzZWNvbmRhcnlFbmRwb2ludDpyLGZvcmNlRXZhbHVhdGU6ZSx0aW1lb3V0Om4sdW5pcXVlSWRlbnRpZmllcjpzLHRyYWl0c09iajppLGxvZ2dlcjphfSl7Y29uc3Qgbz1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGkpKSxsPU9iamVjdC5lbnRyaWVzKG8pLm1hcCh2PT4oe3RyYWl0X2tleTp2WzBdLHRyYWl0X3ZhbHVlOnZbMV19KSksbT1bdCxyLHJdO2Zvcihjb25zdCB2IG9mIG0pdHJ5e2NvbnN0IEU9bmV3IEFib3J0Q29udHJvbGxlcixJPXNldFRpbWVvdXQoKCk9PkUuYWJvcnQoKSxuKSx4PWBfJHsoTWF0aC5yYW5kb20oKSsxKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIpfWAsJD15aWVsZCBmZXRjaChgaHR0cHM6Ly8ke3Z9L2FwaS92MS9pZGVudGl0aWVzL2Ase21ldGhvZDoiUE9TVCIsaGVhZGVyczp7IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24iLCJYLUVudmlyb25tZW50LUtleSI6dGhpcy5lbnZpcm9ubWVudEtleX0sYm9keTpKU09OLnN0cmluZ2lmeSh7aWRlbnRpZmllcjpzKyhlP3g6IiIpLHRyYWl0czpsfSksc2lnbmFsOkUuc2lnbmFsfSk7aWYoY2xlYXJUaW1lb3V0KEkpLCEkLm9rKXRocm93IG5ldyBFcnJvcihgUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgJHskLnN0YXR1c31gKTtjb25zdCBGPXlpZWxkICQuanNvbigpO3JldHVybiBEYyhGLmZsYWdzfHxbXSl9Y2F0Y2goRSl7YS5lcnJvcigiRmxhZ3NtaXRoIGlkZW50aWZ5IGZhaWxlZCEhIix7ZXJyb3I6RSx1cmw6dn0pfXJldHVybnt9fSl9aWRlbnRpZnkoYSl7cmV0dXJuIHcodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24qKHQscj17fSxlPSExLG49NWUzLHM9ImVkZ2UuYXBpLmZsYWdzbWl0aC5jb20iLGk9Y29uc29sZSl7cmV0dXJuIHRoaXMuZmxhZ3M9eWllbGQgdGhpcy5pZGVudGlmeUFuZEZldGNoRmxhZ3NXaXRoUmV0cnkoe3RyYWl0c09iajpyLHVuaXF1ZUlkZW50aWZpZXI6dCxmb3JjZUV2YWx1YXRlOmUsdGltZW91dDpuLHByaW1hcnlFbmRwb2ludDpzLHNlY29uZGFyeUVuZHBvaW50OiJlZGdlLmFwaS5mbGFnc21pdGguY29tIixsb2dnZXI6aX0pLHRoaXMuZmxhZ3N9KX1nZXRWYWx1ZSh0KXtyZXR1cm4gdGhpcy5mbGFncyYmdGhpcy5mbGFnc1t0XSYmdGhpcy5mbGFnc1t0XS52YWx1ZX1oYXNGZWF0dXJlKHQpe3JldHVybiB0aGlzLmZsYWdzJiZ0aGlzLmZsYWdzW3RdJiZ0aGlzLmZsYWdzW3RdLmVuYWJsZWR9Z2V0QWxsRmxhZ3MoKXtyZXR1cm4gdGhpcy5mbGFnc319O2Z1bmN0aW9uIFZjKHQpe3JldHVybiBuZXcgTmModCl9dmFyIE9uPVstMiwtMSwwLDEsMl0sRmM9WzAsMSwyLDMsNF07ZnVuY3Rpb24gQmModCl7dD10LnRyaW0oKTtsZXQgcj0iMCIsZT0iMCIsbj0iMCI7cmV0dXJuIHQubGVuZ3RoPT00PyhyPWAweCR7dFsxXX0ke3RbMV19YCxlPWAweCR7dFsyXX0ke3RbMl19YCxuPWAweCR7dFszXX0ke3RbM119YCk6dC5sZW5ndGg+NiYmKHI9YDB4JHt0WzFdfSR7dFsyXX1gLGU9YDB4JHt0WzNdfSR7dFs0XX1gLG49YDB4JHt0WzVdfSR7dFs2XX1gKSxbK3IsK2UsK25dfXZhciB4Yz0odCxyLGUpPT57bGV0IG4scyxpO2lmKHI9PTApbj1zPWk9ZTtlbHNle2NvbnN0IGE9KGwsbSx2KT0+KHY8MCYmKHYrPTEpLHY+MSYmKHYtPTEpLHY8LjE2NjY2NjY2NjY2NjY2NjY2P2wrKG0tbCkqNip2OnY8LjU/bTp2PC42NjY2NjY2NjY2NjY2NjY2P2wrKG0tbCkqKC42NjY2NjY2NjY2NjY2NjY2LXYpKjY6bCksZD1lPC41P2UqKDErcik6ZStyLWUqcixvPTIqZS1kO249YShvLGQsdCsxLzMpLHM9YShvLGQsdCksaT1hKG8sZCx0LTEvMyl9cmV0dXJuW01hdGgucm91bmQobioyNTUpLE1hdGgucm91bmQocyoyNTUpLE1hdGgucm91bmQoaSoyNTUpXX0samM9KHQscixlKT0+e3QvPTI1NSxyLz0yNTUsZS89MjU1O2NvbnN0IG49TWF0aC5tYXgodCxyLGUpLHM9TWF0aC5taW4odCxyLGUpO2xldCBpLGE7Y29uc3QgZD0obitzKS8yO2lmKG49PXMpaT1hPTA7ZWxzZXtjb25zdCBvPW4tcztzd2l0Y2goYT1kPi41P28vKDItbi1zKTpvLyhuK3MpLG4pe2Nhc2UgdDppPShyLWUpL28rKHI8ZT82OjApO2JyZWFrO2Nhc2UgcjppPShlLXQpL28rMjticmVhaztjYXNlIGU6aT0odC1yKS9vKzQ7YnJlYWt9aS89Nn1yZXR1cm5baSxhLGRdfSxVYz0odCxyLGUpPT57Y29uc3Qgbj1zPT5zLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCIwIik7cmV0dXJuYCMke24odCl9JHtuKHIpfSR7bihlKX1gfSxMbj0odCxyPU9uLGU9LjQpPT57Y29uc3Qgbj1bXSxbcyxpLGFdPUJjKHQpLFtkLG8sbF09amMocyxpLGEpLG09TWF0aC5yb3VuZChsKjEwMCk7bT43MD9lPS44Om0+NjA/ZT0uOTptPDEwP2U9LjA3NTptPDQyJiYoZT0uMyk7Y29uc3Qgdj1yLmZpbmRJbmRleChGPT5GPT09MCk7aWYodj09PS0xKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCByZWR1Y2VyIHByb3ZpZGVkLCBpdCBtdXN0IGNvbnRhaW4gYXRsZWFzdCBvbmUgemVybyIpO2NvbnN0IEU9NS12LEk9disxLHg9KDEwMC1tKS9FLCQ9bS9JO2Zvcihjb25zdCBGIG9mIHIpe2xldCBIO0Y8MD9IPW0rRiokKmU6Rj4wP0g9bStGKngqZTpIPW07Y29uc3RbWix2ZSx5ZV09eGMoZCxvLEgvMTAwKTtuLnB1c2goVWMoWix2ZSx5ZSkpfXJldHVybiBufSxEbj17ZGFyazp7YmFja2dyb3VuZDp7MWUzOiIjMjUyNTI1Iiw5MDA6IiMyRjJGMkYiLDgwMDoiIzMyMzIzMiIsNzAwOiIjM0UzRTNFIiw2MDA6IiM0QTRBNEEifSx0ZXh0OiIjRjVGNUY1IiwidmlkZW8tYmciOiIjMUMxQzFDIn0sbGlnaHQ6e2JhY2tncm91bmQ6ezFlMzoiI0ZGRkZGRiIsOTAwOiIjRjVGNUY1Iiw4MDA6IiNFQkVCRUIiLDcwMDoiI0UwRTBFMCIsNjAwOiIjRDZENkQ2In0sdGV4dDoiIzExMTExMSIsInRleHQtb24tYnJhbmQiOiIjZmZmZmZmIiwidmlkZW8tYmciOiIjREFEQURBIn19LCRjPXQ9Pntjb25zdFtyLGUsbixzLGldPUxuKHQsT24pO3JldHVybnszMDA6ciw0MDA6ZSw1MDA6biw2MDA6cyw3MDA6aX19LEhjPXQ9PntpZih0PT09IiNGRkZGRkYiKXJldHVybiBEbi5saWdodC5iYWNrZ3JvdW5kO2lmKHQ9PT0iIzAwMDAwMCIpcmV0dXJuIERuLmRhcmsuYmFja2dyb3VuZDtjb25zdFtyLGUsbixzLGldPUxuKHQsRmMpO3JldHVybnsxZTM6ciw5MDA6ZSw4MDA6biw3MDA6cyw2MDA6aX19LEtjPXtib3JkZXJfcmFkaXVzOiJyb3VuZGVkIixib3JkZXJfd2lkdGg6InRoaW4iLHNwYWNpbmdfYmFzZTo0LHRoZW1lOiJkYXJrIixjb2xvcnM6e2JyYW5kOiRjKCIjMjE2MEZEIiksYmFja2dyb3VuZDpIYygiIzE0MTQxNCIpLGRhbmdlcjoiI0ZGMkQyRCIsdGV4dDoiI0VFRUVFRSIsdGV4dF9vbl9icmFuZDoiI0VFRUVFRSIsc3VjY2VzczoiIzYyQTUwNCIsdmlkZW9fYmc6IiMxOTE5MTkiLHdhcm5pbmc6IiNGRkNEMDcifX07ZnVuY3Rpb24gTm4oKXtyZXR1cm4gSWMoS2MpfU5uKCksTm4oKTtjbGFzcyBXY3tjb25zdHJ1Y3Rvcigpe0l0KHRoaXMsRmUsdm9pZCAwKX1nZXQgdGVsZW1ldHJ5KCl7dmFyIHI7cmV0dXJuKHI9ZWUodGhpcyxGZSkpPT1udWxsP3ZvaWQgMDpyLmdldFZhbHVlKCJ0ZWxlbWV0cnkiKX1pbml0KHIpe0NlKHRoaXMsRmUscil9aW5mbyhyLGUsbil7dmFyIHM7KHM9dGhpcy50ZWxlbWV0cnkpPT1udWxsfHxzLmFkZExvZ0luQ3VycmVudFNwYW4oImluZm8iLHIsZSxuKX1lcnJvcihyLGUsbil7dmFyIHM7KHM9dGhpcy50ZWxlbWV0cnkpPT1udWxsfHxzLmFkZExvZ0luQ3VycmVudFNwYW4oImVycm9yIixyLGUsbil9ZGVidWcocixlLG4pe3ZhciBzOyhzPXRoaXMudGVsZW1ldHJ5KT09bnVsbHx8cy5hZGRMb2dJbkN1cnJlbnRTcGFuKCJkZWJ1ZyIscixlLG4pfWxvZyhyLGUsbil7dmFyIHM7KHM9dGhpcy50ZWxlbWV0cnkpPT1udWxsfHxzLmFkZExvZ0luQ3VycmVudFNwYW4oImxvZyIscixlLG4pfXdhcm4ocixlLG4pe3ZhciBzOyhzPXRoaXMudGVsZW1ldHJ5KT09bnVsbHx8cy5hZGRMb2dJbkN1cnJlbnRTcGFuKCJ3YXJuIixyLGUsbil9fUZlPW5ldyBXZWFrTWFwO2NvbnN0IHJyPWNsYXNzIGV4dGVuZHMgcS5FdmVudEVtaXR0ZXJ7Y29uc3RydWN0b3IoZSl7c3VwZXIoKTtJdCh0aGlzLHNlLHZvaWQgMCk7SXQodGhpcyxpZSx2b2lkIDApO3AodGhpcywiYXN5bmNQcm9taXNlVGltZW91dCIpO3AodGhpcywibG9nZ2VyIik7dGhpcy5sb2dnZXI9ZSxDZSh0aGlzLHNlLG5ldyBNYXApLENlKHRoaXMsaWUsbmV3IE1hcCksdGhpcy5hc3luY1Byb21pc2VUaW1lb3V0PThlM31lbWl0QXN5bmMoZSwuLi5uKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7ZWUodGhpcyxzZSkuc2V0KGUsW10pO2NvbnN0IHM9ZWUodGhpcyxpZSkuZ2V0KGUpLm1hcCgoKT0+bmV3IFByb21pc2UoaT0+e2VlKHRoaXMsc2UpLmdldChlKS5wdXNoKGkpfSkpO3NzKHJyLnByb3RvdHlwZSx0aGlzLCJlbWl0IikuY2FsbCh0aGlzLGUsLi4ubikseWllbGQgUHJvbWlzZS5yYWNlKFtQcm9taXNlLmFsbChzKSxuZXcgUHJvbWlzZSgoaSxhKT0+c2V0VGltZW91dCgoKT0+YShuZXcgRXJyb3IoYGVtaXRBc3luYyBmYWlsZWQgdG8gcmVzb2x2ZSBmb3IgZXZlbnQgJHtlfS5gKSksdGhpcy5hc3luY1Byb21pc2VUaW1lb3V0KSldKSxlZSh0aGlzLHNlKS5kZWxldGUoZSl9KX1vbkFzeW5jKGUsbil7Y29uc3Qgcz1lZSh0aGlzLHNlKSxpPSguLi5hKT0+dyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIG87dHJ5e3lpZWxkIG4oLi4uYSl9Y2F0Y2gobCl7dGhpcy5sb2dnZXIuZXJyb3IoIltvbkFzeW5jXSIse2Vycm9yOmx9KX1jb25zdCBkPShvPXMuZ2V0KGUpKT09bnVsbD92b2lkIDA6by5zaGlmdCgpO2Q9PW51bGx8fGQoKX0pO3JldHVybiBlZSh0aGlzLGllKS5nZXQoZSl8fGVlKHRoaXMsaWUpLnNldChlLFtdKSxlZSh0aGlzLGllKS5nZXQoZSkucHVzaChpKSxzdXBlci5vbihlLGkpfXJlc2V0KCl7Q2UodGhpcyxzZSxuZXcgTWFwKSxDZSh0aGlzLGllLG5ldyBNYXApLHN1cGVyLnJlbW92ZUFsbExpc3RlbmVycygpfX07bGV0IFd0PXJyO3NlPW5ldyBXZWFrTWFwLGllPW5ldyBXZWFrTWFwO3ZhciBUdCx6Yz1uZXcgVWludDhBcnJheSgxNik7ZnVuY3Rpb24gR2MoKXtpZighVHQmJihUdD10eXBlb2YgY3J5cHRvIT0idW5kZWZpbmVkIiYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcyYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKGNyeXB0byl8fHR5cGVvZiBtc0NyeXB0byE9InVuZGVmaW5lZCImJnR5cGVvZiBtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXM9PSJmdW5jdGlvbiImJm1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKG1zQ3J5cHRvKSwhVHQpKXRocm93IG5ldyBFcnJvcigiY3J5cHRvLmdldFJhbmRvbVZhbHVlcygpIG5vdCBzdXBwb3J0ZWQuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQjZ2V0cmFuZG9tdmFsdWVzLW5vdC1zdXBwb3J0ZWQiKTtyZXR1cm4gVHQoemMpfXZhciBxYz0vXig/OlswLTlhLWZdezh9LVswLTlhLWZdezR9LVsxLTVdWzAtOWEtZl17M30tWzg5YWJdWzAtOWEtZl17M30tWzAtOWEtZl17MTJ9fDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCkkL2k7ZnVuY3Rpb24gWWModCl7cmV0dXJuIHR5cGVvZiB0PT0ic3RyaW5nIiYmcWMudGVzdCh0KX1mb3IodmFyIFc9W10senQ9MDt6dDwyNTY7Kyt6dClXLnB1c2goKHp0KzI1NikudG9TdHJpbmcoMTYpLnN1YnN0cigxKSk7ZnVuY3Rpb24gUWModCl7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOjAsZT0oV1t0W3IrMF1dK1dbdFtyKzFdXStXW3RbcisyXV0rV1t0W3IrM11dKyItIitXW3Rbcis0XV0rV1t0W3IrNV1dKyItIitXW3Rbcis2XV0rV1t0W3IrN11dKyItIitXW3Rbcis4XV0rV1t0W3IrOV1dKyItIitXW3RbcisxMF1dK1dbdFtyKzExXV0rV1t0W3IrMTJdXStXW3RbcisxM11dK1dbdFtyKzE0XV0rV1t0W3IrMTVdXSkudG9Mb3dlckNhc2UoKTtpZighWWMoZSkpdGhyb3cgVHlwZUVycm9yKCJTdHJpbmdpZmllZCBVVUlEIGlzIGludmFsaWQiKTtyZXR1cm4gZX1mdW5jdGlvbiBKYyh0LHIsZSl7dD10fHx7fTt2YXIgbj10LnJhbmRvbXx8KHQucm5nfHxHYykoKTtpZihuWzZdPW5bNl0mMTV8NjQsbls4XT1uWzhdJjYzfDEyOCxyKXtlPWV8fDA7Zm9yKHZhciBzPTA7czwxNjsrK3MpcltlK3NdPW5bc107cmV0dXJuIHJ9cmV0dXJuIFFjKG4pfXZhciBYYz0iW29iamVjdCBNYXBdIixaYz0iW29iamVjdCBTZXRdIixlZD1PYmplY3QucHJvdG90eXBlLHRkPWVkLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIHJkKHQpe2lmKHQ9PW51bGwpcmV0dXJuITA7aWYoVnQodCkmJih5dCh0KXx8dHlwZW9mIHQ9PSJzdHJpbmcifHx0eXBlb2YgdC5zcGxpY2U9PSJmdW5jdGlvbiJ8fEx0KHQpfHxybih0KXx8WXIodCkpKXJldHVybiF0Lmxlbmd0aDt2YXIgcj1FdCh0KTtpZihyPT1YY3x8cj09WmMpcmV0dXJuIXQuc2l6ZTtpZihidCh0KSlyZXR1cm4hYW4odCkubGVuZ3RoO2Zvcih2YXIgZSBpbiB0KWlmKHRkLmNhbGwodCxlKSlyZXR1cm4hMTtyZXR1cm4hMH1jb25zdCBHdD17UFJPUEFHQVRFX0tJQ0tfQUxMOiJwcm9wYWdhdGVfa2lja19hY3Jvc3Nfcm9vbXMiLFJFRlJFU0hfSURfT05fRElTQ09OTkVDVElPTjoicmVmcmVzaF9pZF9vbl9kaXNjb25uZWN0aW9uIixTS0lQX09URUxfVFJBQ0VTOiJza2lwX290ZWxfdHJhY2VzIixFTkFCTEVfQ0ZfU0lNVUxDQVNUOiJlbmFibGVfY2Zfc2ltdWxjYXN0IixDRl9UUkFOU1BPUlRfRk9SQ0VfUkVMQVlfT05fSUNFX0ZBSUxFRDoiY2ZfdHJhbnNwb3J0X2ZvcmNlX3JlbGF5X29uX2ljZV9mYWlsZWQiLExPR19MRVZFTDoibG9nX2xldmVsIixWMV9QTFVHSU5TOiJ2MV9wbHVnaW5zIixMSVZFU1RSRUFNOiJmZWF0X2xpdmVzdHJlYW0iLFZBTF9NSU5fRlJBTUVSQVRFOiJ2YWxfbWluX2ZyYW1lcmF0ZSIsU0NSRUVFTlNIQVJFX0VSUl9IQUNLOiJzY3JlZW5zaGFyZV9lcnJfaGFjayIsU0NSRUVFTlNIQVJFX0NPTlNUUkFJTlRTX1JFVFJZOiJzY3JlZW5zaGFyZV9jb25zdHJhaW50c19yZXRyeSIsVklERU9fQ09OU1RSQUlOVFM6InZpZGVvX2NvbnN0cmFpbnRzIixTQ1JFRU5TSEFSRV9DT05TVFJBSU5UUzoic2NyZWVuc2hhcmVfY29uc3RyYWludHMiLE9CU19RVUFMSVRZOiJvYnNfcXVhbGl0eSIsQUxMT1dfU0FGQVJJX01FRElBX01JRERMRVdBUkVTOiJhbGxvd19zYWZhcmlfbWVkaWFfbWlkZGxld2FyZXMiLEVYUF9SRVNIQVJFOiJleHBfcmVzaGFyZSIsU0tJUF9TRVRUSU5HX0lOX1VTRV9ERVZJQ0U6InNraXBfc2V0dGluZ19pbl91c2VfZGV2aWNlIixQUkVDQUxMX0JBTkRXSURUSF9URVNUOiJwcmVjYWxsX2JhbmR3aWR0aF90ZXN0IixERUJVR19TT0NLRVRfSk9JTjoiZGVidWdfc29ja2V0X2pvaW4iLEZPUkNFX1JFTEFZOiJmb3JjZV9yZWxheSIsRk9SQ0VfVklERU9fQ09ERUM6ImZvcmNlX3ZpZGVvX2NvZGVjIixUUkFDS19ISU5UOiJ0cmFja19oaW50IixPVkVSUklERV9TSU1VTENBU1RfRFlOQU1JQzoib3ZlcnJpZGVfc2ltdWxjYXN0X2R5bmFtaWMiLFBSRUNSRUFURV9QUk9EVUNFUlM6InByZWNyZWF0ZV9wcm9kdWNlcnMiLERJU0FCTEVfT1BVU19EVFhfQ0Y6ImRpc2FibGVfb3B1c19kdHhfY2YiLEVOQUJMRV9BVURJT19BQ1RJVklUWV9ERUJVR19MT0dTOiJlbmFibGVfYXVkaW9fYWN0aXZpdHlfZGVidWdfbG9ncyIsRElTQUJMRV9MQVlFUl9TV0lUQ0g6ImRpc2FibGVfbGF5ZXJfc3dpdGNoIn07ZnVuY3Rpb24gUnQodCl7Y29uc3Qgcj17fTtyZXR1cm4gdHlwZW9mKHQ9PW51bGw/dm9pZCAwOnQuY29kZSk9PSJudW1iZXIiJiYoci5jb2RlPXQuY29kZSksdHlwZW9mKHQ9PW51bGw/dm9pZCAwOnQuY29kZSk9PSJzdHJpbmciJiYoci5jb2RlPXQuY29kZS5zdWJzdHJpbmcoMCwxMDApKSx0eXBlb2YodD09bnVsbD92b2lkIDA6dC5uYW1lKT09InN0cmluZyImJihyLm5hbWU9dC5uYW1lLnN1YnN0cmluZygwLDUwMCkpLHR5cGVvZih0PT1udWxsP3ZvaWQgMDp0Lm1lc3NhZ2UpPT0ic3RyaW5nIiYmKHIubWVzc2FnZT10Lm1lc3NhZ2Uuc3Vic3RyaW5nKDAsNTAwKSksdHlwZW9mKHQ9PW51bGw/dm9pZCAwOnQucmVhc29uKT09InN0cmluZyImJihyLnJlYXNvbj10LnJlYXNvbi5zdWJzdHJpbmcoMCw1MDApKSx0eXBlb2YodD09bnVsbD92b2lkIDA6dC5zdGFjayk9PSJzdHJpbmciJiYoci5zdGFjaz10LnN0YWNrLnN1YnN0cmluZygwLDUwMCkpLHJ9ZnVuY3Rpb24gbmQoe3NlcnZpY2VQcmVmaXg6dCxiYXNlVVJJOnJ9KXtyZXR1cm5gJHt0fS4ke3J9YH1jb25zdCBzZD17bG9nczoiaHR0cHM6Ly9hcGktc2lsb3MuZHl0ZS5pby9vdGVsL2xvZ3MiLG1vY2s6e3VybDoiaHR0cHM6Ly9tb2NrLmR5dGUuaW8iLGRvbWFpbjoibW9jay5keXRlLmlvIixhcHA6Imh0dHBzOi8vYXBwLmR5dGUuaW8vdjIvbWVldGluZyIsc3RhZ2luZ0FwcDoiaHR0cHM6Ly9hcHAuZGV2ZWwuZHl0ZS5pby92Mi9tZWV0aW5nIn0sYXBpQmFzZTp7cHJvZDoiaHR0cHM6Ly9hcGkuZHl0ZS5pbyIsc3RhZ2luZzoiaHR0cHM6Ly9hcGkuZGV2ZWwuZHl0ZS5pbyIscHJvZEFsdGVybmF0ZToiaHR0cHM6Ly9hcGkuY2x1c3Rlci5keXRlLmluIn0sYmFzZVVSSTp7cHJvZDoiZHl0ZS5pbyIsc3RhZ2luZzoiZGV2ZWwuZHl0ZS5pbyJ9fTtmdW5jdGlvbiBpZCh0KXt2YXIgbixzLGk7Y29uc3Qgcj10eXBlb2YgbmF2aWdhdG9yIT0idW5kZWZpbmVkIiYmIW5hdmlnYXRvci5pc1JlYWN0TmF0aXZlJiZ0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmKChuPXdpbmRvdy5sb2NhdGlvbi5ob3N0KT09bnVsbD92b2lkIDA6bi5pbmNsdWRlcyhzZC5iYXNlVVJJLnN0YWdpbmcpKSxlPSEhKChpPShzPXQ9PW51bGw/dm9pZCAwOnQuZ2V0VmFsdWUoIm1vZHVsZXMiKSk9PW51bGw/dm9pZCAwOnMuZGV2VG9vbHMpIT1udWxsJiZpLmxvZ3MpO3JldHVybiByfHxlfWZ1bmN0aW9uIGFkKHQscil7dmFyIGU7aWYodCE9bnVsbCYmdC5nZXRWYWx1ZSgiZmxhZ3NtaXRoIikuaGFzRmVhdHVyZShHdC5MT0dfTEVWRUwpKXtsZXQgbj0oKGU9dC5nZXRWYWx1ZSgiZmxhZ3NtaXRoIikuZ2V0VmFsdWUoR3QuTE9HX0xFVkVMKSk9PW51bGw/dm9pZCAwOmUudG9TdHJpbmcoKSl8fCJhbGwiO2lmKG49bi50b0xvd2VyQ2FzZSgpLnRyaW0oKSxuPT09Im9mZiIpcmV0dXJuITE7aWYobiE9PSJhbGwiKXtjb25zdCBzPVsiZGVidWciLCJsb2ciLCJpbmZvIiwid2FybiIsImVycm9yIl0saT1zLmluZGV4T2YociksYT1zLmluZGV4T2Yobik7aWYoaTxhKXJldHVybiExfX1yZXR1cm4hMH1mdW5jdGlvbiBWbih0LHIsZT17fSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHQpLmZvckVhY2gobj0+e3ZhciBpO2lmKFtudWxsLHZvaWQgMCxOYU5dLmluY2x1ZGVzKHRbbl0pfHxyJiYoKChpPXIubWF0Y2goL1wuL2cpKT09bnVsbD92b2lkIDA6aS5sZW5ndGgpfHwwKT49MTApcmV0dXJuO2NvbnN0IHM9cj9gJHtyfS4ke259YDpuO3R5cGVvZiB0W25dPT0ib2JqZWN0Ij9Wbih0W25dLHMsZSk6WyJudW1iZXIiLCJzdHJpbmciLCJib29sZWFuIl0uaW5jbHVkZXModHlwZW9mIHRbbl0pJiYoZVtzXT10W25dKX0pLGV9ZnVuY3Rpb24gRm4odCxyLGU9e30sbj0iIil7Y29uc3Qgcz17fTt0cnl7Y29uc3QgaT1KU09OLnN0cmluZ2lmeShlKSxhPUpTT04ucGFyc2UoaSksZD1WbihhLG4pLG89SlNPTi5zdHJpbmdpZnkoZCk7cmV0dXJuIEpTT04ucGFyc2Uobyl9Y2F0Y2goaSl7Y29uc3QgYT1SdChpKTtzW2Ake259LmVycm9yLm1lc3NhZ2VgXT1hLm1lc3NhZ2V8fCIiLHNbYCR7bn0uZXJyb3Iuc3RhY2tgXT1hLnN0YWNrfHwiIixzW2Ake259LmVycm9yLnJlYXNvbmBdPWEucmVhc29ufHwiIixzW2Ake259LmVycm9yLnNvdXJjZWBdPSJzYWZlbHlGbGF0dGVuT2JqRm9yT3BlblRlbGVtZXRyeSJ9cmV0dXJuIHN9Y29uc3Qgb2Q9eyJBbWF6b24gU2lsayI6ImFtYXpvbl9zaWxrIiwiQW5kcm9pZCBCcm93c2VyIjoiYW5kcm9pZCIsQmFkYToiYmFkYSIsQmxhY2tCZXJyeToiYmxhY2tiZXJyeSIsQ2hyb21lOiJjaHJvbWUiLENocm9taXVtOiJjaHJvbWl1bSIsRWxlY3Ryb246ImVsZWN0cm9uIixFcGlwaGFueToiZXBpcGhhbnkiLEZpcmVmb3g6ImZpcmVmb3giLEZvY3VzOiJmb2N1cyIsR2VuZXJpYzoiZ2VuZXJpYyIsIkdvb2dsZSBTZWFyY2giOiJnb29nbGVfc2VhcmNoIixHb29nbGVib3Q6Imdvb2dsZWJvdCIsIkludGVybmV0IEV4cGxvcmVyIjoiaWUiLCJLLU1lbGVvbiI6ImtfbWVsZW9uIixNYXh0aG9uOiJtYXh0aG9uIiwiTWljcm9zb2Z0IEVkZ2UiOiJlZGdlIiwiTVogQnJvd3NlciI6Im16IiwiTkFWRVIgV2hhbGUgQnJvd3NlciI6Im5hdmVyIixPcGVyYToib3BlcmEiLCJPcGVyYSBDb2FzdCI6Im9wZXJhX2NvYXN0IixQaGFudG9tSlM6InBoYW50b21qcyIsUHVmZmluOiJwdWZmaW4iLFF1cFppbGxhOiJxdXB6aWxsYSIsUVE6InFxIixRUUxpdGU6InFxbGl0ZSIsU2FmYXJpOiJzYWZhcmkiLFNhaWxmaXNoOiJzYWlsZmlzaCIsIlNhbXN1bmcgSW50ZXJuZXQgZm9yIEFuZHJvaWQiOiJzYW1zdW5nX2ludGVybmV0IixTZWFNb25rZXk6InNlYW1vbmtleSIsU2xlaXBuaXI6InNsZWlwbmlyIixTd2luZzoic3dpbmciLFRpemVuOiJ0aXplbiIsIlVDIEJyb3dzZXIiOiJ1YyIsVml2YWxkaToidml2YWxkaSIsIldlYk9TIEJyb3dzZXIiOiJ3ZWJvcyIsV2VDaGF0OiJ3ZWNoYXQiLCJZYW5kZXggQnJvd3NlciI6InlhbmRleCIsUm9rdToicm9rdSJ9LEJuPXthbWF6b25fc2lsazoiQW1hem9uIFNpbGsiLGFuZHJvaWQ6IkFuZHJvaWQgQnJvd3NlciIsYmFkYToiQmFkYSIsYmxhY2tiZXJyeToiQmxhY2tCZXJyeSIsY2hyb21lOiJDaHJvbWUiLGNocm9taXVtOiJDaHJvbWl1bSIsZWxlY3Ryb246IkVsZWN0cm9uIixlcGlwaGFueToiRXBpcGhhbnkiLGZpcmVmb3g6IkZpcmVmb3giLGZvY3VzOiJGb2N1cyIsZ2VuZXJpYzoiR2VuZXJpYyIsZ29vZ2xlYm90OiJHb29nbGVib3QiLGdvb2dsZV9zZWFyY2g6Ikdvb2dsZSBTZWFyY2giLGllOiJJbnRlcm5ldCBFeHBsb3JlciIsa19tZWxlb246IkstTWVsZW9uIixtYXh0aG9uOiJNYXh0aG9uIixlZGdlOiJNaWNyb3NvZnQgRWRnZSIsbXo6Ik1aIEJyb3dzZXIiLG5hdmVyOiJOQVZFUiBXaGFsZSBCcm93c2VyIixvcGVyYToiT3BlcmEiLG9wZXJhX2NvYXN0OiJPcGVyYSBDb2FzdCIscGhhbnRvbWpzOiJQaGFudG9tSlMiLHB1ZmZpbjoiUHVmZmluIixxdXB6aWxsYToiUXVwWmlsbGEiLHFxOiJRUSBCcm93c2VyIixxcWxpdGU6IlFRIEJyb3dzZXIgTGl0ZSIsc2FmYXJpOiJTYWZhcmkiLHNhaWxmaXNoOiJTYWlsZmlzaCIsc2Ftc3VuZ19pbnRlcm5ldDoiU2Ftc3VuZyBJbnRlcm5ldCBmb3IgQW5kcm9pZCIsc2VhbW9ua2V5OiJTZWFNb25rZXkiLHNsZWlwbmlyOiJTbGVpcG5pciIsc3dpbmc6IlN3aW5nIix0aXplbjoiVGl6ZW4iLHVjOiJVQyBCcm93c2VyIix2aXZhbGRpOiJWaXZhbGRpIix3ZWJvczoiV2ViT1MgQnJvd3NlciIsd2VjaGF0OiJXZUNoYXQiLHlhbmRleDoiWWFuZGV4IEJyb3dzZXIifSxVPXt0YWJsZXQ6InRhYmxldCIsbW9iaWxlOiJtb2JpbGUiLGRlc2t0b3A6ImRlc2t0b3AiLHR2OiJ0diJ9LEc9e1dpbmRvd3NQaG9uZToiV2luZG93cyBQaG9uZSIsV2luZG93czoiV2luZG93cyIsTWFjT1M6Im1hY09TIixpT1M6ImlPUyIsQW5kcm9pZDoiQW5kcm9pZCIsV2ViT1M6IldlYk9TIixCbGFja0JlcnJ5OiJCbGFja0JlcnJ5IixCYWRhOiJCYWRhIixUaXplbjoiVGl6ZW4iLExpbnV4OiJMaW51eCIsQ2hyb21lT1M6IkNocm9tZSBPUyIsUGxheVN0YXRpb240OiJQbGF5U3RhdGlvbiA0IixSb2t1OiJSb2t1In0sb2U9e0VkZ2VIVE1MOiJFZGdlSFRNTCIsQmxpbms6IkJsaW5rIixUcmlkZW50OiJUcmlkZW50IixQcmVzdG86IlByZXN0byIsR2Vja286IkdlY2tvIixXZWJLaXQ6IldlYktpdCJ9O2NsYXNzIGd7c3RhdGljIGdldEZpcnN0TWF0Y2gocixlKXtjb25zdCBuPWUubWF0Y2gocik7cmV0dXJuIG4mJm4ubGVuZ3RoPjAmJm5bMV18fCIifXN0YXRpYyBnZXRTZWNvbmRNYXRjaChyLGUpe2NvbnN0IG49ZS5tYXRjaChyKTtyZXR1cm4gbiYmbi5sZW5ndGg+MSYmblsyXXx8IiJ9c3RhdGljIG1hdGNoQW5kUmV0dXJuQ29uc3QocixlLG4pe2lmKHIudGVzdChlKSlyZXR1cm4gbn1zdGF0aWMgZ2V0V2luZG93c1ZlcnNpb25OYW1lKHIpe3N3aXRjaChyKXtjYXNlIk5UIjpyZXR1cm4iTlQiO2Nhc2UiWFAiOnJldHVybiJYUCI7Y2FzZSJOVCA1LjAiOnJldHVybiIyMDAwIjtjYXNlIk5UIDUuMSI6cmV0dXJuIlhQIjtjYXNlIk5UIDUuMiI6cmV0dXJuIjIwMDMiO2Nhc2UiTlQgNi4wIjpyZXR1cm4iVmlzdGEiO2Nhc2UiTlQgNi4xIjpyZXR1cm4iNyI7Y2FzZSJOVCA2LjIiOnJldHVybiI4IjtjYXNlIk5UIDYuMyI6cmV0dXJuIjguMSI7Y2FzZSJOVCAxMC4wIjpyZXR1cm4iMTAiO2RlZmF1bHQ6cmV0dXJufX1zdGF0aWMgZ2V0TWFjT1NWZXJzaW9uTmFtZShyKXtjb25zdCBlPXIuc3BsaXQoIi4iKS5zcGxpY2UoMCwyKS5tYXAobj0+cGFyc2VJbnQobiwxMCl8fDApO2lmKGUucHVzaCgwKSxlWzBdPT09MTApc3dpdGNoKGVbMV0pe2Nhc2UgNTpyZXR1cm4iTGVvcGFyZCI7Y2FzZSA2OnJldHVybiJTbm93IExlb3BhcmQiO2Nhc2UgNzpyZXR1cm4iTGlvbiI7Y2FzZSA4OnJldHVybiJNb3VudGFpbiBMaW9uIjtjYXNlIDk6cmV0dXJuIk1hdmVyaWNrcyI7Y2FzZSAxMDpyZXR1cm4iWW9zZW1pdGUiO2Nhc2UgMTE6cmV0dXJuIkVsIENhcGl0YW4iO2Nhc2UgMTI6cmV0dXJuIlNpZXJyYSI7Y2FzZSAxMzpyZXR1cm4iSGlnaCBTaWVycmEiO2Nhc2UgMTQ6cmV0dXJuIk1vamF2ZSI7Y2FzZSAxNTpyZXR1cm4iQ2F0YWxpbmEiO2RlZmF1bHQ6cmV0dXJufX1zdGF0aWMgZ2V0QW5kcm9pZFZlcnNpb25OYW1lKHIpe2NvbnN0IGU9ci5zcGxpdCgiLiIpLnNwbGljZSgwLDIpLm1hcChuPT5wYXJzZUludChuLDEwKXx8MCk7aWYoZS5wdXNoKDApLCEoZVswXT09PTEmJmVbMV08NSkpe2lmKGVbMF09PT0xJiZlWzFdPDYpcmV0dXJuIkN1cGNha2UiO2lmKGVbMF09PT0xJiZlWzFdPj02KXJldHVybiJEb251dCI7aWYoZVswXT09PTImJmVbMV08MilyZXR1cm4iRWNsYWlyIjtpZihlWzBdPT09MiYmZVsxXT09PTIpcmV0dXJuIkZyb3lvIjtpZihlWzBdPT09MiYmZVsxXT4yKXJldHVybiJHaW5nZXJicmVhZCI7aWYoZVswXT09PTMpcmV0dXJuIkhvbmV5Y29tYiI7aWYoZVswXT09PTQmJmVbMV08MSlyZXR1cm4iSWNlIENyZWFtIFNhbmR3aWNoIjtpZihlWzBdPT09NCYmZVsxXTw0KXJldHVybiJKZWxseSBCZWFuIjtpZihlWzBdPT09NCYmZVsxXT49NClyZXR1cm4iS2l0S2F0IjtpZihlWzBdPT09NSlyZXR1cm4iTG9sbGlwb3AiO2lmKGVbMF09PT02KXJldHVybiJNYXJzaG1hbGxvdyI7aWYoZVswXT09PTcpcmV0dXJuIk5vdWdhdCI7aWYoZVswXT09PTgpcmV0dXJuIk9yZW8iO2lmKGVbMF09PT05KXJldHVybiJQaWUifX1zdGF0aWMgZ2V0VmVyc2lvblByZWNpc2lvbihyKXtyZXR1cm4gci5zcGxpdCgiLiIpLmxlbmd0aH1zdGF0aWMgY29tcGFyZVZlcnNpb25zKHIsZSxuPSExKXtjb25zdCBzPWcuZ2V0VmVyc2lvblByZWNpc2lvbihyKSxpPWcuZ2V0VmVyc2lvblByZWNpc2lvbihlKTtsZXQgYT1NYXRoLm1heChzLGkpLGQ9MDtjb25zdCBvPWcubWFwKFtyLGVdLGw9Pntjb25zdCBtPWEtZy5nZXRWZXJzaW9uUHJlY2lzaW9uKGwpLHY9bCtuZXcgQXJyYXkobSsxKS5qb2luKCIuMCIpO3JldHVybiBnLm1hcCh2LnNwbGl0KCIuIiksRT0+bmV3IEFycmF5KDIwLUUubGVuZ3RoKS5qb2luKCIwIikrRSkucmV2ZXJzZSgpfSk7Zm9yKG4mJihkPWEtTWF0aC5taW4ocyxpKSksYS09MTthPj1kOyl7aWYob1swXVthXT5vWzFdW2FdKXJldHVybiAxO2lmKG9bMF1bYV09PT1vWzFdW2FdKXtpZihhPT09ZClyZXR1cm4gMDthLT0xfWVsc2UgaWYob1swXVthXTxvWzFdW2FdKXJldHVybi0xfX1zdGF0aWMgbWFwKHIsZSl7Y29uc3Qgbj1bXTtsZXQgcztpZihBcnJheS5wcm90b3R5cGUubWFwKXJldHVybiBBcnJheS5wcm90b3R5cGUubWFwLmNhbGwocixlKTtmb3Iocz0wO3M8ci5sZW5ndGg7cys9MSluLnB1c2goZShyW3NdKSk7cmV0dXJuIG59c3RhdGljIGZpbmQocixlKXtsZXQgbixzO2lmKEFycmF5LnByb3RvdHlwZS5maW5kKXJldHVybiBBcnJheS5wcm90b3R5cGUuZmluZC5jYWxsKHIsZSk7Zm9yKG49MCxzPXIubGVuZ3RoO248cztuKz0xKXtjb25zdCBpPXJbbl07aWYoZShpLG4pKXJldHVybiBpfX1zdGF0aWMgYXNzaWduKHIsLi4uZSl7Y29uc3Qgbj1yO2xldCBzLGk7aWYoT2JqZWN0LmFzc2lnbilyZXR1cm4gT2JqZWN0LmFzc2lnbihyLC4uLmUpO2ZvcihzPTAsaT1lLmxlbmd0aDtzPGk7cys9MSl7Y29uc3QgYT1lW3NdO3R5cGVvZiBhPT0ib2JqZWN0IiYmYSE9PW51bGwmJk9iamVjdC5rZXlzKGEpLmZvckVhY2gobz0+e25bb109YVtvXX0pfXJldHVybiByfXN0YXRpYyBnZXRCcm93c2VyQWxpYXMocil7cmV0dXJuIG9kW3JdfXN0YXRpYyBnZXRCcm93c2VyVHlwZUJ5QWxpYXMocil7cmV0dXJuIEJuW3JdfHwiIn19Y29uc3QgRD0vdmVyc2lvblwvKFxkKyhcLj9fP1xkKykrKS9pLGNkPVt7dGVzdDpbL2dvb2dsZWJvdC9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJHb29nbGVib3QifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvZ29vZ2xlYm90XC8oXGQrKFwuXGQrKSkvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKEQsdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0Olsvb3BlcmEvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiT3BlcmEifSxlPWcuZ2V0Rmlyc3RNYXRjaChELHQpfHxnLmdldEZpcnN0TWF0Y2goLyg/Om9wZXJhKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL29wclwvfG9waW9zL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6Ik9wZXJhIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/Om9wcnxvcGlvcylbXHMvXShcUyspL2ksdCl8fGcuZ2V0Rmlyc3RNYXRjaChELHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL1NhbXN1bmdCcm93c2VyL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IlNhbXN1bmcgSW50ZXJuZXQgZm9yIEFuZHJvaWQifSxlPWcuZ2V0Rmlyc3RNYXRjaChELHQpfHxnLmdldEZpcnN0TWF0Y2goLyg/OlNhbXN1bmdCcm93c2VyKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL1doYWxlL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6Ik5BVkVSIFdoYWxlIEJyb3dzZXIifSxlPWcuZ2V0Rmlyc3RNYXRjaChELHQpfHxnLmdldEZpcnN0TWF0Y2goLyg/OndoYWxlKVtccy9dKFxkKyg/OlwuXGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvTVpCcm93c2VyL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6Ik1aIEJyb3dzZXIifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86TVpCcm93c2VyKVtccy9dKFxkKyg/OlwuXGQrKSspL2ksdCl8fGcuZ2V0Rmlyc3RNYXRjaChELHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL2ZvY3VzL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IkZvY3VzIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/OmZvY3VzKVtccy9dKFxkKyg/OlwuXGQrKSspL2ksdCl8fGcuZ2V0Rmlyc3RNYXRjaChELHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL3N3aW5nL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IlN3aW5nIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/OnN3aW5nKVtccy9dKFxkKyg/OlwuXGQrKSspL2ksdCl8fGcuZ2V0Rmlyc3RNYXRjaChELHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL2NvYXN0L2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6Ik9wZXJhIENvYXN0In0sZT1nLmdldEZpcnN0TWF0Y2goRCx0KXx8Zy5nZXRGaXJzdE1hdGNoKC8oPzpjb2FzdClbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9vcHRcL1xkKyg/Oi4/Xz9cZCspKy9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJPcGVyYSBUb3VjaCJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzpvcHQpW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCl8fGcuZ2V0Rmlyc3RNYXRjaChELHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL3lhYnJvd3Nlci9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJZYW5kZXggQnJvd3NlciJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzp5YWJyb3dzZXIpW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCl8fGcuZ2V0Rmlyc3RNYXRjaChELHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL3VjYnJvd3Nlci9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJVQyBCcm93c2VyIn0sZT1nLmdldEZpcnN0TWF0Y2goRCx0KXx8Zy5nZXRGaXJzdE1hdGNoKC8oPzp1Y2Jyb3dzZXIpW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvTWF4dGhvbnxteGlvcy9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJNYXh0aG9uIn0sZT1nLmdldEZpcnN0TWF0Y2goRCx0KXx8Zy5nZXRGaXJzdE1hdGNoKC8oPzpNYXh0aG9ufG14aW9zKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL2VwaXBoYW55L2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IkVwaXBoYW55In0sZT1nLmdldEZpcnN0TWF0Y2goRCx0KXx8Zy5nZXRGaXJzdE1hdGNoKC8oPzplcGlwaGFueSlbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9wdWZmaW4vaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiUHVmZmluIn0sZT1nLmdldEZpcnN0TWF0Y2goRCx0KXx8Zy5nZXRGaXJzdE1hdGNoKC8oPzpwdWZmaW4pW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0Olsvc2xlaXBuaXIvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiU2xlaXBuaXIifSxlPWcuZ2V0Rmlyc3RNYXRjaChELHQpfHxnLmdldEZpcnN0TWF0Y2goLyg/OnNsZWlwbmlyKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL2stbWVsZW9uL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IkstTWVsZW9uIn0sZT1nLmdldEZpcnN0TWF0Y2goRCx0KXx8Zy5nZXRGaXJzdE1hdGNoKC8oPzprLW1lbGVvbilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9taWNyb21lc3Nlbmdlci9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJXZUNoYXQifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86bWljcm9tZXNzZW5nZXIpW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCl8fGcuZ2V0Rmlyc3RNYXRjaChELHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL3FxYnJvd3Nlci9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOi9xcWJyb3dzZXJsaXRlL2kudGVzdCh0KT8iUVEgQnJvd3NlciBMaXRlIjoiUVEgQnJvd3NlciJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzpxcWJyb3dzZXJsaXRlfHFxYnJvd3NlcilbL10oXGQrKFwuP18/XGQrKSspL2ksdCl8fGcuZ2V0Rmlyc3RNYXRjaChELHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL21zaWV8dHJpZGVudC9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJJbnRlcm5ldCBFeHBsb3JlciJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzptc2llIHxydjopKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL1xzZWRnXC8vaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiTWljcm9zb2Z0IEVkZ2UifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvXHNlZGdcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9lZGcoW2VhXXxpb3MpL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6Ik1pY3Jvc29mdCBFZGdlIn0sZT1nLmdldFNlY29uZE1hdGNoKC9lZGcoW2VhXXxpb3MpXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0Olsvdml2YWxkaS9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJWaXZhbGRpIn0sZT1nLmdldEZpcnN0TWF0Y2goL3ZpdmFsZGlcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9zZWFtb25rZXkvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiU2VhTW9ua2V5In0sZT1nLmdldEZpcnN0TWF0Y2goL3NlYW1vbmtleVwvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL3NhaWxmaXNoL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IlNhaWxmaXNoIn0sZT1nLmdldEZpcnN0TWF0Y2goL3NhaWxmaXNoXHM/YnJvd3NlclwvKFxkKyhcLlxkKyk/KS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL3NpbGsvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiQW1hem9uIFNpbGsifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvc2lsa1wvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL3BoYW50b20vaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiUGhhbnRvbUpTIn0sZT1nLmdldEZpcnN0TWF0Y2goL3BoYW50b21qc1wvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL3NsaW1lcmpzL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IlNsaW1lckpTIn0sZT1nLmdldEZpcnN0TWF0Y2goL3NsaW1lcmpzXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvYmxhY2tiZXJyeXxcYmJiXGQrL2ksL3JpbVxzdGFibGV0L2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IkJsYWNrQmVycnkifSxlPWcuZ2V0Rmlyc3RNYXRjaChELHQpfHxnLmdldEZpcnN0TWF0Y2goL2JsYWNrYmVycnlbXGRdK1wvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbLyh3ZWJ8aHB3KVtvMF1zL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IldlYk9TIEJyb3dzZXIifSxlPWcuZ2V0Rmlyc3RNYXRjaChELHQpfHxnLmdldEZpcnN0TWF0Y2goL3coPzplYik/W28wXXNicm93c2VyXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvYmFkYS9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJCYWRhIn0sZT1nLmdldEZpcnN0TWF0Y2goL2RvbGZpblwvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL3RpemVuL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IlRpemVuIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/OnRpemVuXHM/KT9icm93c2VyXC8oXGQrKFwuP18/XGQrKSspL2ksdCl8fGcuZ2V0Rmlyc3RNYXRjaChELHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL3F1cHppbGxhL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IlF1cFppbGxhIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/OnF1cHppbGxhKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9maXJlZm94fGljZXdlYXNlbHxmeGlvcy9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJGaXJlZm94In0sZT1nLmdldEZpcnN0TWF0Y2goLyg/OmZpcmVmb3h8aWNld2Vhc2VsfGZ4aW9zKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL2VsZWN0cm9uL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IkVsZWN0cm9uIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/OmVsZWN0cm9uKVwvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL01pdWlCcm93c2VyL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6Ik1pdWkifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86TWl1aUJyb3dzZXIpW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvY2hyb21pdW0vaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiQ2hyb21pdW0ifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86Y2hyb21pdW0pW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCl8fGcuZ2V0Rmlyc3RNYXRjaChELHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL2Nocm9tZXxjcmlvc3xjcm1vL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IkNocm9tZSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzpjaHJvbWV8Y3Jpb3N8Y3JtbylcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9HU0EvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiR29vZ2xlIFNlYXJjaCJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzpHU0EpXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0KHQpe2NvbnN0IHI9IXQudGVzdCgvbGlrZSBhbmRyb2lkL2kpLGU9dC50ZXN0KC9hbmRyb2lkL2kpO3JldHVybiByJiZlfSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJBbmRyb2lkIEJyb3dzZXIifSxlPWcuZ2V0Rmlyc3RNYXRjaChELHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL3BsYXlzdGF0aW9uIDQvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiUGxheVN0YXRpb24gNCJ9LGU9Zy5nZXRGaXJzdE1hdGNoKEQsdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0Olsvc2FmYXJpfGFwcGxld2Via2l0L2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IlNhZmFyaSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKEQsdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvLiovaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj0vXiguKilcLyguKikgLyxlPS9eKC4qKVwvKC4qKVsgXHRdXCgoLiopLyxzPXQuc2VhcmNoKCJcXCgiKSE9PS0xP2U6cjtyZXR1cm57bmFtZTpnLmdldEZpcnN0TWF0Y2gocyx0KSx2ZXJzaW9uOmcuZ2V0U2Vjb25kTWF0Y2gocyx0KX19fV07dmFyIGRkPVt7dGVzdDpbL1Jva3VcL0RWUC9dLGRlc2NyaWJlKHQpe2NvbnN0IHI9Zy5nZXRGaXJzdE1hdGNoKC9Sb2t1XC9EVlAtKFxkK1wuXGQrKS9pLHQpO3JldHVybntuYW1lOkcuUm9rdSx2ZXJzaW9uOnJ9fX0se3Rlc3Q6Wy93aW5kb3dzIHBob25lL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9Zy5nZXRGaXJzdE1hdGNoKC93aW5kb3dzIHBob25lICg/Om9zKT9ccz8oXGQrKFwuXGQrKSopL2ksdCk7cmV0dXJue25hbWU6Ry5XaW5kb3dzUGhvbmUsdmVyc2lvbjpyfX19LHt0ZXN0Olsvd2luZG93cyAvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj1nLmdldEZpcnN0TWF0Y2goL1dpbmRvd3MgKChOVHxYUCkoIFxkXGQ/LlxkKT8pL2ksdCksZT1nLmdldFdpbmRvd3NWZXJzaW9uTmFtZShyKTtyZXR1cm57bmFtZTpHLldpbmRvd3MsdmVyc2lvbjpyLHZlcnNpb25OYW1lOmV9fX0se3Rlc3Q6Wy9NYWNpbnRvc2goLio/KSBGeGlPUyguKj8pXC8vXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOkcuaU9TfSxlPWcuZ2V0U2Vjb25kTWF0Y2goLyhWZXJzaW9uXC8pKFxkW1xkLl0rKS8sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvbWFjaW50b3NoL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9Zy5nZXRGaXJzdE1hdGNoKC9tYWMgb3MgeCAoXGQrKFwuP18/XGQrKSspL2ksdCkucmVwbGFjZSgvW19cc10vZywiLiIpLGU9Zy5nZXRNYWNPU1ZlcnNpb25OYW1lKHIpLG49e25hbWU6Ry5NYWNPUyx2ZXJzaW9uOnJ9O3JldHVybiBlJiYobi52ZXJzaW9uTmFtZT1lKSxufX0se3Rlc3Q6Wy8oaXBvZHxpcGhvbmV8aXBhZCkvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj1nLmdldEZpcnN0TWF0Y2goL29zIChcZCsoW19cc11cZCspKikgbGlrZSBtYWMgb3MgeC9pLHQpLnJlcGxhY2UoL1tfXHNdL2csIi4iKTtyZXR1cm57bmFtZTpHLmlPUyx2ZXJzaW9uOnJ9fX0se3Rlc3QodCl7Y29uc3Qgcj0hdC50ZXN0KC9saWtlIGFuZHJvaWQvaSksZT10LnRlc3QoL2FuZHJvaWQvaSk7cmV0dXJuIHImJmV9LGRlc2NyaWJlKHQpe2NvbnN0IHI9Zy5nZXRGaXJzdE1hdGNoKC9hbmRyb2lkW1xzLy1dKFxkKyhcLlxkKykqKS9pLHQpLGU9Zy5nZXRBbmRyb2lkVmVyc2lvbk5hbWUociksbj17bmFtZTpHLkFuZHJvaWQsdmVyc2lvbjpyfTtyZXR1cm4gZSYmKG4udmVyc2lvbk5hbWU9ZSksbn19LHt0ZXN0OlsvKHdlYnxocHcpW28wXXMvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj1nLmdldEZpcnN0TWF0Y2goLyg/OndlYnxocHcpW28wXXNcLyhcZCsoXC5cZCspKikvaSx0KSxlPXtuYW1lOkcuV2ViT1N9O3JldHVybiByJiZyLmxlbmd0aCYmKGUudmVyc2lvbj1yKSxlfX0se3Rlc3Q6Wy9ibGFja2JlcnJ5fFxiYmJcZCsvaSwvcmltXHN0YWJsZXQvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj1nLmdldEZpcnN0TWF0Y2goL3JpbVxzdGFibGV0XHNvc1xzKFxkKyhcLlxkKykqKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goL2JsYWNrYmVycnlcZCtcLyhcZCsoW19cc11cZCspKikvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKC9cYmJiKFxkKykvaSx0KTtyZXR1cm57bmFtZTpHLkJsYWNrQmVycnksdmVyc2lvbjpyfX19LHt0ZXN0OlsvYmFkYS9pXSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvYmFkYVwvKFxkKyhcLlxkKykqKS9pLHQpO3JldHVybntuYW1lOkcuQmFkYSx2ZXJzaW9uOnJ9fX0se3Rlc3Q6Wy90aXplbi9pXSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvdGl6ZW5bL1xzXShcZCsoXC5cZCspKikvaSx0KTtyZXR1cm57bmFtZTpHLlRpemVuLHZlcnNpb246cn19fSx7dGVzdDpbL2xpbnV4L2ldLGRlc2NyaWJlKCl7cmV0dXJue25hbWU6Ry5MaW51eH19fSx7dGVzdDpbL0NyT1MvXSxkZXNjcmliZSgpe3JldHVybntuYW1lOkcuQ2hyb21lT1N9fX0se3Rlc3Q6Wy9QbGF5U3RhdGlvbiA0L10sZGVzY3JpYmUodCl7Y29uc3Qgcj1nLmdldEZpcnN0TWF0Y2goL1BsYXlTdGF0aW9uIDRbL1xzXShcZCsoXC5cZCspKikvaSx0KTtyZXR1cm57bmFtZTpHLlBsYXlTdGF0aW9uNCx2ZXJzaW9uOnJ9fX1dLGxkPVt7dGVzdDpbL2dvb2dsZWJvdC9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOiJib3QiLHZlbmRvcjoiR29vZ2xlIn19fSx7dGVzdDpbL2h1YXdlaS9pXSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvKGNhbi1sMDEpL2ksdCkmJiJOb3ZhIixlPXt0eXBlOlUubW9iaWxlLHZlbmRvcjoiSHVhd2VpIn07cmV0dXJuIHImJihlLm1vZGVsPXIpLGV9fSx7dGVzdDpbL25leHVzXHMqKD86N3w4fDl8MTApLiovaV0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpVLnRhYmxldCx2ZW5kb3I6Ik5leHVzIn19fSx7dGVzdDpbL2lwYWQvaV0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpVLnRhYmxldCx2ZW5kb3I6IkFwcGxlIixtb2RlbDoiaVBhZCJ9fX0se3Rlc3Q6Wy9NYWNpbnRvc2goLio/KSBGeGlPUyguKj8pXC8vXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOlUudGFibGV0LHZlbmRvcjoiQXBwbGUiLG1vZGVsOiJpUGFkIn19fSx7dGVzdDpbL2tmdHQgYnVpbGQvaV0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpVLnRhYmxldCx2ZW5kb3I6IkFtYXpvbiIsbW9kZWw6IktpbmRsZSBGaXJlIEhEIDcifX19LHt0ZXN0Olsvc2lsay9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOlUudGFibGV0LHZlbmRvcjoiQW1hem9uIn19fSx7dGVzdDpbL3RhYmxldCg/ISBwYykvaV0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpVLnRhYmxldH19fSx7dGVzdCh0KXtjb25zdCByPXQudGVzdCgvaXBvZHxpcGhvbmUvaSksZT10LnRlc3QoL2xpa2UgKGlwb2R8aXBob25lKS9pKTtyZXR1cm4gciYmIWV9LGRlc2NyaWJlKHQpe2NvbnN0IHI9Zy5nZXRGaXJzdE1hdGNoKC8oaXBvZHxpcGhvbmUpL2ksdCk7cmV0dXJue3R5cGU6VS5tb2JpbGUsdmVuZG9yOiJBcHBsZSIsbW9kZWw6cn19fSx7dGVzdDpbL25leHVzXHMqWzAtNl0uKi9pLC9nYWxheHkgbmV4dXMvaV0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpVLm1vYmlsZSx2ZW5kb3I6Ik5leHVzIn19fSx7dGVzdDpbL1teLV1tb2JpL2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6VS5tb2JpbGV9fX0se3Rlc3QodCl7cmV0dXJuIHQuZ2V0QnJvd3Nlck5hbWUoITApPT09ImJsYWNrYmVycnkifSxkZXNjcmliZSgpe3JldHVybnt0eXBlOlUubW9iaWxlLHZlbmRvcjoiQmxhY2tCZXJyeSJ9fX0se3Rlc3QodCl7cmV0dXJuIHQuZ2V0QnJvd3Nlck5hbWUoITApPT09ImJhZGEifSxkZXNjcmliZSgpe3JldHVybnt0eXBlOlUubW9iaWxlfX19LHt0ZXN0KHQpe3JldHVybiB0LmdldEJyb3dzZXJOYW1lKCk9PT0id2luZG93cyBwaG9uZSJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6VS5tb2JpbGUsdmVuZG9yOiJNaWNyb3NvZnQifX19LHt0ZXN0KHQpe2NvbnN0IHI9TnVtYmVyKFN0cmluZyh0LmdldE9TVmVyc2lvbigpKS5zcGxpdCgiLiIpWzBdKTtyZXR1cm4gdC5nZXRPU05hbWUoITApPT09ImFuZHJvaWQiJiZyPj0zfSxkZXNjcmliZSgpe3JldHVybnt0eXBlOlUudGFibGV0fX19LHt0ZXN0KHQpe3JldHVybiB0LmdldE9TTmFtZSghMCk9PT0iYW5kcm9pZCJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6VS5tb2JpbGV9fX0se3Rlc3QodCl7cmV0dXJuIHQuZ2V0T1NOYW1lKCEwKT09PSJtYWNvcyJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6VS5kZXNrdG9wLHZlbmRvcjoiQXBwbGUifX19LHt0ZXN0KHQpe3JldHVybiB0LmdldE9TTmFtZSghMCk9PT0id2luZG93cyJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6VS5kZXNrdG9wfX19LHt0ZXN0KHQpe3JldHVybiB0LmdldE9TTmFtZSghMCk9PT0ibGludXgifSxkZXNjcmliZSgpe3JldHVybnt0eXBlOlUuZGVza3RvcH19fSx7dGVzdCh0KXtyZXR1cm4gdC5nZXRPU05hbWUoITApPT09InBsYXlzdGF0aW9uIDQifSxkZXNjcmliZSgpe3JldHVybnt0eXBlOlUudHZ9fX0se3Rlc3QodCl7cmV0dXJuIHQuZ2V0T1NOYW1lKCEwKT09PSJyb2t1In0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpVLnR2fX19XSx1ZD1be3Rlc3QodCl7cmV0dXJuIHQuZ2V0QnJvd3Nlck5hbWUoITApPT09Im1pY3Jvc29mdCBlZGdlIn0sZGVzY3JpYmUodCl7aWYoL1xzZWRnXC8vaS50ZXN0KHQpKXJldHVybntuYW1lOm9lLkJsaW5rfTtjb25zdCBlPWcuZ2V0Rmlyc3RNYXRjaCgvZWRnZVwvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybntuYW1lOm9lLkVkZ2VIVE1MLHZlcnNpb246ZX19fSx7dGVzdDpbL3RyaWRlbnQvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZTpvZS5UcmlkZW50fSxlPWcuZ2V0Rmlyc3RNYXRjaCgvdHJpZGVudFwvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdCh0KXtyZXR1cm4gdC50ZXN0KC9wcmVzdG8vaSl9LGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6b2UuUHJlc3RvfSxlPWcuZ2V0Rmlyc3RNYXRjaCgvcHJlc3RvXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0KHQpe2NvbnN0IHI9dC50ZXN0KC9nZWNrby9pKSxlPXQudGVzdCgvbGlrZSBnZWNrby9pKTtyZXR1cm4gciYmIWV9LGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6b2UuR2Vja299LGU9Zy5nZXRGaXJzdE1hdGNoKC9nZWNrb1wvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbLyhhcHBsZSk/d2Via2l0XC81MzdcLjM2L2ldLGRlc2NyaWJlKCl7cmV0dXJue25hbWU6b2UuQmxpbmt9fX0se3Rlc3Q6Wy8oYXBwbGUpP3dlYmtpdC9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOm9lLldlYktpdH0sZT1nLmdldEZpcnN0TWF0Y2goL3dlYmtpdFwvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fV07Y2xhc3MgeG57Y29uc3RydWN0b3IocixlPSExKXtpZihyPT1udWxsfHxyPT09IiIpdGhyb3cgbmV3IEVycm9yKCJVc2VyQWdlbnQgcGFyYW1ldGVyIGNhbid0IGJlIGVtcHR5Iik7dGhpcy5fdWE9cix0aGlzLnBhcnNlZFJlc3VsdD17fSxlIT09ITAmJnRoaXMucGFyc2UoKX1nZXRVQSgpe3JldHVybiB0aGlzLl91YX10ZXN0KHIpe3JldHVybiByLnRlc3QodGhpcy5fdWEpfXBhcnNlQnJvd3Nlcigpe3RoaXMucGFyc2VkUmVzdWx0LmJyb3dzZXI9e307Y29uc3Qgcj1nLmZpbmQoY2QsZT0+e2lmKHR5cGVvZiBlLnRlc3Q9PSJmdW5jdGlvbiIpcmV0dXJuIGUudGVzdCh0aGlzKTtpZihlLnRlc3QgaW5zdGFuY2VvZiBBcnJheSlyZXR1cm4gZS50ZXN0LnNvbWUobj0+dGhpcy50ZXN0KG4pKTt0aHJvdyBuZXcgRXJyb3IoIkJyb3dzZXIncyB0ZXN0IGZ1bmN0aW9uIGlzIG5vdCB2YWxpZCIpfSk7cmV0dXJuIHImJih0aGlzLnBhcnNlZFJlc3VsdC5icm93c2VyPXIuZGVzY3JpYmUodGhpcy5nZXRVQSgpKSksdGhpcy5wYXJzZWRSZXN1bHQuYnJvd3Nlcn1nZXRCcm93c2VyKCl7cmV0dXJuIHRoaXMucGFyc2VkUmVzdWx0LmJyb3dzZXI/dGhpcy5wYXJzZWRSZXN1bHQuYnJvd3Nlcjp0aGlzLnBhcnNlQnJvd3NlcigpfWdldEJyb3dzZXJOYW1lKHIpe3JldHVybiByP1N0cmluZyh0aGlzLmdldEJyb3dzZXIoKS5uYW1lKS50b0xvd2VyQ2FzZSgpfHwiIjp0aGlzLmdldEJyb3dzZXIoKS5uYW1lfHwiIn1nZXRCcm93c2VyVmVyc2lvbigpe3JldHVybiB0aGlzLmdldEJyb3dzZXIoKS52ZXJzaW9ufWdldE9TKCl7cmV0dXJuIHRoaXMucGFyc2VkUmVzdWx0Lm9zP3RoaXMucGFyc2VkUmVzdWx0Lm9zOnRoaXMucGFyc2VPUygpfXBhcnNlT1MoKXt0aGlzLnBhcnNlZFJlc3VsdC5vcz17fTtjb25zdCByPWcuZmluZChkZCxlPT57aWYodHlwZW9mIGUudGVzdD09ImZ1bmN0aW9uIilyZXR1cm4gZS50ZXN0KHRoaXMpO2lmKGUudGVzdCBpbnN0YW5jZW9mIEFycmF5KXJldHVybiBlLnRlc3Quc29tZShuPT50aGlzLnRlc3QobikpO3Rocm93IG5ldyBFcnJvcigiQnJvd3NlcidzIHRlc3QgZnVuY3Rpb24gaXMgbm90IHZhbGlkIil9KTtyZXR1cm4gciYmKHRoaXMucGFyc2VkUmVzdWx0Lm9zPXIuZGVzY3JpYmUodGhpcy5nZXRVQSgpKSksdGhpcy5wYXJzZWRSZXN1bHQub3N9Z2V0T1NOYW1lKHIpe2NvbnN0e25hbWU6ZX09dGhpcy5nZXRPUygpO3JldHVybiByP1N0cmluZyhlKS50b0xvd2VyQ2FzZSgpfHwiIjplfHwiIn1nZXRPU1ZlcnNpb24oKXtyZXR1cm4gdGhpcy5nZXRPUygpLnZlcnNpb259Z2V0UGxhdGZvcm0oKXtyZXR1cm4gdGhpcy5wYXJzZWRSZXN1bHQucGxhdGZvcm0/dGhpcy5wYXJzZWRSZXN1bHQucGxhdGZvcm06dGhpcy5wYXJzZVBsYXRmb3JtKCl9Z2V0UGxhdGZvcm1UeXBlKHI9ITEpe2NvbnN0e3R5cGU6ZX09dGhpcy5nZXRQbGF0Zm9ybSgpO3JldHVybiByP1N0cmluZyhlKS50b0xvd2VyQ2FzZSgpfHwiIjplfHwiIn1wYXJzZVBsYXRmb3JtKCl7dGhpcy5wYXJzZWRSZXN1bHQucGxhdGZvcm09e307Y29uc3Qgcj1nLmZpbmQobGQsZT0+e2lmKHR5cGVvZiBlLnRlc3Q9PSJmdW5jdGlvbiIpcmV0dXJuIGUudGVzdCh0aGlzKTtpZihlLnRlc3QgaW5zdGFuY2VvZiBBcnJheSlyZXR1cm4gZS50ZXN0LnNvbWUobj0+dGhpcy50ZXN0KG4pKTt0aHJvdyBuZXcgRXJyb3IoIkJyb3dzZXIncyB0ZXN0IGZ1bmN0aW9uIGlzIG5vdCB2YWxpZCIpfSk7cmV0dXJuIHImJih0aGlzLnBhcnNlZFJlc3VsdC5wbGF0Zm9ybT1yLmRlc2NyaWJlKHRoaXMuZ2V0VUEoKSkpLHRoaXMucGFyc2VkUmVzdWx0LnBsYXRmb3JtfWdldEVuZ2luZSgpe3JldHVybiB0aGlzLnBhcnNlZFJlc3VsdC5lbmdpbmU/dGhpcy5wYXJzZWRSZXN1bHQuZW5naW5lOnRoaXMucGFyc2VFbmdpbmUoKX1nZXRFbmdpbmVOYW1lKHIpe3JldHVybiByP1N0cmluZyh0aGlzLmdldEVuZ2luZSgpLm5hbWUpLnRvTG93ZXJDYXNlKCl8fCIiOnRoaXMuZ2V0RW5naW5lKCkubmFtZXx8IiJ9cGFyc2VFbmdpbmUoKXt0aGlzLnBhcnNlZFJlc3VsdC5lbmdpbmU9e307Y29uc3Qgcj1nLmZpbmQodWQsZT0+e2lmKHR5cGVvZiBlLnRlc3Q9PSJmdW5jdGlvbiIpcmV0dXJuIGUudGVzdCh0aGlzKTtpZihlLnRlc3QgaW5zdGFuY2VvZiBBcnJheSlyZXR1cm4gZS50ZXN0LnNvbWUobj0+dGhpcy50ZXN0KG4pKTt0aHJvdyBuZXcgRXJyb3IoIkJyb3dzZXIncyB0ZXN0IGZ1bmN0aW9uIGlzIG5vdCB2YWxpZCIpfSk7cmV0dXJuIHImJih0aGlzLnBhcnNlZFJlc3VsdC5lbmdpbmU9ci5kZXNjcmliZSh0aGlzLmdldFVBKCkpKSx0aGlzLnBhcnNlZFJlc3VsdC5lbmdpbmV9cGFyc2UoKXtyZXR1cm4gdGhpcy5wYXJzZUJyb3dzZXIoKSx0aGlzLnBhcnNlT1MoKSx0aGlzLnBhcnNlUGxhdGZvcm0oKSx0aGlzLnBhcnNlRW5naW5lKCksdGhpc31nZXRSZXN1bHQoKXtyZXR1cm4gZy5hc3NpZ24oe30sdGhpcy5wYXJzZWRSZXN1bHQpfXNhdGlzZmllcyhyKXtjb25zdCBlPXt9O2xldCBuPTA7Y29uc3Qgcz17fTtsZXQgaT0wO2lmKE9iamVjdC5rZXlzKHIpLmZvckVhY2goZD0+e2NvbnN0IG89cltkXTt0eXBlb2Ygbz09InN0cmluZyI/KHNbZF09byxpKz0xKTp0eXBlb2Ygbz09Im9iamVjdCImJihlW2RdPW8sbis9MSl9KSxuPjApe2NvbnN0IGQ9T2JqZWN0LmtleXMoZSksbz1nLmZpbmQoZCxtPT50aGlzLmlzT1MobSkpO2lmKG8pe2NvbnN0IG09dGhpcy5zYXRpc2ZpZXMoZVtvXSk7aWYobSE9PXZvaWQgMClyZXR1cm4gbX1jb25zdCBsPWcuZmluZChkLG09PnRoaXMuaXNQbGF0Zm9ybShtKSk7aWYobCl7Y29uc3QgbT10aGlzLnNhdGlzZmllcyhlW2xdKTtpZihtIT09dm9pZCAwKXJldHVybiBtfX1pZihpPjApe2NvbnN0IGQ9T2JqZWN0LmtleXMocyksbz1nLmZpbmQoZCxsPT50aGlzLmlzQnJvd3NlcihsLCEwKSk7aWYobyE9PXZvaWQgMClyZXR1cm4gdGhpcy5jb21wYXJlVmVyc2lvbihzW29dKX19aXNCcm93c2VyKHIsZT0hMSl7Y29uc3Qgbj10aGlzLmdldEJyb3dzZXJOYW1lKCkudG9Mb3dlckNhc2UoKTtsZXQgcz1yLnRvTG93ZXJDYXNlKCk7Y29uc3QgaT1nLmdldEJyb3dzZXJUeXBlQnlBbGlhcyhzKTtyZXR1cm4gZSYmaSYmKHM9aS50b0xvd2VyQ2FzZSgpKSxzPT09bn1jb21wYXJlVmVyc2lvbihyKXtsZXQgZT1bMF0sbj1yLHM9ITE7Y29uc3QgaT10aGlzLmdldEJyb3dzZXJWZXJzaW9uKCk7aWYodHlwZW9mIGk9PSJzdHJpbmciKXJldHVybiByWzBdPT09Ij4ifHxyWzBdPT09IjwiPyhuPXIuc3Vic3RyKDEpLHJbMV09PT0iPSI/KHM9ITAsbj1yLnN1YnN0cigyKSk6ZT1bXSxyWzBdPT09Ij4iP2UucHVzaCgxKTplLnB1c2goLTEpKTpyWzBdPT09Ij0iP249ci5zdWJzdHIoMSk6clswXT09PSJ+IiYmKHM9ITAsbj1yLnN1YnN0cigxKSksZS5pbmRleE9mKGcuY29tcGFyZVZlcnNpb25zKGksbixzKSk+LTF9aXNPUyhyKXtyZXR1cm4gdGhpcy5nZXRPU05hbWUoITApPT09U3RyaW5nKHIpLnRvTG93ZXJDYXNlKCl9aXNQbGF0Zm9ybShyKXtyZXR1cm4gdGhpcy5nZXRQbGF0Zm9ybVR5cGUoITApPT09U3RyaW5nKHIpLnRvTG93ZXJDYXNlKCl9aXNFbmdpbmUocil7cmV0dXJuIHRoaXMuZ2V0RW5naW5lTmFtZSghMCk9PT1TdHJpbmcocikudG9Mb3dlckNhc2UoKX1pcyhyLGU9ITEpe3JldHVybiB0aGlzLmlzQnJvd3NlcihyLGUpfHx0aGlzLmlzT1Mocil8fHRoaXMuaXNQbGF0Zm9ybShyKX1zb21lKHI9W10pe3JldHVybiByLnNvbWUoZT0+dGhpcy5pcyhlKSl9fS8qIQogKiBCb3dzZXIgLSBhIGJyb3dzZXIgZGV0ZWN0b3IKICogaHR0cHM6Ly9naXRodWIuY29tL2xhbmNlZGlrc29uL2Jvd3NlcgogKiBNSVQgTGljZW5zZSB8IChjKSBEdXN0aW4gRGlheiAyMDEyLTIwMTUKICogTUlUIExpY2Vuc2UgfCAoYykgRGVuaXMgRGVtY2hlbmtvIDIwMTUtMjAxOQogKi9jbGFzcyBwZHtzdGF0aWMgZ2V0UGFyc2VyKHIsZT0hMSl7aWYodHlwZW9mIHIhPSJzdHJpbmciKXRocm93IG5ldyBFcnJvcigiVXNlckFnZW50IHNob3VsZCBiZSBhIHN0cmluZyIpO3JldHVybiBuZXcgeG4ocixlKX1zdGF0aWMgcGFyc2Uocil7cmV0dXJuIG5ldyB4bihyKS5nZXRSZXN1bHQoKX1zdGF0aWMgZ2V0IEJST1dTRVJfTUFQKCl7cmV0dXJuIEJufXN0YXRpYyBnZXQgRU5HSU5FX01BUCgpe3JldHVybiBvZX1zdGF0aWMgZ2V0IE9TX01BUCgpe3JldHVybiBHfXN0YXRpYyBnZXQgUExBVEZPUk1TX01BUCgpe3JldHVybiBVfX1jb25zdCBOZT0iY2hyb21lIixqbj0ib3BlcmEiLFVuPSJmaXJlZm94Iiwkbj0iaWV4cGxvcmVyIixIbj0ic2FmYXJpIixLbj0ibndqcyIsV249ImVsZWN0cm9uIix6bj0icmVhY3QtbmF0aXZlIixxdD0idW5rbm93biIsUHQ9e0Nocm9tZTpOZSxDaHJvbWl1bTpOZSxPcGVyYTpqbixGaXJlZm94OlVuLCJJbnRlcm5ldCBFeHBsb3JlciI6JG4sU2FmYXJpOkhufTtmdW5jdGlvbiBoZCgpe2NvbnN0e3VzZXJBZ2VudDp0fT1uYXZpZ2F0b3Iscj17bmFtZTpxdCx2ZXJzaW9uOnZvaWQgMH07aWYodC5tYXRjaCgvQ2hyb21lLykmJiF0Lm1hdGNoKC9FZGdlLykpaWYodC5tYXRjaCgvRWRnKEE/KS8pKXtjb25zdCBlPXQubWF0Y2goL0Nocm9tZVwvKFtcZC5dKykvKVsxXTtOdW1iZXIucGFyc2VJbnQoZSwxMCk+NzImJihyLm5hbWU9TmUsci52ZXJzaW9uPWUpfWVsc2Ugci5uYW1lPU5lLHIudmVyc2lvbj10Lm1hdGNoKC9DaHJvbWVcLyhbXGQuXSspLylbMV07cmV0dXJuIHJ9ZnVuY3Rpb24gZmQoKXtjb25zdHt1c2VyQWdlbnQ6dH09bmF2aWdhdG9yO2lmKHQubWF0Y2goL0VsZWN0cm9uLykpe2NvbnN0IHI9dC5tYXRjaCgvRWxlY3Ryb25cLyhbXGQuXSspLylbMV07cmV0dXJue25hbWU6V24sdmVyc2lvbjpyfX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBtZCgpe2NvbnN0e3VzZXJBZ2VudDp0fT1uYXZpZ2F0b3I7aWYodC5tYXRjaCgvSml0c2lNZWV0TlcvKSl7Y29uc3Qgcj10Lm1hdGNoKC9KaXRzaU1lZXROV1wvKFtcZC5dKykvKVsxXTtyZXR1cm57bmFtZTpLbix2ZXJzaW9uOnJ9fX1mdW5jdGlvbiBnZCgpe2NvbnN0IHQ9bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvXGIocmVhY3RbIFx0Xy1dKm5hdGl2ZSkoPzpcLyhcUyspKT8vaSk7bGV0IHI7aWYodHx8bmF2aWdhdG9yLnByb2R1Y3Q9PT0iUmVhY3ROYXRpdmUiKXJldHVybiB0JiZ0Lmxlbmd0aD4yJiYodFsxXSxyPXRbMl0pLHJ8fChyPSJ1bmtub3duIikse25hbWU6em4sdmVyc2lvbjpyfX1mdW5jdGlvbiBTZCh0KXtsZXQgcjtjb25zdCBlPVtnZCxmZCxtZF07Zm9yKGxldCBzPTA7czxlLmxlbmd0aDtzKz0xKWlmKHI9ZVtzXSgpLHIpcmV0dXJuIHI7Y29uc3Qgbj10LmdldEJyb3dzZXJOYW1lKCk7cmV0dXJuIG4gaW4gUHQ/e25hbWU6UHRbbl0sdmVyc2lvbjp0LmdldEJyb3dzZXJWZXJzaW9uKCl9OihyPWhkKCkscnx8e25hbWU6cXQsdmVyc2lvbjp2b2lkIDB9KX1jbGFzcyB2ZHtjb25zdHJ1Y3Rvcigpe3AodGhpcywiX2Jvd3NlciIpO3AodGhpcywiX25hbWUiKTtwKHRoaXMsIl92ZXJzaW9uIik7cCh0aGlzLCJnZXREZXZpY2VJbmZvIiwoKT0+KHtpc01vYmlsZTp0aGlzLmlzTW9iaWxlKCksYnJvd3Nlck5hbWU6dGhpcy5fYm93c2VyLmdldEJyb3dzZXJOYW1lKCksb3NOYW1lOnRoaXMuX2Jvd3Nlci5nZXRPU05hbWUoKSxicm93c2VyVmVyc2lvbjp0aGlzLl9ib3dzZXIuZ2V0QnJvd3NlclZlcnNpb24oKSxvc1ZlcnNpb25OYW1lOnRoaXMuX2Jvd3Nlci5nZXRPU1ZlcnNpb24oKSxlbmdpbmVOYW1lOnRoaXMuX2Jvd3Nlci5nZXRFbmdpbmVOYW1lKCl9KSl9aW5pdChyKXtsZXQgZSxuO2lmKHRoaXMuX2Jvd3Nlcj1wZC5nZXRQYXJzZXIobmF2aWdhdG9yLnVzZXJBZ2VudCksdHlwZW9mIHI9PSJ1bmRlZmluZWQiKXtjb25zdCBzPVNkKHRoaXMuX2Jvd3Nlcik7ZT1zLm5hbWUsbj1zLnZlcnNpb259ZWxzZSByLm5hbWUgaW4gUHQ/KGU9UHRbci5uYW1lXSxuPXIudmVyc2lvbik6KGU9cXQsbj12b2lkIDApO3RoaXMuX25hbWU9ZSx0aGlzLl92ZXJzaW9uPW59Z2V0TmFtZSgpe3JldHVybiB0aGlzLl9uYW1lfWlzQ2hyb21lKCl7cmV0dXJuIHRoaXMuX25hbWU9PT1OZX1pc09wZXJhKCl7cmV0dXJuIHRoaXMuX25hbWU9PT1qbn1pc0ZpcmVmb3goKXtyZXR1cm4gdGhpcy5fbmFtZT09PVVufWlzSUV4cGxvcmVyKCl7cmV0dXJuIHRoaXMuX25hbWU9PT0kbn1pc1NhZmFyaSgpe3JldHVybiB0aGlzLl9uYW1lPT09SG59aXNOV0pTKCl7cmV0dXJuIHRoaXMuX25hbWU9PT1Lbn1pc0VsZWN0cm9uKCl7cmV0dXJuIHRoaXMuX25hbWU9PT1Xbn1pc1JlYWN0TmF0aXZlKCl7cmV0dXJuIHRoaXMuX25hbWU9PT16bnx8bmF2aWdhdG9yLmlzUmVhY3ROYXRpdmU9PT0hMH1nZXRWZXJzaW9uKCl7cmV0dXJuIHRoaXMuX3ZlcnNpb259aXNNb2JpbGUoKXtyZXR1cm4gdGhpcy5fYm93c2VyLmdldFBsYXRmb3JtVHlwZSgpPT09Im1vYmlsZSJ9X2NoZWNrQ29uZGl0aW9uKHIpe2lmKHRoaXMuX3ZlcnNpb24pcmV0dXJuIHRoaXMuX2Jvd3Nlci5zYXRpc2ZpZXMocil9aXNWZXJzaW9uR3JlYXRlclRoYW4ocil7cmV0dXJuIHRoaXMuX2NoZWNrQ29uZGl0aW9uKHtbdGhpcy5fbmFtZV06YD4ke3J9YH0pfWlzVmVyc2lvbkxlc3NUaGFuKHIpe3JldHVybiB0aGlzLl9jaGVja0NvbmRpdGlvbih7W3RoaXMuX25hbWVdOmA8JHtyfWB9KX1pc1ZlcnNpb25FcXVhbFRvKHIpe3JldHVybiB0aGlzLl9jaGVja0NvbmRpdGlvbih7W3RoaXMuX25hbWVdOmB+JHtyfWB9KX19Y2xhc3MgeWQgZXh0ZW5kcyB2ZHtkb2VzVmlkZW9NdXRlQnlTdHJlYW1SZW1vdmUoKXtyZXR1cm4gdGhpcy5pc0Nocm9taXVtQmFzZWQoKXx8dGhpcy5pc1dlYktpdEJhc2VkKCl9c3VwcG9ydHNQMlAoKXtyZXR1cm4hdGhpcy51c2VzVW5pZmllZFBsYW4oKX1pc0Nocm9taXVtQmFzZWQoKXtyZXR1cm4gdGhpcy5pc0Nocm9tZSgpfHx0aGlzLmlzRWxlY3Ryb24oKXx8dGhpcy5pc05XSlMoKXx8dGhpcy5pc09wZXJhKCl9aXNXZWJLaXRCYXNlZCgpe3JldHVybiB0aGlzLl9ib3dzZXIuaXNFbmdpbmUoIndlYmtpdCIpJiZ0eXBlb2YgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcyE9InVuZGVmaW5lZCImJnR5cGVvZiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSE9InVuZGVmaW5lZCImJnR5cGVvZiB3aW5kb3cuUlRDUnRwVHJhbnNjZWl2ZXIhPSJ1bmRlZmluZWQiJiZPYmplY3Qua2V5cyhSVENSdHBUcmFuc2NlaXZlci5wcm90b3R5cGUpLmluZGV4T2YoImN1cnJlbnREaXJlY3Rpb24iKT4tMX1pc1N1cHBvcnRlZCgpe3JldHVybiB0eXBlb2YgUlRDUGVlckNvbm5lY3Rpb24hPSJ1bmRlZmluZWQifWlzVXNlckludGVyYWN0aW9uUmVxdWlyZWRGb3JVbm11dGUoKXtyZXR1cm4gdGhpcy5pc0ZpcmVmb3goKSYmdGhpcy5pc1ZlcnNpb25MZXNzVGhhbigiNjgiKX1zdXBwb3J0c1ZpZGVvTXV0ZU9uQ29ubkludGVycnVwdGVkKCl7cmV0dXJuIHRoaXMuaXNDaHJvbWl1bUJhc2VkKCl8fHRoaXMuaXNSZWFjdE5hdGl2ZSgpfHx0aGlzLmlzV2ViS2l0QmFzZWQoKX1zdXBwb3J0c0JhbmR3aWR0aFN0YXRpc3RpY3MoKXtyZXR1cm4hdGhpcy5pc0ZpcmVmb3goKSYmIXRoaXMuaXNXZWJLaXRCYXNlZCgpfXN1cHBvcnRzQ29kZWNQcmVmZXJlbmNlcygpe3JldHVybiB0aGlzLnVzZXNVbmlmaWVkUGxhbigpJiZ0eXBlb2Ygd2luZG93LlJUQ1J0cFRyYW5zY2VpdmVyIT0idW5kZWZpbmVkIiYmT2JqZWN0LmtleXMod2luZG93LlJUQ1J0cFRyYW5zY2VpdmVyLnByb3RvdHlwZSkuaW5kZXhPZigic2V0Q29kZWNQcmVmZXJlbmNlcyIpPi0xJiZPYmplY3Qua2V5cyhSVENSdHBTZW5kZXIucHJvdG90eXBlKS5pbmRleE9mKCJnZXRDYXBhYmlsaXRpZXMiKT4tMSYmIXRoaXMuaXNXZWJLaXRCYXNlZCgpfXN1cHBvcnRzRGV2aWNlQ2hhbmdlRXZlbnQoKXtyZXR1cm4gbmF2aWdhdG9yLm1lZGlhRGV2aWNlcyYmdHlwZW9mIG5hdmlnYXRvci5tZWRpYURldmljZXMub25kZXZpY2VjaGFuZ2UhPSJ1bmRlZmluZWQiJiZ0eXBlb2YgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5hZGRFdmVudExpc3RlbmVyIT0idW5kZWZpbmVkIn1zdXBwb3J0c0xvY2FsQ2FuZGlkYXRlUnR0U3RhdGlzdGljcygpe3JldHVybiB0aGlzLmlzQ2hyb21pdW1CYXNlZCgpfHx0aGlzLmlzUmVhY3ROYXRpdmUoKXx8dGhpcy5pc1dlYktpdEJhc2VkKCl9c3VwcG9ydHNQZXJmb3JtYW5jZU9ic2VydmVyKCl7cmV0dXJuIHR5cGVvZiB3aW5kb3cuUGVyZm9ybWFuY2VPYnNlcnZlciE9InVuZGVmaW5lZCImJlBlcmZvcm1hbmNlT2JzZXJ2ZXIuc3VwcG9ydGVkRW50cnlUeXBlcy5pbmRleE9mKCJsb25ndGFzayIpPi0xfXN1cHBvcnRzUmVjZWl2ZXJTdGF0cygpe3JldHVybiB0eXBlb2Ygd2luZG93LlJUQ1J0cFJlY2VpdmVyIT0idW5kZWZpbmVkIiYmT2JqZWN0LmtleXMoUlRDUnRwUmVjZWl2ZXIucHJvdG90eXBlKS5pbmRleE9mKCJnZXRTeW5jaHJvbml6YXRpb25Tb3VyY2VzIik+LTF9c3VwcG9ydHNSVFRTdGF0aXN0aWNzKCl7cmV0dXJuIXRoaXMuaXNGaXJlZm94KCl9dXNlc1BsYW5CKCl7cmV0dXJuIXRoaXMudXNlc1VuaWZpZWRQbGFuKCl9dXNlc1NkcE11bmdpbmdGb3JTaW11bGNhc3QoKXtyZXR1cm4gdGhpcy5pc0Nocm9taXVtQmFzZWQoKXx8dGhpcy5pc1JlYWN0TmF0aXZlKCl8fHRoaXMuaXNXZWJLaXRCYXNlZCgpfXVzZXNVbmlmaWVkUGxhbigpe3JldHVybiEhKHRoaXMuaXNGaXJlZm94KCl8fHRoaXMuaXNXZWJLaXRCYXNlZCgpKX11c2VzTmV3R3VtRmxvdygpe3JldHVybiEhKHRoaXMuaXNDaHJvbWl1bUJhc2VkKCl8fHRoaXMuaXNGaXJlZm94KCl8fHRoaXMuaXNXZWJLaXRCYXNlZCgpKX11c2VzQWRhcHRlcigpe3JldHVybiB0aGlzLnVzZXNOZXdHdW1GbG93KCl9dXNlc1JpZHNGb3JTaW11bGNhc3QoKXtyZXR1cm4hMX1zdXBwb3J0c0dldERpc3BsYXlNZWRpYSgpe3JldHVybiB0eXBlb2YgbmF2aWdhdG9yLmdldERpc3BsYXlNZWRpYSE9InVuZGVmaW5lZCJ8fHR5cGVvZiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzIT0idW5kZWZpbmVkIiYmdHlwZW9mIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0RGlzcGxheU1lZGlhIT0idW5kZWZpbmVkIn1zdXBwb3J0c0luc2VydGFibGVTdHJlYW1zKCl7aWYoISh0eXBlb2Ygd2luZG93LlJUQ1J0cFNlbmRlciE9InVuZGVmaW5lZCImJih3aW5kb3cuUlRDUnRwU2VuZGVyLnByb3RvdHlwZS5jcmVhdGVFbmNvZGVkU3RyZWFtc3x8d2luZG93LlJUQ1J0cFNlbmRlci5wcm90b3R5cGUuY3JlYXRlRW5jb2RlZFZpZGVvU3RyZWFtcykpKXJldHVybiExO2NvbnN0IHI9bmV3IFJlYWRhYmxlU3RyZWFtO3RyeXtyZXR1cm4gd2luZG93LnBvc3RNZXNzYWdlKHIsIioiLFtyXSksITB9Y2F0Y2goZSl7cmV0dXJuITF9fXN1cHBvcnRzQXVkaW9SZWQoKXtyZXR1cm4gQm9vbGVhbih3aW5kb3cuUlRDUnRwU2VuZGVyJiZ3aW5kb3cuUlRDUnRwU2VuZGVyLmdldENhcGFiaWxpdGllcyYmd2luZG93LlJUQ1J0cFNlbmRlci5nZXRDYXBhYmlsaXRpZXMoImF1ZGlvIikuY29kZWNzLnNvbWUocj0+ci5taW1lVHlwZT09PSJhdWRpby9yZWQiKSYmd2luZG93LlJUQ1J0cFJlY2VpdmVyJiZ3aW5kb3cuUlRDUnRwUmVjZWl2ZXIuZ2V0Q2FwYWJpbGl0aWVzJiZ3aW5kb3cuUlRDUnRwUmVjZWl2ZXIuZ2V0Q2FwYWJpbGl0aWVzKCJhdWRpbyIpLmNvZGVjcy5zb21lKHI9PnIubWltZVR5cGU9PT0iYXVkaW8vcmVkIikpfXN1cHBvcnRzU2RwU2VtYW50aWNzKCl7cmV0dXJuIHRoaXMuaXNDaHJvbWl1bUJhc2VkKCl9X2dldENocm9taXVtQmFzZWRWZXJzaW9uKCl7aWYodGhpcy5pc0Nocm9taXVtQmFzZWQoKSl7aWYodGhpcy5pc05XSlMoKSlyZXR1cm4gTnVtYmVyLnBhcnNlSW50KHByb2Nlc3MudmVyc2lvbnMuY2hyb21pdW0sMTApO2NvbnN0IHI9bmF2aWdhdG9yLnVzZXJBZ2VudDtpZihyLm1hdGNoKC9DaHJvbWUvKSlyZXR1cm4gTnVtYmVyLnBhcnNlSW50KHIubWF0Y2goL0Nocm9tZVwvKFtcZC5dKykvKVsxXSwxMCl9cmV0dXJuLTF9aXNJT1NNb2JpbGUoKXtyZXR1cm4gdGhpcy5pc01vYmlsZSYmdGhpcy5fYm93c2VyLmdldE9TTmFtZSgpPT09ImlPUyJ9fWNvbnN0IGJkPW5ldyB5ZCxucj1jbGFzc3tjb25zdHJ1Y3Rvcigpe3AodGhpcywibG9nc0NhY2hlIixbXSk7cCh0aGlzLCJsb2dzUHJvY2Vzc29yVGltZXIiKTtwKHRoaXMsInRyYWNpbmdFbmFibGVkIiwhMCk7cCh0aGlzLCJpbml0aWFsaXplZCIsITEpO3AodGhpcywibG9nc1Byb2Nlc3NpbmdJbnRlcnZhbCIsN2UzKTtwKHRoaXMsImxvZ0V4Y2x1c2lvbkxpc3QiLFsibWVzc2FnZSIsIndlYnNvY2tldC9tZXNzYWdlIiwicm9vbU1lc3NhZ2UiLCJ3ZWJzb2NrZXQvcm9vbS1tZXNzYWdlIiwid2Vic29ja2V0L3Jvb20tbGVnYWN5LW1vZGUiLCJjaGF0TWVzc2FnZSIsIndlYnNvY2tldC9uZXctY2hhdC1tZXNzYWdlIiwid2Vic29ja2V0L25vLWFjdGl2ZS1zcGVha2VyIiwid2Vic29ja2V0L3NlbGVjdGVkLXBlZXJzIiwid2Vic29ja2V0L2FjdGl2ZS1zcGVha2VyIiwicGluZyIsIndlYnNvY2tldC9uZXctY29uc3VtZXIiLCJ3ZWJzb2NrZXQvcHJvZHVjZXItc2NvcmUiLCJ3ZWJzb2NrZXQvY29uc3VtZXItc2NvcmUiLCJ3ZWJzb2NrZXQvcGx1Z2luLWV2ZW50Iiwid2Vic29ja2V0L3BsdWdpbi1kYXRhIiwid2Vic29ja2V0L3BsdWdpbi1pbnRlcm5hbC1kYXRhIl0pO3AodGhpcywibWVldGluZ01ldGFkYXRhIix7fSl9Z2V0IGxvZ3NFbmRwb2ludCgpe2NvbnN0IHI9UGUuZ2V0Q29udGV4dCh0aGlzLm1lZXRpbmdNZXRhZGF0YS5wZWVySWQpO3JldHVybmBodHRwczovLyR7bmQoe3NlcnZpY2VQcmVmaXg6ImFwaS1zaWxvcyIsYmFzZVVSSTpyLmdldFZhbHVlKCJiYXNlVVJJIil9KX0vb3RlbC9sb2dzYH1yZXNldFBlZXJJZChyKXt0aGlzLm1lZXRpbmdNZXRhZGF0YS5wZWVySWQ9cn1pbml0KHIsZSxuKXt0aGlzLnRyYWNpbmdFbmFibGVkPSEwLHRoaXMuaW5pdGlhbGl6ZWQ9ITEsdGhpcy5sb2dzQ2FjaGU9W107Y29uc3Qgcz1yLmdldFZhbHVlKCJwZWVySWQiKTt0aGlzLm1lZXRpbmdNZXRhZGF0YT1lLHRoaXMudHJhY2luZ0VuYWJsZWQ9bix0aGlzLm1lZXRpbmdNZXRhZGF0YS5wZWVySWQ9cyx0aGlzLm1lZXRpbmdNZXRhZGF0YS5zZGtWZXJzaW9uPXIuZ2V0VmFsdWUoInNka1ZlcnNpb24iKTtjb25zdHtSTkRldmljZUluZm9JbXBsOml9PW5hdmlnYXRvcjt0aGlzLm1lZXRpbmdNZXRhZGF0YS5kZXZpY2VJbmZvPW5hdmlnYXRvci5pc1JlYWN0TmF0aXZlP2k9PW51bGw/dm9pZCAwOmkuZ2V0RGV2aWNlSW5mbygpOmJkLmdldERldmljZUluZm8oKSx0aGlzLm1lZXRpbmdNZXRhZGF0YS52aXNpdGVkVXJsPSFuYXZpZ2F0b3IuaXNSZWFjdE5hdGl2ZSYmdHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJndpbmRvdy5sb2NhdGlvbi5ocmVmLHRoaXMubG9nc1Byb2Nlc3NvclRpbWVyPXNldEludGVydmFsKHRoaXMucHJvY2Vzc0NhY2hlZExvZ3MuYmluZCh0aGlzKSx0aGlzLmxvZ3NQcm9jZXNzaW5nSW50ZXJ2YWwpLG4mJih0aGlzLmluaXRpYWxpemVkPSEwKX1zdGF0aWMgdHJhY2UocixlPXZvaWQgMCl7cmV0dXJuKG4scyxpKT0+e2NvbnN0IGE9aS52YWx1ZTtyZXR1cm4gaS52YWx1ZT1mdW5jdGlvbiguLi5vKXt2YXIgRTtjb25zdCBsPXRoaXM9PW51bGw/dm9pZCAwOnRoaXMudGVsZW1ldHJ5O2lmKCFsfHwhbC5pbml0aWFsaXplZHx8bmF2aWdhdG9yLmlzUmVhY3ROYXRpdmV8fCFsLnRyYWNpbmdFbmFibGVkfHwoRT1QZS5nZXRDb250ZXh0KGwubWVldGluZ01ldGFkYXRhLnBlZXJJZCkpIT1udWxsJiZFLmdldFZhbHVlKCJmbGFnc21pdGgiKS5oYXNGZWF0dXJlKEd0LlNLSVBfT1RFTF9UUkFDRVMpKXJldHVybiBhLmFwcGx5KHRoaXMsbyk7bC5hZGRMb2dJbkN1cnJlbnRTcGFuKCJpbmZvIixyLGUpO2NvbnN0IG09cGVyZm9ybWFuY2Uubm93KCksdj1hLmFwcGx5KHRoaXMsbyk7cmV0dXJuIFByb21pc2UucmVzb2x2ZSh2KS50aGVuKCgpPT57Y29uc3QgST1wZXJmb3JtYW5jZS5ub3coKTtJLW0+MTAmJmwuYWRkTG9nSW5DdXJyZW50U3BhbigiaW5mbyIsYCR7cn1fdGltaW5nYCx7ZXhlY1RpbWU6SS1tLGNvdW50cnk6bnIubG9jYXRpb24uY291bnRyeX0pfSkuY2F0Y2goKCk9Pntjb25zdCBJPXBlcmZvcm1hbmNlLm5vdygpO2wuYWRkTG9nSW5DdXJyZW50U3BhbigiaW5mbyIsYCR7cn1fdGltaW5nYCx7ZXhlY1RpbWU6SS1tfSl9KSx2fSxpfX1pbmplY3RDb250ZXh0KHIpe3ZhciBzO2NvbnN0IGU9SmMoKS5yZXBsYWNlKC8tL2csIiIpLnN1YnN0cmluZygwLDE2KSxuPShzPXRoaXMubWVldGluZ01ldGFkYXRhLnBlZXJJZCk9PW51bGw/dm9pZCAwOnMucmVwbGFjZSgvLS9nLCIiKTtyLlRSQUNFUEFSRU5UPWAwMC0ke259LSR7ZX0tMDFgfWFkZExvZ0luQ3VycmVudFNwYW4ocixlLG49e30scz0hMSl7biE9bnVsbCYmbi5lcnJvciYmT2JqZWN0LmFzc2lnbihuLHtlcnJvcjpSdChuLmVycm9yKX0pO2NvbnN0IGk9UGUuZ2V0Q29udGV4dCh0aGlzLm1lZXRpbmdNZXRhZGF0YS5wZWVySWQpO2lmKGlkKGkpJiYocmQobik/Y29uc29sZVtyXSgiSW50ZXJuYWxMb2dzOjogIixyLGUpOmNvbnNvbGVbcl0oIkludGVybmFsTG9nczo6ICIscixlLG4pKSwhIWFkKGkscikpdHJ5e2NvbnN0IGQ9Rm4oaSxlLG4sIm1ldGFkYXRhIiksbz1uZXcgRGF0ZSxsPW90KFEoe21lc3NhZ2U6ZSxsZXZlbDpyfSxkKSx7bG9nZ2VkQXQ6by50b0lTT1N0cmluZygpLGxvZ2dlZEF0VHpPZmZzZXQ6by5nZXRUaW1lem9uZU9mZnNldCgpfSk7cz90aGlzLnNlbmRPdGVsTG9nc1RvTmV3UmVsaWMoW2xdKTp0aGlzLmxvZ3NDYWNoZS5wdXNoKGwpfWNhdGNoKGQpe3RoaXMuYWRkTG9nSW5DdXJyZW50U3BhbigiZXJyb3IiLCJvcGVudGVsZW1ldHJ5OjphZGRMb2dJbkN1cnJlbnRTcGFuX2ZhaWxlZCIse2Vycm9yOlJ0KGQpfSl9fXNlbmRPdGVsTG9nc1RvTmV3UmVsaWMocil7Y29uc3QgZT1QZS5nZXRDb250ZXh0KHRoaXMubWVldGluZ01ldGFkYXRhLnBlZXJJZCk7ZmV0Y2godGhpcy5sb2dzRW5kcG9pbnQse21ldGhvZDoiUE9TVCIsaGVhZGVyczp7IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24ifSxib2R5OkpTT04uc3RyaW5naWZ5KHttZWV0aW5nTWV0YWRhdGE6Rm4oZSwic2VuZE90ZWxMb2dzVG9OZXdSZWxpYyIsdGhpcy5tZWV0aW5nTWV0YWRhdGEsIm1lZXRpbmdNZXRhZGF0YSIpLHNlcnZpY2VOYW1lOmUuZ2V0VmFsdWUoInNka05hbWUiKSxsb2dzOnJ9KX0pLmNhdGNoKG49Pnt0aGlzLmFkZExvZ0luQ3VycmVudFNwYW4oImVycm9yIiwib3BlbnRlbGVtZXRyeTo6c2VuZE90ZWxMb2dUb05ld1JlbGljX2ZhaWxlZCIse2Vycm9yOlJ0KG4pfSksdGhpcy5sb2dzQ2FjaGUucHVzaCguLi5yKX0pfXByb2Nlc3NDYWNoZWRMb2dzKCl7Y29uc3Qgcj10aGlzLmxvZ3NDYWNoZS5zcGxpY2UoMCwyNSk7ciE9bnVsbCYmci5sZW5ndGgmJnRoaXMuc2VuZE90ZWxMb2dzVG9OZXdSZWxpYyhyKX1kZXN0cnVjdCgpe2NsZWFySW50ZXJ2YWwodGhpcy5sb2dzUHJvY2Vzc29yVGltZXIpLHRoaXMucHJvY2Vzc0NhY2hlZExvZ3MoKX19O2xldCBDdD1ucjtwKEN0LCJsb2NhdGlvbiIse2NvdW50cnk6dm9pZCAwfSk7ZnVuY3Rpb24gRWQodCl7Y29uc3Qgcj1RKHt9LHQpLGU9bmV3IE1hcCxuPShsLG0pPT4oZS5oYXMobCl8fGUuc2V0KGwsbmV3IFNldCksZS5nZXQobCkuYWRkKG0pLCgpPT57dmFyIHY7cmV0dXJuKHY9ZS5nZXQobCkpPT1udWxsP3ZvaWQgMDp2LmRlbGV0ZShtKX0pLHM9KGwsbSk9Pnt2YXIgdjsodj1lLmdldChsKSk9PW51bGx8fHYuZGVsZXRlKG0pfSxpPWw9Pnt2YXIgbTsobT1lLmdldChsKSk9PW51bGx8fG0uZm9yRWFjaCh2PT57dHJ5e3YocltsXSl9Y2F0Y2goRSl7fX0pfTtyZXR1cm57c3Vic2NyaWJlOm4sdW5zdWJzY3JpYmU6cyxub3RpZnk6aSxzZXRWYWx1ZToobCxtLHY9ITApPT57cltsXT1tLHYmJmkobCl9LGdldFZhbHVlOmw9PnJbbF0sZ2V0QWxsVmFsdWVzOigpPT5yfX1jbGFzcyBfZHtjb25zdHJ1Y3Rvcigpe3AodGhpcywiY29udGV4dHMiLG5ldyBNYXApO3AodGhpcywibW9zdFJlY2VudFBlZXJJZCIsbnVsbCl9Y3JlYXRlQ29udGV4dChyLGUpe2lmKHRoaXMuY29udGV4dHMuaGFzKHIpKXJldHVybiB0aGlzLmNvbnRleHRzLmdldChyKTtjb25zdCBuPW5ldyBDdCxzPW5ldyBXYzt0aGlzLmNvbnRleHRzLnNldChyLEVkKGUpKSx0aGlzLmNvbnRleHRzLmdldChyKS5zZXRWYWx1ZSgicGVlclNlc3Npb25TdG9yZSIsbmV3IFd0KHMpKTtjb25zdCBpPW5ldyBGcjtyZXR1cm4gaS5zZXRNYXhMaXN0ZW5lcnMoNTApLHRoaXMuY29udGV4dHMuZ2V0KHIpLnNldFZhbHVlKCJsb2dnZXIiLHMpLHRoaXMuY29udGV4dHMuZ2V0KHIpLnNldFZhbHVlKCJ0ZWxlbWV0cnkiLG4pLHRoaXMuY29udGV4dHMuZ2V0KHIpLnNldFZhbHVlKCJjYWxsc3RhdHMiLGkpLHRoaXMuY29udGV4dHMuZ2V0KHIpLnNldFZhbHVlKCJmbGFnc21pdGgiLFZjKCkpLHRoaXMubW9zdFJlY2VudFBlZXJJZD1yLHRoaXMuY29udGV4dHMuZ2V0KHIpfXJlbWFwQ29udGV4dChyLGUpe2NvbnN0IG49ZS5nZXRWYWx1ZSgicGVlcklkIik7biE9PXImJihlLnNldFZhbHVlKCJwZWVySWQiLHIpLHRoaXMubW9zdFJlY2VudFBlZXJJZD1yLHRoaXMuY29udGV4dHMuc2V0KHIsZSksdGhpcy5jb250ZXh0cy5kZWxldGUobikpfWdldENvbnRleHQocil7cmV0dXJuIHRoaXMuY29udGV4dHMuZ2V0KHIpfWdldE1vc3RSZWNlbnRQZWVySWQoKXtyZXR1cm4gdGhpcy5tb3N0UmVjZW50UGVlcklkfX12YXIgUGU9bmV3IF9kO2NvbnN0IFRkPXsiMDAiOiJDbGllbnQiLCIwMSI6IkNvbnRyb2xsZXIiLCIwMiI6IlJvb21Ob2RlQ2xpZW50IiwiMDMiOiJIaXZlTm9kZUNsaWVudCIsIjA0IjoiU29ja2V0U2VydmljZSIsIjA1IjoiQ2hhdCIsIjA2IjoiUGx1Z2luIiwiMDciOiJQb2xscyIsIjA4IjoiTWV0YSIsIjA5IjoiUHJlc2V0IiwxMDoiUmVjb3JkaW5nIiwxMToiU2VsZiIsMTI6IlBhcnRpY2lwYW50IiwxMzoiU3BvdGxpZ2h0IiwxNDoiUmVtb3RlIFJlcXVlc3QiLDE1OiJXZWJpbmFyIiwxNjoiTG9jYWxNZWRpYUhhbmRsZXIiLDE3OiJFbmQtRW5kIEVuY3J5cHRpb24iLDE4OiJBSSIsMTk6IkxpdmVzdHJlYW0iLDIwOiJTdGFnZSJ9LHd0PXsiMDAwMCI6IkludGVybmFsIGV4Y2VwdGlvbi4iLCIwMDAxIjoiRmFpbGVkIHRvIGluaXRpYWxpemUuIiwiMDAwMiI6IkZhaWxlZCB0byBqb2luIHJvb20uIiwiMDAwMyI6IkZhaWxlZCB0byBsZWF2ZSByb29tLiIsIjAwMDQiOiJJbnZhbGlkIGF1dGggdG9rZW4iLCIwMDEwIjoiQnJvd3NlciBub3Qgc3VwcG9ydGVkIiwiMDAxMSI6IkhUVFAgTmV0d29yayBFcnJvciIsIjAwMTIiOiJXZWJzb2NrZXQgTmV0d29yayBFcnJvciIsIjAwMTMiOiJSYXRlIExpbWl0ZWQiLCIwMTAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDEwMSI6IlBlcm1pc3Npb24gZGVuaWVkIiwiMDEwMiI6IlByZXJlcXVpc2l0ZSBtb2R1bGUgbWlzc2luZyIsIjAyMDAiOiJJbnRlcm5hbCBleGNlcHRpb24uIiwiMDMwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjA0MDAiOiJJbnRlcm5hbCBleGNlcHRpb24iLCIwNDA0IjoiTWlzc2luZyBwcmVyZXF1aXNpdGVzIHRvIGVzdGFibGlzaCBhIHdlYnNvY2tldCBjb25uZWN0aW9uIiwiMDUwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjA1MDEiOiJQZXJtaXNzaW9uIGRlbmllZC4iLCIwNTAyIjoiSW52YWxpZCBtZXNzYWdlIGJvZHkuIiwiMDUwMyI6IlRleHQgTWVzc2FnZSBpcyB0b28gbGFyZ2UiLCIwNTA0IjoiTWVzc2FnZSBub3QgZm91bmQgYnkgdGhlIGdpdmVuIGlkIiwiMDUwNSI6IkFjdGlvbiBub3QgcGVybWl0dGVkIHdpdGhvdXQgam9pbmluZyByb29tIiwiMDUwNiI6Ik1lc3NhZ2Ugc2VhcmNoIGlzIGRpc2FibGVkIiwiMDYwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjA2MDEiOiJQZXJtaXNzaW9uIGRlbmllZC4iLCIwNjAyIjoiQXV0aCB0b2tlbiBub3Qgc2V0IGZvciBwbHVnaW4iLCIwNjAzIjoiSWZyYW1lIHdhcyBub3QgcHJvdmlkZWQiLCIwNzAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDcwNSI6IkFjdGlvbiBub3QgcGVybWl0dGVkIHdpdGhvdXQgam9pbmluZyByb29tIiwiMDgwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjA4MDEiOiJQZXJtaXNzaW9uIGRlbmllZCIsIjA5MDAiOiJJbnRlcm5hbCBleGNlcHRpb24iLCIwOTA0IjoiQ291bGQgbm90IGxvYWQgcHJlc2V0IiwxZTM6IkludGVybmFsIGV4Y2VwdGlvbiIsMTAwMToiUGVybWlzc2lvbiBkZW5pZWQiLDEwMDQ6IkNvdWxkIG5vdCBmaW5kIHNwZWNpZmllZCByZWNvcmRpbmciLDEwMDU6IkFjdGlvbiBub3QgcGVybWl0dGVkIGluIGdpdmVuIHJlY29yZGluZyBzdGF0ZSIsMTEwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxMTAxOiJQZXJtaXNzaW9uIGRlbmllZCIsMTEwMjoiVW5zdXBwb3J0ZWQiLDExMDM6Ik5hbWUgY2Fubm90IGJlIGVtcHR5IiwxMTA0OiJObyBkZXZpY2Ugc2VsZWN0ZWQgd2hpbGUgY2FsbGluZyBtZWV0aW5nLnNlbGYuc2V0RGV2aWNlIiwxMTA1OiJBY3Rpb24gbm90IHBlcm1pdHRlZCB3aXRob3V0IGpvaW5pbmcgcm9vbSIsMTEwNjoiQ2FuJ3Qgc2V0IGN1cnJlbnRseSB1c2VkIGRldmljZSIsMTIwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxMjAxOiJQZXJtaXNzaW9uIGRlbmllZCIsMTIwMjoiSW52YWxpZCBwYWdlIG51bWJlciB3YXMgcmVxdWVzdGVkIiwxMjAzOiJJbnZhbGlkIHBhcnRpY2lwYW50IGNvdW50IHBlciBwYWdlIHdhcyByZXF1ZXN0ZWQiLDEyMDQ6Ik5vIHBhcnRpY2lwYW50cyBleGlzdHMgd2l0aCB0aGUgZ2l2ZW4gVXNlcklkcyIsMTIwNToiQWN0aW9uIG5vdCBwZXJtaXR0ZWQgd2l0aG91dCBqb2luaW5nIHJvb20iLDEyMDY6Ik1hbnVhbCBTdWJzY3JpcHRpb24gTW9kZSB3YXMgbm90IEFDVElWQVRFRCIsMTIwNzoiSW52YWxpZCB2aWV3IG1vZGUiLDEyMDg6Ik1hbnVhbCBTdWJzY3JpcHRpb24gbm90IGVuYWJsZWQgZm9yIG9yZ2FuaXphdGlvbiIsMTIwOToiQnJvYWRjYXN0IG1lc3NhZ2UgdHlwZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZyIsMTMwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxNDAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDE0MDI6Ik5vIGV4aXN0aW5nIHJlbW90ZSByZXF1ZXN0cyIsMTQwMzoiTm8gcGVlciBleGlzdHMgd2l0aCBnaXZlbiBpZCIsMTUwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxNjAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDE2MDE6IkZhaWxlZCB0byBnZXQgYXVkaW8gdHJhY2siLDE2MDI6IkZhaWxlZCB0byBnZXQgdmlkZW8gdHJhY2siLDE2MDM6IkluY29ycmVjdCBkZXZpY2UiLDE2MDQ6IkZhaWxlZCB0byBjaGFuZ2UgZGV2aWNlIiwxNjA1OiJGYWlsZWQgdG8gZ2V0IGF1ZGlvICYgdmlkZW8gdHJhY2siLDE2MDY6Ik5vIGF1ZGlvIGlucHV0IGRldmljZXMgYXJlIGF2YWlsYWJsZSIsMTYwNzoiTm8gdmlkZW8gaW5wdXQgZGV2aWNlcyBhcmUgYXZhaWxhYmxlIiwxNjA4OiJObyBhdWRpbyBvdXRwdXQgZGV2aWNlcyAoc3BlYWtlcnMpIGFyZSBhdmFpbGFibGUiLDE2MDk6IkZhaWxlZCB0byBmZXRjaCBsaXN0IG9mIG1lZGlhIGRldmljZXMiLDE2MTA6Ik5vIG1lZGlhIHRyYWNrIGV4aXN0cyIsMTYxMToiRmFpbGVkIHRvIHVubXV0ZSB0cmFjayIsMTYxMjoiRmFpbGVkIHRvIGdldCBzY3JlZW5zaGFyZSB0cmFja3MiLDE3MDE6IkNyeXB0byBlcnJvciIsMTgwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxODAxOiJDYW4ndCBmZXRjaCB0cmFuc2NyaXB0IGZpbGUiLDE5MDA6IkludGVybmFsIGV4Y2VwdGlvbiIsMTkwMToiUGVybWlzc2lvbiBkZW5pZWQuIiwxOTAyOiJMaXZlc3RyZWFtIHRoYXQgaGFzIG5vdCB5ZXQgc3RhcnRlZCwgY2FuJ3QgYmUgc3RvcHBlZCIsMmUzOiJJbnRlcm5hbCBleGNlcHRpb24iLDIwMDE6IlBlcm1pc3Npb24gZGVuaWVkIiwyMDAyOiJVbnN1cHBvcnRlZCIsMjAwMzoiU3RhZ2UgaXMgZGlzYWJsZWQiLDIwMDQ6Ik1ldGhvZCBub3QgaW1wbGVtZW50ZWQiLDIwMDU6IkFjdGlvbiBub3QgcGVybWl0dGVkIHdpdGhvdXQgam9pbmluZyByb29tIiwyMDA2OiJBY3Rpb24gbm90IHBlcm1pdHRlZCBpbiBjdXJyZW50IHN0YWdlIHN0YXR1cyIsOTkwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIn07T2JqZWN0LmtleXMod3QpLmZvckVhY2godD0+e3d0W3RdPWB7JHtUZFt0LnNsaWNlKDAsMildfX0gJHt3dFt0XX1gfSk7Y2xhc3MgUmQgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihlLG4scz12b2lkIDAsaT0hMSl7c3VwZXIoZSk7cCh0aGlzLCJjb2RlIik7dGhpcy5jb2RlPW4sdGhpcy5uYW1lPSJDbGllbnRFcnJvciI7Y29uc3QgYT10aGlzLmNvZGU/YFtFUlIke3RoaXMuY29kZX1dYDoiW0VSUl0iLGQ9dGhpcy5jb2RlP3d0W3RoaXMuY29kZV06IiI7dGhpcy5tZXNzYWdlPWAke2F9OiAke2R9CiR7dGhpcy5tZXNzYWdlfWA7dHJ5e2xldCBvPWkmJiEhcztuJiZuLmVuZHNXaXRoKCIwMCIpJiZzJiYobz0hMCksbyYmcy5lcnJvcigiQ2xpZW50RXJyb3IiLHtlcnJvcjp7bWVzc2FnZTp0aGlzLm1lc3NhZ2UsbmFtZTp0aGlzLm5hbWUsY29kZTpufX0pO2NvbnN0IGw9UGUuZ2V0Q29udGV4dChQZS5nZXRNb3N0UmVjZW50UGVlcklkKCkpO2lmKGwpe2NvbnN0IG09bC5nZXRWYWx1ZSgib25FcnJvciIpO3RyeXttKHRoaXMpfWNhdGNoKHYpe319dHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJndpbmRvdy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiQ2xpZW50RXJyb3IiLHtkZXRhaWw6dGhpc30pKX1jYXRjaChvKXt9fX12YXIgZmU9KHQ9Pih0W3QuSW52YWxpZEtleT0wXT0iSW52YWxpZEtleSIsdFt0Lk1pc3NpbmdLZXk9MV09Ik1pc3NpbmdLZXkiLHRbdC5JbnRlcm5hbEVycm9yPTJdPSJJbnRlcm5hbEVycm9yIix0KSkoZmV8fHt9KTtjbGFzcyBtZSBleHRlbmRzIFJke2NvbnN0cnVjdG9yKGUsbj0yKXtzdXBlcihlLCIxNzAxIik7cCh0aGlzLCJyZWFzb24iKTt0aGlzLnJlYXNvbj1ufX1jbGFzcyBHbiBleHRlbmRzIHEuRXZlbnRFbWl0dGVye2NvbnN0cnVjdG9yKGUpe3N1cGVyKCk7cCh0aGlzLCJsb2dnZXIiKTt0aGlzLmxvZ2dlcj1lLHN1cGVyLnNldE1heExpc3RlbmVycygyNSl9ZW1pdChlLC4uLm4pe3JldHVybiBzdXBlci5lbWl0KCIqIixlLC4uLm4pLHN1cGVyLmVtaXQoZSwuLi5uKX1vbihlLG4pe3ZhciBzO3RyeXtjb25zdCBpPXRoaXMubGlzdGVuZXJDb3VudChlKTtpPjI1JiZpJTI1PT09MCYmKChzPXRoaXMubG9nZ2VyKT09bnVsbHx8cy53YXJuKCJDdXN0b21FdmVudEVtaXR0ZXI6Om1heExpc3RlbmVyc0V4Y2VlZGVkIix7ZXZlbnRMaXN0ZW5lcjp7ZXZlbnROYW1lOmUudG9TdHJpbmcoKSxsaXN0ZW5lckNvdW50OnRoaXMubGlzdGVuZXJDb3VudChlKX19KSl9Y2F0Y2goaSl7fXJldHVybiBzdXBlci5vbihlLG4pfWFkZExpc3RlbmVyKGUsbil7dmFyIHM7dHJ5e2NvbnN0IGk9dGhpcy5saXN0ZW5lckNvdW50KGUpO2k+MjUmJmklMjU9PT0wJiYoKHM9dGhpcy5sb2dnZXIpPT1udWxsfHxzLndhcm4oIkN1c3RvbUV2ZW50RW1pdHRlcjo6bWF4TGlzdGVuZXJzRXhjZWVkZWQiLHtldmVudExpc3RlbmVyOntldmVudE5hbWU6ZS50b1N0cmluZygpLGxpc3RlbmVyQ291bnQ6dGhpcy5saXN0ZW5lckNvdW50KGUpfX0pKX1jYXRjaChpKXt9cmV0dXJuIHN1cGVyLmFkZExpc3RlbmVyKGUsbil9b2ZmKGUsbil7cmV0dXJuIHN1cGVyLm9mZihlLG4pfW9uY2UoZSxuKXtyZXR1cm4gc3VwZXIub25jZShlLG4pfXByZXBlbmRMaXN0ZW5lcihlLG4pe3JldHVybiBzdXBlci5wcmVwZW5kTGlzdGVuZXIoZSxuKX1wcmVwZW5kT25jZUxpc3RlbmVyKGUsbil7cmV0dXJuIHN1cGVyLnByZXBlbmRPbmNlTGlzdGVuZXIoZSxuKX1yZW1vdmVMaXN0ZW5lcihlLG4pe3JldHVybiBzdXBlci5yZW1vdmVMaXN0ZW5lcihlLG4pfXJlbW92ZUFsbExpc3RlbmVycyhlKXtyZXR1cm4gc3VwZXIucmVtb3ZlQWxsTGlzdGVuZXJzKGUpfWxpc3RlbmVycyhlKXtyZXR1cm4gc3VwZXIubGlzdGVuZXJzKGUpfWxpc3RlbmVyQ291bnQoZSl7cmV0dXJuIHN1cGVyLmxpc3RlbmVyQ291bnQoZSl9fWNvbnN0IFl0PXtFcnJvcjoiY3J5cHRvckVycm9yIn07ZnVuY3Rpb24gUGQodCl7cmV0dXJuInR5cGUiaW4gdH1mdW5jdGlvbiBDZChuKXtyZXR1cm4gdyh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbioodCxyPXtuYW1lOmt9LGU9ImVuY3J5cHQiKXtyZXR1cm4gY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoInJhdyIsdCxyLCExLGU9PT0iZGVyaXZlIj9bImRlcml2ZUJpdHMiLCJkZXJpdmVLZXkiXTpbImVuY3J5cHQiLCJkZWNyeXB0Il0pfSl9ZnVuY3Rpb24gcW4odCxyKXtjb25zdCBuPW5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShyKTtzd2l0Y2godCl7Y2FzZSJIS0RGIjpyZXR1cm57bmFtZToiSEtERiIsc2FsdDpuLGhhc2g6IlNIQS0yNTYiLGluZm86bmV3IEFycmF5QnVmZmVyKDEyOCl9O2Nhc2UiUEJLREYyIjpyZXR1cm57bmFtZToiUEJLREYyIixzYWx0Om4saGFzaDoiU0hBLTI1NiIsaXRlcmF0aW9uczoxZTV9O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBhbGdvcml0aG0gJHt0fSBpcyBjdXJyZW50bHkgdW5zdXBwb3J0ZWRgKX19ZnVuY3Rpb24gWW4odCxyKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3QgZT1xbih0LmFsZ29yaXRobS5uYW1lLHIpLG49eWllbGQgY3J5cHRvLnN1YnRsZS5kZXJpdmVLZXkoZSx0LHtuYW1lOmssbGVuZ3RoOjEyOH0sITEsWyJlbmNyeXB0IiwiZGVjcnlwdCJdKTtyZXR1cm57bWF0ZXJpYWw6dCxlbmNyeXB0aW9uS2V5Om59fSl9ZnVuY3Rpb24gd2QodCxyKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3QgZT1xbih0LmFsZ29yaXRobS5uYW1lLHIpO3JldHVybiBjcnlwdG8uc3VidGxlLmRlcml2ZUJpdHMoZSx0LDI1Nil9KX1jbGFzcyBJZCBleHRlbmRzIEdue31jbGFzcyBRbiBleHRlbmRzIElke2NvbnN0cnVjdG9yKGUpe3ZhciBuO3N1cGVyKHZvaWQgMCk7cCh0aGlzLCJzZW5kQ291bnRzIik7cCh0aGlzLCJpc0tleUludmFsaWQiLCExKTtwKHRoaXMsInBhcnRpY2lwYW50SWQiKTtwKHRoaXMsInRyYWNrSWQiKTtwKHRoaXMsImtleXMiKTtwKHRoaXMsInZpZGVvQ29kZWMiKTtwKHRoaXMsInJ0cE1hcCIpO3AodGhpcywia2V5UHJvdmlkZXJPcHRpb25zIik7cCh0aGlzLCJ1bmVuY3J5cHRlZEZyYW1lQnl0ZVRyYWlsZXIiKTt0aGlzLnNlbmRDb3VudHM9bmV3IE1hcCx0aGlzLmtleXM9ZS5rZXlzLHRoaXMucGFydGljaXBhbnRJZD1lLnBhcnRpY2lwYW50SWQsdGhpcy5ydHBNYXA9bmV3IE1hcCx0aGlzLmtleVByb3ZpZGVyT3B0aW9ucz1lLmtleVByb3ZpZGVyT3B0aW9ucyx0aGlzLnVuZW5jcnlwdGVkRnJhbWVCeXRlVHJhaWxlcj0obj1lLnVuZW5jcnlwdGVkRnJhbWVCeXRlcykhPW51bGw/bjpuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoIkxLUk9DS1MiKX1zZXRQYXJ0aWNpcGFudChlLG4pe3RoaXMucGFydGljaXBhbnRJZD1lLHRoaXMua2V5cz1ufXVuc2V0UGFydGljaXBhbnQoKXt0aGlzLnBhcnRpY2lwYW50SWQ9dm9pZCAwfWdldFBhcnRpY2lwYW50SWQoKXtyZXR1cm4gdGhpcy5wYXJ0aWNpcGFudElkfWdldFRyYWNrSWQoKXtyZXR1cm4gdGhpcy50cmFja0lkfXNldFZpZGVvQ29kZWMoZSl7dGhpcy52aWRlb0NvZGVjPWV9c2V0UnRwTWFwKGUpe3RoaXMucnRwTWFwPWV9c2V0dXBUcmFuc2Zvcm0oZSxuLHMsaSxhKXthJiYodGhpcy52aWRlb0NvZGVjPWEpO2NvbnN0IGQ9ZT09PSJlbmNvZGUiP3RoaXMuZW5jb2RlRnVuY3Rpb246dGhpcy5kZWNvZGVGdW5jdGlvbixvPW5ldyBUcmFuc2Zvcm1TdHJlYW0oe3RyYW5zZm9ybTpkLmJpbmQodGhpcyl9KTtuLnBpcGVUaHJvdWdoKG8pLnBpcGVUbyhzKS5jYXRjaChsPT57dGhpcy5lbWl0KCJjcnlwdG9yRXJyb3IiLGwgaW5zdGFuY2VvZiBtZT9sOm5ldyBtZShsLm1lc3NhZ2UpKX0pLHRoaXMudHJhY2tJZD1pfWVuY29kZUZ1bmN0aW9uKGUsbil7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3ZhciBhO2lmKCF0aGlzLmtleXMuaXNFbmFibGVkKCl8fGUuZGF0YS5ieXRlTGVuZ3RoPT09MClyZXR1cm4gbi5lbnF1ZXVlKGUpO2NvbnN0e2VuY3J5cHRpb25LZXk6c309dGhpcy5rZXlzLmdldEtleVNldCgpLGk9dGhpcy5rZXlzLmdldEN1cnJlbnRLZXlJbmRleCgpO2lmKHMpe2NvbnN0IGQ9dGhpcy5tYWtlSVYoKGE9ZS5nZXRNZXRhZGF0YSgpLnN5bmNocm9uaXphdGlvblNvdXJjZSkhPW51bGw/YTotMSxlLnRpbWVzdGFtcCksbz1uZXcgVWludDhBcnJheShlLmRhdGEsMCx0aGlzLmdldFVuZW5jcnlwdGVkQnl0ZXMoZSkpLGw9bmV3IFVpbnQ4QXJyYXkoMik7bFswXT1kZSxsWzFdPWk7dHJ5e2NvbnN0IG09eWllbGQgY3J5cHRvLnN1YnRsZS5lbmNyeXB0KHtuYW1lOmssaXY6ZCxhZGRpdGlvbmFsRGF0YTpuZXcgVWludDhBcnJheShlLmRhdGEsMCxvLmJ5dGVMZW5ndGgpfSxzLG5ldyBVaW50OEFycmF5KGUuZGF0YSx0aGlzLmdldFVuZW5jcnlwdGVkQnl0ZXMoZSkpKSx2PW5ldyBBcnJheUJ1ZmZlcihvLmJ5dGVMZW5ndGgrbS5ieXRlTGVuZ3RoK2QuYnl0ZUxlbmd0aCtsLmJ5dGVMZW5ndGgpLEU9bmV3IFVpbnQ4QXJyYXkodik7cmV0dXJuIEUuc2V0KG8pLEUuc2V0KG5ldyBVaW50OEFycmF5KG0pLG8uYnl0ZUxlbmd0aCksRS5zZXQobmV3IFVpbnQ4QXJyYXkoZCksby5ieXRlTGVuZ3RoK20uYnl0ZUxlbmd0aCksRS5zZXQobCxvLmJ5dGVMZW5ndGgrbS5ieXRlTGVuZ3RoK2QuYnl0ZUxlbmd0aCksZS5kYXRhPXYsbi5lbnF1ZXVlKGUpfWNhdGNoKG0pe319ZWxzZSB0aGlzLmVtaXQoWXQuRXJyb3IsbmV3IG1lKCJlbmNyeXB0aW9uIGtleSBtaXNzaW5nIGZvciBlbmNvZGluZyIsZmUuTWlzc2luZ0tleSkpfSl9ZGVjb2RlRnVuY3Rpb24oZSxuKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7aWYoIXRoaXMua2V5cy5pc0VuYWJsZWQoKXx8ZS5kYXRhLmJ5dGVMZW5ndGg9PT0wfHxBZChlLmRhdGEsdGhpcy51bmVuY3J5cHRlZEZyYW1lQnl0ZVRyYWlsZXIpKXJldHVybiBuLmVucXVldWUoZSk7Y29uc3QgaT1uZXcgVWludDhBcnJheShlLmRhdGEpW2UuZGF0YS5ieXRlTGVuZ3RoLTFdO2lmKHRoaXMua2V5cy5nZXRLZXlTZXQoaSkpdHJ5e2NvbnN0IGE9eWllbGQgdGhpcy5kZWNyeXB0RnJhbWUoZSxpKTtpZihhKXJldHVybiBuLmVucXVldWUoYSk7dGhpcy5pc0tleUludmFsaWQ9ITF9Y2F0Y2goYSl7YSBpbnN0YW5jZW9mIG1lJiZhLnJlYXNvbj09PWZlLkludmFsaWRLZXkmJih0aGlzLmlzS2V5SW52YWxpZHx8KHRoaXMuZW1pdChZdC5FcnJvcixuZXcgbWUoYGludmFsaWQga2V5IGZvciBwYXJ0aWNpcGFudCAke3RoaXMucGFydGljaXBhbnRJZH1gLGZlLkludmFsaWRLZXkpKSx0aGlzLmlzS2V5SW52YWxpZD0hMCkpfWVsc2UgdGhpcy5lbWl0KFl0LkVycm9yLG5ldyBtZShga2V5IG1pc3NpbmcgZm9yIHBhcnRpY2lwYW50ICR7dGhpcy5wYXJ0aWNpcGFudElkfWAsZmUuTWlzc2luZ0tleSkpO3JldHVybiBuLmVucXVldWUoZSl9KX1kZWNyeXB0RnJhbWUoYSxkKXtyZXR1cm4gdyh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbiooZSxuLHM9dm9pZCAwLGk9e3JhdGNoZXRDb3VudDowfSl7dmFyIGw7Y29uc3Qgbz10aGlzLmtleXMuZ2V0S2V5U2V0KG4pO3RyeXtjb25zdCBtPW5ldyBVaW50OEFycmF5KGUuZGF0YSwwLHRoaXMuZ2V0VW5lbmNyeXB0ZWRCeXRlcyhlKSksdj1uZXcgVWludDhBcnJheShlLmRhdGEsZS5kYXRhLmJ5dGVMZW5ndGgtMiwyKSxFPXZbMF0sST1uZXcgVWludDhBcnJheShlLmRhdGEsZS5kYXRhLmJ5dGVMZW5ndGgtRS12LmJ5dGVMZW5ndGgsRSkseD1tLmJ5dGVMZW5ndGgsJD1lLmRhdGEuYnl0ZUxlbmd0aC0obS5ieXRlTGVuZ3RoK0Urdi5ieXRlTGVuZ3RoKSxGPXlpZWxkIGNyeXB0by5zdWJ0bGUuZGVjcnlwdCh7bmFtZTprLGl2OkksYWRkaXRpb25hbERhdGE6bmV3IFVpbnQ4QXJyYXkoZS5kYXRhLDAsbS5ieXRlTGVuZ3RoKX0sKGw9aS5lbmNyeXB0aW9uS2V5KSE9bnVsbD9sOm8uZW5jcnlwdGlvbktleSxuZXcgVWludDhBcnJheShlLmRhdGEseCwkKSksSD1uZXcgQXJyYXlCdWZmZXIobS5ieXRlTGVuZ3RoK0YuYnl0ZUxlbmd0aCksWj1uZXcgVWludDhBcnJheShIKTtyZXR1cm4gWi5zZXQobmV3IFVpbnQ4QXJyYXkoZS5kYXRhLDAsbS5ieXRlTGVuZ3RoKSksWi5zZXQobmV3IFVpbnQ4QXJyYXkoRiksbS5ieXRlTGVuZ3RoKSxlLmRhdGE9SCxlfWNhdGNoKG0pe2lmKHRoaXMua2V5UHJvdmlkZXJPcHRpb25zLnJhdGNoZXRXaW5kb3dTaXplPjApe2lmKGkucmF0Y2hldENvdW50PHRoaXMua2V5UHJvdmlkZXJPcHRpb25zLnJhdGNoZXRXaW5kb3dTaXplKXtsZXQgdjtpZihvPT09dGhpcy5rZXlzLmdldEtleVNldChuKSl7Y29uc3QgST15aWVsZCB0aGlzLmtleXMucmF0Y2hldEtleShuLCExKTt2PXlpZWxkIFluKEksdGhpcy5rZXlQcm92aWRlck9wdGlvbnMucmF0Y2hldFNhbHQpfWNvbnN0IEU9eWllbGQgdGhpcy5kZWNyeXB0RnJhbWUoZSxuLHN8fG8se3JhdGNoZXRDb3VudDppLnJhdGNoZXRDb3VudCsxLGVuY3J5cHRpb25LZXk6dj09bnVsbD92b2lkIDA6di5lbmNyeXB0aW9uS2V5fSk7cmV0dXJuIEUmJnYmJih0aGlzLmtleXMuc2V0S2V5U2V0KHYsbiwhMCksdGhpcy5rZXlzLnNldEN1cnJlbnRLZXlJbmRleChuKSksRX1zJiZ0aGlzLmtleXMuc2V0S2V5RnJvbU1hdGVyaWFsKHMubWF0ZXJpYWwsbil9ZWxzZSB0aHJvdyBuZXcgbWUoIkRlY3J5cHRpb24gZmFpbGVkLCBtb3N0IGxpa2VseSBiZWNhdXNlIG9mIGFuIGludmFsaWQga2V5IixmZS5JbnZhbGlkS2V5KX19KX1tYWtlSVYoZSxuKXt2YXIgZDtjb25zdCBzPW5ldyBBcnJheUJ1ZmZlcihkZSksaT1uZXcgRGF0YVZpZXcocyk7dGhpcy5zZW5kQ291bnRzLmhhcyhlKXx8dGhpcy5zZW5kQ291bnRzLnNldChlLE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSo2NTUzNSkpO2NvbnN0IGE9KGQ9dGhpcy5zZW5kQ291bnRzLmdldChlKSkhPW51bGw/ZDowO3JldHVybiBpLnNldFVpbnQzMigwLGUpLGkuc2V0VWludDMyKDQsbiksaS5zZXRVaW50MzIoOCxuLWElNjU1MzUpLHRoaXMuc2VuZENvdW50cy5zZXQoZSxhKzEpLHN9Z2V0VW5lbmNyeXB0ZWRCeXRlcyhlKXt2YXIgbjtpZihQZChlKSl7Y29uc3Qgcz0obj10aGlzLmdldFZpZGVvQ29kZWMoZSkpIT1udWxsP246dGhpcy52aWRlb0NvZGVjO2lmKHM9PT0iYXYxInx8cz09PSJ2cDkiKXRocm93IG5ldyBFcnJvcihgJHtzfSBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgZW5kIHRvIGVuZCBlbmNyeXB0aW9uYCk7cmV0dXJuIE1bZS50eXBlXX1yZXR1cm4gTS5hdWRpb31nZXRWaWRlb0NvZGVjKGUpe2lmKHRoaXMucnRwTWFwLnNpemU9PT0wKXJldHVybjtjb25zdHtwYXlsb2FkVHlwZTpufT1lLmdldE1ldGFkYXRhKCk7cmV0dXJuIG4/dGhpcy5ydHBNYXAuZ2V0KG4pOnZvaWQgMH19ZnVuY3Rpb24gQWQodCxyKXtjb25zdCBlPW5ldyBVaW50OEFycmF5KHQuc2xpY2UodC5ieXRlTGVuZ3RoLXIuYnl0ZUxlbmd0aCkpO3JldHVybiByLmV2ZXJ5KChuLHMpPT5uPT09ZVtzXSl9Y2xhc3MgSm4gZXh0ZW5kcyBHbntjb25zdHJ1Y3RvcihlLG4scyl7c3VwZXIodm9pZCAwKTtwKHRoaXMsImN1cnJlbnRLZXlJbmRleCIpO3AodGhpcywiY3J5cHRvS2V5UmluZyIpO3AodGhpcywiZW5hYmxlZCIpO3AodGhpcywia2V5UHJvdmlkZXJPcHRpb25zIik7cCh0aGlzLCJyYXRjaGV0UHJvbWlzZU1hcCIpO3AodGhpcywicGFydGljaXBhbnRJZCIpO3RoaXMuY3VycmVudEtleUluZGV4PTAsdGhpcy5jcnlwdG9LZXlSaW5nPW5ldyBBcnJheSgxNiksdGhpcy5lbmFibGVkPW4sdGhpcy5rZXlQcm92aWRlck9wdGlvbnM9cyx0aGlzLnJhdGNoZXRQcm9taXNlTWFwPW5ldyBNYXAsdGhpcy5wYXJ0aWNpcGFudElkPWV9c2V0RW5hYmxlZChlKXt0aGlzLmVuYWJsZWQ9ZX1yYXRjaGV0S2V5KGUsbj0hMCl7Y29uc3Qgcz1lIT1udWxsP2U6dGhpcy5nZXRDdXJyZW50S2V5SW5kZXgoKSxpPXMsYT10aGlzLnJhdGNoZXRQcm9taXNlTWFwLmdldChpKTtpZih0eXBlb2YgYSE9InVuZGVmaW5lZCIpcmV0dXJuIGE7Y29uc3QgZD1uZXcgUHJvbWlzZSgobyxsKT0+dyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dHJ5e2NvbnN0IG09dGhpcy5nZXRLZXlTZXQoaSkubWF0ZXJpYWwsdj15aWVsZCBDZCh5aWVsZCB3ZChtLHRoaXMua2V5UHJvdmlkZXJPcHRpb25zLnJhdGNoZXRTYWx0KSxtLmFsZ29yaXRobS5uYW1lLCJkZXJpdmUiKTtuJiZ0aGlzLnNldEtleUZyb21NYXRlcmlhbCh2LGksITApLHRoaXMuZW1pdCgia2V5UmF0Y2hldGVkIix2LHMsdGhpcy5wYXJ0aWNpcGFudElkKSxvKHYpfWNhdGNoKG0pe2wobSl9ZmluYWxseXt0aGlzLnJhdGNoZXRQcm9taXNlTWFwLmRlbGV0ZShpKX19KSk7cmV0dXJuIHRoaXMucmF0Y2hldFByb21pc2VNYXAuc2V0KGksZCksZH1zZXRLZXlGcm9tTWF0ZXJpYWwoZSxuPTAscz0hMSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe24+PTAmJih0aGlzLmN1cnJlbnRLZXlJbmRleD1uJXRoaXMuY3J5cHRvS2V5UmluZy5sZW5ndGgpO2NvbnN0IGk9eWllbGQgWW4oZSx0aGlzLmtleVByb3ZpZGVyT3B0aW9ucy5yYXRjaGV0U2FsdCk7dGhpcy5zZXRLZXlTZXQoaSx0aGlzLmN1cnJlbnRLZXlJbmRleCxzKX0pfXNldEtleVNldChlLG4scz0hMSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3RoaXMuY3J5cHRvS2V5UmluZ1tuJXRoaXMuY3J5cHRvS2V5UmluZy5sZW5ndGhdPWUscyYmdGhpcy5lbWl0KCJrZXlSYXRjaGV0ZWQiLGUubWF0ZXJpYWwsbix0aGlzLnBhcnRpY2lwYW50SWQpfSl9c2V0Q3VycmVudEtleUluZGV4KGUpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXt0aGlzLmN1cnJlbnRLZXlJbmRleD1lJXRoaXMuY3J5cHRvS2V5UmluZy5sZW5ndGh9KX1pc0VuYWJsZWQoKXtyZXR1cm4gdGhpcy5lbmFibGVkfWdldEN1cnJlbnRLZXlJbmRleCgpe3JldHVybiB0aGlzLmN1cnJlbnRLZXlJbmRleH1nZXRLZXlTZXQoZSl7cmV0dXJuIHRoaXMuY3J5cHRvS2V5UmluZ1tlIT1udWxsP2U6dGhpcy5jdXJyZW50S2V5SW5kZXhdfX1jb25zdCBRdD1bXSxKdD1uZXcgTWFwLFh0PVtdO2xldCBjZSxadD0hMSxYbj0hMSxlcixnZT1NdDtmdW5jdGlvbiBTZSh0LHIpe3Bvc3RNZXNzYWdlKHtraW5kOiJsb2ciLGRhdGE6e2xldmVsOnQsc3RyOnJ9fSl9ZnVuY3Rpb24gTWQodCxyKXtwb3N0TWVzc2FnZSh7a2luZDoicmF0Y2hldEtleSIsZGF0YTp7a2V5SW5kZXg6cixtYXRlcmlhbDp0fX0pfWZ1bmN0aW9uIFZlKHQpe2lmKCF0KXJldHVybiBjZTtsZXQgcj1KdC5nZXQodCk7cmV0dXJuIHJ8fChyPW5ldyBKbih0LCEwLGdlKSxlciYmci5zZXRLZXlGcm9tTWF0ZXJpYWwoZXIpLEp0LnNldCh0LHIpKSxyfWZ1bmN0aW9uIGtkKHQscil7cj9WZShyKS5zZXRFbmFibGVkKHQpOihadD10LGNlLnNldEVuYWJsZWQodCkpfWZ1bmN0aW9uIFpuKHQpe3Qub24oImNyeXB0b3JFcnJvciIscj0+e2NvbnN0IGU9e2tpbmQ6ImVycm9yIixkYXRhOntlcnJvcjpuZXcgRXJyb3IoYCR7ZmVbci5yZWFzb25dfTogJHtyLm1lc3NhZ2V9YCl9fTtwb3N0TWVzc2FnZShlKX0pfWZ1bmN0aW9uIHRyKHQscil7bGV0IGU9UXQuZmluZChuPT5uLmdldFRyYWNrSWQoKT09PXIpO2lmKGUpdCE9PWUuZ2V0UGFydGljaXBhbnRJZCgpJiZlLnNldFBhcnRpY2lwYW50KHQsVmUodCkpO2Vsc2V7aWYoU2UoImluZm8iLGBjcmVhdGluZyBuZXcgY3J5cHRvciBmb3IgJHt0fWApLCFnZSl0aHJvdyBFcnJvcigiTWlzc2luZyBrZXlQcm92aWRlciBvcHRpb25zIik7ZT1uZXcgUW4oe3BhcnRpY2lwYW50SWQ6dCxrZXlzOlZlKHQpLGtleVByb3ZpZGVyT3B0aW9uczpnZX0pLFpuKGUpLFF0LnB1c2goZSl9cmV0dXJuIGV9ZnVuY3Rpb24gZXModCl7bGV0IHI9WHQuZmluZChlPT5lLmdldFRyYWNrSWQoKT09PXQpO2lmKCFyKXtpZighZ2UpdGhyb3cgbmV3IFR5cGVFcnJvcigiTWlzc2luZyBrZXlQcm92aWRlciBvcHRpb25zIik7cj1uZXcgUW4oe2tleXM6Y2UscGFydGljaXBhbnRJZDoicHVibGlzaGVyIixrZXlQcm92aWRlck9wdGlvbnM6Z2V9KSxabihyKSxYdC5wdXNoKHIpfXJldHVybiByfWZ1bmN0aW9uIE9kKHQpe3ZhciByOyhyPVF0LmZpbmQoZT0+ZS5nZXRUcmFja0lkKCk9PT10KSk9PW51bGx8fHIudW5zZXRQYXJ0aWNpcGFudCgpfWZ1bmN0aW9uIExkKHQscil7U2UoImRlYnVnIiwic2V0dGluZyBzaGFyZWQga2V5IiksZXI9dCxjZT09bnVsbHx8Y2Uuc2V0S2V5RnJvbU1hdGVyaWFsKHQscik7Zm9yKGNvbnN0WyxlXW9mIEp0KWUuc2V0S2V5RnJvbU1hdGVyaWFsKHQscil9b25tZXNzYWdlPXQ9Pntjb25zdHtraW5kOnIsZGF0YTplfT10LmRhdGE7c3dpdGNoKHIpe2Nhc2UiaW5pdCI6U2UoImluZm8iLCJ3b3JrZXIgaW5pdGlhbGl6ZWQiKSxnZT1lLmtleVByb3ZpZGVyT3B0aW9ucyxYbj0hIWUua2V5UHJvdmlkZXJPcHRpb25zLnNoYXJlZEtleTtjb25zdCBuPXtraW5kOiJlbmFibGUiLGRhdGE6e2VuYWJsZWQ6WnR9fTtjZT1uZXcgSm4odm9pZCAwLFp0LGdlKSxjZS5vbigia2V5UmF0Y2hldGVkIixNZCkscG9zdE1lc3NhZ2Uobik7YnJlYWs7Y2FzZSJlbmFibGUiOmtkKGUuZW5hYmxlZCxlLnBhcnRpY2lwYW50SWQpLFNlKCJpbmZvIiwidXBkYXRlZCBlMmVlIGVuYWJsZWQgc3RhdHVzIikscG9zdE1lc3NhZ2UodC5kYXRhKTticmVhaztjYXNlImRlY29kZSI6dHIoZS5wYXJ0aWNpcGFudElkLGUudHJhY2tJZCkuc2V0dXBUcmFuc2Zvcm0ocixlLnJlYWRhYmxlU3RyZWFtLGUud3JpdGFibGVTdHJlYW0sZS50cmFja0lkLGUuY29kZWMpO2JyZWFrO2Nhc2UiZW5jb2RlIjplcyhlLnRyYWNrSWQpLnNldHVwVHJhbnNmb3JtKHIsZS5yZWFkYWJsZVN0cmVhbSxlLndyaXRhYmxlU3RyZWFtLGUudHJhY2tJZCxlLmNvZGVjKTticmVhaztjYXNlInNldEtleSI6WG4/KFNlKCJkZWJ1ZyIsInNldCBzaGFyZWQga2V5IiksTGQoZS5rZXksZS5rZXlJbmRleCkpOmUucGFydGljaXBhbnRJZD9WZShlLnBhcnRpY2lwYW50SWQpLnNldEtleUZyb21NYXRlcmlhbChlLmtleSxlLmtleUluZGV4KTpTZSgiZXJyb3IiLCJubyBwYXJ0aWNpcGFudCBJZCB3YXMgcHJvdmlkZWQgYW5kIHNoYXJlZCBrZXkgdXNhZ2UgaXMgZGlzYWJsZWQiKTticmVhaztjYXNlInJlbW92ZVRyYW5zZm9ybSI6T2QoZS50cmFja0lkKTticmVhaztjYXNlInVwZGF0ZUNvZGVjIjp0cihlLnBhcnRpY2lwYW50SWQsZS50cmFja0lkKS5zZXRWaWRlb0NvZGVjKGUuY29kZWMpO2JyZWFrO2Nhc2Uic2V0UlRQTWFwIjpYdC5mb3JFYWNoKGE9PnthLnNldFJ0cE1hcChlLm1hcCl9KTticmVhaztjYXNlInJhdGNoZXRSZXF1ZXN0IjpWZShlLnBhcnRpY2lwYW50SWQpLnJhdGNoZXRLZXkoZS5rZXlJbmRleCk7YnJlYWt9fSxzZWxmLlJUQ1RyYW5zZm9ybUV2ZW50JiYoU2UoImRlYnVnIiwic2V0dXAgdHJhbnNmb3JtIGV2ZW50Iiksc2VsZi5vbnJ0Y3RyYW5zZm9ybT10PT57Y29uc3R7dHJhbnNmb3JtZXI6cn09dDtyLmhhbmRsZWQ9ITA7Y29uc3R7a2luZDplLHBhcnRpY2lwYW50SWQ6bix0cmFja0lkOnMsY29kZWM6aX09ci5vcHRpb25zOyhlPT09ImVuY29kZSI/ZXMocyk6dHIobixzKSkuc2V0dXBUcmFuc2Zvcm0oZSxyLnJlYWRhYmxlLHIud3JpdGFibGUscyxpKX0pfSkoKTsK", g = typeof window != "undefined" && window.Blob && new Blob([atob(ll)], { type: "text/javascript;charset=utf-8" });
|
|
419
419
|
function Ul() {
|
|
420
|
-
const Z =
|
|
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);
|
|
423
423
|
} finally {
|
|
424
424
|
Z && (window.URL || window.webkitURL).revokeObjectURL(Z);
|
|
425
425
|
}
|
|
426
426
|
}
|
|
427
|
-
var N,
|
|
428
|
-
class
|
|
427
|
+
var N, T, s, H, Zl, U, dl, a, C, Q, kl, S, cl, k, bl, o, Vl, K, Wl;
|
|
428
|
+
class Sl extends $ {
|
|
429
429
|
constructor(l) {
|
|
430
430
|
super(void 0);
|
|
431
431
|
p(this, N);
|
|
@@ -434,12 +434,12 @@ class Hl extends $ {
|
|
|
434
434
|
// this.postRTPMap(rtpMap);
|
|
435
435
|
// });
|
|
436
436
|
// }
|
|
437
|
-
p(this,
|
|
437
|
+
p(this, H);
|
|
438
438
|
p(this, U);
|
|
439
439
|
p(this, a);
|
|
440
|
-
p(this,
|
|
441
|
-
p(this, H);
|
|
440
|
+
p(this, Q);
|
|
442
441
|
p(this, S);
|
|
442
|
+
p(this, k);
|
|
443
443
|
/**
|
|
444
444
|
* Handles the given {@code RTCRtpReceiver} by
|
|
445
445
|
* creating a {@code TransformStream} which will inject
|
|
@@ -464,8 +464,8 @@ class Hl 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((
|
|
468
|
-
|
|
467
|
+
this.encryptionEnabled !== b.enabled && !b.participantId ? this.encryptionEnabled = b.enabled : b.participantId, this.encryptionEnabled && this.keyProvider.getKeys().forEach((V) => {
|
|
468
|
+
Y(this, a, C).call(this, V);
|
|
469
469
|
});
|
|
470
470
|
break;
|
|
471
471
|
case "ratchetKey":
|
|
@@ -491,22 +491,22 @@ class Hl extends $ {
|
|
|
491
491
|
* @internal
|
|
492
492
|
*/
|
|
493
493
|
setup() {
|
|
494
|
-
if (!
|
|
494
|
+
if (!Il())
|
|
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"),
|
|
498
|
+
this.logger.info("setting up e2ee"), Y(this, H, 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 = j(this, s), this.worker.postMessage(l)),
|
|
505
|
+
this.worker && (this.logger.info("initializing worker"), this.worker.onmessage = this.onWorkerMessage, this.worker.onerror = j(this, s), this.worker.postMessage(l)), Y(this, N, T).call(this, !0);
|
|
506
506
|
}
|
|
507
507
|
}
|
|
508
|
-
N = new WeakSet(),
|
|
509
|
-
return
|
|
508
|
+
N = new WeakSet(), T = function(l, c) {
|
|
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,42 +516,42 @@ 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(),
|
|
519
|
+
}, s = new WeakMap(), H = new WeakSet(), Zl = function(l) {
|
|
520
520
|
this.peerSessionStore.on(
|
|
521
|
-
|
|
521
|
+
i.NEW_CONSUMER,
|
|
522
522
|
({ appData: c, peerId: b }) => {
|
|
523
|
-
c.e2ee &&
|
|
523
|
+
c.e2ee && Y(this, N, T).call(this, c.e2ee, b);
|
|
524
524
|
}
|
|
525
525
|
), this.peerSessionStore.on(
|
|
526
|
-
|
|
526
|
+
i.E2EE_INACTIVE_CONSUMER,
|
|
527
527
|
({ peerId: c, trackId: b }) => {
|
|
528
|
-
var
|
|
529
|
-
const
|
|
528
|
+
var W;
|
|
529
|
+
const V = {
|
|
530
530
|
kind: "removeTransform",
|
|
531
531
|
data: {
|
|
532
532
|
participantId: c,
|
|
533
533
|
trackId: b
|
|
534
534
|
}
|
|
535
535
|
};
|
|
536
|
-
(
|
|
536
|
+
(W = this.worker) == null || W.postMessage(V);
|
|
537
537
|
}
|
|
538
538
|
), this.peerSessionStore.on(
|
|
539
|
-
|
|
539
|
+
i.E2EE_ACTIVE_CONSUMER,
|
|
540
540
|
({
|
|
541
541
|
track: c,
|
|
542
542
|
rtpReceiver: b,
|
|
543
|
-
peerId:
|
|
544
|
-
}) =>
|
|
543
|
+
peerId: V
|
|
544
|
+
}) => Y(this, S, cl).call(this, c, b, V)
|
|
545
545
|
), this.peerSessionStore.on(
|
|
546
|
-
|
|
546
|
+
i.E2EE_ACTIVE_PRODUCER,
|
|
547
547
|
({
|
|
548
548
|
track: c,
|
|
549
549
|
rtpSender: b,
|
|
550
|
-
appData:
|
|
551
|
-
}) =>
|
|
552
|
-
), l.on("setKey", (c) =>
|
|
550
|
+
appData: V
|
|
551
|
+
}) => Y(this, k, bl).call(this, c, b, V.peerId)
|
|
552
|
+
), l.on("setKey", (c) => Y(this, a, C).call(this, c)).on(
|
|
553
553
|
"ratchetRequest",
|
|
554
|
-
(c, b) =>
|
|
554
|
+
(c, b) => Y(this, U, dl).call(this, c, b)
|
|
555
555
|
);
|
|
556
556
|
}, U = new WeakSet(), dl = function(l, c) {
|
|
557
557
|
if (!this.worker)
|
|
@@ -564,10 +564,10 @@ N = new WeakSet(), C = function(l, c) {
|
|
|
564
564
|
}
|
|
565
565
|
};
|
|
566
566
|
this.worker.postMessage(b);
|
|
567
|
-
}, a = new WeakSet(),
|
|
567
|
+
}, a = new WeakSet(), C = 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
|
|
570
|
+
const V = {
|
|
571
571
|
kind: "setKey",
|
|
572
572
|
data: {
|
|
573
573
|
participantId: c,
|
|
@@ -575,8 +575,8 @@ N = new WeakSet(), C = function(l, c) {
|
|
|
575
575
|
keyIndex: b
|
|
576
576
|
}
|
|
577
577
|
};
|
|
578
|
-
this.worker.postMessage(
|
|
579
|
-
},
|
|
578
|
+
this.worker.postMessage(V);
|
|
579
|
+
}, Q = new WeakSet(), kl = function(l) {
|
|
580
580
|
if (!this.worker)
|
|
581
581
|
throw Error("could not post rtp map, worker is missing");
|
|
582
582
|
const c = {
|
|
@@ -586,84 +586,84 @@ N = new WeakSet(), C = function(l, c) {
|
|
|
586
586
|
}
|
|
587
587
|
};
|
|
588
588
|
this.worker.postMessage(c);
|
|
589
|
-
},
|
|
590
|
-
|
|
591
|
-
},
|
|
592
|
-
|
|
593
|
-
}, o = new WeakSet(),
|
|
594
|
-
return
|
|
589
|
+
}, S = new WeakSet(), cl = function(l, c, b) {
|
|
590
|
+
Y(this, o, Vl).call(this, c, l.id, b);
|
|
591
|
+
}, k = new WeakSet(), bl = function(l, c, b) {
|
|
592
|
+
Y(this, K, Wl).call(this, c, l.id, b);
|
|
593
|
+
}, o = new WeakSet(), Vl = function(l, c, b, V) {
|
|
594
|
+
return J(this, null, function* () {
|
|
595
595
|
if (!this.worker)
|
|
596
596
|
return;
|
|
597
|
-
const
|
|
597
|
+
const W = l;
|
|
598
598
|
if (z()) {
|
|
599
|
-
const
|
|
599
|
+
const X = {
|
|
600
600
|
kind: "decode",
|
|
601
601
|
participantId: b,
|
|
602
602
|
trackId: c,
|
|
603
|
-
codec:
|
|
603
|
+
codec: V
|
|
604
604
|
};
|
|
605
|
-
|
|
605
|
+
W.transform = new RTCRtpScriptTransform(this.worker, X);
|
|
606
606
|
} else {
|
|
607
|
-
if (F in
|
|
607
|
+
if (F in W && V) {
|
|
608
608
|
const y = {
|
|
609
609
|
kind: "updateCodec",
|
|
610
610
|
data: {
|
|
611
611
|
trackId: c,
|
|
612
|
-
codec:
|
|
612
|
+
codec: V,
|
|
613
613
|
participantId: b
|
|
614
614
|
}
|
|
615
615
|
};
|
|
616
616
|
this.worker.postMessage(y);
|
|
617
617
|
return;
|
|
618
618
|
}
|
|
619
|
-
let
|
|
620
|
-
if (!
|
|
621
|
-
const y =
|
|
622
|
-
|
|
619
|
+
let X = W.writableStream, G = W.readableStream;
|
|
620
|
+
if (!X || !G) {
|
|
621
|
+
const y = W.createEncodedStreams();
|
|
622
|
+
W.writableStream = y.writable, X = y.writable, W.readableStream = y.readable, G = y.readable;
|
|
623
623
|
}
|
|
624
|
-
const
|
|
624
|
+
const u = {
|
|
625
625
|
kind: "decode",
|
|
626
626
|
data: {
|
|
627
627
|
readableStream: G,
|
|
628
|
-
writableStream:
|
|
628
|
+
writableStream: X,
|
|
629
629
|
trackId: c,
|
|
630
|
-
codec:
|
|
630
|
+
codec: V,
|
|
631
631
|
participantId: b
|
|
632
632
|
}
|
|
633
633
|
};
|
|
634
|
-
this.worker.postMessage(
|
|
634
|
+
this.worker.postMessage(u, [G, X]);
|
|
635
635
|
}
|
|
636
|
-
|
|
636
|
+
W[F] = !0;
|
|
637
637
|
});
|
|
638
|
-
}, K = new WeakSet(),
|
|
638
|
+
}, K = new WeakSet(), Wl = function(l, c, b, V) {
|
|
639
639
|
if (F in l || !this.worker)
|
|
640
640
|
return;
|
|
641
|
-
const
|
|
641
|
+
const W = l;
|
|
642
642
|
if (z()) {
|
|
643
643
|
this.logger.warn("initialize script transform");
|
|
644
|
-
const
|
|
644
|
+
const X = {
|
|
645
645
|
kind: "encode",
|
|
646
646
|
participantId: b,
|
|
647
647
|
trackId: c,
|
|
648
|
-
codec:
|
|
648
|
+
codec: V
|
|
649
649
|
};
|
|
650
|
-
|
|
650
|
+
W.transform = new RTCRtpScriptTransform(this.worker, X);
|
|
651
651
|
} else {
|
|
652
652
|
this.logger.warn("initialize encoded streams");
|
|
653
|
-
const
|
|
653
|
+
const X = W.createEncodedStreams(), G = {
|
|
654
654
|
kind: "encode",
|
|
655
655
|
data: {
|
|
656
|
-
readableStream:
|
|
657
|
-
writableStream:
|
|
658
|
-
codec:
|
|
656
|
+
readableStream: X.readable,
|
|
657
|
+
writableStream: X.writable,
|
|
658
|
+
codec: V,
|
|
659
659
|
trackId: c,
|
|
660
660
|
participantId: b || "publisher"
|
|
661
661
|
}
|
|
662
662
|
};
|
|
663
|
-
this.worker.postMessage(G, [
|
|
663
|
+
this.worker.postMessage(G, [X.readable, X.writable]);
|
|
664
664
|
}
|
|
665
|
-
|
|
666
|
-
}, R(
|
|
665
|
+
W[F] = !0;
|
|
666
|
+
}, R(Sl, "SharedKeyProvider", Hl);
|
|
667
667
|
export {
|
|
668
|
-
|
|
668
|
+
Sl as default
|
|
669
669
|
};
|