@blinkk/root-cms 1.0.0-rc.3 → 1.0.0-rc.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/ui/signin.js CHANGED
@@ -4,48 +4,48 @@
4
4
  var stringToByteArray$1 = function(str) {
5
5
  const out = [];
6
6
  let p2 = 0;
7
- for (let i2 = 0; i2 < str.length; i2++) {
8
- let c2 = str.charCodeAt(i2);
9
- if (c2 < 128) {
10
- out[p2++] = c2;
11
- } else if (c2 < 2048) {
12
- out[p2++] = c2 >> 6 | 192;
13
- out[p2++] = c2 & 63 | 128;
14
- } else if ((c2 & 64512) === 55296 && i2 + 1 < str.length && (str.charCodeAt(i2 + 1) & 64512) === 56320) {
15
- c2 = 65536 + ((c2 & 1023) << 10) + (str.charCodeAt(++i2) & 1023);
16
- out[p2++] = c2 >> 18 | 240;
17
- out[p2++] = c2 >> 12 & 63 | 128;
18
- out[p2++] = c2 >> 6 & 63 | 128;
19
- out[p2++] = c2 & 63 | 128;
7
+ for (let i4 = 0; i4 < str.length; i4++) {
8
+ let c3 = str.charCodeAt(i4);
9
+ if (c3 < 128) {
10
+ out[p2++] = c3;
11
+ } else if (c3 < 2048) {
12
+ out[p2++] = c3 >> 6 | 192;
13
+ out[p2++] = c3 & 63 | 128;
14
+ } else if ((c3 & 64512) === 55296 && i4 + 1 < str.length && (str.charCodeAt(i4 + 1) & 64512) === 56320) {
15
+ c3 = 65536 + ((c3 & 1023) << 10) + (str.charCodeAt(++i4) & 1023);
16
+ out[p2++] = c3 >> 18 | 240;
17
+ out[p2++] = c3 >> 12 & 63 | 128;
18
+ out[p2++] = c3 >> 6 & 63 | 128;
19
+ out[p2++] = c3 & 63 | 128;
20
20
  } else {
21
- out[p2++] = c2 >> 12 | 224;
22
- out[p2++] = c2 >> 6 & 63 | 128;
23
- out[p2++] = c2 & 63 | 128;
21
+ out[p2++] = c3 >> 12 | 224;
22
+ out[p2++] = c3 >> 6 & 63 | 128;
23
+ out[p2++] = c3 & 63 | 128;
24
24
  }
25
25
  }
26
26
  return out;
27
27
  };
28
28
  var byteArrayToString = function(bytes) {
29
29
  const out = [];
30
- let pos = 0, c2 = 0;
30
+ let pos = 0, c3 = 0;
31
31
  while (pos < bytes.length) {
32
32
  const c1 = bytes[pos++];
33
33
  if (c1 < 128) {
34
- out[c2++] = String.fromCharCode(c1);
34
+ out[c3++] = String.fromCharCode(c1);
35
35
  } else if (c1 > 191 && c1 < 224) {
36
36
  const c22 = bytes[pos++];
37
- out[c2++] = String.fromCharCode((c1 & 31) << 6 | c22 & 63);
37
+ out[c3++] = String.fromCharCode((c1 & 31) << 6 | c22 & 63);
38
38
  } else if (c1 > 239 && c1 < 365) {
39
39
  const c22 = bytes[pos++];
40
- const c3 = bytes[pos++];
40
+ const c32 = bytes[pos++];
41
41
  const c4 = bytes[pos++];
42
- const u2 = ((c1 & 7) << 18 | (c22 & 63) << 12 | (c3 & 63) << 6 | c4 & 63) - 65536;
43
- out[c2++] = String.fromCharCode(55296 + (u2 >> 10));
44
- out[c2++] = String.fromCharCode(56320 + (u2 & 1023));
42
+ const u4 = ((c1 & 7) << 18 | (c22 & 63) << 12 | (c32 & 63) << 6 | c4 & 63) - 65536;
43
+ out[c3++] = String.fromCharCode(55296 + (u4 >> 10));
44
+ out[c3++] = String.fromCharCode(56320 + (u4 & 1023));
45
45
  } else {
46
46
  const c22 = bytes[pos++];
47
- const c3 = bytes[pos++];
48
- out[c2++] = String.fromCharCode((c1 & 15) << 12 | (c22 & 63) << 6 | c3 & 63);
47
+ const c32 = bytes[pos++];
48
+ out[c3++] = String.fromCharCode((c1 & 15) << 12 | (c22 & 63) << 6 | c32 & 63);
49
49
  }
50
50
  }
51
51
  return out.join("");
@@ -110,12 +110,12 @@
110
110
  this.init_();
111
111
  const byteToCharMap = webSafe ? this.byteToCharMapWebSafe_ : this.byteToCharMap_;
112
112
  const output = [];
113
- for (let i2 = 0; i2 < input.length; i2 += 3) {
114
- const byte1 = input[i2];
115
- const haveByte2 = i2 + 1 < input.length;
116
- const byte2 = haveByte2 ? input[i2 + 1] : 0;
117
- const haveByte3 = i2 + 2 < input.length;
118
- const byte3 = haveByte3 ? input[i2 + 2] : 0;
113
+ for (let i4 = 0; i4 < input.length; i4 += 3) {
114
+ const byte1 = input[i4];
115
+ const haveByte2 = i4 + 1 < input.length;
116
+ const byte2 = haveByte2 ? input[i4 + 1] : 0;
117
+ const haveByte3 = i4 + 2 < input.length;
118
+ const byte3 = haveByte3 ? input[i4 + 2] : 0;
119
119
  const outByte1 = byte1 >> 2;
120
120
  const outByte2 = (byte1 & 3) << 4 | byte2 >> 4;
121
121
  let outByte3 = (byte2 & 15) << 2 | byte3 >> 6;
@@ -177,17 +177,17 @@
177
177
  this.init_();
178
178
  const charToByteMap = webSafe ? this.charToByteMapWebSafe_ : this.charToByteMap_;
179
179
  const output = [];
180
- for (let i2 = 0; i2 < input.length; ) {
181
- const byte1 = charToByteMap[input.charAt(i2++)];
182
- const haveByte2 = i2 < input.length;
183
- const byte2 = haveByte2 ? charToByteMap[input.charAt(i2)] : 0;
184
- ++i2;
185
- const haveByte3 = i2 < input.length;
186
- const byte3 = haveByte3 ? charToByteMap[input.charAt(i2)] : 64;
187
- ++i2;
188
- const haveByte4 = i2 < input.length;
189
- const byte4 = haveByte4 ? charToByteMap[input.charAt(i2)] : 64;
190
- ++i2;
180
+ for (let i4 = 0; i4 < input.length; ) {
181
+ const byte1 = charToByteMap[input.charAt(i4++)];
182
+ const haveByte2 = i4 < input.length;
183
+ const byte2 = haveByte2 ? charToByteMap[input.charAt(i4)] : 0;
184
+ ++i4;
185
+ const haveByte3 = i4 < input.length;
186
+ const byte3 = haveByte3 ? charToByteMap[input.charAt(i4)] : 64;
187
+ ++i4;
188
+ const haveByte4 = i4 < input.length;
189
+ const byte4 = haveByte4 ? charToByteMap[input.charAt(i4)] : 64;
190
+ ++i4;
191
191
  if (byte1 == null || byte2 == null || byte3 == null || byte4 == null) {
192
192
  throw new DecodeBase64StringError();
193
193
  }
@@ -215,14 +215,14 @@
215
215
  this.charToByteMap_ = {};
216
216
  this.byteToCharMapWebSafe_ = {};
217
217
  this.charToByteMapWebSafe_ = {};
218
- for (let i2 = 0; i2 < this.ENCODED_VALS.length; i2++) {
219
- this.byteToCharMap_[i2] = this.ENCODED_VALS.charAt(i2);
220
- this.charToByteMap_[this.byteToCharMap_[i2]] = i2;
221
- this.byteToCharMapWebSafe_[i2] = this.ENCODED_VALS_WEBSAFE.charAt(i2);
222
- this.charToByteMapWebSafe_[this.byteToCharMapWebSafe_[i2]] = i2;
223
- if (i2 >= this.ENCODED_VALS_BASE.length) {
224
- this.charToByteMap_[this.ENCODED_VALS_WEBSAFE.charAt(i2)] = i2;
225
- this.charToByteMapWebSafe_[this.ENCODED_VALS.charAt(i2)] = i2;
218
+ for (let i4 = 0; i4 < this.ENCODED_VALS.length; i4++) {
219
+ this.byteToCharMap_[i4] = this.ENCODED_VALS.charAt(i4);
220
+ this.charToByteMap_[this.byteToCharMap_[i4]] = i4;
221
+ this.byteToCharMapWebSafe_[i4] = this.ENCODED_VALS_WEBSAFE.charAt(i4);
222
+ this.charToByteMapWebSafe_[this.byteToCharMapWebSafe_[i4]] = i4;
223
+ if (i4 >= this.ENCODED_VALS_BASE.length) {
224
+ this.charToByteMap_[this.ENCODED_VALS_WEBSAFE.charAt(i4)] = i4;
225
+ this.charToByteMapWebSafe_[this.ENCODED_VALS.charAt(i4)] = i4;
226
226
  }
227
227
  }
228
228
  }
@@ -244,8 +244,8 @@
244
244
  var base64Decode = function(str) {
245
245
  try {
246
246
  return base64.decodeString(str, true);
247
- } catch (e2) {
248
- console.error("base64Decode failed: ", e2);
247
+ } catch (e3) {
248
+ console.error("base64Decode failed: ", e3);
249
249
  }
250
250
  return null;
251
251
  };
@@ -278,7 +278,7 @@
278
278
  let match;
279
279
  try {
280
280
  match = document.cookie.match(/__FIREBASE_DEFAULTS__=([^;]+)/);
281
- } catch (e2) {
281
+ } catch (e3) {
282
282
  return;
283
283
  }
284
284
  const decoded = match && base64Decode(match[1]);
@@ -287,8 +287,8 @@
287
287
  var getDefaults = () => {
288
288
  try {
289
289
  return getDefaultsFromGlobal() || getDefaultsFromEnvVariable() || getDefaultsFromCookie();
290
- } catch (e2) {
291
- console.info(`Unable to get __FIREBASE_DEFAULTS__ due to: ${e2}`);
290
+ } catch (e3) {
291
+ console.info(`Unable to get __FIREBASE_DEFAULTS__ due to: ${e3}`);
292
292
  return;
293
293
  }
294
294
  };
@@ -365,7 +365,7 @@
365
365
  function isIndexedDBAvailable() {
366
366
  try {
367
367
  return typeof indexedDB === "object";
368
- } catch (e2) {
368
+ } catch (e3) {
369
369
  return false;
370
370
  }
371
371
  }
@@ -424,7 +424,7 @@
424
424
  }
425
425
  };
426
426
  function replaceTemplate(template, data) {
427
- return template.replace(PATTERN, (_3, key) => {
427
+ return template.replace(PATTERN, (_, key) => {
428
428
  const value = data[key];
429
429
  return value != null ? String(value) : `<${key}?>`;
430
430
  });
@@ -438,18 +438,18 @@
438
438
  }
439
439
  return true;
440
440
  }
441
- function deepEqual(a2, b2) {
442
- if (a2 === b2) {
441
+ function deepEqual(a3, b3) {
442
+ if (a3 === b3) {
443
443
  return true;
444
444
  }
445
- const aKeys = Object.keys(a2);
446
- const bKeys = Object.keys(b2);
447
- for (const k2 of aKeys) {
448
- if (!bKeys.includes(k2)) {
445
+ const aKeys = Object.keys(a3);
446
+ const bKeys = Object.keys(b3);
447
+ for (const k3 of aKeys) {
448
+ if (!bKeys.includes(k3)) {
449
449
  return false;
450
450
  }
451
- const aProp = a2[k2];
452
- const bProp = b2[k2];
451
+ const aProp = a3[k3];
452
+ const bProp = b3[k3];
453
453
  if (isObject(aProp) && isObject(bProp)) {
454
454
  if (!deepEqual(aProp, bProp)) {
455
455
  return false;
@@ -458,8 +458,8 @@
458
458
  return false;
459
459
  }
460
460
  }
461
- for (const k2 of bKeys) {
462
- if (!aKeys.includes(k2)) {
461
+ for (const k3 of bKeys) {
462
+ if (!aKeys.includes(k3)) {
463
463
  return false;
464
464
  }
465
465
  }
@@ -519,8 +519,8 @@
519
519
  this.onNoObservers = onNoObservers;
520
520
  this.task.then(() => {
521
521
  executor(this);
522
- }).catch((e2) => {
523
- this.error(e2);
522
+ }).catch((e3) => {
523
+ this.error(e3);
524
524
  });
525
525
  }
526
526
  next(value) {
@@ -582,7 +582,7 @@
582
582
  } else {
583
583
  observer.complete();
584
584
  }
585
- } catch (e2) {
585
+ } catch (e3) {
586
586
  }
587
587
  return;
588
588
  });
@@ -592,11 +592,11 @@
592
592
  }
593
593
  // Unsubscribe is synchronous - we guarantee that no events are sent to
594
594
  // any unsubscribed Observer.
595
- unsubscribeOne(i2) {
596
- if (this.observers === void 0 || this.observers[i2] === void 0) {
595
+ unsubscribeOne(i4) {
596
+ if (this.observers === void 0 || this.observers[i4] === void 0) {
597
597
  return;
598
598
  }
599
- delete this.observers[i2];
599
+ delete this.observers[i4];
600
600
  this.observerCount -= 1;
601
601
  if (this.observerCount === 0 && this.onNoObservers !== void 0) {
602
602
  this.onNoObservers(this);
@@ -606,21 +606,21 @@
606
606
  if (this.finalized) {
607
607
  return;
608
608
  }
609
- for (let i2 = 0; i2 < this.observers.length; i2++) {
610
- this.sendOne(i2, fn);
609
+ for (let i4 = 0; i4 < this.observers.length; i4++) {
610
+ this.sendOne(i4, fn);
611
611
  }
612
612
  }
613
613
  // Call the Observer via one of it's callback function. We are careful to
614
614
  // confirm that the observe has not been unsubscribed since this asynchronous
615
615
  // function had been queued.
616
- sendOne(i2, fn) {
616
+ sendOne(i4, fn) {
617
617
  this.task.then(() => {
618
- if (this.observers !== void 0 && this.observers[i2] !== void 0) {
618
+ if (this.observers !== void 0 && this.observers[i4] !== void 0) {
619
619
  try {
620
- fn(this.observers[i2]);
621
- } catch (e2) {
620
+ fn(this.observers[i4]);
621
+ } catch (e3) {
622
622
  if (typeof console !== "undefined" && console.error) {
623
- console.error(e2);
623
+ console.error(e3);
624
624
  }
625
625
  }
626
626
  }
@@ -724,7 +724,7 @@
724
724
  if (instance) {
725
725
  deferred.resolve(instance);
726
726
  }
727
- } catch (e2) {
727
+ } catch (e3) {
728
728
  }
729
729
  }
730
730
  }
@@ -739,11 +739,11 @@
739
739
  return this.getOrInitializeService({
740
740
  instanceIdentifier: normalizedIdentifier
741
741
  });
742
- } catch (e2) {
742
+ } catch (e3) {
743
743
  if (optional) {
744
744
  return null;
745
745
  } else {
746
- throw e2;
746
+ throw e3;
747
747
  }
748
748
  }
749
749
  } else {
@@ -771,7 +771,7 @@
771
771
  if (isComponentEager(component)) {
772
772
  try {
773
773
  this.getOrInitializeService({ instanceIdentifier: DEFAULT_ENTRY_NAME });
774
- } catch (e2) {
774
+ } catch (e3) {
775
775
  }
776
776
  }
777
777
  for (const [instanceIdentifier, instanceDeferred] of this.instancesDeferred.entries()) {
@@ -781,7 +781,7 @@
781
781
  instanceIdentifier: normalizedIdentifier
782
782
  });
783
783
  instanceDeferred.resolve(instance);
784
- } catch (e2) {
784
+ } catch (e3) {
785
785
  }
786
786
  }
787
787
  }
@@ -1058,7 +1058,7 @@
1058
1058
  };
1059
1059
 
1060
1060
  // ../../node_modules/.pnpm/idb@7.1.1/node_modules/idb/build/wrap-idb-value.js
1061
- var instanceOfAny = (object, constructors) => constructors.some((c2) => object instanceof c2);
1061
+ var instanceOfAny = (object, constructors) => constructors.some((c3) => object instanceof c3);
1062
1062
  var idbProxyableTypes;
1063
1063
  var cursorAdvanceMethods;
1064
1064
  function getIdbProxyableTypes() {
@@ -1349,8 +1349,8 @@
1349
1349
  function _addComponent(app2, component) {
1350
1350
  try {
1351
1351
  app2.container.addComponent(component);
1352
- } catch (e2) {
1353
- logger.debug(`Component ${component.name} failed to register with FirebaseApp ${app2.name}`, e2);
1352
+ } catch (e3) {
1353
+ logger.debug(`Component ${component.name} failed to register with FirebaseApp ${app2.name}`, e3);
1354
1354
  }
1355
1355
  }
1356
1356
  function _registerComponent(component) {
@@ -1564,9 +1564,9 @@
1564
1564
  db.createObjectStore(STORE_NAME);
1565
1565
  }
1566
1566
  }
1567
- }).catch((e2) => {
1567
+ }).catch((e3) => {
1568
1568
  throw ERROR_FACTORY.create("idb-open", {
1569
- originalErrorMessage: e2.message
1569
+ originalErrorMessage: e3.message
1570
1570
  });
1571
1571
  });
1572
1572
  }
@@ -1577,12 +1577,12 @@
1577
1577
  const db = await getDbPromise();
1578
1578
  const result = await db.transaction(STORE_NAME).objectStore(STORE_NAME).get(computeKey(app2));
1579
1579
  return result;
1580
- } catch (e2) {
1581
- if (e2 instanceof FirebaseError) {
1582
- logger.warn(e2.message);
1580
+ } catch (e3) {
1581
+ if (e3 instanceof FirebaseError) {
1582
+ logger.warn(e3.message);
1583
1583
  } else {
1584
1584
  const idbGetError = ERROR_FACTORY.create("idb-get", {
1585
- originalErrorMessage: e2 === null || e2 === void 0 ? void 0 : e2.message
1585
+ originalErrorMessage: e3 === null || e3 === void 0 ? void 0 : e3.message
1586
1586
  });
1587
1587
  logger.warn(idbGetError.message);
1588
1588
  }
@@ -1595,12 +1595,12 @@
1595
1595
  const objectStore = tx.objectStore(STORE_NAME);
1596
1596
  await objectStore.put(heartbeatObject, computeKey(app2));
1597
1597
  await tx.done;
1598
- } catch (e2) {
1599
- if (e2 instanceof FirebaseError) {
1600
- logger.warn(e2.message);
1598
+ } catch (e3) {
1599
+ if (e3 instanceof FirebaseError) {
1600
+ logger.warn(e3.message);
1601
1601
  } else {
1602
1602
  const idbGetError = ERROR_FACTORY.create("idb-set", {
1603
- originalErrorMessage: e2 === null || e2 === void 0 ? void 0 : e2.message
1603
+ originalErrorMessage: e3 === null || e3 === void 0 ? void 0 : e3.message
1604
1604
  });
1605
1605
  logger.warn(idbGetError.message);
1606
1606
  }
@@ -1795,17 +1795,17 @@
1795
1795
  registerVersion(name2, version2, "app");
1796
1796
 
1797
1797
  // ../../node_modules/.pnpm/tslib@2.6.2/node_modules/tslib/tslib.es6.mjs
1798
- function __rest(s2, e2) {
1799
- var t2 = {};
1800
- for (var p2 in s2)
1801
- if (Object.prototype.hasOwnProperty.call(s2, p2) && e2.indexOf(p2) < 0)
1802
- t2[p2] = s2[p2];
1803
- if (s2 != null && typeof Object.getOwnPropertySymbols === "function")
1804
- for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s2); i2 < p2.length; i2++) {
1805
- if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s2, p2[i2]))
1806
- t2[p2[i2]] = s2[p2[i2]];
1807
- }
1808
- return t2;
1798
+ function __rest(s3, e3) {
1799
+ var t3 = {};
1800
+ for (var p2 in s3)
1801
+ if (Object.prototype.hasOwnProperty.call(s3, p2) && e3.indexOf(p2) < 0)
1802
+ t3[p2] = s3[p2];
1803
+ if (s3 != null && typeof Object.getOwnPropertySymbols === "function")
1804
+ for (var i4 = 0, p2 = Object.getOwnPropertySymbols(s3); i4 < p2.length; i4++) {
1805
+ if (e3.indexOf(p2[i4]) < 0 && Object.prototype.propertyIsEnumerable.call(s3, p2[i4]))
1806
+ t3[p2[i4]] = s3[p2[i4]];
1807
+ }
1808
+ return t3;
1809
1809
  }
1810
1810
 
1811
1811
  // ../../node_modules/.pnpm/@firebase+auth@1.3.2_@firebase+app@0.9.22/node_modules/@firebase/auth/dist/esm2017/index-94e5f531.js
@@ -2280,11 +2280,11 @@
2280
2280
  _fail(auth2, authError);
2281
2281
  }
2282
2282
  }
2283
- } catch (e2) {
2284
- if (e2 instanceof FirebaseError) {
2285
- throw e2;
2283
+ } catch (e3) {
2284
+ if (e3 instanceof FirebaseError) {
2285
+ throw e3;
2286
2286
  }
2287
- _fail(auth2, "network-request-failed", { "message": String(e2) });
2287
+ _fail(auth2, "network-request-failed", { "message": String(e3) });
2288
2288
  }
2289
2289
  }
2290
2290
  async function _performSignInRequest(auth2, method, path, request, customErrorMap = {}) {
@@ -2319,7 +2319,7 @@
2319
2319
  constructor(auth2) {
2320
2320
  this.auth = auth2;
2321
2321
  this.timer = null;
2322
- this.promise = new Promise((_3, reject) => {
2322
+ this.promise = new Promise((_, reject) => {
2323
2323
  this.timer = setTimeout(() => {
2324
2324
  return reject(_createError(
2325
2325
  this.auth,
@@ -2405,7 +2405,7 @@
2405
2405
  if (!isNaN(date.getTime())) {
2406
2406
  return date.toUTCString();
2407
2407
  }
2408
- } catch (e2) {
2408
+ } catch (e3) {
2409
2409
  }
2410
2410
  return void 0;
2411
2411
  }
@@ -2447,8 +2447,8 @@
2447
2447
  return null;
2448
2448
  }
2449
2449
  return JSON.parse(decoded);
2450
- } catch (e2) {
2451
- _logError("Caught error parsing JWT payload as JSON", e2 === null || e2 === void 0 ? void 0 : e2.toString());
2450
+ } catch (e3) {
2451
+ _logError("Caught error parsing JWT payload as JSON", e3 === null || e3 === void 0 ? void 0 : e3.toString());
2452
2452
  return null;
2453
2453
  }
2454
2454
  }
@@ -2477,13 +2477,13 @@
2477
2477
  }
2478
2478
  try {
2479
2479
  return await promise;
2480
- } catch (e2) {
2481
- if (e2 instanceof FirebaseError && isUserInvalidated(e2)) {
2480
+ } catch (e3) {
2481
+ if (e3 instanceof FirebaseError && isUserInvalidated(e3)) {
2482
2482
  if (user.auth.currentUser === user) {
2483
2483
  await user.auth.signOut();
2484
2484
  }
2485
2485
  }
2486
- throw e2;
2486
+ throw e3;
2487
2487
  }
2488
2488
  }
2489
2489
  function isUserInvalidated({ code }) {
@@ -2541,8 +2541,8 @@
2541
2541
  async iteration() {
2542
2542
  try {
2543
2543
  await this.user.getIdToken(true);
2544
- } catch (e2) {
2545
- if ((e2 === null || e2 === void 0 ? void 0 : e2.code) === `auth/${"network-request-failed"}`) {
2544
+ } catch (e3) {
2545
+ if ((e3 === null || e3 === void 0 ? void 0 : e3.code) === `auth/${"network-request-failed"}`) {
2546
2546
  this.schedule(
2547
2547
  /* wasError */
2548
2548
  true
@@ -3175,7 +3175,7 @@
3175
3175
  function _isIframe() {
3176
3176
  try {
3177
3177
  return !!(window && window !== window.top);
3178
- } catch (e2) {
3178
+ } catch (e3) {
3179
3179
  return false;
3180
3180
  }
3181
3181
  }
@@ -3204,8 +3204,8 @@
3204
3204
  try {
3205
3205
  const result = callback(user);
3206
3206
  resolve(result);
3207
- } catch (e2) {
3208
- reject(e2);
3207
+ } catch (e3) {
3208
+ reject(e3);
3209
3209
  }
3210
3210
  });
3211
3211
  wrappedCallback.onAbort = onAbort;
@@ -3227,16 +3227,16 @@
3227
3227
  onAbortStack.push(beforeStateCallback.onAbort);
3228
3228
  }
3229
3229
  }
3230
- } catch (e2) {
3230
+ } catch (e3) {
3231
3231
  onAbortStack.reverse();
3232
3232
  for (const onAbort of onAbortStack) {
3233
3233
  try {
3234
3234
  onAbort();
3235
- } catch (_3) {
3235
+ } catch (_) {
3236
3236
  }
3237
3237
  }
3238
3238
  throw this.auth._errorFactory.create("login-blocked", {
3239
- originalMessage: e2 === null || e2 === void 0 ? void 0 : e2.message
3239
+ originalMessage: e3 === null || e3 === void 0 ? void 0 : e3.message
3240
3240
  });
3241
3241
  }
3242
3242
  }
@@ -3325,8 +3325,8 @@
3325
3325
  false
3326
3326
  );
3327
3327
  let passwordChar;
3328
- for (let i2 = 0; i2 < password.length; i2++) {
3329
- passwordChar = password.charAt(i2);
3328
+ for (let i4 = 0; i4 < password.length; i4++) {
3329
+ passwordChar = password.charAt(i4);
3330
3330
  this.updatePasswordCharacterOptionsStatuses(
3331
3331
  status,
3332
3332
  /* containsLowercaseCharacter= */
@@ -3415,7 +3415,7 @@
3415
3415
  if ((_a = this._popupRedirectResolver) === null || _a === void 0 ? void 0 : _a._shouldInitProactively) {
3416
3416
  try {
3417
3417
  await this._popupRedirectResolver._initialize(this);
3418
- } catch (e2) {
3418
+ } catch (e3) {
3419
3419
  }
3420
3420
  }
3421
3421
  await this.initializeCurrentUser(popupRedirectResolver);
@@ -3471,9 +3471,9 @@
3471
3471
  if (needsTocheckMiddleware) {
3472
3472
  try {
3473
3473
  await this.beforeStateQueue.runMiddleware(futureCurrentUser);
3474
- } catch (e2) {
3474
+ } catch (e3) {
3475
3475
  futureCurrentUser = previouslyStoredUser;
3476
- this._popupRedirectResolver._overrideRedirectResult(this, () => Promise.reject(e2));
3476
+ this._popupRedirectResolver._overrideRedirectResult(this, () => Promise.reject(e3));
3477
3477
  }
3478
3478
  }
3479
3479
  if (futureCurrentUser) {
@@ -3498,7 +3498,7 @@
3498
3498
  let result = null;
3499
3499
  try {
3500
3500
  result = await this._popupRedirectResolver._completeRedirectFn(this, redirectResolver, true);
3501
- } catch (e2) {
3501
+ } catch (e3) {
3502
3502
  await this._setRedirectUser(null);
3503
3503
  }
3504
3504
  return result;
@@ -3506,8 +3506,8 @@
3506
3506
  async reloadAndSetCurrentUserOrClear(user) {
3507
3507
  try {
3508
3508
  await _reloadWithoutSaving(user);
3509
- } catch (e2) {
3510
- if ((e2 === null || e2 === void 0 ? void 0 : e2.code) !== `auth/${"network-request-failed"}`) {
3509
+ } catch (e3) {
3510
+ if ((e3 === null || e3 === void 0 ? void 0 : e3.code) !== `auth/${"network-request-failed"}`) {
3511
3511
  return this.directlySetCurrentUser(null);
3512
3512
  }
3513
3513
  }
@@ -3861,12 +3861,12 @@
3861
3861
  const el = document.createElement("script");
3862
3862
  el.setAttribute("src", url);
3863
3863
  el.onload = resolve;
3864
- el.onerror = (e2) => {
3864
+ el.onerror = (e3) => {
3865
3865
  const error = _createError(
3866
3866
  "internal-error"
3867
3867
  /* AuthErrorCode.INTERNAL_ERROR */
3868
3868
  );
3869
- error.customData = e2;
3869
+ error.customData = e3;
3870
3870
  reject(error);
3871
3871
  };
3872
3872
  el.type = "text/javascript";
@@ -5027,15 +5027,15 @@
5027
5027
  /* AuthErrorCode.USER_MISMATCH */
5028
5028
  );
5029
5029
  return UserCredentialImpl._forOperation(user, operationType, response);
5030
- } catch (e2) {
5031
- if ((e2 === null || e2 === void 0 ? void 0 : e2.code) === `auth/${"user-not-found"}`) {
5030
+ } catch (e3) {
5031
+ if ((e3 === null || e3 === void 0 ? void 0 : e3.code) === `auth/${"user-not-found"}`) {
5032
5032
  _fail(
5033
5033
  auth2,
5034
5034
  "user-mismatch"
5035
5035
  /* AuthErrorCode.USER_MISMATCH */
5036
5036
  );
5037
5037
  }
5038
- throw e2;
5038
+ throw e3;
5039
5039
  }
5040
5040
  }
5041
5041
  async function _signInWithCredential(auth2, credential, bypassAuthState = false) {
@@ -5374,7 +5374,7 @@
5374
5374
  Receiver.receivers = [];
5375
5375
  function _generateEventId(prefix = "", digits = 10) {
5376
5376
  let random = "";
5377
- for (let i2 = 0; i2 < digits; i2++) {
5377
+ for (let i4 = 0; i4 < digits; i4++) {
5378
5378
  random += Math.floor(Math.random() * 10);
5379
5379
  }
5380
5380
  return prefix + random;
@@ -5541,8 +5541,8 @@
5541
5541
  const db = request.result;
5542
5542
  try {
5543
5543
  db.createObjectStore(DB_OBJECTSTORE_NAME, { keyPath: DB_DATA_KEYPATH });
5544
- } catch (e2) {
5545
- reject(e2);
5544
+ } catch (e3) {
5545
+ reject(e3);
5546
5546
  }
5547
5547
  });
5548
5548
  request.addEventListener("success", async () => {
@@ -5604,9 +5604,9 @@
5604
5604
  try {
5605
5605
  const db = await this._openDb();
5606
5606
  return await op(db);
5607
- } catch (e2) {
5607
+ } catch (e3) {
5608
5608
  if (numAttempts++ > _TRANSACTION_RETRY_COUNT) {
5609
- throw e2;
5609
+ throw e3;
5610
5610
  }
5611
5611
  if (this.db) {
5612
5612
  this.db.close();
@@ -6107,8 +6107,8 @@
6107
6107
  this.eventManager = await this.resolver._initialize(this.auth);
6108
6108
  await this.onExecution();
6109
6109
  this.eventManager.registerConsumer(this);
6110
- } catch (e2) {
6111
- this.reject(e2);
6110
+ } catch (e3) {
6111
+ this.reject(e3);
6112
6112
  }
6113
6113
  });
6114
6114
  }
@@ -6129,8 +6129,8 @@
6129
6129
  };
6130
6130
  try {
6131
6131
  this.resolve(await this.getIdpTask(type)(params));
6132
- } catch (e2) {
6133
- this.reject(e2);
6132
+ } catch (e3) {
6133
+ this.reject(e3);
6134
6134
  }
6135
6135
  }
6136
6136
  onError(error) {
@@ -6213,8 +6213,8 @@
6213
6213
  eventId
6214
6214
  );
6215
6215
  this.authWindow.associatedEvent = eventId;
6216
- this.resolver._originValidation(this.auth).catch((e2) => {
6217
- this.reject(e2);
6216
+ this.resolver._originValidation(this.auth).catch((e3) => {
6217
+ this.reject(e3);
6218
6218
  });
6219
6219
  this.resolver._isIframeWebStorageSupported(this.auth, (isSupported) => {
6220
6220
  if (!isSupported) {
@@ -6297,8 +6297,8 @@
6297
6297
  const hasPendingRedirect = await _getAndClearPendingRedirectStatus(this.resolver, this.auth);
6298
6298
  const result = hasPendingRedirect ? await super.execute() : null;
6299
6299
  readyOutcome = () => Promise.resolve(result);
6300
- } catch (e2) {
6301
- readyOutcome = () => Promise.reject(e2);
6300
+ } catch (e3) {
6301
+ readyOutcome = () => Promise.reject(e3);
6302
6302
  }
6303
6303
  redirectOutcomeMap.set(this.auth._key(), readyOutcome);
6304
6304
  }
@@ -6427,8 +6427,8 @@
6427
6427
  this.lastProcessedEventTime = Date.now();
6428
6428
  }
6429
6429
  };
6430
- function eventUid(e2) {
6431
- return [e2.type, e2.eventId, e2.sessionId, e2.tenantId].filter((v2) => v2).join("-");
6430
+ function eventUid(e3) {
6431
+ return [e3.type, e3.eventId, e3.sessionId, e3.tenantId].filter((v3) => v3).join("-");
6432
6432
  }
6433
6433
  function isNullRedirectEvent({ type, error }) {
6434
6434
  return type === "unknown" && (error === null || error === void 0 ? void 0 : error.code) === `auth/${"no-auth-event"}`;
@@ -6498,8 +6498,8 @@
6498
6498
  beacon.H[hint].L = beacon.H[hint].L || [];
6499
6499
  beacon.H[hint].r = [...beacon.H[hint].L];
6500
6500
  if (beacon.CP) {
6501
- for (let i2 = 0; i2 < beacon.CP.length; i2++) {
6502
- beacon.CP[i2] = null;
6501
+ for (let i4 = 0; i4 < beacon.CP.length; i4++) {
6502
+ beacon.CP[i4] = null;
6503
6503
  }
6504
6504
  }
6505
6505
  }
@@ -6542,7 +6542,7 @@
6542
6542
  ));
6543
6543
  }
6544
6544
  };
6545
- return _loadJS(`https://apis.google.com/js/api.js?onload=${cbName}`).catch((e2) => reject(e2));
6545
+ return _loadJS(`https://apis.google.com/js/api.js?onload=${cbName}`).catch((e3) => reject(e3));
6546
6546
  }
6547
6547
  }).catch((error) => {
6548
6548
  cachedGApiLoader = null;
@@ -6653,7 +6653,7 @@
6653
6653
  if (this.window) {
6654
6654
  try {
6655
6655
  this.window.close();
6656
- } catch (e2) {
6656
+ } catch (e3) {
6657
6657
  }
6658
6658
  }
6659
6659
  }
@@ -6690,7 +6690,7 @@
6690
6690
  );
6691
6691
  try {
6692
6692
  newWin.focus();
6693
- } catch (e2) {
6693
+ } catch (e3) {
6694
6694
  }
6695
6695
  return new AuthPopup(newWin);
6696
6696
  }
@@ -7234,312 +7234,451 @@
7234
7234
  /* ClientPlatform.BROWSER */
7235
7235
  );
7236
7236
 
7237
- // ../../node_modules/.pnpm/preact@10.11.0/node_modules/preact/dist/preact.module.js
7237
+ // ../../node_modules/.pnpm/preact@10.19.3/node_modules/preact/dist/preact.module.js
7238
7238
  var n;
7239
7239
  var l;
7240
7240
  var u;
7241
- var i;
7242
7241
  var t;
7242
+ var i;
7243
7243
  var o;
7244
7244
  var r;
7245
- var f = {};
7246
- var e = [];
7247
- var c = /acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;
7248
- function s(n2, l2) {
7249
- for (var u2 in l2)
7250
- n2[u2] = l2[u2];
7245
+ var f;
7246
+ var e;
7247
+ var c = {};
7248
+ var s = [];
7249
+ var a = /acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;
7250
+ var h = Array.isArray;
7251
+ function v(n2, l3) {
7252
+ for (var u4 in l3)
7253
+ n2[u4] = l3[u4];
7251
7254
  return n2;
7252
7255
  }
7253
- function a(n2) {
7254
- var l2 = n2.parentNode;
7255
- l2 && l2.removeChild(n2);
7256
- }
7257
- function h(l2, u2, i2) {
7258
- var t2, o3, r2, f2 = {};
7259
- for (r2 in u2)
7260
- "key" == r2 ? t2 = u2[r2] : "ref" == r2 ? o3 = u2[r2] : f2[r2] = u2[r2];
7261
- if (arguments.length > 2 && (f2.children = arguments.length > 3 ? n.call(arguments, 2) : i2), "function" == typeof l2 && null != l2.defaultProps)
7262
- for (r2 in l2.defaultProps)
7263
- void 0 === f2[r2] && (f2[r2] = l2.defaultProps[r2]);
7264
- return v(l2, f2, t2, o3, null);
7265
- }
7266
- function v(n2, i2, t2, o3, r2) {
7267
- var f2 = { type: n2, props: i2, key: t2, ref: o3, __k: null, __: null, __b: 0, __e: null, __d: void 0, __c: null, __h: null, constructor: void 0, __v: null == r2 ? ++u : r2 };
7268
- return null == r2 && null != l.vnode && l.vnode(f2), f2;
7269
- }
7270
7256
  function p(n2) {
7257
+ var l3 = n2.parentNode;
7258
+ l3 && l3.removeChild(n2);
7259
+ }
7260
+ function y(l3, u4, t3) {
7261
+ var i4, o3, r3, f4 = {};
7262
+ for (r3 in u4)
7263
+ "key" == r3 ? i4 = u4[r3] : "ref" == r3 ? o3 = u4[r3] : f4[r3] = u4[r3];
7264
+ if (arguments.length > 2 && (f4.children = arguments.length > 3 ? n.call(arguments, 2) : t3), "function" == typeof l3 && null != l3.defaultProps)
7265
+ for (r3 in l3.defaultProps)
7266
+ void 0 === f4[r3] && (f4[r3] = l3.defaultProps[r3]);
7267
+ return d(l3, f4, i4, o3, null);
7268
+ }
7269
+ function d(n2, t3, i4, o3, r3) {
7270
+ var f4 = { type: n2, props: t3, key: i4, ref: o3, __k: null, __: null, __b: 0, __e: null, __d: void 0, __c: null, constructor: void 0, __v: null == r3 ? ++u : r3, __i: -1, __u: 0 };
7271
+ return null == r3 && null != l.vnode && l.vnode(f4), f4;
7272
+ }
7273
+ function g(n2) {
7271
7274
  return n2.children;
7272
7275
  }
7273
- function d(n2, l2) {
7274
- this.props = n2, this.context = l2;
7276
+ function b(n2, l3) {
7277
+ this.props = n2, this.context = l3;
7275
7278
  }
7276
- function _(n2, l2) {
7277
- if (null == l2)
7278
- return n2.__ ? _(n2.__, n2.__.__k.indexOf(n2) + 1) : null;
7279
- for (var u2; l2 < n2.__k.length; l2++)
7280
- if (null != (u2 = n2.__k[l2]) && null != u2.__e)
7281
- return u2.__e;
7282
- return "function" == typeof n2.type ? _(n2) : null;
7279
+ function m(n2, l3) {
7280
+ if (null == l3)
7281
+ return n2.__ ? m(n2.__, n2.__i + 1) : null;
7282
+ for (var u4; l3 < n2.__k.length; l3++)
7283
+ if (null != (u4 = n2.__k[l3]) && null != u4.__e)
7284
+ return u4.__e;
7285
+ return "function" == typeof n2.type ? m(n2) : null;
7283
7286
  }
7284
7287
  function k(n2) {
7285
- var l2, u2;
7288
+ var l3, u4;
7286
7289
  if (null != (n2 = n2.__) && null != n2.__c) {
7287
- for (n2.__e = n2.__c.base = null, l2 = 0; l2 < n2.__k.length; l2++)
7288
- if (null != (u2 = n2.__k[l2]) && null != u2.__e) {
7289
- n2.__e = n2.__c.base = u2.__e;
7290
+ for (n2.__e = n2.__c.base = null, l3 = 0; l3 < n2.__k.length; l3++)
7291
+ if (null != (u4 = n2.__k[l3]) && null != u4.__e) {
7292
+ n2.__e = n2.__c.base = u4.__e;
7290
7293
  break;
7291
7294
  }
7292
7295
  return k(n2);
7293
7296
  }
7294
7297
  }
7295
- function b(n2) {
7296
- (!n2.__d && (n2.__d = true) && t.push(n2) && !g.__r++ || o !== l.debounceRendering) && ((o = l.debounceRendering) || setTimeout)(g);
7297
- }
7298
- function g() {
7299
- for (var n2; g.__r = t.length; )
7300
- n2 = t.sort(function(n3, l2) {
7301
- return n3.__v.__b - l2.__v.__b;
7302
- }), t = [], n2.some(function(n3) {
7303
- var l2, u2, i2, t2, o3, r2;
7304
- n3.__d && (o3 = (t2 = (l2 = n3).__v).__e, (r2 = l2.__P) && (u2 = [], (i2 = s({}, t2)).__v = t2.__v + 1, j(r2, t2, i2, l2.__n, void 0 !== r2.ownerSVGElement, null != t2.__h ? [o3] : null, u2, null == o3 ? _(t2) : o3, t2.__h), z(u2, t2), t2.__e != o3 && k(t2)));
7305
- });
7306
- }
7307
- function w(n2, l2, u2, i2, t2, o3, r2, c2, s2, a2) {
7308
- var h2, y, d2, k2, b2, g2, w2, x = i2 && i2.__k || e, C2 = x.length;
7309
- for (u2.__k = [], h2 = 0; h2 < l2.length; h2++)
7310
- if (null != (k2 = u2.__k[h2] = null == (k2 = l2[h2]) || "boolean" == typeof k2 ? null : "string" == typeof k2 || "number" == typeof k2 || "bigint" == typeof k2 ? v(null, k2, null, null, k2) : Array.isArray(k2) ? v(p, { children: k2 }, null, null, null) : k2.__b > 0 ? v(k2.type, k2.props, k2.key, k2.ref ? k2.ref : null, k2.__v) : k2)) {
7311
- if (k2.__ = u2, k2.__b = u2.__b + 1, null === (d2 = x[h2]) || d2 && k2.key == d2.key && k2.type === d2.type)
7312
- x[h2] = void 0;
7313
- else
7314
- for (y = 0; y < C2; y++) {
7315
- if ((d2 = x[y]) && k2.key == d2.key && k2.type === d2.type) {
7316
- x[y] = void 0;
7317
- break;
7318
- }
7319
- d2 = null;
7320
- }
7321
- j(n2, k2, d2 = d2 || f, t2, o3, r2, c2, s2, a2), b2 = k2.__e, (y = k2.ref) && d2.ref != y && (w2 || (w2 = []), d2.ref && w2.push(d2.ref, null, k2), w2.push(y, k2.__c || b2, k2)), null != b2 ? (null == g2 && (g2 = b2), "function" == typeof k2.type && k2.__k === d2.__k ? k2.__d = s2 = m(k2, s2, n2) : s2 = A(n2, k2, d2, x, b2, s2), "function" == typeof u2.type && (u2.__d = s2)) : s2 && d2.__e == s2 && s2.parentNode != n2 && (s2 = _(d2));
7322
- }
7323
- for (u2.__e = g2, h2 = C2; h2--; )
7324
- null != x[h2] && ("function" == typeof u2.type && null != x[h2].__e && x[h2].__e == u2.__d && (u2.__d = _(i2, h2 + 1)), N(x[h2], x[h2]));
7325
- if (w2)
7326
- for (h2 = 0; h2 < w2.length; h2++)
7327
- M(w2[h2], w2[++h2], w2[++h2]);
7328
- }
7329
- function m(n2, l2, u2) {
7330
- for (var i2, t2 = n2.__k, o3 = 0; t2 && o3 < t2.length; o3++)
7331
- (i2 = t2[o3]) && (i2.__ = n2, l2 = "function" == typeof i2.type ? m(i2, l2, u2) : A(u2, i2, i2, t2, i2.__e, l2));
7332
- return l2;
7333
- }
7334
- function A(n2, l2, u2, i2, t2, o3) {
7335
- var r2, f2, e2;
7336
- if (void 0 !== l2.__d)
7337
- r2 = l2.__d, l2.__d = void 0;
7338
- else if (null == u2 || t2 != o3 || null == t2.parentNode)
7339
- n:
7340
- if (null == o3 || o3.parentNode !== n2)
7341
- n2.appendChild(t2), r2 = null;
7342
- else {
7343
- for (f2 = o3, e2 = 0; (f2 = f2.nextSibling) && e2 < i2.length; e2 += 2)
7344
- if (f2 == t2)
7345
- break n;
7346
- n2.insertBefore(t2, o3), r2 = o3;
7298
+ function w(n2) {
7299
+ (!n2.__d && (n2.__d = true) && i.push(n2) && !x.__r++ || o !== l.debounceRendering) && ((o = l.debounceRendering) || r)(x);
7300
+ }
7301
+ function x() {
7302
+ var n2, u4, t3, o3, r3, e3, c3, s3, a3;
7303
+ for (i.sort(f); n2 = i.shift(); )
7304
+ n2.__d && (u4 = i.length, o3 = void 0, e3 = (r3 = (t3 = n2).__v).__e, s3 = [], a3 = [], (c3 = t3.__P) && ((o3 = v({}, r3)).__v = r3.__v + 1, l.vnode && l.vnode(o3), L(c3, o3, r3, t3.__n, void 0 !== c3.ownerSVGElement, 32 & r3.__u ? [e3] : null, s3, null == e3 ? m(r3) : e3, !!(32 & r3.__u), a3), o3.__.__k[o3.__i] = o3, M(s3, o3, a3), o3.__e != e3 && k(o3)), i.length > u4 && i.sort(f));
7305
+ x.__r = 0;
7306
+ }
7307
+ function C(n2, l3, u4, t3, i4, o3, r3, f4, e3, a3, h3) {
7308
+ var v3, p2, y2, d3, _, g3 = t3 && t3.__k || s, b3 = l3.length;
7309
+ for (u4.__d = e3, P(u4, l3, g3), e3 = u4.__d, v3 = 0; v3 < b3; v3++)
7310
+ null != (y2 = u4.__k[v3]) && "boolean" != typeof y2 && "function" != typeof y2 && (p2 = -1 === y2.__i ? c : g3[y2.__i] || c, y2.__i = v3, L(n2, y2, p2, i4, o3, r3, f4, e3, a3, h3), d3 = y2.__e, y2.ref && p2.ref != y2.ref && (p2.ref && z(p2.ref, null, y2), h3.push(y2.ref, y2.__c || d3, y2)), null == _ && null != d3 && (_ = d3), 65536 & y2.__u || p2.__k === y2.__k ? e3 = S(y2, e3, n2) : "function" == typeof y2.type && void 0 !== y2.__d ? e3 = y2.__d : d3 && (e3 = d3.nextSibling), y2.__d = void 0, y2.__u &= -196609);
7311
+ u4.__d = e3, u4.__e = _;
7312
+ }
7313
+ function P(n2, l3, u4) {
7314
+ var t3, i4, o3, r3, f4, e3 = l3.length, c3 = u4.length, s3 = c3, a3 = 0;
7315
+ for (n2.__k = [], t3 = 0; t3 < e3; t3++)
7316
+ null != (i4 = n2.__k[t3] = null == (i4 = l3[t3]) || "boolean" == typeof i4 || "function" == typeof i4 ? null : "string" == typeof i4 || "number" == typeof i4 || "bigint" == typeof i4 || i4.constructor == String ? d(null, i4, null, null, i4) : h(i4) ? d(g, { children: i4 }, null, null, null) : void 0 === i4.constructor && i4.__b > 0 ? d(i4.type, i4.props, i4.key, i4.ref ? i4.ref : null, i4.__v) : i4) ? (i4.__ = n2, i4.__b = n2.__b + 1, f4 = H(i4, u4, r3 = t3 + a3, s3), i4.__i = f4, o3 = null, -1 !== f4 && (s3--, (o3 = u4[f4]) && (o3.__u |= 131072)), null == o3 || null === o3.__v ? (-1 == f4 && a3--, "function" != typeof i4.type && (i4.__u |= 65536)) : f4 !== r3 && (f4 === r3 + 1 ? a3++ : f4 > r3 ? s3 > e3 - r3 ? a3 += f4 - r3 : a3-- : a3 = f4 < r3 && f4 == r3 - 1 ? f4 - r3 : 0, f4 !== t3 + a3 && (i4.__u |= 65536))) : (o3 = u4[t3]) && null == o3.key && o3.__e && (o3.__e == n2.__d && (n2.__d = m(o3)), N(o3, o3, false), u4[t3] = null, s3--);
7317
+ if (s3)
7318
+ for (t3 = 0; t3 < c3; t3++)
7319
+ null != (o3 = u4[t3]) && 0 == (131072 & o3.__u) && (o3.__e == n2.__d && (n2.__d = m(o3)), N(o3, o3));
7320
+ }
7321
+ function S(n2, l3, u4) {
7322
+ var t3, i4;
7323
+ if ("function" == typeof n2.type) {
7324
+ for (t3 = n2.__k, i4 = 0; t3 && i4 < t3.length; i4++)
7325
+ t3[i4] && (t3[i4].__ = n2, l3 = S(t3[i4], l3, u4));
7326
+ return l3;
7327
+ }
7328
+ return n2.__e != l3 && (u4.insertBefore(n2.__e, l3 || null), l3 = n2.__e), l3 && l3.nextSibling;
7329
+ }
7330
+ function H(n2, l3, u4, t3) {
7331
+ var i4 = n2.key, o3 = n2.type, r3 = u4 - 1, f4 = u4 + 1, e3 = l3[u4];
7332
+ if (null === e3 || e3 && i4 == e3.key && o3 === e3.type)
7333
+ return u4;
7334
+ if (t3 > (null != e3 && 0 == (131072 & e3.__u) ? 1 : 0))
7335
+ for (; r3 >= 0 || f4 < l3.length; ) {
7336
+ if (r3 >= 0) {
7337
+ if ((e3 = l3[r3]) && 0 == (131072 & e3.__u) && i4 == e3.key && o3 === e3.type)
7338
+ return r3;
7339
+ r3--;
7347
7340
  }
7348
- return void 0 !== r2 ? r2 : t2.nextSibling;
7349
- }
7350
- function C(n2, l2, u2, i2, t2) {
7351
- var o3;
7352
- for (o3 in u2)
7353
- "children" === o3 || "key" === o3 || o3 in l2 || H(n2, o3, null, u2[o3], i2);
7354
- for (o3 in l2)
7355
- t2 && "function" != typeof l2[o3] || "children" === o3 || "key" === o3 || "value" === o3 || "checked" === o3 || u2[o3] === l2[o3] || H(n2, o3, l2[o3], u2[o3], i2);
7341
+ if (f4 < l3.length) {
7342
+ if ((e3 = l3[f4]) && 0 == (131072 & e3.__u) && i4 == e3.key && o3 === e3.type)
7343
+ return f4;
7344
+ f4++;
7345
+ }
7346
+ }
7347
+ return -1;
7356
7348
  }
7357
- function $(n2, l2, u2) {
7358
- "-" === l2[0] ? n2.setProperty(l2, u2) : n2[l2] = null == u2 ? "" : "number" != typeof u2 || c.test(l2) ? u2 : u2 + "px";
7349
+ function I(n2, l3, u4) {
7350
+ "-" === l3[0] ? n2.setProperty(l3, null == u4 ? "" : u4) : n2[l3] = null == u4 ? "" : "number" != typeof u4 || a.test(l3) ? u4 : u4 + "px";
7359
7351
  }
7360
- function H(n2, l2, u2, i2, t2) {
7352
+ function T(n2, l3, u4, t3, i4) {
7361
7353
  var o3;
7362
7354
  n:
7363
- if ("style" === l2)
7364
- if ("string" == typeof u2)
7365
- n2.style.cssText = u2;
7355
+ if ("style" === l3)
7356
+ if ("string" == typeof u4)
7357
+ n2.style.cssText = u4;
7366
7358
  else {
7367
- if ("string" == typeof i2 && (n2.style.cssText = i2 = ""), i2)
7368
- for (l2 in i2)
7369
- u2 && l2 in u2 || $(n2.style, l2, "");
7370
- if (u2)
7371
- for (l2 in u2)
7372
- i2 && u2[l2] === i2[l2] || $(n2.style, l2, u2[l2]);
7359
+ if ("string" == typeof t3 && (n2.style.cssText = t3 = ""), t3)
7360
+ for (l3 in t3)
7361
+ u4 && l3 in u4 || I(n2.style, l3, "");
7362
+ if (u4)
7363
+ for (l3 in u4)
7364
+ t3 && u4[l3] === t3[l3] || I(n2.style, l3, u4[l3]);
7373
7365
  }
7374
- else if ("o" === l2[0] && "n" === l2[1])
7375
- o3 = l2 !== (l2 = l2.replace(/Capture$/, "")), l2 = l2.toLowerCase() in n2 ? l2.toLowerCase().slice(2) : l2.slice(2), n2.l || (n2.l = {}), n2.l[l2 + o3] = u2, u2 ? i2 || n2.addEventListener(l2, o3 ? T : I, o3) : n2.removeEventListener(l2, o3 ? T : I, o3);
7376
- else if ("dangerouslySetInnerHTML" !== l2) {
7377
- if (t2)
7378
- l2 = l2.replace(/xlink(H|:h)/, "h").replace(/sName$/, "s");
7379
- else if ("href" !== l2 && "list" !== l2 && "form" !== l2 && "tabIndex" !== l2 && "download" !== l2 && l2 in n2)
7366
+ else if ("o" === l3[0] && "n" === l3[1])
7367
+ o3 = l3 !== (l3 = l3.replace(/(PointerCapture)$|Capture$/, "$1")), l3 = l3.toLowerCase() in n2 ? l3.toLowerCase().slice(2) : l3.slice(2), n2.l || (n2.l = {}), n2.l[l3 + o3] = u4, u4 ? t3 ? u4.u = t3.u : (u4.u = Date.now(), n2.addEventListener(l3, o3 ? D : A, o3)) : n2.removeEventListener(l3, o3 ? D : A, o3);
7368
+ else {
7369
+ if (i4)
7370
+ l3 = l3.replace(/xlink(H|:h)/, "h").replace(/sName$/, "s");
7371
+ else if ("width" !== l3 && "height" !== l3 && "href" !== l3 && "list" !== l3 && "form" !== l3 && "tabIndex" !== l3 && "download" !== l3 && "rowSpan" !== l3 && "colSpan" !== l3 && "role" !== l3 && l3 in n2)
7380
7372
  try {
7381
- n2[l2] = null == u2 ? "" : u2;
7373
+ n2[l3] = null == u4 ? "" : u4;
7382
7374
  break n;
7383
7375
  } catch (n3) {
7384
7376
  }
7385
- "function" == typeof u2 || (null != u2 && (false !== u2 || "a" === l2[0] && "r" === l2[1]) ? n2.setAttribute(l2, u2) : n2.removeAttribute(l2));
7377
+ "function" == typeof u4 || (null == u4 || false === u4 && "-" !== l3[4] ? n2.removeAttribute(l3) : n2.setAttribute(l3, u4));
7386
7378
  }
7387
7379
  }
7388
- function I(n2) {
7389
- this.l[n2.type + false](l.event ? l.event(n2) : n2);
7380
+ function A(n2) {
7381
+ var u4 = this.l[n2.type + false];
7382
+ if (n2.t) {
7383
+ if (n2.t <= u4.u)
7384
+ return;
7385
+ } else
7386
+ n2.t = Date.now();
7387
+ return u4(l.event ? l.event(n2) : n2);
7390
7388
  }
7391
- function T(n2) {
7392
- this.l[n2.type + true](l.event ? l.event(n2) : n2);
7389
+ function D(n2) {
7390
+ return this.l[n2.type + true](l.event ? l.event(n2) : n2);
7393
7391
  }
7394
- function j(n2, u2, i2, t2, o3, r2, f2, e2, c2) {
7395
- var a2, h2, v2, y, _3, k2, b2, g2, m2, x, A2, C2, $2, H2 = u2.type;
7396
- if (void 0 !== u2.constructor)
7392
+ function L(n2, u4, t3, i4, o3, r3, f4, e3, c3, s3) {
7393
+ var a3, p2, y2, d3, _, m3, k3, w3, x2, P2, S2, $, H2, I2, T2, A2 = u4.type;
7394
+ if (void 0 !== u4.constructor)
7397
7395
  return null;
7398
- null != i2.__h && (c2 = i2.__h, e2 = u2.__e = i2.__e, u2.__h = null, r2 = [e2]), (a2 = l.__b) && a2(u2);
7399
- try {
7400
- n:
7401
- if ("function" == typeof H2) {
7402
- if (g2 = u2.props, m2 = (a2 = H2.contextType) && t2[a2.__c], x = a2 ? m2 ? m2.props.value : a2.__ : t2, i2.__c ? b2 = (h2 = u2.__c = i2.__c).__ = h2.__E : ("prototype" in H2 && H2.prototype.render ? u2.__c = h2 = new H2(g2, x) : (u2.__c = h2 = new d(g2, x), h2.constructor = H2, h2.render = O), m2 && m2.sub(h2), h2.props = g2, h2.state || (h2.state = {}), h2.context = x, h2.__n = t2, v2 = h2.__d = true, h2.__h = []), null == h2.__s && (h2.__s = h2.state), null != H2.getDerivedStateFromProps && (h2.__s == h2.state && (h2.__s = s({}, h2.__s)), s(h2.__s, H2.getDerivedStateFromProps(g2, h2.__s))), y = h2.props, _3 = h2.state, v2)
7403
- null == H2.getDerivedStateFromProps && null != h2.componentWillMount && h2.componentWillMount(), null != h2.componentDidMount && h2.__h.push(h2.componentDidMount);
7396
+ 128 & t3.__u && (c3 = !!(32 & t3.__u), r3 = [e3 = u4.__e = t3.__e]), (a3 = l.__b) && a3(u4);
7397
+ n:
7398
+ if ("function" == typeof A2)
7399
+ try {
7400
+ if (w3 = u4.props, x2 = (a3 = A2.contextType) && i4[a3.__c], P2 = a3 ? x2 ? x2.props.value : a3.__ : i4, t3.__c ? k3 = (p2 = u4.__c = t3.__c).__ = p2.__E : ("prototype" in A2 && A2.prototype.render ? u4.__c = p2 = new A2(w3, P2) : (u4.__c = p2 = new b(w3, P2), p2.constructor = A2, p2.render = O), x2 && x2.sub(p2), p2.props = w3, p2.state || (p2.state = {}), p2.context = P2, p2.__n = i4, y2 = p2.__d = true, p2.__h = [], p2._sb = []), null == p2.__s && (p2.__s = p2.state), null != A2.getDerivedStateFromProps && (p2.__s == p2.state && (p2.__s = v({}, p2.__s)), v(p2.__s, A2.getDerivedStateFromProps(w3, p2.__s))), d3 = p2.props, _ = p2.state, p2.__v = u4, y2)
7401
+ null == A2.getDerivedStateFromProps && null != p2.componentWillMount && p2.componentWillMount(), null != p2.componentDidMount && p2.__h.push(p2.componentDidMount);
7404
7402
  else {
7405
- if (null == H2.getDerivedStateFromProps && g2 !== y && null != h2.componentWillReceiveProps && h2.componentWillReceiveProps(g2, x), !h2.__e && null != h2.shouldComponentUpdate && false === h2.shouldComponentUpdate(g2, h2.__s, x) || u2.__v === i2.__v) {
7406
- h2.props = g2, h2.state = h2.__s, u2.__v !== i2.__v && (h2.__d = false), h2.__v = u2, u2.__e = i2.__e, u2.__k = i2.__k, u2.__k.forEach(function(n3) {
7407
- n3 && (n3.__ = u2);
7408
- }), h2.__h.length && f2.push(h2);
7403
+ if (null == A2.getDerivedStateFromProps && w3 !== d3 && null != p2.componentWillReceiveProps && p2.componentWillReceiveProps(w3, P2), !p2.__e && (null != p2.shouldComponentUpdate && false === p2.shouldComponentUpdate(w3, p2.__s, P2) || u4.__v === t3.__v)) {
7404
+ for (u4.__v !== t3.__v && (p2.props = w3, p2.state = p2.__s, p2.__d = false), u4.__e = t3.__e, u4.__k = t3.__k, u4.__k.forEach(function(n3) {
7405
+ n3 && (n3.__ = u4);
7406
+ }), S2 = 0; S2 < p2._sb.length; S2++)
7407
+ p2.__h.push(p2._sb[S2]);
7408
+ p2._sb = [], p2.__h.length && f4.push(p2);
7409
7409
  break n;
7410
7410
  }
7411
- null != h2.componentWillUpdate && h2.componentWillUpdate(g2, h2.__s, x), null != h2.componentDidUpdate && h2.__h.push(function() {
7412
- h2.componentDidUpdate(y, _3, k2);
7411
+ null != p2.componentWillUpdate && p2.componentWillUpdate(w3, p2.__s, P2), null != p2.componentDidUpdate && p2.__h.push(function() {
7412
+ p2.componentDidUpdate(d3, _, m3);
7413
7413
  });
7414
7414
  }
7415
- if (h2.context = x, h2.props = g2, h2.__v = u2, h2.__P = n2, A2 = l.__r, C2 = 0, "prototype" in H2 && H2.prototype.render)
7416
- h2.state = h2.__s, h2.__d = false, A2 && A2(u2), a2 = h2.render(h2.props, h2.state, h2.context);
7417
- else
7415
+ if (p2.context = P2, p2.props = w3, p2.__P = n2, p2.__e = false, $ = l.__r, H2 = 0, "prototype" in A2 && A2.prototype.render) {
7416
+ for (p2.state = p2.__s, p2.__d = false, $ && $(u4), a3 = p2.render(p2.props, p2.state, p2.context), I2 = 0; I2 < p2._sb.length; I2++)
7417
+ p2.__h.push(p2._sb[I2]);
7418
+ p2._sb = [];
7419
+ } else
7418
7420
  do {
7419
- h2.__d = false, A2 && A2(u2), a2 = h2.render(h2.props, h2.state, h2.context), h2.state = h2.__s;
7420
- } while (h2.__d && ++C2 < 25);
7421
- h2.state = h2.__s, null != h2.getChildContext && (t2 = s(s({}, t2), h2.getChildContext())), v2 || null == h2.getSnapshotBeforeUpdate || (k2 = h2.getSnapshotBeforeUpdate(y, _3)), $2 = null != a2 && a2.type === p && null == a2.key ? a2.props.children : a2, w(n2, Array.isArray($2) ? $2 : [$2], u2, i2, t2, o3, r2, f2, e2, c2), h2.base = u2.__e, u2.__h = null, h2.__h.length && f2.push(h2), b2 && (h2.__E = h2.__ = null), h2.__e = false;
7422
- } else
7423
- null == r2 && u2.__v === i2.__v ? (u2.__k = i2.__k, u2.__e = i2.__e) : u2.__e = L(i2.__e, u2, i2, t2, o3, r2, f2, c2);
7424
- (a2 = l.diffed) && a2(u2);
7425
- } catch (n3) {
7426
- u2.__v = null, (c2 || null != r2) && (u2.__e = e2, u2.__h = !!c2, r2[r2.indexOf(e2)] = null), l.__e(n3, u2, i2);
7427
- }
7428
- }
7429
- function z(n2, u2) {
7430
- l.__c && l.__c(u2, n2), n2.some(function(u3) {
7421
+ p2.__d = false, $ && $(u4), a3 = p2.render(p2.props, p2.state, p2.context), p2.state = p2.__s;
7422
+ } while (p2.__d && ++H2 < 25);
7423
+ p2.state = p2.__s, null != p2.getChildContext && (i4 = v(v({}, i4), p2.getChildContext())), y2 || null == p2.getSnapshotBeforeUpdate || (m3 = p2.getSnapshotBeforeUpdate(d3, _)), C(n2, h(T2 = null != a3 && a3.type === g && null == a3.key ? a3.props.children : a3) ? T2 : [T2], u4, t3, i4, o3, r3, f4, e3, c3, s3), p2.base = u4.__e, u4.__u &= -161, p2.__h.length && f4.push(p2), k3 && (p2.__E = p2.__ = null);
7424
+ } catch (n3) {
7425
+ u4.__v = null, c3 || null != r3 ? (u4.__e = e3, u4.__u |= c3 ? 160 : 32, r3[r3.indexOf(e3)] = null) : (u4.__e = t3.__e, u4.__k = t3.__k), l.__e(n3, u4, t3);
7426
+ }
7427
+ else
7428
+ null == r3 && u4.__v === t3.__v ? (u4.__k = t3.__k, u4.__e = t3.__e) : u4.__e = j(t3.__e, u4, t3, i4, o3, r3, f4, c3, s3);
7429
+ (a3 = l.diffed) && a3(u4);
7430
+ }
7431
+ function M(n2, u4, t3) {
7432
+ u4.__d = void 0;
7433
+ for (var i4 = 0; i4 < t3.length; i4++)
7434
+ z(t3[i4], t3[++i4], t3[++i4]);
7435
+ l.__c && l.__c(u4, n2), n2.some(function(u5) {
7431
7436
  try {
7432
- n2 = u3.__h, u3.__h = [], n2.some(function(n3) {
7433
- n3.call(u3);
7437
+ n2 = u5.__h, u5.__h = [], n2.some(function(n3) {
7438
+ n3.call(u5);
7434
7439
  });
7435
7440
  } catch (n3) {
7436
- l.__e(n3, u3.__v);
7441
+ l.__e(n3, u5.__v);
7437
7442
  }
7438
7443
  });
7439
7444
  }
7440
- function L(l2, u2, i2, t2, o3, r2, e2, c2) {
7441
- var s2, h2, v2, y = i2.props, p2 = u2.props, d2 = u2.type, k2 = 0;
7442
- if ("svg" === d2 && (o3 = true), null != r2) {
7443
- for (; k2 < r2.length; k2++)
7444
- if ((s2 = r2[k2]) && "setAttribute" in s2 == !!d2 && (d2 ? s2.localName === d2 : 3 === s2.nodeType)) {
7445
- l2 = s2, r2[k2] = null;
7445
+ function j(l3, u4, t3, i4, o3, r3, f4, e3, s3) {
7446
+ var a3, v3, y2, d3, _, g3, b3, k3 = t3.props, w3 = u4.props, x2 = u4.type;
7447
+ if ("svg" === x2 && (o3 = true), null != r3) {
7448
+ for (a3 = 0; a3 < r3.length; a3++)
7449
+ if ((_ = r3[a3]) && "setAttribute" in _ == !!x2 && (x2 ? _.localName === x2 : 3 === _.nodeType)) {
7450
+ l3 = _, r3[a3] = null;
7446
7451
  break;
7447
7452
  }
7448
7453
  }
7449
- if (null == l2) {
7450
- if (null === d2)
7451
- return document.createTextNode(p2);
7452
- l2 = o3 ? document.createElementNS("http://www.w3.org/2000/svg", d2) : document.createElement(d2, p2.is && p2), r2 = null, c2 = false;
7454
+ if (null == l3) {
7455
+ if (null === x2)
7456
+ return document.createTextNode(w3);
7457
+ l3 = o3 ? document.createElementNS("http://www.w3.org/2000/svg", x2) : document.createElement(x2, w3.is && w3), r3 = null, e3 = false;
7453
7458
  }
7454
- if (null === d2)
7455
- y === p2 || c2 && l2.data === p2 || (l2.data = p2);
7459
+ if (null === x2)
7460
+ k3 === w3 || e3 && l3.data === w3 || (l3.data = w3);
7456
7461
  else {
7457
- if (r2 = r2 && n.call(l2.childNodes), h2 = (y = i2.props || f).dangerouslySetInnerHTML, v2 = p2.dangerouslySetInnerHTML, !c2) {
7458
- if (null != r2)
7459
- for (y = {}, k2 = 0; k2 < l2.attributes.length; k2++)
7460
- y[l2.attributes[k2].name] = l2.attributes[k2].value;
7461
- (v2 || h2) && (v2 && (h2 && v2.__html == h2.__html || v2.__html === l2.innerHTML) || (l2.innerHTML = v2 && v2.__html || ""));
7462
- }
7463
- if (C(l2, p2, y, o3, c2), v2)
7464
- u2.__k = [];
7465
- else if (k2 = u2.props.children, w(l2, Array.isArray(k2) ? k2 : [k2], u2, i2, t2, o3 && "foreignObject" !== d2, r2, e2, r2 ? r2[0] : i2.__k && _(i2, 0), c2), null != r2)
7466
- for (k2 = r2.length; k2--; )
7467
- null != r2[k2] && a(r2[k2]);
7468
- c2 || ("value" in p2 && void 0 !== (k2 = p2.value) && (k2 !== l2.value || "progress" === d2 && !k2 || "option" === d2 && k2 !== y.value) && H(l2, "value", k2, y.value, false), "checked" in p2 && void 0 !== (k2 = p2.checked) && k2 !== l2.checked && H(l2, "checked", k2, y.checked, false));
7469
- }
7470
- return l2;
7471
- }
7472
- function M(n2, u2, i2) {
7462
+ if (r3 = r3 && n.call(l3.childNodes), k3 = t3.props || c, !e3 && null != r3)
7463
+ for (k3 = {}, a3 = 0; a3 < l3.attributes.length; a3++)
7464
+ k3[(_ = l3.attributes[a3]).name] = _.value;
7465
+ for (a3 in k3)
7466
+ _ = k3[a3], "children" == a3 || ("dangerouslySetInnerHTML" == a3 ? y2 = _ : "key" === a3 || a3 in w3 || T(l3, a3, null, _, o3));
7467
+ for (a3 in w3)
7468
+ _ = w3[a3], "children" == a3 ? d3 = _ : "dangerouslySetInnerHTML" == a3 ? v3 = _ : "value" == a3 ? g3 = _ : "checked" == a3 ? b3 = _ : "key" === a3 || e3 && "function" != typeof _ || k3[a3] === _ || T(l3, a3, _, k3[a3], o3);
7469
+ if (v3)
7470
+ e3 || y2 && (v3.__html === y2.__html || v3.__html === l3.innerHTML) || (l3.innerHTML = v3.__html), u4.__k = [];
7471
+ else if (y2 && (l3.innerHTML = ""), C(l3, h(d3) ? d3 : [d3], u4, t3, i4, o3 && "foreignObject" !== x2, r3, f4, r3 ? r3[0] : t3.__k && m(t3, 0), e3, s3), null != r3)
7472
+ for (a3 = r3.length; a3--; )
7473
+ null != r3[a3] && p(r3[a3]);
7474
+ e3 || (a3 = "value", void 0 !== g3 && (g3 !== l3[a3] || "progress" === x2 && !g3 || "option" === x2 && g3 !== k3[a3]) && T(l3, a3, g3, k3[a3], false), a3 = "checked", void 0 !== b3 && b3 !== l3[a3] && T(l3, a3, b3, k3[a3], false));
7475
+ }
7476
+ return l3;
7477
+ }
7478
+ function z(n2, u4, t3) {
7473
7479
  try {
7474
- "function" == typeof n2 ? n2(u2) : n2.current = u2;
7480
+ "function" == typeof n2 ? n2(u4) : n2.current = u4;
7475
7481
  } catch (n3) {
7476
- l.__e(n3, i2);
7482
+ l.__e(n3, t3);
7477
7483
  }
7478
7484
  }
7479
- function N(n2, u2, i2) {
7480
- var t2, o3;
7481
- if (l.unmount && l.unmount(n2), (t2 = n2.ref) && (t2.current && t2.current !== n2.__e || M(t2, null, u2)), null != (t2 = n2.__c)) {
7482
- if (t2.componentWillUnmount)
7485
+ function N(n2, u4, t3) {
7486
+ var i4, o3;
7487
+ if (l.unmount && l.unmount(n2), (i4 = n2.ref) && (i4.current && i4.current !== n2.__e || z(i4, null, u4)), null != (i4 = n2.__c)) {
7488
+ if (i4.componentWillUnmount)
7483
7489
  try {
7484
- t2.componentWillUnmount();
7490
+ i4.componentWillUnmount();
7485
7491
  } catch (n3) {
7486
- l.__e(n3, u2);
7492
+ l.__e(n3, u4);
7487
7493
  }
7488
- t2.base = t2.__P = null, n2.__c = void 0;
7494
+ i4.base = i4.__P = null, n2.__c = void 0;
7489
7495
  }
7490
- if (t2 = n2.__k)
7491
- for (o3 = 0; o3 < t2.length; o3++)
7492
- t2[o3] && N(t2[o3], u2, "function" != typeof n2.type);
7493
- i2 || null == n2.__e || a(n2.__e), n2.__ = n2.__e = n2.__d = void 0;
7496
+ if (i4 = n2.__k)
7497
+ for (o3 = 0; o3 < i4.length; o3++)
7498
+ i4[o3] && N(i4[o3], u4, t3 || "function" != typeof n2.type);
7499
+ t3 || null == n2.__e || p(n2.__e), n2.__ = n2.__e = n2.__d = void 0;
7494
7500
  }
7495
- function O(n2, l2, u2) {
7496
- return this.constructor(n2, u2);
7501
+ function O(n2, l3, u4) {
7502
+ return this.constructor(n2, u4);
7497
7503
  }
7498
- function P(u2, i2, t2) {
7499
- var o3, r2, e2;
7500
- l.__ && l.__(u2, i2), r2 = (o3 = "function" == typeof t2) ? null : t2 && t2.__k || i2.__k, e2 = [], j(i2, u2 = (!o3 && t2 || i2).__k = h(p, null, [u2]), r2 || f, f, void 0 !== i2.ownerSVGElement, !o3 && t2 ? [t2] : r2 ? null : i2.firstChild ? n.call(i2.childNodes) : null, e2, !o3 && t2 ? t2 : r2 ? r2.__e : i2.firstChild, o3), z(e2, u2);
7504
+ function q(u4, t3, i4) {
7505
+ var o3, r3, f4, e3;
7506
+ l.__ && l.__(u4, t3), r3 = (o3 = "function" == typeof i4) ? null : i4 && i4.__k || t3.__k, f4 = [], e3 = [], L(t3, u4 = (!o3 && i4 || t3).__k = y(g, null, [u4]), r3 || c, c, void 0 !== t3.ownerSVGElement, !o3 && i4 ? [i4] : r3 ? null : t3.firstChild ? n.call(t3.childNodes) : null, f4, !o3 && i4 ? i4 : r3 ? r3.__e : t3.firstChild, o3, e3), M(f4, u4, e3);
7501
7507
  }
7502
- n = e.slice, l = { __e: function(n2, l2, u2, i2) {
7503
- for (var t2, o3, r2; l2 = l2.__; )
7504
- if ((t2 = l2.__c) && !t2.__)
7508
+ n = s.slice, l = { __e: function(n2, l3, u4, t3) {
7509
+ for (var i4, o3, r3; l3 = l3.__; )
7510
+ if ((i4 = l3.__c) && !i4.__)
7505
7511
  try {
7506
- if ((o3 = t2.constructor) && null != o3.getDerivedStateFromError && (t2.setState(o3.getDerivedStateFromError(n2)), r2 = t2.__d), null != t2.componentDidCatch && (t2.componentDidCatch(n2, i2 || {}), r2 = t2.__d), r2)
7507
- return t2.__E = t2;
7508
- } catch (l3) {
7509
- n2 = l3;
7512
+ if ((o3 = i4.constructor) && null != o3.getDerivedStateFromError && (i4.setState(o3.getDerivedStateFromError(n2)), r3 = i4.__d), null != i4.componentDidCatch && (i4.componentDidCatch(n2, t3 || {}), r3 = i4.__d), r3)
7513
+ return i4.__E = i4;
7514
+ } catch (l4) {
7515
+ n2 = l4;
7510
7516
  }
7511
7517
  throw n2;
7512
- } }, u = 0, i = function(n2) {
7513
- return null != n2 && void 0 === n2.constructor;
7514
- }, d.prototype.setState = function(n2, l2) {
7515
- var u2;
7516
- u2 = null != this.__s && this.__s !== this.state ? this.__s : this.__s = s({}, this.state), "function" == typeof n2 && (n2 = n2(s({}, u2), this.props)), n2 && s(u2, n2), null != n2 && this.__v && (l2 && this.__h.push(l2), b(this));
7517
- }, d.prototype.forceUpdate = function(n2) {
7518
- this.__v && (this.__e = true, n2 && this.__h.push(n2), b(this));
7519
- }, d.prototype.render = p, t = [], g.__r = 0, r = 0;
7518
+ } }, u = 0, t = function(n2) {
7519
+ return null != n2 && null == n2.constructor;
7520
+ }, b.prototype.setState = function(n2, l3) {
7521
+ var u4;
7522
+ u4 = null != this.__s && this.__s !== this.state ? this.__s : this.__s = v({}, this.state), "function" == typeof n2 && (n2 = n2(v({}, u4), this.props)), n2 && v(u4, n2), null != n2 && this.__v && (l3 && this._sb.push(l3), w(this));
7523
+ }, b.prototype.forceUpdate = function(n2) {
7524
+ this.__v && (this.__e = true, n2 && this.__h.push(n2), w(this));
7525
+ }, b.prototype.render = g, i = [], r = "function" == typeof Promise ? Promise.prototype.then.bind(Promise.resolve()) : setTimeout, f = function(n2, l3) {
7526
+ return n2.__v.__b - l3.__v.__b;
7527
+ }, x.__r = 0, e = 0;
7528
+
7529
+ // ../../node_modules/.pnpm/preact@10.19.3/node_modules/preact/hooks/dist/hooks.module.js
7530
+ var t2;
7531
+ var r2;
7532
+ var u2;
7533
+ var i2;
7534
+ var o2 = 0;
7535
+ var f2 = [];
7536
+ var c2 = [];
7537
+ var e2 = l.__b;
7538
+ var a2 = l.__r;
7539
+ var v2 = l.diffed;
7540
+ var l2 = l.__c;
7541
+ var m2 = l.unmount;
7542
+ function d2(t3, u4) {
7543
+ l.__h && l.__h(r2, t3, o2 || u4), o2 = 0;
7544
+ var i4 = r2.__H || (r2.__H = { __: [], __h: [] });
7545
+ return t3 >= i4.__.length && i4.__.push({ __V: c2 }), i4.__[t3];
7546
+ }
7547
+ function h2(n2) {
7548
+ return o2 = 1, s2(B, n2);
7549
+ }
7550
+ function s2(n2, u4, i4) {
7551
+ var o3 = d2(t2++, 2);
7552
+ if (o3.t = n2, !o3.__c && (o3.__ = [i4 ? i4(u4) : B(void 0, u4), function(n3) {
7553
+ var t3 = o3.__N ? o3.__N[0] : o3.__[0], r3 = o3.t(t3, n3);
7554
+ t3 !== r3 && (o3.__N = [r3, o3.__[1]], o3.__c.setState({}));
7555
+ }], o3.__c = r2, !r2.u)) {
7556
+ var f4 = function(n3, t3, r3) {
7557
+ if (!o3.__c.__H)
7558
+ return true;
7559
+ var u5 = o3.__c.__H.__.filter(function(n4) {
7560
+ return n4.__c;
7561
+ });
7562
+ if (u5.every(function(n4) {
7563
+ return !n4.__N;
7564
+ }))
7565
+ return !c3 || c3.call(this, n3, t3, r3);
7566
+ var i5 = false;
7567
+ return u5.forEach(function(n4) {
7568
+ if (n4.__N) {
7569
+ var t4 = n4.__[0];
7570
+ n4.__ = n4.__N, n4.__N = void 0, t4 !== n4.__[0] && (i5 = true);
7571
+ }
7572
+ }), !(!i5 && o3.__c.props === n3) && (!c3 || c3.call(this, n3, t3, r3));
7573
+ };
7574
+ r2.u = true;
7575
+ var c3 = r2.shouldComponentUpdate, e3 = r2.componentWillUpdate;
7576
+ r2.componentWillUpdate = function(n3, t3, r3) {
7577
+ if (this.__e) {
7578
+ var u5 = c3;
7579
+ c3 = void 0, f4(n3, t3, r3), c3 = u5;
7580
+ }
7581
+ e3 && e3.call(this, n3, t3, r3);
7582
+ }, r2.shouldComponentUpdate = f4;
7583
+ }
7584
+ return o3.__N || o3.__;
7585
+ }
7586
+ function b2() {
7587
+ for (var t3; t3 = f2.shift(); )
7588
+ if (t3.__P && t3.__H)
7589
+ try {
7590
+ t3.__H.__h.forEach(k2), t3.__H.__h.forEach(w2), t3.__H.__h = [];
7591
+ } catch (r3) {
7592
+ t3.__H.__h = [], l.__e(r3, t3.__v);
7593
+ }
7594
+ }
7595
+ l.__b = function(n2) {
7596
+ r2 = null, e2 && e2(n2);
7597
+ }, l.__r = function(n2) {
7598
+ a2 && a2(n2), t2 = 0;
7599
+ var i4 = (r2 = n2.__c).__H;
7600
+ i4 && (u2 === r2 ? (i4.__h = [], r2.__h = [], i4.__.forEach(function(n3) {
7601
+ n3.__N && (n3.__ = n3.__N), n3.__V = c2, n3.__N = n3.i = void 0;
7602
+ })) : (i4.__h.forEach(k2), i4.__h.forEach(w2), i4.__h = [], t2 = 0)), u2 = r2;
7603
+ }, l.diffed = function(t3) {
7604
+ v2 && v2(t3);
7605
+ var o3 = t3.__c;
7606
+ o3 && o3.__H && (o3.__H.__h.length && (1 !== f2.push(o3) && i2 === l.requestAnimationFrame || ((i2 = l.requestAnimationFrame) || j2)(b2)), o3.__H.__.forEach(function(n2) {
7607
+ n2.i && (n2.__H = n2.i), n2.__V !== c2 && (n2.__ = n2.__V), n2.i = void 0, n2.__V = c2;
7608
+ })), u2 = r2 = null;
7609
+ }, l.__c = function(t3, r3) {
7610
+ r3.some(function(t4) {
7611
+ try {
7612
+ t4.__h.forEach(k2), t4.__h = t4.__h.filter(function(n2) {
7613
+ return !n2.__ || w2(n2);
7614
+ });
7615
+ } catch (u4) {
7616
+ r3.some(function(n2) {
7617
+ n2.__h && (n2.__h = []);
7618
+ }), r3 = [], l.__e(u4, t4.__v);
7619
+ }
7620
+ }), l2 && l2(t3, r3);
7621
+ }, l.unmount = function(t3) {
7622
+ m2 && m2(t3);
7623
+ var r3, u4 = t3.__c;
7624
+ u4 && u4.__H && (u4.__H.__.forEach(function(n2) {
7625
+ try {
7626
+ k2(n2);
7627
+ } catch (n3) {
7628
+ r3 = n3;
7629
+ }
7630
+ }), u4.__H = void 0, r3 && l.__e(r3, u4.__v));
7631
+ };
7632
+ var g2 = "function" == typeof requestAnimationFrame;
7633
+ function j2(n2) {
7634
+ var t3, r3 = function() {
7635
+ clearTimeout(u4), g2 && cancelAnimationFrame(t3), setTimeout(n2);
7636
+ }, u4 = setTimeout(r3, 100);
7637
+ g2 && (t3 = requestAnimationFrame(r3));
7638
+ }
7639
+ function k2(n2) {
7640
+ var t3 = r2, u4 = n2.__c;
7641
+ "function" == typeof u4 && (n2.__c = void 0, u4()), r2 = t3;
7642
+ }
7643
+ function w2(n2) {
7644
+ var t3 = r2;
7645
+ n2.__c = n2.__(), r2 = t3;
7646
+ }
7647
+ function B(n2, t3) {
7648
+ return "function" == typeof t3 ? t3(n2) : t3;
7649
+ }
7520
7650
 
7521
- // ../../node_modules/.pnpm/preact@10.11.0/node_modules/preact/jsx-runtime/dist/jsxRuntime.module.js
7522
- var _2 = 0;
7523
- function o2(o3, e2, n2, t2, f2) {
7524
- var l2, s2, u2 = {};
7525
- for (s2 in e2)
7526
- "ref" == s2 ? l2 = e2[s2] : u2[s2] = e2[s2];
7527
- var a2 = { type: o3, props: u2, key: n2, ref: l2, __k: null, __: null, __b: 0, __e: null, __d: void 0, __c: null, __h: null, constructor: void 0, __v: --_2, __source: f2, __self: t2 };
7528
- if ("function" == typeof o3 && (l2 = o3.defaultProps))
7529
- for (s2 in l2)
7530
- void 0 === u2[s2] && (u2[s2] = l2[s2]);
7531
- return l.vnode && l.vnode(a2), a2;
7651
+ // ../../node_modules/.pnpm/preact@10.19.3/node_modules/preact/jsx-runtime/dist/jsxRuntime.module.js
7652
+ var f3 = 0;
7653
+ var i3 = Array.isArray;
7654
+ function u3(e3, t3, n2, o3, i4, u4) {
7655
+ var a3, c3, p2 = {};
7656
+ for (c3 in t3)
7657
+ "ref" == c3 ? a3 = t3[c3] : p2[c3] = t3[c3];
7658
+ var l3 = { type: e3, props: p2, key: n2, ref: a3, __k: null, __: null, __b: 0, __e: null, __d: void 0, __c: null, constructor: void 0, __v: --f3, __i: -1, __u: 0, __source: i4, __self: u4 };
7659
+ if ("function" == typeof e3 && (a3 = e3.defaultProps))
7660
+ for (c3 in a3)
7661
+ void 0 === p2[c3] && (p2[c3] = a3[c3]);
7662
+ return l.vnode && l.vnode(l3), l3;
7532
7663
  }
7533
7664
 
7534
7665
  // signin/signin.tsx
7535
7666
  function SignIn() {
7667
+ const [errorMsg, setErrorMsg] = h2("");
7536
7668
  const title = window.__ROOT_CTX.name;
7537
- return /* @__PURE__ */ o2("div", { className: "signin", children: [
7538
- title && /* @__PURE__ */ o2("h1", { className: "signin__title", children: title }),
7539
- /* @__PURE__ */ o2(SignIn.Button, {})
7669
+ function onError(msg) {
7670
+ setErrorMsg(msg);
7671
+ }
7672
+ return /* @__PURE__ */ u3("div", { className: "signin", children: [
7673
+ /* @__PURE__ */ u3("div", { className: "signin__headline", children: [
7674
+ title && /* @__PURE__ */ u3("h1", { className: "signin__headline__title", children: title }),
7675
+ /* @__PURE__ */ u3("p", { className: "signin__headline__body", children: title ? `Sign in to continue to ${title}` : "Sign in to continue" })
7676
+ ] }),
7677
+ /* @__PURE__ */ u3(SignIn.Button, { onError }),
7678
+ errorMsg && /* @__PURE__ */ u3("p", { className: "signin__error", children: errorMsg })
7540
7679
  ] });
7541
7680
  }
7542
- SignIn.Button = () => {
7681
+ SignIn.Button = (props) => {
7543
7682
  async function signIn() {
7544
7683
  const provider = new GoogleAuthProvider();
7545
7684
  provider.addScope("profile");
@@ -7554,7 +7693,15 @@
7554
7693
  },
7555
7694
  body: JSON.stringify({ idToken })
7556
7695
  });
7696
+ if (res.status === 401) {
7697
+ const email = user?.email || "(no email)";
7698
+ props.onError(
7699
+ `${email} is not authorized to view this page. If you believe this is a mistake, please contact a developer to help resolve the issue.`
7700
+ );
7701
+ return;
7702
+ }
7557
7703
  if (res.status !== 200) {
7704
+ props.onError("An unknown error has occurred.");
7558
7705
  console.error("login failed");
7559
7706
  console.log(res);
7560
7707
  return;
@@ -7567,41 +7714,41 @@
7567
7714
  }
7568
7715
  loginSuccessRedirect();
7569
7716
  }
7570
- return /* @__PURE__ */ o2("button", { className: "signin__button", onClick: signIn, children: [
7571
- /* @__PURE__ */ o2("div", { className: "signin__button__icon", children: /* @__PURE__ */ o2(SignIn.GLogo, {}) }),
7572
- /* @__PURE__ */ o2("div", { className: "signin__button__label", children: "Sign in with Google" })
7717
+ return /* @__PURE__ */ u3("button", { className: "signin__button", onClick: signIn, children: [
7718
+ /* @__PURE__ */ u3("div", { className: "signin__button__icon", children: /* @__PURE__ */ u3(SignIn.GLogo, {}) }),
7719
+ /* @__PURE__ */ u3("div", { className: "signin__button__label", children: "Sign in with Google" })
7573
7720
  ] });
7574
7721
  };
7575
- SignIn.GLogo = () => /* @__PURE__ */ o2("svg", { version: "1.1", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 48 48", children: /* @__PURE__ */ o2("g", { children: [
7576
- /* @__PURE__ */ o2(
7722
+ SignIn.GLogo = () => /* @__PURE__ */ u3("svg", { version: "1.1", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 48 48", children: /* @__PURE__ */ u3("g", { children: [
7723
+ /* @__PURE__ */ u3(
7577
7724
  "path",
7578
7725
  {
7579
7726
  fill: "#EA4335",
7580
7727
  d: "M24 9.5c3.54 0 6.71 1.22 9.21 3.6l6.85-6.85C35.9 2.38 30.47 0 24 0 14.62 0 6.51 5.38 2.56 13.22l7.98 6.19C12.43 13.72 17.74 9.5 24 9.5z"
7581
7728
  }
7582
7729
  ),
7583
- /* @__PURE__ */ o2(
7730
+ /* @__PURE__ */ u3(
7584
7731
  "path",
7585
7732
  {
7586
7733
  fill: "#4285F4",
7587
7734
  d: "M46.98 24.55c0-1.57-.15-3.09-.38-4.55H24v9.02h12.94c-.58 2.96-2.26 5.48-4.78 7.18l7.73 6c4.51-4.18 7.09-10.36 7.09-17.65z"
7588
7735
  }
7589
7736
  ),
7590
- /* @__PURE__ */ o2(
7737
+ /* @__PURE__ */ u3(
7591
7738
  "path",
7592
7739
  {
7593
7740
  fill: "#FBBC05",
7594
7741
  d: "M10.53 28.59c-.48-1.45-.76-2.99-.76-4.59s.27-3.14.76-4.59l-7.98-6.19C.92 16.46 0 20.12 0 24c0 3.88.92 7.54 2.56 10.78l7.97-6.19z"
7595
7742
  }
7596
7743
  ),
7597
- /* @__PURE__ */ o2(
7744
+ /* @__PURE__ */ u3(
7598
7745
  "path",
7599
7746
  {
7600
7747
  fill: "#34A853",
7601
7748
  d: "M24 48c6.48 0 11.93-2.13 15.89-5.81l-7.73-6c-2.15 1.45-4.92 2.3-8.16 2.3-6.26 0-11.57-4.22-13.47-9.91l-7.98 6.19C6.51 42.62 14.62 48 24 48z"
7602
7749
  }
7603
7750
  ),
7604
- /* @__PURE__ */ o2("path", { fill: "none", d: "M0 0h48v48H0z" })
7751
+ /* @__PURE__ */ u3("path", { fill: "none", d: "M0 0h48v48H0z" })
7605
7752
  ] }) });
7606
7753
  function loginSuccessRedirect() {
7607
7754
  const params = new URLSearchParams(window.location.search);
@@ -7616,7 +7763,7 @@
7616
7763
  window.firebase = { app, auth };
7617
7764
  var root = document.getElementById("root");
7618
7765
  root.innerHTML = "";
7619
- P(/* @__PURE__ */ o2(SignIn, {}), root);
7766
+ q(/* @__PURE__ */ u3(SignIn, {}), root);
7620
7767
  })();
7621
7768
  /*! Bundled license information:
7622
7769
 
@@ -8998,3 +9145,4 @@ firebase/app/dist/esm/index.esm.js:
8998
9145
  * limitations under the License.
8999
9146
  *)
9000
9147
  */
9148
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSt1dGlsQDEuOS4zL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvdXRpbC9zcmMvY29uc3RhbnRzLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrdXRpbEAxLjkuMy9ub2RlX21vZHVsZXMvQGZpcmViYXNlL3V0aWwvc3JjL2Fzc2VydC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK3V0aWxAMS45LjMvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS91dGlsL3NyYy9jcnlwdC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK3V0aWxAMS45LjMvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS91dGlsL3NyYy9kZWVwQ29weS50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK3V0aWxAMS45LjMvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS91dGlsL3NyYy9nbG9iYWwudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSt1dGlsQDEuOS4zL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvdXRpbC9zcmMvZGVmYXVsdHMudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSt1dGlsQDEuOS4zL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvdXRpbC9zcmMvZGVmZXJyZWQudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSt1dGlsQDEuOS4zL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvdXRpbC9zcmMvZW11bGF0b3IudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSt1dGlsQDEuOS4zL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvdXRpbC9zcmMvZW52aXJvbm1lbnQudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSt1dGlsQDEuOS4zL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvdXRpbC9zcmMvZXJyb3JzLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrdXRpbEAxLjkuMy9ub2RlX21vZHVsZXMvQGZpcmViYXNlL3V0aWwvc3JjL2pzb24udHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSt1dGlsQDEuOS4zL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvdXRpbC9zcmMvand0LnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrdXRpbEAxLjkuMy9ub2RlX21vZHVsZXMvQGZpcmViYXNlL3V0aWwvc3JjL29iai50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK3V0aWxAMS45LjMvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS91dGlsL3NyYy9wcm9taXNlLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrdXRpbEAxLjkuMy9ub2RlX21vZHVsZXMvQGZpcmViYXNlL3V0aWwvc3JjL3F1ZXJ5LnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrdXRpbEAxLjkuMy9ub2RlX21vZHVsZXMvQGZpcmViYXNlL3V0aWwvc3JjL3NoYTEudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSt1dGlsQDEuOS4zL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvdXRpbC9zcmMvc3Vic2NyaWJlLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrdXRpbEAxLjkuMy9ub2RlX21vZHVsZXMvQGZpcmViYXNlL3V0aWwvc3JjL3ZhbGlkYXRpb24udHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSt1dGlsQDEuOS4zL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvdXRpbC9zcmMvdXRmOC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK3V0aWxAMS45LjMvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS91dGlsL3NyYy91dWlkLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrdXRpbEAxLjkuMy9ub2RlX21vZHVsZXMvQGZpcmViYXNlL3V0aWwvc3JjL2V4cG9uZW50aWFsX2JhY2tvZmYudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSt1dGlsQDEuOS4zL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvdXRpbC9zcmMvZm9ybWF0dGVycy50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK3V0aWxAMS45LjMvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS91dGlsL3NyYy9jb21wYXQudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZStjb21wb25lbnRAMC42LjQvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9jb21wb25lbnQvc3JjL2NvbXBvbmVudC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2NvbXBvbmVudEAwLjYuNC9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2NvbXBvbmVudC9zcmMvY29uc3RhbnRzLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrY29tcG9uZW50QDAuNi40L25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvY29tcG9uZW50L3NyYy9wcm92aWRlci50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2NvbXBvbmVudEAwLjYuNC9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2NvbXBvbmVudC9zcmMvY29tcG9uZW50X2NvbnRhaW5lci50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2xvZ2dlckAwLjQuMC9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2xvZ2dlci9zcmMvbG9nZ2VyLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9pZGJANy4xLjEvbm9kZV9tb2R1bGVzL2lkYi9idWlsZC93cmFwLWlkYi12YWx1ZS5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vaWRiQDcuMS4xL25vZGVfbW9kdWxlcy9pZGIvYnVpbGQvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXBwL3NyYy9wbGF0Zm9ybUxvZ2dlclNlcnZpY2UudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXBwL3NyYy9sb2dnZXIudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXBwL3NyYy9jb25zdGFudHMudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXBwL3NyYy9pbnRlcm5hbC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hcHAvc3JjL2Vycm9ycy50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hcHAvc3JjL2ZpcmViYXNlQXBwLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2FwcC9zcmMvYXBpLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2FwcC9zcmMvaW5kZXhlZGRiLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2FwcC9zcmMvaGVhcnRiZWF0U2VydmljZS50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hcHAvc3JjL3JlZ2lzdGVyQ29yZUNvbXBvbmVudHMudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXBwL3NyYy9pbmRleC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vZmlyZWJhc2VAMTAuNS4yL25vZGVfbW9kdWxlcy9maXJlYmFzZS9hcHAvaW5kZXgudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3RzbGliQDIuNi4yL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYubWpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL21vZGVsL2VudW1fbWFwcy50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL2Vycm9ycy50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3V0aWwvbG9nLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvdXRpbC9hc3NlcnQudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS91dGlsL2xvY2F0aW9uLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvdXRpbC9uYXZpZ2F0b3IudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS91dGlsL2RlbGF5LnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvdXRpbC9lbXVsYXRvci50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3V0aWwvZmV0Y2hfcHJvdmlkZXIudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvYXBpL2Vycm9ycy50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9hcGkvaW5kZXgudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvcGxhdGZvcm1fYnJvd3Nlci9yZWNhcHRjaGEvcmVjYXB0Y2hhLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2FwaS9hdXRoZW50aWNhdGlvbi9yZWNhcHRjaGEudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvYXBpL2FjY291bnRfbWFuYWdlbWVudC9hY2NvdW50LnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvdXRpbC90aW1lLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvdXNlci9pZF90b2tlbl9yZXN1bHQudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS91c2VyL2ludmFsaWRhdGlvbi50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3VzZXIvcHJvYWN0aXZlX3JlZnJlc2gudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS91c2VyL3VzZXJfbWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS91c2VyL3JlbG9hZC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9hcGkvYXV0aGVudGljYXRpb24vdG9rZW4udHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS91c2VyL3Rva2VuX21hbmFnZXIudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS91c2VyL3VzZXJfaW1wbC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3V0aWwvaW5zdGFudGlhdG9yLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvcGVyc2lzdGVuY2UvaW5fbWVtb3J5LnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvcGVyc2lzdGVuY2UvcGVyc2lzdGVuY2VfdXNlcl9tYW5hZ2VyLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvdXRpbC9icm93c2VyLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvdXRpbC92ZXJzaW9uLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvYXV0aC9taWRkbGV3YXJlLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2FwaS9wYXNzd29yZF9wb2xpY3kvZ2V0X3Bhc3N3b3JkX3BvbGljeS50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL2F1dGgvcGFzc3dvcmRfcG9saWN5X2ltcGwudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS9hdXRoL2F1dGhfaW1wbC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9wbGF0Zm9ybV9icm93c2VyL2xvYWRfanMudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvcGxhdGZvcm1fYnJvd3Nlci9yZWNhcHRjaGEvcmVjYXB0Y2hhX2VudGVycHJpc2VfdmVyaWZpZXIudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS9hdXRoL2luaXRpYWxpemUudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS9hdXRoL2VtdWxhdG9yLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvY3JlZGVudGlhbHMvYXV0aF9jcmVkZW50aWFsLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2FwaS9hY2NvdW50X21hbmFnZW1lbnQvZW1haWxfYW5kX3Bhc3N3b3JkLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2FwaS9hdXRoZW50aWNhdGlvbi9lbWFpbF9hbmRfcGFzc3dvcmQudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvYXBpL2F1dGhlbnRpY2F0aW9uL2VtYWlsX2xpbmsudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS9jcmVkZW50aWFscy9lbWFpbC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9hcGkvYXV0aGVudGljYXRpb24vaWRwLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvY3JlZGVudGlhbHMvb2F1dGgudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvYXBpL2F1dGhlbnRpY2F0aW9uL3Ntcy50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL2NyZWRlbnRpYWxzL3Bob25lLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvYWN0aW9uX2NvZGVfdXJsLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvcHJvdmlkZXJzL2VtYWlsLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvcHJvdmlkZXJzL2ZlZGVyYXRlZC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3Byb3ZpZGVycy9vYXV0aC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3Byb3ZpZGVycy9mYWNlYm9vay50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3Byb3ZpZGVycy9nb29nbGUudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS9wcm92aWRlcnMvZ2l0aHViLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvY3JlZGVudGlhbHMvc2FtbC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3Byb3ZpZGVycy9zYW1sLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvcHJvdmlkZXJzL3R3aXR0ZXIudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvYXBpL2F1dGhlbnRpY2F0aW9uL3NpZ25fdXAudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS91c2VyL3VzZXJfY3JlZGVudGlhbF9pbXBsLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvc3RyYXRlZ2llcy9hbm9ueW1vdXMudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvbWZhL21mYV9lcnJvci50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3V0aWwvcHJvdmlkZXJzLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvdXNlci9saW5rX3VubGluay50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3VzZXIvcmVhdXRoZW50aWNhdGUudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS9zdHJhdGVnaWVzL2NyZWRlbnRpYWwudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvYXBpL2F1dGhlbnRpY2F0aW9uL2N1c3RvbV90b2tlbi50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3N0cmF0ZWdpZXMvY3VzdG9tX3Rva2VuLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL21mYS9tZmFfaW5mby50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3N0cmF0ZWdpZXMvYWN0aW9uX2NvZGVfc2V0dGluZ3MudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS9zdHJhdGVnaWVzL2VtYWlsX2FuZF9wYXNzd29yZC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3N0cmF0ZWdpZXMvZW1haWxfbGluay50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9hcGkvYXV0aGVudGljYXRpb24vY3JlYXRlX2F1dGhfdXJpLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvc3RyYXRlZ2llcy9lbWFpbC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9hcGkvYWNjb3VudF9tYW5hZ2VtZW50L3Byb2ZpbGUudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS91c2VyL2FjY291bnRfaW5mby50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3VzZXIvYWRkaXRpb25hbF91c2VyX2luZm8udHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS9pbmRleC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9tZmEvbWZhX3Nlc3Npb24udHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvbWZhL21mYV9yZXNvbHZlci50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9hcGkvYWNjb3VudF9tYW5hZ2VtZW50L21mYS50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9tZmEvbWZhX3VzZXIudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS9wZXJzaXN0ZW5jZS9pbmRleC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9wbGF0Zm9ybV9icm93c2VyL3BlcnNpc3RlbmNlL2Jyb3dzZXIudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvcGxhdGZvcm1fYnJvd3Nlci9wZXJzaXN0ZW5jZS9sb2NhbF9zdG9yYWdlLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL3BsYXRmb3JtX2Jyb3dzZXIvcGVyc2lzdGVuY2Uvc2Vzc2lvbl9zdG9yYWdlLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL3BsYXRmb3JtX2Jyb3dzZXIvbWVzc2FnZWNoYW5uZWwvcHJvbWlzZS50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9wbGF0Zm9ybV9icm93c2VyL21lc3NhZ2VjaGFubmVsL3JlY2VpdmVyLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvdXRpbC9ldmVudF9pZC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9wbGF0Zm9ybV9icm93c2VyL21lc3NhZ2VjaGFubmVsL3NlbmRlci50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9wbGF0Zm9ybV9icm93c2VyL2F1dGhfd2luZG93LnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL3BsYXRmb3JtX2Jyb3dzZXIvdXRpbC93b3JrZXIudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvcGxhdGZvcm1fYnJvd3Nlci9wZXJzaXN0ZW5jZS9pbmRleGVkX2RiLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2FwaS9hdXRoZW50aWNhdGlvbi9tZmEudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvcGxhdGZvcm1fYnJvd3Nlci9yZWNhcHRjaGEvcmVjYXB0Y2hhX21vY2sudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvcGxhdGZvcm1fYnJvd3Nlci9yZWNhcHRjaGEvcmVjYXB0Y2hhX2xvYWRlci50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9wbGF0Zm9ybV9icm93c2VyL3JlY2FwdGNoYS9yZWNhcHRjaGFfdmVyaWZpZXIudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvcGxhdGZvcm1fYnJvd3Nlci9zdHJhdGVnaWVzL3Bob25lLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL3BsYXRmb3JtX2Jyb3dzZXIvcHJvdmlkZXJzL3Bob25lLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvdXRpbC9yZXNvbHZlci50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3N0cmF0ZWdpZXMvaWRwLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvc3RyYXRlZ2llcy9hYnN0cmFjdF9wb3B1cF9yZWRpcmVjdF9vcGVyYXRpb24udHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvcGxhdGZvcm1fYnJvd3Nlci9zdHJhdGVnaWVzL3BvcHVwLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvc3RyYXRlZ2llcy9yZWRpcmVjdC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9wbGF0Zm9ybV9icm93c2VyL3N0cmF0ZWdpZXMvcmVkaXJlY3QudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS9hdXRoL2F1dGhfZXZlbnRfbWFuYWdlci50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9hcGkvcHJvamVjdF9jb25maWcvZ2V0X3Byb2plY3RfY29uZmlnLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvdXRpbC92YWxpZGF0ZV9vcmlnaW4udHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvcGxhdGZvcm1fYnJvd3Nlci9pZnJhbWUvZ2FwaS50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9wbGF0Zm9ybV9icm93c2VyL2lmcmFtZS9pZnJhbWUudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvcGxhdGZvcm1fYnJvd3Nlci91dGlsL3BvcHVwLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvdXRpbC9oYW5kbGVyLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL3BsYXRmb3JtX2Jyb3dzZXIvcG9wdXBfcmVkaXJlY3QudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvbWZhL21mYV9hc3NlcnRpb24udHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvcGxhdGZvcm1fYnJvd3Nlci9tZmEvYXNzZXJ0aW9ucy9waG9uZS50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9tZmEvYXNzZXJ0aW9ucy90b3RwLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvYXV0aC9maXJlYmFzZV9pbnRlcm5hbC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL2F1dGgvcmVnaXN0ZXIudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvcGxhdGZvcm1fYnJvd3Nlci9pbmRleC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcHJlYWN0QDEwLjE5LjMvbm9kZV9tb2R1bGVzL3ByZWFjdC9zcmMvY29uc3RhbnRzLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wcmVhY3RAMTAuMTkuMy9ub2RlX21vZHVsZXMvcHJlYWN0L3NyYy91dGlsLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wcmVhY3RAMTAuMTkuMy9ub2RlX21vZHVsZXMvcHJlYWN0L3NyYy9vcHRpb25zLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wcmVhY3RAMTAuMTkuMy9ub2RlX21vZHVsZXMvcHJlYWN0L3NyYy9jcmVhdGUtZWxlbWVudC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcHJlYWN0QDEwLjE5LjMvbm9kZV9tb2R1bGVzL3ByZWFjdC9zcmMvY29tcG9uZW50LmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wcmVhY3RAMTAuMTkuMy9ub2RlX21vZHVsZXMvcHJlYWN0L3NyYy9jcmVhdGUtY29udGV4dC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcHJlYWN0QDEwLjE5LjMvbm9kZV9tb2R1bGVzL3ByZWFjdC9zcmMvZGlmZi9jaGlsZHJlbi5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcHJlYWN0QDEwLjE5LjMvbm9kZV9tb2R1bGVzL3ByZWFjdC9zcmMvZGlmZi9wcm9wcy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcHJlYWN0QDEwLjE5LjMvbm9kZV9tb2R1bGVzL3ByZWFjdC9zcmMvZGlmZi9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcHJlYWN0QDEwLjE5LjMvbm9kZV9tb2R1bGVzL3ByZWFjdC9zcmMvcmVuZGVyLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wcmVhY3RAMTAuMTkuMy9ub2RlX21vZHVsZXMvcHJlYWN0L3NyYy9jbG9uZS1lbGVtZW50LmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wcmVhY3RAMTAuMTkuMy9ub2RlX21vZHVsZXMvcHJlYWN0L3NyYy9kaWZmL2NhdGNoLWVycm9yLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wcmVhY3RAMTAuMTkuMy9ub2RlX21vZHVsZXMvcHJlYWN0L2hvb2tzL3NyYy9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcHJlYWN0QDEwLjE5LjMvbm9kZV9tb2R1bGVzL3ByZWFjdC9qc3gtcnVudGltZS9zcmMvdXRpbHMuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3ByZWFjdEAxMC4xOS4zL25vZGVfbW9kdWxlcy9wcmVhY3Qvc3JjL2NvbnN0YW50cy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcHJlYWN0QDEwLjE5LjMvbm9kZV9tb2R1bGVzL3ByZWFjdC9qc3gtcnVudGltZS9zcmMvaW5kZXguanMiLCAiLi4vLi4vc2lnbmluL3NpZ25pbi50c3giXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8qKlxuICogQGZpbGVvdmVydmlldyBGaXJlYmFzZSBjb25zdGFudHMuICBTb21lIG9mIHRoZXNlIChAZGVmaW5lcykgY2FuIGJlIG92ZXJyaWRkZW4gYXQgY29tcGlsZS10aW1lLlxuICovXG5cbmV4cG9ydCBjb25zdCBDT05TVEFOVFMgPSB7XG4gIC8qKlxuICAgKiBAZGVmaW5lIHtib29sZWFufSBXaGV0aGVyIHRoaXMgaXMgdGhlIGNsaWVudCBOb2RlLmpzIFNESy5cbiAgICovXG4gIE5PREVfQ0xJRU5UOiBmYWxzZSxcbiAgLyoqXG4gICAqIEBkZWZpbmUge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyBpcyB0aGUgQWRtaW4gTm9kZS5qcyBTREsuXG4gICAqL1xuICBOT0RFX0FETUlOOiBmYWxzZSxcblxuICAvKipcbiAgICogRmlyZWJhc2UgU0RLIFZlcnNpb25cbiAgICovXG4gIFNES19WRVJTSU9OOiAnJHtKU0NPUkVfVkVSU0lPTn0nXG59O1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IENPTlNUQU5UUyB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuLyoqXG4gKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIHByb3ZpZGVkIGFzc2VydGlvbiBpcyBmYWxzeVxuICovXG5leHBvcnQgY29uc3QgYXNzZXJ0ID0gZnVuY3Rpb24gKGFzc2VydGlvbjogdW5rbm93biwgbWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gIGlmICghYXNzZXJ0aW9uKSB7XG4gICAgdGhyb3cgYXNzZXJ0aW9uRXJyb3IobWVzc2FnZSk7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0dXJucyBhbiBFcnJvciBvYmplY3Qgc3VpdGFibGUgZm9yIHRocm93aW5nLlxuICovXG5leHBvcnQgY29uc3QgYXNzZXJ0aW9uRXJyb3IgPSBmdW5jdGlvbiAobWVzc2FnZTogc3RyaW5nKTogRXJyb3Ige1xuICByZXR1cm4gbmV3IEVycm9yKFxuICAgICdGaXJlYmFzZSBEYXRhYmFzZSAoJyArXG4gICAgICBDT05TVEFOVFMuU0RLX1ZFUlNJT04gK1xuICAgICAgJykgSU5URVJOQUwgQVNTRVJUIEZBSUxFRDogJyArXG4gICAgICBtZXNzYWdlXG4gICk7XG59O1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmNvbnN0IHN0cmluZ1RvQnl0ZUFycmF5ID0gZnVuY3Rpb24gKHN0cjogc3RyaW5nKTogbnVtYmVyW10ge1xuICAvLyBUT0RPKHVzZXIpOiBVc2UgbmF0aXZlIGltcGxlbWVudGF0aW9ucyBpZi93aGVuIGF2YWlsYWJsZVxuICBjb25zdCBvdXQ6IG51bWJlcltdID0gW107XG4gIGxldCBwID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICBsZXQgYyA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgIGlmIChjIDwgMTI4KSB7XG4gICAgICBvdXRbcCsrXSA9IGM7XG4gICAgfSBlbHNlIGlmIChjIDwgMjA0OCkge1xuICAgICAgb3V0W3ArK10gPSAoYyA+PiA2KSB8IDE5MjtcbiAgICAgIG91dFtwKytdID0gKGMgJiA2MykgfCAxMjg7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIChjICYgMHhmYzAwKSA9PT0gMHhkODAwICYmXG4gICAgICBpICsgMSA8IHN0ci5sZW5ndGggJiZcbiAgICAgIChzdHIuY2hhckNvZGVBdChpICsgMSkgJiAweGZjMDApID09PSAweGRjMDBcbiAgICApIHtcbiAgICAgIC8vIFN1cnJvZ2F0ZSBQYWlyXG4gICAgICBjID0gMHgxMDAwMCArICgoYyAmIDB4MDNmZikgPDwgMTApICsgKHN0ci5jaGFyQ29kZUF0KCsraSkgJiAweDAzZmYpO1xuICAgICAgb3V0W3ArK10gPSAoYyA+PiAxOCkgfCAyNDA7XG4gICAgICBvdXRbcCsrXSA9ICgoYyA+PiAxMikgJiA2MykgfCAxMjg7XG4gICAgICBvdXRbcCsrXSA9ICgoYyA+PiA2KSAmIDYzKSB8IDEyODtcbiAgICAgIG91dFtwKytdID0gKGMgJiA2MykgfCAxMjg7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dFtwKytdID0gKGMgPj4gMTIpIHwgMjI0O1xuICAgICAgb3V0W3ArK10gPSAoKGMgPj4gNikgJiA2MykgfCAxMjg7XG4gICAgICBvdXRbcCsrXSA9IChjICYgNjMpIHwgMTI4O1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBUdXJucyBhbiBhcnJheSBvZiBudW1iZXJzIGludG8gdGhlIHN0cmluZyBnaXZlbiBieSB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGVcbiAqIGNoYXJhY3RlcnMgdG8gd2hpY2ggdGhlIG51bWJlcnMgY29ycmVzcG9uZC5cbiAqIEBwYXJhbSBieXRlcyBBcnJheSBvZiBudW1iZXJzIHJlcHJlc2VudGluZyBjaGFyYWN0ZXJzLlxuICogQHJldHVybiBTdHJpbmdpZmljYXRpb24gb2YgdGhlIGFycmF5LlxuICovXG5jb25zdCBieXRlQXJyYXlUb1N0cmluZyA9IGZ1bmN0aW9uIChieXRlczogbnVtYmVyW10pOiBzdHJpbmcge1xuICAvLyBUT0RPKHVzZXIpOiBVc2UgbmF0aXZlIGltcGxlbWVudGF0aW9ucyBpZi93aGVuIGF2YWlsYWJsZVxuICBjb25zdCBvdXQ6IHN0cmluZ1tdID0gW107XG4gIGxldCBwb3MgPSAwLFxuICAgIGMgPSAwO1xuICB3aGlsZSAocG9zIDwgYnl0ZXMubGVuZ3RoKSB7XG4gICAgY29uc3QgYzEgPSBieXRlc1twb3MrK107XG4gICAgaWYgKGMxIDwgMTI4KSB7XG4gICAgICBvdXRbYysrXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoYzEpO1xuICAgIH0gZWxzZSBpZiAoYzEgPiAxOTEgJiYgYzEgPCAyMjQpIHtcbiAgICAgIGNvbnN0IGMyID0gYnl0ZXNbcG9zKytdO1xuICAgICAgb3V0W2MrK10gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCgoYzEgJiAzMSkgPDwgNikgfCAoYzIgJiA2MykpO1xuICAgIH0gZWxzZSBpZiAoYzEgPiAyMzkgJiYgYzEgPCAzNjUpIHtcbiAgICAgIC8vIFN1cnJvZ2F0ZSBQYWlyXG4gICAgICBjb25zdCBjMiA9IGJ5dGVzW3BvcysrXTtcbiAgICAgIGNvbnN0IGMzID0gYnl0ZXNbcG9zKytdO1xuICAgICAgY29uc3QgYzQgPSBieXRlc1twb3MrK107XG4gICAgICBjb25zdCB1ID1cbiAgICAgICAgKCgoYzEgJiA3KSA8PCAxOCkgfCAoKGMyICYgNjMpIDw8IDEyKSB8ICgoYzMgJiA2MykgPDwgNikgfCAoYzQgJiA2MykpIC1cbiAgICAgICAgMHgxMDAwMDtcbiAgICAgIG91dFtjKytdID0gU3RyaW5nLmZyb21DaGFyQ29kZSgweGQ4MDAgKyAodSA+PiAxMCkpO1xuICAgICAgb3V0W2MrK10gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4ZGMwMCArICh1ICYgMTAyMykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjMiA9IGJ5dGVzW3BvcysrXTtcbiAgICAgIGNvbnN0IGMzID0gYnl0ZXNbcG9zKytdO1xuICAgICAgb3V0W2MrK10gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKFxuICAgICAgICAoKGMxICYgMTUpIDw8IDEyKSB8ICgoYzIgJiA2MykgPDwgNikgfCAoYzMgJiA2MylcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXQuam9pbignJyk7XG59O1xuXG5pbnRlcmZhY2UgQmFzZTY0IHtcbiAgYnl0ZVRvQ2hhck1hcF86IHsgW2tleTogbnVtYmVyXTogc3RyaW5nIH0gfCBudWxsO1xuICBjaGFyVG9CeXRlTWFwXzogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSB8IG51bGw7XG4gIGJ5dGVUb0NoYXJNYXBXZWJTYWZlXzogeyBba2V5OiBudW1iZXJdOiBzdHJpbmcgfSB8IG51bGw7XG4gIGNoYXJUb0J5dGVNYXBXZWJTYWZlXzogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSB8IG51bGw7XG4gIEVOQ09ERURfVkFMU19CQVNFOiBzdHJpbmc7XG4gIHJlYWRvbmx5IEVOQ09ERURfVkFMUzogc3RyaW5nO1xuICByZWFkb25seSBFTkNPREVEX1ZBTFNfV0VCU0FGRTogc3RyaW5nO1xuICBIQVNfTkFUSVZFX1NVUFBPUlQ6IGJvb2xlYW47XG4gIGVuY29kZUJ5dGVBcnJheShpbnB1dDogbnVtYmVyW10gfCBVaW50OEFycmF5LCB3ZWJTYWZlPzogYm9vbGVhbik6IHN0cmluZztcbiAgZW5jb2RlU3RyaW5nKGlucHV0OiBzdHJpbmcsIHdlYlNhZmU/OiBib29sZWFuKTogc3RyaW5nO1xuICBkZWNvZGVTdHJpbmcoaW5wdXQ6IHN0cmluZywgd2ViU2FmZTogYm9vbGVhbik6IHN0cmluZztcbiAgZGVjb2RlU3RyaW5nVG9CeXRlQXJyYXkoaW5wdXQ6IHN0cmluZywgd2ViU2FmZTogYm9vbGVhbik6IG51bWJlcltdO1xuICBpbml0XygpOiB2b2lkO1xufVxuXG4vLyBXZSBkZWZpbmUgaXQgYXMgYW4gb2JqZWN0IGxpdGVyYWwgaW5zdGVhZCBvZiBhIGNsYXNzIGJlY2F1c2UgYSBjbGFzcyBjb21waWxlZCBkb3duIHRvIGVzNSBjYW4ndFxuLy8gYmUgdHJlZXNoYWtlZC4gaHR0cHM6Ly9naXRodWIuY29tL3JvbGx1cC9yb2xsdXAvaXNzdWVzLzE2OTFcbi8vIFN0YXRpYyBsb29rdXAgbWFwcywgbGF6aWx5IHBvcHVsYXRlZCBieSBpbml0XygpXG5leHBvcnQgY29uc3QgYmFzZTY0OiBCYXNlNjQgPSB7XG4gIC8qKlxuICAgKiBNYXBzIGJ5dGVzIHRvIGNoYXJhY3RlcnMuXG4gICAqL1xuICBieXRlVG9DaGFyTWFwXzogbnVsbCxcblxuICAvKipcbiAgICogTWFwcyBjaGFyYWN0ZXJzIHRvIGJ5dGVzLlxuICAgKi9cbiAgY2hhclRvQnl0ZU1hcF86IG51bGwsXG5cbiAgLyoqXG4gICAqIE1hcHMgYnl0ZXMgdG8gd2Vic2FmZSBjaGFyYWN0ZXJzLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgYnl0ZVRvQ2hhck1hcFdlYlNhZmVfOiBudWxsLFxuXG4gIC8qKlxuICAgKiBNYXBzIHdlYnNhZmUgY2hhcmFjdGVycyB0byBieXRlcy5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNoYXJUb0J5dGVNYXBXZWJTYWZlXzogbnVsbCxcblxuICAvKipcbiAgICogT3VyIGRlZmF1bHQgYWxwaGFiZXQsIHNoYXJlZCBiZXR3ZWVuXG4gICAqIEVOQ09ERURfVkFMUyBhbmQgRU5DT0RFRF9WQUxTX1dFQlNBRkVcbiAgICovXG4gIEVOQ09ERURfVkFMU19CQVNFOlxuICAgICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgKyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICsgJzAxMjM0NTY3ODknLFxuXG4gIC8qKlxuICAgKiBPdXIgZGVmYXVsdCBhbHBoYWJldC4gVmFsdWUgNjQgKD0pIGlzIHNwZWNpYWw7IGl0IG1lYW5zIFwibm90aGluZy5cIlxuICAgKi9cbiAgZ2V0IEVOQ09ERURfVkFMUygpIHtcbiAgICByZXR1cm4gdGhpcy5FTkNPREVEX1ZBTFNfQkFTRSArICcrLz0nO1xuICB9LFxuXG4gIC8qKlxuICAgKiBPdXIgd2Vic2FmZSBhbHBoYWJldC5cbiAgICovXG4gIGdldCBFTkNPREVEX1ZBTFNfV0VCU0FGRSgpIHtcbiAgICByZXR1cm4gdGhpcy5FTkNPREVEX1ZBTFNfQkFTRSArICctXy4nO1xuICB9LFxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgYnJvd3NlciBzdXBwb3J0cyB0aGUgYXRvYiBhbmQgYnRvYSBmdW5jdGlvbnMuIFRoaXMgZXh0ZW5zaW9uXG4gICAqIHN0YXJ0ZWQgYXQgTW96aWxsYSBidXQgaXMgbm93IGltcGxlbWVudGVkIGJ5IG1hbnkgYnJvd3NlcnMuIFdlIHVzZSB0aGVcbiAgICogQVNTVU1FXyogdmFyaWFibGVzIHRvIGF2b2lkIHB1bGxpbmcgaW4gdGhlIGZ1bGwgdXNlcmFnZW50IGRldGVjdGlvbiBsaWJyYXJ5XG4gICAqIGJ1dCBzdGlsbCBhbGxvd2luZyB0aGUgc3RhbmRhcmQgcGVyLWJyb3dzZXIgY29tcGlsYXRpb25zLlxuICAgKlxuICAgKi9cbiAgSEFTX05BVElWRV9TVVBQT1JUOiB0eXBlb2YgYXRvYiA9PT0gJ2Z1bmN0aW9uJyxcblxuICAvKipcbiAgICogQmFzZTY0LWVuY29kZSBhbiBhcnJheSBvZiBieXRlcy5cbiAgICpcbiAgICogQHBhcmFtIGlucHV0IEFuIGFycmF5IG9mIGJ5dGVzIChudW1iZXJzIHdpdGhcbiAgICogICAgIHZhbHVlIGluIFswLCAyNTVdKSB0byBlbmNvZGUuXG4gICAqIEBwYXJhbSB3ZWJTYWZlIEJvb2xlYW4gaW5kaWNhdGluZyB3ZSBzaG91bGQgdXNlIHRoZVxuICAgKiAgICAgYWx0ZXJuYXRpdmUgYWxwaGFiZXQuXG4gICAqIEByZXR1cm4gVGhlIGJhc2U2NCBlbmNvZGVkIHN0cmluZy5cbiAgICovXG4gIGVuY29kZUJ5dGVBcnJheShpbnB1dDogbnVtYmVyW10gfCBVaW50OEFycmF5LCB3ZWJTYWZlPzogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ2VuY29kZUJ5dGVBcnJheSB0YWtlcyBhbiBhcnJheSBhcyBhIHBhcmFtZXRlcicpO1xuICAgIH1cblxuICAgIHRoaXMuaW5pdF8oKTtcblxuICAgIGNvbnN0IGJ5dGVUb0NoYXJNYXAgPSB3ZWJTYWZlXG4gICAgICA/IHRoaXMuYnl0ZVRvQ2hhck1hcFdlYlNhZmVfIVxuICAgICAgOiB0aGlzLmJ5dGVUb0NoYXJNYXBfITtcblxuICAgIGNvbnN0IG91dHB1dCA9IFtdO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgY29uc3QgYnl0ZTEgPSBpbnB1dFtpXTtcbiAgICAgIGNvbnN0IGhhdmVCeXRlMiA9IGkgKyAxIDwgaW5wdXQubGVuZ3RoO1xuICAgICAgY29uc3QgYnl0ZTIgPSBoYXZlQnl0ZTIgPyBpbnB1dFtpICsgMV0gOiAwO1xuICAgICAgY29uc3QgaGF2ZUJ5dGUzID0gaSArIDIgPCBpbnB1dC5sZW5ndGg7XG4gICAgICBjb25zdCBieXRlMyA9IGhhdmVCeXRlMyA/IGlucHV0W2kgKyAyXSA6IDA7XG5cbiAgICAgIGNvbnN0IG91dEJ5dGUxID0gYnl0ZTEgPj4gMjtcbiAgICAgIGNvbnN0IG91dEJ5dGUyID0gKChieXRlMSAmIDB4MDMpIDw8IDQpIHwgKGJ5dGUyID4+IDQpO1xuICAgICAgbGV0IG91dEJ5dGUzID0gKChieXRlMiAmIDB4MGYpIDw8IDIpIHwgKGJ5dGUzID4+IDYpO1xuICAgICAgbGV0IG91dEJ5dGU0ID0gYnl0ZTMgJiAweDNmO1xuXG4gICAgICBpZiAoIWhhdmVCeXRlMykge1xuICAgICAgICBvdXRCeXRlNCA9IDY0O1xuXG4gICAgICAgIGlmICghaGF2ZUJ5dGUyKSB7XG4gICAgICAgICAgb3V0Qnl0ZTMgPSA2NDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBvdXRwdXQucHVzaChcbiAgICAgICAgYnl0ZVRvQ2hhck1hcFtvdXRCeXRlMV0sXG4gICAgICAgIGJ5dGVUb0NoYXJNYXBbb3V0Qnl0ZTJdLFxuICAgICAgICBieXRlVG9DaGFyTWFwW291dEJ5dGUzXSxcbiAgICAgICAgYnl0ZVRvQ2hhck1hcFtvdXRCeXRlNF1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dHB1dC5qb2luKCcnKTtcbiAgfSxcblxuICAvKipcbiAgICogQmFzZTY0LWVuY29kZSBhIHN0cmluZy5cbiAgICpcbiAgICogQHBhcmFtIGlucHV0IEEgc3RyaW5nIHRvIGVuY29kZS5cbiAgICogQHBhcmFtIHdlYlNhZmUgSWYgdHJ1ZSwgd2Ugc2hvdWxkIHVzZSB0aGVcbiAgICogICAgIGFsdGVybmF0aXZlIGFscGhhYmV0LlxuICAgKiBAcmV0dXJuIFRoZSBiYXNlNjQgZW5jb2RlZCBzdHJpbmcuXG4gICAqL1xuICBlbmNvZGVTdHJpbmcoaW5wdXQ6IHN0cmluZywgd2ViU2FmZT86IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIC8vIFNob3J0Y3V0IGZvciBNb3ppbGxhIGJyb3dzZXJzIHRoYXQgaW1wbGVtZW50XG4gICAgLy8gYSBuYXRpdmUgYmFzZTY0IGVuY29kZXIgaW4gdGhlIGZvcm0gb2YgXCJidG9hL2F0b2JcIlxuICAgIGlmICh0aGlzLkhBU19OQVRJVkVfU1VQUE9SVCAmJiAhd2ViU2FmZSkge1xuICAgICAgcmV0dXJuIGJ0b2EoaW5wdXQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lbmNvZGVCeXRlQXJyYXkoc3RyaW5nVG9CeXRlQXJyYXkoaW5wdXQpLCB3ZWJTYWZlKTtcbiAgfSxcblxuICAvKipcbiAgICogQmFzZTY0LWRlY29kZSBhIHN0cmluZy5cbiAgICpcbiAgICogQHBhcmFtIGlucHV0IHRvIGRlY29kZS5cbiAgICogQHBhcmFtIHdlYlNhZmUgVHJ1ZSBpZiB3ZSBzaG91bGQgdXNlIHRoZVxuICAgKiAgICAgYWx0ZXJuYXRpdmUgYWxwaGFiZXQuXG4gICAqIEByZXR1cm4gc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZGVjb2RlZCB2YWx1ZS5cbiAgICovXG4gIGRlY29kZVN0cmluZyhpbnB1dDogc3RyaW5nLCB3ZWJTYWZlOiBib29sZWFuKTogc3RyaW5nIHtcbiAgICAvLyBTaG9ydGN1dCBmb3IgTW96aWxsYSBicm93c2VycyB0aGF0IGltcGxlbWVudFxuICAgIC8vIGEgbmF0aXZlIGJhc2U2NCBlbmNvZGVyIGluIHRoZSBmb3JtIG9mIFwiYnRvYS9hdG9iXCJcbiAgICBpZiAodGhpcy5IQVNfTkFUSVZFX1NVUFBPUlQgJiYgIXdlYlNhZmUpIHtcbiAgICAgIHJldHVybiBhdG9iKGlucHV0KTtcbiAgICB9XG4gICAgcmV0dXJuIGJ5dGVBcnJheVRvU3RyaW5nKHRoaXMuZGVjb2RlU3RyaW5nVG9CeXRlQXJyYXkoaW5wdXQsIHdlYlNhZmUpKTtcbiAgfSxcblxuICAvKipcbiAgICogQmFzZTY0LWRlY29kZSBhIHN0cmluZy5cbiAgICpcbiAgICogSW4gYmFzZS02NCBkZWNvZGluZywgZ3JvdXBzIG9mIGZvdXIgY2hhcmFjdGVycyBhcmUgY29udmVydGVkIGludG8gdGhyZWVcbiAgICogYnl0ZXMuICBJZiB0aGUgZW5jb2RlciBkaWQgbm90IGFwcGx5IHBhZGRpbmcsIHRoZSBpbnB1dCBsZW5ndGggbWF5IG5vdFxuICAgKiBiZSBhIG11bHRpcGxlIG9mIDQuXG4gICAqXG4gICAqIEluIHRoaXMgY2FzZSwgdGhlIGxhc3QgZ3JvdXAgd2lsbCBoYXZlIGZld2VyIHRoYW4gNCBjaGFyYWN0ZXJzLCBhbmRcbiAgICogcGFkZGluZyB3aWxsIGJlIGluZmVycmVkLiAgSWYgdGhlIGdyb3VwIGhhcyBvbmUgb3IgdHdvIGNoYXJhY3RlcnMsIGl0IGRlY29kZXNcbiAgICogdG8gb25lIGJ5dGUuICBJZiB0aGUgZ3JvdXAgaGFzIHRocmVlIGNoYXJhY3RlcnMsIGl0IGRlY29kZXMgdG8gdHdvIGJ5dGVzLlxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXQgSW5wdXQgdG8gZGVjb2RlLlxuICAgKiBAcGFyYW0gd2ViU2FmZSBUcnVlIGlmIHdlIHNob3VsZCB1c2UgdGhlIHdlYi1zYWZlIGFscGhhYmV0LlxuICAgKiBAcmV0dXJuIGJ5dGVzIHJlcHJlc2VudGluZyB0aGUgZGVjb2RlZCB2YWx1ZS5cbiAgICovXG4gIGRlY29kZVN0cmluZ1RvQnl0ZUFycmF5KGlucHV0OiBzdHJpbmcsIHdlYlNhZmU6IGJvb2xlYW4pOiBudW1iZXJbXSB7XG4gICAgdGhpcy5pbml0XygpO1xuXG4gICAgY29uc3QgY2hhclRvQnl0ZU1hcCA9IHdlYlNhZmVcbiAgICAgID8gdGhpcy5jaGFyVG9CeXRlTWFwV2ViU2FmZV8hXG4gICAgICA6IHRoaXMuY2hhclRvQnl0ZU1hcF8hO1xuXG4gICAgY29uc3Qgb3V0cHV0OiBudW1iZXJbXSA9IFtdO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7ICkge1xuICAgICAgY29uc3QgYnl0ZTEgPSBjaGFyVG9CeXRlTWFwW2lucHV0LmNoYXJBdChpKyspXTtcblxuICAgICAgY29uc3QgaGF2ZUJ5dGUyID0gaSA8IGlucHV0Lmxlbmd0aDtcbiAgICAgIGNvbnN0IGJ5dGUyID0gaGF2ZUJ5dGUyID8gY2hhclRvQnl0ZU1hcFtpbnB1dC5jaGFyQXQoaSldIDogMDtcbiAgICAgICsraTtcblxuICAgICAgY29uc3QgaGF2ZUJ5dGUzID0gaSA8IGlucHV0Lmxlbmd0aDtcbiAgICAgIGNvbnN0IGJ5dGUzID0gaGF2ZUJ5dGUzID8gY2hhclRvQnl0ZU1hcFtpbnB1dC5jaGFyQXQoaSldIDogNjQ7XG4gICAgICArK2k7XG5cbiAgICAgIGNvbnN0IGhhdmVCeXRlNCA9IGkgPCBpbnB1dC5sZW5ndGg7XG4gICAgICBjb25zdCBieXRlNCA9IGhhdmVCeXRlNCA/IGNoYXJUb0J5dGVNYXBbaW5wdXQuY2hhckF0KGkpXSA6IDY0O1xuICAgICAgKytpO1xuXG4gICAgICBpZiAoYnl0ZTEgPT0gbnVsbCB8fCBieXRlMiA9PSBudWxsIHx8IGJ5dGUzID09IG51bGwgfHwgYnl0ZTQgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRGVjb2RlQmFzZTY0U3RyaW5nRXJyb3IoKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb3V0Qnl0ZTEgPSAoYnl0ZTEgPDwgMikgfCAoYnl0ZTIgPj4gNCk7XG4gICAgICBvdXRwdXQucHVzaChvdXRCeXRlMSk7XG5cbiAgICAgIGlmIChieXRlMyAhPT0gNjQpIHtcbiAgICAgICAgY29uc3Qgb3V0Qnl0ZTIgPSAoKGJ5dGUyIDw8IDQpICYgMHhmMCkgfCAoYnl0ZTMgPj4gMik7XG4gICAgICAgIG91dHB1dC5wdXNoKG91dEJ5dGUyKTtcblxuICAgICAgICBpZiAoYnl0ZTQgIT09IDY0KSB7XG4gICAgICAgICAgY29uc3Qgb3V0Qnl0ZTMgPSAoKGJ5dGUzIDw8IDYpICYgMHhjMCkgfCBieXRlNDtcbiAgICAgICAgICBvdXRwdXQucHVzaChvdXRCeXRlMyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb3V0cHV0O1xuICB9LFxuXG4gIC8qKlxuICAgKiBMYXp5IHN0YXRpYyBpbml0aWFsaXphdGlvbiBmdW5jdGlvbi4gQ2FsbGVkIGJlZm9yZVxuICAgKiBhY2Nlc3NpbmcgYW55IG9mIHRoZSBzdGF0aWMgbWFwIHZhcmlhYmxlcy5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGluaXRfKCkge1xuICAgIGlmICghdGhpcy5ieXRlVG9DaGFyTWFwXykge1xuICAgICAgdGhpcy5ieXRlVG9DaGFyTWFwXyA9IHt9O1xuICAgICAgdGhpcy5jaGFyVG9CeXRlTWFwXyA9IHt9O1xuICAgICAgdGhpcy5ieXRlVG9DaGFyTWFwV2ViU2FmZV8gPSB7fTtcbiAgICAgIHRoaXMuY2hhclRvQnl0ZU1hcFdlYlNhZmVfID0ge307XG5cbiAgICAgIC8vIFdlIHdhbnQgcXVpY2sgbWFwcGluZ3MgYmFjayBhbmQgZm9ydGgsIHNvIHdlIHByZWNvbXB1dGUgdHdvIG1hcHMuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuRU5DT0RFRF9WQUxTLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuYnl0ZVRvQ2hhck1hcF9baV0gPSB0aGlzLkVOQ09ERURfVkFMUy5jaGFyQXQoaSk7XG4gICAgICAgIHRoaXMuY2hhclRvQnl0ZU1hcF9bdGhpcy5ieXRlVG9DaGFyTWFwX1tpXV0gPSBpO1xuICAgICAgICB0aGlzLmJ5dGVUb0NoYXJNYXBXZWJTYWZlX1tpXSA9IHRoaXMuRU5DT0RFRF9WQUxTX1dFQlNBRkUuY2hhckF0KGkpO1xuICAgICAgICB0aGlzLmNoYXJUb0J5dGVNYXBXZWJTYWZlX1t0aGlzLmJ5dGVUb0NoYXJNYXBXZWJTYWZlX1tpXV0gPSBpO1xuXG4gICAgICAgIC8vIEJlIGZvcmdpdmluZyB3aGVuIGRlY29kaW5nIGFuZCBjb3JyZWN0bHkgZGVjb2RlIGJvdGggZW5jb2RpbmdzLlxuICAgICAgICBpZiAoaSA+PSB0aGlzLkVOQ09ERURfVkFMU19CQVNFLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuY2hhclRvQnl0ZU1hcF9bdGhpcy5FTkNPREVEX1ZBTFNfV0VCU0FGRS5jaGFyQXQoaSldID0gaTtcbiAgICAgICAgICB0aGlzLmNoYXJUb0J5dGVNYXBXZWJTYWZlX1t0aGlzLkVOQ09ERURfVkFMUy5jaGFyQXQoaSldID0gaTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBBbiBlcnJvciBlbmNvdW50ZXJlZCB3aGlsZSBkZWNvZGluZyBiYXNlNjQgc3RyaW5nLlxuICovXG5leHBvcnQgY2xhc3MgRGVjb2RlQmFzZTY0U3RyaW5nRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IG5hbWUgPSAnRGVjb2RlQmFzZTY0U3RyaW5nRXJyb3InO1xufVxuXG4vKipcbiAqIFVSTC1zYWZlIGJhc2U2NCBlbmNvZGluZ1xuICovXG5leHBvcnQgY29uc3QgYmFzZTY0RW5jb2RlID0gZnVuY3Rpb24gKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdXRmOEJ5dGVzID0gc3RyaW5nVG9CeXRlQXJyYXkoc3RyKTtcbiAgcmV0dXJuIGJhc2U2NC5lbmNvZGVCeXRlQXJyYXkodXRmOEJ5dGVzLCB0cnVlKTtcbn07XG5cbi8qKlxuICogVVJMLXNhZmUgYmFzZTY0IGVuY29kaW5nICh3aXRob3V0IFwiLlwiIHBhZGRpbmcgaW4gdGhlIGVuZCkuXG4gKiBlLmcuIFVzZWQgaW4gSlNPTiBXZWIgVG9rZW4gKEpXVCkgcGFydHMuXG4gKi9cbmV4cG9ydCBjb25zdCBiYXNlNjR1cmxFbmNvZGVXaXRob3V0UGFkZGluZyA9IGZ1bmN0aW9uIChzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIFVzZSBiYXNlNjR1cmwgZW5jb2RpbmcgYW5kIHJlbW92ZSBwYWRkaW5nIGluIHRoZSBlbmQgKGRvdCBjaGFyYWN0ZXJzKS5cbiAgcmV0dXJuIGJhc2U2NEVuY29kZShzdHIpLnJlcGxhY2UoL1xcLi9nLCAnJyk7XG59O1xuXG4vKipcbiAqIFVSTC1zYWZlIGJhc2U2NCBkZWNvZGluZ1xuICpcbiAqIE5PVEU6IERPIE5PVCB1c2UgdGhlIGdsb2JhbCBhdG9iKCkgZnVuY3Rpb24gLSBpdCBkb2VzIE5PVCBzdXBwb3J0IHRoZVxuICogYmFzZTY0VXJsIHZhcmlhbnQgZW5jb2RpbmcuXG4gKlxuICogQHBhcmFtIHN0ciBUbyBiZSBkZWNvZGVkXG4gKiBAcmV0dXJuIERlY29kZWQgcmVzdWx0LCBpZiBwb3NzaWJsZVxuICovXG5leHBvcnQgY29uc3QgYmFzZTY0RGVjb2RlID0gZnVuY3Rpb24gKHN0cjogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGJhc2U2NC5kZWNvZGVTdHJpbmcoc3RyLCB0cnVlKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ2Jhc2U2NERlY29kZSBmYWlsZWQ6ICcsIGUpO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vKipcbiAqIERvIGEgZGVlcC1jb3B5IG9mIGJhc2ljIEphdmFTY3JpcHQgT2JqZWN0cyBvciBBcnJheXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWVwQ29weTxUPih2YWx1ZTogVCk6IFQge1xuICByZXR1cm4gZGVlcEV4dGVuZCh1bmRlZmluZWQsIHZhbHVlKSBhcyBUO1xufVxuXG4vKipcbiAqIENvcHkgcHJvcGVydGllcyBmcm9tIHNvdXJjZSB0byB0YXJnZXQgKHJlY3Vyc2l2ZWx5IGFsbG93cyBleHRlbnNpb25cbiAqIG9mIE9iamVjdHMgYW5kIEFycmF5cykuICBTY2FsYXIgdmFsdWVzIGluIHRoZSB0YXJnZXQgYXJlIG92ZXItd3JpdHRlbi5cbiAqIElmIHRhcmdldCBpcyB1bmRlZmluZWQsIGFuIG9iamVjdCBvZiB0aGUgYXBwcm9wcmlhdGUgdHlwZSB3aWxsIGJlIGNyZWF0ZWRcbiAqIChhbmQgcmV0dXJuZWQpLlxuICpcbiAqIFdlIHJlY3Vyc2l2ZWx5IGNvcHkgYWxsIGNoaWxkIHByb3BlcnRpZXMgb2YgcGxhaW4gT2JqZWN0cyBpbiB0aGUgc291cmNlLSBzb1xuICogdGhhdCBuYW1lc3BhY2UtIGxpa2UgZGljdGlvbmFyaWVzIGFyZSBtZXJnZWQuXG4gKlxuICogTm90ZSB0aGF0IHRoZSB0YXJnZXQgY2FuIGJlIGEgZnVuY3Rpb24sIGluIHdoaWNoIGNhc2UgdGhlIHByb3BlcnRpZXMgaW5cbiAqIHRoZSBzb3VyY2UgT2JqZWN0IGFyZSBjb3BpZWQgb250byBpdCBhcyBzdGF0aWMgcHJvcGVydGllcyBvZiB0aGUgRnVuY3Rpb24uXG4gKlxuICogTm90ZTogd2UgZG9uJ3QgbWVyZ2UgX19wcm90b19fIHRvIHByZXZlbnQgcHJvdG90eXBlIHBvbGx1dGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVlcEV4dGVuZCh0YXJnZXQ6IHVua25vd24sIHNvdXJjZTogdW5rbm93bik6IHVua25vd24ge1xuICBpZiAoIShzb3VyY2UgaW5zdGFuY2VvZiBPYmplY3QpKSB7XG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfVxuXG4gIHN3aXRjaCAoc291cmNlLmNvbnN0cnVjdG9yKSB7XG4gICAgY2FzZSBEYXRlOlxuICAgICAgLy8gVHJlYXQgRGF0ZXMgbGlrZSBzY2FsYXJzOyBpZiB0aGUgdGFyZ2V0IGRhdGUgb2JqZWN0IGhhZCBhbnkgY2hpbGRcbiAgICAgIC8vIHByb3BlcnRpZXMgLSB0aGV5IHdpbGwgYmUgbG9zdCFcbiAgICAgIGNvbnN0IGRhdGVWYWx1ZSA9IHNvdXJjZSBhcyBEYXRlO1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKGRhdGVWYWx1ZS5nZXRUaW1lKCkpO1xuXG4gICAgY2FzZSBPYmplY3Q6XG4gICAgICBpZiAodGFyZ2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGFyZ2V0ID0ge307XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIEFycmF5OlxuICAgICAgLy8gQWx3YXlzIGNvcHkgdGhlIGFycmF5IHNvdXJjZSBhbmQgb3ZlcndyaXRlIHRoZSB0YXJnZXQuXG4gICAgICB0YXJnZXQgPSBbXTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIE5vdCBhIHBsYWluIE9iamVjdCAtIHRyZWF0IGl0IGFzIGEgc2NhbGFyLlxuICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcHJvcCBpbiBzb3VyY2UpIHtcbiAgICAvLyB1c2UgaXNWYWxpZEtleSB0byBndWFyZCBhZ2FpbnN0IHByb3RvdHlwZSBwb2xsdXRpb24uIFNlZSBodHRwczovL3NueWsuaW8vdnVsbi9TTllLLUpTLUxPREFTSC00NTAyMDJcbiAgICBpZiAoIXNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSB8fCAhaXNWYWxpZEtleShwcm9wKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgICh0YXJnZXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW3Byb3BdID0gZGVlcEV4dGVuZChcbiAgICAgICh0YXJnZXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW3Byb3BdLFxuICAgICAgKHNvdXJjZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbcHJvcF1cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZEtleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4ga2V5ICE9PSAnX19wcm90b19fJztcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vKipcbiAqIFBvbHlmaWxsIGZvciBgZ2xvYmFsVGhpc2Agb2JqZWN0LlxuICogQHJldHVybnMgdGhlIGBnbG9iYWxUaGlzYCBvYmplY3QgZm9yIHRoZSBnaXZlbiBlbnZpcm9ubWVudC5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEdsb2JhbCgpOiB0eXBlb2YgZ2xvYmFsVGhpcyB7XG4gIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gc2VsZjtcbiAgfVxuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gd2luZG93O1xuICB9XG4gIGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBnbG9iYWw7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gbG9jYXRlIGdsb2JhbCBvYmplY3QuJyk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgYmFzZTY0RGVjb2RlIH0gZnJvbSAnLi9jcnlwdCc7XG5pbXBvcnQgeyBnZXRHbG9iYWwgfSBmcm9tICcuL2dsb2JhbCc7XG5cbi8qKlxuICogS2V5cyBmb3IgZXhwZXJpbWVudGFsIHByb3BlcnRpZXMgb24gdGhlIGBGaXJlYmFzZURlZmF1bHRzYCBvYmplY3QuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB0eXBlIEV4cGVyaW1lbnRhbEtleSA9ICdhdXRoVG9rZW5TeW5jVVJMJyB8ICdhdXRoSWRUb2tlbk1heEFnZSc7XG5cbi8qKlxuICogQW4gb2JqZWN0IHRoYXQgY2FuIGJlIGluamVjdGVkIGludG8gdGhlIGVudmlyb25tZW50IGFzIF9fRklSRUJBU0VfREVGQVVMVFNfXyxcbiAqIGVpdGhlciBhcyBhIHByb3BlcnR5IG9mIGdsb2JhbFRoaXMsIGEgc2hlbGwgZW52aXJvbm1lbnQgdmFyaWFibGUsIG9yIGFcbiAqIGNvb2tpZS5cbiAqXG4gKiBUaGlzIG9iamVjdCBjYW4gYmUgdXNlZCB0byBhdXRvbWF0aWNhbGx5IGNvbmZpZ3VyZSBhbmQgaW5pdGlhbGl6ZVxuICogYSBGaXJlYmFzZSBhcHAgYXMgd2VsbCBhcyBhbnkgZW11bGF0b3JzLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaXJlYmFzZURlZmF1bHRzIHtcbiAgY29uZmlnPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgZW11bGF0b3JIb3N0cz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIF9hdXRoVG9rZW5TeW5jVVJMPzogc3RyaW5nO1xuICBfYXV0aElkVG9rZW5NYXhBZ2U/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBPdmVycmlkZSBGaXJlYmFzZSdzIHJ1bnRpbWUgZW52aXJvbm1lbnQgZGV0ZWN0aW9uIGFuZFxuICAgKiBmb3JjZSB0aGUgU0RLIHRvIGFjdCBhcyBpZiBpdCB3ZXJlIGluIHRoZSBzcGVjaWZpZWQgZW52aXJvbm1lbnQuXG4gICAqL1xuICBmb3JjZUVudmlyb25tZW50PzogJ2Jyb3dzZXInIHwgJ25vZGUnO1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIC8vIE5lZWQgYHZhcmAgZm9yIHRoaXMgdG8gd29yay5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXZhclxuICB2YXIgX19GSVJFQkFTRV9ERUZBVUxUU19fOiBGaXJlYmFzZURlZmF1bHRzIHwgdW5kZWZpbmVkO1xufVxuXG5jb25zdCBnZXREZWZhdWx0c0Zyb21HbG9iYWwgPSAoKTogRmlyZWJhc2VEZWZhdWx0cyB8IHVuZGVmaW5lZCA9PlxuICBnZXRHbG9iYWwoKS5fX0ZJUkVCQVNFX0RFRkFVTFRTX187XG5cbi8qKlxuICogQXR0ZW1wdCB0byByZWFkIGRlZmF1bHRzIGZyb20gYSBKU09OIHN0cmluZyBwcm92aWRlZCB0b1xuICogcHJvY2VzcyguKWVudiguKV9fRklSRUJBU0VfREVGQVVMVFNfXyBvciBhIEpTT04gZmlsZSB3aG9zZSBwYXRoIGlzIGluXG4gKiBwcm9jZXNzKC4pZW52KC4pX19GSVJFQkFTRV9ERUZBVUxUU19QQVRIX19cbiAqIFRoZSBkb3RzIGFyZSBpbiBwYXJlbnMgYmVjYXVzZSBjZXJ0YWluIGNvbXBpbGVycyAoVml0ZT8pIGNhbm5vdFxuICogaGFuZGxlIHNlZWluZyB0aGF0IHZhcmlhYmxlIGluIGNvbW1lbnRzLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9maXJlYmFzZS9maXJlYmFzZS1qcy1zZGsvaXNzdWVzLzY4MzhcbiAqL1xuY29uc3QgZ2V0RGVmYXVsdHNGcm9tRW52VmFyaWFibGUgPSAoKTogRmlyZWJhc2VEZWZhdWx0cyB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICh0eXBlb2YgcHJvY2VzcyA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIHByb2Nlc3MuZW52ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBkZWZhdWx0c0pzb25TdHJpbmcgPSBwcm9jZXNzLmVudi5fX0ZJUkVCQVNFX0RFRkFVTFRTX187XG4gIGlmIChkZWZhdWx0c0pzb25TdHJpbmcpIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShkZWZhdWx0c0pzb25TdHJpbmcpO1xuICB9XG59O1xuXG5jb25zdCBnZXREZWZhdWx0c0Zyb21Db29raWUgPSAoKTogRmlyZWJhc2VEZWZhdWx0cyB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxldCBtYXRjaDtcbiAgdHJ5IHtcbiAgICBtYXRjaCA9IGRvY3VtZW50LmNvb2tpZS5tYXRjaCgvX19GSVJFQkFTRV9ERUZBVUxUU19fPShbXjtdKykvKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIFNvbWUgZW52aXJvbm1lbnRzIHN1Y2ggYXMgQW5ndWxhciBVbml2ZXJzYWwgU1NSIGhhdmUgYVxuICAgIC8vIGBkb2N1bWVudGAgb2JqZWN0IGJ1dCBlcnJvciBvbiBhY2Nlc3NpbmcgYGRvY3VtZW50LmNvb2tpZWAuXG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGRlY29kZWQgPSBtYXRjaCAmJiBiYXNlNjREZWNvZGUobWF0Y2hbMV0pO1xuICByZXR1cm4gZGVjb2RlZCAmJiBKU09OLnBhcnNlKGRlY29kZWQpO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIF9fRklSRUJBU0VfREVGQVVMVFNfXyBvYmplY3QuIEl0IGNoZWNrcyBpbiBvcmRlcjpcbiAqICgxKSBpZiBzdWNoIGFuIG9iamVjdCBleGlzdHMgYXMgYSBwcm9wZXJ0eSBvZiBgZ2xvYmFsVGhpc2BcbiAqICgyKSBpZiBzdWNoIGFuIG9iamVjdCB3YXMgcHJvdmlkZWQgb24gYSBzaGVsbCBlbnZpcm9ubWVudCB2YXJpYWJsZVxuICogKDMpIGlmIHN1Y2ggYW4gb2JqZWN0IGV4aXN0cyBpbiBhIGNvb2tpZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgZ2V0RGVmYXVsdHMgPSAoKTogRmlyZWJhc2VEZWZhdWx0cyB8IHVuZGVmaW5lZCA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGdldERlZmF1bHRzRnJvbUdsb2JhbCgpIHx8XG4gICAgICBnZXREZWZhdWx0c0Zyb21FbnZWYXJpYWJsZSgpIHx8XG4gICAgICBnZXREZWZhdWx0c0Zyb21Db29raWUoKVxuICAgICk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvKipcbiAgICAgKiBDYXRjaC1hbGwgZm9yIGJlaW5nIHVuYWJsZSB0byBnZXQgX19GSVJFQkFTRV9ERUZBVUxUU19fIGR1ZVxuICAgICAqIHRvIGFueSBlbnZpcm9ubWVudCBjYXNlIHdlIGhhdmUgbm90IGFjY291bnRlZCBmb3IuIExvZyB0b1xuICAgICAqIGluZm8gaW5zdGVhZCBvZiBzd2FsbG93aW5nIHNvIHdlIGNhbiBmaW5kIHRoZXNlIHVua25vd24gY2FzZXNcbiAgICAgKiBhbmQgYWRkIHBhdGhzIGZvciB0aGVtIGlmIG5lZWRlZC5cbiAgICAgKi9cbiAgICBjb25zb2xlLmluZm8oYFVuYWJsZSB0byBnZXQgX19GSVJFQkFTRV9ERUZBVUxUU19fIGR1ZSB0bzogJHtlfWApO1xuICAgIHJldHVybjtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXR1cm5zIGVtdWxhdG9yIGhvc3Qgc3RvcmVkIGluIHRoZSBfX0ZJUkVCQVNFX0RFRkFVTFRTX18gb2JqZWN0XG4gKiBmb3IgdGhlIGdpdmVuIHByb2R1Y3QuXG4gKiBAcmV0dXJucyBhIFVSTCBob3N0IGZvcm1hdHRlZCBsaWtlIGAxMjcuMC4wLjE6OTk5OWAgb3IgYFs6OjFdOjQwMDBgIGlmIGF2YWlsYWJsZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgZ2V0RGVmYXVsdEVtdWxhdG9ySG9zdCA9IChcbiAgcHJvZHVjdE5hbWU6IHN0cmluZ1xuKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IGdldERlZmF1bHRzKCk/LmVtdWxhdG9ySG9zdHM/Lltwcm9kdWN0TmFtZV07XG5cbi8qKlxuICogUmV0dXJucyBlbXVsYXRvciBob3N0bmFtZSBhbmQgcG9ydCBzdG9yZWQgaW4gdGhlIF9fRklSRUJBU0VfREVGQVVMVFNfXyBvYmplY3RcbiAqIGZvciB0aGUgZ2l2ZW4gcHJvZHVjdC5cbiAqIEByZXR1cm5zIGEgcGFpciBvZiBob3N0bmFtZSBhbmQgcG9ydCBsaWtlIGBbXCI6OjFcIiwgNDAwMF1gIGlmIGF2YWlsYWJsZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgZ2V0RGVmYXVsdEVtdWxhdG9ySG9zdG5hbWVBbmRQb3J0ID0gKFxuICBwcm9kdWN0TmFtZTogc3RyaW5nXG4pOiBbaG9zdG5hbWU6IHN0cmluZywgcG9ydDogbnVtYmVyXSB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IGhvc3QgPSBnZXREZWZhdWx0RW11bGF0b3JIb3N0KHByb2R1Y3ROYW1lKTtcbiAgaWYgKCFob3N0KSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBzZXBhcmF0b3JJbmRleCA9IGhvc3QubGFzdEluZGV4T2YoJzonKTsgLy8gRmluZGluZyB0aGUgbGFzdCBzaW5jZSBJUHY2IGFkZHIgYWxzbyBoYXMgY29sb25zLlxuICBpZiAoc2VwYXJhdG9ySW5kZXggPD0gMCB8fCBzZXBhcmF0b3JJbmRleCArIDEgPT09IGhvc3QubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGhvc3QgJHtob3N0fSB3aXRoIG5vIHNlcGFyYXRlIGhvc3RuYW1lIGFuZCBwb3J0IWApO1xuICB9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHNcbiAgY29uc3QgcG9ydCA9IHBhcnNlSW50KGhvc3Quc3Vic3RyaW5nKHNlcGFyYXRvckluZGV4ICsgMSksIDEwKTtcbiAgaWYgKGhvc3RbMF0gPT09ICdbJykge1xuICAgIC8vIEJyYWNrZXQtcXVvdGVkIGBbaXB2NmFkZHJdOnBvcnRgID0+IHJldHVybiBcImlwdjZhZGRyXCIgKHdpdGhvdXQgYnJhY2tldHMpLlxuICAgIHJldHVybiBbaG9zdC5zdWJzdHJpbmcoMSwgc2VwYXJhdG9ySW5kZXggLSAxKSwgcG9ydF07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFtob3N0LnN1YnN0cmluZygwLCBzZXBhcmF0b3JJbmRleCksIHBvcnRdO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHVybnMgRmlyZWJhc2UgYXBwIGNvbmZpZyBzdG9yZWQgaW4gdGhlIF9fRklSRUJBU0VfREVGQVVMVFNfXyBvYmplY3QuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBnZXREZWZhdWx0QXBwQ29uZmlnID0gKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQgPT5cbiAgZ2V0RGVmYXVsdHMoKT8uY29uZmlnO1xuXG4vKipcbiAqIFJldHVybnMgYW4gZXhwZXJpbWVudGFsIHNldHRpbmcgb24gdGhlIF9fRklSRUJBU0VfREVGQVVMVFNfXyBvYmplY3QgKHByb3BlcnRpZXNcbiAqIHByZWZpeGVkIGJ5IFwiX1wiKVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgZ2V0RXhwZXJpbWVudGFsU2V0dGluZyA9IDxUIGV4dGVuZHMgRXhwZXJpbWVudGFsS2V5PihcbiAgbmFtZTogVFxuKTogRmlyZWJhc2VEZWZhdWx0c1tgXyR7VH1gXSA9PlxuICBnZXREZWZhdWx0cygpPy5bYF8ke25hbWV9YF0gYXMgRmlyZWJhc2VEZWZhdWx0c1tgXyR7VH1gXTtcbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5leHBvcnQgY2xhc3MgRGVmZXJyZWQ8Uj4ge1xuICBwcm9taXNlOiBQcm9taXNlPFI+O1xuICByZWplY3Q6ICh2YWx1ZT86IHVua25vd24pID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgcmVzb2x2ZTogKHZhbHVlPzogdW5rbm93bikgPT4gdm9pZCA9ICgpID0+IHt9O1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnJlc29sdmUgPSByZXNvbHZlIGFzICh2YWx1ZT86IHVua25vd24pID0+IHZvaWQ7XG4gICAgICB0aGlzLnJlamVjdCA9IHJlamVjdCBhcyAodmFsdWU/OiB1bmtub3duKSA9PiB2b2lkO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE91ciBBUEkgaW50ZXJuYWxzIGFyZSBub3QgcHJvbWlzZWlmaWVkIGFuZCBjYW5ub3QgYmVjYXVzZSBvdXIgY2FsbGJhY2sgQVBJcyBoYXZlIHN1YnRsZSBleHBlY3RhdGlvbnMgYXJvdW5kXG4gICAqIGludm9raW5nIHByb21pc2VzIGlubGluZSwgd2hpY2ggUHJvbWlzZXMgYXJlIGZvcmJpZGRlbiB0byBkby4gVGhpcyBtZXRob2QgYWNjZXB0cyBhbiBvcHRpb25hbCBub2RlLXN0eWxlIGNhbGxiYWNrXG4gICAqIGFuZCByZXR1cm5zIGEgbm9kZS1zdHlsZSBjYWxsYmFjayB3aGljaCB3aWxsIHJlc29sdmUgb3IgcmVqZWN0IHRoZSBEZWZlcnJlZCdzIHByb21pc2UuXG4gICAqL1xuICB3cmFwQ2FsbGJhY2soXG4gICAgY2FsbGJhY2s/OiAoZXJyb3I/OiB1bmtub3duLCB2YWx1ZT86IHVua25vd24pID0+IHZvaWRcbiAgKTogKGVycm9yOiB1bmtub3duLCB2YWx1ZT86IHVua25vd24pID0+IHZvaWQge1xuICAgIHJldHVybiAoZXJyb3IsIHZhbHVlPykgPT4ge1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHRoaXMucmVqZWN0KGVycm9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVzb2x2ZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIEF0dGFjaGluZyBub29wIGhhbmRsZXIganVzdCBpbiBjYXNlIGRldmVsb3BlciB3YXNuJ3QgZXhwZWN0aW5nXG4gICAgICAgIC8vIHByb21pc2VzXG4gICAgICAgIHRoaXMucHJvbWlzZS5jYXRjaCgoKSA9PiB7fSk7XG5cbiAgICAgICAgLy8gU29tZSBvZiBvdXIgY2FsbGJhY2tzIGRvbid0IGV4cGVjdCBhIHZhbHVlIGFuZCBvdXIgb3duIHRlc3RzXG4gICAgICAgIC8vIGFzc2VydCB0aGF0IHRoZSBwYXJhbWV0ZXIgbGVuZ3RoIGlzIDFcbiAgICAgICAgaWYgKGNhbGxiYWNrLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIGNhbGxiYWNrKGVycm9yKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYWxsYmFjayhlcnJvciwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IGJhc2U2NHVybEVuY29kZVdpdGhvdXRQYWRkaW5nIH0gZnJvbSAnLi9jcnlwdCc7XG5cbi8vIEZpcmViYXNlIEF1dGggdG9rZW5zIGNvbnRhaW4gc25ha2VfY2FzZSBjbGFpbXMgZm9sbG93aW5nIHRoZSBKV1Qgc3RhbmRhcmQgLyBjb252ZW50aW9uLlxuLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG5cbmV4cG9ydCB0eXBlIEZpcmViYXNlU2lnbkluUHJvdmlkZXIgPVxuICB8ICdjdXN0b20nXG4gIHwgJ2VtYWlsJ1xuICB8ICdwYXNzd29yZCdcbiAgfCAncGhvbmUnXG4gIHwgJ2Fub255bW91cydcbiAgfCAnZ29vZ2xlLmNvbSdcbiAgfCAnZmFjZWJvb2suY29tJ1xuICB8ICdnaXRodWIuY29tJ1xuICB8ICd0d2l0dGVyLmNvbSdcbiAgfCAnbWljcm9zb2Z0LmNvbSdcbiAgfCAnYXBwbGUuY29tJztcblxuaW50ZXJmYWNlIEZpcmViYXNlSWRUb2tlbiB7XG4gIC8vIEFsd2F5cyBzZXQgdG8gaHR0cHM6Ly9zZWN1cmV0b2tlbi5nb29nbGUuY29tL1BST0pFQ1RfSURcbiAgaXNzOiBzdHJpbmc7XG5cbiAgLy8gQWx3YXlzIHNldCB0byBQUk9KRUNUX0lEXG4gIGF1ZDogc3RyaW5nO1xuXG4gIC8vIFRoZSB1c2VyJ3MgdW5pcXVlIElEXG4gIHN1Yjogc3RyaW5nO1xuXG4gIC8vIFRoZSB0b2tlbiBpc3N1ZSB0aW1lLCBpbiBzZWNvbmRzIHNpbmNlIGVwb2NoXG4gIGlhdDogbnVtYmVyO1xuXG4gIC8vIFRoZSB0b2tlbiBleHBpcnkgdGltZSwgbm9ybWFsbHkgJ2lhdCcgKyAzNjAwXG4gIGV4cDogbnVtYmVyO1xuXG4gIC8vIFRoZSB1c2VyJ3MgdW5pcXVlIElELiBNdXN0IGJlIGVxdWFsIHRvICdzdWInXG4gIHVzZXJfaWQ6IHN0cmluZztcblxuICAvLyBUaGUgdGltZSB0aGUgdXNlciBhdXRoZW50aWNhdGVkLCBub3JtYWxseSAnaWF0J1xuICBhdXRoX3RpbWU6IG51bWJlcjtcblxuICAvLyBUaGUgc2lnbiBpbiBwcm92aWRlciwgb25seSBzZXQgd2hlbiB0aGUgcHJvdmlkZXIgaXMgJ2Fub255bW91cydcbiAgcHJvdmlkZXJfaWQ/OiAnYW5vbnltb3VzJztcblxuICAvLyBUaGUgdXNlcidzIHByaW1hcnkgZW1haWxcbiAgZW1haWw/OiBzdHJpbmc7XG5cbiAgLy8gVGhlIHVzZXIncyBlbWFpbCB2ZXJpZmljYXRpb24gc3RhdHVzXG4gIGVtYWlsX3ZlcmlmaWVkPzogYm9vbGVhbjtcblxuICAvLyBUaGUgdXNlcidzIHByaW1hcnkgcGhvbmUgbnVtYmVyXG4gIHBob25lX251bWJlcj86IHN0cmluZztcblxuICAvLyBUaGUgdXNlcidzIGRpc3BsYXkgbmFtZVxuICBuYW1lPzogc3RyaW5nO1xuXG4gIC8vIFRoZSB1c2VyJ3MgcHJvZmlsZSBwaG90byBVUkxcbiAgcGljdHVyZT86IHN0cmluZztcblxuICAvLyBJbmZvcm1hdGlvbiBvbiBhbGwgaWRlbnRpdGllcyBsaW5rZWQgdG8gdGhpcyB1c2VyXG4gIGZpcmViYXNlOiB7XG4gICAgLy8gVGhlIHByaW1hcnkgc2lnbi1pbiBwcm92aWRlclxuICAgIHNpZ25faW5fcHJvdmlkZXI6IEZpcmViYXNlU2lnbkluUHJvdmlkZXI7XG5cbiAgICAvLyBBIG1hcCBvZiBwcm92aWRlcnMgdG8gdGhlIHVzZXIncyBsaXN0IG9mIHVuaXF1ZSBpZGVudGlmaWVycyBmcm9tXG4gICAgLy8gZWFjaCBwcm92aWRlclxuICAgIGlkZW50aXRpZXM/OiB7IFtwcm92aWRlciBpbiBGaXJlYmFzZVNpZ25JblByb3ZpZGVyXT86IHN0cmluZ1tdIH07XG4gIH07XG5cbiAgLy8gQ3VzdG9tIGNsYWltcyBzZXQgYnkgdGhlIGRldmVsb3BlclxuICBbY2xhaW06IHN0cmluZ106IHVua25vd247XG5cbiAgdWlkPzogbmV2ZXI7IC8vIFRyeSB0byBjYXRjaCBhIGNvbW1vbiBtaXN0YWtlIG9mIFwidWlkXCIgKHNob3VsZCBiZSBcInN1YlwiIGluc3RlYWQpLlxufVxuXG5leHBvcnQgdHlwZSBFbXVsYXRvck1vY2tUb2tlbk9wdGlvbnMgPSAoeyB1c2VyX2lkOiBzdHJpbmcgfSB8IHsgc3ViOiBzdHJpbmcgfSkgJlxuICBQYXJ0aWFsPEZpcmViYXNlSWRUb2tlbj47XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNb2NrVXNlclRva2VuKFxuICB0b2tlbjogRW11bGF0b3JNb2NrVG9rZW5PcHRpb25zLFxuICBwcm9qZWN0SWQ/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGlmICh0b2tlbi51aWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnVGhlIFwidWlkXCIgZmllbGQgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCBieSBtb2NrVXNlclRva2VuLiBQbGVhc2UgdXNlIFwic3ViXCIgaW5zdGVhZCBmb3IgRmlyZWJhc2UgQXV0aCBVc2VyIElELidcbiAgICApO1xuICB9XG4gIC8vIFVuc2VjdXJlZCBKV1RzIHVzZSBcIm5vbmVcIiBhcyB0aGUgYWxnb3JpdGhtLlxuICBjb25zdCBoZWFkZXIgPSB7XG4gICAgYWxnOiAnbm9uZScsXG4gICAgdHlwZTogJ0pXVCdcbiAgfTtcblxuICBjb25zdCBwcm9qZWN0ID0gcHJvamVjdElkIHx8ICdkZW1vLXByb2plY3QnO1xuICBjb25zdCBpYXQgPSB0b2tlbi5pYXQgfHwgMDtcbiAgY29uc3Qgc3ViID0gdG9rZW4uc3ViIHx8IHRva2VuLnVzZXJfaWQ7XG4gIGlmICghc3ViKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwibW9ja1VzZXJUb2tlbiBtdXN0IGNvbnRhaW4gJ3N1Yicgb3IgJ3VzZXJfaWQnIGZpZWxkIVwiKTtcbiAgfVxuXG4gIGNvbnN0IHBheWxvYWQ6IEZpcmViYXNlSWRUb2tlbiA9IHtcbiAgICAvLyBTZXQgYWxsIHJlcXVpcmVkIGZpZWxkcyB0byBkZWNlbnQgZGVmYXVsdHNcbiAgICBpc3M6IGBodHRwczovL3NlY3VyZXRva2VuLmdvb2dsZS5jb20vJHtwcm9qZWN0fWAsXG4gICAgYXVkOiBwcm9qZWN0LFxuICAgIGlhdCxcbiAgICBleHA6IGlhdCArIDM2MDAsXG4gICAgYXV0aF90aW1lOiBpYXQsXG4gICAgc3ViLFxuICAgIHVzZXJfaWQ6IHN1YixcbiAgICBmaXJlYmFzZToge1xuICAgICAgc2lnbl9pbl9wcm92aWRlcjogJ2N1c3RvbScsXG4gICAgICBpZGVudGl0aWVzOiB7fVxuICAgIH0sXG5cbiAgICAvLyBPdmVycmlkZSB3aXRoIHVzZXIgb3B0aW9uc1xuICAgIC4uLnRva2VuXG4gIH07XG5cbiAgLy8gVW5zZWN1cmVkIEpXVHMgdXNlIHRoZSBlbXB0eSBzdHJpbmcgYXMgYSBzaWduYXR1cmUuXG4gIGNvbnN0IHNpZ25hdHVyZSA9ICcnO1xuICByZXR1cm4gW1xuICAgIGJhc2U2NHVybEVuY29kZVdpdGhvdXRQYWRkaW5nKEpTT04uc3RyaW5naWZ5KGhlYWRlcikpLFxuICAgIGJhc2U2NHVybEVuY29kZVdpdGhvdXRQYWRkaW5nKEpTT04uc3RyaW5naWZ5KHBheWxvYWQpKSxcbiAgICBzaWduYXR1cmVcbiAgXS5qb2luKCcuJyk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgQ09OU1RBTlRTIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdHMgfSBmcm9tICcuL2RlZmF1bHRzJztcblxuLyoqXG4gKiBSZXR1cm5zIG5hdmlnYXRvci51c2VyQWdlbnQgc3RyaW5nIG9yICcnIGlmIGl0J3Mgbm90IGRlZmluZWQuXG4gKiBAcmV0dXJuIHVzZXIgYWdlbnQgc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRVQSgpOiBzdHJpbmcge1xuICBpZiAoXG4gICAgdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICB0eXBlb2YgbmF2aWdhdG9yWyd1c2VyQWdlbnQnXSA9PT0gJ3N0cmluZydcbiAgKSB7XG4gICAgcmV0dXJuIG5hdmlnYXRvclsndXNlckFnZW50J107XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG59XG5cbi8qKlxuICogRGV0ZWN0IENvcmRvdmEgLyBQaG9uZUdhcCAvIElvbmljIGZyYW1ld29ya3Mgb24gYSBtb2JpbGUgZGV2aWNlLlxuICpcbiAqIERlbGliZXJhdGVseSBkb2VzIG5vdCByZWx5IG9uIGNoZWNraW5nIGBmaWxlOi8vYCBVUkxzIChhcyB0aGlzIGZhaWxzIFBob25lR2FwXG4gKiBpbiB0aGUgUmlwcGxlIGVtdWxhdG9yKSBub3IgQ29yZG92YSBgb25EZXZpY2VSZWFkeWAsIHdoaWNoIHdvdWxkIG5vcm1hbGx5XG4gKiB3YWl0IGZvciBhIGNhbGxiYWNrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNNb2JpbGVDb3Jkb3ZhKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmXG4gICAgLy8gQHRzLWlnbm9yZSBTZXR0aW5nIHVwIGFuIGJyb2FkbHkgYXBwbGljYWJsZSBpbmRleCBzaWduYXR1cmUgZm9yIFdpbmRvd1xuICAgIC8vIGp1c3QgdG8gZGVhbCB3aXRoIHRoaXMgY2FzZSB3b3VsZCBwcm9iYWJseSBiZSBhIGJhZCBpZGVhLlxuICAgICEhKHdpbmRvd1snY29yZG92YSddIHx8IHdpbmRvd1sncGhvbmVnYXAnXSB8fCB3aW5kb3dbJ1Bob25lR2FwJ10pICYmXG4gICAgL2lvc3xpcGhvbmV8aXBvZHxpcGFkfGFuZHJvaWR8YmxhY2tiZXJyeXxpZW1vYmlsZS9pLnRlc3QoZ2V0VUEoKSlcbiAgKTtcbn1cblxuLyoqXG4gKiBEZXRlY3QgTm9kZS5qcy5cbiAqXG4gKiBAcmV0dXJuIHRydWUgaWYgTm9kZS5qcyBlbnZpcm9ubWVudCBpcyBkZXRlY3RlZCBvciBzcGVjaWZpZWQuXG4gKi9cbi8vIE5vZGUgZGV0ZWN0aW9uIGxvZ2ljIGZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9pbGlha2FuL2RldGVjdC1ub2RlL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTm9kZSgpOiBib29sZWFuIHtcbiAgY29uc3QgZm9yY2VFbnZpcm9ubWVudCA9IGdldERlZmF1bHRzKCk/LmZvcmNlRW52aXJvbm1lbnQ7XG4gIGlmIChmb3JjZUVudmlyb25tZW50ID09PSAnbm9kZScpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIGlmIChmb3JjZUVudmlyb25tZW50ID09PSAnYnJvd3NlcicpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiAoXG4gICAgICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZ2xvYmFsLnByb2Nlc3MpID09PSAnW29iamVjdCBwcm9jZXNzXSdcbiAgICApO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogRGV0ZWN0IEJyb3dzZXIgRW52aXJvbm1lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQnJvd3NlcigpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBzZWxmID09PSAnb2JqZWN0JyAmJiBzZWxmLnNlbGYgPT09IHNlbGY7XG59XG5cbi8qKlxuICogRGV0ZWN0IGJyb3dzZXIgZXh0ZW5zaW9ucyAoQ2hyb21lIGFuZCBGaXJlZm94IGF0IGxlYXN0KS5cbiAqL1xuaW50ZXJmYWNlIEJyb3dzZXJSdW50aW1lIHtcbiAgaWQ/OiB1bmtub3duO1xufVxuZGVjbGFyZSBjb25zdCBjaHJvbWU6IHsgcnVudGltZT86IEJyb3dzZXJSdW50aW1lIH07XG5kZWNsYXJlIGNvbnN0IGJyb3dzZXI6IHsgcnVudGltZT86IEJyb3dzZXJSdW50aW1lIH07XG5leHBvcnQgZnVuY3Rpb24gaXNCcm93c2VyRXh0ZW5zaW9uKCk6IGJvb2xlYW4ge1xuICBjb25zdCBydW50aW1lID1cbiAgICB0eXBlb2YgY2hyb21lID09PSAnb2JqZWN0J1xuICAgICAgPyBjaHJvbWUucnVudGltZVxuICAgICAgOiB0eXBlb2YgYnJvd3NlciA9PT0gJ29iamVjdCdcbiAgICAgID8gYnJvd3Nlci5ydW50aW1lXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHR5cGVvZiBydW50aW1lID09PSAnb2JqZWN0JyAmJiBydW50aW1lLmlkICE9PSB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRGV0ZWN0IFJlYWN0IE5hdGl2ZS5cbiAqXG4gKiBAcmV0dXJuIHRydWUgaWYgUmVhY3ROYXRpdmUgZW52aXJvbm1lbnQgaXMgZGV0ZWN0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1JlYWN0TmF0aXZlKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiBuYXZpZ2F0b3IgPT09ICdvYmplY3QnICYmIG5hdmlnYXRvclsncHJvZHVjdCddID09PSAnUmVhY3ROYXRpdmUnXG4gICk7XG59XG5cbi8qKiBEZXRlY3RzIEVsZWN0cm9uIGFwcHMuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFbGVjdHJvbigpOiBib29sZWFuIHtcbiAgcmV0dXJuIGdldFVBKCkuaW5kZXhPZignRWxlY3Ryb24vJykgPj0gMDtcbn1cblxuLyoqIERldGVjdHMgSW50ZXJuZXQgRXhwbG9yZXIuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJRSgpOiBib29sZWFuIHtcbiAgY29uc3QgdWEgPSBnZXRVQSgpO1xuICByZXR1cm4gdWEuaW5kZXhPZignTVNJRSAnKSA+PSAwIHx8IHVhLmluZGV4T2YoJ1RyaWRlbnQvJykgPj0gMDtcbn1cblxuLyoqIERldGVjdHMgVW5pdmVyc2FsIFdpbmRvd3MgUGxhdGZvcm0gYXBwcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1VXUCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIGdldFVBKCkuaW5kZXhPZignTVNBcHBIb3N0LycpID49IDA7XG59XG5cbi8qKlxuICogRGV0ZWN0IHdoZXRoZXIgdGhlIGN1cnJlbnQgU0RLIGJ1aWxkIGlzIHRoZSBOb2RlIHZlcnNpb24uXG4gKlxuICogQHJldHVybiB0cnVlIGlmIGl0J3MgdGhlIE5vZGUgU0RLIGJ1aWxkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNOb2RlU2RrKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gQ09OU1RBTlRTLk5PREVfQ0xJRU5UID09PSB0cnVlIHx8IENPTlNUQU5UUy5OT0RFX0FETUlOID09PSB0cnVlO1xufVxuXG4vKiogUmV0dXJucyB0cnVlIGlmIHdlIGFyZSBydW5uaW5nIGluIFNhZmFyaS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NhZmFyaSgpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICAhaXNOb2RlKCkgJiZcbiAgICBuYXZpZ2F0b3IudXNlckFnZW50LmluY2x1ZGVzKCdTYWZhcmknKSAmJlxuICAgICFuYXZpZ2F0b3IudXNlckFnZW50LmluY2x1ZGVzKCdDaHJvbWUnKVxuICApO1xufVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGNoZWNrcyBpZiBpbmRleGVkREIgaXMgc3VwcG9ydGVkIGJ5IGN1cnJlbnQgYnJvd3Nlci9zZXJ2aWNlIHdvcmtlciBjb250ZXh0XG4gKiBAcmV0dXJuIHRydWUgaWYgaW5kZXhlZERCIGlzIHN1cHBvcnRlZCBieSBjdXJyZW50IGJyb3dzZXIvc2VydmljZSB3b3JrZXIgY29udGV4dFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJbmRleGVkREJBdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHR5cGVvZiBpbmRleGVkREIgPT09ICdvYmplY3QnO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgdmFsaWRhdGVzIGJyb3dzZXIvc3cgY29udGV4dCBmb3IgaW5kZXhlZERCIGJ5IG9wZW5pbmcgYSBkdW1teSBpbmRleGVkREIgZGF0YWJhc2UgYW5kIHJlamVjdFxuICogaWYgZXJyb3JzIG9jY3VyIGR1cmluZyB0aGUgZGF0YWJhc2Ugb3BlbiBvcGVyYXRpb24uXG4gKlxuICogQHRocm93cyBleGNlcHRpb24gaWYgY3VycmVudCBicm93c2VyL3N3IGNvbnRleHQgY2FuJ3QgcnVuIGlkYi5vcGVuIChleDogU2FmYXJpIGlmcmFtZSwgRmlyZWZveFxuICogcHJpdmF0ZSBicm93c2luZylcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlSW5kZXhlZERCT3BlbmFibGUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBwcmVFeGlzdDogYm9vbGVhbiA9IHRydWU7XG4gICAgICBjb25zdCBEQl9DSEVDS19OQU1FID1cbiAgICAgICAgJ3ZhbGlkYXRlLWJyb3dzZXItY29udGV4dC1mb3ItaW5kZXhlZGRiLWFuYWx5dGljcy1tb2R1bGUnO1xuICAgICAgY29uc3QgcmVxdWVzdCA9IHNlbGYuaW5kZXhlZERCLm9wZW4oREJfQ0hFQ0tfTkFNRSk7XG4gICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHtcbiAgICAgICAgcmVxdWVzdC5yZXN1bHQuY2xvc2UoKTtcbiAgICAgICAgLy8gZGVsZXRlIGRhdGFiYXNlIG9ubHkgd2hlbiBpdCBkb2Vzbid0IHByZS1leGlzdFxuICAgICAgICBpZiAoIXByZUV4aXN0KSB7XG4gICAgICAgICAgc2VsZi5pbmRleGVkREIuZGVsZXRlRGF0YWJhc2UoREJfQ0hFQ0tfTkFNRSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgIH07XG4gICAgICByZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9ICgpID0+IHtcbiAgICAgICAgcHJlRXhpc3QgPSBmYWxzZTtcbiAgICAgIH07XG5cbiAgICAgIHJlcXVlc3Qub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgcmVqZWN0KHJlcXVlc3QuZXJyb3I/Lm1lc3NhZ2UgfHwgJycpO1xuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqXG4gKiBUaGlzIG1ldGhvZCBjaGVja3Mgd2hldGhlciBjb29raWUgaXMgZW5hYmxlZCB3aXRoaW4gY3VycmVudCBicm93c2VyXG4gKiBAcmV0dXJuIHRydWUgaWYgY29va2llIGlzIGVuYWJsZWQgd2l0aGluIGN1cnJlbnQgYnJvd3NlclxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJlQ29va2llc0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2YgbmF2aWdhdG9yID09PSAndW5kZWZpbmVkJyB8fCAhbmF2aWdhdG9yLmNvb2tpZUVuYWJsZWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQGZpbGVvdmVydmlldyBTdGFuZGFyZGl6ZWQgRmlyZWJhc2UgRXJyb3IuXG4gKlxuICogVXNhZ2U6XG4gKlxuICogICAvLyBUeXBlc2NyaXB0IHN0cmluZyBsaXRlcmFscyBmb3IgdHlwZS1zYWZlIGNvZGVzXG4gKiAgIHR5cGUgRXJyID1cbiAqICAgICAndW5rbm93bicgfFxuICogICAgICdvYmplY3Qtbm90LWZvdW5kJ1xuICogICAgIDtcbiAqXG4gKiAgIC8vIENsb3N1cmUgZW51bSBmb3IgdHlwZS1zYWZlIGVycm9yIGNvZGVzXG4gKiAgIC8vIGF0LWVudW0ge3N0cmluZ31cbiAqICAgdmFyIEVyciA9IHtcbiAqICAgICBVTktOT1dOOiAndW5rbm93bicsXG4gKiAgICAgT0JKRUNUX05PVF9GT1VORDogJ29iamVjdC1ub3QtZm91bmQnLFxuICogICB9XG4gKlxuICogICBsZXQgZXJyb3JzOiBNYXA8RXJyLCBzdHJpbmc+ID0ge1xuICogICAgICdnZW5lcmljLWVycm9yJzogXCJVbmtub3duIGVycm9yXCIsXG4gKiAgICAgJ2ZpbGUtbm90LWZvdW5kJzogXCJDb3VsZCBub3QgZmluZCBmaWxlOiB7JGZpbGV9XCIsXG4gKiAgIH07XG4gKlxuICogICAvLyBUeXBlLXNhZmUgZnVuY3Rpb24gLSBtdXN0IHBhc3MgYSB2YWxpZCBlcnJvciBjb2RlIGFzIHBhcmFtLlxuICogICBsZXQgZXJyb3IgPSBuZXcgRXJyb3JGYWN0b3J5PEVycj4oJ3NlcnZpY2UnLCAnU2VydmljZScsIGVycm9ycyk7XG4gKlxuICogICAuLi5cbiAqICAgdGhyb3cgZXJyb3IuY3JlYXRlKEVyci5HRU5FUklDKTtcbiAqICAgLi4uXG4gKiAgIHRocm93IGVycm9yLmNyZWF0ZShFcnIuRklMRV9OT1RfRk9VTkQsIHsnZmlsZSc6IGZpbGVOYW1lfSk7XG4gKiAgIC4uLlxuICogICAvLyBTZXJ2aWNlOiBDb3VsZCBub3QgZmlsZSBmaWxlOiBmb28udHh0IChzZXJ2aWNlL2ZpbGUtbm90LWZvdW5kKS5cbiAqXG4gKiAgIGNhdGNoIChlKSB7XG4gKiAgICAgYXNzZXJ0KGUubWVzc2FnZSA9PT0gXCJDb3VsZCBub3QgZmluZCBmaWxlOiBmb28udHh0LlwiKTtcbiAqICAgICBpZiAoKGUgYXMgRmlyZWJhc2VFcnJvcik/LmNvZGUgPT09ICdzZXJ2aWNlL2ZpbGUtbm90LWZvdW5kJykge1xuICogICAgICAgY29uc29sZS5sb2coXCJDb3VsZCBub3QgcmVhZCBmaWxlOiBcIiArIGVbJ2ZpbGUnXSk7XG4gKiAgICAgfVxuICogICB9XG4gKi9cblxuZXhwb3J0IHR5cGUgRXJyb3JNYXA8RXJyb3JDb2RlIGV4dGVuZHMgc3RyaW5nPiA9IHtcbiAgcmVhZG9ubHkgW0sgaW4gRXJyb3JDb2RlXTogc3RyaW5nO1xufTtcblxuY29uc3QgRVJST1JfTkFNRSA9ICdGaXJlYmFzZUVycm9yJztcblxuZXhwb3J0IGludGVyZmFjZSBTdHJpbmdMaWtlIHtcbiAgdG9TdHJpbmcoKTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVycm9yRGF0YSB7XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG5cbi8vIEJhc2VkIG9uIGNvZGUgZnJvbTpcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0Vycm9yI0N1c3RvbV9FcnJvcl9UeXBlc1xuZXhwb3J0IGNsYXNzIEZpcmViYXNlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKiBUaGUgY3VzdG9tIG5hbWUgZm9yIGFsbCBGaXJlYmFzZUVycm9ycy4gKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nID0gRVJST1JfTkFNRTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAvKiogVGhlIGVycm9yIGNvZGUgZm9yIHRoaXMgZXJyb3IuICovXG4gICAgcmVhZG9ubHkgY29kZTogc3RyaW5nLFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAvKiogQ3VzdG9tIGRhdGEgZm9yIHRoaXMgZXJyb3IuICovXG4gICAgcHVibGljIGN1c3RvbURhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcblxuICAgIC8vIEZpeCBGb3IgRVM1XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0LXdpa2kvYmxvYi9tYXN0ZXIvQnJlYWtpbmctQ2hhbmdlcy5tZCNleHRlbmRpbmctYnVpbHQtaW5zLWxpa2UtZXJyb3ItYXJyYXktYW5kLW1hcC1tYXktbm8tbG9uZ2VyLXdvcmtcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgRmlyZWJhc2VFcnJvci5wcm90b3R5cGUpO1xuXG4gICAgLy8gTWFpbnRhaW5zIHByb3BlciBzdGFjayB0cmFjZSBmb3Igd2hlcmUgb3VyIGVycm9yIHdhcyB0aHJvd24uXG4gICAgLy8gT25seSBhdmFpbGFibGUgb24gVjguXG4gICAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBFcnJvckZhY3RvcnkucHJvdG90eXBlLmNyZWF0ZSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFcnJvckZhY3Rvcnk8XG4gIEVycm9yQ29kZSBleHRlbmRzIHN0cmluZyxcbiAgRXJyb3JQYXJhbXMgZXh0ZW5kcyB7IHJlYWRvbmx5IFtLIGluIEVycm9yQ29kZV0/OiBFcnJvckRhdGEgfSA9IHt9XG4+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBzZXJ2aWNlOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzZXJ2aWNlTmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZXJyb3JzOiBFcnJvck1hcDxFcnJvckNvZGU+XG4gICkge31cblxuICBjcmVhdGU8SyBleHRlbmRzIEVycm9yQ29kZT4oXG4gICAgY29kZTogSyxcbiAgICAuLi5kYXRhOiBLIGV4dGVuZHMga2V5b2YgRXJyb3JQYXJhbXMgPyBbRXJyb3JQYXJhbXNbS11dIDogW11cbiAgKTogRmlyZWJhc2VFcnJvciB7XG4gICAgY29uc3QgY3VzdG9tRGF0YSA9IChkYXRhWzBdIGFzIEVycm9yRGF0YSkgfHwge307XG4gICAgY29uc3QgZnVsbENvZGUgPSBgJHt0aGlzLnNlcnZpY2V9LyR7Y29kZX1gO1xuICAgIGNvbnN0IHRlbXBsYXRlID0gdGhpcy5lcnJvcnNbY29kZV07XG5cbiAgICBjb25zdCBtZXNzYWdlID0gdGVtcGxhdGUgPyByZXBsYWNlVGVtcGxhdGUodGVtcGxhdGUsIGN1c3RvbURhdGEpIDogJ0Vycm9yJztcbiAgICAvLyBTZXJ2aWNlIE5hbWU6IEVycm9yIG1lc3NhZ2UgKHNlcnZpY2UvY29kZSkuXG4gICAgY29uc3QgZnVsbE1lc3NhZ2UgPSBgJHt0aGlzLnNlcnZpY2VOYW1lfTogJHttZXNzYWdlfSAoJHtmdWxsQ29kZX0pLmA7XG5cbiAgICBjb25zdCBlcnJvciA9IG5ldyBGaXJlYmFzZUVycm9yKGZ1bGxDb2RlLCBmdWxsTWVzc2FnZSwgY3VzdG9tRGF0YSk7XG5cbiAgICByZXR1cm4gZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVwbGFjZVRlbXBsYXRlKHRlbXBsYXRlOiBzdHJpbmcsIGRhdGE6IEVycm9yRGF0YSk6IHN0cmluZyB7XG4gIHJldHVybiB0ZW1wbGF0ZS5yZXBsYWNlKFBBVFRFUk4sIChfLCBrZXkpID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IGRhdGFba2V5XTtcbiAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCA/IFN0cmluZyh2YWx1ZSkgOiBgPCR7a2V5fT8+YDtcbiAgfSk7XG59XG5cbmNvbnN0IFBBVFRFUk4gPSAvXFx7XFwkKFtefV0rKX0vZztcbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vKipcbiAqIEV2YWx1YXRlcyBhIEpTT04gc3RyaW5nIGludG8gYSBqYXZhc2NyaXB0IG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIEEgc3RyaW5nIGNvbnRhaW5pbmcgSlNPTi5cbiAqIEByZXR1cm4geyp9IFRoZSBqYXZhc2NyaXB0IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNwZWNpZmllZCBKU09OLlxuICovXG5leHBvcnQgZnVuY3Rpb24ganNvbkV2YWwoc3RyOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgcmV0dXJuIEpTT04ucGFyc2Uoc3RyKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIEpTT04gcmVwcmVzZW50aW5nIGEgamF2YXNjcmlwdCBvYmplY3QuXG4gKiBAcGFyYW0geyp9IGRhdGEgSmF2YXNjcmlwdCBvYmplY3QgdG8gYmUgc3RyaW5naWZpZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBKU09OIGNvbnRlbnRzIG9mIHRoZSBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdpZnkoZGF0YTogdW5rbm93bik6IHN0cmluZyB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShkYXRhKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBiYXNlNjREZWNvZGUgfSBmcm9tICcuL2NyeXB0JztcbmltcG9ydCB7IGpzb25FdmFsIH0gZnJvbSAnLi9qc29uJztcblxuaW50ZXJmYWNlIENsYWltcyB7XG4gIFtrZXk6IHN0cmluZ106IHt9O1xufVxuXG5pbnRlcmZhY2UgRGVjb2RlZFRva2VuIHtcbiAgaGVhZGVyOiBvYmplY3Q7XG4gIGNsYWltczogQ2xhaW1zO1xuICBkYXRhOiBvYmplY3Q7XG4gIHNpZ25hdHVyZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIERlY29kZXMgYSBGaXJlYmFzZSBhdXRoLiB0b2tlbiBpbnRvIGNvbnN0aXR1ZW50IHBhcnRzLlxuICpcbiAqIE5vdGVzOlxuICogLSBNYXkgcmV0dXJuIHdpdGggaW52YWxpZCAvIGluY29tcGxldGUgY2xhaW1zIGlmIHRoZXJlJ3Mgbm8gbmF0aXZlIGJhc2U2NCBkZWNvZGluZyBzdXBwb3J0LlxuICogLSBEb2Vzbid0IGNoZWNrIGlmIHRoZSB0b2tlbiBpcyBhY3R1YWxseSB2YWxpZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGRlY29kZSA9IGZ1bmN0aW9uICh0b2tlbjogc3RyaW5nKTogRGVjb2RlZFRva2VuIHtcbiAgbGV0IGhlYWRlciA9IHt9LFxuICAgIGNsYWltczogQ2xhaW1zID0ge30sXG4gICAgZGF0YSA9IHt9LFxuICAgIHNpZ25hdHVyZSA9ICcnO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcGFydHMgPSB0b2tlbi5zcGxpdCgnLicpO1xuICAgIGhlYWRlciA9IGpzb25FdmFsKGJhc2U2NERlY29kZShwYXJ0c1swXSkgfHwgJycpIGFzIG9iamVjdDtcbiAgICBjbGFpbXMgPSBqc29uRXZhbChiYXNlNjREZWNvZGUocGFydHNbMV0pIHx8ICcnKSBhcyBDbGFpbXM7XG4gICAgc2lnbmF0dXJlID0gcGFydHNbMl07XG4gICAgZGF0YSA9IGNsYWltc1snZCddIHx8IHt9O1xuICAgIGRlbGV0ZSBjbGFpbXNbJ2QnXTtcbiAgfSBjYXRjaCAoZSkge31cblxuICByZXR1cm4ge1xuICAgIGhlYWRlcixcbiAgICBjbGFpbXMsXG4gICAgZGF0YSxcbiAgICBzaWduYXR1cmVcbiAgfTtcbn07XG5cbmludGVyZmFjZSBEZWNvZGVkVG9rZW4ge1xuICBoZWFkZXI6IG9iamVjdDtcbiAgY2xhaW1zOiBDbGFpbXM7XG4gIGRhdGE6IG9iamVjdDtcbiAgc2lnbmF0dXJlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRGVjb2RlcyBhIEZpcmViYXNlIGF1dGguIHRva2VuIGFuZCBjaGVja3MgdGhlIHZhbGlkaXR5IG9mIGl0cyB0aW1lLWJhc2VkIGNsYWltcy4gV2lsbCByZXR1cm4gdHJ1ZSBpZiB0aGVcbiAqIHRva2VuIGlzIHdpdGhpbiB0aGUgdGltZSB3aW5kb3cgYXV0aG9yaXplZCBieSB0aGUgJ25iZicgKG5vdC1iZWZvcmUpIGFuZCAnaWF0JyAoaXNzdWVkLWF0KSBjbGFpbXMuXG4gKlxuICogTm90ZXM6XG4gKiAtIE1heSByZXR1cm4gYSBmYWxzZSBuZWdhdGl2ZSBpZiB0aGVyZSdzIG5vIG5hdGl2ZSBiYXNlNjQgZGVjb2Rpbmcgc3VwcG9ydC5cbiAqIC0gRG9lc24ndCBjaGVjayBpZiB0aGUgdG9rZW4gaXMgYWN0dWFsbHkgdmFsaWQuXG4gKi9cbmV4cG9ydCBjb25zdCBpc1ZhbGlkVGltZXN0YW1wID0gZnVuY3Rpb24gKHRva2VuOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgY2xhaW1zOiBDbGFpbXMgPSBkZWNvZGUodG9rZW4pLmNsYWltcztcbiAgY29uc3Qgbm93OiBudW1iZXIgPSBNYXRoLmZsb29yKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC8gMTAwMCk7XG4gIGxldCB2YWxpZFNpbmNlOiBudW1iZXIgPSAwLFxuICAgIHZhbGlkVW50aWw6IG51bWJlciA9IDA7XG5cbiAgaWYgKHR5cGVvZiBjbGFpbXMgPT09ICdvYmplY3QnKSB7XG4gICAgaWYgKGNsYWltcy5oYXNPd25Qcm9wZXJ0eSgnbmJmJykpIHtcbiAgICAgIHZhbGlkU2luY2UgPSBjbGFpbXNbJ25iZiddIGFzIG51bWJlcjtcbiAgICB9IGVsc2UgaWYgKGNsYWltcy5oYXNPd25Qcm9wZXJ0eSgnaWF0JykpIHtcbiAgICAgIHZhbGlkU2luY2UgPSBjbGFpbXNbJ2lhdCddIGFzIG51bWJlcjtcbiAgICB9XG5cbiAgICBpZiAoY2xhaW1zLmhhc093blByb3BlcnR5KCdleHAnKSkge1xuICAgICAgdmFsaWRVbnRpbCA9IGNsYWltc1snZXhwJ10gYXMgbnVtYmVyO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0b2tlbiB3aWxsIGV4cGlyZSBhZnRlciAyNGggYnkgZGVmYXVsdFxuICAgICAgdmFsaWRVbnRpbCA9IHZhbGlkU2luY2UgKyA4NjQwMDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gKFxuICAgICEhbm93ICYmXG4gICAgISF2YWxpZFNpbmNlICYmXG4gICAgISF2YWxpZFVudGlsICYmXG4gICAgbm93ID49IHZhbGlkU2luY2UgJiZcbiAgICBub3cgPD0gdmFsaWRVbnRpbFxuICApO1xufTtcblxuLyoqXG4gKiBEZWNvZGVzIGEgRmlyZWJhc2UgYXV0aC4gdG9rZW4gYW5kIHJldHVybnMgaXRzIGlzc3VlZCBhdCB0aW1lIGlmIHZhbGlkLCBudWxsIG90aGVyd2lzZS5cbiAqXG4gKiBOb3RlczpcbiAqIC0gTWF5IHJldHVybiBudWxsIGlmIHRoZXJlJ3Mgbm8gbmF0aXZlIGJhc2U2NCBkZWNvZGluZyBzdXBwb3J0LlxuICogLSBEb2Vzbid0IGNoZWNrIGlmIHRoZSB0b2tlbiBpcyBhY3R1YWxseSB2YWxpZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzc3VlZEF0VGltZSA9IGZ1bmN0aW9uICh0b2tlbjogc3RyaW5nKTogbnVtYmVyIHwgbnVsbCB7XG4gIGNvbnN0IGNsYWltczogQ2xhaW1zID0gZGVjb2RlKHRva2VuKS5jbGFpbXM7XG4gIGlmICh0eXBlb2YgY2xhaW1zID09PSAnb2JqZWN0JyAmJiBjbGFpbXMuaGFzT3duUHJvcGVydHkoJ2lhdCcpKSB7XG4gICAgcmV0dXJuIGNsYWltc1snaWF0J10gYXMgbnVtYmVyO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuLyoqXG4gKiBEZWNvZGVzIGEgRmlyZWJhc2UgYXV0aC4gdG9rZW4gYW5kIGNoZWNrcyB0aGUgdmFsaWRpdHkgb2YgaXRzIGZvcm1hdC4gRXhwZWN0cyBhIHZhbGlkIGlzc3VlZC1hdCB0aW1lLlxuICpcbiAqIE5vdGVzOlxuICogLSBNYXkgcmV0dXJuIGEgZmFsc2UgbmVnYXRpdmUgaWYgdGhlcmUncyBubyBuYXRpdmUgYmFzZTY0IGRlY29kaW5nIHN1cHBvcnQuXG4gKiAtIERvZXNuJ3QgY2hlY2sgaWYgdGhlIHRva2VuIGlzIGFjdHVhbGx5IHZhbGlkLlxuICovXG5leHBvcnQgY29uc3QgaXNWYWxpZEZvcm1hdCA9IGZ1bmN0aW9uICh0b2tlbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGRlY29kZWQgPSBkZWNvZGUodG9rZW4pLFxuICAgIGNsYWltcyA9IGRlY29kZWQuY2xhaW1zO1xuXG4gIHJldHVybiAhIWNsYWltcyAmJiB0eXBlb2YgY2xhaW1zID09PSAnb2JqZWN0JyAmJiBjbGFpbXMuaGFzT3duUHJvcGVydHkoJ2lhdCcpO1xufTtcblxuLyoqXG4gKiBBdHRlbXB0cyB0byBwZWVyIGludG8gYW4gYXV0aCB0b2tlbiBhbmQgZGV0ZXJtaW5lIGlmIGl0J3MgYW4gYWRtaW4gYXV0aCB0b2tlbiBieSBsb29raW5nIGF0IHRoZSBjbGFpbXMgcG9ydGlvbi5cbiAqXG4gKiBOb3RlczpcbiAqIC0gTWF5IHJldHVybiBhIGZhbHNlIG5lZ2F0aXZlIGlmIHRoZXJlJ3Mgbm8gbmF0aXZlIGJhc2U2NCBkZWNvZGluZyBzdXBwb3J0LlxuICogLSBEb2Vzbid0IGNoZWNrIGlmIHRoZSB0b2tlbiBpcyBhY3R1YWxseSB2YWxpZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzQWRtaW4gPSBmdW5jdGlvbiAodG9rZW46IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBjbGFpbXM6IENsYWltcyA9IGRlY29kZSh0b2tlbikuY2xhaW1zO1xuICByZXR1cm4gdHlwZW9mIGNsYWltcyA9PT0gJ29iamVjdCcgJiYgY2xhaW1zWydhZG1pbiddID09PSB0cnVlO1xufTtcbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY29udGFpbnM8VCBleHRlbmRzIG9iamVjdD4ob2JqOiBULCBrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNhZmVHZXQ8VCBleHRlbmRzIG9iamVjdCwgSyBleHRlbmRzIGtleW9mIFQ+KFxuICBvYmo6IFQsXG4gIGtleTogS1xuKTogVFtLXSB8IHVuZGVmaW5lZCB7XG4gIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgcmV0dXJuIG9ialtrZXldO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRW1wdHkob2JqOiBvYmplY3QpOiBvYmogaXMge30ge1xuICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hcDxLIGV4dGVuZHMgc3RyaW5nLCBWLCBVPihcbiAgb2JqOiB7IFtrZXkgaW4gS106IFYgfSxcbiAgZm46ICh2YWx1ZTogViwga2V5OiBLLCBvYmo6IHsgW2tleSBpbiBLXTogViB9KSA9PiBVLFxuICBjb250ZXh0T2JqPzogdW5rbm93blxuKTogeyBba2V5IGluIEtdOiBVIH0ge1xuICBjb25zdCByZXM6IFBhcnRpYWw8eyBba2V5IGluIEtdOiBVIH0+ID0ge307XG4gIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICByZXNba2V5XSA9IGZuLmNhbGwoY29udGV4dE9iaiwgb2JqW2tleV0sIGtleSwgb2JqKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlcyBhcyB7IFtrZXkgaW4gS106IFUgfTtcbn1cblxuLyoqXG4gKiBEZWVwIGVxdWFsIHR3byBvYmplY3RzLiBTdXBwb3J0IEFycmF5cyBhbmQgT2JqZWN0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZXBFcXVhbChhOiBvYmplY3QsIGI6IG9iamVjdCk6IGJvb2xlYW4ge1xuICBpZiAoYSA9PT0gYikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgYUtleXMgPSBPYmplY3Qua2V5cyhhKTtcbiAgY29uc3QgYktleXMgPSBPYmplY3Qua2V5cyhiKTtcbiAgZm9yIChjb25zdCBrIG9mIGFLZXlzKSB7XG4gICAgaWYgKCFiS2V5cy5pbmNsdWRlcyhrKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGFQcm9wID0gKGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tdO1xuICAgIGNvbnN0IGJQcm9wID0gKGIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tdO1xuICAgIGlmIChpc09iamVjdChhUHJvcCkgJiYgaXNPYmplY3QoYlByb3ApKSB7XG4gICAgICBpZiAoIWRlZXBFcXVhbChhUHJvcCwgYlByb3ApKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGFQcm9wICE9PSBiUHJvcCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgayBvZiBiS2V5cykge1xuICAgIGlmICghYUtleXMuaW5jbHVkZXMoaykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KHRoaW5nOiB1bmtub3duKTogdGhpbmcgaXMgb2JqZWN0IHtcbiAgcmV0dXJuIHRoaW5nICE9PSBudWxsICYmIHR5cGVvZiB0aGluZyA9PT0gJ29iamVjdCc7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgRGVmZXJyZWQgfSBmcm9tICcuL2RlZmVycmVkJztcblxuLyoqXG4gKiBSZWplY3RzIGlmIHRoZSBnaXZlbiBwcm9taXNlIGRvZXNuJ3QgcmVzb2x2ZSBpbiB0aW1lSW5NUyBtaWxsaXNlY29uZHMuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb21pc2VXaXRoVGltZW91dDxUPihcbiAgcHJvbWlzZTogUHJvbWlzZTxUPixcbiAgdGltZUluTVMgPSAyMDAwXG4pOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgZGVmZXJyZWRQcm9taXNlID0gbmV3IERlZmVycmVkPFQ+KCk7XG4gIHNldFRpbWVvdXQoKCkgPT4gZGVmZXJyZWRQcm9taXNlLnJlamVjdCgndGltZW91dCEnKSwgdGltZUluTVMpO1xuICBwcm9taXNlLnRoZW4oZGVmZXJyZWRQcm9taXNlLnJlc29sdmUsIGRlZmVycmVkUHJvbWlzZS5yZWplY3QpO1xuICByZXR1cm4gZGVmZXJyZWRQcm9taXNlLnByb21pc2U7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLyoqXG4gKiBSZXR1cm5zIGEgcXVlcnlzdHJpbmctZm9ybWF0dGVkIHN0cmluZyAoZS5nLiAmYXJnPXZhbCZhcmcyPXZhbDIpIGZyb20gYVxuICogcGFyYW1zIG9iamVjdCAoZS5nLiB7YXJnOiAndmFsJywgYXJnMjogJ3ZhbDInfSlcbiAqIE5vdGU6IFlvdSBtdXN0IHByZXBlbmQgaXQgd2l0aCA/IHdoZW4gYWRkaW5nIGl0IHRvIGEgVVJMLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcXVlcnlzdHJpbmcocXVlcnlzdHJpbmdQYXJhbXM6IHtcbiAgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyO1xufSk6IHN0cmluZyB7XG4gIGNvbnN0IHBhcmFtcyA9IFtdO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhxdWVyeXN0cmluZ1BhcmFtcykpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHZhbHVlLmZvckVhY2goYXJyYXlWYWwgPT4ge1xuICAgICAgICBwYXJhbXMucHVzaChcbiAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoa2V5KSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudChhcnJheVZhbClcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJhbXMucHVzaChlbmNvZGVVUklDb21wb25lbnQoa2V5KSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcGFyYW1zLmxlbmd0aCA/ICcmJyArIHBhcmFtcy5qb2luKCcmJykgOiAnJztcbn1cblxuLyoqXG4gKiBEZWNvZGVzIGEgcXVlcnlzdHJpbmcgKGUuZy4gP2FyZz12YWwmYXJnMj12YWwyKSBpbnRvIGEgcGFyYW1zIG9iamVjdFxuICogKGUuZy4ge2FyZzogJ3ZhbCcsIGFyZzI6ICd2YWwyJ30pXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBxdWVyeXN0cmluZ0RlY29kZShxdWVyeXN0cmluZzogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IG9iajogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBjb25zdCB0b2tlbnMgPSBxdWVyeXN0cmluZy5yZXBsYWNlKC9eXFw/LywgJycpLnNwbGl0KCcmJyk7XG5cbiAgdG9rZW5zLmZvckVhY2godG9rZW4gPT4ge1xuICAgIGlmICh0b2tlbikge1xuICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gdG9rZW4uc3BsaXQoJz0nKTtcbiAgICAgIG9ialtkZWNvZGVVUklDb21wb25lbnQoa2V5KV0gPSBkZWNvZGVVUklDb21wb25lbnQodmFsdWUpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogRXh0cmFjdCB0aGUgcXVlcnkgc3RyaW5nIHBhcnQgb2YgYSBVUkwsIGluY2x1ZGluZyB0aGUgbGVhZGluZyBxdWVzdGlvbiBtYXJrIChpZiBwcmVzZW50KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RRdWVyeXN0cmluZyh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHF1ZXJ5U3RhcnQgPSB1cmwuaW5kZXhPZignPycpO1xuICBpZiAoIXF1ZXJ5U3RhcnQpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgY29uc3QgZnJhZ21lbnRTdGFydCA9IHVybC5pbmRleE9mKCcjJywgcXVlcnlTdGFydCk7XG4gIHJldHVybiB1cmwuc3Vic3RyaW5nKFxuICAgIHF1ZXJ5U3RhcnQsXG4gICAgZnJhZ21lbnRTdGFydCA+IDAgPyBmcmFnbWVudFN0YXJ0IDogdW5kZWZpbmVkXG4gICk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IFNIQS0xIGNyeXB0b2dyYXBoaWMgaGFzaC5cbiAqIFZhcmlhYmxlIG5hbWVzIGZvbGxvdyB0aGUgbm90YXRpb24gaW4gRklQUyBQVUIgMTgwLTM6XG4gKiBodHRwOi8vY3NyYy5uaXN0Lmdvdi9wdWJsaWNhdGlvbnMvZmlwcy9maXBzMTgwLTMvZmlwczE4MC0zX2ZpbmFsLnBkZi5cbiAqXG4gKiBVc2FnZTpcbiAqICAgdmFyIHNoYTEgPSBuZXcgc2hhMSgpO1xuICogICBzaGExLnVwZGF0ZShieXRlcyk7XG4gKiAgIHZhciBoYXNoID0gc2hhMS5kaWdlc3QoKTtcbiAqXG4gKiBQZXJmb3JtYW5jZTpcbiAqICAgQ2hyb21lIDIzOiAgIH40MDAgTWJpdC9zXG4gKiAgIEZpcmVmb3ggMTY6ICB+MjUwIE1iaXQvc1xuICpcbiAqL1xuXG4vKipcbiAqIFNIQS0xIGNyeXB0b2dyYXBoaWMgaGFzaCBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBUaGUgcHJvcGVydGllcyBkZWNsYXJlZCBoZXJlIGFyZSBkaXNjdXNzZWQgaW4gdGhlIGFib3ZlIGFsZ29yaXRobSBkb2N1bWVudC5cbiAqIEBjb25zdHJ1Y3RvclxuICogQGZpbmFsXG4gKiBAc3RydWN0XG4gKi9cbmV4cG9ydCBjbGFzcyBTaGExIHtcbiAgLyoqXG4gICAqIEhvbGRzIHRoZSBwcmV2aW91cyB2YWx1ZXMgb2YgYWNjdW11bGF0ZWQgdmFyaWFibGVzIGEtZSBpbiB0aGUgY29tcHJlc3NfXG4gICAqIGZ1bmN0aW9uLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBjaGFpbl86IG51bWJlcltdID0gW107XG5cbiAgLyoqXG4gICAqIEEgYnVmZmVyIGhvbGRpbmcgdGhlIHBhcnRpYWxseSBjb21wdXRlZCBoYXNoIHJlc3VsdC5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYnVmXzogbnVtYmVyW10gPSBbXTtcblxuICAvKipcbiAgICogQW4gYXJyYXkgb2YgODAgYnl0ZXMsIGVhY2ggYSBwYXJ0IG9mIHRoZSBtZXNzYWdlIHRvIGJlIGhhc2hlZC4gIFJlZmVycmVkIHRvXG4gICAqIGFzIHRoZSBtZXNzYWdlIHNjaGVkdWxlIGluIHRoZSBkb2NzLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBXXzogbnVtYmVyW10gPSBbXTtcblxuICAvKipcbiAgICogQ29udGFpbnMgZGF0YSBuZWVkZWQgdG8gcGFkIG1lc3NhZ2VzIGxlc3MgdGhhbiA2NCBieXRlcy5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgcGFkXzogbnVtYmVyW10gPSBbXTtcblxuICAvKipcbiAgICogQHByaXZhdGUge251bWJlcn1cbiAgICovXG4gIHByaXZhdGUgaW5idWZfOiBudW1iZXIgPSAwO1xuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZSB7bnVtYmVyfVxuICAgKi9cbiAgcHJpdmF0ZSB0b3RhbF86IG51bWJlciA9IDA7XG5cbiAgYmxvY2tTaXplOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5ibG9ja1NpemUgPSA1MTIgLyA4O1xuXG4gICAgdGhpcy5wYWRfWzBdID0gMTI4O1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5ibG9ja1NpemU7ICsraSkge1xuICAgICAgdGhpcy5wYWRfW2ldID0gMDtcbiAgICB9XG5cbiAgICB0aGlzLnJlc2V0KCk7XG4gIH1cblxuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmNoYWluX1swXSA9IDB4Njc0NTIzMDE7XG4gICAgdGhpcy5jaGFpbl9bMV0gPSAweGVmY2RhYjg5O1xuICAgIHRoaXMuY2hhaW5fWzJdID0gMHg5OGJhZGNmZTtcbiAgICB0aGlzLmNoYWluX1szXSA9IDB4MTAzMjU0NzY7XG4gICAgdGhpcy5jaGFpbl9bNF0gPSAweGMzZDJlMWYwO1xuXG4gICAgdGhpcy5pbmJ1Zl8gPSAwO1xuICAgIHRoaXMudG90YWxfID0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBjb21wcmVzcyBoZWxwZXIgZnVuY3Rpb24uXG4gICAqIEBwYXJhbSBidWYgQmxvY2sgdG8gY29tcHJlc3MuXG4gICAqIEBwYXJhbSBvZmZzZXQgT2Zmc2V0IG9mIHRoZSBibG9jayBpbiB0aGUgYnVmZmVyLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY29tcHJlc3NfKGJ1ZjogbnVtYmVyW10gfCBVaW50OEFycmF5IHwgc3RyaW5nLCBvZmZzZXQ/OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIW9mZnNldCkge1xuICAgICAgb2Zmc2V0ID0gMDtcbiAgICB9XG5cbiAgICBjb25zdCBXID0gdGhpcy5XXztcblxuICAgIC8vIGdldCAxNiBiaWcgZW5kaWFuIHdvcmRzXG4gICAgaWYgKHR5cGVvZiBidWYgPT09ICdzdHJpbmcnKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDE2OyBpKyspIHtcbiAgICAgICAgLy8gVE9ETyh1c2VyKTogW2J1ZyA4MTQwMTIyXSBSZWNlbnQgdmVyc2lvbnMgb2YgU2FmYXJpIGZvciBNYWMgT1MgYW5kIGlPU1xuICAgICAgICAvLyBoYXZlIGEgYnVnIHRoYXQgdHVybnMgdGhlIHBvc3QtaW5jcmVtZW50ICsrIG9wZXJhdG9yIGludG8gcHJlLWluY3JlbWVudFxuICAgICAgICAvLyBkdXJpbmcgSklUIGNvbXBpbGF0aW9uLiAgV2UgaGF2ZSBjb2RlIHRoYXQgZGVwZW5kcyBoZWF2aWx5IG9uIFNIQS0xIGZvclxuICAgICAgICAvLyBjb3JyZWN0bmVzcyBhbmQgd2hpY2ggaXMgYWZmZWN0ZWQgYnkgdGhpcyBidWcsIHNvIEkndmUgcmVtb3ZlZCBhbGwgdXNlc1xuICAgICAgICAvLyBvZiBwb3N0LWluY3JlbWVudCArKyBpbiB3aGljaCB0aGUgcmVzdWx0IHZhbHVlIGlzIHVzZWQuICBXZSBjYW4gcmV2ZXJ0XG4gICAgICAgIC8vIHRoaXMgY2hhbmdlIG9uY2UgdGhlIFNhZmFyaSBidWdcbiAgICAgICAgLy8gKGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMDkwMzYpIGhhcyBiZWVuIGZpeGVkIGFuZFxuICAgICAgICAvLyBtb3N0IGNsaWVudHMgaGF2ZSBiZWVuIHVwZGF0ZWQuXG4gICAgICAgIFdbaV0gPVxuICAgICAgICAgIChidWYuY2hhckNvZGVBdChvZmZzZXQpIDw8IDI0KSB8XG4gICAgICAgICAgKGJ1Zi5jaGFyQ29kZUF0KG9mZnNldCArIDEpIDw8IDE2KSB8XG4gICAgICAgICAgKGJ1Zi5jaGFyQ29kZUF0KG9mZnNldCArIDIpIDw8IDgpIHxcbiAgICAgICAgICBidWYuY2hhckNvZGVBdChvZmZzZXQgKyAzKTtcbiAgICAgICAgb2Zmc2V0ICs9IDQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7IGkrKykge1xuICAgICAgICBXW2ldID1cbiAgICAgICAgICAoYnVmW29mZnNldF0gPDwgMjQpIHxcbiAgICAgICAgICAoYnVmW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgICAgICAgKGJ1ZltvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgICAgICAgYnVmW29mZnNldCArIDNdO1xuICAgICAgICBvZmZzZXQgKz0gNDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBleHBhbmQgdG8gODAgd29yZHNcbiAgICBmb3IgKGxldCBpID0gMTY7IGkgPCA4MDsgaSsrKSB7XG4gICAgICBjb25zdCB0ID0gV1tpIC0gM10gXiBXW2kgLSA4XSBeIFdbaSAtIDE0XSBeIFdbaSAtIDE2XTtcbiAgICAgIFdbaV0gPSAoKHQgPDwgMSkgfCAodCA+Pj4gMzEpKSAmIDB4ZmZmZmZmZmY7XG4gICAgfVxuXG4gICAgbGV0IGEgPSB0aGlzLmNoYWluX1swXTtcbiAgICBsZXQgYiA9IHRoaXMuY2hhaW5fWzFdO1xuICAgIGxldCBjID0gdGhpcy5jaGFpbl9bMl07XG4gICAgbGV0IGQgPSB0aGlzLmNoYWluX1szXTtcbiAgICBsZXQgZSA9IHRoaXMuY2hhaW5fWzRdO1xuICAgIGxldCBmLCBrO1xuXG4gICAgLy8gVE9ETyh1c2VyKTogVHJ5IHRvIHVucm9sbCB0aGlzIGxvb3AgdG8gc3BlZWQgdXAgdGhlIGNvbXB1dGF0aW9uLlxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgODA7IGkrKykge1xuICAgICAgaWYgKGkgPCA0MCkge1xuICAgICAgICBpZiAoaSA8IDIwKSB7XG4gICAgICAgICAgZiA9IGQgXiAoYiAmIChjIF4gZCkpO1xuICAgICAgICAgIGsgPSAweDVhODI3OTk5O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGYgPSBiIF4gYyBeIGQ7XG4gICAgICAgICAgayA9IDB4NmVkOWViYTE7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChpIDwgNjApIHtcbiAgICAgICAgICBmID0gKGIgJiBjKSB8IChkICYgKGIgfCBjKSk7XG4gICAgICAgICAgayA9IDB4OGYxYmJjZGM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZiA9IGIgXiBjIF4gZDtcbiAgICAgICAgICBrID0gMHhjYTYyYzFkNjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCB0ID0gKCgoYSA8PCA1KSB8IChhID4+PiAyNykpICsgZiArIGUgKyBrICsgV1tpXSkgJiAweGZmZmZmZmZmO1xuICAgICAgZSA9IGQ7XG4gICAgICBkID0gYztcbiAgICAgIGMgPSAoKGIgPDwgMzApIHwgKGIgPj4+IDIpKSAmIDB4ZmZmZmZmZmY7XG4gICAgICBiID0gYTtcbiAgICAgIGEgPSB0O1xuICAgIH1cblxuICAgIHRoaXMuY2hhaW5fWzBdID0gKHRoaXMuY2hhaW5fWzBdICsgYSkgJiAweGZmZmZmZmZmO1xuICAgIHRoaXMuY2hhaW5fWzFdID0gKHRoaXMuY2hhaW5fWzFdICsgYikgJiAweGZmZmZmZmZmO1xuICAgIHRoaXMuY2hhaW5fWzJdID0gKHRoaXMuY2hhaW5fWzJdICsgYykgJiAweGZmZmZmZmZmO1xuICAgIHRoaXMuY2hhaW5fWzNdID0gKHRoaXMuY2hhaW5fWzNdICsgZCkgJiAweGZmZmZmZmZmO1xuICAgIHRoaXMuY2hhaW5fWzRdID0gKHRoaXMuY2hhaW5fWzRdICsgZSkgJiAweGZmZmZmZmZmO1xuICB9XG5cbiAgdXBkYXRlKGJ5dGVzPzogbnVtYmVyW10gfCBVaW50OEFycmF5IHwgc3RyaW5nLCBsZW5ndGg/OiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBUT0RPKGpvaG5sZW56KTogdGlnaHRlbiB0aGUgZnVuY3Rpb24gc2lnbmF0dXJlIGFuZCByZW1vdmUgdGhpcyBjaGVja1xuICAgIGlmIChieXRlcyA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBsZW5ndGggPSBieXRlcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgY29uc3QgbGVuZ3RoTWludXNCbG9jayA9IGxlbmd0aCAtIHRoaXMuYmxvY2tTaXplO1xuICAgIGxldCBuID0gMDtcbiAgICAvLyBVc2luZyBsb2NhbCBpbnN0ZWFkIG9mIG1lbWJlciB2YXJpYWJsZXMgZ2l2ZXMgfjUlIHNwZWVkdXAgb24gRmlyZWZveCAxNi5cbiAgICBjb25zdCBidWYgPSB0aGlzLmJ1Zl87XG4gICAgbGV0IGluYnVmID0gdGhpcy5pbmJ1Zl87XG5cbiAgICAvLyBUaGUgb3V0ZXIgd2hpbGUgbG9vcCBzaG91bGQgZXhlY3V0ZSBhdCBtb3N0IHR3aWNlLlxuICAgIHdoaWxlIChuIDwgbGVuZ3RoKSB7XG4gICAgICAvLyBXaGVuIHdlIGhhdmUgbm8gZGF0YSBpbiB0aGUgYmxvY2sgdG8gdG9wIHVwLCB3ZSBjYW4gZGlyZWN0bHkgcHJvY2VzcyB0aGVcbiAgICAgIC8vIGlucHV0IGJ1ZmZlciAoYXNzdW1pbmcgaXQgY29udGFpbnMgc3VmZmljaWVudCBkYXRhKS4gVGhpcyBnaXZlcyB+MjUlXG4gICAgICAvLyBzcGVlZHVwIG9uIENocm9tZSAyMyBhbmQgfjE1JSBzcGVlZHVwIG9uIEZpcmVmb3ggMTYsIGJ1dCByZXF1aXJlcyB0aGF0XG4gICAgICAvLyB0aGUgZGF0YSBpcyBwcm92aWRlZCBpbiBsYXJnZSBjaHVua3MgKG9yIGluIG11bHRpcGxlcyBvZiA2NCBieXRlcykuXG4gICAgICBpZiAoaW5idWYgPT09IDApIHtcbiAgICAgICAgd2hpbGUgKG4gPD0gbGVuZ3RoTWludXNCbG9jaykge1xuICAgICAgICAgIHRoaXMuY29tcHJlc3NfKGJ5dGVzLCBuKTtcbiAgICAgICAgICBuICs9IHRoaXMuYmxvY2tTaXplO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgYnl0ZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHdoaWxlIChuIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgYnVmW2luYnVmXSA9IGJ5dGVzLmNoYXJDb2RlQXQobik7XG4gICAgICAgICAgKytpbmJ1ZjtcbiAgICAgICAgICArK247XG4gICAgICAgICAgaWYgKGluYnVmID09PSB0aGlzLmJsb2NrU2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5jb21wcmVzc18oYnVmKTtcbiAgICAgICAgICAgIGluYnVmID0gMDtcbiAgICAgICAgICAgIC8vIEp1bXAgdG8gdGhlIG91dGVyIGxvb3Agc28gd2UgdXNlIHRoZSBmdWxsLWJsb2NrIG9wdGltaXphdGlvbi5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2hpbGUgKG4gPCBsZW5ndGgpIHtcbiAgICAgICAgICBidWZbaW5idWZdID0gYnl0ZXNbbl07XG4gICAgICAgICAgKytpbmJ1ZjtcbiAgICAgICAgICArK247XG4gICAgICAgICAgaWYgKGluYnVmID09PSB0aGlzLmJsb2NrU2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5jb21wcmVzc18oYnVmKTtcbiAgICAgICAgICAgIGluYnVmID0gMDtcbiAgICAgICAgICAgIC8vIEp1bXAgdG8gdGhlIG91dGVyIGxvb3Agc28gd2UgdXNlIHRoZSBmdWxsLWJsb2NrIG9wdGltaXphdGlvbi5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuaW5idWZfID0gaW5idWY7XG4gICAgdGhpcy50b3RhbF8gKz0gbGVuZ3RoO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqL1xuICBkaWdlc3QoKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IGRpZ2VzdDogbnVtYmVyW10gPSBbXTtcbiAgICBsZXQgdG90YWxCaXRzID0gdGhpcy50b3RhbF8gKiA4O1xuXG4gICAgLy8gQWRkIHBhZCAweDgwIDB4MDAqLlxuICAgIGlmICh0aGlzLmluYnVmXyA8IDU2KSB7XG4gICAgICB0aGlzLnVwZGF0ZSh0aGlzLnBhZF8sIDU2IC0gdGhpcy5pbmJ1Zl8pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVwZGF0ZSh0aGlzLnBhZF8sIHRoaXMuYmxvY2tTaXplIC0gKHRoaXMuaW5idWZfIC0gNTYpKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgIyBiaXRzLlxuICAgIGZvciAobGV0IGkgPSB0aGlzLmJsb2NrU2l6ZSAtIDE7IGkgPj0gNTY7IGktLSkge1xuICAgICAgdGhpcy5idWZfW2ldID0gdG90YWxCaXRzICYgMjU1O1xuICAgICAgdG90YWxCaXRzIC89IDI1NjsgLy8gRG9uJ3QgdXNlIGJpdC1zaGlmdGluZyBoZXJlIVxuICAgIH1cblxuICAgIHRoaXMuY29tcHJlc3NfKHRoaXMuYnVmXyk7XG5cbiAgICBsZXQgbiA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA1OyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSAyNDsgaiA+PSAwOyBqIC09IDgpIHtcbiAgICAgICAgZGlnZXN0W25dID0gKHRoaXMuY2hhaW5fW2ldID4+IGopICYgMjU1O1xuICAgICAgICArK247XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkaWdlc3Q7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuZXhwb3J0IHR5cGUgTmV4dEZuPFQ+ID0gKHZhbHVlOiBUKSA9PiB2b2lkO1xuZXhwb3J0IHR5cGUgRXJyb3JGbiA9IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG5leHBvcnQgdHlwZSBDb21wbGV0ZUZuID0gKCkgPT4gdm9pZDtcblxuZXhwb3J0IGludGVyZmFjZSBPYnNlcnZlcjxUPiB7XG4gIC8vIENhbGxlZCBvbmNlIGZvciBlYWNoIHZhbHVlIGluIGEgc3RyZWFtIG9mIHZhbHVlcy5cbiAgbmV4dDogTmV4dEZuPFQ+O1xuXG4gIC8vIEEgc3RyZWFtIHRlcm1pbmF0ZXMgYnkgYSBzaW5nbGUgY2FsbCB0byBFSVRIRVIgZXJyb3IoKSBvciBjb21wbGV0ZSgpLlxuICBlcnJvcjogRXJyb3JGbjtcblxuICAvLyBObyBldmVudHMgd2lsbCBiZSBzZW50IHRvIG5leHQoKSBvbmNlIGNvbXBsZXRlKCkgaXMgY2FsbGVkLlxuICBjb21wbGV0ZTogQ29tcGxldGVGbjtcbn1cblxuZXhwb3J0IHR5cGUgUGFydGlhbE9ic2VydmVyPFQ+ID0gUGFydGlhbDxPYnNlcnZlcjxUPj47XG5cbi8vIFRPRE86IFN1cHBvcnQgYWxzbyBVbnN1YnNjcmliZS51bnN1YnNjcmliZT9cbmV4cG9ydCB0eXBlIFVuc3Vic2NyaWJlID0gKCkgPT4gdm9pZDtcblxuLyoqXG4gKiBUaGUgU3Vic2NyaWJlIGludGVyZmFjZSBoYXMgdHdvIGZvcm1zIC0gcGFzc2luZyB0aGUgaW5saW5lIGZ1bmN0aW9uXG4gKiBjYWxsYmFja3MsIG9yIGEgb2JqZWN0IGludGVyZmFjZSB3aXRoIGNhbGxiYWNrIHByb3BlcnRpZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3Vic2NyaWJlPFQ+IHtcbiAgKG5leHQ/OiBOZXh0Rm48VD4sIGVycm9yPzogRXJyb3JGbiwgY29tcGxldGU/OiBDb21wbGV0ZUZuKTogVW5zdWJzY3JpYmU7XG4gIChvYnNlcnZlcjogUGFydGlhbE9ic2VydmVyPFQ+KTogVW5zdWJzY3JpYmU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT2JzZXJ2YWJsZTxUPiB7XG4gIC8vIFN1YnNjcmliZSBtZXRob2RcbiAgc3Vic2NyaWJlOiBTdWJzY3JpYmU8VD47XG59XG5cbmV4cG9ydCB0eXBlIEV4ZWN1dG9yPFQ+ID0gKG9ic2VydmVyOiBPYnNlcnZlcjxUPikgPT4gdm9pZDtcblxuLyoqXG4gKiBIZWxwZXIgdG8gbWFrZSBhIFN1YnNjcmliZSBmdW5jdGlvbiAoanVzdCBsaWtlIFByb21pc2UgaGVscHMgbWFrZSBhXG4gKiBUaGVuYWJsZSkuXG4gKlxuICogQHBhcmFtIGV4ZWN1dG9yIEZ1bmN0aW9uIHdoaWNoIGNhbiBtYWtlIGNhbGxzIHRvIGEgc2luZ2xlIE9ic2VydmVyXG4gKiAgICAgYXMgYSBwcm94eS5cbiAqIEBwYXJhbSBvbk5vT2JzZXJ2ZXJzIENhbGxiYWNrIHdoZW4gY291bnQgb2YgT2JzZXJ2ZXJzIGdvZXMgdG8gemVyby5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN1YnNjcmliZTxUPihcbiAgZXhlY3V0b3I6IEV4ZWN1dG9yPFQ+LFxuICBvbk5vT2JzZXJ2ZXJzPzogRXhlY3V0b3I8VD5cbik6IFN1YnNjcmliZTxUPiB7XG4gIGNvbnN0IHByb3h5ID0gbmV3IE9ic2VydmVyUHJveHk8VD4oZXhlY3V0b3IsIG9uTm9PYnNlcnZlcnMpO1xuICByZXR1cm4gcHJveHkuc3Vic2NyaWJlLmJpbmQocHJveHkpO1xufVxuXG4vKipcbiAqIEltcGxlbWVudCBmYW4tb3V0IGZvciBhbnkgbnVtYmVyIG9mIE9ic2VydmVycyBhdHRhY2hlZCB2aWEgYSBzdWJzY3JpYmVcbiAqIGZ1bmN0aW9uLlxuICovXG5jbGFzcyBPYnNlcnZlclByb3h5PFQ+IGltcGxlbWVudHMgT2JzZXJ2ZXI8VD4ge1xuICBwcml2YXRlIG9ic2VydmVyczogQXJyYXk8T2JzZXJ2ZXI8VD4+IHwgdW5kZWZpbmVkID0gW107XG4gIHByaXZhdGUgdW5zdWJzY3JpYmVzOiBVbnN1YnNjcmliZVtdID0gW107XG4gIHByaXZhdGUgb25Ob09ic2VydmVyczogRXhlY3V0b3I8VD4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgb2JzZXJ2ZXJDb3VudCA9IDA7XG4gIC8vIE1pY3JvLXRhc2sgc2NoZWR1bGluZyBieSBjYWxsaW5nIHRhc2sudGhlbigpLlxuICBwcml2YXRlIHRhc2sgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgcHJpdmF0ZSBmaW5hbGl6ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBmaW5hbEVycm9yPzogRXJyb3I7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBleGVjdXRvciBGdW5jdGlvbiB3aGljaCBjYW4gbWFrZSBjYWxscyB0byBhIHNpbmdsZSBPYnNlcnZlclxuICAgKiAgICAgYXMgYSBwcm94eS5cbiAgICogQHBhcmFtIG9uTm9PYnNlcnZlcnMgQ2FsbGJhY2sgd2hlbiBjb3VudCBvZiBPYnNlcnZlcnMgZ29lcyB0byB6ZXJvLlxuICAgKi9cbiAgY29uc3RydWN0b3IoZXhlY3V0b3I6IEV4ZWN1dG9yPFQ+LCBvbk5vT2JzZXJ2ZXJzPzogRXhlY3V0b3I8VD4pIHtcbiAgICB0aGlzLm9uTm9PYnNlcnZlcnMgPSBvbk5vT2JzZXJ2ZXJzO1xuICAgIC8vIENhbGwgdGhlIGV4ZWN1dG9yIGFzeW5jaHJvbm91c2x5IHNvIHN1YnNjcmliZXJzIHRoYXQgYXJlIGNhbGxlZFxuICAgIC8vIHN5bmNocm9ub3VzbHkgYWZ0ZXIgdGhlIGNyZWF0aW9uIG9mIHRoZSBzdWJzY3JpYmUgZnVuY3Rpb25cbiAgICAvLyBjYW4gc3RpbGwgcmVjZWl2ZSB0aGUgdmVyeSBmaXJzdCB2YWx1ZSBnZW5lcmF0ZWQgaW4gdGhlIGV4ZWN1dG9yLlxuICAgIHRoaXMudGFza1xuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICBleGVjdXRvcih0aGlzKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZSA9PiB7XG4gICAgICAgIHRoaXMuZXJyb3IoZSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIG5leHQodmFsdWU6IFQpOiB2b2lkIHtcbiAgICB0aGlzLmZvckVhY2hPYnNlcnZlcigob2JzZXJ2ZXI6IE9ic2VydmVyPFQ+KSA9PiB7XG4gICAgICBvYnNlcnZlci5uZXh0KHZhbHVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIGVycm9yKGVycm9yOiBFcnJvcik6IHZvaWQge1xuICAgIHRoaXMuZm9yRWFjaE9ic2VydmVyKChvYnNlcnZlcjogT2JzZXJ2ZXI8VD4pID0+IHtcbiAgICAgIG9ic2VydmVyLmVycm9yKGVycm9yKTtcbiAgICB9KTtcbiAgICB0aGlzLmNsb3NlKGVycm9yKTtcbiAgfVxuXG4gIGNvbXBsZXRlKCk6IHZvaWQge1xuICAgIHRoaXMuZm9yRWFjaE9ic2VydmVyKChvYnNlcnZlcjogT2JzZXJ2ZXI8VD4pID0+IHtcbiAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgfSk7XG4gICAgdGhpcy5jbG9zZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZSBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGFkZCBhbiBPYnNlcnZlciB0byB0aGUgZmFuLW91dCBsaXN0LlxuICAgKlxuICAgKiAtIFdlIHJlcXVpcmUgdGhhdCBubyBldmVudCBpcyBzZW50IHRvIGEgc3Vic2NyaWJlciBzeWNocm9ub3VzbHkgdG8gdGhlaXJcbiAgICogICBjYWxsIHRvIHN1YnNjcmliZSgpLlxuICAgKi9cbiAgc3Vic2NyaWJlKFxuICAgIG5leHRPck9ic2VydmVyPzogTmV4dEZuPFQ+IHwgUGFydGlhbE9ic2VydmVyPFQ+LFxuICAgIGVycm9yPzogRXJyb3JGbixcbiAgICBjb21wbGV0ZT86IENvbXBsZXRlRm5cbiAgKTogVW5zdWJzY3JpYmUge1xuICAgIGxldCBvYnNlcnZlcjogT2JzZXJ2ZXI8VD47XG5cbiAgICBpZiAoXG4gICAgICBuZXh0T3JPYnNlcnZlciA9PT0gdW5kZWZpbmVkICYmXG4gICAgICBlcnJvciA9PT0gdW5kZWZpbmVkICYmXG4gICAgICBjb21wbGV0ZSA9PT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgT2JzZXJ2ZXIuJyk7XG4gICAgfVxuXG4gICAgLy8gQXNzZW1ibGUgYW4gT2JzZXJ2ZXIgb2JqZWN0IHdoZW4gcGFzc2VkIGFzIGNhbGxiYWNrIGZ1bmN0aW9ucy5cbiAgICBpZiAoXG4gICAgICBpbXBsZW1lbnRzQW55TWV0aG9kcyhuZXh0T3JPYnNlcnZlciBhcyB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSwgW1xuICAgICAgICAnbmV4dCcsXG4gICAgICAgICdlcnJvcicsXG4gICAgICAgICdjb21wbGV0ZSdcbiAgICAgIF0pXG4gICAgKSB7XG4gICAgICBvYnNlcnZlciA9IG5leHRPck9ic2VydmVyIGFzIE9ic2VydmVyPFQ+O1xuICAgIH0gZWxzZSB7XG4gICAgICBvYnNlcnZlciA9IHtcbiAgICAgICAgbmV4dDogbmV4dE9yT2JzZXJ2ZXIgYXMgTmV4dEZuPFQ+LFxuICAgICAgICBlcnJvcixcbiAgICAgICAgY29tcGxldGVcbiAgICAgIH0gYXMgT2JzZXJ2ZXI8VD47XG4gICAgfVxuXG4gICAgaWYgKG9ic2VydmVyLm5leHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgb2JzZXJ2ZXIubmV4dCA9IG5vb3AgYXMgTmV4dEZuPFQ+O1xuICAgIH1cbiAgICBpZiAob2JzZXJ2ZXIuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgb2JzZXJ2ZXIuZXJyb3IgPSBub29wIGFzIEVycm9yRm47XG4gICAgfVxuICAgIGlmIChvYnNlcnZlci5jb21wbGV0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBvYnNlcnZlci5jb21wbGV0ZSA9IG5vb3AgYXMgQ29tcGxldGVGbjtcbiAgICB9XG5cbiAgICBjb25zdCB1bnN1YiA9IHRoaXMudW5zdWJzY3JpYmVPbmUuYmluZCh0aGlzLCB0aGlzLm9ic2VydmVycyEubGVuZ3RoKTtcblxuICAgIC8vIEF0dGVtcHQgdG8gc3Vic2NyaWJlIHRvIGEgdGVybWluYXRlZCBPYnNlcnZhYmxlIC0gd2VcbiAgICAvLyBqdXN0IHJlc3BvbmQgdG8gdGhlIE9ic2VydmVyIHdpdGggdGhlIGZpbmFsIGVycm9yIG9yIGNvbXBsZXRlXG4gICAgLy8gZXZlbnQuXG4gICAgaWYgKHRoaXMuZmluYWxpemVkKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXG4gICAgICB0aGlzLnRhc2sudGhlbigoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKHRoaXMuZmluYWxFcnJvcikge1xuICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IodGhpcy5maW5hbEVycm9yKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAvLyBub3RoaW5nXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5vYnNlcnZlcnMhLnB1c2gob2JzZXJ2ZXIgYXMgT2JzZXJ2ZXI8VD4pO1xuXG4gICAgcmV0dXJuIHVuc3ViO1xuICB9XG5cbiAgLy8gVW5zdWJzY3JpYmUgaXMgc3luY2hyb25vdXMgLSB3ZSBndWFyYW50ZWUgdGhhdCBubyBldmVudHMgYXJlIHNlbnQgdG9cbiAgLy8gYW55IHVuc3Vic2NyaWJlZCBPYnNlcnZlci5cbiAgcHJpdmF0ZSB1bnN1YnNjcmliZU9uZShpOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vYnNlcnZlcnMgPT09IHVuZGVmaW5lZCB8fCB0aGlzLm9ic2VydmVyc1tpXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGVsZXRlIHRoaXMub2JzZXJ2ZXJzW2ldO1xuXG4gICAgdGhpcy5vYnNlcnZlckNvdW50IC09IDE7XG4gICAgaWYgKHRoaXMub2JzZXJ2ZXJDb3VudCA9PT0gMCAmJiB0aGlzLm9uTm9PYnNlcnZlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5vbk5vT2JzZXJ2ZXJzKHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZm9yRWFjaE9ic2VydmVyKGZuOiAob2JzZXJ2ZXI6IE9ic2VydmVyPFQ+KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZmluYWxpemVkKSB7XG4gICAgICAvLyBBbHJlYWR5IGNsb3NlZCBieSBwcmV2aW91cyBldmVudC4uLi5qdXN0IGVhdCB0aGUgYWRkaXRpb25hbCB2YWx1ZXMuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2luY2Ugc2VuZE9uZSBjYWxscyBhc3luY2hyb25vdXNseSAtIHRoZXJlIGlzIG5vIGNoYW5jZSB0aGF0XG4gICAgLy8gdGhpcy5vYnNlcnZlcnMgd2lsbCBiZWNvbWUgdW5kZWZpbmVkLlxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vYnNlcnZlcnMhLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnNlbmRPbmUoaSwgZm4pO1xuICAgIH1cbiAgfVxuXG4gIC8vIENhbGwgdGhlIE9ic2VydmVyIHZpYSBvbmUgb2YgaXQncyBjYWxsYmFjayBmdW5jdGlvbi4gV2UgYXJlIGNhcmVmdWwgdG9cbiAgLy8gY29uZmlybSB0aGF0IHRoZSBvYnNlcnZlIGhhcyBub3QgYmVlbiB1bnN1YnNjcmliZWQgc2luY2UgdGhpcyBhc3luY2hyb25vdXNcbiAgLy8gZnVuY3Rpb24gaGFkIGJlZW4gcXVldWVkLlxuICBwcml2YXRlIHNlbmRPbmUoaTogbnVtYmVyLCBmbjogKG9ic2VydmVyOiBPYnNlcnZlcjxUPikgPT4gdm9pZCk6IHZvaWQge1xuICAgIC8vIEV4ZWN1dGUgdGhlIGNhbGxiYWNrIGFzeW5jaHJvbm91c2x5XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1mbG9hdGluZy1wcm9taXNlc1xuICAgIHRoaXMudGFzay50aGVuKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLm9ic2VydmVycyAhPT0gdW5kZWZpbmVkICYmIHRoaXMub2JzZXJ2ZXJzW2ldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmbih0aGlzLm9ic2VydmVyc1tpXSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAvLyBJZ25vcmUgZXhjZXB0aW9ucyByYWlzZWQgaW4gT2JzZXJ2ZXJzIG9yIG1pc3NpbmcgbWV0aG9kcyBvZiBhblxuICAgICAgICAgIC8vIE9ic2VydmVyLlxuICAgICAgICAgIC8vIExvZyBlcnJvciB0byBjb25zb2xlLiBiLzMxNDA0ODA2XG4gICAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJiBjb25zb2xlLmVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9zZShlcnI/OiBFcnJvcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmZpbmFsaXplZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmZpbmFsaXplZCA9IHRydWU7XG4gICAgaWYgKGVyciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmZpbmFsRXJyb3IgPSBlcnI7XG4gICAgfVxuICAgIC8vIFByb3h5IGlzIG5vIGxvbmdlciBuZWVkZWQgLSBnYXJiYWdlIGNvbGxlY3QgcmVmZXJlbmNlc1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcbiAgICB0aGlzLnRhc2sudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLm9ic2VydmVycyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMub25Ob09ic2VydmVycyA9IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgfVxufVxuXG4vKiogVHVybiBzeW5jaHJvbm91cyBmdW5jdGlvbiBpbnRvIG9uZSBjYWxsZWQgYXN5bmNocm9ub3VzbHkuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuZXhwb3J0IGZ1bmN0aW9uIGFzeW5jKGZuOiBGdW5jdGlvbiwgb25FcnJvcj86IEVycm9yRm4pOiBGdW5jdGlvbiB7XG4gIHJldHVybiAoLi4uYXJnczogdW5rbm93bltdKSA9PiB7XG4gICAgUHJvbWlzZS5yZXNvbHZlKHRydWUpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIGZuKC4uLmFyZ3MpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgIGlmIChvbkVycm9yKSB7XG4gICAgICAgICAgb25FcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9O1xufVxuXG4vKipcbiAqIFJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgcGFzc2VkIGluIGltcGxlbWVudHMgYW55IG9mIHRoZSBuYW1lZCBtZXRob2RzLlxuICovXG5mdW5jdGlvbiBpbXBsZW1lbnRzQW55TWV0aG9kcyhcbiAgb2JqOiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSxcbiAgbWV0aG9kczogc3RyaW5nW11cbik6IGJvb2xlYW4ge1xuICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgb2JqID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZm9yIChjb25zdCBtZXRob2Qgb2YgbWV0aG9kcykge1xuICAgIGlmIChtZXRob2QgaW4gb2JqICYmIHR5cGVvZiBvYmpbbWV0aG9kXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBub29wKCk6IHZvaWQge1xuICAvLyBkbyBub3RoaW5nXG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLyoqXG4gKiBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiBhcmd1bWVudHMgYXJlIHByb3ZpZGVkIGZvciBhIHB1YmxpYyBmdW5jdGlvbi5cbiAqIFRocm93cyBhbiBlcnJvciBpZiBpdCBmYWlscy5cbiAqXG4gKiBAcGFyYW0gZm5OYW1lIFRoZSBmdW5jdGlvbiBuYW1lXG4gKiBAcGFyYW0gbWluQ291bnQgVGhlIG1pbmltdW0gbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBhbGxvdyBmb3IgdGhlIGZ1bmN0aW9uIGNhbGxcbiAqIEBwYXJhbSBtYXhDb3VudCBUaGUgbWF4aW11bSBudW1iZXIgb2YgYXJndW1lbnQgdG8gYWxsb3cgZm9yIHRoZSBmdW5jdGlvbiBjYWxsXG4gKiBAcGFyYW0gYXJnQ291bnQgVGhlIGFjdHVhbCBudW1iZXIgb2YgYXJndW1lbnRzIHByb3ZpZGVkLlxuICovXG5leHBvcnQgY29uc3QgdmFsaWRhdGVBcmdDb3VudCA9IGZ1bmN0aW9uIChcbiAgZm5OYW1lOiBzdHJpbmcsXG4gIG1pbkNvdW50OiBudW1iZXIsXG4gIG1heENvdW50OiBudW1iZXIsXG4gIGFyZ0NvdW50OiBudW1iZXJcbik6IHZvaWQge1xuICBsZXQgYXJnRXJyb3I7XG4gIGlmIChhcmdDb3VudCA8IG1pbkNvdW50KSB7XG4gICAgYXJnRXJyb3IgPSAnYXQgbGVhc3QgJyArIG1pbkNvdW50O1xuICB9IGVsc2UgaWYgKGFyZ0NvdW50ID4gbWF4Q291bnQpIHtcbiAgICBhcmdFcnJvciA9IG1heENvdW50ID09PSAwID8gJ25vbmUnIDogJ25vIG1vcmUgdGhhbiAnICsgbWF4Q291bnQ7XG4gIH1cbiAgaWYgKGFyZ0Vycm9yKSB7XG4gICAgY29uc3QgZXJyb3IgPVxuICAgICAgZm5OYW1lICtcbiAgICAgICcgZmFpbGVkOiBXYXMgY2FsbGVkIHdpdGggJyArXG4gICAgICBhcmdDb3VudCArXG4gICAgICAoYXJnQ291bnQgPT09IDEgPyAnIGFyZ3VtZW50LicgOiAnIGFyZ3VtZW50cy4nKSArXG4gICAgICAnIEV4cGVjdHMgJyArXG4gICAgICBhcmdFcnJvciArXG4gICAgICAnLic7XG4gICAgdGhyb3cgbmV3IEVycm9yKGVycm9yKTtcbiAgfVxufTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBzdHJpbmcgdG8gcHJlZml4IGFuIGVycm9yIG1lc3NhZ2UgYWJvdXQgZmFpbGVkIGFyZ3VtZW50IHZhbGlkYXRpb25cbiAqXG4gKiBAcGFyYW0gZm5OYW1lIFRoZSBmdW5jdGlvbiBuYW1lXG4gKiBAcGFyYW0gYXJnTmFtZSBUaGUgbmFtZSBvZiB0aGUgYXJndW1lbnRcbiAqIEByZXR1cm4gVGhlIHByZWZpeCB0byBhZGQgdG8gdGhlIGVycm9yIHRocm93biBmb3IgdmFsaWRhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yUHJlZml4KGZuTmFtZTogc3RyaW5nLCBhcmdOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7Zm5OYW1lfSBmYWlsZWQ6ICR7YXJnTmFtZX0gYXJndW1lbnQgYDtcbn1cblxuLyoqXG4gKiBAcGFyYW0gZm5OYW1lXG4gKiBAcGFyYW0gYXJndW1lbnROdW1iZXJcbiAqIEBwYXJhbSBuYW1lc3BhY2VcbiAqIEBwYXJhbSBvcHRpb25hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVOYW1lc3BhY2UoXG4gIGZuTmFtZTogc3RyaW5nLFxuICBuYW1lc3BhY2U6IHN0cmluZyxcbiAgb3B0aW9uYWw6IGJvb2xlYW5cbik6IHZvaWQge1xuICBpZiAob3B0aW9uYWwgJiYgIW5hbWVzcGFjZSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAodHlwZW9mIG5hbWVzcGFjZSAhPT0gJ3N0cmluZycpIHtcbiAgICAvL1RPRE86IEkgc2hvdWxkIGRvIG1vcmUgdmFsaWRhdGlvbiBoZXJlLiBXZSBvbmx5IGFsbG93IGNlcnRhaW4gY2hhcnMgaW4gbmFtZXNwYWNlcy5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBlcnJvclByZWZpeChmbk5hbWUsICduYW1lc3BhY2UnKSArICdtdXN0IGJlIGEgdmFsaWQgZmlyZWJhc2UgbmFtZXNwYWNlLidcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUNhbGxiYWNrKFxuICBmbk5hbWU6IHN0cmluZyxcbiAgYXJndW1lbnROYW1lOiBzdHJpbmcsXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXG4gIGNhbGxiYWNrOiBGdW5jdGlvbixcbiAgb3B0aW9uYWw6IGJvb2xlYW5cbik6IHZvaWQge1xuICBpZiAob3B0aW9uYWwgJiYgIWNhbGxiYWNrKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBlcnJvclByZWZpeChmbk5hbWUsIGFyZ3VtZW50TmFtZSkgKyAnbXVzdCBiZSBhIHZhbGlkIGZ1bmN0aW9uLidcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUNvbnRleHRPYmplY3QoXG4gIGZuTmFtZTogc3RyaW5nLFxuICBhcmd1bWVudE5hbWU6IHN0cmluZyxcbiAgY29udGV4dDogdW5rbm93bixcbiAgb3B0aW9uYWw6IGJvb2xlYW5cbik6IHZvaWQge1xuICBpZiAob3B0aW9uYWwgJiYgIWNvbnRleHQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHR5cGVvZiBjb250ZXh0ICE9PSAnb2JqZWN0JyB8fCBjb250ZXh0ID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgZXJyb3JQcmVmaXgoZm5OYW1lLCBhcmd1bWVudE5hbWUpICsgJ211c3QgYmUgYSB2YWxpZCBjb250ZXh0IG9iamVjdC4nXG4gICAgKTtcbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4vYXNzZXJ0JztcblxuLy8gQ29kZSBvcmlnaW5hbGx5IGNhbWUgZnJvbSBnb29nLmNyeXB0LnN0cmluZ1RvVXRmOEJ5dGVBcnJheSwgYnV0IGZvciBzb21lIHJlYXNvbiB0aGV5XG4vLyBhdXRvbWF0aWNhbGx5IHJlcGxhY2VkICdcXHJcXG4nIHdpdGggJ1xcbicsIGFuZCB0aGV5IGRpZG4ndCBoYW5kbGUgc3Vycm9nYXRlIHBhaXJzLFxuLy8gc28gaXQncyBiZWVuIG1vZGlmaWVkLlxuXG4vLyBOb3RlIHRoYXQgbm90IGFsbCBVbmljb2RlIGNoYXJhY3RlcnMgYXBwZWFyIGFzIHNpbmdsZSBjaGFyYWN0ZXJzIGluIEphdmFTY3JpcHQgc3RyaW5ncy5cbi8vIGZyb21DaGFyQ29kZSByZXR1cm5zIHRoZSBVVEYtMTYgZW5jb2Rpbmcgb2YgYSBjaGFyYWN0ZXIgLSBzbyBzb21lIFVuaWNvZGUgY2hhcmFjdGVyc1xuLy8gdXNlIDIgY2hhcmFjdGVycyBpbiBKYXZhc2NyaXB0LiAgQWxsIDQtYnl0ZSBVVEYtOCBjaGFyYWN0ZXJzIGJlZ2luIHdpdGggYSBmaXJzdFxuLy8gY2hhcmFjdGVyIGluIHRoZSByYW5nZSAweEQ4MDAgLSAweERCRkYgKHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYSBzby1jYWxsZWQgc3Vycm9nYXRlXG4vLyBwYWlyKS5cbi8vIFNlZSBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtMTUuMS4zXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybiB7QXJyYXl9XG4gKi9cbmV4cG9ydCBjb25zdCBzdHJpbmdUb0J5dGVBcnJheSA9IGZ1bmN0aW9uIChzdHI6IHN0cmluZyk6IG51bWJlcltdIHtcbiAgY29uc3Qgb3V0OiBudW1iZXJbXSA9IFtdO1xuICBsZXQgcCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IGMgPSBzdHIuY2hhckNvZGVBdChpKTtcblxuICAgIC8vIElzIHRoaXMgdGhlIGxlYWQgc3Vycm9nYXRlIGluIGEgc3Vycm9nYXRlIHBhaXI/XG4gICAgaWYgKGMgPj0gMHhkODAwICYmIGMgPD0gMHhkYmZmKSB7XG4gICAgICBjb25zdCBoaWdoID0gYyAtIDB4ZDgwMDsgLy8gdGhlIGhpZ2ggMTAgYml0cy5cbiAgICAgIGkrKztcbiAgICAgIGFzc2VydChpIDwgc3RyLmxlbmd0aCwgJ1N1cnJvZ2F0ZSBwYWlyIG1pc3NpbmcgdHJhaWwgc3Vycm9nYXRlLicpO1xuICAgICAgY29uc3QgbG93ID0gc3RyLmNoYXJDb2RlQXQoaSkgLSAweGRjMDA7IC8vIHRoZSBsb3cgMTAgYml0cy5cbiAgICAgIGMgPSAweDEwMDAwICsgKGhpZ2ggPDwgMTApICsgbG93O1xuICAgIH1cblxuICAgIGlmIChjIDwgMTI4KSB7XG4gICAgICBvdXRbcCsrXSA9IGM7XG4gICAgfSBlbHNlIGlmIChjIDwgMjA0OCkge1xuICAgICAgb3V0W3ArK10gPSAoYyA+PiA2KSB8IDE5MjtcbiAgICAgIG91dFtwKytdID0gKGMgJiA2MykgfCAxMjg7XG4gICAgfSBlbHNlIGlmIChjIDwgNjU1MzYpIHtcbiAgICAgIG91dFtwKytdID0gKGMgPj4gMTIpIHwgMjI0O1xuICAgICAgb3V0W3ArK10gPSAoKGMgPj4gNikgJiA2MykgfCAxMjg7XG4gICAgICBvdXRbcCsrXSA9IChjICYgNjMpIHwgMTI4O1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXRbcCsrXSA9IChjID4+IDE4KSB8IDI0MDtcbiAgICAgIG91dFtwKytdID0gKChjID4+IDEyKSAmIDYzKSB8IDEyODtcbiAgICAgIG91dFtwKytdID0gKChjID4+IDYpICYgNjMpIHwgMTI4O1xuICAgICAgb3V0W3ArK10gPSAoYyAmIDYzKSB8IDEyODtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlIGxlbmd0aCB3aXRob3V0IGFjdHVhbGx5IGNvbnZlcnRpbmc7IHVzZWZ1bCBmb3IgZG9pbmcgY2hlYXBlciB2YWxpZGF0aW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3Qgc3RyaW5nTGVuZ3RoID0gZnVuY3Rpb24gKHN0cjogc3RyaW5nKTogbnVtYmVyIHtcbiAgbGV0IHAgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGMgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICBpZiAoYyA8IDEyOCkge1xuICAgICAgcCsrO1xuICAgIH0gZWxzZSBpZiAoYyA8IDIwNDgpIHtcbiAgICAgIHAgKz0gMjtcbiAgICB9IGVsc2UgaWYgKGMgPj0gMHhkODAwICYmIGMgPD0gMHhkYmZmKSB7XG4gICAgICAvLyBMZWFkIHN1cnJvZ2F0ZSBvZiBhIHN1cnJvZ2F0ZSBwYWlyLiAgVGhlIHBhaXIgdG9nZXRoZXIgd2lsbCB0YWtlIDQgYnl0ZXMgdG8gcmVwcmVzZW50LlxuICAgICAgcCArPSA0O1xuICAgICAgaSsrOyAvLyBza2lwIHRyYWlsIHN1cnJvZ2F0ZS5cbiAgICB9IGVsc2Uge1xuICAgICAgcCArPSAzO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcDtcbn07XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLyoqXG4gKiBDb3BpZWQgZnJvbSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjExNzUyM1xuICogR2VuZXJhdGVzIGEgbmV3IHV1aWQuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB1dWlkdjQgPSBmdW5jdGlvbiAoKTogc3RyaW5nIHtcbiAgcmV0dXJuICd4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgnLnJlcGxhY2UoL1t4eV0vZywgYyA9PiB7XG4gICAgY29uc3QgciA9IChNYXRoLnJhbmRvbSgpICogMTYpIHwgMCxcbiAgICAgIHYgPSBjID09PSAneCcgPyByIDogKHIgJiAweDMpIHwgMHg4O1xuICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KTtcbiAgfSk7XG59O1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8qKlxuICogVGhlIGFtb3VudCBvZiBtaWxsaXNlY29uZHMgdG8gZXhwb25lbnRpYWxseSBpbmNyZWFzZS5cbiAqL1xuY29uc3QgREVGQVVMVF9JTlRFUlZBTF9NSUxMSVMgPSAxMDAwO1xuXG4vKipcbiAqIFRoZSBmYWN0b3IgdG8gYmFja29mZiBieS5cbiAqIFNob3VsZCBiZSBhIG51bWJlciBncmVhdGVyIHRoYW4gMS5cbiAqL1xuY29uc3QgREVGQVVMVF9CQUNLT0ZGX0ZBQ1RPUiA9IDI7XG5cbi8qKlxuICogVGhlIG1heGltdW0gbWlsbGlzZWNvbmRzIHRvIGluY3JlYXNlIHRvLlxuICpcbiAqIDxwPlZpc2libGUgZm9yIHRlc3RpbmdcbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9WQUxVRV9NSUxMSVMgPSA0ICogNjAgKiA2MCAqIDEwMDA7IC8vIEZvdXIgaG91cnMsIGxpa2UgaU9TIGFuZCBBbmRyb2lkLlxuXG4vKipcbiAqIFRoZSBwZXJjZW50YWdlIG9mIGJhY2tvZmYgdGltZSB0byByYW5kb21pemUgYnkuXG4gKiBTZWVcbiAqIGh0dHA6Ly9nby9zYWZlLWNsaWVudC1iZWhhdmlvciNzdGVwLTEtZGV0ZXJtaW5lLXRoZS1hcHByb3ByaWF0ZS1yZXRyeS1pbnRlcnZhbC10by1oYW5kbGUtc3Bpa2UtdHJhZmZpY1xuICogZm9yIGNvbnRleHQuXG4gKlxuICogPHA+VmlzaWJsZSBmb3IgdGVzdGluZ1xuICovXG5leHBvcnQgY29uc3QgUkFORE9NX0ZBQ1RPUiA9IDAuNTtcblxuLyoqXG4gKiBCYXNlZCBvbiB0aGUgYmFja29mZiBtZXRob2QgZnJvbVxuICogaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9jbG9zdXJlLWxpYnJhcnkvYmxvYi9tYXN0ZXIvY2xvc3VyZS9nb29nL21hdGgvZXhwb25lbnRpYWxiYWNrb2ZmLmpzLlxuICogRXh0cmFjdGVkIGhlcmUgc28gd2UgZG9uJ3QgbmVlZCB0byBwYXNzIG1ldGFkYXRhIGFuZCBhIHN0YXRlZnVsIEV4cG9uZW50aWFsQmFja29mZiBvYmplY3QgYXJvdW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlQmFja29mZk1pbGxpcyhcbiAgYmFja29mZkNvdW50OiBudW1iZXIsXG4gIGludGVydmFsTWlsbGlzOiBudW1iZXIgPSBERUZBVUxUX0lOVEVSVkFMX01JTExJUyxcbiAgYmFja29mZkZhY3RvcjogbnVtYmVyID0gREVGQVVMVF9CQUNLT0ZGX0ZBQ1RPUlxuKTogbnVtYmVyIHtcbiAgLy8gQ2FsY3VsYXRlcyBhbiBleHBvbmVudGlhbGx5IGluY3JlYXNpbmcgdmFsdWUuXG4gIC8vIERldmlhdGlvbjogY2FsY3VsYXRlcyB2YWx1ZSBmcm9tIGNvdW50IGFuZCBhIGNvbnN0YW50IGludGVydmFsLCBzbyB3ZSBvbmx5IG5lZWQgdG8gc2F2ZSB2YWx1ZVxuICAvLyBhbmQgY291bnQgdG8gcmVzdG9yZSBzdGF0ZS5cbiAgY29uc3QgY3VyckJhc2VWYWx1ZSA9IGludGVydmFsTWlsbGlzICogTWF0aC5wb3coYmFja29mZkZhY3RvciwgYmFja29mZkNvdW50KTtcblxuICAvLyBBIHJhbmRvbSBcImZ1enpcIiB0byBhdm9pZCB3YXZlcyBvZiByZXRyaWVzLlxuICAvLyBEZXZpYXRpb246IHJhbmRvbUZhY3RvciBpcyByZXF1aXJlZC5cbiAgY29uc3QgcmFuZG9tV2FpdCA9IE1hdGgucm91bmQoXG4gICAgLy8gQSBmcmFjdGlvbiBvZiB0aGUgYmFja29mZiB2YWx1ZSB0byBhZGQvc3VidHJhY3QuXG4gICAgLy8gRGV2aWF0aW9uOiBjaGFuZ2VzIG11bHRpcGxpY2F0aW9uIG9yZGVyIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkuXG4gICAgUkFORE9NX0ZBQ1RPUiAqXG4gICAgICBjdXJyQmFzZVZhbHVlICpcbiAgICAgIC8vIEEgcmFuZG9tIGZsb2F0IChyb3VuZGVkIHRvIGludCBieSBNYXRoLnJvdW5kIGFib3ZlKSBpbiB0aGUgcmFuZ2UgWy0xLCAxXS4gRGV0ZXJtaW5lc1xuICAgICAgLy8gaWYgd2UgYWRkIG9yIHN1YnRyYWN0LlxuICAgICAgKE1hdGgucmFuZG9tKCkgLSAwLjUpICpcbiAgICAgIDJcbiAgKTtcblxuICAvLyBMaW1pdHMgYmFja29mZiB0byBtYXggdG8gYXZvaWQgZWZmZWN0aXZlbHkgcGVybWFuZW50IGJhY2tvZmYuXG4gIHJldHVybiBNYXRoLm1pbihNQVhfVkFMVUVfTUlMTElTLCBjdXJyQmFzZVZhbHVlICsgcmFuZG9tV2FpdCk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLyoqXG4gKiBQcm92aWRlIEVuZ2xpc2ggb3JkaW5hbCBsZXR0ZXJzIGFmdGVyIGEgbnVtYmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcmRpbmFsKGk6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKGkpKSB7XG4gICAgcmV0dXJuIGAke2l9YDtcbiAgfVxuICByZXR1cm4gaSArIGluZGljYXRvcihpKTtcbn1cblxuZnVuY3Rpb24gaW5kaWNhdG9yKGk6IG51bWJlcik6IHN0cmluZyB7XG4gIGkgPSBNYXRoLmFicyhpKTtcbiAgY29uc3QgY2VudCA9IGkgJSAxMDA7XG4gIGlmIChjZW50ID49IDEwICYmIGNlbnQgPD0gMjApIHtcbiAgICByZXR1cm4gJ3RoJztcbiAgfVxuICBjb25zdCBkZWMgPSBpICUgMTA7XG4gIGlmIChkZWMgPT09IDEpIHtcbiAgICByZXR1cm4gJ3N0JztcbiAgfVxuICBpZiAoZGVjID09PSAyKSB7XG4gICAgcmV0dXJuICduZCc7XG4gIH1cbiAgaWYgKGRlYyA9PT0gMykge1xuICAgIHJldHVybiAncmQnO1xuICB9XG4gIHJldHVybiAndGgnO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGF0PFQ+IHtcbiAgX2RlbGVnYXRlOiBUO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9kdWxhckluc3RhbmNlPEV4cFNlcnZpY2U+KFxuICBzZXJ2aWNlOiBDb21wYXQ8RXhwU2VydmljZT4gfCBFeHBTZXJ2aWNlXG4pOiBFeHBTZXJ2aWNlIHtcbiAgaWYgKHNlcnZpY2UgJiYgKHNlcnZpY2UgYXMgQ29tcGF0PEV4cFNlcnZpY2U+KS5fZGVsZWdhdGUpIHtcbiAgICByZXR1cm4gKHNlcnZpY2UgYXMgQ29tcGF0PEV4cFNlcnZpY2U+KS5fZGVsZWdhdGU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHNlcnZpY2UgYXMgRXhwU2VydmljZTtcbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQge1xuICBJbnN0YW50aWF0aW9uTW9kZSxcbiAgSW5zdGFuY2VGYWN0b3J5LFxuICBDb21wb25lbnRUeXBlLFxuICBEaWN0aW9uYXJ5LFxuICBOYW1lLFxuICBvbkluc3RhbmNlQ3JlYXRlZENhbGxiYWNrXG59IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIENvbXBvbmVudCBmb3Igc2VydmljZSBuYW1lIFQsIGUuZy4gYGF1dGhgLCBgYXV0aC1pbnRlcm5hbGBcbiAqL1xuZXhwb3J0IGNsYXNzIENvbXBvbmVudDxUIGV4dGVuZHMgTmFtZSA9IE5hbWU+IHtcbiAgbXVsdGlwbGVJbnN0YW5jZXMgPSBmYWxzZTtcbiAgLyoqXG4gICAqIFByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gdGhlIHNlcnZpY2UgbmFtZXNwYWNlXG4gICAqL1xuICBzZXJ2aWNlUHJvcHM6IERpY3Rpb25hcnkgPSB7fTtcblxuICBpbnN0YW50aWF0aW9uTW9kZSA9IEluc3RhbnRpYXRpb25Nb2RlLkxBWlk7XG5cbiAgb25JbnN0YW5jZUNyZWF0ZWQ6IG9uSW5zdGFuY2VDcmVhdGVkQ2FsbGJhY2s8VD4gfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIG5hbWUgVGhlIHB1YmxpYyBzZXJ2aWNlIG5hbWUsIGUuZy4gYXBwLCBhdXRoLCBmaXJlc3RvcmUsIGRhdGFiYXNlXG4gICAqIEBwYXJhbSBpbnN0YW5jZUZhY3RvcnkgU2VydmljZSBmYWN0b3J5IHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGUgcHVibGljIGludGVyZmFjZVxuICAgKiBAcGFyYW0gdHlwZSB3aGV0aGVyIHRoZSBzZXJ2aWNlIHByb3ZpZGVkIGJ5IHRoZSBjb21wb25lbnQgaXMgcHVibGljIG9yIHByaXZhdGVcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IG5hbWU6IFQsXG4gICAgcmVhZG9ubHkgaW5zdGFuY2VGYWN0b3J5OiBJbnN0YW5jZUZhY3Rvcnk8VD4sXG4gICAgcmVhZG9ubHkgdHlwZTogQ29tcG9uZW50VHlwZVxuICApIHt9XG5cbiAgc2V0SW5zdGFudGlhdGlvbk1vZGUobW9kZTogSW5zdGFudGlhdGlvbk1vZGUpOiB0aGlzIHtcbiAgICB0aGlzLmluc3RhbnRpYXRpb25Nb2RlID0gbW9kZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldE11bHRpcGxlSW5zdGFuY2VzKG11bHRpcGxlSW5zdGFuY2VzOiBib29sZWFuKTogdGhpcyB7XG4gICAgdGhpcy5tdWx0aXBsZUluc3RhbmNlcyA9IG11bHRpcGxlSW5zdGFuY2VzO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0U2VydmljZVByb3BzKHByb3BzOiBEaWN0aW9uYXJ5KTogdGhpcyB7XG4gICAgdGhpcy5zZXJ2aWNlUHJvcHMgPSBwcm9wcztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldEluc3RhbmNlQ3JlYXRlZENhbGxiYWNrKGNhbGxiYWNrOiBvbkluc3RhbmNlQ3JlYXRlZENhbGxiYWNrPFQ+KTogdGhpcyB7XG4gICAgdGhpcy5vbkluc3RhbmNlQ3JlYXRlZCA9IGNhbGxiYWNrO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfRU5UUllfTkFNRSA9ICdbREVGQVVMVF0nO1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IERlZmVycmVkIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuaW1wb3J0IHsgQ29tcG9uZW50Q29udGFpbmVyIH0gZnJvbSAnLi9jb21wb25lbnRfY29udGFpbmVyJztcbmltcG9ydCB7IERFRkFVTFRfRU5UUllfTkFNRSB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7XG4gIEluaXRpYWxpemVPcHRpb25zLFxuICBJbnN0YW50aWF0aW9uTW9kZSxcbiAgTmFtZSxcbiAgTmFtZVNlcnZpY2VNYXBwaW5nLFxuICBPbkluaXRDYWxsQmFja1xufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50JztcblxuLyoqXG4gKiBQcm92aWRlciBmb3IgaW5zdGFuY2UgZm9yIHNlcnZpY2UgbmFtZSBULCBlLmcuICdhdXRoJywgJ2F1dGgtaW50ZXJuYWwnXG4gKiBOYW1lU2VydmljZU1hcHBpbmdbVF0gaXMgYW4gYWxpYXMgZm9yIHRoZSB0eXBlIG9mIHRoZSBpbnN0YW5jZVxuICovXG5leHBvcnQgY2xhc3MgUHJvdmlkZXI8VCBleHRlbmRzIE5hbWU+IHtcbiAgcHJpdmF0ZSBjb21wb25lbnQ6IENvbXBvbmVudDxUPiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IGluc3RhbmNlczogTWFwPHN0cmluZywgTmFtZVNlcnZpY2VNYXBwaW5nW1RdPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnN0YW5jZXNEZWZlcnJlZDogTWFwPFxuICAgIHN0cmluZyxcbiAgICBEZWZlcnJlZDxOYW1lU2VydmljZU1hcHBpbmdbVF0+XG4gID4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5zdGFuY2VzT3B0aW9uczogTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+ID1cbiAgICBuZXcgTWFwKCk7XG4gIHByaXZhdGUgb25Jbml0Q2FsbGJhY2tzOiBNYXA8c3RyaW5nLCBTZXQ8T25Jbml0Q2FsbEJhY2s8VD4+PiA9IG5ldyBNYXAoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IG5hbWU6IFQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lclxuICApIHt9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIEEgcHJvdmlkZXIgY2FuIHByb3ZpZGUgbXVsaXRwbGUgaW5zdGFuY2VzIG9mIGEgc2VydmljZVxuICAgKiBpZiB0aGlzLmNvbXBvbmVudC5tdWx0aXBsZUluc3RhbmNlcyBpcyB0cnVlLlxuICAgKi9cbiAgZ2V0KGlkZW50aWZpZXI/OiBzdHJpbmcpOiBQcm9taXNlPE5hbWVTZXJ2aWNlTWFwcGluZ1tUXT4ge1xuICAgIC8vIGlmIG11bHRpcGxlSW5zdGFuY2VzIGlzIG5vdCBzdXBwb3J0ZWQsIHVzZSB0aGUgZGVmYXVsdCBuYW1lXG4gICAgY29uc3Qgbm9ybWFsaXplZElkZW50aWZpZXIgPSB0aGlzLm5vcm1hbGl6ZUluc3RhbmNlSWRlbnRpZmllcihpZGVudGlmaWVyKTtcblxuICAgIGlmICghdGhpcy5pbnN0YW5jZXNEZWZlcnJlZC5oYXMobm9ybWFsaXplZElkZW50aWZpZXIpKSB7XG4gICAgICBjb25zdCBkZWZlcnJlZCA9IG5ldyBEZWZlcnJlZDxOYW1lU2VydmljZU1hcHBpbmdbVF0+KCk7XG4gICAgICB0aGlzLmluc3RhbmNlc0RlZmVycmVkLnNldChub3JtYWxpemVkSWRlbnRpZmllciwgZGVmZXJyZWQpO1xuXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuaXNJbml0aWFsaXplZChub3JtYWxpemVkSWRlbnRpZmllcikgfHxcbiAgICAgICAgdGhpcy5zaG91bGRBdXRvSW5pdGlhbGl6ZSgpXG4gICAgICApIHtcbiAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgc2VydmljZSBpZiBpdCBjYW4gYmUgYXV0by1pbml0aWFsaXplZFxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy5nZXRPckluaXRpYWxpemVTZXJ2aWNlKHtcbiAgICAgICAgICAgIGluc3RhbmNlSWRlbnRpZmllcjogbm9ybWFsaXplZElkZW50aWZpZXJcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoaW5zdGFuY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIHdoZW4gdGhlIGluc3RhbmNlIGZhY3RvcnkgdGhyb3dzIGFuIGV4Y2VwdGlvbiBkdXJpbmcgZ2V0KCksIGl0IHNob3VsZCBub3QgY2F1c2VcbiAgICAgICAgICAvLyBhIGZhdGFsIGVycm9yLiBXZSBqdXN0IHJldHVybiB0aGUgdW5yZXNvbHZlZCBwcm9taXNlIGluIHRoaXMgY2FzZS5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmluc3RhbmNlc0RlZmVycmVkLmdldChub3JtYWxpemVkSWRlbnRpZmllcikhLnByb21pc2U7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMuaWRlbnRpZmllciBBIHByb3ZpZGVyIGNhbiBwcm92aWRlIG11bGl0cGxlIGluc3RhbmNlcyBvZiBhIHNlcnZpY2VcbiAgICogaWYgdGhpcy5jb21wb25lbnQubXVsdGlwbGVJbnN0YW5jZXMgaXMgdHJ1ZS5cbiAgICogQHBhcmFtIG9wdGlvbnMub3B0aW9uYWwgSWYgb3B0aW9uYWwgaXMgZmFsc2Ugb3Igbm90IHByb3ZpZGVkLCB0aGUgbWV0aG9kIHRocm93cyBhbiBlcnJvciB3aGVuXG4gICAqIHRoZSBzZXJ2aWNlIGlzIG5vdCBpbW1lZGlhdGVseSBhdmFpbGFibGUuXG4gICAqIElmIG9wdGlvbmFsIGlzIHRydWUsIHRoZSBtZXRob2QgcmV0dXJucyBudWxsIGlmIHRoZSBzZXJ2aWNlIGlzIG5vdCBpbW1lZGlhdGVseSBhdmFpbGFibGUuXG4gICAqL1xuICBnZXRJbW1lZGlhdGUob3B0aW9uczoge1xuICAgIGlkZW50aWZpZXI/OiBzdHJpbmc7XG4gICAgb3B0aW9uYWw6IHRydWU7XG4gIH0pOiBOYW1lU2VydmljZU1hcHBpbmdbVF0gfCBudWxsO1xuICBnZXRJbW1lZGlhdGUob3B0aW9ucz86IHtcbiAgICBpZGVudGlmaWVyPzogc3RyaW5nO1xuICAgIG9wdGlvbmFsPzogZmFsc2U7XG4gIH0pOiBOYW1lU2VydmljZU1hcHBpbmdbVF07XG4gIGdldEltbWVkaWF0ZShvcHRpb25zPzoge1xuICAgIGlkZW50aWZpZXI/OiBzdHJpbmc7XG4gICAgb3B0aW9uYWw/OiBib29sZWFuO1xuICB9KTogTmFtZVNlcnZpY2VNYXBwaW5nW1RdIHwgbnVsbCB7XG4gICAgLy8gaWYgbXVsdGlwbGVJbnN0YW5jZXMgaXMgbm90IHN1cHBvcnRlZCwgdXNlIHRoZSBkZWZhdWx0IG5hbWVcbiAgICBjb25zdCBub3JtYWxpemVkSWRlbnRpZmllciA9IHRoaXMubm9ybWFsaXplSW5zdGFuY2VJZGVudGlmaWVyKFxuICAgICAgb3B0aW9ucz8uaWRlbnRpZmllclxuICAgICk7XG4gICAgY29uc3Qgb3B0aW9uYWwgPSBvcHRpb25zPy5vcHRpb25hbCA/PyBmYWxzZTtcblxuICAgIGlmIChcbiAgICAgIHRoaXMuaXNJbml0aWFsaXplZChub3JtYWxpemVkSWRlbnRpZmllcikgfHxcbiAgICAgIHRoaXMuc2hvdWxkQXV0b0luaXRpYWxpemUoKVxuICAgICkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T3JJbml0aWFsaXplU2VydmljZSh7XG4gICAgICAgICAgaW5zdGFuY2VJZGVudGlmaWVyOiBub3JtYWxpemVkSWRlbnRpZmllclxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKG9wdGlvbmFsKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJbiBjYXNlIGEgY29tcG9uZW50IGlzIG5vdCBpbml0aWFsaXplZCBhbmQgc2hvdWxkL2NhbiBub3QgYmUgYXV0by1pbml0aWFsaXplZCBhdCB0aGUgbW9tZW50LCByZXR1cm4gbnVsbCBpZiB0aGUgb3B0aW9uYWwgZmxhZyBpcyBzZXQsIG9yIHRocm93XG4gICAgICBpZiAob3B0aW9uYWwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBFcnJvcihgU2VydmljZSAke3RoaXMubmFtZX0gaXMgbm90IGF2YWlsYWJsZWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldENvbXBvbmVudCgpOiBDb21wb25lbnQ8VD4gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnQ7XG4gIH1cblxuICBzZXRDb21wb25lbnQoY29tcG9uZW50OiBDb21wb25lbnQ8VD4pOiB2b2lkIHtcbiAgICBpZiAoY29tcG9uZW50Lm5hbWUgIT09IHRoaXMubmFtZSkge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIGBNaXNtYXRjaGluZyBDb21wb25lbnQgJHtjb21wb25lbnQubmFtZX0gZm9yIFByb3ZpZGVyICR7dGhpcy5uYW1lfS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbXBvbmVudCkge1xuICAgICAgdGhyb3cgRXJyb3IoYENvbXBvbmVudCBmb3IgJHt0aGlzLm5hbWV9IGhhcyBhbHJlYWR5IGJlZW4gcHJvdmlkZWRgKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDtcblxuICAgIC8vIHJldHVybiBlYXJseSB3aXRob3V0IGF0dGVtcHRpbmcgdG8gaW5pdGlhbGl6ZSB0aGUgY29tcG9uZW50IGlmIHRoZSBjb21wb25lbnQgcmVxdWlyZXMgZXhwbGljaXQgaW5pdGlhbGl6YXRpb24gKGNhbGxpbmcgYFByb3ZpZGVyLmluaXRpYWxpemUoKWApXG4gICAgaWYgKCF0aGlzLnNob3VsZEF1dG9Jbml0aWFsaXplKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBpZiB0aGUgc2VydmljZSBpcyBlYWdlciwgaW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBpbnN0YW5jZVxuICAgIGlmIChpc0NvbXBvbmVudEVhZ2VyKGNvbXBvbmVudCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuZ2V0T3JJbml0aWFsaXplU2VydmljZSh7IGluc3RhbmNlSWRlbnRpZmllcjogREVGQVVMVF9FTlRSWV9OQU1FIH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyB3aGVuIHRoZSBpbnN0YW5jZSBmYWN0b3J5IGZvciBhbiBlYWdlciBDb21wb25lbnQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBkdXJpbmcgdGhlIGVhZ2VyXG4gICAgICAgIC8vIGluaXRpYWxpemF0aW9uLCBpdCBzaG91bGQgbm90IGNhdXNlIGEgZmF0YWwgZXJyb3IuXG4gICAgICAgIC8vIFRPRE86IEludmVzdGlnYXRlIGlmIHdlIG5lZWQgdG8gbWFrZSBpdCBjb25maWd1cmFibGUsIGJlY2F1c2Ugc29tZSBjb21wb25lbnQgbWF5IHdhbnQgdG8gY2F1c2VcbiAgICAgICAgLy8gYSBmYXRhbCBlcnJvciBpbiB0aGlzIGNhc2U/XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHNlcnZpY2UgaW5zdGFuY2VzIGZvciB0aGUgcGVuZGluZyBwcm9taXNlcyBhbmQgcmVzb2x2ZSB0aGVtXG4gICAgLy8gTk9URTogaWYgdGhpcy5tdWx0aXBsZUluc3RhbmNlcyBpcyBmYWxzZSwgb25seSB0aGUgZGVmYXVsdCBpbnN0YW5jZSB3aWxsIGJlIGNyZWF0ZWRcbiAgICAvLyBhbmQgYWxsIHByb21pc2VzIHdpdGggcmVzb2x2ZSB3aXRoIGl0IHJlZ2FyZGxlc3Mgb2YgdGhlIGlkZW50aWZpZXIuXG4gICAgZm9yIChjb25zdCBbXG4gICAgICBpbnN0YW5jZUlkZW50aWZpZXIsXG4gICAgICBpbnN0YW5jZURlZmVycmVkXG4gICAgXSBvZiB0aGlzLmluc3RhbmNlc0RlZmVycmVkLmVudHJpZXMoKSkge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZElkZW50aWZpZXIgPVxuICAgICAgICB0aGlzLm5vcm1hbGl6ZUluc3RhbmNlSWRlbnRpZmllcihpbnN0YW5jZUlkZW50aWZpZXIpO1xuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBgZ2V0T3JJbml0aWFsaXplU2VydmljZSgpYCBzaG91bGQgYWx3YXlzIHJldHVybiBhIHZhbGlkIGluc3RhbmNlIHNpbmNlIGEgY29tcG9uZW50IGlzIGd1YXJhbnRlZWQuIHVzZSAhIHRvIG1ha2UgdHlwZXNjcmlwdCBoYXBweS5cbiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLmdldE9ySW5pdGlhbGl6ZVNlcnZpY2Uoe1xuICAgICAgICAgIGluc3RhbmNlSWRlbnRpZmllcjogbm9ybWFsaXplZElkZW50aWZpZXJcbiAgICAgICAgfSkhO1xuICAgICAgICBpbnN0YW5jZURlZmVycmVkLnJlc29sdmUoaW5zdGFuY2UpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyB3aGVuIHRoZSBpbnN0YW5jZSBmYWN0b3J5IHRocm93cyBhbiBleGNlcHRpb24sIGl0IHNob3VsZCBub3QgY2F1c2VcbiAgICAgICAgLy8gYSBmYXRhbCBlcnJvci4gV2UganVzdCBsZWF2ZSB0aGUgcHJvbWlzZSB1bnJlc29sdmVkLlxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNsZWFySW5zdGFuY2UoaWRlbnRpZmllcjogc3RyaW5nID0gREVGQVVMVF9FTlRSWV9OQU1FKTogdm9pZCB7XG4gICAgdGhpcy5pbnN0YW5jZXNEZWZlcnJlZC5kZWxldGUoaWRlbnRpZmllcik7XG4gICAgdGhpcy5pbnN0YW5jZXNPcHRpb25zLmRlbGV0ZShpZGVudGlmaWVyKTtcbiAgICB0aGlzLmluc3RhbmNlcy5kZWxldGUoaWRlbnRpZmllcik7XG4gIH1cblxuICAvLyBhcHAuZGVsZXRlKCkgd2lsbCBjYWxsIHRoaXMgbWV0aG9kIG9uIGV2ZXJ5IHByb3ZpZGVyIHRvIGRlbGV0ZSB0aGUgc2VydmljZXNcbiAgLy8gVE9ETzogc2hvdWxkIHdlIG1hcmsgdGhlIHByb3ZpZGVyIGFzIGRlbGV0ZWQ/XG4gIGFzeW5jIGRlbGV0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzZXJ2aWNlcyA9IEFycmF5LmZyb20odGhpcy5pbnN0YW5jZXMudmFsdWVzKCkpO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgLi4uc2VydmljZXNcbiAgICAgICAgLmZpbHRlcihzZXJ2aWNlID0+ICdJTlRFUk5BTCcgaW4gc2VydmljZSkgLy8gbGVnYWN5IHNlcnZpY2VzXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIC5tYXAoc2VydmljZSA9PiAoc2VydmljZSBhcyBhbnkpLklOVEVSTkFMIS5kZWxldGUoKSksXG4gICAgICAuLi5zZXJ2aWNlc1xuICAgICAgICAuZmlsdGVyKHNlcnZpY2UgPT4gJ19kZWxldGUnIGluIHNlcnZpY2UpIC8vIG1vZHVsYXJpemVkIHNlcnZpY2VzXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIC5tYXAoc2VydmljZSA9PiAoc2VydmljZSBhcyBhbnkpLl9kZWxldGUoKSlcbiAgICBdKTtcbiAgfVxuXG4gIGlzQ29tcG9uZW50U2V0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbXBvbmVudCAhPSBudWxsO1xuICB9XG5cbiAgaXNJbml0aWFsaXplZChpZGVudGlmaWVyOiBzdHJpbmcgPSBERUZBVUxUX0VOVFJZX05BTUUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pbnN0YW5jZXMuaGFzKGlkZW50aWZpZXIpO1xuICB9XG5cbiAgZ2V0T3B0aW9ucyhpZGVudGlmaWVyOiBzdHJpbmcgPSBERUZBVUxUX0VOVFJZX05BTUUpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuaW5zdGFuY2VzT3B0aW9ucy5nZXQoaWRlbnRpZmllcikgfHwge307XG4gIH1cblxuICBpbml0aWFsaXplKG9wdHM6IEluaXRpYWxpemVPcHRpb25zID0ge30pOiBOYW1lU2VydmljZU1hcHBpbmdbVF0ge1xuICAgIGNvbnN0IHsgb3B0aW9ucyA9IHt9IH0gPSBvcHRzO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRJZGVudGlmaWVyID0gdGhpcy5ub3JtYWxpemVJbnN0YW5jZUlkZW50aWZpZXIoXG4gICAgICBvcHRzLmluc3RhbmNlSWRlbnRpZmllclxuICAgICk7XG4gICAgaWYgKHRoaXMuaXNJbml0aWFsaXplZChub3JtYWxpemVkSWRlbnRpZmllcikpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBgJHt0aGlzLm5hbWV9KCR7bm9ybWFsaXplZElkZW50aWZpZXJ9KSBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaXNDb21wb25lbnRTZXQoKSkge1xuICAgICAgdGhyb3cgRXJyb3IoYENvbXBvbmVudCAke3RoaXMubmFtZX0gaGFzIG5vdCBiZWVuIHJlZ2lzdGVyZWQgeWV0YCk7XG4gICAgfVxuXG4gICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLmdldE9ySW5pdGlhbGl6ZVNlcnZpY2Uoe1xuICAgICAgaW5zdGFuY2VJZGVudGlmaWVyOiBub3JtYWxpemVkSWRlbnRpZmllcixcbiAgICAgIG9wdGlvbnNcbiAgICB9KSE7XG5cbiAgICAvLyByZXNvbHZlIGFueSBwZW5kaW5nIHByb21pc2Ugd2FpdGluZyBmb3IgdGhlIHNlcnZpY2UgaW5zdGFuY2VcbiAgICBmb3IgKGNvbnN0IFtcbiAgICAgIGluc3RhbmNlSWRlbnRpZmllcixcbiAgICAgIGluc3RhbmNlRGVmZXJyZWRcbiAgICBdIG9mIHRoaXMuaW5zdGFuY2VzRGVmZXJyZWQuZW50cmllcygpKSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkRGVmZXJyZWRJZGVudGlmaWVyID1cbiAgICAgICAgdGhpcy5ub3JtYWxpemVJbnN0YW5jZUlkZW50aWZpZXIoaW5zdGFuY2VJZGVudGlmaWVyKTtcbiAgICAgIGlmIChub3JtYWxpemVkSWRlbnRpZmllciA9PT0gbm9ybWFsaXplZERlZmVycmVkSWRlbnRpZmllcikge1xuICAgICAgICBpbnN0YW5jZURlZmVycmVkLnJlc29sdmUoaW5zdGFuY2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBpbnZva2VkICBhZnRlciB0aGUgcHJvdmlkZXIgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYnkgY2FsbGluZyBwcm92aWRlci5pbml0aWFsaXplKCkuXG4gICAqIFRoZSBmdW5jdGlvbiBpcyBpbnZva2VkIFNZTkNIUk9OT1VTTFksIHNvIGl0IHNob3VsZCBub3QgZXhlY3V0ZSBhbnkgbG9uZ3J1bm5pbmcgdGFza3MgaW4gb3JkZXIgdG8gbm90IGJsb2NrIHRoZSBwcm9ncmFtLlxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBBbiBvcHRpb25hbCBpbnN0YW5jZSBpZGVudGlmaWVyXG4gICAqIEByZXR1cm5zIGEgZnVuY3Rpb24gdG8gdW5yZWdpc3RlciB0aGUgY2FsbGJhY2tcbiAgICovXG4gIG9uSW5pdChjYWxsYmFjazogT25Jbml0Q2FsbEJhY2s8VD4sIGlkZW50aWZpZXI/OiBzdHJpbmcpOiAoKSA9PiB2b2lkIHtcbiAgICBjb25zdCBub3JtYWxpemVkSWRlbnRpZmllciA9IHRoaXMubm9ybWFsaXplSW5zdGFuY2VJZGVudGlmaWVyKGlkZW50aWZpZXIpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ2FsbGJhY2tzID1cbiAgICAgIHRoaXMub25Jbml0Q2FsbGJhY2tzLmdldChub3JtYWxpemVkSWRlbnRpZmllcikgPz9cbiAgICAgIG5ldyBTZXQ8T25Jbml0Q2FsbEJhY2s8VD4+KCk7XG4gICAgZXhpc3RpbmdDYWxsYmFja3MuYWRkKGNhbGxiYWNrKTtcbiAgICB0aGlzLm9uSW5pdENhbGxiYWNrcy5zZXQobm9ybWFsaXplZElkZW50aWZpZXIsIGV4aXN0aW5nQ2FsbGJhY2tzKTtcblxuICAgIGNvbnN0IGV4aXN0aW5nSW5zdGFuY2UgPSB0aGlzLmluc3RhbmNlcy5nZXQobm9ybWFsaXplZElkZW50aWZpZXIpO1xuICAgIGlmIChleGlzdGluZ0luc3RhbmNlKSB7XG4gICAgICBjYWxsYmFjayhleGlzdGluZ0luc3RhbmNlLCBub3JtYWxpemVkSWRlbnRpZmllcik7XG4gICAgfVxuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGV4aXN0aW5nQ2FsbGJhY2tzLmRlbGV0ZShjYWxsYmFjayk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2Ugb25Jbml0IGNhbGxiYWNrcyBzeW5jaHJvbm91c2x5XG4gICAqIEBwYXJhbSBpbnN0YW5jZSB0aGUgc2VydmljZSBpbnN0YW5jZWBcbiAgICovXG4gIHByaXZhdGUgaW52b2tlT25Jbml0Q2FsbGJhY2tzKFxuICAgIGluc3RhbmNlOiBOYW1lU2VydmljZU1hcHBpbmdbVF0sXG4gICAgaWRlbnRpZmllcjogc3RyaW5nXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGNhbGxiYWNrcyA9IHRoaXMub25Jbml0Q2FsbGJhY2tzLmdldChpZGVudGlmaWVyKTtcbiAgICBpZiAoIWNhbGxiYWNrcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIGNhbGxiYWNrcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY2FsbGJhY2soaW5zdGFuY2UsIGlkZW50aWZpZXIpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIGlnbm9yZSBlcnJvcnMgaW4gdGhlIG9uSW5pdCBjYWxsYmFja1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3JJbml0aWFsaXplU2VydmljZSh7XG4gICAgaW5zdGFuY2VJZGVudGlmaWVyLFxuICAgIG9wdGlvbnMgPSB7fVxuICB9OiB7XG4gICAgaW5zdGFuY2VJZGVudGlmaWVyOiBzdHJpbmc7XG4gICAgb3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9KTogTmFtZVNlcnZpY2VNYXBwaW5nW1RdIHwgbnVsbCB7XG4gICAgbGV0IGluc3RhbmNlID0gdGhpcy5pbnN0YW5jZXMuZ2V0KGluc3RhbmNlSWRlbnRpZmllcik7XG4gICAgaWYgKCFpbnN0YW5jZSAmJiB0aGlzLmNvbXBvbmVudCkge1xuICAgICAgaW5zdGFuY2UgPSB0aGlzLmNvbXBvbmVudC5pbnN0YW5jZUZhY3RvcnkodGhpcy5jb250YWluZXIsIHtcbiAgICAgICAgaW5zdGFuY2VJZGVudGlmaWVyOiBub3JtYWxpemVJZGVudGlmaWVyRm9yRmFjdG9yeShpbnN0YW5jZUlkZW50aWZpZXIpLFxuICAgICAgICBvcHRpb25zXG4gICAgICB9KTtcbiAgICAgIHRoaXMuaW5zdGFuY2VzLnNldChpbnN0YW5jZUlkZW50aWZpZXIsIGluc3RhbmNlKTtcbiAgICAgIHRoaXMuaW5zdGFuY2VzT3B0aW9ucy5zZXQoaW5zdGFuY2VJZGVudGlmaWVyLCBvcHRpb25zKTtcblxuICAgICAgLyoqXG4gICAgICAgKiBJbnZva2Ugb25Jbml0IGxpc3RlbmVycy5cbiAgICAgICAqIE5vdGUgdGhpcy5jb21wb25lbnQub25JbnN0YW5jZUNyZWF0ZWQgaXMgZGlmZmVyZW50LCB3aGljaCBpcyB1c2VkIGJ5IHRoZSBjb21wb25lbnQgY3JlYXRvcixcbiAgICAgICAqIHdoaWxlIG9uSW5pdCBsaXN0ZW5lcnMgYXJlIHJlZ2lzdGVyZWQgYnkgY29uc3VtZXJzIG9mIHRoZSBwcm92aWRlci5cbiAgICAgICAqL1xuICAgICAgdGhpcy5pbnZva2VPbkluaXRDYWxsYmFja3MoaW5zdGFuY2UsIGluc3RhbmNlSWRlbnRpZmllcik7XG5cbiAgICAgIC8qKlxuICAgICAgICogT3JkZXIgaXMgaW1wb3J0YW50XG4gICAgICAgKiBvbkluc3RhbmNlQ3JlYXRlZCgpIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgdGhpcy5pbnN0YW5jZXMuc2V0KGluc3RhbmNlSWRlbnRpZmllciwgaW5zdGFuY2UpOyB3aGljaFxuICAgICAgICogbWFrZXMgYGlzSW5pdGlhbGl6ZWQoKWAgcmV0dXJuIHRydWUuXG4gICAgICAgKi9cbiAgICAgIGlmICh0aGlzLmNvbXBvbmVudC5vbkluc3RhbmNlQ3JlYXRlZCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMuY29tcG9uZW50Lm9uSW5zdGFuY2VDcmVhdGVkKFxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIsXG4gICAgICAgICAgICBpbnN0YW5jZUlkZW50aWZpZXIsXG4gICAgICAgICAgICBpbnN0YW5jZVxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIGlnbm9yZSBlcnJvcnMgaW4gdGhlIG9uSW5zdGFuY2VDcmVhdGVkQ2FsbGJhY2tcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpbnN0YW5jZSB8fCBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVJbnN0YW5jZUlkZW50aWZpZXIoXG4gICAgaWRlbnRpZmllcjogc3RyaW5nID0gREVGQVVMVF9FTlRSWV9OQU1FXG4gICk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuY29tcG9uZW50KSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21wb25lbnQubXVsdGlwbGVJbnN0YW5jZXMgPyBpZGVudGlmaWVyIDogREVGQVVMVF9FTlRSWV9OQU1FO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaWRlbnRpZmllcjsgLy8gYXNzdW1lIG11bHRpcGxlIGluc3RhbmNlcyBhcmUgc3VwcG9ydGVkIGJlZm9yZSB0aGUgY29tcG9uZW50IGlzIHByb3ZpZGVkLlxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkQXV0b0luaXRpYWxpemUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhdGhpcy5jb21wb25lbnQgJiZcbiAgICAgIHRoaXMuY29tcG9uZW50Lmluc3RhbnRpYXRpb25Nb2RlICE9PSBJbnN0YW50aWF0aW9uTW9kZS5FWFBMSUNJVFxuICAgICk7XG4gIH1cbn1cblxuLy8gdW5kZWZpbmVkIHNob3VsZCBiZSBwYXNzZWQgdG8gdGhlIHNlcnZpY2UgZmFjdG9yeSBmb3IgdGhlIGRlZmF1bHQgaW5zdGFuY2VcbmZ1bmN0aW9uIG5vcm1hbGl6ZUlkZW50aWZpZXJGb3JGYWN0b3J5KGlkZW50aWZpZXI6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBpZGVudGlmaWVyID09PSBERUZBVUxUX0VOVFJZX05BTUUgPyB1bmRlZmluZWQgOiBpZGVudGlmaWVyO1xufVxuXG5mdW5jdGlvbiBpc0NvbXBvbmVudEVhZ2VyPFQgZXh0ZW5kcyBOYW1lPihjb21wb25lbnQ6IENvbXBvbmVudDxUPik6IGJvb2xlYW4ge1xuICByZXR1cm4gY29tcG9uZW50Lmluc3RhbnRpYXRpb25Nb2RlID09PSBJbnN0YW50aWF0aW9uTW9kZS5FQUdFUjtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBQcm92aWRlciB9IGZyb20gJy4vcHJvdmlkZXInO1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnQnO1xuaW1wb3J0IHsgTmFtZSB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIENvbXBvbmVudENvbnRhaW5lciB0aGF0IHByb3ZpZGVzIFByb3ZpZGVycyBmb3Igc2VydmljZSBuYW1lIFQsIGUuZy4gYGF1dGhgLCBgYXV0aC1pbnRlcm5hbGBcbiAqL1xuZXhwb3J0IGNsYXNzIENvbXBvbmVudENvbnRhaW5lciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvdmlkZXJzID0gbmV3IE1hcDxzdHJpbmcsIFByb3ZpZGVyPE5hbWU+PigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgbmFtZTogc3RyaW5nKSB7fVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gY29tcG9uZW50IENvbXBvbmVudCBiZWluZyBhZGRlZFxuICAgKiBAcGFyYW0gb3ZlcndyaXRlIFdoZW4gYSBjb21wb25lbnQgd2l0aCB0aGUgc2FtZSBuYW1lIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCxcbiAgICogaWYgb3ZlcndyaXRlIGlzIHRydWU6IG92ZXJ3cml0ZSB0aGUgZXhpc3RpbmcgY29tcG9uZW50IHdpdGggdGhlIG5ldyBjb21wb25lbnQgYW5kIGNyZWF0ZSBhIG5ld1xuICAgKiBwcm92aWRlciB3aXRoIHRoZSBuZXcgY29tcG9uZW50LiBJdCBjYW4gYmUgdXNlZnVsIGluIHRlc3RzIHdoZXJlIHlvdSB3YW50IHRvIHVzZSBkaWZmZXJlbnQgbW9ja3NcbiAgICogZm9yIGRpZmZlcmVudCB0ZXN0cy5cbiAgICogaWYgb3ZlcndyaXRlIGlzIGZhbHNlOiB0aHJvdyBhbiBleGNlcHRpb25cbiAgICovXG4gIGFkZENvbXBvbmVudDxUIGV4dGVuZHMgTmFtZT4oY29tcG9uZW50OiBDb21wb25lbnQ8VD4pOiB2b2lkIHtcbiAgICBjb25zdCBwcm92aWRlciA9IHRoaXMuZ2V0UHJvdmlkZXIoY29tcG9uZW50Lm5hbWUpO1xuICAgIGlmIChwcm92aWRlci5pc0NvbXBvbmVudFNldCgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDb21wb25lbnQgJHtjb21wb25lbnQubmFtZX0gaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIHdpdGggJHt0aGlzLm5hbWV9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcm92aWRlci5zZXRDb21wb25lbnQoY29tcG9uZW50KTtcbiAgfVxuXG4gIGFkZE9yT3ZlcndyaXRlQ29tcG9uZW50PFQgZXh0ZW5kcyBOYW1lPihjb21wb25lbnQ6IENvbXBvbmVudDxUPik6IHZvaWQge1xuICAgIGNvbnN0IHByb3ZpZGVyID0gdGhpcy5nZXRQcm92aWRlcihjb21wb25lbnQubmFtZSk7XG4gICAgaWYgKHByb3ZpZGVyLmlzQ29tcG9uZW50U2V0KCkpIHtcbiAgICAgIC8vIGRlbGV0ZSB0aGUgZXhpc3RpbmcgcHJvdmlkZXIgZnJvbSB0aGUgY29udGFpbmVyLCBzbyB3ZSBjYW4gcmVnaXN0ZXIgdGhlIG5ldyBjb21wb25lbnRcbiAgICAgIHRoaXMucHJvdmlkZXJzLmRlbGV0ZShjb21wb25lbnQubmFtZSk7XG4gICAgfVxuXG4gICAgdGhpcy5hZGRDb21wb25lbnQoY29tcG9uZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXRQcm92aWRlciBwcm92aWRlcyBhIHR5cGUgc2FmZSBpbnRlcmZhY2Ugd2hlcmUgaXQgY2FuIG9ubHkgYmUgY2FsbGVkIHdpdGggYSBmaWVsZCBuYW1lXG4gICAqIHByZXNlbnQgaW4gTmFtZVNlcnZpY2VNYXBwaW5nIGludGVyZmFjZS5cbiAgICpcbiAgICogRmlyZWJhc2UgU0RLcyBwcm92aWRpbmcgc2VydmljZXMgc2hvdWxkIGV4dGVuZCBOYW1lU2VydmljZU1hcHBpbmcgaW50ZXJmYWNlIHRvIHJlZ2lzdGVyXG4gICAqIHRoZW1zZWx2ZXMuXG4gICAqL1xuICBnZXRQcm92aWRlcjxUIGV4dGVuZHMgTmFtZT4obmFtZTogVCk6IFByb3ZpZGVyPFQ+IHtcbiAgICBpZiAodGhpcy5wcm92aWRlcnMuaGFzKG5hbWUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm92aWRlcnMuZ2V0KG5hbWUpIGFzIHVua25vd24gYXMgUHJvdmlkZXI8VD47XG4gICAgfVxuXG4gICAgLy8gY3JlYXRlIGEgUHJvdmlkZXIgZm9yIGEgc2VydmljZSB0aGF0IGhhc24ndCByZWdpc3RlcmVkIHdpdGggRmlyZWJhc2VcbiAgICBjb25zdCBwcm92aWRlciA9IG5ldyBQcm92aWRlcjxUPihuYW1lLCB0aGlzKTtcbiAgICB0aGlzLnByb3ZpZGVycy5zZXQobmFtZSwgcHJvdmlkZXIgYXMgdW5rbm93biBhcyBQcm92aWRlcjxOYW1lPik7XG5cbiAgICByZXR1cm4gcHJvdmlkZXIgYXMgUHJvdmlkZXI8VD47XG4gIH1cblxuICBnZXRQcm92aWRlcnMoKTogQXJyYXk8UHJvdmlkZXI8TmFtZT4+IHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLnByb3ZpZGVycy52YWx1ZXMoKSk7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5leHBvcnQgdHlwZSBMb2dMZXZlbFN0cmluZyA9XG4gIHwgJ2RlYnVnJ1xuICB8ICd2ZXJib3NlJ1xuICB8ICdpbmZvJ1xuICB8ICd3YXJuJ1xuICB8ICdlcnJvcidcbiAgfCAnc2lsZW50JztcblxuZXhwb3J0IGludGVyZmFjZSBMb2dPcHRpb25zIHtcbiAgbGV2ZWw6IExvZ0xldmVsU3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBMb2dDYWxsYmFjayA9IChjYWxsYmFja1BhcmFtczogTG9nQ2FsbGJhY2tQYXJhbXMpID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9nQ2FsbGJhY2tQYXJhbXMge1xuICBsZXZlbDogTG9nTGV2ZWxTdHJpbmc7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgYXJnczogdW5rbm93bltdO1xuICB0eXBlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBjb250YWluZXIgZm9yIGFsbCBvZiB0aGUgTG9nZ2VyIGluc3RhbmNlc1xuICovXG5leHBvcnQgY29uc3QgaW5zdGFuY2VzOiBMb2dnZXJbXSA9IFtdO1xuXG4vKipcbiAqIFRoZSBKUyBTREsgc3VwcG9ydHMgNSBsb2cgbGV2ZWxzIGFuZCBhbHNvIGFsbG93cyBhIHVzZXIgdGhlIGFiaWxpdHkgdG9cbiAqIHNpbGVuY2UgdGhlIGxvZ3MgYWx0b2dldGhlci5cbiAqXG4gKiBUaGUgb3JkZXIgaXMgYSBmb2xsb3dzOlxuICogREVCVUcgPCBWRVJCT1NFIDwgSU5GTyA8IFdBUk4gPCBFUlJPUlxuICpcbiAqIEFsbCBvZiB0aGUgbG9nIHR5cGVzIGFib3ZlIHRoZSBjdXJyZW50IGxvZyBsZXZlbCB3aWxsIGJlIGNhcHR1cmVkIChpLmUuIGlmXG4gKiB5b3Ugc2V0IHRoZSBsb2cgbGV2ZWwgdG8gYElORk9gLCBlcnJvcnMgd2lsbCBzdGlsbCBiZSBsb2dnZWQsIGJ1dCBgREVCVUdgIGFuZFxuICogYFZFUkJPU0VgIGxvZ3Mgd2lsbCBub3QpXG4gKi9cbmV4cG9ydCBlbnVtIExvZ0xldmVsIHtcbiAgREVCVUcsXG4gIFZFUkJPU0UsXG4gIElORk8sXG4gIFdBUk4sXG4gIEVSUk9SLFxuICBTSUxFTlRcbn1cblxuY29uc3QgbGV2ZWxTdHJpbmdUb0VudW06IHsgW2tleSBpbiBMb2dMZXZlbFN0cmluZ106IExvZ0xldmVsIH0gPSB7XG4gICdkZWJ1Zyc6IExvZ0xldmVsLkRFQlVHLFxuICAndmVyYm9zZSc6IExvZ0xldmVsLlZFUkJPU0UsXG4gICdpbmZvJzogTG9nTGV2ZWwuSU5GTyxcbiAgJ3dhcm4nOiBMb2dMZXZlbC5XQVJOLFxuICAnZXJyb3InOiBMb2dMZXZlbC5FUlJPUixcbiAgJ3NpbGVudCc6IExvZ0xldmVsLlNJTEVOVFxufTtcblxuLyoqXG4gKiBUaGUgZGVmYXVsdCBsb2cgbGV2ZWxcbiAqL1xuY29uc3QgZGVmYXVsdExvZ0xldmVsOiBMb2dMZXZlbCA9IExvZ0xldmVsLklORk87XG5cbi8qKlxuICogV2UgYWxsb3cgdXNlcnMgdGhlIGFiaWxpdHkgdG8gcGFzcyB0aGVpciBvd24gbG9nIGhhbmRsZXIuIFdlIHdpbGwgcGFzcyB0aGVcbiAqIHR5cGUgb2YgbG9nLCB0aGUgY3VycmVudCBsb2cgbGV2ZWwsIGFuZCBhbnkgb3RoZXIgYXJndW1lbnRzIHBhc3NlZCAoaS5lLiB0aGVcbiAqIG1lc3NhZ2VzIHRoYXQgdGhlIHVzZXIgd2FudHMgdG8gbG9nKSB0byB0aGlzIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgdHlwZSBMb2dIYW5kbGVyID0gKFxuICBsb2dnZXJJbnN0YW5jZTogTG9nZ2VyLFxuICBsb2dUeXBlOiBMb2dMZXZlbCxcbiAgLi4uYXJnczogdW5rbm93bltdXG4pID0+IHZvaWQ7XG5cbi8qKlxuICogQnkgZGVmYXVsdCwgYGNvbnNvbGUuZGVidWdgIGlzIG5vdCBkaXNwbGF5ZWQgaW4gdGhlIGRldmVsb3BlciBjb25zb2xlIChpblxuICogY2hyb21lKS4gVG8gYXZvaWQgZm9yY2luZyB1c2VycyB0byBoYXZlIHRvIG9wdC1pbiB0byB0aGVzZSBsb2dzIHR3aWNlXG4gKiAoaS5lLiBvbmNlIGZvciBmaXJlYmFzZSwgYW5kIG9uY2UgaW4gdGhlIGNvbnNvbGUpLCB3ZSBhcmUgc2VuZGluZyBgREVCVUdgXG4gKiBsb2dzIHRvIHRoZSBgY29uc29sZS5sb2dgIGZ1bmN0aW9uLlxuICovXG5jb25zdCBDb25zb2xlTWV0aG9kID0ge1xuICBbTG9nTGV2ZWwuREVCVUddOiAnbG9nJyxcbiAgW0xvZ0xldmVsLlZFUkJPU0VdOiAnbG9nJyxcbiAgW0xvZ0xldmVsLklORk9dOiAnaW5mbycsXG4gIFtMb2dMZXZlbC5XQVJOXTogJ3dhcm4nLFxuICBbTG9nTGV2ZWwuRVJST1JdOiAnZXJyb3InXG59O1xuXG4vKipcbiAqIFRoZSBkZWZhdWx0IGxvZyBoYW5kbGVyIHdpbGwgZm9yd2FyZCBERUJVRywgVkVSQk9TRSwgSU5GTywgV0FSTiwgYW5kIEVSUk9SXG4gKiBtZXNzYWdlcyBvbiB0byB0aGVpciBjb3JyZXNwb25kaW5nIGNvbnNvbGUgY291bnRlcnBhcnRzIChpZiB0aGUgbG9nIG1ldGhvZFxuICogaXMgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IGxvZyBsZXZlbClcbiAqL1xuY29uc3QgZGVmYXVsdExvZ0hhbmRsZXI6IExvZ0hhbmRsZXIgPSAoaW5zdGFuY2UsIGxvZ1R5cGUsIC4uLmFyZ3MpOiB2b2lkID0+IHtcbiAgaWYgKGxvZ1R5cGUgPCBpbnN0YW5jZS5sb2dMZXZlbCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gIGNvbnN0IG1ldGhvZCA9IENvbnNvbGVNZXRob2RbbG9nVHlwZSBhcyBrZXlvZiB0eXBlb2YgQ29uc29sZU1ldGhvZF07XG4gIGlmIChtZXRob2QpIHtcbiAgICBjb25zb2xlW21ldGhvZCBhcyAnbG9nJyB8ICdpbmZvJyB8ICd3YXJuJyB8ICdlcnJvciddKFxuICAgICAgYFske25vd31dICAke2luc3RhbmNlLm5hbWV9OmAsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQXR0ZW1wdGVkIHRvIGxvZyBhIG1lc3NhZ2Ugd2l0aCBhbiBpbnZhbGlkIGxvZ1R5cGUgKHZhbHVlOiAke2xvZ1R5cGV9KWBcbiAgICApO1xuICB9XG59O1xuXG5leHBvcnQgY2xhc3MgTG9nZ2VyIHtcbiAgLyoqXG4gICAqIEdpdmVzIHlvdSBhbiBpbnN0YW5jZSBvZiBhIExvZ2dlciB0byBjYXB0dXJlIG1lc3NhZ2VzIGFjY29yZGluZyB0b1xuICAgKiBGaXJlYmFzZSdzIGxvZ2dpbmcgc2NoZW1lLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSB0aGF0IHRoZSBsb2dzIHdpbGwgYmUgYXNzb2NpYXRlZCB3aXRoXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgLyoqXG4gICAgICogQ2FwdHVyZSB0aGUgY3VycmVudCBpbnN0YW5jZSBmb3IgbGF0ZXIgdXNlXG4gICAgICovXG4gICAgaW5zdGFuY2VzLnB1c2godGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGxvZyBsZXZlbCBvZiB0aGUgZ2l2ZW4gTG9nZ2VyIGluc3RhbmNlLlxuICAgKi9cbiAgcHJpdmF0ZSBfbG9nTGV2ZWwgPSBkZWZhdWx0TG9nTGV2ZWw7XG5cbiAgZ2V0IGxvZ0xldmVsKCk6IExvZ0xldmVsIHtcbiAgICByZXR1cm4gdGhpcy5fbG9nTGV2ZWw7XG4gIH1cblxuICBzZXQgbG9nTGV2ZWwodmFsOiBMb2dMZXZlbCkge1xuICAgIGlmICghKHZhbCBpbiBMb2dMZXZlbCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgdmFsdWUgXCIke3ZhbH1cIiBhc3NpZ25lZCB0byBcXGBsb2dMZXZlbFxcYGApO1xuICAgIH1cbiAgICB0aGlzLl9sb2dMZXZlbCA9IHZhbDtcbiAgfVxuXG4gIC8vIFdvcmthcm91bmQgZm9yIHNldHRlci9nZXR0ZXIgaGF2aW5nIHRvIGJlIHRoZSBzYW1lIHR5cGUuXG4gIHNldExvZ0xldmVsKHZhbDogTG9nTGV2ZWwgfCBMb2dMZXZlbFN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX2xvZ0xldmVsID0gdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgPyBsZXZlbFN0cmluZ1RvRW51bVt2YWxdIDogdmFsO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBtYWluIChpbnRlcm5hbCkgbG9nIGhhbmRsZXIgZm9yIHRoZSBMb2dnZXIgaW5zdGFuY2UuXG4gICAqIENhbiBiZSBzZXQgdG8gYSBuZXcgZnVuY3Rpb24gaW4gaW50ZXJuYWwgcGFja2FnZSBjb2RlIGJ1dCBub3QgYnkgdXNlci5cbiAgICovXG4gIHByaXZhdGUgX2xvZ0hhbmRsZXI6IExvZ0hhbmRsZXIgPSBkZWZhdWx0TG9nSGFuZGxlcjtcbiAgZ2V0IGxvZ0hhbmRsZXIoKTogTG9nSGFuZGxlciB7XG4gICAgcmV0dXJuIHRoaXMuX2xvZ0hhbmRsZXI7XG4gIH1cbiAgc2V0IGxvZ0hhbmRsZXIodmFsOiBMb2dIYW5kbGVyKSB7XG4gICAgaWYgKHR5cGVvZiB2YWwgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1ZhbHVlIGFzc2lnbmVkIHRvIGBsb2dIYW5kbGVyYCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICB9XG4gICAgdGhpcy5fbG9nSGFuZGxlciA9IHZhbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgb3B0aW9uYWwsIGFkZGl0aW9uYWwsIHVzZXItZGVmaW5lZCBsb2cgaGFuZGxlciBmb3IgdGhlIExvZ2dlciBpbnN0YW5jZS5cbiAgICovXG4gIHByaXZhdGUgX3VzZXJMb2dIYW5kbGVyOiBMb2dIYW5kbGVyIHwgbnVsbCA9IG51bGw7XG4gIGdldCB1c2VyTG9nSGFuZGxlcigpOiBMb2dIYW5kbGVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3VzZXJMb2dIYW5kbGVyO1xuICB9XG4gIHNldCB1c2VyTG9nSGFuZGxlcih2YWw6IExvZ0hhbmRsZXIgfCBudWxsKSB7XG4gICAgdGhpcy5fdXNlckxvZ0hhbmRsZXIgPSB2YWw7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGZ1bmN0aW9ucyBiZWxvdyBhcmUgYWxsIGJhc2VkIG9uIHRoZSBgY29uc29sZWAgaW50ZXJmYWNlXG4gICAqL1xuXG4gIGRlYnVnKC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuICAgIHRoaXMuX3VzZXJMb2dIYW5kbGVyICYmIHRoaXMuX3VzZXJMb2dIYW5kbGVyKHRoaXMsIExvZ0xldmVsLkRFQlVHLCAuLi5hcmdzKTtcbiAgICB0aGlzLl9sb2dIYW5kbGVyKHRoaXMsIExvZ0xldmVsLkRFQlVHLCAuLi5hcmdzKTtcbiAgfVxuICBsb2coLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgdGhpcy5fdXNlckxvZ0hhbmRsZXIgJiZcbiAgICAgIHRoaXMuX3VzZXJMb2dIYW5kbGVyKHRoaXMsIExvZ0xldmVsLlZFUkJPU0UsIC4uLmFyZ3MpO1xuICAgIHRoaXMuX2xvZ0hhbmRsZXIodGhpcywgTG9nTGV2ZWwuVkVSQk9TRSwgLi4uYXJncyk7XG4gIH1cbiAgaW5mbyguLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICB0aGlzLl91c2VyTG9nSGFuZGxlciAmJiB0aGlzLl91c2VyTG9nSGFuZGxlcih0aGlzLCBMb2dMZXZlbC5JTkZPLCAuLi5hcmdzKTtcbiAgICB0aGlzLl9sb2dIYW5kbGVyKHRoaXMsIExvZ0xldmVsLklORk8sIC4uLmFyZ3MpO1xuICB9XG4gIHdhcm4oLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgdGhpcy5fdXNlckxvZ0hhbmRsZXIgJiYgdGhpcy5fdXNlckxvZ0hhbmRsZXIodGhpcywgTG9nTGV2ZWwuV0FSTiwgLi4uYXJncyk7XG4gICAgdGhpcy5fbG9nSGFuZGxlcih0aGlzLCBMb2dMZXZlbC5XQVJOLCAuLi5hcmdzKTtcbiAgfVxuICBlcnJvciguLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICB0aGlzLl91c2VyTG9nSGFuZGxlciAmJiB0aGlzLl91c2VyTG9nSGFuZGxlcih0aGlzLCBMb2dMZXZlbC5FUlJPUiwgLi4uYXJncyk7XG4gICAgdGhpcy5fbG9nSGFuZGxlcih0aGlzLCBMb2dMZXZlbC5FUlJPUiwgLi4uYXJncyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldExvZ0xldmVsKGxldmVsOiBMb2dMZXZlbFN0cmluZyB8IExvZ0xldmVsKTogdm9pZCB7XG4gIGluc3RhbmNlcy5mb3JFYWNoKGluc3QgPT4ge1xuICAgIGluc3Quc2V0TG9nTGV2ZWwobGV2ZWwpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldFVzZXJMb2dIYW5kbGVyKFxuICBsb2dDYWxsYmFjazogTG9nQ2FsbGJhY2sgfCBudWxsLFxuICBvcHRpb25zPzogTG9nT3B0aW9uc1xuKTogdm9pZCB7XG4gIGZvciAoY29uc3QgaW5zdGFuY2Ugb2YgaW5zdGFuY2VzKSB7XG4gICAgbGV0IGN1c3RvbUxvZ0xldmVsOiBMb2dMZXZlbCB8IG51bGwgPSBudWxsO1xuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMubGV2ZWwpIHtcbiAgICAgIGN1c3RvbUxvZ0xldmVsID0gbGV2ZWxTdHJpbmdUb0VudW1bb3B0aW9ucy5sZXZlbF07XG4gICAgfVxuICAgIGlmIChsb2dDYWxsYmFjayA9PT0gbnVsbCkge1xuICAgICAgaW5zdGFuY2UudXNlckxvZ0hhbmRsZXIgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnN0YW5jZS51c2VyTG9nSGFuZGxlciA9IChcbiAgICAgICAgaW5zdGFuY2U6IExvZ2dlcixcbiAgICAgICAgbGV2ZWw6IExvZ0xldmVsLFxuICAgICAgICAuLi5hcmdzOiB1bmtub3duW11cbiAgICAgICkgPT4ge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gYXJnc1xuICAgICAgICAgIC5tYXAoYXJnID0+IHtcbiAgICAgICAgICAgIGlmIChhcmcgPT0gbnVsbCkge1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGFyZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGFyZztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicgfHwgdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhcmcudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGFyZy5tZXNzYWdlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoaWdub3JlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmlsdGVyKGFyZyA9PiBhcmcpXG4gICAgICAgICAgLmpvaW4oJyAnKTtcbiAgICAgICAgaWYgKGxldmVsID49IChjdXN0b21Mb2dMZXZlbCA/PyBpbnN0YW5jZS5sb2dMZXZlbCkpIHtcbiAgICAgICAgICBsb2dDYWxsYmFjayh7XG4gICAgICAgICAgICBsZXZlbDogTG9nTGV2ZWxbbGV2ZWxdLnRvTG93ZXJDYXNlKCkgYXMgTG9nTGV2ZWxTdHJpbmcsXG4gICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgIHR5cGU6IGluc3RhbmNlLm5hbWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH1cbn1cbiIsICJjb25zdCBpbnN0YW5jZU9mQW55ID0gKG9iamVjdCwgY29uc3RydWN0b3JzKSA9PiBjb25zdHJ1Y3RvcnMuc29tZSgoYykgPT4gb2JqZWN0IGluc3RhbmNlb2YgYyk7XG5cbmxldCBpZGJQcm94eWFibGVUeXBlcztcbmxldCBjdXJzb3JBZHZhbmNlTWV0aG9kcztcbi8vIFRoaXMgaXMgYSBmdW5jdGlvbiB0byBwcmV2ZW50IGl0IHRocm93aW5nIHVwIGluIG5vZGUgZW52aXJvbm1lbnRzLlxuZnVuY3Rpb24gZ2V0SWRiUHJveHlhYmxlVHlwZXMoKSB7XG4gICAgcmV0dXJuIChpZGJQcm94eWFibGVUeXBlcyB8fFxuICAgICAgICAoaWRiUHJveHlhYmxlVHlwZXMgPSBbXG4gICAgICAgICAgICBJREJEYXRhYmFzZSxcbiAgICAgICAgICAgIElEQk9iamVjdFN0b3JlLFxuICAgICAgICAgICAgSURCSW5kZXgsXG4gICAgICAgICAgICBJREJDdXJzb3IsXG4gICAgICAgICAgICBJREJUcmFuc2FjdGlvbixcbiAgICAgICAgXSkpO1xufVxuLy8gVGhpcyBpcyBhIGZ1bmN0aW9uIHRvIHByZXZlbnQgaXQgdGhyb3dpbmcgdXAgaW4gbm9kZSBlbnZpcm9ubWVudHMuXG5mdW5jdGlvbiBnZXRDdXJzb3JBZHZhbmNlTWV0aG9kcygpIHtcbiAgICByZXR1cm4gKGN1cnNvckFkdmFuY2VNZXRob2RzIHx8XG4gICAgICAgIChjdXJzb3JBZHZhbmNlTWV0aG9kcyA9IFtcbiAgICAgICAgICAgIElEQkN1cnNvci5wcm90b3R5cGUuYWR2YW5jZSxcbiAgICAgICAgICAgIElEQkN1cnNvci5wcm90b3R5cGUuY29udGludWUsXG4gICAgICAgICAgICBJREJDdXJzb3IucHJvdG90eXBlLmNvbnRpbnVlUHJpbWFyeUtleSxcbiAgICAgICAgXSkpO1xufVxuY29uc3QgY3Vyc29yUmVxdWVzdE1hcCA9IG5ldyBXZWFrTWFwKCk7XG5jb25zdCB0cmFuc2FjdGlvbkRvbmVNYXAgPSBuZXcgV2Vha01hcCgpO1xuY29uc3QgdHJhbnNhY3Rpb25TdG9yZU5hbWVzTWFwID0gbmV3IFdlYWtNYXAoKTtcbmNvbnN0IHRyYW5zZm9ybUNhY2hlID0gbmV3IFdlYWtNYXAoKTtcbmNvbnN0IHJldmVyc2VUcmFuc2Zvcm1DYWNoZSA9IG5ldyBXZWFrTWFwKCk7XG5mdW5jdGlvbiBwcm9taXNpZnlSZXF1ZXN0KHJlcXVlc3QpIHtcbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCB1bmxpc3RlbiA9ICgpID0+IHtcbiAgICAgICAgICAgIHJlcXVlc3QucmVtb3ZlRXZlbnRMaXN0ZW5lcignc3VjY2VzcycsIHN1Y2Nlc3MpO1xuICAgICAgICAgICAgcmVxdWVzdC5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIGVycm9yKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgc3VjY2VzcyA9ICgpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUod3JhcChyZXF1ZXN0LnJlc3VsdCkpO1xuICAgICAgICAgICAgdW5saXN0ZW4oKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICByZWplY3QocmVxdWVzdC5lcnJvcik7XG4gICAgICAgICAgICB1bmxpc3RlbigpO1xuICAgICAgICB9O1xuICAgICAgICByZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoJ3N1Y2Nlc3MnLCBzdWNjZXNzKTtcbiAgICAgICAgcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGVycm9yKTtcbiAgICB9KTtcbiAgICBwcm9taXNlXG4gICAgICAgIC50aGVuKCh2YWx1ZSkgPT4ge1xuICAgICAgICAvLyBTaW5jZSBjdXJzb3JpbmcgcmV1c2VzIHRoZSBJREJSZXF1ZXN0ICgqc2lnaCopLCB3ZSBjYWNoZSBpdCBmb3IgbGF0ZXIgcmV0cmlldmFsXG4gICAgICAgIC8vIChzZWUgd3JhcEZ1bmN0aW9uKS5cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgSURCQ3Vyc29yKSB7XG4gICAgICAgICAgICBjdXJzb3JSZXF1ZXN0TWFwLnNldCh2YWx1ZSwgcmVxdWVzdCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2F0Y2hpbmcgdG8gYXZvaWQgXCJVbmNhdWdodCBQcm9taXNlIGV4Y2VwdGlvbnNcIlxuICAgIH0pXG4gICAgICAgIC5jYXRjaCgoKSA9PiB7IH0pO1xuICAgIC8vIFRoaXMgbWFwcGluZyBleGlzdHMgaW4gcmV2ZXJzZVRyYW5zZm9ybUNhY2hlIGJ1dCBkb2Vzbid0IGRvZXNuJ3QgZXhpc3QgaW4gdHJhbnNmb3JtQ2FjaGUuIFRoaXNcbiAgICAvLyBpcyBiZWNhdXNlIHdlIGNyZWF0ZSBtYW55IHByb21pc2VzIGZyb20gYSBzaW5nbGUgSURCUmVxdWVzdC5cbiAgICByZXZlcnNlVHJhbnNmb3JtQ2FjaGUuc2V0KHByb21pc2UsIHJlcXVlc3QpO1xuICAgIHJldHVybiBwcm9taXNlO1xufVxuZnVuY3Rpb24gY2FjaGVEb25lUHJvbWlzZUZvclRyYW5zYWN0aW9uKHR4KSB7XG4gICAgLy8gRWFybHkgYmFpbCBpZiB3ZSd2ZSBhbHJlYWR5IGNyZWF0ZWQgYSBkb25lIHByb21pc2UgZm9yIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAgaWYgKHRyYW5zYWN0aW9uRG9uZU1hcC5oYXModHgpKVxuICAgICAgICByZXR1cm47XG4gICAgY29uc3QgZG9uZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgdW5saXN0ZW4gPSAoKSA9PiB7XG4gICAgICAgICAgICB0eC5yZW1vdmVFdmVudExpc3RlbmVyKCdjb21wbGV0ZScsIGNvbXBsZXRlKTtcbiAgICAgICAgICAgIHR4LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgZXJyb3IpO1xuICAgICAgICAgICAgdHgucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBlcnJvcik7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGNvbXBsZXRlID0gKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgdW5saXN0ZW4oKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICByZWplY3QodHguZXJyb3IgfHwgbmV3IERPTUV4Y2VwdGlvbignQWJvcnRFcnJvcicsICdBYm9ydEVycm9yJykpO1xuICAgICAgICAgICAgdW5saXN0ZW4oKTtcbiAgICAgICAgfTtcbiAgICAgICAgdHguYWRkRXZlbnRMaXN0ZW5lcignY29tcGxldGUnLCBjb21wbGV0ZSk7XG4gICAgICAgIHR4LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgZXJyb3IpO1xuICAgICAgICB0eC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGVycm9yKTtcbiAgICB9KTtcbiAgICAvLyBDYWNoZSBpdCBmb3IgbGF0ZXIgcmV0cmlldmFsLlxuICAgIHRyYW5zYWN0aW9uRG9uZU1hcC5zZXQodHgsIGRvbmUpO1xufVxubGV0IGlkYlByb3h5VHJhcHMgPSB7XG4gICAgZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpIHtcbiAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIElEQlRyYW5zYWN0aW9uKSB7XG4gICAgICAgICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciB0cmFuc2FjdGlvbi5kb25lLlxuICAgICAgICAgICAgaWYgKHByb3AgPT09ICdkb25lJylcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNhY3Rpb25Eb25lTWFwLmdldCh0YXJnZXQpO1xuICAgICAgICAgICAgLy8gUG9seWZpbGwgZm9yIG9iamVjdFN0b3JlTmFtZXMgYmVjYXVzZSBvZiBFZGdlLlxuICAgICAgICAgICAgaWYgKHByb3AgPT09ICdvYmplY3RTdG9yZU5hbWVzJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQub2JqZWN0U3RvcmVOYW1lcyB8fCB0cmFuc2FjdGlvblN0b3JlTmFtZXNNYXAuZ2V0KHRhcmdldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBNYWtlIHR4LnN0b3JlIHJldHVybiB0aGUgb25seSBzdG9yZSBpbiB0aGUgdHJhbnNhY3Rpb24sIG9yIHVuZGVmaW5lZCBpZiB0aGVyZSBhcmUgbWFueS5cbiAgICAgICAgICAgIGlmIChwcm9wID09PSAnc3RvcmUnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlY2VpdmVyLm9iamVjdFN0b3JlTmFtZXNbMV1cbiAgICAgICAgICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgOiByZWNlaXZlci5vYmplY3RTdG9yZShyZWNlaXZlci5vYmplY3RTdG9yZU5hbWVzWzBdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBFbHNlIHRyYW5zZm9ybSB3aGF0ZXZlciB3ZSBnZXQgYmFjay5cbiAgICAgICAgcmV0dXJuIHdyYXAodGFyZ2V0W3Byb3BdKTtcbiAgICB9LFxuICAgIHNldCh0YXJnZXQsIHByb3AsIHZhbHVlKSB7XG4gICAgICAgIHRhcmdldFtwcm9wXSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIGhhcyh0YXJnZXQsIHByb3ApIHtcbiAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIElEQlRyYW5zYWN0aW9uICYmXG4gICAgICAgICAgICAocHJvcCA9PT0gJ2RvbmUnIHx8IHByb3AgPT09ICdzdG9yZScpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvcCBpbiB0YXJnZXQ7XG4gICAgfSxcbn07XG5mdW5jdGlvbiByZXBsYWNlVHJhcHMoY2FsbGJhY2spIHtcbiAgICBpZGJQcm94eVRyYXBzID0gY2FsbGJhY2soaWRiUHJveHlUcmFwcyk7XG59XG5mdW5jdGlvbiB3cmFwRnVuY3Rpb24oZnVuYykge1xuICAgIC8vIER1ZSB0byBleHBlY3RlZCBvYmplY3QgZXF1YWxpdHkgKHdoaWNoIGlzIGVuZm9yY2VkIGJ5IHRoZSBjYWNoaW5nIGluIGB3cmFwYCksIHdlXG4gICAgLy8gb25seSBjcmVhdGUgb25lIG5ldyBmdW5jIHBlciBmdW5jLlxuICAgIC8vIEVkZ2UgZG9lc24ndCBzdXBwb3J0IG9iamVjdFN0b3JlTmFtZXMgKGJvb28pLCBzbyB3ZSBwb2x5ZmlsbCBpdCBoZXJlLlxuICAgIGlmIChmdW5jID09PSBJREJEYXRhYmFzZS5wcm90b3R5cGUudHJhbnNhY3Rpb24gJiZcbiAgICAgICAgISgnb2JqZWN0U3RvcmVOYW1lcycgaW4gSURCVHJhbnNhY3Rpb24ucHJvdG90eXBlKSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHN0b3JlTmFtZXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IHR4ID0gZnVuYy5jYWxsKHVud3JhcCh0aGlzKSwgc3RvcmVOYW1lcywgLi4uYXJncyk7XG4gICAgICAgICAgICB0cmFuc2FjdGlvblN0b3JlTmFtZXNNYXAuc2V0KHR4LCBzdG9yZU5hbWVzLnNvcnQgPyBzdG9yZU5hbWVzLnNvcnQoKSA6IFtzdG9yZU5hbWVzXSk7XG4gICAgICAgICAgICByZXR1cm4gd3JhcCh0eCk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8vIEN1cnNvciBtZXRob2RzIGFyZSBzcGVjaWFsLCBhcyB0aGUgYmVoYXZpb3VyIGlzIGEgbGl0dGxlIG1vcmUgZGlmZmVyZW50IHRvIHN0YW5kYXJkIElEQi4gSW5cbiAgICAvLyBJREIsIHlvdSBhZHZhbmNlIHRoZSBjdXJzb3IgYW5kIHdhaXQgZm9yIGEgbmV3ICdzdWNjZXNzJyBvbiB0aGUgSURCUmVxdWVzdCB0aGF0IGdhdmUgeW91IHRoZVxuICAgIC8vIGN1cnNvci4gSXQncyBraW5kYSBsaWtlIGEgcHJvbWlzZSB0aGF0IGNhbiByZXNvbHZlIHdpdGggbWFueSB2YWx1ZXMuIFRoYXQgZG9lc24ndCBtYWtlIHNlbnNlXG4gICAgLy8gd2l0aCByZWFsIHByb21pc2VzLCBzbyBlYWNoIGFkdmFuY2UgbWV0aG9kcyByZXR1cm5zIGEgbmV3IHByb21pc2UgZm9yIHRoZSBjdXJzb3Igb2JqZWN0LCBvclxuICAgIC8vIHVuZGVmaW5lZCBpZiB0aGUgZW5kIG9mIHRoZSBjdXJzb3IgaGFzIGJlZW4gcmVhY2hlZC5cbiAgICBpZiAoZ2V0Q3Vyc29yQWR2YW5jZU1ldGhvZHMoKS5pbmNsdWRlcyhmdW5jKSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIC8vIENhbGxpbmcgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIHdpdGggdGhlIHByb3h5IGFzICd0aGlzJyBjYXVzZXMgSUxMRUdBTCBJTlZPQ0FUSU9OLCBzbyB3ZSB1c2VcbiAgICAgICAgICAgIC8vIHRoZSBvcmlnaW5hbCBvYmplY3QuXG4gICAgICAgICAgICBmdW5jLmFwcGx5KHVud3JhcCh0aGlzKSwgYXJncyk7XG4gICAgICAgICAgICByZXR1cm4gd3JhcChjdXJzb3JSZXF1ZXN0TWFwLmdldCh0aGlzKSk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICAvLyBDYWxsaW5nIHRoZSBvcmlnaW5hbCBmdW5jdGlvbiB3aXRoIHRoZSBwcm94eSBhcyAndGhpcycgY2F1c2VzIElMTEVHQUwgSU5WT0NBVElPTiwgc28gd2UgdXNlXG4gICAgICAgIC8vIHRoZSBvcmlnaW5hbCBvYmplY3QuXG4gICAgICAgIHJldHVybiB3cmFwKGZ1bmMuYXBwbHkodW53cmFwKHRoaXMpLCBhcmdzKSk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHRyYW5zZm9ybUNhY2hhYmxlVmFsdWUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKVxuICAgICAgICByZXR1cm4gd3JhcEZ1bmN0aW9uKHZhbHVlKTtcbiAgICAvLyBUaGlzIGRvZXNuJ3QgcmV0dXJuLCBpdCBqdXN0IGNyZWF0ZXMgYSAnZG9uZScgcHJvbWlzZSBmb3IgdGhlIHRyYW5zYWN0aW9uLFxuICAgIC8vIHdoaWNoIGlzIGxhdGVyIHJldHVybmVkIGZvciB0cmFuc2FjdGlvbi5kb25lIChzZWUgaWRiT2JqZWN0SGFuZGxlcikuXG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgSURCVHJhbnNhY3Rpb24pXG4gICAgICAgIGNhY2hlRG9uZVByb21pc2VGb3JUcmFuc2FjdGlvbih2YWx1ZSk7XG4gICAgaWYgKGluc3RhbmNlT2ZBbnkodmFsdWUsIGdldElkYlByb3h5YWJsZVR5cGVzKCkpKVxuICAgICAgICByZXR1cm4gbmV3IFByb3h5KHZhbHVlLCBpZGJQcm94eVRyYXBzKTtcbiAgICAvLyBSZXR1cm4gdGhlIHNhbWUgdmFsdWUgYmFjayBpZiB3ZSdyZSBub3QgZ29pbmcgdG8gdHJhbnNmb3JtIGl0LlxuICAgIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIHdyYXAodmFsdWUpIHtcbiAgICAvLyBXZSBzb21ldGltZXMgZ2VuZXJhdGUgbXVsdGlwbGUgcHJvbWlzZXMgZnJvbSBhIHNpbmdsZSBJREJSZXF1ZXN0IChlZyB3aGVuIGN1cnNvcmluZyksIGJlY2F1c2VcbiAgICAvLyBJREIgaXMgd2VpcmQgYW5kIGEgc2luZ2xlIElEQlJlcXVlc3QgY2FuIHlpZWxkIG1hbnkgcmVzcG9uc2VzLCBzbyB0aGVzZSBjYW4ndCBiZSBjYWNoZWQuXG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgSURCUmVxdWVzdClcbiAgICAgICAgcmV0dXJuIHByb21pc2lmeVJlcXVlc3QodmFsdWUpO1xuICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgdHJhbnNmb3JtZWQgdGhpcyB2YWx1ZSBiZWZvcmUsIHJldXNlIHRoZSB0cmFuc2Zvcm1lZCB2YWx1ZS5cbiAgICAvLyBUaGlzIGlzIGZhc3RlciwgYnV0IGl0IGFsc28gcHJvdmlkZXMgb2JqZWN0IGVxdWFsaXR5LlxuICAgIGlmICh0cmFuc2Zvcm1DYWNoZS5oYXModmFsdWUpKVxuICAgICAgICByZXR1cm4gdHJhbnNmb3JtQ2FjaGUuZ2V0KHZhbHVlKTtcbiAgICBjb25zdCBuZXdWYWx1ZSA9IHRyYW5zZm9ybUNhY2hhYmxlVmFsdWUodmFsdWUpO1xuICAgIC8vIE5vdCBhbGwgdHlwZXMgYXJlIHRyYW5zZm9ybWVkLlxuICAgIC8vIFRoZXNlIG1heSBiZSBwcmltaXRpdmUgdHlwZXMsIHNvIHRoZXkgY2FuJ3QgYmUgV2Vha01hcCBrZXlzLlxuICAgIGlmIChuZXdWYWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgdHJhbnNmb3JtQ2FjaGUuc2V0KHZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgICAgIHJldmVyc2VUcmFuc2Zvcm1DYWNoZS5zZXQobmV3VmFsdWUsIHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld1ZhbHVlO1xufVxuY29uc3QgdW53cmFwID0gKHZhbHVlKSA9PiByZXZlcnNlVHJhbnNmb3JtQ2FjaGUuZ2V0KHZhbHVlKTtcblxuZXhwb3J0IHsgcmV2ZXJzZVRyYW5zZm9ybUNhY2hlIGFzIGEsIGluc3RhbmNlT2ZBbnkgYXMgaSwgcmVwbGFjZVRyYXBzIGFzIHIsIHVud3JhcCBhcyB1LCB3cmFwIGFzIHcgfTtcbiIsICJpbXBvcnQgeyB3IGFzIHdyYXAsIHIgYXMgcmVwbGFjZVRyYXBzIH0gZnJvbSAnLi93cmFwLWlkYi12YWx1ZS5qcyc7XG5leHBvcnQgeyB1IGFzIHVud3JhcCwgdyBhcyB3cmFwIH0gZnJvbSAnLi93cmFwLWlkYi12YWx1ZS5qcyc7XG5cbi8qKlxuICogT3BlbiBhIGRhdGFiYXNlLlxuICpcbiAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGRhdGFiYXNlLlxuICogQHBhcmFtIHZlcnNpb24gU2NoZW1hIHZlcnNpb24uXG4gKiBAcGFyYW0gY2FsbGJhY2tzIEFkZGl0aW9uYWwgY2FsbGJhY2tzLlxuICovXG5mdW5jdGlvbiBvcGVuREIobmFtZSwgdmVyc2lvbiwgeyBibG9ja2VkLCB1cGdyYWRlLCBibG9ja2luZywgdGVybWluYXRlZCB9ID0ge30pIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gaW5kZXhlZERCLm9wZW4obmFtZSwgdmVyc2lvbik7XG4gICAgY29uc3Qgb3BlblByb21pc2UgPSB3cmFwKHJlcXVlc3QpO1xuICAgIGlmICh1cGdyYWRlKSB7XG4gICAgICAgIHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcigndXBncmFkZW5lZWRlZCcsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgdXBncmFkZSh3cmFwKHJlcXVlc3QucmVzdWx0KSwgZXZlbnQub2xkVmVyc2lvbiwgZXZlbnQubmV3VmVyc2lvbiwgd3JhcChyZXF1ZXN0LnRyYW5zYWN0aW9uKSwgZXZlbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGJsb2NrZWQpIHtcbiAgICAgICAgcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCdibG9ja2VkJywgKGV2ZW50KSA9PiBibG9ja2VkKFxuICAgICAgICAvLyBDYXN0aW5nIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQtRE9NLWxpYi1nZW5lcmF0b3IvcHVsbC8xNDA1XG4gICAgICAgIGV2ZW50Lm9sZFZlcnNpb24sIGV2ZW50Lm5ld1ZlcnNpb24sIGV2ZW50KSk7XG4gICAgfVxuICAgIG9wZW5Qcm9taXNlXG4gICAgICAgIC50aGVuKChkYikgPT4ge1xuICAgICAgICBpZiAodGVybWluYXRlZClcbiAgICAgICAgICAgIGRiLmFkZEV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgKCkgPT4gdGVybWluYXRlZCgpKTtcbiAgICAgICAgaWYgKGJsb2NraW5nKSB7XG4gICAgICAgICAgICBkYi5hZGRFdmVudExpc3RlbmVyKCd2ZXJzaW9uY2hhbmdlJywgKGV2ZW50KSA9PiBibG9ja2luZyhldmVudC5vbGRWZXJzaW9uLCBldmVudC5uZXdWZXJzaW9uLCBldmVudCkpO1xuICAgICAgICB9XG4gICAgfSlcbiAgICAgICAgLmNhdGNoKCgpID0+IHsgfSk7XG4gICAgcmV0dXJuIG9wZW5Qcm9taXNlO1xufVxuLyoqXG4gKiBEZWxldGUgYSBkYXRhYmFzZS5cbiAqXG4gKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBkYXRhYmFzZS5cbiAqL1xuZnVuY3Rpb24gZGVsZXRlREIobmFtZSwgeyBibG9ja2VkIH0gPSB7fSkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIuZGVsZXRlRGF0YWJhc2UobmFtZSk7XG4gICAgaWYgKGJsb2NrZWQpIHtcbiAgICAgICAgcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCdibG9ja2VkJywgKGV2ZW50KSA9PiBibG9ja2VkKFxuICAgICAgICAvLyBDYXN0aW5nIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQtRE9NLWxpYi1nZW5lcmF0b3IvcHVsbC8xNDA1XG4gICAgICAgIGV2ZW50Lm9sZFZlcnNpb24sIGV2ZW50KSk7XG4gICAgfVxuICAgIHJldHVybiB3cmFwKHJlcXVlc3QpLnRoZW4oKCkgPT4gdW5kZWZpbmVkKTtcbn1cblxuY29uc3QgcmVhZE1ldGhvZHMgPSBbJ2dldCcsICdnZXRLZXknLCAnZ2V0QWxsJywgJ2dldEFsbEtleXMnLCAnY291bnQnXTtcbmNvbnN0IHdyaXRlTWV0aG9kcyA9IFsncHV0JywgJ2FkZCcsICdkZWxldGUnLCAnY2xlYXInXTtcbmNvbnN0IGNhY2hlZE1ldGhvZHMgPSBuZXcgTWFwKCk7XG5mdW5jdGlvbiBnZXRNZXRob2QodGFyZ2V0LCBwcm9wKSB7XG4gICAgaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgSURCRGF0YWJhc2UgJiZcbiAgICAgICAgIShwcm9wIGluIHRhcmdldCkgJiZcbiAgICAgICAgdHlwZW9mIHByb3AgPT09ICdzdHJpbmcnKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjYWNoZWRNZXRob2RzLmdldChwcm9wKSlcbiAgICAgICAgcmV0dXJuIGNhY2hlZE1ldGhvZHMuZ2V0KHByb3ApO1xuICAgIGNvbnN0IHRhcmdldEZ1bmNOYW1lID0gcHJvcC5yZXBsYWNlKC9Gcm9tSW5kZXgkLywgJycpO1xuICAgIGNvbnN0IHVzZUluZGV4ID0gcHJvcCAhPT0gdGFyZ2V0RnVuY05hbWU7XG4gICAgY29uc3QgaXNXcml0ZSA9IHdyaXRlTWV0aG9kcy5pbmNsdWRlcyh0YXJnZXRGdW5jTmFtZSk7XG4gICAgaWYgKFxuICAgIC8vIEJhaWwgaWYgdGhlIHRhcmdldCBkb2Vzbid0IGV4aXN0IG9uIHRoZSB0YXJnZXQuIEVnLCBnZXRBbGwgaXNuJ3QgaW4gRWRnZS5cbiAgICAhKHRhcmdldEZ1bmNOYW1lIGluICh1c2VJbmRleCA/IElEQkluZGV4IDogSURCT2JqZWN0U3RvcmUpLnByb3RvdHlwZSkgfHxcbiAgICAgICAgIShpc1dyaXRlIHx8IHJlYWRNZXRob2RzLmluY2x1ZGVzKHRhcmdldEZ1bmNOYW1lKSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBtZXRob2QgPSBhc3luYyBmdW5jdGlvbiAoc3RvcmVOYW1lLCAuLi5hcmdzKSB7XG4gICAgICAgIC8vIGlzV3JpdGUgPyAncmVhZHdyaXRlJyA6IHVuZGVmaW5lZCBnemlwcHMgYmV0dGVyLCBidXQgZmFpbHMgaW4gRWRnZSA6KFxuICAgICAgICBjb25zdCB0eCA9IHRoaXMudHJhbnNhY3Rpb24oc3RvcmVOYW1lLCBpc1dyaXRlID8gJ3JlYWR3cml0ZScgOiAncmVhZG9ubHknKTtcbiAgICAgICAgbGV0IHRhcmdldCA9IHR4LnN0b3JlO1xuICAgICAgICBpZiAodXNlSW5kZXgpXG4gICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQuaW5kZXgoYXJncy5zaGlmdCgpKTtcbiAgICAgICAgLy8gTXVzdCByZWplY3QgaWYgb3AgcmVqZWN0cy5cbiAgICAgICAgLy8gSWYgaXQncyBhIHdyaXRlIG9wZXJhdGlvbiwgbXVzdCByZWplY3QgaWYgdHguZG9uZSByZWplY3RzLlxuICAgICAgICAvLyBNdXN0IHJlamVjdCB3aXRoIG9wIHJlamVjdGlvbiBmaXJzdC5cbiAgICAgICAgLy8gTXVzdCByZXNvbHZlIHdpdGggb3AgdmFsdWUuXG4gICAgICAgIC8vIE11c3QgaGFuZGxlIGJvdGggcHJvbWlzZXMgKG5vIHVuaGFuZGxlZCByZWplY3Rpb25zKVxuICAgICAgICByZXR1cm4gKGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgIHRhcmdldFt0YXJnZXRGdW5jTmFtZV0oLi4uYXJncyksXG4gICAgICAgICAgICBpc1dyaXRlICYmIHR4LmRvbmUsXG4gICAgICAgIF0pKVswXTtcbiAgICB9O1xuICAgIGNhY2hlZE1ldGhvZHMuc2V0KHByb3AsIG1ldGhvZCk7XG4gICAgcmV0dXJuIG1ldGhvZDtcbn1cbnJlcGxhY2VUcmFwcygob2xkVHJhcHMpID0+ICh7XG4gICAgLi4ub2xkVHJhcHMsXG4gICAgZ2V0OiAodGFyZ2V0LCBwcm9wLCByZWNlaXZlcikgPT4gZ2V0TWV0aG9kKHRhcmdldCwgcHJvcCkgfHwgb2xkVHJhcHMuZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpLFxuICAgIGhhczogKHRhcmdldCwgcHJvcCkgPT4gISFnZXRNZXRob2QodGFyZ2V0LCBwcm9wKSB8fCBvbGRUcmFwcy5oYXModGFyZ2V0LCBwcm9wKSxcbn0pKTtcblxuZXhwb3J0IHsgZGVsZXRlREIsIG9wZW5EQiB9O1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gIENvbXBvbmVudENvbnRhaW5lcixcbiAgQ29tcG9uZW50VHlwZSxcbiAgUHJvdmlkZXIsXG4gIE5hbWVcbn0gZnJvbSAnQGZpcmViYXNlL2NvbXBvbmVudCc7XG5pbXBvcnQgeyBQbGF0Zm9ybUxvZ2dlclNlcnZpY2UsIFZlcnNpb25TZXJ2aWNlIH0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBQbGF0Zm9ybUxvZ2dlclNlcnZpY2VJbXBsIGltcGxlbWVudHMgUGxhdGZvcm1Mb2dnZXJTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lcikge31cbiAgLy8gSW4gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiwgdGhpcyB3aWxsIGJlIGNhbGxlZCBieSBpbnN0YWxsYXRpb25zIG9uXG4gIC8vIGF1dGggdG9rZW4gcmVmcmVzaCwgYW5kIGluc3RhbGxhdGlvbnMgd2lsbCBzZW5kIHRoaXMgc3RyaW5nLlxuICBnZXRQbGF0Zm9ybUluZm9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCBwcm92aWRlcnMgPSB0aGlzLmNvbnRhaW5lci5nZXRQcm92aWRlcnMoKTtcbiAgICAvLyBMb29wIHRocm91Z2ggcHJvdmlkZXJzIGFuZCBnZXQgbGlicmFyeS92ZXJzaW9uIHBhaXJzIGZyb20gYW55IHRoYXQgYXJlXG4gICAgLy8gdmVyc2lvbiBjb21wb25lbnRzLlxuICAgIHJldHVybiBwcm92aWRlcnNcbiAgICAgIC5tYXAocHJvdmlkZXIgPT4ge1xuICAgICAgICBpZiAoaXNWZXJzaW9uU2VydmljZVByb3ZpZGVyKHByb3ZpZGVyKSkge1xuICAgICAgICAgIGNvbnN0IHNlcnZpY2UgPSBwcm92aWRlci5nZXRJbW1lZGlhdGUoKSBhcyBWZXJzaW9uU2VydmljZTtcbiAgICAgICAgICByZXR1cm4gYCR7c2VydmljZS5saWJyYXJ5fS8ke3NlcnZpY2UudmVyc2lvbn1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihsb2dTdHJpbmcgPT4gbG9nU3RyaW5nKVxuICAgICAgLmpvaW4oJyAnKTtcbiAgfVxufVxuLyoqXG4gKlxuICogQHBhcmFtIHByb3ZpZGVyIGNoZWNrIGlmIHRoaXMgcHJvdmlkZXIgcHJvdmlkZXMgYSBWZXJzaW9uU2VydmljZVxuICpcbiAqIE5PVEU6IFVzaW5nIFByb3ZpZGVyPCdhcHAtdmVyc2lvbic+IGlzIGEgaGFjayB0byBpbmRpY2F0ZSB0aGF0IHRoZSBwcm92aWRlclxuICogcHJvdmlkZXMgVmVyc2lvblNlcnZpY2UuIFRoZSBwcm92aWRlciBpcyBub3QgbmVjZXNzYXJpbHkgYSAnYXBwLXZlcnNpb24nXG4gKiBwcm92aWRlci5cbiAqL1xuZnVuY3Rpb24gaXNWZXJzaW9uU2VydmljZVByb3ZpZGVyKHByb3ZpZGVyOiBQcm92aWRlcjxOYW1lPik6IGJvb2xlYW4ge1xuICBjb25zdCBjb21wb25lbnQgPSBwcm92aWRlci5nZXRDb21wb25lbnQoKTtcbiAgcmV0dXJuIGNvbXBvbmVudD8udHlwZSA9PT0gQ29tcG9uZW50VHlwZS5WRVJTSU9OO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BmaXJlYmFzZS9sb2dnZXInO1xuXG5leHBvcnQgY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcignQGZpcmViYXNlL2FwcCcpO1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IG5hbWUgYXMgYXBwTmFtZSB9IGZyb20gJy4uL3BhY2thZ2UuanNvbic7XG5pbXBvcnQgeyBuYW1lIGFzIGFwcENvbXBhdE5hbWUgfSBmcm9tICcuLi8uLi9hcHAtY29tcGF0L3BhY2thZ2UuanNvbic7XG5pbXBvcnQgeyBuYW1lIGFzIGFuYWx5dGljc0NvbXBhdE5hbWUgfSBmcm9tICcuLi8uLi8uLi9wYWNrYWdlcy9hbmFseXRpY3MtY29tcGF0L3BhY2thZ2UuanNvbic7XG5pbXBvcnQgeyBuYW1lIGFzIGFuYWx5dGljc05hbWUgfSBmcm9tICcuLi8uLi8uLi9wYWNrYWdlcy9hbmFseXRpY3MvcGFja2FnZS5qc29uJztcbmltcG9ydCB7IG5hbWUgYXMgYXBwQ2hlY2tDb21wYXROYW1lIH0gZnJvbSAnLi4vLi4vLi4vcGFja2FnZXMvYXBwLWNoZWNrLWNvbXBhdC9wYWNrYWdlLmpzb24nO1xuaW1wb3J0IHsgbmFtZSBhcyBhcHBDaGVja05hbWUgfSBmcm9tICcuLi8uLi8uLi9wYWNrYWdlcy9hcHAtY2hlY2svcGFja2FnZS5qc29uJztcbmltcG9ydCB7IG5hbWUgYXMgYXV0aE5hbWUgfSBmcm9tICcuLi8uLi8uLi9wYWNrYWdlcy9hdXRoL3BhY2thZ2UuanNvbic7XG5pbXBvcnQgeyBuYW1lIGFzIGF1dGhDb21wYXROYW1lIH0gZnJvbSAnLi4vLi4vLi4vcGFja2FnZXMvYXV0aC1jb21wYXQvcGFja2FnZS5qc29uJztcbmltcG9ydCB7IG5hbWUgYXMgZGF0YWJhc2VOYW1lIH0gZnJvbSAnLi4vLi4vLi4vcGFja2FnZXMvZGF0YWJhc2UvcGFja2FnZS5qc29uJztcbmltcG9ydCB7IG5hbWUgYXMgZGF0YWJhc2VDb21wYXROYW1lIH0gZnJvbSAnLi4vLi4vLi4vcGFja2FnZXMvZGF0YWJhc2UtY29tcGF0L3BhY2thZ2UuanNvbic7XG5pbXBvcnQgeyBuYW1lIGFzIGZ1bmN0aW9uc05hbWUgfSBmcm9tICcuLi8uLi8uLi9wYWNrYWdlcy9mdW5jdGlvbnMvcGFja2FnZS5qc29uJztcbmltcG9ydCB7IG5hbWUgYXMgZnVuY3Rpb25zQ29tcGF0TmFtZSB9IGZyb20gJy4uLy4uLy4uL3BhY2thZ2VzL2Z1bmN0aW9ucy1jb21wYXQvcGFja2FnZS5qc29uJztcbmltcG9ydCB7IG5hbWUgYXMgaW5zdGFsbGF0aW9uc05hbWUgfSBmcm9tICcuLi8uLi8uLi9wYWNrYWdlcy9pbnN0YWxsYXRpb25zL3BhY2thZ2UuanNvbic7XG5pbXBvcnQgeyBuYW1lIGFzIGluc3RhbGxhdGlvbnNDb21wYXROYW1lIH0gZnJvbSAnLi4vLi4vLi4vcGFja2FnZXMvaW5zdGFsbGF0aW9ucy1jb21wYXQvcGFja2FnZS5qc29uJztcbmltcG9ydCB7IG5hbWUgYXMgbWVzc2FnaW5nTmFtZSB9IGZyb20gJy4uLy4uLy4uL3BhY2thZ2VzL21lc3NhZ2luZy9wYWNrYWdlLmpzb24nO1xuaW1wb3J0IHsgbmFtZSBhcyBtZXNzYWdpbmdDb21wYXROYW1lIH0gZnJvbSAnLi4vLi4vLi4vcGFja2FnZXMvbWVzc2FnaW5nLWNvbXBhdC9wYWNrYWdlLmpzb24nO1xuaW1wb3J0IHsgbmFtZSBhcyBwZXJmb3JtYW5jZU5hbWUgfSBmcm9tICcuLi8uLi8uLi9wYWNrYWdlcy9wZXJmb3JtYW5jZS9wYWNrYWdlLmpzb24nO1xuaW1wb3J0IHsgbmFtZSBhcyBwZXJmb3JtYW5jZUNvbXBhdE5hbWUgfSBmcm9tICcuLi8uLi8uLi9wYWNrYWdlcy9wZXJmb3JtYW5jZS1jb21wYXQvcGFja2FnZS5qc29uJztcbmltcG9ydCB7IG5hbWUgYXMgcmVtb3RlQ29uZmlnTmFtZSB9IGZyb20gJy4uLy4uLy4uL3BhY2thZ2VzL3JlbW90ZS1jb25maWcvcGFja2FnZS5qc29uJztcbmltcG9ydCB7IG5hbWUgYXMgcmVtb3RlQ29uZmlnQ29tcGF0TmFtZSB9IGZyb20gJy4uLy4uLy4uL3BhY2thZ2VzL3JlbW90ZS1jb25maWctY29tcGF0L3BhY2thZ2UuanNvbic7XG5pbXBvcnQgeyBuYW1lIGFzIHN0b3JhZ2VOYW1lIH0gZnJvbSAnLi4vLi4vLi4vcGFja2FnZXMvc3RvcmFnZS9wYWNrYWdlLmpzb24nO1xuaW1wb3J0IHsgbmFtZSBhcyBzdG9yYWdlQ29tcGF0TmFtZSB9IGZyb20gJy4uLy4uLy4uL3BhY2thZ2VzL3N0b3JhZ2UtY29tcGF0L3BhY2thZ2UuanNvbic7XG5pbXBvcnQgeyBuYW1lIGFzIGZpcmVzdG9yZU5hbWUgfSBmcm9tICcuLi8uLi8uLi9wYWNrYWdlcy9maXJlc3RvcmUvcGFja2FnZS5qc29uJztcbmltcG9ydCB7IG5hbWUgYXMgZmlyZXN0b3JlQ29tcGF0TmFtZSB9IGZyb20gJy4uLy4uLy4uL3BhY2thZ2VzL2ZpcmVzdG9yZS1jb21wYXQvcGFja2FnZS5qc29uJztcbmltcG9ydCB7IG5hbWUgYXMgcGFja2FnZU5hbWUgfSBmcm9tICcuLi8uLi8uLi9wYWNrYWdlcy9maXJlYmFzZS9wYWNrYWdlLmpzb24nO1xuXG4vKipcbiAqIFRoZSBkZWZhdWx0IGFwcCBuYW1lXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0VOVFJZX05BTUUgPSAnW0RFRkFVTFRdJztcblxuZXhwb3J0IGNvbnN0IFBMQVRGT1JNX0xPR19TVFJJTkcgPSB7XG4gIFthcHBOYW1lXTogJ2ZpcmUtY29yZScsXG4gIFthcHBDb21wYXROYW1lXTogJ2ZpcmUtY29yZS1jb21wYXQnLFxuICBbYW5hbHl0aWNzTmFtZV06ICdmaXJlLWFuYWx5dGljcycsXG4gIFthbmFseXRpY3NDb21wYXROYW1lXTogJ2ZpcmUtYW5hbHl0aWNzLWNvbXBhdCcsXG4gIFthcHBDaGVja05hbWVdOiAnZmlyZS1hcHAtY2hlY2snLFxuICBbYXBwQ2hlY2tDb21wYXROYW1lXTogJ2ZpcmUtYXBwLWNoZWNrLWNvbXBhdCcsXG4gIFthdXRoTmFtZV06ICdmaXJlLWF1dGgnLFxuICBbYXV0aENvbXBhdE5hbWVdOiAnZmlyZS1hdXRoLWNvbXBhdCcsXG4gIFtkYXRhYmFzZU5hbWVdOiAnZmlyZS1ydGRiJyxcbiAgW2RhdGFiYXNlQ29tcGF0TmFtZV06ICdmaXJlLXJ0ZGItY29tcGF0JyxcbiAgW2Z1bmN0aW9uc05hbWVdOiAnZmlyZS1mbicsXG4gIFtmdW5jdGlvbnNDb21wYXROYW1lXTogJ2ZpcmUtZm4tY29tcGF0JyxcbiAgW2luc3RhbGxhdGlvbnNOYW1lXTogJ2ZpcmUtaWlkJyxcbiAgW2luc3RhbGxhdGlvbnNDb21wYXROYW1lXTogJ2ZpcmUtaWlkLWNvbXBhdCcsXG4gIFttZXNzYWdpbmdOYW1lXTogJ2ZpcmUtZmNtJyxcbiAgW21lc3NhZ2luZ0NvbXBhdE5hbWVdOiAnZmlyZS1mY20tY29tcGF0JyxcbiAgW3BlcmZvcm1hbmNlTmFtZV06ICdmaXJlLXBlcmYnLFxuICBbcGVyZm9ybWFuY2VDb21wYXROYW1lXTogJ2ZpcmUtcGVyZi1jb21wYXQnLFxuICBbcmVtb3RlQ29uZmlnTmFtZV06ICdmaXJlLXJjJyxcbiAgW3JlbW90ZUNvbmZpZ0NvbXBhdE5hbWVdOiAnZmlyZS1yYy1jb21wYXQnLFxuICBbc3RvcmFnZU5hbWVdOiAnZmlyZS1nY3MnLFxuICBbc3RvcmFnZUNvbXBhdE5hbWVdOiAnZmlyZS1nY3MtY29tcGF0JyxcbiAgW2ZpcmVzdG9yZU5hbWVdOiAnZmlyZS1mc3QnLFxuICBbZmlyZXN0b3JlQ29tcGF0TmFtZV06ICdmaXJlLWZzdC1jb21wYXQnLFxuICAnZmlyZS1qcyc6ICdmaXJlLWpzJywgLy8gUGxhdGZvcm0gaWRlbnRpZmllciBmb3IgSlMgU0RLLlxuICBbcGFja2FnZU5hbWVdOiAnZmlyZS1qcy1hbGwnXG59IGFzIGNvbnN0O1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEZpcmViYXNlQXBwIH0gZnJvbSAnLi9wdWJsaWMtdHlwZXMnO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBQcm92aWRlciwgTmFtZSB9IGZyb20gJ0BmaXJlYmFzZS9jb21wb25lbnQnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgREVGQVVMVF9FTlRSWV9OQU1FIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgRmlyZWJhc2VBcHBJbXBsIH0gZnJvbSAnLi9maXJlYmFzZUFwcCc7XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBfYXBwcyA9IG5ldyBNYXA8c3RyaW5nLCBGaXJlYmFzZUFwcD4oKTtcblxuLyoqXG4gKiBSZWdpc3RlcmVkIGNvbXBvbmVudHMuXG4gKlxuICogQGludGVybmFsXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgY29uc3QgX2NvbXBvbmVudHMgPSBuZXcgTWFwPHN0cmluZywgQ29tcG9uZW50PGFueT4+KCk7XG5cbi8qKlxuICogQHBhcmFtIGNvbXBvbmVudCAtIHRoZSBjb21wb25lbnQgYmVpbmcgYWRkZWQgdG8gdGhpcyBhcHAncyBjb250YWluZXJcbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9hZGRDb21wb25lbnQ8VCBleHRlbmRzIE5hbWU+KFxuICBhcHA6IEZpcmViYXNlQXBwLFxuICBjb21wb25lbnQ6IENvbXBvbmVudDxUPlxuKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgKGFwcCBhcyBGaXJlYmFzZUFwcEltcGwpLmNvbnRhaW5lci5hZGRDb21wb25lbnQoY29tcG9uZW50KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgIGBDb21wb25lbnQgJHtjb21wb25lbnQubmFtZX0gZmFpbGVkIHRvIHJlZ2lzdGVyIHdpdGggRmlyZWJhc2VBcHAgJHthcHAubmFtZX1gLFxuICAgICAgZVxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfYWRkT3JPdmVyd3JpdGVDb21wb25lbnQoXG4gIGFwcDogRmlyZWJhc2VBcHAsXG4gIGNvbXBvbmVudDogQ29tcG9uZW50XG4pOiB2b2lkIHtcbiAgKGFwcCBhcyBGaXJlYmFzZUFwcEltcGwpLmNvbnRhaW5lci5hZGRPck92ZXJ3cml0ZUNvbXBvbmVudChjb21wb25lbnQpO1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0gY29tcG9uZW50IC0gdGhlIGNvbXBvbmVudCB0byByZWdpc3RlclxuICogQHJldHVybnMgd2hldGhlciBvciBub3QgdGhlIGNvbXBvbmVudCBpcyByZWdpc3RlcmVkIHN1Y2Nlc3NmdWxseVxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gX3JlZ2lzdGVyQ29tcG9uZW50PFQgZXh0ZW5kcyBOYW1lPihcbiAgY29tcG9uZW50OiBDb21wb25lbnQ8VD5cbik6IGJvb2xlYW4ge1xuICBjb25zdCBjb21wb25lbnROYW1lID0gY29tcG9uZW50Lm5hbWU7XG4gIGlmIChfY29tcG9uZW50cy5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICBgVGhlcmUgd2VyZSBtdWx0aXBsZSBhdHRlbXB0cyB0byByZWdpc3RlciBjb21wb25lbnQgJHtjb21wb25lbnROYW1lfS5gXG4gICAgKTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIF9jb21wb25lbnRzLnNldChjb21wb25lbnROYW1lLCBjb21wb25lbnQpO1xuXG4gIC8vIGFkZCB0aGUgY29tcG9uZW50IHRvIGV4aXN0aW5nIGFwcCBpbnN0YW5jZXNcbiAgZm9yIChjb25zdCBhcHAgb2YgX2FwcHMudmFsdWVzKCkpIHtcbiAgICBfYWRkQ29tcG9uZW50KGFwcCBhcyBGaXJlYmFzZUFwcEltcGwsIGNvbXBvbmVudCk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIGFwcCAtIEZpcmViYXNlQXBwIGluc3RhbmNlXG4gKiBAcGFyYW0gbmFtZSAtIHNlcnZpY2UgbmFtZVxuICpcbiAqIEByZXR1cm5zIHRoZSBwcm92aWRlciBmb3IgdGhlIHNlcnZpY2Ugd2l0aCB0aGUgbWF0Y2hpbmcgbmFtZVxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gX2dldFByb3ZpZGVyPFQgZXh0ZW5kcyBOYW1lPihcbiAgYXBwOiBGaXJlYmFzZUFwcCxcbiAgbmFtZTogVFxuKTogUHJvdmlkZXI8VD4ge1xuICBjb25zdCBoZWFydGJlYXRDb250cm9sbGVyID0gKGFwcCBhcyBGaXJlYmFzZUFwcEltcGwpLmNvbnRhaW5lclxuICAgIC5nZXRQcm92aWRlcignaGVhcnRiZWF0JylcbiAgICAuZ2V0SW1tZWRpYXRlKHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIGlmIChoZWFydGJlYXRDb250cm9sbGVyKSB7XG4gICAgdm9pZCBoZWFydGJlYXRDb250cm9sbGVyLnRyaWdnZXJIZWFydGJlYXQoKTtcbiAgfVxuICByZXR1cm4gKGFwcCBhcyBGaXJlYmFzZUFwcEltcGwpLmNvbnRhaW5lci5nZXRQcm92aWRlcihuYW1lKTtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIGFwcCAtIEZpcmViYXNlQXBwIGluc3RhbmNlXG4gKiBAcGFyYW0gbmFtZSAtIHNlcnZpY2UgbmFtZVxuICogQHBhcmFtIGluc3RhbmNlSWRlbnRpZmllciAtIHNlcnZpY2UgaW5zdGFuY2UgaWRlbnRpZmllciBpbiBjYXNlIHRoZSBzZXJ2aWNlIHN1cHBvcnRzIG11bHRpcGxlIGluc3RhbmNlc1xuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gX3JlbW92ZVNlcnZpY2VJbnN0YW5jZTxUIGV4dGVuZHMgTmFtZT4oXG4gIGFwcDogRmlyZWJhc2VBcHAsXG4gIG5hbWU6IFQsXG4gIGluc3RhbmNlSWRlbnRpZmllcjogc3RyaW5nID0gREVGQVVMVF9FTlRSWV9OQU1FXG4pOiB2b2lkIHtcbiAgX2dldFByb3ZpZGVyKGFwcCwgbmFtZSkuY2xlYXJJbnN0YW5jZShpbnN0YW5jZUlkZW50aWZpZXIpO1xufVxuXG4vKipcbiAqIFRlc3Qgb25seVxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gX2NsZWFyQ29tcG9uZW50cygpOiB2b2lkIHtcbiAgX2NvbXBvbmVudHMuY2xlYXIoKTtcbn1cblxuLyoqXG4gKiBFeHBvcnRlZCBpbiBvcmRlciB0byBiZSB1c2VkIGluIGFwcC1jb21wYXQgcGFja2FnZVxuICovXG5leHBvcnQgeyBERUZBVUxUX0VOVFJZX05BTUUgYXMgX0RFRkFVTFRfRU5UUllfTkFNRSB9O1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEVycm9yRmFjdG9yeSwgRXJyb3JNYXAgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5cbmV4cG9ydCBjb25zdCBlbnVtIEFwcEVycm9yIHtcbiAgTk9fQVBQID0gJ25vLWFwcCcsXG4gIEJBRF9BUFBfTkFNRSA9ICdiYWQtYXBwLW5hbWUnLFxuICBEVVBMSUNBVEVfQVBQID0gJ2R1cGxpY2F0ZS1hcHAnLFxuICBBUFBfREVMRVRFRCA9ICdhcHAtZGVsZXRlZCcsXG4gIE5PX09QVElPTlMgPSAnbm8tb3B0aW9ucycsXG4gIElOVkFMSURfQVBQX0FSR1VNRU5UID0gJ2ludmFsaWQtYXBwLWFyZ3VtZW50JyxcbiAgSU5WQUxJRF9MT0dfQVJHVU1FTlQgPSAnaW52YWxpZC1sb2ctYXJndW1lbnQnLFxuICBJREJfT1BFTiA9ICdpZGItb3BlbicsXG4gIElEQl9HRVQgPSAnaWRiLWdldCcsXG4gIElEQl9XUklURSA9ICdpZGItc2V0JyxcbiAgSURCX0RFTEVURSA9ICdpZGItZGVsZXRlJ1xufVxuXG5jb25zdCBFUlJPUlM6IEVycm9yTWFwPEFwcEVycm9yPiA9IHtcbiAgW0FwcEVycm9yLk5PX0FQUF06XG4gICAgXCJObyBGaXJlYmFzZSBBcHAgJ3skYXBwTmFtZX0nIGhhcyBiZWVuIGNyZWF0ZWQgLSBcIiArXG4gICAgJ2NhbGwgaW5pdGlhbGl6ZUFwcCgpIGZpcnN0JyxcbiAgW0FwcEVycm9yLkJBRF9BUFBfTkFNRV06IFwiSWxsZWdhbCBBcHAgbmFtZTogJ3skYXBwTmFtZX1cIixcbiAgW0FwcEVycm9yLkRVUExJQ0FURV9BUFBdOlxuICAgIFwiRmlyZWJhc2UgQXBwIG5hbWVkICd7JGFwcE5hbWV9JyBhbHJlYWR5IGV4aXN0cyB3aXRoIGRpZmZlcmVudCBvcHRpb25zIG9yIGNvbmZpZ1wiLFxuICBbQXBwRXJyb3IuQVBQX0RFTEVURURdOiBcIkZpcmViYXNlIEFwcCBuYW1lZCAneyRhcHBOYW1lfScgYWxyZWFkeSBkZWxldGVkXCIsXG4gIFtBcHBFcnJvci5OT19PUFRJT05TXTpcbiAgICAnTmVlZCB0byBwcm92aWRlIG9wdGlvbnMsIHdoZW4gbm90IGJlaW5nIGRlcGxveWVkIHRvIGhvc3RpbmcgdmlhIHNvdXJjZS4nLFxuICBbQXBwRXJyb3IuSU5WQUxJRF9BUFBfQVJHVU1FTlRdOlxuICAgICdmaXJlYmFzZS57JGFwcE5hbWV9KCkgdGFrZXMgZWl0aGVyIG5vIGFyZ3VtZW50IG9yIGEgJyArXG4gICAgJ0ZpcmViYXNlIEFwcCBpbnN0YW5jZS4nLFxuICBbQXBwRXJyb3IuSU5WQUxJRF9MT0dfQVJHVU1FTlRdOlxuICAgICdGaXJzdCBhcmd1bWVudCB0byBgb25Mb2dgIG11c3QgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLicsXG4gIFtBcHBFcnJvci5JREJfT1BFTl06XG4gICAgJ0Vycm9yIHRocm93biB3aGVuIG9wZW5pbmcgSW5kZXhlZERCLiBPcmlnaW5hbCBlcnJvcjogeyRvcmlnaW5hbEVycm9yTWVzc2FnZX0uJyxcbiAgW0FwcEVycm9yLklEQl9HRVRdOlxuICAgICdFcnJvciB0aHJvd24gd2hlbiByZWFkaW5nIGZyb20gSW5kZXhlZERCLiBPcmlnaW5hbCBlcnJvcjogeyRvcmlnaW5hbEVycm9yTWVzc2FnZX0uJyxcbiAgW0FwcEVycm9yLklEQl9XUklURV06XG4gICAgJ0Vycm9yIHRocm93biB3aGVuIHdyaXRpbmcgdG8gSW5kZXhlZERCLiBPcmlnaW5hbCBlcnJvcjogeyRvcmlnaW5hbEVycm9yTWVzc2FnZX0uJyxcbiAgW0FwcEVycm9yLklEQl9ERUxFVEVdOlxuICAgICdFcnJvciB0aHJvd24gd2hlbiBkZWxldGluZyBmcm9tIEluZGV4ZWREQi4gT3JpZ2luYWwgZXJyb3I6IHskb3JpZ2luYWxFcnJvck1lc3NhZ2V9Lidcbn07XG5cbmludGVyZmFjZSBFcnJvclBhcmFtcyB7XG4gIFtBcHBFcnJvci5OT19BUFBdOiB7IGFwcE5hbWU6IHN0cmluZyB9O1xuICBbQXBwRXJyb3IuQkFEX0FQUF9OQU1FXTogeyBhcHBOYW1lOiBzdHJpbmcgfTtcbiAgW0FwcEVycm9yLkRVUExJQ0FURV9BUFBdOiB7IGFwcE5hbWU6IHN0cmluZyB9O1xuICBbQXBwRXJyb3IuQVBQX0RFTEVURURdOiB7IGFwcE5hbWU6IHN0cmluZyB9O1xuICBbQXBwRXJyb3IuSU5WQUxJRF9BUFBfQVJHVU1FTlRdOiB7IGFwcE5hbWU6IHN0cmluZyB9O1xuICBbQXBwRXJyb3IuSURCX09QRU5dOiB7IG9yaWdpbmFsRXJyb3JNZXNzYWdlPzogc3RyaW5nIH07XG4gIFtBcHBFcnJvci5JREJfR0VUXTogeyBvcmlnaW5hbEVycm9yTWVzc2FnZT86IHN0cmluZyB9O1xuICBbQXBwRXJyb3IuSURCX1dSSVRFXTogeyBvcmlnaW5hbEVycm9yTWVzc2FnZT86IHN0cmluZyB9O1xuICBbQXBwRXJyb3IuSURCX0RFTEVURV06IHsgb3JpZ2luYWxFcnJvck1lc3NhZ2U/OiBzdHJpbmcgfTtcbn1cblxuZXhwb3J0IGNvbnN0IEVSUk9SX0ZBQ1RPUlkgPSBuZXcgRXJyb3JGYWN0b3J5PEFwcEVycm9yLCBFcnJvclBhcmFtcz4oXG4gICdhcHAnLFxuICAnRmlyZWJhc2UnLFxuICBFUlJPUlNcbik7XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgRmlyZWJhc2VBcHAsXG4gIEZpcmViYXNlT3B0aW9ucyxcbiAgRmlyZWJhc2VBcHBTZXR0aW5nc1xufSBmcm9tICcuL3B1YmxpYy10eXBlcyc7XG5pbXBvcnQge1xuICBDb21wb25lbnRDb250YWluZXIsXG4gIENvbXBvbmVudCxcbiAgQ29tcG9uZW50VHlwZVxufSBmcm9tICdAZmlyZWJhc2UvY29tcG9uZW50JztcbmltcG9ydCB7IEVSUk9SX0ZBQ1RPUlksIEFwcEVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuXG5leHBvcnQgY2xhc3MgRmlyZWJhc2VBcHBJbXBsIGltcGxlbWVudHMgRmlyZWJhc2VBcHAge1xuICBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zOiBGaXJlYmFzZU9wdGlvbnM7XG4gIHByaXZhdGUgcmVhZG9ubHkgX25hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIE9yaWdpbmFsIGNvbmZpZyB2YWx1ZXMgcGFzc2VkIGluIGFzIGEgY29uc3RydWN0b3IgcGFyYW1ldGVyLlxuICAgKiBJdCBpcyBvbmx5IHVzZWQgdG8gY29tcGFyZSB3aXRoIGFub3RoZXIgY29uZmlnIG9iamVjdCB0byBzdXBwb3J0IGlkZW1wb3RlbnQgaW5pdGlhbGl6ZUFwcCgpLlxuICAgKlxuICAgKiBVcGRhdGluZyBhdXRvbWF0aWNEYXRhQ29sbGVjdGlvbkVuYWJsZWQgb24gdGhlIEFwcCBpbnN0YW5jZSB3aWxsIG5vdCBjaGFuZ2UgaXRzIHZhbHVlIGluIF9jb25maWcuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9jb25maWc6IFJlcXVpcmVkPEZpcmViYXNlQXBwU2V0dGluZ3M+O1xuICBwcml2YXRlIF9hdXRvbWF0aWNEYXRhQ29sbGVjdGlvbkVuYWJsZWQ6IGJvb2xlYW47XG4gIHByaXZhdGUgX2lzRGVsZXRlZCA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IF9jb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBvcHRpb25zOiBGaXJlYmFzZU9wdGlvbnMsXG4gICAgY29uZmlnOiBSZXF1aXJlZDxGaXJlYmFzZUFwcFNldHRpbmdzPixcbiAgICBjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lclxuICApIHtcbiAgICB0aGlzLl9vcHRpb25zID0geyAuLi5vcHRpb25zIH07XG4gICAgdGhpcy5fY29uZmlnID0geyAuLi5jb25maWcgfTtcbiAgICB0aGlzLl9uYW1lID0gY29uZmlnLm5hbWU7XG4gICAgdGhpcy5fYXV0b21hdGljRGF0YUNvbGxlY3Rpb25FbmFibGVkID1cbiAgICAgIGNvbmZpZy5hdXRvbWF0aWNEYXRhQ29sbGVjdGlvbkVuYWJsZWQ7XG4gICAgdGhpcy5fY29udGFpbmVyID0gY29udGFpbmVyO1xuICAgIHRoaXMuY29udGFpbmVyLmFkZENvbXBvbmVudChcbiAgICAgIG5ldyBDb21wb25lbnQoJ2FwcCcsICgpID0+IHRoaXMsIENvbXBvbmVudFR5cGUuUFVCTElDKVxuICAgICk7XG4gIH1cblxuICBnZXQgYXV0b21hdGljRGF0YUNvbGxlY3Rpb25FbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHRoaXMuY2hlY2tEZXN0cm95ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5fYXV0b21hdGljRGF0YUNvbGxlY3Rpb25FbmFibGVkO1xuICB9XG5cbiAgc2V0IGF1dG9tYXRpY0RhdGFDb2xsZWN0aW9uRW5hYmxlZCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmNoZWNrRGVzdHJveWVkKCk7XG4gICAgdGhpcy5fYXV0b21hdGljRGF0YUNvbGxlY3Rpb25FbmFibGVkID0gdmFsO1xuICB9XG5cbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICB0aGlzLmNoZWNrRGVzdHJveWVkKCk7XG4gICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gIH1cblxuICBnZXQgb3B0aW9ucygpOiBGaXJlYmFzZU9wdGlvbnMge1xuICAgIHRoaXMuY2hlY2tEZXN0cm95ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5fb3B0aW9ucztcbiAgfVxuXG4gIGdldCBjb25maWcoKTogUmVxdWlyZWQ8RmlyZWJhc2VBcHBTZXR0aW5ncz4ge1xuICAgIHRoaXMuY2hlY2tEZXN0cm95ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnO1xuICB9XG5cbiAgZ2V0IGNvbnRhaW5lcigpOiBDb21wb25lbnRDb250YWluZXIge1xuICAgIHJldHVybiB0aGlzLl9jb250YWluZXI7XG4gIH1cblxuICBnZXQgaXNEZWxldGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc0RlbGV0ZWQ7XG4gIH1cblxuICBzZXQgaXNEZWxldGVkKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuX2lzRGVsZXRlZCA9IHZhbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgdGhyb3cgYW4gRXJyb3IgaWYgdGhlIEFwcCBoYXMgYWxyZWFkeSBiZWVuIGRlbGV0ZWQgLVxuICAgKiB1c2UgYmVmb3JlIHBlcmZvcm1pbmcgQVBJIGFjdGlvbnMgb24gdGhlIEFwcC5cbiAgICovXG4gIHByaXZhdGUgY2hlY2tEZXN0cm95ZWQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNEZWxldGVkKSB7XG4gICAgICB0aHJvdyBFUlJPUl9GQUNUT1JZLmNyZWF0ZShBcHBFcnJvci5BUFBfREVMRVRFRCwgeyBhcHBOYW1lOiB0aGlzLl9uYW1lIH0pO1xuICAgIH1cbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gIEZpcmViYXNlQXBwLFxuICBGaXJlYmFzZU9wdGlvbnMsXG4gIEZpcmViYXNlQXBwU2V0dGluZ3Ncbn0gZnJvbSAnLi9wdWJsaWMtdHlwZXMnO1xuaW1wb3J0IHsgREVGQVVMVF9FTlRSWV9OQU1FLCBQTEFURk9STV9MT0dfU1RSSU5HIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgRVJST1JfRkFDVE9SWSwgQXBwRXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQge1xuICBDb21wb25lbnRDb250YWluZXIsXG4gIENvbXBvbmVudCxcbiAgTmFtZSxcbiAgQ29tcG9uZW50VHlwZVxufSBmcm9tICdAZmlyZWJhc2UvY29tcG9uZW50JztcbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tICcuLi8uLi9maXJlYmFzZS9wYWNrYWdlLmpzb24nO1xuaW1wb3J0IHsgRmlyZWJhc2VBcHBJbXBsIH0gZnJvbSAnLi9maXJlYmFzZUFwcCc7XG5pbXBvcnQgeyBfYXBwcywgX2NvbXBvbmVudHMsIF9yZWdpc3RlckNvbXBvbmVudCB9IGZyb20gJy4vaW50ZXJuYWwnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHtcbiAgTG9nTGV2ZWxTdHJpbmcsXG4gIHNldExvZ0xldmVsIGFzIHNldExvZ0xldmVsSW1wbCxcbiAgTG9nQ2FsbGJhY2ssXG4gIExvZ09wdGlvbnMsXG4gIHNldFVzZXJMb2dIYW5kbGVyXG59IGZyb20gJ0BmaXJlYmFzZS9sb2dnZXInO1xuaW1wb3J0IHsgZGVlcEVxdWFsLCBnZXREZWZhdWx0QXBwQ29uZmlnIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuXG5leHBvcnQgeyBGaXJlYmFzZUVycm9yIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuXG4vKipcbiAqIFRoZSBjdXJyZW50IFNESyB2ZXJzaW9uLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IFNES19WRVJTSU9OID0gdmVyc2lvbjtcblxuLyoqXG4gKiBDcmVhdGVzIGFuZCBpbml0aWFsaXplcyBhIHtAbGluayBAZmlyZWJhc2UvYXBwI0ZpcmViYXNlQXBwfSBpbnN0YW5jZS5cbiAqXG4gKiBTZWVcbiAqIHtAbGlua1xuICogICBodHRwczovL2ZpcmViYXNlLmdvb2dsZS5jb20vZG9jcy93ZWIvc2V0dXAjYWRkX2ZpcmViYXNlX3RvX3lvdXJfYXBwXG4gKiAgIHwgQWRkIEZpcmViYXNlIHRvIHlvdXIgYXBwfSBhbmRcbiAqIHtAbGlua1xuICogICBodHRwczovL2ZpcmViYXNlLmdvb2dsZS5jb20vZG9jcy93ZWIvc2V0dXAjbXVsdGlwbGUtcHJvamVjdHNcbiAqICAgfCBJbml0aWFsaXplIG11bHRpcGxlIHByb2plY3RzfSBmb3IgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgamF2YXNjcmlwdFxuICpcbiAqIC8vIEluaXRpYWxpemUgZGVmYXVsdCBhcHBcbiAqIC8vIFJldHJpZXZlIHlvdXIgb3duIG9wdGlvbnMgdmFsdWVzIGJ5IGFkZGluZyBhIHdlYiBhcHAgb25cbiAqIC8vIGh0dHBzOi8vY29uc29sZS5maXJlYmFzZS5nb29nbGUuY29tXG4gKiBpbml0aWFsaXplQXBwKHtcbiAqICAgYXBpS2V5OiBcIkFJemEuLi4uXCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdXRoIC8gR2VuZXJhbCBVc2VcbiAqICAgYXV0aERvbWFpbjogXCJZT1VSX0FQUC5maXJlYmFzZWFwcC5jb21cIiwgICAgICAgICAvLyBBdXRoIHdpdGggcG9wdXAvcmVkaXJlY3RcbiAqICAgZGF0YWJhc2VVUkw6IFwiaHR0cHM6Ly9ZT1VSX0FQUC5maXJlYmFzZWlvLmNvbVwiLCAvLyBSZWFsdGltZSBEYXRhYmFzZVxuICogICBzdG9yYWdlQnVja2V0OiBcIllPVVJfQVBQLmFwcHNwb3QuY29tXCIsICAgICAgICAgIC8vIFN0b3JhZ2VcbiAqICAgbWVzc2FnaW5nU2VuZGVySWQ6IFwiMTIzNDU2Nzg5XCIgICAgICAgICAgICAgICAgICAvLyBDbG91ZCBNZXNzYWdpbmdcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGphdmFzY3JpcHRcbiAqXG4gKiAvLyBJbml0aWFsaXplIGFub3RoZXIgYXBwXG4gKiBjb25zdCBvdGhlckFwcCA9IGluaXRpYWxpemVBcHAoe1xuICogICBkYXRhYmFzZVVSTDogXCJodHRwczovLzxPVEhFUl9EQVRBQkFTRV9OQU1FPi5maXJlYmFzZWlvLmNvbVwiLFxuICogICBzdG9yYWdlQnVja2V0OiBcIjxPVEhFUl9TVE9SQUdFX0JVQ0tFVD4uYXBwc3BvdC5jb21cIlxuICogfSwgXCJvdGhlckFwcFwiKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBjb25maWd1cmUgdGhlIGFwcCdzIHNlcnZpY2VzLlxuICogQHBhcmFtIG5hbWUgLSBPcHRpb25hbCBuYW1lIG9mIHRoZSBhcHAgdG8gaW5pdGlhbGl6ZS4gSWYgbm8gbmFtZVxuICogICBpcyBwcm92aWRlZCwgdGhlIGRlZmF1bHQgaXMgYFwiW0RFRkFVTFRdXCJgLlxuICpcbiAqIEByZXR1cm5zIFRoZSBpbml0aWFsaXplZCBhcHAuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdGlhbGl6ZUFwcChcbiAgb3B0aW9uczogRmlyZWJhc2VPcHRpb25zLFxuICBuYW1lPzogc3RyaW5nXG4pOiBGaXJlYmFzZUFwcDtcbi8qKlxuICogQ3JlYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSBGaXJlYmFzZUFwcCBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gY29uZmlndXJlIHRoZSBhcHAncyBzZXJ2aWNlcy5cbiAqIEBwYXJhbSBjb25maWcgLSBGaXJlYmFzZUFwcCBDb25maWd1cmF0aW9uXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdGlhbGl6ZUFwcChcbiAgb3B0aW9uczogRmlyZWJhc2VPcHRpb25zLFxuICBjb25maWc/OiBGaXJlYmFzZUFwcFNldHRpbmdzXG4pOiBGaXJlYmFzZUFwcDtcbi8qKlxuICogQ3JlYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSBGaXJlYmFzZUFwcCBpbnN0YW5jZS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsaXplQXBwKCk6IEZpcmViYXNlQXBwO1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxpemVBcHAoXG4gIF9vcHRpb25zPzogRmlyZWJhc2VPcHRpb25zLFxuICByYXdDb25maWcgPSB7fVxuKTogRmlyZWJhc2VBcHAge1xuICBsZXQgb3B0aW9ucyA9IF9vcHRpb25zO1xuXG4gIGlmICh0eXBlb2YgcmF3Q29uZmlnICE9PSAnb2JqZWN0Jykge1xuICAgIGNvbnN0IG5hbWUgPSByYXdDb25maWc7XG4gICAgcmF3Q29uZmlnID0geyBuYW1lIH07XG4gIH1cblxuICBjb25zdCBjb25maWc6IFJlcXVpcmVkPEZpcmViYXNlQXBwU2V0dGluZ3M+ID0ge1xuICAgIG5hbWU6IERFRkFVTFRfRU5UUllfTkFNRSxcbiAgICBhdXRvbWF0aWNEYXRhQ29sbGVjdGlvbkVuYWJsZWQ6IGZhbHNlLFxuICAgIC4uLnJhd0NvbmZpZ1xuICB9O1xuICBjb25zdCBuYW1lID0gY29uZmlnLm5hbWU7XG5cbiAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJyB8fCAhbmFtZSkge1xuICAgIHRocm93IEVSUk9SX0ZBQ1RPUlkuY3JlYXRlKEFwcEVycm9yLkJBRF9BUFBfTkFNRSwge1xuICAgICAgYXBwTmFtZTogU3RyaW5nKG5hbWUpXG4gICAgfSk7XG4gIH1cblxuICBvcHRpb25zIHx8PSBnZXREZWZhdWx0QXBwQ29uZmlnKCk7XG5cbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgdGhyb3cgRVJST1JfRkFDVE9SWS5jcmVhdGUoQXBwRXJyb3IuTk9fT1BUSU9OUyk7XG4gIH1cblxuICBjb25zdCBleGlzdGluZ0FwcCA9IF9hcHBzLmdldChuYW1lKSBhcyBGaXJlYmFzZUFwcEltcGw7XG4gIGlmIChleGlzdGluZ0FwcCkge1xuICAgIC8vIHJldHVybiB0aGUgZXhpc3RpbmcgYXBwIGlmIG9wdGlvbnMgYW5kIGNvbmZpZyBkZWVwIGVxdWFsIHRoZSBvbmVzIGluIHRoZSBleGlzdGluZyBhcHAuXG4gICAgaWYgKFxuICAgICAgZGVlcEVxdWFsKG9wdGlvbnMsIGV4aXN0aW5nQXBwLm9wdGlvbnMpICYmXG4gICAgICBkZWVwRXF1YWwoY29uZmlnLCBleGlzdGluZ0FwcC5jb25maWcpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZXhpc3RpbmdBcHA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IEVSUk9SX0ZBQ1RPUlkuY3JlYXRlKEFwcEVycm9yLkRVUExJQ0FURV9BUFAsIHsgYXBwTmFtZTogbmFtZSB9KTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBjb250YWluZXIgPSBuZXcgQ29tcG9uZW50Q29udGFpbmVyKG5hbWUpO1xuICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBfY29tcG9uZW50cy52YWx1ZXMoKSkge1xuICAgIGNvbnRhaW5lci5hZGRDb21wb25lbnQoY29tcG9uZW50KTtcbiAgfVxuXG4gIGNvbnN0IG5ld0FwcCA9IG5ldyBGaXJlYmFzZUFwcEltcGwob3B0aW9ucywgY29uZmlnLCBjb250YWluZXIpO1xuXG4gIF9hcHBzLnNldChuYW1lLCBuZXdBcHApO1xuXG4gIHJldHVybiBuZXdBcHA7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIGEge0BsaW5rIEBmaXJlYmFzZS9hcHAjRmlyZWJhc2VBcHB9IGluc3RhbmNlLlxuICpcbiAqIFdoZW4gY2FsbGVkIHdpdGggbm8gYXJndW1lbnRzLCB0aGUgZGVmYXVsdCBhcHAgaXMgcmV0dXJuZWQuIFdoZW4gYW4gYXBwIG5hbWVcbiAqIGlzIHByb3ZpZGVkLCB0aGUgYXBwIGNvcnJlc3BvbmRpbmcgdG8gdGhhdCBuYW1lIGlzIHJldHVybmVkLlxuICpcbiAqIEFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIGFwcCBiZWluZyByZXRyaWV2ZWQgaGFzIG5vdCB5ZXQgYmVlblxuICogaW5pdGlhbGl6ZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGphdmFzY3JpcHRcbiAqIC8vIFJldHVybiB0aGUgZGVmYXVsdCBhcHBcbiAqIGNvbnN0IGFwcCA9IGdldEFwcCgpO1xuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGphdmFzY3JpcHRcbiAqIC8vIFJldHVybiBhIG5hbWVkIGFwcFxuICogY29uc3Qgb3RoZXJBcHAgPSBnZXRBcHAoXCJvdGhlckFwcFwiKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBuYW1lIC0gT3B0aW9uYWwgbmFtZSBvZiB0aGUgYXBwIHRvIHJldHVybi4gSWYgbm8gbmFtZSBpc1xuICogICBwcm92aWRlZCwgdGhlIGRlZmF1bHQgaXMgYFwiW0RFRkFVTFRdXCJgLlxuICpcbiAqIEByZXR1cm5zIFRoZSBhcHAgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvdmlkZWQgYXBwIG5hbWUuXG4gKiAgIElmIG5vIGFwcCBuYW1lIGlzIHByb3ZpZGVkLCB0aGUgZGVmYXVsdCBhcHAgaXMgcmV0dXJuZWQuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXBwKG5hbWU6IHN0cmluZyA9IERFRkFVTFRfRU5UUllfTkFNRSk6IEZpcmViYXNlQXBwIHtcbiAgY29uc3QgYXBwID0gX2FwcHMuZ2V0KG5hbWUpO1xuICBpZiAoIWFwcCAmJiBuYW1lID09PSBERUZBVUxUX0VOVFJZX05BTUUgJiYgZ2V0RGVmYXVsdEFwcENvbmZpZygpKSB7XG4gICAgcmV0dXJuIGluaXRpYWxpemVBcHAoKTtcbiAgfVxuICBpZiAoIWFwcCkge1xuICAgIHRocm93IEVSUk9SX0ZBQ1RPUlkuY3JlYXRlKEFwcEVycm9yLk5PX0FQUCwgeyBhcHBOYW1lOiBuYW1lIH0pO1xuICB9XG5cbiAgcmV0dXJuIGFwcDtcbn1cblxuLyoqXG4gKiBBIChyZWFkLW9ubHkpIGFycmF5IG9mIGFsbCBpbml0aWFsaXplZCBhcHBzLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXBwcygpOiBGaXJlYmFzZUFwcFtdIHtcbiAgcmV0dXJuIEFycmF5LmZyb20oX2FwcHMudmFsdWVzKCkpO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgdGhpcyBhcHAgdW51c2FibGUgYW5kIGZyZWVzIHRoZSByZXNvdXJjZXMgb2YgYWxsIGFzc29jaWF0ZWRcbiAqIHNlcnZpY2VzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBkZWxldGVBcHAoYXBwKVxuICogICAudGhlbihmdW5jdGlvbigpIHtcbiAqICAgICBjb25zb2xlLmxvZyhcIkFwcCBkZWxldGVkIHN1Y2Nlc3NmdWxseVwiKTtcbiAqICAgfSlcbiAqICAgLmNhdGNoKGZ1bmN0aW9uKGVycm9yKSB7XG4gKiAgICAgY29uc29sZS5sb2coXCJFcnJvciBkZWxldGluZyBhcHA6XCIsIGVycm9yKTtcbiAqICAgfSk7XG4gKiBgYGBcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVBcHAoYXBwOiBGaXJlYmFzZUFwcCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBuYW1lID0gYXBwLm5hbWU7XG4gIGlmIChfYXBwcy5oYXMobmFtZSkpIHtcbiAgICBfYXBwcy5kZWxldGUobmFtZSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAoYXBwIGFzIEZpcmViYXNlQXBwSW1wbCkuY29udGFpbmVyXG4gICAgICAgIC5nZXRQcm92aWRlcnMoKVxuICAgICAgICAubWFwKHByb3ZpZGVyID0+IHByb3ZpZGVyLmRlbGV0ZSgpKVxuICAgICk7XG4gICAgKGFwcCBhcyBGaXJlYmFzZUFwcEltcGwpLmlzRGVsZXRlZCA9IHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBsaWJyYXJ5J3MgbmFtZSBhbmQgdmVyc2lvbiBmb3IgcGxhdGZvcm0gbG9nZ2luZyBwdXJwb3Nlcy5cbiAqIEBwYXJhbSBsaWJyYXJ5IC0gTmFtZSBvZiAxcCBvciAzcCBsaWJyYXJ5IChlLmcuIGZpcmVzdG9yZSwgYW5ndWxhcmZpcmUpXG4gKiBAcGFyYW0gdmVyc2lvbiAtIEN1cnJlbnQgdmVyc2lvbiBvZiB0aGF0IGxpYnJhcnkuXG4gKiBAcGFyYW0gdmFyaWFudCAtIEJ1bmRsZSB2YXJpYW50LCBlLmcuLCBub2RlLCBybiwgZXRjLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyVmVyc2lvbihcbiAgbGlicmFyeUtleU9yTmFtZTogc3RyaW5nLFxuICB2ZXJzaW9uOiBzdHJpbmcsXG4gIHZhcmlhbnQ/OiBzdHJpbmdcbik6IHZvaWQge1xuICAvLyBUT0RPOiBXZSBjYW4gdXNlIHRoaXMgY2hlY2sgdG8gd2hpdGVsaXN0IHN0cmluZ3Mgd2hlbi9pZiB3ZSBzZXQgdXBcbiAgLy8gYSBnb29kIHdoaXRlbGlzdCBzeXN0ZW0uXG4gIGxldCBsaWJyYXJ5ID0gUExBVEZPUk1fTE9HX1NUUklOR1tsaWJyYXJ5S2V5T3JOYW1lXSA/PyBsaWJyYXJ5S2V5T3JOYW1lO1xuICBpZiAodmFyaWFudCkge1xuICAgIGxpYnJhcnkgKz0gYC0ke3ZhcmlhbnR9YDtcbiAgfVxuICBjb25zdCBsaWJyYXJ5TWlzbWF0Y2ggPSBsaWJyYXJ5Lm1hdGNoKC9cXHN8XFwvLyk7XG4gIGNvbnN0IHZlcnNpb25NaXNtYXRjaCA9IHZlcnNpb24ubWF0Y2goL1xcc3xcXC8vKTtcbiAgaWYgKGxpYnJhcnlNaXNtYXRjaCB8fCB2ZXJzaW9uTWlzbWF0Y2gpIHtcbiAgICBjb25zdCB3YXJuaW5nID0gW1xuICAgICAgYFVuYWJsZSB0byByZWdpc3RlciBsaWJyYXJ5IFwiJHtsaWJyYXJ5fVwiIHdpdGggdmVyc2lvbiBcIiR7dmVyc2lvbn1cIjpgXG4gICAgXTtcbiAgICBpZiAobGlicmFyeU1pc21hdGNoKSB7XG4gICAgICB3YXJuaW5nLnB1c2goXG4gICAgICAgIGBsaWJyYXJ5IG5hbWUgXCIke2xpYnJhcnl9XCIgY29udGFpbnMgaWxsZWdhbCBjaGFyYWN0ZXJzICh3aGl0ZXNwYWNlIG9yIFwiL1wiKWBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChsaWJyYXJ5TWlzbWF0Y2ggJiYgdmVyc2lvbk1pc21hdGNoKSB7XG4gICAgICB3YXJuaW5nLnB1c2goJ2FuZCcpO1xuICAgIH1cbiAgICBpZiAodmVyc2lvbk1pc21hdGNoKSB7XG4gICAgICB3YXJuaW5nLnB1c2goXG4gICAgICAgIGB2ZXJzaW9uIG5hbWUgXCIke3ZlcnNpb259XCIgY29udGFpbnMgaWxsZWdhbCBjaGFyYWN0ZXJzICh3aGl0ZXNwYWNlIG9yIFwiL1wiKWBcbiAgICAgICk7XG4gICAgfVxuICAgIGxvZ2dlci53YXJuKHdhcm5pbmcuam9pbignICcpKTtcbiAgICByZXR1cm47XG4gIH1cbiAgX3JlZ2lzdGVyQ29tcG9uZW50KFxuICAgIG5ldyBDb21wb25lbnQoXG4gICAgICBgJHtsaWJyYXJ5fS12ZXJzaW9uYCBhcyBOYW1lLFxuICAgICAgKCkgPT4gKHsgbGlicmFyeSwgdmVyc2lvbiB9KSxcbiAgICAgIENvbXBvbmVudFR5cGUuVkVSU0lPTlxuICAgIClcbiAgKTtcbn1cblxuLyoqXG4gKiBTZXRzIGxvZyBoYW5kbGVyIGZvciBhbGwgRmlyZWJhc2UgU0RLcy5cbiAqIEBwYXJhbSBsb2dDYWxsYmFjayAtIEFuIG9wdGlvbmFsIGN1c3RvbSBsb2cgaGFuZGxlciB0aGF0IGV4ZWN1dGVzIHVzZXIgY29kZSB3aGVuZXZlclxuICogdGhlIEZpcmViYXNlIFNESyBtYWtlcyBhIGxvZ2dpbmcgY2FsbC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkxvZyhcbiAgbG9nQ2FsbGJhY2s6IExvZ0NhbGxiYWNrIHwgbnVsbCxcbiAgb3B0aW9ucz86IExvZ09wdGlvbnNcbik6IHZvaWQge1xuICBpZiAobG9nQ2FsbGJhY2sgIT09IG51bGwgJiYgdHlwZW9mIGxvZ0NhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgRVJST1JfRkFDVE9SWS5jcmVhdGUoQXBwRXJyb3IuSU5WQUxJRF9MT0dfQVJHVU1FTlQpO1xuICB9XG4gIHNldFVzZXJMb2dIYW5kbGVyKGxvZ0NhbGxiYWNrLCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBTZXRzIGxvZyBsZXZlbCBmb3IgYWxsIEZpcmViYXNlIFNES3MuXG4gKlxuICogQWxsIG9mIHRoZSBsb2cgdHlwZXMgYWJvdmUgdGhlIGN1cnJlbnQgbG9nIGxldmVsIGFyZSBjYXB0dXJlZCAoaS5lLiBpZlxuICogeW91IHNldCB0aGUgbG9nIGxldmVsIHRvIGBpbmZvYCwgZXJyb3JzIGFyZSBsb2dnZWQsIGJ1dCBgZGVidWdgIGFuZFxuICogYHZlcmJvc2VgIGxvZ3MgYXJlIG5vdCkuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0TG9nTGV2ZWwobG9nTGV2ZWw6IExvZ0xldmVsU3RyaW5nKTogdm9pZCB7XG4gIHNldExvZ0xldmVsSW1wbChsb2dMZXZlbCk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgRmlyZWJhc2VFcnJvciB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcbmltcG9ydCB7IERCU2NoZW1hLCBvcGVuREIsIElEQlBEYXRhYmFzZSB9IGZyb20gJ2lkYic7XG5pbXBvcnQgeyBBcHBFcnJvciwgRVJST1JfRkFDVE9SWSB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IEZpcmViYXNlQXBwIH0gZnJvbSAnLi9wdWJsaWMtdHlwZXMnO1xuaW1wb3J0IHsgSGVhcnRiZWF0c0luSW5kZXhlZERCIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL2xvZ2dlcic7XG5cbmNvbnN0IERCX05BTUUgPSAnZmlyZWJhc2UtaGVhcnRiZWF0LWRhdGFiYXNlJztcbmNvbnN0IERCX1ZFUlNJT04gPSAxO1xuY29uc3QgU1RPUkVfTkFNRSA9ICdmaXJlYmFzZS1oZWFydGJlYXQtc3RvcmUnO1xuXG5pbnRlcmZhY2UgQXBwREIgZXh0ZW5kcyBEQlNjaGVtYSB7XG4gICdmaXJlYmFzZS1oZWFydGJlYXQtc3RvcmUnOiB7XG4gICAga2V5OiBzdHJpbmc7XG4gICAgdmFsdWU6IEhlYXJ0YmVhdHNJbkluZGV4ZWREQjtcbiAgfTtcbn1cblxubGV0IGRiUHJvbWlzZTogUHJvbWlzZTxJREJQRGF0YWJhc2U8QXBwREI+PiB8IG51bGwgPSBudWxsO1xuZnVuY3Rpb24gZ2V0RGJQcm9taXNlKCk6IFByb21pc2U8SURCUERhdGFiYXNlPEFwcERCPj4ge1xuICBpZiAoIWRiUHJvbWlzZSkge1xuICAgIGRiUHJvbWlzZSA9IG9wZW5EQjxBcHBEQj4oREJfTkFNRSwgREJfVkVSU0lPTiwge1xuICAgICAgdXBncmFkZTogKGRiLCBvbGRWZXJzaW9uKSA9PiB7XG4gICAgICAgIC8vIFdlIGRvbid0IHVzZSAnYnJlYWsnIGluIHRoaXMgc3dpdGNoIHN0YXRlbWVudCwgdGhlIGZhbGwtdGhyb3VnaFxuICAgICAgICAvLyBiZWhhdmlvciBpcyB3aGF0IHdlIHdhbnQsIGJlY2F1c2UgaWYgdGhlcmUgYXJlIG11bHRpcGxlIHZlcnNpb25zIGJldHdlZW5cbiAgICAgICAgLy8gdGhlIG9sZCB2ZXJzaW9uIGFuZCB0aGUgY3VycmVudCB2ZXJzaW9uLCB3ZSB3YW50IEFMTCB0aGUgbWlncmF0aW9uc1xuICAgICAgICAvLyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhvc2UgdmVyc2lvbnMgdG8gcnVuLCBub3Qgb25seSB0aGUgbGFzdCBvbmUuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBkZWZhdWx0LWNhc2VcbiAgICAgICAgc3dpdGNoIChvbGRWZXJzaW9uKSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgZGIuY3JlYXRlT2JqZWN0U3RvcmUoU1RPUkVfTkFNRSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KS5jYXRjaChlID0+IHtcbiAgICAgIHRocm93IEVSUk9SX0ZBQ1RPUlkuY3JlYXRlKEFwcEVycm9yLklEQl9PUEVOLCB7XG4gICAgICAgIG9yaWdpbmFsRXJyb3JNZXNzYWdlOiBlLm1lc3NhZ2VcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBkYlByb21pc2U7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkSGVhcnRiZWF0c0Zyb21JbmRleGVkREIoXG4gIGFwcDogRmlyZWJhc2VBcHBcbik6IFByb21pc2U8SGVhcnRiZWF0c0luSW5kZXhlZERCIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgZGIgPSBhd2FpdCBnZXREYlByb21pc2UoKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkYlxuICAgICAgLnRyYW5zYWN0aW9uKFNUT1JFX05BTUUpXG4gICAgICAub2JqZWN0U3RvcmUoU1RPUkVfTkFNRSlcbiAgICAgIC5nZXQoY29tcHV0ZUtleShhcHApKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKGUgaW5zdGFuY2VvZiBGaXJlYmFzZUVycm9yKSB7XG4gICAgICBsb2dnZXIud2FybihlLm1lc3NhZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpZGJHZXRFcnJvciA9IEVSUk9SX0ZBQ1RPUlkuY3JlYXRlKEFwcEVycm9yLklEQl9HRVQsIHtcbiAgICAgICAgb3JpZ2luYWxFcnJvck1lc3NhZ2U6IChlIGFzIEVycm9yKT8ubWVzc2FnZVxuICAgICAgfSk7XG4gICAgICBsb2dnZXIud2FybihpZGJHZXRFcnJvci5tZXNzYWdlKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdyaXRlSGVhcnRiZWF0c1RvSW5kZXhlZERCKFxuICBhcHA6IEZpcmViYXNlQXBwLFxuICBoZWFydGJlYXRPYmplY3Q6IEhlYXJ0YmVhdHNJbkluZGV4ZWREQlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgZGIgPSBhd2FpdCBnZXREYlByb21pc2UoKTtcbiAgICBjb25zdCB0eCA9IGRiLnRyYW5zYWN0aW9uKFNUT1JFX05BTUUsICdyZWFkd3JpdGUnKTtcbiAgICBjb25zdCBvYmplY3RTdG9yZSA9IHR4Lm9iamVjdFN0b3JlKFNUT1JFX05BTUUpO1xuICAgIGF3YWl0IG9iamVjdFN0b3JlLnB1dChoZWFydGJlYXRPYmplY3QsIGNvbXB1dGVLZXkoYXBwKSk7XG4gICAgYXdhaXQgdHguZG9uZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmIChlIGluc3RhbmNlb2YgRmlyZWJhc2VFcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oZS5tZXNzYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaWRiR2V0RXJyb3IgPSBFUlJPUl9GQUNUT1JZLmNyZWF0ZShBcHBFcnJvci5JREJfV1JJVEUsIHtcbiAgICAgICAgb3JpZ2luYWxFcnJvck1lc3NhZ2U6IChlIGFzIEVycm9yKT8ubWVzc2FnZVxuICAgICAgfSk7XG4gICAgICBsb2dnZXIud2FybihpZGJHZXRFcnJvci5tZXNzYWdlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tcHV0ZUtleShhcHA6IEZpcmViYXNlQXBwKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2FwcC5uYW1lfSEke2FwcC5vcHRpb25zLmFwcElkfWA7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgQ29tcG9uZW50Q29udGFpbmVyIH0gZnJvbSAnQGZpcmViYXNlL2NvbXBvbmVudCc7XG5pbXBvcnQge1xuICBiYXNlNjR1cmxFbmNvZGVXaXRob3V0UGFkZGluZyxcbiAgaXNJbmRleGVkREJBdmFpbGFibGUsXG4gIHZhbGlkYXRlSW5kZXhlZERCT3BlbmFibGVcbn0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuaW1wb3J0IHtcbiAgcmVhZEhlYXJ0YmVhdHNGcm9tSW5kZXhlZERCLFxuICB3cml0ZUhlYXJ0YmVhdHNUb0luZGV4ZWREQlxufSBmcm9tICcuL2luZGV4ZWRkYic7XG5pbXBvcnQgeyBGaXJlYmFzZUFwcCB9IGZyb20gJy4vcHVibGljLXR5cGVzJztcbmltcG9ydCB7XG4gIEhlYXJ0YmVhdHNCeVVzZXJBZ2VudCxcbiAgSGVhcnRiZWF0U2VydmljZSxcbiAgSGVhcnRiZWF0c0luSW5kZXhlZERCLFxuICBIZWFydGJlYXRTdG9yYWdlLFxuICBTaW5nbGVEYXRlSGVhcnRiZWF0XG59IGZyb20gJy4vdHlwZXMnO1xuXG5jb25zdCBNQVhfSEVBREVSX0JZVEVTID0gMTAyNDtcbi8vIDMwIGRheXNcbmNvbnN0IFNUT1JFRF9IRUFSVEJFQVRfUkVURU5USU9OX01BWF9NSUxMSVMgPSAzMCAqIDI0ICogNjAgKiA2MCAqIDEwMDA7XG5cbmV4cG9ydCBjbGFzcyBIZWFydGJlYXRTZXJ2aWNlSW1wbCBpbXBsZW1lbnRzIEhlYXJ0YmVhdFNlcnZpY2Uge1xuICAvKipcbiAgICogVGhlIHBlcnNpc3RlbmNlIGxheWVyIGZvciBoZWFydGJlYXRzXG4gICAqIExlYXZlIHB1YmxpYyBmb3IgZWFzaWVyIHRlc3RpbmcuXG4gICAqL1xuICBfc3RvcmFnZTogSGVhcnRiZWF0U3RvcmFnZUltcGw7XG5cbiAgLyoqXG4gICAqIEluLW1lbW9yeSBjYWNoZSBmb3IgaGVhcnRiZWF0cywgdXNlZCBieSBnZXRIZWFydGJlYXRzSGVhZGVyKCkgdG8gZ2VuZXJhdGVcbiAgICogdGhlIGhlYWRlciBzdHJpbmcuXG4gICAqIFN0b3JlcyBvbmUgcmVjb3JkIHBlciBkYXRlLiBUaGlzIHdpbGwgYmUgY29uc29saWRhdGVkIGludG8gdGhlIHN0YW5kYXJkXG4gICAqIGZvcm1hdCBvZiBvbmUgcmVjb3JkIHBlciB1c2VyIGFnZW50IHN0cmluZyBiZWZvcmUgYmVpbmcgc2VudCBhcyBhIGhlYWRlci5cbiAgICogUG9wdWxhdGVkIGZyb20gaW5kZXhlZERCIHdoZW4gdGhlIGNvbnRyb2xsZXIgaXMgaW5zdGFudGlhdGVkIGFuZCBzaG91bGRcbiAgICogYmUga2VwdCBpbiBzeW5jIHdpdGggaW5kZXhlZERCLlxuICAgKiBMZWF2ZSBwdWJsaWMgZm9yIGVhc2llciB0ZXN0aW5nLlxuICAgKi9cbiAgX2hlYXJ0YmVhdHNDYWNoZTogSGVhcnRiZWF0c0luSW5kZXhlZERCIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIHRoZSBpbml0aWFsaXphdGlvbiBwcm9taXNlIGZvciBwb3B1bGF0aW5nIGhlYXJ0YmVhdENhY2hlLlxuICAgKiBJZiBnZXRIZWFydGJlYXRzSGVhZGVyKCkgaXMgY2FsbGVkIGJlZm9yZSB0aGUgcHJvbWlzZSByZXNvbHZlc1xuICAgKiAoaGVhcmJlYXRzQ2FjaGUgPT0gbnVsbCksIGl0IHNob3VsZCB3YWl0IGZvciB0aGlzIHByb21pc2VcbiAgICogTGVhdmUgcHVibGljIGZvciBlYXNpZXIgdGVzdGluZy5cbiAgICovXG4gIF9oZWFydGJlYXRzQ2FjaGVQcm9taXNlOiBQcm9taXNlPEhlYXJ0YmVhdHNJbkluZGV4ZWREQj47XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgY29udGFpbmVyOiBDb21wb25lbnRDb250YWluZXIpIHtcbiAgICBjb25zdCBhcHAgPSB0aGlzLmNvbnRhaW5lci5nZXRQcm92aWRlcignYXBwJykuZ2V0SW1tZWRpYXRlKCk7XG4gICAgdGhpcy5fc3RvcmFnZSA9IG5ldyBIZWFydGJlYXRTdG9yYWdlSW1wbChhcHApO1xuICAgIHRoaXMuX2hlYXJ0YmVhdHNDYWNoZVByb21pc2UgPSB0aGlzLl9zdG9yYWdlLnJlYWQoKS50aGVuKHJlc3VsdCA9PiB7XG4gICAgICB0aGlzLl9oZWFydGJlYXRzQ2FjaGUgPSByZXN1bHQ7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB0byByZXBvcnQgYSBoZWFydGJlYXQuIFRoZSBmdW5jdGlvbiB3aWxsIGdlbmVyYXRlXG4gICAqIGEgSGVhcnRiZWF0c0J5VXNlckFnZW50IG9iamVjdCwgdXBkYXRlIGhlYXJ0YmVhdHNDYWNoZSwgYW5kIHBlcnNpc3QgaXRcbiAgICogdG8gSW5kZXhlZERCLlxuICAgKiBOb3RlIHRoYXQgd2Ugb25seSBzdG9yZSBvbmUgaGVhcnRiZWF0IHBlciBkYXkuIFNvIGlmIGEgaGVhcnRiZWF0IGZvciB0b2RheSBpc1xuICAgKiBhbHJlYWR5IGxvZ2dlZCwgc3Vic2VxdWVudCBjYWxscyB0byB0aGlzIGZ1bmN0aW9uIGluIHRoZSBzYW1lIGRheSB3aWxsIGJlIGlnbm9yZWQuXG4gICAqL1xuICBhc3luYyB0cmlnZ2VySGVhcnRiZWF0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBsYXRmb3JtTG9nZ2VyID0gdGhpcy5jb250YWluZXJcbiAgICAgIC5nZXRQcm92aWRlcigncGxhdGZvcm0tbG9nZ2VyJylcbiAgICAgIC5nZXRJbW1lZGlhdGUoKTtcblxuICAgIC8vIFRoaXMgaXMgdGhlIFwiRmlyZWJhc2UgdXNlciBhZ2VudFwiIHN0cmluZyBmcm9tIHRoZSBwbGF0Zm9ybSBsb2dnZXJcbiAgICAvLyBzZXJ2aWNlLCBub3QgdGhlIGJyb3dzZXIgdXNlciBhZ2VudC5cbiAgICBjb25zdCBhZ2VudCA9IHBsYXRmb3JtTG9nZ2VyLmdldFBsYXRmb3JtSW5mb1N0cmluZygpO1xuICAgIGNvbnN0IGRhdGUgPSBnZXRVVENEYXRlU3RyaW5nKCk7XG4gICAgaWYgKHRoaXMuX2hlYXJ0YmVhdHNDYWNoZSA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5faGVhcnRiZWF0c0NhY2hlID0gYXdhaXQgdGhpcy5faGVhcnRiZWF0c0NhY2hlUHJvbWlzZTtcbiAgICB9XG4gICAgLy8gRG8gbm90IHN0b3JlIGEgaGVhcnRiZWF0IGlmIG9uZSBpcyBhbHJlYWR5IHN0b3JlZCBmb3IgdGhpcyBkYXlcbiAgICAvLyBvciBpZiBhIGhlYWRlciBoYXMgYWxyZWFkeSBiZWVuIHNlbnQgdG9kYXkuXG4gICAgaWYgKFxuICAgICAgdGhpcy5faGVhcnRiZWF0c0NhY2hlLmxhc3RTZW50SGVhcnRiZWF0RGF0ZSA9PT0gZGF0ZSB8fFxuICAgICAgdGhpcy5faGVhcnRiZWF0c0NhY2hlLmhlYXJ0YmVhdHMuc29tZShcbiAgICAgICAgc2luZ2xlRGF0ZUhlYXJ0YmVhdCA9PiBzaW5nbGVEYXRlSGVhcnRiZWF0LmRhdGUgPT09IGRhdGVcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlcmUgaXMgbm8gZW50cnkgZm9yIHRoaXMgZGF0ZS4gQ3JlYXRlIG9uZS5cbiAgICAgIHRoaXMuX2hlYXJ0YmVhdHNDYWNoZS5oZWFydGJlYXRzLnB1c2goeyBkYXRlLCBhZ2VudCB9KTtcbiAgICB9XG4gICAgLy8gUmVtb3ZlIGVudHJpZXMgb2xkZXIgdGhhbiAzMCBkYXlzLlxuICAgIHRoaXMuX2hlYXJ0YmVhdHNDYWNoZS5oZWFydGJlYXRzID0gdGhpcy5faGVhcnRiZWF0c0NhY2hlLmhlYXJ0YmVhdHMuZmlsdGVyKFxuICAgICAgc2luZ2xlRGF0ZUhlYXJ0YmVhdCA9PiB7XG4gICAgICAgIGNvbnN0IGhiVGltZXN0YW1wID0gbmV3IERhdGUoc2luZ2xlRGF0ZUhlYXJ0YmVhdC5kYXRlKS52YWx1ZU9mKCk7XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIHJldHVybiBub3cgLSBoYlRpbWVzdGFtcCA8PSBTVE9SRURfSEVBUlRCRUFUX1JFVEVOVElPTl9NQVhfTUlMTElTO1xuICAgICAgfVxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3JhZ2Uub3ZlcndyaXRlKHRoaXMuX2hlYXJ0YmVhdHNDYWNoZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGJhc2U2NCBlbmNvZGVkIHN0cmluZyB3aGljaCBjYW4gYmUgYXR0YWNoZWQgdG8gdGhlIGhlYXJ0YmVhdC1zcGVjaWZpYyBoZWFkZXIgZGlyZWN0bHkuXG4gICAqIEl0IGFsc28gY2xlYXJzIGFsbCBoZWFydGJlYXRzIGZyb20gbWVtb3J5IGFzIHdlbGwgYXMgaW4gSW5kZXhlZERCLlxuICAgKlxuICAgKiBOT1RFOiBDb25zdW1pbmcgcHJvZHVjdCBTREtzIHNob3VsZCBub3Qgc2VuZCB0aGUgaGVhZGVyIGlmIHRoaXMgbWV0aG9kXG4gICAqIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLlxuICAgKi9cbiAgYXN5bmMgZ2V0SGVhcnRiZWF0c0hlYWRlcigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICh0aGlzLl9oZWFydGJlYXRzQ2FjaGUgPT09IG51bGwpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2hlYXJ0YmVhdHNDYWNoZVByb21pc2U7XG4gICAgfVxuICAgIC8vIElmIGl0J3Mgc3RpbGwgbnVsbCBvciB0aGUgYXJyYXkgaXMgZW1wdHksIHRoZXJlIGlzIG5vIGRhdGEgdG8gc2VuZC5cbiAgICBpZiAoXG4gICAgICB0aGlzLl9oZWFydGJlYXRzQ2FjaGUgPT09IG51bGwgfHxcbiAgICAgIHRoaXMuX2hlYXJ0YmVhdHNDYWNoZS5oZWFydGJlYXRzLmxlbmd0aCA9PT0gMFxuICAgICkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBjb25zdCBkYXRlID0gZ2V0VVRDRGF0ZVN0cmluZygpO1xuICAgIC8vIEV4dHJhY3QgYXMgbWFueSBoZWFydGJlYXRzIGZyb20gdGhlIGNhY2hlIGFzIHdpbGwgZml0IHVuZGVyIHRoZSBzaXplIGxpbWl0LlxuICAgIGNvbnN0IHsgaGVhcnRiZWF0c1RvU2VuZCwgdW5zZW50RW50cmllcyB9ID0gZXh0cmFjdEhlYXJ0YmVhdHNGb3JIZWFkZXIoXG4gICAgICB0aGlzLl9oZWFydGJlYXRzQ2FjaGUuaGVhcnRiZWF0c1xuICAgICk7XG4gICAgY29uc3QgaGVhZGVyU3RyaW5nID0gYmFzZTY0dXJsRW5jb2RlV2l0aG91dFBhZGRpbmcoXG4gICAgICBKU09OLnN0cmluZ2lmeSh7IHZlcnNpb246IDIsIGhlYXJ0YmVhdHM6IGhlYXJ0YmVhdHNUb1NlbmQgfSlcbiAgICApO1xuICAgIC8vIFN0b3JlIGxhc3Qgc2VudCBkYXRlIHRvIHByZXZlbnQgYW5vdGhlciBiZWluZyBsb2dnZWQvc2VudCBmb3IgdGhlIHNhbWUgZGF5LlxuICAgIHRoaXMuX2hlYXJ0YmVhdHNDYWNoZS5sYXN0U2VudEhlYXJ0YmVhdERhdGUgPSBkYXRlO1xuICAgIGlmICh1bnNlbnRFbnRyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIFN0b3JlIGFueSB1bnNlbnQgZW50cmllcyBpZiB0aGV5IGV4aXN0LlxuICAgICAgdGhpcy5faGVhcnRiZWF0c0NhY2hlLmhlYXJ0YmVhdHMgPSB1bnNlbnRFbnRyaWVzO1xuICAgICAgLy8gVGhpcyBzZWVtcyBtb3JlIGxpa2VseSB0aGFuIGVtcHR5aW5nIHRoZSBhcnJheSAoYmVsb3cpIHRvIGxlYWQgdG8gc29tZSBvZGQgc3RhdGVcbiAgICAgIC8vIHNpbmNlIHRoZSBjYWNoZSBpc24ndCBlbXB0eSBhbmQgdGhpcyB3aWxsIGJlIGNhbGxlZCBhZ2FpbiBvbiB0aGUgbmV4dCByZXF1ZXN0LFxuICAgICAgLy8gYW5kIGlzIHByb2JhYmx5IHNhZmVzdCBpZiB3ZSBhd2FpdCBpdC5cbiAgICAgIGF3YWl0IHRoaXMuX3N0b3JhZ2Uub3ZlcndyaXRlKHRoaXMuX2hlYXJ0YmVhdHNDYWNoZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2hlYXJ0YmVhdHNDYWNoZS5oZWFydGJlYXRzID0gW107XG4gICAgICAvLyBEbyBub3Qgd2FpdCBmb3IgdGhpcywgdG8gcmVkdWNlIGxhdGVuY3kuXG4gICAgICB2b2lkIHRoaXMuX3N0b3JhZ2Uub3ZlcndyaXRlKHRoaXMuX2hlYXJ0YmVhdHNDYWNoZSk7XG4gICAgfVxuICAgIHJldHVybiBoZWFkZXJTdHJpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VVRDRGF0ZVN0cmluZygpOiBzdHJpbmcge1xuICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XG4gIC8vIFJldHVybnMgZGF0ZSBmb3JtYXQgJ1lZWVktTU0tREQnXG4gIHJldHVybiB0b2RheS50b0lTT1N0cmluZygpLnN1YnN0cmluZygwLCAxMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0SGVhcnRiZWF0c0ZvckhlYWRlcihcbiAgaGVhcnRiZWF0c0NhY2hlOiBTaW5nbGVEYXRlSGVhcnRiZWF0W10sXG4gIG1heFNpemUgPSBNQVhfSEVBREVSX0JZVEVTXG4pOiB7XG4gIGhlYXJ0YmVhdHNUb1NlbmQ6IEhlYXJ0YmVhdHNCeVVzZXJBZ2VudFtdO1xuICB1bnNlbnRFbnRyaWVzOiBTaW5nbGVEYXRlSGVhcnRiZWF0W107XG59IHtcbiAgLy8gSGVhcnRiZWF0cyBncm91cGVkIGJ5IHVzZXIgYWdlbnQgaW4gdGhlIHN0YW5kYXJkIGZvcm1hdCB0byBiZSBzZW50IGluXG4gIC8vIHRoZSBoZWFkZXIuXG4gIGNvbnN0IGhlYXJ0YmVhdHNUb1NlbmQ6IEhlYXJ0YmVhdHNCeVVzZXJBZ2VudFtdID0gW107XG4gIC8vIFNpbmdsZSBkYXRlIGZvcm1hdCBoZWFydGJlYXRzIHRoYXQgYXJlIG5vdCBzZW50LlxuICBsZXQgdW5zZW50RW50cmllcyA9IGhlYXJ0YmVhdHNDYWNoZS5zbGljZSgpO1xuICBmb3IgKGNvbnN0IHNpbmdsZURhdGVIZWFydGJlYXQgb2YgaGVhcnRiZWF0c0NhY2hlKSB7XG4gICAgLy8gTG9vayBmb3IgYW4gZXhpc3RpbmcgZW50cnkgd2l0aCB0aGUgc2FtZSB1c2VyIGFnZW50LlxuICAgIGNvbnN0IGhlYXJ0YmVhdEVudHJ5ID0gaGVhcnRiZWF0c1RvU2VuZC5maW5kKFxuICAgICAgaGIgPT4gaGIuYWdlbnQgPT09IHNpbmdsZURhdGVIZWFydGJlYXQuYWdlbnRcbiAgICApO1xuICAgIGlmICghaGVhcnRiZWF0RW50cnkpIHtcbiAgICAgIC8vIElmIG5vIGVudHJ5IGZvciB0aGlzIHVzZXIgYWdlbnQgZXhpc3RzLCBjcmVhdGUgb25lLlxuICAgICAgaGVhcnRiZWF0c1RvU2VuZC5wdXNoKHtcbiAgICAgICAgYWdlbnQ6IHNpbmdsZURhdGVIZWFydGJlYXQuYWdlbnQsXG4gICAgICAgIGRhdGVzOiBbc2luZ2xlRGF0ZUhlYXJ0YmVhdC5kYXRlXVxuICAgICAgfSk7XG4gICAgICBpZiAoY291bnRCeXRlcyhoZWFydGJlYXRzVG9TZW5kKSA+IG1heFNpemUpIHtcbiAgICAgICAgLy8gSWYgdGhlIGhlYWRlciB3b3VsZCBleGNlZWQgbWF4IHNpemUsIHJlbW92ZSB0aGUgYWRkZWQgaGVhcnRiZWF0XG4gICAgICAgIC8vIGVudHJ5IGFuZCBzdG9wIGFkZGluZyB0byB0aGUgaGVhZGVyLlxuICAgICAgICBoZWFydGJlYXRzVG9TZW5kLnBvcCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaGVhcnRiZWF0RW50cnkuZGF0ZXMucHVzaChzaW5nbGVEYXRlSGVhcnRiZWF0LmRhdGUpO1xuICAgICAgLy8gSWYgdGhlIGhlYWRlciB3b3VsZCBleGNlZWQgbWF4IHNpemUsIHJlbW92ZSB0aGUgYWRkZWQgZGF0ZVxuICAgICAgLy8gYW5kIHN0b3AgYWRkaW5nIHRvIHRoZSBoZWFkZXIuXG4gICAgICBpZiAoY291bnRCeXRlcyhoZWFydGJlYXRzVG9TZW5kKSA+IG1heFNpemUpIHtcbiAgICAgICAgaGVhcnRiZWF0RW50cnkuZGF0ZXMucG9wKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBQb3AgdW5zZW50IGVudHJ5IGZyb20gcXVldWUuIChTa2lwcGVkIGlmIGFkZGluZyB0aGUgZW50cnkgZXhjZWVkZWRcbiAgICAvLyBxdW90YSBhbmQgdGhlIGxvb3AgYnJlYWtzIGVhcmx5LilcbiAgICB1bnNlbnRFbnRyaWVzID0gdW5zZW50RW50cmllcy5zbGljZSgxKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGhlYXJ0YmVhdHNUb1NlbmQsXG4gICAgdW5zZW50RW50cmllc1xuICB9O1xufVxuXG5leHBvcnQgY2xhc3MgSGVhcnRiZWF0U3RvcmFnZUltcGwgaW1wbGVtZW50cyBIZWFydGJlYXRTdG9yYWdlIHtcbiAgcHJpdmF0ZSBfY2FuVXNlSW5kZXhlZERCUHJvbWlzZTogUHJvbWlzZTxib29sZWFuPjtcbiAgY29uc3RydWN0b3IocHVibGljIGFwcDogRmlyZWJhc2VBcHApIHtcbiAgICB0aGlzLl9jYW5Vc2VJbmRleGVkREJQcm9taXNlID0gdGhpcy5ydW5JbmRleGVkREJFbnZpcm9ubWVudENoZWNrKCk7XG4gIH1cbiAgYXN5bmMgcnVuSW5kZXhlZERCRW52aXJvbm1lbnRDaGVjaygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIWlzSW5kZXhlZERCQXZhaWxhYmxlKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHZhbGlkYXRlSW5kZXhlZERCT3BlbmFibGUoKVxuICAgICAgICAudGhlbigoKSA9PiB0cnVlKVxuICAgICAgICAuY2F0Y2goKCkgPT4gZmFsc2UpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmVhZCBhbGwgaGVhcnRiZWF0cy5cbiAgICovXG4gIGFzeW5jIHJlYWQoKTogUHJvbWlzZTxIZWFydGJlYXRzSW5JbmRleGVkREI+IHtcbiAgICBjb25zdCBjYW5Vc2VJbmRleGVkREIgPSBhd2FpdCB0aGlzLl9jYW5Vc2VJbmRleGVkREJQcm9taXNlO1xuICAgIGlmICghY2FuVXNlSW5kZXhlZERCKSB7XG4gICAgICByZXR1cm4geyBoZWFydGJlYXRzOiBbXSB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpZGJIZWFydGJlYXRPYmplY3QgPSBhd2FpdCByZWFkSGVhcnRiZWF0c0Zyb21JbmRleGVkREIodGhpcy5hcHApO1xuICAgICAgcmV0dXJuIGlkYkhlYXJ0YmVhdE9iamVjdCB8fCB7IGhlYXJ0YmVhdHM6IFtdIH07XG4gICAgfVxuICB9XG4gIC8vIG92ZXJ3cml0ZSB0aGUgc3RvcmFnZSB3aXRoIHRoZSBwcm92aWRlZCBoZWFydGJlYXRzXG4gIGFzeW5jIG92ZXJ3cml0ZShoZWFydGJlYXRzT2JqZWN0OiBIZWFydGJlYXRzSW5JbmRleGVkREIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjYW5Vc2VJbmRleGVkREIgPSBhd2FpdCB0aGlzLl9jYW5Vc2VJbmRleGVkREJQcm9taXNlO1xuICAgIGlmICghY2FuVXNlSW5kZXhlZERCKSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nSGVhcnRiZWF0c09iamVjdCA9IGF3YWl0IHRoaXMucmVhZCgpO1xuICAgICAgcmV0dXJuIHdyaXRlSGVhcnRiZWF0c1RvSW5kZXhlZERCKHRoaXMuYXBwLCB7XG4gICAgICAgIGxhc3RTZW50SGVhcnRiZWF0RGF0ZTpcbiAgICAgICAgICBoZWFydGJlYXRzT2JqZWN0Lmxhc3RTZW50SGVhcnRiZWF0RGF0ZSA/P1xuICAgICAgICAgIGV4aXN0aW5nSGVhcnRiZWF0c09iamVjdC5sYXN0U2VudEhlYXJ0YmVhdERhdGUsXG4gICAgICAgIGhlYXJ0YmVhdHM6IGhlYXJ0YmVhdHNPYmplY3QuaGVhcnRiZWF0c1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIC8vIGFkZCBoZWFydGJlYXRzXG4gIGFzeW5jIGFkZChoZWFydGJlYXRzT2JqZWN0OiBIZWFydGJlYXRzSW5JbmRleGVkREIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjYW5Vc2VJbmRleGVkREIgPSBhd2FpdCB0aGlzLl9jYW5Vc2VJbmRleGVkREJQcm9taXNlO1xuICAgIGlmICghY2FuVXNlSW5kZXhlZERCKSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nSGVhcnRiZWF0c09iamVjdCA9IGF3YWl0IHRoaXMucmVhZCgpO1xuICAgICAgcmV0dXJuIHdyaXRlSGVhcnRiZWF0c1RvSW5kZXhlZERCKHRoaXMuYXBwLCB7XG4gICAgICAgIGxhc3RTZW50SGVhcnRiZWF0RGF0ZTpcbiAgICAgICAgICBoZWFydGJlYXRzT2JqZWN0Lmxhc3RTZW50SGVhcnRiZWF0RGF0ZSA/P1xuICAgICAgICAgIGV4aXN0aW5nSGVhcnRiZWF0c09iamVjdC5sYXN0U2VudEhlYXJ0YmVhdERhdGUsXG4gICAgICAgIGhlYXJ0YmVhdHM6IFtcbiAgICAgICAgICAuLi5leGlzdGluZ0hlYXJ0YmVhdHNPYmplY3QuaGVhcnRiZWF0cyxcbiAgICAgICAgICAuLi5oZWFydGJlYXRzT2JqZWN0LmhlYXJ0YmVhdHNcbiAgICAgICAgXVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlIGJ5dGVzIG9mIGEgSGVhcnRiZWF0c0J5VXNlckFnZW50IGFycmF5IGFmdGVyIGJlaW5nIHdyYXBwZWRcbiAqIGluIGEgcGxhdGZvcm0gbG9nZ2luZyBoZWFkZXIgSlNPTiBvYmplY3QsIHN0cmluZ2lmaWVkLCBhbmQgY29udmVydGVkXG4gKiB0byBiYXNlIDY0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY291bnRCeXRlcyhoZWFydGJlYXRzQ2FjaGU6IEhlYXJ0YmVhdHNCeVVzZXJBZ2VudFtdKTogbnVtYmVyIHtcbiAgLy8gYmFzZTY0IGhhcyBhIHJlc3RyaWN0ZWQgc2V0IG9mIGNoYXJhY3RlcnMsIGFsbCBvZiB3aGljaCBzaG91bGQgYmUgMSBieXRlLlxuICByZXR1cm4gYmFzZTY0dXJsRW5jb2RlV2l0aG91dFBhZGRpbmcoXG4gICAgLy8gaGVhcnRiZWF0c0NhY2hlIHdyYXBwZXIgcHJvcGVydGllc1xuICAgIEpTT04uc3RyaW5naWZ5KHsgdmVyc2lvbjogMiwgaGVhcnRiZWF0czogaGVhcnRiZWF0c0NhY2hlIH0pXG4gICkubGVuZ3RoO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IENvbXBvbmVudCwgQ29tcG9uZW50VHlwZSB9IGZyb20gJ0BmaXJlYmFzZS9jb21wb25lbnQnO1xuaW1wb3J0IHsgUGxhdGZvcm1Mb2dnZXJTZXJ2aWNlSW1wbCB9IGZyb20gJy4vcGxhdGZvcm1Mb2dnZXJTZXJ2aWNlJztcbmltcG9ydCB7IG5hbWUsIHZlcnNpb24gfSBmcm9tICcuLi9wYWNrYWdlLmpzb24nO1xuaW1wb3J0IHsgX3JlZ2lzdGVyQ29tcG9uZW50IH0gZnJvbSAnLi9pbnRlcm5hbCc7XG5pbXBvcnQgeyByZWdpc3RlclZlcnNpb24gfSBmcm9tICcuL2FwaSc7XG5pbXBvcnQgeyBIZWFydGJlYXRTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaGVhcnRiZWF0U2VydmljZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckNvcmVDb21wb25lbnRzKHZhcmlhbnQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgX3JlZ2lzdGVyQ29tcG9uZW50KFxuICAgIG5ldyBDb21wb25lbnQoXG4gICAgICAncGxhdGZvcm0tbG9nZ2VyJyxcbiAgICAgIGNvbnRhaW5lciA9PiBuZXcgUGxhdGZvcm1Mb2dnZXJTZXJ2aWNlSW1wbChjb250YWluZXIpLFxuICAgICAgQ29tcG9uZW50VHlwZS5QUklWQVRFXG4gICAgKVxuICApO1xuICBfcmVnaXN0ZXJDb21wb25lbnQoXG4gICAgbmV3IENvbXBvbmVudChcbiAgICAgICdoZWFydGJlYXQnLFxuICAgICAgY29udGFpbmVyID0+IG5ldyBIZWFydGJlYXRTZXJ2aWNlSW1wbChjb250YWluZXIpLFxuICAgICAgQ29tcG9uZW50VHlwZS5QUklWQVRFXG4gICAgKVxuICApO1xuXG4gIC8vIFJlZ2lzdGVyIGBhcHBgIHBhY2thZ2UuXG4gIHJlZ2lzdGVyVmVyc2lvbihuYW1lLCB2ZXJzaW9uLCB2YXJpYW50KTtcbiAgLy8gQlVJTERfVEFSR0VUIHdpbGwgYmUgcmVwbGFjZWQgYnkgdmFsdWVzIGxpa2UgZXNtNSwgZXNtMjAxNywgY2pzNSwgZXRjIGR1cmluZyB0aGUgY29tcGlsYXRpb25cbiAgcmVnaXN0ZXJWZXJzaW9uKG5hbWUsIHZlcnNpb24sICdfX0JVSUxEX1RBUkdFVF9fJyk7XG4gIC8vIFJlZ2lzdGVyIHBsYXRmb3JtIFNESyBpZGVudGlmaWVyIChubyB2ZXJzaW9uKS5cbiAgcmVnaXN0ZXJWZXJzaW9uKCdmaXJlLWpzJywgJycpO1xufVxuIiwgIi8qKlxuICogRmlyZWJhc2UgQXBwXG4gKlxuICogQHJlbWFya3MgVGhpcyBwYWNrYWdlIGNvb3JkaW5hdGVzIHRoZSBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlIGRpZmZlcmVudCBGaXJlYmFzZSBjb21wb25lbnRzXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqL1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyByZWdpc3RlckNvcmVDb21wb25lbnRzIH0gZnJvbSAnLi9yZWdpc3RlckNvcmVDb21wb25lbnRzJztcblxuZXhwb3J0ICogZnJvbSAnLi9hcGknO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcm5hbCc7XG5leHBvcnQgKiBmcm9tICcuL3B1YmxpYy10eXBlcyc7XG5cbnJlZ2lzdGVyQ29yZUNvbXBvbmVudHMoJ19fUlVOVElNRV9FTlZfXycpO1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyByZWdpc3RlclZlcnNpb24gfSBmcm9tICdAZmlyZWJhc2UvYXBwJztcbmltcG9ydCB7IG5hbWUsIHZlcnNpb24gfSBmcm9tICcuLi9wYWNrYWdlLmpzb24nO1xuXG5yZWdpc3RlclZlcnNpb24obmFtZSwgdmVyc2lvbiwgJ2FwcCcpO1xuZXhwb3J0ICogZnJvbSAnQGZpcmViYXNlL2FwcCc7XG4iLCAiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG5cblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1Jcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UsIFN1cHByZXNzZWRFcnJvciwgU3ltYm9sICovXG5cbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xuICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xuICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufVxuXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XG4gIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XG4gICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XG4gICAgICB9XG4gICAgICByZXR1cm4gdDtcbiAgfVxuICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXG4gICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xuICAgICAgfVxuICByZXR1cm4gdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcbiAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcbiAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcbiAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19lc0RlY29yYXRlKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7XG4gIGZ1bmN0aW9uIGFjY2VwdChmKSB7IGlmIChmICE9PSB2b2lkIDAgJiYgdHlwZW9mIGYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZ1bmN0aW9uIGV4cGVjdGVkXCIpOyByZXR1cm4gZjsgfVxuICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xuICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluW1wic3RhdGljXCJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDtcbiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7XG4gIHZhciBfLCBkb25lID0gZmFsc2U7XG4gIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgY29udGV4dCA9IHt9O1xuICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XG4gICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQuYWNjZXNzW3BdID0gY29udGV4dEluLmFjY2Vzc1twXTtcbiAgICAgIGNvbnRleHQuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoZikgeyBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZFwiKTsgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZiB8fCBudWxsKSk7IH07XG4gICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcbiAgICAgIGlmIChraW5kID09PSBcImFjY2Vzc29yXCIpIHtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlO1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfO1xuICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF87XG4gICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKF8gPSBhY2NlcHQocmVzdWx0KSkge1xuICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXldID0gXztcbiAgICAgIH1cbiAgfVxuICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7XG4gIGRvbmUgPSB0cnVlO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fcnVuSW5pdGlhbGl6ZXJzKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUpIHtcbiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWx1ZSA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZywgdmFsdWUpIDogaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZyk7XG4gIH1cbiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19wcm9wS2V5KHgpIHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSBcInN5bWJvbFwiID8geCA6IFwiXCIuY29uY2F0KHgpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fc2V0RnVuY3Rpb25OYW1lKGYsIG5hbWUsIHByZWZpeCkge1xuICBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIpIG5hbWUgPSBuYW1lLmRlc2NyaXB0aW9uID8gXCJbXCIuY29uY2F0KG5hbWUuZGVzY3JpcHRpb24sIFwiXVwiKSA6IFwiXCI7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwgXCJuYW1lXCIsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogcHJlZml4ID8gXCJcIi5jb25jYXQocHJlZml4LCBcIiBcIiwgbmFtZSkgOiBuYW1lIH0pO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcbiAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcbiAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XG4gIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxuICBmdW5jdGlvbiBzdGVwKG9wKSB7XG4gICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG4gICAgICB3aGlsZSAoZyAmJiAoZyA9IDAsIG9wWzBdICYmIChfID0gMCkpLCBfKSB0cnkge1xuICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XG4gICAgICAgICAgc3dpdGNoIChvcFswXSkge1xuICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xuICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cbiAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxuICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XG4gIH1cbn1cblxuZXhwb3J0IHZhciBfX2NyZWF0ZUJpbmRpbmcgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gIH1cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gIG9bazJdID0gbVtrXTtcbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIG8pIHtcbiAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xuICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xuICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcbiAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xuICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XG4gICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xuICAgICAgfVxuICB9O1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xuICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XG4gIGlmICghbSkgcmV0dXJuIG87XG4gIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xuICB0cnkge1xuICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gIH1cbiAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XG4gIGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcbiAgICAgIH1cbiAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxuICB9XG4gIHJldHVybiBhcjtcbn1cblxuLyoqIEBkZXByZWNhdGVkICovXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XG4gIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxuICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xuICByZXR1cm4gYXI7XG59XG5cbi8qKiBAZGVwcmVjYXRlZCAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xuICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcbiAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxuICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXG4gICAgICAgICAgcltrXSA9IGFbal07XG4gIHJldHVybiByO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheSh0bywgZnJvbSwgcGFjaykge1xuICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xuICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XG4gICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xuICAgICAgfVxuICB9XG4gIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XG4gIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcbiAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcbiAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xuICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cbiAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxuICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cbiAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxuICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XG4gIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xuICB2YXIgaSwgcDtcbiAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcbiAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogZmFsc2UgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xuICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xuICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xuICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XG4gIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cbiAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcbiAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cbiAgcmV0dXJuIGNvb2tlZDtcbn07XG5cbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gIG9bXCJkZWZhdWx0XCJdID0gdjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XG4gIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xuICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IGRlZmF1bHQ6IG1vZCB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgc3RhdGUsIGtpbmQsIGYpIHtcbiAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xuICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcbiAgcmV0dXJuIGtpbmQgPT09IFwibVwiID8gZiA6IGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyKSA6IGYgPyBmLnZhbHVlIDogc3RhdGUuZ2V0KHJlY2VpdmVyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRTZXQocmVjZWl2ZXIsIHN0YXRlLCB2YWx1ZSwga2luZCwgZikge1xuICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XG4gIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcbiAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3Qgd3JpdGUgcHJpdmF0ZSBtZW1iZXIgdG8gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcbiAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4oc3RhdGUsIHJlY2VpdmVyKSB7XG4gIGlmIChyZWNlaXZlciA9PT0gbnVsbCB8fCAodHlwZW9mIHJlY2VpdmVyICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiByZWNlaXZlciAhPT0gXCJmdW5jdGlvblwiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB1c2UgJ2luJyBvcGVyYXRvciBvbiBub24tb2JqZWN0XCIpO1xuICByZXR1cm4gdHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciA9PT0gc3RhdGUgOiBzdGF0ZS5oYXMocmVjZWl2ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52LCB2YWx1ZSwgYXN5bmMpIHtcbiAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDApIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkLlwiKTtcbiAgICB2YXIgZGlzcG9zZTtcbiAgICBpZiAoYXN5bmMpIHtcbiAgICAgICAgaWYgKCFTeW1ib2wuYXN5bmNEaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcbiAgICB9XG4gICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkge1xuICAgICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmRpc3Bvc2VdO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XG4gICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcbiAgfVxuICBlbHNlIGlmIChhc3luYykge1xuICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG52YXIgX1N1cHByZXNzZWRFcnJvciA9IHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xuICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52KSB7XG4gIGZ1bmN0aW9uIGZhaWwoZSkge1xuICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBfU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcbiAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xuICB9XG4gIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgd2hpbGUgKGVudi5zdGFjay5sZW5ndGgpIHtcbiAgICAgIHZhciByZWMgPSBlbnYuc3RhY2sucG9wKCk7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVjLmRpc3Bvc2UgJiYgcmVjLmRpc3Bvc2UuY2FsbChyZWMudmFsdWUpO1xuICAgICAgICBpZiAocmVjLmFzeW5jKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbihuZXh0LCBmdW5jdGlvbihlKSB7IGZhaWwoZSk7IHJldHVybiBuZXh0KCk7IH0pO1xuICAgICAgfVxuICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICBmYWlsKGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZW52Lmhhc0Vycm9yKSB0aHJvdyBlbnYuZXJyb3I7XG4gIH1cbiAgcmV0dXJuIG5leHQoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBfX2V4dGVuZHMsXG4gIF9fYXNzaWduLFxuICBfX3Jlc3QsXG4gIF9fZGVjb3JhdGUsXG4gIF9fcGFyYW0sXG4gIF9fbWV0YWRhdGEsXG4gIF9fYXdhaXRlcixcbiAgX19nZW5lcmF0b3IsXG4gIF9fY3JlYXRlQmluZGluZyxcbiAgX19leHBvcnRTdGFyLFxuICBfX3ZhbHVlcyxcbiAgX19yZWFkLFxuICBfX3NwcmVhZCxcbiAgX19zcHJlYWRBcnJheXMsXG4gIF9fc3ByZWFkQXJyYXksXG4gIF9fYXdhaXQsXG4gIF9fYXN5bmNHZW5lcmF0b3IsXG4gIF9fYXN5bmNEZWxlZ2F0b3IsXG4gIF9fYXN5bmNWYWx1ZXMsXG4gIF9fbWFrZVRlbXBsYXRlT2JqZWN0LFxuICBfX2ltcG9ydFN0YXIsXG4gIF9faW1wb3J0RGVmYXVsdCxcbiAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCxcbiAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCxcbiAgX19jbGFzc1ByaXZhdGVGaWVsZEluLFxuICBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZSxcbiAgX19kaXNwb3NlUmVzb3VyY2VzLFxufTtcbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vKipcbiAqIEFuIGVudW0gb2YgZmFjdG9ycyB0aGF0IG1heSBiZSB1c2VkIGZvciBtdWx0aWZhY3RvciBhdXRoZW50aWNhdGlvbi5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBGYWN0b3JJZCA9IHtcbiAgLyoqIFBob25lIGFzIHNlY29uZCBmYWN0b3IgKi9cbiAgUEhPTkU6ICdwaG9uZScsXG4gIFRPVFA6ICd0b3RwJ1xufSBhcyBjb25zdDtcblxuLyoqXG4gKiBFbnVtZXJhdGlvbiBvZiBzdXBwb3J0ZWQgcHJvdmlkZXJzLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IFByb3ZpZGVySWQgPSB7XG4gIC8qKiBGYWNlYm9vayBwcm92aWRlciBJRCAqL1xuICBGQUNFQk9PSzogJ2ZhY2Vib29rLmNvbScsXG4gIC8qKiBHaXRIdWIgcHJvdmlkZXIgSUQgKi9cbiAgR0lUSFVCOiAnZ2l0aHViLmNvbScsXG4gIC8qKiBHb29nbGUgcHJvdmlkZXIgSUQgKi9cbiAgR09PR0xFOiAnZ29vZ2xlLmNvbScsXG4gIC8qKiBQYXNzd29yZCBwcm92aWRlciAqL1xuICBQQVNTV09SRDogJ3Bhc3N3b3JkJyxcbiAgLyoqIFBob25lIHByb3ZpZGVyICovXG4gIFBIT05FOiAncGhvbmUnLFxuICAvKiogVHdpdHRlciBwcm92aWRlciBJRCAqL1xuICBUV0lUVEVSOiAndHdpdHRlci5jb20nXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIEVudW1lcmF0aW9uIG9mIHN1cHBvcnRlZCBzaWduLWluIG1ldGhvZHMuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgU2lnbkluTWV0aG9kID0ge1xuICAvKiogRW1haWwgbGluayBzaWduIGluIG1ldGhvZCAqL1xuICBFTUFJTF9MSU5LOiAnZW1haWxMaW5rJyxcbiAgLyoqIEVtYWlsL3Bhc3N3b3JkIHNpZ24gaW4gbWV0aG9kICovXG4gIEVNQUlMX1BBU1NXT1JEOiAncGFzc3dvcmQnLFxuICAvKiogRmFjZWJvb2sgc2lnbiBpbiBtZXRob2QgKi9cbiAgRkFDRUJPT0s6ICdmYWNlYm9vay5jb20nLFxuICAvKiogR2l0SHViIHNpZ24gaW4gbWV0aG9kICovXG4gIEdJVEhVQjogJ2dpdGh1Yi5jb20nLFxuICAvKiogR29vZ2xlIHNpZ24gaW4gbWV0aG9kICovXG4gIEdPT0dMRTogJ2dvb2dsZS5jb20nLFxuICAvKiogUGhvbmUgc2lnbiBpbiBtZXRob2QgKi9cbiAgUEhPTkU6ICdwaG9uZScsXG4gIC8qKiBUd2l0dGVyIHNpZ24gaW4gbWV0aG9kICovXG4gIFRXSVRURVI6ICd0d2l0dGVyLmNvbSdcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogRW51bWVyYXRpb24gb2Ygc3VwcG9ydGVkIG9wZXJhdGlvbiB0eXBlcy5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBPcGVyYXRpb25UeXBlID0ge1xuICAvKiogT3BlcmF0aW9uIGludm9sdmluZyBsaW5raW5nIGFuIGFkZGl0aW9uYWwgcHJvdmlkZXIgdG8gYW4gYWxyZWFkeSBzaWduZWQtaW4gdXNlci4gKi9cbiAgTElOSzogJ2xpbmsnLFxuICAvKiogT3BlcmF0aW9uIGludm9sdmluZyB1c2luZyBhIHByb3ZpZGVyIHRvIHJlYXV0aGVudGljYXRlIGFuIGFscmVhZHkgc2lnbmVkLWluIHVzZXIuICovXG4gIFJFQVVUSEVOVElDQVRFOiAncmVhdXRoZW50aWNhdGUnLFxuICAvKiogT3BlcmF0aW9uIGludm9sdmluZyBzaWduaW5nIGluIGEgdXNlci4gKi9cbiAgU0lHTl9JTjogJ3NpZ25Jbidcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogQW4gZW51bWVyYXRpb24gb2YgdGhlIHBvc3NpYmxlIGVtYWlsIGFjdGlvbiB0eXBlcy5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBBY3Rpb25Db2RlT3BlcmF0aW9uID0ge1xuICAvKiogVGhlIGVtYWlsIGxpbmsgc2lnbi1pbiBhY3Rpb24uICovXG4gIEVNQUlMX1NJR05JTjogJ0VNQUlMX1NJR05JTicsXG4gIC8qKiBUaGUgcGFzc3dvcmQgcmVzZXQgYWN0aW9uLiAqL1xuICBQQVNTV09SRF9SRVNFVDogJ1BBU1NXT1JEX1JFU0VUJyxcbiAgLyoqIFRoZSBlbWFpbCByZXZvY2F0aW9uIGFjdGlvbi4gKi9cbiAgUkVDT1ZFUl9FTUFJTDogJ1JFQ09WRVJfRU1BSUwnLFxuICAvKiogVGhlIHJldmVydCBzZWNvbmQgZmFjdG9yIGFkZGl0aW9uIGVtYWlsIGFjdGlvbi4gKi9cbiAgUkVWRVJUX1NFQ09ORF9GQUNUT1JfQURESVRJT046ICdSRVZFUlRfU0VDT05EX0ZBQ1RPUl9BRERJVElPTicsXG4gIC8qKiBUaGUgcmV2ZXJ0IHNlY29uZCBmYWN0b3IgYWRkaXRpb24gZW1haWwgYWN0aW9uLiAqL1xuICBWRVJJRllfQU5EX0NIQU5HRV9FTUFJTDogJ1ZFUklGWV9BTkRfQ0hBTkdFX0VNQUlMJyxcbiAgLyoqIFRoZSBlbWFpbCB2ZXJpZmljYXRpb24gYWN0aW9uLiAqL1xuICBWRVJJRllfRU1BSUw6ICdWRVJJRllfRU1BSUwnXG59IGFzIGNvbnN0O1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEF1dGhFcnJvck1hcCwgVXNlciB9IGZyb20gJy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5pbXBvcnQgeyBFcnJvckZhY3RvcnksIEVycm9yTWFwIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuXG5pbXBvcnQgeyBJZFRva2VuTWZhUmVzcG9uc2UgfSBmcm9tICcuLi9hcGkvYXV0aGVudGljYXRpb24vbWZhJztcbmltcG9ydCB7IEFwcE5hbWUgfSBmcm9tICcuLi9tb2RlbC9hdXRoJztcbmltcG9ydCB7IEF1dGhDcmVkZW50aWFsIH0gZnJvbSAnLi9jcmVkZW50aWFscyc7XG5cbi8qKlxuICogRW51bWVyYXRpb24gb2YgRmlyZWJhc2UgQXV0aCBlcnJvciBjb2Rlcy5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGVudW0gQXV0aEVycm9yQ29kZSB7XG4gIEFETUlOX09OTFlfT1BFUkFUSU9OID0gJ2FkbWluLXJlc3RyaWN0ZWQtb3BlcmF0aW9uJyxcbiAgQVJHVU1FTlRfRVJST1IgPSAnYXJndW1lbnQtZXJyb3InLFxuICBBUFBfTk9UX0FVVEhPUklaRUQgPSAnYXBwLW5vdC1hdXRob3JpemVkJyxcbiAgQVBQX05PVF9JTlNUQUxMRUQgPSAnYXBwLW5vdC1pbnN0YWxsZWQnLFxuICBDQVBUQ0hBX0NIRUNLX0ZBSUxFRCA9ICdjYXB0Y2hhLWNoZWNrLWZhaWxlZCcsXG4gIENPREVfRVhQSVJFRCA9ICdjb2RlLWV4cGlyZWQnLFxuICBDT1JET1ZBX05PVF9SRUFEWSA9ICdjb3Jkb3ZhLW5vdC1yZWFkeScsXG4gIENPUlNfVU5TVVBQT1JURUQgPSAnY29ycy11bnN1cHBvcnRlZCcsXG4gIENSRURFTlRJQUxfQUxSRUFEWV9JTl9VU0UgPSAnY3JlZGVudGlhbC1hbHJlYWR5LWluLXVzZScsXG4gIENSRURFTlRJQUxfTUlTTUFUQ0ggPSAnY3VzdG9tLXRva2VuLW1pc21hdGNoJyxcbiAgQ1JFREVOVElBTF9UT09fT0xEX0xPR0lOX0FHQUlOID0gJ3JlcXVpcmVzLXJlY2VudC1sb2dpbicsXG4gIERFUEVOREVOVF9TREtfSU5JVF9CRUZPUkVfQVVUSCA9ICdkZXBlbmRlbnQtc2RrLWluaXRpYWxpemVkLWJlZm9yZS1hdXRoJyxcbiAgRFlOQU1JQ19MSU5LX05PVF9BQ1RJVkFURUQgPSAnZHluYW1pYy1saW5rLW5vdC1hY3RpdmF0ZWQnLFxuICBFTUFJTF9DSEFOR0VfTkVFRFNfVkVSSUZJQ0FUSU9OID0gJ2VtYWlsLWNoYW5nZS1uZWVkcy12ZXJpZmljYXRpb24nLFxuICBFTUFJTF9FWElTVFMgPSAnZW1haWwtYWxyZWFkeS1pbi11c2UnLFxuICBFTVVMQVRPUl9DT05GSUdfRkFJTEVEID0gJ2VtdWxhdG9yLWNvbmZpZy1mYWlsZWQnLFxuICBFWFBJUkVEX09PQl9DT0RFID0gJ2V4cGlyZWQtYWN0aW9uLWNvZGUnLFxuICBFWFBJUkVEX1BPUFVQX1JFUVVFU1QgPSAnY2FuY2VsbGVkLXBvcHVwLXJlcXVlc3QnLFxuICBJTlRFUk5BTF9FUlJPUiA9ICdpbnRlcm5hbC1lcnJvcicsXG4gIElOVkFMSURfQVBJX0tFWSA9ICdpbnZhbGlkLWFwaS1rZXknLFxuICBJTlZBTElEX0FQUF9DUkVERU5USUFMID0gJ2ludmFsaWQtYXBwLWNyZWRlbnRpYWwnLFxuICBJTlZBTElEX0FQUF9JRCA9ICdpbnZhbGlkLWFwcC1pZCcsXG4gIElOVkFMSURfQVVUSCA9ICdpbnZhbGlkLXVzZXItdG9rZW4nLFxuICBJTlZBTElEX0FVVEhfRVZFTlQgPSAnaW52YWxpZC1hdXRoLWV2ZW50JyxcbiAgSU5WQUxJRF9DRVJUX0hBU0ggPSAnaW52YWxpZC1jZXJ0LWhhc2gnLFxuICBJTlZBTElEX0NPREUgPSAnaW52YWxpZC12ZXJpZmljYXRpb24tY29kZScsXG4gIElOVkFMSURfQ09OVElOVUVfVVJJID0gJ2ludmFsaWQtY29udGludWUtdXJpJyxcbiAgSU5WQUxJRF9DT1JET1ZBX0NPTkZJR1VSQVRJT04gPSAnaW52YWxpZC1jb3Jkb3ZhLWNvbmZpZ3VyYXRpb24nLFxuICBJTlZBTElEX0NVU1RPTV9UT0tFTiA9ICdpbnZhbGlkLWN1c3RvbS10b2tlbicsXG4gIElOVkFMSURfRFlOQU1JQ19MSU5LX0RPTUFJTiA9ICdpbnZhbGlkLWR5bmFtaWMtbGluay1kb21haW4nLFxuICBJTlZBTElEX0VNQUlMID0gJ2ludmFsaWQtZW1haWwnLFxuICBJTlZBTElEX0VNVUxBVE9SX1NDSEVNRSA9ICdpbnZhbGlkLWVtdWxhdG9yLXNjaGVtZScsXG4gIElOVkFMSURfSURQX1JFU1BPTlNFID0gJ2ludmFsaWQtY3JlZGVudGlhbCcsXG4gIElOVkFMSURfTUVTU0FHRV9QQVlMT0FEID0gJ2ludmFsaWQtbWVzc2FnZS1wYXlsb2FkJyxcbiAgSU5WQUxJRF9NRkFfU0VTU0lPTiA9ICdpbnZhbGlkLW11bHRpLWZhY3Rvci1zZXNzaW9uJyxcbiAgSU5WQUxJRF9PQVVUSF9DTElFTlRfSUQgPSAnaW52YWxpZC1vYXV0aC1jbGllbnQtaWQnLFxuICBJTlZBTElEX09BVVRIX1BST1ZJREVSID0gJ2ludmFsaWQtb2F1dGgtcHJvdmlkZXInLFxuICBJTlZBTElEX09PQl9DT0RFID0gJ2ludmFsaWQtYWN0aW9uLWNvZGUnLFxuICBJTlZBTElEX09SSUdJTiA9ICd1bmF1dGhvcml6ZWQtZG9tYWluJyxcbiAgSU5WQUxJRF9QQVNTV09SRCA9ICd3cm9uZy1wYXNzd29yZCcsXG4gIElOVkFMSURfUEVSU0lTVEVOQ0UgPSAnaW52YWxpZC1wZXJzaXN0ZW5jZS10eXBlJyxcbiAgSU5WQUxJRF9QSE9ORV9OVU1CRVIgPSAnaW52YWxpZC1waG9uZS1udW1iZXInLFxuICBJTlZBTElEX1BST1ZJREVSX0lEID0gJ2ludmFsaWQtcHJvdmlkZXItaWQnLFxuICBJTlZBTElEX1JFQ0lQSUVOVF9FTUFJTCA9ICdpbnZhbGlkLXJlY2lwaWVudC1lbWFpbCcsXG4gIElOVkFMSURfU0VOREVSID0gJ2ludmFsaWQtc2VuZGVyJyxcbiAgSU5WQUxJRF9TRVNTSU9OX0lORk8gPSAnaW52YWxpZC12ZXJpZmljYXRpb24taWQnLFxuICBJTlZBTElEX1RFTkFOVF9JRCA9ICdpbnZhbGlkLXRlbmFudC1pZCcsXG4gIExPR0lOX0JMT0NLRUQgPSAnbG9naW4tYmxvY2tlZCcsXG4gIE1GQV9JTkZPX05PVF9GT1VORCA9ICdtdWx0aS1mYWN0b3ItaW5mby1ub3QtZm91bmQnLFxuICBNRkFfUkVRVUlSRUQgPSAnbXVsdGktZmFjdG9yLWF1dGgtcmVxdWlyZWQnLFxuICBNSVNTSU5HX0FORFJPSURfUEFDS0FHRV9OQU1FID0gJ21pc3NpbmctYW5kcm9pZC1wa2ctbmFtZScsXG4gIE1JU1NJTkdfQVBQX0NSRURFTlRJQUwgPSAnbWlzc2luZy1hcHAtY3JlZGVudGlhbCcsXG4gIE1JU1NJTkdfQVVUSF9ET01BSU4gPSAnYXV0aC1kb21haW4tY29uZmlnLXJlcXVpcmVkJyxcbiAgTUlTU0lOR19DT0RFID0gJ21pc3NpbmctdmVyaWZpY2F0aW9uLWNvZGUnLFxuICBNSVNTSU5HX0NPTlRJTlVFX1VSSSA9ICdtaXNzaW5nLWNvbnRpbnVlLXVyaScsXG4gIE1JU1NJTkdfSUZSQU1FX1NUQVJUID0gJ21pc3NpbmctaWZyYW1lLXN0YXJ0JyxcbiAgTUlTU0lOR19JT1NfQlVORExFX0lEID0gJ21pc3NpbmctaW9zLWJ1bmRsZS1pZCcsXG4gIE1JU1NJTkdfT1JfSU5WQUxJRF9OT05DRSA9ICdtaXNzaW5nLW9yLWludmFsaWQtbm9uY2UnLFxuICBNSVNTSU5HX01GQV9JTkZPID0gJ21pc3NpbmctbXVsdGktZmFjdG9yLWluZm8nLFxuICBNSVNTSU5HX01GQV9TRVNTSU9OID0gJ21pc3NpbmctbXVsdGktZmFjdG9yLXNlc3Npb24nLFxuICBNSVNTSU5HX1BIT05FX05VTUJFUiA9ICdtaXNzaW5nLXBob25lLW51bWJlcicsXG4gIE1JU1NJTkdfUEFTU1dPUkQgPSAnbWlzc2luZy1wYXNzd29yZCcsXG4gIE1JU1NJTkdfU0VTU0lPTl9JTkZPID0gJ21pc3NpbmctdmVyaWZpY2F0aW9uLWlkJyxcbiAgTU9EVUxFX0RFU1RST1lFRCA9ICdhcHAtZGVsZXRlZCcsXG4gIE5FRURfQ09ORklSTUFUSU9OID0gJ2FjY291bnQtZXhpc3RzLXdpdGgtZGlmZmVyZW50LWNyZWRlbnRpYWwnLFxuICBORVRXT1JLX1JFUVVFU1RfRkFJTEVEID0gJ25ldHdvcmstcmVxdWVzdC1mYWlsZWQnLFxuICBOVUxMX1VTRVIgPSAnbnVsbC11c2VyJyxcbiAgTk9fQVVUSF9FVkVOVCA9ICduby1hdXRoLWV2ZW50JyxcbiAgTk9fU1VDSF9QUk9WSURFUiA9ICduby1zdWNoLXByb3ZpZGVyJyxcbiAgT1BFUkFUSU9OX05PVF9BTExPV0VEID0gJ29wZXJhdGlvbi1ub3QtYWxsb3dlZCcsXG4gIE9QRVJBVElPTl9OT1RfU1VQUE9SVEVEID0gJ29wZXJhdGlvbi1ub3Qtc3VwcG9ydGVkLWluLXRoaXMtZW52aXJvbm1lbnQnLFxuICBQT1BVUF9CTE9DS0VEID0gJ3BvcHVwLWJsb2NrZWQnLFxuICBQT1BVUF9DTE9TRURfQllfVVNFUiA9ICdwb3B1cC1jbG9zZWQtYnktdXNlcicsXG4gIFBST1ZJREVSX0FMUkVBRFlfTElOS0VEID0gJ3Byb3ZpZGVyLWFscmVhZHktbGlua2VkJyxcbiAgUVVPVEFfRVhDRUVERUQgPSAncXVvdGEtZXhjZWVkZWQnLFxuICBSRURJUkVDVF9DQU5DRUxMRURfQllfVVNFUiA9ICdyZWRpcmVjdC1jYW5jZWxsZWQtYnktdXNlcicsXG4gIFJFRElSRUNUX09QRVJBVElPTl9QRU5ESU5HID0gJ3JlZGlyZWN0LW9wZXJhdGlvbi1wZW5kaW5nJyxcbiAgUkVKRUNURURfQ1JFREVOVElBTCA9ICdyZWplY3RlZC1jcmVkZW50aWFsJyxcbiAgU0VDT05EX0ZBQ1RPUl9BTFJFQURZX0VOUk9MTEVEID0gJ3NlY29uZC1mYWN0b3ItYWxyZWFkeS1pbi11c2UnLFxuICBTRUNPTkRfRkFDVE9SX0xJTUlUX0VYQ0VFREVEID0gJ21heGltdW0tc2Vjb25kLWZhY3Rvci1jb3VudC1leGNlZWRlZCcsXG4gIFRFTkFOVF9JRF9NSVNNQVRDSCA9ICd0ZW5hbnQtaWQtbWlzbWF0Y2gnLFxuICBUSU1FT1VUID0gJ3RpbWVvdXQnLFxuICBUT0tFTl9FWFBJUkVEID0gJ3VzZXItdG9rZW4tZXhwaXJlZCcsXG4gIFRPT19NQU5ZX0FUVEVNUFRTX1RSWV9MQVRFUiA9ICd0b28tbWFueS1yZXF1ZXN0cycsXG4gIFVOQVVUSE9SSVpFRF9ET01BSU4gPSAndW5hdXRob3JpemVkLWNvbnRpbnVlLXVyaScsXG4gIFVOU1VQUE9SVEVEX0ZJUlNUX0ZBQ1RPUiA9ICd1bnN1cHBvcnRlZC1maXJzdC1mYWN0b3InLFxuICBVTlNVUFBPUlRFRF9QRVJTSVNURU5DRSA9ICd1bnN1cHBvcnRlZC1wZXJzaXN0ZW5jZS10eXBlJyxcbiAgVU5TVVBQT1JURURfVEVOQU5UX09QRVJBVElPTiA9ICd1bnN1cHBvcnRlZC10ZW5hbnQtb3BlcmF0aW9uJyxcbiAgVU5WRVJJRklFRF9FTUFJTCA9ICd1bnZlcmlmaWVkLWVtYWlsJyxcbiAgVVNFUl9DQU5DRUxMRUQgPSAndXNlci1jYW5jZWxsZWQnLFxuICBVU0VSX0RFTEVURUQgPSAndXNlci1ub3QtZm91bmQnLFxuICBVU0VSX0RJU0FCTEVEID0gJ3VzZXItZGlzYWJsZWQnLFxuICBVU0VSX01JU01BVENIID0gJ3VzZXItbWlzbWF0Y2gnLFxuICBVU0VSX1NJR05FRF9PVVQgPSAndXNlci1zaWduZWQtb3V0JyxcbiAgV0VBS19QQVNTV09SRCA9ICd3ZWFrLXBhc3N3b3JkJyxcbiAgV0VCX1NUT1JBR0VfVU5TVVBQT1JURUQgPSAnd2ViLXN0b3JhZ2UtdW5zdXBwb3J0ZWQnLFxuICBBTFJFQURZX0lOSVRJQUxJWkVEID0gJ2FscmVhZHktaW5pdGlhbGl6ZWQnLFxuICBSRUNBUFRDSEFfTk9UX0VOQUJMRUQgPSAncmVjYXB0Y2hhLW5vdC1lbmFibGVkJyxcbiAgTUlTU0lOR19SRUNBUFRDSEFfVE9LRU4gPSAnbWlzc2luZy1yZWNhcHRjaGEtdG9rZW4nLFxuICBJTlZBTElEX1JFQ0FQVENIQV9UT0tFTiA9ICdpbnZhbGlkLXJlY2FwdGNoYS10b2tlbicsXG4gIElOVkFMSURfUkVDQVBUQ0hBX0FDVElPTiA9ICdpbnZhbGlkLXJlY2FwdGNoYS1hY3Rpb24nLFxuICBNSVNTSU5HX0NMSUVOVF9UWVBFID0gJ21pc3NpbmctY2xpZW50LXR5cGUnLFxuICBNSVNTSU5HX1JFQ0FQVENIQV9WRVJTSU9OID0gJ21pc3NpbmctcmVjYXB0Y2hhLXZlcnNpb24nLFxuICBJTlZBTElEX1JFQ0FQVENIQV9WRVJTSU9OID0gJ2ludmFsaWQtcmVjYXB0Y2hhLXZlcnNpb24nLFxuICBJTlZBTElEX1JFUV9UWVBFID0gJ2ludmFsaWQtcmVxLXR5cGUnLFxuICBVTlNVUFBPUlRFRF9QQVNTV09SRF9QT0xJQ1lfU0NIRU1BX1ZFUlNJT04gPSAndW5zdXBwb3J0ZWQtcGFzc3dvcmQtcG9saWN5LXNjaGVtYS12ZXJzaW9uJyxcbiAgUEFTU1dPUkRfRE9FU19OT1RfTUVFVF9SRVFVSVJFTUVOVFMgPSAncGFzc3dvcmQtZG9lcy1ub3QtbWVldC1yZXF1aXJlbWVudHMnXG59XG5cbmZ1bmN0aW9uIF9kZWJ1Z0Vycm9yTWFwKCk6IEVycm9yTWFwPEF1dGhFcnJvckNvZGU+IHtcbiAgcmV0dXJuIHtcbiAgICBbQXV0aEVycm9yQ29kZS5BRE1JTl9PTkxZX09QRVJBVElPTl06XG4gICAgICAnVGhpcyBvcGVyYXRpb24gaXMgcmVzdHJpY3RlZCB0byBhZG1pbmlzdHJhdG9ycyBvbmx5LicsXG4gICAgW0F1dGhFcnJvckNvZGUuQVJHVU1FTlRfRVJST1JdOiAnJyxcbiAgICBbQXV0aEVycm9yQ29kZS5BUFBfTk9UX0FVVEhPUklaRURdOlxuICAgICAgXCJUaGlzIGFwcCwgaWRlbnRpZmllZCBieSB0aGUgZG9tYWluIHdoZXJlIGl0J3MgaG9zdGVkLCBpcyBub3QgXCIgK1xuICAgICAgJ2F1dGhvcml6ZWQgdG8gdXNlIEZpcmViYXNlIEF1dGhlbnRpY2F0aW9uIHdpdGggdGhlIHByb3ZpZGVkIEFQSSBrZXkuICcgK1xuICAgICAgJ1JldmlldyB5b3VyIGtleSBjb25maWd1cmF0aW9uIGluIHRoZSBHb29nbGUgQVBJIGNvbnNvbGUuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5BUFBfTk9UX0lOU1RBTExFRF06XG4gICAgICAnVGhlIHJlcXVlc3RlZCBtb2JpbGUgYXBwbGljYXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgaWRlbnRpZmllciAoJyArXG4gICAgICAnQW5kcm9pZCBwYWNrYWdlIG5hbWUgb3IgaU9TIGJ1bmRsZSBJRCkgcHJvdmlkZWQgaXMgbm90IGluc3RhbGxlZCBvbiAnICtcbiAgICAgICd0aGlzIGRldmljZS4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLkNBUFRDSEFfQ0hFQ0tfRkFJTEVEXTpcbiAgICAgICdUaGUgcmVDQVBUQ0hBIHJlc3BvbnNlIHRva2VuIHByb3ZpZGVkIGlzIGVpdGhlciBpbnZhbGlkLCBleHBpcmVkLCAnICtcbiAgICAgICdhbHJlYWR5IHVzZWQgb3IgdGhlIGRvbWFpbiBhc3NvY2lhdGVkIHdpdGggaXQgZG9lcyBub3QgbWF0Y2ggdGhlIGxpc3QgJyArXG4gICAgICAnb2Ygd2hpdGVsaXN0ZWQgZG9tYWlucy4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLkNPREVfRVhQSVJFRF06XG4gICAgICAnVGhlIFNNUyBjb2RlIGhhcyBleHBpcmVkLiBQbGVhc2UgcmUtc2VuZCB0aGUgdmVyaWZpY2F0aW9uIGNvZGUgdG8gdHJ5ICcgK1xuICAgICAgJ2FnYWluLicsXG4gICAgW0F1dGhFcnJvckNvZGUuQ09SRE9WQV9OT1RfUkVBRFldOiAnQ29yZG92YSBmcmFtZXdvcmsgaXMgbm90IHJlYWR5LicsXG4gICAgW0F1dGhFcnJvckNvZGUuQ09SU19VTlNVUFBPUlRFRF06ICdUaGlzIGJyb3dzZXIgaXMgbm90IHN1cHBvcnRlZC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLkNSRURFTlRJQUxfQUxSRUFEWV9JTl9VU0VdOlxuICAgICAgJ1RoaXMgY3JlZGVudGlhbCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCBhIGRpZmZlcmVudCB1c2VyIGFjY291bnQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5DUkVERU5USUFMX01JU01BVENIXTpcbiAgICAgICdUaGUgY3VzdG9tIHRva2VuIGNvcnJlc3BvbmRzIHRvIGEgZGlmZmVyZW50IGF1ZGllbmNlLicsXG4gICAgW0F1dGhFcnJvckNvZGUuQ1JFREVOVElBTF9UT09fT0xEX0xPR0lOX0FHQUlOXTpcbiAgICAgICdUaGlzIG9wZXJhdGlvbiBpcyBzZW5zaXRpdmUgYW5kIHJlcXVpcmVzIHJlY2VudCBhdXRoZW50aWNhdGlvbi4gTG9nIGluICcgK1xuICAgICAgJ2FnYWluIGJlZm9yZSByZXRyeWluZyB0aGlzIHJlcXVlc3QuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5ERVBFTkRFTlRfU0RLX0lOSVRfQkVGT1JFX0FVVEhdOlxuICAgICAgJ0Fub3RoZXIgRmlyZWJhc2UgU0RLIHdhcyBpbml0aWFsaXplZCBhbmQgaXMgdHJ5aW5nIHRvIHVzZSBBdXRoIGJlZm9yZSBBdXRoIGlzICcgK1xuICAgICAgJ2luaXRpYWxpemVkLiBQbGVhc2UgYmUgc3VyZSB0byBjYWxsIGBpbml0aWFsaXplQXV0aGAgb3IgYGdldEF1dGhgIGJlZm9yZSAnICtcbiAgICAgICdzdGFydGluZyBhbnkgb3RoZXIgRmlyZWJhc2UgU0RLLicsXG4gICAgW0F1dGhFcnJvckNvZGUuRFlOQU1JQ19MSU5LX05PVF9BQ1RJVkFURURdOlxuICAgICAgJ1BsZWFzZSBhY3RpdmF0ZSBEeW5hbWljIExpbmtzIGluIHRoZSBGaXJlYmFzZSBDb25zb2xlIGFuZCBhZ3JlZSB0byB0aGUgdGVybXMgYW5kICcgK1xuICAgICAgJ2NvbmRpdGlvbnMuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5FTUFJTF9DSEFOR0VfTkVFRFNfVkVSSUZJQ0FUSU9OXTpcbiAgICAgICdNdWx0aS1mYWN0b3IgdXNlcnMgbXVzdCBhbHdheXMgaGF2ZSBhIHZlcmlmaWVkIGVtYWlsLicsXG4gICAgW0F1dGhFcnJvckNvZGUuRU1BSUxfRVhJU1RTXTpcbiAgICAgICdUaGUgZW1haWwgYWRkcmVzcyBpcyBhbHJlYWR5IGluIHVzZSBieSBhbm90aGVyIGFjY291bnQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5FTVVMQVRPUl9DT05GSUdfRkFJTEVEXTpcbiAgICAgICdBdXRoIGluc3RhbmNlIGhhcyBhbHJlYWR5IGJlZW4gdXNlZCB0byBtYWtlIGEgbmV0d29yayBjYWxsLiBBdXRoIGNhbiAnICtcbiAgICAgICdubyBsb25nZXIgYmUgY29uZmlndXJlZCB0byB1c2UgdGhlIGVtdWxhdG9yLiBUcnkgY2FsbGluZyAnICtcbiAgICAgICdcImNvbm5lY3RBdXRoRW11bGF0b3IoKVwiIHNvb25lci4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLkVYUElSRURfT09CX0NPREVdOiAnVGhlIGFjdGlvbiBjb2RlIGhhcyBleHBpcmVkLicsXG4gICAgW0F1dGhFcnJvckNvZGUuRVhQSVJFRF9QT1BVUF9SRVFVRVNUXTpcbiAgICAgICdUaGlzIG9wZXJhdGlvbiBoYXMgYmVlbiBjYW5jZWxsZWQgZHVlIHRvIGFub3RoZXIgY29uZmxpY3RpbmcgcG9wdXAgYmVpbmcgb3BlbmVkLicsXG4gICAgW0F1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1JdOiAnQW4gaW50ZXJuYWwgQXV0aEVycm9yIGhhcyBvY2N1cnJlZC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLklOVkFMSURfQVBQX0NSRURFTlRJQUxdOlxuICAgICAgJ1RoZSBwaG9uZSB2ZXJpZmljYXRpb24gcmVxdWVzdCBjb250YWlucyBhbiBpbnZhbGlkIGFwcGxpY2F0aW9uIHZlcmlmaWVyLicgK1xuICAgICAgJyBUaGUgcmVDQVBUQ0hBIHRva2VuIHJlc3BvbnNlIGlzIGVpdGhlciBpbnZhbGlkIG9yIGV4cGlyZWQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5JTlZBTElEX0FQUF9JRF06XG4gICAgICAnVGhlIG1vYmlsZSBhcHAgaWRlbnRpZmllciBpcyBub3QgcmVnaXN0ZWQgZm9yIHRoZSBjdXJyZW50IHByb2plY3QuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5JTlZBTElEX0FVVEhdOlxuICAgICAgXCJUaGlzIHVzZXIncyBjcmVkZW50aWFsIGlzbid0IHZhbGlkIGZvciB0aGlzIHByb2plY3QuIFRoaXMgY2FuIGhhcHBlbiBcIiArXG4gICAgICBcImlmIHRoZSB1c2VyJ3MgdG9rZW4gaGFzIGJlZW4gdGFtcGVyZWQgd2l0aCwgb3IgaWYgdGhlIHVzZXIgaXNuJ3QgZm9yIFwiICtcbiAgICAgICd0aGUgcHJvamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBBUEkga2V5LicsXG4gICAgW0F1dGhFcnJvckNvZGUuSU5WQUxJRF9BVVRIX0VWRU5UXTogJ0FuIGludGVybmFsIEF1dGhFcnJvciBoYXMgb2NjdXJyZWQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5JTlZBTElEX0NPREVdOlxuICAgICAgJ1RoZSBTTVMgdmVyaWZpY2F0aW9uIGNvZGUgdXNlZCB0byBjcmVhdGUgdGhlIHBob25lIGF1dGggY3JlZGVudGlhbCBpcyAnICtcbiAgICAgICdpbnZhbGlkLiBQbGVhc2UgcmVzZW5kIHRoZSB2ZXJpZmljYXRpb24gY29kZSBzbXMgYW5kIGJlIHN1cmUgdG8gdXNlIHRoZSAnICtcbiAgICAgICd2ZXJpZmljYXRpb24gY29kZSBwcm92aWRlZCBieSB0aGUgdXNlci4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLklOVkFMSURfQ09OVElOVUVfVVJJXTpcbiAgICAgICdUaGUgY29udGludWUgVVJMIHByb3ZpZGVkIGluIHRoZSByZXF1ZXN0IGlzIGludmFsaWQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5JTlZBTElEX0NPUkRPVkFfQ09ORklHVVJBVElPTl06XG4gICAgICAnVGhlIGZvbGxvd2luZyBDb3Jkb3ZhIHBsdWdpbnMgbXVzdCBiZSBpbnN0YWxsZWQgdG8gZW5hYmxlIE9BdXRoIHNpZ24taW46ICcgK1xuICAgICAgJ2NvcmRvdmEtcGx1Z2luLWJ1aWxkaW5mbywgY29yZG92YS11bml2ZXJzYWwtbGlua3MtcGx1Z2luLCAnICtcbiAgICAgICdjb3Jkb3ZhLXBsdWdpbi1icm93c2VydGFiLCBjb3Jkb3ZhLXBsdWdpbi1pbmFwcGJyb3dzZXIgYW5kICcgK1xuICAgICAgJ2NvcmRvdmEtcGx1Z2luLWN1c3RvbXVybHNjaGVtZS4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLklOVkFMSURfQ1VTVE9NX1RPS0VOXTpcbiAgICAgICdUaGUgY3VzdG9tIHRva2VuIGZvcm1hdCBpcyBpbmNvcnJlY3QuIFBsZWFzZSBjaGVjayB0aGUgZG9jdW1lbnRhdGlvbi4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLklOVkFMSURfRFlOQU1JQ19MSU5LX0RPTUFJTl06XG4gICAgICAnVGhlIHByb3ZpZGVkIGR5bmFtaWMgbGluayBkb21haW4gaXMgbm90IGNvbmZpZ3VyZWQgb3IgYXV0aG9yaXplZCBmb3IgdGhlIGN1cnJlbnQgcHJvamVjdC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLklOVkFMSURfRU1BSUxdOiAnVGhlIGVtYWlsIGFkZHJlc3MgaXMgYmFkbHkgZm9ybWF0dGVkLicsXG4gICAgW0F1dGhFcnJvckNvZGUuSU5WQUxJRF9FTVVMQVRPUl9TQ0hFTUVdOlxuICAgICAgJ0VtdWxhdG9yIFVSTCBtdXN0IHN0YXJ0IHdpdGggYSB2YWxpZCBzY2hlbWUgKGh0dHA6Ly8gb3IgaHR0cHM6Ly8pLicsXG4gICAgW0F1dGhFcnJvckNvZGUuSU5WQUxJRF9BUElfS0VZXTpcbiAgICAgICdZb3VyIEFQSSBrZXkgaXMgaW52YWxpZCwgcGxlYXNlIGNoZWNrIHlvdSBoYXZlIGNvcGllZCBpdCBjb3JyZWN0bHkuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5JTlZBTElEX0NFUlRfSEFTSF06XG4gICAgICAnVGhlIFNIQS0xIGNlcnRpZmljYXRlIGhhc2ggcHJvdmlkZWQgaXMgaW52YWxpZC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLklOVkFMSURfSURQX1JFU1BPTlNFXTpcbiAgICAgICdUaGUgc3VwcGxpZWQgYXV0aCBjcmVkZW50aWFsIGlzIG1hbGZvcm1lZCBvciBoYXMgZXhwaXJlZC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLklOVkFMSURfTUVTU0FHRV9QQVlMT0FEXTpcbiAgICAgICdUaGUgZW1haWwgdGVtcGxhdGUgY29ycmVzcG9uZGluZyB0byB0aGlzIGFjdGlvbiBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMgaW4gaXRzIG1lc3NhZ2UuICcgK1xuICAgICAgJ1BsZWFzZSBmaXggYnkgZ29pbmcgdG8gdGhlIEF1dGggZW1haWwgdGVtcGxhdGVzIHNlY3Rpb24gaW4gdGhlIEZpcmViYXNlIENvbnNvbGUuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5JTlZBTElEX01GQV9TRVNTSU9OXTpcbiAgICAgICdUaGUgcmVxdWVzdCBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgcHJvb2Ygb2YgZmlyc3QgZmFjdG9yIHN1Y2Nlc3NmdWwgc2lnbi1pbi4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLklOVkFMSURfT0FVVEhfUFJPVklERVJdOlxuICAgICAgJ0VtYWlsQXV0aFByb3ZpZGVyIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgb3BlcmF0aW9uLiBUaGlzIG9wZXJhdGlvbiAnICtcbiAgICAgICdvbmx5IHN1cHBvcnRzIE9BdXRoIHByb3ZpZGVycy4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLklOVkFMSURfT0FVVEhfQ0xJRU5UX0lEXTpcbiAgICAgICdUaGUgT0F1dGggY2xpZW50IElEIHByb3ZpZGVkIGlzIGVpdGhlciBpbnZhbGlkIG9yIGRvZXMgbm90IG1hdGNoIHRoZSAnICtcbiAgICAgICdzcGVjaWZpZWQgQVBJIGtleS4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLklOVkFMSURfT1JJR0lOXTpcbiAgICAgICdUaGlzIGRvbWFpbiBpcyBub3QgYXV0aG9yaXplZCBmb3IgT0F1dGggb3BlcmF0aW9ucyBmb3IgeW91ciBGaXJlYmFzZSAnICtcbiAgICAgICdwcm9qZWN0LiBFZGl0IHRoZSBsaXN0IG9mIGF1dGhvcml6ZWQgZG9tYWlucyBmcm9tIHRoZSBGaXJlYmFzZSBjb25zb2xlLicsXG4gICAgW0F1dGhFcnJvckNvZGUuSU5WQUxJRF9PT0JfQ09ERV06XG4gICAgICAnVGhlIGFjdGlvbiBjb2RlIGlzIGludmFsaWQuIFRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgY29kZSBpcyBtYWxmb3JtZWQsICcgK1xuICAgICAgJ2V4cGlyZWQsIG9yIGhhcyBhbHJlYWR5IGJlZW4gdXNlZC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLklOVkFMSURfUEFTU1dPUkRdOlxuICAgICAgJ1RoZSBwYXNzd29yZCBpcyBpbnZhbGlkIG9yIHRoZSB1c2VyIGRvZXMgbm90IGhhdmUgYSBwYXNzd29yZC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLklOVkFMSURfUEVSU0lTVEVOQ0VdOlxuICAgICAgJ1RoZSBzcGVjaWZpZWQgcGVyc2lzdGVuY2UgdHlwZSBpcyBpbnZhbGlkLiBJdCBjYW4gb25seSBiZSBsb2NhbCwgc2Vzc2lvbiBvciBub25lLicsXG4gICAgW0F1dGhFcnJvckNvZGUuSU5WQUxJRF9QSE9ORV9OVU1CRVJdOlxuICAgICAgJ1RoZSBmb3JtYXQgb2YgdGhlIHBob25lIG51bWJlciBwcm92aWRlZCBpcyBpbmNvcnJlY3QuIFBsZWFzZSBlbnRlciB0aGUgJyArXG4gICAgICAncGhvbmUgbnVtYmVyIGluIGEgZm9ybWF0IHRoYXQgY2FuIGJlIHBhcnNlZCBpbnRvIEUuMTY0IGZvcm1hdC4gRS4xNjQgJyArXG4gICAgICAncGhvbmUgbnVtYmVycyBhcmUgd3JpdHRlbiBpbiB0aGUgZm9ybWF0IFsrXVtjb3VudHJ5IGNvZGVdW3N1YnNjcmliZXIgJyArXG4gICAgICAnbnVtYmVyIGluY2x1ZGluZyBhcmVhIGNvZGVdLicsXG4gICAgW0F1dGhFcnJvckNvZGUuSU5WQUxJRF9QUk9WSURFUl9JRF06XG4gICAgICAnVGhlIHNwZWNpZmllZCBwcm92aWRlciBJRCBpcyBpbnZhbGlkLicsXG4gICAgW0F1dGhFcnJvckNvZGUuSU5WQUxJRF9SRUNJUElFTlRfRU1BSUxdOlxuICAgICAgJ1RoZSBlbWFpbCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgYWN0aW9uIGZhaWxlZCB0byBzZW5kIGFzIHRoZSBwcm92aWRlZCAnICtcbiAgICAgICdyZWNpcGllbnQgZW1haWwgYWRkcmVzcyBpcyBpbnZhbGlkLicsXG4gICAgW0F1dGhFcnJvckNvZGUuSU5WQUxJRF9TRU5ERVJdOlxuICAgICAgJ1RoZSBlbWFpbCB0ZW1wbGF0ZSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgYWN0aW9uIGNvbnRhaW5zIGFuIGludmFsaWQgc2VuZGVyIGVtYWlsIG9yIG5hbWUuICcgK1xuICAgICAgJ1BsZWFzZSBmaXggYnkgZ29pbmcgdG8gdGhlIEF1dGggZW1haWwgdGVtcGxhdGVzIHNlY3Rpb24gaW4gdGhlIEZpcmViYXNlIENvbnNvbGUuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5JTlZBTElEX1NFU1NJT05fSU5GT106XG4gICAgICAnVGhlIHZlcmlmaWNhdGlvbiBJRCB1c2VkIHRvIGNyZWF0ZSB0aGUgcGhvbmUgYXV0aCBjcmVkZW50aWFsIGlzIGludmFsaWQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5JTlZBTElEX1RFTkFOVF9JRF06XG4gICAgICBcIlRoZSBBdXRoIGluc3RhbmNlJ3MgdGVuYW50IElEIGlzIGludmFsaWQuXCIsXG4gICAgW0F1dGhFcnJvckNvZGUuTE9HSU5fQkxPQ0tFRF06XG4gICAgICAnTG9naW4gYmxvY2tlZCBieSB1c2VyLXByb3ZpZGVkIG1ldGhvZDogeyRvcmlnaW5hbE1lc3NhZ2V9JyxcbiAgICBbQXV0aEVycm9yQ29kZS5NSVNTSU5HX0FORFJPSURfUEFDS0FHRV9OQU1FXTpcbiAgICAgICdBbiBBbmRyb2lkIFBhY2thZ2UgTmFtZSBtdXN0IGJlIHByb3ZpZGVkIGlmIHRoZSBBbmRyb2lkIEFwcCBpcyByZXF1aXJlZCB0byBiZSBpbnN0YWxsZWQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5NSVNTSU5HX0FVVEhfRE9NQUlOXTpcbiAgICAgICdCZSBzdXJlIHRvIGluY2x1ZGUgYXV0aERvbWFpbiB3aGVuIGNhbGxpbmcgZmlyZWJhc2UuaW5pdGlhbGl6ZUFwcCgpLCAnICtcbiAgICAgICdieSBmb2xsb3dpbmcgdGhlIGluc3RydWN0aW9ucyBpbiB0aGUgRmlyZWJhc2UgY29uc29sZS4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLk1JU1NJTkdfQVBQX0NSRURFTlRJQUxdOlxuICAgICAgJ1RoZSBwaG9uZSB2ZXJpZmljYXRpb24gcmVxdWVzdCBpcyBtaXNzaW5nIGFuIGFwcGxpY2F0aW9uIHZlcmlmaWVyICcgK1xuICAgICAgJ2Fzc2VydGlvbi4gQSByZUNBUFRDSEEgcmVzcG9uc2UgdG9rZW4gbmVlZHMgdG8gYmUgcHJvdmlkZWQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5NSVNTSU5HX0NPREVdOlxuICAgICAgJ1RoZSBwaG9uZSBhdXRoIGNyZWRlbnRpYWwgd2FzIGNyZWF0ZWQgd2l0aCBhbiBlbXB0eSBTTVMgdmVyaWZpY2F0aW9uIGNvZGUuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5NSVNTSU5HX0NPTlRJTlVFX1VSSV06XG4gICAgICAnQSBjb250aW51ZSBVUkwgbXVzdCBiZSBwcm92aWRlZCBpbiB0aGUgcmVxdWVzdC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLk1JU1NJTkdfSUZSQU1FX1NUQVJUXTogJ0FuIGludGVybmFsIEF1dGhFcnJvciBoYXMgb2NjdXJyZWQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5NSVNTSU5HX0lPU19CVU5ETEVfSURdOlxuICAgICAgJ0FuIGlPUyBCdW5kbGUgSUQgbXVzdCBiZSBwcm92aWRlZCBpZiBhbiBBcHAgU3RvcmUgSUQgaXMgcHJvdmlkZWQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5NSVNTSU5HX09SX0lOVkFMSURfTk9OQ0VdOlxuICAgICAgJ1RoZSByZXF1ZXN0IGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBub25jZS4gVGhpcyBjYW4gb2NjdXIgaWYgdGhlICcgK1xuICAgICAgJ1NIQS0yNTYgaGFzaCBvZiB0aGUgcHJvdmlkZWQgcmF3IG5vbmNlIGRvZXMgbm90IG1hdGNoIHRoZSBoYXNoZWQgbm9uY2UgJyArXG4gICAgICAnaW4gdGhlIElEIHRva2VuIHBheWxvYWQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5NSVNTSU5HX1BBU1NXT1JEXTogJ0Egbm9uLWVtcHR5IHBhc3N3b3JkIG11c3QgYmUgcHJvdmlkZWQnLFxuICAgIFtBdXRoRXJyb3JDb2RlLk1JU1NJTkdfTUZBX0lORk9dOlxuICAgICAgJ05vIHNlY29uZCBmYWN0b3IgaWRlbnRpZmllciBpcyBwcm92aWRlZC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLk1JU1NJTkdfTUZBX1NFU1NJT05dOlxuICAgICAgJ1RoZSByZXF1ZXN0IGlzIG1pc3NpbmcgcHJvb2Ygb2YgZmlyc3QgZmFjdG9yIHN1Y2Nlc3NmdWwgc2lnbi1pbi4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLk1JU1NJTkdfUEhPTkVfTlVNQkVSXTpcbiAgICAgICdUbyBzZW5kIHZlcmlmaWNhdGlvbiBjb2RlcywgcHJvdmlkZSBhIHBob25lIG51bWJlciBmb3IgdGhlIHJlY2lwaWVudC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLk1JU1NJTkdfU0VTU0lPTl9JTkZPXTpcbiAgICAgICdUaGUgcGhvbmUgYXV0aCBjcmVkZW50aWFsIHdhcyBjcmVhdGVkIHdpdGggYW4gZW1wdHkgdmVyaWZpY2F0aW9uIElELicsXG4gICAgW0F1dGhFcnJvckNvZGUuTU9EVUxFX0RFU1RST1lFRF06XG4gICAgICAnVGhpcyBpbnN0YW5jZSBvZiBGaXJlYmFzZUFwcCBoYXMgYmVlbiBkZWxldGVkLicsXG4gICAgW0F1dGhFcnJvckNvZGUuTUZBX0lORk9fTk9UX0ZPVU5EXTpcbiAgICAgICdUaGUgdXNlciBkb2VzIG5vdCBoYXZlIGEgc2Vjb25kIGZhY3RvciBtYXRjaGluZyB0aGUgaWRlbnRpZmllciBwcm92aWRlZC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLk1GQV9SRVFVSVJFRF06XG4gICAgICAnUHJvb2Ygb2Ygb3duZXJzaGlwIG9mIGEgc2Vjb25kIGZhY3RvciBpcyByZXF1aXJlZCB0byBjb21wbGV0ZSBzaWduLWluLicsXG4gICAgW0F1dGhFcnJvckNvZGUuTkVFRF9DT05GSVJNQVRJT05dOlxuICAgICAgJ0FuIGFjY291bnQgYWxyZWFkeSBleGlzdHMgd2l0aCB0aGUgc2FtZSBlbWFpbCBhZGRyZXNzIGJ1dCBkaWZmZXJlbnQgJyArXG4gICAgICAnc2lnbi1pbiBjcmVkZW50aWFscy4gU2lnbiBpbiB1c2luZyBhIHByb3ZpZGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzICcgK1xuICAgICAgJ2VtYWlsIGFkZHJlc3MuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5ORVRXT1JLX1JFUVVFU1RfRkFJTEVEXTpcbiAgICAgICdBIG5ldHdvcmsgQXV0aEVycm9yIChzdWNoIGFzIHRpbWVvdXQsIGludGVycnVwdGVkIGNvbm5lY3Rpb24gb3IgdW5yZWFjaGFibGUgaG9zdCkgaGFzIG9jY3VycmVkLicsXG4gICAgW0F1dGhFcnJvckNvZGUuTk9fQVVUSF9FVkVOVF06ICdBbiBpbnRlcm5hbCBBdXRoRXJyb3IgaGFzIG9jY3VycmVkLicsXG4gICAgW0F1dGhFcnJvckNvZGUuTk9fU1VDSF9QUk9WSURFUl06XG4gICAgICAnVXNlciB3YXMgbm90IGxpbmtlZCB0byBhbiBhY2NvdW50IHdpdGggdGhlIGdpdmVuIHByb3ZpZGVyLicsXG4gICAgW0F1dGhFcnJvckNvZGUuTlVMTF9VU0VSXTpcbiAgICAgICdBIG51bGwgdXNlciBvYmplY3Qgd2FzIHByb3ZpZGVkIGFzIHRoZSBhcmd1bWVudCBmb3IgYW4gb3BlcmF0aW9uIHdoaWNoICcgK1xuICAgICAgJ3JlcXVpcmVzIGEgbm9uLW51bGwgdXNlciBvYmplY3QuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5PUEVSQVRJT05fTk9UX0FMTE9XRURdOlxuICAgICAgJ1RoZSBnaXZlbiBzaWduLWluIHByb3ZpZGVyIGlzIGRpc2FibGVkIGZvciB0aGlzIEZpcmViYXNlIHByb2plY3QuICcgK1xuICAgICAgJ0VuYWJsZSBpdCBpbiB0aGUgRmlyZWJhc2UgY29uc29sZSwgdW5kZXIgdGhlIHNpZ24taW4gbWV0aG9kIHRhYiBvZiB0aGUgJyArXG4gICAgICAnQXV0aCBzZWN0aW9uLicsXG4gICAgW0F1dGhFcnJvckNvZGUuT1BFUkFUSU9OX05PVF9TVVBQT1JURURdOlxuICAgICAgJ1RoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGVudmlyb25tZW50IHRoaXMgYXBwbGljYXRpb24gaXMgJyArXG4gICAgICAncnVubmluZyBvbi4gXCJsb2NhdGlvbi5wcm90b2NvbFwiIG11c3QgYmUgaHR0cCwgaHR0cHMgb3IgY2hyb21lLWV4dGVuc2lvbicgK1xuICAgICAgJyBhbmQgd2ViIHN0b3JhZ2UgbXVzdCBiZSBlbmFibGVkLicsXG4gICAgW0F1dGhFcnJvckNvZGUuUE9QVVBfQkxPQ0tFRF06XG4gICAgICAnVW5hYmxlIHRvIGVzdGFibGlzaCBhIGNvbm5lY3Rpb24gd2l0aCB0aGUgcG9wdXAuIEl0IG1heSBoYXZlIGJlZW4gYmxvY2tlZCBieSB0aGUgYnJvd3Nlci4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLlBPUFVQX0NMT1NFRF9CWV9VU0VSXTpcbiAgICAgICdUaGUgcG9wdXAgaGFzIGJlZW4gY2xvc2VkIGJ5IHRoZSB1c2VyIGJlZm9yZSBmaW5hbGl6aW5nIHRoZSBvcGVyYXRpb24uJyxcbiAgICBbQXV0aEVycm9yQ29kZS5QUk9WSURFUl9BTFJFQURZX0xJTktFRF06XG4gICAgICAnVXNlciBjYW4gb25seSBiZSBsaW5rZWQgdG8gb25lIGlkZW50aXR5IGZvciB0aGUgZ2l2ZW4gcHJvdmlkZXIuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5RVU9UQV9FWENFRURFRF06XG4gICAgICBcIlRoZSBwcm9qZWN0J3MgcXVvdGEgZm9yIHRoaXMgb3BlcmF0aW9uIGhhcyBiZWVuIGV4Y2VlZGVkLlwiLFxuICAgIFtBdXRoRXJyb3JDb2RlLlJFRElSRUNUX0NBTkNFTExFRF9CWV9VU0VSXTpcbiAgICAgICdUaGUgcmVkaXJlY3Qgb3BlcmF0aW9uIGhhcyBiZWVuIGNhbmNlbGxlZCBieSB0aGUgdXNlciBiZWZvcmUgZmluYWxpemluZy4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLlJFRElSRUNUX09QRVJBVElPTl9QRU5ESU5HXTpcbiAgICAgICdBIHJlZGlyZWN0IHNpZ24taW4gb3BlcmF0aW9uIGlzIGFscmVhZHkgcGVuZGluZy4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLlJFSkVDVEVEX0NSRURFTlRJQUxdOlxuICAgICAgJ1RoZSByZXF1ZXN0IGNvbnRhaW5zIG1hbGZvcm1lZCBvciBtaXNtYXRjaGluZyBjcmVkZW50aWFscy4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLlNFQ09ORF9GQUNUT1JfQUxSRUFEWV9FTlJPTExFRF06XG4gICAgICAnVGhlIHNlY29uZCBmYWN0b3IgaXMgYWxyZWFkeSBlbnJvbGxlZCBvbiB0aGlzIGFjY291bnQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5TRUNPTkRfRkFDVE9SX0xJTUlUX0VYQ0VFREVEXTpcbiAgICAgICdUaGUgbWF4aW11bSBhbGxvd2VkIG51bWJlciBvZiBzZWNvbmQgZmFjdG9ycyBvbiBhIHVzZXIgaGFzIGJlZW4gZXhjZWVkZWQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5URU5BTlRfSURfTUlTTUFUQ0hdOlxuICAgICAgXCJUaGUgcHJvdmlkZWQgdGVuYW50IElEIGRvZXMgbm90IG1hdGNoIHRoZSBBdXRoIGluc3RhbmNlJ3MgdGVuYW50IElEXCIsXG4gICAgW0F1dGhFcnJvckNvZGUuVElNRU9VVF06ICdUaGUgb3BlcmF0aW9uIGhhcyB0aW1lZCBvdXQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5UT0tFTl9FWFBJUkVEXTpcbiAgICAgIFwiVGhlIHVzZXIncyBjcmVkZW50aWFsIGlzIG5vIGxvbmdlciB2YWxpZC4gVGhlIHVzZXIgbXVzdCBzaWduIGluIGFnYWluLlwiLFxuICAgIFtBdXRoRXJyb3JDb2RlLlRPT19NQU5ZX0FUVEVNUFRTX1RSWV9MQVRFUl06XG4gICAgICAnV2UgaGF2ZSBibG9ja2VkIGFsbCByZXF1ZXN0cyBmcm9tIHRoaXMgZGV2aWNlIGR1ZSB0byB1bnVzdWFsIGFjdGl2aXR5LiAnICtcbiAgICAgICdUcnkgYWdhaW4gbGF0ZXIuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5VTkFVVEhPUklaRURfRE9NQUlOXTpcbiAgICAgICdUaGUgZG9tYWluIG9mIHRoZSBjb250aW51ZSBVUkwgaXMgbm90IHdoaXRlbGlzdGVkLiAgUGxlYXNlIHdoaXRlbGlzdCAnICtcbiAgICAgICd0aGUgZG9tYWluIGluIHRoZSBGaXJlYmFzZSBjb25zb2xlLicsXG4gICAgW0F1dGhFcnJvckNvZGUuVU5TVVBQT1JURURfRklSU1RfRkFDVE9SXTpcbiAgICAgICdFbnJvbGxpbmcgYSBzZWNvbmQgZmFjdG9yIG9yIHNpZ25pbmcgaW4gd2l0aCBhIG11bHRpLWZhY3RvciBhY2NvdW50IHJlcXVpcmVzIHNpZ24taW4gd2l0aCBhIHN1cHBvcnRlZCBmaXJzdCBmYWN0b3IuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5VTlNVUFBPUlRFRF9QRVJTSVNURU5DRV06XG4gICAgICAnVGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgc3BlY2lmaWVkIHBlcnNpc3RlbmNlIHR5cGUuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5VTlNVUFBPUlRFRF9URU5BTlRfT1BFUkFUSU9OXTpcbiAgICAgICdUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGluIGEgbXVsdGktdGVuYW50IGNvbnRleHQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5VTlZFUklGSUVEX0VNQUlMXTpcbiAgICAgICdUaGUgb3BlcmF0aW9uIHJlcXVpcmVzIGEgdmVyaWZpZWQgZW1haWwuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5VU0VSX0NBTkNFTExFRF06XG4gICAgICAnVGhlIHVzZXIgZGlkIG5vdCBncmFudCB5b3VyIGFwcGxpY2F0aW9uIHRoZSBwZXJtaXNzaW9ucyBpdCByZXF1ZXN0ZWQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5VU0VSX0RFTEVURURdOlxuICAgICAgJ1RoZXJlIGlzIG5vIHVzZXIgcmVjb3JkIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBpZGVudGlmaWVyLiBUaGUgdXNlciBtYXkgJyArXG4gICAgICAnaGF2ZSBiZWVuIGRlbGV0ZWQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5VU0VSX0RJU0FCTEVEXTpcbiAgICAgICdUaGUgdXNlciBhY2NvdW50IGhhcyBiZWVuIGRpc2FibGVkIGJ5IGFuIGFkbWluaXN0cmF0b3IuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5VU0VSX01JU01BVENIXTpcbiAgICAgICdUaGUgc3VwcGxpZWQgY3JlZGVudGlhbHMgZG8gbm90IGNvcnJlc3BvbmQgdG8gdGhlIHByZXZpb3VzbHkgc2lnbmVkIGluIHVzZXIuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5VU0VSX1NJR05FRF9PVVRdOiAnJyxcbiAgICBbQXV0aEVycm9yQ29kZS5XRUFLX1BBU1NXT1JEXTpcbiAgICAgICdUaGUgcGFzc3dvcmQgbXVzdCBiZSA2IGNoYXJhY3RlcnMgbG9uZyBvciBtb3JlLicsXG4gICAgW0F1dGhFcnJvckNvZGUuV0VCX1NUT1JBR0VfVU5TVVBQT1JURURdOlxuICAgICAgJ1RoaXMgYnJvd3NlciBpcyBub3Qgc3VwcG9ydGVkIG9yIDNyZCBwYXJ0eSBjb29raWVzIGFuZCBkYXRhIG1heSBiZSBkaXNhYmxlZC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLkFMUkVBRFlfSU5JVElBTElaRURdOlxuICAgICAgJ2luaXRpYWxpemVBdXRoKCkgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQgd2l0aCAnICtcbiAgICAgICdkaWZmZXJlbnQgb3B0aW9ucy4gVG8gYXZvaWQgdGhpcyBlcnJvciwgY2FsbCBpbml0aWFsaXplQXV0aCgpIHdpdGggdGhlICcgK1xuICAgICAgJ3NhbWUgb3B0aW9ucyBhcyB3aGVuIGl0IHdhcyBvcmlnaW5hbGx5IGNhbGxlZCwgb3IgY2FsbCBnZXRBdXRoKCkgdG8gcmV0dXJuIHRoZScgK1xuICAgICAgJyBhbHJlYWR5IGluaXRpYWxpemVkIGluc3RhbmNlLicsXG4gICAgW0F1dGhFcnJvckNvZGUuTUlTU0lOR19SRUNBUFRDSEFfVE9LRU5dOlxuICAgICAgJ1RoZSByZUNBUFRDSEEgdG9rZW4gaXMgbWlzc2luZyB3aGVuIHNlbmRpbmcgcmVxdWVzdCB0byB0aGUgYmFja2VuZC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLklOVkFMSURfUkVDQVBUQ0hBX1RPS0VOXTpcbiAgICAgICdUaGUgcmVDQVBUQ0hBIHRva2VuIGlzIGludmFsaWQgd2hlbiBzZW5kaW5nIHJlcXVlc3QgdG8gdGhlIGJhY2tlbmQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5JTlZBTElEX1JFQ0FQVENIQV9BQ1RJT05dOlxuICAgICAgJ1RoZSByZUNBUFRDSEEgYWN0aW9uIGlzIGludmFsaWQgd2hlbiBzZW5kaW5nIHJlcXVlc3QgdG8gdGhlIGJhY2tlbmQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5SRUNBUFRDSEFfTk9UX0VOQUJMRURdOlxuICAgICAgJ3JlQ0FQVENIQSBFbnRlcnByaXNlIGludGVncmF0aW9uIGlzIG5vdCBlbmFibGVkIGZvciB0aGlzIHByb2plY3QuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5NSVNTSU5HX0NMSUVOVF9UWVBFXTpcbiAgICAgICdUaGUgcmVDQVBUQ0hBIGNsaWVudCB0eXBlIGlzIG1pc3Npbmcgd2hlbiBzZW5kaW5nIHJlcXVlc3QgdG8gdGhlIGJhY2tlbmQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5NSVNTSU5HX1JFQ0FQVENIQV9WRVJTSU9OXTpcbiAgICAgICdUaGUgcmVDQVBUQ0hBIHZlcnNpb24gaXMgbWlzc2luZyB3aGVuIHNlbmRpbmcgcmVxdWVzdCB0byB0aGUgYmFja2VuZC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLklOVkFMSURfUkVRX1RZUEVdOiAnSW52YWxpZCByZXF1ZXN0IHBhcmFtZXRlcnMuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5JTlZBTElEX1JFQ0FQVENIQV9WRVJTSU9OXTpcbiAgICAgICdUaGUgcmVDQVBUQ0hBIHZlcnNpb24gaXMgaW52YWxpZCB3aGVuIHNlbmRpbmcgcmVxdWVzdCB0byB0aGUgYmFja2VuZC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLlVOU1VQUE9SVEVEX1BBU1NXT1JEX1BPTElDWV9TQ0hFTUFfVkVSU0lPTl06XG4gICAgICAnVGhlIHBhc3N3b3JkIHBvbGljeSByZWNlaXZlZCBmcm9tIHRoZSBiYWNrZW5kIHVzZXMgYSBzY2hlbWEgdmVyc2lvbiB0aGF0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyB2ZXJzaW9uIG9mIHRoZSBGaXJlYmFzZSBTREsuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5QQVNTV09SRF9ET0VTX05PVF9NRUVUX1JFUVVJUkVNRU5UU106XG4gICAgICAnVGhlIHBhc3N3b3JkIGRvZXMgbm90IG1lZXQgdGhlIHJlcXVpcmVtZW50cy4nXG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXJyb3JNYXBSZXRyaWV2ZXIgZXh0ZW5kcyBBdXRoRXJyb3JNYXAge1xuICAoKTogRXJyb3JNYXA8QXV0aEVycm9yQ29kZT47XG59XG5cbmZ1bmN0aW9uIF9wcm9kRXJyb3JNYXAoKTogRXJyb3JNYXA8QXV0aEVycm9yQ29kZT4ge1xuICAvLyBXZSB3aWxsIGluY2x1ZGUgdGhpcyBvbmUgbWVzc2FnZSBpbiB0aGUgcHJvZCBlcnJvciBtYXAgc2luY2UgYnkgdGhlIHZlcnlcbiAgLy8gbmF0dXJlIG9mIHRoaXMgZXJyb3IsIGRldmVsb3BlcnMgd2lsbCBuZXZlciBiZSBhYmxlIHRvIHNlZSB0aGUgbWVzc2FnZVxuICAvLyB1c2luZyB0aGUgZGVidWdFcnJvck1hcCAod2hpY2ggaXMgaW5zdGFsbGVkIGR1cmluZyBhdXRoIGluaXRpYWxpemF0aW9uKS5cbiAgcmV0dXJuIHtcbiAgICBbQXV0aEVycm9yQ29kZS5ERVBFTkRFTlRfU0RLX0lOSVRfQkVGT1JFX0FVVEhdOlxuICAgICAgJ0Fub3RoZXIgRmlyZWJhc2UgU0RLIHdhcyBpbml0aWFsaXplZCBhbmQgaXMgdHJ5aW5nIHRvIHVzZSBBdXRoIGJlZm9yZSBBdXRoIGlzICcgK1xuICAgICAgJ2luaXRpYWxpemVkLiBQbGVhc2UgYmUgc3VyZSB0byBjYWxsIGBpbml0aWFsaXplQXV0aGAgb3IgYGdldEF1dGhgIGJlZm9yZSAnICtcbiAgICAgICdzdGFydGluZyBhbnkgb3RoZXIgRmlyZWJhc2UgU0RLLidcbiAgfSBhcyBFcnJvck1hcDxBdXRoRXJyb3JDb2RlPjtcbn1cblxuLyoqXG4gKiBBIHZlcmJvc2UgZXJyb3IgbWFwIHdpdGggZGV0YWlsZWQgZGVzY3JpcHRpb25zIGZvciBtb3N0IGVycm9yIGNvZGVzLlxuICpcbiAqIFNlZSBkaXNjdXNzaW9uIGF0IHtAbGluayBBdXRoRXJyb3JNYXB9XG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgZGVidWdFcnJvck1hcDogQXV0aEVycm9yTWFwID0gX2RlYnVnRXJyb3JNYXA7XG5cbi8qKlxuICogQSBtaW5pbWFsIGVycm9yIG1hcCB3aXRoIGFsbCB2ZXJib3NlIGVycm9yIG1lc3NhZ2VzIHN0cmlwcGVkLlxuICpcbiAqIFNlZSBkaXNjdXNzaW9uIGF0IHtAbGluayBBdXRoRXJyb3JNYXB9XG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgcHJvZEVycm9yTWFwOiBBdXRoRXJyb3JNYXAgPSBfcHJvZEVycm9yTWFwO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5hbWVkRXJyb3JQYXJhbXMge1xuICBhcHBOYW1lOiBBcHBOYW1lO1xuICBjcmVkZW50aWFsPzogQXV0aENyZWRlbnRpYWw7XG4gIGVtYWlsPzogc3RyaW5nO1xuICBwaG9uZU51bWJlcj86IHN0cmluZztcbiAgdGVuYW50SWQ/OiBzdHJpbmc7XG4gIHVzZXI/OiBVc2VyO1xuICBfc2VydmVyUmVzcG9uc2U/OiBvYmplY3Q7XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbnR5cGUgR2VuZXJpY0F1dGhFcnJvclBhcmFtcyA9IHtcbiAgW2tleSBpbiBFeGNsdWRlPFxuICAgIEF1dGhFcnJvckNvZGUsXG4gICAgfCBBdXRoRXJyb3JDb2RlLkFSR1VNRU5UX0VSUk9SXG4gICAgfCBBdXRoRXJyb3JDb2RlLkRFUEVOREVOVF9TREtfSU5JVF9CRUZPUkVfQVVUSFxuICAgIHwgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUlxuICAgIHwgQXV0aEVycm9yQ29kZS5NRkFfUkVRVUlSRURcbiAgICB8IEF1dGhFcnJvckNvZGUuTk9fQVVUSF9FVkVOVFxuICAgIHwgQXV0aEVycm9yQ29kZS5PUEVSQVRJT05fTk9UX1NVUFBPUlRFRFxuICA+XToge1xuICAgIGFwcE5hbWU/OiBBcHBOYW1lO1xuICAgIGVtYWlsPzogc3RyaW5nO1xuICAgIHBob25lTnVtYmVyPzogc3RyaW5nO1xuICAgIG1lc3NhZ2U/OiBzdHJpbmc7XG4gIH07XG59O1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhFcnJvclBhcmFtcyBleHRlbmRzIEdlbmVyaWNBdXRoRXJyb3JQYXJhbXMge1xuICBbQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUl06IHsgYXBwTmFtZT86IEFwcE5hbWUgfTtcbiAgW0F1dGhFcnJvckNvZGUuREVQRU5ERU5UX1NES19JTklUX0JFRk9SRV9BVVRIXTogeyBhcHBOYW1lPzogQXBwTmFtZSB9O1xuICBbQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUl06IHsgYXBwTmFtZT86IEFwcE5hbWUgfTtcbiAgW0F1dGhFcnJvckNvZGUuTE9HSU5fQkxPQ0tFRF06IHtcbiAgICBhcHBOYW1lPzogQXBwTmFtZTtcbiAgICBvcmlnaW5hbE1lc3NhZ2U/OiBzdHJpbmc7XG4gIH07XG4gIFtBdXRoRXJyb3JDb2RlLk9QRVJBVElPTl9OT1RfU1VQUE9SVEVEXTogeyBhcHBOYW1lPzogQXBwTmFtZSB9O1xuICBbQXV0aEVycm9yQ29kZS5OT19BVVRIX0VWRU5UXTogeyBhcHBOYW1lPzogQXBwTmFtZSB9O1xuICBbQXV0aEVycm9yQ29kZS5NRkFfUkVRVUlSRURdOiB7XG4gICAgYXBwTmFtZTogQXBwTmFtZTtcbiAgICBfc2VydmVyUmVzcG9uc2U6IElkVG9rZW5NZmFSZXNwb25zZTtcbiAgfTtcbiAgW0F1dGhFcnJvckNvZGUuSU5WQUxJRF9DT1JET1ZBX0NPTkZJR1VSQVRJT05dOiB7XG4gICAgYXBwTmFtZTogQXBwTmFtZTtcbiAgICBtaXNzaW5nUGx1Z2luPzogc3RyaW5nO1xuICB9O1xufVxuXG5leHBvcnQgY29uc3QgX0RFRkFVTFRfQVVUSF9FUlJPUl9GQUNUT1JZID0gbmV3IEVycm9yRmFjdG9yeTxcbiAgQXV0aEVycm9yQ29kZSxcbiAgQXV0aEVycm9yUGFyYW1zXG4+KCdhdXRoJywgJ0ZpcmViYXNlJywgX3Byb2RFcnJvck1hcCgpKTtcblxuLyoqXG4gKiBBIG1hcCBvZiBwb3RlbnRpYWwgYEF1dGhgIGVycm9yIGNvZGVzLCBmb3IgZWFzaWVyIGNvbXBhcmlzb24gd2l0aCBlcnJvcnNcbiAqIHRocm93biBieSB0aGUgU0RLLlxuICpcbiAqIEByZW1hcmtzXG4gKiBOb3RlIHRoYXQgeW91IGNhbid0IHRyZWUtc2hha2UgaW5kaXZpZHVhbCBrZXlzXG4gKiBpbiB0aGUgbWFwLCBzbyBieSB1c2luZyB0aGUgbWFwIHlvdSBtaWdodCBzdWJzdGFudGlhbGx5IGluY3JlYXNlIHlvdXJcbiAqIGJ1bmRsZSBzaXplLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IEFVVEhfRVJST1JfQ09ERVNfTUFQX0RPX05PVF9VU0VfSU5URVJOQUxMWSA9IHtcbiAgQURNSU5fT05MWV9PUEVSQVRJT046ICdhdXRoL2FkbWluLXJlc3RyaWN0ZWQtb3BlcmF0aW9uJyxcbiAgQVJHVU1FTlRfRVJST1I6ICdhdXRoL2FyZ3VtZW50LWVycm9yJyxcbiAgQVBQX05PVF9BVVRIT1JJWkVEOiAnYXV0aC9hcHAtbm90LWF1dGhvcml6ZWQnLFxuICBBUFBfTk9UX0lOU1RBTExFRDogJ2F1dGgvYXBwLW5vdC1pbnN0YWxsZWQnLFxuICBDQVBUQ0hBX0NIRUNLX0ZBSUxFRDogJ2F1dGgvY2FwdGNoYS1jaGVjay1mYWlsZWQnLFxuICBDT0RFX0VYUElSRUQ6ICdhdXRoL2NvZGUtZXhwaXJlZCcsXG4gIENPUkRPVkFfTk9UX1JFQURZOiAnYXV0aC9jb3Jkb3ZhLW5vdC1yZWFkeScsXG4gIENPUlNfVU5TVVBQT1JURUQ6ICdhdXRoL2NvcnMtdW5zdXBwb3J0ZWQnLFxuICBDUkVERU5USUFMX0FMUkVBRFlfSU5fVVNFOiAnYXV0aC9jcmVkZW50aWFsLWFscmVhZHktaW4tdXNlJyxcbiAgQ1JFREVOVElBTF9NSVNNQVRDSDogJ2F1dGgvY3VzdG9tLXRva2VuLW1pc21hdGNoJyxcbiAgQ1JFREVOVElBTF9UT09fT0xEX0xPR0lOX0FHQUlOOiAnYXV0aC9yZXF1aXJlcy1yZWNlbnQtbG9naW4nLFxuICBERVBFTkRFTlRfU0RLX0lOSVRfQkVGT1JFX0FVVEg6ICdhdXRoL2RlcGVuZGVudC1zZGstaW5pdGlhbGl6ZWQtYmVmb3JlLWF1dGgnLFxuICBEWU5BTUlDX0xJTktfTk9UX0FDVElWQVRFRDogJ2F1dGgvZHluYW1pYy1saW5rLW5vdC1hY3RpdmF0ZWQnLFxuICBFTUFJTF9DSEFOR0VfTkVFRFNfVkVSSUZJQ0FUSU9OOiAnYXV0aC9lbWFpbC1jaGFuZ2UtbmVlZHMtdmVyaWZpY2F0aW9uJyxcbiAgRU1BSUxfRVhJU1RTOiAnYXV0aC9lbWFpbC1hbHJlYWR5LWluLXVzZScsXG4gIEVNVUxBVE9SX0NPTkZJR19GQUlMRUQ6ICdhdXRoL2VtdWxhdG9yLWNvbmZpZy1mYWlsZWQnLFxuICBFWFBJUkVEX09PQl9DT0RFOiAnYXV0aC9leHBpcmVkLWFjdGlvbi1jb2RlJyxcbiAgRVhQSVJFRF9QT1BVUF9SRVFVRVNUOiAnYXV0aC9jYW5jZWxsZWQtcG9wdXAtcmVxdWVzdCcsXG4gIElOVEVSTkFMX0VSUk9SOiAnYXV0aC9pbnRlcm5hbC1lcnJvcicsXG4gIElOVkFMSURfQVBJX0tFWTogJ2F1dGgvaW52YWxpZC1hcGkta2V5JyxcbiAgSU5WQUxJRF9BUFBfQ1JFREVOVElBTDogJ2F1dGgvaW52YWxpZC1hcHAtY3JlZGVudGlhbCcsXG4gIElOVkFMSURfQVBQX0lEOiAnYXV0aC9pbnZhbGlkLWFwcC1pZCcsXG4gIElOVkFMSURfQVVUSDogJ2F1dGgvaW52YWxpZC11c2VyLXRva2VuJyxcbiAgSU5WQUxJRF9BVVRIX0VWRU5UOiAnYXV0aC9pbnZhbGlkLWF1dGgtZXZlbnQnLFxuICBJTlZBTElEX0NFUlRfSEFTSDogJ2F1dGgvaW52YWxpZC1jZXJ0LWhhc2gnLFxuICBJTlZBTElEX0NPREU6ICdhdXRoL2ludmFsaWQtdmVyaWZpY2F0aW9uLWNvZGUnLFxuICBJTlZBTElEX0NPTlRJTlVFX1VSSTogJ2F1dGgvaW52YWxpZC1jb250aW51ZS11cmknLFxuICBJTlZBTElEX0NPUkRPVkFfQ09ORklHVVJBVElPTjogJ2F1dGgvaW52YWxpZC1jb3Jkb3ZhLWNvbmZpZ3VyYXRpb24nLFxuICBJTlZBTElEX0NVU1RPTV9UT0tFTjogJ2F1dGgvaW52YWxpZC1jdXN0b20tdG9rZW4nLFxuICBJTlZBTElEX0RZTkFNSUNfTElOS19ET01BSU46ICdhdXRoL2ludmFsaWQtZHluYW1pYy1saW5rLWRvbWFpbicsXG4gIElOVkFMSURfRU1BSUw6ICdhdXRoL2ludmFsaWQtZW1haWwnLFxuICBJTlZBTElEX0VNVUxBVE9SX1NDSEVNRTogJ2F1dGgvaW52YWxpZC1lbXVsYXRvci1zY2hlbWUnLFxuICBJTlZBTElEX0lEUF9SRVNQT05TRTogJ2F1dGgvaW52YWxpZC1jcmVkZW50aWFsJyxcbiAgSU5WQUxJRF9NRVNTQUdFX1BBWUxPQUQ6ICdhdXRoL2ludmFsaWQtbWVzc2FnZS1wYXlsb2FkJyxcbiAgSU5WQUxJRF9NRkFfU0VTU0lPTjogJ2F1dGgvaW52YWxpZC1tdWx0aS1mYWN0b3Itc2Vzc2lvbicsXG4gIElOVkFMSURfT0FVVEhfQ0xJRU5UX0lEOiAnYXV0aC9pbnZhbGlkLW9hdXRoLWNsaWVudC1pZCcsXG4gIElOVkFMSURfT0FVVEhfUFJPVklERVI6ICdhdXRoL2ludmFsaWQtb2F1dGgtcHJvdmlkZXInLFxuICBJTlZBTElEX09PQl9DT0RFOiAnYXV0aC9pbnZhbGlkLWFjdGlvbi1jb2RlJyxcbiAgSU5WQUxJRF9PUklHSU46ICdhdXRoL3VuYXV0aG9yaXplZC1kb21haW4nLFxuICBJTlZBTElEX1BBU1NXT1JEOiAnYXV0aC93cm9uZy1wYXNzd29yZCcsXG4gIElOVkFMSURfUEVSU0lTVEVOQ0U6ICdhdXRoL2ludmFsaWQtcGVyc2lzdGVuY2UtdHlwZScsXG4gIElOVkFMSURfUEhPTkVfTlVNQkVSOiAnYXV0aC9pbnZhbGlkLXBob25lLW51bWJlcicsXG4gIElOVkFMSURfUFJPVklERVJfSUQ6ICdhdXRoL2ludmFsaWQtcHJvdmlkZXItaWQnLFxuICBJTlZBTElEX1JFQ0lQSUVOVF9FTUFJTDogJ2F1dGgvaW52YWxpZC1yZWNpcGllbnQtZW1haWwnLFxuICBJTlZBTElEX1NFTkRFUjogJ2F1dGgvaW52YWxpZC1zZW5kZXInLFxuICBJTlZBTElEX1NFU1NJT05fSU5GTzogJ2F1dGgvaW52YWxpZC12ZXJpZmljYXRpb24taWQnLFxuICBJTlZBTElEX1RFTkFOVF9JRDogJ2F1dGgvaW52YWxpZC10ZW5hbnQtaWQnLFxuICBNRkFfSU5GT19OT1RfRk9VTkQ6ICdhdXRoL211bHRpLWZhY3Rvci1pbmZvLW5vdC1mb3VuZCcsXG4gIE1GQV9SRVFVSVJFRDogJ2F1dGgvbXVsdGktZmFjdG9yLWF1dGgtcmVxdWlyZWQnLFxuICBNSVNTSU5HX0FORFJPSURfUEFDS0FHRV9OQU1FOiAnYXV0aC9taXNzaW5nLWFuZHJvaWQtcGtnLW5hbWUnLFxuICBNSVNTSU5HX0FQUF9DUkVERU5USUFMOiAnYXV0aC9taXNzaW5nLWFwcC1jcmVkZW50aWFsJyxcbiAgTUlTU0lOR19BVVRIX0RPTUFJTjogJ2F1dGgvYXV0aC1kb21haW4tY29uZmlnLXJlcXVpcmVkJyxcbiAgTUlTU0lOR19DT0RFOiAnYXV0aC9taXNzaW5nLXZlcmlmaWNhdGlvbi1jb2RlJyxcbiAgTUlTU0lOR19DT05USU5VRV9VUkk6ICdhdXRoL21pc3NpbmctY29udGludWUtdXJpJyxcbiAgTUlTU0lOR19JRlJBTUVfU1RBUlQ6ICdhdXRoL21pc3NpbmctaWZyYW1lLXN0YXJ0JyxcbiAgTUlTU0lOR19JT1NfQlVORExFX0lEOiAnYXV0aC9taXNzaW5nLWlvcy1idW5kbGUtaWQnLFxuICBNSVNTSU5HX09SX0lOVkFMSURfTk9OQ0U6ICdhdXRoL21pc3Npbmctb3ItaW52YWxpZC1ub25jZScsXG4gIE1JU1NJTkdfTUZBX0lORk86ICdhdXRoL21pc3NpbmctbXVsdGktZmFjdG9yLWluZm8nLFxuICBNSVNTSU5HX01GQV9TRVNTSU9OOiAnYXV0aC9taXNzaW5nLW11bHRpLWZhY3Rvci1zZXNzaW9uJyxcbiAgTUlTU0lOR19QSE9ORV9OVU1CRVI6ICdhdXRoL21pc3NpbmctcGhvbmUtbnVtYmVyJyxcbiAgTUlTU0lOR19TRVNTSU9OX0lORk86ICdhdXRoL21pc3NpbmctdmVyaWZpY2F0aW9uLWlkJyxcbiAgTU9EVUxFX0RFU1RST1lFRDogJ2F1dGgvYXBwLWRlbGV0ZWQnLFxuICBORUVEX0NPTkZJUk1BVElPTjogJ2F1dGgvYWNjb3VudC1leGlzdHMtd2l0aC1kaWZmZXJlbnQtY3JlZGVudGlhbCcsXG4gIE5FVFdPUktfUkVRVUVTVF9GQUlMRUQ6ICdhdXRoL25ldHdvcmstcmVxdWVzdC1mYWlsZWQnLFxuICBOVUxMX1VTRVI6ICdhdXRoL251bGwtdXNlcicsXG4gIE5PX0FVVEhfRVZFTlQ6ICdhdXRoL25vLWF1dGgtZXZlbnQnLFxuICBOT19TVUNIX1BST1ZJREVSOiAnYXV0aC9uby1zdWNoLXByb3ZpZGVyJyxcbiAgT1BFUkFUSU9OX05PVF9BTExPV0VEOiAnYXV0aC9vcGVyYXRpb24tbm90LWFsbG93ZWQnLFxuICBPUEVSQVRJT05fTk9UX1NVUFBPUlRFRDogJ2F1dGgvb3BlcmF0aW9uLW5vdC1zdXBwb3J0ZWQtaW4tdGhpcy1lbnZpcm9ubWVudCcsXG4gIFBPUFVQX0JMT0NLRUQ6ICdhdXRoL3BvcHVwLWJsb2NrZWQnLFxuICBQT1BVUF9DTE9TRURfQllfVVNFUjogJ2F1dGgvcG9wdXAtY2xvc2VkLWJ5LXVzZXInLFxuICBQUk9WSURFUl9BTFJFQURZX0xJTktFRDogJ2F1dGgvcHJvdmlkZXItYWxyZWFkeS1saW5rZWQnLFxuICBRVU9UQV9FWENFRURFRDogJ2F1dGgvcXVvdGEtZXhjZWVkZWQnLFxuICBSRURJUkVDVF9DQU5DRUxMRURfQllfVVNFUjogJ2F1dGgvcmVkaXJlY3QtY2FuY2VsbGVkLWJ5LXVzZXInLFxuICBSRURJUkVDVF9PUEVSQVRJT05fUEVORElORzogJ2F1dGgvcmVkaXJlY3Qtb3BlcmF0aW9uLXBlbmRpbmcnLFxuICBSRUpFQ1RFRF9DUkVERU5USUFMOiAnYXV0aC9yZWplY3RlZC1jcmVkZW50aWFsJyxcbiAgU0VDT05EX0ZBQ1RPUl9BTFJFQURZX0VOUk9MTEVEOiAnYXV0aC9zZWNvbmQtZmFjdG9yLWFscmVhZHktaW4tdXNlJyxcbiAgU0VDT05EX0ZBQ1RPUl9MSU1JVF9FWENFRURFRDogJ2F1dGgvbWF4aW11bS1zZWNvbmQtZmFjdG9yLWNvdW50LWV4Y2VlZGVkJyxcbiAgVEVOQU5UX0lEX01JU01BVENIOiAnYXV0aC90ZW5hbnQtaWQtbWlzbWF0Y2gnLFxuICBUSU1FT1VUOiAnYXV0aC90aW1lb3V0JyxcbiAgVE9LRU5fRVhQSVJFRDogJ2F1dGgvdXNlci10b2tlbi1leHBpcmVkJyxcbiAgVE9PX01BTllfQVRURU1QVFNfVFJZX0xBVEVSOiAnYXV0aC90b28tbWFueS1yZXF1ZXN0cycsXG4gIFVOQVVUSE9SSVpFRF9ET01BSU46ICdhdXRoL3VuYXV0aG9yaXplZC1jb250aW51ZS11cmknLFxuICBVTlNVUFBPUlRFRF9GSVJTVF9GQUNUT1I6ICdhdXRoL3Vuc3VwcG9ydGVkLWZpcnN0LWZhY3RvcicsXG4gIFVOU1VQUE9SVEVEX1BFUlNJU1RFTkNFOiAnYXV0aC91bnN1cHBvcnRlZC1wZXJzaXN0ZW5jZS10eXBlJyxcbiAgVU5TVVBQT1JURURfVEVOQU5UX09QRVJBVElPTjogJ2F1dGgvdW5zdXBwb3J0ZWQtdGVuYW50LW9wZXJhdGlvbicsXG4gIFVOVkVSSUZJRURfRU1BSUw6ICdhdXRoL3VudmVyaWZpZWQtZW1haWwnLFxuICBVU0VSX0NBTkNFTExFRDogJ2F1dGgvdXNlci1jYW5jZWxsZWQnLFxuICBVU0VSX0RFTEVURUQ6ICdhdXRoL3VzZXItbm90LWZvdW5kJyxcbiAgVVNFUl9ESVNBQkxFRDogJ2F1dGgvdXNlci1kaXNhYmxlZCcsXG4gIFVTRVJfTUlTTUFUQ0g6ICdhdXRoL3VzZXItbWlzbWF0Y2gnLFxuICBVU0VSX1NJR05FRF9PVVQ6ICdhdXRoL3VzZXItc2lnbmVkLW91dCcsXG4gIFdFQUtfUEFTU1dPUkQ6ICdhdXRoL3dlYWstcGFzc3dvcmQnLFxuICBXRUJfU1RPUkFHRV9VTlNVUFBPUlRFRDogJ2F1dGgvd2ViLXN0b3JhZ2UtdW5zdXBwb3J0ZWQnLFxuICBBTFJFQURZX0lOSVRJQUxJWkVEOiAnYXV0aC9hbHJlYWR5LWluaXRpYWxpemVkJyxcbiAgUkVDQVBUQ0hBX05PVF9FTkFCTEVEOiAnYXV0aC9yZWNhcHRjaGEtbm90LWVuYWJsZWQnLFxuICBNSVNTSU5HX1JFQ0FQVENIQV9UT0tFTjogJ2F1dGgvbWlzc2luZy1yZWNhcHRjaGEtdG9rZW4nLFxuICBJTlZBTElEX1JFQ0FQVENIQV9UT0tFTjogJ2F1dGgvaW52YWxpZC1yZWNhcHRjaGEtdG9rZW4nLFxuICBJTlZBTElEX1JFQ0FQVENIQV9BQ1RJT046ICdhdXRoL2ludmFsaWQtcmVjYXB0Y2hhLWFjdGlvbicsXG4gIE1JU1NJTkdfQ0xJRU5UX1RZUEU6ICdhdXRoL21pc3NpbmctY2xpZW50LXR5cGUnLFxuICBNSVNTSU5HX1JFQ0FQVENIQV9WRVJTSU9OOiAnYXV0aC9taXNzaW5nLXJlY2FwdGNoYS12ZXJzaW9uJyxcbiAgSU5WQUxJRF9SRUNBUFRDSEFfVkVSU0lPTjogJ2F1dGgvaW52YWxpZC1yZWNhcHRjaGEtdmVyc2lvbicsXG4gIElOVkFMSURfUkVRX1RZUEU6ICdhdXRoL2ludmFsaWQtcmVxLXR5cGUnXG59IGFzIGNvbnN0O1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IExvZ2dlciwgTG9nTGV2ZWwgfSBmcm9tICdAZmlyZWJhc2UvbG9nZ2VyJztcbmltcG9ydCB7IFNES19WRVJTSU9OIH0gZnJvbSAnQGZpcmViYXNlL2FwcCc7XG5cbmV4cG9ydCB7IExvZ0xldmVsIH07XG5cbmNvbnN0IGxvZ0NsaWVudCA9IG5ldyBMb2dnZXIoJ0BmaXJlYmFzZS9hdXRoJyk7XG5cbi8vIEhlbHBlciBtZXRob2RzIGFyZSBuZWVkZWQgYmVjYXVzZSB2YXJpYWJsZXMgY2FuJ3QgYmUgZXhwb3J0ZWQgYXMgcmVhZC93cml0ZVxuZXhwb3J0IGZ1bmN0aW9uIF9nZXRMb2dMZXZlbCgpOiBMb2dMZXZlbCB7XG4gIHJldHVybiBsb2dDbGllbnQubG9nTGV2ZWw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfc2V0TG9nTGV2ZWwobmV3TGV2ZWw6IExvZ0xldmVsKTogdm9pZCB7XG4gIGxvZ0NsaWVudC5sb2dMZXZlbCA9IG5ld0xldmVsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX2xvZ0RlYnVnKG1zZzogc3RyaW5nLCAuLi5hcmdzOiBzdHJpbmdbXSk6IHZvaWQge1xuICBpZiAobG9nQ2xpZW50LmxvZ0xldmVsIDw9IExvZ0xldmVsLkRFQlVHKSB7XG4gICAgbG9nQ2xpZW50LmRlYnVnKGBBdXRoICgke1NES19WRVJTSU9OfSk6ICR7bXNnfWAsIC4uLmFyZ3MpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfbG9nV2Fybihtc2c6IHN0cmluZywgLi4uYXJnczogc3RyaW5nW10pOiB2b2lkIHtcbiAgaWYgKGxvZ0NsaWVudC5sb2dMZXZlbCA8PSBMb2dMZXZlbC5XQVJOKSB7XG4gICAgbG9nQ2xpZW50Lndhcm4oYEF1dGggKCR7U0RLX1ZFUlNJT059KTogJHttc2d9YCwgLi4uYXJncyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9sb2dFcnJvcihtc2c6IHN0cmluZywgLi4uYXJnczogc3RyaW5nW10pOiB2b2lkIHtcbiAgaWYgKGxvZ0NsaWVudC5sb2dMZXZlbCA8PSBMb2dMZXZlbC5FUlJPUikge1xuICAgIGxvZ0NsaWVudC5lcnJvcihgQXV0aCAoJHtTREtfVkVSU0lPTn0pOiAke21zZ31gLCAuLi5hcmdzKTtcbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEF1dGggfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuaW1wb3J0IHsgRXJyb3JGYWN0b3J5LCBGaXJlYmFzZUVycm9yIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuaW1wb3J0IHsgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXV0aCc7XG5pbXBvcnQge1xuICBfREVGQVVMVF9BVVRIX0VSUk9SX0ZBQ1RPUlksXG4gIEF1dGhFcnJvckNvZGUsXG4gIEF1dGhFcnJvclBhcmFtcyxcbiAgcHJvZEVycm9yTWFwLFxuICBFcnJvck1hcFJldHJpZXZlclxufSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgX2xvZ0Vycm9yIH0gZnJvbSAnLi9sb2cnO1xuXG50eXBlIEF1dGhFcnJvckxpc3RQYXJhbXM8Sz4gPSBLIGV4dGVuZHMga2V5b2YgQXV0aEVycm9yUGFyYW1zXG4gID8gW0F1dGhFcnJvclBhcmFtc1tLXV1cbiAgOiBbXTtcbnR5cGUgTGVzc0FwcE5hbWU8SyBleHRlbmRzIEF1dGhFcnJvckNvZGU+ID0gT21pdDxBdXRoRXJyb3JQYXJhbXNbS10sICdhcHBOYW1lJz47XG5cbi8qKlxuICogVW5jb25kaXRpb25hbGx5IGZhaWxzLCB0aHJvd2luZyBhIGRldmVsb3BlciBmYWNpbmcgSU5URVJOQUxfRVJST1JcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgamF2YXNjcmlwdFxuICogZmFpbChhdXRoLCBBdXRoRXJyb3JDb2RlLk1GQV9SRVFVSVJFRCk7ICAvLyBFcnJvcjogdGhlIE1GQV9SRVFVSVJFRCBlcnJvciBuZWVkcyBtb3JlIHBhcmFtcyB0aGFuIGFwcE5hbWVcbiAqIGZhaWwoYXV0aCwgQXV0aEVycm9yQ29kZS5NRkFfUkVRVUlSRUQsIHtzZXJ2ZXJSZXNwb25zZX0pOyAgLy8gQ29tcGlsZXNcbiAqIGZhaWwoQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7ICAvLyBDb21waWxlczsgaW50ZXJuYWwgZXJyb3IgZG9lcyBub3QgbmVlZCBhcHBOYW1lXG4gKiBmYWlsKEF1dGhFcnJvckNvZGUuVVNFUl9ERUxFVEVEKTsgIC8vIEVycm9yOiBVU0VSX0RFTEVURUQgcmVxdWlyZXMgYXBwIG5hbWVcbiAqIGZhaWwoYXV0aCwgQXV0aEVycm9yQ29kZS5VU0VSX0RFTEVURUQpOyAgLy8gQ29tcGlsZXM7IFVTRVJfREVMRVRFRCBfb25seV8gbmVlZHMgYXBwIG5hbWVcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhcHBOYW1lIEFwcCBuYW1lIGZvciB0YWdnaW5nIHRoZSBlcnJvclxuICogQHRocm93cyBGaXJlYmFzZUVycm9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfZmFpbDxLIGV4dGVuZHMgQXV0aEVycm9yQ29kZT4oXG4gIGNvZGU6IEssXG4gIC4uLmRhdGE6IHt9IGV4dGVuZHMgQXV0aEVycm9yUGFyYW1zW0tdXG4gICAgPyBbQXV0aEVycm9yUGFyYW1zW0tdP11cbiAgICA6IFtBdXRoRXJyb3JQYXJhbXNbS11dXG4pOiBuZXZlcjtcbmV4cG9ydCBmdW5jdGlvbiBfZmFpbDxLIGV4dGVuZHMgQXV0aEVycm9yQ29kZT4oXG4gIGF1dGg6IEF1dGgsXG4gIGNvZGU6IEssXG4gIC4uLmRhdGE6IHt9IGV4dGVuZHMgTGVzc0FwcE5hbWU8Sz4gPyBbTGVzc0FwcE5hbWU8Sz4/XSA6IFtMZXNzQXBwTmFtZTxLPl1cbik6IG5ldmVyO1xuZXhwb3J0IGZ1bmN0aW9uIF9mYWlsPEsgZXh0ZW5kcyBBdXRoRXJyb3JDb2RlPihcbiAgYXV0aE9yQ29kZTogQXV0aCB8IEssXG4gIC4uLnJlc3Q6IHVua25vd25bXVxuKTogbmV2ZXIge1xuICB0aHJvdyBjcmVhdGVFcnJvckludGVybmFsKGF1dGhPckNvZGUsIC4uLnJlc3QpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX2NyZWF0ZUVycm9yPEsgZXh0ZW5kcyBBdXRoRXJyb3JDb2RlPihcbiAgY29kZTogSyxcbiAgLi4uZGF0YToge30gZXh0ZW5kcyBBdXRoRXJyb3JQYXJhbXNbS11cbiAgICA/IFtBdXRoRXJyb3JQYXJhbXNbS10/XVxuICAgIDogW0F1dGhFcnJvclBhcmFtc1tLXV1cbik6IEZpcmViYXNlRXJyb3I7XG5leHBvcnQgZnVuY3Rpb24gX2NyZWF0ZUVycm9yPEsgZXh0ZW5kcyBBdXRoRXJyb3JDb2RlPihcbiAgYXV0aDogQXV0aCxcbiAgY29kZTogSyxcbiAgLi4uZGF0YToge30gZXh0ZW5kcyBMZXNzQXBwTmFtZTxLPiA/IFtMZXNzQXBwTmFtZTxLPj9dIDogW0xlc3NBcHBOYW1lPEs+XVxuKTogRmlyZWJhc2VFcnJvcjtcbmV4cG9ydCBmdW5jdGlvbiBfY3JlYXRlRXJyb3I8SyBleHRlbmRzIEF1dGhFcnJvckNvZGU+KFxuICBhdXRoT3JDb2RlOiBBdXRoIHwgSyxcbiAgLi4ucmVzdDogdW5rbm93bltdXG4pOiBGaXJlYmFzZUVycm9yIHtcbiAgcmV0dXJuIGNyZWF0ZUVycm9ySW50ZXJuYWwoYXV0aE9yQ29kZSwgLi4ucmVzdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfZXJyb3JXaXRoQ3VzdG9tTWVzc2FnZShcbiAgYXV0aDogQXV0aCxcbiAgY29kZTogQXV0aEVycm9yQ29kZSxcbiAgbWVzc2FnZTogc3RyaW5nXG4pOiBGaXJlYmFzZUVycm9yIHtcbiAgY29uc3QgZXJyb3JNYXAgPSB7XG4gICAgLi4uKHByb2RFcnJvck1hcCBhcyBFcnJvck1hcFJldHJpZXZlcikoKSxcbiAgICBbY29kZV06IG1lc3NhZ2VcbiAgfTtcbiAgY29uc3QgZmFjdG9yeSA9IG5ldyBFcnJvckZhY3Rvcnk8QXV0aEVycm9yQ29kZSwgQXV0aEVycm9yUGFyYW1zPihcbiAgICAnYXV0aCcsXG4gICAgJ0ZpcmViYXNlJyxcbiAgICBlcnJvck1hcFxuICApO1xuICByZXR1cm4gZmFjdG9yeS5jcmVhdGUoY29kZSwge1xuICAgIGFwcE5hbWU6IGF1dGgubmFtZVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9hc3NlcnRJbnN0YW5jZU9mKFxuICBhdXRoOiBBdXRoLFxuICBvYmplY3Q6IG9iamVjdCxcbiAgaW5zdGFuY2U6IHVua25vd25cbik6IHZvaWQge1xuICBjb25zdCBjb25zdHJ1Y3Rvckluc3RhbmNlID0gaW5zdGFuY2UgYXMgeyBuZXcgKC4uLmFyZ3M6IHVua25vd25bXSk6IHVua25vd24gfTtcbiAgaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgY29uc3RydWN0b3JJbnN0YW5jZSkpIHtcbiAgICBpZiAoY29uc3RydWN0b3JJbnN0YW5jZS5uYW1lICE9PSBvYmplY3QuY29uc3RydWN0b3IubmFtZSkge1xuICAgICAgX2ZhaWwoYXV0aCwgQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUik7XG4gICAgfVxuXG4gICAgdGhyb3cgX2Vycm9yV2l0aEN1c3RvbU1lc3NhZ2UoXG4gICAgICBhdXRoLFxuICAgICAgQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUixcbiAgICAgIGBUeXBlIG9mICR7b2JqZWN0LmNvbnN0cnVjdG9yLm5hbWV9IGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkIGluc3RhbmNlLmAgK1xuICAgICAgICBgRGlkIHlvdSBwYXNzIGEgcmVmZXJlbmNlIGZyb20gYSBkaWZmZXJlbnQgQXV0aCBTREs/YFxuICAgICk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlRXJyb3JJbnRlcm5hbDxLIGV4dGVuZHMgQXV0aEVycm9yQ29kZT4oXG4gIGF1dGhPckNvZGU6IEF1dGggfCBLLFxuICAuLi5yZXN0OiB1bmtub3duW11cbik6IEZpcmViYXNlRXJyb3Ige1xuICBpZiAodHlwZW9mIGF1dGhPckNvZGUgIT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgY29kZSA9IHJlc3RbMF0gYXMgSztcbiAgICBjb25zdCBmdWxsUGFyYW1zID0gWy4uLnJlc3Quc2xpY2UoMSldIGFzIEF1dGhFcnJvckxpc3RQYXJhbXM8Sz47XG4gICAgaWYgKGZ1bGxQYXJhbXNbMF0pIHtcbiAgICAgIGZ1bGxQYXJhbXNbMF0uYXBwTmFtZSA9IGF1dGhPckNvZGUubmFtZTtcbiAgICB9XG5cbiAgICByZXR1cm4gKGF1dGhPckNvZGUgYXMgQXV0aEludGVybmFsKS5fZXJyb3JGYWN0b3J5LmNyZWF0ZShcbiAgICAgIGNvZGUsXG4gICAgICAuLi5mdWxsUGFyYW1zXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBfREVGQVVMVF9BVVRIX0VSUk9SX0ZBQ1RPUlkuY3JlYXRlKFxuICAgIGF1dGhPckNvZGUsXG4gICAgLi4uKHJlc3QgYXMgQXV0aEVycm9yTGlzdFBhcmFtczxLPilcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9hc3NlcnQ8SyBleHRlbmRzIEF1dGhFcnJvckNvZGU+KFxuICBhc3NlcnRpb246IHVua25vd24sXG4gIGNvZGU6IEssXG4gIC4uLmRhdGE6IHt9IGV4dGVuZHMgQXV0aEVycm9yUGFyYW1zW0tdXG4gICAgPyBbQXV0aEVycm9yUGFyYW1zW0tdP11cbiAgICA6IFtBdXRoRXJyb3JQYXJhbXNbS11dXG4pOiBhc3NlcnRzIGFzc2VydGlvbjtcbmV4cG9ydCBmdW5jdGlvbiBfYXNzZXJ0PEsgZXh0ZW5kcyBBdXRoRXJyb3JDb2RlPihcbiAgYXNzZXJ0aW9uOiB1bmtub3duLFxuICBhdXRoOiBBdXRoLFxuICBjb2RlOiBLLFxuICAuLi5kYXRhOiB7fSBleHRlbmRzIExlc3NBcHBOYW1lPEs+ID8gW0xlc3NBcHBOYW1lPEs+P10gOiBbTGVzc0FwcE5hbWU8Sz5dXG4pOiBhc3NlcnRzIGFzc2VydGlvbjtcbmV4cG9ydCBmdW5jdGlvbiBfYXNzZXJ0PEsgZXh0ZW5kcyBBdXRoRXJyb3JDb2RlPihcbiAgYXNzZXJ0aW9uOiB1bmtub3duLFxuICBhdXRoT3JDb2RlOiBBdXRoIHwgSyxcbiAgLi4ucmVzdDogdW5rbm93bltdXG4pOiBhc3NlcnRzIGFzc2VydGlvbiB7XG4gIGlmICghYXNzZXJ0aW9uKSB7XG4gICAgdGhyb3cgY3JlYXRlRXJyb3JJbnRlcm5hbChhdXRoT3JDb2RlLCAuLi5yZXN0KTtcbiAgfVxufVxuXG4vLyBXZSByZWFsbHkgZG8gd2FudCB0byBhY2NlcHQgbGl0ZXJhbGx5IGFueSBmdW5jdGlvbiB0eXBlIGhlcmVcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXG50eXBlIFR5cGVFeHBlY3RhdGlvbiA9IEZ1bmN0aW9uIHwgc3RyaW5nIHwgTWFwVHlwZTtcblxuaW50ZXJmYWNlIE1hcFR5cGUgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBUeXBlRXhwZWN0YXRpb24gfCBPcHRpb25hbD4ge31cblxuY2xhc3MgT3B0aW9uYWwge1xuICBjb25zdHJ1Y3RvcihyZWFkb25seSB0eXBlOiBUeXBlRXhwZWN0YXRpb24pIHt9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvcHQodHlwZTogVHlwZUV4cGVjdGF0aW9uKTogT3B0aW9uYWwge1xuICByZXR1cm4gbmV3IE9wdGlvbmFsKHR5cGUpO1xufVxuXG4vKipcbiAqIEFzc2VydHMgdGhlIHJ1bnRpbWUgdHlwZXMgb2YgYXJndW1lbnRzLiBUaGUgJ2V4cGVjdGVkJyBmaWVsZCBjYW4gYmUgb25lIG9mXG4gKiBhIGNsYXNzLCBhIHN0cmluZyAocmVwcmVzZW50aW5nIGEgXCJ0eXBlb2ZcIiBjYWxsKSwgb3IgYSByZWNvcmQgbWFwIG9mIG5hbWVcbiAqIHRvIHR5cGUuIEZ1cnRoZXJtb3JlLCB0aGUgb3B0KCkgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gbWFyayBhIGZpZWxkIGFzXG4gKiBvcHRpb25hbC4gRm9yIGV4YW1wbGU6XG4gKlxuICogZnVuY3Rpb24gZm9vKGF1dGg6IEF1dGgsIHByb2ZpbGU6IHtkaXNwbGF5TmFtZT86IHN0cmluZ30sIHVwZGF0ZSA9IGZhbHNlKSB7XG4gKiAgIGFzc2VydFR5cGVzKGFyZ3VtZW50cywgW0F1dGhJbXBsLCB7ZGlzcGxheU5hbWU6IG9wdCgnc3RyaW5nJyl9LCBvcHQoJ2Jvb2xlYW4nKV0pO1xuICogfVxuICpcbiAqIG9wdCgpIGNhbiBiZSB1c2VkIGZvciBhbnkgdHlwZTpcbiAqIGZ1bmN0aW9uIGZvbyhhdXRoPzogQXV0aCkge1xuICogICBhc3NlcnRUeXBlcyhhcmd1bWVudHMsIFtvcHQoQXV0aEltcGwpXSk7XG4gKiB9XG4gKlxuICogVGhlIHN0cmluZyB0eXBlcyBjYW4gYmUgb3InZCB0b2dldGhlciwgYW5kIHlvdSBjYW4gdXNlIFwibnVsbFwiIGFzIHdlbGwgKG5vdGVcbiAqIHRoYXQgdHlwZW9mIG51bGwgPT09ICdvYmplY3QnOyB0aGlzIGlzIGFuIGVkZ2UgY2FzZSkuIEZvciBleGFtcGxlOlxuICpcbiAqIGZ1bmN0aW9uIGZvbyhwcm9maWxlOiB7ZGlzcGxheU5hbWU/OiBzdHJpbmcgfCBudWxsfSkge1xuICogICBhc3NlcnRUeXBlcyhhcmd1bWVudHMsIFt7ZGlzcGxheU5hbWU6IG9wdCgnc3RyaW5nfG51bGwnKX1dKTtcbiAqIH1cbiAqXG4gKiBAcGFyYW0gYXJnc1xuICogQHBhcmFtIGV4cGVjdGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUeXBlcyhcbiAgYXJnczogT21pdDxJQXJndW1lbnRzLCAnY2FsbGVlJz4sXG4gIC4uLmV4cGVjdGVkOiBBcnJheTxUeXBlRXhwZWN0YXRpb24gfCBPcHRpb25hbD5cbik6IHZvaWQge1xuICBpZiAoYXJncy5sZW5ndGggPiBleHBlY3RlZC5sZW5ndGgpIHtcbiAgICBfZmFpbChBdXRoRXJyb3JDb2RlLkFSR1VNRU5UX0VSUk9SLCB7fSk7XG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGV4cGVjdGVkLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IGV4cGVjdCA9IGV4cGVjdGVkW2ldO1xuICAgIGNvbnN0IGFyZyA9IGFyZ3NbaV07XG5cbiAgICBpZiAoZXhwZWN0IGluc3RhbmNlb2YgT3B0aW9uYWwpIHtcbiAgICAgIC8vIElmIHRoZSBhcmcgaXMgdW5kZWZpbmVkLCB0aGVuIGl0IG1hdGNoZXMgXCJvcHRpb25hbFwiIGFuZCB3ZSBjYW4gbW92ZSB0b1xuICAgICAgLy8gdGhlIG5leHQgYXJnXG4gICAgICBpZiAodHlwZW9mIGFyZyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBleHBlY3QgPSBleHBlY3QudHlwZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGV4cGVjdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIEhhbmRsZSB0aGUgZWRnZSBjYXNlIGZvciBudWxsIGJlY2F1c2UgdHlwZW9mIG51bGwgPT09ICdvYmplY3QnXG4gICAgICBpZiAoZXhwZWN0LmluY2x1ZGVzKCdudWxsJykgJiYgYXJnID09PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXF1aXJlZCA9IGV4cGVjdC5zcGxpdCgnfCcpO1xuICAgICAgX2Fzc2VydChyZXF1aXJlZC5pbmNsdWRlcyh0eXBlb2YgYXJnKSwgQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUiwge30pO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cGVjdCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNoZWNrIHJlY29yZCBhcmd1bWVudHNcbiAgICAgIGNvbnN0IHJlY29yZCA9IGFyZyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgIGNvbnN0IG1hcCA9IGV4cGVjdCBhcyBNYXBUeXBlO1xuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGV4cGVjdCk7XG5cbiAgICAgIGFzc2VydFR5cGVzKFxuICAgICAgICBrZXlzLm1hcChrID0+IHJlY29yZFtrXSksXG4gICAgICAgIC4uLmtleXMubWFwKGsgPT4gbWFwW2tdKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgX2Fzc2VydChhcmcgaW5zdGFuY2VvZiBleHBlY3QsIEF1dGhFcnJvckNvZGUuQVJHVU1FTlRfRVJST1IsIHt9KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBVbmNvbmRpdGlvbmFsbHkgZmFpbHMsIHRocm93aW5nIGFuIGludGVybmFsIGVycm9yIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UuXG4gKlxuICogQHBhcmFtIGZhaWx1cmUgdHlwZSBvZiBmYWlsdXJlIGVuY291bnRlcmVkXG4gKiBAdGhyb3dzIEVycm9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWJ1Z0ZhaWwoZmFpbHVyZTogc3RyaW5nKTogbmV2ZXIge1xuICAvLyBMb2cgdGhlIGZhaWx1cmUgaW4gYWRkaXRpb24gdG8gdGhyb3cgYW4gZXhjZXB0aW9uLCBqdXN0IGluIGNhc2UgdGhlXG4gIC8vIGV4Y2VwdGlvbiBpcyBzd2FsbG93ZWQuXG4gIGNvbnN0IG1lc3NhZ2UgPSBgSU5URVJOQUwgQVNTRVJUSU9OIEZBSUxFRDogYCArIGZhaWx1cmU7XG4gIF9sb2dFcnJvcihtZXNzYWdlKTtcblxuICAvLyBOT1RFOiBXZSBkb24ndCB1c2UgRmlyZWJhc2VFcnJvciBoZXJlIGJlY2F1c2UgdGhlc2UgYXJlIGludGVybmFsIGZhaWx1cmVzXG4gIC8vIHRoYXQgY2Fubm90IGJlIGhhbmRsZWQgYnkgdGhlIHVzZXIuIChBbHNvIGl0IHdvdWxkIGNyZWF0ZSBhIGNpcmN1bGFyXG4gIC8vIGRlcGVuZGVuY3kgYmV0d2VlbiB0aGUgZXJyb3IgYW5kIGFzc2VydCBtb2R1bGVzIHdoaWNoIGRvZXNuJ3Qgd29yay4pXG4gIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbn1cblxuLyoqXG4gKiBGYWlscyBpZiB0aGUgZ2l2ZW4gYXNzZXJ0aW9uIGNvbmRpdGlvbiBpcyBmYWxzZSwgdGhyb3dpbmcgYW4gRXJyb3Igd2l0aCB0aGVcbiAqIGdpdmVuIG1lc3NhZ2UgaWYgaXQgZGlkLlxuICpcbiAqIEBwYXJhbSBhc3NlcnRpb25cbiAqIEBwYXJhbSBtZXNzYWdlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWJ1Z0Fzc2VydChcbiAgYXNzZXJ0aW9uOiB1bmtub3duLFxuICBtZXNzYWdlOiBzdHJpbmdcbik6IGFzc2VydHMgYXNzZXJ0aW9uIHtcbiAgaWYgKCFhc3NlcnRpb24pIHtcbiAgICBkZWJ1Z0ZhaWwobWVzc2FnZSk7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gX2dldEN1cnJlbnRVcmwoKTogc3RyaW5nIHtcbiAgcmV0dXJuICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5sb2NhdGlvbj8uaHJlZikgfHwgJyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfaXNIdHRwT3JIdHRwcygpOiBib29sZWFuIHtcbiAgcmV0dXJuIF9nZXRDdXJyZW50U2NoZW1lKCkgPT09ICdodHRwOicgfHwgX2dldEN1cnJlbnRTY2hlbWUoKSA9PT0gJ2h0dHBzOic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfZ2V0Q3VycmVudFNjaGVtZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgcmV0dXJuICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5sb2NhdGlvbj8ucHJvdG9jb2wpIHx8IG51bGw7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgaXNCcm93c2VyRXh0ZW5zaW9uIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuaW1wb3J0IHsgX2lzSHR0cE9ySHR0cHMgfSBmcm9tICcuL2xvY2F0aW9uJztcblxuLyoqXG4gKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgYnJvd3NlciBpcyB3b3JraW5nIG9ubGluZVxuICovXG5leHBvcnQgZnVuY3Rpb24gX2lzT25saW5lKCk6IGJvb2xlYW4ge1xuICBpZiAoXG4gICAgdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICBuYXZpZ2F0b3IgJiZcbiAgICAnb25MaW5lJyBpbiBuYXZpZ2F0b3IgJiZcbiAgICB0eXBlb2YgbmF2aWdhdG9yLm9uTGluZSA9PT0gJ2Jvb2xlYW4nICYmXG4gICAgLy8gQXBwbHkgb25seSBmb3IgdHJhZGl0aW9uYWwgd2ViIGFwcHMgYW5kIENocm9tZSBleHRlbnNpb25zLlxuICAgIC8vIFRoaXMgaXMgZXNwZWNpYWxseSB0cnVlIGZvciBDb3Jkb3ZhIGFwcHMgd2hpY2ggaGF2ZSB1bnJlbGlhYmxlXG4gICAgLy8gbmF2aWdhdG9yLm9uTGluZSBiZWhhdmlvciB1bmxlc3MgY29yZG92YS1wbHVnaW4tbmV0d29yay1pbmZvcm1hdGlvbiBpc1xuICAgIC8vIGluc3RhbGxlZCB3aGljaCBvdmVyd3JpdGVzIHRoZSBuYXRpdmUgbmF2aWdhdG9yLm9uTGluZSB2YWx1ZSBhbmRcbiAgICAvLyBkZWZpbmVzIG5hdmlnYXRvci5jb25uZWN0aW9uLlxuICAgIChfaXNIdHRwT3JIdHRwcygpIHx8IGlzQnJvd3NlckV4dGVuc2lvbigpIHx8ICdjb25uZWN0aW9uJyBpbiBuYXZpZ2F0b3IpXG4gICkge1xuICAgIHJldHVybiBuYXZpZ2F0b3Iub25MaW5lO1xuICB9XG4gIC8vIElmIHdlIGNhbid0IGRldGVybWluZSB0aGUgc3RhdGUsIGFzc3VtZSBpdCBpcyBvbmxpbmUuXG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX2dldFVzZXJMYW5ndWFnZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgbmF2aWdhdG9yTGFuZ3VhZ2U6IE5hdmlnYXRvckxhbmd1YWdlID0gbmF2aWdhdG9yO1xuICByZXR1cm4gKFxuICAgIC8vIE1vc3QgcmVsaWFibGUsIGJ1dCBvbmx5IHN1cHBvcnRlZCBpbiBDaHJvbWUvRmlyZWZveC5cbiAgICAobmF2aWdhdG9yTGFuZ3VhZ2UubGFuZ3VhZ2VzICYmIG5hdmlnYXRvckxhbmd1YWdlLmxhbmd1YWdlc1swXSkgfHxcbiAgICAvLyBTdXBwb3J0ZWQgaW4gbW9zdCBicm93c2VycywgYnV0IHJldHVybnMgdGhlIGxhbmd1YWdlIG9mIHRoZSBicm93c2VyXG4gICAgLy8gVUksIG5vdCB0aGUgbGFuZ3VhZ2Ugc2V0IGluIGJyb3dzZXIgc2V0dGluZ3MuXG4gICAgbmF2aWdhdG9yTGFuZ3VhZ2UubGFuZ3VhZ2UgfHxcbiAgICAvLyBDb3VsZG4ndCBkZXRlcm1pbmUgbGFuZ3VhZ2UuXG4gICAgbnVsbFxuICApO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IGlzTW9iaWxlQ29yZG92YSwgaXNSZWFjdE5hdGl2ZSB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcbmltcG9ydCB7IF9pc09ubGluZSB9IGZyb20gJy4vbmF2aWdhdG9yJztcbmltcG9ydCB7IGRlYnVnQXNzZXJ0IH0gZnJvbSAnLi9hc3NlcnQnO1xuXG5leHBvcnQgY29uc3QgZW51bSBEZWxheU1pbiB7XG4gIE9GRkxJTkUgPSA1MDAwXG59XG5cbi8qKlxuICogQSBzdHJ1Y3R1cmUgdG8gaGVscCBwaWNrIGJldHdlZW4gYSByYW5nZSBvZiBsb25nIGFuZCBzaG9ydCBkZWxheSBkdXJhdGlvbnNcbiAqIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudC4gSW4gZ2VuZXJhbCwgdGhlIGxvbmcgZGVsYXkgaXMgdXNlZCBmb3JcbiAqIG1vYmlsZSBlbnZpcm9ubWVudHMgd2hlcmVhcyBzaG9ydCBkZWxheXMgYXJlIHVzZWQgZm9yIGRlc2t0b3AgZW52aXJvbm1lbnRzLlxuICovXG5leHBvcnQgY2xhc3MgRGVsYXkge1xuICAvLyBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIG9mZmxpbmUgZGVsYXkgdGltZW91dCBpbiBtcy5cblxuICBwcml2YXRlIHJlYWRvbmx5IGlzTW9iaWxlOiBib29sZWFuO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNob3J0RGVsYXk6IG51bWJlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvbmdEZWxheTogbnVtYmVyXG4gICkge1xuICAgIC8vIEludGVybmFsIGVycm9yIHdoZW4gaW1wcm9wZXJseSBpbml0aWFsaXplZC5cbiAgICBkZWJ1Z0Fzc2VydChcbiAgICAgIGxvbmdEZWxheSA+IHNob3J0RGVsYXksXG4gICAgICAnU2hvcnQgZGVsYXkgc2hvdWxkIGJlIGxlc3MgdGhhbiBsb25nIGRlbGF5ISdcbiAgICApO1xuICAgIHRoaXMuaXNNb2JpbGUgPSBpc01vYmlsZUNvcmRvdmEoKSB8fCBpc1JlYWN0TmF0aXZlKCk7XG4gIH1cblxuICBnZXQoKTogbnVtYmVyIHtcbiAgICBpZiAoIV9pc09ubGluZSgpKSB7XG4gICAgICAvLyBQaWNrIHRoZSBzaG9ydGVyIHRpbWVvdXQuXG4gICAgICByZXR1cm4gTWF0aC5taW4oRGVsYXlNaW4uT0ZGTElORSwgdGhpcy5zaG9ydERlbGF5KTtcbiAgICB9XG4gICAgLy8gSWYgcnVubmluZyBpbiBhIG1vYmlsZSBlbnZpcm9ubWVudCwgcmV0dXJuIHRoZSBsb25nIGRlbGF5LCBvdGhlcndpc2VcbiAgICAvLyByZXR1cm4gdGhlIHNob3J0IGRlbGF5LlxuICAgIC8vIFRoaXMgY291bGQgYmUgaW1wcm92ZWQgaW4gdGhlIGZ1dHVyZSB0byBkeW5hbWljYWxseSBjaGFuZ2UgYmFzZWQgb24gb3RoZXJcbiAgICAvLyB2YXJpYWJsZXMgaW5zdGVhZCBvZiBqdXN0IHJlYWRpbmcgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQuXG4gICAgcmV0dXJuIHRoaXMuaXNNb2JpbGUgPyB0aGlzLmxvbmdEZWxheSA6IHRoaXMuc2hvcnREZWxheTtcbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IENvbmZpZ0ludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXV0aCc7XG5pbXBvcnQgeyBkZWJ1Z0Fzc2VydCB9IGZyb20gJy4vYXNzZXJ0JztcblxuZXhwb3J0IGZ1bmN0aW9uIF9lbXVsYXRvclVybChjb25maWc6IENvbmZpZ0ludGVybmFsLCBwYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgZGVidWdBc3NlcnQoY29uZmlnLmVtdWxhdG9yLCAnRW11bGF0b3Igc2hvdWxkIGFsd2F5cyBiZSBzZXQgaGVyZScpO1xuICBjb25zdCB7IHVybCB9ID0gY29uZmlnLmVtdWxhdG9yO1xuXG4gIGlmICghcGF0aCkge1xuICAgIHJldHVybiB1cmw7XG4gIH1cblxuICByZXR1cm4gYCR7dXJsfSR7cGF0aC5zdGFydHNXaXRoKCcvJykgPyBwYXRoLnNsaWNlKDEpIDogcGF0aH1gO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IGRlYnVnRmFpbCB9IGZyb20gJy4vYXNzZXJ0JztcblxuZXhwb3J0IGNsYXNzIEZldGNoUHJvdmlkZXIge1xuICBwcml2YXRlIHN0YXRpYyBmZXRjaEltcGw6IHR5cGVvZiBmZXRjaCB8IG51bGw7XG4gIHByaXZhdGUgc3RhdGljIGhlYWRlcnNJbXBsOiB0eXBlb2YgSGVhZGVycyB8IG51bGw7XG4gIHByaXZhdGUgc3RhdGljIHJlc3BvbnNlSW1wbDogdHlwZW9mIFJlc3BvbnNlIHwgbnVsbDtcblxuICBzdGF0aWMgaW5pdGlhbGl6ZShcbiAgICBmZXRjaEltcGw6IHR5cGVvZiBmZXRjaCxcbiAgICBoZWFkZXJzSW1wbD86IHR5cGVvZiBIZWFkZXJzLFxuICAgIHJlc3BvbnNlSW1wbD86IHR5cGVvZiBSZXNwb25zZVxuICApOiB2b2lkIHtcbiAgICB0aGlzLmZldGNoSW1wbCA9IGZldGNoSW1wbDtcbiAgICBpZiAoaGVhZGVyc0ltcGwpIHtcbiAgICAgIHRoaXMuaGVhZGVyc0ltcGwgPSBoZWFkZXJzSW1wbDtcbiAgICB9XG4gICAgaWYgKHJlc3BvbnNlSW1wbCkge1xuICAgICAgdGhpcy5yZXNwb25zZUltcGwgPSByZXNwb25zZUltcGw7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGZldGNoKCk6IHR5cGVvZiBmZXRjaCB7XG4gICAgaWYgKHRoaXMuZmV0Y2hJbXBsKSB7XG4gICAgICByZXR1cm4gdGhpcy5mZXRjaEltcGw7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiYgJ2ZldGNoJyBpbiBzZWxmKSB7XG4gICAgICByZXR1cm4gc2VsZi5mZXRjaDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyAmJiBnbG9iYWxUaGlzLmZldGNoKSB7XG4gICAgICByZXR1cm4gZ2xvYmFsVGhpcy5mZXRjaDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBmZXRjaCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBmZXRjaDtcbiAgICB9XG4gICAgZGVidWdGYWlsKFxuICAgICAgJ0NvdWxkIG5vdCBmaW5kIGZldGNoIGltcGxlbWVudGF0aW9uLCBtYWtlIHN1cmUgeW91IGNhbGwgRmV0Y2hQcm92aWRlci5pbml0aWFsaXplKCkgd2l0aCBhbiBhcHByb3ByaWF0ZSBwb2x5ZmlsbCdcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIGhlYWRlcnMoKTogdHlwZW9mIEhlYWRlcnMge1xuICAgIGlmICh0aGlzLmhlYWRlcnNJbXBsKSB7XG4gICAgICByZXR1cm4gdGhpcy5oZWFkZXJzSW1wbDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyAmJiAnSGVhZGVycycgaW4gc2VsZikge1xuICAgICAgcmV0dXJuIHNlbGYuSGVhZGVycztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyAmJiBnbG9iYWxUaGlzLkhlYWRlcnMpIHtcbiAgICAgIHJldHVybiBnbG9iYWxUaGlzLkhlYWRlcnM7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgSGVhZGVycyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBIZWFkZXJzO1xuICAgIH1cbiAgICBkZWJ1Z0ZhaWwoXG4gICAgICAnQ291bGQgbm90IGZpbmQgSGVhZGVycyBpbXBsZW1lbnRhdGlvbiwgbWFrZSBzdXJlIHlvdSBjYWxsIEZldGNoUHJvdmlkZXIuaW5pdGlhbGl6ZSgpIHdpdGggYW4gYXBwcm9wcmlhdGUgcG9seWZpbGwnXG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyByZXNwb25zZSgpOiB0eXBlb2YgUmVzcG9uc2Uge1xuICAgIGlmICh0aGlzLnJlc3BvbnNlSW1wbCkge1xuICAgICAgcmV0dXJuIHRoaXMucmVzcG9uc2VJbXBsO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnICYmICdSZXNwb25zZScgaW4gc2VsZikge1xuICAgICAgcmV0dXJuIHNlbGYuUmVzcG9uc2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2xvYmFsVGhpcy5SZXNwb25zZSkge1xuICAgICAgcmV0dXJuIGdsb2JhbFRoaXMuUmVzcG9uc2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgUmVzcG9uc2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gUmVzcG9uc2U7XG4gICAgfVxuICAgIGRlYnVnRmFpbChcbiAgICAgICdDb3VsZCBub3QgZmluZCBSZXNwb25zZSBpbXBsZW1lbnRhdGlvbiwgbWFrZSBzdXJlIHlvdSBjYWxsIEZldGNoUHJvdmlkZXIuaW5pdGlhbGl6ZSgpIHdpdGggYW4gYXBwcm9wcmlhdGUgcG9seWZpbGwnXG4gICAgKTtcbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi9jb3JlL2Vycm9ycyc7XG5cbi8qKlxuICogRXJyb3JzIHRoYXQgY2FuIGJlIHJldHVybmVkIGJ5IHRoZSBiYWNrZW5kXG4gKi9cbmV4cG9ydCBjb25zdCBlbnVtIFNlcnZlckVycm9yIHtcbiAgQURNSU5fT05MWV9PUEVSQVRJT04gPSAnQURNSU5fT05MWV9PUEVSQVRJT04nLFxuICBCTE9DS0lOR19GVU5DVElPTl9FUlJPUl9SRVNQT05TRSA9ICdCTE9DS0lOR19GVU5DVElPTl9FUlJPUl9SRVNQT05TRScsXG4gIENBUFRDSEFfQ0hFQ0tfRkFJTEVEID0gJ0NBUFRDSEFfQ0hFQ0tfRkFJTEVEJyxcbiAgQ09SU19VTlNVUFBPUlRFRCA9ICdDT1JTX1VOU1VQUE9SVEVEJyxcbiAgQ1JFREVOVElBTF9NSVNNQVRDSCA9ICdDUkVERU5USUFMX01JU01BVENIJyxcbiAgQ1JFREVOVElBTF9UT09fT0xEX0xPR0lOX0FHQUlOID0gJ0NSRURFTlRJQUxfVE9PX09MRF9MT0dJTl9BR0FJTicsXG4gIERZTkFNSUNfTElOS19OT1RfQUNUSVZBVEVEID0gJ0RZTkFNSUNfTElOS19OT1RfQUNUSVZBVEVEJyxcbiAgRU1BSUxfQ0hBTkdFX05FRURTX1ZFUklGSUNBVElPTiA9ICdFTUFJTF9DSEFOR0VfTkVFRFNfVkVSSUZJQ0FUSU9OJyxcbiAgRU1BSUxfRVhJU1RTID0gJ0VNQUlMX0VYSVNUUycsXG4gIEVNQUlMX05PVF9GT1VORCA9ICdFTUFJTF9OT1RfRk9VTkQnLFxuICBFWFBJUkVEX09PQl9DT0RFID0gJ0VYUElSRURfT09CX0NPREUnLFxuICBGRURFUkFURURfVVNFUl9JRF9BTFJFQURZX0xJTktFRCA9ICdGRURFUkFURURfVVNFUl9JRF9BTFJFQURZX0xJTktFRCcsXG4gIElOVkFMSURfQVBQX0NSRURFTlRJQUwgPSAnSU5WQUxJRF9BUFBfQ1JFREVOVElBTCcsXG4gIElOVkFMSURfQVBQX0lEID0gJ0lOVkFMSURfQVBQX0lEJyxcbiAgSU5WQUxJRF9DRVJUX0hBU0ggPSAnSU5WQUxJRF9DRVJUX0hBU0gnLFxuICBJTlZBTElEX0NPREUgPSAnSU5WQUxJRF9DT0RFJyxcbiAgSU5WQUxJRF9DT05USU5VRV9VUkkgPSAnSU5WQUxJRF9DT05USU5VRV9VUkknLFxuICBJTlZBTElEX0NVU1RPTV9UT0tFTiA9ICdJTlZBTElEX0NVU1RPTV9UT0tFTicsXG4gIElOVkFMSURfRFlOQU1JQ19MSU5LX0RPTUFJTiA9ICdJTlZBTElEX0RZTkFNSUNfTElOS19ET01BSU4nLFxuICBJTlZBTElEX0VNQUlMID0gJ0lOVkFMSURfRU1BSUwnLFxuICBJTlZBTElEX0lEX1RPS0VOID0gJ0lOVkFMSURfSURfVE9LRU4nLFxuICBJTlZBTElEX0lEUF9SRVNQT05TRSA9ICdJTlZBTElEX0lEUF9SRVNQT05TRScsXG4gIElOVkFMSURfSURFTlRJRklFUiA9ICdJTlZBTElEX0lERU5USUZJRVInLFxuICBJTlZBTElEX01FU1NBR0VfUEFZTE9BRCA9ICdJTlZBTElEX01FU1NBR0VfUEFZTE9BRCcsXG4gIElOVkFMSURfTUZBX1BFTkRJTkdfQ1JFREVOVElBTCA9ICdJTlZBTElEX01GQV9QRU5ESU5HX0NSRURFTlRJQUwnLFxuICBJTlZBTElEX09BVVRIX0NMSUVOVF9JRCA9ICdJTlZBTElEX09BVVRIX0NMSUVOVF9JRCcsXG4gIElOVkFMSURfT09CX0NPREUgPSAnSU5WQUxJRF9PT0JfQ09ERScsXG4gIElOVkFMSURfUEFTU1dPUkQgPSAnSU5WQUxJRF9QQVNTV09SRCcsXG4gIElOVkFMSURfUEVORElOR19UT0tFTiA9ICdJTlZBTElEX1BFTkRJTkdfVE9LRU4nLFxuICBJTlZBTElEX1BIT05FX05VTUJFUiA9ICdJTlZBTElEX1BIT05FX05VTUJFUicsXG4gIElOVkFMSURfUFJPVklERVJfSUQgPSAnSU5WQUxJRF9QUk9WSURFUl9JRCcsXG4gIElOVkFMSURfUkVDSVBJRU5UX0VNQUlMID0gJ0lOVkFMSURfUkVDSVBJRU5UX0VNQUlMJyxcbiAgSU5WQUxJRF9TRU5ERVIgPSAnSU5WQUxJRF9TRU5ERVInLFxuICBJTlZBTElEX1NFU1NJT05fSU5GTyA9ICdJTlZBTElEX1NFU1NJT05fSU5GTycsXG4gIElOVkFMSURfVEVNUE9SQVJZX1BST09GID0gJ0lOVkFMSURfVEVNUE9SQVJZX1BST09GJyxcbiAgSU5WQUxJRF9URU5BTlRfSUQgPSAnSU5WQUxJRF9URU5BTlRfSUQnLFxuICBNRkFfRU5ST0xMTUVOVF9OT1RfRk9VTkQgPSAnTUZBX0VOUk9MTE1FTlRfTk9UX0ZPVU5EJyxcbiAgTUlTU0lOR19BTkRST0lEX1BBQ0tBR0VfTkFNRSA9ICdNSVNTSU5HX0FORFJPSURfUEFDS0FHRV9OQU1FJyxcbiAgTUlTU0lOR19BUFBfQ1JFREVOVElBTCA9ICdNSVNTSU5HX0FQUF9DUkVERU5USUFMJyxcbiAgTUlTU0lOR19DT0RFID0gJ01JU1NJTkdfQ09ERScsXG4gIE1JU1NJTkdfQ09OVElOVUVfVVJJID0gJ01JU1NJTkdfQ09OVElOVUVfVVJJJyxcbiAgTUlTU0lOR19DVVNUT01fVE9LRU4gPSAnTUlTU0lOR19DVVNUT01fVE9LRU4nLFxuICBNSVNTSU5HX0lPU19CVU5ETEVfSUQgPSAnTUlTU0lOR19JT1NfQlVORExFX0lEJyxcbiAgTUlTU0lOR19NRkFfRU5ST0xMTUVOVF9JRCA9ICdNSVNTSU5HX01GQV9FTlJPTExNRU5UX0lEJyxcbiAgTUlTU0lOR19NRkFfUEVORElOR19DUkVERU5USUFMID0gJ01JU1NJTkdfTUZBX1BFTkRJTkdfQ1JFREVOVElBTCcsXG4gIE1JU1NJTkdfT09CX0NPREUgPSAnTUlTU0lOR19PT0JfQ09ERScsXG4gIE1JU1NJTkdfT1JfSU5WQUxJRF9OT05DRSA9ICdNSVNTSU5HX09SX0lOVkFMSURfTk9OQ0UnLFxuICBNSVNTSU5HX1BBU1NXT1JEID0gJ01JU1NJTkdfUEFTU1dPUkQnLFxuICBNSVNTSU5HX1JFUV9UWVBFID0gJ01JU1NJTkdfUkVRX1RZUEUnLFxuICBNSVNTSU5HX1BIT05FX05VTUJFUiA9ICdNSVNTSU5HX1BIT05FX05VTUJFUicsXG4gIE1JU1NJTkdfU0VTU0lPTl9JTkZPID0gJ01JU1NJTkdfU0VTU0lPTl9JTkZPJyxcbiAgT1BFUkFUSU9OX05PVF9BTExPV0VEID0gJ09QRVJBVElPTl9OT1RfQUxMT1dFRCcsXG4gIFBBU1NXT1JEX0xPR0lOX0RJU0FCTEVEID0gJ1BBU1NXT1JEX0xPR0lOX0RJU0FCTEVEJyxcbiAgUVVPVEFfRVhDRUVERUQgPSAnUVVPVEFfRVhDRUVERUQnLFxuICBSRVNFVF9QQVNTV09SRF9FWENFRURfTElNSVQgPSAnUkVTRVRfUEFTU1dPUkRfRVhDRUVEX0xJTUlUJyxcbiAgUkVKRUNURURfQ1JFREVOVElBTCA9ICdSRUpFQ1RFRF9DUkVERU5USUFMJyxcbiAgU0VDT05EX0ZBQ1RPUl9FWElTVFMgPSAnU0VDT05EX0ZBQ1RPUl9FWElTVFMnLFxuICBTRUNPTkRfRkFDVE9SX0xJTUlUX0VYQ0VFREVEID0gJ1NFQ09ORF9GQUNUT1JfTElNSVRfRVhDRUVERUQnLFxuICBTRVNTSU9OX0VYUElSRUQgPSAnU0VTU0lPTl9FWFBJUkVEJyxcbiAgVEVOQU5UX0lEX01JU01BVENIID0gJ1RFTkFOVF9JRF9NSVNNQVRDSCcsXG4gIFRPS0VOX0VYUElSRUQgPSAnVE9LRU5fRVhQSVJFRCcsXG4gIFRPT19NQU5ZX0FUVEVNUFRTX1RSWV9MQVRFUiA9ICdUT09fTUFOWV9BVFRFTVBUU19UUllfTEFURVInLFxuICBVTlNVUFBPUlRFRF9GSVJTVF9GQUNUT1IgPSAnVU5TVVBQT1JURURfRklSU1RfRkFDVE9SJyxcbiAgVU5TVVBQT1JURURfVEVOQU5UX09QRVJBVElPTiA9ICdVTlNVUFBPUlRFRF9URU5BTlRfT1BFUkFUSU9OJyxcbiAgVU5BVVRIT1JJWkVEX0RPTUFJTiA9ICdVTkFVVEhPUklaRURfRE9NQUlOJyxcbiAgVU5WRVJJRklFRF9FTUFJTCA9ICdVTlZFUklGSUVEX0VNQUlMJyxcbiAgVVNFUl9DQU5DRUxMRUQgPSAnVVNFUl9DQU5DRUxMRUQnLFxuICBVU0VSX0RJU0FCTEVEID0gJ1VTRVJfRElTQUJMRUQnLFxuICBVU0VSX05PVF9GT1VORCA9ICdVU0VSX05PVF9GT1VORCcsXG4gIFdFQUtfUEFTU1dPUkQgPSAnV0VBS19QQVNTV09SRCcsXG4gIFJFQ0FQVENIQV9OT1RfRU5BQkxFRCA9ICdSRUNBUFRDSEFfTk9UX0VOQUJMRUQnLFxuICBNSVNTSU5HX1JFQ0FQVENIQV9UT0tFTiA9ICdNSVNTSU5HX1JFQ0FQVENIQV9UT0tFTicsXG4gIElOVkFMSURfUkVDQVBUQ0hBX1RPS0VOID0gJ0lOVkFMSURfUkVDQVBUQ0hBX1RPS0VOJyxcbiAgSU5WQUxJRF9SRUNBUFRDSEFfQUNUSU9OID0gJ0lOVkFMSURfUkVDQVBUQ0hBX0FDVElPTicsXG4gIE1JU1NJTkdfQ0xJRU5UX1RZUEUgPSAnTUlTU0lOR19DTElFTlRfVFlQRScsXG4gIE1JU1NJTkdfUkVDQVBUQ0hBX1ZFUlNJT04gPSAnTUlTU0lOR19SRUNBUFRDSEFfVkVSU0lPTicsXG4gIElOVkFMSURfUkVDQVBUQ0hBX1ZFUlNJT04gPSAnSU5WQUxJRF9SRUNBUFRDSEFfVkVSU0lPTicsXG4gIElOVkFMSURfUkVRX1RZUEUgPSAnSU5WQUxJRF9SRVFfVFlQRScsXG4gIFBBU1NXT1JEX0RPRVNfTk9UX01FRVRfUkVRVUlSRU1FTlRTID0gJ1BBU1NXT1JEX0RPRVNfTk9UX01FRVRfUkVRVUlSRU1FTlRTJ1xufVxuXG4vKipcbiAqIEFQSSBSZXNwb25zZSBpbiB0aGUgZXZlbnQgb2YgYW4gZXJyb3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKc29uRXJyb3Ige1xuICBlcnJvcjoge1xuICAgIGNvZGU6IG51bWJlcjtcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgZXJyb3JzPzogW1xuICAgICAge1xuICAgICAgICBtZXNzYWdlOiBTZXJ2ZXJFcnJvcjtcbiAgICAgICAgZG9tYWluOiBzdHJpbmc7XG4gICAgICAgIHJlYXNvbjogc3RyaW5nO1xuICAgICAgfVxuICAgIF07XG4gIH07XG59XG5cbi8qKlxuICogVHlwZSBkZWZpbml0aW9uIGZvciBhIG1hcCBmcm9tIHNlcnZlciBlcnJvcnMgdG8gZGV2ZWxvcGVyIHZpc2libGUgZXJyb3JzXG4gKi9cbmV4cG9ydCBkZWNsYXJlIHR5cGUgU2VydmVyRXJyb3JNYXA8QXBpRXJyb3IgZXh0ZW5kcyBzdHJpbmc+ID0ge1xuICByZWFkb25seSBbSyBpbiBBcGlFcnJvcl06IEF1dGhFcnJvckNvZGU7XG59O1xuXG4vKipcbiAqIE1hcCBmcm9tIGVycm9ycyByZXR1cm5lZCBieSB0aGUgc2VydmVyIHRvIGVycm9ycyB0byBkZXZlbG9wZXIgdmlzaWJsZSBlcnJvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IFNFUlZFUl9FUlJPUl9NQVA6IFBhcnRpYWw8U2VydmVyRXJyb3JNYXA8U2VydmVyRXJyb3I+PiA9IHtcbiAgLy8gQ3VzdG9tIHRva2VuIGVycm9ycy5cbiAgW1NlcnZlckVycm9yLkNSRURFTlRJQUxfTUlTTUFUQ0hdOiBBdXRoRXJyb3JDb2RlLkNSRURFTlRJQUxfTUlTTUFUQ0gsXG4gIC8vIFRoaXMgY2FuIG9ubHkgaGFwcGVuIGlmIHRoZSBTREsgc2VuZHMgYSBiYWQgcmVxdWVzdC5cbiAgW1NlcnZlckVycm9yLk1JU1NJTkdfQ1VTVE9NX1RPS0VOXTogQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUixcblxuICAvLyBDcmVhdGUgQXV0aCBVUkkgZXJyb3JzLlxuICBbU2VydmVyRXJyb3IuSU5WQUxJRF9JREVOVElGSUVSXTogQXV0aEVycm9yQ29kZS5JTlZBTElEX0VNQUlMLFxuICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbiBpZiB0aGUgU0RLIHNlbmRzIGEgYmFkIHJlcXVlc3QuXG4gIFtTZXJ2ZXJFcnJvci5NSVNTSU5HX0NPTlRJTlVFX1VSSV06IEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IsXG5cbiAgLy8gU2lnbiBpbiB3aXRoIGVtYWlsIGFuZCBwYXNzd29yZCBlcnJvcnMgKHNvbWUgYXBwbHkgdG8gc2lnbiB1cCB0b28pLlxuICBbU2VydmVyRXJyb3IuSU5WQUxJRF9QQVNTV09SRF06IEF1dGhFcnJvckNvZGUuSU5WQUxJRF9QQVNTV09SRCxcbiAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW4gaWYgdGhlIFNESyBzZW5kcyBhIGJhZCByZXF1ZXN0LlxuICBbU2VydmVyRXJyb3IuTUlTU0lOR19QQVNTV09SRF06IEF1dGhFcnJvckNvZGUuTUlTU0lOR19QQVNTV09SRCxcblxuICAvLyBTaWduIHVwIHdpdGggZW1haWwgYW5kIHBhc3N3b3JkIGVycm9ycy5cbiAgW1NlcnZlckVycm9yLkVNQUlMX0VYSVNUU106IEF1dGhFcnJvckNvZGUuRU1BSUxfRVhJU1RTLFxuICBbU2VydmVyRXJyb3IuUEFTU1dPUkRfTE9HSU5fRElTQUJMRURdOiBBdXRoRXJyb3JDb2RlLk9QRVJBVElPTl9OT1RfQUxMT1dFRCxcblxuICAvLyBWZXJpZnkgYXNzZXJ0aW9uIGZvciBzaWduIGluIHdpdGggY3JlZGVudGlhbCBlcnJvcnM6XG4gIFtTZXJ2ZXJFcnJvci5JTlZBTElEX0lEUF9SRVNQT05TRV06IEF1dGhFcnJvckNvZGUuSU5WQUxJRF9JRFBfUkVTUE9OU0UsXG4gIFtTZXJ2ZXJFcnJvci5JTlZBTElEX1BFTkRJTkdfVE9LRU5dOiBBdXRoRXJyb3JDb2RlLklOVkFMSURfSURQX1JFU1BPTlNFLFxuICBbU2VydmVyRXJyb3IuRkVERVJBVEVEX1VTRVJfSURfQUxSRUFEWV9MSU5LRURdOlxuICAgIEF1dGhFcnJvckNvZGUuQ1JFREVOVElBTF9BTFJFQURZX0lOX1VTRSxcblxuICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbiBpZiB0aGUgU0RLIHNlbmRzIGEgYmFkIHJlcXVlc3QuXG4gIFtTZXJ2ZXJFcnJvci5NSVNTSU5HX1JFUV9UWVBFXTogQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUixcblxuICAvLyBTZW5kIFBhc3N3b3JkIHJlc2V0IGVtYWlsIGVycm9yczpcbiAgW1NlcnZlckVycm9yLkVNQUlMX05PVF9GT1VORF06IEF1dGhFcnJvckNvZGUuVVNFUl9ERUxFVEVELFxuICBbU2VydmVyRXJyb3IuUkVTRVRfUEFTU1dPUkRfRVhDRUVEX0xJTUlUXTpcbiAgICBBdXRoRXJyb3JDb2RlLlRPT19NQU5ZX0FUVEVNUFRTX1RSWV9MQVRFUixcblxuICBbU2VydmVyRXJyb3IuRVhQSVJFRF9PT0JfQ09ERV06IEF1dGhFcnJvckNvZGUuRVhQSVJFRF9PT0JfQ09ERSxcbiAgW1NlcnZlckVycm9yLklOVkFMSURfT09CX0NPREVdOiBBdXRoRXJyb3JDb2RlLklOVkFMSURfT09CX0NPREUsXG4gIC8vIFRoaXMgY2FuIG9ubHkgaGFwcGVuIGlmIHRoZSBTREsgc2VuZHMgYSBiYWQgcmVxdWVzdC5cbiAgW1NlcnZlckVycm9yLk1JU1NJTkdfT09CX0NPREVdOiBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SLFxuXG4gIC8vIE9wZXJhdGlvbnMgdGhhdCByZXF1aXJlIElEIHRva2VuIGluIHJlcXVlc3Q6XG4gIFtTZXJ2ZXJFcnJvci5DUkVERU5USUFMX1RPT19PTERfTE9HSU5fQUdBSU5dOlxuICAgIEF1dGhFcnJvckNvZGUuQ1JFREVOVElBTF9UT09fT0xEX0xPR0lOX0FHQUlOLFxuICBbU2VydmVyRXJyb3IuSU5WQUxJRF9JRF9UT0tFTl06IEF1dGhFcnJvckNvZGUuSU5WQUxJRF9BVVRILFxuICBbU2VydmVyRXJyb3IuVE9LRU5fRVhQSVJFRF06IEF1dGhFcnJvckNvZGUuVE9LRU5fRVhQSVJFRCxcbiAgW1NlcnZlckVycm9yLlVTRVJfTk9UX0ZPVU5EXTogQXV0aEVycm9yQ29kZS5UT0tFTl9FWFBJUkVELFxuXG4gIC8vIE90aGVyIGVycm9ycy5cbiAgW1NlcnZlckVycm9yLlRPT19NQU5ZX0FUVEVNUFRTX1RSWV9MQVRFUl06XG4gICAgQXV0aEVycm9yQ29kZS5UT09fTUFOWV9BVFRFTVBUU19UUllfTEFURVIsXG4gIFtTZXJ2ZXJFcnJvci5QQVNTV09SRF9ET0VTX05PVF9NRUVUX1JFUVVJUkVNRU5UU106XG4gICAgQXV0aEVycm9yQ29kZS5QQVNTV09SRF9ET0VTX05PVF9NRUVUX1JFUVVJUkVNRU5UUyxcblxuICAvLyBQaG9uZSBBdXRoIHJlbGF0ZWQgZXJyb3JzLlxuICBbU2VydmVyRXJyb3IuSU5WQUxJRF9DT0RFXTogQXV0aEVycm9yQ29kZS5JTlZBTElEX0NPREUsXG4gIFtTZXJ2ZXJFcnJvci5JTlZBTElEX1NFU1NJT05fSU5GT106IEF1dGhFcnJvckNvZGUuSU5WQUxJRF9TRVNTSU9OX0lORk8sXG4gIFtTZXJ2ZXJFcnJvci5JTlZBTElEX1RFTVBPUkFSWV9QUk9PRl06IEF1dGhFcnJvckNvZGUuSU5WQUxJRF9JRFBfUkVTUE9OU0UsXG4gIFtTZXJ2ZXJFcnJvci5NSVNTSU5HX1NFU1NJT05fSU5GT106IEF1dGhFcnJvckNvZGUuTUlTU0lOR19TRVNTSU9OX0lORk8sXG4gIFtTZXJ2ZXJFcnJvci5TRVNTSU9OX0VYUElSRURdOiBBdXRoRXJyb3JDb2RlLkNPREVfRVhQSVJFRCxcblxuICAvLyBPdGhlciBhY3Rpb24gY29kZSBlcnJvcnMgd2hlbiBhZGRpdGlvbmFsIHNldHRpbmdzIHBhc3NlZC5cbiAgLy8gTUlTU0lOR19DT05USU5VRV9VUkkgaXMgZ2V0dGluZyBtYXBwZWQgdG8gSU5URVJOQUxfRVJST1IgYWJvdmUuXG4gIC8vIFRoaXMgaXMgT0sgYXMgdGhpcyBlcnJvciB3aWxsIGJlIGNhdWdodCBieSBjbGllbnQgc2lkZSB2YWxpZGF0aW9uLlxuICBbU2VydmVyRXJyb3IuTUlTU0lOR19BTkRST0lEX1BBQ0tBR0VfTkFNRV06XG4gICAgQXV0aEVycm9yQ29kZS5NSVNTSU5HX0FORFJPSURfUEFDS0FHRV9OQU1FLFxuICBbU2VydmVyRXJyb3IuVU5BVVRIT1JJWkVEX0RPTUFJTl06IEF1dGhFcnJvckNvZGUuVU5BVVRIT1JJWkVEX0RPTUFJTixcblxuICAvLyBnZXRQcm9qZWN0Q29uZmlnIGVycm9ycyB3aGVuIGNsaWVudElkIGlzIHBhc3NlZC5cbiAgW1NlcnZlckVycm9yLklOVkFMSURfT0FVVEhfQ0xJRU5UX0lEXTogQXV0aEVycm9yQ29kZS5JTlZBTElEX09BVVRIX0NMSUVOVF9JRCxcblxuICAvLyBVc2VyIGFjdGlvbnMgKHNpZ24tdXAgb3IgZGVsZXRpb24pIGRpc2FibGVkIGVycm9ycy5cbiAgW1NlcnZlckVycm9yLkFETUlOX09OTFlfT1BFUkFUSU9OXTogQXV0aEVycm9yQ29kZS5BRE1JTl9PTkxZX09QRVJBVElPTixcblxuICAvLyBNdWx0aSBmYWN0b3IgcmVsYXRlZCBlcnJvcnMuXG4gIFtTZXJ2ZXJFcnJvci5JTlZBTElEX01GQV9QRU5ESU5HX0NSRURFTlRJQUxdOlxuICAgIEF1dGhFcnJvckNvZGUuSU5WQUxJRF9NRkFfU0VTU0lPTixcbiAgW1NlcnZlckVycm9yLk1GQV9FTlJPTExNRU5UX05PVF9GT1VORF06IEF1dGhFcnJvckNvZGUuTUZBX0lORk9fTk9UX0ZPVU5ELFxuICBbU2VydmVyRXJyb3IuTUlTU0lOR19NRkFfRU5ST0xMTUVOVF9JRF06IEF1dGhFcnJvckNvZGUuTUlTU0lOR19NRkFfSU5GTyxcbiAgW1NlcnZlckVycm9yLk1JU1NJTkdfTUZBX1BFTkRJTkdfQ1JFREVOVElBTF06XG4gICAgQXV0aEVycm9yQ29kZS5NSVNTSU5HX01GQV9TRVNTSU9OLFxuICBbU2VydmVyRXJyb3IuU0VDT05EX0ZBQ1RPUl9FWElTVFNdOlxuICAgIEF1dGhFcnJvckNvZGUuU0VDT05EX0ZBQ1RPUl9BTFJFQURZX0VOUk9MTEVELFxuICBbU2VydmVyRXJyb3IuU0VDT05EX0ZBQ1RPUl9MSU1JVF9FWENFRURFRF06XG4gICAgQXV0aEVycm9yQ29kZS5TRUNPTkRfRkFDVE9SX0xJTUlUX0VYQ0VFREVELFxuXG4gIC8vIEJsb2NraW5nIGZ1bmN0aW9ucyByZWxhdGVkIGVycm9ycy5cbiAgW1NlcnZlckVycm9yLkJMT0NLSU5HX0ZVTkNUSU9OX0VSUk9SX1JFU1BPTlNFXTogQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUixcblxuICAvLyBSZWNhcHRjaGEgcmVsYXRlZCBlcnJvcnMuXG4gIFtTZXJ2ZXJFcnJvci5SRUNBUFRDSEFfTk9UX0VOQUJMRURdOiBBdXRoRXJyb3JDb2RlLlJFQ0FQVENIQV9OT1RfRU5BQkxFRCxcbiAgW1NlcnZlckVycm9yLk1JU1NJTkdfUkVDQVBUQ0hBX1RPS0VOXTogQXV0aEVycm9yQ29kZS5NSVNTSU5HX1JFQ0FQVENIQV9UT0tFTixcbiAgW1NlcnZlckVycm9yLklOVkFMSURfUkVDQVBUQ0hBX1RPS0VOXTogQXV0aEVycm9yQ29kZS5JTlZBTElEX1JFQ0FQVENIQV9UT0tFTixcbiAgW1NlcnZlckVycm9yLklOVkFMSURfUkVDQVBUQ0hBX0FDVElPTl06XG4gICAgQXV0aEVycm9yQ29kZS5JTlZBTElEX1JFQ0FQVENIQV9BQ1RJT04sXG4gIFtTZXJ2ZXJFcnJvci5NSVNTSU5HX0NMSUVOVF9UWVBFXTogQXV0aEVycm9yQ29kZS5NSVNTSU5HX0NMSUVOVF9UWVBFLFxuICBbU2VydmVyRXJyb3IuTUlTU0lOR19SRUNBUFRDSEFfVkVSU0lPTl06XG4gICAgQXV0aEVycm9yQ29kZS5NSVNTSU5HX1JFQ0FQVENIQV9WRVJTSU9OLFxuICBbU2VydmVyRXJyb3IuSU5WQUxJRF9SRUNBUFRDSEFfVkVSU0lPTl06XG4gICAgQXV0aEVycm9yQ29kZS5JTlZBTElEX1JFQ0FQVENIQV9WRVJTSU9OLFxuICBbU2VydmVyRXJyb3IuSU5WQUxJRF9SRVFfVFlQRV06IEF1dGhFcnJvckNvZGUuSU5WQUxJRF9SRVFfVFlQRVxufTtcbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBGaXJlYmFzZUVycm9yLCBxdWVyeXN0cmluZyB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcblxuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSwgTmFtZWRFcnJvclBhcmFtcyB9IGZyb20gJy4uL2NvcmUvZXJyb3JzJztcbmltcG9ydCB7XG4gIF9jcmVhdGVFcnJvcixcbiAgX2Vycm9yV2l0aEN1c3RvbU1lc3NhZ2UsXG4gIF9mYWlsXG59IGZyb20gJy4uL2NvcmUvdXRpbC9hc3NlcnQnO1xuaW1wb3J0IHsgRGVsYXkgfSBmcm9tICcuLi9jb3JlL3V0aWwvZGVsYXknO1xuaW1wb3J0IHsgX2VtdWxhdG9yVXJsIH0gZnJvbSAnLi4vY29yZS91dGlsL2VtdWxhdG9yJztcbmltcG9ydCB7IEZldGNoUHJvdmlkZXIgfSBmcm9tICcuLi9jb3JlL3V0aWwvZmV0Y2hfcHJvdmlkZXInO1xuaW1wb3J0IHsgQXV0aCB9IGZyb20gJy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5pbXBvcnQgeyBBdXRoSW50ZXJuYWwsIENvbmZpZ0ludGVybmFsIH0gZnJvbSAnLi4vbW9kZWwvYXV0aCc7XG5pbXBvcnQgeyBJZFRva2VuUmVzcG9uc2UsIFRhZ2dlZFdpdGhUb2tlblJlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWwvaWRfdG9rZW4nO1xuaW1wb3J0IHsgSWRUb2tlbk1mYVJlc3BvbnNlIH0gZnJvbSAnLi9hdXRoZW50aWNhdGlvbi9tZmEnO1xuaW1wb3J0IHsgU0VSVkVSX0VSUk9SX01BUCwgU2VydmVyRXJyb3IsIFNlcnZlckVycm9yTWFwIH0gZnJvbSAnLi9lcnJvcnMnO1xuXG5leHBvcnQgY29uc3QgZW51bSBIdHRwTWV0aG9kIHtcbiAgUE9TVCA9ICdQT1NUJyxcbiAgR0VUID0gJ0dFVCdcbn1cblxuZXhwb3J0IGNvbnN0IGVudW0gSHR0cEhlYWRlciB7XG4gIENPTlRFTlRfVFlQRSA9ICdDb250ZW50LVR5cGUnLFxuICBYX0ZJUkVCQVNFX0xPQ0FMRSA9ICdYLUZpcmViYXNlLUxvY2FsZScsXG4gIFhfQ0xJRU5UX1ZFUlNJT04gPSAnWC1DbGllbnQtVmVyc2lvbicsXG4gIFhfRklSRUJBU0VfR01QSUQgPSAnWC1GaXJlYmFzZS1nbXBpZCcsXG4gIFhfRklSRUJBU0VfQ0xJRU5UID0gJ1gtRmlyZWJhc2UtQ2xpZW50JyxcbiAgWF9GSVJFQkFTRV9BUFBfQ0hFQ0sgPSAnWC1GaXJlYmFzZS1BcHBDaGVjaydcbn1cblxuZXhwb3J0IGNvbnN0IGVudW0gRW5kcG9pbnQge1xuICBDUkVBVEVfQVVUSF9VUkkgPSAnL3YxL2FjY291bnRzOmNyZWF0ZUF1dGhVcmknLFxuICBERUxFVEVfQUNDT1VOVCA9ICcvdjEvYWNjb3VudHM6ZGVsZXRlJyxcbiAgUkVTRVRfUEFTU1dPUkQgPSAnL3YxL2FjY291bnRzOnJlc2V0UGFzc3dvcmQnLFxuICBTSUdOX1VQID0gJy92MS9hY2NvdW50czpzaWduVXAnLFxuICBTSUdOX0lOX1dJVEhfQ1VTVE9NX1RPS0VOID0gJy92MS9hY2NvdW50czpzaWduSW5XaXRoQ3VzdG9tVG9rZW4nLFxuICBTSUdOX0lOX1dJVEhfRU1BSUxfTElOSyA9ICcvdjEvYWNjb3VudHM6c2lnbkluV2l0aEVtYWlsTGluaycsXG4gIFNJR05fSU5fV0lUSF9JRFAgPSAnL3YxL2FjY291bnRzOnNpZ25JbldpdGhJZHAnLFxuICBTSUdOX0lOX1dJVEhfUEFTU1dPUkQgPSAnL3YxL2FjY291bnRzOnNpZ25JbldpdGhQYXNzd29yZCcsXG4gIFNJR05fSU5fV0lUSF9QSE9ORV9OVU1CRVIgPSAnL3YxL2FjY291bnRzOnNpZ25JbldpdGhQaG9uZU51bWJlcicsXG4gIFNFTkRfVkVSSUZJQ0FUSU9OX0NPREUgPSAnL3YxL2FjY291bnRzOnNlbmRWZXJpZmljYXRpb25Db2RlJyxcbiAgU0VORF9PT0JfQ09ERSA9ICcvdjEvYWNjb3VudHM6c2VuZE9vYkNvZGUnLFxuICBTRVRfQUNDT1VOVF9JTkZPID0gJy92MS9hY2NvdW50czp1cGRhdGUnLFxuICBHRVRfQUNDT1VOVF9JTkZPID0gJy92MS9hY2NvdW50czpsb29rdXAnLFxuICBHRVRfUkVDQVBUQ0hBX1BBUkFNID0gJy92MS9yZWNhcHRjaGFQYXJhbXMnLFxuICBTVEFSVF9NRkFfRU5ST0xMTUVOVCA9ICcvdjIvYWNjb3VudHMvbWZhRW5yb2xsbWVudDpzdGFydCcsXG4gIEZJTkFMSVpFX01GQV9FTlJPTExNRU5UID0gJy92Mi9hY2NvdW50cy9tZmFFbnJvbGxtZW50OmZpbmFsaXplJyxcbiAgU1RBUlRfTUZBX1NJR05fSU4gPSAnL3YyL2FjY291bnRzL21mYVNpZ25JbjpzdGFydCcsXG4gIEZJTkFMSVpFX01GQV9TSUdOX0lOID0gJy92Mi9hY2NvdW50cy9tZmFTaWduSW46ZmluYWxpemUnLFxuICBXSVRIRFJBV19NRkEgPSAnL3YyL2FjY291bnRzL21mYUVucm9sbG1lbnQ6d2l0aGRyYXcnLFxuICBHRVRfUFJPSkVDVF9DT05GSUcgPSAnL3YxL3Byb2plY3RzJyxcbiAgR0VUX1JFQ0FQVENIQV9DT05GSUcgPSAnL3YyL3JlY2FwdGNoYUNvbmZpZycsXG4gIEdFVF9QQVNTV09SRF9QT0xJQ1kgPSAnL3YyL3Bhc3N3b3JkUG9saWN5J1xufVxuXG5leHBvcnQgY29uc3QgZW51bSBSZWNhcHRjaGFDbGllbnRUeXBlIHtcbiAgV0VCID0gJ0NMSUVOVF9UWVBFX1dFQicsXG4gIEFORFJPSUQgPSAnQ0xJRU5UX1RZUEVfQU5EUk9JRCcsXG4gIElPUyA9ICdDTElFTlRfVFlQRV9JT1MnXG59XG5cbmV4cG9ydCBjb25zdCBlbnVtIFJlY2FwdGNoYVZlcnNpb24ge1xuICBFTlRFUlBSSVNFID0gJ1JFQ0FQVENIQV9FTlRFUlBSSVNFJ1xufVxuXG5leHBvcnQgY29uc3QgZW51bSBSZWNhcHRjaGFBY3Rpb25OYW1lIHtcbiAgU0lHTl9JTl9XSVRIX1BBU1NXT1JEID0gJ3NpZ25JbldpdGhQYXNzd29yZCcsXG4gIEdFVF9PT0JfQ09ERSA9ICdnZXRPb2JDb2RlJyxcbiAgU0lHTl9VUF9QQVNTV09SRCA9ICdzaWduVXBQYXNzd29yZCdcbn1cblxuZXhwb3J0IGNvbnN0IGVudW0gRW5mb3JjZW1lbnRTdGF0ZSB7XG4gIEVORk9SQ0UgPSAnRU5GT1JDRScsXG4gIEFVRElUID0gJ0FVRElUJyxcbiAgT0ZGID0gJ09GRicsXG4gIEVORk9SQ0VNRU5UX1NUQVRFX1VOU1BFQ0lGSUVEID0gJ0VORk9SQ0VNRU5UX1NUQVRFX1VOU1BFQ0lGSUVEJ1xufVxuXG4vLyBQcm92aWRlcnMgdGhhdCBoYXZlIHJlQ0FQVENIQSBFbnRlcnByaXNlIHN1cHBvcnQuXG5leHBvcnQgY29uc3QgZW51bSBSZWNhcHRjaGFQcm92aWRlciB7XG4gIEVNQUlMX1BBU1NXT1JEX1BST1ZJREVSID0gJ0VNQUlMX1BBU1NXT1JEX1BST1ZJREVSJ1xufVxuXG5leHBvcnQgY29uc3QgREVGQVVMVF9BUElfVElNRU9VVF9NUyA9IG5ldyBEZWxheSgzMF8wMDAsIDYwXzAwMCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBfYWRkVGlkSWZOZWNlc3Nhcnk8VCBleHRlbmRzIHsgdGVuYW50SWQ/OiBzdHJpbmcgfT4oXG4gIGF1dGg6IEF1dGgsXG4gIHJlcXVlc3Q6IFRcbik6IFQge1xuICBpZiAoYXV0aC50ZW5hbnRJZCAmJiAhcmVxdWVzdC50ZW5hbnRJZCkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5yZXF1ZXN0LFxuICAgICAgdGVuYW50SWQ6IGF1dGgudGVuYW50SWRcbiAgICB9O1xuICB9XG4gIHJldHVybiByZXF1ZXN0O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gX3BlcmZvcm1BcGlSZXF1ZXN0PFQsIFY+KFxuICBhdXRoOiBBdXRoLFxuICBtZXRob2Q6IEh0dHBNZXRob2QsXG4gIHBhdGg6IEVuZHBvaW50LFxuICByZXF1ZXN0PzogVCxcbiAgY3VzdG9tRXJyb3JNYXA6IFBhcnRpYWw8U2VydmVyRXJyb3JNYXA8U2VydmVyRXJyb3I+PiA9IHt9XG4pOiBQcm9taXNlPFY+IHtcbiAgcmV0dXJuIF9wZXJmb3JtRmV0Y2hXaXRoRXJyb3JIYW5kbGluZyhhdXRoLCBjdXN0b21FcnJvck1hcCwgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBib2R5ID0ge307XG4gICAgbGV0IHBhcmFtcyA9IHt9O1xuICAgIGlmIChyZXF1ZXN0KSB7XG4gICAgICBpZiAobWV0aG9kID09PSBIdHRwTWV0aG9kLkdFVCkge1xuICAgICAgICBwYXJhbXMgPSByZXF1ZXN0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYm9keSA9IHtcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShyZXF1ZXN0KVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJ5ID0gcXVlcnlzdHJpbmcoe1xuICAgICAga2V5OiBhdXRoLmNvbmZpZy5hcGlLZXksXG4gICAgICAuLi5wYXJhbXNcbiAgICB9KS5zbGljZSgxKTtcblxuICAgIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCAoYXV0aCBhcyBBdXRoSW50ZXJuYWwpLl9nZXRBZGRpdGlvbmFsSGVhZGVycygpO1xuICAgIGhlYWRlcnNbSHR0cEhlYWRlci5DT05URU5UX1RZUEVdID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgaWYgKGF1dGgubGFuZ3VhZ2VDb2RlKSB7XG4gICAgICBoZWFkZXJzW0h0dHBIZWFkZXIuWF9GSVJFQkFTRV9MT0NBTEVdID0gYXV0aC5sYW5ndWFnZUNvZGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIEZldGNoUHJvdmlkZXIuZmV0Y2goKShcbiAgICAgIF9nZXRGaW5hbFRhcmdldChhdXRoLCBhdXRoLmNvbmZpZy5hcGlIb3N0LCBwYXRoLCBxdWVyeSksXG4gICAgICB7XG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgcmVmZXJyZXJQb2xpY3k6ICduby1yZWZlcnJlcicsXG4gICAgICAgIC4uLmJvZHlcbiAgICAgIH1cbiAgICApO1xuICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF9wZXJmb3JtRmV0Y2hXaXRoRXJyb3JIYW5kbGluZzxWPihcbiAgYXV0aDogQXV0aCxcbiAgY3VzdG9tRXJyb3JNYXA6IFBhcnRpYWw8U2VydmVyRXJyb3JNYXA8U2VydmVyRXJyb3I+PixcbiAgZmV0Y2hGbjogKCkgPT4gUHJvbWlzZTxSZXNwb25zZT5cbik6IFByb21pc2U8Vj4ge1xuICAoYXV0aCBhcyBBdXRoSW50ZXJuYWwpLl9jYW5Jbml0RW11bGF0b3IgPSBmYWxzZTtcbiAgY29uc3QgZXJyb3JNYXAgPSB7IC4uLlNFUlZFUl9FUlJPUl9NQVAsIC4uLmN1c3RvbUVycm9yTWFwIH07XG4gIHRyeSB7XG4gICAgY29uc3QgbmV0d29ya1RpbWVvdXQgPSBuZXcgTmV0d29ya1RpbWVvdXQ8UmVzcG9uc2U+KGF1dGgpO1xuICAgIGNvbnN0IHJlc3BvbnNlOiBSZXNwb25zZSA9IGF3YWl0IFByb21pc2UucmFjZTxQcm9taXNlPFJlc3BvbnNlPj4oW1xuICAgICAgZmV0Y2hGbigpLFxuICAgICAgbmV0d29ya1RpbWVvdXQucHJvbWlzZVxuICAgIF0pO1xuXG4gICAgLy8gSWYgd2UndmUgcmVhY2hlZCB0aGlzIHBvaW50LCB0aGUgZmV0Y2ggc3VjY2VlZGVkIGFuZCB0aGUgbmV0d29ya1RpbWVvdXRcbiAgICAvLyBkaWRuJ3QgdGhyb3c7IGNsZWFyIHRoZSBuZXR3b3JrIHRpbWVvdXQgZGVsYXkgc28gdGhhdCBOb2RlIHdvbid0IGhhbmdcbiAgICBuZXR3b3JrVGltZW91dC5jbGVhck5ldHdvcmtUaW1lb3V0KCk7XG5cbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgIGlmICgnbmVlZENvbmZpcm1hdGlvbicgaW4ganNvbikge1xuICAgICAgdGhyb3cgX21ha2VUYWdnZWRFcnJvcihhdXRoLCBBdXRoRXJyb3JDb2RlLk5FRURfQ09ORklSTUFUSU9OLCBqc29uKTtcbiAgICB9XG5cbiAgICBpZiAocmVzcG9uc2Uub2sgJiYgISgnZXJyb3JNZXNzYWdlJyBpbiBqc29uKSkge1xuICAgICAgcmV0dXJuIGpzb247XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IHJlc3BvbnNlLm9rID8ganNvbi5lcnJvck1lc3NhZ2UgOiBqc29uLmVycm9yLm1lc3NhZ2U7XG4gICAgICBjb25zdCBbc2VydmVyRXJyb3JDb2RlLCBzZXJ2ZXJFcnJvck1lc3NhZ2VdID0gZXJyb3JNZXNzYWdlLnNwbGl0KCcgOiAnKTtcbiAgICAgIGlmIChzZXJ2ZXJFcnJvckNvZGUgPT09IFNlcnZlckVycm9yLkZFREVSQVRFRF9VU0VSX0lEX0FMUkVBRFlfTElOS0VEKSB7XG4gICAgICAgIHRocm93IF9tYWtlVGFnZ2VkRXJyb3IoXG4gICAgICAgICAgYXV0aCxcbiAgICAgICAgICBBdXRoRXJyb3JDb2RlLkNSRURFTlRJQUxfQUxSRUFEWV9JTl9VU0UsXG4gICAgICAgICAganNvblxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChzZXJ2ZXJFcnJvckNvZGUgPT09IFNlcnZlckVycm9yLkVNQUlMX0VYSVNUUykge1xuICAgICAgICB0aHJvdyBfbWFrZVRhZ2dlZEVycm9yKGF1dGgsIEF1dGhFcnJvckNvZGUuRU1BSUxfRVhJU1RTLCBqc29uKTtcbiAgICAgIH0gZWxzZSBpZiAoc2VydmVyRXJyb3JDb2RlID09PSBTZXJ2ZXJFcnJvci5VU0VSX0RJU0FCTEVEKSB7XG4gICAgICAgIHRocm93IF9tYWtlVGFnZ2VkRXJyb3IoYXV0aCwgQXV0aEVycm9yQ29kZS5VU0VSX0RJU0FCTEVELCBqc29uKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGF1dGhFcnJvciA9XG4gICAgICAgIGVycm9yTWFwW3NlcnZlckVycm9yQ29kZSBhcyBTZXJ2ZXJFcnJvcl0gfHxcbiAgICAgICAgKHNlcnZlckVycm9yQ29kZVxuICAgICAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgLnJlcGxhY2UoL1tfXFxzXSsvZywgJy0nKSBhcyB1bmtub3duIGFzIEF1dGhFcnJvckNvZGUpO1xuICAgICAgaWYgKHNlcnZlckVycm9yTWVzc2FnZSkge1xuICAgICAgICB0aHJvdyBfZXJyb3JXaXRoQ3VzdG9tTWVzc2FnZShhdXRoLCBhdXRoRXJyb3IsIHNlcnZlckVycm9yTWVzc2FnZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfZmFpbChhdXRoLCBhdXRoRXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmIChlIGluc3RhbmNlb2YgRmlyZWJhc2VFcnJvcikge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgLy8gQ2hhbmdpbmcgdGhpcyB0byBhIGRpZmZlcmVudCBlcnJvciBjb2RlIHdpbGwgbG9nIHVzZXIgb3V0IHdoZW4gdGhlcmUgaXMgYSBuZXR3b3JrIGVycm9yXG4gICAgLy8gYmVjYXVzZSB3ZSB0cmVhdCBhbnkgZXJyb3Igb3RoZXIgdGhhbiBORVRXT1JLX1JFUVVFU1RfRkFJTEVEIGFzIHRva2VuIGlzIGludmFsaWQuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZpcmViYXNlL2ZpcmViYXNlLWpzLXNkay9ibG9iLzRmYmM3MzYxMGQ3MGJlNGUwODUyZTdkZTYzYTM5Y2I3ODk3ZTg1NDYvcGFja2FnZXMvYXV0aC9zcmMvY29yZS9hdXRoL2F1dGhfaW1wbC50cyNMMzA5LUwzMTZcbiAgICBfZmFpbChhdXRoLCBBdXRoRXJyb3JDb2RlLk5FVFdPUktfUkVRVUVTVF9GQUlMRUQsIHsgJ21lc3NhZ2UnOiBTdHJpbmcoZSkgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF9wZXJmb3JtU2lnbkluUmVxdWVzdDxULCBWIGV4dGVuZHMgSWRUb2tlblJlc3BvbnNlPihcbiAgYXV0aDogQXV0aCxcbiAgbWV0aG9kOiBIdHRwTWV0aG9kLFxuICBwYXRoOiBFbmRwb2ludCxcbiAgcmVxdWVzdD86IFQsXG4gIGN1c3RvbUVycm9yTWFwOiBQYXJ0aWFsPFNlcnZlckVycm9yTWFwPFNlcnZlckVycm9yPj4gPSB7fVxuKTogUHJvbWlzZTxWPiB7XG4gIGNvbnN0IHNlcnZlclJlc3BvbnNlID0gKGF3YWl0IF9wZXJmb3JtQXBpUmVxdWVzdDxULCBWIHwgSWRUb2tlbk1mYVJlc3BvbnNlPihcbiAgICBhdXRoLFxuICAgIG1ldGhvZCxcbiAgICBwYXRoLFxuICAgIHJlcXVlc3QsXG4gICAgY3VzdG9tRXJyb3JNYXBcbiAgKSkgYXMgVjtcbiAgaWYgKCdtZmFQZW5kaW5nQ3JlZGVudGlhbCcgaW4gc2VydmVyUmVzcG9uc2UpIHtcbiAgICBfZmFpbChhdXRoLCBBdXRoRXJyb3JDb2RlLk1GQV9SRVFVSVJFRCwge1xuICAgICAgX3NlcnZlclJlc3BvbnNlOiBzZXJ2ZXJSZXNwb25zZVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHNlcnZlclJlc3BvbnNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX2dldEZpbmFsVGFyZ2V0KFxuICBhdXRoOiBBdXRoLFxuICBob3N0OiBzdHJpbmcsXG4gIHBhdGg6IHN0cmluZyxcbiAgcXVlcnk6IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgYmFzZSA9IGAke2hvc3R9JHtwYXRofT8ke3F1ZXJ5fWA7XG5cbiAgaWYgKCEoYXV0aCBhcyBBdXRoSW50ZXJuYWwpLmNvbmZpZy5lbXVsYXRvcikge1xuICAgIHJldHVybiBgJHthdXRoLmNvbmZpZy5hcGlTY2hlbWV9Oi8vJHtiYXNlfWA7XG4gIH1cblxuICByZXR1cm4gX2VtdWxhdG9yVXJsKGF1dGguY29uZmlnIGFzIENvbmZpZ0ludGVybmFsLCBiYXNlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9wYXJzZUVuZm9yY2VtZW50U3RhdGUoXG4gIGVuZm9yY2VtZW50U3RhdGVTdHI6IHN0cmluZ1xuKTogRW5mb3JjZW1lbnRTdGF0ZSB7XG4gIHN3aXRjaCAoZW5mb3JjZW1lbnRTdGF0ZVN0cikge1xuICAgIGNhc2UgJ0VORk9SQ0UnOlxuICAgICAgcmV0dXJuIEVuZm9yY2VtZW50U3RhdGUuRU5GT1JDRTtcbiAgICBjYXNlICdBVURJVCc6XG4gICAgICByZXR1cm4gRW5mb3JjZW1lbnRTdGF0ZS5BVURJVDtcbiAgICBjYXNlICdPRkYnOlxuICAgICAgcmV0dXJuIEVuZm9yY2VtZW50U3RhdGUuT0ZGO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gRW5mb3JjZW1lbnRTdGF0ZS5FTkZPUkNFTUVOVF9TVEFURV9VTlNQRUNJRklFRDtcbiAgfVxufVxuXG5jbGFzcyBOZXR3b3JrVGltZW91dDxUPiB7XG4gIC8vIE5vZGUgdGltZXJzIGFuZCBicm93c2VyIHRpbWVycyBhcmUgZnVuZGFtZW50YWxseSBpbmNvbXBhdGlibGUsIGJ1dCB3ZVxuICAvLyBkb24ndCBjYXJlIGFib3V0IHRoZSB2YWx1ZSBoZXJlXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByaXZhdGUgdGltZXI6IGFueSB8IG51bGwgPSBudWxsO1xuICByZWFkb25seSBwcm9taXNlID0gbmV3IFByb21pc2U8VD4oKF8sIHJlamVjdCkgPT4ge1xuICAgIHRoaXMudGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHJldHVybiByZWplY3QoXG4gICAgICAgIF9jcmVhdGVFcnJvcih0aGlzLmF1dGgsIEF1dGhFcnJvckNvZGUuTkVUV09SS19SRVFVRVNUX0ZBSUxFRClcbiAgICAgICk7XG4gICAgfSwgREVGQVVMVF9BUElfVElNRU9VVF9NUy5nZXQoKSk7XG4gIH0pO1xuXG4gIGNsZWFyTmV0d29ya1RpbWVvdXQoKTogdm9pZCB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBhdXRoOiBBdXRoKSB7fVxufVxuXG5pbnRlcmZhY2UgUG90ZW50aWFsUmVzcG9uc2UgZXh0ZW5kcyBJZFRva2VuUmVzcG9uc2Uge1xuICBlbWFpbD86IHN0cmluZztcbiAgcGhvbmVOdW1iZXI/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfbWFrZVRhZ2dlZEVycm9yKFxuICBhdXRoOiBBdXRoLFxuICBjb2RlOiBBdXRoRXJyb3JDb2RlLFxuICByZXNwb25zZTogUG90ZW50aWFsUmVzcG9uc2Vcbik6IEZpcmViYXNlRXJyb3Ige1xuICBjb25zdCBlcnJvclBhcmFtczogTmFtZWRFcnJvclBhcmFtcyA9IHtcbiAgICBhcHBOYW1lOiBhdXRoLm5hbWVcbiAgfTtcblxuICBpZiAocmVzcG9uc2UuZW1haWwpIHtcbiAgICBlcnJvclBhcmFtcy5lbWFpbCA9IHJlc3BvbnNlLmVtYWlsO1xuICB9XG4gIGlmIChyZXNwb25zZS5waG9uZU51bWJlcikge1xuICAgIGVycm9yUGFyYW1zLnBob25lTnVtYmVyID0gcmVzcG9uc2UucGhvbmVOdW1iZXI7XG4gIH1cblxuICBjb25zdCBlcnJvciA9IF9jcmVhdGVFcnJvcihhdXRoLCBjb2RlLCBlcnJvclBhcmFtcyk7XG5cbiAgLy8gV2Uga25vdyBjdXN0b21EYXRhIGlzIGRlZmluZWQgb24gZXJyb3IgYmVjYXVzZSBlcnJvclBhcmFtcyBpcyBkZWZpbmVkXG4gIChlcnJvci5jdXN0b21EYXRhISBhcyBUYWdnZWRXaXRoVG9rZW5SZXNwb25zZSkuX3Rva2VuUmVzcG9uc2UgPSByZXNwb25zZTtcbiAgcmV0dXJuIGVycm9yO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IFJlY2FwdGNoYVBhcmFtZXRlcnMgfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuaW1wb3J0IHtcbiAgR2V0UmVjYXB0Y2hhQ29uZmlnUmVzcG9uc2UsXG4gIFJlY2FwdGNoYUVuZm9yY2VtZW50UHJvdmlkZXJTdGF0ZVxufSBmcm9tICcuLi8uLi9hcGkvYXV0aGVudGljYXRpb24vcmVjYXB0Y2hhJztcbmltcG9ydCB7IEVuZm9yY2VtZW50U3RhdGUsIF9wYXJzZUVuZm9yY2VtZW50U3RhdGUgfSBmcm9tICcuLi8uLi9hcGkvaW5kZXgnO1xuXG4vLyByZUNBUFRDSEEgdjIgaW50ZXJmYWNlXG5leHBvcnQgaW50ZXJmYWNlIFJlY2FwdGNoYSB7XG4gIHJlbmRlcjogKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHBhcmFtZXRlcnM6IFJlY2FwdGNoYVBhcmFtZXRlcnMpID0+IG51bWJlcjtcbiAgZ2V0UmVzcG9uc2U6IChpZDogbnVtYmVyKSA9PiBzdHJpbmc7XG4gIGV4ZWN1dGU6IChpZDogbnVtYmVyKSA9PiB1bmtub3duO1xuICByZXNldDogKGlkOiBudW1iZXIpID0+IHVua25vd247XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1YyKFxuICBncmVjYXB0Y2hhOiBSZWNhcHRjaGEgfCBHcmVDQVBUQ0hBIHwgdW5kZWZpbmVkXG4pOiBncmVjYXB0Y2hhIGlzIFJlY2FwdGNoYSB7XG4gIHJldHVybiAoXG4gICAgZ3JlY2FwdGNoYSAhPT0gdW5kZWZpbmVkICYmXG4gICAgKGdyZWNhcHRjaGEgYXMgUmVjYXB0Y2hhKS5nZXRSZXNwb25zZSAhPT0gdW5kZWZpbmVkXG4gICk7XG59XG5cbi8vIHJlQ0FQVENIQSBFbnRlcnByaXNlICYgdjMgc2hhcmVkIGludGVyZmFjZVxuZXhwb3J0IGludGVyZmFjZSBHcmVDQVBUQ0hBVG9wTGV2ZWwgZXh0ZW5kcyBHcmVDQVBUQ0hBIHtcbiAgZW50ZXJwcmlzZTogR3JlQ0FQVENIQTtcbn1cblxuLy8gcmVDQVBUQ0hBIEVudGVycHJpc2UgaW50ZXJmYWNlXG5leHBvcnQgaW50ZXJmYWNlIEdyZUNBUFRDSEEge1xuICByZWFkeTogKGNhbGxiYWNrOiAoKSA9PiB2b2lkKSA9PiB2b2lkO1xuICBleGVjdXRlOiAoc2l0ZUtleTogc3RyaW5nLCBvcHRpb25zOiB7IGFjdGlvbjogc3RyaW5nIH0pID0+IFByb21pc2U8c3RyaW5nPjtcbiAgcmVuZGVyOiAoXG4gICAgY29udGFpbmVyOiBzdHJpbmcgfCBIVE1MRWxlbWVudCxcbiAgICBwYXJhbWV0ZXJzOiBHcmVDQVBUQ0hBUmVuZGVyT3B0aW9uXG4gICkgPT4gc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdyZUNBUFRDSEFSZW5kZXJPcHRpb24ge1xuICBzaXRla2V5OiBzdHJpbmc7XG4gIHNpemU6ICdpbnZpc2libGUnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFbnRlcnByaXNlKFxuICBncmVjYXB0Y2hhOiBSZWNhcHRjaGEgfCBHcmVDQVBUQ0hBIHwgdW5kZWZpbmVkXG4pOiBncmVjYXB0Y2hhIGlzIEdyZUNBUFRDSEFUb3BMZXZlbCB7XG4gIHJldHVybiAoXG4gICAgZ3JlY2FwdGNoYSAhPT0gdW5kZWZpbmVkICYmXG4gICAgKGdyZWNhcHRjaGEgYXMgR3JlQ0FQVENIQVRvcExldmVsKS5lbnRlcnByaXNlICE9PSB1bmRlZmluZWRcbiAgKTtcbn1cblxuLy8gVE9ETyhjaHVhbnIpOiBSZXBsYWNlIHRoaXMgd2l0aCB0aGUgQXV0aFdpbmRvdyBhZnRlciByZXNvbHZpbmcgdGhlIGRlcGVuZGVuY3kgaXNzdWUgaW4gTm9kZS5qcyBlbnYuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBXaW5kb3cge1xuICAgIGdyZWNhcHRjaGE/OiBSZWNhcHRjaGEgfCBHcmVDQVBUQ0hBVG9wTGV2ZWw7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlY2FwdGNoYUNvbmZpZyB7XG4gIC8qKlxuICAgKiBUaGUgcmVDQVBUQ0hBIHNpdGUga2V5LlxuICAgKi9cbiAgc2l0ZUtleTogc3RyaW5nID0gJyc7XG5cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIHByb3ZpZGVycyBhbmQgdGhlaXIgZW5hYmxlbWVudCBzdGF0dXMgZm9yIHJlQ0FQVENIQSBFbnRlcnByaXNlLlxuICAgKi9cbiAgcmVjYXB0Y2hhRW5mb3JjZW1lbnRTdGF0ZTogUmVjYXB0Y2hhRW5mb3JjZW1lbnRQcm92aWRlclN0YXRlW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihyZXNwb25zZTogR2V0UmVjYXB0Y2hhQ29uZmlnUmVzcG9uc2UpIHtcbiAgICBpZiAocmVzcG9uc2UucmVjYXB0Y2hhS2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncmVjYXB0Y2hhS2V5IHVuZGVmaW5lZCcpO1xuICAgIH1cbiAgICAvLyBFeGFtcGxlIHJlc3BvbnNlLnJlY2FwdGNoYUtleTogXCJwcm9qZWN0cy9wcm9qMTIzL2tleXMvc2l0ZWtleTEyM1wiXG4gICAgdGhpcy5zaXRlS2V5ID0gcmVzcG9uc2UucmVjYXB0Y2hhS2V5LnNwbGl0KCcvJylbM107XG4gICAgdGhpcy5yZWNhcHRjaGFFbmZvcmNlbWVudFN0YXRlID0gcmVzcG9uc2UucmVjYXB0Y2hhRW5mb3JjZW1lbnRTdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSByZUNBUFRDSEEgRW50ZXJwcmlzZSBlbmZvcmNlbWVudCBzdGF0ZSBmb3IgdGhlIGdpdmVuIHByb3ZpZGVyLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvdmlkZXJTdHIgLSBUaGUgcHJvdmlkZXIgd2hvc2UgZW5mb3JjZW1lbnQgc3RhdGUgaXMgdG8gYmUgcmV0dXJuZWQuXG4gICAqIEByZXR1cm5zIFRoZSByZUNBUFRDSEEgRW50ZXJwcmlzZSBlbmZvcmNlbWVudCBzdGF0ZSBmb3IgdGhlIGdpdmVuIHByb3ZpZGVyLlxuICAgKi9cbiAgZ2V0UHJvdmlkZXJFbmZvcmNlbWVudFN0YXRlKHByb3ZpZGVyU3RyOiBzdHJpbmcpOiBFbmZvcmNlbWVudFN0YXRlIHwgbnVsbCB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMucmVjYXB0Y2hhRW5mb3JjZW1lbnRTdGF0ZSB8fFxuICAgICAgdGhpcy5yZWNhcHRjaGFFbmZvcmNlbWVudFN0YXRlLmxlbmd0aCA9PT0gMFxuICAgICkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCByZWNhcHRjaGFFbmZvcmNlbWVudFN0YXRlIG9mIHRoaXMucmVjYXB0Y2hhRW5mb3JjZW1lbnRTdGF0ZSkge1xuICAgICAgaWYgKFxuICAgICAgICByZWNhcHRjaGFFbmZvcmNlbWVudFN0YXRlLnByb3ZpZGVyICYmXG4gICAgICAgIHJlY2FwdGNoYUVuZm9yY2VtZW50U3RhdGUucHJvdmlkZXIgPT09IHByb3ZpZGVyU3RyXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIF9wYXJzZUVuZm9yY2VtZW50U3RhdGUoXG4gICAgICAgICAgcmVjYXB0Y2hhRW5mb3JjZW1lbnRTdGF0ZS5lbmZvcmNlbWVudFN0YXRlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcmVDQVBUQ0hBIEVudGVycHJpc2UgZW5mb3JjZW1lbnQgc3RhdGUgZm9yIHRoZSBwcm92aWRlciBpcyBzZXQgdG8gRU5GT1JDRSBvciBBVURJVC5cbiAgICpcbiAgICogQHBhcmFtIHByb3ZpZGVyU3RyIC0gVGhlIHByb3ZpZGVyIHdob3NlIGVuYWJsZW1lbnQgc3RhdGUgaXMgdG8gYmUgcmV0dXJuZWQuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHJlQ0FQVENIQSBFbnRlcnByaXNlIHByb3RlY3Rpb24gaXMgZW5hYmxlZCBmb3IgdGhlIGdpdmVuIHByb3ZpZGVyLlxuICAgKi9cbiAgaXNQcm92aWRlckVuYWJsZWQocHJvdmlkZXJTdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmdldFByb3ZpZGVyRW5mb3JjZW1lbnRTdGF0ZShwcm92aWRlclN0cikgPT09XG4gICAgICAgIEVuZm9yY2VtZW50U3RhdGUuRU5GT1JDRSB8fFxuICAgICAgdGhpcy5nZXRQcm92aWRlckVuZm9yY2VtZW50U3RhdGUocHJvdmlkZXJTdHIpID09PSBFbmZvcmNlbWVudFN0YXRlLkFVRElUXG4gICAgKTtcbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gIEVuZHBvaW50LFxuICBIdHRwTWV0aG9kLFxuICBSZWNhcHRjaGFDbGllbnRUeXBlLFxuICBSZWNhcHRjaGFWZXJzaW9uLFxuICBfcGVyZm9ybUFwaVJlcXVlc3QsXG4gIF9hZGRUaWRJZk5lY2Vzc2FyeVxufSBmcm9tICcuLi9pbmRleCc7XG5pbXBvcnQgeyBBdXRoIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcblxuaW50ZXJmYWNlIEdldFJlY2FwdGNoYVBhcmFtUmVzcG9uc2Uge1xuICByZWNhcHRjaGFTaXRlS2V5Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UmVjYXB0Y2hhUGFyYW1zKGF1dGg6IEF1dGgpOiBQcm9taXNlPHN0cmluZz4ge1xuICByZXR1cm4gKFxuICAgIChcbiAgICAgIGF3YWl0IF9wZXJmb3JtQXBpUmVxdWVzdDx2b2lkLCBHZXRSZWNhcHRjaGFQYXJhbVJlc3BvbnNlPihcbiAgICAgICAgYXV0aCxcbiAgICAgICAgSHR0cE1ldGhvZC5HRVQsXG4gICAgICAgIEVuZHBvaW50LkdFVF9SRUNBUFRDSEFfUEFSQU1cbiAgICAgIClcbiAgICApLnJlY2FwdGNoYVNpdGVLZXkgfHwgJydcbiAgKTtcbn1cblxuLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGZvciByZUNBUFRDSEEgZW50ZXJwcmlzZSBpbnRlZ3JhdGlvbi5cbmludGVyZmFjZSBHZXRSZWNhcHRjaGFDb25maWdSZXF1ZXN0IHtcbiAgdGVuYW50SWQ/OiBzdHJpbmc7XG4gIGNsaWVudFR5cGU/OiBSZWNhcHRjaGFDbGllbnRUeXBlO1xuICB2ZXJzaW9uPzogUmVjYXB0Y2hhVmVyc2lvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWNhcHRjaGFFbmZvcmNlbWVudFByb3ZpZGVyU3RhdGUge1xuICBwcm92aWRlcjogc3RyaW5nO1xuICBlbmZvcmNlbWVudFN0YXRlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0UmVjYXB0Y2hhQ29uZmlnUmVzcG9uc2Uge1xuICByZWNhcHRjaGFLZXk6IHN0cmluZztcbiAgcmVjYXB0Y2hhRW5mb3JjZW1lbnRTdGF0ZTogUmVjYXB0Y2hhRW5mb3JjZW1lbnRQcm92aWRlclN0YXRlW107XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRSZWNhcHRjaGFDb25maWcoXG4gIGF1dGg6IEF1dGgsXG4gIHJlcXVlc3Q6IEdldFJlY2FwdGNoYUNvbmZpZ1JlcXVlc3Rcbik6IFByb21pc2U8R2V0UmVjYXB0Y2hhQ29uZmlnUmVzcG9uc2U+IHtcbiAgcmV0dXJuIF9wZXJmb3JtQXBpUmVxdWVzdDxcbiAgICBHZXRSZWNhcHRjaGFDb25maWdSZXF1ZXN0LFxuICAgIEdldFJlY2FwdGNoYUNvbmZpZ1Jlc3BvbnNlXG4gID4oXG4gICAgYXV0aCxcbiAgICBIdHRwTWV0aG9kLkdFVCxcbiAgICBFbmRwb2ludC5HRVRfUkVDQVBUQ0hBX0NPTkZJRyxcbiAgICBfYWRkVGlkSWZOZWNlc3NhcnkoYXV0aCwgcmVxdWVzdClcbiAgKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBFbmRwb2ludCwgSHR0cE1ldGhvZCwgX3BlcmZvcm1BcGlSZXF1ZXN0IH0gZnJvbSAnLi4vaW5kZXgnO1xuaW1wb3J0IHsgTWZhRW5yb2xsbWVudCB9IGZyb20gJy4vbWZhJztcbmltcG9ydCB7IEF1dGggfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIERlbGV0ZUFjY291bnRSZXF1ZXN0IHtcbiAgaWRUb2tlbjogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsZXRlQWNjb3VudChcbiAgYXV0aDogQXV0aCxcbiAgcmVxdWVzdDogRGVsZXRlQWNjb3VudFJlcXVlc3Rcbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gX3BlcmZvcm1BcGlSZXF1ZXN0PERlbGV0ZUFjY291bnRSZXF1ZXN0LCB2b2lkPihcbiAgICBhdXRoLFxuICAgIEh0dHBNZXRob2QuUE9TVCxcbiAgICBFbmRwb2ludC5ERUxFVEVfQUNDT1VOVCxcbiAgICByZXF1ZXN0XG4gICk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdmlkZXJVc2VySW5mbyB7XG4gIHByb3ZpZGVySWQ6IHN0cmluZztcbiAgcmF3SWQ/OiBzdHJpbmc7XG4gIGVtYWlsPzogc3RyaW5nO1xuICBkaXNwbGF5TmFtZT86IHN0cmluZztcbiAgcGhvdG9Vcmw/OiBzdHJpbmc7XG4gIHBob25lTnVtYmVyPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlbGV0ZUxpbmtlZEFjY291bnRzUmVxdWVzdCB7XG4gIGlkVG9rZW46IHN0cmluZztcbiAgZGVsZXRlUHJvdmlkZXI6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlbGV0ZUxpbmtlZEFjY291bnRzUmVzcG9uc2Uge1xuICBwcm92aWRlclVzZXJJbmZvOiBQcm92aWRlclVzZXJJbmZvW107XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVMaW5rZWRBY2NvdW50cyhcbiAgYXV0aDogQXV0aCxcbiAgcmVxdWVzdDogRGVsZXRlTGlua2VkQWNjb3VudHNSZXF1ZXN0XG4pOiBQcm9taXNlPERlbGV0ZUxpbmtlZEFjY291bnRzUmVzcG9uc2U+IHtcbiAgcmV0dXJuIF9wZXJmb3JtQXBpUmVxdWVzdDxcbiAgICBEZWxldGVMaW5rZWRBY2NvdW50c1JlcXVlc3QsXG4gICAgRGVsZXRlTGlua2VkQWNjb3VudHNSZXNwb25zZVxuICA+KGF1dGgsIEh0dHBNZXRob2QuUE9TVCwgRW5kcG9pbnQuU0VUX0FDQ09VTlRfSU5GTywgcmVxdWVzdCk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQVBJVXNlckluZm8ge1xuICBsb2NhbElkPzogc3RyaW5nO1xuICBkaXNwbGF5TmFtZT86IHN0cmluZztcbiAgcGhvdG9Vcmw/OiBzdHJpbmc7XG4gIGVtYWlsPzogc3RyaW5nO1xuICBlbWFpbFZlcmlmaWVkPzogYm9vbGVhbjtcbiAgcGhvbmVOdW1iZXI/OiBzdHJpbmc7XG4gIGxhc3RMb2dpbkF0PzogbnVtYmVyO1xuICBjcmVhdGVkQXQ/OiBudW1iZXI7XG4gIHRlbmFudElkPzogc3RyaW5nO1xuICBwYXNzd29yZEhhc2g/OiBzdHJpbmc7XG4gIHByb3ZpZGVyVXNlckluZm8/OiBQcm92aWRlclVzZXJJbmZvW107XG4gIG1mYUluZm8/OiBNZmFFbnJvbGxtZW50W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QWNjb3VudEluZm9SZXF1ZXN0IHtcbiAgaWRUb2tlbjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldEFjY291bnRJbmZvUmVzcG9uc2Uge1xuICB1c2VyczogQVBJVXNlckluZm9bXTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEFjY291bnRJbmZvKFxuICBhdXRoOiBBdXRoLFxuICByZXF1ZXN0OiBHZXRBY2NvdW50SW5mb1JlcXVlc3Rcbik6IFByb21pc2U8R2V0QWNjb3VudEluZm9SZXNwb25zZT4ge1xuICByZXR1cm4gX3BlcmZvcm1BcGlSZXF1ZXN0PEdldEFjY291bnRJbmZvUmVxdWVzdCwgR2V0QWNjb3VudEluZm9SZXNwb25zZT4oXG4gICAgYXV0aCxcbiAgICBIdHRwTWV0aG9kLlBPU1QsXG4gICAgRW5kcG9pbnQuR0VUX0FDQ09VTlRfSU5GTyxcbiAgICByZXF1ZXN0XG4gICk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHV0Y1RpbWVzdGFtcFRvRGF0ZVN0cmluZyhcbiAgdXRjVGltZXN0YW1wPzogc3RyaW5nIHwgbnVtYmVyXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIXV0Y1RpbWVzdGFtcCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgdHJ5IHtcbiAgICAvLyBDb252ZXJ0IHRvIGRhdGUgb2JqZWN0LlxuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShOdW1iZXIodXRjVGltZXN0YW1wKSk7XG4gICAgLy8gVGVzdCBkYXRlIGlzIHZhbGlkLlxuICAgIGlmICghaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSB7XG4gICAgICAvLyBDb252ZXJ0IHRvIFVUQyBkYXRlIHN0cmluZy5cbiAgICAgIHJldHVybiBkYXRlLnRvVVRDU3RyaW5nKCk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gRG8gbm90aGluZy4gdW5kZWZpbmVkIHdpbGwgYmUgcmV0dXJuZWQuXG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBJZFRva2VuUmVzdWx0LCBQYXJzZWRUb2tlbiwgVXNlciB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5pbXBvcnQgeyBiYXNlNjREZWNvZGUsIGdldE1vZHVsYXJJbnN0YW5jZSB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcblxuaW1wb3J0IHsgVXNlckludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvdXNlcic7XG5pbXBvcnQgeyBfYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQnO1xuaW1wb3J0IHsgX2xvZ0Vycm9yIH0gZnJvbSAnLi4vdXRpbC9sb2cnO1xuaW1wb3J0IHsgdXRjVGltZXN0YW1wVG9EYXRlU3RyaW5nIH0gZnJvbSAnLi4vdXRpbC90aW1lJztcbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG4vKipcbiAqIFJldHVybnMgYSBKU09OIFdlYiBUb2tlbiAoSldUKSB1c2VkIHRvIGlkZW50aWZ5IHRoZSB1c2VyIHRvIGEgRmlyZWJhc2Ugc2VydmljZS5cbiAqXG4gKiBAcmVtYXJrc1xuICogUmV0dXJucyB0aGUgY3VycmVudCB0b2tlbiBpZiBpdCBoYXMgbm90IGV4cGlyZWQgb3IgaWYgaXQgd2lsbCBub3QgZXhwaXJlIGluIHRoZSBuZXh0IGZpdmVcbiAqIG1pbnV0ZXMuIE90aGVyd2lzZSwgdGhpcyB3aWxsIHJlZnJlc2ggdGhlIHRva2VuIGFuZCByZXR1cm4gYSBuZXcgb25lLlxuICpcbiAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIuXG4gKiBAcGFyYW0gZm9yY2VSZWZyZXNoIC0gRm9yY2UgcmVmcmVzaCByZWdhcmRsZXNzIG9mIHRva2VuIGV4cGlyYXRpb24uXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SWRUb2tlbih1c2VyOiBVc2VyLCBmb3JjZVJlZnJlc2ggPSBmYWxzZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiBnZXRNb2R1bGFySW5zdGFuY2UodXNlcikuZ2V0SWRUb2tlbihmb3JjZVJlZnJlc2gpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBkZXNlcmlhbGl6ZWQgSlNPTiBXZWIgVG9rZW4gKEpXVCkgdXNlZCB0byBpZGVudGlmeSB0aGUgdXNlciB0byBhIEZpcmViYXNlIHNlcnZpY2UuXG4gKlxuICogQHJlbWFya3NcbiAqIFJldHVybnMgdGhlIGN1cnJlbnQgdG9rZW4gaWYgaXQgaGFzIG5vdCBleHBpcmVkIG9yIGlmIGl0IHdpbGwgbm90IGV4cGlyZSBpbiB0aGUgbmV4dCBmaXZlXG4gKiBtaW51dGVzLiBPdGhlcndpc2UsIHRoaXMgd2lsbCByZWZyZXNoIHRoZSB0b2tlbiBhbmQgcmV0dXJuIGEgbmV3IG9uZS5cbiAqXG4gKiBAcGFyYW0gdXNlciAtIFRoZSB1c2VyLlxuICogQHBhcmFtIGZvcmNlUmVmcmVzaCAtIEZvcmNlIHJlZnJlc2ggcmVnYXJkbGVzcyBvZiB0b2tlbiBleHBpcmF0aW9uLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldElkVG9rZW5SZXN1bHQoXG4gIHVzZXI6IFVzZXIsXG4gIGZvcmNlUmVmcmVzaCA9IGZhbHNlXG4pOiBQcm9taXNlPElkVG9rZW5SZXN1bHQ+IHtcbiAgY29uc3QgdXNlckludGVybmFsID0gZ2V0TW9kdWxhckluc3RhbmNlKHVzZXIpIGFzIFVzZXJJbnRlcm5hbDtcbiAgY29uc3QgdG9rZW4gPSBhd2FpdCB1c2VySW50ZXJuYWwuZ2V0SWRUb2tlbihmb3JjZVJlZnJlc2gpO1xuICBjb25zdCBjbGFpbXMgPSBfcGFyc2VUb2tlbih0b2tlbik7XG5cbiAgX2Fzc2VydChcbiAgICBjbGFpbXMgJiYgY2xhaW1zLmV4cCAmJiBjbGFpbXMuYXV0aF90aW1lICYmIGNsYWltcy5pYXQsXG4gICAgdXNlckludGVybmFsLmF1dGgsXG4gICAgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUlxuICApO1xuICBjb25zdCBmaXJlYmFzZSA9XG4gICAgdHlwZW9mIGNsYWltcy5maXJlYmFzZSA9PT0gJ29iamVjdCcgPyBjbGFpbXMuZmlyZWJhc2UgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3Qgc2lnbkluUHJvdmlkZXI6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGZpcmViYXNlPy5bJ3NpZ25faW5fcHJvdmlkZXInXTtcblxuICByZXR1cm4ge1xuICAgIGNsYWltcyxcbiAgICB0b2tlbixcbiAgICBhdXRoVGltZTogdXRjVGltZXN0YW1wVG9EYXRlU3RyaW5nKFxuICAgICAgc2Vjb25kc1N0cmluZ1RvTWlsbGlzZWNvbmRzKGNsYWltcy5hdXRoX3RpbWUpXG4gICAgKSEsXG4gICAgaXNzdWVkQXRUaW1lOiB1dGNUaW1lc3RhbXBUb0RhdGVTdHJpbmcoXG4gICAgICBzZWNvbmRzU3RyaW5nVG9NaWxsaXNlY29uZHMoY2xhaW1zLmlhdClcbiAgICApISxcbiAgICBleHBpcmF0aW9uVGltZTogdXRjVGltZXN0YW1wVG9EYXRlU3RyaW5nKFxuICAgICAgc2Vjb25kc1N0cmluZ1RvTWlsbGlzZWNvbmRzKGNsYWltcy5leHApXG4gICAgKSEsXG4gICAgc2lnbkluUHJvdmlkZXI6IHNpZ25JblByb3ZpZGVyIHx8IG51bGwsXG4gICAgc2lnbkluU2Vjb25kRmFjdG9yOiBmaXJlYmFzZT8uWydzaWduX2luX3NlY29uZF9mYWN0b3InXSB8fCBudWxsXG4gIH07XG59XG5cbmZ1bmN0aW9uIHNlY29uZHNTdHJpbmdUb01pbGxpc2Vjb25kcyhzZWNvbmRzOiBzdHJpbmcpOiBudW1iZXIge1xuICByZXR1cm4gTnVtYmVyKHNlY29uZHMpICogMTAwMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9wYXJzZVRva2VuKHRva2VuOiBzdHJpbmcpOiBQYXJzZWRUb2tlbiB8IG51bGwge1xuICBjb25zdCBbYWxnb3JpdGhtLCBwYXlsb2FkLCBzaWduYXR1cmVdID0gdG9rZW4uc3BsaXQoJy4nKTtcbiAgaWYgKFxuICAgIGFsZ29yaXRobSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgcGF5bG9hZCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgc2lnbmF0dXJlID09PSB1bmRlZmluZWRcbiAgKSB7XG4gICAgX2xvZ0Vycm9yKCdKV1QgbWFsZm9ybWVkLCBjb250YWluZWQgZmV3ZXIgdGhhbiAzIHNlY3Rpb25zJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGRlY29kZWQgPSBiYXNlNjREZWNvZGUocGF5bG9hZCk7XG4gICAgaWYgKCFkZWNvZGVkKSB7XG4gICAgICBfbG9nRXJyb3IoJ0ZhaWxlZCB0byBkZWNvZGUgYmFzZTY0IEpXVCBwYXlsb2FkJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoZGVjb2RlZCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBfbG9nRXJyb3IoXG4gICAgICAnQ2F1Z2h0IGVycm9yIHBhcnNpbmcgSldUIHBheWxvYWQgYXMgSlNPTicsXG4gICAgICAoZSBhcyBFcnJvcik/LnRvU3RyaW5nKClcbiAgICApO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogRXh0cmFjdCBleHBpcmVzSW4gVFRMIGZyb20gYSB0b2tlbiBieSBzdWJ0cmFjdGluZyB0aGUgZXhwaXJhdGlvbiBmcm9tIHRoZSBpc3N1YW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF90b2tlbkV4cGlyZXNJbih0b2tlbjogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgcGFyc2VkVG9rZW4gPSBfcGFyc2VUb2tlbih0b2tlbik7XG4gIF9hc3NlcnQocGFyc2VkVG9rZW4sIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IpO1xuICBfYXNzZXJ0KHR5cGVvZiBwYXJzZWRUb2tlbi5leHAgIT09ICd1bmRlZmluZWQnLCBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SKTtcbiAgX2Fzc2VydCh0eXBlb2YgcGFyc2VkVG9rZW4uaWF0ICE9PSAndW5kZWZpbmVkJywgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG4gIHJldHVybiBOdW1iZXIocGFyc2VkVG9rZW4uZXhwKSAtIE51bWJlcihwYXJzZWRUb2tlbi5pYXQpO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEZpcmViYXNlRXJyb3IgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5cbmltcG9ydCB7IFVzZXJJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL3VzZXInO1xuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBfbG9nb3V0SWZJbnZhbGlkYXRlZDxUPihcbiAgdXNlcjogVXNlckludGVybmFsLFxuICBwcm9taXNlOiBQcm9taXNlPFQ+LFxuICBieXBhc3NBdXRoU3RhdGUgPSBmYWxzZVxuKTogUHJvbWlzZTxUPiB7XG4gIGlmIChieXBhc3NBdXRoU3RhdGUpIHtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBwcm9taXNlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKGUgaW5zdGFuY2VvZiBGaXJlYmFzZUVycm9yICYmIGlzVXNlckludmFsaWRhdGVkKGUpKSB7XG4gICAgICBpZiAodXNlci5hdXRoLmN1cnJlbnRVc2VyID09PSB1c2VyKSB7XG4gICAgICAgIGF3YWl0IHVzZXIuYXV0aC5zaWduT3V0KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1VzZXJJbnZhbGlkYXRlZCh7IGNvZGUgfTogRmlyZWJhc2VFcnJvcik6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGNvZGUgPT09IGBhdXRoLyR7QXV0aEVycm9yQ29kZS5VU0VSX0RJU0FCTEVEfWAgfHxcbiAgICBjb2RlID09PSBgYXV0aC8ke0F1dGhFcnJvckNvZGUuVE9LRU5fRVhQSVJFRH1gXG4gICk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgRmlyZWJhc2VFcnJvciB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcbmltcG9ydCB7IFVzZXJJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL3VzZXInO1xuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbi8vIFJlZnJlc2ggdGhlIHRva2VuIGZpdmUgbWludXRlcyBiZWZvcmUgZXhwaXJhdGlvblxuZXhwb3J0IGNvbnN0IGVudW0gRHVyYXRpb24ge1xuICBPRkZTRVQgPSA1ICogMTAwMCAqIDYwLFxuICBSRVRSWV9CQUNLT0ZGX01JTiA9IDMwICogMTAwMCxcbiAgUkVUUllfQkFDS09GRl9NQVggPSAxNiAqIDYwICogMTAwMFxufVxuXG5leHBvcnQgY2xhc3MgUHJvYWN0aXZlUmVmcmVzaCB7XG4gIHByaXZhdGUgaXNSdW5uaW5nID0gZmFsc2U7XG5cbiAgLy8gTm9kZSB0aW1lcnMgYW5kIGJyb3dzZXIgdGltZXJzIHJldHVybiBmdW5kYW1lbnRhbGx5IGRpZmZlcmVudCB0eXBlcy5cbiAgLy8gV2UgZG9uJ3QgYWN0dWFsbHkgY2FyZSB3aGF0IHRoZSB2YWx1ZSBpcyBidXQgVFMgd29uJ3QgYWNjZXB0IHVua25vd24gYW5kXG4gIC8vIHdlIGNhbid0IGNhc3QgcHJvcGVybHkgaW4gYm90aCBlbnZpcm9ubWVudHMuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByaXZhdGUgdGltZXJJZDogYW55IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZXJyb3JCYWNrb2ZmID0gRHVyYXRpb24uUkVUUllfQkFDS09GRl9NSU47XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSB1c2VyOiBVc2VySW50ZXJuYWwpIHt9XG5cbiAgX3N0YXJ0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzUnVubmluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNSdW5uaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnNjaGVkdWxlKCk7XG4gIH1cblxuICBfc3RvcCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNSdW5uaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pc1J1bm5pbmcgPSBmYWxzZTtcbiAgICBpZiAodGhpcy50aW1lcklkICE9PSBudWxsKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcklkKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEludGVydmFsKHdhc0Vycm9yOiBib29sZWFuKTogbnVtYmVyIHtcbiAgICBpZiAod2FzRXJyb3IpIHtcbiAgICAgIGNvbnN0IGludGVydmFsID0gdGhpcy5lcnJvckJhY2tvZmY7XG4gICAgICB0aGlzLmVycm9yQmFja29mZiA9IE1hdGgubWluKFxuICAgICAgICB0aGlzLmVycm9yQmFja29mZiAqIDIsXG4gICAgICAgIER1cmF0aW9uLlJFVFJZX0JBQ0tPRkZfTUFYXG4gICAgICApO1xuICAgICAgcmV0dXJuIGludGVydmFsO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZXNldCB0aGUgZXJyb3IgYmFja29mZlxuICAgICAgdGhpcy5lcnJvckJhY2tvZmYgPSBEdXJhdGlvbi5SRVRSWV9CQUNLT0ZGX01JTjtcbiAgICAgIGNvbnN0IGV4cFRpbWUgPSB0aGlzLnVzZXIuc3RzVG9rZW5NYW5hZ2VyLmV4cGlyYXRpb25UaW1lID8/IDA7XG4gICAgICBjb25zdCBpbnRlcnZhbCA9IGV4cFRpbWUgLSBEYXRlLm5vdygpIC0gRHVyYXRpb24uT0ZGU0VUO1xuXG4gICAgICByZXR1cm4gTWF0aC5tYXgoMCwgaW50ZXJ2YWwpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2NoZWR1bGUod2FzRXJyb3IgPSBmYWxzZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1J1bm5pbmcpIHtcbiAgICAgIC8vIEp1c3QgaW4gY2FzZS4uLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGludGVydmFsID0gdGhpcy5nZXRJbnRlcnZhbCh3YXNFcnJvcik7XG4gICAgdGhpcy50aW1lcklkID0gc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLml0ZXJhdGlvbigpO1xuICAgIH0sIGludGVydmFsKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaXRlcmF0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnVzZXIuZ2V0SWRUb2tlbih0cnVlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBPbmx5IHJldHJ5IG9uIG5ldHdvcmsgZXJyb3JzXG4gICAgICBpZiAoXG4gICAgICAgIChlIGFzIEZpcmViYXNlRXJyb3IpPy5jb2RlID09PVxuICAgICAgICBgYXV0aC8ke0F1dGhFcnJvckNvZGUuTkVUV09SS19SRVFVRVNUX0ZBSUxFRH1gXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5zY2hlZHVsZSgvKiB3YXNFcnJvciAqLyB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNjaGVkdWxlKCk7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBVc2VyTWV0YWRhdGEgYXMgVXNlck1ldGFkYXRhVHlwZSB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbmltcG9ydCB7IHV0Y1RpbWVzdGFtcFRvRGF0ZVN0cmluZyB9IGZyb20gJy4uL3V0aWwvdGltZSc7XG5cbmV4cG9ydCBjbGFzcyBVc2VyTWV0YWRhdGEgaW1wbGVtZW50cyBVc2VyTWV0YWRhdGFUeXBlIHtcbiAgY3JlYXRpb25UaW1lPzogc3RyaW5nO1xuICBsYXN0U2lnbkluVGltZT86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNyZWF0ZWRBdD86IHN0cmluZyB8IG51bWJlcixcbiAgICBwcml2YXRlIGxhc3RMb2dpbkF0Pzogc3RyaW5nIHwgbnVtYmVyXG4gICkge1xuICAgIHRoaXMuX2luaXRpYWxpemVUaW1lKCk7XG4gIH1cblxuICBwcml2YXRlIF9pbml0aWFsaXplVGltZSgpOiB2b2lkIHtcbiAgICB0aGlzLmxhc3RTaWduSW5UaW1lID0gdXRjVGltZXN0YW1wVG9EYXRlU3RyaW5nKHRoaXMubGFzdExvZ2luQXQpO1xuICAgIHRoaXMuY3JlYXRpb25UaW1lID0gdXRjVGltZXN0YW1wVG9EYXRlU3RyaW5nKHRoaXMuY3JlYXRlZEF0KTtcbiAgfVxuXG4gIF9jb3B5KG1ldGFkYXRhOiBVc2VyTWV0YWRhdGEpOiB2b2lkIHtcbiAgICB0aGlzLmNyZWF0ZWRBdCA9IG1ldGFkYXRhLmNyZWF0ZWRBdDtcbiAgICB0aGlzLmxhc3RMb2dpbkF0ID0gbWV0YWRhdGEubGFzdExvZ2luQXQ7XG4gICAgdGhpcy5faW5pdGlhbGl6ZVRpbWUoKTtcbiAgfVxuXG4gIHRvSlNPTigpOiBvYmplY3Qge1xuICAgIHJldHVybiB7XG4gICAgICBjcmVhdGVkQXQ6IHRoaXMuY3JlYXRlZEF0LFxuICAgICAgbGFzdExvZ2luQXQ6IHRoaXMubGFzdExvZ2luQXRcbiAgICB9O1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgVXNlciwgVXNlckluZm8gfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuXG5pbXBvcnQge1xuICBnZXRBY2NvdW50SW5mbyxcbiAgUHJvdmlkZXJVc2VySW5mb1xufSBmcm9tICcuLi8uLi9hcGkvYWNjb3VudF9tYW5hZ2VtZW50L2FjY291bnQnO1xuaW1wb3J0IHsgVXNlckludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvdXNlcic7XG5pbXBvcnQgeyBBdXRoRXJyb3JDb2RlIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IF9hc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydCc7XG5pbXBvcnQgeyBfbG9nb3V0SWZJbnZhbGlkYXRlZCB9IGZyb20gJy4vaW52YWxpZGF0aW9uJztcbmltcG9ydCB7IFVzZXJNZXRhZGF0YSB9IGZyb20gJy4vdXNlcl9tZXRhZGF0YSc7XG5pbXBvcnQgeyBnZXRNb2R1bGFySW5zdGFuY2UgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBfcmVsb2FkV2l0aG91dFNhdmluZyh1c2VyOiBVc2VySW50ZXJuYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXV0aCA9IHVzZXIuYXV0aDtcbiAgY29uc3QgaWRUb2tlbiA9IGF3YWl0IHVzZXIuZ2V0SWRUb2tlbigpO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IF9sb2dvdXRJZkludmFsaWRhdGVkKFxuICAgIHVzZXIsXG4gICAgZ2V0QWNjb3VudEluZm8oYXV0aCwgeyBpZFRva2VuIH0pXG4gICk7XG5cbiAgX2Fzc2VydChyZXNwb25zZT8udXNlcnMubGVuZ3RoLCBhdXRoLCBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SKTtcblxuICBjb25zdCBjb3JlQWNjb3VudCA9IHJlc3BvbnNlLnVzZXJzWzBdO1xuXG4gIHVzZXIuX25vdGlmeVJlbG9hZExpc3RlbmVyKGNvcmVBY2NvdW50KTtcblxuICBjb25zdCBuZXdQcm92aWRlckRhdGEgPSBjb3JlQWNjb3VudC5wcm92aWRlclVzZXJJbmZvPy5sZW5ndGhcbiAgICA/IGV4dHJhY3RQcm92aWRlckRhdGEoY29yZUFjY291bnQucHJvdmlkZXJVc2VySW5mbylcbiAgICA6IFtdO1xuXG4gIGNvbnN0IHByb3ZpZGVyRGF0YSA9IG1lcmdlUHJvdmlkZXJEYXRhKHVzZXIucHJvdmlkZXJEYXRhLCBuZXdQcm92aWRlckRhdGEpO1xuXG4gIC8vIFByZXNlcnZlcyB0aGUgbm9uLW5vbnltb3VzIHN0YXR1cyBvZiB0aGUgc3RvcmVkIHVzZXIsIGV2ZW4gaWYgbm8gbW9yZVxuICAvLyBjcmVkZW50aWFscyAoZmVkZXJhdGVkIG9yIGVtYWlsL3Bhc3N3b3JkKSBhcmUgbGlua2VkIHRvIHRoZSB1c2VyLiBJZlxuICAvLyB0aGUgdXNlciB3YXMgcHJldmlvdXNseSBhbm9ueW1vdXMsIHRoZW4gdXNlIHByb3ZpZGVyIGRhdGEgdG8gdXBkYXRlLlxuICAvLyBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgaXQgd2FzIG5vdCBhbm9ueW1vdXMgYmVmb3JlLCBpdCBzaG91bGQgbmV2ZXIgYmVcbiAgLy8gY29uc2lkZXJlZCBhbm9ueW1vdXMgbm93LlxuICBjb25zdCBvbGRJc0Fub255bW91cyA9IHVzZXIuaXNBbm9ueW1vdXM7XG4gIGNvbnN0IG5ld0lzQW5vbnltb3VzID1cbiAgICAhKHVzZXIuZW1haWwgJiYgY29yZUFjY291bnQucGFzc3dvcmRIYXNoKSAmJiAhcHJvdmlkZXJEYXRhPy5sZW5ndGg7XG4gIGNvbnN0IGlzQW5vbnltb3VzID0gIW9sZElzQW5vbnltb3VzID8gZmFsc2UgOiBuZXdJc0Fub255bW91cztcblxuICBjb25zdCB1cGRhdGVzOiBQYXJ0aWFsPFVzZXJJbnRlcm5hbD4gPSB7XG4gICAgdWlkOiBjb3JlQWNjb3VudC5sb2NhbElkLFxuICAgIGRpc3BsYXlOYW1lOiBjb3JlQWNjb3VudC5kaXNwbGF5TmFtZSB8fCBudWxsLFxuICAgIHBob3RvVVJMOiBjb3JlQWNjb3VudC5waG90b1VybCB8fCBudWxsLFxuICAgIGVtYWlsOiBjb3JlQWNjb3VudC5lbWFpbCB8fCBudWxsLFxuICAgIGVtYWlsVmVyaWZpZWQ6IGNvcmVBY2NvdW50LmVtYWlsVmVyaWZpZWQgfHwgZmFsc2UsXG4gICAgcGhvbmVOdW1iZXI6IGNvcmVBY2NvdW50LnBob25lTnVtYmVyIHx8IG51bGwsXG4gICAgdGVuYW50SWQ6IGNvcmVBY2NvdW50LnRlbmFudElkIHx8IG51bGwsXG4gICAgcHJvdmlkZXJEYXRhLFxuICAgIG1ldGFkYXRhOiBuZXcgVXNlck1ldGFkYXRhKGNvcmVBY2NvdW50LmNyZWF0ZWRBdCwgY29yZUFjY291bnQubGFzdExvZ2luQXQpLFxuICAgIGlzQW5vbnltb3VzXG4gIH07XG5cbiAgT2JqZWN0LmFzc2lnbih1c2VyLCB1cGRhdGVzKTtcbn1cblxuLyoqXG4gKiBSZWxvYWRzIHVzZXIgYWNjb3VudCBkYXRhLCBpZiBzaWduZWQgaW4uXG4gKlxuICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlci5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWxvYWQodXNlcjogVXNlcik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB1c2VySW50ZXJuYWw6IFVzZXJJbnRlcm5hbCA9IGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyKSBhcyBVc2VySW50ZXJuYWw7XG4gIGF3YWl0IF9yZWxvYWRXaXRob3V0U2F2aW5nKHVzZXJJbnRlcm5hbCk7XG5cbiAgLy8gRXZlbiB0aG91Z2ggdGhlIGN1cnJlbnQgdXNlciBoYXNuJ3QgY2hhbmdlZCwgdXBkYXRlXG4gIC8vIGN1cnJlbnQgdXNlciB3aWxsIHRyaWdnZXIgYSBwZXJzaXN0ZW5jZSB1cGRhdGUgdy8gdGhlXG4gIC8vIG5ldyBpbmZvLlxuICBhd2FpdCB1c2VySW50ZXJuYWwuYXV0aC5fcGVyc2lzdFVzZXJJZkN1cnJlbnQodXNlckludGVybmFsKTtcbiAgdXNlckludGVybmFsLmF1dGguX25vdGlmeUxpc3RlbmVyc0lmQ3VycmVudCh1c2VySW50ZXJuYWwpO1xufVxuXG5mdW5jdGlvbiBtZXJnZVByb3ZpZGVyRGF0YShcbiAgb3JpZ2luYWw6IFVzZXJJbmZvW10sXG4gIG5ld0RhdGE6IFVzZXJJbmZvW11cbik6IFVzZXJJbmZvW10ge1xuICBjb25zdCBkZWR1cGVkID0gb3JpZ2luYWwuZmlsdGVyKFxuICAgIG8gPT4gIW5ld0RhdGEuc29tZShuID0+IG4ucHJvdmlkZXJJZCA9PT0gby5wcm92aWRlcklkKVxuICApO1xuICByZXR1cm4gWy4uLmRlZHVwZWQsIC4uLm5ld0RhdGFdO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0UHJvdmlkZXJEYXRhKHByb3ZpZGVyczogUHJvdmlkZXJVc2VySW5mb1tdKTogVXNlckluZm9bXSB7XG4gIHJldHVybiBwcm92aWRlcnMubWFwKCh7IHByb3ZpZGVySWQsIC4uLnByb3ZpZGVyIH0pID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgcHJvdmlkZXJJZCxcbiAgICAgIHVpZDogcHJvdmlkZXIucmF3SWQgfHwgJycsXG4gICAgICBkaXNwbGF5TmFtZTogcHJvdmlkZXIuZGlzcGxheU5hbWUgfHwgbnVsbCxcbiAgICAgIGVtYWlsOiBwcm92aWRlci5lbWFpbCB8fCBudWxsLFxuICAgICAgcGhvbmVOdW1iZXI6IHByb3ZpZGVyLnBob25lTnVtYmVyIHx8IG51bGwsXG4gICAgICBwaG90b1VSTDogcHJvdmlkZXIucGhvdG9VcmwgfHwgbnVsbFxuICAgIH07XG4gIH0pO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuXG5pbXBvcnQgeyBxdWVyeXN0cmluZyB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcblxuaW1wb3J0IHtcbiAgX2dldEZpbmFsVGFyZ2V0LFxuICBfcGVyZm9ybUZldGNoV2l0aEVycm9ySGFuZGxpbmcsXG4gIEh0dHBNZXRob2QsXG4gIEh0dHBIZWFkZXJcbn0gZnJvbSAnLi4vaW5kZXgnO1xuaW1wb3J0IHsgRmV0Y2hQcm92aWRlciB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbC9mZXRjaF9wcm92aWRlcic7XG5pbXBvcnQgeyBBdXRoIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcbmltcG9ydCB7IEF1dGhJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL2F1dGgnO1xuXG5leHBvcnQgY29uc3QgZW51bSBFbmRwb2ludCB7XG4gIFRPS0VOID0gJy92MS90b2tlbidcbn1cblxuLyoqIFRoZSBzZXJ2ZXIgcmVzcG9uc2VzIHdpdGggc25ha2VfY2FzZTsgd2UgY29udmVydCB0byBjYW1lbENhc2UgKi9cbmludGVyZmFjZSBSZXF1ZXN0U3RzVG9rZW5TZXJ2ZXJSZXNwb25zZSB7XG4gIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICBleHBpcmVzX2luOiBzdHJpbmc7XG4gIHJlZnJlc2hfdG9rZW46IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXF1ZXN0U3RzVG9rZW5SZXNwb25zZSB7XG4gIGFjY2Vzc1Rva2VuOiBzdHJpbmc7XG4gIGV4cGlyZXNJbjogc3RyaW5nO1xuICByZWZyZXNoVG9rZW46IHN0cmluZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RTdHNUb2tlbihcbiAgYXV0aDogQXV0aCxcbiAgcmVmcmVzaFRva2VuOiBzdHJpbmdcbik6IFByb21pc2U8UmVxdWVzdFN0c1Rva2VuUmVzcG9uc2U+IHtcbiAgY29uc3QgcmVzcG9uc2UgPVxuICAgIGF3YWl0IF9wZXJmb3JtRmV0Y2hXaXRoRXJyb3JIYW5kbGluZzxSZXF1ZXN0U3RzVG9rZW5TZXJ2ZXJSZXNwb25zZT4oXG4gICAgICBhdXRoLFxuICAgICAge30sXG4gICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJvZHkgPSBxdWVyeXN0cmluZyh7XG4gICAgICAgICAgJ2dyYW50X3R5cGUnOiAncmVmcmVzaF90b2tlbicsXG4gICAgICAgICAgJ3JlZnJlc2hfdG9rZW4nOiByZWZyZXNoVG9rZW5cbiAgICAgICAgfSkuc2xpY2UoMSk7XG4gICAgICAgIGNvbnN0IHsgdG9rZW5BcGlIb3N0LCBhcGlLZXkgfSA9IGF1dGguY29uZmlnO1xuICAgICAgICBjb25zdCB1cmwgPSBfZ2V0RmluYWxUYXJnZXQoXG4gICAgICAgICAgYXV0aCxcbiAgICAgICAgICB0b2tlbkFwaUhvc3QsXG4gICAgICAgICAgRW5kcG9pbnQuVE9LRU4sXG4gICAgICAgICAgYGtleT0ke2FwaUtleX1gXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgaGVhZGVycyA9IGF3YWl0IChhdXRoIGFzIEF1dGhJbnRlcm5hbCkuX2dldEFkZGl0aW9uYWxIZWFkZXJzKCk7XG4gICAgICAgIGhlYWRlcnNbSHR0cEhlYWRlci5DT05URU5UX1RZUEVdID0gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCc7XG5cbiAgICAgICAgcmV0dXJuIEZldGNoUHJvdmlkZXIuZmV0Y2goKSh1cmwsIHtcbiAgICAgICAgICBtZXRob2Q6IEh0dHBNZXRob2QuUE9TVCxcbiAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgIGJvZHlcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgKTtcblxuICAvLyBUaGUgcmVzcG9uc2UgY29tZXMgYmFjayBpbiBzbmFrZV9jYXNlLiBDb252ZXJ0IHRvIGNhbWVsOlxuICByZXR1cm4ge1xuICAgIGFjY2Vzc1Rva2VuOiByZXNwb25zZS5hY2Nlc3NfdG9rZW4sXG4gICAgZXhwaXJlc0luOiByZXNwb25zZS5leHBpcmVzX2luLFxuICAgIHJlZnJlc2hUb2tlbjogcmVzcG9uc2UucmVmcmVzaF90b2tlblxuICB9O1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEZpbmFsaXplTWZhUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9hcGkvYXV0aGVudGljYXRpb24vbWZhJztcbmltcG9ydCB7IHJlcXVlc3RTdHNUb2tlbiB9IGZyb20gJy4uLy4uL2FwaS9hdXRoZW50aWNhdGlvbi90b2tlbic7XG5pbXBvcnQgeyBBdXRoSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9hdXRoJztcbmltcG9ydCB7IElkVG9rZW5SZXNwb25zZSB9IGZyb20gJy4uLy4uL21vZGVsL2lkX3Rva2VuJztcbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgUGVyc2lzdGVkQmxvYiB9IGZyb20gJy4uL3BlcnNpc3RlbmNlJztcbmltcG9ydCB7IF9hc3NlcnQsIGRlYnVnRmFpbCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0JztcbmltcG9ydCB7IF90b2tlbkV4cGlyZXNJbiB9IGZyb20gJy4vaWRfdG9rZW5fcmVzdWx0JztcblxuLyoqXG4gKiBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZWZvcmUgdGhlIG9mZmljaWFsIGV4cGlyYXRpb24gdGltZSBvZiBhIHRva2VuXG4gKiB0byByZWZyZXNoIHRoYXQgdG9rZW4sIHRvIHByb3ZpZGUgYSBidWZmZXIgZm9yIFJQQ3MgdG8gY29tcGxldGUuXG4gKi9cbmV4cG9ydCBjb25zdCBlbnVtIEJ1ZmZlciB7XG4gIFRPS0VOX1JFRlJFU0ggPSAzMF8wMDBcbn1cblxuLyoqXG4gKiBXZSBuZWVkIHRvIG1hcmsgdGhpcyBjbGFzcyBhcyBpbnRlcm5hbCBleHBsaWNpdGx5IHRvIGV4Y2x1ZGUgaXQgaW4gdGhlIHB1YmxpYyB0eXBpbmdzLCBiZWNhdXNlXG4gKiBpdCByZWZlcmVuY2VzIEF1dGhJbnRlcm5hbCB3aGljaCBoYXMgYSBjaXJjdWxhciBkZXBlbmRlbmN5IHdpdGggVXNlckludGVybmFsLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgU3RzVG9rZW5NYW5hZ2VyIHtcbiAgcmVmcmVzaFRva2VuOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgYWNjZXNzVG9rZW46IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBleHBpcmF0aW9uVGltZTogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgZ2V0IGlzRXhwaXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgIXRoaXMuZXhwaXJhdGlvblRpbWUgfHxcbiAgICAgIERhdGUubm93KCkgPiB0aGlzLmV4cGlyYXRpb25UaW1lIC0gQnVmZmVyLlRPS0VOX1JFRlJFU0hcbiAgICApO1xuICB9XG5cbiAgdXBkYXRlRnJvbVNlcnZlclJlc3BvbnNlKFxuICAgIHJlc3BvbnNlOiBJZFRva2VuUmVzcG9uc2UgfCBGaW5hbGl6ZU1mYVJlc3BvbnNlXG4gICk6IHZvaWQge1xuICAgIF9hc3NlcnQocmVzcG9uc2UuaWRUb2tlbiwgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG4gICAgX2Fzc2VydChcbiAgICAgIHR5cGVvZiByZXNwb25zZS5pZFRva2VuICE9PSAndW5kZWZpbmVkJyxcbiAgICAgIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1JcbiAgICApO1xuICAgIF9hc3NlcnQoXG4gICAgICB0eXBlb2YgcmVzcG9uc2UucmVmcmVzaFRva2VuICE9PSAndW5kZWZpbmVkJyxcbiAgICAgIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1JcbiAgICApO1xuICAgIGNvbnN0IGV4cGlyZXNJbiA9XG4gICAgICAnZXhwaXJlc0luJyBpbiByZXNwb25zZSAmJiB0eXBlb2YgcmVzcG9uc2UuZXhwaXJlc0luICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICA/IE51bWJlcihyZXNwb25zZS5leHBpcmVzSW4pXG4gICAgICAgIDogX3Rva2VuRXhwaXJlc0luKHJlc3BvbnNlLmlkVG9rZW4pO1xuICAgIHRoaXMudXBkYXRlVG9rZW5zQW5kRXhwaXJhdGlvbihcbiAgICAgIHJlc3BvbnNlLmlkVG9rZW4sXG4gICAgICByZXNwb25zZS5yZWZyZXNoVG9rZW4sXG4gICAgICBleHBpcmVzSW5cbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZ2V0VG9rZW4oXG4gICAgYXV0aDogQXV0aEludGVybmFsLFxuICAgIGZvcmNlUmVmcmVzaCA9IGZhbHNlXG4gICk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIF9hc3NlcnQoXG4gICAgICAhdGhpcy5hY2Nlc3NUb2tlbiB8fCB0aGlzLnJlZnJlc2hUb2tlbixcbiAgICAgIGF1dGgsXG4gICAgICBBdXRoRXJyb3JDb2RlLlRPS0VOX0VYUElSRURcbiAgICApO1xuXG4gICAgaWYgKCFmb3JjZVJlZnJlc2ggJiYgdGhpcy5hY2Nlc3NUb2tlbiAmJiAhdGhpcy5pc0V4cGlyZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmFjY2Vzc1Rva2VuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJlZnJlc2hUb2tlbikge1xuICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoKGF1dGgsIHRoaXMucmVmcmVzaFRva2VuISk7XG4gICAgICByZXR1cm4gdGhpcy5hY2Nlc3NUb2tlbjtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNsZWFyUmVmcmVzaFRva2VuKCk6IHZvaWQge1xuICAgIHRoaXMucmVmcmVzaFRva2VuID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaChhdXRoOiBBdXRoSW50ZXJuYWwsIG9sZFRva2VuOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGFjY2Vzc1Rva2VuLCByZWZyZXNoVG9rZW4sIGV4cGlyZXNJbiB9ID0gYXdhaXQgcmVxdWVzdFN0c1Rva2VuKFxuICAgICAgYXV0aCxcbiAgICAgIG9sZFRva2VuXG4gICAgKTtcbiAgICB0aGlzLnVwZGF0ZVRva2Vuc0FuZEV4cGlyYXRpb24oXG4gICAgICBhY2Nlc3NUb2tlbixcbiAgICAgIHJlZnJlc2hUb2tlbixcbiAgICAgIE51bWJlcihleHBpcmVzSW4pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVG9rZW5zQW5kRXhwaXJhdGlvbihcbiAgICBhY2Nlc3NUb2tlbjogc3RyaW5nLFxuICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nLFxuICAgIGV4cGlyZXNJblNlYzogbnVtYmVyXG4gICk6IHZvaWQge1xuICAgIHRoaXMucmVmcmVzaFRva2VuID0gcmVmcmVzaFRva2VuIHx8IG51bGw7XG4gICAgdGhpcy5hY2Nlc3NUb2tlbiA9IGFjY2Vzc1Rva2VuIHx8IG51bGw7XG4gICAgdGhpcy5leHBpcmF0aW9uVGltZSA9IERhdGUubm93KCkgKyBleHBpcmVzSW5TZWMgKiAxMDAwO1xuICB9XG5cbiAgc3RhdGljIGZyb21KU09OKGFwcE5hbWU6IHN0cmluZywgb2JqZWN0OiBQZXJzaXN0ZWRCbG9iKTogU3RzVG9rZW5NYW5hZ2VyIHtcbiAgICBjb25zdCB7IHJlZnJlc2hUb2tlbiwgYWNjZXNzVG9rZW4sIGV4cGlyYXRpb25UaW1lIH0gPSBvYmplY3Q7XG5cbiAgICBjb25zdCBtYW5hZ2VyID0gbmV3IFN0c1Rva2VuTWFuYWdlcigpO1xuICAgIGlmIChyZWZyZXNoVG9rZW4pIHtcbiAgICAgIF9hc3NlcnQodHlwZW9mIHJlZnJlc2hUb2tlbiA9PT0gJ3N0cmluZycsIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IsIHtcbiAgICAgICAgYXBwTmFtZVxuICAgICAgfSk7XG4gICAgICBtYW5hZ2VyLnJlZnJlc2hUb2tlbiA9IHJlZnJlc2hUb2tlbjtcbiAgICB9XG4gICAgaWYgKGFjY2Vzc1Rva2VuKSB7XG4gICAgICBfYXNzZXJ0KHR5cGVvZiBhY2Nlc3NUb2tlbiA9PT0gJ3N0cmluZycsIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IsIHtcbiAgICAgICAgYXBwTmFtZVxuICAgICAgfSk7XG4gICAgICBtYW5hZ2VyLmFjY2Vzc1Rva2VuID0gYWNjZXNzVG9rZW47XG4gICAgfVxuICAgIGlmIChleHBpcmF0aW9uVGltZSkge1xuICAgICAgX2Fzc2VydChcbiAgICAgICAgdHlwZW9mIGV4cGlyYXRpb25UaW1lID09PSAnbnVtYmVyJyxcbiAgICAgICAgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUixcbiAgICAgICAge1xuICAgICAgICAgIGFwcE5hbWVcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIG1hbmFnZXIuZXhwaXJhdGlvblRpbWUgPSBleHBpcmF0aW9uVGltZTtcbiAgICB9XG4gICAgcmV0dXJuIG1hbmFnZXI7XG4gIH1cblxuICB0b0pTT04oKTogb2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVmcmVzaFRva2VuOiB0aGlzLnJlZnJlc2hUb2tlbixcbiAgICAgIGFjY2Vzc1Rva2VuOiB0aGlzLmFjY2Vzc1Rva2VuLFxuICAgICAgZXhwaXJhdGlvblRpbWU6IHRoaXMuZXhwaXJhdGlvblRpbWVcbiAgICB9O1xuICB9XG5cbiAgX2Fzc2lnbihzdHNUb2tlbk1hbmFnZXI6IFN0c1Rva2VuTWFuYWdlcik6IHZvaWQge1xuICAgIHRoaXMuYWNjZXNzVG9rZW4gPSBzdHNUb2tlbk1hbmFnZXIuYWNjZXNzVG9rZW47XG4gICAgdGhpcy5yZWZyZXNoVG9rZW4gPSBzdHNUb2tlbk1hbmFnZXIucmVmcmVzaFRva2VuO1xuICAgIHRoaXMuZXhwaXJhdGlvblRpbWUgPSBzdHNUb2tlbk1hbmFnZXIuZXhwaXJhdGlvblRpbWU7XG4gIH1cblxuICBfY2xvbmUoKTogU3RzVG9rZW5NYW5hZ2VyIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgU3RzVG9rZW5NYW5hZ2VyKCksIHRoaXMudG9KU09OKCkpO1xuICB9XG5cbiAgX3BlcmZvcm1SZWZyZXNoKCk6IG5ldmVyIHtcbiAgICByZXR1cm4gZGVidWdGYWlsKCdub3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IElkVG9rZW5SZXN1bHQgfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuaW1wb3J0IHsgTmV4dEZuIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuXG5pbXBvcnQge1xuICBBUElVc2VySW5mbyxcbiAgZGVsZXRlQWNjb3VudFxufSBmcm9tICcuLi8uLi9hcGkvYWNjb3VudF9tYW5hZ2VtZW50L2FjY291bnQnO1xuaW1wb3J0IHsgRmluYWxpemVNZmFSZXNwb25zZSB9IGZyb20gJy4uLy4uL2FwaS9hdXRoZW50aWNhdGlvbi9tZmEnO1xuaW1wb3J0IHsgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXV0aCc7XG5pbXBvcnQgeyBJZFRva2VuUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9tb2RlbC9pZF90b2tlbic7XG5pbXBvcnQge1xuICBNdXRhYmxlVXNlckluZm8sXG4gIFVzZXJJbnRlcm5hbCxcbiAgVXNlclBhcmFtZXRlcnNcbn0gZnJvbSAnLi4vLi4vbW9kZWwvdXNlcic7XG5pbXBvcnQgeyBBdXRoRXJyb3JDb2RlIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IFBlcnNpc3RlZEJsb2IgfSBmcm9tICcuLi9wZXJzaXN0ZW5jZSc7XG5pbXBvcnQgeyBfYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQnO1xuaW1wb3J0IHsgZ2V0SWRUb2tlblJlc3VsdCB9IGZyb20gJy4vaWRfdG9rZW5fcmVzdWx0JztcbmltcG9ydCB7IF9sb2dvdXRJZkludmFsaWRhdGVkIH0gZnJvbSAnLi9pbnZhbGlkYXRpb24nO1xuaW1wb3J0IHsgUHJvYWN0aXZlUmVmcmVzaCB9IGZyb20gJy4vcHJvYWN0aXZlX3JlZnJlc2gnO1xuaW1wb3J0IHsgX3JlbG9hZFdpdGhvdXRTYXZpbmcsIHJlbG9hZCB9IGZyb20gJy4vcmVsb2FkJztcbmltcG9ydCB7IFN0c1Rva2VuTWFuYWdlciB9IGZyb20gJy4vdG9rZW5fbWFuYWdlcic7XG5pbXBvcnQgeyBVc2VyTWV0YWRhdGEgfSBmcm9tICcuL3VzZXJfbWV0YWRhdGEnO1xuaW1wb3J0IHsgUHJvdmlkZXJJZCB9IGZyb20gJy4uLy4uL21vZGVsL2VudW1zJztcblxuZnVuY3Rpb24gYXNzZXJ0U3RyaW5nT3JVbmRlZmluZWQoXG4gIGFzc2VydGlvbjogdW5rbm93bixcbiAgYXBwTmFtZTogc3RyaW5nXG4pOiBhc3NlcnRzIGFzc2VydGlvbiBpcyBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBfYXNzZXJ0KFxuICAgIHR5cGVvZiBhc3NlcnRpb24gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBhc3NlcnRpb24gPT09ICd1bmRlZmluZWQnLFxuICAgIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IsXG4gICAgeyBhcHBOYW1lIH1cbiAgKTtcbn1cblxuZXhwb3J0IGNsYXNzIFVzZXJJbXBsIGltcGxlbWVudHMgVXNlckludGVybmFsIHtcbiAgLy8gRm9yIHRoZSB1c2VyIG9iamVjdCwgcHJvdmlkZXIgaXMgYWx3YXlzIEZpcmViYXNlLlxuICByZWFkb25seSBwcm92aWRlcklkID0gUHJvdmlkZXJJZC5GSVJFQkFTRTtcbiAgc3RzVG9rZW5NYW5hZ2VyOiBTdHNUb2tlbk1hbmFnZXI7XG4gIC8vIExhc3Qga25vd24gYWNjZXNzVG9rZW4gc28gd2Uga25vdyB3aGVuIGl0IGNoYW5nZXNcbiAgcHJpdmF0ZSBhY2Nlc3NUb2tlbjogc3RyaW5nIHwgbnVsbDtcblxuICB1aWQ6IHN0cmluZztcbiAgYXV0aDogQXV0aEludGVybmFsO1xuICBlbWFpbFZlcmlmaWVkOiBib29sZWFuO1xuICBpc0Fub255bW91czogYm9vbGVhbjtcbiAgdGVuYW50SWQ6IHN0cmluZyB8IG51bGw7XG4gIHJlYWRvbmx5IG1ldGFkYXRhOiBVc2VyTWV0YWRhdGE7XG4gIHByb3ZpZGVyRGF0YTogTXV0YWJsZVVzZXJJbmZvW107XG5cbiAgLy8gT3B0aW9uYWwgZmllbGRzIGZyb20gVXNlckluZm9cbiAgZGlzcGxheU5hbWU6IHN0cmluZyB8IG51bGw7XG4gIGVtYWlsOiBzdHJpbmcgfCBudWxsO1xuICBwaG9uZU51bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgcGhvdG9VUkw6IHN0cmluZyB8IG51bGw7XG5cbiAgX3JlZGlyZWN0RXZlbnRJZD86IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBwcm9hY3RpdmVSZWZyZXNoID0gbmV3IFByb2FjdGl2ZVJlZnJlc2godGhpcyk7XG5cbiAgY29uc3RydWN0b3IoeyB1aWQsIGF1dGgsIHN0c1Rva2VuTWFuYWdlciwgLi4ub3B0IH06IFVzZXJQYXJhbWV0ZXJzKSB7XG4gICAgdGhpcy51aWQgPSB1aWQ7XG4gICAgdGhpcy5hdXRoID0gYXV0aDtcbiAgICB0aGlzLnN0c1Rva2VuTWFuYWdlciA9IHN0c1Rva2VuTWFuYWdlcjtcbiAgICB0aGlzLmFjY2Vzc1Rva2VuID0gc3RzVG9rZW5NYW5hZ2VyLmFjY2Vzc1Rva2VuO1xuICAgIHRoaXMuZGlzcGxheU5hbWUgPSBvcHQuZGlzcGxheU5hbWUgfHwgbnVsbDtcbiAgICB0aGlzLmVtYWlsID0gb3B0LmVtYWlsIHx8IG51bGw7XG4gICAgdGhpcy5lbWFpbFZlcmlmaWVkID0gb3B0LmVtYWlsVmVyaWZpZWQgfHwgZmFsc2U7XG4gICAgdGhpcy5waG9uZU51bWJlciA9IG9wdC5waG9uZU51bWJlciB8fCBudWxsO1xuICAgIHRoaXMucGhvdG9VUkwgPSBvcHQucGhvdG9VUkwgfHwgbnVsbDtcbiAgICB0aGlzLmlzQW5vbnltb3VzID0gb3B0LmlzQW5vbnltb3VzIHx8IGZhbHNlO1xuICAgIHRoaXMudGVuYW50SWQgPSBvcHQudGVuYW50SWQgfHwgbnVsbDtcbiAgICB0aGlzLnByb3ZpZGVyRGF0YSA9IG9wdC5wcm92aWRlckRhdGEgPyBbLi4ub3B0LnByb3ZpZGVyRGF0YV0gOiBbXTtcbiAgICB0aGlzLm1ldGFkYXRhID0gbmV3IFVzZXJNZXRhZGF0YShcbiAgICAgIG9wdC5jcmVhdGVkQXQgfHwgdW5kZWZpbmVkLFxuICAgICAgb3B0Lmxhc3RMb2dpbkF0IHx8IHVuZGVmaW5lZFxuICAgICk7XG4gIH1cblxuICBhc3luYyBnZXRJZFRva2VuKGZvcmNlUmVmcmVzaD86IGJvb2xlYW4pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gYXdhaXQgX2xvZ291dElmSW52YWxpZGF0ZWQoXG4gICAgICB0aGlzLFxuICAgICAgdGhpcy5zdHNUb2tlbk1hbmFnZXIuZ2V0VG9rZW4odGhpcy5hdXRoLCBmb3JjZVJlZnJlc2gpXG4gICAgKTtcbiAgICBfYXNzZXJ0KGFjY2Vzc1Rva2VuLCB0aGlzLmF1dGgsIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IpO1xuXG4gICAgaWYgKHRoaXMuYWNjZXNzVG9rZW4gIT09IGFjY2Vzc1Rva2VuKSB7XG4gICAgICB0aGlzLmFjY2Vzc1Rva2VuID0gYWNjZXNzVG9rZW47XG4gICAgICBhd2FpdCB0aGlzLmF1dGguX3BlcnNpc3RVc2VySWZDdXJyZW50KHRoaXMpO1xuICAgICAgdGhpcy5hdXRoLl9ub3RpZnlMaXN0ZW5lcnNJZkN1cnJlbnQodGhpcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjY2Vzc1Rva2VuO1xuICB9XG5cbiAgZ2V0SWRUb2tlblJlc3VsdChmb3JjZVJlZnJlc2g/OiBib29sZWFuKTogUHJvbWlzZTxJZFRva2VuUmVzdWx0PiB7XG4gICAgcmV0dXJuIGdldElkVG9rZW5SZXN1bHQodGhpcywgZm9yY2VSZWZyZXNoKTtcbiAgfVxuXG4gIHJlbG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gcmVsb2FkKHRoaXMpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWxvYWRVc2VySW5mbzogQVBJVXNlckluZm8gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWxvYWRMaXN0ZW5lcjogTmV4dEZuPEFQSVVzZXJJbmZvPiB8IG51bGwgPSBudWxsO1xuXG4gIF9hc3NpZ24odXNlcjogVXNlckludGVybmFsKTogdm9pZCB7XG4gICAgaWYgKHRoaXMgPT09IHVzZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgX2Fzc2VydCh0aGlzLnVpZCA9PT0gdXNlci51aWQsIHRoaXMuYXV0aCwgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG4gICAgdGhpcy5kaXNwbGF5TmFtZSA9IHVzZXIuZGlzcGxheU5hbWU7XG4gICAgdGhpcy5waG90b1VSTCA9IHVzZXIucGhvdG9VUkw7XG4gICAgdGhpcy5lbWFpbCA9IHVzZXIuZW1haWw7XG4gICAgdGhpcy5lbWFpbFZlcmlmaWVkID0gdXNlci5lbWFpbFZlcmlmaWVkO1xuICAgIHRoaXMucGhvbmVOdW1iZXIgPSB1c2VyLnBob25lTnVtYmVyO1xuICAgIHRoaXMuaXNBbm9ueW1vdXMgPSB1c2VyLmlzQW5vbnltb3VzO1xuICAgIHRoaXMudGVuYW50SWQgPSB1c2VyLnRlbmFudElkO1xuICAgIHRoaXMucHJvdmlkZXJEYXRhID0gdXNlci5wcm92aWRlckRhdGEubWFwKHVzZXJJbmZvID0+ICh7IC4uLnVzZXJJbmZvIH0pKTtcbiAgICB0aGlzLm1ldGFkYXRhLl9jb3B5KHVzZXIubWV0YWRhdGEpO1xuICAgIHRoaXMuc3RzVG9rZW5NYW5hZ2VyLl9hc3NpZ24odXNlci5zdHNUb2tlbk1hbmFnZXIpO1xuICB9XG5cbiAgX2Nsb25lKGF1dGg6IEF1dGhJbnRlcm5hbCk6IFVzZXJJbnRlcm5hbCB7XG4gICAgY29uc3QgbmV3VXNlciA9IG5ldyBVc2VySW1wbCh7XG4gICAgICAuLi50aGlzLFxuICAgICAgYXV0aCxcbiAgICAgIHN0c1Rva2VuTWFuYWdlcjogdGhpcy5zdHNUb2tlbk1hbmFnZXIuX2Nsb25lKClcbiAgICB9KTtcbiAgICBuZXdVc2VyLm1ldGFkYXRhLl9jb3B5KHRoaXMubWV0YWRhdGEpO1xuICAgIHJldHVybiBuZXdVc2VyO1xuICB9XG5cbiAgX29uUmVsb2FkKGNhbGxiYWNrOiBOZXh0Rm48QVBJVXNlckluZm8+KTogdm9pZCB7XG4gICAgLy8gVGhlcmUgc2hvdWxkIG9ubHkgZXZlciBiZSBvbmUgbGlzdGVuZXIsIGFuZCB0aGF0IGlzIGEgc2luZ2xlIGluc3RhbmNlIG9mIE11bHRpRmFjdG9yVXNlclxuICAgIF9hc3NlcnQoIXRoaXMucmVsb2FkTGlzdGVuZXIsIHRoaXMuYXV0aCwgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG4gICAgdGhpcy5yZWxvYWRMaXN0ZW5lciA9IGNhbGxiYWNrO1xuICAgIGlmICh0aGlzLnJlbG9hZFVzZXJJbmZvKSB7XG4gICAgICB0aGlzLl9ub3RpZnlSZWxvYWRMaXN0ZW5lcih0aGlzLnJlbG9hZFVzZXJJbmZvKTtcbiAgICAgIHRoaXMucmVsb2FkVXNlckluZm8gPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIF9ub3RpZnlSZWxvYWRMaXN0ZW5lcih1c2VySW5mbzogQVBJVXNlckluZm8pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWxvYWRMaXN0ZW5lcikge1xuICAgICAgdGhpcy5yZWxvYWRMaXN0ZW5lcih1c2VySW5mbyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIG5vIGxpc3RlbmVyIGlzIHN1YnNjcmliZWQgeWV0LCBzYXZlIHRoZSByZXN1bHQgc28gaXQncyBhdmFpbGFibGUgd2hlbiB0aGV5IGRvIHN1YnNjcmliZVxuICAgICAgdGhpcy5yZWxvYWRVc2VySW5mbyA9IHVzZXJJbmZvO1xuICAgIH1cbiAgfVxuXG4gIF9zdGFydFByb2FjdGl2ZVJlZnJlc2goKTogdm9pZCB7XG4gICAgdGhpcy5wcm9hY3RpdmVSZWZyZXNoLl9zdGFydCgpO1xuICB9XG5cbiAgX3N0b3BQcm9hY3RpdmVSZWZyZXNoKCk6IHZvaWQge1xuICAgIHRoaXMucHJvYWN0aXZlUmVmcmVzaC5fc3RvcCgpO1xuICB9XG5cbiAgYXN5bmMgX3VwZGF0ZVRva2Vuc0lmTmVjZXNzYXJ5KFxuICAgIHJlc3BvbnNlOiBJZFRva2VuUmVzcG9uc2UgfCBGaW5hbGl6ZU1mYVJlc3BvbnNlLFxuICAgIHJlbG9hZCA9IGZhbHNlXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCB0b2tlbnNSZWZyZXNoZWQgPSBmYWxzZTtcbiAgICBpZiAoXG4gICAgICByZXNwb25zZS5pZFRva2VuICYmXG4gICAgICByZXNwb25zZS5pZFRva2VuICE9PSB0aGlzLnN0c1Rva2VuTWFuYWdlci5hY2Nlc3NUb2tlblxuICAgICkge1xuICAgICAgdGhpcy5zdHNUb2tlbk1hbmFnZXIudXBkYXRlRnJvbVNlcnZlclJlc3BvbnNlKHJlc3BvbnNlKTtcbiAgICAgIHRva2Vuc1JlZnJlc2hlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHJlbG9hZCkge1xuICAgICAgYXdhaXQgX3JlbG9hZFdpdGhvdXRTYXZpbmcodGhpcyk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5hdXRoLl9wZXJzaXN0VXNlcklmQ3VycmVudCh0aGlzKTtcbiAgICBpZiAodG9rZW5zUmVmcmVzaGVkKSB7XG4gICAgICB0aGlzLmF1dGguX25vdGlmeUxpc3RlbmVyc0lmQ3VycmVudCh0aGlzKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBkZWxldGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaWRUb2tlbiA9IGF3YWl0IHRoaXMuZ2V0SWRUb2tlbigpO1xuICAgIGF3YWl0IF9sb2dvdXRJZkludmFsaWRhdGVkKHRoaXMsIGRlbGV0ZUFjY291bnQodGhpcy5hdXRoLCB7IGlkVG9rZW4gfSkpO1xuICAgIHRoaXMuc3RzVG9rZW5NYW5hZ2VyLmNsZWFyUmVmcmVzaFRva2VuKCk7XG5cbiAgICAvLyBUT0RPOiBEZXRlcm1pbmUgaWYgY2FuY2VsbGFibGUtcHJvbWlzZXMgYXJlIG5lY2Vzc2FyeSB0byB1c2UgaW4gdGhpcyBjbGFzcyBzbyB0aGF0IGRlbGV0ZSgpXG4gICAgLy8gICAgICAgY2FuY2VscyBwZW5kaW5nIGFjdGlvbnMuLi5cblxuICAgIHJldHVybiB0aGlzLmF1dGguc2lnbk91dCgpO1xuICB9XG5cbiAgdG9KU09OKCk6IFBlcnNpc3RlZEJsb2Ige1xuICAgIHJldHVybiB7XG4gICAgICB1aWQ6IHRoaXMudWlkLFxuICAgICAgZW1haWw6IHRoaXMuZW1haWwgfHwgdW5kZWZpbmVkLFxuICAgICAgZW1haWxWZXJpZmllZDogdGhpcy5lbWFpbFZlcmlmaWVkLFxuICAgICAgZGlzcGxheU5hbWU6IHRoaXMuZGlzcGxheU5hbWUgfHwgdW5kZWZpbmVkLFxuICAgICAgaXNBbm9ueW1vdXM6IHRoaXMuaXNBbm9ueW1vdXMsXG4gICAgICBwaG90b1VSTDogdGhpcy5waG90b1VSTCB8fCB1bmRlZmluZWQsXG4gICAgICBwaG9uZU51bWJlcjogdGhpcy5waG9uZU51bWJlciB8fCB1bmRlZmluZWQsXG4gICAgICB0ZW5hbnRJZDogdGhpcy50ZW5hbnRJZCB8fCB1bmRlZmluZWQsXG4gICAgICBwcm92aWRlckRhdGE6IHRoaXMucHJvdmlkZXJEYXRhLm1hcCh1c2VySW5mbyA9PiAoeyAuLi51c2VySW5mbyB9KSksXG4gICAgICBzdHNUb2tlbk1hbmFnZXI6IHRoaXMuc3RzVG9rZW5NYW5hZ2VyLnRvSlNPTigpLFxuICAgICAgLy8gUmVkaXJlY3QgZXZlbnQgSUQgbXVzdCBiZSBtYWludGFpbmVkIGluIGNhc2UgdGhlcmUgaXMgYSBwZW5kaW5nXG4gICAgICAvLyByZWRpcmVjdCBldmVudC5cbiAgICAgIF9yZWRpcmVjdEV2ZW50SWQ6IHRoaXMuX3JlZGlyZWN0RXZlbnRJZCxcbiAgICAgIC4uLnRoaXMubWV0YWRhdGEudG9KU09OKCksXG5cbiAgICAgIC8vIFJlcXVpcmVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIGxlZ2FjeSBTREsgKGdvL2ZpcmViYXNlLWF1dGgtc2RrLXBlcnNpc3RlbmNlLXBhcnNpbmcpOlxuICAgICAgYXBpS2V5OiB0aGlzLmF1dGguY29uZmlnLmFwaUtleSxcbiAgICAgIGFwcE5hbWU6IHRoaXMuYXV0aC5uYW1lXG4gICAgICAvLyBNaXNzaW5nIGF1dGhEb21haW4gd2lsbCBiZSB0b2xlcmF0ZWQgYnkgdGhlIGxlZ2FjeSBTREsuXG4gICAgICAvLyBzdHNUb2tlbk1hbmFnZXIuYXBpS2V5IGlzbid0IGFjdHVhbGx5IHJlcXVpcmVkIChkZXNwaXRlIHRoZSBsZWdhY3kgU0RLIHBlcnNpc3RpbmcgaXQpLlxuICAgIH07XG4gIH1cblxuICBnZXQgcmVmcmVzaFRva2VuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc3RzVG9rZW5NYW5hZ2VyLnJlZnJlc2hUb2tlbiB8fCAnJztcbiAgfVxuXG4gIHN0YXRpYyBfZnJvbUpTT04oYXV0aDogQXV0aEludGVybmFsLCBvYmplY3Q6IFBlcnNpc3RlZEJsb2IpOiBVc2VySW50ZXJuYWwge1xuICAgIGNvbnN0IGRpc3BsYXlOYW1lID0gb2JqZWN0LmRpc3BsYXlOYW1lID8/IHVuZGVmaW5lZDtcbiAgICBjb25zdCBlbWFpbCA9IG9iamVjdC5lbWFpbCA/PyB1bmRlZmluZWQ7XG4gICAgY29uc3QgcGhvbmVOdW1iZXIgPSBvYmplY3QucGhvbmVOdW1iZXIgPz8gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHBob3RvVVJMID0gb2JqZWN0LnBob3RvVVJMID8/IHVuZGVmaW5lZDtcbiAgICBjb25zdCB0ZW5hbnRJZCA9IG9iamVjdC50ZW5hbnRJZCA/PyB1bmRlZmluZWQ7XG4gICAgY29uc3QgX3JlZGlyZWN0RXZlbnRJZCA9IG9iamVjdC5fcmVkaXJlY3RFdmVudElkID8/IHVuZGVmaW5lZDtcbiAgICBjb25zdCBjcmVhdGVkQXQgPSBvYmplY3QuY3JlYXRlZEF0ID8/IHVuZGVmaW5lZDtcbiAgICBjb25zdCBsYXN0TG9naW5BdCA9IG9iamVjdC5sYXN0TG9naW5BdCA/PyB1bmRlZmluZWQ7XG4gICAgY29uc3Qge1xuICAgICAgdWlkLFxuICAgICAgZW1haWxWZXJpZmllZCxcbiAgICAgIGlzQW5vbnltb3VzLFxuICAgICAgcHJvdmlkZXJEYXRhLFxuICAgICAgc3RzVG9rZW5NYW5hZ2VyOiBwbGFpbk9iamVjdFRva2VuTWFuYWdlclxuICAgIH0gPSBvYmplY3Q7XG5cbiAgICBfYXNzZXJ0KHVpZCAmJiBwbGFpbk9iamVjdFRva2VuTWFuYWdlciwgYXV0aCwgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG5cbiAgICBjb25zdCBzdHNUb2tlbk1hbmFnZXIgPSBTdHNUb2tlbk1hbmFnZXIuZnJvbUpTT04oXG4gICAgICB0aGlzLm5hbWUsXG4gICAgICBwbGFpbk9iamVjdFRva2VuTWFuYWdlciBhcyBQZXJzaXN0ZWRCbG9iXG4gICAgKTtcblxuICAgIF9hc3NlcnQodHlwZW9mIHVpZCA9PT0gJ3N0cmluZycsIGF1dGgsIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IpO1xuICAgIGFzc2VydFN0cmluZ09yVW5kZWZpbmVkKGRpc3BsYXlOYW1lLCBhdXRoLm5hbWUpO1xuICAgIGFzc2VydFN0cmluZ09yVW5kZWZpbmVkKGVtYWlsLCBhdXRoLm5hbWUpO1xuICAgIF9hc3NlcnQoXG4gICAgICB0eXBlb2YgZW1haWxWZXJpZmllZCA9PT0gJ2Jvb2xlYW4nLFxuICAgICAgYXV0aCxcbiAgICAgIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1JcbiAgICApO1xuICAgIF9hc3NlcnQoXG4gICAgICB0eXBlb2YgaXNBbm9ueW1vdXMgPT09ICdib29sZWFuJyxcbiAgICAgIGF1dGgsXG4gICAgICBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SXG4gICAgKTtcbiAgICBhc3NlcnRTdHJpbmdPclVuZGVmaW5lZChwaG9uZU51bWJlciwgYXV0aC5uYW1lKTtcbiAgICBhc3NlcnRTdHJpbmdPclVuZGVmaW5lZChwaG90b1VSTCwgYXV0aC5uYW1lKTtcbiAgICBhc3NlcnRTdHJpbmdPclVuZGVmaW5lZCh0ZW5hbnRJZCwgYXV0aC5uYW1lKTtcbiAgICBhc3NlcnRTdHJpbmdPclVuZGVmaW5lZChfcmVkaXJlY3RFdmVudElkLCBhdXRoLm5hbWUpO1xuICAgIGFzc2VydFN0cmluZ09yVW5kZWZpbmVkKGNyZWF0ZWRBdCwgYXV0aC5uYW1lKTtcbiAgICBhc3NlcnRTdHJpbmdPclVuZGVmaW5lZChsYXN0TG9naW5BdCwgYXV0aC5uYW1lKTtcbiAgICBjb25zdCB1c2VyID0gbmV3IFVzZXJJbXBsKHtcbiAgICAgIHVpZCxcbiAgICAgIGF1dGgsXG4gICAgICBlbWFpbCxcbiAgICAgIGVtYWlsVmVyaWZpZWQsXG4gICAgICBkaXNwbGF5TmFtZSxcbiAgICAgIGlzQW5vbnltb3VzLFxuICAgICAgcGhvdG9VUkwsXG4gICAgICBwaG9uZU51bWJlcixcbiAgICAgIHRlbmFudElkLFxuICAgICAgc3RzVG9rZW5NYW5hZ2VyLFxuICAgICAgY3JlYXRlZEF0LFxuICAgICAgbGFzdExvZ2luQXRcbiAgICB9KTtcblxuICAgIGlmIChwcm92aWRlckRhdGEgJiYgQXJyYXkuaXNBcnJheShwcm92aWRlckRhdGEpKSB7XG4gICAgICB1c2VyLnByb3ZpZGVyRGF0YSA9IHByb3ZpZGVyRGF0YS5tYXAodXNlckluZm8gPT4gKHsgLi4udXNlckluZm8gfSkpO1xuICAgIH1cblxuICAgIGlmIChfcmVkaXJlY3RFdmVudElkKSB7XG4gICAgICB1c2VyLl9yZWRpcmVjdEV2ZW50SWQgPSBfcmVkaXJlY3RFdmVudElkO1xuICAgIH1cblxuICAgIHJldHVybiB1c2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgYSBVc2VyIGZyb20gYW4gaWRUb2tlbiBzZXJ2ZXIgcmVzcG9uc2VcbiAgICogQHBhcmFtIGF1dGhcbiAgICogQHBhcmFtIGlkVG9rZW5SZXNwb25zZVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIF9mcm9tSWRUb2tlblJlc3BvbnNlKFxuICAgIGF1dGg6IEF1dGhJbnRlcm5hbCxcbiAgICBpZFRva2VuUmVzcG9uc2U6IElkVG9rZW5SZXNwb25zZSxcbiAgICBpc0Fub255bW91czogYm9vbGVhbiA9IGZhbHNlXG4gICk6IFByb21pc2U8VXNlckludGVybmFsPiB7XG4gICAgY29uc3Qgc3RzVG9rZW5NYW5hZ2VyID0gbmV3IFN0c1Rva2VuTWFuYWdlcigpO1xuICAgIHN0c1Rva2VuTWFuYWdlci51cGRhdGVGcm9tU2VydmVyUmVzcG9uc2UoaWRUb2tlblJlc3BvbnNlKTtcblxuICAgIC8vIEluaXRpYWxpemUgdGhlIEZpcmViYXNlIEF1dGggdXNlci5cbiAgICBjb25zdCB1c2VyID0gbmV3IFVzZXJJbXBsKHtcbiAgICAgIHVpZDogaWRUb2tlblJlc3BvbnNlLmxvY2FsSWQsXG4gICAgICBhdXRoLFxuICAgICAgc3RzVG9rZW5NYW5hZ2VyLFxuICAgICAgaXNBbm9ueW1vdXNcbiAgICB9KTtcblxuICAgIC8vIFVwZGF0ZXMgdGhlIHVzZXIgaW5mbyBhbmQgZGF0YSBhbmQgcmVzb2x2ZXMgd2l0aCBhIHVzZXIgaW5zdGFuY2UuXG4gICAgYXdhaXQgX3JlbG9hZFdpdGhvdXRTYXZpbmcodXNlcik7XG4gICAgcmV0dXJuIHVzZXI7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBkZWJ1Z0Fzc2VydCB9IGZyb20gJy4vYXNzZXJ0JztcblxuLyoqXG4gKiBPdXIgQVBJIGhhcyBhIGxvdCBvZiBvbmUtb2ZmIGNvbnN0YW50cyB0aGF0IGFyZSB1c2VkIHRvIGRvIHRoaW5ncy5cbiAqIFVuZm9ydHVuYXRlbHkgd2UgY2FuJ3QgZXhwb3J0IHRoZXNlIGFzIGNsYXNzZXMgaW5zdGFudGlhdGVkIGRpcmVjdGx5IHNpbmNlXG4gKiB0aGUgY29uc3RydWN0b3IgbWF5IHNpZGUgZWZmZWN0IGFuZCB0aGVyZWZvcmUgY2FuJ3QgYmUgcHJvdmVuIHRvIGJlIHNhZmVseVxuICogY3VsbGVkLiBJbnN0ZWFkLCB3ZSBleHBvcnQgdGhlc2UgY2xhc3NlcyB0aGVtc2VsdmVzIGFzIGEgbG93ZXJDYW1lbENhc2VcbiAqIGNvbnN0YW50LCBhbmQgaW5zdGFudGlhdGUgdGhlbSB1bmRlciB0aGUgaG9vZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaW5nbGV0b25JbnN0YW50aWF0b3I8VD4ge1xuICBuZXcgKCk6IFQ7XG59XG5cbmNvbnN0IGluc3RhbmNlQ2FjaGU6IE1hcDx1bmtub3duLCB1bmtub3duPiA9IG5ldyBNYXAoKTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9nZXRJbnN0YW5jZTxUPihjbHM6IHVua25vd24pOiBUIHtcbiAgZGVidWdBc3NlcnQoY2xzIGluc3RhbmNlb2YgRnVuY3Rpb24sICdFeHBlY3RlZCBhIGNsYXNzIGRlZmluaXRpb24nKTtcbiAgbGV0IGluc3RhbmNlID0gaW5zdGFuY2VDYWNoZS5nZXQoY2xzKSBhcyBUIHwgdW5kZWZpbmVkO1xuXG4gIGlmIChpbnN0YW5jZSkge1xuICAgIGRlYnVnQXNzZXJ0KFxuICAgICAgaW5zdGFuY2UgaW5zdGFuY2VvZiBjbHMsXG4gICAgICAnSW5zdGFuY2Ugc3RvcmVkIGluIGNhY2hlIG1pc21hdGNoZWQgd2l0aCBjbGFzcydcbiAgICApO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIGluc3RhbmNlID0gbmV3IChjbHMgYXMgU2luZ2xldG9uSW5zdGFudGlhdG9yPFQ+KSgpO1xuICBpbnN0YW5jZUNhY2hlLnNldChjbHMsIGluc3RhbmNlKTtcbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX2NsZWFySW5zdGFuY2VNYXAoKTogdm9pZCB7XG4gIGluc3RhbmNlQ2FjaGUuY2xlYXIoKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBQZXJzaXN0ZW5jZSB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbmltcG9ydCB7XG4gIFBlcnNpc3RlbmNlSW50ZXJuYWwsXG4gIFBlcnNpc3RlbmNlVHlwZSxcbiAgUGVyc2lzdGVuY2VWYWx1ZSxcbiAgU3RvcmFnZUV2ZW50TGlzdGVuZXJcbn0gZnJvbSAnLi4vcGVyc2lzdGVuY2UnO1xuXG5leHBvcnQgY2xhc3MgSW5NZW1vcnlQZXJzaXN0ZW5jZSBpbXBsZW1lbnRzIFBlcnNpc3RlbmNlSW50ZXJuYWwge1xuICBzdGF0aWMgdHlwZTogJ05PTkUnID0gJ05PTkUnO1xuICByZWFkb25seSB0eXBlID0gUGVyc2lzdGVuY2VUeXBlLk5PTkU7XG4gIHN0b3JhZ2U6IFJlY29yZDxzdHJpbmcsIFBlcnNpc3RlbmNlVmFsdWU+ID0ge307XG5cbiAgYXN5bmMgX2lzQXZhaWxhYmxlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYXN5bmMgX3NldChrZXk6IHN0cmluZywgdmFsdWU6IFBlcnNpc3RlbmNlVmFsdWUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnN0b3JhZ2Vba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgYXN5bmMgX2dldDxUIGV4dGVuZHMgUGVyc2lzdGVuY2VWYWx1ZT4oa2V5OiBzdHJpbmcpOiBQcm9taXNlPFQgfCBudWxsPiB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnN0b3JhZ2Vba2V5XTtcbiAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiAodmFsdWUgYXMgVCk7XG4gIH1cblxuICBhc3luYyBfcmVtb3ZlKGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZGVsZXRlIHRoaXMuc3RvcmFnZVtrZXldO1xuICB9XG5cbiAgX2FkZExpc3RlbmVyKF9rZXk6IHN0cmluZywgX2xpc3RlbmVyOiBTdG9yYWdlRXZlbnRMaXN0ZW5lcik6IHZvaWQge1xuICAgIC8vIExpc3RlbmVycyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgaW4tbWVtb3J5IHN0b3JhZ2Ugc2luY2UgaXQgY2Fubm90IGJlIHNoYXJlZCBhY3Jvc3Mgd2luZG93cy93b3JrZXJzXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgX3JlbW92ZUxpc3RlbmVyKF9rZXk6IHN0cmluZywgX2xpc3RlbmVyOiBTdG9yYWdlRXZlbnRMaXN0ZW5lcik6IHZvaWQge1xuICAgIC8vIExpc3RlbmVycyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgaW4tbWVtb3J5IHN0b3JhZ2Ugc2luY2UgaXQgY2Fubm90IGJlIHNoYXJlZCBhY3Jvc3Mgd2luZG93cy93b3JrZXJzXG4gICAgcmV0dXJuO1xuICB9XG59XG5cbi8qKlxuICogQW4gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFBlcnNpc3RlbmNlfSBvZiB0eXBlICdOT05FJy5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBpbk1lbW9yeVBlcnNpc3RlbmNlOiBQZXJzaXN0ZW5jZSA9IEluTWVtb3J5UGVyc2lzdGVuY2U7XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgQXBpS2V5LCBBcHBOYW1lLCBBdXRoSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9hdXRoJztcbmltcG9ydCB7IFVzZXJJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL3VzZXInO1xuaW1wb3J0IHsgUGVyc2lzdGVkQmxvYiwgUGVyc2lzdGVuY2VJbnRlcm5hbCB9IGZyb20gJy4uL3BlcnNpc3RlbmNlJztcbmltcG9ydCB7IFVzZXJJbXBsIH0gZnJvbSAnLi4vdXNlci91c2VyX2ltcGwnO1xuaW1wb3J0IHsgX2dldEluc3RhbmNlIH0gZnJvbSAnLi4vdXRpbC9pbnN0YW50aWF0b3InO1xuaW1wb3J0IHsgaW5NZW1vcnlQZXJzaXN0ZW5jZSB9IGZyb20gJy4vaW5fbWVtb3J5JztcblxuZXhwb3J0IGNvbnN0IGVudW0gS2V5TmFtZSB7XG4gIEFVVEhfVVNFUiA9ICdhdXRoVXNlcicsXG4gIEFVVEhfRVZFTlQgPSAnYXV0aEV2ZW50JyxcbiAgUkVESVJFQ1RfVVNFUiA9ICdyZWRpcmVjdFVzZXInLFxuICBQRVJTSVNURU5DRV9VU0VSID0gJ3BlcnNpc3RlbmNlJ1xufVxuZXhwb3J0IGNvbnN0IGVudW0gTmFtZXNwYWNlIHtcbiAgUEVSU0lTVEVOQ0UgPSAnZmlyZWJhc2UnXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfcGVyc2lzdGVuY2VLZXlOYW1lKFxuICBrZXk6IHN0cmluZyxcbiAgYXBpS2V5OiBBcGlLZXksXG4gIGFwcE5hbWU6IEFwcE5hbWVcbik6IHN0cmluZyB7XG4gIHJldHVybiBgJHtOYW1lc3BhY2UuUEVSU0lTVEVOQ0V9OiR7a2V5fToke2FwaUtleX06JHthcHBOYW1lfWA7XG59XG5cbmV4cG9ydCBjbGFzcyBQZXJzaXN0ZW5jZVVzZXJNYW5hZ2VyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBmdWxsVXNlcktleTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGZ1bGxQZXJzaXN0ZW5jZUtleTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGJvdW5kRXZlbnRIYW5kbGVyOiAoKSA9PiB2b2lkO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHBlcnNpc3RlbmNlOiBQZXJzaXN0ZW5jZUludGVybmFsLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYXV0aDogQXV0aEludGVybmFsLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdXNlcktleTogc3RyaW5nXG4gICkge1xuICAgIGNvbnN0IHsgY29uZmlnLCBuYW1lIH0gPSB0aGlzLmF1dGg7XG4gICAgdGhpcy5mdWxsVXNlcktleSA9IF9wZXJzaXN0ZW5jZUtleU5hbWUodGhpcy51c2VyS2V5LCBjb25maWcuYXBpS2V5LCBuYW1lKTtcbiAgICB0aGlzLmZ1bGxQZXJzaXN0ZW5jZUtleSA9IF9wZXJzaXN0ZW5jZUtleU5hbWUoXG4gICAgICBLZXlOYW1lLlBFUlNJU1RFTkNFX1VTRVIsXG4gICAgICBjb25maWcuYXBpS2V5LFxuICAgICAgbmFtZVxuICAgICk7XG4gICAgdGhpcy5ib3VuZEV2ZW50SGFuZGxlciA9IGF1dGguX29uU3RvcmFnZUV2ZW50LmJpbmQoYXV0aCk7XG4gICAgdGhpcy5wZXJzaXN0ZW5jZS5fYWRkTGlzdGVuZXIodGhpcy5mdWxsVXNlcktleSwgdGhpcy5ib3VuZEV2ZW50SGFuZGxlcik7XG4gIH1cblxuICBzZXRDdXJyZW50VXNlcih1c2VyOiBVc2VySW50ZXJuYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZS5fc2V0KHRoaXMuZnVsbFVzZXJLZXksIHVzZXIudG9KU09OKCkpO1xuICB9XG5cbiAgYXN5bmMgZ2V0Q3VycmVudFVzZXIoKTogUHJvbWlzZTxVc2VySW50ZXJuYWwgfCBudWxsPiB7XG4gICAgY29uc3QgYmxvYiA9IGF3YWl0IHRoaXMucGVyc2lzdGVuY2UuX2dldDxQZXJzaXN0ZWRCbG9iPih0aGlzLmZ1bGxVc2VyS2V5KTtcbiAgICByZXR1cm4gYmxvYiA/IFVzZXJJbXBsLl9mcm9tSlNPTih0aGlzLmF1dGgsIGJsb2IpIDogbnVsbDtcbiAgfVxuXG4gIHJlbW92ZUN1cnJlbnRVc2VyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnBlcnNpc3RlbmNlLl9yZW1vdmUodGhpcy5mdWxsVXNlcktleSk7XG4gIH1cblxuICBzYXZlUGVyc2lzdGVuY2VGb3JSZWRpcmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZS5fc2V0KFxuICAgICAgdGhpcy5mdWxsUGVyc2lzdGVuY2VLZXksXG4gICAgICB0aGlzLnBlcnNpc3RlbmNlLnR5cGVcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgc2V0UGVyc2lzdGVuY2UobmV3UGVyc2lzdGVuY2U6IFBlcnNpc3RlbmNlSW50ZXJuYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5wZXJzaXN0ZW5jZSA9PT0gbmV3UGVyc2lzdGVuY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50VXNlciA9IGF3YWl0IHRoaXMuZ2V0Q3VycmVudFVzZXIoKTtcbiAgICBhd2FpdCB0aGlzLnJlbW92ZUN1cnJlbnRVc2VyKCk7XG5cbiAgICB0aGlzLnBlcnNpc3RlbmNlID0gbmV3UGVyc2lzdGVuY2U7XG5cbiAgICBpZiAoY3VycmVudFVzZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLnNldEN1cnJlbnRVc2VyKGN1cnJlbnRVc2VyKTtcbiAgICB9XG4gIH1cblxuICBkZWxldGUoKTogdm9pZCB7XG4gICAgdGhpcy5wZXJzaXN0ZW5jZS5fcmVtb3ZlTGlzdGVuZXIodGhpcy5mdWxsVXNlcktleSwgdGhpcy5ib3VuZEV2ZW50SGFuZGxlcik7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgY3JlYXRlKFxuICAgIGF1dGg6IEF1dGhJbnRlcm5hbCxcbiAgICBwZXJzaXN0ZW5jZUhpZXJhcmNoeTogUGVyc2lzdGVuY2VJbnRlcm5hbFtdLFxuICAgIHVzZXJLZXkgPSBLZXlOYW1lLkFVVEhfVVNFUlxuICApOiBQcm9taXNlPFBlcnNpc3RlbmNlVXNlck1hbmFnZXI+IHtcbiAgICBpZiAoIXBlcnNpc3RlbmNlSGllcmFyY2h5Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIG5ldyBQZXJzaXN0ZW5jZVVzZXJNYW5hZ2VyKFxuICAgICAgICBfZ2V0SW5zdGFuY2UoaW5NZW1vcnlQZXJzaXN0ZW5jZSksXG4gICAgICAgIGF1dGgsXG4gICAgICAgIHVzZXJLZXlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRWxpbWluYXRlIGFueSBwZXJzaXN0ZW5jZXMgdGhhdCBhcmUgbm90IGF2YWlsYWJsZVxuICAgIGNvbnN0IGF2YWlsYWJsZVBlcnNpc3RlbmNlcyA9IChcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBwZXJzaXN0ZW5jZUhpZXJhcmNoeS5tYXAoYXN5bmMgcGVyc2lzdGVuY2UgPT4ge1xuICAgICAgICAgIGlmIChhd2FpdCBwZXJzaXN0ZW5jZS5faXNBdmFpbGFibGUoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHBlcnNpc3RlbmNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICkuZmlsdGVyKHBlcnNpc3RlbmNlID0+IHBlcnNpc3RlbmNlKSBhcyBQZXJzaXN0ZW5jZUludGVybmFsW107XG5cbiAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIGZpcnN0IHBlcnNpc3RlbmNlIGxpc3RlZCwgb3IgaW4gbWVtb3J5IGlmIG5vbmUgYXZhaWxhYmxlXG4gICAgbGV0IHNlbGVjdGVkUGVyc2lzdGVuY2UgPVxuICAgICAgYXZhaWxhYmxlUGVyc2lzdGVuY2VzWzBdIHx8XG4gICAgICBfZ2V0SW5zdGFuY2U8UGVyc2lzdGVuY2VJbnRlcm5hbD4oaW5NZW1vcnlQZXJzaXN0ZW5jZSk7XG5cbiAgICBjb25zdCBrZXkgPSBfcGVyc2lzdGVuY2VLZXlOYW1lKHVzZXJLZXksIGF1dGguY29uZmlnLmFwaUtleSwgYXV0aC5uYW1lKTtcblxuICAgIC8vIFB1bGwgb3V0IHRoZSBleGlzdGluZyB1c2VyLCBzZXR0aW5nIHRoZSBjaG9zZW4gcGVyc2lzdGVuY2UgdG8gdGhhdFxuICAgIC8vIHBlcnNpc3RlbmNlIGlmIHRoZSB1c2VyIGV4aXN0cy5cbiAgICBsZXQgdXNlclRvTWlncmF0ZTogVXNlckludGVybmFsIHwgbnVsbCA9IG51bGw7XG4gICAgLy8gTm90ZSwgaGVyZSB3ZSBjaGVjayBmb3IgYSB1c2VyIGluIF9hbGxfIHBlcnNpc3RlbmNlcywgbm90IGp1c3QgdGhlXG4gICAgLy8gb25lcyBkZWVtZWQgYXZhaWxhYmxlLiBJZiB3ZSBjYW4gbWlncmF0ZSBhIHVzZXIgb3V0IG9mIGEgYnJva2VuXG4gICAgLy8gcGVyc2lzdGVuY2UsIHdlIHdpbGwgKGJ1dCBvbmx5IGlmIHRoYXQgcGVyc2lzdGVuY2Ugc3VwcG9ydHMgbWlncmF0aW9uKS5cbiAgICBmb3IgKGNvbnN0IHBlcnNpc3RlbmNlIG9mIHBlcnNpc3RlbmNlSGllcmFyY2h5KSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBibG9iID0gYXdhaXQgcGVyc2lzdGVuY2UuX2dldDxQZXJzaXN0ZWRCbG9iPihrZXkpO1xuICAgICAgICBpZiAoYmxvYikge1xuICAgICAgICAgIGNvbnN0IHVzZXIgPSBVc2VySW1wbC5fZnJvbUpTT04oYXV0aCwgYmxvYik7IC8vIHRocm93cyBmb3IgdW5wYXJzYWJsZSBibG9iICh3cm9uZyBmb3JtYXQpXG4gICAgICAgICAgaWYgKHBlcnNpc3RlbmNlICE9PSBzZWxlY3RlZFBlcnNpc3RlbmNlKSB7XG4gICAgICAgICAgICB1c2VyVG9NaWdyYXRlID0gdXNlcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VsZWN0ZWRQZXJzaXN0ZW5jZSA9IHBlcnNpc3RlbmNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHt9XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgZmluZCB0aGUgdXNlciBpbiBhIHBlcnNpc3RlbmNlIHRoYXQgZG9lcyBzdXBwb3J0IG1pZ3JhdGlvbiwgdXNlXG4gICAgLy8gdGhhdCBtaWdyYXRpb24gcGF0aCAob2Ygb25seSBwZXJzaXN0ZW5jZXMgdGhhdCBzdXBwb3J0IG1pZ3JhdGlvbilcbiAgICBjb25zdCBtaWdyYXRpb25IaWVyYXJjaHkgPSBhdmFpbGFibGVQZXJzaXN0ZW5jZXMuZmlsdGVyKFxuICAgICAgcCA9PiBwLl9zaG91bGRBbGxvd01pZ3JhdGlvblxuICAgICk7XG5cbiAgICAvLyBJZiB0aGUgcGVyc2lzdGVuY2UgZG9lcyBfbm90XyBhbGxvdyBtaWdyYXRpb24sIGp1c3QgZmluaXNoIG9mZiBoZXJlXG4gICAgaWYgKFxuICAgICAgIXNlbGVjdGVkUGVyc2lzdGVuY2UuX3Nob3VsZEFsbG93TWlncmF0aW9uIHx8XG4gICAgICAhbWlncmF0aW9uSGllcmFyY2h5Lmxlbmd0aFxuICAgICkge1xuICAgICAgcmV0dXJuIG5ldyBQZXJzaXN0ZW5jZVVzZXJNYW5hZ2VyKHNlbGVjdGVkUGVyc2lzdGVuY2UsIGF1dGgsIHVzZXJLZXkpO1xuICAgIH1cblxuICAgIHNlbGVjdGVkUGVyc2lzdGVuY2UgPSBtaWdyYXRpb25IaWVyYXJjaHlbMF07XG4gICAgaWYgKHVzZXJUb01pZ3JhdGUpIHtcbiAgICAgIC8vIFRoaXMgbm9ybWFsbHkgc2hvdWxkbid0IHRocm93IHNpbmNlIGNob3NlblBlcnNpc3RlbmNlLmlzQXZhaWxhYmxlKCkgaXMgdHJ1ZSwgYnV0IGlmIGl0IGRvZXNcbiAgICAgIC8vIHdlJ2xsIGp1c3QgbGV0IGl0IGJ1YmJsZSB0byBzdXJmYWNlIHRoZSBlcnJvci5cbiAgICAgIGF3YWl0IHNlbGVjdGVkUGVyc2lzdGVuY2UuX3NldChrZXksIHVzZXJUb01pZ3JhdGUudG9KU09OKCkpO1xuICAgIH1cblxuICAgIC8vIEF0dGVtcHQgdG8gY2xlYXIgdGhlIGtleSBpbiBvdGhlciBwZXJzaXN0ZW5jZXMgYnV0IGlnbm9yZSBlcnJvcnMuIFRoaXMgaGVscHMgcHJldmVudCBpc3N1ZXNcbiAgICAvLyBzdWNoIGFzIHVzZXJzIGdldHRpbmcgc3R1Y2sgd2l0aCBhIHByZXZpb3VzIGFjY291bnQgYWZ0ZXIgc2lnbmluZyBvdXQgYW5kIHJlZnJlc2hpbmcgdGhlIHRhYi5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHBlcnNpc3RlbmNlSGllcmFyY2h5Lm1hcChhc3luYyBwZXJzaXN0ZW5jZSA9PiB7XG4gICAgICAgIGlmIChwZXJzaXN0ZW5jZSAhPT0gc2VsZWN0ZWRQZXJzaXN0ZW5jZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBwZXJzaXN0ZW5jZS5fcmVtb3ZlKGtleSk7XG4gICAgICAgICAgfSBjYXRjaCB7fVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gICAgcmV0dXJuIG5ldyBQZXJzaXN0ZW5jZVVzZXJNYW5hZ2VyKHNlbGVjdGVkUGVyc2lzdGVuY2UsIGF1dGgsIHVzZXJLZXkpO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgaXNJRSwgZ2V0VUEgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5cbmludGVyZmFjZSBOYXZpZ2F0b3JTdGFuZGFsb25lIGV4dGVuZHMgTmF2aWdhdG9yIHtcbiAgc3RhbmRhbG9uZT86IHVua25vd247XG59XG5cbmludGVyZmFjZSBEb2N1bWVudCB7XG4gIGRvY3VtZW50TW9kZT86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBFbnVtcyBmb3IgQnJvd3NlciBuYW1lLlxuICovXG5leHBvcnQgY29uc3QgZW51bSBCcm93c2VyTmFtZSB7XG4gIEFORFJPSUQgPSAnQW5kcm9pZCcsXG4gIEJMQUNLQkVSUlkgPSAnQmxhY2tiZXJyeScsXG4gIEVER0UgPSAnRWRnZScsXG4gIEZJUkVGT1ggPSAnRmlyZWZveCcsXG4gIElFID0gJ0lFJyxcbiAgSUVNT0JJTEUgPSAnSUVNb2JpbGUnLFxuICBPUEVSQSA9ICdPcGVyYScsXG4gIE9USEVSID0gJ090aGVyJyxcbiAgQ0hST01FID0gJ0Nocm9tZScsXG4gIFNBRkFSSSA9ICdTYWZhcmknLFxuICBTSUxLID0gJ1NpbGsnLFxuICBXRUJPUyA9ICdXZWJvcydcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgdGhlIGJyb3dzZXIgZm9yIHRoZSBwdXJwb3NlcyBvZiByZXBvcnRpbmcgdXNhZ2UgdG8gdGhlIEFQSVxuICovXG5leHBvcnQgZnVuY3Rpb24gX2dldEJyb3dzZXJOYW1lKHVzZXJBZ2VudDogc3RyaW5nKTogQnJvd3Nlck5hbWUgfCBzdHJpbmcge1xuICBjb25zdCB1YSA9IHVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpO1xuICBpZiAodWEuaW5jbHVkZXMoJ29wZXJhLycpIHx8IHVhLmluY2x1ZGVzKCdvcHIvJykgfHwgdWEuaW5jbHVkZXMoJ29waW9zLycpKSB7XG4gICAgcmV0dXJuIEJyb3dzZXJOYW1lLk9QRVJBO1xuICB9IGVsc2UgaWYgKF9pc0lFTW9iaWxlKHVhKSkge1xuICAgIC8vIFdpbmRvd3MgcGhvbmUgSUVNb2JpbGUgYnJvd3Nlci5cbiAgICByZXR1cm4gQnJvd3Nlck5hbWUuSUVNT0JJTEU7XG4gIH0gZWxzZSBpZiAodWEuaW5jbHVkZXMoJ21zaWUnKSB8fCB1YS5pbmNsdWRlcygndHJpZGVudC8nKSkge1xuICAgIHJldHVybiBCcm93c2VyTmFtZS5JRTtcbiAgfSBlbHNlIGlmICh1YS5pbmNsdWRlcygnZWRnZS8nKSkge1xuICAgIHJldHVybiBCcm93c2VyTmFtZS5FREdFO1xuICB9IGVsc2UgaWYgKF9pc0ZpcmVmb3godWEpKSB7XG4gICAgcmV0dXJuIEJyb3dzZXJOYW1lLkZJUkVGT1g7XG4gIH0gZWxzZSBpZiAodWEuaW5jbHVkZXMoJ3NpbGsvJykpIHtcbiAgICByZXR1cm4gQnJvd3Nlck5hbWUuU0lMSztcbiAgfSBlbHNlIGlmIChfaXNCbGFja0JlcnJ5KHVhKSkge1xuICAgIC8vIEJsYWNrYmVycnkgYnJvd3Nlci5cbiAgICByZXR1cm4gQnJvd3Nlck5hbWUuQkxBQ0tCRVJSWTtcbiAgfSBlbHNlIGlmIChfaXNXZWJPUyh1YSkpIHtcbiAgICAvLyBXZWJPUyBkZWZhdWx0IGJyb3dzZXIuXG4gICAgcmV0dXJuIEJyb3dzZXJOYW1lLldFQk9TO1xuICB9IGVsc2UgaWYgKF9pc1NhZmFyaSh1YSkpIHtcbiAgICByZXR1cm4gQnJvd3Nlck5hbWUuU0FGQVJJO1xuICB9IGVsc2UgaWYgKFxuICAgICh1YS5pbmNsdWRlcygnY2hyb21lLycpIHx8IF9pc0Nocm9tZUlPUyh1YSkpICYmXG4gICAgIXVhLmluY2x1ZGVzKCdlZGdlLycpXG4gICkge1xuICAgIHJldHVybiBCcm93c2VyTmFtZS5DSFJPTUU7XG4gIH0gZWxzZSBpZiAoX2lzQW5kcm9pZCh1YSkpIHtcbiAgICAvLyBBbmRyb2lkIHN0b2NrIGJyb3dzZXIuXG4gICAgcmV0dXJuIEJyb3dzZXJOYW1lLkFORFJPSUQ7XG4gIH0gZWxzZSB7XG4gICAgLy8gTW9zdCBtb2Rlcm4gYnJvd3NlcnMgaGF2ZSBuYW1lL3ZlcnNpb24gYXQgZW5kIG9mIHVzZXIgYWdlbnQgc3RyaW5nLlxuICAgIGNvbnN0IHJlID0gLyhbYS16QS1aXFxkXFwuXSspXFwvW2EtekEtWlxcZFxcLl0qJC87XG4gICAgY29uc3QgbWF0Y2hlcyA9IHVzZXJBZ2VudC5tYXRjaChyZSk7XG4gICAgaWYgKG1hdGNoZXM/Lmxlbmd0aCA9PT0gMikge1xuICAgICAgcmV0dXJuIG1hdGNoZXNbMV07XG4gICAgfVxuICB9XG4gIHJldHVybiBCcm93c2VyTmFtZS5PVEhFUjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9pc0ZpcmVmb3godWEgPSBnZXRVQSgpKTogYm9vbGVhbiB7XG4gIHJldHVybiAvZmlyZWZveFxcLy9pLnRlc3QodWEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX2lzU2FmYXJpKHVzZXJBZ2VudCA9IGdldFVBKCkpOiBib29sZWFuIHtcbiAgY29uc3QgdWEgPSB1c2VyQWdlbnQudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIChcbiAgICB1YS5pbmNsdWRlcygnc2FmYXJpLycpICYmXG4gICAgIXVhLmluY2x1ZGVzKCdjaHJvbWUvJykgJiZcbiAgICAhdWEuaW5jbHVkZXMoJ2NyaW9zLycpICYmXG4gICAgIXVhLmluY2x1ZGVzKCdhbmRyb2lkJylcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9pc0Nocm9tZUlPUyh1YSA9IGdldFVBKCkpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9jcmlvc1xcLy9pLnRlc3QodWEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX2lzSUVNb2JpbGUodWEgPSBnZXRVQSgpKTogYm9vbGVhbiB7XG4gIHJldHVybiAvaWVtb2JpbGUvaS50ZXN0KHVhKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9pc0FuZHJvaWQodWEgPSBnZXRVQSgpKTogYm9vbGVhbiB7XG4gIHJldHVybiAvYW5kcm9pZC9pLnRlc3QodWEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX2lzQmxhY2tCZXJyeSh1YSA9IGdldFVBKCkpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9ibGFja2JlcnJ5L2kudGVzdCh1YSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfaXNXZWJPUyh1YSA9IGdldFVBKCkpOiBib29sZWFuIHtcbiAgcmV0dXJuIC93ZWJvcy9pLnRlc3QodWEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX2lzSU9TKHVhID0gZ2V0VUEoKSk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIC9pcGhvbmV8aXBhZHxpcG9kL2kudGVzdCh1YSkgfHxcbiAgICAoL21hY2ludG9zaC9pLnRlc3QodWEpICYmIC9tb2JpbGUvaS50ZXN0KHVhKSlcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9pc0lPUzdPcjgodWEgPSBnZXRVQSgpKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgLyhpUGFkfGlQaG9uZXxpUG9kKS4qT1MgN19cXGQvaS50ZXN0KHVhKSB8fFxuICAgIC8oaVBhZHxpUGhvbmV8aVBvZCkuKk9TIDhfXFxkL2kudGVzdCh1YSlcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9pc0lPU1N0YW5kYWxvbmUodWEgPSBnZXRVQSgpKTogYm9vbGVhbiB7XG4gIHJldHVybiBfaXNJT1ModWEpICYmICEhKHdpbmRvdy5uYXZpZ2F0b3IgYXMgTmF2aWdhdG9yU3RhbmRhbG9uZSk/LnN0YW5kYWxvbmU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfaXNJRTEwKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNJRSgpICYmIChkb2N1bWVudCBhcyBEb2N1bWVudCkuZG9jdW1lbnRNb2RlID09PSAxMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9pc01vYmlsZUJyb3dzZXIodWE6IHN0cmluZyA9IGdldFVBKCkpOiBib29sZWFuIHtcbiAgLy8gVE9ETzogaW1wbGVtZW50IGdldEJyb3dzZXJOYW1lIGVxdWl2YWxlbnQgZm9yIE9TLlxuICByZXR1cm4gKFxuICAgIF9pc0lPUyh1YSkgfHxcbiAgICBfaXNBbmRyb2lkKHVhKSB8fFxuICAgIF9pc1dlYk9TKHVhKSB8fFxuICAgIF9pc0JsYWNrQmVycnkodWEpIHx8XG4gICAgL3dpbmRvd3MgcGhvbmUvaS50ZXN0KHVhKSB8fFxuICAgIF9pc0lFTW9iaWxlKHVhKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX2lzSWZyYW1lKCk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIC8vIENoZWNrIHRoYXQgdGhlIGN1cnJlbnQgd2luZG93IGlzIG5vdCB0aGUgdG9wIHdpbmRvdy5cbiAgICAvLyBJZiBzbywgcmV0dXJuIHRydWUuXG4gICAgcmV0dXJuICEhKHdpbmRvdyAmJiB3aW5kb3cgIT09IHdpbmRvdy50b3ApO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgU0RLX1ZFUlNJT04gfSBmcm9tICdAZmlyZWJhc2UvYXBwJztcbmltcG9ydCB7IF9nZXRCcm93c2VyTmFtZSB9IGZyb20gJy4vYnJvd3Nlcic7XG5pbXBvcnQgeyBnZXRVQSB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcblxuZXhwb3J0IGNvbnN0IGVudW0gQ2xpZW50SW1wbGVtZW50YXRpb24ge1xuICBDT1JFID0gJ0pzQ29yZSdcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGVudW0gQ2xpZW50UGxhdGZvcm0ge1xuICBCUk9XU0VSID0gJ0Jyb3dzZXInLFxuICBOT0RFID0gJ05vZGUnLFxuICBSRUFDVF9OQVRJVkUgPSAnUmVhY3ROYXRpdmUnLFxuICBDT1JET1ZBID0gJ0NvcmRvdmEnLFxuICBXT1JLRVIgPSAnV29ya2VyJ1xufVxuXG4vKlxuICogRGV0ZXJtaW5lIHRoZSBTREsgdmVyc2lvbiBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9nZXRDbGllbnRWZXJzaW9uKFxuICBjbGllbnRQbGF0Zm9ybTogQ2xpZW50UGxhdGZvcm0sXG4gIGZyYW1ld29ya3M6IHJlYWRvbmx5IHN0cmluZ1tdID0gW11cbik6IHN0cmluZyB7XG4gIGxldCByZXBvcnRlZFBsYXRmb3JtOiBzdHJpbmc7XG4gIHN3aXRjaCAoY2xpZW50UGxhdGZvcm0pIHtcbiAgICBjYXNlIENsaWVudFBsYXRmb3JtLkJST1dTRVI6XG4gICAgICAvLyBJbiBhIGJyb3dzZXIgZW52aXJvbm1lbnQsIHJlcG9ydCB0aGUgYnJvd3NlciBuYW1lLlxuICAgICAgcmVwb3J0ZWRQbGF0Zm9ybSA9IF9nZXRCcm93c2VyTmFtZShnZXRVQSgpKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgQ2xpZW50UGxhdGZvcm0uV09SS0VSOlxuICAgICAgLy8gVGVjaG5pY2FsbHkgYSB3b3JrZXIgcnVucyBmcm9tIGEgYnJvd3NlciBidXQgd2UgbmVlZCB0byBkaWZmZXJlbnRpYXRlIGFcbiAgICAgIC8vIHdvcmtlciBmcm9tIGEgYnJvd3Nlci5cbiAgICAgIC8vIEZvciBleGFtcGxlOiBDaHJvbWUtV29ya2VyL0pzQ29yZS80LjkuMS9GaXJlYmFzZUNvcmUtd2ViLlxuICAgICAgcmVwb3J0ZWRQbGF0Zm9ybSA9IGAke19nZXRCcm93c2VyTmFtZShnZXRVQSgpKX0tJHtjbGllbnRQbGF0Zm9ybX1gO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJlcG9ydGVkUGxhdGZvcm0gPSBjbGllbnRQbGF0Zm9ybTtcbiAgfVxuICBjb25zdCByZXBvcnRlZEZyYW1ld29ya3MgPSBmcmFtZXdvcmtzLmxlbmd0aFxuICAgID8gZnJhbWV3b3Jrcy5qb2luKCcsJylcbiAgICA6ICdGaXJlYmFzZUNvcmUtd2ViJzsgLyogZGVmYXVsdCB2YWx1ZSBpZiBubyBvdGhlciBmcmFtZXdvcmsgaXMgdXNlZCAqL1xuICByZXR1cm4gYCR7cmVwb3J0ZWRQbGF0Zm9ybX0vJHtDbGllbnRJbXBsZW1lbnRhdGlvbi5DT1JFfS8ke1NES19WRVJTSU9OfS8ke3JlcG9ydGVkRnJhbWV3b3Jrc31gO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEF1dGhJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL2F1dGgnO1xuaW1wb3J0IHsgVW5zdWJzY3JpYmUsIFVzZXIgfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmludGVyZmFjZSBNaWRkbGV3YXJlRW50cnkge1xuICAodXNlcjogVXNlciB8IG51bGwpOiBQcm9taXNlPHZvaWQ+O1xuICBvbkFib3J0PzogKCkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGNsYXNzIEF1dGhNaWRkbGV3YXJlUXVldWUge1xuICBwcml2YXRlIHJlYWRvbmx5IHF1ZXVlOiBNaWRkbGV3YXJlRW50cnlbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgYXV0aDogQXV0aEludGVybmFsKSB7fVxuXG4gIHB1c2hDYWxsYmFjayhcbiAgICBjYWxsYmFjazogKHVzZXI6IFVzZXIgfCBudWxsKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPixcbiAgICBvbkFib3J0PzogKCkgPT4gdm9pZFxuICApOiBVbnN1YnNjcmliZSB7XG4gICAgLy8gVGhlIGNhbGxiYWNrIGNvdWxkIGJlIHN5bmMgb3IgYXN5bmMuIFdyYXAgaXQgaW50byBhXG4gICAgLy8gZnVuY3Rpb24gdGhhdCBpcyBhbHdheXMgYXN5bmMuXG4gICAgY29uc3Qgd3JhcHBlZENhbGxiYWNrOiBNaWRkbGV3YXJlRW50cnkgPSAoXG4gICAgICB1c2VyOiBVc2VyIHwgbnVsbFxuICAgICk6IFByb21pc2U8dm9pZD4gPT5cbiAgICAgIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBjYWxsYmFjayh1c2VyKTtcbiAgICAgICAgICAvLyBFaXRoZXIgcmVzb2x2ZSB3aXRoIGV4aXN0aW5nIHByb21pc2Ugb3Igd3JhcCBhIG5vbi1wcm9taXNlXG4gICAgICAgICAgLy8gcmV0dXJuIHZhbHVlIGludG8gYSBwcm9taXNlLlxuICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIFN5bmMgY2FsbGJhY2sgdGhyb3dzLlxuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgLy8gQXR0YWNoIHRoZSBvbkFib3J0IGlmIHByZXNlbnRcbiAgICB3cmFwcGVkQ2FsbGJhY2sub25BYm9ydCA9IG9uQWJvcnQ7XG4gICAgdGhpcy5xdWV1ZS5wdXNoKHdyYXBwZWRDYWxsYmFjayk7XG5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMucXVldWUubGVuZ3RoIC0gMTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgLy8gVW5zdWJzY3JpYmUuIFJlcGxhY2Ugd2l0aCBuby1vcC4gRG8gbm90IHJlbW92ZSBmcm9tIGFycmF5LCBvciBpdCB3aWxsIGRpc3R1cmJcbiAgICAgIC8vIGluZGV4aW5nIG9mIG90aGVyIGVsZW1lbnRzLlxuICAgICAgdGhpcy5xdWV1ZVtpbmRleF0gPSAoKSA9PiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgcnVuTWlkZGxld2FyZShuZXh0VXNlcjogVXNlciB8IG51bGwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5hdXRoLmN1cnJlbnRVc2VyID09PSBuZXh0VXNlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFdoaWxlIHJ1bm5pbmcgdGhlIG1pZGRsZXdhcmUsIGJ1aWxkIGEgdGVtcG9yYXJ5IHN0YWNrIG9mIG9uQWJvcnRcbiAgICAvLyBjYWxsYmFja3MgdG8gY2FsbCBpZiBvbmUgbWlkZGxld2FyZSBjYWxsYmFjayByZWplY3RzLlxuXG4gICAgY29uc3Qgb25BYm9ydFN0YWNrOiBBcnJheTwoKSA9PiB2b2lkPiA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IGJlZm9yZVN0YXRlQ2FsbGJhY2sgb2YgdGhpcy5xdWV1ZSkge1xuICAgICAgICBhd2FpdCBiZWZvcmVTdGF0ZUNhbGxiYWNrKG5leHRVc2VyKTtcblxuICAgICAgICAvLyBPbmx5IHB1c2ggdGhlIG9uQWJvcnQgaWYgdGhlIGNhbGxiYWNrIHN1Y2NlZWRzXG4gICAgICAgIGlmIChiZWZvcmVTdGF0ZUNhbGxiYWNrLm9uQWJvcnQpIHtcbiAgICAgICAgICBvbkFib3J0U3RhY2sucHVzaChiZWZvcmVTdGF0ZUNhbGxiYWNrLm9uQWJvcnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gUnVuIGFsbCBvbkFib3J0LCB3aXRoIHNlcGFyYXRlIHRyeS9jYXRjaCB0byBpZ25vcmUgYW55IGVycm9ycyBhbmRcbiAgICAgIC8vIGNvbnRpbnVlXG4gICAgICBvbkFib3J0U3RhY2sucmV2ZXJzZSgpO1xuICAgICAgZm9yIChjb25zdCBvbkFib3J0IG9mIG9uQWJvcnRTdGFjaykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIG9uQWJvcnQoKTtcbiAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgIC8qIHN3YWxsb3cgZXJyb3IgKi9cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aHJvdyB0aGlzLmF1dGguX2Vycm9yRmFjdG9yeS5jcmVhdGUoQXV0aEVycm9yQ29kZS5MT0dJTl9CTE9DS0VELCB7XG4gICAgICAgIG9yaWdpbmFsTWVzc2FnZTogKGUgYXMgRXJyb3IpPy5tZXNzYWdlXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge1xuICBfcGVyZm9ybUFwaVJlcXVlc3QsXG4gIEVuZHBvaW50LFxuICBIdHRwTWV0aG9kLFxuICBfYWRkVGlkSWZOZWNlc3Nhcnlcbn0gZnJvbSAnLi4vaW5kZXgnO1xuaW1wb3J0IHsgQXV0aCB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbi8qKlxuICogUmVxdWVzdCBvYmplY3QgZm9yIGZldGNoaW5nIHRoZSBwYXNzd29yZCBwb2xpY3kuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0UGFzc3dvcmRQb2xpY3lSZXF1ZXN0IHtcbiAgdGVuYW50SWQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVzcG9uc2Ugb2JqZWN0IGZvciBmZXRjaGluZyB0aGUgcGFzc3dvcmQgcG9saWN5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldFBhc3N3b3JkUG9saWN5UmVzcG9uc2Uge1xuICBjdXN0b21TdHJlbmd0aE9wdGlvbnM6IHtcbiAgICBtaW5QYXNzd29yZExlbmd0aD86IG51bWJlcjtcbiAgICBtYXhQYXNzd29yZExlbmd0aD86IG51bWJlcjtcbiAgICBjb250YWluc0xvd2VyY2FzZUNoYXJhY3Rlcj86IGJvb2xlYW47XG4gICAgY29udGFpbnNVcHBlcmNhc2VDaGFyYWN0ZXI/OiBib29sZWFuO1xuICAgIGNvbnRhaW5zTnVtZXJpY0NoYXJhY3Rlcj86IGJvb2xlYW47XG4gICAgY29udGFpbnNOb25BbHBoYW51bWVyaWNDaGFyYWN0ZXI/OiBib29sZWFuO1xuICB9O1xuICBhbGxvd2VkTm9uQWxwaGFudW1lcmljQ2hhcmFjdGVycz86IHN0cmluZ1tdO1xuICBlbmZvcmNlbWVudFN0YXRlOiBzdHJpbmc7XG4gIGZvcmNlVXBncmFkZU9uU2lnbmluPzogYm9vbGVhbjtcbiAgc2NoZW1hVmVyc2lvbjogbnVtYmVyO1xufVxuXG4vKipcbiAqIEZldGNoZXMgdGhlIHBhc3N3b3JkIHBvbGljeSBmb3IgdGhlIGN1cnJlbnRseSBzZXQgdGVuYW50IG9yIHRoZSBwcm9qZWN0IGlmIG5vIHRlbmFudCBpcyBzZXQuXG4gKlxuICogQHBhcmFtIGF1dGggQXV0aCBvYmplY3QuXG4gKiBAcGFyYW0gcmVxdWVzdCBQYXNzd29yZCBwb2xpY3kgcmVxdWVzdC5cbiAqIEByZXR1cm5zIFBhc3N3b3JkIHBvbGljeSByZXNwb25zZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF9nZXRQYXNzd29yZFBvbGljeShcbiAgYXV0aDogQXV0aCxcbiAgcmVxdWVzdDogR2V0UGFzc3dvcmRQb2xpY3lSZXF1ZXN0ID0ge31cbik6IFByb21pc2U8R2V0UGFzc3dvcmRQb2xpY3lSZXNwb25zZT4ge1xuICByZXR1cm4gX3BlcmZvcm1BcGlSZXF1ZXN0PFxuICAgIEdldFBhc3N3b3JkUG9saWN5UmVxdWVzdCxcbiAgICBHZXRQYXNzd29yZFBvbGljeVJlc3BvbnNlXG4gID4oXG4gICAgYXV0aCxcbiAgICBIdHRwTWV0aG9kLkdFVCxcbiAgICBFbmRwb2ludC5HRVRfUEFTU1dPUkRfUE9MSUNZLFxuICAgIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KVxuICApO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEdldFBhc3N3b3JkUG9saWN5UmVzcG9uc2UgfSBmcm9tICcuLi8uLi9hcGkvcGFzc3dvcmRfcG9saWN5L2dldF9wYXNzd29yZF9wb2xpY3knO1xuaW1wb3J0IHtcbiAgUGFzc3dvcmRQb2xpY3lDdXN0b21TdHJlbmd0aE9wdGlvbnMsXG4gIFBhc3N3b3JkUG9saWN5SW50ZXJuYWwsXG4gIFBhc3N3b3JkVmFsaWRhdGlvblN0YXR1c0ludGVybmFsXG59IGZyb20gJy4uLy4uL21vZGVsL3Bhc3N3b3JkX3BvbGljeSc7XG5pbXBvcnQgeyBQYXNzd29yZFZhbGlkYXRpb25TdGF0dXMgfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuXG4vLyBNaW5pbXVtIG1pbiBwYXNzd29yZCBsZW5ndGggZW5mb3JjZWQgYnkgdGhlIGJhY2tlbmQsIGV2ZW4gaWYgbm8gbWluaW11bSBsZW5ndGggaXMgc2V0LlxuY29uc3QgTUlOSU1VTV9NSU5fUEFTU1dPUkRfTEVOR1RIID0gNjtcblxuLyoqXG4gKiBTdG9yZXMgcGFzc3dvcmQgcG9saWN5IHJlcXVpcmVtZW50cyBhbmQgcHJvdmlkZXMgcGFzc3dvcmQgdmFsaWRhdGlvbiBhZ2FpbnN0IHRoZSBwb2xpY3kuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBQYXNzd29yZFBvbGljeUltcGwgaW1wbGVtZW50cyBQYXNzd29yZFBvbGljeUludGVybmFsIHtcbiAgcmVhZG9ubHkgY3VzdG9tU3RyZW5ndGhPcHRpb25zOiBQYXNzd29yZFBvbGljeUN1c3RvbVN0cmVuZ3RoT3B0aW9ucztcbiAgcmVhZG9ubHkgYWxsb3dlZE5vbkFscGhhbnVtZXJpY0NoYXJhY3RlcnM6IHN0cmluZztcbiAgcmVhZG9ubHkgZW5mb3JjZW1lbnRTdGF0ZTogc3RyaW5nO1xuICByZWFkb25seSBmb3JjZVVwZ3JhZGVPblNpZ25pbjogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc2NoZW1hVmVyc2lvbjogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHJlc3BvbnNlOiBHZXRQYXNzd29yZFBvbGljeVJlc3BvbnNlKSB7XG4gICAgLy8gT25seSBpbmNsdWRlIGN1c3RvbSBzdHJlbmd0aCBvcHRpb25zIGRlZmluZWQgaW4gdGhlIHJlc3BvbnNlLlxuICAgIGNvbnN0IHJlc3BvbnNlT3B0aW9ucyA9IHJlc3BvbnNlLmN1c3RvbVN0cmVuZ3RoT3B0aW9ucztcbiAgICB0aGlzLmN1c3RvbVN0cmVuZ3RoT3B0aW9ucyA9IHt9O1xuICAgIC8vIFRPRE86IFJlbW92ZSBvbmNlIHRoZSBiYWNrZW5kIGlzIHVwZGF0ZWQgdG8gaW5jbHVkZSB0aGUgbWluaW11bSBtaW4gcGFzc3dvcmQgbGVuZ3RoIGluc3RlYWQgb2YgdW5kZWZpbmVkIHdoZW4gdGhlcmUgaXMgbm8gbWluaW11bSBsZW5ndGggc2V0LlxuICAgIHRoaXMuY3VzdG9tU3RyZW5ndGhPcHRpb25zLm1pblBhc3N3b3JkTGVuZ3RoID1cbiAgICAgIHJlc3BvbnNlT3B0aW9ucy5taW5QYXNzd29yZExlbmd0aCA/PyBNSU5JTVVNX01JTl9QQVNTV09SRF9MRU5HVEg7XG4gICAgaWYgKHJlc3BvbnNlT3B0aW9ucy5tYXhQYXNzd29yZExlbmd0aCkge1xuICAgICAgdGhpcy5jdXN0b21TdHJlbmd0aE9wdGlvbnMubWF4UGFzc3dvcmRMZW5ndGggPVxuICAgICAgICByZXNwb25zZU9wdGlvbnMubWF4UGFzc3dvcmRMZW5ndGg7XG4gICAgfVxuICAgIGlmIChyZXNwb25zZU9wdGlvbnMuY29udGFpbnNMb3dlcmNhc2VDaGFyYWN0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jdXN0b21TdHJlbmd0aE9wdGlvbnMuY29udGFpbnNMb3dlcmNhc2VMZXR0ZXIgPVxuICAgICAgICByZXNwb25zZU9wdGlvbnMuY29udGFpbnNMb3dlcmNhc2VDaGFyYWN0ZXI7XG4gICAgfVxuICAgIGlmIChyZXNwb25zZU9wdGlvbnMuY29udGFpbnNVcHBlcmNhc2VDaGFyYWN0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jdXN0b21TdHJlbmd0aE9wdGlvbnMuY29udGFpbnNVcHBlcmNhc2VMZXR0ZXIgPVxuICAgICAgICByZXNwb25zZU9wdGlvbnMuY29udGFpbnNVcHBlcmNhc2VDaGFyYWN0ZXI7XG4gICAgfVxuICAgIGlmIChyZXNwb25zZU9wdGlvbnMuY29udGFpbnNOdW1lcmljQ2hhcmFjdGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY3VzdG9tU3RyZW5ndGhPcHRpb25zLmNvbnRhaW5zTnVtZXJpY0NoYXJhY3RlciA9XG4gICAgICAgIHJlc3BvbnNlT3B0aW9ucy5jb250YWluc051bWVyaWNDaGFyYWN0ZXI7XG4gICAgfVxuICAgIGlmIChyZXNwb25zZU9wdGlvbnMuY29udGFpbnNOb25BbHBoYW51bWVyaWNDaGFyYWN0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jdXN0b21TdHJlbmd0aE9wdGlvbnMuY29udGFpbnNOb25BbHBoYW51bWVyaWNDaGFyYWN0ZXIgPVxuICAgICAgICByZXNwb25zZU9wdGlvbnMuY29udGFpbnNOb25BbHBoYW51bWVyaWNDaGFyYWN0ZXI7XG4gICAgfVxuXG4gICAgdGhpcy5lbmZvcmNlbWVudFN0YXRlID0gcmVzcG9uc2UuZW5mb3JjZW1lbnRTdGF0ZTtcbiAgICBpZiAodGhpcy5lbmZvcmNlbWVudFN0YXRlID09PSAnRU5GT1JDRU1FTlRfU1RBVEVfVU5TUEVDSUZJRUQnKSB7XG4gICAgICB0aGlzLmVuZm9yY2VtZW50U3RhdGUgPSAnT0ZGJztcbiAgICB9XG5cbiAgICAvLyBVc2UgYW4gZW1wdHkgc3RyaW5nIGlmIG5vIG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhcmUgc3BlY2lmaWVkIGluIHRoZSByZXNwb25zZS5cbiAgICB0aGlzLmFsbG93ZWROb25BbHBoYW51bWVyaWNDaGFyYWN0ZXJzID1cbiAgICAgIHJlc3BvbnNlLmFsbG93ZWROb25BbHBoYW51bWVyaWNDaGFyYWN0ZXJzPy5qb2luKCcnKSA/PyAnJztcblxuICAgIHRoaXMuZm9yY2VVcGdyYWRlT25TaWduaW4gPSByZXNwb25zZS5mb3JjZVVwZ3JhZGVPblNpZ25pbiA/PyBmYWxzZTtcbiAgICB0aGlzLnNjaGVtYVZlcnNpb24gPSByZXNwb25zZS5zY2hlbWFWZXJzaW9uO1xuICB9XG5cbiAgdmFsaWRhdGVQYXNzd29yZChwYXNzd29yZDogc3RyaW5nKTogUGFzc3dvcmRWYWxpZGF0aW9uU3RhdHVzIHtcbiAgICBjb25zdCBzdGF0dXM6IFBhc3N3b3JkVmFsaWRhdGlvblN0YXR1c0ludGVybmFsID0ge1xuICAgICAgaXNWYWxpZDogdHJ1ZSxcbiAgICAgIHBhc3N3b3JkUG9saWN5OiB0aGlzXG4gICAgfTtcblxuICAgIC8vIENoZWNrIHRoZSBwYXNzd29yZCBsZW5ndGggYW5kIGNoYXJhY3RlciBvcHRpb25zLlxuICAgIHRoaXMudmFsaWRhdGVQYXNzd29yZExlbmd0aE9wdGlvbnMocGFzc3dvcmQsIHN0YXR1cyk7XG4gICAgdGhpcy52YWxpZGF0ZVBhc3N3b3JkQ2hhcmFjdGVyT3B0aW9ucyhwYXNzd29yZCwgc3RhdHVzKTtcblxuICAgIC8vIENvbWJpbmUgdGhlIHN0YXR1cyBpbnRvIHNpbmdsZSBpc1ZhbGlkIHByb3BlcnR5LlxuICAgIHN0YXR1cy5pc1ZhbGlkICYmPSBzdGF0dXMubWVldHNNaW5QYXNzd29yZExlbmd0aCA/PyB0cnVlO1xuICAgIHN0YXR1cy5pc1ZhbGlkICYmPSBzdGF0dXMubWVldHNNYXhQYXNzd29yZExlbmd0aCA/PyB0cnVlO1xuICAgIHN0YXR1cy5pc1ZhbGlkICYmPSBzdGF0dXMuY29udGFpbnNMb3dlcmNhc2VMZXR0ZXIgPz8gdHJ1ZTtcbiAgICBzdGF0dXMuaXNWYWxpZCAmJj0gc3RhdHVzLmNvbnRhaW5zVXBwZXJjYXNlTGV0dGVyID8/IHRydWU7XG4gICAgc3RhdHVzLmlzVmFsaWQgJiY9IHN0YXR1cy5jb250YWluc051bWVyaWNDaGFyYWN0ZXIgPz8gdHJ1ZTtcbiAgICBzdGF0dXMuaXNWYWxpZCAmJj0gc3RhdHVzLmNvbnRhaW5zTm9uQWxwaGFudW1lcmljQ2hhcmFjdGVyID8/IHRydWU7XG5cbiAgICByZXR1cm4gc3RhdHVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGF0IHRoZSBwYXNzd29yZCBtZWV0cyB0aGUgbGVuZ3RoIG9wdGlvbnMgZm9yIHRoZSBwb2xpY3kuXG4gICAqXG4gICAqIEBwYXJhbSBwYXNzd29yZCBQYXNzd29yZCB0byB2YWxpZGF0ZS5cbiAgICogQHBhcmFtIHN0YXR1cyBWYWxpZGF0aW9uIHN0YXR1cy5cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVQYXNzd29yZExlbmd0aE9wdGlvbnMoXG4gICAgcGFzc3dvcmQ6IHN0cmluZyxcbiAgICBzdGF0dXM6IFBhc3N3b3JkVmFsaWRhdGlvblN0YXR1c0ludGVybmFsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IG1pblBhc3N3b3JkTGVuZ3RoID0gdGhpcy5jdXN0b21TdHJlbmd0aE9wdGlvbnMubWluUGFzc3dvcmRMZW5ndGg7XG4gICAgY29uc3QgbWF4UGFzc3dvcmRMZW5ndGggPSB0aGlzLmN1c3RvbVN0cmVuZ3RoT3B0aW9ucy5tYXhQYXNzd29yZExlbmd0aDtcbiAgICBpZiAobWluUGFzc3dvcmRMZW5ndGgpIHtcbiAgICAgIHN0YXR1cy5tZWV0c01pblBhc3N3b3JkTGVuZ3RoID0gcGFzc3dvcmQubGVuZ3RoID49IG1pblBhc3N3b3JkTGVuZ3RoO1xuICAgIH1cbiAgICBpZiAobWF4UGFzc3dvcmRMZW5ndGgpIHtcbiAgICAgIHN0YXR1cy5tZWV0c01heFBhc3N3b3JkTGVuZ3RoID0gcGFzc3dvcmQubGVuZ3RoIDw9IG1heFBhc3N3b3JkTGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhhdCB0aGUgcGFzc3dvcmQgbWVldHMgdGhlIGNoYXJhY3RlciBvcHRpb25zIGZvciB0aGUgcG9saWN5LlxuICAgKlxuICAgKiBAcGFyYW0gcGFzc3dvcmQgUGFzc3dvcmQgdG8gdmFsaWRhdGUuXG4gICAqIEBwYXJhbSBzdGF0dXMgVmFsaWRhdGlvbiBzdGF0dXMuXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlUGFzc3dvcmRDaGFyYWN0ZXJPcHRpb25zKFxuICAgIHBhc3N3b3JkOiBzdHJpbmcsXG4gICAgc3RhdHVzOiBQYXNzd29yZFZhbGlkYXRpb25TdGF0dXNJbnRlcm5hbFxuICApOiB2b2lkIHtcbiAgICAvLyBBc3NpZ24gc3RhdHVzZXMgZm9yIHJlcXVpcmVtZW50cyBldmVuIGlmIHRoZSBwYXNzd29yZCBpcyBhbiBlbXB0eSBzdHJpbmcuXG4gICAgdGhpcy51cGRhdGVQYXNzd29yZENoYXJhY3Rlck9wdGlvbnNTdGF0dXNlcyhcbiAgICAgIHN0YXR1cyxcbiAgICAgIC8qIGNvbnRhaW5zTG93ZXJjYXNlQ2hhcmFjdGVyPSAqLyBmYWxzZSxcbiAgICAgIC8qIGNvbnRhaW5zVXBwZXJjYXNlQ2hhcmFjdGVyPSAqLyBmYWxzZSxcbiAgICAgIC8qIGNvbnRhaW5zTnVtZXJpY0NoYXJhY3Rlcj0gKi8gZmFsc2UsXG4gICAgICAvKiBjb250YWluc05vbkFscGhhbnVtZXJpY0NoYXJhY3Rlcj0gKi8gZmFsc2VcbiAgICApO1xuXG4gICAgbGV0IHBhc3N3b3JkQ2hhcjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhc3N3b3JkLmxlbmd0aDsgaSsrKSB7XG4gICAgICBwYXNzd29yZENoYXIgPSBwYXNzd29yZC5jaGFyQXQoaSk7XG4gICAgICB0aGlzLnVwZGF0ZVBhc3N3b3JkQ2hhcmFjdGVyT3B0aW9uc1N0YXR1c2VzKFxuICAgICAgICBzdGF0dXMsXG4gICAgICAgIC8qIGNvbnRhaW5zTG93ZXJjYXNlQ2hhcmFjdGVyPSAqLyBwYXNzd29yZENoYXIgPj0gJ2EnICYmXG4gICAgICAgICAgcGFzc3dvcmRDaGFyIDw9ICd6JyxcbiAgICAgICAgLyogY29udGFpbnNVcHBlcmNhc2VDaGFyYWN0ZXI9ICovIHBhc3N3b3JkQ2hhciA+PSAnQScgJiZcbiAgICAgICAgICBwYXNzd29yZENoYXIgPD0gJ1onLFxuICAgICAgICAvKiBjb250YWluc051bWVyaWNDaGFyYWN0ZXI9ICovIHBhc3N3b3JkQ2hhciA+PSAnMCcgJiZcbiAgICAgICAgICBwYXNzd29yZENoYXIgPD0gJzknLFxuICAgICAgICAvKiBjb250YWluc05vbkFscGhhbnVtZXJpY0NoYXJhY3Rlcj0gKi8gdGhpcy5hbGxvd2VkTm9uQWxwaGFudW1lcmljQ2hhcmFjdGVycy5pbmNsdWRlcyhcbiAgICAgICAgICBwYXNzd29yZENoYXJcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgcnVubmluZyB2YWxpZGF0aW9uIHN0YXR1cyB3aXRoIHRoZSBzdGF0dXNlcyBmb3IgdGhlIGNoYXJhY3RlciBvcHRpb25zLlxuICAgKiBFeHBlY3RlZCB0byBiZSBjYWxsZWQgZWFjaCB0aW1lIGEgY2hhcmFjdGVyIGlzIHByb2Nlc3NlZCB0byB1cGRhdGUgZWFjaCBvcHRpb24gc3RhdHVzXG4gICAqIGJhc2VkIG9uIHRoZSBjdXJyZW50IGNoYXJhY3Rlci5cbiAgICpcbiAgICogQHBhcmFtIHN0YXR1cyBWYWxpZGF0aW9uIHN0YXR1cy5cbiAgICogQHBhcmFtIGNvbnRhaW5zTG93ZXJjYXNlQ2hhcmFjdGVyIFdoZXRoZXIgdGhlIGNoYXJhY3RlciBpcyBhIGxvd2VyY2FzZSBsZXR0ZXIuXG4gICAqIEBwYXJhbSBjb250YWluc1VwcGVyY2FzZUNoYXJhY3RlciBXaGV0aGVyIHRoZSBjaGFyYWN0ZXIgaXMgYW4gdXBwZXJjYXNlIGxldHRlci5cbiAgICogQHBhcmFtIGNvbnRhaW5zTnVtZXJpY0NoYXJhY3RlciBXaGV0aGVyIHRoZSBjaGFyYWN0ZXIgaXMgYSBudW1lcmljIGNoYXJhY3Rlci5cbiAgICogQHBhcmFtIGNvbnRhaW5zTm9uQWxwaGFudW1lcmljQ2hhcmFjdGVyIFdoZXRoZXIgdGhlIGNoYXJhY3RlciBpcyBhIG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVyLlxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVQYXNzd29yZENoYXJhY3Rlck9wdGlvbnNTdGF0dXNlcyhcbiAgICBzdGF0dXM6IFBhc3N3b3JkVmFsaWRhdGlvblN0YXR1c0ludGVybmFsLFxuICAgIGNvbnRhaW5zTG93ZXJjYXNlQ2hhcmFjdGVyOiBib29sZWFuLFxuICAgIGNvbnRhaW5zVXBwZXJjYXNlQ2hhcmFjdGVyOiBib29sZWFuLFxuICAgIGNvbnRhaW5zTnVtZXJpY0NoYXJhY3RlcjogYm9vbGVhbixcbiAgICBjb250YWluc05vbkFscGhhbnVtZXJpY0NoYXJhY3RlcjogYm9vbGVhblxuICApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jdXN0b21TdHJlbmd0aE9wdGlvbnMuY29udGFpbnNMb3dlcmNhc2VMZXR0ZXIpIHtcbiAgICAgIHN0YXR1cy5jb250YWluc0xvd2VyY2FzZUxldHRlciB8fD0gY29udGFpbnNMb3dlcmNhc2VDaGFyYWN0ZXI7XG4gICAgfVxuICAgIGlmICh0aGlzLmN1c3RvbVN0cmVuZ3RoT3B0aW9ucy5jb250YWluc1VwcGVyY2FzZUxldHRlcikge1xuICAgICAgc3RhdHVzLmNvbnRhaW5zVXBwZXJjYXNlTGV0dGVyIHx8PSBjb250YWluc1VwcGVyY2FzZUNoYXJhY3RlcjtcbiAgICB9XG4gICAgaWYgKHRoaXMuY3VzdG9tU3RyZW5ndGhPcHRpb25zLmNvbnRhaW5zTnVtZXJpY0NoYXJhY3Rlcikge1xuICAgICAgc3RhdHVzLmNvbnRhaW5zTnVtZXJpY0NoYXJhY3RlciB8fD0gY29udGFpbnNOdW1lcmljQ2hhcmFjdGVyO1xuICAgIH1cbiAgICBpZiAodGhpcy5jdXN0b21TdHJlbmd0aE9wdGlvbnMuY29udGFpbnNOb25BbHBoYW51bWVyaWNDaGFyYWN0ZXIpIHtcbiAgICAgIHN0YXR1cy5jb250YWluc05vbkFscGhhbnVtZXJpY0NoYXJhY3RlciB8fD1cbiAgICAgICAgY29udGFpbnNOb25BbHBoYW51bWVyaWNDaGFyYWN0ZXI7XG4gICAgfVxuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgX0ZpcmViYXNlU2VydmljZSwgRmlyZWJhc2VBcHAgfSBmcm9tICdAZmlyZWJhc2UvYXBwJztcbmltcG9ydCB7IFByb3ZpZGVyIH0gZnJvbSAnQGZpcmViYXNlL2NvbXBvbmVudCc7XG5pbXBvcnQgeyBBcHBDaGVja0ludGVybmFsQ29tcG9uZW50TmFtZSB9IGZyb20gJ0BmaXJlYmFzZS9hcHAtY2hlY2staW50ZXJvcC10eXBlcyc7XG5pbXBvcnQge1xuICBBdXRoLFxuICBBdXRoRXJyb3JNYXAsXG4gIEF1dGhTZXR0aW5ncyxcbiAgRW11bGF0b3JDb25maWcsXG4gIE5leHRPck9ic2VydmVyLFxuICBQZXJzaXN0ZW5jZSxcbiAgUG9wdXBSZWRpcmVjdFJlc29sdmVyLFxuICBVc2VyLFxuICBVc2VyQ3JlZGVudGlhbCxcbiAgQ29tcGxldGVGbixcbiAgRXJyb3JGbixcbiAgTmV4dEZuLFxuICBVbnN1YnNjcmliZSxcbiAgUGFzc3dvcmRWYWxpZGF0aW9uU3RhdHVzXG59IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5pbXBvcnQge1xuICBjcmVhdGVTdWJzY3JpYmUsXG4gIEVycm9yRmFjdG9yeSxcbiAgRmlyZWJhc2VFcnJvcixcbiAgZ2V0TW9kdWxhckluc3RhbmNlLFxuICBPYnNlcnZlcixcbiAgU3Vic2NyaWJlXG59IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcblxuaW1wb3J0IHsgQXV0aEludGVybmFsLCBDb25maWdJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL2F1dGgnO1xuaW1wb3J0IHsgUG9wdXBSZWRpcmVjdFJlc29sdmVySW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9wb3B1cF9yZWRpcmVjdCc7XG5pbXBvcnQgeyBVc2VySW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC91c2VyJztcbmltcG9ydCB7XG4gIEF1dGhFcnJvckNvZGUsXG4gIEF1dGhFcnJvclBhcmFtcyxcbiAgRXJyb3JNYXBSZXRyaWV2ZXIsXG4gIF9ERUZBVUxUX0FVVEhfRVJST1JfRkFDVE9SWVxufSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgUGVyc2lzdGVuY2VJbnRlcm5hbCB9IGZyb20gJy4uL3BlcnNpc3RlbmNlJztcbmltcG9ydCB7XG4gIEtleU5hbWUsXG4gIFBlcnNpc3RlbmNlVXNlck1hbmFnZXJcbn0gZnJvbSAnLi4vcGVyc2lzdGVuY2UvcGVyc2lzdGVuY2VfdXNlcl9tYW5hZ2VyJztcbmltcG9ydCB7IF9yZWxvYWRXaXRob3V0U2F2aW5nIH0gZnJvbSAnLi4vdXNlci9yZWxvYWQnO1xuaW1wb3J0IHsgX2Fzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0JztcbmltcG9ydCB7IF9nZXRJbnN0YW5jZSB9IGZyb20gJy4uL3V0aWwvaW5zdGFudGlhdG9yJztcbmltcG9ydCB7IF9nZXRVc2VyTGFuZ3VhZ2UgfSBmcm9tICcuLi91dGlsL25hdmlnYXRvcic7XG5pbXBvcnQgeyBfZ2V0Q2xpZW50VmVyc2lvbiB9IGZyb20gJy4uL3V0aWwvdmVyc2lvbic7XG5pbXBvcnQgeyBIdHRwSGVhZGVyIH0gZnJvbSAnLi4vLi4vYXBpJztcbmltcG9ydCB7IEF1dGhNaWRkbGV3YXJlUXVldWUgfSBmcm9tICcuL21pZGRsZXdhcmUnO1xuaW1wb3J0IHsgUmVjYXB0Y2hhQ29uZmlnIH0gZnJvbSAnLi4vLi4vcGxhdGZvcm1fYnJvd3Nlci9yZWNhcHRjaGEvcmVjYXB0Y2hhJztcbmltcG9ydCB7IF9sb2dXYXJuIH0gZnJvbSAnLi4vdXRpbC9sb2cnO1xuaW1wb3J0IHsgX2dldFBhc3N3b3JkUG9saWN5IH0gZnJvbSAnLi4vLi4vYXBpL3Bhc3N3b3JkX3BvbGljeS9nZXRfcGFzc3dvcmRfcG9saWN5JztcbmltcG9ydCB7IFBhc3N3b3JkUG9saWN5SW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9wYXNzd29yZF9wb2xpY3knO1xuaW1wb3J0IHsgUGFzc3dvcmRQb2xpY3lJbXBsIH0gZnJvbSAnLi9wYXNzd29yZF9wb2xpY3lfaW1wbCc7XG5cbmludGVyZmFjZSBBc3luY0FjdGlvbiB7XG4gICgpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG5leHBvcnQgY29uc3QgZW51bSBEZWZhdWx0Q29uZmlnIHtcbiAgVE9LRU5fQVBJX0hPU1QgPSAnc2VjdXJldG9rZW4uZ29vZ2xlYXBpcy5jb20nLFxuICBBUElfSE9TVCA9ICdpZGVudGl0eXRvb2xraXQuZ29vZ2xlYXBpcy5jb20nLFxuICBBUElfU0NIRU1FID0gJ2h0dHBzJ1xufVxuXG5leHBvcnQgY2xhc3MgQXV0aEltcGwgaW1wbGVtZW50cyBBdXRoSW50ZXJuYWwsIF9GaXJlYmFzZVNlcnZpY2Uge1xuICBjdXJyZW50VXNlcjogVXNlciB8IG51bGwgPSBudWxsO1xuICBlbXVsYXRvckNvbmZpZzogRW11bGF0b3JDb25maWcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBvcGVyYXRpb25zID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIHByaXZhdGUgcGVyc2lzdGVuY2VNYW5hZ2VyPzogUGVyc2lzdGVuY2VVc2VyTWFuYWdlcjtcbiAgcHJpdmF0ZSByZWRpcmVjdFBlcnNpc3RlbmNlTWFuYWdlcj86IFBlcnNpc3RlbmNlVXNlck1hbmFnZXI7XG4gIHByaXZhdGUgYXV0aFN0YXRlU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbjxVc2VyPih0aGlzKTtcbiAgcHJpdmF0ZSBpZFRva2VuU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbjxVc2VyPih0aGlzKTtcbiAgcHJpdmF0ZSByZWFkb25seSBiZWZvcmVTdGF0ZVF1ZXVlID0gbmV3IEF1dGhNaWRkbGV3YXJlUXVldWUodGhpcyk7XG4gIHByaXZhdGUgcmVkaXJlY3RVc2VyOiBVc2VySW50ZXJuYWwgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBpc1Byb2FjdGl2ZVJlZnJlc2hFbmFibGVkID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgRVhQRUNURURfUEFTU1dPUkRfUE9MSUNZX1NDSEVNQV9WRVJTSU9OOiBudW1iZXIgPSAxO1xuXG4gIC8vIEFueSBuZXR3b3JrIGNhbGxzIHdpbGwgc2V0IHRoaXMgdG8gdHJ1ZSBhbmQgcHJldmVudCBzdWJzZXF1ZW50IGVtdWxhdG9yXG4gIC8vIGluaXRpYWxpemF0aW9uXG4gIF9jYW5Jbml0RW11bGF0b3IgPSB0cnVlO1xuICBfaXNJbml0aWFsaXplZCA9IGZhbHNlO1xuICBfZGVsZXRlZCA9IGZhbHNlO1xuICBfaW5pdGlhbGl6YXRpb25Qcm9taXNlOiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7XG4gIF9wb3B1cFJlZGlyZWN0UmVzb2x2ZXI6IFBvcHVwUmVkaXJlY3RSZXNvbHZlckludGVybmFsIHwgbnVsbCA9IG51bGw7XG4gIF9lcnJvckZhY3Rvcnk6IEVycm9yRmFjdG9yeTxBdXRoRXJyb3JDb2RlLCBBdXRoRXJyb3JQYXJhbXM+ID1cbiAgICBfREVGQVVMVF9BVVRIX0VSUk9SX0ZBQ1RPUlk7XG4gIF9hZ2VudFJlY2FwdGNoYUNvbmZpZzogUmVjYXB0Y2hhQ29uZmlnIHwgbnVsbCA9IG51bGw7XG4gIF90ZW5hbnRSZWNhcHRjaGFDb25maWdzOiBSZWNvcmQ8c3RyaW5nLCBSZWNhcHRjaGFDb25maWc+ID0ge307XG4gIF9wcm9qZWN0UGFzc3dvcmRQb2xpY3k6IFBhc3N3b3JkUG9saWN5SW50ZXJuYWwgfCBudWxsID0gbnVsbDtcbiAgX3RlbmFudFBhc3N3b3JkUG9saWNpZXM6IFJlY29yZDxzdHJpbmcsIFBhc3N3b3JkUG9saWN5SW50ZXJuYWw+ID0ge307XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvLyBUcmFja3MgdGhlIGxhc3Qgbm90aWZpZWQgVUlEIGZvciBzdGF0ZSBjaGFuZ2UgbGlzdGVuZXJzIHRvIHByZXZlbnRcbiAgLy8gcmVwZWF0ZWQgY2FsbHMgdG8gdGhlIGNhbGxiYWNrcy4gVW5kZWZpbmVkIG1lYW5zIGl0J3MgbmV2ZXIgYmVlblxuICAvLyBjYWxsZWQsIHdoZXJlYXMgbnVsbCBtZWFucyBpdCdzIGJlZW4gY2FsbGVkIHdpdGggYSBzaWduZWQgb3V0IHVzZXJcbiAgcHJpdmF0ZSBsYXN0Tm90aWZpZWRVaWQ6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgbGFuZ3VhZ2VDb2RlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgdGVuYW50SWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBzZXR0aW5nczogQXV0aFNldHRpbmdzID0geyBhcHBWZXJpZmljYXRpb25EaXNhYmxlZEZvclRlc3Rpbmc6IGZhbHNlIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IGFwcDogRmlyZWJhc2VBcHAsXG4gICAgcHJpdmF0ZSByZWFkb25seSBoZWFydGJlYXRTZXJ2aWNlUHJvdmlkZXI6IFByb3ZpZGVyPCdoZWFydGJlYXQnPixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFwcENoZWNrU2VydmljZVByb3ZpZGVyOiBQcm92aWRlcjxBcHBDaGVja0ludGVybmFsQ29tcG9uZW50TmFtZT4sXG4gICAgcHVibGljIHJlYWRvbmx5IGNvbmZpZzogQ29uZmlnSW50ZXJuYWxcbiAgKSB7XG4gICAgdGhpcy5uYW1lID0gYXBwLm5hbWU7XG4gICAgdGhpcy5jbGllbnRWZXJzaW9uID0gY29uZmlnLnNka0NsaWVudFZlcnNpb247XG4gIH1cblxuICBfaW5pdGlhbGl6ZVdpdGhQZXJzaXN0ZW5jZShcbiAgICBwZXJzaXN0ZW5jZUhpZXJhcmNoeTogUGVyc2lzdGVuY2VJbnRlcm5hbFtdLFxuICAgIHBvcHVwUmVkaXJlY3RSZXNvbHZlcj86IFBvcHVwUmVkaXJlY3RSZXNvbHZlclxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAocG9wdXBSZWRpcmVjdFJlc29sdmVyKSB7XG4gICAgICB0aGlzLl9wb3B1cFJlZGlyZWN0UmVzb2x2ZXIgPSBfZ2V0SW5zdGFuY2UocG9wdXBSZWRpcmVjdFJlc29sdmVyKTtcbiAgICB9XG5cbiAgICAvLyBIYXZlIHRvIGNoZWNrIGZvciBhcHAgZGVsZXRpb24gdGhyb3VnaG91dCBpbml0aWFsaXphdGlvbiAoYWZ0ZXIgZWFjaFxuICAgIC8vIHByb21pc2UgcmVzb2x1dGlvbilcbiAgICB0aGlzLl9pbml0aWFsaXphdGlvblByb21pc2UgPSB0aGlzLnF1ZXVlKGFzeW5jICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9kZWxldGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wZXJzaXN0ZW5jZU1hbmFnZXIgPSBhd2FpdCBQZXJzaXN0ZW5jZVVzZXJNYW5hZ2VyLmNyZWF0ZShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgcGVyc2lzdGVuY2VIaWVyYXJjaHlcbiAgICAgICk7XG5cbiAgICAgIGlmICh0aGlzLl9kZWxldGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcmVzb2x2ZXIgZWFybHkgaWYgbmVjZXNzYXJ5IChvbmx5IGFwcGxpY2FibGUgdG8gd2ViOlxuICAgICAgLy8gdGhpcyB3aWxsIGNhdXNlIHRoZSBpZnJhbWUgdG8gbG9hZCBpbW1lZGlhdGVseSBpbiBjZXJ0YWluIGNhc2VzKVxuICAgICAgaWYgKHRoaXMuX3BvcHVwUmVkaXJlY3RSZXNvbHZlcj8uX3Nob3VsZEluaXRQcm9hY3RpdmVseSkge1xuICAgICAgICAvLyBJZiB0aGlzIGZhaWxzLCBkb24ndCBoYWx0IGF1dGggbG9hZGluZ1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuX3BvcHVwUmVkaXJlY3RSZXNvbHZlci5faW5pdGlhbGl6ZSh0aGlzKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8qIElnbm9yZSB0aGUgZXJyb3IgKi9cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVDdXJyZW50VXNlcihwb3B1cFJlZGlyZWN0UmVzb2x2ZXIpO1xuICAgICAgdGhpcy5sYXN0Tm90aWZpZWRVaWQgPSB0aGlzLmN1cnJlbnRVc2VyPy51aWQgfHwgbnVsbDtcblxuICAgICAgaWYgKHRoaXMuX2RlbGV0ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLl9pbml0aWFsaXphdGlvblByb21pc2U7XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlIHBlcnNpc3RlbmNlIGlzIGNoYW5nZWQgaW4gYW5vdGhlciB3aW5kb3csIHRoZSB1c2VyIG1hbmFnZXIgd2lsbCBsZXQgdXMga25vd1xuICAgKi9cbiAgYXN5bmMgX29uU3RvcmFnZUV2ZW50KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLl9kZWxldGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuYXNzZXJ0ZWRQZXJzaXN0ZW5jZS5nZXRDdXJyZW50VXNlcigpO1xuXG4gICAgaWYgKCF0aGlzLmN1cnJlbnRVc2VyICYmICF1c2VyKSB7XG4gICAgICAvLyBObyBjaGFuZ2UsIGRvIG5vdGhpbmcgKHdhcyBzaWduZWQgb3V0IGFuZCByZW1haW5lZCBzaWduZWQgb3V0KS5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgc2FtZSB1c2VyIGlzIHRvIGJlIHN5bmNocm9uaXplZC5cbiAgICBpZiAodGhpcy5jdXJyZW50VXNlciAmJiB1c2VyICYmIHRoaXMuY3VycmVudFVzZXIudWlkID09PSB1c2VyLnVpZCkge1xuICAgICAgLy8gRGF0YSB1cGRhdGUsIHNpbXBseSBjb3B5IGRhdGEgY2hhbmdlcy5cbiAgICAgIHRoaXMuX2N1cnJlbnRVc2VyLl9hc3NpZ24odXNlcik7XG4gICAgICAvLyBJZiB0b2tlbnMgY2hhbmdlZCBmcm9tIHByZXZpb3VzIHVzZXIgdG9rZW5zLCB0aGlzIHdpbGwgdHJpZ2dlclxuICAgICAgLy8gbm90aWZ5QXV0aExpc3RlbmVyc18uXG4gICAgICBhd2FpdCB0aGlzLmN1cnJlbnRVc2VyLmdldElkVG9rZW4oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgY3VycmVudCBBdXRoIHN0YXRlLiBFaXRoZXIgYSBuZXcgbG9naW4gb3IgbG9nb3V0LlxuICAgIC8vIFNraXAgYmxvY2tpbmcgY2FsbGJhY2tzLCB0aGV5IHNob3VsZCBub3QgYXBwbHkgdG8gYSBjaGFuZ2UgaW4gYW5vdGhlciB0YWIuXG4gICAgYXdhaXQgdGhpcy5fdXBkYXRlQ3VycmVudFVzZXIodXNlciwgLyogc2tpcEJlZm9yZVN0YXRlQ2FsbGJhY2tzICovIHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplQ3VycmVudFVzZXIoXG4gICAgcG9wdXBSZWRpcmVjdFJlc29sdmVyPzogUG9wdXBSZWRpcmVjdFJlc29sdmVyXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEZpcnN0IGNoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgcGVuZGluZyByZWRpcmVjdCBldmVudC5cbiAgICBjb25zdCBwcmV2aW91c2x5U3RvcmVkVXNlciA9XG4gICAgICAoYXdhaXQgdGhpcy5hc3NlcnRlZFBlcnNpc3RlbmNlLmdldEN1cnJlbnRVc2VyKCkpIGFzIFVzZXJJbnRlcm5hbCB8IG51bGw7XG4gICAgbGV0IGZ1dHVyZUN1cnJlbnRVc2VyID0gcHJldmlvdXNseVN0b3JlZFVzZXI7XG4gICAgbGV0IG5lZWRzVG9jaGVja01pZGRsZXdhcmUgPSBmYWxzZTtcbiAgICBpZiAocG9wdXBSZWRpcmVjdFJlc29sdmVyICYmIHRoaXMuY29uZmlnLmF1dGhEb21haW4pIHtcbiAgICAgIGF3YWl0IHRoaXMuZ2V0T3JJbml0UmVkaXJlY3RQZXJzaXN0ZW5jZU1hbmFnZXIoKTtcbiAgICAgIGNvbnN0IHJlZGlyZWN0VXNlckV2ZW50SWQgPSB0aGlzLnJlZGlyZWN0VXNlcj8uX3JlZGlyZWN0RXZlbnRJZDtcbiAgICAgIGNvbnN0IHN0b3JlZFVzZXJFdmVudElkID0gZnV0dXJlQ3VycmVudFVzZXI/Ll9yZWRpcmVjdEV2ZW50SWQ7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnRyeVJlZGlyZWN0U2lnbkluKHBvcHVwUmVkaXJlY3RSZXNvbHZlcik7XG5cbiAgICAgIC8vIElmIHRoZSBzdG9yZWQgdXNlciAoaS5lLiB0aGUgb2xkIFwiY3VycmVudFVzZXJcIikgaGFzIGEgcmVkaXJlY3RJZCB0aGF0XG4gICAgICAvLyBtYXRjaGVzIHRoZSByZWRpcmVjdCB1c2VyLCB0aGVuIHdlIHdhbnQgdG8gaW5pdGlhbGx5IHNpZ24gaW4gd2l0aCB0aGVcbiAgICAgIC8vIG5ldyB1c2VyIG9iamVjdCBmcm9tIHJlc3VsdC5cbiAgICAgIC8vIFRPRE8oc2FtZ2hvKTogTW9yZSB0aG9yb3VnaGx5IHRlc3QgYWxsIG9mIHRoaXNcbiAgICAgIGlmIChcbiAgICAgICAgKCFyZWRpcmVjdFVzZXJFdmVudElkIHx8IHJlZGlyZWN0VXNlckV2ZW50SWQgPT09IHN0b3JlZFVzZXJFdmVudElkKSAmJlxuICAgICAgICByZXN1bHQ/LnVzZXJcbiAgICAgICkge1xuICAgICAgICBmdXR1cmVDdXJyZW50VXNlciA9IHJlc3VsdC51c2VyIGFzIFVzZXJJbnRlcm5hbDtcbiAgICAgICAgbmVlZHNUb2NoZWNrTWlkZGxld2FyZSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgbm8gdXNlciBpbiBwZXJzaXN0ZW5jZSwgdGhlcmUgaXMgbm8gY3VycmVudCB1c2VyLiBTZXQgdG8gbnVsbC5cbiAgICBpZiAoIWZ1dHVyZUN1cnJlbnRVc2VyKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXJlY3RseVNldEN1cnJlbnRVc2VyKG51bGwpO1xuICAgIH1cblxuICAgIGlmICghZnV0dXJlQ3VycmVudFVzZXIuX3JlZGlyZWN0RXZlbnRJZCkge1xuICAgICAgLy8gVGhpcyBpc24ndCBhIHJlZGlyZWN0IGxpbmsgb3BlcmF0aW9uLCB3ZSBjYW4gcmVsb2FkIGFuZCBiYWlsLlxuICAgICAgLy8gRmlyc3QgdGhvdWdoLCBlbnN1cmUgdGhhdCB3ZSBjaGVjayB0aGUgbWlkZGxld2FyZSBpcyBoYXBweS5cbiAgICAgIGlmIChuZWVkc1RvY2hlY2tNaWRkbGV3YXJlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5iZWZvcmVTdGF0ZVF1ZXVlLnJ1bk1pZGRsZXdhcmUoZnV0dXJlQ3VycmVudFVzZXIpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgZnV0dXJlQ3VycmVudFVzZXIgPSBwcmV2aW91c2x5U3RvcmVkVXNlcjtcbiAgICAgICAgICAvLyBXZSBrbm93IHRoaXMgaXMgYXZhaWxhYmxlIHNpbmNlIHRoZSBiaXQgaXMgb25seSBzZXQgd2hlbiB0aGVcbiAgICAgICAgICAvLyByZXNvbHZlciBpcyBhdmFpbGFibGVcbiAgICAgICAgICB0aGlzLl9wb3B1cFJlZGlyZWN0UmVzb2x2ZXIhLl9vdmVycmlkZVJlZGlyZWN0UmVzdWx0KHRoaXMsICgpID0+XG4gICAgICAgICAgICBQcm9taXNlLnJlamVjdChlKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGZ1dHVyZUN1cnJlbnRVc2VyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbG9hZEFuZFNldEN1cnJlbnRVc2VyT3JDbGVhcihmdXR1cmVDdXJyZW50VXNlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXJlY3RseVNldEN1cnJlbnRVc2VyKG51bGwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIF9hc3NlcnQodGhpcy5fcG9wdXBSZWRpcmVjdFJlc29sdmVyLCB0aGlzLCBBdXRoRXJyb3JDb2RlLkFSR1VNRU5UX0VSUk9SKTtcbiAgICBhd2FpdCB0aGlzLmdldE9ySW5pdFJlZGlyZWN0UGVyc2lzdGVuY2VNYW5hZ2VyKCk7XG5cbiAgICAvLyBJZiB0aGUgcmVkaXJlY3QgdXNlcidzIGV2ZW50IElEIG1hdGNoZXMgdGhlIGN1cnJlbnQgdXNlcidzIGV2ZW50IElELFxuICAgIC8vIERPIE5PVCByZWxvYWQgdGhlIGN1cnJlbnQgdXNlciwgb3RoZXJ3aXNlIHRoZXknbGwgYmUgY2xlYXJlZCBmcm9tIHN0b3JhZ2UuXG4gICAgLy8gVGhpcyBpcyBpbXBvcnRhbnQgZm9yIHRoZSByZWF1dGhlbnRpY2F0ZVdpdGhSZWRpcmVjdCgpIGZsb3cuXG4gICAgaWYgKFxuICAgICAgdGhpcy5yZWRpcmVjdFVzZXIgJiZcbiAgICAgIHRoaXMucmVkaXJlY3RVc2VyLl9yZWRpcmVjdEV2ZW50SWQgPT09IGZ1dHVyZUN1cnJlbnRVc2VyLl9yZWRpcmVjdEV2ZW50SWRcbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLmRpcmVjdGx5U2V0Q3VycmVudFVzZXIoZnV0dXJlQ3VycmVudFVzZXIpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnJlbG9hZEFuZFNldEN1cnJlbnRVc2VyT3JDbGVhcihmdXR1cmVDdXJyZW50VXNlcik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHRyeVJlZGlyZWN0U2lnbkluKFxuICAgIHJlZGlyZWN0UmVzb2x2ZXI6IFBvcHVwUmVkaXJlY3RSZXNvbHZlclxuICApOiBQcm9taXNlPFVzZXJDcmVkZW50aWFsIHwgbnVsbD4ge1xuICAgIC8vIFRoZSByZWRpcmVjdCB1c2VyIG5lZWRzIHRvIGJlIGNoZWNrZWQgKGFuZCBzaWduZWQgaW4gaWYgYXZhaWxhYmxlKVxuICAgIC8vIGR1cmluZyBhdXRoIGluaXRpYWxpemF0aW9uLiBBbGwgb2YgdGhlIG5vcm1hbCBzaWduIGluIGFuZCBsaW5rL3JlYXV0aFxuICAgIC8vIGZsb3dzIGNhbGwgYmFjayBpbnRvIGF1dGggYW5kIHB1c2ggdGhpbmdzIG9udG8gdGhlIHByb21pc2UgcXVldWUuIFdlXG4gICAgLy8gbmVlZCB0byBhd2FpdCB0aGUgcmVzdWx0IG9mIHRoZSByZWRpcmVjdCBzaWduIGluICppbnNpZGUgdGhlIHByb21pc2VcbiAgICAvLyBxdWV1ZSouIFRoaXMgcHJlc2VudHMgYSBwcm9ibGVtOiB3ZSBydW4gaW50byBkZWFkbG9jay4gU2VlOlxuICAgIC8vICAgIOKUjD4gW0luaXRpYWxpemF0aW9uXSDilIDilIDilIDilIDilIDilJBcbiAgICAvLyAgICDilIw+IFs8b3RoZXIgcXVldWUgdGFza3M+XSDilIJcbiAgICAvLyAgICDilJTilIAgW2dldFJlZGlyZWN0UmVzdWx0XSA84pSA4pSYXG4gICAgLy8gICAgd2hlcmUgW10gYXJlIHRhc2tzIG9uIHRoZSBxdWV1ZSBhbmQgYXJyb3dzIGRlbm90ZSBhd2FpdHNcbiAgICAvLyBJbml0aWFsaXphdGlvbiB3aWxsIG5ldmVyIGNvbXBsZXRlIGJlY2F1c2UgaXQncyB3YWl0aW5nIG9uIHNvbWV0aGluZ1xuICAgIC8vIHRoYXQncyB3YWl0aW5nIGZvciBpbml0aWFsaXphdGlvbiB0byBjb21wbGV0ZSFcbiAgICAvL1xuICAgIC8vIEluc3RlYWQsIHRoaXMgbWV0aG9kIGNhbGxzIGdldFJlZGlyZWN0UmVzdWx0KCkgKHN0b3JlZCBpblxuICAgIC8vIF9jb21wbGV0ZVJlZGlyZWN0Rm4pIHdpdGggYW4gb3B0aW9uYWwgcGFyYW1ldGVyIHRoYXQgaW5zdHJ1Y3RzIGFsbCBvZlxuICAgIC8vIHRoZSB1bmRlcmx5aW5nIGF1dGggb3BlcmF0aW9ucyB0byBza2lwIGFueXRoaW5nIHRoYXQgbXV0YXRlcyBhdXRoIHN0YXRlLlxuXG4gICAgbGV0IHJlc3VsdDogVXNlckNyZWRlbnRpYWwgfCBudWxsID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgLy8gV2Uga25vdyB0aGlzLl9wb3B1cFJlZGlyZWN0UmVzb2x2ZXIgaXMgc2V0IHNpbmNlIHJlZGlyZWN0UmVzb2x2ZXJcbiAgICAgIC8vIGlzIHBhc3NlZCBpbi4gVGhlIF9jb21wbGV0ZVJlZGlyZWN0Rm4gZXhwZWN0cyB0aGUgdW53cmFwcGVkIGV4dGVybi5cbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuX3BvcHVwUmVkaXJlY3RSZXNvbHZlciEuX2NvbXBsZXRlUmVkaXJlY3RGbihcbiAgICAgICAgdGhpcyxcbiAgICAgICAgcmVkaXJlY3RSZXNvbHZlcixcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBTd2FsbG93IGFueSBlcnJvcnMgaGVyZTsgdGhlIGNvZGUgY2FuIHJldHJpZXZlIHRoZW0gaW5cbiAgICAgIC8vIGdldFJlZGlyZWN0UmVzdWx0KCkuXG4gICAgICBhd2FpdCB0aGlzLl9zZXRSZWRpcmVjdFVzZXIobnVsbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVsb2FkQW5kU2V0Q3VycmVudFVzZXJPckNsZWFyKFxuICAgIHVzZXI6IFVzZXJJbnRlcm5hbFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgX3JlbG9hZFdpdGhvdXRTYXZpbmcodXNlcik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKFxuICAgICAgICAoZSBhcyBGaXJlYmFzZUVycm9yKT8uY29kZSAhPT1cbiAgICAgICAgYGF1dGgvJHtBdXRoRXJyb3JDb2RlLk5FVFdPUktfUkVRVUVTVF9GQUlMRUR9YFxuICAgICAgKSB7XG4gICAgICAgIC8vIFNvbWV0aGluZydzIHdyb25nIHdpdGggdGhlIHVzZXIncyB0b2tlbi4gTG9nIHRoZW0gb3V0IGFuZCByZW1vdmVcbiAgICAgICAgLy8gdGhlbSBmcm9tIHN0b3JhZ2VcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlyZWN0bHlTZXRDdXJyZW50VXNlcihudWxsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5kaXJlY3RseVNldEN1cnJlbnRVc2VyKHVzZXIpO1xuICB9XG5cbiAgdXNlRGV2aWNlTGFuZ3VhZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5sYW5ndWFnZUNvZGUgPSBfZ2V0VXNlckxhbmd1YWdlKCk7XG4gIH1cblxuICBhc3luYyBfZGVsZXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuX2RlbGV0ZWQgPSB0cnVlO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlQ3VycmVudFVzZXIodXNlckV4dGVybjogVXNlciB8IG51bGwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBUaGUgcHVibGljIHVwZGF0ZUN1cnJlbnRVc2VyIG1ldGhvZCBuZWVkcyB0byBtYWtlIGEgY29weSBvZiB0aGUgdXNlcixcbiAgICAvLyBhbmQgYWxzbyBjaGVjayB0aGF0IHRoZSBwcm9qZWN0IG1hdGNoZXNcbiAgICBjb25zdCB1c2VyID0gdXNlckV4dGVyblxuICAgICAgPyAoZ2V0TW9kdWxhckluc3RhbmNlKHVzZXJFeHRlcm4pIGFzIFVzZXJJbnRlcm5hbClcbiAgICAgIDogbnVsbDtcbiAgICBpZiAodXNlcikge1xuICAgICAgX2Fzc2VydChcbiAgICAgICAgdXNlci5hdXRoLmNvbmZpZy5hcGlLZXkgPT09IHRoaXMuY29uZmlnLmFwaUtleSxcbiAgICAgICAgdGhpcyxcbiAgICAgICAgQXV0aEVycm9yQ29kZS5JTlZBTElEX0FVVEhcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl91cGRhdGVDdXJyZW50VXNlcih1c2VyICYmIHVzZXIuX2Nsb25lKHRoaXMpKTtcbiAgfVxuXG4gIGFzeW5jIF91cGRhdGVDdXJyZW50VXNlcihcbiAgICB1c2VyOiBVc2VyIHwgbnVsbCxcbiAgICBza2lwQmVmb3JlU3RhdGVDYWxsYmFja3M6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5fZGVsZXRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodXNlcikge1xuICAgICAgX2Fzc2VydChcbiAgICAgICAgdGhpcy50ZW5hbnRJZCA9PT0gdXNlci50ZW5hbnRJZCxcbiAgICAgICAgdGhpcyxcbiAgICAgICAgQXV0aEVycm9yQ29kZS5URU5BTlRfSURfTUlTTUFUQ0hcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFza2lwQmVmb3JlU3RhdGVDYWxsYmFja3MpIHtcbiAgICAgIGF3YWl0IHRoaXMuYmVmb3JlU3RhdGVRdWV1ZS5ydW5NaWRkbGV3YXJlKHVzZXIpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnF1ZXVlKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuZGlyZWN0bHlTZXRDdXJyZW50VXNlcih1c2VyIGFzIFVzZXJJbnRlcm5hbCB8IG51bGwpO1xuICAgICAgdGhpcy5ub3RpZnlBdXRoTGlzdGVuZXJzKCk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBzaWduT3V0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFJ1biBmaXJzdCwgdG8gYmxvY2sgX3NldFJlZGlyZWN0VXNlcigpIGlmIGFueSBjYWxsYmFja3MgZmFpbC5cbiAgICBhd2FpdCB0aGlzLmJlZm9yZVN0YXRlUXVldWUucnVuTWlkZGxld2FyZShudWxsKTtcbiAgICAvLyBDbGVhciB0aGUgcmVkaXJlY3QgdXNlciB3aGVuIHNpZ25PdXQgaXMgY2FsbGVkXG4gICAgaWYgKHRoaXMucmVkaXJlY3RQZXJzaXN0ZW5jZU1hbmFnZXIgfHwgdGhpcy5fcG9wdXBSZWRpcmVjdFJlc29sdmVyKSB7XG4gICAgICBhd2FpdCB0aGlzLl9zZXRSZWRpcmVjdFVzZXIobnVsbCk7XG4gICAgfVxuXG4gICAgLy8gUHJldmVudCBjYWxsYmFja3MgZnJvbSBiZWluZyBjYWxsZWQgYWdhaW4gaW4gX3VwZGF0ZUN1cnJlbnRVc2VyLCBhc1xuICAgIC8vIHRoZXkgd2VyZSBhbHJlYWR5IGNhbGxlZCBpbiB0aGUgZmlyc3QgbGluZS5cbiAgICByZXR1cm4gdGhpcy5fdXBkYXRlQ3VycmVudFVzZXIobnVsbCwgLyogc2tpcEJlZm9yZVN0YXRlQ2FsbGJhY2tzICovIHRydWUpO1xuICB9XG5cbiAgc2V0UGVyc2lzdGVuY2UocGVyc2lzdGVuY2U6IFBlcnNpc3RlbmNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5hc3NlcnRlZFBlcnNpc3RlbmNlLnNldFBlcnNpc3RlbmNlKF9nZXRJbnN0YW5jZShwZXJzaXN0ZW5jZSkpO1xuICAgIH0pO1xuICB9XG5cbiAgX2dldFJlY2FwdGNoYUNvbmZpZygpOiBSZWNhcHRjaGFDb25maWcgfCBudWxsIHtcbiAgICBpZiAodGhpcy50ZW5hbnRJZCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYWdlbnRSZWNhcHRjaGFDb25maWc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl90ZW5hbnRSZWNhcHRjaGFDb25maWdzW3RoaXMudGVuYW50SWRdO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHZhbGlkYXRlUGFzc3dvcmQocGFzc3dvcmQ6IHN0cmluZyk6IFByb21pc2U8UGFzc3dvcmRWYWxpZGF0aW9uU3RhdHVzPiB7XG4gICAgaWYgKCF0aGlzLl9nZXRQYXNzd29yZFBvbGljeUludGVybmFsKCkpIHtcbiAgICAgIGF3YWl0IHRoaXMuX3VwZGF0ZVBhc3N3b3JkUG9saWN5KCk7XG4gICAgfVxuXG4gICAgLy8gUGFzc3dvcmQgcG9saWN5IHdpbGwgYmUgZGVmaW5lZCBhZnRlciBmZXRjaGluZy5cbiAgICBjb25zdCBwYXNzd29yZFBvbGljeTogUGFzc3dvcmRQb2xpY3lJbnRlcm5hbCA9XG4gICAgICB0aGlzLl9nZXRQYXNzd29yZFBvbGljeUludGVybmFsKCkhO1xuXG4gICAgLy8gQ2hlY2sgdGhhdCB0aGUgcG9saWN5IHNjaGVtYSB2ZXJzaW9uIGlzIHN1cHBvcnRlZCBieSB0aGUgU0RLLlxuICAgIC8vIFRPRE86IFVwZGF0ZSB0aGlzIGxvZ2ljIHRvIHVzZSBhIG1heCBzdXBwb3J0ZWQgcG9saWN5IHNjaGVtYSB2ZXJzaW9uIG9uY2Ugd2UgaGF2ZSBtdWx0aXBsZSBzY2hlbWEgdmVyc2lvbnMuXG4gICAgaWYgKFxuICAgICAgcGFzc3dvcmRQb2xpY3kuc2NoZW1hVmVyc2lvbiAhPT1cbiAgICAgIHRoaXMuRVhQRUNURURfUEFTU1dPUkRfUE9MSUNZX1NDSEVNQV9WRVJTSU9OXG4gICAgKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgIHRoaXMuX2Vycm9yRmFjdG9yeS5jcmVhdGUoXG4gICAgICAgICAgQXV0aEVycm9yQ29kZS5VTlNVUFBPUlRFRF9QQVNTV09SRF9QT0xJQ1lfU0NIRU1BX1ZFUlNJT04sXG4gICAgICAgICAge31cbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFzc3dvcmRQb2xpY3kudmFsaWRhdGVQYXNzd29yZChwYXNzd29yZCk7XG4gIH1cblxuICBfZ2V0UGFzc3dvcmRQb2xpY3lJbnRlcm5hbCgpOiBQYXNzd29yZFBvbGljeUludGVybmFsIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMudGVuYW50SWQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLl9wcm9qZWN0UGFzc3dvcmRQb2xpY3k7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl90ZW5hbnRQYXNzd29yZFBvbGljaWVzW3RoaXMudGVuYW50SWRdO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIF91cGRhdGVQYXNzd29yZFBvbGljeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IF9nZXRQYXNzd29yZFBvbGljeSh0aGlzKTtcblxuICAgIGNvbnN0IHBhc3N3b3JkUG9saWN5OiBQYXNzd29yZFBvbGljeUludGVybmFsID0gbmV3IFBhc3N3b3JkUG9saWN5SW1wbChcbiAgICAgIHJlc3BvbnNlXG4gICAgKTtcblxuICAgIGlmICh0aGlzLnRlbmFudElkID09PSBudWxsKSB7XG4gICAgICB0aGlzLl9wcm9qZWN0UGFzc3dvcmRQb2xpY3kgPSBwYXNzd29yZFBvbGljeTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdGVuYW50UGFzc3dvcmRQb2xpY2llc1t0aGlzLnRlbmFudElkXSA9IHBhc3N3b3JkUG9saWN5O1xuICAgIH1cbiAgfVxuXG4gIF9nZXRQZXJzaXN0ZW5jZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmFzc2VydGVkUGVyc2lzdGVuY2UucGVyc2lzdGVuY2UudHlwZTtcbiAgfVxuXG4gIF91cGRhdGVFcnJvck1hcChlcnJvck1hcDogQXV0aEVycm9yTWFwKTogdm9pZCB7XG4gICAgdGhpcy5fZXJyb3JGYWN0b3J5ID0gbmV3IEVycm9yRmFjdG9yeTxBdXRoRXJyb3JDb2RlLCBBdXRoRXJyb3JQYXJhbXM+KFxuICAgICAgJ2F1dGgnLFxuICAgICAgJ0ZpcmViYXNlJyxcbiAgICAgIChlcnJvck1hcCBhcyBFcnJvck1hcFJldHJpZXZlcikoKVxuICAgICk7XG4gIH1cblxuICBvbkF1dGhTdGF0ZUNoYW5nZWQoXG4gICAgbmV4dE9yT2JzZXJ2ZXI6IE5leHRPck9ic2VydmVyPFVzZXI+LFxuICAgIGVycm9yPzogRXJyb3JGbixcbiAgICBjb21wbGV0ZWQ/OiBDb21wbGV0ZUZuXG4gICk6IFVuc3Vic2NyaWJlIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpc3RlclN0YXRlTGlzdGVuZXIoXG4gICAgICB0aGlzLmF1dGhTdGF0ZVN1YnNjcmlwdGlvbixcbiAgICAgIG5leHRPck9ic2VydmVyLFxuICAgICAgZXJyb3IsXG4gICAgICBjb21wbGV0ZWRcbiAgICApO1xuICB9XG5cbiAgYmVmb3JlQXV0aFN0YXRlQ2hhbmdlZChcbiAgICBjYWxsYmFjazogKHVzZXI6IFVzZXIgfCBudWxsKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPixcbiAgICBvbkFib3J0PzogKCkgPT4gdm9pZFxuICApOiBVbnN1YnNjcmliZSB7XG4gICAgcmV0dXJuIHRoaXMuYmVmb3JlU3RhdGVRdWV1ZS5wdXNoQ2FsbGJhY2soY2FsbGJhY2ssIG9uQWJvcnQpO1xuICB9XG5cbiAgb25JZFRva2VuQ2hhbmdlZChcbiAgICBuZXh0T3JPYnNlcnZlcjogTmV4dE9yT2JzZXJ2ZXI8VXNlcj4sXG4gICAgZXJyb3I/OiBFcnJvckZuLFxuICAgIGNvbXBsZXRlZD86IENvbXBsZXRlRm5cbiAgKTogVW5zdWJzY3JpYmUge1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdGVyU3RhdGVMaXN0ZW5lcihcbiAgICAgIHRoaXMuaWRUb2tlblN1YnNjcmlwdGlvbixcbiAgICAgIG5leHRPck9ic2VydmVyLFxuICAgICAgZXJyb3IsXG4gICAgICBjb21wbGV0ZWRcbiAgICApO1xuICB9XG5cbiAgYXV0aFN0YXRlUmVhZHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRVc2VyKSB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gdGhpcy5vbkF1dGhTdGF0ZUNoYW5nZWQoKCkgPT4ge1xuICAgICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9LCByZWplY3QpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgdG9KU09OKCk6IG9iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFwaUtleTogdGhpcy5jb25maWcuYXBpS2V5LFxuICAgICAgYXV0aERvbWFpbjogdGhpcy5jb25maWcuYXV0aERvbWFpbixcbiAgICAgIGFwcE5hbWU6IHRoaXMubmFtZSxcbiAgICAgIGN1cnJlbnRVc2VyOiB0aGlzLl9jdXJyZW50VXNlcj8udG9KU09OKClcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgX3NldFJlZGlyZWN0VXNlcihcbiAgICB1c2VyOiBVc2VySW50ZXJuYWwgfCBudWxsLFxuICAgIHBvcHVwUmVkaXJlY3RSZXNvbHZlcj86IFBvcHVwUmVkaXJlY3RSZXNvbHZlclxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZWRpcmVjdE1hbmFnZXIgPSBhd2FpdCB0aGlzLmdldE9ySW5pdFJlZGlyZWN0UGVyc2lzdGVuY2VNYW5hZ2VyKFxuICAgICAgcG9wdXBSZWRpcmVjdFJlc29sdmVyXG4gICAgKTtcbiAgICByZXR1cm4gdXNlciA9PT0gbnVsbFxuICAgICAgPyByZWRpcmVjdE1hbmFnZXIucmVtb3ZlQ3VycmVudFVzZXIoKVxuICAgICAgOiByZWRpcmVjdE1hbmFnZXIuc2V0Q3VycmVudFVzZXIodXNlcik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldE9ySW5pdFJlZGlyZWN0UGVyc2lzdGVuY2VNYW5hZ2VyKFxuICAgIHBvcHVwUmVkaXJlY3RSZXNvbHZlcj86IFBvcHVwUmVkaXJlY3RSZXNvbHZlclxuICApOiBQcm9taXNlPFBlcnNpc3RlbmNlVXNlck1hbmFnZXI+IHtcbiAgICBpZiAoIXRoaXMucmVkaXJlY3RQZXJzaXN0ZW5jZU1hbmFnZXIpIHtcbiAgICAgIGNvbnN0IHJlc29sdmVyOiBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJJbnRlcm5hbCB8IG51bGwgPVxuICAgICAgICAocG9wdXBSZWRpcmVjdFJlc29sdmVyICYmIF9nZXRJbnN0YW5jZShwb3B1cFJlZGlyZWN0UmVzb2x2ZXIpKSB8fFxuICAgICAgICB0aGlzLl9wb3B1cFJlZGlyZWN0UmVzb2x2ZXI7XG4gICAgICBfYXNzZXJ0KHJlc29sdmVyLCB0aGlzLCBBdXRoRXJyb3JDb2RlLkFSR1VNRU5UX0VSUk9SKTtcbiAgICAgIHRoaXMucmVkaXJlY3RQZXJzaXN0ZW5jZU1hbmFnZXIgPSBhd2FpdCBQZXJzaXN0ZW5jZVVzZXJNYW5hZ2VyLmNyZWF0ZShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgW19nZXRJbnN0YW5jZShyZXNvbHZlci5fcmVkaXJlY3RQZXJzaXN0ZW5jZSldLFxuICAgICAgICBLZXlOYW1lLlJFRElSRUNUX1VTRVJcbiAgICAgICk7XG4gICAgICB0aGlzLnJlZGlyZWN0VXNlciA9XG4gICAgICAgIGF3YWl0IHRoaXMucmVkaXJlY3RQZXJzaXN0ZW5jZU1hbmFnZXIuZ2V0Q3VycmVudFVzZXIoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5yZWRpcmVjdFBlcnNpc3RlbmNlTWFuYWdlcjtcbiAgfVxuXG4gIGFzeW5jIF9yZWRpcmVjdFVzZXJGb3JJZChpZDogc3RyaW5nKTogUHJvbWlzZTxVc2VySW50ZXJuYWwgfCBudWxsPiB7XG4gICAgLy8gTWFrZSBzdXJlIHdlJ3ZlIGNsZWFyZWQgYW55IHBlbmRpbmcgcGVyc2lzdGVuY2UgYWN0aW9ucyBpZiB3ZSdyZSBub3QgaW5cbiAgICAvLyB0aGUgaW5pdGlhbGl6ZXJcbiAgICBpZiAodGhpcy5faXNJbml0aWFsaXplZCkge1xuICAgICAgYXdhaXQgdGhpcy5xdWV1ZShhc3luYyAoKSA9PiB7fSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2N1cnJlbnRVc2VyPy5fcmVkaXJlY3RFdmVudElkID09PSBpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRVc2VyO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJlZGlyZWN0VXNlcj8uX3JlZGlyZWN0RXZlbnRJZCA9PT0gaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlZGlyZWN0VXNlcjtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGFzeW5jIF9wZXJzaXN0VXNlcklmQ3VycmVudCh1c2VyOiBVc2VySW50ZXJuYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodXNlciA9PT0gdGhpcy5jdXJyZW50VXNlcikge1xuICAgICAgcmV0dXJuIHRoaXMucXVldWUoYXN5bmMgKCkgPT4gdGhpcy5kaXJlY3RseVNldEN1cnJlbnRVc2VyKHVzZXIpKTtcbiAgICB9XG4gIH1cblxuICAvKiogTm90aWZpZXMgbGlzdGVuZXJzIG9ubHkgaWYgdGhlIHVzZXIgaXMgY3VycmVudCAqL1xuICBfbm90aWZ5TGlzdGVuZXJzSWZDdXJyZW50KHVzZXI6IFVzZXJJbnRlcm5hbCk6IHZvaWQge1xuICAgIGlmICh1c2VyID09PSB0aGlzLmN1cnJlbnRVc2VyKSB7XG4gICAgICB0aGlzLm5vdGlmeUF1dGhMaXN0ZW5lcnMoKTtcbiAgICB9XG4gIH1cblxuICBfa2V5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuY29uZmlnLmF1dGhEb21haW59OiR7dGhpcy5jb25maWcuYXBpS2V5fToke3RoaXMubmFtZX1gO1xuICB9XG5cbiAgX3N0YXJ0UHJvYWN0aXZlUmVmcmVzaCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzUHJvYWN0aXZlUmVmcmVzaEVuYWJsZWQgPSB0cnVlO1xuICAgIGlmICh0aGlzLmN1cnJlbnRVc2VyKSB7XG4gICAgICB0aGlzLl9jdXJyZW50VXNlci5fc3RhcnRQcm9hY3RpdmVSZWZyZXNoKCk7XG4gICAgfVxuICB9XG5cbiAgX3N0b3BQcm9hY3RpdmVSZWZyZXNoKCk6IHZvaWQge1xuICAgIHRoaXMuaXNQcm9hY3RpdmVSZWZyZXNoRW5hYmxlZCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmN1cnJlbnRVc2VyKSB7XG4gICAgICB0aGlzLl9jdXJyZW50VXNlci5fc3RvcFByb2FjdGl2ZVJlZnJlc2goKTtcbiAgICB9XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgY3VycmVudCB1c2VyIGNhc3QgYXMgdGhlIGludGVybmFsIHR5cGUgKi9cbiAgZ2V0IF9jdXJyZW50VXNlcigpOiBVc2VySW50ZXJuYWwge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRVc2VyIGFzIFVzZXJJbnRlcm5hbDtcbiAgfVxuXG4gIHByaXZhdGUgbm90aWZ5QXV0aExpc3RlbmVycygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2lzSW5pdGlhbGl6ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmlkVG9rZW5TdWJzY3JpcHRpb24ubmV4dCh0aGlzLmN1cnJlbnRVc2VyKTtcblxuICAgIGNvbnN0IGN1cnJlbnRVaWQgPSB0aGlzLmN1cnJlbnRVc2VyPy51aWQgPz8gbnVsbDtcbiAgICBpZiAodGhpcy5sYXN0Tm90aWZpZWRVaWQgIT09IGN1cnJlbnRVaWQpIHtcbiAgICAgIHRoaXMubGFzdE5vdGlmaWVkVWlkID0gY3VycmVudFVpZDtcbiAgICAgIHRoaXMuYXV0aFN0YXRlU3Vic2NyaXB0aW9uLm5leHQodGhpcy5jdXJyZW50VXNlcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlclN0YXRlTGlzdGVuZXIoXG4gICAgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb248VXNlcj4sXG4gICAgbmV4dE9yT2JzZXJ2ZXI6IE5leHRPck9ic2VydmVyPFVzZXI+LFxuICAgIGVycm9yPzogRXJyb3JGbixcbiAgICBjb21wbGV0ZWQ/OiBDb21wbGV0ZUZuXG4gICk6IFVuc3Vic2NyaWJlIHtcbiAgICBpZiAodGhpcy5fZGVsZXRlZCkge1xuICAgICAgcmV0dXJuICgpID0+IHt9O1xuICAgIH1cblxuICAgIGNvbnN0IGNiID1cbiAgICAgIHR5cGVvZiBuZXh0T3JPYnNlcnZlciA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IG5leHRPck9ic2VydmVyXG4gICAgICAgIDogbmV4dE9yT2JzZXJ2ZXIubmV4dC5iaW5kKG5leHRPck9ic2VydmVyKTtcblxuICAgIGxldCBpc1Vuc3Vic2NyaWJlZCA9IGZhbHNlO1xuXG4gICAgY29uc3QgcHJvbWlzZSA9IHRoaXMuX2lzSW5pdGlhbGl6ZWRcbiAgICAgID8gUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgIDogdGhpcy5faW5pdGlhbGl6YXRpb25Qcm9taXNlO1xuICAgIF9hc3NlcnQocHJvbWlzZSwgdGhpcywgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG4gICAgLy8gVGhlIGNhbGxiYWNrIG5lZWRzIHRvIGJlIGNhbGxlZCBhc3luY2hyb25vdXNseSBwZXIgdGhlIHNwZWMuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1mbG9hdGluZy1wcm9taXNlc1xuICAgIHByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICBpZiAoaXNVbnN1YnNjcmliZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2IodGhpcy5jdXJyZW50VXNlcik7XG4gICAgfSk7XG5cbiAgICBpZiAodHlwZW9mIG5leHRPck9ic2VydmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zdCB1bnN1YnNjcmliZSA9IHN1YnNjcmlwdGlvbi5hZGRPYnNlcnZlcihcbiAgICAgICAgbmV4dE9yT2JzZXJ2ZXIsXG4gICAgICAgIGVycm9yLFxuICAgICAgICBjb21wbGV0ZWRcbiAgICAgICk7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBpc1Vuc3Vic2NyaWJlZCA9IHRydWU7XG4gICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB1bnN1YnNjcmliZSA9IHN1YnNjcmlwdGlvbi5hZGRPYnNlcnZlcihuZXh0T3JPYnNlcnZlcik7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBpc1Vuc3Vic2NyaWJlZCA9IHRydWU7XG4gICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbnByb3RlY3RlZCAoZnJvbSByYWNlIGNvbmRpdGlvbnMpIG1ldGhvZCB0byBzZXQgdGhlIGN1cnJlbnQgdXNlci4gVGhpc1xuICAgKiBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gYSBxdWV1ZWQgY2FsbGJhY2suIFRoaXMgaXMgbmVjZXNzYXJ5XG4gICAqIGJlY2F1c2UgdGhlIHF1ZXVlIHNob3VsZG4ndCByZWx5IG9uIGFub3RoZXIgcXVldWVkIGNhbGxiYWNrLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXJlY3RseVNldEN1cnJlbnRVc2VyKFxuICAgIHVzZXI6IFVzZXJJbnRlcm5hbCB8IG51bGxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuY3VycmVudFVzZXIgJiYgdGhpcy5jdXJyZW50VXNlciAhPT0gdXNlcikge1xuICAgICAgdGhpcy5fY3VycmVudFVzZXIuX3N0b3BQcm9hY3RpdmVSZWZyZXNoKCk7XG4gICAgfVxuICAgIGlmICh1c2VyICYmIHRoaXMuaXNQcm9hY3RpdmVSZWZyZXNoRW5hYmxlZCkge1xuICAgICAgdXNlci5fc3RhcnRQcm9hY3RpdmVSZWZyZXNoKCk7XG4gICAgfVxuXG4gICAgdGhpcy5jdXJyZW50VXNlciA9IHVzZXI7XG5cbiAgICBpZiAodXNlcikge1xuICAgICAgYXdhaXQgdGhpcy5hc3NlcnRlZFBlcnNpc3RlbmNlLnNldEN1cnJlbnRVc2VyKHVzZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmFzc2VydGVkUGVyc2lzdGVuY2UucmVtb3ZlQ3VycmVudFVzZXIoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHF1ZXVlKGFjdGlvbjogQXN5bmNBY3Rpb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBJbiBjYXNlIHNvbWV0aGluZyBlcnJvcnMsIHRoZSBjYWxsYmFjayBzdGlsbCBzaG91bGQgYmUgY2FsbGVkIGluIG9yZGVyXG4gICAgLy8gdG8ga2VlcCB0aGUgcHJvbWlzZSBjaGFpbiBhbGl2ZVxuICAgIHRoaXMub3BlcmF0aW9ucyA9IHRoaXMub3BlcmF0aW9ucy50aGVuKGFjdGlvbiwgYWN0aW9uKTtcbiAgICByZXR1cm4gdGhpcy5vcGVyYXRpb25zO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgYXNzZXJ0ZWRQZXJzaXN0ZW5jZSgpOiBQZXJzaXN0ZW5jZVVzZXJNYW5hZ2VyIHtcbiAgICBfYXNzZXJ0KHRoaXMucGVyc2lzdGVuY2VNYW5hZ2VyLCB0aGlzLCBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SKTtcbiAgICByZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZU1hbmFnZXI7XG4gIH1cblxuICBwcml2YXRlIGZyYW1ld29ya3M6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgY2xpZW50VmVyc2lvbjogc3RyaW5nO1xuICBfbG9nRnJhbWV3b3JrKGZyYW1ld29yazogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCFmcmFtZXdvcmsgfHwgdGhpcy5mcmFtZXdvcmtzLmluY2x1ZGVzKGZyYW1ld29yaykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5mcmFtZXdvcmtzLnB1c2goZnJhbWV3b3JrKTtcblxuICAgIC8vIFNvcnQgYWxwaGFiZXRpY2FsbHkgc28gdGhhdCBcIkZpcmViYXNlQ29yZS13ZWIsRmlyZWJhc2VVSS13ZWJcIiBhbmRcbiAgICAvLyBcIkZpcmViYXNlVUktd2ViLEZpcmViYXNlQ29yZS13ZWJcIiBhcmVuJ3Qgdmlld2VkIGFzIGRpZmZlcmVudC5cbiAgICB0aGlzLmZyYW1ld29ya3Muc29ydCgpO1xuICAgIHRoaXMuY2xpZW50VmVyc2lvbiA9IF9nZXRDbGllbnRWZXJzaW9uKFxuICAgICAgdGhpcy5jb25maWcuY2xpZW50UGxhdGZvcm0sXG4gICAgICB0aGlzLl9nZXRGcmFtZXdvcmtzKClcbiAgICApO1xuICB9XG4gIF9nZXRGcmFtZXdvcmtzKCk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5mcmFtZXdvcmtzO1xuICB9XG4gIGFzeW5jIF9nZXRBZGRpdGlvbmFsSGVhZGVycygpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgICAvLyBBZGRpdGlvbmFsIGhlYWRlcnMgb24gZXZlcnkgcmVxdWVzdFxuICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICBbSHR0cEhlYWRlci5YX0NMSUVOVF9WRVJTSU9OXTogdGhpcy5jbGllbnRWZXJzaW9uXG4gICAgfTtcblxuICAgIGlmICh0aGlzLmFwcC5vcHRpb25zLmFwcElkKSB7XG4gICAgICBoZWFkZXJzW0h0dHBIZWFkZXIuWF9GSVJFQkFTRV9HTVBJRF0gPSB0aGlzLmFwcC5vcHRpb25zLmFwcElkO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBoZWFydGJlYXQgc2VydmljZSBleGlzdHMsIGFkZCB0aGUgaGVhcnRiZWF0IHN0cmluZ1xuICAgIGNvbnN0IGhlYXJ0YmVhdHNIZWFkZXIgPSBhd2FpdCB0aGlzLmhlYXJ0YmVhdFNlcnZpY2VQcm92aWRlclxuICAgICAgLmdldEltbWVkaWF0ZSh7XG4gICAgICAgIG9wdGlvbmFsOiB0cnVlXG4gICAgICB9KVxuICAgICAgPy5nZXRIZWFydGJlYXRzSGVhZGVyKCk7XG4gICAgaWYgKGhlYXJ0YmVhdHNIZWFkZXIpIHtcbiAgICAgIGhlYWRlcnNbSHR0cEhlYWRlci5YX0ZJUkVCQVNFX0NMSUVOVF0gPSBoZWFydGJlYXRzSGVhZGVyO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBBcHAgQ2hlY2sgc2VydmljZSBleGlzdHMsIGFkZCB0aGUgQXBwIENoZWNrIHRva2VuIGluIHRoZSBoZWFkZXJzXG4gICAgY29uc3QgYXBwQ2hlY2tUb2tlbiA9IGF3YWl0IHRoaXMuX2dldEFwcENoZWNrVG9rZW4oKTtcbiAgICBpZiAoYXBwQ2hlY2tUb2tlbikge1xuICAgICAgaGVhZGVyc1tIdHRwSGVhZGVyLlhfRklSRUJBU0VfQVBQX0NIRUNLXSA9IGFwcENoZWNrVG9rZW47XG4gICAgfVxuXG4gICAgcmV0dXJuIGhlYWRlcnM7XG4gIH1cblxuICBhc3luYyBfZ2V0QXBwQ2hlY2tUb2tlbigpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IGFwcENoZWNrVG9rZW5SZXN1bHQgPSBhd2FpdCB0aGlzLmFwcENoZWNrU2VydmljZVByb3ZpZGVyXG4gICAgICAuZ2V0SW1tZWRpYXRlKHsgb3B0aW9uYWw6IHRydWUgfSlcbiAgICAgID8uZ2V0VG9rZW4oKTtcbiAgICBpZiAoYXBwQ2hlY2tUb2tlblJlc3VsdD8uZXJyb3IpIHtcbiAgICAgIC8vIENvbnRleHQ6IGFwcENoZWNrLmdldFRva2VuKCkgd2lsbCBuZXZlciB0aHJvdyBldmVuIGlmIGFuIGVycm9yIGhhcHBlbmVkLlxuICAgICAgLy8gSW4gdGhlIGVycm9yIGNhc2UsIGEgZHVtbXkgdG9rZW4gd2lsbCBiZSByZXR1cm5lZCBhbG9uZyB3aXRoIGFuIGVycm9yIGZpZWxkIGRlc2NyaWJpbmdcbiAgICAgIC8vIHRoZSBlcnJvci4gSW4gZ2VuZXJhbCwgd2Ugc2hvdWxkbid0IGNhcmUgYWJvdXQgdGhlIGVycm9yIGNvbmRpdGlvbiBhbmQganVzdCB1c2VcbiAgICAgIC8vIHRoZSB0b2tlbiAoYWN0dWFsIG9yIGR1bW15KSB0byBzZW5kIHJlcXVlc3RzLlxuICAgICAgX2xvZ1dhcm4oXG4gICAgICAgIGBFcnJvciB3aGlsZSByZXRyaWV2aW5nIEFwcCBDaGVjayB0b2tlbjogJHthcHBDaGVja1Rva2VuUmVzdWx0LmVycm9yfWBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBhcHBDaGVja1Rva2VuUmVzdWx0Py50b2tlbjtcbiAgfVxufVxuXG4vKipcbiAqIE1ldGhvZCB0byBiZSB1c2VkIHRvIGNhc3QgZG93biB0byBvdXIgcHJpdmF0ZSBpbXBsbWVudGF0aW9uIG9mIEF1dGguXG4gKiBJdCB3aWxsIGFsc28gaGFuZGxlIHVud3JhcHBpbmcgZnJvbSB0aGUgY29tcGF0IHR5cGUgaWYgbmVjZXNzYXJ5XG4gKlxuICogQHBhcmFtIGF1dGggQXV0aCBvYmplY3QgcGFzc2VkIGluIGZyb20gZGV2ZWxvcGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfY2FzdEF1dGgoYXV0aDogQXV0aCk6IEF1dGhJbnRlcm5hbCB7XG4gIHJldHVybiBnZXRNb2R1bGFySW5zdGFuY2UoYXV0aCkgYXMgQXV0aEludGVybmFsO1xufVxuXG4vKiogSGVscGVyIGNsYXNzIHRvIHdyYXAgc3Vic2NyaWJlciBsb2dpYyAqL1xuY2xhc3MgU3Vic2NyaXB0aW9uPFQ+IHtcbiAgcHJpdmF0ZSBvYnNlcnZlcjogT2JzZXJ2ZXI8VCB8IG51bGw+IHwgbnVsbCA9IG51bGw7XG4gIHJlYWRvbmx5IGFkZE9ic2VydmVyOiBTdWJzY3JpYmU8VCB8IG51bGw+ID0gY3JlYXRlU3Vic2NyaWJlKFxuICAgIG9ic2VydmVyID0+ICh0aGlzLm9ic2VydmVyID0gb2JzZXJ2ZXIpXG4gICk7XG5cbiAgY29uc3RydWN0b3IocmVhZG9ubHkgYXV0aDogQXV0aEludGVybmFsKSB7fVxuXG4gIGdldCBuZXh0KCk6IE5leHRGbjxUIHwgbnVsbD4ge1xuICAgIF9hc3NlcnQodGhpcy5vYnNlcnZlciwgdGhpcy5hdXRoLCBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SKTtcbiAgICByZXR1cm4gdGhpcy5vYnNlcnZlci5uZXh0LmJpbmQodGhpcy5vYnNlcnZlcik7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBBdXRoRXJyb3JDb2RlIH0gZnJvbSAnLi4vY29yZS9lcnJvcnMnO1xuaW1wb3J0IHsgX2NyZWF0ZUVycm9yIH0gZnJvbSAnLi4vY29yZS91dGlsL2Fzc2VydCc7XG5cbmZ1bmN0aW9uIGdldFNjcmlwdFBhcmVudEVsZW1lbnQoKTogSFRNTERvY3VtZW50IHwgSFRNTEhlYWRFbGVtZW50IHtcbiAgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJyk/LlswXSA/PyBkb2N1bWVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9sb2FkSlModXJsOiBzdHJpbmcpOiBQcm9taXNlPEV2ZW50PiB7XG4gIC8vIFRPRE86IGNvbnNpZGVyIGFkZGluZyB0aW1lb3V0IHN1cHBvcnQgJiBjYW5jZWxsYXRpb25cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgIGVsLnNldEF0dHJpYnV0ZSgnc3JjJywgdXJsKTtcbiAgICBlbC5vbmxvYWQgPSByZXNvbHZlO1xuICAgIGVsLm9uZXJyb3IgPSBlID0+IHtcbiAgICAgIGNvbnN0IGVycm9yID0gX2NyZWF0ZUVycm9yKEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IpO1xuICAgICAgZXJyb3IuY3VzdG9tRGF0YSA9IGUgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgIHJlamVjdChlcnJvcik7XG4gICAgfTtcbiAgICBlbC50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7XG4gICAgZWwuY2hhcnNldCA9ICdVVEYtOCc7XG4gICAgZ2V0U2NyaXB0UGFyZW50RWxlbWVudCgpLmFwcGVuZENoaWxkKGVsKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfZ2VuZXJhdGVDYWxsYmFja05hbWUocHJlZml4OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYF9fJHtwcmVmaXh9JHtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwKX1gO1xufVxuIiwgIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMgKi9cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IGlzRW50ZXJwcmlzZSwgUmVjYXB0Y2hhQ29uZmlnIH0gZnJvbSAnLi9yZWNhcHRjaGEnO1xuaW1wb3J0IHsgZ2V0UmVjYXB0Y2hhQ29uZmlnIH0gZnJvbSAnLi4vLi4vYXBpL2F1dGhlbnRpY2F0aW9uL3JlY2FwdGNoYSc7XG5pbXBvcnQge1xuICBSZWNhcHRjaGFDbGllbnRUeXBlLFxuICBSZWNhcHRjaGFWZXJzaW9uLFxuICBSZWNhcHRjaGFBY3Rpb25OYW1lLFxuICBSZWNhcHRjaGFQcm92aWRlclxufSBmcm9tICcuLi8uLi9hcGknO1xuXG5pbXBvcnQgeyBBdXRoIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcbmltcG9ydCB7IEF1dGhJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL2F1dGgnO1xuaW1wb3J0IHsgX2Nhc3RBdXRoIH0gZnJvbSAnLi4vLi4vY29yZS9hdXRoL2F1dGhfaW1wbCc7XG5pbXBvcnQgKiBhcyBqc0hlbHBlcnMgZnJvbSAnLi4vbG9hZF9qcyc7XG5pbXBvcnQgeyBBdXRoRXJyb3JDb2RlIH0gZnJvbSAnLi4vLi4vY29yZS9lcnJvcnMnO1xuXG5jb25zdCBSRUNBUFRDSEFfRU5URVJQUklTRV9VUkwgPVxuICAnaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9yZWNhcHRjaGEvZW50ZXJwcmlzZS5qcz9yZW5kZXI9JztcblxuZXhwb3J0IGNvbnN0IFJFQ0FQVENIQV9FTlRFUlBSSVNFX1ZFUklGSUVSX1RZUEUgPSAncmVjYXB0Y2hhLWVudGVycHJpc2UnO1xuZXhwb3J0IGNvbnN0IEZBS0VfVE9LRU4gPSAnTk9fUkVDQVBUQ0hBJztcblxuZXhwb3J0IGNsYXNzIFJlY2FwdGNoYUVudGVycHJpc2VWZXJpZmllciB7XG4gIC8qKlxuICAgKiBJZGVudGlmaWVzIHRoZSB0eXBlIG9mIGFwcGxpY2F0aW9uIHZlcmlmaWVyIChlLmcuIFwicmVjYXB0Y2hhLWVudGVycHJpc2VcIikuXG4gICAqL1xuICByZWFkb25seSB0eXBlID0gUkVDQVBUQ0hBX0VOVEVSUFJJU0VfVkVSSUZJRVJfVFlQRTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGF1dGg6IEF1dGhJbnRlcm5hbDtcblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGF1dGhFeHRlcm4gLSBUaGUgY29ycmVzcG9uZGluZyBGaXJlYmFzZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3RvcihhdXRoRXh0ZXJuOiBBdXRoKSB7XG4gICAgdGhpcy5hdXRoID0gX2Nhc3RBdXRoKGF1dGhFeHRlcm4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIHRoZSB2ZXJpZmljYXRpb24gcHJvY2Vzcy5cbiAgICpcbiAgICogQHJldHVybnMgQSBQcm9taXNlIGZvciBhIHRva2VuIHRoYXQgY2FuIGJlIHVzZWQgdG8gYXNzZXJ0IHRoZSB2YWxpZGl0eSBvZiBhIHJlcXVlc3QuXG4gICAqL1xuICBhc3luYyB2ZXJpZnkoXG4gICAgYWN0aW9uOiBzdHJpbmcgPSAndmVyaWZ5JyxcbiAgICBmb3JjZVJlZnJlc2ggPSBmYWxzZVxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGFzeW5jIGZ1bmN0aW9uIHJldHJpZXZlU2l0ZUtleShhdXRoOiBBdXRoSW50ZXJuYWwpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgaWYgKCFmb3JjZVJlZnJlc2gpIHtcbiAgICAgICAgaWYgKGF1dGgudGVuYW50SWQgPT0gbnVsbCAmJiBhdXRoLl9hZ2VudFJlY2FwdGNoYUNvbmZpZyAhPSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGF1dGguX2FnZW50UmVjYXB0Y2hhQ29uZmlnLnNpdGVLZXk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGF1dGgudGVuYW50SWQgIT0gbnVsbCAmJlxuICAgICAgICAgIGF1dGguX3RlbmFudFJlY2FwdGNoYUNvbmZpZ3NbYXV0aC50ZW5hbnRJZF0gIT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gYXV0aC5fdGVuYW50UmVjYXB0Y2hhQ29uZmlnc1thdXRoLnRlbmFudElkXS5zaXRlS2V5O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxzdHJpbmc+KGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgZ2V0UmVjYXB0Y2hhQ29uZmlnKGF1dGgsIHtcbiAgICAgICAgICBjbGllbnRUeXBlOiBSZWNhcHRjaGFDbGllbnRUeXBlLldFQixcbiAgICAgICAgICB2ZXJzaW9uOiBSZWNhcHRjaGFWZXJzaW9uLkVOVEVSUFJJU0VcbiAgICAgICAgfSlcbiAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2UucmVjYXB0Y2hhS2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcigncmVjYXB0Y2hhIEVudGVycHJpc2Ugc2l0ZSBrZXkgdW5kZWZpbmVkJykpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgY29uZmlnID0gbmV3IFJlY2FwdGNoYUNvbmZpZyhyZXNwb25zZSk7XG4gICAgICAgICAgICAgIGlmIChhdXRoLnRlbmFudElkID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBhdXRoLl9hZ2VudFJlY2FwdGNoYUNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhdXRoLl90ZW5hbnRSZWNhcHRjaGFDb25maWdzW2F1dGgudGVuYW50SWRdID0gY29uZmlnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKGNvbmZpZy5zaXRlS2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmV0cmlldmVSZWNhcHRjaGFUb2tlbihcbiAgICAgIHNpdGVLZXk6IHN0cmluZyxcbiAgICAgIHJlc29sdmU6ICh2YWx1ZTogc3RyaW5nIHwgUHJvbWlzZUxpa2U8c3RyaW5nPikgPT4gdm9pZCxcbiAgICAgIHJlamVjdDogKHJlYXNvbj86IHVua25vd24pID0+IHZvaWRcbiAgICApOiB2b2lkIHtcbiAgICAgIGNvbnN0IGdyZWNhcHRjaGEgPSB3aW5kb3cuZ3JlY2FwdGNoYTtcbiAgICAgIGlmIChpc0VudGVycHJpc2UoZ3JlY2FwdGNoYSkpIHtcbiAgICAgICAgZ3JlY2FwdGNoYS5lbnRlcnByaXNlLnJlYWR5KCgpID0+IHtcbiAgICAgICAgICBncmVjYXB0Y2hhLmVudGVycHJpc2VcbiAgICAgICAgICAgIC5leGVjdXRlKHNpdGVLZXksIHsgYWN0aW9uIH0pXG4gICAgICAgICAgICAudGhlbih0b2tlbiA9PiB7XG4gICAgICAgICAgICAgIHJlc29sdmUodG9rZW4pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgIHJlc29sdmUoRkFLRV9UT0tFTik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWplY3QoRXJyb3IoJ05vIHJlQ0FQVENIQSBlbnRlcnByaXNlIHNjcmlwdCBsb2FkZWQuJykpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHJldHJpZXZlU2l0ZUtleSh0aGlzLmF1dGgpXG4gICAgICAgIC50aGVuKHNpdGVLZXkgPT4ge1xuICAgICAgICAgIGlmICghZm9yY2VSZWZyZXNoICYmIGlzRW50ZXJwcmlzZSh3aW5kb3cuZ3JlY2FwdGNoYSkpIHtcbiAgICAgICAgICAgIHJldHJpZXZlUmVjYXB0Y2hhVG9rZW4oc2l0ZUtleSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIHJlamVjdChcbiAgICAgICAgICAgICAgICBuZXcgRXJyb3IoJ1JlY2FwdGNoYVZlcmlmaWVyIGlzIG9ubHkgc3VwcG9ydGVkIGluIGJyb3dzZXInKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBqc0hlbHBlcnNcbiAgICAgICAgICAgICAgLl9sb2FkSlMoUkVDQVBUQ0hBX0VOVEVSUFJJU0VfVVJMICsgc2l0ZUtleSlcbiAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHJpZXZlUmVjYXB0Y2hhVG9rZW4oc2l0ZUtleSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluamVjdFJlY2FwdGNoYUZpZWxkczxUPihcbiAgYXV0aDogQXV0aEludGVybmFsLFxuICByZXF1ZXN0OiBULFxuICBhY3Rpb246IFJlY2FwdGNoYUFjdGlvbk5hbWUsXG4gIGNhcHRjaGFSZXNwID0gZmFsc2Vcbik6IFByb21pc2U8VD4ge1xuICBjb25zdCB2ZXJpZmllciA9IG5ldyBSZWNhcHRjaGFFbnRlcnByaXNlVmVyaWZpZXIoYXV0aCk7XG4gIGxldCBjYXB0Y2hhUmVzcG9uc2U7XG4gIHRyeSB7XG4gICAgY2FwdGNoYVJlc3BvbnNlID0gYXdhaXQgdmVyaWZpZXIudmVyaWZ5KGFjdGlvbik7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY2FwdGNoYVJlc3BvbnNlID0gYXdhaXQgdmVyaWZpZXIudmVyaWZ5KGFjdGlvbiwgdHJ1ZSk7XG4gIH1cbiAgY29uc3QgbmV3UmVxdWVzdCA9IHsgLi4ucmVxdWVzdCB9O1xuICBpZiAoIWNhcHRjaGFSZXNwKSB7XG4gICAgT2JqZWN0LmFzc2lnbihuZXdSZXF1ZXN0LCB7IGNhcHRjaGFSZXNwb25zZSB9KTtcbiAgfSBlbHNlIHtcbiAgICBPYmplY3QuYXNzaWduKG5ld1JlcXVlc3QsIHsgJ2NhcHRjaGFSZXNwJzogY2FwdGNoYVJlc3BvbnNlIH0pO1xuICB9XG4gIE9iamVjdC5hc3NpZ24obmV3UmVxdWVzdCwgeyAnY2xpZW50VHlwZSc6IFJlY2FwdGNoYUNsaWVudFR5cGUuV0VCIH0pO1xuICBPYmplY3QuYXNzaWduKG5ld1JlcXVlc3QsIHtcbiAgICAncmVjYXB0Y2hhVmVyc2lvbic6IFJlY2FwdGNoYVZlcnNpb24uRU5URVJQUklTRVxuICB9KTtcbiAgcmV0dXJuIG5ld1JlcXVlc3Q7XG59XG5cbnR5cGUgQWN0aW9uTWV0aG9kPFRSZXF1ZXN0LCBUUmVzcG9uc2U+ID0gKFxuICBhdXRoOiBBdXRoLFxuICByZXF1ZXN0OiBUUmVxdWVzdFxuKSA9PiBQcm9taXNlPFRSZXNwb25zZT47XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoYW5kbGVSZWNhcHRjaGFGbG93PFRSZXF1ZXN0LCBUUmVzcG9uc2U+KFxuICBhdXRoSW5zdGFuY2U6IEF1dGhJbnRlcm5hbCxcbiAgcmVxdWVzdDogVFJlcXVlc3QsXG4gIGFjdGlvbk5hbWU6IFJlY2FwdGNoYUFjdGlvbk5hbWUsXG4gIGFjdGlvbk1ldGhvZDogQWN0aW9uTWV0aG9kPFRSZXF1ZXN0LCBUUmVzcG9uc2U+XG4pOiBQcm9taXNlPFRSZXNwb25zZT4ge1xuICBpZiAoXG4gICAgYXV0aEluc3RhbmNlXG4gICAgICAuX2dldFJlY2FwdGNoYUNvbmZpZygpXG4gICAgICA/LmlzUHJvdmlkZXJFbmFibGVkKFJlY2FwdGNoYVByb3ZpZGVyLkVNQUlMX1BBU1NXT1JEX1BST1ZJREVSKVxuICApIHtcbiAgICBjb25zdCByZXF1ZXN0V2l0aFJlY2FwdGNoYSA9IGF3YWl0IGluamVjdFJlY2FwdGNoYUZpZWxkcyhcbiAgICAgIGF1dGhJbnN0YW5jZSxcbiAgICAgIHJlcXVlc3QsXG4gICAgICBhY3Rpb25OYW1lLFxuICAgICAgYWN0aW9uTmFtZSA9PT0gUmVjYXB0Y2hhQWN0aW9uTmFtZS5HRVRfT09CX0NPREVcbiAgICApO1xuICAgIHJldHVybiBhY3Rpb25NZXRob2QoYXV0aEluc3RhbmNlLCByZXF1ZXN0V2l0aFJlY2FwdGNoYSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGFjdGlvbk1ldGhvZChhdXRoSW5zdGFuY2UsIHJlcXVlc3QpLmNhdGNoKGFzeW5jIGVycm9yID0+IHtcbiAgICAgIGlmIChlcnJvci5jb2RlID09PSBgYXV0aC8ke0F1dGhFcnJvckNvZGUuTUlTU0lOR19SRUNBUFRDSEFfVE9LRU59YCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBgJHthY3Rpb25OYW1lfSBpcyBwcm90ZWN0ZWQgYnkgcmVDQVBUQ0hBIEVudGVycHJpc2UgZm9yIHRoaXMgcHJvamVjdC4gQXV0b21hdGljYWxseSB0cmlnZ2VyaW5nIHRoZSByZUNBUFRDSEEgZmxvdyBhbmQgcmVzdGFydGluZyB0aGUgZmxvdy5gXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RXaXRoUmVjYXB0Y2hhID0gYXdhaXQgaW5qZWN0UmVjYXB0Y2hhRmllbGRzKFxuICAgICAgICAgIGF1dGhJbnN0YW5jZSxcbiAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgIGFjdGlvbk5hbWUsXG4gICAgICAgICAgYWN0aW9uTmFtZSA9PT0gUmVjYXB0Y2hhQWN0aW9uTmFtZS5HRVRfT09CX0NPREVcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGFjdGlvbk1ldGhvZChhdXRoSW5zdGFuY2UsIHJlcXVlc3RXaXRoUmVjYXB0Y2hhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF9pbml0aWFsaXplUmVjYXB0Y2hhQ29uZmlnKGF1dGg6IEF1dGgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXV0aEludGVybmFsID0gX2Nhc3RBdXRoKGF1dGgpO1xuXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZ2V0UmVjYXB0Y2hhQ29uZmlnKGF1dGhJbnRlcm5hbCwge1xuICAgIGNsaWVudFR5cGU6IFJlY2FwdGNoYUNsaWVudFR5cGUuV0VCLFxuICAgIHZlcnNpb246IFJlY2FwdGNoYVZlcnNpb24uRU5URVJQUklTRVxuICB9KTtcblxuICBjb25zdCBjb25maWcgPSBuZXcgUmVjYXB0Y2hhQ29uZmlnKHJlc3BvbnNlKTtcbiAgaWYgKGF1dGhJbnRlcm5hbC50ZW5hbnRJZCA9PSBudWxsKSB7XG4gICAgYXV0aEludGVybmFsLl9hZ2VudFJlY2FwdGNoYUNvbmZpZyA9IGNvbmZpZztcbiAgfSBlbHNlIHtcbiAgICBhdXRoSW50ZXJuYWwuX3RlbmFudFJlY2FwdGNoYUNvbmZpZ3NbYXV0aEludGVybmFsLnRlbmFudElkXSA9IGNvbmZpZztcbiAgfVxuXG4gIGlmIChjb25maWcuaXNQcm92aWRlckVuYWJsZWQoUmVjYXB0Y2hhUHJvdmlkZXIuRU1BSUxfUEFTU1dPUkRfUFJPVklERVIpKSB7XG4gICAgY29uc3QgdmVyaWZpZXIgPSBuZXcgUmVjYXB0Y2hhRW50ZXJwcmlzZVZlcmlmaWVyKGF1dGhJbnRlcm5hbCk7XG4gICAgdm9pZCB2ZXJpZmllci52ZXJpZnkoKTtcbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IF9nZXRQcm92aWRlciwgRmlyZWJhc2VBcHAgfSBmcm9tICdAZmlyZWJhc2UvYXBwJztcbmltcG9ydCB7IGRlZXBFcXVhbCB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcbmltcG9ydCB7IEF1dGgsIERlcGVuZGVuY2llcyB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgUGVyc2lzdGVuY2VJbnRlcm5hbCB9IGZyb20gJy4uL3BlcnNpc3RlbmNlJztcbmltcG9ydCB7IF9mYWlsIH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQnO1xuaW1wb3J0IHsgX2dldEluc3RhbmNlIH0gZnJvbSAnLi4vdXRpbC9pbnN0YW50aWF0b3InO1xuaW1wb3J0IHsgQXV0aEltcGwgfSBmcm9tICcuL2F1dGhfaW1wbCc7XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgYW4ge0BsaW5rIEF1dGh9IGluc3RhbmNlIHdpdGggZmluZS1ncmFpbmVkIGNvbnRyb2wgb3ZlclxuICoge0BsaW5rIERlcGVuZGVuY2llc30uXG4gKlxuICogQHJlbWFya3NcbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyBtb3JlIGNvbnRyb2wgb3ZlciB0aGUge0BsaW5rIEF1dGh9IGluc3RhbmNlIHRoYW5cbiAqIHtAbGluayBnZXRBdXRofS4gYGdldEF1dGhgIHVzZXMgcGxhdGZvcm0tc3BlY2lmaWMgZGVmYXVsdHMgdG8gc3VwcGx5XG4gKiB0aGUge0BsaW5rIERlcGVuZGVuY2llc30uIEluIGdlbmVyYWwsIGBnZXRBdXRoYCBpcyB0aGUgZWFzaWVzdCB3YXkgdG9cbiAqIGluaXRpYWxpemUgQXV0aCBhbmQgd29ya3MgZm9yIG1vc3QgdXNlIGNhc2VzLiBVc2UgYGluaXRpYWxpemVBdXRoYCBpZiB5b3VcbiAqIG5lZWQgY29udHJvbCBvdmVyIHdoaWNoIHBlcnNpc3RlbmNlIGxheWVyIGlzIHVzZWQsIG9yIHRvIG1pbmltaXplIGJ1bmRsZVxuICogc2l6ZSBpZiB5b3UncmUgbm90IHVzaW5nIGVpdGhlciBgc2lnbkluV2l0aFBvcHVwYCBvciBgc2lnbkluV2l0aFJlZGlyZWN0YC5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgaWYgeW91ciBhcHAgb25seSB1c2VzIGFub255bW91cyBhY2NvdW50cyBhbmQgeW91IG9ubHkgd2FudFxuICogYWNjb3VudHMgc2F2ZWQgZm9yIHRoZSBjdXJyZW50IHNlc3Npb24sIGluaXRpYWxpemUgYEF1dGhgIHdpdGg6XG4gKlxuICogYGBganNcbiAqIGNvbnN0IGF1dGggPSBpbml0aWFsaXplQXV0aChhcHAsIHtcbiAqICAgcGVyc2lzdGVuY2U6IGJyb3dzZXJTZXNzaW9uUGVyc2lzdGVuY2UsXG4gKiAgIHBvcHVwUmVkaXJlY3RSZXNvbHZlcjogdW5kZWZpbmVkLFxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsaXplQXV0aChhcHA6IEZpcmViYXNlQXBwLCBkZXBzPzogRGVwZW5kZW5jaWVzKTogQXV0aCB7XG4gIGNvbnN0IHByb3ZpZGVyID0gX2dldFByb3ZpZGVyKGFwcCwgJ2F1dGgnKTtcblxuICBpZiAocHJvdmlkZXIuaXNJbml0aWFsaXplZCgpKSB7XG4gICAgY29uc3QgYXV0aCA9IHByb3ZpZGVyLmdldEltbWVkaWF0ZSgpIGFzIEF1dGhJbXBsO1xuICAgIGNvbnN0IGluaXRpYWxPcHRpb25zID0gcHJvdmlkZXIuZ2V0T3B0aW9ucygpIGFzIERlcGVuZGVuY2llcztcbiAgICBpZiAoZGVlcEVxdWFsKGluaXRpYWxPcHRpb25zLCBkZXBzID8/IHt9KSkge1xuICAgICAgcmV0dXJuIGF1dGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9mYWlsKGF1dGgsIEF1dGhFcnJvckNvZGUuQUxSRUFEWV9JTklUSUFMSVpFRCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgYXV0aCA9IHByb3ZpZGVyLmluaXRpYWxpemUoeyBvcHRpb25zOiBkZXBzIH0pIGFzIEF1dGhJbXBsO1xuXG4gIHJldHVybiBhdXRoO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX2luaXRpYWxpemVBdXRoSW5zdGFuY2UoXG4gIGF1dGg6IEF1dGhJbXBsLFxuICBkZXBzPzogRGVwZW5kZW5jaWVzXG4pOiB2b2lkIHtcbiAgY29uc3QgcGVyc2lzdGVuY2UgPSBkZXBzPy5wZXJzaXN0ZW5jZSB8fCBbXTtcbiAgY29uc3QgaGllcmFyY2h5ID0gKFxuICAgIEFycmF5LmlzQXJyYXkocGVyc2lzdGVuY2UpID8gcGVyc2lzdGVuY2UgOiBbcGVyc2lzdGVuY2VdXG4gICkubWFwPFBlcnNpc3RlbmNlSW50ZXJuYWw+KF9nZXRJbnN0YW5jZSk7XG4gIGlmIChkZXBzPy5lcnJvck1hcCkge1xuICAgIGF1dGguX3VwZGF0ZUVycm9yTWFwKGRlcHMuZXJyb3JNYXApO1xuICB9XG5cbiAgLy8gVGhpcyBwcm9taXNlIGlzIGludGVuZGVkIHRvIGZsb2F0OyBhdXRoIGluaXRpYWxpemF0aW9uIGhhcHBlbnMgaW4gdGhlXG4gIC8vIGJhY2tncm91bmQsIG1lYW53aGlsZSB0aGUgYXV0aCBvYmplY3QgbWF5IGJlIHVzZWQgYnkgdGhlIGFwcC5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1mbG9hdGluZy1wcm9taXNlc1xuICBhdXRoLl9pbml0aWFsaXplV2l0aFBlcnNpc3RlbmNlKGhpZXJhcmNoeSwgZGVwcz8ucG9wdXBSZWRpcmVjdFJlc29sdmVyKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgQXV0aCB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5pbXBvcnQgeyBBdXRoRXJyb3JDb2RlIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IF9hc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydCc7XG5pbXBvcnQgeyBfY2FzdEF1dGggfSBmcm9tICcuL2F1dGhfaW1wbCc7XG5cbi8qKlxuICogQ2hhbmdlcyB0aGUge0BsaW5rIEF1dGh9IGluc3RhbmNlIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIEZpcmViYXNlIEF1dGggRW11bGF0b3IsIGluc3RlYWQgb2YgcHJvZHVjdGlvblxuICogRmlyZWJhc2UgQXV0aCBzZXJ2aWNlcy5cbiAqXG4gKiBAcmVtYXJrc1xuICogVGhpcyBtdXN0IGJlIGNhbGxlZCBzeW5jaHJvbm91c2x5IGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgZmlyc3QgY2FsbCB0b1xuICoge0BsaW5rIGluaXRpYWxpemVBdXRofS4gIERvIG5vdCB1c2Ugd2l0aCBwcm9kdWN0aW9uIGNyZWRlbnRpYWxzIGFzIGVtdWxhdG9yXG4gKiB0cmFmZmljIGlzIG5vdCBlbmNyeXB0ZWQuXG4gKlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBjb25uZWN0QXV0aEVtdWxhdG9yKGF1dGgsICdodHRwOi8vMTI3LjAuMC4xOjkwOTknLCB7IGRpc2FibGVXYXJuaW5nczogdHJ1ZSB9KTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cbiAqIEBwYXJhbSB1cmwgLSBUaGUgVVJMIGF0IHdoaWNoIHRoZSBlbXVsYXRvciBpcyBydW5uaW5nIChlZywgJ2h0dHA6Ly9sb2NhbGhvc3Q6OTA5OScpLlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbC4gYG9wdGlvbnMuZGlzYWJsZVdhcm5pbmdzYCBkZWZhdWx0cyB0byBgZmFsc2VgLiBTZXQgaXQgdG9cbiAqIGB0cnVlYCB0byBkaXNhYmxlIHRoZSB3YXJuaW5nIGJhbm5lciBhdHRhY2hlZCB0byB0aGUgRE9NLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbm5lY3RBdXRoRW11bGF0b3IoXG4gIGF1dGg6IEF1dGgsXG4gIHVybDogc3RyaW5nLFxuICBvcHRpb25zPzogeyBkaXNhYmxlV2FybmluZ3M6IGJvb2xlYW4gfVxuKTogdm9pZCB7XG4gIGNvbnN0IGF1dGhJbnRlcm5hbCA9IF9jYXN0QXV0aChhdXRoKTtcbiAgX2Fzc2VydChcbiAgICBhdXRoSW50ZXJuYWwuX2NhbkluaXRFbXVsYXRvcixcbiAgICBhdXRoSW50ZXJuYWwsXG4gICAgQXV0aEVycm9yQ29kZS5FTVVMQVRPUl9DT05GSUdfRkFJTEVEXG4gICk7XG5cbiAgX2Fzc2VydChcbiAgICAvXmh0dHBzPzpcXC9cXC8vLnRlc3QodXJsKSxcbiAgICBhdXRoSW50ZXJuYWwsXG4gICAgQXV0aEVycm9yQ29kZS5JTlZBTElEX0VNVUxBVE9SX1NDSEVNRVxuICApO1xuXG4gIGNvbnN0IGRpc2FibGVXYXJuaW5ncyA9ICEhb3B0aW9ucz8uZGlzYWJsZVdhcm5pbmdzO1xuXG4gIGNvbnN0IHByb3RvY29sID0gZXh0cmFjdFByb3RvY29sKHVybCk7XG4gIGNvbnN0IHsgaG9zdCwgcG9ydCB9ID0gZXh0cmFjdEhvc3RBbmRQb3J0KHVybCk7XG4gIGNvbnN0IHBvcnRTdHIgPSBwb3J0ID09PSBudWxsID8gJycgOiBgOiR7cG9ydH1gO1xuXG4gIC8vIEFsd2F5cyByZXBsYWNlIHBhdGggd2l0aCBcIi9cIiAoZXZlbiBpZiBpbnB1dCB1cmwgaGFkIG5vIHBhdGggYXQgYWxsLCBvciBoYWQgYSBkaWZmZXJlbnQgb25lKS5cbiAgYXV0aEludGVybmFsLmNvbmZpZy5lbXVsYXRvciA9IHsgdXJsOiBgJHtwcm90b2NvbH0vLyR7aG9zdH0ke3BvcnRTdHJ9L2AgfTtcbiAgYXV0aEludGVybmFsLnNldHRpbmdzLmFwcFZlcmlmaWNhdGlvbkRpc2FibGVkRm9yVGVzdGluZyA9IHRydWU7XG4gIGF1dGhJbnRlcm5hbC5lbXVsYXRvckNvbmZpZyA9IE9iamVjdC5mcmVlemUoe1xuICAgIGhvc3QsXG4gICAgcG9ydCxcbiAgICBwcm90b2NvbDogcHJvdG9jb2wucmVwbGFjZSgnOicsICcnKSxcbiAgICBvcHRpb25zOiBPYmplY3QuZnJlZXplKHsgZGlzYWJsZVdhcm5pbmdzIH0pXG4gIH0pO1xuXG4gIGlmICghZGlzYWJsZVdhcm5pbmdzKSB7XG4gICAgZW1pdEVtdWxhdG9yV2FybmluZygpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RQcm90b2NvbCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHByb3RvY29sRW5kID0gdXJsLmluZGV4T2YoJzonKTtcbiAgcmV0dXJuIHByb3RvY29sRW5kIDwgMCA/ICcnIDogdXJsLnN1YnN0cigwLCBwcm90b2NvbEVuZCArIDEpO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0SG9zdEFuZFBvcnQodXJsOiBzdHJpbmcpOiB7XG4gIGhvc3Q6IHN0cmluZztcbiAgcG9ydDogbnVtYmVyIHwgbnVsbDtcbn0ge1xuICBjb25zdCBwcm90b2NvbCA9IGV4dHJhY3RQcm90b2NvbCh1cmwpO1xuICBjb25zdCBhdXRob3JpdHkgPSAvKFxcL1xcLyk/KFtePyMvXSspLy5leGVjKHVybC5zdWJzdHIocHJvdG9jb2wubGVuZ3RoKSk7IC8vIEJldHdlZW4gLy8gYW5kIC8sID8gb3IgIy5cbiAgaWYgKCFhdXRob3JpdHkpIHtcbiAgICByZXR1cm4geyBob3N0OiAnJywgcG9ydDogbnVsbCB9O1xuICB9XG4gIGNvbnN0IGhvc3RBbmRQb3J0ID0gYXV0aG9yaXR5WzJdLnNwbGl0KCdAJykucG9wKCkgfHwgJyc7IC8vIFN0cmlwIG91dCBcInVzZXJuYW1lOnBhc3N3b3JkQFwiLlxuICBjb25zdCBicmFja2V0ZWRJUHY2ID0gL14oXFxbW15cXF1dK1xcXSkoOnwkKS8uZXhlYyhob3N0QW5kUG9ydCk7XG4gIGlmIChicmFja2V0ZWRJUHY2KSB7XG4gICAgY29uc3QgaG9zdCA9IGJyYWNrZXRlZElQdjZbMV07XG4gICAgcmV0dXJuIHsgaG9zdCwgcG9ydDogcGFyc2VQb3J0KGhvc3RBbmRQb3J0LnN1YnN0cihob3N0Lmxlbmd0aCArIDEpKSB9O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IFtob3N0LCBwb3J0XSA9IGhvc3RBbmRQb3J0LnNwbGl0KCc6Jyk7XG4gICAgcmV0dXJuIHsgaG9zdCwgcG9ydDogcGFyc2VQb3J0KHBvcnQpIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VQb3J0KHBvcnRTdHI6IHN0cmluZyk6IG51bWJlciB8IG51bGwge1xuICBpZiAoIXBvcnRTdHIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBwb3J0ID0gTnVtYmVyKHBvcnRTdHIpO1xuICBpZiAoaXNOYU4ocG9ydCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gcG9ydDtcbn1cblxuZnVuY3Rpb24gZW1pdEVtdWxhdG9yV2FybmluZygpOiB2b2lkIHtcbiAgZnVuY3Rpb24gYXR0YWNoQmFubmVyKCk6IHZvaWQge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpO1xuICAgIGNvbnN0IHN0eSA9IGVsLnN0eWxlO1xuICAgIGVsLmlubmVyVGV4dCA9XG4gICAgICAnUnVubmluZyBpbiBlbXVsYXRvciBtb2RlLiBEbyBub3QgdXNlIHdpdGggcHJvZHVjdGlvbiBjcmVkZW50aWFscy4nO1xuICAgIHN0eS5wb3NpdGlvbiA9ICdmaXhlZCc7XG4gICAgc3R5LndpZHRoID0gJzEwMCUnO1xuICAgIHN0eS5iYWNrZ3JvdW5kQ29sb3IgPSAnI2ZmZmZmZic7XG4gICAgc3R5LmJvcmRlciA9ICcuMWVtIHNvbGlkICMwMDAwMDAnO1xuICAgIHN0eS5jb2xvciA9ICcjYjUwMDAwJztcbiAgICBzdHkuYm90dG9tID0gJzBweCc7XG4gICAgc3R5LmxlZnQgPSAnMHB4JztcbiAgICBzdHkubWFyZ2luID0gJzBweCc7XG4gICAgc3R5LnpJbmRleCA9ICcxMDAwMCc7XG4gICAgc3R5LnRleHRBbGlnbiA9ICdjZW50ZXInO1xuICAgIGVsLmNsYXNzTGlzdC5hZGQoJ2ZpcmViYXNlLWVtdWxhdG9yLXdhcm5pbmcnKTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGVsKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnNvbGUuaW5mbyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICdXQVJOSU5HOiBZb3UgYXJlIHVzaW5nIHRoZSBBdXRoIEVtdWxhdG9yLCcgK1xuICAgICAgICAnIHdoaWNoIGlzIGludGVuZGVkIGZvciBsb2NhbCB0ZXN0aW5nIG9ubHkuICBEbyBub3QgdXNlIHdpdGgnICtcbiAgICAgICAgJyBwcm9kdWN0aW9uIGNyZWRlbnRpYWxzLidcbiAgICApO1xuICB9XG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJykge1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBhdHRhY2hCYW5uZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhdHRhY2hCYW5uZXIoKTtcbiAgICB9XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBQaG9uZU9yT2F1dGhUb2tlblJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vYXBpL2F1dGhlbnRpY2F0aW9uL21mYSc7XG5pbXBvcnQgeyBBdXRoSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9hdXRoJztcbmltcG9ydCB7IElkVG9rZW5SZXNwb25zZSB9IGZyb20gJy4uLy4uL21vZGVsL2lkX3Rva2VuJztcbmltcG9ydCB7IGRlYnVnRmFpbCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0JztcblxuLyoqXG4gKiBJbnRlcmZhY2UgdGhhdCByZXByZXNlbnRzIHRoZSBjcmVkZW50aWFscyByZXR1cm5lZCBieSBhbiB7QGxpbmsgQXV0aFByb3ZpZGVyfS5cbiAqXG4gKiBAcmVtYXJrc1xuICogSW1wbGVtZW50YXRpb25zIHNwZWNpZnkgdGhlIGRldGFpbHMgYWJvdXQgZWFjaCBhdXRoIHByb3ZpZGVyJ3MgY3JlZGVudGlhbCByZXF1aXJlbWVudHMuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgQXV0aENyZWRlbnRpYWwge1xuICAvKiogQGludGVybmFsICovXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICAgKiBUaGUgYXV0aGVudGljYXRpb24gcHJvdmlkZXIgSUQgZm9yIHRoZSBjcmVkZW50aWFsLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBGb3IgZXhhbXBsZSwgJ2ZhY2Vib29rLmNvbScsIG9yICdnb29nbGUuY29tJy5cbiAgICAgKi9cbiAgICByZWFkb25seSBwcm92aWRlcklkOiBzdHJpbmcsXG4gICAgLyoqXG4gICAgICogVGhlIGF1dGhlbnRpY2F0aW9uIHNpZ24gaW4gbWV0aG9kIGZvciB0aGUgY3JlZGVudGlhbC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRm9yIGV4YW1wbGUsIHtAbGluayBTaWduSW5NZXRob2R9LkVNQUlMX1BBU1NXT1JELCBvclxuICAgICAqIHtAbGluayBTaWduSW5NZXRob2R9LkVNQUlMX0xJTksuIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIHNpZ24taW4gbWV0aG9kXG4gICAgICogaWRlbnRpZmllciBhcyByZXR1cm5lZCBpbiB7QGxpbmsgZmV0Y2hTaWduSW5NZXRob2RzRm9yRW1haWx9LlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHNpZ25Jbk1ldGhvZDogc3RyaW5nXG4gICkge31cblxuICAvKipcbiAgICogUmV0dXJucyBhIEpTT04tc2VyaWFsaXphYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LlxuICAgKlxuICAgKiBAcmV0dXJucyBhIEpTT04tc2VyaWFsaXphYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LlxuICAgKi9cbiAgdG9KU09OKCk6IG9iamVjdCB7XG4gICAgcmV0dXJuIGRlYnVnRmFpbCgnbm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9nZXRJZFRva2VuUmVzcG9uc2UoX2F1dGg6IEF1dGhJbnRlcm5hbCk6IFByb21pc2U8UGhvbmVPck9hdXRoVG9rZW5SZXNwb25zZT4ge1xuICAgIHJldHVybiBkZWJ1Z0ZhaWwoJ25vdCBpbXBsZW1lbnRlZCcpO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2xpbmtUb0lkVG9rZW4oXG4gICAgX2F1dGg6IEF1dGhJbnRlcm5hbCxcbiAgICBfaWRUb2tlbjogc3RyaW5nXG4gICk6IFByb21pc2U8SWRUb2tlblJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIGRlYnVnRmFpbCgnbm90IGltcGxlbWVudGVkJyk7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZ2V0UmVhdXRoZW50aWNhdGlvblJlc29sdmVyKF9hdXRoOiBBdXRoSW50ZXJuYWwpOiBQcm9taXNlPElkVG9rZW5SZXNwb25zZT4ge1xuICAgIHJldHVybiBkZWJ1Z0ZhaWwoJ25vdCBpbXBsZW1lbnRlZCcpO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgQWN0aW9uQ29kZU9wZXJhdGlvbiwgQXV0aCB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbmltcG9ydCB7XG4gIEVuZHBvaW50LFxuICBIdHRwTWV0aG9kLFxuICBfYWRkVGlkSWZOZWNlc3NhcnksXG4gIF9wZXJmb3JtQXBpUmVxdWVzdFxufSBmcm9tICcuLi9pbmRleCc7XG5pbXBvcnQgeyBJZFRva2VuUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9tb2RlbC9pZF90b2tlbic7XG5pbXBvcnQgeyBNZmFFbnJvbGxtZW50IH0gZnJvbSAnLi9tZmEnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlc2V0UGFzc3dvcmRSZXF1ZXN0IHtcbiAgb29iQ29kZTogc3RyaW5nO1xuICBuZXdQYXNzd29yZD86IHN0cmluZztcbiAgdGVuYW50SWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzZXRQYXNzd29yZFJlc3BvbnNlIHtcbiAgZW1haWw6IHN0cmluZztcbiAgbmV3RW1haWw/OiBzdHJpbmc7XG4gIHJlcXVlc3RUeXBlPzogQWN0aW9uQ29kZU9wZXJhdGlvbjtcbiAgbWZhSW5mbz86IE1mYUVucm9sbG1lbnQ7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNldFBhc3N3b3JkKFxuICBhdXRoOiBBdXRoLFxuICByZXF1ZXN0OiBSZXNldFBhc3N3b3JkUmVxdWVzdFxuKTogUHJvbWlzZTxSZXNldFBhc3N3b3JkUmVzcG9uc2U+IHtcbiAgcmV0dXJuIF9wZXJmb3JtQXBpUmVxdWVzdDxSZXNldFBhc3N3b3JkUmVxdWVzdCwgUmVzZXRQYXNzd29yZFJlc3BvbnNlPihcbiAgICBhdXRoLFxuICAgIEh0dHBNZXRob2QuUE9TVCxcbiAgICBFbmRwb2ludC5SRVNFVF9QQVNTV09SRCxcbiAgICBfYWRkVGlkSWZOZWNlc3NhcnkoYXV0aCwgcmVxdWVzdClcbiAgKTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlRW1haWxQYXNzd29yZFJlcXVlc3Qge1xuICBpZFRva2VuOiBzdHJpbmc7XG4gIHJldHVyblNlY3VyZVRva2VuPzogYm9vbGVhbjtcbiAgZW1haWw/OiBzdHJpbmc7XG4gIHBhc3N3b3JkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUVtYWlsUGFzc3dvcmRSZXNwb25zZSBleHRlbmRzIElkVG9rZW5SZXNwb25zZSB7fVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlRW1haWxQYXNzd29yZChcbiAgYXV0aDogQXV0aCxcbiAgcmVxdWVzdDogVXBkYXRlRW1haWxQYXNzd29yZFJlcXVlc3Rcbik6IFByb21pc2U8VXBkYXRlRW1haWxQYXNzd29yZFJlc3BvbnNlPiB7XG4gIHJldHVybiBfcGVyZm9ybUFwaVJlcXVlc3Q8XG4gICAgVXBkYXRlRW1haWxQYXNzd29yZFJlcXVlc3QsXG4gICAgVXBkYXRlRW1haWxQYXNzd29yZFJlc3BvbnNlXG4gID4oYXV0aCwgSHR0cE1ldGhvZC5QT1NULCBFbmRwb2ludC5TRVRfQUNDT1VOVF9JTkZPLCByZXF1ZXN0KTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcHBseUFjdGlvbkNvZGVSZXF1ZXN0IHtcbiAgb29iQ29kZTogc3RyaW5nO1xuICB0ZW5hbnRJZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcHBseUFjdGlvbkNvZGVSZXNwb25zZSB7fVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXBwbHlBY3Rpb25Db2RlKFxuICBhdXRoOiBBdXRoLFxuICByZXF1ZXN0OiBBcHBseUFjdGlvbkNvZGVSZXF1ZXN0XG4pOiBQcm9taXNlPEFwcGx5QWN0aW9uQ29kZVJlc3BvbnNlPiB7XG4gIHJldHVybiBfcGVyZm9ybUFwaVJlcXVlc3Q8QXBwbHlBY3Rpb25Db2RlUmVxdWVzdCwgQXBwbHlBY3Rpb25Db2RlUmVzcG9uc2U+KFxuICAgIGF1dGgsXG4gICAgSHR0cE1ldGhvZC5QT1NULFxuICAgIEVuZHBvaW50LlNFVF9BQ0NPVU5UX0lORk8sXG4gICAgX2FkZFRpZElmTmVjZXNzYXJ5KGF1dGgsIHJlcXVlc3QpXG4gICk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgQWN0aW9uQ29kZU9wZXJhdGlvbiwgQXV0aCB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbmltcG9ydCB7XG4gIEVuZHBvaW50LFxuICBIdHRwTWV0aG9kLFxuICBSZWNhcHRjaGFDbGllbnRUeXBlLFxuICBSZWNhcHRjaGFWZXJzaW9uLFxuICBfYWRkVGlkSWZOZWNlc3NhcnksXG4gIF9wZXJmb3JtQXBpUmVxdWVzdCxcbiAgX3BlcmZvcm1TaWduSW5SZXF1ZXN0XG59IGZyb20gJy4uL2luZGV4JztcbmltcG9ydCB7IElkVG9rZW4sIElkVG9rZW5SZXNwb25zZSB9IGZyb20gJy4uLy4uL21vZGVsL2lkX3Rva2VuJztcblxuZXhwb3J0IGludGVyZmFjZSBTaWduSW5XaXRoUGFzc3dvcmRSZXF1ZXN0IHtcbiAgcmV0dXJuU2VjdXJlVG9rZW4/OiBib29sZWFuO1xuICBlbWFpbDogc3RyaW5nO1xuICBwYXNzd29yZDogc3RyaW5nO1xuICB0ZW5hbnRJZD86IHN0cmluZztcbiAgY2FwdGNoYVJlc3BvbnNlPzogc3RyaW5nO1xuICBjbGllbnRUeXBlPzogUmVjYXB0Y2hhQ2xpZW50VHlwZTtcbiAgcmVjYXB0Y2hhVmVyc2lvbj86IFJlY2FwdGNoYVZlcnNpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbkluV2l0aFBhc3N3b3JkUmVzcG9uc2UgZXh0ZW5kcyBJZFRva2VuUmVzcG9uc2Uge1xuICBlbWFpbDogc3RyaW5nO1xuICBkaXNwbGF5TmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2lnbkluV2l0aFBhc3N3b3JkKFxuICBhdXRoOiBBdXRoLFxuICByZXF1ZXN0OiBTaWduSW5XaXRoUGFzc3dvcmRSZXF1ZXN0XG4pOiBQcm9taXNlPFNpZ25JbldpdGhQYXNzd29yZFJlc3BvbnNlPiB7XG4gIHJldHVybiBfcGVyZm9ybVNpZ25JblJlcXVlc3Q8XG4gICAgU2lnbkluV2l0aFBhc3N3b3JkUmVxdWVzdCxcbiAgICBTaWduSW5XaXRoUGFzc3dvcmRSZXNwb25zZVxuICA+KFxuICAgIGF1dGgsXG4gICAgSHR0cE1ldGhvZC5QT1NULFxuICAgIEVuZHBvaW50LlNJR05fSU5fV0lUSF9QQVNTV09SRCxcbiAgICBfYWRkVGlkSWZOZWNlc3NhcnkoYXV0aCwgcmVxdWVzdClcbiAgKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRPb2JDb2RlUmVxdWVzdCB7XG4gIGVtYWlsPzogc3RyaW5nOyAvLyBFdmVyeXRoaW5nIGV4Y2VwdCBWRVJJRllfQU5EX0NIQU5HRV9FTUFJTFxuICBjb250aW51ZVVybD86IHN0cmluZztcbiAgaU9TQnVuZGxlSWQ/OiBzdHJpbmc7XG4gIGlvc0FwcFN0b3JlSWQ/OiBzdHJpbmc7XG4gIGFuZHJvaWRQYWNrYWdlTmFtZT86IHN0cmluZztcbiAgYW5kcm9pZEluc3RhbGxBcHA/OiBib29sZWFuO1xuICBhbmRyb2lkTWluaW11bVZlcnNpb25Db2RlPzogc3RyaW5nO1xuICBjYW5IYW5kbGVDb2RlSW5BcHA/OiBib29sZWFuO1xuICBkeW5hbWljTGlua0RvbWFpbj86IHN0cmluZztcbiAgdGVuYW50SWQ/OiBzdHJpbmc7XG4gIHRhcmdldFByb2plY3RpZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZXJpZnlFbWFpbFJlcXVlc3QgZXh0ZW5kcyBHZXRPb2JDb2RlUmVxdWVzdCB7XG4gIHJlcXVlc3RUeXBlOiBBY3Rpb25Db2RlT3BlcmF0aW9uLlZFUklGWV9FTUFJTDtcbiAgaWRUb2tlbjogSWRUb2tlbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXNzd29yZFJlc2V0UmVxdWVzdCBleHRlbmRzIEdldE9vYkNvZGVSZXF1ZXN0IHtcbiAgcmVxdWVzdFR5cGU6IEFjdGlvbkNvZGVPcGVyYXRpb24uUEFTU1dPUkRfUkVTRVQ7XG4gIGVtYWlsOiBzdHJpbmc7XG4gIGNhcHRjaGFSZXNwPzogc3RyaW5nO1xuICBjbGllbnRUeXBlPzogUmVjYXB0Y2hhQ2xpZW50VHlwZTtcbiAgcmVjYXB0Y2hhVmVyc2lvbj86IFJlY2FwdGNoYVZlcnNpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW1haWxTaWduSW5SZXF1ZXN0IGV4dGVuZHMgR2V0T29iQ29kZVJlcXVlc3Qge1xuICByZXF1ZXN0VHlwZTogQWN0aW9uQ29kZU9wZXJhdGlvbi5FTUFJTF9TSUdOSU47XG4gIGVtYWlsOiBzdHJpbmc7XG4gIGNhcHRjaGFSZXNwPzogc3RyaW5nO1xuICBjbGllbnRUeXBlPzogUmVjYXB0Y2hhQ2xpZW50VHlwZTtcbiAgcmVjYXB0Y2hhVmVyc2lvbj86IFJlY2FwdGNoYVZlcnNpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmVyaWZ5QW5kQ2hhbmdlRW1haWxSZXF1ZXN0IGV4dGVuZHMgR2V0T29iQ29kZVJlcXVlc3Qge1xuICByZXF1ZXN0VHlwZTogQWN0aW9uQ29kZU9wZXJhdGlvbi5WRVJJRllfQU5EX0NIQU5HRV9FTUFJTDtcbiAgaWRUb2tlbjogSWRUb2tlbjtcbiAgbmV3RW1haWw6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEdldE9vYkNvZGVSZXNwb25zZSB7XG4gIGVtYWlsOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmVyaWZ5RW1haWxSZXNwb25zZSBleHRlbmRzIEdldE9vYkNvZGVSZXNwb25zZSB7fVxuZXhwb3J0IGludGVyZmFjZSBQYXNzd29yZFJlc2V0UmVzcG9uc2UgZXh0ZW5kcyBHZXRPb2JDb2RlUmVzcG9uc2Uge31cbmV4cG9ydCBpbnRlcmZhY2UgRW1haWxTaWduSW5SZXNwb25zZSBleHRlbmRzIEdldE9vYkNvZGVSZXNwb25zZSB7fVxuZXhwb3J0IGludGVyZmFjZSBWZXJpZnlBbmRDaGFuZ2VFbWFpbFJlc3BvbnNlIGV4dGVuZHMgR2V0T29iQ29kZVJlcXVlc3Qge31cblxuYXN5bmMgZnVuY3Rpb24gc2VuZE9vYkNvZGUoXG4gIGF1dGg6IEF1dGgsXG4gIHJlcXVlc3Q6IEdldE9vYkNvZGVSZXF1ZXN0XG4pOiBQcm9taXNlPEdldE9vYkNvZGVSZXNwb25zZT4ge1xuICByZXR1cm4gX3BlcmZvcm1BcGlSZXF1ZXN0PEdldE9vYkNvZGVSZXF1ZXN0LCBHZXRPb2JDb2RlUmVzcG9uc2U+KFxuICAgIGF1dGgsXG4gICAgSHR0cE1ldGhvZC5QT1NULFxuICAgIEVuZHBvaW50LlNFTkRfT09CX0NPREUsXG4gICAgX2FkZFRpZElmTmVjZXNzYXJ5KGF1dGgsIHJlcXVlc3QpXG4gICk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZW5kRW1haWxWZXJpZmljYXRpb24oXG4gIGF1dGg6IEF1dGgsXG4gIHJlcXVlc3Q6IFZlcmlmeUVtYWlsUmVxdWVzdFxuKTogUHJvbWlzZTxWZXJpZnlFbWFpbFJlc3BvbnNlPiB7XG4gIHJldHVybiBzZW5kT29iQ29kZShhdXRoLCByZXF1ZXN0KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlbmRQYXNzd29yZFJlc2V0RW1haWwoXG4gIGF1dGg6IEF1dGgsXG4gIHJlcXVlc3Q6IFBhc3N3b3JkUmVzZXRSZXF1ZXN0XG4pOiBQcm9taXNlPFBhc3N3b3JkUmVzZXRSZXNwb25zZT4ge1xuICByZXR1cm4gc2VuZE9vYkNvZGUoYXV0aCwgcmVxdWVzdCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZW5kU2lnbkluTGlua1RvRW1haWwoXG4gIGF1dGg6IEF1dGgsXG4gIHJlcXVlc3Q6IEVtYWlsU2lnbkluUmVxdWVzdFxuKTogUHJvbWlzZTxFbWFpbFNpZ25JblJlc3BvbnNlPiB7XG4gIHJldHVybiBzZW5kT29iQ29kZShhdXRoLCByZXF1ZXN0KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZlcmlmeUFuZENoYW5nZUVtYWlsKFxuICBhdXRoOiBBdXRoLFxuICByZXF1ZXN0OiBWZXJpZnlBbmRDaGFuZ2VFbWFpbFJlcXVlc3Rcbik6IFByb21pc2U8VmVyaWZ5QW5kQ2hhbmdlRW1haWxSZXNwb25zZT4ge1xuICByZXR1cm4gc2VuZE9vYkNvZGUoYXV0aCwgcmVxdWVzdCk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgX3BlcmZvcm1TaWduSW5SZXF1ZXN0LFxuICBFbmRwb2ludCxcbiAgSHR0cE1ldGhvZCxcbiAgX2FkZFRpZElmTmVjZXNzYXJ5XG59IGZyb20gJy4uL2luZGV4JztcbmltcG9ydCB7IElkVG9rZW5SZXNwb25zZSB9IGZyb20gJy4uLy4uL21vZGVsL2lkX3Rva2VuJztcbmltcG9ydCB7IEF1dGggfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25JbldpdGhFbWFpbExpbmtSZXF1ZXN0IHtcbiAgZW1haWw6IHN0cmluZztcbiAgb29iQ29kZTogc3RyaW5nO1xuICB0ZW5hbnRJZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaWduSW5XaXRoRW1haWxMaW5rUmVzcG9uc2UgZXh0ZW5kcyBJZFRva2VuUmVzcG9uc2Uge1xuICBlbWFpbDogc3RyaW5nO1xuICBpc05ld1VzZXI6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaWduSW5XaXRoRW1haWxMaW5rKFxuICBhdXRoOiBBdXRoLFxuICByZXF1ZXN0OiBTaWduSW5XaXRoRW1haWxMaW5rUmVxdWVzdFxuKTogUHJvbWlzZTxTaWduSW5XaXRoRW1haWxMaW5rUmVzcG9uc2U+IHtcbiAgcmV0dXJuIF9wZXJmb3JtU2lnbkluUmVxdWVzdDxcbiAgICBTaWduSW5XaXRoRW1haWxMaW5rUmVxdWVzdCxcbiAgICBTaWduSW5XaXRoRW1haWxMaW5rUmVzcG9uc2VcbiAgPihcbiAgICBhdXRoLFxuICAgIEh0dHBNZXRob2QuUE9TVCxcbiAgICBFbmRwb2ludC5TSUdOX0lOX1dJVEhfRU1BSUxfTElOSyxcbiAgICBfYWRkVGlkSWZOZWNlc3NhcnkoYXV0aCwgcmVxdWVzdClcbiAgKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaWduSW5XaXRoRW1haWxMaW5rRm9yTGlua2luZ1JlcXVlc3RcbiAgZXh0ZW5kcyBTaWduSW5XaXRoRW1haWxMaW5rUmVxdWVzdCB7XG4gIGlkVG9rZW46IHN0cmluZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNpZ25JbldpdGhFbWFpbExpbmtGb3JMaW5raW5nKFxuICBhdXRoOiBBdXRoLFxuICByZXF1ZXN0OiBTaWduSW5XaXRoRW1haWxMaW5rRm9yTGlua2luZ1JlcXVlc3Rcbik6IFByb21pc2U8U2lnbkluV2l0aEVtYWlsTGlua1Jlc3BvbnNlPiB7XG4gIHJldHVybiBfcGVyZm9ybVNpZ25JblJlcXVlc3Q8XG4gICAgU2lnbkluV2l0aEVtYWlsTGlua0ZvckxpbmtpbmdSZXF1ZXN0LFxuICAgIFNpZ25JbldpdGhFbWFpbExpbmtSZXNwb25zZVxuICA+KFxuICAgIGF1dGgsXG4gICAgSHR0cE1ldGhvZC5QT1NULFxuICAgIEVuZHBvaW50LlNJR05fSU5fV0lUSF9FTUFJTF9MSU5LLFxuICAgIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KVxuICApO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IFByb3ZpZGVySWQsIFNpZ25Jbk1ldGhvZCB9IGZyb20gJy4uLy4uL21vZGVsL2VudW1zJztcblxuaW1wb3J0IHsgdXBkYXRlRW1haWxQYXNzd29yZCB9IGZyb20gJy4uLy4uL2FwaS9hY2NvdW50X21hbmFnZW1lbnQvZW1haWxfYW5kX3Bhc3N3b3JkJztcbmltcG9ydCB7XG4gIHNpZ25JbldpdGhQYXNzd29yZCxcbiAgU2lnbkluV2l0aFBhc3N3b3JkUmVxdWVzdFxufSBmcm9tICcuLi8uLi9hcGkvYXV0aGVudGljYXRpb24vZW1haWxfYW5kX3Bhc3N3b3JkJztcbmltcG9ydCB7XG4gIHNpZ25JbldpdGhFbWFpbExpbmssXG4gIHNpZ25JbldpdGhFbWFpbExpbmtGb3JMaW5raW5nXG59IGZyb20gJy4uLy4uL2FwaS9hdXRoZW50aWNhdGlvbi9lbWFpbF9saW5rJztcbmltcG9ydCB7IEF1dGhJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL2F1dGgnO1xuaW1wb3J0IHsgSWRUb2tlblJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vbW9kZWwvaWRfdG9rZW4nO1xuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBfZmFpbCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0JztcbmltcG9ydCB7IEF1dGhDcmVkZW50aWFsIH0gZnJvbSAnLi9hdXRoX2NyZWRlbnRpYWwnO1xuaW1wb3J0IHsgaGFuZGxlUmVjYXB0Y2hhRmxvdyB9IGZyb20gJy4uLy4uL3BsYXRmb3JtX2Jyb3dzZXIvcmVjYXB0Y2hhL3JlY2FwdGNoYV9lbnRlcnByaXNlX3ZlcmlmaWVyJztcbmltcG9ydCB7IFJlY2FwdGNoYUFjdGlvbk5hbWUsIFJlY2FwdGNoYUNsaWVudFR5cGUgfSBmcm9tICcuLi8uLi9hcGknO1xuLyoqXG4gKiBJbnRlcmZhY2UgdGhhdCByZXByZXNlbnRzIHRoZSBjcmVkZW50aWFscyByZXR1cm5lZCBieSB7QGxpbmsgRW1haWxBdXRoUHJvdmlkZXJ9IGZvclxuICoge0BsaW5rIFByb3ZpZGVySWR9LlBBU1NXT1JEXG4gKlxuICogQHJlbWFya3NcbiAqIENvdmVycyBib3RoIHtAbGluayBTaWduSW5NZXRob2R9LkVNQUlMX1BBU1NXT1JEIGFuZFxuICoge0BsaW5rIFNpZ25Jbk1ldGhvZH0uRU1BSUxfTElOSy5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBFbWFpbEF1dGhDcmVkZW50aWFsIGV4dGVuZHMgQXV0aENyZWRlbnRpYWwge1xuICAvKiogQGludGVybmFsICovXG4gIHByaXZhdGUgY29uc3RydWN0b3IoXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHJlYWRvbmx5IF9lbWFpbDogc3RyaW5nLFxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICByZWFkb25seSBfcGFzc3dvcmQ6IHN0cmluZyxcbiAgICBzaWduSW5NZXRob2Q6IFNpZ25Jbk1ldGhvZCxcbiAgICAvKiogQGludGVybmFsICovXG4gICAgcmVhZG9ubHkgX3RlbmFudElkOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICApIHtcbiAgICBzdXBlcihQcm92aWRlcklkLlBBU1NXT1JELCBzaWduSW5NZXRob2QpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzdGF0aWMgX2Zyb21FbWFpbEFuZFBhc3N3b3JkKFxuICAgIGVtYWlsOiBzdHJpbmcsXG4gICAgcGFzc3dvcmQ6IHN0cmluZ1xuICApOiBFbWFpbEF1dGhDcmVkZW50aWFsIHtcbiAgICByZXR1cm4gbmV3IEVtYWlsQXV0aENyZWRlbnRpYWwoXG4gICAgICBlbWFpbCxcbiAgICAgIHBhc3N3b3JkLFxuICAgICAgU2lnbkluTWV0aG9kLkVNQUlMX1BBU1NXT1JEXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgc3RhdGljIF9mcm9tRW1haWxBbmRDb2RlKFxuICAgIGVtYWlsOiBzdHJpbmcsXG4gICAgb29iQ29kZTogc3RyaW5nLFxuICAgIHRlbmFudElkOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICApOiBFbWFpbEF1dGhDcmVkZW50aWFsIHtcbiAgICByZXR1cm4gbmV3IEVtYWlsQXV0aENyZWRlbnRpYWwoXG4gICAgICBlbWFpbCxcbiAgICAgIG9vYkNvZGUsXG4gICAgICBTaWduSW5NZXRob2QuRU1BSUxfTElOSyxcbiAgICAgIHRlbmFudElkXG4gICAgKTtcbiAgfVxuXG4gIC8qKiB7QGluaGVyaXRkb2MgQXV0aENyZWRlbnRpYWwudG9KU09OfSAqL1xuICB0b0pTT04oKTogb2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgZW1haWw6IHRoaXMuX2VtYWlsLFxuICAgICAgcGFzc3dvcmQ6IHRoaXMuX3Bhc3N3b3JkLFxuICAgICAgc2lnbkluTWV0aG9kOiB0aGlzLnNpZ25Jbk1ldGhvZCxcbiAgICAgIHRlbmFudElkOiB0aGlzLl90ZW5hbnRJZFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU3RhdGljIG1ldGhvZCB0byBkZXNlcmlhbGl6ZSBhIEpTT04gcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0IGludG8gYW4ge0BsaW5rICBBdXRoQ3JlZGVudGlhbH0uXG4gICAqXG4gICAqIEBwYXJhbSBqc29uIC0gRWl0aGVyIGBvYmplY3RgIG9yIHRoZSBzdHJpbmdpZmllZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0LiBXaGVuIHN0cmluZyBpc1xuICAgKiBwcm92aWRlZCwgYEpTT04ucGFyc2VgIHdvdWxkIGJlIGNhbGxlZCBmaXJzdC5cbiAgICpcbiAgICogQHJldHVybnMgSWYgdGhlIEpTT04gaW5wdXQgZG9lcyBub3QgcmVwcmVzZW50IGFuIHtAbGluayBBdXRoQ3JlZGVudGlhbH0sIG51bGwgaXMgcmV0dXJuZWQuXG4gICAqL1xuICBzdGF0aWMgZnJvbUpTT04oanNvbjogb2JqZWN0IHwgc3RyaW5nKTogRW1haWxBdXRoQ3JlZGVudGlhbCB8IG51bGwge1xuICAgIGNvbnN0IG9iaiA9IHR5cGVvZiBqc29uID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UoanNvbikgOiBqc29uO1xuICAgIGlmIChvYmo/LmVtYWlsICYmIG9iaj8ucGFzc3dvcmQpIHtcbiAgICAgIGlmIChvYmouc2lnbkluTWV0aG9kID09PSBTaWduSW5NZXRob2QuRU1BSUxfUEFTU1dPUkQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Zyb21FbWFpbEFuZFBhc3N3b3JkKG9iai5lbWFpbCwgb2JqLnBhc3N3b3JkKTtcbiAgICAgIH0gZWxzZSBpZiAob2JqLnNpZ25Jbk1ldGhvZCA9PT0gU2lnbkluTWV0aG9kLkVNQUlMX0xJTkspIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Zyb21FbWFpbEFuZENvZGUob2JqLmVtYWlsLCBvYmoucGFzc3dvcmQsIG9iai50ZW5hbnRJZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBhc3luYyBfZ2V0SWRUb2tlblJlc3BvbnNlKGF1dGg6IEF1dGhJbnRlcm5hbCk6IFByb21pc2U8SWRUb2tlblJlc3BvbnNlPiB7XG4gICAgc3dpdGNoICh0aGlzLnNpZ25Jbk1ldGhvZCkge1xuICAgICAgY2FzZSBTaWduSW5NZXRob2QuRU1BSUxfUEFTU1dPUkQ6XG4gICAgICAgIGNvbnN0IHJlcXVlc3Q6IFNpZ25JbldpdGhQYXNzd29yZFJlcXVlc3QgPSB7XG4gICAgICAgICAgcmV0dXJuU2VjdXJlVG9rZW46IHRydWUsXG4gICAgICAgICAgZW1haWw6IHRoaXMuX2VtYWlsLFxuICAgICAgICAgIHBhc3N3b3JkOiB0aGlzLl9wYXNzd29yZCxcbiAgICAgICAgICBjbGllbnRUeXBlOiBSZWNhcHRjaGFDbGllbnRUeXBlLldFQlxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gaGFuZGxlUmVjYXB0Y2hhRmxvdyhcbiAgICAgICAgICBhdXRoLFxuICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgUmVjYXB0Y2hhQWN0aW9uTmFtZS5TSUdOX0lOX1dJVEhfUEFTU1dPUkQsXG4gICAgICAgICAgc2lnbkluV2l0aFBhc3N3b3JkXG4gICAgICAgICk7XG4gICAgICBjYXNlIFNpZ25Jbk1ldGhvZC5FTUFJTF9MSU5LOlxuICAgICAgICByZXR1cm4gc2lnbkluV2l0aEVtYWlsTGluayhhdXRoLCB7XG4gICAgICAgICAgZW1haWw6IHRoaXMuX2VtYWlsLFxuICAgICAgICAgIG9vYkNvZGU6IHRoaXMuX3Bhc3N3b3JkXG4gICAgICAgIH0pO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgX2ZhaWwoYXV0aCwgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBhc3luYyBfbGlua1RvSWRUb2tlbihcbiAgICBhdXRoOiBBdXRoSW50ZXJuYWwsXG4gICAgaWRUb2tlbjogc3RyaW5nXG4gICk6IFByb21pc2U8SWRUb2tlblJlc3BvbnNlPiB7XG4gICAgc3dpdGNoICh0aGlzLnNpZ25Jbk1ldGhvZCkge1xuICAgICAgY2FzZSBTaWduSW5NZXRob2QuRU1BSUxfUEFTU1dPUkQ6XG4gICAgICAgIHJldHVybiB1cGRhdGVFbWFpbFBhc3N3b3JkKGF1dGgsIHtcbiAgICAgICAgICBpZFRva2VuLFxuICAgICAgICAgIHJldHVyblNlY3VyZVRva2VuOiB0cnVlLFxuICAgICAgICAgIGVtYWlsOiB0aGlzLl9lbWFpbCxcbiAgICAgICAgICBwYXNzd29yZDogdGhpcy5fcGFzc3dvcmRcbiAgICAgICAgfSk7XG4gICAgICBjYXNlIFNpZ25Jbk1ldGhvZC5FTUFJTF9MSU5LOlxuICAgICAgICByZXR1cm4gc2lnbkluV2l0aEVtYWlsTGlua0ZvckxpbmtpbmcoYXV0aCwge1xuICAgICAgICAgIGlkVG9rZW4sXG4gICAgICAgICAgZW1haWw6IHRoaXMuX2VtYWlsLFxuICAgICAgICAgIG9vYkNvZGU6IHRoaXMuX3Bhc3N3b3JkXG4gICAgICAgIH0pO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgX2ZhaWwoYXV0aCwgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZ2V0UmVhdXRoZW50aWNhdGlvblJlc29sdmVyKGF1dGg6IEF1dGhJbnRlcm5hbCk6IFByb21pc2U8SWRUb2tlblJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2dldElkVG9rZW5SZXNwb25zZShhdXRoKTtcbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gIEVuZHBvaW50LFxuICBIdHRwTWV0aG9kLFxuICBfYWRkVGlkSWZOZWNlc3NhcnksXG4gIF9wZXJmb3JtU2lnbkluUmVxdWVzdFxufSBmcm9tICcuLi9pbmRleCc7XG5pbXBvcnQgeyBJZFRva2VuLCBJZFRva2VuUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9tb2RlbC9pZF90b2tlbic7XG5pbXBvcnQgeyBBdXRoIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBTaWduSW5XaXRoSWRwUmVxdWVzdCB7XG4gIHJlcXVlc3RVcmk6IHN0cmluZztcbiAgcG9zdEJvZHk/OiBzdHJpbmc7XG4gIHNlc3Npb25JZD86IHN0cmluZztcbiAgdGVuYW50SWQ/OiBzdHJpbmc7XG4gIHJldHVyblNlY3VyZVRva2VuOiBib29sZWFuO1xuICByZXR1cm5JZHBDcmVkZW50aWFsPzogYm9vbGVhbjtcbiAgaWRUb2tlbj86IElkVG9rZW47XG4gIGF1dG9DcmVhdGU/OiBib29sZWFuO1xuICBwZW5kaW5nVG9rZW4/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbkluV2l0aElkcFJlc3BvbnNlIGV4dGVuZHMgSWRUb2tlblJlc3BvbnNlIHtcbiAgb2F1dGhBY2Nlc3NUb2tlbj86IHN0cmluZztcbiAgb2F1dGhUb2tlblNlY3JldD86IHN0cmluZztcbiAgbm9uY2U/OiBzdHJpbmc7XG4gIG9hdXRoSWRUb2tlbj86IHN0cmluZztcbiAgcGVuZGluZ1Rva2VuPzogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2lnbkluV2l0aElkcChcbiAgYXV0aDogQXV0aCxcbiAgcmVxdWVzdDogU2lnbkluV2l0aElkcFJlcXVlc3Rcbik6IFByb21pc2U8U2lnbkluV2l0aElkcFJlc3BvbnNlPiB7XG4gIHJldHVybiBfcGVyZm9ybVNpZ25JblJlcXVlc3Q8U2lnbkluV2l0aElkcFJlcXVlc3QsIFNpZ25JbldpdGhJZHBSZXNwb25zZT4oXG4gICAgYXV0aCxcbiAgICBIdHRwTWV0aG9kLlBPU1QsXG4gICAgRW5kcG9pbnQuU0lHTl9JTl9XSVRIX0lEUCxcbiAgICBfYWRkVGlkSWZOZWNlc3NhcnkoYXV0aCwgcmVxdWVzdClcbiAgKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBxdWVyeXN0cmluZyB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcblxuaW1wb3J0IHtcbiAgc2lnbkluV2l0aElkcCxcbiAgU2lnbkluV2l0aElkcFJlcXVlc3Rcbn0gZnJvbSAnLi4vLi4vYXBpL2F1dGhlbnRpY2F0aW9uL2lkcCc7XG5pbXBvcnQgeyBBdXRoSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9hdXRoJztcbmltcG9ydCB7IElkVG9rZW5SZXNwb25zZSB9IGZyb20gJy4uLy4uL21vZGVsL2lkX3Rva2VuJztcbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgX2ZhaWwgfSBmcm9tICcuLi91dGlsL2Fzc2VydCc7XG5pbXBvcnQgeyBBdXRoQ3JlZGVudGlhbCB9IGZyb20gJy4vYXV0aF9jcmVkZW50aWFsJztcblxuY29uc3QgSURQX1JFUVVFU1RfVVJJID0gJ2h0dHA6Ly9sb2NhbGhvc3QnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9BdXRoQ3JlZGVudGlhbFBhcmFtcyB7XG4gIC8vIE9BdXRoIDIgdXNlcyBlaXRoZXIgaWQgdG9rZW4gb3IgYWNjZXNzIHRva2VuXG4gIGlkVG9rZW4/OiBzdHJpbmcgfCBudWxsO1xuICBhY2Nlc3NUb2tlbj86IHN0cmluZyB8IG51bGw7XG5cbiAgLy8gVGhlc2UgZmllbGRzIGFyZSB1c2VkIHdpdGggT0F1dGggMVxuICBvYXV0aFRva2VuPzogc3RyaW5nO1xuICBzZWNyZXQ/OiBzdHJpbmc7XG4gIG9hdXRoVG9rZW5TZWNyZXQ/OiBzdHJpbmc7XG5cbiAgLy8gTm9uY2UgaXMgb25seSBzZXQgaWYgcGVuZGluZ1Rva2VuIGlzIG5vdCBwcmVzZW50XG4gIG5vbmNlPzogc3RyaW5nO1xuICBwZW5kaW5nVG9rZW4/OiBzdHJpbmc7XG5cbiAgLy8gVXRpbGl0aWVzXG4gIHByb3ZpZGVySWQ6IHN0cmluZztcbiAgc2lnbkluTWV0aG9kOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgT0F1dGggY3JlZGVudGlhbHMgcmV0dXJuZWQgYnkgYW4ge0BsaW5rIE9BdXRoUHJvdmlkZXJ9LlxuICpcbiAqIEByZW1hcmtzXG4gKiBJbXBsZW1lbnRhdGlvbnMgc3BlY2lmeSB0aGUgZGV0YWlscyBhYm91dCBlYWNoIGF1dGggcHJvdmlkZXIncyBjcmVkZW50aWFsIHJlcXVpcmVtZW50cy5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBPQXV0aENyZWRlbnRpYWwgZXh0ZW5kcyBBdXRoQ3JlZGVudGlhbCB7XG4gIC8qKlxuICAgKiBUaGUgT0F1dGggSUQgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBjcmVkZW50aWFsIGlmIGl0IGJlbG9uZ3MgdG8gYW4gT0lEQyBwcm92aWRlcixcbiAgICogc3VjaCBhcyBgZ29vZ2xlLmNvbWAuXG4gICAqIEByZWFkb25seVxuICAgKi9cbiAgaWRUb2tlbj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBPQXV0aCBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBjcmVkZW50aWFsIGlmIGl0IGJlbG9uZ3MgdG8gYW5cbiAgICoge0BsaW5rIE9BdXRoUHJvdmlkZXJ9LCBzdWNoIGFzIGBmYWNlYm9vay5jb21gLCBgdHdpdHRlci5jb21gLCBldGMuXG4gICAqIEByZWFkb25seVxuICAgKi9cbiAgYWNjZXNzVG9rZW4/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgT0F1dGggYWNjZXNzIHRva2VuIHNlY3JldCBhc3NvY2lhdGVkIHdpdGggdGhlIGNyZWRlbnRpYWwgaWYgaXQgYmVsb25ncyB0byBhbiBPQXV0aCAxLjBcbiAgICogcHJvdmlkZXIsIHN1Y2ggYXMgYHR3aXR0ZXIuY29tYC5cbiAgICogQHJlYWRvbmx5XG4gICAqL1xuICBzZWNyZXQ/OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBub25jZT86IHN0cmluZztcbiAgcHJpdmF0ZSBwZW5kaW5nVG9rZW46IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgc3RhdGljIF9mcm9tUGFyYW1zKHBhcmFtczogT0F1dGhDcmVkZW50aWFsUGFyYW1zKTogT0F1dGhDcmVkZW50aWFsIHtcbiAgICBjb25zdCBjcmVkID0gbmV3IE9BdXRoQ3JlZGVudGlhbChwYXJhbXMucHJvdmlkZXJJZCwgcGFyYW1zLnNpZ25Jbk1ldGhvZCk7XG5cbiAgICBpZiAocGFyYW1zLmlkVG9rZW4gfHwgcGFyYW1zLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAvLyBPQXV0aCAyIGFuZCBlaXRoZXIgSUQgdG9rZW4gb3IgYWNjZXNzIHRva2VuLlxuICAgICAgaWYgKHBhcmFtcy5pZFRva2VuKSB7XG4gICAgICAgIGNyZWQuaWRUb2tlbiA9IHBhcmFtcy5pZFRva2VuO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyYW1zLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgIGNyZWQuYWNjZXNzVG9rZW4gPSBwYXJhbXMuYWNjZXNzVG9rZW47XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCBub25jZSBpZiBhdmFpbGFibGUgYW5kIG5vIHBlbmRpbmdUb2tlbiBpcyBwcmVzZW50LlxuICAgICAgaWYgKHBhcmFtcy5ub25jZSAmJiAhcGFyYW1zLnBlbmRpbmdUb2tlbikge1xuICAgICAgICBjcmVkLm5vbmNlID0gcGFyYW1zLm5vbmNlO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyYW1zLnBlbmRpbmdUb2tlbikge1xuICAgICAgICBjcmVkLnBlbmRpbmdUb2tlbiA9IHBhcmFtcy5wZW5kaW5nVG9rZW47XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwYXJhbXMub2F1dGhUb2tlbiAmJiBwYXJhbXMub2F1dGhUb2tlblNlY3JldCkge1xuICAgICAgLy8gT0F1dGggMSBhbmQgT0F1dGggdG9rZW4gd2l0aCB0b2tlbiBzZWNyZXRcbiAgICAgIGNyZWQuYWNjZXNzVG9rZW4gPSBwYXJhbXMub2F1dGhUb2tlbjtcbiAgICAgIGNyZWQuc2VjcmV0ID0gcGFyYW1zLm9hdXRoVG9rZW5TZWNyZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9mYWlsKEF1dGhFcnJvckNvZGUuQVJHVU1FTlRfRVJST1IpO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVkO1xuICB9XG5cbiAgLyoqIHtAaW5oZXJpdGRvYyBBdXRoQ3JlZGVudGlhbC50b0pTT059ICAqL1xuICB0b0pTT04oKTogb2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgaWRUb2tlbjogdGhpcy5pZFRva2VuLFxuICAgICAgYWNjZXNzVG9rZW46IHRoaXMuYWNjZXNzVG9rZW4sXG4gICAgICBzZWNyZXQ6IHRoaXMuc2VjcmV0LFxuICAgICAgbm9uY2U6IHRoaXMubm9uY2UsXG4gICAgICBwZW5kaW5nVG9rZW46IHRoaXMucGVuZGluZ1Rva2VuLFxuICAgICAgcHJvdmlkZXJJZDogdGhpcy5wcm92aWRlcklkLFxuICAgICAgc2lnbkluTWV0aG9kOiB0aGlzLnNpZ25Jbk1ldGhvZFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU3RhdGljIG1ldGhvZCB0byBkZXNlcmlhbGl6ZSBhIEpTT04gcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0IGludG8gYW5cbiAgICoge0BsaW5rICBBdXRoQ3JlZGVudGlhbH0uXG4gICAqXG4gICAqIEBwYXJhbSBqc29uIC0gSW5wdXQgY2FuIGJlIGVpdGhlciBPYmplY3Qgb3IgdGhlIHN0cmluZ2lmaWVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvYmplY3QuXG4gICAqIFdoZW4gc3RyaW5nIGlzIHByb3ZpZGVkLCBKU09OLnBhcnNlIHdvdWxkIGJlIGNhbGxlZCBmaXJzdC5cbiAgICpcbiAgICogQHJldHVybnMgSWYgdGhlIEpTT04gaW5wdXQgZG9lcyBub3QgcmVwcmVzZW50IGFuIHtAbGluayAgQXV0aENyZWRlbnRpYWx9LCBudWxsIGlzIHJldHVybmVkLlxuICAgKi9cbiAgc3RhdGljIGZyb21KU09OKGpzb246IHN0cmluZyB8IG9iamVjdCk6IE9BdXRoQ3JlZGVudGlhbCB8IG51bGwge1xuICAgIGNvbnN0IG9iaiA9IHR5cGVvZiBqc29uID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UoanNvbikgOiBqc29uO1xuICAgIGNvbnN0IHsgcHJvdmlkZXJJZCwgc2lnbkluTWV0aG9kLCAuLi5yZXN0IH06IE9BdXRoQ3JlZGVudGlhbFBhcmFtcyA9IG9iajtcbiAgICBpZiAoIXByb3ZpZGVySWQgfHwgIXNpZ25Jbk1ldGhvZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgY3JlZCA9IG5ldyBPQXV0aENyZWRlbnRpYWwocHJvdmlkZXJJZCwgc2lnbkluTWV0aG9kKTtcbiAgICBjcmVkLmlkVG9rZW4gPSByZXN0LmlkVG9rZW4gfHwgdW5kZWZpbmVkO1xuICAgIGNyZWQuYWNjZXNzVG9rZW4gPSByZXN0LmFjY2Vzc1Rva2VuIHx8IHVuZGVmaW5lZDtcbiAgICBjcmVkLnNlY3JldCA9IHJlc3Quc2VjcmV0O1xuICAgIGNyZWQubm9uY2UgPSByZXN0Lm5vbmNlO1xuICAgIGNyZWQucGVuZGluZ1Rva2VuID0gcmVzdC5wZW5kaW5nVG9rZW4gfHwgbnVsbDtcbiAgICByZXR1cm4gY3JlZDtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2dldElkVG9rZW5SZXNwb25zZShhdXRoOiBBdXRoSW50ZXJuYWwpOiBQcm9taXNlPElkVG9rZW5SZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLmJ1aWxkUmVxdWVzdCgpO1xuICAgIHJldHVybiBzaWduSW5XaXRoSWRwKGF1dGgsIHJlcXVlc3QpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfbGlua1RvSWRUb2tlbihcbiAgICBhdXRoOiBBdXRoSW50ZXJuYWwsXG4gICAgaWRUb2tlbjogc3RyaW5nXG4gICk6IFByb21pc2U8SWRUb2tlblJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuYnVpbGRSZXF1ZXN0KCk7XG4gICAgcmVxdWVzdC5pZFRva2VuID0gaWRUb2tlbjtcbiAgICByZXR1cm4gc2lnbkluV2l0aElkcChhdXRoLCByZXF1ZXN0KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2dldFJlYXV0aGVudGljYXRpb25SZXNvbHZlcihhdXRoOiBBdXRoSW50ZXJuYWwpOiBQcm9taXNlPElkVG9rZW5SZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLmJ1aWxkUmVxdWVzdCgpO1xuICAgIHJlcXVlc3QuYXV0b0NyZWF0ZSA9IGZhbHNlO1xuICAgIHJldHVybiBzaWduSW5XaXRoSWRwKGF1dGgsIHJlcXVlc3QpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFJlcXVlc3QoKTogU2lnbkluV2l0aElkcFJlcXVlc3Qge1xuICAgIGNvbnN0IHJlcXVlc3Q6IFNpZ25JbldpdGhJZHBSZXF1ZXN0ID0ge1xuICAgICAgcmVxdWVzdFVyaTogSURQX1JFUVVFU1RfVVJJLFxuICAgICAgcmV0dXJuU2VjdXJlVG9rZW46IHRydWVcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMucGVuZGluZ1Rva2VuKSB7XG4gICAgICByZXF1ZXN0LnBlbmRpbmdUb2tlbiA9IHRoaXMucGVuZGluZ1Rva2VuO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwb3N0Qm9keTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgICAgaWYgKHRoaXMuaWRUb2tlbikge1xuICAgICAgICBwb3N0Qm9keVsnaWRfdG9rZW4nXSA9IHRoaXMuaWRUb2tlbjtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgIHBvc3RCb2R5WydhY2Nlc3NfdG9rZW4nXSA9IHRoaXMuYWNjZXNzVG9rZW47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zZWNyZXQpIHtcbiAgICAgICAgcG9zdEJvZHlbJ29hdXRoX3Rva2VuX3NlY3JldCddID0gdGhpcy5zZWNyZXQ7XG4gICAgICB9XG5cbiAgICAgIHBvc3RCb2R5Wydwcm92aWRlcklkJ10gPSB0aGlzLnByb3ZpZGVySWQ7XG4gICAgICBpZiAodGhpcy5ub25jZSAmJiAhdGhpcy5wZW5kaW5nVG9rZW4pIHtcbiAgICAgICAgcG9zdEJvZHlbJ25vbmNlJ10gPSB0aGlzLm5vbmNlO1xuICAgICAgfVxuXG4gICAgICByZXF1ZXN0LnBvc3RCb2R5ID0gcXVlcnlzdHJpbmcocG9zdEJvZHkpO1xuICAgIH1cblxuICAgIHJldHVybiByZXF1ZXN0O1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgRW5kcG9pbnQsXG4gIEh0dHBNZXRob2QsXG4gIF9hZGRUaWRJZk5lY2Vzc2FyeSxcbiAgX21ha2VUYWdnZWRFcnJvcixcbiAgX3BlcmZvcm1BcGlSZXF1ZXN0LFxuICBfcGVyZm9ybVNpZ25JblJlcXVlc3Rcbn0gZnJvbSAnLi4vaW5kZXgnO1xuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSB9IGZyb20gJy4uLy4uL2NvcmUvZXJyb3JzJztcbmltcG9ydCB7IElkVG9rZW5SZXNwb25zZSB9IGZyb20gJy4uLy4uL21vZGVsL2lkX3Rva2VuJztcbmltcG9ydCB7IFNlcnZlckVycm9yLCBTZXJ2ZXJFcnJvck1hcCB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBBdXRoIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBTZW5kUGhvbmVWZXJpZmljYXRpb25Db2RlUmVxdWVzdCB7XG4gIHBob25lTnVtYmVyOiBzdHJpbmc7XG4gIHJlY2FwdGNoYVRva2VuOiBzdHJpbmc7XG4gIHRlbmFudElkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlbmRQaG9uZVZlcmlmaWNhdGlvbkNvZGVSZXNwb25zZSB7XG4gIHNlc3Npb25JbmZvOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZW5kUGhvbmVWZXJpZmljYXRpb25Db2RlKFxuICBhdXRoOiBBdXRoLFxuICByZXF1ZXN0OiBTZW5kUGhvbmVWZXJpZmljYXRpb25Db2RlUmVxdWVzdFxuKTogUHJvbWlzZTxTZW5kUGhvbmVWZXJpZmljYXRpb25Db2RlUmVzcG9uc2U+IHtcbiAgcmV0dXJuIF9wZXJmb3JtQXBpUmVxdWVzdDxcbiAgICBTZW5kUGhvbmVWZXJpZmljYXRpb25Db2RlUmVxdWVzdCxcbiAgICBTZW5kUGhvbmVWZXJpZmljYXRpb25Db2RlUmVzcG9uc2VcbiAgPihcbiAgICBhdXRoLFxuICAgIEh0dHBNZXRob2QuUE9TVCxcbiAgICBFbmRwb2ludC5TRU5EX1ZFUklGSUNBVElPTl9DT0RFLFxuICAgIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KVxuICApO1xufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25JbldpdGhQaG9uZU51bWJlclJlcXVlc3Qge1xuICB0ZW1wb3JhcnlQcm9vZj86IHN0cmluZztcbiAgcGhvbmVOdW1iZXI/OiBzdHJpbmc7XG4gIHNlc3Npb25JbmZvPzogc3RyaW5nO1xuICBjb2RlPzogc3RyaW5nO1xuICB0ZW5hbnRJZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaW5rV2l0aFBob25lTnVtYmVyUmVxdWVzdFxuICBleHRlbmRzIFNpZ25JbldpdGhQaG9uZU51bWJlclJlcXVlc3Qge1xuICBpZFRva2VuOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbkluV2l0aFBob25lTnVtYmVyUmVzcG9uc2UgZXh0ZW5kcyBJZFRva2VuUmVzcG9uc2Uge1xuICB0ZW1wb3JhcnlQcm9vZj86IHN0cmluZztcbiAgcGhvbmVOdW1iZXI/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaWduSW5XaXRoUGhvbmVOdW1iZXIoXG4gIGF1dGg6IEF1dGgsXG4gIHJlcXVlc3Q6IFNpZ25JbldpdGhQaG9uZU51bWJlclJlcXVlc3Rcbik6IFByb21pc2U8U2lnbkluV2l0aFBob25lTnVtYmVyUmVzcG9uc2U+IHtcbiAgcmV0dXJuIF9wZXJmb3JtU2lnbkluUmVxdWVzdDxcbiAgICBTaWduSW5XaXRoUGhvbmVOdW1iZXJSZXF1ZXN0LFxuICAgIFNpZ25JbldpdGhQaG9uZU51bWJlclJlc3BvbnNlXG4gID4oXG4gICAgYXV0aCxcbiAgICBIdHRwTWV0aG9kLlBPU1QsXG4gICAgRW5kcG9pbnQuU0lHTl9JTl9XSVRIX1BIT05FX05VTUJFUixcbiAgICBfYWRkVGlkSWZOZWNlc3NhcnkoYXV0aCwgcmVxdWVzdClcbiAgKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpbmtXaXRoUGhvbmVOdW1iZXIoXG4gIGF1dGg6IEF1dGgsXG4gIHJlcXVlc3Q6IExpbmtXaXRoUGhvbmVOdW1iZXJSZXF1ZXN0XG4pOiBQcm9taXNlPFNpZ25JbldpdGhQaG9uZU51bWJlclJlc3BvbnNlPiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgX3BlcmZvcm1TaWduSW5SZXF1ZXN0PFxuICAgIExpbmtXaXRoUGhvbmVOdW1iZXJSZXF1ZXN0LFxuICAgIFNpZ25JbldpdGhQaG9uZU51bWJlclJlc3BvbnNlXG4gID4oXG4gICAgYXV0aCxcbiAgICBIdHRwTWV0aG9kLlBPU1QsXG4gICAgRW5kcG9pbnQuU0lHTl9JTl9XSVRIX1BIT05FX05VTUJFUixcbiAgICBfYWRkVGlkSWZOZWNlc3NhcnkoYXV0aCwgcmVxdWVzdClcbiAgKTtcbiAgaWYgKHJlc3BvbnNlLnRlbXBvcmFyeVByb29mKSB7XG4gICAgdGhyb3cgX21ha2VUYWdnZWRFcnJvcihhdXRoLCBBdXRoRXJyb3JDb2RlLk5FRURfQ09ORklSTUFUSU9OLCByZXNwb25zZSk7XG4gIH1cbiAgcmV0dXJuIHJlc3BvbnNlO1xufVxuXG5pbnRlcmZhY2UgVmVyaWZ5UGhvbmVOdW1iZXJGb3JFeGlzdGluZ1JlcXVlc3RcbiAgZXh0ZW5kcyBTaWduSW5XaXRoUGhvbmVOdW1iZXJSZXF1ZXN0IHtcbiAgb3BlcmF0aW9uOiAnUkVBVVRIJztcbn1cblxuY29uc3QgVkVSSUZZX1BIT05FX05VTUJFUl9GT1JfRVhJU1RJTkdfRVJST1JfTUFQXzogUGFydGlhbDxcbiAgU2VydmVyRXJyb3JNYXA8U2VydmVyRXJyb3I+XG4+ID0ge1xuICBbU2VydmVyRXJyb3IuVVNFUl9OT1RfRk9VTkRdOiBBdXRoRXJyb3JDb2RlLlVTRVJfREVMRVRFRFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZlcmlmeVBob25lTnVtYmVyRm9yRXhpc3RpbmcoXG4gIGF1dGg6IEF1dGgsXG4gIHJlcXVlc3Q6IFNpZ25JbldpdGhQaG9uZU51bWJlclJlcXVlc3Rcbik6IFByb21pc2U8U2lnbkluV2l0aFBob25lTnVtYmVyUmVzcG9uc2U+IHtcbiAgY29uc3QgYXBpUmVxdWVzdDogVmVyaWZ5UGhvbmVOdW1iZXJGb3JFeGlzdGluZ1JlcXVlc3QgPSB7XG4gICAgLi4ucmVxdWVzdCxcbiAgICBvcGVyYXRpb246ICdSRUFVVEgnXG4gIH07XG4gIHJldHVybiBfcGVyZm9ybVNpZ25JblJlcXVlc3Q8XG4gICAgVmVyaWZ5UGhvbmVOdW1iZXJGb3JFeGlzdGluZ1JlcXVlc3QsXG4gICAgU2lnbkluV2l0aFBob25lTnVtYmVyUmVzcG9uc2VcbiAgPihcbiAgICBhdXRoLFxuICAgIEh0dHBNZXRob2QuUE9TVCxcbiAgICBFbmRwb2ludC5TSUdOX0lOX1dJVEhfUEhPTkVfTlVNQkVSLFxuICAgIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCBhcGlSZXF1ZXN0KSxcbiAgICBWRVJJRllfUEhPTkVfTlVNQkVSX0ZPUl9FWElTVElOR19FUlJPUl9NQVBfXG4gICk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgUHJvdmlkZXJJZCwgU2lnbkluTWV0aG9kIH0gZnJvbSAnLi4vLi4vbW9kZWwvZW51bXMnO1xuXG5pbXBvcnQgeyBQaG9uZU9yT2F1dGhUb2tlblJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vYXBpL2F1dGhlbnRpY2F0aW9uL21mYSc7XG5pbXBvcnQge1xuICBsaW5rV2l0aFBob25lTnVtYmVyLFxuICBzaWduSW5XaXRoUGhvbmVOdW1iZXIsXG4gIFNpZ25JbldpdGhQaG9uZU51bWJlclJlcXVlc3QsXG4gIHZlcmlmeVBob25lTnVtYmVyRm9yRXhpc3Rpbmdcbn0gZnJvbSAnLi4vLi4vYXBpL2F1dGhlbnRpY2F0aW9uL3Ntcyc7XG5pbXBvcnQgeyBBdXRoSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9hdXRoJztcbmltcG9ydCB7IElkVG9rZW5SZXNwb25zZSB9IGZyb20gJy4uLy4uL21vZGVsL2lkX3Rva2VuJztcbmltcG9ydCB7IEF1dGhDcmVkZW50aWFsIH0gZnJvbSAnLi9hdXRoX2NyZWRlbnRpYWwnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBob25lQXV0aENyZWRlbnRpYWxQYXJhbWV0ZXJzIHtcbiAgdmVyaWZpY2F0aW9uSWQ/OiBzdHJpbmc7XG4gIHZlcmlmaWNhdGlvbkNvZGU/OiBzdHJpbmc7XG4gIHBob25lTnVtYmVyPzogc3RyaW5nO1xuICB0ZW1wb3JhcnlQcm9vZj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBjcmVkZW50aWFscyByZXR1cm5lZCBieSB7QGxpbmsgUGhvbmVBdXRoUHJvdmlkZXJ9LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIFBob25lQXV0aENyZWRlbnRpYWwgZXh0ZW5kcyBBdXRoQ3JlZGVudGlhbCB7XG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwYXJhbXM6IFBob25lQXV0aENyZWRlbnRpYWxQYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIoUHJvdmlkZXJJZC5QSE9ORSwgU2lnbkluTWV0aG9kLlBIT05FKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgc3RhdGljIF9mcm9tVmVyaWZpY2F0aW9uKFxuICAgIHZlcmlmaWNhdGlvbklkOiBzdHJpbmcsXG4gICAgdmVyaWZpY2F0aW9uQ29kZTogc3RyaW5nXG4gICk6IFBob25lQXV0aENyZWRlbnRpYWwge1xuICAgIHJldHVybiBuZXcgUGhvbmVBdXRoQ3JlZGVudGlhbCh7IHZlcmlmaWNhdGlvbklkLCB2ZXJpZmljYXRpb25Db2RlIH0pO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzdGF0aWMgX2Zyb21Ub2tlblJlc3BvbnNlKFxuICAgIHBob25lTnVtYmVyOiBzdHJpbmcsXG4gICAgdGVtcG9yYXJ5UHJvb2Y6IHN0cmluZ1xuICApOiBQaG9uZUF1dGhDcmVkZW50aWFsIHtcbiAgICByZXR1cm4gbmV3IFBob25lQXV0aENyZWRlbnRpYWwoeyBwaG9uZU51bWJlciwgdGVtcG9yYXJ5UHJvb2YgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9nZXRJZFRva2VuUmVzcG9uc2UoYXV0aDogQXV0aEludGVybmFsKTogUHJvbWlzZTxQaG9uZU9yT2F1dGhUb2tlblJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHNpZ25JbldpdGhQaG9uZU51bWJlcihhdXRoLCB0aGlzLl9tYWtlVmVyaWZpY2F0aW9uUmVxdWVzdCgpKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2xpbmtUb0lkVG9rZW4oXG4gICAgYXV0aDogQXV0aEludGVybmFsLFxuICAgIGlkVG9rZW46IHN0cmluZ1xuICApOiBQcm9taXNlPElkVG9rZW5SZXNwb25zZT4ge1xuICAgIHJldHVybiBsaW5rV2l0aFBob25lTnVtYmVyKGF1dGgsIHtcbiAgICAgIGlkVG9rZW4sXG4gICAgICAuLi50aGlzLl9tYWtlVmVyaWZpY2F0aW9uUmVxdWVzdCgpXG4gICAgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9nZXRSZWF1dGhlbnRpY2F0aW9uUmVzb2x2ZXIoYXV0aDogQXV0aEludGVybmFsKTogUHJvbWlzZTxJZFRva2VuUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdmVyaWZ5UGhvbmVOdW1iZXJGb3JFeGlzdGluZyhhdXRoLCB0aGlzLl9tYWtlVmVyaWZpY2F0aW9uUmVxdWVzdCgpKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX21ha2VWZXJpZmljYXRpb25SZXF1ZXN0KCk6IFNpZ25JbldpdGhQaG9uZU51bWJlclJlcXVlc3Qge1xuICAgIGNvbnN0IHsgdGVtcG9yYXJ5UHJvb2YsIHBob25lTnVtYmVyLCB2ZXJpZmljYXRpb25JZCwgdmVyaWZpY2F0aW9uQ29kZSB9ID1cbiAgICAgIHRoaXMucGFyYW1zO1xuICAgIGlmICh0ZW1wb3JhcnlQcm9vZiAmJiBwaG9uZU51bWJlcikge1xuICAgICAgcmV0dXJuIHsgdGVtcG9yYXJ5UHJvb2YsIHBob25lTnVtYmVyIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNlc3Npb25JbmZvOiB2ZXJpZmljYXRpb25JZCxcbiAgICAgIGNvZGU6IHZlcmlmaWNhdGlvbkNvZGVcbiAgICB9O1xuICB9XG5cbiAgLyoqIHtAaW5oZXJpdGRvYyBBdXRoQ3JlZGVudGlhbC50b0pTT059ICovXG4gIHRvSlNPTigpOiBvYmplY3Qge1xuICAgIGNvbnN0IG9iajogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIHByb3ZpZGVySWQ6IHRoaXMucHJvdmlkZXJJZFxuICAgIH07XG4gICAgaWYgKHRoaXMucGFyYW1zLnBob25lTnVtYmVyKSB7XG4gICAgICBvYmoucGhvbmVOdW1iZXIgPSB0aGlzLnBhcmFtcy5waG9uZU51bWJlcjtcbiAgICB9XG4gICAgaWYgKHRoaXMucGFyYW1zLnRlbXBvcmFyeVByb29mKSB7XG4gICAgICBvYmoudGVtcG9yYXJ5UHJvb2YgPSB0aGlzLnBhcmFtcy50ZW1wb3JhcnlQcm9vZjtcbiAgICB9XG4gICAgaWYgKHRoaXMucGFyYW1zLnZlcmlmaWNhdGlvbkNvZGUpIHtcbiAgICAgIG9iai52ZXJpZmljYXRpb25Db2RlID0gdGhpcy5wYXJhbXMudmVyaWZpY2F0aW9uQ29kZTtcbiAgICB9XG4gICAgaWYgKHRoaXMucGFyYW1zLnZlcmlmaWNhdGlvbklkKSB7XG4gICAgICBvYmoudmVyaWZpY2F0aW9uSWQgPSB0aGlzLnBhcmFtcy52ZXJpZmljYXRpb25JZDtcbiAgICB9XG5cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgLyoqIEdlbmVyYXRlcyBhIHBob25lIGNyZWRlbnRpYWwgYmFzZWQgb24gYSBwbGFpbiBvYmplY3Qgb3IgYSBKU09OIHN0cmluZy4gKi9cbiAgc3RhdGljIGZyb21KU09OKGpzb246IG9iamVjdCB8IHN0cmluZyk6IFBob25lQXV0aENyZWRlbnRpYWwgfCBudWxsIHtcbiAgICBpZiAodHlwZW9mIGpzb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICBqc29uID0gSlNPTi5wYXJzZShqc29uKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHZlcmlmaWNhdGlvbklkLCB2ZXJpZmljYXRpb25Db2RlLCBwaG9uZU51bWJlciwgdGVtcG9yYXJ5UHJvb2YgfSA9XG4gICAgICBqc29uIGFzIHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG4gICAgaWYgKFxuICAgICAgIXZlcmlmaWNhdGlvbkNvZGUgJiZcbiAgICAgICF2ZXJpZmljYXRpb25JZCAmJlxuICAgICAgIXBob25lTnVtYmVyICYmXG4gICAgICAhdGVtcG9yYXJ5UHJvb2ZcbiAgICApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgUGhvbmVBdXRoQ3JlZGVudGlhbCh7XG4gICAgICB2ZXJpZmljYXRpb25JZCxcbiAgICAgIHZlcmlmaWNhdGlvbkNvZGUsXG4gICAgICBwaG9uZU51bWJlcixcbiAgICAgIHRlbXBvcmFyeVByb29mXG4gICAgfSk7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBleHRyYWN0UXVlcnlzdHJpbmcsIHF1ZXJ5c3RyaW5nRGVjb2RlIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuaW1wb3J0IHsgQWN0aW9uQ29kZU9wZXJhdGlvbiB9IGZyb20gJy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5pbXBvcnQgeyBBdXRoRXJyb3JDb2RlIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgX2Fzc2VydCB9IGZyb20gJy4vdXRpbC9hc3NlcnQnO1xuXG4vKipcbiAqIEVudW1zIGZvciBmaWVsZHMgaW4gVVJMIHF1ZXJ5IHN0cmluZy5cbiAqXG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5jb25zdCBlbnVtIFF1ZXJ5RmllbGQge1xuICBBUElfS0VZID0gJ2FwaUtleScsXG4gIENPREUgPSAnb29iQ29kZScsXG4gIENPTlRJTlVFX1VSTCA9ICdjb250aW51ZVVybCcsXG4gIExBTkdVQUdFX0NPREUgPSAnbGFuZ3VhZ2VDb2RlJyxcbiAgTU9ERSA9ICdtb2RlJyxcbiAgVEVOQU5UX0lEID0gJ3RlbmFudElkJ1xufVxuXG4vKipcbiAqIE1hcHMgdGhlIG1vZGUgc3RyaW5nIGluIGFjdGlvbiBjb2RlIFVSTCB0byBBY3Rpb24gQ29kZSBJbmZvIG9wZXJhdGlvbi5cbiAqXG4gKiBAcGFyYW0gbW9kZVxuICovXG5mdW5jdGlvbiBwYXJzZU1vZGUobW9kZTogc3RyaW5nIHwgbnVsbCk6IEFjdGlvbkNvZGVPcGVyYXRpb24gfCBudWxsIHtcbiAgc3dpdGNoIChtb2RlKSB7XG4gICAgY2FzZSAncmVjb3ZlckVtYWlsJzpcbiAgICAgIHJldHVybiBBY3Rpb25Db2RlT3BlcmF0aW9uLlJFQ09WRVJfRU1BSUw7XG4gICAgY2FzZSAncmVzZXRQYXNzd29yZCc6XG4gICAgICByZXR1cm4gQWN0aW9uQ29kZU9wZXJhdGlvbi5QQVNTV09SRF9SRVNFVDtcbiAgICBjYXNlICdzaWduSW4nOlxuICAgICAgcmV0dXJuIEFjdGlvbkNvZGVPcGVyYXRpb24uRU1BSUxfU0lHTklOO1xuICAgIGNhc2UgJ3ZlcmlmeUVtYWlsJzpcbiAgICAgIHJldHVybiBBY3Rpb25Db2RlT3BlcmF0aW9uLlZFUklGWV9FTUFJTDtcbiAgICBjYXNlICd2ZXJpZnlBbmRDaGFuZ2VFbWFpbCc6XG4gICAgICByZXR1cm4gQWN0aW9uQ29kZU9wZXJhdGlvbi5WRVJJRllfQU5EX0NIQU5HRV9FTUFJTDtcbiAgICBjYXNlICdyZXZlcnRTZWNvbmRGYWN0b3JBZGRpdGlvbic6XG4gICAgICByZXR1cm4gQWN0aW9uQ29kZU9wZXJhdGlvbi5SRVZFUlRfU0VDT05EX0ZBQ1RPUl9BRERJVElPTjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gcGFyc2UgRkRMIGxpbmtzXG4gKlxuICogQHBhcmFtIHVybFxuICovXG5mdW5jdGlvbiBwYXJzZURlZXBMaW5rKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbGluayA9IHF1ZXJ5c3RyaW5nRGVjb2RlKGV4dHJhY3RRdWVyeXN0cmluZyh1cmwpKVsnbGluayddO1xuXG4gIC8vIERvdWJsZSBsaW5rIGNhc2UgKGF1dG9tYXRpYyByZWRpcmVjdCkuXG4gIGNvbnN0IGRvdWJsZURlZXBMaW5rID0gbGlua1xuICAgID8gcXVlcnlzdHJpbmdEZWNvZGUoZXh0cmFjdFF1ZXJ5c3RyaW5nKGxpbmspKVsnZGVlcF9saW5rX2lkJ11cbiAgICA6IG51bGw7XG4gIC8vIGlPUyBjdXN0b20gc2NoZW1lIGxpbmtzLlxuICBjb25zdCBpT1NEZWVwTGluayA9IHF1ZXJ5c3RyaW5nRGVjb2RlKGV4dHJhY3RRdWVyeXN0cmluZyh1cmwpKVtcbiAgICAnZGVlcF9saW5rX2lkJ1xuICBdO1xuICBjb25zdCBpT1NEb3VibGVEZWVwTGluayA9IGlPU0RlZXBMaW5rXG4gICAgPyBxdWVyeXN0cmluZ0RlY29kZShleHRyYWN0UXVlcnlzdHJpbmcoaU9TRGVlcExpbmspKVsnbGluayddXG4gICAgOiBudWxsO1xuICByZXR1cm4gaU9TRG91YmxlRGVlcExpbmsgfHwgaU9TRGVlcExpbmsgfHwgZG91YmxlRGVlcExpbmsgfHwgbGluayB8fCB1cmw7XG59XG5cbi8qKlxuICogQSB1dGlsaXR5IGNsYXNzIHRvIHBhcnNlIGVtYWlsIGFjdGlvbiBVUkxzIHN1Y2ggYXMgcGFzc3dvcmQgcmVzZXQsIGVtYWlsIHZlcmlmaWNhdGlvbixcbiAqIGVtYWlsIGxpbmsgc2lnbiBpbiwgZXRjLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIEFjdGlvbkNvZGVVUkwge1xuICAvKipcbiAgICogVGhlIEFQSSBrZXkgb2YgdGhlIGVtYWlsIGFjdGlvbiBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBpS2V5OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgYWN0aW9uIGNvZGUgb2YgdGhlIGVtYWlsIGFjdGlvbiBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgY29kZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGNvbnRpbnVlIFVSTCBvZiB0aGUgZW1haWwgYWN0aW9uIGxpbmsuIE51bGwgaWYgbm90IHByb3ZpZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGludWVVcmw6IHN0cmluZyB8IG51bGw7XG4gIC8qKlxuICAgKiBUaGUgbGFuZ3VhZ2UgY29kZSBvZiB0aGUgZW1haWwgYWN0aW9uIGxpbmsuIE51bGwgaWYgbm90IHByb3ZpZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgbGFuZ3VhZ2VDb2RlOiBzdHJpbmcgfCBudWxsO1xuICAvKipcbiAgICogVGhlIGFjdGlvbiBwZXJmb3JtZWQgYnkgdGhlIGVtYWlsIGFjdGlvbiBsaW5rLiBJdCByZXR1cm5zIGZyb20gb25lIG9mIHRoZSB0eXBlcyBmcm9tXG4gICAqIHtAbGluayBBY3Rpb25Db2RlSW5mb31cbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRlbmFudCBJRCBvZiB0aGUgZW1haWwgYWN0aW9uIGxpbmsuIE51bGwgaWYgdGhlIGVtYWlsIGFjdGlvbiBpcyBmcm9tIHRoZSBwYXJlbnQgcHJvamVjdC5cbiAgICovXG4gIHJlYWRvbmx5IHRlbmFudElkOiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gYWN0aW9uTGluayAtIFRoZSBsaW5rIGZyb20gd2hpY2ggdG8gZXh0cmFjdCB0aGUgVVJMLlxuICAgKiBAcmV0dXJucyBUaGUge0BsaW5rIEFjdGlvbkNvZGVVUkx9IG9iamVjdCwgb3IgbnVsbCBpZiB0aGUgbGluayBpcyBpbnZhbGlkLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGNvbnN0cnVjdG9yKGFjdGlvbkxpbms6IHN0cmluZykge1xuICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IHF1ZXJ5c3RyaW5nRGVjb2RlKGV4dHJhY3RRdWVyeXN0cmluZyhhY3Rpb25MaW5rKSk7XG4gICAgY29uc3QgYXBpS2V5ID0gc2VhcmNoUGFyYW1zW1F1ZXJ5RmllbGQuQVBJX0tFWV0gPz8gbnVsbDtcbiAgICBjb25zdCBjb2RlID0gc2VhcmNoUGFyYW1zW1F1ZXJ5RmllbGQuQ09ERV0gPz8gbnVsbDtcbiAgICBjb25zdCBvcGVyYXRpb24gPSBwYXJzZU1vZGUoc2VhcmNoUGFyYW1zW1F1ZXJ5RmllbGQuTU9ERV0gPz8gbnVsbCk7XG4gICAgLy8gVmFsaWRhdGUgQVBJIGtleSwgY29kZSBhbmQgbW9kZS5cbiAgICBfYXNzZXJ0KGFwaUtleSAmJiBjb2RlICYmIG9wZXJhdGlvbiwgQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUik7XG4gICAgdGhpcy5hcGlLZXkgPSBhcGlLZXk7XG4gICAgdGhpcy5vcGVyYXRpb24gPSBvcGVyYXRpb247XG4gICAgdGhpcy5jb2RlID0gY29kZTtcbiAgICB0aGlzLmNvbnRpbnVlVXJsID0gc2VhcmNoUGFyYW1zW1F1ZXJ5RmllbGQuQ09OVElOVUVfVVJMXSA/PyBudWxsO1xuICAgIHRoaXMubGFuZ3VhZ2VDb2RlID0gc2VhcmNoUGFyYW1zW1F1ZXJ5RmllbGQuTEFOR1VBR0VfQ09ERV0gPz8gbnVsbDtcbiAgICB0aGlzLnRlbmFudElkID0gc2VhcmNoUGFyYW1zW1F1ZXJ5RmllbGQuVEVOQU5UX0lEXSA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyB0aGUgZW1haWwgYWN0aW9uIGxpbmsgc3RyaW5nIGFuZCByZXR1cm5zIGFuIHtAbGluayBBY3Rpb25Db2RlVVJMfSBpZiB0aGUgbGluayBpcyB2YWxpZCxcbiAgICogb3RoZXJ3aXNlIHJldHVybnMgbnVsbC5cbiAgICpcbiAgICogQHBhcmFtIGxpbmsgIC0gVGhlIGVtYWlsIGFjdGlvbiBsaW5rIHN0cmluZy5cbiAgICogQHJldHVybnMgVGhlIHtAbGluayBBY3Rpb25Db2RlVVJMfSBvYmplY3QsIG9yIG51bGwgaWYgdGhlIGxpbmsgaXMgaW52YWxpZC5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgc3RhdGljIHBhcnNlTGluayhsaW5rOiBzdHJpbmcpOiBBY3Rpb25Db2RlVVJMIHwgbnVsbCB7XG4gICAgY29uc3QgYWN0aW9uTGluayA9IHBhcnNlRGVlcExpbmsobGluayk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBuZXcgQWN0aW9uQ29kZVVSTChhY3Rpb25MaW5rKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFBhcnNlcyB0aGUgZW1haWwgYWN0aW9uIGxpbmsgc3RyaW5nIGFuZCByZXR1cm5zIGFuIHtAbGluayBBY3Rpb25Db2RlVVJMfSBpZlxuICogdGhlIGxpbmsgaXMgdmFsaWQsIG90aGVyd2lzZSByZXR1cm5zIG51bGwuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VBY3Rpb25Db2RlVVJMKGxpbms6IHN0cmluZyk6IEFjdGlvbkNvZGVVUkwgfCBudWxsIHtcbiAgcmV0dXJuIEFjdGlvbkNvZGVVUkwucGFyc2VMaW5rKGxpbmspO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IFByb3ZpZGVySWQsIFNpZ25Jbk1ldGhvZCB9IGZyb20gJy4uLy4uL21vZGVsL2VudW1zJztcbmltcG9ydCB7IEF1dGhQcm92aWRlciB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbmltcG9ydCB7IEFjdGlvbkNvZGVVUkwgfSBmcm9tICcuLi9hY3Rpb25fY29kZV91cmwnO1xuaW1wb3J0IHsgRW1haWxBdXRoQ3JlZGVudGlhbCB9IGZyb20gJy4uL2NyZWRlbnRpYWxzL2VtYWlsJztcbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgX2Fzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0JztcblxuLyoqXG4gKiBQcm92aWRlciBmb3IgZ2VuZXJhdGluZyB7QGxpbmsgRW1haWxBdXRoQ3JlZGVudGlhbH0uXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgRW1haWxBdXRoUHJvdmlkZXIgaW1wbGVtZW50cyBBdXRoUHJvdmlkZXIge1xuICAvKipcbiAgICogQWx3YXlzIHNldCB0byB7QGxpbmsgUHJvdmlkZXJJZH0uUEFTU1dPUkQsIGV2ZW4gZm9yIGVtYWlsIGxpbmsuXG4gICAqL1xuICBzdGF0aWMgcmVhZG9ubHkgUFJPVklERVJfSUQ6ICdwYXNzd29yZCcgPSBQcm92aWRlcklkLlBBU1NXT1JEO1xuICAvKipcbiAgICogQWx3YXlzIHNldCB0byB7QGxpbmsgU2lnbkluTWV0aG9kfS5FTUFJTF9QQVNTV09SRC5cbiAgICovXG4gIHN0YXRpYyByZWFkb25seSBFTUFJTF9QQVNTV09SRF9TSUdOX0lOX01FVEhPRDogJ3Bhc3N3b3JkJyA9XG4gICAgU2lnbkluTWV0aG9kLkVNQUlMX1BBU1NXT1JEO1xuICAvKipcbiAgICogQWx3YXlzIHNldCB0byB7QGxpbmsgU2lnbkluTWV0aG9kfS5FTUFJTF9MSU5LLlxuICAgKi9cbiAgc3RhdGljIHJlYWRvbmx5IEVNQUlMX0xJTktfU0lHTl9JTl9NRVRIT0Q6ICdlbWFpbExpbmsnID1cbiAgICBTaWduSW5NZXRob2QuRU1BSUxfTElOSztcbiAgLyoqXG4gICAqIEFsd2F5cyBzZXQgdG8ge0BsaW5rIFByb3ZpZGVySWR9LlBBU1NXT1JELCBldmVuIGZvciBlbWFpbCBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvdmlkZXJJZCA9IEVtYWlsQXV0aFByb3ZpZGVyLlBST1ZJREVSX0lEO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGFuIHtAbGluayBBdXRoQ3JlZGVudGlhbH0gdXNpbmcgYW4gZW1haWwgYW5kIHBhc3N3b3JkLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBqYXZhc2NyaXB0XG4gICAqIGNvbnN0IGF1dGhDcmVkZW50aWFsID0gRW1haWxBdXRoUHJvdmlkZXIuY3JlZGVudGlhbChlbWFpbCwgcGFzc3dvcmQpO1xuICAgKiBjb25zdCB1c2VyQ3JlZGVudGlhbCA9IGF3YWl0IHNpZ25JbldpdGhDcmVkZW50aWFsKGF1dGgsIGF1dGhDcmVkZW50aWFsKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYGphdmFzY3JpcHRcbiAgICogY29uc3QgdXNlckNyZWRlbnRpYWwgPSBhd2FpdCBzaWduSW5XaXRoRW1haWxBbmRQYXNzd29yZChhdXRoLCBlbWFpbCwgcGFzc3dvcmQpO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIGVtYWlsIC0gRW1haWwgYWRkcmVzcy5cbiAgICogQHBhcmFtIHBhc3N3b3JkIC0gVXNlciBhY2NvdW50IHBhc3N3b3JkLlxuICAgKiBAcmV0dXJucyBUaGUgYXV0aCBwcm92aWRlciBjcmVkZW50aWFsLlxuICAgKi9cbiAgc3RhdGljIGNyZWRlbnRpYWwoZW1haWw6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZyk6IEVtYWlsQXV0aENyZWRlbnRpYWwge1xuICAgIHJldHVybiBFbWFpbEF1dGhDcmVkZW50aWFsLl9mcm9tRW1haWxBbmRQYXNzd29yZChlbWFpbCwgcGFzc3dvcmQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgYW4ge0BsaW5rIEF1dGhDcmVkZW50aWFsfSB1c2luZyBhbiBlbWFpbCBhbmQgYW4gZW1haWwgbGluayBhZnRlciBhIHNpZ24gaW4gd2l0aFxuICAgKiBlbWFpbCBsaW5rIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgamF2YXNjcmlwdFxuICAgKiBjb25zdCBhdXRoQ3JlZGVudGlhbCA9IEVtYWlsQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWxXaXRoTGluayhhdXRoLCBlbWFpbCwgZW1haWxMaW5rKTtcbiAgICogY29uc3QgdXNlckNyZWRlbnRpYWwgPSBhd2FpdCBzaWduSW5XaXRoQ3JlZGVudGlhbChhdXRoLCBhdXRoQ3JlZGVudGlhbCk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBqYXZhc2NyaXB0XG4gICAqIGF3YWl0IHNlbmRTaWduSW5MaW5rVG9FbWFpbChhdXRoLCBlbWFpbCk7XG4gICAqIC8vIE9idGFpbiBlbWFpbExpbmsgZnJvbSB1c2VyLlxuICAgKiBjb25zdCB1c2VyQ3JlZGVudGlhbCA9IGF3YWl0IHNpZ25JbldpdGhFbWFpbExpbmsoYXV0aCwgZW1haWwsIGVtYWlsTGluayk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UgdXNlZCB0byB2ZXJpZnkgdGhlIGxpbmsuXG4gICAqIEBwYXJhbSBlbWFpbCAtIEVtYWlsIGFkZHJlc3MuXG4gICAqIEBwYXJhbSBlbWFpbExpbmsgLSBTaWduLWluIGVtYWlsIGxpbmsuXG4gICAqIEByZXR1cm5zIC0gVGhlIGF1dGggcHJvdmlkZXIgY3JlZGVudGlhbC5cbiAgICovXG4gIHN0YXRpYyBjcmVkZW50aWFsV2l0aExpbmsoXG4gICAgZW1haWw6IHN0cmluZyxcbiAgICBlbWFpbExpbms6IHN0cmluZ1xuICApOiBFbWFpbEF1dGhDcmVkZW50aWFsIHtcbiAgICBjb25zdCBhY3Rpb25Db2RlVXJsID0gQWN0aW9uQ29kZVVSTC5wYXJzZUxpbmsoZW1haWxMaW5rKTtcbiAgICBfYXNzZXJ0KGFjdGlvbkNvZGVVcmwsIEF1dGhFcnJvckNvZGUuQVJHVU1FTlRfRVJST1IpO1xuXG4gICAgcmV0dXJuIEVtYWlsQXV0aENyZWRlbnRpYWwuX2Zyb21FbWFpbEFuZENvZGUoXG4gICAgICBlbWFpbCxcbiAgICAgIGFjdGlvbkNvZGVVcmwuY29kZSxcbiAgICAgIGFjdGlvbkNvZGVVcmwudGVuYW50SWRcbiAgICApO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgQXV0aFByb3ZpZGVyIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcblxuLyoqXG4gKiBNYXAgb2YgT0F1dGggQ3VzdG9tIFBhcmFtZXRlcnMuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdHlwZSBDdXN0b21QYXJhbWV0ZXJzID0gUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuLyoqXG4gKiBUaGUgYmFzZSBjbGFzcyBmb3IgYWxsIEZlZGVyYXRlZCBwcm92aWRlcnMgKE9BdXRoIChpbmNsdWRpbmcgT0lEQyksIFNBTUwpLlxuICpcbiAqIFRoaXMgY2xhc3MgaXMgbm90IG1lYW50IHRvIGJlIGluc3RhbnRpYXRlZCBkaXJlY3RseS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGZWRlcmF0ZWRBdXRoUHJvdmlkZXIgaW1wbGVtZW50cyBBdXRoUHJvdmlkZXIge1xuICAvKiogQGludGVybmFsICovXG4gIGRlZmF1bHRMYW5ndWFnZUNvZGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogQGludGVybmFsICovXG4gIHByaXZhdGUgY3VzdG9tUGFyYW1ldGVyczogQ3VzdG9tUGFyYW1ldGVycyA9IHt9O1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgZ2VuZXJpYyBPQXV0aCBwcm92aWRlcnMuXG4gICAqXG4gICAqIEBwYXJhbSBwcm92aWRlcklkIC0gUHJvdmlkZXIgZm9yIHdoaWNoIGNyZWRlbnRpYWxzIHNob3VsZCBiZSBnZW5lcmF0ZWQuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihyZWFkb25seSBwcm92aWRlcklkOiBzdHJpbmcpIHt9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgbGFuZ3VhZ2UgZ29kZS5cbiAgICpcbiAgICogQHBhcmFtIGxhbmd1YWdlQ29kZSAtIGxhbmd1YWdlIGNvZGVcbiAgICovXG4gIHNldERlZmF1bHRMYW5ndWFnZShsYW5ndWFnZUNvZGU6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLmRlZmF1bHRMYW5ndWFnZUNvZGUgPSBsYW5ndWFnZUNvZGU7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgT0F1dGggY3VzdG9tIHBhcmFtZXRlcnMgdG8gcGFzcyBpbiBhbiBPQXV0aCByZXF1ZXN0IGZvciBwb3B1cCBhbmQgcmVkaXJlY3Qgc2lnbi1pblxuICAgKiBvcGVyYXRpb25zLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBGb3IgYSBkZXRhaWxlZCBsaXN0LCBjaGVjayB0aGUgcmVzZXJ2ZWQgcmVxdWlyZWQgT0F1dGggMi4wIHBhcmFtZXRlcnMgc3VjaCBhcyBgY2xpZW50X2lkYCxcbiAgICogYHJlZGlyZWN0X3VyaWAsIGBzY29wZWAsIGByZXNwb25zZV90eXBlYCwgYW5kIGBzdGF0ZWAgYXJlIG5vdCBhbGxvd2VkIGFuZCB3aWxsIGJlIGlnbm9yZWQuXG4gICAqXG4gICAqIEBwYXJhbSBjdXN0b21PQXV0aFBhcmFtZXRlcnMgLSBUaGUgY3VzdG9tIE9BdXRoIHBhcmFtZXRlcnMgdG8gcGFzcyBpbiB0aGUgT0F1dGggcmVxdWVzdC5cbiAgICovXG4gIHNldEN1c3RvbVBhcmFtZXRlcnMoY3VzdG9tT0F1dGhQYXJhbWV0ZXJzOiBDdXN0b21QYXJhbWV0ZXJzKTogQXV0aFByb3ZpZGVyIHtcbiAgICB0aGlzLmN1c3RvbVBhcmFtZXRlcnMgPSBjdXN0b21PQXV0aFBhcmFtZXRlcnM7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgbGlzdCBvZiB7QGxpbmsgQ3VzdG9tUGFyYW1ldGVyc30uXG4gICAqL1xuICBnZXRDdXN0b21QYXJhbWV0ZXJzKCk6IEN1c3RvbVBhcmFtZXRlcnMge1xuICAgIHJldHVybiB0aGlzLmN1c3RvbVBhcmFtZXRlcnM7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBBdXRoUHJvdmlkZXIsIFVzZXJDcmVkZW50aWFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcblxuaW1wb3J0IHsgX2Fzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0JztcbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG5pbXBvcnQgeyBPQXV0aENyZWRlbnRpYWwsIE9BdXRoQ3JlZGVudGlhbFBhcmFtcyB9IGZyb20gJy4uL2NyZWRlbnRpYWxzL29hdXRoJztcbmltcG9ydCB7IFVzZXJDcmVkZW50aWFsSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC91c2VyJztcbmltcG9ydCB7IEZpcmViYXNlRXJyb3IgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5pbXBvcnQgeyBUYWdnZWRXaXRoVG9rZW5SZXNwb25zZSB9IGZyb20gJy4uLy4uL21vZGVsL2lkX3Rva2VuJztcbmltcG9ydCB7IFNpZ25JbldpdGhJZHBSZXNwb25zZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsJztcbmltcG9ydCB7IEZlZGVyYXRlZEF1dGhQcm92aWRlciB9IGZyb20gJy4vZmVkZXJhdGVkJztcblxuLyoqXG4gKiBEZWZpbmVzIHRoZSBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgYW4ge0BsaW5rIE9BdXRoQ3JlZGVudGlhbH0uXG4gKlxuICogQHJlbWFya3NcbiAqIEZvciBJRCB0b2tlbnMgd2l0aCBub25jZSBjbGFpbSwgdGhlIHJhdyBub25jZSBoYXMgdG8gYWxzbyBiZSBwcm92aWRlZC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT0F1dGhDcmVkZW50aWFsT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgT0F1dGggSUQgdG9rZW4gdXNlZCB0byBpbml0aWFsaXplIHRoZSB7QGxpbmsgT0F1dGhDcmVkZW50aWFsfS5cbiAgICovXG4gIGlkVG9rZW4/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgT0F1dGggYWNjZXNzIHRva2VuIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUge0BsaW5rIE9BdXRoQ3JlZGVudGlhbH0uXG4gICAqL1xuICBhY2Nlc3NUb2tlbj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSByYXcgbm9uY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBJRCB0b2tlbi5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogSXQgaXMgcmVxdWlyZWQgd2hlbiBhbiBJRCB0b2tlbiB3aXRoIGEgbm9uY2UgZmllbGQgaXMgcHJvdmlkZWQuIFRoZSBTSEEtMjU2IGhhc2ggb2YgdGhlXG4gICAqIHJhdyBub25jZSBtdXN0IG1hdGNoIHRoZSBub25jZSBmaWVsZCBpbiB0aGUgSUQgdG9rZW4uXG4gICAqL1xuICByYXdOb25jZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb21tb24gY29kZSB0byBhbGwgT0F1dGggcHJvdmlkZXJzLiBUaGlzIGlzIHNlcGFyYXRlIGZyb20gdGhlXG4gKiB7QGxpbmsgT0F1dGhQcm92aWRlcn0gc28gdGhhdCBjaGlsZCBwcm92aWRlcnMgKGxpa2VcbiAqIHtAbGluayBHb29nbGVBdXRoUHJvdmlkZXJ9KSBkb24ndCBpbmhlcml0IHRoZSBgY3JlZGVudGlhbGAgaW5zdGFuY2UgbWV0aG9kLlxuICogSW5zdGVhZCwgdGhleSByZWx5IG9uIGEgc3RhdGljIGBjcmVkZW50aWFsYCBtZXRob2QuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlT0F1dGhQcm92aWRlclxuICBleHRlbmRzIEZlZGVyYXRlZEF1dGhQcm92aWRlclxuICBpbXBsZW1lbnRzIEF1dGhQcm92aWRlclxue1xuICAvKiogQGludGVybmFsICovXG4gIHByaXZhdGUgc2NvcGVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBBZGQgYW4gT0F1dGggc2NvcGUgdG8gdGhlIGNyZWRlbnRpYWwuXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSAtIFByb3ZpZGVyIE9BdXRoIHNjb3BlIHRvIGFkZC5cbiAgICovXG4gIGFkZFNjb3BlKHNjb3BlOiBzdHJpbmcpOiBBdXRoUHJvdmlkZXIge1xuICAgIC8vIElmIG5vdCBhbHJlYWR5IGFkZGVkLCBhZGQgc2NvcGUgdG8gbGlzdC5cbiAgICBpZiAoIXRoaXMuc2NvcGVzLmluY2x1ZGVzKHNjb3BlKSkge1xuICAgICAgdGhpcy5zY29wZXMucHVzaChzY29wZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIHRoZSBjdXJyZW50IGxpc3Qgb2YgT0F1dGggc2NvcGVzLlxuICAgKi9cbiAgZ2V0U2NvcGVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuc2NvcGVzXTtcbiAgfVxufVxuXG4vKipcbiAqIFByb3ZpZGVyIGZvciBnZW5lcmF0aW5nIGdlbmVyaWMge0BsaW5rIE9BdXRoQ3JlZGVudGlhbH0uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGphdmFzY3JpcHRcbiAqIC8vIFNpZ24gaW4gdXNpbmcgYSByZWRpcmVjdC5cbiAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IE9BdXRoUHJvdmlkZXIoJ2dvb2dsZS5jb20nKTtcbiAqIC8vIFN0YXJ0IGEgc2lnbiBpbiBwcm9jZXNzIGZvciBhbiB1bmF1dGhlbnRpY2F0ZWQgdXNlci5cbiAqIHByb3ZpZGVyLmFkZFNjb3BlKCdwcm9maWxlJyk7XG4gKiBwcm92aWRlci5hZGRTY29wZSgnZW1haWwnKTtcbiAqIGF3YWl0IHNpZ25JbldpdGhSZWRpcmVjdChhdXRoLCBwcm92aWRlcik7XG4gKiAvLyBUaGlzIHdpbGwgdHJpZ2dlciBhIGZ1bGwgcGFnZSByZWRpcmVjdCBhd2F5IGZyb20geW91ciBhcHBcbiAqXG4gKiAvLyBBZnRlciByZXR1cm5pbmcgZnJvbSB0aGUgcmVkaXJlY3Qgd2hlbiB5b3VyIGFwcCBpbml0aWFsaXplcyB5b3UgY2FuIG9idGFpbiB0aGUgcmVzdWx0XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRSZWRpcmVjdFJlc3VsdChhdXRoKTtcbiAqIGlmIChyZXN1bHQpIHtcbiAqICAgLy8gVGhpcyBpcyB0aGUgc2lnbmVkLWluIHVzZXJcbiAqICAgY29uc3QgdXNlciA9IHJlc3VsdC51c2VyO1xuICogICAvLyBUaGlzIGdpdmVzIHlvdSBhIE9BdXRoIEFjY2VzcyBUb2tlbiBmb3IgdGhlIHByb3ZpZGVyLlxuICogICBjb25zdCBjcmVkZW50aWFsID0gcHJvdmlkZXIuY3JlZGVudGlhbEZyb21SZXN1bHQoYXV0aCwgcmVzdWx0KTtcbiAqICAgY29uc3QgdG9rZW4gPSBjcmVkZW50aWFsLmFjY2Vzc1Rva2VuO1xuICogfVxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGphdmFzY3JpcHRcbiAqIC8vIFNpZ24gaW4gdXNpbmcgYSBwb3B1cC5cbiAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IE9BdXRoUHJvdmlkZXIoJ2dvb2dsZS5jb20nKTtcbiAqIHByb3ZpZGVyLmFkZFNjb3BlKCdwcm9maWxlJyk7XG4gKiBwcm92aWRlci5hZGRTY29wZSgnZW1haWwnKTtcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpZ25JbldpdGhQb3B1cChhdXRoLCBwcm92aWRlcik7XG4gKlxuICogLy8gVGhlIHNpZ25lZC1pbiB1c2VyIGluZm8uXG4gKiBjb25zdCB1c2VyID0gcmVzdWx0LnVzZXI7XG4gKiAvLyBUaGlzIGdpdmVzIHlvdSBhIE9BdXRoIEFjY2VzcyBUb2tlbiBmb3IgdGhlIHByb3ZpZGVyLlxuICogY29uc3QgY3JlZGVudGlhbCA9IHByb3ZpZGVyLmNyZWRlbnRpYWxGcm9tUmVzdWx0KGF1dGgsIHJlc3VsdCk7XG4gKiBjb25zdCB0b2tlbiA9IGNyZWRlbnRpYWwuYWNjZXNzVG9rZW47XG4gKiBgYGBcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIE9BdXRoUHJvdmlkZXIgZXh0ZW5kcyBCYXNlT0F1dGhQcm92aWRlciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIHtAbGluayBPQXV0aENyZWRlbnRpYWx9IGZyb20gYSBKU09OIHN0cmluZyBvciBhIHBsYWluIG9iamVjdC5cbiAgICogQHBhcmFtIGpzb24gLSBBIHBsYWluIG9iamVjdCBvciBhIEpTT04gc3RyaW5nXG4gICAqL1xuICBzdGF0aWMgY3JlZGVudGlhbEZyb21KU09OKGpzb246IG9iamVjdCB8IHN0cmluZyk6IE9BdXRoQ3JlZGVudGlhbCB7XG4gICAgY29uc3Qgb2JqID0gdHlwZW9mIGpzb24gPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZShqc29uKSA6IGpzb247XG4gICAgX2Fzc2VydChcbiAgICAgICdwcm92aWRlcklkJyBpbiBvYmogJiYgJ3NpZ25Jbk1ldGhvZCcgaW4gb2JqLFxuICAgICAgQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUlxuICAgICk7XG4gICAgcmV0dXJuIE9BdXRoQ3JlZGVudGlhbC5fZnJvbVBhcmFtcyhvYmopO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB7QGxpbmsgT0F1dGhDcmVkZW50aWFsfSBmcm9tIGEgZ2VuZXJpYyBPQXV0aCBwcm92aWRlcidzIGFjY2VzcyB0b2tlbiBvciBJRCB0b2tlbi5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogVGhlIHJhdyBub25jZSBpcyByZXF1aXJlZCB3aGVuIGFuIElEIHRva2VuIHdpdGggYSBub25jZSBmaWVsZCBpcyBwcm92aWRlZC4gVGhlIFNIQS0yNTYgaGFzaCBvZlxuICAgKiB0aGUgcmF3IG5vbmNlIG11c3QgbWF0Y2ggdGhlIG5vbmNlIGZpZWxkIGluIHRoZSBJRCB0b2tlbi5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgamF2YXNjcmlwdFxuICAgKiAvLyBgZ29vZ2xlVXNlcmAgZnJvbSB0aGUgb25zdWNjZXNzIEdvb2dsZSBTaWduIEluIGNhbGxiYWNrLlxuICAgKiAvLyBJbml0aWFsaXplIGEgZ2VuZXJhdGUgT0F1dGggcHJvdmlkZXIgd2l0aCBhIGBnb29nbGUuY29tYCBwcm92aWRlcklkLlxuICAgKiBjb25zdCBwcm92aWRlciA9IG5ldyBPQXV0aFByb3ZpZGVyKCdnb29nbGUuY29tJyk7XG4gICAqIGNvbnN0IGNyZWRlbnRpYWwgPSBwcm92aWRlci5jcmVkZW50aWFsKHtcbiAgICogICBpZFRva2VuOiBnb29nbGVVc2VyLmdldEF1dGhSZXNwb25zZSgpLmlkX3Rva2VuLFxuICAgKiB9KTtcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc2lnbkluV2l0aENyZWRlbnRpYWwoY3JlZGVudGlhbCk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gRWl0aGVyIHRoZSBvcHRpb25zIG9iamVjdCBjb250YWluaW5nIHRoZSBJRCB0b2tlbiwgYWNjZXNzIHRva2VuIGFuZCByYXcgbm9uY2VcbiAgICogb3IgdGhlIElEIHRva2VuIHN0cmluZy5cbiAgICovXG4gIGNyZWRlbnRpYWwocGFyYW1zOiBPQXV0aENyZWRlbnRpYWxPcHRpb25zKTogT0F1dGhDcmVkZW50aWFsIHtcbiAgICByZXR1cm4gdGhpcy5fY3JlZGVudGlhbCh7IC4uLnBhcmFtcywgbm9uY2U6IHBhcmFtcy5yYXdOb25jZSB9KTtcbiAgfVxuXG4gIC8qKiBBbiBpbnRlcm5hbCBjcmVkZW50aWFsIG1ldGhvZCB0aGF0IGFjY2VwdHMgbW9yZSBwZXJtaXNzaXZlIG9wdGlvbnMgKi9cbiAgcHJpdmF0ZSBfY3JlZGVudGlhbChcbiAgICBwYXJhbXM6IE9taXQ8T0F1dGhDcmVkZW50aWFsUGFyYW1zLCAnc2lnbkluTWV0aG9kJyB8ICdwcm92aWRlcklkJz5cbiAgKTogT0F1dGhDcmVkZW50aWFsIHtcbiAgICBfYXNzZXJ0KHBhcmFtcy5pZFRva2VuIHx8IHBhcmFtcy5hY2Nlc3NUb2tlbiwgQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUik7XG4gICAgLy8gRm9yIE9BdXRoQ3JlZGVudGlhbCwgc2lnbiBpbiBtZXRob2QgaXMgc2FtZSBhcyBwcm92aWRlcklkLlxuICAgIHJldHVybiBPQXV0aENyZWRlbnRpYWwuX2Zyb21QYXJhbXMoe1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgcHJvdmlkZXJJZDogdGhpcy5wcm92aWRlcklkLFxuICAgICAgc2lnbkluTWV0aG9kOiB0aGlzLnByb3ZpZGVySWRcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIHRvIGV4dHJhY3QgdGhlIHVuZGVybHlpbmcge0BsaW5rIE9BdXRoQ3JlZGVudGlhbH0gZnJvbSBhIHtAbGluayBVc2VyQ3JlZGVudGlhbH0uXG4gICAqXG4gICAqIEBwYXJhbSB1c2VyQ3JlZGVudGlhbCAtIFRoZSB1c2VyIGNyZWRlbnRpYWwuXG4gICAqL1xuICBzdGF0aWMgY3JlZGVudGlhbEZyb21SZXN1bHQoXG4gICAgdXNlckNyZWRlbnRpYWw6IFVzZXJDcmVkZW50aWFsXG4gICk6IE9BdXRoQ3JlZGVudGlhbCB8IG51bGwge1xuICAgIHJldHVybiBPQXV0aFByb3ZpZGVyLm9hdXRoQ3JlZGVudGlhbEZyb21UYWdnZWRPYmplY3QoXG4gICAgICB1c2VyQ3JlZGVudGlhbCBhcyBVc2VyQ3JlZGVudGlhbEludGVybmFsXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogVXNlZCB0byBleHRyYWN0IHRoZSB1bmRlcmx5aW5nIHtAbGluayBPQXV0aENyZWRlbnRpYWx9IGZyb20gYSB7QGxpbmsgQXV0aEVycm9yfSB3aGljaCB3YXNcbiAgICogdGhyb3duIGR1cmluZyBhIHNpZ24taW4sIGxpbmssIG9yIHJlYXV0aGVudGljYXRlIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHVzZXJDcmVkZW50aWFsIC0gVGhlIHVzZXIgY3JlZGVudGlhbC5cbiAgICovXG4gIHN0YXRpYyBjcmVkZW50aWFsRnJvbUVycm9yKGVycm9yOiBGaXJlYmFzZUVycm9yKTogT0F1dGhDcmVkZW50aWFsIHwgbnVsbCB7XG4gICAgcmV0dXJuIE9BdXRoUHJvdmlkZXIub2F1dGhDcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdChcbiAgICAgIChlcnJvci5jdXN0b21EYXRhIHx8IHt9KSBhcyBUYWdnZWRXaXRoVG9rZW5SZXNwb25zZVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBvYXV0aENyZWRlbnRpYWxGcm9tVGFnZ2VkT2JqZWN0KHtcbiAgICBfdG9rZW5SZXNwb25zZTogdG9rZW5SZXNwb25zZVxuICB9OiBUYWdnZWRXaXRoVG9rZW5SZXNwb25zZSk6IE9BdXRoQ3JlZGVudGlhbCB8IG51bGwge1xuICAgIGlmICghdG9rZW5SZXNwb25zZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgb2F1dGhJZFRva2VuLFxuICAgICAgb2F1dGhBY2Nlc3NUb2tlbixcbiAgICAgIG9hdXRoVG9rZW5TZWNyZXQsXG4gICAgICBwZW5kaW5nVG9rZW4sXG4gICAgICBub25jZSxcbiAgICAgIHByb3ZpZGVySWRcbiAgICB9ID0gdG9rZW5SZXNwb25zZSBhcyBTaWduSW5XaXRoSWRwUmVzcG9uc2U7XG4gICAgaWYgKFxuICAgICAgIW9hdXRoQWNjZXNzVG9rZW4gJiZcbiAgICAgICFvYXV0aFRva2VuU2VjcmV0ICYmXG4gICAgICAhb2F1dGhJZFRva2VuICYmXG4gICAgICAhcGVuZGluZ1Rva2VuXG4gICAgKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoIXByb3ZpZGVySWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbmV3IE9BdXRoUHJvdmlkZXIocHJvdmlkZXJJZCkuX2NyZWRlbnRpYWwoe1xuICAgICAgICBpZFRva2VuOiBvYXV0aElkVG9rZW4sXG4gICAgICAgIGFjY2Vzc1Rva2VuOiBvYXV0aEFjY2Vzc1Rva2VuLFxuICAgICAgICBub25jZSxcbiAgICAgICAgcGVuZGluZ1Rva2VuXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBVc2VyQ3JlZGVudGlhbCB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5pbXBvcnQgeyBGaXJlYmFzZUVycm9yIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuXG5pbXBvcnQgeyBUYWdnZWRXaXRoVG9rZW5SZXNwb25zZSB9IGZyb20gJy4uLy4uL21vZGVsL2lkX3Rva2VuJztcbmltcG9ydCB7IFVzZXJDcmVkZW50aWFsSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC91c2VyJztcbmltcG9ydCB7IE9BdXRoQ3JlZGVudGlhbCB9IGZyb20gJy4uL2NyZWRlbnRpYWxzL29hdXRoJztcbmltcG9ydCB7IEJhc2VPQXV0aFByb3ZpZGVyIH0gZnJvbSAnLi9vYXV0aCc7XG5pbXBvcnQgeyBQcm92aWRlcklkLCBTaWduSW5NZXRob2QgfSBmcm9tICcuLi8uLi9tb2RlbC9lbnVtcyc7XG5cbi8qKlxuICogUHJvdmlkZXIgZm9yIGdlbmVyYXRpbmcgYW4ge0BsaW5rIE9BdXRoQ3JlZGVudGlhbH0gZm9yIHtAbGluayBQcm92aWRlcklkfS5GQUNFQk9PSy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgamF2YXNjcmlwdFxuICogLy8gU2lnbiBpbiB1c2luZyBhIHJlZGlyZWN0LlxuICogY29uc3QgcHJvdmlkZXIgPSBuZXcgRmFjZWJvb2tBdXRoUHJvdmlkZXIoKTtcbiAqIC8vIFN0YXJ0IGEgc2lnbiBpbiBwcm9jZXNzIGZvciBhbiB1bmF1dGhlbnRpY2F0ZWQgdXNlci5cbiAqIHByb3ZpZGVyLmFkZFNjb3BlKCd1c2VyX2JpcnRoZGF5Jyk7XG4gKiBhd2FpdCBzaWduSW5XaXRoUmVkaXJlY3QoYXV0aCwgcHJvdmlkZXIpO1xuICogLy8gVGhpcyB3aWxsIHRyaWdnZXIgYSBmdWxsIHBhZ2UgcmVkaXJlY3QgYXdheSBmcm9tIHlvdXIgYXBwXG4gKlxuICogLy8gQWZ0ZXIgcmV0dXJuaW5nIGZyb20gdGhlIHJlZGlyZWN0IHdoZW4geW91ciBhcHAgaW5pdGlhbGl6ZXMgeW91IGNhbiBvYnRhaW4gdGhlIHJlc3VsdFxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0UmVkaXJlY3RSZXN1bHQoYXV0aCk7XG4gKiBpZiAocmVzdWx0KSB7XG4gKiAgIC8vIFRoaXMgaXMgdGhlIHNpZ25lZC1pbiB1c2VyXG4gKiAgIGNvbnN0IHVzZXIgPSByZXN1bHQudXNlcjtcbiAqICAgLy8gVGhpcyBnaXZlcyB5b3UgYSBGYWNlYm9vayBBY2Nlc3MgVG9rZW4uXG4gKiAgIGNvbnN0IGNyZWRlbnRpYWwgPSBGYWNlYm9va0F1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVJlc3VsdChyZXN1bHQpO1xuICogICBjb25zdCB0b2tlbiA9IGNyZWRlbnRpYWwuYWNjZXNzVG9rZW47XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgamF2YXNjcmlwdFxuICogLy8gU2lnbiBpbiB1c2luZyBhIHBvcHVwLlxuICogY29uc3QgcHJvdmlkZXIgPSBuZXcgRmFjZWJvb2tBdXRoUHJvdmlkZXIoKTtcbiAqIHByb3ZpZGVyLmFkZFNjb3BlKCd1c2VyX2JpcnRoZGF5Jyk7XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBzaWduSW5XaXRoUG9wdXAoYXV0aCwgcHJvdmlkZXIpO1xuICpcbiAqIC8vIFRoZSBzaWduZWQtaW4gdXNlciBpbmZvLlxuICogY29uc3QgdXNlciA9IHJlc3VsdC51c2VyO1xuICogLy8gVGhpcyBnaXZlcyB5b3UgYSBGYWNlYm9vayBBY2Nlc3MgVG9rZW4uXG4gKiBjb25zdCBjcmVkZW50aWFsID0gRmFjZWJvb2tBdXRoUHJvdmlkZXIuY3JlZGVudGlhbEZyb21SZXN1bHQocmVzdWx0KTtcbiAqIGNvbnN0IHRva2VuID0gY3JlZGVudGlhbC5hY2Nlc3NUb2tlbjtcbiAqIGBgYFxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIEZhY2Vib29rQXV0aFByb3ZpZGVyIGV4dGVuZHMgQmFzZU9BdXRoUHJvdmlkZXIge1xuICAvKiogQWx3YXlzIHNldCB0byB7QGxpbmsgU2lnbkluTWV0aG9kfS5GQUNFQk9PSy4gKi9cbiAgc3RhdGljIHJlYWRvbmx5IEZBQ0VCT09LX1NJR05fSU5fTUVUSE9EOiAnZmFjZWJvb2suY29tJyA9XG4gICAgU2lnbkluTWV0aG9kLkZBQ0VCT09LO1xuICAvKiogQWx3YXlzIHNldCB0byB7QGxpbmsgUHJvdmlkZXJJZH0uRkFDRUJPT0suICovXG4gIHN0YXRpYyByZWFkb25seSBQUk9WSURFUl9JRDogJ2ZhY2Vib29rLmNvbScgPSBQcm92aWRlcklkLkZBQ0VCT09LO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFByb3ZpZGVySWQuRkFDRUJPT0spO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjcmVkZW50aWFsIGZvciBGYWNlYm9vay5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgamF2YXNjcmlwdFxuICAgKiAvLyBgZXZlbnRgIGZyb20gdGhlIEZhY2Vib29rIGF1dGguYXV0aFJlc3BvbnNlQ2hhbmdlIGNhbGxiYWNrLlxuICAgKiBjb25zdCBjcmVkZW50aWFsID0gRmFjZWJvb2tBdXRoUHJvdmlkZXIuY3JlZGVudGlhbChldmVudC5hdXRoUmVzcG9uc2UuYWNjZXNzVG9rZW4pO1xuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBzaWduSW5XaXRoQ3JlZGVudGlhbChjcmVkZW50aWFsKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBhY2Nlc3NUb2tlbiAtIEZhY2Vib29rIGFjY2VzcyB0b2tlbi5cbiAgICovXG4gIHN0YXRpYyBjcmVkZW50aWFsKGFjY2Vzc1Rva2VuOiBzdHJpbmcpOiBPQXV0aENyZWRlbnRpYWwge1xuICAgIHJldHVybiBPQXV0aENyZWRlbnRpYWwuX2Zyb21QYXJhbXMoe1xuICAgICAgcHJvdmlkZXJJZDogRmFjZWJvb2tBdXRoUHJvdmlkZXIuUFJPVklERVJfSUQsXG4gICAgICBzaWduSW5NZXRob2Q6IEZhY2Vib29rQXV0aFByb3ZpZGVyLkZBQ0VCT09LX1NJR05fSU5fTUVUSE9ELFxuICAgICAgYWNjZXNzVG9rZW5cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIHRvIGV4dHJhY3QgdGhlIHVuZGVybHlpbmcge0BsaW5rIE9BdXRoQ3JlZGVudGlhbH0gZnJvbSBhIHtAbGluayBVc2VyQ3JlZGVudGlhbH0uXG4gICAqXG4gICAqIEBwYXJhbSB1c2VyQ3JlZGVudGlhbCAtIFRoZSB1c2VyIGNyZWRlbnRpYWwuXG4gICAqL1xuICBzdGF0aWMgY3JlZGVudGlhbEZyb21SZXN1bHQoXG4gICAgdXNlckNyZWRlbnRpYWw6IFVzZXJDcmVkZW50aWFsXG4gICk6IE9BdXRoQ3JlZGVudGlhbCB8IG51bGwge1xuICAgIHJldHVybiBGYWNlYm9va0F1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdChcbiAgICAgIHVzZXJDcmVkZW50aWFsIGFzIFVzZXJDcmVkZW50aWFsSW50ZXJuYWxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gZXh0cmFjdCB0aGUgdW5kZXJseWluZyB7QGxpbmsgT0F1dGhDcmVkZW50aWFsfSBmcm9tIGEge0BsaW5rIEF1dGhFcnJvcn0gd2hpY2ggd2FzXG4gICAqIHRocm93biBkdXJpbmcgYSBzaWduLWluLCBsaW5rLCBvciByZWF1dGhlbnRpY2F0ZSBvcGVyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB1c2VyQ3JlZGVudGlhbCAtIFRoZSB1c2VyIGNyZWRlbnRpYWwuXG4gICAqL1xuICBzdGF0aWMgY3JlZGVudGlhbEZyb21FcnJvcihlcnJvcjogRmlyZWJhc2VFcnJvcik6IE9BdXRoQ3JlZGVudGlhbCB8IG51bGwge1xuICAgIHJldHVybiBGYWNlYm9va0F1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdChcbiAgICAgIChlcnJvci5jdXN0b21EYXRhIHx8IHt9KSBhcyBUYWdnZWRXaXRoVG9rZW5SZXNwb25zZVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdCh7XG4gICAgX3Rva2VuUmVzcG9uc2U6IHRva2VuUmVzcG9uc2VcbiAgfTogVGFnZ2VkV2l0aFRva2VuUmVzcG9uc2UpOiBPQXV0aENyZWRlbnRpYWwgfCBudWxsIHtcbiAgICBpZiAoIXRva2VuUmVzcG9uc2UgfHwgISgnb2F1dGhBY2Nlc3NUb2tlbicgaW4gdG9rZW5SZXNwb25zZSkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICghdG9rZW5SZXNwb25zZS5vYXV0aEFjY2Vzc1Rva2VuKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEZhY2Vib29rQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWwodG9rZW5SZXNwb25zZS5vYXV0aEFjY2Vzc1Rva2VuKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IFVzZXJDcmVkZW50aWFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcbmltcG9ydCB7IEZpcmViYXNlRXJyb3IgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5cbmltcG9ydCB7IFNpZ25JbldpdGhJZHBSZXNwb25zZSB9IGZyb20gJy4uLy4uL2FwaS9hdXRoZW50aWNhdGlvbi9pZHAnO1xuaW1wb3J0IHsgVGFnZ2VkV2l0aFRva2VuUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9tb2RlbC9pZF90b2tlbic7XG5pbXBvcnQgeyBVc2VyQ3JlZGVudGlhbEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvdXNlcic7XG5pbXBvcnQgeyBPQXV0aENyZWRlbnRpYWwgfSBmcm9tICcuLi9jcmVkZW50aWFscy9vYXV0aCc7XG5pbXBvcnQgeyBCYXNlT0F1dGhQcm92aWRlciB9IGZyb20gJy4vb2F1dGgnO1xuaW1wb3J0IHsgUHJvdmlkZXJJZCwgU2lnbkluTWV0aG9kIH0gZnJvbSAnLi4vLi4vbW9kZWwvZW51bXMnO1xuXG4vKipcbiAqIFByb3ZpZGVyIGZvciBnZW5lcmF0aW5nIGFuIGFuIHtAbGluayBPQXV0aENyZWRlbnRpYWx9IGZvciB7QGxpbmsgUHJvdmlkZXJJZH0uR09PR0xFLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiAvLyBTaWduIGluIHVzaW5nIGEgcmVkaXJlY3QuXG4gKiBjb25zdCBwcm92aWRlciA9IG5ldyBHb29nbGVBdXRoUHJvdmlkZXIoKTtcbiAqIC8vIFN0YXJ0IGEgc2lnbiBpbiBwcm9jZXNzIGZvciBhbiB1bmF1dGhlbnRpY2F0ZWQgdXNlci5cbiAqIHByb3ZpZGVyLmFkZFNjb3BlKCdwcm9maWxlJyk7XG4gKiBwcm92aWRlci5hZGRTY29wZSgnZW1haWwnKTtcbiAqIGF3YWl0IHNpZ25JbldpdGhSZWRpcmVjdChhdXRoLCBwcm92aWRlcik7XG4gKiAvLyBUaGlzIHdpbGwgdHJpZ2dlciBhIGZ1bGwgcGFnZSByZWRpcmVjdCBhd2F5IGZyb20geW91ciBhcHBcbiAqXG4gKiAvLyBBZnRlciByZXR1cm5pbmcgZnJvbSB0aGUgcmVkaXJlY3Qgd2hlbiB5b3VyIGFwcCBpbml0aWFsaXplcyB5b3UgY2FuIG9idGFpbiB0aGUgcmVzdWx0XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRSZWRpcmVjdFJlc3VsdChhdXRoKTtcbiAqIGlmIChyZXN1bHQpIHtcbiAqICAgLy8gVGhpcyBpcyB0aGUgc2lnbmVkLWluIHVzZXJcbiAqICAgY29uc3QgdXNlciA9IHJlc3VsdC51c2VyO1xuICogICAvLyBUaGlzIGdpdmVzIHlvdSBhIEdvb2dsZSBBY2Nlc3MgVG9rZW4uXG4gKiAgIGNvbnN0IGNyZWRlbnRpYWwgPSBHb29nbGVBdXRoUHJvdmlkZXIuY3JlZGVudGlhbEZyb21SZXN1bHQocmVzdWx0KTtcbiAqICAgY29uc3QgdG9rZW4gPSBjcmVkZW50aWFsLmFjY2Vzc1Rva2VuO1xuICogfVxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGphdmFzY3JpcHRcbiAqIC8vIFNpZ24gaW4gdXNpbmcgYSBwb3B1cC5cbiAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IEdvb2dsZUF1dGhQcm92aWRlcigpO1xuICogcHJvdmlkZXIuYWRkU2NvcGUoJ3Byb2ZpbGUnKTtcbiAqIHByb3ZpZGVyLmFkZFNjb3BlKCdlbWFpbCcpO1xuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc2lnbkluV2l0aFBvcHVwKGF1dGgsIHByb3ZpZGVyKTtcbiAqXG4gKiAvLyBUaGUgc2lnbmVkLWluIHVzZXIgaW5mby5cbiAqIGNvbnN0IHVzZXIgPSByZXN1bHQudXNlcjtcbiAqIC8vIFRoaXMgZ2l2ZXMgeW91IGEgR29vZ2xlIEFjY2VzcyBUb2tlbi5cbiAqIGNvbnN0IGNyZWRlbnRpYWwgPSBHb29nbGVBdXRoUHJvdmlkZXIuY3JlZGVudGlhbEZyb21SZXN1bHQocmVzdWx0KTtcbiAqIGNvbnN0IHRva2VuID0gY3JlZGVudGlhbC5hY2Nlc3NUb2tlbjtcbiAqIGBgYFxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIEdvb2dsZUF1dGhQcm92aWRlciBleHRlbmRzIEJhc2VPQXV0aFByb3ZpZGVyIHtcbiAgLyoqIEFsd2F5cyBzZXQgdG8ge0BsaW5rIFNpZ25Jbk1ldGhvZH0uR09PR0xFLiAqL1xuICBzdGF0aWMgcmVhZG9ubHkgR09PR0xFX1NJR05fSU5fTUVUSE9EOiAnZ29vZ2xlLmNvbScgPSBTaWduSW5NZXRob2QuR09PR0xFO1xuICAvKiogQWx3YXlzIHNldCB0byB7QGxpbmsgUHJvdmlkZXJJZH0uR09PR0xFLiAqL1xuICBzdGF0aWMgcmVhZG9ubHkgUFJPVklERVJfSUQ6ICdnb29nbGUuY29tJyA9IFByb3ZpZGVySWQuR09PR0xFO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFByb3ZpZGVySWQuR09PR0xFKTtcbiAgICB0aGlzLmFkZFNjb3BlKCdwcm9maWxlJyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGNyZWRlbnRpYWwgZm9yIEdvb2dsZS4gQXQgbGVhc3Qgb25lIG9mIElEIHRva2VuIGFuZCBhY2Nlc3MgdG9rZW4gaXMgcmVxdWlyZWQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYGphdmFzY3JpcHRcbiAgICogLy8gXFxgZ29vZ2xlVXNlclxcYCBmcm9tIHRoZSBvbnN1Y2Nlc3MgR29vZ2xlIFNpZ24gSW4gY2FsbGJhY2suXG4gICAqIGNvbnN0IGNyZWRlbnRpYWwgPSBHb29nbGVBdXRoUHJvdmlkZXIuY3JlZGVudGlhbChnb29nbGVVc2VyLmdldEF1dGhSZXNwb25zZSgpLmlkX3Rva2VuKTtcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc2lnbkluV2l0aENyZWRlbnRpYWwoY3JlZGVudGlhbCk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gaWRUb2tlbiAtIEdvb2dsZSBJRCB0b2tlbi5cbiAgICogQHBhcmFtIGFjY2Vzc1Rva2VuIC0gR29vZ2xlIGFjY2VzcyB0b2tlbi5cbiAgICovXG4gIHN0YXRpYyBjcmVkZW50aWFsKFxuICAgIGlkVG9rZW4/OiBzdHJpbmcgfCBudWxsLFxuICAgIGFjY2Vzc1Rva2VuPzogc3RyaW5nIHwgbnVsbFxuICApOiBPQXV0aENyZWRlbnRpYWwge1xuICAgIHJldHVybiBPQXV0aENyZWRlbnRpYWwuX2Zyb21QYXJhbXMoe1xuICAgICAgcHJvdmlkZXJJZDogR29vZ2xlQXV0aFByb3ZpZGVyLlBST1ZJREVSX0lELFxuICAgICAgc2lnbkluTWV0aG9kOiBHb29nbGVBdXRoUHJvdmlkZXIuR09PR0xFX1NJR05fSU5fTUVUSE9ELFxuICAgICAgaWRUb2tlbixcbiAgICAgIGFjY2Vzc1Rva2VuXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCB0byBleHRyYWN0IHRoZSB1bmRlcmx5aW5nIHtAbGluayBPQXV0aENyZWRlbnRpYWx9IGZyb20gYSB7QGxpbmsgVXNlckNyZWRlbnRpYWx9LlxuICAgKlxuICAgKiBAcGFyYW0gdXNlckNyZWRlbnRpYWwgLSBUaGUgdXNlciBjcmVkZW50aWFsLlxuICAgKi9cbiAgc3RhdGljIGNyZWRlbnRpYWxGcm9tUmVzdWx0KFxuICAgIHVzZXJDcmVkZW50aWFsOiBVc2VyQ3JlZGVudGlhbFxuICApOiBPQXV0aENyZWRlbnRpYWwgfCBudWxsIHtcbiAgICByZXR1cm4gR29vZ2xlQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWxGcm9tVGFnZ2VkT2JqZWN0KFxuICAgICAgdXNlckNyZWRlbnRpYWwgYXMgVXNlckNyZWRlbnRpYWxJbnRlcm5hbFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZWQgdG8gZXh0cmFjdCB0aGUgdW5kZXJseWluZyB7QGxpbmsgT0F1dGhDcmVkZW50aWFsfSBmcm9tIGEge0BsaW5rIEF1dGhFcnJvcn0gd2hpY2ggd2FzXG4gICAqIHRocm93biBkdXJpbmcgYSBzaWduLWluLCBsaW5rLCBvciByZWF1dGhlbnRpY2F0ZSBvcGVyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB1c2VyQ3JlZGVudGlhbCAtIFRoZSB1c2VyIGNyZWRlbnRpYWwuXG4gICAqL1xuICBzdGF0aWMgY3JlZGVudGlhbEZyb21FcnJvcihlcnJvcjogRmlyZWJhc2VFcnJvcik6IE9BdXRoQ3JlZGVudGlhbCB8IG51bGwge1xuICAgIHJldHVybiBHb29nbGVBdXRoUHJvdmlkZXIuY3JlZGVudGlhbEZyb21UYWdnZWRPYmplY3QoXG4gICAgICAoZXJyb3IuY3VzdG9tRGF0YSB8fCB7fSkgYXMgVGFnZ2VkV2l0aFRva2VuUmVzcG9uc2VcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlZGVudGlhbEZyb21UYWdnZWRPYmplY3Qoe1xuICAgIF90b2tlblJlc3BvbnNlOiB0b2tlblJlc3BvbnNlXG4gIH06IFRhZ2dlZFdpdGhUb2tlblJlc3BvbnNlKTogT0F1dGhDcmVkZW50aWFsIHwgbnVsbCB7XG4gICAgaWYgKCF0b2tlblJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB7IG9hdXRoSWRUb2tlbiwgb2F1dGhBY2Nlc3NUb2tlbiB9ID1cbiAgICAgIHRva2VuUmVzcG9uc2UgYXMgU2lnbkluV2l0aElkcFJlc3BvbnNlO1xuICAgIGlmICghb2F1dGhJZFRva2VuICYmICFvYXV0aEFjY2Vzc1Rva2VuKSB7XG4gICAgICAvLyBUaGlzIGNvdWxkIGJlIGFuIG9hdXRoIDEgY3JlZGVudGlhbCBvciBhIHBob25lIGNyZWRlbnRpYWxcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gR29vZ2xlQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWwob2F1dGhJZFRva2VuLCBvYXV0aEFjY2Vzc1Rva2VuKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IFVzZXJDcmVkZW50aWFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcbmltcG9ydCB7IEZpcmViYXNlRXJyb3IgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5cbmltcG9ydCB7IFRhZ2dlZFdpdGhUb2tlblJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vbW9kZWwvaWRfdG9rZW4nO1xuaW1wb3J0IHsgVXNlckNyZWRlbnRpYWxJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL3VzZXInO1xuaW1wb3J0IHsgT0F1dGhDcmVkZW50aWFsIH0gZnJvbSAnLi4vY3JlZGVudGlhbHMvb2F1dGgnO1xuaW1wb3J0IHsgQmFzZU9BdXRoUHJvdmlkZXIgfSBmcm9tICcuL29hdXRoJztcbmltcG9ydCB7IFByb3ZpZGVySWQsIFNpZ25Jbk1ldGhvZCB9IGZyb20gJy4uLy4uL21vZGVsL2VudW1zJztcblxuLyoqXG4gKiBQcm92aWRlciBmb3IgZ2VuZXJhdGluZyBhbiB7QGxpbmsgT0F1dGhDcmVkZW50aWFsfSBmb3Ige0BsaW5rIFByb3ZpZGVySWR9LkdJVEhVQi5cbiAqXG4gKiBAcmVtYXJrc1xuICogR2l0SHViIHJlcXVpcmVzIGFuIE9BdXRoIDIuMCByZWRpcmVjdCwgc28geW91IGNhbiBlaXRoZXIgaGFuZGxlIHRoZSByZWRpcmVjdCBkaXJlY3RseSwgb3IgdXNlXG4gKiB0aGUge0BsaW5rIHNpZ25JbldpdGhQb3B1cH0gaGFuZGxlcjpcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgamF2YXNjcmlwdFxuICogLy8gU2lnbiBpbiB1c2luZyBhIHJlZGlyZWN0LlxuICogY29uc3QgcHJvdmlkZXIgPSBuZXcgR2l0aHViQXV0aFByb3ZpZGVyKCk7XG4gKiAvLyBTdGFydCBhIHNpZ24gaW4gcHJvY2VzcyBmb3IgYW4gdW5hdXRoZW50aWNhdGVkIHVzZXIuXG4gKiBwcm92aWRlci5hZGRTY29wZSgncmVwbycpO1xuICogYXdhaXQgc2lnbkluV2l0aFJlZGlyZWN0KGF1dGgsIHByb3ZpZGVyKTtcbiAqIC8vIFRoaXMgd2lsbCB0cmlnZ2VyIGEgZnVsbCBwYWdlIHJlZGlyZWN0IGF3YXkgZnJvbSB5b3VyIGFwcFxuICpcbiAqIC8vIEFmdGVyIHJldHVybmluZyBmcm9tIHRoZSByZWRpcmVjdCB3aGVuIHlvdXIgYXBwIGluaXRpYWxpemVzIHlvdSBjYW4gb2J0YWluIHRoZSByZXN1bHRcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldFJlZGlyZWN0UmVzdWx0KGF1dGgpO1xuICogaWYgKHJlc3VsdCkge1xuICogICAvLyBUaGlzIGlzIHRoZSBzaWduZWQtaW4gdXNlclxuICogICBjb25zdCB1c2VyID0gcmVzdWx0LnVzZXI7XG4gKiAgIC8vIFRoaXMgZ2l2ZXMgeW91IGEgR2l0aHViIEFjY2VzcyBUb2tlbi5cbiAqICAgY29uc3QgY3JlZGVudGlhbCA9IEdpdGh1YkF1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVJlc3VsdChyZXN1bHQpO1xuICogICBjb25zdCB0b2tlbiA9IGNyZWRlbnRpYWwuYWNjZXNzVG9rZW47XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgamF2YXNjcmlwdFxuICogLy8gU2lnbiBpbiB1c2luZyBhIHBvcHVwLlxuICogY29uc3QgcHJvdmlkZXIgPSBuZXcgR2l0aHViQXV0aFByb3ZpZGVyKCk7XG4gKiBwcm92aWRlci5hZGRTY29wZSgncmVwbycpO1xuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc2lnbkluV2l0aFBvcHVwKGF1dGgsIHByb3ZpZGVyKTtcbiAqXG4gKiAvLyBUaGUgc2lnbmVkLWluIHVzZXIgaW5mby5cbiAqIGNvbnN0IHVzZXIgPSByZXN1bHQudXNlcjtcbiAqIC8vIFRoaXMgZ2l2ZXMgeW91IGEgR2l0aHViIEFjY2VzcyBUb2tlbi5cbiAqIGNvbnN0IGNyZWRlbnRpYWwgPSBHaXRodWJBdXRoUHJvdmlkZXIuY3JlZGVudGlhbEZyb21SZXN1bHQocmVzdWx0KTtcbiAqIGNvbnN0IHRva2VuID0gY3JlZGVudGlhbC5hY2Nlc3NUb2tlbjtcbiAqIGBgYFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgR2l0aHViQXV0aFByb3ZpZGVyIGV4dGVuZHMgQmFzZU9BdXRoUHJvdmlkZXIge1xuICAvKiogQWx3YXlzIHNldCB0byB7QGxpbmsgU2lnbkluTWV0aG9kfS5HSVRIVUIuICovXG4gIHN0YXRpYyByZWFkb25seSBHSVRIVUJfU0lHTl9JTl9NRVRIT0Q6ICdnaXRodWIuY29tJyA9IFNpZ25Jbk1ldGhvZC5HSVRIVUI7XG4gIC8qKiBBbHdheXMgc2V0IHRvIHtAbGluayBQcm92aWRlcklkfS5HSVRIVUIuICovXG4gIHN0YXRpYyByZWFkb25seSBQUk9WSURFUl9JRDogJ2dpdGh1Yi5jb20nID0gUHJvdmlkZXJJZC5HSVRIVUI7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoUHJvdmlkZXJJZC5HSVRIVUIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjcmVkZW50aWFsIGZvciBHaXRodWIuXG4gICAqXG4gICAqIEBwYXJhbSBhY2Nlc3NUb2tlbiAtIEdpdGh1YiBhY2Nlc3MgdG9rZW4uXG4gICAqL1xuICBzdGF0aWMgY3JlZGVudGlhbChhY2Nlc3NUb2tlbjogc3RyaW5nKTogT0F1dGhDcmVkZW50aWFsIHtcbiAgICByZXR1cm4gT0F1dGhDcmVkZW50aWFsLl9mcm9tUGFyYW1zKHtcbiAgICAgIHByb3ZpZGVySWQ6IEdpdGh1YkF1dGhQcm92aWRlci5QUk9WSURFUl9JRCxcbiAgICAgIHNpZ25Jbk1ldGhvZDogR2l0aHViQXV0aFByb3ZpZGVyLkdJVEhVQl9TSUdOX0lOX01FVEhPRCxcbiAgICAgIGFjY2Vzc1Rva2VuXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCB0byBleHRyYWN0IHRoZSB1bmRlcmx5aW5nIHtAbGluayBPQXV0aENyZWRlbnRpYWx9IGZyb20gYSB7QGxpbmsgVXNlckNyZWRlbnRpYWx9LlxuICAgKlxuICAgKiBAcGFyYW0gdXNlckNyZWRlbnRpYWwgLSBUaGUgdXNlciBjcmVkZW50aWFsLlxuICAgKi9cbiAgc3RhdGljIGNyZWRlbnRpYWxGcm9tUmVzdWx0KFxuICAgIHVzZXJDcmVkZW50aWFsOiBVc2VyQ3JlZGVudGlhbFxuICApOiBPQXV0aENyZWRlbnRpYWwgfCBudWxsIHtcbiAgICByZXR1cm4gR2l0aHViQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWxGcm9tVGFnZ2VkT2JqZWN0KFxuICAgICAgdXNlckNyZWRlbnRpYWwgYXMgVXNlckNyZWRlbnRpYWxJbnRlcm5hbFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCB0byBleHRyYWN0IHRoZSB1bmRlcmx5aW5nIHtAbGluayBPQXV0aENyZWRlbnRpYWx9IGZyb20gYSB7QGxpbmsgQXV0aEVycm9yfSB3aGljaCB3YXNcbiAgICogdGhyb3duIGR1cmluZyBhIHNpZ24taW4sIGxpbmssIG9yIHJlYXV0aGVudGljYXRlIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHVzZXJDcmVkZW50aWFsIC0gVGhlIHVzZXIgY3JlZGVudGlhbC5cbiAgICovXG4gIHN0YXRpYyBjcmVkZW50aWFsRnJvbUVycm9yKGVycm9yOiBGaXJlYmFzZUVycm9yKTogT0F1dGhDcmVkZW50aWFsIHwgbnVsbCB7XG4gICAgcmV0dXJuIEdpdGh1YkF1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdChcbiAgICAgIChlcnJvci5jdXN0b21EYXRhIHx8IHt9KSBhcyBUYWdnZWRXaXRoVG9rZW5SZXNwb25zZVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdCh7XG4gICAgX3Rva2VuUmVzcG9uc2U6IHRva2VuUmVzcG9uc2VcbiAgfTogVGFnZ2VkV2l0aFRva2VuUmVzcG9uc2UpOiBPQXV0aENyZWRlbnRpYWwgfCBudWxsIHtcbiAgICBpZiAoIXRva2VuUmVzcG9uc2UgfHwgISgnb2F1dGhBY2Nlc3NUb2tlbicgaW4gdG9rZW5SZXNwb25zZSkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICghdG9rZW5SZXNwb25zZS5vYXV0aEFjY2Vzc1Rva2VuKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEdpdGh1YkF1dGhQcm92aWRlci5jcmVkZW50aWFsKHRva2VuUmVzcG9uc2Uub2F1dGhBY2Nlc3NUb2tlbik7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIFNBTUwgY3JlZGVudGlhbHMgcmV0dXJuZWQgYnkgYW4ge0BsaW5rIFNBTUxBdXRoUHJvdmlkZXJ9LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuXG5pbXBvcnQge1xuICBzaWduSW5XaXRoSWRwLFxuICBTaWduSW5XaXRoSWRwUmVxdWVzdFxufSBmcm9tICcuLi8uLi9hcGkvYXV0aGVudGljYXRpb24vaWRwJztcbmltcG9ydCB7IEF1dGhJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL2F1dGgnO1xuaW1wb3J0IHsgSWRUb2tlblJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vbW9kZWwvaWRfdG9rZW4nO1xuaW1wb3J0IHsgQXV0aENyZWRlbnRpYWwgfSBmcm9tICcuL2F1dGhfY3JlZGVudGlhbCc7XG5cbmNvbnN0IElEUF9SRVFVRVNUX1VSSSA9ICdodHRwOi8vbG9jYWxob3N0JztcblxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBTQU1MQXV0aENyZWRlbnRpYWwgZXh0ZW5kcyBBdXRoQ3JlZGVudGlhbCB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICBwcm92aWRlcklkOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBwZW5kaW5nVG9rZW46IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihwcm92aWRlcklkLCBwcm92aWRlcklkKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2dldElkVG9rZW5SZXNwb25zZShhdXRoOiBBdXRoSW50ZXJuYWwpOiBQcm9taXNlPElkVG9rZW5SZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLmJ1aWxkUmVxdWVzdCgpO1xuICAgIHJldHVybiBzaWduSW5XaXRoSWRwKGF1dGgsIHJlcXVlc3QpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfbGlua1RvSWRUb2tlbihcbiAgICBhdXRoOiBBdXRoSW50ZXJuYWwsXG4gICAgaWRUb2tlbjogc3RyaW5nXG4gICk6IFByb21pc2U8SWRUb2tlblJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuYnVpbGRSZXF1ZXN0KCk7XG4gICAgcmVxdWVzdC5pZFRva2VuID0gaWRUb2tlbjtcbiAgICByZXR1cm4gc2lnbkluV2l0aElkcChhdXRoLCByZXF1ZXN0KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2dldFJlYXV0aGVudGljYXRpb25SZXNvbHZlcihhdXRoOiBBdXRoSW50ZXJuYWwpOiBQcm9taXNlPElkVG9rZW5SZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLmJ1aWxkUmVxdWVzdCgpO1xuICAgIHJlcXVlc3QuYXV0b0NyZWF0ZSA9IGZhbHNlO1xuICAgIHJldHVybiBzaWduSW5XaXRoSWRwKGF1dGgsIHJlcXVlc3QpO1xuICB9XG5cbiAgLyoqIHtAaW5oZXJpdGRvYyBBdXRoQ3JlZGVudGlhbC50b0pTT059ICAqL1xuICB0b0pTT04oKTogb2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgc2lnbkluTWV0aG9kOiB0aGlzLnNpZ25Jbk1ldGhvZCxcbiAgICAgIHByb3ZpZGVySWQ6IHRoaXMucHJvdmlkZXJJZCxcbiAgICAgIHBlbmRpbmdUb2tlbjogdGhpcy5wZW5kaW5nVG9rZW5cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBtZXRob2QgdG8gZGVzZXJpYWxpemUgYSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdCBpbnRvIGFuXG4gICAqIHtAbGluayAgQXV0aENyZWRlbnRpYWx9LlxuICAgKlxuICAgKiBAcGFyYW0ganNvbiAtIElucHV0IGNhbiBiZSBlaXRoZXIgT2JqZWN0IG9yIHRoZSBzdHJpbmdpZmllZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0LlxuICAgKiBXaGVuIHN0cmluZyBpcyBwcm92aWRlZCwgSlNPTi5wYXJzZSB3b3VsZCBiZSBjYWxsZWQgZmlyc3QuXG4gICAqXG4gICAqIEByZXR1cm5zIElmIHRoZSBKU09OIGlucHV0IGRvZXMgbm90IHJlcHJlc2VudCBhbiB7QGxpbmsgIEF1dGhDcmVkZW50aWFsfSwgbnVsbCBpcyByZXR1cm5lZC5cbiAgICovXG4gIHN0YXRpYyBmcm9tSlNPTihqc29uOiBzdHJpbmcgfCBvYmplY3QpOiBTQU1MQXV0aENyZWRlbnRpYWwgfCBudWxsIHtcbiAgICBjb25zdCBvYmogPSB0eXBlb2YganNvbiA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKGpzb24pIDoganNvbjtcbiAgICBjb25zdCB7IHByb3ZpZGVySWQsIHNpZ25Jbk1ldGhvZCwgcGVuZGluZ1Rva2VuIH06IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPVxuICAgICAgb2JqO1xuICAgIGlmIChcbiAgICAgICFwcm92aWRlcklkIHx8XG4gICAgICAhc2lnbkluTWV0aG9kIHx8XG4gICAgICAhcGVuZGluZ1Rva2VuIHx8XG4gICAgICBwcm92aWRlcklkICE9PSBzaWduSW5NZXRob2RcbiAgICApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgU0FNTEF1dGhDcmVkZW50aWFsKHByb3ZpZGVySWQsIHBlbmRpbmdUb2tlbik7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIHN0YXRpYyBtZXRob2QgdG8gYXZvaWQgZXhwb3NpbmcgdGhlIGNvbnN0cnVjdG9yIHRvIGVuZCB1c2Vycy5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBzdGF0aWMgX2NyZWF0ZShwcm92aWRlcklkOiBzdHJpbmcsIHBlbmRpbmdUb2tlbjogc3RyaW5nKTogU0FNTEF1dGhDcmVkZW50aWFsIHtcbiAgICByZXR1cm4gbmV3IFNBTUxBdXRoQ3JlZGVudGlhbChwcm92aWRlcklkLCBwZW5kaW5nVG9rZW4pO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFJlcXVlc3QoKTogU2lnbkluV2l0aElkcFJlcXVlc3Qge1xuICAgIHJldHVybiB7XG4gICAgICByZXF1ZXN0VXJpOiBJRFBfUkVRVUVTVF9VUkksXG4gICAgICByZXR1cm5TZWN1cmVUb2tlbjogdHJ1ZSxcbiAgICAgIHBlbmRpbmdUb2tlbjogdGhpcy5wZW5kaW5nVG9rZW5cbiAgICB9O1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgRmlyZWJhc2VFcnJvciB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcbmltcG9ydCB7IFNpZ25JbldpdGhJZHBSZXNwb25zZSB9IGZyb20gJy4uLy4uL2FwaS9hdXRoZW50aWNhdGlvbi9pZHAnO1xuaW1wb3J0IHsgVGFnZ2VkV2l0aFRva2VuUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9tb2RlbC9pZF90b2tlbic7XG5pbXBvcnQgeyBVc2VyQ3JlZGVudGlhbCB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5pbXBvcnQgeyBVc2VyQ3JlZGVudGlhbEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvdXNlcic7XG5pbXBvcnQgeyBBdXRoQ3JlZGVudGlhbCB9IGZyb20gJy4uL2NyZWRlbnRpYWxzJztcbmltcG9ydCB7IFNBTUxBdXRoQ3JlZGVudGlhbCB9IGZyb20gJy4uL2NyZWRlbnRpYWxzL3NhbWwnO1xuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBfYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQnO1xuaW1wb3J0IHsgRmVkZXJhdGVkQXV0aFByb3ZpZGVyIH0gZnJvbSAnLi9mZWRlcmF0ZWQnO1xuXG5jb25zdCBTQU1MX1BST1ZJREVSX1BSRUZJWCA9ICdzYW1sLic7XG5cbi8qKlxuICogQW4ge0BsaW5rIEF1dGhQcm92aWRlcn0gZm9yIFNBTUwuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgU0FNTEF1dGhQcm92aWRlciBleHRlbmRzIEZlZGVyYXRlZEF1dGhQcm92aWRlciB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3Rvci4gVGhlIHByb3ZpZGVySWQgbXVzdCBzdGFydCB3aXRoIFwic2FtbC5cIlxuICAgKiBAcGFyYW0gcHJvdmlkZXJJZCAtIFNBTUwgcHJvdmlkZXIgSUQuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcm92aWRlcklkOiBzdHJpbmcpIHtcbiAgICBfYXNzZXJ0KFxuICAgICAgcHJvdmlkZXJJZC5zdGFydHNXaXRoKFNBTUxfUFJPVklERVJfUFJFRklYKSxcbiAgICAgIEF1dGhFcnJvckNvZGUuQVJHVU1FTlRfRVJST1JcbiAgICApO1xuICAgIHN1cGVyKHByb3ZpZGVySWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhbiB7QGxpbmsgQXV0aENyZWRlbnRpYWx9IGZyb20gYSB7QGxpbmsgVXNlckNyZWRlbnRpYWx9IGFmdGVyIGFcbiAgICogc3VjY2Vzc2Z1bCBTQU1MIGZsb3cgY29tcGxldGVzLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKlxuICAgKiBGb3IgZXhhbXBsZSwgdG8gZ2V0IGFuIHtAbGluayBBdXRoQ3JlZGVudGlhbH0sIHlvdSBjb3VsZCB3cml0ZSB0aGVcbiAgICogZm9sbG93aW5nIGNvZGU6XG4gICAqXG4gICAqIGBgYGpzXG4gICAqIGNvbnN0IHVzZXJDcmVkZW50aWFsID0gYXdhaXQgc2lnbkluV2l0aFBvcHVwKGF1dGgsIHNhbWxQcm92aWRlcik7XG4gICAqIGNvbnN0IGNyZWRlbnRpYWwgPSBTQU1MQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWxGcm9tUmVzdWx0KHVzZXJDcmVkZW50aWFsKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSB1c2VyQ3JlZGVudGlhbCAtIFRoZSB1c2VyIGNyZWRlbnRpYWwuXG4gICAqL1xuICBzdGF0aWMgY3JlZGVudGlhbEZyb21SZXN1bHQoXG4gICAgdXNlckNyZWRlbnRpYWw6IFVzZXJDcmVkZW50aWFsXG4gICk6IEF1dGhDcmVkZW50aWFsIHwgbnVsbCB7XG4gICAgcmV0dXJuIFNBTUxBdXRoUHJvdmlkZXIuc2FtbENyZWRlbnRpYWxGcm9tVGFnZ2VkT2JqZWN0KFxuICAgICAgdXNlckNyZWRlbnRpYWwgYXMgVXNlckNyZWRlbnRpYWxJbnRlcm5hbFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCB0byBleHRyYWN0IHRoZSB1bmRlcmx5aW5nIHtAbGluayBPQXV0aENyZWRlbnRpYWx9IGZyb20gYSB7QGxpbmsgQXV0aEVycm9yfSB3aGljaCB3YXNcbiAgICogdGhyb3duIGR1cmluZyBhIHNpZ24taW4sIGxpbmssIG9yIHJlYXV0aGVudGljYXRlIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHVzZXJDcmVkZW50aWFsIC0gVGhlIHVzZXIgY3JlZGVudGlhbC5cbiAgICovXG4gIHN0YXRpYyBjcmVkZW50aWFsRnJvbUVycm9yKGVycm9yOiBGaXJlYmFzZUVycm9yKTogQXV0aENyZWRlbnRpYWwgfCBudWxsIHtcbiAgICByZXR1cm4gU0FNTEF1dGhQcm92aWRlci5zYW1sQ3JlZGVudGlhbEZyb21UYWdnZWRPYmplY3QoXG4gICAgICAoZXJyb3IuY3VzdG9tRGF0YSB8fCB7fSkgYXMgVGFnZ2VkV2l0aFRva2VuUmVzcG9uc2VcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4ge0BsaW5rIEF1dGhDcmVkZW50aWFsfSBmcm9tIGEgSlNPTiBzdHJpbmcgb3IgYSBwbGFpbiBvYmplY3QuXG4gICAqIEBwYXJhbSBqc29uIC0gQSBwbGFpbiBvYmplY3Qgb3IgYSBKU09OIHN0cmluZ1xuICAgKi9cbiAgc3RhdGljIGNyZWRlbnRpYWxGcm9tSlNPTihqc29uOiBzdHJpbmcgfCBvYmplY3QpOiBBdXRoQ3JlZGVudGlhbCB7XG4gICAgY29uc3QgY3JlZGVudGlhbCA9IFNBTUxBdXRoQ3JlZGVudGlhbC5mcm9tSlNPTihqc29uKTtcbiAgICBfYXNzZXJ0KGNyZWRlbnRpYWwsIEF1dGhFcnJvckNvZGUuQVJHVU1FTlRfRVJST1IpO1xuICAgIHJldHVybiBjcmVkZW50aWFsO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgc2FtbENyZWRlbnRpYWxGcm9tVGFnZ2VkT2JqZWN0KHtcbiAgICBfdG9rZW5SZXNwb25zZTogdG9rZW5SZXNwb25zZVxuICB9OiBUYWdnZWRXaXRoVG9rZW5SZXNwb25zZSk6IFNBTUxBdXRoQ3JlZGVudGlhbCB8IG51bGwge1xuICAgIGlmICghdG9rZW5SZXNwb25zZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgeyBwZW5kaW5nVG9rZW4sIHByb3ZpZGVySWQgfSA9IHRva2VuUmVzcG9uc2UgYXMgU2lnbkluV2l0aElkcFJlc3BvbnNlO1xuXG4gICAgaWYgKCFwZW5kaW5nVG9rZW4gfHwgIXByb3ZpZGVySWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gU0FNTEF1dGhDcmVkZW50aWFsLl9jcmVhdGUocHJvdmlkZXJJZCwgcGVuZGluZ1Rva2VuKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBUd2l0dGVyIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgVXNlckNyZWRlbnRpYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuaW1wb3J0IHsgRmlyZWJhc2VFcnJvciB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcblxuaW1wb3J0IHsgU2lnbkluV2l0aElkcFJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vYXBpL2F1dGhlbnRpY2F0aW9uL2lkcCc7XG5pbXBvcnQgeyBUYWdnZWRXaXRoVG9rZW5SZXNwb25zZSB9IGZyb20gJy4uLy4uL21vZGVsL2lkX3Rva2VuJztcbmltcG9ydCB7IFVzZXJDcmVkZW50aWFsSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC91c2VyJztcbmltcG9ydCB7IE9BdXRoQ3JlZGVudGlhbCB9IGZyb20gJy4uL2NyZWRlbnRpYWxzL29hdXRoJztcbmltcG9ydCB7IEJhc2VPQXV0aFByb3ZpZGVyIH0gZnJvbSAnLi9vYXV0aCc7XG5pbXBvcnQgeyBQcm92aWRlcklkLCBTaWduSW5NZXRob2QgfSBmcm9tICcuLi8uLi9tb2RlbC9lbnVtcyc7XG5cbi8qKlxuICogUHJvdmlkZXIgZm9yIGdlbmVyYXRpbmcgYW4ge0BsaW5rIE9BdXRoQ3JlZGVudGlhbH0gZm9yIHtAbGluayBQcm92aWRlcklkfS5UV0lUVEVSLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiAvLyBTaWduIGluIHVzaW5nIGEgcmVkaXJlY3QuXG4gKiBjb25zdCBwcm92aWRlciA9IG5ldyBUd2l0dGVyQXV0aFByb3ZpZGVyKCk7XG4gKiAvLyBTdGFydCBhIHNpZ24gaW4gcHJvY2VzcyBmb3IgYW4gdW5hdXRoZW50aWNhdGVkIHVzZXIuXG4gKiBhd2FpdCBzaWduSW5XaXRoUmVkaXJlY3QoYXV0aCwgcHJvdmlkZXIpO1xuICogLy8gVGhpcyB3aWxsIHRyaWdnZXIgYSBmdWxsIHBhZ2UgcmVkaXJlY3QgYXdheSBmcm9tIHlvdXIgYXBwXG4gKlxuICogLy8gQWZ0ZXIgcmV0dXJuaW5nIGZyb20gdGhlIHJlZGlyZWN0IHdoZW4geW91ciBhcHAgaW5pdGlhbGl6ZXMgeW91IGNhbiBvYnRhaW4gdGhlIHJlc3VsdFxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0UmVkaXJlY3RSZXN1bHQoYXV0aCk7XG4gKiBpZiAocmVzdWx0KSB7XG4gKiAgIC8vIFRoaXMgaXMgdGhlIHNpZ25lZC1pbiB1c2VyXG4gKiAgIGNvbnN0IHVzZXIgPSByZXN1bHQudXNlcjtcbiAqICAgLy8gVGhpcyBnaXZlcyB5b3UgYSBUd2l0dGVyIEFjY2VzcyBUb2tlbiBhbmQgU2VjcmV0LlxuICogICBjb25zdCBjcmVkZW50aWFsID0gVHdpdHRlckF1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVJlc3VsdChyZXN1bHQpO1xuICogICBjb25zdCB0b2tlbiA9IGNyZWRlbnRpYWwuYWNjZXNzVG9rZW47XG4gKiAgIGNvbnN0IHNlY3JldCA9IGNyZWRlbnRpYWwuc2VjcmV0O1xuICogfVxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGphdmFzY3JpcHRcbiAqIC8vIFNpZ24gaW4gdXNpbmcgYSBwb3B1cC5cbiAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IFR3aXR0ZXJBdXRoUHJvdmlkZXIoKTtcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpZ25JbldpdGhQb3B1cChhdXRoLCBwcm92aWRlcik7XG4gKlxuICogLy8gVGhlIHNpZ25lZC1pbiB1c2VyIGluZm8uXG4gKiBjb25zdCB1c2VyID0gcmVzdWx0LnVzZXI7XG4gKiAvLyBUaGlzIGdpdmVzIHlvdSBhIFR3aXR0ZXIgQWNjZXNzIFRva2VuIGFuZCBTZWNyZXQuXG4gKiBjb25zdCBjcmVkZW50aWFsID0gVHdpdHRlckF1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVJlc3VsdChyZXN1bHQpO1xuICogY29uc3QgdG9rZW4gPSBjcmVkZW50aWFsLmFjY2Vzc1Rva2VuO1xuICogY29uc3Qgc2VjcmV0ID0gY3JlZGVudGlhbC5zZWNyZXQ7XG4gKiBgYGBcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBUd2l0dGVyQXV0aFByb3ZpZGVyIGV4dGVuZHMgQmFzZU9BdXRoUHJvdmlkZXIge1xuICAvKiogQWx3YXlzIHNldCB0byB7QGxpbmsgU2lnbkluTWV0aG9kfS5UV0lUVEVSLiAqL1xuICBzdGF0aWMgcmVhZG9ubHkgVFdJVFRFUl9TSUdOX0lOX01FVEhPRDogJ3R3aXR0ZXIuY29tJyA9IFNpZ25Jbk1ldGhvZC5UV0lUVEVSO1xuICAvKiogQWx3YXlzIHNldCB0byB7QGxpbmsgUHJvdmlkZXJJZH0uVFdJVFRFUi4gKi9cbiAgc3RhdGljIHJlYWRvbmx5IFBST1ZJREVSX0lEOiAndHdpdHRlci5jb20nID0gUHJvdmlkZXJJZC5UV0lUVEVSO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFByb3ZpZGVySWQuVFdJVFRFUik7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGNyZWRlbnRpYWwgZm9yIFR3aXR0ZXIuXG4gICAqXG4gICAqIEBwYXJhbSB0b2tlbiAtIFR3aXR0ZXIgYWNjZXNzIHRva2VuLlxuICAgKiBAcGFyYW0gc2VjcmV0IC0gVHdpdHRlciBzZWNyZXQuXG4gICAqL1xuICBzdGF0aWMgY3JlZGVudGlhbCh0b2tlbjogc3RyaW5nLCBzZWNyZXQ6IHN0cmluZyk6IE9BdXRoQ3JlZGVudGlhbCB7XG4gICAgcmV0dXJuIE9BdXRoQ3JlZGVudGlhbC5fZnJvbVBhcmFtcyh7XG4gICAgICBwcm92aWRlcklkOiBUd2l0dGVyQXV0aFByb3ZpZGVyLlBST1ZJREVSX0lELFxuICAgICAgc2lnbkluTWV0aG9kOiBUd2l0dGVyQXV0aFByb3ZpZGVyLlRXSVRURVJfU0lHTl9JTl9NRVRIT0QsXG4gICAgICBvYXV0aFRva2VuOiB0b2tlbixcbiAgICAgIG9hdXRoVG9rZW5TZWNyZXQ6IHNlY3JldFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gZXh0cmFjdCB0aGUgdW5kZXJseWluZyB7QGxpbmsgT0F1dGhDcmVkZW50aWFsfSBmcm9tIGEge0BsaW5rIFVzZXJDcmVkZW50aWFsfS5cbiAgICpcbiAgICogQHBhcmFtIHVzZXJDcmVkZW50aWFsIC0gVGhlIHVzZXIgY3JlZGVudGlhbC5cbiAgICovXG4gIHN0YXRpYyBjcmVkZW50aWFsRnJvbVJlc3VsdChcbiAgICB1c2VyQ3JlZGVudGlhbDogVXNlckNyZWRlbnRpYWxcbiAgKTogT0F1dGhDcmVkZW50aWFsIHwgbnVsbCB7XG4gICAgcmV0dXJuIFR3aXR0ZXJBdXRoUHJvdmlkZXIuY3JlZGVudGlhbEZyb21UYWdnZWRPYmplY3QoXG4gICAgICB1c2VyQ3JlZGVudGlhbCBhcyBVc2VyQ3JlZGVudGlhbEludGVybmFsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIHRvIGV4dHJhY3QgdGhlIHVuZGVybHlpbmcge0BsaW5rIE9BdXRoQ3JlZGVudGlhbH0gZnJvbSBhIHtAbGluayBBdXRoRXJyb3J9IHdoaWNoIHdhc1xuICAgKiB0aHJvd24gZHVyaW5nIGEgc2lnbi1pbiwgbGluaywgb3IgcmVhdXRoZW50aWNhdGUgb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gdXNlckNyZWRlbnRpYWwgLSBUaGUgdXNlciBjcmVkZW50aWFsLlxuICAgKi9cbiAgc3RhdGljIGNyZWRlbnRpYWxGcm9tRXJyb3IoZXJyb3I6IEZpcmViYXNlRXJyb3IpOiBPQXV0aENyZWRlbnRpYWwgfCBudWxsIHtcbiAgICByZXR1cm4gVHdpdHRlckF1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdChcbiAgICAgIChlcnJvci5jdXN0b21EYXRhIHx8IHt9KSBhcyBUYWdnZWRXaXRoVG9rZW5SZXNwb25zZVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdCh7XG4gICAgX3Rva2VuUmVzcG9uc2U6IHRva2VuUmVzcG9uc2VcbiAgfTogVGFnZ2VkV2l0aFRva2VuUmVzcG9uc2UpOiBPQXV0aENyZWRlbnRpYWwgfCBudWxsIHtcbiAgICBpZiAoIXRva2VuUmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCB7IG9hdXRoQWNjZXNzVG9rZW4sIG9hdXRoVG9rZW5TZWNyZXQgfSA9XG4gICAgICB0b2tlblJlc3BvbnNlIGFzIFNpZ25JbldpdGhJZHBSZXNwb25zZTtcbiAgICBpZiAoIW9hdXRoQWNjZXNzVG9rZW4gfHwgIW9hdXRoVG9rZW5TZWNyZXQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gVHdpdHRlckF1dGhQcm92aWRlci5jcmVkZW50aWFsKG9hdXRoQWNjZXNzVG9rZW4sIG9hdXRoVG9rZW5TZWNyZXQpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgRW5kcG9pbnQsXG4gIEh0dHBNZXRob2QsXG4gIFJlY2FwdGNoYUNsaWVudFR5cGUsXG4gIFJlY2FwdGNoYVZlcnNpb24sXG4gIF9hZGRUaWRJZk5lY2Vzc2FyeSxcbiAgX3BlcmZvcm1TaWduSW5SZXF1ZXN0XG59IGZyb20gJy4uL2luZGV4JztcbmltcG9ydCB7IElkVG9rZW5SZXNwb25zZSB9IGZyb20gJy4uLy4uL21vZGVsL2lkX3Rva2VuJztcbmltcG9ydCB7IEF1dGggfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25VcFJlcXVlc3Qge1xuICByZXR1cm5TZWN1cmVUb2tlbj86IGJvb2xlYW47XG4gIGVtYWlsPzogc3RyaW5nO1xuICBwYXNzd29yZD86IHN0cmluZztcbiAgdGVuYW50SWQ/OiBzdHJpbmc7XG4gIGNhcHRjaGFSZXNwb25zZT86IHN0cmluZztcbiAgY2xpZW50VHlwZT86IFJlY2FwdGNoYUNsaWVudFR5cGU7XG4gIHJlY2FwdGNoYVZlcnNpb24/OiBSZWNhcHRjaGFWZXJzaW9uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25VcFJlc3BvbnNlIGV4dGVuZHMgSWRUb2tlblJlc3BvbnNlIHtcbiAgZGlzcGxheU5hbWU/OiBzdHJpbmc7XG4gIGVtYWlsPzogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2lnblVwKFxuICBhdXRoOiBBdXRoLFxuICByZXF1ZXN0OiBTaWduVXBSZXF1ZXN0XG4pOiBQcm9taXNlPFNpZ25VcFJlc3BvbnNlPiB7XG4gIHJldHVybiBfcGVyZm9ybVNpZ25JblJlcXVlc3Q8U2lnblVwUmVxdWVzdCwgU2lnblVwUmVzcG9uc2U+KFxuICAgIGF1dGgsXG4gICAgSHR0cE1ldGhvZC5QT1NULFxuICAgIEVuZHBvaW50LlNJR05fVVAsXG4gICAgX2FkZFRpZElmTmVjZXNzYXJ5KGF1dGgsIHJlcXVlc3QpXG4gICk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgUGhvbmVPck9hdXRoVG9rZW5SZXNwb25zZSB9IGZyb20gJy4uLy4uL2FwaS9hdXRoZW50aWNhdGlvbi9tZmEnO1xuaW1wb3J0IHsgSWRUb2tlblJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vbW9kZWwvaWRfdG9rZW4nO1xuaW1wb3J0IHsgVXNlckludGVybmFsLCBVc2VyQ3JlZGVudGlhbEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvdXNlcic7XG5pbXBvcnQgeyBVc2VySW1wbCB9IGZyb20gJy4vdXNlcl9pbXBsJztcbmltcG9ydCB7IEF1dGhJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL2F1dGgnO1xuaW1wb3J0IHsgT3BlcmF0aW9uVHlwZSwgUHJvdmlkZXJJZCB9IGZyb20gJy4uLy4uL21vZGVsL2VudW1zJztcblxuaW50ZXJmYWNlIFVzZXJDcmVkZW50aWFsUGFyYW1zIHtcbiAgcmVhZG9ubHkgdXNlcjogVXNlckludGVybmFsO1xuICByZWFkb25seSBwcm92aWRlcklkOiBQcm92aWRlcklkIHwgc3RyaW5nIHwgbnVsbDtcbiAgcmVhZG9ubHkgX3Rva2VuUmVzcG9uc2U/OiBQaG9uZU9yT2F1dGhUb2tlblJlc3BvbnNlO1xuICByZWFkb25seSBvcGVyYXRpb25UeXBlOiBPcGVyYXRpb25UeXBlO1xufVxuXG5leHBvcnQgY2xhc3MgVXNlckNyZWRlbnRpYWxJbXBsXG4gIGltcGxlbWVudHMgVXNlckNyZWRlbnRpYWxJbnRlcm5hbCwgVXNlckNyZWRlbnRpYWxQYXJhbXNcbntcbiAgcmVhZG9ubHkgdXNlcjogVXNlckludGVybmFsO1xuICByZWFkb25seSBwcm92aWRlcklkOiBQcm92aWRlcklkIHwgc3RyaW5nIHwgbnVsbDtcbiAgcmVhZG9ubHkgX3Rva2VuUmVzcG9uc2U6IFBob25lT3JPYXV0aFRva2VuUmVzcG9uc2UgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IG9wZXJhdGlvblR5cGU6IE9wZXJhdGlvblR5cGU7XG5cbiAgY29uc3RydWN0b3IocGFyYW1zOiBVc2VyQ3JlZGVudGlhbFBhcmFtcykge1xuICAgIHRoaXMudXNlciA9IHBhcmFtcy51c2VyO1xuICAgIHRoaXMucHJvdmlkZXJJZCA9IHBhcmFtcy5wcm92aWRlcklkO1xuICAgIHRoaXMuX3Rva2VuUmVzcG9uc2UgPSBwYXJhbXMuX3Rva2VuUmVzcG9uc2U7XG4gICAgdGhpcy5vcGVyYXRpb25UeXBlID0gcGFyYW1zLm9wZXJhdGlvblR5cGU7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgX2Zyb21JZFRva2VuUmVzcG9uc2UoXG4gICAgYXV0aDogQXV0aEludGVybmFsLFxuICAgIG9wZXJhdGlvblR5cGU6IE9wZXJhdGlvblR5cGUsXG4gICAgaWRUb2tlblJlc3BvbnNlOiBJZFRva2VuUmVzcG9uc2UsXG4gICAgaXNBbm9ueW1vdXM6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBQcm9taXNlPFVzZXJDcmVkZW50aWFsSW50ZXJuYWw+IHtcbiAgICBjb25zdCB1c2VyID0gYXdhaXQgVXNlckltcGwuX2Zyb21JZFRva2VuUmVzcG9uc2UoXG4gICAgICBhdXRoLFxuICAgICAgaWRUb2tlblJlc3BvbnNlLFxuICAgICAgaXNBbm9ueW1vdXNcbiAgICApO1xuICAgIGNvbnN0IHByb3ZpZGVySWQgPSBwcm92aWRlcklkRm9yUmVzcG9uc2UoaWRUb2tlblJlc3BvbnNlKTtcbiAgICBjb25zdCB1c2VyQ3JlZCA9IG5ldyBVc2VyQ3JlZGVudGlhbEltcGwoe1xuICAgICAgdXNlcixcbiAgICAgIHByb3ZpZGVySWQsXG4gICAgICBfdG9rZW5SZXNwb25zZTogaWRUb2tlblJlc3BvbnNlLFxuICAgICAgb3BlcmF0aW9uVHlwZVxuICAgIH0pO1xuICAgIHJldHVybiB1c2VyQ3JlZDtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBfZm9yT3BlcmF0aW9uKFxuICAgIHVzZXI6IFVzZXJJbnRlcm5hbCxcbiAgICBvcGVyYXRpb25UeXBlOiBPcGVyYXRpb25UeXBlLFxuICAgIHJlc3BvbnNlOiBQaG9uZU9yT2F1dGhUb2tlblJlc3BvbnNlXG4gICk6IFByb21pc2U8VXNlckNyZWRlbnRpYWxJbXBsPiB7XG4gICAgYXdhaXQgdXNlci5fdXBkYXRlVG9rZW5zSWZOZWNlc3NhcnkocmVzcG9uc2UsIC8qIHJlbG9hZCAqLyB0cnVlKTtcbiAgICBjb25zdCBwcm92aWRlcklkID0gcHJvdmlkZXJJZEZvclJlc3BvbnNlKHJlc3BvbnNlKTtcbiAgICByZXR1cm4gbmV3IFVzZXJDcmVkZW50aWFsSW1wbCh7XG4gICAgICB1c2VyLFxuICAgICAgcHJvdmlkZXJJZCxcbiAgICAgIF90b2tlblJlc3BvbnNlOiByZXNwb25zZSxcbiAgICAgIG9wZXJhdGlvblR5cGVcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcm92aWRlcklkRm9yUmVzcG9uc2UoXG4gIHJlc3BvbnNlOiBJZFRva2VuUmVzcG9uc2Vcbik6IFByb3ZpZGVySWQgfCBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKHJlc3BvbnNlLnByb3ZpZGVySWQpIHtcbiAgICByZXR1cm4gcmVzcG9uc2UucHJvdmlkZXJJZDtcbiAgfVxuXG4gIGlmICgncGhvbmVOdW1iZXInIGluIHJlc3BvbnNlKSB7XG4gICAgcmV0dXJuIFByb3ZpZGVySWQuUEhPTkU7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBBdXRoLCBVc2VyQ3JlZGVudGlhbCB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5pbXBvcnQgeyBzaWduVXAgfSBmcm9tICcuLi8uLi9hcGkvYXV0aGVudGljYXRpb24vc2lnbl91cCc7XG5pbXBvcnQgeyBVc2VySW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC91c2VyJztcbmltcG9ydCB7IFVzZXJDcmVkZW50aWFsSW1wbCB9IGZyb20gJy4uL3VzZXIvdXNlcl9jcmVkZW50aWFsX2ltcGwnO1xuaW1wb3J0IHsgX2Nhc3RBdXRoIH0gZnJvbSAnLi4vYXV0aC9hdXRoX2ltcGwnO1xuaW1wb3J0IHsgT3BlcmF0aW9uVHlwZSB9IGZyb20gJy4uLy4uL21vZGVsL2VudW1zJztcblxuLyoqXG4gKiBBc3luY2hyb25vdXNseSBzaWducyBpbiBhcyBhbiBhbm9ueW1vdXMgdXNlci5cbiAqXG4gKiBAcmVtYXJrc1xuICogSWYgdGhlcmUgaXMgYWxyZWFkeSBhbiBhbm9ueW1vdXMgdXNlciBzaWduZWQgaW4sIHRoYXQgdXNlciB3aWxsIGJlIHJldHVybmVkOyBvdGhlcndpc2UsIGFcbiAqIG5ldyBhbm9ueW1vdXMgdXNlciBpZGVudGl0eSB3aWxsIGJlIGNyZWF0ZWQgYW5kIHJldHVybmVkLlxuICpcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaWduSW5Bbm9ueW1vdXNseShhdXRoOiBBdXRoKTogUHJvbWlzZTxVc2VyQ3JlZGVudGlhbD4ge1xuICBjb25zdCBhdXRoSW50ZXJuYWwgPSBfY2FzdEF1dGgoYXV0aCk7XG4gIGF3YWl0IGF1dGhJbnRlcm5hbC5faW5pdGlhbGl6YXRpb25Qcm9taXNlO1xuICBpZiAoYXV0aEludGVybmFsLmN1cnJlbnRVc2VyPy5pc0Fub255bW91cykge1xuICAgIC8vIElmIGFuIGFub255bW91cyB1c2VyIGlzIGFscmVhZHkgc2lnbmVkIGluLCBubyBuZWVkIHRvIHNpZ24gdGhlbSBpbiBhZ2Fpbi5cbiAgICByZXR1cm4gbmV3IFVzZXJDcmVkZW50aWFsSW1wbCh7XG4gICAgICB1c2VyOiBhdXRoSW50ZXJuYWwuY3VycmVudFVzZXIgYXMgVXNlckludGVybmFsLFxuICAgICAgcHJvdmlkZXJJZDogbnVsbCxcbiAgICAgIG9wZXJhdGlvblR5cGU6IE9wZXJhdGlvblR5cGUuU0lHTl9JTlxuICAgIH0pO1xuICB9XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2lnblVwKGF1dGhJbnRlcm5hbCwge1xuICAgIHJldHVyblNlY3VyZVRva2VuOiB0cnVlXG4gIH0pO1xuICBjb25zdCB1c2VyQ3JlZGVudGlhbCA9IGF3YWl0IFVzZXJDcmVkZW50aWFsSW1wbC5fZnJvbUlkVG9rZW5SZXNwb25zZShcbiAgICBhdXRoSW50ZXJuYWwsXG4gICAgT3BlcmF0aW9uVHlwZS5TSUdOX0lOLFxuICAgIHJlc3BvbnNlLFxuICAgIHRydWVcbiAgKTtcbiAgYXdhaXQgYXV0aEludGVybmFsLl91cGRhdGVDdXJyZW50VXNlcih1c2VyQ3JlZGVudGlhbC51c2VyKTtcbiAgcmV0dXJuIHVzZXJDcmVkZW50aWFsO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IE11bHRpRmFjdG9yRXJyb3IgYXMgTXVsdGlGYWN0b3JFcnJvclB1YmxpYyB9IGZyb20gJy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5pbXBvcnQgeyBGaXJlYmFzZUVycm9yIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuaW1wb3J0IHsgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vbW9kZWwvYXV0aCc7XG5pbXBvcnQgeyBJZFRva2VuUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbC9pZF90b2tlbic7XG5pbXBvcnQgeyBBdXRoRXJyb3JDb2RlIH0gZnJvbSAnLi4vY29yZS9lcnJvcnMnO1xuaW1wb3J0IHsgVXNlckludGVybmFsIH0gZnJvbSAnLi4vbW9kZWwvdXNlcic7XG5pbXBvcnQgeyBBdXRoQ3JlZGVudGlhbCB9IGZyb20gJy4uL2NvcmUvY3JlZGVudGlhbHMnO1xuaW1wb3J0IHsgSWRUb2tlbk1mYVJlc3BvbnNlIH0gZnJvbSAnLi4vYXBpL2F1dGhlbnRpY2F0aW9uL21mYSc7XG5pbXBvcnQgeyBPcGVyYXRpb25UeXBlIH0gZnJvbSAnLi4vbW9kZWwvZW51bXMnO1xuXG5leHBvcnQgdHlwZSBNdWx0aUZhY3RvckVycm9yRGF0YSA9IE11bHRpRmFjdG9yRXJyb3JQdWJsaWNbJ2N1c3RvbURhdGEnXSAmIHtcbiAgX3NlcnZlclJlc3BvbnNlOiBJZFRva2VuTWZhUmVzcG9uc2U7XG59O1xuXG5leHBvcnQgY2xhc3MgTXVsdGlGYWN0b3JFcnJvclxuICBleHRlbmRzIEZpcmViYXNlRXJyb3JcbiAgaW1wbGVtZW50cyBNdWx0aUZhY3RvckVycm9yUHVibGljXG57XG4gIHJlYWRvbmx5IGN1c3RvbURhdGE6IE11bHRpRmFjdG9yRXJyb3JEYXRhO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoXG4gICAgYXV0aDogQXV0aEludGVybmFsLFxuICAgIGVycm9yOiBGaXJlYmFzZUVycm9yLFxuICAgIHJlYWRvbmx5IG9wZXJhdGlvblR5cGU6IE9wZXJhdGlvblR5cGUsXG4gICAgcmVhZG9ubHkgdXNlcj86IFVzZXJJbnRlcm5hbFxuICApIHtcbiAgICBzdXBlcihlcnJvci5jb2RlLCBlcnJvci5tZXNzYWdlKTtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQtd2lraS9ibG9iL21hc3Rlci9CcmVha2luZy1DaGFuZ2VzLm1kI2V4dGVuZGluZy1idWlsdC1pbnMtbGlrZS1lcnJvci1hcnJheS1hbmQtbWFwLW1heS1uby1sb25nZXItd29ya1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBNdWx0aUZhY3RvckVycm9yLnByb3RvdHlwZSk7XG4gICAgdGhpcy5jdXN0b21EYXRhID0ge1xuICAgICAgYXBwTmFtZTogYXV0aC5uYW1lLFxuICAgICAgdGVuYW50SWQ6IGF1dGgudGVuYW50SWQgPz8gdW5kZWZpbmVkLFxuICAgICAgX3NlcnZlclJlc3BvbnNlOiBlcnJvci5jdXN0b21EYXRhIS5fc2VydmVyUmVzcG9uc2UgYXMgSWRUb2tlbk1mYVJlc3BvbnNlLFxuICAgICAgb3BlcmF0aW9uVHlwZVxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgX2Zyb21FcnJvckFuZE9wZXJhdGlvbihcbiAgICBhdXRoOiBBdXRoSW50ZXJuYWwsXG4gICAgZXJyb3I6IEZpcmViYXNlRXJyb3IsXG4gICAgb3BlcmF0aW9uVHlwZTogT3BlcmF0aW9uVHlwZSxcbiAgICB1c2VyPzogVXNlckludGVybmFsXG4gICk6IE11bHRpRmFjdG9yRXJyb3Ige1xuICAgIHJldHVybiBuZXcgTXVsdGlGYWN0b3JFcnJvcihhdXRoLCBlcnJvciwgb3BlcmF0aW9uVHlwZSwgdXNlcik7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9wcm9jZXNzQ3JlZGVudGlhbFNhdmluZ01mYUNvbnRleHRJZk5lY2Vzc2FyeShcbiAgYXV0aDogQXV0aEludGVybmFsLFxuICBvcGVyYXRpb25UeXBlOiBPcGVyYXRpb25UeXBlLFxuICBjcmVkZW50aWFsOiBBdXRoQ3JlZGVudGlhbCxcbiAgdXNlcj86IFVzZXJJbnRlcm5hbFxuKTogUHJvbWlzZTxJZFRva2VuUmVzcG9uc2U+IHtcbiAgY29uc3QgaWRUb2tlblByb3ZpZGVyID1cbiAgICBvcGVyYXRpb25UeXBlID09PSBPcGVyYXRpb25UeXBlLlJFQVVUSEVOVElDQVRFXG4gICAgICA/IGNyZWRlbnRpYWwuX2dldFJlYXV0aGVudGljYXRpb25SZXNvbHZlcihhdXRoKVxuICAgICAgOiBjcmVkZW50aWFsLl9nZXRJZFRva2VuUmVzcG9uc2UoYXV0aCk7XG5cbiAgcmV0dXJuIGlkVG9rZW5Qcm92aWRlci5jYXRjaChlcnJvciA9PiB7XG4gICAgaWYgKGVycm9yLmNvZGUgPT09IGBhdXRoLyR7QXV0aEVycm9yQ29kZS5NRkFfUkVRVUlSRUR9YCkge1xuICAgICAgdGhyb3cgTXVsdGlGYWN0b3JFcnJvci5fZnJvbUVycm9yQW5kT3BlcmF0aW9uKFxuICAgICAgICBhdXRoLFxuICAgICAgICBlcnJvcixcbiAgICAgICAgb3BlcmF0aW9uVHlwZSxcbiAgICAgICAgdXNlclxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aHJvdyBlcnJvcjtcbiAgfSk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuZXhwb3J0IGludGVyZmFjZSBQcm92aWRlckFzc29jaWF0ZWRPYmplY3Qge1xuICBwcm92aWRlcklkPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRha2VzIGEgc2V0IG9mIFVzZXJJbmZvIHByb3ZpZGVyIGRhdGEgYW5kIGNvbnZlcnRzIGl0IHRvIGEgc2V0IG9mIG5hbWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlckRhdGFBc05hbWVzPFQgZXh0ZW5kcyBQcm92aWRlckFzc29jaWF0ZWRPYmplY3Q+KFxuICBwcm92aWRlckRhdGE6IFRbXVxuKTogU2V0PHN0cmluZz4ge1xuICByZXR1cm4gbmV3IFNldChcbiAgICBwcm92aWRlckRhdGFcbiAgICAgIC5tYXAoKHsgcHJvdmlkZXJJZCB9KSA9PiBwcm92aWRlcklkKVxuICAgICAgLmZpbHRlcihwaWQgPT4gISFwaWQpIGFzIHN0cmluZ1tdXG4gICk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgVXNlciB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbmltcG9ydCB7IGRlbGV0ZUxpbmtlZEFjY291bnRzIH0gZnJvbSAnLi4vLi4vYXBpL2FjY291bnRfbWFuYWdlbWVudC9hY2NvdW50JztcbmltcG9ydCB7IFVzZXJJbnRlcm5hbCwgVXNlckNyZWRlbnRpYWxJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL3VzZXInO1xuaW1wb3J0IHsgQXV0aENyZWRlbnRpYWwgfSBmcm9tICcuLi9jcmVkZW50aWFscyc7XG5pbXBvcnQgeyBBdXRoRXJyb3JDb2RlIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IF9hc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydCc7XG5pbXBvcnQgeyBwcm92aWRlckRhdGFBc05hbWVzIH0gZnJvbSAnLi4vdXRpbC9wcm92aWRlcnMnO1xuaW1wb3J0IHsgX2xvZ291dElmSW52YWxpZGF0ZWQgfSBmcm9tICcuL2ludmFsaWRhdGlvbic7XG5pbXBvcnQgeyBfcmVsb2FkV2l0aG91dFNhdmluZyB9IGZyb20gJy4vcmVsb2FkJztcbmltcG9ydCB7IFVzZXJDcmVkZW50aWFsSW1wbCB9IGZyb20gJy4vdXNlcl9jcmVkZW50aWFsX2ltcGwnO1xuaW1wb3J0IHsgZ2V0TW9kdWxhckluc3RhbmNlIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuaW1wb3J0IHsgT3BlcmF0aW9uVHlwZSwgUHJvdmlkZXJJZCB9IGZyb20gJy4uLy4uL21vZGVsL2VudW1zJztcblxuLyoqXG4gKiBVbmxpbmtzIGEgcHJvdmlkZXIgZnJvbSBhIHVzZXIgYWNjb3VudC5cbiAqXG4gKiBAcGFyYW0gdXNlciAtIFRoZSB1c2VyLlxuICogQHBhcmFtIHByb3ZpZGVySWQgLSBUaGUgcHJvdmlkZXIgdG8gdW5saW5rLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVubGluayh1c2VyOiBVc2VyLCBwcm92aWRlcklkOiBzdHJpbmcpOiBQcm9taXNlPFVzZXI+IHtcbiAgY29uc3QgdXNlckludGVybmFsID0gZ2V0TW9kdWxhckluc3RhbmNlKHVzZXIpIGFzIFVzZXJJbnRlcm5hbDtcbiAgYXdhaXQgX2Fzc2VydExpbmtlZFN0YXR1cyh0cnVlLCB1c2VySW50ZXJuYWwsIHByb3ZpZGVySWQpO1xuICBjb25zdCB7IHByb3ZpZGVyVXNlckluZm8gfSA9IGF3YWl0IGRlbGV0ZUxpbmtlZEFjY291bnRzKHVzZXJJbnRlcm5hbC5hdXRoLCB7XG4gICAgaWRUb2tlbjogYXdhaXQgdXNlckludGVybmFsLmdldElkVG9rZW4oKSxcbiAgICBkZWxldGVQcm92aWRlcjogW3Byb3ZpZGVySWRdXG4gIH0pO1xuXG4gIGNvbnN0IHByb3ZpZGVyc0xlZnQgPSBwcm92aWRlckRhdGFBc05hbWVzKHByb3ZpZGVyVXNlckluZm8gfHwgW10pO1xuXG4gIHVzZXJJbnRlcm5hbC5wcm92aWRlckRhdGEgPSB1c2VySW50ZXJuYWwucHJvdmlkZXJEYXRhLmZpbHRlcihwZCA9PlxuICAgIHByb3ZpZGVyc0xlZnQuaGFzKHBkLnByb3ZpZGVySWQpXG4gICk7XG4gIGlmICghcHJvdmlkZXJzTGVmdC5oYXMoUHJvdmlkZXJJZC5QSE9ORSkpIHtcbiAgICB1c2VySW50ZXJuYWwucGhvbmVOdW1iZXIgPSBudWxsO1xuICB9XG5cbiAgYXdhaXQgdXNlckludGVybmFsLmF1dGguX3BlcnNpc3RVc2VySWZDdXJyZW50KHVzZXJJbnRlcm5hbCk7XG4gIHJldHVybiB1c2VySW50ZXJuYWw7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBfbGluayhcbiAgdXNlcjogVXNlckludGVybmFsLFxuICBjcmVkZW50aWFsOiBBdXRoQ3JlZGVudGlhbCxcbiAgYnlwYXNzQXV0aFN0YXRlID0gZmFsc2Vcbik6IFByb21pc2U8VXNlckNyZWRlbnRpYWxJbnRlcm5hbD4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IF9sb2dvdXRJZkludmFsaWRhdGVkKFxuICAgIHVzZXIsXG4gICAgY3JlZGVudGlhbC5fbGlua1RvSWRUb2tlbih1c2VyLmF1dGgsIGF3YWl0IHVzZXIuZ2V0SWRUb2tlbigpKSxcbiAgICBieXBhc3NBdXRoU3RhdGVcbiAgKTtcbiAgcmV0dXJuIFVzZXJDcmVkZW50aWFsSW1wbC5fZm9yT3BlcmF0aW9uKHVzZXIsIE9wZXJhdGlvblR5cGUuTElOSywgcmVzcG9uc2UpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gX2Fzc2VydExpbmtlZFN0YXR1cyhcbiAgZXhwZWN0ZWQ6IGJvb2xlYW4sXG4gIHVzZXI6IFVzZXJJbnRlcm5hbCxcbiAgcHJvdmlkZXI6IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IF9yZWxvYWRXaXRob3V0U2F2aW5nKHVzZXIpO1xuICBjb25zdCBwcm92aWRlcklkcyA9IHByb3ZpZGVyRGF0YUFzTmFtZXModXNlci5wcm92aWRlckRhdGEpO1xuXG4gIGNvbnN0IGNvZGUgPVxuICAgIGV4cGVjdGVkID09PSBmYWxzZVxuICAgICAgPyBBdXRoRXJyb3JDb2RlLlBST1ZJREVSX0FMUkVBRFlfTElOS0VEXG4gICAgICA6IEF1dGhFcnJvckNvZGUuTk9fU1VDSF9QUk9WSURFUjtcbiAgX2Fzc2VydChwcm92aWRlcklkcy5oYXMocHJvdmlkZXIpID09PSBleHBlY3RlZCwgdXNlci5hdXRoLCBjb2RlKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBGaXJlYmFzZUVycm9yIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuaW1wb3J0IHsgX3Byb2Nlc3NDcmVkZW50aWFsU2F2aW5nTWZhQ29udGV4dElmTmVjZXNzYXJ5IH0gZnJvbSAnLi4vLi4vbWZhL21mYV9lcnJvcic7XG5pbXBvcnQgeyBPcGVyYXRpb25UeXBlIH0gZnJvbSAnLi4vLi4vbW9kZWwvZW51bXMnO1xuaW1wb3J0IHsgVXNlckludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvdXNlcic7XG5pbXBvcnQgeyBBdXRoQ3JlZGVudGlhbCB9IGZyb20gJy4uL2NyZWRlbnRpYWxzJztcbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgX2Fzc2VydCwgX2ZhaWwgfSBmcm9tICcuLi91dGlsL2Fzc2VydCc7XG5pbXBvcnQgeyBfcGFyc2VUb2tlbiB9IGZyb20gJy4vaWRfdG9rZW5fcmVzdWx0JztcbmltcG9ydCB7IF9sb2dvdXRJZkludmFsaWRhdGVkIH0gZnJvbSAnLi9pbnZhbGlkYXRpb24nO1xuaW1wb3J0IHsgVXNlckNyZWRlbnRpYWxJbXBsIH0gZnJvbSAnLi91c2VyX2NyZWRlbnRpYWxfaW1wbCc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBfcmVhdXRoZW50aWNhdGUoXG4gIHVzZXI6IFVzZXJJbnRlcm5hbCxcbiAgY3JlZGVudGlhbDogQXV0aENyZWRlbnRpYWwsXG4gIGJ5cGFzc0F1dGhTdGF0ZSA9IGZhbHNlXG4pOiBQcm9taXNlPFVzZXJDcmVkZW50aWFsSW1wbD4ge1xuICBjb25zdCB7IGF1dGggfSA9IHVzZXI7XG4gIGNvbnN0IG9wZXJhdGlvblR5cGUgPSBPcGVyYXRpb25UeXBlLlJFQVVUSEVOVElDQVRFO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBfbG9nb3V0SWZJbnZhbGlkYXRlZChcbiAgICAgIHVzZXIsXG4gICAgICBfcHJvY2Vzc0NyZWRlbnRpYWxTYXZpbmdNZmFDb250ZXh0SWZOZWNlc3NhcnkoXG4gICAgICAgIGF1dGgsXG4gICAgICAgIG9wZXJhdGlvblR5cGUsXG4gICAgICAgIGNyZWRlbnRpYWwsXG4gICAgICAgIHVzZXJcbiAgICAgICksXG4gICAgICBieXBhc3NBdXRoU3RhdGVcbiAgICApO1xuICAgIF9hc3NlcnQocmVzcG9uc2UuaWRUb2tlbiwgYXV0aCwgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG4gICAgY29uc3QgcGFyc2VkID0gX3BhcnNlVG9rZW4ocmVzcG9uc2UuaWRUb2tlbik7XG4gICAgX2Fzc2VydChwYXJzZWQsIGF1dGgsIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IpO1xuXG4gICAgY29uc3QgeyBzdWI6IGxvY2FsSWQgfSA9IHBhcnNlZDtcbiAgICBfYXNzZXJ0KHVzZXIudWlkID09PSBsb2NhbElkLCBhdXRoLCBBdXRoRXJyb3JDb2RlLlVTRVJfTUlTTUFUQ0gpO1xuXG4gICAgcmV0dXJuIFVzZXJDcmVkZW50aWFsSW1wbC5fZm9yT3BlcmF0aW9uKHVzZXIsIG9wZXJhdGlvblR5cGUsIHJlc3BvbnNlKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIENvbnZlcnQgdXNlciBkZWxldGVkIGVycm9yIGludG8gdXNlciBtaXNtYXRjaFxuICAgIGlmICgoZSBhcyBGaXJlYmFzZUVycm9yKT8uY29kZSA9PT0gYGF1dGgvJHtBdXRoRXJyb3JDb2RlLlVTRVJfREVMRVRFRH1gKSB7XG4gICAgICBfZmFpbChhdXRoLCBBdXRoRXJyb3JDb2RlLlVTRVJfTUlTTUFUQ0gpO1xuICAgIH1cbiAgICB0aHJvdyBlO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgVXNlckNyZWRlbnRpYWwsIEF1dGgsIFVzZXIgfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuXG5pbXBvcnQgeyBfcHJvY2Vzc0NyZWRlbnRpYWxTYXZpbmdNZmFDb250ZXh0SWZOZWNlc3NhcnkgfSBmcm9tICcuLi8uLi9tZmEvbWZhX2Vycm9yJztcbmltcG9ydCB7IEF1dGhJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL2F1dGgnO1xuaW1wb3J0IHsgVXNlckludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvdXNlcic7XG5pbXBvcnQgeyBBdXRoQ3JlZGVudGlhbCB9IGZyb20gJy4uL2NyZWRlbnRpYWxzJztcbmltcG9ydCB7IF9hc3NlcnRMaW5rZWRTdGF0dXMsIF9saW5rIH0gZnJvbSAnLi4vdXNlci9saW5rX3VubGluayc7XG5pbXBvcnQgeyBfcmVhdXRoZW50aWNhdGUgfSBmcm9tICcuLi91c2VyL3JlYXV0aGVudGljYXRlJztcbmltcG9ydCB7IFVzZXJDcmVkZW50aWFsSW1wbCB9IGZyb20gJy4uL3VzZXIvdXNlcl9jcmVkZW50aWFsX2ltcGwnO1xuaW1wb3J0IHsgX2Nhc3RBdXRoIH0gZnJvbSAnLi4vYXV0aC9hdXRoX2ltcGwnO1xuaW1wb3J0IHsgZ2V0TW9kdWxhckluc3RhbmNlIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuaW1wb3J0IHsgT3BlcmF0aW9uVHlwZSB9IGZyb20gJy4uLy4uL21vZGVsL2VudW1zJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF9zaWduSW5XaXRoQ3JlZGVudGlhbChcbiAgYXV0aDogQXV0aEludGVybmFsLFxuICBjcmVkZW50aWFsOiBBdXRoQ3JlZGVudGlhbCxcbiAgYnlwYXNzQXV0aFN0YXRlID0gZmFsc2Vcbik6IFByb21pc2U8VXNlckNyZWRlbnRpYWw+IHtcbiAgY29uc3Qgb3BlcmF0aW9uVHlwZSA9IE9wZXJhdGlvblR5cGUuU0lHTl9JTjtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBfcHJvY2Vzc0NyZWRlbnRpYWxTYXZpbmdNZmFDb250ZXh0SWZOZWNlc3NhcnkoXG4gICAgYXV0aCxcbiAgICBvcGVyYXRpb25UeXBlLFxuICAgIGNyZWRlbnRpYWxcbiAgKTtcbiAgY29uc3QgdXNlckNyZWRlbnRpYWwgPSBhd2FpdCBVc2VyQ3JlZGVudGlhbEltcGwuX2Zyb21JZFRva2VuUmVzcG9uc2UoXG4gICAgYXV0aCxcbiAgICBvcGVyYXRpb25UeXBlLFxuICAgIHJlc3BvbnNlXG4gICk7XG5cbiAgaWYgKCFieXBhc3NBdXRoU3RhdGUpIHtcbiAgICBhd2FpdCBhdXRoLl91cGRhdGVDdXJyZW50VXNlcih1c2VyQ3JlZGVudGlhbC51c2VyKTtcbiAgfVxuICByZXR1cm4gdXNlckNyZWRlbnRpYWw7XG59XG5cbi8qKlxuICogQXN5bmNocm9ub3VzbHkgc2lnbnMgaW4gd2l0aCB0aGUgZ2l2ZW4gY3JlZGVudGlhbHMuXG4gKlxuICogQHJlbWFya3NcbiAqIEFuIHtAbGluayBBdXRoUHJvdmlkZXJ9IGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjcmVkZW50aWFsLlxuICpcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cbiAqIEBwYXJhbSBjcmVkZW50aWFsIC0gVGhlIGF1dGggY3JlZGVudGlhbC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaWduSW5XaXRoQ3JlZGVudGlhbChcbiAgYXV0aDogQXV0aCxcbiAgY3JlZGVudGlhbDogQXV0aENyZWRlbnRpYWxcbik6IFByb21pc2U8VXNlckNyZWRlbnRpYWw+IHtcbiAgcmV0dXJuIF9zaWduSW5XaXRoQ3JlZGVudGlhbChfY2FzdEF1dGgoYXV0aCksIGNyZWRlbnRpYWwpO1xufVxuXG4vKipcbiAqIExpbmtzIHRoZSB1c2VyIGFjY291bnQgd2l0aCB0aGUgZ2l2ZW4gY3JlZGVudGlhbHMuXG4gKlxuICogQHJlbWFya3NcbiAqIEFuIHtAbGluayBBdXRoUHJvdmlkZXJ9IGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjcmVkZW50aWFsLlxuICpcbiAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIuXG4gKiBAcGFyYW0gY3JlZGVudGlhbCAtIFRoZSBhdXRoIGNyZWRlbnRpYWwuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlua1dpdGhDcmVkZW50aWFsKFxuICB1c2VyOiBVc2VyLFxuICBjcmVkZW50aWFsOiBBdXRoQ3JlZGVudGlhbFxuKTogUHJvbWlzZTxVc2VyQ3JlZGVudGlhbD4ge1xuICBjb25zdCB1c2VySW50ZXJuYWwgPSBnZXRNb2R1bGFySW5zdGFuY2UodXNlcikgYXMgVXNlckludGVybmFsO1xuXG4gIGF3YWl0IF9hc3NlcnRMaW5rZWRTdGF0dXMoZmFsc2UsIHVzZXJJbnRlcm5hbCwgY3JlZGVudGlhbC5wcm92aWRlcklkKTtcblxuICByZXR1cm4gX2xpbmsodXNlckludGVybmFsLCBjcmVkZW50aWFsKTtcbn1cblxuLyoqXG4gKiBSZS1hdXRoZW50aWNhdGVzIGEgdXNlciB1c2luZyBhIGZyZXNoIGNyZWRlbnRpYWwuXG4gKlxuICogQHJlbWFya3NcbiAqIFVzZSBiZWZvcmUgb3BlcmF0aW9ucyBzdWNoIGFzIHtAbGluayB1cGRhdGVQYXNzd29yZH0gdGhhdCByZXF1aXJlIHRva2VucyBmcm9tIHJlY2VudCBzaWduLWluXG4gKiBhdHRlbXB0cy4gVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gcmVjb3ZlciBmcm9tIGEgYENSRURFTlRJQUxfVE9PX09MRF9MT0dJTl9BR0FJTmAgZXJyb3JcbiAqIG9yIGEgYFRPS0VOX0VYUElSRURgIGVycm9yLlxuICpcbiAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIuXG4gKiBAcGFyYW0gY3JlZGVudGlhbCAtIFRoZSBhdXRoIGNyZWRlbnRpYWwuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhdXRoZW50aWNhdGVXaXRoQ3JlZGVudGlhbChcbiAgdXNlcjogVXNlcixcbiAgY3JlZGVudGlhbDogQXV0aENyZWRlbnRpYWxcbik6IFByb21pc2U8VXNlckNyZWRlbnRpYWw+IHtcbiAgcmV0dXJuIF9yZWF1dGhlbnRpY2F0ZShnZXRNb2R1bGFySW5zdGFuY2UodXNlcikgYXMgVXNlckludGVybmFsLCBjcmVkZW50aWFsKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge1xuICBFbmRwb2ludCxcbiAgSHR0cE1ldGhvZCxcbiAgX2FkZFRpZElmTmVjZXNzYXJ5LFxuICBfcGVyZm9ybVNpZ25JblJlcXVlc3Rcbn0gZnJvbSAnLi4vaW5kZXgnO1xuaW1wb3J0IHsgSWRUb2tlblJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vbW9kZWwvaWRfdG9rZW4nO1xuaW1wb3J0IHsgQXV0aCB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbkluV2l0aEN1c3RvbVRva2VuUmVxdWVzdCB7XG4gIHRva2VuOiBzdHJpbmc7XG4gIHJldHVyblNlY3VyZVRva2VuOiBib29sZWFuO1xuICB0ZW5hbnRJZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaWduSW5XaXRoQ3VzdG9tVG9rZW5SZXNwb25zZSBleHRlbmRzIElkVG9rZW5SZXNwb25zZSB7fVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2lnbkluV2l0aEN1c3RvbVRva2VuKFxuICBhdXRoOiBBdXRoLFxuICByZXF1ZXN0OiBTaWduSW5XaXRoQ3VzdG9tVG9rZW5SZXF1ZXN0XG4pOiBQcm9taXNlPFNpZ25JbldpdGhDdXN0b21Ub2tlblJlc3BvbnNlPiB7XG4gIHJldHVybiBfcGVyZm9ybVNpZ25JblJlcXVlc3Q8XG4gICAgU2lnbkluV2l0aEN1c3RvbVRva2VuUmVxdWVzdCxcbiAgICBTaWduSW5XaXRoQ3VzdG9tVG9rZW5SZXNwb25zZVxuICA+KFxuICAgIGF1dGgsXG4gICAgSHR0cE1ldGhvZC5QT1NULFxuICAgIEVuZHBvaW50LlNJR05fSU5fV0lUSF9DVVNUT01fVE9LRU4sXG4gICAgX2FkZFRpZElmTmVjZXNzYXJ5KGF1dGgsIHJlcXVlc3QpXG4gICk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgQXV0aCwgVXNlckNyZWRlbnRpYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuXG5pbXBvcnQgeyBzaWduSW5XaXRoQ3VzdG9tVG9rZW4gYXMgZ2V0SWRUb2tlblJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vYXBpL2F1dGhlbnRpY2F0aW9uL2N1c3RvbV90b2tlbic7XG5pbXBvcnQgeyBJZFRva2VuUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9tb2RlbC9pZF90b2tlbic7XG5pbXBvcnQgeyBVc2VyQ3JlZGVudGlhbEltcGwgfSBmcm9tICcuLi91c2VyL3VzZXJfY3JlZGVudGlhbF9pbXBsJztcbmltcG9ydCB7IF9jYXN0QXV0aCB9IGZyb20gJy4uL2F1dGgvYXV0aF9pbXBsJztcbmltcG9ydCB7IE9wZXJhdGlvblR5cGUgfSBmcm9tICcuLi8uLi9tb2RlbC9lbnVtcyc7XG5cbi8qKlxuICogQXN5bmNocm9ub3VzbHkgc2lnbnMgaW4gdXNpbmcgYSBjdXN0b20gdG9rZW4uXG4gKlxuICogQHJlbWFya3NcbiAqIEN1c3RvbSB0b2tlbnMgYXJlIHVzZWQgdG8gaW50ZWdyYXRlIEZpcmViYXNlIEF1dGggd2l0aCBleGlzdGluZyBhdXRoIHN5c3RlbXMsIGFuZCBtdXN0XG4gKiBiZSBnZW5lcmF0ZWQgYnkgYW4gYXV0aCBiYWNrZW5kIHVzaW5nIHRoZVxuICoge0BsaW5rIGh0dHBzOi8vZmlyZWJhc2UuZ29vZ2xlLmNvbS9kb2NzL3JlZmVyZW5jZS9hZG1pbi9ub2RlL2FkbWluLmF1dGguQXV0aCNjcmVhdGVjdXN0b210b2tlbiB8IGNyZWF0ZUN1c3RvbVRva2VufVxuICogbWV0aG9kIGluIHRoZSB7QGxpbmsgaHR0cHM6Ly9maXJlYmFzZS5nb29nbGUuY29tL2RvY3MvYXV0aC9hZG1pbiB8IEFkbWluIFNES30gLlxuICpcbiAqIEZhaWxzIHdpdGggYW4gZXJyb3IgaWYgdGhlIHRva2VuIGlzIGludmFsaWQsIGV4cGlyZWQsIG9yIG5vdCBhY2NlcHRlZCBieSB0aGUgRmlyZWJhc2UgQXV0aCBzZXJ2aWNlLlxuICpcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cbiAqIEBwYXJhbSBjdXN0b21Ub2tlbiAtIFRoZSBjdXN0b20gdG9rZW4gdG8gc2lnbiBpbiB3aXRoLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNpZ25JbldpdGhDdXN0b21Ub2tlbihcbiAgYXV0aDogQXV0aCxcbiAgY3VzdG9tVG9rZW46IHN0cmluZ1xuKTogUHJvbWlzZTxVc2VyQ3JlZGVudGlhbD4ge1xuICBjb25zdCBhdXRoSW50ZXJuYWwgPSBfY2FzdEF1dGgoYXV0aCk7XG4gIGNvbnN0IHJlc3BvbnNlOiBJZFRva2VuUmVzcG9uc2UgPSBhd2FpdCBnZXRJZFRva2VuUmVzcG9uc2UoYXV0aEludGVybmFsLCB7XG4gICAgdG9rZW46IGN1c3RvbVRva2VuLFxuICAgIHJldHVyblNlY3VyZVRva2VuOiB0cnVlXG4gIH0pO1xuICBjb25zdCBjcmVkID0gYXdhaXQgVXNlckNyZWRlbnRpYWxJbXBsLl9mcm9tSWRUb2tlblJlc3BvbnNlKFxuICAgIGF1dGhJbnRlcm5hbCxcbiAgICBPcGVyYXRpb25UeXBlLlNJR05fSU4sXG4gICAgcmVzcG9uc2VcbiAgKTtcbiAgYXdhaXQgYXV0aEludGVybmFsLl91cGRhdGVDdXJyZW50VXNlcihjcmVkLnVzZXIpO1xuICByZXR1cm4gY3JlZDtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge1xuICBGYWN0b3JJZCxcbiAgTXVsdGlGYWN0b3JJbmZvLFxuICBQaG9uZU11bHRpRmFjdG9ySW5mbyxcbiAgVG90cE11bHRpRmFjdG9ySW5mb1xufSBmcm9tICcuLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuaW1wb3J0IHtcbiAgUGhvbmVNZmFFbnJvbGxtZW50LFxuICBNZmFFbnJvbGxtZW50LFxuICBUb3RwTWZhRW5yb2xsbWVudFxufSBmcm9tICcuLi9hcGkvYWNjb3VudF9tYW5hZ2VtZW50L21mYSc7XG5pbXBvcnQgeyBBdXRoRXJyb3JDb2RlIH0gZnJvbSAnLi4vY29yZS9lcnJvcnMnO1xuaW1wb3J0IHsgX2ZhaWwgfSBmcm9tICcuLi9jb3JlL3V0aWwvYXNzZXJ0JztcbmltcG9ydCB7IEF1dGhJbnRlcm5hbCB9IGZyb20gJy4uL21vZGVsL2F1dGgnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTXVsdGlGYWN0b3JJbmZvSW1wbCBpbXBsZW1lbnRzIE11bHRpRmFjdG9ySW5mbyB7XG4gIHJlYWRvbmx5IHVpZDogc3RyaW5nO1xuICByZWFkb25seSBkaXNwbGF5TmFtZT86IHN0cmluZyB8IG51bGw7XG4gIHJlYWRvbmx5IGVucm9sbG1lbnRUaW1lOiBzdHJpbmc7XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHJlYWRvbmx5IGZhY3RvcklkOiBGYWN0b3JJZCwgcmVzcG9uc2U6IE1mYUVucm9sbG1lbnQpIHtcbiAgICB0aGlzLnVpZCA9IHJlc3BvbnNlLm1mYUVucm9sbG1lbnRJZDtcbiAgICB0aGlzLmVucm9sbG1lbnRUaW1lID0gbmV3IERhdGUocmVzcG9uc2UuZW5yb2xsZWRBdCkudG9VVENTdHJpbmcoKTtcbiAgICB0aGlzLmRpc3BsYXlOYW1lID0gcmVzcG9uc2UuZGlzcGxheU5hbWU7XG4gIH1cblxuICBzdGF0aWMgX2Zyb21TZXJ2ZXJSZXNwb25zZShcbiAgICBhdXRoOiBBdXRoSW50ZXJuYWwsXG4gICAgZW5yb2xsbWVudDogTWZhRW5yb2xsbWVudFxuICApOiBNdWx0aUZhY3RvckluZm9JbXBsIHtcbiAgICBpZiAoJ3Bob25lSW5mbycgaW4gZW5yb2xsbWVudCkge1xuICAgICAgcmV0dXJuIFBob25lTXVsdGlGYWN0b3JJbmZvSW1wbC5fZnJvbVNlcnZlclJlc3BvbnNlKGF1dGgsIGVucm9sbG1lbnQpO1xuICAgIH0gZWxzZSBpZiAoJ3RvdHBJbmZvJyBpbiBlbnJvbGxtZW50KSB7XG4gICAgICByZXR1cm4gVG90cE11bHRpRmFjdG9ySW5mb0ltcGwuX2Zyb21TZXJ2ZXJSZXNwb25zZShhdXRoLCBlbnJvbGxtZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIF9mYWlsKGF1dGgsIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQaG9uZU11bHRpRmFjdG9ySW5mb0ltcGxcbiAgZXh0ZW5kcyBNdWx0aUZhY3RvckluZm9JbXBsXG4gIGltcGxlbWVudHMgUGhvbmVNdWx0aUZhY3RvckluZm9cbntcbiAgcmVhZG9ubHkgcGhvbmVOdW1iZXI6IHN0cmluZztcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHJlc3BvbnNlOiBQaG9uZU1mYUVucm9sbG1lbnQpIHtcbiAgICBzdXBlcihGYWN0b3JJZC5QSE9ORSwgcmVzcG9uc2UpO1xuICAgIHRoaXMucGhvbmVOdW1iZXIgPSByZXNwb25zZS5waG9uZUluZm87XG4gIH1cblxuICBzdGF0aWMgX2Zyb21TZXJ2ZXJSZXNwb25zZShcbiAgICBfYXV0aDogQXV0aEludGVybmFsLFxuICAgIGVucm9sbG1lbnQ6IE1mYUVucm9sbG1lbnRcbiAgKTogUGhvbmVNdWx0aUZhY3RvckluZm9JbXBsIHtcbiAgICByZXR1cm4gbmV3IFBob25lTXVsdGlGYWN0b3JJbmZvSW1wbChlbnJvbGxtZW50IGFzIFBob25lTWZhRW5yb2xsbWVudCk7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBUb3RwTXVsdGlGYWN0b3JJbmZvSW1wbFxuICBleHRlbmRzIE11bHRpRmFjdG9ySW5mb0ltcGxcbiAgaW1wbGVtZW50cyBUb3RwTXVsdGlGYWN0b3JJbmZvXG57XG4gIHByaXZhdGUgY29uc3RydWN0b3IocmVzcG9uc2U6IFRvdHBNZmFFbnJvbGxtZW50KSB7XG4gICAgc3VwZXIoRmFjdG9ySWQuVE9UUCwgcmVzcG9uc2UpO1xuICB9XG5cbiAgc3RhdGljIF9mcm9tU2VydmVyUmVzcG9uc2UoXG4gICAgX2F1dGg6IEF1dGhJbnRlcm5hbCxcbiAgICBlbnJvbGxtZW50OiBNZmFFbnJvbGxtZW50XG4gICk6IFRvdHBNdWx0aUZhY3RvckluZm9JbXBsIHtcbiAgICByZXR1cm4gbmV3IFRvdHBNdWx0aUZhY3RvckluZm9JbXBsKGVucm9sbG1lbnQgYXMgVG90cE1mYUVucm9sbG1lbnQpO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgQWN0aW9uQ29kZVNldHRpbmdzLCBBdXRoIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcblxuaW1wb3J0IHsgR2V0T29iQ29kZVJlcXVlc3QgfSBmcm9tICcuLi8uLi9hcGkvYXV0aGVudGljYXRpb24vZW1haWxfYW5kX3Bhc3N3b3JkJztcbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgX2Fzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0JztcblxuZXhwb3J0IGZ1bmN0aW9uIF9zZXRBY3Rpb25Db2RlU2V0dGluZ3NPblJlcXVlc3QoXG4gIGF1dGg6IEF1dGgsXG4gIHJlcXVlc3Q6IEdldE9vYkNvZGVSZXF1ZXN0LFxuICBhY3Rpb25Db2RlU2V0dGluZ3M6IEFjdGlvbkNvZGVTZXR0aW5nc1xuKTogdm9pZCB7XG4gIF9hc3NlcnQoXG4gICAgYWN0aW9uQ29kZVNldHRpbmdzLnVybD8ubGVuZ3RoID4gMCxcbiAgICBhdXRoLFxuICAgIEF1dGhFcnJvckNvZGUuSU5WQUxJRF9DT05USU5VRV9VUklcbiAgKTtcbiAgX2Fzc2VydChcbiAgICB0eXBlb2YgYWN0aW9uQ29kZVNldHRpbmdzLmR5bmFtaWNMaW5rRG9tYWluID09PSAndW5kZWZpbmVkJyB8fFxuICAgICAgYWN0aW9uQ29kZVNldHRpbmdzLmR5bmFtaWNMaW5rRG9tYWluLmxlbmd0aCA+IDAsXG4gICAgYXV0aCxcbiAgICBBdXRoRXJyb3JDb2RlLklOVkFMSURfRFlOQU1JQ19MSU5LX0RPTUFJTlxuICApO1xuXG4gIHJlcXVlc3QuY29udGludWVVcmwgPSBhY3Rpb25Db2RlU2V0dGluZ3MudXJsO1xuICByZXF1ZXN0LmR5bmFtaWNMaW5rRG9tYWluID0gYWN0aW9uQ29kZVNldHRpbmdzLmR5bmFtaWNMaW5rRG9tYWluO1xuICByZXF1ZXN0LmNhbkhhbmRsZUNvZGVJbkFwcCA9IGFjdGlvbkNvZGVTZXR0aW5ncy5oYW5kbGVDb2RlSW5BcHA7XG5cbiAgaWYgKGFjdGlvbkNvZGVTZXR0aW5ncy5pT1MpIHtcbiAgICBfYXNzZXJ0KFxuICAgICAgYWN0aW9uQ29kZVNldHRpbmdzLmlPUy5idW5kbGVJZC5sZW5ndGggPiAwLFxuICAgICAgYXV0aCxcbiAgICAgIEF1dGhFcnJvckNvZGUuTUlTU0lOR19JT1NfQlVORExFX0lEXG4gICAgKTtcbiAgICByZXF1ZXN0LmlPU0J1bmRsZUlkID0gYWN0aW9uQ29kZVNldHRpbmdzLmlPUy5idW5kbGVJZDtcbiAgfVxuXG4gIGlmIChhY3Rpb25Db2RlU2V0dGluZ3MuYW5kcm9pZCkge1xuICAgIF9hc3NlcnQoXG4gICAgICBhY3Rpb25Db2RlU2V0dGluZ3MuYW5kcm9pZC5wYWNrYWdlTmFtZS5sZW5ndGggPiAwLFxuICAgICAgYXV0aCxcbiAgICAgIEF1dGhFcnJvckNvZGUuTUlTU0lOR19BTkRST0lEX1BBQ0tBR0VfTkFNRVxuICAgICk7XG4gICAgcmVxdWVzdC5hbmRyb2lkSW5zdGFsbEFwcCA9IGFjdGlvbkNvZGVTZXR0aW5ncy5hbmRyb2lkLmluc3RhbGxBcHA7XG4gICAgcmVxdWVzdC5hbmRyb2lkTWluaW11bVZlcnNpb25Db2RlID1cbiAgICAgIGFjdGlvbkNvZGVTZXR0aW5ncy5hbmRyb2lkLm1pbmltdW1WZXJzaW9uO1xuICAgIHJlcXVlc3QuYW5kcm9pZFBhY2thZ2VOYW1lID0gYWN0aW9uQ29kZVNldHRpbmdzLmFuZHJvaWQucGFja2FnZU5hbWU7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge1xuICBBY3Rpb25Db2RlSW5mbyxcbiAgQWN0aW9uQ29kZU9wZXJhdGlvbixcbiAgQWN0aW9uQ29kZVNldHRpbmdzLFxuICBBdXRoLFxuICBVc2VyQ3JlZGVudGlhbFxufSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuXG5pbXBvcnQgKiBhcyBhY2NvdW50IGZyb20gJy4uLy4uL2FwaS9hY2NvdW50X21hbmFnZW1lbnQvZW1haWxfYW5kX3Bhc3N3b3JkJztcbmltcG9ydCAqIGFzIGF1dGhlbnRpY2F0aW9uIGZyb20gJy4uLy4uL2FwaS9hdXRoZW50aWNhdGlvbi9lbWFpbF9hbmRfcGFzc3dvcmQnO1xuaW1wb3J0IHsgc2lnblVwLCBTaWduVXBSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vYXBpL2F1dGhlbnRpY2F0aW9uL3NpZ25fdXAnO1xuaW1wb3J0IHsgTXVsdGlGYWN0b3JJbmZvSW1wbCB9IGZyb20gJy4uLy4uL21mYS9tZmFfaW5mbyc7XG5pbXBvcnQgeyBFbWFpbEF1dGhQcm92aWRlciB9IGZyb20gJy4uL3Byb3ZpZGVycy9lbWFpbCc7XG5pbXBvcnQgeyBVc2VyQ3JlZGVudGlhbEltcGwgfSBmcm9tICcuLi91c2VyL3VzZXJfY3JlZGVudGlhbF9pbXBsJztcbmltcG9ydCB7IF9hc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydCc7XG5pbXBvcnQgeyBfc2V0QWN0aW9uQ29kZVNldHRpbmdzT25SZXF1ZXN0IH0gZnJvbSAnLi9hY3Rpb25fY29kZV9zZXR0aW5ncyc7XG5pbXBvcnQgeyBzaWduSW5XaXRoQ3JlZGVudGlhbCB9IGZyb20gJy4vY3JlZGVudGlhbCc7XG5pbXBvcnQgeyBfY2FzdEF1dGggfSBmcm9tICcuLi9hdXRoL2F1dGhfaW1wbCc7XG5pbXBvcnQgeyBBdXRoRXJyb3JDb2RlIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IGdldE1vZHVsYXJJbnN0YW5jZSB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcbmltcG9ydCB7IE9wZXJhdGlvblR5cGUgfSBmcm9tICcuLi8uLi9tb2RlbC9lbnVtcyc7XG5pbXBvcnQgeyBoYW5kbGVSZWNhcHRjaGFGbG93IH0gZnJvbSAnLi4vLi4vcGxhdGZvcm1fYnJvd3Nlci9yZWNhcHRjaGEvcmVjYXB0Y2hhX2VudGVycHJpc2VfdmVyaWZpZXInO1xuaW1wb3J0IHsgSWRUb2tlblJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vbW9kZWwvaWRfdG9rZW4nO1xuaW1wb3J0IHsgUmVjYXB0Y2hhQWN0aW9uTmFtZSwgUmVjYXB0Y2hhQ2xpZW50VHlwZSB9IGZyb20gJy4uLy4uL2FwaSc7XG5cbi8qKlxuICogVXBkYXRlcyB0aGUgcGFzc3dvcmQgcG9saWN5IGNhY2hlZCBpbiB0aGUge0BsaW5rIEF1dGh9IGluc3RhbmNlIGlmIGEgcG9saWN5IGlzIGFscmVhZHlcbiAqIGNhY2hlZCBmb3IgdGhlIHByb2plY3Qgb3IgdGVuYW50LlxuICpcbiAqIEByZW1hcmtzXG4gKiBXZSBvbmx5IGZldGNoIHRoZSBwYXNzd29yZCBwb2xpY3kgaWYgdGhlIHBhc3N3b3JkIGRpZCBub3QgbWVldCBwb2xpY3kgcmVxdWlyZW1lbnRzIGFuZFxuICogdGhlcmUgaXMgYW4gZXhpc3RpbmcgcG9saWN5IGNhY2hlZC4gQSBkZXZlbG9wZXIgbXVzdCBjYWxsIHZhbGlkYXRlUGFzc3dvcmQgYXQgbGVhc3RcbiAqIG9uY2UgZm9yIHRoZSBjYWNoZSB0byBiZSBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQuXG4gKlxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlY2FjaGVQYXNzd29yZFBvbGljeShhdXRoOiBBdXRoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGF1dGhJbnRlcm5hbCA9IF9jYXN0QXV0aChhdXRoKTtcbiAgaWYgKGF1dGhJbnRlcm5hbC5fZ2V0UGFzc3dvcmRQb2xpY3lJbnRlcm5hbCgpKSB7XG4gICAgYXdhaXQgYXV0aEludGVybmFsLl91cGRhdGVQYXNzd29yZFBvbGljeSgpO1xuICB9XG59XG5cbi8qKlxuICogU2VuZHMgYSBwYXNzd29yZCByZXNldCBlbWFpbCB0byB0aGUgZ2l2ZW4gZW1haWwgYWRkcmVzcy5cbiAqXG4gKiBAcmVtYXJrc1xuICogVG8gY29tcGxldGUgdGhlIHBhc3N3b3JkIHJlc2V0LCBjYWxsIHtAbGluayBjb25maXJtUGFzc3dvcmRSZXNldH0gd2l0aCB0aGUgY29kZSBzdXBwbGllZCBpblxuICogdGhlIGVtYWlsIHNlbnQgdG8gdGhlIHVzZXIsIGFsb25nIHdpdGggdGhlIG5ldyBwYXNzd29yZCBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGNvbnN0IGFjdGlvbkNvZGVTZXR0aW5ncyA9IHtcbiAqICAgdXJsOiAnaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vP2VtYWlsPXVzZXJAZXhhbXBsZS5jb20nLFxuICogICBpT1M6IHtcbiAqICAgICAgYnVuZGxlSWQ6ICdjb20uZXhhbXBsZS5pb3MnXG4gKiAgIH0sXG4gKiAgIGFuZHJvaWQ6IHtcbiAqICAgICBwYWNrYWdlTmFtZTogJ2NvbS5leGFtcGxlLmFuZHJvaWQnLFxuICogICAgIGluc3RhbGxBcHA6IHRydWUsXG4gKiAgICAgbWluaW11bVZlcnNpb246ICcxMidcbiAqICAgfSxcbiAqICAgaGFuZGxlQ29kZUluQXBwOiB0cnVlXG4gKiB9O1xuICogYXdhaXQgc2VuZFBhc3N3b3JkUmVzZXRFbWFpbChhdXRoLCAndXNlckBleGFtcGxlLmNvbScsIGFjdGlvbkNvZGVTZXR0aW5ncyk7XG4gKiAvLyBPYnRhaW4gY29kZSBmcm9tIHVzZXIuXG4gKiBhd2FpdCBjb25maXJtUGFzc3dvcmRSZXNldCgndXNlckBleGFtcGxlLmNvbScsIGNvZGUpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxuICogQHBhcmFtIGVtYWlsIC0gVGhlIHVzZXIncyBlbWFpbCBhZGRyZXNzLlxuICogQHBhcmFtIGFjdGlvbkNvZGVTZXR0aW5ncyAtIFRoZSB7QGxpbmsgQWN0aW9uQ29kZVNldHRpbmdzfS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZW5kUGFzc3dvcmRSZXNldEVtYWlsKFxuICBhdXRoOiBBdXRoLFxuICBlbWFpbDogc3RyaW5nLFxuICBhY3Rpb25Db2RlU2V0dGluZ3M/OiBBY3Rpb25Db2RlU2V0dGluZ3Ncbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhdXRoSW50ZXJuYWwgPSBfY2FzdEF1dGgoYXV0aCk7XG4gIGNvbnN0IHJlcXVlc3Q6IGF1dGhlbnRpY2F0aW9uLlBhc3N3b3JkUmVzZXRSZXF1ZXN0ID0ge1xuICAgIHJlcXVlc3RUeXBlOiBBY3Rpb25Db2RlT3BlcmF0aW9uLlBBU1NXT1JEX1JFU0VULFxuICAgIGVtYWlsLFxuICAgIGNsaWVudFR5cGU6IFJlY2FwdGNoYUNsaWVudFR5cGUuV0VCXG4gIH07XG4gIGlmIChhY3Rpb25Db2RlU2V0dGluZ3MpIHtcbiAgICBfc2V0QWN0aW9uQ29kZVNldHRpbmdzT25SZXF1ZXN0KGF1dGhJbnRlcm5hbCwgcmVxdWVzdCwgYWN0aW9uQ29kZVNldHRpbmdzKTtcbiAgfVxuICBhd2FpdCBoYW5kbGVSZWNhcHRjaGFGbG93KFxuICAgIGF1dGhJbnRlcm5hbCxcbiAgICByZXF1ZXN0LFxuICAgIFJlY2FwdGNoYUFjdGlvbk5hbWUuR0VUX09PQl9DT0RFLFxuICAgIGF1dGhlbnRpY2F0aW9uLnNlbmRQYXNzd29yZFJlc2V0RW1haWxcbiAgKTtcbn1cblxuLyoqXG4gKiBDb21wbGV0ZXMgdGhlIHBhc3N3b3JkIHJlc2V0IHByb2Nlc3MsIGdpdmVuIGEgY29uZmlybWF0aW9uIGNvZGUgYW5kIG5ldyBwYXNzd29yZC5cbiAqXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXG4gKiBAcGFyYW0gb29iQ29kZSAtIEEgY29uZmlybWF0aW9uIGNvZGUgc2VudCB0byB0aGUgdXNlci5cbiAqIEBwYXJhbSBuZXdQYXNzd29yZCAtIFRoZSBuZXcgcGFzc3dvcmQuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29uZmlybVBhc3N3b3JkUmVzZXQoXG4gIGF1dGg6IEF1dGgsXG4gIG9vYkNvZGU6IHN0cmluZyxcbiAgbmV3UGFzc3dvcmQ6IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGFjY291bnRcbiAgICAucmVzZXRQYXNzd29yZChnZXRNb2R1bGFySW5zdGFuY2UoYXV0aCksIHtcbiAgICAgIG9vYkNvZGUsXG4gICAgICBuZXdQYXNzd29yZFxuICAgIH0pXG4gICAgLmNhdGNoKGFzeW5jIGVycm9yID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgZXJyb3IuY29kZSA9PT1cbiAgICAgICAgYGF1dGgvJHtBdXRoRXJyb3JDb2RlLlBBU1NXT1JEX0RPRVNfTk9UX01FRVRfUkVRVUlSRU1FTlRTfWBcbiAgICAgICkge1xuICAgICAgICB2b2lkIHJlY2FjaGVQYXNzd29yZFBvbGljeShhdXRoKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG4gIC8vIERvIG5vdCByZXR1cm4gdGhlIGVtYWlsLlxufVxuXG4vKipcbiAqIEFwcGxpZXMgYSB2ZXJpZmljYXRpb24gY29kZSBzZW50IHRvIHRoZSB1c2VyIGJ5IGVtYWlsIG9yIG90aGVyIG91dC1vZi1iYW5kIG1lY2hhbmlzbS5cbiAqXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXG4gKiBAcGFyYW0gb29iQ29kZSAtIEEgdmVyaWZpY2F0aW9uIGNvZGUgc2VudCB0byB0aGUgdXNlci5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhcHBseUFjdGlvbkNvZGUoXG4gIGF1dGg6IEF1dGgsXG4gIG9vYkNvZGU6IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGFjY291bnQuYXBwbHlBY3Rpb25Db2RlKGdldE1vZHVsYXJJbnN0YW5jZShhdXRoKSwgeyBvb2JDb2RlIH0pO1xufVxuXG4vKipcbiAqIENoZWNrcyBhIHZlcmlmaWNhdGlvbiBjb2RlIHNlbnQgdG8gdGhlIHVzZXIgYnkgZW1haWwgb3Igb3RoZXIgb3V0LW9mLWJhbmQgbWVjaGFuaXNtLlxuICpcbiAqIEByZXR1cm5zIG1ldGFkYXRhIGFib3V0IHRoZSBjb2RlLlxuICpcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cbiAqIEBwYXJhbSBvb2JDb2RlIC0gQSB2ZXJpZmljYXRpb24gY29kZSBzZW50IHRvIHRoZSB1c2VyLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNoZWNrQWN0aW9uQ29kZShcbiAgYXV0aDogQXV0aCxcbiAgb29iQ29kZTogc3RyaW5nXG4pOiBQcm9taXNlPEFjdGlvbkNvZGVJbmZvPiB7XG4gIGNvbnN0IGF1dGhNb2R1bGFyID0gZ2V0TW9kdWxhckluc3RhbmNlKGF1dGgpO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGFjY291bnQucmVzZXRQYXNzd29yZChhdXRoTW9kdWxhciwgeyBvb2JDb2RlIH0pO1xuXG4gIC8vIEVtYWlsIGNvdWxkIGJlIGVtcHR5IG9ubHkgaWYgdGhlIHJlcXVlc3QgdHlwZSBpcyBFTUFJTF9TSUdOSU4gb3JcbiAgLy8gVkVSSUZZX0FORF9DSEFOR0VfRU1BSUwuXG4gIC8vIE5ldyBlbWFpbCBzaG91bGQgbm90IGJlIGVtcHR5IGlmIHRoZSByZXF1ZXN0IHR5cGUgaXNcbiAgLy8gVkVSSUZZX0FORF9DSEFOR0VfRU1BSUwuXG4gIC8vIE11bHRpLWZhY3RvciBpbmZvIGNvdWxkIG5vdCBiZSBlbXB0eSBpZiB0aGUgcmVxdWVzdCB0eXBlIGlzXG4gIC8vIFJFVkVSVF9TRUNPTkRfRkFDVE9SX0FERElUSU9OLlxuICBjb25zdCBvcGVyYXRpb24gPSByZXNwb25zZS5yZXF1ZXN0VHlwZTtcbiAgX2Fzc2VydChvcGVyYXRpb24sIGF1dGhNb2R1bGFyLCBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SKTtcbiAgc3dpdGNoIChvcGVyYXRpb24pIHtcbiAgICBjYXNlIEFjdGlvbkNvZGVPcGVyYXRpb24uRU1BSUxfU0lHTklOOlxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBBY3Rpb25Db2RlT3BlcmF0aW9uLlZFUklGWV9BTkRfQ0hBTkdFX0VNQUlMOlxuICAgICAgX2Fzc2VydChyZXNwb25zZS5uZXdFbWFpbCwgYXV0aE1vZHVsYXIsIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBBY3Rpb25Db2RlT3BlcmF0aW9uLlJFVkVSVF9TRUNPTkRfRkFDVE9SX0FERElUSU9OOlxuICAgICAgX2Fzc2VydChyZXNwb25zZS5tZmFJbmZvLCBhdXRoTW9kdWxhciwgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG4gICAgLy8gZmFsbCB0aHJvdWdoXG4gICAgZGVmYXVsdDpcbiAgICAgIF9hc3NlcnQocmVzcG9uc2UuZW1haWwsIGF1dGhNb2R1bGFyLCBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SKTtcbiAgfVxuXG4gIC8vIFRoZSBtdWx0aS1mYWN0b3IgaW5mbyBmb3IgcmV2ZXJ0IHNlY29uZCBmYWN0b3IgYWRkaXRpb25cbiAgbGV0IG11bHRpRmFjdG9ySW5mbzogTXVsdGlGYWN0b3JJbmZvSW1wbCB8IG51bGwgPSBudWxsO1xuICBpZiAocmVzcG9uc2UubWZhSW5mbykge1xuICAgIG11bHRpRmFjdG9ySW5mbyA9IE11bHRpRmFjdG9ySW5mb0ltcGwuX2Zyb21TZXJ2ZXJSZXNwb25zZShcbiAgICAgIF9jYXN0QXV0aChhdXRoTW9kdWxhciksXG4gICAgICByZXNwb25zZS5tZmFJbmZvXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZGF0YToge1xuICAgICAgZW1haWw6XG4gICAgICAgIChyZXNwb25zZS5yZXF1ZXN0VHlwZSA9PT0gQWN0aW9uQ29kZU9wZXJhdGlvbi5WRVJJRllfQU5EX0NIQU5HRV9FTUFJTFxuICAgICAgICAgID8gcmVzcG9uc2UubmV3RW1haWxcbiAgICAgICAgICA6IHJlc3BvbnNlLmVtYWlsKSB8fCBudWxsLFxuICAgICAgcHJldmlvdXNFbWFpbDpcbiAgICAgICAgKHJlc3BvbnNlLnJlcXVlc3RUeXBlID09PSBBY3Rpb25Db2RlT3BlcmF0aW9uLlZFUklGWV9BTkRfQ0hBTkdFX0VNQUlMXG4gICAgICAgICAgPyByZXNwb25zZS5lbWFpbFxuICAgICAgICAgIDogcmVzcG9uc2UubmV3RW1haWwpIHx8IG51bGwsXG4gICAgICBtdWx0aUZhY3RvckluZm9cbiAgICB9LFxuICAgIG9wZXJhdGlvblxuICB9O1xufVxuXG4vKipcbiAqIENoZWNrcyBhIHBhc3N3b3JkIHJlc2V0IGNvZGUgc2VudCB0byB0aGUgdXNlciBieSBlbWFpbCBvciBvdGhlciBvdXQtb2YtYmFuZCBtZWNoYW5pc20uXG4gKlxuICogQHJldHVybnMgdGhlIHVzZXIncyBlbWFpbCBhZGRyZXNzIGlmIHZhbGlkLlxuICpcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cbiAqIEBwYXJhbSBjb2RlIC0gQSB2ZXJpZmljYXRpb24gY29kZSBzZW50IHRvIHRoZSB1c2VyLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZlcmlmeVBhc3N3b3JkUmVzZXRDb2RlKFxuICBhdXRoOiBBdXRoLFxuICBjb2RlOiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgY2hlY2tBY3Rpb25Db2RlKGdldE1vZHVsYXJJbnN0YW5jZShhdXRoKSwgY29kZSk7XG4gIC8vIEVtYWlsIHNob3VsZCBhbHdheXMgYmUgcHJlc2VudCBzaW5jZSBhIGNvZGUgd2FzIHNlbnQgdG8gaXRcbiAgcmV0dXJuIGRhdGEuZW1haWwhO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdXNlciBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGVtYWlsIGFkZHJlc3MgYW5kIHBhc3N3b3JkLlxuICpcbiAqIEByZW1hcmtzXG4gKiBPbiBzdWNjZXNzZnVsIGNyZWF0aW9uIG9mIHRoZSB1c2VyIGFjY291bnQsIHRoaXMgdXNlciB3aWxsIGFsc28gYmUgc2lnbmVkIGluIHRvIHlvdXIgYXBwbGljYXRpb24uXG4gKlxuICogVXNlciBhY2NvdW50IGNyZWF0aW9uIGNhbiBmYWlsIGlmIHRoZSBhY2NvdW50IGFscmVhZHkgZXhpc3RzIG9yIHRoZSBwYXNzd29yZCBpcyBpbnZhbGlkLlxuICpcbiAqIE5vdGU6IFRoZSBlbWFpbCBhZGRyZXNzIGFjdHMgYXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHVzZXIgYW5kIGVuYWJsZXMgYW4gZW1haWwtYmFzZWRcbiAqIHBhc3N3b3JkIHJlc2V0LiBUaGlzIGZ1bmN0aW9uIHdpbGwgY3JlYXRlIGEgbmV3IHVzZXIgYWNjb3VudCBhbmQgc2V0IHRoZSBpbml0aWFsIHVzZXIgcGFzc3dvcmQuXG4gKlxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxuICogQHBhcmFtIGVtYWlsIC0gVGhlIHVzZXIncyBlbWFpbCBhZGRyZXNzLlxuICogQHBhcmFtIHBhc3N3b3JkIC0gVGhlIHVzZXIncyBjaG9zZW4gcGFzc3dvcmQuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlVXNlcldpdGhFbWFpbEFuZFBhc3N3b3JkKFxuICBhdXRoOiBBdXRoLFxuICBlbWFpbDogc3RyaW5nLFxuICBwYXNzd29yZDogc3RyaW5nXG4pOiBQcm9taXNlPFVzZXJDcmVkZW50aWFsPiB7XG4gIGNvbnN0IGF1dGhJbnRlcm5hbCA9IF9jYXN0QXV0aChhdXRoKTtcbiAgY29uc3QgcmVxdWVzdDogU2lnblVwUmVxdWVzdCA9IHtcbiAgICByZXR1cm5TZWN1cmVUb2tlbjogdHJ1ZSxcbiAgICBlbWFpbCxcbiAgICBwYXNzd29yZCxcbiAgICBjbGllbnRUeXBlOiBSZWNhcHRjaGFDbGllbnRUeXBlLldFQlxuICB9O1xuICBjb25zdCBzaWduVXBSZXNwb25zZTogUHJvbWlzZTxJZFRva2VuUmVzcG9uc2U+ID0gaGFuZGxlUmVjYXB0Y2hhRmxvdyhcbiAgICBhdXRoSW50ZXJuYWwsXG4gICAgcmVxdWVzdCxcbiAgICBSZWNhcHRjaGFBY3Rpb25OYW1lLlNJR05fVVBfUEFTU1dPUkQsXG4gICAgc2lnblVwXG4gICk7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2lnblVwUmVzcG9uc2UuY2F0Y2goZXJyb3IgPT4ge1xuICAgIGlmIChcbiAgICAgIGVycm9yLmNvZGUgPT09IGBhdXRoLyR7QXV0aEVycm9yQ29kZS5QQVNTV09SRF9ET0VTX05PVF9NRUVUX1JFUVVJUkVNRU5UU31gXG4gICAgKSB7XG4gICAgICB2b2lkIHJlY2FjaGVQYXNzd29yZFBvbGljeShhdXRoKTtcbiAgICB9XG5cbiAgICB0aHJvdyBlcnJvcjtcbiAgfSk7XG5cbiAgY29uc3QgdXNlckNyZWRlbnRpYWwgPSBhd2FpdCBVc2VyQ3JlZGVudGlhbEltcGwuX2Zyb21JZFRva2VuUmVzcG9uc2UoXG4gICAgYXV0aEludGVybmFsLFxuICAgIE9wZXJhdGlvblR5cGUuU0lHTl9JTixcbiAgICByZXNwb25zZVxuICApO1xuICBhd2FpdCBhdXRoSW50ZXJuYWwuX3VwZGF0ZUN1cnJlbnRVc2VyKHVzZXJDcmVkZW50aWFsLnVzZXIpO1xuXG4gIHJldHVybiB1c2VyQ3JlZGVudGlhbDtcbn1cblxuLyoqXG4gKiBBc3luY2hyb25vdXNseSBzaWducyBpbiB1c2luZyBhbiBlbWFpbCBhbmQgcGFzc3dvcmQuXG4gKlxuICogQHJlbWFya3NcbiAqIEZhaWxzIHdpdGggYW4gZXJyb3IgaWYgdGhlIGVtYWlsIGFkZHJlc3MgYW5kIHBhc3N3b3JkIGRvIG5vdCBtYXRjaC5cbiAqXG4gKiBOb3RlOiBUaGUgdXNlcidzIHBhc3N3b3JkIGlzIE5PVCB0aGUgcGFzc3dvcmQgdXNlZCB0byBhY2Nlc3MgdGhlIHVzZXIncyBlbWFpbCBhY2NvdW50LiBUaGVcbiAqIGVtYWlsIGFkZHJlc3Mgc2VydmVzIGFzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSB1c2VyLCBhbmQgdGhlIHBhc3N3b3JkIGlzIHVzZWQgdG8gYWNjZXNzXG4gKiB0aGUgdXNlcidzIGFjY291bnQgaW4geW91ciBGaXJlYmFzZSBwcm9qZWN0LiBTZWUgYWxzbzoge0BsaW5rIGNyZWF0ZVVzZXJXaXRoRW1haWxBbmRQYXNzd29yZH0uXG4gKlxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxuICogQHBhcmFtIGVtYWlsIC0gVGhlIHVzZXJzIGVtYWlsIGFkZHJlc3MuXG4gKiBAcGFyYW0gcGFzc3dvcmQgLSBUaGUgdXNlcnMgcGFzc3dvcmQuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2lnbkluV2l0aEVtYWlsQW5kUGFzc3dvcmQoXG4gIGF1dGg6IEF1dGgsXG4gIGVtYWlsOiBzdHJpbmcsXG4gIHBhc3N3b3JkOiBzdHJpbmdcbik6IFByb21pc2U8VXNlckNyZWRlbnRpYWw+IHtcbiAgcmV0dXJuIHNpZ25JbldpdGhDcmVkZW50aWFsKFxuICAgIGdldE1vZHVsYXJJbnN0YW5jZShhdXRoKSxcbiAgICBFbWFpbEF1dGhQcm92aWRlci5jcmVkZW50aWFsKGVtYWlsLCBwYXNzd29yZClcbiAgKS5jYXRjaChhc3luYyBlcnJvciA9PiB7XG4gICAgaWYgKFxuICAgICAgZXJyb3IuY29kZSA9PT0gYGF1dGgvJHtBdXRoRXJyb3JDb2RlLlBBU1NXT1JEX0RPRVNfTk9UX01FRVRfUkVRVUlSRU1FTlRTfWBcbiAgICApIHtcbiAgICAgIHZvaWQgcmVjYWNoZVBhc3N3b3JkUG9saWN5KGF1dGgpO1xuICAgIH1cblxuICAgIHRocm93IGVycm9yO1xuICB9KTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge1xuICBBY3Rpb25Db2RlT3BlcmF0aW9uLFxuICBBY3Rpb25Db2RlU2V0dGluZ3MsXG4gIEF1dGgsXG4gIFVzZXJDcmVkZW50aWFsXG59IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbmltcG9ydCAqIGFzIGFwaSBmcm9tICcuLi8uLi9hcGkvYXV0aGVudGljYXRpb24vZW1haWxfYW5kX3Bhc3N3b3JkJztcbmltcG9ydCB7IEFjdGlvbkNvZGVVUkwgfSBmcm9tICcuLi9hY3Rpb25fY29kZV91cmwnO1xuaW1wb3J0IHsgRW1haWxBdXRoUHJvdmlkZXIgfSBmcm9tICcuLi9wcm92aWRlcnMvZW1haWwnO1xuaW1wb3J0IHsgX2dldEN1cnJlbnRVcmwgfSBmcm9tICcuLi91dGlsL2xvY2F0aW9uJztcbmltcG9ydCB7IF9zZXRBY3Rpb25Db2RlU2V0dGluZ3NPblJlcXVlc3QgfSBmcm9tICcuL2FjdGlvbl9jb2RlX3NldHRpbmdzJztcbmltcG9ydCB7IHNpZ25JbldpdGhDcmVkZW50aWFsIH0gZnJvbSAnLi9jcmVkZW50aWFsJztcbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgX2Fzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0JztcbmltcG9ydCB7IGdldE1vZHVsYXJJbnN0YW5jZSB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcbmltcG9ydCB7IF9jYXN0QXV0aCB9IGZyb20gJy4uL2F1dGgvYXV0aF9pbXBsJztcbmltcG9ydCB7IGhhbmRsZVJlY2FwdGNoYUZsb3cgfSBmcm9tICcuLi8uLi9wbGF0Zm9ybV9icm93c2VyL3JlY2FwdGNoYS9yZWNhcHRjaGFfZW50ZXJwcmlzZV92ZXJpZmllcic7XG5pbXBvcnQgeyBSZWNhcHRjaGFBY3Rpb25OYW1lLCBSZWNhcHRjaGFDbGllbnRUeXBlIH0gZnJvbSAnLi4vLi4vYXBpJztcblxuLyoqXG4gKiBTZW5kcyBhIHNpZ24taW4gZW1haWwgbGluayB0byB0aGUgdXNlciB3aXRoIHRoZSBzcGVjaWZpZWQgZW1haWwuXG4gKlxuICogQHJlbWFya3NcbiAqIFRoZSBzaWduLWluIG9wZXJhdGlvbiBoYXMgdG8gYWx3YXlzIGJlIGNvbXBsZXRlZCBpbiB0aGUgYXBwIHVubGlrZSBvdGhlciBvdXQgb2YgYmFuZCBlbWFpbFxuICogYWN0aW9ucyAocGFzc3dvcmQgcmVzZXQgYW5kIGVtYWlsIHZlcmlmaWNhdGlvbnMpLiBUaGlzIGlzIGJlY2F1c2UsIGF0IHRoZSBlbmQgb2YgdGhlIGZsb3csXG4gKiB0aGUgdXNlciBpcyBleHBlY3RlZCB0byBiZSBzaWduZWQgaW4gYW5kIHRoZWlyIEF1dGggc3RhdGUgcGVyc2lzdGVkIHdpdGhpbiB0aGUgYXBwLlxuICpcbiAqIFRvIGNvbXBsZXRlIHNpZ24gaW4gd2l0aCB0aGUgZW1haWwgbGluaywgY2FsbCB7QGxpbmsgc2lnbkluV2l0aEVtYWlsTGlua30gd2l0aCB0aGUgZW1haWxcbiAqIGFkZHJlc3MgYW5kIHRoZSBlbWFpbCBsaW5rIHN1cHBsaWVkIGluIHRoZSBlbWFpbCBzZW50IHRvIHRoZSB1c2VyLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBjb25zdCBhY3Rpb25Db2RlU2V0dGluZ3MgPSB7XG4gKiAgIHVybDogJ2h0dHBzOi8vd3d3LmV4YW1wbGUuY29tLz9lbWFpbD11c2VyQGV4YW1wbGUuY29tJyxcbiAqICAgaU9TOiB7XG4gKiAgICAgIGJ1bmRsZUlkOiAnY29tLmV4YW1wbGUuaW9zJ1xuICogICB9LFxuICogICBhbmRyb2lkOiB7XG4gKiAgICAgcGFja2FnZU5hbWU6ICdjb20uZXhhbXBsZS5hbmRyb2lkJyxcbiAqICAgICBpbnN0YWxsQXBwOiB0cnVlLFxuICogICAgIG1pbmltdW1WZXJzaW9uOiAnMTInXG4gKiAgIH0sXG4gKiAgIGhhbmRsZUNvZGVJbkFwcDogdHJ1ZVxuICogfTtcbiAqIGF3YWl0IHNlbmRTaWduSW5MaW5rVG9FbWFpbChhdXRoLCAndXNlckBleGFtcGxlLmNvbScsIGFjdGlvbkNvZGVTZXR0aW5ncyk7XG4gKiAvLyBPYnRhaW4gZW1haWxMaW5rIGZyb20gdGhlIHVzZXIuXG4gKiBpZihpc1NpZ25JbldpdGhFbWFpbExpbmsoYXV0aCwgZW1haWxMaW5rKSkge1xuICogICBhd2FpdCBzaWduSW5XaXRoRW1haWxMaW5rKGF1dGgsICd1c2VyQGV4YW1wbGUuY29tJywgZW1haWxMaW5rKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhdXRoSW50ZXJuYWwgLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxuICogQHBhcmFtIGVtYWlsIC0gVGhlIHVzZXIncyBlbWFpbCBhZGRyZXNzLlxuICogQHBhcmFtIGFjdGlvbkNvZGVTZXR0aW5ncyAtIFRoZSB7QGxpbmsgQWN0aW9uQ29kZVNldHRpbmdzfS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZW5kU2lnbkluTGlua1RvRW1haWwoXG4gIGF1dGg6IEF1dGgsXG4gIGVtYWlsOiBzdHJpbmcsXG4gIGFjdGlvbkNvZGVTZXR0aW5nczogQWN0aW9uQ29kZVNldHRpbmdzXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXV0aEludGVybmFsID0gX2Nhc3RBdXRoKGF1dGgpO1xuICBjb25zdCByZXF1ZXN0OiBhcGkuRW1haWxTaWduSW5SZXF1ZXN0ID0ge1xuICAgIHJlcXVlc3RUeXBlOiBBY3Rpb25Db2RlT3BlcmF0aW9uLkVNQUlMX1NJR05JTixcbiAgICBlbWFpbCxcbiAgICBjbGllbnRUeXBlOiBSZWNhcHRjaGFDbGllbnRUeXBlLldFQlxuICB9O1xuICBmdW5jdGlvbiBzZXRBY3Rpb25Db2RlU2V0dGluZ3MoXG4gICAgcmVxdWVzdDogYXBpLkVtYWlsU2lnbkluUmVxdWVzdCxcbiAgICBhY3Rpb25Db2RlU2V0dGluZ3M6IEFjdGlvbkNvZGVTZXR0aW5nc1xuICApOiB2b2lkIHtcbiAgICBfYXNzZXJ0KFxuICAgICAgYWN0aW9uQ29kZVNldHRpbmdzLmhhbmRsZUNvZGVJbkFwcCxcbiAgICAgIGF1dGhJbnRlcm5hbCxcbiAgICAgIEF1dGhFcnJvckNvZGUuQVJHVU1FTlRfRVJST1JcbiAgICApO1xuICAgIGlmIChhY3Rpb25Db2RlU2V0dGluZ3MpIHtcbiAgICAgIF9zZXRBY3Rpb25Db2RlU2V0dGluZ3NPblJlcXVlc3QoXG4gICAgICAgIGF1dGhJbnRlcm5hbCxcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgYWN0aW9uQ29kZVNldHRpbmdzXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBzZXRBY3Rpb25Db2RlU2V0dGluZ3MocmVxdWVzdCwgYWN0aW9uQ29kZVNldHRpbmdzKTtcbiAgYXdhaXQgaGFuZGxlUmVjYXB0Y2hhRmxvdyhcbiAgICBhdXRoSW50ZXJuYWwsXG4gICAgcmVxdWVzdCxcbiAgICBSZWNhcHRjaGFBY3Rpb25OYW1lLkdFVF9PT0JfQ09ERSxcbiAgICBhcGkuc2VuZFNpZ25JbkxpbmtUb0VtYWlsXG4gICk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGFuIGluY29taW5nIGxpbmsgaXMgYSBzaWduLWluIHdpdGggZW1haWwgbGluayBzdWl0YWJsZSBmb3Ige0BsaW5rIHNpZ25JbldpdGhFbWFpbExpbmt9LlxuICpcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cbiAqIEBwYXJhbSBlbWFpbExpbmsgLSBUaGUgbGluayBzZW50IHRvIHRoZSB1c2VyJ3MgZW1haWwgYWRkcmVzcy5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NpZ25JbldpdGhFbWFpbExpbmsoYXV0aDogQXV0aCwgZW1haWxMaW5rOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgYWN0aW9uQ29kZVVybCA9IEFjdGlvbkNvZGVVUkwucGFyc2VMaW5rKGVtYWlsTGluayk7XG4gIHJldHVybiBhY3Rpb25Db2RlVXJsPy5vcGVyYXRpb24gPT09IEFjdGlvbkNvZGVPcGVyYXRpb24uRU1BSUxfU0lHTklOO1xufVxuXG4vKipcbiAqIEFzeW5jaHJvbm91c2x5IHNpZ25zIGluIHVzaW5nIGFuIGVtYWlsIGFuZCBzaWduLWluIGVtYWlsIGxpbmsuXG4gKlxuICogQHJlbWFya3NcbiAqIElmIG5vIGxpbmsgaXMgcGFzc2VkLCB0aGUgbGluayBpcyBpbmZlcnJlZCBmcm9tIHRoZSBjdXJyZW50IFVSTC5cbiAqXG4gKiBGYWlscyB3aXRoIGFuIGVycm9yIGlmIHRoZSBlbWFpbCBhZGRyZXNzIGlzIGludmFsaWQgb3IgT1RQIGluIGVtYWlsIGxpbmsgZXhwaXJlcy5cbiAqXG4gKiBOb3RlOiBDb25maXJtIHRoZSBsaW5rIGlzIGEgc2lnbi1pbiBlbWFpbCBsaW5rIGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kIGZpcmViYXNlLmF1dGguQXV0aC5pc1NpZ25JbldpdGhFbWFpbExpbmsuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGNvbnN0IGFjdGlvbkNvZGVTZXR0aW5ncyA9IHtcbiAqICAgdXJsOiAnaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vP2VtYWlsPXVzZXJAZXhhbXBsZS5jb20nLFxuICogICBpT1M6IHtcbiAqICAgICAgYnVuZGxlSWQ6ICdjb20uZXhhbXBsZS5pb3MnXG4gKiAgIH0sXG4gKiAgIGFuZHJvaWQ6IHtcbiAqICAgICBwYWNrYWdlTmFtZTogJ2NvbS5leGFtcGxlLmFuZHJvaWQnLFxuICogICAgIGluc3RhbGxBcHA6IHRydWUsXG4gKiAgICAgbWluaW11bVZlcnNpb246ICcxMidcbiAqICAgfSxcbiAqICAgaGFuZGxlQ29kZUluQXBwOiB0cnVlXG4gKiB9O1xuICogYXdhaXQgc2VuZFNpZ25JbkxpbmtUb0VtYWlsKGF1dGgsICd1c2VyQGV4YW1wbGUuY29tJywgYWN0aW9uQ29kZVNldHRpbmdzKTtcbiAqIC8vIE9idGFpbiBlbWFpbExpbmsgZnJvbSB0aGUgdXNlci5cbiAqIGlmKGlzU2lnbkluV2l0aEVtYWlsTGluayhhdXRoLCBlbWFpbExpbmspKSB7XG4gKiAgIGF3YWl0IHNpZ25JbldpdGhFbWFpbExpbmsoYXV0aCwgJ3VzZXJAZXhhbXBsZS5jb20nLCBlbWFpbExpbmspO1xuICogfVxuICogYGBgXG4gKlxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxuICogQHBhcmFtIGVtYWlsIC0gVGhlIHVzZXIncyBlbWFpbCBhZGRyZXNzLlxuICogQHBhcmFtIGVtYWlsTGluayAtIFRoZSBsaW5rIHNlbnQgdG8gdGhlIHVzZXIncyBlbWFpbCBhZGRyZXNzLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNpZ25JbldpdGhFbWFpbExpbmsoXG4gIGF1dGg6IEF1dGgsXG4gIGVtYWlsOiBzdHJpbmcsXG4gIGVtYWlsTGluaz86IHN0cmluZ1xuKTogUHJvbWlzZTxVc2VyQ3JlZGVudGlhbD4ge1xuICBjb25zdCBhdXRoTW9kdWxhciA9IGdldE1vZHVsYXJJbnN0YW5jZShhdXRoKTtcbiAgY29uc3QgY3JlZGVudGlhbCA9IEVtYWlsQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWxXaXRoTGluayhcbiAgICBlbWFpbCxcbiAgICBlbWFpbExpbmsgfHwgX2dldEN1cnJlbnRVcmwoKVxuICApO1xuICAvLyBDaGVjayBpZiB0aGUgdGVuYW50IElEIGluIHRoZSBlbWFpbCBsaW5rIG1hdGNoZXMgdGhlIHRlbmFudCBJRCBvbiBBdXRoXG4gIC8vIGluc3RhbmNlLlxuICBfYXNzZXJ0KFxuICAgIGNyZWRlbnRpYWwuX3RlbmFudElkID09PSAoYXV0aE1vZHVsYXIudGVuYW50SWQgfHwgbnVsbCksXG4gICAgYXV0aE1vZHVsYXIsXG4gICAgQXV0aEVycm9yQ29kZS5URU5BTlRfSURfTUlTTUFUQ0hcbiAgKTtcbiAgcmV0dXJuIHNpZ25JbldpdGhDcmVkZW50aWFsKGF1dGhNb2R1bGFyLCBjcmVkZW50aWFsKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge1xuICBFbmRwb2ludCxcbiAgSHR0cE1ldGhvZCxcbiAgX2FkZFRpZElmTmVjZXNzYXJ5LFxuICBfcGVyZm9ybUFwaVJlcXVlc3Rcbn0gZnJvbSAnLi4vaW5kZXgnO1xuaW1wb3J0IHsgQXV0aCB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlQXV0aFVyaVJlcXVlc3Qge1xuICBpZGVudGlmaWVyOiBzdHJpbmc7XG4gIGNvbnRpbnVlVXJpOiBzdHJpbmc7XG4gIHRlbmFudElkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUF1dGhVcmlSZXNwb25zZSB7XG4gIHNpZ25pbk1ldGhvZHM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlQXV0aFVyaShcbiAgYXV0aDogQXV0aCxcbiAgcmVxdWVzdDogQ3JlYXRlQXV0aFVyaVJlcXVlc3Rcbik6IFByb21pc2U8Q3JlYXRlQXV0aFVyaVJlc3BvbnNlPiB7XG4gIHJldHVybiBfcGVyZm9ybUFwaVJlcXVlc3Q8Q3JlYXRlQXV0aFVyaVJlcXVlc3QsIENyZWF0ZUF1dGhVcmlSZXNwb25zZT4oXG4gICAgYXV0aCxcbiAgICBIdHRwTWV0aG9kLlBPU1QsXG4gICAgRW5kcG9pbnQuQ1JFQVRFX0FVVEhfVVJJLFxuICAgIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KVxuICApO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gIEFjdGlvbkNvZGVPcGVyYXRpb24sXG4gIEFjdGlvbkNvZGVTZXR0aW5ncyxcbiAgQXV0aCxcbiAgVXNlclxufSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuXG5pbXBvcnQge1xuICBjcmVhdGVBdXRoVXJpLFxuICBDcmVhdGVBdXRoVXJpUmVxdWVzdFxufSBmcm9tICcuLi8uLi9hcGkvYXV0aGVudGljYXRpb24vY3JlYXRlX2F1dGhfdXJpJztcbmltcG9ydCAqIGFzIGFwaSBmcm9tICcuLi8uLi9hcGkvYXV0aGVudGljYXRpb24vZW1haWxfYW5kX3Bhc3N3b3JkJztcbmltcG9ydCB7IFVzZXJJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL3VzZXInO1xuaW1wb3J0IHsgX2dldEN1cnJlbnRVcmwsIF9pc0h0dHBPckh0dHBzIH0gZnJvbSAnLi4vdXRpbC9sb2NhdGlvbic7XG5pbXBvcnQgeyBfc2V0QWN0aW9uQ29kZVNldHRpbmdzT25SZXF1ZXN0IH0gZnJvbSAnLi9hY3Rpb25fY29kZV9zZXR0aW5ncyc7XG5pbXBvcnQgeyBnZXRNb2R1bGFySW5zdGFuY2UgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5cbi8qKlxuICogR2V0cyB0aGUgbGlzdCBvZiBwb3NzaWJsZSBzaWduIGluIG1ldGhvZHMgZm9yIHRoZSBnaXZlbiBlbWFpbCBhZGRyZXNzLlxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGlzIGlzIHVzZWZ1bCB0byBkaWZmZXJlbnRpYXRlIG1ldGhvZHMgb2Ygc2lnbi1pbiBmb3IgdGhlIHNhbWUgcHJvdmlkZXIsIGVnLlxuICoge0BsaW5rIEVtYWlsQXV0aFByb3ZpZGVyfSB3aGljaCBoYXMgMiBtZXRob2RzIG9mIHNpZ24taW4sXG4gKiB7QGxpbmsgU2lnbkluTWV0aG9kfS5FTUFJTF9QQVNTV09SRCBhbmRcbiAqIHtAbGluayBTaWduSW5NZXRob2R9LkVNQUlMX0xJTksuXG4gKlxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxuICogQHBhcmFtIGVtYWlsIC0gVGhlIHVzZXIncyBlbWFpbCBhZGRyZXNzLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoU2lnbkluTWV0aG9kc0ZvckVtYWlsKFxuICBhdXRoOiBBdXRoLFxuICBlbWFpbDogc3RyaW5nXG4pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIC8vIGNyZWF0ZUF1dGhVcmkgcmV0dXJucyBhbiBlcnJvciBpZiBjb250aW51ZSBVUkkgaXMgbm90IGh0dHAgb3IgaHR0cHMuXG4gIC8vIEZvciBlbnZpcm9ubWVudHMgbGlrZSBDb3Jkb3ZhLCBDaHJvbWUgZXh0ZW5zaW9ucywgbmF0aXZlIGZyYW1ld29ya3MsIGZpbGVcbiAgLy8gc3lzdGVtcywgZXRjLCB1c2UgaHR0cDovL2xvY2FsaG9zdCBhcyBjb250aW51ZSBVUkwuXG4gIGNvbnN0IGNvbnRpbnVlVXJpID0gX2lzSHR0cE9ySHR0cHMoKSA/IF9nZXRDdXJyZW50VXJsKCkgOiAnaHR0cDovL2xvY2FsaG9zdCc7XG4gIGNvbnN0IHJlcXVlc3Q6IENyZWF0ZUF1dGhVcmlSZXF1ZXN0ID0ge1xuICAgIGlkZW50aWZpZXI6IGVtYWlsLFxuICAgIGNvbnRpbnVlVXJpXG4gIH07XG5cbiAgY29uc3QgeyBzaWduaW5NZXRob2RzIH0gPSBhd2FpdCBjcmVhdGVBdXRoVXJpKFxuICAgIGdldE1vZHVsYXJJbnN0YW5jZShhdXRoKSxcbiAgICByZXF1ZXN0XG4gICk7XG5cbiAgcmV0dXJuIHNpZ25pbk1ldGhvZHMgfHwgW107XG59XG5cbi8qKlxuICogU2VuZHMgYSB2ZXJpZmljYXRpb24gZW1haWwgdG8gYSB1c2VyLlxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgaXMgY29tcGxldGVkIGJ5IGNhbGxpbmcge0BsaW5rIGFwcGx5QWN0aW9uQ29kZX0uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGNvbnN0IGFjdGlvbkNvZGVTZXR0aW5ncyA9IHtcbiAqICAgdXJsOiAnaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vP2VtYWlsPXVzZXJAZXhhbXBsZS5jb20nLFxuICogICBpT1M6IHtcbiAqICAgICAgYnVuZGxlSWQ6ICdjb20uZXhhbXBsZS5pb3MnXG4gKiAgIH0sXG4gKiAgIGFuZHJvaWQ6IHtcbiAqICAgICBwYWNrYWdlTmFtZTogJ2NvbS5leGFtcGxlLmFuZHJvaWQnLFxuICogICAgIGluc3RhbGxBcHA6IHRydWUsXG4gKiAgICAgbWluaW11bVZlcnNpb246ICcxMidcbiAqICAgfSxcbiAqICAgaGFuZGxlQ29kZUluQXBwOiB0cnVlXG4gKiB9O1xuICogYXdhaXQgc2VuZEVtYWlsVmVyaWZpY2F0aW9uKHVzZXIsIGFjdGlvbkNvZGVTZXR0aW5ncyk7XG4gKiAvLyBPYnRhaW4gY29kZSBmcm9tIHRoZSB1c2VyLlxuICogYXdhaXQgYXBwbHlBY3Rpb25Db2RlKGF1dGgsIGNvZGUpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlci5cbiAqIEBwYXJhbSBhY3Rpb25Db2RlU2V0dGluZ3MgLSBUaGUge0BsaW5rIEFjdGlvbkNvZGVTZXR0aW5nc30uXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VuZEVtYWlsVmVyaWZpY2F0aW9uKFxuICB1c2VyOiBVc2VyLFxuICBhY3Rpb25Db2RlU2V0dGluZ3M/OiBBY3Rpb25Db2RlU2V0dGluZ3MgfCBudWxsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdXNlckludGVybmFsID0gZ2V0TW9kdWxhckluc3RhbmNlKHVzZXIpIGFzIFVzZXJJbnRlcm5hbDtcbiAgY29uc3QgaWRUb2tlbiA9IGF3YWl0IHVzZXIuZ2V0SWRUb2tlbigpO1xuICBjb25zdCByZXF1ZXN0OiBhcGkuVmVyaWZ5RW1haWxSZXF1ZXN0ID0ge1xuICAgIHJlcXVlc3RUeXBlOiBBY3Rpb25Db2RlT3BlcmF0aW9uLlZFUklGWV9FTUFJTCxcbiAgICBpZFRva2VuXG4gIH07XG4gIGlmIChhY3Rpb25Db2RlU2V0dGluZ3MpIHtcbiAgICBfc2V0QWN0aW9uQ29kZVNldHRpbmdzT25SZXF1ZXN0KFxuICAgICAgdXNlckludGVybmFsLmF1dGgsXG4gICAgICByZXF1ZXN0LFxuICAgICAgYWN0aW9uQ29kZVNldHRpbmdzXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHsgZW1haWwgfSA9IGF3YWl0IGFwaS5zZW5kRW1haWxWZXJpZmljYXRpb24odXNlckludGVybmFsLmF1dGgsIHJlcXVlc3QpO1xuXG4gIGlmIChlbWFpbCAhPT0gdXNlci5lbWFpbCkge1xuICAgIGF3YWl0IHVzZXIucmVsb2FkKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBTZW5kcyBhIHZlcmlmaWNhdGlvbiBlbWFpbCB0byBhIG5ldyBlbWFpbCBhZGRyZXNzLlxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGUgdXNlcidzIGVtYWlsIHdpbGwgYmUgdXBkYXRlZCB0byB0aGUgbmV3IG9uZSBhZnRlciBiZWluZyB2ZXJpZmllZC5cbiAqXG4gKiBJZiB5b3UgaGF2ZSBhIGN1c3RvbSBlbWFpbCBhY3Rpb24gaGFuZGxlciwgeW91IGNhbiBjb21wbGV0ZSB0aGUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgYnkgY2FsbGluZ1xuICoge0BsaW5rIGFwcGx5QWN0aW9uQ29kZX0uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGNvbnN0IGFjdGlvbkNvZGVTZXR0aW5ncyA9IHtcbiAqICAgdXJsOiAnaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vP2VtYWlsPXVzZXJAZXhhbXBsZS5jb20nLFxuICogICBpT1M6IHtcbiAqICAgICAgYnVuZGxlSWQ6ICdjb20uZXhhbXBsZS5pb3MnXG4gKiAgIH0sXG4gKiAgIGFuZHJvaWQ6IHtcbiAqICAgICBwYWNrYWdlTmFtZTogJ2NvbS5leGFtcGxlLmFuZHJvaWQnLFxuICogICAgIGluc3RhbGxBcHA6IHRydWUsXG4gKiAgICAgbWluaW11bVZlcnNpb246ICcxMidcbiAqICAgfSxcbiAqICAgaGFuZGxlQ29kZUluQXBwOiB0cnVlXG4gKiB9O1xuICogYXdhaXQgdmVyaWZ5QmVmb3JlVXBkYXRlRW1haWwodXNlciwgJ25ld2VtYWlsQGV4YW1wbGUuY29tJywgYWN0aW9uQ29kZVNldHRpbmdzKTtcbiAqIC8vIE9idGFpbiBjb2RlIGZyb20gdGhlIHVzZXIuXG4gKiBhd2FpdCBhcHBseUFjdGlvbkNvZGUoYXV0aCwgY29kZSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdXNlciAtIFRoZSB1c2VyLlxuICogQHBhcmFtIG5ld0VtYWlsIC0gVGhlIG5ldyBlbWFpbCBhZGRyZXNzIHRvIGJlIHZlcmlmaWVkIGJlZm9yZSB1cGRhdGUuXG4gKiBAcGFyYW0gYWN0aW9uQ29kZVNldHRpbmdzIC0gVGhlIHtAbGluayBBY3Rpb25Db2RlU2V0dGluZ3N9LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZlcmlmeUJlZm9yZVVwZGF0ZUVtYWlsKFxuICB1c2VyOiBVc2VyLFxuICBuZXdFbWFpbDogc3RyaW5nLFxuICBhY3Rpb25Db2RlU2V0dGluZ3M/OiBBY3Rpb25Db2RlU2V0dGluZ3MgfCBudWxsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdXNlckludGVybmFsID0gZ2V0TW9kdWxhckluc3RhbmNlKHVzZXIpIGFzIFVzZXJJbnRlcm5hbDtcbiAgY29uc3QgaWRUb2tlbiA9IGF3YWl0IHVzZXIuZ2V0SWRUb2tlbigpO1xuICBjb25zdCByZXF1ZXN0OiBhcGkuVmVyaWZ5QW5kQ2hhbmdlRW1haWxSZXF1ZXN0ID0ge1xuICAgIHJlcXVlc3RUeXBlOiBBY3Rpb25Db2RlT3BlcmF0aW9uLlZFUklGWV9BTkRfQ0hBTkdFX0VNQUlMLFxuICAgIGlkVG9rZW4sXG4gICAgbmV3RW1haWxcbiAgfTtcbiAgaWYgKGFjdGlvbkNvZGVTZXR0aW5ncykge1xuICAgIF9zZXRBY3Rpb25Db2RlU2V0dGluZ3NPblJlcXVlc3QoXG4gICAgICB1c2VySW50ZXJuYWwuYXV0aCxcbiAgICAgIHJlcXVlc3QsXG4gICAgICBhY3Rpb25Db2RlU2V0dGluZ3NcbiAgICApO1xuICB9XG5cbiAgY29uc3QgeyBlbWFpbCB9ID0gYXdhaXQgYXBpLnZlcmlmeUFuZENoYW5nZUVtYWlsKHVzZXJJbnRlcm5hbC5hdXRoLCByZXF1ZXN0KTtcblxuICBpZiAoZW1haWwgIT09IHVzZXIuZW1haWwpIHtcbiAgICAvLyBJZiB0aGUgbG9jYWwgY29weSBvZiB0aGUgZW1haWwgb24gdXNlciBpcyBvdXRkYXRlZCwgcmVsb2FkIHRoZVxuICAgIC8vIHVzZXIuXG4gICAgYXdhaXQgdXNlci5yZWxvYWQoKTtcbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEVuZHBvaW50LCBIdHRwTWV0aG9kLCBfcGVyZm9ybUFwaVJlcXVlc3QgfSBmcm9tICcuLi9pbmRleCc7XG5pbXBvcnQgeyBJZFRva2VuUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9tb2RlbC9pZF90b2tlbic7XG5pbXBvcnQgeyBBdXRoIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVQcm9maWxlUmVxdWVzdCB7XG4gIGlkVG9rZW46IHN0cmluZztcbiAgZGlzcGxheU5hbWU/OiBzdHJpbmcgfCBudWxsO1xuICBwaG90b1VybD86IHN0cmluZyB8IG51bGw7XG4gIHJldHVyblNlY3VyZVRva2VuOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZVByb2ZpbGVSZXNwb25zZSBleHRlbmRzIElkVG9rZW5SZXNwb25zZSB7XG4gIGRpc3BsYXlOYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgcGhvdG9Vcmw/OiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlUHJvZmlsZShcbiAgYXV0aDogQXV0aCxcbiAgcmVxdWVzdDogVXBkYXRlUHJvZmlsZVJlcXVlc3Rcbik6IFByb21pc2U8VXBkYXRlUHJvZmlsZVJlc3BvbnNlPiB7XG4gIHJldHVybiBfcGVyZm9ybUFwaVJlcXVlc3Q8VXBkYXRlUHJvZmlsZVJlcXVlc3QsIFVwZGF0ZVByb2ZpbGVSZXNwb25zZT4oXG4gICAgYXV0aCxcbiAgICBIdHRwTWV0aG9kLlBPU1QsXG4gICAgRW5kcG9pbnQuU0VUX0FDQ09VTlRfSU5GTyxcbiAgICByZXF1ZXN0XG4gICk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgVXNlciB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbmltcG9ydCB7XG4gIHVwZGF0ZUVtYWlsUGFzc3dvcmQgYXMgYXBpVXBkYXRlRW1haWxQYXNzd29yZCxcbiAgVXBkYXRlRW1haWxQYXNzd29yZFJlcXVlc3Rcbn0gZnJvbSAnLi4vLi4vYXBpL2FjY291bnRfbWFuYWdlbWVudC9lbWFpbF9hbmRfcGFzc3dvcmQnO1xuaW1wb3J0IHsgdXBkYXRlUHJvZmlsZSBhcyBhcGlVcGRhdGVQcm9maWxlIH0gZnJvbSAnLi4vLi4vYXBpL2FjY291bnRfbWFuYWdlbWVudC9wcm9maWxlJztcbmltcG9ydCB7IFVzZXJJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL3VzZXInO1xuaW1wb3J0IHsgX2xvZ291dElmSW52YWxpZGF0ZWQgfSBmcm9tICcuL2ludmFsaWRhdGlvbic7XG5pbXBvcnQgeyBnZXRNb2R1bGFySW5zdGFuY2UgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5pbXBvcnQgeyBQcm92aWRlcklkIH0gZnJvbSAnLi4vLi4vbW9kZWwvZW51bXMnO1xuXG4vKipcbiAqIFVwZGF0ZXMgYSB1c2VyJ3MgcHJvZmlsZSBkYXRhLlxuICpcbiAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIuXG4gKiBAcGFyYW0gcHJvZmlsZSAtIFRoZSBwcm9maWxlJ3MgYGRpc3BsYXlOYW1lYCBhbmQgYHBob3RvVVJMYCB0byB1cGRhdGUuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlUHJvZmlsZShcbiAgdXNlcjogVXNlcixcbiAge1xuICAgIGRpc3BsYXlOYW1lLFxuICAgIHBob3RvVVJMOiBwaG90b1VybFxuICB9OiB7IGRpc3BsYXlOYW1lPzogc3RyaW5nIHwgbnVsbDsgcGhvdG9VUkw/OiBzdHJpbmcgfCBudWxsIH1cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoZGlzcGxheU5hbWUgPT09IHVuZGVmaW5lZCAmJiBwaG90b1VybCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgdXNlckludGVybmFsID0gZ2V0TW9kdWxhckluc3RhbmNlKHVzZXIpIGFzIFVzZXJJbnRlcm5hbDtcbiAgY29uc3QgaWRUb2tlbiA9IGF3YWl0IHVzZXJJbnRlcm5hbC5nZXRJZFRva2VuKCk7XG4gIGNvbnN0IHByb2ZpbGVSZXF1ZXN0ID0ge1xuICAgIGlkVG9rZW4sXG4gICAgZGlzcGxheU5hbWUsXG4gICAgcGhvdG9VcmwsXG4gICAgcmV0dXJuU2VjdXJlVG9rZW46IHRydWVcbiAgfTtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBfbG9nb3V0SWZJbnZhbGlkYXRlZChcbiAgICB1c2VySW50ZXJuYWwsXG4gICAgYXBpVXBkYXRlUHJvZmlsZSh1c2VySW50ZXJuYWwuYXV0aCwgcHJvZmlsZVJlcXVlc3QpXG4gICk7XG5cbiAgdXNlckludGVybmFsLmRpc3BsYXlOYW1lID0gcmVzcG9uc2UuZGlzcGxheU5hbWUgfHwgbnVsbDtcbiAgdXNlckludGVybmFsLnBob3RvVVJMID0gcmVzcG9uc2UucGhvdG9VcmwgfHwgbnVsbDtcblxuICAvLyBVcGRhdGUgdGhlIHBhc3N3b3JkIHByb3ZpZGVyIGFzIHdlbGxcbiAgY29uc3QgcGFzc3dvcmRQcm92aWRlciA9IHVzZXJJbnRlcm5hbC5wcm92aWRlckRhdGEuZmluZChcbiAgICAoeyBwcm92aWRlcklkIH0pID0+IHByb3ZpZGVySWQgPT09IFByb3ZpZGVySWQuUEFTU1dPUkRcbiAgKTtcbiAgaWYgKHBhc3N3b3JkUHJvdmlkZXIpIHtcbiAgICBwYXNzd29yZFByb3ZpZGVyLmRpc3BsYXlOYW1lID0gdXNlckludGVybmFsLmRpc3BsYXlOYW1lO1xuICAgIHBhc3N3b3JkUHJvdmlkZXIucGhvdG9VUkwgPSB1c2VySW50ZXJuYWwucGhvdG9VUkw7XG4gIH1cblxuICBhd2FpdCB1c2VySW50ZXJuYWwuX3VwZGF0ZVRva2Vuc0lmTmVjZXNzYXJ5KHJlc3BvbnNlKTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSB1c2VyJ3MgZW1haWwgYWRkcmVzcy5cbiAqXG4gKiBAcmVtYXJrc1xuICogQW4gZW1haWwgd2lsbCBiZSBzZW50IHRvIHRoZSBvcmlnaW5hbCBlbWFpbCBhZGRyZXNzIChpZiBpdCB3YXMgc2V0KSB0aGF0IGFsbG93cyB0byByZXZva2UgdGhlXG4gKiBlbWFpbCBhZGRyZXNzIGNoYW5nZSwgaW4gb3JkZXIgdG8gcHJvdGVjdCB0aGVtIGZyb20gYWNjb3VudCBoaWphY2tpbmcuXG4gKlxuICogSW1wb3J0YW50OiB0aGlzIGlzIGEgc2VjdXJpdHkgc2Vuc2l0aXZlIG9wZXJhdGlvbiB0aGF0IHJlcXVpcmVzIHRoZSB1c2VyIHRvIGhhdmUgcmVjZW50bHkgc2lnbmVkXG4gKiBpbi4gSWYgdGhpcyByZXF1aXJlbWVudCBpc24ndCBtZXQsIGFzayB0aGUgdXNlciB0byBhdXRoZW50aWNhdGUgYWdhaW4gYW5kIHRoZW4gY2FsbFxuICoge0BsaW5rIHJlYXV0aGVudGljYXRlV2l0aENyZWRlbnRpYWx9LlxuICpcbiAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIuXG4gKiBAcGFyYW0gbmV3RW1haWwgLSBUaGUgbmV3IGVtYWlsIGFkZHJlc3MuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlRW1haWwodXNlcjogVXNlciwgbmV3RW1haWw6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gdXBkYXRlRW1haWxPclBhc3N3b3JkKFxuICAgIGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyKSBhcyBVc2VySW50ZXJuYWwsXG4gICAgbmV3RW1haWwsXG4gICAgbnVsbFxuICApO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIHVzZXIncyBwYXNzd29yZC5cbiAqXG4gKiBAcmVtYXJrc1xuICogSW1wb3J0YW50OiB0aGlzIGlzIGEgc2VjdXJpdHkgc2Vuc2l0aXZlIG9wZXJhdGlvbiB0aGF0IHJlcXVpcmVzIHRoZSB1c2VyIHRvIGhhdmUgcmVjZW50bHkgc2lnbmVkXG4gKiBpbi4gSWYgdGhpcyByZXF1aXJlbWVudCBpc24ndCBtZXQsIGFzayB0aGUgdXNlciB0byBhdXRoZW50aWNhdGUgYWdhaW4gYW5kIHRoZW4gY2FsbFxuICoge0BsaW5rIHJlYXV0aGVudGljYXRlV2l0aENyZWRlbnRpYWx9LlxuICpcbiAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIuXG4gKiBAcGFyYW0gbmV3UGFzc3dvcmQgLSBUaGUgbmV3IHBhc3N3b3JkLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVBhc3N3b3JkKHVzZXI6IFVzZXIsIG5ld1Bhc3N3b3JkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIHVwZGF0ZUVtYWlsT3JQYXNzd29yZChcbiAgICBnZXRNb2R1bGFySW5zdGFuY2UodXNlcikgYXMgVXNlckludGVybmFsLFxuICAgIG51bGwsXG4gICAgbmV3UGFzc3dvcmRcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlRW1haWxPclBhc3N3b3JkKFxuICB1c2VyOiBVc2VySW50ZXJuYWwsXG4gIGVtYWlsOiBzdHJpbmcgfCBudWxsLFxuICBwYXNzd29yZDogc3RyaW5nIHwgbnVsbFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgYXV0aCB9ID0gdXNlcjtcbiAgY29uc3QgaWRUb2tlbiA9IGF3YWl0IHVzZXIuZ2V0SWRUb2tlbigpO1xuICBjb25zdCByZXF1ZXN0OiBVcGRhdGVFbWFpbFBhc3N3b3JkUmVxdWVzdCA9IHtcbiAgICBpZFRva2VuLFxuICAgIHJldHVyblNlY3VyZVRva2VuOiB0cnVlXG4gIH07XG5cbiAgaWYgKGVtYWlsKSB7XG4gICAgcmVxdWVzdC5lbWFpbCA9IGVtYWlsO1xuICB9XG5cbiAgaWYgKHBhc3N3b3JkKSB7XG4gICAgcmVxdWVzdC5wYXNzd29yZCA9IHBhc3N3b3JkO1xuICB9XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBfbG9nb3V0SWZJbnZhbGlkYXRlZChcbiAgICB1c2VyLFxuICAgIGFwaVVwZGF0ZUVtYWlsUGFzc3dvcmQoYXV0aCwgcmVxdWVzdClcbiAgKTtcbiAgYXdhaXQgdXNlci5fdXBkYXRlVG9rZW5zSWZOZWNlc3NhcnkocmVzcG9uc2UsIC8qIHJlbG9hZCAqLyB0cnVlKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBBZGRpdGlvbmFsVXNlckluZm8sIFVzZXJDcmVkZW50aWFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcbmltcG9ydCB7IElkVG9rZW5SZXNwb25zZSwgSWRUb2tlblJlc3BvbnNlS2luZCB9IGZyb20gJy4uLy4uL21vZGVsL2lkX3Rva2VuJztcbmltcG9ydCB7IF9wYXJzZVRva2VuIH0gZnJvbSAnLi9pZF90b2tlbl9yZXN1bHQnO1xuaW1wb3J0IHsgVXNlckNyZWRlbnRpYWxJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL3VzZXInO1xuaW1wb3J0IHsgUHJvdmlkZXJJZCB9IGZyb20gJy4uLy4uL21vZGVsL2VudW1zJztcblxuLyoqXG4gKiBQYXJzZSB0aGUgYEFkZGl0aW9uYWxVc2VySW5mb2AgZnJvbSB0aGUgSUQgdG9rZW4gcmVzcG9uc2UuXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gX2Zyb21JZFRva2VuUmVzcG9uc2UoXG4gIGlkVG9rZW5SZXNwb25zZT86IElkVG9rZW5SZXNwb25zZVxuKTogQWRkaXRpb25hbFVzZXJJbmZvIHwgbnVsbCB7XG4gIGlmICghaWRUb2tlblJlc3BvbnNlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgeyBwcm92aWRlcklkIH0gPSBpZFRva2VuUmVzcG9uc2U7XG4gIGNvbnN0IHByb2ZpbGUgPSBpZFRva2VuUmVzcG9uc2UucmF3VXNlckluZm9cbiAgICA/IEpTT04ucGFyc2UoaWRUb2tlblJlc3BvbnNlLnJhd1VzZXJJbmZvKVxuICAgIDoge307XG4gIGNvbnN0IGlzTmV3VXNlciA9XG4gICAgaWRUb2tlblJlc3BvbnNlLmlzTmV3VXNlciB8fFxuICAgIGlkVG9rZW5SZXNwb25zZS5raW5kID09PSBJZFRva2VuUmVzcG9uc2VLaW5kLlNpZ251cE5ld1VzZXI7XG4gIGlmICghcHJvdmlkZXJJZCAmJiBpZFRva2VuUmVzcG9uc2U/LmlkVG9rZW4pIHtcbiAgICBjb25zdCBzaWduSW5Qcm92aWRlciA9IF9wYXJzZVRva2VuKGlkVG9rZW5SZXNwb25zZS5pZFRva2VuKT8uZmlyZWJhc2U/LltcbiAgICAgICdzaWduX2luX3Byb3ZpZGVyJ1xuICAgIF07XG4gICAgaWYgKHNpZ25JblByb3ZpZGVyKSB7XG4gICAgICBjb25zdCBmaWx0ZXJlZFByb3ZpZGVySWQgPVxuICAgICAgICBzaWduSW5Qcm92aWRlciAhPT0gUHJvdmlkZXJJZC5BTk9OWU1PVVMgJiZcbiAgICAgICAgc2lnbkluUHJvdmlkZXIgIT09IFByb3ZpZGVySWQuQ1VTVE9NXG4gICAgICAgICAgPyAoc2lnbkluUHJvdmlkZXIgYXMgUHJvdmlkZXJJZClcbiAgICAgICAgICA6IG51bGw7XG4gICAgICAvLyBVc2VzIGdlbmVyaWMgY2xhc3MgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBsZWdhY3kgU0RLLlxuICAgICAgcmV0dXJuIG5ldyBHZW5lcmljQWRkaXRpb25hbFVzZXJJbmZvKGlzTmV3VXNlciwgZmlsdGVyZWRQcm92aWRlcklkKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFwcm92aWRlcklkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgc3dpdGNoIChwcm92aWRlcklkKSB7XG4gICAgY2FzZSBQcm92aWRlcklkLkZBQ0VCT09LOlxuICAgICAgcmV0dXJuIG5ldyBGYWNlYm9va0FkZGl0aW9uYWxVc2VySW5mbyhpc05ld1VzZXIsIHByb2ZpbGUpO1xuICAgIGNhc2UgUHJvdmlkZXJJZC5HSVRIVUI6XG4gICAgICByZXR1cm4gbmV3IEdpdGh1YkFkZGl0aW9uYWxVc2VySW5mbyhpc05ld1VzZXIsIHByb2ZpbGUpO1xuICAgIGNhc2UgUHJvdmlkZXJJZC5HT09HTEU6XG4gICAgICByZXR1cm4gbmV3IEdvb2dsZUFkZGl0aW9uYWxVc2VySW5mbyhpc05ld1VzZXIsIHByb2ZpbGUpO1xuICAgIGNhc2UgUHJvdmlkZXJJZC5UV0lUVEVSOlxuICAgICAgcmV0dXJuIG5ldyBUd2l0dGVyQWRkaXRpb25hbFVzZXJJbmZvKFxuICAgICAgICBpc05ld1VzZXIsXG4gICAgICAgIHByb2ZpbGUsXG4gICAgICAgIGlkVG9rZW5SZXNwb25zZS5zY3JlZW5OYW1lIHx8IG51bGxcbiAgICAgICk7XG4gICAgY2FzZSBQcm92aWRlcklkLkNVU1RPTTpcbiAgICBjYXNlIFByb3ZpZGVySWQuQU5PTllNT1VTOlxuICAgICAgcmV0dXJuIG5ldyBHZW5lcmljQWRkaXRpb25hbFVzZXJJbmZvKGlzTmV3VXNlciwgbnVsbCk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBuZXcgR2VuZXJpY0FkZGl0aW9uYWxVc2VySW5mbyhpc05ld1VzZXIsIHByb3ZpZGVySWQsIHByb2ZpbGUpO1xuICB9XG59XG5cbmNsYXNzIEdlbmVyaWNBZGRpdGlvbmFsVXNlckluZm8gaW1wbGVtZW50cyBBZGRpdGlvbmFsVXNlckluZm8ge1xuICBjb25zdHJ1Y3RvcihcbiAgICByZWFkb25seSBpc05ld1VzZXI6IGJvb2xlYW4sXG4gICAgcmVhZG9ubHkgcHJvdmlkZXJJZDogUHJvdmlkZXJJZCB8IHN0cmluZyB8IG51bGwsXG4gICAgcmVhZG9ubHkgcHJvZmlsZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fVxuICApIHt9XG59XG5cbmNsYXNzIEZlZGVyYXRlZEFkZGl0aW9uYWxVc2VySW5mb1dpdGhVc2VybmFtZSBleHRlbmRzIEdlbmVyaWNBZGRpdGlvbmFsVXNlckluZm8ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBpc05ld1VzZXI6IGJvb2xlYW4sXG4gICAgcHJvdmlkZXJJZDogUHJvdmlkZXJJZCxcbiAgICBwcm9maWxlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICByZWFkb25seSB1c2VybmFtZTogc3RyaW5nIHwgbnVsbFxuICApIHtcbiAgICBzdXBlcihpc05ld1VzZXIsIHByb3ZpZGVySWQsIHByb2ZpbGUpO1xuICB9XG59XG5cbmNsYXNzIEZhY2Vib29rQWRkaXRpb25hbFVzZXJJbmZvIGV4dGVuZHMgR2VuZXJpY0FkZGl0aW9uYWxVc2VySW5mbyB7XG4gIGNvbnN0cnVjdG9yKGlzTmV3VXNlcjogYm9vbGVhbiwgcHJvZmlsZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcbiAgICBzdXBlcihpc05ld1VzZXIsIFByb3ZpZGVySWQuRkFDRUJPT0ssIHByb2ZpbGUpO1xuICB9XG59XG5cbmNsYXNzIEdpdGh1YkFkZGl0aW9uYWxVc2VySW5mbyBleHRlbmRzIEZlZGVyYXRlZEFkZGl0aW9uYWxVc2VySW5mb1dpdGhVc2VybmFtZSB7XG4gIGNvbnN0cnVjdG9yKGlzTmV3VXNlcjogYm9vbGVhbiwgcHJvZmlsZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcbiAgICBzdXBlcihcbiAgICAgIGlzTmV3VXNlcixcbiAgICAgIFByb3ZpZGVySWQuR0lUSFVCLFxuICAgICAgcHJvZmlsZSxcbiAgICAgIHR5cGVvZiBwcm9maWxlPy5sb2dpbiA9PT0gJ3N0cmluZycgPyBwcm9maWxlPy5sb2dpbiA6IG51bGxcbiAgICApO1xuICB9XG59XG5cbmNsYXNzIEdvb2dsZUFkZGl0aW9uYWxVc2VySW5mbyBleHRlbmRzIEdlbmVyaWNBZGRpdGlvbmFsVXNlckluZm8ge1xuICBjb25zdHJ1Y3Rvcihpc05ld1VzZXI6IGJvb2xlYW4sIHByb2ZpbGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB7XG4gICAgc3VwZXIoaXNOZXdVc2VyLCBQcm92aWRlcklkLkdPT0dMRSwgcHJvZmlsZSk7XG4gIH1cbn1cblxuY2xhc3MgVHdpdHRlckFkZGl0aW9uYWxVc2VySW5mbyBleHRlbmRzIEZlZGVyYXRlZEFkZGl0aW9uYWxVc2VySW5mb1dpdGhVc2VybmFtZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIGlzTmV3VXNlcjogYm9vbGVhbixcbiAgICBwcm9maWxlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBzY3JlZW5OYW1lOiBzdHJpbmcgfCBudWxsXG4gICkge1xuICAgIHN1cGVyKGlzTmV3VXNlciwgUHJvdmlkZXJJZC5UV0lUVEVSLCBwcm9maWxlLCBzY3JlZW5OYW1lKTtcbiAgfVxufVxuXG4vKipcbiAqIEV4dHJhY3RzIHByb3ZpZGVyIHNwZWNpZmljIHtAbGluayBBZGRpdGlvbmFsVXNlckluZm99IGZvciB0aGUgZ2l2ZW4gY3JlZGVudGlhbC5cbiAqXG4gKiBAcGFyYW0gdXNlckNyZWRlbnRpYWwgLSBUaGUgdXNlciBjcmVkZW50aWFsLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFkZGl0aW9uYWxVc2VySW5mbyhcbiAgdXNlckNyZWRlbnRpYWw6IFVzZXJDcmVkZW50aWFsXG4pOiBBZGRpdGlvbmFsVXNlckluZm8gfCBudWxsIHtcbiAgY29uc3QgeyB1c2VyLCBfdG9rZW5SZXNwb25zZSB9ID0gdXNlckNyZWRlbnRpYWwgYXMgVXNlckNyZWRlbnRpYWxJbnRlcm5hbDtcbiAgaWYgKHVzZXIuaXNBbm9ueW1vdXMgJiYgIV90b2tlblJlc3BvbnNlKSB7XG4gICAgLy8gSGFuZGxlIHRoZSBzcGVjaWFsIGNhc2Ugd2hlcmUgc2lnbkluQW5vbnltb3VzbHkoKSBnZXRzIGNhbGxlZCB0d2ljZS5cbiAgICAvLyBObyBuZXR3b3JrIGNhbGwgaXMgbWFkZSBzbyB0aGVyZSdzIG5vdGhpbmcgdG8gYWN0dWFsbHkgZmlsbCB0aGlzIGluXG4gICAgcmV0dXJuIHtcbiAgICAgIHByb3ZpZGVySWQ6IG51bGwsXG4gICAgICBpc05ld1VzZXI6IGZhbHNlLFxuICAgICAgcHJvZmlsZTogbnVsbFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gX2Zyb21JZFRva2VuUmVzcG9uc2UoX3Rva2VuUmVzcG9uc2UpO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IGdldE1vZHVsYXJJbnN0YW5jZSB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcbmltcG9ydCB7XG4gIEF1dGgsXG4gIE5leHRPck9ic2VydmVyLFxuICBQZXJzaXN0ZW5jZSxcbiAgVXNlcixcbiAgQ29tcGxldGVGbixcbiAgRXJyb3JGbixcbiAgVW5zdWJzY3JpYmUsXG4gIFBhc3N3b3JkVmFsaWRhdGlvblN0YXR1c1xufSBmcm9tICcuLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuaW1wb3J0IHsgX2luaXRpYWxpemVSZWNhcHRjaGFDb25maWcgfSBmcm9tICcuLi9wbGF0Zm9ybV9icm93c2VyL3JlY2FwdGNoYS9yZWNhcHRjaGFfZW50ZXJwcmlzZV92ZXJpZmllcic7XG5pbXBvcnQgeyBfY2FzdEF1dGggfSBmcm9tICcuLi9jb3JlL2F1dGgvYXV0aF9pbXBsJztcblxuZXhwb3J0IHtcbiAgZGVidWdFcnJvck1hcCxcbiAgcHJvZEVycm9yTWFwLFxuICBBVVRIX0VSUk9SX0NPREVTX01BUF9ET19OT1RfVVNFX0lOVEVSTkFMTFkgYXMgQXV0aEVycm9yQ29kZXNcbn0gZnJvbSAnLi9lcnJvcnMnO1xuXG4vLyBOb24tb3B0aW9uYWwgYXV0aCBtZXRob2RzLlxuLyoqXG4gKiBDaGFuZ2VzIHRoZSB0eXBlIG9mIHBlcnNpc3RlbmNlIG9uIHRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UgZm9yIHRoZSBjdXJyZW50bHkgc2F2ZWRcbiAqIGBBdXRoYCBzZXNzaW9uIGFuZCBhcHBsaWVzIHRoaXMgdHlwZSBvZiBwZXJzaXN0ZW5jZSBmb3IgZnV0dXJlIHNpZ24taW4gcmVxdWVzdHMsIGluY2x1ZGluZ1xuICogc2lnbi1pbiB3aXRoIHJlZGlyZWN0IHJlcXVlc3RzLlxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGlzIG1ha2VzIGl0IGVhc3kgZm9yIGEgdXNlciBzaWduaW5nIGluIHRvIHNwZWNpZnkgd2hldGhlciB0aGVpciBzZXNzaW9uIHNob3VsZCBiZVxuICogcmVtZW1iZXJlZCBvciBub3QuIEl0IGFsc28gbWFrZXMgaXQgZWFzaWVyIHRvIG5ldmVyIHBlcnNpc3QgdGhlIGBBdXRoYCBzdGF0ZSBmb3IgYXBwbGljYXRpb25zXG4gKiB0aGF0IGFyZSBzaGFyZWQgYnkgb3RoZXIgdXNlcnMgb3IgaGF2ZSBzZW5zaXRpdmUgZGF0YS5cbiAqXG4gKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCB3b3JrIGluIGEgTm9kZS5qcyBlbnZpcm9ubWVudC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgamF2YXNjcmlwdFxuICogc2V0UGVyc2lzdGVuY2UoYXV0aCwgYnJvd3NlclNlc3Npb25QZXJzaXN0ZW5jZSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGVyc2lzdGVuY2UgLSBUaGUge0BsaW5rIFBlcnNpc3RlbmNlfSB0byB1c2UuXG4gKiBAcmV0dXJucyBBIGBQcm9taXNlYCB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHBlcnNpc3RlbmNlIGNoYW5nZSBoYXMgY29tcGxldGVkXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0UGVyc2lzdGVuY2UoXG4gIGF1dGg6IEF1dGgsXG4gIHBlcnNpc3RlbmNlOiBQZXJzaXN0ZW5jZVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBnZXRNb2R1bGFySW5zdGFuY2UoYXV0aCkuc2V0UGVyc2lzdGVuY2UocGVyc2lzdGVuY2UpO1xufVxuXG4vKipcbiAqIExvYWRzIHRoZSByZUNBUFRDSEEgY29uZmlndXJhdGlvbiBpbnRvIHRoZSBgQXV0aGAgaW5zdGFuY2UuXG4gKlxuICogQHJlbWFya3NcbiAqIFRoaXMgd2lsbCBsb2FkIHRoZSByZUNBUFRDSEEgY29uZmlnLCB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgcmVDQVBUQ0hBXG4gKiB2ZXJpZmljYXRpb24gZmxvdyBzaG91bGQgYmUgdHJpZ2dlcmVkIGZvciBlYWNoIGF1dGggcHJvdmlkZXIsIGludG8gdGhlXG4gKiBjdXJyZW50IEF1dGggc2Vzc2lvbi5cbiAqXG4gKiBJZiBpbml0aWFsaXplUmVjYXB0Y2hhQ29uZmlnKCkgaXMgbm90IGludm9rZWQsIHRoZSBhdXRoIGZsb3cgd2lsbCBhbHdheXMgc3RhcnRcbiAqIHdpdGhvdXQgcmVDQVBUQ0hBIHZlcmlmaWNhdGlvbi4gSWYgdGhlIHByb3ZpZGVyIGlzIGNvbmZpZ3VyZWQgdG8gcmVxdWlyZSByZUNBUFRDSEFcbiAqIHZlcmlmaWNhdGlvbiwgdGhlIFNESyB3aWxsIHRyYW5zcGFyZW50bHkgbG9hZCB0aGUgcmVDQVBUQ0hBIGNvbmZpZyBhbmQgcmVzdGFydCB0aGVcbiAqIGF1dGggZmxvd3MuXG4gKlxuICogVGh1cywgYnkgY2FsbGluZyB0aGlzIG9wdGlvbmFsIG1ldGhvZCwgeW91IHdpbGwgcmVkdWNlIHRoZSBsYXRlbmN5IG9mIGZ1dHVyZSBhdXRoIGZsb3dzLlxuICogTG9hZGluZyB0aGUgcmVDQVBUQ0hBIGNvbmZpZyBlYXJseSB3aWxsIGFsc28gZW5oYW5jZSB0aGUgc2lnbmFsIGNvbGxlY3RlZCBieSByZUNBUFRDSEEuXG4gKlxuICogVGhpcyBtZXRob2QgZG9lcyBub3Qgd29yayBpbiBhIE5vZGUuanMgZW52aXJvbm1lbnQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGluaXRpYWxpemVSZWNhcHRjaGFDb25maWcoYXV0aCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdGlhbGl6ZVJlY2FwdGNoYUNvbmZpZyhhdXRoOiBBdXRoKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBfaW5pdGlhbGl6ZVJlY2FwdGNoYUNvbmZpZyhhdXRoKTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhlIHBhc3N3b3JkIGFnYWluc3QgdGhlIHBhc3N3b3JkIHBvbGljeSBjb25maWd1cmVkIGZvciB0aGUgcHJvamVjdCBvciB0ZW5hbnQuXG4gKlxuICogQHJlbWFya3NcbiAqIElmIG5vIHRlbmFudCBJRCBpcyBzZXQgb24gdGhlIGBBdXRoYCBpbnN0YW5jZSwgdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHVzZSB0aGUgcGFzc3dvcmRcbiAqIHBvbGljeSBjb25maWd1cmVkIGZvciB0aGUgcHJvamVjdC4gT3RoZXJ3aXNlLCB0aGlzIG1ldGhvZCB3aWxsIHVzZSB0aGUgcG9saWN5IGNvbmZpZ3VyZWRcbiAqIGZvciB0aGUgdGVuYW50LiBJZiBhIHBhc3N3b3JkIHBvbGljeSBoYXMgbm90IGJlZW4gY29uZmlndXJlZCwgdGhlbiB0aGUgZGVmYXVsdCBwb2xpY3lcbiAqIGNvbmZpZ3VyZWQgZm9yIGFsbCBwcm9qZWN0cyB3aWxsIGJlIHVzZWQuXG4gKlxuICogSWYgYW4gYXV0aCBmbG93IGZhaWxzIGJlY2F1c2UgYSBzdWJtaXR0ZWQgcGFzc3dvcmQgZG9lcyBub3QgbWVldCB0aGUgcGFzc3dvcmQgcG9saWN5XG4gKiByZXF1aXJlbWVudHMgYW5kIHRoaXMgbWV0aG9kIGhhcyBwcmV2aW91c2x5IGJlZW4gY2FsbGVkLCB0aGVuIHRoaXMgbWV0aG9kIHdpbGwgdXNlIHRoZVxuICogbW9zdCByZWNlbnQgcG9saWN5IGF2YWlsYWJsZSB3aGVuIGNhbGxlZCBhZ2Fpbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgamF2YXNjcmlwdFxuICogdmFsaWRhdGVQYXNzd29yZChhdXRoLCAnc29tZS1wYXNzd29yZCcpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGF1dGggVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXNzd29yZCBUaGUgcGFzc3dvcmQgdG8gdmFsaWRhdGUuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmFsaWRhdGVQYXNzd29yZChcbiAgYXV0aDogQXV0aCxcbiAgcGFzc3dvcmQ6IHN0cmluZ1xuKTogUHJvbWlzZTxQYXNzd29yZFZhbGlkYXRpb25TdGF0dXM+IHtcbiAgY29uc3QgYXV0aEludGVybmFsID0gX2Nhc3RBdXRoKGF1dGgpO1xuICByZXR1cm4gYXV0aEludGVybmFsLnZhbGlkYXRlUGFzc3dvcmQocGFzc3dvcmQpO1xufVxuXG4vKipcbiAqIEFkZHMgYW4gb2JzZXJ2ZXIgZm9yIGNoYW5nZXMgdG8gdGhlIHNpZ25lZC1pbiB1c2VyJ3MgSUQgdG9rZW4uXG4gKlxuICogQHJlbWFya3NcbiAqIFRoaXMgaW5jbHVkZXMgc2lnbi1pbiwgc2lnbi1vdXQsIGFuZCB0b2tlbiByZWZyZXNoIGV2ZW50cy5cbiAqIFRoaXMgd2lsbCBub3QgYmUgdHJpZ2dlcmVkIGF1dG9tYXRpY2FsbHkgdXBvbiBJRCB0b2tlbiBleHBpcmF0aW9uLiBVc2Uge0BsaW5rIFVzZXIuZ2V0SWRUb2tlbn0gdG8gcmVmcmVzaCB0aGUgSUQgdG9rZW4uXG4gKlxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxuICogQHBhcmFtIG5leHRPck9ic2VydmVyIC0gY2FsbGJhY2sgdHJpZ2dlcmVkIG9uIGNoYW5nZS5cbiAqIEBwYXJhbSBlcnJvciAtIERlcHJlY2F0ZWQuIFRoaXMgY2FsbGJhY2sgaXMgbmV2ZXIgdHJpZ2dlcmVkLiBFcnJvcnNcbiAqIG9uIHNpZ25pbmcgaW4vb3V0IGNhbiBiZSBjYXVnaHQgaW4gcHJvbWlzZXMgcmV0dXJuZWQgZnJvbVxuICogc2lnbi1pbi9zaWduLW91dCBmdW5jdGlvbnMuXG4gKiBAcGFyYW0gY29tcGxldGVkIC0gRGVwcmVjYXRlZC4gVGhpcyBjYWxsYmFjayBpcyBuZXZlciB0cmlnZ2VyZWQuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gb25JZFRva2VuQ2hhbmdlZChcbiAgYXV0aDogQXV0aCxcbiAgbmV4dE9yT2JzZXJ2ZXI6IE5leHRPck9ic2VydmVyPFVzZXI+LFxuICBlcnJvcj86IEVycm9yRm4sXG4gIGNvbXBsZXRlZD86IENvbXBsZXRlRm5cbik6IFVuc3Vic2NyaWJlIHtcbiAgcmV0dXJuIGdldE1vZHVsYXJJbnN0YW5jZShhdXRoKS5vbklkVG9rZW5DaGFuZ2VkKFxuICAgIG5leHRPck9ic2VydmVyLFxuICAgIGVycm9yLFxuICAgIGNvbXBsZXRlZFxuICApO1xufVxuLyoqXG4gKiBBZGRzIGEgYmxvY2tpbmcgY2FsbGJhY2sgdGhhdCBydW5zIGJlZm9yZSBhbiBhdXRoIHN0YXRlIGNoYW5nZVxuICogc2V0cyBhIG5ldyB1c2VyLlxuICpcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIGNhbGxiYWNrIHRyaWdnZXJlZCBiZWZvcmUgbmV3IHVzZXIgdmFsdWUgaXMgc2V0LlxuICogICBJZiB0aGlzIHRocm93cywgaXQgYmxvY2tzIHRoZSB1c2VyIGZyb20gYmVpbmcgc2V0LlxuICogQHBhcmFtIG9uQWJvcnQgLSBjYWxsYmFjayB0cmlnZ2VyZWQgaWYgYSBsYXRlciBgYmVmb3JlQXV0aFN0YXRlQ2hhbmdlZCgpYFxuICogICBjYWxsYmFjayB0aHJvd3MsIGFsbG93aW5nIHlvdSB0byB1bmRvIGFueSBzaWRlIGVmZmVjdHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiZWZvcmVBdXRoU3RhdGVDaGFuZ2VkKFxuICBhdXRoOiBBdXRoLFxuICBjYWxsYmFjazogKHVzZXI6IFVzZXIgfCBudWxsKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPixcbiAgb25BYm9ydD86ICgpID0+IHZvaWRcbik6IFVuc3Vic2NyaWJlIHtcbiAgcmV0dXJuIGdldE1vZHVsYXJJbnN0YW5jZShhdXRoKS5iZWZvcmVBdXRoU3RhdGVDaGFuZ2VkKGNhbGxiYWNrLCBvbkFib3J0KTtcbn1cbi8qKlxuICogQWRkcyBhbiBvYnNlcnZlciBmb3IgY2hhbmdlcyB0byB0aGUgdXNlcidzIHNpZ24taW4gc3RhdGUuXG4gKlxuICogQHJlbWFya3NcbiAqIFRvIGtlZXAgdGhlIG9sZCBiZWhhdmlvciwgc2VlIHtAbGluayBvbklkVG9rZW5DaGFuZ2VkfS5cbiAqXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXG4gKiBAcGFyYW0gbmV4dE9yT2JzZXJ2ZXIgLSBjYWxsYmFjayB0cmlnZ2VyZWQgb24gY2hhbmdlLlxuICogQHBhcmFtIGVycm9yIC0gRGVwcmVjYXRlZC4gVGhpcyBjYWxsYmFjayBpcyBuZXZlciB0cmlnZ2VyZWQuIEVycm9yc1xuICogb24gc2lnbmluZyBpbi9vdXQgY2FuIGJlIGNhdWdodCBpbiBwcm9taXNlcyByZXR1cm5lZCBmcm9tXG4gKiBzaWduLWluL3NpZ24tb3V0IGZ1bmN0aW9ucy5cbiAqIEBwYXJhbSBjb21wbGV0ZWQgLSBEZXByZWNhdGVkLiBUaGlzIGNhbGxiYWNrIGlzIG5ldmVyIHRyaWdnZXJlZC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkF1dGhTdGF0ZUNoYW5nZWQoXG4gIGF1dGg6IEF1dGgsXG4gIG5leHRPck9ic2VydmVyOiBOZXh0T3JPYnNlcnZlcjxVc2VyPixcbiAgZXJyb3I/OiBFcnJvckZuLFxuICBjb21wbGV0ZWQ/OiBDb21wbGV0ZUZuXG4pOiBVbnN1YnNjcmliZSB7XG4gIHJldHVybiBnZXRNb2R1bGFySW5zdGFuY2UoYXV0aCkub25BdXRoU3RhdGVDaGFuZ2VkKFxuICAgIG5leHRPck9ic2VydmVyLFxuICAgIGVycm9yLFxuICAgIGNvbXBsZXRlZFxuICApO1xufVxuLyoqXG4gKiBTZXRzIHRoZSBjdXJyZW50IGxhbmd1YWdlIHRvIHRoZSBkZWZhdWx0IGRldmljZS9icm93c2VyIHByZWZlcmVuY2UuXG4gKlxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZURldmljZUxhbmd1YWdlKGF1dGg6IEF1dGgpOiB2b2lkIHtcbiAgZ2V0TW9kdWxhckluc3RhbmNlKGF1dGgpLnVzZURldmljZUxhbmd1YWdlKCk7XG59XG4vKipcbiAqIEFzeW5jaHJvbm91c2x5IHNldHMgdGhlIHByb3ZpZGVkIHVzZXIgYXMge0BsaW5rIEF1dGguY3VycmVudFVzZXJ9IG9uIHRoZVxuICoge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxuICpcbiAqIEByZW1hcmtzXG4gKiBBIG5ldyBpbnN0YW5jZSBjb3B5IG9mIHRoZSB1c2VyIHByb3ZpZGVkIHdpbGwgYmUgbWFkZSBhbmQgc2V0IGFzIGN1cnJlbnRVc2VyLlxuICpcbiAqIFRoaXMgd2lsbCB0cmlnZ2VyIHtAbGluayBvbkF1dGhTdGF0ZUNoYW5nZWR9IGFuZCB7QGxpbmsgb25JZFRva2VuQ2hhbmdlZH0gbGlzdGVuZXJzXG4gKiBsaWtlIG90aGVyIHNpZ24gaW4gbWV0aG9kcy5cbiAqXG4gKiBUaGUgb3BlcmF0aW9uIGZhaWxzIHdpdGggYW4gZXJyb3IgaWYgdGhlIHVzZXIgdG8gYmUgdXBkYXRlZCBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEZpcmViYXNlXG4gKiBwcm9qZWN0LlxuICpcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cbiAqIEBwYXJhbSB1c2VyIC0gVGhlIG5ldyB7QGxpbmsgVXNlcn0uXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlQ3VycmVudFVzZXIoXG4gIGF1dGg6IEF1dGgsXG4gIHVzZXI6IFVzZXIgfCBudWxsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGdldE1vZHVsYXJJbnN0YW5jZShhdXRoKS51cGRhdGVDdXJyZW50VXNlcih1c2VyKTtcbn1cbi8qKlxuICogU2lnbnMgb3V0IHRoZSBjdXJyZW50IHVzZXIuXG4gKlxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25PdXQoYXV0aDogQXV0aCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gZ2V0TW9kdWxhckluc3RhbmNlKGF1dGgpLnNpZ25PdXQoKTtcbn1cblxuZXhwb3J0IHsgaW5pdGlhbGl6ZUF1dGggfSBmcm9tICcuL2F1dGgvaW5pdGlhbGl6ZSc7XG5leHBvcnQgeyBjb25uZWN0QXV0aEVtdWxhdG9yIH0gZnJvbSAnLi9hdXRoL2VtdWxhdG9yJztcblxuLy8gY3JlZGVudGlhbHNcbmV4cG9ydCB7IEF1dGhDcmVkZW50aWFsIH0gZnJvbSAnLi9jcmVkZW50aWFscyc7XG5leHBvcnQgeyBFbWFpbEF1dGhDcmVkZW50aWFsIH0gZnJvbSAnLi9jcmVkZW50aWFscy9lbWFpbCc7XG5leHBvcnQgeyBPQXV0aENyZWRlbnRpYWwgfSBmcm9tICcuL2NyZWRlbnRpYWxzL29hdXRoJztcbmV4cG9ydCB7IFBob25lQXV0aENyZWRlbnRpYWwgfSBmcm9tICcuL2NyZWRlbnRpYWxzL3Bob25lJztcblxuLy8gcGVyc2lzdGVuY2VcbmV4cG9ydCB7IGluTWVtb3J5UGVyc2lzdGVuY2UgfSBmcm9tICcuL3BlcnNpc3RlbmNlL2luX21lbW9yeSc7XG5cbi8vIHByb3ZpZGVyc1xuZXhwb3J0IHsgRW1haWxBdXRoUHJvdmlkZXIgfSBmcm9tICcuL3Byb3ZpZGVycy9lbWFpbCc7XG5leHBvcnQgeyBGYWNlYm9va0F1dGhQcm92aWRlciB9IGZyb20gJy4vcHJvdmlkZXJzL2ZhY2Vib29rJztcbmV4cG9ydCB7IEN1c3RvbVBhcmFtZXRlcnMgfSBmcm9tICcuL3Byb3ZpZGVycy9mZWRlcmF0ZWQnO1xuZXhwb3J0IHsgR29vZ2xlQXV0aFByb3ZpZGVyIH0gZnJvbSAnLi9wcm92aWRlcnMvZ29vZ2xlJztcbmV4cG9ydCB7IEdpdGh1YkF1dGhQcm92aWRlciB9IGZyb20gJy4vcHJvdmlkZXJzL2dpdGh1Yic7XG5leHBvcnQgeyBPQXV0aFByb3ZpZGVyLCBPQXV0aENyZWRlbnRpYWxPcHRpb25zIH0gZnJvbSAnLi9wcm92aWRlcnMvb2F1dGgnO1xuZXhwb3J0IHsgU0FNTEF1dGhQcm92aWRlciB9IGZyb20gJy4vcHJvdmlkZXJzL3NhbWwnO1xuZXhwb3J0IHsgVHdpdHRlckF1dGhQcm92aWRlciB9IGZyb20gJy4vcHJvdmlkZXJzL3R3aXR0ZXInO1xuXG4vLyBzdHJhdGVnaWVzXG5leHBvcnQgeyBzaWduSW5Bbm9ueW1vdXNseSB9IGZyb20gJy4vc3RyYXRlZ2llcy9hbm9ueW1vdXMnO1xuZXhwb3J0IHtcbiAgc2lnbkluV2l0aENyZWRlbnRpYWwsXG4gIGxpbmtXaXRoQ3JlZGVudGlhbCxcbiAgcmVhdXRoZW50aWNhdGVXaXRoQ3JlZGVudGlhbFxufSBmcm9tICcuL3N0cmF0ZWdpZXMvY3JlZGVudGlhbCc7XG5leHBvcnQgeyBzaWduSW5XaXRoQ3VzdG9tVG9rZW4gfSBmcm9tICcuL3N0cmF0ZWdpZXMvY3VzdG9tX3Rva2VuJztcbmV4cG9ydCB7XG4gIHNlbmRQYXNzd29yZFJlc2V0RW1haWwsXG4gIGNvbmZpcm1QYXNzd29yZFJlc2V0LFxuICBhcHBseUFjdGlvbkNvZGUsXG4gIGNoZWNrQWN0aW9uQ29kZSxcbiAgdmVyaWZ5UGFzc3dvcmRSZXNldENvZGUsXG4gIGNyZWF0ZVVzZXJXaXRoRW1haWxBbmRQYXNzd29yZCxcbiAgc2lnbkluV2l0aEVtYWlsQW5kUGFzc3dvcmRcbn0gZnJvbSAnLi9zdHJhdGVnaWVzL2VtYWlsX2FuZF9wYXNzd29yZCc7XG5leHBvcnQge1xuICBzZW5kU2lnbkluTGlua1RvRW1haWwsXG4gIGlzU2lnbkluV2l0aEVtYWlsTGluayxcbiAgc2lnbkluV2l0aEVtYWlsTGlua1xufSBmcm9tICcuL3N0cmF0ZWdpZXMvZW1haWxfbGluayc7XG5leHBvcnQge1xuICBmZXRjaFNpZ25Jbk1ldGhvZHNGb3JFbWFpbCxcbiAgc2VuZEVtYWlsVmVyaWZpY2F0aW9uLFxuICB2ZXJpZnlCZWZvcmVVcGRhdGVFbWFpbFxufSBmcm9tICcuL3N0cmF0ZWdpZXMvZW1haWwnO1xuXG4vLyBjb3JlXG5leHBvcnQgeyBBY3Rpb25Db2RlVVJMLCBwYXJzZUFjdGlvbkNvZGVVUkwgfSBmcm9tICcuL2FjdGlvbl9jb2RlX3VybCc7XG5cbi8vIHVzZXJcbmV4cG9ydCB7XG4gIHVwZGF0ZVByb2ZpbGUsXG4gIHVwZGF0ZUVtYWlsLFxuICB1cGRhdGVQYXNzd29yZFxufSBmcm9tICcuL3VzZXIvYWNjb3VudF9pbmZvJztcbmV4cG9ydCB7IGdldElkVG9rZW4sIGdldElkVG9rZW5SZXN1bHQgfSBmcm9tICcuL3VzZXIvaWRfdG9rZW5fcmVzdWx0JztcbmV4cG9ydCB7IHVubGluayB9IGZyb20gJy4vdXNlci9saW5rX3VubGluayc7XG5leHBvcnQgeyBnZXRBZGRpdGlvbmFsVXNlckluZm8gfSBmcm9tICcuL3VzZXIvYWRkaXRpb25hbF91c2VyX2luZm8nO1xuXG4vLyBOb24tb3B0aW9uYWwgdXNlciBtZXRob2RzLlxuZXhwb3J0IHsgcmVsb2FkIH0gZnJvbSAnLi91c2VyL3JlbG9hZCc7XG4vKipcbiAqIERlbGV0ZXMgYW5kIHNpZ25zIG91dCB0aGUgdXNlci5cbiAqXG4gKiBAcmVtYXJrc1xuICogSW1wb3J0YW50OiB0aGlzIGlzIGEgc2VjdXJpdHktc2Vuc2l0aXZlIG9wZXJhdGlvbiB0aGF0IHJlcXVpcmVzIHRoZSB1c2VyIHRvIGhhdmUgcmVjZW50bHlcbiAqIHNpZ25lZCBpbi4gSWYgdGhpcyByZXF1aXJlbWVudCBpc24ndCBtZXQsIGFzayB0aGUgdXNlciB0byBhdXRoZW50aWNhdGUgYWdhaW4gYW5kIHRoZW4gY2FsbFxuICoge0BsaW5rIHJlYXV0aGVudGljYXRlV2l0aENyZWRlbnRpYWx9LlxuICpcbiAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsZXRlVXNlcih1c2VyOiBVc2VyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBnZXRNb2R1bGFySW5zdGFuY2UodXNlcikuZGVsZXRlKCk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgVXNlckludGVybmFsIH0gZnJvbSAnLi4vbW9kZWwvdXNlcic7XG5pbXBvcnQgeyBNdWx0aUZhY3RvclNlc3Npb24gfSBmcm9tICcuLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuXG5leHBvcnQgY29uc3QgZW51bSBNdWx0aUZhY3RvclNlc3Npb25UeXBlIHtcbiAgRU5ST0xMID0gJ2Vucm9sbCcsXG4gIFNJR05fSU4gPSAnc2lnbmluJ1xufVxuXG5pbnRlcmZhY2UgU2VyaWFsaXplZE11bHRpRmFjdG9yU2Vzc2lvbiB7XG4gIG11bHRpRmFjdG9yU2Vzc2lvbjoge1xuICAgIGlkVG9rZW4/OiBzdHJpbmc7XG4gICAgcGVuZGluZ0NyZWRlbnRpYWw/OiBzdHJpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBNdWx0aUZhY3RvclNlc3Npb25JbXBsIGltcGxlbWVudHMgTXVsdGlGYWN0b3JTZXNzaW9uIHtcbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICByZWFkb25seSB0eXBlOiBNdWx0aUZhY3RvclNlc3Npb25UeXBlLFxuICAgIHJlYWRvbmx5IGNyZWRlbnRpYWw6IHN0cmluZyxcbiAgICByZWFkb25seSB1c2VyPzogVXNlckludGVybmFsXG4gICkge31cblxuICBzdGF0aWMgX2Zyb21JZHRva2VuKFxuICAgIGlkVG9rZW46IHN0cmluZyxcbiAgICB1c2VyPzogVXNlckludGVybmFsXG4gICk6IE11bHRpRmFjdG9yU2Vzc2lvbkltcGwge1xuICAgIHJldHVybiBuZXcgTXVsdGlGYWN0b3JTZXNzaW9uSW1wbChcbiAgICAgIE11bHRpRmFjdG9yU2Vzc2lvblR5cGUuRU5ST0xMLFxuICAgICAgaWRUb2tlbixcbiAgICAgIHVzZXJcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIF9mcm9tTWZhUGVuZGluZ0NyZWRlbnRpYWwoXG4gICAgbWZhUGVuZGluZ0NyZWRlbnRpYWw6IHN0cmluZ1xuICApOiBNdWx0aUZhY3RvclNlc3Npb25JbXBsIHtcbiAgICByZXR1cm4gbmV3IE11bHRpRmFjdG9yU2Vzc2lvbkltcGwoXG4gICAgICBNdWx0aUZhY3RvclNlc3Npb25UeXBlLlNJR05fSU4sXG4gICAgICBtZmFQZW5kaW5nQ3JlZGVudGlhbFxuICAgICk7XG4gIH1cblxuICB0b0pTT04oKTogU2VyaWFsaXplZE11bHRpRmFjdG9yU2Vzc2lvbiB7XG4gICAgY29uc3Qga2V5ID1cbiAgICAgIHRoaXMudHlwZSA9PT0gTXVsdGlGYWN0b3JTZXNzaW9uVHlwZS5FTlJPTExcbiAgICAgICAgPyAnaWRUb2tlbidcbiAgICAgICAgOiAncGVuZGluZ0NyZWRlbnRpYWwnO1xuICAgIHJldHVybiB7XG4gICAgICBtdWx0aUZhY3RvclNlc3Npb246IHtcbiAgICAgICAgW2tleV06IHRoaXMuY3JlZGVudGlhbFxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgZnJvbUpTT04oXG4gICAgb2JqOiBQYXJ0aWFsPFNlcmlhbGl6ZWRNdWx0aUZhY3RvclNlc3Npb24+XG4gICk6IE11bHRpRmFjdG9yU2Vzc2lvbkltcGwgfCBudWxsIHtcbiAgICBpZiAob2JqPy5tdWx0aUZhY3RvclNlc3Npb24pIHtcbiAgICAgIGlmIChvYmoubXVsdGlGYWN0b3JTZXNzaW9uPy5wZW5kaW5nQ3JlZGVudGlhbCkge1xuICAgICAgICByZXR1cm4gTXVsdGlGYWN0b3JTZXNzaW9uSW1wbC5fZnJvbU1mYVBlbmRpbmdDcmVkZW50aWFsKFxuICAgICAgICAgIG9iai5tdWx0aUZhY3RvclNlc3Npb24ucGVuZGluZ0NyZWRlbnRpYWxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAob2JqLm11bHRpRmFjdG9yU2Vzc2lvbj8uaWRUb2tlbikge1xuICAgICAgICByZXR1cm4gTXVsdGlGYWN0b3JTZXNzaW9uSW1wbC5fZnJvbUlkdG9rZW4oXG4gICAgICAgICAgb2JqLm11bHRpRmFjdG9yU2Vzc2lvbi5pZFRva2VuXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgQXV0aCxcbiAgTXVsdGlGYWN0b3JSZXNvbHZlcixcbiAgVXNlckNyZWRlbnRpYWwsXG4gIE11bHRpRmFjdG9yRXJyb3Jcbn0gZnJvbSAnLi4vbW9kZWwvcHVibGljX3R5cGVzJztcblxuaW1wb3J0IHsgX2Nhc3RBdXRoIH0gZnJvbSAnLi4vY29yZS9hdXRoL2F1dGhfaW1wbCc7XG5pbXBvcnQgeyBBdXRoRXJyb3JDb2RlIH0gZnJvbSAnLi4vY29yZS9lcnJvcnMnO1xuaW1wb3J0IHsgVXNlckNyZWRlbnRpYWxJbXBsIH0gZnJvbSAnLi4vY29yZS91c2VyL3VzZXJfY3JlZGVudGlhbF9pbXBsJztcbmltcG9ydCB7IF9hc3NlcnQsIF9mYWlsIH0gZnJvbSAnLi4vY29yZS91dGlsL2Fzc2VydCc7XG5pbXBvcnQgeyBVc2VyQ3JlZGVudGlhbEludGVybmFsIH0gZnJvbSAnLi4vbW9kZWwvdXNlcic7XG5pbXBvcnQgeyBNdWx0aUZhY3RvckFzc2VydGlvbkltcGwgfSBmcm9tICcuL21mYV9hc3NlcnRpb24nO1xuaW1wb3J0IHsgTXVsdGlGYWN0b3JFcnJvciBhcyBNdWx0aUZhY3RvckVycm9ySW50ZXJuYWwgfSBmcm9tICcuL21mYV9lcnJvcic7XG5pbXBvcnQgeyBNdWx0aUZhY3RvckluZm9JbXBsIH0gZnJvbSAnLi9tZmFfaW5mbyc7XG5pbXBvcnQgeyBNdWx0aUZhY3RvclNlc3Npb25JbXBsIH0gZnJvbSAnLi9tZmFfc2Vzc2lvbic7XG5pbXBvcnQgeyBnZXRNb2R1bGFySW5zdGFuY2UgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5pbXBvcnQgeyBPcGVyYXRpb25UeXBlIH0gZnJvbSAnLi4vbW9kZWwvZW51bXMnO1xuXG5leHBvcnQgY2xhc3MgTXVsdGlGYWN0b3JSZXNvbHZlckltcGwgaW1wbGVtZW50cyBNdWx0aUZhY3RvclJlc29sdmVyIHtcbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICByZWFkb25seSBzZXNzaW9uOiBNdWx0aUZhY3RvclNlc3Npb25JbXBsLFxuICAgIHJlYWRvbmx5IGhpbnRzOiBNdWx0aUZhY3RvckluZm9JbXBsW10sXG4gICAgcHJpdmF0ZSByZWFkb25seSBzaWduSW5SZXNvbHZlcjogKFxuICAgICAgYXNzZXJ0aW9uOiBNdWx0aUZhY3RvckFzc2VydGlvbkltcGxcbiAgICApID0+IFByb21pc2U8VXNlckNyZWRlbnRpYWxJbnRlcm5hbD5cbiAgKSB7fVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgc3RhdGljIF9mcm9tRXJyb3IoXG4gICAgYXV0aEV4dGVybjogQXV0aCxcbiAgICBlcnJvcjogTXVsdGlGYWN0b3JFcnJvckludGVybmFsXG4gICk6IE11bHRpRmFjdG9yUmVzb2x2ZXJJbXBsIHtcbiAgICBjb25zdCBhdXRoID0gX2Nhc3RBdXRoKGF1dGhFeHRlcm4pO1xuICAgIGNvbnN0IHNlcnZlclJlc3BvbnNlID0gZXJyb3IuY3VzdG9tRGF0YS5fc2VydmVyUmVzcG9uc2U7XG4gICAgY29uc3QgaGludHMgPSAoc2VydmVyUmVzcG9uc2UubWZhSW5mbyB8fCBbXSkubWFwKGVucm9sbG1lbnQgPT5cbiAgICAgIE11bHRpRmFjdG9ySW5mb0ltcGwuX2Zyb21TZXJ2ZXJSZXNwb25zZShhdXRoLCBlbnJvbGxtZW50KVxuICAgICk7XG5cbiAgICBfYXNzZXJ0KFxuICAgICAgc2VydmVyUmVzcG9uc2UubWZhUGVuZGluZ0NyZWRlbnRpYWwsXG4gICAgICBhdXRoLFxuICAgICAgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUlxuICAgICk7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IE11bHRpRmFjdG9yU2Vzc2lvbkltcGwuX2Zyb21NZmFQZW5kaW5nQ3JlZGVudGlhbChcbiAgICAgIHNlcnZlclJlc3BvbnNlLm1mYVBlbmRpbmdDcmVkZW50aWFsXG4gICAgKTtcblxuICAgIHJldHVybiBuZXcgTXVsdGlGYWN0b3JSZXNvbHZlckltcGwoXG4gICAgICBzZXNzaW9uLFxuICAgICAgaGludHMsXG4gICAgICBhc3luYyAoXG4gICAgICAgIGFzc2VydGlvbjogTXVsdGlGYWN0b3JBc3NlcnRpb25JbXBsXG4gICAgICApOiBQcm9taXNlPFVzZXJDcmVkZW50aWFsSW50ZXJuYWw+ID0+IHtcbiAgICAgICAgY29uc3QgbWZhUmVzcG9uc2UgPSBhd2FpdCBhc3NlcnRpb24uX3Byb2Nlc3MoYXV0aCwgc2Vzc2lvbik7XG4gICAgICAgIC8vIENsZWFyIG91dCB0aGUgdW5uZWVkZWQgZmllbGRzIGZyb20gdGhlIG9sZCBsb2dpbiByZXNwb25zZVxuICAgICAgICBkZWxldGUgc2VydmVyUmVzcG9uc2UubWZhSW5mbztcbiAgICAgICAgZGVsZXRlIHNlcnZlclJlc3BvbnNlLm1mYVBlbmRpbmdDcmVkZW50aWFsO1xuXG4gICAgICAgIC8vIFVzZSBpbiB0aGUgbmV3IHRva2VuICYgcmVmcmVzaCB0b2tlbiBpbiB0aGUgb2xkIHJlc3BvbnNlXG4gICAgICAgIGNvbnN0IGlkVG9rZW5SZXNwb25zZSA9IHtcbiAgICAgICAgICAuLi5zZXJ2ZXJSZXNwb25zZSxcbiAgICAgICAgICBpZFRva2VuOiBtZmFSZXNwb25zZS5pZFRva2VuLFxuICAgICAgICAgIHJlZnJlc2hUb2tlbjogbWZhUmVzcG9uc2UucmVmcmVzaFRva2VuXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gVE9ETzogd2Ugc2hvdWxkIGNvbGxhcHNlIHRoaXMgc3dpdGNoIHN0YXRlbWVudCBpbnRvIFVzZXJDcmVkZW50aWFsSW1wbC5fZm9yT3BlcmF0aW9uIGFuZCBoYXZlIGl0IHN1cHBvcnQgdGhlIFNJR05fSU4gY2FzZVxuICAgICAgICBzd2l0Y2ggKGVycm9yLm9wZXJhdGlvblR5cGUpIHtcbiAgICAgICAgICBjYXNlIE9wZXJhdGlvblR5cGUuU0lHTl9JTjpcbiAgICAgICAgICAgIGNvbnN0IHVzZXJDcmVkZW50aWFsID1cbiAgICAgICAgICAgICAgYXdhaXQgVXNlckNyZWRlbnRpYWxJbXBsLl9mcm9tSWRUb2tlblJlc3BvbnNlKFxuICAgICAgICAgICAgICAgIGF1dGgsXG4gICAgICAgICAgICAgICAgZXJyb3Iub3BlcmF0aW9uVHlwZSxcbiAgICAgICAgICAgICAgICBpZFRva2VuUmVzcG9uc2VcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGF3YWl0IGF1dGguX3VwZGF0ZUN1cnJlbnRVc2VyKHVzZXJDcmVkZW50aWFsLnVzZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHVzZXJDcmVkZW50aWFsO1xuICAgICAgICAgIGNhc2UgT3BlcmF0aW9uVHlwZS5SRUFVVEhFTlRJQ0FURTpcbiAgICAgICAgICAgIF9hc3NlcnQoZXJyb3IudXNlciwgYXV0aCwgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG4gICAgICAgICAgICByZXR1cm4gVXNlckNyZWRlbnRpYWxJbXBsLl9mb3JPcGVyYXRpb24oXG4gICAgICAgICAgICAgIGVycm9yLnVzZXIsXG4gICAgICAgICAgICAgIGVycm9yLm9wZXJhdGlvblR5cGUsXG4gICAgICAgICAgICAgIGlkVG9rZW5SZXNwb25zZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgX2ZhaWwoYXV0aCwgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgYXN5bmMgcmVzb2x2ZVNpZ25JbihcbiAgICBhc3NlcnRpb25FeHRlcm46IE11bHRpRmFjdG9yQXNzZXJ0aW9uSW1wbFxuICApOiBQcm9taXNlPFVzZXJDcmVkZW50aWFsPiB7XG4gICAgY29uc3QgYXNzZXJ0aW9uID0gYXNzZXJ0aW9uRXh0ZXJuIGFzIE11bHRpRmFjdG9yQXNzZXJ0aW9uSW1wbDtcbiAgICByZXR1cm4gdGhpcy5zaWduSW5SZXNvbHZlcihhc3NlcnRpb24pO1xuICB9XG59XG5cbi8qKlxuICogUHJvdmlkZXMgYSB7QGxpbmsgTXVsdGlGYWN0b3JSZXNvbHZlcn0gc3VpdGFibGUgZm9yIGNvbXBsZXRpb24gb2YgYVxuICogbXVsdGktZmFjdG9yIGZsb3cuXG4gKlxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxuICogQHBhcmFtIGVycm9yIC0gVGhlIHtAbGluayBNdWx0aUZhY3RvckVycm9yfSByYWlzZWQgZHVyaW5nIGEgc2lnbi1pbiwgb3JcbiAqIHJlYXV0aGVudGljYXRpb24gb3BlcmF0aW9uLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE11bHRpRmFjdG9yUmVzb2x2ZXIoXG4gIGF1dGg6IEF1dGgsXG4gIGVycm9yOiBNdWx0aUZhY3RvckVycm9yXG4pOiBNdWx0aUZhY3RvclJlc29sdmVyIHtcbiAgY29uc3QgYXV0aE1vZHVsYXIgPSBnZXRNb2R1bGFySW5zdGFuY2UoYXV0aCk7XG4gIGNvbnN0IGVycm9ySW50ZXJuYWwgPSBlcnJvciBhcyBNdWx0aUZhY3RvckVycm9ySW50ZXJuYWw7XG4gIF9hc3NlcnQoXG4gICAgZXJyb3IuY3VzdG9tRGF0YS5vcGVyYXRpb25UeXBlLFxuICAgIGF1dGhNb2R1bGFyLFxuICAgIEF1dGhFcnJvckNvZGUuQVJHVU1FTlRfRVJST1JcbiAgKTtcbiAgX2Fzc2VydChcbiAgICBlcnJvckludGVybmFsLmN1c3RvbURhdGEuX3NlcnZlclJlc3BvbnNlPy5tZmFQZW5kaW5nQ3JlZGVudGlhbCxcbiAgICBhdXRoTW9kdWxhcixcbiAgICBBdXRoRXJyb3JDb2RlLkFSR1VNRU5UX0VSUk9SXG4gICk7XG5cbiAgcmV0dXJuIE11bHRpRmFjdG9yUmVzb2x2ZXJJbXBsLl9mcm9tRXJyb3IoYXV0aE1vZHVsYXIsIGVycm9ySW50ZXJuYWwpO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gIEVuZHBvaW50LFxuICBIdHRwTWV0aG9kLFxuICBfYWRkVGlkSWZOZWNlc3NhcnksXG4gIF9wZXJmb3JtQXBpUmVxdWVzdFxufSBmcm9tICcuLi9pbmRleCc7XG5pbXBvcnQgeyBTaWduSW5XaXRoUGhvbmVOdW1iZXJSZXF1ZXN0IH0gZnJvbSAnLi4vYXV0aGVudGljYXRpb24vc21zJztcbmltcG9ydCB7IEZpbmFsaXplTWZhUmVzcG9uc2UgfSBmcm9tICcuLi9hdXRoZW50aWNhdGlvbi9tZmEnO1xuaW1wb3J0IHsgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXV0aCc7XG5cbi8qKlxuICogTUZBIEluZm8gYXMgcmV0dXJuZWQgYnkgdGhlIEFQSS5cbiAqL1xuaW50ZXJmYWNlIEJhc2VNZmFFbnJvbGxtZW50IHtcbiAgbWZhRW5yb2xsbWVudElkOiBzdHJpbmc7XG4gIGVucm9sbGVkQXQ6IG51bWJlcjtcbiAgZGlzcGxheU5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQW4gTUZBIHByb3ZpZGVkIGJ5IFNNUyB2ZXJpZmljYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGhvbmVNZmFFbnJvbGxtZW50IGV4dGVuZHMgQmFzZU1mYUVucm9sbG1lbnQge1xuICBwaG9uZUluZm86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBbiBNRkEgcHJvdmlkZWQgYnkgVE9UUCAoVGltZS1iYXNlZCBPbmUgVGltZSBQYXNzd29yZCkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG90cE1mYUVucm9sbG1lbnQgZXh0ZW5kcyBCYXNlTWZhRW5yb2xsbWVudCB7fVxuXG4vKipcbiAqIE1mYUVucm9sbG1lbnQgY2FuIGJlIGFueSBzdWJ0eXBlIG9mIEJhc2VNZmFFbnJvbGxtZW50LCBjdXJyZW50bHkgb25seSBQaG9uZU1mYUVucm9sbG1lbnQgYW5kIFRvdHBNZmFFbnJvbGxtZW50IGFyZSBzdXBwb3J0ZWQuXG4gKi9cbmV4cG9ydCB0eXBlIE1mYUVucm9sbG1lbnQgPSBQaG9uZU1mYUVucm9sbG1lbnQgfCBUb3RwTWZhRW5yb2xsbWVudDtcblxuZXhwb3J0IGludGVyZmFjZSBTdGFydFBob25lTWZhRW5yb2xsbWVudFJlcXVlc3Qge1xuICBpZFRva2VuOiBzdHJpbmc7XG4gIHBob25lRW5yb2xsbWVudEluZm86IHtcbiAgICBwaG9uZU51bWJlcjogc3RyaW5nO1xuICAgIHJlY2FwdGNoYVRva2VuOiBzdHJpbmc7XG4gIH07XG4gIHRlbmFudElkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0UGhvbmVNZmFFbnJvbGxtZW50UmVzcG9uc2Uge1xuICBwaG9uZVNlc3Npb25JbmZvOiB7XG4gICAgc2Vzc2lvbkluZm86IHN0cmluZztcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0RW5yb2xsUGhvbmVNZmEoXG4gIGF1dGg6IEF1dGhJbnRlcm5hbCxcbiAgcmVxdWVzdDogU3RhcnRQaG9uZU1mYUVucm9sbG1lbnRSZXF1ZXN0XG4pOiBQcm9taXNlPFN0YXJ0UGhvbmVNZmFFbnJvbGxtZW50UmVzcG9uc2U+IHtcbiAgcmV0dXJuIF9wZXJmb3JtQXBpUmVxdWVzdDxcbiAgICBTdGFydFBob25lTWZhRW5yb2xsbWVudFJlcXVlc3QsXG4gICAgU3RhcnRQaG9uZU1mYUVucm9sbG1lbnRSZXNwb25zZVxuICA+KFxuICAgIGF1dGgsXG4gICAgSHR0cE1ldGhvZC5QT1NULFxuICAgIEVuZHBvaW50LlNUQVJUX01GQV9FTlJPTExNRU5ULFxuICAgIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KVxuICApO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbmFsaXplUGhvbmVNZmFFbnJvbGxtZW50UmVxdWVzdCB7XG4gIGlkVG9rZW46IHN0cmluZztcbiAgcGhvbmVWZXJpZmljYXRpb25JbmZvOiBTaWduSW5XaXRoUGhvbmVOdW1iZXJSZXF1ZXN0O1xuICBkaXNwbGF5TmFtZT86IHN0cmluZyB8IG51bGw7XG4gIHRlbmFudElkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbmFsaXplUGhvbmVNZmFFbnJvbGxtZW50UmVzcG9uc2VcbiAgZXh0ZW5kcyBGaW5hbGl6ZU1mYVJlc3BvbnNlIHt9XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5hbGl6ZUVucm9sbFBob25lTWZhKFxuICBhdXRoOiBBdXRoSW50ZXJuYWwsXG4gIHJlcXVlc3Q6IEZpbmFsaXplUGhvbmVNZmFFbnJvbGxtZW50UmVxdWVzdFxuKTogUHJvbWlzZTxGaW5hbGl6ZVBob25lTWZhRW5yb2xsbWVudFJlc3BvbnNlPiB7XG4gIHJldHVybiBfcGVyZm9ybUFwaVJlcXVlc3Q8XG4gICAgRmluYWxpemVQaG9uZU1mYUVucm9sbG1lbnRSZXF1ZXN0LFxuICAgIEZpbmFsaXplUGhvbmVNZmFFbnJvbGxtZW50UmVzcG9uc2VcbiAgPihcbiAgICBhdXRoLFxuICAgIEh0dHBNZXRob2QuUE9TVCxcbiAgICBFbmRwb2ludC5GSU5BTElaRV9NRkFfRU5ST0xMTUVOVCxcbiAgICBfYWRkVGlkSWZOZWNlc3NhcnkoYXV0aCwgcmVxdWVzdClcbiAgKTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnRUb3RwTWZhRW5yb2xsbWVudFJlcXVlc3Qge1xuICBpZFRva2VuOiBzdHJpbmc7XG4gIHRvdHBFbnJvbGxtZW50SW5mbzoge307XG4gIHRlbmFudElkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0VG90cE1mYUVucm9sbG1lbnRSZXNwb25zZSB7XG4gIHRvdHBTZXNzaW9uSW5mbzoge1xuICAgIHNoYXJlZFNlY3JldEtleTogc3RyaW5nO1xuICAgIHZlcmlmaWNhdGlvbkNvZGVMZW5ndGg6IG51bWJlcjtcbiAgICBoYXNoaW5nQWxnb3JpdGhtOiBzdHJpbmc7XG4gICAgcGVyaW9kU2VjOiBudW1iZXI7XG4gICAgc2Vzc2lvbkluZm86IHN0cmluZztcbiAgICBmaW5hbGl6ZUVucm9sbG1lbnRUaW1lOiBudW1iZXI7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdGFydEVucm9sbFRvdHBNZmEoXG4gIGF1dGg6IEF1dGhJbnRlcm5hbCxcbiAgcmVxdWVzdDogU3RhcnRUb3RwTWZhRW5yb2xsbWVudFJlcXVlc3Rcbik6IFByb21pc2U8U3RhcnRUb3RwTWZhRW5yb2xsbWVudFJlc3BvbnNlPiB7XG4gIHJldHVybiBfcGVyZm9ybUFwaVJlcXVlc3Q8XG4gICAgU3RhcnRUb3RwTWZhRW5yb2xsbWVudFJlcXVlc3QsXG4gICAgU3RhcnRUb3RwTWZhRW5yb2xsbWVudFJlc3BvbnNlXG4gID4oXG4gICAgYXV0aCxcbiAgICBIdHRwTWV0aG9kLlBPU1QsXG4gICAgRW5kcG9pbnQuU1RBUlRfTUZBX0VOUk9MTE1FTlQsXG4gICAgX2FkZFRpZElmTmVjZXNzYXJ5KGF1dGgsIHJlcXVlc3QpXG4gICk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG90cFZlcmlmaWNhdGlvbkluZm8ge1xuICBzZXNzaW9uSW5mbzogc3RyaW5nO1xuICB2ZXJpZmljYXRpb25Db2RlOiBzdHJpbmc7XG59XG5leHBvcnQgaW50ZXJmYWNlIEZpbmFsaXplVG90cE1mYUVucm9sbG1lbnRSZXF1ZXN0IHtcbiAgaWRUb2tlbjogc3RyaW5nO1xuICB0b3RwVmVyaWZpY2F0aW9uSW5mbzogVG90cFZlcmlmaWNhdGlvbkluZm87XG4gIGRpc3BsYXlOYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgdGVuYW50SWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmluYWxpemVUb3RwTWZhRW5yb2xsbWVudFJlc3BvbnNlXG4gIGV4dGVuZHMgRmluYWxpemVNZmFSZXNwb25zZSB7fVxuXG5leHBvcnQgZnVuY3Rpb24gZmluYWxpemVFbnJvbGxUb3RwTWZhKFxuICBhdXRoOiBBdXRoSW50ZXJuYWwsXG4gIHJlcXVlc3Q6IEZpbmFsaXplVG90cE1mYUVucm9sbG1lbnRSZXF1ZXN0XG4pOiBQcm9taXNlPEZpbmFsaXplVG90cE1mYUVucm9sbG1lbnRSZXNwb25zZT4ge1xuICByZXR1cm4gX3BlcmZvcm1BcGlSZXF1ZXN0PFxuICAgIEZpbmFsaXplVG90cE1mYUVucm9sbG1lbnRSZXF1ZXN0LFxuICAgIEZpbmFsaXplVG90cE1mYUVucm9sbG1lbnRSZXNwb25zZVxuICA+KFxuICAgIGF1dGgsXG4gICAgSHR0cE1ldGhvZC5QT1NULFxuICAgIEVuZHBvaW50LkZJTkFMSVpFX01GQV9FTlJPTExNRU5ULFxuICAgIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KVxuICApO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdpdGhkcmF3TWZhUmVxdWVzdCB7XG4gIGlkVG9rZW46IHN0cmluZztcbiAgbWZhRW5yb2xsbWVudElkOiBzdHJpbmc7XG4gIHRlbmFudElkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdpdGhkcmF3TWZhUmVzcG9uc2UgZXh0ZW5kcyBGaW5hbGl6ZU1mYVJlc3BvbnNlIHt9XG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoZHJhd01mYShcbiAgYXV0aDogQXV0aEludGVybmFsLFxuICByZXF1ZXN0OiBXaXRoZHJhd01mYVJlcXVlc3Rcbik6IFByb21pc2U8V2l0aGRyYXdNZmFSZXNwb25zZT4ge1xuICByZXR1cm4gX3BlcmZvcm1BcGlSZXF1ZXN0PFdpdGhkcmF3TWZhUmVxdWVzdCwgV2l0aGRyYXdNZmFSZXNwb25zZT4oXG4gICAgYXV0aCxcbiAgICBIdHRwTWV0aG9kLlBPU1QsXG4gICAgRW5kcG9pbnQuV0lUSERSQVdfTUZBLFxuICAgIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KVxuICApO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQge1xuICBNdWx0aUZhY3RvckFzc2VydGlvbixcbiAgTXVsdGlGYWN0b3JJbmZvLFxuICBNdWx0aUZhY3RvclNlc3Npb24sXG4gIE11bHRpRmFjdG9yVXNlcixcbiAgVXNlclxufSBmcm9tICcuLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuXG5pbXBvcnQgeyB3aXRoZHJhd01mYSB9IGZyb20gJy4uL2FwaS9hY2NvdW50X21hbmFnZW1lbnQvbWZhJztcbmltcG9ydCB7IF9sb2dvdXRJZkludmFsaWRhdGVkIH0gZnJvbSAnLi4vY29yZS91c2VyL2ludmFsaWRhdGlvbic7XG5pbXBvcnQgeyBVc2VySW50ZXJuYWwgfSBmcm9tICcuLi9tb2RlbC91c2VyJztcbmltcG9ydCB7IE11bHRpRmFjdG9yQXNzZXJ0aW9uSW1wbCB9IGZyb20gJy4vbWZhX2Fzc2VydGlvbic7XG5pbXBvcnQgeyBNdWx0aUZhY3RvckluZm9JbXBsIH0gZnJvbSAnLi9tZmFfaW5mbyc7XG5pbXBvcnQgeyBNdWx0aUZhY3RvclNlc3Npb25JbXBsIH0gZnJvbSAnLi9tZmFfc2Vzc2lvbic7XG5pbXBvcnQgeyBnZXRNb2R1bGFySW5zdGFuY2UgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBNdWx0aUZhY3RvclVzZXJJbXBsIGltcGxlbWVudHMgTXVsdGlGYWN0b3JVc2VyIHtcbiAgZW5yb2xsZWRGYWN0b3JzOiBNdWx0aUZhY3RvckluZm9bXSA9IFtdO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocmVhZG9ubHkgdXNlcjogVXNlckludGVybmFsKSB7XG4gICAgdXNlci5fb25SZWxvYWQodXNlckluZm8gPT4ge1xuICAgICAgaWYgKHVzZXJJbmZvLm1mYUluZm8pIHtcbiAgICAgICAgdGhpcy5lbnJvbGxlZEZhY3RvcnMgPSB1c2VySW5mby5tZmFJbmZvLm1hcChlbnJvbGxtZW50ID0+XG4gICAgICAgICAgTXVsdGlGYWN0b3JJbmZvSW1wbC5fZnJvbVNlcnZlclJlc3BvbnNlKHVzZXIuYXV0aCwgZW5yb2xsbWVudClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBfZnJvbVVzZXIodXNlcjogVXNlckludGVybmFsKTogTXVsdGlGYWN0b3JVc2VySW1wbCB7XG4gICAgcmV0dXJuIG5ldyBNdWx0aUZhY3RvclVzZXJJbXBsKHVzZXIpO1xuICB9XG5cbiAgYXN5bmMgZ2V0U2Vzc2lvbigpOiBQcm9taXNlPE11bHRpRmFjdG9yU2Vzc2lvbj4ge1xuICAgIHJldHVybiBNdWx0aUZhY3RvclNlc3Npb25JbXBsLl9mcm9tSWR0b2tlbihcbiAgICAgIGF3YWl0IHRoaXMudXNlci5nZXRJZFRva2VuKCksXG4gICAgICB0aGlzLnVzZXJcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZW5yb2xsKFxuICAgIGFzc2VydGlvbkV4dGVybjogTXVsdGlGYWN0b3JBc3NlcnRpb24sXG4gICAgZGlzcGxheU5hbWU/OiBzdHJpbmcgfCBudWxsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFzc2VydGlvbiA9IGFzc2VydGlvbkV4dGVybiBhcyBNdWx0aUZhY3RvckFzc2VydGlvbkltcGw7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IChhd2FpdCB0aGlzLmdldFNlc3Npb24oKSkgYXMgTXVsdGlGYWN0b3JTZXNzaW9uSW1wbDtcbiAgICBjb25zdCBmaW5hbGl6ZU1mYVJlc3BvbnNlID0gYXdhaXQgX2xvZ291dElmSW52YWxpZGF0ZWQoXG4gICAgICB0aGlzLnVzZXIsXG4gICAgICBhc3NlcnRpb24uX3Byb2Nlc3ModGhpcy51c2VyLmF1dGgsIHNlc3Npb24sIGRpc3BsYXlOYW1lKVxuICAgICk7XG4gICAgLy8gTmV3IHRva2VucyB3aWxsIGJlIGlzc3VlZCBhZnRlciBlbnJvbGxtZW50IG9mIHRoZSBuZXcgc2Vjb25kIGZhY3RvcnMuXG4gICAgLy8gVGhleSBuZWVkIHRvIGJlIHVwZGF0ZWQgb24gdGhlIHVzZXIuXG4gICAgYXdhaXQgdGhpcy51c2VyLl91cGRhdGVUb2tlbnNJZk5lY2Vzc2FyeShmaW5hbGl6ZU1mYVJlc3BvbnNlKTtcbiAgICAvLyBUaGUgdXNlciBuZWVkcyB0byBiZSByZWxvYWRlZCB0byBnZXQgdGhlIG5ldyBtdWx0aS1mYWN0b3IgaW5mb3JtYXRpb25cbiAgICAvLyBmcm9tIHNlcnZlci4gVVNFUl9SRUxPQURFRCBldmVudCB3aWxsIGJlIHRyaWdnZXJlZCBhbmQgYGVucm9sbGVkRmFjdG9yc2BcbiAgICAvLyB3aWxsIGJlIHVwZGF0ZWQuXG4gICAgcmV0dXJuIHRoaXMudXNlci5yZWxvYWQoKTtcbiAgfVxuXG4gIGFzeW5jIHVuZW5yb2xsKGluZm9PclVpZDogTXVsdGlGYWN0b3JJbmZvIHwgc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbWZhRW5yb2xsbWVudElkID1cbiAgICAgIHR5cGVvZiBpbmZvT3JVaWQgPT09ICdzdHJpbmcnID8gaW5mb09yVWlkIDogaW5mb09yVWlkLnVpZDtcbiAgICBjb25zdCBpZFRva2VuID0gYXdhaXQgdGhpcy51c2VyLmdldElkVG9rZW4oKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaWRUb2tlblJlc3BvbnNlID0gYXdhaXQgX2xvZ291dElmSW52YWxpZGF0ZWQoXG4gICAgICAgIHRoaXMudXNlcixcbiAgICAgICAgd2l0aGRyYXdNZmEodGhpcy51c2VyLmF1dGgsIHtcbiAgICAgICAgICBpZFRva2VuLFxuICAgICAgICAgIG1mYUVucm9sbG1lbnRJZFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIC8vIFJlbW92ZSB0aGUgc2Vjb25kIGZhY3RvciBmcm9tIHRoZSB1c2VyJ3MgbGlzdC5cbiAgICAgIHRoaXMuZW5yb2xsZWRGYWN0b3JzID0gdGhpcy5lbnJvbGxlZEZhY3RvcnMuZmlsdGVyKFxuICAgICAgICAoeyB1aWQgfSkgPT4gdWlkICE9PSBtZmFFbnJvbGxtZW50SWRcbiAgICAgICk7XG4gICAgICAvLyBEZXBlbmRpbmcgb24gd2hldGhlciB0aGUgYmFja2VuZCBkZWNpZGVkIHRvIHJldm9rZSB0aGUgdXNlcidzIHNlc3Npb24sXG4gICAgICAvLyB0aGUgdG9rZW5SZXNwb25zZSBtYXkgYmUgZW1wdHkuIElmIHRoZSB0b2tlbnMgd2VyZSBub3QgdXBkYXRlZCAoYW5kIHRoZXlcbiAgICAgIC8vIGFyZSBub3cgaW52YWxpZCksIHJlbG9hZGluZyB0aGUgdXNlciB3aWxsIGRpc2NvdmVyIHRoaXMgYW5kIGludmFsaWRhdGVcbiAgICAgIC8vIHRoZSB1c2VyJ3Mgc3RhdGUgYWNjb3JkaW5nbHkuXG4gICAgICBhd2FpdCB0aGlzLnVzZXIuX3VwZGF0ZVRva2Vuc0lmTmVjZXNzYXJ5KGlkVG9rZW5SZXNwb25zZSk7XG4gICAgICBhd2FpdCB0aGlzLnVzZXIucmVsb2FkKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgbXVsdGlGYWN0b3JVc2VyQ2FjaGUgPSBuZXcgV2Vha01hcDxVc2VyLCBNdWx0aUZhY3RvclVzZXI+KCk7XG5cbi8qKlxuICogVGhlIHtAbGluayBNdWx0aUZhY3RvclVzZXJ9IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXIuXG4gKlxuICogQHJlbWFya3NcbiAqIFRoaXMgaXMgdXNlZCB0byBhY2Nlc3MgYWxsIG11bHRpLWZhY3RvciBwcm9wZXJ0aWVzIGFuZCBvcGVyYXRpb25zIHJlbGF0ZWQgdG8gdGhlIHVzZXIuXG4gKlxuICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlci5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aUZhY3Rvcih1c2VyOiBVc2VyKTogTXVsdGlGYWN0b3JVc2VyIHtcbiAgY29uc3QgdXNlck1vZHVsYXIgPSBnZXRNb2R1bGFySW5zdGFuY2UodXNlcik7XG4gIGlmICghbXVsdGlGYWN0b3JVc2VyQ2FjaGUuaGFzKHVzZXJNb2R1bGFyKSkge1xuICAgIG11bHRpRmFjdG9yVXNlckNhY2hlLnNldChcbiAgICAgIHVzZXJNb2R1bGFyLFxuICAgICAgTXVsdGlGYWN0b3JVc2VySW1wbC5fZnJvbVVzZXIodXNlck1vZHVsYXIgYXMgVXNlckludGVybmFsKVxuICAgICk7XG4gIH1cbiAgcmV0dXJuIG11bHRpRmFjdG9yVXNlckNhY2hlLmdldCh1c2VyTW9kdWxhcikhO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyBQZXJzaXN0ZW5jZSB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBlbnVtIFBlcnNpc3RlbmNlVHlwZSB7XG4gIFNFU1NJT04gPSAnU0VTU0lPTicsXG4gIExPQ0FMID0gJ0xPQ0FMJyxcbiAgTk9ORSA9ICdOT05FJ1xufVxuXG5leHBvcnQgdHlwZSBQZXJzaXN0ZWRCbG9iID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGFudGlhdG9yPFQ+IHtcbiAgKGJsb2I6IFBlcnNpc3RlZEJsb2IpOiBUO1xufVxuXG5leHBvcnQgdHlwZSBQZXJzaXN0ZW5jZVZhbHVlID0gUGVyc2lzdGVkQmxvYiB8IHN0cmluZztcblxuZXhwb3J0IGNvbnN0IFNUT1JBR0VfQVZBSUxBQkxFX0tFWSA9ICdfX3Nhayc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmFnZUV2ZW50TGlzdGVuZXIge1xuICAodmFsdWU6IFBlcnNpc3RlbmNlVmFsdWUgfCBudWxsKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQZXJzaXN0ZW5jZUludGVybmFsIGV4dGVuZHMgUGVyc2lzdGVuY2Uge1xuICB0eXBlOiBQZXJzaXN0ZW5jZVR5cGU7XG4gIF9pc0F2YWlsYWJsZSgpOiBQcm9taXNlPGJvb2xlYW4+O1xuICBfc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogUGVyc2lzdGVuY2VWYWx1ZSk6IFByb21pc2U8dm9pZD47XG4gIF9nZXQ8VCBleHRlbmRzIFBlcnNpc3RlbmNlVmFsdWU+KGtleTogc3RyaW5nKTogUHJvbWlzZTxUIHwgbnVsbD47XG4gIF9yZW1vdmUoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuICBfYWRkTGlzdGVuZXIoa2V5OiBzdHJpbmcsIGxpc3RlbmVyOiBTdG9yYWdlRXZlbnRMaXN0ZW5lcik6IHZvaWQ7XG4gIF9yZW1vdmVMaXN0ZW5lcihrZXk6IHN0cmluZywgbGlzdGVuZXI6IFN0b3JhZ2VFdmVudExpc3RlbmVyKTogdm9pZDtcbiAgLy8gU2hvdWxkIHRoaXMgcGVyc2lzdGVuY2UgYWxsb3cgbWlncmF0aW9uIHVwIHRoZSBjaG9zZW4gaGllcmFyY2h5P1xuICBfc2hvdWxkQWxsb3dNaWdyYXRpb24/OiBib29sZWFuO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gIFBlcnNpc3RlbmNlVmFsdWUsXG4gIFNUT1JBR0VfQVZBSUxBQkxFX0tFWSxcbiAgUGVyc2lzdGVuY2VUeXBlXG59IGZyb20gJy4uLy4uL2NvcmUvcGVyc2lzdGVuY2UnO1xuXG4vLyBUaGVyZSBhcmUgdHdvIGRpZmZlcmVudCBicm93c2VyIHBlcnNpc3RlbmNlIHR5cGVzOiBsb2NhbCBhbmQgc2Vzc2lvbi5cbi8vIEJvdGggaGF2ZSB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbiBidXQgdXNlIGEgZGlmZmVyZW50IHVuZGVybHlpbmcgc3RvcmFnZVxuLy8gb2JqZWN0LlxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQnJvd3NlclBlcnNpc3RlbmNlQ2xhc3Mge1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHN0b3JhZ2VSZXRyaWV2ZXI6ICgpID0+IFN0b3JhZ2UsXG4gICAgcmVhZG9ubHkgdHlwZTogUGVyc2lzdGVuY2VUeXBlXG4gICkge31cblxuICBfaXNBdmFpbGFibGUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghdGhpcy5zdG9yYWdlKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuICAgICAgfVxuICAgICAgdGhpcy5zdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9BVkFJTEFCTEVfS0VZLCAnMScpO1xuICAgICAgdGhpcy5zdG9yYWdlLnJlbW92ZUl0ZW0oU1RPUkFHRV9BVkFJTEFCTEVfS0VZKTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBfc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogUGVyc2lzdGVuY2VWYWx1ZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICBfZ2V0PFQgZXh0ZW5kcyBQZXJzaXN0ZW5jZVZhbHVlPihrZXk6IHN0cmluZyk6IFByb21pc2U8VCB8IG51bGw+IHtcbiAgICBjb25zdCBqc29uID0gdGhpcy5zdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGpzb24gPyBKU09OLnBhcnNlKGpzb24pIDogbnVsbCk7XG4gIH1cblxuICBfcmVtb3ZlKGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IHN0b3JhZ2UoKTogU3RvcmFnZSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZVJldHJpZXZlcigpO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgUGVyc2lzdGVuY2UgfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuXG5pbXBvcnQgeyBnZXRVQSB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcbmltcG9ydCB7XG4gIF9pc1NhZmFyaSxcbiAgX2lzSU9TLFxuICBfaXNJZnJhbWUsXG4gIF9pc01vYmlsZUJyb3dzZXIsXG4gIF9pc0lFMTBcbn0gZnJvbSAnLi4vLi4vY29yZS91dGlsL2Jyb3dzZXInO1xuaW1wb3J0IHtcbiAgUGVyc2lzdGVuY2VJbnRlcm5hbCBhcyBJbnRlcm5hbFBlcnNpc3RlbmNlLFxuICBQZXJzaXN0ZW5jZVR5cGUsXG4gIFBlcnNpc3RlbmNlVmFsdWUsXG4gIFN0b3JhZ2VFdmVudExpc3RlbmVyXG59IGZyb20gJy4uLy4uL2NvcmUvcGVyc2lzdGVuY2UnO1xuaW1wb3J0IHsgQnJvd3NlclBlcnNpc3RlbmNlQ2xhc3MgfSBmcm9tICcuL2Jyb3dzZXInO1xuXG5mdW5jdGlvbiBfaWZyYW1lQ2Fubm90U3luY1dlYlN0b3JhZ2UoKTogYm9vbGVhbiB7XG4gIGNvbnN0IHVhID0gZ2V0VUEoKTtcbiAgcmV0dXJuIF9pc1NhZmFyaSh1YSkgfHwgX2lzSU9TKHVhKTtcbn1cblxuLy8gVGhlIHBvbGxpbmcgcGVyaW9kIGluIGNhc2UgZXZlbnRzIGFyZSBub3Qgc3VwcG9ydGVkXG5leHBvcnQgY29uc3QgX1BPTExJTkdfSU5URVJWQUxfTVMgPSAxMDAwO1xuXG4vLyBUaGUgSUUgMTAgbG9jYWxTdG9yYWdlIGNyb3NzIHRhYiBzeW5jaHJvbml6YXRpb24gZGVsYXkgaW4gbWlsbGlzZWNvbmRzXG5jb25zdCBJRTEwX0xPQ0FMX1NUT1JBR0VfU1lOQ19ERUxBWSA9IDEwO1xuXG5jbGFzcyBCcm93c2VyTG9jYWxQZXJzaXN0ZW5jZVxuICBleHRlbmRzIEJyb3dzZXJQZXJzaXN0ZW5jZUNsYXNzXG4gIGltcGxlbWVudHMgSW50ZXJuYWxQZXJzaXN0ZW5jZVxue1xuICBzdGF0aWMgdHlwZTogJ0xPQ0FMJyA9ICdMT0NBTCc7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKCkgPT4gd2luZG93LmxvY2FsU3RvcmFnZSwgUGVyc2lzdGVuY2VUeXBlLkxPQ0FMKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgYm91bmRFdmVudEhhbmRsZXIgPSAoXG4gICAgZXZlbnQ6IFN0b3JhZ2VFdmVudCxcbiAgICBwb2xsPzogYm9vbGVhblxuICApOiB2b2lkID0+IHRoaXMub25TdG9yYWdlRXZlbnQoZXZlbnQsIHBvbGwpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxpc3RlbmVyczogUmVjb3JkPHN0cmluZywgU2V0PFN0b3JhZ2VFdmVudExpc3RlbmVyPj4gPSB7fTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2NhbENhY2hlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudWxsPiA9IHt9O1xuICAvLyBzZXRUaW1lb3V0IHJldHVybiB2YWx1ZSBpcyBwbGF0Zm9ybSBzcGVjaWZpY1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcml2YXRlIHBvbGxUaW1lcjogYW55IHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gU2FmYXJpIG9yIGlPUyBicm93c2VyIGFuZCBlbWJlZGRlZCBpbiBhbiBpZnJhbWUuXG4gIHByaXZhdGUgcmVhZG9ubHkgc2FmYXJpTG9jYWxTdG9yYWdlTm90U3luY2VkID1cbiAgICBfaWZyYW1lQ2Fubm90U3luY1dlYlN0b3JhZ2UoKSAmJiBfaXNJZnJhbWUoKTtcbiAgLy8gV2hldGhlciB0byB1c2UgcG9sbGluZyBpbnN0ZWFkIG9mIGRlcGVuZGluZyBvbiB3aW5kb3cgZXZlbnRzXG4gIHByaXZhdGUgcmVhZG9ubHkgZmFsbGJhY2tUb1BvbGxpbmcgPSBfaXNNb2JpbGVCcm93c2VyKCk7XG4gIHJlYWRvbmx5IF9zaG91bGRBbGxvd01pZ3JhdGlvbiA9IHRydWU7XG5cbiAgcHJpdmF0ZSBmb3JBbGxDaGFuZ2VkS2V5cyhcbiAgICBjYjogKGtleTogc3RyaW5nLCBvbGRWYWx1ZTogc3RyaW5nIHwgbnVsbCwgbmV3VmFsdWU6IHN0cmluZyB8IG51bGwpID0+IHZvaWRcbiAgKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgYWxsIGtleXMgd2l0aCBsaXN0ZW5lcnMgb24gdGhlbS5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLmxpc3RlbmVycykpIHtcbiAgICAgIC8vIEdldCB2YWx1ZSBmcm9tIGxvY2FsU3RvcmFnZS5cbiAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpcy5zdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5sb2NhbENhY2hlW2tleV07XG4gICAgICAvLyBJZiBsb2NhbCBtYXAgdmFsdWUgZG9lcyBub3QgbWF0Y2gsIHRyaWdnZXIgbGlzdGVuZXIgd2l0aCBzdG9yYWdlIGV2ZW50LlxuICAgICAgLy8gRGlmZmVyZW50aWF0ZSB0aGlzIHNpbXVsYXRlZCBldmVudCBmcm9tIHRoZSByZWFsIHN0b3JhZ2UgZXZlbnQuXG4gICAgICBpZiAobmV3VmFsdWUgIT09IG9sZFZhbHVlKSB7XG4gICAgICAgIGNiKGtleSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uU3RvcmFnZUV2ZW50KGV2ZW50OiBTdG9yYWdlRXZlbnQsIHBvbGwgPSBmYWxzZSk6IHZvaWQge1xuICAgIC8vIEtleSB3b3VsZCBiZSBudWxsIGluIHNvbWUgc2l0dWF0aW9ucywgbGlrZSB3aGVuIGxvY2FsU3RvcmFnZSBpcyBjbGVhcmVkXG4gICAgaWYgKCFldmVudC5rZXkpIHtcbiAgICAgIHRoaXMuZm9yQWxsQ2hhbmdlZEtleXMoXG4gICAgICAgIChrZXk6IHN0cmluZywgX29sZFZhbHVlOiBzdHJpbmcgfCBudWxsLCBuZXdWYWx1ZTogc3RyaW5nIHwgbnVsbCkgPT4ge1xuICAgICAgICAgIHRoaXMubm90aWZ5TGlzdGVuZXJzKGtleSwgbmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGtleSA9IGV2ZW50LmtleTtcblxuICAgIC8vIENoZWNrIHRoZSBtZWNoYW5pc20gaG93IHRoaXMgZXZlbnQgd2FzIGRldGVjdGVkLlxuICAgIC8vIFRoZSBmaXJzdCBldmVudCB3aWxsIGRpY3RhdGUgdGhlIG1lY2hhbmlzbSB0byBiZSB1c2VkLlxuICAgIGlmIChwb2xsKSB7XG4gICAgICAvLyBFbnZpcm9ubWVudCBkZXRlY3RzIHN0b3JhZ2UgY2hhbmdlcyB2aWEgcG9sbGluZy5cbiAgICAgIC8vIFJlbW92ZSBzdG9yYWdlIGV2ZW50IGxpc3RlbmVyIHRvIHByZXZlbnQgcG9zc2libGUgZXZlbnQgZHVwbGljYXRpb24uXG4gICAgICB0aGlzLmRldGFjaExpc3RlbmVyKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEVudmlyb25tZW50IGRldGVjdHMgc3RvcmFnZSBjaGFuZ2VzIHZpYSBzdG9yYWdlIGV2ZW50IGxpc3RlbmVyLlxuICAgICAgLy8gUmVtb3ZlIHBvbGxpbmcgbGlzdGVuZXIgdG8gcHJldmVudCBwb3NzaWJsZSBldmVudCBkdXBsaWNhdGlvbi5cbiAgICAgIHRoaXMuc3RvcFBvbGxpbmcoKTtcbiAgICB9XG5cbiAgICAvLyBTYWZhcmkgZW1iZWRkZWQgaWZyYW1lLiBTdG9yYWdlIGV2ZW50IHdpbGwgdHJpZ2dlciB3aXRoIHRoZSBkZWx0YVxuICAgIC8vIGNoYW5nZXMgYnV0IG5vIGNoYW5nZXMgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBpZnJhbWUgbG9jYWxTdG9yYWdlLlxuICAgIGlmICh0aGlzLnNhZmFyaUxvY2FsU3RvcmFnZU5vdFN5bmNlZCkge1xuICAgICAgLy8gR2V0IGN1cnJlbnQgaWZyYW1lIHBhZ2UgdmFsdWUuXG4gICAgICBjb25zdCBzdG9yZWRWYWx1ZSA9IHRoaXMuc3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgICAvLyBWYWx1ZSBub3Qgc3luY2hyb25pemVkLCBzeW5jaHJvbml6ZSBtYW51YWxseS5cbiAgICAgIGlmIChldmVudC5uZXdWYWx1ZSAhPT0gc3RvcmVkVmFsdWUpIHtcbiAgICAgICAgaWYgKGV2ZW50Lm5ld1ZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gVmFsdWUgY2hhbmdlZCBmcm9tIGN1cnJlbnQgdmFsdWUuXG4gICAgICAgICAgdGhpcy5zdG9yYWdlLnNldEl0ZW0oa2V5LCBldmVudC5uZXdWYWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQ3VycmVudCB2YWx1ZSBkZWxldGVkLlxuICAgICAgICAgIHRoaXMuc3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5sb2NhbENhY2hlW2tleV0gPT09IGV2ZW50Lm5ld1ZhbHVlICYmICFwb2xsKSB7XG4gICAgICAgIC8vIEFscmVhZHkgZGV0ZWN0ZWQgYW5kIHByb2Nlc3NlZCwgZG8gbm90IHRyaWdnZXIgbGlzdGVuZXJzIGFnYWluLlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdHJpZ2dlckxpc3RlbmVycyA9ICgpOiB2b2lkID0+IHtcbiAgICAgIC8vIEtlZXAgbG9jYWwgbWFwIHVwIHRvIGRhdGUgaW4gY2FzZSBzdG9yYWdlIGV2ZW50IGlzIHRyaWdnZXJlZCBiZWZvcmVcbiAgICAgIC8vIHBvbGwuXG4gICAgICBjb25zdCBzdG9yZWRWYWx1ZSA9IHRoaXMuc3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgICBpZiAoIXBvbGwgJiYgdGhpcy5sb2NhbENhY2hlW2tleV0gPT09IHN0b3JlZFZhbHVlKSB7XG4gICAgICAgIC8vIFJlYWwgc3RvcmFnZSBldmVudCB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIGRldGVjdGVkLCBkbyBub3RoaW5nLlxuICAgICAgICAvLyBUaGlzIHNlZW1zIHRvIHRyaWdnZXIgaW4gc29tZSBJRSBicm93c2VycyBmb3Igc29tZSByZWFzb24uXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMubm90aWZ5TGlzdGVuZXJzKGtleSwgc3RvcmVkVmFsdWUpO1xuICAgIH07XG5cbiAgICBjb25zdCBzdG9yZWRWYWx1ZSA9IHRoaXMuc3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgaWYgKFxuICAgICAgX2lzSUUxMCgpICYmXG4gICAgICBzdG9yZWRWYWx1ZSAhPT0gZXZlbnQubmV3VmFsdWUgJiZcbiAgICAgIGV2ZW50Lm5ld1ZhbHVlICE9PSBldmVudC5vbGRWYWx1ZVxuICAgICkge1xuICAgICAgLy8gSUUgMTAgaGFzIHRoaXMgd2VpcmQgYnVnIHdoZXJlIGEgc3RvcmFnZSBldmVudCB3b3VsZCB0cmlnZ2VyIHdpdGggdGhlXG4gICAgICAvLyBjb3JyZWN0IGtleSwgb2xkVmFsdWUgYW5kIG5ld1ZhbHVlIGJ1dCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpIGRvZXNcbiAgICAgIC8vIG5vdCB5aWVsZCB0aGUgdXBkYXRlZCB2YWx1ZSB1bnRpbCBhIGZldyBtaWxsaXNlY29uZHMuIFRoaXMgZW5zdXJlc1xuICAgICAgLy8gdGhpcyByZWNvdmVycyBmcm9tIHRoYXQgc2l0dWF0aW9uLlxuICAgICAgc2V0VGltZW91dCh0cmlnZ2VyTGlzdGVuZXJzLCBJRTEwX0xPQ0FMX1NUT1JBR0VfU1lOQ19ERUxBWSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyaWdnZXJMaXN0ZW5lcnMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG5vdGlmeUxpc3RlbmVycyhrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLmxvY2FsQ2FjaGVba2V5XSA9IHZhbHVlO1xuICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzW2tleV07XG4gICAgaWYgKGxpc3RlbmVycykge1xuICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiBBcnJheS5mcm9tKGxpc3RlbmVycykpIHtcbiAgICAgICAgbGlzdGVuZXIodmFsdWUgPyBKU09OLnBhcnNlKHZhbHVlKSA6IHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0UG9sbGluZygpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3BQb2xsaW5nKCk7XG5cbiAgICB0aGlzLnBvbGxUaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHRoaXMuZm9yQWxsQ2hhbmdlZEtleXMoXG4gICAgICAgIChrZXk6IHN0cmluZywgb2xkVmFsdWU6IHN0cmluZyB8IG51bGwsIG5ld1ZhbHVlOiBzdHJpbmcgfCBudWxsKSA9PiB7XG4gICAgICAgICAgdGhpcy5vblN0b3JhZ2VFdmVudChcbiAgICAgICAgICAgIG5ldyBTdG9yYWdlRXZlbnQoJ3N0b3JhZ2UnLCB7XG4gICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgb2xkVmFsdWUsXG4gICAgICAgICAgICAgIG5ld1ZhbHVlXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIC8qIHBvbGwgKi8gdHJ1ZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSwgX1BPTExJTkdfSU5URVJWQUxfTVMpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wUG9sbGluZygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wb2xsVGltZXIpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5wb2xsVGltZXIpO1xuICAgICAgdGhpcy5wb2xsVGltZXIgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXR0YWNoTGlzdGVuZXIoKTogdm9pZCB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3N0b3JhZ2UnLCB0aGlzLmJvdW5kRXZlbnRIYW5kbGVyKTtcbiAgfVxuXG4gIHByaXZhdGUgZGV0YWNoTGlzdGVuZXIoKTogdm9pZCB7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3N0b3JhZ2UnLCB0aGlzLmJvdW5kRXZlbnRIYW5kbGVyKTtcbiAgfVxuXG4gIF9hZGRMaXN0ZW5lcihrZXk6IHN0cmluZywgbGlzdGVuZXI6IFN0b3JhZ2VFdmVudExpc3RlbmVyKTogdm9pZCB7XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMubGlzdGVuZXJzKS5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIFdoZXRoZXIgYnJvd3NlciBjYW4gZGV0ZWN0IHN0b3JhZ2UgZXZlbnQgd2hlbiBpdCBoYWQgYWxyZWFkeSBiZWVuIHB1c2hlZCB0byB0aGUgYmFja2dyb3VuZC5cbiAgICAgIC8vIFRoaXMgbWF5IGhhcHBlbiBpbiBzb21lIG1vYmlsZSBicm93c2Vycy4gQSBsb2NhbFN0b3JhZ2UgY2hhbmdlIGluIHRoZSBmb3JlZ3JvdW5kIHdpbmRvd1xuICAgICAgLy8gd2lsbCBub3QgYmUgZGV0ZWN0ZWQgaW4gdGhlIGJhY2tncm91bmQgd2luZG93IHZpYSB0aGUgc3RvcmFnZSBldmVudC5cbiAgICAgIC8vIFRoaXMgd2FzIGRldGVjdGVkIGluIGlPUyA3LnggbW9iaWxlIGJyb3dzZXJzXG4gICAgICBpZiAodGhpcy5mYWxsYmFja1RvUG9sbGluZykge1xuICAgICAgICB0aGlzLnN0YXJ0UG9sbGluZygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5hdHRhY2hMaXN0ZW5lcigpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXRoaXMubGlzdGVuZXJzW2tleV0pIHtcbiAgICAgIHRoaXMubGlzdGVuZXJzW2tleV0gPSBuZXcgU2V0KCk7XG4gICAgICAvLyBQb3B1bGF0ZSB0aGUgY2FjaGUgdG8gYXZvaWQgc3B1cmlvdXNseSB0cmlnZ2VyaW5nIG9uIGZpcnN0IHBvbGwuXG4gICAgICB0aGlzLmxvY2FsQ2FjaGVba2V5XSA9IHRoaXMuc3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgfVxuICAgIHRoaXMubGlzdGVuZXJzW2tleV0uYWRkKGxpc3RlbmVyKTtcbiAgfVxuXG4gIF9yZW1vdmVMaXN0ZW5lcihrZXk6IHN0cmluZywgbGlzdGVuZXI6IFN0b3JhZ2VFdmVudExpc3RlbmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubGlzdGVuZXJzW2tleV0pIHtcbiAgICAgIHRoaXMubGlzdGVuZXJzW2tleV0uZGVsZXRlKGxpc3RlbmVyKTtcblxuICAgICAgaWYgKHRoaXMubGlzdGVuZXJzW2tleV0uc2l6ZSA9PT0gMCkge1xuICAgICAgICBkZWxldGUgdGhpcy5saXN0ZW5lcnNba2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5saXN0ZW5lcnMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5kZXRhY2hMaXN0ZW5lcigpO1xuICAgICAgdGhpcy5zdG9wUG9sbGluZygpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFVwZGF0ZSBsb2NhbCBjYWNoZSBvbiBiYXNlIG9wZXJhdGlvbnM6XG5cbiAgYXN5bmMgX3NldChrZXk6IHN0cmluZywgdmFsdWU6IFBlcnNpc3RlbmNlVmFsdWUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBzdXBlci5fc2V0KGtleSwgdmFsdWUpO1xuICAgIHRoaXMubG9jYWxDYWNoZVtrZXldID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICB9XG5cbiAgYXN5bmMgX2dldDxUIGV4dGVuZHMgUGVyc2lzdGVuY2VWYWx1ZT4oa2V5OiBzdHJpbmcpOiBQcm9taXNlPFQgfCBudWxsPiB7XG4gICAgY29uc3QgdmFsdWUgPSBhd2FpdCBzdXBlci5fZ2V0PFQ+KGtleSk7XG4gICAgdGhpcy5sb2NhbENhY2hlW2tleV0gPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgYXN5bmMgX3JlbW92ZShrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHN1cGVyLl9yZW1vdmUoa2V5KTtcbiAgICBkZWxldGUgdGhpcy5sb2NhbENhY2hlW2tleV07XG4gIH1cbn1cblxuLyoqXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgUGVyc2lzdGVuY2V9IG9mIHR5cGUgYExPQ0FMYCB1c2luZyBgbG9jYWxTdG9yYWdlYFxuICogZm9yIHRoZSB1bmRlcmx5aW5nIHN0b3JhZ2UuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgYnJvd3NlckxvY2FsUGVyc2lzdGVuY2U6IFBlcnNpc3RlbmNlID0gQnJvd3NlckxvY2FsUGVyc2lzdGVuY2U7XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgUGVyc2lzdGVuY2UgfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuXG5pbXBvcnQge1xuICBQZXJzaXN0ZW5jZUludGVybmFsIGFzIEludGVybmFsUGVyc2lzdGVuY2UsXG4gIFBlcnNpc3RlbmNlVHlwZSxcbiAgU3RvcmFnZUV2ZW50TGlzdGVuZXJcbn0gZnJvbSAnLi4vLi4vY29yZS9wZXJzaXN0ZW5jZSc7XG5pbXBvcnQgeyBCcm93c2VyUGVyc2lzdGVuY2VDbGFzcyB9IGZyb20gJy4vYnJvd3Nlcic7XG5cbmNsYXNzIEJyb3dzZXJTZXNzaW9uUGVyc2lzdGVuY2VcbiAgZXh0ZW5kcyBCcm93c2VyUGVyc2lzdGVuY2VDbGFzc1xuICBpbXBsZW1lbnRzIEludGVybmFsUGVyc2lzdGVuY2VcbntcbiAgc3RhdGljIHR5cGU6ICdTRVNTSU9OJyA9ICdTRVNTSU9OJztcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigoKSA9PiB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UsIFBlcnNpc3RlbmNlVHlwZS5TRVNTSU9OKTtcbiAgfVxuXG4gIF9hZGRMaXN0ZW5lcihfa2V5OiBzdHJpbmcsIF9saXN0ZW5lcjogU3RvcmFnZUV2ZW50TGlzdGVuZXIpOiB2b2lkIHtcbiAgICAvLyBMaXN0ZW5lcnMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIHNlc3Npb24gc3RvcmFnZSBzaW5jZSBpdCBjYW5ub3QgYmUgc2hhcmVkIGFjcm9zcyB3aW5kb3dzXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgX3JlbW92ZUxpc3RlbmVyKF9rZXk6IHN0cmluZywgX2xpc3RlbmVyOiBTdG9yYWdlRXZlbnRMaXN0ZW5lcik6IHZvaWQge1xuICAgIC8vIExpc3RlbmVycyBhcmUgbm90IHN1cHBvcnRlZCBmb3Igc2Vzc2lvbiBzdG9yYWdlIHNpbmNlIGl0IGNhbm5vdCBiZSBzaGFyZWQgYWNyb3NzIHdpbmRvd3NcbiAgICByZXR1cm47XG4gIH1cbn1cblxuLyoqXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgUGVyc2lzdGVuY2V9IG9mIGBTRVNTSU9OYCB1c2luZyBgc2Vzc2lvblN0b3JhZ2VgXG4gKiBmb3IgdGhlIHVuZGVybHlpbmcgc3RvcmFnZS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBicm93c2VyU2Vzc2lvblBlcnNpc3RlbmNlOiBQZXJzaXN0ZW5jZSA9IEJyb3dzZXJTZXNzaW9uUGVyc2lzdGVuY2U7XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLyoqIFRPRE86IHJlbW92ZSB0aGlzIG9uY2UgdHNsaWIgaGFzIGEgcG9seWZpbGwgZm9yIFByb21pc2UuYWxsU2V0dGxlZCAqL1xuaW50ZXJmYWNlIFByb21pc2VGdWxmaWxsZWRSZXN1bHQ8VD4ge1xuICBmdWxmaWxsZWQ6IHRydWU7XG4gIHZhbHVlOiBUO1xufVxuXG5pbnRlcmZhY2UgUHJvbWlzZVJlamVjdGVkUmVzdWx0IHtcbiAgZnVsZmlsbGVkOiBmYWxzZTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcmVhc29uOiBhbnk7XG59XG5cbmV4cG9ydCB0eXBlIFByb21pc2VTZXR0bGVkUmVzdWx0PFQ+ID1cbiAgfCBQcm9taXNlRnVsZmlsbGVkUmVzdWx0PFQ+XG4gIHwgUHJvbWlzZVJlamVjdGVkUmVzdWx0O1xuXG4vKipcbiAqIFNoaW0gZm9yIFByb21pc2UuYWxsU2V0dGxlZCwgbm90ZSB0aGUgc2xpZ2h0bHkgZGlmZmVyZW50IGZvcm1hdCBvZiBgZnVsZmlsbGVkYCB2cyBgc3RhdHVzYC5cbiAqXG4gKiBAcGFyYW0gcHJvbWlzZXMgLSBBcnJheSBvZiBwcm9taXNlcyB0byB3YWl0IG9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gX2FsbFNldHRsZWQ8VD4oXG4gIHByb21pc2VzOiBBcnJheTxQcm9taXNlPFQ+PlxuKTogUHJvbWlzZTxBcnJheTxQcm9taXNlU2V0dGxlZFJlc3VsdDxUPj4+IHtcbiAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgIHByb21pc2VzLm1hcChhc3luYyBwcm9taXNlID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgcHJvbWlzZTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBmdWxmaWxsZWQ6IHRydWUsXG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgfSBhcyBQcm9taXNlRnVsZmlsbGVkUmVzdWx0PFQ+O1xuICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZnVsZmlsbGVkOiBmYWxzZSxcbiAgICAgICAgICByZWFzb25cbiAgICAgICAgfSBhcyBQcm9taXNlUmVqZWN0ZWRSZXN1bHQ7XG4gICAgICB9XG4gICAgfSlcbiAgKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge1xuICBSZWNlaXZlckhhbmRsZXIsXG4gIF9FdmVudFR5cGUsXG4gIF9SZWNlaXZlclJlc3BvbnNlLFxuICBTZW5kZXJNZXNzYWdlRXZlbnQsXG4gIF9TdGF0dXMsXG4gIF9TZW5kZXJSZXF1ZXN0XG59IGZyb20gJy4vaW5kZXgnO1xuaW1wb3J0IHsgX2FsbFNldHRsZWQgfSBmcm9tICcuL3Byb21pc2UnO1xuXG4vKipcbiAqIEludGVyZmFjZSBjbGFzcyBmb3IgcmVjZWl2aW5nIG1lc3NhZ2VzLlxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIFJlY2VpdmVyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcmVjZWl2ZXJzOiBSZWNlaXZlcltdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgYm91bmRFdmVudEhhbmRsZXI6IEV2ZW50TGlzdGVuZXI7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVyc01hcDoge1xuICAgIC8vIFR5cGVzY3JpcHQgZG9lc24ndCBoYXZlIGV4aXN0ZW50aWFsIHR5cGVzIDooXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBbZXZlbnRUeXBlOiBzdHJpbmddOiBTZXQ8UmVjZWl2ZXJIYW5kbGVyPGFueSwgYW55Pj47XG4gIH0gPSB7fTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGV2ZW50VGFyZ2V0OiBFdmVudFRhcmdldCkge1xuICAgIHRoaXMuYm91bmRFdmVudEhhbmRsZXIgPSB0aGlzLmhhbmRsZUV2ZW50LmJpbmQodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogT2J0YWluIGFuIGluc3RhbmNlIG9mIGEgUmVjZWl2ZXIgZm9yIGEgZ2l2ZW4gZXZlbnQgdGFyZ2V0LCBpZiBub25lIGV4aXN0cyBpdCB3aWxsIGJlIGNyZWF0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBldmVudFRhcmdldCAtIEFuIGV2ZW50IHRhcmdldCAoc3VjaCBhcyB3aW5kb3cgb3Igc2VsZikgdGhyb3VnaCB3aGljaCB0aGUgdW5kZXJseWluZ1xuICAgKiBtZXNzYWdlcyB3aWxsIGJlIHJlY2VpdmVkLlxuICAgKi9cbiAgc3RhdGljIF9nZXRJbnN0YW5jZShldmVudFRhcmdldDogRXZlbnRUYXJnZXQpOiBSZWNlaXZlciB7XG4gICAgLy8gVGhlIHJlc3VsdHMgYXJlIHN0b3JlZCBpbiBhbiBhcnJheSBzaW5jZSBvYmplY3RzIGNhbid0IGJlIGtleXMgZm9yIG90aGVyXG4gICAgLy8gb2JqZWN0cy4gSW4gYWRkaXRpb24sIHNldHRpbmcgYSB1bmlxdWUgcHJvcGVydHkgb24gYW4gZXZlbnQgdGFyZ2V0IGFzIGFcbiAgICAvLyBoYXNoIG1hcCBrZXkgbWF5IG5vdCBiZSBhbGxvd2VkIGR1ZSB0byBDT1JTIHJlc3RyaWN0aW9ucy5cbiAgICBjb25zdCBleGlzdGluZ0luc3RhbmNlID0gdGhpcy5yZWNlaXZlcnMuZmluZChyZWNlaXZlciA9PlxuICAgICAgcmVjZWl2ZXIuaXNMaXN0ZW5pbmd0byhldmVudFRhcmdldClcbiAgICApO1xuICAgIGlmIChleGlzdGluZ0luc3RhbmNlKSB7XG4gICAgICByZXR1cm4gZXhpc3RpbmdJbnN0YW5jZTtcbiAgICB9XG4gICAgY29uc3QgbmV3SW5zdGFuY2UgPSBuZXcgUmVjZWl2ZXIoZXZlbnRUYXJnZXQpO1xuICAgIHRoaXMucmVjZWl2ZXJzLnB1c2gobmV3SW5zdGFuY2UpO1xuICAgIHJldHVybiBuZXdJbnN0YW5jZTtcbiAgfVxuXG4gIHByaXZhdGUgaXNMaXN0ZW5pbmd0byhldmVudFRhcmdldDogRXZlbnRUYXJnZXQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5ldmVudFRhcmdldCA9PT0gZXZlbnRUYXJnZXQ7XG4gIH1cblxuICAvKipcbiAgICogRmFucyBvdXQgYSBNZXNzYWdlRXZlbnQgdG8gdGhlIGFwcHJvcHJpYXRlIGxpc3RlbmVycy5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogU2VuZHMgYW4ge0BsaW5rIFN0YXR1cy5BQ0t9IHVwb24gcmVjZWlwdCBhbmQgYSB7QGxpbmsgU3RhdHVzLkRPTkV9IG9uY2UgYWxsIGhhbmRsZXJzIGhhdmVcbiAgICogZmluaXNoZWQgcHJvY2Vzc2luZy5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50IC0gVGhlIE1lc3NhZ2VFdmVudC5cbiAgICpcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlRXZlbnQ8XG4gICAgVCBleHRlbmRzIF9SZWNlaXZlclJlc3BvbnNlLFxuICAgIFMgZXh0ZW5kcyBfU2VuZGVyUmVxdWVzdFxuICA+KGV2ZW50OiBFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG1lc3NhZ2VFdmVudCA9IGV2ZW50IGFzIE1lc3NhZ2VFdmVudDxTZW5kZXJNZXNzYWdlRXZlbnQ8Uz4+O1xuICAgIGNvbnN0IHsgZXZlbnRJZCwgZXZlbnRUeXBlLCBkYXRhIH0gPSBtZXNzYWdlRXZlbnQuZGF0YTtcblxuICAgIGNvbnN0IGhhbmRsZXJzOiBTZXQ8UmVjZWl2ZXJIYW5kbGVyPFQsIFM+PiB8IHVuZGVmaW5lZCA9XG4gICAgICB0aGlzLmhhbmRsZXJzTWFwW2V2ZW50VHlwZV07XG4gICAgaWYgKCFoYW5kbGVycz8uc2l6ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG1lc3NhZ2VFdmVudC5wb3J0c1swXS5wb3N0TWVzc2FnZSh7XG4gICAgICBzdGF0dXM6IF9TdGF0dXMuQUNLLFxuICAgICAgZXZlbnRJZCxcbiAgICAgIGV2ZW50VHlwZVxuICAgIH0pO1xuXG4gICAgY29uc3QgcHJvbWlzZXMgPSBBcnJheS5mcm9tKGhhbmRsZXJzKS5tYXAoYXN5bmMgaGFuZGxlciA9PlxuICAgICAgaGFuZGxlcihtZXNzYWdlRXZlbnQub3JpZ2luLCBkYXRhKVxuICAgICk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBfYWxsU2V0dGxlZChwcm9taXNlcyk7XG4gICAgbWVzc2FnZUV2ZW50LnBvcnRzWzBdLnBvc3RNZXNzYWdlKHtcbiAgICAgIHN0YXR1czogX1N0YXR1cy5ET05FLFxuICAgICAgZXZlbnRJZCxcbiAgICAgIGV2ZW50VHlwZSxcbiAgICAgIHJlc3BvbnNlXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlIGFuIGV2ZW50IGhhbmRsZXIgZm9yIGEgcGFydGljdWxhciBldmVudC5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50VHlwZSAtIEV2ZW50IG5hbWUgdG8gc3Vic2NyaWJlIHRvLlxuICAgKiBAcGFyYW0gZXZlbnRIYW5kbGVyIC0gVGhlIGV2ZW50IGhhbmRsZXIgd2hpY2ggc2hvdWxkIHJlY2VpdmUgdGhlIGV2ZW50cy5cbiAgICpcbiAgICovXG4gIF9zdWJzY3JpYmU8VCBleHRlbmRzIF9SZWNlaXZlclJlc3BvbnNlLCBTIGV4dGVuZHMgX1NlbmRlclJlcXVlc3Q+KFxuICAgIGV2ZW50VHlwZTogX0V2ZW50VHlwZSxcbiAgICBldmVudEhhbmRsZXI6IFJlY2VpdmVySGFuZGxlcjxULCBTPlxuICApOiB2b2lkIHtcbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5oYW5kbGVyc01hcCkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmV2ZW50VGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLmJvdW5kRXZlbnRIYW5kbGVyKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaGFuZGxlcnNNYXBbZXZlbnRUeXBlXSkge1xuICAgICAgdGhpcy5oYW5kbGVyc01hcFtldmVudFR5cGVdID0gbmV3IFNldCgpO1xuICAgIH1cblxuICAgIHRoaXMuaGFuZGxlcnNNYXBbZXZlbnRUeXBlXS5hZGQoZXZlbnRIYW5kbGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZSBhbiBldmVudCBoYW5kbGVyIGZyb20gYSBwYXJ0aWN1bGFyIGV2ZW50LlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnRUeXBlIC0gRXZlbnQgbmFtZSB0byB1bnN1YnNjcmliZSBmcm9tLlxuICAgKiBAcGFyYW0gZXZlbnRIYW5kbGVyIC0gT3B0aW5vYWwgZXZlbnQgaGFuZGxlciwgaWYgbm9uZSBwcm92aWRlZCwgdW5zdWJzY3JpYmUgYWxsIGhhbmRsZXJzIG9uIHRoaXMgZXZlbnQuXG4gICAqXG4gICAqL1xuICBfdW5zdWJzY3JpYmU8VCBleHRlbmRzIF9SZWNlaXZlclJlc3BvbnNlLCBTIGV4dGVuZHMgX1NlbmRlclJlcXVlc3Q+KFxuICAgIGV2ZW50VHlwZTogX0V2ZW50VHlwZSxcbiAgICBldmVudEhhbmRsZXI/OiBSZWNlaXZlckhhbmRsZXI8VCwgUz5cbiAgKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGFuZGxlcnNNYXBbZXZlbnRUeXBlXSAmJiBldmVudEhhbmRsZXIpIHtcbiAgICAgIHRoaXMuaGFuZGxlcnNNYXBbZXZlbnRUeXBlXS5kZWxldGUoZXZlbnRIYW5kbGVyKTtcbiAgICB9XG4gICAgaWYgKCFldmVudEhhbmRsZXIgfHwgdGhpcy5oYW5kbGVyc01hcFtldmVudFR5cGVdLnNpemUgPT09IDApIHtcbiAgICAgIGRlbGV0ZSB0aGlzLmhhbmRsZXJzTWFwW2V2ZW50VHlwZV07XG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuaGFuZGxlcnNNYXApLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5ldmVudFRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcy5ib3VuZEV2ZW50SGFuZGxlcik7XG4gICAgfVxuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIF9nZW5lcmF0ZUV2ZW50SWQocHJlZml4ID0gJycsIGRpZ2l0cyA9IDEwKTogc3RyaW5nIHtcbiAgbGV0IHJhbmRvbSA9ICcnO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGRpZ2l0czsgaSsrKSB7XG4gICAgcmFuZG9tICs9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwKTtcbiAgfVxuICByZXR1cm4gcHJlZml4ICsgcmFuZG9tO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IF9nZW5lcmF0ZUV2ZW50SWQgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWwvZXZlbnRfaWQnO1xuaW1wb3J0IHtcbiAgX1NlbmRlclJlcXVlc3QsXG4gIF9FdmVudFR5cGUsXG4gIFJlY2VpdmVyTWVzc2FnZUV2ZW50LFxuICBfTWVzc2FnZUVycm9yLFxuICBTZW5kZXJNZXNzYWdlRXZlbnQsXG4gIF9TdGF0dXMsXG4gIF9SZWNlaXZlck1lc3NhZ2VSZXNwb25zZSxcbiAgX1JlY2VpdmVyUmVzcG9uc2UsXG4gIF9UaW1lb3V0RHVyYXRpb25cbn0gZnJvbSAnLi9pbmRleCc7XG5cbmludGVyZmFjZSBNZXNzYWdlSGFuZGxlciB7XG4gIG1lc3NhZ2VDaGFubmVsOiBNZXNzYWdlQ2hhbm5lbDtcbiAgb25NZXNzYWdlOiBFdmVudExpc3RlbmVyT3JFdmVudExpc3RlbmVyT2JqZWN0O1xufVxuXG4vKipcbiAqIEludGVyZmFjZSBmb3Igc2VuZGluZyBtZXNzYWdlcyBhbmQgd2FpdGluZyBmb3IgYSBjb21wbGV0aW9uIHJlc3BvbnNlLlxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIFNlbmRlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlcnMgPSBuZXcgU2V0PE1lc3NhZ2VIYW5kbGVyPigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgdGFyZ2V0OiBTZXJ2aWNlV29ya2VyKSB7fVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZSB0aGUgaGFuZGxlciBhbmQgcmVtb3ZlIGl0IGZyb20gb3VyIHRyYWNraW5nIFNldC5cbiAgICpcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBUaGUgaGFuZGxlciB0byB1bnN1YnNjcmliZS5cbiAgICovXG4gIHByaXZhdGUgcmVtb3ZlTWVzc2FnZUhhbmRsZXIoaGFuZGxlcjogTWVzc2FnZUhhbmRsZXIpOiB2b2lkIHtcbiAgICBpZiAoaGFuZGxlci5tZXNzYWdlQ2hhbm5lbCkge1xuICAgICAgaGFuZGxlci5tZXNzYWdlQ2hhbm5lbC5wb3J0MS5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgICAnbWVzc2FnZScsXG4gICAgICAgIGhhbmRsZXIub25NZXNzYWdlXG4gICAgICApO1xuICAgICAgaGFuZGxlci5tZXNzYWdlQ2hhbm5lbC5wb3J0MS5jbG9zZSgpO1xuICAgIH1cbiAgICB0aGlzLmhhbmRsZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGEgbWVzc2FnZSB0byB0aGUgUmVjZWl2ZXIgbG9jYXRlZCBhdCB7QGxpbmsgdGFyZ2V0fS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogV2UnbGwgZmlyc3Qgd2FpdCBhIGJpdCBmb3IgYW4gQUNLICwgaWYgd2UgZ2V0IG9uZSB3ZSB3aWxsIHdhaXQgc2lnbmlmaWNhbnRseSBsb25nZXIgdW50aWwgdGhlXG4gICAqIHJlY2VpdmVyIGhhcyBoYWQgYSBjaGFuY2UgdG8gZnVsbHkgcHJvY2VzcyB0aGUgZXZlbnQuXG4gICAqXG4gICAqIEBwYXJhbSBldmVudFR5cGUgLSBUeXBlIG9mIGV2ZW50IHRvIHNlbmQuXG4gICAqIEBwYXJhbSBkYXRhIC0gVGhlIHBheWxvYWQgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gdGltZW91dCAtIFRpbWVvdXQgZm9yIHdhaXRpbmcgb24gYW4gQUNLIGZyb20gdGhlIHJlY2VpdmVyLlxuICAgKlxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBzZXR0bGVkIHByb21pc2VzIGZyb20gYWxsIHRoZSBoYW5kbGVycyB0aGF0IHdlcmUgbGlzdGVuaW5nIG9uIHRoZSByZWNlaXZlci5cbiAgICovXG4gIGFzeW5jIF9zZW5kPFQgZXh0ZW5kcyBfUmVjZWl2ZXJSZXNwb25zZSwgUyBleHRlbmRzIF9TZW5kZXJSZXF1ZXN0PihcbiAgICBldmVudFR5cGU6IF9FdmVudFR5cGUsXG4gICAgZGF0YTogUyxcbiAgICB0aW1lb3V0ID0gX1RpbWVvdXREdXJhdGlvbi5BQ0tcbiAgKTogUHJvbWlzZTxfUmVjZWl2ZXJNZXNzYWdlUmVzcG9uc2U8VD4+IHtcbiAgICBjb25zdCBtZXNzYWdlQ2hhbm5lbCA9XG4gICAgICB0eXBlb2YgTWVzc2FnZUNoYW5uZWwgIT09ICd1bmRlZmluZWQnID8gbmV3IE1lc3NhZ2VDaGFubmVsKCkgOiBudWxsO1xuICAgIGlmICghbWVzc2FnZUNoYW5uZWwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihfTWVzc2FnZUVycm9yLkNPTk5FQ1RJT05fVU5BVkFJTEFCTEUpO1xuICAgIH1cbiAgICAvLyBOb2RlIHRpbWVycyBhbmQgYnJvd3NlciB0aW1lcnMgcmV0dXJuIGZ1bmRhbWVudGFsbHkgZGlmZmVyZW50IHR5cGVzLlxuICAgIC8vIFdlIGRvbid0IGFjdHVhbGx5IGNhcmUgd2hhdCB0aGUgdmFsdWUgaXMgYnV0IFRTIHdvbid0IGFjY2VwdCB1bmtub3duIGFuZFxuICAgIC8vIHdlIGNhbid0IGNhc3QgcHJvcGVybHkgaW4gYm90aCBlbnZpcm9ubWVudHMuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBsZXQgY29tcGxldGlvblRpbWVyOiBhbnk7XG4gICAgbGV0IGhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxfUmVjZWl2ZXJNZXNzYWdlUmVzcG9uc2U8VD4+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGV2ZW50SWQgPSBfZ2VuZXJhdGVFdmVudElkKCcnLCAyMCk7XG4gICAgICBtZXNzYWdlQ2hhbm5lbC5wb3J0MS5zdGFydCgpO1xuICAgICAgY29uc3QgYWNrVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihfTWVzc2FnZUVycm9yLlVOU1VQUE9SVEVEX0VWRU5UKSk7XG4gICAgICB9LCB0aW1lb3V0KTtcbiAgICAgIGhhbmRsZXIgPSB7XG4gICAgICAgIG1lc3NhZ2VDaGFubmVsLFxuICAgICAgICBvbk1lc3NhZ2UoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgICAgY29uc3QgbWVzc2FnZUV2ZW50ID0gZXZlbnQgYXMgTWVzc2FnZUV2ZW50PFJlY2VpdmVyTWVzc2FnZUV2ZW50PFQ+PjtcbiAgICAgICAgICBpZiAobWVzc2FnZUV2ZW50LmRhdGEuZXZlbnRJZCAhPT0gZXZlbnRJZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2VFdmVudC5kYXRhLnN0YXR1cykge1xuICAgICAgICAgICAgY2FzZSBfU3RhdHVzLkFDSzpcbiAgICAgICAgICAgICAgLy8gVGhlIHJlY2VpdmVyIHNob3VsZCBBQ0sgZmlyc3QuXG4gICAgICAgICAgICAgIGNsZWFyVGltZW91dChhY2tUaW1lcik7XG4gICAgICAgICAgICAgIGNvbXBsZXRpb25UaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoX01lc3NhZ2VFcnJvci5USU1FT1VUKSk7XG4gICAgICAgICAgICAgIH0sIF9UaW1lb3V0RHVyYXRpb24uQ09NUExFVElPTik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBfU3RhdHVzLkRPTkU6XG4gICAgICAgICAgICAgIC8vIE9uY2UgdGhlIHJlY2VpdmVyJ3MgaGFuZGxlcnMgYXJlIGZpbmlzaGVkIHdlIHdpbGwgZ2V0IHRoZSByZXN1bHRzLlxuICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoY29tcGxldGlvblRpbWVyKTtcbiAgICAgICAgICAgICAgcmVzb2x2ZShtZXNzYWdlRXZlbnQuZGF0YS5yZXNwb25zZSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFja1RpbWVyKTtcbiAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGNvbXBsZXRpb25UaW1lcik7XG4gICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoX01lc3NhZ2VFcnJvci5JTlZBTElEX1JFU1BPTlNFKSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHRoaXMuaGFuZGxlcnMuYWRkKGhhbmRsZXIpO1xuICAgICAgbWVzc2FnZUNoYW5uZWwucG9ydDEuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZXIub25NZXNzYWdlKTtcbiAgICAgIHRoaXMudGFyZ2V0LnBvc3RNZXNzYWdlKFxuICAgICAgICB7XG4gICAgICAgICAgZXZlbnRUeXBlLFxuICAgICAgICAgIGV2ZW50SWQsXG4gICAgICAgICAgZGF0YVxuICAgICAgICB9IGFzIFNlbmRlck1lc3NhZ2VFdmVudDxTPixcbiAgICAgICAgW21lc3NhZ2VDaGFubmVsLnBvcnQyXVxuICAgICAgKTtcbiAgICB9KS5maW5hbGx5KCgpID0+IHtcbiAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlTWVzc2FnZUhhbmRsZXIoaGFuZGxlcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBSZWNhcHRjaGEsIEdyZUNBUFRDSEFUb3BMZXZlbCB9IGZyb20gJy4vcmVjYXB0Y2hhL3JlY2FwdGNoYSc7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB3aW5kb3cgdHlwZSB0aGF0IG1lbGRzIHRoZSBub3JtYWwgd2luZG93IHR5cGUgcGx1cyB0aGVcbiAqIHZhcmlvdXMgYml0cyB3ZSBuZWVkLiBUaGUgdGhyZWUgZGlmZmVyZW50IGJsb2NrcyB0aGF0IGFyZSAmJ2QgdG9nZXRoZXJcbiAqIGNhbnQgYmUgZGVmaW5lZCBpbiB0aGUgc2FtZSBibG9jayB0b2dldGhlci5cbiAqL1xuZXhwb3J0IHR5cGUgQXV0aFdpbmRvdyA9IHtcbiAgLy8gU3RhbmRhcmQgd2luZG93IHR5cGVzXG4gIFtUIGluIGtleW9mIFdpbmRvd106IFdpbmRvd1tUXTtcbn0gJiB7XG4gIC8vIEFueSBrbm93biAvIG5hbWVkIHByb3BlcnRpZXMgd2Ugd2FudCB0byBhZGRcbiAgZ3JlY2FwdGNoYT86IFJlY2FwdGNoYSB8IEdyZUNBUFRDSEFUb3BMZXZlbDtcbiAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbiAgX19fanNsPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgZ2FwaT86IHR5cGVvZiBnYXBpO1xufSAmIHtcbiAgLy8gQSBmaW5hbCBjYXRjaC1hbGwgZm9yIGNhbGxiYWNrcyAod2hpY2ggd2lsbCBoYXZlIHJhbmRvbSBuYW1lcykgdGhhdFxuICAvLyB3ZSB3aWxsIHN0aWNrIG9uIHRoZSB3aW5kb3cuXG4gIFtjYWxsYmFjazogc3RyaW5nXTogKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdm9pZDtcbn07XG5cbi8qKlxuICogTGF6eSBhY2Nlc3NvciBmb3Igd2luZG93LCBzaW5jZSB0aGUgY29tcGF0IGxheWVyIHdvbid0IHRyZWUgc2hha2UgdGhpcyBvdXQsXG4gKiB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSBub3QgdG8gbWVzcyB3aXRoIHdpbmRvdyB1bmxlc3Mgd2UgaGF2ZSB0b1xuICovXG5leHBvcnQgZnVuY3Rpb24gX3dpbmRvdygpOiBBdXRoV2luZG93IHtcbiAgcmV0dXJuIHdpbmRvdyBhcyB1bmtub3duIGFzIEF1dGhXaW5kb3c7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfc2V0V2luZG93TG9jYXRpb24odXJsOiBzdHJpbmcpOiB2b2lkIHtcbiAgX3dpbmRvdygpLmxvY2F0aW9uLmhyZWYgPSB1cmw7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IF93aW5kb3cgfSBmcm9tICcuLi9hdXRoX3dpbmRvdyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBfaXNXb3JrZXIoKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIF93aW5kb3coKVsnV29ya2VyR2xvYmFsU2NvcGUnXSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICB0eXBlb2YgX3dpbmRvdygpWydpbXBvcnRTY3JpcHRzJ10gPT09ICdmdW5jdGlvbidcbiAgKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF9nZXRBY3RpdmVTZXJ2aWNlV29ya2VyKCk6IFByb21pc2U8U2VydmljZVdvcmtlciB8IG51bGw+IHtcbiAgaWYgKCFuYXZpZ2F0b3I/LnNlcnZpY2VXb3JrZXIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IGF3YWl0IG5hdmlnYXRvci5zZXJ2aWNlV29ya2VyLnJlYWR5O1xuICAgIHJldHVybiByZWdpc3RyYXRpb24uYWN0aXZlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX2dldFNlcnZpY2VXb3JrZXJDb250cm9sbGVyKCk6IFNlcnZpY2VXb3JrZXIgfCBudWxsIHtcbiAgcmV0dXJuIG5hdmlnYXRvcj8uc2VydmljZVdvcmtlcj8uY29udHJvbGxlciB8fCBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX2dldFdvcmtlckdsb2JhbFNjb3BlKCk6IFNlcnZpY2VXb3JrZXIgfCBudWxsIHtcbiAgcmV0dXJuIF9pc1dvcmtlcigpID8gKHNlbGYgYXMgdW5rbm93biBhcyBTZXJ2aWNlV29ya2VyKSA6IG51bGw7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgUGVyc2lzdGVuY2UgfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuaW1wb3J0IHtcbiAgUGVyc2lzdGVkQmxvYixcbiAgUGVyc2lzdGVuY2VJbnRlcm5hbCBhcyBJbnRlcm5hbFBlcnNpc3RlbmNlLFxuICBQZXJzaXN0ZW5jZVR5cGUsXG4gIFBlcnNpc3RlbmNlVmFsdWUsXG4gIFN0b3JhZ2VFdmVudExpc3RlbmVyLFxuICBTVE9SQUdFX0FWQUlMQUJMRV9LRVlcbn0gZnJvbSAnLi4vLi4vY29yZS9wZXJzaXN0ZW5jZS8nO1xuaW1wb3J0IHtcbiAgX0V2ZW50VHlwZSxcbiAgX1BpbmdSZXNwb25zZSxcbiAgS2V5Q2hhbmdlZFJlc3BvbnNlLFxuICBLZXlDaGFuZ2VkUmVxdWVzdCxcbiAgUGluZ1JlcXVlc3QsXG4gIF9UaW1lb3V0RHVyYXRpb25cbn0gZnJvbSAnLi4vbWVzc2FnZWNoYW5uZWwvaW5kZXgnO1xuaW1wb3J0IHsgUmVjZWl2ZXIgfSBmcm9tICcuLi9tZXNzYWdlY2hhbm5lbC9yZWNlaXZlcic7XG5pbXBvcnQgeyBTZW5kZXIgfSBmcm9tICcuLi9tZXNzYWdlY2hhbm5lbC9zZW5kZXInO1xuaW1wb3J0IHtcbiAgX2lzV29ya2VyLFxuICBfZ2V0QWN0aXZlU2VydmljZVdvcmtlcixcbiAgX2dldFNlcnZpY2VXb3JrZXJDb250cm9sbGVyLFxuICBfZ2V0V29ya2VyR2xvYmFsU2NvcGVcbn0gZnJvbSAnLi4vdXRpbC93b3JrZXInO1xuXG5leHBvcnQgY29uc3QgREJfTkFNRSA9ICdmaXJlYmFzZUxvY2FsU3RvcmFnZURiJztcbmNvbnN0IERCX1ZFUlNJT04gPSAxO1xuY29uc3QgREJfT0JKRUNUU1RPUkVfTkFNRSA9ICdmaXJlYmFzZUxvY2FsU3RvcmFnZSc7XG5jb25zdCBEQl9EQVRBX0tFWVBBVEggPSAnZmJhc2Vfa2V5JztcblxuaW50ZXJmYWNlIERCT2JqZWN0IHtcbiAgW0RCX0RBVEFfS0VZUEFUSF06IHN0cmluZztcbiAgdmFsdWU6IFBlcnNpc3RlZEJsb2I7XG59XG5cbi8qKlxuICogUHJvbWlzZSB3cmFwcGVyIGZvciBJREJSZXF1ZXN0XG4gKlxuICogVW5mb3J0dW5hdGVseSB3ZSBjYW4ndCBjbGVhbmx5IGV4dGVuZCBQcm9taXNlPFQ+IHNpbmNlIHByb21pc2VzIGFyZSBub3QgY2FsbGFibGUgaW4gRVM2XG4gKlxuICovXG5jbGFzcyBEQlByb21pc2U8VD4ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHJlcXVlc3Q6IElEQlJlcXVlc3QpIHt9XG5cbiAgdG9Qcm9taXNlKCk6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxUPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcignc3VjY2VzcycsICgpID0+IHtcbiAgICAgICAgcmVzb2x2ZSh0aGlzLnJlcXVlc3QucmVzdWx0KTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5yZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKCkgPT4ge1xuICAgICAgICByZWplY3QodGhpcy5yZXF1ZXN0LmVycm9yKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldE9iamVjdFN0b3JlKGRiOiBJREJEYXRhYmFzZSwgaXNSZWFkV3JpdGU6IGJvb2xlYW4pOiBJREJPYmplY3RTdG9yZSB7XG4gIHJldHVybiBkYlxuICAgIC50cmFuc2FjdGlvbihbREJfT0JKRUNUU1RPUkVfTkFNRV0sIGlzUmVhZFdyaXRlID8gJ3JlYWR3cml0ZScgOiAncmVhZG9ubHknKVxuICAgIC5vYmplY3RTdG9yZShEQl9PQkpFQ1RTVE9SRV9OQU1FKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF9jbGVhckRhdGFiYXNlKGRiOiBJREJEYXRhYmFzZSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBvYmplY3RTdG9yZSA9IGdldE9iamVjdFN0b3JlKGRiLCB0cnVlKTtcbiAgcmV0dXJuIG5ldyBEQlByb21pc2U8dm9pZD4ob2JqZWN0U3RvcmUuY2xlYXIoKSkudG9Qcm9taXNlKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfZGVsZXRlRGF0YWJhc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIuZGVsZXRlRGF0YWJhc2UoREJfTkFNRSk7XG4gIHJldHVybiBuZXcgREJQcm9taXNlPHZvaWQ+KHJlcXVlc3QpLnRvUHJvbWlzZSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX29wZW5EYXRhYmFzZSgpOiBQcm9taXNlPElEQkRhdGFiYXNlPiB7XG4gIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIub3BlbihEQl9OQU1FLCBEQl9WRVJTSU9OKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICByZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKCkgPT4ge1xuICAgICAgcmVqZWN0KHJlcXVlc3QuZXJyb3IpO1xuICAgIH0pO1xuXG4gICAgcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCd1cGdyYWRlbmVlZGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgZGIgPSByZXF1ZXN0LnJlc3VsdDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZGIuY3JlYXRlT2JqZWN0U3RvcmUoREJfT0JKRUNUU1RPUkVfTkFNRSwgeyBrZXlQYXRoOiBEQl9EQVRBX0tFWVBBVEggfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcignc3VjY2VzcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGRiOiBJREJEYXRhYmFzZSA9IHJlcXVlc3QucmVzdWx0O1xuICAgICAgLy8gU3RyYW5nZSBidWcgdGhhdCBvY2N1cnMgaW4gRmlyZWZveCB3aGVuIG11bHRpcGxlIHRhYnMgYXJlIG9wZW5lZCBhdCB0aGVcbiAgICAgIC8vIHNhbWUgdGltZS4gVGhlIG9ubHkgd2F5IHRvIHJlY292ZXIgc2VlbXMgdG8gYmUgZGVsZXRpbmcgdGhlIGRhdGFiYXNlXG4gICAgICAvLyBhbmQgcmUtaW5pdGlhbGl6aW5nIGl0LlxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZpcmViYXNlL2ZpcmViYXNlLWpzLXNkay9pc3N1ZXMvNjM0XG5cbiAgICAgIGlmICghZGIub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhEQl9PQkpFQ1RTVE9SRV9OQU1FKSkge1xuICAgICAgICAvLyBOZWVkIHRvIGNsb3NlIHRoZSBkYXRhYmFzZSBvciBlbHNlIHlvdSBnZXQgYSBgYmxvY2tlZGAgZXZlbnRcbiAgICAgICAgZGIuY2xvc2UoKTtcbiAgICAgICAgYXdhaXQgX2RlbGV0ZURhdGFiYXNlKCk7XG4gICAgICAgIHJlc29sdmUoYXdhaXQgX29wZW5EYXRhYmFzZSgpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUoZGIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF9wdXRPYmplY3QoXG4gIGRiOiBJREJEYXRhYmFzZSxcbiAga2V5OiBzdHJpbmcsXG4gIHZhbHVlOiBQZXJzaXN0ZW5jZVZhbHVlIHwgc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVxdWVzdCA9IGdldE9iamVjdFN0b3JlKGRiLCB0cnVlKS5wdXQoe1xuICAgIFtEQl9EQVRBX0tFWVBBVEhdOiBrZXksXG4gICAgdmFsdWVcbiAgfSk7XG4gIHJldHVybiBuZXcgREJQcm9taXNlPHZvaWQ+KHJlcXVlc3QpLnRvUHJvbWlzZSgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRPYmplY3QoXG4gIGRiOiBJREJEYXRhYmFzZSxcbiAga2V5OiBzdHJpbmdcbik6IFByb21pc2U8UGVyc2lzdGVkQmxvYiB8IG51bGw+IHtcbiAgY29uc3QgcmVxdWVzdCA9IGdldE9iamVjdFN0b3JlKGRiLCBmYWxzZSkuZ2V0KGtleSk7XG4gIGNvbnN0IGRhdGEgPSBhd2FpdCBuZXcgREJQcm9taXNlPERCT2JqZWN0IHwgdW5kZWZpbmVkPihyZXF1ZXN0KS50b1Byb21pc2UoKTtcbiAgcmV0dXJuIGRhdGEgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkYXRhLnZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX2RlbGV0ZU9iamVjdChkYjogSURCRGF0YWJhc2UsIGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlcXVlc3QgPSBnZXRPYmplY3RTdG9yZShkYiwgdHJ1ZSkuZGVsZXRlKGtleSk7XG4gIHJldHVybiBuZXcgREJQcm9taXNlPHZvaWQ+KHJlcXVlc3QpLnRvUHJvbWlzZSgpO1xufVxuXG5leHBvcnQgY29uc3QgX1BPTExJTkdfSU5URVJWQUxfTVMgPSA4MDA7XG5leHBvcnQgY29uc3QgX1RSQU5TQUNUSU9OX1JFVFJZX0NPVU5UID0gMztcblxuY2xhc3MgSW5kZXhlZERCTG9jYWxQZXJzaXN0ZW5jZSBpbXBsZW1lbnRzIEludGVybmFsUGVyc2lzdGVuY2Uge1xuICBzdGF0aWMgdHlwZTogJ0xPQ0FMJyA9ICdMT0NBTCc7XG5cbiAgdHlwZSA9IFBlcnNpc3RlbmNlVHlwZS5MT0NBTDtcbiAgZGI/OiBJREJEYXRhYmFzZTtcbiAgcmVhZG9ubHkgX3Nob3VsZEFsbG93TWlncmF0aW9uID0gdHJ1ZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGxpc3RlbmVyczogUmVjb3JkPHN0cmluZywgU2V0PFN0b3JhZ2VFdmVudExpc3RlbmVyPj4gPSB7fTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2NhbENhY2hlOiBSZWNvcmQ8c3RyaW5nLCBQZXJzaXN0ZW5jZVZhbHVlIHwgbnVsbD4gPSB7fTtcbiAgLy8gc2V0VGltZW91dCByZXR1cm4gdmFsdWUgaXMgcGxhdGZvcm0gc3BlY2lmaWNcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJpdmF0ZSBwb2xsVGltZXI6IGFueSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHBlbmRpbmdXcml0ZXMgPSAwO1xuXG4gIHByaXZhdGUgcmVjZWl2ZXI6IFJlY2VpdmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc2VuZGVyOiBTZW5kZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzZXJ2aWNlV29ya2VyUmVjZWl2ZXJBdmFpbGFibGUgPSBmYWxzZTtcbiAgcHJpdmF0ZSBhY3RpdmVTZXJ2aWNlV29ya2VyOiBTZXJ2aWNlV29ya2VyIHwgbnVsbCA9IG51bGw7XG4gIC8vIFZpc2libGUgZm9yIHRlc3Rpbmcgb25seVxuICByZWFkb25seSBfd29ya2VySW5pdGlhbGl6YXRpb25Qcm9taXNlOiBQcm9taXNlPHZvaWQ+O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIEZpcmUgJiBmb3JnZXQgdGhlIHNlcnZpY2Ugd29ya2VyIHJlZ2lzdHJhdGlvbiBhcyBpdCBtYXkgbmV2ZXIgcmVzb2x2ZVxuICAgIHRoaXMuX3dvcmtlckluaXRpYWxpemF0aW9uUHJvbWlzZSA9XG4gICAgICB0aGlzLmluaXRpYWxpemVTZXJ2aWNlV29ya2VyTWVzc2FnaW5nKCkudGhlbihcbiAgICAgICAgKCkgPT4ge30sXG4gICAgICAgICgpID0+IHt9XG4gICAgICApO1xuICB9XG5cbiAgYXN5bmMgX29wZW5EYigpOiBQcm9taXNlPElEQkRhdGFiYXNlPiB7XG4gICAgaWYgKHRoaXMuZGIpIHtcbiAgICAgIHJldHVybiB0aGlzLmRiO1xuICAgIH1cbiAgICB0aGlzLmRiID0gYXdhaXQgX29wZW5EYXRhYmFzZSgpO1xuICAgIHJldHVybiB0aGlzLmRiO1xuICB9XG5cbiAgYXN5bmMgX3dpdGhSZXRyaWVzPFQ+KG9wOiAoZGI6IElEQkRhdGFiYXNlKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgbGV0IG51bUF0dGVtcHRzID0gMDtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkYiA9IGF3YWl0IHRoaXMuX29wZW5EYigpO1xuICAgICAgICByZXR1cm4gYXdhaXQgb3AoZGIpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAobnVtQXR0ZW1wdHMrKyA+IF9UUkFOU0FDVElPTl9SRVRSWV9DT1VOVCkge1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGIpIHtcbiAgICAgICAgICB0aGlzLmRiLmNsb3NlKCk7XG4gICAgICAgICAgdGhpcy5kYiA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPOiBjb25zaWRlciBhZGRpbmcgZXhwb25lbnRpYWwgYmFja29mZlxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRleGVkREIgZXZlbnRzIGRvIG5vdCBwcm9wYWdhdGUgZnJvbSB0aGUgbWFpbiB3aW5kb3cgdG8gdGhlIHdvcmtlciBjb250ZXh0LiAgV2UgcmVseSBvbiBhXG4gICAqIHBvc3RNZXNzYWdlIGludGVyZmFjZSB0byBzZW5kIHRoZXNlIGV2ZW50cyB0byB0aGUgd29ya2VyIG91cnNlbHZlcy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZVNlcnZpY2VXb3JrZXJNZXNzYWdpbmcoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIF9pc1dvcmtlcigpID8gdGhpcy5pbml0aWFsaXplUmVjZWl2ZXIoKSA6IHRoaXMuaW5pdGlhbGl6ZVNlbmRlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzIHRoZSB3b3JrZXIgd2Ugc2hvdWxkIGxpc3RlbiB0byBldmVudHMgZnJvbSB0aGUgbWFpbiB3aW5kb3cuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGluaXRpYWxpemVSZWNlaXZlcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnJlY2VpdmVyID0gUmVjZWl2ZXIuX2dldEluc3RhbmNlKF9nZXRXb3JrZXJHbG9iYWxTY29wZSgpISk7XG4gICAgLy8gUmVmcmVzaCBmcm9tIHBlcnNpc3RlbmNlIGlmIHdlIHJlY2VpdmUgYSBLZXlDaGFuZ2VkIG1lc3NhZ2UuXG4gICAgdGhpcy5yZWNlaXZlci5fc3Vic2NyaWJlKFxuICAgICAgX0V2ZW50VHlwZS5LRVlfQ0hBTkdFRCxcbiAgICAgIGFzeW5jIChfb3JpZ2luOiBzdHJpbmcsIGRhdGE6IEtleUNoYW5nZWRSZXF1ZXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGtleXMgPSBhd2FpdCB0aGlzLl9wb2xsKCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAga2V5UHJvY2Vzc2VkOiBrZXlzLmluY2x1ZGVzKGRhdGEua2V5KVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICk7XG4gICAgLy8gTGV0IHRoZSBzZW5kZXIga25vdyB0aGF0IHdlIGFyZSBsaXN0ZW5pbmcgc28gdGhleSBnaXZlIHVzIG1vcmUgdGltZW91dC5cbiAgICB0aGlzLnJlY2VpdmVyLl9zdWJzY3JpYmUoXG4gICAgICBfRXZlbnRUeXBlLlBJTkcsXG4gICAgICBhc3luYyAoX29yaWdpbjogc3RyaW5nLCBfZGF0YTogUGluZ1JlcXVlc3QpID0+IHtcbiAgICAgICAgcmV0dXJuIFtfRXZlbnRUeXBlLktFWV9DSEFOR0VEXTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzIHRoZSBtYWluIHdpbmRvdywgd2Ugc2hvdWxkIGxldCB0aGUgd29ya2VyIGtub3cgd2hlbiBrZXlzIGNoYW5nZSAoc2V0IGFuZCByZW1vdmUpLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1NlcnZpY2VXb3JrZXJDb250YWluZXIvcmVhZHkgfCBTZXJ2aWNlV29ya2VyQ29udGFpbmVyLnJlYWR5fVxuICAgKiBtYXkgbm90IHJlc29sdmUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGluaXRpYWxpemVTZW5kZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZXJlJ3MgYW4gYWN0aXZlIHNlcnZpY2Ugd29ya2VyLlxuICAgIHRoaXMuYWN0aXZlU2VydmljZVdvcmtlciA9IGF3YWl0IF9nZXRBY3RpdmVTZXJ2aWNlV29ya2VyKCk7XG4gICAgaWYgKCF0aGlzLmFjdGl2ZVNlcnZpY2VXb3JrZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zZW5kZXIgPSBuZXcgU2VuZGVyKHRoaXMuYWN0aXZlU2VydmljZVdvcmtlcik7XG4gICAgLy8gUGluZyB0aGUgc2VydmljZSB3b3JrZXIgdG8gY2hlY2sgd2hhdCBldmVudHMgdGhleSBjYW4gaGFuZGxlLlxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLnNlbmRlci5fc2VuZDxfUGluZ1Jlc3BvbnNlLCBQaW5nUmVxdWVzdD4oXG4gICAgICBfRXZlbnRUeXBlLlBJTkcsXG4gICAgICB7fSxcbiAgICAgIF9UaW1lb3V0RHVyYXRpb24uTE9OR19BQ0tcbiAgICApO1xuICAgIGlmICghcmVzdWx0cykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICByZXN1bHRzWzBdPy5mdWxmaWxsZWQgJiZcbiAgICAgIHJlc3VsdHNbMF0/LnZhbHVlLmluY2x1ZGVzKF9FdmVudFR5cGUuS0VZX0NIQU5HRUQpXG4gICAgKSB7XG4gICAgICB0aGlzLnNlcnZpY2VXb3JrZXJSZWNlaXZlckF2YWlsYWJsZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExldCB0aGUgd29ya2VyIGtub3cgYWJvdXQgYSBjaGFuZ2VkIGtleSwgdGhlIGV4YWN0IGtleSBkb2Vzbid0IHRlY2huaWNhbGx5IG1hdHRlciBzaW5jZSB0aGVcbiAgICogd29ya2VyIHdpbGwganVzdCB0cmlnZ2VyIGEgZnVsbCBzeW5jIGFueXdheS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogRm9yIG5vdywgd2Ugb25seSBzdXBwb3J0IG9uZSBzZXJ2aWNlIHdvcmtlciBwZXIgcGFnZS5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFN0b3JhZ2Uga2V5IHdoaWNoIGNoYW5nZWQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG5vdGlmeVNlcnZpY2VXb3JrZXIoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5zZW5kZXIgfHxcbiAgICAgICF0aGlzLmFjdGl2ZVNlcnZpY2VXb3JrZXIgfHxcbiAgICAgIF9nZXRTZXJ2aWNlV29ya2VyQ29udHJvbGxlcigpICE9PSB0aGlzLmFjdGl2ZVNlcnZpY2VXb3JrZXJcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZGVyLl9zZW5kPEtleUNoYW5nZWRSZXNwb25zZSwgS2V5Q2hhbmdlZFJlcXVlc3Q+KFxuICAgICAgICBfRXZlbnRUeXBlLktFWV9DSEFOR0VELFxuICAgICAgICB7IGtleSB9LFxuICAgICAgICAvLyBVc2UgbG9uZyB0aW1lb3V0IGlmIHJlY2VpdmVyIGhhcyBwcmV2aW91c2x5IHJlc3BvbmRlZCB0byBhIHBpbmcgZnJvbSB1cy5cbiAgICAgICAgdGhpcy5zZXJ2aWNlV29ya2VyUmVjZWl2ZXJBdmFpbGFibGVcbiAgICAgICAgICA/IF9UaW1lb3V0RHVyYXRpb24uTE9OR19BQ0tcbiAgICAgICAgICA6IF9UaW1lb3V0RHVyYXRpb24uQUNLXG4gICAgICApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gVGhpcyBpcyBhIGJlc3QgZWZmb3J0IGFwcHJvYWNoLiBJZ25vcmUgZXJyb3JzLlxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIF9pc0F2YWlsYWJsZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFpbmRleGVkREIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3QgZGIgPSBhd2FpdCBfb3BlbkRhdGFiYXNlKCk7XG4gICAgICBhd2FpdCBfcHV0T2JqZWN0KGRiLCBTVE9SQUdFX0FWQUlMQUJMRV9LRVksICcxJyk7XG4gICAgICBhd2FpdCBfZGVsZXRlT2JqZWN0KGRiLCBTVE9SQUdFX0FWQUlMQUJMRV9LRVkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7fVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX3dpdGhQZW5kaW5nV3JpdGUod3JpdGU6ICgpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnBlbmRpbmdXcml0ZXMrKztcbiAgICB0cnkge1xuICAgICAgYXdhaXQgd3JpdGUoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5wZW5kaW5nV3JpdGVzLS07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgX3NldChrZXk6IHN0cmluZywgdmFsdWU6IFBlcnNpc3RlbmNlVmFsdWUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd2l0aFBlbmRpbmdXcml0ZShhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLl93aXRoUmV0cmllcygoZGI6IElEQkRhdGFiYXNlKSA9PiBfcHV0T2JqZWN0KGRiLCBrZXksIHZhbHVlKSk7XG4gICAgICB0aGlzLmxvY2FsQ2FjaGVba2V5XSA9IHZhbHVlO1xuICAgICAgcmV0dXJuIHRoaXMubm90aWZ5U2VydmljZVdvcmtlcihrZXkpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgX2dldDxUIGV4dGVuZHMgUGVyc2lzdGVuY2VWYWx1ZT4oa2V5OiBzdHJpbmcpOiBQcm9taXNlPFQgfCBudWxsPiB7XG4gICAgY29uc3Qgb2JqID0gKGF3YWl0IHRoaXMuX3dpdGhSZXRyaWVzKChkYjogSURCRGF0YWJhc2UpID0+XG4gICAgICBnZXRPYmplY3QoZGIsIGtleSlcbiAgICApKSBhcyBUO1xuICAgIHRoaXMubG9jYWxDYWNoZVtrZXldID0gb2JqO1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBhc3luYyBfcmVtb3ZlKGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dpdGhQZW5kaW5nV3JpdGUoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5fd2l0aFJldHJpZXMoKGRiOiBJREJEYXRhYmFzZSkgPT4gX2RlbGV0ZU9iamVjdChkYiwga2V5KSk7XG4gICAgICBkZWxldGUgdGhpcy5sb2NhbENhY2hlW2tleV07XG4gICAgICByZXR1cm4gdGhpcy5ub3RpZnlTZXJ2aWNlV29ya2VyKGtleSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9wb2xsKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAvLyBUT0RPOiBjaGVjayBpZiB3ZSBuZWVkIHRvIGZhbGxiYWNrIGlmIGdldEFsbCBpcyBub3Qgc3VwcG9ydGVkXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5fd2l0aFJldHJpZXMoKGRiOiBJREJEYXRhYmFzZSkgPT4ge1xuICAgICAgY29uc3QgZ2V0QWxsUmVxdWVzdCA9IGdldE9iamVjdFN0b3JlKGRiLCBmYWxzZSkuZ2V0QWxsKCk7XG4gICAgICByZXR1cm4gbmV3IERCUHJvbWlzZTxEQk9iamVjdFtdIHwgbnVsbD4oZ2V0QWxsUmVxdWVzdCkudG9Qcm9taXNlKCk7XG4gICAgfSk7XG5cbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGhhdmUgcGVuZGluZyB3cml0ZXMgaW4gcHJvZ3Jlc3MgYWJvcnQsIHdlJ2xsIGdldCBwaWNrZWQgdXAgb24gdGhlIG5leHQgcG9sbFxuICAgIGlmICh0aGlzLnBlbmRpbmdXcml0ZXMgIT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXlzID0gW107XG4gICAgY29uc3Qga2V5c0luUmVzdWx0ID0gbmV3IFNldCgpO1xuICAgIGZvciAoY29uc3QgeyBmYmFzZV9rZXk6IGtleSwgdmFsdWUgfSBvZiByZXN1bHQpIHtcbiAgICAgIGtleXNJblJlc3VsdC5hZGQoa2V5KTtcbiAgICAgIGlmIChKU09OLnN0cmluZ2lmeSh0aGlzLmxvY2FsQ2FjaGVba2V5XSkgIT09IEpTT04uc3RyaW5naWZ5KHZhbHVlKSkge1xuICAgICAgICB0aGlzLm5vdGlmeUxpc3RlbmVycyhrZXksIHZhbHVlIGFzIFBlcnNpc3RlbmNlVmFsdWUpO1xuICAgICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBsb2NhbEtleSBvZiBPYmplY3Qua2V5cyh0aGlzLmxvY2FsQ2FjaGUpKSB7XG4gICAgICBpZiAodGhpcy5sb2NhbENhY2hlW2xvY2FsS2V5XSAmJiAha2V5c0luUmVzdWx0Lmhhcyhsb2NhbEtleSkpIHtcbiAgICAgICAgLy8gRGVsZXRlZFxuICAgICAgICB0aGlzLm5vdGlmeUxpc3RlbmVycyhsb2NhbEtleSwgbnVsbCk7XG4gICAgICAgIGtleXMucHVzaChsb2NhbEtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBrZXlzO1xuICB9XG5cbiAgcHJpdmF0ZSBub3RpZnlMaXN0ZW5lcnMoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgbmV3VmFsdWU6IFBlcnNpc3RlbmNlVmFsdWUgfCBudWxsXG4gICk6IHZvaWQge1xuICAgIHRoaXMubG9jYWxDYWNoZVtrZXldID0gbmV3VmFsdWU7XG4gICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnNba2V5XTtcbiAgICBpZiAobGlzdGVuZXJzKSB7XG4gICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIEFycmF5LmZyb20obGlzdGVuZXJzKSkge1xuICAgICAgICBsaXN0ZW5lcihuZXdWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGFydFBvbGxpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5zdG9wUG9sbGluZygpO1xuXG4gICAgdGhpcy5wb2xsVGltZXIgPSBzZXRJbnRlcnZhbChcbiAgICAgIGFzeW5jICgpID0+IHRoaXMuX3BvbGwoKSxcbiAgICAgIF9QT0xMSU5HX0lOVEVSVkFMX01TXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcFBvbGxpbmcoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucG9sbFRpbWVyKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMucG9sbFRpbWVyKTtcbiAgICAgIHRoaXMucG9sbFRpbWVyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBfYWRkTGlzdGVuZXIoa2V5OiBzdHJpbmcsIGxpc3RlbmVyOiBTdG9yYWdlRXZlbnRMaXN0ZW5lcik6IHZvaWQge1xuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLmxpc3RlbmVycykubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnN0YXJ0UG9sbGluZygpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMubGlzdGVuZXJzW2tleV0pIHtcbiAgICAgIHRoaXMubGlzdGVuZXJzW2tleV0gPSBuZXcgU2V0KCk7XG4gICAgICAvLyBQb3B1bGF0ZSB0aGUgY2FjaGUgdG8gYXZvaWQgc3B1cmlvdXNseSB0cmlnZ2VyaW5nIG9uIGZpcnN0IHBvbGwuXG4gICAgICB2b2lkIHRoaXMuX2dldChrZXkpOyAvLyBUaGlzIGNhbiBoYXBwZW4gaW4gdGhlIGJhY2tncm91bmQgYXN5bmMgYW5kIHdlIGNhbiByZXR1cm4gaW1tZWRpYXRlbHkuXG4gICAgfVxuICAgIHRoaXMubGlzdGVuZXJzW2tleV0uYWRkKGxpc3RlbmVyKTtcbiAgfVxuXG4gIF9yZW1vdmVMaXN0ZW5lcihrZXk6IHN0cmluZywgbGlzdGVuZXI6IFN0b3JhZ2VFdmVudExpc3RlbmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubGlzdGVuZXJzW2tleV0pIHtcbiAgICAgIHRoaXMubGlzdGVuZXJzW2tleV0uZGVsZXRlKGxpc3RlbmVyKTtcblxuICAgICAgaWYgKHRoaXMubGlzdGVuZXJzW2tleV0uc2l6ZSA9PT0gMCkge1xuICAgICAgICBkZWxldGUgdGhpcy5saXN0ZW5lcnNba2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5saXN0ZW5lcnMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5zdG9wUG9sbGluZygpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBQZXJzaXN0ZW5jZX0gb2YgdHlwZSBgTE9DQUxgIHVzaW5nIGBpbmRleGVkREJgXG4gKiBmb3IgdGhlIHVuZGVybHlpbmcgc3RvcmFnZS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBpbmRleGVkREJMb2NhbFBlcnNpc3RlbmNlOiBQZXJzaXN0ZW5jZSA9IEluZGV4ZWREQkxvY2FsUGVyc2lzdGVuY2U7XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgX3BlcmZvcm1BcGlSZXF1ZXN0LFxuICBFbmRwb2ludCxcbiAgSHR0cE1ldGhvZCxcbiAgX2FkZFRpZElmTmVjZXNzYXJ5XG59IGZyb20gJy4uL2luZGV4JztcbmltcG9ydCB7IEF1dGggfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuaW1wb3J0IHsgSWRUb2tlblJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vbW9kZWwvaWRfdG9rZW4nO1xuaW1wb3J0IHsgTWZhRW5yb2xsbWVudCB9IGZyb20gJy4uL2FjY291bnRfbWFuYWdlbWVudC9tZmEnO1xuaW1wb3J0IHsgU2lnbkluV2l0aElkcFJlc3BvbnNlIH0gZnJvbSAnLi9pZHAnO1xuaW1wb3J0IHtcbiAgU2lnbkluV2l0aFBob25lTnVtYmVyUmVxdWVzdCxcbiAgU2lnbkluV2l0aFBob25lTnVtYmVyUmVzcG9uc2Vcbn0gZnJvbSAnLi9zbXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZpbmFsaXplTWZhUmVzcG9uc2Uge1xuICBpZFRva2VuOiBzdHJpbmc7XG4gIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkVG9rZW5NZmFSZXNwb25zZSBleHRlbmRzIElkVG9rZW5SZXNwb25zZSB7XG4gIG1mYVBlbmRpbmdDcmVkZW50aWFsPzogc3RyaW5nO1xuICBtZmFJbmZvPzogTWZhRW5yb2xsbWVudFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0UGhvbmVNZmFTaWduSW5SZXF1ZXN0IHtcbiAgbWZhUGVuZGluZ0NyZWRlbnRpYWw6IHN0cmluZztcbiAgbWZhRW5yb2xsbWVudElkOiBzdHJpbmc7XG4gIHBob25lU2lnbkluSW5mbzoge1xuICAgIHJlY2FwdGNoYVRva2VuOiBzdHJpbmc7XG4gIH07XG4gIHRlbmFudElkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0UGhvbmVNZmFTaWduSW5SZXNwb25zZSB7XG4gIHBob25lUmVzcG9uc2VJbmZvOiB7XG4gICAgc2Vzc2lvbkluZm86IHN0cmluZztcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0U2lnbkluUGhvbmVNZmEoXG4gIGF1dGg6IEF1dGgsXG4gIHJlcXVlc3Q6IFN0YXJ0UGhvbmVNZmFTaWduSW5SZXF1ZXN0XG4pOiBQcm9taXNlPFN0YXJ0UGhvbmVNZmFTaWduSW5SZXNwb25zZT4ge1xuICByZXR1cm4gX3BlcmZvcm1BcGlSZXF1ZXN0PFxuICAgIFN0YXJ0UGhvbmVNZmFTaWduSW5SZXF1ZXN0LFxuICAgIFN0YXJ0UGhvbmVNZmFTaWduSW5SZXNwb25zZVxuICA+KFxuICAgIGF1dGgsXG4gICAgSHR0cE1ldGhvZC5QT1NULFxuICAgIEVuZHBvaW50LlNUQVJUX01GQV9TSUdOX0lOLFxuICAgIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KVxuICApO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbmFsaXplUGhvbmVNZmFTaWduSW5SZXF1ZXN0IHtcbiAgbWZhUGVuZGluZ0NyZWRlbnRpYWw6IHN0cmluZztcbiAgcGhvbmVWZXJpZmljYXRpb25JbmZvOiBTaWduSW5XaXRoUGhvbmVOdW1iZXJSZXF1ZXN0O1xuICB0ZW5hbnRJZD86IHN0cmluZztcbn1cblxuLy8gVE9UUCBNRkEgU2lnbiBpbiBvbmx5IGhhcyBhIGZpbmFsaXplIHBoYXNlLiBQaG9uZSBNRkEgaGFzIGEgc3RhcnQgcGhhc2UgdG8gaW5pdGlhdGUgc2VuZGluZyBhblxuLy8gU01TIGFuZCBhIGZpbmFsaXplIHBoYXNlIHRvIGNvbXBsZXRlIHNpZ24gaW4uIFdpdGggVE9UUCwgdGhlIHVzZXIgYWxyZWFkeSBoYXMgdGhlIE9UUCBpbiB0aGVcbi8vIFRPVFAvQXV0aGVudGljYXRvciBhcHAuXG5leHBvcnQgaW50ZXJmYWNlIEZpbmFsaXplVG90cE1mYVNpZ25JblJlcXVlc3Qge1xuICBtZmFQZW5kaW5nQ3JlZGVudGlhbDogc3RyaW5nO1xuICB0b3RwVmVyaWZpY2F0aW9uSW5mbzogeyB2ZXJpZmljYXRpb25Db2RlOiBzdHJpbmcgfTtcbiAgdGVuYW50SWQ/OiBzdHJpbmc7XG4gIG1mYUVucm9sbG1lbnRJZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbmFsaXplUGhvbmVNZmFTaWduSW5SZXNwb25zZSBleHRlbmRzIEZpbmFsaXplTWZhUmVzcG9uc2Uge31cblxuZXhwb3J0IGludGVyZmFjZSBGaW5hbGl6ZVRvdHBNZmFTaWduSW5SZXNwb25zZSBleHRlbmRzIEZpbmFsaXplTWZhUmVzcG9uc2Uge31cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmFsaXplU2lnbkluUGhvbmVNZmEoXG4gIGF1dGg6IEF1dGgsXG4gIHJlcXVlc3Q6IEZpbmFsaXplUGhvbmVNZmFTaWduSW5SZXF1ZXN0XG4pOiBQcm9taXNlPEZpbmFsaXplUGhvbmVNZmFTaWduSW5SZXNwb25zZT4ge1xuICByZXR1cm4gX3BlcmZvcm1BcGlSZXF1ZXN0PFxuICAgIEZpbmFsaXplUGhvbmVNZmFTaWduSW5SZXF1ZXN0LFxuICAgIEZpbmFsaXplUGhvbmVNZmFTaWduSW5SZXNwb25zZVxuICA+KFxuICAgIGF1dGgsXG4gICAgSHR0cE1ldGhvZC5QT1NULFxuICAgIEVuZHBvaW50LkZJTkFMSVpFX01GQV9TSUdOX0lOLFxuICAgIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluYWxpemVTaWduSW5Ub3RwTWZhKFxuICBhdXRoOiBBdXRoLFxuICByZXF1ZXN0OiBGaW5hbGl6ZVRvdHBNZmFTaWduSW5SZXF1ZXN0XG4pOiBQcm9taXNlPEZpbmFsaXplVG90cE1mYVNpZ25JblJlc3BvbnNlPiB7XG4gIHJldHVybiBfcGVyZm9ybUFwaVJlcXVlc3Q8XG4gICAgRmluYWxpemVUb3RwTWZhU2lnbkluUmVxdWVzdCxcbiAgICBGaW5hbGl6ZVRvdHBNZmFTaWduSW5SZXNwb25zZVxuICA+KFxuICAgIGF1dGgsXG4gICAgSHR0cE1ldGhvZC5QT1NULFxuICAgIEVuZHBvaW50LkZJTkFMSVpFX01GQV9TSUdOX0lOLFxuICAgIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KVxuICApO1xufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgdHlwZSBQaG9uZU9yT2F1dGhUb2tlblJlc3BvbnNlID1cbiAgfCBTaWduSW5XaXRoUGhvbmVOdW1iZXJSZXNwb25zZVxuICB8IFNpZ25JbldpdGhJZHBSZXNwb25zZVxuICB8IElkVG9rZW5SZXNwb25zZTtcbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBBdXRoRXJyb3JDb2RlIH0gZnJvbSAnLi4vLi4vY29yZS9lcnJvcnMnO1xuaW1wb3J0IHsgX2Fzc2VydCB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbC9hc3NlcnQnO1xuaW1wb3J0IHsgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXV0aCc7XG5pbXBvcnQgeyBSZWNhcHRjaGFQYXJhbWV0ZXJzIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcbmltcG9ydCB7XG4gIFJlY2FwdGNoYSxcbiAgR3JlQ0FQVENIQVRvcExldmVsLFxuICBHcmVDQVBUQ0hBUmVuZGVyT3B0aW9uLFxuICBHcmVDQVBUQ0hBXG59IGZyb20gJy4vcmVjYXB0Y2hhJztcblxuZXhwb3J0IGNvbnN0IF9TT0xWRV9USU1FX01TID0gNTAwO1xuZXhwb3J0IGNvbnN0IF9FWFBJUkFUSU9OX1RJTUVfTVMgPSA2MF8wMDA7XG5leHBvcnQgY29uc3QgX1dJREdFVF9JRF9TVEFSVCA9IDFfMDAwXzAwMF8wMDBfMDAwO1xuXG5leHBvcnQgaW50ZXJmYWNlIFdpZGdldCB7XG4gIGdldFJlc3BvbnNlOiAoKSA9PiBzdHJpbmcgfCBudWxsO1xuICBkZWxldGU6ICgpID0+IHZvaWQ7XG4gIGV4ZWN1dGU6ICgpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBNb2NrUmVDYXB0Y2hhIGltcGxlbWVudHMgUmVjYXB0Y2hhIHtcbiAgcHJpdmF0ZSBjb3VudGVyID0gX1dJREdFVF9JRF9TVEFSVDtcbiAgX3dpZGdldHMgPSBuZXcgTWFwPG51bWJlciwgV2lkZ2V0PigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgYXV0aDogQXV0aEludGVybmFsKSB7fVxuXG4gIHJlbmRlcihcbiAgICBjb250YWluZXI6IHN0cmluZyB8IEhUTUxFbGVtZW50LFxuICAgIHBhcmFtZXRlcnM/OiBSZWNhcHRjaGFQYXJhbWV0ZXJzXG4gICk6IG51bWJlciB7XG4gICAgY29uc3QgaWQgPSB0aGlzLmNvdW50ZXI7XG4gICAgdGhpcy5fd2lkZ2V0cy5zZXQoXG4gICAgICBpZCxcbiAgICAgIG5ldyBNb2NrV2lkZ2V0KGNvbnRhaW5lciwgdGhpcy5hdXRoLm5hbWUsIHBhcmFtZXRlcnMgfHwge30pXG4gICAgKTtcbiAgICB0aGlzLmNvdW50ZXIrKztcbiAgICByZXR1cm4gaWQ7XG4gIH1cblxuICByZXNldChvcHRXaWRnZXRJZD86IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGlkID0gb3B0V2lkZ2V0SWQgfHwgX1dJREdFVF9JRF9TVEFSVDtcbiAgICB2b2lkIHRoaXMuX3dpZGdldHMuZ2V0KGlkKT8uZGVsZXRlKCk7XG4gICAgdGhpcy5fd2lkZ2V0cy5kZWxldGUoaWQpO1xuICB9XG5cbiAgZ2V0UmVzcG9uc2Uob3B0V2lkZ2V0SWQ/OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IGlkID0gb3B0V2lkZ2V0SWQgfHwgX1dJREdFVF9JRF9TVEFSVDtcbiAgICByZXR1cm4gdGhpcy5fd2lkZ2V0cy5nZXQoaWQpPy5nZXRSZXNwb25zZSgpIHx8ICcnO1xuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZShvcHRXaWRnZXRJZD86IG51bWJlciB8IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgaWQ6IG51bWJlciA9IChvcHRXaWRnZXRJZCBhcyBudW1iZXIpIHx8IF9XSURHRVRfSURfU1RBUlQ7XG4gICAgdm9pZCB0aGlzLl93aWRnZXRzLmdldChpZCk/LmV4ZWN1dGUoKTtcbiAgICByZXR1cm4gJyc7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1vY2tHcmVDQVBUQ0hBVG9wTGV2ZWwgaW1wbGVtZW50cyBHcmVDQVBUQ0hBVG9wTGV2ZWwge1xuICBlbnRlcnByaXNlOiBHcmVDQVBUQ0hBID0gbmV3IE1vY2tHcmVDQVBUQ0hBKCk7XG4gIHJlYWR5KGNhbGxiYWNrOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgY2FsbGJhY2soKTtcbiAgfVxuXG4gIGV4ZWN1dGUoXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9zaXRlS2V5OiBzdHJpbmcsXG4gICAgX29wdGlvbnM6IHsgYWN0aW9uOiBzdHJpbmcgfVxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoJ3Rva2VuJyk7XG4gIH1cbiAgcmVuZGVyKFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfY29udGFpbmVyOiBzdHJpbmcgfCBIVE1MRWxlbWVudCxcbiAgICBfcGFyYW1ldGVyczogR3JlQ0FQVENIQVJlbmRlck9wdGlvblxuICApOiBzdHJpbmcge1xuICAgIHJldHVybiAnJztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTW9ja0dyZUNBUFRDSEEgaW1wbGVtZW50cyBHcmVDQVBUQ0hBIHtcbiAgcmVhZHkoY2FsbGJhY2s6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBjYWxsYmFjaygpO1xuICB9XG5cbiAgZXhlY3V0ZShcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX3NpdGVLZXk6IHN0cmluZyxcbiAgICBfb3B0aW9uczogeyBhY3Rpb246IHN0cmluZyB9XG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgndG9rZW4nKTtcbiAgfVxuICByZW5kZXIoXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9jb250YWluZXI6IHN0cmluZyB8IEhUTUxFbGVtZW50LFxuICAgIF9wYXJhbWV0ZXJzOiBHcmVDQVBUQ0hBUmVuZGVyT3B0aW9uXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuICcnO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNb2NrV2lkZ2V0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBjb250YWluZXI6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IGlzVmlzaWJsZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSB0aW1lcklkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBkZWxldGVkID0gZmFsc2U7XG4gIHByaXZhdGUgcmVzcG9uc2VUb2tlbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2xpY2tIYW5kbGVyID0gKCk6IHZvaWQgPT4ge1xuICAgIHRoaXMuZXhlY3V0ZSgpO1xuICB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNvbnRhaW5lck9ySWQ6IHN0cmluZyB8IEhUTUxFbGVtZW50LFxuICAgIGFwcE5hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhcmFtczogUmVjYXB0Y2hhUGFyYW1ldGVyc1xuICApIHtcbiAgICBjb25zdCBjb250YWluZXIgPVxuICAgICAgdHlwZW9mIGNvbnRhaW5lck9ySWQgPT09ICdzdHJpbmcnXG4gICAgICAgID8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY29udGFpbmVyT3JJZClcbiAgICAgICAgOiBjb250YWluZXJPcklkO1xuICAgIF9hc3NlcnQoY29udGFpbmVyLCBBdXRoRXJyb3JDb2RlLkFSR1VNRU5UX0VSUk9SLCB7IGFwcE5hbWUgfSk7XG5cbiAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICB0aGlzLmlzVmlzaWJsZSA9IHRoaXMucGFyYW1zLnNpemUgIT09ICdpbnZpc2libGUnO1xuICAgIGlmICh0aGlzLmlzVmlzaWJsZSkge1xuICAgICAgdGhpcy5leGVjdXRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5jbGlja0hhbmRsZXIpO1xuICAgIH1cbiAgfVxuXG4gIGdldFJlc3BvbnNlKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHRoaXMuY2hlY2tJZkRlbGV0ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5yZXNwb25zZVRva2VuO1xuICB9XG5cbiAgZGVsZXRlKCk6IHZvaWQge1xuICAgIHRoaXMuY2hlY2tJZkRlbGV0ZWQoKTtcbiAgICB0aGlzLmRlbGV0ZWQgPSB0cnVlO1xuICAgIGlmICh0aGlzLnRpbWVySWQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVySWQpO1xuICAgICAgdGhpcy50aW1lcklkID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5jb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmNsaWNrSGFuZGxlcik7XG4gIH1cblxuICBleGVjdXRlKCk6IHZvaWQge1xuICAgIHRoaXMuY2hlY2tJZkRlbGV0ZWQoKTtcbiAgICBpZiAodGhpcy50aW1lcklkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy50aW1lcklkID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5yZXNwb25zZVRva2VuID0gZ2VuZXJhdGVSYW5kb21BbHBoYU51bWVyaWNTdHJpbmcoNTApO1xuICAgICAgY29uc3QgeyBjYWxsYmFjaywgJ2V4cGlyZWQtY2FsbGJhY2snOiBleHBpcmVkQ2FsbGJhY2sgfSA9IHRoaXMucGFyYW1zO1xuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY2FsbGJhY2sodGhpcy5yZXNwb25zZVRva2VuKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgIH1cblxuICAgICAgdGhpcy50aW1lcklkID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnRpbWVySWQgPSBudWxsO1xuICAgICAgICB0aGlzLnJlc3BvbnNlVG9rZW4gPSBudWxsO1xuICAgICAgICBpZiAoZXhwaXJlZENhbGxiYWNrKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGV4cGlyZWRDYWxsYmFjaygpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc1Zpc2libGUpIHtcbiAgICAgICAgICB0aGlzLmV4ZWN1dGUoKTtcbiAgICAgICAgfVxuICAgICAgfSwgX0VYUElSQVRJT05fVElNRV9NUyk7XG4gICAgfSwgX1NPTFZFX1RJTUVfTVMpO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0lmRGVsZXRlZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kZWxldGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlQ0FQVENIQSBtb2NrIHdhcyBhbHJlYWR5IGRlbGV0ZWQhJyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlUmFuZG9tQWxwaGFOdW1lcmljU3RyaW5nKGxlbjogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgY2hhcnMgPSBbXTtcbiAgY29uc3QgYWxsb3dlZENoYXJzID1cbiAgICAnMTIzNDU2Nzg5MGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgY2hhcnMucHVzaChcbiAgICAgIGFsbG93ZWRDaGFycy5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYWxsb3dlZENoYXJzLmxlbmd0aCkpXG4gICAgKTtcbiAgfVxuICByZXR1cm4gY2hhcnMuam9pbignJyk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgcXVlcnlzdHJpbmcgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5cbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi8uLi9jb3JlL2Vycm9ycyc7XG5pbXBvcnQgeyBfYXNzZXJ0LCBfY3JlYXRlRXJyb3IgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWwvYXNzZXJ0JztcbmltcG9ydCB7IERlbGF5IH0gZnJvbSAnLi4vLi4vY29yZS91dGlsL2RlbGF5JztcbmltcG9ydCB7IEF1dGhJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL2F1dGgnO1xuaW1wb3J0IHsgX3dpbmRvdyB9IGZyb20gJy4uL2F1dGhfd2luZG93JztcbmltcG9ydCAqIGFzIGpzSGVscGVycyBmcm9tICcuLi9sb2FkX2pzJztcbmltcG9ydCB7IFJlY2FwdGNoYSwgaXNWMiB9IGZyb20gJy4vcmVjYXB0Y2hhJztcbmltcG9ydCB7IE1vY2tSZUNhcHRjaGEgfSBmcm9tICcuL3JlY2FwdGNoYV9tb2NrJztcblxuLy8gUmVDYXB0Y2hhIHdpbGwgbG9hZCB1c2luZyB0aGUgc2FtZSBjYWxsYmFjaywgc28gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIG5lZWRzXG4vLyB0byBiZSBrZXB0IGFyb3VuZFxuZXhwb3J0IGNvbnN0IF9KU0xPQURfQ0FMTEJBQ0sgPSBqc0hlbHBlcnMuX2dlbmVyYXRlQ2FsbGJhY2tOYW1lKCdyY2InKTtcbmNvbnN0IE5FVFdPUktfVElNRU9VVF9ERUxBWSA9IG5ldyBEZWxheSgzMDAwMCwgNjAwMDApO1xuY29uc3QgUkVDQVBUQ0hBX0JBU0UgPSAnaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9yZWNhcHRjaGEvYXBpLmpzPyc7XG5cbi8qKlxuICogV2UgbmVlZCB0byBtYXJrIHRoaXMgaW50ZXJmYWNlIGFzIGludGVybmFsIGV4cGxpY2l0bHkgdG8gZXhjbHVkZSBpdCBpbiB0aGUgcHVibGljIHR5cGluZ3MsIGJlY2F1c2VcbiAqIGl0IHJlZmVyZW5jZXMgQXV0aEludGVybmFsIHdoaWNoIGhhcyBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgd2l0aCBVc2VySW50ZXJuYWwuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVDYXB0Y2hhTG9hZGVyIHtcbiAgbG9hZChhdXRoOiBBdXRoSW50ZXJuYWwsIGhsPzogc3RyaW5nKTogUHJvbWlzZTxSZWNhcHRjaGE+O1xuICBjbGVhcmVkT25lSW5zdGFuY2UoKTogdm9pZDtcbn1cblxuLyoqXG4gKiBMb2FkZXIgZm9yIHRoZSBHUmVDYXB0Y2hhIGxpYnJhcnkuIFRoZXJlIHNob3VsZCBvbmx5IGV2ZXIgYmUgb25lIG9mIHRoaXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZUNhcHRjaGFMb2FkZXJJbXBsIGltcGxlbWVudHMgUmVDYXB0Y2hhTG9hZGVyIHtcbiAgcHJpdmF0ZSBob3N0TGFuZ3VhZ2UgPSAnJztcbiAgcHJpdmF0ZSBjb3VudGVyID0gMDtcbiAgLyoqXG4gICAqIENoZWNrIGZvciBgcmVuZGVyKClgIG1ldGhvZC4gYHdpbmRvdy5ncmVjYXB0Y2hhYCB3aWxsIGV4aXN0IGlmIHRoZSBFbnRlcnByaXNlXG4gICAqIHZlcnNpb24gb2YgdGhlIFJlQ0FQVENIQSBzY3JpcHQgd2FzIGxvYWRlZCBieSBzb21lb25lIGVsc2UgKGUuZy4gQXBwIENoZWNrKSBidXRcbiAgICogYHdpbmRvdy5ncmVjYXB0Y2hhLnJlbmRlcigpYCB3aWxsIG5vdC4gQW5vdGhlciBsb2FkIHdpbGwgYWRkIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBsaWJyYXJ5U2VwYXJhdGVseUxvYWRlZCA9ICEhX3dpbmRvdygpLmdyZWNhcHRjaGE/LnJlbmRlcjtcblxuICBsb2FkKGF1dGg6IEF1dGhJbnRlcm5hbCwgaGwgPSAnJyk6IFByb21pc2U8UmVjYXB0Y2hhPiB7XG4gICAgX2Fzc2VydChpc0hvc3RMYW5ndWFnZVZhbGlkKGhsKSwgYXV0aCwgQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUik7XG5cbiAgICBpZiAodGhpcy5zaG91bGRSZXNvbHZlSW1tZWRpYXRlbHkoaGwpICYmIGlzVjIoX3dpbmRvdygpLmdyZWNhcHRjaGEpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKF93aW5kb3coKS5ncmVjYXB0Y2hhISBhcyBSZWNhcHRjaGEpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFByb21pc2U8UmVjYXB0Y2hhPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBuZXR3b3JrVGltZW91dCA9IF93aW5kb3coKS5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgcmVqZWN0KF9jcmVhdGVFcnJvcihhdXRoLCBBdXRoRXJyb3JDb2RlLk5FVFdPUktfUkVRVUVTVF9GQUlMRUQpKTtcbiAgICAgIH0sIE5FVFdPUktfVElNRU9VVF9ERUxBWS5nZXQoKSk7XG5cbiAgICAgIF93aW5kb3coKVtfSlNMT0FEX0NBTExCQUNLXSA9ICgpID0+IHtcbiAgICAgICAgX3dpbmRvdygpLmNsZWFyVGltZW91dChuZXR3b3JrVGltZW91dCk7XG4gICAgICAgIGRlbGV0ZSBfd2luZG93KClbX0pTTE9BRF9DQUxMQkFDS107XG5cbiAgICAgICAgY29uc3QgcmVjYXB0Y2hhID0gX3dpbmRvdygpLmdyZWNhcHRjaGEgYXMgUmVjYXB0Y2hhO1xuXG4gICAgICAgIGlmICghcmVjYXB0Y2hhIHx8ICFpc1YyKHJlY2FwdGNoYSkpIHtcbiAgICAgICAgICByZWplY3QoX2NyZWF0ZUVycm9yKGF1dGgsIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXcmFwIHRoZSBncmVwdGNoYSByZW5kZXIgZnVuY3Rpb24gc28gdGhhdCB3ZSBrbm93IGlmIHRoZSBkZXZlbG9wZXIgaGFzXG4gICAgICAgIC8vIGNhbGxlZCBpdCBzZXBhcmF0ZWx5XG4gICAgICAgIGNvbnN0IHJlbmRlciA9IHJlY2FwdGNoYS5yZW5kZXI7XG4gICAgICAgIHJlY2FwdGNoYS5yZW5kZXIgPSAoY29udGFpbmVyLCBwYXJhbXMpID0+IHtcbiAgICAgICAgICBjb25zdCB3aWRnZXRJZCA9IHJlbmRlcihjb250YWluZXIsIHBhcmFtcyk7XG4gICAgICAgICAgdGhpcy5jb3VudGVyKys7XG4gICAgICAgICAgcmV0dXJuIHdpZGdldElkO1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuaG9zdExhbmd1YWdlID0gaGw7XG4gICAgICAgIHJlc29sdmUocmVjYXB0Y2hhKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHVybCA9IGAke1JFQ0FQVENIQV9CQVNFfT8ke3F1ZXJ5c3RyaW5nKHtcbiAgICAgICAgb25sb2FkOiBfSlNMT0FEX0NBTExCQUNLLFxuICAgICAgICByZW5kZXI6ICdleHBsaWNpdCcsXG4gICAgICAgIGhsXG4gICAgICB9KX1gO1xuXG4gICAgICBqc0hlbHBlcnMuX2xvYWRKUyh1cmwpLmNhdGNoKCgpID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KG5ldHdvcmtUaW1lb3V0KTtcbiAgICAgICAgcmVqZWN0KF9jcmVhdGVFcnJvcihhdXRoLCBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGNsZWFyZWRPbmVJbnN0YW5jZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNvdW50ZXItLTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkUmVzb2x2ZUltbWVkaWF0ZWx5KGhsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBXZSBjYW4gcmVzb2x2ZSBpbW1lZGlhdGVseSBpZjpcbiAgICAvLyAgIOKAoiBncmVjYXB0Y2hhIGlzIGFscmVhZHkgZGVmaW5lZCBBTkQgKFxuICAgIC8vICAgICAxLiB0aGUgcmVxdWVzdGVkIGxhbmd1YWdlIGNvZGVzIGFyZSB0aGUgc2FtZSBPUlxuICAgIC8vICAgICAyLiB0aGVyZSBleGlzdHMgYWxyZWFkeSBhIFJlQ2FwdGNoYSBvbiB0aGUgcGFnZVxuICAgIC8vICAgICAzLiB0aGUgbGlicmFyeSB3YXMgYWxyZWFkeSBsb2FkZWQgYnkgdGhlIGFwcFxuICAgIC8vIEluIGNhc2VzICgyKSBhbmQgKDMpLCB3ZSBfY2FuJ3RfIHJlbG9hZCBhcyBpdCB3b3VsZCBicmVhayB0aGUgcmVjYXB0Y2hhc1xuICAgIC8vIHRoYXQgYXJlIGFscmVhZHkgaW4gdGhlIHBhZ2VcbiAgICByZXR1cm4gKFxuICAgICAgISFfd2luZG93KCkuZ3JlY2FwdGNoYT8ucmVuZGVyICYmXG4gICAgICAoaGwgPT09IHRoaXMuaG9zdExhbmd1YWdlIHx8XG4gICAgICAgIHRoaXMuY291bnRlciA+IDAgfHxcbiAgICAgICAgdGhpcy5saWJyYXJ5U2VwYXJhdGVseUxvYWRlZClcbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzSG9zdExhbmd1YWdlVmFsaWQoaGw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gaGwubGVuZ3RoIDw9IDYgJiYgL15cXHMqW2EtekEtWjAtOVxcLV0qXFxzKiQvLnRlc3QoaGwpO1xufVxuXG5leHBvcnQgY2xhc3MgTW9ja1JlQ2FwdGNoYUxvYWRlckltcGwgaW1wbGVtZW50cyBSZUNhcHRjaGFMb2FkZXIge1xuICBhc3luYyBsb2FkKGF1dGg6IEF1dGhJbnRlcm5hbCk6IFByb21pc2U8UmVjYXB0Y2hhPiB7XG4gICAgcmV0dXJuIG5ldyBNb2NrUmVDYXB0Y2hhKGF1dGgpO1xuICB9XG5cbiAgY2xlYXJlZE9uZUluc3RhbmNlKCk6IHZvaWQge31cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBBdXRoLCBSZWNhcHRjaGFQYXJhbWV0ZXJzIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcbmltcG9ydCB7IGdldFJlY2FwdGNoYVBhcmFtcyB9IGZyb20gJy4uLy4uL2FwaS9hdXRoZW50aWNhdGlvbi9yZWNhcHRjaGEnO1xuaW1wb3J0IHsgX2Nhc3RBdXRoIH0gZnJvbSAnLi4vLi4vY29yZS9hdXRoL2F1dGhfaW1wbCc7XG5pbXBvcnQgeyBBdXRoRXJyb3JDb2RlIH0gZnJvbSAnLi4vLi4vY29yZS9lcnJvcnMnO1xuaW1wb3J0IHsgX2Fzc2VydCB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbC9hc3NlcnQnO1xuaW1wb3J0IHsgX2lzSHR0cE9ySHR0cHMgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWwvbG9jYXRpb24nO1xuaW1wb3J0IHsgQXBwbGljYXRpb25WZXJpZmllckludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXBwbGljYXRpb25fdmVyaWZpZXInO1xuaW1wb3J0IHsgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXV0aCc7XG5pbXBvcnQgeyBfd2luZG93IH0gZnJvbSAnLi4vYXV0aF93aW5kb3cnO1xuaW1wb3J0IHsgX2lzV29ya2VyIH0gZnJvbSAnLi4vdXRpbC93b3JrZXInO1xuaW1wb3J0IHsgUmVjYXB0Y2hhIH0gZnJvbSAnLi9yZWNhcHRjaGEnO1xuaW1wb3J0IHtcbiAgTW9ja1JlQ2FwdGNoYUxvYWRlckltcGwsXG4gIFJlQ2FwdGNoYUxvYWRlcixcbiAgUmVDYXB0Y2hhTG9hZGVySW1wbFxufSBmcm9tICcuL3JlY2FwdGNoYV9sb2FkZXInO1xuXG5leHBvcnQgY29uc3QgUkVDQVBUQ0hBX1ZFUklGSUVSX1RZUEUgPSAncmVjYXB0Y2hhJztcblxuY29uc3QgREVGQVVMVF9QQVJBTVM6IFJlY2FwdGNoYVBhcmFtZXRlcnMgPSB7XG4gIHRoZW1lOiAnbGlnaHQnLFxuICB0eXBlOiAnaW1hZ2UnXG59O1xuXG50eXBlIFRva2VuQ2FsbGJhY2sgPSAodG9rZW46IHN0cmluZykgPT4gdm9pZDtcblxuLyoqXG4gKiBBbiB7QGxpbmsgaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9yZWNhcHRjaGEvIHwgcmVDQVBUQ0hBfS1iYXNlZCBhcHBsaWNhdGlvbiB2ZXJpZmllci5cbiAqXG4gKiBAcmVtYXJrc1xuICogYFJlY2FwdGNoYVZlcmlmaWVyYCBkb2VzIG5vdCB3b3JrIGluIGEgTm9kZS5qcyBlbnZpcm9ubWVudC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWNhcHRjaGFWZXJpZmllciBpbXBsZW1lbnRzIEFwcGxpY2F0aW9uVmVyaWZpZXJJbnRlcm5hbCB7XG4gIC8qKlxuICAgKiBUaGUgYXBwbGljYXRpb24gdmVyaWZpZXIgdHlwZS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogRm9yIGEgcmVDQVBUQ0hBIHZlcmlmaWVyLCB0aGlzIGlzICdyZWNhcHRjaGEnLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZSA9IFJFQ0FQVENIQV9WRVJJRklFUl9UWVBFO1xuICBwcml2YXRlIGRlc3Ryb3llZCA9IGZhbHNlO1xuICBwcml2YXRlIHdpZGdldElkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBjb250YWluZXI6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IGlzSW52aXNpYmxlOiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IHRva2VuQ2hhbmdlTGlzdGVuZXJzID0gbmV3IFNldDxUb2tlbkNhbGxiYWNrPigpO1xuICBwcml2YXRlIHJlbmRlclByb21pc2U6IFByb21pc2U8bnVtYmVyPiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IGF1dGg6IEF1dGhJbnRlcm5hbDtcblxuICAvKiogQGludGVybmFsICovXG4gIHJlYWRvbmx5IF9yZWNhcHRjaGFMb2FkZXI6IFJlQ2FwdGNoYUxvYWRlcjtcbiAgcHJpdmF0ZSByZWNhcHRjaGE6IFJlY2FwdGNoYSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gYXV0aEV4dGVybiAtIFRoZSBjb3JyZXNwb25kaW5nIEZpcmViYXNlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lck9ySWQgLSBUaGUgcmVDQVBUQ0hBIGNvbnRhaW5lciBwYXJhbWV0ZXIuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFRoaXMgaGFzIGRpZmZlcmVudCBtZWFuaW5nIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSByZUNBUFRDSEEgaXMgaGlkZGVuIG9yIHZpc2libGUuIEZvciBhXG4gICAqIHZpc2libGUgcmVDQVBUQ0hBIHRoZSBjb250YWluZXIgbXVzdCBiZSBlbXB0eS4gSWYgYSBzdHJpbmcgaXMgdXNlZCwgaXQgaGFzIHRvIGNvcnJlc3BvbmQgdG9cbiAgICogYW4gZWxlbWVudCBJRC4gVGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBtdXN0IGFsc28gbXVzdCBiZSBpbiB0aGUgRE9NIGF0IHRoZSB0aW1lIG9mXG4gICAqIGluaXRpYWxpemF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1ldGVycyAtIFRoZSBvcHRpb25hbCByZUNBUFRDSEEgcGFyYW1ldGVycy5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogQ2hlY2sgdGhlIHJlQ0FQVENIQSBkb2NzIGZvciBhIGNvbXByZWhlbnNpdmUgbGlzdC4gQWxsIHBhcmFtZXRlcnMgYXJlIGFjY2VwdGVkIGV4Y2VwdCBmb3JcbiAgICogdGhlIHNpdGVrZXkuIEZpcmViYXNlIEF1dGggYmFja2VuZCBwcm92aXNpb25zIGEgcmVDQVBUQ0hBIGZvciBlYWNoIHByb2plY3QgYW5kIHdpbGxcbiAgICogY29uZmlndXJlIHRoaXMgdXBvbiByZW5kZXJpbmcuIEZvciBhbiBpbnZpc2libGUgcmVDQVBUQ0hBLCBhIHNpemUga2V5IG11c3QgaGF2ZSB0aGUgdmFsdWVcbiAgICogJ2ludmlzaWJsZScuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBhdXRoRXh0ZXJuOiBBdXRoLFxuICAgIGNvbnRhaW5lck9ySWQ6IEhUTUxFbGVtZW50IHwgc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFyYW1ldGVyczogUmVjYXB0Y2hhUGFyYW1ldGVycyA9IHtcbiAgICAgIC4uLkRFRkFVTFRfUEFSQU1TXG4gICAgfVxuICApIHtcbiAgICB0aGlzLmF1dGggPSBfY2FzdEF1dGgoYXV0aEV4dGVybik7XG4gICAgdGhpcy5pc0ludmlzaWJsZSA9IHRoaXMucGFyYW1ldGVycy5zaXplID09PSAnaW52aXNpYmxlJztcbiAgICBfYXNzZXJ0KFxuICAgICAgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyxcbiAgICAgIHRoaXMuYXV0aCxcbiAgICAgIEF1dGhFcnJvckNvZGUuT1BFUkFUSU9OX05PVF9TVVBQT1JURURcbiAgICApO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9XG4gICAgICB0eXBlb2YgY29udGFpbmVyT3JJZCA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjb250YWluZXJPcklkKVxuICAgICAgICA6IGNvbnRhaW5lck9ySWQ7XG4gICAgX2Fzc2VydChjb250YWluZXIsIHRoaXMuYXV0aCwgQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUik7XG5cbiAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICB0aGlzLnBhcmFtZXRlcnMuY2FsbGJhY2sgPSB0aGlzLm1ha2VUb2tlbkNhbGxiYWNrKHRoaXMucGFyYW1ldGVycy5jYWxsYmFjayk7XG5cbiAgICB0aGlzLl9yZWNhcHRjaGFMb2FkZXIgPSB0aGlzLmF1dGguc2V0dGluZ3MuYXBwVmVyaWZpY2F0aW9uRGlzYWJsZWRGb3JUZXN0aW5nXG4gICAgICA/IG5ldyBNb2NrUmVDYXB0Y2hhTG9hZGVySW1wbCgpXG4gICAgICA6IG5ldyBSZUNhcHRjaGFMb2FkZXJJbXBsKCk7XG5cbiAgICB0aGlzLnZhbGlkYXRlU3RhcnRpbmdTdGF0ZSgpO1xuICAgIC8vIFRPRE86IEZpZ3VyZSBvdXQgaWYgc2RrIHZlcnNpb24gaXMgbmVlZGVkXG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgZm9yIHRoZSB1c2VyIHRvIHNvbHZlIHRoZSByZUNBUFRDSEEgYW5kIHJlc29sdmVzIHdpdGggdGhlIHJlQ0FQVENIQSB0b2tlbi5cbiAgICpcbiAgICogQHJldHVybnMgQSBQcm9taXNlIGZvciB0aGUgcmVDQVBUQ0hBIHRva2VuLlxuICAgKi9cbiAgYXN5bmMgdmVyaWZ5KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdGhpcy5hc3NlcnROb3REZXN0cm95ZWQoKTtcbiAgICBjb25zdCBpZCA9IGF3YWl0IHRoaXMucmVuZGVyKCk7XG4gICAgY29uc3QgcmVjYXB0Y2hhID0gdGhpcy5nZXRBc3NlcnRlZFJlY2FwdGNoYSgpO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSByZWNhcHRjaGEuZ2V0UmVzcG9uc2UoaWQpO1xuICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxzdHJpbmc+KHJlc29sdmUgPT4ge1xuICAgICAgY29uc3QgdG9rZW5DaGFuZ2UgPSAodG9rZW46IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgICAgcmV0dXJuOyAvLyBJZ25vcmUgdG9rZW4gZXhwaXJhdGlvbnMuXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50b2tlbkNoYW5nZUxpc3RlbmVycy5kZWxldGUodG9rZW5DaGFuZ2UpO1xuICAgICAgICByZXNvbHZlKHRva2VuKTtcbiAgICAgIH07XG5cbiAgICAgIHRoaXMudG9rZW5DaGFuZ2VMaXN0ZW5lcnMuYWRkKHRva2VuQ2hhbmdlKTtcbiAgICAgIGlmICh0aGlzLmlzSW52aXNpYmxlKSB7XG4gICAgICAgIHJlY2FwdGNoYS5leGVjdXRlKGlkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSByZUNBUFRDSEEgd2lkZ2V0IG9uIHRoZSBwYWdlLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSByZUNBUFRDSEEgd2lkZ2V0IElELlxuICAgKi9cbiAgcmVuZGVyKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuYXNzZXJ0Tm90RGVzdHJveWVkKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gVGhpcyBtZXRob2QgcmV0dXJucyBhIHByb21pc2UuIFNpbmNlIGl0J3Mgbm90IGFzeW5jICh3ZSB3YW50IHRvIHJldHVybiB0aGVcbiAgICAgIC8vIF9zYW1lXyBwcm9taXNlIGlmIHJlbmRlcmluZyBpcyBzdGlsbCBvY2N1cnJpbmcpLCB0aGUgQVBJIHN1cmZhY2Ugc2hvdWxkXG4gICAgICAvLyByZWplY3Qgd2l0aCB0aGUgZXJyb3IgcmF0aGVyIHRoYW4ganVzdCB0aHJvd1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJlbmRlclByb21pc2UpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlclByb21pc2U7XG4gICAgfVxuXG4gICAgdGhpcy5yZW5kZXJQcm9taXNlID0gdGhpcy5tYWtlUmVuZGVyUHJvbWlzZSgpLmNhdGNoKGUgPT4ge1xuICAgICAgdGhpcy5yZW5kZXJQcm9taXNlID0gbnVsbDtcbiAgICAgIHRocm93IGU7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5yZW5kZXJQcm9taXNlO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5hc3NlcnROb3REZXN0cm95ZWQoKTtcbiAgICBpZiAodGhpcy53aWRnZXRJZCAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5nZXRBc3NlcnRlZFJlY2FwdGNoYSgpLnJlc2V0KHRoaXMud2lkZ2V0SWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIHJlQ0FQVENIQSB3aWRnZXQgZnJvbSB0aGUgcGFnZSBhbmQgZGVzdHJveXMgdGhlIGluc3RhbmNlLlxuICAgKi9cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5hc3NlcnROb3REZXN0cm95ZWQoKTtcbiAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XG4gICAgdGhpcy5fcmVjYXB0Y2hhTG9hZGVyLmNsZWFyZWRPbmVJbnN0YW5jZSgpO1xuICAgIGlmICghdGhpcy5pc0ludmlzaWJsZSkge1xuICAgICAgdGhpcy5jb250YWluZXIuY2hpbGROb2Rlcy5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVDaGlsZChub2RlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVTdGFydGluZ1N0YXRlKCk6IHZvaWQge1xuICAgIF9hc3NlcnQoIXRoaXMucGFyYW1ldGVycy5zaXRla2V5LCB0aGlzLmF1dGgsIEF1dGhFcnJvckNvZGUuQVJHVU1FTlRfRVJST1IpO1xuICAgIF9hc3NlcnQoXG4gICAgICB0aGlzLmlzSW52aXNpYmxlIHx8ICF0aGlzLmNvbnRhaW5lci5oYXNDaGlsZE5vZGVzKCksXG4gICAgICB0aGlzLmF1dGgsXG4gICAgICBBdXRoRXJyb3JDb2RlLkFSR1VNRU5UX0VSUk9SXG4gICAgKTtcbiAgICBfYXNzZXJ0KFxuICAgICAgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyxcbiAgICAgIHRoaXMuYXV0aCxcbiAgICAgIEF1dGhFcnJvckNvZGUuT1BFUkFUSU9OX05PVF9TVVBQT1JURURcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBtYWtlVG9rZW5DYWxsYmFjayhcbiAgICBleGlzdGluZzogVG9rZW5DYWxsYmFjayB8IHN0cmluZyB8IHVuZGVmaW5lZFxuICApOiBUb2tlbkNhbGxiYWNrIHtcbiAgICByZXR1cm4gdG9rZW4gPT4ge1xuICAgICAgdGhpcy50b2tlbkNoYW5nZUxpc3RlbmVycy5mb3JFYWNoKGxpc3RlbmVyID0+IGxpc3RlbmVyKHRva2VuKSk7XG4gICAgICBpZiAodHlwZW9mIGV4aXN0aW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGV4aXN0aW5nKHRva2VuKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4aXN0aW5nID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCBnbG9iYWxGdW5jID0gX3dpbmRvdygpW2V4aXN0aW5nXTtcbiAgICAgICAgaWYgKHR5cGVvZiBnbG9iYWxGdW5jID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZ2xvYmFsRnVuYyh0b2tlbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3NlcnROb3REZXN0cm95ZWQoKTogdm9pZCB7XG4gICAgX2Fzc2VydCghdGhpcy5kZXN0cm95ZWQsIHRoaXMuYXV0aCwgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIG1ha2VSZW5kZXJQcm9taXNlKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgaWYgKCF0aGlzLndpZGdldElkKSB7XG4gICAgICBsZXQgY29udGFpbmVyID0gdGhpcy5jb250YWluZXI7XG4gICAgICBpZiAoIXRoaXMuaXNJbnZpc2libGUpIHtcbiAgICAgICAgY29uc3QgZ3VhcmFudGVlZEVtcHR5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChndWFyYW50ZWVkRW1wdHkpO1xuICAgICAgICBjb250YWluZXIgPSBndWFyYW50ZWVkRW1wdHk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMud2lkZ2V0SWQgPSB0aGlzLmdldEFzc2VydGVkUmVjYXB0Y2hhKCkucmVuZGVyKFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIHRoaXMucGFyYW1ldGVyc1xuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy53aWRnZXRJZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBfYXNzZXJ0KFxuICAgICAgX2lzSHR0cE9ySHR0cHMoKSAmJiAhX2lzV29ya2VyKCksXG4gICAgICB0aGlzLmF1dGgsXG4gICAgICBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SXG4gICAgKTtcblxuICAgIGF3YWl0IGRvbVJlYWR5KCk7XG4gICAgdGhpcy5yZWNhcHRjaGEgPSBhd2FpdCB0aGlzLl9yZWNhcHRjaGFMb2FkZXIubG9hZChcbiAgICAgIHRoaXMuYXV0aCxcbiAgICAgIHRoaXMuYXV0aC5sYW5ndWFnZUNvZGUgfHwgdW5kZWZpbmVkXG4gICAgKTtcblxuICAgIGNvbnN0IHNpdGVLZXkgPSBhd2FpdCBnZXRSZWNhcHRjaGFQYXJhbXModGhpcy5hdXRoKTtcbiAgICBfYXNzZXJ0KHNpdGVLZXksIHRoaXMuYXV0aCwgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG4gICAgdGhpcy5wYXJhbWV0ZXJzLnNpdGVrZXkgPSBzaXRlS2V5O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBc3NlcnRlZFJlY2FwdGNoYSgpOiBSZWNhcHRjaGEge1xuICAgIF9hc3NlcnQodGhpcy5yZWNhcHRjaGEsIHRoaXMuYXV0aCwgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG4gICAgcmV0dXJuIHRoaXMucmVjYXB0Y2hhO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRvbVJlYWR5KCk6IFByb21pc2U8dm9pZD4ge1xuICBsZXQgcmVzb2x2ZXI6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4ocmVzb2x2ZSA9PiB7XG4gICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBEb2N1bWVudCBub3QgcmVhZHksIHdhaXQgZm9yIGxvYWQgYmVmb3JlIHJlc29sdmluZy5cbiAgICAvLyBTYXZlIHJlc29sdmVyLCBzbyB3ZSBjYW4gcmVtb3ZlIGxpc3RlbmVyIGluIGNhc2UgaXQgd2FzIGV4dGVybmFsbHlcbiAgICAvLyBjYW5jZWxsZWQuXG4gICAgcmVzb2x2ZXIgPSAoKSA9PiByZXNvbHZlKCk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCByZXNvbHZlcik7XG4gIH0pLmNhdGNoKGUgPT4ge1xuICAgIGlmIChyZXNvbHZlcikge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWQnLCByZXNvbHZlcik7XG4gICAgfVxuXG4gICAgdGhyb3cgZTtcbiAgfSk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgQXBwbGljYXRpb25WZXJpZmllcixcbiAgQXV0aCxcbiAgQ29uZmlybWF0aW9uUmVzdWx0LFxuICBQaG9uZUluZm9PcHRpb25zLFxuICBVc2VyLFxuICBVc2VyQ3JlZGVudGlhbFxufSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuXG5pbXBvcnQgeyBzdGFydEVucm9sbFBob25lTWZhIH0gZnJvbSAnLi4vLi4vYXBpL2FjY291bnRfbWFuYWdlbWVudC9tZmEnO1xuaW1wb3J0IHsgc3RhcnRTaWduSW5QaG9uZU1mYSB9IGZyb20gJy4uLy4uL2FwaS9hdXRoZW50aWNhdGlvbi9tZmEnO1xuaW1wb3J0IHsgc2VuZFBob25lVmVyaWZpY2F0aW9uQ29kZSB9IGZyb20gJy4uLy4uL2FwaS9hdXRoZW50aWNhdGlvbi9zbXMnO1xuaW1wb3J0IHsgQXBwbGljYXRpb25WZXJpZmllckludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXBwbGljYXRpb25fdmVyaWZpZXInO1xuaW1wb3J0IHsgUGhvbmVBdXRoQ3JlZGVudGlhbCB9IGZyb20gJy4uLy4uL2NvcmUvY3JlZGVudGlhbHMvcGhvbmUnO1xuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSB9IGZyb20gJy4uLy4uL2NvcmUvZXJyb3JzJztcbmltcG9ydCB7IF9hc3NlcnRMaW5rZWRTdGF0dXMsIF9saW5rIH0gZnJvbSAnLi4vLi4vY29yZS91c2VyL2xpbmtfdW5saW5rJztcbmltcG9ydCB7IF9hc3NlcnQgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWwvYXNzZXJ0JztcbmltcG9ydCB7IEF1dGhJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL2F1dGgnO1xuaW1wb3J0IHtcbiAgbGlua1dpdGhDcmVkZW50aWFsLFxuICByZWF1dGhlbnRpY2F0ZVdpdGhDcmVkZW50aWFsLFxuICBzaWduSW5XaXRoQ3JlZGVudGlhbFxufSBmcm9tICcuLi8uLi9jb3JlL3N0cmF0ZWdpZXMvY3JlZGVudGlhbCc7XG5pbXBvcnQge1xuICBNdWx0aUZhY3RvclNlc3Npb25JbXBsLFxuICBNdWx0aUZhY3RvclNlc3Npb25UeXBlXG59IGZyb20gJy4uLy4uL21mYS9tZmFfc2Vzc2lvbic7XG5pbXBvcnQgeyBVc2VySW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC91c2VyJztcbmltcG9ydCB7IFJFQ0FQVENIQV9WRVJJRklFUl9UWVBFIH0gZnJvbSAnLi4vcmVjYXB0Y2hhL3JlY2FwdGNoYV92ZXJpZmllcic7XG5pbXBvcnQgeyBfY2FzdEF1dGggfSBmcm9tICcuLi8uLi9jb3JlL2F1dGgvYXV0aF9pbXBsJztcbmltcG9ydCB7IGdldE1vZHVsYXJJbnN0YW5jZSB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcbmltcG9ydCB7IFByb3ZpZGVySWQgfSBmcm9tICcuLi8uLi9tb2RlbC9lbnVtcyc7XG5cbmludGVyZmFjZSBPbkNvbmZpcm1hdGlvbkNhbGxiYWNrIHtcbiAgKGNyZWRlbnRpYWw6IFBob25lQXV0aENyZWRlbnRpYWwpOiBQcm9taXNlPFVzZXJDcmVkZW50aWFsPjtcbn1cblxuY2xhc3MgQ29uZmlybWF0aW9uUmVzdWx0SW1wbCBpbXBsZW1lbnRzIENvbmZpcm1hdGlvblJlc3VsdCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IHZlcmlmaWNhdGlvbklkOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBvbkNvbmZpcm1hdGlvbjogT25Db25maXJtYXRpb25DYWxsYmFja1xuICApIHt9XG5cbiAgY29uZmlybSh2ZXJpZmljYXRpb25Db2RlOiBzdHJpbmcpOiBQcm9taXNlPFVzZXJDcmVkZW50aWFsPiB7XG4gICAgY29uc3QgYXV0aENyZWRlbnRpYWwgPSBQaG9uZUF1dGhDcmVkZW50aWFsLl9mcm9tVmVyaWZpY2F0aW9uKFxuICAgICAgdGhpcy52ZXJpZmljYXRpb25JZCxcbiAgICAgIHZlcmlmaWNhdGlvbkNvZGVcbiAgICApO1xuICAgIHJldHVybiB0aGlzLm9uQ29uZmlybWF0aW9uKGF1dGhDcmVkZW50aWFsKTtcbiAgfVxufVxuXG4vKipcbiAqIEFzeW5jaHJvbm91c2x5IHNpZ25zIGluIHVzaW5nIGEgcGhvbmUgbnVtYmVyLlxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGlzIG1ldGhvZCBzZW5kcyBhIGNvZGUgdmlhIFNNUyB0byB0aGUgZ2l2ZW5cbiAqIHBob25lIG51bWJlciwgYW5kIHJldHVybnMgYSB7QGxpbmsgQ29uZmlybWF0aW9uUmVzdWx0fS4gQWZ0ZXIgdGhlIHVzZXJcbiAqIHByb3ZpZGVzIHRoZSBjb2RlIHNlbnQgdG8gdGhlaXIgcGhvbmUsIGNhbGwge0BsaW5rIENvbmZpcm1hdGlvblJlc3VsdC5jb25maXJtfVxuICogd2l0aCB0aGUgY29kZSB0byBzaWduIHRoZSB1c2VyIGluLlxuICpcbiAqIEZvciBhYnVzZSBwcmV2ZW50aW9uLCB0aGlzIG1ldGhvZCBhbHNvIHJlcXVpcmVzIGEge0BsaW5rIEFwcGxpY2F0aW9uVmVyaWZpZXJ9LlxuICogVGhpcyBTREsgaW5jbHVkZXMgYSByZUNBUFRDSEEtYmFzZWQgaW1wbGVtZW50YXRpb24sIHtAbGluayBSZWNhcHRjaGFWZXJpZmllcn0uXG4gKiBUaGlzIGZ1bmN0aW9uIGNhbiB3b3JrIG9uIG90aGVyIHBsYXRmb3JtcyB0aGF0IGRvIG5vdCBzdXBwb3J0IHRoZVxuICoge0BsaW5rIFJlY2FwdGNoYVZlcmlmaWVyfSAobGlrZSBSZWFjdCBOYXRpdmUpLCBidXQgeW91IG5lZWQgdG8gdXNlIGFcbiAqIHRoaXJkLXBhcnR5IHtAbGluayBBcHBsaWNhdGlvblZlcmlmaWVyfSBpbXBsZW1lbnRhdGlvbi5cbiAqXG4gKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCB3b3JrIGluIGEgTm9kZS5qcyBlbnZpcm9ubWVudC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgamF2YXNjcmlwdFxuICogLy8gJ3JlY2FwdGNoYS1jb250YWluZXInIGlzIHRoZSBJRCBvZiBhbiBlbGVtZW50IGluIHRoZSBET00uXG4gKiBjb25zdCBhcHBsaWNhdGlvblZlcmlmaWVyID0gbmV3IGZpcmViYXNlLmF1dGguUmVjYXB0Y2hhVmVyaWZpZXIoJ3JlY2FwdGNoYS1jb250YWluZXInKTtcbiAqIGNvbnN0IGNvbmZpcm1hdGlvblJlc3VsdCA9IGF3YWl0IHNpZ25JbldpdGhQaG9uZU51bWJlcihhdXRoLCBwaG9uZU51bWJlciwgYXBwbGljYXRpb25WZXJpZmllcik7XG4gKiAvLyBPYnRhaW4gYSB2ZXJpZmljYXRpb25Db2RlIGZyb20gdGhlIHVzZXIuXG4gKiBjb25zdCBjcmVkZW50aWFsID0gYXdhaXQgY29uZmlybWF0aW9uUmVzdWx0LmNvbmZpcm0odmVyaWZpY2F0aW9uQ29kZSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGhvbmVOdW1iZXIgLSBUaGUgdXNlcidzIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQgKGUuZy4gKzE2NTA1NTUwMTAxKS5cbiAqIEBwYXJhbSBhcHBWZXJpZmllciAtIFRoZSB7QGxpbmsgQXBwbGljYXRpb25WZXJpZmllcn0uXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2lnbkluV2l0aFBob25lTnVtYmVyKFxuICBhdXRoOiBBdXRoLFxuICBwaG9uZU51bWJlcjogc3RyaW5nLFxuICBhcHBWZXJpZmllcjogQXBwbGljYXRpb25WZXJpZmllclxuKTogUHJvbWlzZTxDb25maXJtYXRpb25SZXN1bHQ+IHtcbiAgY29uc3QgYXV0aEludGVybmFsID0gX2Nhc3RBdXRoKGF1dGgpO1xuICBjb25zdCB2ZXJpZmljYXRpb25JZCA9IGF3YWl0IF92ZXJpZnlQaG9uZU51bWJlcihcbiAgICBhdXRoSW50ZXJuYWwsXG4gICAgcGhvbmVOdW1iZXIsXG4gICAgZ2V0TW9kdWxhckluc3RhbmNlKGFwcFZlcmlmaWVyIGFzIEFwcGxpY2F0aW9uVmVyaWZpZXJJbnRlcm5hbClcbiAgKTtcbiAgcmV0dXJuIG5ldyBDb25maXJtYXRpb25SZXN1bHRJbXBsKHZlcmlmaWNhdGlvbklkLCBjcmVkID0+XG4gICAgc2lnbkluV2l0aENyZWRlbnRpYWwoYXV0aEludGVybmFsLCBjcmVkKVxuICApO1xufVxuXG4vKipcbiAqIExpbmtzIHRoZSB1c2VyIGFjY291bnQgd2l0aCB0aGUgZ2l2ZW4gcGhvbmUgbnVtYmVyLlxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCB3b3JrIGluIGEgTm9kZS5qcyBlbnZpcm9ubWVudC5cbiAqXG4gKiBAcGFyYW0gdXNlciAtIFRoZSB1c2VyLlxuICogQHBhcmFtIHBob25lTnVtYmVyIC0gVGhlIHVzZXIncyBwaG9uZSBudW1iZXIgaW4gRS4xNjQgZm9ybWF0IChlLmcuICsxNjUwNTU1MDEwMSkuXG4gKiBAcGFyYW0gYXBwVmVyaWZpZXIgLSBUaGUge0BsaW5rIEFwcGxpY2F0aW9uVmVyaWZpZXJ9LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpbmtXaXRoUGhvbmVOdW1iZXIoXG4gIHVzZXI6IFVzZXIsXG4gIHBob25lTnVtYmVyOiBzdHJpbmcsXG4gIGFwcFZlcmlmaWVyOiBBcHBsaWNhdGlvblZlcmlmaWVyXG4pOiBQcm9taXNlPENvbmZpcm1hdGlvblJlc3VsdD4ge1xuICBjb25zdCB1c2VySW50ZXJuYWwgPSBnZXRNb2R1bGFySW5zdGFuY2UodXNlcikgYXMgVXNlckludGVybmFsO1xuICBhd2FpdCBfYXNzZXJ0TGlua2VkU3RhdHVzKGZhbHNlLCB1c2VySW50ZXJuYWwsIFByb3ZpZGVySWQuUEhPTkUpO1xuICBjb25zdCB2ZXJpZmljYXRpb25JZCA9IGF3YWl0IF92ZXJpZnlQaG9uZU51bWJlcihcbiAgICB1c2VySW50ZXJuYWwuYXV0aCxcbiAgICBwaG9uZU51bWJlcixcbiAgICBnZXRNb2R1bGFySW5zdGFuY2UoYXBwVmVyaWZpZXIgYXMgQXBwbGljYXRpb25WZXJpZmllckludGVybmFsKVxuICApO1xuICByZXR1cm4gbmV3IENvbmZpcm1hdGlvblJlc3VsdEltcGwodmVyaWZpY2F0aW9uSWQsIGNyZWQgPT5cbiAgICBsaW5rV2l0aENyZWRlbnRpYWwodXNlckludGVybmFsLCBjcmVkKVxuICApO1xufVxuXG4vKipcbiAqIFJlLWF1dGhlbnRpY2F0ZXMgYSB1c2VyIHVzaW5nIGEgZnJlc2ggcGhvbmUgY3JlZGVudGlhbC5cbiAqXG4gKiBAcmVtYXJrc1xuICogVXNlIGJlZm9yZSBvcGVyYXRpb25zIHN1Y2ggYXMge0BsaW5rIHVwZGF0ZVBhc3N3b3JkfSB0aGF0IHJlcXVpcmUgdG9rZW5zIGZyb20gcmVjZW50IHNpZ24taW4gYXR0ZW1wdHMuXG4gKlxuICogVGhpcyBtZXRob2QgZG9lcyBub3Qgd29yayBpbiBhIE5vZGUuanMgZW52aXJvbm1lbnQuXG4gKlxuICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlci5cbiAqIEBwYXJhbSBwaG9uZU51bWJlciAtIFRoZSB1c2VyJ3MgcGhvbmUgbnVtYmVyIGluIEUuMTY0IGZvcm1hdCAoZS5nLiArMTY1MDU1NTAxMDEpLlxuICogQHBhcmFtIGFwcFZlcmlmaWVyIC0gVGhlIHtAbGluayBBcHBsaWNhdGlvblZlcmlmaWVyfS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWF1dGhlbnRpY2F0ZVdpdGhQaG9uZU51bWJlcihcbiAgdXNlcjogVXNlcixcbiAgcGhvbmVOdW1iZXI6IHN0cmluZyxcbiAgYXBwVmVyaWZpZXI6IEFwcGxpY2F0aW9uVmVyaWZpZXJcbik6IFByb21pc2U8Q29uZmlybWF0aW9uUmVzdWx0PiB7XG4gIGNvbnN0IHVzZXJJbnRlcm5hbCA9IGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyKSBhcyBVc2VySW50ZXJuYWw7XG4gIGNvbnN0IHZlcmlmaWNhdGlvbklkID0gYXdhaXQgX3ZlcmlmeVBob25lTnVtYmVyKFxuICAgIHVzZXJJbnRlcm5hbC5hdXRoLFxuICAgIHBob25lTnVtYmVyLFxuICAgIGdldE1vZHVsYXJJbnN0YW5jZShhcHBWZXJpZmllciBhcyBBcHBsaWNhdGlvblZlcmlmaWVySW50ZXJuYWwpXG4gICk7XG4gIHJldHVybiBuZXcgQ29uZmlybWF0aW9uUmVzdWx0SW1wbCh2ZXJpZmljYXRpb25JZCwgY3JlZCA9PlxuICAgIHJlYXV0aGVudGljYXRlV2l0aENyZWRlbnRpYWwodXNlckludGVybmFsLCBjcmVkKVxuICApO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSB2ZXJpZmljYXRpb24gSUQgdG8gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBTTVMgY29kZSB0aGF0IGlzIHNlbnQuXG4gKlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gX3ZlcmlmeVBob25lTnVtYmVyKFxuICBhdXRoOiBBdXRoSW50ZXJuYWwsXG4gIG9wdGlvbnM6IFBob25lSW5mb09wdGlvbnMgfCBzdHJpbmcsXG4gIHZlcmlmaWVyOiBBcHBsaWNhdGlvblZlcmlmaWVySW50ZXJuYWxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHJlY2FwdGNoYVRva2VuID0gYXdhaXQgdmVyaWZpZXIudmVyaWZ5KCk7XG5cbiAgdHJ5IHtcbiAgICBfYXNzZXJ0KFxuICAgICAgdHlwZW9mIHJlY2FwdGNoYVRva2VuID09PSAnc3RyaW5nJyxcbiAgICAgIGF1dGgsXG4gICAgICBBdXRoRXJyb3JDb2RlLkFSR1VNRU5UX0VSUk9SXG4gICAgKTtcbiAgICBfYXNzZXJ0KFxuICAgICAgdmVyaWZpZXIudHlwZSA9PT0gUkVDQVBUQ0hBX1ZFUklGSUVSX1RZUEUsXG4gICAgICBhdXRoLFxuICAgICAgQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUlxuICAgICk7XG5cbiAgICBsZXQgcGhvbmVJbmZvT3B0aW9uczogUGhvbmVJbmZvT3B0aW9ucztcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHBob25lSW5mb09wdGlvbnMgPSB7XG4gICAgICAgIHBob25lTnVtYmVyOiBvcHRpb25zXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBwaG9uZUluZm9PcHRpb25zID0gb3B0aW9ucztcbiAgICB9XG5cbiAgICBpZiAoJ3Nlc3Npb24nIGluIHBob25lSW5mb09wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHNlc3Npb24gPSBwaG9uZUluZm9PcHRpb25zLnNlc3Npb24gYXMgTXVsdGlGYWN0b3JTZXNzaW9uSW1wbDtcblxuICAgICAgaWYgKCdwaG9uZU51bWJlcicgaW4gcGhvbmVJbmZvT3B0aW9ucykge1xuICAgICAgICBfYXNzZXJ0KFxuICAgICAgICAgIHNlc3Npb24udHlwZSA9PT0gTXVsdGlGYWN0b3JTZXNzaW9uVHlwZS5FTlJPTEwsXG4gICAgICAgICAgYXV0aCxcbiAgICAgICAgICBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc3RhcnRFbnJvbGxQaG9uZU1mYShhdXRoLCB7XG4gICAgICAgICAgaWRUb2tlbjogc2Vzc2lvbi5jcmVkZW50aWFsLFxuICAgICAgICAgIHBob25lRW5yb2xsbWVudEluZm86IHtcbiAgICAgICAgICAgIHBob25lTnVtYmVyOiBwaG9uZUluZm9PcHRpb25zLnBob25lTnVtYmVyLFxuICAgICAgICAgICAgcmVjYXB0Y2hhVG9rZW5cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzcG9uc2UucGhvbmVTZXNzaW9uSW5mby5zZXNzaW9uSW5mbztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF9hc3NlcnQoXG4gICAgICAgICAgc2Vzc2lvbi50eXBlID09PSBNdWx0aUZhY3RvclNlc3Npb25UeXBlLlNJR05fSU4sXG4gICAgICAgICAgYXV0aCxcbiAgICAgICAgICBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IG1mYUVucm9sbG1lbnRJZCA9XG4gICAgICAgICAgcGhvbmVJbmZvT3B0aW9ucy5tdWx0aUZhY3RvckhpbnQ/LnVpZCB8fFxuICAgICAgICAgIHBob25lSW5mb09wdGlvbnMubXVsdGlGYWN0b3JVaWQ7XG4gICAgICAgIF9hc3NlcnQobWZhRW5yb2xsbWVudElkLCBhdXRoLCBBdXRoRXJyb3JDb2RlLk1JU1NJTkdfTUZBX0lORk8pO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHN0YXJ0U2lnbkluUGhvbmVNZmEoYXV0aCwge1xuICAgICAgICAgIG1mYVBlbmRpbmdDcmVkZW50aWFsOiBzZXNzaW9uLmNyZWRlbnRpYWwsXG4gICAgICAgICAgbWZhRW5yb2xsbWVudElkLFxuICAgICAgICAgIHBob25lU2lnbkluSW5mbzoge1xuICAgICAgICAgICAgcmVjYXB0Y2hhVG9rZW5cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzcG9uc2UucGhvbmVSZXNwb25zZUluZm8uc2Vzc2lvbkluZm87XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHsgc2Vzc2lvbkluZm8gfSA9IGF3YWl0IHNlbmRQaG9uZVZlcmlmaWNhdGlvbkNvZGUoYXV0aCwge1xuICAgICAgICBwaG9uZU51bWJlcjogcGhvbmVJbmZvT3B0aW9ucy5waG9uZU51bWJlcixcbiAgICAgICAgcmVjYXB0Y2hhVG9rZW5cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHNlc3Npb25JbmZvO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICB2ZXJpZmllci5fcmVzZXQoKTtcbiAgfVxufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIHVzZXIncyBwaG9uZSBudW1iZXIuXG4gKlxuICogQHJlbWFya3NcbiAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHdvcmsgaW4gYSBOb2RlLmpzIGVudmlyb25tZW50LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBcbiAqIC8vICdyZWNhcHRjaGEtY29udGFpbmVyJyBpcyB0aGUgSUQgb2YgYW4gZWxlbWVudCBpbiB0aGUgRE9NLlxuICogY29uc3QgYXBwbGljYXRpb25WZXJpZmllciA9IG5ldyBSZWNhcHRjaGFWZXJpZmllcigncmVjYXB0Y2hhLWNvbnRhaW5lcicpO1xuICogY29uc3QgcHJvdmlkZXIgPSBuZXcgUGhvbmVBdXRoUHJvdmlkZXIoYXV0aCk7XG4gKiBjb25zdCB2ZXJpZmljYXRpb25JZCA9IGF3YWl0IHByb3ZpZGVyLnZlcmlmeVBob25lTnVtYmVyKCcrMTY1MDU1NTAxMDEnLCBhcHBsaWNhdGlvblZlcmlmaWVyKTtcbiAqIC8vIE9idGFpbiB0aGUgdmVyaWZpY2F0aW9uQ29kZSBmcm9tIHRoZSB1c2VyLlxuICogY29uc3QgcGhvbmVDcmVkZW50aWFsID0gUGhvbmVBdXRoUHJvdmlkZXIuY3JlZGVudGlhbCh2ZXJpZmljYXRpb25JZCwgdmVyaWZpY2F0aW9uQ29kZSk7XG4gKiBhd2FpdCB1cGRhdGVQaG9uZU51bWJlcih1c2VyLCBwaG9uZUNyZWRlbnRpYWwpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlci5cbiAqIEBwYXJhbSBjcmVkZW50aWFsIC0gQSBjcmVkZW50aWFsIGF1dGhlbnRpY2F0aW5nIHRoZSBuZXcgcGhvbmUgbnVtYmVyLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVBob25lTnVtYmVyKFxuICB1c2VyOiBVc2VyLFxuICBjcmVkZW50aWFsOiBQaG9uZUF1dGhDcmVkZW50aWFsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgX2xpbmsoZ2V0TW9kdWxhckluc3RhbmNlKHVzZXIpIGFzIFVzZXJJbnRlcm5hbCwgY3JlZGVudGlhbCk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgQXV0aCxcbiAgUGhvbmVJbmZvT3B0aW9ucyxcbiAgQXBwbGljYXRpb25WZXJpZmllcixcbiAgVXNlckNyZWRlbnRpYWxcbn0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcblxuaW1wb3J0IHsgU2lnbkluV2l0aFBob25lTnVtYmVyUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9hcGkvYXV0aGVudGljYXRpb24vc21zJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uVmVyaWZpZXJJbnRlcm5hbCBhcyBBcHBsaWNhdGlvblZlcmlmaWVySW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9hcHBsaWNhdGlvbl92ZXJpZmllcic7XG5pbXBvcnQgeyBBdXRoSW50ZXJuYWwgYXMgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXV0aCc7XG5pbXBvcnQgeyBVc2VyQ3JlZGVudGlhbEludGVybmFsIGFzIFVzZXJDcmVkZW50aWFsSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC91c2VyJztcbmltcG9ydCB7IFBob25lQXV0aENyZWRlbnRpYWwgfSBmcm9tICcuLi8uLi9jb3JlL2NyZWRlbnRpYWxzL3Bob25lJztcbmltcG9ydCB7IF92ZXJpZnlQaG9uZU51bWJlciB9IGZyb20gJy4uL3N0cmF0ZWdpZXMvcGhvbmUnO1xuaW1wb3J0IHsgX2Nhc3RBdXRoIH0gZnJvbSAnLi4vLi4vY29yZS9hdXRoL2F1dGhfaW1wbCc7XG5pbXBvcnQgeyBBdXRoQ3JlZGVudGlhbCB9IGZyb20gJy4uLy4uL2NvcmUnO1xuaW1wb3J0IHsgRmlyZWJhc2VFcnJvciwgZ2V0TW9kdWxhckluc3RhbmNlIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuaW1wb3J0IHsgVGFnZ2VkV2l0aFRva2VuUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9tb2RlbC9pZF90b2tlbic7XG5pbXBvcnQgeyBQcm92aWRlcklkLCBTaWduSW5NZXRob2QgfSBmcm9tICcuLi8uLi9tb2RlbC9lbnVtcyc7XG5cbi8qKlxuICogUHJvdmlkZXIgZm9yIGdlbmVyYXRpbmcgYW4ge0BsaW5rIFBob25lQXV0aENyZWRlbnRpYWx9LlxuICpcbiAqIEByZW1hcmtzXG4gKiBgUGhvbmVBdXRoUHJvdmlkZXJgIGRvZXMgbm90IHdvcmsgaW4gYSBOb2RlLmpzIGVudmlyb25tZW50LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiAvLyAncmVjYXB0Y2hhLWNvbnRhaW5lcicgaXMgdGhlIElEIG9mIGFuIGVsZW1lbnQgaW4gdGhlIERPTS5cbiAqIGNvbnN0IGFwcGxpY2F0aW9uVmVyaWZpZXIgPSBuZXcgUmVjYXB0Y2hhVmVyaWZpZXIoJ3JlY2FwdGNoYS1jb250YWluZXInKTtcbiAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IFBob25lQXV0aFByb3ZpZGVyKGF1dGgpO1xuICogY29uc3QgdmVyaWZpY2F0aW9uSWQgPSBhd2FpdCBwcm92aWRlci52ZXJpZnlQaG9uZU51bWJlcignKzE2NTA1NTUwMTAxJywgYXBwbGljYXRpb25WZXJpZmllcik7XG4gKiAvLyBPYnRhaW4gdGhlIHZlcmlmaWNhdGlvbkNvZGUgZnJvbSB0aGUgdXNlci5cbiAqIGNvbnN0IHBob25lQ3JlZGVudGlhbCA9IFBob25lQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWwodmVyaWZpY2F0aW9uSWQsIHZlcmlmaWNhdGlvbkNvZGUpO1xuICogY29uc3QgdXNlckNyZWRlbnRpYWwgPSBhd2FpdCBzaWduSW5XaXRoQ3JlZGVudGlhbChhdXRoLCBwaG9uZUNyZWRlbnRpYWwpO1xuICogYGBgXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgUGhvbmVBdXRoUHJvdmlkZXIge1xuICAvKiogQWx3YXlzIHNldCB0byB7QGxpbmsgUHJvdmlkZXJJZH0uUEhPTkUuICovXG4gIHN0YXRpYyByZWFkb25seSBQUk9WSURFUl9JRDogJ3Bob25lJyA9IFByb3ZpZGVySWQuUEhPTkU7XG4gIC8qKiBBbHdheXMgc2V0IHRvIHtAbGluayBTaWduSW5NZXRob2R9LlBIT05FLiAqL1xuICBzdGF0aWMgcmVhZG9ubHkgUEhPTkVfU0lHTl9JTl9NRVRIT0Q6ICdwaG9uZScgPSBTaWduSW5NZXRob2QuUEhPTkU7XG5cbiAgLyoqIEFsd2F5cyBzZXQgdG8ge0BsaW5rIFByb3ZpZGVySWR9LlBIT05FLiAqL1xuICByZWFkb25seSBwcm92aWRlcklkID0gUGhvbmVBdXRoUHJvdmlkZXIuUFJPVklERVJfSUQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXV0aDogQXV0aEludGVybmFsO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gYXV0aCAtIFRoZSBGaXJlYmFzZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UgaW4gd2hpY2ggc2lnbi1pbnMgc2hvdWxkIG9jY3VyLlxuICAgKlxuICAgKi9cbiAgY29uc3RydWN0b3IoYXV0aDogQXV0aCkge1xuICAgIHRoaXMuYXV0aCA9IF9jYXN0QXV0aChhdXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBTdGFydHMgYSBwaG9uZSBudW1iZXIgYXV0aGVudGljYXRpb24gZmxvdyBieSBzZW5kaW5nIGEgdmVyaWZpY2F0aW9uIGNvZGUgdG8gdGhlIGdpdmVuIHBob25lXG4gICAqIG51bWJlci5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgamF2YXNjcmlwdFxuICAgKiBjb25zdCBwcm92aWRlciA9IG5ldyBQaG9uZUF1dGhQcm92aWRlcihhdXRoKTtcbiAgICogY29uc3QgdmVyaWZpY2F0aW9uSWQgPSBhd2FpdCBwcm92aWRlci52ZXJpZnlQaG9uZU51bWJlcihwaG9uZU51bWJlciwgYXBwbGljYXRpb25WZXJpZmllcik7XG4gICAqIC8vIE9idGFpbiB2ZXJpZmljYXRpb25Db2RlIGZyb20gdGhlIHVzZXIuXG4gICAqIGNvbnN0IGF1dGhDcmVkZW50aWFsID0gUGhvbmVBdXRoUHJvdmlkZXIuY3JlZGVudGlhbCh2ZXJpZmljYXRpb25JZCwgdmVyaWZpY2F0aW9uQ29kZSk7XG4gICAqIGNvbnN0IHVzZXJDcmVkZW50aWFsID0gYXdhaXQgc2lnbkluV2l0aENyZWRlbnRpYWwoYXV0aCwgYXV0aENyZWRlbnRpYWwpO1xuICAgKiBgYGBcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogQW4gYWx0ZXJuYXRpdmUgZmxvdyBpcyBwcm92aWRlZCB1c2luZyB0aGUgYHNpZ25JbldpdGhQaG9uZU51bWJlcmAgbWV0aG9kLlxuICAgKiBgYGBqYXZhc2NyaXB0XG4gICAqIGNvbnN0IGNvbmZpcm1hdGlvblJlc3VsdCA9IHNpZ25JbldpdGhQaG9uZU51bWJlcihhdXRoLCBwaG9uZU51bWJlciwgYXBwbGljYXRpb25WZXJpZmllcik7XG4gICAqIC8vIE9idGFpbiB2ZXJpZmljYXRpb25Db2RlIGZyb20gdGhlIHVzZXIuXG4gICAqIGNvbnN0IHVzZXJDcmVkZW50aWFsID0gY29uZmlybWF0aW9uUmVzdWx0LmNvbmZpcm0odmVyaWZpY2F0aW9uQ29kZSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gcGhvbmVJbmZvT3B0aW9ucyAtIFRoZSB1c2VyJ3Mge0BsaW5rIFBob25lSW5mb09wdGlvbnN9LiBUaGUgcGhvbmUgbnVtYmVyIHNob3VsZCBiZSBpblxuICAgKiBFLjE2NCBmb3JtYXQgKGUuZy4gKzE2NTA1NTUwMTAxKS5cbiAgICogQHBhcmFtIGFwcGxpY2F0aW9uVmVyaWZpZXIgLSBGb3IgYWJ1c2UgcHJldmVudGlvbiwgdGhpcyBtZXRob2QgYWxzbyByZXF1aXJlcyBhXG4gICAqIHtAbGluayBBcHBsaWNhdGlvblZlcmlmaWVyfS4gVGhpcyBTREsgaW5jbHVkZXMgYSByZUNBUFRDSEEtYmFzZWQgaW1wbGVtZW50YXRpb24sXG4gICAqIHtAbGluayBSZWNhcHRjaGFWZXJpZmllcn0uXG4gICAqXG4gICAqIEByZXR1cm5zIEEgUHJvbWlzZSBmb3IgYSB2ZXJpZmljYXRpb24gSUQgdGhhdCBjYW4gYmUgcGFzc2VkIHRvXG4gICAqIHtAbGluayBQaG9uZUF1dGhQcm92aWRlci5jcmVkZW50aWFsfSB0byBpZGVudGlmeSB0aGlzIGZsb3cuLlxuICAgKi9cbiAgdmVyaWZ5UGhvbmVOdW1iZXIoXG4gICAgcGhvbmVPcHRpb25zOiBQaG9uZUluZm9PcHRpb25zIHwgc3RyaW5nLFxuICAgIGFwcGxpY2F0aW9uVmVyaWZpZXI6IEFwcGxpY2F0aW9uVmVyaWZpZXJcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gX3ZlcmlmeVBob25lTnVtYmVyKFxuICAgICAgdGhpcy5hdXRoLFxuICAgICAgcGhvbmVPcHRpb25zLFxuICAgICAgZ2V0TW9kdWxhckluc3RhbmNlKGFwcGxpY2F0aW9uVmVyaWZpZXIgYXMgQXBwbGljYXRpb25WZXJpZmllckludGVybmFsKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHBob25lIGF1dGggY3JlZGVudGlhbCwgZ2l2ZW4gdGhlIHZlcmlmaWNhdGlvbiBJRCBmcm9tXG4gICAqIHtAbGluayBQaG9uZUF1dGhQcm92aWRlci52ZXJpZnlQaG9uZU51bWJlcn0gYW5kIHRoZSBjb2RlIHRoYXQgd2FzIHNlbnQgdG8gdGhlIHVzZXInc1xuICAgKiBtb2JpbGUgZGV2aWNlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBqYXZhc2NyaXB0XG4gICAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IFBob25lQXV0aFByb3ZpZGVyKGF1dGgpO1xuICAgKiBjb25zdCB2ZXJpZmljYXRpb25JZCA9IHByb3ZpZGVyLnZlcmlmeVBob25lTnVtYmVyKHBob25lTnVtYmVyLCBhcHBsaWNhdGlvblZlcmlmaWVyKTtcbiAgICogLy8gT2J0YWluIHZlcmlmaWNhdGlvbkNvZGUgZnJvbSB0aGUgdXNlci5cbiAgICogY29uc3QgYXV0aENyZWRlbnRpYWwgPSBQaG9uZUF1dGhQcm92aWRlci5jcmVkZW50aWFsKHZlcmlmaWNhdGlvbklkLCB2ZXJpZmljYXRpb25Db2RlKTtcbiAgICogY29uc3QgdXNlckNyZWRlbnRpYWwgPSBzaWduSW5XaXRoQ3JlZGVudGlhbChhdXRoLCBhdXRoQ3JlZGVudGlhbCk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBBbiBhbHRlcm5hdGl2ZSBmbG93IGlzIHByb3ZpZGVkIHVzaW5nIHRoZSBgc2lnbkluV2l0aFBob25lTnVtYmVyYCBtZXRob2QuXG4gICAqIGBgYGphdmFzY3JpcHRcbiAgICogY29uc3QgY29uZmlybWF0aW9uUmVzdWx0ID0gYXdhaXQgc2lnbkluV2l0aFBob25lTnVtYmVyKGF1dGgsIHBob25lTnVtYmVyLCBhcHBsaWNhdGlvblZlcmlmaWVyKTtcbiAgICogLy8gT2J0YWluIHZlcmlmaWNhdGlvbkNvZGUgZnJvbSB0aGUgdXNlci5cbiAgICogY29uc3QgdXNlckNyZWRlbnRpYWwgPSBhd2FpdCBjb25maXJtYXRpb25SZXN1bHQuY29uZmlybSh2ZXJpZmljYXRpb25Db2RlKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSB2ZXJpZmljYXRpb25JZCAtIFRoZSB2ZXJpZmljYXRpb24gSUQgcmV0dXJuZWQgZnJvbSB7QGxpbmsgUGhvbmVBdXRoUHJvdmlkZXIudmVyaWZ5UGhvbmVOdW1iZXJ9LlxuICAgKiBAcGFyYW0gdmVyaWZpY2F0aW9uQ29kZSAtIFRoZSB2ZXJpZmljYXRpb24gY29kZSBzZW50IHRvIHRoZSB1c2VyJ3MgbW9iaWxlIGRldmljZS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGF1dGggcHJvdmlkZXIgY3JlZGVudGlhbC5cbiAgICovXG4gIHN0YXRpYyBjcmVkZW50aWFsKFxuICAgIHZlcmlmaWNhdGlvbklkOiBzdHJpbmcsXG4gICAgdmVyaWZpY2F0aW9uQ29kZTogc3RyaW5nXG4gICk6IFBob25lQXV0aENyZWRlbnRpYWwge1xuICAgIHJldHVybiBQaG9uZUF1dGhDcmVkZW50aWFsLl9mcm9tVmVyaWZpY2F0aW9uKFxuICAgICAgdmVyaWZpY2F0aW9uSWQsXG4gICAgICB2ZXJpZmljYXRpb25Db2RlXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYW4ge0BsaW5rIEF1dGhDcmVkZW50aWFsfSBmcm9tIGEge0BsaW5rIFVzZXJDcmVkZW50aWFsfS5cbiAgICogQHBhcmFtIHVzZXJDcmVkZW50aWFsIC0gVGhlIHVzZXIgY3JlZGVudGlhbC5cbiAgICovXG4gIHN0YXRpYyBjcmVkZW50aWFsRnJvbVJlc3VsdChcbiAgICB1c2VyQ3JlZGVudGlhbDogVXNlckNyZWRlbnRpYWxcbiAgKTogQXV0aENyZWRlbnRpYWwgfCBudWxsIHtcbiAgICBjb25zdCBjcmVkZW50aWFsID0gdXNlckNyZWRlbnRpYWwgYXMgVXNlckNyZWRlbnRpYWxJbnRlcm5hbDtcbiAgICByZXR1cm4gUGhvbmVBdXRoUHJvdmlkZXIuY3JlZGVudGlhbEZyb21UYWdnZWRPYmplY3QoY3JlZGVudGlhbCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiB7QGxpbmsgQXV0aENyZWRlbnRpYWx9IHdoZW4gcGFzc2VkIGFuIGVycm9yLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKlxuICAgKiBUaGlzIG1ldGhvZCB3b3JrcyBmb3IgZXJyb3JzIGxpa2VcbiAgICogYGF1dGgvYWNjb3VudC1leGlzdHMtd2l0aC1kaWZmZXJlbnQtY3JlZGVudGlhbHNgLiBUaGlzIGlzIHVzZWZ1bCBmb3JcbiAgICogcmVjb3ZlcmluZyB3aGVuIGF0dGVtcHRpbmcgdG8gc2V0IGEgdXNlcidzIHBob25lIG51bWJlciBidXQgdGhlIG51bWJlclxuICAgKiBpbiBxdWVzdGlvbiBpcyBhbHJlYWR5IHRpZWQgdG8gYW5vdGhlciBhY2NvdW50LiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZ1xuICAgKiBjb2RlIHRyaWVzIHRvIHVwZGF0ZSB0aGUgY3VycmVudCB1c2VyJ3MgcGhvbmUgbnVtYmVyLCBhbmQgaWYgdGhhdFxuICAgKiBmYWlscywgbGlua3MgdGhlIHVzZXIgd2l0aCB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhhdCBudW1iZXI6XG4gICAqXG4gICAqIGBgYGpzXG4gICAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IFBob25lQXV0aFByb3ZpZGVyKGF1dGgpO1xuICAgKiBjb25zdCB2ZXJpZmljYXRpb25JZCA9IGF3YWl0IHByb3ZpZGVyLnZlcmlmeVBob25lTnVtYmVyKG51bWJlciwgdmVyaWZpZXIpO1xuICAgKiB0cnkge1xuICAgKiAgIGNvbnN0IGNvZGUgPSAnJzsgLy8gUHJvbXB0IHRoZSB1c2VyIGZvciB0aGUgdmVyaWZpY2F0aW9uIGNvZGVcbiAgICogICBhd2FpdCB1cGRhdGVQaG9uZU51bWJlcihcbiAgICogICAgICAgYXV0aC5jdXJyZW50VXNlcixcbiAgICogICAgICAgUGhvbmVBdXRoUHJvdmlkZXIuY3JlZGVudGlhbCh2ZXJpZmljYXRpb25JZCwgY29kZSkpO1xuICAgKiB9IGNhdGNoIChlKSB7XG4gICAqICAgaWYgKChlIGFzIEZpcmViYXNlRXJyb3IpPy5jb2RlID09PSAnYXV0aC9hY2NvdW50LWV4aXN0cy13aXRoLWRpZmZlcmVudC1jcmVkZW50aWFsJykge1xuICAgKiAgICAgY29uc3QgY3JlZCA9IFBob25lQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWxGcm9tRXJyb3IoZSk7XG4gICAqICAgICBhd2FpdCBsaW5rV2l0aENyZWRlbnRpYWwoYXV0aC5jdXJyZW50VXNlciwgY3JlZCk7XG4gICAqICAgfVxuICAgKiB9XG4gICAqXG4gICAqIC8vIEF0IHRoaXMgcG9pbnQsIGF1dGguY3VycmVudFVzZXIucGhvbmVOdW1iZXIgPT09IG51bWJlci5cbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBlcnJvciAtIFRoZSBlcnJvciB0byBnZW5lcmF0ZSBhIGNyZWRlbnRpYWwgZnJvbS5cbiAgICovXG4gIHN0YXRpYyBjcmVkZW50aWFsRnJvbUVycm9yKGVycm9yOiBGaXJlYmFzZUVycm9yKTogQXV0aENyZWRlbnRpYWwgfCBudWxsIHtcbiAgICByZXR1cm4gUGhvbmVBdXRoUHJvdmlkZXIuY3JlZGVudGlhbEZyb21UYWdnZWRPYmplY3QoXG4gICAgICAoZXJyb3IuY3VzdG9tRGF0YSB8fCB7fSkgYXMgVGFnZ2VkV2l0aFRva2VuUmVzcG9uc2VcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlZGVudGlhbEZyb21UYWdnZWRPYmplY3Qoe1xuICAgIF90b2tlblJlc3BvbnNlOiB0b2tlblJlc3BvbnNlXG4gIH06IFRhZ2dlZFdpdGhUb2tlblJlc3BvbnNlKTogQXV0aENyZWRlbnRpYWwgfCBudWxsIHtcbiAgICBpZiAoIXRva2VuUmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCB7IHBob25lTnVtYmVyLCB0ZW1wb3JhcnlQcm9vZiB9ID1cbiAgICAgIHRva2VuUmVzcG9uc2UgYXMgU2lnbkluV2l0aFBob25lTnVtYmVyUmVzcG9uc2U7XG4gICAgaWYgKHBob25lTnVtYmVyICYmIHRlbXBvcmFyeVByb29mKSB7XG4gICAgICByZXR1cm4gUGhvbmVBdXRoQ3JlZGVudGlhbC5fZnJvbVRva2VuUmVzcG9uc2UoXG4gICAgICAgIHBob25lTnVtYmVyLFxuICAgICAgICB0ZW1wb3JhcnlQcm9vZlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBQb3B1cFJlZGlyZWN0UmVzb2x2ZXIgfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuaW1wb3J0IHsgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXV0aCc7XG5pbXBvcnQgeyBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL3BvcHVwX3JlZGlyZWN0JztcbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgX2Fzc2VydCB9IGZyb20gJy4vYXNzZXJ0JztcbmltcG9ydCB7IF9nZXRJbnN0YW5jZSB9IGZyb20gJy4vaW5zdGFudGlhdG9yJztcblxuLyoqXG4gKiBDaG9vc2VzIGEgcG9wdXAvcmVkaXJlY3QgcmVzb2x2ZXIgdG8gdXNlLiBUaGlzIHByZWZlcnMgdGhlIG92ZXJyaWRlICh3aGljaFxuICogaXMgZGlyZWN0bHkgcGFzc2VkIGluKSwgYW5kIGZhbGxzIGJhY2sgdG8gdGhlIHByb3BlcnR5IHNldCBvbiB0aGUgYXV0aFxuICogb2JqZWN0LiBJZiBuZWl0aGVyIGFyZSBhdmFpbGFibGUsIHRoaXMgZnVuY3Rpb24gZXJyb3JzIHcvIGFuIGFyZ3VtZW50IGVycm9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gX3dpdGhEZWZhdWx0UmVzb2x2ZXIoXG4gIGF1dGg6IEF1dGhJbnRlcm5hbCxcbiAgcmVzb2x2ZXJPdmVycmlkZTogUG9wdXBSZWRpcmVjdFJlc29sdmVyIHwgdW5kZWZpbmVkXG4pOiBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJJbnRlcm5hbCB7XG4gIGlmIChyZXNvbHZlck92ZXJyaWRlKSB7XG4gICAgcmV0dXJuIF9nZXRJbnN0YW5jZShyZXNvbHZlck92ZXJyaWRlKTtcbiAgfVxuXG4gIF9hc3NlcnQoYXV0aC5fcG9wdXBSZWRpcmVjdFJlc29sdmVyLCBhdXRoLCBBdXRoRXJyb3JDb2RlLkFSR1VNRU5UX0VSUk9SKTtcblxuICByZXR1cm4gYXV0aC5fcG9wdXBSZWRpcmVjdFJlc29sdmVyO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gIHNpZ25JbldpdGhJZHAsXG4gIFNpZ25JbldpdGhJZHBSZXF1ZXN0XG59IGZyb20gJy4uLy4uL2FwaS9hdXRoZW50aWNhdGlvbi9pZHAnO1xuaW1wb3J0IHsgUGhvbmVPck9hdXRoVG9rZW5SZXNwb25zZSB9IGZyb20gJy4uLy4uL2FwaS9hdXRoZW50aWNhdGlvbi9tZmEnO1xuaW1wb3J0IHsgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXV0aCc7XG5pbXBvcnQgeyBJZFRva2VuUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9tb2RlbC9pZF90b2tlbic7XG5pbXBvcnQgeyBVc2VySW50ZXJuYWwsIFVzZXJDcmVkZW50aWFsSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC91c2VyJztcbmltcG9ydCB7IEF1dGhDcmVkZW50aWFsIH0gZnJvbSAnLi4vY3JlZGVudGlhbHMnO1xuaW1wb3J0IHsgX2xpbmsgYXMgX2xpbmtVc2VyIH0gZnJvbSAnLi4vdXNlci9saW5rX3VubGluayc7XG5pbXBvcnQgeyBfcmVhdXRoZW50aWNhdGUgfSBmcm9tICcuLi91c2VyL3JlYXV0aGVudGljYXRlJztcbmltcG9ydCB7IF9hc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydCc7XG5pbXBvcnQgeyBfc2lnbkluV2l0aENyZWRlbnRpYWwgfSBmcm9tICcuL2NyZWRlbnRpYWwnO1xuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBQcm92aWRlcklkIH0gZnJvbSAnLi4vLi4vbW9kZWwvZW51bXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElkcFRhc2tQYXJhbXMge1xuICBhdXRoOiBBdXRoSW50ZXJuYWw7XG4gIHJlcXVlc3RVcmk6IHN0cmluZztcbiAgc2Vzc2lvbklkPzogc3RyaW5nO1xuICB0ZW5hbnRJZD86IHN0cmluZztcbiAgcG9zdEJvZHk/OiBzdHJpbmc7XG4gIHBlbmRpbmdUb2tlbj86IHN0cmluZztcbiAgdXNlcj86IFVzZXJJbnRlcm5hbDtcbiAgYnlwYXNzQXV0aFN0YXRlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgSWRwVGFzayA9IChcbiAgcGFyYW1zOiBJZHBUYXNrUGFyYW1zXG4pID0+IFByb21pc2U8VXNlckNyZWRlbnRpYWxJbnRlcm5hbD47XG5cbmNsYXNzIElkcENyZWRlbnRpYWwgZXh0ZW5kcyBBdXRoQ3JlZGVudGlhbCB7XG4gIGNvbnN0cnVjdG9yKHJlYWRvbmx5IHBhcmFtczogSWRwVGFza1BhcmFtcykge1xuICAgIHN1cGVyKFByb3ZpZGVySWQuQ1VTVE9NLCBQcm92aWRlcklkLkNVU1RPTSk7XG4gIH1cblxuICBfZ2V0SWRUb2tlblJlc3BvbnNlKGF1dGg6IEF1dGhJbnRlcm5hbCk6IFByb21pc2U8UGhvbmVPck9hdXRoVG9rZW5SZXNwb25zZT4ge1xuICAgIHJldHVybiBzaWduSW5XaXRoSWRwKGF1dGgsIHRoaXMuX2J1aWxkSWRwUmVxdWVzdCgpKTtcbiAgfVxuXG4gIF9saW5rVG9JZFRva2VuKFxuICAgIGF1dGg6IEF1dGhJbnRlcm5hbCxcbiAgICBpZFRva2VuOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxJZFRva2VuUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gc2lnbkluV2l0aElkcChhdXRoLCB0aGlzLl9idWlsZElkcFJlcXVlc3QoaWRUb2tlbikpO1xuICB9XG5cbiAgX2dldFJlYXV0aGVudGljYXRpb25SZXNvbHZlcihhdXRoOiBBdXRoSW50ZXJuYWwpOiBQcm9taXNlPElkVG9rZW5SZXNwb25zZT4ge1xuICAgIHJldHVybiBzaWduSW5XaXRoSWRwKGF1dGgsIHRoaXMuX2J1aWxkSWRwUmVxdWVzdCgpKTtcbiAgfVxuXG4gIHByaXZhdGUgX2J1aWxkSWRwUmVxdWVzdChpZFRva2VuPzogc3RyaW5nKTogU2lnbkluV2l0aElkcFJlcXVlc3Qge1xuICAgIGNvbnN0IHJlcXVlc3Q6IFNpZ25JbldpdGhJZHBSZXF1ZXN0ID0ge1xuICAgICAgcmVxdWVzdFVyaTogdGhpcy5wYXJhbXMucmVxdWVzdFVyaSxcbiAgICAgIHNlc3Npb25JZDogdGhpcy5wYXJhbXMuc2Vzc2lvbklkLFxuICAgICAgcG9zdEJvZHk6IHRoaXMucGFyYW1zLnBvc3RCb2R5LFxuICAgICAgdGVuYW50SWQ6IHRoaXMucGFyYW1zLnRlbmFudElkLFxuICAgICAgcGVuZGluZ1Rva2VuOiB0aGlzLnBhcmFtcy5wZW5kaW5nVG9rZW4sXG4gICAgICByZXR1cm5TZWN1cmVUb2tlbjogdHJ1ZSxcbiAgICAgIHJldHVybklkcENyZWRlbnRpYWw6IHRydWVcbiAgICB9O1xuXG4gICAgaWYgKGlkVG9rZW4pIHtcbiAgICAgIHJlcXVlc3QuaWRUb2tlbiA9IGlkVG9rZW47XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcXVlc3Q7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9zaWduSW4oXG4gIHBhcmFtczogSWRwVGFza1BhcmFtc1xuKTogUHJvbWlzZTxVc2VyQ3JlZGVudGlhbEludGVybmFsPiB7XG4gIHJldHVybiBfc2lnbkluV2l0aENyZWRlbnRpYWwoXG4gICAgcGFyYW1zLmF1dGgsXG4gICAgbmV3IElkcENyZWRlbnRpYWwocGFyYW1zKSxcbiAgICBwYXJhbXMuYnlwYXNzQXV0aFN0YXRlXG4gICkgYXMgUHJvbWlzZTxVc2VyQ3JlZGVudGlhbEludGVybmFsPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9yZWF1dGgoXG4gIHBhcmFtczogSWRwVGFza1BhcmFtc1xuKTogUHJvbWlzZTxVc2VyQ3JlZGVudGlhbEludGVybmFsPiB7XG4gIGNvbnN0IHsgYXV0aCwgdXNlciB9ID0gcGFyYW1zO1xuICBfYXNzZXJ0KHVzZXIsIGF1dGgsIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IpO1xuICByZXR1cm4gX3JlYXV0aGVudGljYXRlKFxuICAgIHVzZXIsXG4gICAgbmV3IElkcENyZWRlbnRpYWwocGFyYW1zKSxcbiAgICBwYXJhbXMuYnlwYXNzQXV0aFN0YXRlXG4gICk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBfbGluayhcbiAgcGFyYW1zOiBJZHBUYXNrUGFyYW1zXG4pOiBQcm9taXNlPFVzZXJDcmVkZW50aWFsSW50ZXJuYWw+IHtcbiAgY29uc3QgeyBhdXRoLCB1c2VyIH0gPSBwYXJhbXM7XG4gIF9hc3NlcnQodXNlciwgYXV0aCwgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG4gIHJldHVybiBfbGlua1VzZXIodXNlciwgbmV3IElkcENyZWRlbnRpYWwocGFyYW1zKSwgcGFyYW1zLmJ5cGFzc0F1dGhTdGF0ZSk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgRmlyZWJhc2VFcnJvciB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcblxuaW1wb3J0IHtcbiAgQXV0aEV2ZW50LFxuICBBdXRoRXZlbnRDb25zdW1lcixcbiAgQXV0aEV2ZW50VHlwZSxcbiAgRXZlbnRNYW5hZ2VyLFxuICBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJJbnRlcm5hbFxufSBmcm9tICcuLi8uLi9tb2RlbC9wb3B1cF9yZWRpcmVjdCc7XG5pbXBvcnQgeyBVc2VySW50ZXJuYWwsIFVzZXJDcmVkZW50aWFsSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC91c2VyJztcbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgZGVidWdBc3NlcnQsIF9mYWlsIH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQnO1xuaW1wb3J0IHtcbiAgX2xpbmssXG4gIF9yZWF1dGgsXG4gIF9zaWduSW4sXG4gIElkcFRhc2ssXG4gIElkcFRhc2tQYXJhbXNcbn0gZnJvbSAnLi4vc3RyYXRlZ2llcy9pZHAnO1xuaW1wb3J0IHsgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXV0aCc7XG5cbmludGVyZmFjZSBQZW5kaW5nUHJvbWlzZSB7XG4gIHJlc29sdmU6IChjcmVkOiBVc2VyQ3JlZGVudGlhbEludGVybmFsIHwgbnVsbCkgPT4gdm9pZDtcbiAgcmVqZWN0OiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFBvcHVwIGV2ZW50IG1hbmFnZXIuIEhhbmRsZXMgdGhlIHBvcHVwJ3MgZW50aXJlIGxpZmVjeWNsZTsgbGlzdGVucyB0byBhdXRoXG4gKiBldmVudHNcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UG9wdXBSZWRpcmVjdE9wZXJhdGlvblxuICBpbXBsZW1lbnRzIEF1dGhFdmVudENvbnN1bWVyXG57XG4gIHByaXZhdGUgcGVuZGluZ1Byb21pc2U6IFBlbmRpbmdQcm9taXNlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZXZlbnRNYW5hZ2VyOiBFdmVudE1hbmFnZXIgfCBudWxsID0gbnVsbDtcbiAgcmVhZG9ubHkgZmlsdGVyOiBBdXRoRXZlbnRUeXBlW107XG5cbiAgYWJzdHJhY3QgZXZlbnRJZDogc3RyaW5nIHwgbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgYXV0aDogQXV0aEludGVybmFsLFxuICAgIGZpbHRlcjogQXV0aEV2ZW50VHlwZSB8IEF1dGhFdmVudFR5cGVbXSxcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVzb2x2ZXI6IFBvcHVwUmVkaXJlY3RSZXNvbHZlckludGVybmFsLFxuICAgIHByb3RlY3RlZCB1c2VyPzogVXNlckludGVybmFsLFxuICAgIHByb3RlY3RlZCByZWFkb25seSBieXBhc3NBdXRoU3RhdGUgPSBmYWxzZVxuICApIHtcbiAgICB0aGlzLmZpbHRlciA9IEFycmF5LmlzQXJyYXkoZmlsdGVyKSA/IGZpbHRlciA6IFtmaWx0ZXJdO1xuICB9XG5cbiAgYWJzdHJhY3Qgb25FeGVjdXRpb24oKTogUHJvbWlzZTx2b2lkPjtcblxuICBleGVjdXRlKCk6IFByb21pc2U8VXNlckNyZWRlbnRpYWxJbnRlcm5hbCB8IG51bGw+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8VXNlckNyZWRlbnRpYWxJbnRlcm5hbCB8IG51bGw+KFxuICAgICAgYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICB0aGlzLnBlbmRpbmdQcm9taXNlID0geyByZXNvbHZlLCByZWplY3QgfTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMuZXZlbnRNYW5hZ2VyID0gYXdhaXQgdGhpcy5yZXNvbHZlci5faW5pdGlhbGl6ZSh0aGlzLmF1dGgpO1xuICAgICAgICAgIGF3YWl0IHRoaXMub25FeGVjdXRpb24oKTtcbiAgICAgICAgICB0aGlzLmV2ZW50TWFuYWdlci5yZWdpc3RlckNvbnN1bWVyKHRoaXMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdGhpcy5yZWplY3QoZSBhcyBFcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgYXN5bmMgb25BdXRoRXZlbnQoZXZlbnQ6IEF1dGhFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgdXJsUmVzcG9uc2UsIHNlc3Npb25JZCwgcG9zdEJvZHksIHRlbmFudElkLCBlcnJvciwgdHlwZSB9ID0gZXZlbnQ7XG4gICAgaWYgKGVycm9yKSB7XG4gICAgICB0aGlzLnJlamVjdChlcnJvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1zOiBJZHBUYXNrUGFyYW1zID0ge1xuICAgICAgYXV0aDogdGhpcy5hdXRoLFxuICAgICAgcmVxdWVzdFVyaTogdXJsUmVzcG9uc2UhLFxuICAgICAgc2Vzc2lvbklkOiBzZXNzaW9uSWQhLFxuICAgICAgdGVuYW50SWQ6IHRlbmFudElkIHx8IHVuZGVmaW5lZCxcbiAgICAgIHBvc3RCb2R5OiBwb3N0Qm9keSB8fCB1bmRlZmluZWQsXG4gICAgICB1c2VyOiB0aGlzLnVzZXIsXG4gICAgICBieXBhc3NBdXRoU3RhdGU6IHRoaXMuYnlwYXNzQXV0aFN0YXRlXG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLnJlc29sdmUoYXdhaXQgdGhpcy5nZXRJZHBUYXNrKHR5cGUpKHBhcmFtcykpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMucmVqZWN0KGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIG9uRXJyb3IoZXJyb3I6IEZpcmViYXNlRXJyb3IpOiB2b2lkIHtcbiAgICB0aGlzLnJlamVjdChlcnJvcik7XG4gIH1cblxuICBwcml2YXRlIGdldElkcFRhc2sodHlwZTogQXV0aEV2ZW50VHlwZSk6IElkcFRhc2sge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBBdXRoRXZlbnRUeXBlLlNJR05fSU5fVklBX1BPUFVQOlxuICAgICAgY2FzZSBBdXRoRXZlbnRUeXBlLlNJR05fSU5fVklBX1JFRElSRUNUOlxuICAgICAgICByZXR1cm4gX3NpZ25JbjtcbiAgICAgIGNhc2UgQXV0aEV2ZW50VHlwZS5MSU5LX1ZJQV9QT1BVUDpcbiAgICAgIGNhc2UgQXV0aEV2ZW50VHlwZS5MSU5LX1ZJQV9SRURJUkVDVDpcbiAgICAgICAgcmV0dXJuIF9saW5rO1xuICAgICAgY2FzZSBBdXRoRXZlbnRUeXBlLlJFQVVUSF9WSUFfUE9QVVA6XG4gICAgICBjYXNlIEF1dGhFdmVudFR5cGUuUkVBVVRIX1ZJQV9SRURJUkVDVDpcbiAgICAgICAgcmV0dXJuIF9yZWF1dGg7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBfZmFpbCh0aGlzLmF1dGgsIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCByZXNvbHZlKGNyZWQ6IFVzZXJDcmVkZW50aWFsSW50ZXJuYWwgfCBudWxsKTogdm9pZCB7XG4gICAgZGVidWdBc3NlcnQodGhpcy5wZW5kaW5nUHJvbWlzZSwgJ1BlbmRpbmcgcHJvbWlzZSB3YXMgbmV2ZXIgc2V0Jyk7XG4gICAgdGhpcy5wZW5kaW5nUHJvbWlzZS5yZXNvbHZlKGNyZWQpO1xuICAgIHRoaXMudW5yZWdpc3RlckFuZENsZWFuVXAoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWplY3QoZXJyb3I6IEVycm9yKTogdm9pZCB7XG4gICAgZGVidWdBc3NlcnQodGhpcy5wZW5kaW5nUHJvbWlzZSwgJ1BlbmRpbmcgcHJvbWlzZSB3YXMgbmV2ZXIgc2V0Jyk7XG4gICAgdGhpcy5wZW5kaW5nUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgIHRoaXMudW5yZWdpc3RlckFuZENsZWFuVXAoKTtcbiAgfVxuXG4gIHByaXZhdGUgdW5yZWdpc3RlckFuZENsZWFuVXAoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZXZlbnRNYW5hZ2VyKSB7XG4gICAgICB0aGlzLmV2ZW50TWFuYWdlci51bnJlZ2lzdGVyQ29uc3VtZXIodGhpcyk7XG4gICAgfVxuXG4gICAgdGhpcy5wZW5kaW5nUHJvbWlzZSA9IG51bGw7XG4gICAgdGhpcy5jbGVhblVwKCk7XG4gIH1cblxuICBhYnN0cmFjdCBjbGVhblVwKCk6IHZvaWQ7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgQXV0aCxcbiAgQXV0aFByb3ZpZGVyLFxuICBQb3B1cFJlZGlyZWN0UmVzb2x2ZXIsXG4gIFVzZXIsXG4gIFVzZXJDcmVkZW50aWFsXG59IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbmltcG9ydCB7IF9jYXN0QXV0aCB9IGZyb20gJy4uLy4uL2NvcmUvYXV0aC9hdXRoX2ltcGwnO1xuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSB9IGZyb20gJy4uLy4uL2NvcmUvZXJyb3JzJztcbmltcG9ydCB7XG4gIF9hc3NlcnQsXG4gIGRlYnVnQXNzZXJ0LFxuICBfY3JlYXRlRXJyb3IsXG4gIF9hc3NlcnRJbnN0YW5jZU9mXG59IGZyb20gJy4uLy4uL2NvcmUvdXRpbC9hc3NlcnQnO1xuaW1wb3J0IHsgRGVsYXkgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWwvZGVsYXknO1xuaW1wb3J0IHsgX2dlbmVyYXRlRXZlbnRJZCB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbC9ldmVudF9pZCc7XG5pbXBvcnQgeyBBdXRoSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9hdXRoJztcbmltcG9ydCB7XG4gIEF1dGhFdmVudFR5cGUsXG4gIFBvcHVwUmVkaXJlY3RSZXNvbHZlckludGVybmFsXG59IGZyb20gJy4uLy4uL21vZGVsL3BvcHVwX3JlZGlyZWN0JztcbmltcG9ydCB7IFVzZXJJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL3VzZXInO1xuaW1wb3J0IHsgX3dpdGhEZWZhdWx0UmVzb2x2ZXIgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWwvcmVzb2x2ZXInO1xuaW1wb3J0IHsgQXV0aFBvcHVwIH0gZnJvbSAnLi4vdXRpbC9wb3B1cCc7XG5pbXBvcnQgeyBBYnN0cmFjdFBvcHVwUmVkaXJlY3RPcGVyYXRpb24gfSBmcm9tICcuLi8uLi9jb3JlL3N0cmF0ZWdpZXMvYWJzdHJhY3RfcG9wdXBfcmVkaXJlY3Rfb3BlcmF0aW9uJztcbmltcG9ydCB7IEZlZGVyYXRlZEF1dGhQcm92aWRlciB9IGZyb20gJy4uLy4uL2NvcmUvcHJvdmlkZXJzL2ZlZGVyYXRlZCc7XG5pbXBvcnQgeyBnZXRNb2R1bGFySW5zdGFuY2UgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5cbi8qXG4gKiBUaGUgZXZlbnQgdGltZW91dCBpcyB0aGUgc2FtZSBvbiBtb2JpbGUgYW5kIGRlc2t0b3AsIG5vIG5lZWQgZm9yIERlbGF5LiBTZXQgdGhpcyB0byA4cyBzaW5jZVxuICogYmxvY2tpbmcgZnVuY3Rpb25zIGNhbiB0YWtlIHVwdG8gN3MgdG8gY29tcGxldGUgc2lnbiBpbiwgYXMgZG9jdW1lbnRlZCBpbjpcbiAqIGh0dHBzOi8vY2xvdWQuZ29vZ2xlLmNvbS9pZGVudGl0eS1wbGF0Zm9ybS9kb2NzL2Jsb2NraW5nLWZ1bmN0aW9ucyN1bmRlcnN0YW5kaW5nX2Jsb2NraW5nX2Z1bmN0aW9uc1xuICogaHR0cHM6Ly9maXJlYmFzZS5nb29nbGUuY29tL2RvY3MvYXV0aC9leHRlbmQtd2l0aC1ibG9ja2luZy1mdW5jdGlvbnMjdW5kZXJzdGFuZGluZ19ibG9ja2luZ19mdW5jdGlvbnNcbiAqL1xuZXhwb3J0IGNvbnN0IGVudW0gX1RpbWVvdXQge1xuICBBVVRIX0VWRU5UID0gODAwMFxufVxuZXhwb3J0IGNvbnN0IF9QT0xMX1dJTkRPV19DTE9TRV9USU1FT1VUID0gbmV3IERlbGF5KDIwMDAsIDEwMDAwKTtcblxuLyoqXG4gKiBBdXRoZW50aWNhdGVzIGEgRmlyZWJhc2UgY2xpZW50IHVzaW5nIGEgcG9wdXAtYmFzZWQgT0F1dGggYXV0aGVudGljYXRpb24gZmxvdy5cbiAqXG4gKiBAcmVtYXJrc1xuICogSWYgc3VjY2VlZHMsIHJldHVybnMgdGhlIHNpZ25lZCBpbiB1c2VyIGFsb25nIHdpdGggdGhlIHByb3ZpZGVyJ3MgY3JlZGVudGlhbC4gSWYgc2lnbiBpbiB3YXNcbiAqIHVuc3VjY2Vzc2Z1bCwgcmV0dXJucyBhbiBlcnJvciBvYmplY3QgY29udGFpbmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvci5cbiAqXG4gKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCB3b3JrIGluIGEgTm9kZS5qcyBlbnZpcm9ubWVudC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgamF2YXNjcmlwdFxuICogLy8gU2lnbiBpbiB1c2luZyBhIHBvcHVwLlxuICogY29uc3QgcHJvdmlkZXIgPSBuZXcgRmFjZWJvb2tBdXRoUHJvdmlkZXIoKTtcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpZ25JbldpdGhQb3B1cChhdXRoLCBwcm92aWRlcik7XG4gKlxuICogLy8gVGhlIHNpZ25lZC1pbiB1c2VyIGluZm8uXG4gKiBjb25zdCB1c2VyID0gcmVzdWx0LnVzZXI7XG4gKiAvLyBUaGlzIGdpdmVzIHlvdSBhIEZhY2Vib29rIEFjY2VzcyBUb2tlbi5cbiAqIGNvbnN0IGNyZWRlbnRpYWwgPSBwcm92aWRlci5jcmVkZW50aWFsRnJvbVJlc3VsdChhdXRoLCByZXN1bHQpO1xuICogY29uc3QgdG9rZW4gPSBjcmVkZW50aWFsLmFjY2Vzc1Rva2VuO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxuICogQHBhcmFtIHByb3ZpZGVyIC0gVGhlIHByb3ZpZGVyIHRvIGF1dGhlbnRpY2F0ZS4gVGhlIHByb3ZpZGVyIGhhcyB0byBiZSBhbiB7QGxpbmsgT0F1dGhQcm92aWRlcn0uXG4gKiBOb24tT0F1dGggcHJvdmlkZXJzIGxpa2Uge0BsaW5rIEVtYWlsQXV0aFByb3ZpZGVyfSB3aWxsIHRocm93IGFuIGVycm9yLlxuICogQHBhcmFtIHJlc29sdmVyIC0gQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFBvcHVwUmVkaXJlY3RSZXNvbHZlcn0sIG9wdGlvbmFsXG4gKiBpZiBhbHJlYWR5IHN1cHBsaWVkIHRvIHtAbGluayBpbml0aWFsaXplQXV0aH0gb3IgcHJvdmlkZWQgYnkge0BsaW5rIGdldEF1dGh9LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNpZ25JbldpdGhQb3B1cChcbiAgYXV0aDogQXV0aCxcbiAgcHJvdmlkZXI6IEF1dGhQcm92aWRlcixcbiAgcmVzb2x2ZXI/OiBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJcbik6IFByb21pc2U8VXNlckNyZWRlbnRpYWw+IHtcbiAgY29uc3QgYXV0aEludGVybmFsID0gX2Nhc3RBdXRoKGF1dGgpO1xuICBfYXNzZXJ0SW5zdGFuY2VPZihhdXRoLCBwcm92aWRlciwgRmVkZXJhdGVkQXV0aFByb3ZpZGVyKTtcbiAgY29uc3QgcmVzb2x2ZXJJbnRlcm5hbCA9IF93aXRoRGVmYXVsdFJlc29sdmVyKGF1dGhJbnRlcm5hbCwgcmVzb2x2ZXIpO1xuICBjb25zdCBhY3Rpb24gPSBuZXcgUG9wdXBPcGVyYXRpb24oXG4gICAgYXV0aEludGVybmFsLFxuICAgIEF1dGhFdmVudFR5cGUuU0lHTl9JTl9WSUFfUE9QVVAsXG4gICAgcHJvdmlkZXIsXG4gICAgcmVzb2x2ZXJJbnRlcm5hbFxuICApO1xuICByZXR1cm4gYWN0aW9uLmV4ZWN1dGVOb3ROdWxsKCk7XG59XG5cbi8qKlxuICogUmVhdXRoZW50aWNhdGVzIHRoZSBjdXJyZW50IHVzZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHtAbGluayBPQXV0aFByb3ZpZGVyfSB1c2luZyBhIHBvcC11cCBiYXNlZFxuICogT0F1dGggZmxvdy5cbiAqXG4gKiBAcmVtYXJrc1xuICogSWYgdGhlIHJlYXV0aGVudGljYXRpb24gaXMgc3VjY2Vzc2Z1bCwgdGhlIHJldHVybmVkIHJlc3VsdCB3aWxsIGNvbnRhaW4gdGhlIHVzZXIgYW5kIHRoZVxuICogcHJvdmlkZXIncyBjcmVkZW50aWFsLlxuICpcbiAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHdvcmsgaW4gYSBOb2RlLmpzIGVudmlyb25tZW50LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiAvLyBTaWduIGluIHVzaW5nIGEgcG9wdXAuXG4gKiBjb25zdCBwcm92aWRlciA9IG5ldyBGYWNlYm9va0F1dGhQcm92aWRlcigpO1xuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc2lnbkluV2l0aFBvcHVwKGF1dGgsIHByb3ZpZGVyKTtcbiAqIC8vIFJlYXV0aGVudGljYXRlIHVzaW5nIGEgcG9wdXAuXG4gKiBhd2FpdCByZWF1dGhlbnRpY2F0ZVdpdGhQb3B1cChyZXN1bHQudXNlciwgcHJvdmlkZXIpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlci5cbiAqIEBwYXJhbSBwcm92aWRlciAtIFRoZSBwcm92aWRlciB0byBhdXRoZW50aWNhdGUuIFRoZSBwcm92aWRlciBoYXMgdG8gYmUgYW4ge0BsaW5rIE9BdXRoUHJvdmlkZXJ9LlxuICogTm9uLU9BdXRoIHByb3ZpZGVycyBsaWtlIHtAbGluayBFbWFpbEF1dGhQcm92aWRlcn0gd2lsbCB0aHJvdyBhbiBlcnJvci5cbiAqIEBwYXJhbSByZXNvbHZlciAtIEFuIGluc3RhbmNlIG9mIHtAbGluayBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJ9LCBvcHRpb25hbFxuICogaWYgYWxyZWFkeSBzdXBwbGllZCB0byB7QGxpbmsgaW5pdGlhbGl6ZUF1dGh9IG9yIHByb3ZpZGVkIGJ5IHtAbGluayBnZXRBdXRofS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWF1dGhlbnRpY2F0ZVdpdGhQb3B1cChcbiAgdXNlcjogVXNlcixcbiAgcHJvdmlkZXI6IEF1dGhQcm92aWRlcixcbiAgcmVzb2x2ZXI/OiBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJcbik6IFByb21pc2U8VXNlckNyZWRlbnRpYWw+IHtcbiAgY29uc3QgdXNlckludGVybmFsID0gZ2V0TW9kdWxhckluc3RhbmNlKHVzZXIpIGFzIFVzZXJJbnRlcm5hbDtcbiAgX2Fzc2VydEluc3RhbmNlT2YodXNlckludGVybmFsLmF1dGgsIHByb3ZpZGVyLCBGZWRlcmF0ZWRBdXRoUHJvdmlkZXIpO1xuICBjb25zdCByZXNvbHZlckludGVybmFsID0gX3dpdGhEZWZhdWx0UmVzb2x2ZXIodXNlckludGVybmFsLmF1dGgsIHJlc29sdmVyKTtcbiAgY29uc3QgYWN0aW9uID0gbmV3IFBvcHVwT3BlcmF0aW9uKFxuICAgIHVzZXJJbnRlcm5hbC5hdXRoLFxuICAgIEF1dGhFdmVudFR5cGUuUkVBVVRIX1ZJQV9QT1BVUCxcbiAgICBwcm92aWRlcixcbiAgICByZXNvbHZlckludGVybmFsLFxuICAgIHVzZXJJbnRlcm5hbFxuICApO1xuICByZXR1cm4gYWN0aW9uLmV4ZWN1dGVOb3ROdWxsKCk7XG59XG5cbi8qKlxuICogTGlua3MgdGhlIGF1dGhlbnRpY2F0ZWQgcHJvdmlkZXIgdG8gdGhlIHVzZXIgYWNjb3VudCB1c2luZyBhIHBvcC11cCBiYXNlZCBPQXV0aCBmbG93LlxuICpcbiAqIEByZW1hcmtzXG4gKiBJZiB0aGUgbGlua2luZyBpcyBzdWNjZXNzZnVsLCB0aGUgcmV0dXJuZWQgcmVzdWx0IHdpbGwgY29udGFpbiB0aGUgdXNlciBhbmQgdGhlIHByb3ZpZGVyJ3MgY3JlZGVudGlhbC5cbiAqXG4gKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCB3b3JrIGluIGEgTm9kZS5qcyBlbnZpcm9ubWVudC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgamF2YXNjcmlwdFxuICogLy8gU2lnbiBpbiB1c2luZyBzb21lIG90aGVyIHByb3ZpZGVyLlxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc2lnbkluV2l0aEVtYWlsQW5kUGFzc3dvcmQoYXV0aCwgZW1haWwsIHBhc3N3b3JkKTtcbiAqIC8vIExpbmsgdXNpbmcgYSBwb3B1cC5cbiAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IEZhY2Vib29rQXV0aFByb3ZpZGVyKCk7XG4gKiBhd2FpdCBsaW5rV2l0aFBvcHVwKHJlc3VsdC51c2VyLCBwcm92aWRlcik7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdXNlciAtIFRoZSB1c2VyLlxuICogQHBhcmFtIHByb3ZpZGVyIC0gVGhlIHByb3ZpZGVyIHRvIGF1dGhlbnRpY2F0ZS4gVGhlIHByb3ZpZGVyIGhhcyB0byBiZSBhbiB7QGxpbmsgT0F1dGhQcm92aWRlcn0uXG4gKiBOb24tT0F1dGggcHJvdmlkZXJzIGxpa2Uge0BsaW5rIEVtYWlsQXV0aFByb3ZpZGVyfSB3aWxsIHRocm93IGFuIGVycm9yLlxuICogQHBhcmFtIHJlc29sdmVyIC0gQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFBvcHVwUmVkaXJlY3RSZXNvbHZlcn0sIG9wdGlvbmFsXG4gKiBpZiBhbHJlYWR5IHN1cHBsaWVkIHRvIHtAbGluayBpbml0aWFsaXplQXV0aH0gb3IgcHJvdmlkZWQgYnkge0BsaW5rIGdldEF1dGh9LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpbmtXaXRoUG9wdXAoXG4gIHVzZXI6IFVzZXIsXG4gIHByb3ZpZGVyOiBBdXRoUHJvdmlkZXIsXG4gIHJlc29sdmVyPzogUG9wdXBSZWRpcmVjdFJlc29sdmVyXG4pOiBQcm9taXNlPFVzZXJDcmVkZW50aWFsPiB7XG4gIGNvbnN0IHVzZXJJbnRlcm5hbCA9IGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyKSBhcyBVc2VySW50ZXJuYWw7XG4gIF9hc3NlcnRJbnN0YW5jZU9mKHVzZXJJbnRlcm5hbC5hdXRoLCBwcm92aWRlciwgRmVkZXJhdGVkQXV0aFByb3ZpZGVyKTtcbiAgY29uc3QgcmVzb2x2ZXJJbnRlcm5hbCA9IF93aXRoRGVmYXVsdFJlc29sdmVyKHVzZXJJbnRlcm5hbC5hdXRoLCByZXNvbHZlcik7XG5cbiAgY29uc3QgYWN0aW9uID0gbmV3IFBvcHVwT3BlcmF0aW9uKFxuICAgIHVzZXJJbnRlcm5hbC5hdXRoLFxuICAgIEF1dGhFdmVudFR5cGUuTElOS19WSUFfUE9QVVAsXG4gICAgcHJvdmlkZXIsXG4gICAgcmVzb2x2ZXJJbnRlcm5hbCxcbiAgICB1c2VySW50ZXJuYWxcbiAgKTtcbiAgcmV0dXJuIGFjdGlvbi5leGVjdXRlTm90TnVsbCgpO1xufVxuXG4vKipcbiAqIFBvcHVwIGV2ZW50IG1hbmFnZXIuIEhhbmRsZXMgdGhlIHBvcHVwJ3MgZW50aXJlIGxpZmVjeWNsZTsgbGlzdGVucyB0byBhdXRoXG4gKiBldmVudHNcbiAqXG4gKi9cbmNsYXNzIFBvcHVwT3BlcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3RQb3B1cFJlZGlyZWN0T3BlcmF0aW9uIHtcbiAgLy8gT25seSBvbmUgcG9wdXAgaXMgZXZlciBzaG93biBhdCBvbmNlLiBUaGUgbGlmZWN5Y2xlIG9mIHRoZSBjdXJyZW50IHBvcHVwXG4gIC8vIGNhbiBiZSBtYW5hZ2VkIC8gY2FuY2VsbGVkIGJ5IHRoZSBjb25zdHJ1Y3Rvci5cbiAgcHJpdmF0ZSBzdGF0aWMgY3VycmVudFBvcHVwQWN0aW9uOiBQb3B1cE9wZXJhdGlvbiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGF1dGhXaW5kb3c6IEF1dGhQb3B1cCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHBvbGxJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgYXV0aDogQXV0aEludGVybmFsLFxuICAgIGZpbHRlcjogQXV0aEV2ZW50VHlwZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByb3ZpZGVyOiBBdXRoUHJvdmlkZXIsXG4gICAgcmVzb2x2ZXI6IFBvcHVwUmVkaXJlY3RSZXNvbHZlckludGVybmFsLFxuICAgIHVzZXI/OiBVc2VySW50ZXJuYWxcbiAgKSB7XG4gICAgc3VwZXIoYXV0aCwgZmlsdGVyLCByZXNvbHZlciwgdXNlcik7XG4gICAgaWYgKFBvcHVwT3BlcmF0aW9uLmN1cnJlbnRQb3B1cEFjdGlvbikge1xuICAgICAgUG9wdXBPcGVyYXRpb24uY3VycmVudFBvcHVwQWN0aW9uLmNhbmNlbCgpO1xuICAgIH1cblxuICAgIFBvcHVwT3BlcmF0aW9uLmN1cnJlbnRQb3B1cEFjdGlvbiA9IHRoaXM7XG4gIH1cblxuICBhc3luYyBleGVjdXRlTm90TnVsbCgpOiBQcm9taXNlPFVzZXJDcmVkZW50aWFsPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjdXRlKCk7XG4gICAgX2Fzc2VydChyZXN1bHQsIHRoaXMuYXV0aCwgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGFzeW5jIG9uRXhlY3V0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGRlYnVnQXNzZXJ0KFxuICAgICAgdGhpcy5maWx0ZXIubGVuZ3RoID09PSAxLFxuICAgICAgJ1BvcHVwIG9wZXJhdGlvbnMgb25seSBoYW5kbGUgb25lIGV2ZW50J1xuICAgICk7XG4gICAgY29uc3QgZXZlbnRJZCA9IF9nZW5lcmF0ZUV2ZW50SWQoKTtcbiAgICB0aGlzLmF1dGhXaW5kb3cgPSBhd2FpdCB0aGlzLnJlc29sdmVyLl9vcGVuUG9wdXAoXG4gICAgICB0aGlzLmF1dGgsXG4gICAgICB0aGlzLnByb3ZpZGVyLFxuICAgICAgdGhpcy5maWx0ZXJbMF0sIC8vIFRoZXJlJ3MgYWx3YXlzIG9uZSwgc2VlIGNvbnN0cnVjdG9yXG4gICAgICBldmVudElkXG4gICAgKTtcbiAgICB0aGlzLmF1dGhXaW5kb3cuYXNzb2NpYXRlZEV2ZW50ID0gZXZlbnRJZDtcblxuICAgIC8vIENoZWNrIGZvciB3ZWIgc3RvcmFnZSBzdXBwb3J0IGFuZCBvcmlnaW4gdmFsaWRhdGlvbiBfYWZ0ZXJfIHRoZSBwb3B1cCBpc1xuICAgIC8vIGxvYWRlZC4gVGhlc2Ugb3BlcmF0aW9ucyBhcmUgc2xvdyAofjEgc2Vjb25kIG9yIHNvKSBSYXRoZXIgdGhhblxuICAgIC8vIHdhaXRpbmcgb24gdGhlbSBiZWZvcmUgb3BlbmluZyB0aGUgd2luZG93LCBvcHRpbWlzdGljYWxseSBvcGVuIHRoZSBwb3B1cFxuICAgIC8vIGFuZCBjaGVjayBmb3Igc3RvcmFnZSBzdXBwb3J0IGF0IHRoZSBzYW1lIHRpbWUuIElmIHN0b3JhZ2Ugc3VwcG9ydCBpc1xuICAgIC8vIG5vdCBhdmFpbGFibGUsIHRoaXMgd2lsbCBjYXVzZSB0aGUgd2hvbGUgdGhpbmcgdG8gcmVqZWN0IHByb3Blcmx5LiBJdFxuICAgIC8vIHdpbGwgYWxzbyBjbG9zZSB0aGUgcG9wdXAsIGJ1dCBzaW5jZSB0aGUgcHJvbWlzZSBoYXMgYWxyZWFkeSByZWplY3RlZCxcbiAgICAvLyB0aGUgcG9wdXAgY2xvc2VkIGJ5IHVzZXIgcG9sbCB3aWxsIHJlamVjdCBpbnRvIHRoZSB2b2lkLlxuICAgIHRoaXMucmVzb2x2ZXIuX29yaWdpblZhbGlkYXRpb24odGhpcy5hdXRoKS5jYXRjaChlID0+IHtcbiAgICAgIHRoaXMucmVqZWN0KGUpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5yZXNvbHZlci5faXNJZnJhbWVXZWJTdG9yYWdlU3VwcG9ydGVkKHRoaXMuYXV0aCwgaXNTdXBwb3J0ZWQgPT4ge1xuICAgICAgaWYgKCFpc1N1cHBvcnRlZCkge1xuICAgICAgICB0aGlzLnJlamVjdChcbiAgICAgICAgICBfY3JlYXRlRXJyb3IodGhpcy5hdXRoLCBBdXRoRXJyb3JDb2RlLldFQl9TVE9SQUdFX1VOU1VQUE9SVEVEKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gSGFuZGxlIHVzZXIgY2xvc3VyZS4gTm90aWNlIHRoaXMgZG9lcyAqbm90KiB1c2UgYXdhaXRcbiAgICB0aGlzLnBvbGxVc2VyQ2FuY2VsbGF0aW9uKCk7XG4gIH1cblxuICBnZXQgZXZlbnRJZCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5hdXRoV2luZG93Py5hc3NvY2lhdGVkRXZlbnQgfHwgbnVsbDtcbiAgfVxuXG4gIGNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlamVjdChfY3JlYXRlRXJyb3IodGhpcy5hdXRoLCBBdXRoRXJyb3JDb2RlLkVYUElSRURfUE9QVVBfUkVRVUVTVCkpO1xuICB9XG5cbiAgY2xlYW5VcCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hdXRoV2luZG93KSB7XG4gICAgICB0aGlzLmF1dGhXaW5kb3cuY2xvc2UoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wb2xsSWQpIHtcbiAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5wb2xsSWQpO1xuICAgIH1cblxuICAgIHRoaXMuYXV0aFdpbmRvdyA9IG51bGw7XG4gICAgdGhpcy5wb2xsSWQgPSBudWxsO1xuICAgIFBvcHVwT3BlcmF0aW9uLmN1cnJlbnRQb3B1cEFjdGlvbiA9IG51bGw7XG4gIH1cblxuICBwcml2YXRlIHBvbGxVc2VyQ2FuY2VsbGF0aW9uKCk6IHZvaWQge1xuICAgIGNvbnN0IHBvbGwgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAodGhpcy5hdXRoV2luZG93Py53aW5kb3c/LmNsb3NlZCkge1xuICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGVyZSBpcyBzdWZmaWNpZW50IHRpbWUgZm9yIHdoYXRldmVyIGFjdGlvbiB0b1xuICAgICAgICAvLyBjb21wbGV0ZS4gVGhlIHdpbmRvdyBjb3VsZCBoYXZlIGNsb3NlZCBidXQgdGhlIHNpZ24gaW4gbmV0d29ya1xuICAgICAgICAvLyBjYWxsIGNvdWxkIHN0aWxsIGJlIGluIGZsaWdodC4gVGhpcyBpcyBzcGVjaWZpY2FsbHkgdHJ1ZSBmb3JcbiAgICAgICAgLy8gRmlyZWZveCBvciBpZiB0aGUgb3BlbmVyIGlzIGluIGFuIGlmcmFtZSwgaW4gd2hpY2ggY2FzZSB0aGUgb2F1dGhcbiAgICAgICAgLy8gaGVscGVyIGNsb3NlcyB0aGUgcG9wdXAuXG4gICAgICAgIHRoaXMucG9sbElkID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMucG9sbElkID0gbnVsbDtcbiAgICAgICAgICB0aGlzLnJlamVjdChcbiAgICAgICAgICAgIF9jcmVhdGVFcnJvcih0aGlzLmF1dGgsIEF1dGhFcnJvckNvZGUuUE9QVVBfQ0xPU0VEX0JZX1VTRVIpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSwgX1RpbWVvdXQuQVVUSF9FVkVOVCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wb2xsSWQgPSB3aW5kb3cuc2V0VGltZW91dChwb2xsLCBfUE9MTF9XSU5ET1dfQ0xPU0VfVElNRU9VVC5nZXQoKSk7XG4gICAgfTtcblxuICAgIHBvbGwoKTtcbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEF1dGhJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL2F1dGgnO1xuaW1wb3J0IHtcbiAgQXV0aEV2ZW50LFxuICBBdXRoRXZlbnRUeXBlLFxuICBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJJbnRlcm5hbFxufSBmcm9tICcuLi8uLi9tb2RlbC9wb3B1cF9yZWRpcmVjdCc7XG5pbXBvcnQgeyBVc2VyQ3JlZGVudGlhbEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvdXNlcic7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUludGVybmFsIH0gZnJvbSAnLi4vcGVyc2lzdGVuY2UnO1xuaW1wb3J0IHsgX3BlcnNpc3RlbmNlS2V5TmFtZSB9IGZyb20gJy4uL3BlcnNpc3RlbmNlL3BlcnNpc3RlbmNlX3VzZXJfbWFuYWdlcic7XG5pbXBvcnQgeyBfZ2V0SW5zdGFuY2UgfSBmcm9tICcuLi91dGlsL2luc3RhbnRpYXRvcic7XG5pbXBvcnQgeyBBYnN0cmFjdFBvcHVwUmVkaXJlY3RPcGVyYXRpb24gfSBmcm9tICcuL2Fic3RyYWN0X3BvcHVwX3JlZGlyZWN0X29wZXJhdGlvbic7XG5cbmNvbnN0IFBFTkRJTkdfUkVESVJFQ1RfS0VZID0gJ3BlbmRpbmdSZWRpcmVjdCc7XG5cbi8vIFdlIG9ubHkgZ2V0IG9uZSByZWRpcmVjdCBvdXRjb21lIGZvciBhbnkgb25lIGF1dGgsIHNvIGp1c3Qgc3RvcmUgaXRcbi8vIGluIGhlcmUuXG5jb25zdCByZWRpcmVjdE91dGNvbWVNYXA6IE1hcDxcbiAgc3RyaW5nLFxuICAoKSA9PiBQcm9taXNlPFVzZXJDcmVkZW50aWFsSW50ZXJuYWwgfCBudWxsPlxuPiA9IG5ldyBNYXAoKTtcblxuZXhwb3J0IGNsYXNzIFJlZGlyZWN0QWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RQb3B1cFJlZGlyZWN0T3BlcmF0aW9uIHtcbiAgZXZlbnRJZCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgYXV0aDogQXV0aEludGVybmFsLFxuICAgIHJlc29sdmVyOiBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJJbnRlcm5hbCxcbiAgICBieXBhc3NBdXRoU3RhdGUgPSBmYWxzZVxuICApIHtcbiAgICBzdXBlcihcbiAgICAgIGF1dGgsXG4gICAgICBbXG4gICAgICAgIEF1dGhFdmVudFR5cGUuU0lHTl9JTl9WSUFfUkVESVJFQ1QsXG4gICAgICAgIEF1dGhFdmVudFR5cGUuTElOS19WSUFfUkVESVJFQ1QsXG4gICAgICAgIEF1dGhFdmVudFR5cGUuUkVBVVRIX1ZJQV9SRURJUkVDVCxcbiAgICAgICAgQXV0aEV2ZW50VHlwZS5VTktOT1dOXG4gICAgICBdLFxuICAgICAgcmVzb2x2ZXIsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBieXBhc3NBdXRoU3RhdGVcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSBleGVjdXRlIGZ1bmN0aW9uOyBpZiB3ZSBhbHJlYWR5IGhhdmUgYSByZWRpcmVjdCByZXN1bHQsIHRoZW5cbiAgICoganVzdCByZXR1cm4gaXQuXG4gICAqL1xuICBhc3luYyBleGVjdXRlKCk6IFByb21pc2U8VXNlckNyZWRlbnRpYWxJbnRlcm5hbCB8IG51bGw+IHtcbiAgICBsZXQgcmVhZHlPdXRjb21lID0gcmVkaXJlY3RPdXRjb21lTWFwLmdldCh0aGlzLmF1dGguX2tleSgpKTtcbiAgICBpZiAoIXJlYWR5T3V0Y29tZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaGFzUGVuZGluZ1JlZGlyZWN0ID0gYXdhaXQgX2dldEFuZENsZWFyUGVuZGluZ1JlZGlyZWN0U3RhdHVzKFxuICAgICAgICAgIHRoaXMucmVzb2x2ZXIsXG4gICAgICAgICAgdGhpcy5hdXRoXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGhhc1BlbmRpbmdSZWRpcmVjdCA/IGF3YWl0IHN1cGVyLmV4ZWN1dGUoKSA6IG51bGw7XG4gICAgICAgIHJlYWR5T3V0Y29tZSA9ICgpID0+IFByb21pc2UucmVzb2x2ZShyZXN1bHQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWFkeU91dGNvbWUgPSAoKSA9PiBQcm9taXNlLnJlamVjdChlKTtcbiAgICAgIH1cblxuICAgICAgcmVkaXJlY3RPdXRjb21lTWFwLnNldCh0aGlzLmF1dGguX2tleSgpLCByZWFkeU91dGNvbWUpO1xuICAgIH1cblxuICAgIC8vIElmIHdlJ3JlIG5vdCBieXBhc3NpbmcgYXV0aCBzdGF0ZSwgdGhlIHJlYWR5IG91dGNvbWUgc2hvdWxkIGJlIHNldCB0b1xuICAgIC8vIG51bGwuXG4gICAgaWYgKCF0aGlzLmJ5cGFzc0F1dGhTdGF0ZSkge1xuICAgICAgcmVkaXJlY3RPdXRjb21lTWFwLnNldCh0aGlzLmF1dGguX2tleSgpLCAoKSA9PiBQcm9taXNlLnJlc29sdmUobnVsbCkpO1xuICAgIH1cblxuICAgIHJldHVybiByZWFkeU91dGNvbWUoKTtcbiAgfVxuXG4gIGFzeW5jIG9uQXV0aEV2ZW50KGV2ZW50OiBBdXRoRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gQXV0aEV2ZW50VHlwZS5TSUdOX0lOX1ZJQV9SRURJUkVDVCkge1xuICAgICAgcmV0dXJuIHN1cGVyLm9uQXV0aEV2ZW50KGV2ZW50KTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LnR5cGUgPT09IEF1dGhFdmVudFR5cGUuVU5LTk9XTikge1xuICAgICAgLy8gVGhpcyBpcyBhIHNlbnRpbmVsIHZhbHVlIGluZGljYXRpbmcgdGhlcmUncyBubyBwZW5kaW5nIHJlZGlyZWN0XG4gICAgICB0aGlzLnJlc29sdmUobnVsbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LmV2ZW50SWQpIHtcbiAgICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLmF1dGguX3JlZGlyZWN0VXNlckZvcklkKGV2ZW50LmV2ZW50SWQpO1xuICAgICAgaWYgKHVzZXIpIHtcbiAgICAgICAgdGhpcy51c2VyID0gdXNlcjtcbiAgICAgICAgcmV0dXJuIHN1cGVyLm9uQXV0aEV2ZW50KGV2ZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVzb2x2ZShudWxsKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBvbkV4ZWN1dGlvbigpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgY2xlYW5VcCgpOiB2b2lkIHt9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBfZ2V0QW5kQ2xlYXJQZW5kaW5nUmVkaXJlY3RTdGF0dXMoXG4gIHJlc29sdmVyOiBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJJbnRlcm5hbCxcbiAgYXV0aDogQXV0aEludGVybmFsXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3Qga2V5ID0gcGVuZGluZ1JlZGlyZWN0S2V5KGF1dGgpO1xuICBjb25zdCBwZXJzaXN0ZW5jZSA9IHJlc29sdmVyUGVyc2lzdGVuY2UocmVzb2x2ZXIpO1xuICBpZiAoIShhd2FpdCBwZXJzaXN0ZW5jZS5faXNBdmFpbGFibGUoKSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgaGFzUGVuZGluZ1JlZGlyZWN0ID0gKGF3YWl0IHBlcnNpc3RlbmNlLl9nZXQoa2V5KSkgPT09ICd0cnVlJztcbiAgYXdhaXQgcGVyc2lzdGVuY2UuX3JlbW92ZShrZXkpO1xuICByZXR1cm4gaGFzUGVuZGluZ1JlZGlyZWN0O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gX3NldFBlbmRpbmdSZWRpcmVjdFN0YXR1cyhcbiAgcmVzb2x2ZXI6IFBvcHVwUmVkaXJlY3RSZXNvbHZlckludGVybmFsLFxuICBhdXRoOiBBdXRoSW50ZXJuYWxcbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gcmVzb2x2ZXJQZXJzaXN0ZW5jZShyZXNvbHZlcikuX3NldChwZW5kaW5nUmVkaXJlY3RLZXkoYXV0aCksICd0cnVlJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfY2xlYXJSZWRpcmVjdE91dGNvbWVzKCk6IHZvaWQge1xuICByZWRpcmVjdE91dGNvbWVNYXAuY2xlYXIoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9vdmVycmlkZVJlZGlyZWN0UmVzdWx0KFxuICBhdXRoOiBBdXRoSW50ZXJuYWwsXG4gIHJlc3VsdDogKCkgPT4gUHJvbWlzZTxVc2VyQ3JlZGVudGlhbEludGVybmFsIHwgbnVsbD5cbik6IHZvaWQge1xuICByZWRpcmVjdE91dGNvbWVNYXAuc2V0KGF1dGguX2tleSgpLCByZXN1bHQpO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlclBlcnNpc3RlbmNlKFxuICByZXNvbHZlcjogUG9wdXBSZWRpcmVjdFJlc29sdmVySW50ZXJuYWxcbik6IFBlcnNpc3RlbmNlSW50ZXJuYWwge1xuICByZXR1cm4gX2dldEluc3RhbmNlKHJlc29sdmVyLl9yZWRpcmVjdFBlcnNpc3RlbmNlKTtcbn1cblxuZnVuY3Rpb24gcGVuZGluZ1JlZGlyZWN0S2V5KGF1dGg6IEF1dGhJbnRlcm5hbCk6IHN0cmluZyB7XG4gIHJldHVybiBfcGVyc2lzdGVuY2VLZXlOYW1lKFxuICAgIFBFTkRJTkdfUkVESVJFQ1RfS0VZLFxuICAgIGF1dGguY29uZmlnLmFwaUtleSxcbiAgICBhdXRoLm5hbWVcbiAgKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge1xuICBBdXRoLFxuICBBdXRoUHJvdmlkZXIsXG4gIFBvcHVwUmVkaXJlY3RSZXNvbHZlcixcbiAgVXNlcixcbiAgVXNlckNyZWRlbnRpYWxcbn0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcblxuaW1wb3J0IHsgX2Nhc3RBdXRoIH0gZnJvbSAnLi4vLi4vY29yZS9hdXRoL2F1dGhfaW1wbCc7XG5pbXBvcnQgeyBfYXNzZXJ0TGlua2VkU3RhdHVzIH0gZnJvbSAnLi4vLi4vY29yZS91c2VyL2xpbmtfdW5saW5rJztcbmltcG9ydCB7IF9hc3NlcnRJbnN0YW5jZU9mIH0gZnJvbSAnLi4vLi4vY29yZS91dGlsL2Fzc2VydCc7XG5pbXBvcnQgeyBfZ2VuZXJhdGVFdmVudElkIH0gZnJvbSAnLi4vLi4vY29yZS91dGlsL2V2ZW50X2lkJztcbmltcG9ydCB7IEF1dGhFdmVudFR5cGUgfSBmcm9tICcuLi8uLi9tb2RlbC9wb3B1cF9yZWRpcmVjdCc7XG5pbXBvcnQgeyBVc2VySW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC91c2VyJztcbmltcG9ydCB7IF93aXRoRGVmYXVsdFJlc29sdmVyIH0gZnJvbSAnLi4vLi4vY29yZS91dGlsL3Jlc29sdmVyJztcbmltcG9ydCB7XG4gIFJlZGlyZWN0QWN0aW9uLFxuICBfc2V0UGVuZGluZ1JlZGlyZWN0U3RhdHVzXG59IGZyb20gJy4uLy4uL2NvcmUvc3RyYXRlZ2llcy9yZWRpcmVjdCc7XG5pbXBvcnQgeyBGZWRlcmF0ZWRBdXRoUHJvdmlkZXIgfSBmcm9tICcuLi8uLi9jb3JlL3Byb3ZpZGVycy9mZWRlcmF0ZWQnO1xuaW1wb3J0IHsgZ2V0TW9kdWxhckluc3RhbmNlIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuXG4vKipcbiAqIEF1dGhlbnRpY2F0ZXMgYSBGaXJlYmFzZSBjbGllbnQgdXNpbmcgYSBmdWxsLXBhZ2UgcmVkaXJlY3QgZmxvdy5cbiAqXG4gKiBAcmVtYXJrc1xuICogVG8gaGFuZGxlIHRoZSByZXN1bHRzIGFuZCBlcnJvcnMgZm9yIHRoaXMgb3BlcmF0aW9uLCByZWZlciB0byB7QGxpbmsgZ2V0UmVkaXJlY3RSZXN1bHR9LlxuICogRm9sbG93IHRoZSB7QGxpbmsgaHR0cHM6Ly9maXJlYmFzZS5nb29nbGUuY29tL2RvY3MvYXV0aC93ZWIvcmVkaXJlY3QtYmVzdC1wcmFjdGljZXNcbiAqIHwgYmVzdCBwcmFjdGljZXN9IHdoZW4gdXNpbmcge0BsaW5rIHNpZ25JbldpdGhSZWRpcmVjdH0uXG4gKlxuICogVGhpcyBtZXRob2QgZG9lcyBub3Qgd29yayBpbiBhIE5vZGUuanMgZW52aXJvbm1lbnQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGphdmFzY3JpcHRcbiAqIC8vIFNpZ24gaW4gdXNpbmcgYSByZWRpcmVjdC5cbiAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IEZhY2Vib29rQXV0aFByb3ZpZGVyKCk7XG4gKiAvLyBZb3UgY2FuIGFkZCBhZGRpdGlvbmFsIHNjb3BlcyB0byB0aGUgcHJvdmlkZXI6XG4gKiBwcm92aWRlci5hZGRTY29wZSgndXNlcl9iaXJ0aGRheScpO1xuICogLy8gU3RhcnQgYSBzaWduIGluIHByb2Nlc3MgZm9yIGFuIHVuYXV0aGVudGljYXRlZCB1c2VyLlxuICogYXdhaXQgc2lnbkluV2l0aFJlZGlyZWN0KGF1dGgsIHByb3ZpZGVyKTtcbiAqIC8vIFRoaXMgd2lsbCB0cmlnZ2VyIGEgZnVsbCBwYWdlIHJlZGlyZWN0IGF3YXkgZnJvbSB5b3VyIGFwcFxuICpcbiAqIC8vIEFmdGVyIHJldHVybmluZyBmcm9tIHRoZSByZWRpcmVjdCB3aGVuIHlvdXIgYXBwIGluaXRpYWxpemVzIHlvdSBjYW4gb2J0YWluIHRoZSByZXN1bHRcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldFJlZGlyZWN0UmVzdWx0KGF1dGgpO1xuICogaWYgKHJlc3VsdCkge1xuICogICAvLyBUaGlzIGlzIHRoZSBzaWduZWQtaW4gdXNlclxuICogICBjb25zdCB1c2VyID0gcmVzdWx0LnVzZXI7XG4gKiAgIC8vIFRoaXMgZ2l2ZXMgeW91IGEgRmFjZWJvb2sgQWNjZXNzIFRva2VuLlxuICogICBjb25zdCBjcmVkZW50aWFsID0gcHJvdmlkZXIuY3JlZGVudGlhbEZyb21SZXN1bHQoYXV0aCwgcmVzdWx0KTtcbiAqICAgY29uc3QgdG9rZW4gPSBjcmVkZW50aWFsLmFjY2Vzc1Rva2VuO1xuICogfVxuICogLy8gQXMgdGhpcyBBUEkgY2FuIGJlIHVzZWQgZm9yIHNpZ24taW4sIGxpbmtpbmcgYW5kIHJlYXV0aGVudGljYXRpb24sXG4gKiAvLyBjaGVjayB0aGUgb3BlcmF0aW9uVHlwZSB0byBkZXRlcm1pbmUgd2hhdCB0cmlnZ2VyZWQgdGhpcyByZWRpcmVjdFxuICogLy8gb3BlcmF0aW9uLlxuICogY29uc3Qgb3BlcmF0aW9uVHlwZSA9IHJlc3VsdC5vcGVyYXRpb25UeXBlO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxuICogQHBhcmFtIHByb3ZpZGVyIC0gVGhlIHByb3ZpZGVyIHRvIGF1dGhlbnRpY2F0ZS4gVGhlIHByb3ZpZGVyIGhhcyB0byBiZSBhbiB7QGxpbmsgT0F1dGhQcm92aWRlcn0uXG4gKiBOb24tT0F1dGggcHJvdmlkZXJzIGxpa2Uge0BsaW5rIEVtYWlsQXV0aFByb3ZpZGVyfSB3aWxsIHRocm93IGFuIGVycm9yLlxuICogQHBhcmFtIHJlc29sdmVyIC0gQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFBvcHVwUmVkaXJlY3RSZXNvbHZlcn0sIG9wdGlvbmFsXG4gKiBpZiBhbHJlYWR5IHN1cHBsaWVkIHRvIHtAbGluayBpbml0aWFsaXplQXV0aH0gb3IgcHJvdmlkZWQgYnkge0BsaW5rIGdldEF1dGh9LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25JbldpdGhSZWRpcmVjdChcbiAgYXV0aDogQXV0aCxcbiAgcHJvdmlkZXI6IEF1dGhQcm92aWRlcixcbiAgcmVzb2x2ZXI/OiBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJcbik6IFByb21pc2U8bmV2ZXI+IHtcbiAgcmV0dXJuIF9zaWduSW5XaXRoUmVkaXJlY3QoYXV0aCwgcHJvdmlkZXIsIHJlc29sdmVyKSBhcyBQcm9taXNlPG5ldmVyPjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF9zaWduSW5XaXRoUmVkaXJlY3QoXG4gIGF1dGg6IEF1dGgsXG4gIHByb3ZpZGVyOiBBdXRoUHJvdmlkZXIsXG4gIHJlc29sdmVyPzogUG9wdXBSZWRpcmVjdFJlc29sdmVyXG4pOiBQcm9taXNlPHZvaWQgfCBuZXZlcj4ge1xuICBjb25zdCBhdXRoSW50ZXJuYWwgPSBfY2FzdEF1dGgoYXV0aCk7XG4gIF9hc3NlcnRJbnN0YW5jZU9mKGF1dGgsIHByb3ZpZGVyLCBGZWRlcmF0ZWRBdXRoUHJvdmlkZXIpO1xuICAvLyBXYWl0IGZvciBhdXRoIGluaXRpYWxpemF0aW9uIHRvIGNvbXBsZXRlLCB0aGlzIHdpbGwgcHJvY2VzcyBwZW5kaW5nIHJlZGlyZWN0cyBhbmQgY2xlYXIgdGhlXG4gIC8vIFBFTkRJTkdfUkVESVJFQ1RfS0VZIGluIHBlcnNpc3RlbmNlLiBUaGlzIHNob3VsZCBiZSBjb21wbGV0ZWQgYmVmb3JlIHN0YXJ0aW5nIGEgbmV3XG4gIC8vIHJlZGlyZWN0IGFuZCBjcmVhdGluZyBhIFBFTkRJTkdfUkVESVJFQ1RfS0VZIGVudHJ5LlxuICBhd2FpdCBhdXRoSW50ZXJuYWwuX2luaXRpYWxpemF0aW9uUHJvbWlzZTtcbiAgY29uc3QgcmVzb2x2ZXJJbnRlcm5hbCA9IF93aXRoRGVmYXVsdFJlc29sdmVyKGF1dGhJbnRlcm5hbCwgcmVzb2x2ZXIpO1xuICBhd2FpdCBfc2V0UGVuZGluZ1JlZGlyZWN0U3RhdHVzKHJlc29sdmVySW50ZXJuYWwsIGF1dGhJbnRlcm5hbCk7XG5cbiAgcmV0dXJuIHJlc29sdmVySW50ZXJuYWwuX29wZW5SZWRpcmVjdChcbiAgICBhdXRoSW50ZXJuYWwsXG4gICAgcHJvdmlkZXIsXG4gICAgQXV0aEV2ZW50VHlwZS5TSUdOX0lOX1ZJQV9SRURJUkVDVFxuICApO1xufVxuXG4vKipcbiAqIFJlYXV0aGVudGljYXRlcyB0aGUgY3VycmVudCB1c2VyIHdpdGggdGhlIHNwZWNpZmllZCB7QGxpbmsgT0F1dGhQcm92aWRlcn0gdXNpbmcgYSBmdWxsLXBhZ2UgcmVkaXJlY3QgZmxvdy5cbiAqIEByZW1hcmtzXG4gKiBUbyBoYW5kbGUgdGhlIHJlc3VsdHMgYW5kIGVycm9ycyBmb3IgdGhpcyBvcGVyYXRpb24sIHJlZmVyIHRvIHtAbGluayBnZXRSZWRpcmVjdFJlc3VsdH0uXG4gKiBGb2xsb3cgdGhlIHtAbGluayBodHRwczovL2ZpcmViYXNlLmdvb2dsZS5jb20vZG9jcy9hdXRoL3dlYi9yZWRpcmVjdC1iZXN0LXByYWN0aWNlc1xuICogfCBiZXN0IHByYWN0aWNlc30gd2hlbiB1c2luZyB7QGxpbmsgcmVhdXRoZW50aWNhdGVXaXRoUmVkaXJlY3R9LlxuICpcbiAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHdvcmsgaW4gYSBOb2RlLmpzIGVudmlyb25tZW50LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiAvLyBTaWduIGluIHVzaW5nIGEgcmVkaXJlY3QuXG4gKiBjb25zdCBwcm92aWRlciA9IG5ldyBGYWNlYm9va0F1dGhQcm92aWRlcigpO1xuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc2lnbkluV2l0aFJlZGlyZWN0KGF1dGgsIHByb3ZpZGVyKTtcbiAqIC8vIFRoaXMgd2lsbCB0cmlnZ2VyIGEgZnVsbCBwYWdlIHJlZGlyZWN0IGF3YXkgZnJvbSB5b3VyIGFwcFxuICpcbiAqIC8vIEFmdGVyIHJldHVybmluZyBmcm9tIHRoZSByZWRpcmVjdCB3aGVuIHlvdXIgYXBwIGluaXRpYWxpemVzIHlvdSBjYW4gb2J0YWluIHRoZSByZXN1bHRcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldFJlZGlyZWN0UmVzdWx0KGF1dGgpO1xuICogLy8gUmVhdXRoZW50aWNhdGUgdXNpbmcgYSByZWRpcmVjdC5cbiAqIGF3YWl0IHJlYXV0aGVudGljYXRlV2l0aFJlZGlyZWN0KHJlc3VsdC51c2VyLCBwcm92aWRlcik7XG4gKiAvLyBUaGlzIHdpbGwgYWdhaW4gdHJpZ2dlciBhIGZ1bGwgcGFnZSByZWRpcmVjdCBhd2F5IGZyb20geW91ciBhcHBcbiAqXG4gKiAvLyBBZnRlciByZXR1cm5pbmcgZnJvbSB0aGUgcmVkaXJlY3Qgd2hlbiB5b3VyIGFwcCBpbml0aWFsaXplcyB5b3UgY2FuIG9idGFpbiB0aGUgcmVzdWx0XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRSZWRpcmVjdFJlc3VsdChhdXRoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIuXG4gKiBAcGFyYW0gcHJvdmlkZXIgLSBUaGUgcHJvdmlkZXIgdG8gYXV0aGVudGljYXRlLiBUaGUgcHJvdmlkZXIgaGFzIHRvIGJlIGFuIHtAbGluayBPQXV0aFByb3ZpZGVyfS5cbiAqIE5vbi1PQXV0aCBwcm92aWRlcnMgbGlrZSB7QGxpbmsgRW1haWxBdXRoUHJvdmlkZXJ9IHdpbGwgdGhyb3cgYW4gZXJyb3IuXG4gKiBAcGFyYW0gcmVzb2x2ZXIgLSBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgUG9wdXBSZWRpcmVjdFJlc29sdmVyfSwgb3B0aW9uYWxcbiAqIGlmIGFscmVhZHkgc3VwcGxpZWQgdG8ge0BsaW5rIGluaXRpYWxpemVBdXRofSBvciBwcm92aWRlZCBieSB7QGxpbmsgZ2V0QXV0aH0uXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhdXRoZW50aWNhdGVXaXRoUmVkaXJlY3QoXG4gIHVzZXI6IFVzZXIsXG4gIHByb3ZpZGVyOiBBdXRoUHJvdmlkZXIsXG4gIHJlc29sdmVyPzogUG9wdXBSZWRpcmVjdFJlc29sdmVyXG4pOiBQcm9taXNlPG5ldmVyPiB7XG4gIHJldHVybiBfcmVhdXRoZW50aWNhdGVXaXRoUmVkaXJlY3QoXG4gICAgdXNlcixcbiAgICBwcm92aWRlcixcbiAgICByZXNvbHZlclxuICApIGFzIFByb21pc2U8bmV2ZXI+O1xufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF9yZWF1dGhlbnRpY2F0ZVdpdGhSZWRpcmVjdChcbiAgdXNlcjogVXNlcixcbiAgcHJvdmlkZXI6IEF1dGhQcm92aWRlcixcbiAgcmVzb2x2ZXI/OiBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJcbik6IFByb21pc2U8dm9pZCB8IG5ldmVyPiB7XG4gIGNvbnN0IHVzZXJJbnRlcm5hbCA9IGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyKSBhcyBVc2VySW50ZXJuYWw7XG4gIF9hc3NlcnRJbnN0YW5jZU9mKHVzZXJJbnRlcm5hbC5hdXRoLCBwcm92aWRlciwgRmVkZXJhdGVkQXV0aFByb3ZpZGVyKTtcbiAgLy8gV2FpdCBmb3IgYXV0aCBpbml0aWFsaXphdGlvbiB0byBjb21wbGV0ZSwgdGhpcyB3aWxsIHByb2Nlc3MgcGVuZGluZyByZWRpcmVjdHMgYW5kIGNsZWFyIHRoZVxuICAvLyBQRU5ESU5HX1JFRElSRUNUX0tFWSBpbiBwZXJzaXN0ZW5jZS4gVGhpcyBzaG91bGQgYmUgY29tcGxldGVkIGJlZm9yZSBzdGFydGluZyBhIG5ld1xuICAvLyByZWRpcmVjdCBhbmQgY3JlYXRpbmcgYSBQRU5ESU5HX1JFRElSRUNUX0tFWSBlbnRyeS5cbiAgYXdhaXQgdXNlckludGVybmFsLmF1dGguX2luaXRpYWxpemF0aW9uUHJvbWlzZTtcbiAgLy8gQWxsb3cgdGhlIHJlc29sdmVyIHRvIGVycm9yIGJlZm9yZSBwZXJzaXN0aW5nIHRoZSByZWRpcmVjdCB1c2VyXG4gIGNvbnN0IHJlc29sdmVySW50ZXJuYWwgPSBfd2l0aERlZmF1bHRSZXNvbHZlcih1c2VySW50ZXJuYWwuYXV0aCwgcmVzb2x2ZXIpO1xuICBhd2FpdCBfc2V0UGVuZGluZ1JlZGlyZWN0U3RhdHVzKHJlc29sdmVySW50ZXJuYWwsIHVzZXJJbnRlcm5hbC5hdXRoKTtcblxuICBjb25zdCBldmVudElkID0gYXdhaXQgcHJlcGFyZVVzZXJGb3JSZWRpcmVjdCh1c2VySW50ZXJuYWwpO1xuICByZXR1cm4gcmVzb2x2ZXJJbnRlcm5hbC5fb3BlblJlZGlyZWN0KFxuICAgIHVzZXJJbnRlcm5hbC5hdXRoLFxuICAgIHByb3ZpZGVyLFxuICAgIEF1dGhFdmVudFR5cGUuUkVBVVRIX1ZJQV9SRURJUkVDVCxcbiAgICBldmVudElkXG4gICk7XG59XG5cbi8qKlxuICogTGlua3MgdGhlIHtAbGluayBPQXV0aFByb3ZpZGVyfSB0byB0aGUgdXNlciBhY2NvdW50IHVzaW5nIGEgZnVsbC1wYWdlIHJlZGlyZWN0IGZsb3cuXG4gKiBAcmVtYXJrc1xuICogVG8gaGFuZGxlIHRoZSByZXN1bHRzIGFuZCBlcnJvcnMgZm9yIHRoaXMgb3BlcmF0aW9uLCByZWZlciB0byB7QGxpbmsgZ2V0UmVkaXJlY3RSZXN1bHR9LlxuICogRm9sbG93IHRoZSB7QGxpbmsgaHR0cHM6Ly9maXJlYmFzZS5nb29nbGUuY29tL2RvY3MvYXV0aC93ZWIvcmVkaXJlY3QtYmVzdC1wcmFjdGljZXNcbiAqIHwgYmVzdCBwcmFjdGljZXN9IHdoZW4gdXNpbmcge0BsaW5rIGxpbmtXaXRoUmVkaXJlY3R9LlxuICpcbiAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHdvcmsgaW4gYSBOb2RlLmpzIGVudmlyb25tZW50LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiAvLyBTaWduIGluIHVzaW5nIHNvbWUgb3RoZXIgcHJvdmlkZXIuXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBzaWduSW5XaXRoRW1haWxBbmRQYXNzd29yZChhdXRoLCBlbWFpbCwgcGFzc3dvcmQpO1xuICogLy8gTGluayB1c2luZyBhIHJlZGlyZWN0LlxuICogY29uc3QgcHJvdmlkZXIgPSBuZXcgRmFjZWJvb2tBdXRoUHJvdmlkZXIoKTtcbiAqIGF3YWl0IGxpbmtXaXRoUmVkaXJlY3QocmVzdWx0LnVzZXIsIHByb3ZpZGVyKTtcbiAqIC8vIFRoaXMgd2lsbCB0cmlnZ2VyIGEgZnVsbCBwYWdlIHJlZGlyZWN0IGF3YXkgZnJvbSB5b3VyIGFwcFxuICpcbiAqIC8vIEFmdGVyIHJldHVybmluZyBmcm9tIHRoZSByZWRpcmVjdCB3aGVuIHlvdXIgYXBwIGluaXRpYWxpemVzIHlvdSBjYW4gb2J0YWluIHRoZSByZXN1bHRcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldFJlZGlyZWN0UmVzdWx0KGF1dGgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlci5cbiAqIEBwYXJhbSBwcm92aWRlciAtIFRoZSBwcm92aWRlciB0byBhdXRoZW50aWNhdGUuIFRoZSBwcm92aWRlciBoYXMgdG8gYmUgYW4ge0BsaW5rIE9BdXRoUHJvdmlkZXJ9LlxuICogTm9uLU9BdXRoIHByb3ZpZGVycyBsaWtlIHtAbGluayBFbWFpbEF1dGhQcm92aWRlcn0gd2lsbCB0aHJvdyBhbiBlcnJvci5cbiAqIEBwYXJhbSByZXNvbHZlciAtIEFuIGluc3RhbmNlIG9mIHtAbGluayBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJ9LCBvcHRpb25hbFxuICogaWYgYWxyZWFkeSBzdXBwbGllZCB0byB7QGxpbmsgaW5pdGlhbGl6ZUF1dGh9IG9yIHByb3ZpZGVkIGJ5IHtAbGluayBnZXRBdXRofS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaW5rV2l0aFJlZGlyZWN0KFxuICB1c2VyOiBVc2VyLFxuICBwcm92aWRlcjogQXV0aFByb3ZpZGVyLFxuICByZXNvbHZlcj86IFBvcHVwUmVkaXJlY3RSZXNvbHZlclxuKTogUHJvbWlzZTxuZXZlcj4ge1xuICByZXR1cm4gX2xpbmtXaXRoUmVkaXJlY3QodXNlciwgcHJvdmlkZXIsIHJlc29sdmVyKSBhcyBQcm9taXNlPG5ldmVyPjtcbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBfbGlua1dpdGhSZWRpcmVjdChcbiAgdXNlcjogVXNlcixcbiAgcHJvdmlkZXI6IEF1dGhQcm92aWRlcixcbiAgcmVzb2x2ZXI/OiBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJcbik6IFByb21pc2U8dm9pZCB8IG5ldmVyPiB7XG4gIGNvbnN0IHVzZXJJbnRlcm5hbCA9IGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyKSBhcyBVc2VySW50ZXJuYWw7XG4gIF9hc3NlcnRJbnN0YW5jZU9mKHVzZXJJbnRlcm5hbC5hdXRoLCBwcm92aWRlciwgRmVkZXJhdGVkQXV0aFByb3ZpZGVyKTtcbiAgLy8gV2FpdCBmb3IgYXV0aCBpbml0aWFsaXphdGlvbiB0byBjb21wbGV0ZSwgdGhpcyB3aWxsIHByb2Nlc3MgcGVuZGluZyByZWRpcmVjdHMgYW5kIGNsZWFyIHRoZVxuICAvLyBQRU5ESU5HX1JFRElSRUNUX0tFWSBpbiBwZXJzaXN0ZW5jZS4gVGhpcyBzaG91bGQgYmUgY29tcGxldGVkIGJlZm9yZSBzdGFydGluZyBhIG5ld1xuICAvLyByZWRpcmVjdCBhbmQgY3JlYXRpbmcgYSBQRU5ESU5HX1JFRElSRUNUX0tFWSBlbnRyeS5cbiAgYXdhaXQgdXNlckludGVybmFsLmF1dGguX2luaXRpYWxpemF0aW9uUHJvbWlzZTtcbiAgLy8gQWxsb3cgdGhlIHJlc29sdmVyIHRvIGVycm9yIGJlZm9yZSBwZXJzaXN0aW5nIHRoZSByZWRpcmVjdCB1c2VyXG4gIGNvbnN0IHJlc29sdmVySW50ZXJuYWwgPSBfd2l0aERlZmF1bHRSZXNvbHZlcih1c2VySW50ZXJuYWwuYXV0aCwgcmVzb2x2ZXIpO1xuICBhd2FpdCBfYXNzZXJ0TGlua2VkU3RhdHVzKGZhbHNlLCB1c2VySW50ZXJuYWwsIHByb3ZpZGVyLnByb3ZpZGVySWQpO1xuICBhd2FpdCBfc2V0UGVuZGluZ1JlZGlyZWN0U3RhdHVzKHJlc29sdmVySW50ZXJuYWwsIHVzZXJJbnRlcm5hbC5hdXRoKTtcblxuICBjb25zdCBldmVudElkID0gYXdhaXQgcHJlcGFyZVVzZXJGb3JSZWRpcmVjdCh1c2VySW50ZXJuYWwpO1xuICByZXR1cm4gcmVzb2x2ZXJJbnRlcm5hbC5fb3BlblJlZGlyZWN0KFxuICAgIHVzZXJJbnRlcm5hbC5hdXRoLFxuICAgIHByb3ZpZGVyLFxuICAgIEF1dGhFdmVudFR5cGUuTElOS19WSUFfUkVESVJFQ1QsXG4gICAgZXZlbnRJZFxuICApO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSB7QGxpbmsgVXNlckNyZWRlbnRpYWx9IGZyb20gdGhlIHJlZGlyZWN0LWJhc2VkIHNpZ24taW4gZmxvdy5cbiAqXG4gKiBAcmVtYXJrc1xuICogSWYgc2lnbi1pbiBzdWNjZWVkZWQsIHJldHVybnMgdGhlIHNpZ25lZCBpbiB1c2VyLiBJZiBzaWduLWluIHdhcyB1bnN1Y2Nlc3NmdWwsIGZhaWxzIHdpdGggYW5cbiAqIGVycm9yLiBJZiBubyByZWRpcmVjdCBvcGVyYXRpb24gd2FzIGNhbGxlZCwgcmV0dXJucyBgbnVsbGAuXG4gKlxuICogVGhpcyBtZXRob2QgZG9lcyBub3Qgd29yayBpbiBhIE5vZGUuanMgZW52aXJvbm1lbnQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGphdmFzY3JpcHRcbiAqIC8vIFNpZ24gaW4gdXNpbmcgYSByZWRpcmVjdC5cbiAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IEZhY2Vib29rQXV0aFByb3ZpZGVyKCk7XG4gKiAvLyBZb3UgY2FuIGFkZCBhZGRpdGlvbmFsIHNjb3BlcyB0byB0aGUgcHJvdmlkZXI6XG4gKiBwcm92aWRlci5hZGRTY29wZSgndXNlcl9iaXJ0aGRheScpO1xuICogLy8gU3RhcnQgYSBzaWduIGluIHByb2Nlc3MgZm9yIGFuIHVuYXV0aGVudGljYXRlZCB1c2VyLlxuICogYXdhaXQgc2lnbkluV2l0aFJlZGlyZWN0KGF1dGgsIHByb3ZpZGVyKTtcbiAqIC8vIFRoaXMgd2lsbCB0cmlnZ2VyIGEgZnVsbCBwYWdlIHJlZGlyZWN0IGF3YXkgZnJvbSB5b3VyIGFwcFxuICpcbiAqIC8vIEFmdGVyIHJldHVybmluZyBmcm9tIHRoZSByZWRpcmVjdCB3aGVuIHlvdXIgYXBwIGluaXRpYWxpemVzIHlvdSBjYW4gb2J0YWluIHRoZSByZXN1bHRcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldFJlZGlyZWN0UmVzdWx0KGF1dGgpO1xuICogaWYgKHJlc3VsdCkge1xuICogICAvLyBUaGlzIGlzIHRoZSBzaWduZWQtaW4gdXNlclxuICogICBjb25zdCB1c2VyID0gcmVzdWx0LnVzZXI7XG4gKiAgIC8vIFRoaXMgZ2l2ZXMgeW91IGEgRmFjZWJvb2sgQWNjZXNzIFRva2VuLlxuICogICBjb25zdCBjcmVkZW50aWFsID0gcHJvdmlkZXIuY3JlZGVudGlhbEZyb21SZXN1bHQoYXV0aCwgcmVzdWx0KTtcbiAqICAgY29uc3QgdG9rZW4gPSBjcmVkZW50aWFsLmFjY2Vzc1Rva2VuO1xuICogfVxuICogLy8gQXMgdGhpcyBBUEkgY2FuIGJlIHVzZWQgZm9yIHNpZ24taW4sIGxpbmtpbmcgYW5kIHJlYXV0aGVudGljYXRpb24sXG4gKiAvLyBjaGVjayB0aGUgb3BlcmF0aW9uVHlwZSB0byBkZXRlcm1pbmUgd2hhdCB0cmlnZ2VyZWQgdGhpcyByZWRpcmVjdFxuICogLy8gb3BlcmF0aW9uLlxuICogY29uc3Qgb3BlcmF0aW9uVHlwZSA9IHJlc3VsdC5vcGVyYXRpb25UeXBlO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxuICogQHBhcmFtIHJlc29sdmVyIC0gQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFBvcHVwUmVkaXJlY3RSZXNvbHZlcn0sIG9wdGlvbmFsXG4gKiBpZiBhbHJlYWR5IHN1cHBsaWVkIHRvIHtAbGluayBpbml0aWFsaXplQXV0aH0gb3IgcHJvdmlkZWQgYnkge0BsaW5rIGdldEF1dGh9LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFJlZGlyZWN0UmVzdWx0KFxuICBhdXRoOiBBdXRoLFxuICByZXNvbHZlcj86IFBvcHVwUmVkaXJlY3RSZXNvbHZlclxuKTogUHJvbWlzZTxVc2VyQ3JlZGVudGlhbCB8IG51bGw+IHtcbiAgYXdhaXQgX2Nhc3RBdXRoKGF1dGgpLl9pbml0aWFsaXphdGlvblByb21pc2U7XG4gIHJldHVybiBfZ2V0UmVkaXJlY3RSZXN1bHQoYXV0aCwgcmVzb2x2ZXIsIGZhbHNlKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF9nZXRSZWRpcmVjdFJlc3VsdChcbiAgYXV0aDogQXV0aCxcbiAgcmVzb2x2ZXJFeHRlcm4/OiBQb3B1cFJlZGlyZWN0UmVzb2x2ZXIsXG4gIGJ5cGFzc0F1dGhTdGF0ZSA9IGZhbHNlXG4pOiBQcm9taXNlPFVzZXJDcmVkZW50aWFsIHwgbnVsbD4ge1xuICBjb25zdCBhdXRoSW50ZXJuYWwgPSBfY2FzdEF1dGgoYXV0aCk7XG4gIGNvbnN0IHJlc29sdmVyID0gX3dpdGhEZWZhdWx0UmVzb2x2ZXIoYXV0aEludGVybmFsLCByZXNvbHZlckV4dGVybik7XG4gIGNvbnN0IGFjdGlvbiA9IG5ldyBSZWRpcmVjdEFjdGlvbihhdXRoSW50ZXJuYWwsIHJlc29sdmVyLCBieXBhc3NBdXRoU3RhdGUpO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBhY3Rpb24uZXhlY3V0ZSgpO1xuXG4gIGlmIChyZXN1bHQgJiYgIWJ5cGFzc0F1dGhTdGF0ZSkge1xuICAgIGRlbGV0ZSByZXN1bHQudXNlci5fcmVkaXJlY3RFdmVudElkO1xuICAgIGF3YWl0IGF1dGhJbnRlcm5hbC5fcGVyc2lzdFVzZXJJZkN1cnJlbnQocmVzdWx0LnVzZXIgYXMgVXNlckludGVybmFsKTtcbiAgICBhd2FpdCBhdXRoSW50ZXJuYWwuX3NldFJlZGlyZWN0VXNlcihudWxsLCByZXNvbHZlckV4dGVybik7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5hc3luYyBmdW5jdGlvbiBwcmVwYXJlVXNlckZvclJlZGlyZWN0KHVzZXI6IFVzZXJJbnRlcm5hbCk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGV2ZW50SWQgPSBfZ2VuZXJhdGVFdmVudElkKGAke3VzZXIudWlkfTo6OmApO1xuICB1c2VyLl9yZWRpcmVjdEV2ZW50SWQgPSBldmVudElkO1xuICBhd2FpdCB1c2VyLmF1dGguX3NldFJlZGlyZWN0VXNlcih1c2VyKTtcbiAgYXdhaXQgdXNlci5hdXRoLl9wZXJzaXN0VXNlcklmQ3VycmVudCh1c2VyKTtcbiAgcmV0dXJuIGV2ZW50SWQ7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgQXV0aEV2ZW50LFxuICBBdXRoRXZlbnRDb25zdW1lcixcbiAgQXV0aEV2ZW50VHlwZSxcbiAgRXZlbnRNYW5hZ2VyXG59IGZyb20gJy4uLy4uL21vZGVsL3BvcHVwX3JlZGlyZWN0JztcbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXV0aCc7XG5pbXBvcnQgeyBfY3JlYXRlRXJyb3IgfSBmcm9tICcuLi91dGlsL2Fzc2VydCc7XG5cbi8vIFRoZSBhbW91bnQgb2YgdGltZSB0byBzdG9yZSB0aGUgVUlEcyBvZiBzZWVuIGV2ZW50czsgdGhpcyBpc1xuLy8gc2V0IHRvIDEwIG1pbiBieSBkZWZhdWx0XG5jb25zdCBFVkVOVF9EVVBMSUNBVElPTl9DQUNIRV9EVVJBVElPTl9NUyA9IDEwICogNjAgKiAxMDAwO1xuXG5leHBvcnQgY2xhc3MgQXV0aEV2ZW50TWFuYWdlciBpbXBsZW1lbnRzIEV2ZW50TWFuYWdlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2FjaGVkRXZlbnRVaWRzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjb25zdW1lcnM6IFNldDxBdXRoRXZlbnRDb25zdW1lcj4gPSBuZXcgU2V0KCk7XG4gIHByb3RlY3RlZCBxdWV1ZWRSZWRpcmVjdEV2ZW50OiBBdXRoRXZlbnQgfCBudWxsID0gbnVsbDtcbiAgcHJvdGVjdGVkIGhhc0hhbmRsZWRQb3RlbnRpYWxSZWRpcmVjdCA9IGZhbHNlO1xuICBwcml2YXRlIGxhc3RQcm9jZXNzZWRFdmVudFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgYXV0aDogQXV0aEludGVybmFsKSB7fVxuXG4gIHJlZ2lzdGVyQ29uc3VtZXIoYXV0aEV2ZW50Q29uc3VtZXI6IEF1dGhFdmVudENvbnN1bWVyKTogdm9pZCB7XG4gICAgdGhpcy5jb25zdW1lcnMuYWRkKGF1dGhFdmVudENvbnN1bWVyKTtcblxuICAgIGlmIChcbiAgICAgIHRoaXMucXVldWVkUmVkaXJlY3RFdmVudCAmJlxuICAgICAgdGhpcy5pc0V2ZW50Rm9yQ29uc3VtZXIodGhpcy5xdWV1ZWRSZWRpcmVjdEV2ZW50LCBhdXRoRXZlbnRDb25zdW1lcilcbiAgICApIHtcbiAgICAgIHRoaXMuc2VuZFRvQ29uc3VtZXIodGhpcy5xdWV1ZWRSZWRpcmVjdEV2ZW50LCBhdXRoRXZlbnRDb25zdW1lcik7XG4gICAgICB0aGlzLnNhdmVFdmVudFRvQ2FjaGUodGhpcy5xdWV1ZWRSZWRpcmVjdEV2ZW50KTtcbiAgICAgIHRoaXMucXVldWVkUmVkaXJlY3RFdmVudCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgdW5yZWdpc3RlckNvbnN1bWVyKGF1dGhFdmVudENvbnN1bWVyOiBBdXRoRXZlbnRDb25zdW1lcik6IHZvaWQge1xuICAgIHRoaXMuY29uc3VtZXJzLmRlbGV0ZShhdXRoRXZlbnRDb25zdW1lcik7XG4gIH1cblxuICBvbkV2ZW50KGV2ZW50OiBBdXRoRXZlbnQpOiBib29sZWFuIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgZXZlbnQgaGFzIGFscmVhZHkgYmVlbiBoYW5kbGVkXG4gICAgaWYgKHRoaXMuaGFzRXZlbnRCZWVuSGFuZGxlZChldmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBsZXQgaGFuZGxlZCA9IGZhbHNlO1xuICAgIHRoaXMuY29uc3VtZXJzLmZvckVhY2goY29uc3VtZXIgPT4ge1xuICAgICAgaWYgKHRoaXMuaXNFdmVudEZvckNvbnN1bWVyKGV2ZW50LCBjb25zdW1lcikpIHtcbiAgICAgICAgaGFuZGxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuc2VuZFRvQ29uc3VtZXIoZXZlbnQsIGNvbnN1bWVyKTtcbiAgICAgICAgdGhpcy5zYXZlRXZlbnRUb0NhY2hlKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmhhc0hhbmRsZWRQb3RlbnRpYWxSZWRpcmVjdCB8fCAhaXNSZWRpcmVjdEV2ZW50KGV2ZW50KSkge1xuICAgICAgLy8gSWYgd2UndmUgYWxyZWFkeSBzZWVuIGEgcmVkaXJlY3QgYmVmb3JlLCBvciB0aGlzIGlzIGEgcG9wdXAgZXZlbnQsXG4gICAgICAvLyBiYWlsIG5vd1xuICAgICAgcmV0dXJuIGhhbmRsZWQ7XG4gICAgfVxuXG4gICAgdGhpcy5oYXNIYW5kbGVkUG90ZW50aWFsUmVkaXJlY3QgPSB0cnVlO1xuXG4gICAgLy8gSWYgdGhlIHJlZGlyZWN0IHdhc24ndCBoYW5kbGVkLCBoYW5nIG9uIHRvIGl0XG4gICAgaWYgKCFoYW5kbGVkKSB7XG4gICAgICB0aGlzLnF1ZXVlZFJlZGlyZWN0RXZlbnQgPSBldmVudDtcbiAgICAgIGhhbmRsZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBoYW5kbGVkO1xuICB9XG5cbiAgcHJpdmF0ZSBzZW5kVG9Db25zdW1lcihldmVudDogQXV0aEV2ZW50LCBjb25zdW1lcjogQXV0aEV2ZW50Q29uc3VtZXIpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQuZXJyb3IgJiYgIWlzTnVsbFJlZGlyZWN0RXZlbnQoZXZlbnQpKSB7XG4gICAgICBjb25zdCBjb2RlID1cbiAgICAgICAgKGV2ZW50LmVycm9yLmNvZGU/LnNwbGl0KCdhdXRoLycpWzFdIGFzIEF1dGhFcnJvckNvZGUpIHx8XG4gICAgICAgIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1I7XG4gICAgICBjb25zdW1lci5vbkVycm9yKF9jcmVhdGVFcnJvcih0aGlzLmF1dGgsIGNvZGUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3VtZXIub25BdXRoRXZlbnQoZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXNFdmVudEZvckNvbnN1bWVyKFxuICAgIGV2ZW50OiBBdXRoRXZlbnQsXG4gICAgY29uc3VtZXI6IEF1dGhFdmVudENvbnN1bWVyXG4gICk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGV2ZW50SWRNYXRjaGVzID1cbiAgICAgIGNvbnN1bWVyLmV2ZW50SWQgPT09IG51bGwgfHxcbiAgICAgICghIWV2ZW50LmV2ZW50SWQgJiYgZXZlbnQuZXZlbnRJZCA9PT0gY29uc3VtZXIuZXZlbnRJZCk7XG4gICAgcmV0dXJuIGNvbnN1bWVyLmZpbHRlci5pbmNsdWRlcyhldmVudC50eXBlKSAmJiBldmVudElkTWF0Y2hlcztcbiAgfVxuXG4gIHByaXZhdGUgaGFzRXZlbnRCZWVuSGFuZGxlZChldmVudDogQXV0aEV2ZW50KTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgRGF0ZS5ub3coKSAtIHRoaXMubGFzdFByb2Nlc3NlZEV2ZW50VGltZSA+PVxuICAgICAgRVZFTlRfRFVQTElDQVRJT05fQ0FDSEVfRFVSQVRJT05fTVNcbiAgICApIHtcbiAgICAgIHRoaXMuY2FjaGVkRXZlbnRVaWRzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY2FjaGVkRXZlbnRVaWRzLmhhcyhldmVudFVpZChldmVudCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzYXZlRXZlbnRUb0NhY2hlKGV2ZW50OiBBdXRoRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmNhY2hlZEV2ZW50VWlkcy5hZGQoZXZlbnRVaWQoZXZlbnQpKTtcbiAgICB0aGlzLmxhc3RQcm9jZXNzZWRFdmVudFRpbWUgPSBEYXRlLm5vdygpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGV2ZW50VWlkKGU6IEF1dGhFdmVudCk6IHN0cmluZyB7XG4gIHJldHVybiBbZS50eXBlLCBlLmV2ZW50SWQsIGUuc2Vzc2lvbklkLCBlLnRlbmFudElkXS5maWx0ZXIodiA9PiB2KS5qb2luKCctJyk7XG59XG5cbmZ1bmN0aW9uIGlzTnVsbFJlZGlyZWN0RXZlbnQoeyB0eXBlLCBlcnJvciB9OiBBdXRoRXZlbnQpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlID09PSBBdXRoRXZlbnRUeXBlLlVOS05PV04gJiZcbiAgICBlcnJvcj8uY29kZSA9PT0gYGF1dGgvJHtBdXRoRXJyb3JDb2RlLk5PX0FVVEhfRVZFTlR9YFxuICApO1xufVxuXG5mdW5jdGlvbiBpc1JlZGlyZWN0RXZlbnQoZXZlbnQ6IEF1dGhFdmVudCk6IGJvb2xlYW4ge1xuICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcbiAgICBjYXNlIEF1dGhFdmVudFR5cGUuU0lHTl9JTl9WSUFfUkVESVJFQ1Q6XG4gICAgY2FzZSBBdXRoRXZlbnRUeXBlLkxJTktfVklBX1JFRElSRUNUOlxuICAgIGNhc2UgQXV0aEV2ZW50VHlwZS5SRUFVVEhfVklBX1JFRElSRUNUOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgY2FzZSBBdXRoRXZlbnRUeXBlLlVOS05PV046XG4gICAgICByZXR1cm4gaXNOdWxsUmVkaXJlY3RFdmVudChldmVudCk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IF9wZXJmb3JtQXBpUmVxdWVzdCwgRW5kcG9pbnQsIEh0dHBNZXRob2QgfSBmcm9tICcuLi9pbmRleCc7XG5pbXBvcnQgeyBBdXRoIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBHZXRQcm9qZWN0Q29uZmlnUmVxdWVzdCB7XG4gIGFuZHJvaWRQYWNrYWdlTmFtZT86IHN0cmluZztcbiAgaW9zQnVuZGxlSWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0UHJvamVjdENvbmZpZ1Jlc3BvbnNlIHtcbiAgYXV0aG9yaXplZERvbWFpbnM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gX2dldFByb2plY3RDb25maWcoXG4gIGF1dGg6IEF1dGgsXG4gIHJlcXVlc3Q6IEdldFByb2plY3RDb25maWdSZXF1ZXN0ID0ge31cbik6IFByb21pc2U8R2V0UHJvamVjdENvbmZpZ1Jlc3BvbnNlPiB7XG4gIHJldHVybiBfcGVyZm9ybUFwaVJlcXVlc3Q8R2V0UHJvamVjdENvbmZpZ1JlcXVlc3QsIEdldFByb2plY3RDb25maWdSZXNwb25zZT4oXG4gICAgYXV0aCxcbiAgICBIdHRwTWV0aG9kLkdFVCxcbiAgICBFbmRwb2ludC5HRVRfUFJPSkVDVF9DT05GSUcsXG4gICAgcmVxdWVzdFxuICApO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IF9nZXRQcm9qZWN0Q29uZmlnIH0gZnJvbSAnLi4vLi4vYXBpL3Byb2plY3RfY29uZmlnL2dldF9wcm9qZWN0X2NvbmZpZyc7XG5pbXBvcnQgeyBBdXRoSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9hdXRoJztcbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgX2ZhaWwgfSBmcm9tICcuL2Fzc2VydCc7XG5pbXBvcnQgeyBfZ2V0Q3VycmVudFVybCB9IGZyb20gJy4vbG9jYXRpb24nO1xuXG5jb25zdCBJUF9BRERSRVNTX1JFR0VYID0gL15cXGR7MSwzfVxcLlxcZHsxLDN9XFwuXFxkezEsM31cXC5cXGR7MSwzfSQvO1xuY29uc3QgSFRUUF9SRUdFWCA9IC9eaHR0cHM/LztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF92YWxpZGF0ZU9yaWdpbihhdXRoOiBBdXRoSW50ZXJuYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gU2tpcCBvcmlnaW4gdmFsaWRhdGlvbiBpZiB3ZSBhcmUgaW4gYW4gZW11bGF0ZWQgZW52aXJvbm1lbnRcbiAgaWYgKGF1dGguY29uZmlnLmVtdWxhdG9yKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgeyBhdXRob3JpemVkRG9tYWlucyB9ID0gYXdhaXQgX2dldFByb2plY3RDb25maWcoYXV0aCk7XG5cbiAgZm9yIChjb25zdCBkb21haW4gb2YgYXV0aG9yaXplZERvbWFpbnMpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKG1hdGNoRG9tYWluKGRvbWFpbikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gRG8gbm90aGluZyBpZiB0aGVyZSdzIGEgVVJMIGVycm9yOyBqdXN0IGNvbnRpbnVlIHNlYXJjaGluZ1xuICAgIH1cbiAgfVxuXG4gIC8vIEluIHRoZSBvbGQgU0RLLCB0aGlzIGVycm9yIGFsc28gcHJvdmlkZXMgaGVscGZ1bCBtZXNzYWdlcy5cbiAgX2ZhaWwoYXV0aCwgQXV0aEVycm9yQ29kZS5JTlZBTElEX09SSUdJTik7XG59XG5cbmZ1bmN0aW9uIG1hdGNoRG9tYWluKGV4cGVjdGVkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgY3VycmVudFVybCA9IF9nZXRDdXJyZW50VXJsKCk7XG4gIGNvbnN0IHsgcHJvdG9jb2wsIGhvc3RuYW1lIH0gPSBuZXcgVVJMKGN1cnJlbnRVcmwpO1xuICBpZiAoZXhwZWN0ZWQuc3RhcnRzV2l0aCgnY2hyb21lLWV4dGVuc2lvbjovLycpKSB7XG4gICAgY29uc3QgY2VVcmwgPSBuZXcgVVJMKGV4cGVjdGVkKTtcblxuICAgIGlmIChjZVVybC5ob3N0bmFtZSA9PT0gJycgJiYgaG9zdG5hbWUgPT09ICcnKSB7XG4gICAgICAvLyBGb3Igc29tZSByZWFzb24gd2UncmUgbm90IHBhcnNpbmcgY2hyb21lIFVSTHMgcHJvcGVybHlcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHByb3RvY29sID09PSAnY2hyb21lLWV4dGVuc2lvbjonICYmXG4gICAgICAgIGV4cGVjdGVkLnJlcGxhY2UoJ2Nocm9tZS1leHRlbnNpb246Ly8nLCAnJykgPT09XG4gICAgICAgICAgY3VycmVudFVybC5yZXBsYWNlKCdjaHJvbWUtZXh0ZW5zaW9uOi8vJywgJycpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBwcm90b2NvbCA9PT0gJ2Nocm9tZS1leHRlbnNpb246JyAmJiBjZVVybC5ob3N0bmFtZSA9PT0gaG9zdG5hbWU7XG4gIH1cblxuICBpZiAoIUhUVFBfUkVHRVgudGVzdChwcm90b2NvbCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoSVBfQUREUkVTU19SRUdFWC50ZXN0KGV4cGVjdGVkKSkge1xuICAgIC8vIFRoZSBkb21haW4gaGFzIHRvIGJlIGV4YWN0bHkgZXF1YWwgdG8gdGhlIHBhdHRlcm4sIGFzIGFuIElQIGRvbWFpbiB3aWxsXG4gICAgLy8gb25seSBjb250YWluIHRoZSBJUCwgbm8gZXh0cmEgY2hhcmFjdGVyLlxuICAgIHJldHVybiBob3N0bmFtZSA9PT0gZXhwZWN0ZWQ7XG4gIH1cblxuICAvLyBEb3RzIGluIHBhdHRlcm4gc2hvdWxkIGJlIGVzY2FwZWQuXG4gIGNvbnN0IGVzY2FwZWREb21haW5QYXR0ZXJuID0gZXhwZWN0ZWQucmVwbGFjZSgvXFwuL2csICdcXFxcLicpO1xuICAvLyBOb24gaXAgYWRkcmVzcyBkb21haW5zLlxuICAvLyBkb21haW4uY29tID0gKi5kb21haW4uY29tIE9SIGRvbWFpbi5jb21cbiAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKFxuICAgICdeKC4rXFxcXC4nICsgZXNjYXBlZERvbWFpblBhdHRlcm4gKyAnfCcgKyBlc2NhcGVkRG9tYWluUGF0dGVybiArICcpJCcsXG4gICAgJ2knXG4gICk7XG4gIHJldHVybiByZS50ZXN0KGhvc3RuYW1lKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSB9IGZyb20gJy4uLy4uL2NvcmUvZXJyb3JzJztcbmltcG9ydCB7IF9jcmVhdGVFcnJvciB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbC9hc3NlcnQnO1xuaW1wb3J0IHsgRGVsYXkgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWwvZGVsYXknO1xuaW1wb3J0IHsgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXV0aCc7XG5pbXBvcnQgeyBfd2luZG93IH0gZnJvbSAnLi4vYXV0aF93aW5kb3cnO1xuaW1wb3J0ICogYXMganMgZnJvbSAnLi4vbG9hZF9qcyc7XG5cbmNvbnN0IE5FVFdPUktfVElNRU9VVCA9IG5ldyBEZWxheSgzMDAwMCwgNjAwMDApO1xuXG4vKipcbiAqIFJlc2V0IHVubGFvZGVkIEdBcGkgbW9kdWxlcy4gSWYgZ2FwaS5sb2FkIGZhaWxzIGR1ZSB0byBhIG5ldHdvcmsgZXJyb3IsXG4gKiBpdCB3aWxsIHN0b3Agd29ya2luZyBhZnRlciBhIHJldHJpYWwuIFRoaXMgaXMgYSBoYWNrIHRvIGZpeCB0aGlzIGlzc3VlLlxuICovXG5mdW5jdGlvbiByZXNldFVubG9hZGVkR2FwaU1vZHVsZXMoKTogdm9pZCB7XG4gIC8vIENsZWFyIGxhc3QgZmFpbGVkIGdhcGkubG9hZCBzdGF0ZSB0byBmb3JjZSBuZXh0IGdhcGkubG9hZCB0byBmaXJzdFxuICAvLyBsb2FkIHRoZSBmYWlsZWQgZ2FwaS5pZnJhbWVzIG1vZHVsZS5cbiAgLy8gR2V0IGdhcGl4LmJlYWNvbiBjb250ZXh0LlxuICBjb25zdCBiZWFjb24gPSBfd2luZG93KCkuX19fanNsO1xuICAvLyBHZXQgY3VycmVudCBoaW50LlxuICBpZiAoYmVhY29uPy5IKSB7XG4gICAgLy8gR2V0IGdhcGkgaGludC5cbiAgICBmb3IgKGNvbnN0IGhpbnQgb2YgT2JqZWN0LmtleXMoYmVhY29uLkgpKSB7XG4gICAgICAvLyBSZXF1ZXN0ZWQgbW9kdWxlcy5cbiAgICAgIGJlYWNvbi5IW2hpbnRdLnIgPSBiZWFjb24uSFtoaW50XS5yIHx8IFtdO1xuICAgICAgLy8gTG9hZGVkIG1vZHVsZXMuXG4gICAgICBiZWFjb24uSFtoaW50XS5MID0gYmVhY29uLkhbaGludF0uTCB8fCBbXTtcbiAgICAgIC8vIFNldCByZXF1ZXN0ZWQgbW9kdWxlcyB0byBhIGNvcHkgb2YgdGhlIGxvYWRlZCBtb2R1bGVzLlxuICAgICAgYmVhY29uLkhbaGludF0uciA9IFsuLi5iZWFjb24uSFtoaW50XS5MXTtcbiAgICAgIC8vIENsZWFyIHBlbmRpbmcgY2FsbGJhY2tzLlxuICAgICAgaWYgKGJlYWNvbi5DUCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJlYWNvbi5DUC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIC8vIFJlbW92ZSBhbGwgZmFpbGVkIHBlbmRpbmcgY2FsbGJhY2tzLlxuICAgICAgICAgIGJlYWNvbi5DUFtpXSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbG9hZEdhcGkoYXV0aDogQXV0aEludGVybmFsKTogUHJvbWlzZTxnYXBpLmlmcmFtZXMuQ29udGV4dD4ge1xuICByZXR1cm4gbmV3IFByb21pc2U8Z2FwaS5pZnJhbWVzLkNvbnRleHQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAvLyBGdW5jdGlvbiB0byBydW4gd2hlbiBnYXBpLmxvYWQgaXMgcmVhZHkuXG4gICAgZnVuY3Rpb24gbG9hZEdhcGlJZnJhbWUoKTogdm9pZCB7XG4gICAgICAvLyBUaGUgZGV2ZWxvcGVyIG1heSBoYXZlIHRyaWVkIHRvIHByZXZpb3VzbHkgcnVuIGdhcGkubG9hZCBhbmQgZmFpbGVkLlxuICAgICAgLy8gUnVuIHRoaXMgdG8gZml4IHRoYXQuXG4gICAgICByZXNldFVubG9hZGVkR2FwaU1vZHVsZXMoKTtcbiAgICAgIGdhcGkubG9hZCgnZ2FwaS5pZnJhbWVzJywge1xuICAgICAgICBjYWxsYmFjazogKCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUoZ2FwaS5pZnJhbWVzLmdldENvbnRleHQoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9udGltZW91dDogKCkgPT4ge1xuICAgICAgICAgIC8vIFRoZSBhYm92ZSByZXNldCBtYXkgYmUgc3VmZmljaWVudCwgYnV0IGhhdmluZyB0aGlzIHJlc2V0IGFmdGVyXG4gICAgICAgICAgLy8gZmFpbHVyZSBlbnN1cmVzIHRoYXQgaWYgdGhlIGRldmVsb3BlciBjYWxscyBnYXBpLmxvYWQgYWZ0ZXIgdGhlXG4gICAgICAgICAgLy8gY29ubmVjdGlvbiBpcyByZS1lc3RhYmxpc2hlZCBhbmQgYmVmb3JlIGFub3RoZXIgYXR0ZW1wdCB0byBlbWJlZFxuICAgICAgICAgIC8vIHRoZSBpZnJhbWUsIGl0IHdvdWxkIHdvcmsgYW5kIHdvdWxkIG5vdCBiZSBicm9rZW4gYmVjYXVzZSBvZiBvdXJcbiAgICAgICAgICAvLyBmYWlsZWQgYXR0ZW1wdC5cbiAgICAgICAgICAvLyBUaW1lb3V0IHdoZW4gZ2FwaS5pZnJhbWVzLklmcmFtZSBub3QgbG9hZGVkLlxuICAgICAgICAgIHJlc2V0VW5sb2FkZWRHYXBpTW9kdWxlcygpO1xuICAgICAgICAgIHJlamVjdChfY3JlYXRlRXJyb3IoYXV0aCwgQXV0aEVycm9yQ29kZS5ORVRXT1JLX1JFUVVFU1RfRkFJTEVEKSk7XG4gICAgICAgIH0sXG4gICAgICAgIHRpbWVvdXQ6IE5FVFdPUktfVElNRU9VVC5nZXQoKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKF93aW5kb3coKS5nYXBpPy5pZnJhbWVzPy5JZnJhbWUpIHtcbiAgICAgIC8vIElmIGdhcGkuaWZyYW1lcy5JZnJhbWUgYXZhaWxhYmxlLCByZXNvbHZlLlxuICAgICAgcmVzb2x2ZShnYXBpLmlmcmFtZXMuZ2V0Q29udGV4dCgpKTtcbiAgICB9IGVsc2UgaWYgKCEhX3dpbmRvdygpLmdhcGk/LmxvYWQpIHtcbiAgICAgIC8vIEdhcGkgbG9hZGVyIHJlYWR5LCBsb2FkIGdhcGkuaWZyYW1lcy5cbiAgICAgIGxvYWRHYXBpSWZyYW1lKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBpZnJhbWUgY2FsbGJhY2sgd2hlbiB0aGlzIGlzIGNhbGxlZCBzbyBhcyBub3QgdG8gb3ZlcndyaXRlXG4gICAgICAvLyBhbnkgcHJldmlvdXMgZGVmaW5lZCBjYWxsYmFjay4gVGhpcyBoYXBwZW5zIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZFxuICAgICAgLy8gbXVsdGlwbGUgdGltZXMgaW4gcGFyYWxsZWwgYW5kIGNvdWxkIHJlc3VsdCBpbiB0aGUgbGF0ZXIgY2FsbGJhY2tcbiAgICAgIC8vIG92ZXJ3cml0aW5nIHRoZSBwcmV2aW91cyBvbmUuIFRoaXMgd291bGQgZW5kIHVwIHdpdGggYSBpZnJhbWVcbiAgICAgIC8vIHRpbWVvdXQuXG4gICAgICBjb25zdCBjYk5hbWUgPSBqcy5fZ2VuZXJhdGVDYWxsYmFja05hbWUoJ2lmcmFtZWZjYicpO1xuICAgICAgLy8gR0FwaSBsb2FkZXIgbm90IGF2YWlsYWJsZSwgZHluYW1pY2FsbHkgbG9hZCBwbGF0Zm9ybS5qcy5cbiAgICAgIF93aW5kb3coKVtjYk5hbWVdID0gKCkgPT4ge1xuICAgICAgICAvLyBHQXBpIGxvYWRlciBzaG91bGQgYmUgcmVhZHkuXG4gICAgICAgIGlmICghIWdhcGkubG9hZCkge1xuICAgICAgICAgIGxvYWRHYXBpSWZyYW1lKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gR2FwaSBsb2FkZXIgZmFpbGVkLCB0aHJvdyBlcnJvci5cbiAgICAgICAgICByZWplY3QoX2NyZWF0ZUVycm9yKGF1dGgsIEF1dGhFcnJvckNvZGUuTkVUV09SS19SRVFVRVNUX0ZBSUxFRCkpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLy8gTG9hZCBHQXBpIGxvYWRlci5cbiAgICAgIHJldHVybiBqc1xuICAgICAgICAuX2xvYWRKUyhgaHR0cHM6Ly9hcGlzLmdvb2dsZS5jb20vanMvYXBpLmpzP29ubG9hZD0ke2NiTmFtZX1gKVxuICAgICAgICAuY2F0Y2goZSA9PiByZWplY3QoZSkpO1xuICAgIH1cbiAgfSkuY2F0Y2goZXJyb3IgPT4ge1xuICAgIC8vIFJlc2V0IGNhY2hlZCBwcm9taXNlIHRvIGFsbG93IGZvciByZXRyaWFsLlxuICAgIGNhY2hlZEdBcGlMb2FkZXIgPSBudWxsO1xuICAgIHRocm93IGVycm9yO1xuICB9KTtcbn1cblxubGV0IGNhY2hlZEdBcGlMb2FkZXI6IFByb21pc2U8Z2FwaS5pZnJhbWVzLkNvbnRleHQ+IHwgbnVsbCA9IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gX2xvYWRHYXBpKGF1dGg6IEF1dGhJbnRlcm5hbCk6IFByb21pc2U8Z2FwaS5pZnJhbWVzLkNvbnRleHQ+IHtcbiAgY2FjaGVkR0FwaUxvYWRlciA9IGNhY2hlZEdBcGlMb2FkZXIgfHwgbG9hZEdhcGkoYXV0aCk7XG4gIHJldHVybiBjYWNoZWRHQXBpTG9hZGVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX3Jlc2V0TG9hZGVyKCk6IHZvaWQge1xuICBjYWNoZWRHQXBpTG9hZGVyID0gbnVsbDtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgU0RLX1ZFUlNJT04gfSBmcm9tICdAZmlyZWJhc2UvYXBwJztcbmltcG9ydCB7IHF1ZXJ5c3RyaW5nIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuaW1wb3J0IHsgRGVmYXVsdENvbmZpZyB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsJztcblxuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSB9IGZyb20gJy4uLy4uL2NvcmUvZXJyb3JzJztcbmltcG9ydCB7IF9hc3NlcnQsIF9jcmVhdGVFcnJvciB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbC9hc3NlcnQnO1xuaW1wb3J0IHsgRGVsYXkgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWwvZGVsYXknO1xuaW1wb3J0IHsgX2VtdWxhdG9yVXJsIH0gZnJvbSAnLi4vLi4vY29yZS91dGlsL2VtdWxhdG9yJztcbmltcG9ydCB7IEF1dGhJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL2F1dGgnO1xuaW1wb3J0IHsgX3dpbmRvdyB9IGZyb20gJy4uL2F1dGhfd2luZG93JztcbmltcG9ydCAqIGFzIGdhcGlMb2FkZXIgZnJvbSAnLi9nYXBpJztcblxuY29uc3QgUElOR19USU1FT1VUID0gbmV3IERlbGF5KDUwMDAsIDE1MDAwKTtcbmNvbnN0IElGUkFNRV9QQVRIID0gJ19fL2F1dGgvaWZyYW1lJztcbmNvbnN0IEVNVUxBVEVEX0lGUkFNRV9QQVRIID0gJ2VtdWxhdG9yL2F1dGgvaWZyYW1lJztcblxuY29uc3QgSUZSQU1FX0FUVFJJQlVURVMgPSB7XG4gIHN0eWxlOiB7XG4gICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgdG9wOiAnLTEwMHB4JyxcbiAgICB3aWR0aDogJzFweCcsXG4gICAgaGVpZ2h0OiAnMXB4J1xuICB9LFxuICAnYXJpYS1oaWRkZW4nOiAndHJ1ZScsXG4gIHRhYmluZGV4OiAnLTEnXG59O1xuXG4vLyBNYXAgZnJvbSBhcGlIb3N0IHRvIGVuZHBvaW50IElEIGZvciBwYXNzaW5nIGludG8gaWZyYW1lLiBJbiBjdXJyZW50IFNESywgYXBpSG9zdCBjYW4gYmUgc2V0IHRvXG4vLyBhbnl0aGluZyAobm90IGZyb20gYSBsaXN0IG9mIGVuZHBvaW50cyB3aXRoIElEcyBhcyBpbiBsZWdhY3kpLCBzbyB0aGlzIGlzIHRoZSBjbG9zZXN0IHdlIGNhbiBnZXQuXG5jb25zdCBFSURfRlJPTV9BUElIT1NUID0gbmV3IE1hcChbXG4gIFtEZWZhdWx0Q29uZmlnLkFQSV9IT1NULCAncCddLCAvLyBwcm9kdWN0aW9uXG4gIFsnc3RhZ2luZy1pZGVudGl0eXRvb2xraXQuc2FuZGJveC5nb29nbGVhcGlzLmNvbScsICdzJ10sIC8vIHN0YWdpbmdcbiAgWyd0ZXN0LWlkZW50aXR5dG9vbGtpdC5zYW5kYm94Lmdvb2dsZWFwaXMuY29tJywgJ3QnXSAvLyB0ZXN0XG5dKTtcblxuZnVuY3Rpb24gZ2V0SWZyYW1lVXJsKGF1dGg6IEF1dGhJbnRlcm5hbCk6IHN0cmluZyB7XG4gIGNvbnN0IGNvbmZpZyA9IGF1dGguY29uZmlnO1xuICBfYXNzZXJ0KGNvbmZpZy5hdXRoRG9tYWluLCBhdXRoLCBBdXRoRXJyb3JDb2RlLk1JU1NJTkdfQVVUSF9ET01BSU4pO1xuICBjb25zdCB1cmwgPSBjb25maWcuZW11bGF0b3JcbiAgICA/IF9lbXVsYXRvclVybChjb25maWcsIEVNVUxBVEVEX0lGUkFNRV9QQVRIKVxuICAgIDogYGh0dHBzOi8vJHthdXRoLmNvbmZpZy5hdXRoRG9tYWlufS8ke0lGUkFNRV9QQVRIfWA7XG5cbiAgY29uc3QgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIGFwaUtleTogY29uZmlnLmFwaUtleSxcbiAgICBhcHBOYW1lOiBhdXRoLm5hbWUsXG4gICAgdjogU0RLX1ZFUlNJT05cbiAgfTtcbiAgY29uc3QgZWlkID0gRUlEX0ZST01fQVBJSE9TVC5nZXQoYXV0aC5jb25maWcuYXBpSG9zdCk7XG4gIGlmIChlaWQpIHtcbiAgICBwYXJhbXMuZWlkID0gZWlkO1xuICB9XG4gIGNvbnN0IGZyYW1ld29ya3MgPSBhdXRoLl9nZXRGcmFtZXdvcmtzKCk7XG4gIGlmIChmcmFtZXdvcmtzLmxlbmd0aCkge1xuICAgIHBhcmFtcy5mdyA9IGZyYW1ld29ya3Muam9pbignLCcpO1xuICB9XG4gIHJldHVybiBgJHt1cmx9PyR7cXVlcnlzdHJpbmcocGFyYW1zKS5zbGljZSgxKX1gO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gX29wZW5JZnJhbWUoXG4gIGF1dGg6IEF1dGhJbnRlcm5hbFxuKTogUHJvbWlzZTxnYXBpLmlmcmFtZXMuSWZyYW1lPiB7XG4gIGNvbnN0IGNvbnRleHQgPSBhd2FpdCBnYXBpTG9hZGVyLl9sb2FkR2FwaShhdXRoKTtcbiAgY29uc3QgZ2FwaSA9IF93aW5kb3coKS5nYXBpO1xuICBfYXNzZXJ0KGdhcGksIGF1dGgsIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IpO1xuICByZXR1cm4gY29udGV4dC5vcGVuKFxuICAgIHtcbiAgICAgIHdoZXJlOiBkb2N1bWVudC5ib2R5LFxuICAgICAgdXJsOiBnZXRJZnJhbWVVcmwoYXV0aCksXG4gICAgICBtZXNzYWdlSGFuZGxlcnNGaWx0ZXI6IGdhcGkuaWZyYW1lcy5DUk9TU19PUklHSU5fSUZSQU1FU19GSUxURVIsXG4gICAgICBhdHRyaWJ1dGVzOiBJRlJBTUVfQVRUUklCVVRFUyxcbiAgICAgIGRvbnRjbGVhcjogdHJ1ZVxuICAgIH0sXG4gICAgKGlmcmFtZTogZ2FwaS5pZnJhbWVzLklmcmFtZSkgPT5cbiAgICAgIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgYXdhaXQgaWZyYW1lLnJlc3R5bGUoe1xuICAgICAgICAgIC8vIFByZXZlbnQgaWZyYW1lIGZyb20gY2xvc2luZyBvbiBtb3VzZSBvdXQuXG4gICAgICAgICAgc2V0SGlkZU9uTGVhdmU6IGZhbHNlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IG5ldHdvcmtFcnJvciA9IF9jcmVhdGVFcnJvcihcbiAgICAgICAgICBhdXRoLFxuICAgICAgICAgIEF1dGhFcnJvckNvZGUuTkVUV09SS19SRVFVRVNUX0ZBSUxFRFxuICAgICAgICApO1xuICAgICAgICAvLyBDb25maXJtIGlmcmFtZSBpcyBjb3JyZWN0bHkgbG9hZGVkLlxuICAgICAgICAvLyBUbyBmYWxsYmFjayBvbiBmYWlsdXJlLCBzZXQgYSB0aW1lb3V0LlxuICAgICAgICBjb25zdCBuZXR3b3JrRXJyb3JUaW1lciA9IF93aW5kb3coKS5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICByZWplY3QobmV0d29ya0Vycm9yKTtcbiAgICAgICAgfSwgUElOR19USU1FT1VULmdldCgpKTtcbiAgICAgICAgLy8gQ2xlYXIgdGltZXIgYW5kIHJlc29sdmUgcGVuZGluZyBpZnJhbWUgcmVhZHkgcHJvbWlzZS5cbiAgICAgICAgZnVuY3Rpb24gY2xlYXJUaW1lckFuZFJlc29sdmUoKTogdm9pZCB7XG4gICAgICAgICAgX3dpbmRvdygpLmNsZWFyVGltZW91dChuZXR3b3JrRXJyb3JUaW1lcik7XG4gICAgICAgICAgcmVzb2x2ZShpZnJhbWUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoaXMgcmV0dXJucyBhbiBJVGhlbmFibGUuIEhvd2V2ZXIgdGhlIHJlamVjdCBwYXJ0IGRvZXMgbm90IGNhbGxcbiAgICAgICAgLy8gd2hlbiB0aGUgaWZyYW1lIGlzIG5vdCBsb2FkZWQuXG4gICAgICAgIGlmcmFtZS5waW5nKGNsZWFyVGltZXJBbmRSZXNvbHZlKS50aGVuKGNsZWFyVGltZXJBbmRSZXNvbHZlLCAoKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KG5ldHdvcmtFcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgZ2V0VUEgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5cbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi8uLi9jb3JlL2Vycm9ycyc7XG5pbXBvcnQgeyBfYXNzZXJ0IH0gZnJvbSAnLi4vLi4vY29yZS91dGlsL2Fzc2VydCc7XG5pbXBvcnQge1xuICBfaXNDaHJvbWVJT1MsXG4gIF9pc0ZpcmVmb3gsXG4gIF9pc0lPU1N0YW5kYWxvbmVcbn0gZnJvbSAnLi4vLi4vY29yZS91dGlsL2Jyb3dzZXInO1xuaW1wb3J0IHsgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXV0aCc7XG5cbmNvbnN0IEJBU0VfUE9QVVBfT1BUSU9OUyA9IHtcbiAgbG9jYXRpb246ICd5ZXMnLFxuICByZXNpemFibGU6ICd5ZXMnLFxuICBzdGF0dXNiYXI6ICd5ZXMnLFxuICB0b29sYmFyOiAnbm8nXG59O1xuXG5jb25zdCBERUZBVUxUX1dJRFRIID0gNTAwO1xuY29uc3QgREVGQVVMVF9IRUlHSFQgPSA2MDA7XG5jb25zdCBUQVJHRVRfQkxBTksgPSAnX2JsYW5rJztcblxuY29uc3QgRklSRUZPWF9FTVBUWV9VUkwgPSAnaHR0cDovL2xvY2FsaG9zdCc7XG5cbmV4cG9ydCBjbGFzcyBBdXRoUG9wdXAge1xuICBhc3NvY2lhdGVkRXZlbnQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHJlYWRvbmx5IHdpbmRvdzogV2luZG93IHwgbnVsbCkge31cblxuICBjbG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy53aW5kb3cpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMud2luZG93LmNsb3NlKCk7XG4gICAgICB9IGNhdGNoIChlKSB7fVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX29wZW4oXG4gIGF1dGg6IEF1dGhJbnRlcm5hbCxcbiAgdXJsPzogc3RyaW5nLFxuICBuYW1lPzogc3RyaW5nLFxuICB3aWR0aCA9IERFRkFVTFRfV0lEVEgsXG4gIGhlaWdodCA9IERFRkFVTFRfSEVJR0hUXG4pOiBBdXRoUG9wdXAge1xuICBjb25zdCB0b3AgPSBNYXRoLm1heCgod2luZG93LnNjcmVlbi5hdmFpbEhlaWdodCAtIGhlaWdodCkgLyAyLCAwKS50b1N0cmluZygpO1xuICBjb25zdCBsZWZ0ID0gTWF0aC5tYXgoKHdpbmRvdy5zY3JlZW4uYXZhaWxXaWR0aCAtIHdpZHRoKSAvIDIsIDApLnRvU3RyaW5nKCk7XG4gIGxldCB0YXJnZXQgPSAnJztcblxuICBjb25zdCBvcHRpb25zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgIC4uLkJBU0VfUE9QVVBfT1BUSU9OUyxcbiAgICB3aWR0aDogd2lkdGgudG9TdHJpbmcoKSxcbiAgICBoZWlnaHQ6IGhlaWdodC50b1N0cmluZygpLFxuICAgIHRvcCxcbiAgICBsZWZ0XG4gIH07XG5cbiAgLy8gQ2hyb21lIGlPUyA3IGFuZCA4IGlzIHJldHVybmluZyBhbiB1bmRlZmluZWQgcG9wdXAgd2luIHdoZW4gdGFyZ2V0IGlzXG4gIC8vIHNwZWNpZmllZCwgZXZlbiB0aG91Z2ggdGhlIHBvcHVwIGlzIG5vdCBuZWNlc3NhcmlseSBibG9ja2VkLlxuICBjb25zdCB1YSA9IGdldFVBKCkudG9Mb3dlckNhc2UoKTtcblxuICBpZiAobmFtZSkge1xuICAgIHRhcmdldCA9IF9pc0Nocm9tZUlPUyh1YSkgPyBUQVJHRVRfQkxBTksgOiBuYW1lO1xuICB9XG5cbiAgaWYgKF9pc0ZpcmVmb3godWEpKSB7XG4gICAgLy8gRmlyZWZveCBjb21wbGFpbnMgd2hlbiBpbnZhbGlkIFVSTHMgYXJlIHBvcHBlZCBvdXQuIEhhY2t5IHdheSB0byBieXBhc3MuXG4gICAgdXJsID0gdXJsIHx8IEZJUkVGT1hfRU1QVFlfVVJMO1xuICAgIC8vIEZpcmVmb3ggZGlzYWJsZXMgYnkgZGVmYXVsdCBzY3JvbGxpbmcgb24gcG9wdXAgd2luZG93cywgd2hpY2ggY2FuIGNyZWF0ZVxuICAgIC8vIGlzc3VlcyB3aGVuIHRoZSB1c2VyIGhhcyBtYW55IEdvb2dsZSBhY2NvdW50cywgZm9yIGluc3RhbmNlLlxuICAgIG9wdGlvbnMuc2Nyb2xsYmFycyA9ICd5ZXMnO1xuICB9XG5cbiAgY29uc3Qgb3B0aW9uc1N0cmluZyA9IE9iamVjdC5lbnRyaWVzKG9wdGlvbnMpLnJlZHVjZShcbiAgICAoYWNjdW0sIFtrZXksIHZhbHVlXSkgPT4gYCR7YWNjdW19JHtrZXl9PSR7dmFsdWV9LGAsXG4gICAgJydcbiAgKTtcblxuICBpZiAoX2lzSU9TU3RhbmRhbG9uZSh1YSkgJiYgdGFyZ2V0ICE9PSAnX3NlbGYnKSB7XG4gICAgb3BlbkFzTmV3V2luZG93SU9TKHVybCB8fCAnJywgdGFyZ2V0KTtcbiAgICByZXR1cm4gbmV3IEF1dGhQb3B1cChudWxsKTtcbiAgfVxuXG4gIC8vIGFib3V0OmJsYW5rIGdldHRpbmcgc2FuaXRpemVkIGNhdXNpbmcgYnJvd3NlcnMgbGlrZSBJRS9FZGdlIHRvIGRpc3BsYXlcbiAgLy8gYnJpZWYgZXJyb3IgbWVzc2FnZSBiZWZvcmUgcmVkaXJlY3RpbmcgdG8gaGFuZGxlci5cbiAgY29uc3QgbmV3V2luID0gd2luZG93Lm9wZW4odXJsIHx8ICcnLCB0YXJnZXQsIG9wdGlvbnNTdHJpbmcpO1xuICBfYXNzZXJ0KG5ld1dpbiwgYXV0aCwgQXV0aEVycm9yQ29kZS5QT1BVUF9CTE9DS0VEKTtcblxuICAvLyBGbGFreSBvbiBJRSBlZGdlLCBlbmNhcHN1bGF0ZSB3aXRoIGEgdHJ5IGFuZCBjYXRjaC5cbiAgdHJ5IHtcbiAgICBuZXdXaW4uZm9jdXMoKTtcbiAgfSBjYXRjaCAoZSkge31cblxuICByZXR1cm4gbmV3IEF1dGhQb3B1cChuZXdXaW4pO1xufVxuXG5mdW5jdGlvbiBvcGVuQXNOZXdXaW5kb3dJT1ModXJsOiBzdHJpbmcsIHRhcmdldDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICBlbC5ocmVmID0gdXJsO1xuICBlbC50YXJnZXQgPSB0YXJnZXQ7XG4gIGNvbnN0IGNsaWNrID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ01vdXNlRXZlbnQnKTtcbiAgY2xpY2suaW5pdE1vdXNlRXZlbnQoXG4gICAgJ2NsaWNrJyxcbiAgICB0cnVlLFxuICAgIHRydWUsXG4gICAgd2luZG93LFxuICAgIDEsXG4gICAgMCxcbiAgICAwLFxuICAgIDAsXG4gICAgMCxcbiAgICBmYWxzZSxcbiAgICBmYWxzZSxcbiAgICBmYWxzZSxcbiAgICBmYWxzZSxcbiAgICAxLFxuICAgIG51bGxcbiAgKTtcbiAgZWwuZGlzcGF0Y2hFdmVudChjbGljayk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgU0RLX1ZFUlNJT04gfSBmcm9tICdAZmlyZWJhc2UvYXBwJztcbmltcG9ydCB7IEF1dGhQcm92aWRlciB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5pbXBvcnQgeyBBcGlLZXksIEFwcE5hbWUsIEF1dGhJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL2F1dGgnO1xuaW1wb3J0IHsgQXV0aEV2ZW50VHlwZSB9IGZyb20gJy4uLy4uL21vZGVsL3BvcHVwX3JlZGlyZWN0JztcbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgX2Fzc2VydCB9IGZyb20gJy4vYXNzZXJ0JztcbmltcG9ydCB7IGlzRW1wdHksIHF1ZXJ5c3RyaW5nIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuaW1wb3J0IHsgX2VtdWxhdG9yVXJsIH0gZnJvbSAnLi9lbXVsYXRvcic7XG5pbXBvcnQgeyBGZWRlcmF0ZWRBdXRoUHJvdmlkZXIgfSBmcm9tICcuLi9wcm92aWRlcnMvZmVkZXJhdGVkJztcbmltcG9ydCB7IEJhc2VPQXV0aFByb3ZpZGVyIH0gZnJvbSAnLi4vcHJvdmlkZXJzL29hdXRoJztcblxuLyoqXG4gKiBVUkwgZm9yIEF1dGhlbnRpY2F0aW9uIHdpZGdldCB3aGljaCB3aWxsIGluaXRpYXRlIHRoZSBPQXV0aCBoYW5kc2hha2VcbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgV0lER0VUX1BBVEggPSAnX18vYXV0aC9oYW5kbGVyJztcblxuLyoqXG4gKiBVUkwgZm9yIGVtdWxhdGVkIGVudmlyb25tZW50XG4gKlxuICogQGludGVybmFsXG4gKi9cbmNvbnN0IEVNVUxBVE9SX1dJREdFVF9QQVRIID0gJ2VtdWxhdG9yL2F1dGgvaGFuZGxlcic7XG5cbi8qKlxuICogRnJhZ21lbnQgbmFtZSBmb3IgdGhlIEFwcCBDaGVjayB0b2tlbiB0aGF0IGdldHMgcGFzc2VkIHRvIHRoZSB3aWRnZXRcbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgRklSRUJBU0VfQVBQX0NIRUNLX0ZSQUdNRU5UX0lEID0gZW5jb2RlVVJJQ29tcG9uZW50KCdmYWMnKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9jb25zaXN0ZW50LXR5cGUtZGVmaW5pdGlvbnNcbnR5cGUgV2lkZ2V0UGFyYW1zID0ge1xuICBhcGlLZXk6IEFwaUtleTtcbiAgYXBwTmFtZTogQXBwTmFtZTtcbiAgYXV0aFR5cGU6IEF1dGhFdmVudFR5cGU7XG4gIHJlZGlyZWN0VXJsPzogc3RyaW5nO1xuICB2OiBzdHJpbmc7XG4gIHByb3ZpZGVySWQ/OiBzdHJpbmc7XG4gIHNjb3Blcz86IHN0cmluZztcbiAgY3VzdG9tUGFyYW1ldGVycz86IHN0cmluZztcbiAgZXZlbnRJZD86IHN0cmluZztcbiAgdGlkPzogc3RyaW5nO1xufSAmIHsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgdW5kZWZpbmVkIH07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBfZ2V0UmVkaXJlY3RVcmwoXG4gIGF1dGg6IEF1dGhJbnRlcm5hbCxcbiAgcHJvdmlkZXI6IEF1dGhQcm92aWRlcixcbiAgYXV0aFR5cGU6IEF1dGhFdmVudFR5cGUsXG4gIHJlZGlyZWN0VXJsPzogc3RyaW5nLFxuICBldmVudElkPzogc3RyaW5nLFxuICBhZGRpdGlvbmFsUGFyYW1zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgX2Fzc2VydChhdXRoLmNvbmZpZy5hdXRoRG9tYWluLCBhdXRoLCBBdXRoRXJyb3JDb2RlLk1JU1NJTkdfQVVUSF9ET01BSU4pO1xuICBfYXNzZXJ0KGF1dGguY29uZmlnLmFwaUtleSwgYXV0aCwgQXV0aEVycm9yQ29kZS5JTlZBTElEX0FQSV9LRVkpO1xuXG4gIGNvbnN0IHBhcmFtczogV2lkZ2V0UGFyYW1zID0ge1xuICAgIGFwaUtleTogYXV0aC5jb25maWcuYXBpS2V5LFxuICAgIGFwcE5hbWU6IGF1dGgubmFtZSxcbiAgICBhdXRoVHlwZSxcbiAgICByZWRpcmVjdFVybCxcbiAgICB2OiBTREtfVkVSU0lPTixcbiAgICBldmVudElkXG4gIH07XG5cbiAgaWYgKHByb3ZpZGVyIGluc3RhbmNlb2YgRmVkZXJhdGVkQXV0aFByb3ZpZGVyKSB7XG4gICAgcHJvdmlkZXIuc2V0RGVmYXVsdExhbmd1YWdlKGF1dGgubGFuZ3VhZ2VDb2RlKTtcbiAgICBwYXJhbXMucHJvdmlkZXJJZCA9IHByb3ZpZGVyLnByb3ZpZGVySWQgfHwgJyc7XG4gICAgaWYgKCFpc0VtcHR5KHByb3ZpZGVyLmdldEN1c3RvbVBhcmFtZXRlcnMoKSkpIHtcbiAgICAgIHBhcmFtcy5jdXN0b21QYXJhbWV0ZXJzID0gSlNPTi5zdHJpbmdpZnkocHJvdmlkZXIuZ2V0Q3VzdG9tUGFyYW1ldGVycygpKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPIHNldCBhZGRpdGlvbmFsUGFyYW1zIGZyb20gdGhlIHByb3ZpZGVyIGFzIHdlbGw/XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYWRkaXRpb25hbFBhcmFtcyB8fCB7fSkpIHtcbiAgICAgIHBhcmFtc1trZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKHByb3ZpZGVyIGluc3RhbmNlb2YgQmFzZU9BdXRoUHJvdmlkZXIpIHtcbiAgICBjb25zdCBzY29wZXMgPSBwcm92aWRlci5nZXRTY29wZXMoKS5maWx0ZXIoc2NvcGUgPT4gc2NvcGUgIT09ICcnKTtcbiAgICBpZiAoc2NvcGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBhcmFtcy5zY29wZXMgPSBzY29wZXMuam9pbignLCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChhdXRoLnRlbmFudElkKSB7XG4gICAgcGFyYW1zLnRpZCA9IGF1dGgudGVuYW50SWQ7XG4gIH1cblxuICAvLyBUT0RPOiBtYXliZSBzZXQgZWlkIGFzIGVuZGlwb2ludElkXG4gIC8vIFRPRE86IG1heWJlIHNldCBmdyBhcyBGcmFtZXdvcmtzLmpvaW4oXCIsXCIpXG5cbiAgY29uc3QgcGFyYW1zRGljdCA9IHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+O1xuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhwYXJhbXNEaWN0KSkge1xuICAgIGlmIChwYXJhbXNEaWN0W2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVsZXRlIHBhcmFtc0RpY3Rba2V5XTtcbiAgICB9XG4gIH1cblxuICAvLyBTZXRzIHRoZSBBcHAgQ2hlY2sgdG9rZW4gdG8gcGFzcyB0byB0aGUgd2lkZ2V0XG4gIGNvbnN0IGFwcENoZWNrVG9rZW4gPSBhd2FpdCBhdXRoLl9nZXRBcHBDaGVja1Rva2VuKCk7XG4gIGNvbnN0IGFwcENoZWNrVG9rZW5GcmFnbWVudCA9IGFwcENoZWNrVG9rZW5cbiAgICA/IGAjJHtGSVJFQkFTRV9BUFBfQ0hFQ0tfRlJBR01FTlRfSUR9PSR7ZW5jb2RlVVJJQ29tcG9uZW50KGFwcENoZWNrVG9rZW4pfWBcbiAgICA6ICcnO1xuXG4gIC8vIFN0YXJ0IGF0IGluZGV4IDEgdG8gc2tpcCB0aGUgbGVhZGluZyAnJicgaW4gdGhlIHF1ZXJ5IHN0cmluZ1xuICByZXR1cm4gYCR7Z2V0SGFuZGxlckJhc2UoYXV0aCl9PyR7cXVlcnlzdHJpbmcocGFyYW1zRGljdCkuc2xpY2UoXG4gICAgMVxuICApfSR7YXBwQ2hlY2tUb2tlbkZyYWdtZW50fWA7XG59XG5cbmZ1bmN0aW9uIGdldEhhbmRsZXJCYXNlKHsgY29uZmlnIH06IEF1dGhJbnRlcm5hbCk6IHN0cmluZyB7XG4gIGlmICghY29uZmlnLmVtdWxhdG9yKSB7XG4gICAgcmV0dXJuIGBodHRwczovLyR7Y29uZmlnLmF1dGhEb21haW59LyR7V0lER0VUX1BBVEh9YDtcbiAgfVxuXG4gIHJldHVybiBfZW11bGF0b3JVcmwoY29uZmlnLCBFTVVMQVRPUl9XSURHRVRfUEFUSCk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgQXV0aFByb3ZpZGVyLCBQb3B1cFJlZGlyZWN0UmVzb2x2ZXIgfSBmcm9tICcuLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuXG5pbXBvcnQgeyBBdXRoRXZlbnRNYW5hZ2VyIH0gZnJvbSAnLi4vY29yZS9hdXRoL2F1dGhfZXZlbnRfbWFuYWdlcic7XG5pbXBvcnQgeyBBdXRoRXJyb3JDb2RlIH0gZnJvbSAnLi4vY29yZS9lcnJvcnMnO1xuaW1wb3J0IHsgX2Fzc2VydCwgZGVidWdBc3NlcnQsIF9mYWlsIH0gZnJvbSAnLi4vY29yZS91dGlsL2Fzc2VydCc7XG5pbXBvcnQgeyBfZ2VuZXJhdGVFdmVudElkIH0gZnJvbSAnLi4vY29yZS91dGlsL2V2ZW50X2lkJztcbmltcG9ydCB7IF9nZXRDdXJyZW50VXJsIH0gZnJvbSAnLi4vY29yZS91dGlsL2xvY2F0aW9uJztcbmltcG9ydCB7IF92YWxpZGF0ZU9yaWdpbiB9IGZyb20gJy4uL2NvcmUvdXRpbC92YWxpZGF0ZV9vcmlnaW4nO1xuaW1wb3J0IHsgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vbW9kZWwvYXV0aCc7XG5pbXBvcnQge1xuICBBdXRoRXZlbnRUeXBlLFxuICBFdmVudE1hbmFnZXIsXG4gIEdhcGlBdXRoRXZlbnQsXG4gIEdhcGlPdXRjb21lLFxuICBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJJbnRlcm5hbFxufSBmcm9tICcuLi9tb2RlbC9wb3B1cF9yZWRpcmVjdCc7XG5pbXBvcnQgeyBfc2V0V2luZG93TG9jYXRpb24gfSBmcm9tICcuL2F1dGhfd2luZG93JztcbmltcG9ydCB7IF9vcGVuSWZyYW1lIH0gZnJvbSAnLi9pZnJhbWUvaWZyYW1lJztcbmltcG9ydCB7IGJyb3dzZXJTZXNzaW9uUGVyc2lzdGVuY2UgfSBmcm9tICcuL3BlcnNpc3RlbmNlL3Nlc3Npb25fc3RvcmFnZSc7XG5pbXBvcnQgeyBfb3BlbiwgQXV0aFBvcHVwIH0gZnJvbSAnLi91dGlsL3BvcHVwJztcbmltcG9ydCB7IF9nZXRSZWRpcmVjdFJlc3VsdCB9IGZyb20gJy4vc3RyYXRlZ2llcy9yZWRpcmVjdCc7XG5pbXBvcnQgeyBfZ2V0UmVkaXJlY3RVcmwgfSBmcm9tICcuLi9jb3JlL3V0aWwvaGFuZGxlcic7XG5pbXBvcnQgeyBfaXNJT1MsIF9pc01vYmlsZUJyb3dzZXIsIF9pc1NhZmFyaSB9IGZyb20gJy4uL2NvcmUvdXRpbC9icm93c2VyJztcbmltcG9ydCB7IF9vdmVycmlkZVJlZGlyZWN0UmVzdWx0IH0gZnJvbSAnLi4vY29yZS9zdHJhdGVnaWVzL3JlZGlyZWN0JztcblxuLyoqXG4gKiBUaGUgc3BlY2lhbCB3ZWIgc3RvcmFnZSBldmVudFxuICpcbiAqL1xuY29uc3QgV0VCX1NUT1JBR0VfU1VQUE9SVF9LRVkgPSAnd2ViU3RvcmFnZVN1cHBvcnQnO1xuXG5pbnRlcmZhY2UgV2ViU3RvcmFnZVN1cHBvcnRNZXNzYWdlIGV4dGVuZHMgZ2FwaS5pZnJhbWVzLk1lc3NhZ2Uge1xuICBbaW5kZXg6IG51bWJlcl06IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+O1xufVxuXG5pbnRlcmZhY2UgTWFuYWdlck9yUHJvbWlzZSB7XG4gIG1hbmFnZXI/OiBFdmVudE1hbmFnZXI7XG4gIHByb21pc2U/OiBQcm9taXNlPEV2ZW50TWFuYWdlcj47XG59XG5cbmNsYXNzIEJyb3dzZXJQb3B1cFJlZGlyZWN0UmVzb2x2ZXIgaW1wbGVtZW50cyBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJJbnRlcm5hbCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRNYW5hZ2VyczogUmVjb3JkPHN0cmluZywgTWFuYWdlck9yUHJvbWlzZT4gPSB7fTtcbiAgcHJpdmF0ZSByZWFkb25seSBpZnJhbWVzOiBSZWNvcmQ8c3RyaW5nLCBnYXBpLmlmcmFtZXMuSWZyYW1lPiA9IHt9O1xuICBwcml2YXRlIHJlYWRvbmx5IG9yaWdpblZhbGlkYXRpb25Qcm9taXNlczogUmVjb3JkPHN0cmluZywgUHJvbWlzZTx2b2lkPj4gPSB7fTtcblxuICByZWFkb25seSBfcmVkaXJlY3RQZXJzaXN0ZW5jZSA9IGJyb3dzZXJTZXNzaW9uUGVyc2lzdGVuY2U7XG5cbiAgLy8gV3JhcHBpbmcgaW4gYXN5bmMgZXZlbiB0aG91Z2ggd2UgZG9uJ3QgYXdhaXQgYW55d2hlcmUgaW4gb3JkZXJcbiAgLy8gdG8gbWFrZSBzdXJlIGVycm9ycyBhcmUgcmFpc2VkIGFzIHByb21pc2UgcmVqZWN0aW9uc1xuICBhc3luYyBfb3BlblBvcHVwKFxuICAgIGF1dGg6IEF1dGhJbnRlcm5hbCxcbiAgICBwcm92aWRlcjogQXV0aFByb3ZpZGVyLFxuICAgIGF1dGhUeXBlOiBBdXRoRXZlbnRUeXBlLFxuICAgIGV2ZW50SWQ/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxBdXRoUG9wdXA+IHtcbiAgICBkZWJ1Z0Fzc2VydChcbiAgICAgIHRoaXMuZXZlbnRNYW5hZ2Vyc1thdXRoLl9rZXkoKV0/Lm1hbmFnZXIsXG4gICAgICAnX2luaXRpYWxpemUoKSBub3QgY2FsbGVkIGJlZm9yZSBfb3BlblBvcHVwKCknXG4gICAgKTtcblxuICAgIGNvbnN0IHVybCA9IGF3YWl0IF9nZXRSZWRpcmVjdFVybChcbiAgICAgIGF1dGgsXG4gICAgICBwcm92aWRlcixcbiAgICAgIGF1dGhUeXBlLFxuICAgICAgX2dldEN1cnJlbnRVcmwoKSxcbiAgICAgIGV2ZW50SWRcbiAgICApO1xuICAgIHJldHVybiBfb3BlbihhdXRoLCB1cmwsIF9nZW5lcmF0ZUV2ZW50SWQoKSk7XG4gIH1cblxuICBhc3luYyBfb3BlblJlZGlyZWN0KFxuICAgIGF1dGg6IEF1dGhJbnRlcm5hbCxcbiAgICBwcm92aWRlcjogQXV0aFByb3ZpZGVyLFxuICAgIGF1dGhUeXBlOiBBdXRoRXZlbnRUeXBlLFxuICAgIGV2ZW50SWQ/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxuZXZlcj4ge1xuICAgIGF3YWl0IHRoaXMuX29yaWdpblZhbGlkYXRpb24oYXV0aCk7XG4gICAgY29uc3QgdXJsID0gYXdhaXQgX2dldFJlZGlyZWN0VXJsKFxuICAgICAgYXV0aCxcbiAgICAgIHByb3ZpZGVyLFxuICAgICAgYXV0aFR5cGUsXG4gICAgICBfZ2V0Q3VycmVudFVybCgpLFxuICAgICAgZXZlbnRJZFxuICAgICk7XG4gICAgX3NldFdpbmRvd0xvY2F0aW9uKHVybCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKCgpID0+IHt9KTtcbiAgfVxuXG4gIF9pbml0aWFsaXplKGF1dGg6IEF1dGhJbnRlcm5hbCk6IFByb21pc2U8RXZlbnRNYW5hZ2VyPiB7XG4gICAgY29uc3Qga2V5ID0gYXV0aC5fa2V5KCk7XG4gICAgaWYgKHRoaXMuZXZlbnRNYW5hZ2Vyc1trZXldKSB7XG4gICAgICBjb25zdCB7IG1hbmFnZXIsIHByb21pc2UgfSA9IHRoaXMuZXZlbnRNYW5hZ2Vyc1trZXldO1xuICAgICAgaWYgKG1hbmFnZXIpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtYW5hZ2VyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlYnVnQXNzZXJ0KHByb21pc2UsICdJZiBtYW5hZ2VyIGlzIG5vdCBzZXQsIHByb21pc2Ugc2hvdWxkIGJlJyk7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLmluaXRBbmRHZXRNYW5hZ2VyKGF1dGgpO1xuICAgIHRoaXMuZXZlbnRNYW5hZ2Vyc1trZXldID0geyBwcm9taXNlIH07XG5cbiAgICAvLyBJZiB0aGUgcHJvbWlzZSBpcyByZWplY3RlZCwgdGhlIGtleSBzaG91bGQgYmUgcmVtb3ZlZCBzbyB0aGF0IHRoZVxuICAgIC8vIG9wZXJhdGlvbiBjYW4gYmUgcmV0cmllZCBsYXRlci5cbiAgICBwcm9taXNlLmNhdGNoKCgpID0+IHtcbiAgICAgIGRlbGV0ZSB0aGlzLmV2ZW50TWFuYWdlcnNba2V5XTtcbiAgICB9KTtcblxuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbml0QW5kR2V0TWFuYWdlcihhdXRoOiBBdXRoSW50ZXJuYWwpOiBQcm9taXNlPEV2ZW50TWFuYWdlcj4ge1xuICAgIGNvbnN0IGlmcmFtZSA9IGF3YWl0IF9vcGVuSWZyYW1lKGF1dGgpO1xuICAgIGNvbnN0IG1hbmFnZXIgPSBuZXcgQXV0aEV2ZW50TWFuYWdlcihhdXRoKTtcbiAgICBpZnJhbWUucmVnaXN0ZXI8R2FwaUF1dGhFdmVudD4oXG4gICAgICAnYXV0aEV2ZW50JyxcbiAgICAgIChpZnJhbWVFdmVudDogR2FwaUF1dGhFdmVudCB8IG51bGwpID0+IHtcbiAgICAgICAgX2Fzc2VydChpZnJhbWVFdmVudD8uYXV0aEV2ZW50LCBhdXRoLCBBdXRoRXJyb3JDb2RlLklOVkFMSURfQVVUSF9FVkVOVCk7XG4gICAgICAgIC8vIFRPRE86IENvbnNpZGVyIHNwbGl0dGluZyByZWRpcmVjdCBhbmQgcG9wdXAgZXZlbnRzIGVhcmxpZXIgb25cblxuICAgICAgICBjb25zdCBoYW5kbGVkID0gbWFuYWdlci5vbkV2ZW50KGlmcmFtZUV2ZW50LmF1dGhFdmVudCk7XG4gICAgICAgIHJldHVybiB7IHN0YXR1czogaGFuZGxlZCA/IEdhcGlPdXRjb21lLkFDSyA6IEdhcGlPdXRjb21lLkVSUk9SIH07XG4gICAgICB9LFxuICAgICAgZ2FwaS5pZnJhbWVzLkNST1NTX09SSUdJTl9JRlJBTUVTX0ZJTFRFUlxuICAgICk7XG5cbiAgICB0aGlzLmV2ZW50TWFuYWdlcnNbYXV0aC5fa2V5KCldID0geyBtYW5hZ2VyIH07XG4gICAgdGhpcy5pZnJhbWVzW2F1dGguX2tleSgpXSA9IGlmcmFtZTtcbiAgICByZXR1cm4gbWFuYWdlcjtcbiAgfVxuXG4gIF9pc0lmcmFtZVdlYlN0b3JhZ2VTdXBwb3J0ZWQoXG4gICAgYXV0aDogQXV0aEludGVybmFsLFxuICAgIGNiOiAoc3VwcG9ydGVkOiBib29sZWFuKSA9PiB1bmtub3duXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGlmcmFtZSA9IHRoaXMuaWZyYW1lc1thdXRoLl9rZXkoKV07XG4gICAgaWZyYW1lLnNlbmQ8Z2FwaS5pZnJhbWVzLk1lc3NhZ2UsIFdlYlN0b3JhZ2VTdXBwb3J0TWVzc2FnZT4oXG4gICAgICBXRUJfU1RPUkFHRV9TVVBQT1JUX0tFWSxcbiAgICAgIHsgdHlwZTogV0VCX1NUT1JBR0VfU1VQUE9SVF9LRVkgfSxcbiAgICAgIHJlc3VsdCA9PiB7XG4gICAgICAgIGNvbnN0IGlzU3VwcG9ydGVkID0gcmVzdWx0Py5bMF0/LltXRUJfU1RPUkFHRV9TVVBQT1JUX0tFWV07XG4gICAgICAgIGlmIChpc1N1cHBvcnRlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY2IoISFpc1N1cHBvcnRlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBfZmFpbChhdXRoLCBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SKTtcbiAgICAgIH0sXG4gICAgICBnYXBpLmlmcmFtZXMuQ1JPU1NfT1JJR0lOX0lGUkFNRVNfRklMVEVSXG4gICAgKTtcbiAgfVxuXG4gIF9vcmlnaW5WYWxpZGF0aW9uKGF1dGg6IEF1dGhJbnRlcm5hbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGtleSA9IGF1dGguX2tleSgpO1xuICAgIGlmICghdGhpcy5vcmlnaW5WYWxpZGF0aW9uUHJvbWlzZXNba2V5XSkge1xuICAgICAgdGhpcy5vcmlnaW5WYWxpZGF0aW9uUHJvbWlzZXNba2V5XSA9IF92YWxpZGF0ZU9yaWdpbihhdXRoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5vcmlnaW5WYWxpZGF0aW9uUHJvbWlzZXNba2V5XTtcbiAgfVxuXG4gIGdldCBfc2hvdWxkSW5pdFByb2FjdGl2ZWx5KCk6IGJvb2xlYW4ge1xuICAgIC8vIE1vYmlsZSBicm93c2VycyBhbmQgU2FmYXJpIG5lZWQgdG8gb3B0aW1pc3RpY2FsbHkgaW5pdGlhbGl6ZVxuICAgIHJldHVybiBfaXNNb2JpbGVCcm93c2VyKCkgfHwgX2lzU2FmYXJpKCkgfHwgX2lzSU9TKCk7XG4gIH1cblxuICBfY29tcGxldGVSZWRpcmVjdEZuID0gX2dldFJlZGlyZWN0UmVzdWx0O1xuXG4gIF9vdmVycmlkZVJlZGlyZWN0UmVzdWx0ID0gX292ZXJyaWRlUmVkaXJlY3RSZXN1bHQ7XG59XG5cbi8qKlxuICogQW4gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFBvcHVwUmVkaXJlY3RSZXNvbHZlcn0gc3VpdGFibGUgZm9yIGJyb3dzZXJcbiAqIGJhc2VkIGFwcGxpY2F0aW9ucy5cbiAqXG4gKiBAcmVtYXJrc1xuICogVGhpcyBtZXRob2QgZG9lcyBub3Qgd29yayBpbiBhIE5vZGUuanMgZW52aXJvbm1lbnQuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgYnJvd3NlclBvcHVwUmVkaXJlY3RSZXNvbHZlcjogUG9wdXBSZWRpcmVjdFJlc29sdmVyID1cbiAgQnJvd3NlclBvcHVwUmVkaXJlY3RSZXNvbHZlcjtcbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgRmFjdG9ySWQsIE11bHRpRmFjdG9yQXNzZXJ0aW9uIH0gZnJvbSAnLi4vbW9kZWwvcHVibGljX3R5cGVzJztcbmltcG9ydCB7IGRlYnVnRmFpbCB9IGZyb20gJy4uL2NvcmUvdXRpbC9hc3NlcnQnO1xuaW1wb3J0IHsgTXVsdGlGYWN0b3JTZXNzaW9uSW1wbCwgTXVsdGlGYWN0b3JTZXNzaW9uVHlwZSB9IGZyb20gJy4vbWZhX3Nlc3Npb24nO1xuaW1wb3J0IHsgRmluYWxpemVNZmFSZXNwb25zZSB9IGZyb20gJy4uL2FwaS9hdXRoZW50aWNhdGlvbi9tZmEnO1xuaW1wb3J0IHsgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vbW9kZWwvYXV0aCc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNdWx0aUZhY3RvckFzc2VydGlvbkltcGwgaW1wbGVtZW50cyBNdWx0aUZhY3RvckFzc2VydGlvbiB7XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihyZWFkb25seSBmYWN0b3JJZDogRmFjdG9ySWQpIHt9XG5cbiAgX3Byb2Nlc3MoXG4gICAgYXV0aDogQXV0aEludGVybmFsLFxuICAgIHNlc3Npb246IE11bHRpRmFjdG9yU2Vzc2lvbkltcGwsXG4gICAgZGlzcGxheU5hbWU/OiBzdHJpbmcgfCBudWxsXG4gICk6IFByb21pc2U8RmluYWxpemVNZmFSZXNwb25zZT4ge1xuICAgIHN3aXRjaCAoc2Vzc2lvbi50eXBlKSB7XG4gICAgICBjYXNlIE11bHRpRmFjdG9yU2Vzc2lvblR5cGUuRU5ST0xMOlxuICAgICAgICByZXR1cm4gdGhpcy5fZmluYWxpemVFbnJvbGwoYXV0aCwgc2Vzc2lvbi5jcmVkZW50aWFsLCBkaXNwbGF5TmFtZSk7XG4gICAgICBjYXNlIE11bHRpRmFjdG9yU2Vzc2lvblR5cGUuU0lHTl9JTjpcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmFsaXplU2lnbkluKGF1dGgsIHNlc3Npb24uY3JlZGVudGlhbCk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZGVidWdGYWlsKCd1bmV4cGVjdGVkIE11bHRpRmFjdG9yU2Vzc2lvblR5cGUnKTtcbiAgICB9XG4gIH1cblxuICBhYnN0cmFjdCBfZmluYWxpemVFbnJvbGwoXG4gICAgYXV0aDogQXV0aEludGVybmFsLFxuICAgIGlkVG9rZW46IHN0cmluZyxcbiAgICBkaXNwbGF5TmFtZT86IHN0cmluZyB8IG51bGxcbiAgKTogUHJvbWlzZTxGaW5hbGl6ZU1mYVJlc3BvbnNlPjtcbiAgYWJzdHJhY3QgX2ZpbmFsaXplU2lnbkluKFxuICAgIGF1dGg6IEF1dGhJbnRlcm5hbCxcbiAgICBtZmFQZW5kaW5nQ3JlZGVudGlhbDogc3RyaW5nXG4gICk6IFByb21pc2U8RmluYWxpemVNZmFSZXNwb25zZT47XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7XG4gIEZhY3RvcklkLFxuICBQaG9uZU11bHRpRmFjdG9yQXNzZXJ0aW9uXG59IGZyb20gJy4uLy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbmltcG9ydCB7IE11bHRpRmFjdG9yQXNzZXJ0aW9uSW1wbCB9IGZyb20gJy4uLy4uLy4uL21mYS9tZmFfYXNzZXJ0aW9uJztcbmltcG9ydCB7IEF1dGhJbnRlcm5hbCB9IGZyb20gJy4uLy4uLy4uL21vZGVsL2F1dGgnO1xuaW1wb3J0IHsgZmluYWxpemVFbnJvbGxQaG9uZU1mYSB9IGZyb20gJy4uLy4uLy4uL2FwaS9hY2NvdW50X21hbmFnZW1lbnQvbWZhJztcbmltcG9ydCB7IFBob25lQXV0aENyZWRlbnRpYWwgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2NyZWRlbnRpYWxzL3Bob25lJztcbmltcG9ydCB7XG4gIGZpbmFsaXplU2lnbkluUGhvbmVNZmEsXG4gIEZpbmFsaXplTWZhUmVzcG9uc2Vcbn0gZnJvbSAnLi4vLi4vLi4vYXBpL2F1dGhlbnRpY2F0aW9uL21mYSc7XG5cbi8qKlxuICoge0Bpbmhlcml0ZG9jIFBob25lTXVsdGlGYWN0b3JBc3NlcnRpb259XG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgUGhvbmVNdWx0aUZhY3RvckFzc2VydGlvbkltcGxcbiAgZXh0ZW5kcyBNdWx0aUZhY3RvckFzc2VydGlvbkltcGxcbiAgaW1wbGVtZW50cyBQaG9uZU11bHRpRmFjdG9yQXNzZXJ0aW9uXG57XG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjcmVkZW50aWFsOiBQaG9uZUF1dGhDcmVkZW50aWFsKSB7XG4gICAgc3VwZXIoRmFjdG9ySWQuUEhPTkUpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzdGF0aWMgX2Zyb21DcmVkZW50aWFsKFxuICAgIGNyZWRlbnRpYWw6IFBob25lQXV0aENyZWRlbnRpYWxcbiAgKTogUGhvbmVNdWx0aUZhY3RvckFzc2VydGlvbkltcGwge1xuICAgIHJldHVybiBuZXcgUGhvbmVNdWx0aUZhY3RvckFzc2VydGlvbkltcGwoY3JlZGVudGlhbCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9maW5hbGl6ZUVucm9sbChcbiAgICBhdXRoOiBBdXRoSW50ZXJuYWwsXG4gICAgaWRUb2tlbjogc3RyaW5nLFxuICAgIGRpc3BsYXlOYW1lPzogc3RyaW5nIHwgbnVsbFxuICApOiBQcm9taXNlPEZpbmFsaXplTWZhUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gZmluYWxpemVFbnJvbGxQaG9uZU1mYShhdXRoLCB7XG4gICAgICBpZFRva2VuLFxuICAgICAgZGlzcGxheU5hbWUsXG4gICAgICBwaG9uZVZlcmlmaWNhdGlvbkluZm86IHRoaXMuY3JlZGVudGlhbC5fbWFrZVZlcmlmaWNhdGlvblJlcXVlc3QoKVxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZmluYWxpemVTaWduSW4oXG4gICAgYXV0aDogQXV0aEludGVybmFsLFxuICAgIG1mYVBlbmRpbmdDcmVkZW50aWFsOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxGaW5hbGl6ZU1mYVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIGZpbmFsaXplU2lnbkluUGhvbmVNZmEoYXV0aCwge1xuICAgICAgbWZhUGVuZGluZ0NyZWRlbnRpYWwsXG4gICAgICBwaG9uZVZlcmlmaWNhdGlvbkluZm86IHRoaXMuY3JlZGVudGlhbC5fbWFrZVZlcmlmaWNhdGlvblJlcXVlc3QoKVxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogUHJvdmlkZXIgZm9yIGdlbmVyYXRpbmcgYSB7QGxpbmsgUGhvbmVNdWx0aUZhY3RvckFzc2VydGlvbn0uXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgUGhvbmVNdWx0aUZhY3RvckdlbmVyYXRvciB7XG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBhIHtAbGluayBQaG9uZU11bHRpRmFjdG9yQXNzZXJ0aW9ufSB0byBjb25maXJtIG93bmVyc2hpcCBvZiB0aGUgcGhvbmUgc2Vjb25kIGZhY3Rvci5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogVGhpcyBtZXRob2QgZG9lcyBub3Qgd29yayBpbiBhIE5vZGUuanMgZW52aXJvbm1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBwaG9uZUF1dGhDcmVkZW50aWFsIC0gQSBjcmVkZW50aWFsIHByb3ZpZGVkIGJ5IHtAbGluayBQaG9uZUF1dGhQcm92aWRlci5jcmVkZW50aWFsfS5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUGhvbmVNdWx0aUZhY3RvckFzc2VydGlvbn0gd2hpY2ggY2FuIGJlIHVzZWQgd2l0aFxuICAgKiB7QGxpbmsgTXVsdGlGYWN0b3JSZXNvbHZlci5yZXNvbHZlU2lnbklufVxuICAgKi9cbiAgc3RhdGljIGFzc2VydGlvbihjcmVkZW50aWFsOiBQaG9uZUF1dGhDcmVkZW50aWFsKTogUGhvbmVNdWx0aUZhY3RvckFzc2VydGlvbiB7XG4gICAgcmV0dXJuIFBob25lTXVsdGlGYWN0b3JBc3NlcnRpb25JbXBsLl9mcm9tQ3JlZGVudGlhbChjcmVkZW50aWFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgcGhvbmUgc2Vjb25kIGZhY3RvcjogYHBob25lYC5cbiAgICovXG4gIHN0YXRpYyBGQUNUT1JfSUQgPSAncGhvbmUnO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQge1xuICBUb3RwTXVsdGlGYWN0b3JBc3NlcnRpb24sXG4gIE11bHRpRmFjdG9yU2Vzc2lvbixcbiAgRmFjdG9ySWRcbn0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcbmltcG9ydCB7IEF1dGhJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL2F1dGgnO1xuaW1wb3J0IHtcbiAgZmluYWxpemVFbnJvbGxUb3RwTWZhLFxuICBzdGFydEVucm9sbFRvdHBNZmEsXG4gIFN0YXJ0VG90cE1mYUVucm9sbG1lbnRSZXNwb25zZSxcbiAgVG90cFZlcmlmaWNhdGlvbkluZm9cbn0gZnJvbSAnLi4vLi4vYXBpL2FjY291bnRfbWFuYWdlbWVudC9tZmEnO1xuaW1wb3J0IHtcbiAgRmluYWxpemVNZmFSZXNwb25zZSxcbiAgZmluYWxpemVTaWduSW5Ub3RwTWZhXG59IGZyb20gJy4uLy4uL2FwaS9hdXRoZW50aWNhdGlvbi9tZmEnO1xuaW1wb3J0IHsgTXVsdGlGYWN0b3JBc3NlcnRpb25JbXBsIH0gZnJvbSAnLi4vLi4vbWZhL21mYV9hc3NlcnRpb24nO1xuaW1wb3J0IHsgTXVsdGlGYWN0b3JTZXNzaW9uSW1wbCB9IGZyb20gJy4uL21mYV9zZXNzaW9uJztcbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi8uLi9jb3JlL2Vycm9ycyc7XG5pbXBvcnQgeyBfYXNzZXJ0IH0gZnJvbSAnLi4vLi4vY29yZS91dGlsL2Fzc2VydCc7XG5cbi8qKlxuICogUHJvdmlkZXIgZm9yIGdlbmVyYXRpbmcgYSB7QGxpbmsgVG90cE11bHRpRmFjdG9yQXNzZXJ0aW9ufS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBUb3RwTXVsdGlGYWN0b3JHZW5lcmF0b3Ige1xuICAvKipcbiAgICogUHJvdmlkZXMgYSB7QGxpbmsgVG90cE11bHRpRmFjdG9yQXNzZXJ0aW9ufSB0byBjb25maXJtIG93bmVyc2hpcCBvZlxuICAgKiB0aGUgVE9UUCAodGltZS1iYXNlZCBvbmUtdGltZSBwYXNzd29yZCkgc2Vjb25kIGZhY3Rvci5cbiAgICogVGhpcyBhc3NlcnRpb24gaXMgdXNlZCB0byBjb21wbGV0ZSBlbnJvbGxtZW50IGluIFRPVFAgc2Vjb25kIGZhY3Rvci5cbiAgICpcbiAgICogQHBhcmFtIHNlY3JldCBBIHtAbGluayBUb3RwU2VjcmV0fSBjb250YWluaW5nIHRoZSBzaGFyZWQgc2VjcmV0IGtleSBhbmQgb3RoZXIgVE9UUCBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0gb25lVGltZVBhc3N3b3JkIE9uZS10aW1lIHBhc3N3b3JkIGZyb20gVE9UUCBBcHAuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFRvdHBNdWx0aUZhY3RvckFzc2VydGlvbn0gd2hpY2ggY2FuIGJlIHVzZWQgd2l0aFxuICAgKiB7QGxpbmsgTXVsdGlGYWN0b3JVc2VyLmVucm9sbH0uXG4gICAqL1xuICBzdGF0aWMgYXNzZXJ0aW9uRm9yRW5yb2xsbWVudChcbiAgICBzZWNyZXQ6IFRvdHBTZWNyZXQsXG4gICAgb25lVGltZVBhc3N3b3JkOiBzdHJpbmdcbiAgKTogVG90cE11bHRpRmFjdG9yQXNzZXJ0aW9uIHtcbiAgICByZXR1cm4gVG90cE11bHRpRmFjdG9yQXNzZXJ0aW9uSW1wbC5fZnJvbVNlY3JldChzZWNyZXQsIG9uZVRpbWVQYXNzd29yZCk7XG4gIH1cblxuICAvKipcbiAgICogUHJvdmlkZXMgYSB7QGxpbmsgVG90cE11bHRpRmFjdG9yQXNzZXJ0aW9ufSB0byBjb25maXJtIG93bmVyc2hpcCBvZiB0aGUgVE9UUCBzZWNvbmQgZmFjdG9yLlxuICAgKiBUaGlzIGFzc2VydGlvbiBpcyB1c2VkIHRvIGNvbXBsZXRlIHNpZ25JbiB3aXRoIFRPVFAgYXMgdGhlIHNlY29uZCBmYWN0b3IuXG4gICAqXG4gICAqIEBwYXJhbSBlbnJvbGxtZW50SWQgaWRlbnRpZmllcyB0aGUgZW5yb2xsZWQgVE9UUCBzZWNvbmQgZmFjdG9yLlxuICAgKiBAcGFyYW0gb25lVGltZVBhc3N3b3JkIE9uZS10aW1lIHBhc3N3b3JkIGZyb20gVE9UUCBBcHAuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFRvdHBNdWx0aUZhY3RvckFzc2VydGlvbn0gd2hpY2ggY2FuIGJlIHVzZWQgd2l0aFxuICAgKiB7QGxpbmsgTXVsdGlGYWN0b3JSZXNvbHZlci5yZXNvbHZlU2lnbklufS5cbiAgICovXG4gIHN0YXRpYyBhc3NlcnRpb25Gb3JTaWduSW4oXG4gICAgZW5yb2xsbWVudElkOiBzdHJpbmcsXG4gICAgb25lVGltZVBhc3N3b3JkOiBzdHJpbmdcbiAgKTogVG90cE11bHRpRmFjdG9yQXNzZXJ0aW9uIHtcbiAgICByZXR1cm4gVG90cE11bHRpRmFjdG9yQXNzZXJ0aW9uSW1wbC5fZnJvbUVucm9sbG1lbnRJZChcbiAgICAgIGVucm9sbG1lbnRJZCxcbiAgICAgIG9uZVRpbWVQYXNzd29yZFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHByb21pc2UgdG8ge0BsaW5rIFRvdHBTZWNyZXR9IHdoaWNoIGNvbnRhaW5zIHRoZSBUT1RQIHNoYXJlZCBzZWNyZXQga2V5IGFuZCBvdGhlciBwYXJhbWV0ZXJzLlxuICAgKiBDcmVhdGVzIGEgVE9UUCBzZWNyZXQgYXMgcGFydCBvZiBlbnJvbGxpbmcgYSBUT1RQIHNlY29uZCBmYWN0b3IuXG4gICAqIFVzZWQgZm9yIGdlbmVyYXRpbmcgYSBRUiBjb2RlIFVSTCBvciBpbnB1dHRpbmcgaW50byBhIFRPVFAgYXBwLlxuICAgKiBUaGlzIG1ldGhvZCB1c2VzIHRoZSBhdXRoIGluc3RhbmNlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXIgaW4gdGhlIG11bHRpRmFjdG9yU2Vzc2lvbi5cbiAgICpcbiAgICogQHBhcmFtIHNlc3Npb24gVGhlIHtAbGluayBNdWx0aUZhY3RvclNlc3Npb259IHRoYXQgdGhlIHVzZXIgaXMgcGFydCBvZi5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRvIHtAbGluayBUb3RwU2VjcmV0fS5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZW5lcmF0ZVNlY3JldChcbiAgICBzZXNzaW9uOiBNdWx0aUZhY3RvclNlc3Npb25cbiAgKTogUHJvbWlzZTxUb3RwU2VjcmV0PiB7XG4gICAgY29uc3QgbWZhU2Vzc2lvbiA9IHNlc3Npb24gYXMgTXVsdGlGYWN0b3JTZXNzaW9uSW1wbDtcbiAgICBfYXNzZXJ0KFxuICAgICAgdHlwZW9mIG1mYVNlc3Npb24udXNlcj8uYXV0aCAhPT0gJ3VuZGVmaW5lZCcsXG4gICAgICBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SXG4gICAgKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHN0YXJ0RW5yb2xsVG90cE1mYShtZmFTZXNzaW9uLnVzZXIuYXV0aCwge1xuICAgICAgaWRUb2tlbjogbWZhU2Vzc2lvbi5jcmVkZW50aWFsLFxuICAgICAgdG90cEVucm9sbG1lbnRJbmZvOiB7fVxuICAgIH0pO1xuICAgIHJldHVybiBUb3RwU2VjcmV0Ll9mcm9tU3RhcnRUb3RwTWZhRW5yb2xsbWVudFJlc3BvbnNlKFxuICAgICAgcmVzcG9uc2UsXG4gICAgICBtZmFTZXNzaW9uLnVzZXIuYXV0aFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIFRPVFAgc2Vjb25kIGZhY3RvcjogYHRvdHBgLlxuICAgKi9cbiAgc3RhdGljIEZBQ1RPUl9JRDogJ3RvdHAnID0gRmFjdG9ySWQuVE9UUDtcbn1cblxuZXhwb3J0IGNsYXNzIFRvdHBNdWx0aUZhY3RvckFzc2VydGlvbkltcGxcbiAgZXh0ZW5kcyBNdWx0aUZhY3RvckFzc2VydGlvbkltcGxcbiAgaW1wbGVtZW50cyBUb3RwTXVsdGlGYWN0b3JBc3NlcnRpb25cbntcbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgb3RwOiBzdHJpbmcsXG4gICAgcmVhZG9ubHkgZW5yb2xsbWVudElkPzogc3RyaW5nLFxuICAgIHJlYWRvbmx5IHNlY3JldD86IFRvdHBTZWNyZXRcbiAgKSB7XG4gICAgc3VwZXIoRmFjdG9ySWQuVE9UUCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHN0YXRpYyBfZnJvbVNlY3JldChcbiAgICBzZWNyZXQ6IFRvdHBTZWNyZXQsXG4gICAgb3RwOiBzdHJpbmdcbiAgKTogVG90cE11bHRpRmFjdG9yQXNzZXJ0aW9uSW1wbCB7XG4gICAgcmV0dXJuIG5ldyBUb3RwTXVsdGlGYWN0b3JBc3NlcnRpb25JbXBsKG90cCwgdW5kZWZpbmVkLCBzZWNyZXQpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzdGF0aWMgX2Zyb21FbnJvbGxtZW50SWQoXG4gICAgZW5yb2xsbWVudElkOiBzdHJpbmcsXG4gICAgb3RwOiBzdHJpbmdcbiAgKTogVG90cE11bHRpRmFjdG9yQXNzZXJ0aW9uSW1wbCB7XG4gICAgcmV0dXJuIG5ldyBUb3RwTXVsdGlGYWN0b3JBc3NlcnRpb25JbXBsKG90cCwgZW5yb2xsbWVudElkKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYXN5bmMgX2ZpbmFsaXplRW5yb2xsKFxuICAgIGF1dGg6IEF1dGhJbnRlcm5hbCxcbiAgICBpZFRva2VuOiBzdHJpbmcsXG4gICAgZGlzcGxheU5hbWU/OiBzdHJpbmcgfCBudWxsXG4gICk6IFByb21pc2U8RmluYWxpemVNZmFSZXNwb25zZT4ge1xuICAgIF9hc3NlcnQoXG4gICAgICB0eXBlb2YgdGhpcy5zZWNyZXQgIT09ICd1bmRlZmluZWQnLFxuICAgICAgYXV0aCxcbiAgICAgIEF1dGhFcnJvckNvZGUuQVJHVU1FTlRfRVJST1JcbiAgICApO1xuICAgIHJldHVybiBmaW5hbGl6ZUVucm9sbFRvdHBNZmEoYXV0aCwge1xuICAgICAgaWRUb2tlbixcbiAgICAgIGRpc3BsYXlOYW1lLFxuICAgICAgdG90cFZlcmlmaWNhdGlvbkluZm86IHRoaXMuc2VjcmV0Ll9tYWtlVG90cFZlcmlmaWNhdGlvbkluZm8odGhpcy5vdHApXG4gICAgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGFzeW5jIF9maW5hbGl6ZVNpZ25JbihcbiAgICBhdXRoOiBBdXRoSW50ZXJuYWwsXG4gICAgbWZhUGVuZGluZ0NyZWRlbnRpYWw6IHN0cmluZ1xuICApOiBQcm9taXNlPEZpbmFsaXplTWZhUmVzcG9uc2U+IHtcbiAgICBfYXNzZXJ0KFxuICAgICAgdGhpcy5lbnJvbGxtZW50SWQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLm90cCAhPT0gdW5kZWZpbmVkLFxuICAgICAgYXV0aCxcbiAgICAgIEF1dGhFcnJvckNvZGUuQVJHVU1FTlRfRVJST1JcbiAgICApO1xuICAgIGNvbnN0IHRvdHBWZXJpZmljYXRpb25JbmZvID0geyB2ZXJpZmljYXRpb25Db2RlOiB0aGlzLm90cCB9O1xuICAgIHJldHVybiBmaW5hbGl6ZVNpZ25JblRvdHBNZmEoYXV0aCwge1xuICAgICAgbWZhUGVuZGluZ0NyZWRlbnRpYWwsXG4gICAgICBtZmFFbnJvbGxtZW50SWQ6IHRoaXMuZW5yb2xsbWVudElkLFxuICAgICAgdG90cFZlcmlmaWNhdGlvbkluZm9cbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFByb3ZpZGVyIGZvciBnZW5lcmF0aW5nIGEge0BsaW5rIFRvdHBNdWx0aUZhY3RvckFzc2VydGlvbn0uXG4gKlxuICogU3RvcmVzIHRoZSBzaGFyZWQgc2VjcmV0IGtleSBhbmQgb3RoZXIgcGFyYW1ldGVycyB0byBnZW5lcmF0ZSB0aW1lLWJhc2VkIE9UUHMuXG4gKiBJbXBsZW1lbnRzIG1ldGhvZHMgdG8gcmV0cmlldmUgdGhlIHNoYXJlZCBzZWNyZXQga2V5IGFuZCBnZW5lcmF0ZSBhIFFSIGNvZGUgVVJMLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgVG90cFNlY3JldCB7XG4gIC8qKlxuICAgKiBTaGFyZWQgc2VjcmV0IGtleS9zZWVkIHVzZWQgZm9yIGVucm9sbGluZyBpbiBUT1RQIE1GQSBhbmQgZ2VuZXJhdGluZyBPVFBzLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VjcmV0S2V5OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBIYXNoaW5nIGFsZ29yaXRobSB1c2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgaGFzaGluZ0FsZ29yaXRobTogc3RyaW5nO1xuICAvKipcbiAgICogTGVuZ3RoIG9mIHRoZSBvbmUtdGltZSBwYXNzd29yZHMgdG8gYmUgZ2VuZXJhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgY29kZUxlbmd0aDogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIGludGVydmFsIChpbiBzZWNvbmRzKSB3aGVuIHRoZSBPVFAgY29kZXMgc2hvdWxkIGNoYW5nZS5cbiAgICovXG4gIHJlYWRvbmx5IGNvZGVJbnRlcnZhbFNlY29uZHM6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSB0aW1lc3RhbXAgKFVUQyBzdHJpbmcpIGJ5IHdoaWNoIFRPVFAgZW5yb2xsbWVudCBzaG91bGQgYmUgY29tcGxldGVkLlxuICAgKi9cbiAgLy8gVGhpcyBjYW4gYmUgdXNlZCBieSBjYWxsZXJzIHRvIHNob3cgYSBjb3VudGRvd24gb2Ygd2hlbiB0byBlbnRlciBPVFAgY29kZSBieS5cbiAgcmVhZG9ubHkgZW5yb2xsbWVudENvbXBsZXRpb25EZWFkbGluZTogc3RyaW5nO1xuXG4gIC8vIFRoZSBwdWJsaWMgbWVtYmVycyBhcmUgZGVjbGFyZWQgb3V0c2lkZSB0aGUgY29uc3RydWN0b3Igc28gdGhlIGRvY3MgY2FuIGJlIGdlbmVyYXRlZC5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICBzZWNyZXRLZXk6IHN0cmluZyxcbiAgICBoYXNoaW5nQWxnb3JpdGhtOiBzdHJpbmcsXG4gICAgY29kZUxlbmd0aDogbnVtYmVyLFxuICAgIGNvZGVJbnRlcnZhbFNlY29uZHM6IG51bWJlcixcbiAgICBlbnJvbGxtZW50Q29tcGxldGlvbkRlYWRsaW5lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzZXNzaW9uSW5mbzogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYXV0aDogQXV0aEludGVybmFsXG4gICkge1xuICAgIHRoaXMuc2VjcmV0S2V5ID0gc2VjcmV0S2V5O1xuICAgIHRoaXMuaGFzaGluZ0FsZ29yaXRobSA9IGhhc2hpbmdBbGdvcml0aG07XG4gICAgdGhpcy5jb2RlTGVuZ3RoID0gY29kZUxlbmd0aDtcbiAgICB0aGlzLmNvZGVJbnRlcnZhbFNlY29uZHMgPSBjb2RlSW50ZXJ2YWxTZWNvbmRzO1xuICAgIHRoaXMuZW5yb2xsbWVudENvbXBsZXRpb25EZWFkbGluZSA9IGVucm9sbG1lbnRDb21wbGV0aW9uRGVhZGxpbmU7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHN0YXRpYyBfZnJvbVN0YXJ0VG90cE1mYUVucm9sbG1lbnRSZXNwb25zZShcbiAgICByZXNwb25zZTogU3RhcnRUb3RwTWZhRW5yb2xsbWVudFJlc3BvbnNlLFxuICAgIGF1dGg6IEF1dGhJbnRlcm5hbFxuICApOiBUb3RwU2VjcmV0IHtcbiAgICByZXR1cm4gbmV3IFRvdHBTZWNyZXQoXG4gICAgICByZXNwb25zZS50b3RwU2Vzc2lvbkluZm8uc2hhcmVkU2VjcmV0S2V5LFxuICAgICAgcmVzcG9uc2UudG90cFNlc3Npb25JbmZvLmhhc2hpbmdBbGdvcml0aG0sXG4gICAgICByZXNwb25zZS50b3RwU2Vzc2lvbkluZm8udmVyaWZpY2F0aW9uQ29kZUxlbmd0aCxcbiAgICAgIHJlc3BvbnNlLnRvdHBTZXNzaW9uSW5mby5wZXJpb2RTZWMsXG4gICAgICBuZXcgRGF0ZShyZXNwb25zZS50b3RwU2Vzc2lvbkluZm8uZmluYWxpemVFbnJvbGxtZW50VGltZSkudG9VVENTdHJpbmcoKSxcbiAgICAgIHJlc3BvbnNlLnRvdHBTZXNzaW9uSW5mby5zZXNzaW9uSW5mbyxcbiAgICAgIGF1dGhcbiAgICApO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfbWFrZVRvdHBWZXJpZmljYXRpb25JbmZvKG90cDogc3RyaW5nKTogVG90cFZlcmlmaWNhdGlvbkluZm8ge1xuICAgIHJldHVybiB7IHNlc3Npb25JbmZvOiB0aGlzLnNlc3Npb25JbmZvLCB2ZXJpZmljYXRpb25Db2RlOiBvdHAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgUVIgY29kZSBVUkwgYXMgZGVzY3JpYmVkIGluXG4gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvZ29vZ2xlLWF1dGhlbnRpY2F0b3Ivd2lraS9LZXktVXJpLUZvcm1hdFxuICAgKiBUaGlzIGNhbiBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgYXMgYSBRUiBjb2RlIHRvIGJlIHNjYW5uZWQgaW50byBhIFRPVFAgYXBwIGxpa2UgR29vZ2xlIEF1dGhlbnRpY2F0b3IuXG4gICAqIElmIHRoZSBvcHRpb25hbCBwYXJhbWV0ZXJzIGFyZSB1bnNwZWNpZmllZCwgYW4gYWNjb3VudE5hbWUgb2YgPHVzZXJFbWFpbD4gYW5kIGlzc3VlciBvZiA8ZmlyZWJhc2VBcHBOYW1lPiBhcmUgdXNlZC5cbiAgICpcbiAgICogQHBhcmFtIGFjY291bnROYW1lIHRoZSBuYW1lIG9mIHRoZSBhY2NvdW50L2FwcCBhbG9uZyB3aXRoIGEgdXNlciBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0gaXNzdWVyIGlzc3VlciBvZiB0aGUgVE9UUCAobGlrZWx5IHRoZSBhcHAgbmFtZSkuXG4gICAqIEByZXR1cm5zIEEgUVIgY29kZSBVUkwgc3RyaW5nLlxuICAgKi9cbiAgZ2VuZXJhdGVRckNvZGVVcmwoYWNjb3VudE5hbWU/OiBzdHJpbmcsIGlzc3Vlcj86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IHVzZURlZmF1bHRzID0gZmFsc2U7XG4gICAgaWYgKF9pc0VtcHR5U3RyaW5nKGFjY291bnROYW1lKSB8fCBfaXNFbXB0eVN0cmluZyhpc3N1ZXIpKSB7XG4gICAgICB1c2VEZWZhdWx0cyA9IHRydWU7XG4gICAgfVxuICAgIGlmICh1c2VEZWZhdWx0cykge1xuICAgICAgaWYgKF9pc0VtcHR5U3RyaW5nKGFjY291bnROYW1lKSkge1xuICAgICAgICBhY2NvdW50TmFtZSA9IHRoaXMuYXV0aC5jdXJyZW50VXNlcj8uZW1haWwgfHwgJ3Vua25vd251c2VyJztcbiAgICAgIH1cbiAgICAgIGlmIChfaXNFbXB0eVN0cmluZyhpc3N1ZXIpKSB7XG4gICAgICAgIGlzc3VlciA9IHRoaXMuYXV0aC5uYW1lO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYG90cGF1dGg6Ly90b3RwLyR7aXNzdWVyfToke2FjY291bnROYW1lfT9zZWNyZXQ9JHt0aGlzLnNlY3JldEtleX0maXNzdWVyPSR7aXNzdWVyfSZhbGdvcml0aG09JHt0aGlzLmhhc2hpbmdBbGdvcml0aG19JmRpZ2l0cz0ke3RoaXMuY29kZUxlbmd0aH1gO1xuICB9XG59XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmZ1bmN0aW9uIF9pc0VtcHR5U3RyaW5nKGlucHV0Pzogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgaW5wdXQgPT09ICd1bmRlZmluZWQnIHx8IGlucHV0Py5sZW5ndGggPT09IDA7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgVW5zdWJzY3JpYmUgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5pbXBvcnQgeyBGaXJlYmFzZUF1dGhJbnRlcm5hbCB9IGZyb20gJ0BmaXJlYmFzZS9hdXRoLWludGVyb3AtdHlwZXMnO1xuXG5pbXBvcnQgeyBBdXRoSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9hdXRoJztcbmltcG9ydCB7IFVzZXJJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL3VzZXInO1xuaW1wb3J0IHsgX2Fzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0JztcbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG5pbnRlcmZhY2UgVG9rZW5MaXN0ZW5lciB7XG4gICh0b2s6IHN0cmluZyB8IG51bGwpOiB1bmtub3duO1xufVxuXG5leHBvcnQgY2xhc3MgQXV0aEludGVyb3AgaW1wbGVtZW50cyBGaXJlYmFzZUF1dGhJbnRlcm5hbCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZXJuYWxMaXN0ZW5lcnM6IE1hcDxUb2tlbkxpc3RlbmVyLCBVbnN1YnNjcmliZT4gPVxuICAgIG5ldyBNYXAoKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGF1dGg6IEF1dGhJbnRlcm5hbCkge31cblxuICBnZXRVaWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgdGhpcy5hc3NlcnRBdXRoQ29uZmlndXJlZCgpO1xuICAgIHJldHVybiB0aGlzLmF1dGguY3VycmVudFVzZXI/LnVpZCB8fCBudWxsO1xuICB9XG5cbiAgYXN5bmMgZ2V0VG9rZW4oXG4gICAgZm9yY2VSZWZyZXNoPzogYm9vbGVhblxuICApOiBQcm9taXNlPHsgYWNjZXNzVG9rZW46IHN0cmluZyB9IHwgbnVsbD4ge1xuICAgIHRoaXMuYXNzZXJ0QXV0aENvbmZpZ3VyZWQoKTtcbiAgICBhd2FpdCB0aGlzLmF1dGguX2luaXRpYWxpemF0aW9uUHJvbWlzZTtcbiAgICBpZiAoIXRoaXMuYXV0aC5jdXJyZW50VXNlcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgYWNjZXNzVG9rZW4gPSBhd2FpdCB0aGlzLmF1dGguY3VycmVudFVzZXIuZ2V0SWRUb2tlbihmb3JjZVJlZnJlc2gpO1xuICAgIHJldHVybiB7IGFjY2Vzc1Rva2VuIH07XG4gIH1cblxuICBhZGRBdXRoVG9rZW5MaXN0ZW5lcihsaXN0ZW5lcjogVG9rZW5MaXN0ZW5lcik6IHZvaWQge1xuICAgIHRoaXMuYXNzZXJ0QXV0aENvbmZpZ3VyZWQoKTtcbiAgICBpZiAodGhpcy5pbnRlcm5hbExpc3RlbmVycy5oYXMobGlzdGVuZXIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdW5zdWJzY3JpYmUgPSB0aGlzLmF1dGgub25JZFRva2VuQ2hhbmdlZCh1c2VyID0+IHtcbiAgICAgIGxpc3RlbmVyKFxuICAgICAgICAodXNlciBhcyBVc2VySW50ZXJuYWwgfCBudWxsKT8uc3RzVG9rZW5NYW5hZ2VyLmFjY2Vzc1Rva2VuIHx8IG51bGxcbiAgICAgICk7XG4gICAgfSk7XG4gICAgdGhpcy5pbnRlcm5hbExpc3RlbmVycy5zZXQobGlzdGVuZXIsIHVuc3Vic2NyaWJlKTtcbiAgICB0aGlzLnVwZGF0ZVByb2FjdGl2ZVJlZnJlc2goKTtcbiAgfVxuXG4gIHJlbW92ZUF1dGhUb2tlbkxpc3RlbmVyKGxpc3RlbmVyOiBUb2tlbkxpc3RlbmVyKTogdm9pZCB7XG4gICAgdGhpcy5hc3NlcnRBdXRoQ29uZmlndXJlZCgpO1xuICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gdGhpcy5pbnRlcm5hbExpc3RlbmVycy5nZXQobGlzdGVuZXIpO1xuICAgIGlmICghdW5zdWJzY3JpYmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmludGVybmFsTGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG4gICAgdW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnVwZGF0ZVByb2FjdGl2ZVJlZnJlc2goKTtcbiAgfVxuXG4gIHByaXZhdGUgYXNzZXJ0QXV0aENvbmZpZ3VyZWQoKTogdm9pZCB7XG4gICAgX2Fzc2VydChcbiAgICAgIHRoaXMuYXV0aC5faW5pdGlhbGl6YXRpb25Qcm9taXNlLFxuICAgICAgQXV0aEVycm9yQ29kZS5ERVBFTkRFTlRfU0RLX0lOSVRfQkVGT1JFX0FVVEhcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVQcm9hY3RpdmVSZWZyZXNoKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmludGVybmFsTGlzdGVuZXJzLnNpemUgPiAwKSB7XG4gICAgICB0aGlzLmF1dGguX3N0YXJ0UHJvYWN0aXZlUmVmcmVzaCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmF1dGguX3N0b3BQcm9hY3RpdmVSZWZyZXNoKCk7XG4gICAgfVxuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgX3JlZ2lzdGVyQ29tcG9uZW50LCByZWdpc3RlclZlcnNpb24gfSBmcm9tICdAZmlyZWJhc2UvYXBwJztcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgQ29tcG9uZW50VHlwZSxcbiAgSW5zdGFudGlhdGlvbk1vZGVcbn0gZnJvbSAnQGZpcmViYXNlL2NvbXBvbmVudCc7XG5cbmltcG9ydCB7IG5hbWUsIHZlcnNpb24gfSBmcm9tICcuLi8uLi8uLi9wYWNrYWdlLmpzb24nO1xuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBfYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQnO1xuaW1wb3J0IHsgX2dldENsaWVudFZlcnNpb24sIENsaWVudFBsYXRmb3JtIH0gZnJvbSAnLi4vdXRpbC92ZXJzaW9uJztcbmltcG9ydCB7IF9jYXN0QXV0aCwgQXV0aEltcGwsIERlZmF1bHRDb25maWcgfSBmcm9tICcuL2F1dGhfaW1wbCc7XG5pbXBvcnQgeyBBdXRoSW50ZXJvcCB9IGZyb20gJy4vZmlyZWJhc2VfaW50ZXJuYWwnO1xuaW1wb3J0IHsgQ29uZmlnSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9hdXRoJztcbmltcG9ydCB7IERlcGVuZGVuY2llcyB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5pbXBvcnQgeyBfaW5pdGlhbGl6ZUF1dGhJbnN0YW5jZSB9IGZyb20gJy4vaW5pdGlhbGl6ZSc7XG5cbmV4cG9ydCBjb25zdCBlbnVtIF9Db21wb25lbnROYW1lIHtcbiAgQVVUSCA9ICdhdXRoJyxcbiAgQVVUSF9JTlRFUk5BTCA9ICdhdXRoLWludGVybmFsJ1xufVxuXG5mdW5jdGlvbiBnZXRWZXJzaW9uRm9yUGxhdGZvcm0oXG4gIGNsaWVudFBsYXRmb3JtOiBDbGllbnRQbGF0Zm9ybVxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgc3dpdGNoIChjbGllbnRQbGF0Zm9ybSkge1xuICAgIGNhc2UgQ2xpZW50UGxhdGZvcm0uTk9ERTpcbiAgICAgIHJldHVybiAnbm9kZSc7XG4gICAgY2FzZSBDbGllbnRQbGF0Zm9ybS5SRUFDVF9OQVRJVkU6XG4gICAgICByZXR1cm4gJ3JuJztcbiAgICBjYXNlIENsaWVudFBsYXRmb3JtLldPUktFUjpcbiAgICAgIHJldHVybiAnd2Vid29ya2VyJztcbiAgICBjYXNlIENsaWVudFBsYXRmb3JtLkNPUkRPVkE6XG4gICAgICByZXR1cm4gJ2NvcmRvdmEnO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckF1dGgoY2xpZW50UGxhdGZvcm06IENsaWVudFBsYXRmb3JtKTogdm9pZCB7XG4gIF9yZWdpc3RlckNvbXBvbmVudChcbiAgICBuZXcgQ29tcG9uZW50KFxuICAgICAgX0NvbXBvbmVudE5hbWUuQVVUSCxcbiAgICAgIChjb250YWluZXIsIHsgb3B0aW9uczogZGVwcyB9OiB7IG9wdGlvbnM/OiBEZXBlbmRlbmNpZXMgfSkgPT4ge1xuICAgICAgICBjb25zdCBhcHAgPSBjb250YWluZXIuZ2V0UHJvdmlkZXIoJ2FwcCcpLmdldEltbWVkaWF0ZSgpITtcbiAgICAgICAgY29uc3QgaGVhcnRiZWF0U2VydmljZVByb3ZpZGVyID1cbiAgICAgICAgICBjb250YWluZXIuZ2V0UHJvdmlkZXI8J2hlYXJ0YmVhdCc+KCdoZWFydGJlYXQnKTtcbiAgICAgICAgY29uc3QgYXBwQ2hlY2tTZXJ2aWNlUHJvdmlkZXIgPVxuICAgICAgICAgIGNvbnRhaW5lci5nZXRQcm92aWRlcjwnYXBwLWNoZWNrLWludGVybmFsJz4oJ2FwcC1jaGVjay1pbnRlcm5hbCcpO1xuICAgICAgICBjb25zdCB7IGFwaUtleSwgYXV0aERvbWFpbiB9ID0gYXBwLm9wdGlvbnM7XG5cbiAgICAgICAgX2Fzc2VydChcbiAgICAgICAgICBhcGlLZXkgJiYgIWFwaUtleS5pbmNsdWRlcygnOicpLFxuICAgICAgICAgIEF1dGhFcnJvckNvZGUuSU5WQUxJRF9BUElfS0VZLFxuICAgICAgICAgIHsgYXBwTmFtZTogYXBwLm5hbWUgfVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGNvbmZpZzogQ29uZmlnSW50ZXJuYWwgPSB7XG4gICAgICAgICAgYXBpS2V5LFxuICAgICAgICAgIGF1dGhEb21haW4sXG4gICAgICAgICAgY2xpZW50UGxhdGZvcm0sXG4gICAgICAgICAgYXBpSG9zdDogRGVmYXVsdENvbmZpZy5BUElfSE9TVCxcbiAgICAgICAgICB0b2tlbkFwaUhvc3Q6IERlZmF1bHRDb25maWcuVE9LRU5fQVBJX0hPU1QsXG4gICAgICAgICAgYXBpU2NoZW1lOiBEZWZhdWx0Q29uZmlnLkFQSV9TQ0hFTUUsXG4gICAgICAgICAgc2RrQ2xpZW50VmVyc2lvbjogX2dldENsaWVudFZlcnNpb24oY2xpZW50UGxhdGZvcm0pXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgYXV0aEluc3RhbmNlID0gbmV3IEF1dGhJbXBsKFxuICAgICAgICAgIGFwcCxcbiAgICAgICAgICBoZWFydGJlYXRTZXJ2aWNlUHJvdmlkZXIsXG4gICAgICAgICAgYXBwQ2hlY2tTZXJ2aWNlUHJvdmlkZXIsXG4gICAgICAgICAgY29uZmlnXG4gICAgICAgICk7XG4gICAgICAgIF9pbml0aWFsaXplQXV0aEluc3RhbmNlKGF1dGhJbnN0YW5jZSwgZGVwcyk7XG5cbiAgICAgICAgcmV0dXJuIGF1dGhJbnN0YW5jZTtcbiAgICAgIH0sXG4gICAgICBDb21wb25lbnRUeXBlLlBVQkxJQ1xuICAgIClcbiAgICAgIC8qKlxuICAgICAgICogQXV0aCBjYW4gb25seSBiZSBpbml0aWFsaXplZCBieSBleHBsaWNpdGx5IGNhbGxpbmcgZ2V0QXV0aCgpIG9yIGluaXRpYWxpemVBdXRoKClcbiAgICAgICAqIEZvciB3aHkgd2UgZG8gdGhpcywgU2VlIGdvL2ZpcmViYXNlLW5leHQtYXV0aC1pbml0XG4gICAgICAgKi9cbiAgICAgIC5zZXRJbnN0YW50aWF0aW9uTW9kZShJbnN0YW50aWF0aW9uTW9kZS5FWFBMSUNJVClcbiAgICAgIC8qKlxuICAgICAgICogQmVjYXVzZSBhbGwgZmlyZWJhc2UgcHJvZHVjdHMgdGhhdCBkZXBlbmQgb24gYXV0aCBkZXBlbmQgb24gYXV0aC1pbnRlcm5hbCBkaXJlY3RseSxcbiAgICAgICAqIHdlIG5lZWQgdG8gaW5pdGlhbGl6ZSBhdXRoLWludGVybmFsIGFmdGVyIGF1dGggaXMgaW5pdGlhbGl6ZWQgdG8gbWFrZSBpdCBhdmFpbGFibGUgdG8gb3RoZXIgZmlyZWJhc2UgcHJvZHVjdHMuXG4gICAgICAgKi9cbiAgICAgIC5zZXRJbnN0YW5jZUNyZWF0ZWRDYWxsYmFjayhcbiAgICAgICAgKGNvbnRhaW5lciwgX2luc3RhbmNlSWRlbnRpZmllciwgX2luc3RhbmNlKSA9PiB7XG4gICAgICAgICAgY29uc3QgYXV0aEludGVybmFsUHJvdmlkZXIgPSBjb250YWluZXIuZ2V0UHJvdmlkZXIoXG4gICAgICAgICAgICBfQ29tcG9uZW50TmFtZS5BVVRIX0lOVEVSTkFMXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhdXRoSW50ZXJuYWxQcm92aWRlci5pbml0aWFsaXplKCk7XG4gICAgICAgIH1cbiAgICAgIClcbiAgKTtcblxuICBfcmVnaXN0ZXJDb21wb25lbnQoXG4gICAgbmV3IENvbXBvbmVudChcbiAgICAgIF9Db21wb25lbnROYW1lLkFVVEhfSU5URVJOQUwsXG4gICAgICBjb250YWluZXIgPT4ge1xuICAgICAgICBjb25zdCBhdXRoID0gX2Nhc3RBdXRoKFxuICAgICAgICAgIGNvbnRhaW5lci5nZXRQcm92aWRlcihfQ29tcG9uZW50TmFtZS5BVVRIKS5nZXRJbW1lZGlhdGUoKSFcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIChhdXRoID0+IG5ldyBBdXRoSW50ZXJvcChhdXRoKSkoYXV0aCk7XG4gICAgICB9LFxuICAgICAgQ29tcG9uZW50VHlwZS5QUklWQVRFXG4gICAgKS5zZXRJbnN0YW50aWF0aW9uTW9kZShJbnN0YW50aWF0aW9uTW9kZS5FWFBMSUNJVClcbiAgKTtcblxuICByZWdpc3RlclZlcnNpb24obmFtZSwgdmVyc2lvbiwgZ2V0VmVyc2lvbkZvclBsYXRmb3JtKGNsaWVudFBsYXRmb3JtKSk7XG4gIC8vIEJVSUxEX1RBUkdFVCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHZhbHVlcyBsaWtlIGVzbTUsIGVzbTIwMTcsIGNqczUsIGV0YyBkdXJpbmcgdGhlIGNvbXBpbGF0aW9uXG4gIHJlZ2lzdGVyVmVyc2lvbihuYW1lLCB2ZXJzaW9uLCAnX19CVUlMRF9UQVJHRVRfXycpO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEZpcmViYXNlQXBwLCBnZXRBcHAsIF9nZXRQcm92aWRlciB9IGZyb20gJ0BmaXJlYmFzZS9hcHAnO1xuXG5pbXBvcnQge1xuICBpbml0aWFsaXplQXV0aCxcbiAgYmVmb3JlQXV0aFN0YXRlQ2hhbmdlZCxcbiAgb25JZFRva2VuQ2hhbmdlZCxcbiAgY29ubmVjdEF1dGhFbXVsYXRvclxufSBmcm9tICcuLic7XG5pbXBvcnQgeyByZWdpc3RlckF1dGggfSBmcm9tICcuLi9jb3JlL2F1dGgvcmVnaXN0ZXInO1xuaW1wb3J0IHsgQ2xpZW50UGxhdGZvcm0gfSBmcm9tICcuLi9jb3JlL3V0aWwvdmVyc2lvbic7XG5pbXBvcnQgeyBicm93c2VyTG9jYWxQZXJzaXN0ZW5jZSB9IGZyb20gJy4vcGVyc2lzdGVuY2UvbG9jYWxfc3RvcmFnZSc7XG5pbXBvcnQgeyBicm93c2VyU2Vzc2lvblBlcnNpc3RlbmNlIH0gZnJvbSAnLi9wZXJzaXN0ZW5jZS9zZXNzaW9uX3N0b3JhZ2UnO1xuaW1wb3J0IHsgaW5kZXhlZERCTG9jYWxQZXJzaXN0ZW5jZSB9IGZyb20gJy4vcGVyc2lzdGVuY2UvaW5kZXhlZF9kYic7XG5pbXBvcnQgeyBicm93c2VyUG9wdXBSZWRpcmVjdFJlc29sdmVyIH0gZnJvbSAnLi9wb3B1cF9yZWRpcmVjdCc7XG5pbXBvcnQgeyBBdXRoLCBVc2VyIH0gZnJvbSAnLi4vbW9kZWwvcHVibGljX3R5cGVzJztcbmltcG9ydCB7IGdldERlZmF1bHRFbXVsYXRvckhvc3QsIGdldEV4cGVyaW1lbnRhbFNldHRpbmcgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5cbmNvbnN0IERFRkFVTFRfSURfVE9LRU5fTUFYX0FHRSA9IDUgKiA2MDtcbmNvbnN0IGF1dGhJZFRva2VuTWF4QWdlID1cbiAgZ2V0RXhwZXJpbWVudGFsU2V0dGluZygnYXV0aElkVG9rZW5NYXhBZ2UnKSB8fCBERUZBVUxUX0lEX1RPS0VOX01BWF9BR0U7XG5cbmxldCBsYXN0UG9zdGVkSWRUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCA9IG51bGw7XG5cbmNvbnN0IG1pbnRDb29raWVGYWN0b3J5ID0gKHVybDogc3RyaW5nKSA9PiBhc3luYyAodXNlcjogVXNlciB8IG51bGwpID0+IHtcbiAgY29uc3QgaWRUb2tlblJlc3VsdCA9IHVzZXIgJiYgKGF3YWl0IHVzZXIuZ2V0SWRUb2tlblJlc3VsdCgpKTtcbiAgY29uc3QgaWRUb2tlbkFnZSA9XG4gICAgaWRUb2tlblJlc3VsdCAmJlxuICAgIChuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIERhdGUucGFyc2UoaWRUb2tlblJlc3VsdC5pc3N1ZWRBdFRpbWUpKSAvIDFfMDAwO1xuICBpZiAoaWRUb2tlbkFnZSAmJiBpZFRva2VuQWdlID4gYXV0aElkVG9rZW5NYXhBZ2UpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gU3BlY2lmaWNhbGx5IHRyaXAgbnVsbCA9PiB1bmRlZmluZWQgd2hlbiBsb2dnZWQgb3V0LCB0byBkZWxldGUgYW55IGV4aXN0aW5nIGNvb2tpZVxuICBjb25zdCBpZFRva2VuID0gaWRUb2tlblJlc3VsdD8udG9rZW47XG4gIGlmIChsYXN0UG9zdGVkSWRUb2tlbiA9PT0gaWRUb2tlbikge1xuICAgIHJldHVybjtcbiAgfVxuICBsYXN0UG9zdGVkSWRUb2tlbiA9IGlkVG9rZW47XG4gIGF3YWl0IGZldGNoKHVybCwge1xuICAgIG1ldGhvZDogaWRUb2tlbiA/ICdQT1NUJyA6ICdERUxFVEUnLFxuICAgIGhlYWRlcnM6IGlkVG9rZW5cbiAgICAgID8ge1xuICAgICAgICAgICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke2lkVG9rZW59YFxuICAgICAgICB9XG4gICAgICA6IHt9XG4gIH0pO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBBdXRoIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvdmlkZWQge0BsaW5rIEBmaXJlYmFzZS9hcHAjRmlyZWJhc2VBcHB9LlxuICogSWYgbm8gaW5zdGFuY2UgZXhpc3RzLCBpbml0aWFsaXplcyBhbiBBdXRoIGluc3RhbmNlIHdpdGggcGxhdGZvcm0tc3BlY2lmaWMgZGVmYXVsdCBkZXBlbmRlbmNpZXMuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBGaXJlYmFzZSBBcHAuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXV0aChhcHA6IEZpcmViYXNlQXBwID0gZ2V0QXBwKCkpOiBBdXRoIHtcbiAgY29uc3QgcHJvdmlkZXIgPSBfZ2V0UHJvdmlkZXIoYXBwLCAnYXV0aCcpO1xuXG4gIGlmIChwcm92aWRlci5pc0luaXRpYWxpemVkKCkpIHtcbiAgICByZXR1cm4gcHJvdmlkZXIuZ2V0SW1tZWRpYXRlKCk7XG4gIH1cblxuICBjb25zdCBhdXRoID0gaW5pdGlhbGl6ZUF1dGgoYXBwLCB7XG4gICAgcG9wdXBSZWRpcmVjdFJlc29sdmVyOiBicm93c2VyUG9wdXBSZWRpcmVjdFJlc29sdmVyLFxuICAgIHBlcnNpc3RlbmNlOiBbXG4gICAgICBpbmRleGVkREJMb2NhbFBlcnNpc3RlbmNlLFxuICAgICAgYnJvd3NlckxvY2FsUGVyc2lzdGVuY2UsXG4gICAgICBicm93c2VyU2Vzc2lvblBlcnNpc3RlbmNlXG4gICAgXVxuICB9KTtcblxuICBjb25zdCBhdXRoVG9rZW5TeW5jVXJsID0gZ2V0RXhwZXJpbWVudGFsU2V0dGluZygnYXV0aFRva2VuU3luY1VSTCcpO1xuICBpZiAoYXV0aFRva2VuU3luY1VybCkge1xuICAgIGNvbnN0IG1pbnRDb29raWUgPSBtaW50Q29va2llRmFjdG9yeShhdXRoVG9rZW5TeW5jVXJsKTtcbiAgICBiZWZvcmVBdXRoU3RhdGVDaGFuZ2VkKGF1dGgsIG1pbnRDb29raWUsICgpID0+XG4gICAgICBtaW50Q29va2llKGF1dGguY3VycmVudFVzZXIpXG4gICAgKTtcbiAgICBvbklkVG9rZW5DaGFuZ2VkKGF1dGgsIHVzZXIgPT4gbWludENvb2tpZSh1c2VyKSk7XG4gIH1cblxuICBjb25zdCBhdXRoRW11bGF0b3JIb3N0ID0gZ2V0RGVmYXVsdEVtdWxhdG9ySG9zdCgnYXV0aCcpO1xuICBpZiAoYXV0aEVtdWxhdG9ySG9zdCkge1xuICAgIGNvbm5lY3RBdXRoRW11bGF0b3IoYXV0aCwgYGh0dHA6Ly8ke2F1dGhFbXVsYXRvckhvc3R9YCk7XG4gIH1cblxuICByZXR1cm4gYXV0aDtcbn1cblxucmVnaXN0ZXJBdXRoKENsaWVudFBsYXRmb3JtLkJST1dTRVIpO1xuIiwgIi8qKiBOb3JtYWwgaHlkcmF0aW9uIHRoYXQgYXR0YWNoZXMgdG8gYSBET00gdHJlZSBidXQgZG9lcyBub3QgZGlmZiBpdC4gKi9cbmV4cG9ydCBjb25zdCBNT0RFX0hZRFJBVEUgPSAxIDw8IDU7XG4vKiogU2lnbmlmaWVzIHRoaXMgVk5vZGUgc3VzcGVuZGVkIG9uIHRoZSBwcmV2aW91cyByZW5kZXIgKi9cbmV4cG9ydCBjb25zdCBNT0RFX1NVU1BFTkRFRCA9IDEgPDwgNztcbi8qKiBJbmRpY2F0ZXMgdGhhdCB0aGlzIG5vZGUgbmVlZHMgdG8gYmUgaW5zZXJ0ZWQgd2hpbGUgcGF0Y2hpbmcgY2hpbGRyZW4gKi9cbmV4cG9ydCBjb25zdCBJTlNFUlRfVk5PREUgPSAxIDw8IDE2O1xuLyoqIEluZGljYXRlcyBhIFZOb2RlIGhhcyBiZWVuIG1hdGNoZWQgd2l0aCBhbm90aGVyIFZOb2RlIGluIHRoZSBkaWZmICovXG5leHBvcnQgY29uc3QgTUFUQ0hFRCA9IDEgPDwgMTc7XG5cbi8qKiBSZXNldCBhbGwgbW9kZSBmbGFncyAqL1xuZXhwb3J0IGNvbnN0IFJFU0VUX01PREUgPSB+KE1PREVfSFlEUkFURSB8IE1PREVfU1VTUEVOREVEKTtcblxuZXhwb3J0IGNvbnN0IEVNUFRZX09CSiA9IC8qKiBAdHlwZSB7YW55fSAqLyAoe30pO1xuZXhwb3J0IGNvbnN0IEVNUFRZX0FSUiA9IFtdO1xuZXhwb3J0IGNvbnN0IElTX05PTl9ESU1FTlNJT05BTCA9XG5cdC9hY2l0fGV4KD86c3xnfG58cHwkKXxycGh8Z3JpZHxvd3N8bW5jfG50d3xpbmVbY2hdfHpvb3xeb3JkfGl0ZXJhL2k7XG4iLCAiaW1wb3J0IHsgRU1QVFlfQVJSIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG5leHBvcnQgY29uc3QgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbi8qKlxuICogQXNzaWduIHByb3BlcnRpZXMgZnJvbSBgcHJvcHNgIHRvIGBvYmpgXG4gKiBAdGVtcGxhdGUgTywgUCBUaGUgb2JqIGFuZCBwcm9wcyB0eXBlc1xuICogQHBhcmFtIHtPfSBvYmogVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgdG9cbiAqIEBwYXJhbSB7UH0gcHJvcHMgVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbVxuICogQHJldHVybnMge08gJiBQfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzaWduKG9iaiwgcHJvcHMpIHtcblx0Ly8gQHRzLWV4cGVjdC1lcnJvciBXZSBjaGFuZ2UgdGhlIHR5cGUgb2YgYG9iamAgdG8gYmUgYE8gJiBQYFxuXHRmb3IgKGxldCBpIGluIHByb3BzKSBvYmpbaV0gPSBwcm9wc1tpXTtcblx0cmV0dXJuIC8qKiBAdHlwZSB7TyAmIFB9ICovIChvYmopO1xufVxuXG4vKipcbiAqIFJlbW92ZSBhIGNoaWxkIG5vZGUgZnJvbSBpdHMgcGFyZW50IGlmIGF0dGFjaGVkLiBUaGlzIGlzIGEgd29ya2Fyb3VuZCBmb3JcbiAqIElFMTEgd2hpY2ggZG9lc24ndCBzdXBwb3J0IGBFbGVtZW50LnByb3RvdHlwZS5yZW1vdmUoKWAuIFVzaW5nIHRoaXMgZnVuY3Rpb25cbiAqIGlzIHNtYWxsZXIgdGhhbiBpbmNsdWRpbmcgYSBkZWRpY2F0ZWQgcG9seWZpbGwuXG4gKiBAcGFyYW0ge3ByZWFjdC5Db250YWluZXJOb2RlfSBub2RlIFRoZSBub2RlIHRvIHJlbW92ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlTm9kZShub2RlKSB7XG5cdGxldCBwYXJlbnROb2RlID0gbm9kZS5wYXJlbnROb2RlO1xuXHRpZiAocGFyZW50Tm9kZSkgcGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTtcbn1cblxuZXhwb3J0IGNvbnN0IHNsaWNlID0gRU1QVFlfQVJSLnNsaWNlO1xuIiwgImltcG9ydCB7IF9jYXRjaEVycm9yIH0gZnJvbSAnLi9kaWZmL2NhdGNoLWVycm9yJztcblxuLyoqXG4gKiBUaGUgYG9wdGlvbmAgb2JqZWN0IGNhbiBwb3RlbnRpYWxseSBjb250YWluIGNhbGxiYWNrIGZ1bmN0aW9uc1xuICogdGhhdCBhcmUgY2FsbGVkIGR1cmluZyB2YXJpb3VzIHN0YWdlcyBvZiBvdXIgcmVuZGVyZXIuIFRoaXMgaXMgdGhlXG4gKiBmb3VuZGF0aW9uIG9uIHdoaWNoIGFsbCBvdXIgYWRkb25zIGxpa2UgYHByZWFjdC9kZWJ1Z2AsIGBwcmVhY3QvY29tcGF0YCxcbiAqIGFuZCBgcHJlYWN0L2hvb2tzYCBhcmUgYmFzZWQgb24uIFNlZSB0aGUgYE9wdGlvbnNgIHR5cGUgaW4gYGludGVybmFsLmQudHNgXG4gKiBmb3IgYSBmdWxsIGxpc3Qgb2YgYXZhaWxhYmxlIG9wdGlvbiBob29rcyAobW9zdCBlZGl0b3JzL0lERXMgYWxsb3cgeW91IHRvXG4gKiBjdHJsK2NsaWNrIG9yIGNtZCtjbGljayBvbiBtYWMgdGhlIHR5cGUgZGVmaW5pdGlvbiBiZWxvdykuXG4gKiBAdHlwZSB7T3B0aW9uc31cbiAqL1xuY29uc3Qgb3B0aW9ucyA9IHtcblx0X2NhdGNoRXJyb3Jcbn07XG5cbmV4cG9ydCBkZWZhdWx0IG9wdGlvbnM7XG4iLCAiaW1wb3J0IHsgc2xpY2UgfSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IG9wdGlvbnMgZnJvbSAnLi9vcHRpb25zJztcblxubGV0IHZub2RlSWQgPSAwO1xuXG4vKipcbiAqIENyZWF0ZSBhbiB2aXJ0dWFsIG5vZGUgKHVzZWQgZm9yIEpTWClcbiAqIEBwYXJhbSB7Vk5vZGVbXCJ0eXBlXCJdfSB0eXBlIFRoZSBub2RlIG5hbWUgb3IgQ29tcG9uZW50IGNvbnN0cnVjdG9yIGZvciB0aGlzXG4gKiB2aXJ0dWFsIG5vZGVcbiAqIEBwYXJhbSB7b2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZH0gW3Byb3BzXSBUaGUgcHJvcGVydGllcyBvZiB0aGUgdmlydHVhbCBub2RlXG4gKiBAcGFyYW0ge0FycmF5PGltcG9ydCgnLicpLkNvbXBvbmVudENoaWxkcmVuPn0gW2NoaWxkcmVuXSBUaGUgY2hpbGRyZW4gb2YgdGhlXG4gKiB2aXJ0dWFsIG5vZGVcbiAqIEByZXR1cm5zIHtWTm9kZX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQodHlwZSwgcHJvcHMsIGNoaWxkcmVuKSB7XG5cdGxldCBub3JtYWxpemVkUHJvcHMgPSB7fSxcblx0XHRrZXksXG5cdFx0cmVmLFxuXHRcdGk7XG5cdGZvciAoaSBpbiBwcm9wcykge1xuXHRcdGlmIChpID09ICdrZXknKSBrZXkgPSBwcm9wc1tpXTtcblx0XHRlbHNlIGlmIChpID09ICdyZWYnKSByZWYgPSBwcm9wc1tpXTtcblx0XHRlbHNlIG5vcm1hbGl6ZWRQcm9wc1tpXSA9IHByb3BzW2ldO1xuXHR9XG5cblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7XG5cdFx0bm9ybWFsaXplZFByb3BzLmNoaWxkcmVuID1cblx0XHRcdGFyZ3VtZW50cy5sZW5ndGggPiAzID8gc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpIDogY2hpbGRyZW47XG5cdH1cblxuXHQvLyBJZiBhIENvbXBvbmVudCBWTm9kZSwgY2hlY2sgZm9yIGFuZCBhcHBseSBkZWZhdWx0UHJvcHNcblx0Ly8gTm90ZTogdHlwZSBtYXkgYmUgdW5kZWZpbmVkIGluIGRldmVsb3BtZW50LCBtdXN0IG5ldmVyIGVycm9yIGhlcmUuXG5cdGlmICh0eXBlb2YgdHlwZSA9PSAnZnVuY3Rpb24nICYmIHR5cGUuZGVmYXVsdFByb3BzICE9IG51bGwpIHtcblx0XHRmb3IgKGkgaW4gdHlwZS5kZWZhdWx0UHJvcHMpIHtcblx0XHRcdGlmIChub3JtYWxpemVkUHJvcHNbaV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRub3JtYWxpemVkUHJvcHNbaV0gPSB0eXBlLmRlZmF1bHRQcm9wc1tpXTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gY3JlYXRlVk5vZGUodHlwZSwgbm9ybWFsaXplZFByb3BzLCBrZXksIHJlZiwgbnVsbCk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgVk5vZGUgKHVzZWQgaW50ZXJuYWxseSBieSBQcmVhY3QpXG4gKiBAcGFyYW0ge1ZOb2RlW1widHlwZVwiXX0gdHlwZSBUaGUgbm9kZSBuYW1lIG9yIENvbXBvbmVudFxuICogQ29uc3RydWN0b3IgZm9yIHRoaXMgdmlydHVhbCBub2RlXG4gKiBAcGFyYW0ge29iamVjdCB8IHN0cmluZyB8IG51bWJlciB8IG51bGx9IHByb3BzIFRoZSBwcm9wZXJ0aWVzIG9mIHRoaXMgdmlydHVhbCBub2RlLlxuICogSWYgdGhpcyB2aXJ0dWFsIG5vZGUgcmVwcmVzZW50cyBhIHRleHQgbm9kZSwgdGhpcyBpcyB0aGUgdGV4dCBvZiB0aGUgbm9kZSAoc3RyaW5nIG9yIG51bWJlcikuXG4gKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlciB8IG51bGx9IGtleSBUaGUga2V5IGZvciB0aGlzIHZpcnR1YWwgbm9kZSwgdXNlZCB3aGVuXG4gKiBkaWZmaW5nIGl0IGFnYWluc3QgaXRzIGNoaWxkcmVuXG4gKiBAcGFyYW0ge1ZOb2RlW1wicmVmXCJdfSByZWYgVGhlIHJlZiBwcm9wZXJ0eSB0aGF0IHdpbGxcbiAqIHJlY2VpdmUgYSByZWZlcmVuY2UgdG8gaXRzIGNyZWF0ZWQgY2hpbGRcbiAqIEByZXR1cm5zIHtWTm9kZX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVZOb2RlKHR5cGUsIHByb3BzLCBrZXksIHJlZiwgb3JpZ2luYWwpIHtcblx0Ly8gVjggc2VlbXMgdG8gYmUgYmV0dGVyIGF0IGRldGVjdGluZyB0eXBlIHNoYXBlcyBpZiB0aGUgb2JqZWN0IGlzIGFsbG9jYXRlZCBmcm9tIHRoZSBzYW1lIGNhbGwgc2l0ZVxuXHQvLyBEbyBub3QgaW5saW5lIGludG8gY3JlYXRlRWxlbWVudCBhbmQgY29lcmNlVG9WTm9kZSFcblx0LyoqIEB0eXBlIHtWTm9kZX0gKi9cblx0Y29uc3Qgdm5vZGUgPSB7XG5cdFx0dHlwZSxcblx0XHRwcm9wcyxcblx0XHRrZXksXG5cdFx0cmVmLFxuXHRcdF9jaGlsZHJlbjogbnVsbCxcblx0XHRfcGFyZW50OiBudWxsLFxuXHRcdF9kZXB0aDogMCxcblx0XHRfZG9tOiBudWxsLFxuXHRcdC8vIF9uZXh0RG9tIG11c3QgYmUgaW5pdGlhbGl6ZWQgdG8gdW5kZWZpbmVkIGIvYyBpdCB3aWxsIGV2ZW50dWFsbHlcblx0XHQvLyBiZSBzZXQgdG8gZG9tLm5leHRTaWJsaW5nIHdoaWNoIGNhbiByZXR1cm4gYG51bGxgIGFuZCBpdCBpcyBpbXBvcnRhbnRcblx0XHQvLyB0byBiZSBhYmxlIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gYW4gdW5pbml0aWFsaXplZCBfbmV4dERvbSBhbmRcblx0XHQvLyBhIF9uZXh0RG9tIHRoYXQgaGFzIGJlZW4gc2V0IHRvIGBudWxsYFxuXHRcdF9uZXh0RG9tOiB1bmRlZmluZWQsXG5cdFx0X2NvbXBvbmVudDogbnVsbCxcblx0XHRjb25zdHJ1Y3RvcjogdW5kZWZpbmVkLFxuXHRcdF9vcmlnaW5hbDogb3JpZ2luYWwgPT0gbnVsbCA/ICsrdm5vZGVJZCA6IG9yaWdpbmFsLFxuXHRcdF9pbmRleDogLTEsXG5cdFx0X2ZsYWdzOiAwXG5cdH07XG5cblx0Ly8gT25seSBpbnZva2UgdGhlIHZub2RlIGhvb2sgaWYgdGhpcyB3YXMgKm5vdCogYSBkaXJlY3QgY29weTpcblx0aWYgKG9yaWdpbmFsID09IG51bGwgJiYgb3B0aW9ucy52bm9kZSAhPSBudWxsKSBvcHRpb25zLnZub2RlKHZub2RlKTtcblxuXHRyZXR1cm4gdm5vZGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWYoKSB7XG5cdHJldHVybiB7IGN1cnJlbnQ6IG51bGwgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEZyYWdtZW50KHByb3BzKSB7XG5cdHJldHVybiBwcm9wcy5jaGlsZHJlbjtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIHRoZSBhcmd1bWVudCBpcyBhIHZhbGlkIFByZWFjdCBWTm9kZS5cbiAqIEBwYXJhbSB7Kn0gdm5vZGVcbiAqIEByZXR1cm5zIHt2bm9kZSBpcyBWTm9kZX1cbiAqL1xuZXhwb3J0IGNvbnN0IGlzVmFsaWRFbGVtZW50ID0gdm5vZGUgPT5cblx0dm5vZGUgIT0gbnVsbCAmJiB2bm9kZS5jb25zdHJ1Y3RvciA9PSB1bmRlZmluZWQ7XG4iLCAiaW1wb3J0IHsgYXNzaWduIH0gZnJvbSAnLi91dGlsJztcbmltcG9ydCB7IGRpZmYsIGNvbW1pdFJvb3QgfSBmcm9tICcuL2RpZmYvaW5kZXgnO1xuaW1wb3J0IG9wdGlvbnMgZnJvbSAnLi9vcHRpb25zJztcbmltcG9ydCB7IEZyYWdtZW50IH0gZnJvbSAnLi9jcmVhdGUtZWxlbWVudCc7XG5pbXBvcnQgeyBNT0RFX0hZRFJBVEUgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbi8qKlxuICogQmFzZSBDb21wb25lbnQgY2xhc3MuIFByb3ZpZGVzIGBzZXRTdGF0ZSgpYCBhbmQgYGZvcmNlVXBkYXRlKClgLCB3aGljaFxuICogdHJpZ2dlciByZW5kZXJpbmdcbiAqIEBwYXJhbSB7b2JqZWN0fSBwcm9wcyBUaGUgaW5pdGlhbCBjb21wb25lbnQgcHJvcHNcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb250ZXh0IFRoZSBpbml0aWFsIGNvbnRleHQgZnJvbSBwYXJlbnQgY29tcG9uZW50cydcbiAqIGdldENoaWxkQ29udGV4dFxuICovXG5leHBvcnQgZnVuY3Rpb24gQmFzZUNvbXBvbmVudChwcm9wcywgY29udGV4dCkge1xuXHR0aGlzLnByb3BzID0gcHJvcHM7XG5cdHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG59XG5cbi8qKlxuICogVXBkYXRlIGNvbXBvbmVudCBzdGF0ZSBhbmQgc2NoZWR1bGUgYSByZS1yZW5kZXIuXG4gKiBAdGhpcyB7Q29tcG9uZW50fVxuICogQHBhcmFtIHtvYmplY3QgfCAoKHM6IG9iamVjdCwgcDogb2JqZWN0KSA9PiBvYmplY3QpfSB1cGRhdGUgQSBoYXNoIG9mIHN0YXRlXG4gKiBwcm9wZXJ0aWVzIHRvIHVwZGF0ZSB3aXRoIG5ldyB2YWx1ZXMgb3IgYSBmdW5jdGlvbiB0aGF0IGdpdmVuIHRoZSBjdXJyZW50XG4gKiBzdGF0ZSBhbmQgcHJvcHMgcmV0dXJucyBhIG5ldyBwYXJ0aWFsIHN0YXRlXG4gKiBAcGFyYW0geygpID0+IHZvaWR9IFtjYWxsYmFja10gQSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgb25jZSBjb21wb25lbnQgc3RhdGUgaXNcbiAqIHVwZGF0ZWRcbiAqL1xuQmFzZUNvbXBvbmVudC5wcm90b3R5cGUuc2V0U3RhdGUgPSBmdW5jdGlvbiAodXBkYXRlLCBjYWxsYmFjaykge1xuXHQvLyBvbmx5IGNsb25lIHN0YXRlIHdoZW4gY29weWluZyB0byBuZXh0U3RhdGUgdGhlIGZpcnN0IHRpbWUuXG5cdGxldCBzO1xuXHRpZiAodGhpcy5fbmV4dFN0YXRlICE9IG51bGwgJiYgdGhpcy5fbmV4dFN0YXRlICE9PSB0aGlzLnN0YXRlKSB7XG5cdFx0cyA9IHRoaXMuX25leHRTdGF0ZTtcblx0fSBlbHNlIHtcblx0XHRzID0gdGhpcy5fbmV4dFN0YXRlID0gYXNzaWduKHt9LCB0aGlzLnN0YXRlKTtcblx0fVxuXG5cdGlmICh0eXBlb2YgdXBkYXRlID09ICdmdW5jdGlvbicpIHtcblx0XHQvLyBTb21lIGxpYnJhcmllcyBsaWtlIGBpbW1lcmAgbWFyayB0aGUgY3VycmVudCBzdGF0ZSBhcyByZWFkb25seSxcblx0XHQvLyBwcmV2ZW50aW5nIHVzIGZyb20gbXV0YXRpbmcgaXQsIHNvIHdlIG5lZWQgdG8gY2xvbmUgaXQuIFNlZSAjMjcxNlxuXHRcdHVwZGF0ZSA9IHVwZGF0ZShhc3NpZ24oe30sIHMpLCB0aGlzLnByb3BzKTtcblx0fVxuXG5cdGlmICh1cGRhdGUpIHtcblx0XHRhc3NpZ24ocywgdXBkYXRlKTtcblx0fVxuXG5cdC8vIFNraXAgdXBkYXRlIGlmIHVwZGF0ZXIgZnVuY3Rpb24gcmV0dXJuZWQgbnVsbFxuXHRpZiAodXBkYXRlID09IG51bGwpIHJldHVybjtcblxuXHRpZiAodGhpcy5fdm5vZGUpIHtcblx0XHRpZiAoY2FsbGJhY2spIHtcblx0XHRcdHRoaXMuX3N0YXRlQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuXHRcdH1cblx0XHRlbnF1ZXVlUmVuZGVyKHRoaXMpO1xuXHR9XG59O1xuXG4vKipcbiAqIEltbWVkaWF0ZWx5IHBlcmZvcm0gYSBzeW5jaHJvbm91cyByZS1yZW5kZXIgb2YgdGhlIGNvbXBvbmVudFxuICogQHRoaXMge0NvbXBvbmVudH1cbiAqIEBwYXJhbSB7KCkgPT4gdm9pZH0gW2NhbGxiYWNrXSBBIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBhZnRlciBjb21wb25lbnQgaXNcbiAqIHJlLXJlbmRlcmVkXG4gKi9cbkJhc2VDb21wb25lbnQucHJvdG90eXBlLmZvcmNlVXBkYXRlID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG5cdGlmICh0aGlzLl92bm9kZSkge1xuXHRcdC8vIFNldCByZW5kZXIgbW9kZSBzbyB0aGF0IHdlIGNhbiBkaWZmZXJlbnRpYXRlIHdoZXJlIHRoZSByZW5kZXIgcmVxdWVzdFxuXHRcdC8vIGlzIGNvbWluZyBmcm9tLiBXZSBuZWVkIHRoaXMgYmVjYXVzZSBmb3JjZVVwZGF0ZSBzaG91bGQgbmV2ZXIgY2FsbFxuXHRcdC8vIHNob3VsZENvbXBvbmVudFVwZGF0ZVxuXHRcdHRoaXMuX2ZvcmNlID0gdHJ1ZTtcblx0XHRpZiAoY2FsbGJhY2spIHRoaXMuX3JlbmRlckNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcblx0XHRlbnF1ZXVlUmVuZGVyKHRoaXMpO1xuXHR9XG59O1xuXG4vKipcbiAqIEFjY2VwdHMgYHByb3BzYCBhbmQgYHN0YXRlYCwgYW5kIHJldHVybnMgYSBuZXcgVmlydHVhbCBET00gdHJlZSB0byBidWlsZC5cbiAqIFZpcnR1YWwgRE9NIGlzIGdlbmVyYWxseSBjb25zdHJ1Y3RlZCB2aWEgW0pTWF0oaHR0cDovL2phc29uZm9ybWF0LmNvbS93dGYtaXMtanN4KS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBwcm9wcyBQcm9wcyAoZWc6IEpTWCBhdHRyaWJ1dGVzKSByZWNlaXZlZCBmcm9tIHBhcmVudFxuICogZWxlbWVudC9jb21wb25lbnRcbiAqIEBwYXJhbSB7b2JqZWN0fSBzdGF0ZSBUaGUgY29tcG9uZW50J3MgY3VycmVudCBzdGF0ZVxuICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHQgQ29udGV4dCBvYmplY3QsIGFzIHJldHVybmVkIGJ5IHRoZSBuZWFyZXN0XG4gKiBhbmNlc3RvcidzIGBnZXRDaGlsZENvbnRleHQoKWBcbiAqIEByZXR1cm5zIHtDb21wb25lbnRDaGlsZHJlbiB8IHZvaWR9XG4gKi9cbkJhc2VDb21wb25lbnQucHJvdG90eXBlLnJlbmRlciA9IEZyYWdtZW50O1xuXG4vKipcbiAqIEBwYXJhbSB7Vk5vZGV9IHZub2RlXG4gKiBAcGFyYW0ge251bWJlciB8IG51bGx9IFtjaGlsZEluZGV4XVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RG9tU2libGluZyh2bm9kZSwgY2hpbGRJbmRleCkge1xuXHRpZiAoY2hpbGRJbmRleCA9PSBudWxsKSB7XG5cdFx0Ly8gVXNlIGNoaWxkSW5kZXg9PW51bGwgYXMgYSBzaWduYWwgdG8gcmVzdW1lIHRoZSBzZWFyY2ggZnJvbSB0aGUgdm5vZGUncyBzaWJsaW5nXG5cdFx0cmV0dXJuIHZub2RlLl9wYXJlbnRcblx0XHRcdD8gZ2V0RG9tU2libGluZyh2bm9kZS5fcGFyZW50LCB2bm9kZS5faW5kZXggKyAxKVxuXHRcdFx0OiBudWxsO1xuXHR9XG5cblx0bGV0IHNpYmxpbmc7XG5cdGZvciAoOyBjaGlsZEluZGV4IDwgdm5vZGUuX2NoaWxkcmVuLmxlbmd0aDsgY2hpbGRJbmRleCsrKSB7XG5cdFx0c2libGluZyA9IHZub2RlLl9jaGlsZHJlbltjaGlsZEluZGV4XTtcblxuXHRcdGlmIChzaWJsaW5nICE9IG51bGwgJiYgc2libGluZy5fZG9tICE9IG51bGwpIHtcblx0XHRcdC8vIFNpbmNlIHVwZGF0ZVBhcmVudERvbVBvaW50ZXJzIGtlZXBzIF9kb20gcG9pbnRlciBjb3JyZWN0LFxuXHRcdFx0Ly8gd2UgY2FuIHJlbHkgb24gX2RvbSB0byB0ZWxsIHVzIGlmIHRoaXMgc3VidHJlZSBjb250YWlucyBhXG5cdFx0XHQvLyByZW5kZXJlZCBET00gbm9kZSwgYW5kIHdoYXQgdGhlIGZpcnN0IHJlbmRlcmVkIERPTSBub2RlIGlzXG5cdFx0XHRyZXR1cm4gc2libGluZy5fZG9tO1xuXHRcdH1cblx0fVxuXG5cdC8vIElmIHdlIGdldCBoZXJlLCB3ZSBoYXZlIG5vdCBmb3VuZCBhIERPTSBub2RlIGluIHRoaXMgdm5vZGUncyBjaGlsZHJlbi5cblx0Ly8gV2UgbXVzdCByZXN1bWUgZnJvbSB0aGlzIHZub2RlJ3Mgc2libGluZyAoaW4gaXQncyBwYXJlbnQgX2NoaWxkcmVuIGFycmF5KVxuXHQvLyBPbmx5IGNsaW1iIHVwIGFuZCBzZWFyY2ggdGhlIHBhcmVudCBpZiB3ZSBhcmVuJ3Qgc2VhcmNoaW5nIHRocm91Z2ggYSBET01cblx0Ly8gVk5vZGUgKG1lYW5pbmcgd2UgcmVhY2hlZCB0aGUgRE9NIHBhcmVudCBvZiB0aGUgb3JpZ2luYWwgdm5vZGUgdGhhdCBiZWdhblxuXHQvLyB0aGUgc2VhcmNoKVxuXHRyZXR1cm4gdHlwZW9mIHZub2RlLnR5cGUgPT0gJ2Z1bmN0aW9uJyA/IGdldERvbVNpYmxpbmcodm5vZGUpIDogbnVsbDtcbn1cblxuLyoqXG4gKiBUcmlnZ2VyIGluLXBsYWNlIHJlLXJlbmRlcmluZyBvZiBhIGNvbXBvbmVudC5cbiAqIEBwYXJhbSB7Q29tcG9uZW50fSBjb21wb25lbnQgVGhlIGNvbXBvbmVudCB0byByZXJlbmRlclxuICovXG5mdW5jdGlvbiByZW5kZXJDb21wb25lbnQoY29tcG9uZW50KSB7XG5cdGxldCBvbGRWTm9kZSA9IGNvbXBvbmVudC5fdm5vZGUsXG5cdFx0b2xkRG9tID0gb2xkVk5vZGUuX2RvbSxcblx0XHRwYXJlbnREb20gPSBjb21wb25lbnQuX3BhcmVudERvbSxcblx0XHRjb21taXRRdWV1ZSA9IFtdLFxuXHRcdHJlZlF1ZXVlID0gW107XG5cblx0aWYgKHBhcmVudERvbSkge1xuXHRcdGNvbnN0IG5ld1ZOb2RlID0gYXNzaWduKHt9LCBvbGRWTm9kZSk7XG5cdFx0bmV3Vk5vZGUuX29yaWdpbmFsID0gb2xkVk5vZGUuX29yaWdpbmFsICsgMTtcblx0XHRpZiAob3B0aW9ucy52bm9kZSkgb3B0aW9ucy52bm9kZShuZXdWTm9kZSk7XG5cblx0XHRkaWZmKFxuXHRcdFx0cGFyZW50RG9tLFxuXHRcdFx0bmV3Vk5vZGUsXG5cdFx0XHRvbGRWTm9kZSxcblx0XHRcdGNvbXBvbmVudC5fZ2xvYmFsQ29udGV4dCxcblx0XHRcdHBhcmVudERvbS5vd25lclNWR0VsZW1lbnQgIT09IHVuZGVmaW5lZCxcblx0XHRcdG9sZFZOb2RlLl9mbGFncyAmIE1PREVfSFlEUkFURSA/IFtvbGREb21dIDogbnVsbCxcblx0XHRcdGNvbW1pdFF1ZXVlLFxuXHRcdFx0b2xkRG9tID09IG51bGwgPyBnZXREb21TaWJsaW5nKG9sZFZOb2RlKSA6IG9sZERvbSxcblx0XHRcdCEhKG9sZFZOb2RlLl9mbGFncyAmIE1PREVfSFlEUkFURSksXG5cdFx0XHRyZWZRdWV1ZVxuXHRcdCk7XG5cblx0XHRuZXdWTm9kZS5fcGFyZW50Ll9jaGlsZHJlbltuZXdWTm9kZS5faW5kZXhdID0gbmV3Vk5vZGU7XG5cdFx0Y29tbWl0Um9vdChjb21taXRRdWV1ZSwgbmV3Vk5vZGUsIHJlZlF1ZXVlKTtcblxuXHRcdGlmIChuZXdWTm9kZS5fZG9tICE9IG9sZERvbSkge1xuXHRcdFx0dXBkYXRlUGFyZW50RG9tUG9pbnRlcnMobmV3Vk5vZGUpO1xuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIEBwYXJhbSB7Vk5vZGV9IHZub2RlXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZVBhcmVudERvbVBvaW50ZXJzKHZub2RlKSB7XG5cdGlmICgodm5vZGUgPSB2bm9kZS5fcGFyZW50KSAhPSBudWxsICYmIHZub2RlLl9jb21wb25lbnQgIT0gbnVsbCkge1xuXHRcdHZub2RlLl9kb20gPSB2bm9kZS5fY29tcG9uZW50LmJhc2UgPSBudWxsO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdm5vZGUuX2NoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRsZXQgY2hpbGQgPSB2bm9kZS5fY2hpbGRyZW5baV07XG5cdFx0XHRpZiAoY2hpbGQgIT0gbnVsbCAmJiBjaGlsZC5fZG9tICE9IG51bGwpIHtcblx0XHRcdFx0dm5vZGUuX2RvbSA9IHZub2RlLl9jb21wb25lbnQuYmFzZSA9IGNoaWxkLl9kb207XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB1cGRhdGVQYXJlbnREb21Qb2ludGVycyh2bm9kZSk7XG5cdH1cbn1cblxuLyoqXG4gKiBUaGUgcmVuZGVyIHF1ZXVlXG4gKiBAdHlwZSB7QXJyYXk8Q29tcG9uZW50Pn1cbiAqL1xubGV0IHJlcmVuZGVyUXVldWUgPSBbXTtcblxuLypcbiAqIFRoZSB2YWx1ZSBvZiBgQ29tcG9uZW50LmRlYm91bmNlYCBtdXN0IGFzeW5jaHJvbm91c2x5IGludm9rZSB0aGUgcGFzc2VkIGluIGNhbGxiYWNrLiBJdCBpc1xuICogaW1wb3J0YW50IHRoYXQgY29udHJpYnV0b3JzIHRvIFByZWFjdCBjYW4gY29uc2lzdGVudGx5IHJlYXNvbiBhYm91dCB3aGF0IGNhbGxzIHRvIGBzZXRTdGF0ZWAsIGV0Yy5cbiAqIGRvLCBhbmQgd2hlbiB0aGVpciBlZmZlY3RzIHdpbGwgYmUgYXBwbGllZC4gU2VlIHRoZSBsaW5rcyBiZWxvdyBmb3Igc29tZSBmdXJ0aGVyIHJlYWRpbmcgb24gZGVzaWduaW5nXG4gKiBhc3luY2hyb25vdXMgQVBJcy5cbiAqICogW0Rlc2lnbmluZyBBUElzIGZvciBBc3luY2hyb255XShodHRwczovL2Jsb2cuaXpzLm1lLzIwMTMvMDgvZGVzaWduaW5nLWFwaXMtZm9yLWFzeW5jaHJvbnkpXG4gKiAqIFtDYWxsYmFja3Mgc3luY2hyb25vdXMgYW5kIGFzeW5jaHJvbm91c10oaHR0cHM6Ly9ibG9nLm9tZXRlci5jb20vMjAxMS8wNy8yNC9jYWxsYmFja3Mtc3luY2hyb25vdXMtYW5kLWFzeW5jaHJvbm91cy8pXG4gKi9cblxubGV0IHByZXZEZWJvdW5jZTtcblxuY29uc3QgZGVmZXIgPVxuXHR0eXBlb2YgUHJvbWlzZSA9PSAnZnVuY3Rpb24nXG5cdFx0PyBQcm9taXNlLnByb3RvdHlwZS50aGVuLmJpbmQoUHJvbWlzZS5yZXNvbHZlKCkpXG5cdFx0OiBzZXRUaW1lb3V0O1xuXG4vKipcbiAqIEVucXVldWUgYSByZXJlbmRlciBvZiBhIGNvbXBvbmVudFxuICogQHBhcmFtIHtDb21wb25lbnR9IGMgVGhlIGNvbXBvbmVudCB0byByZXJlbmRlclxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5xdWV1ZVJlbmRlcihjKSB7XG5cdGlmIChcblx0XHQoIWMuX2RpcnR5ICYmXG5cdFx0XHQoYy5fZGlydHkgPSB0cnVlKSAmJlxuXHRcdFx0cmVyZW5kZXJRdWV1ZS5wdXNoKGMpICYmXG5cdFx0XHQhcHJvY2Vzcy5fcmVyZW5kZXJDb3VudCsrKSB8fFxuXHRcdHByZXZEZWJvdW5jZSAhPT0gb3B0aW9ucy5kZWJvdW5jZVJlbmRlcmluZ1xuXHQpIHtcblx0XHRwcmV2RGVib3VuY2UgPSBvcHRpb25zLmRlYm91bmNlUmVuZGVyaW5nO1xuXHRcdChwcmV2RGVib3VuY2UgfHwgZGVmZXIpKHByb2Nlc3MpO1xuXHR9XG59XG5cbi8qKlxuICogQHBhcmFtIHtDb21wb25lbnR9IGFcbiAqIEBwYXJhbSB7Q29tcG9uZW50fSBiXG4gKi9cbmNvbnN0IGRlcHRoU29ydCA9IChhLCBiKSA9PiBhLl92bm9kZS5fZGVwdGggLSBiLl92bm9kZS5fZGVwdGg7XG5cbi8qKiBGbHVzaCB0aGUgcmVuZGVyIHF1ZXVlIGJ5IHJlcmVuZGVyaW5nIGFsbCBxdWV1ZWQgY29tcG9uZW50cyAqL1xuZnVuY3Rpb24gcHJvY2VzcygpIHtcblx0bGV0IGM7XG5cdHJlcmVuZGVyUXVldWUuc29ydChkZXB0aFNvcnQpO1xuXHQvLyBEb24ndCB1cGRhdGUgYHJlbmRlckNvdW50YCB5ZXQuIEtlZXAgaXRzIHZhbHVlIG5vbi16ZXJvIHRvIHByZXZlbnQgdW5uZWNlc3Nhcnlcblx0Ly8gcHJvY2VzcygpIGNhbGxzIGZyb20gZ2V0dGluZyBzY2hlZHVsZWQgd2hpbGUgYHF1ZXVlYCBpcyBzdGlsbCBiZWluZyBjb25zdW1lZC5cblx0d2hpbGUgKChjID0gcmVyZW5kZXJRdWV1ZS5zaGlmdCgpKSkge1xuXHRcdGlmIChjLl9kaXJ0eSkge1xuXHRcdFx0bGV0IHJlbmRlclF1ZXVlTGVuZ3RoID0gcmVyZW5kZXJRdWV1ZS5sZW5ndGg7XG5cdFx0XHRyZW5kZXJDb21wb25lbnQoYyk7XG5cdFx0XHRpZiAocmVyZW5kZXJRdWV1ZS5sZW5ndGggPiByZW5kZXJRdWV1ZUxlbmd0aCkge1xuXHRcdFx0XHQvLyBXaGVuIGkuZS4gcmVyZW5kZXJpbmcgYSBwcm92aWRlciBhZGRpdGlvbmFsIG5ldyBpdGVtcyBjYW4gYmUgaW5qZWN0ZWQsIHdlIHdhbnQgdG9cblx0XHRcdFx0Ly8ga2VlcCB0aGUgb3JkZXIgZnJvbSB0b3AgdG8gYm90dG9tIHdpdGggdGhvc2UgbmV3IGl0ZW1zIHNvIHdlIGNhbiBoYW5kbGUgdGhlbSBpbiBhXG5cdFx0XHRcdC8vIHNpbmdsZSBwYXNzXG5cdFx0XHRcdHJlcmVuZGVyUXVldWUuc29ydChkZXB0aFNvcnQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRwcm9jZXNzLl9yZXJlbmRlckNvdW50ID0gMDtcbn1cblxucHJvY2Vzcy5fcmVyZW5kZXJDb3VudCA9IDA7XG4iLCAiaW1wb3J0IHsgZW5xdWV1ZVJlbmRlciB9IGZyb20gJy4vY29tcG9uZW50JztcblxuZXhwb3J0IGxldCBpID0gMDtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQoZGVmYXVsdFZhbHVlLCBjb250ZXh0SWQpIHtcblx0Y29udGV4dElkID0gJ19fY0MnICsgaSsrO1xuXG5cdGNvbnN0IGNvbnRleHQgPSB7XG5cdFx0X2lkOiBjb250ZXh0SWQsXG5cdFx0X2RlZmF1bHRWYWx1ZTogZGVmYXVsdFZhbHVlLFxuXHRcdC8qKiBAdHlwZSB7RnVuY3Rpb25Db21wb25lbnR9ICovXG5cdFx0Q29uc3VtZXIocHJvcHMsIGNvbnRleHRWYWx1ZSkge1xuXHRcdFx0Ly8gcmV0dXJuIHByb3BzLmNoaWxkcmVuKFxuXHRcdFx0Ly8gXHRjb250ZXh0W2NvbnRleHRJZF0gPyBjb250ZXh0W2NvbnRleHRJZF0ucHJvcHMudmFsdWUgOiBkZWZhdWx0VmFsdWVcblx0XHRcdC8vICk7XG5cdFx0XHRyZXR1cm4gcHJvcHMuY2hpbGRyZW4oY29udGV4dFZhbHVlKTtcblx0XHR9LFxuXHRcdC8qKiBAdHlwZSB7RnVuY3Rpb25Db21wb25lbnR9ICovXG5cdFx0UHJvdmlkZXIocHJvcHMpIHtcblx0XHRcdGlmICghdGhpcy5nZXRDaGlsZENvbnRleHQpIHtcblx0XHRcdFx0LyoqIEB0eXBlIHtDb21wb25lbnRbXX0gKi9cblx0XHRcdFx0bGV0IHN1YnMgPSBbXTtcblx0XHRcdFx0bGV0IGN0eCA9IHt9O1xuXHRcdFx0XHRjdHhbY29udGV4dElkXSA9IHRoaXM7XG5cblx0XHRcdFx0dGhpcy5nZXRDaGlsZENvbnRleHQgPSAoKSA9PiBjdHg7XG5cblx0XHRcdFx0dGhpcy5zaG91bGRDb21wb25lbnRVcGRhdGUgPSBmdW5jdGlvbiAoX3Byb3BzKSB7XG5cdFx0XHRcdFx0aWYgKHRoaXMucHJvcHMudmFsdWUgIT09IF9wcm9wcy52YWx1ZSkge1xuXHRcdFx0XHRcdFx0Ly8gSSB0aGluayB0aGUgZm9yY2VkIHZhbHVlIHByb3BhZ2F0aW9uIGhlcmUgd2FzIG9ubHkgbmVlZGVkIHdoZW4gYG9wdGlvbnMuZGVib3VuY2VSZW5kZXJpbmdgIHdhcyBiZWluZyBieXBhc3NlZDpcblx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wcmVhY3Rqcy9wcmVhY3QvY29tbWl0LzRkMzM5ZmI4MDNiZWEwOWU5ZjE5OGFiZjM4Y2ExYmY4ZWE0Yjc3NzEjZGlmZi01NDY4MmNlMzgwOTM1YTcxN2U0MWI4YmZjNTQ3MzdmNlIzNThcblx0XHRcdFx0XHRcdC8vIEluIHRob3NlIGNhc2VzIHRob3VnaCwgZXZlbiB3aXRoIHRoZSB2YWx1ZSBjb3JyZWN0ZWQsIHdlJ3JlIGRvdWJsZS1yZW5kZXJpbmcgYWxsIG5vZGVzLlxuXHRcdFx0XHRcdFx0Ly8gSXQgbWlnaHQgYmUgYmV0dGVyIHRvIGp1c3QgdGVsbCBmb2xrcyBub3QgdG8gdXNlIGZvcmNlLXN5bmMgbW9kZS5cblx0XHRcdFx0XHRcdC8vIEN1cnJlbnRseSwgdXNpbmcgYHVzZUNvbnRleHQoKWAgaW4gYSBjbGFzcyBjb21wb25lbnQgd2lsbCBvdmVyd3JpdGUgaXRzIGB0aGlzLmNvbnRleHRgIHZhbHVlLlxuXHRcdFx0XHRcdFx0Ly8gc3Vicy5zb21lKGMgPT4ge1xuXHRcdFx0XHRcdFx0Ly8gXHRjLmNvbnRleHQgPSBfcHJvcHMudmFsdWU7XG5cdFx0XHRcdFx0XHQvLyBcdGVucXVldWVSZW5kZXIoYyk7XG5cdFx0XHRcdFx0XHQvLyB9KTtcblxuXHRcdFx0XHRcdFx0Ly8gc3Vicy5zb21lKGMgPT4ge1xuXHRcdFx0XHRcdFx0Ly8gXHRjLmNvbnRleHRbY29udGV4dElkXSA9IF9wcm9wcy52YWx1ZTtcblx0XHRcdFx0XHRcdC8vIFx0ZW5xdWV1ZVJlbmRlcihjKTtcblx0XHRcdFx0XHRcdC8vIH0pO1xuXHRcdFx0XHRcdFx0c3Vicy5zb21lKGMgPT4ge1xuXHRcdFx0XHRcdFx0XHRjLl9mb3JjZSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdGVucXVldWVSZW5kZXIoYyk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0dGhpcy5zdWIgPSBjID0+IHtcblx0XHRcdFx0XHRzdWJzLnB1c2goYyk7XG5cdFx0XHRcdFx0bGV0IG9sZCA9IGMuY29tcG9uZW50V2lsbFVubW91bnQ7XG5cdFx0XHRcdFx0Yy5jb21wb25lbnRXaWxsVW5tb3VudCA9ICgpID0+IHtcblx0XHRcdFx0XHRcdHN1YnMuc3BsaWNlKHN1YnMuaW5kZXhPZihjKSwgMSk7XG5cdFx0XHRcdFx0XHRpZiAob2xkKSBvbGQuY2FsbChjKTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gcHJvcHMuY2hpbGRyZW47XG5cdFx0fVxuXHR9O1xuXG5cdC8vIERldnRvb2xzIG5lZWRzIGFjY2VzcyB0byB0aGUgY29udGV4dCBvYmplY3Qgd2hlbiBpdFxuXHQvLyBlbmNvdW50ZXJzIGEgUHJvdmlkZXIuIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIHN1cHBvcnRcblx0Ly8gc2V0dGluZyBgZGlzcGxheU5hbWVgIG9uIHRoZSBjb250ZXh0IG9iamVjdCBpbnN0ZWFkXG5cdC8vIG9mIG9uIHRoZSBjb21wb25lbnQgaXRzZWxmLiBTZWU6XG5cdC8vIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9jb250ZXh0Lmh0bWwjY29udGV4dGRpc3BsYXluYW1lXG5cblx0cmV0dXJuIChjb250ZXh0LlByb3ZpZGVyLl9jb250ZXh0UmVmID0gY29udGV4dC5Db25zdW1lci5jb250ZXh0VHlwZSA9XG5cdFx0Y29udGV4dCk7XG59XG4iLCAiaW1wb3J0IHsgZGlmZiwgdW5tb3VudCwgYXBwbHlSZWYgfSBmcm9tICcuL2luZGV4JztcbmltcG9ydCB7IGNyZWF0ZVZOb2RlLCBGcmFnbWVudCB9IGZyb20gJy4uL2NyZWF0ZS1lbGVtZW50JztcbmltcG9ydCB7IEVNUFRZX09CSiwgRU1QVFlfQVJSLCBJTlNFUlRfVk5PREUsIE1BVENIRUQgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgaXNBcnJheSB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgZ2V0RG9tU2libGluZyB9IGZyb20gJy4uL2NvbXBvbmVudCc7XG5cbi8qKlxuICogRGlmZiB0aGUgY2hpbGRyZW4gb2YgYSB2aXJ0dWFsIG5vZGVcbiAqIEBwYXJhbSB7UHJlYWN0RWxlbWVudH0gcGFyZW50RG9tIFRoZSBET00gZWxlbWVudCB3aG9zZSBjaGlsZHJlbiBhcmUgYmVpbmdcbiAqIGRpZmZlZFxuICogQHBhcmFtIHtDb21wb25lbnRDaGlsZHJlbltdfSByZW5kZXJSZXN1bHRcbiAqIEBwYXJhbSB7Vk5vZGV9IG5ld1BhcmVudFZOb2RlIFRoZSBuZXcgdmlydHVhbCBub2RlIHdob3NlIGNoaWxkcmVuIHNob3VsZCBiZVxuICogZGlmZidlZCBhZ2FpbnN0IG9sZFBhcmVudFZOb2RlXG4gKiBAcGFyYW0ge1ZOb2RlfSBvbGRQYXJlbnRWTm9kZSBUaGUgb2xkIHZpcnR1YWwgbm9kZSB3aG9zZSBjaGlsZHJlbiBzaG91bGQgYmVcbiAqIGRpZmYnZWQgYWdhaW5zdCBuZXdQYXJlbnRWTm9kZVxuICogQHBhcmFtIHtvYmplY3R9IGdsb2JhbENvbnRleHQgVGhlIGN1cnJlbnQgY29udGV4dCBvYmplY3QgLSBtb2RpZmllZCBieVxuICogZ2V0Q2hpbGRDb250ZXh0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzU3ZnIFdoZXRoZXIgb3Igbm90IHRoaXMgRE9NIG5vZGUgaXMgYW4gU1ZHIG5vZGVcbiAqIEBwYXJhbSB7QXJyYXk8UHJlYWN0RWxlbWVudD59IGV4Y2Vzc0RvbUNoaWxkcmVuXG4gKiBAcGFyYW0ge0FycmF5PENvbXBvbmVudD59IGNvbW1pdFF1ZXVlIExpc3Qgb2YgY29tcG9uZW50cyB3aGljaCBoYXZlIGNhbGxiYWNrc1xuICogdG8gaW52b2tlIGluIGNvbW1pdFJvb3RcbiAqIEBwYXJhbSB7UHJlYWN0RWxlbWVudH0gb2xkRG9tIFRoZSBjdXJyZW50IGF0dGFjaGVkIERPTSBlbGVtZW50IGFueSBuZXcgZG9tXG4gKiBlbGVtZW50cyBzaG91bGQgYmUgcGxhY2VkIGFyb3VuZC4gTGlrZWx5IGBudWxsYCBvbiBmaXJzdCByZW5kZXIgKGV4Y2VwdCB3aGVuXG4gKiBoeWRyYXRpbmcpLiBDYW4gYmUgYSBzaWJsaW5nIERPTSBlbGVtZW50IHdoZW4gZGlmZmluZyBGcmFnbWVudHMgdGhhdCBoYXZlXG4gKiBzaWJsaW5ncy4gSW4gbW9zdCBjYXNlcywgaXQgc3RhcnRzIG91dCBhcyBgb2xkQ2hpbGRyZW5bMF0uX2RvbWAuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzSHlkcmF0aW5nIFdoZXRoZXIgb3Igbm90IHdlIGFyZSBpbiBoeWRyYXRpb25cbiAqIEBwYXJhbSB7YW55W119IHJlZlF1ZXVlIGFuIGFycmF5IG9mIGVsZW1lbnRzIG5lZWRlZCB0byBpbnZva2UgcmVmc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGlmZkNoaWxkcmVuKFxuXHRwYXJlbnREb20sXG5cdHJlbmRlclJlc3VsdCxcblx0bmV3UGFyZW50Vk5vZGUsXG5cdG9sZFBhcmVudFZOb2RlLFxuXHRnbG9iYWxDb250ZXh0LFxuXHRpc1N2Zyxcblx0ZXhjZXNzRG9tQ2hpbGRyZW4sXG5cdGNvbW1pdFF1ZXVlLFxuXHRvbGREb20sXG5cdGlzSHlkcmF0aW5nLFxuXHRyZWZRdWV1ZVxuKSB7XG5cdGxldCBpLFxuXHRcdC8qKiBAdHlwZSB7Vk5vZGV9ICovXG5cdFx0b2xkVk5vZGUsXG5cdFx0LyoqIEB0eXBlIHtWTm9kZX0gKi9cblx0XHRjaGlsZFZOb2RlLFxuXHRcdC8qKiBAdHlwZSB7UHJlYWN0RWxlbWVudH0gKi9cblx0XHRuZXdEb20sXG5cdFx0LyoqIEB0eXBlIHtQcmVhY3RFbGVtZW50fSAqL1xuXHRcdGZpcnN0Q2hpbGREb207XG5cblx0Ly8gVGhpcyBpcyBhIGNvbXByZXNzaW9uIG9mIG9sZFBhcmVudFZOb2RlIT1udWxsICYmIG9sZFBhcmVudFZOb2RlICE9IEVNUFRZX09CSiAmJiBvbGRQYXJlbnRWTm9kZS5fY2hpbGRyZW4gfHwgRU1QVFlfQVJSXG5cdC8vIGFzIEVNUFRZX09CSi5fY2hpbGRyZW4gc2hvdWxkIGJlIGB1bmRlZmluZWRgLlxuXHQvKiogQHR5cGUge1ZOb2RlW119ICovXG5cdGxldCBvbGRDaGlsZHJlbiA9IChvbGRQYXJlbnRWTm9kZSAmJiBvbGRQYXJlbnRWTm9kZS5fY2hpbGRyZW4pIHx8IEVNUFRZX0FSUjtcblxuXHRsZXQgbmV3Q2hpbGRyZW5MZW5ndGggPSByZW5kZXJSZXN1bHQubGVuZ3RoO1xuXG5cdG5ld1BhcmVudFZOb2RlLl9uZXh0RG9tID0gb2xkRG9tO1xuXHRjb25zdHJ1Y3ROZXdDaGlsZHJlbkFycmF5KG5ld1BhcmVudFZOb2RlLCByZW5kZXJSZXN1bHQsIG9sZENoaWxkcmVuKTtcblx0b2xkRG9tID0gbmV3UGFyZW50Vk5vZGUuX25leHREb207XG5cblx0Zm9yIChpID0gMDsgaSA8IG5ld0NoaWxkcmVuTGVuZ3RoOyBpKyspIHtcblx0XHRjaGlsZFZOb2RlID0gbmV3UGFyZW50Vk5vZGUuX2NoaWxkcmVuW2ldO1xuXG5cdFx0aWYgKFxuXHRcdFx0Y2hpbGRWTm9kZSA9PSBudWxsIHx8XG5cdFx0XHR0eXBlb2YgY2hpbGRWTm9kZSA9PSAnYm9vbGVhbicgfHxcblx0XHRcdHR5cGVvZiBjaGlsZFZOb2RlID09ICdmdW5jdGlvbidcblx0XHQpIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdC8vIEF0IHRoaXMgcG9pbnQsIGNvbnN0cnVjdE5ld0NoaWxkcmVuQXJyYXkgaGFzIGFzc2lnbmVkIF9pbmRleCB0byBiZSB0aGVcblx0XHQvLyBtYXRjaGluZ0luZGV4IGZvciB0aGlzIFZOb2RlJ3Mgb2xkVk5vZGUgKG9yIC0xIGlmIHRoZXJlIGlzIG5vIG9sZFZOb2RlKS5cblx0XHRpZiAoY2hpbGRWTm9kZS5faW5kZXggPT09IC0xKSB7XG5cdFx0XHRvbGRWTm9kZSA9IEVNUFRZX09CSjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b2xkVk5vZGUgPSBvbGRDaGlsZHJlbltjaGlsZFZOb2RlLl9pbmRleF0gfHwgRU1QVFlfT0JKO1xuXHRcdH1cblxuXHRcdC8vIFVwZGF0ZSBjaGlsZFZOb2RlLl9pbmRleCB0byBpdHMgZmluYWwgaW5kZXhcblx0XHRjaGlsZFZOb2RlLl9pbmRleCA9IGk7XG5cblx0XHQvLyBNb3JwaCB0aGUgb2xkIGVsZW1lbnQgaW50byB0aGUgbmV3IG9uZSwgYnV0IGRvbid0IGFwcGVuZCBpdCB0byB0aGUgZG9tIHlldFxuXHRcdGRpZmYoXG5cdFx0XHRwYXJlbnREb20sXG5cdFx0XHRjaGlsZFZOb2RlLFxuXHRcdFx0b2xkVk5vZGUsXG5cdFx0XHRnbG9iYWxDb250ZXh0LFxuXHRcdFx0aXNTdmcsXG5cdFx0XHRleGNlc3NEb21DaGlsZHJlbixcblx0XHRcdGNvbW1pdFF1ZXVlLFxuXHRcdFx0b2xkRG9tLFxuXHRcdFx0aXNIeWRyYXRpbmcsXG5cdFx0XHRyZWZRdWV1ZVxuXHRcdCk7XG5cblx0XHQvLyBBZGp1c3QgRE9NIG5vZGVzXG5cdFx0bmV3RG9tID0gY2hpbGRWTm9kZS5fZG9tO1xuXHRcdGlmIChjaGlsZFZOb2RlLnJlZiAmJiBvbGRWTm9kZS5yZWYgIT0gY2hpbGRWTm9kZS5yZWYpIHtcblx0XHRcdGlmIChvbGRWTm9kZS5yZWYpIHtcblx0XHRcdFx0YXBwbHlSZWYob2xkVk5vZGUucmVmLCBudWxsLCBjaGlsZFZOb2RlKTtcblx0XHRcdH1cblx0XHRcdHJlZlF1ZXVlLnB1c2goXG5cdFx0XHRcdGNoaWxkVk5vZGUucmVmLFxuXHRcdFx0XHRjaGlsZFZOb2RlLl9jb21wb25lbnQgfHwgbmV3RG9tLFxuXHRcdFx0XHRjaGlsZFZOb2RlXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGlmIChmaXJzdENoaWxkRG9tID09IG51bGwgJiYgbmV3RG9tICE9IG51bGwpIHtcblx0XHRcdGZpcnN0Q2hpbGREb20gPSBuZXdEb207XG5cdFx0fVxuXG5cdFx0aWYgKFxuXHRcdFx0Y2hpbGRWTm9kZS5fZmxhZ3MgJiBJTlNFUlRfVk5PREUgfHxcblx0XHRcdG9sZFZOb2RlLl9jaGlsZHJlbiA9PT0gY2hpbGRWTm9kZS5fY2hpbGRyZW5cblx0XHQpIHtcblx0XHRcdG9sZERvbSA9IGluc2VydChjaGlsZFZOb2RlLCBvbGREb20sIHBhcmVudERvbSk7XG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdHR5cGVvZiBjaGlsZFZOb2RlLnR5cGUgPT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdFx0Y2hpbGRWTm9kZS5fbmV4dERvbSAhPT0gdW5kZWZpbmVkXG5cdFx0KSB7XG5cdFx0XHQvLyBTaW5jZSBGcmFnbWVudHMgb3IgY29tcG9uZW50cyB0aGF0IHJldHVybiBGcmFnbWVudCBsaWtlIFZOb2RlcyBjYW5cblx0XHRcdC8vIGNvbnRhaW4gbXVsdGlwbGUgRE9NIG5vZGVzIGFzIHRoZSBzYW1lIGxldmVsLCBjb250aW51ZSB0aGUgZGlmZiBmcm9tXG5cdFx0XHQvLyB0aGUgc2libGluZyBvZiBsYXN0IERPTSBjaGlsZCBvZiB0aGlzIGNoaWxkIFZOb2RlXG5cdFx0XHRvbGREb20gPSBjaGlsZFZOb2RlLl9uZXh0RG9tO1xuXHRcdH0gZWxzZSBpZiAobmV3RG9tKSB7XG5cdFx0XHRvbGREb20gPSBuZXdEb20ubmV4dFNpYmxpbmc7XG5cdFx0fVxuXG5cdFx0Ly8gRWFnZXJseSBjbGVhbnVwIF9uZXh0RG9tLiBXZSBkb24ndCBuZWVkIHRvIHBlcnNpc3QgdGhlIHZhbHVlIGJlY2F1c2UgaXRcblx0XHQvLyBpcyBvbmx5IHVzZWQgYnkgYGRpZmZDaGlsZHJlbmAgdG8gZGV0ZXJtaW5lIHdoZXJlIHRvIHJlc3VtZSB0aGUgZGlmZlxuXHRcdC8vIGFmdGVyIGRpZmZpbmcgQ29tcG9uZW50cyBhbmQgRnJhZ21lbnRzLiBPbmNlIHdlIHN0b3JlIGl0IHRoZSBuZXh0RE9NXG5cdFx0Ly8gbG9jYWwgdmFyLCB3ZSBjYW4gY2xlYW4gdXAgdGhlIHByb3BlcnR5LiBBbHNvIHByZXZlbnRzIHVzIGhhbmdpbmcgb24gdG9cblx0XHQvLyBET00gbm9kZXMgdGhhdCBtYXkgaGF2ZSBiZWVuIHVubW91bnRlZC5cblx0XHRjaGlsZFZOb2RlLl9uZXh0RG9tID0gdW5kZWZpbmVkO1xuXG5cdFx0Ly8gVW5zZXQgZGlmZmluZyBmbGFnc1xuXHRcdGNoaWxkVk5vZGUuX2ZsYWdzICY9IH4oSU5TRVJUX1ZOT0RFIHwgTUFUQ0hFRCk7XG5cdH1cblxuXHQvLyBUT0RPOiBXaXRoIG5ldyBjaGlsZCBkaWZmaW5nIGFsZ28sIGNvbnNpZGVyIGFsdCB3YXlzIHRvIGRpZmYgRnJhZ21lbnRzLlxuXHQvLyBTdWNoIGFzIGRyb3BwaW5nIG9sZERvbSBhbmQgbW92aW5nIGZyYWdtZW50cyBpbiBwbGFjZVxuXHQvL1xuXHQvLyBCZWNhdXNlIHRoZSBuZXdQYXJlbnRWTm9kZSBpcyBGcmFnbWVudC1saWtlLCB3ZSBuZWVkIHRvIHNldCBpdCdzXG5cdC8vIF9uZXh0RG9tIHByb3BlcnR5IHRvIHRoZSBuZXh0U2libGluZyBvZiBpdHMgbGFzdCBjaGlsZCBET00gbm9kZS5cblx0Ly9cblx0Ly8gYG9sZERvbWAgY29udGFpbnMgdGhlIGNvcnJlY3QgdmFsdWUgaGVyZSBiZWNhdXNlIGlmIHRoZSBsYXN0IGNoaWxkXG5cdC8vIGlzIGEgRnJhZ21lbnQtbGlrZSwgdGhlbiBvbGREb20gaGFzIGFscmVhZHkgYmVlbiBzZXQgdG8gdGhhdCBjaGlsZCdzIF9uZXh0RG9tLlxuXHQvLyBJZiB0aGUgbGFzdCBjaGlsZCBpcyBhIERPTSBWTm9kZSwgdGhlbiBvbGREb20gd2lsbCBiZSBzZXQgdG8gdGhhdCBET01cblx0Ly8gbm9kZSdzIG5leHRTaWJsaW5nLlxuXHRuZXdQYXJlbnRWTm9kZS5fbmV4dERvbSA9IG9sZERvbTtcblx0bmV3UGFyZW50Vk5vZGUuX2RvbSA9IGZpcnN0Q2hpbGREb207XG59XG5cbi8qKlxuICogQHBhcmFtIHtWTm9kZX0gbmV3UGFyZW50Vk5vZGVcbiAqIEBwYXJhbSB7Q29tcG9uZW50Q2hpbGRyZW5bXX0gcmVuZGVyUmVzdWx0XG4gKiBAcGFyYW0ge1ZOb2RlW119IG9sZENoaWxkcmVuXG4gKi9cbmZ1bmN0aW9uIGNvbnN0cnVjdE5ld0NoaWxkcmVuQXJyYXkobmV3UGFyZW50Vk5vZGUsIHJlbmRlclJlc3VsdCwgb2xkQ2hpbGRyZW4pIHtcblx0LyoqIEB0eXBlIHtudW1iZXJ9ICovXG5cdGxldCBpO1xuXHQvKiogQHR5cGUge1ZOb2RlfSAqL1xuXHRsZXQgY2hpbGRWTm9kZTtcblx0LyoqIEB0eXBlIHtWTm9kZX0gKi9cblx0bGV0IG9sZFZOb2RlO1xuXG5cdGNvbnN0IG5ld0NoaWxkcmVuTGVuZ3RoID0gcmVuZGVyUmVzdWx0Lmxlbmd0aDtcblx0bGV0IG9sZENoaWxkcmVuTGVuZ3RoID0gb2xkQ2hpbGRyZW4ubGVuZ3RoLFxuXHRcdHJlbWFpbmluZ09sZENoaWxkcmVuID0gb2xkQ2hpbGRyZW5MZW5ndGg7XG5cblx0bGV0IHNrZXcgPSAwO1xuXG5cdG5ld1BhcmVudFZOb2RlLl9jaGlsZHJlbiA9IFtdO1xuXHRmb3IgKGkgPSAwOyBpIDwgbmV3Q2hpbGRyZW5MZW5ndGg7IGkrKykge1xuXHRcdC8vIEB0cy1leHBlY3QtZXJyb3IgV2UgYXJlIHJldXNpbmcgdGhlIGNoaWxkVk5vZGUgdmFyaWFibGUgdG8gaG9sZCBib3RoIHRoZVxuXHRcdC8vIHByZSBhbmQgcG9zdCBub3JtYWxpemVkIGNoaWxkVk5vZGVcblx0XHRjaGlsZFZOb2RlID0gcmVuZGVyUmVzdWx0W2ldO1xuXG5cdFx0aWYgKFxuXHRcdFx0Y2hpbGRWTm9kZSA9PSBudWxsIHx8XG5cdFx0XHR0eXBlb2YgY2hpbGRWTm9kZSA9PSAnYm9vbGVhbicgfHxcblx0XHRcdHR5cGVvZiBjaGlsZFZOb2RlID09ICdmdW5jdGlvbidcblx0XHQpIHtcblx0XHRcdGNoaWxkVk5vZGUgPSBuZXdQYXJlbnRWTm9kZS5fY2hpbGRyZW5baV0gPSBudWxsO1xuXHRcdH1cblx0XHQvLyBJZiB0aGlzIG5ld1ZOb2RlIGlzIGJlaW5nIHJldXNlZCAoZS5nLiA8ZGl2PntyZXVzZX17cmV1c2V9PC9kaXY+KSBpbiB0aGUgc2FtZSBkaWZmLFxuXHRcdC8vIG9yIHdlIGFyZSByZW5kZXJpbmcgYSBjb21wb25lbnQgKGUuZy4gc2V0U3RhdGUpIGNvcHkgdGhlIG9sZFZOb2RlcyBzbyBpdCBjYW4gaGF2ZVxuXHRcdC8vIGl0J3Mgb3duIERPTSAmIGV0Yy4gcG9pbnRlcnNcblx0XHRlbHNlIGlmIChcblx0XHRcdHR5cGVvZiBjaGlsZFZOb2RlID09ICdzdHJpbmcnIHx8XG5cdFx0XHR0eXBlb2YgY2hpbGRWTm9kZSA9PSAnbnVtYmVyJyB8fFxuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZhbGlkLXR5cGVvZlxuXHRcdFx0dHlwZW9mIGNoaWxkVk5vZGUgPT0gJ2JpZ2ludCcgfHxcblx0XHRcdGNoaWxkVk5vZGUuY29uc3RydWN0b3IgPT0gU3RyaW5nXG5cdFx0KSB7XG5cdFx0XHRjaGlsZFZOb2RlID0gbmV3UGFyZW50Vk5vZGUuX2NoaWxkcmVuW2ldID0gY3JlYXRlVk5vZGUoXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdGNoaWxkVk5vZGUsXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdGNoaWxkVk5vZGVcblx0XHRcdCk7XG5cdFx0fSBlbHNlIGlmIChpc0FycmF5KGNoaWxkVk5vZGUpKSB7XG5cdFx0XHRjaGlsZFZOb2RlID0gbmV3UGFyZW50Vk5vZGUuX2NoaWxkcmVuW2ldID0gY3JlYXRlVk5vZGUoXG5cdFx0XHRcdEZyYWdtZW50LFxuXHRcdFx0XHR7IGNoaWxkcmVuOiBjaGlsZFZOb2RlIH0sXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdG51bGxcblx0XHRcdCk7XG5cdFx0fSBlbHNlIGlmIChjaGlsZFZOb2RlLmNvbnN0cnVjdG9yID09PSB1bmRlZmluZWQgJiYgY2hpbGRWTm9kZS5fZGVwdGggPiAwKSB7XG5cdFx0XHQvLyBWTm9kZSBpcyBhbHJlYWR5IGluIHVzZSwgY2xvbmUgaXQuIFRoaXMgY2FuIGhhcHBlbiBpbiB0aGUgZm9sbG93aW5nXG5cdFx0XHQvLyBzY2VuYXJpbzpcblx0XHRcdC8vICAgY29uc3QgcmV1c2UgPSA8ZGl2IC8+XG5cdFx0XHQvLyAgIDxkaXY+e3JldXNlfTxzcGFuIC8+e3JldXNlfTwvZGl2PlxuXHRcdFx0Y2hpbGRWTm9kZSA9IG5ld1BhcmVudFZOb2RlLl9jaGlsZHJlbltpXSA9IGNyZWF0ZVZOb2RlKFxuXHRcdFx0XHRjaGlsZFZOb2RlLnR5cGUsXG5cdFx0XHRcdGNoaWxkVk5vZGUucHJvcHMsXG5cdFx0XHRcdGNoaWxkVk5vZGUua2V5LFxuXHRcdFx0XHRjaGlsZFZOb2RlLnJlZiA/IGNoaWxkVk5vZGUucmVmIDogbnVsbCxcblx0XHRcdFx0Y2hpbGRWTm9kZS5fb3JpZ2luYWxcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNoaWxkVk5vZGUgPSBuZXdQYXJlbnRWTm9kZS5fY2hpbGRyZW5baV0gPSBjaGlsZFZOb2RlO1xuXHRcdH1cblxuXHRcdC8vIEhhbmRsZSB1bm1vdW50aW5nIG51bGwgcGxhY2Vob2xkZXJzLCBpLmUuIFZOb2RlID0+IG51bGwgaW4gdW5rZXllZCBjaGlsZHJlblxuXHRcdGlmIChjaGlsZFZOb2RlID09IG51bGwpIHtcblx0XHRcdG9sZFZOb2RlID0gb2xkQ2hpbGRyZW5baV07XG5cdFx0XHRpZiAob2xkVk5vZGUgJiYgb2xkVk5vZGUua2V5ID09IG51bGwgJiYgb2xkVk5vZGUuX2RvbSkge1xuXHRcdFx0XHRpZiAob2xkVk5vZGUuX2RvbSA9PSBuZXdQYXJlbnRWTm9kZS5fbmV4dERvbSkge1xuXHRcdFx0XHRcdG5ld1BhcmVudFZOb2RlLl9uZXh0RG9tID0gZ2V0RG9tU2libGluZyhvbGRWTm9kZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR1bm1vdW50KG9sZFZOb2RlLCBvbGRWTm9kZSwgZmFsc2UpO1xuXG5cdFx0XHRcdC8vIEV4cGxpY2l0bHkgbnVsbGlmeSB0aGlzIHBvc2l0aW9uIGluIG9sZENoaWxkcmVuIGluc3RlYWQgb2YganVzdFxuXHRcdFx0XHQvLyBzZXR0aW5nIGBfbWF0Y2g9dHJ1ZWAgdG8gcHJldmVudCBvdGhlciByb3V0aW5lcyAoZS5nLlxuXHRcdFx0XHQvLyBgZmluZE1hdGNoaW5nSW5kZXhgIG9yIGBnZXREb21TaWJsaW5nYCkgZnJvbSB0aGlua2luZyBWTm9kZXMgb3IgRE9NXG5cdFx0XHRcdC8vIG5vZGVzIGluIHRoaXMgcG9zaXRpb24gYXJlIHN0aWxsIGF2YWlsYWJsZSB0byBiZSB1c2VkIGluIGRpZmZpbmcgd2hlblxuXHRcdFx0XHQvLyB0aGV5IGhhdmUgYWN0dWFsbHkgYWxyZWFkeSBiZWVuIHVubW91bnRlZC4gRm9yIGV4YW1wbGUsIGJ5IG9ubHlcblx0XHRcdFx0Ly8gc2V0dGluZyBgX21hdGNoPXRydWVgIGhlcmUsIHRoZSB1bm1vdW50aW5nIGxvb3AgbGF0ZXIgd291bGQgYXR0ZW1wdFxuXHRcdFx0XHQvLyB0byB1bm1vdW50IHRoaXMgVk5vZGUgYWdhaW4gc2VlaW5nIGBfbWF0Y2g9PXRydWVgLiAgRnVydGhlcixcblx0XHRcdFx0Ly8gZ2V0RG9tU2libGluZyBkb2Vzbid0IGtub3cgYWJvdXQgX21hdGNoIGFuZCBzbyB3b3VsZCBpbmNvcnJlY3RseVxuXHRcdFx0XHQvLyBhc3N1bWUgRE9NIG5vZGVzIGluIHRoaXMgc3VidHJlZSBhcmUgbW91bnRlZCBhbmQgdXNhYmxlLlxuXHRcdFx0XHRvbGRDaGlsZHJlbltpXSA9IG51bGw7XG5cdFx0XHRcdHJlbWFpbmluZ09sZENoaWxkcmVuLS07XG5cdFx0XHR9XG5cblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGNoaWxkVk5vZGUuX3BhcmVudCA9IG5ld1BhcmVudFZOb2RlO1xuXHRcdGNoaWxkVk5vZGUuX2RlcHRoID0gbmV3UGFyZW50Vk5vZGUuX2RlcHRoICsgMTtcblxuXHRcdGNvbnN0IHNrZXdlZEluZGV4ID0gaSArIHNrZXc7XG5cdFx0Y29uc3QgbWF0Y2hpbmdJbmRleCA9IGZpbmRNYXRjaGluZ0luZGV4KFxuXHRcdFx0Y2hpbGRWTm9kZSxcblx0XHRcdG9sZENoaWxkcmVuLFxuXHRcdFx0c2tld2VkSW5kZXgsXG5cdFx0XHRyZW1haW5pbmdPbGRDaGlsZHJlblxuXHRcdCk7XG5cblx0XHQvLyBUZW1wb3JhcmlseSBzdG9yZSB0aGUgbWF0Y2hpbmdJbmRleCBvbiB0aGUgX2luZGV4IHByb3BlcnR5IHNvIHdlIGNhbiBwdWxsXG5cdFx0Ly8gb3V0IHRoZSBvbGRWTm9kZSBpbiBkaWZmQ2hpbGRyZW4uIFdlJ2xsIG92ZXJyaWRlIHRoaXMgdG8gdGhlIFZOb2RlJ3Ncblx0XHQvLyBmaW5hbCBpbmRleCBhZnRlciB1c2luZyB0aGlzIHByb3BlcnR5IHRvIGdldCB0aGUgb2xkVk5vZGVcblx0XHRjaGlsZFZOb2RlLl9pbmRleCA9IG1hdGNoaW5nSW5kZXg7XG5cblx0XHRvbGRWTm9kZSA9IG51bGw7XG5cdFx0aWYgKG1hdGNoaW5nSW5kZXggIT09IC0xKSB7XG5cdFx0XHRvbGRWTm9kZSA9IG9sZENoaWxkcmVuW21hdGNoaW5nSW5kZXhdO1xuXHRcdFx0cmVtYWluaW5nT2xkQ2hpbGRyZW4tLTtcblx0XHRcdGlmIChvbGRWTm9kZSkge1xuXHRcdFx0XHRvbGRWTm9kZS5fZmxhZ3MgfD0gTUFUQ0hFRDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBIZXJlLCB3ZSBkZWZpbmUgaXNNb3VudGluZyBmb3IgdGhlIHB1cnBvc2VzIG9mIHRoZSBza2V3IGRpZmZpbmdcblx0XHQvLyBhbGdvcml0aG0uIE5vZGVzIHRoYXQgYXJlIHVuc3VzcGVuZGluZyBhcmUgY29uc2lkZXJlZCBtb3VudGluZyBhbmQgd2UgZGV0ZWN0XG5cdFx0Ly8gdGhpcyBieSBjaGVja2luZyBpZiBvbGRWTm9kZS5fb3JpZ2luYWwgPT09IG51bGxcblx0XHRjb25zdCBpc01vdW50aW5nID0gb2xkVk5vZGUgPT0gbnVsbCB8fCBvbGRWTm9kZS5fb3JpZ2luYWwgPT09IG51bGw7XG5cblx0XHRpZiAoaXNNb3VudGluZykge1xuXHRcdFx0aWYgKG1hdGNoaW5nSW5kZXggPT0gLTEpIHtcblx0XHRcdFx0c2tldy0tO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiB3ZSBhcmUgbW91bnRpbmcgYSBET00gVk5vZGUsIG1hcmsgaXQgZm9yIGluc2VydGlvblxuXHRcdFx0aWYgKHR5cGVvZiBjaGlsZFZOb2RlLnR5cGUgIT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRjaGlsZFZOb2RlLl9mbGFncyB8PSBJTlNFUlRfVk5PREU7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChtYXRjaGluZ0luZGV4ICE9PSBza2V3ZWRJbmRleCkge1xuXHRcdFx0aWYgKG1hdGNoaW5nSW5kZXggPT09IHNrZXdlZEluZGV4ICsgMSkge1xuXHRcdFx0XHRza2V3Kys7XG5cdFx0XHR9IGVsc2UgaWYgKG1hdGNoaW5nSW5kZXggPiBza2V3ZWRJbmRleCkge1xuXHRcdFx0XHRpZiAocmVtYWluaW5nT2xkQ2hpbGRyZW4gPiBuZXdDaGlsZHJlbkxlbmd0aCAtIHNrZXdlZEluZGV4KSB7XG5cdFx0XHRcdFx0c2tldyArPSBtYXRjaGluZ0luZGV4IC0gc2tld2VkSW5kZXg7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gIyMjIENoYW5nZSBmcm9tIGtleWVkOiBJIHRoaW5rIHRoaXMgd2FzIG1pc3NpbmcgZnJvbSB0aGUgYWxnby4uLlxuXHRcdFx0XHRcdHNrZXctLTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChtYXRjaGluZ0luZGV4IDwgc2tld2VkSW5kZXgpIHtcblx0XHRcdFx0aWYgKG1hdGNoaW5nSW5kZXggPT0gc2tld2VkSW5kZXggLSAxKSB7XG5cdFx0XHRcdFx0c2tldyA9IG1hdGNoaW5nSW5kZXggLSBza2V3ZWRJbmRleDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRza2V3ID0gMDtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2tldyA9IDA7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE1vdmUgdGhpcyBWTm9kZSdzIERPTSBpZiB0aGUgb3JpZ2luYWwgaW5kZXggKG1hdGNoaW5nSW5kZXgpIGRvZXNuJ3Rcblx0XHRcdC8vIG1hdGNoIHRoZSBuZXcgc2tldyBpbmRleCAoaSArIG5ldyBza2V3KVxuXHRcdFx0aWYgKG1hdGNoaW5nSW5kZXggIT09IGkgKyBza2V3KSB7XG5cdFx0XHRcdGNoaWxkVk5vZGUuX2ZsYWdzIHw9IElOU0VSVF9WTk9ERTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBSZW1vdmUgcmVtYWluaW5nIG9sZENoaWxkcmVuIGlmIHRoZXJlIGFyZSBhbnkuIExvb3AgZm9yd2FyZHMgc28gdGhhdCBhcyB3ZVxuXHQvLyB1bm1vdW50IERPTSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG9sZENoaWxkcmVuLCB3ZSBjYW4gYWRqdXN0IG9sZERvbSB0b1xuXHQvLyBwb2ludCB0byB0aGUgbmV4dCBjaGlsZCwgd2hpY2ggbmVlZHMgdG8gYmUgdGhlIGZpcnN0IERPTSBub2RlIHRoYXQgd29uJ3QgYmVcblx0Ly8gdW5tb3VudGVkLlxuXHRpZiAocmVtYWluaW5nT2xkQ2hpbGRyZW4pIHtcblx0XHRmb3IgKGkgPSAwOyBpIDwgb2xkQ2hpbGRyZW5MZW5ndGg7IGkrKykge1xuXHRcdFx0b2xkVk5vZGUgPSBvbGRDaGlsZHJlbltpXTtcblx0XHRcdGlmIChvbGRWTm9kZSAhPSBudWxsICYmIChvbGRWTm9kZS5fZmxhZ3MgJiBNQVRDSEVEKSA9PT0gMCkge1xuXHRcdFx0XHRpZiAob2xkVk5vZGUuX2RvbSA9PSBuZXdQYXJlbnRWTm9kZS5fbmV4dERvbSkge1xuXHRcdFx0XHRcdG5ld1BhcmVudFZOb2RlLl9uZXh0RG9tID0gZ2V0RG9tU2libGluZyhvbGRWTm9kZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR1bm1vdW50KG9sZFZOb2RlLCBvbGRWTm9kZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbi8qKlxuICogQHBhcmFtIHtWTm9kZX0gcGFyZW50Vk5vZGVcbiAqIEBwYXJhbSB7UHJlYWN0RWxlbWVudH0gb2xkRG9tXG4gKiBAcGFyYW0ge1ByZWFjdEVsZW1lbnR9IHBhcmVudERvbVxuICogQHJldHVybnMge1ByZWFjdEVsZW1lbnR9XG4gKi9cbmZ1bmN0aW9uIGluc2VydChwYXJlbnRWTm9kZSwgb2xkRG9tLCBwYXJlbnREb20pIHtcblx0Ly8gTm90ZTogVk5vZGVzIGluIG5lc3RlZCBzdXNwZW5kZWQgdHJlZXMgbWF5IGJlIG1pc3NpbmcgX2NoaWxkcmVuLlxuXG5cdGlmICh0eXBlb2YgcGFyZW50Vk5vZGUudHlwZSA9PSAnZnVuY3Rpb24nKSB7XG5cdFx0bGV0IGNoaWxkcmVuID0gcGFyZW50Vk5vZGUuX2NoaWxkcmVuO1xuXHRcdGZvciAobGV0IGkgPSAwOyBjaGlsZHJlbiAmJiBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcblx0XHRcdGlmIChjaGlsZHJlbltpXSkge1xuXHRcdFx0XHQvLyBJZiB3ZSBlbnRlciB0aGlzIGNvZGUgcGF0aCBvbiBzQ1UgYmFpbG91dCwgd2hlcmUgd2UgY29weVxuXHRcdFx0XHQvLyBvbGRWTm9kZS5fY2hpbGRyZW4gdG8gbmV3Vk5vZGUuX2NoaWxkcmVuLCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgb2xkXG5cdFx0XHRcdC8vIGNoaWxkcmVuJ3MgX3BhcmVudCBwb2ludGVyIHRvIHBvaW50IHRvIHRoZSBuZXdWTm9kZSAocGFyZW50Vk5vZGVcblx0XHRcdFx0Ly8gaGVyZSkuXG5cdFx0XHRcdGNoaWxkcmVuW2ldLl9wYXJlbnQgPSBwYXJlbnRWTm9kZTtcblx0XHRcdFx0b2xkRG9tID0gaW5zZXJ0KGNoaWxkcmVuW2ldLCBvbGREb20sIHBhcmVudERvbSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9sZERvbTtcblx0fSBlbHNlIGlmIChwYXJlbnRWTm9kZS5fZG9tICE9IG9sZERvbSkge1xuXHRcdHBhcmVudERvbS5pbnNlcnRCZWZvcmUocGFyZW50Vk5vZGUuX2RvbSwgb2xkRG9tIHx8IG51bGwpO1xuXHRcdG9sZERvbSA9IHBhcmVudFZOb2RlLl9kb207XG5cdH1cblxuXHRyZXR1cm4gb2xkRG9tICYmIG9sZERvbS5uZXh0U2libGluZztcbn1cblxuLyoqXG4gKiBGbGF0dGVuIGFuZCBsb29wIHRocm91Z2ggdGhlIGNoaWxkcmVuIG9mIGEgdmlydHVhbCBub2RlXG4gKiBAcGFyYW0ge0NvbXBvbmVudENoaWxkcmVufSBjaGlsZHJlbiBUaGUgdW5mbGF0dGVuZWQgY2hpbGRyZW4gb2YgYSB2aXJ0dWFsXG4gKiBub2RlXG4gKiBAcmV0dXJucyB7Vk5vZGVbXX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQ2hpbGRBcnJheShjaGlsZHJlbiwgb3V0KSB7XG5cdG91dCA9IG91dCB8fCBbXTtcblx0aWYgKGNoaWxkcmVuID09IG51bGwgfHwgdHlwZW9mIGNoaWxkcmVuID09ICdib29sZWFuJykge1xuXHR9IGVsc2UgaWYgKGlzQXJyYXkoY2hpbGRyZW4pKSB7XG5cdFx0Y2hpbGRyZW4uc29tZShjaGlsZCA9PiB7XG5cdFx0XHR0b0NoaWxkQXJyYXkoY2hpbGQsIG91dCk7XG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0b3V0LnB1c2goY2hpbGRyZW4pO1xuXHR9XG5cdHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogQHBhcmFtIHtWTm9kZX0gY2hpbGRWTm9kZVxuICogQHBhcmFtIHtWTm9kZVtdfSBvbGRDaGlsZHJlblxuICogQHBhcmFtIHtudW1iZXJ9IHNrZXdlZEluZGV4XG4gKiBAcGFyYW0ge251bWJlcn0gcmVtYWluaW5nT2xkQ2hpbGRyZW5cbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIGZpbmRNYXRjaGluZ0luZGV4KFxuXHRjaGlsZFZOb2RlLFxuXHRvbGRDaGlsZHJlbixcblx0c2tld2VkSW5kZXgsXG5cdHJlbWFpbmluZ09sZENoaWxkcmVuXG4pIHtcblx0Y29uc3Qga2V5ID0gY2hpbGRWTm9kZS5rZXk7XG5cdGNvbnN0IHR5cGUgPSBjaGlsZFZOb2RlLnR5cGU7XG5cdGxldCB4ID0gc2tld2VkSW5kZXggLSAxO1xuXHRsZXQgeSA9IHNrZXdlZEluZGV4ICsgMTtcblx0bGV0IG9sZFZOb2RlID0gb2xkQ2hpbGRyZW5bc2tld2VkSW5kZXhdO1xuXG5cdC8vIFdlIG9ubHkgbmVlZCB0byBwZXJmb3JtIGEgc2VhcmNoIGlmIHRoZXJlIGFyZSBtb3JlIGNoaWxkcmVuXG5cdC8vIChyZW1haW5pbmdPbGRDaGlsZHJlbikgdG8gc2VhcmNoLiBIb3dldmVyLCBpZiB0aGUgb2xkVk5vZGUgd2UganVzdCBsb29rZWRcblx0Ly8gYXQgc2tld2VkSW5kZXggd2FzIG5vdCBhbHJlYWR5IHVzZWQgaW4gdGhpcyBkaWZmLCB0aGVuIHRoZXJlIG11c3QgYmUgYXRcblx0Ly8gbGVhc3QgMSBvdGhlciAoc28gZ3JlYXRlciB0aGFuIDEpIHJlbWFpbmluZ09sZENoaWxkcmVuIHRvIGF0dGVtcHQgdG8gbWF0Y2hcblx0Ly8gYWdhaW5zdC4gU28gdGhlIGZvbGxvd2luZyBjb25kaXRpb24gY2hlY2tzIHRoYXQgZW5zdXJpbmdcblx0Ly8gcmVtYWluaW5nT2xkQ2hpbGRyZW4gPiAxIGlmIHRoZSBvbGRWTm9kZSBpcyBub3QgYWxyZWFkeSB1c2VkL21hdGNoZWQuIEVsc2Vcblx0Ly8gaWYgdGhlIG9sZFZOb2RlIHdhcyBudWxsIG9yIG1hdGNoZWQsIHRoZW4gdGhlcmUgY291bGQgbmVlZHMgdG8gYmUgYXQgbGVhc3Rcblx0Ly8gMSAoYWthIGByZW1haW5pbmdPbGRDaGlsZHJlbiA+IDBgKSBjaGlsZHJlbiB0byBmaW5kIGFuZCBjb21wYXJlIGFnYWluc3QuXG5cdGxldCBzaG91bGRTZWFyY2ggPVxuXHRcdHJlbWFpbmluZ09sZENoaWxkcmVuID5cblx0XHQob2xkVk5vZGUgIT0gbnVsbCAmJiAob2xkVk5vZGUuX2ZsYWdzICYgTUFUQ0hFRCkgPT09IDAgPyAxIDogMCk7XG5cblx0aWYgKFxuXHRcdG9sZFZOb2RlID09PSBudWxsIHx8XG5cdFx0KG9sZFZOb2RlICYmIGtleSA9PSBvbGRWTm9kZS5rZXkgJiYgdHlwZSA9PT0gb2xkVk5vZGUudHlwZSlcblx0KSB7XG5cdFx0cmV0dXJuIHNrZXdlZEluZGV4O1xuXHR9IGVsc2UgaWYgKHNob3VsZFNlYXJjaCkge1xuXHRcdHdoaWxlICh4ID49IDAgfHwgeSA8IG9sZENoaWxkcmVuLmxlbmd0aCkge1xuXHRcdFx0aWYgKHggPj0gMCkge1xuXHRcdFx0XHRvbGRWTm9kZSA9IG9sZENoaWxkcmVuW3hdO1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0b2xkVk5vZGUgJiZcblx0XHRcdFx0XHQob2xkVk5vZGUuX2ZsYWdzICYgTUFUQ0hFRCkgPT09IDAgJiZcblx0XHRcdFx0XHRrZXkgPT0gb2xkVk5vZGUua2V5ICYmXG5cdFx0XHRcdFx0dHlwZSA9PT0gb2xkVk5vZGUudHlwZVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRyZXR1cm4geDtcblx0XHRcdFx0fVxuXHRcdFx0XHR4LS07XG5cdFx0XHR9XG5cblx0XHRcdGlmICh5IDwgb2xkQ2hpbGRyZW4ubGVuZ3RoKSB7XG5cdFx0XHRcdG9sZFZOb2RlID0gb2xkQ2hpbGRyZW5beV07XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRvbGRWTm9kZSAmJlxuXHRcdFx0XHRcdChvbGRWTm9kZS5fZmxhZ3MgJiBNQVRDSEVEKSA9PT0gMCAmJlxuXHRcdFx0XHRcdGtleSA9PSBvbGRWTm9kZS5rZXkgJiZcblx0XHRcdFx0XHR0eXBlID09PSBvbGRWTm9kZS50eXBlXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHJldHVybiB5O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHkrKztcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gLTE7XG59XG4iLCAiaW1wb3J0IHsgSVNfTk9OX0RJTUVOU0lPTkFMIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCBvcHRpb25zIGZyb20gJy4uL29wdGlvbnMnO1xuXG5mdW5jdGlvbiBzZXRTdHlsZShzdHlsZSwga2V5LCB2YWx1ZSkge1xuXHRpZiAoa2V5WzBdID09PSAnLScpIHtcblx0XHRzdHlsZS5zZXRQcm9wZXJ0eShrZXksIHZhbHVlID09IG51bGwgPyAnJyA6IHZhbHVlKTtcblx0fSBlbHNlIGlmICh2YWx1ZSA9PSBudWxsKSB7XG5cdFx0c3R5bGVba2V5XSA9ICcnO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnbnVtYmVyJyB8fCBJU19OT05fRElNRU5TSU9OQUwudGVzdChrZXkpKSB7XG5cdFx0c3R5bGVba2V5XSA9IHZhbHVlO1xuXHR9IGVsc2Uge1xuXHRcdHN0eWxlW2tleV0gPSB2YWx1ZSArICdweCc7XG5cdH1cbn1cblxuLyoqXG4gKiBTZXQgYSBwcm9wZXJ0eSB2YWx1ZSBvbiBhIERPTSBub2RlXG4gKiBAcGFyYW0ge1ByZWFjdEVsZW1lbnR9IGRvbSBUaGUgRE9NIG5vZGUgdG8gbW9kaWZ5XG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0XG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQgdGhlIHByb3BlcnR5IHRvXG4gKiBAcGFyYW0geyp9IG9sZFZhbHVlIFRoZSBvbGQgdmFsdWUgdGhlIHByb3BlcnR5IGhhZFxuICogQHBhcmFtIHtib29sZWFufSBpc1N2ZyBXaGV0aGVyIG9yIG5vdCB0aGlzIERPTSBub2RlIGlzIGFuIFNWRyBub2RlIG9yIG5vdFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0UHJvcGVydHkoZG9tLCBuYW1lLCB2YWx1ZSwgb2xkVmFsdWUsIGlzU3ZnKSB7XG5cdGxldCB1c2VDYXB0dXJlO1xuXG5cdG86IGlmIChuYW1lID09PSAnc3R5bGUnKSB7XG5cdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJykge1xuXHRcdFx0ZG9tLnN0eWxlLmNzc1RleHQgPSB2YWx1ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHR5cGVvZiBvbGRWYWx1ZSA9PSAnc3RyaW5nJykge1xuXHRcdFx0XHRkb20uc3R5bGUuY3NzVGV4dCA9IG9sZFZhbHVlID0gJyc7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvbGRWYWx1ZSkge1xuXHRcdFx0XHRmb3IgKG5hbWUgaW4gb2xkVmFsdWUpIHtcblx0XHRcdFx0XHRpZiAoISh2YWx1ZSAmJiBuYW1lIGluIHZhbHVlKSkge1xuXHRcdFx0XHRcdFx0c2V0U3R5bGUoZG9tLnN0eWxlLCBuYW1lLCAnJyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICh2YWx1ZSkge1xuXHRcdFx0XHRmb3IgKG5hbWUgaW4gdmFsdWUpIHtcblx0XHRcdFx0XHRpZiAoIW9sZFZhbHVlIHx8IHZhbHVlW25hbWVdICE9PSBvbGRWYWx1ZVtuYW1lXSkge1xuXHRcdFx0XHRcdFx0c2V0U3R5bGUoZG9tLnN0eWxlLCBuYW1lLCB2YWx1ZVtuYW1lXSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdC8vIEJlbmNobWFyayBmb3IgY29tcGFyaXNvbjogaHR0cHM6Ly9lc2JlbmNoLmNvbS9iZW5jaC81NzRjOTU0YmRiOTY1YjlhMDA5NjVhYzZcblx0ZWxzZSBpZiAobmFtZVswXSA9PT0gJ28nICYmIG5hbWVbMV0gPT09ICduJykge1xuXHRcdHVzZUNhcHR1cmUgPVxuXHRcdFx0bmFtZSAhPT0gKG5hbWUgPSBuYW1lLnJlcGxhY2UoLyhQb2ludGVyQ2FwdHVyZSkkfENhcHR1cmUkLywgJyQxJykpO1xuXG5cdFx0Ly8gSW5mZXIgY29ycmVjdCBjYXNpbmcgZm9yIERPTSBidWlsdC1pbiBldmVudHM6XG5cdFx0aWYgKG5hbWUudG9Mb3dlckNhc2UoKSBpbiBkb20pIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCkuc2xpY2UoMik7XG5cdFx0ZWxzZSBuYW1lID0gbmFtZS5zbGljZSgyKTtcblxuXHRcdGlmICghZG9tLl9saXN0ZW5lcnMpIGRvbS5fbGlzdGVuZXJzID0ge307XG5cdFx0ZG9tLl9saXN0ZW5lcnNbbmFtZSArIHVzZUNhcHR1cmVdID0gdmFsdWU7XG5cblx0XHRpZiAodmFsdWUpIHtcblx0XHRcdGlmICghb2xkVmFsdWUpIHtcblx0XHRcdFx0dmFsdWUuX2F0dGFjaGVkID0gRGF0ZS5ub3coKTtcblx0XHRcdFx0Y29uc3QgaGFuZGxlciA9IHVzZUNhcHR1cmUgPyBldmVudFByb3h5Q2FwdHVyZSA6IGV2ZW50UHJveHk7XG5cdFx0XHRcdGRvbS5hZGRFdmVudExpc3RlbmVyKG5hbWUsIGhhbmRsZXIsIHVzZUNhcHR1cmUpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmFsdWUuX2F0dGFjaGVkID0gb2xkVmFsdWUuX2F0dGFjaGVkO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBoYW5kbGVyID0gdXNlQ2FwdHVyZSA/IGV2ZW50UHJveHlDYXB0dXJlIDogZXZlbnRQcm94eTtcblx0XHRcdGRvbS5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIGhhbmRsZXIsIHVzZUNhcHR1cmUpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRpZiAoaXNTdmcpIHtcblx0XHRcdC8vIE5vcm1hbGl6ZSBpbmNvcnJlY3QgcHJvcCB1c2FnZSBmb3IgU1ZHOlxuXHRcdFx0Ly8gLSB4bGluazpocmVmIC8geGxpbmtIcmVmIC0tPiBocmVmICh4bGluazpocmVmIHdhcyByZW1vdmVkIGZyb20gU1ZHIGFuZCBpc24ndCBuZWVkZWQpXG5cdFx0XHQvLyAtIGNsYXNzTmFtZSAtLT4gY2xhc3Ncblx0XHRcdG5hbWUgPSBuYW1lLnJlcGxhY2UoL3hsaW5rKEh8OmgpLywgJ2gnKS5yZXBsYWNlKC9zTmFtZSQvLCAncycpO1xuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRuYW1lICE9PSAnd2lkdGgnICYmXG5cdFx0XHRuYW1lICE9PSAnaGVpZ2h0JyAmJlxuXHRcdFx0bmFtZSAhPT0gJ2hyZWYnICYmXG5cdFx0XHRuYW1lICE9PSAnbGlzdCcgJiZcblx0XHRcdG5hbWUgIT09ICdmb3JtJyAmJlxuXHRcdFx0Ly8gRGVmYXVsdCB2YWx1ZSBpbiBicm93c2VycyBpcyBgLTFgIGFuZCBhbiBlbXB0eSBzdHJpbmcgaXNcblx0XHRcdC8vIGNhc3QgdG8gYDBgIGluc3RlYWRcblx0XHRcdG5hbWUgIT09ICd0YWJJbmRleCcgJiZcblx0XHRcdG5hbWUgIT09ICdkb3dubG9hZCcgJiZcblx0XHRcdG5hbWUgIT09ICdyb3dTcGFuJyAmJlxuXHRcdFx0bmFtZSAhPT0gJ2NvbFNwYW4nICYmXG5cdFx0XHRuYW1lICE9PSAncm9sZScgJiZcblx0XHRcdG5hbWUgaW4gZG9tXG5cdFx0KSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRkb21bbmFtZV0gPSB2YWx1ZSA9PSBudWxsID8gJycgOiB2YWx1ZTtcblx0XHRcdFx0Ly8gbGFiZWxsZWQgYnJlYWsgaXMgMWIgc21hbGxlciBoZXJlIHRoYW4gYSByZXR1cm4gc3RhdGVtZW50IChzb3JyeSlcblx0XHRcdFx0YnJlYWsgbztcblx0XHRcdH0gY2F0Y2ggKGUpIHt9XG5cdFx0fVxuXG5cdFx0Ly8gYXJpYS0gYW5kIGRhdGEtIGF0dHJpYnV0ZXMgaGF2ZSBubyBib29sZWFuIHJlcHJlc2VudGF0aW9uLlxuXHRcdC8vIEEgYGZhbHNlYCB2YWx1ZSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgYXR0cmlidXRlIG5vdCBiZWluZ1xuXHRcdC8vIHByZXNlbnQsIHNvIHdlIGNhbid0IHJlbW92ZSBpdC4gRm9yIG5vbi1ib29sZWFuIGFyaWFcblx0XHQvLyBhdHRyaWJ1dGVzIHdlIGNvdWxkIHRyZWF0IGZhbHNlIGFzIGEgcmVtb3ZhbCwgYnV0IHRoZVxuXHRcdC8vIGFtb3VudCBvZiBleGNlcHRpb25zIHdvdWxkIGNvc3QgdG9vIG1hbnkgYnl0ZXMuIE9uIHRvcCBvZlxuXHRcdC8vIHRoYXQgb3RoZXIgZnJhbWV3b3JrcyBnZW5lcmFsbHkgc3RyaW5naWZ5IGBmYWxzZWAuXG5cblx0XHRpZiAodHlwZW9mIHZhbHVlID09ICdmdW5jdGlvbicpIHtcblx0XHRcdC8vIG5ldmVyIHNlcmlhbGl6ZSBmdW5jdGlvbnMgYXMgYXR0cmlidXRlIHZhbHVlc1xuXHRcdH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCAmJiAodmFsdWUgIT09IGZhbHNlIHx8IG5hbWVbNF0gPT09ICctJykpIHtcblx0XHRcdGRvbS5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkb20ucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIFByb3h5IGFuIGV2ZW50IHRvIGhvb2tlZCBldmVudCBoYW5kbGVyc1xuICogQHBhcmFtIHtQcmVhY3RFdmVudH0gZSBUaGUgZXZlbnQgb2JqZWN0IGZyb20gdGhlIGJyb3dzZXJcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGV2ZW50UHJveHkoZSkge1xuXHRjb25zdCBldmVudEhhbmRsZXIgPSB0aGlzLl9saXN0ZW5lcnNbZS50eXBlICsgZmFsc2VdO1xuXHQvKipcblx0ICogVGhpcyB0cmljayBpcyBpbnNwaXJlZCBieSBWdWUgaHR0cHM6Ly9naXRodWIuY29tL3Z1ZWpzL2NvcmUvYmxvYi9tYWluL3BhY2thZ2VzL3J1bnRpbWUtZG9tL3NyYy9tb2R1bGVzL2V2ZW50cy50cyNMOTAtTDEwMVxuXHQgKiB3aGVuIHRoZSBkb20gcGVyZm9ybXMgYW4gZXZlbnQgaXQgbGVhdmVzIG1pY3JvLXRpY2tzIGluIGJldHdlZW4gYnViYmxpbmcgdXAgd2hpY2ggbWVhbnMgdGhhdCBhbiBldmVudCBjYW4gdHJpZ2dlciBvbiBhIG5ld2x5XG5cdCAqIGNyZWF0ZWQgRE9NLW5vZGUgd2hpbGUgdGhlIGV2ZW50IGJ1YmJsZXMgdXAsIHRoaXMgY2FuIGNhdXNlIHF1aXJreSBiZWhhdmlvciBhcyBzZWVuIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9wcmVhY3Rqcy9wcmVhY3QvaXNzdWVzLzM5Mjdcblx0ICovXG5cdGlmICghZS5fZGlzcGF0Y2hlZCkge1xuXHRcdC8vIFdoZW4gYW4gZXZlbnQgaGFzIG5vIF9kaXNwYXRjaGVkIHdlIGtub3cgdGhpcyBpcyB0aGUgZmlyc3QgZXZlbnQtdGFyZ2V0IGluIHRoZSBjaGFpblxuXHRcdC8vIHNvIHdlIHNldCB0aGUgaW5pdGlhbCBkaXNwYXRjaGVkIHRpbWUuXG5cdFx0ZS5fZGlzcGF0Y2hlZCA9IERhdGUubm93KCk7XG5cdFx0Ly8gV2hlbiB0aGUgX2Rpc3BhdGNoZWQgaXMgc21hbGxlciB0aGFuIHRoZSB0aW1lIHdoZW4gdGhlIHRhcmdldHRlZCBldmVudCBoYW5kbGVyIHdhcyBhdHRhY2hlZFxuXHRcdC8vIHdlIGtub3cgd2UgaGF2ZSBidWJibGVkIHVwIHRvIGFuIGVsZW1lbnQgdGhhdCB3YXMgYWRkZWQgZHVyaW5nIHBhdGNoaW5nIHRoZSBkb20uXG5cdH0gZWxzZSBpZiAoZS5fZGlzcGF0Y2hlZCA8PSBldmVudEhhbmRsZXIuX2F0dGFjaGVkKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdHJldHVybiBldmVudEhhbmRsZXIob3B0aW9ucy5ldmVudCA/IG9wdGlvbnMuZXZlbnQoZSkgOiBlKTtcbn1cblxuLyoqXG4gKiBQcm94eSBhbiBldmVudCB0byBob29rZWQgZXZlbnQgaGFuZGxlcnNcbiAqIEBwYXJhbSB7UHJlYWN0RXZlbnR9IGUgVGhlIGV2ZW50IG9iamVjdCBmcm9tIHRoZSBicm93c2VyXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBldmVudFByb3h5Q2FwdHVyZShlKSB7XG5cdHJldHVybiB0aGlzLl9saXN0ZW5lcnNbZS50eXBlICsgdHJ1ZV0ob3B0aW9ucy5ldmVudCA/IG9wdGlvbnMuZXZlbnQoZSkgOiBlKTtcbn1cbiIsICJpbXBvcnQge1xuXHRFTVBUWV9PQkosXG5cdE1PREVfSFlEUkFURSxcblx0TU9ERV9TVVNQRU5ERUQsXG5cdFJFU0VUX01PREVcbn0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IEJhc2VDb21wb25lbnQsIGdldERvbVNpYmxpbmcgfSBmcm9tICcuLi9jb21wb25lbnQnO1xuaW1wb3J0IHsgRnJhZ21lbnQgfSBmcm9tICcuLi9jcmVhdGUtZWxlbWVudCc7XG5pbXBvcnQgeyBkaWZmQ2hpbGRyZW4gfSBmcm9tICcuL2NoaWxkcmVuJztcbmltcG9ydCB7IHNldFByb3BlcnR5IH0gZnJvbSAnLi9wcm9wcyc7XG5pbXBvcnQgeyBhc3NpZ24sIGlzQXJyYXksIHJlbW92ZU5vZGUsIHNsaWNlIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgb3B0aW9ucyBmcm9tICcuLi9vcHRpb25zJztcblxuLyoqXG4gKiBEaWZmIHR3byB2aXJ0dWFsIG5vZGVzIGFuZCBhcHBseSBwcm9wZXIgY2hhbmdlcyB0byB0aGUgRE9NXG4gKiBAcGFyYW0ge1ByZWFjdEVsZW1lbnR9IHBhcmVudERvbSBUaGUgcGFyZW50IG9mIHRoZSBET00gZWxlbWVudFxuICogQHBhcmFtIHtWTm9kZX0gbmV3Vk5vZGUgVGhlIG5ldyB2aXJ0dWFsIG5vZGVcbiAqIEBwYXJhbSB7Vk5vZGV9IG9sZFZOb2RlIFRoZSBvbGQgdmlydHVhbCBub2RlXG4gKiBAcGFyYW0ge29iamVjdH0gZ2xvYmFsQ29udGV4dCBUaGUgY3VycmVudCBjb250ZXh0IG9iamVjdC4gTW9kaWZpZWQgYnlcbiAqIGdldENoaWxkQ29udGV4dFxuICogQHBhcmFtIHtib29sZWFufSBpc1N2ZyBXaGV0aGVyIG9yIG5vdCB0aGlzIGVsZW1lbnQgaXMgYW4gU1ZHIG5vZGVcbiAqIEBwYXJhbSB7QXJyYXk8UHJlYWN0RWxlbWVudD59IGV4Y2Vzc0RvbUNoaWxkcmVuXG4gKiBAcGFyYW0ge0FycmF5PENvbXBvbmVudD59IGNvbW1pdFF1ZXVlIExpc3Qgb2YgY29tcG9uZW50cyB3aGljaCBoYXZlIGNhbGxiYWNrc1xuICogdG8gaW52b2tlIGluIGNvbW1pdFJvb3RcbiAqIEBwYXJhbSB7UHJlYWN0RWxlbWVudH0gb2xkRG9tIFRoZSBjdXJyZW50IGF0dGFjaGVkIERPTSBlbGVtZW50IGFueSBuZXcgZG9tXG4gKiBlbGVtZW50cyBzaG91bGQgYmUgcGxhY2VkIGFyb3VuZC4gTGlrZWx5IGBudWxsYCBvbiBmaXJzdCByZW5kZXIgKGV4Y2VwdCB3aGVuXG4gKiBoeWRyYXRpbmcpLiBDYW4gYmUgYSBzaWJsaW5nIERPTSBlbGVtZW50IHdoZW4gZGlmZmluZyBGcmFnbWVudHMgdGhhdCBoYXZlXG4gKiBzaWJsaW5ncy4gSW4gbW9zdCBjYXNlcywgaXQgc3RhcnRzIG91dCBhcyBgb2xkQ2hpbGRyZW5bMF0uX2RvbWAuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzSHlkcmF0aW5nIFdoZXRoZXIgb3Igbm90IHdlIGFyZSBpbiBoeWRyYXRpb25cbiAqIEBwYXJhbSB7YW55W119IHJlZlF1ZXVlIGFuIGFycmF5IG9mIGVsZW1lbnRzIG5lZWRlZCB0byBpbnZva2UgcmVmc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGlmZihcblx0cGFyZW50RG9tLFxuXHRuZXdWTm9kZSxcblx0b2xkVk5vZGUsXG5cdGdsb2JhbENvbnRleHQsXG5cdGlzU3ZnLFxuXHRleGNlc3NEb21DaGlsZHJlbixcblx0Y29tbWl0UXVldWUsXG5cdG9sZERvbSxcblx0aXNIeWRyYXRpbmcsXG5cdHJlZlF1ZXVlXG4pIHtcblx0LyoqIEB0eXBlIHthbnl9ICovXG5cdGxldCB0bXAsXG5cdFx0bmV3VHlwZSA9IG5ld1ZOb2RlLnR5cGU7XG5cblx0Ly8gV2hlbiBwYXNzaW5nIHRocm91Z2ggY3JlYXRlRWxlbWVudCBpdCBhc3NpZ25zIHRoZSBvYmplY3Rcblx0Ly8gY29uc3RydWN0b3IgYXMgdW5kZWZpbmVkLiBUaGlzIHRvIHByZXZlbnQgSlNPTi1pbmplY3Rpb24uXG5cdGlmIChuZXdWTm9kZS5jb25zdHJ1Y3RvciAhPT0gdW5kZWZpbmVkKSByZXR1cm4gbnVsbDtcblxuXHQvLyBJZiB0aGUgcHJldmlvdXMgZGlmZiBiYWlsZWQgb3V0LCByZXN1bWUgY3JlYXRpbmcvaHlkcmF0aW5nLlxuXHRpZiAob2xkVk5vZGUuX2ZsYWdzICYgTU9ERV9TVVNQRU5ERUQpIHtcblx0XHRpc0h5ZHJhdGluZyA9ICEhKG9sZFZOb2RlLl9mbGFncyAmIE1PREVfSFlEUkFURSk7XG5cdFx0b2xkRG9tID0gbmV3Vk5vZGUuX2RvbSA9IG9sZFZOb2RlLl9kb207XG5cdFx0ZXhjZXNzRG9tQ2hpbGRyZW4gPSBbb2xkRG9tXTtcblx0fVxuXG5cdGlmICgodG1wID0gb3B0aW9ucy5fZGlmZikpIHRtcChuZXdWTm9kZSk7XG5cblx0b3V0ZXI6IGlmICh0eXBlb2YgbmV3VHlwZSA9PSAnZnVuY3Rpb24nKSB7XG5cdFx0dHJ5IHtcblx0XHRcdGxldCBjLCBpc05ldywgb2xkUHJvcHMsIG9sZFN0YXRlLCBzbmFwc2hvdCwgY2xlYXJQcm9jZXNzaW5nRXhjZXB0aW9uO1xuXHRcdFx0bGV0IG5ld1Byb3BzID0gbmV3Vk5vZGUucHJvcHM7XG5cblx0XHRcdC8vIE5lY2Vzc2FyeSBmb3IgY3JlYXRlQ29udGV4dCBhcGkuIFNldHRpbmcgdGhpcyBwcm9wZXJ0eSB3aWxsIHBhc3Ncblx0XHRcdC8vIHRoZSBjb250ZXh0IHZhbHVlIGFzIGB0aGlzLmNvbnRleHRgIGp1c3QgZm9yIHRoaXMgY29tcG9uZW50LlxuXHRcdFx0dG1wID0gbmV3VHlwZS5jb250ZXh0VHlwZTtcblx0XHRcdGxldCBwcm92aWRlciA9IHRtcCAmJiBnbG9iYWxDb250ZXh0W3RtcC5faWRdO1xuXHRcdFx0bGV0IGNvbXBvbmVudENvbnRleHQgPSB0bXBcblx0XHRcdFx0PyBwcm92aWRlclxuXHRcdFx0XHRcdD8gcHJvdmlkZXIucHJvcHMudmFsdWVcblx0XHRcdFx0XHQ6IHRtcC5fZGVmYXVsdFZhbHVlXG5cdFx0XHRcdDogZ2xvYmFsQ29udGV4dDtcblxuXHRcdFx0Ly8gR2V0IGNvbXBvbmVudCBhbmQgc2V0IGl0IHRvIGBjYFxuXHRcdFx0aWYgKG9sZFZOb2RlLl9jb21wb25lbnQpIHtcblx0XHRcdFx0YyA9IG5ld1ZOb2RlLl9jb21wb25lbnQgPSBvbGRWTm9kZS5fY29tcG9uZW50O1xuXHRcdFx0XHRjbGVhclByb2Nlc3NpbmdFeGNlcHRpb24gPSBjLl9wcm9jZXNzaW5nRXhjZXB0aW9uID0gYy5fcGVuZGluZ0Vycm9yO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gSW5zdGFudGlhdGUgdGhlIG5ldyBjb21wb25lbnRcblx0XHRcdFx0aWYgKCdwcm90b3R5cGUnIGluIG5ld1R5cGUgJiYgbmV3VHlwZS5wcm90b3R5cGUucmVuZGVyKSB7XG5cdFx0XHRcdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciBUaGUgY2hlY2sgYWJvdmUgdmVyaWZpZXMgdGhhdCBuZXdUeXBlIGlzIHN1cHBvc2UgdG8gYmUgY29uc3RydWN0ZWRcblx0XHRcdFx0XHRuZXdWTm9kZS5fY29tcG9uZW50ID0gYyA9IG5ldyBuZXdUeXBlKG5ld1Byb3BzLCBjb21wb25lbnRDb250ZXh0KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuZXctY2FwXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciBUcnVzdCBtZSwgQ29tcG9uZW50IGltcGxlbWVudHMgdGhlIGludGVyZmFjZSB3ZSB3YW50XG5cdFx0XHRcdFx0bmV3Vk5vZGUuX2NvbXBvbmVudCA9IGMgPSBuZXcgQmFzZUNvbXBvbmVudChcblx0XHRcdFx0XHRcdG5ld1Byb3BzLFxuXHRcdFx0XHRcdFx0Y29tcG9uZW50Q29udGV4dFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0Yy5jb25zdHJ1Y3RvciA9IG5ld1R5cGU7XG5cdFx0XHRcdFx0Yy5yZW5kZXIgPSBkb1JlbmRlcjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAocHJvdmlkZXIpIHByb3ZpZGVyLnN1YihjKTtcblxuXHRcdFx0XHRjLnByb3BzID0gbmV3UHJvcHM7XG5cdFx0XHRcdGlmICghYy5zdGF0ZSkgYy5zdGF0ZSA9IHt9O1xuXHRcdFx0XHRjLmNvbnRleHQgPSBjb21wb25lbnRDb250ZXh0O1xuXHRcdFx0XHRjLl9nbG9iYWxDb250ZXh0ID0gZ2xvYmFsQ29udGV4dDtcblx0XHRcdFx0aXNOZXcgPSBjLl9kaXJ0eSA9IHRydWU7XG5cdFx0XHRcdGMuX3JlbmRlckNhbGxiYWNrcyA9IFtdO1xuXHRcdFx0XHRjLl9zdGF0ZUNhbGxiYWNrcyA9IFtdO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJbnZva2UgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzXG5cdFx0XHRpZiAoYy5fbmV4dFN0YXRlID09IG51bGwpIHtcblx0XHRcdFx0Yy5fbmV4dFN0YXRlID0gYy5zdGF0ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG5ld1R5cGUuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzICE9IG51bGwpIHtcblx0XHRcdFx0aWYgKGMuX25leHRTdGF0ZSA9PSBjLnN0YXRlKSB7XG5cdFx0XHRcdFx0Yy5fbmV4dFN0YXRlID0gYXNzaWduKHt9LCBjLl9uZXh0U3RhdGUpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YXNzaWduKFxuXHRcdFx0XHRcdGMuX25leHRTdGF0ZSxcblx0XHRcdFx0XHRuZXdUeXBlLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhuZXdQcm9wcywgYy5fbmV4dFN0YXRlKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRvbGRQcm9wcyA9IGMucHJvcHM7XG5cdFx0XHRvbGRTdGF0ZSA9IGMuc3RhdGU7XG5cdFx0XHRjLl92bm9kZSA9IG5ld1ZOb2RlO1xuXG5cdFx0XHQvLyBJbnZva2UgcHJlLXJlbmRlciBsaWZlY3ljbGUgbWV0aG9kc1xuXHRcdFx0aWYgKGlzTmV3KSB7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRuZXdUeXBlLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PSBudWxsICYmXG5cdFx0XHRcdFx0Yy5jb21wb25lbnRXaWxsTW91bnQgIT0gbnVsbFxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRjLmNvbXBvbmVudFdpbGxNb3VudCgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGMuY29tcG9uZW50RGlkTW91bnQgIT0gbnVsbCkge1xuXHRcdFx0XHRcdGMuX3JlbmRlckNhbGxiYWNrcy5wdXNoKGMuY29tcG9uZW50RGlkTW91bnQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0bmV3VHlwZS5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT0gbnVsbCAmJlxuXHRcdFx0XHRcdG5ld1Byb3BzICE9PSBvbGRQcm9wcyAmJlxuXHRcdFx0XHRcdGMuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyAhPSBudWxsXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdGMuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXdQcm9wcywgY29tcG9uZW50Q29udGV4dCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0IWMuX2ZvcmNlICYmXG5cdFx0XHRcdFx0KChjLnNob3VsZENvbXBvbmVudFVwZGF0ZSAhPSBudWxsICYmXG5cdFx0XHRcdFx0XHRjLnNob3VsZENvbXBvbmVudFVwZGF0ZShcblx0XHRcdFx0XHRcdFx0bmV3UHJvcHMsXG5cdFx0XHRcdFx0XHRcdGMuX25leHRTdGF0ZSxcblx0XHRcdFx0XHRcdFx0Y29tcG9uZW50Q29udGV4dFxuXHRcdFx0XHRcdFx0KSA9PT0gZmFsc2UpIHx8XG5cdFx0XHRcdFx0XHRuZXdWTm9kZS5fb3JpZ2luYWwgPT09IG9sZFZOb2RlLl9vcmlnaW5hbClcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Ly8gTW9yZSBpbmZvIGFib3V0IHRoaXMgaGVyZTogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vSm92aURlQ3Jvb2NrL2JlYzVmMmNlOTM1NDRkMmU2MDcwZWY4ZTAwMzZlNGU4XG5cdFx0XHRcdFx0aWYgKG5ld1ZOb2RlLl9vcmlnaW5hbCAhPT0gb2xkVk5vZGUuX29yaWdpbmFsKSB7XG5cdFx0XHRcdFx0XHQvLyBXaGVuIHdlIGFyZSBkZWFsaW5nIHdpdGggYSBiYWlsIGJlY2F1c2Ugb2Ygc0NVIHdlIGhhdmUgdG8gdXBkYXRlXG5cdFx0XHRcdFx0XHQvLyB0aGUgcHJvcHMsIHN0YXRlIGFuZCBkaXJ0eS1zdGF0ZS5cblx0XHRcdFx0XHRcdC8vIHdoZW4gd2UgYXJlIGRlYWxpbmcgd2l0aCBzdHJpY3QtZXF1YWxpdHkgd2UgZG9uJ3QgYXMgdGhlIGNoaWxkIGNvdWxkIHN0aWxsXG5cdFx0XHRcdFx0XHQvLyBiZSBkaXJ0aWVkIHNlZSAjMzg4M1xuXHRcdFx0XHRcdFx0Yy5wcm9wcyA9IG5ld1Byb3BzO1xuXHRcdFx0XHRcdFx0Yy5zdGF0ZSA9IGMuX25leHRTdGF0ZTtcblx0XHRcdFx0XHRcdGMuX2RpcnR5ID0gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0bmV3Vk5vZGUuX2RvbSA9IG9sZFZOb2RlLl9kb207XG5cdFx0XHRcdFx0bmV3Vk5vZGUuX2NoaWxkcmVuID0gb2xkVk5vZGUuX2NoaWxkcmVuO1xuXHRcdFx0XHRcdG5ld1ZOb2RlLl9jaGlsZHJlbi5mb3JFYWNoKHZub2RlID0+IHtcblx0XHRcdFx0XHRcdGlmICh2bm9kZSkgdm5vZGUuX3BhcmVudCA9IG5ld1ZOb2RlO1xuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBjLl9zdGF0ZUNhbGxiYWNrcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0Yy5fcmVuZGVyQ2FsbGJhY2tzLnB1c2goYy5fc3RhdGVDYWxsYmFja3NbaV0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjLl9zdGF0ZUNhbGxiYWNrcyA9IFtdO1xuXG5cdFx0XHRcdFx0aWYgKGMuX3JlbmRlckNhbGxiYWNrcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdGNvbW1pdFF1ZXVlLnB1c2goYyk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YnJlYWsgb3V0ZXI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoYy5jb21wb25lbnRXaWxsVXBkYXRlICE9IG51bGwpIHtcblx0XHRcdFx0XHRjLmNvbXBvbmVudFdpbGxVcGRhdGUobmV3UHJvcHMsIGMuX25leHRTdGF0ZSwgY29tcG9uZW50Q29udGV4dCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoYy5jb21wb25lbnREaWRVcGRhdGUgIT0gbnVsbCkge1xuXHRcdFx0XHRcdGMuX3JlbmRlckNhbGxiYWNrcy5wdXNoKCgpID0+IHtcblx0XHRcdFx0XHRcdGMuY29tcG9uZW50RGlkVXBkYXRlKG9sZFByb3BzLCBvbGRTdGF0ZSwgc25hcHNob3QpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGMuY29udGV4dCA9IGNvbXBvbmVudENvbnRleHQ7XG5cdFx0XHRjLnByb3BzID0gbmV3UHJvcHM7XG5cdFx0XHRjLl9wYXJlbnREb20gPSBwYXJlbnREb207XG5cdFx0XHRjLl9mb3JjZSA9IGZhbHNlO1xuXG5cdFx0XHRsZXQgcmVuZGVySG9vayA9IG9wdGlvbnMuX3JlbmRlcixcblx0XHRcdFx0Y291bnQgPSAwO1xuXHRcdFx0aWYgKCdwcm90b3R5cGUnIGluIG5ld1R5cGUgJiYgbmV3VHlwZS5wcm90b3R5cGUucmVuZGVyKSB7XG5cdFx0XHRcdGMuc3RhdGUgPSBjLl9uZXh0U3RhdGU7XG5cdFx0XHRcdGMuX2RpcnR5ID0gZmFsc2U7XG5cblx0XHRcdFx0aWYgKHJlbmRlckhvb2spIHJlbmRlckhvb2sobmV3Vk5vZGUpO1xuXG5cdFx0XHRcdHRtcCA9IGMucmVuZGVyKGMucHJvcHMsIGMuc3RhdGUsIGMuY29udGV4dCk7XG5cblx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBjLl9zdGF0ZUNhbGxiYWNrcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdGMuX3JlbmRlckNhbGxiYWNrcy5wdXNoKGMuX3N0YXRlQ2FsbGJhY2tzW2ldKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjLl9zdGF0ZUNhbGxiYWNrcyA9IFtdO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZG8ge1xuXHRcdFx0XHRcdGMuX2RpcnR5ID0gZmFsc2U7XG5cdFx0XHRcdFx0aWYgKHJlbmRlckhvb2spIHJlbmRlckhvb2sobmV3Vk5vZGUpO1xuXG5cdFx0XHRcdFx0dG1wID0gYy5yZW5kZXIoYy5wcm9wcywgYy5zdGF0ZSwgYy5jb250ZXh0KTtcblxuXHRcdFx0XHRcdC8vIEhhbmRsZSBzZXRTdGF0ZSBjYWxsZWQgaW4gcmVuZGVyLCBzZWUgIzI1NTNcblx0XHRcdFx0XHRjLnN0YXRlID0gYy5fbmV4dFN0YXRlO1xuXHRcdFx0XHR9IHdoaWxlIChjLl9kaXJ0eSAmJiArK2NvdW50IDwgMjUpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBIYW5kbGUgc2V0U3RhdGUgY2FsbGVkIGluIHJlbmRlciwgc2VlICMyNTUzXG5cdFx0XHRjLnN0YXRlID0gYy5fbmV4dFN0YXRlO1xuXG5cdFx0XHRpZiAoYy5nZXRDaGlsZENvbnRleHQgIT0gbnVsbCkge1xuXHRcdFx0XHRnbG9iYWxDb250ZXh0ID0gYXNzaWduKGFzc2lnbih7fSwgZ2xvYmFsQ29udGV4dCksIGMuZ2V0Q2hpbGRDb250ZXh0KCkpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIWlzTmV3ICYmIGMuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgIT0gbnVsbCkge1xuXHRcdFx0XHRzbmFwc2hvdCA9IGMuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUob2xkUHJvcHMsIG9sZFN0YXRlKTtcblx0XHRcdH1cblxuXHRcdFx0bGV0IGlzVG9wTGV2ZWxGcmFnbWVudCA9XG5cdFx0XHRcdHRtcCAhPSBudWxsICYmIHRtcC50eXBlID09PSBGcmFnbWVudCAmJiB0bXAua2V5ID09IG51bGw7XG5cdFx0XHRsZXQgcmVuZGVyUmVzdWx0ID0gaXNUb3BMZXZlbEZyYWdtZW50ID8gdG1wLnByb3BzLmNoaWxkcmVuIDogdG1wO1xuXG5cdFx0XHRkaWZmQ2hpbGRyZW4oXG5cdFx0XHRcdHBhcmVudERvbSxcblx0XHRcdFx0aXNBcnJheShyZW5kZXJSZXN1bHQpID8gcmVuZGVyUmVzdWx0IDogW3JlbmRlclJlc3VsdF0sXG5cdFx0XHRcdG5ld1ZOb2RlLFxuXHRcdFx0XHRvbGRWTm9kZSxcblx0XHRcdFx0Z2xvYmFsQ29udGV4dCxcblx0XHRcdFx0aXNTdmcsXG5cdFx0XHRcdGV4Y2Vzc0RvbUNoaWxkcmVuLFxuXHRcdFx0XHRjb21taXRRdWV1ZSxcblx0XHRcdFx0b2xkRG9tLFxuXHRcdFx0XHRpc0h5ZHJhdGluZyxcblx0XHRcdFx0cmVmUXVldWVcblx0XHRcdCk7XG5cblx0XHRcdGMuYmFzZSA9IG5ld1ZOb2RlLl9kb207XG5cblx0XHRcdC8vIFdlIHN1Y2Nlc3NmdWxseSByZW5kZXJlZCB0aGlzIFZOb2RlLCB1bnNldCBhbnkgc3RvcmVkIGh5ZHJhdGlvbi9iYWlsb3V0IHN0YXRlOlxuXHRcdFx0bmV3Vk5vZGUuX2ZsYWdzICY9IFJFU0VUX01PREU7XG5cblx0XHRcdGlmIChjLl9yZW5kZXJDYWxsYmFja3MubGVuZ3RoKSB7XG5cdFx0XHRcdGNvbW1pdFF1ZXVlLnB1c2goYyk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChjbGVhclByb2Nlc3NpbmdFeGNlcHRpb24pIHtcblx0XHRcdFx0Yy5fcGVuZGluZ0Vycm9yID0gYy5fcHJvY2Vzc2luZ0V4Y2VwdGlvbiA9IG51bGw7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0bmV3Vk5vZGUuX29yaWdpbmFsID0gbnVsbDtcblx0XHRcdC8vIGlmIGh5ZHJhdGluZyBvciBjcmVhdGluZyBpbml0aWFsIHRyZWUsIGJhaWxvdXQgcHJlc2VydmVzIERPTTpcblx0XHRcdGlmIChpc0h5ZHJhdGluZyB8fCBleGNlc3NEb21DaGlsZHJlbiAhPSBudWxsKSB7XG5cdFx0XHRcdG5ld1ZOb2RlLl9kb20gPSBvbGREb207XG5cdFx0XHRcdG5ld1ZOb2RlLl9mbGFncyB8PSBpc0h5ZHJhdGluZ1xuXHRcdFx0XHRcdD8gTU9ERV9IWURSQVRFIHwgTU9ERV9TVVNQRU5ERURcblx0XHRcdFx0XHQ6IE1PREVfSFlEUkFURTtcblx0XHRcdFx0ZXhjZXNzRG9tQ2hpbGRyZW5bZXhjZXNzRG9tQ2hpbGRyZW4uaW5kZXhPZihvbGREb20pXSA9IG51bGw7XG5cdFx0XHRcdC8vIF4gY291bGQgcG9zc2libHkgYmUgc2ltcGxpZmllZCB0bzpcblx0XHRcdFx0Ly8gZXhjZXNzRG9tQ2hpbGRyZW4ubGVuZ3RoID0gMDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG5ld1ZOb2RlLl9kb20gPSBvbGRWTm9kZS5fZG9tO1xuXHRcdFx0XHRuZXdWTm9kZS5fY2hpbGRyZW4gPSBvbGRWTm9kZS5fY2hpbGRyZW47XG5cdFx0XHR9XG5cdFx0XHRvcHRpb25zLl9jYXRjaEVycm9yKGUsIG5ld1ZOb2RlLCBvbGRWTm9kZSk7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKFxuXHRcdGV4Y2Vzc0RvbUNoaWxkcmVuID09IG51bGwgJiZcblx0XHRuZXdWTm9kZS5fb3JpZ2luYWwgPT09IG9sZFZOb2RlLl9vcmlnaW5hbFxuXHQpIHtcblx0XHRuZXdWTm9kZS5fY2hpbGRyZW4gPSBvbGRWTm9kZS5fY2hpbGRyZW47XG5cdFx0bmV3Vk5vZGUuX2RvbSA9IG9sZFZOb2RlLl9kb207XG5cdH0gZWxzZSB7XG5cdFx0bmV3Vk5vZGUuX2RvbSA9IGRpZmZFbGVtZW50Tm9kZXMoXG5cdFx0XHRvbGRWTm9kZS5fZG9tLFxuXHRcdFx0bmV3Vk5vZGUsXG5cdFx0XHRvbGRWTm9kZSxcblx0XHRcdGdsb2JhbENvbnRleHQsXG5cdFx0XHRpc1N2Zyxcblx0XHRcdGV4Y2Vzc0RvbUNoaWxkcmVuLFxuXHRcdFx0Y29tbWl0UXVldWUsXG5cdFx0XHRpc0h5ZHJhdGluZyxcblx0XHRcdHJlZlF1ZXVlXG5cdFx0KTtcblx0fVxuXG5cdGlmICgodG1wID0gb3B0aW9ucy5kaWZmZWQpKSB0bXAobmV3Vk5vZGUpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7QXJyYXk8Q29tcG9uZW50Pn0gY29tbWl0UXVldWUgTGlzdCBvZiBjb21wb25lbnRzXG4gKiB3aGljaCBoYXZlIGNhbGxiYWNrcyB0byBpbnZva2UgaW4gY29tbWl0Um9vdFxuICogQHBhcmFtIHtWTm9kZX0gcm9vdFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tbWl0Um9vdChjb21taXRRdWV1ZSwgcm9vdCwgcmVmUXVldWUpIHtcblx0cm9vdC5fbmV4dERvbSA9IHVuZGVmaW5lZDtcblxuXHRmb3IgKGxldCBpID0gMDsgaSA8IHJlZlF1ZXVlLmxlbmd0aDsgaSsrKSB7XG5cdFx0YXBwbHlSZWYocmVmUXVldWVbaV0sIHJlZlF1ZXVlWysraV0sIHJlZlF1ZXVlWysraV0pO1xuXHR9XG5cblx0aWYgKG9wdGlvbnMuX2NvbW1pdCkgb3B0aW9ucy5fY29tbWl0KHJvb3QsIGNvbW1pdFF1ZXVlKTtcblxuXHRjb21taXRRdWV1ZS5zb21lKGMgPT4ge1xuXHRcdHRyeSB7XG5cdFx0XHQvLyBAdHMtZXhwZWN0LWVycm9yIFJldXNlIHRoZSBjb21taXRRdWV1ZSB2YXJpYWJsZSBoZXJlIHNvIHRoZSB0eXBlIGNoYW5nZXNcblx0XHRcdGNvbW1pdFF1ZXVlID0gYy5fcmVuZGVyQ2FsbGJhY2tzO1xuXHRcdFx0Yy5fcmVuZGVyQ2FsbGJhY2tzID0gW107XG5cdFx0XHRjb21taXRRdWV1ZS5zb21lKGNiID0+IHtcblx0XHRcdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciBTZWUgYWJvdmUgY29tbWVudCBvbiBjb21taXRRdWV1ZVxuXHRcdFx0XHRjYi5jYWxsKGMpO1xuXHRcdFx0fSk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0b3B0aW9ucy5fY2F0Y2hFcnJvcihlLCBjLl92bm9kZSk7XG5cdFx0fVxuXHR9KTtcbn1cblxuLyoqXG4gKiBEaWZmIHR3byB2aXJ0dWFsIG5vZGVzIHJlcHJlc2VudGluZyBET00gZWxlbWVudFxuICogQHBhcmFtIHtQcmVhY3RFbGVtZW50fSBkb20gVGhlIERPTSBlbGVtZW50IHJlcHJlc2VudGluZyB0aGUgdmlydHVhbCBub2Rlc1xuICogYmVpbmcgZGlmZmVkXG4gKiBAcGFyYW0ge1ZOb2RlfSBuZXdWTm9kZSBUaGUgbmV3IHZpcnR1YWwgbm9kZVxuICogQHBhcmFtIHtWTm9kZX0gb2xkVk5vZGUgVGhlIG9sZCB2aXJ0dWFsIG5vZGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBnbG9iYWxDb250ZXh0IFRoZSBjdXJyZW50IGNvbnRleHQgb2JqZWN0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzU3ZnIFdoZXRoZXIgb3Igbm90IHRoaXMgRE9NIG5vZGUgaXMgYW4gU1ZHIG5vZGVcbiAqIEBwYXJhbSB7QXJyYXk8UHJlYWN0RWxlbWVudD59IGV4Y2Vzc0RvbUNoaWxkcmVuXG4gKiBAcGFyYW0ge0FycmF5PENvbXBvbmVudD59IGNvbW1pdFF1ZXVlIExpc3Qgb2YgY29tcG9uZW50cyB3aGljaCBoYXZlIGNhbGxiYWNrc1xuICogdG8gaW52b2tlIGluIGNvbW1pdFJvb3RcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNIeWRyYXRpbmcgV2hldGhlciBvciBub3Qgd2UgYXJlIGluIGh5ZHJhdGlvblxuICogQHBhcmFtIHthbnlbXX0gcmVmUXVldWUgYW4gYXJyYXkgb2YgZWxlbWVudHMgbmVlZGVkIHRvIGludm9rZSByZWZzXG4gKiBAcmV0dXJucyB7UHJlYWN0RWxlbWVudH1cbiAqL1xuZnVuY3Rpb24gZGlmZkVsZW1lbnROb2Rlcyhcblx0ZG9tLFxuXHRuZXdWTm9kZSxcblx0b2xkVk5vZGUsXG5cdGdsb2JhbENvbnRleHQsXG5cdGlzU3ZnLFxuXHRleGNlc3NEb21DaGlsZHJlbixcblx0Y29tbWl0UXVldWUsXG5cdGlzSHlkcmF0aW5nLFxuXHRyZWZRdWV1ZVxuKSB7XG5cdGxldCBvbGRQcm9wcyA9IG9sZFZOb2RlLnByb3BzO1xuXHRsZXQgbmV3UHJvcHMgPSBuZXdWTm9kZS5wcm9wcztcblx0bGV0IG5vZGVUeXBlID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChuZXdWTm9kZS50eXBlKTtcblx0LyoqIEB0eXBlIHthbnl9ICovXG5cdGxldCBpO1xuXHQvKiogQHR5cGUge3sgX19odG1sPzogc3RyaW5nIH19ICovXG5cdGxldCBuZXdIdG1sO1xuXHQvKiogQHR5cGUge3sgX19odG1sPzogc3RyaW5nIH19ICovXG5cdGxldCBvbGRIdG1sO1xuXHQvKiogQHR5cGUge0NvbXBvbmVudENoaWxkcmVufSAqL1xuXHRsZXQgbmV3Q2hpbGRyZW47XG5cdGxldCB2YWx1ZTtcblx0bGV0IGlucHV0VmFsdWU7XG5cdGxldCBjaGVja2VkO1xuXG5cdC8vIFRyYWNrcyBlbnRlcmluZyBhbmQgZXhpdGluZyBTVkcgbmFtZXNwYWNlIHdoZW4gZGVzY2VuZGluZyB0aHJvdWdoIHRoZSB0cmVlLlxuXHRpZiAobm9kZVR5cGUgPT09ICdzdmcnKSBpc1N2ZyA9IHRydWU7XG5cblx0aWYgKGV4Y2Vzc0RvbUNoaWxkcmVuICE9IG51bGwpIHtcblx0XHRmb3IgKGkgPSAwOyBpIDwgZXhjZXNzRG9tQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhbHVlID0gZXhjZXNzRG9tQ2hpbGRyZW5baV07XG5cblx0XHRcdC8vIGlmIG5ld1ZOb2RlIG1hdGNoZXMgYW4gZWxlbWVudCBpbiBleGNlc3NEb21DaGlsZHJlbiBvciB0aGUgYGRvbWBcblx0XHRcdC8vIGFyZ3VtZW50IG1hdGNoZXMgYW4gZWxlbWVudCBpbiBleGNlc3NEb21DaGlsZHJlbiwgcmVtb3ZlIGl0IGZyb21cblx0XHRcdC8vIGV4Y2Vzc0RvbUNoaWxkcmVuIHNvIGl0IGlzbid0IGxhdGVyIHJlbW92ZWQgaW4gZGlmZkNoaWxkcmVuXG5cdFx0XHRpZiAoXG5cdFx0XHRcdHZhbHVlICYmXG5cdFx0XHRcdCdzZXRBdHRyaWJ1dGUnIGluIHZhbHVlID09PSAhIW5vZGVUeXBlICYmXG5cdFx0XHRcdChub2RlVHlwZSA/IHZhbHVlLmxvY2FsTmFtZSA9PT0gbm9kZVR5cGUgOiB2YWx1ZS5ub2RlVHlwZSA9PT0gMylcblx0XHRcdCkge1xuXHRcdFx0XHRkb20gPSB2YWx1ZTtcblx0XHRcdFx0ZXhjZXNzRG9tQ2hpbGRyZW5baV0gPSBudWxsO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRpZiAoZG9tID09IG51bGwpIHtcblx0XHRpZiAobm9kZVR5cGUgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShuZXdQcm9wcyk7XG5cdFx0fVxuXG5cdFx0aWYgKGlzU3ZnKSB7XG5cdFx0XHRkb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgbm9kZVR5cGUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5vZGVUeXBlLCBuZXdQcm9wcy5pcyAmJiBuZXdQcm9wcyk7XG5cdFx0fVxuXG5cdFx0Ly8gd2UgY3JlYXRlZCBhIG5ldyBwYXJlbnQsIHNvIG5vbmUgb2YgdGhlIHByZXZpb3VzbHkgYXR0YWNoZWQgY2hpbGRyZW4gY2FuIGJlIHJldXNlZDpcblx0XHRleGNlc3NEb21DaGlsZHJlbiA9IG51bGw7XG5cdFx0Ly8gd2UgYXJlIGNyZWF0aW5nIGEgbmV3IG5vZGUsIHNvIHdlIGNhbiBhc3N1bWUgdGhpcyBpcyBhIG5ldyBzdWJ0cmVlIChpblxuXHRcdC8vIGNhc2Ugd2UgYXJlIGh5ZHJhdGluZyksIHRoaXMgZGVvcHRzIHRoZSBoeWRyYXRlXG5cdFx0aXNIeWRyYXRpbmcgPSBmYWxzZTtcblx0fVxuXG5cdGlmIChub2RlVHlwZSA9PT0gbnVsbCkge1xuXHRcdC8vIER1cmluZyBoeWRyYXRpb24sIHdlIHN0aWxsIGhhdmUgdG8gc3BsaXQgbWVyZ2VkIHRleHQgZnJvbSBTU1InZCBIVE1MLlxuXHRcdGlmIChvbGRQcm9wcyAhPT0gbmV3UHJvcHMgJiYgKCFpc0h5ZHJhdGluZyB8fCBkb20uZGF0YSAhPT0gbmV3UHJvcHMpKSB7XG5cdFx0XHRkb20uZGF0YSA9IG5ld1Byb3BzO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvLyBJZiBleGNlc3NEb21DaGlsZHJlbiB3YXMgbm90IG51bGwsIHJlcG9wdWxhdGUgaXQgd2l0aCB0aGUgY3VycmVudCBlbGVtZW50J3MgY2hpbGRyZW46XG5cdFx0ZXhjZXNzRG9tQ2hpbGRyZW4gPSBleGNlc3NEb21DaGlsZHJlbiAmJiBzbGljZS5jYWxsKGRvbS5jaGlsZE5vZGVzKTtcblxuXHRcdG9sZFByb3BzID0gb2xkVk5vZGUucHJvcHMgfHwgRU1QVFlfT0JKO1xuXG5cdFx0Ly8gSWYgd2UgYXJlIGluIGEgc2l0dWF0aW9uIHdoZXJlIHdlIGFyZSBub3QgaHlkcmF0aW5nIGJ1dCBhcmUgdXNpbmdcblx0XHQvLyBleGlzdGluZyBET00gKGUuZy4gcmVwbGFjZU5vZGUpIHdlIHNob3VsZCByZWFkIHRoZSBleGlzdGluZyBET01cblx0XHQvLyBhdHRyaWJ1dGVzIHRvIGRpZmYgdGhlbVxuXHRcdGlmICghaXNIeWRyYXRpbmcgJiYgZXhjZXNzRG9tQ2hpbGRyZW4gIT0gbnVsbCkge1xuXHRcdFx0b2xkUHJvcHMgPSB7fTtcblx0XHRcdGZvciAoaSA9IDA7IGkgPCBkb20uYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHR2YWx1ZSA9IGRvbS5hdHRyaWJ1dGVzW2ldO1xuXHRcdFx0XHRvbGRQcm9wc1t2YWx1ZS5uYW1lXSA9IHZhbHVlLnZhbHVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZvciAoaSBpbiBvbGRQcm9wcykge1xuXHRcdFx0dmFsdWUgPSBvbGRQcm9wc1tpXTtcblx0XHRcdGlmIChpID09ICdjaGlsZHJlbicpIHtcblx0XHRcdH0gZWxzZSBpZiAoaSA9PSAnZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwnKSB7XG5cdFx0XHRcdG9sZEh0bWwgPSB2YWx1ZTtcblx0XHRcdH0gZWxzZSBpZiAoaSAhPT0gJ2tleScgJiYgIShpIGluIG5ld1Byb3BzKSkge1xuXHRcdFx0XHRzZXRQcm9wZXJ0eShkb20sIGksIG51bGwsIHZhbHVlLCBpc1N2Zyk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gRHVyaW5nIGh5ZHJhdGlvbiwgcHJvcHMgYXJlIG5vdCBkaWZmZWQgYXQgYWxsIChpbmNsdWRpbmcgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwpXG5cdFx0Ly8gQFRPRE8gd2Ugc2hvdWxkIHdhcm4gaW4gZGVidWcgbW9kZSB3aGVuIHByb3BzIGRvbid0IG1hdGNoIGhlcmUuXG5cdFx0Zm9yIChpIGluIG5ld1Byb3BzKSB7XG5cdFx0XHR2YWx1ZSA9IG5ld1Byb3BzW2ldO1xuXHRcdFx0aWYgKGkgPT0gJ2NoaWxkcmVuJykge1xuXHRcdFx0XHRuZXdDaGlsZHJlbiA9IHZhbHVlO1xuXHRcdFx0fSBlbHNlIGlmIChpID09ICdkYW5nZXJvdXNseVNldElubmVySFRNTCcpIHtcblx0XHRcdFx0bmV3SHRtbCA9IHZhbHVlO1xuXHRcdFx0fSBlbHNlIGlmIChpID09ICd2YWx1ZScpIHtcblx0XHRcdFx0aW5wdXRWYWx1ZSA9IHZhbHVlO1xuXHRcdFx0fSBlbHNlIGlmIChpID09ICdjaGVja2VkJykge1xuXHRcdFx0XHRjaGVja2VkID0gdmFsdWU7XG5cdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRpICE9PSAna2V5JyAmJlxuXHRcdFx0XHQoIWlzSHlkcmF0aW5nIHx8IHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nKSAmJlxuXHRcdFx0XHRvbGRQcm9wc1tpXSAhPT0gdmFsdWVcblx0XHRcdCkge1xuXHRcdFx0XHRzZXRQcm9wZXJ0eShkb20sIGksIHZhbHVlLCBvbGRQcm9wc1tpXSwgaXNTdmcpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIElmIHRoZSBuZXcgdm5vZGUgZGlkbid0IGhhdmUgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwsIGRpZmYgaXRzIGNoaWxkcmVuXG5cdFx0aWYgKG5ld0h0bWwpIHtcblx0XHRcdC8vIEF2b2lkIHJlLWFwcGx5aW5nIHRoZSBzYW1lICdfX2h0bWwnIGlmIGl0IGRpZCBub3QgY2hhbmdlZCBiZXR3ZWVuIHJlLXJlbmRlclxuXHRcdFx0aWYgKFxuXHRcdFx0XHQhaXNIeWRyYXRpbmcgJiZcblx0XHRcdFx0KCFvbGRIdG1sIHx8XG5cdFx0XHRcdFx0KG5ld0h0bWwuX19odG1sICE9PSBvbGRIdG1sLl9faHRtbCAmJlxuXHRcdFx0XHRcdFx0bmV3SHRtbC5fX2h0bWwgIT09IGRvbS5pbm5lckhUTUwpKVxuXHRcdFx0KSB7XG5cdFx0XHRcdGRvbS5pbm5lckhUTUwgPSBuZXdIdG1sLl9faHRtbDtcblx0XHRcdH1cblxuXHRcdFx0bmV3Vk5vZGUuX2NoaWxkcmVuID0gW107XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmIChvbGRIdG1sKSBkb20uaW5uZXJIVE1MID0gJyc7XG5cblx0XHRcdGRpZmZDaGlsZHJlbihcblx0XHRcdFx0ZG9tLFxuXHRcdFx0XHRpc0FycmF5KG5ld0NoaWxkcmVuKSA/IG5ld0NoaWxkcmVuIDogW25ld0NoaWxkcmVuXSxcblx0XHRcdFx0bmV3Vk5vZGUsXG5cdFx0XHRcdG9sZFZOb2RlLFxuXHRcdFx0XHRnbG9iYWxDb250ZXh0LFxuXHRcdFx0XHRpc1N2ZyAmJiBub2RlVHlwZSAhPT0gJ2ZvcmVpZ25PYmplY3QnLFxuXHRcdFx0XHRleGNlc3NEb21DaGlsZHJlbixcblx0XHRcdFx0Y29tbWl0UXVldWUsXG5cdFx0XHRcdGV4Y2Vzc0RvbUNoaWxkcmVuXG5cdFx0XHRcdFx0PyBleGNlc3NEb21DaGlsZHJlblswXVxuXHRcdFx0XHRcdDogb2xkVk5vZGUuX2NoaWxkcmVuICYmIGdldERvbVNpYmxpbmcob2xkVk5vZGUsIDApLFxuXHRcdFx0XHRpc0h5ZHJhdGluZyxcblx0XHRcdFx0cmVmUXVldWVcblx0XHRcdCk7XG5cblx0XHRcdC8vIFJlbW92ZSBjaGlsZHJlbiB0aGF0IGFyZSBub3QgcGFydCBvZiBhbnkgdm5vZGUuXG5cdFx0XHRpZiAoZXhjZXNzRG9tQ2hpbGRyZW4gIT0gbnVsbCkge1xuXHRcdFx0XHRmb3IgKGkgPSBleGNlc3NEb21DaGlsZHJlbi5sZW5ndGg7IGktLTsgKSB7XG5cdFx0XHRcdFx0aWYgKGV4Y2Vzc0RvbUNoaWxkcmVuW2ldICE9IG51bGwpIHJlbW92ZU5vZGUoZXhjZXNzRG9tQ2hpbGRyZW5baV0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQXMgYWJvdmUsIGRvbid0IGRpZmYgcHJvcHMgZHVyaW5nIGh5ZHJhdGlvblxuXHRcdGlmICghaXNIeWRyYXRpbmcpIHtcblx0XHRcdGkgPSAndmFsdWUnO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRpbnB1dFZhbHVlICE9PSB1bmRlZmluZWQgJiZcblx0XHRcdFx0Ly8gIzI3NTYgRm9yIHRoZSA8cHJvZ3Jlc3M+LWVsZW1lbnQgdGhlIGluaXRpYWwgdmFsdWUgaXMgMCxcblx0XHRcdFx0Ly8gZGVzcGl0ZSB0aGUgYXR0cmlidXRlIG5vdCBiZWluZyBwcmVzZW50LiBXaGVuIHRoZSBhdHRyaWJ1dGVcblx0XHRcdFx0Ly8gaXMgbWlzc2luZyB0aGUgcHJvZ3Jlc3MgYmFyIGlzIHRyZWF0ZWQgYXMgaW5kZXRlcm1pbmF0ZS5cblx0XHRcdFx0Ly8gVG8gZml4IHRoYXQgd2UnbGwgYWx3YXlzIHVwZGF0ZSBpdCB3aGVuIGl0IGlzIDAgZm9yIHByb2dyZXNzIGVsZW1lbnRzXG5cdFx0XHRcdChpbnB1dFZhbHVlICE9PSBkb21baV0gfHxcblx0XHRcdFx0XHQobm9kZVR5cGUgPT09ICdwcm9ncmVzcycgJiYgIWlucHV0VmFsdWUpIHx8XG5cdFx0XHRcdFx0Ly8gVGhpcyBpcyBvbmx5IGZvciBJRSAxMSB0byBmaXggPHNlbGVjdD4gdmFsdWUgbm90IGJlaW5nIHVwZGF0ZWQuXG5cdFx0XHRcdFx0Ly8gVG8gYXZvaWQgYSBzdGFsZSBzZWxlY3QgdmFsdWUgd2UgbmVlZCB0byBzZXQgdGhlIG9wdGlvbi52YWx1ZVxuXHRcdFx0XHRcdC8vIGFnYWluLCB3aGljaCB0cmlnZ2VycyBJRTExIHRvIHJlLWV2YWx1YXRlIHRoZSBzZWxlY3QgdmFsdWVcblx0XHRcdFx0XHQobm9kZVR5cGUgPT09ICdvcHRpb24nICYmIGlucHV0VmFsdWUgIT09IG9sZFByb3BzW2ldKSlcblx0XHRcdCkge1xuXHRcdFx0XHRzZXRQcm9wZXJ0eShkb20sIGksIGlucHV0VmFsdWUsIG9sZFByb3BzW2ldLCBmYWxzZSk7XG5cdFx0XHR9XG5cblx0XHRcdGkgPSAnY2hlY2tlZCc7XG5cdFx0XHRpZiAoY2hlY2tlZCAhPT0gdW5kZWZpbmVkICYmIGNoZWNrZWQgIT09IGRvbVtpXSkge1xuXHRcdFx0XHRzZXRQcm9wZXJ0eShkb20sIGksIGNoZWNrZWQsIG9sZFByb3BzW2ldLCBmYWxzZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGRvbTtcbn1cblxuLyoqXG4gKiBJbnZva2Ugb3IgdXBkYXRlIGEgcmVmLCBkZXBlbmRpbmcgb24gd2hldGhlciBpdCBpcyBhIGZ1bmN0aW9uIG9yIG9iamVjdCByZWYuXG4gKiBAcGFyYW0ge1JlZjxhbnk+fSByZWZcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICogQHBhcmFtIHtWTm9kZX0gdm5vZGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UmVmKHJlZiwgdmFsdWUsIHZub2RlKSB7XG5cdHRyeSB7XG5cdFx0aWYgKHR5cGVvZiByZWYgPT0gJ2Z1bmN0aW9uJykgcmVmKHZhbHVlKTtcblx0XHRlbHNlIHJlZi5jdXJyZW50ID0gdmFsdWU7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRvcHRpb25zLl9jYXRjaEVycm9yKGUsIHZub2RlKTtcblx0fVxufVxuXG4vKipcbiAqIFVubW91bnQgYSB2aXJ0dWFsIG5vZGUgZnJvbSB0aGUgdHJlZSBhbmQgYXBwbHkgRE9NIGNoYW5nZXNcbiAqIEBwYXJhbSB7Vk5vZGV9IHZub2RlIFRoZSB2aXJ0dWFsIG5vZGUgdG8gdW5tb3VudFxuICogQHBhcmFtIHtWTm9kZX0gcGFyZW50Vk5vZGUgVGhlIHBhcmVudCBvZiB0aGUgVk5vZGUgdGhhdCBpbml0aWF0ZWQgdGhlIHVubW91bnRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3NraXBSZW1vdmVdIEZsYWcgdGhhdCBpbmRpY2F0ZXMgdGhhdCBhIHBhcmVudCBub2RlIG9mIHRoZVxuICogY3VycmVudCBlbGVtZW50IGlzIGFscmVhZHkgZGV0YWNoZWQgZnJvbSB0aGUgRE9NLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5tb3VudCh2bm9kZSwgcGFyZW50Vk5vZGUsIHNraXBSZW1vdmUpIHtcblx0bGV0IHI7XG5cdGlmIChvcHRpb25zLnVubW91bnQpIG9wdGlvbnMudW5tb3VudCh2bm9kZSk7XG5cblx0aWYgKChyID0gdm5vZGUucmVmKSkge1xuXHRcdGlmICghci5jdXJyZW50IHx8IHIuY3VycmVudCA9PT0gdm5vZGUuX2RvbSkge1xuXHRcdFx0YXBwbHlSZWYociwgbnVsbCwgcGFyZW50Vk5vZGUpO1xuXHRcdH1cblx0fVxuXG5cdGlmICgociA9IHZub2RlLl9jb21wb25lbnQpICE9IG51bGwpIHtcblx0XHRpZiAoci5jb21wb25lbnRXaWxsVW5tb3VudCkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0ci5jb21wb25lbnRXaWxsVW5tb3VudCgpO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRvcHRpb25zLl9jYXRjaEVycm9yKGUsIHBhcmVudFZOb2RlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyLmJhc2UgPSByLl9wYXJlbnREb20gPSBudWxsO1xuXHRcdHZub2RlLl9jb21wb25lbnQgPSB1bmRlZmluZWQ7XG5cdH1cblxuXHRpZiAoKHIgPSB2bm9kZS5fY2hpbGRyZW4pKSB7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCByLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAocltpXSkge1xuXHRcdFx0XHR1bm1vdW50KFxuXHRcdFx0XHRcdHJbaV0sXG5cdFx0XHRcdFx0cGFyZW50Vk5vZGUsXG5cdFx0XHRcdFx0c2tpcFJlbW92ZSB8fCB0eXBlb2Ygdm5vZGUudHlwZSAhPT0gJ2Z1bmN0aW9uJ1xuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGlmICghc2tpcFJlbW92ZSAmJiB2bm9kZS5fZG9tICE9IG51bGwpIHtcblx0XHRyZW1vdmVOb2RlKHZub2RlLl9kb20pO1xuXHR9XG5cblx0Ly8gTXVzdCBiZSBzZXQgdG8gYHVuZGVmaW5lZGAgdG8gcHJvcGVybHkgY2xlYW4gdXAgYF9uZXh0RG9tYFxuXHQvLyBmb3Igd2hpY2ggYG51bGxgIGlzIGEgdmFsaWQgdmFsdWUuIFNlZSBjb21tZW50IGluIGBjcmVhdGUtZWxlbWVudC5qc2Bcblx0dm5vZGUuX3BhcmVudCA9IHZub2RlLl9kb20gPSB2bm9kZS5fbmV4dERvbSA9IHVuZGVmaW5lZDtcbn1cblxuLyoqIFRoZSBgLnJlbmRlcigpYCBtZXRob2QgZm9yIGEgUEZDIGJhY2tpbmcgaW5zdGFuY2UuICovXG5mdW5jdGlvbiBkb1JlbmRlcihwcm9wcywgc3RhdGUsIGNvbnRleHQpIHtcblx0cmV0dXJuIHRoaXMuY29uc3RydWN0b3IocHJvcHMsIGNvbnRleHQpO1xufVxuIiwgImltcG9ydCB7IEVNUFRZX09CSiB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IGNvbW1pdFJvb3QsIGRpZmYgfSBmcm9tICcuL2RpZmYvaW5kZXgnO1xuaW1wb3J0IHsgY3JlYXRlRWxlbWVudCwgRnJhZ21lbnQgfSBmcm9tICcuL2NyZWF0ZS1lbGVtZW50JztcbmltcG9ydCBvcHRpb25zIGZyb20gJy4vb3B0aW9ucyc7XG5pbXBvcnQgeyBzbGljZSB9IGZyb20gJy4vdXRpbCc7XG5cbi8qKlxuICogUmVuZGVyIGEgUHJlYWN0IHZpcnR1YWwgbm9kZSBpbnRvIGEgRE9NIGVsZW1lbnRcbiAqIEBwYXJhbSB7Q29tcG9uZW50Q2hpbGR9IHZub2RlIFRoZSB2aXJ0dWFsIG5vZGUgdG8gcmVuZGVyXG4gKiBAcGFyYW0ge1ByZWFjdEVsZW1lbnR9IHBhcmVudERvbSBUaGUgRE9NIGVsZW1lbnQgdG8gcmVuZGVyIGludG9cbiAqIEBwYXJhbSB7UHJlYWN0RWxlbWVudCB8IG9iamVjdH0gW3JlcGxhY2VOb2RlXSBPcHRpb25hbDogQXR0ZW1wdCB0byByZS11c2UgYW5cbiAqIGV4aXN0aW5nIERPTSB0cmVlIHJvb3RlZCBhdCBgcmVwbGFjZU5vZGVgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXIodm5vZGUsIHBhcmVudERvbSwgcmVwbGFjZU5vZGUpIHtcblx0aWYgKG9wdGlvbnMuX3Jvb3QpIG9wdGlvbnMuX3Jvb3Qodm5vZGUsIHBhcmVudERvbSk7XG5cblx0Ly8gV2UgYWJ1c2UgdGhlIGByZXBsYWNlTm9kZWAgcGFyYW1ldGVyIGluIGBoeWRyYXRlKClgIHRvIHNpZ25hbCBpZiB3ZSBhcmUgaW5cblx0Ly8gaHlkcmF0aW9uIG1vZGUgb3Igbm90IGJ5IHBhc3NpbmcgdGhlIGBoeWRyYXRlYCBmdW5jdGlvbiBpbnN0ZWFkIG9mIGEgRE9NXG5cdC8vIGVsZW1lbnQuLlxuXHRsZXQgaXNIeWRyYXRpbmcgPSB0eXBlb2YgcmVwbGFjZU5vZGUgPT0gJ2Z1bmN0aW9uJztcblxuXHQvLyBUbyBiZSBhYmxlIHRvIHN1cHBvcnQgY2FsbGluZyBgcmVuZGVyKClgIG11bHRpcGxlIHRpbWVzIG9uIHRoZSBzYW1lXG5cdC8vIERPTSBub2RlLCB3ZSBuZWVkIHRvIG9idGFpbiBhIHJlZmVyZW5jZSB0byB0aGUgcHJldmlvdXMgdHJlZS4gV2UgZG9cblx0Ly8gdGhpcyBieSBhc3NpZ25pbmcgYSBuZXcgYF9jaGlsZHJlbmAgcHJvcGVydHkgdG8gRE9NIG5vZGVzIHdoaWNoIHBvaW50c1xuXHQvLyB0byB0aGUgbGFzdCByZW5kZXJlZCB0cmVlLiBCeSBkZWZhdWx0IHRoaXMgcHJvcGVydHkgaXMgbm90IHByZXNlbnQsIHdoaWNoXG5cdC8vIG1lYW5zIHRoYXQgd2UgYXJlIG1vdW50aW5nIGEgbmV3IHRyZWUgZm9yIHRoZSBmaXJzdCB0aW1lLlxuXHRsZXQgb2xkVk5vZGUgPSBpc0h5ZHJhdGluZ1xuXHRcdD8gbnVsbFxuXHRcdDogKHJlcGxhY2VOb2RlICYmIHJlcGxhY2VOb2RlLl9jaGlsZHJlbikgfHwgcGFyZW50RG9tLl9jaGlsZHJlbjtcblxuXHR2bm9kZSA9ICgoIWlzSHlkcmF0aW5nICYmIHJlcGxhY2VOb2RlKSB8fCBwYXJlbnREb20pLl9jaGlsZHJlbiA9XG5cdFx0Y3JlYXRlRWxlbWVudChGcmFnbWVudCwgbnVsbCwgW3Zub2RlXSk7XG5cblx0Ly8gTGlzdCBvZiBlZmZlY3RzIHRoYXQgbmVlZCB0byBiZSBjYWxsZWQgYWZ0ZXIgZGlmZmluZy5cblx0bGV0IGNvbW1pdFF1ZXVlID0gW10sXG5cdFx0cmVmUXVldWUgPSBbXTtcblx0ZGlmZihcblx0XHRwYXJlbnREb20sXG5cdFx0Ly8gRGV0ZXJtaW5lIHRoZSBuZXcgdm5vZGUgdHJlZSBhbmQgc3RvcmUgaXQgb24gdGhlIERPTSBlbGVtZW50IG9uXG5cdFx0Ly8gb3VyIGN1c3RvbSBgX2NoaWxkcmVuYCBwcm9wZXJ0eS5cblx0XHR2bm9kZSxcblx0XHRvbGRWTm9kZSB8fCBFTVBUWV9PQkosXG5cdFx0RU1QVFlfT0JKLFxuXHRcdHBhcmVudERvbS5vd25lclNWR0VsZW1lbnQgIT09IHVuZGVmaW5lZCxcblx0XHQhaXNIeWRyYXRpbmcgJiYgcmVwbGFjZU5vZGVcblx0XHRcdD8gW3JlcGxhY2VOb2RlXVxuXHRcdFx0OiBvbGRWTm9kZVxuXHRcdFx0PyBudWxsXG5cdFx0XHQ6IHBhcmVudERvbS5maXJzdENoaWxkXG5cdFx0XHQ/IHNsaWNlLmNhbGwocGFyZW50RG9tLmNoaWxkTm9kZXMpXG5cdFx0XHQ6IG51bGwsXG5cdFx0Y29tbWl0UXVldWUsXG5cdFx0IWlzSHlkcmF0aW5nICYmIHJlcGxhY2VOb2RlXG5cdFx0XHQ/IHJlcGxhY2VOb2RlXG5cdFx0XHQ6IG9sZFZOb2RlXG5cdFx0XHQ/IG9sZFZOb2RlLl9kb21cblx0XHRcdDogcGFyZW50RG9tLmZpcnN0Q2hpbGQsXG5cdFx0aXNIeWRyYXRpbmcsXG5cdFx0cmVmUXVldWVcblx0KTtcblxuXHQvLyBGbHVzaCBhbGwgcXVldWVkIGVmZmVjdHNcblx0Y29tbWl0Um9vdChjb21taXRRdWV1ZSwgdm5vZGUsIHJlZlF1ZXVlKTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgYW4gZXhpc3RpbmcgRE9NIGVsZW1lbnQgd2l0aCBkYXRhIGZyb20gYSBQcmVhY3QgdmlydHVhbCBub2RlXG4gKiBAcGFyYW0ge0NvbXBvbmVudENoaWxkfSB2bm9kZSBUaGUgdmlydHVhbCBub2RlIHRvIHJlbmRlclxuICogQHBhcmFtIHtQcmVhY3RFbGVtZW50fSBwYXJlbnREb20gVGhlIERPTSBlbGVtZW50IHRvIHVwZGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaHlkcmF0ZSh2bm9kZSwgcGFyZW50RG9tKSB7XG5cdHJlbmRlcih2bm9kZSwgcGFyZW50RG9tLCBoeWRyYXRlKTtcbn1cbiIsICJpbXBvcnQgeyBhc3NpZ24sIHNsaWNlIH0gZnJvbSAnLi91dGlsJztcbmltcG9ydCB7IGNyZWF0ZVZOb2RlIH0gZnJvbSAnLi9jcmVhdGUtZWxlbWVudCc7XG5cbi8qKlxuICogQ2xvbmVzIHRoZSBnaXZlbiBWTm9kZSwgb3B0aW9uYWxseSBhZGRpbmcgYXR0cmlidXRlcy9wcm9wcyBhbmQgcmVwbGFjaW5nIGl0c1xuICogY2hpbGRyZW4uXG4gKiBAcGFyYW0ge1ZOb2RlfSB2bm9kZSBUaGUgdmlydHVhbCBET00gZWxlbWVudCB0byBjbG9uZVxuICogQHBhcmFtIHtvYmplY3R9IHByb3BzIEF0dHJpYnV0ZXMvcHJvcHMgdG8gYWRkIHdoZW4gY2xvbmluZ1xuICogQHBhcmFtIHtBcnJheTxDb21wb25lbnRDaGlsZHJlbj59IHJlc3QgQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIHdpbGwgYmUgdXNlZFxuICogYXMgcmVwbGFjZW1lbnQgY2hpbGRyZW4uXG4gKiBAcmV0dXJucyB7Vk5vZGV9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZUVsZW1lbnQodm5vZGUsIHByb3BzLCBjaGlsZHJlbikge1xuXHRsZXQgbm9ybWFsaXplZFByb3BzID0gYXNzaWduKHt9LCB2bm9kZS5wcm9wcyksXG5cdFx0a2V5LFxuXHRcdHJlZixcblx0XHRpO1xuXG5cdGxldCBkZWZhdWx0UHJvcHM7XG5cblx0aWYgKHZub2RlLnR5cGUgJiYgdm5vZGUudHlwZS5kZWZhdWx0UHJvcHMpIHtcblx0XHRkZWZhdWx0UHJvcHMgPSB2bm9kZS50eXBlLmRlZmF1bHRQcm9wcztcblx0fVxuXG5cdGZvciAoaSBpbiBwcm9wcykge1xuXHRcdGlmIChpID09ICdrZXknKSBrZXkgPSBwcm9wc1tpXTtcblx0XHRlbHNlIGlmIChpID09ICdyZWYnKSByZWYgPSBwcm9wc1tpXTtcblx0XHRlbHNlIGlmIChwcm9wc1tpXSA9PT0gdW5kZWZpbmVkICYmIGRlZmF1bHRQcm9wcyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRub3JtYWxpemVkUHJvcHNbaV0gPSBkZWZhdWx0UHJvcHNbaV07XG5cdFx0fSBlbHNlIHtcblx0XHRcdG5vcm1hbGl6ZWRQcm9wc1tpXSA9IHByb3BzW2ldO1xuXHRcdH1cblx0fVxuXG5cdGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikge1xuXHRcdG5vcm1hbGl6ZWRQcm9wcy5jaGlsZHJlbiA9XG5cdFx0XHRhcmd1bWVudHMubGVuZ3RoID4gMyA/IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKSA6IGNoaWxkcmVuO1xuXHR9XG5cblx0cmV0dXJuIGNyZWF0ZVZOb2RlKFxuXHRcdHZub2RlLnR5cGUsXG5cdFx0bm9ybWFsaXplZFByb3BzLFxuXHRcdGtleSB8fCB2bm9kZS5rZXksXG5cdFx0cmVmIHx8IHZub2RlLnJlZixcblx0XHRudWxsXG5cdCk7XG59XG4iLCAiLyoqXG4gKiBGaW5kIHRoZSBjbG9zZXN0IGVycm9yIGJvdW5kYXJ5IHRvIGEgdGhyb3duIGVycm9yIGFuZCBjYWxsIGl0XG4gKiBAcGFyYW0ge29iamVjdH0gZXJyb3IgVGhlIHRocm93biB2YWx1ZVxuICogQHBhcmFtIHtWTm9kZX0gdm5vZGUgVGhlIHZub2RlIHRoYXQgdGhyZXcgdGhlIGVycm9yIHRoYXQgd2FzIGNhdWdodCAoZXhjZXB0XG4gKiBmb3IgdW5tb3VudGluZyB3aGVuIHRoaXMgcGFyYW1ldGVyIGlzIHRoZSBoaWdoZXN0IHBhcmVudCB0aGF0IHdhcyBiZWluZ1xuICogdW5tb3VudGVkKVxuICogQHBhcmFtIHtWTm9kZX0gW29sZFZOb2RlXVxuICogQHBhcmFtIHtFcnJvckluZm99IFtlcnJvckluZm9dXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfY2F0Y2hFcnJvcihlcnJvciwgdm5vZGUsIG9sZFZOb2RlLCBlcnJvckluZm8pIHtcblx0LyoqIEB0eXBlIHtDb21wb25lbnR9ICovXG5cdGxldCBjb21wb25lbnQsXG5cdFx0LyoqIEB0eXBlIHtDb21wb25lbnRUeXBlfSAqL1xuXHRcdGN0b3IsXG5cdFx0LyoqIEB0eXBlIHtib29sZWFufSAqL1xuXHRcdGhhbmRsZWQ7XG5cblx0Zm9yICg7ICh2bm9kZSA9IHZub2RlLl9wYXJlbnQpOyApIHtcblx0XHRpZiAoKGNvbXBvbmVudCA9IHZub2RlLl9jb21wb25lbnQpICYmICFjb21wb25lbnQuX3Byb2Nlc3NpbmdFeGNlcHRpb24pIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGN0b3IgPSBjb21wb25lbnQuY29uc3RydWN0b3I7XG5cblx0XHRcdFx0aWYgKGN0b3IgJiYgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgIT0gbnVsbCkge1xuXHRcdFx0XHRcdGNvbXBvbmVudC5zZXRTdGF0ZShjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihlcnJvcikpO1xuXHRcdFx0XHRcdGhhbmRsZWQgPSBjb21wb25lbnQuX2RpcnR5O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGNvbXBvbmVudC5jb21wb25lbnREaWRDYXRjaCAhPSBudWxsKSB7XG5cdFx0XHRcdFx0Y29tcG9uZW50LmNvbXBvbmVudERpZENhdGNoKGVycm9yLCBlcnJvckluZm8gfHwge30pO1xuXHRcdFx0XHRcdGhhbmRsZWQgPSBjb21wb25lbnQuX2RpcnR5O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gVGhpcyBpcyBhbiBlcnJvciBib3VuZGFyeS4gTWFyayBpdCBhcyBoYXZpbmcgYmFpbGVkIG91dCwgYW5kIHdoZXRoZXIgaXQgd2FzIG1pZC1oeWRyYXRpb24uXG5cdFx0XHRcdGlmIChoYW5kbGVkKSB7XG5cdFx0XHRcdFx0cmV0dXJuIChjb21wb25lbnQuX3BlbmRpbmdFcnJvciA9IGNvbXBvbmVudCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0ZXJyb3IgPSBlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHRocm93IGVycm9yO1xufVxuIiwgImltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICdwcmVhY3QnO1xuXG4vKiogQHR5cGUge251bWJlcn0gKi9cbmxldCBjdXJyZW50SW5kZXg7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL2ludGVybmFsJykuQ29tcG9uZW50fSAqL1xubGV0IGN1cnJlbnRDb21wb25lbnQ7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL2ludGVybmFsJykuQ29tcG9uZW50fSAqL1xubGV0IHByZXZpb3VzQ29tcG9uZW50O1xuXG4vKiogQHR5cGUge251bWJlcn0gKi9cbmxldCBjdXJyZW50SG9vayA9IDA7XG5cbi8qKiBAdHlwZSB7QXJyYXk8aW1wb3J0KCcuL2ludGVybmFsJykuQ29tcG9uZW50Pn0gKi9cbmxldCBhZnRlclBhaW50RWZmZWN0cyA9IFtdO1xuXG5sZXQgRU1QVFkgPSBbXTtcblxubGV0IG9sZEJlZm9yZURpZmYgPSBvcHRpb25zLl9kaWZmO1xubGV0IG9sZEJlZm9yZVJlbmRlciA9IG9wdGlvbnMuX3JlbmRlcjtcbmxldCBvbGRBZnRlckRpZmYgPSBvcHRpb25zLmRpZmZlZDtcbmxldCBvbGRDb21taXQgPSBvcHRpb25zLl9jb21taXQ7XG5sZXQgb2xkQmVmb3JlVW5tb3VudCA9IG9wdGlvbnMudW5tb3VudDtcblxuY29uc3QgUkFGX1RJTUVPVVQgPSAxMDA7XG5sZXQgcHJldlJhZjtcblxub3B0aW9ucy5fZGlmZiA9IHZub2RlID0+IHtcblx0Y3VycmVudENvbXBvbmVudCA9IG51bGw7XG5cdGlmIChvbGRCZWZvcmVEaWZmKSBvbGRCZWZvcmVEaWZmKHZub2RlKTtcbn07XG5cbm9wdGlvbnMuX3JlbmRlciA9IHZub2RlID0+IHtcblx0aWYgKG9sZEJlZm9yZVJlbmRlcikgb2xkQmVmb3JlUmVuZGVyKHZub2RlKTtcblxuXHRjdXJyZW50Q29tcG9uZW50ID0gdm5vZGUuX2NvbXBvbmVudDtcblx0Y3VycmVudEluZGV4ID0gMDtcblxuXHRjb25zdCBob29rcyA9IGN1cnJlbnRDb21wb25lbnQuX19ob29rcztcblx0aWYgKGhvb2tzKSB7XG5cdFx0aWYgKHByZXZpb3VzQ29tcG9uZW50ID09PSBjdXJyZW50Q29tcG9uZW50KSB7XG5cdFx0XHRob29rcy5fcGVuZGluZ0VmZmVjdHMgPSBbXTtcblx0XHRcdGN1cnJlbnRDb21wb25lbnQuX3JlbmRlckNhbGxiYWNrcyA9IFtdO1xuXHRcdFx0aG9va3MuX2xpc3QuZm9yRWFjaChob29rSXRlbSA9PiB7XG5cdFx0XHRcdGlmIChob29rSXRlbS5fbmV4dFZhbHVlKSB7XG5cdFx0XHRcdFx0aG9va0l0ZW0uX3ZhbHVlID0gaG9va0l0ZW0uX25leHRWYWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRob29rSXRlbS5fcGVuZGluZ1ZhbHVlID0gRU1QVFk7XG5cdFx0XHRcdGhvb2tJdGVtLl9uZXh0VmFsdWUgPSBob29rSXRlbS5fcGVuZGluZ0FyZ3MgPSB1bmRlZmluZWQ7XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aG9va3MuX3BlbmRpbmdFZmZlY3RzLmZvckVhY2goaW52b2tlQ2xlYW51cCk7XG5cdFx0XHRob29rcy5fcGVuZGluZ0VmZmVjdHMuZm9yRWFjaChpbnZva2VFZmZlY3QpO1xuXHRcdFx0aG9va3MuX3BlbmRpbmdFZmZlY3RzID0gW107XG5cdFx0XHRjdXJyZW50SW5kZXggPSAwO1xuXHRcdH1cblx0fVxuXHRwcmV2aW91c0NvbXBvbmVudCA9IGN1cnJlbnRDb21wb25lbnQ7XG59O1xuXG5vcHRpb25zLmRpZmZlZCA9IHZub2RlID0+IHtcblx0aWYgKG9sZEFmdGVyRGlmZikgb2xkQWZ0ZXJEaWZmKHZub2RlKTtcblxuXHRjb25zdCBjID0gdm5vZGUuX2NvbXBvbmVudDtcblx0aWYgKGMgJiYgYy5fX2hvb2tzKSB7XG5cdFx0aWYgKGMuX19ob29rcy5fcGVuZGluZ0VmZmVjdHMubGVuZ3RoKSBhZnRlclBhaW50KGFmdGVyUGFpbnRFZmZlY3RzLnB1c2goYykpO1xuXHRcdGMuX19ob29rcy5fbGlzdC5mb3JFYWNoKGhvb2tJdGVtID0+IHtcblx0XHRcdGlmIChob29rSXRlbS5fcGVuZGluZ0FyZ3MpIHtcblx0XHRcdFx0aG9va0l0ZW0uX2FyZ3MgPSBob29rSXRlbS5fcGVuZGluZ0FyZ3M7XG5cdFx0XHR9XG5cdFx0XHRpZiAoaG9va0l0ZW0uX3BlbmRpbmdWYWx1ZSAhPT0gRU1QVFkpIHtcblx0XHRcdFx0aG9va0l0ZW0uX3ZhbHVlID0gaG9va0l0ZW0uX3BlbmRpbmdWYWx1ZTtcblx0XHRcdH1cblx0XHRcdGhvb2tJdGVtLl9wZW5kaW5nQXJncyA9IHVuZGVmaW5lZDtcblx0XHRcdGhvb2tJdGVtLl9wZW5kaW5nVmFsdWUgPSBFTVBUWTtcblx0XHR9KTtcblx0fVxuXHRwcmV2aW91c0NvbXBvbmVudCA9IGN1cnJlbnRDb21wb25lbnQgPSBudWxsO1xufTtcblxub3B0aW9ucy5fY29tbWl0ID0gKHZub2RlLCBjb21taXRRdWV1ZSkgPT4ge1xuXHRjb21taXRRdWV1ZS5zb21lKGNvbXBvbmVudCA9PiB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbXBvbmVudC5fcmVuZGVyQ2FsbGJhY2tzLmZvckVhY2goaW52b2tlQ2xlYW51cCk7XG5cdFx0XHRjb21wb25lbnQuX3JlbmRlckNhbGxiYWNrcyA9IGNvbXBvbmVudC5fcmVuZGVyQ2FsbGJhY2tzLmZpbHRlcihjYiA9PlxuXHRcdFx0XHRjYi5fdmFsdWUgPyBpbnZva2VFZmZlY3QoY2IpIDogdHJ1ZVxuXHRcdFx0KTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRjb21taXRRdWV1ZS5zb21lKGMgPT4ge1xuXHRcdFx0XHRpZiAoYy5fcmVuZGVyQ2FsbGJhY2tzKSBjLl9yZW5kZXJDYWxsYmFja3MgPSBbXTtcblx0XHRcdH0pO1xuXHRcdFx0Y29tbWl0UXVldWUgPSBbXTtcblx0XHRcdG9wdGlvbnMuX2NhdGNoRXJyb3IoZSwgY29tcG9uZW50Ll92bm9kZSk7XG5cdFx0fVxuXHR9KTtcblxuXHRpZiAob2xkQ29tbWl0KSBvbGRDb21taXQodm5vZGUsIGNvbW1pdFF1ZXVlKTtcbn07XG5cbm9wdGlvbnMudW5tb3VudCA9IHZub2RlID0+IHtcblx0aWYgKG9sZEJlZm9yZVVubW91bnQpIG9sZEJlZm9yZVVubW91bnQodm5vZGUpO1xuXG5cdGNvbnN0IGMgPSB2bm9kZS5fY29tcG9uZW50O1xuXHRpZiAoYyAmJiBjLl9faG9va3MpIHtcblx0XHRsZXQgaGFzRXJyb3JlZDtcblx0XHRjLl9faG9va3MuX2xpc3QuZm9yRWFjaChzID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGludm9rZUNsZWFudXAocyk7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdGhhc0Vycm9yZWQgPSBlO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdGMuX19ob29rcyA9IHVuZGVmaW5lZDtcblx0XHRpZiAoaGFzRXJyb3JlZCkgb3B0aW9ucy5fY2F0Y2hFcnJvcihoYXNFcnJvcmVkLCBjLl92bm9kZSk7XG5cdH1cbn07XG5cbi8qKlxuICogR2V0IGEgaG9vaydzIHN0YXRlIGZyb20gdGhlIGN1cnJlbnRDb21wb25lbnRcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGhvb2sgdG8gZ2V0XG4gKiBAcGFyYW0ge251bWJlcn0gdHlwZSBUaGUgaW5kZXggb2YgdGhlIGhvb2sgdG8gZ2V0XG4gKiBAcmV0dXJucyB7YW55fVxuICovXG5mdW5jdGlvbiBnZXRIb29rU3RhdGUoaW5kZXgsIHR5cGUpIHtcblx0aWYgKG9wdGlvbnMuX2hvb2spIHtcblx0XHRvcHRpb25zLl9ob29rKGN1cnJlbnRDb21wb25lbnQsIGluZGV4LCBjdXJyZW50SG9vayB8fCB0eXBlKTtcblx0fVxuXHRjdXJyZW50SG9vayA9IDA7XG5cblx0Ly8gTGFyZ2VseSBpbnNwaXJlZCBieTpcblx0Ly8gKiBodHRwczovL2dpdGh1Yi5jb20vbWljaGFlbC1rbGVpbi9mdW5jeS5qcy9ibG9iL2Y2YmU3MzQ2OGU2ZWM0NmIwZmY1YWEzY2M0YzliYWY3MmEyOTAyNWEvc3JjL2hvb2tzL2NvcmVfaG9va3MubWpzXG5cdC8vICogaHR0cHM6Ly9naXRodWIuY29tL21pY2hhZWwta2xlaW4vZnVuY3kuanMvYmxvYi82NTBiZWFhNThjNDNjMzNhNzQ4MjBhM2M5OGIzYzcwNzljZjJlMzMzL3NyYy9yZW5kZXJlci5tanNcblx0Ly8gT3RoZXIgaW1wbGVtZW50YXRpb25zIHRvIGxvb2sgYXQ6XG5cdC8vICogaHR0cHM6Ly9jb2Rlc2FuZGJveC5pby9zL21ub3gwNXFwOFxuXHRjb25zdCBob29rcyA9XG5cdFx0Y3VycmVudENvbXBvbmVudC5fX2hvb2tzIHx8XG5cdFx0KGN1cnJlbnRDb21wb25lbnQuX19ob29rcyA9IHtcblx0XHRcdF9saXN0OiBbXSxcblx0XHRcdF9wZW5kaW5nRWZmZWN0czogW11cblx0XHR9KTtcblxuXHRpZiAoaW5kZXggPj0gaG9va3MuX2xpc3QubGVuZ3RoKSB7XG5cdFx0aG9va3MuX2xpc3QucHVzaCh7IF9wZW5kaW5nVmFsdWU6IEVNUFRZIH0pO1xuXHR9XG5cdHJldHVybiBob29rcy5fbGlzdFtpbmRleF07XG59XG5cbi8qKlxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW5kZXgnKS5TdGF0ZVVwZGF0ZXI8YW55Pn0gW2luaXRpYWxTdGF0ZV1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVN0YXRlKGluaXRpYWxTdGF0ZSkge1xuXHRjdXJyZW50SG9vayA9IDE7XG5cdHJldHVybiB1c2VSZWR1Y2VyKGludm9rZU9yUmV0dXJuLCBpbml0aWFsU3RhdGUpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2luZGV4JykuUmVkdWNlcjxhbnksIGFueT59IHJlZHVjZXJcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2luZGV4JykuU3RhdGVVcGRhdGVyPGFueT59IGluaXRpYWxTdGF0ZVxuICogQHBhcmFtIHsoaW5pdGlhbFN0YXRlOiBhbnkpID0+IHZvaWR9IFtpbml0XVxuICogQHJldHVybnMge1sgYW55LCAoc3RhdGU6IGFueSkgPT4gdm9pZCBdfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsU3RhdGUsIGluaXQpIHtcblx0LyoqIEB0eXBlIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5SZWR1Y2VySG9va1N0YXRlfSAqL1xuXHRjb25zdCBob29rU3RhdGUgPSBnZXRIb29rU3RhdGUoY3VycmVudEluZGV4KyssIDIpO1xuXHRob29rU3RhdGUuX3JlZHVjZXIgPSByZWR1Y2VyO1xuXHRpZiAoIWhvb2tTdGF0ZS5fY29tcG9uZW50KSB7XG5cdFx0aG9va1N0YXRlLl92YWx1ZSA9IFtcblx0XHRcdCFpbml0ID8gaW52b2tlT3JSZXR1cm4odW5kZWZpbmVkLCBpbml0aWFsU3RhdGUpIDogaW5pdChpbml0aWFsU3RhdGUpLFxuXG5cdFx0XHRhY3Rpb24gPT4ge1xuXHRcdFx0XHRjb25zdCBjdXJyZW50VmFsdWUgPSBob29rU3RhdGUuX25leHRWYWx1ZVxuXHRcdFx0XHRcdD8gaG9va1N0YXRlLl9uZXh0VmFsdWVbMF1cblx0XHRcdFx0XHQ6IGhvb2tTdGF0ZS5fdmFsdWVbMF07XG5cdFx0XHRcdGNvbnN0IG5leHRWYWx1ZSA9IGhvb2tTdGF0ZS5fcmVkdWNlcihjdXJyZW50VmFsdWUsIGFjdGlvbik7XG5cblx0XHRcdFx0aWYgKGN1cnJlbnRWYWx1ZSAhPT0gbmV4dFZhbHVlKSB7XG5cdFx0XHRcdFx0aG9va1N0YXRlLl9uZXh0VmFsdWUgPSBbbmV4dFZhbHVlLCBob29rU3RhdGUuX3ZhbHVlWzFdXTtcblx0XHRcdFx0XHRob29rU3RhdGUuX2NvbXBvbmVudC5zZXRTdGF0ZSh7fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRdO1xuXG5cdFx0aG9va1N0YXRlLl9jb21wb25lbnQgPSBjdXJyZW50Q29tcG9uZW50O1xuXG5cdFx0aWYgKCFjdXJyZW50Q29tcG9uZW50Ll9oYXNTY3VGcm9tSG9va3MpIHtcblx0XHRcdGN1cnJlbnRDb21wb25lbnQuX2hhc1NjdUZyb21Ib29rcyA9IHRydWU7XG5cdFx0XHRsZXQgcHJldlNjdSA9IGN1cnJlbnRDb21wb25lbnQuc2hvdWxkQ29tcG9uZW50VXBkYXRlO1xuXHRcdFx0Y29uc3QgcHJldkNXVSA9IGN1cnJlbnRDb21wb25lbnQuY29tcG9uZW50V2lsbFVwZGF0ZTtcblxuXHRcdFx0Ly8gSWYgd2UncmUgZGVhbGluZyB3aXRoIGEgZm9yY2VkIHVwZGF0ZSBgc2hvdWxkQ29tcG9uZW50VXBkYXRlYCB3aWxsXG5cdFx0XHQvLyBub3QgYmUgY2FsbGVkLiBCdXQgd2UgdXNlIHRoYXQgdG8gdXBkYXRlIHRoZSBob29rIHZhbHVlcywgc28gd2Vcblx0XHRcdC8vIG5lZWQgdG8gY2FsbCBpdC5cblx0XHRcdGN1cnJlbnRDb21wb25lbnQuY29tcG9uZW50V2lsbFVwZGF0ZSA9IGZ1bmN0aW9uIChwLCBzLCBjKSB7XG5cdFx0XHRcdGlmICh0aGlzLl9mb3JjZSkge1xuXHRcdFx0XHRcdGxldCB0bXAgPSBwcmV2U2N1O1xuXHRcdFx0XHRcdC8vIENsZWFyIHRvIGF2b2lkIG90aGVyIHNDVSBob29rcyBmcm9tIGJlaW5nIGNhbGxlZFxuXHRcdFx0XHRcdHByZXZTY3UgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0dXBkYXRlSG9va1N0YXRlKHAsIHMsIGMpO1xuXHRcdFx0XHRcdHByZXZTY3UgPSB0bXA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAocHJldkNXVSkgcHJldkNXVS5jYWxsKHRoaXMsIHAsIHMsIGMpO1xuXHRcdFx0fTtcblxuXHRcdFx0Ly8gVGhpcyBTQ1UgaGFzIHRoZSBwdXJwb3NlIG9mIGJhaWxpbmcgb3V0IGFmdGVyIHJlcGVhdGVkIHVwZGF0ZXNcblx0XHRcdC8vIHRvIHN0YXRlZnVsIGhvb2tzLlxuXHRcdFx0Ly8gd2Ugc3RvcmUgdGhlIG5leHQgdmFsdWUgaW4gX25leHRWYWx1ZVswXSBhbmQga2VlcCBkb2luZyB0aGF0IGZvciBhbGxcblx0XHRcdC8vIHN0YXRlIHNldHRlcnMsIGlmIHdlIGhhdmUgbmV4dCBzdGF0ZXMgYW5kXG5cdFx0XHQvLyBhbGwgbmV4dCBzdGF0ZXMgd2l0aGluIGEgY29tcG9uZW50IGVuZCB1cCBiZWluZyBlcXVhbCB0byB0aGVpciBvcmlnaW5hbCBzdGF0ZVxuXHRcdFx0Ly8gd2UgYXJlIHNhZmUgdG8gYmFpbCBvdXQgZm9yIHRoaXMgc3BlY2lmaWMgY29tcG9uZW50LlxuXHRcdFx0LyoqXG5cdFx0XHQgKlxuXHRcdFx0ICogQHR5cGUge2ltcG9ydCgnLi9pbnRlcm5hbCcpLkNvbXBvbmVudFtcInNob3VsZENvbXBvbmVudFVwZGF0ZVwiXX1cblx0XHRcdCAqL1xuXHRcdFx0Ly8gQHRzLWlnbm9yZSAtIFdlIGRvbid0IHVzZSBUUyB0byBkb3dudHJhbnNwaWxlXG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8taW5uZXItZGVjbGFyYXRpb25zXG5cdFx0XHRmdW5jdGlvbiB1cGRhdGVIb29rU3RhdGUocCwgcywgYykge1xuXHRcdFx0XHRpZiAoIWhvb2tTdGF0ZS5fY29tcG9uZW50Ll9faG9va3MpIHJldHVybiB0cnVlO1xuXG5cdFx0XHRcdGNvbnN0IHN0YXRlSG9va3MgPSBob29rU3RhdGUuX2NvbXBvbmVudC5fX2hvb2tzLl9saXN0LmZpbHRlcihcblx0XHRcdFx0XHR4ID0+IHguX2NvbXBvbmVudFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRjb25zdCBhbGxIb29rc0VtcHR5ID0gc3RhdGVIb29rcy5ldmVyeSh4ID0+ICF4Ll9uZXh0VmFsdWUpO1xuXHRcdFx0XHQvLyBXaGVuIHdlIGhhdmUgbm8gdXBkYXRlZCBob29rcyBpbiB0aGUgY29tcG9uZW50IHdlIGludm9rZSB0aGUgcHJldmlvdXMgU0NVIG9yXG5cdFx0XHRcdC8vIHRyYXZlcnNlIHRoZSBWRE9NIHRyZWUgZnVydGhlci5cblx0XHRcdFx0aWYgKGFsbEhvb2tzRW1wdHkpIHtcblx0XHRcdFx0XHRyZXR1cm4gcHJldlNjdSA/IHByZXZTY3UuY2FsbCh0aGlzLCBwLCBzLCBjKSA6IHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBXZSBjaGVjayB3aGV0aGVyIHdlIGhhdmUgY29tcG9uZW50cyB3aXRoIGEgbmV4dFZhbHVlIHNldCB0aGF0XG5cdFx0XHRcdC8vIGhhdmUgdmFsdWVzIHRoYXQgYXJlbid0IGVxdWFsIHRvIG9uZSBhbm90aGVyIHRoaXMgcHVzaGVzXG5cdFx0XHRcdC8vIHVzIHRvIHVwZGF0ZSBmdXJ0aGVyIGRvd24gdGhlIHRyZWVcblx0XHRcdFx0bGV0IHNob3VsZFVwZGF0ZSA9IGZhbHNlO1xuXHRcdFx0XHRzdGF0ZUhvb2tzLmZvckVhY2goaG9va0l0ZW0gPT4ge1xuXHRcdFx0XHRcdGlmIChob29rSXRlbS5fbmV4dFZhbHVlKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBjdXJyZW50VmFsdWUgPSBob29rSXRlbS5fdmFsdWVbMF07XG5cdFx0XHRcdFx0XHRob29rSXRlbS5fdmFsdWUgPSBob29rSXRlbS5fbmV4dFZhbHVlO1xuXHRcdFx0XHRcdFx0aG9va0l0ZW0uX25leHRWYWx1ZSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdGlmIChjdXJyZW50VmFsdWUgIT09IGhvb2tJdGVtLl92YWx1ZVswXSkgc2hvdWxkVXBkYXRlID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHJldHVybiBzaG91bGRVcGRhdGUgfHwgaG9va1N0YXRlLl9jb21wb25lbnQucHJvcHMgIT09IHBcblx0XHRcdFx0XHQ/IHByZXZTY3Vcblx0XHRcdFx0XHRcdD8gcHJldlNjdS5jYWxsKHRoaXMsIHAsIHMsIGMpXG5cdFx0XHRcdFx0XHQ6IHRydWVcblx0XHRcdFx0XHQ6IGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRjdXJyZW50Q29tcG9uZW50LnNob3VsZENvbXBvbmVudFVwZGF0ZSA9IHVwZGF0ZUhvb2tTdGF0ZTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gaG9va1N0YXRlLl9uZXh0VmFsdWUgfHwgaG9va1N0YXRlLl92YWx1ZTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9pbnRlcm5hbCcpLkVmZmVjdH0gY2FsbGJhY2tcbiAqIEBwYXJhbSB7YW55W119IGFyZ3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUVmZmVjdChjYWxsYmFjaywgYXJncykge1xuXHQvKiogQHR5cGUge2ltcG9ydCgnLi9pbnRlcm5hbCcpLkVmZmVjdEhvb2tTdGF0ZX0gKi9cblx0Y29uc3Qgc3RhdGUgPSBnZXRIb29rU3RhdGUoY3VycmVudEluZGV4KyssIDMpO1xuXHRpZiAoIW9wdGlvbnMuX3NraXBFZmZlY3RzICYmIGFyZ3NDaGFuZ2VkKHN0YXRlLl9hcmdzLCBhcmdzKSkge1xuXHRcdHN0YXRlLl92YWx1ZSA9IGNhbGxiYWNrO1xuXHRcdHN0YXRlLl9wZW5kaW5nQXJncyA9IGFyZ3M7XG5cblx0XHRjdXJyZW50Q29tcG9uZW50Ll9faG9va3MuX3BlbmRpbmdFZmZlY3RzLnB1c2goc3RhdGUpO1xuXHR9XG59XG5cbi8qKlxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5FZmZlY3R9IGNhbGxiYWNrXG4gKiBAcGFyYW0ge2FueVtdfSBhcmdzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VMYXlvdXRFZmZlY3QoY2FsbGJhY2ssIGFyZ3MpIHtcblx0LyoqIEB0eXBlIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5FZmZlY3RIb29rU3RhdGV9ICovXG5cdGNvbnN0IHN0YXRlID0gZ2V0SG9va1N0YXRlKGN1cnJlbnRJbmRleCsrLCA0KTtcblx0aWYgKCFvcHRpb25zLl9za2lwRWZmZWN0cyAmJiBhcmdzQ2hhbmdlZChzdGF0ZS5fYXJncywgYXJncykpIHtcblx0XHRzdGF0ZS5fdmFsdWUgPSBjYWxsYmFjaztcblx0XHRzdGF0ZS5fcGVuZGluZ0FyZ3MgPSBhcmdzO1xuXG5cdFx0Y3VycmVudENvbXBvbmVudC5fcmVuZGVyQ2FsbGJhY2tzLnB1c2goc3RhdGUpO1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VSZWYoaW5pdGlhbFZhbHVlKSB7XG5cdGN1cnJlbnRIb29rID0gNTtcblx0cmV0dXJuIHVzZU1lbW8oKCkgPT4gKHsgY3VycmVudDogaW5pdGlhbFZhbHVlIH0pLCBbXSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IHJlZlxuICogQHBhcmFtIHsoKSA9PiBvYmplY3R9IGNyZWF0ZUhhbmRsZVxuICogQHBhcmFtIHthbnlbXX0gYXJnc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZUhhbmRsZSwgYXJncykge1xuXHRjdXJyZW50SG9vayA9IDY7XG5cdHVzZUxheW91dEVmZmVjdChcblx0XHQoKSA9PiB7XG5cdFx0XHRpZiAodHlwZW9mIHJlZiA9PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdHJlZihjcmVhdGVIYW5kbGUoKSk7XG5cdFx0XHRcdHJldHVybiAoKSA9PiByZWYobnVsbCk7XG5cdFx0XHR9IGVsc2UgaWYgKHJlZikge1xuXHRcdFx0XHRyZWYuY3VycmVudCA9IGNyZWF0ZUhhbmRsZSgpO1xuXHRcdFx0XHRyZXR1cm4gKCkgPT4gKHJlZi5jdXJyZW50ID0gbnVsbCk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRhcmdzID09IG51bGwgPyBhcmdzIDogYXJncy5jb25jYXQocmVmKVxuXHQpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7KCkgPT4gYW55fSBmYWN0b3J5XG4gKiBAcGFyYW0ge2FueVtdfSBhcmdzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VNZW1vKGZhY3RvcnksIGFyZ3MpIHtcblx0LyoqIEB0eXBlIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5NZW1vSG9va1N0YXRlfSAqL1xuXHRjb25zdCBzdGF0ZSA9IGdldEhvb2tTdGF0ZShjdXJyZW50SW5kZXgrKywgNyk7XG5cdGlmIChhcmdzQ2hhbmdlZChzdGF0ZS5fYXJncywgYXJncykpIHtcblx0XHRzdGF0ZS5fcGVuZGluZ1ZhbHVlID0gZmFjdG9yeSgpO1xuXHRcdHN0YXRlLl9wZW5kaW5nQXJncyA9IGFyZ3M7XG5cdFx0c3RhdGUuX2ZhY3RvcnkgPSBmYWN0b3J5O1xuXHRcdHJldHVybiBzdGF0ZS5fcGVuZGluZ1ZhbHVlO1xuXHR9XG5cblx0cmV0dXJuIHN0YXRlLl92YWx1ZTtcbn1cblxuLyoqXG4gKiBAcGFyYW0geygpID0+IHZvaWR9IGNhbGxiYWNrXG4gKiBAcGFyYW0ge2FueVtdfSBhcmdzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VDYWxsYmFjayhjYWxsYmFjaywgYXJncykge1xuXHRjdXJyZW50SG9vayA9IDg7XG5cdHJldHVybiB1c2VNZW1vKCgpID0+IGNhbGxiYWNrLCBhcmdzKTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9pbnRlcm5hbCcpLlByZWFjdENvbnRleHR9IGNvbnRleHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUNvbnRleHQoY29udGV4dCkge1xuXHRjb25zdCBwcm92aWRlciA9IGN1cnJlbnRDb21wb25lbnQuY29udGV4dFtjb250ZXh0Ll9pZF07XG5cdC8vIFdlIGNvdWxkIHNraXAgdGhpcyBjYWxsIGhlcmUsIGJ1dCB0aGFuIHdlJ2Qgbm90IGNhbGxcblx0Ly8gYG9wdGlvbnMuX2hvb2tgLiBXZSBuZWVkIHRvIGRvIHRoYXQgaW4gb3JkZXIgdG8gbWFrZVxuXHQvLyB0aGUgZGV2dG9vbHMgYXdhcmUgb2YgdGhpcyBob29rLlxuXHQvKiogQHR5cGUge2ltcG9ydCgnLi9pbnRlcm5hbCcpLkNvbnRleHRIb29rU3RhdGV9ICovXG5cdGNvbnN0IHN0YXRlID0gZ2V0SG9va1N0YXRlKGN1cnJlbnRJbmRleCsrLCA5KTtcblx0Ly8gVGhlIGRldnRvb2xzIG5lZWRzIGFjY2VzcyB0byB0aGUgY29udGV4dCBvYmplY3QgdG9cblx0Ly8gYmUgYWJsZSB0byBwdWxsIG9mIHRoZSBkZWZhdWx0IHZhbHVlIHdoZW4gbm8gcHJvdmlkZXJcblx0Ly8gaXMgcHJlc2VudCBpbiB0aGUgdHJlZS5cblx0c3RhdGUuX2NvbnRleHQgPSBjb250ZXh0O1xuXHRpZiAoIXByb3ZpZGVyKSByZXR1cm4gY29udGV4dC5fZGVmYXVsdFZhbHVlO1xuXHQvLyBUaGlzIGlzIHByb2JhYmx5IG5vdCBzYWZlIHRvIGNvbnZlcnQgdG8gXCIhXCJcblx0aWYgKHN0YXRlLl92YWx1ZSA9PSBudWxsKSB7XG5cdFx0c3RhdGUuX3ZhbHVlID0gdHJ1ZTtcblx0XHRwcm92aWRlci5zdWIoY3VycmVudENvbXBvbmVudCk7XG5cdH1cblx0cmV0dXJuIHByb3ZpZGVyLnByb3BzLnZhbHVlO1xufVxuXG4vKipcbiAqIERpc3BsYXkgYSBjdXN0b20gbGFiZWwgZm9yIGEgY3VzdG9tIGhvb2sgZm9yIHRoZSBkZXZ0b29scyBwYW5lbFxuICogQHR5cGUgezxUPih2YWx1ZTogVCwgY2I/OiAodmFsdWU6IFQpID0+IHN0cmluZyB8IG51bWJlcikgPT4gdm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZURlYnVnVmFsdWUodmFsdWUsIGZvcm1hdHRlcikge1xuXHRpZiAob3B0aW9ucy51c2VEZWJ1Z1ZhbHVlKSB7XG5cdFx0b3B0aW9ucy51c2VEZWJ1Z1ZhbHVlKGZvcm1hdHRlciA/IGZvcm1hdHRlcih2YWx1ZSkgOiB2YWx1ZSk7XG5cdH1cbn1cblxuLyoqXG4gKiBAcGFyYW0geyhlcnJvcjogYW55LCBlcnJvckluZm86IGltcG9ydCgncHJlYWN0JykuRXJyb3JJbmZvKSA9PiB2b2lkfSBjYlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRXJyb3JCb3VuZGFyeShjYikge1xuXHQvKiogQHR5cGUge2ltcG9ydCgnLi9pbnRlcm5hbCcpLkVycm9yQm91bmRhcnlIb29rU3RhdGV9ICovXG5cdGNvbnN0IHN0YXRlID0gZ2V0SG9va1N0YXRlKGN1cnJlbnRJbmRleCsrLCAxMCk7XG5cdGNvbnN0IGVyclN0YXRlID0gdXNlU3RhdGUoKTtcblx0c3RhdGUuX3ZhbHVlID0gY2I7XG5cdGlmICghY3VycmVudENvbXBvbmVudC5jb21wb25lbnREaWRDYXRjaCkge1xuXHRcdGN1cnJlbnRDb21wb25lbnQuY29tcG9uZW50RGlkQ2F0Y2ggPSAoZXJyLCBlcnJvckluZm8pID0+IHtcblx0XHRcdGlmIChzdGF0ZS5fdmFsdWUpIHN0YXRlLl92YWx1ZShlcnIsIGVycm9ySW5mbyk7XG5cdFx0XHRlcnJTdGF0ZVsxXShlcnIpO1xuXHRcdH07XG5cdH1cblx0cmV0dXJuIFtcblx0XHRlcnJTdGF0ZVswXSxcblx0XHQoKSA9PiB7XG5cdFx0XHRlcnJTdGF0ZVsxXSh1bmRlZmluZWQpO1xuXHRcdH1cblx0XTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUlkKCkge1xuXHRjb25zdCBzdGF0ZSA9IGdldEhvb2tTdGF0ZShjdXJyZW50SW5kZXgrKywgMTEpO1xuXHRpZiAoIXN0YXRlLl92YWx1ZSkge1xuXHRcdC8vIEdyYWIgZWl0aGVyIHRoZSByb290IG5vZGUgb3IgdGhlIG5lYXJlc3QgYXN5bmMgYm91bmRhcnkgbm9kZS5cblx0XHQvKiogQHR5cGUge2ltcG9ydCgnLi9pbnRlcm5hbC5kJykuVk5vZGV9ICovXG5cdFx0bGV0IHJvb3QgPSBjdXJyZW50Q29tcG9uZW50Ll92bm9kZTtcblx0XHR3aGlsZSAocm9vdCAhPT0gbnVsbCAmJiAhcm9vdC5fbWFzayAmJiByb290Ll9wYXJlbnQgIT09IG51bGwpIHtcblx0XHRcdHJvb3QgPSByb290Ll9wYXJlbnQ7XG5cdFx0fVxuXG5cdFx0bGV0IG1hc2sgPSByb290Ll9tYXNrIHx8IChyb290Ll9tYXNrID0gWzAsIDBdKTtcblx0XHRzdGF0ZS5fdmFsdWUgPSAnUCcgKyBtYXNrWzBdICsgJy0nICsgbWFza1sxXSsrO1xuXHR9XG5cblx0cmV0dXJuIHN0YXRlLl92YWx1ZTtcbn1cbi8qKlxuICogQWZ0ZXIgcGFpbnQgZWZmZWN0cyBjb25zdW1lci5cbiAqL1xuZnVuY3Rpb24gZmx1c2hBZnRlclBhaW50RWZmZWN0cygpIHtcblx0bGV0IGNvbXBvbmVudDtcblx0d2hpbGUgKChjb21wb25lbnQgPSBhZnRlclBhaW50RWZmZWN0cy5zaGlmdCgpKSkge1xuXHRcdGlmICghY29tcG9uZW50Ll9wYXJlbnREb20gfHwgIWNvbXBvbmVudC5fX2hvb2tzKSBjb250aW51ZTtcblx0XHR0cnkge1xuXHRcdFx0Y29tcG9uZW50Ll9faG9va3MuX3BlbmRpbmdFZmZlY3RzLmZvckVhY2goaW52b2tlQ2xlYW51cCk7XG5cdFx0XHRjb21wb25lbnQuX19ob29rcy5fcGVuZGluZ0VmZmVjdHMuZm9yRWFjaChpbnZva2VFZmZlY3QpO1xuXHRcdFx0Y29tcG9uZW50Ll9faG9va3MuX3BlbmRpbmdFZmZlY3RzID0gW107XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0Y29tcG9uZW50Ll9faG9va3MuX3BlbmRpbmdFZmZlY3RzID0gW107XG5cdFx0XHRvcHRpb25zLl9jYXRjaEVycm9yKGUsIGNvbXBvbmVudC5fdm5vZGUpO1xuXHRcdH1cblx0fVxufVxuXG5sZXQgSEFTX1JBRiA9IHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT0gJ2Z1bmN0aW9uJztcblxuLyoqXG4gKiBTY2hlZHVsZSBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgYWZ0ZXIgdGhlIGJyb3dzZXIgaGFzIGEgY2hhbmNlIHRvIHBhaW50IGEgbmV3IGZyYW1lLlxuICogRG8gdGhpcyBieSBjb21iaW5pbmcgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIChyQUYpICsgc2V0VGltZW91dCB0byBpbnZva2UgYSBjYWxsYmFjayBhZnRlclxuICogdGhlIG5leHQgYnJvd3NlciBmcmFtZS5cbiAqXG4gKiBBbHNvLCBzY2hlZHVsZSBhIHRpbWVvdXQgaW4gcGFyYWxsZWwgdG8gdGhlIHRoZSByQUYgdG8gZW5zdXJlIHRoZSBjYWxsYmFjayBpcyBpbnZva2VkXG4gKiBldmVuIGlmIFJBRiBkb2Vzbid0IGZpcmUgKGZvciBleGFtcGxlIGlmIHRoZSBicm93c2VyIHRhYiBpcyBub3QgdmlzaWJsZSlcbiAqXG4gKiBAcGFyYW0geygpID0+IHZvaWR9IGNhbGxiYWNrXG4gKi9cbmZ1bmN0aW9uIGFmdGVyTmV4dEZyYW1lKGNhbGxiYWNrKSB7XG5cdGNvbnN0IGRvbmUgPSAoKSA9PiB7XG5cdFx0Y2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuXHRcdGlmIChIQVNfUkFGKSBjYW5jZWxBbmltYXRpb25GcmFtZShyYWYpO1xuXHRcdHNldFRpbWVvdXQoY2FsbGJhY2spO1xuXHR9O1xuXHRjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dChkb25lLCBSQUZfVElNRU9VVCk7XG5cblx0bGV0IHJhZjtcblx0aWYgKEhBU19SQUYpIHtcblx0XHRyYWYgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZG9uZSk7XG5cdH1cbn1cblxuLy8gTm90ZTogaWYgc29tZW9uZSB1c2VkIG9wdGlvbnMuZGVib3VuY2VSZW5kZXJpbmcgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUsXG4vLyB0aGVuIGVmZmVjdHMgd2lsbCBBTFdBWVMgcnVuIG9uIHRoZSBORVhUIGZyYW1lIGluc3RlYWQgb2YgdGhlIGN1cnJlbnQgb25lLCBpbmN1cnJpbmcgYSB+MTZtcyBkZWxheS5cbi8vIFBlcmhhcHMgdGhpcyBpcyBub3Qgc3VjaCBhIGJpZyBkZWFsLlxuLyoqXG4gKiBTY2hlZHVsZSBhZnRlclBhaW50RWZmZWN0cyBmbHVzaCBhZnRlciB0aGUgYnJvd3NlciBwYWludHNcbiAqIEBwYXJhbSB7bnVtYmVyfSBuZXdRdWV1ZUxlbmd0aFxuICovXG5mdW5jdGlvbiBhZnRlclBhaW50KG5ld1F1ZXVlTGVuZ3RoKSB7XG5cdGlmIChuZXdRdWV1ZUxlbmd0aCA9PT0gMSB8fCBwcmV2UmFmICE9PSBvcHRpb25zLnJlcXVlc3RBbmltYXRpb25GcmFtZSkge1xuXHRcdHByZXZSYWYgPSBvcHRpb25zLnJlcXVlc3RBbmltYXRpb25GcmFtZTtcblx0XHQocHJldlJhZiB8fCBhZnRlck5leHRGcmFtZSkoZmx1c2hBZnRlclBhaW50RWZmZWN0cyk7XG5cdH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9pbnRlcm5hbCcpLkVmZmVjdEhvb2tTdGF0ZX0gaG9va1xuICovXG5mdW5jdGlvbiBpbnZva2VDbGVhbnVwKGhvb2spIHtcblx0Ly8gQSBob29rIGNsZWFudXAgY2FuIGludHJvZHVjZSBhIGNhbGwgdG8gcmVuZGVyIHdoaWNoIGNyZWF0ZXMgYSBuZXcgcm9vdCwgdGhpcyB3aWxsIGNhbGwgb3B0aW9ucy52bm9kZVxuXHQvLyBhbmQgbW92ZSB0aGUgY3VycmVudENvbXBvbmVudCBhd2F5LlxuXHRjb25zdCBjb21wID0gY3VycmVudENvbXBvbmVudDtcblx0bGV0IGNsZWFudXAgPSBob29rLl9jbGVhbnVwO1xuXHRpZiAodHlwZW9mIGNsZWFudXAgPT0gJ2Z1bmN0aW9uJykge1xuXHRcdGhvb2suX2NsZWFudXAgPSB1bmRlZmluZWQ7XG5cdFx0Y2xlYW51cCgpO1xuXHR9XG5cblx0Y3VycmVudENvbXBvbmVudCA9IGNvbXA7XG59XG5cbi8qKlxuICogSW52b2tlIGEgSG9vaydzIGVmZmVjdFxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5FZmZlY3RIb29rU3RhdGV9IGhvb2tcbiAqL1xuZnVuY3Rpb24gaW52b2tlRWZmZWN0KGhvb2spIHtcblx0Ly8gQSBob29rIGNhbGwgY2FuIGludHJvZHVjZSBhIGNhbGwgdG8gcmVuZGVyIHdoaWNoIGNyZWF0ZXMgYSBuZXcgcm9vdCwgdGhpcyB3aWxsIGNhbGwgb3B0aW9ucy52bm9kZVxuXHQvLyBhbmQgbW92ZSB0aGUgY3VycmVudENvbXBvbmVudCBhd2F5LlxuXHRjb25zdCBjb21wID0gY3VycmVudENvbXBvbmVudDtcblx0aG9vay5fY2xlYW51cCA9IGhvb2suX3ZhbHVlKCk7XG5cdGN1cnJlbnRDb21wb25lbnQgPSBjb21wO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7YW55W119IG9sZEFyZ3NcbiAqIEBwYXJhbSB7YW55W119IG5ld0FyZ3NcbiAqL1xuZnVuY3Rpb24gYXJnc0NoYW5nZWQob2xkQXJncywgbmV3QXJncykge1xuXHRyZXR1cm4gKFxuXHRcdCFvbGRBcmdzIHx8XG5cdFx0b2xkQXJncy5sZW5ndGggIT09IG5ld0FyZ3MubGVuZ3RoIHx8XG5cdFx0bmV3QXJncy5zb21lKChhcmcsIGluZGV4KSA9PiBhcmcgIT09IG9sZEFyZ3NbaW5kZXhdKVxuXHQpO1xufVxuXG5mdW5jdGlvbiBpbnZva2VPclJldHVybihhcmcsIGYpIHtcblx0cmV0dXJuIHR5cGVvZiBmID09ICdmdW5jdGlvbicgPyBmKGFyZykgOiBmO1xufVxuIiwgImNvbnN0IEVOQ09ERURfRU5USVRJRVMgPSAvW1wiJjxdLztcblxuLyoqIEBwYXJhbSB7c3RyaW5nfSBzdHIgKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVFbnRpdGllcyhzdHIpIHtcblx0Ly8gU2tpcCBhbGwgd29yayBmb3Igc3RyaW5ncyB3aXRoIG5vIGVudGl0aWVzIG5lZWRpbmcgZW5jb2Rpbmc6XG5cdGlmIChzdHIubGVuZ3RoID09PSAwIHx8IEVOQ09ERURfRU5USVRJRVMudGVzdChzdHIpID09PSBmYWxzZSkgcmV0dXJuIHN0cjtcblxuXHRsZXQgbGFzdCA9IDAsXG5cdFx0aSA9IDAsXG5cdFx0b3V0ID0gJycsXG5cdFx0Y2ggPSAnJztcblxuXHQvLyBTZWVrIGZvcndhcmQgaW4gc3RyIHVudGlsIHRoZSBuZXh0IGVudGl0eSBjaGFyOlxuXHRmb3IgKDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuXHRcdHN3aXRjaCAoc3RyLmNoYXJDb2RlQXQoaSkpIHtcblx0XHRcdGNhc2UgMzQ6XG5cdFx0XHRcdGNoID0gJyZxdW90Oyc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAzODpcblx0XHRcdFx0Y2ggPSAnJmFtcDsnO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgNjA6XG5cdFx0XHRcdGNoID0gJyZsdDsnO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblx0XHQvLyBBcHBlbmQgc2tpcHBlZC9idWZmZXJlZCBjaGFyYWN0ZXJzIGFuZCB0aGUgZW5jb2RlZCBlbnRpdHk6XG5cdFx0aWYgKGkgIT09IGxhc3QpIG91dCArPSBzdHIuc2xpY2UobGFzdCwgaSk7XG5cdFx0b3V0ICs9IGNoO1xuXHRcdC8vIFN0YXJ0IHRoZSBuZXh0IHNlZWsvYnVmZmVyIGFmdGVyIHRoZSBlbnRpdHkncyBvZmZzZXQ6XG5cdFx0bGFzdCA9IGkgKyAxO1xuXHR9XG5cdGlmIChpICE9PSBsYXN0KSBvdXQgKz0gc3RyLnNsaWNlKGxhc3QsIGkpO1xuXHRyZXR1cm4gb3V0O1xufVxuIiwgIi8qKiBOb3JtYWwgaHlkcmF0aW9uIHRoYXQgYXR0YWNoZXMgdG8gYSBET00gdHJlZSBidXQgZG9lcyBub3QgZGlmZiBpdC4gKi9cbmV4cG9ydCBjb25zdCBNT0RFX0hZRFJBVEUgPSAxIDw8IDU7XG4vKiogU2lnbmlmaWVzIHRoaXMgVk5vZGUgc3VzcGVuZGVkIG9uIHRoZSBwcmV2aW91cyByZW5kZXIgKi9cbmV4cG9ydCBjb25zdCBNT0RFX1NVU1BFTkRFRCA9IDEgPDwgNztcbi8qKiBJbmRpY2F0ZXMgdGhhdCB0aGlzIG5vZGUgbmVlZHMgdG8gYmUgaW5zZXJ0ZWQgd2hpbGUgcGF0Y2hpbmcgY2hpbGRyZW4gKi9cbmV4cG9ydCBjb25zdCBJTlNFUlRfVk5PREUgPSAxIDw8IDE2O1xuLyoqIEluZGljYXRlcyBhIFZOb2RlIGhhcyBiZWVuIG1hdGNoZWQgd2l0aCBhbm90aGVyIFZOb2RlIGluIHRoZSBkaWZmICovXG5leHBvcnQgY29uc3QgTUFUQ0hFRCA9IDEgPDwgMTc7XG5cbi8qKiBSZXNldCBhbGwgbW9kZSBmbGFncyAqL1xuZXhwb3J0IGNvbnN0IFJFU0VUX01PREUgPSB+KE1PREVfSFlEUkFURSB8IE1PREVfU1VTUEVOREVEKTtcblxuZXhwb3J0IGNvbnN0IEVNUFRZX09CSiA9IC8qKiBAdHlwZSB7YW55fSAqLyAoe30pO1xuZXhwb3J0IGNvbnN0IEVNUFRZX0FSUiA9IFtdO1xuZXhwb3J0IGNvbnN0IElTX05PTl9ESU1FTlNJT05BTCA9XG5cdC9hY2l0fGV4KD86c3xnfG58cHwkKXxycGh8Z3JpZHxvd3N8bW5jfG50d3xpbmVbY2hdfHpvb3xeb3JkfGl0ZXJhL2k7XG4iLCAiaW1wb3J0IHsgb3B0aW9ucywgRnJhZ21lbnQgfSBmcm9tICdwcmVhY3QnO1xuaW1wb3J0IHsgZW5jb2RlRW50aXRpZXMgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IElTX05PTl9ESU1FTlNJT05BTCB9IGZyb20gJy4uLy4uL3NyYy9jb25zdGFudHMnO1xuXG5sZXQgdm5vZGVJZCA9IDA7XG5cbmNvbnN0IGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG4vKipcbiAqIEBmaWxlb3ZlcnZpZXdcbiAqIFRoaXMgZmlsZSBleHBvcnRzIHZhcmlvdXMgbWV0aG9kcyB0aGF0IGltcGxlbWVudCBCYWJlbCdzIFwiYXV0b21hdGljXCIgSlNYIHJ1bnRpbWUgQVBJOlxuICogLSBqc3godHlwZSwgcHJvcHMsIGtleSlcbiAqIC0ganN4cyh0eXBlLCBwcm9wcywga2V5KVxuICogLSBqc3hERVYodHlwZSwgcHJvcHMsIGtleSwgX19zb3VyY2UsIF9fc2VsZilcbiAqXG4gKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgY3JlYXRlVk5vZGUgaGVyZSBpcyBvcHRpbWl6ZWQgZm9yIHBlcmZvcm1hbmNlLlxuICogQmVuY2htYXJrczogaHR0cHM6Ly9lc2JlbmNoLmNvbS9iZW5jaC81ZjZiNTRhMGI0NjMyMTAwYTdkY2QyYjNcbiAqL1xuXG4vKipcbiAqIEpTWC5FbGVtZW50IGZhY3RvcnkgdXNlZCBieSBCYWJlbCdzIHtydW50aW1lOlwiYXV0b21hdGljXCJ9IEpTWCB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7Vk5vZGVbJ3R5cGUnXX0gdHlwZVxuICogQHBhcmFtIHtWTm9kZVsncHJvcHMnXX0gcHJvcHNcbiAqIEBwYXJhbSB7Vk5vZGVbJ2tleSddfSBba2V5XVxuICogQHBhcmFtIHt1bmtub3dufSBbaXNTdGF0aWNDaGlsZHJlbl1cbiAqIEBwYXJhbSB7dW5rbm93bn0gW19fc291cmNlXVxuICogQHBhcmFtIHt1bmtub3dufSBbX19zZWxmXVxuICovXG5mdW5jdGlvbiBjcmVhdGVWTm9kZSh0eXBlLCBwcm9wcywga2V5LCBpc1N0YXRpY0NoaWxkcmVuLCBfX3NvdXJjZSwgX19zZWxmKSB7XG5cdC8vIFdlJ2xsIHdhbnQgdG8gcHJlc2VydmUgYHJlZmAgaW4gcHJvcHMgdG8gZ2V0IHJpZCBvZiB0aGUgbmVlZCBmb3Jcblx0Ly8gZm9yd2FyZFJlZiBjb21wb25lbnRzIGluIHRoZSBmdXR1cmUsIGJ1dCB0aGF0IHNob3VsZCBoYXBwZW4gdmlhXG5cdC8vIGEgc2VwYXJhdGUgUFIuXG5cdGxldCBub3JtYWxpemVkUHJvcHMgPSB7fSxcblx0XHRyZWYsXG5cdFx0aTtcblx0Zm9yIChpIGluIHByb3BzKSB7XG5cdFx0aWYgKGkgPT0gJ3JlZicpIHtcblx0XHRcdHJlZiA9IHByb3BzW2ldO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRub3JtYWxpemVkUHJvcHNbaV0gPSBwcm9wc1tpXTtcblx0XHR9XG5cdH1cblxuXHQvKiogQHR5cGUge1ZOb2RlICYgeyBfX3NvdXJjZTogYW55OyBfX3NlbGY6IGFueSB9fSAqL1xuXHRjb25zdCB2bm9kZSA9IHtcblx0XHR0eXBlLFxuXHRcdHByb3BzOiBub3JtYWxpemVkUHJvcHMsXG5cdFx0a2V5LFxuXHRcdHJlZixcblx0XHRfY2hpbGRyZW46IG51bGwsXG5cdFx0X3BhcmVudDogbnVsbCxcblx0XHRfZGVwdGg6IDAsXG5cdFx0X2RvbTogbnVsbCxcblx0XHRfbmV4dERvbTogdW5kZWZpbmVkLFxuXHRcdF9jb21wb25lbnQ6IG51bGwsXG5cdFx0Y29uc3RydWN0b3I6IHVuZGVmaW5lZCxcblx0XHRfb3JpZ2luYWw6IC0tdm5vZGVJZCxcblx0XHRfaW5kZXg6IC0xLFxuXHRcdF9mbGFnczogMCxcblx0XHRfX3NvdXJjZSxcblx0XHRfX3NlbGZcblx0fTtcblxuXHQvLyBJZiBhIENvbXBvbmVudCBWTm9kZSwgY2hlY2sgZm9yIGFuZCBhcHBseSBkZWZhdWx0UHJvcHMuXG5cdC8vIE5vdGU6IGB0eXBlYCBpcyBvZnRlbiBhIFN0cmluZywgYW5kIGNhbiBiZSBgdW5kZWZpbmVkYCBpbiBkZXZlbG9wbWVudC5cblx0aWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nICYmIChyZWYgPSB0eXBlLmRlZmF1bHRQcm9wcykpIHtcblx0XHRmb3IgKGkgaW4gcmVmKVxuXHRcdFx0aWYgKHR5cGVvZiBub3JtYWxpemVkUHJvcHNbaV0gPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRcdG5vcm1hbGl6ZWRQcm9wc1tpXSA9IHJlZltpXTtcblx0XHRcdH1cblx0fVxuXG5cdGlmIChvcHRpb25zLnZub2RlKSBvcHRpb25zLnZub2RlKHZub2RlKTtcblx0cmV0dXJuIHZub2RlO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIHRlbXBsYXRlIHZub2RlLiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBleHBlY3RlZCB0byBiZVxuICogdXNlZCBkaXJlY3RseSwgYnV0IHJhdGhlciB0aHJvdWdoIGEgcHJlY29tcGlsZSBKU1ggdHJhbnNmb3JtXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSB0ZW1wbGF0ZXNcbiAqIEBwYXJhbSAge0FycmF5PHN0cmluZyB8IG51bGwgfCBWTm9kZT59IGV4cHJzXG4gKiBAcmV0dXJucyB7Vk5vZGV9XG4gKi9cbmZ1bmN0aW9uIGpzeFRlbXBsYXRlKHRlbXBsYXRlcywgLi4uZXhwcnMpIHtcblx0Y29uc3Qgdm5vZGUgPSBjcmVhdGVWTm9kZShGcmFnbWVudCwgeyB0cGw6IHRlbXBsYXRlcywgZXhwcnMgfSk7XG5cdC8vIEJ5cGFzcyByZW5kZXIgdG8gc3RyaW5nIHRvcCBsZXZlbCBGcmFnbWVudCBvcHRpbWl6YXRpb25cblx0dm5vZGUua2V5ID0gdm5vZGUuX3Zub2RlO1xuXHRyZXR1cm4gdm5vZGU7XG59XG5cbmNvbnN0IEpTX1RPX0NTUyA9IHt9O1xuY29uc3QgQ1NTX1JFR0VYID0gL1tBLVpdL2c7XG5cbi8qKlxuICogU2VyaWFsaXplIGFuIEhUTUwgYXR0cmlidXRlIHRvIGEgc3RyaW5nLiBUaGlzIGZ1bmN0aW9uIGlzIG5vdFxuICogZXhwZWN0ZWQgdG8gYmUgdXNlZCBkaXJlY3RseSwgYnV0IHJhdGhlciB0aHJvdWdoIGEgcHJlY29tcGlsZVxuICogSlNYIHRyYW5zZm9ybVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIGF0dHJpYnV0ZSBuYW1lXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSBhdHRyaWJ1dGUgdmFsdWVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGpzeEF0dHIobmFtZSwgdmFsdWUpIHtcblx0aWYgKG9wdGlvbnMuYXR0cikge1xuXHRcdGNvbnN0IHJlc3VsdCA9IG9wdGlvbnMuYXR0cihuYW1lLCB2YWx1ZSk7XG5cdFx0aWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnKSByZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0aWYgKG5hbWUgPT09ICdyZWYnIHx8IG5hbWUgPT09ICdrZXknKSByZXR1cm4gJyc7XG5cdGlmIChuYW1lID09PSAnc3R5bGUnICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcblx0XHRsZXQgc3RyID0gJyc7XG5cdFx0Zm9yIChsZXQgcHJvcCBpbiB2YWx1ZSkge1xuXHRcdFx0bGV0IHZhbCA9IHZhbHVlW3Byb3BdO1xuXHRcdFx0aWYgKHZhbCAhPSBudWxsICYmIHZhbCAhPT0gJycpIHtcblx0XHRcdFx0Y29uc3QgbmFtZSA9XG5cdFx0XHRcdFx0cHJvcFswXSA9PSAnLSdcblx0XHRcdFx0XHRcdD8gcHJvcFxuXHRcdFx0XHRcdFx0OiBKU19UT19DU1NbcHJvcF0gfHxcblx0XHRcdFx0XHRcdCAgKEpTX1RPX0NTU1twcm9wXSA9IHByb3AucmVwbGFjZShDU1NfUkVHRVgsICctJCYnKS50b0xvd2VyQ2FzZSgpKTtcblxuXHRcdFx0XHRsZXQgc3VmZml4ID0gJzsnO1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0dHlwZW9mIHZhbCA9PT0gJ251bWJlcicgJiZcblx0XHRcdFx0XHQvLyBFeGNsdWRlIGN1c3RvbS1hdHRyaWJ1dGVzXG5cdFx0XHRcdFx0IW5hbWUuc3RhcnRzV2l0aCgnLS0nKSAmJlxuXHRcdFx0XHRcdCFJU19OT05fRElNRU5TSU9OQUwudGVzdChuYW1lKVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRzdWZmaXggPSAncHg7Jztcblx0XHRcdFx0fVxuXHRcdFx0XHRzdHIgPSBzdHIgKyBuYW1lICsgJzonICsgdmFsICsgc3VmZml4O1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gbmFtZSArICc9XCInICsgc3RyICsgJ1wiJztcblx0fVxuXG5cdGlmIChcblx0XHR2YWx1ZSA9PSBudWxsIHx8XG5cdFx0dmFsdWUgPT09IGZhbHNlIHx8XG5cdFx0dHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nIHx8XG5cdFx0dHlwZW9mIHZhbHVlID09PSAnb2JqZWN0J1xuXHQpIHtcblx0XHRyZXR1cm4gJyc7XG5cdH0gZWxzZSBpZiAodmFsdWUgPT09IHRydWUpIHJldHVybiBuYW1lO1xuXG5cdHJldHVybiBuYW1lICsgJz1cIicgKyBlbmNvZGVFbnRpdGllcyh2YWx1ZSkgKyAnXCInO1xufVxuXG4vKipcbiAqIEVzY2FwZSBhIGR5bmFtaWMgY2hpbGQgcGFzc2VkIHRvIGBqc3hUZW1wbGF0ZWAuIFRoaXMgZnVuY3Rpb25cbiAqIGlzIG5vdCBleHBlY3RlZCB0byBiZSB1c2VkIGRpcmVjdGx5LCBidXQgcmF0aGVyIHRocm91Z2ggYVxuICogcHJlY29tcGlsZSBKU1ggdHJhbnNmb3JtXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbCB8IFZOb2RlIHwgQXJyYXk8c3RyaW5nIHwgbnVsbCB8IFZOb2RlPn1cbiAqL1xuZnVuY3Rpb24ganN4RXNjYXBlKHZhbHVlKSB7XG5cdGlmIChcblx0XHR2YWx1ZSA9PSBudWxsIHx8XG5cdFx0dHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgfHxcblx0XHR0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbidcblx0KSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHRpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuXHRcdC8vIENoZWNrIGZvciBWTm9kZVxuXHRcdGlmICh2YWx1ZS5jb25zdHJ1Y3RvciA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdmFsdWU7XG5cblx0XHRpZiAoaXNBcnJheSh2YWx1ZSkpIHtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0dmFsdWVbaV0gPSBqc3hFc2NhcGUodmFsdWVbaV0pO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBlbmNvZGVFbnRpdGllcygnJyArIHZhbHVlKTtcbn1cblxuZXhwb3J0IHtcblx0Y3JlYXRlVk5vZGUgYXMganN4LFxuXHRjcmVhdGVWTm9kZSBhcyBqc3hzLFxuXHRjcmVhdGVWTm9kZSBhcyBqc3hERVYsXG5cdEZyYWdtZW50LFxuXHQvLyBwcmVjb21waWxlZCBKU1ggdHJhbnNmb3JtXG5cdGpzeFRlbXBsYXRlLFxuXHRqc3hBdHRyLFxuXHRqc3hFc2NhcGVcbn07XG4iLCAiaW1wb3J0IHtGaXJlYmFzZUFwcCwgaW5pdGlhbGl6ZUFwcH0gZnJvbSAnZmlyZWJhc2UvYXBwJztcbmltcG9ydCB7R29vZ2xlQXV0aFByb3ZpZGVyLCBzaWduSW5XaXRoUG9wdXB9IGZyb20gJ2ZpcmViYXNlL2F1dGgnO1xuaW1wb3J0IHtBdXRoLCBnZXRBdXRofSBmcm9tICdmaXJlYmFzZS9hdXRoJztcbmltcG9ydCB7cmVuZGVyfSBmcm9tICdwcmVhY3QnO1xuaW1wb3J0IHt1c2VTdGF0ZX0gZnJvbSAncHJlYWN0L2hvb2tzJztcbmltcG9ydCAnLi9zdHlsZXMvZ2xvYmFsLmNzcyc7XG5pbXBvcnQgJy4vc3R5bGVzL3NpZ25pbi5jc3MnO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBXaW5kb3cge1xuICAgIF9fUk9PVF9DVFg6IHtcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIGZpcmViYXNlQ29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIH07XG4gICAgZmlyZWJhc2U6IHtcbiAgICAgIGFwcDogRmlyZWJhc2VBcHA7XG4gICAgICBhdXRoOiBBdXRoO1xuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gU2lnbkluKCkge1xuICBjb25zdCBbZXJyb3JNc2csIHNldEVycm9yTXNnXSA9IHVzZVN0YXRlKCcnKTtcbiAgY29uc3QgdGl0bGUgPSB3aW5kb3cuX19ST09UX0NUWC5uYW1lO1xuXG4gIGZ1bmN0aW9uIG9uRXJyb3IobXNnOiBzdHJpbmcpIHtcbiAgICBzZXRFcnJvck1zZyhtc2cpO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cInNpZ25pblwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJzaWduaW5fX2hlYWRsaW5lXCI+XG4gICAgICAgIHt0aXRsZSAmJiA8aDEgY2xhc3NOYW1lPVwic2lnbmluX19oZWFkbGluZV9fdGl0bGVcIj57dGl0bGV9PC9oMT59XG4gICAgICAgIDxwIGNsYXNzTmFtZT1cInNpZ25pbl9faGVhZGxpbmVfX2JvZHlcIj5cbiAgICAgICAgICB7dGl0bGUgPyBgU2lnbiBpbiB0byBjb250aW51ZSB0byAke3RpdGxlfWAgOiAnU2lnbiBpbiB0byBjb250aW51ZSd9XG4gICAgICAgIDwvcD5cbiAgICAgIDwvZGl2PlxuICAgICAgPFNpZ25Jbi5CdXR0b24gb25FcnJvcj17b25FcnJvcn0gLz5cbiAgICAgIHtlcnJvck1zZyAmJiA8cCBjbGFzc05hbWU9XCJzaWduaW5fX2Vycm9yXCI+e2Vycm9yTXNnfTwvcD59XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbmludGVyZmFjZSBCdXR0b25Qcm9wcyB7XG4gIG9uRXJyb3I6IChtc2c6IHN0cmluZykgPT4gdm9pZDtcbn1cblxuU2lnbkluLkJ1dHRvbiA9IChwcm9wczogQnV0dG9uUHJvcHMpID0+IHtcbiAgYXN5bmMgZnVuY3Rpb24gc2lnbkluKCkge1xuICAgIGNvbnN0IHByb3ZpZGVyID0gbmV3IEdvb2dsZUF1dGhQcm92aWRlcigpO1xuICAgIHByb3ZpZGVyLmFkZFNjb3BlKCdwcm9maWxlJyk7XG4gICAgcHJvdmlkZXIuYWRkU2NvcGUoJ2VtYWlsJyk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2lnbkluV2l0aFBvcHVwKHdpbmRvdy5maXJlYmFzZS5hdXRoLCBwcm92aWRlcik7XG4gICAgY29uc3QgdXNlciA9IHJlc3VsdC51c2VyO1xuICAgIGNvbnN0IGlkVG9rZW4gPSBhd2FpdCB1c2VyLmdldElkVG9rZW4oKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2Ntcy9sb2dpbicsIHtcbiAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe2lkVG9rZW59KSxcbiAgICB9KTtcbiAgICBpZiAocmVzLnN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICBjb25zdCBlbWFpbCA9IHVzZXI/LmVtYWlsIHx8ICcobm8gZW1haWwpJztcbiAgICAgIHByb3BzLm9uRXJyb3IoXG4gICAgICAgIGAke2VtYWlsfSBpcyBub3QgYXV0aG9yaXplZCB0byB2aWV3IHRoaXMgcGFnZS4gSWYgeW91IGJlbGlldmUgdGhpcyBpcyBhIG1pc3Rha2UsIHBsZWFzZSBjb250YWN0IGEgZGV2ZWxvcGVyIHRvIGhlbHAgcmVzb2x2ZSB0aGUgaXNzdWUuYFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkge1xuICAgICAgcHJvcHMub25FcnJvcignQW4gdW5rbm93biBlcnJvciBoYXMgb2NjdXJyZWQuJyk7XG4gICAgICBjb25zb2xlLmVycm9yKCdsb2dpbiBmYWlsZWQnKTtcbiAgICAgIGNvbnNvbGUubG9nKHJlcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgIGlmICghZGF0YS5zdWNjZXNzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdsb2dpbiBmYWlsZWQnKTtcbiAgICAgIGNvbnNvbGUubG9nKHJlcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxvZ2luU3VjY2Vzc1JlZGlyZWN0KCk7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxidXR0b24gY2xhc3NOYW1lPVwic2lnbmluX19idXR0b25cIiBvbkNsaWNrPXtzaWduSW59PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJzaWduaW5fX2J1dHRvbl9faWNvblwiPlxuICAgICAgICA8U2lnbkluLkdMb2dvIC8+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwic2lnbmluX19idXR0b25fX2xhYmVsXCI+U2lnbiBpbiB3aXRoIEdvb2dsZTwvZGl2PlxuICAgIDwvYnV0dG9uPlxuICApO1xufTtcblxuU2lnbkluLkdMb2dvID0gKCkgPT4gKFxuICA8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCA0OCA0OFwiPlxuICAgIDxnPlxuICAgICAgPHBhdGhcbiAgICAgICAgZmlsbD1cIiNFQTQzMzVcIlxuICAgICAgICBkPVwiTTI0IDkuNWMzLjU0IDAgNi43MSAxLjIyIDkuMjEgMy42bDYuODUtNi44NUMzNS45IDIuMzggMzAuNDcgMCAyNCAwIDE0LjYyIDAgNi41MSA1LjM4IDIuNTYgMTMuMjJsNy45OCA2LjE5QzEyLjQzIDEzLjcyIDE3Ljc0IDkuNSAyNCA5LjV6XCJcbiAgICAgID48L3BhdGg+XG4gICAgICA8cGF0aFxuICAgICAgICBmaWxsPVwiIzQyODVGNFwiXG4gICAgICAgIGQ9XCJNNDYuOTggMjQuNTVjMC0xLjU3LS4xNS0zLjA5LS4zOC00LjU1SDI0djkuMDJoMTIuOTRjLS41OCAyLjk2LTIuMjYgNS40OC00Ljc4IDcuMThsNy43MyA2YzQuNTEtNC4xOCA3LjA5LTEwLjM2IDcuMDktMTcuNjV6XCJcbiAgICAgID48L3BhdGg+XG4gICAgICA8cGF0aFxuICAgICAgICBmaWxsPVwiI0ZCQkMwNVwiXG4gICAgICAgIGQ9XCJNMTAuNTMgMjguNTljLS40OC0xLjQ1LS43Ni0yLjk5LS43Ni00LjU5cy4yNy0zLjE0Ljc2LTQuNTlsLTcuOTgtNi4xOUMuOTIgMTYuNDYgMCAyMC4xMiAwIDI0YzAgMy44OC45MiA3LjU0IDIuNTYgMTAuNzhsNy45Ny02LjE5elwiXG4gICAgICA+PC9wYXRoPlxuICAgICAgPHBhdGhcbiAgICAgICAgZmlsbD1cIiMzNEE4NTNcIlxuICAgICAgICBkPVwiTTI0IDQ4YzYuNDggMCAxMS45My0yLjEzIDE1Ljg5LTUuODFsLTcuNzMtNmMtMi4xNSAxLjQ1LTQuOTIgMi4zLTguMTYgMi4zLTYuMjYgMC0xMS41Ny00LjIyLTEzLjQ3LTkuOTFsLTcuOTggNi4xOUM2LjUxIDQyLjYyIDE0LjYyIDQ4IDI0IDQ4elwiXG4gICAgICA+PC9wYXRoPlxuICAgICAgPHBhdGggZmlsbD1cIm5vbmVcIiBkPVwiTTAgMGg0OHY0OEgwelwiPjwvcGF0aD5cbiAgICA8L2c+XG4gIDwvc3ZnPlxuKTtcblxuZnVuY3Rpb24gbG9naW5TdWNjZXNzUmVkaXJlY3QoKSB7XG4gIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG4gIGxldCByZWRpcmVjdFVybCA9IHBhcmFtcy5nZXQoJ2NvbnRpbnVlJyk7XG4gIGlmIChcbiAgICAhcmVkaXJlY3RVcmwgfHxcbiAgICAhcmVkaXJlY3RVcmwuc3RhcnRzV2l0aCgnLycpIHx8XG4gICAgcmVkaXJlY3RVcmwuc3RhcnRzV2l0aCgnL2Ntcy9sb2dpbicpXG4gICkge1xuICAgIHJlZGlyZWN0VXJsID0gJy9jbXMnO1xuICB9XG4gIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKHJlZGlyZWN0VXJsKTtcbn1cblxuY29uc3QgYXBwID0gaW5pdGlhbGl6ZUFwcCh3aW5kb3cuX19ST09UX0NUWC5maXJlYmFzZUNvbmZpZyk7XG5jb25zdCBhdXRoID0gZ2V0QXV0aChhcHApO1xud2luZG93LmZpcmViYXNlID0ge2FwcCwgYXV0aH07XG5jb25zdCByb290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jvb3QnKSE7XG5yb290LmlubmVySFRNTCA9ICcnO1xucmVuZGVyKDxTaWduSW4gLz4sIHJvb3QpO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7O0FFaUJBLE1BQU1BLHNCQUFvQixTQUFVLEtBQVc7QUFFN0MsVUFBTSxNQUFnQixDQUFBO0FBQ3RCLFFBQUlDLEtBQUk7QUFDUixhQUFTQyxLQUFJLEdBQUdBLEtBQUksSUFBSSxRQUFRQSxNQUFLO0FBQ25DLFVBQUlDLEtBQUksSUFBSSxXQUFXRCxFQUFDO0FBQ3hCLFVBQUlDLEtBQUksS0FBSztBQUNYLFlBQUlGLElBQUcsSUFBSUU7TUFDWixXQUFVQSxLQUFJLE1BQU07QUFDbkIsWUFBSUYsSUFBRyxJQUFLRSxNQUFLLElBQUs7QUFDdEIsWUFBSUYsSUFBRyxJQUFLRSxLQUFJLEtBQU07TUFDdkIsWUFDRUEsS0FBSSxXQUFZLFNBQ2pCRCxLQUFJLElBQUksSUFBSSxXQUNYLElBQUksV0FBV0EsS0FBSSxDQUFDLElBQUksV0FBWSxPQUNyQztBQUVBLFFBQUFDLEtBQUksVUFBWUEsS0FBSSxTQUFXLE9BQU8sSUFBSSxXQUFXLEVBQUVELEVBQUMsSUFBSTtBQUM1RCxZQUFJRCxJQUFHLElBQUtFLE1BQUssS0FBTTtBQUN2QixZQUFJRixJQUFHLElBQU1FLE1BQUssS0FBTSxLQUFNO0FBQzlCLFlBQUlGLElBQUcsSUFBTUUsTUFBSyxJQUFLLEtBQU07QUFDN0IsWUFBSUYsSUFBRyxJQUFLRSxLQUFJLEtBQU07TUFDdkIsT0FBTTtBQUNMLFlBQUlGLElBQUcsSUFBS0UsTUFBSyxLQUFNO0FBQ3ZCLFlBQUlGLElBQUcsSUFBTUUsTUFBSyxJQUFLLEtBQU07QUFDN0IsWUFBSUYsSUFBRyxJQUFLRSxLQUFJLEtBQU07TUFDdkI7SUFDRjtBQUNE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O0FBQUEsTUFBQztBQUFBO0FBQUEsUUFDQyxNQUFLO0FBQUEsUUFDTCxHQUFFO0FBQUE7QUFBQSxJQUNIO0FBQUEsSUFDRCxnQkFBQUEsR0FBQyxVQUFLLE1BQUssUUFBTyxHQUFFLGlCQUFnQjtBQUFBLEtBQ3RDLEdBQ0Y7QUFHRixXQUFTLHVCQUF1QjtBQUM5QixVQUFNLFNBQVMsSUFBSSxnQkFBZ0IsT0FBTyxTQUFTLE1BQU07QUFDekQsUUFBSSxjQUFjLE9BQU8sSUFBSSxVQUFVO0FBQ3ZDLFFBQ0UsQ0FBQyxlQUNELENBQUMsWUFBWSxXQUFXLEdBQUcsS0FDM0IsWUFBWSxXQUFXLFlBQVksR0FDbkM7QUFDQSxvQkFBYztBQUFBLElBQ2hCO0FBQ0EsV0FBTyxTQUFTLFFBQVEsV0FBVztBQUFBLEVBQ3JDO0FBRUEsTUFBTSxNQUFNLGNBQWMsT0FBTyxXQUFXLGNBQWM7QUFDMUQsTUFBTSxPQUFPLFFBQVEsR0FBRztBQUN4QixTQUFPLFdBQVcsRUFBQyxLQUFLLEtBQUk7QUFDNUIsTUFBTSxPQUFPLFNBQVMsZUFBZSxNQUFNO0FBQzNDLE9BQUssWUFBWTtBQUNqQixJQUFPLGdCQUFBQSxHQUFDLFVBQU8sR0FBSSxJQUFJOyIsCiAgIm5hbWVzIjogWyJzdHJpbmdUb0J5dGVBcnJheSIsICJwIiwgImkiLCAiYyIsICJjMiIsICJjMyIsICJ1IiwgImUiLCAiZSIsICJuYW1lIiwgImUiLCAiYSIsICJiIiwgImsiLCAicXVlcnlzdHJpbmciLCAiZSIsICJpIiwgIm5hbWUiLCAiZSIsICJMb2dMZXZlbCIsICJuYW1lIiwgImMiLCAibmFtZSIsICJ2ZXJzaW9uIiwgInRhcmdldCIsICJERUZBVUxUX0VOVFJZX05BTUUiLCAiYXBwTmFtZSIsICJhcHBDb21wYXROYW1lIiwgImFuYWx5dGljc05hbWUiLCAiYW5hbHl0aWNzQ29tcGF0TmFtZSIsICJhcHBDaGVja05hbWUiLCAiYXBwQ2hlY2tDb21wYXROYW1lIiwgImF1dGhOYW1lIiwgImF1dGhDb21wYXROYW1lIiwgImRhdGFiYXNlTmFtZSIsICJkYXRhYmFzZUNvbXBhdE5hbWUiLCAiZnVuY3Rpb25zTmFtZSIsICJmdW5jdGlvbnNDb21wYXROYW1lIiwgImluc3RhbGxhdGlvbnNOYW1lIiwgImluc3RhbGxhdGlvbnNDb21wYXROYW1lIiwgIm1lc3NhZ2luZ05hbWUiLCAibWVzc2FnaW5nQ29tcGF0TmFtZSIsICJwZXJmb3JtYW5jZU5hbWUiLCAicGVyZm9ybWFuY2VDb21wYXROYW1lIiwgInJlbW90ZUNvbmZpZ05hbWUiLCAicmVtb3RlQ29uZmlnQ29tcGF0TmFtZSIsICJzdG9yYWdlTmFtZSIsICJzdG9yYWdlQ29tcGF0TmFtZSIsICJmaXJlc3RvcmVOYW1lIiwgImZpcmVzdG9yZUNvbXBhdE5hbWUiLCAicGFja2FnZU5hbWUiLCAiYXBwIiwgImUiLCAiYXBwIiwgIm5hbWUiLCAibmFtZSIsICJERUZBVUxUX0VOVFJZX05BTUUiLCAiYXBwIiwgInZlcnNpb24iLCAiZSIsICJhcHAiLCAibmFtZSIsICJ2ZXJzaW9uIiwgIm5hbWUiLCAidmVyc2lvbiIsICJzIiwgImUiLCAidCIsICJwIiwgImkiLCAiYXV0aCIsICJlIiwgImF1dGgiLCAiYXV0aCIsICJlIiwgImUiLCAiYXV0aCIsICJvIiwgIm4iLCAicmVsb2FkIiwgIm5hbWUiLCAicCIsICJlIiwgImF1dGgiLCAiaSIsICJhcHAiLCAianNIZWxwZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5fbG9hZEpTIiwgImFwcCIsICJhdXRoIiwgImF1dGgiLCAiYXV0aCIsICJzaWduSW5XaXRoRW1haWxMaW5rIiwgImF1dGgiLCAiSURQX1JFUVVFU1RfVVJJIiwgInNpZ25JbldpdGhQaG9uZU51bWJlciIsICJsaW5rV2l0aFBob25lTnVtYmVyIiwgImF1dGgiLCAiYXV0aCIsICJfbGluayIsICJhdXRoIiwgImUiLCAiYXV0aCIsICJhdXRoIiwgIl9QT0xMSU5HX0lOVEVSVkFMX01TIiwgImtleSIsICJzdG9yZWRWYWx1ZSIsICJpIiwgIkRCX05BTUUiLCAiREJfVkVSU0lPTiIsICJlIiwgImF1dGgiLCAianNIZWxwZXJzLl9nZW5lcmF0ZUNhbGxiYWNrTmFtZSIsICJhdXRoIiwgImF1dGgiLCAiX2xpbmtVc2VyIiwgImUiLCAiYXV0aCIsICJlIiwgImF1dGgiLCAiYXV0aCIsICJhdXRoIiwgImUiLCAidiIsICJpIiwgImpzLl9nZW5lcmF0ZUNhbGxiYWNrTmFtZSIsICJqc1xyXG4gICAgICAgICAgICAgICAgLl9sb2FkSlMiLCAiZ2FwaUxvYWRlci5fbG9hZEdhcGkiLCAiZ2FwaSIsICJ3aW5kb3ciLCAibmFtZSIsICJwcm9taXNlIiwgImFwcCIsICJ2ZXJzaW9uIiwgIk1PREVfSFlEUkFURSIsICJzbGljZSIsICJvcHRpb25zIiwgInZub2RlSWQiLCAiaXNWYWxpZEVsZW1lbnQiLCAicmVyZW5kZXJRdWV1ZSIsICJwcmV2RGVib3VuY2UiLCAiZGVmZXIiLCAiZGVwdGhTb3J0IiwgImkiLCAiRU1QVFlfT0JKIiwgIkVNUFRZX0FSUiIsICJJU19OT05fRElNRU5TSU9OQUwiLCAiaXNBcnJheSIsICJBcnJheSIsICJhc3NpZ24iLCAib2JqIiwgInByb3BzIiwgInJlbW92ZU5vZGUiLCAibm9kZSIsICJwYXJlbnROb2RlIiwgInJlbW92ZUNoaWxkIiwgImNyZWF0ZUVsZW1lbnQiLCAidHlwZSIsICJjaGlsZHJlbiIsICJrZXkiLCAicmVmIiwgIm5vcm1hbGl6ZWRQcm9wcyIsICJhcmd1bWVudHMiLCAibGVuZ3RoIiwgImNhbGwiLCAiZGVmYXVsdFByb3BzIiwgImNyZWF0ZVZOb2RlIiwgIm9yaWdpbmFsIiwgInZub2RlIiwgIl9fayIsICJfXyIsICJfX2IiLCAiX19lIiwgIl9fZCIsICJfX2MiLCAiY29uc3RydWN0b3IiLCAiX192IiwgIl9faSIsICJfX3UiLCAiRnJhZ21lbnQiLCAicHJvcHMiLCAiY2hpbGRyZW4iLCAiQmFzZUNvbXBvbmVudCIsICJjb250ZXh0IiwgInRoaXMiLCAiZ2V0RG9tU2libGluZyIsICJ2bm9kZSIsICJjaGlsZEluZGV4IiwgIl9fIiwgInNpYmxpbmciLCAiX19rIiwgImxlbmd0aCIsICJfX2UiLCAidHlwZSIsICJ1cGRhdGVQYXJlbnREb21Qb2ludGVycyIsICJpIiwgImNoaWxkIiwgIl9fYyIsICJiYXNlIiwgImVucXVldWVSZW5kZXIiLCAiYyIsICJfX2QiLCAicmVyZW5kZXJRdWV1ZSIsICJwdXNoIiwgInByb2Nlc3MiLCAicHJldkRlYm91bmNlIiwgIm9wdGlvbnMiLCAiZGVib3VuY2VSZW5kZXJpbmciLCAiZGVmZXIiLCAicmVuZGVyUXVldWVMZW5ndGgiLCAiY29tcG9uZW50IiwgIm5ld1ZOb2RlIiwgIm9sZFZOb2RlIiwgIm9sZERvbSIsICJwYXJlbnREb20iLCAiY29tbWl0UXVldWUiLCAicmVmUXVldWUiLCAic29ydCIsICJkZXB0aFNvcnQiLCAic2hpZnQiLCAiX192IiwgIl9fUCIsICJhc3NpZ24iLCAiZGlmZiIsICJfX24iLCAib3duZXJTVkdFbGVtZW50IiwgIl9fdSIsICJfX2kiLCAiY29tbWl0Um9vdCIsICJkaWZmQ2hpbGRyZW4iLCAicmVuZGVyUmVzdWx0IiwgIm5ld1BhcmVudFZOb2RlIiwgIm9sZFBhcmVudFZOb2RlIiwgImdsb2JhbENvbnRleHQiLCAiaXNTdmciLCAiZXhjZXNzRG9tQ2hpbGRyZW4iLCAiaXNIeWRyYXRpbmciLCAiY2hpbGRWTm9kZSIsICJuZXdEb20iLCAiZmlyc3RDaGlsZERvbSIsICJvbGRDaGlsZHJlbiIsICJFTVBUWV9BUlIiLCAibmV3Q2hpbGRyZW5MZW5ndGgiLCAiY29uc3RydWN0TmV3Q2hpbGRyZW5BcnJheSIsICJFTVBUWV9PQkoiLCAicmVmIiwgImFwcGx5UmVmIiwgImluc2VydCIsICJuZXh0U2libGluZyIsICJza2V3ZWRJbmRleCIsICJtYXRjaGluZ0luZGV4IiwgIm9sZENoaWxkcmVuTGVuZ3RoIiwgInJlbWFpbmluZ09sZENoaWxkcmVuIiwgInNrZXciLCAiY29uc3RydWN0b3IiLCAiU3RyaW5nIiwgImNyZWF0ZVZOb2RlIiwgImlzQXJyYXkiLCAia2V5IiwgIl9fYiIsICJmaW5kTWF0Y2hpbmdJbmRleCIsICJ1bm1vdW50IiwgInBhcmVudFZOb2RlIiwgImluc2VydEJlZm9yZSIsICJmaW5kTWF0Y2hpbmdJbmRleCIsICJjaGlsZFZOb2RlIiwgIm9sZENoaWxkcmVuIiwgInNrZXdlZEluZGV4IiwgInJlbWFpbmluZ09sZENoaWxkcmVuIiwgImtleSIsICJ0eXBlIiwgIngiLCAieSIsICJvbGRWTm9kZSIsICJsZW5ndGgiLCAiX191IiwgInNldFN0eWxlIiwgInN0eWxlIiwgInZhbHVlIiwgInNldFByb3BlcnR5IiwgIklTX05PTl9ESU1FTlNJT05BTCIsICJ0ZXN0IiwgImRvbSIsICJuYW1lIiwgIm9sZFZhbHVlIiwgImlzU3ZnIiwgInVzZUNhcHR1cmUiLCAibyIsICJjc3NUZXh0IiwgInJlcGxhY2UiLCAidG9Mb3dlckNhc2UiLCAic2xpY2UiLCAibCIsICJfYXR0YWNoZWQiLCAiRGF0ZSIsICJub3ciLCAiYWRkRXZlbnRMaXN0ZW5lciIsICJldmVudFByb3h5Q2FwdHVyZSIsICJldmVudFByb3h5IiwgInJlbW92ZUV2ZW50TGlzdGVuZXIiLCAiZSIsICJyZW1vdmVBdHRyaWJ1dGUiLCAic2V0QXR0cmlidXRlIiwgImV2ZW50SGFuZGxlciIsICJ0aGlzIiwgIl9kaXNwYXRjaGVkIiwgIm9wdGlvbnMiLCAiZXZlbnQiLCAiZGlmZiIsICJwYXJlbnREb20iLCAibmV3Vk5vZGUiLCAiZ2xvYmFsQ29udGV4dCIsICJleGNlc3NEb21DaGlsZHJlbiIsICJjb21taXRRdWV1ZSIsICJvbGREb20iLCAiaXNIeWRyYXRpbmciLCAicmVmUXVldWUiLCAidG1wIiwgImMiLCAiaXNOZXciLCAib2xkUHJvcHMiLCAib2xkU3RhdGUiLCAic25hcHNob3QiLCAiY2xlYXJQcm9jZXNzaW5nRXhjZXB0aW9uIiwgIm5ld1Byb3BzIiwgInByb3ZpZGVyIiwgImNvbXBvbmVudENvbnRleHQiLCAiaSIsICJyZW5kZXJIb29rIiwgImNvdW50IiwgInJlbmRlclJlc3VsdCIsICJuZXdUeXBlIiwgImNvbnN0cnVjdG9yIiwgIl9fZSIsICJfX2IiLCAib3V0ZXIiLCAicHJvcHMiLCAiY29udGV4dFR5cGUiLCAiX19jIiwgIl9fIiwgIl9fRSIsICJwcm90b3R5cGUiLCAicmVuZGVyIiwgIkJhc2VDb21wb25lbnQiLCAiZG9SZW5kZXIiLCAic3ViIiwgInN0YXRlIiwgImNvbnRleHQiLCAiX19uIiwgIl9fZCIsICJfX2giLCAiX3NiIiwgIl9fcyIsICJnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMiLCAiYXNzaWduIiwgIl9fdiIsICJjb21wb25lbnRXaWxsTW91bnQiLCAiY29tcG9uZW50RGlkTW91bnQiLCAicHVzaCIsICJjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIiwgInNob3VsZENvbXBvbmVudFVwZGF0ZSIsICJfX2siLCAiZm9yRWFjaCIsICJ2bm9kZSIsICJjb21wb25lbnRXaWxsVXBkYXRlIiwgImNvbXBvbmVudERpZFVwZGF0ZSIsICJfX1AiLCAiX19yIiwgImdldENoaWxkQ29udGV4dCIsICJnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSIsICJkaWZmQ2hpbGRyZW4iLCAiaXNBcnJheSIsICJGcmFnbWVudCIsICJjaGlsZHJlbiIsICJiYXNlIiwgIk1PREVfSFlEUkFURSIsICJpbmRleE9mIiwgImRpZmZFbGVtZW50Tm9kZXMiLCAiZGlmZmVkIiwgImNvbW1pdFJvb3QiLCAicm9vdCIsICJhcHBseVJlZiIsICJzb21lIiwgImNiIiwgImNhbGwiLCAibmV3SHRtbCIsICJvbGRIdG1sIiwgIm5ld0NoaWxkcmVuIiwgImlucHV0VmFsdWUiLCAiY2hlY2tlZCIsICJub2RlVHlwZSIsICJsb2NhbE5hbWUiLCAiZG9jdW1lbnQiLCAiY3JlYXRlVGV4dE5vZGUiLCAiY3JlYXRlRWxlbWVudE5TIiwgImNyZWF0ZUVsZW1lbnQiLCAiaXMiLCAiZGF0YSIsICJjaGlsZE5vZGVzIiwgIkVNUFRZX09CSiIsICJhdHRyaWJ1dGVzIiwgIl9faHRtbCIsICJpbm5lckhUTUwiLCAiZ2V0RG9tU2libGluZyIsICJyZW1vdmVOb2RlIiwgInJlZiIsICJjdXJyZW50IiwgInVubW91bnQiLCAicGFyZW50Vk5vZGUiLCAic2tpcFJlbW92ZSIsICJyIiwgImNvbXBvbmVudFdpbGxVbm1vdW50IiwgInJlcGxhY2VOb2RlIiwgIm93bmVyU1ZHRWxlbWVudCIsICJmaXJzdENoaWxkIiwgInNsaWNlIiwgIkVNUFRZX0FSUiIsICJvcHRpb25zIiwgIl9fZSIsICJlcnJvciIsICJ2bm9kZSIsICJvbGRWTm9kZSIsICJlcnJvckluZm8iLCAiY29tcG9uZW50IiwgImN0b3IiLCAiaGFuZGxlZCIsICJfXyIsICJfX2MiLCAiY29uc3RydWN0b3IiLCAiZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIiwgInNldFN0YXRlIiwgIl9fZCIsICJjb21wb25lbnREaWRDYXRjaCIsICJfX0UiLCAiZSIsICJ2bm9kZUlkIiwgImlzVmFsaWRFbGVtZW50IiwgInVuZGVmaW5lZCIsICJCYXNlQ29tcG9uZW50IiwgInByb3RvdHlwZSIsICJ1cGRhdGUiLCAiY2FsbGJhY2siLCAicyIsICJ0aGlzIiwgIl9fcyIsICJzdGF0ZSIsICJhc3NpZ24iLCAicHJvcHMiLCAiX192IiwgIl9zYiIsICJwdXNoIiwgImVucXVldWVSZW5kZXIiLCAiZm9yY2VVcGRhdGUiLCAiX19oIiwgInJlbmRlciIsICJGcmFnbWVudCIsICJyZXJlbmRlclF1ZXVlIiwgImRlZmVyIiwgIlByb21pc2UiLCAidGhlbiIsICJiaW5kIiwgInJlc29sdmUiLCAic2V0VGltZW91dCIsICJkZXB0aFNvcnQiLCAiYSIsICJiIiwgIl9fYiIsICJwcm9jZXNzIiwgIl9fciIsICJpIiwgImN1cnJlbnRJbmRleCIsICJjdXJyZW50Q29tcG9uZW50IiwgInByZXZpb3VzQ29tcG9uZW50IiwgInByZXZSYWYiLCAiY3VycmVudEhvb2siLCAiYWZ0ZXJQYWludEVmZmVjdHMiLCAiRU1QVFkiLCAib2xkQmVmb3JlRGlmZiIsICJvcHRpb25zIiwgIl9fYiIsICJvbGRCZWZvcmVSZW5kZXIiLCAiX19yIiwgIm9sZEFmdGVyRGlmZiIsICJkaWZmZWQiLCAib2xkQ29tbWl0IiwgIl9fYyIsICJvbGRCZWZvcmVVbm1vdW50IiwgInVubW91bnQiLCAiZ2V0SG9va1N0YXRlIiwgImluZGV4IiwgInR5cGUiLCAiX19oIiwgImhvb2tzIiwgIl9fSCIsICJfXyIsICJsZW5ndGgiLCAicHVzaCIsICJfX1YiLCAidXNlU3RhdGUiLCAiaW5pdGlhbFN0YXRlIiwgInVzZVJlZHVjZXIiLCAiaW52b2tlT3JSZXR1cm4iLCAicmVkdWNlciIsICJpbml0IiwgImhvb2tTdGF0ZSIsICJfcmVkdWNlciIsICJhY3Rpb24iLCAiY3VycmVudFZhbHVlIiwgIl9fTiIsICJuZXh0VmFsdWUiLCAic2V0U3RhdGUiLCAiX2hhc1NjdUZyb21Ib29rcyIsICJ1cGRhdGVIb29rU3RhdGUiLCAicCIsICJzIiwgImMiLCAic3RhdGVIb29rcyIsICJmaWx0ZXIiLCAieCIsICJldmVyeSIsICJwcmV2U2N1IiwgImNhbGwiLCAidGhpcyIsICJzaG91bGRVcGRhdGUiLCAiZm9yRWFjaCIsICJob29rSXRlbSIsICJwcm9wcyIsICJzaG91bGRDb21wb25lbnRVcGRhdGUiLCAicHJldkNXVSIsICJjb21wb25lbnRXaWxsVXBkYXRlIiwgIl9fZSIsICJ0bXAiLCAiZmx1c2hBZnRlclBhaW50RWZmZWN0cyIsICJjb21wb25lbnQiLCAiYWZ0ZXJQYWludEVmZmVjdHMiLCAic2hpZnQiLCAiX19QIiwgIl9fSCIsICJfX2giLCAiZm9yRWFjaCIsICJpbnZva2VDbGVhbnVwIiwgImludm9rZUVmZmVjdCIsICJlIiwgIm9wdGlvbnMiLCAiX19lIiwgIl9fdiIsICJfX2IiLCAidm5vZGUiLCAiY3VycmVudENvbXBvbmVudCIsICJvbGRCZWZvcmVEaWZmIiwgIl9fciIsICJvbGRCZWZvcmVSZW5kZXIiLCAiY3VycmVudEluZGV4IiwgImhvb2tzIiwgIl9fYyIsICJwcmV2aW91c0NvbXBvbmVudCIsICJfXyIsICJob29rSXRlbSIsICJfX04iLCAiRU1QVFkiLCAiX3BlbmRpbmdBcmdzIiwgImRpZmZlZCIsICJvbGRBZnRlckRpZmYiLCAiYyIsICJsZW5ndGgiLCAicHVzaCIsICJwcmV2UmFmIiwgInJlcXVlc3RBbmltYXRpb25GcmFtZSIsICJhZnRlck5leHRGcmFtZSIsICJfX1YiLCAiY29tbWl0UXVldWUiLCAic29tZSIsICJmaWx0ZXIiLCAiY2IiLCAib2xkQ29tbWl0IiwgInVubW91bnQiLCAib2xkQmVmb3JlVW5tb3VudCIsICJoYXNFcnJvcmVkIiwgInMiLCAiSEFTX1JBRiIsICJjYWxsYmFjayIsICJyYWYiLCAiZG9uZSIsICJjbGVhclRpbWVvdXQiLCAidGltZW91dCIsICJjYW5jZWxBbmltYXRpb25GcmFtZSIsICJzZXRUaW1lb3V0IiwgImhvb2siLCAiY29tcCIsICJjbGVhbnVwIiwgImludm9rZU9yUmV0dXJuIiwgImFyZyIsICJmIiwgInZub2RlSWQiLCAiaXNBcnJheSIsICJBcnJheSIsICJjcmVhdGVWTm9kZSIsICJ0eXBlIiwgInByb3BzIiwgImtleSIsICJpc1N0YXRpY0NoaWxkcmVuIiwgIl9fc291cmNlIiwgIl9fc2VsZiIsICJyZWYiLCAiaSIsICJub3JtYWxpemVkUHJvcHMiLCAidm5vZGUiLCAiX19rIiwgIl9fIiwgIl9fYiIsICJfX2UiLCAiX19kIiwgIl9fYyIsICJjb25zdHJ1Y3RvciIsICJfX3YiLCAiX19pIiwgIl9fdSIsICJkZWZhdWx0UHJvcHMiLCAib3B0aW9ucyIsICJoIiwgInUiXQp9Cg==