sf-reglanegociom3 1.0.12-beta8 → 1.0.12-beta80

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.
Files changed (54) hide show
  1. package/bundles/sf-reglanegociom3.umd.js +347 -80
  2. package/bundles/sf-reglanegociom3.umd.js.map +1 -1
  3. package/bundles/sf-reglanegociom3.umd.min.js +1 -1
  4. package/bundles/sf-reglanegociom3.umd.min.js.map +1 -1
  5. package/esm2015/lib/ConexionSQL/posts.service.js +5 -8
  6. package/esm2015/lib/rnm3/Data/m3-couch-maestro.js +2 -2
  7. package/esm2015/lib/rnm3/Data/m3-data.js +2 -4
  8. package/esm2015/lib/rnm3/Miscelanea/MathTF.class.js +19 -1
  9. package/esm2015/lib/rnm3/Notificaciones/notificaciones-m3.service.js +2 -2
  10. package/esm2015/lib/rnm3/Offline/couch-codsprd.service.js +2 -2
  11. package/esm2015/lib/rnm3/Offline/couch-configlp.service.js +2 -2
  12. package/esm2015/lib/rnm3/Offline/couch-dinamxprocesos.js +2 -2
  13. package/esm2015/lib/rnm3/Offline/couch-perxtipo.js +2 -2
  14. package/esm2015/lib/rnm3/Offline/couch-prds.service.js +2 -2
  15. package/esm2015/lib/rnm3/Offline/couch-promociones.service.js +2 -2
  16. package/esm2015/lib/rnm3/Offline/couch-ubicaciones.service.js +2 -2
  17. package/esm2015/lib/rnm3/Offline/service-m3-proceso-offline.js +9 -4
  18. package/esm2015/lib/rnm3/Promociones/promociones.service.js +68 -11
  19. package/esm2015/lib/rnm3/Registro/m3-procesos.js +5 -1
  20. package/esm2015/lib/rnm3/Services/M3Maestro.service.js +84 -3
  21. package/esm2015/lib/rnm3/Services/m3-load-l-precio.service.js +3 -3
  22. package/esm2015/lib/rnm3/Services/m3-reg-masivo.service.js +53 -8
  23. package/esm2015/lib/rnm3/Services/m3-reg-service.js +39 -16
  24. package/esm5/lib/ConexionSQL/posts.service.js +5 -26
  25. package/esm5/lib/rnm3/Data/m3-couch-maestro.js +2 -2
  26. package/esm5/lib/rnm3/Data/m3-data.js +2 -4
  27. package/esm5/lib/rnm3/Miscelanea/MathTF.class.js +29 -1
  28. package/esm5/lib/rnm3/Notificaciones/notificaciones-m3.service.js +2 -2
  29. package/esm5/lib/rnm3/Offline/couch-codsprd.service.js +2 -2
  30. package/esm5/lib/rnm3/Offline/couch-configlp.service.js +2 -2
  31. package/esm5/lib/rnm3/Offline/couch-dinamxprocesos.js +2 -2
  32. package/esm5/lib/rnm3/Offline/couch-perxtipo.js +2 -2
  33. package/esm5/lib/rnm3/Offline/couch-prds.service.js +2 -2
  34. package/esm5/lib/rnm3/Offline/couch-promociones.service.js +2 -2
  35. package/esm5/lib/rnm3/Offline/couch-ubicaciones.service.js +2 -2
  36. package/esm5/lib/rnm3/Offline/service-m3-proceso-offline.js +9 -4
  37. package/esm5/lib/rnm3/Promociones/promociones.service.js +78 -12
  38. package/esm5/lib/rnm3/Registro/m3-procesos.js +5 -1
  39. package/esm5/lib/rnm3/Services/M3Maestro.service.js +117 -3
  40. package/esm5/lib/rnm3/Services/m3-load-l-precio.service.js +3 -3
  41. package/esm5/lib/rnm3/Services/m3-reg-masivo.service.js +60 -9
  42. package/esm5/lib/rnm3/Services/m3-reg-service.js +40 -17
  43. package/fesm2015/sf-reglanegociom3.js +278 -59
  44. package/fesm2015/sf-reglanegociom3.js.map +1 -1
  45. package/fesm5/sf-reglanegociom3.js +341 -80
  46. package/fesm5/sf-reglanegociom3.js.map +1 -1
  47. package/lib/rnm3/Miscelanea/MathTF.class.d.ts +2 -0
  48. package/lib/rnm3/Promociones/promociones.service.d.ts +4 -3
  49. package/lib/rnm3/Registro/m3-procesos.d.ts +2 -0
  50. package/lib/rnm3/Services/M3Maestro.service.d.ts +4 -0
  51. package/lib/rnm3/Services/m3-reg-masivo.service.d.ts +5 -3
  52. package/lib/rnm3/Services/m3-reg-service.d.ts +2 -2
  53. package/package.json +1 -1
  54. package/sf-reglanegociom3.metadata.json +1 -1
@@ -555,10 +555,8 @@ var M3RegService = /** @class */ (function () {
555
555
  // console.log(x);
556
556
  // console.log(oData);
557
557
  oM3Data.AddToPouchBDCarritoComprasAsync(sKeyCarrito, oM3Procesos).then(function (x) {
558
- console.debug("Entro1");
559
558
  funcionOK();
560
559
  }).catch(function (x) {
561
- console.debug("Entro2");
562
560
  funcionOK();
563
561
  });
564
562
  }).catch(function (x) {
@@ -1163,7 +1161,7 @@ var M3RegService = /** @class */ (function () {
1163
1161
  productoCombo.Lote = "1";
1164
1162
  productoCombo.ID = +this.GetMaxAtributoFromLista(oM3Procesos.M3ENC, "ID") + 1; //JAGM, cambio de ID, caso cuando se agrega prd:1, prd:2 y de nuevo prd:1. En este caso en lógica anterior, se hace remove de item. y los ID quedaban repetidos.
1165
1163
  productoCombo.Orden = +this.GetMaxAtributoFromLista(oM3Procesos.M3ENC, "Orden") + 1;
1166
- productoCombo.Nombre = "Combo";
1164
+ productoCombo.Nombre = "Combo - " + productosHijosDelCombo.map(function (x) { return x.IdProducto; }).join('-');
1167
1165
  productoCombo.M3DET.push(this.LoadM3PDetalle(moment(new Date()).format('YYYY-MM-DDTHH:mm:ss'), "FECHAIN"));
1168
1166
  productoCombo.M3DET.push(this.LoadM3PDetalle("true", "ESPRODPROMOCOMBO"));
1169
1167
  productoCombo.M3DET.push(this.LoadM3PDetalle("true", "ESPRODPROMO")); // TRUE-> SI ES UN PRODUCTO POR PROMOCION, FALSE-> DE OTRO MODO
@@ -1310,6 +1308,13 @@ var M3RegService = /** @class */ (function () {
1310
1308
  oM3PEncItems.DISPONIBLE = oM3PrdGeneral.DISPONIBLE;
1311
1309
  oM3PEncItems.PathImage = oM3PItemsWEB.PathImagen;
1312
1310
  oM3PEncItems.CodigoBarras = oM3PItemsWEB.CodigoBarras;
1311
+ if (oM3Ubicacion && oM3Ubicacion.M3UbiAdicionales) {
1312
+ /** @type {?} */
1313
+ var ubiImpFijo = oM3Ubicacion.M3UbiAdicionales.find(function (x) { return x.Atributo == "IMPFIJO"; });
1314
+ if (ubiImpFijo && ubiImpFijo.Valor != "") {
1315
+ oM3PrdGeneral.CTBLDIMPPRD = ubiImpFijo.Valor;
1316
+ }
1317
+ }
1313
1318
  /** @type {?} */
1314
1319
  var pTotalBase = this.CalculatePrecioBase(oM3PrdGeneral.CTBLDIMPPRD, this.oMathTF.round(bigDecimal.multiply(oPromocionProcesada.PrecioTotal, oM3PItemsWEB.dCantidad), 2));
1315
1320
  if (oM3PItemsWEB.dCantidad != 0) {
@@ -1346,11 +1351,18 @@ var M3RegService = /** @class */ (function () {
1346
1351
  oM3PEncItems.M3DET.push(this.LoadM3PDetalle(dTotalImpuestosTotal.toString(), "TOTALIMPUESTOS"));
1347
1352
  oM3PEncItems.M3DET.push(this.LoadM3PDetalle((this.oMathTF.round(this.GetUnitarioByTotal(oM3PItemsWEB.dCantidad, oM3PEncItems, "TOTALIMPUESTOS"), 2)).toString(), "TOTALIMPUNIT"));
1348
1353
  //oM3PEncItems.M3DET.push(this.LoadM3PDetalle((+oM3PrdGeneral.LoM3PrdLista.PRECIO - +dTotalImpuestosUnitario).toString(), "PUNITSINIMPUESTO"));//Sin descuento incluido Y sin Impuestos //------ Nunca Cambia
1349
- oM3PEncItems.M3DET.push(this.LoadM3PDetalle((+dPRECIOUnitBase + dUnitarioPromo).toString(), "PUNITSINIMPUESTO")); //Sin descuento incluido Y sin Impuestos //------ Nunca Cambia //FS 20190725 Correccion en la fomra de calcularlo
1354
+ oM3PEncItems.M3DET.push(this.LoadM3PDetalle((+dPRECIOUnitBase + +dUnitarioPromo).toString(), "PUNITSINIMPUESTO")); //Sin descuento incluido Y sin Impuestos //------ Nunca Cambia //FS 20190725 Correccion en la fomra de calcularlo
1350
1355
  oM3PEncItems.M3DET.push(this.LoadM3PDetalle(oM3PrdGeneral.LoM3PrdLista.PRECIO.toString(), "PUNIT")); //Sin descuento incluido ------ Nunca Cambia
1351
1356
  oM3PEncItems.M3DET.push(this.LoadM3PDetalle(oPromocionProcesada.PrecioTotal.toString(), "PUNITNETO")); //Con descuento incluido------ Nunca Cambia
1352
1357
  oM3PEncItems.M3DET.push(this.LoadM3PDetalle(dUnitarioMonedero.toString(), "UNITFIDEL")); //Unitario fidelizacion ------ Nunca Cambia
1353
1358
  oM3PEncItems.M3DET.push(this.LoadM3PDetalle(dUnitarioPromo.toString(), "VUNITPROMO")); //Unitario Promocion ------ Nunca Cambia
1359
+ if (this.gsIdkatios == "CTN") {
1360
+ /** @type {?} */
1361
+ var listaSR = prodGRPSelected.LoM3PrdGeneral[0].LoM3ListaPrecio.find(function (x) { return x.IDLISTA == "2"; });
1362
+ if (listaSR) {
1363
+ oM3PEncItems.M3DET.push(this.LoadM3PDetalle(prodGRPSelected.LoM3PrdGeneral[0].LoM3ListaPrecio.find(function (x) { return x.IDLISTA == "2"; }).PRECIO.toString(), "PRECIOSR"));
1364
+ }
1365
+ }
1354
1366
  //** FIN VALORES UNITARIOS */
1355
1367
  // *** Informacion de acciones en el cliente ***
1356
1368
  if (prodGRPSelected.encontradoLocal) {
@@ -1394,13 +1406,13 @@ var M3RegService = /** @class */ (function () {
1394
1406
  return false;
1395
1407
  };
1396
1408
  /**
1397
- * Retorna el máximo valor de un atributo dentro de la lista cualquiera
1409
+ * Excluye todos los impuestos dejando solo el FIJO si es de la ubicacion dada
1398
1410
  * @param {?} lista
1399
1411
  * @param {?} atributo
1400
1412
  * @return {?}
1401
1413
  */
1402
1414
  M3RegService.prototype.GetMaxAtributoFromLista = /**
1403
- * Retorna el máximo valor de un atributo dentro de la lista cualquiera
1415
+ * Excluye todos los impuestos dejando solo el FIJO si es de la ubicacion dada
1404
1416
  * @param {?} lista
1405
1417
  * @param {?} atributo
1406
1418
  * @return {?}
@@ -1464,6 +1476,10 @@ var M3RegService = /** @class */ (function () {
1464
1476
  this.InsUpdDetItem(oM3PEncItems, (this.oMathTF.round(+this.GetTotalByUnitario(dCantidad, oM3PEncItems, "PRECIOUNITBASE"), 2)).toString(), "PRECIOTOTALBASE"); //Precio Sin impuestos
1465
1477
  this.InsUpdDetItem(oM3PEncItems, (this.oMathTF.round((subTotal + +oM3PEncItems.M3DET.find(function (det) { return det.NombreConcepto == "TOTALIMPUESTOS"; }).Valor - +oM3PEncItems.M3DET.find(function (det) { return det.NombreConcepto == "TOTALPROMO"; }).Valor), 2)).toString(), "PRECIOTOTAL");
1466
1478
  /** FIN VALORES DINAMICOS */
1479
+ if (oM3PEncItems.M3PImpuestos.length > 0 && dCantidad == 0) { //Si la cantidad es 0 significa que se está borrando el item o es un obsequio, por lo que no tiene sentido que tenga M3PImpuesto
1480
+ //Si la cantidad es 0 significa que se está borrando el item o es un obsequio, por lo que no tiene sentido que tenga M3PImpuesto
1481
+ oM3PEncItems.M3PImpuestos = [];
1482
+ }
1467
1483
  };
1468
1484
  /**
1469
1485
  * Retorna la sumatoria de los valores de un atributo dado del arreglo de impuestos
@@ -1485,7 +1501,7 @@ var M3RegService = /** @class */ (function () {
1485
1501
  var impuesto = oM3PEncItems.M3PImpuestos[_i];
1486
1502
  sumatoria = sumatoria + (+impuesto[atributo]);
1487
1503
  }
1488
- return sumatoria;
1504
+ return this.oMathTF.round(sumatoria, 2);
1489
1505
  };
1490
1506
  /**
1491
1507
  * @param {?} oM3PEncItems
@@ -1507,7 +1523,7 @@ var M3RegService = /** @class */ (function () {
1507
1523
  if (det_ctbld_imp_prd && det_precio_unit_base) {
1508
1524
  valorTotalImpuestos = this.LoadM3PImpuestosFromPrdGrl(det_ctbld_imp_prd.Valor, oM3PEncItems, +bigDecimal.multiply(det_precio_unit_base.Valor, cantidad), cantidad, +oM3PEncItems.M3DET.find(function (det) { return det.NombreConcepto == "PUNITNETO"; }).Valor);
1509
1525
  }
1510
- return valorTotalImpuestos;
1526
+ return this.oMathTF.round(valorTotalImpuestos, 2);
1511
1527
  };
1512
1528
  /**
1513
1529
  * @param {?} oM3PEncItems
@@ -1967,7 +1983,7 @@ var M3RegService = /** @class */ (function () {
1967
1983
  /** @type {?} */
1968
1984
  var opromocionesService = new promocionesService(oDataUser, oM3PItemsWEB);
1969
1985
  arrPromo = opromocionesService.VerificarPromociones(oM3Procesos, prodGRPSelected, oM3Ubicacion, oM3ENCPROMO, lTipos);
1970
- oPromocionProcesada = opromocionesService.ProcesarPromocion(arrPromo, prodGRPSelected, oM3ENCPROMO);
1986
+ oPromocionProcesada = opromocionesService.ProcesarPromocion(arrPromo, prodGRPSelected, oM3ENCPROMO, this.gsIdkatios);
1971
1987
  return oPromocionProcesada;
1972
1988
  }
1973
1989
  else {
@@ -2435,7 +2451,7 @@ var M3RegService = /** @class */ (function () {
2435
2451
  /** @type {?} */
2436
2452
  var oM3PImpuestos;
2437
2453
  /** @type {?} */
2438
- var valorBaseTotal = this.oMathTF.round(dValorNeto, 2);
2454
+ var valorBaseTotal = this.oMathTF.round(dValorNeto, 4);
2439
2455
  /** @type {?} */
2440
2456
  var valorNetoTotal = valorBaseTotal;
2441
2457
  /** @type {?} */
@@ -2478,10 +2494,10 @@ var M3RegService = /** @class */ (function () {
2478
2494
  // }
2479
2495
  }
2480
2496
  //JAGM 20180912 Nuevo concepto de base
2481
- oM3PImpuestos.Base = valorNetoTotal;
2482
- dTotalImpuesto = (+dTotalImpuesto) + (+oM3PImpuestos.Valor);
2497
+ oM3PImpuestos.Base = this.oMathTF.round(valorNetoTotal, 2);
2498
+ dTotalImpuesto = this.oMathTF.round((+dTotalImpuesto), 2) + this.oMathTF.round((+oM3PImpuestos.Valor), 2);
2483
2499
  //JAGM 20180912 Suma de Valor Neto
2484
- valorNetoTotal = (+valorNetoTotal) + (+oM3PImpuestos.Valor);
2500
+ valorNetoTotal = this.oMathTF.round((+this.oMathTF.round(valorNetoTotal, 2)) + this.oMathTF.round((+oM3PImpuestos.Valor), 2), 2);
2485
2501
  /** @type {?} */
2486
2502
  var impExiste;
2487
2503
  impExiste = oM3PEncItems.M3PImpuestos.find(function (imp) { return imp.CodImpuesto == oM3PImpuestos.CodImpuesto; });
@@ -2499,12 +2515,15 @@ var M3RegService = /** @class */ (function () {
2499
2515
  //Diferencia redondeada a dos decimales
2500
2516
  dTotalImpuesto = this.oMathTF.round(dTotalImpuesto, 2);
2501
2517
  /** @type {?} */
2502
- var diferencia = this.oMathTF.round((valorTotalProductoTotal - valorBaseTotal - dTotalImpuesto), 2);
2518
+ var diferencia = this.oMathTF.round((+valorTotalProductoTotal - +this.oMathTF.round(valorBaseTotal, 2) - +dTotalImpuesto), 2);
2519
+ if (isNaN(diferencia)) {
2520
+ diferencia = this.oMathTF.round(+(+valorTotalProductoTotal - +this.oMathTF.round(valorBaseTotal, 2) - +dTotalImpuesto).toFixed(4), 2);
2521
+ }
2503
2522
  if (diferencia != 0) {
2504
2523
  this.ajustadorDeImpuestos(oM3PEncItems, diferencia);
2505
2524
  }
2506
2525
  // "TOTALIMPUESTOS"
2507
- return this.oMathTF.round((valorTotalProductoTotal - valorBaseTotal), 2);
2526
+ return this.oMathTF.round((valorTotalProductoTotal - this.oMathTF.round(valorBaseTotal, 2)), 2);
2508
2527
  }
2509
2528
  else {
2510
2529
  return 0;
@@ -2795,7 +2814,11 @@ var M3RegService = /** @class */ (function () {
2795
2814
  else {
2796
2815
  // JAGM 20191021, no hacer lógica de promociones y varios, cuándo se borra el item.
2797
2816
  if (iCantidad == 0) {
2798
- oM3Procesos.M3ENC.find(function (enc) { return enc.IdProducto == idProducto && enc.Lote == Lote && enc.ID == IDEnc; }).M3DET.find(function (det) { return det.NombreConcepto == "CANTIDAD"; }).Valor = iCantidad;
2817
+ //Se toma en cuenta el prd y sus hijos con el IdEncPadre
2818
+ oM3Procesos.M3ENC.filter(function (enc) { return (enc.IdProducto == idProducto && enc.Lote == Lote && enc.ID == IDEnc) || enc.IdEncPadre == IDEnc; }).forEach(function (prd) {
2819
+ prd.M3DET.find(function (det) { return det.NombreConcepto == "CANTIDAD"; }).Valor = iCantidad;
2820
+ });
2821
+ //oM3Procesos.M3ENC.find(enc => enc.IdProducto == idProducto && enc.Lote == Lote && enc.ID == IDEnc).M3DET.find(det => det.NombreConcepto == "CANTIDAD").Valor = iCantidad;//Antigua logica
2799
2822
  this.UpdateM3ProcesosWithData(oM3Procesos, oM3Data, oDataUser, sIDKatios, tipoUbicacion, funcionOK, funcionError, m3Ubicacion);
2800
2823
  }
2801
2824
  else {
@@ -3524,4 +3547,4 @@ function M3RegService_tsickle_Closure_declarations() {
3524
3547
  M3RegService.prototype.gsIdkatios;
3525
3548
  }
3526
3549
 
3527
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibTMtcmVnLXNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy8iLCJzb3VyY2VzIjpbImxpYi9ybm0zL1NlcnZpY2VzL20zLXJlZy1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV4RCxPQUFPLEtBQUssT0FBTyxNQUFNLFFBQVEsQ0FBQztBQUNsQyxPQUFPLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUk5RixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBSTFELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxrQkFBa0IsRUFBNEMsTUFBTSw4Q0FBOEMsQ0FBQztBQUU1SCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFekQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFNcEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFeEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDRCQUE0QixDQUFDOztBQUdwRCxJQUFNLE1BQU0sR0FBRyxPQUFPLENBQUM7O0FBQ3ZCLElBQUksVUFBVSxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBRTNDLElBQUE7SUFXSSxzQkFBWSxnQkFBZ0MsRUFBRSxlQUE4QixFQUFFLFNBQWlCO3VCQVZ0RSxJQUFJLE1BQU0sRUFBRTsrQkFFQSxJ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RCxpQkFBaUIsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztxQkFDMUU7b0JBQ0QsTUFBTTtpQkFDVDthQUNKOzs7Ozs7Ozs7S0FDSjs7Ozs7Ozs7O0lBRU0sa0RBQTJCOzs7Ozs7OztjQUFDLGFBQTRCLEVBQUUsU0FBaUIsRUFBRSxLQUFVLEVBQzFGLFVBQW9CLEVBQUUsV0FBcUI7UUFDM0MsYUFBYSxDQUFDLGFBQWEsQ0FBQyxpQ0FBaUMsR0FBRyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTtZQUM1RixVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDcEIsRUFDRyxVQUFBLEdBQUc7WUFDQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7U0FDOUMsQ0FBQyxDQUFDOzt1QkFwdUVmO0lBdXVFQyxDQUFBO0FBdHNFRCx3QkFzc0VDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTTNQcm9jZXNvcyB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wcm9jZXNvc1wiO1xyXG5pbXBvcnQgeyBNM1BFbmNJdGVtcyB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wZW5jLWl0ZW1zXCI7XHJcbmltcG9ydCB7IE0zUHJkR2VuZXJhbCB9IGZyb20gXCIuLi9NYWVzdHJvL00zUHJkR2VuZXJhbC50eXBlXCI7XHJcbmltcG9ydCAqIGFzIG1vbWVudF8gZnJvbSAnbW9tZW50JztcclxuaW1wb3J0IHsgTTNQRGV0YWxsZUl0ZW1zLCBNM1BJdGVtc1dFQiwgTTNQRGV0YWxsZUN1cG9uIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXBkZXRhbGxlLWl0ZW1zXCI7XHJcbmltcG9ydCB7IFBvc3RTZXJ2aWNlTTMgfSBmcm9tIFwiLi4vLi4vQ29uZXhpb25TUUwvcG9zdHMuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNM0RhdGEgfSBmcm9tIFwiLi4vRGF0YS9tMy1kYXRhXCI7XHJcbmltcG9ydCB7IERFRkFVTFRfVkFMVUVfQUNDRVNTT1IgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXMvc3JjL2RpcmVjdGl2ZXMvZGVmYXVsdF92YWx1ZV9hY2Nlc3NvclwiO1xyXG5pbXBvcnQgeyB4bWxUb0pzb25URiB9IGZyb20gXCIuLi8uLi9Db252ZXJ0L3htbFRvSlNvbi5jbGFzc1wiO1xyXG5pbXBvcnQgeyBNM1BJbXB1ZXN0b3MgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcC1pbXB1ZXN0b3NcIjtcclxuaW1wb3J0IHsgTTNVYmljYWNpb24gfSBmcm9tIFwiLi4vTWFlc3Ryby9VYmljYWNpb24vTTNVYmljYWNpb24udHlwZVwiO1xyXG5pbXBvcnQgeyBNM0VOQ1BST01PIH0gZnJvbSBcIi4uL1Byb21vY2lvbmVzL01vZGVscy9NM0VOQ1BST01PLmNsYXNzXCI7XHJcbmltcG9ydCB7IFR5cGVNM1ByZEdycCB9IGZyb20gXCIuLi9NYWVzdHJvL00zUHJkR3JwLnR5cGVcIjtcclxuaW1wb3J0IHsgcHJvbW9jaW9uZXNTZXJ2aWNlIH0gZnJvbSBcIi4uL1Byb21vY2lvbmVzL3Byb21vY2lvbmVzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgUHJvbW9jaW9uUHJvY2VzYWRhLCBQcm9tb2Npb25lc0Fzb2NpYWRhcywgUHJvbW9jaW9uQ29tYmluYWRhIH0gZnJvbSBcIi4uL1Byb21vY2lvbmVzL01vZGVscy9NM1Byb21vUHJvY2VzYWRhLmNsYXNzXCI7XHJcbmltcG9ydCB7IE0zQ291Y2hNYWVzdHJvIH0gZnJvbSBcIi4uL0RhdGEvbTMtY291Y2gtbWFlc3Ryb1wiO1xyXG5pbXBvcnQgeyBTZXJ2aWNlTTNNYWVzdHJvIH0gZnJvbSBcIi4vTTNNYWVzdHJvLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTTNQRGluYW1pY2FzIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXBkaW5hbWljYXNcIjtcclxuaW1wb3J0IHsgU2VydmljZUxpc3RhUHJlY2lvIH0gZnJvbSBcIi4vbTMtbGlzdGEtcHJlY2lvLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgU2VydmljZUxvYWRMaXN0YVByZWNpbyB9IGZyb20gXCIuL20zLWxvYWQtbC1wcmVjaW8uc2VydmljZVwiO1xyXG5pbXBvcnQgeyBhIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmUvc3JjL3JlbmRlcjNcIjtcclxuaW1wb3J0IHsgTTNQcmVzZW50YWNpb25lcyB9IGZyb20gXCIuLi9NYWVzdHJvL20zLXByZXNlbnRhY2lvbmVzXCI7XHJcbmltcG9ydCB7IHN0cmluZ2lmeSB9IGZyb20gXCJAYW5ndWxhci9jb21waWxlci9zcmMvdXRpbFwiO1xyXG5pbXBvcnQgeyBNM1ByZFBhY2tEZXQgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZFBhY2tEZXRcIjtcclxuaW1wb3J0IHsgTTNQcmRBZGljaW9uYWxlcyB9IGZyb20gXCIuLi9NYWVzdHJvL00zUHJkQWRpY2lvbmFsZXMudHlwZVwiO1xyXG5pbXBvcnQgeyBNM090Q2xhc2lmaWNhY2lvbmVzIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLW90LWNsYXNpZmljYWNpb25lc1wiO1xyXG5pbXBvcnQgeyBNM1ByZExpc3RhIH0gZnJvbSBcIi4uL01hZXN0cm8vTTNQcmRMaXN0YS50eXBlXCI7XHJcbmltcG9ydCB7IE1hdGhURiB9IGZyb20gXCIuLi9NaXNjZWxhbmVhL01hdGhURi5jbGFzc1wiO1xyXG5pbXBvcnQgeyBFQ0FOQ0VMRUQgfSBmcm9tIFwiY29uc3RhbnRzXCI7XHJcblxyXG5jb25zdCBtb21lbnQgPSBtb21lbnRfO1xyXG52YXIgYmlnRGVjaW1hbCA9IHJlcXVpcmUoJ2pzLWJpZy1kZWNpbWFsJyk7XHJcblxyXG5leHBvcnQgY2xhc3MgTTNSZWdTZXJ2aWNlIHtcclxuICAgIHB1YmxpYyBvTWF0aFRGOiBNYXRoVEYgPSBuZXcgTWF0aFRGKCk7XHJcbiAgICBwcml2YXRlIG9NM0NvdWNoTWFlc3RybzogTTNDb3VjaE1hZXN0cm87XHJcbiAgICBwdWJsaWMgb0xpc3RhT2JzZXF1aW9zOiBBcnJheTxhbnk+ID0gbnVsbDtcclxuICAgIHB1YmxpYyBvYnNlcXVpb3NFeGM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHB1YmxpYyBvYnNlcXVpb09Qcm9tbzogbnVtYmVyID0gLTE7XHJcbiAgICBwdWJsaWMgb2JzZXF1aW9zQ2FudGlkYWQ6IG51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgbElkQWN0aXZhUHJvbW8gPSBbXTtcclxuICAgIHByaXZhdGUgR29Qb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zO1xyXG4gICAgcHJpdmF0ZSBnc0lka2F0aW9zO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGlvTTNDb3VjaE1hZXN0cm86IE0zQ291Y2hNYWVzdHJvLCBJc1Bvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJZGthdGlvczogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5vTTNDb3VjaE1hZXN0cm8gPSBpb00zQ291Y2hNYWVzdHJvO1xyXG4gICAgICAgIHRoaXMuR29Qb3N0U2VydmljZU0zID0gSXNQb3N0U2VydmljZU0zO1xyXG4gICAgICAgIHRoaXMuZ3NJZGthdGlvcyA9IHNJZGthdGlvcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgKiBWYWxpZGFyIG51bWVybyBkZSBpdGVtcyBhZ3JlZ2Fkb3MuIHNpIGVzIG1heW9yIGEgMS4wMDAgcHJlbmRlIHBhcmFtZXRybyBcclxuICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFyTnVtZXJvSXRlbXMob2xNM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgaWYgKG9sTTNQcm9jZXNvcy5NM0VOQy5sZW5ndGggPiAxMDAwKSB7XHJcbiAgICAgICAgICAgIG9sTTNQcm9jZXNvcy5BcGxEZXNkZVNlcnZlciA9IHRydWU7XHJcbiAgICAgICAgICAgIG9sTTNQcm9jZXNvcy5NM0VOQyA9IG5ldyBBcnJheTxNM1BFbmNJdGVtcz4oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIFByb2Nlc2FtaWVudG9TZXJ2aWNlKHNJREthdGlvczogc3RyaW5nLCBQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcyxcclxuICAgICAgICBvRGF0YVVzZXI6IGFueSwgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbiwgYXBsUmV0b21hckluZm86IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICAgICAgdGhpcy5WYWxpZGFyTnVtZXJvSXRlbXMob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIHRoaXMuUmV0b21hckluZm9ybWFjaW9uKG9EYXRhVXNlciwgb00zUHJvY2Vzb3MsIGFwbFJldG9tYXJJbmZvKTtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNMy9SZWdpc3Ryb0V2ZW50b00zL1wiICsgc0lES2F0aW9zICsgXCIvXCIgKyBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQyArIFwiL1wiICsgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9NM1Byb2Nlc29zKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIHZhciBvSnNvbiA9IEpTT04ucGFyc2UocmVzcC5qc29uKCkpO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5JZE0zID0gb0pzb24uUkVTUFVFU1RBLklETTM7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLklERGlhcmlvID0gb0pzb24uUkVTUFVFU1RBLklERElBUklPO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5JRERpYXJpb0NpZXJyZSA9IG9Kc29uLlJFU1BVRVNUQS5JRERJQVJJT0NJRVJSRVxyXG5cclxuICAgICAgICAgICAgLy9BY3R1YWxpemFjaW9uIGRlIGVzdGFkb3MuXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlN1YkVzdGFkb0FudCA9IG9NM1Byb2Nlc29zLlN1YkVzdGFkb0RlcztcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuRXN0YWRvQW50ID0gb00zUHJvY2Vzb3MuRXN0YWRvRGVzO1xyXG5cclxuICAgICAgICAgICAgZnVuY2lvbk9LKG9NM1Byb2Nlc29zLCBvSnNvbi5SRVNQVUVTVEEpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL3RoaXMuZW5Qcm9jZXNvID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVyci5qc29uKCkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyLmpzb24oKS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIHByb2Nlc2FtaWVudG9fc2VydmljZV9hc3luYyhzSURLYXRpb3M6IHN0cmluZywgUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsXHJcbiAgICAgICAgb0RhdGFVc2VyOiBhbnksIGFwbFJldG9tYXJJbmZvOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMuUmV0b21hckluZm9ybWFjaW9uKG9EYXRhVXNlciwgb00zUHJvY2Vzb3MsIGFwbFJldG9tYXJJbmZvKTtcclxuXHJcbiAgICAgICAgICAgIHZhciByZXNwID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNMy9SZWdpc3Ryb0V2ZW50b00zL1wiICsgc0lES2F0aW9zICsgXCIvXCIgKyBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQyArIFwiL1wiICsgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9NM1Byb2Nlc29zKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAgdmFyIG9Kc29uID0gSlNPTi5wYXJzZShyZXNwLmpzb24oKSk7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLklkTTMgPSBvSnNvbi5SRVNQVUVTVEEuSURNMztcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuSUREaWFyaW8gPSBvSnNvbi5SRVNQVUVTVEEuSURESUFSSU87XHJcblxyXG4gICAgICAgICAgICAvL0FjdHVhbGl6YWNpb24gZGUgZXN0YWRvcy5cclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuU3ViRXN0YWRvQW50ID0gb00zUHJvY2Vzb3MuU3ViRXN0YWRvRGVzO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5Fc3RhZG9BbnQgPSBvTTNQcm9jZXNvcy5Fc3RhZG9EZXM7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgUmVnaXN0cm9FdmVudG9NM09mZkxpbmUoc0lES2F0aW9zOiBzdHJpbmcsIFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIG9NM1Byb2Nlc29zOiBBcnJheTxNM1Byb2Nlc29zPiwgb0RhdGFVc2VyOiBhbnkpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zL1JlZ2lzdHJvRXZlbnRvTTNPZmZMaW5lL1wiICsgc0lES2F0aW9zICsgXCIvXCIgKyBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQyArIFwiL1wiICsgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9NM1Byb2Nlc29zKS50b1Byb21pc2UoKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIC8vL1JldG9tYXIgaW5mb3JtYWNpb24gcGFyYSBlbCBwcm9jZXNvLlxyXG4gICAgcHVibGljIFJldG9tYXJJbmZvcm1hY2lvbihvRGF0YVVzZXI6IGFueSwgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIGFwbFJldG9tYXJJbmZvOiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKG9EYXRhVXNlciAhPSBudWxsICYmIG9NM1Byb2Nlc29zLklkTTMgIT09IHVuZGVmaW5lZCAmJiBvTTNQcm9jZXNvcy5JZE0zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGFwbFJldG9tYXJJbmZvKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkSHViID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklESFVCO1xyXG4gICAgICAgICAgICAgICAgaWYgKG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRVYmljID09IHVuZGVmaW5lZCB8fCBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkVWJpYyA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZFViaWMgPSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZFViaWMgPSBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkVWJpY1ByZVxyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZEh1YiA9IG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRIdWJQcmU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9Qcm9jZXNhbWllbnRvIGRlIGRhdG9zIGVuIGJhc2UgZGUgZGF0b3MgcG91Y2hEQi5cclxuICAgIHB1YmxpYyBQcm9jZXNhbWllbnRvU2VydmljZVBvdWNoREIob00zRGF0YTogTTNEYXRhLCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLFxyXG4gICAgICAgIHByb2RHUlBTZWxlY3RlZDogVHlwZU0zUHJkR3JwLCBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uLCBvRGF0YVVzZXI6IGFueSwgc0lES2F0aW9zOiBzdHJpbmcsXHJcbiAgICAgICAgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBpb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZDogYW55ID0gbnVsbCkge1xyXG5cclxuICAgICAgICB2YXIgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3M7XHJcbiAgICAgICAgdmFyIHNLZXlDYXJyaXRvOiBzdHJpbmc7XHJcbiAgICAgICAgdmFyIHByb2R1Y3RVbml0U2VsZWN0ZWQ6IE0zUHJkR2VuZXJhbDtcclxuICAgICAgICBwcm9kdWN0VW5pdFNlbGVjdGVkID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdO1xyXG4gICAgICAgIC8vT2J0ZW5lciBrZXkgZGUgY2Fycml0byBkZSBjb21wcmFzXHJcbiAgICAgICAgc0tleUNhcnJpdG8gPSBvTTNEYXRhLkdldEtleUNhcnJpdG9Db21wcmFzKHNJREthdGlvcywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURIVUIpO1xyXG4gICAgICAgIC8vQ2FyZ2FyIGRldGFsbGUgZGUgaXRlbXNcclxuICAgICAgICAvL0d1YXJkYXIgZW4gQkQgUG91Y2hEQlxyXG4gICAgICAgIG9NM0RhdGEuR2V0RGF0YVBvdWNoQkQoc0tleUNhcnJpdG8pLnRoZW4oYXN5bmMgcmVzdWx0ID0+IHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSByZXN1bHQ7XHJcbiAgICAgICAgICAgIGxldCBjYW50aWRhZF9hY3R1YWwgPSB0aGlzLnZhbGlkYXJFeGlzdGFQcm9kdWN0byhvTTNQcm9jZXNvcy5NM0VOQywgcHJvZHVjdFVuaXRTZWxlY3RlZCwgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgaWYgKGNhbnRpZGFkX2FjdHVhbCAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgICAvL2xldCBjYW50aWRhZF9hY3R1YWwgPSB0aGlzLmdldENhbnRpZGFkKG9NM1Byb2Nlc29zLCBwcm9kdWN0VW5pdFNlbGVjdGVkKTtcclxuICAgICAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSAoK2NhbnRpZGFkX2FjdHVhbCkgKyArb00zUEl0ZW1zV0VCLmRDYW50aWRhZDtcclxuXHJcbiAgICAgICAgICAgICAgICAvL2xldCBNM0VuYyA9IHRoaXMuZ2V0X00zRU5DX2J5X2lkcHJkX2xvdGUob00zUHJvY2Vzb3MsIHByb2R1Y3RVbml0U2VsZWN0ZWQuU0tVLCBwcm9kdWN0VW5pdFNlbGVjdGVkLkxPVEUpO1xyXG5cclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DID0gb00zUHJvY2Vzb3MuTTNFTkMuZmlsdGVyKHByb2QgPT4gIShwcm9kLklkUHJvZHVjdG8gPT0gcHJvZHVjdFVuaXRTZWxlY3RlZC5TS1UgJiYgcHJvZC5Mb3RlID09IHByb2R1Y3RVbml0U2VsZWN0ZWQuTE9URSAmJiAhKHByb2QuSWRFbmNQYWRyZSA+IDApKSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlJlY2FsY3VsYXJQcmVjaW9zKG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gdGhpcy5Mb2FkTTNQcm9jZXNvRnJvbURhdGEob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBvTTNEYXRhLkFkZFRvUG91Y2hCRENhcnJpdG9Db21wcmFzKHNLZXlDYXJyaXRvLCBvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uT0sob00zUHJvY2Vzb3MsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcyA9IHRoaXMuTG9hZE0zUHJvY2Vzb0Zyb21EYXRhKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhcyhzS2V5Q2Fycml0bywgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbk9LKG9NM1Byb2Nlc29zLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKG9EYXRhQ2Fycml0b0NvbXByYXMpO1xyXG4gICAgICAgIH0sIGFzeW5jIGVycm9yID0+IHtcclxuICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PSBcIjQwNFwiKSB7Ly9ObyBleGlzdGUgZWwgY2Fycml0byBcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gdGhpcy5Mb2FkTTNQcm9jZXNvRW1wdHlQREIocHJvZEdSUFNlbGVjdGVkLCBvTTNQSXRlbXNXRUIsIG9EYXRhVXNlciwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgaW9NM1Byb2Nlc29zLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhcyhzS2V5Q2Fycml0bywgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbk9LKG9NM1Byb2Nlc29zLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBubyBjb250cm9sYWRvXCIpO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9BZ3JlZ2FyIGEgY2Fycml0byBwcm9kdWN0by5cclxuICAgIHB1YmxpYyBhZGR0b2NhcnQob00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQixcclxuICAgICAgICBwcm9kR1JQU2VsZWN0ZWQ6IFR5cGVNM1ByZEdycCwgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbiwgb0RhdGFVc2VyOiBhbnksIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgaW9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQ6IGFueSA9IG51bGwsIHZhbG9yRGVzY3VlbnRvID0gMCkge1xyXG5cclxuICAgICAgICB2YXIgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MgPSBpb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgdmFyIHNLZXlDYXJyaXRvOiBzdHJpbmc7XHJcbiAgICAgICAgdmFyIHByb2R1Y3RVbml0U2VsZWN0ZWQ6IE0zUHJkR2VuZXJhbDtcclxuICAgICAgICBwcm9kdWN0VW5pdFNlbGVjdGVkID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdO1xyXG4gICAgICAgIC8vSkFHTSAyMDE5MDcyMiBzZSBhZ3JlZ2EgcGFyYSBjdWFuZG8gZXMgZWwgcHJpbWVyIHByb2R1Y3RvIHF1ZSBzZSBhZ3JlZ2Fyw6FcclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MuTTNFTkMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSB0aGlzLkxvYWRNM1Byb2Nlc29FbXB0eVBEQihwcm9kR1JQU2VsZWN0ZWQsIG9NM1BJdGVtc1dFQiwgb0RhdGFVc2VyLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBpb00zUHJvY2Vzb3MsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZCk7XHJcbiAgICAgICAgICAgIGlmIChmdW5jaW9uT0spXHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uT0sob00zUHJvY2Vzb3MsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IGNhbnRpZGFkX2FjdHVhbCA9IHRoaXMudmFsaWRhckV4aXN0YVByb2R1Y3RvKG9NM1Byb2Nlc29zLk0zRU5DLCBwcm9kdWN0VW5pdFNlbGVjdGVkLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICBpZiAoY2FudGlkYWRfYWN0dWFsICE9IDApIHtcclxuICAgICAgICAgICAgICAgIC8vbGV0IGNhbnRpZGFkX2FjdHVhbCA9IHRoaXMuZ2V0Q2FudGlkYWQob00zUHJvY2Vzb3MsIHByb2R1Y3RVbml0U2VsZWN0ZWQpO1xyXG4gICAgICAgICAgICAgICAgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9ICgrY2FudGlkYWRfYWN0dWFsKSArIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQ7XHJcblxyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMgPSBvTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIocHJvZCA9PiAhKHByb2QuSWRQcm9kdWN0byA9PSBwcm9kdWN0VW5pdFNlbGVjdGVkLlNLVSAmJiBwcm9kLkxvdGUgPT0gcHJvZHVjdFVuaXRTZWxlY3RlZC5MT1RFICYmICEocHJvZC5JZEVuY1BhZHJlID4gMCkpKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuUmVjYWxjdWxhclByZWNpb3Mob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSB0aGlzLkxvYWRNM1Byb2Nlc29Gcm9tRGF0YShvTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9EYXRhVXNlciwgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkLCB2YWxvckRlc2N1ZW50byk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZnVuY2lvbk9LKVxyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmNpb25PSyhvTTNQcm9jZXNvcywgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcyA9IHRoaXMuTG9hZE0zUHJvY2Vzb0Zyb21EYXRhKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQsIHZhbG9yRGVzY3VlbnRvKTtcclxuICAgICAgICAgICAgICAgIGlmIChmdW5jaW9uT0spXHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY2lvbk9LKG9NM1Byb2Nlc29zLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vVmFsaWRhIHF1ZSBleGlzdGEgcHJvZHVjdG8gZW4gbG9zIGVuY2FiZXphZG9zLiBUcnVlOiBTaSBleGlzdGUsIEZhbHNlIGRlIG90cm8gbW9kb1xyXG4gICAgLy8gU2UgY2FtYmlhIGZ1bmNpb25hbGlkYWQgZGUgcmV0dXJuLlxyXG4gICAgcHVibGljIHZhbGlkYXJFeGlzdGFQcm9kdWN0byhvTTNMaXN0YUVuYzogQXJyYXk8TTNQRW5jSXRlbXM+LCBvTTNQcmRHcmw6IE0zUHJkR2VuZXJhbCwgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQik6IG51bWJlciB7XHJcbiAgICAgICAgdmFyIG9FbmM6IE0zUEVuY0l0ZW1zID0gbnVsbDtcclxuICAgICAgICB2YXIgY2FudGlkYWQ6IG51bWJlciA9IDA7XHJcbiAgICAgICAgb00zUEl0ZW1zV0VCLklERW5jUmVwZXRpZG8gPSAtMTtcclxuICAgICAgICBpZiAob00zTGlzdGFFbmMgIT09IHVuZGVmaW5lZCAmJiBvTTNQcmRHcmwgIT09IHVuZGVmaW5lZCAmJiBvTTNMaXN0YUVuYy5sZW5ndGggPiAwKSB7XHJcblxyXG4gICAgICAgICAgICBvRW5jID0gb00zTGlzdGFFbmMuZmluZChlbmMgPT4gZW5jLklkUHJvZHVjdG8gPT0gb00zUHJkR3JsLlNLVSAmJiAhZW5jLklkRW5jUGFkcmUgJiYgdGhpcy5nZXRDYW50aWRhZFBvc2l0aXZhKGVuYykpO1xyXG4gICAgICAgICAgICBpZiAob0VuYyAhPT0gdW5kZWZpbmVkICYmIG9FbmMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgLy9KQUdNIDIwMTkwNzE3IFZhbGlkYXIgYWhvcmEgZWwgcHJlY2lvLlxyXG4gICAgICAgICAgICAgICAgdGhpcy5WZXJpZmljYXJQcmVjaW9CeU5pdmVsZXNHZW5lcmFsKG9NM1ByZEdybCwgK29FbmMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcik7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5WYWxpZGFyUHJlY2lvc1ByZHMob0VuYywgb00zUHJkR3JsLkxvTTNQcmRMaXN0YSkgJiYgIXRoaXMuVmFsaWRhckVzdGFQYXF1ZXRlKG9FbmMsIG9NM0xpc3RhRW5jKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5JREVuY1JlcGV0aWRvID0gb0VuYy5JRDtcclxuICAgICAgICAgICAgICAgICAgICBjYW50aWRhZCA9ICtvRW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjYW50aWRhZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDYW50aWRhZFBvc2l0aXZhKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMpOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgY2FudGlkYWQgPSAwO1xyXG4gICAgICAgIGxldCBkZXRDYW50aWRhZCA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpXHJcblxyXG4gICAgICAgIGlmIChkZXRDYW50aWRhZCkge1xyXG4gICAgICAgICAgICBjYW50aWRhZCA9ICtkZXRDYW50aWRhZC5WYWxvcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjYW50aWRhZCA+IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYSBxdWUgZWwgZW5jYWJlemFkbyBjb24gZWwgcHJvZHVjdG8gYWdyZWdhZG8sIHNlYSB1biBwYXF1ZXRlXHJcbiAgICAgKiBAcGFyYW0gb00zUEVuY0l0ZW1zIFxyXG4gICAgICogQHBhcmFtIG9NM0xpc3RhRW5jIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmFsaWRhckVzdGFQYXF1ZXRlKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIG9NM0xpc3RhRW5jOiBBcnJheTxNM1BFbmNJdGVtcz4pIHtcclxuICAgICAgICB2YXIgYlJlc3A6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAob00zTGlzdGFFbmMuZmluZCh4ID0+IHguSWRFbmNQYWRyZSA9PSBvTTNQRW5jSXRlbXMuSUQpKSB7XHJcbiAgICAgICAgICAgICAgICBiUmVzcCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBiUmVzcDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYXIgbG9zIHByZWNpb3MgZGUgbG9zIHByb2R1Y3Rvc1xyXG4gICAgICogQHBhcmFtIG9FbmMgXHJcbiAgICAgKiBAcGFyYW0gb00zUHJkTGlzdGEgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFyUHJlY2lvc1ByZHMob0VuYzogTTNQRW5jSXRlbXMsIG9NM1ByZExpc3RhOiBNM1ByZExpc3RhKSB7XHJcbiAgICAgICAgdmFyIGJSZXNwOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIGRQcmVjaW9FbmM6IG51bWJlciA9ICtvRW5jLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRcIikuVmFsb3I7XHJcbiAgICAgICAgICAgIHZhciBkUHJlY2lvTGlzdDogbnVtYmVyID0gb00zUHJkTGlzdGEuUFJFQ0lPO1xyXG5cclxuICAgICAgICAgICAgaWYgKGRQcmVjaW9MaXN0ID09IGRQcmVjaW9FbmMpIHtcclxuICAgICAgICAgICAgICAgIGJSZXNwID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBWYWxpZGFyUHJlY2lvc1ByZHNcIilcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBiUmVzcDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9BY3R1YWxpemFjaW9uIGRlIE0zIHByb2Nlc29zLCBjb24gZGF0YSBsaXN0YSBwYXJhIGFjdHVhbGl6YXIuXHJcbiAgICBwdWJsaWMgVXBkYXRlTTNQcm9jZXNvc1dpdGhEYXRhKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvTTNEYXRhOiBNM0RhdGEsXHJcbiAgICAgICAgb0RhdGFVc2VyOiBhbnksIHNJREthdGlvczogc3RyaW5nLCB0aXBvVWJpY2FjaW9uOiBzdHJpbmcsIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb25cclxuICAgICAgICAsIG0zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiA9IG51bGwsIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIgPSBudWxsKSB7XHJcbiAgICAgICAgLy9HdWFyZGFyIGVuIEJEIFBvdWNoREJcclxuICAgICAgICB2YXIgc0tleUNhcnJpdG86IHN0cmluZztcclxuICAgICAgICB0aGlzLlJlY2FsY3VsYXJQcmVjaW9zKG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAvL09idGVuZXIga2V5IGRlIGNhcnJpdG8gZGUgY29tcHJhc1xyXG4gICAgICAgIC8vSURIVUJcclxuICAgICAgICBpZiAodGlwb1ViaWNhY2lvbi50b1VwcGVyQ2FzZSgpID09IFwiV0VCXCIpIHtcclxuICAgICAgICAgICAgc0tleUNhcnJpdG8gPSBvTTNEYXRhLkdldEtleUNhcnJpdG9Db21wcmFzKHNJREthdGlvcywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURIVUIpO1xyXG5cclxuICAgICAgICAgICAgb00zRGF0YS5HZXREYXRhUG91Y2hCRChzS2V5Q2Fycml0bykudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhcyhzS2V5Q2Fycml0bywgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNhclByb21vQWZ0ZXJDYXJyaXRvT2sob00zUHJvY2Vzb3MsIG9NM0RhdGEsIG9EYXRhVXNlciwgbTNVYmljYWNpb24sIGZ1bmNpb25PSywgZnVuY2lvbkVycm9yLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09IFwiNDA0XCIpIHsvL05vIGV4aXN0ZSBlbCBjYXJyaXRvIFxyXG4gICAgICAgICAgICAgICAgICAgIG9NM0RhdGEuQWRkVG9Qb3VjaEJEQ2Fycml0b0NvbXByYXMoc0tleUNhcnJpdG8sIG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc2FyUHJvbW9BZnRlckNhcnJpdG9PayhvTTNQcm9jZXNvcywgb00zRGF0YSwgb0RhdGFVc2VyLCBtM1ViaWNhY2lvbiwgZnVuY2lvbk9LLCBmdW5jaW9uRXJyb3IsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3Igbm8gY29udHJvbGFkb1wiKTtcclxuICAgICAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBwcm9jZXNhclByb21vQWZ0ZXJDYXJyaXRvT2sob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM0RhdGE6IE0zRGF0YSxcclxuICAgICAgICBvRGF0YVVzZXI6IGFueSwgbTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uLCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCKSB7XHJcbiAgICAgICAgaWYgKG0zVWJpY2FjaW9uKSB7XHJcbiAgICAgICAgICAgIHZhciBsb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQjtcclxuICAgICAgICAgICAgaWYgKG9NM1BJdGVtc1dFQikge1xyXG4gICAgICAgICAgICAgICAgbG9NM1BJdGVtc1dFQiA9IG9NM1BJdGVtc1dFQjtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGxvTTNQSXRlbXNXRUIgPSBuZXcgTTNQSXRlbXNXRUIoKTtcclxuICAgICAgICAgICAgICAgIGxvTTNQSXRlbXNXRUIuZENhbnRpZGFkID0gMTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIHNLZXlDYXJyaXRvID0gb00zRGF0YS5HZXRLZXlDYXJyaXRvQ29tcHJhcyh0aGlzLmdzSWRrYXRpb3MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiwgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklESFVCKTtcclxuICAgICAgICAgICAgdGhpcy5Qcm9jUHJvbW9BZnRlckFkZFRvQ2FydChvTTNQcm9jZXNvcywgb0RhdGFVc2VyLCBsb00zUEl0ZW1zV0VCLCBtM1ViaWNhY2lvbiwgdHJ1ZSkudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHgpO1xyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2cob0RhdGEpO1xyXG4gICAgICAgICAgICAgICAgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhc0FzeW5jKHNLZXlDYXJyaXRvLCBvTTNQcm9jZXNvcykudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKFwiRW50cm8xXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmNpb25PSygpO1xyXG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goeCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcIkVudHJvMlwiKTtcclxuICAgICAgICAgICAgICAgICAgICBmdW5jaW9uT0soKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KS5jYXRjaCh4ID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHgpXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIG5vIGNvbnRyb2xhZG8gZW4gcHJvY2VzYXJQcm9tb0FmdGVyQ2Fycml0b09rXCIpO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbk9LKCk7XHJcbiAgICAgICAgICAgICAgICAvLyAgIHRoaXMub0VuY2FiZXphZG9NM0NvbXBvbmVudC5SZWNhcmdhckNhcnJpdG8oKTtcclxuICAgICAgICAgICAgICAgIC8vICAgdGhpcy5Mb2FkQ2FydCgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGZ1bmNpb25PSygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9BY3R1YWxpemFjaW9uIGRlIE0zIHByb2Nlc29zLCBjb24gZGF0YSBsaXN0YSBwYXJhIGFjdHVhbGl6YXIuXHJcbiAgICBwdWJsaWMgdXBkYXRlQVBvdWNoKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvTTNEYXRhOiBNM0RhdGEsXHJcbiAgICAgICAgb0RhdGFVc2VyOiBhbnksIHNJREthdGlvczogc3RyaW5nLCB0aXBvVWJpY2FjaW9uOiBzdHJpbmcsIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24pIHtcclxuICAgICAgICAvL0d1YXJkYXIgZW4gQkQgUG91Y2hEQlxyXG4gICAgICAgIHZhciBzS2V5Q2Fycml0bzogc3RyaW5nO1xyXG4gICAgICAgIC8vT2J0ZW5lciBrZXkgZGUgY2Fycml0byBkZSBjb21wcmFzXHJcbiAgICAgICAgLy9JREhVQlxyXG4gICAgICAgIGlmICh0aXBvVWJpY2FjaW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJXRUJcIikge1xyXG4gICAgICAgICAgICBzS2V5Q2Fycml0byA9IG9NM0RhdGEuR2V0S2V5Q2Fycml0b0NvbXByYXMoc0lES2F0aW9zLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JREhVQik7XHJcblxyXG4gICAgICAgICAgICBvTTNEYXRhLkdldERhdGFQb3VjaEJEKHNLZXlDYXJyaXRvKS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgICAgICBvTTNEYXRhLkFkZFRvUG91Y2hCRENhcnJpdG9Db21wcmFzKHNLZXlDYXJyaXRvLCBvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uT0soKTtcclxuICAgICAgICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PSBcIjQwNFwiKSB7Ly9ObyBleGlzdGUgZWwgY2Fycml0byBcclxuICAgICAgICAgICAgICAgICAgICBvTTNEYXRhLkFkZFRvUG91Y2hCRENhcnJpdG9Db21wcmFzKHNLZXlDYXJyaXRvLCBvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY2lvbk9LKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3Igbm8gY29udHJvbGFkb1wiKTtcclxuICAgICAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgRGVsZXRlTTNQcm9jZXNvKG9NM0RhdGE6IE0zRGF0YSwgb0RhdGFVc2VyOiBhbnksIHNJREthdGlvczogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIHNLZXlDYXJyaXRvOiBzdHJpbmc7XHJcbiAgICAgICAgc0tleUNhcnJpdG8gPSBvTTNEYXRhLkdldEtleUNhcnJpdG9Db21wcmFzKHNJREthdGlvcywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURIVUIpO1xyXG4gICAgICAgIGF3YWl0IG9NM0RhdGEuRGVsZXRlKHNLZXlDYXJyaXRvKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8vRWxpbWluYXIgZG9jdW1lbnRvIGRlIGNvdWNoL3BvdWNoLCBpbmljaW8geSBhY3R1YWxcclxuICAgIHB1YmxpYyBEZWxEb2NzU3RhcnRBbmRDdXJyZW50KG9NM0RhdGE6IE0zRGF0YSwgc0lES2F0aW9zOiBzdHJpbmcsIG9sTTNQcm9jZXNvczogTTNQcm9jZXNvcywgVWJpY2FjaW9uQ3VycmVudCwgSHViQ3VycmVudCkge1xyXG4gICAgICAgIC8vRWxpbWluYXIgSW5pY2lhbFxyXG4gICAgICAgIGlmIChvbE0zUHJvY2Vzb3MuSUREaWFyaW9DaWVycmUgIT09IHVuZGVmaW5lZCAmJiBvbE0zUHJvY2Vzb3MuSUREaWFyaW9DaWVycmUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICB2YXIgb0RhdGFVc2VyID0geyBcIlVzdWFyaW9TaXN0ZW1hXCI6IHsgXCJURE9DXCI6IG9sTTNQcm9jZXNvcy5URG9jLCBcIk5ET0NcIjogb2xNM1Byb2Nlc29zLk5Eb2MsIFwiVUJJQ0FDSU9OXCI6IG9sTTNQcm9jZXNvcy5VYmljMS50b1N0cmluZygpLCBcIklESFVCXCI6IG9sTTNQcm9jZXNvcy5JREh1YiB9IH1cclxuICAgICAgICAgICAgdGhpcy5EZWxldGVNM1Byb2Nlc28ob00zRGF0YSwgb0RhdGFVc2VyLCBzSURLYXRpb3MpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkRlbGV0ZSBzdGFydFwiKTtcclxuICAgICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICAgIC8vRWxpbWluYXIgYWN0dWFsXHJcbiAgICAgICAgICAgIG9EYXRhVXNlciA9IHsgXCJVc3VhcmlvU2lzdGVtYVwiOiB7IFwiVERPQ1wiOiBvbE0zUHJvY2Vzb3MuVERvYywgXCJORE9DXCI6IG9sTTNQcm9jZXNvcy5ORG9jLCBcIlVCSUNBQ0lPTlwiOiBVYmljYWNpb25DdXJyZW50LnRvU3RyaW5nKCksIFwiSURIVUJcIjogSHViQ3VycmVudCB9IH1cclxuICAgICAgICAgICAgdGhpcy5EZWxldGVNM1Byb2Nlc28ob00zRGF0YSwgb0RhdGFVc2VyLCBzSURLYXRpb3MpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkRlbGV0ZSBjdXJyZW50XCIpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vQWN0dWFsaXphY2lvbiBkZSBNMyBwcm9jZXNvcywgY29uIGRhdGEgbGlzdGEgcGFyYSBhY3R1YWxpemFyLlxyXG4gICAgcHVibGljIGFzeW5jIEdldENhcnJpdG9Db21wcmFzUG91Y2hEQihvTTNEYXRhOiBNM0RhdGEsIG9EYXRhVXNlcjogYW55LCBzSURLYXRpb3M6IHN0cmluZykge1xyXG4gICAgICAgIC8vR3VhcmRhciBlbiBCRCBQb3VjaERCXHJcbiAgICAgICAgdmFyIHNLZXlDYXJyaXRvOiBzdHJpbmc7XHJcbiAgICAgICAgdmFyIG9NM1Byb2Nlc287XHJcbiAgICAgICAgLy9PYnRlbmVyIGtleSBkZSBjYXJyaXRvIGRlIGNvbXByYXNcclxuICAgICAgICBzS2V5Q2Fycml0byA9IG9NM0RhdGEuR2V0S2V5Q2Fycml0b0NvbXByYXMoc0lES2F0aW9zLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JREhVQik7XHJcblxyXG4gICAgICAgIG9NM1Byb2Nlc28gPSBhd2FpdCBvTTNEYXRhLkdldERhdGFQb3VjaEJEKHNLZXlDYXJyaXRvKTtcclxuICAgICAgICByZXR1cm4gb00zUHJvY2VzbztcclxuICAgIH1cclxuXHJcbiAgICAvL1RyYXNsYWRhciBpbmZvcm1hY2nDs24gZGUgY2Fycml0bywgZG9zIHVzdWFyaW9zXHJcbiAgICBwdWJsaWMgYXN5bmMgTW92ZUNhcnRJbnRvVXNlcihzSURLYXRpb3M6IHN0cmluZywgb00zRGF0YTogTTNEYXRhLCBvRGF0YVVzZXJPcmlnZW46IGFueSwgb0RhdGFVc2VyRGVzdGlubzogYW55LCBmdW5jaW9uT0s6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgdmFyIHNLZXlDYXJyaXRvT3JpZ2VuO1xyXG4gICAgICAgIHZhciBzS2V5Q2Fycml0b0Rlc3Rpbm87XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHNLZXlDYXJyaXRvT3JpZ2VuID0gb00zRGF0YS5HZXRLZXlDYXJyaXRvQ29tcHJhcyhzSURLYXRpb3MsIG9EYXRhVXNlck9yaWdlbi5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvRGF0YVVzZXJPcmlnZW4uVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyT3JpZ2VuLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiwgb0RhdGFVc2VyT3JpZ2VuLlVzdWFyaW9TaXN0ZW1hLklESFVCKTtcclxuICAgICAgICAgICAgc0tleUNhcnJpdG9EZXN0aW5vID0gb00zRGF0YS5HZXRLZXlDYXJyaXRvQ29tcHJhcyhzSURLYXRpb3MsIG9EYXRhVXNlckRlc3Rpbm8uVXN1YXJpb1Npc3RlbWEuVERPQywgb0RhdGFVc2VyRGVzdGluby5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXJEZXN0aW5vLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiwgb0RhdGFVc2VyRGVzdGluby5Vc3VhcmlvU2lzdGVtYS5JREhVQik7XHJcbiAgICAgICAgICAgIGxldCBvTTNQcm9jZXNvID0gYXdhaXQgb00zRGF0YS5HZXREYXRhUG91Y2hCRChzS2V5Q2Fycml0b09yaWdlbik7XHJcblxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvLlREb2MgPSBvRGF0YVVzZXJEZXN0aW5vLlVzdWFyaW9TaXN0ZW1hLlRET0M7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc28uTkRvYyA9IG9EYXRhVXNlckRlc3Rpbm8uVXN1YXJpb1Npc3RlbWEuTkRPQztcclxuICAgICAgICAgICAgZGVsZXRlIG9NM1Byb2Nlc29bXCJfcmV2XCJdO1xyXG4gICAgICAgICAgICBhd2FpdCBvTTNEYXRhLkFkZFRvUG91Y2hCRENhcnJpdG9Db21wcmFzKHNLZXlDYXJyaXRvRGVzdGlubywgb00zUHJvY2Vzbyk7XHJcbiAgICAgICAgICAgIGZ1bmNpb25PSygpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGZ1bmNpb25PSygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlY2FsY3VsYXIgcHJlY2lvcyB0b3RhbGVzIHkgZGUgYmFzZVxyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgUmVjYWxjdWxhclByZWNpb3NQcm9tb0NvbWJpbmFkYShvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIC8vIHZhciBkUHJlY2lvVG90YWw7XHJcbiAgICAgICAgLy8gdmFyIGRQcmVjaW9Ub3RhbEJhc2U7XHJcbiAgICAgICAgLy8gdmFyIGRWYWxvcjogbnVtYmVyID0gMDtcclxuICAgICAgICAvLyB2YXIgZFZhbG9yTmV0bzogbnVtYmVyID0gMDtcclxuXHJcblxyXG4gICAgICAgIC8vIG9NM1Byb2Nlc29zLk0zRU5DLmZvckVhY2goZW5jID0+IHtcclxuICAgICAgICAvLyAgICAgZFByZWNpb1RvdGFsID0gZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yIC8vKCtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpICogKCtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yKTtcclxuICAgICAgICAvLyAgICAgZFByZWNpb1RvdGFsQmFzZSA9IHRoaXMuQ2FsY3VsYXJQcmVjaW9CYXNlRnJvbVByb2Nlc28oZW5jLCBkUHJlY2lvVG90YWwpO1xyXG4gICAgICAgIC8vICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxCQVNFXCIpLlZhbG9yID0gU3RyaW5nKE1hdGgucm91bmQoZFByZWNpb1RvdGFsQmFzZSAqIDEwMCkgLyAxMDApO1xyXG4gICAgICAgIC8vICAgICBkVmFsb3IgPSAoK2RWYWxvcikgKyAoK2RQcmVjaW9Ub3RhbEJhc2UpO1xyXG4gICAgICAgIC8vICAgICBkVmFsb3JOZXRvID0gKCtkVmFsb3JOZXRvKSArICgrZFByZWNpb1RvdGFsKTtcclxuICAgICAgICAvLyAgICAgdGhpcy5SZWNhbGN1bG9JbXB1ZXN0b3MoZW5jLCBkUHJlY2lvVG90YWxCYXNlKTtcclxuICAgICAgICAvLyB9KTtcclxuICAgICAgICAvLyAvL29NM1Byb2Nlc29zLlZhbG9yID0gZFZhbG9yO1xyXG4gICAgICAgIC8vIG9NM1Byb2Nlc29zLlZhbG9yTmV0byA9IGRWYWxvck5ldG87XHJcbiAgICAgICAgdGhpcy5SZWNhbGN1bGFyUHJlY2lvcyhvTTNQcm9jZXNvcyk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vUmVjYWxjdWxhciBwcmVjaW9zLiByZWNvcnJpZW5kbyBsb3MgZW5jYWJlemFkb3MuXHJcbiAgICBwdWJsaWMgUmVjYWxjdWxhclByZWNpb3Mob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICB2YXIgdmFsb3IgPSAwO1xyXG4gICAgICAgIHZhciBWYWxvck5ldG8gPSAwO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLmZvckVhY2goZW5jID0+IHtcclxuICAgICAgICAgICAgLy9KQUdNIDIwMTkxMDEwIHNlIGNhbWJpYSBlbCB2YWxvciBkZWwgcHJlY2lvIHVuaXRhcmlvIGJhc2UsIHlhIHF1ZSBhbCBtb21lbnRvIGRlIGxsYW1hciBsYSBmdW5jacOzbiBWYWxvcmVzQ2FsY3VsYWRvc1Byb2Nlc29cclxuICAgICAgICAgICAgLy8gc2UgcmVjYWxjdWxvIGVsIHByZWNpbyB0b3RhbCwgZGVwZW5kaWVuZG8gZGUgZXN0ZSB2YWxvci5cclxuICAgICAgICAgICAgbGV0IHBUb3RhbEJhc2UgPSB0aGlzLkNhbGN1bGF0ZVByZWNpb0Jhc2UoZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNUQkxESU1QUFJEXCIpLlZhbG9yLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5vTWF0aFRGLnJvdW5kKGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvciwgMikpO1xyXG5cclxuICAgICAgICAgICAgdmFyIGRDYW50aWRhZEVuYyA9ICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcbiAgICAgICAgICAgIGlmICgrZENhbnRpZGFkRW5jICE9IDApIHtcclxuICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9VTklUQkFTRVwiKS5WYWxvciA9ICgrcFRvdGFsQmFzZSAvICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVU5JVEJBU0VcIikuVmFsb3IgPSBcIjBcIjtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcblxyXG5cclxuXHJcbiAgICAgICAgICAgIHRoaXMuVmFsb3Jlc0NhbGN1bGFkb3NQcm9jZXNvKGVuYywgK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5yZWNhbGN1bGFyTTNQcm9jZXNvKG9NM1Byb2Nlc29zKTtcclxuICAgIH1cclxuXHJcbiAgICAvL0NhbGN1bGFyIHByZWNpbyBiYXNlIGRlIHVuIHByZWNpbywgdGVuaWVuZG8gZWwgdmFsb3IgdG90YWwgbyBuZXRvLlxyXG4gICAgcHVibGljIENhbGN1bGFyUHJlY2lvQmFzZUZyb21Qcm9jZXNvKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGRQcmVjaW9OZXRvOiBudW1iZXIpIHtcclxuICAgICAgICB2YXIgZFZhbG9ySW1wdWVzdG86IG51bWJlciA9IDE7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvcy5mb3JFYWNoKGltcCA9PiB7XHJcbiAgICAgICAgICAgICAgICBkVmFsb3JJbXB1ZXN0byA9ICgrZFZhbG9ySW1wdWVzdG8pICsgKCtpbXAuUG9yY2VudGFqZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgoK2RQcmVjaW9OZXRvKSAvICgrZFZhbG9ySW1wdWVzdG8pKTtcclxuICAgIH1cclxuXHJcbiAgICAvL1JlY2FsY3VsbyBkZSB2YWxvciBkZSBpbXB1ZXN0b3MsIGN1YW5kbyBjYW1iaWEgZWwgdmFsb3IuIFNlYSBwb3IgY2FudGlkYWQsIGVsaW1pbmFjacOzbi4uLlxyXG4gICAgLy8gcHVibGljIFJlY2FsY3Vsb0ltcHVlc3RvcyhvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBkUHJlY2lvQmFzZTogbnVtYmVyKSB7XHJcbiAgICAvLyAgICAgdmFyIGRUb3RhbEltcHVlc3RvOiBudW1iZXIgPSAwO1xyXG4gICAgLy8gICAgIG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3MuZm9yRWFjaChpbXAgPT4ge1xyXG4gICAgLy8gICAgICAgICBpbXAuVmFsb3IgPSAoK2RQcmVjaW9CYXNlKSAqICgraW1wLlBvcmNlbnRhamUpO1xyXG4gICAgLy8gICAgICAgICAvL0pBR00gMjAxODA5MTIgbnVldm8gY29uY2VwdG9cclxuICAgIC8vICAgICAgICAgaW1wLkJhc2UgPSBkUHJlY2lvQmFzZTtcclxuICAgIC8vICAgICAgICAgZFRvdGFsSW1wdWVzdG8gPSAoK2RUb3RhbEltcHVlc3RvKSArICgraW1wLlZhbG9yKTtcclxuICAgIC8vICAgICAgICAgLy9TdW1hIGRlIHByZWNpbyBiYXNlIFxyXG4gICAgLy8gICAgICAgICBkUHJlY2lvQmFzZSA9ICgrZFByZWNpb0Jhc2UpICsgKCtpbXAuVmFsb3IpO1xyXG4gICAgLy8gICAgIH0pO1xyXG4gICAgLy8gICAgIGRUb3RhbEltcHVlc3RvID0gTWF0aC5yb3VuZChkVG90YWxJbXB1ZXN0byAqIDEwMCkgLyAxMDA7XHJcbiAgICAvLyAgICAgb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlRPVEFMSU1QVUVTVE9TXCIpLlZhbG9yID0gZFRvdGFsSW1wdWVzdG8udG9TdHJpbmcoKTtcclxuICAgIC8vIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhY2lvbiBudWV2byBNMyBwcm9jZXNvcywgZXN0ZSB2YSB2YWNpbyBzaW4gbmlzaXF1aWVyYSBNM1BFbmNJdGVtcy4gXHJcbiAgICAgKiBTZSB1dGlsaXphIHByaW5jaXBhbG1lbnRlIHBhcmEgbGFzIGNyZWFjaW9uIGRlc2RlIDAgdW4gTTMgUHJvY2Vzby4gUXVlIHBhc2EgZGUgZXN0YWRvcyAnJyBhbCBwcmltZXIgZXN0YWRvXHJcbiAgICAgKiBAcGFyYW0gaW9NM1Byb2Nlc29zIFxyXG4gICAgICogQHBhcmFtIGlkcHJvY2Vzb19kZXN0aW5vIFxyXG4gICAgICogQHBhcmFtIHRkb2MgXHJcbiAgICAgKiBAcGFyYW0gbmRvYyBcclxuICAgICAqIEBwYXJhbSBlc3RhZG9zX2Z1dHVyb3MgXHJcbiAgICAgKiBAcGFyYW0gaWRIdWIgXHJcbiAgICAgKiBAcGFyYW0gaWRVYmljYWNpb24gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBDcmVhdGVNM05ld1Byb2Nlc29FbXB0eShpb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIGlkcHJvY2Vzb19kZXN0aW5vOiBzdHJpbmcsIHRkb2M6IHN0cmluZywgbmRvYzogc3RyaW5nLFxyXG4gICAgICAgIGVzdGFkb3NfZnV0dXJvczogQXJyYXk8YW55PiwgaWRIdWI6IHN0cmluZywgaWRVYmljYWNpb246IHN0cmluZykge1xyXG5cclxuICAgICAgICBpb00zUHJvY2Vzb3MuVE1JZFByb2Nlc28gPSBpZHByb2Nlc29fZGVzdGlubztcclxuICAgICAgICBpb00zUHJvY2Vzb3MuRXN0YWRvQW50ID0gXCJcIjtcclxuICAgICAgICBpb00zUHJvY2Vzb3MuU3ViRXN0YWRvQW50ID0gXCJcIjtcclxuICAgICAgICBpb00zUHJvY2Vzb3MuRXN0YWRvRGVzID0gZXN0YWRvc19mdXR1cm9zWzBdLkVfRGVzdGlubztcclxuICAgICAgICBpb00zUHJvY2Vzb3MuU3ViRXN0YWRvRGVzID0gZXN0YWRvc19mdXR1cm9zWzBdLlNFX0Rlc3Rpbm87XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRIdWIgPSAraWRIdWI7XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRVYmljID0gK2lkVWJpY2FjaW9uO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5JREh1YiA9ICtpZEh1YjtcclxuICAgICAgICBpb00zUHJvY2Vzb3MuVWJpYzEgPSAraWRVYmljYWNpb247XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLlREb2MgPSB0ZG9jO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5ORG9jID0gbmRvYztcclxuICAgICAgICBpb00zUHJvY2Vzb3MuVGlwb1RlcmNlcm8gPSAxO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5VYmljMiA9IC0xO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkSHViUHJlID0gLTE7XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRVYmljUHJlID0gLTE7XHJcbiAgICB9XHJcblxyXG4gICAgLy9DdWFuZG8gc2UgYWdyZWdhIHBvciBwcmltZXJhIHZleiBhbCBjYXJyaXRvIGRlIGNvbXByYS5cclxuICAgIHB1YmxpYyBMb2FkTTNQcm9jZXNvRW1wdHlQREIocHJvZEdSUFNlbGVjdGVkOiBUeXBlTTNQcmRHcnAsIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIsIG9EYXRhVXNlcjogYW55LCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIGlvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkOiBhbnkgPSBudWxsKTogTTNQcm9jZXNvcyB7XHJcbiAgICAgICAgLy9zSURLYXRpb3MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTlxyXG4gICAgICAgIHZhciBvTTNQcm9jZXNvcztcclxuICAgICAgICBpZiAoaW9NM1Byb2Nlc29zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSBpb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSBuZXcgTTNQcm9jZXNvcygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgb00zUHJvY2Vzb3MuRmVjaGEgPSBtb21lbnQobmV3IERhdGUoKSkuZm9ybWF0KCdZWVlZLU1NLUREJyk7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuVGlwb1RlcmNlcm8gPSAxO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLlREb2MgPSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQztcclxuICAgICAgICBvTTNQcm9jZXNvcy5ORG9jID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0M7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuVWJpYzEgPSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLlViaWMyID0gLTE7XHJcbiAgICAgICAgLy8vQUdSRUdBUiBOVUVWQSBGVU5DSU9OQUxJREFEIERFIEhVQlMuIEZMVUpPIERFIFRSQUJBSk9cclxuICAgICAgICBvTTNQcm9jZXNvcy5JREh1YiA9IG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JREhVQjtcclxuICAgICAgICBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkSHViID0gb00zUHJvY2Vzb3MuSURIdWI7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZFViaWMgPSBvTTNQcm9jZXNvcy5VYmljMTtcclxuXHJcbiAgICAgICAgb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZEh1YlByZSA9IC0xO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRVYmljUHJlID0gLTE7XHJcblxyXG4gICAgICAgIC8vL0ZJTiBBR1JFR0FSIE5VRVZBIEZVTkNJT05BTElEQUQgREUgSFVCUy4gRkxVSk8gREUgVFJBQkFKT1xyXG5cclxuICAgICAgICAvLyBvTTNQcm9jZXNvcy5TdWJFc3RhZG9BbnQgPSBcIlwiO1xyXG4gICAgICAgIC8vIG9NM1Byb2Nlc29zLkVzdGFkb0FudCA9IFwiXCI7XHJcblxyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcy5TdWJFc3RhZG9EZXMgPT0gXCJcIiAmJiBpb00zUHJvY2Vzb3MgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5TdWJFc3RhZG9EZXMgPSBcIlJlZ2lzdHJvXCI7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLkVzdGFkb0RlcyA9IFwiQWN0aXZvXCI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAob00zUEl0ZW1zV0VCLlN1YkVzdGFkb19vICE9IFwiXCIgJiYgb00zUEl0ZW1zV0VCLkVzdGFkb19vICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuU3ViRXN0YWRvRGVzID0gb00zUEl0ZW1zV0VCLlN1YkVzdGFkb19vO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5Fc3RhZG9EZXMgPSBvTTNQSXRlbXNXRUIuRXN0YWRvX287XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgaWYgKG9NM1BJdGVtc1dFQi5JZFByb2Nlc28gPT0gXCJcIiAmJiBpb00zUHJvY2Vzb3MgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5UTUlkUHJvY2VzbyA9IFwiTTNFQ0NcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChvTTNQSXRlbXNXRUIuSWRQcm9jZXNvICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zLlRNSWRQcm9jZXNvID0gb00zUEl0ZW1zV0VCLklkUHJvY2VzbztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9vTTNQcm9jZXNvcy5NM0VOQy5wdXNoKHRoaXMuTG9hZE0zUEVuY0l0ZW1zRnJvbVByZEdybChvTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkLCBvTTNQcm9jZXNvcy5NM0VOQywgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIpKTtcclxuICAgICAgICB0aGlzLkxvYWRNM1BFbmNJdGVtc0Zyb21QcmRHcmwob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zUHJvY2Vzb3MuTTNFTkMsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyLCBudWxsLCAwLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQpXHJcblxyXG4gICAgICAgIC8vIG9NM1Byb2Nlc29zLlZhbG9yID0gb00zUEl0ZW1zV0VCLmRQcmVjaW9Ub3RhbDtcclxuICAgICAgICAvLyBvTTNQcm9jZXNvcy5WYWxvck5ldG8gPSBvTTNQSXRlbXNXRUIuZFByZWNpb1RvdGFsO1xyXG5cclxuICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgLy90aGlzLlByb2Nlc2FtaWVudG9TZXJ2aWNlKFBvc3RTZXJ2aWNlTTMsIG9NM1Byb2Nlc29zLCBmdW5jaW9uT0ssIGZ1bmNpb25FcnJvcik7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vQ2FyZ2FyIG51ZXZvcyBhZGljaW9uYWxlcyBhZGljaW9uYWxlc1xyXG4gICAgcHVibGljIExvYWRBZGljaW9uYWxlcyhvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLCBwcm9kdWN0OiBUeXBlTTNQcmRHcnApOiBNM1BJdGVtc1dFQiB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgb00zUEl0ZW1zV0VCLkNsYXZlUHJkU1JWID0gcHJvZHVjdC5Mb00zUHJkQWRpY2lvbmFsZXMuZmluZChhZGkgPT4gYWRpLkFUUklCVVRPID09IFwiQ0xBVkVQUk9EU0VSVlwiKS5WQUxPUjtcclxuICAgICAgICAgICAgb00zUEl0ZW1zV0VCLkNsYXZlUHJkVW5pZGFkID0gcHJvZHVjdC5Mb00zUHJkQWRpY2lvbmFsZXMuZmluZChhZGkgPT4gYWRpLkFUUklCVVRPID09IFwiQ0xBVkVVTklEQURcIikuVkFMT1I7XHJcbiAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5VbmlkYWQgPSBwcm9kdWN0LkxvTTNQcmRBZGljaW9uYWxlcy5maW5kKGFkaSA9PiBhZGkuQVRSSUJVVE8gPT0gXCJVTklEQURcIikuVkFMT1I7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb00zUEl0ZW1zV0VCO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQ2FyZ2FyIHByb2Nlc29zLCByZXRvbWFuZG8gZGVzZGUgZGF0YVxyXG4gICAgcHVibGljIExvYWRNM1Byb2Nlc29Gcm9tRGF0YShvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkOiBUeXBlTTNQcmRHcnAsXHJcbiAgICAgICAgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBvRGF0YVVzZXI6IGFueSwgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkOiBhbnkgPSBudWxsLCB2YWxvckRlc2N1ZW50byA9IDApOiBNM1Byb2Nlc29zIHtcclxuICAgICAgICAvLyBvTTNQcm9jZXNvcy5WYWxvciA9ICgrb00zUHJvY2Vzb3MuVmFsb3IpICsgKCtvTTNQSXRlbXNXRUIuZFByZWNpb1RvdGFsKTtcclxuICAgICAgICAvLyBvTTNQcm9jZXNvcy5WYWxvck5ldG8gPSBvTTNQcm9jZXNvcy5WYWxvcjtcclxuICAgICAgICBvTTNQcm9jZXNvcy5GZWNoYSA9IG1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MuVE1JZFByb2Nlc28gPT0gXCJcIiAmJiBvTTNQSXRlbXNXRUIuSWRQcm9jZXNvICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuVE1JZFByb2Nlc28gPSBvTTNQSXRlbXNXRUIuSWRQcm9jZXNvO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9vTTNQcm9jZXNvcy5NM0VOQy5wdXNoKHRoaXMuTG9hZE0zUEVuY0l0ZW1zRnJvbVByZEdybChvTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkLCBvTTNQcm9jZXNvcy5NM0VOQywgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIpKTtcclxuICAgICAgICB0aGlzLkxvYWRNM1BFbmNJdGVtc0Zyb21QcmRHcmwob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zUHJvY2Vzb3MuTTNFTkMsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyLCBudWxsLCB2YWxvckRlc2N1ZW50bywgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkKVxyXG5cclxuICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIExvYWRNM1BFbmNJdGVtc0Zyb21QcmRHcmwob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZDogVHlwZU0zUHJkR3JwLFxyXG4gICAgICAgIG9lbmNhYmV6YWRvSXRlbXM6IEFycmF5PE0zUEVuY0l0ZW1zPiwgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQixcclxuICAgICAgICBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIG9EYXRhVXNlcjogYW55LCBvUGFkcmVNM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIHZhbG9yRGVzY3VlbnRvID0gMCwgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkOiBhbnkgPSBudWxsKSB7XHJcblxyXG4gICAgICAgIC8vVmFsaWRhY2lvbiBkZSBJbnZlbnRhcmlvLlxyXG4gICAgICAgIGxldCBhZGlWZW50YU5lZyA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkQWRpY2lvbmFsZXMuZmluZCh4ID0+IHguQVRSSUJVVE8gPT0gXCJWRU5UQU5FR1wiKVxyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvc1tcIkludmVudGFyaW9FcnJvclwiXSkge1xyXG4gICAgICAgICAgICBkZWxldGUgb00zUHJvY2Vzb3NbXCJJbnZlbnRhcmlvRXJyb3JcIl07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcy5UTUlkUHJvY2Vzby50b1VwcGVyQ2FzZSgpID09IFwiTTNFQ0NcIiAmJiBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uRElTUE9OSUJMRSA8IG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgJiYgb00zVWJpY2FjaW9uLk0zSFVCU1swXS5UaXBvID09IFwiV0VCXCIgJiYgIShhZGlWZW50YU5lZyAmJiBhZGlWZW50YU5lZy5WQUxPUikpIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3NbXCJJbnZlbnRhcmlvRXJyb3JcIl0gPSAnTm8gaGF5IGludmVudGFyaW8gcGFyYSBhZ3JlZ2FyICcgKyBvTTNQSXRlbXNXRUIuZENhbnRpZGFkICsgJyBJdGVtcyc7XHJcbiAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uRElTUE9OSUJMRTtcclxuICAgICAgICB9IC8vZWxzZSB7XHJcblxyXG4gICAgICAgIHZhciBvTTNQRW5jSXRlbXMgPSBuZXcgTTNQRW5jSXRlbXMoKTtcclxuICAgICAgICBvTTNQcm9jZXNvcy5GZWNoYSA9IG1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcclxuICAgICAgICBvTTNQRW5jSXRlbXMgPSB0aGlzLkxvYWRNM1BFbmNJdGVtc0Zyb21QcmRHcmxJdGVtKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1Byb2Nlc29zLk0zRU5DLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9EYXRhVXNlciwgb1BhZHJlTTNQRW5jSXRlbXMsIHZhbG9yRGVzY3VlbnRvKTtcclxuXHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zW1wiTWVuc2FqZUVycm9yXCJdKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBvTTNQcm9jZXNvc1tcIk1lbnNhamVFcnJvclwiXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9QYWRyZU0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgICAgIC8vVGllbmUgdW4gZW5jYWJlemFkbyBwYWRyZS5cclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLklkRW5jUGFkcmUgPSBvUGFkcmVNM1BFbmNJdGVtcy5JRDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghb00zUEVuY0l0ZW1zW1wiTWVuc2FqZUVycm9yXCJdKSB7XHJcbiAgICAgICAgICAgIHZhciBvbE0zUHJkUGFja0RldDogQXJyYXk8TTNQcmRQYWNrRGV0PjtcclxuICAgICAgICAgICAgb2xNM1ByZFBhY2tEZXQgPSBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTTNQQUNLXHJcbiAgICAgICAgICAgIGlmIChvbE0zUHJkUGFja0RldCAmJiBvbE0zUHJkUGFja0RldC5sZW5ndGggPiAwKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgLy9sZXQgdmFsb3JEZXNjdWVudG9QYWNrID0gdGhpcy5jYWxjdWxhclBvcmNlbnRhamVEZXNjdWVudG9Db21ibyhwcm9kR1JQU2VsZWN0ZWQpO1xyXG5cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2xNM1ByZFBhY2tEZXQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgb00zUHJkUGFja0RldDogTTNQcmRQYWNrRGV0ID0gb2xNM1ByZFBhY2tEZXRbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhY2tNM1BJdGVtc1dFQjogTTNQSXRlbXNXRUI7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvTTNQcmRQYWNrRGV0Lm9NM1BJdGVtc1dFQikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWNrTTNQSXRlbXNXRUIgPSBvTTNQcmRQYWNrRGV0Lm9NM1BJdGVtc1dFQjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tNM1BJdGVtc1dFQiA9IE9iamVjdC5hc3NpZ24oe30sIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tNM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSBvTTNQcmRQYWNrRGV0LkNhbnRpZGFkO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBwYWNrTTNQSXRlbXNXRUIuUGF0aEltYWdlbiA9IG9NM1ByZFBhY2tEZXQuZ3NQYXRoSW1hZ2VuO1xyXG4gICAgICAgICAgICAgICAgICAgIHBhY2tNM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSBwYWNrTTNQSXRlbXNXRUIuZENhbnRpZGFkICogb00zUEl0ZW1zV0VCLmRDYW50aWRhZDtcclxuICAgICAgICAgICAgICAgICAgICAvL3RoaXMuQ2FsY3VsYXJQcmVjaW9zUENLRyhvTTNQcmRQYWNrRGV0KTtcclxuICAgICAgICAgICAgICAgICAgICBwYWNrTTNQSXRlbXNXRUIuSURFbmNSZXBldGlkbyA9ICt0aGlzLkdldE1heEF0cmlidXRvRnJvbUxpc3RhKG9NM1Byb2Nlc29zLk0zRU5DLCBcIklEXCIpICsgaSArIDI7IC8vRXN0byBmdW5jaW9uYSBzaSB0aWVuZSBzb2xvIDIgbml2ZWxlc1xyXG4gICAgICAgICAgICAgICAgICAgIC8vU2kgZXN0byBzZSBjdW1wbGUgZXN0ZSBwcm9kdWN0byBlcyB1biBwYWNrIHkgdGllbmUgcHJvZHVjdG9zIGFzb2NpYWRvcy5cclxuICAgICAgICAgICAgICAgICAgICBvTTNQcmRQYWNrRGV0Lk0zR1JQLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU8gPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcmRHZW5lcmFsID0gb00zUHJkUGFja0RldC5NM0dSUC5Mb00zUHJkR2VuZXJhbFswXS5NM0NvZHMuZmluZCh4ID0+IHguSWRDb2RpZ28gPT0gXCJVUENcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmRHZW5lcmFsICYmIHByZEdlbmVyYWwuVmFsb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tNM1BJdGVtc1dFQi5Db2RpZ29CYXJyYXMgPSBwcmRHZW5lcmFsLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwibm8gYcOxYWRpIGNvZGlnbyBkZSBiYXJyYXMgYSBwcm9kdWN0byBoaWpvOiBcIiArIG9NM1ByZFBhY2tEZXQuU0tVSElKTylcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5Mb2FkTTNQRW5jSXRlbXNGcm9tUHJkR3JsKG9NM1Byb2Nlc29zLCBvTTNQcmRQYWNrRGV0Lk0zR1JQLCBvTTNQcm9jZXNvcy5NM0VOQywgcGFja00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIsIG9NM1BFbmNJdGVtcywgMCwgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9KQUdNIDIwMTkwNjIzLCBlc3RvIGVzIGN1YW5kbyBzZSBtb2RpZmljYSBsYSBjYW50aWRhZCBkZSBwcm9kY3V0b3MgZXhpc3RlbnRlcy5cclxuICAgICAgICAgICAgaWYgKG9NM1BJdGVtc1dFQi5JREVuY1JlcGV0aWRvICE9IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuSUQgPSBvTTNQSXRlbXNXRUIuSURFbmNSZXBldGlkbztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL0pBR00gMjAxOSBlbnZpbyBkZSBwYWRyZSBkZXNkZSBpbnN0cnVjY2lvbiBtYXMgYXJyaWJhXHJcbiAgICAgICAgICAgIGlmIChvTTNQSXRlbXNXRUIuSURFbmNQYWRyZSAhPSAtMSkge1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLklkRW5jUGFkcmUgPSBvTTNQSXRlbXNXRUIuSURFbmNQYWRyZTtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5UaXBvQWdydXBhY2lvbiA9IG9NM1BJdGVtc1dFQi5UaXBvQWdydXBhY2lvbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAob00zUERpbmFtaWNhc0J5QWN0aXZpZGFkICYmIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQuZm9yRWFjaChkaW4gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM1BEaW5hbUJ5QWN0aXZpZGFkLnB1c2goey4uLiBkaW59KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5wdXNoKG9NM1BFbmNJdGVtcyk7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3NbXCJNZW5zYWplRXJyb3JcIl0gPSBvTTNQRW5jSXRlbXNbXCJNZW5zYWplRXJyb3JcIl07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9NM1BJdGVtc1dFQi5JREVuY1Byb2Nlc2FkbyA9IG9NM1BFbmNJdGVtcy5JRDtcclxuICAgICAgICAvL31cclxuICAgIH1cclxuXHJcbiAgICBjYWxjdWxhclBvcmNlbnRhamVEZXNjdWVudG9Db21ibyhwcm9kR1JQU2VsZWN0ZWQ6IFR5cGVNM1ByZEdycCkge1xyXG4gICAgICAgIGxldCB2YWxvckRlc2N1ZW50b1BhY2sgPSAwO1xyXG4gICAgICAgIGxldCB2YWxvckl0ZW1zQ29tYm9TdW1hID0gMDtcclxuICAgICAgICBsZXQgdmFsb3JGaW5hbENvbWJvID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU87XHJcblxyXG4gICAgICAgIHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5NM1BBQ0suZm9yRWFjaChwcmRQYWNrID0+IHtcclxuICAgICAgICAgICAgbGV0IGNhbnRpZGFkID0gcHJkUGFjay5NM0dSUC5DYW50aWRhZCA/IHByZFBhY2suTTNHUlAuQ2FudGlkYWQgOiAxO1xyXG4gICAgICAgICAgICBsZXQgaW5mTml2ZWxlc1ByY2lvID0gdGhpcy5WZXJpZmljYXJQcmVjaW9CeU5pdmVsZXMocHJkUGFjay5NM0dSUCwgY2FudGlkYWQpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKHByZFBhY2suTTNHUlAuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLklETElTVEEpXHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcocHJkUGFjay5NM0dSUC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPKVxyXG4gICAgICAgICAgICB2YWxvckl0ZW1zQ29tYm9TdW1hICs9IChwcmRQYWNrLk0zR1JQLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU8gKiBjYW50aWRhZCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmICh2YWxvckl0ZW1zQ29tYm9TdW1hID4gdmFsb3JGaW5hbENvbWJvKSB7XHJcbiAgICAgICAgICAgIHZhbG9yRGVzY3VlbnRvUGFjayA9IDEwMCAtICh2YWxvckZpbmFsQ29tYm8gKiAxMDAgLyB2YWxvckl0ZW1zQ29tYm9TdW1hKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc29sZS5kZWJ1Zyh2YWxvckRlc2N1ZW50b1BhY2spXHJcbiAgICAgICAgcmV0dXJuIHZhbG9yRGVzY3VlbnRvUGFjaztcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWNhbGN1bG8gZGUgcHJlY2lvcyBkZSBoaWpvcyBkZWwgcGFxdWV0ZVxyXG4gICAgICogQHBhcmFtIG9NM1ByZFBhY2tEZXQgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBDYWxjdWxhclByZWNpb3NQQ0tHKG9NM1ByZFBhY2tEZXQ6IE0zUHJkUGFja0RldCkge1xyXG4gICAgICAgIG9NM1ByZFBhY2tEZXQuTTNHUlAuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTyA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGxvYWRNM1BFbmNJdGVtc0Zyb21Qcm9tb2Npb25Db21ibyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgcHJvZHVjdG9zSGlqb3NEZWxDb21ibzogQXJyYXk8TTNQRW5jSXRlbXM+LCBjb2RpZ286IHN0cmluZywgdmFsb3IsIGRDYW50aWRhZDogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IHByb2R1Y3RvQ29tYm8gPSBuZXcgTTNQRW5jSXRlbXMoKTtcclxuXHJcblxyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uSWRQcm9kdWN0byA9IGNvZGlnbztcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLkxvdGUgPSBcIjFcIjtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLklEID0gK3RoaXMuR2V0TWF4QXRyaWJ1dG9Gcm9tTGlzdGEob00zUHJvY2Vzb3MuTTNFTkMsIFwiSURcIikgKyAxOyAvL0pBR00sIGNhbWJpbyBkZSBJRCwgY2FzbyBjdWFuZG8gc2UgYWdyZWdhIHByZDoxLCBwcmQ6MiB5IGRlIG51ZXZvIHByZDoxLiBFbiBlc3RlIGNhc28gZW4gbMOzZ2ljYSBhbnRlcmlvciwgc2UgaGFjZSByZW1vdmUgZGUgaXRlbS4geSBsb3MgSUQgcXVlZGFiYW4gcmVwZXRpZG9zLlxyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uT3JkZW4gPSArdGhpcy5HZXRNYXhBdHJpYnV0b0Zyb21MaXN0YShvTTNQcm9jZXNvcy5NM0VOQywgXCJPcmRlblwiKSArIDE7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5Ob21icmUgPSBcIkNvbWJvXCI7XHJcblxyXG5cclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShtb21lbnQobmV3IERhdGUoKSkuZm9ybWF0KCdZWVlZLU1NLUREVEhIOm1tOnNzJyksIFwiRkVDSEFJTlwiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCJ0cnVlXCIsIFwiRVNQUk9EUFJPTU9DT01CT1wiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCJ0cnVlXCIsIFwiRVNQUk9EUFJPTU9cIikpOyAvLyBUUlVFLT4gU0kgRVMgVU4gUFJPRFVDVE8gUE9SIFBST01PQ0lPTiwgRkFMU0UtPiBERSBPVFJPIE1PRE9cclxuICAgICAgICAvL0RldGFsbGVzIGRlIGZhY3R1cmEgZWxlY3Ryb25pY2FcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIkVOQ1BST01PXCIsIFwiVElQT19QUkRcIikpO1xyXG4gICAgICAgIC8qKkZJTiBJTkZPUk1BQ0lPTiBHRU5FUkFMICovXHJcblxyXG4gICAgICAgIC8vKiogSU5JQ0lPIFZBTE9SRVMgVU5JVEFSSU9TICovXHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUodmFsb3IsIFwiUFJFQ0lPVU5JVEJBU0VcIikpOyAvL1ByZWNpbyBTaW4gaW1wdWVzdG9zXHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCIwXCIsIFwiVE9UQUxJTVBVRVNUT1NcIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwiMFwiLCBcIlRPVEFMSU1QVU5JVFwiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUodmFsb3IsIFwiUFVOSVRTSU5JTVBVRVNUT1wiKSk7Ly9TaW4gZGVzY3VlbnRvIGluY2x1aWRvIFkgc2luIEltcHVlc3Rvc1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKHZhbG9yLCBcIlBVTklUXCIpKTsvL1NpbiBkZXNjdWVudG8gaW5jbHVpZG8gIC0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSh2YWxvciwgXCJQVU5JVE5FVE9cIikpOy8vQ29uIGRlc2N1ZW50byBpbmNsdWlkby0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIjBcIiwgXCJWVU5JVFBST01PXCIpKTsvL1VuaXRhcmlvIFByb21vY2lvbiAtLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCIwXCIsIFwiVU5JVEZJREVMXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIjBcIiwgXCJUT1RBTElNUFVOSVRcIikpO1xyXG4gICAgICAgIC8vKiogRklOIFZBTE9SRVMgVU5JVEFSSU9TICovXHJcblxyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRDYW50aWRhZC50b1N0cmluZygpLCBcIkNBTlRJREFEXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIjBcIiwgXCJUT1RBTElNUFVFU1RPU1wiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCIwXCIsIFwiRklERUxJWkFDSU9OXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIjBcIiwgXCJUT1RBTFBST01PXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSh2YWxvciwgXCJDVEJMRElNUFBSRFwiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoKCt2YWxvciAqIGRDYW50aWRhZCkudG9TdHJpbmcoKSwgXCJQUkVDSU9UT1RBTFNJTkRUT1wiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoKCt2YWxvciAqIGRDYW50aWRhZCkudG9TdHJpbmcoKSwgXCJTVUJUT1RBTFwiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoKCt2YWxvciAqIGRDYW50aWRhZCkudG9TdHJpbmcoKSwgXCJQUkVDSU9UT1RBTEJBU0VcIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKCgrdmFsb3IgKiBkQ2FudGlkYWQpLnRvU3RyaW5nKCksIFwiUFJFQ0lPVE9UQUxcIikpO1xyXG5cclxuICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5wdXNoKHByb2R1Y3RvQ29tYm8pO1xyXG4gICAgICAgIHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8uZm9yRWFjaChwcm9kdWN0byA9PiB7XHJcbiAgICAgICAgICAgIHByb2R1Y3RvLklEID0gK3RoaXMuR2V0TWF4QXRyaWJ1dG9Gcm9tTGlzdGEob00zUHJvY2Vzb3MuTTNFTkMsIFwiSURcIikgKyAxOyAvL0pBR00sIGNhbWJpbyBkZSBJRCwgY2FzbyBjdWFuZG8gc2UgYWdyZWdhIHByZDoxLCBwcmQ6MiB5IGRlIG51ZXZvIHByZDoxLiBFbiBlc3RlIGNhc28gZW4gbMOzZ2ljYSBhbnRlcmlvciwgc2UgaGFjZSByZW1vdmUgZGUgaXRlbS4geSBsb3MgSUQgcXVlZGFiYW4gcmVwZXRpZG9zLlxyXG4gICAgICAgICAgICBwcm9kdWN0by5JZEVuY1BhZHJlID0gcHJvZHVjdG9Db21iby5JRDtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMucHVzaChwcm9kdWN0byk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMucmVjYWxjdWxhck0zUHJvY2VzbyhvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgcmV0dXJuIHByb2R1Y3RvQ29tYm87XHJcbiAgICB9XHJcblxyXG4gICAgcmVjYWxjdWxhck0zUHJvY2VzbyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGxldCBwcm9kdWN0b3NBcGxTdW1hVmFsb3IgPSBvTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIob00zRU5DID0+IHtcclxuICAgICAgICAgICAgbGV0IGRldENhbnRpZGFkID0gb00zRU5DLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIik7XHJcbiAgICAgICAgICAgIGxldCBkZXRFc1ByZENvbWJvID0gb00zRU5DLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiRVNQUk9EUFJPTU9DT01CT1wiKTtcclxuICAgICAgICAgICAgcmV0dXJuIGRldENhbnRpZGFkICYmICtkZXRDYW50aWRhZC5WYWxvciA+IDAgJiYgIShkZXRFc1ByZENvbWJvICYmIGRldEVzUHJkQ29tYm8uVmFsb3IgPT0gXCJ0cnVlXCIpXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIG9NM1Byb2Nlc29zLlZhbG9yTmV0byA9IDA7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuVmFsb3IgPSAwO1xyXG5cclxuICAgICAgICAvL2ZvciAoY29uc3Qgb00zRU5DIG9mIHRoaXMub00zUHJvY2Vzb3MuTTNFTkMuZmlsdGVyKGVuYyA9PiAhZW5jLklkRW5jUGFkcmUgfHwgZW5jLklkRW5jUGFkcmUgPD0gMCkpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IG9NM0VOQyBvZiBwcm9kdWN0b3NBcGxTdW1hVmFsb3IpIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuVmFsb3JOZXRvICs9ICtvTTNFTkMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvcjtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuVmFsb3IgKz0gK29NM0VOQy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlNVQlRPVEFMXCIpLlZhbG9yO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL0NhcmdhciBNM1Byb2Nlc28gZW5jYWJlemFkbyBpdGVtcywgZGVzZGUgcHJvZHVjdG8gZ2VuZXJhbFxyXG4gICAgcHVibGljIExvYWRNM1BFbmNJdGVtc0Zyb21QcmRHcmxJdGVtKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQ6IFR5cGVNM1ByZEdycCxcclxuICAgICAgICBvZW5jYWJlemFkb0l0ZW1zOiBBcnJheTxNM1BFbmNJdGVtcz4sIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIsXHJcbiAgICAgICAgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBvRGF0YVVzZXI6IGFueSwgb1BhZHJlTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zID0gdW5kZWZpbmVkLCB2YWxvckRlc2N1ZW50byA9IDApOiBNM1BFbmNJdGVtcyB7XHJcblxyXG4gICAgICAgIHZhciBvTTNQRW5jSXRlbXMgPSBuZXcgTTNQRW5jSXRlbXMoKTtcclxuICAgICAgICB2YXIgb00zUHJkR2VuZXJhbDogTTNQcmRHZW5lcmFsO1xyXG4gICAgICAgIHZhciBkUFJFQ0lPVW5pdEJhc2UgPSAwO1xyXG4gICAgICAgIHZhciBpbmZOaXZlbGVzUHJjaW87XHJcbiAgICAgICAgdmFyIG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYTtcclxuICAgICAgICB2YXIgZFRvdGFsSW1wdWVzdG9zVG90YWw6IG51bWJlciA9IDA7XHJcbiAgICAgICAgdmFyIGRVbml0YXJpb01vbmVkZXJvOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIHZhciBkVW5pdGFyaW9Qcm9tbzogbnVtYmVyID0gMDtcclxuXHJcbiAgICAgICAgLy9WZXJpZmljYXIgZWwgcHJlY2lvIGEgdXNhciwgdXNhbmRvIGxhIGxvZ2ljYSBkZSBuaXZlbGVzIGRlIHByZWNpb3MuXHJcbiAgICAgICAgaW5mTml2ZWxlc1ByY2lvID0gdGhpcy5WZXJpZmljYXJQcmVjaW9CeU5pdmVsZXMocHJvZEdSUFNlbGVjdGVkLCBvTTNQSXRlbXNXRUIuZENhbnRpZGFkKTtcclxuICAgICAgICBpZiAodmFsb3JEZXNjdWVudG8gPiAwKSB7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEgPSBuZXcgUHJvbW9jaW9uUHJvY2VzYWRhKCk7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTyAqIHZhbG9yRGVzY3VlbnRvIC8gMTAwO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU8gLSBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYSA9IHRoaXMuQ2FsY3VsYXJQcm9tb2Npb25lcyhvTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL1ZhbGlkYSBzaSBlbCBwcm9kdWN0byBlc3TDoSByZXN0aW5naWRvXHJcbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkYXJQcm9kdWN0b1Jlc3RyaW5naWRvKG9Qcm9tb2Npb25Qcm9jZXNhZGEpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQXNpZ25hclByb21vY2lvbmVzQ29tYmluYWRhcyhvTTNQcm9jZXNvcywgb1Byb21vY2lvblByb2Nlc2FkYSwgb00zUEVuY0l0ZW1zKTtcclxuXHJcbiAgICAgICAgICAgIC8vQ2FsY3VsbyBkZWwgdG90YWwgZGUgcHVudG9zIHkgZWwgdmFsb3IgdG90YWwgZGUgbGEgcHJvbW9jacOzbiBwb3IgbGEgY3FhbnRpZGFkIGRlIHByb2R1Y3RvcyBkZSBsYSBtaXNtYSByZWZlcmVuY2lhXHJcbiAgICAgICAgICAgIGRVbml0YXJpb01vbmVkZXJvID0gb1Byb21vY2lvblByb2Nlc2FkYS5WYWxvclRvdGFsTW9uZWRlcm87IC8vVW5pdGFyaW8gTW9uZWRlcm9cclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5WYWxvclRvdGFsTW9uZWRlcm8gPSArYmlnRGVjaW1hbC5tdWx0aXBseShvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybywgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCk7IC8vTm8gc2UgdXRpbGl6YSwgc2UgZGVqYSBwYXJhIHVzb3MgYWRlbGFudGVcclxuXHJcbiAgICAgICAgICAgIGRVbml0YXJpb1Byb21vID0gb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbjsgLy9Qcm9tb2Npb24gdW5pdGFyaW9cclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9ICtiaWdEZWNpbWFsLm11bHRpcGx5KG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24sIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQpOyAvL05vIHNlIHV0aWxpemEsIHNlIGRlamEgcGFyYSB1c29zIGFkZWxhbnRlXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RldEN1cG9uZXMgPSB0aGlzLmdldF9saXN0X2N1cG9uZXNfZnJvbV9wcm9tbyhvUHJvbW9jaW9uUHJvY2VzYWRhLCArb00zUEl0ZW1zV0VCLmRDYW50aWRhZCk7XHJcblxyXG4gICAgICAgICAgICAvL0NhbGN1bG8gZGUgcHJlY2lvIHRvdGFsLCBkZXNwdWVzIGRlIHByb21vY2lvbmVzXHJcbiAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5kUHJlY2lvVG90YWwgPSArYmlnRGVjaW1hbC5tdWx0aXBseShvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsLCBvTTNQSXRlbXNXRUIuZENhbnRpZGFkKTtcclxuXHJcbiAgICAgICAgICAgIC8vQ2FyZ2FyIHByb2R1Y3RvIFxyXG4gICAgICAgICAgICBvTTNQcmRHZW5lcmFsID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdO1xyXG5cclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLklkUHJvZHVjdG8gPSBvTTNQcmRHZW5lcmFsLlNLVTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLkxvdGUgPSBvTTNQcmRHZW5lcmFsLkxPVEU7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5JRCA9ICt0aGlzLkdldE1heEF0cmlidXRvRnJvbUxpc3RhKG9lbmNhYmV6YWRvSXRlbXMsIFwiSURcIikgKyAxOyAvL0pBR00sIGNhbWJpbyBkZSBJRCwgY2FzbyBjdWFuZG8gc2UgYWdyZWdhIHByZDoxLCBwcmQ6MiB5IGRlIG51ZXZvIHByZDoxLiBFbiBlc3RlIGNhc28gZW4gbMOzZ2ljYSBhbnRlcmlvciwgc2UgaGFjZSByZW1vdmUgZGUgaXRlbS4geSBsb3MgSUQgcXVlZGFiYW4gcmVwZXRpZG9zLlxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuT3JkZW4gPSArdGhpcy5HZXRNYXhBdHJpYnV0b0Zyb21MaXN0YShvZW5jYWJlemFkb0l0ZW1zLCBcIk9yZGVuXCIpICsgMTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk5vbWJyZSA9IG9NM1ByZEdlbmVyYWwuTk9NQlJFMTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLkRJU1BPTklCTEUgPSBvTTNQcmRHZW5lcmFsLkRJU1BPTklCTEU7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5QYXRoSW1hZ2UgPSBvTTNQSXRlbXNXRUIuUGF0aEltYWdlbjtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLkNvZGlnb0JhcnJhcyA9IG9NM1BJdGVtc1dFQi5Db2RpZ29CYXJyYXM7XHJcbiAgICAgICAgICAgIGxldCBwVG90YWxCYXNlID0gdGhpcy5DYWxjdWxhdGVQcmVjaW9CYXNlKG9NM1ByZEdlbmVyYWwuQ1RCTERJTVBQUkQsIHRoaXMub01hdGhURi5yb3VuZChiaWdEZWNpbWFsLm11bHRpcGx5KG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwsIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQpLCAyKSk7XHJcbiAgICAgICAgICAgIGlmIChvTTNQSXRlbXNXRUIuZENhbnRpZGFkICE9IDApIHtcclxuICAgICAgICAgICAgICAgIGRQUkVDSU9Vbml0QmFzZSA9IHBUb3RhbEJhc2UgLyBvTTNQSXRlbXNXRUIuZENhbnRpZGFkO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZFBSRUNJT1VuaXRCYXNlID0gMDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZFRvdGFsSW1wdWVzdG9zVG90YWwgPSB0aGlzLkxvYWRNM1BJbXB1ZXN0b3NGcm9tUHJkR3JsKG9NM1ByZEdlbmVyYWwuQ1RCTERJTVBQUkQsIG9NM1BFbmNJdGVtcywgcFRvdGFsQmFzZSwgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCwgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCk7XHJcblxyXG4gICAgICAgICAgICAvKiogSU5JQ0lPIElORk9STUFDSU9OIEdFTkVSQUwgKi9cclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShtb21lbnQobmV3IERhdGUoKSkuZm9ybWF0KCdZWVlZLU1NLUREVEhIOm1tOnNzJyksIFwiRkVDSEFJTlwiKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1ByZEdlbmVyYWwuQ1RCTERQUkQsIFwiQ1RCTERQUkRcIikpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQSXRlbXNXRUIuQmlzT2JzZXF1aW8udG9TdHJpbmcoKSwgXCJFU09CU0VRVUlPXCIpKTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQcmRHZW5lcmFsLlNLUDEsIFwiUFJEX0VTVElMT1wiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUHJkR2VuZXJhbC5DVEJMRElNUFBSRCwgXCJDVEJMRElNUFBSRFwiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUEl0ZW1zV0VCLm9ic2VydmFjaW9uLnRvU3RyaW5nKCksIFwiT0JTRVJWQUNJT05cIikpOyAgICAgICAgICAgICAgICAgIC8vLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgICAgICBpZiAob00zUEl0ZW1zV0VCLlBhdGhJbWFnZW4pIHtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUEl0ZW1zV0VCLlBhdGhJbWFnZW4sIFwiUEFUSElNQUdFTlwiKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQSXRlbXNXRUIuQmlzUHJvZHVjdG9Qcm9tby50b1N0cmluZygpLCBcIkVTUFJPRFBST01PXCIpKTsgLy8gVFJVRS0+IFNJIEVTIFVOIFBST0RVQ1RPIFBPUiBQUk9NT0NJT04sIEZBTFNFLT4gREUgT1RSTyBNT0RPXHJcbiAgICAgICAgICAgIC8vRGV0YWxsZXMgZGUgZmFjdHVyYSBlbGVjdHJvbmljYVxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKHByb2RHUlBTZWxlY3RlZC5USVBPLCBcIlRJUE9fUFJEXCIpKTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQSXRlbXNXRUIuVW5pZGFkLCBcIlVOSURBRFwiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUEl0ZW1zV0VCLkNsYXZlUHJkU1JWLCBcIkNMQVZFUFJPRFNFUlZcIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1BJdGVtc1dFQi5DbGF2ZVByZFVuaWRhZCwgXCJDTEFWRVVOSURBRFwiKSk7XHJcbiAgICAgICAgICAgIHRoaXMuQWRkSXRlbXNJbnRlcmZheihvTTNQRW5jSXRlbXMsIHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICB0aGlzLkFkaWNpb25hbGVzVG9EZXRhbGxlcyhvTTNQRW5jSXRlbXMsIHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkQWRpY2lvbmFsZXMpXHJcbiAgICAgICAgICAgIHRoaXMuY2FtcG9zQWRpY2lvbmFsZXNUb0RldGFsbGVzKG9NM1BFbmNJdGVtcywgb00zUEl0ZW1zV0VCKVxyXG4gICAgICAgICAgICB0aGlzLkxvYWREZXRhbGxlTml2ZWxlc1ByZWNpbyhpbmZOaXZlbGVzUHJjaW8sIG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgIHRoaXMuQWRkSW5mb1Byb21vY2lvbmVzQURldGFsbGUob1Byb21vY2lvblByb2Nlc2FkYSwgb00zUEVuY0l0ZW1zLCBvTTNQSXRlbXNXRUIuZENhbnRpZGFkKTsgLy8gTGlzdGEgZGUgUHJvbW9jaW9uZXMgXHJcbiAgICAgICAgICAgIC8qKkZJTiBJTkZPUk1BQ0lPTiBHRU5FUkFMICovXHJcblxyXG4gICAgICAgICAgICAvLyoqIElOSUNJTyBWQUxPUkVTIFVOSVRBUklPUyAqL1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRQUkVDSU9Vbml0QmFzZS50b1N0cmluZygpLCBcIlBSRUNJT1VOSVRCQVNFXCIpKTsgLy9QcmVjaW8gU2luIGltcHVlc3Rvc1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRUb3RhbEltcHVlc3Rvc1RvdGFsLnRvU3RyaW5nKCksIFwiVE9UQUxJTVBVRVNUT1NcIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKCh0aGlzLm9NYXRoVEYucm91bmQodGhpcy5HZXRVbml0YXJpb0J5VG90YWwob00zUEl0ZW1zV0VCLmRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlRPVEFMSU1QVUVTVE9TXCIpLCAyKSkudG9TdHJpbmcoKSwgXCJUT1RBTElNUFVOSVRcIikpO1xyXG4gICAgICAgICAgICAvL29NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoKCtvTTNQcmRHZW5lcmFsLkxvTTNQcmRMaXN0YS5QUkVDSU8gLSArZFRvdGFsSW1wdWVzdG9zVW5pdGFyaW8pLnRvU3RyaW5nKCksIFwiUFVOSVRTSU5JTVBVRVNUT1wiKSk7Ly9TaW4gZGVzY3VlbnRvIGluY2x1aWRvIFkgc2luIEltcHVlc3RvcyAvLy0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSgoK2RQUkVDSU9Vbml0QmFzZSArIGRVbml0YXJpb1Byb21vKS50b1N0cmluZygpLCBcIlBVTklUU0lOSU1QVUVTVE9cIikpOy8vU2luIGRlc2N1ZW50byBpbmNsdWlkbyBZIHNpbiBJbXB1ZXN0b3MgLy8tLS0tLS0gTnVuY2EgQ2FtYmlhIC8vRlMgMjAxOTA3MjUgQ29ycmVjY2lvbiBlbiBsYSBmb21yYSBkZSBjYWxjdWxhcmxvXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUHJkR2VuZXJhbC5Mb00zUHJkTGlzdGEuUFJFQ0lPLnRvU3RyaW5nKCksIFwiUFVOSVRcIikpOy8vU2luIGRlc2N1ZW50byBpbmNsdWlkbyAgLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwudG9TdHJpbmcoKSwgXCJQVU5JVE5FVE9cIikpOy8vQ29uIGRlc2N1ZW50byBpbmNsdWlkby0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkVW5pdGFyaW9Nb25lZGVyby50b1N0cmluZygpLCBcIlVOSVRGSURFTFwiKSk7Ly9Vbml0YXJpbyBmaWRlbGl6YWNpb24gLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRVbml0YXJpb1Byb21vLnRvU3RyaW5nKCksIFwiVlVOSVRQUk9NT1wiKSk7Ly9Vbml0YXJpbyBQcm9tb2Npb24gLS0tLS0tIE51bmNhIENhbWJpYVxyXG5cclxuICAgICAgICAgICAgLy8qKiBGSU4gVkFMT1JFUyBVTklUQVJJT1MgKi9cclxuXHJcbiAgICAgICAgICAgIC8vICoqKiBJbmZvcm1hY2lvbiBkZSBhY2Npb25lcyBlbiBlbCBjbGllbnRlICoqKlxyXG4gICAgICAgICAgICBpZiAocHJvZEdSUFNlbGVjdGVkLmVuY29udHJhZG9Mb2NhbCkge1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIkxPQ0FMXCIsIFwiQ09OU1VMVE9FTlwiKSk7Ly9Vbml0YXJpbyBQcm9tb2Npb24gLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIlNFUlZJRE9SXCIsIFwiQ09OU1VMVE9FTlwiKSk7Ly9Vbml0YXJpbyBQcm9tb2Npb24gLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgdGhpcy5WYWxvcmVzQ2FsY3VsYWRvc1Byb2Nlc28ob00zUEVuY0l0ZW1zLCBvTTNQSXRlbXNXRUIuZENhbnRpZGFkKTtcclxuXHJcbiAgICAgICAgICAgIC8vaWYgKCFvUGFkcmVNM1BFbmNJdGVtcykge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5WYWxvciA9ICgrb00zUHJvY2Vzb3MuVmFsb3IpICsgKCtvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiU1VCVE9UQUxcIikuVmFsb3IpIC8vICgrb00zUEl0ZW1zV0VCLmRQcmVjaW9Ub3RhbCk7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlZhbG9yTmV0byA9ICgrb00zUHJvY2Vzb3MuVmFsb3JOZXRvKSArICgrb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yKTtcclxuICAgICAgICAgICAgLy99XHJcblxyXG4gICAgICAgICAgICAvL1ZlcmlmaWNhciBvYnNlcXVpb3MgZGVsIHByb2R1Y3RvIHF1ZSBzZSBpbmdyZXNvIGFsIGNhcnJpdG8gZGUgY29tcHJhc1xyXG4gICAgICAgICAgICB0aGlzLlZlcmlmaWNhck9ic2VxdWlvcyhvUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNQSXRlbXNXRUIuZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICB0aGlzLnR1cm5PblByb21vcyhvUHJvbW9jaW9uUHJvY2VzYWRhKVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zW1wiTWVuc2FqZUVycm9yXCJdID0gXCJQcm9kdWN0byBSZXN0cmluZ2lkb1wiO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG9NM1BFbmNJdGVtcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgdHJ1ZSBzaSBlc3RlIHByb2R1Y3RvIHNlIGVuY3VlbnRyYSByZXN0cmluZ2lkb1xyXG4gICAgICogQHBhcmFtIG9Qcm9tb2Npb25Qcm9jZXNhZGEgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB2YWxpZGFyUHJvZHVjdG9SZXN0cmluZ2lkbyhvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAob1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMpIHtcclxuICAgICAgICAgICAgbGV0IHByb21vUmVzdHJpbmdpZG8gPSBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcy5maW5kKHggPT4geC5UaXBvID09IFwiUkVTVFJJQ0NJT05cIik7XHJcbiAgICAgICAgICAgIGlmIChwcm9tb1Jlc3RyaW5naWRvKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGVsIG3DoXhpbW8gdmFsb3IgZGUgdW4gYXRyaWJ1dG8gZGVudHJvIGRlIGxhIGxpc3RhIGN1YWxxdWllcmEgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRNYXhBdHJpYnV0b0Zyb21MaXN0YShsaXN0YSwgYXRyaWJ1dG8pIHtcclxuICAgICAgICBpZiAobGlzdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBsZXQgbGlzdElEID0gbGlzdGEubWFwKHggPT4geFthdHJpYnV0b10pO1xyXG4gICAgICAgICAgICByZXR1cm4gTWF0aC5tYXguYXBwbHkoTWF0aCwgbGlzdElEKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsb3JlcyBDYWxjdWxhZG9zIHBvciBwcm9jZXNvLlxyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBcclxuICAgICAqIEBwYXJhbSBkQ2FudGlkYWQgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWYWxvcmVzQ2FsY3VsYWRvc1Byb2Nlc28ob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgZENhbnRpZGFkOiBudW1iZXIpIHtcclxuICAgICAgICAvKiogSU5JQ0lPIFZBTE9SRVMgRElOQU1JQ09TICovXHJcbiAgICAgICAgLy8gdmFyIGRUb3RhbEltcHVlc3RvcyA9ICgrdGhpcy5HZXRUb3RhbEJ5VW5pdGFyaW8oZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiVE9UQUxJTVBVTklUXCIpKTtcclxuICAgICAgICAvLyB2YXIgZFByZWNpb1RvdGFsU2luRHRvID0gdGhpcy5HZXRUb3RhbEJ5VW5pdGFyaW8oZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiUFVOSVRcIilcclxuICAgICAgICAvLyB2YXIgZFN1YlRvdGFsID0gTWF0aC5yb3VuZCgoK2RQcmVjaW9Ub3RhbFNpbkR0byAtICtkVG90YWxJbXB1ZXN0b3MpICogMTAwKSAvIDEwMDtcclxuXHJcbiAgICAgICAgbGV0IHN1YlRvdGFsID0gMDtcclxuICAgICAgICBsZXQgcHJlY2lvVG90YWxTaW5EdG8gPSAwO1xyXG4gICAgICAgIGxldCB0b3RhbEltcHVlc3Rvc1xyXG4gICAgICAgIC8vQWdyZWdhciBJbXB1ZXN0b3NcclxuICAgICAgICB0b3RhbEltcHVlc3RvcyA9IHRoaXMuYWdyZWdhckltcHVlc3RvKG9NM1BFbmNJdGVtcywgZENhbnRpZGFkKTtcclxuXHJcbiAgICAgICAgLy9GUyAyMDE5MDcyNSBBcnJlZ2xvIGVuIGVsIGNhbGN1bG8gZGUgdG90YWxlcyBlbiBjYXNvIGRlIGhhYmVyIGltcHVlc3Rvc1xyXG4gICAgICAgIGlmIChvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgLy9TdWJ0b3RhbCBTdW1hcyBkZSBsYXMgYmFzZXNcclxuICAgICAgICAgICAgc3ViVG90YWwgPSB0aGlzLm9NYXRoVEYucm91bmQoKCh0aGlzLm9NYXRoVEYucm91bmQoK3RoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlBSRUNJT1VOSVRCQVNFXCIpLCAyKSkgKyAoK3RoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlZVTklUUFJPTU9cIikpKSwgMik7XHJcbiAgICAgICAgICAgIHRvdGFsSW1wdWVzdG9zID0gdGhpcy5nZXRWYWxvclRvdGFsRnJvbUltcHVlc3RvcyhvTTNQRW5jSXRlbXMsIFwiVmFsb3JcIik7XHJcbiAgICAgICAgICAgIHByZWNpb1RvdGFsU2luRHRvID0gc3ViVG90YWwgKyB0b3RhbEltcHVlc3RvcztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vU2UgYXN1bWUgcXVlIG5vIGhheSBpbXB1ZXN0b3MgZW50b25jZXMgZWwgc3ViVG90YWwgZXMgaWd1YWwgYWwgcHJlY2lvVG90YWxTaW5EdG9cclxuICAgICAgICAgICAgcHJlY2lvVG90YWxTaW5EdG8gPSB0aGlzLm9NYXRoVEYucm91bmQodGhpcy5HZXRUb3RhbEJ5VW5pdGFyaW8oZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiUFVOSVRcIiksIDIpO1xyXG4gICAgICAgICAgICBzdWJUb3RhbCA9IHByZWNpb1RvdGFsU2luRHRvO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgZENhbnRpZGFkLnRvU3RyaW5nKCksIFwiQ0FOVElEQURcIik7XHJcbiAgICAgICAgdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgKHRoaXMub01hdGhURi5yb3VuZCh0b3RhbEltcHVlc3RvcywgMikpLnRvU3RyaW5nKCksIFwiVE9UQUxJTVBVRVNUT1NcIik7XHJcbiAgICAgICAgdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgKHRoaXMub01hdGhURi5yb3VuZCgrdGhpcy5HZXRVbml0YXJpb0J5VG90YWwoZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiVE9UQUxJTVBVRVNUT1NcIiksIDIpKS50b1N0cmluZygpLCBcIlRPVEFMSU1QVU5JVFwiKTtcclxuXHJcbiAgICAgICAgLy9MYSBmaWRlbGl6YWNpb24gZXMgdW4gcG9yY2FudGFqZSBwb3IgZW5kZSBubyBkZWJlIG11bHRpcGxpY2Fyc2UgdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgdGhpcy5HZXRUb3RhbEJ5VW5pdGFyaW8oZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiVU5JVEZJREVMXCIpLnRvU3RyaW5nKCksIFwiRklERUxJWkFDSU9OXCIpO1xyXG4gICAgICAgIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsIG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJVTklURklERUxcIikuVmFsb3IsIFwiRklERUxJWkFDSU9OXCIpO1xyXG4gICAgICAgIC8vdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgKHRoaXMub01hdGhURi5yb3VuZCgrdGhpcy5HZXRUb3RhbEJ5VW5pdGFyaW8oZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiUFVOSVRORVRPXCIpLCAyKSkudG9TdHJpbmcoKSwgXCJQUkVDSU9UT1RBTFwiKTtcclxuICAgICAgICAvL3RoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsICgrdGhpcy5HZXRUb3RhbEJ5VW5pdGFyaW8oZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiUFVOSVRORVRPXCIpKS50b1N0cmluZygpLCBcIlBSRUNJT1RPVEFMUkVBTFwiKTtcclxuICAgICAgICB0aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCBwcmVjaW9Ub3RhbFNpbkR0by50b1N0cmluZygpLCBcIlBSRUNJT1RPVEFMU0lORFRPXCIpO1xyXG4gICAgICAgIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsIHN1YlRvdGFsLnRvU3RyaW5nKCksIFwiU1VCVE9UQUxcIik7XHJcbiAgICAgICAgdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgbW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWS1NTS1ERCcpLCBcIkZVVFwiKTtcclxuICAgICAgICB0aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCAodGhpcy5vTWF0aFRGLnJvdW5kKCt0aGlzLkdldFRvdGFsQnlVbml0YXJpbyhkQ2FudGlkYWQsIG9NM1BFbmNJdGVtcywgXCJWVU5JVFBST01PXCIpLCAyKSkudG9TdHJpbmcoKSwgXCJUT1RBTFBST01PXCIpO1xyXG4gICAgICAgIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsICh0aGlzLm9NYXRoVEYucm91bmQoK3RoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlBSRUNJT1VOSVRCQVNFXCIpLCAyKSkudG9TdHJpbmcoKSwgXCJQUkVDSU9UT1RBTEJBU0VcIik7IC8vUHJlY2lvIFNpbiBpbXB1ZXN0b3MgICAgICAgIFxyXG4gICAgICAgIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsICh0aGlzLm9NYXRoVEYucm91bmQoKHN1YlRvdGFsICsgK29NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJUT1RBTElNUFVFU1RPU1wiKS5WYWxvciAtICtvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVE9UQUxQUk9NT1wiKS5WYWxvciksIDIpKS50b1N0cmluZygpLCBcIlBSRUNJT1RPVEFMXCIpO1xyXG5cclxuICAgICAgICAvKiogRklOIFZBTE9SRVMgRElOQU1JQ09TICovXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGxhIHN1bWF0b3JpYSBkZSBsb3MgdmFsb3JlcyBkZSB1biBhdHJpYnV0byBkYWRvIGRlbCBhcnJlZ2xvIGRlIGltcHVlc3Rvc1xyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBcclxuICAgICAqIEBwYXJhbSBhdHJpYnV0byBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFZhbG9yVG90YWxGcm9tSW1wdWVzdG9zKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGF0cmlidXRvOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgICAgIGxldCBzdW1hdG9yaWEgPSAwO1xyXG4gICAgICAgIGZvciAobGV0IF9pID0gMDsgX2kgPCBvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICBjb25zdCBpbXB1ZXN0byA9IG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3NbX2ldO1xyXG4gICAgICAgICAgICBzdW1hdG9yaWEgPSBzdW1hdG9yaWEgKyAoK2ltcHVlc3RvW2F0cmlidXRvXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzdW1hdG9yaWE7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZ3JlZ2FySW1wdWVzdG8ob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgY2FudGlkYWQ6IG51bWJlcikge1xyXG4gICAgICAgIGxldCBkZXRfY3RibGRfaW1wX3ByZCA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDVEJMRElNUFBSRFwiKTtcclxuICAgICAgICBsZXQgZGV0X3ByZWNpb191bml0X2Jhc2UgPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVU5JVEJBU0VcIik7XHJcbiAgICAgICAgbGV0IHZhbG9yVG90YWxJbXB1ZXN0b3M6IG51bWJlciA9IDA7XHJcbiAgICAgICAgaWYgKGRldF9jdGJsZF9pbXBfcHJkICYmIGRldF9wcmVjaW9fdW5pdF9iYXNlKSB7XHJcbiAgICAgICAgICAgIHZhbG9yVG90YWxJbXB1ZXN0b3MgPSB0aGlzLkxvYWRNM1BJbXB1ZXN0b3NGcm9tUHJkR3JsKGRldF9jdGJsZF9pbXBfcHJkLlZhbG9yLCBvTTNQRW5jSXRlbXMsICtiaWdEZWNpbWFsLm11bHRpcGx5KGRldF9wcmVjaW9fdW5pdF9iYXNlLlZhbG9yLCBjYW50aWRhZCksIGNhbnRpZGFkLCArb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB2YWxvclRvdGFsSW1wdWVzdG9zO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCB2YWxvcjogc3RyaW5nLCBzQ29uY2VwdG86IHN0cmluZykge1xyXG4gICAgICAgIHZhciBvRGV0OiBNM1BEZXRhbGxlSXRlbXM7XHJcbiAgICAgICAgb0RldCA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gc0NvbmNlcHRvKTtcclxuICAgICAgICBpZiAob0RldCkge1xyXG4gICAgICAgICAgICAvLyBFeGlzdGUgQWN0dWFsaXphXHJcbiAgICAgICAgICAgIG9EZXQuVmFsb3IgPSB2YWxvcjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvL05vIGV4aXN0ZSBhZ3JlZ2FcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSh2YWxvci50b1N0cmluZygpLCBzQ29uY2VwdG8pKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIHZhbG9yIHRvdGFsXHJcbiAgICAgKiBAcGFyYW0gY2FudGlkYWQgTnVldmEgQ2FudGlkYWQgXHJcbiAgICAgKiBAcGFyYW0gb00zUEVuY0l0ZW1zIFxyXG4gICAgICogQHBhcmFtIERlc2NVbml0YXJpbyBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBHZXRUb3RhbEJ5VW5pdGFyaW8oY2FudGlkYWQ6IG51bWJlciwgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgRGVzY1VuaXRhcmlvOiBzdHJpbmcpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgdW5pdGFyaW8gPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IERlc2NVbml0YXJpbykuVmFsb3I7XHJcbiAgICAgICAgICAgIHJldHVybiArYmlnRGVjaW1hbC5tdWx0aXBseSh1bml0YXJpbywgY2FudGlkYWQpO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIHZhbG9yIHVuaXRhcmlvXHJcbiAgICAgKiBAcGFyYW0gY2FudGlkYWQgXHJcbiAgICAgKiBAcGFyYW0gb00zUEVuY0l0ZW1zIFxyXG4gICAgICogQHBhcmFtIERlc2NUb3RhbCBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBHZXRVbml0YXJpb0J5VG90YWwoY2FudGlkYWQ6IG51bWJlciwgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgRGVzY1RvdGFsOiBzdHJpbmcpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAoK2NhbnRpZGFkID09IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciB0b3RhbCA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gRGVzY1RvdGFsKS5WYWxvcjtcclxuICAgICAgICAgICAgcmV0dXJuICt0b3RhbCAvICtjYW50aWRhZDtcclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRpY2lvbmFyIGRldGFsbGVzIHJlbGFjaW9uYWRvcyBjb24gbGEgaW5mb3JtYWNpb24gZGUgc3cgZXh0ZXJuby5cclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgT2JqZXRvIGRvbmRlIHNlIGd1YXJkYXLDoSBsb3MgbnVldm9zIGF0cmlidXRvcy5cclxuICAgICAqIEBwYXJhbSBvQWRpY2lvbmFsZXMgRGVzZGUgZG9uZGUgc2Ugc2FjYXLDoSBsYSBpbmZvcm1hY2nDs24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGRJdGVtc0ludGVyZmF6KG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIG9BZGljaW9uYWxlczogQXJyYXk8TTNQcmRBZGljaW9uYWxlcz4pIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgb0FkaWNpb25hbGVzRmlsdGVyOiBBcnJheTxNM1ByZEFkaWNpb25hbGVzPjtcclxuICAgICAgICAgICAgb0FkaWNpb25hbGVzRmlsdGVyID0gb0FkaWNpb25hbGVzLmZpbHRlcihhID0+IGEuQVRSSUJVVE8uc3RhcnRzV2l0aChcIkNTSUFfXCIpKTtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvQWRpY2lvbmFsZXNGaWx0ZXIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob0FkaWNpb25hbGVzRmlsdGVyW2ldLlZBTE9SLCBvQWRpY2lvbmFsZXNGaWx0ZXJbaV0uQVRSSUJVVE8pKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgZGV0YWxsZXMgXHJcbiAgICAgKiBAcGFyYW0gb00zUEVuY0l0ZW1zIE9iamV0byBkb25kZSBzZSBndWFyZGFyw6EgbG9zIG51ZXZvcyBhdHJpYnV0b3MuXHJcbiAgICAgKiBAcGFyYW0gb0FkaWNpb25hbGVzIERlc2RlIGRvbmRlIHNlIHNhY2Fyw6EgbGEgaW5mb3JtYWNpw7NuLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWRpY2lvbmFsZXNUb0RldGFsbGVzKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIG9BZGljaW9uYWxlczogQXJyYXk8TTNQcmRBZGljaW9uYWxlcz4pIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9BZGljaW9uYWxlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvQWRpY2lvbmFsZXNbaV0uVkFMT1IsIFwiQURDX1wiICsgb0FkaWNpb25hbGVzW2ldLkFUUklCVVRPKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY2FtcG9zQWRpY2lvbmFsZXNUb0RldGFsbGVzKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9NM1BJdGVtc1dFQi5DYW1wb3NBZGljaW9uYWxlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQSXRlbXNXRUIuQ2FtcG9zQWRpY2lvbmFsZXNbaV0uVkFMT1IsIFwiQ0FNQURDX1wiICsgb00zUEl0ZW1zV0VCLkNhbXBvc0FkaWNpb25hbGVzW2ldLkFUUklCVVRPKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWdyZWdhciBpbmZvcm1hY2lvbiBkZSBwcm9tb2Npb25lcyBOb21icmUsIElELiBhIGRldGFsbGUgZGVsIGVuY2FiZXphZG8gZGUgcHJvZHVjdG8gYWdyZWdhZG9cclxuICAgICAqIEBwYXJhbSBvUHJvbW9jaW9uUHJvY2VzYWRhIEluZm9ybWFjaW9uIGRlIHByb21vY2lvbmVzIHByb2Nlc2FkYXNcclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgRW5jYWJlemFkbyBkZSBpdGVtc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2VuZXJhckluZm9Qcm9tb2Npb25lc1Byb2Nlc2FkYXMob1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhLCBpQ2FudGlkYWQ6IG51bWJlciwgYXBsaWNhZGFzID0gdHJ1ZSkge1xyXG4gICAgICAgIHZhciBzTm9tYnJlczogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICB2YXIgc0lkczogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICB2YXIgc1ZhbG9yZXM6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgdmFyIGRhdGE7XHJcbiAgICAgICAgaWYgKG9Qcm9tb2Npb25Qcm9jZXNhZGEgJiYgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMgJiYgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBpZiAoYXBsaWNhZGFzKSB7XHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcy5maWx0ZXIoeCA9PiB4LkFwbGljYWRhKS5maWx0ZXIoeCA9PiB4LlByb21vY2lvbkNvbWJpbmFkYSA9PSBudWxsKS5mb3JFYWNoKHByb21vID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBzTm9tYnJlcyA9IHNOb21icmVzICsgcHJvbW8uTm9tYnJlICsgXCIsXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgc0lkcyA9IHNJZHMgKyBwcm9tby5JRFByb21vY2lvbiArIFwiLFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIHNWYWxvcmVzID0gc1ZhbG9yZXMgKyBiaWdEZWNpbWFsLm11bHRpcGx5KHByb21vLlZhbG9yLCBpQ2FudGlkYWQpICsgXCIsXCI7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzLmZpbHRlcih4ID0+ICF4LkFwbGljYWRhKS5maWx0ZXIoeCA9PiB4LlByb21vY2lvbkNvbWJpbmFkYSA9PSBudWxsKS5mb3JFYWNoKHByb21vID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBzTm9tYnJlcyA9IHNOb21icmVzICsgcHJvbW8uTm9tYnJlICsgXCIsXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgc0lkcyA9IHNJZHMgKyBwcm9tby5JRFByb21vY2lvbiArIFwiLFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIHNWYWxvcmVzID0gc1ZhbG9yZXMgKyBiaWdEZWNpbWFsLm11bHRpcGx5KHByb21vLlZhbG9yLCBpQ2FudGlkYWQpICsgXCIsXCI7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBkYXRhID0geyBcIk5PTUJSRVNcIjogc05vbWJyZXMsIFwiSURcIjogc0lkcywgXCJWQUxPUkVTXCI6IHNWYWxvcmVzIH1cclxuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgZGV0YWxsZSBkZSBwcm9tb2Npb25lc1xyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBcclxuICAgICAqIEBwYXJhbSBzTm9tYnJlcyBcclxuICAgICAqIEBwYXJhbSBzSWRzIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWRkSW5mb1Byb21vY2lvbmVzQURldGFsbGUob1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBpQ2FudGlkYWQ6IG51bWJlcikge1xyXG4gICAgICAgIHZhciBkYXRhID0gdGhpcy5HZW5lcmFySW5mb1Byb21vY2lvbmVzUHJvY2VzYWRhcyhvUHJvbW9jaW9uUHJvY2VzYWRhLCBpQ2FudGlkYWQpXHJcbiAgICAgICAgaWYgKGRhdGEpIHtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkYXRhLk5PTUJSRVMsIFwiTk9NQl9QUk9NT0NcIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRhdGEuSUQsIFwiSURfUFJPTU9DXCIpKTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkYXRhLlZBTE9SRVMsIFwiVkFMX1BST01PQ1wiKSk7XHJcblxyXG4gICAgICAgICAgICAvL0Fob3JhIHNlIGFncmVnYSB1bmEgZGluYW1pY2EgcG9yIGF0cmlidXRvIGRlIGxhIHByb21vIHBhcmEgZmFjaWxpdGFyIGxhIHJldG9tYSBkZSBlc3RhIGluZm9ybWFjacOzblxyXG4gICAgICAgICAgICBsZXQgbGlzdE5vbWJyZSA9IGRhdGEuTk9NQlJFUy5yZXBsYWNlKC8uJC8sIFwiXCIpLnNwbGl0KFwiLFwiKTtcclxuICAgICAgICAgICAgbGV0IGxpc3RJZCA9IGRhdGEuSUQucmVwbGFjZSgvLiQvLCBcIlwiKS5zcGxpdChcIixcIik7XHJcbiAgICAgICAgICAgIGxldCBsaXN0VmFsb3IgPSBkYXRhLlZBTE9SRVMucmVwbGFjZSgvLiQvLCBcIlwiKS5zcGxpdChcIixcIik7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBfaSA9IDA7IF9pIDwgbGlzdElkLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShsaXN0Tm9tYnJlW19pXSwgXCJOT01CX1BST01PQ19cIiArIF9pKSk7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGxpc3RJZFtfaV0sIFwiSURfUFJPTU9DX1wiICsgX2kpKTtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUobGlzdFZhbG9yW19pXSwgXCJWQUxfUFJPTU9DX1wiICsgX2kpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZGF0YSA9IHRoaXMuR2VuZXJhckluZm9Qcm9tb2Npb25lc1Byb2Nlc2FkYXMob1Byb21vY2lvblByb2Nlc2FkYSwgaUNhbnRpZGFkLCBmYWxzZSlcclxuICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRhdGEuTk9NQlJFUywgXCJOT01CX1BST01PQ19OT1BST1wiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZGF0YS5JRCwgXCJJRF9QUk9NT0NfTk9QUk9cIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRhdGEuVkFMT1JFUywgXCJWQUxfUFJPTU9DX05PUFJPXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FyZ2FyIGEgZGV0YWxsZSBpbmZvcm1hY2lvbiBkZSBuaXZlbGVzIGRlIHByZWNpb1xyXG4gICAgICogQHBhcmFtIGluZk5pdmVsZXNQcmNpbyBJbmZvcm1hY2lvbiBkZSBuaXZlbGVzIGRlIHByZWNpb1xyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBPYmpldG8gZG9uZGUgc2UgY2FyZ2Fyw6EgbGEgaW5mb3JtYWNpb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIExvYWREZXRhbGxlTml2ZWxlc1ByZWNpbyhpbmZOaXZlbGVzUHJjaW8sIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICBpZiAoaW5mTml2ZWxlc1ByY2lvICYmIGluZk5pdmVsZXNQcmNpby5OSVZFTCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoaW5mTml2ZWxlc1ByY2lvLk5JVkVMLCBcIk5JVkVMUFJFQ0lPXCIpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWZXJpZmljYXIgY29uIHF1ZSBuaXZlbCBkZSBwcmVjaW8gdmEgYSB0cmFiYWphclxyXG4gICAgICogQHBhcmFtIHByb2RHUlBTZWxlY3RlZCBFbCBwcm9kdWN0byBpbmdyZXNhZG9cclxuICAgICAqIEBwYXJhbSBpQ2FudGlkYWQgTGEgY2FudGlkYWQgZGUgcHJvZHVjdG9zIHF1ZSB2YSBhIGluZ3Jlc2FyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWZXJpZmljYXJQcmVjaW9CeU5pdmVsZXMocHJvZEdSUFNlbGVjdGVkOiBUeXBlTTNQcmRHcnAsIGlDYW50aWRhZDogbnVtYmVyKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG9NM1ByZXNlbnRhY2lvbmVzOiBNM1ByZXNlbnRhY2lvbmVzO1xyXG4gICAgICAgICAgICB2YXIgalJlc3BOaXZlbGVzID0ge307XHJcbiAgICAgICAgICAgIGlmIChwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLk0zUHJlc2VudGFjaW9uZXMgJiZcclxuICAgICAgICAgICAgICAgIHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuTTNQcmVzZW50YWNpb25lcy5sZW5ndGggPiAwKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgb00zUHJlc2VudGFjaW9uZXMgPSBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLk0zUHJlc2VudGFjaW9uZXMuZmluZCh4ID0+IGlDYW50aWRhZCA+PSB4LlRPUEUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKG9NM1ByZXNlbnRhY2lvbmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU8gPSBvTTNQcmVzZW50YWNpb25lcy5WQUxPUjtcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcE5pdmVsZXMgPSB7IFwiUFJFQ0lPXCI6IG9NM1ByZXNlbnRhY2lvbmVzLlZBTE9SLCBcIk5JVkVMXCI6IG9NM1ByZXNlbnRhY2lvbmVzLk5JVkVMUFJTIH07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGpSZXNwTml2ZWxlcztcclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBWZXJpZmljYXJQcmVjaW9CeU5pdmVsZXNHZW5lcmFsKG9NM1ByZEdlbmVyYWw6IE0zUHJkR2VuZXJhbCwgaUNhbnRpZGFkOiBudW1iZXIpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgb00zUHJlc2VudGFjaW9uZXM6IE0zUHJlc2VudGFjaW9uZXM7XHJcbiAgICAgICAgICAgIHZhciBqUmVzcE5pdmVsZXMgPSB7fTtcclxuICAgICAgICAgICAgaWYgKG9NM1ByZEdlbmVyYWwuTG9NM1ByZExpc3RhLk0zUHJlc2VudGFjaW9uZXMgJiYgb00zUHJkR2VuZXJhbC5Mb00zUHJkTGlzdGEuTTNQcmVzZW50YWNpb25lcy5sZW5ndGggPiAwKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgb00zUHJlc2VudGFjaW9uZXMgPSBvTTNQcmRHZW5lcmFsLkxvTTNQcmRMaXN0YS5NM1ByZXNlbnRhY2lvbmVzLmZpbmQoeCA9PiBpQ2FudGlkYWQgPj0geC5UT1BFKTtcclxuICAgICAgICAgICAgICAgIGlmIChvTTNQcmVzZW50YWNpb25lcykge1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1ByZEdlbmVyYWwuTG9NM1ByZExpc3RhLlBSRUNJTyA9IG9NM1ByZXNlbnRhY2lvbmVzLlZBTE9SO1xyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwTml2ZWxlcyA9IHsgXCJQUkVDSU9cIjogb00zUHJlc2VudGFjaW9uZXMuVkFMT1IsIFwiTklWRUxcIjogb00zUHJlc2VudGFjaW9uZXMuTklWRUxQUlMgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4galJlc3BOaXZlbGVzO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGxvcyBjdXBvbmVzIGdlbmVyYWRvcyBkZSBsYSBsaXN0YSBkZSBwcm9tb3Byb2Nlc2FkYXNcclxuICAgICAqIEBwYXJhbSBvUHJvbW9jaW9uUHJvY2VzYWRhIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0X2xpc3RfY3Vwb25lc19mcm9tX3Byb21vKG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSwgY2FudGlkYWQ6IG51bWJlcik6IEFycmF5PE0zUERldGFsbGVDdXBvbj4ge1xyXG4gICAgICAgIHZhciBsaXN0X2N1cG9uZXMgPSBBcnJheTxNM1BEZXRhbGxlQ3Vwb24+KCk7XHJcblxyXG4gICAgICAgIGlmIChvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBfaSA9IDA7IF9pIDwgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgcHJvbW9fYXNvY2lhZGEgPSBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhc1tfaV07XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHByb21vX2Fzb2NpYWRhLklkQ3Vwb24pIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY3Vwb24gPSBuZXcgTTNQRGV0YWxsZUN1cG9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY3Vwb24uSWRDdXBvbiA9IHByb21vX2Fzb2NpYWRhLklkQ3Vwb247XHJcbiAgICAgICAgICAgICAgICAgICAgY3Vwb24uQ2FudGlkYWQgPSBjYW50aWRhZDtcclxuICAgICAgICAgICAgICAgICAgICBsaXN0X2N1cG9uZXMucHVzaChjdXBvbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBsaXN0X2N1cG9uZXM7XHJcbiAgICB9XHJcblxyXG4gICAgLy9Bc2lnbmFyIGEgcHJvbW9jaW9uZXMgY29tYmlhbmFzIGRlc2RlIGxvIHF1ZSBzZSBlbmNvbnRyw7MgYWwgZW5jYWJlemFkbyBpdGVtLCBkZWwgcHJvZHVjdG8gc2VsZWNjaW9uYWRvXHJcbiAgICBwdWJsaWMgQXNpZ25hclByb21vY2lvbmVzQ29tYmluYWRhcyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgaWYgKG9Qcm9tb2Npb25Qcm9jZXNhZGEgIT0gbnVsbCAmJiBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzLmZvckVhY2gocHJvbW9Bc28gPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHByb21vQXNvLlByb21vY2lvbkNvbWJpbmFkYSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9TZSBhZ3JlZ2EgcHJvbW9jaW9uIGNvbWJpbmFkYSBhIGVuY2FiZXphZG8gZGUgaXRlbXMuXHJcbiAgICAgICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLlByb21vQ29tYmluYWRhcy5wdXNoKHByb21vQXNvLlByb21vY2lvbkNvbWJpbmFkYSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8vQWdyZWdhciBwcm9tb2Npb25lcyBjb21iaW5hZGFzXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXM6IE0zUERldGFsbGVJdGVtcztcclxuICAgICAgICAgICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJPTU9DT01CSVwiKVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvTTNQRGV0YWxsZUl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPSBKU09OLnN0cmluZ2lmeShvTTNQRW5jSXRlbXMuUHJvbW9Db21iaW5hZGFzKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoSlNPTi5zdHJpbmdpZnkob00zUEVuY0l0ZW1zLlByb21vQ29tYmluYWRhcyksIFwiUFJPTU9DT01CSVwiKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuQXNpZ25hclByb21vY2lvbmVzQ29tYmluYWRhc0FNM1Byb2Nlc28ob00zUHJvY2Vzb3MsIHByb21vQXNvLlByb21vY2lvbkNvbWJpbmFkYSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFzaWduYXIgcHJvbW9jaW9uZXMgY29tYmlhbmRhcyBhIE0zIFByb2Nlc28sIGVzdGUsIHZhbGlkYSBxdWUgbm8gZXhpc3RhIHVuIHByb21vY2lvbiBhbnRlcmlvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIEFzaWduYXJQcm9tb2Npb25lc0NvbWJpbmFkYXNBTTNQcm9jZXNvKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvUHJvbW9jaW9uQ29tYmluYWRhOiBQcm9tb2Npb25Db21iaW5hZGEpIHtcclxuICAgICAgICBpZiAoIW9NM1Byb2Nlc29zLlByb21vc0NvbWJpbmFkYXMpIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuUHJvbW9zQ29tYmluYWRhcyA9IG5ldyBBcnJheTxQcm9tb2Npb25Db21iaW5hZGE+KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcy5Qcm9tb3NDb21iaW5hZGFzLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uQ29tYmluYWRhID09IG9Qcm9tb2Npb25Db21iaW5hZGEuSWRQcm9tb2Npb25Db21iaW5hZGEpKSB7XHJcbiAgICAgICAgICAgIC8vLy8vLy8gZXhpc3RlXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8vLy8vIE5vIEV4aXN0ZVxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5Qcm9tb3NDb21iaW5hZGFzLnB1c2gob1Byb21vY2lvbkNvbWJpbmFkYSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcy5Qcm9tb3NDb21iaW5hZGFzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQWRkRGluYW1pY2FQcm9jZXNvQ29tYmluYWRhcyhvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkaWNpb25hciBhIGRpbmFtaWNhcyBwcm9jZXNvIGRlIGNvbWJpbmFkYXNcclxuICAgICAqIEBwYXJhbSBpb00zUHJvY2VzbyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFkZERpbmFtaWNhUHJvY2Vzb0NvbWJpbmFkYXMoaW9NM1Byb2Nlc286IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICB2YXIgb00zUERpbmFtaWNhc0ZpbmRlZDogTTNQRGluYW1pY2FzO1xyXG4gICAgICAgIG9NM1BEaW5hbWljYXNGaW5kZWQgPSBpb00zUHJvY2Vzby5sTTNQRGluYW1pY2FzLmZpbmQoeCA9PiB4Lk5vbWJyZSA9PSBcIkNPTUJJTkFEQVwiKTtcclxuICAgICAgICBpZiAob00zUERpbmFtaWNhc0ZpbmRlZCkge1xyXG4gICAgICAgICAgICB2YXIgYXJyUHJvbW86IEFycmF5PFByb21vY2lvbkNvbWJpbmFkYT4gPSBKU09OLnBhcnNlKG9NM1BEaW5hbWljYXNGaW5kZWQuVmFsb3IpO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyclByb21vLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgb1Byb21vQ29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSA9IGlvTTNQcm9jZXNvLlByb21vc0NvbWJpbmFkYXMuZmluZCh4ID0+IHguSWRQcm9tb2Npb25Db21iaW5hZGEgPT0gYXJyUHJvbW9baV0uSWRQcm9tb2Npb25Db21iaW5hZGEpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFvUHJvbW9Db21iaSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlvTTNQcm9jZXNvLlByb21vc0NvbWJpbmFkYXMucHVzaChhcnJQcm9tb1tpXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb00zUERpbmFtaWNhc0ZpbmRlZC5WYWxvciA9IEpTT04uc3RyaW5naWZ5KGlvTTNQcm9jZXNvLlByb21vc0NvbWJpbmFkYXMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZhciBvTTNQRGluYW1pY2FzID0gbmV3IE0zUERpbmFtaWNhcygpO1xyXG4gICAgICAgICAgICBvTTNQRGluYW1pY2FzLk5vbWJyZSA9IFwiQ09NQklOQURBXCI7XHJcbiAgICAgICAgICAgIG9NM1BEaW5hbWljYXMuVmFsb3IgPSBKU09OLnN0cmluZ2lmeShpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzKTtcclxuXHJcbiAgICAgICAgICAgIGlvTTNQcm9jZXNvLmxNM1BEaW5hbWljYXMucHVzaChvTTNQRGluYW1pY2FzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vQ2FsY3VsbyBkZSBwcm9tb2Npb25lc1xyXG4gICAgcHVibGljIENhbGN1bGFyUHJvbW9jaW9uZXMob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZDogVHlwZU0zUHJkR3JwLFxyXG4gICAgICAgIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgb0RhdGFVc2VyOiBhbnksIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIpOiBQcm9tb2Npb25Qcm9jZXNhZGEge1xyXG4gICAgICAgIHZhciBvUHJvbW9jaW9uUHJvY2VzYWRhID0gbmV3IFByb21vY2lvblByb2Nlc2FkYSgpO1xyXG4gICAgICAgIHZhciBsVGlwb3MgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xyXG4gICAgICAgIGxUaXBvcy5wdXNoKFwiRElSRUNUQVwiKTtcclxuICAgICAgICBsVGlwb3MucHVzaChcIkNPTUJJTkFEQVwiKTtcclxuICAgICAgICBsVGlwb3MucHVzaChcIk1PTkVERVJPXCIpO1xyXG4gICAgICAgIGxUaXBvcy5wdXNoKFwiTUFOVUFMXCIpO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAob00zRU5DUFJPTU8gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGFyclByb21vOiBBcnJheTxhbnk+O1xyXG4gICAgICAgICAgICAgICAgdmFyIG9wcm9tb2Npb25lc1NlcnZpY2UgPSBuZXcgcHJvbW9jaW9uZXNTZXJ2aWNlKG9EYXRhVXNlciwgb00zUEl0ZW1zV0VCKTtcclxuXHJcbiAgICAgICAgICAgICAgICBhcnJQcm9tbyA9IG9wcm9tb2Npb25lc1NlcnZpY2UuVmVyaWZpY2FyUHJvbW9jaW9uZXMob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgbFRpcG9zKTtcclxuICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEgPSBvcHJvbW9jaW9uZXNTZXJ2aWNlLlByb2Nlc2FyUHJvbW9jaW9uKGFyclByb21vLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM0VOQ1BST01PKTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb1Byb21vY2lvblByb2Nlc2FkYTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gaGF5IGluZm9ybWFjaW9uIGRlIHByb21vY2lvbmVzJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEgPSBuZXcgUHJvbW9jaW9uUHJvY2VzYWRhKCk7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTztcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9IDA7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzID0gbnVsbDtcclxuICAgICAgICAgICAgcmV0dXJuIG9Qcm9tb2Npb25Qcm9jZXNhZGE7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vVmVyaWZpY2FyIG9ic2VxdWlvcyB5IGFncmVnYXJsb3MuXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FyT2JzZXF1aW9zKG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSwgY2FudGlkYWQ6IG51bWJlciwgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBhcnJQcm9tb2Npb25lc0Fzb2NpYWRhczogQXJyYXk8UHJvbW9jaW9uZXNBc29jaWFkYXM+O1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VxdWlvc0NhbnRpZGFkID0gMDtcclxuICAgICAgICAgICAgaWYgKG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGFyclByb21vY2lvbmVzQXNvY2lhZGFzID0gb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMuZmlsdGVyKHByb21vID0+IHByb21vLkxpc3RPYnNTS1UgIT0gbnVsbCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGFyclByb21vY2lvbmVzQXNvY2lhZGFzICE9IG51bGwgJiYgYXJyUHJvbW9jaW9uZXNBc29jaWFkYXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFyclByb21vY2lvbmVzQXNvY2lhZGFzLmZvckVhY2gocHJvbW8gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9ic2VxdWlvT1Byb21vID09IC0xXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHJvbW8uTGlzdE9ic1NLVS5sZW5ndGgpIHByb21vLkxpc3RPYnNTS1UgPSBbcHJvbW8uTGlzdE9ic1NLVV07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52YWxpZGFTaVRpZW5lT3RyYVByb21vKHByb21vLCBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub2JzZXF1aW9PUHJvbW8gPSBwcm9tby5JRFByb21vY2lvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFybWFyTGlzdGFPYnNlcXVpb3NTS1UocHJvbW8sIG9NM1BFbmNJdGVtcywgY2FudGlkYWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdHVybk9uUHJvbW9zKG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBhcnJQcm9tb2Npb25lc0Fzb2NpYWRhczogQXJyYXk8UHJvbW9jaW9uZXNBc29jaWFkYXM+O1xyXG4gICAgICAgICAgICBpZiAob1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgYXJyUHJvbW9jaW9uZXNBc29jaWFkYXMgPSBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcy5maWx0ZXIocHJvbW8gPT4gcHJvbW8ubElkQWN0aXZhUHJvbW8gJiYgcHJvbW8ubElkQWN0aXZhUHJvbW8ubGVuZ3RoID4gMCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGFyclByb21vY2lvbmVzQXNvY2lhZGFzICYmIGFyclByb21vY2lvbmVzQXNvY2lhZGFzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBhcnJQcm9tb2Npb25lc0Fzb2NpYWRhcy5mb3JFYWNoKHByb21vID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sSWRBY3RpdmFQcm9tbyA9IHRoaXMubElkQWN0aXZhUHJvbW8uY29uY2F0KHByb21vLmxJZEFjdGl2YVByb21vKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUR1cGxpY2F0ZXModGhpcy5sSWRBY3RpdmFQcm9tbyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZUR1cGxpY2F0ZXMoYXJyOiBBcnJheTxhbnk+KSB7XHJcbiAgICAgICAgdmFyIHVuaXF1ZSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh1bmlxdWUuaW5kZXhPZihhcnJbaV0pID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgdW5pcXVlLnB1c2goYXJyW2ldKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhcm1hckxpc3RhT2JzZXF1aW9zU0tVKHByb21vOiBQcm9tb2Npb25lc0Fzb2NpYWRhcywgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgY2FudGlkYWQ6IG51bWJlcikge1xyXG4gICAgICAgIGxldCBjYW50aWRhZFJlYWwgPSBNYXRoLmZsb29yKGNhbnRpZGFkIC8gcHJvbW8uQ2FudGlkYWRPYnNlcSk7XHJcbiAgICAgICAgaWYgKHByb21vLlJlZ2xhT2JzZXEgPT0gXCJFWENcIikge1xyXG4gICAgICAgICAgICB0aGlzLmFzaWduYXJJZEVuY1BhZHJlT2JzZXF1aW8ocHJvbW8sIG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgIHRoaXMub2JzZXF1aW9zRXhjID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcXVpb3NDYW50aWRhZCA9IGNhbnRpZGFkUmVhbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXNpZ25hcklkRW5jUGFkcmVPYnNlcXVpbyhwcm9tbywgb00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgcHJvbW8uTGlzdE9ic1NLVS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5DYW50aWRhZCA9IGNhbnRpZGFkUmVhbCAqICtlbGVtZW50LkNhbnRpZGFkO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcXVpb3NFeGMgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vTGlzdGFPYnNlcXVpb3MgPSBwcm9tby5MaXN0T2JzU0tVO1xyXG4gICAgfVxyXG5cclxuICAgIGFzaWduYXJJZEVuY1BhZHJlT2JzZXF1aW8ocHJvbW86IFByb21vY2lvbmVzQXNvY2lhZGFzLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgaWYgKHByb21vLkxpc3RPYnNTS1UubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBwcm9tby5MaXN0T2JzU0tVLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LmlkRW5jUGFkcmUgPSBvTTNQRW5jSXRlbXMuSUQ7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhcm1hckxpc3RhT2JzZXF1aW9zQ29tYmlTS1UoY29tYmksIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGNhbnRpZGFkOiBudW1iZXIpIHtcclxuICAgICAgICBpZiAoY29tYmkuQWNjaW9uLlJlZ2xhT2JzZXEgPT0gXCJFWENcIikge1xyXG4gICAgICAgICAgICB0aGlzLmFzaWduYXJJZEVuY1BhZHJlT2JzZXF1aW9Db21iaW5hZG8oY29tYmkuQWNjaW9uLk9CU0VRVUlPUywgb00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcXVpb3NFeGMgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VxdWlvc0NhbnRpZGFkID0gY2FudGlkYWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmFzaWduYXJJZEVuY1BhZHJlT2JzZXF1aW9Db21iaW5hZG8oY29tYmkuQWNjaW9uLk9CU0VRVUlPUywgb00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgY29tYmkuQWNjaW9uLk9CU0VRVUlPUy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5DYW50aWRhZCA9IGNhbnRpZGFkICogK2VsZW1lbnQuQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VxdWlvc0V4YyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm9MaXN0YU9ic2VxdWlvcyA9IGNvbWJpLkFjY2lvbi5PQlNFUVVJT1M7XHJcbiAgICB9XHJcblxyXG4gICAgYXNpZ25hcklkRW5jUGFkcmVPYnNlcXVpb0NvbWJpbmFkbyhvYnNlcXVpb3MsIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICBpZiAob2JzZXF1aW9zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgb2JzZXF1aW9zLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LmlkRW5jUGFkcmUgPSBvTTNQRW5jSXRlbXMuSUQ7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL1JldG9ybmEgdHJ1ZSBzaSBoYXkgb3RyYSBwcm9tbyBhcGxpY2FkYSBkb25kZSBuaSBsYSBwcm9tbyBkZSBvYnNlcXVpbyBvIGxhIGFwbGljYWRhIHNvbiBmaWphcyB5IHVuYSBkZSBsYXMgZG9zIGVzIEVYQ1xyXG4gICAgdmFsaWRhU2lUaWVuZU90cmFQcm9tbyhwcm9tb09ic2VxdWlvOiBQcm9tb2Npb25lc0Fzb2NpYWRhcywgYXJyUHJvbW9jaW9uZXNBc29jaWFkYXM6IEFycmF5PFByb21vY2lvbmVzQXNvY2lhZGFzPik6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmIChwcm9tb09ic2VxdWlvLlJlZ2xhICE9IFwiQUNNXCIpIHtcclxuICAgICAgICAgICAgbGV0IG9Qcm9tb3NOb09ic2VxdWlvcyA9IGFyclByb21vY2lvbmVzQXNvY2lhZGFzLmZpbHRlcih4ID0+IHguSURQcm9tb2Npb24gIT0gcHJvbW9PYnNlcXVpby5JRFByb21vY2lvbik7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvbW8gb2Ygb1Byb21vc05vT2JzZXF1aW9zKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvbW8uUmVnbGEgIT0gXCJBQ01cIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9tby5BcGxpY2FkYSAmJiAocHJvbW8uUmVnbGEgPT0gXCJFWENcIiB8fCBwcm9tb09ic2VxdWlvLlJlZ2xhID09IFwiRVhDXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL3Byb2Nlc2FtaWVudG8gZGUgb2JzZXF1aW9zXHJcbiAgICBwdWJsaWMgYXN5bmMgUHJvY2VzYXJPYnNlcXVpb3Mob0RhdGFVc2VyOiBhbnksXHJcbiAgICAgICAgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgRW5MaW5lYTogYm9vbGVhbiwgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VxdWlvc0V4YyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VxdWlvT1Byb21vID0gLTE7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9MaXN0YU9ic2VxdWlvcyAhPSBudWxsICYmIHRoaXMub0xpc3RhT2JzZXF1aW9zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vTGlzdGFPYnNlcXVpb3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vTGlzdGFPYnNlcXVpb3NbaV0uU0tVKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE5MDgxMCB2YWxpZGEsIGN1YW50b3MgcHJvZHVjdG9zIHNlIGFncmVnYSBlbiBlbCBvYnNlcXVpby5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub0xpc3RhT2JzZXF1aW9zW2ldLkNhbnRpZGFkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvTTNQSXRlbXNXRUIuZENhbnRpZGFkID0gdGhpcy5vTGlzdGFPYnNlcXVpb3NbaV0uQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9KQUdNIDIwMTkxMTEyIHNlIGFncmVnIGZ1bmNpb25hbGlkYWQgZGUgb2JzZXF1aW9zXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5CaXNPYnNlcXVpbyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5JREVuY1BhZHJlID0gdGhpcy5vTGlzdGFPYnNlcXVpb3NbaV0uaWRFbmNQYWRyZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUEl0ZW1zV0VCLlRpcG9BZ3J1cGFjaW9uID0gXCJPQlNRXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuR3VhcmRhclByb21vY2lvbih0aGlzLm9MaXN0YU9ic2VxdWlvc1tpXSwgb0RhdGFVc2VyLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgRW5MaW5lYSwgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vTGlzdGFPYnNlcXVpb3MgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL0d1YXJkYXIgcHJvbW9jaW9uIHNlZ3VuIHVuIHNrdVxyXG4gICAgLy8xLiBCdXNjYXIgZWwgcHJvZHVjdG8gc2VndW4gZWwgc2t1XHJcbiAgICAvLzIuIEFncmVnYXIgZWwgcHJvZHVjdG8gYSBtM3Byb2Nlc29zXHJcbiAgICAvLzMuIEFncmVnYXIgYWwgY2Fycml0byBkZSBjb21wcmFzLlxyXG4gICAgcHVibGljIGFzeW5jIEd1YXJkYXJQcm9tb2Npb24ocHJvbW8sIG9EYXRhVXNlcjogYW55LFxyXG4gICAgICAgIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIEVuTGluZWE6IGJvb2xlYW4sIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgLy8gMjAxODExMjEgIHZhciBzS2V5Q2Fycml0bztcclxuICAgICAgICAvLyAyMDE4MTEyMSB2YXIgb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgdmFyIHByb2Nlc29Qcm9tbztcclxuICAgICAgICAvL09idGVuZXIga2V5IGRlIGNhcnJpdG8gZGUgY29tcHJhc1xyXG4gICAgICAgIC8vIDIwMTgxMTIxIHNLZXlDYXJyaXRvID0gb00zRGF0YS5HZXRLZXlDYXJyaXRvQ29tcHJhcyhzSURLYXRpb3MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiwgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklESFVCKTtcclxuXHJcblxyXG4gICAgICAgIC8vIDIwMTgxMTIxIG9NM1Byb2Nlc29zID0gYXdhaXQgb00zRGF0YS5HZXREYXRhUG91Y2hCRChzS2V5Q2Fycml0byk7XHJcbiAgICAgICAgcHJvY2Vzb1Byb21vID0gYXdhaXQgdGhpcy5BZGljaW9uYXJQcm9tb2Npb25BUHJvY2Vzbyhwcm9tbywgb00zUHJvY2Vzb3MsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBFbkxpbmVhLCBvRGF0YVVzZXIpO1xyXG4gICAgICAgIC8vR3VhcmRhciBlbiBwb3VjaCBEQlxyXG4gICAgICAgIC8vIDIwMTgxMTIxICBhd2FpdCBvTTNEYXRhLkFkZFRvUG91Y2hCRENhcnJpdG9Db21wcmFzKHNLZXlDYXJyaXRvLCBwcm9jZXNvUHJvbW8pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT2J0ZW5lciBsb3MgcHJvZHVjdG8gc2VndW4gc3UgU0tVLCBzYWNhbmRvIGxhIGluZm9ybWFjaW9uIGRlc2RlIHBvdWNoREIuXHJcbiAgICBwdWJsaWMgYXN5bmMgQWRpY2lvbmFyUHJvbW9jaW9uQVByb2Nlc28ocHJvbW8sIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBFbkxpbmVhOiBib29sZWFuLCBvRGF0YVVzZXI6IGFueSkge1xyXG4gICAgICAgIHZhciBvUHJvZHVjdG86IFR5cGVNM1ByZEdycCA9IG51bGw7XHJcbiAgICAgICAgb1Byb2R1Y3RvID0gYXdhaXQgdGhpcy5HZXRQcm9kdWN0b0J5U0tVKHByb21vLlNLVSwgRW5MaW5lYSwgb00zUHJvY2Vzb3MsIG9EYXRhVXNlcik7XHJcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhvUHJvZHVjdG8pO1xyXG4gICAgICAgIGlmIChvUHJvZHVjdG8gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAvL1lhIG5vIHNlIGRlamEgcHJlY2lvIGNlcm8gc2lubyBxdWUgY29tbyBlcyBvYnNlcXVpbyBzaW11bGEgdW4gZGVzY3VlbnRvIGRlbCAxMDAlIFxyXG4gICAgICAgICAgICAvL1Byb2R1Y3RvLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU8gPSAwO1xyXG4gICAgICAgICAgICAvL0FncmVnYXIgYSBtM3Byb2Nlc29zIGVsIG9ic2VxdWlvLlxyXG4gICAgICAgICAgICAvL29NM1Byb2Nlc29zID0gdGhpcy5Mb2FkTTNQcm9jZXNvRnJvbURhdGEob00zUHJvY2Vzb3MsIG9Qcm9kdWN0bywgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG51bGwsIG51bGwpO1xyXG5cclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSB0aGlzLmFkZHRvY2FydChvTTNQSXRlbXNXRUIsIG9Qcm9kdWN0bywgbnVsbCwgbnVsbCwgb0RhdGFVc2VyLCB0aGlzLmdzSWRrYXRpb3MsIG9NM1ViaWNhY2lvbiwgbnVsbCwgb00zUHJvY2Vzb3MsIG51bGwsIDEwMCk7Ly8qU2UgbWFuZGEgdmFsb3IgZGUgZGVzY3Vlbm50byAxMDAgJVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcbiAgICB9XHJcblxyXG4gICAgLy9PYnRlbmVyIHByb2R1Y3RvIHNlZ3VuIGVsIFNLVVxyXG4gICAgcHVibGljIGFzeW5jIEdldFByb2R1Y3RvQnlTS1Uoc1NLVSwgRW5MaW5lYTogYm9vbGVhbiwgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9EYXRhVXNlcjogYW55LCBkaXNwb25pYmxlTTNFbmMgPSBudWxsKSB7XHJcbiAgICAgICAgdmFyIG9TZXJ2aWNlTTNNYWVzdHJvID0gbmV3IFNlcnZpY2VNM01hZXN0cm8oKTtcclxuICAgICAgICB2YXIgcHJvZHVjdG9zO1xyXG4gICAgICAgIHZhciBvUHJvZHVjdG86IFR5cGVNM1ByZEdycCA9IG51bGw7XHJcbiAgICAgICAgdmFyIG9TZXJ2aWNlTG9hZExpc3RhUHJlY2lvID0gbmV3IFNlcnZpY2VMb2FkTGlzdGFQcmVjaW8odGhpcy5nc0lka2F0aW9zKTtcclxuXHJcbiAgICAgICAgLy9vU2VydmljZUxpc3RhUHJlY2lvLkdlbmVyYXRlRGF0YVZhbGlkYWNpb24ob0RhdGFVc2VyLCBvTTNQcm9jZXNvcy5UTUlkUHJvY2Vzbyk7XHJcbiAgICAgICAgaWYgKCFFbkxpbmVhICYmICFvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuRmVjaGFQcmVjaW8pIHtcclxuICAgICAgICAgICAgdmFyIHNJRFByb2R1Y3RvcyA9IHRoaXMuZ3NJZGthdGlvcyArIFwiP1BSRFwiO1xyXG4gICAgICAgICAgICBwcm9kdWN0b3MgPSBhd2FpdCB0aGlzLm9NM0NvdWNoTWFlc3Ryby5nZXQoc0lEUHJvZHVjdG9zKTtcclxuICAgICAgICAgICAgb1Byb2R1Y3RvID0gb1NlcnZpY2VNM01hZXN0cm8uR2V0TTNQcmRHcnBGcm9tTGlzdChwcm9kdWN0b3MuTTNMaXN0UHJvZHVjdG9zLk0zR1JQLCBzU0tVKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvUHJvZHVjdG8gPSBhd2FpdCBvU2VydmljZU0zTWFlc3Ryby5NM0dldFByb2R1Y3RvQnlTS1VBc3luYyh0aGlzLkdvUG9zdFNlcnZpY2VNMywgdGhpcy5nc0lka2F0aW9zLCBzU0tVLCBvRGF0YVVzZXIsIG9NM1Byb2Nlc29zLlViaWMxLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob1Byb2R1Y3RvLkxvTTNQcmRHZW5lcmFsWzBdLkRJU1BPTklCTEUgPD0gMCAmJiBkaXNwb25pYmxlTTNFbmMpIHtcclxuICAgICAgICAgICAgb1Byb2R1Y3RvLkxvTTNQcmRHZW5lcmFsWzBdLkRJU1BPTklCTEUgPSBkaXNwb25pYmxlTTNFbmM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhd2FpdCBvU2VydmljZUxvYWRMaXN0YVByZWNpby5Bc2lnbmFyTGlzdGFQcmVjaW8ob1Byb2R1Y3RvLCBvRGF0YVVzZXIsIHRoaXMuR29Qb3N0U2VydmljZU0zKTtcclxuICAgICAgICAvL29TZXJ2aWNlTGlzdGFQcmVjaW8uVmFsaWRhckxpc3RhUHJlY2lvcyhvUHJvZHVjdG8sIHRoaXMuR29Qb3N0U2VydmljZU0zLCB0aGlzLmdzSWRrYXRpb3MpO1xyXG4gICAgICAgIHJldHVybiBvUHJvZHVjdG87XHJcbiAgICB9XHJcblxyXG4gICAgLy9DYWxjdWxhciBwcmVjaW8gc2luIGltcHVlc3Rvcy4gTGEgZm9ybWEgZXMgY2FsY3VsYXIgdG9kbyBlbCB2YWxvciBkZWwgaW1wdWVzdG8uIEVKOiAxMjAuMDkgLyAxLjE2LiBTaSBlbCB2YWxvciBkZWwgaW1wdWVzdG8gZXM6IDE2JVxyXG4gICAgcHVibGljIENhbGN1bGF0ZVByZWNpb0Jhc2UoQ1RCTERJTVBQUkQ6IHN0cmluZywgZFZhbG9yTmV0bzogbnVtYmVyKSB7XHJcbiAgICAgICAgLy92YXIgZFZhbG9ySW1wdWVzdG86IG51bWJlciA9IDE7XHJcbiAgICAgICAgdmFyIGRWYWxvckJhc2U6IG51bWJlciA9IGRWYWxvck5ldG87XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG94bWxUb0pzb25URiA9IG5ldyB4bWxUb0pzb25URigpO1xyXG4gICAgICAgICAgICB2YXIgakltcHVlc3RvcztcclxuICAgICAgICAgICAgaWYgKENUQkxESU1QUFJEICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgIGpJbXB1ZXN0b3MgPSBveG1sVG9Kc29uVEYuY29udmVydFhtbFRvSnNvbihDVEJMRElNUFBSRCk7XHJcbiAgICAgICAgICAgICAgICBqSW1wdWVzdG9zLklNUFVFU1RPUy5JTVBVRVNUTy5mb3JFYWNoKGltcCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9KQUdNICAyMDE5MDYyNiBDYW1iaW8gZGUgY2FsY3VsbyBkZSBiYXNlIGRlIGxvcyBpbXB1ZXN0b3MuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGltcC4kLk1ldG9kb2xvZ2lhID09IFwiUE9SQ0VOVEFKRVwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRWYWxvckJhc2UgPSAoK2RWYWxvckJhc2UpIC8gKDEgKyAraW1wLiQuVmFsb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZFZhbG9yQmFzZSA9ICgrZFZhbG9yQmFzZSkgLSAoK2ltcC4kLlZhbG9yKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKG9NM1BFbmNJdGVtcy5NM0ltcHVlc3Rvcyk7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQ2F0Y2hcIilcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vcmV0dXJuICgoK2RWYWxvck5ldG8pIC8gKCtkVmFsb3JJbXB1ZXN0bykpO1xyXG4gICAgICAgIHJldHVybiBkVmFsb3JCYXNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQ2FyZ2FyIGluZm9ybWFjacOzbiBkZSBpbXB1ZXN0b3MsIGRlc2RlIGVsIHByb2R1Y3RvIGdlbmVyYWxcclxuICAgIHB1YmxpYyBMb2FkTTNQSW1wdWVzdG9zRnJvbVByZEdybChDVEJMRElNUFBSRDogc3RyaW5nLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLFxyXG4gICAgICAgIGRWYWxvck5ldG86IG51bWJlciwgY2FudGlkYWQ6IG51bWJlciwgdmFsb3JUb3RhbFByb2R1Y3RvVW5pdDogbnVtYmVyKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG94bWxUb0pzb25URiA9IG5ldyB4bWxUb0pzb25URigpO1xyXG4gICAgICAgICAgICB2YXIgb00zUEltcHVlc3RvczogTTNQSW1wdWVzdG9zO1xyXG4gICAgICAgICAgICBsZXQgdmFsb3JCYXNlVG90YWwgPSB0aGlzLm9NYXRoVEYucm91bmQoZFZhbG9yTmV0bywgMik7XHJcbiAgICAgICAgICAgIGxldCB2YWxvck5ldG9Ub3RhbCA9IHZhbG9yQmFzZVRvdGFsO1xyXG4gICAgICAgICAgICBsZXQgdmFsb3JUb3RhbFByb2R1Y3RvVG90YWwgPSArYmlnRGVjaW1hbC5tdWx0aXBseSh2YWxvclRvdGFsUHJvZHVjdG9Vbml0LCBjYW50aWRhZCk7XHJcbiAgICAgICAgICAgIHZhciBqSW1wdWVzdG9zO1xyXG4gICAgICAgICAgICB2YXIgZFRvdGFsSW1wdWVzdG86IG51bWJlciA9IDA7XHJcbiAgICAgICAgICAgIGlmIChDVEJMRElNUFBSRCAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICBqSW1wdWVzdG9zID0gb3htbFRvSnNvblRGLmNvbnZlcnRYbWxUb0pzb24oQ1RCTERJTVBQUkQpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE5MDYyNiBDYW1iaW8gZW4gb3JkZW4gZGUgbG9zIGltcHVlc3Rvcy5cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBqSW1wdWVzdG9zLklNUFVFU1RPUy5JTVBVRVNUTy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWxvclJlYWxJbXAgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpbXAgPSBqSW1wdWVzdG9zLklNUFVFU1RPUy5JTVBVRVNUT1tpXTtcclxuICAgICAgICAgICAgICAgICAgICBvTTNQSW1wdWVzdG9zID0gbmV3IE0zUEltcHVlc3RvcygpO1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BJbXB1ZXN0b3MuQ29kSW1wdWVzdG8gPSBpbXAuJC5Db2RJbXA7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUEltcHVlc3Rvcy5Qb3JjZW50YWplID0gaW1wLiQuVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGltcC4kLk1ldG9kb2xvZ2lhID09IFwiUE9SQ0VOVEFKRVwiKSB7Ly9QT1JDRU5UQUpFXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbG9yUmVhbEltcCA9ICtiaWdEZWNpbWFsLm11bHRpcGx5KGltcC4kLlZhbG9yLCB2YWxvck5ldG9Ub3RhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BJbXB1ZXN0b3MuVmFsb3IgPSB0aGlzLm9NYXRoVEYucm91bmQodmFsb3JSZWFsSW1wLCAyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9NM1BJbXB1ZXN0b3MuVmFsb3IgPCB2YWxvclJlYWxJbXApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BJbXB1ZXN0b3MuTGltaXRlT3B1ZXN0byA9ICtNYXRoLmNlaWwoK2JpZ0RlY2ltYWwubXVsdGlwbHkodmFsb3JSZWFsSW1wLCAxMDApKSAvIDEwMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BJbXB1ZXN0b3MuTGltaXRlT3B1ZXN0byA9ICtNYXRoLmZsb29yKCtiaWdEZWNpbWFsLm11bHRpcGx5KHZhbG9yUmVhbEltcCwgMTAwKSkgLyAxMDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ly9GSUpPXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbG9yUmVhbEltcCA9ICtpbXAuJC5WYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUEltcHVlc3Rvcy5WYWxvciA9IHRoaXMub01hdGhURi5yb3VuZCh2YWxvclJlYWxJbXAsIDIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAob00zUEltcHVlc3Rvcy5WYWxvciA8IHZhbG9yUmVhbEltcCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgb00zUEltcHVlc3Rvcy5MaW1pdGVPcHVlc3RvID0gK01hdGguY2VpbCgrYmlnRGVjaW1hbC5tdWx0aXBseSh2YWxvclJlYWxJbXAsIDEwMCkpIC8gMTAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgb00zUEltcHVlc3Rvcy5MaW1pdGVPcHVlc3RvID0gK01hdGguZmxvb3IoK2JpZ0RlY2ltYWwubXVsdGlwbHkodmFsb3JSZWFsSW1wLCAxMDApKSAvIDEwMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE4MDkxMiBOdWV2byBjb25jZXB0byBkZSBiYXNlXHJcbiAgICAgICAgICAgICAgICAgICAgb00zUEltcHVlc3Rvcy5CYXNlID0gdmFsb3JOZXRvVG90YWw7XHJcbiAgICAgICAgICAgICAgICAgICAgZFRvdGFsSW1wdWVzdG8gPSAoK2RUb3RhbEltcHVlc3RvKSArICgrb00zUEltcHVlc3Rvcy5WYWxvcik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE4MDkxMiBTdW1hIGRlIFZhbG9yIE5ldG9cclxuICAgICAgICAgICAgICAgICAgICB2YWxvck5ldG9Ub3RhbCA9ICgrdmFsb3JOZXRvVG90YWwpICsgKCtvTTNQSW1wdWVzdG9zLlZhbG9yKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8vU29sbyBhZGljaW9uZSBhIGltcHVlc3RvcywgY3VhbmRvIGVzIHRvdGFsIGltcHVlc3Rvc1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpbXBFeGlzdGU6IE0zUEltcHVlc3RvcztcclxuICAgICAgICAgICAgICAgICAgICBpbXBFeGlzdGUgPSBvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zLmZpbmQoaW1wID0+IGltcC5Db2RJbXB1ZXN0byA9PSBvTTNQSW1wdWVzdG9zLkNvZEltcHVlc3RvKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW1wRXhpc3RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vQm9ycmEgZW4gaXRlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zID0gb00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvcy5maWx0ZXIoaW1wID0+IGltcC5Db2RJbXB1ZXN0byAhPSBvTTNQSW1wdWVzdG9zLkNvZEltcHVlc3RvKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvcy5wdXNoKG9NM1BJbXB1ZXN0b3MpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gakltcHVlc3Rvcy5JTVBVRVNUT1MuSU1QVUVTVE8uZm9yRWFjaChpbXAgPT4ge1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL0pBR00gMjAxOTA3MjYgc2UgYWdyZWdhIHZhbGlkYWNpb24sIHlhIHF1ZSBlc3RhYmEgcXVlZGFuZG8gbGEgcmVzdGEsIGNvbiB2YWxvcmVzIGNvbW86IDAuMDAwMDAwMDAwMDEgPSAxLjE1NjQ1NjQ1NjRlODQ1IEVKXHJcbiAgICAgICAgICAgIGlmIChkVG90YWxJbXB1ZXN0byAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgICAvL0RpZmVyZW5jaWEgcmVkb25kZWFkYSBhIGRvcyBkZWNpbWFsZXNcclxuICAgICAgICAgICAgICAgIGRUb3RhbEltcHVlc3RvID0gdGhpcy5vTWF0aFRGLnJvdW5kKGRUb3RhbEltcHVlc3RvLCAyKTtcclxuICAgICAgICAgICAgICAgIGxldCBkaWZlcmVuY2lhID0gdGhpcy5vTWF0aFRGLnJvdW5kKCh2YWxvclRvdGFsUHJvZHVjdG9Ub3RhbCAtIHZhbG9yQmFzZVRvdGFsIC0gZFRvdGFsSW1wdWVzdG8pLCAyKTtcclxuICAgICAgICAgICAgICAgIGlmIChkaWZlcmVuY2lhICE9IDApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFqdXN0YWRvckRlSW1wdWVzdG9zKG9NM1BFbmNJdGVtcywgZGlmZXJlbmNpYSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gXCJUT1RBTElNUFVFU1RPU1wiXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vTWF0aFRGLnJvdW5kKCh2YWxvclRvdGFsUHJvZHVjdG9Ub3RhbCAtIHZhbG9yQmFzZVRvdGFsKSwgMik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJDYXRjaFwiKVxyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGUyAyMDE5MDcyNVxyXG4gICAgICogQ29ycmlnZSBlbCB2YWxvciBxdWUgdG9tbyBlbCBpbXB1ZXN0byBkZXNwdWVzIGRlIGhhYmVyc2UgcmVkb25kZWFkb1xyXG4gICAgICogU2kgYWwgcmVjb3JyZXIgdG9kb3MgbG9zIGltcHVlc3RvcyBsYSBkaWZlcmVuY2lhIG5vIHNlIHphbmphLCBOSSBNT0RPUyBlbCBlcnJvciBlc3TDoSBlbiBvdHJhIHBhcnRlXHJcbiAgICAgKiBTZSBjcmVhIGVzdGEgZnVuY2nDs24gcGFyYSByZXNvbHZlciBsb3MgZXJyb3JlcyBkZSB0aW1icmFkbyBkZSBmYWN0dXJhIGVsZWN0csOzbmljYVxyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBcclxuICAgICAqIEBwYXJhbSBkaWZlcmVuY2lhIERpZmVyZW5jaWEgcXVlIHNlIGRlYmUgc2FsZGFyIHBhcmEgY29uc2VndWlyIGVsIHZhbG9yIHRvdGFsIGRlIGltcHVlc3RvcyByZXF1ZXJpZG9cclxuICAgICAqL1xyXG4gICAgYWp1c3RhZG9yRGVJbXB1ZXN0b3Mob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgZGlmZXJlbmNpYTogbnVtYmVyKSB7XHJcbiAgICAgICAgZm9yIChsZXQgX2kgPSAwOyBfaSA8IG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3MubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGltcHVlc3RvID0gb00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvc1tfaV07XHJcblxyXG4gICAgICAgICAgICAvL1NpIGxhIGRpZmVyZW5jaWEgZXMgcG9zaXRpdmEgcXVpZXJlIGRlY2lyIHF1ZSBsYSBzdW1hIGRlIGxvcyBpbXB1ZXN0b3MgZXMgbWVub3IgYSBsYSByZWFsXHJcbiAgICAgICAgICAgIGlmIChkaWZlcmVuY2lhID4gMCkge1xyXG4gICAgICAgICAgICAgICAgLy9TaSBlbCBpbXB1ZXN0byBzZSByZWRvbmRlbyBoYWNpYSBhYmFqbyBxdWllcmUgZGVjaXIgcXVlIHNlIHB1ZG8gcmVkb25kZWFyIGhhY2lhIGFycmliYVxyXG4gICAgICAgICAgICAgICAgLy9FbnRvbmNlcyBsbyBcInJlZG9uZGVhIGhhY2lhIGFycmliYVwiIHkgcmVzdGEgdW5hIGNlbnRlc2ltYSBhIGxhIGRpZmVyZW5jaWFcclxuICAgICAgICAgICAgICAgIGlmIChpbXB1ZXN0by5WYWxvciA8IGltcHVlc3RvLkxpbWl0ZU9wdWVzdG8pIHtcclxuICAgICAgICAgICAgICAgICAgICBpbXB1ZXN0by5WYWxvciA9IGltcHVlc3RvLkxpbWl0ZU9wdWVzdG87XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wdWVzdG8uQmFzZSA9IHRoaXMub01hdGhURi5yb3VuZChpbXB1ZXN0by5WYWxvciAvIGltcHVlc3RvLlBvcmNlbnRhamUsIDIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGRpZmVyZW5jaWEgPSBkaWZlcmVuY2lhIC0gMC4wMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vU2kgVmFsb3I+VmFsb3JSZWFsIHF1aWVyZSBkZWNpciBxdWUgcmVkb25kZW8gaGFjaWEgYXJyaWJhIHkgbm8gZGViZSBtb2RpZmljYXIgZXNlIHZhbG9yXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9TaSBsYSBkaWZlcmVuY2lhIGVzIG5lZ2F0aXZhIHF1aWVyZSBkZWNpciBxdWUgbGEgc3VtYSBkZSBsb3MgaW1wdWVzdG9zIGVzIG1heW9yIGEgbGEgcmVhbFxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vU2kgZWwgaW1wdWVzdG8gc2UgcmVkb25kZW8gaGFjaWEgYXJyaWJhIHF1aWVyZSBkZWNpciBxdWUgc2UgcHVkbyByZWRvbmRlYXIgaGFjaWEgYWJham9cclxuICAgICAgICAgICAgICAgIC8vRW50b25jZXMgbG8gXCJyZWRvbmRlYSBoYWNpYSBhYmFqb1wiIHkgc3VtYSB1bmEgY2VudGVzaW1hIGEgbGEgZGlmZXJlbmNpYVxyXG4gICAgICAgICAgICAgICAgaWYgKGltcHVlc3RvLlZhbG9yID4gaW1wdWVzdG8uTGltaXRlT3B1ZXN0bykge1xyXG4gICAgICAgICAgICAgICAgICAgIGltcHVlc3RvLlZhbG9yID0gaW1wdWVzdG8uTGltaXRlT3B1ZXN0bztcclxuICAgICAgICAgICAgICAgICAgICBpbXB1ZXN0by5CYXNlID0gdGhpcy5vTWF0aFRGLnJvdW5kKGltcHVlc3RvLlZhbG9yIC8gaW1wdWVzdG8uUG9yY2VudGFqZSwgMik7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlmZXJlbmNpYSA9IGRpZmVyZW5jaWEgKyAwLjAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy9TaSBWYWxvcjxWYWxvclJlYWwgcXVpZXJlIGRlY2lyIHF1ZSByZWRvbmRlbyBoYWNpYSBhYmFqbyB5IG5vIGRlYmUgbW9kaWZpY2FyIGVzZSB2YWxvclxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL1NpIHlhIHNlIHNhbGRvIGxhIGRpZmVyZW5jaWEgcm9tcGUgZWwgY2ljbG8gZGFuZG8gcG9yIGNvbmNsdWlkbyBlbCBhanVzdGVcclxuICAgICAgICAgICAgaWYgKGRpZmVyZW5jaWEgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9Mb2FkIHBvciB1bmlkYWQgZGV0YWxsZSBkZWwgbTNwcm9jZXNvIGl0ZW1zLlxyXG4gICAgcHVibGljIExvYWRNM1BEZXRhbGxlKHNWYWxvcjogc3RyaW5nLCBzQ29uY2VwdG86IHN0cmluZyk6IE0zUERldGFsbGVJdGVtcyB7XHJcbiAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXMgPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcbiAgICAgICAgb00zUERldGFsbGVJdGVtcy5Ob21icmVDb25jZXB0byA9IHNDb25jZXB0bztcclxuICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yID0gc1ZhbG9yO1xyXG4gICAgICAgIHJldHVybiBvTTNQRGV0YWxsZUl0ZW1zO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL0dlbmVyYXIgcHJvbW9jaW9uIGNvbWJpbmFkYVxyXG4gICAgcHVibGljIGFzeW5jIEdlbmVyYXJQcm9tb0NvbWJpbmFkYShvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb0RhdGFVc2VyOiBhbnkpIHtcclxuICAgICAgICBpZiAoIW9NM1Byb2Nlc29zLmxNM1BEaW5hbWljYXMgfHwgKG9NM1Byb2Nlc29zLmxNM1BEaW5hbWljYXMgJiYgIW9NM1Byb2Nlc29zLmxNM1BEaW5hbWljYXMuZmluZCh4ID0+IHguTm9tYnJlID09IFwiUFVFTlRFX0RJQVJJT1wiKSkpIHtcclxuICAgICAgICAgICAgdmFyIG9wcm9tb2Npb25lc1NlcnZpY2UgPSBuZXcgcHJvbW9jaW9uZXNTZXJ2aWNlKG9EYXRhVXNlciwgbnVsbCk7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gb3Byb21vY2lvbmVzU2VydmljZS5Qcm9jZXNhckNvbWJpbmFkYShvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgIHRoaXMuUmVjYWxjdWxhclByZWNpb3Mob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9Db21wYXJlIE0zUHJvY2Vzb3MuIChGaXJzdDogQFBhcmFtOiBpbE0zUHJvY2Vzb3NTUUwgVlMgU2Vjb25kOiBHZXQgRnJvbSBDb3VjaERCL1BvdWNoREIpXHJcbiAgICBwdWJsaWMgYXN5bmMgQ29tcGFyZU0zUHJvY2VzbyhzSURLYXRpb3M6IHN0cmluZywgb00zRGF0YTogTTNEYXRhLCBvRGF0YVVzZXI6IGFueSwgaWxNM1Byb2Nlc29zU1FMOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdmFyIG9SZXNwO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8vR2V0IGRhdGEsIGZyb20gUG91Y2hEQi9Db3VjaERCXHJcbiAgICAgICAgICAgIHZhciBQcm9wZXJ0eUNvbXBhcmUgPSBbXCJWYWxvck5ldG9cIiwgXCJWYWxvclwiXTtcclxuICAgICAgICAgICAgdmFyIHNLZXlDYXJyaXRvOiBzdHJpbmc7XHJcbiAgICAgICAgICAgIHZhciBvTTNQcm9jZXNvc0NPVUNIOiBNM1Byb2Nlc29zO1xyXG4gICAgICAgICAgICB2YXIgYlJlc3A6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgc0tleUNhcnJpdG8gPSBvTTNEYXRhLkdldEtleUNhcnJpdG9Db21wcmFzKHNJREthdGlvcywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURIVUIpO1xyXG4gICAgICAgICAgICAvL0dldCBkYXRhLCBmcm9tIFBvdWNoREIvQ291Y2hEQlxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvc0NPVUNIID0gYXdhaXQgb00zRGF0YS5HZXREYXRhUG91Y2hCRChzS2V5Q2Fycml0byk7XHJcblxyXG4gICAgICAgICAgICAvL1N0YXJ0IENvbXBhcmVcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBQcm9wZXJ0eUNvbXBhcmUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChpbE0zUHJvY2Vzb3NTUUxbUHJvcGVydHlDb21wYXJlW2ldXSAhPSBvTTNQcm9jZXNvc0NPVUNIW1Byb3BlcnR5Q29tcGFyZVtpXV0pIHtcclxuICAgICAgICAgICAgICAgICAgICBiUmVzcCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoYlJlc3ApIHtcclxuICAgICAgICAgICAgICAgIC8vQ29tcGFyZTogSUQsIElkUHJvZHVjdG8geSBDQU5USURBRFxyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBpbE0zUHJvY2Vzb3NTUUwuTTNFTkMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAob00zUHJvY2Vzb3NDT1VDSC5NM0VOQ1tqXS5JRCAhPSBpbE0zUHJvY2Vzb3NTUUwuTTNFTkNbal0uSUQgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUHJvY2Vzb3NDT1VDSC5NM0VOQ1tqXS5JZFByb2R1Y3RvICE9IGlsTTNQcm9jZXNvc1NRTC5NM0VOQ1tqXS5JZFByb2R1Y3RvIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zQ09VQ0guTTNFTkNbal0uTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvciAhPSBpbE0zUHJvY2Vzb3NTUUwuTTNFTkNbal0uTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBiUmVzcCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIG9SZXNwID0geyBcImJSZXNwXCI6IGJSZXNwLCBcIk0zUHJvY2Vzb3NcIjogb00zUHJvY2Vzb3NDT1VDSCB9O1xyXG4gICAgICAgICAgICByZXR1cm4gb1Jlc3A7XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBDb21wYXJlTTNQcm9jZXNvXCIpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgICAgIG9SZXNwID0geyBcImJSZXNwXCI6IHRydWUsIFwiTTNQcm9jZXNvc1wiOiBudWxsIH07XHJcbiAgICAgICAgICAgIHJldHVybiBvUmVzcDtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL0FkaWNpb25hciBjb21lcmNpYWwgYWwgcHJvY2VzbywgbG8gYWRpY2lvbmEgYWwgYXJyZWdsbyBkZSBkaW5hbWljb3MgYXNvY2lhZG8gYWwgcHJvY2Vzby5cclxuICAgIHB1YmxpYyBBZGRDb21lcmNpYWxUb00zUHJvY2VzbyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgVGRvY0NvbWVyY2lhbDogc3RyaW5nLCBOZG9jQ29tZXJjaWFsOiBzdHJpbmcpIHtcclxuICAgICAgICBvTTNQcm9jZXNvcy5sTTNQRGluYW1pY2FzLnB1c2godGhpcy5DcmVhdGVUdXBsYURpbmFtaWNhKFwiVENPTUVSQ0lBTFwiLCBUZG9jQ29tZXJjaWFsKSk7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MubE0zUERpbmFtaWNhcy5wdXNoKHRoaXMuQ3JlYXRlVHVwbGFEaW5hbWljYShcIk5DT01FUkNJQUxcIiwgTmRvY0NvbWVyY2lhbCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQ3JlYWNpb24geSByZXRvcm5vIGRlIHR1cGxhIGRlIGRpbmFtaWNvcywgYXRhZG9zIGEgcHJvY2VzbyBtMy5cclxuICAgIHB1YmxpYyBDcmVhdGVUdXBsYURpbmFtaWNhKG5vbWJyZSwgdmFsb3IpIHtcclxuICAgICAgICB2YXIgb00zUERpbmFtaWNhcyA9IG5ldyBNM1BEaW5hbWljYXMoKTtcclxuICAgICAgICBvTTNQRGluYW1pY2FzLk5vbWJyZSA9IG5vbWJyZTtcclxuICAgICAgICBvTTNQRGluYW1pY2FzLlZhbG9yID0gdmFsb3I7XHJcblxyXG4gICAgICAgIHJldHVybiBvTTNQRGluYW1pY2FzO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLy9BY3R1YWxpemEgbGEgY2FudGlkYWQgZGUgXHJcbiAgICBwdWJsaWMgc2V0Q2FudGlkYWRBTExZVVBEQ291Y2gob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM0RhdGE6IE0zRGF0YSxcclxuICAgICAgICBvRGF0YVVzZXI6IGFueSwgc0lES2F0aW9zOiBzdHJpbmcsIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24sIGlDYW50aWRhZCkge1xyXG5cclxuICAgICAgICBpZiAoaUNhbnRpZGFkID09IDAgJiYgb00zUHJvY2Vzb3MuSUREaWFyaW8gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAvLy9BdW4gbm8gZXN0YSByZWdpc3RyYWRvIGVsIHByb2Nlc28gY29tbyB0YWwsIHNlIHB1ZWRlIGJvcnJhciBkZSByYWl6XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DID0gbmV3IEFycmF5PE0zUEVuY0l0ZW1zPigpO1xyXG4gICAgICAgICAgICB0aGlzLlVwZGF0ZU0zUHJvY2Vzb3NXaXRoRGF0YShvTTNQcm9jZXNvcywgb00zRGF0YSwgb0RhdGFVc2VyLCBzSURLYXRpb3MsIFwiV0VCXCIsIGZ1bmNpb25PSywgZnVuY2lvbkVycm9yKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoaUNhbnRpZGFkID09IDApIHtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLkRlbGV0ZU0zUHJvY2VzbyhvTTNEYXRhLCBvRGF0YVVzZXIsIHNJREthdGlvcykudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkdldENhcnJpdG9Db21wcmFzUG91Y2hEQihvTTNEYXRhLCBvRGF0YVVzZXIsIHNJREthdGlvcykudGhlbihyZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcyA9IG5ldyBNM1Byb2Nlc29zKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNpb25PSyhvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLmZvckVhY2goZW5jID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IgPSBpQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuVXBkYXRlTTNQcm9jZXNvc1dpdGhEYXRhKG9NM1Byb2Nlc29zLCBvTTNEYXRhLCBvRGF0YVVzZXIsIHNJREthdGlvcywgXCJXRUJcIiwgZnVuY2lvbk9LLCBmdW5jaW9uRXJyb3IpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vL1NlIGNhbnRpZGFkIGRlIHVuIHByb2R1Y3RvIGVzcGVjaWZpY29cclxuICAgIHB1YmxpYyBzZXRDYW50aWRhZFlVUERDb3VjaChvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zRGF0YTogTTNEYXRhLFxyXG4gICAgICAgIG9EYXRhVXNlcjogYW55LCBzSURLYXRpb3M6IHN0cmluZywgZnVuY2lvbk9LOiBGdW5jdGlvbixcclxuICAgICAgICBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uLCBpZFByb2R1Y3RvLCBMb3RlLCBpQ2FudGlkYWQsIHRpcG9VYmljYWNpb24sIElERW5jLFxyXG4gICAgICAgIG0zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBmb3J6YXJCb3JyYWQ6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG5cclxuICAgICAgICBpZiAoKGlDYW50aWRhZCA9PSAwICYmIG9NM1Byb2Nlc29zLklERGlhcmlvID09PSB1bmRlZmluZWQgJiYgdGlwb1ViaWNhY2lvbiA9PSBcIldFQlwiKSB8fCBmb3J6YXJCb3JyYWQpIHtcclxuICAgICAgICAgICAgLy8vQXVuIG5vIGVzdGEgcmVnaXN0cmFkbyBlbCBwcm9jZXNvIGNvbW8gdGFsLCBzZSBwdWVkZSBib3JyYXIgZGUgcmFpelxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQyA9IG9NM1Byb2Nlc29zLk0zRU5DLmZpbHRlcihwcm9kID0+ICEocHJvZC5JZFByb2R1Y3RvID09IGlkUHJvZHVjdG8gJiYgcHJvZC5JRCA9PSBJREVuYykgJiYgIShwcm9kLklkRW5jUGFkcmUgPT0gSURFbmMpKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBsb00zUEl0ZW1zV0VCID0gbmV3IE0zUEl0ZW1zV0VCKCk7XHJcbiAgICAgICAgICAgIGxvTTNQSXRlbXNXRUIuZENhbnRpZGFkID0gMDtcclxuICAgICAgICAgICAgdGhpcy5VcGRhdGVNM1Byb2Nlc29zV2l0aERhdGEob00zUHJvY2Vzb3MsIG9NM0RhdGEsIG9EYXRhVXNlciwgc0lES2F0aW9zLCB0aXBvVWJpY2FjaW9uLCBmdW5jaW9uT0ssIGZ1bmNpb25FcnJvciwgbTNVYmljYWNpb24pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIEpBR00gMjAxOTEwMjEsIG5vIGhhY2VyIGzDs2dpY2EgZGUgcHJvbW9jaW9uZXMgeSB2YXJpb3MsIGN1w6FuZG8gc2UgYm9ycmEgZWwgaXRlbS5cclxuICAgICAgICAgICAgaWYgKGlDYW50aWRhZCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5maW5kKGVuYyA9PiBlbmMuSWRQcm9kdWN0byA9PSBpZFByb2R1Y3RvICYmIGVuYy5Mb3RlID09IExvdGUgJiYgZW5jLklEID09IElERW5jKS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvciA9IGlDYW50aWRhZDtcclxuICAgICAgICAgICAgICAgIHRoaXMuVXBkYXRlTTNQcm9jZXNvc1dpdGhEYXRhKG9NM1Byb2Nlc29zLCBvTTNEYXRhLCBvRGF0YVVzZXIsIHNJREthdGlvcywgdGlwb1ViaWNhY2lvbiwgZnVuY2lvbk9LLCBmdW5jaW9uRXJyb3IsIG0zVWJpY2FjaW9uKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2FudGlkYWRWMihvTTNQcm9jZXNvcywgaWRQcm9kdWN0bywgTG90ZSwgaUNhbnRpZGFkLCBJREVuYywgb0RhdGFVc2VyLCBzSURLYXRpb3MsIG0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTykudGhlbihyZXNwID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlVwZGF0ZU0zUHJvY2Vzb3NXaXRoRGF0YShvTTNQcm9jZXNvcywgb00zRGF0YSwgb0RhdGFVc2VyLCBzSURLYXRpb3MsIHRpcG9VYmljYWNpb24sIGZ1bmNpb25PSywgZnVuY2lvbkVycm9yLCBtM1ViaWNhY2lvbiwgcmVzcC5NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcblxyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgLy90aGlzLlVwZGF0ZU0zUHJvY2Vzb3NXaXRoRGF0YShvTTNQcm9jZXNvcywgb00zRGF0YSwgb0RhdGFVc2VyLCBzSURLYXRpb3MsIHRpcG9VYmljYWNpb24sIGZ1bmNpb25PSywgZnVuY2lvbkVycm9yKTtcclxuICAgIH1cclxuXHJcbiAgICAvL0NhbWJpYXIgY2FudGlkYWQgZGUgbTNwcm9jZXNvXHJcbiAgICAvL0pBR00gMjAxOTEwMTggU2UgYWdyZWdhIG51ZXZhIGZ1bmNpb25hbGlkYWQgYSBsYSBjYW50aWRhZDogXHJcbiAgICAvLzEuU2UgYm9ycmEgZWwgcHJvZHVjdG8gZGUgbGEgbGlzdGEgZGVsIHByb2Nlc29cclxuICAgIC8vMi4gU2UgYWdyZWdhIGRlIG51ZXZvIGVsIHByb2R1Y3RvIGNvbiBsYSBudWV2YSBjYW50aWRhZC5cclxuICAgIHB1YmxpYyBhc3luYyBzZXRDYW50aWRhZFYyKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBpZFByb2R1Y3RvLCBMb3RlLCBpQ2FudGlkYWQsIElERW5jLCBvRGF0YVVzZXI6IGFueVxyXG4gICAgICAgICwgc0lES2F0aW9zOiBzdHJpbmcsIG0zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+KSB7XHJcbiAgICAgICAgdmFyIG9Qcm9kdWN0bzogVHlwZU0zUHJkR3JwID0gbnVsbDtcclxuICAgICAgICB2YXIgb00zUEl0ZW1zV0VCID0gbmV3IE0zUEl0ZW1zV0VCKCk7XHJcbiAgICAgICAgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9IGlDYW50aWRhZDtcclxuICAgICAgICAvL0pBR00gMjAxOTExMTQsIEFncmVnYXIgaW1hZ2VuXHJcbiAgICAgICAgdmFyIG9NM1BFbmNJdGVtcyA9IG9NM1Byb2Nlc29zLk0zRU5DLmZpbmQoZW5jID0+IGVuYy5JZFByb2R1Y3RvID09IGlkUHJvZHVjdG8gJiYgZW5jLkxvdGUgPT0gTG90ZSAmJiBlbmMuSUQgPT0gSURFbmMpO1xyXG4gICAgICAgIGlmIChvTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICAgICAgb00zUEl0ZW1zV0VCLlBhdGhJbWFnZW4gPSBvTTNQRW5jSXRlbXMuUGF0aEltYWdlO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DID0gb00zUHJvY2Vzb3MuTTNFTkMuZmlsdGVyKGVuYyA9PiAhKGVuYy5JZFByb2R1Y3RvID09IGlkUHJvZHVjdG8gJiYgZW5jLkxvdGUgPT0gTG90ZSAmJiAoZW5jLklEID09IElERW5jIHx8IGVuYy5JZEVuY1BhZHJlID09IElERW5jKSkpO1xyXG5cclxuICAgICAgICBvUHJvZHVjdG8gPSBhd2FpdCB0aGlzLkdldFByb2R1Y3RvQnlTS1UoaWRQcm9kdWN0bywgdHJ1ZSwgb00zUHJvY2Vzb3MsIG9EYXRhVXNlciwgb00zUEVuY0l0ZW1zLkRJU1BPTklCTEUpO1xyXG4gICAgICAgIG9NM1BJdGVtc1dFQiA9IHRoaXMuTG9hZEFkaWNpb25hbGVzKG9NM1BJdGVtc1dFQiwgb1Byb2R1Y3RvKTtcclxuICAgICAgICBvTTNQcm9jZXNvcyA9IHRoaXMuYWRkdG9jYXJ0KG9NM1BJdGVtc1dFQiwgb1Byb2R1Y3RvLCBudWxsLCBudWxsLCBvRGF0YVVzZXIsIHNJREthdGlvcywgbTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgcmV0dXJuIHsgXCJNM1Byb2Nlc29cIjogb00zUHJvY2Vzb3MsIFwiTTNQSXRlbXNXRUJcIjogb00zUEl0ZW1zV0VCIH07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0X00zRU5DX2J5X2lkcHJkX2xvdGUob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIGlkUHJvZHVjdG8sIExvdGUpOiBNM1BFbmNJdGVtcyB7XHJcbiAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zLk0zRU5DLmZpbmQoZW5jID0+IGVuYy5JZFByb2R1Y3RvID09IGlkUHJvZHVjdG8gJiYgZW5jLkxvdGUgPT0gTG90ZSlcclxuICAgIH1cclxuXHJcbiAgICAvL09idGVuZXIgY2FudGlkYWQgZGUgdW4gZW5jYWJlemFkbywgcHJvZHVjdG8gZXNwZWNpZmljby5cclxuICAgIHB1YmxpYyBnZXRDYW50aWRhZChvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb1Byb2R1Y3RvOiBNM1ByZEdlbmVyYWwpIHtcclxuICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3MuTTNFTkMuZmluZChlbmMgPT4gZW5jLklkUHJvZHVjdG8gPT0gb1Byb2R1Y3RvLlNLVSAmJiBlbmMuTG90ZSA9PSBvUHJvZHVjdG8uTE9URSkuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENhbnRpZGFkVG90YWwob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MgIT09IHVuZGVmaW5lZCAmJiBvTTNQcm9jZXNvcy5NM0VOQyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLmZpbHRlcihlbmMgPT4gKCtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpID4gMCkuXHJcbiAgICAgICAgICAgICAgICByZWR1Y2UoKGFjYywgY3VyKSA9PiAoYWNjKSArICgrY3VyLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKSwgMClcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8vLy8vUkVHSU9OIERFIFJFQ0VQQ0lPTlxyXG4gICAgLy9TZSBhZ3JlZ2EgYXRyaWJ1dG8gZGUgQ3VycmVudCBjYW50aWRhZCBkZSByZWNlcGNpb25cclxuICAgIHB1YmxpYyBNZXJnZVJlY2VwWUVuYyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgaWRSZWNlcGNpb246IG51bWJlcikge1xyXG4gICAgICAgIC8vb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQcmRHZW5lcmFsLkNUQkxEUFJELCBcIkNUQkxEUFJEXCIpKTtcclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MuTTNQUmVjZXBjaW9uLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNQUmVjZXBjaW9uLmZpbHRlcihyZWNlcCA9PiByZWNlcC5JZFJlY2VwY2lvbiA9PSBpZFJlY2VwY2lvbikuZm9yRWFjaChyZWMgPT4ge1xyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMuZmluZChlbmMgPT4gZW5jLklEID09IHJlYy5JZEVuYykuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKHJlYy5DYW50aWRhZC50b1N0cmluZygpLCBcIkNVUkNSRUNcIikpOy8vQ1VSUkVOVCBDQU5USURBRCBSRUNFUENJT05cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vRGVqYXIgbG9zIGRlIHRhbGxlcyBkZSBsYSB2YXJpYWJsZTogQ1VSQ1JFQyBlbj0wLCBFc3RvIHBhcmEgZmx1am9zLCBkb25kZSBhZ3JlZ2EgaW5mbyBwcm9jZXNhIHkgYWjDrSBtaXNtbyBhZ3JlZ2EgbcOhcy5cclxuICAgIHB1YmxpYyBSZW1vdmVDdXJDUmVjKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zICE9PSB1bmRlZmluZWQgJiYgb00zUHJvY2Vzb3MgIT0gbnVsbCAmJiBvTTNQcm9jZXNvcy5NM0VOQyAhPT0gdW5kZWZpbmVkICYmIG9NM1Byb2Nlc29zLk0zRU5DICE9IG51bGwpXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLmZvckVhY2goZW5jID0+IHtcclxuICAgICAgICAgICAgICAgIHZhciBvRGV0YWxsZTogTTNQRGV0YWxsZUl0ZW1zO1xyXG4gICAgICAgICAgICAgICAgb0RldGFsbGUgPSBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ1VSQ1JFQ1wiKTtcclxuICAgICAgICAgICAgICAgIGlmIChvRGV0YWxsZSAhPT0gdW5kZWZpbmVkICYmIG9EZXRhbGxlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBvRGV0YWxsZS5WYWxvciA9IFwiMFwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvLy8vLy9GSU4gUkVHSU9OIERFIFJFQ0VQQ0lPTlxyXG5cclxuICAgIC8vLy8vLy9SRUdJT04gRU5UUkVHQVxyXG4gICAgLy9TZSBhZ3JlZ2EgYXRyaWJ1dG8gZGUgQ3VycmVudCBjYW50aWRhZCBkZSBlbnZpb1xyXG4gICAgcHVibGljIE1lcmdlRW50cFlFbmMob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICAvL29NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUHJkR2VuZXJhbC5DVEJMRFBSRCwgXCJDVEJMRFBSRFwiKSk7XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zLk0zUEVudmlvcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zUEVudmlvcy5mb3JFYWNoKGVudiA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YXIgbEVuYzogQXJyYXk8TTNQRW5jSXRlbXM+O1xyXG4gICAgICAgICAgICAgICAgbEVuYyA9IG9NM1Byb2Nlc29zLk0zRU5DLmZpbHRlcihlbmMgPT4gZW5jLklkRW52aW8gPT0gZW52LklkRW52aW8pO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChsRW5jICE9PSB1bmRlZmluZWQgJiYgbEVuYyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbEVuYy5mb3JFYWNoKGVuYyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yLCBcIkNVUkNFTlRcIikpOy8vQ1VSUkVOVCBDQU5USURBRCBSRUNFUENJT05cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9EZWphciBsb3MgZGUgdGFsbGVzIGRlIGxhIHZhcmlhYmxlOiBDVVJDUkVDIGVuPTAsIEVzdG8gcGFyYSBmbHVqb3MsIGRvbmRlIGFncmVnYSBpbmZvIHByb2Nlc2EgeSBhaMOtIG1pc21vIGFncmVnYSBtw6FzLlxyXG4gICAgcHVibGljIFJlbW92ZUN1ckNFbnQob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MgIT09IHVuZGVmaW5lZCAmJiBvTTNQcm9jZXNvcyAhPSBudWxsICYmIG9NM1Byb2Nlc29zLk0zRU5DICE9PSB1bmRlZmluZWQgJiYgb00zUHJvY2Vzb3MuTTNFTkMgIT0gbnVsbClcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMuZm9yRWFjaChlbmMgPT4ge1xyXG4gICAgICAgICAgICAgICAgdmFyIG9EZXRhbGxlOiBNM1BEZXRhbGxlSXRlbXM7XHJcbiAgICAgICAgICAgICAgICBvRGV0YWxsZSA9IGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDVVJDRU5UXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKG9EZXRhbGxlICE9PSB1bmRlZmluZWQgJiYgb0RldGFsbGUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9EZXRhbGxlLlZhbG9yID0gXCIwXCI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcblxyXG4gICAgfVxyXG4gICAgLy8vLy8vL0ZJTiBSRUdJT04gRU5UUkVHQVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb21vY2lvbmVzIHF1ZSBzZSBwcm9jZXNhbiBkZXNwdWVzIGRlIGFncmVnYXIgYWwgY2Fycml0b1xyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFxyXG4gICAgICogQHBhcmFtIG9EYXRhVXNlciBcclxuICAgICAqIEBwYXJhbSBvTTNQSXRlbXNXRUIgXHJcbiAgICAgKiBAcGFyYW0gb00zVWJpY2FjaW9uIFxyXG4gICAgICogQHBhcmFtIEVuTGluZWEgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBQcm9jUHJvbW9BZnRlckFkZFRvQ2FydChvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb0RhdGFVc2VyOiBhbnksXHJcbiAgICAgICAgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgRW5MaW5lYTogYm9vbGVhbikge1xyXG5cclxuICAgICAgICBhd2FpdCB0aGlzLlByb2Nlc2FyT2JzZXF1aW9zKG9EYXRhVXNlciwgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIEVuTGluZWEsIG9NM1Byb2Nlc29zKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb2Nlc2FyIHByb21vY2lvbmVzIGRlc3B1ZXMgZGUgZmluYWxpemFyIGVsIHJlZ2lzdHJvXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBQcm9jUHJvbW9BZnRlckZpbmFsaXphcihvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBvRGF0YVVzZXI6IGFueSkge1xyXG5cclxuICAgICAgICB0aGlzLkdlbmVyYXJQcm9tb0NvbWJpbmFkYShvTTNQcm9jZXNvcywgb0RhdGFVc2VyKTtcclxuICAgICAgICB0aGlzLlByb21vQWZ0ZXJQcm9jZXNvKG9NM1Byb2Nlc29zLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBQcm9tb0FmdGVyUHJvY2VzbyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBvRGF0YVVzZXI6IGFueSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBvcHJvbW9jaW9uZXNTZXJ2aWNlID0gbmV3IHByb21vY2lvbmVzU2VydmljZShvRGF0YVVzZXIsIG51bGwpO1xyXG4gICAgICAgICAgICB2YXIgbFRpcG9zUHJvbW8gPSBuZXcgQXJyYXk8U3RyaW5nPigpO1xyXG4gICAgICAgICAgICB2YXIgYXJyUHJvbW86IEFycmF5PGFueT47XHJcbiAgICAgICAgICAgIHZhciBvUHJvbW9jaW9uUHJvY2VzYWRhID0gbmV3IFByb21vY2lvblByb2Nlc2FkYSgpO1xyXG4gICAgICAgICAgICBsVGlwb3NQcm9tby5wdXNoKFwiQUZURVJcIik7XHJcbiAgICAgICAgICAgIGFyclByb21vID0gb3Byb21vY2lvbmVzU2VydmljZS5WZXJpZmljYXJQcm9tb2Npb25lcyhvTTNQcm9jZXNvcywgbnVsbCwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgbFRpcG9zUHJvbW8pO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhID0gb3Byb21vY2lvbmVzU2VydmljZS5Qcm9jZXNhclByb21vQWZ0ZXIoYXJyUHJvbW8sIG9NM1Byb2Nlc29zLCBvTTNFTkNQUk9NTyk7XHJcblxyXG4gICAgICAgICAgICBpZiAob1Byb21vY2lvblByb2Nlc2FkYSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcy5WYWxvck5ldG8gPSBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5BZGRJbmZvUHJvbW9jaW9uZXNBRGluYW1pY2FzKG9NM1Byb2Nlc29zLCBvUHJvbW9jaW9uUHJvY2VzYWRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZ3JlZ2FyIGluZm9ybWFjaW9uIGRlIHByb21vY2lvbmVzIGEgaW5mb3JtYWNpb24gZGluYW1pY2EgZGVsIHByb2Nlc29cclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqIEBwYXJhbSBvUHJvbW9jaW9uUHJvY2VzYWRhIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWRkSW5mb1Byb21vY2lvbmVzQURpbmFtaWNhcyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhKSB7XHJcbiAgICAgICAgdmFyIGRhdGEgPSB0aGlzLkdlbmVyYXJJbmZvUHJvbW9jaW9uZXNQcm9jZXNhZGFzKG9Qcm9tb2Npb25Qcm9jZXNhZGEsIDApO1xyXG4gICAgICAgIGlmIChkYXRhICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdmFyIG9NM1BEaW5hbWljYXMgPSBuZXcgTTNQRGluYW1pY2FzKCk7XHJcbiAgICAgICAgICAgIG9NM1BEaW5hbWljYXMgPSB0aGlzLkNyZWF0ZVR1cGxhRGluYW1pY2EoXCJWQUxfUFJPTU9DXCIsIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24udG9TdHJpbmcoKSlcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MubE0zUERpbmFtaWNhcy5wdXNoKG9NM1BEaW5hbWljYXMpO1xyXG5cclxuICAgICAgICAgICAgb00zUERpbmFtaWNhcyA9IHRoaXMuQ3JlYXRlVHVwbGFEaW5hbWljYShcIk5PTUJfUFJPTU9DXCIsIGRhdGEuTk9NQlJFUylcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MubE0zUERpbmFtaWNhcy5wdXNoKG9NM1BEaW5hbWljYXMpO1xyXG5cclxuICAgICAgICAgICAgb00zUERpbmFtaWNhcyA9IHRoaXMuQ3JlYXRlVHVwbGFEaW5hbWljYShcIklEX1BST01PQ1wiLCBkYXRhLklEKVxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5sTTNQRGluYW1pY2FzLnB1c2gob00zUERpbmFtaWNhcyk7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLy8vT2J0aWVuZSBlbCBwcm9jZXNvIGFzb3NpYWRvIGEgdW4gaWRwcmVzdGFtb3NcclxuICAgIGFzeW5jIGdldF9tM19wcm9jZXNvX2J5X2lkX3ByZXN0YW1vX2FzeW5jKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBpZF9wcmVzdGFtbzogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIHJlc3AgPSBhd2FpdCBQb3N0U2VydmljZU0zLmdldE0zKCdNMy9nZXRNM1Byb2Nlc29CeUlkUHJlc3RhbW8vJyArIGlkX2thdGlvcyArICcvJyArIGlkX3ByZXN0YW1vKS50b1Byb21pc2UoKTtcclxuICAgICAgICByZXR1cm4gcmVzcDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgR2V0Q29uY2VwdG9NM1NhbGRvc0l0ZW1VYihQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgakRhdGE6IGFueSkge1xyXG4gICAgICAgIHZhciByZXNwO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXNwID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNMy9HZXRDb25jZXB0b00zU2FsZG9zSXRlbVViLycgKyBzSURLYXRpb3MsIGpEYXRhKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3A7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWdyZWdhIG8gbW9kaWZpY2EgbGEgY2FudGlkYWQgZGUgdW4gb2JqZXRvIE0zT3RDbGFzaWZpY2FjaW9uZXMgZGVudHJvIGRlbGEgbGlzdGEgZGUgdW4gUHJvY2Vzb1xyXG4gICAgICogQHBhcmFtIHByb2R1Y3QgXHJcbiAgICAgKiBAcGFyYW0gY2FudGlkYWQgXHJcbiAgICAgKiBAcGFyYW0gaW9NM1Byb2Nlc29zIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25PSyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZFByb2R1Y3RvVG9PdHJhc0NsYXMocHJvZHVjdDogVHlwZU0zUHJkR3JwLCBjYW50aWRhZDogbnVtYmVyLCBpb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIGZ1bmNpb25PSzogRnVuY3Rpb24pIHtcclxuICAgICAgICB2YXIgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MgPSBpb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgdmFyIG9NM090Q2xhc2lmaWNhY2lvbmVzOiBNM090Q2xhc2lmaWNhY2lvbmVzO1xyXG4gICAgICAgIHZhciBwcm9kdWN0VW5pdFNlbGVjdGVkOiBNM1ByZEdlbmVyYWw7XHJcbiAgICAgICAgcHJvZHVjdFVuaXRTZWxlY3RlZCA9IHByb2R1Y3QuTG9NM1ByZEdlbmVyYWxbMF07XHJcblxyXG4gICAgICAgIGxldCBwcm9kdWN0b0V4aXN0ZSA9IHRoaXMudmFsaWRhckV4aXN0YU90cmFDbGFzaWYob00zUHJvY2Vzb3MuTTNPdENsYXNpZmljYWNpb25lcywgcHJvZHVjdCk7XHJcbiAgICAgICAgaWYgKHByb2R1Y3RvRXhpc3RlKSB7XHJcbiAgICAgICAgICAgIHByb2R1Y3RvRXhpc3RlLkNhbnRpZGFkID0gcHJvZHVjdG9FeGlzdGUuQ2FudGlkYWQgKyBjYW50aWRhZDtcclxuICAgICAgICAgICAgcHJvZHVjdG9FeGlzdGUuVmFsb3IgPSArYmlnRGVjaW1hbC5tdWx0aXBseShwcm9kdWN0VW5pdFNlbGVjdGVkLkxvTTNQcmRMaXN0YS5QUkVDSU8sIHByb2R1Y3RvRXhpc3RlLkNhbnRpZGFkKTtcclxuICAgICAgICAgICAgcHJvZHVjdG9FeGlzdGUuT3JkZW4gPSB0aGlzLkdldE1heEF0cmlidXRvRnJvbUxpc3RhKG9NM1Byb2Nlc29zLk0zT3RDbGFzaWZpY2FjaW9uZXMsIFwiT3JkZW5cIikgKyAxO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG9NM090Q2xhc2lmaWNhY2lvbmVzID0gbmV3IE0zT3RDbGFzaWZpY2FjaW9uZXMoKTtcclxuICAgICAgICAgICAgb00zT3RDbGFzaWZpY2FjaW9uZXMuQ2FudGlkYWQgPSBjYW50aWRhZDtcclxuICAgICAgICAgICAgb00zT3RDbGFzaWZpY2FjaW9uZXMuSWRQcm9kdWN0byA9IHByb2R1Y3RVbml0U2VsZWN0ZWQuU0tVO1xyXG4gICAgICAgICAgICBvTTNPdENsYXNpZmljYWNpb25lcy5Ob21icmUgPSBwcm9kdWN0VW5pdFNlbGVjdGVkLk5PTUJSRTE7XHJcbiAgICAgICAgICAgIG9NM090Q2xhc2lmaWNhY2lvbmVzLlZhbG9yID0gK2JpZ0RlY2ltYWwubXVsdGlwbHkocHJvZHVjdFVuaXRTZWxlY3RlZC5Mb00zUHJkTGlzdGEuUFJFQ0lPLCBjYW50aWRhZCk7XHJcbiAgICAgICAgICAgIG9NM090Q2xhc2lmaWNhY2lvbmVzLklEID0gdGhpcy5HZXRNYXhBdHJpYnV0b0Zyb21MaXN0YShvTTNQcm9jZXNvcy5NM090Q2xhc2lmaWNhY2lvbmVzLCBcIklEXCIpICsgMTtcclxuICAgICAgICAgICAgb00zT3RDbGFzaWZpY2FjaW9uZXMuT3JkZW4gPSB0aGlzLkdldE1heEF0cmlidXRvRnJvbUxpc3RhKG9NM1Byb2Nlc29zLk0zT3RDbGFzaWZpY2FjaW9uZXMsIFwiT3JkZW5cIikgKyAxO1xyXG5cclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNPdENsYXNpZmljYWNpb25lcy5wdXNoKG9NM090Q2xhc2lmaWNhY2lvbmVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zID0gdGhpcy5yZWNhbGN1bGFyVmFsT3RyYUNsYXNpTTNQcm9jZXNvcyhpb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIGZ1bmNpb25PSyhvTTNQcm9jZXNvcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbGltaW5hIHVuIG9iamV0byBNM090Q2xhc2lmaWNhY2lvbmVzIHBvbmllbmRvIHN1IHZhbG9yIHkgY2FudGlkYWQgZW4gY2Vyb1xyXG4gICAgICogQHBhcmFtIG9NM090Q2xhc2lmaWNhY2lvbmVzIFxyXG4gICAgICogQHBhcmFtIGlvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgZGVsZXRlUHJvZHVjdG9Gcm9tT3RyYXNDbGFzKG9NM090Q2xhc2lmaWNhY2lvbmVzOiBNM090Q2xhc2lmaWNhY2lvbmVzLCBpb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpOiBNM1Byb2Nlc29zIHtcclxuICAgICAgICBsZXQgcHJvZHVjdG9BY3R1YWwgPSBpb00zUHJvY2Vzb3MuTTNPdENsYXNpZmljYWNpb25lcy5maW5kKHggPT4geC5JZFByb2R1Y3RvID09IG9NM090Q2xhc2lmaWNhY2lvbmVzLklkUHJvZHVjdG8pO1xyXG4gICAgICAgIGlmIChwcm9kdWN0b0FjdHVhbCkge1xyXG4gICAgICAgICAgICBwcm9kdWN0b0FjdHVhbC5DYW50aWRhZCA9IDA7XHJcbiAgICAgICAgICAgIHByb2R1Y3RvQWN0dWFsLlZhbG9yID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zID0gdGhpcy5yZWNhbGN1bGFyVmFsT3RyYUNsYXNpTTNQcm9jZXNvcyhpb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIHJldHVybiBpb00zUHJvY2Vzb3M7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWNhbGN1bGEgZWwgdmFsb3IgZGUgTTNQcm9jZXNvcy5WYWxPdHJhQ2xhc2kgYSBwYXJ0aXIgZGUgbGEgc3VtYXRvcmlhIGRlIGxvcyBvYmpldG9zIGRlbnRybyBkZWwgYXJyZWdsbyBNM1Byb2Nlc29zLk0zT3RDbGFzaWZpY2FjaW9uZXNcclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgcmVjYWxjdWxhclZhbE90cmFDbGFzaU0zUHJvY2Vzb3Mob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBvTTNQcm9jZXNvcy5WYWxPdHJhQ2xhc2kgPSBvTTNQcm9jZXNvcy5NM090Q2xhc2lmaWNhY2lvbmVzLnJlZHVjZShmdW5jdGlvbiAoc3VtYSwgb00zT3RDbGFzaWZpY2FjaW9uZXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHN1bWEgKyBvTTNPdENsYXNpZmljYWNpb25lcy5WYWxvcjtcclxuICAgICAgICB9LCAwKVxyXG4gICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYSBsYSBleGlzdGVuY2lhIGRlIHVuIHByb2R1Y3RvIGRlbnRybyBkZSB1biBsYSBsaXN0YSBkZSBNM090Q2xhc2lmaWNhY2lvbmVzXHJcbiAgICAgKiBAcGFyYW0gbGlzdE0zT3RDbGFzaWZpY2FjaW9uZXMgXHJcbiAgICAgKiBAcGFyYW0gcHJvZHVjdCBcclxuICAgICAqL1xyXG4gICAgdmFsaWRhckV4aXN0YU90cmFDbGFzaWYobGlzdE0zT3RDbGFzaWZpY2FjaW9uZXM6IEFycmF5PE0zT3RDbGFzaWZpY2FjaW9uZXM+LCBwcm9kdWN0OiBUeXBlTTNQcmRHcnApIHtcclxuICAgICAgICBsZXQgcHJvZHVjdG9FeGlzdGUgPSBsaXN0TTNPdENsYXNpZmljYWNpb25lcy5maW5kKHggPT4geC5JZFByb2R1Y3RvID09IHByb2R1Y3QuTG9NM1ByZEdlbmVyYWxbMF0uU0tVKTtcclxuICAgICAgICByZXR1cm4gcHJvZHVjdG9FeGlzdGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICogTGltcGlhIGxvcyBkZXRhbGxlcyB5IGxvcyBpbXB1ZXN0b3MgZGUgdW4gcHJvZHVjdG8gZGFkbyBlbiB1biBwcm9jZXNvIGRlIGRldm9sdWNpb25cclxuICAgKiBAcGFyYW0gcHJvZHVjdG9Cb3JyYWRvIFxyXG4gICAqIEBwYXJhbSBwcm9jZXNvRGV2b2x1Y2lvbiBcclxuICAgKi9cclxuICAgIGRlbGV0ZVByZERldm9sdWNpb24ocHJvZHVjdG9Cb3JyYWRvLCBwcm9jZXNvRGV2b2x1Y2lvbjogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGxldCBwcm9kdWN0byA9IHByb2Nlc29EZXZvbHVjaW9uLk0zRU5DLmZpbmQoeCA9PiB4LklkUHJvZHVjdG8gPT0gcHJvZHVjdG9Cb3JyYWRvLklkUHJvZHVjdG8pO1xyXG4gICAgICAgIGlmIChwcm9kdWN0bykge1xyXG4gICAgICAgICAgICBwcm9kdWN0by5NM0RFVC5mb3JFYWNoKGRldCA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKCtkZXQuVmFsb3IpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0LlZhbG9yID0gXCIwXCI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgcHJvZHVjdG8uTTNQSW1wdWVzdG9zLmZvckVhY2goaW1wID0+IHtcclxuICAgICAgICAgICAgICAgIGltcC5WYWxvciA9IDA7XHJcbiAgICAgICAgICAgICAgICBpbXAuQmFzZSA9IDA7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFqdXN0YSBsb3MgVmFsb3JlcyBlbiBjYXNvIGRlIGVuY29udHJhciBkaWZlcmVuY2lhcyBwYXJhIHBvZGVyIGdlbmVyYXIgRkVcclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgYWp1c3RhZG9yVmFsb3Jlc0NGRElGcm9udChvTTNQcm9jZXNvczogTTNQcm9jZXNvcyk6IE0zUHJvY2Vzb3Mge1xyXG4gICAgICAgIGxldCBkaWZlcmVuY2lhID0gMDtcclxuICAgICAgICBsZXQgdG90YWxEZXNjdWVudG9zID0gdGhpcy5nZXRWYWxvclRvdGFsRGVzY3VlbnRvcyhvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgbGV0IHRvdGFsSW1wb3J0ZUltcHVlc3RvcyA9IHRoaXMuZ2V0VmFsb3JUb3RhbEltcG9ydGVJbXB1ZXN0b3Mob00zUHJvY2Vzb3MpO1xyXG5cclxuICAgICAgICBkaWZlcmVuY2lhID0gdGhpcy5vTWF0aFRGLnJvdW5kKG9NM1Byb2Nlc29zLlZhbG9yTmV0byAtIChvTTNQcm9jZXNvcy5WYWxvciArIHRvdGFsSW1wb3J0ZUltcHVlc3RvcyAtIHRvdGFsRGVzY3VlbnRvcyksIDMpO1xyXG4gICAgICAgIGlmIChkaWZlcmVuY2lhICE9IDApIHtcclxuICAgICAgICAgICAgaWYgKHRvdGFsSW1wb3J0ZUltcHVlc3RvcyA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWp1c3RhZG9ySW1wdWVzdG9zQ0ZESShkaWZlcmVuY2lhLCBvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFqdXN0YWRvckRlc2N1ZW50b3NDRkRJKGRpZmVyZW5jaWEsIG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBlbCB2YWxvciB0b3RhbCBkZSBwcm9tb2Npb25lcyBhcGxpY2FkYXMgZW4gZWwgcHJvY2VzbyBlbiBjdWVzdGnDs25cclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgZ2V0VmFsb3JUb3RhbERlc2N1ZW50b3Mob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpOiBudW1iZXIge1xyXG4gICAgICAgIGxldCB0b3RhbERlc2N1ZW50b3MgPSAwO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLmZvckVhY2goZW5jID0+IHtcclxuICAgICAgICAgICAgbGV0IGRldGFsbGVQcm9tbyA9IGVuYy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlRPVEFMUFJPTU9cIik7XHJcbiAgICAgICAgICAgIGlmIChkZXRhbGxlUHJvbW8pIHtcclxuICAgICAgICAgICAgICAgIHRvdGFsRGVzY3VlbnRvcyArPSArZGV0YWxsZVByb21vLlZhbG9yO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0b3RhbERlc2N1ZW50b3M7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGVsIHZhbG9yIHRvdGFsIGRlIGltcHVlc3RvcyBjb2JyYWRvcyBlbiBlbCBwcm9jZXNvIGVuIGN1ZXN0acOzblxyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFxyXG4gICAgICovXHJcbiAgICBnZXRWYWxvclRvdGFsSW1wb3J0ZUltcHVlc3RvcyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcyk6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IHRvdGFsSW1wb3J0ZUltcHVlc3RvcyA9IDA7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMuZm9yRWFjaChlbmMgPT4ge1xyXG4gICAgICAgICAgICBlbmMuTTNQSW1wdWVzdG9zLmZvckVhY2goaW1wID0+IHtcclxuICAgICAgICAgICAgICAgIHRvdGFsSW1wb3J0ZUltcHVlc3RvcyArPSAraW1wLlZhbG9yO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRvdGFsSW1wb3J0ZUltcHVlc3RvcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE11ZXZlIGVsIHZhbG9yIGRlIHVuIGltcHVlc3RvIGVuIDAuMDEgeSBzdSBjb3JyZXNwb25kaWVudGUgYmFzZSBwYXJhIHF1ZSBjdWFkcmUgbG9zIHZhbG9yZXMgYWwgdGltYnJhciBsYSBGRVxyXG4gICAgICogQHBhcmFtIGRpZmVyZW5jaWEgXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIGFqdXN0YWRvckltcHVlc3Rvc0NGREkoZGlmZXJlbmNpYTogbnVtYmVyLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGxldCBhanVzdG8gPSBmYWxzZTtcclxuICAgICAgICBmb3IgKGxldCBlbmMgb2Ygb00zUHJvY2Vzb3MuTTNFTkMpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaW1wIG9mIGVuYy5NM1BJbXB1ZXN0b3MpIHtcclxuICAgICAgICAgICAgICAgIGlmIChkaWZlcmVuY2lhID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGltcC5WYWxvciA9IGltcC5WYWxvciArIDAuMDE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpbXAuVmFsb3IgPSBpbXAuVmFsb3IgLSAwLjAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaW1wLkJhc2UgPSBpbXAuVmFsb3IgLyBpbXAuUG9yY2VudGFqZTtcclxuICAgICAgICAgICAgICAgIGFqdXN0byA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoYWp1c3RvKSB7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE11ZXZlIGVsIHZhbG9yIGRlIHVuIGRlc2N1ZW50byBlbiAwLjAxIHBhcmEgcXVlIGN1YWRyZSBsb3MgdmFsb3JlcyBhbCB0aW1icmFyIGxhIEZFXHJcbiAgICAgKiBAcGFyYW0gZGlmZXJlbmNpYSBcclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgYWp1c3RhZG9yRGVzY3VlbnRvc0NGREkoZGlmZXJlbmNpYTogbnVtYmVyLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGxldCBkZXRhbGxlVG90YWxQcm9tbzogTTNQRGV0YWxsZUl0ZW1zO1xyXG4gICAgICAgIGZvciAobGV0IGVuYyBvZiBvTTNQcm9jZXNvcy5NM0VOQykge1xyXG4gICAgICAgICAgICBkZXRhbGxlVG90YWxQcm9tbyA9IGVuYy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlRPVEFMUFJPTU9cIik7XHJcbiAgICAgICAgICAgIGlmIChkZXRhbGxlVG90YWxQcm9tbyAmJiArZGV0YWxsZVRvdGFsUHJvbW8uVmFsb3IgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGlmZXJlbmNpYSA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXRhbGxlVG90YWxQcm9tby5WYWxvciA9ICgrZGV0YWxsZVRvdGFsUHJvbW8uVmFsb3IgLSAwLjAxKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0YWxsZVRvdGFsUHJvbW8uVmFsb3IgPSAoK2RldGFsbGVUb3RhbFByb21vLlZhbG9yICsgMC4wMSkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRQcmRzR2VuZXJhbEZyb21NM1Byb2Nlc28oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lkS2F0aW9zOiBzdHJpbmcsIGpEYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTMvZ2V0UHJkc0dlbmVyYWxGcm9tTTNQcm9jZXNvLycgKyBzSWRLYXRpb3MsIGpEYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKEpTT04ucGFyc2UoZXJyLmVycm9yLk1lc3NhZ2UpKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG59XHJcbiJdfQ==
3550
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibTMtcmVnLXNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy8iLCJzb3VyY2VzIjpbImxpYi9ybm0zL1NlcnZpY2VzL20zLXJlZy1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV4RCxPQUFPLEtBQUssT0FBTyxNQUFNLFFBQVEsQ0FBQztBQUNsQyxPQUFPLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUk5RixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBSTFELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxrQkFBa0IsRUFBNEMsTUFBTSw4Q0FBOEMsQ0FBQztBQUU1SCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFekQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFNcEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFeEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDRCQUE0QixDQUFDOztBQUlwRCxJQUFNLE1BQU0sR0FBRyxPQUFPLENBQUM7O0FBQ3ZCLElBQUksVUFBVSxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBRTNDLElBQUE7SUFXSSxzQkFBWSxnQkFBZ0MsRUFBRSxlQUE4QixFQUFFLFNBQWlCO3VCQVZ0RSxJQUFJLE1BQU0sRUFBRTsrQkFFQSxJ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O0tBQ0o7Ozs7Ozs7OztJQUVNLGtEQUEyQjs7Ozs7Ozs7Y0FBQyxhQUE0QixFQUFFLFNBQWlCLEVBQUUsS0FBVSxFQUMxRixVQUFvQixFQUFFLFdBQXFCO1FBQzNDLGFBQWEsQ0FBQyxhQUFhLENBQUMsaUNBQWlDLEdBQUcsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7WUFDNUYsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3BCLEVBQ0csVUFBQSxHQUFHO1lBQ0MsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1NBQzlDLENBQUMsQ0FBQzs7dUJBanZFZjtJQW92RUMsQ0FBQTtBQWx0RUQsd0JBa3RFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE0zUHJvY2Vzb3MgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcHJvY2Vzb3NcIjtcclxuaW1wb3J0IHsgTTNQRW5jSXRlbXMgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcGVuYy1pdGVtc1wiO1xyXG5pbXBvcnQgeyBNM1ByZEdlbmVyYWwgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZEdlbmVyYWwudHlwZVwiO1xyXG5pbXBvcnQgKiBhcyBtb21lbnRfIGZyb20gJ21vbWVudCc7XHJcbmltcG9ydCB7IE0zUERldGFsbGVJdGVtcywgTTNQSXRlbXNXRUIsIE0zUERldGFsbGVDdXBvbiB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wZGV0YWxsZS1pdGVtc1wiO1xyXG5pbXBvcnQgeyBQb3N0U2VydmljZU0zIH0gZnJvbSBcIi4uLy4uL0NvbmV4aW9uU1FML3Bvc3RzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTTNEYXRhIH0gZnJvbSBcIi4uL0RhdGEvbTMtZGF0YVwiO1xyXG5pbXBvcnQgeyBERUZBVUxUX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zL3NyYy9kaXJlY3RpdmVzL2RlZmF1bHRfdmFsdWVfYWNjZXNzb3JcIjtcclxuaW1wb3J0IHsgeG1sVG9Kc29uVEYgfSBmcm9tIFwiLi4vLi4vQ29udmVydC94bWxUb0pTb24uY2xhc3NcIjtcclxuaW1wb3J0IHsgTTNQSW1wdWVzdG9zIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXAtaW1wdWVzdG9zXCI7XHJcbmltcG9ydCB7IE0zVWJpY2FjaW9uIH0gZnJvbSBcIi4uL01hZXN0cm8vVWJpY2FjaW9uL00zVWJpY2FjaW9uLnR5cGVcIjtcclxuaW1wb3J0IHsgTTNFTkNQUk9NTyB9IGZyb20gXCIuLi9Qcm9tb2Npb25lcy9Nb2RlbHMvTTNFTkNQUk9NTy5jbGFzc1wiO1xyXG5pbXBvcnQgeyBUeXBlTTNQcmRHcnAgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZEdycC50eXBlXCI7XHJcbmltcG9ydCB7IHByb21vY2lvbmVzU2VydmljZSB9IGZyb20gXCIuLi9Qcm9tb2Npb25lcy9wcm9tb2Npb25lcy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFByb21vY2lvblByb2Nlc2FkYSwgUHJvbW9jaW9uZXNBc29jaWFkYXMsIFByb21vY2lvbkNvbWJpbmFkYSB9IGZyb20gXCIuLi9Qcm9tb2Npb25lcy9Nb2RlbHMvTTNQcm9tb1Byb2Nlc2FkYS5jbGFzc1wiO1xyXG5pbXBvcnQgeyBNM0NvdWNoTWFlc3RybyB9IGZyb20gXCIuLi9EYXRhL20zLWNvdWNoLW1hZXN0cm9cIjtcclxuaW1wb3J0IHsgU2VydmljZU0zTWFlc3RybyB9IGZyb20gXCIuL00zTWFlc3Ryby5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IE0zUERpbmFtaWNhcyB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wZGluYW1pY2FzXCI7XHJcbmltcG9ydCB7IFNlcnZpY2VMaXN0YVByZWNpbyB9IGZyb20gXCIuL20zLWxpc3RhLXByZWNpby5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFNlcnZpY2VMb2FkTGlzdGFQcmVjaW8gfSBmcm9tIFwiLi9tMy1sb2FkLWwtcHJlY2lvLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgYSB9IGZyb20gXCJAYW5ndWxhci9jb3JlL3NyYy9yZW5kZXIzXCI7XHJcbmltcG9ydCB7IE0zUHJlc2VudGFjaW9uZXMgfSBmcm9tIFwiLi4vTWFlc3Ryby9tMy1wcmVzZW50YWNpb25lc1wiO1xyXG5pbXBvcnQgeyBzdHJpbmdpZnkgfSBmcm9tIFwiQGFuZ3VsYXIvY29tcGlsZXIvc3JjL3V0aWxcIjtcclxuaW1wb3J0IHsgTTNQcmRQYWNrRGV0IH0gZnJvbSBcIi4uL01hZXN0cm8vTTNQcmRQYWNrRGV0XCI7XHJcbmltcG9ydCB7IE0zUHJkQWRpY2lvbmFsZXMgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZEFkaWNpb25hbGVzLnR5cGVcIjtcclxuaW1wb3J0IHsgTTNPdENsYXNpZmljYWNpb25lcyB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1vdC1jbGFzaWZpY2FjaW9uZXNcIjtcclxuaW1wb3J0IHsgTTNQcmRMaXN0YSB9IGZyb20gXCIuLi9NYWVzdHJvL00zUHJkTGlzdGEudHlwZVwiO1xyXG5pbXBvcnQgeyBNYXRoVEYgfSBmcm9tIFwiLi4vTWlzY2VsYW5lYS9NYXRoVEYuY2xhc3NcIjtcclxuaW1wb3J0IHsgRUNBTkNFTEVEIH0gZnJvbSBcImNvbnN0YW50c1wiO1xyXG5pbXBvcnQgKiBhcyB4bWwyanMgZnJvbSAneG1sMmpzJztcclxuXHJcbmNvbnN0IG1vbWVudCA9IG1vbWVudF87XHJcbnZhciBiaWdEZWNpbWFsID0gcmVxdWlyZSgnanMtYmlnLWRlY2ltYWwnKTtcclxuXHJcbmV4cG9ydCBjbGFzcyBNM1JlZ1NlcnZpY2Uge1xyXG4gICAgcHVibGljIG9NYXRoVEY6IE1hdGhURiA9IG5ldyBNYXRoVEYoKTtcclxuICAgIHByaXZhdGUgb00zQ291Y2hNYWVzdHJvOiBNM0NvdWNoTWFlc3RybztcclxuICAgIHB1YmxpYyBvTGlzdGFPYnNlcXVpb3M6IEFycmF5PGFueT4gPSBudWxsO1xyXG4gICAgcHVibGljIG9ic2VxdWlvc0V4YzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHVibGljIG9ic2VxdWlvT1Byb21vOiBudW1iZXIgPSAtMTtcclxuICAgIHB1YmxpYyBvYnNlcXVpb3NDYW50aWRhZDogbnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyBsSWRBY3RpdmFQcm9tbyA9IFtdO1xyXG4gICAgcHJpdmF0ZSBHb1Bvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTM7XHJcbiAgICBwcml2YXRlIGdzSWRrYXRpb3M7XHJcblxyXG4gICAgY29uc3RydWN0b3IoaW9NM0NvdWNoTWFlc3RybzogTTNDb3VjaE1hZXN0cm8sIElzUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lka2F0aW9zOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLm9NM0NvdWNoTWFlc3RybyA9IGlvTTNDb3VjaE1hZXN0cm87XHJcbiAgICAgICAgdGhpcy5Hb1Bvc3RTZXJ2aWNlTTMgPSBJc1Bvc3RTZXJ2aWNlTTM7XHJcbiAgICAgICAgdGhpcy5nc0lka2F0aW9zID0gc0lka2F0aW9zO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAqIFZhbGlkYXIgbnVtZXJvIGRlIGl0ZW1zIGFncmVnYWRvcy4gc2kgZXMgbWF5b3IgYSAxLjAwMCBwcmVuZGUgcGFyYW1ldHJvIFxyXG4gICAqL1xyXG4gICAgcHVibGljIFZhbGlkYXJOdW1lcm9JdGVtcyhvbE0zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBpZiAob2xNM1Byb2Nlc29zLk0zRU5DLmxlbmd0aCA+IDEwMDApIHtcclxuICAgICAgICAgICAgb2xNM1Byb2Nlc29zLkFwbERlc2RlU2VydmVyID0gdHJ1ZTtcclxuICAgICAgICAgICAgb2xNM1Byb2Nlc29zLk0zRU5DID0gbmV3IEFycmF5PE0zUEVuY0l0ZW1zPigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgUHJvY2VzYW1pZW50b1NlcnZpY2Uoc0lES2F0aW9zOiBzdHJpbmcsIFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLFxyXG4gICAgICAgIG9EYXRhVXNlcjogYW55LCBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uLCBhcGxSZXRvbWFySW5mbzogYm9vbGVhbiA9IHRydWUpIHtcclxuICAgICAgICB0aGlzLlZhbGlkYXJOdW1lcm9JdGVtcyhvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgdGhpcy5SZXRvbWFySW5mb3JtYWNpb24ob0RhdGFVc2VyLCBvTTNQcm9jZXNvcywgYXBsUmV0b21hckluZm8pO1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zL1JlZ2lzdHJvRXZlbnRvTTMvXCIgKyBzSURLYXRpb3MgKyBcIi9cIiArIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DICsgXCIvXCIgKyBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQywgb00zUHJvY2Vzb3MpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgdmFyIG9Kc29uID0gSlNPTi5wYXJzZShyZXNwLmpzb24oKSk7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLklkTTMgPSBvSnNvbi5SRVNQVUVTVEEuSURNMztcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuSUREaWFyaW8gPSBvSnNvbi5SRVNQVUVTVEEuSURESUFSSU87XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLklERGlhcmlvQ2llcnJlID0gb0pzb24uUkVTUFVFU1RBLklERElBUklPQ0lFUlJFXHJcblxyXG4gICAgICAgICAgICAvL0FjdHVhbGl6YWNpb24gZGUgZXN0YWRvcy5cclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuU3ViRXN0YWRvQW50ID0gb00zUHJvY2Vzb3MuU3ViRXN0YWRvRGVzO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5Fc3RhZG9BbnQgPSBvTTNQcm9jZXNvcy5Fc3RhZG9EZXM7XHJcblxyXG4gICAgICAgICAgICBmdW5jaW9uT0sob00zUHJvY2Vzb3MsIG9Kc29uLlJFU1BVRVNUQSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vdGhpcy5lblByb2Nlc28gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyLmpzb24oKS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIuanNvbigpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgcHJvY2VzYW1pZW50b19zZXJ2aWNlX2FzeW5jKHNJREthdGlvczogc3RyaW5nLCBQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcyxcclxuICAgICAgICBvRGF0YVVzZXI6IGFueSwgYXBsUmV0b21hckluZm86IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5SZXRvbWFySW5mb3JtYWNpb24ob0RhdGFVc2VyLCBvTTNQcm9jZXNvcywgYXBsUmV0b21hckluZm8pO1xyXG5cclxuICAgICAgICAgICAgdmFyIHJlc3AgPSBhd2FpdCBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zL1JlZ2lzdHJvRXZlbnRvTTMvXCIgKyBzSURLYXRpb3MgKyBcIi9cIiArIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DICsgXCIvXCIgKyBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQywgb00zUHJvY2Vzb3MpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgICAgICB2YXIgb0pzb24gPSBKU09OLnBhcnNlKHJlc3AuanNvbigpKTtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuSWRNMyA9IG9Kc29uLlJFU1BVRVNUQS5JRE0zO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5JRERpYXJpbyA9IG9Kc29uLlJFU1BVRVNUQS5JRERJQVJJTztcclxuXHJcbiAgICAgICAgICAgIC8vQWN0dWFsaXphY2lvbiBkZSBlc3RhZG9zLlxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5TdWJFc3RhZG9BbnQgPSBvTTNQcm9jZXNvcy5TdWJFc3RhZG9EZXM7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLkVzdGFkb0FudCA9IG9NM1Byb2Nlc29zLkVzdGFkb0RlcztcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBSZWdpc3Ryb0V2ZW50b00zT2ZmTGluZShzSURLYXRpb3M6IHN0cmluZywgUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgb00zUHJvY2Vzb3M6IEFycmF5PE0zUHJvY2Vzb3M+LCBvRGF0YVVzZXI6IGFueSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTMvUmVnaXN0cm9FdmVudG9NM09mZkxpbmUvXCIgKyBzSURLYXRpb3MgKyBcIi9cIiArIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DICsgXCIvXCIgKyBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQywgb00zUHJvY2Vzb3MpLnRvUHJvbWlzZSgpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgLy8vUmV0b21hciBpbmZvcm1hY2lvbiBwYXJhIGVsIHByb2Nlc28uXHJcbiAgICBwdWJsaWMgUmV0b21hckluZm9ybWFjaW9uKG9EYXRhVXNlcjogYW55LCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgYXBsUmV0b21hckluZm86IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAob0RhdGFVc2VyICE9IG51bGwgJiYgb00zUHJvY2Vzb3MuSWRNMyAhPT0gdW5kZWZpbmVkICYmIG9NM1Byb2Nlc29zLklkTTMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoYXBsUmV0b21hckluZm8pIHtcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRIdWIgPSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURIVUI7XHJcbiAgICAgICAgICAgICAgICBpZiAob00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZFViaWMgPT0gdW5kZWZpbmVkIHx8IG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRVYmljID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkVWJpYyA9IG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT047XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkVWJpYyA9IG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRVYmljUHJlXHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkSHViID0gb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZEh1YlByZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL1Byb2Nlc2FtaWVudG8gZGUgZGF0b3MgZW4gYmFzZSBkZSBkYXRvcyBwb3VjaERCLlxyXG4gICAgcHVibGljIFByb2Nlc2FtaWVudG9TZXJ2aWNlUG91Y2hEQihvTTNEYXRhOiBNM0RhdGEsIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIsXHJcbiAgICAgICAgcHJvZEdSUFNlbGVjdGVkOiBUeXBlTTNQcmRHcnAsIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24sIG9EYXRhVXNlcjogYW55LCBzSURLYXRpb3M6IHN0cmluZyxcclxuICAgICAgICBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIGlvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkOiBhbnkgPSBudWxsKSB7XHJcblxyXG4gICAgICAgIHZhciBvTTNQcm9jZXNvczogTTNQcm9jZXNvcztcclxuICAgICAgICB2YXIgc0tleUNhcnJpdG86IHN0cmluZztcclxuICAgICAgICB2YXIgcHJvZHVjdFVuaXRTZWxlY3RlZDogTTNQcmRHZW5lcmFsO1xyXG4gICAgICAgIHByb2R1Y3RVbml0U2VsZWN0ZWQgPSBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF07XHJcbiAgICAgICAgLy9PYnRlbmVyIGtleSBkZSBjYXJyaXRvIGRlIGNvbXByYXNcclxuICAgICAgICBzS2V5Q2Fycml0byA9IG9NM0RhdGEuR2V0S2V5Q2Fycml0b0NvbXByYXMoc0lES2F0aW9zLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JREhVQik7XHJcbiAgICAgICAgLy9DYXJnYXIgZGV0YWxsZSBkZSBpdGVtc1xyXG4gICAgICAgIC8vR3VhcmRhciBlbiBCRCBQb3VjaERCXHJcbiAgICAgICAgb00zRGF0YS5HZXREYXRhUG91Y2hCRChzS2V5Q2Fycml0bykudGhlbihhc3luYyByZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcyA9IHJlc3VsdDtcclxuICAgICAgICAgICAgbGV0IGNhbnRpZGFkX2FjdHVhbCA9IHRoaXMudmFsaWRhckV4aXN0YVByb2R1Y3RvKG9NM1Byb2Nlc29zLk0zRU5DLCBwcm9kdWN0VW5pdFNlbGVjdGVkLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICBpZiAoY2FudGlkYWRfYWN0dWFsICE9IDApIHtcclxuICAgICAgICAgICAgICAgIC8vbGV0IGNhbnRpZGFkX2FjdHVhbCA9IHRoaXMuZ2V0Q2FudGlkYWQob00zUHJvY2Vzb3MsIHByb2R1Y3RVbml0U2VsZWN0ZWQpO1xyXG4gICAgICAgICAgICAgICAgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9ICgrY2FudGlkYWRfYWN0dWFsKSArICtvTTNQSXRlbXNXRUIuZENhbnRpZGFkO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vbGV0IE0zRW5jID0gdGhpcy5nZXRfTTNFTkNfYnlfaWRwcmRfbG90ZShvTTNQcm9jZXNvcywgcHJvZHVjdFVuaXRTZWxlY3RlZC5TS1UsIHByb2R1Y3RVbml0U2VsZWN0ZWQuTE9URSk7XHJcblxyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMgPSBvTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIocHJvZCA9PiAhKHByb2QuSWRQcm9kdWN0byA9PSBwcm9kdWN0VW5pdFNlbGVjdGVkLlNLVSAmJiBwcm9kLkxvdGUgPT0gcHJvZHVjdFVuaXRTZWxlY3RlZC5MT1RFICYmICEocHJvZC5JZEVuY1BhZHJlID4gMCkpKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuUmVjYWxjdWxhclByZWNpb3Mob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSB0aGlzLkxvYWRNM1Byb2Nlc29Gcm9tRGF0YShvTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9EYXRhVXNlciwgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IG9NM0RhdGEuQWRkVG9Qb3VjaEJEQ2Fycml0b0NvbXByYXMoc0tleUNhcnJpdG8sIG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25PSyhvTTNQcm9jZXNvcywgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gdGhpcy5Mb2FkTTNQcm9jZXNvRnJvbURhdGEob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBvTTNEYXRhLkFkZFRvUG91Y2hCRENhcnJpdG9Db21wcmFzKHNLZXlDYXJyaXRvLCBvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uT0sob00zUHJvY2Vzb3MsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2cob0RhdGFDYXJyaXRvQ29tcHJhcyk7XHJcbiAgICAgICAgfSwgYXN5bmMgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09IFwiNDA0XCIpIHsvL05vIGV4aXN0ZSBlbCBjYXJyaXRvIFxyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSB0aGlzLkxvYWRNM1Byb2Nlc29FbXB0eVBEQihwcm9kR1JQU2VsZWN0ZWQsIG9NM1BJdGVtc1dFQiwgb0RhdGFVc2VyLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBpb00zUHJvY2Vzb3MsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBvTTNEYXRhLkFkZFRvUG91Y2hCRENhcnJpdG9Db21wcmFzKHNLZXlDYXJyaXRvLCBvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uT0sob00zUHJvY2Vzb3MsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIG5vIGNvbnRyb2xhZG9cIik7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL0FncmVnYXIgYSBjYXJyaXRvIHByb2R1Y3RvLlxyXG4gICAgcHVibGljIGFkZHRvY2FydChvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLFxyXG4gICAgICAgIHByb2RHUlBTZWxlY3RlZDogVHlwZU0zUHJkR3JwLCBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uLCBvRGF0YVVzZXI6IGFueSwgc0lES2F0aW9zOiBzdHJpbmcsXHJcbiAgICAgICAgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBpb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZDogYW55ID0gbnVsbCwgdmFsb3JEZXNjdWVudG8gPSAwKSB7XHJcblxyXG4gICAgICAgIHZhciBvTTNQcm9jZXNvczogTTNQcm9jZXNvcyA9IGlvTTNQcm9jZXNvcztcclxuICAgICAgICB2YXIgc0tleUNhcnJpdG86IHN0cmluZztcclxuICAgICAgICB2YXIgcHJvZHVjdFVuaXRTZWxlY3RlZDogTTNQcmRHZW5lcmFsO1xyXG4gICAgICAgIHByb2R1Y3RVbml0U2VsZWN0ZWQgPSBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF07XHJcbiAgICAgICAgLy9KQUdNIDIwMTkwNzIyIHNlIGFncmVnYSBwYXJhIGN1YW5kbyBlcyBlbCBwcmltZXIgcHJvZHVjdG8gcXVlIHNlIGFncmVnYXLDoVxyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcy5NM0VOQy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcyA9IHRoaXMuTG9hZE0zUHJvY2Vzb0VtcHR5UERCKHByb2RHUlBTZWxlY3RlZCwgb00zUEl0ZW1zV0VCLCBvRGF0YVVzZXIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIGlvTTNQcm9jZXNvcywgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkKTtcclxuICAgICAgICAgICAgaWYgKGZ1bmNpb25PSylcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25PSyhvTTNQcm9jZXNvcywgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgY2FudGlkYWRfYWN0dWFsID0gdGhpcy52YWxpZGFyRXhpc3RhUHJvZHVjdG8ob00zUHJvY2Vzb3MuTTNFTkMsIHByb2R1Y3RVbml0U2VsZWN0ZWQsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgIGlmIChjYW50aWRhZF9hY3R1YWwgIT0gMCkge1xyXG4gICAgICAgICAgICAgICAgLy9sZXQgY2FudGlkYWRfYWN0dWFsID0gdGhpcy5nZXRDYW50aWRhZChvTTNQcm9jZXNvcywgcHJvZHVjdFVuaXRTZWxlY3RlZCk7XHJcbiAgICAgICAgICAgICAgICBvTTNQSXRlbXNXRUIuZENhbnRpZGFkID0gKCtjYW50aWRhZF9hY3R1YWwpICsgb00zUEl0ZW1zV0VCLmRDYW50aWRhZDtcclxuXHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQyA9IG9NM1Byb2Nlc29zLk0zRU5DLmZpbHRlcihwcm9kID0+ICEocHJvZC5JZFByb2R1Y3RvID09IHByb2R1Y3RVbml0U2VsZWN0ZWQuU0tVICYmIHByb2QuTG90ZSA9PSBwcm9kdWN0VW5pdFNlbGVjdGVkLkxPVEUgJiYgIShwcm9kLklkRW5jUGFkcmUgPiAwKSkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5SZWNhbGN1bGFyUHJlY2lvcyhvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcyA9IHRoaXMuTG9hZE0zUHJvY2Vzb0Zyb21EYXRhKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQsIHZhbG9yRGVzY3VlbnRvKTtcclxuICAgICAgICAgICAgICAgIGlmIChmdW5jaW9uT0spXHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY2lvbk9LKG9NM1Byb2Nlc29zLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gdGhpcy5Mb2FkTTNQcm9jZXNvRnJvbURhdGEob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZCwgdmFsb3JEZXNjdWVudG8pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZ1bmNpb25PSylcclxuICAgICAgICAgICAgICAgICAgICBmdW5jaW9uT0sob00zUHJvY2Vzb3MsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLy9WYWxpZGEgcXVlIGV4aXN0YSBwcm9kdWN0byBlbiBsb3MgZW5jYWJlemFkb3MuIFRydWU6IFNpIGV4aXN0ZSwgRmFsc2UgZGUgb3RybyBtb2RvXHJcbiAgICAvLyBTZSBjYW1iaWEgZnVuY2lvbmFsaWRhZCBkZSByZXR1cm4uXHJcbiAgICBwdWJsaWMgdmFsaWRhckV4aXN0YVByb2R1Y3RvKG9NM0xpc3RhRW5jOiBBcnJheTxNM1BFbmNJdGVtcz4sIG9NM1ByZEdybDogTTNQcmRHZW5lcmFsLCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCKTogbnVtYmVyIHtcclxuICAgICAgICB2YXIgb0VuYzogTTNQRW5jSXRlbXMgPSBudWxsO1xyXG4gICAgICAgIHZhciBjYW50aWRhZDogbnVtYmVyID0gMDtcclxuICAgICAgICBvTTNQSXRlbXNXRUIuSURFbmNSZXBldGlkbyA9IC0xO1xyXG4gICAgICAgIGlmIChvTTNMaXN0YUVuYyAhPT0gdW5kZWZpbmVkICYmIG9NM1ByZEdybCAhPT0gdW5kZWZpbmVkICYmIG9NM0xpc3RhRW5jLmxlbmd0aCA+IDApIHtcclxuXHJcbiAgICAgICAgICAgIG9FbmMgPSBvTTNMaXN0YUVuYy5maW5kKGVuYyA9PiBlbmMuSWRQcm9kdWN0byA9PSBvTTNQcmRHcmwuU0tVICYmICFlbmMuSWRFbmNQYWRyZSAmJiB0aGlzLmdldENhbnRpZGFkUG9zaXRpdmEoZW5jKSk7XHJcbiAgICAgICAgICAgIGlmIChvRW5jICE9PSB1bmRlZmluZWQgJiYgb0VuYyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAvL0pBR00gMjAxOTA3MTcgVmFsaWRhciBhaG9yYSBlbCBwcmVjaW8uXHJcbiAgICAgICAgICAgICAgICB0aGlzLlZlcmlmaWNhclByZWNpb0J5Tml2ZWxlc0dlbmVyYWwob00zUHJkR3JsLCArb0VuYy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLlZhbGlkYXJQcmVjaW9zUHJkcyhvRW5jLCBvTTNQcmRHcmwuTG9NM1ByZExpc3RhKSAmJiAhdGhpcy5WYWxpZGFyRXN0YVBhcXVldGUob0VuYywgb00zTGlzdGFFbmMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUEl0ZW1zV0VCLklERW5jUmVwZXRpZG8gPSBvRW5jLklEO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbnRpZGFkID0gK29FbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNhbnRpZGFkO1xyXG4gICAgfVxyXG5cclxuICAgIGdldENhbnRpZGFkUG9zaXRpdmEob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCBjYW50aWRhZCA9IDA7XHJcbiAgICAgICAgbGV0IGRldENhbnRpZGFkID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIilcclxuXHJcbiAgICAgICAgaWYgKGRldENhbnRpZGFkKSB7XHJcbiAgICAgICAgICAgIGNhbnRpZGFkID0gK2RldENhbnRpZGFkLlZhbG9yO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNhbnRpZGFkID4gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhIHF1ZSBlbCBlbmNhYmV6YWRvIGNvbiBlbCBwcm9kdWN0byBhZ3JlZ2Fkbywgc2VhIHVuIHBhcXVldGVcclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgXHJcbiAgICAgKiBAcGFyYW0gb00zTGlzdGFFbmMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFyRXN0YVBhcXVldGUob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgb00zTGlzdGFFbmM6IEFycmF5PE0zUEVuY0l0ZW1zPikge1xyXG4gICAgICAgIHZhciBiUmVzcDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChvTTNMaXN0YUVuYy5maW5kKHggPT4geC5JZEVuY1BhZHJlID09IG9NM1BFbmNJdGVtcy5JRCkpIHtcclxuICAgICAgICAgICAgICAgIGJSZXNwID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGJSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhciBsb3MgcHJlY2lvcyBkZSBsb3MgcHJvZHVjdG9zXHJcbiAgICAgKiBAcGFyYW0gb0VuYyBcclxuICAgICAqIEBwYXJhbSBvTTNQcmRMaXN0YSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZhbGlkYXJQcmVjaW9zUHJkcyhvRW5jOiBNM1BFbmNJdGVtcywgb00zUHJkTGlzdGE6IE0zUHJkTGlzdGEpIHtcclxuICAgICAgICB2YXIgYlJlc3A6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgZFByZWNpb0VuYzogbnVtYmVyID0gK29FbmMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVFwiKS5WYWxvcjtcclxuICAgICAgICAgICAgdmFyIGRQcmVjaW9MaXN0OiBudW1iZXIgPSBvTTNQcmRMaXN0YS5QUkVDSU87XHJcblxyXG4gICAgICAgICAgICBpZiAoZFByZWNpb0xpc3QgPT0gZFByZWNpb0VuYykge1xyXG4gICAgICAgICAgICAgICAgYlJlc3AgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIFZhbGlkYXJQcmVjaW9zUHJkc1wiKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleClcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGJSZXNwO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL0FjdHVhbGl6YWNpb24gZGUgTTMgcHJvY2Vzb3MsIGNvbiBkYXRhIGxpc3RhIHBhcmEgYWN0dWFsaXphci5cclxuICAgIHB1YmxpYyBVcGRhdGVNM1Byb2Nlc29zV2l0aERhdGEob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM0RhdGE6IE0zRGF0YSxcclxuICAgICAgICBvRGF0YVVzZXI6IGFueSwgc0lES2F0aW9zOiBzdHJpbmcsIHRpcG9VYmljYWNpb246IHN0cmluZywgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvblxyXG4gICAgICAgICwgbTNVYmljYWNpb246IE0zVWJpY2FjaW9uID0gbnVsbCwgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQiA9IG51bGwpIHtcclxuICAgICAgICAvL0d1YXJkYXIgZW4gQkQgUG91Y2hEQlxyXG4gICAgICAgIHZhciBzS2V5Q2Fycml0bzogc3RyaW5nO1xyXG4gICAgICAgIHRoaXMuUmVjYWxjdWxhclByZWNpb3Mob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIC8vT2J0ZW5lciBrZXkgZGUgY2Fycml0byBkZSBjb21wcmFzXHJcbiAgICAgICAgLy9JREhVQlxyXG4gICAgICAgIGlmICh0aXBvVWJpY2FjaW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJXRUJcIikge1xyXG4gICAgICAgICAgICBzS2V5Q2Fycml0byA9IG9NM0RhdGEuR2V0S2V5Q2Fycml0b0NvbXByYXMoc0lES2F0aW9zLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JREhVQik7XHJcblxyXG4gICAgICAgICAgICBvTTNEYXRhLkdldERhdGFQb3VjaEJEKHNLZXlDYXJyaXRvKS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgICAgICBvTTNEYXRhLkFkZFRvUG91Y2hCRENhcnJpdG9Db21wcmFzKHNLZXlDYXJyaXRvLCBvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc2FyUHJvbW9BZnRlckNhcnJpdG9PayhvTTNQcm9jZXNvcywgb00zRGF0YSwgb0RhdGFVc2VyLCBtM1ViaWNhY2lvbiwgZnVuY2lvbk9LLCBmdW5jaW9uRXJyb3IsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT0gXCI0MDRcIikgey8vTm8gZXhpc3RlIGVsIGNhcnJpdG8gXHJcbiAgICAgICAgICAgICAgICAgICAgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhcyhzS2V5Q2Fycml0bywgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2VzYXJQcm9tb0FmdGVyQ2Fycml0b09rKG9NM1Byb2Nlc29zLCBvTTNEYXRhLCBvRGF0YVVzZXIsIG0zVWJpY2FjaW9uLCBmdW5jaW9uT0ssIGZ1bmNpb25FcnJvciwgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBubyBjb250cm9sYWRvXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHByb2Nlc2FyUHJvbW9BZnRlckNhcnJpdG9PayhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zRGF0YTogTTNEYXRhLFxyXG4gICAgICAgIG9EYXRhVXNlcjogYW55LCBtM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24sIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIpIHtcclxuICAgICAgICBpZiAobTNVYmljYWNpb24pIHtcclxuICAgICAgICAgICAgdmFyIGxvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCO1xyXG4gICAgICAgICAgICBpZiAob00zUEl0ZW1zV0VCKSB7XHJcbiAgICAgICAgICAgICAgICBsb00zUEl0ZW1zV0VCID0gb00zUEl0ZW1zV0VCO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbG9NM1BJdGVtc1dFQiA9IG5ldyBNM1BJdGVtc1dFQigpO1xyXG4gICAgICAgICAgICAgICAgbG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSAxO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgc0tleUNhcnJpdG8gPSBvTTNEYXRhLkdldEtleUNhcnJpdG9Db21wcmFzKHRoaXMuZ3NJZGthdGlvcywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURIVUIpO1xyXG4gICAgICAgICAgICB0aGlzLlByb2NQcm9tb0FmdGVyQWRkVG9DYXJ0KG9NM1Byb2Nlc29zLCBvRGF0YVVzZXIsIGxvTTNQSXRlbXNXRUIsIG0zVWJpY2FjaW9uLCB0cnVlKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coeCk7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhvRGF0YSk7XHJcbiAgICAgICAgICAgICAgICBvTTNEYXRhLkFkZFRvUG91Y2hCRENhcnJpdG9Db21wcmFzQXN5bmMoc0tleUNhcnJpdG8sIG9NM1Byb2Nlc29zKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmNpb25PSygpO1xyXG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goeCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY2lvbk9LKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSkuY2F0Y2goeCA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh4KVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBubyBjb250cm9sYWRvIGVuIHByb2Nlc2FyUHJvbW9BZnRlckNhcnJpdG9Pa1wiKTtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25PSygpO1xyXG4gICAgICAgICAgICAgICAgLy8gICB0aGlzLm9FbmNhYmV6YWRvTTNDb21wb25lbnQuUmVjYXJnYXJDYXJyaXRvKCk7XHJcbiAgICAgICAgICAgICAgICAvLyAgIHRoaXMuTG9hZENhcnQoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBmdW5jaW9uT0soKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vQWN0dWFsaXphY2lvbiBkZSBNMyBwcm9jZXNvcywgY29uIGRhdGEgbGlzdGEgcGFyYSBhY3R1YWxpemFyLlxyXG4gICAgcHVibGljIHVwZGF0ZUFQb3VjaChvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zRGF0YTogTTNEYXRhLFxyXG4gICAgICAgIG9EYXRhVXNlcjogYW55LCBzSURLYXRpb3M6IHN0cmluZywgdGlwb1ViaWNhY2lvbjogc3RyaW5nLCBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgLy9HdWFyZGFyIGVuIEJEIFBvdWNoREJcclxuICAgICAgICB2YXIgc0tleUNhcnJpdG86IHN0cmluZztcclxuICAgICAgICAvL09idGVuZXIga2V5IGRlIGNhcnJpdG8gZGUgY29tcHJhc1xyXG4gICAgICAgIC8vSURIVUJcclxuICAgICAgICBpZiAodGlwb1ViaWNhY2lvbi50b1VwcGVyQ2FzZSgpID09IFwiV0VCXCIpIHtcclxuICAgICAgICAgICAgc0tleUNhcnJpdG8gPSBvTTNEYXRhLkdldEtleUNhcnJpdG9Db21wcmFzKHNJREthdGlvcywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURIVUIpO1xyXG5cclxuICAgICAgICAgICAgb00zRGF0YS5HZXREYXRhUG91Y2hCRChzS2V5Q2Fycml0bykudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhcyhzS2V5Q2Fycml0bywgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbk9LKCk7XHJcbiAgICAgICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT0gXCI0MDRcIikgey8vTm8gZXhpc3RlIGVsIGNhcnJpdG8gXHJcbiAgICAgICAgICAgICAgICAgICAgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhcyhzS2V5Q2Fycml0bywgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmNpb25PSygpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIG5vIGNvbnRyb2xhZG9cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIERlbGV0ZU0zUHJvY2VzbyhvTTNEYXRhOiBNM0RhdGEsIG9EYXRhVXNlcjogYW55LCBzSURLYXRpb3M6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBzS2V5Q2Fycml0bzogc3RyaW5nO1xyXG4gICAgICAgIHNLZXlDYXJyaXRvID0gb00zRGF0YS5HZXRLZXlDYXJyaXRvQ29tcHJhcyhzSURLYXRpb3MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiwgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklESFVCKTtcclxuICAgICAgICBhd2FpdCBvTTNEYXRhLkRlbGV0ZShzS2V5Q2Fycml0byk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vL0VsaW1pbmFyIGRvY3VtZW50byBkZSBjb3VjaC9wb3VjaCwgaW5pY2lvIHkgYWN0dWFsXHJcbiAgICBwdWJsaWMgRGVsRG9jc1N0YXJ0QW5kQ3VycmVudChvTTNEYXRhOiBNM0RhdGEsIHNJREthdGlvczogc3RyaW5nLCBvbE0zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIFViaWNhY2lvbkN1cnJlbnQsIEh1YkN1cnJlbnQpIHtcclxuICAgICAgICAvL0VsaW1pbmFyIEluaWNpYWxcclxuICAgICAgICBpZiAob2xNM1Byb2Nlc29zLklERGlhcmlvQ2llcnJlICE9PSB1bmRlZmluZWQgJiYgb2xNM1Byb2Nlc29zLklERGlhcmlvQ2llcnJlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdmFyIG9EYXRhVXNlciA9IHsgXCJVc3VhcmlvU2lzdGVtYVwiOiB7IFwiVERPQ1wiOiBvbE0zUHJvY2Vzb3MuVERvYywgXCJORE9DXCI6IG9sTTNQcm9jZXNvcy5ORG9jLCBcIlVCSUNBQ0lPTlwiOiBvbE0zUHJvY2Vzb3MuVWJpYzEudG9TdHJpbmcoKSwgXCJJREhVQlwiOiBvbE0zUHJvY2Vzb3MuSURIdWIgfSB9XHJcbiAgICAgICAgICAgIHRoaXMuRGVsZXRlTTNQcm9jZXNvKG9NM0RhdGEsIG9EYXRhVXNlciwgc0lES2F0aW9zKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJEZWxldGUgc3RhcnRcIik7XHJcbiAgICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgICAvL0VsaW1pbmFyIGFjdHVhbFxyXG4gICAgICAgICAgICBvRGF0YVVzZXIgPSB7IFwiVXN1YXJpb1Npc3RlbWFcIjogeyBcIlRET0NcIjogb2xNM1Byb2Nlc29zLlREb2MsIFwiTkRPQ1wiOiBvbE0zUHJvY2Vzb3MuTkRvYywgXCJVQklDQUNJT05cIjogVWJpY2FjaW9uQ3VycmVudC50b1N0cmluZygpLCBcIklESFVCXCI6IEh1YkN1cnJlbnQgfSB9XHJcbiAgICAgICAgICAgIHRoaXMuRGVsZXRlTTNQcm9jZXNvKG9NM0RhdGEsIG9EYXRhVXNlciwgc0lES2F0aW9zKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJEZWxldGUgY3VycmVudFwiKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL0FjdHVhbGl6YWNpb24gZGUgTTMgcHJvY2Vzb3MsIGNvbiBkYXRhIGxpc3RhIHBhcmEgYWN0dWFsaXphci5cclxuICAgIHB1YmxpYyBhc3luYyBHZXRDYXJyaXRvQ29tcHJhc1BvdWNoREIob00zRGF0YTogTTNEYXRhLCBvRGF0YVVzZXI6IGFueSwgc0lES2F0aW9zOiBzdHJpbmcpIHtcclxuICAgICAgICAvL0d1YXJkYXIgZW4gQkQgUG91Y2hEQlxyXG4gICAgICAgIHZhciBzS2V5Q2Fycml0bzogc3RyaW5nO1xyXG4gICAgICAgIHZhciBvTTNQcm9jZXNvO1xyXG4gICAgICAgIC8vT2J0ZW5lciBrZXkgZGUgY2Fycml0byBkZSBjb21wcmFzXHJcbiAgICAgICAgc0tleUNhcnJpdG8gPSBvTTNEYXRhLkdldEtleUNhcnJpdG9Db21wcmFzKHNJREthdGlvcywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURIVUIpO1xyXG5cclxuICAgICAgICBvTTNQcm9jZXNvID0gYXdhaXQgb00zRGF0YS5HZXREYXRhUG91Y2hCRChzS2V5Q2Fycml0byk7XHJcbiAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc287XHJcbiAgICB9XHJcblxyXG4gICAgLy9UcmFzbGFkYXIgaW5mb3JtYWNpw7NuIGRlIGNhcnJpdG8sIGRvcyB1c3Vhcmlvc1xyXG4gICAgcHVibGljIGFzeW5jIE1vdmVDYXJ0SW50b1VzZXIoc0lES2F0aW9zOiBzdHJpbmcsIG9NM0RhdGE6IE0zRGF0YSwgb0RhdGFVc2VyT3JpZ2VuOiBhbnksIG9EYXRhVXNlckRlc3Rpbm86IGFueSwgZnVuY2lvbk9LOiBGdW5jdGlvbikge1xyXG4gICAgICAgIHZhciBzS2V5Q2Fycml0b09yaWdlbjtcclxuICAgICAgICB2YXIgc0tleUNhcnJpdG9EZXN0aW5vO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBzS2V5Q2Fycml0b09yaWdlbiA9IG9NM0RhdGEuR2V0S2V5Q2Fycml0b0NvbXByYXMoc0lES2F0aW9zLCBvRGF0YVVzZXJPcmlnZW4uVXN1YXJpb1Npc3RlbWEuVERPQywgb0RhdGFVc2VyT3JpZ2VuLlVzdWFyaW9TaXN0ZW1hLk5ET0MsIG9EYXRhVXNlck9yaWdlbi5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIG9EYXRhVXNlck9yaWdlbi5Vc3VhcmlvU2lzdGVtYS5JREhVQik7XHJcbiAgICAgICAgICAgIHNLZXlDYXJyaXRvRGVzdGlubyA9IG9NM0RhdGEuR2V0S2V5Q2Fycml0b0NvbXByYXMoc0lES2F0aW9zLCBvRGF0YVVzZXJEZXN0aW5vLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlckRlc3Rpbm8uVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyRGVzdGluby5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIG9EYXRhVXNlckRlc3Rpbm8uVXN1YXJpb1Npc3RlbWEuSURIVUIpO1xyXG4gICAgICAgICAgICBsZXQgb00zUHJvY2VzbyA9IGF3YWl0IG9NM0RhdGEuR2V0RGF0YVBvdWNoQkQoc0tleUNhcnJpdG9PcmlnZW4pO1xyXG5cclxuICAgICAgICAgICAgb00zUHJvY2Vzby5URG9jID0gb0RhdGFVc2VyRGVzdGluby5Vc3VhcmlvU2lzdGVtYS5URE9DO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvLk5Eb2MgPSBvRGF0YVVzZXJEZXN0aW5vLlVzdWFyaW9TaXN0ZW1hLk5ET0M7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBvTTNQcm9jZXNvW1wiX3JldlwiXTtcclxuICAgICAgICAgICAgYXdhaXQgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhcyhzS2V5Q2Fycml0b0Rlc3Rpbm8sIG9NM1Byb2Nlc28pO1xyXG4gICAgICAgICAgICBmdW5jaW9uT0soKTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBmdW5jaW9uT0soKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWNhbGN1bGFyIHByZWNpb3MgdG90YWxlcyB5IGRlIGJhc2VcclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFJlY2FsY3VsYXJQcmVjaW9zUHJvbW9Db21iaW5hZGEob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICAvLyB2YXIgZFByZWNpb1RvdGFsO1xyXG4gICAgICAgIC8vIHZhciBkUHJlY2lvVG90YWxCYXNlO1xyXG4gICAgICAgIC8vIHZhciBkVmFsb3I6IG51bWJlciA9IDA7XHJcbiAgICAgICAgLy8gdmFyIGRWYWxvck5ldG86IG51bWJlciA9IDA7XHJcblxyXG5cclxuICAgICAgICAvLyBvTTNQcm9jZXNvcy5NM0VOQy5mb3JFYWNoKGVuYyA9PiB7XHJcbiAgICAgICAgLy8gICAgIGRQcmVjaW9Ub3RhbCA9IGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvciAvLygrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKSAqICgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvcik7XHJcbiAgICAgICAgLy8gICAgIGRQcmVjaW9Ub3RhbEJhc2UgPSB0aGlzLkNhbGN1bGFyUHJlY2lvQmFzZUZyb21Qcm9jZXNvKGVuYywgZFByZWNpb1RvdGFsKTtcclxuICAgICAgICAvLyAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMQkFTRVwiKS5WYWxvciA9IFN0cmluZyhNYXRoLnJvdW5kKGRQcmVjaW9Ub3RhbEJhc2UgKiAxMDApIC8gMTAwKTtcclxuICAgICAgICAvLyAgICAgZFZhbG9yID0gKCtkVmFsb3IpICsgKCtkUHJlY2lvVG90YWxCYXNlKTtcclxuICAgICAgICAvLyAgICAgZFZhbG9yTmV0byA9ICgrZFZhbG9yTmV0bykgKyAoK2RQcmVjaW9Ub3RhbCk7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuUmVjYWxjdWxvSW1wdWVzdG9zKGVuYywgZFByZWNpb1RvdGFsQmFzZSk7XHJcbiAgICAgICAgLy8gfSk7XHJcbiAgICAgICAgLy8gLy9vTTNQcm9jZXNvcy5WYWxvciA9IGRWYWxvcjtcclxuICAgICAgICAvLyBvTTNQcm9jZXNvcy5WYWxvck5ldG8gPSBkVmFsb3JOZXRvO1xyXG4gICAgICAgIHRoaXMuUmVjYWxjdWxhclByZWNpb3Mob00zUHJvY2Vzb3MpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL1JlY2FsY3VsYXIgcHJlY2lvcy4gcmVjb3JyaWVuZG8gbG9zIGVuY2FiZXphZG9zLlxyXG4gICAgcHVibGljIFJlY2FsY3VsYXJQcmVjaW9zKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdmFyIHZhbG9yID0gMDtcclxuICAgICAgICB2YXIgVmFsb3JOZXRvID0gMDtcclxuICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5mb3JFYWNoKGVuYyA9PiB7XHJcbiAgICAgICAgICAgIC8vSkFHTSAyMDE5MTAxMCBzZSBjYW1iaWEgZWwgdmFsb3IgZGVsIHByZWNpbyB1bml0YXJpbyBiYXNlLCB5YSBxdWUgYWwgbW9tZW50byBkZSBsbGFtYXIgbGEgZnVuY2nDs24gVmFsb3Jlc0NhbGN1bGFkb3NQcm9jZXNvXHJcbiAgICAgICAgICAgIC8vIHNlIHJlY2FsY3VsbyBlbCBwcmVjaW8gdG90YWwsIGRlcGVuZGllbmRvIGRlIGVzdGUgdmFsb3IuXHJcbiAgICAgICAgICAgIGxldCBwVG90YWxCYXNlID0gdGhpcy5DYWxjdWxhdGVQcmVjaW9CYXNlKGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDVEJMRElNUFBSRFwiKS5WYWxvcixcclxuICAgICAgICAgICAgICAgIHRoaXMub01hdGhURi5yb3VuZChlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxcIikuVmFsb3IsIDIpKTtcclxuXHJcbiAgICAgICAgICAgIHZhciBkQ2FudGlkYWRFbmMgPSArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICBpZiAoK2RDYW50aWRhZEVuYyAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVU5JVEJBU0VcIikuVmFsb3IgPSAoK3BUb3RhbEJhc2UgLyArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1VOSVRCQVNFXCIpLlZhbG9yID0gXCIwXCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5WYWxvcmVzQ2FsY3VsYWRvc1Byb2Nlc28oZW5jLCArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnJlY2FsY3VsYXJNM1Byb2Nlc28ob00zUHJvY2Vzb3MpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQ2FsY3VsYXIgcHJlY2lvIGJhc2UgZGUgdW4gcHJlY2lvLCB0ZW5pZW5kbyBlbCB2YWxvciB0b3RhbCBvIG5ldG8uXHJcbiAgICBwdWJsaWMgQ2FsY3VsYXJQcmVjaW9CYXNlRnJvbVByb2Nlc28ob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgZFByZWNpb05ldG86IG51bWJlcikge1xyXG4gICAgICAgIHZhciBkVmFsb3JJbXB1ZXN0bzogbnVtYmVyID0gMTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zLmZvckVhY2goaW1wID0+IHtcclxuICAgICAgICAgICAgICAgIGRWYWxvckltcHVlc3RvID0gKCtkVmFsb3JJbXB1ZXN0bykgKyAoK2ltcC5Qb3JjZW50YWplKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gKCgrZFByZWNpb05ldG8pIC8gKCtkVmFsb3JJbXB1ZXN0bykpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vUmVjYWxjdWxvIGRlIHZhbG9yIGRlIGltcHVlc3RvcywgY3VhbmRvIGNhbWJpYSBlbCB2YWxvci4gU2VhIHBvciBjYW50aWRhZCwgZWxpbWluYWNpw7NuLi4uXHJcbiAgICAvLyBwdWJsaWMgUmVjYWxjdWxvSW1wdWVzdG9zKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGRQcmVjaW9CYXNlOiBudW1iZXIpIHtcclxuICAgIC8vICAgICB2YXIgZFRvdGFsSW1wdWVzdG86IG51bWJlciA9IDA7XHJcbiAgICAvLyAgICAgb00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvcy5mb3JFYWNoKGltcCA9PiB7XHJcbiAgICAvLyAgICAgICAgIGltcC5WYWxvciA9ICgrZFByZWNpb0Jhc2UpICogKCtpbXAuUG9yY2VudGFqZSk7XHJcbiAgICAvLyAgICAgICAgIC8vSkFHTSAyMDE4MDkxMiBudWV2byBjb25jZXB0b1xyXG4gICAgLy8gICAgICAgICBpbXAuQmFzZSA9IGRQcmVjaW9CYXNlO1xyXG4gICAgLy8gICAgICAgICBkVG90YWxJbXB1ZXN0byA9ICgrZFRvdGFsSW1wdWVzdG8pICsgKCtpbXAuVmFsb3IpO1xyXG4gICAgLy8gICAgICAgICAvL1N1bWEgZGUgcHJlY2lvIGJhc2UgXHJcbiAgICAvLyAgICAgICAgIGRQcmVjaW9CYXNlID0gKCtkUHJlY2lvQmFzZSkgKyAoK2ltcC5WYWxvcik7XHJcbiAgICAvLyAgICAgfSk7XHJcbiAgICAvLyAgICAgZFRvdGFsSW1wdWVzdG8gPSBNYXRoLnJvdW5kKGRUb3RhbEltcHVlc3RvICogMTAwKSAvIDEwMDtcclxuICAgIC8vICAgICBvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVE9UQUxJTVBVRVNUT1NcIikuVmFsb3IgPSBkVG90YWxJbXB1ZXN0by50b1N0cmluZygpO1xyXG4gICAgLy8gfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWFjaW9uIG51ZXZvIE0zIHByb2Nlc29zLCBlc3RlIHZhIHZhY2lvIHNpbiBuaXNpcXVpZXJhIE0zUEVuY0l0ZW1zLiBcclxuICAgICAqIFNlIHV0aWxpemEgcHJpbmNpcGFsbWVudGUgcGFyYSBsYXMgY3JlYWNpb24gZGVzZGUgMCB1biBNMyBQcm9jZXNvLiBRdWUgcGFzYSBkZSBlc3RhZG9zICcnIGFsIHByaW1lciBlc3RhZG9cclxuICAgICAqIEBwYXJhbSBpb00zUHJvY2Vzb3MgXHJcbiAgICAgKiBAcGFyYW0gaWRwcm9jZXNvX2Rlc3Rpbm8gXHJcbiAgICAgKiBAcGFyYW0gdGRvYyBcclxuICAgICAqIEBwYXJhbSBuZG9jIFxyXG4gICAgICogQHBhcmFtIGVzdGFkb3NfZnV0dXJvcyBcclxuICAgICAqIEBwYXJhbSBpZEh1YiBcclxuICAgICAqIEBwYXJhbSBpZFViaWNhY2lvbiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIENyZWF0ZU0zTmV3UHJvY2Vzb0VtcHR5KGlvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgaWRwcm9jZXNvX2Rlc3Rpbm86IHN0cmluZywgdGRvYzogc3RyaW5nLCBuZG9jOiBzdHJpbmcsXHJcbiAgICAgICAgZXN0YWRvc19mdXR1cm9zOiBBcnJheTxhbnk+LCBpZEh1Yjogc3RyaW5nLCBpZFViaWNhY2lvbjogc3RyaW5nKSB7XHJcblxyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5UTUlkUHJvY2VzbyA9IGlkcHJvY2Vzb19kZXN0aW5vO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5Fc3RhZG9BbnQgPSBcIlwiO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5TdWJFc3RhZG9BbnQgPSBcIlwiO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5Fc3RhZG9EZXMgPSBlc3RhZG9zX2Z1dHVyb3NbMF0uRV9EZXN0aW5vO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5TdWJFc3RhZG9EZXMgPSBlc3RhZG9zX2Z1dHVyb3NbMF0uU0VfRGVzdGlubztcclxuICAgICAgICBpb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZEh1YiA9ICtpZEh1YjtcclxuICAgICAgICBpb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZFViaWMgPSAraWRVYmljYWNpb247XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLklESHViID0gK2lkSHViO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5VYmljMSA9ICtpZFViaWNhY2lvbjtcclxuICAgICAgICBpb00zUHJvY2Vzb3MuVERvYyA9IHRkb2M7XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLk5Eb2MgPSBuZG9jO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5UaXBvVGVyY2VybyA9IDE7XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLlViaWMyID0gLTE7XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRIdWJQcmUgPSAtMTtcclxuICAgICAgICBpb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZFViaWNQcmUgPSAtMTtcclxuICAgIH1cclxuXHJcbiAgICAvL0N1YW5kbyBzZSBhZ3JlZ2EgcG9yIHByaW1lcmEgdmV6IGFsIGNhcnJpdG8gZGUgY29tcHJhLlxyXG4gICAgcHVibGljIExvYWRNM1Byb2Nlc29FbXB0eVBEQihwcm9kR1JQU2VsZWN0ZWQ6IFR5cGVNM1ByZEdycCwgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQiwgb0RhdGFVc2VyOiBhbnksIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgaW9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQ6IGFueSA9IG51bGwpOiBNM1Byb2Nlc29zIHtcclxuICAgICAgICAvL3NJREthdGlvcywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OXHJcbiAgICAgICAgdmFyIG9NM1Byb2Nlc29zO1xyXG4gICAgICAgIGlmIChpb00zUHJvY2Vzb3MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcyA9IGlvTTNQcm9jZXNvcztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcyA9IG5ldyBNM1Byb2Nlc29zKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBvTTNQcm9jZXNvcy5GZWNoYSA9IG1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcclxuICAgICAgICBvTTNQcm9jZXNvcy5UaXBvVGVyY2VybyA9IDE7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuVERvYyA9IG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLk5Eb2MgPSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQztcclxuICAgICAgICBvTTNQcm9jZXNvcy5VYmljMSA9IG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT047XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuVWJpYzIgPSAtMTtcclxuICAgICAgICAvLy9BR1JFR0FSIE5VRVZBIEZVTkNJT05BTElEQUQgREUgSFVCUy4gRkxVSk8gREUgVFJBQkFKT1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLklESHViID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklESFVCO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRIdWIgPSBvTTNQcm9jZXNvcy5JREh1YjtcclxuICAgICAgICBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkVWJpYyA9IG9NM1Byb2Nlc29zLlViaWMxO1xyXG5cclxuICAgICAgICBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkSHViUHJlID0gLTE7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZFViaWNQcmUgPSAtMTtcclxuXHJcbiAgICAgICAgLy8vRklOIEFHUkVHQVIgTlVFVkEgRlVOQ0lPTkFMSURBRCBERSBIVUJTLiBGTFVKTyBERSBUUkFCQUpPXHJcblxyXG4gICAgICAgIC8vIG9NM1Byb2Nlc29zLlN1YkVzdGFkb0FudCA9IFwiXCI7XHJcbiAgICAgICAgLy8gb00zUHJvY2Vzb3MuRXN0YWRvQW50ID0gXCJcIjtcclxuXHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zLlN1YkVzdGFkb0RlcyA9PSBcIlwiICYmIGlvTTNQcm9jZXNvcyA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlN1YkVzdGFkb0RlcyA9IFwiUmVnaXN0cm9cIjtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuRXN0YWRvRGVzID0gXCJBY3Rpdm9cIjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChvTTNQSXRlbXNXRUIuU3ViRXN0YWRvX28gIT0gXCJcIiAmJiBvTTNQSXRlbXNXRUIuRXN0YWRvX28gIT0gXCJcIikge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5TdWJFc3RhZG9EZXMgPSBvTTNQSXRlbXNXRUIuU3ViRXN0YWRvX287XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLkVzdGFkb0RlcyA9IG9NM1BJdGVtc1dFQi5Fc3RhZG9fbztcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBpZiAob00zUEl0ZW1zV0VCLklkUHJvY2VzbyA9PSBcIlwiICYmIGlvTTNQcm9jZXNvcyA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlRNSWRQcm9jZXNvID0gXCJNM0VDQ1wiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKG9NM1BJdGVtc1dFQi5JZFByb2Nlc28gIT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuVE1JZFByb2Nlc28gPSBvTTNQSXRlbXNXRUIuSWRQcm9jZXNvO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL29NM1Byb2Nlc29zLk0zRU5DLnB1c2godGhpcy5Mb2FkTTNQRW5jSXRlbXNGcm9tUHJkR3JsKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1Byb2Nlc29zLk0zRU5DLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9EYXRhVXNlcikpO1xyXG4gICAgICAgIHRoaXMuTG9hZE0zUEVuY0l0ZW1zRnJvbVByZEdybChvTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkLCBvTTNQcm9jZXNvcy5NM0VOQywgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIsIG51bGwsIDAsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZClcclxuXHJcbiAgICAgICAgLy8gb00zUHJvY2Vzb3MuVmFsb3IgPSBvTTNQSXRlbXNXRUIuZFByZWNpb1RvdGFsO1xyXG4gICAgICAgIC8vIG9NM1Byb2Nlc29zLlZhbG9yTmV0byA9IG9NM1BJdGVtc1dFQi5kUHJlY2lvVG90YWw7XHJcblxyXG4gICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuICAgICAgICAvL3RoaXMuUHJvY2VzYW1pZW50b1NlcnZpY2UoUG9zdFNlcnZpY2VNMywgb00zUHJvY2Vzb3MsIGZ1bmNpb25PSywgZnVuY2lvbkVycm9yKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9DYXJnYXIgbnVldm9zIGFkaWNpb25hbGVzIGFkaWNpb25hbGVzXHJcbiAgICBwdWJsaWMgTG9hZEFkaWNpb25hbGVzKG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIsIHByb2R1Y3Q6IFR5cGVNM1ByZEdycCk6IE0zUEl0ZW1zV0VCIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBvTTNQSXRlbXNXRUIuQ2xhdmVQcmRTUlYgPSBwcm9kdWN0LkxvTTNQcmRBZGljaW9uYWxlcy5maW5kKGFkaSA9PiBhZGkuQVRSSUJVVE8gPT0gXCJDTEFWRVBST0RTRVJWXCIpLlZBTE9SO1xyXG4gICAgICAgICAgICBvTTNQSXRlbXNXRUIuQ2xhdmVQcmRVbmlkYWQgPSBwcm9kdWN0LkxvTTNQcmRBZGljaW9uYWxlcy5maW5kKGFkaSA9PiBhZGkuQVRSSUJVVE8gPT0gXCJDTEFWRVVOSURBRFwiKS5WQUxPUjtcclxuICAgICAgICAgICAgb00zUEl0ZW1zV0VCLlVuaWRhZCA9IHByb2R1Y3QuTG9NM1ByZEFkaWNpb25hbGVzLmZpbmQoYWRpID0+IGFkaS5BVFJJQlVUTyA9PSBcIlVOSURBRFwiKS5WQUxPUjtcclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvTTNQSXRlbXNXRUI7XHJcbiAgICB9XHJcblxyXG4gICAgLy9DYXJnYXIgcHJvY2Vzb3MsIHJldG9tYW5kbyBkZXNkZSBkYXRhXHJcbiAgICBwdWJsaWMgTG9hZE0zUHJvY2Vzb0Zyb21EYXRhKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQ6IFR5cGVNM1ByZEdycCxcclxuICAgICAgICBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIG9EYXRhVXNlcjogYW55LCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQ6IGFueSA9IG51bGwsIHZhbG9yRGVzY3VlbnRvID0gMCk6IE0zUHJvY2Vzb3Mge1xyXG4gICAgICAgIC8vIG9NM1Byb2Nlc29zLlZhbG9yID0gKCtvTTNQcm9jZXNvcy5WYWxvcikgKyAoK29NM1BJdGVtc1dFQi5kUHJlY2lvVG90YWwpO1xyXG4gICAgICAgIC8vIG9NM1Byb2Nlc29zLlZhbG9yTmV0byA9IG9NM1Byb2Nlc29zLlZhbG9yO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLkZlY2hhID0gbW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcy5UTUlkUHJvY2VzbyA9PSBcIlwiICYmIG9NM1BJdGVtc1dFQi5JZFByb2Nlc28gIT0gXCJcIikge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5UTUlkUHJvY2VzbyA9IG9NM1BJdGVtc1dFQi5JZFByb2Nlc287XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL29NM1Byb2Nlc29zLk0zRU5DLnB1c2godGhpcy5Mb2FkTTNQRW5jSXRlbXNGcm9tUHJkR3JsKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1Byb2Nlc29zLk0zRU5DLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9EYXRhVXNlcikpO1xyXG4gICAgICAgIHRoaXMuTG9hZE0zUEVuY0l0ZW1zRnJvbVByZEdybChvTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkLCBvTTNQcm9jZXNvcy5NM0VOQywgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIsIG51bGwsIHZhbG9yRGVzY3VlbnRvLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQpXHJcblxyXG4gICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgTG9hZE0zUEVuY0l0ZW1zRnJvbVByZEdybChvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkOiBUeXBlTTNQcmRHcnAsXHJcbiAgICAgICAgb2VuY2FiZXphZG9JdGVtczogQXJyYXk8TTNQRW5jSXRlbXM+LCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLFxyXG4gICAgICAgIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgb0RhdGFVc2VyOiBhbnksIG9QYWRyZU0zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgdmFsb3JEZXNjdWVudG8gPSAwLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQ6IGFueSA9IG51bGwpIHtcclxuXHJcbiAgICAgICAgLy9WYWxpZGFjaW9uIGRlIEludmVudGFyaW8uXHJcbiAgICAgICAgbGV0IGFkaVZlbnRhTmVnID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRBZGljaW9uYWxlcy5maW5kKHggPT4geC5BVFJJQlVUTyA9PSBcIlZFTlRBTkVHXCIpXHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zW1wiSW52ZW50YXJpb0Vycm9yXCJdKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBvTTNQcm9jZXNvc1tcIkludmVudGFyaW9FcnJvclwiXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zLlRNSWRQcm9jZXNvLnRvVXBwZXJDYXNlKCkgPT0gXCJNM0VDQ1wiICYmIHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5ESVNQT05JQkxFIDwgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCAmJiBvTTNVYmljYWNpb24uTTNIVUJTWzBdLlRpcG8gPT0gXCJXRUJcIiAmJiAhKGFkaVZlbnRhTmVnICYmIGFkaVZlbnRhTmVnLlZBTE9SKSkge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvc1tcIkludmVudGFyaW9FcnJvclwiXSA9ICdObyBoYXkgaW52ZW50YXJpbyBwYXJhIGFncmVnYXIgJyArIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgKyAnIEl0ZW1zJztcclxuICAgICAgICAgICAgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5ESVNQT05JQkxFO1xyXG4gICAgICAgIH0gLy9lbHNlIHtcclxuXHJcbiAgICAgICAgdmFyIG9NM1BFbmNJdGVtcyA9IG5ldyBNM1BFbmNJdGVtcygpO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLkZlY2hhID0gbW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xyXG4gICAgICAgIG9NM1BFbmNJdGVtcyA9IHRoaXMuTG9hZE0zUEVuY0l0ZW1zRnJvbVByZEdybEl0ZW0ob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zUHJvY2Vzb3MuTTNFTkMsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyLCBvUGFkcmVNM1BFbmNJdGVtcywgdmFsb3JEZXNjdWVudG8pO1xyXG5cclxuICAgICAgICBpZiAob00zUHJvY2Vzb3NbXCJNZW5zYWplRXJyb3JcIl0pIHtcclxuICAgICAgICAgICAgZGVsZXRlIG9NM1Byb2Nlc29zW1wiTWVuc2FqZUVycm9yXCJdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob1BhZHJlTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICAgICAgLy9UaWVuZSB1biBlbmNhYmV6YWRvIHBhZHJlLlxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuSWRFbmNQYWRyZSA9IG9QYWRyZU0zUEVuY0l0ZW1zLklEO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFvTTNQRW5jSXRlbXNbXCJNZW5zYWplRXJyb3JcIl0pIHtcclxuICAgICAgICAgICAgdmFyIG9sTTNQcmRQYWNrRGV0OiBBcnJheTxNM1ByZFBhY2tEZXQ+O1xyXG4gICAgICAgICAgICBvbE0zUHJkUGFja0RldCA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5NM1BBQ0tcclxuICAgICAgICAgICAgaWYgKG9sTTNQcmRQYWNrRGV0ICYmIG9sTTNQcmRQYWNrRGV0Lmxlbmd0aCA+IDApIHtcclxuXHJcbiAgICAgICAgICAgICAgICAvL2xldCB2YWxvckRlc2N1ZW50b1BhY2sgPSB0aGlzLmNhbGN1bGFyUG9yY2VudGFqZURlc2N1ZW50b0NvbWJvKHByb2RHUlBTZWxlY3RlZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvbE0zUHJkUGFja0RldC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBvTTNQcmRQYWNrRGV0OiBNM1ByZFBhY2tEZXQgPSBvbE0zUHJkUGFja0RldFtpXTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcGFja00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9NM1ByZFBhY2tEZXQub00zUEl0ZW1zV0VCKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tNM1BJdGVtc1dFQiA9IG9NM1ByZFBhY2tEZXQub00zUEl0ZW1zV0VCO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFja00zUEl0ZW1zV0VCID0gT2JqZWN0LmFzc2lnbih7fSwgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFja00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9IG9NM1ByZFBhY2tEZXQuQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHBhY2tNM1BJdGVtc1dFQi5QYXRoSW1hZ2VuID0gb00zUHJkUGFja0RldC5nc1BhdGhJbWFnZW47XHJcbiAgICAgICAgICAgICAgICAgICAgcGFja00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9IHBhY2tNM1BJdGVtc1dFQi5kQ2FudGlkYWQgKiBvTTNQSXRlbXNXRUIuZENhbnRpZGFkO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vdGhpcy5DYWxjdWxhclByZWNpb3NQQ0tHKG9NM1ByZFBhY2tEZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHBhY2tNM1BJdGVtc1dFQi5JREVuY1JlcGV0aWRvID0gK3RoaXMuR2V0TWF4QXRyaWJ1dG9Gcm9tTGlzdGEob00zUHJvY2Vzb3MuTTNFTkMsIFwiSURcIikgKyBpICsgMjsgLy9Fc3RvIGZ1bmNpb25hIHNpIHRpZW5lIHNvbG8gMiBuaXZlbGVzXHJcbiAgICAgICAgICAgICAgICAgICAgLy9TaSBlc3RvIHNlIGN1bXBsZSBlc3RlIHByb2R1Y3RvIGVzIHVuIHBhY2sgeSB0aWVuZSBwcm9kdWN0b3MgYXNvY2lhZG9zLlxyXG4gICAgICAgICAgICAgICAgICAgIG9NM1ByZFBhY2tEZXQuTTNHUlAuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTyA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByZEdlbmVyYWwgPSBvTTNQcmRQYWNrRGV0Lk0zR1JQLkxvTTNQcmRHZW5lcmFsWzBdLk0zQ29kcy5maW5kKHggPT4geC5JZENvZGlnbyA9PSBcIlVQQ1wiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZEdlbmVyYWwgJiYgcHJkR2VuZXJhbC5WYWxvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja00zUEl0ZW1zV0VCLkNvZGlnb0JhcnJhcyA9IHByZEdlbmVyYWwuVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2goZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCJubyBhw7FhZGkgY29kaWdvIGRlIGJhcnJhcyBhIHByb2R1Y3RvIGhpam86IFwiICsgb00zUHJkUGFja0RldC5TS1VISUpPKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkxvYWRNM1BFbmNJdGVtc0Zyb21QcmRHcmwob00zUHJvY2Vzb3MsIG9NM1ByZFBhY2tEZXQuTTNHUlAsIG9NM1Byb2Nlc29zLk0zRU5DLCBwYWNrTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9EYXRhVXNlciwgb00zUEVuY0l0ZW1zLCAwLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL0pBR00gMjAxOTA2MjMsIGVzdG8gZXMgY3VhbmRvIHNlIG1vZGlmaWNhIGxhIGNhbnRpZGFkIGRlIHByb2RjdXRvcyBleGlzdGVudGVzLlxyXG4gICAgICAgICAgICBpZiAob00zUEl0ZW1zV0VCLklERW5jUmVwZXRpZG8gIT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5JRCA9IG9NM1BJdGVtc1dFQi5JREVuY1JlcGV0aWRvO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vSkFHTSAyMDE5IGVudmlvIGRlIHBhZHJlIGRlc2RlIGluc3RydWNjaW9uIG1hcyBhcnJpYmFcclxuICAgICAgICAgICAgaWYgKG9NM1BJdGVtc1dFQi5JREVuY1BhZHJlICE9IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuSWRFbmNQYWRyZSA9IG9NM1BJdGVtc1dFQi5JREVuY1BhZHJlO1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLlRpcG9BZ3J1cGFjaW9uID0gb00zUEl0ZW1zV0VCLlRpcG9BZ3J1cGFjaW9uO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQgJiYgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZC5mb3JFYWNoKGRpbiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zUERpbmFtQnlBY3RpdmlkYWQucHVzaCh7Li4uIGRpbn0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLnB1c2gob00zUEVuY0l0ZW1zKTtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvc1tcIk1lbnNhamVFcnJvclwiXSA9IG9NM1BFbmNJdGVtc1tcIk1lbnNhamVFcnJvclwiXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb00zUEl0ZW1zV0VCLklERW5jUHJvY2VzYWRvID0gb00zUEVuY0l0ZW1zLklEO1xyXG4gICAgICAgIC8vfVxyXG4gICAgfVxyXG5cclxuICAgIGNhbGN1bGFyUG9yY2VudGFqZURlc2N1ZW50b0NvbWJvKHByb2RHUlBTZWxlY3RlZDogVHlwZU0zUHJkR3JwKSB7XHJcbiAgICAgICAgbGV0IHZhbG9yRGVzY3VlbnRvUGFjayA9IDA7XHJcbiAgICAgICAgbGV0IHZhbG9ySXRlbXNDb21ib1N1bWEgPSAwO1xyXG4gICAgICAgIGxldCB2YWxvckZpbmFsQ29tYm8gPSBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTztcclxuXHJcbiAgICAgICAgcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLk0zUEFDSy5mb3JFYWNoKHByZFBhY2sgPT4ge1xyXG4gICAgICAgICAgICBsZXQgY2FudGlkYWQgPSBwcmRQYWNrLk0zR1JQLkNhbnRpZGFkID8gcHJkUGFjay5NM0dSUC5DYW50aWRhZCA6IDE7XHJcbiAgICAgICAgICAgIGxldCBpbmZOaXZlbGVzUHJjaW8gPSB0aGlzLlZlcmlmaWNhclByZWNpb0J5Tml2ZWxlcyhwcmRQYWNrLk0zR1JQLCBjYW50aWRhZCk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcocHJkUGFjay5NM0dSUC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuSURMSVNUQSlcclxuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhwcmRQYWNrLk0zR1JQLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU8pXHJcbiAgICAgICAgICAgIHZhbG9ySXRlbXNDb21ib1N1bWEgKz0gKHByZFBhY2suTTNHUlAuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTyAqIGNhbnRpZGFkKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKHZhbG9ySXRlbXNDb21ib1N1bWEgPiB2YWxvckZpbmFsQ29tYm8pIHtcclxuICAgICAgICAgICAgdmFsb3JEZXNjdWVudG9QYWNrID0gMTAwIC0gKHZhbG9yRmluYWxDb21ibyAqIDEwMCAvIHZhbG9ySXRlbXNDb21ib1N1bWEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zb2xlLmRlYnVnKHZhbG9yRGVzY3VlbnRvUGFjaylcclxuICAgICAgICByZXR1cm4gdmFsb3JEZXNjdWVudG9QYWNrO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlY2FsY3VsbyBkZSBwcmVjaW9zIGRlIGhpam9zIGRlbCBwYXF1ZXRlXHJcbiAgICAgKiBAcGFyYW0gb00zUHJkUGFja0RldCBcclxuICAgICAqL1xyXG4gICAgcHVibGljIENhbGN1bGFyUHJlY2lvc1BDS0cob00zUHJkUGFja0RldDogTTNQcmRQYWNrRGV0KSB7XHJcbiAgICAgICAgb00zUHJkUGFja0RldC5NM0dSUC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPID0gMDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbG9hZE0zUEVuY0l0ZW1zRnJvbVByb21vY2lvbkNvbWJvKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBwcm9kdWN0b3NIaWpvc0RlbENvbWJvOiBBcnJheTxNM1BFbmNJdGVtcz4sIGNvZGlnbzogc3RyaW5nLCB2YWxvciwgZENhbnRpZGFkOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgcHJvZHVjdG9Db21ibyA9IG5ldyBNM1BFbmNJdGVtcygpO1xyXG5cclxuICAgICAgICBwcm9kdWN0b0NvbWJvLklkUHJvZHVjdG8gPSBjb2RpZ287XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5Mb3RlID0gXCIxXCI7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5JRCA9ICt0aGlzLkdldE1heEF0cmlidXRvRnJvbUxpc3RhKG9NM1Byb2Nlc29zLk0zRU5DLCBcIklEXCIpICsgMTsgLy9KQUdNLCBjYW1iaW8gZGUgSUQsIGNhc28gY3VhbmRvIHNlIGFncmVnYSBwcmQ6MSwgcHJkOjIgeSBkZSBudWV2byBwcmQ6MS4gRW4gZXN0ZSBjYXNvIGVuIGzDs2dpY2EgYW50ZXJpb3IsIHNlIGhhY2UgcmVtb3ZlIGRlIGl0ZW0uIHkgbG9zIElEIHF1ZWRhYmFuIHJlcGV0aWRvcy5cclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk9yZGVuID0gK3RoaXMuR2V0TWF4QXRyaWJ1dG9Gcm9tTGlzdGEob00zUHJvY2Vzb3MuTTNFTkMsIFwiT3JkZW5cIikgKyAxO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTm9tYnJlID0gYENvbWJvIC0gJHtwcm9kdWN0b3NIaWpvc0RlbENvbWJvLm1hcCh4PT4geC5JZFByb2R1Y3RvKS5qb2luKCctJyl9YDtcclxuXHJcblxyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVktTU0tRERUSEg6bW06c3MnKSwgXCJGRUNIQUlOXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcInRydWVcIiwgXCJFU1BST0RQUk9NT0NPTUJPXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcInRydWVcIiwgXCJFU1BST0RQUk9NT1wiKSk7IC8vIFRSVUUtPiBTSSBFUyBVTiBQUk9EVUNUTyBQT1IgUFJPTU9DSU9OLCBGQUxTRS0+IERFIE9UUk8gTU9ET1xyXG4gICAgICAgIC8vRGV0YWxsZXMgZGUgZmFjdHVyYSBlbGVjdHJvbmljYVxyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwiRU5DUFJPTU9cIiwgXCJUSVBPX1BSRFwiKSk7XHJcbiAgICAgICAgLyoqRklOIElORk9STUFDSU9OIEdFTkVSQUwgKi9cclxuXHJcbiAgICAgICAgLy8qKiBJTklDSU8gVkFMT1JFUyBVTklUQVJJT1MgKi9cclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSh2YWxvciwgXCJQUkVDSU9VTklUQkFTRVwiKSk7IC8vUHJlY2lvIFNpbiBpbXB1ZXN0b3NcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIjBcIiwgXCJUT1RBTElNUFVFU1RPU1wiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCIwXCIsIFwiVE9UQUxJTVBVTklUXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSh2YWxvciwgXCJQVU5JVFNJTklNUFVFU1RPXCIpKTsvL1NpbiBkZXNjdWVudG8gaW5jbHVpZG8gWSBzaW4gSW1wdWVzdG9zXHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUodmFsb3IsIFwiUFVOSVRcIikpOy8vU2luIGRlc2N1ZW50byBpbmNsdWlkbyAgLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKHZhbG9yLCBcIlBVTklUTkVUT1wiKSk7Ly9Db24gZGVzY3VlbnRvIGluY2x1aWRvLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwiMFwiLCBcIlZVTklUUFJPTU9cIikpOy8vVW5pdGFyaW8gUHJvbW9jaW9uIC0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIjBcIiwgXCJVTklURklERUxcIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwiMFwiLCBcIlRPVEFMSU1QVU5JVFwiKSk7XHJcbiAgICAgICAgLy8qKiBGSU4gVkFMT1JFUyBVTklUQVJJT1MgKi9cclxuXHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZENhbnRpZGFkLnRvU3RyaW5nKCksIFwiQ0FOVElEQURcIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwiMFwiLCBcIlRPVEFMSU1QVUVTVE9TXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIjBcIiwgXCJGSURFTElaQUNJT05cIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwiMFwiLCBcIlRPVEFMUFJPTU9cIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKHZhbG9yLCBcIkNUQkxESU1QUFJEXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSgoK3ZhbG9yICogZENhbnRpZGFkKS50b1N0cmluZygpLCBcIlBSRUNJT1RPVEFMU0lORFRPXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSgoK3ZhbG9yICogZENhbnRpZGFkKS50b1N0cmluZygpLCBcIlNVQlRPVEFMXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSgoK3ZhbG9yICogZENhbnRpZGFkKS50b1N0cmluZygpLCBcIlBSRUNJT1RPVEFMQkFTRVwiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoKCt2YWxvciAqIGRDYW50aWRhZCkudG9TdHJpbmcoKSwgXCJQUkVDSU9UT1RBTFwiKSk7XHJcblxyXG4gICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLnB1c2gocHJvZHVjdG9Db21ibyk7XHJcbiAgICAgICAgcHJvZHVjdG9zSGlqb3NEZWxDb21iby5mb3JFYWNoKHByb2R1Y3RvID0+IHtcclxuICAgICAgICAgICAgcHJvZHVjdG8uSUQgPSArdGhpcy5HZXRNYXhBdHJpYnV0b0Zyb21MaXN0YShvTTNQcm9jZXNvcy5NM0VOQywgXCJJRFwiKSArIDE7IC8vSkFHTSwgY2FtYmlvIGRlIElELCBjYXNvIGN1YW5kbyBzZSBhZ3JlZ2EgcHJkOjEsIHByZDoyIHkgZGUgbnVldm8gcHJkOjEuIEVuIGVzdGUgY2FzbyBlbiBsw7NnaWNhIGFudGVyaW9yLCBzZSBoYWNlIHJlbW92ZSBkZSBpdGVtLiB5IGxvcyBJRCBxdWVkYWJhbiByZXBldGlkb3MuXHJcbiAgICAgICAgICAgIHByb2R1Y3RvLklkRW5jUGFkcmUgPSBwcm9kdWN0b0NvbWJvLklEO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5wdXNoKHByb2R1Y3RvKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5yZWNhbGN1bGFyTTNQcm9jZXNvKG9NM1Byb2Nlc29zKTtcclxuICAgICAgICByZXR1cm4gcHJvZHVjdG9Db21ibztcclxuICAgIH1cclxuXHJcbiAgICByZWNhbGN1bGFyTTNQcm9jZXNvKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgbGV0IHByb2R1Y3Rvc0FwbFN1bWFWYWxvciA9IG9NM1Byb2Nlc29zLk0zRU5DLmZpbHRlcihvTTNFTkMgPT4ge1xyXG4gICAgICAgICAgICBsZXQgZGV0Q2FudGlkYWQgPSBvTTNFTkMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKTtcclxuICAgICAgICAgICAgbGV0IGRldEVzUHJkQ29tYm8gPSBvTTNFTkMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJFU1BST0RQUk9NT0NPTUJPXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gZGV0Q2FudGlkYWQgJiYgK2RldENhbnRpZGFkLlZhbG9yID4gMCAmJiAhKGRldEVzUHJkQ29tYm8gJiYgZGV0RXNQcmRDb21iby5WYWxvciA9PSBcInRydWVcIilcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgb00zUHJvY2Vzb3MuVmFsb3JOZXRvID0gMDtcclxuICAgICAgICBvTTNQcm9jZXNvcy5WYWxvciA9IDA7XHJcblxyXG4gICAgICAgIC8vZm9yIChjb25zdCBvTTNFTkMgb2YgdGhpcy5vTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIoZW5jID0+ICFlbmMuSWRFbmNQYWRyZSB8fCBlbmMuSWRFbmNQYWRyZSA8PSAwKSkge1xyXG4gICAgICAgIGZvciAoY29uc3Qgb00zRU5DIG9mIHByb2R1Y3Rvc0FwbFN1bWFWYWxvcikge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5WYWxvck5ldG8gKz0gK29NM0VOQy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5WYWxvciArPSArb00zRU5DLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiU1VCVE9UQUxcIikuVmFsb3I7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vQ2FyZ2FyIE0zUHJvY2VzbyBlbmNhYmV6YWRvIGl0ZW1zLCBkZXNkZSBwcm9kdWN0byBnZW5lcmFsXHJcbiAgICBwdWJsaWMgTG9hZE0zUEVuY0l0ZW1zRnJvbVByZEdybEl0ZW0ob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZDogVHlwZU0zUHJkR3JwLFxyXG4gICAgICAgIG9lbmNhYmV6YWRvSXRlbXM6IEFycmF5PE0zUEVuY0l0ZW1zPiwgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQixcclxuICAgICAgICBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIG9EYXRhVXNlcjogYW55LCBvUGFkcmVNM1BFbmNJdGVtczogTTNQRW5jSXRlbXMgPSB1bmRlZmluZWQsIHZhbG9yRGVzY3VlbnRvID0gMCk6IE0zUEVuY0l0ZW1zIHtcclxuXHJcbiAgICAgICAgdmFyIG9NM1BFbmNJdGVtcyA9IG5ldyBNM1BFbmNJdGVtcygpO1xyXG4gICAgICAgIHZhciBvTTNQcmRHZW5lcmFsOiBNM1ByZEdlbmVyYWw7XHJcbiAgICAgICAgdmFyIGRQUkVDSU9Vbml0QmFzZSA9IDA7XHJcbiAgICAgICAgdmFyIGluZk5pdmVsZXNQcmNpbztcclxuICAgICAgICB2YXIgb1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhO1xyXG4gICAgICAgIHZhciBkVG90YWxJbXB1ZXN0b3NUb3RhbDogbnVtYmVyID0gMDtcclxuICAgICAgICB2YXIgZFVuaXRhcmlvTW9uZWRlcm86IG51bWJlciA9IDA7XHJcbiAgICAgICAgdmFyIGRVbml0YXJpb1Byb21vOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIC8vVmVyaWZpY2FyIGVsIHByZWNpbyBhIHVzYXIsIHVzYW5kbyBsYSBsb2dpY2EgZGUgbml2ZWxlcyBkZSBwcmVjaW9zLlxyXG4gICAgICAgIGluZk5pdmVsZXNQcmNpbyA9IHRoaXMuVmVyaWZpY2FyUHJlY2lvQnlOaXZlbGVzKHByb2RHUlBTZWxlY3RlZCwgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCk7XHJcbiAgICAgICAgaWYgKHZhbG9yRGVzY3VlbnRvID4gMCkge1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhID0gbmV3IFByb21vY2lvblByb2Nlc2FkYSgpO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU8gKiB2YWxvckRlc2N1ZW50byAvIDEwMDtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPIC0gb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbjtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMgPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEgPSB0aGlzLkNhbGN1bGFyUHJvbW9jaW9uZXMob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9WYWxpZGEgc2kgZWwgcHJvZHVjdG8gZXN0w6EgcmVzdGluZ2lkb1xyXG4gICAgICAgIGlmICghdGhpcy52YWxpZGFyUHJvZHVjdG9SZXN0cmluZ2lkbyhvUHJvbW9jaW9uUHJvY2VzYWRhKSkge1xyXG4gICAgICAgICAgICB0aGlzLkFzaWduYXJQcm9tb2Npb25lc0NvbWJpbmFkYXMob00zUHJvY2Vzb3MsIG9Qcm9tb2Npb25Qcm9jZXNhZGEsIG9NM1BFbmNJdGVtcyk7XHJcblxyXG4gICAgICAgICAgICAvL0NhbGN1bG8gZGVsIHRvdGFsIGRlIHB1bnRvcyB5IGVsIHZhbG9yIHRvdGFsIGRlIGxhIHByb21vY2nDs24gcG9yIGxhIGNxYW50aWRhZCBkZSBwcm9kdWN0b3MgZGUgbGEgbWlzbWEgcmVmZXJlbmNpYVxyXG4gICAgICAgICAgICBkVW5pdGFyaW9Nb25lZGVybyA9IG9Qcm9tb2Npb25Qcm9jZXNhZGEuVmFsb3JUb3RhbE1vbmVkZXJvOyAvL1VuaXRhcmlvIE1vbmVkZXJvXHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuVmFsb3JUb3RhbE1vbmVkZXJvID0gK2JpZ0RlY2ltYWwubXVsdGlwbHkob1Byb21vY2lvblByb2Nlc2FkYS5WYWxvclRvdGFsTW9uZWRlcm8sIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQpOyAvL05vIHNlIHV0aWxpemEsIHNlIGRlamEgcGFyYSB1c29zIGFkZWxhbnRlXHJcblxyXG4gICAgICAgICAgICBkVW5pdGFyaW9Qcm9tbyA9IG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb247IC8vUHJvbW9jaW9uIHVuaXRhcmlvXHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSArYmlnRGVjaW1hbC5tdWx0aXBseShvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uLCBvTTNQSXRlbXNXRUIuZENhbnRpZGFkKTsgLy9ObyBzZSB1dGlsaXphLCBzZSBkZWphIHBhcmEgdXNvcyBhZGVsYW50ZVxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNEZXRDdXBvbmVzID0gdGhpcy5nZXRfbGlzdF9jdXBvbmVzX2Zyb21fcHJvbW8ob1Byb21vY2lvblByb2Nlc2FkYSwgK29NM1BJdGVtc1dFQi5kQ2FudGlkYWQpO1xyXG5cclxuICAgICAgICAgICAgLy9DYWxjdWxvIGRlIHByZWNpbyB0b3RhbCwgZGVzcHVlcyBkZSBwcm9tb2Npb25lc1xyXG4gICAgICAgICAgICBvTTNQSXRlbXNXRUIuZFByZWNpb1RvdGFsID0gK2JpZ0RlY2ltYWwubXVsdGlwbHkob1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCwgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCk7XHJcblxyXG4gICAgICAgICAgICAvL0NhcmdhciBwcm9kdWN0byBcclxuICAgICAgICAgICAgb00zUHJkR2VuZXJhbCA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXTtcclxuXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5JZFByb2R1Y3RvID0gb00zUHJkR2VuZXJhbC5TS1U7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5Mb3RlID0gb00zUHJkR2VuZXJhbC5MT1RFO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuSUQgPSArdGhpcy5HZXRNYXhBdHJpYnV0b0Zyb21MaXN0YShvZW5jYWJlemFkb0l0ZW1zLCBcIklEXCIpICsgMTsgLy9KQUdNLCBjYW1iaW8gZGUgSUQsIGNhc28gY3VhbmRvIHNlIGFncmVnYSBwcmQ6MSwgcHJkOjIgeSBkZSBudWV2byBwcmQ6MS4gRW4gZXN0ZSBjYXNvIGVuIGzDs2dpY2EgYW50ZXJpb3IsIHNlIGhhY2UgcmVtb3ZlIGRlIGl0ZW0uIHkgbG9zIElEIHF1ZWRhYmFuIHJlcGV0aWRvcy5cclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk9yZGVuID0gK3RoaXMuR2V0TWF4QXRyaWJ1dG9Gcm9tTGlzdGEob2VuY2FiZXphZG9JdGVtcywgXCJPcmRlblwiKSArIDE7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5Ob21icmUgPSBvTTNQcmRHZW5lcmFsLk5PTUJSRTE7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5ESVNQT05JQkxFID0gb00zUHJkR2VuZXJhbC5ESVNQT05JQkxFO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuUGF0aEltYWdlID0gb00zUEl0ZW1zV0VCLlBhdGhJbWFnZW47XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5Db2RpZ29CYXJyYXMgPSBvTTNQSXRlbXNXRUIuQ29kaWdvQmFycmFzO1xyXG4gICAgICAgICAgICBpZiAob00zVWJpY2FjaW9uICYmIG9NM1ViaWNhY2lvbi5NM1ViaUFkaWNpb25hbGVzKXtcclxuICAgICAgICAgICAgICAgIGxldCB1YmlJbXBGaWpvID0gb00zVWJpY2FjaW9uLk0zVWJpQWRpY2lvbmFsZXMuZmluZCh4ID0+IHguQXRyaWJ1dG8gPT0gXCJJTVBGSUpPXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHViaUltcEZpam8gJiYgdWJpSW1wRmlqby5WYWxvciAhPSBcIlwiKXtcclxuICAgICAgICAgICAgICAgICAgICBvTTNQcmRHZW5lcmFsLkNUQkxESU1QUFJEID0gdWJpSW1wRmlqby5WYWxvcjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgcFRvdGFsQmFzZSA9IHRoaXMuQ2FsY3VsYXRlUHJlY2lvQmFzZShvTTNQcmRHZW5lcmFsLkNUQkxESU1QUFJELCB0aGlzLm9NYXRoVEYucm91bmQoYmlnRGVjaW1hbC5tdWx0aXBseShvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsLCBvTTNQSXRlbXNXRUIuZENhbnRpZGFkKSwgMikpO1xyXG4gICAgICAgICAgICBpZiAob00zUEl0ZW1zV0VCLmRDYW50aWRhZCAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgICBkUFJFQ0lPVW5pdEJhc2UgPSBwVG90YWxCYXNlIC8gb00zUEl0ZW1zV0VCLmRDYW50aWRhZDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGRQUkVDSU9Vbml0QmFzZSA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGRUb3RhbEltcHVlc3Rvc1RvdGFsID0gdGhpcy5Mb2FkTTNQSW1wdWVzdG9zRnJvbVByZEdybChvTTNQcmRHZW5lcmFsLkNUQkxESU1QUFJELCBvTTNQRW5jSXRlbXMsIHBUb3RhbEJhc2UsIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQsIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwpO1xyXG4gICAgICAgICAgICAvKiogSU5JQ0lPIElORk9STUFDSU9OIEdFTkVSQUwgKi9cclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShtb21lbnQobmV3IERhdGUoKSkuZm9ybWF0KCdZWVlZLU1NLUREVEhIOm1tOnNzJyksIFwiRkVDSEFJTlwiKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1ByZEdlbmVyYWwuQ1RCTERQUkQsIFwiQ1RCTERQUkRcIikpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQSXRlbXNXRUIuQmlzT2JzZXF1aW8udG9TdHJpbmcoKSwgXCJFU09CU0VRVUlPXCIpKTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQcmRHZW5lcmFsLlNLUDEsIFwiUFJEX0VTVElMT1wiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUHJkR2VuZXJhbC5DVEJMRElNUFBSRCwgXCJDVEJMRElNUFBSRFwiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUEl0ZW1zV0VCLm9ic2VydmFjaW9uLnRvU3RyaW5nKCksIFwiT0JTRVJWQUNJT05cIikpOyAgICAgICAgICAgICAgICAgIC8vLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgICAgICBpZiAob00zUEl0ZW1zV0VCLlBhdGhJbWFnZW4pIHtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUEl0ZW1zV0VCLlBhdGhJbWFnZW4sIFwiUEFUSElNQUdFTlwiKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQSXRlbXNXRUIuQmlzUHJvZHVjdG9Qcm9tby50b1N0cmluZygpLCBcIkVTUFJPRFBST01PXCIpKTsgLy8gVFJVRS0+IFNJIEVTIFVOIFBST0RVQ1RPIFBPUiBQUk9NT0NJT04sIEZBTFNFLT4gREUgT1RSTyBNT0RPXHJcbiAgICAgICAgICAgIC8vRGV0YWxsZXMgZGUgZmFjdHVyYSBlbGVjdHJvbmljYVxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKHByb2RHUlBTZWxlY3RlZC5USVBPLCBcIlRJUE9fUFJEXCIpKTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQSXRlbXNXRUIuVW5pZGFkLCBcIlVOSURBRFwiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUEl0ZW1zV0VCLkNsYXZlUHJkU1JWLCBcIkNMQVZFUFJPRFNFUlZcIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1BJdGVtc1dFQi5DbGF2ZVByZFVuaWRhZCwgXCJDTEFWRVVOSURBRFwiKSk7XHJcbiAgICAgICAgICAgIHRoaXMuQWRkSXRlbXNJbnRlcmZheihvTTNQRW5jSXRlbXMsIHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICB0aGlzLkFkaWNpb25hbGVzVG9EZXRhbGxlcyhvTTNQRW5jSXRlbXMsIHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkQWRpY2lvbmFsZXMpXHJcbiAgICAgICAgICAgIHRoaXMuY2FtcG9zQWRpY2lvbmFsZXNUb0RldGFsbGVzKG9NM1BFbmNJdGVtcywgb00zUEl0ZW1zV0VCKVxyXG4gICAgICAgICAgICB0aGlzLkxvYWREZXRhbGxlTml2ZWxlc1ByZWNpbyhpbmZOaXZlbGVzUHJjaW8sIG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgIHRoaXMuQWRkSW5mb1Byb21vY2lvbmVzQURldGFsbGUob1Byb21vY2lvblByb2Nlc2FkYSwgb00zUEVuY0l0ZW1zLCBvTTNQSXRlbXNXRUIuZENhbnRpZGFkKTsgLy8gTGlzdGEgZGUgUHJvbW9jaW9uZXMgXHJcbiAgICAgICAgICAgIC8qKkZJTiBJTkZPUk1BQ0lPTiBHRU5FUkFMICovXHJcblxyXG4gICAgICAgICAgICAvLyoqIElOSUNJTyBWQUxPUkVTIFVOSVRBUklPUyAqL1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRQUkVDSU9Vbml0QmFzZS50b1N0cmluZygpLCBcIlBSRUNJT1VOSVRCQVNFXCIpKTsgLy9QcmVjaW8gU2luIGltcHVlc3Rvc1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRUb3RhbEltcHVlc3Rvc1RvdGFsLnRvU3RyaW5nKCksIFwiVE9UQUxJTVBVRVNUT1NcIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKCh0aGlzLm9NYXRoVEYucm91bmQodGhpcy5HZXRVbml0YXJpb0J5VG90YWwob00zUEl0ZW1zV0VCLmRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlRPVEFMSU1QVUVTVE9TXCIpLCAyKSkudG9TdHJpbmcoKSwgXCJUT1RBTElNUFVOSVRcIikpO1xyXG4gICAgICAgICAgICAvL29NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoKCtvTTNQcmRHZW5lcmFsLkxvTTNQcmRMaXN0YS5QUkVDSU8gLSArZFRvdGFsSW1wdWVzdG9zVW5pdGFyaW8pLnRvU3RyaW5nKCksIFwiUFVOSVRTSU5JTVBVRVNUT1wiKSk7Ly9TaW4gZGVzY3VlbnRvIGluY2x1aWRvIFkgc2luIEltcHVlc3RvcyAvLy0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSgoK2RQUkVDSU9Vbml0QmFzZSArICtkVW5pdGFyaW9Qcm9tbykudG9TdHJpbmcoKSwgXCJQVU5JVFNJTklNUFVFU1RPXCIpKTsvL1NpbiBkZXNjdWVudG8gaW5jbHVpZG8gWSBzaW4gSW1wdWVzdG9zIC8vLS0tLS0tIE51bmNhIENhbWJpYSAvL0ZTIDIwMTkwNzI1IENvcnJlY2Npb24gZW4gbGEgZm9tcmEgZGUgY2FsY3VsYXJsb1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1ByZEdlbmVyYWwuTG9NM1ByZExpc3RhLlBSRUNJTy50b1N0cmluZygpLCBcIlBVTklUXCIpKTsvL1NpbiBkZXNjdWVudG8gaW5jbHVpZG8gIC0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsLnRvU3RyaW5nKCksIFwiUFVOSVRORVRPXCIpKTsvL0NvbiBkZXNjdWVudG8gaW5jbHVpZG8tLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZFVuaXRhcmlvTW9uZWRlcm8udG9TdHJpbmcoKSwgXCJVTklURklERUxcIikpOy8vVW5pdGFyaW8gZmlkZWxpemFjaW9uIC0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkVW5pdGFyaW9Qcm9tby50b1N0cmluZygpLCBcIlZVTklUUFJPTU9cIikpOy8vVW5pdGFyaW8gUHJvbW9jaW9uIC0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgaWYgKHRoaXMuZ3NJZGthdGlvcyA9PSBcIkNUTlwiKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbGlzdGFTUiA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zTGlzdGFQcmVjaW8uZmluZCh4ID0+IHguSURMSVNUQSA9PSBcIjJcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAobGlzdGFTUikge1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUocHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNMaXN0YVByZWNpby5maW5kKHggPT4geC5JRExJU1RBID09IFwiMlwiKS5QUkVDSU8udG9TdHJpbmcoKSwgXCJQUkVDSU9TUlwiKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8qKiBGSU4gVkFMT1JFUyBVTklUQVJJT1MgKi9cclxuXHJcbiAgICAgICAgICAgIC8vICoqKiBJbmZvcm1hY2lvbiBkZSBhY2Npb25lcyBlbiBlbCBjbGllbnRlICoqKlxyXG4gICAgICAgICAgICBpZiAocHJvZEdSUFNlbGVjdGVkLmVuY29udHJhZG9Mb2NhbCkge1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIkxPQ0FMXCIsIFwiQ09OU1VMVE9FTlwiKSk7Ly9Vbml0YXJpbyBQcm9tb2Npb24gLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIlNFUlZJRE9SXCIsIFwiQ09OU1VMVE9FTlwiKSk7Ly9Vbml0YXJpbyBQcm9tb2Npb24gLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgdGhpcy5WYWxvcmVzQ2FsY3VsYWRvc1Byb2Nlc28ob00zUEVuY0l0ZW1zLCBvTTNQSXRlbXNXRUIuZENhbnRpZGFkKTtcclxuXHJcbiAgICAgICAgICAgIC8vaWYgKCFvUGFkcmVNM1BFbmNJdGVtcykge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5WYWxvciA9ICgrb00zUHJvY2Vzb3MuVmFsb3IpICsgKCtvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiU1VCVE9UQUxcIikuVmFsb3IpIC8vICgrb00zUEl0ZW1zV0VCLmRQcmVjaW9Ub3RhbCk7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlZhbG9yTmV0byA9ICgrb00zUHJvY2Vzb3MuVmFsb3JOZXRvKSArICgrb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yKTtcclxuICAgICAgICAgICAgLy99XHJcblxyXG4gICAgICAgICAgICAvL1ZlcmlmaWNhciBvYnNlcXVpb3MgZGVsIHByb2R1Y3RvIHF1ZSBzZSBpbmdyZXNvIGFsIGNhcnJpdG8gZGUgY29tcHJhc1xyXG4gICAgICAgICAgICB0aGlzLlZlcmlmaWNhck9ic2VxdWlvcyhvUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNQSXRlbXNXRUIuZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICB0aGlzLnR1cm5PblByb21vcyhvUHJvbW9jaW9uUHJvY2VzYWRhKVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zW1wiTWVuc2FqZUVycm9yXCJdID0gXCJQcm9kdWN0byBSZXN0cmluZ2lkb1wiO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG9NM1BFbmNJdGVtcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgdHJ1ZSBzaSBlc3RlIHByb2R1Y3RvIHNlIGVuY3VlbnRyYSByZXN0cmluZ2lkb1xyXG4gICAgICogQHBhcmFtIG9Qcm9tb2Npb25Qcm9jZXNhZGEgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB2YWxpZGFyUHJvZHVjdG9SZXN0cmluZ2lkbyhvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAob1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMpIHtcclxuICAgICAgICAgICAgbGV0IHByb21vUmVzdHJpbmdpZG8gPSBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcy5maW5kKHggPT4geC5UaXBvID09IFwiUkVTVFJJQ0NJT05cIik7XHJcbiAgICAgICAgICAgIGlmIChwcm9tb1Jlc3RyaW5naWRvKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgXHJcblxyXG4gICAgIC8qKlxyXG4gICAgICogRXhjbHV5ZSB0b2RvcyBsb3MgaW1wdWVzdG9zIGRlamFuZG8gc29sbyBlbCBGSUpPIHNpIGVzIGRlIGxhIHViaWNhY2lvbiBkYWRhIFxyXG4gICAgICovXHJcbiAgICAgcHVibGljIEdldE1heEF0cmlidXRvRnJvbUxpc3RhKGxpc3RhLCBhdHJpYnV0bykge1xyXG4gICAgICAgIGlmIChsaXN0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGxldCBsaXN0SUQgPSBsaXN0YS5tYXAoeCA9PiB4W2F0cmlidXRvXSk7XHJcbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1heC5hcHBseShNYXRoLCBsaXN0SUQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxvcmVzIENhbGN1bGFkb3MgcG9yIHByb2Nlc28uXHJcbiAgICAgKiBAcGFyYW0gb00zUEVuY0l0ZW1zIFxyXG4gICAgICogQHBhcmFtIGRDYW50aWRhZCBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZhbG9yZXNDYWxjdWxhZG9zUHJvY2VzbyhvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBkQ2FudGlkYWQ6IG51bWJlcikge1xyXG4gICAgICAgIC8qKiBJTklDSU8gVkFMT1JFUyBESU5BTUlDT1MgKi9cclxuICAgICAgICAvLyB2YXIgZFRvdGFsSW1wdWVzdG9zID0gKCt0aGlzLkdldFRvdGFsQnlVbml0YXJpbyhkQ2FudGlkYWQsIG9NM1BFbmNJdGVtcywgXCJUT1RBTElNUFVOSVRcIikpO1xyXG4gICAgICAgIC8vIHZhciBkUHJlY2lvVG90YWxTaW5EdG8gPSB0aGlzLkdldFRvdGFsQnlVbml0YXJpbyhkQ2FudGlkYWQsIG9NM1BFbmNJdGVtcywgXCJQVU5JVFwiKVxyXG4gICAgICAgIC8vIHZhciBkU3ViVG90YWwgPSBNYXRoLnJvdW5kKCgrZFByZWNpb1RvdGFsU2luRHRvIC0gK2RUb3RhbEltcHVlc3RvcykgKiAxMDApIC8gMTAwO1xyXG5cclxuICAgICAgICBsZXQgc3ViVG90YWwgPSAwO1xyXG4gICAgICAgIGxldCBwcmVjaW9Ub3RhbFNpbkR0byA9IDA7XHJcbiAgICAgICAgbGV0IHRvdGFsSW1wdWVzdG9zXHJcbiAgICAgICAgLy9BZ3JlZ2FyIEltcHVlc3Rvc1xyXG4gICAgICAgIHRvdGFsSW1wdWVzdG9zID0gdGhpcy5hZ3JlZ2FySW1wdWVzdG8ob00zUEVuY0l0ZW1zLCBkQ2FudGlkYWQpO1xyXG5cclxuICAgICAgICAvL0ZTIDIwMTkwNzI1IEFycmVnbG8gZW4gZWwgY2FsY3VsbyBkZSB0b3RhbGVzIGVuIGNhc28gZGUgaGFiZXIgaW1wdWVzdG9zXHJcbiAgICAgICAgaWYgKG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3MubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAvL1N1YnRvdGFsIFN1bWFzIGRlIGxhcyBiYXNlc1xyXG4gICAgICAgICAgICBzdWJUb3RhbCA9IHRoaXMub01hdGhURi5yb3VuZCgoKHRoaXMub01hdGhURi5yb3VuZCgrdGhpcy5HZXRUb3RhbEJ5VW5pdGFyaW8oZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiUFJFQ0lPVU5JVEJBU0VcIiksIDIpKSArICgrdGhpcy5HZXRUb3RhbEJ5VW5pdGFyaW8oZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiVlVOSVRQUk9NT1wiKSkpLCAyKTtcclxuICAgICAgICAgICAgdG90YWxJbXB1ZXN0b3MgPSB0aGlzLmdldFZhbG9yVG90YWxGcm9tSW1wdWVzdG9zKG9NM1BFbmNJdGVtcywgXCJWYWxvclwiKTtcclxuICAgICAgICAgICAgcHJlY2lvVG90YWxTaW5EdG8gPSBzdWJUb3RhbCArIHRvdGFsSW1wdWVzdG9zO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy9TZSBhc3VtZSBxdWUgbm8gaGF5IGltcHVlc3RvcyBlbnRvbmNlcyBlbCBzdWJUb3RhbCBlcyBpZ3VhbCBhbCBwcmVjaW9Ub3RhbFNpbkR0b1xyXG4gICAgICAgICAgICBwcmVjaW9Ub3RhbFNpbkR0byA9IHRoaXMub01hdGhURi5yb3VuZCh0aGlzLkdldFRvdGFsQnlVbml0YXJpbyhkQ2FudGlkYWQsIG9NM1BFbmNJdGVtcywgXCJQVU5JVFwiKSwgMik7XHJcbiAgICAgICAgICAgIHN1YlRvdGFsID0gcHJlY2lvVG90YWxTaW5EdG87XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsIGRDYW50aWRhZC50b1N0cmluZygpLCBcIkNBTlRJREFEXCIpO1xyXG4gICAgICAgIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsICh0aGlzLm9NYXRoVEYucm91bmQodG90YWxJbXB1ZXN0b3MsIDIpKS50b1N0cmluZygpLCBcIlRPVEFMSU1QVUVTVE9TXCIpO1xyXG4gICAgICAgIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsICh0aGlzLm9NYXRoVEYucm91bmQoK3RoaXMuR2V0VW5pdGFyaW9CeVRvdGFsKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlRPVEFMSU1QVUVTVE9TXCIpLCAyKSkudG9TdHJpbmcoKSwgXCJUT1RBTElNUFVOSVRcIik7XHJcblxyXG4gICAgICAgIC8vTGEgZmlkZWxpemFjaW9uIGVzIHVuIHBvcmNhbnRhamUgcG9yIGVuZGUgbm8gZGViZSBtdWx0aXBsaWNhcnNlIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsIHRoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlVOSVRGSURFTFwiKS50b1N0cmluZygpLCBcIkZJREVMSVpBQ0lPTlwiKTtcclxuICAgICAgICB0aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCBvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVU5JVEZJREVMXCIpLlZhbG9yLCBcIkZJREVMSVpBQ0lPTlwiKTtcclxuICAgICAgICAvL3RoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsICh0aGlzLm9NYXRoVEYucm91bmQoK3RoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlBVTklUTkVUT1wiKSwgMikpLnRvU3RyaW5nKCksIFwiUFJFQ0lPVE9UQUxcIik7XHJcbiAgICAgICAgLy90aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCAoK3RoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlBVTklUTkVUT1wiKSkudG9TdHJpbmcoKSwgXCJQUkVDSU9UT1RBTFJFQUxcIik7XHJcbiAgICAgICAgdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgcHJlY2lvVG90YWxTaW5EdG8udG9TdHJpbmcoKSwgXCJQUkVDSU9UT1RBTFNJTkRUT1wiKTtcclxuICAgICAgICB0aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCBzdWJUb3RhbC50b1N0cmluZygpLCBcIlNVQlRPVEFMXCIpO1xyXG4gICAgICAgIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsIG1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVktTU0tREQnKSwgXCJGVVRcIik7XHJcbiAgICAgICAgdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgKHRoaXMub01hdGhURi5yb3VuZCgrdGhpcy5HZXRUb3RhbEJ5VW5pdGFyaW8oZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiVlVOSVRQUk9NT1wiKSwgMikpLnRvU3RyaW5nKCksIFwiVE9UQUxQUk9NT1wiKTtcclxuICAgICAgICB0aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCAodGhpcy5vTWF0aFRGLnJvdW5kKCt0aGlzLkdldFRvdGFsQnlVbml0YXJpbyhkQ2FudGlkYWQsIG9NM1BFbmNJdGVtcywgXCJQUkVDSU9VTklUQkFTRVwiKSwgMikpLnRvU3RyaW5nKCksIFwiUFJFQ0lPVE9UQUxCQVNFXCIpOyAvL1ByZWNpbyBTaW4gaW1wdWVzdG9zICAgICAgICBcclxuICAgICAgICB0aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCAodGhpcy5vTWF0aFRGLnJvdW5kKChzdWJUb3RhbCArICtvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVE9UQUxJTVBVRVNUT1NcIikuVmFsb3IgLSArb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlRPVEFMUFJPTU9cIikuVmFsb3IpLCAyKSkudG9TdHJpbmcoKSwgXCJQUkVDSU9UT1RBTFwiKTtcclxuXHJcbiAgICAgICAgLyoqIEZJTiBWQUxPUkVTIERJTkFNSUNPUyAqL1xyXG5cclxuICAgICAgICBpZiAob00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvcy5sZW5ndGggPiAwICYmIGRDYW50aWRhZCA9PSAwKSB7Ly9TaSBsYSBjYW50aWRhZCBlcyAwIHNpZ25pZmljYSBxdWUgc2UgZXN0w6EgYm9ycmFuZG8gZWwgaXRlbSBvIGVzIHVuIG9ic2VxdWlvLCBwb3IgbG8gcXVlIG5vIHRpZW5lIHNlbnRpZG8gcXVlIHRlbmdhIE0zUEltcHVlc3RvXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3MgPSBbXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGxhIHN1bWF0b3JpYSBkZSBsb3MgdmFsb3JlcyBkZSB1biBhdHJpYnV0byBkYWRvIGRlbCBhcnJlZ2xvIGRlIGltcHVlc3Rvc1xyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBcclxuICAgICAqIEBwYXJhbSBhdHJpYnV0byBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFZhbG9yVG90YWxGcm9tSW1wdWVzdG9zKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGF0cmlidXRvOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgICAgIGxldCBzdW1hdG9yaWEgPSAwO1xyXG4gICAgICAgIGZvciAobGV0IF9pID0gMDsgX2kgPCBvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICBjb25zdCBpbXB1ZXN0byA9IG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3NbX2ldO1xyXG4gICAgICAgICAgICBzdW1hdG9yaWEgPSBzdW1hdG9yaWEgKyAoK2ltcHVlc3RvW2F0cmlidXRvXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLm9NYXRoVEYucm91bmQoc3VtYXRvcmlhLDIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYWdyZWdhckltcHVlc3RvKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGNhbnRpZGFkOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgZGV0X2N0YmxkX2ltcF9wcmQgPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ1RCTERJTVBQUkRcIik7XHJcbiAgICAgICAgbGV0IGRldF9wcmVjaW9fdW5pdF9iYXNlID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1VOSVRCQVNFXCIpO1xyXG4gICAgICAgIGxldCB2YWxvclRvdGFsSW1wdWVzdG9zOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIGlmIChkZXRfY3RibGRfaW1wX3ByZCAmJiBkZXRfcHJlY2lvX3VuaXRfYmFzZSkge1xyXG4gICAgICAgICAgICB2YWxvclRvdGFsSW1wdWVzdG9zID0gdGhpcy5Mb2FkTTNQSW1wdWVzdG9zRnJvbVByZEdybChkZXRfY3RibGRfaW1wX3ByZC5WYWxvciwgb00zUEVuY0l0ZW1zLCArYmlnRGVjaW1hbC5tdWx0aXBseShkZXRfcHJlY2lvX3VuaXRfYmFzZS5WYWxvciwgY2FudGlkYWQpLCBjYW50aWRhZCwgK29NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5vTWF0aFRGLnJvdW5kKHZhbG9yVG90YWxJbXB1ZXN0b3MsMik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBJbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIHZhbG9yOiBzdHJpbmcsIHNDb25jZXB0bzogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIG9EZXQ6IE0zUERldGFsbGVJdGVtcztcclxuICAgICAgICBvRGV0ID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBzQ29uY2VwdG8pO1xyXG4gICAgICAgIGlmIChvRGV0KSB7XHJcbiAgICAgICAgICAgIC8vIEV4aXN0ZSBBY3R1YWxpemFcclxuICAgICAgICAgICAgb0RldC5WYWxvciA9IHZhbG9yO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vTm8gZXhpc3RlIGFncmVnYVxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKHZhbG9yLnRvU3RyaW5nKCksIHNDb25jZXB0bykpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgdmFsb3IgdG90YWxcclxuICAgICAqIEBwYXJhbSBjYW50aWRhZCBOdWV2YSBDYW50aWRhZCBcclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgXHJcbiAgICAgKiBAcGFyYW0gRGVzY1VuaXRhcmlvIFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIEdldFRvdGFsQnlVbml0YXJpbyhjYW50aWRhZDogbnVtYmVyLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBEZXNjVW5pdGFyaW86IHN0cmluZykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciB1bml0YXJpbyA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gRGVzY1VuaXRhcmlvKS5WYWxvcjtcclxuICAgICAgICAgICAgcmV0dXJuICtiaWdEZWNpbWFsLm11bHRpcGx5KHVuaXRhcmlvLCBjYW50aWRhZCk7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgdmFsb3IgdW5pdGFyaW9cclxuICAgICAqIEBwYXJhbSBjYW50aWRhZCBcclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgXHJcbiAgICAgKiBAcGFyYW0gRGVzY1RvdGFsIFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIEdldFVuaXRhcmlvQnlUb3RhbChjYW50aWRhZDogbnVtYmVyLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBEZXNjVG90YWw6IHN0cmluZykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmICgrY2FudGlkYWQgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIHRvdGFsID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBEZXNjVG90YWwpLlZhbG9yO1xyXG4gICAgICAgICAgICByZXR1cm4gK3RvdGFsIC8gK2NhbnRpZGFkO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgZGV0YWxsZXMgcmVsYWNpb25hZG9zIGNvbiBsYSBpbmZvcm1hY2lvbiBkZSBzdyBleHRlcm5vLlxyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBPYmpldG8gZG9uZGUgc2UgZ3VhcmRhcsOhIGxvcyBudWV2b3MgYXRyaWJ1dG9zLlxyXG4gICAgICogQHBhcmFtIG9BZGljaW9uYWxlcyBEZXNkZSBkb25kZSBzZSBzYWNhcsOhIGxhIGluZm9ybWFjacOzbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIEFkZEl0ZW1zSW50ZXJmYXoob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgb0FkaWNpb25hbGVzOiBBcnJheTxNM1ByZEFkaWNpb25hbGVzPikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBvQWRpY2lvbmFsZXNGaWx0ZXI6IEFycmF5PE0zUHJkQWRpY2lvbmFsZXM+O1xyXG4gICAgICAgICAgICBvQWRpY2lvbmFsZXNGaWx0ZXIgPSBvQWRpY2lvbmFsZXMuZmlsdGVyKGEgPT4gYS5BVFJJQlVUTy5zdGFydHNXaXRoKFwiQ1NJQV9cIikpO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9BZGljaW9uYWxlc0ZpbHRlci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvQWRpY2lvbmFsZXNGaWx0ZXJbaV0uVkFMT1IsIG9BZGljaW9uYWxlc0ZpbHRlcltpXS5BVFJJQlVUTykpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkaWNpb25hciBkZXRhbGxlcyBcclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgT2JqZXRvIGRvbmRlIHNlIGd1YXJkYXLDoSBsb3MgbnVldm9zIGF0cmlidXRvcy5cclxuICAgICAqIEBwYXJhbSBvQWRpY2lvbmFsZXMgRGVzZGUgZG9uZGUgc2Ugc2FjYXLDoSBsYSBpbmZvcm1hY2nDs24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGljaW9uYWxlc1RvRGV0YWxsZXMob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgb0FkaWNpb25hbGVzOiBBcnJheTxNM1ByZEFkaWNpb25hbGVzPikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb0FkaWNpb25hbGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9BZGljaW9uYWxlc1tpXS5WQUxPUiwgXCJBRENfXCIgKyBvQWRpY2lvbmFsZXNbaV0uQVRSSUJVVE8pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjYW1wb3NBZGljaW9uYWxlc1RvRGV0YWxsZXMob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb00zUEl0ZW1zV0VCLkNhbXBvc0FkaWNpb25hbGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1BJdGVtc1dFQi5DYW1wb3NBZGljaW9uYWxlc1tpXS5WQUxPUiwgXCJDQU1BRENfXCIgKyBvTTNQSXRlbXNXRUIuQ2FtcG9zQWRpY2lvbmFsZXNbaV0uQVRSSUJVVE8pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZ3JlZ2FyIGluZm9ybWFjaW9uIGRlIHByb21vY2lvbmVzIE5vbWJyZSwgSUQuIGEgZGV0YWxsZSBkZWwgZW5jYWJlemFkbyBkZSBwcm9kdWN0byBhZ3JlZ2Fkb1xyXG4gICAgICogQHBhcmFtIG9Qcm9tb2Npb25Qcm9jZXNhZGEgSW5mb3JtYWNpb24gZGUgcHJvbW9jaW9uZXMgcHJvY2VzYWRhc1xyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBFbmNhYmV6YWRvIGRlIGl0ZW1zXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZW5lcmFySW5mb1Byb21vY2lvbmVzUHJvY2VzYWRhcyhvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIGlDYW50aWRhZDogbnVtYmVyLCBhcGxpY2FkYXMgPSB0cnVlKSB7XHJcbiAgICAgICAgdmFyIHNOb21icmVzOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIHZhciBzSWRzOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIHZhciBzVmFsb3Jlczogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICB2YXIgZGF0YTtcclxuICAgICAgICBpZiAob1Byb21vY2lvblByb2Nlc2FkYSAmJiBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyAmJiBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGlmIChhcGxpY2FkYXMpIHtcclxuICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzLmZpbHRlcih4ID0+IHguQXBsaWNhZGEpLmZpbHRlcih4ID0+IHguUHJvbW9jaW9uQ29tYmluYWRhID09IG51bGwpLmZvckVhY2gocHJvbW8gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNOb21icmVzID0gc05vbWJyZXMgKyBwcm9tby5Ob21icmUgKyBcIixcIjtcclxuICAgICAgICAgICAgICAgICAgICBzSWRzID0gc0lkcyArIHByb21vLklEUHJvbW9jaW9uICsgXCIsXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgc1ZhbG9yZXMgPSBzVmFsb3JlcyArIGJpZ0RlY2ltYWwubXVsdGlwbHkocHJvbW8uVmFsb3IsIGlDYW50aWRhZCkgKyBcIixcIjtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMuZmlsdGVyKHggPT4gIXguQXBsaWNhZGEpLmZpbHRlcih4ID0+IHguUHJvbW9jaW9uQ29tYmluYWRhID09IG51bGwpLmZvckVhY2gocHJvbW8gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNOb21icmVzID0gc05vbWJyZXMgKyBwcm9tby5Ob21icmUgKyBcIixcIjtcclxuICAgICAgICAgICAgICAgICAgICBzSWRzID0gc0lkcyArIHByb21vLklEUHJvbW9jaW9uICsgXCIsXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgc1ZhbG9yZXMgPSBzVmFsb3JlcyArIGJpZ0RlY2ltYWwubXVsdGlwbHkocHJvbW8uVmFsb3IsIGlDYW50aWRhZCkgKyBcIixcIjtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGRhdGEgPSB7IFwiTk9NQlJFU1wiOiBzTm9tYnJlcywgXCJJRFwiOiBzSWRzLCBcIlZBTE9SRVNcIjogc1ZhbG9yZXMgfVxyXG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkaWNpb25hciBkZXRhbGxlIGRlIHByb21vY2lvbmVzXHJcbiAgICAgKiBAcGFyYW0gb00zUEVuY0l0ZW1zIFxyXG4gICAgICogQHBhcmFtIHNOb21icmVzIFxyXG4gICAgICogQHBhcmFtIHNJZHMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGRJbmZvUHJvbW9jaW9uZXNBRGV0YWxsZShvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGlDYW50aWRhZDogbnVtYmVyKSB7XHJcbiAgICAgICAgdmFyIGRhdGEgPSB0aGlzLkdlbmVyYXJJbmZvUHJvbW9jaW9uZXNQcm9jZXNhZGFzKG9Qcm9tb2Npb25Qcm9jZXNhZGEsIGlDYW50aWRhZClcclxuICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRhdGEuTk9NQlJFUywgXCJOT01CX1BST01PQ1wiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZGF0YS5JRCwgXCJJRF9QUk9NT0NcIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRhdGEuVkFMT1JFUywgXCJWQUxfUFJPTU9DXCIpKTtcclxuXHJcbiAgICAgICAgICAgIC8vQWhvcmEgc2UgYWdyZWdhIHVuYSBkaW5hbWljYSBwb3IgYXRyaWJ1dG8gZGUgbGEgcHJvbW8gcGFyYSBmYWNpbGl0YXIgbGEgcmV0b21hIGRlIGVzdGEgaW5mb3JtYWNpw7NuXHJcbiAgICAgICAgICAgIGxldCBsaXN0Tm9tYnJlID0gZGF0YS5OT01CUkVTLnJlcGxhY2UoLy4kLywgXCJcIikuc3BsaXQoXCIsXCIpO1xyXG4gICAgICAgICAgICBsZXQgbGlzdElkID0gZGF0YS5JRC5yZXBsYWNlKC8uJC8sIFwiXCIpLnNwbGl0KFwiLFwiKTtcclxuICAgICAgICAgICAgbGV0IGxpc3RWYWxvciA9IGRhdGEuVkFMT1JFUy5yZXBsYWNlKC8uJC8sIFwiXCIpLnNwbGl0KFwiLFwiKTtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IF9pID0gMDsgX2kgPCBsaXN0SWQubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGxpc3ROb21icmVbX2ldLCBcIk5PTUJfUFJPTU9DX1wiICsgX2kpKTtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUobGlzdElkW19pXSwgXCJJRF9QUk9NT0NfXCIgKyBfaSkpO1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShsaXN0VmFsb3JbX2ldLCBcIlZBTF9QUk9NT0NfXCIgKyBfaSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkYXRhID0gdGhpcy5HZW5lcmFySW5mb1Byb21vY2lvbmVzUHJvY2VzYWRhcyhvUHJvbW9jaW9uUHJvY2VzYWRhLCBpQ2FudGlkYWQsIGZhbHNlKVxyXG4gICAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZGF0YS5OT01CUkVTLCBcIk5PTUJfUFJPTU9DX05PUFJPXCIpKTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkYXRhLklELCBcIklEX1BST01PQ19OT1BST1wiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZGF0YS5WQUxPUkVTLCBcIlZBTF9QUk9NT0NfTk9QUk9cIikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYXJnYXIgYSBkZXRhbGxlIGluZm9ybWFjaW9uIGRlIG5pdmVsZXMgZGUgcHJlY2lvXHJcbiAgICAgKiBAcGFyYW0gaW5mTml2ZWxlc1ByY2lvIEluZm9ybWFjaW9uIGRlIG5pdmVsZXMgZGUgcHJlY2lvXHJcbiAgICAgKiBAcGFyYW0gb00zUEVuY0l0ZW1zIE9iamV0byBkb25kZSBzZSBjYXJnYXLDoSBsYSBpbmZvcm1hY2lvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgTG9hZERldGFsbGVOaXZlbGVzUHJlY2lvKGluZk5pdmVsZXNQcmNpbywgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIGlmIChpbmZOaXZlbGVzUHJjaW8gJiYgaW5mTml2ZWxlc1ByY2lvLk5JVkVMICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShpbmZOaXZlbGVzUHJjaW8uTklWRUwsIFwiTklWRUxQUkVDSU9cIikpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZlcmlmaWNhciBjb24gcXVlIG5pdmVsIGRlIHByZWNpbyB2YSBhIHRyYWJhamFyXHJcbiAgICAgKiBAcGFyYW0gcHJvZEdSUFNlbGVjdGVkIEVsIHByb2R1Y3RvIGluZ3Jlc2Fkb1xyXG4gICAgICogQHBhcmFtIGlDYW50aWRhZCBMYSBjYW50aWRhZCBkZSBwcm9kdWN0b3MgcXVlIHZhIGEgaW5ncmVzYXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZlcmlmaWNhclByZWNpb0J5Tml2ZWxlcyhwcm9kR1JQU2VsZWN0ZWQ6IFR5cGVNM1ByZEdycCwgaUNhbnRpZGFkOiBudW1iZXIpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgb00zUHJlc2VudGFjaW9uZXM6IE0zUHJlc2VudGFjaW9uZXM7XHJcbiAgICAgICAgICAgIHZhciBqUmVzcE5pdmVsZXMgPSB7fTtcclxuICAgICAgICAgICAgaWYgKHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuTTNQcmVzZW50YWNpb25lcyAmJlxyXG4gICAgICAgICAgICAgICAgcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5NM1ByZXNlbnRhY2lvbmVzLmxlbmd0aCA+IDApIHtcclxuXHJcbiAgICAgICAgICAgICAgICBvTTNQcmVzZW50YWNpb25lcyA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuTTNQcmVzZW50YWNpb25lcy5maW5kKHggPT4gaUNhbnRpZGFkID49IHguVE9QRSk7XHJcbiAgICAgICAgICAgICAgICBpZiAob00zUHJlc2VudGFjaW9uZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTyA9IG9NM1ByZXNlbnRhY2lvbmVzLlZBTE9SO1xyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwTml2ZWxlcyA9IHsgXCJQUkVDSU9cIjogb00zUHJlc2VudGFjaW9uZXMuVkFMT1IsIFwiTklWRUxcIjogb00zUHJlc2VudGFjaW9uZXMuTklWRUxQUlMgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4galJlc3BOaXZlbGVzO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIFZlcmlmaWNhclByZWNpb0J5Tml2ZWxlc0dlbmVyYWwob00zUHJkR2VuZXJhbDogTTNQcmRHZW5lcmFsLCBpQ2FudGlkYWQ6IG51bWJlcikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBvTTNQcmVzZW50YWNpb25lczogTTNQcmVzZW50YWNpb25lcztcclxuICAgICAgICAgICAgdmFyIGpSZXNwTml2ZWxlcyA9IHt9O1xyXG4gICAgICAgICAgICBpZiAob00zUHJkR2VuZXJhbC5Mb00zUHJkTGlzdGEuTTNQcmVzZW50YWNpb25lcyAmJiBvTTNQcmRHZW5lcmFsLkxvTTNQcmRMaXN0YS5NM1ByZXNlbnRhY2lvbmVzLmxlbmd0aCA+IDApIHtcclxuXHJcbiAgICAgICAgICAgICAgICBvTTNQcmVzZW50YWNpb25lcyA9IG9NM1ByZEdlbmVyYWwuTG9NM1ByZExpc3RhLk0zUHJlc2VudGFjaW9uZXMuZmluZCh4ID0+IGlDYW50aWRhZCA+PSB4LlRPUEUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKG9NM1ByZXNlbnRhY2lvbmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUHJkR2VuZXJhbC5Mb00zUHJkTGlzdGEuUFJFQ0lPID0gb00zUHJlc2VudGFjaW9uZXMuVkFMT1I7XHJcbiAgICAgICAgICAgICAgICAgICAgalJlc3BOaXZlbGVzID0geyBcIlBSRUNJT1wiOiBvTTNQcmVzZW50YWNpb25lcy5WQUxPUiwgXCJOSVZFTFwiOiBvTTNQcmVzZW50YWNpb25lcy5OSVZFTFBSUyB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBqUmVzcE5pdmVsZXM7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgbG9zIGN1cG9uZXMgZ2VuZXJhZG9zIGRlIGxhIGxpc3RhIGRlIHByb21vcHJvY2VzYWRhc1xyXG4gICAgICogQHBhcmFtIG9Qcm9tb2Npb25Qcm9jZXNhZGEgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRfbGlzdF9jdXBvbmVzX2Zyb21fcHJvbW8ob1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhLCBjYW50aWRhZDogbnVtYmVyKTogQXJyYXk8TTNQRGV0YWxsZUN1cG9uPiB7XHJcbiAgICAgICAgdmFyIGxpc3RfY3Vwb25lcyA9IEFycmF5PE0zUERldGFsbGVDdXBvbj4oKTtcclxuXHJcbiAgICAgICAgaWYgKG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IF9pID0gMDsgX2kgPCBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBwcm9tb19hc29jaWFkYSA9IG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzW19pXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocHJvbW9fYXNvY2lhZGEuSWRDdXBvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjdXBvbiA9IG5ldyBNM1BEZXRhbGxlQ3Vwb24oKTtcclxuICAgICAgICAgICAgICAgICAgICBjdXBvbi5JZEN1cG9uID0gcHJvbW9fYXNvY2lhZGEuSWRDdXBvbjtcclxuICAgICAgICAgICAgICAgICAgICBjdXBvbi5DYW50aWRhZCA9IGNhbnRpZGFkO1xyXG4gICAgICAgICAgICAgICAgICAgIGxpc3RfY3Vwb25lcy5wdXNoKGN1cG9uKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGxpc3RfY3Vwb25lcztcclxuICAgIH1cclxuXHJcbiAgICAvL0FzaWduYXIgYSBwcm9tb2Npb25lcyBjb21iaWFuYXMgZGVzZGUgbG8gcXVlIHNlIGVuY29udHLDsyBhbCBlbmNhYmV6YWRvIGl0ZW0sIGRlbCBwcm9kdWN0byBzZWxlY2Npb25hZG9cclxuICAgIHB1YmxpYyBBc2lnbmFyUHJvbW9jaW9uZXNDb21iaW5hZGFzKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICBpZiAob1Byb21vY2lvblByb2Nlc2FkYSAhPSBudWxsICYmIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzICE9IG51bGwpIHtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMuZm9yRWFjaChwcm9tb0FzbyA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvbW9Bc28uUHJvbW9jaW9uQ29tYmluYWRhICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL1NlIGFncmVnYSBwcm9tb2Npb24gY29tYmluYWRhIGEgZW5jYWJlemFkbyBkZSBpdGVtcy5cclxuICAgICAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuUHJvbW9Db21iaW5hZGFzLnB1c2gocHJvbW9Bc28uUHJvbW9jaW9uQ29tYmluYWRhKTtcclxuICAgICAgICAgICAgICAgICAgICAvLy9BZ3JlZ2FyIHByb21vY2lvbmVzIGNvbWJpbmFkYXNcclxuICAgICAgICAgICAgICAgICAgICB2YXIgb00zUERldGFsbGVJdGVtczogTTNQRGV0YWxsZUl0ZW1zO1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMgPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJQUk9NT0NPTUJJXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9NM1BEZXRhbGxlSXRlbXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcy5WYWxvciA9IEpTT04uc3RyaW5naWZ5KG9NM1BFbmNJdGVtcy5Qcm9tb0NvbWJpbmFkYXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShKU09OLnN0cmluZ2lmeShvTTNQRW5jSXRlbXMuUHJvbW9Db21iaW5hZGFzKSwgXCJQUk9NT0NPTUJJXCIpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5Bc2lnbmFyUHJvbW9jaW9uZXNDb21iaW5hZGFzQU0zUHJvY2VzbyhvTTNQcm9jZXNvcywgcHJvbW9Bc28uUHJvbW9jaW9uQ29tYmluYWRhKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXNpZ25hciBwcm9tb2Npb25lcyBjb21iaWFuZGFzIGEgTTMgUHJvY2VzbywgZXN0ZSwgdmFsaWRhIHF1ZSBubyBleGlzdGEgdW4gcHJvbW9jaW9uIGFudGVyaW9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQXNpZ25hclByb21vY2lvbmVzQ29tYmluYWRhc0FNM1Byb2Nlc28ob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9Qcm9tb2Npb25Db21iaW5hZGE6IFByb21vY2lvbkNvbWJpbmFkYSkge1xyXG4gICAgICAgIGlmICghb00zUHJvY2Vzb3MuUHJvbW9zQ29tYmluYWRhcykge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5Qcm9tb3NDb21iaW5hZGFzID0gbmV3IEFycmF5PFByb21vY2lvbkNvbWJpbmFkYT4oKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zLlByb21vc0NvbWJpbmFkYXMuZmluZCh4ID0+IHguSWRQcm9tb2Npb25Db21iaW5hZGEgPT0gb1Byb21vY2lvbkNvbWJpbmFkYS5JZFByb21vY2lvbkNvbWJpbmFkYSkpIHtcclxuICAgICAgICAgICAgLy8vLy8vLyBleGlzdGVcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLy8vLy8gTm8gRXhpc3RlXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlByb21vc0NvbWJpbmFkYXMucHVzaChvUHJvbW9jaW9uQ29tYmluYWRhKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zLlByb21vc0NvbWJpbmFkYXMpIHtcclxuICAgICAgICAgICAgdGhpcy5BZGREaW5hbWljYVByb2Nlc29Db21iaW5hZGFzKG9NM1Byb2Nlc29zKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRpY2lvbmFyIGEgZGluYW1pY2FzIHByb2Nlc28gZGUgY29tYmluYWRhc1xyXG4gICAgICogQHBhcmFtIGlvTTNQcm9jZXNvIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWRkRGluYW1pY2FQcm9jZXNvQ29tYmluYWRhcyhpb00zUHJvY2VzbzogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIHZhciBvTTNQRGluYW1pY2FzRmluZGVkOiBNM1BEaW5hbWljYXM7XHJcbiAgICAgICAgb00zUERpbmFtaWNhc0ZpbmRlZCA9IGlvTTNQcm9jZXNvLmxNM1BEaW5hbWljYXMuZmluZCh4ID0+IHguTm9tYnJlID09IFwiQ09NQklOQURBXCIpO1xyXG4gICAgICAgIGlmIChvTTNQRGluYW1pY2FzRmluZGVkKSB7XHJcbiAgICAgICAgICAgIHZhciBhcnJQcm9tbzogQXJyYXk8UHJvbW9jaW9uQ29tYmluYWRhPiA9IEpTT04ucGFyc2Uob00zUERpbmFtaWNhc0ZpbmRlZC5WYWxvcik7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyUHJvbW8ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBvUHJvbW9Db21iaTogUHJvbW9jaW9uQ29tYmluYWRhID0gaW9NM1Byb2Nlc28uUHJvbW9zQ29tYmluYWRhcy5maW5kKHggPT4geC5JZFByb21vY2lvbkNvbWJpbmFkYSA9PSBhcnJQcm9tb1tpXS5JZFByb21vY2lvbkNvbWJpbmFkYSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW9Qcm9tb0NvbWJpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW9NM1Byb2Nlc28uUHJvbW9zQ29tYmluYWRhcy5wdXNoKGFyclByb21vW2ldKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvTTNQRGluYW1pY2FzRmluZGVkLlZhbG9yID0gSlNPTi5zdHJpbmdpZnkoaW9NM1Byb2Nlc28uUHJvbW9zQ29tYmluYWRhcyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdmFyIG9NM1BEaW5hbWljYXMgPSBuZXcgTTNQRGluYW1pY2FzKCk7XHJcbiAgICAgICAgICAgIG9NM1BEaW5hbWljYXMuTm9tYnJlID0gXCJDT01CSU5BREFcIjtcclxuICAgICAgICAgICAgb00zUERpbmFtaWNhcy5WYWxvciA9IEpTT04uc3RyaW5naWZ5KGlvTTNQcm9jZXNvLlByb21vc0NvbWJpbmFkYXMpO1xyXG5cclxuICAgICAgICAgICAgaW9NM1Byb2Nlc28ubE0zUERpbmFtaWNhcy5wdXNoKG9NM1BEaW5hbWljYXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLy9DYWxjdWxvIGRlIHByb21vY2lvbmVzXHJcbiAgICBwdWJsaWMgQ2FsY3VsYXJQcm9tb2Npb25lcyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkOiBUeXBlTTNQcmRHcnAsXHJcbiAgICAgICAgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBvRGF0YVVzZXI6IGFueSwgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQik6IFByb21vY2lvblByb2Nlc2FkYSB7XHJcbiAgICAgICAgdmFyIG9Qcm9tb2Npb25Qcm9jZXNhZGEgPSBuZXcgUHJvbW9jaW9uUHJvY2VzYWRhKCk7XHJcbiAgICAgICAgdmFyIGxUaXBvcyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XHJcbiAgICAgICAgbFRpcG9zLnB1c2goXCJESVJFQ1RBXCIpO1xyXG4gICAgICAgIGxUaXBvcy5wdXNoKFwiQ09NQklOQURBXCIpO1xyXG4gICAgICAgIGxUaXBvcy5wdXNoKFwiTU9ORURFUk9cIik7XHJcbiAgICAgICAgbFRpcG9zLnB1c2goXCJNQU5VQUxcIik7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKG9NM0VOQ1BST01PICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHZhciBhcnJQcm9tbzogQXJyYXk8YW55PjtcclxuICAgICAgICAgICAgICAgIHZhciBvcHJvbW9jaW9uZXNTZXJ2aWNlID0gbmV3IHByb21vY2lvbmVzU2VydmljZShvRGF0YVVzZXIsIG9NM1BJdGVtc1dFQik7XHJcblxyXG4gICAgICAgICAgICAgICAgYXJyUHJvbW8gPSBvcHJvbW9jaW9uZXNTZXJ2aWNlLlZlcmlmaWNhclByb21vY2lvbmVzKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIGxUaXBvcyk7XHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhID0gb3Byb21vY2lvbmVzU2VydmljZS5Qcm9jZXNhclByb21vY2lvbihhcnJQcm9tbywgcHJvZEdSUFNlbGVjdGVkLCBvTTNFTkNQUk9NTywgdGhpcy5nc0lka2F0aW9zKTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb1Byb21vY2lvblByb2Nlc2FkYTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gaGF5IGluZm9ybWFjaW9uIGRlIHByb21vY2lvbmVzJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEgPSBuZXcgUHJvbW9jaW9uUHJvY2VzYWRhKCk7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTztcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9IDA7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzID0gbnVsbDtcclxuICAgICAgICAgICAgcmV0dXJuIG9Qcm9tb2Npb25Qcm9jZXNhZGE7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vVmVyaWZpY2FyIG9ic2VxdWlvcyB5IGFncmVnYXJsb3MuXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FyT2JzZXF1aW9zKG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSwgY2FudGlkYWQ6IG51bWJlciwgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBhcnJQcm9tb2Npb25lc0Fzb2NpYWRhczogQXJyYXk8UHJvbW9jaW9uZXNBc29jaWFkYXM+O1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VxdWlvc0NhbnRpZGFkID0gMDtcclxuICAgICAgICAgICAgaWYgKG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGFyclByb21vY2lvbmVzQXNvY2lhZGFzID0gb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMuZmlsdGVyKHByb21vID0+IHByb21vLkxpc3RPYnNTS1UgIT0gbnVsbCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGFyclByb21vY2lvbmVzQXNvY2lhZGFzICE9IG51bGwgJiYgYXJyUHJvbW9jaW9uZXNBc29jaWFkYXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFyclByb21vY2lvbmVzQXNvY2lhZGFzLmZvckVhY2gocHJvbW8gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9ic2VxdWlvT1Byb21vID09IC0xXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHJvbW8uTGlzdE9ic1NLVS5sZW5ndGgpIHByb21vLkxpc3RPYnNTS1UgPSBbcHJvbW8uTGlzdE9ic1NLVV07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52YWxpZGFTaVRpZW5lT3RyYVByb21vKHByb21vLCBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub2JzZXF1aW9PUHJvbW8gPSBwcm9tby5JRFByb21vY2lvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFybWFyTGlzdGFPYnNlcXVpb3NTS1UocHJvbW8sIG9NM1BFbmNJdGVtcywgY2FudGlkYWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdHVybk9uUHJvbW9zKG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBhcnJQcm9tb2Npb25lc0Fzb2NpYWRhczogQXJyYXk8UHJvbW9jaW9uZXNBc29jaWFkYXM+O1xyXG4gICAgICAgICAgICBpZiAob1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgYXJyUHJvbW9jaW9uZXNBc29jaWFkYXMgPSBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcy5maWx0ZXIocHJvbW8gPT4gcHJvbW8ubElkQWN0aXZhUHJvbW8gJiYgcHJvbW8ubElkQWN0aXZhUHJvbW8ubGVuZ3RoID4gMCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGFyclByb21vY2lvbmVzQXNvY2lhZGFzICYmIGFyclByb21vY2lvbmVzQXNvY2lhZGFzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBhcnJQcm9tb2Npb25lc0Fzb2NpYWRhcy5mb3JFYWNoKHByb21vID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sSWRBY3RpdmFQcm9tbyA9IHRoaXMubElkQWN0aXZhUHJvbW8uY29uY2F0KHByb21vLmxJZEFjdGl2YVByb21vKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUR1cGxpY2F0ZXModGhpcy5sSWRBY3RpdmFQcm9tbyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZUR1cGxpY2F0ZXMoYXJyOiBBcnJheTxhbnk+KSB7XHJcbiAgICAgICAgdmFyIHVuaXF1ZSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh1bmlxdWUuaW5kZXhPZihhcnJbaV0pID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgdW5pcXVlLnB1c2goYXJyW2ldKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhcm1hckxpc3RhT2JzZXF1aW9zU0tVKHByb21vOiBQcm9tb2Npb25lc0Fzb2NpYWRhcywgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgY2FudGlkYWQ6IG51bWJlcikge1xyXG4gICAgICAgIGxldCBjYW50aWRhZFJlYWwgPSBNYXRoLmZsb29yKGNhbnRpZGFkIC8gcHJvbW8uQ2FudGlkYWRPYnNlcSk7XHJcbiAgICAgICAgaWYgKHByb21vLlJlZ2xhT2JzZXEgPT0gXCJFWENcIikge1xyXG4gICAgICAgICAgICB0aGlzLmFzaWduYXJJZEVuY1BhZHJlT2JzZXF1aW8ocHJvbW8sIG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgIHRoaXMub2JzZXF1aW9zRXhjID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcXVpb3NDYW50aWRhZCA9IGNhbnRpZGFkUmVhbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXNpZ25hcklkRW5jUGFkcmVPYnNlcXVpbyhwcm9tbywgb00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgcHJvbW8uTGlzdE9ic1NLVS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5DYW50aWRhZCA9IGNhbnRpZGFkUmVhbCAqICtlbGVtZW50LkNhbnRpZGFkO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcXVpb3NFeGMgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vTGlzdGFPYnNlcXVpb3MgPSBwcm9tby5MaXN0T2JzU0tVO1xyXG4gICAgfVxyXG5cclxuICAgIGFzaWduYXJJZEVuY1BhZHJlT2JzZXF1aW8ocHJvbW86IFByb21vY2lvbmVzQXNvY2lhZGFzLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgaWYgKHByb21vLkxpc3RPYnNTS1UubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBwcm9tby5MaXN0T2JzU0tVLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LmlkRW5jUGFkcmUgPSBvTTNQRW5jSXRlbXMuSUQ7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhcm1hckxpc3RhT2JzZXF1aW9zQ29tYmlTS1UoY29tYmksIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGNhbnRpZGFkOiBudW1iZXIpIHtcclxuICAgICAgICBpZiAoY29tYmkuQWNjaW9uLlJlZ2xhT2JzZXEgPT0gXCJFWENcIikge1xyXG4gICAgICAgICAgICB0aGlzLmFzaWduYXJJZEVuY1BhZHJlT2JzZXF1aW9Db21iaW5hZG8oY29tYmkuQWNjaW9uLk9CU0VRVUlPUywgb00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcXVpb3NFeGMgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VxdWlvc0NhbnRpZGFkID0gY2FudGlkYWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmFzaWduYXJJZEVuY1BhZHJlT2JzZXF1aW9Db21iaW5hZG8oY29tYmkuQWNjaW9uLk9CU0VRVUlPUywgb00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgY29tYmkuQWNjaW9uLk9CU0VRVUlPUy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5DYW50aWRhZCA9IGNhbnRpZGFkICogK2VsZW1lbnQuQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VxdWlvc0V4YyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm9MaXN0YU9ic2VxdWlvcyA9IGNvbWJpLkFjY2lvbi5PQlNFUVVJT1M7XHJcbiAgICB9XHJcblxyXG4gICAgYXNpZ25hcklkRW5jUGFkcmVPYnNlcXVpb0NvbWJpbmFkbyhvYnNlcXVpb3MsIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICBpZiAob2JzZXF1aW9zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgb2JzZXF1aW9zLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LmlkRW5jUGFkcmUgPSBvTTNQRW5jSXRlbXMuSUQ7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL1JldG9ybmEgdHJ1ZSBzaSBoYXkgb3RyYSBwcm9tbyBhcGxpY2FkYSBkb25kZSBuaSBsYSBwcm9tbyBkZSBvYnNlcXVpbyBvIGxhIGFwbGljYWRhIHNvbiBmaWphcyB5IHVuYSBkZSBsYXMgZG9zIGVzIEVYQ1xyXG4gICAgdmFsaWRhU2lUaWVuZU90cmFQcm9tbyhwcm9tb09ic2VxdWlvOiBQcm9tb2Npb25lc0Fzb2NpYWRhcywgYXJyUHJvbW9jaW9uZXNBc29jaWFkYXM6IEFycmF5PFByb21vY2lvbmVzQXNvY2lhZGFzPik6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmIChwcm9tb09ic2VxdWlvLlJlZ2xhICE9IFwiQUNNXCIpIHtcclxuICAgICAgICAgICAgbGV0IG9Qcm9tb3NOb09ic2VxdWlvcyA9IGFyclByb21vY2lvbmVzQXNvY2lhZGFzLmZpbHRlcih4ID0+IHguSURQcm9tb2Npb24gIT0gcHJvbW9PYnNlcXVpby5JRFByb21vY2lvbik7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvbW8gb2Ygb1Byb21vc05vT2JzZXF1aW9zKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvbW8uUmVnbGEgIT0gXCJBQ01cIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9tby5BcGxpY2FkYSAmJiAocHJvbW8uUmVnbGEgPT0gXCJFWENcIiB8fCBwcm9tb09ic2VxdWlvLlJlZ2xhID09IFwiRVhDXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL3Byb2Nlc2FtaWVudG8gZGUgb2JzZXF1aW9zXHJcbiAgICBwdWJsaWMgYXN5bmMgUHJvY2VzYXJPYnNlcXVpb3Mob0RhdGFVc2VyOiBhbnksXHJcbiAgICAgICAgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgRW5MaW5lYTogYm9vbGVhbiwgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VxdWlvc0V4YyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VxdWlvT1Byb21vID0gLTE7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9MaXN0YU9ic2VxdWlvcyAhPSBudWxsICYmIHRoaXMub0xpc3RhT2JzZXF1aW9zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vTGlzdGFPYnNlcXVpb3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vTGlzdGFPYnNlcXVpb3NbaV0uU0tVKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE5MDgxMCB2YWxpZGEsIGN1YW50b3MgcHJvZHVjdG9zIHNlIGFncmVnYSBlbiBlbCBvYnNlcXVpby5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub0xpc3RhT2JzZXF1aW9zW2ldLkNhbnRpZGFkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvTTNQSXRlbXNXRUIuZENhbnRpZGFkID0gdGhpcy5vTGlzdGFPYnNlcXVpb3NbaV0uQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9KQUdNIDIwMTkxMTEyIHNlIGFncmVnIGZ1bmNpb25hbGlkYWQgZGUgb2JzZXF1aW9zXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5CaXNPYnNlcXVpbyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5JREVuY1BhZHJlID0gdGhpcy5vTGlzdGFPYnNlcXVpb3NbaV0uaWRFbmNQYWRyZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUEl0ZW1zV0VCLlRpcG9BZ3J1cGFjaW9uID0gXCJPQlNRXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuR3VhcmRhclByb21vY2lvbih0aGlzLm9MaXN0YU9ic2VxdWlvc1tpXSwgb0RhdGFVc2VyLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgRW5MaW5lYSwgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vTGlzdGFPYnNlcXVpb3MgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL0d1YXJkYXIgcHJvbW9jaW9uIHNlZ3VuIHVuIHNrdVxyXG4gICAgLy8xLiBCdXNjYXIgZWwgcHJvZHVjdG8gc2VndW4gZWwgc2t1XHJcbiAgICAvLzIuIEFncmVnYXIgZWwgcHJvZHVjdG8gYSBtM3Byb2Nlc29zXHJcbiAgICAvLzMuIEFncmVnYXIgYWwgY2Fycml0byBkZSBjb21wcmFzLlxyXG4gICAgcHVibGljIGFzeW5jIEd1YXJkYXJQcm9tb2Npb24ocHJvbW8sIG9EYXRhVXNlcjogYW55LFxyXG4gICAgICAgIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIEVuTGluZWE6IGJvb2xlYW4sIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgLy8gMjAxODExMjEgIHZhciBzS2V5Q2Fycml0bztcclxuICAgICAgICAvLyAyMDE4MTEyMSB2YXIgb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgdmFyIHByb2Nlc29Qcm9tbztcclxuICAgICAgICAvL09idGVuZXIga2V5IGRlIGNhcnJpdG8gZGUgY29tcHJhc1xyXG4gICAgICAgIC8vIDIwMTgxMTIxIHNLZXlDYXJyaXRvID0gb00zRGF0YS5HZXRLZXlDYXJyaXRvQ29tcHJhcyhzSURLYXRpb3MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiwgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklESFVCKTtcclxuXHJcblxyXG4gICAgICAgIC8vIDIwMTgxMTIxIG9NM1Byb2Nlc29zID0gYXdhaXQgb00zRGF0YS5HZXREYXRhUG91Y2hCRChzS2V5Q2Fycml0byk7XHJcbiAgICAgICAgcHJvY2Vzb1Byb21vID0gYXdhaXQgdGhpcy5BZGljaW9uYXJQcm9tb2Npb25BUHJvY2Vzbyhwcm9tbywgb00zUHJvY2Vzb3MsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBFbkxpbmVhLCBvRGF0YVVzZXIpO1xyXG4gICAgICAgIC8vR3VhcmRhciBlbiBwb3VjaCBEQlxyXG4gICAgICAgIC8vIDIwMTgxMTIxICBhd2FpdCBvTTNEYXRhLkFkZFRvUG91Y2hCRENhcnJpdG9Db21wcmFzKHNLZXlDYXJyaXRvLCBwcm9jZXNvUHJvbW8pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT2J0ZW5lciBsb3MgcHJvZHVjdG8gc2VndW4gc3UgU0tVLCBzYWNhbmRvIGxhIGluZm9ybWFjaW9uIGRlc2RlIHBvdWNoREIuXHJcbiAgICBwdWJsaWMgYXN5bmMgQWRpY2lvbmFyUHJvbW9jaW9uQVByb2Nlc28ocHJvbW8sIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBFbkxpbmVhOiBib29sZWFuLCBvRGF0YVVzZXI6IGFueSkge1xyXG4gICAgICAgIHZhciBvUHJvZHVjdG86IFR5cGVNM1ByZEdycCA9IG51bGw7XHJcbiAgICAgICAgb1Byb2R1Y3RvID0gYXdhaXQgdGhpcy5HZXRQcm9kdWN0b0J5U0tVKHByb21vLlNLVSwgRW5MaW5lYSwgb00zUHJvY2Vzb3MsIG9EYXRhVXNlcik7XHJcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhvUHJvZHVjdG8pO1xyXG4gICAgICAgIGlmIChvUHJvZHVjdG8gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAvL1lhIG5vIHNlIGRlamEgcHJlY2lvIGNlcm8gc2lubyBxdWUgY29tbyBlcyBvYnNlcXVpbyBzaW11bGEgdW4gZGVzY3VlbnRvIGRlbCAxMDAlIFxyXG4gICAgICAgICAgICAvL1Byb2R1Y3RvLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU8gPSAwO1xyXG4gICAgICAgICAgICAvL0FncmVnYXIgYSBtM3Byb2Nlc29zIGVsIG9ic2VxdWlvLlxyXG4gICAgICAgICAgICAvL29NM1Byb2Nlc29zID0gdGhpcy5Mb2FkTTNQcm9jZXNvRnJvbURhdGEob00zUHJvY2Vzb3MsIG9Qcm9kdWN0bywgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG51bGwsIG51bGwpO1xyXG5cclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSB0aGlzLmFkZHRvY2FydChvTTNQSXRlbXNXRUIsIG9Qcm9kdWN0bywgbnVsbCwgbnVsbCwgb0RhdGFVc2VyLCB0aGlzLmdzSWRrYXRpb3MsIG9NM1ViaWNhY2lvbiwgbnVsbCwgb00zUHJvY2Vzb3MsIG51bGwsIDEwMCk7Ly8qU2UgbWFuZGEgdmFsb3IgZGUgZGVzY3Vlbm50byAxMDAgJVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcbiAgICB9XHJcblxyXG4gICAgLy9PYnRlbmVyIHByb2R1Y3RvIHNlZ3VuIGVsIFNLVVxyXG4gICAgcHVibGljIGFzeW5jIEdldFByb2R1Y3RvQnlTS1Uoc1NLVSwgRW5MaW5lYTogYm9vbGVhbiwgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9EYXRhVXNlcjogYW55LCBkaXNwb25pYmxlTTNFbmMgPSBudWxsKSB7XHJcbiAgICAgICAgdmFyIG9TZXJ2aWNlTTNNYWVzdHJvID0gbmV3IFNlcnZpY2VNM01hZXN0cm8oKTtcclxuICAgICAgICB2YXIgcHJvZHVjdG9zO1xyXG4gICAgICAgIHZhciBvUHJvZHVjdG86IFR5cGVNM1ByZEdycCA9IG51bGw7XHJcbiAgICAgICAgdmFyIG9TZXJ2aWNlTG9hZExpc3RhUHJlY2lvID0gbmV3IFNlcnZpY2VMb2FkTGlzdGFQcmVjaW8odGhpcy5nc0lka2F0aW9zKTtcclxuXHJcbiAgICAgICAgLy9vU2VydmljZUxpc3RhUHJlY2lvLkdlbmVyYXRlRGF0YVZhbGlkYWNpb24ob0RhdGFVc2VyLCBvTTNQcm9jZXNvcy5UTUlkUHJvY2Vzbyk7XHJcbiAgICAgICAgaWYgKCFFbkxpbmVhICYmICFvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuRmVjaGFQcmVjaW8pIHtcclxuICAgICAgICAgICAgdmFyIHNJRFByb2R1Y3RvcyA9IHRoaXMuZ3NJZGthdGlvcyArIFwiP1BSRFwiO1xyXG4gICAgICAgICAgICBwcm9kdWN0b3MgPSBhd2FpdCB0aGlzLm9NM0NvdWNoTWFlc3Ryby5nZXQoc0lEUHJvZHVjdG9zKTtcclxuICAgICAgICAgICAgb1Byb2R1Y3RvID0gb1NlcnZpY2VNM01hZXN0cm8uR2V0TTNQcmRHcnBGcm9tTGlzdChwcm9kdWN0b3MuTTNMaXN0UHJvZHVjdG9zLk0zR1JQLCBzU0tVKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvUHJvZHVjdG8gPSBhd2FpdCBvU2VydmljZU0zTWFlc3Ryby5NM0dldFByb2R1Y3RvQnlTS1VBc3luYyh0aGlzLkdvUG9zdFNlcnZpY2VNMywgdGhpcy5nc0lka2F0aW9zLCBzU0tVLCBvRGF0YVVzZXIsIG9NM1Byb2Nlc29zLlViaWMxLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob1Byb2R1Y3RvLkxvTTNQcmRHZW5lcmFsWzBdLkRJU1BPTklCTEUgPD0gMCAmJiBkaXNwb25pYmxlTTNFbmMpIHtcclxuICAgICAgICAgICAgb1Byb2R1Y3RvLkxvTTNQcmRHZW5lcmFsWzBdLkRJU1BPTklCTEUgPSBkaXNwb25pYmxlTTNFbmM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhd2FpdCBvU2VydmljZUxvYWRMaXN0YVByZWNpby5Bc2lnbmFyTGlzdGFQcmVjaW8ob1Byb2R1Y3RvLCBvRGF0YVVzZXIsIHRoaXMuR29Qb3N0U2VydmljZU0zKTtcclxuICAgICAgICAvL29TZXJ2aWNlTGlzdGFQcmVjaW8uVmFsaWRhckxpc3RhUHJlY2lvcyhvUHJvZHVjdG8sIHRoaXMuR29Qb3N0U2VydmljZU0zLCB0aGlzLmdzSWRrYXRpb3MpO1xyXG4gICAgICAgIHJldHVybiBvUHJvZHVjdG87XHJcbiAgICB9XHJcblxyXG4gICAgLy9DYWxjdWxhciBwcmVjaW8gc2luIGltcHVlc3Rvcy4gTGEgZm9ybWEgZXMgY2FsY3VsYXIgdG9kbyBlbCB2YWxvciBkZWwgaW1wdWVzdG8uIEVKOiAxMjAuMDkgLyAxLjE2LiBTaSBlbCB2YWxvciBkZWwgaW1wdWVzdG8gZXM6IDE2JVxyXG4gICAgcHVibGljIENhbGN1bGF0ZVByZWNpb0Jhc2UoQ1RCTERJTVBQUkQ6IHN0cmluZywgZFZhbG9yTmV0bzogbnVtYmVyKSB7XHJcbiAgICAgICAgLy92YXIgZFZhbG9ySW1wdWVzdG86IG51bWJlciA9IDE7XHJcbiAgICAgICAgdmFyIGRWYWxvckJhc2U6IG51bWJlciA9IGRWYWxvck5ldG87XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG94bWxUb0pzb25URiA9IG5ldyB4bWxUb0pzb25URigpO1xyXG4gICAgICAgICAgICB2YXIgakltcHVlc3RvcztcclxuICAgICAgICAgICAgaWYgKENUQkxESU1QUFJEICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgIGpJbXB1ZXN0b3MgPSBveG1sVG9Kc29uVEYuY29udmVydFhtbFRvSnNvbihDVEJMRElNUFBSRCk7XHJcbiAgICAgICAgICAgICAgICBqSW1wdWVzdG9zLklNUFVFU1RPUy5JTVBVRVNUTy5mb3JFYWNoKGltcCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9KQUdNICAyMDE5MDYyNiBDYW1iaW8gZGUgY2FsY3VsbyBkZSBiYXNlIGRlIGxvcyBpbXB1ZXN0b3MuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGltcC4kLk1ldG9kb2xvZ2lhID09IFwiUE9SQ0VOVEFKRVwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRWYWxvckJhc2UgPSAoK2RWYWxvckJhc2UpIC8gKDEgKyAraW1wLiQuVmFsb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZFZhbG9yQmFzZSA9ICgrZFZhbG9yQmFzZSkgLSAoK2ltcC4kLlZhbG9yKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKG9NM1BFbmNJdGVtcy5NM0ltcHVlc3Rvcyk7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQ2F0Y2hcIilcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vcmV0dXJuICgoK2RWYWxvck5ldG8pIC8gKCtkVmFsb3JJbXB1ZXN0bykpO1xyXG4gICAgICAgIHJldHVybiBkVmFsb3JCYXNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQ2FyZ2FyIGluZm9ybWFjacOzbiBkZSBpbXB1ZXN0b3MsIGRlc2RlIGVsIHByb2R1Y3RvIGdlbmVyYWxcclxuICAgIHB1YmxpYyBMb2FkTTNQSW1wdWVzdG9zRnJvbVByZEdybChDVEJMRElNUFBSRDogc3RyaW5nLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLFxyXG4gICAgICAgIGRWYWxvck5ldG86IG51bWJlciwgY2FudGlkYWQ6IG51bWJlciwgdmFsb3JUb3RhbFByb2R1Y3RvVW5pdDogbnVtYmVyKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG94bWxUb0pzb25URiA9IG5ldyB4bWxUb0pzb25URigpO1xyXG4gICAgICAgICAgICB2YXIgb00zUEltcHVlc3RvczogTTNQSW1wdWVzdG9zO1xyXG4gICAgICAgICAgICBsZXQgdmFsb3JCYXNlVG90YWwgPSB0aGlzLm9NYXRoVEYucm91bmQoZFZhbG9yTmV0bywgNCk7XHJcbiAgICAgICAgICAgIGxldCB2YWxvck5ldG9Ub3RhbCA9IHZhbG9yQmFzZVRvdGFsO1xyXG4gICAgICAgICAgICBsZXQgdmFsb3JUb3RhbFByb2R1Y3RvVG90YWwgPSArYmlnRGVjaW1hbC5tdWx0aXBseSh2YWxvclRvdGFsUHJvZHVjdG9Vbml0LCBjYW50aWRhZCk7XHJcbiAgICAgICAgICAgIHZhciBqSW1wdWVzdG9zO1xyXG4gICAgICAgICAgICB2YXIgZFRvdGFsSW1wdWVzdG86IG51bWJlciA9IDA7XHJcbiAgICAgICAgICAgIGlmIChDVEJMRElNUFBSRCAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICBqSW1wdWVzdG9zID0gb3htbFRvSnNvblRGLmNvbnZlcnRYbWxUb0pzb24oQ1RCTERJTVBQUkQpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE5MDYyNiBDYW1iaW8gZW4gb3JkZW4gZGUgbG9zIGltcHVlc3Rvcy5cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBqSW1wdWVzdG9zLklNUFVFU1RPUy5JTVBVRVNUTy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWxvclJlYWxJbXAgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpbXAgPSBqSW1wdWVzdG9zLklNUFVFU1RPUy5JTVBVRVNUT1tpXTtcclxuICAgICAgICAgICAgICAgICAgICBvTTNQSW1wdWVzdG9zID0gbmV3IE0zUEltcHVlc3RvcygpO1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BJbXB1ZXN0b3MuQ29kSW1wdWVzdG8gPSBpbXAuJC5Db2RJbXA7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUEltcHVlc3Rvcy5Qb3JjZW50YWplID0gaW1wLiQuVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGltcC4kLk1ldG9kb2xvZ2lhID09IFwiUE9SQ0VOVEFKRVwiKSB7Ly9QT1JDRU5UQUpFXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbG9yUmVhbEltcCA9ICtiaWdEZWNpbWFsLm11bHRpcGx5KGltcC4kLlZhbG9yLCB2YWxvck5ldG9Ub3RhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BJbXB1ZXN0b3MuVmFsb3IgPSB0aGlzLm9NYXRoVEYucm91bmQodmFsb3JSZWFsSW1wLCAyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9NM1BJbXB1ZXN0b3MuVmFsb3IgPCB2YWxvclJlYWxJbXApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BJbXB1ZXN0b3MuTGltaXRlT3B1ZXN0byA9ICtNYXRoLmNlaWwoK2JpZ0RlY2ltYWwubXVsdGlwbHkodmFsb3JSZWFsSW1wLCAxMDApKSAvIDEwMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BJbXB1ZXN0b3MuTGltaXRlT3B1ZXN0byA9ICtNYXRoLmZsb29yKCtiaWdEZWNpbWFsLm11bHRpcGx5KHZhbG9yUmVhbEltcCwgMTAwKSkgLyAxMDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ly9GSUpPXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbG9yUmVhbEltcCA9ICtpbXAuJC5WYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUEltcHVlc3Rvcy5WYWxvciA9IHRoaXMub01hdGhURi5yb3VuZCh2YWxvclJlYWxJbXAsIDIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAob00zUEltcHVlc3Rvcy5WYWxvciA8IHZhbG9yUmVhbEltcCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgb00zUEltcHVlc3Rvcy5MaW1pdGVPcHVlc3RvID0gK01hdGguY2VpbCgrYmlnRGVjaW1hbC5tdWx0aXBseSh2YWxvclJlYWxJbXAsIDEwMCkpIC8gMTAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgb00zUEltcHVlc3Rvcy5MaW1pdGVPcHVlc3RvID0gK01hdGguZmxvb3IoK2JpZ0RlY2ltYWwubXVsdGlwbHkodmFsb3JSZWFsSW1wLCAxMDApKSAvIDEwMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE4MDkxMiBOdWV2byBjb25jZXB0byBkZSBiYXNlXHJcbiAgICAgICAgICAgICAgICAgICAgb00zUEltcHVlc3Rvcy5CYXNlID0gdGhpcy5vTWF0aFRGLnJvdW5kKHZhbG9yTmV0b1RvdGFsLCAyKTtcclxuICAgICAgICAgICAgICAgICAgICBkVG90YWxJbXB1ZXN0byA9IHRoaXMub01hdGhURi5yb3VuZCgoK2RUb3RhbEltcHVlc3RvKSwyKSArIHRoaXMub01hdGhURi5yb3VuZCgoK29NM1BJbXB1ZXN0b3MuVmFsb3IpLDIpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE4MDkxMiBTdW1hIGRlIFZhbG9yIE5ldG9cclxuICAgICAgICAgICAgICAgICAgICB2YWxvck5ldG9Ub3RhbCA9IHRoaXMub01hdGhURi5yb3VuZCgoK3RoaXMub01hdGhURi5yb3VuZCh2YWxvck5ldG9Ub3RhbCwgMikpICsgdGhpcy5vTWF0aFRGLnJvdW5kKCgrb00zUEltcHVlc3Rvcy5WYWxvciksMiksIDIpO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vL1NvbG8gYWRpY2lvbmUgYSBpbXB1ZXN0b3MsIGN1YW5kbyBlcyB0b3RhbCBpbXB1ZXN0b3NcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaW1wRXhpc3RlOiBNM1BJbXB1ZXN0b3M7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wRXhpc3RlID0gb00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvcy5maW5kKGltcCA9PiBpbXAuQ29kSW1wdWVzdG8gPT0gb00zUEltcHVlc3Rvcy5Db2RJbXB1ZXN0byk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGltcEV4aXN0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL0JvcnJhIGVuIGl0ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zUEltcHVlc3RvcyA9IG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3MuZmlsdGVyKGltcCA9PiBpbXAuQ29kSW1wdWVzdG8gIT0gb00zUEltcHVlc3Rvcy5Db2RJbXB1ZXN0byk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3MucHVzaChvTTNQSW1wdWVzdG9zKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIGpJbXB1ZXN0b3MuSU1QVUVTVE9TLklNUFVFU1RPLmZvckVhY2goaW1wID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9KQUdNIDIwMTkwNzI2IHNlIGFncmVnYSB2YWxpZGFjaW9uLCB5YSBxdWUgZXN0YWJhIHF1ZWRhbmRvIGxhIHJlc3RhLCBjb24gdmFsb3JlcyBjb21vOiAwLjAwMDAwMDAwMDAxID0gMS4xNTY0NTY0NTY0ZTg0NSBFSlxyXG4gICAgICAgICAgICBpZiAoZFRvdGFsSW1wdWVzdG8gIT0gMCkge1xyXG4gICAgICAgICAgICAgICAgLy9EaWZlcmVuY2lhIHJlZG9uZGVhZGEgYSBkb3MgZGVjaW1hbGVzXHJcbiAgICAgICAgICAgICAgICBkVG90YWxJbXB1ZXN0byA9IHRoaXMub01hdGhURi5yb3VuZChkVG90YWxJbXB1ZXN0bywgMik7XHJcbiAgICAgICAgICAgICAgICBsZXQgZGlmZXJlbmNpYSA9IHRoaXMub01hdGhURi5yb3VuZCgoK3ZhbG9yVG90YWxQcm9kdWN0b1RvdGFsIC0gK3RoaXMub01hdGhURi5yb3VuZCh2YWxvckJhc2VUb3RhbCwyKSAtICtkVG90YWxJbXB1ZXN0byksIDIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzTmFOKGRpZmVyZW5jaWEpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlmZXJlbmNpYSA9IHRoaXMub01hdGhURi5yb3VuZCgrKCt2YWxvclRvdGFsUHJvZHVjdG9Ub3RhbCAtICt0aGlzLm9NYXRoVEYucm91bmQodmFsb3JCYXNlVG90YWwsIDIpIC0gK2RUb3RhbEltcHVlc3RvKS50b0ZpeGVkKDQpLDIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGRpZmVyZW5jaWEgIT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWp1c3RhZG9yRGVJbXB1ZXN0b3Mob00zUEVuY0l0ZW1zLCBkaWZlcmVuY2lhKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBcIlRPVEFMSU1QVUVTVE9TXCJcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9NYXRoVEYucm91bmQoKHZhbG9yVG90YWxQcm9kdWN0b1RvdGFsIC0gdGhpcy5vTWF0aFRGLnJvdW5kKHZhbG9yQmFzZVRvdGFsLDIpKSwgMik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJDYXRjaFwiKVxyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGUyAyMDE5MDcyNVxyXG4gICAgICogQ29ycmlnZSBlbCB2YWxvciBxdWUgdG9tbyBlbCBpbXB1ZXN0byBkZXNwdWVzIGRlIGhhYmVyc2UgcmVkb25kZWFkb1xyXG4gICAgICogU2kgYWwgcmVjb3JyZXIgdG9kb3MgbG9zIGltcHVlc3RvcyBsYSBkaWZlcmVuY2lhIG5vIHNlIHphbmphLCBOSSBNT0RPUyBlbCBlcnJvciBlc3TDoSBlbiBvdHJhIHBhcnRlXHJcbiAgICAgKiBTZSBjcmVhIGVzdGEgZnVuY2nDs24gcGFyYSByZXNvbHZlciBsb3MgZXJyb3JlcyBkZSB0aW1icmFkbyBkZSBmYWN0dXJhIGVsZWN0csOzbmljYVxyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBcclxuICAgICAqIEBwYXJhbSBkaWZlcmVuY2lhIERpZmVyZW5jaWEgcXVlIHNlIGRlYmUgc2FsZGFyIHBhcmEgY29uc2VndWlyIGVsIHZhbG9yIHRvdGFsIGRlIGltcHVlc3RvcyByZXF1ZXJpZG9cclxuICAgICAqL1xyXG4gICAgYWp1c3RhZG9yRGVJbXB1ZXN0b3Mob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgZGlmZXJlbmNpYTogbnVtYmVyKSB7XHJcbiAgICAgICAgZm9yIChsZXQgX2kgPSAwOyBfaSA8IG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3MubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGltcHVlc3RvID0gb00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvc1tfaV07XHJcbiAgICAgICAgICAgIC8vU2kgbGEgZGlmZXJlbmNpYSBlcyBwb3NpdGl2YSBxdWllcmUgZGVjaXIgcXVlIGxhIHN1bWEgZGUgbG9zIGltcHVlc3RvcyBlcyBtZW5vciBhIGxhIHJlYWxcclxuICAgICAgICAgICAgaWYgKGRpZmVyZW5jaWEgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAvL1NpIGVsIGltcHVlc3RvIHNlIHJlZG9uZGVvIGhhY2lhIGFiYWpvIHF1aWVyZSBkZWNpciBxdWUgc2UgcHVkbyByZWRvbmRlYXIgaGFjaWEgYXJyaWJhXHJcbiAgICAgICAgICAgICAgICAvL0VudG9uY2VzIGxvIFwicmVkb25kZWEgaGFjaWEgYXJyaWJhXCIgeSByZXN0YSB1bmEgY2VudGVzaW1hIGEgbGEgZGlmZXJlbmNpYVxyXG4gICAgICAgICAgICAgICAgaWYgKGltcHVlc3RvLlZhbG9yIDwgaW1wdWVzdG8uTGltaXRlT3B1ZXN0bykge1xyXG4gICAgICAgICAgICAgICAgICAgIGltcHVlc3RvLlZhbG9yID0gaW1wdWVzdG8uTGltaXRlT3B1ZXN0bztcclxuICAgICAgICAgICAgICAgICAgICBpbXB1ZXN0by5CYXNlID0gdGhpcy5vTWF0aFRGLnJvdW5kKGltcHVlc3RvLlZhbG9yIC8gaW1wdWVzdG8uUG9yY2VudGFqZSwgMik7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlmZXJlbmNpYSA9IGRpZmVyZW5jaWEgLSAwLjAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy9TaSBWYWxvcj5WYWxvclJlYWwgcXVpZXJlIGRlY2lyIHF1ZSByZWRvbmRlbyBoYWNpYSBhcnJpYmEgeSBubyBkZWJlIG1vZGlmaWNhciBlc2UgdmFsb3JcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL1NpIGxhIGRpZmVyZW5jaWEgZXMgbmVnYXRpdmEgcXVpZXJlIGRlY2lyIHF1ZSBsYSBzdW1hIGRlIGxvcyBpbXB1ZXN0b3MgZXMgbWF5b3IgYSBsYSByZWFsXHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy9TaSBlbCBpbXB1ZXN0byBzZSByZWRvbmRlbyBoYWNpYSBhcnJpYmEgcXVpZXJlIGRlY2lyIHF1ZSBzZSBwdWRvIHJlZG9uZGVhciBoYWNpYSBhYmFqb1xyXG4gICAgICAgICAgICAgICAgLy9FbnRvbmNlcyBsbyBcInJlZG9uZGVhIGhhY2lhIGFiYWpvXCIgeSBzdW1hIHVuYSBjZW50ZXNpbWEgYSBsYSBkaWZlcmVuY2lhXHJcbiAgICAgICAgICAgICAgICBpZiAoaW1wdWVzdG8uVmFsb3IgPiBpbXB1ZXN0by5MaW1pdGVPcHVlc3RvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wdWVzdG8uVmFsb3IgPSBpbXB1ZXN0by5MaW1pdGVPcHVlc3RvO1xyXG4gICAgICAgICAgICAgICAgICAgIGltcHVlc3RvLkJhc2UgPSB0aGlzLm9NYXRoVEYucm91bmQoaW1wdWVzdG8uVmFsb3IgLyBpbXB1ZXN0by5Qb3JjZW50YWplLCAyKTtcclxuICAgICAgICAgICAgICAgICAgICBkaWZlcmVuY2lhID0gZGlmZXJlbmNpYSArIDAuMDE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvL1NpIFZhbG9yPFZhbG9yUmVhbCBxdWllcmUgZGVjaXIgcXVlIHJlZG9uZGVvIGhhY2lhIGFiYWpvIHkgbm8gZGViZSBtb2RpZmljYXIgZXNlIHZhbG9yXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vU2kgeWEgc2Ugc2FsZG8gbGEgZGlmZXJlbmNpYSByb21wZSBlbCBjaWNsbyBkYW5kbyBwb3IgY29uY2x1aWRvIGVsIGFqdXN0ZVxyXG4gICAgICAgICAgICBpZiAoZGlmZXJlbmNpYSA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL0xvYWQgcG9yIHVuaWRhZCBkZXRhbGxlIGRlbCBtM3Byb2Nlc28gaXRlbXMuXHJcbiAgICBwdWJsaWMgTG9hZE0zUERldGFsbGUoc1ZhbG9yOiBzdHJpbmcsIHNDb25jZXB0bzogc3RyaW5nKTogTTNQRGV0YWxsZUl0ZW1zIHtcclxuICAgICAgICB2YXIgb00zUERldGFsbGVJdGVtcyA9IG5ldyBNM1BEZXRhbGxlSXRlbXMoKTtcclxuICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLk5vbWJyZUNvbmNlcHRvID0gc0NvbmNlcHRvO1xyXG4gICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPSBzVmFsb3I7XHJcbiAgICAgICAgcmV0dXJuIG9NM1BEZXRhbGxlSXRlbXM7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vR2VuZXJhciBwcm9tb2Npb24gY29tYmluYWRhXHJcbiAgICBwdWJsaWMgYXN5bmMgR2VuZXJhclByb21vQ29tYmluYWRhKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvRGF0YVVzZXI6IGFueSkge1xyXG4gICAgICAgIGlmICghb00zUHJvY2Vzb3MubE0zUERpbmFtaWNhcyB8fCAob00zUHJvY2Vzb3MubE0zUERpbmFtaWNhcyAmJiAhb00zUHJvY2Vzb3MubE0zUERpbmFtaWNhcy5maW5kKHggPT4geC5Ob21icmUgPT0gXCJQVUVOVEVfRElBUklPXCIpKSkge1xyXG4gICAgICAgICAgICB2YXIgb3Byb21vY2lvbmVzU2VydmljZSA9IG5ldyBwcm9tb2Npb25lc1NlcnZpY2Uob0RhdGFVc2VyLCBudWxsKTtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSBvcHJvbW9jaW9uZXNTZXJ2aWNlLlByb2Nlc2FyQ29tYmluYWRhKG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgdGhpcy5SZWNhbGN1bGFyUHJlY2lvcyhvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL0NvbXBhcmUgTTNQcm9jZXNvcy4gKEZpcnN0OiBAUGFyYW06IGlsTTNQcm9jZXNvc1NRTCBWUyBTZWNvbmQ6IEdldCBGcm9tIENvdWNoREIvUG91Y2hEQilcclxuICAgIHB1YmxpYyBhc3luYyBDb21wYXJlTTNQcm9jZXNvKHNJREthdGlvczogc3RyaW5nLCBvTTNEYXRhOiBNM0RhdGEsIG9EYXRhVXNlcjogYW55LCBpbE0zUHJvY2Vzb3NTUUw6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICB2YXIgb1Jlc3A7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy9HZXQgZGF0YSwgZnJvbSBQb3VjaERCL0NvdWNoREJcclxuICAgICAgICAgICAgdmFyIFByb3BlcnR5Q29tcGFyZSA9IFtcIlZhbG9yTmV0b1wiLCBcIlZhbG9yXCJdO1xyXG4gICAgICAgICAgICB2YXIgc0tleUNhcnJpdG86IHN0cmluZztcclxuICAgICAgICAgICAgdmFyIG9NM1Byb2Nlc29zQ09VQ0g6IE0zUHJvY2Vzb3M7XHJcbiAgICAgICAgICAgIHZhciBiUmVzcDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICBzS2V5Q2Fycml0byA9IG9NM0RhdGEuR2V0S2V5Q2Fycml0b0NvbXByYXMoc0lES2F0aW9zLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JREhVQik7XHJcbiAgICAgICAgICAgIC8vR2V0IGRhdGEsIGZyb20gUG91Y2hEQi9Db3VjaERCXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zQ09VQ0ggPSBhd2FpdCBvTTNEYXRhLkdldERhdGFQb3VjaEJEKHNLZXlDYXJyaXRvKTtcclxuXHJcbiAgICAgICAgICAgIC8vU3RhcnQgQ29tcGFyZVxyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IFByb3BlcnR5Q29tcGFyZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGlsTTNQcm9jZXNvc1NRTFtQcm9wZXJ0eUNvbXBhcmVbaV1dICE9IG9NM1Byb2Nlc29zQ09VQ0hbUHJvcGVydHlDb21wYXJlW2ldXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGJSZXNwID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChiUmVzcCkge1xyXG4gICAgICAgICAgICAgICAgLy9Db21wYXJlOiBJRCwgSWRQcm9kdWN0byB5IENBTlRJREFEXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGlsTTNQcm9jZXNvc1NRTC5NM0VOQy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvTTNQcm9jZXNvc0NPVUNILk0zRU5DW2pdLklEICE9IGlsTTNQcm9jZXNvc1NRTC5NM0VOQ1tqXS5JRCB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNQcm9jZXNvc0NPVUNILk0zRU5DW2pdLklkUHJvZHVjdG8gIT0gaWxNM1Byb2Nlc29zU1FMLk0zRU5DW2pdLklkUHJvZHVjdG8gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUHJvY2Vzb3NDT1VDSC5NM0VOQ1tqXS5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yICE9IGlsTTNQcm9jZXNvc1NRTC5NM0VOQ1tqXS5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJSZXNwID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgb1Jlc3AgPSB7IFwiYlJlc3BcIjogYlJlc3AsIFwiTTNQcm9jZXNvc1wiOiBvTTNQcm9jZXNvc0NPVUNIIH07XHJcbiAgICAgICAgICAgIHJldHVybiBvUmVzcDtcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIENvbXBhcmVNM1Byb2Nlc29cIik7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICAgICAgb1Jlc3AgPSB7IFwiYlJlc3BcIjogdHJ1ZSwgXCJNM1Byb2Nlc29zXCI6IG51bGwgfTtcclxuICAgICAgICAgICAgcmV0dXJuIG9SZXNwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vQWRpY2lvbmFyIGNvbWVyY2lhbCBhbCBwcm9jZXNvLCBsbyBhZGljaW9uYSBhbCBhcnJlZ2xvIGRlIGRpbmFtaWNvcyBhc29jaWFkbyBhbCBwcm9jZXNvLlxyXG4gICAgcHVibGljIEFkZENvbWVyY2lhbFRvTTNQcm9jZXNvKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBUZG9jQ29tZXJjaWFsOiBzdHJpbmcsIE5kb2NDb21lcmNpYWw6IHN0cmluZykge1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLmxNM1BEaW5hbWljYXMucHVzaCh0aGlzLkNyZWF0ZVR1cGxhRGluYW1pY2EoXCJUQ09NRVJDSUFMXCIsIFRkb2NDb21lcmNpYWwpKTtcclxuICAgICAgICBvTTNQcm9jZXNvcy5sTTNQRGluYW1pY2FzLnB1c2godGhpcy5DcmVhdGVUdXBsYURpbmFtaWNhKFwiTkNPTUVSQ0lBTFwiLCBOZG9jQ29tZXJjaWFsKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9DcmVhY2lvbiB5IHJldG9ybm8gZGUgdHVwbGEgZGUgZGluYW1pY29zLCBhdGFkb3MgYSBwcm9jZXNvIG0zLlxyXG4gICAgcHVibGljIENyZWF0ZVR1cGxhRGluYW1pY2Eobm9tYnJlLCB2YWxvcikge1xyXG4gICAgICAgIHZhciBvTTNQRGluYW1pY2FzID0gbmV3IE0zUERpbmFtaWNhcygpO1xyXG4gICAgICAgIG9NM1BEaW5hbWljYXMuTm9tYnJlID0gbm9tYnJlO1xyXG4gICAgICAgIG9NM1BEaW5hbWljYXMuVmFsb3IgPSB2YWxvcjtcclxuXHJcbiAgICAgICAgcmV0dXJuIG9NM1BEaW5hbWljYXM7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vL0FjdHVhbGl6YSBsYSBjYW50aWRhZCBkZSBcclxuICAgIHB1YmxpYyBzZXRDYW50aWRhZEFMTFlVUERDb3VjaChvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zRGF0YTogTTNEYXRhLFxyXG4gICAgICAgIG9EYXRhVXNlcjogYW55LCBzSURLYXRpb3M6IHN0cmluZywgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbiwgaUNhbnRpZGFkKSB7XHJcblxyXG4gICAgICAgIGlmIChpQ2FudGlkYWQgPT0gMCAmJiBvTTNQcm9jZXNvcy5JRERpYXJpbyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIC8vL0F1biBubyBlc3RhIHJlZ2lzdHJhZG8gZWwgcHJvY2VzbyBjb21vIHRhbCwgc2UgcHVlZGUgYm9ycmFyIGRlIHJhaXpcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMgPSBuZXcgQXJyYXk8TTNQRW5jSXRlbXM+KCk7XHJcbiAgICAgICAgICAgIHRoaXMuVXBkYXRlTTNQcm9jZXNvc1dpdGhEYXRhKG9NM1Byb2Nlc29zLCBvTTNEYXRhLCBvRGF0YVVzZXIsIHNJREthdGlvcywgXCJXRUJcIiwgZnVuY2lvbk9LLCBmdW5jaW9uRXJyb3IpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChpQ2FudGlkYWQgPT0gMCkge1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuRGVsZXRlTTNQcm9jZXNvKG9NM0RhdGEsIG9EYXRhVXNlciwgc0lES2F0aW9zKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuR2V0Q2Fycml0b0NvbXByYXNQb3VjaERCKG9NM0RhdGEsIG9EYXRhVXNlciwgc0lES2F0aW9zKS50aGVuKHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gbmV3IE0zUHJvY2Vzb3MoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnVuY2lvbk9LKG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMuZm9yRWFjaChlbmMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvciA9IGlDYW50aWRhZDtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5VcGRhdGVNM1Byb2Nlc29zV2l0aERhdGEob00zUHJvY2Vzb3MsIG9NM0RhdGEsIG9EYXRhVXNlciwgc0lES2F0aW9zLCBcIldFQlwiLCBmdW5jaW9uT0ssIGZ1bmNpb25FcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8vU2UgY2FudGlkYWQgZGUgdW4gcHJvZHVjdG8gZXNwZWNpZmljb1xyXG4gICAgcHVibGljIHNldENhbnRpZGFkWVVQRENvdWNoKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvTTNEYXRhOiBNM0RhdGEsXHJcbiAgICAgICAgb0RhdGFVc2VyOiBhbnksIHNJREthdGlvczogc3RyaW5nLCBmdW5jaW9uT0s6IEZ1bmN0aW9uLFxyXG4gICAgICAgIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24sIGlkUHJvZHVjdG8sIExvdGUsIGlDYW50aWRhZCwgdGlwb1ViaWNhY2lvbiwgSURFbmMsXHJcbiAgICAgICAgbTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIGZvcnphckJvcnJhZDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcblxyXG4gICAgICAgIGlmICgoaUNhbnRpZGFkID09IDAgJiYgb00zUHJvY2Vzb3MuSUREaWFyaW8gPT09IHVuZGVmaW5lZCAmJiB0aXBvVWJpY2FjaW9uID09IFwiV0VCXCIpIHx8IGZvcnphckJvcnJhZCkge1xyXG4gICAgICAgICAgICAvLy9BdW4gbm8gZXN0YSByZWdpc3RyYWRvIGVsIHByb2Nlc28gY29tbyB0YWwsIHNlIHB1ZWRlIGJvcnJhciBkZSByYWl6XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DID0gb00zUHJvY2Vzb3MuTTNFTkMuZmlsdGVyKHByb2QgPT4gIShwcm9kLklkUHJvZHVjdG8gPT0gaWRQcm9kdWN0byAmJiBwcm9kLklEID09IElERW5jKSAmJiAhKHByb2QuSWRFbmNQYWRyZSA9PSBJREVuYykpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGxvTTNQSXRlbXNXRUIgPSBuZXcgTTNQSXRlbXNXRUIoKTtcclxuICAgICAgICAgICAgbG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSAwO1xyXG4gICAgICAgICAgICB0aGlzLlVwZGF0ZU0zUHJvY2Vzb3NXaXRoRGF0YShvTTNQcm9jZXNvcywgb00zRGF0YSwgb0RhdGFVc2VyLCBzSURLYXRpb3MsIHRpcG9VYmljYWNpb24sIGZ1bmNpb25PSywgZnVuY2lvbkVycm9yLCBtM1ViaWNhY2lvbik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gSkFHTSAyMDE5MTAyMSwgbm8gaGFjZXIgbMOzZ2ljYSBkZSBwcm9tb2Npb25lcyB5IHZhcmlvcywgY3XDoW5kbyBzZSBib3JyYSBlbCBpdGVtLlxyXG4gICAgICAgICAgICBpZiAoaUNhbnRpZGFkID09IDApIHtcclxuICAgICAgICAgICAgICAgIC8vU2UgdG9tYSBlbiBjdWVudGEgZWwgcHJkIHkgc3VzIGhpam9zIGNvbiBlbCBJZEVuY1BhZHJlXHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIoZW5jID0+IChlbmMuSWRQcm9kdWN0byA9PSBpZFByb2R1Y3RvICYmIGVuYy5Mb3RlID09IExvdGUgJiYgZW5jLklEID09IElERW5jKSB8fCBlbmMuSWRFbmNQYWRyZSA9PSBJREVuYykuZm9yRWFjaChwcmQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHByZC5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvciA9IGlDYW50aWRhZDtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vb00zUHJvY2Vzb3MuTTNFTkMuZmluZChlbmMgPT4gZW5jLklkUHJvZHVjdG8gPT0gaWRQcm9kdWN0byAmJiBlbmMuTG90ZSA9PSBMb3RlICYmIGVuYy5JRCA9PSBJREVuYykuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IgPSBpQ2FudGlkYWQ7Ly9BbnRpZ3VhIGxvZ2ljYVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuVXBkYXRlTTNQcm9jZXNvc1dpdGhEYXRhKG9NM1Byb2Nlc29zLCBvTTNEYXRhLCBvRGF0YVVzZXIsIHNJREthdGlvcywgdGlwb1ViaWNhY2lvbiwgZnVuY2lvbk9LLCBmdW5jaW9uRXJyb3IsIG0zVWJpY2FjaW9uKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2FudGlkYWRWMihvTTNQcm9jZXNvcywgaWRQcm9kdWN0bywgTG90ZSwgaUNhbnRpZGFkLCBJREVuYywgb0RhdGFVc2VyLCBzSURLYXRpb3MsIG0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTykudGhlbihyZXNwID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlVwZGF0ZU0zUHJvY2Vzb3NXaXRoRGF0YShvTTNQcm9jZXNvcywgb00zRGF0YSwgb0RhdGFVc2VyLCBzSURLYXRpb3MsIHRpcG9VYmljYWNpb24sIGZ1bmNpb25PSywgZnVuY2lvbkVycm9yLCBtM1ViaWNhY2lvbiwgcmVzcC5NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcblxyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgLy90aGlzLlVwZGF0ZU0zUHJvY2Vzb3NXaXRoRGF0YShvTTNQcm9jZXNvcywgb00zRGF0YSwgb0RhdGFVc2VyLCBzSURLYXRpb3MsIHRpcG9VYmljYWNpb24sIGZ1bmNpb25PSywgZnVuY2lvbkVycm9yKTtcclxuICAgIH1cclxuXHJcbiAgICAvL0NhbWJpYXIgY2FudGlkYWQgZGUgbTNwcm9jZXNvXHJcbiAgICAvL0pBR00gMjAxOTEwMTggU2UgYWdyZWdhIG51ZXZhIGZ1bmNpb25hbGlkYWQgYSBsYSBjYW50aWRhZDogXHJcbiAgICAvLzEuU2UgYm9ycmEgZWwgcHJvZHVjdG8gZGUgbGEgbGlzdGEgZGVsIHByb2Nlc29cclxuICAgIC8vMi4gU2UgYWdyZWdhIGRlIG51ZXZvIGVsIHByb2R1Y3RvIGNvbiBsYSBudWV2YSBjYW50aWRhZC5cclxuICAgIHB1YmxpYyBhc3luYyBzZXRDYW50aWRhZFYyKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBpZFByb2R1Y3RvLCBMb3RlLCBpQ2FudGlkYWQsIElERW5jLCBvRGF0YVVzZXI6IGFueVxyXG4gICAgICAgICwgc0lES2F0aW9zOiBzdHJpbmcsIG0zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+KSB7XHJcbiAgICAgICAgdmFyIG9Qcm9kdWN0bzogVHlwZU0zUHJkR3JwID0gbnVsbDtcclxuICAgICAgICB2YXIgb00zUEl0ZW1zV0VCID0gbmV3IE0zUEl0ZW1zV0VCKCk7XHJcbiAgICAgICAgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9IGlDYW50aWRhZDtcclxuICAgICAgICAvL0pBR00gMjAxOTExMTQsIEFncmVnYXIgaW1hZ2VuXHJcbiAgICAgICAgdmFyIG9NM1BFbmNJdGVtcyA9IG9NM1Byb2Nlc29zLk0zRU5DLmZpbmQoZW5jID0+IGVuYy5JZFByb2R1Y3RvID09IGlkUHJvZHVjdG8gJiYgZW5jLkxvdGUgPT0gTG90ZSAmJiBlbmMuSUQgPT0gSURFbmMpO1xyXG4gICAgICAgIGlmIChvTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICAgICAgb00zUEl0ZW1zV0VCLlBhdGhJbWFnZW4gPSBvTTNQRW5jSXRlbXMuUGF0aEltYWdlO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DID0gb00zUHJvY2Vzb3MuTTNFTkMuZmlsdGVyKGVuYyA9PiAhKGVuYy5JZFByb2R1Y3RvID09IGlkUHJvZHVjdG8gJiYgZW5jLkxvdGUgPT0gTG90ZSAmJiAoZW5jLklEID09IElERW5jIHx8IGVuYy5JZEVuY1BhZHJlID09IElERW5jKSkpO1xyXG5cclxuICAgICAgICBvUHJvZHVjdG8gPSBhd2FpdCB0aGlzLkdldFByb2R1Y3RvQnlTS1UoaWRQcm9kdWN0bywgdHJ1ZSwgb00zUHJvY2Vzb3MsIG9EYXRhVXNlciwgb00zUEVuY0l0ZW1zLkRJU1BPTklCTEUpO1xyXG4gICAgICAgIG9NM1BJdGVtc1dFQiA9IHRoaXMuTG9hZEFkaWNpb25hbGVzKG9NM1BJdGVtc1dFQiwgb1Byb2R1Y3RvKTtcclxuICAgICAgICBvTTNQcm9jZXNvcyA9IHRoaXMuYWRkdG9jYXJ0KG9NM1BJdGVtc1dFQiwgb1Byb2R1Y3RvLCBudWxsLCBudWxsLCBvRGF0YVVzZXIsIHNJREthdGlvcywgbTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgcmV0dXJuIHsgXCJNM1Byb2Nlc29cIjogb00zUHJvY2Vzb3MsIFwiTTNQSXRlbXNXRUJcIjogb00zUEl0ZW1zV0VCIH07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0X00zRU5DX2J5X2lkcHJkX2xvdGUob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIGlkUHJvZHVjdG8sIExvdGUpOiBNM1BFbmNJdGVtcyB7XHJcbiAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zLk0zRU5DLmZpbmQoZW5jID0+IGVuYy5JZFByb2R1Y3RvID09IGlkUHJvZHVjdG8gJiYgZW5jLkxvdGUgPT0gTG90ZSlcclxuICAgIH1cclxuXHJcbiAgICAvL09idGVuZXIgY2FudGlkYWQgZGUgdW4gZW5jYWJlemFkbywgcHJvZHVjdG8gZXNwZWNpZmljby5cclxuICAgIHB1YmxpYyBnZXRDYW50aWRhZChvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb1Byb2R1Y3RvOiBNM1ByZEdlbmVyYWwpIHtcclxuICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3MuTTNFTkMuZmluZChlbmMgPT4gZW5jLklkUHJvZHVjdG8gPT0gb1Byb2R1Y3RvLlNLVSAmJiBlbmMuTG90ZSA9PSBvUHJvZHVjdG8uTE9URSkuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENhbnRpZGFkVG90YWwob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MgIT09IHVuZGVmaW5lZCAmJiBvTTNQcm9jZXNvcy5NM0VOQyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLmZpbHRlcihlbmMgPT4gKCtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpID4gMCkuXHJcbiAgICAgICAgICAgICAgICByZWR1Y2UoKGFjYywgY3VyKSA9PiAoYWNjKSArICgrY3VyLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKSwgMClcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8vLy8vUkVHSU9OIERFIFJFQ0VQQ0lPTlxyXG4gICAgLy9TZSBhZ3JlZ2EgYXRyaWJ1dG8gZGUgQ3VycmVudCBjYW50aWRhZCBkZSByZWNlcGNpb25cclxuICAgIHB1YmxpYyBNZXJnZVJlY2VwWUVuYyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgaWRSZWNlcGNpb246IG51bWJlcikge1xyXG4gICAgICAgIC8vb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQcmRHZW5lcmFsLkNUQkxEUFJELCBcIkNUQkxEUFJEXCIpKTtcclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MuTTNQUmVjZXBjaW9uLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNQUmVjZXBjaW9uLmZpbHRlcihyZWNlcCA9PiByZWNlcC5JZFJlY2VwY2lvbiA9PSBpZFJlY2VwY2lvbikuZm9yRWFjaChyZWMgPT4ge1xyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMuZmluZChlbmMgPT4gZW5jLklEID09IHJlYy5JZEVuYykuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKHJlYy5DYW50aWRhZC50b1N0cmluZygpLCBcIkNVUkNSRUNcIikpOy8vQ1VSUkVOVCBDQU5USURBRCBSRUNFUENJT05cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vRGVqYXIgbG9zIGRlIHRhbGxlcyBkZSBsYSB2YXJpYWJsZTogQ1VSQ1JFQyBlbj0wLCBFc3RvIHBhcmEgZmx1am9zLCBkb25kZSBhZ3JlZ2EgaW5mbyBwcm9jZXNhIHkgYWjDrSBtaXNtbyBhZ3JlZ2EgbcOhcy5cclxuICAgIHB1YmxpYyBSZW1vdmVDdXJDUmVjKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zICE9PSB1bmRlZmluZWQgJiYgb00zUHJvY2Vzb3MgIT0gbnVsbCAmJiBvTTNQcm9jZXNvcy5NM0VOQyAhPT0gdW5kZWZpbmVkICYmIG9NM1Byb2Nlc29zLk0zRU5DICE9IG51bGwpXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLmZvckVhY2goZW5jID0+IHtcclxuICAgICAgICAgICAgICAgIHZhciBvRGV0YWxsZTogTTNQRGV0YWxsZUl0ZW1zO1xyXG4gICAgICAgICAgICAgICAgb0RldGFsbGUgPSBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ1VSQ1JFQ1wiKTtcclxuICAgICAgICAgICAgICAgIGlmIChvRGV0YWxsZSAhPT0gdW5kZWZpbmVkICYmIG9EZXRhbGxlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBvRGV0YWxsZS5WYWxvciA9IFwiMFwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvLy8vLy9GSU4gUkVHSU9OIERFIFJFQ0VQQ0lPTlxyXG5cclxuICAgIC8vLy8vLy9SRUdJT04gRU5UUkVHQVxyXG4gICAgLy9TZSBhZ3JlZ2EgYXRyaWJ1dG8gZGUgQ3VycmVudCBjYW50aWRhZCBkZSBlbnZpb1xyXG4gICAgcHVibGljIE1lcmdlRW50cFlFbmMob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICAvL29NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUHJkR2VuZXJhbC5DVEJMRFBSRCwgXCJDVEJMRFBSRFwiKSk7XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zLk0zUEVudmlvcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zUEVudmlvcy5mb3JFYWNoKGVudiA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YXIgbEVuYzogQXJyYXk8TTNQRW5jSXRlbXM+O1xyXG4gICAgICAgICAgICAgICAgbEVuYyA9IG9NM1Byb2Nlc29zLk0zRU5DLmZpbHRlcihlbmMgPT4gZW5jLklkRW52aW8gPT0gZW52LklkRW52aW8pO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChsRW5jICE9PSB1bmRlZmluZWQgJiYgbEVuYyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbEVuYy5mb3JFYWNoKGVuYyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yLCBcIkNVUkNFTlRcIikpOy8vQ1VSUkVOVCBDQU5USURBRCBSRUNFUENJT05cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9EZWphciBsb3MgZGUgdGFsbGVzIGRlIGxhIHZhcmlhYmxlOiBDVVJDUkVDIGVuPTAsIEVzdG8gcGFyYSBmbHVqb3MsIGRvbmRlIGFncmVnYSBpbmZvIHByb2Nlc2EgeSBhaMOtIG1pc21vIGFncmVnYSBtw6FzLlxyXG4gICAgcHVibGljIFJlbW92ZUN1ckNFbnQob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MgIT09IHVuZGVmaW5lZCAmJiBvTTNQcm9jZXNvcyAhPSBudWxsICYmIG9NM1Byb2Nlc29zLk0zRU5DICE9PSB1bmRlZmluZWQgJiYgb00zUHJvY2Vzb3MuTTNFTkMgIT0gbnVsbClcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMuZm9yRWFjaChlbmMgPT4ge1xyXG4gICAgICAgICAgICAgICAgdmFyIG9EZXRhbGxlOiBNM1BEZXRhbGxlSXRlbXM7XHJcbiAgICAgICAgICAgICAgICBvRGV0YWxsZSA9IGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDVVJDRU5UXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKG9EZXRhbGxlICE9PSB1bmRlZmluZWQgJiYgb0RldGFsbGUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9EZXRhbGxlLlZhbG9yID0gXCIwXCI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcblxyXG4gICAgfVxyXG4gICAgLy8vLy8vL0ZJTiBSRUdJT04gRU5UUkVHQVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb21vY2lvbmVzIHF1ZSBzZSBwcm9jZXNhbiBkZXNwdWVzIGRlIGFncmVnYXIgYWwgY2Fycml0b1xyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFxyXG4gICAgICogQHBhcmFtIG9EYXRhVXNlciBcclxuICAgICAqIEBwYXJhbSBvTTNQSXRlbXNXRUIgXHJcbiAgICAgKiBAcGFyYW0gb00zVWJpY2FjaW9uIFxyXG4gICAgICogQHBhcmFtIEVuTGluZWEgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBQcm9jUHJvbW9BZnRlckFkZFRvQ2FydChvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb0RhdGFVc2VyOiBhbnksXHJcbiAgICAgICAgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgRW5MaW5lYTogYm9vbGVhbikge1xyXG5cclxuICAgICAgICBhd2FpdCB0aGlzLlByb2Nlc2FyT2JzZXF1aW9zKG9EYXRhVXNlciwgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIEVuTGluZWEsIG9NM1Byb2Nlc29zKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb2Nlc2FyIHByb21vY2lvbmVzIGRlc3B1ZXMgZGUgZmluYWxpemFyIGVsIHJlZ2lzdHJvXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBQcm9jUHJvbW9BZnRlckZpbmFsaXphcihvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBvRGF0YVVzZXI6IGFueSkge1xyXG5cclxuICAgICAgICB0aGlzLkdlbmVyYXJQcm9tb0NvbWJpbmFkYShvTTNQcm9jZXNvcywgb0RhdGFVc2VyKTtcclxuICAgICAgICB0aGlzLlByb21vQWZ0ZXJQcm9jZXNvKG9NM1Byb2Nlc29zLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBQcm9tb0FmdGVyUHJvY2VzbyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBvRGF0YVVzZXI6IGFueSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBvcHJvbW9jaW9uZXNTZXJ2aWNlID0gbmV3IHByb21vY2lvbmVzU2VydmljZShvRGF0YVVzZXIsIG51bGwpO1xyXG4gICAgICAgICAgICB2YXIgbFRpcG9zUHJvbW8gPSBuZXcgQXJyYXk8U3RyaW5nPigpO1xyXG4gICAgICAgICAgICB2YXIgYXJyUHJvbW86IEFycmF5PGFueT47XHJcbiAgICAgICAgICAgIHZhciBvUHJvbW9jaW9uUHJvY2VzYWRhID0gbmV3IFByb21vY2lvblByb2Nlc2FkYSgpO1xyXG4gICAgICAgICAgICBsVGlwb3NQcm9tby5wdXNoKFwiQUZURVJcIik7XHJcbiAgICAgICAgICAgIGFyclByb21vID0gb3Byb21vY2lvbmVzU2VydmljZS5WZXJpZmljYXJQcm9tb2Npb25lcyhvTTNQcm9jZXNvcywgbnVsbCwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgbFRpcG9zUHJvbW8pO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhID0gb3Byb21vY2lvbmVzU2VydmljZS5Qcm9jZXNhclByb21vQWZ0ZXIoYXJyUHJvbW8sIG9NM1Byb2Nlc29zLCBvTTNFTkNQUk9NTyk7XHJcblxyXG4gICAgICAgICAgICBpZiAob1Byb21vY2lvblByb2Nlc2FkYSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcy5WYWxvck5ldG8gPSBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5BZGRJbmZvUHJvbW9jaW9uZXNBRGluYW1pY2FzKG9NM1Byb2Nlc29zLCBvUHJvbW9jaW9uUHJvY2VzYWRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZ3JlZ2FyIGluZm9ybWFjaW9uIGRlIHByb21vY2lvbmVzIGEgaW5mb3JtYWNpb24gZGluYW1pY2EgZGVsIHByb2Nlc29cclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqIEBwYXJhbSBvUHJvbW9jaW9uUHJvY2VzYWRhIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWRkSW5mb1Byb21vY2lvbmVzQURpbmFtaWNhcyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhKSB7XHJcbiAgICAgICAgdmFyIGRhdGEgPSB0aGlzLkdlbmVyYXJJbmZvUHJvbW9jaW9uZXNQcm9jZXNhZGFzKG9Qcm9tb2Npb25Qcm9jZXNhZGEsIDApO1xyXG4gICAgICAgIGlmIChkYXRhICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdmFyIG9NM1BEaW5hbWljYXMgPSBuZXcgTTNQRGluYW1pY2FzKCk7XHJcbiAgICAgICAgICAgIG9NM1BEaW5hbWljYXMgPSB0aGlzLkNyZWF0ZVR1cGxhRGluYW1pY2EoXCJWQUxfUFJPTU9DXCIsIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24udG9TdHJpbmcoKSlcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MubE0zUERpbmFtaWNhcy5wdXNoKG9NM1BEaW5hbWljYXMpO1xyXG5cclxuICAgICAgICAgICAgb00zUERpbmFtaWNhcyA9IHRoaXMuQ3JlYXRlVHVwbGFEaW5hbWljYShcIk5PTUJfUFJPTU9DXCIsIGRhdGEuTk9NQlJFUylcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MubE0zUERpbmFtaWNhcy5wdXNoKG9NM1BEaW5hbWljYXMpO1xyXG5cclxuICAgICAgICAgICAgb00zUERpbmFtaWNhcyA9IHRoaXMuQ3JlYXRlVHVwbGFEaW5hbWljYShcIklEX1BST01PQ1wiLCBkYXRhLklEKVxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5sTTNQRGluYW1pY2FzLnB1c2gob00zUERpbmFtaWNhcyk7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLy8vT2J0aWVuZSBlbCBwcm9jZXNvIGFzb3NpYWRvIGEgdW4gaWRwcmVzdGFtb3NcclxuICAgIGFzeW5jIGdldF9tM19wcm9jZXNvX2J5X2lkX3ByZXN0YW1vX2FzeW5jKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBpZF9wcmVzdGFtbzogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIHJlc3AgPSBhd2FpdCBQb3N0U2VydmljZU0zLmdldE0zKCdNMy9nZXRNM1Byb2Nlc29CeUlkUHJlc3RhbW8vJyArIGlkX2thdGlvcyArICcvJyArIGlkX3ByZXN0YW1vKS50b1Byb21pc2UoKTtcclxuICAgICAgICByZXR1cm4gcmVzcDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgR2V0Q29uY2VwdG9NM1NhbGRvc0l0ZW1VYihQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgakRhdGE6IGFueSkge1xyXG4gICAgICAgIHZhciByZXNwO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXNwID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNMy9HZXRDb25jZXB0b00zU2FsZG9zSXRlbVViLycgKyBzSURLYXRpb3MsIGpEYXRhKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3A7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWdyZWdhIG8gbW9kaWZpY2EgbGEgY2FudGlkYWQgZGUgdW4gb2JqZXRvIE0zT3RDbGFzaWZpY2FjaW9uZXMgZGVudHJvIGRlbGEgbGlzdGEgZGUgdW4gUHJvY2Vzb1xyXG4gICAgICogQHBhcmFtIHByb2R1Y3QgXHJcbiAgICAgKiBAcGFyYW0gY2FudGlkYWQgXHJcbiAgICAgKiBAcGFyYW0gaW9NM1Byb2Nlc29zIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25PSyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZFByb2R1Y3RvVG9PdHJhc0NsYXMocHJvZHVjdDogVHlwZU0zUHJkR3JwLCBjYW50aWRhZDogbnVtYmVyLCBpb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIGZ1bmNpb25PSzogRnVuY3Rpb24pIHtcclxuICAgICAgICB2YXIgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MgPSBpb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgdmFyIG9NM090Q2xhc2lmaWNhY2lvbmVzOiBNM090Q2xhc2lmaWNhY2lvbmVzO1xyXG4gICAgICAgIHZhciBwcm9kdWN0VW5pdFNlbGVjdGVkOiBNM1ByZEdlbmVyYWw7XHJcbiAgICAgICAgcHJvZHVjdFVuaXRTZWxlY3RlZCA9IHByb2R1Y3QuTG9NM1ByZEdlbmVyYWxbMF07XHJcblxyXG4gICAgICAgIGxldCBwcm9kdWN0b0V4aXN0ZSA9IHRoaXMudmFsaWRhckV4aXN0YU90cmFDbGFzaWYob00zUHJvY2Vzb3MuTTNPdENsYXNpZmljYWNpb25lcywgcHJvZHVjdCk7XHJcbiAgICAgICAgaWYgKHByb2R1Y3RvRXhpc3RlKSB7XHJcbiAgICAgICAgICAgIHByb2R1Y3RvRXhpc3RlLkNhbnRpZGFkID0gcHJvZHVjdG9FeGlzdGUuQ2FudGlkYWQgKyBjYW50aWRhZDtcclxuICAgICAgICAgICAgcHJvZHVjdG9FeGlzdGUuVmFsb3IgPSArYmlnRGVjaW1hbC5tdWx0aXBseShwcm9kdWN0VW5pdFNlbGVjdGVkLkxvTTNQcmRMaXN0YS5QUkVDSU8sIHByb2R1Y3RvRXhpc3RlLkNhbnRpZGFkKTtcclxuICAgICAgICAgICAgcHJvZHVjdG9FeGlzdGUuT3JkZW4gPSB0aGlzLkdldE1heEF0cmlidXRvRnJvbUxpc3RhKG9NM1Byb2Nlc29zLk0zT3RDbGFzaWZpY2FjaW9uZXMsIFwiT3JkZW5cIikgKyAxO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG9NM090Q2xhc2lmaWNhY2lvbmVzID0gbmV3IE0zT3RDbGFzaWZpY2FjaW9uZXMoKTtcclxuICAgICAgICAgICAgb00zT3RDbGFzaWZpY2FjaW9uZXMuQ2FudGlkYWQgPSBjYW50aWRhZDtcclxuICAgICAgICAgICAgb00zT3RDbGFzaWZpY2FjaW9uZXMuSWRQcm9kdWN0byA9IHByb2R1Y3RVbml0U2VsZWN0ZWQuU0tVO1xyXG4gICAgICAgICAgICBvTTNPdENsYXNpZmljYWNpb25lcy5Ob21icmUgPSBwcm9kdWN0VW5pdFNlbGVjdGVkLk5PTUJSRTE7XHJcbiAgICAgICAgICAgIG9NM090Q2xhc2lmaWNhY2lvbmVzLlZhbG9yID0gK2JpZ0RlY2ltYWwubXVsdGlwbHkocHJvZHVjdFVuaXRTZWxlY3RlZC5Mb00zUHJkTGlzdGEuUFJFQ0lPLCBjYW50aWRhZCk7XHJcbiAgICAgICAgICAgIG9NM090Q2xhc2lmaWNhY2lvbmVzLklEID0gdGhpcy5HZXRNYXhBdHJpYnV0b0Zyb21MaXN0YShvTTNQcm9jZXNvcy5NM090Q2xhc2lmaWNhY2lvbmVzLCBcIklEXCIpICsgMTtcclxuICAgICAgICAgICAgb00zT3RDbGFzaWZpY2FjaW9uZXMuT3JkZW4gPSB0aGlzLkdldE1heEF0cmlidXRvRnJvbUxpc3RhKG9NM1Byb2Nlc29zLk0zT3RDbGFzaWZpY2FjaW9uZXMsIFwiT3JkZW5cIikgKyAxO1xyXG5cclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNPdENsYXNpZmljYWNpb25lcy5wdXNoKG9NM090Q2xhc2lmaWNhY2lvbmVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zID0gdGhpcy5yZWNhbGN1bGFyVmFsT3RyYUNsYXNpTTNQcm9jZXNvcyhpb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIGZ1bmNpb25PSyhvTTNQcm9jZXNvcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbGltaW5hIHVuIG9iamV0byBNM090Q2xhc2lmaWNhY2lvbmVzIHBvbmllbmRvIHN1IHZhbG9yIHkgY2FudGlkYWQgZW4gY2Vyb1xyXG4gICAgICogQHBhcmFtIG9NM090Q2xhc2lmaWNhY2lvbmVzIFxyXG4gICAgICogQHBhcmFtIGlvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgZGVsZXRlUHJvZHVjdG9Gcm9tT3RyYXNDbGFzKG9NM090Q2xhc2lmaWNhY2lvbmVzOiBNM090Q2xhc2lmaWNhY2lvbmVzLCBpb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpOiBNM1Byb2Nlc29zIHtcclxuICAgICAgICBsZXQgcHJvZHVjdG9BY3R1YWwgPSBpb00zUHJvY2Vzb3MuTTNPdENsYXNpZmljYWNpb25lcy5maW5kKHggPT4geC5JZFByb2R1Y3RvID09IG9NM090Q2xhc2lmaWNhY2lvbmVzLklkUHJvZHVjdG8pO1xyXG4gICAgICAgIGlmIChwcm9kdWN0b0FjdHVhbCkge1xyXG4gICAgICAgICAgICBwcm9kdWN0b0FjdHVhbC5DYW50aWRhZCA9IDA7XHJcbiAgICAgICAgICAgIHByb2R1Y3RvQWN0dWFsLlZhbG9yID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zID0gdGhpcy5yZWNhbGN1bGFyVmFsT3RyYUNsYXNpTTNQcm9jZXNvcyhpb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIHJldHVybiBpb00zUHJvY2Vzb3M7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWNhbGN1bGEgZWwgdmFsb3IgZGUgTTNQcm9jZXNvcy5WYWxPdHJhQ2xhc2kgYSBwYXJ0aXIgZGUgbGEgc3VtYXRvcmlhIGRlIGxvcyBvYmpldG9zIGRlbnRybyBkZWwgYXJyZWdsbyBNM1Byb2Nlc29zLk0zT3RDbGFzaWZpY2FjaW9uZXNcclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgcmVjYWxjdWxhclZhbE90cmFDbGFzaU0zUHJvY2Vzb3Mob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBvTTNQcm9jZXNvcy5WYWxPdHJhQ2xhc2kgPSBvTTNQcm9jZXNvcy5NM090Q2xhc2lmaWNhY2lvbmVzLnJlZHVjZShmdW5jdGlvbiAoc3VtYSwgb00zT3RDbGFzaWZpY2FjaW9uZXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHN1bWEgKyBvTTNPdENsYXNpZmljYWNpb25lcy5WYWxvcjtcclxuICAgICAgICB9LCAwKVxyXG4gICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYSBsYSBleGlzdGVuY2lhIGRlIHVuIHByb2R1Y3RvIGRlbnRybyBkZSB1biBsYSBsaXN0YSBkZSBNM090Q2xhc2lmaWNhY2lvbmVzXHJcbiAgICAgKiBAcGFyYW0gbGlzdE0zT3RDbGFzaWZpY2FjaW9uZXMgXHJcbiAgICAgKiBAcGFyYW0gcHJvZHVjdCBcclxuICAgICAqL1xyXG4gICAgdmFsaWRhckV4aXN0YU90cmFDbGFzaWYobGlzdE0zT3RDbGFzaWZpY2FjaW9uZXM6IEFycmF5PE0zT3RDbGFzaWZpY2FjaW9uZXM+LCBwcm9kdWN0OiBUeXBlTTNQcmRHcnApIHtcclxuICAgICAgICBsZXQgcHJvZHVjdG9FeGlzdGUgPSBsaXN0TTNPdENsYXNpZmljYWNpb25lcy5maW5kKHggPT4geC5JZFByb2R1Y3RvID09IHByb2R1Y3QuTG9NM1ByZEdlbmVyYWxbMF0uU0tVKTtcclxuICAgICAgICByZXR1cm4gcHJvZHVjdG9FeGlzdGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICogTGltcGlhIGxvcyBkZXRhbGxlcyB5IGxvcyBpbXB1ZXN0b3MgZGUgdW4gcHJvZHVjdG8gZGFkbyBlbiB1biBwcm9jZXNvIGRlIGRldm9sdWNpb25cclxuICAgKiBAcGFyYW0gcHJvZHVjdG9Cb3JyYWRvIFxyXG4gICAqIEBwYXJhbSBwcm9jZXNvRGV2b2x1Y2lvbiBcclxuICAgKi9cclxuICAgIGRlbGV0ZVByZERldm9sdWNpb24ocHJvZHVjdG9Cb3JyYWRvLCBwcm9jZXNvRGV2b2x1Y2lvbjogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGxldCBwcm9kdWN0byA9IHByb2Nlc29EZXZvbHVjaW9uLk0zRU5DLmZpbmQoeCA9PiB4LklkUHJvZHVjdG8gPT0gcHJvZHVjdG9Cb3JyYWRvLklkUHJvZHVjdG8pO1xyXG4gICAgICAgIGlmIChwcm9kdWN0bykge1xyXG4gICAgICAgICAgICBwcm9kdWN0by5NM0RFVC5mb3JFYWNoKGRldCA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKCtkZXQuVmFsb3IpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0LlZhbG9yID0gXCIwXCI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgcHJvZHVjdG8uTTNQSW1wdWVzdG9zLmZvckVhY2goaW1wID0+IHtcclxuICAgICAgICAgICAgICAgIGltcC5WYWxvciA9IDA7XHJcbiAgICAgICAgICAgICAgICBpbXAuQmFzZSA9IDA7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFqdXN0YSBsb3MgVmFsb3JlcyBlbiBjYXNvIGRlIGVuY29udHJhciBkaWZlcmVuY2lhcyBwYXJhIHBvZGVyIGdlbmVyYXIgRkVcclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgYWp1c3RhZG9yVmFsb3Jlc0NGRElGcm9udChvTTNQcm9jZXNvczogTTNQcm9jZXNvcyk6IE0zUHJvY2Vzb3Mge1xyXG4gICAgICAgIGxldCBkaWZlcmVuY2lhID0gMDtcclxuICAgICAgICBsZXQgdG90YWxEZXNjdWVudG9zID0gdGhpcy5nZXRWYWxvclRvdGFsRGVzY3VlbnRvcyhvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgbGV0IHRvdGFsSW1wb3J0ZUltcHVlc3RvcyA9IHRoaXMuZ2V0VmFsb3JUb3RhbEltcG9ydGVJbXB1ZXN0b3Mob00zUHJvY2Vzb3MpO1xyXG5cclxuICAgICAgICBkaWZlcmVuY2lhID0gdGhpcy5vTWF0aFRGLnJvdW5kKG9NM1Byb2Nlc29zLlZhbG9yTmV0byAtIChvTTNQcm9jZXNvcy5WYWxvciArIHRvdGFsSW1wb3J0ZUltcHVlc3RvcyAtIHRvdGFsRGVzY3VlbnRvcyksIDMpO1xyXG4gICAgICAgIGlmIChkaWZlcmVuY2lhICE9IDApIHtcclxuICAgICAgICAgICAgaWYgKHRvdGFsSW1wb3J0ZUltcHVlc3RvcyA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWp1c3RhZG9ySW1wdWVzdG9zQ0ZESShkaWZlcmVuY2lhLCBvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFqdXN0YWRvckRlc2N1ZW50b3NDRkRJKGRpZmVyZW5jaWEsIG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBlbCB2YWxvciB0b3RhbCBkZSBwcm9tb2Npb25lcyBhcGxpY2FkYXMgZW4gZWwgcHJvY2VzbyBlbiBjdWVzdGnDs25cclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgZ2V0VmFsb3JUb3RhbERlc2N1ZW50b3Mob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpOiBudW1iZXIge1xyXG4gICAgICAgIGxldCB0b3RhbERlc2N1ZW50b3MgPSAwO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLmZvckVhY2goZW5jID0+IHtcclxuICAgICAgICAgICAgbGV0IGRldGFsbGVQcm9tbyA9IGVuYy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlRPVEFMUFJPTU9cIik7XHJcbiAgICAgICAgICAgIGlmIChkZXRhbGxlUHJvbW8pIHtcclxuICAgICAgICAgICAgICAgIHRvdGFsRGVzY3VlbnRvcyArPSArZGV0YWxsZVByb21vLlZhbG9yO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0b3RhbERlc2N1ZW50b3M7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGVsIHZhbG9yIHRvdGFsIGRlIGltcHVlc3RvcyBjb2JyYWRvcyBlbiBlbCBwcm9jZXNvIGVuIGN1ZXN0acOzblxyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFxyXG4gICAgICovXHJcbiAgICBnZXRWYWxvclRvdGFsSW1wb3J0ZUltcHVlc3RvcyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcyk6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IHRvdGFsSW1wb3J0ZUltcHVlc3RvcyA9IDA7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMuZm9yRWFjaChlbmMgPT4ge1xyXG4gICAgICAgICAgICBlbmMuTTNQSW1wdWVzdG9zLmZvckVhY2goaW1wID0+IHtcclxuICAgICAgICAgICAgICAgIHRvdGFsSW1wb3J0ZUltcHVlc3RvcyArPSAraW1wLlZhbG9yO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRvdGFsSW1wb3J0ZUltcHVlc3RvcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE11ZXZlIGVsIHZhbG9yIGRlIHVuIGltcHVlc3RvIGVuIDAuMDEgeSBzdSBjb3JyZXNwb25kaWVudGUgYmFzZSBwYXJhIHF1ZSBjdWFkcmUgbG9zIHZhbG9yZXMgYWwgdGltYnJhciBsYSBGRVxyXG4gICAgICogQHBhcmFtIGRpZmVyZW5jaWEgXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIGFqdXN0YWRvckltcHVlc3Rvc0NGREkoZGlmZXJlbmNpYTogbnVtYmVyLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGxldCBhanVzdG8gPSBmYWxzZTtcclxuICAgICAgICBmb3IgKGxldCBlbmMgb2Ygb00zUHJvY2Vzb3MuTTNFTkMpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaW1wIG9mIGVuYy5NM1BJbXB1ZXN0b3MpIHtcclxuICAgICAgICAgICAgICAgIGlmIChkaWZlcmVuY2lhID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGltcC5WYWxvciA9IGltcC5WYWxvciArIDAuMDE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpbXAuVmFsb3IgPSBpbXAuVmFsb3IgLSAwLjAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaW1wLkJhc2UgPSBpbXAuVmFsb3IgLyBpbXAuUG9yY2VudGFqZTtcclxuICAgICAgICAgICAgICAgIGFqdXN0byA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoYWp1c3RvKSB7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE11ZXZlIGVsIHZhbG9yIGRlIHVuIGRlc2N1ZW50byBlbiAwLjAxIHBhcmEgcXVlIGN1YWRyZSBsb3MgdmFsb3JlcyBhbCB0aW1icmFyIGxhIEZFXHJcbiAgICAgKiBAcGFyYW0gZGlmZXJlbmNpYSBcclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgYWp1c3RhZG9yRGVzY3VlbnRvc0NGREkoZGlmZXJlbmNpYTogbnVtYmVyLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGxldCBkZXRhbGxlVG90YWxQcm9tbzogTTNQRGV0YWxsZUl0ZW1zO1xyXG4gICAgICAgIGZvciAobGV0IGVuYyBvZiBvTTNQcm9jZXNvcy5NM0VOQykge1xyXG4gICAgICAgICAgICBkZXRhbGxlVG90YWxQcm9tbyA9IGVuYy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlRPVEFMUFJPTU9cIik7XHJcbiAgICAgICAgICAgIGlmIChkZXRhbGxlVG90YWxQcm9tbyAmJiArZGV0YWxsZVRvdGFsUHJvbW8uVmFsb3IgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGlmZXJlbmNpYSA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXRhbGxlVG90YWxQcm9tby5WYWxvciA9ICgrZGV0YWxsZVRvdGFsUHJvbW8uVmFsb3IgLSAwLjAxKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0YWxsZVRvdGFsUHJvbW8uVmFsb3IgPSAoK2RldGFsbGVUb3RhbFByb21vLlZhbG9yICsgMC4wMSkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRQcmRzR2VuZXJhbEZyb21NM1Byb2Nlc28oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lkS2F0aW9zOiBzdHJpbmcsIGpEYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTMvZ2V0UHJkc0dlbmVyYWxGcm9tTTNQcm9jZXNvLycgKyBzSWRLYXRpb3MsIGpEYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKEpTT04ucGFyc2UoZXJyLmVycm9yLk1lc3NhZ2UpKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG59XHJcbiJdfQ==