@sbb-esta/lyne-elements-experimental-dev 4.12.0-dev.1777535350 → 4.12.0-dev.1777541244

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 (45) hide show
  1. package/custom-elements.json +288 -167
  2. package/development/seat-reservation/common/types.d.ts +3 -4
  3. package/development/seat-reservation/common/types.d.ts.map +1 -1
  4. package/development/seat-reservation/seat-reservation/seat-reservation-base-element.d.ts +38 -7
  5. package/development/seat-reservation/seat-reservation/seat-reservation-base-element.d.ts.map +1 -1
  6. package/development/seat-reservation/seat-reservation/seat-reservation-base-element.js +143 -32
  7. package/development/seat-reservation/seat-reservation/seat-reservation.component.d.ts +2 -13
  8. package/development/seat-reservation/seat-reservation/seat-reservation.component.d.ts.map +1 -1
  9. package/development/seat-reservation/seat-reservation/seat-reservation.component.js +1 -1
  10. package/development/seat-reservation/seat-reservation-area/seat-reservation-area.component.js +1 -1
  11. package/development/seat-reservation/seat-reservation-area.js +1 -1
  12. package/development/seat-reservation/seat-reservation-graphic/seat-reservation-assets.js +1 -1
  13. package/development/seat-reservation/seat-reservation-graphic/seat-reservation-graphic.component.js +1 -1
  14. package/development/seat-reservation/seat-reservation-graphic.js +1 -1
  15. package/development/seat-reservation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.d.ts.map +1 -1
  16. package/development/seat-reservation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.js +1 -1
  17. package/development/seat-reservation/seat-reservation-navigation-coach.js +1 -1
  18. package/development/seat-reservation/seat-reservation.js +1 -1
  19. package/development/seat-reservation-area.component-BWdrKqek.js +96 -0
  20. package/development/seat-reservation-graphic.component-CN5sWn0I.js +129 -0
  21. package/development/{seat-reservation-navigation-coach.component-CjoDkcVU.js → seat-reservation-navigation-coach.component-tDZkXl-3.js} +3 -3
  22. package/development/seat-reservation.component-DyB5FVpD.js +464 -0
  23. package/development/seat-reservation.js +4 -4
  24. package/development/seat-reservation.pure.js +4 -4
  25. package/package.json +2 -2
  26. package/seat-reservation/seat-reservation/seat-reservation-base-element.js +130 -77
  27. package/seat-reservation/seat-reservation/seat-reservation.component.js +1 -1
  28. package/seat-reservation/seat-reservation-area/seat-reservation-area.component.js +1 -1
  29. package/seat-reservation/seat-reservation-area.js +1 -1
  30. package/seat-reservation/seat-reservation-graphic/seat-reservation-assets.js +1 -1
  31. package/seat-reservation/seat-reservation-graphic/seat-reservation-graphic.component.js +1 -1
  32. package/seat-reservation/seat-reservation-graphic.js +1 -1
  33. package/seat-reservation/seat-reservation-navigation-coach/seat-reservation-navigation-coach.component.js +1 -1
  34. package/seat-reservation/seat-reservation-navigation-coach.js +1 -1
  35. package/seat-reservation/seat-reservation.js +1 -1
  36. package/{seat-reservation-area.component-CtYawDjE.js → seat-reservation-area.component-B5_N7H_a.js} +1 -1
  37. package/seat-reservation-graphic.component-Dh1e2Pve.js +102 -0
  38. package/{seat-reservation-navigation-coach.component-sug9IBTH.js → seat-reservation-navigation-coach.component-BdCUfksf.js} +2 -2
  39. package/{seat-reservation.component-DajC6fqU.js → seat-reservation.component-DEtsEzex.js} +74 -81
  40. package/seat-reservation.js +4 -4
  41. package/seat-reservation.pure.js +4 -4
  42. package/development/seat-reservation-area.component-DbeuTnXT.js +0 -96
  43. package/development/seat-reservation-graphic.component-DlrHtlia.js +0 -129
  44. package/development/seat-reservation.component-DFJVFmrI.js +0 -510
  45. package/seat-reservation-graphic.component-Cm_pVxaB.js +0 -102
@@ -505,6 +505,8 @@ var SeatReservationBaseElement = (() => {
505
505
  Tab: "Tab",
506
506
  Enter: "Enter"
507
507
  };
508
+ this.seatReservationStructure = { decks: [] };
509
+ this.notFixedRotatableAreaIcons = ["ENTRY_EXIT"];
508
510
  this.notAreaElements = [
509
511
  "DRIVER_AREA",
510
512
  "DRIVER_AREA_NO_VERTICAL_WALL",
@@ -516,7 +518,12 @@ var SeatReservationBaseElement = (() => {
516
518
  "COMPARTMENT_PASSAGE_LOW",
517
519
  "COMPARTMENT_WALL"
518
520
  ];
519
- this.overHangingElementInformation = [];
521
+ this.middleBorderDockingElements = [
522
+ "DRIVER_AREA",
523
+ "DRIVER_AREA_NO_VERTICAL_WALL",
524
+ "COACH_PASSAGE",
525
+ "COACH_WALL_NO_PASSAGE"
526
+ ];
520
527
  this._isRunningInitPreselectCoachIndex = false;
521
528
  this._lastStartScrollPos = -1;
522
529
  this._prepareServiceIconsNavigation = (propertyIds) => {
@@ -536,26 +543,29 @@ var SeatReservationBaseElement = (() => {
536
543
  if (changedProperties.has("seatReservations")) {
537
544
  this.hasMultipleDecks = this.seatReservations?.length > 1;
538
545
  this._initPrepareSeatReservationData();
539
- this._prepareCoachWidthAndGapCalculations();
540
546
  this._initSeatReservationPlaceSelection();
541
547
  this.initNavigationSelectionByScrollEvent();
542
548
  }
543
549
  if (changedProperties.has("baseGridSize")) {
544
550
  this.coachBorderOffset = this.coachBorderPadding / this.baseGridSize;
545
551
  this.style?.setProperty("--sbb-seat-reservation-grid-size", `${this.baseGridSize}px`);
552
+ this._initPrepareSeatReservationData();
546
553
  this.initNavigationSelectionByScrollEvent();
547
554
  }
548
555
  if (changedProperties.has("height") && !!this.height) {
549
556
  const seatReservationLayer = this.seatReservations[this.currSelectedDeckIndex] || null;
550
557
  if (seatReservationLayer?.coachItems.length) {
551
- this.baseGridSize = this.height / seatReservationLayer.coachItems[0].dimension.h;
558
+ this.baseGridSize = Math.round(this.height / seatReservationLayer.coachItems[0].dimension.h);
552
559
  this.coachBorderOffset = this.coachBorderPadding / this.baseGridSize;
553
560
  this.style?.setProperty("--sbb-seat-reservation-grid-size", `${this.baseGridSize}px`);
554
561
  this._initPrepareSeatReservationData();
555
562
  this.initNavigationSelectionByScrollEvent();
556
563
  }
557
564
  }
558
- if (changedProperties.has("alignVertical") && this.alignVertical) this.initNavigationSelectionByScrollEvent();
565
+ if (changedProperties.has("alignVertical")) {
566
+ this._initPrepareSeatReservationData();
567
+ this.initNavigationSelectionByScrollEvent();
568
+ }
559
569
  if (changedProperties.has("preselectCoachIndex")) {
560
570
  this._isRunningInitPreselectCoachIndex = true;
561
571
  setTimeout(() => this.scrollToSelectedNavCoach(this.preselectCoachIndex), 1);
@@ -576,6 +586,7 @@ var SeatReservationBaseElement = (() => {
576
586
  this._determineBaseFontSize();
577
587
  if (this.hasMultipleDecks) this._initEmptyCoachDeckOffsets();
578
588
  this._prepareCoachItemDetailsData();
589
+ this._prepareSeatReservationStructureInformation();
579
590
  this._prepareOptimizeAreaIconDimensionByMedian();
580
591
  }
581
592
  /** Init scroll event handling for coach navigation */
@@ -600,16 +611,14 @@ var SeatReservationBaseElement = (() => {
600
611
  if (this.coachScrollArea && seatReservationDeck) {
601
612
  let currCalcTriggerPos = 0;
602
613
  this.scrollCoachesAreaWidth = this.alignVertical ? this.coachScrollArea.getBoundingClientRect().height : this.coachScrollArea.getBoundingClientRect().width;
603
- this.triggerCoachPositionsCollection = seatReservationDeck.coachItems.map((coach) => {
614
+ this.triggerCoachPositionsCollection = seatReservationDeck.coachItems.map((_, index) => {
615
+ const coachStructure = this.seatReservationStructure.decks[this.currSelectedDeckIndex].deckCoaches[index];
604
616
  const startPosX = currCalcTriggerPos;
605
- const coachWidth = this.getCalculatedDimension(coach.dimension).w;
606
- const currentCoachOverhangingInfo = this.overHangingElementInformation.find((e) => e.coachId === coach.id);
607
- const overhangingElementsPresent = currentCoachOverhangingInfo?.overhangingPlaces || currentCoachOverhangingInfo?.overhangingGraphicAreas;
608
- currCalcTriggerPos += coachWidth + (!overhangingElementsPresent ? this.gapBetweenCoaches : 2 * this.gapBetweenCoaches);
617
+ currCalcTriggerPos += coachStructure.width + (!coachStructure.hasOverhangingElements ? this.gapBetweenCoaches : 2 * this.gapBetweenCoaches);
609
618
  return {
610
619
  start: startPosX,
611
620
  end: currCalcTriggerPos,
612
- width: coachWidth
621
+ width: coachStructure.width
613
622
  };
614
623
  });
615
624
  this.maxCalcCoachesWidth = currCalcTriggerPos - this.gapBetweenCoaches;
@@ -1200,9 +1209,9 @@ var SeatReservationBaseElement = (() => {
1200
1209
  travelClass: this._prepareTravelClassNavigation(travelClasses),
1201
1210
  propertyIds: this._prepareServiceIconsNavigation(propertyIds),
1202
1211
  isDriverArea: coach.places ? coach.places.length === 0 : true,
1212
+ isLocomotive: this._isLocomotive(coach),
1203
1213
  driverAreaSide: this._prepareDriverAreaSideNavigation(coach),
1204
- freePlaces: this.getAvailableFreePlacesNumFromCoach(places),
1205
- driverAreaElements: this._setDriverAreasElements(coach)
1214
+ freePlaces: this.getAvailableFreePlacesNumFromCoach(places)
1206
1215
  });
1207
1216
  });
1208
1217
  }
@@ -1250,19 +1259,128 @@ var SeatReservationBaseElement = (() => {
1250
1259
  };
1251
1260
  }
1252
1261
  }
1253
- _prepareCoachWidthAndGapCalculations() {
1254
- if (this.seatReservations) this.seatReservations.forEach((seatReservation) => {
1255
- seatReservation?.coachItems?.forEach((coachItem) => {
1256
- const hasOverhangingPlaces = this._isOverhangingElementsPresent(coachItem.dimension.w, coachItem.places);
1257
- const filteredElements = coachItem.graphicElements?.filter((e) => e.icon && !this.notAreaElements.includes(e.icon));
1258
- const hasOverhangingGraphicAreas = this._isOverhangingElementsPresent(coachItem.dimension.w, filteredElements);
1259
- this.overHangingElementInformation.push({
1260
- coachId: coachItem.id,
1261
- overhangingPlaces: hasOverhangingPlaces,
1262
- overhangingGraphicAreas: hasOverhangingGraphicAreas
1262
+ _prepareSeatReservationStructureInformation() {
1263
+ if (this.seatReservations) {
1264
+ this.seatReservationStructure = { decks: [] };
1265
+ this.seatReservations.forEach((seatReservation, index) => {
1266
+ const seatReservationDeck = {
1267
+ deckIndex: index,
1268
+ deckCoaches: []
1269
+ };
1270
+ seatReservation?.coachItems?.forEach((coachItem) => {
1271
+ const allElemenets = (coachItem.graphicElements?.filter((e) => e.icon && !this.notAreaElements.includes(e.icon)))?.concat(coachItem.serviceElements || []).concat(coachItem.places || []) || [];
1272
+ const hasOverhangingElements = this._isOverhangingElementsPresent(coachItem.dimension.w, allElemenets);
1273
+ const areaElements = coachItem.graphicElements?.filter((graphicalElement) => !this.notAreaElements.includes(graphicalElement.icon)).map((ele) => this._getCalculatedDimensionPositionElement(ele, coachItem.dimension, true));
1274
+ const otherElements = coachItem.graphicElements?.filter((graphicalElement) => this.notAreaElements.includes(graphicalElement.icon)).map((ele) => this._getCalculatedDimensionPositionElement(ele, coachItem.dimension, false));
1275
+ const serviceElements = coachItem.serviceElements?.map((ele) => this._getCalculatedDimensionPositionElement(ele, coachItem.dimension, false));
1276
+ const borderMiddleElement = this._getCalculatedMiddleBorderElement(coachItem);
1277
+ const calcCoachDimension = this.getCalculatedDimension({ ...coachItem.dimension });
1278
+ const coachSturcture = {
1279
+ width: calcCoachDimension.w,
1280
+ height: calcCoachDimension.h,
1281
+ otherElements: otherElements || [],
1282
+ serviceElements: serviceElements || [],
1283
+ areaElements: areaElements || [],
1284
+ borderMiddleElement,
1285
+ hasOverhangingElements
1286
+ };
1287
+ seatReservationDeck.deckCoaches.push(coachSturcture);
1263
1288
  });
1289
+ this.seatReservationStructure.decks.push(seatReservationDeck);
1264
1290
  });
1291
+ }
1292
+ }
1293
+ /**
1294
+ * Returns the calculated position and dimension of the middle border.
1295
+ * To calculate the start + end coordinate and the dimension of the middle border coach graphic,
1296
+ * the existing docking coach graphics are analysed and used to calculate the required position and diemension information.
1297
+ * @returns BaseElement
1298
+ */
1299
+ _getCalculatedMiddleBorderElement(coach) {
1300
+ const borderHeight = (coach.dimension.h + this.coachBorderOffset * 2) * this.baseGridSize;
1301
+ let startBorderOffsetX = 0;
1302
+ let borderWidth = coach.dimension.w;
1303
+ if (coach.graphicElements) {
1304
+ const dockingElements = this._getFirstLastDockingElements(coach.graphicElements);
1305
+ if (dockingElements?.length == 2) {
1306
+ const firstDockingElement = dockingElements[0];
1307
+ const lastDockingElement = dockingElements[1];
1308
+ const endBorderOffsetX = firstDockingElement.position.x == 0 ? lastDockingElement.dimension.w : firstDockingElement.dimension.w;
1309
+ startBorderOffsetX = firstDockingElement.position.x == 0 ? firstDockingElement.dimension.w : lastDockingElement.dimension.w;
1310
+ borderWidth = coach.dimension.w - endBorderOffsetX - startBorderOffsetX;
1311
+ } else if (dockingElements?.length == 1) {
1312
+ const dockingElement = dockingElements[0];
1313
+ if (dockingElement.position.x === 0) {
1314
+ startBorderOffsetX = dockingElement.dimension.w;
1315
+ borderWidth = coach.dimension.w - dockingElement.dimension.w;
1316
+ } else if (dockingElement.position.x !== 0) borderWidth = coach.dimension.w - dockingElement.dimension.w;
1317
+ }
1318
+ }
1319
+ const yOffset = this.coachBorderPadding * -1;
1320
+ return {
1321
+ position: {
1322
+ x: startBorderOffsetX * this.baseGridSize,
1323
+ y: yOffset,
1324
+ z: 0
1325
+ },
1326
+ dimension: {
1327
+ w: borderWidth * this.baseGridSize,
1328
+ h: borderHeight
1329
+ }
1330
+ };
1331
+ }
1332
+ /**
1333
+ * Returns graphical elements describing the start and end border elements of the coach.
1334
+ * @returns BaseElement[]
1335
+ */
1336
+ _getFirstLastDockingElements(graphicElements) {
1337
+ const filteredDockingElements = (graphicElements.filter((ele) => this.middleBorderDockingElements.includes(ele.icon)) || []).sort((a, b) => {
1338
+ const posA = a.position.x;
1339
+ const posB = b.position.x;
1340
+ if (posA > posB) return 1;
1341
+ if (posA < posB) return -1;
1342
+ return 0;
1265
1343
  });
1344
+ return filteredDockingElements.filter((_, index) => index == 0 || index == filteredDockingElements.length - 1);
1345
+ }
1346
+ /**
1347
+ * Returns the calculated positions and dimensions of graphical, service and area elements
1348
+ * @returns BaseElement
1349
+ */
1350
+ _getCalculatedDimensionPositionElement(element, coachDimension, isCalcAreaElement) {
1351
+ const dim = { ...element.dimension };
1352
+ const pos = { ...element.position };
1353
+ const rotation = element.rotation || 0;
1354
+ const isNotFixedRotationGraphicalElement = this.notAreaElements.concat(this.notFixedRotatableAreaIcons).indexOf(element.icon) === -1;
1355
+ const calcRotation = this.alignVertical && isNotFixedRotationGraphicalElement ? rotation - 90 : rotation;
1356
+ let areaMounting = null;
1357
+ if (isCalcAreaElement) {
1358
+ const isNotTableGraphic = element.icon?.indexOf("TABLE") === -1;
1359
+ const areaProperty = element.icon && isNotTableGraphic ? element.icon : null;
1360
+ const stretchHeight = this.isElementDirectlyOnBorder(element, coachDimension) && areaProperty !== "ENTRY_EXIT";
1361
+ if (element.position.y === 0) {
1362
+ areaMounting = "upper-border";
1363
+ pos.y -= this.coachBorderOffset - this.coachBorderOffset / 3;
1364
+ } else if (element.position.y + element.dimension.h === coachDimension.h) {
1365
+ areaMounting = "lower-border";
1366
+ if (!stretchHeight) pos.y += this.coachBorderOffset - this.coachBorderOffset / 3;
1367
+ }
1368
+ if (stretchHeight) dim.h += this.coachBorderOffset - this.coachBorderOffset / 3;
1369
+ } else {
1370
+ if (element.position.y === 0) pos.y -= this.coachBorderOffset;
1371
+ if (coachDimension.h === element.position.y + element.dimension.h) dim.h += this.coachBorderOffset * 2;
1372
+ }
1373
+ dim.w *= this.baseGridSize;
1374
+ dim.h *= this.baseGridSize;
1375
+ pos.x *= this.baseGridSize;
1376
+ pos.y *= this.baseGridSize;
1377
+ return {
1378
+ icon: element.icon && element.icon.endsWith("DRIVER_AREA") ? element.icon?.concat("_", this.seatReservations[this.currSelectedDeckIndex].vehicleType) : element.icon,
1379
+ rotation: calcRotation,
1380
+ dimension: dim,
1381
+ position: pos,
1382
+ mounting: areaMounting
1383
+ };
1266
1384
  }
1267
1385
  /**
1268
1386
  * Returns the current selected place HTML element by currSelectedPlaceElementId.
@@ -1324,15 +1442,8 @@ var SeatReservationBaseElement = (() => {
1324
1442
  * @param coachItem
1325
1443
  * @private
1326
1444
  */
1327
- _setDriverAreasElements(coachItem) {
1328
- if (coachItem) return {
1329
- driverArea: coachItem.graphicElements?.find((element) => element.icon === "DRIVER_AREA"),
1330
- driverAreaNoVerticalWall: coachItem.type === "LOCOMOTIVE_COACH" ? coachItem.graphicElements?.find((element) => element.icon === "DRIVER_AREA_NO_VERTICAL_WALL") : void 0
1331
- };
1332
- return {
1333
- driverArea: void 0,
1334
- driverAreaNoVerticalWall: void 0
1335
- };
1445
+ _isLocomotive(coachItem) {
1446
+ return coachItem?.graphicElements?.find((element) => element.icon === "DRIVER_AREA_NO_VERTICAL_WALL") !== void 0;
1336
1447
  }
1337
1448
  /**
1338
1449
  * Is called when the SeatReservation loses focus, what happens when the user tabs out or clicks somewhere else.
@@ -1347,4 +1458,4 @@ var SeatReservationBaseElement = (() => {
1347
1458
  //#endregion
1348
1459
  export { SeatReservationBaseElement };
1349
1460
 
1350
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhdC1yZXNlcnZhdGlvbi1iYXNlLWVsZW1lbnQuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2VsZW1lbnRzLWV4cGVyaW1lbnRhbC9zZWF0LXJlc2VydmF0aW9uL3NlYXQtcmVzZXJ2YXRpb24vc2VhdC1yZXNlcnZhdGlvbi1iYXNlLWVsZW1lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNBcnJvd0tleU9yUGFnZUtleXNQcmVzc2VkIH0gZnJvbSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvY29yZS9hMTF5LmpzJztcbmltcG9ydCB7IFNiYkVsZW1lbnQgfSBmcm9tICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9jb3JlL2Jhc2UtZWxlbWVudHMuanMnO1xuaW1wb3J0IHsgZm9yY2VUeXBlIH0gZnJvbSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvY29yZS9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGlzU2VydmVyLCB0eXBlIFByb3BlcnR5VmFsdWVzIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGV2ZW50T3B0aW9ucywgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQge1xuICBtYXBDb2FjaEluZm9zVG9Db2FjaFNlbGVjdGlvbixcbiAgbWFwSWNvblRvU3ZnLFxuICBtYXBQbGFjZUFuZENvYWNoVG9TZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbixcbiAgbWFwUGxhY2VJbmZvc1RvUGxhY2VTZWxlY3Rpb24sXG59IGZyb20gJy4uL2NvbW1vbi9tYXBwZXIudHMnO1xuaW1wb3J0IHR5cGUge1xuICBCYXNlRWxlbWVudCxcbiAgQ29hY2hJdGVtLFxuICBDb2FjaE51bWJlck9mRnJlZVBsYWNlcyxcbiAgRWxlbWVudERpbWVuc2lvbixcbiAgRWxlbWVudFBvc2l0aW9uLFxuICBDb2FjaEl0ZW1EZXRhaWxzLFxuICBQbGFjZSxcbiAgUGxhY2VTZWxlY3Rpb24sXG4gIFBsYWNlVHJhdmVsQ2xhc3MsXG4gIFNlYXRSZXNlcnZhdGlvbixcbiAgU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24sXG4gIFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkQ29hY2gsXG4gIFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkUGxhY2VzLFxuICBUcmF2ZWxEaXJlY3Rpb24sXG59IGZyb20gJy4uL2NvbW1vbi90eXBlcy50cyc7XG5pbXBvcnQgdHlwZSB7IFNiYlNlYXRSZXNlcnZhdGlvblBsYWNlQ29udHJvbEVsZW1lbnQgfSBmcm9tICcuLi9zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wvc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sLmNvbXBvbmVudC50cyc7XG5cbmVudW0gU2Nyb2xsRGlyZWN0aW9uIHtcbiAgcmlnaHQgPSAncmlnaHQnLFxuICBsZWZ0ID0gJ2xlZnQnLFxufVxuXG5pbnRlcmZhY2UgQ29hY2hTY3JvbGxUcmlnZ2VyUG9pbnQge1xuICBzdGFydDogbnVtYmVyO1xuICBlbmQ6IG51bWJlcjtcbiAgd2lkdGg6IG51bWJlcjtcbn1cblxuY29uc3QgTUFYX1NFUlZJQ0VfUFJPUEVSVElFUyA9IDM7XG5jb25zdCBBTExPV0VEX1NFUlZJQ0VfSUNPTlM6IHN0cmluZ1tdID0gW1xuICAnc2Etdm8nLFxuICAnc2EtcnMnLFxuICAnc2EtYWJ0ZWlsa2luZGVyd2FnZW4nLFxuICAnc2Etd3InLFxuICAnc2EtZmEnLFxuICAnc2EtYnonLFxuICAnc2EtcnonLFxuXTtcblxuZXhwb3J0IGNsYXNzIFNlYXRSZXNlcnZhdGlvbkJhc2VFbGVtZW50IGV4dGVuZHMgU2JiRWxlbWVudCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZXZlbnRzID0ge1xuICAgIHNlbGVjdGVkcGxhY2VzOiAnc2VsZWN0ZWRwbGFjZXMnLFxuICAgIHNlbGVjdGVkY29hY2g6ICdzZWxlY3RlZGNvYWNoJyxcbiAgfSBhcyBjb25zdDtcblxuICAvKiogVGhlIHNlYXQgcmVzZXJ2YXRpb25zIGFycmF5IGNvbnRhaW5zIGFsbCBjb2FjaGVzIGFuZCBwbGFjZXMgKi9cbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnc2VhdC1yZXNlcnZhdGlvbnMnLCB0eXBlOiBBcnJheSB9KVxuICBwdWJsaWMgYWNjZXNzb3Igc2VhdFJlc2VydmF0aW9uczogU2VhdFJlc2VydmF0aW9uW10gPSBudWxsITtcblxuICAvKiogRGlzcGxheXMgYW4gYXJyb3cgc2hvd2luZyB3aGF0IGRpcmVjdGlvbiBkb2VzIHRyYWluIGRyaXZlKi9cbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAndHJhdmVsLWRpcmVjdGlvbicsIHR5cGU6IFN0cmluZyB9KVxuICBwdWJsaWMgYWNjZXNzb3IgdHJhdmVsRGlyZWN0aW9uOiBUcmF2ZWxEaXJlY3Rpb24gPSAnTk9ORSc7XG5cbiAgLyoqIFRoZSBzZWF0IHJlc2VydmF0aW9uIG5hdmlnYXRpb24gY2FuIGJlIHRvZ2dsZWQgYnkgdGhpcyBwcm9wZXJ0eSAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnaGFzLW5hdmlnYXRpb24nLCB0eXBlOiBCb29sZWFuIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBoYXNOYXZpZ2F0aW9uOiBib29sZWFuID0gdHJ1ZTtcblxuICAvKiogVGhlIHNlYXQgcmVzZXJ2YXRpb24gYXJlYSBpcyBhbGlnbmVkIHZlcnRpY2FsbHkgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2FsaWduLXZlcnRpY2FsJywgdHlwZTogQm9vbGVhbiwgcmVmbGVjdDogdHJ1ZSwgdXNlRGVmYXVsdDogdHJ1ZSB9KVxuICBwdWJsaWMgYWNjZXNzb3IgYWxpZ25WZXJ0aWNhbDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBUaGUgc2VhdCByZXNlcnZhdGlvbiBhcmVhJ3MgYmFzZSBncmlkIHNpemUgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2Jhc2UtZ3JpZC1zaXplJywgdHlwZTogTnVtYmVyIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBiYXNlR3JpZFNpemU6IG51bWJlciA9IDE2O1xuXG4gIC8qKiBUaGUgc2VhdCByZXNlcnZhdGlvbiBhcmVhJ3Mgd2lkdGggKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2hlaWdodCcsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgYWNjZXNzb3IgaGVpZ2h0OiBudW1iZXIgPSBudWxsITtcblxuICAvKiogTWF4aW1hbCBudW1iZXIgb2YgcG9zc2libGUgY2xpY2thYmxlIHNlYXRzICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdtYXgtc2VhdC1yZXNlcnZhdGlvbnMnLCB0eXBlOiBOdW1iZXIgfSlcbiAgcHVibGljIGFjY2Vzc29yIG1heFNlYXRSZXNlcnZhdGlvbnM6IG51bWJlciA9IC0xO1xuXG4gIC8qKiBNYXhpbWFsIG51bWJlciBvZiBwb3NzaWJsZSBjbGlja2FibGUgYmljeWNsZSBwbGFjZXMgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ21heC1iaWN5Y2xlLXJlc2VydmF0aW9ucycsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgYWNjZXNzb3IgbWF4QmljeWNsZVJlc2VydmF0aW9uczogbnVtYmVyID0gLTE7XG5cbiAgLyoqIEFueSBjbGljayBmdW5jdGlvbmFsaXR5IGlzIHByZXZlbnRlZCAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAncHJldmVudC1wbGFjZS1jbGljaycsIHR5cGU6IEJvb2xlYW4gfSlcbiAgcHVibGljIGFjY2Vzc29yIHByZXZlbnRQbGFjZUNsaWNrOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ3ByZXNlbGVjdC1jb2FjaC1pbmRleCcsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgYWNjZXNzb3IgcHJlc2VsZWN0Q29hY2hJbmRleDogbnVtYmVyID0gLTE7XG5cbiAgLyoqIFRoZSBzZWF0IHJlc2VydmF0aW9uIHRpdGxlIGluZm9ybWF0aW9uIGF0IHBsYWNlLWNvbnRyb2xzLCBuYXZpZ2F0aW9uLWNvYWNoZXMgYW5kIG5hdmlnYXRpb24tc2VydmljZXMgY2FuIGJlIHRvZ2dsZWQgYnkgdGhpcyBwcm9wZXJ0eSAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnc2hvdy10aXRsZS1pbmZvJywgdHlwZTogQm9vbGVhbiB9KVxuICBwdWJsaWMgYWNjZXNzb3Igc2hvd1RpdGxlSW5mbzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBzdGF0ZSgpIHByb3RlY3RlZCBhY2Nlc3NvciBzZWxlY3RlZENvYWNoSW5kZXg6IG51bWJlciA9IC0xO1xuICBAc3RhdGUoKSBwcm90ZWN0ZWQgYWNjZXNzb3IgZm9jdXNlZENvYWNoSW5kZXg6IG51bWJlciA9IC0xO1xuICBAc3RhdGUoKSBwcm90ZWN0ZWQgYWNjZXNzb3IgaG92ZXJlZENvYWNoSW5kZXg6IG51bWJlciA9IC0xO1xuXG4gIC8vIERlc2NyaWJlcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgYm9yZGVyIG9mIHRoZSBjb2FjaCBhbmQgdGhlIHBsYWNlcyBpbiBwaXhlbHNcbiAgcHJvdGVjdGVkIGNvYWNoQm9yZGVyUGFkZGluZyA9IDY7XG4gIC8vIERlc2NyaWJlcyB0aGUgZ2FwIGJldHdlZW4gdGhlIGNvYWNoZXMgaW4gcGl4ZWxzXG4gIHByb3RlY3RlZCBnYXBCZXR3ZWVuQ29hY2hlcyA9IDQ7XG4gIC8vIFRoZSBjYWxjdWxhdGVkIGNvYWNoQm9yZGVyT2Zmc2V0IGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIGNvYWNoIGJvcmRlciBncmFwaGljLFxuICAvLyBidXQgYWxzbyB0byBwb3NpdGlvbiBvdGhlciBncmFwaGljcyB0aGF0IGFyZSBhbGlnbmVkIGRpcmVjdGx5IHRvIHRoZSBjb2FjaCBib3JkZXIuXG4gIHByb3RlY3RlZCBjb2FjaEJvcmRlck9mZnNldCA9IHRoaXMuY29hY2hCb3JkZXJQYWRkaW5nIC8gdGhpcy5iYXNlR3JpZFNpemU7XG4gIC8vIERlc2NyaWJlcyB0aGUgZ2FwIGJldHdlZW4gdGhlIGNvYWNoZXMgZGVja3MgYnkgbXVsdGlwbGUgZGVjayB2aXN1YWxpemF0aW9uXG4gIHByb3RlY3RlZCBnYXBCZXR3ZWVuQ29hY2hEZWNrcyA9IDQ4O1xuICAvLyBEZXNjcmliZXMgdGhlIGZpeCB3aWR0aCBvZiBjb2FjaCBuYXZpZ2F0aW9uIGJ1dHRvblxuICBwcm90ZWN0ZWQgY29hY2hOYXZCdXR0b25EaW06IG51bWJlciA9IDA7XG4gIC8vIERlc2NyaWJlcyB0aGUgY2FsY3VsYXRlZCBkaW1lbnNpb24gZm9yIHRoZSBhcmVhIGljb25zLCB3aGljaCBpcyB1c2VkIHRvIHNldCB0aGUgbWF4IHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGFyZWEgaWNvbnNcbiAgcHJvdGVjdGVkIGdsb2JhbEFyZWFJY29uRGltOiBFbGVtZW50RGltZW5zaW9uID0geyB3OiAyLCBoOiAyIH07XG4gIC8vICNUSU1PLTQ1ODU4XG4gIC8vIERlc2NyaWJlcyB0aGUgcGFkZGluZyBmb3IgdGhlIGljb24gd2l0aGluIHRoZSBhcmVhIGFzIGEgcGVyY2VudGFnZSBzaXplIG9mIHRoZSBhcmVhIHNlbGYuIDgwJSAoMC44IHBlcmNlbnQpIGNvcnJlc3BvbmRzXG4gIC8vIHRvIGEgZ29vZCBvcHRpY2FsIHNpemUgYW5kIGNyZWF0ZXMgYSBnb29kIHBhZGRpbmcgZnJvbSB0aGUgYXJlYSB0aSBpY29uXG4gIHByb3RlY3RlZCBnbG9iYWxBcmVhSWNvblBhZGRpbmc6IG51bWJlciA9IDAuODtcbiAgcHJvdGVjdGVkIGNvYWNoSXRlbURldGFpbHNFbGVtZW50czogQ29hY2hJdGVtRGV0YWlsc1tdID0gW107XG4gIHByb3RlY3RlZCBjdXJyU2Nyb2xsRGlyZWN0aW9uOiBTY3JvbGxEaXJlY3Rpb24gPSBTY3JvbGxEaXJlY3Rpb24ucmlnaHQ7XG4gIHByb3RlY3RlZCBtYXhDYWxjQ29hY2hlc1dpZHRoOiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgc2Nyb2xsQ29hY2hlc0FyZWFXaWR0aDogbnVtYmVyID0gMDtcbiAgcHJvdGVjdGVkIHNjcm9sbE5hdmlnYXRpb25BcmVhRGltOiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgdHJpZ2dlckNvYWNoUG9zaXRpb25zQ29sbGVjdGlvbjogQ29hY2hTY3JvbGxUcmlnZ2VyUG9pbnRbXSA9IFtdO1xuICBwcm90ZWN0ZWQgbmF2aWdhdGlvblNjcm9sbEFyZWE6IEhUTUxFbGVtZW50ID0gbnVsbCE7XG4gIHByb3RlY3RlZCBjb2FjaFNjcm9sbEFyZWE6IEhUTUxFbGVtZW50ID0gbnVsbCE7XG4gIHByb3RlY3RlZCBjdXJyU2VsZWN0ZWRQbGFjZTogUGxhY2UgfCBudWxsID0gbnVsbDtcbiAgcHJvdGVjdGVkIGN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJvdGVjdGVkIGN1cnJTZWxlY3RlZENvYWNoSW5kZXg6IG51bWJlciA9IC0xO1xuICBwcm90ZWN0ZWQgY3VyclNlbGVjdGVkRGVja0luZGV4OiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgcHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrOiBib29sZWFuID0gZmFsc2U7XG4gIHByb3RlY3RlZCBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlczogU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXMgPSB7XG4gICAgc2VhdHM6IFtdLFxuICAgIGJpY3ljbGVzOiBbXSxcbiAgfTtcbiAgcHJvdGVjdGVkIHNlYXRSZXNlcnZhdGlvbldpdGhvdXROYXZpZ2F0aW9uSGFzRm9jdXMgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGlzQ29hY2hHcmlkRm9jdXNhYmxlID0gZmFsc2U7XG4gIHByb3RlY3RlZCBpc0F1dG9TY3JvbGxpbmcgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGlzS2V5Ym9hcmROYXZpZ2F0aW9uID0gZmFsc2U7XG4gIHByb3RlY3RlZCBoYXNNdWx0aXBsZURlY2tzID0gZmFsc2U7XG4gIHByb3RlY3RlZCBoYXNTZWF0UmVzZXJ2YXRpb25OYXRpdmVGb2N1cyA9IGZhbHNlO1xuICBwcm90ZWN0ZWQga2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzID0ge1xuICAgIEFycm93TGVmdDogJ0Fycm93TGVmdCcsXG4gICAgQXJyb3dSaWdodDogJ0Fycm93UmlnaHQnLFxuICAgIEFycm93VXA6ICdBcnJvd1VwJyxcbiAgICBBcnJvd0Rvd246ICdBcnJvd0Rvd24nLFxuICAgIFRhYjogJ1RhYicsXG4gICAgRW50ZXI6ICdFbnRlcicsXG4gIH0gYXMgY29uc3Q7XG5cbiAgLy8gR3JhcGhpY3MgdGhhdCBzaG91bGQgbm90IGJlIHJlbmRlcmVkIHdpdGggYW4gYXJlYVxuICBwcm90ZWN0ZWQgbm90QXJlYUVsZW1lbnRzID0gW1xuICAgICdEUklWRVJfQVJFQScsXG4gICAgJ0RSSVZFUl9BUkVBX05PX1ZFUlRJQ0FMX1dBTEwnLFxuICAgICdDT0FDSF9QQVNTQUdFJyxcbiAgICAnQ09BQ0hfV0FMTF9OT19QQVNTQUdFJyxcbiAgICAnQ09NUEFSVE1FTlRfUEFTU0FHRScsXG4gICAgJ0NPTVBBUlRNRU5UX1BBU1NBR0VfSElHSCcsXG4gICAgJ0NPTVBBUlRNRU5UX1BBU1NBR0VfTUlERExFJyxcbiAgICAnQ09NUEFSVE1FTlRfUEFTU0FHRV9MT1cnLFxuICAgICdDT01QQVJUTUVOVF9XQUxMJyxcbiAgXTtcblxuICBwcm90ZWN0ZWQgb3ZlckhhbmdpbmdFbGVtZW50SW5mb3JtYXRpb246IHtcbiAgICBjb2FjaElkOiBzdHJpbmc7XG4gICAgb3ZlcmhhbmdpbmdQbGFjZXM6IGJvb2xlYW47XG4gICAgb3ZlcmhhbmdpbmdHcmFwaGljQXJlYXM6IGJvb2xlYW47XG4gIH1bXSA9IFtdO1xuXG4gIHByaXZhdGUgX2lzUnVubmluZ0luaXRQcmVzZWxlY3RDb2FjaEluZGV4ID0gZmFsc2U7XG4gIHByaXZhdGUgX3Njcm9sbFRpbWVvdXQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9sYXN0U3RhcnRTY3JvbGxQb3MgPSAtMTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICAvLyBBZGQgYmx1ciBldmVudCBsaXN0ZW5lciBvbiB0aGUgZW50aXJlIGNvbXBvbmVudCB0byBkZXRlY3Qgd2hlbiB0aGUgdXNlciBsZWF2ZXMgdGhlIGNvbXBvbmVudFxuICAgIC8vIGJ5IHVzaW5nIHRhYiBuYXZpZ2F0aW9uIG9yIGNsaWNraW5nIG91dHNpZGUgb2YgdGhlIGNvbXBvbmVudC4gSW4gdGhpcyBjYXNlLCB3ZSBjYW4gcmVzZXQgdGhlIHNlbGVjdGVkIGNvYWNoIGFuZCBwbGFjZS5cbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCAoKSA9PiB0aGlzLl9vbkxlYXZlU2VhdFJlc2VydmF0aW9uQ29tcG9uZW50KCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHdpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPHRoaXM+KTogdm9pZCB7XG4gICAgc3VwZXIud2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdzZWF0UmVzZXJ2YXRpb25zJykpIHtcbiAgICAgIHRoaXMuaGFzTXVsdGlwbGVEZWNrcyA9IHRoaXMuc2VhdFJlc2VydmF0aW9ucz8ubGVuZ3RoID4gMTtcblxuICAgICAgdGhpcy5faW5pdFByZXBhcmVTZWF0UmVzZXJ2YXRpb25EYXRhKCk7XG4gICAgICB0aGlzLl9wcmVwYXJlQ29hY2hXaWR0aEFuZEdhcENhbGN1bGF0aW9ucygpO1xuICAgICAgdGhpcy5faW5pdFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKCk7XG4gICAgICB0aGlzLmluaXROYXZpZ2F0aW9uU2VsZWN0aW9uQnlTY3JvbGxFdmVudCgpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2Jhc2VHcmlkU2l6ZScpKSB7XG4gICAgICB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ID0gdGhpcy5jb2FjaEJvcmRlclBhZGRpbmcgLyB0aGlzLmJhc2VHcmlkU2l6ZTtcbiAgICAgIHRoaXMuc3R5bGU/LnNldFByb3BlcnR5KCctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyaWQtc2l6ZScsIGAke3RoaXMuYmFzZUdyaWRTaXplfXB4YCk7XG5cbiAgICAgIHRoaXMuaW5pdE5hdmlnYXRpb25TZWxlY3Rpb25CeVNjcm9sbEV2ZW50KCk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGhlaWdodCBpcyB1c2VkLCB0aGUgYmFzZUdyaWRTaXplIG11c3QgYmUgcmVjYWxjdWxhdGVkXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnaGVpZ2h0JykgJiYgISF0aGlzLmhlaWdodCkge1xuICAgICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uTGF5ZXIgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdIHx8IG51bGw7XG4gICAgICBpZiAoc2VhdFJlc2VydmF0aW9uTGF5ZXI/LmNvYWNoSXRlbXMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuYmFzZUdyaWRTaXplID0gdGhpcy5oZWlnaHQgLyBzZWF0UmVzZXJ2YXRpb25MYXllci5jb2FjaEl0ZW1zWzBdLmRpbWVuc2lvbi5oO1xuICAgICAgICB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ID0gdGhpcy5jb2FjaEJvcmRlclBhZGRpbmcgLyB0aGlzLmJhc2VHcmlkU2l6ZTtcbiAgICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JpZC1zaXplJywgYCR7dGhpcy5iYXNlR3JpZFNpemV9cHhgKTtcblxuICAgICAgICB0aGlzLl9pbml0UHJlcGFyZVNlYXRSZXNlcnZhdGlvbkRhdGEoKTtcbiAgICAgICAgdGhpcy5pbml0TmF2aWdhdGlvblNlbGVjdGlvbkJ5U2Nyb2xsRXZlbnQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdhbGlnblZlcnRpY2FsJykgJiYgdGhpcy5hbGlnblZlcnRpY2FsKSB7XG4gICAgICB0aGlzLmluaXROYXZpZ2F0aW9uU2VsZWN0aW9uQnlTY3JvbGxFdmVudCgpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ3ByZXNlbGVjdENvYWNoSW5kZXgnKSkge1xuICAgICAgLy8gc2V0VGltZW91dCBpcyBuZWNlc3NhcnkgYmVjYXVzZSB3aXRob3V0LCBfZ2V0Q29hY2hTY3JvbGxQb3NpdGlvblgoKSB3b3VsZCBmYWlsIHdpdGggTlBFIGJlY2F1c2VcbiAgICAgIC8vIHRoZSBjb2FjaFNjcm9sbEFyZWEgaXMgbm90IHlldCBpbml0aWFsaXplZFxuICAgICAgdGhpcy5faXNSdW5uaW5nSW5pdFByZXNlbGVjdENvYWNoSW5kZXggPSB0cnVlO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaCh0aGlzLnByZXNlbGVjdENvYWNoSW5kZXgpLCAxKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgbmF2aWdhdGVCeURpcmVjdGlvbkJ0bihidG5EaXJlY3Rpb246IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudW5mb2N1c1BsYWNlRWxlbWVudCgpO1xuICAgIGxldCBuYXZpZ2F0ZVRvQ29hY2hJbmRleCA9IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleDtcbiAgICBpZiAoYnRuRGlyZWN0aW9uID09ICdESVJFQ1RJT05fTEVGVCcgJiYgbmF2aWdhdGVUb0NvYWNoSW5kZXggPiAwKSB7XG4gICAgICBuYXZpZ2F0ZVRvQ29hY2hJbmRleCA9XG4gICAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCAhPSAtMSA/IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCAtIDEgOiAwO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBidG5EaXJlY3Rpb24gPT0gJ0RJUkVDVElPTl9SSUdIVCcgJiZcbiAgICAgIG5hdmlnYXRlVG9Db2FjaEluZGV4IDxcbiAgICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XT8uY29hY2hJdGVtcy5sZW5ndGggLSAxXG4gICAgKSB7XG4gICAgICBuYXZpZ2F0ZVRvQ29hY2hJbmRleCA9XG4gICAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCAhPSAtMSA/IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCArIDEgOiAwO1xuICAgIH1cblxuICAgIHRoaXMuc2Nyb2xsVG9TZWxlY3RlZE5hdkNvYWNoKG5hdmlnYXRlVG9Db2FjaEluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEYXRhIGNhbiBiZSBwcmVwYXJlZCBvbmNlIGZvciB0aGUgZW50aXJlIGNvbXBvbmVudFxuICAgKiBpbiBvcmRlciB0byBhdm9pZCByZWN1cnJpbmcgaXRlcmF0aW9uIHByb2Nlc3NlcyBpbiByZW5kZXJpbmcuXG4gICAqL1xuICBwcml2YXRlIF9pbml0UHJlcGFyZVNlYXRSZXNlcnZhdGlvbkRhdGEoKTogdm9pZCB7XG4gICAgdGhpcy5fZGV0ZXJtaW5lQmFzZUZvbnRTaXplKCk7XG5cbiAgICBpZiAodGhpcy5oYXNNdWx0aXBsZURlY2tzKSB7XG4gICAgICAvLyBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgZGVja3MsIHdlIG5lZWQgdG8gY2hlY2tcbiAgICAgIC8vIHdoZXRoZXIgZW1wdHkgY29hY2hlcyBuZWVkIHRvIGJlIGFkZGVkIG9uIGRpZmZlcmVudCBkZWNrIGxldmVsc1xuICAgICAgdGhpcy5faW5pdEVtcHR5Q29hY2hEZWNrT2Zmc2V0cygpO1xuICAgIH1cblxuICAgIHRoaXMuX3ByZXBhcmVDb2FjaEl0ZW1EZXRhaWxzRGF0YSgpO1xuICAgIHRoaXMuX3ByZXBhcmVPcHRpbWl6ZUFyZWFJY29uRGltZW5zaW9uQnlNZWRpYW4oKTtcbiAgfVxuXG4gIC8qKiBJbml0IHNjcm9sbCBldmVudCBoYW5kbGluZyBmb3IgY29hY2ggbmF2aWdhdGlvbiAqL1xuICBwcm90ZWN0ZWQgaW5pdE5hdmlnYXRpb25TZWxlY3Rpb25CeVNjcm9sbEV2ZW50KCk6IHZvaWQge1xuICAgIHRoaXMuY29hY2hTY3JvbGxBcmVhID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKFxuICAgICAgJyNzYmItc3JfX3dyYXBwZXItc2Nyb2xsYXJlYScsXG4gICAgKSBhcyBIVE1MRWxlbWVudDtcbiAgICB0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhID0gdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKFxuICAgICAgJyNzYmItc3JfX25hdmlnYXRpb24tbGlzdC1jb2FjaGVzJyxcbiAgICApIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uRGVjayA9IHRoaXMuc2VhdFJlc2VydmF0aW9uc1xuICAgICAgPyB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdXG4gICAgICA6IG51bGw7XG4gICAgaWYgKHNlYXRSZXNlcnZhdGlvbkRlY2sgJiYgc2VhdFJlc2VydmF0aW9uRGVjay5jb2FjaEl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIENhbGN1bGF0ZXMgdGhlIGFic29sdXRlIGhlaWdodCBvZiBvbmUgY29hY2ggaW5jbHVkaW5nIGJvcmRlciBwYWRkaW5nXG4gICAgICBjb25zdCBjb2FjaEhlaWdodFdpdGhCb3JkZXJQYWRkaW5nID1cbiAgICAgICAgc2VhdFJlc2VydmF0aW9uRGVjay5jb2FjaEl0ZW1zWzBdLmRpbWVuc2lvbi5oICogdGhpcy5iYXNlR3JpZFNpemUgKyB0aGlzLmNvYWNoQm9yZGVyUGFkZGluZztcblxuICAgICAgLy8gQ2FsY3VsYXRlIGVhY2ggZ2FwIGJldHdlZW4gbXVsdGlwbGUgY29hY2ggdGhlIGRlY2tzLlxuICAgICAgLy8gTm8gZ2FwIGV4aXN0IGlmIGp1c3Qgb25lIGNvYWNoIGRlY2sgZXhpc3QuXG4gICAgICBjb25zdCBnYXBCZXR3ZWVuQ29hY2hEZWNrcyA9ICh0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoIC0gMSkgKiB0aGlzLmdhcEJldHdlZW5Db2FjaERlY2tzO1xuXG4gICAgICB0aGlzLnN0eWxlPy5zZXRQcm9wZXJ0eShcbiAgICAgICAgJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24taGVpZ2h0JyxcbiAgICAgICAgYCR7Y29hY2hIZWlnaHRXaXRoQm9yZGVyUGFkZGluZyAqIHRoaXMuc2VhdFJlc2VydmF0aW9ucy5sZW5ndGggKyBnYXBCZXR3ZWVuQ29hY2hEZWNrc31gLFxuICAgICAgKTtcbiAgICAgIHRoaXMuc3R5bGU/LnNldFByb3BlcnR5KCctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWRlY2tzJywgYCR7dGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aH1gKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5uYXZpZ2F0aW9uU2Nyb2xsQXJlYSkge1xuICAgICAgdGhpcy5zY3JvbGxOYXZpZ2F0aW9uQXJlYURpbSA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICA/IHRoaXMubmF2aWdhdGlvblNjcm9sbEFyZWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0XG4gICAgICAgIDogdGhpcy5uYXZpZ2F0aW9uU2Nyb2xsQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcblxuICAgICAgLy8gSW5pdCB0aGUgY29hY2hOYXZCdXR0b25EaW0gZGltZW5zaW9uLCB3aGljaCBpcyBuZWVkZWQgdG8gY2FsY3VsYXRlIHRoZSBjb3JyZWN0IHNjcm9sbCBuYXZpZ2F0aW9uIGxhdGVyXG4gICAgICBjb25zdCBuYXZDb2FjaGVzTGlzdCA9IHRoaXMubmF2aWdhdGlvblNjcm9sbEFyZWEucXVlcnlTZWxlY3RvcigndWwgPiBsaScpIGFzIEhUTUxVTGlzdEVsZW1lbnQ7XG4gICAgICBpZiAobmF2Q29hY2hlc0xpc3QpIHtcbiAgICAgICAgY29uc3QgZmlyc3RMaUVsZURpbWVuc2lvbiA9IG5hdkNvYWNoZXNMaXN0Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdGhpcy5jb2FjaE5hdkJ1dHRvbkRpbSA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICAgID8gZmlyc3RMaUVsZURpbWVuc2lvbi5oZWlnaHRcbiAgICAgICAgICA6IGZpcnN0TGlFbGVEaW1lbnNpb24ud2lkdGg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29hY2hTY3JvbGxBcmVhICYmIHNlYXRSZXNlcnZhdGlvbkRlY2spIHtcbiAgICAgIC8vIEluaXQgdGhlIHN0YXJ0IG9mZnNldCBmb3IgdGhlIGNhbGN1bGF0aW9uIG9mIHRoZSBjb2FjaCBzY3JvbGwgdHJpZ2dlciBwb3NpdGlvbnNcbiAgICAgIGxldCBjdXJyQ2FsY1RyaWdnZXJQb3MgPSAwO1xuICAgICAgdGhpcy5zY3JvbGxDb2FjaGVzQXJlYVdpZHRoID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICAgID8gdGhpcy5jb2FjaFNjcm9sbEFyZWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0XG4gICAgICAgIDogdGhpcy5jb2FjaFNjcm9sbEFyZWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG5cbiAgICAgIC8vIFByZWNhbGN1bGF0ZSB0cmlnZ2VyIHNjcm9sbCBwb3NpdGlvbiBhcnJheSBkZXBlbmRzIG9uIGNvYWNoIHdpZHRoXG4gICAgICB0aGlzLnRyaWdnZXJDb2FjaFBvc2l0aW9uc0NvbGxlY3Rpb24gPSBzZWF0UmVzZXJ2YXRpb25EZWNrLmNvYWNoSXRlbXMubWFwKChjb2FjaCkgPT4ge1xuICAgICAgICBjb25zdCBzdGFydFBvc1ggPSBjdXJyQ2FsY1RyaWdnZXJQb3M7XG4gICAgICAgIGNvbnN0IGNvYWNoV2lkdGggPSB0aGlzLmdldENhbGN1bGF0ZWREaW1lbnNpb24oY29hY2guZGltZW5zaW9uKS53O1xuXG4gICAgICAgIC8vIENhbGN1bGF0aW9uIG9mIHRoZSBlbmQgc2Nyb2xsIHRyaWdnZXIgcG9zaXRpb24gb2YgYSBjb2FjaCwgaW5jbHVkaW5nIHRoZSBnYXAgYmV0d2VlbiB0aGUgY29hY2hlc1xuICAgICAgICAvLyBUaGUgZ2FwIGlzIG1heWJlIGFkanVzdGVkIGlmIG92ZXJoYW5naW5nIHBsYWNlcyBvciBncmFwaGljcyBleGlzdFxuICAgICAgICBjb25zdCBjdXJyZW50Q29hY2hPdmVyaGFuZ2luZ0luZm8gPSB0aGlzLm92ZXJIYW5naW5nRWxlbWVudEluZm9ybWF0aW9uLmZpbmQoXG4gICAgICAgICAgKGUpID0+IGUuY29hY2hJZCA9PT0gY29hY2guaWQsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IG92ZXJoYW5naW5nRWxlbWVudHNQcmVzZW50ID1cbiAgICAgICAgICBjdXJyZW50Q29hY2hPdmVyaGFuZ2luZ0luZm8/Lm92ZXJoYW5naW5nUGxhY2VzIHx8XG4gICAgICAgICAgY3VycmVudENvYWNoT3ZlcmhhbmdpbmdJbmZvPy5vdmVyaGFuZ2luZ0dyYXBoaWNBcmVhcztcbiAgICAgICAgY3VyckNhbGNUcmlnZ2VyUG9zICs9XG4gICAgICAgICAgY29hY2hXaWR0aCArXG4gICAgICAgICAgKCFvdmVyaGFuZ2luZ0VsZW1lbnRzUHJlc2VudCA/IHRoaXMuZ2FwQmV0d2VlbkNvYWNoZXMgOiAyICogdGhpcy5nYXBCZXR3ZWVuQ29hY2hlcyk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdGFydDogc3RhcnRQb3NYLFxuICAgICAgICAgIGVuZDogY3VyckNhbGNUcmlnZ2VyUG9zLFxuICAgICAgICAgIHdpZHRoOiBjb2FjaFdpZHRoLFxuICAgICAgICB9IGFzIENvYWNoU2Nyb2xsVHJpZ2dlclBvaW50O1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFNldCBtYXhpbXVtIGNhbGN1bGF0ZWQgY29hY2ggd2lkdGhcbiAgICAgIHRoaXMubWF4Q2FsY0NvYWNoZXNXaWR0aCA9IGN1cnJDYWxjVHJpZ2dlclBvcyAtIHRoaXMuZ2FwQmV0d2VlbkNvYWNoZXM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNjcm9sbCBldmVudCBoYW5kbGVyIG1hbmFnZWQgdGhlIGVuZCBvZiBzY3JvbGxpbmcgaW5zaWRlIHRoZSBjb2FjaCBzY3JvbGwgYXJlYS5cbiAgICogVGltZW91dCBldmVudCBoYW5kbGluZyB0byBjaGVjayBpZiB0aGUgc2Nyb2xsaW5nIGhhcyBiZWVuIGNvbXBsZXRlZC5cbiAgICogSXQgaXMgcmVxdWlyZWQgYmVjYXVzZSB0aGUgU2FmYXJpIGJyb3dzZXIgZG9lcyBub3QgaGFuZGxlIHNjcm9sbGVuZCBldmVudCxcbiAgICogYW5kIHdlIHRoZXJlZm9yZSBpbWl0YXRlIHRoaXMgZXZlbnQgLT4gc2Nyb2xsZW5kLlxuICAgKi9cbiAgQGV2ZW50T3B0aW9ucyh7IHBhc3NpdmU6IHRydWUgfSlcbiAgcHJvdGVjdGVkIGNvYWNoQXJlYVNjcm9sbGVuZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fc2Nyb2xsVGltZW91dCkge1xuICAgICAgLy8gRmlyc3QsIHdlIGNsZWFyZWQgdGhlIHJlZ2lzdGVyZWQgdGltZW91dCwgYXMgdGhlIHNjcm9sbGluZyBpcyBzdGlsbCBydW5uaW5nXG4gICAgICAvLyBhbmQgdGh1cyB3ZSBwcmV2ZW50IHRoZSBleGVjdXRpb24gb2YgdGhlIF9oYW5kbGVDb2FjaEFyZWFTY3JvbGxlbmRFdmVudCBmdW5jdGlvblxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3Njcm9sbFRpbWVvdXQpO1xuICAgIH1cbiAgICAvLyBJZiBubyBmdXJ0aGVyIHNjcm9sbCBldmVudCBpcyBmaXJlZCwgdGhlIG5leHQgdGltZW91dCBjYW4gZXhlY3V0ZSB0aGUgaW5uZXIgZnVuY3Rpb24gX2hhbmRsZUNvYWNoQXJlYVNjcm9sbGVuZEV2ZW50IHdpdGhvdXQgY2xlYXJpbmdcbiAgICB0aGlzLl9zY3JvbGxUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLl9oYW5kbGVDb2FjaEFyZWFTY3JvbGxlbmRFdmVudCgpLCAxNTApO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIG5vIG5hdmlnYXRpb24gZXhpc3RzIChwcm9wZXJ0eSBzZXR0aW5nIC0+IGhhc05hdmlnYXRpb24pIGFuZCBhIHRhYmxlIGNvYWNoIGdldHMgdGhlIGZvY3VzLFxuICAgKiB0aGUgZmlyc3QgcGxhY2UgaW4gdGhlIGNvYWNoIG11c3QgYmUgYXV0b21hdGljYWxseSBwcmVzZWxlY3RlZCB0byBjb250cm9sIHRoZSBwbGFjZSBuYXZpZ2F0aW9uIHZpYSBrZXlib2FyZFxuICAgKlxuICAgKiBAcGFyYW0gZm9jdXNDb2FjaEluZGV4XG4gICAqL1xuICBwcm90ZWN0ZWQgb25Gb2N1c1RhYmxlQ29hY2hBbmRQcmVzZWxlY3RQbGFjZShmb2N1c0NvYWNoSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWF0UmVzZXJ2YXRpb25XaXRob3V0TmF2aWdhdGlvbkhhc0ZvY3VzICYmICF0aGlzLmhhc05hdmlnYXRpb24pIHtcbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uV2l0aG91dE5hdmlnYXRpb25IYXNGb2N1cyA9IHRydWU7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPVxuICAgICAgICBmb2N1c0NvYWNoSW5kZXggPT09IDBcbiAgICAgICAgICA/IHRoaXMuZ2V0TmV4dEF2YWlsYWJsZUNvYWNoSW5kZXgoLTEpXG4gICAgICAgICAgOiB0aGlzLmdldFByZXZBdmFpbGFibGVDb2FjaEluZGV4KGZvY3VzQ29hY2hJbmRleCk7XG4gICAgICB0aGlzLnByZXNlbGVjdFBsYWNlSW5Db2FjaCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBXaWxsIGJlIHRyaWdnZXJlZCBieSBmb2N1cyBuYXZpZ2F0aW9uIGRpcmVjdGlvbiAqL1xuICBwcm90ZWN0ZWQgb25Gb2N1c05hdkRpcmVjdGlvbkJ1dHRvbigpOiB2b2lkIHtcbiAgICAvLyBJZiBhbnkgbmF2aWdhdGlvbiBkaXJlY3Rpb24gYnV0dG9uIChyaWdodHxsZWZ0KSBnZXQgdGhlIGZvY3VzLCBzbyB3ZSBoYXZlIG1hbnVhbCByZXNldCB0aGUgcHJldmlvdXMgZm9jdXNDb2FjaEluZGV4LlxuICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgfVxuXG4gIC8qKiBUQUIgS2V5IEV2ZW50IGhhbmRsaW5nIGZvciBDb2FjaCBOYXZpZ2F0aW9uICovXG4gIHByb3RlY3RlZCBvbktleU5hdmlnYXRpb25OYXZDb2FjaEJ1dHRvbihcbiAgICBldmVudDogS2V5Ym9hcmRFdmVudCxcbiAgICBjdXJyTmF2Q29hY2hCdXR0b25JbmRleDogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5UYWIpIHtcbiAgICAgIHRoaXMuX2hhbmRsZVRhYktleU5hdmlnYXRpb24oZXZlbnQsICduYXZpZ2F0aW9uJywgY3Vyck5hdkNvYWNoQnV0dG9uSW5kZXgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEJ5IHVzaW5nIGFueSBvdGhlciBrZXkgKG5vIFRBQikgaW5zaWRlIHRoZSBOYXZpZ2F0aW9uIGFyZWEsIHNvIHdlIGNhbiBoYW5kbGUgdGhpcyBieSB1c2luZyB0aGUgbG9naWMgZnJvbSBrZXlib2FyZFNlYXRtYXBFdmVudEhhbmRsaW5nXG4gICAgaWYgKGlzQXJyb3dLZXlPclBhZ2VLZXlzUHJlc3NlZChldmVudCkpIHtcbiAgICAgIHRoaXMua2V5Ym9hcmRTZWF0bWFwRXZlbnRIYW5kbGluZyhldmVudCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEdlbmVyYWwgVEFCIEtleSBFdmVudCBoYW5kbGluZyBmb3IgdGFiIG5hdmlnYXRpb24gaW5zaWRlIHRoZSBjb2FjaCBuYXZpZ2F0aW9uIGFyZWEgYW5kIHRoZSBzZWF0bWFwIGFyZWEgKi9cbiAgcHJpdmF0ZSBfaGFuZGxlVGFiS2V5TmF2aWdhdGlvbihcbiAgICBldmVudDogS2V5Ym9hcmRFdmVudCxcbiAgICBldmVudEFyZWE6IHN0cmluZyxcbiAgICBjdXJyVGFiSW5kZXg/OiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHByZXNzZWRLZXkgPSBldmVudC5rZXk7XG4gICAgY29uc3QgcHJlc3NlZFNoaWZ0VGFiID0gZXZlbnQuc2hpZnRLZXk7XG5cbiAgICBpZiAocHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuVGFiKSB7XG4gICAgICAvLyBIYW5kbGUgVEFCIGtleSBldmVudCBuYXZpZ2F0aW9uIGZvciBjb2FjaCBuYXZpZ2F0aW9uIGFyZWEuXG4gICAgICAvLyBGcHIgY29hY2ggbmF2aWdhdGlvbiB3ZSBqdXN0IGNvbnRyb2wgdGhlIGZvY3VzIGluZGV4IHRvIHZpc3VhbGl6ZSBmb2N1cyBzdHlsZSBmb3IgbmF2IGNvYWNoIGJ1dHRvblxuICAgICAgaWYgKGV2ZW50QXJlYSA9PSAnbmF2aWdhdGlvbicpIHtcbiAgICAgICAgaWYgKGN1cnJUYWJJbmRleCA9PSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXgpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSB8fFxuICAgICAgICAgICAgIXByZXNzZWRTaGlmdFRhYiB8fFxuICAgICAgICAgICAgdGhpcy5jb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHNbY3VyclRhYkluZGV4XS5pc0RyaXZlckFyZWEgfHxcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPT0gLTFcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSBjdXJyVGFiSW5kZXg7XG4gICAgICAgICAgfSBlbHNlIGlmIChwcmVzc2VkU2hpZnRUYWIgJiYgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSkge1xuICAgICAgICAgICAgLy9JZiB0aGUgRm9yIGJhY2sgdGFiYmluZywgd2UganVtcFxuICAgICAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgICAgICAgICAgdGhpcy5mb2N1c1BsYWNlRWxlbWVudCh0aGlzLmN1cnJTZWxlY3RlZFBsYWNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IGN1cnJUYWJJbmRleCE7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zY3JvbGxUb1NlbGVjdGVkTmF2aWdhdGlvbkJ1dHRvbihjdXJyVGFiSW5kZXghKTtcbiAgICAgIH1cbiAgICAgIC8vIEhhbmRsZSBUQUIga2V5IGV2ZW50IG5hdmlnYXRpb24gZm9yIHNlYXRtYXAgYXJlYVxuICAgICAgZWxzZSBpZiAoZXZlbnRBcmVhID09ICdzZWF0bWFwJykge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAocHJlc3NlZFNoaWZ0VGFiKSB7XG4gICAgICAgICAgdGhpcy5fbmF2aWdhdGVDb2FjaE5hdmlnYXRpb25CeUtleWJvYXJkKCdQUkVWX1RBQicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX25hdmlnYXRlQ29hY2hOYXZpZ2F0aW9uQnlLZXlib2FyZCgnTkVYVF9UQUInKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXNhdGlvbiBvZiBLZXlib2FyZCBTZWF0bWFwIGV2ZW50IGhhbmRsaW5nIHRvIG5hdmlnYXRpb24gYmV0d2VlbiBlYWNoIHBsYWNlcyBpbnNpZGUgYSBzZWxlY3RlZCBjb2FjaCBieSB1c2luZyBbYXJyb3ddIGtleXMuXG4gICAqIFdpdGggdGhlIFtUQUJdIGtleSB0aGUgdXNlciBuYXZpZ2F0aW9uIGdvZXMgdG8gdGhlIG5leHQgY29hY2ggbmF2aWdhdGlvbiBlbGVtZW50IGFuZCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlIGlzIGF1dG9tYXRpY2FsbHkgcmVzZXQuXG4gICAqL1xuICBwcm90ZWN0ZWQga2V5Ym9hcmRTZWF0bWFwRXZlbnRIYW5kbGluZyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGlzVGFiTmV4dCA9IGV2ZW50LmtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuVGFiO1xuICAgIGNvbnN0IGlzVGFiUHJldiA9IGV2ZW50LnNoaWZ0S2V5ICYmIGlzVGFiTmV4dDtcblxuICAgIC8vIElmIG5vIG5hdmlnYXRpb24gZXhpc3QgYW5kIHRoZSBmaXJzdCBvciBsYXN0IGNvYWNoIGlzIHNlbGVjdGVkLCB0aGUgdGhlIHVzZSB0cmllcyB0byBsZWF2ZSB0aGUgc2VhdCByZXNlcnZhdGlvbiBjb21wb25lbnQgYnkgdXNpbmcgdGFiLFxuICAgIC8vIHNvIHdlIGNhbiByZXR1cm4gaGVyZSBhbmQgYWxsb3cgdGhlIG5hdGl2ZSBmb2N1cyB0byBsZWF2ZSB0aGUgY29tcG9uZW50LlxuICAgIGlmIChcbiAgICAgICghdGhpcy5oYXNOYXZpZ2F0aW9uICYmIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9PT0gMCAmJiBpc1RhYlByZXYpIHx8XG4gICAgICAodGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID09PSB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50cy5sZW5ndGggLSAxICYmIGlzVGFiTmV4dClcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwcmVzc2VkS2V5ID0gZXZlbnQua2V5O1xuICAgIHRoaXMucHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrID0gZmFsc2U7XG4gICAgLy8gQ2hlY2sgYW55IGtleWJvYXJkIGV2ZW50IHdhcyB0cmlnZ2VyZWQgaW5zaWRlIHRoZSBzZWF0IHJlc2VydmF0aW9uIGNvbXBvbmVudCxcbiAgICAvLyBzbyB3ZSBjYW4gc2F5IHRoZSBuYXRpdmUgYnJvd3NlciBmb2N1cyBsaWVzIG9uIHRoZSBjb21wb25lbnRcbiAgICBpZiAoIXRoaXMuaGFzU2VhdFJlc2VydmF0aW9uTmF0aXZlRm9jdXMgJiYgKGlzVGFiTmV4dCB8fCBpc1RhYlByZXYpKSB7XG4gICAgICB0aGlzLmhhc1NlYXRSZXNlcnZhdGlvbk5hdGl2ZUZvY3VzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBJZiBhbnkgcGxhY2UgaXMgc2VsZWN0ZWQgYW5kIFRBQiBLZXkgY29tYmluYXRpb24gaXN0IHByZXNzZWQsXG4gICAgLy8gdGhlbiB3ZSBoYW5kbGUgdGhlIG5leHQgb3IgcHJldmlvdXMgY29hY2ggc2VsZWN0aW9uXG4gICAgaWYgKGlzVGFiTmV4dCkge1xuICAgICAgdGhpcy5faGFuZGxlVGFiS2V5TmF2aWdhdGlvbihldmVudCwgJ3NlYXRtYXAnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBcnJvdyBLZXlib2FyZCBuYXZpZ2F0aW9uIHRvIGNvbnRyb2wgcGxhY2VzIGluc2lkZSB0aGUgc2VhdG1hcFxuICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggIT09IC0xICYmIGlzQXJyb3dLZXlPclBhZ2VLZXlzUHJlc3NlZChldmVudCkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIHN3aXRjaCAocHJlc3NlZEtleSkge1xuICAgICAgICBjYXNlIHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93TGVmdDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBwcmVzc2VkTGVmdEtleU1hcHBpbmc6IHN0cmluZyA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICAgICAgICA/IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93RG93blxuICAgICAgICAgICAgICA6IHByZXNzZWRLZXk7XG4gICAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRMZWZ0S2V5TWFwcGluZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgcHJlc3NlZFJpZ2h0S2V5TWFwcGluZzogc3RyaW5nID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICAgICAgICAgID8gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dVcFxuICAgICAgICAgICAgICA6IHByZXNzZWRLZXk7XG4gICAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRSaWdodEtleU1hcHBpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1VwOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXNzZWRVcEtleU1hcHBpbmc6IHN0cmluZyA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICAgICAgICA/IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93TGVmdFxuICAgICAgICAgICAgICA6IHByZXNzZWRLZXk7XG4gICAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRVcEtleU1hcHBpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0Rvd246XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgcHJlc3NlZERvd25LZXlNYXBwaW5nOiBzdHJpbmcgPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgICAgICAgICAgPyB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1JpZ2h0XG4gICAgICAgICAgICAgIDogcHJlc3NlZEtleTtcbiAgICAgICAgICAgIHRoaXMuX25hdmlnYXRlVG9QbGFjZUJ5S2V5Ym9hcmQocHJlc3NlZERvd25LZXlNYXBwaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgYSBwbGFjZSBpbnNpZGUgdGhlIGNvYWNoIGlmIG5hdmlnYXRlZCB2aWEga2V5Ym9hcmQsXG4gICAqIG90aGVyd2lzZSB0aGUgY29hY2ggZ3JpZCBpcyBzZWxlY3RlZCAobmVjZXNzYXJ5IGZvciBTY3JlZW5SZWFkZXIpXG4gICAqL1xuICBwcm90ZWN0ZWQgcHJlc2VsZWN0UGxhY2VJbkNvYWNoKCk6IHZvaWQge1xuICAgIC8vIE5vIHByZXNlbGVjdCBwbGFjZSBieSBtYW51YWwgc2VhdG1hcCBzY3JvbGxpbmdcbiAgICBpZiAoIXRoaXMuaXNBdXRvU2Nyb2xsaW5nKSByZXR1cm47XG5cbiAgICAvLyBObyBhdXRvIHBsYWNlIHByZXNlbGVjdGlvbiBieSBydW5uaW5nIHRoZSBwcmVzZWxlY3QgY29hY2ggaW5kZXhcbiAgICBpZiAodGhpcy5faXNSdW5uaW5nSW5pdFByZXNlbGVjdENvYWNoSW5kZXgpIHtcbiAgICAgIHRoaXMuX2lzUnVubmluZ0luaXRQcmVzZWxlY3RDb2FjaEluZGV4ID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRm9yIERyaXZlckFyZWEgb3IgRW1wdHkgY29hY2ggKG5vIHBsYWNlcyksIG5vIHBsYWNlIGlzIHNlbGVjdGFibGUsIHNvIHdlIHJldHVybiBkaXJlY3RseVxuICAgIGlmIChcbiAgICAgIHRoaXMuY29hY2hJdGVtRGV0YWlsc0VsZW1lbnRzW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF0gJiZcbiAgICAgIHRoaXMuY29hY2hJdGVtRGV0YWlsc0VsZW1lbnRzW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF0uaXNEcml2ZXJBcmVhXG4gICAgKSB7XG4gICAgICB0aGlzLl9zZXRGb2N1c1RvU2VsZWN0ZWRDb2FjaEdyaWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBPbmx5IHdoZW4ga2V5Ym9hcmQgbmF2aWdhdGlvbiBpcyB1c2VkIGFuZCBjb2FjaGVzIGFyZSBzY3JvbGxlZCBieSBhdXRvIHNjcm9sbGluZyxcbiAgICAvLyB0aGVuIHdlIGNhbiBzZXQgdGhlIGZvY3VzIG9uIHRoZSBmaXJzdCBwbGFjZSBpbiB0aGUgY29hY2guXG4gICAgaWYgKHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb24gJiYgdGhpcy5pc0F1dG9TY3JvbGxpbmcpIHtcbiAgICAgIGNvbnN0IGNsb3Nlc3RQbGFjZSA9IHRoaXMuX2dldENsb3Nlc3RQbGFjZUJ5S2V5RGlyZWN0aW9uKCk7XG4gICAgICAvL0lmIGNsb3Nlc3RQbGFjZSBleGlzdCwgd2UgaGF2ZSB0byB1bmZvY3VzIHByZXZpb3VzIGZvY3VzZWQgcGxhY2VcbiAgICAgIGlmIChjbG9zZXN0UGxhY2UpIHtcbiAgICAgICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG4gICAgICAgIHRoaXMuZm9jdXNQbGFjZUVsZW1lbnQoY2xvc2VzdFBsYWNlKTtcbiAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSWYgYSBjb2FjaCB3YXMgc2VsZWN0ZWQgd2l0aCBubyBwbGFjZXMsIHRoZW4gd2UgaGF2ZSB0byBmb2N1cyB0aGUgY29hY2hHcmlkXG4gICAgICAgIHRoaXMuX3NldEZvY3VzVG9TZWxlY3RlZENvYWNoR3JpZCgpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBJbiBjYXNlcyB3aGVyZSB0aGUgcHJlc2VsZWN0aW9uIGZ1bmN0aW9uIGlzIHRyaWdnZXJlZCBieSBub3JtYWwgY2xpY2tpbmcgb3IgdmlhIHNjcmVlbiByZWFkZXIgdmlhIHRhYixcbiAgICAvLyB3ZSBvbmx5IGZvY3VzIHRoZSB0YWJsZSB3aXRob3V0IGRpcmVjdGx5IGZvY3VzaW5nIHRoZSBwbGFjZS5cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMudW5mb2N1c1BsYWNlRWxlbWVudCgpO1xuXG4gICAgICB0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlID0gdHJ1ZTtcbiAgICAgIHRoaXMuX3NldEZvY3VzVG9TZWxlY3RlZENvYWNoR3JpZCgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBzY3JvbGxUb1NlbGVjdGVkTmF2Q29hY2goc2VsZWN0ZWROYXZDb2FjaEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLl9pc1ZhbGlkQ29hY2hJbmRleChzZWxlY3RlZE5hdkNvYWNoSW5kZXgpICYmXG4gICAgICBzZWxlY3RlZE5hdkNvYWNoSW5kZXggIT09IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleFxuICAgICkge1xuICAgICAgdGhpcy5ob3ZlcmVkQ29hY2hJbmRleCA9IHNlbGVjdGVkTmF2Q29hY2hJbmRleDtcbiAgICAgIHRoaXMuaXNBdXRvU2Nyb2xsaW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMuaXNDb2FjaEdyaWRGb2N1c2FibGUgPSB0cnVlO1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID0gc2VsZWN0ZWROYXZDb2FjaEluZGV4O1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggPSB0aGlzLl9nZXRFeGlzdGluZ0NvYWNoRGVja0luZGV4KCk7XG4gICAgICB0aGlzLl9zZXRTY3JvbGxEaXJlY3Rpb25CeUNvYWNoSW5kZXgoKTtcblxuICAgICAgY29uc3Qgc2Nyb2xsVG9Db2FjaFBvc1ggPSB0aGlzLl9nZXRDb2FjaFNjcm9sbFBvc2l0aW9uWCgpO1xuICAgICAgY29uc3QgaXNTZWxlY3RlZENvYWNoSW5kZXhTY3JvbGxhYmxlID1cbiAgICAgICAgdGhpcy5zZWxlY3RlZENvYWNoSW5kZXggIT09IC0xIHx8IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA+IDA7XG5cbiAgICAgIC8vIENoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IHNjcm9sbCBwb3NpdGlvbiBhbGxvd3Mgc2Nyb2xsaW5nIHRvIHRoZSBuZXh0IHdhZ29uIG9yIG5vdFxuICAgICAgaWYgKGlzU2VsZWN0ZWRDb2FjaEluZGV4U2Nyb2xsYWJsZSAmJiB0aGlzLl9pc1Njcm9sbGFibGVUb1NlbGVjdGVkQ29hY2goKSkge1xuICAgICAgICB0aGlzLl9sYXN0U3RhcnRTY3JvbGxQb3MgPSB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxMZWZ0O1xuICAgICAgICB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxUbyh7XG4gICAgICAgICAgdG9wOiB0aGlzLmFsaWduVmVydGljYWwgPyBzY3JvbGxUb0NvYWNoUG9zWCA6IDAsXG4gICAgICAgICAgbGVmdDogdGhpcy5hbGlnblZlcnRpY2FsID8gMCA6IHNjcm9sbFRvQ29hY2hQb3NYLFxuICAgICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJyxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnVwZGF0ZUN1cnJlbnRTZWxlY3RlZENvYWNoKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEF1dG9tYXRpYyBzY3JvbGxpbmcgdG8gdGhlIHNlbGVjdGVkIGNvYWNoIGluIHRoZSBtYWluIG5hdmlnYXRpb25cbiAgICAgIHRoaXMuX3Njcm9sbFRvU2VsZWN0ZWROYXZpZ2F0aW9uQnV0dG9uKHNlbGVjdGVkTmF2Q29hY2hJbmRleCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGZvY3VzUGxhY2VFbGVtZW50KHBsYWNlOiBQbGFjZSB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcbiAgICBpZiAocGxhY2UpIHtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UgPSBwbGFjZTtcbiAgICAgIHRoaXMuX3NldEN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkKHBsYWNlKTtcblxuICAgICAgY29uc3Qgc2VsZWN0ZWRQbGFjZUVsZW1lbnQgPSB0aGlzLl9nZXRQbGFjZUh0bWxFbGVtZW50KCk7XG4gICAgICBpZiAoc2VsZWN0ZWRQbGFjZUVsZW1lbnQpIHtcbiAgICAgICAgc2VsZWN0ZWRQbGFjZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdrZXlmb2N1cycsICdmb2N1cycpO1xuXG4gICAgICAgIC8vVHJ5IHRvIHNjcm9sbCBmb2N1c2VkIHBsYWNlIGludG8gdGhlIHZpZXdwb3J0XG4gICAgICAgIGNvbnN0IGRlbGF5U2Nyb2xsSW5WaWV3cG9ydCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHBsYWNlSWQgPSB0aGlzLmdldFBsYWNlRWxlbWVudElkKFxuICAgICAgICAgICAgdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXgsXG4gICAgICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXgsXG4gICAgICAgICAgICBwbGFjZS5udW1iZXIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLl9zY3JvbGxQbGFjZUludG9OZWFyZXN0Vmlld3BvcnQocGxhY2VJZCk7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KGRlbGF5U2Nyb2xsSW5WaWV3cG9ydCk7XG4gICAgICAgIH0sIDApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCB1bmZvY3VzUGxhY2VFbGVtZW50KCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkUGxhY2VFbGVtZW50ID0gdGhpcy5fZ2V0UGxhY2VIdG1sRWxlbWVudCgpO1xuICAgIGlmIChzZWxlY3RlZFBsYWNlRWxlbWVudCkge1xuICAgICAgc2VsZWN0ZWRQbGFjZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdrZXlmb2N1cycsICd1bmZvY3VzJyk7XG4gICAgICB0aGlzLl9zZXRDdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZChudWxsKTtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDYWxjdWxhdGVkRGltZW5zaW9uKFxuICAgIGVsZW1lbnREaW1lbnNpb246IEVsZW1lbnREaW1lbnNpb24sXG4gICAgY29hY2hEaW1lbnNpb24/OiBFbGVtZW50RGltZW5zaW9uLFxuICAgIGlzT3JpZ2luSGVpZ2h0PzogYm9vbGVhbixcbiAgICBpc1N0cmV0Y2hIZWlnaHQ/OiBib29sZWFuLFxuICApOiBFbGVtZW50RGltZW5zaW9uIHtcbiAgICBpZiAoY29hY2hEaW1lbnNpb24gJiYgIWlzT3JpZ2luSGVpZ2h0KSB7XG4gICAgICAvLyBTaW5jZSB0aGUgaGVpZ2h0IG9mIHRoZSBjb2FjaCBoYXMgYmVlbiB2aXN1YWxseSBleHBhbmRlZCB0byBtYWludGFpbiBhIGRpc3RhbmNlIGJldHdlZW4gdGhlIGJvcmRlciBvZiB0aGUgY29hY2ggYW5kIHRoZSBwbGFjZXMsXG4gICAgICAvLyBzb21lIGdyYXBoaWNzIG11c3QgYWxzbyBiZSBhZGFwdGVkIHRvIHRoZSBoZWlnaHQsIHdoaWNoIGVuZCB3aXRoIHRoZSBib3JkZXJzIG9mIHRoZSBjb2FjaFxuICAgICAgZWxlbWVudERpbWVuc2lvbi5oICs9IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQgKiAyO1xuICAgIH1cblxuICAgIGlmIChpc1N0cmV0Y2hIZWlnaHQpIHtcbiAgICAgIC8vIEluIHRoZSBjYXNlIG9mIGdyYXBoaWNzIGFyZSBhc3NpZ25lZCBkaXJlY3RseSBhdCB0aGUgYm9yZGVyIG9mIHRoZSBjb2FjaCxcbiAgICAgIC8vIHRoZXNlIGdyYXBoaWNzIG11c3QgYmUgZXhwYW5kZWQgaW4gaGVpZ2h0IGJ5IGEgY29hY2hCb3JkZXJPZmZzZXQgaW4gb3JkZXIgdG8gcmVhY2ggdGhlaXIgb3JpZ2luYWwgdmlzdWFsIHBvc2l0aW9uXG4gICAgICBlbGVtZW50RGltZW5zaW9uLmggKz0gdGhpcy5jb2FjaEJvcmRlck9mZnNldDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdzogdGhpcy5iYXNlR3JpZFNpemUgKiBlbGVtZW50RGltZW5zaW9uLncsXG4gICAgICBoOiB0aGlzLmJhc2VHcmlkU2l6ZSAqIGVsZW1lbnREaW1lbnNpb24uaCxcbiAgICB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldENhbGN1bGF0ZWRQb3NpdGlvbihcbiAgICBlbGVtZW50UG9zaXRpb246IEVsZW1lbnRQb3NpdGlvbixcbiAgICBlbGVtZW50RGltZW5zaW9uPzogRWxlbWVudERpbWVuc2lvbixcbiAgICBjb2FjaERpbWVuc2lvbj86IEVsZW1lbnREaW1lbnNpb24sXG4gICAgaXNPcmlnaW5IZWlnaHQ/OiBib29sZWFuLFxuICApOiBFbGVtZW50UG9zaXRpb24ge1xuICAgIGlmIChjb2FjaERpbWVuc2lvbiAmJiBlbGVtZW50RGltZW5zaW9uKSB7XG4gICAgICBjb25zdCBlbmRQb3NIZWlnaHQgPSBpc09yaWdpbkhlaWdodFxuICAgICAgICA/IGNvYWNoRGltZW5zaW9uLmhcbiAgICAgICAgOiBjb2FjaERpbWVuc2lvbi5oICsgdGhpcy5jb2FjaEJvcmRlck9mZnNldDtcbiAgICAgIC8vIElmIHRoZSBvcmlnaW5hbCBlbGVtZW50IGlzIHBvc2l0aW9uZWQgYXQgdGhlIHRvcCBvciBib3R0b20gb2YgdGhlIGNvYWNoLCB3ZSBuZWVkIHRvIHJlY2FsY3VsYXRlIHRoZSBZIGNvb3JkaW5hdGUgd2l0aCB0aGUgYWRkaXRpb25hbCBib3JkZXIgcGFkZGluZ1xuICAgICAgaWYgKGVsZW1lbnRQb3NpdGlvbi55ID09PSAwKSB7XG4gICAgICAgIGVsZW1lbnRQb3NpdGlvbi55IC09IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQ7XG4gICAgICB9IGVsc2UgaWYgKGVsZW1lbnRQb3NpdGlvbi55ICsgZWxlbWVudERpbWVuc2lvbi5oID09PSBlbmRQb3NIZWlnaHQpIHtcbiAgICAgICAgZWxlbWVudFBvc2l0aW9uLnkgKz0gdGhpcy5jb2FjaEJvcmRlck9mZnNldDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgeDogdGhpcy5iYXNlR3JpZFNpemUgKiBlbGVtZW50UG9zaXRpb24ueCxcbiAgICAgIHk6IHRoaXMuYmFzZUdyaWRTaXplICogZWxlbWVudFBvc2l0aW9uLnksXG4gICAgICB6OiBlbGVtZW50UG9zaXRpb24ueixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIGRldGVjdHMgaWYgYSAoZ3JhcGhpY2FsKSBlbGVtZW50IGlzIG9uIHRoZSBib3JkZXIgd2l0aCBpdHMgcG9zaXRpb24gKHVwcGVyIG9yIGxvd2VyIGJvcmRlcikuXG4gICAqIEBwYXJhbSBiYXNlRWxlbWVudFxuICAgKiBAcGFyYW0gY29hY2hEaW1lbnNpb25cbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGlzRWxlbWVudERpcmVjdGx5T25Cb3JkZXIoXG4gICAgYmFzZUVsZW1lbnQ6IEJhc2VFbGVtZW50LFxuICAgIGNvYWNoRGltZW5zaW9uOiBFbGVtZW50RGltZW5zaW9uLFxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgYmFzZUVsZW1lbnQucG9zaXRpb24ueSA9PT0gMCB8fFxuICAgICAgYmFzZUVsZW1lbnQucG9zaXRpb24ueSArIGJhc2VFbGVtZW50LmRpbWVuc2lvbi5oID09PSBjb2FjaERpbWVuc2lvbi5oXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3VudHMgYWxsIGF2YWlsYWJsZSBzZWF0cyB0b2dldGhlciBkZXBlbmRpbmcgb24gdGhlIHNlYXQgdHlwZVxuICAgKlxuICAgKiBAcGFyYW0gcGxhY2VzXG4gICAqIEByZXR1cm5zIEFuIE9iamVjdCB3aXRoIGNvdW50IG9mIGZyZWUgc2VhdHMgYW5kIGZyZWUgYmljeWNsZSBwbGFjZXNcbiAgICovXG4gIHByb3RlY3RlZCBnZXRBdmFpbGFibGVGcmVlUGxhY2VzTnVtRnJvbUNvYWNoKFxuICAgIHBsYWNlczogUGxhY2VbXSB8IHVuZGVmaW5lZCxcbiAgKTogQ29hY2hOdW1iZXJPZkZyZWVQbGFjZXMge1xuICAgIGNvbnN0IGFjY3VtdWxhdG9yOiBDb2FjaE51bWJlck9mRnJlZVBsYWNlcyA9IHsgc2VhdHM6IDAsIGJpY3ljbGVzOiAwIH07XG4gICAgY29uc3QgZnJlZVBsYWNlcyA9IHBsYWNlcz8ucmVkdWNlKChhY2N1bXVsYXRvciwgY3VyclBsYWNlOiBQbGFjZSkgPT4ge1xuICAgICAgaWYgKGN1cnJQbGFjZS5zdGF0ZSAhPT0gJ0ZSRUUnKSB7XG4gICAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICAgIH1cbiAgICAgIC8vIENvdW50IHVwIGRlcGVuZGluZyBvbiBzZWF0IHR5cGVcbiAgICAgIGlmIChjdXJyUGxhY2UudHlwZSA9PT0gJ1NFQVQnKSB7XG4gICAgICAgIGFjY3VtdWxhdG9yLnNlYXRzKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhY2N1bXVsYXRvci5iaWN5Y2xlcysrO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICAgIH0sIGFjY3VtdWxhdG9yKTtcbiAgICByZXR1cm4gZnJlZVBsYWNlcyA/IGZyZWVQbGFjZXMgOiBhY2N1bXVsYXRvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdCB0aGUgZW5kIG9mIGEgc2Nyb2xsIEV2ZW50IGZyb20gdGhlIGNvYWNoIHNjcm9sbGFibGUgYXJlYSxcbiAgICogdGhlIHJlYWNoZWQgY29hY2ggaXMgbWFya2VkIGFzIHNlbGVjdGVkXG4gICAqL1xuICBwcml2YXRlIF9oYW5kbGVDb2FjaEFyZWFTY3JvbGxlbmRFdmVudCgpOiB2b2lkIHtcbiAgICBjb25zdCBmaW5kU2Nyb2xsQ29hY2hJbmRleCA9IHRoaXMuaXNBdXRvU2Nyb2xsaW5nXG4gICAgICA/IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleFxuICAgICAgOiB0aGlzLl9nZXRDb2FjaEluZGV4QnlTY3JvbGxUcmlnZ2VyUG9zaXRpb24oKTtcblxuICAgIC8vIFRJTU8tNDM3MDVcbiAgICAvLyBJZiBhIHBsYWNlIHdhcyBzZWxlY3RlZCBieSBtb3VzZSBjbGljayAocHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrKSBiZWZvcmUgdHJpZ2dlcmluZyB0aGlzIHNjcm9sbGVuZCBtZXRob2QsXG4gICAgLy8gdGhlbiB0aGlzIHNjcm9sbGluZyB3YXMgdHJpZ2dlcmVkIGJ5IHRoZSBtZXRob2QgX3Njcm9sbFBsYWNlSW50b05lYXJlc3RWaWV3cG9ydCwgYW5kIGl0IGlzIG9ubHkgYSBwbGFjZSBhZGp1c3RtZW50IHNjcm9sbCAoc2Nyb2xsSW50b1ZpZXcpLFxuICAgIC8vIHdoZXJlIGEgbGVzcyB2aXNpYmxlIHBsYWNlIGhhcyBiZWVuIHNjcm9sbGVkIGludG8gdGhlIHZpZXdwb3J0LiBJbiBjYXNlIG9mIGEgcGxhY2UgYWRqdXN0bWVudCBieSBjbGljaywgd2UgY2FuIHJldHVybiBoZXJlLlxuICAgIGlmICh0aGlzLnByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljaykge1xuICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgZW5kc2Nyb2xsaW5nIGlzIGp1c3QgYSBwbGFjZSBhZGp1c3RtZW50IHNjcm9sbGluZyAocGxhY2UgaGFzIDIgZ3JpZCBzaXplIHVuaXRzKVxuICAgICAgY29uc3QgaXNDb2FjaFNjcm9sbGluZyA9XG4gICAgICAgIE1hdGguYWJzKHRoaXMuX2xhc3RTdGFydFNjcm9sbFBvcyAtIHRoaXMuY29hY2hTY3JvbGxBcmVhLnNjcm9sbExlZnQpID5cbiAgICAgICAgdGhpcy5iYXNlR3JpZFNpemUgKiAyO1xuICAgICAgaWYgKGlzQ29hY2hTY3JvbGxpbmcpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZENvYWNoSW5kZXggPSBmaW5kU2Nyb2xsQ29hY2hJbmRleDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2sgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9sYXN0U3RhcnRTY3JvbGxQb3MgPSB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxMZWZ0O1xuXG4gICAgLy8gQWZ0ZXIgY29hY2ggc2Nyb2xsZW5kIGV2ZW50IHdlIGNhbiByZXNldCB0aGUgaG92ZXJlZCBjb2FjaCBpbmRleFxuICAgIHRoaXMuaG92ZXJlZENvYWNoSW5kZXggPSAtMTtcblxuICAgIC8vIEluIGNhc2UgdGhlIHVzZXIgdXNlcyB0aGUgc2Nyb2xsYmFyIHdpdGhvdXQgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgc2VhdCByZXNlcnZhdGlvbixcbiAgICAvLyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGluZGV4IGlzIC0xLCBhbmQgd2UgaGF2ZSB0byBzZXQgdGhpcyB2YWx1ZSB3aXRoIGZpbmRTY3JvbGxDb2FjaEluZGV4LlxuICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPT09IC0xKSB7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPSBmaW5kU2Nyb2xsQ29hY2hJbmRleDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5faXNTY3JvbGxhYmxlVG9TZWxlY3RlZENvYWNoKCkpIHtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9IGZpbmRTY3JvbGxDb2FjaEluZGV4O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPVxuICAgICAgICBmaW5kU2Nyb2xsQ29hY2hJbmRleCA8IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleFxuICAgICAgICAgID8gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XG4gICAgICAgICAgOiBmaW5kU2Nyb2xsQ29hY2hJbmRleDtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaXNBdXRvU2Nyb2xsaW5nKSB7XG4gICAgICAvL1doZW4gdXNlciBpcyBzY3JvbGxpbmcgdmlhIHNjcm9sbGJhciwgaXQgYXV0b21hdGljYWxseSBzY3JvbGxzIHRvIHRoZSBmb2N1c2VkIGNvYWNoIGluIHRoZSBtYWluIG5hdmlnYXRpb25cbiAgICAgIHRoaXMuX3Njcm9sbFRvU2VsZWN0ZWROYXZpZ2F0aW9uQnV0dG9uKGZpbmRTY3JvbGxDb2FjaEluZGV4KTtcbiAgICB9XG4gICAgdGhpcy5wcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2sgPSBmYWxzZTtcbiAgICB0aGlzLnVwZGF0ZUN1cnJlbnRTZWxlY3RlZENvYWNoKCk7XG5cbiAgICBpZiAoIXRoaXMuaGFzTmF2aWdhdGlvbikge1xuICAgICAgdGhpcy5wcmVzZWxlY3RQbGFjZUluQ29hY2goKTtcbiAgICAgIHRoaXMuaXNBdXRvU2Nyb2xsaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIGFuIGF1dG9tYXRpYyBtYWluIG5hdmlnYXRpb24gc2Nyb2xsIHRvIHRoZSBzcGVjaWZpZWQgc2VsZWN0ZWROYXZDb2FjaEluZGV4LlxuICAgKiBDYWxjdWxhdGVzIHRoZSBjZW50cmFsIHNjcm9sbCBvZmZzZXQgb2YgdGhlIG5hdiBjb2FjaCB0byBiZSBzZWxlY3RlZC5cbiAgICogQHBhcmFtIHNlbGVjdGVkTmF2Q29hY2hJbmRleFxuICAgKi9cbiAgcHJpdmF0ZSBfc2Nyb2xsVG9TZWxlY3RlZE5hdmlnYXRpb25CdXR0b24oc2VsZWN0ZWROYXZDb2FjaEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAvL1RpbWUgZGVsYXkgdG8gbm90IGludGVyZmVyZSB3aXRoIG90aGVyIGV4ZWN1dGluZyBjYWxsaW5nIHNjcm9sbFRvIGZ1bmN0aW9ucyAoY29hY2hlcyBzY3JvbGxpbmcpXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5oYXNOYXZpZ2F0aW9uICYmIHRoaXMubmF2aWdhdGlvblNjcm9sbEFyZWEpIHtcbiAgICAgICAgY29uc3QgbmF2aWdhdGlvbkFyZWFDZW50ZXJlZFBvc1ggPSB0aGlzLnNjcm9sbE5hdmlnYXRpb25BcmVhRGltIC8gMjtcbiAgICAgICAgY29uc3Qgc2Nyb2xsQnV0dG9uT2Zmc2V0WCA9IHNlbGVjdGVkTmF2Q29hY2hJbmRleCAqIHRoaXMuY29hY2hOYXZCdXR0b25EaW07XG4gICAgICAgIGNvbnN0IHNjcm9sbE9mZnNldFggPVxuICAgICAgICAgIHNjcm9sbEJ1dHRvbk9mZnNldFggLSBuYXZpZ2F0aW9uQXJlYUNlbnRlcmVkUG9zWCArIHRoaXMuY29hY2hOYXZCdXR0b25EaW07XG4gICAgICAgIHRoaXMubmF2aWdhdGlvblNjcm9sbEFyZWEuc2Nyb2xsVG8oe1xuICAgICAgICAgIHRvcDogdGhpcy5hbGlnblZlcnRpY2FsID8gc2Nyb2xsT2Zmc2V0WCA6IDAsXG4gICAgICAgICAgbGVmdDogdGhpcy5hbGlnblZlcnRpY2FsID8gMCA6IHNjcm9sbE9mZnNldFgsXG4gICAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LCAxMCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgbmV3IFNjcm9sbERpcmVjdGlvbiBieSB0aGUgbmV3IGdpdmVuIHRhcmdldCBjb2FjaCBpbmRleC5cbiAgICovXG4gIHByaXZhdGUgX3NldFNjcm9sbERpcmVjdGlvbkJ5Q29hY2hJbmRleCgpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJTY3JvbGxEaXJlY3Rpb24gPVxuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID4gdGhpcy5zZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgPyBTY3JvbGxEaXJlY3Rpb24ucmlnaHRcbiAgICAgICAgOiBTY3JvbGxEaXJlY3Rpb24ubGVmdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzY3JvbGwgc3RhcnQgb3IgZW5kIHBvc2l0aW9uIFggZnJvbSB0aGUgc2VsZWN0ZWQgY29hY2guXG4gICAqIEluIGNhc2UgdGhlIHVzZXIgaXMgY3VycmVudGx5IG5hdmlnYXRpbmcgdGhyb3VnaCBwbGFjZXMgYnkga2V5Ym9hcmQgYW5kIGdvZXMgdG8gcHJldmlvdXMgY29hY2gsXG4gICAqIHRoZW4gd2UgcmV0dXJuIHRoZSBlbmQgcG9zaXRpb24gb2YgdGhlIGNvYWNoIHRvIGdldCB0aGUgY2xvc2VzdCBzY3JvbGwgcG9zaXRpb24gb2YgdGhlIG5leHQgZm9jdXMgcGxhY2UuXG4gICAqIEByZXR1cm5zIG51bWJlclxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0Q29hY2hTY3JvbGxQb3NpdGlvblgoKTogbnVtYmVyIHtcbiAgICBjb25zdCBjb2FjaFRyaWdnZXJQb2ludCA9IHRoaXMudHJpZ2dlckNvYWNoUG9zaXRpb25zQ29sbGVjdGlvblt0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdO1xuICAgIGNvbnN0IGlzRm9jdXNQbGFjZUZyb21QcmV2aW91c0NvYWNoUG9zaXRpb24gPVxuICAgICAgdGhpcy5pc0tleWJvYXJkTmF2aWdhdGlvbiAmJlxuICAgICAgdGhpcy5jdXJyU2Nyb2xsRGlyZWN0aW9uID09PSBTY3JvbGxEaXJlY3Rpb24ubGVmdCAmJlxuICAgICAgY29hY2hUcmlnZ2VyUG9pbnQud2lkdGggPiB0aGlzLnNjcm9sbENvYWNoZXNBcmVhV2lkdGg7XG5cbiAgICByZXR1cm4gaXNGb2N1c1BsYWNlRnJvbVByZXZpb3VzQ29hY2hQb3NpdGlvblxuICAgICAgPyBjb2FjaFRyaWdnZXJQb2ludC5lbmQgLSB0aGlzLnNjcm9sbENvYWNoZXNBcmVhV2lkdGhcbiAgICAgIDogY29hY2hUcmlnZ2VyUG9pbnQuc3RhcnQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZm9jdXMgb24gdGhlIEhUTUwgdGFibGUgKGdyaWQpIGNhcHRpb24gZWxlbWVudCBzbyB0aGF0IHRoZSBoZWFkaW5nIGlzIHJlYWQgb3V0IHdoZW4gdXNpbmcgYSBTY3JlZW5SZWFkZXIuXG4gICAqL1xuICBwcml2YXRlIF9zZXRGb2N1c1RvU2VsZWN0ZWRDb2FjaEdyaWQoKTogdm9pZCB7XG4gICAgLy8gV2hlbiB0aGUgdXNlciBwZXJmb3JtcyBhbiBhY3Rpb24gdGhhdCBhZmZlY3RzIHRoZSBjb2FjaCBuYXZpZ2F0aW9uLCB0aGVuIHRoZSBuYXZpZ2F0ZWQgdGFibGUgaXMgZm9jdXNhYmxlLlxuICAgIGlmICh0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlICYmIHRoaXMuaGFzU2VhdFJlc2VydmF0aW9uTmF0aXZlRm9jdXMpIHtcbiAgICAgIHRoaXMuaXNDb2FjaEdyaWRGb2N1c2FibGUgPSBmYWxzZTtcbiAgICAgIGNvbnN0IGNvYWNoVGFibGVDYXB0aW9uRWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcihcbiAgICAgICAgJyNzYmItc3ItY29hY2gtY2FwdGlvbi0nICsgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4LFxuICAgICAgKSBhcyBIVE1MVGFibGVDYXB0aW9uRWxlbWVudDtcbiAgICAgIGlmIChjb2FjaFRhYmxlQ2FwdGlvbkVsZW1lbnQpIHtcbiAgICAgICAgY29hY2hUYWJsZUNhcHRpb25FbGVtZW50LmZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBzY3JvbGxlZCBwb3NpdGlvbiBjYW4gYmUgdXNlZCB0byBzY3JvbGwgdG8gdGhlIHNlbGVjdGVkIHdhZ29uXG4gICAqIEByZXR1cm5zIGJvb2xlYW5cbiAgICovXG4gIHByaXZhdGUgX2lzU2Nyb2xsYWJsZVRvU2VsZWN0ZWRDb2FjaCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBjdXJyU2Nyb2xsUG9zWCA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgPyB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxUb3BcbiAgICAgIDogdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsTGVmdDtcbiAgICBjb25zdCBjb2FjaFNjcm9sbFdpbmRvd1dpZHRoID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICA/IHRoaXMuY29hY2hTY3JvbGxBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodFxuICAgICAgOiB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICBjb25zdCBtYXhTY3JvbGxXaWR0aEFyZWEgPSB0aGlzLm1heENhbGNDb2FjaGVzV2lkdGggLSBjb2FjaFNjcm9sbFdpbmRvd1dpZHRoO1xuICAgIGNvbnN0IGN1cnJDb2FjaFRyaWdnZXIgPSB0aGlzLnRyaWdnZXJDb2FjaFBvc2l0aW9uc0NvbGxlY3Rpb25bdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XTtcbiAgICBjb25zdCBpc1Njcm9sbFBvc1NhbWVUb0N1cnJDb2FjaFBvcyA9XG4gICAgICBjdXJyU2Nyb2xsUG9zWCA9PT0gdGhpcy50cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF0uc3RhcnQ7XG5cbiAgICByZXR1cm4gKFxuICAgICAgKGN1cnJTY3JvbGxQb3NYIDwgbWF4U2Nyb2xsV2lkdGhBcmVhIHx8IGN1cnJTY3JvbGxQb3NYID4gY3VyckNvYWNoVHJpZ2dlci5zdGFydCkgJiZcbiAgICAgICFpc1Njcm9sbFBvc1NhbWVUb0N1cnJDb2FjaFBvc1xuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29hY2ggaW5kZXggd2hpY2ggaXMgY3VycmVudGx5IHZpc2libGUgaW4gdGhlIHNjcm9sbCBhcmVhXG4gICAqIEByZXR1cm5zIG51bWJlclxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0Q29hY2hJbmRleEJ5U2Nyb2xsVHJpZ2dlclBvc2l0aW9uKCk6IG51bWJlciB7XG4gICAgY29uc3Qgc2Nyb2xsUG9zID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICA/IHRoaXMuY29hY2hTY3JvbGxBcmVhLnNjcm9sbFRvcFxuICAgICAgOiB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxMZWZ0O1xuICAgIGNvbnN0IHNjcm9sbE9mZnNldFggPSBzY3JvbGxQb3MgKyB0aGlzLnNjcm9sbENvYWNoZXNBcmVhV2lkdGggLyAyO1xuICAgIHJldHVybiB0aGlzLnRyaWdnZXJDb2FjaFBvc2l0aW9uc0NvbGxlY3Rpb24uZmluZEluZGV4KFxuICAgICAgKGNvYWNoVHJpZ2dlcikgPT4gc2Nyb2xsT2Zmc2V0WCA+PSBjb2FjaFRyaWdnZXIuc3RhcnQgJiYgc2Nyb2xsT2Zmc2V0WCA8PSBjb2FjaFRyaWdnZXIuZW5kLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBmaXJzdCBwbGFjZSBvZiBjdXJyZW50IHNlbGVjdGVkIGNvYWNoIGJ5IHRhYmxlIGNlbGwgY29vcmRpbmF0ZSAwLTAgaWQuXG4gICAqIEByZXR1cm5zIFBsYWNlIG9yIG51bGxcbiAgICovXG4gIHByaXZhdGUgX2dldEZpcnN0UGxhY2VJblNlbGVjdGVkQ29hY2goKTogUGxhY2UgfCBudWxsIHtcbiAgICBsZXQgZmlyc3RQbGFjZTogUGxhY2UgfCBudWxsID0gbnVsbDtcbiAgICBjb25zdCBjb2FjaCA9XG4gICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLmNvYWNoSXRlbXNbdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XTtcbiAgICBjb25zdCBmaXJzdENlbGxJZCA9XG4gICAgICAnY2VsbC0nICsgdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggKyAnLScgKyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggKyAnLTAtMCc7XG4gICAgY29uc3QgcGxhY2VOdW1iZXIgPVxuICAgICAgdGhpcy5zaGFkb3dSb290XG4gICAgICAgID8ucXVlcnlTZWxlY3RvcjxIVE1MVGFibGVDZWxsRWxlbWVudD4oJyMnICsgZmlyc3RDZWxsSWQpXG4gICAgICAgID8ucXVlcnlTZWxlY3RvcjxTYmJTZWF0UmVzZXJ2YXRpb25QbGFjZUNvbnRyb2xFbGVtZW50Pignc2JiLXNlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbCcpXG4gICAgICAgID8uZ2V0QXR0cmlidXRlKCd0ZXh0JykgfHwgbnVsbDtcblxuICAgIGlmIChjb2FjaCAmJiBwbGFjZU51bWJlcikge1xuICAgICAgZmlyc3RQbGFjZSA9IGNvYWNoLnBsYWNlcz8uZmluZCgocGxhY2UpID0+IHBsYWNlLm51bWJlciA9PT0gcGxhY2VOdW1iZXIpIHx8IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBmaXJzdFBsYWNlO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0U3dpdGNoZWRDb2FjaERlY2tJbmRleEJ5S2V5TmF2aWdhdGlvbihcbiAgICBwcmVzc2VkS2V5OiBzdHJpbmcsXG4gICAgY29hY2g6IENvYWNoSXRlbSxcbiAgKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuY3VyclNlbGVjdGVkUGxhY2UgfHxcbiAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHQgfHxcbiAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93TGVmdFxuICAgIClcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgLy9DSEVDSyBERUNLIFNXSVRDSCBET1dOXG4gICAgaWYgKFxuICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dEb3duICYmXG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlLnBvc2l0aW9uLnkgKyAyID09PSBjb2FjaC5kaW1lbnNpb24uaCAmJlxuICAgICAgISF0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggKyAxXVxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ICsgMTtcbiAgICB9XG4gICAgLy9DSEVDSyBERUNLIFNXSVRDSCBVUFxuICAgIGVsc2UgaWYgKFxuICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dVcCAmJlxuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZS5wb3NpdGlvbi55ID09PSAwICYmXG4gICAgICAhIXRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCAtIDFdXG4gICAgKSB7XG4gICAgICByZXR1cm4gdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggLSAxO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUbyBnZXQgdGhlIGNvcnJlY3QgY2xvc2VzdCBwbGFjZSBvZiBjdXJyZW50IHByZXNzZWQga2V5IGFuZCB0aGUgY3VycmVudCBzZWxlY3RlZCBwbGFjZSxcbiAgICogd2UgaGF2ZSB0byBpbnZlc3RpZ2F0ZSB0aGUgY29vcmRpbmF0ZXMgb2YgZWFjaCBwbGFjZSB0byBmaW5kIHRoZSBjbG9zZXN0IHBsYWNlIG9mIHRoZSBjdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZC5cbiAgICogQHBhcmFtIHByZXNzZWRLZXlcbiAgICogQHJldHVybnMgUGxhY2Ugb3IgbnVsbFxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0Q2xvc2VzdFBsYWNlQnlLZXlEaXJlY3Rpb24ocHJlc3NlZEtleT86IHN0cmluZyk6IFBsYWNlIHwgbnVsbCB7XG4gICAgY29uc3QgY29hY2ggPVxuICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XS5jb2FjaEl0ZW1zW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF07XG4gICAgbGV0IGNsb3Nlc3RQbGFjZSA9IG51bGw7XG4gICAgbGV0IGNvYWNoUGxhY2VzID0gY29hY2gucGxhY2VzO1xuICAgIGxldCBzd2l0Y2hlZENvYWNoRGVja0luZGV4ID0gbnVsbDtcblxuICAgIGlmIChjb2FjaFBsYWNlcykge1xuICAgICAgLy8gSWYgbm8gcGxhY2Ugc2V0LCB0aGVuIHdlIHVzZSBpbml0aWFsIHRoZSBsZWZ0LXRvcCBwbGFjZSBvbiB0aGUgY29hY2hcbiAgICAgIGlmICghdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0Rmlyc3RQbGFjZUluU2VsZWN0ZWRDb2FjaCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuY3VyclNlbGVjdGVkUGxhY2UpIHtcbiAgICAgICAgICBjb25zdCBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uID0geyAuLi50aGlzLmN1cnJTZWxlY3RlZFBsYWNlLnBvc2l0aW9uIH07XG5cbiAgICAgICAgICBpZiAocHJlc3NlZEtleSkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUga2V5Ym9hcmQgbmF2aWdhdGlvbiBpcyB1c2VkIHRvIHN3aXRjaCB0byBhbm90aGVyIGNvYWNoIGRlY2sgKFVwIC0+IERvd24gfCBEb3duIC0+IFVwKS5cbiAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgd2UgdGFrZSB0aGUgY29hY2ggcGxhY2VzIHdlIGhhdmUgdG8gY2hlY2tlZCBmcm9tIHRoZSB0YXJnZXQgZGVjayBub3cuXG4gICAgICAgICAgICBzd2l0Y2hlZENvYWNoRGVja0luZGV4ID0gdGhpcy5fZ2V0U3dpdGNoZWRDb2FjaERlY2tJbmRleEJ5S2V5TmF2aWdhdGlvbihcbiAgICAgICAgICAgICAgcHJlc3NlZEtleSxcbiAgICAgICAgICAgICAgY29hY2gsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHN3aXRjaGVkQ29hY2hEZWNrSW5kZXggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gQXNzaWduIGNoZWNrIHBsYWNlcyBmcm9tIHRoZSB0YXJnZXQgc3dpdGNoIGRlY2tcbiAgICAgICAgICAgICAgY29hY2hQbGFjZXMgPVxuICAgICAgICAgICAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1tzd2l0Y2hlZENvYWNoRGVja0luZGV4XS5jb2FjaEl0ZW1zW1xuICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XG4gICAgICAgICAgICAgICAgXS5wbGFjZXMgfHwgW107XG4gICAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gdXBkYXRlIHkgY29vcmRpbmF0ZVxuICAgICAgICAgICAgICBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgPVxuICAgICAgICAgICAgICAgIHN3aXRjaGVkQ29hY2hEZWNrSW5kZXggPCB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCA/IGNvYWNoLmRpbWVuc2lvbi5oIDogLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yIChjb25zdCBwbGFjZSBvZiBjb2FjaFBsYWNlcykge1xuICAgICAgICAgICAgLy8gSWYgbm8ga2V5IHByZXNzZWQsIHRoZW4gd2UgdHJ5IHRvIGZpbmQgdGhlIHBsYWNlIG9mIHRoZSBjdXJyZW50IGN1cnJTY3JvbGxEaXJlY3Rpb25cbiAgICAgICAgICAgIGlmICghcHJlc3NlZEtleSkge1xuICAgICAgICAgICAgICAvLyBGaW5kIHBsYWNlIGZyb20gdGhlIGxlZnQgc2lkZSBvZiBjb2FjaCBieSB5IGNvb3JkaW5hdGUuIEN1cnJlbnQgY3VyclNjcm9sbERpcmVjdGlvbiBpcyBSSUdIVFxuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyU2Nyb2xsRGlyZWN0aW9uID09PSBTY3JvbGxEaXJlY3Rpb24ucmlnaHQgJiZcbiAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi55ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgJiZcbiAgICAgICAgICAgICAgICAoIWNsb3Nlc3RQbGFjZSB8fCBwbGFjZS5wb3NpdGlvbi54IDwgY2xvc2VzdFBsYWNlLnBvc2l0aW9uLngpXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vRmluZCBwbGFjZSBmcm9tIHRoZSByaWdodCBzaWRlIG9mIGNvYWNoIGJ5IHkgY29vcmRpbmF0ZS4gQ3VycmVudCBjdXJyU2Nyb2xsRGlyZWN0aW9uIGlzIExFRlRcbiAgICAgICAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyU2Nyb2xsRGlyZWN0aW9uID09PSBTY3JvbGxEaXJlY3Rpb24ubGVmdCAmJlxuICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnkgPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueSAmJlxuICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnggPiBjbG9zZXN0UGxhY2UucG9zaXRpb24ueClcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY2xvc2VzdFBsYWNlID0gcGxhY2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChwbGFjZS5udW1iZXIgIT09IHRoaXMuY3VyclNlbGVjdGVkUGxhY2U/Lm51bWJlcikge1xuICAgICAgICAgICAgICAgIC8vS2V5IFtSaWdodF0gbmF2aWdhdGlvbiwgd2UgY2hlY2sgdGhlIHBsYWNlIGNvb3JkaW5hdGVzIG9mIHRoZSB4LWF4aXMgdG8gZ2V0IHRoZSBzbWFsbGVzdCBsYXJnZXIgeCBwbGFjZSBjb29yZGluYXRlIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGxhY2VcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1JpZ2h0ICYmXG4gICAgICAgICAgICAgICAgICAocGxhY2UucG9zaXRpb24ueSA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55IHx8XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnkgPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueSAtIDEpICYmXG4gICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi54ID4gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi54ICYmXG4gICAgICAgICAgICAgICAgICAoIWNsb3Nlc3RQbGFjZSB8fCBwbGFjZS5wb3NpdGlvbi54IDwgY2xvc2VzdFBsYWNlLnBvc2l0aW9uLngpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBjbG9zZXN0UGxhY2UgPSBwbGFjZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9LZXkgW0Rvd25dIG5hdmlnYXRpb24sIHdlIGNoZWNrIHRoZSBwbGFjZSBjb29yZGluYXRlcyBvZiB0aGUgeS1heGlzIHRvIGdldCB0aGUgc21hbGxlc3QgbGFyZ2VyIHkgcGxhY2UgY29vcmRpbmF0ZSBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0Rvd24gJiZcbiAgICAgICAgICAgICAgICAgIChwbGFjZS5wb3NpdGlvbi54ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnggfHxcbiAgICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueCA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi54ICsgMSkgJiZcbiAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnkgPiBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgJiZcbiAgICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnkgPCBjbG9zZXN0UGxhY2UucG9zaXRpb24ueSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL0tleSBbTGVmdF0gbmF2aWdhdGlvbiwgd2UgY2hlY2sgdGhlIHBsYWNlIGNvb3JkaW5hdGVzIG9mIHRoZSB4LWF4aXMgdG8gZ2V0IHRoZSBncmVhdGVzdCBzbWFsbGVyIHggcGxhY2UgY29vcmRpbmF0ZSBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0xlZnQgJiZcbiAgICAgICAgICAgICAgICAgIChwbGFjZS5wb3NpdGlvbi55ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgfHxcbiAgICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55ICsgMSkgJiZcbiAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnggPCBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnggJiZcbiAgICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnggPiBjbG9zZXN0UGxhY2UucG9zaXRpb24ueClcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL0tleSBbVXBdIG5hdmlnYXRpb24sIHdlIGNoZWNrIHRoZSBwbGFjZSBjb29yZGluYXRlcyBvZiB0aGUgeS1heGlzIHRvIGdldCB0aGUgZ3JlYXRlc3Qgc21hbGxlciB5IHBsYWNlIGNvb3JkaW5hdGUgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwbGFjZVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dVcCAmJlxuICAgICAgICAgICAgICAgICAgKHBsYWNlLnBvc2l0aW9uLnggPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueCB8fFxuICAgICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi54ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnggLSAxKSAmJlxuICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA8IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueSAmJlxuICAgICAgICAgICAgICAgICAgKCFjbG9zZXN0UGxhY2UgfHwgcGxhY2UucG9zaXRpb24ueSA+IGNsb3Nlc3RQbGFjZS5wb3NpdGlvbi55KVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgY2xvc2VzdFBsYWNlID0gcGxhY2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSWYgYSBwbGFjZSBoYXMgYmVlbiBmb3VuZCBpbiB0aGUgY2hhbmdpbmcgc3dpdGNoIGNvYWNoLFxuICAgICAgICAgIC8vIHdlIGNhbiB1cGRhdGUgdGhlIGN1cnJTZWxlY3RlZERlY2tJbmRleFxuICAgICAgICAgIGlmIChzd2l0Y2hlZENvYWNoRGVja0luZGV4ICE9PSBudWxsICYmIGNsb3Nlc3RQbGFjZSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggPSBzd2l0Y2hlZENvYWNoRGVja0luZGV4O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2xvc2VzdFBsYWNlO1xuICB9XG5cbiAgLy8gSGFuZGxpbmcgZm9yIFRhYiBuYXZpZ2F0aW9uIGlmIGEgcGxhY2UgaXMgc2VsZWN0ZWQgaW5zaWRlIHRoZSBjb2FjaC5cbiAgLy8gVGhpcyBjb250cm9scyB0aGUgZm9jdXNlZCBjb2FjaCBmcm9tIHRoZSBjdXJyZW50IHNlbGVjdGVkIGNvYWNoLlxuICBwcml2YXRlIF9uYXZpZ2F0ZUNvYWNoTmF2aWdhdGlvbkJ5S2V5Ym9hcmQodGFiRGlyZWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyRm9jdXNJbmRleCA9XG4gICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID09PSAtMVxuICAgICAgICA/IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9PT0gLTFcbiAgICAgICAgICA/IDBcbiAgICAgICAgICA6IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleFxuICAgICAgICA6IHRoaXMuZm9jdXNlZENvYWNoSW5kZXg7XG5cbiAgICAvLyBDaGVjayBuZXh0IG9yIHByZXYgdGFiIGlzIHByZXNzZWQsIHRoZW4gd2UgbmVlZCB0byBmaW5kIHRoZSBuZXh0IGF2YWlsYWJsZSBjb2FjaCBpbmRleCB0aGF0IHNob3VsZCByZWNlaXZlIHRoZSBmb2N1c1xuICAgIGNvbnN0IG5ld0ZvY3VzYWJsZUluZGV4OiBudW1iZXIgPVxuICAgICAgdGFiRGlyZWN0aW9uID09PSAnTkVYVF9UQUInXG4gICAgICAgID8gdGhpcy5nZXROZXh0QXZhaWxhYmxlQ29hY2hJbmRleChjdXJyRm9jdXNJbmRleClcbiAgICAgICAgOiB0aGlzLmdldFByZXZBdmFpbGFibGVDb2FjaEluZGV4KGN1cnJGb2N1c0luZGV4KTtcblxuICAgIGlmICh0aGlzLmhhc05hdmlnYXRpb24pIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkUGxhY2VFbGVtZW50ID0gdGhpcy5fZ2V0UGxhY2VIdG1sRWxlbWVudCgpO1xuICAgICAgY29uc3QgcGxhY2VJbkNvYWNoSGFzRm9jdXMgPSBzZWxlY3RlZFBsYWNlRWxlbWVudFxuICAgICAgICA/IHNlbGVjdGVkUGxhY2VFbGVtZW50LmdldEF0dHJpYnV0ZSgna2V5Zm9jdXMnKSA9PT0gJ2ZvY3VzJ1xuICAgICAgICA6IGZhbHNlO1xuXG4gICAgICAvLyBJZiB3ZSB0YWIgYmFjayAoUFJFVl9UQUIpIGFuZCB0aGUgZm9jdXMgaXMgY3VycmVudGx5IG9uIHBsYWNlLFxuICAgICAgLy8gd2UgcmVtb3ZlIHRoZSBzZWxlY3RlZCBzdGF0ZSBmcm9tIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbmF2aWdhdGlvbiBjb2FjaCBhbmQgb25seSBzZXQgdGhlIGZvY3VzIHN0YXR1cyB0byBpdFxuICAgICAgaWYgKHRhYkRpcmVjdGlvbiA9PT0gJ1BSRVZfVEFCJyAmJiB0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCA9PT0gY3VyckZvY3VzSW5kZXgpIHtcbiAgICAgICAgLy8gSWYgd2UgVEFCIGJhY2sgYW5kIGhhdmUgYSBzZWxlY3RlZCBwbGFjZXMgaW5zaWRlIHRoZSBjdXJyZW50IGNvYWNoLCB0aGVuIHdlIG1vdmUgb3V0IGZyb20gdGhlIHNlYXRtYXAgYW5kIHNldCB0aGUgZm9jdXMgdG8gdGhlIGN1cnJlbnQgc2VsZWN0ZWQgY29hY2hcbiAgICAgICAgaWYgKHBsYWNlSW5Db2FjaEhhc0ZvY3VzIHx8IHRoaXMuY3VyclNlbGVjdGVkUGxhY2UgIT09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gY3VyckZvY3VzSW5kZXg7XG4gICAgICAgICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdoZW4gdGhlIGZpcnN0IGNvYWNoIGlzIHNlbGVjdGVkIGFuZCB3ZSBUQUIgYmFjaywgd2UgaGF2ZSB0byBzZXQgdGhlIG5hdGl2ZSBmb2N1cyBvbiB0aGUgZmlyc3QgY29hY2ggaW4gdGhlIG5hdmlnYXRpb24gdG8gZ2V0IGJhY2sgdG8gdGhlIG5vcm1hbCB0YWIgbmF2aWdhdGlvbi5cbiAgICAgICAgLy8gVG8gZG8gdGhpcywgd2UgaGF2ZSB0byByZW1vdmUgdGhlIGZvY3VzZWRJbmRleCBmcm9tIHRoZSBmaXJzdCBjb2FjaCBhbmQgc2V0IGl0IGFnYWluIGFmdGVyIGEgc2hvcnQgZGVsYXlcbiAgICAgICAgZWxzZSBpZiAoY3VyckZvY3VzSW5kZXggPT09IDApIHtcbiAgICAgICAgICAvLyBSZWZvY3VzIHRoZSBmaXJzdCBjb2FjaFxuICAgICAgICAgIHRoaXMuX3JlZm9jdXNDdXJyZW50Rm9jdXNlZE5hdkNvYWNoKGN1cnJGb2N1c0luZGV4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gbmV3Rm9jdXNhYmxlSW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIE9ubHkgc2V0cyB0aGUgZm9jdXMgb24gdGhlIG5ldyBuYXZpZ2F0aW9uIGNvYWNoXG4gICAgICBlbHNlIGlmIChuZXdGb2N1c2FibGVJbmRleCAhPT0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4KSB7XG4gICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSBuZXdGb2N1c2FibGVJbmRleDtcbiAgICAgIH1cbiAgICAgIC8vIFdoZW4gdGhlIGxhc3QgY29hY2ggaXMgc2VsZWN0ZWQgYW5kIHdlIFRBQiwgd2UgaGF2ZSB0byBzZXQgdGhlIG5hdGl2ZSBmb2N1cyBvbiB0aGUgbGFzdCBjb2FjaCBpbiB0aGUgbmF2aWdhdGlvbiB0byBnZXQgYmFjayB0byB0aGUgbm9ybWFsIHRhYiBuYXZpZ2F0aW9uLlxuICAgICAgLy8gVG8gZG8gdGhpcywgd2UgaGF2ZSAgdG8gcmVtb3ZlIHRoZSBmb2N1c2VkSW5kZXggZnJvbSB0aGUgZmlyc3QgY29hY2ggYW5kIHNldCBpdCBhZ2FpbiBhZnRlciBhIHNob3J0IGRlbGF5XG4gICAgICBlbHNlIGlmIChcbiAgICAgICAgdGFiRGlyZWN0aW9uID09PSAnTkVYVF9UQUInICYmXG4gICAgICAgIG5ld0ZvY3VzYWJsZUluZGV4ID09PSB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50cy5sZW5ndGggLSAxXG4gICAgICApIHtcbiAgICAgICAgLy8gUmVmb2N1cyB0aGUgbGFzdCBjb2FjaFxuICAgICAgICB0aGlzLl9yZWZvY3VzQ3VycmVudEZvY3VzZWROYXZDb2FjaChjdXJyRm9jdXNJbmRleCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ID0gbmV3Rm9jdXNhYmxlSW5kZXg7XG4gICAgICAgIC8vIElmIGFueSBwbGFjZSB3YXMgZm9jdXNlZCBpbiBjb2FjaCwgc28gd2Ugc2V0IGZvY3VzZWQgYWdhaW5cbiAgICAgICAgaWYgKHBsYWNlSW5Db2FjaEhhc0ZvY3VzKSB7XG4gICAgICAgICAgdGhpcy5mb2N1c1BsYWNlRWxlbWVudCh0aGlzLmN1cnJTZWxlY3RlZFBsYWNlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBubyBwbGFjZSB3YXMgc2VsZWN0ZWQsIHRoZW4gd2Ugc2VsZWN0IHRoZSBjb2FjaCBncmlkXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHRoaXMuaXNDb2FjaEdyaWRGb2N1c2FibGUgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuX3NldEZvY3VzVG9TZWxlY3RlZENvYWNoR3JpZCgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEJ5IFRhYiBOYXZpZ2F0aW9uLCBwZXJmb3JtIGF1dG9tYXRpYyBzY3JvbGxpbmcgdG8gdGhlIGZvY3VzZWQgd2Fnb25cbiAgICAgIHRoaXMuX3Njcm9sbFRvU2VsZWN0ZWROYXZpZ2F0aW9uQnV0dG9uKG5ld0ZvY3VzYWJsZUluZGV4KTtcbiAgICB9XG4gICAgLy8gSWYgbm8gbmF2aWdhdGlvbiBleGlzdCwgd2Ugc2Nyb2xsIGRpcmVjdGx5IHRvIHRoZSBuZXh0IHRhYmFibGUgY29hY2hcbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuc2Nyb2xsVG9TZWxlY3RlZE5hdkNvYWNoKG5ld0ZvY3VzYWJsZUluZGV4KTtcbiAgICB9XG4gIH1cblxuICAvLyBSZWZvY3VzZWQgdGhlIGN1cnJlbnQgZm9jdXNlZCAodmlzdWFsKSBuYXYgY29hY2ggdG8gZ2V0IHRoZSBuYXRpdmUgZm9jdXMgYmFjayB0byB0aGUgbmF2aWdhdGlvblxuICBwcml2YXRlIF9yZWZvY3VzQ3VycmVudEZvY3VzZWROYXZDb2FjaChmb2N1c0luZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gICAgc2V0VGltZW91dCgoKSA9PiAodGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IGZvY3VzSW5kZXgpLCAwKTtcbiAgfVxuXG4gIHByaXZhdGUgX25hdmlnYXRlVG9QbGFjZUJ5S2V5Ym9hcmQocHJlc3NlZEtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5pc0tleWJvYXJkTmF2aWdhdGlvbiA9IHRydWU7XG5cbiAgICBpZiAodGhpcy5mb2N1c2VkQ29hY2hJbmRleCAhPT0gLTEpIHtcbiAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMucHJldmVudFBsYWNlQ2xpY2spIHtcbiAgICAgIGNvbnN0IGZpbmRDbG9zZXN0UGxhY2UgPSB0aGlzLl9nZXRDbG9zZXN0UGxhY2VCeUtleURpcmVjdGlvbihwcmVzc2VkS2V5KTtcblxuICAgICAgaWYgKGZpbmRDbG9zZXN0UGxhY2UpIHtcbiAgICAgICAgdGhpcy5mb2N1c1BsYWNlRWxlbWVudChmaW5kQ2xvc2VzdFBsYWNlKTtcbiAgICAgIH1cbiAgICAgIC8vIE5vIGNsb3Nlc3QgcGxhY2UgZm91bmQgYnkga2V5IG5hdmlnYXRpb25cbiAgICAgIGVsc2Uge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dSaWdodCB8fFxuICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93TGVmdCB8fFxuICAgICAgICAgICh0aGlzLmFsaWduVmVydGljYWwgJiZcbiAgICAgICAgICAgIChwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1VwIHx8XG4gICAgICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93RG93bikpXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIENoZWNrIHRoZSBjdXJyZW50IHByZXNzZWQga2V5IHRvIGdldCB0aGUgbmV4dCBhdmFpbGFibGUgY29hY2ggaW5kZXhcbiAgICAgICAgICBjb25zdCBuZXdTZWxlY3RlZENvYWNoSW5kZXggPVxuICAgICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dSaWdodFxuICAgICAgICAgICAgICA/IHRoaXMuZ2V0TmV4dEF2YWlsYWJsZUNvYWNoSW5kZXgoKVxuICAgICAgICAgICAgICA6IHRoaXMuZ2V0UHJldkF2YWlsYWJsZUNvYWNoSW5kZXgoKTtcblxuICAgICAgICAgIHRoaXMuc2Nyb2xsVG9TZWxlY3RlZE5hdkNvYWNoKG5ld1NlbGVjdGVkQ29hY2hJbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0TmV4dEF2YWlsYWJsZUNvYWNoSW5kZXgoY3VycmVudEluZGV4PzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBzdGFydEluZGV4ID0gY3VycmVudEluZGV4ID8/IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleDtcbiAgICByZXR1cm4gc3RhcnRJbmRleCA8IHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0uY29hY2hJdGVtcy5sZW5ndGggLSAxXG4gICAgICA/IHN0YXJ0SW5kZXggKyAxXG4gICAgICA6IHN0YXJ0SW5kZXg7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0UHJldkF2YWlsYWJsZUNvYWNoSW5kZXgoY3VycmVudEluZGV4PzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBzdGFydEluZGV4ID0gY3VycmVudEluZGV4ID8/IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleDtcbiAgICByZXR1cm4gc3RhcnRJbmRleCA+IDAgPyBzdGFydEluZGV4IC0gMSA6IHN0YXJ0SW5kZXg7XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlU2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMocGxhY2VTZWxlY3Rpb246IFBsYWNlU2VsZWN0aW9uKTogdm9pZCB7XG4gICAgY29uc3QgcGxhY2VUeXBlUHJvcCA9IHBsYWNlU2VsZWN0aW9uLnBsYWNlVHlwZSA9PT0gJ1NFQVQnID8gJ3NlYXRzJyA6ICdiaWN5Y2xlcyc7XG4gICAgY29uc3QgbWF4UmVzZXJ2YXRpb25zID1cbiAgICAgIHBsYWNlU2VsZWN0aW9uLnBsYWNlVHlwZSA9PT0gJ1NFQVQnID8gdGhpcy5tYXhTZWF0UmVzZXJ2YXRpb25zIDogdGhpcy5tYXhCaWN5Y2xlUmVzZXJ2YXRpb25zO1xuICAgIGNvbnN0IGN1cnJTZWxlY3RlZFBsYWNlcyA9IHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXNbcGxhY2VUeXBlUHJvcF07XG5cbiAgICB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzW3BsYWNlVHlwZVByb3BdID0gdGhpcy5fdXBkYXRlU2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMoXG4gICAgICBjdXJyU2VsZWN0ZWRQbGFjZXMsXG4gICAgICBtYXhSZXNlcnZhdGlvbnMsXG4gICAgICBwbGFjZVNlbGVjdGlvbixcbiAgICApO1xuICAgIC8qKlxuICAgICAqIEB0eXBlIHtDdXN0b21FdmVudDxTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZFBsYWNlcz59XG4gICAgICogRW1pdHMgd2hlbiBhIHBsYWNlIHdhcyBzZWxlY3RlZCBhbmQgcmV0dXJucyBhIFBsYWNlIGFycmF5IHdpdGggYWxsIHNlbGVjdGVkIHBsYWNlcy5cbiAgICAgKi9cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQ8U2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXM+KCdzZWxlY3RlZHBsYWNlcycsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDogdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcyxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVTZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcyhcbiAgICBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlczogU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25bXSxcbiAgICBtYXhSZXNlcnZhdGlvbnM6IG51bWJlcixcbiAgICBwbGFjZVNlbGVjdGlvbjogUGxhY2VTZWxlY3Rpb24sXG4gICk6IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uW10ge1xuICAgIC8vIEFkZCBzZWxlY3RlZCBwbGFjZSB0byBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlc1xuICAgIGlmIChwbGFjZVNlbGVjdGlvbi5zdGF0ZSA9PT0gJ1NFTEVDVEVEJykge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRQbGFjZURlY2tJbmRleCA9IHRoaXMuX2dldERlY2tJbmRleEJ5UGxhY2VJZChwbGFjZVNlbGVjdGlvbi5pZCk7XG4gICAgICBjb25zdCBzZWF0UmVzZXJ2YXRpb25TZWxlY3Rpb24gPSB0aGlzLl9nZXRTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbihcbiAgICAgICAgcGxhY2VTZWxlY3Rpb24sXG4gICAgICAgIHNlbGVjdGVkUGxhY2VEZWNrSW5kZXgsXG4gICAgICApO1xuICAgICAgaWYgKHNlYXRSZXNlcnZhdGlvblNlbGVjdGlvbikge1xuICAgICAgICBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5wdXNoKHNlYXRSZXNlcnZhdGlvblNlbGVjdGlvbik7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFJlbW92ZSBzZWxlY3RlZCBwbGFjZSBmcm9tIHNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzXG4gICAgZWxzZSB7XG4gICAgICBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcyA9IHNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzLmZpbHRlcihcbiAgICAgICAgKF9zZWxlY3RlZFBsYWNlKSA9PiBfc2VsZWN0ZWRQbGFjZS5pZCAhPT0gcGxhY2VTZWxlY3Rpb24uaWQsXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBDaGVja3Mgd2hldGhlciBtYXhSZXNlcnZhdGlvbiBpcyBhY3RpdmF0ZWQgYW5kIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzZWxlY3RlZCBwbGFjZXMgaXMgcmVhY2hlZFxuICAgIGlmIChtYXhSZXNlcnZhdGlvbnMgPiAtMSAmJiBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5sZW5ndGggPiBtYXhSZXNlcnZhdGlvbnMpIHtcbiAgICAgIGNvbnN0IHJlc2V0V2l0aFBsYWNlU2VsZWN0aW9uID0gbWF4UmVzZXJ2YXRpb25zID4gMCA/IHBsYWNlU2VsZWN0aW9uIDogdW5kZWZpbmVkO1xuXG4gICAgICBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcyA9IHRoaXMuX3Jlc2V0QWxsUGxhY2VTZWxlY3Rpb25zKFxuICAgICAgICBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcyxcbiAgICAgICAgcmVzZXRXaXRoUGxhY2VTZWxlY3Rpb24sXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlQ3VycmVudFNlbGVjdGVkUGxhY2VJbkNvYWNoKHBsYWNlU2VsZWN0aW9uOiBQbGFjZVNlbGVjdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IHBsYWNlRGVja0luZGV4ID0gdGhpcy5fZ2V0RGVja0luZGV4QnlQbGFjZUlkKHBsYWNlU2VsZWN0aW9uLmlkKTtcbiAgICBjb25zdCBjb2FjaEluZGV4ID0gcGxhY2VTZWxlY3Rpb24uY29hY2hJbmRleDtcblxuICAgIGlmIChwbGFjZURlY2tJbmRleCA9PT0gbnVsbCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcGxhY2UgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbcGxhY2VEZWNrSW5kZXhdLmNvYWNoSXRlbXNbY29hY2hJbmRleF0ucGxhY2VzPy5maW5kKFxuICAgICAgKHBsYWNlKSA9PiBwbGFjZS5udW1iZXIgPT0gcGxhY2VTZWxlY3Rpb24ubnVtYmVyLFxuICAgICk7XG5cbiAgICBpZiAoIXBsYWNlKSByZXR1cm47XG5cbiAgICB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCA9IHBsYWNlRGVja0luZGV4O1xuICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9IGNvYWNoSW5kZXg7XG4gICAgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSA9IHBsYWNlO1xuXG4gICAgaWYgKHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCAhPT0gdGhpcy5zZWxlY3RlZENvYWNoSW5kZXgpIHtcbiAgICAgIHRoaXMudXBkYXRlQ3VycmVudFNlbGVjdGVkQ29hY2goKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zZXRDdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZChwbGFjZSk7XG5cbiAgICAvLyBUaW1lIGRlbGF5IHRvIHdhaXQgZm9yIHN0YXR1cyB1cGRhdGUgcHJvY2VzcyBhdCBjbGlja2VkIHBsYWNlXG4gICAgY29uc3QgZGVsYXlTY3JvbGxJblZpZXdwb3J0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9zY3JvbGxQbGFjZUludG9OZWFyZXN0Vmlld3BvcnQocGxhY2VTZWxlY3Rpb24uaWQpO1xuICAgICAgY2xlYXJUaW1lb3V0KGRlbGF5U2Nyb2xsSW5WaWV3cG9ydCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlQ3VycmVudFNlbGVjdGVkQ29hY2goKTogdm9pZCB7XG4gICAgLy9Pbmx5IGlmIHRoZSBzZWxlY3RlZENvYWNoSW5kZXggaGFzIGNoYW5nZWQsIGFuIHVwZGF0ZSBuZWVkcyB0byBiZSBjYXJyaWVkIG91dFxuICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPT0gdGhpcy5zZWxlY3RlZENvYWNoSW5kZXgpIHJldHVybjtcblxuICAgIC8vIElmIGEgZm9jdXNpbmRleCBoYXMgYmVlbiBzZXQgKCE9IC0xKSwgaXQgY2FuIGJlIHVwZGF0ZWQgd2l0aCB0aGUgY3VycmVudCBzZWxlY3RlZENvYWNoSW5kZXhcbiAgICBpZiAodGhpcy5mb2N1c2VkQ29hY2hJbmRleCAhPSAtMSkge1xuICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleDtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RlZENvYWNoSW5kZXggPSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG5cbiAgICBjb25zdCBjb2FjaFNlbGVjdGlvbiA9IHRoaXMuX2dldFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkQ29hY2godGhpcy5zZWxlY3RlZENvYWNoSW5kZXgpO1xuICAgIGlmIChjb2FjaFNlbGVjdGlvbikge1xuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSB7Q3VzdG9tRXZlbnQ8U2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRDb2FjaD59XG4gICAgICAgKiBFbWl0cyB3aGVuIGEgY29hY2ggd2FzIHNlbGVjdGVkIGFuZCByZXR1cm5zIGEgQ29hY2hTZWxlY3Rpb25cbiAgICAgICAqL1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQ8U2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRDb2FjaD4oJ3NlbGVjdGVkY29hY2gnLCB7XG4gICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgICBkZXRhaWw6IGNvYWNoU2VsZWN0aW9uLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldFBsYWNlRWxlbWVudElkKFxuICAgIGNvYWNoRGVja0luZGV4OiBudW1iZXIsXG4gICAgY29hY2hJbmRleDogbnVtYmVyLFxuICAgIHBsYWNlTnVtYmVyOiBzdHJpbmcsXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIChcbiAgICAgICdzZWF0LXJlc2VydmF0aW9uX19wbGFjZS1idXR0b24tJyArIGNvYWNoRGVja0luZGV4ICsgJy0nICsgY29hY2hJbmRleCArICctJyArIHBsYWNlTnVtYmVyXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbiB0aGUgY2FzZSBvZiBjb2FjaCBsYXlvdXRzIHdpdGggZGlmZmVyZW50IGRlY2tzLFxuICAgKiBpdCBpcyBuZWNlc3NhcnkgdG8gZXh0ZW5kIHRoZSBvZmZzZXQgd2l0aCBlbXB0eSBjb2FjaGVzXG4gICAqIGluIG9yZGVyIHRvIGNyZWF0ZSBhIHN0YWJsZSB2ZWhpY2xlIGxheW91dC5cbiAgICpcbiAgICogICAgICAgICAgICAgW29vb10tW29vb10tW29vb11cbiAgICogW29vb10tW29vb10tW29vb10tW29vb10tW29vb11cbiAgICovXG4gIHByaXZhdGUgX2luaXRFbXB0eUNvYWNoRGVja09mZnNldHMoKTogdm9pZCB7XG4gICAgLy8gUHJlZmlsbCBvZmZzZXQgY291bnRlcnMgd2l0aCAwIHN0YXJ0IGluZGV4XG4gICAgY29uc3QgY29hY2hPZmZzZXRJbmRleENvdW50ZXIgPSBBcnJheSh0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoIC0gMSkuZmlsbCgwKTtcbiAgICAvLyBUYWtlcyB0aGUgbG93ZXIgZGVjayB3aGljaCBjb250YWlucyB0aGUgbWF4IG51bWJlcnMgb2YgY29hY2hlc1xuICAgIGNvbnN0IGxvd2VyRGVjayA9IHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoIC0gMV07XG5cbiAgICBsb3dlckRlY2suY29hY2hJdGVtcy5mb3JFYWNoKChsb3dlckNvYWNoSXRlbTogQ29hY2hJdGVtKSA9PiB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VhdFJlc2VydmF0aW9ucy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgY29uc3QgZGVja0NvYWNoSXRlbSA9IHRoaXMuc2VhdFJlc2VydmF0aW9uc1tpXS5jb2FjaEl0ZW1zW2NvYWNoT2Zmc2V0SW5kZXhDb3VudGVyW2ldXTtcbiAgICAgICAgaWYgKGxvd2VyQ29hY2hJdGVtLmlkICE9IGRlY2tDb2FjaEl0ZW0/LmlkKSB7XG4gICAgICAgICAgLy8gQWRkIEVtcHR5IG9mZnNldCBjb2FjaCB0byBzcGVjaWZpZWQgaW5kZXggcG9zaXRpb25cbiAgICAgICAgICBjb25zdCBlbXB0eU9mZnNldENvYWNoID0ge1xuICAgICAgICAgICAgLi4ubG93ZXJDb2FjaEl0ZW0sXG4gICAgICAgICAgICBwbGFjZXM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHByb3BlcnR5SWRzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBncmFwaGljRWxlbWVudHM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHNlcnZpY2VFbGVtZW50czogdW5kZWZpbmVkLFxuICAgICAgICAgICAgdHJhdmVsQ2xhc3M6IFtdLFxuICAgICAgICAgIH07XG4gICAgICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zW2ldLmNvYWNoSXRlbXMuc3BsaWNlKFxuICAgICAgICAgICAgY29hY2hPZmZzZXRJbmRleENvdW50ZXJbaV0sXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgZW1wdHlPZmZzZXRDb2FjaCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29hY2hPZmZzZXRJbmRleENvdW50ZXJbaV0rKztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXphdGlvbiBvZiBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbiBBcnJheSBiYXNlZCBvbiB0aGUgdHJhbnNmZXJyZWQgcGxhY2VzXG4gICAqIHRoYXQgaGF2ZSB0aGUgc3RhdGUgU0VMRUNURUQgd2l0aGluIHRoZSBzZWF0UmVzZXJ2YXRpb24gb2JqZWN0XG4gICAqL1xuICBwcml2YXRlIF9pbml0U2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgLy8gUmVzZXQgcGxhY2Ugc2VsZWN0aW9uc1xuICAgIHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMuc2VhdHMgPSBbXTtcbiAgICB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzLmJpY3ljbGVzID0gW107XG5cbiAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnM/LmZvckVhY2goKHNlYXRSZXNlcnZhdGlvbjogU2VhdFJlc2VydmF0aW9uLCBjb2FjaERlY2tJbmRleDogbnVtYmVyKSA9PlxuICAgICAgc2VhdFJlc2VydmF0aW9uLmNvYWNoSXRlbXMubWFwKChjb2FjaDogQ29hY2hJdGVtLCBjb2FjaEluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgY29hY2gucGxhY2VzXG4gICAgICAgICAgPy5maWx0ZXIoKHBsYWNlKSA9PiBwbGFjZS5zdGF0ZSA9PT0gJ1NFTEVDVEVEJylcbiAgICAgICAgICA/LmZvckVhY2goKHBsYWNlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwbGFjZUlkID0gdGhpcy5nZXRQbGFjZUVsZW1lbnRJZChjb2FjaERlY2tJbmRleCwgY29hY2hJbmRleCwgcGxhY2UubnVtYmVyKTtcbiAgICAgICAgICAgIGNvbnN0IHByZXNlbGVjdGVkUGxhY2VTZWxlY3Rpb246IFBsYWNlU2VsZWN0aW9uID0gbWFwUGxhY2VJbmZvc1RvUGxhY2VTZWxlY3Rpb24oXG4gICAgICAgICAgICAgIHBsYWNlLFxuICAgICAgICAgICAgICBwbGFjZUlkLFxuICAgICAgICAgICAgICBzZWF0UmVzZXJ2YXRpb24uZGVja0NvYWNoSW5kZXgsXG4gICAgICAgICAgICAgIGNvYWNoSW5kZXgsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCBzZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbjogU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24gfCBudWxsID1cbiAgICAgICAgICAgICAgdGhpcy5fZ2V0U2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24ocHJlc2VsZWN0ZWRQbGFjZVNlbGVjdGlvbiwgY29hY2hEZWNrSW5kZXgpO1xuXG4gICAgICAgICAgICBpZiAoc2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgaWYgKHNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uLnBsYWNlVHlwZSA9PT0gJ1NFQVQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5zZWF0cy5wdXNoKHNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzLmJpY3ljbGVzLnB1c2goc2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbCBzZWxlY3RlZCBwbGFjZXMgd2lsbCBiZSByZXNldCBvciB0aGUgY3VycmVudFNlbGVjdGVkUGxhY2Ugd2FzIGdpdmVuLCB0aGVuIHdlIHJlc2V0IGFsbCBleGNlcHQgY3VycmVudFNlbGVjdGVkUGxhY2VcbiAgICogQHBhcmFtIHJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25zXG4gICAqIEBwYXJhbSBjdXJyU2VsZWN0ZWRQbGFjZVxuICAgKi9cbiAgcHJpdmF0ZSBfcmVzZXRBbGxQbGFjZVNlbGVjdGlvbnMoXG4gICAgcmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbnM6IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uW10sXG4gICAgY3VyclNlbGVjdGVkUGxhY2U/OiBQbGFjZVNlbGVjdGlvbixcbiAgKTogU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25bXSB7XG4gICAgLy9GaW5kIGFsbCBwbGFjZXMgdG8gYmUgbmVlZGVkIHVuc2VsZWN0XG4gICAgZm9yIChjb25zdCBwbGFjZVNlbGVjdGlvbiBvZiByZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9ucykge1xuICAgICAgaWYgKCFjdXJyU2VsZWN0ZWRQbGFjZSB8fCBjdXJyU2VsZWN0ZWRQbGFjZS5pZCAhPT0gcGxhY2VTZWxlY3Rpb24uaWQpIHtcbiAgICAgICAgY29uc3QgcGxhY2VFbGVtZW50ID0gdGhpcy5zaGFkb3dSb290Py5nZXRFbGVtZW50QnlJZChwbGFjZVNlbGVjdGlvbi5pZCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmIChwbGFjZUVsZW1lbnQpIHtcbiAgICAgICAgICBwbGFjZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdzdGF0ZScsICdGUkVFJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy9SZW1vdmVzIGFsbCBzZWxlY3RlZCBwbGFjZXMgZXhjZXB0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGxhY2VcbiAgICBpZiAoY3VyclNlbGVjdGVkUGxhY2UpIHtcbiAgICAgIHJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25zID0gcmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbnMuZmlsdGVyKFxuICAgICAgICAoX3NlbGVjdGVkUGxhY2UpID0+IF9zZWxlY3RlZFBsYWNlLmlkID09PSBjdXJyU2VsZWN0ZWRQbGFjZS5pZCxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25zID0gW107XG4gICAgfVxuICAgIHJldHVybiByZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgX2dldFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKFxuICAgIGN1cnJTZWxlY3RlZFBsYWNlOiBQbGFjZVNlbGVjdGlvbixcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyIHwgbnVsbCxcbiAgKTogU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24gfCBudWxsIHtcbiAgICBpZiAoY29hY2hEZWNrSW5kZXggPT09IG51bGwpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgY29hY2ggPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbY29hY2hEZWNrSW5kZXhdLmNvYWNoSXRlbXNbY3VyclNlbGVjdGVkUGxhY2UuY29hY2hJbmRleF07XG4gICAgY29uc3QgcGxhY2UgPSBjb2FjaC5wbGFjZXM/LmZpbmQoKHBsYWNlKSA9PiBwbGFjZS5udW1iZXIgPT09IGN1cnJTZWxlY3RlZFBsYWNlLm51bWJlcik7XG5cbiAgICByZXR1cm4gcGxhY2VcbiAgICAgID8gbWFwUGxhY2VBbmRDb2FjaFRvU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24oXG4gICAgICAgICAgcGxhY2UsXG4gICAgICAgICAgY29hY2gsXG4gICAgICAgICAgY3VyclNlbGVjdGVkUGxhY2UuaWQsXG4gICAgICAgICAgY3VyclNlbGVjdGVkUGxhY2UuZGVja0luZGV4LFxuICAgICAgICAgIGN1cnJTZWxlY3RlZFBsYWNlLmNvYWNoSW5kZXgsXG4gICAgICAgIClcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkQ29hY2goXG4gICAgY29hY2hJbmRleDogbnVtYmVyLFxuICApOiBTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZENvYWNoIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLmNvYWNoSXRlbXNbY29hY2hJbmRleF0pIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgY29hY2ggPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLmNvYWNoSXRlbXNbY29hY2hJbmRleF07XG4gICAgY29uc3QgY29hY2hOdW1iZXJPZkZyZWVQbGFjZXMgPSB0aGlzLmdldEF2YWlsYWJsZUZyZWVQbGFjZXNOdW1Gcm9tQ29hY2goY29hY2gucGxhY2VzKTtcbiAgICByZXR1cm4gbWFwQ29hY2hJbmZvc1RvQ29hY2hTZWxlY3Rpb24oY29hY2hJbmRleCwgY29hY2gsIGNvYWNoTnVtYmVyT2ZGcmVlUGxhY2VzKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NldEN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkKHBsYWNlOiBQbGFjZSB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkID0gcGxhY2VcbiAgICAgID8gdGhpcy5nZXRQbGFjZUVsZW1lbnRJZChcbiAgICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCxcbiAgICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXgsXG4gICAgICAgICAgcGxhY2UubnVtYmVyLFxuICAgICAgICApXG4gICAgICA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyYXRpb24gb2YgdGhlIHVzZWQgZG9jdW1lbnRzIGZvbnQtc2l6ZSB3aGljaCBuZWVkc1xuICAgKiB0byBiZSBkZXRlcm1pbmVkIGluIG9yZGVyIHRvIGNvcnJlY3RseSBjYWxjdWxhdGUgQ1NTIHZhbHVlcyB3aXRoIHJlbVxuICAgKiAqL1xuICBwcml2YXRlIF9kZXRlcm1pbmVCYXNlRm9udFNpemUoKTogdm9pZCB7XG4gICAgaWYgKCFpc1NlcnZlcikge1xuICAgICAgY29uc3QgYmFzZUZvbnRTaXplID0gcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSkuZm9udFNpemUsIDEwKTtcbiAgICAgIC8vY2FsY3VsYXRlIHJlbSBvZiAxcHhcbiAgICAgIGNvbnN0IG9uZVBpeGVsSW5SZW0gPSAxIC8gYmFzZUZvbnRTaXplO1xuICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tb25lLXB4LXJlbScsIGAke29uZVBpeGVsSW5SZW0gKyAncmVtJ31gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgZGF0YSBmb3IgZGlzcGxheWluZyBuYXZpZ2F0aW9uIGFyZWEuXG4gICAqIENhbGN1bGF0ZXMgdGhlIHZhbHVlcyB3aGljaCBhcmUgbm90IGdvaW5nIHRvIGNoYW5nZSBkdXJpbmcgdXNlIG9mIGEgY29tcG9uZW50OlxuICAgKiAgICAtIGNvYWNoIGlkXG4gICAqICAgIC0gbGlzdCBvZiBzZXJ2aWNlIGljb25zXG4gICAqICAgIC0gY2xhc3MgKGZpcnN0LCBzZWNvbmQsIGFueSlcbiAgICogICAgLSB3aGV0aGVyIHRoZXJlIGlzIGEgZHJpdmVyIGFyZWEgbGVmdCBvciByaWdodFxuICAgKiAqL1xuICBwcml2YXRlIF9wcmVwYXJlQ29hY2hJdGVtRGV0YWlsc0RhdGEoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VhdFJlc2VydmF0aW9ucykge1xuICAgICAgY29uc3QgbG93ZXJEZWNrOiBDb2FjaEl0ZW1bXSA9XG4gICAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoIC0gMV0uY29hY2hJdGVtcztcblxuICAgICAgdGhpcy5jb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHMgPSBbXTtcblxuICAgICAgbG93ZXJEZWNrLmZvckVhY2goKGNvYWNoLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCB0cmF2ZWxDbGFzc2VzOiBQbGFjZVRyYXZlbENsYXNzW10gPSBbXTtcbiAgICAgICAgY29uc3QgcHJvcGVydHlJZHM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGNvbnN0IHBsYWNlczogUGxhY2VbXSA9IFtdO1xuXG4gICAgICAgIC8vIENvbGxlY3QgYWxsIGltcG9ydGFudCBuYXZpZ2F0aW9uIGRhdGEgdG8gYmUgcmVuZGVyZWRcbiAgICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zXG4gICAgICAgICAgLm1hcCgoc3IpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBzci5jb2FjaEl0ZW1zW2luZGV4XTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5mb3JFYWNoKChjb2FjaDogQ29hY2hJdGVtKSA9PiB7XG4gICAgICAgICAgICB0cmF2ZWxDbGFzc2VzLnB1c2goLi4uY29hY2gudHJhdmVsQ2xhc3MpO1xuICAgICAgICAgICAgcHJvcGVydHlJZHMucHVzaCguLi4oY29hY2gucHJvcGVydHlJZHMgPyBjb2FjaC5wcm9wZXJ0eUlkcyA6IFtdKSk7XG4gICAgICAgICAgICBwbGFjZXMucHVzaCguLi4oY29hY2gucGxhY2VzID8gY29hY2gucGxhY2VzIDogW10pKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50cy5wdXNoKHtcbiAgICAgICAgICBpZDogY29hY2guaWQsXG4gICAgICAgICAgdHJhdmVsQ2xhc3M6IHRoaXMuX3ByZXBhcmVUcmF2ZWxDbGFzc05hdmlnYXRpb24odHJhdmVsQ2xhc3NlcyksXG4gICAgICAgICAgcHJvcGVydHlJZHM6IHRoaXMuX3ByZXBhcmVTZXJ2aWNlSWNvbnNOYXZpZ2F0aW9uKHByb3BlcnR5SWRzKSxcbiAgICAgICAgICBpc0RyaXZlckFyZWE6IGNvYWNoLnBsYWNlcyA/IGNvYWNoLnBsYWNlcy5sZW5ndGggPT09IDAgOiB0cnVlLFxuICAgICAgICAgIGRyaXZlckFyZWFTaWRlOiB0aGlzLl9wcmVwYXJlRHJpdmVyQXJlYVNpZGVOYXZpZ2F0aW9uKGNvYWNoKSxcbiAgICAgICAgICBmcmVlUGxhY2VzOiB0aGlzLmdldEF2YWlsYWJsZUZyZWVQbGFjZXNOdW1Gcm9tQ29hY2gocGxhY2VzKSxcbiAgICAgICAgICBkcml2ZXJBcmVhRWxlbWVudHM6IHRoaXMuX3NldERyaXZlckFyZWFzRWxlbWVudHMoY29hY2gpLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vICNUSU1PLTQ1ODU4XG4gIC8vIEZpbmRzIHRoZSBvcHRpbWFsIGljb24gc2l6ZSBiYXNlZCBvbiBhbGwgc2VydmljZUVsZW1lbnRzIGFuZCB0aGVpciBkaW1lbnNpb24uXG4gIC8vIFRoaXMgc2V0cyB0aGUgZ2xvYmFsQXJlYUljb25EaW0gYW5kIGlzIHVzZWQgd2hlbiBjcmVhdGluZyB0aGUgc2VhdCByZXNlcnZhdGlvbiBhcmVhIGVsZW1lbnRzLlxuICAvLyBUaGlzIGdpdmVzIHVzIGEgbWF4aW11bSB1bmlmb3JtIGljb24gc2l6ZSB3aXRoaW4gdGhlIGFyZWEgZWxlbWVudHNcbiAgcHJpdmF0ZSBfcHJlcGFyZU9wdGltaXplQXJlYUljb25EaW1lbnNpb25CeU1lZGlhbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWF0UmVzZXJ2YXRpb25zKSB7XG4gICAgICBjb25zdCBhbGxTZXJ2aWNlRGltZW5zaW9uczogRWxlbWVudERpbWVuc2lvbltdID0gW107XG4gICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnMuZm9yRWFjaCgoZGVjaykgPT5cbiAgICAgICAgZGVjay5jb2FjaEl0ZW1zLmZvckVhY2goKGNvYWNoKSA9PlxuICAgICAgICAgIGNvYWNoLnNlcnZpY2VFbGVtZW50cz8uZm9yRWFjaCgoaWNvbikgPT4gYWxsU2VydmljZURpbWVuc2lvbnMucHVzaChpY29uLmRpbWVuc2lvbikpLFxuICAgICAgICApLFxuICAgICAgKTtcblxuICAgICAgaWYgKGFsbFNlcnZpY2VEaW1lbnNpb25zLmxlbmd0aCkge1xuICAgICAgICBhbGxTZXJ2aWNlRGltZW5zaW9ucy5zb3J0KFxuICAgICAgICAgIChkaW0xOiBFbGVtZW50RGltZW5zaW9uIHwgdW5kZWZpbmVkLCBkaW0yOiBFbGVtZW50RGltZW5zaW9uIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICAgICAgICBpZiAoZGltMSAmJiBkaW0yKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG1heERpbTEgPSBkaW0xLncgKyBkaW0xLmg7XG4gICAgICAgICAgICAgIGNvbnN0IG1heERpbTIgPSBkaW0yLncgKyBkaW0yLmg7XG4gICAgICAgICAgICAgIGlmIChtYXhEaW0xID4gbWF4RGltMikgcmV0dXJuIDE7XG4gICAgICAgICAgICAgIGVsc2UgaWYgKG1heERpbTEgPCBtYXhEaW0yKSByZXR1cm4gLTE7XG4gICAgICAgICAgICAgIGVsc2UgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIGJlc3QgaWNvbiBzaXplIGJ5IG1lZGlhblxuICAgICAgICBjb25zdCBtZWRpYW5JY29uU2l6ZSA9IGFsbFNlcnZpY2VEaW1lbnNpb25zW01hdGguZmxvb3IoYWxsU2VydmljZURpbWVuc2lvbnMubGVuZ3RoIC8gMildITtcblxuICAgICAgICAvLyBTZXQgdGhlIGRldGVybWluZWQgbWVkaWFuIGljb24gc2l6ZSBhcyBnbG9iYWwgY2FsY3VsYXRlZCBhcmVhIGljb24gZGltZW5zaW9uXG4gICAgICAgIHRoaXMuZ2xvYmFsQXJlYUljb25EaW0gPSB0aGlzLmdldENhbGN1bGF0ZWREaW1lbnNpb24obWVkaWFuSWNvblNpemUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZmluZCB0aGUgbWF4aW11bSBjb2FjaCBoZWlnaHQgZnJvbSBhbGwgZGVja3NcbiAgICAgICAgY29uc3QgbWF4Q29hY2hIZWlnaHQgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNcbiAgICAgICAgICAuZmxhdE1hcCgoZGVjaykgPT4gZGVjay5jb2FjaEl0ZW1zLm1hcCgoY29hY2gpID0+IGNvYWNoLmRpbWVuc2lvbi5oKSlcbiAgICAgICAgICAucmVkdWNlKChtYXgsIGhlaWdodCkgPT4gTWF0aC5tYXgobWF4LCBoZWlnaHQpLCAwKTtcblxuICAgICAgICAvL2NhbGN1bGF0ZSAyMCUgb2YgbWF4aW11bSBoZWlnaHQgYXMgaWNvbiBkaW1lbnNpb25cbiAgICAgICAgY29uc3QgaWNvbkRpbWVuc2lvbiA9IE1hdGguZmxvb3IobWF4Q29hY2hIZWlnaHQgKiAwLjIpO1xuICAgICAgICB0aGlzLmdsb2JhbEFyZWFJY29uRGltID0gdGhpcy5nZXRDYWxjdWxhdGVkRGltZW5zaW9uKHtcbiAgICAgICAgICB3OiBpY29uRGltZW5zaW9uLFxuICAgICAgICAgIGg6IGljb25EaW1lbnNpb24sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3ByZXBhcmVUcmF2ZWxDbGFzc05hdmlnYXRpb24odHJhdmVsQ2xhc3NlczogUGxhY2VUcmF2ZWxDbGFzc1tdKTogUGxhY2VUcmF2ZWxDbGFzcyB7XG4gICAgaWYgKHRyYXZlbENsYXNzZXMuaW5kZXhPZignRklSU1QnKSAhPT0gLTEpIHJldHVybiAnRklSU1QnO1xuICAgIGlmICh0cmF2ZWxDbGFzc2VzLmluZGV4T2YoJ1NFQ09ORCcpICE9PSAtMSkgcmV0dXJuICdTRUNPTkQnO1xuICAgIHJldHVybiAnQU5ZX0NMQVNTJztcbiAgfVxuXG4gIHByaXZhdGUgX3ByZXBhcmVEcml2ZXJBcmVhU2lkZU5hdmlnYXRpb24oXG4gICAgY29hY2hJdGVtOiBDb2FjaEl0ZW0sXG4gICk6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjb2FjaERyaXZlckFyZWFzID0gY29hY2hJdGVtLmdyYXBoaWNFbGVtZW50cz8uZmlsdGVyKFxuICAgICAgKGdyYXBoaWNhbEVsZW1lbnRzKSA9PiBncmFwaGljYWxFbGVtZW50cy5pY29uID09PSAnRFJJVkVSX0FSRUEnLFxuICAgICk7XG5cbiAgICBpZiAoY29hY2hEcml2ZXJBcmVhcyAmJiBjb2FjaERyaXZlckFyZWFzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIENoZWNraW5nIHRoZSBkcml2ZXIgYXJlYSBwb3NpdGlvbiB3aGV0aGVyIGl0IGlzIHByZXNlbnQgb24gdGhlIGxlZnQgb3IgcmlnaHQgc2lkZSBpbiBhIGNvYWNoXG4gICAgICBjb25zdCBoYXNMZWZ0RHJpdmVyQXJlYSA9XG4gICAgICAgIGNvYWNoRHJpdmVyQXJlYXMuZmluZCgoZHJpdmVyQXJlYUVsZW1lbnQpID0+IGRyaXZlckFyZWFFbGVtZW50LnBvc2l0aW9uLnggPT09IDApIHx8IGZhbHNlO1xuICAgICAgY29uc3QgaGFzUmlnaHREcml2ZXJBcmVhID1cbiAgICAgICAgY29hY2hEcml2ZXJBcmVhcy5maW5kKChkcml2ZXJBcmVhRWxlbWVudCkgPT4gZHJpdmVyQXJlYUVsZW1lbnQucG9zaXRpb24ueCA+IDApIHx8IGZhbHNlO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBsZWZ0OiAhIWhhc0xlZnREcml2ZXJBcmVhLFxuICAgICAgICByaWdodDogISFoYXNSaWdodERyaXZlckFyZWEsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBfcHJlcGFyZVNlcnZpY2VJY29uc05hdmlnYXRpb24gPSAocHJvcGVydHlJZHM6IHN0cmluZ1tdKTogc3RyaW5nW10gPT4ge1xuICAgIGlmICghcHJvcGVydHlJZHMpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBzaHJ1bmtQcm9wZXJ0eUlkcyA9IHByb3BlcnR5SWRzXG4gICAgICA/Lm1hcChmdW5jdGlvbiAocHJvcGVydHlJZDogc3RyaW5nKToge1xuICAgICAgICBwSWQ6IHN0cmluZztcbiAgICAgICAgc3ZnTmFtZTogc3RyaW5nO1xuICAgICAgfSB7XG4gICAgICAgIC8vIHByZXBhcmUgdGVtcG9yYXJ5IG9iamVjdCBtYXBwaW5nIHByb3BlcnR5IGlkIHRvIGl0J3Mgc3ZnTmFtZSBzbyB0aGF0IHdlIGNhbiBjb21wYXJlIGl0IHRvIHRoZSBsaXN0IG9mIGFsbG93ZWQgaWNvbnNcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwSWQ6IHByb3BlcnR5SWQsXG4gICAgICAgICAgc3ZnTmFtZTogbWFwSWNvblRvU3ZnW3Byb3BlcnR5SWRdPy5zdmdOYW1lID8gbWFwSWNvblRvU3ZnW3Byb3BlcnR5SWRdPy5zdmdOYW1lIDogJycsXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICAgLy9maWx0ZXIgb3V0IG9iamVjdHMgc2VydmljZSBpY29ucyB3aGljaCBhcmUgbm90IGluIEFMTE9XRURfU0VSVklDRV9JQ09OU1xuICAgICAgLmZpbHRlcigocHJvcGVydHlUb1N2ZykgPT4gQUxMT1dFRF9TRVJWSUNFX0lDT05TLmluZGV4T2YocHJvcGVydHlUb1N2Zy5zdmdOYW1lKSAhPT0gLTEpXG4gICAgICAvL21ha2UgaXQgZGlzdGluY3QgYnkgc3ZnTmFtZVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKHZhbHVlLCBpbmRleCwgc2VsZikgPT5cbiAgICAgICAgICBzZWxmLm1hcCgocHJvcFN2ZykgPT4gcHJvcFN2Zy5zdmdOYW1lKS5pbmRleE9mKHZhbHVlLnN2Z05hbWUpID09PSBpbmRleCxcbiAgICAgIClcbiAgICAgIC8vIGdvIGJhY2sgdG8gcHJvcGVydHlJZCBzdHJpbmcgZnJvbSB0ZW1wb3Jhcnkgb2JqZWN0XG4gICAgICAubWFwKChwcm9wZXJ0eVRvU3ZnKSA9PiBwcm9wZXJ0eVRvU3ZnLnBJZClcbiAgICAgIC8vIHRha2UgZmlyc3QgTUFYX1NFUlZJQ0VfUFJPUEVSVElFUyByZWdhcmRsZXNzIG9mIHRoZSBpbnB1dCBmcm9tIEJhY2tlbmQsIG90aGVyd2lzZSB0aGUgbGF5b3V0IGNvdWxkIGJlIGRlc3Ryb3llZFxuICAgICAgLnNsaWNlKDAsIE1BWF9TRVJWSUNFX1BST1BFUlRJRVMpO1xuICAgIHJldHVybiBzaHJ1bmtQcm9wZXJ0eUlkcyA/IHNocnVua1Byb3BlcnR5SWRzIDogW107XG4gIH07XG5cbiAgcHJpdmF0ZSBfcHJlcGFyZUNvYWNoV2lkdGhBbmRHYXBDYWxjdWxhdGlvbnMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VhdFJlc2VydmF0aW9ucykge1xuICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zLmZvckVhY2goKHNlYXRSZXNlcnZhdGlvbjogU2VhdFJlc2VydmF0aW9uKSA9PiB7XG4gICAgICAgIHNlYXRSZXNlcnZhdGlvbj8uY29hY2hJdGVtcz8uZm9yRWFjaCgoY29hY2hJdGVtOiBDb2FjaEl0ZW0pID0+IHtcbiAgICAgICAgICBjb25zdCBoYXNPdmVyaGFuZ2luZ1BsYWNlcyA9IHRoaXMuX2lzT3ZlcmhhbmdpbmdFbGVtZW50c1ByZXNlbnQoXG4gICAgICAgICAgICBjb2FjaEl0ZW0uZGltZW5zaW9uLncsXG4gICAgICAgICAgICBjb2FjaEl0ZW0ucGxhY2VzLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvL011c3QgIGJlIGRvbmUgYWxzbyBmb3IgZ3JhcGhpY2FsIGVsZW1lbnRzLCBhcyB0aGV5IGNhbiBhbHNvIHByb3RydWRlIHRoZSBjb2FjaCBib3JkZXJcbiAgICAgICAgICAvLyBDaGVjayBvbmx5IGdyYXBoaWNhbCBlbGVtZW50cyB0aGF0IGFyZSBub3QgYXJlYSBlbGVtZW50c1xuICAgICAgICAgIGNvbnN0IGZpbHRlcmVkRWxlbWVudHMgPSBjb2FjaEl0ZW0uZ3JhcGhpY0VsZW1lbnRzPy5maWx0ZXIoXG4gICAgICAgICAgICAoZSkgPT4gZS5pY29uICYmICF0aGlzLm5vdEFyZWFFbGVtZW50cy5pbmNsdWRlcyhlLmljb24pLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb25zdCBoYXNPdmVyaGFuZ2luZ0dyYXBoaWNBcmVhcyA9IHRoaXMuX2lzT3ZlcmhhbmdpbmdFbGVtZW50c1ByZXNlbnQoXG4gICAgICAgICAgICBjb2FjaEl0ZW0uZGltZW5zaW9uLncsXG4gICAgICAgICAgICBmaWx0ZXJlZEVsZW1lbnRzLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICB0aGlzLm92ZXJIYW5naW5nRWxlbWVudEluZm9ybWF0aW9uLnB1c2goe1xuICAgICAgICAgICAgY29hY2hJZDogY29hY2hJdGVtLmlkLFxuICAgICAgICAgICAgb3ZlcmhhbmdpbmdQbGFjZXM6IGhhc092ZXJoYW5naW5nUGxhY2VzLFxuICAgICAgICAgICAgb3ZlcmhhbmdpbmdHcmFwaGljQXJlYXM6IGhhc092ZXJoYW5naW5nR3JhcGhpY0FyZWFzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNlbGVjdGVkIHBsYWNlIEhUTUwgZWxlbWVudCBieSBjdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZC5cbiAgICogQHJldHVybnMgSFRNTEVsZW1lbnQgb3IgbnVsbFxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0UGxhY2VIdG1sRWxlbWVudCgpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkXG4gICAgICA/IHRoaXMuc2hhZG93Um9vdD8uZ2V0RWxlbWVudEJ5SWQodGhpcy5jdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZCkgfHwgbnVsbFxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGV4dHJhY3RlZCBjb2FjaCBkZWNrIGluZGV4IGZyb20gcGxhY2UgaWRcbiAgICogQHJldHVybnMgbnVtYmVyXG4gICAqL1xuICBwcml2YXRlIF9nZXREZWNrSW5kZXhCeVBsYWNlSWQocGxhY2VJZDogc3RyaW5nKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgY29uc3QgZGVja0luZGV4ID0gdGhpcy5zaGFkb3dSb290XG4gICAgICA/LnF1ZXJ5U2VsZWN0b3IoJyMnICsgcGxhY2VJZClcbiAgICAgID8uZ2V0QXR0cmlidXRlKCdkYXRhLWRlY2staW5kZXgnKTtcbiAgICBpZiAoZGVja0luZGV4ICYmICFpc05hTigrZGVja0luZGV4KSkge1xuICAgICAgcmV0dXJuICtkZWNrSW5kZXg7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNWYWxpZENvYWNoSW5kZXgoY29hY2hJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNvYWNoSW5kZXggPj0gMCAmJlxuICAgICAgY29hY2hJbmRleCA8PSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCAtIDFdLmNvYWNoSXRlbXMubGVuZ3RoXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGV4aXN0aW5nIGNvYWNoIGRlY2sgaW5kZXggZGVwZW5kaW5nIG9uIHRoZSBzZWxlY3RlZCBjb2FjaC5cbiAgICogVGhpcyBtZXRob2QgaXMgbmVjZXNzYXJ5IHRvIGdldCBhbiBhdmFpbGFibGUgY29hY2ggZGVjayBpbmRleCBkdXJpbmcga2V5Ym9hcmQgbmF2aWdhdGlvbiwgd2hpY2ggY2FuIHZhcnkgYmV0d2VlbiBjb2FjaGVzIHdpdGggZGlmZmVyZW50IGRlY2tzLlxuICAgKiBGb3IgZXhhbXBsZSwgd2hlbiBuYXZpZ2F0aW5nIGZyb20gYSBjb2FjaCB3aXRoIHR3byBkZWNrcyB0byBhIGNvYWNoIHdpdGggb25lIGRlY2suXG4gICAqXG4gICAqICAgICAgIFtvb29dLVtvb29dLVtvb29dXG4gICAqIFtvb29dLVtvb29dLVtvb29dLVtvb29dLVtvb29dXG4gICAqXG4gICAqIEByZXR1cm5zIG51bWJlclxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0RXhpc3RpbmdDb2FjaERlY2tJbmRleCgpOiBudW1iZXIge1xuICAgIGlmIChcbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0uY29hY2hJdGVtc1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdXG4gICAgICAgIC5wbGFjZXMgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4O1xuICAgIH1cblxuICAgIC8vIEZpbmQgbmV4dCBwb3NzaWJsZSBjb2FjaCBkZWNrIGluZGV4IHdoZXJlIHBsYWNlcyBleGlzdFxuICAgIGNvbnN0IG5leHRBdmFpbGFibGVEZWNrQ29hY2hJbmRleCA9IHRoaXMuc2VhdFJlc2VydmF0aW9ucy5maW5kSW5kZXgoXG4gICAgICAoc2VhdFJlc2VydmF0aW9uKSA9PlxuICAgICAgICBzZWF0UmVzZXJ2YXRpb24uY29hY2hJdGVtc1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdLnBsYWNlcyAhPT0gdW5kZWZpbmVkLFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ID49IG5leHRBdmFpbGFibGVEZWNrQ29hY2hJbmRleFxuICAgICAgPyB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleFxuICAgICAgOiBuZXh0QXZhaWxhYmxlRGVja0NvYWNoSW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogSWYgYSBzZWxlY3RlZCBwbGFjZSBpcyBzbGlnaHRseSBoaWRkZW4gYnkgdGhlIG92ZXJmbG93IHNjcm9sbCBjb250ZW50IGFuZCBpcyBzdGlsbCBjbGlja2VkLFxuICAgKiB0aGUgbWV0aG9kIHRyaWVzIHRvIHNjcm9sbCB0aGUgc2VsZWN0ZWQgcGxhY2UgaW50byB0aGUgbmVhcmVzdCB2aWV3cG9ydCwgc28gdGhhdCBpdCBpcyBjb21wbGV0ZWx5IHZpc2libGUuXG4gICAqXG4gICAqIEBwYXJhbSBwbGFjZUlkXG4gICAqL1xuICBwcml2YXRlIF9zY3JvbGxQbGFjZUludG9OZWFyZXN0Vmlld3BvcnQocGxhY2VJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zaGFkb3dSb290XG4gICAgICA/LmdldEVsZW1lbnRCeUlkKHBsYWNlSWQpXG4gICAgICA/LnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ25lYXJlc3QnLCBpbmxpbmU6ICduZWFyZXN0JyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBjaGVja3MgaWYgYW55IHBsYWNlcyBvciBncmFwaGljYWwgZWxlbWVudHMgKGUuZy4gdG9pbGV0IGFyZWEsIGV0Yy4pIGFyZSBvdmVyaGFuZ2luZyB0aGUgY29hY2ggYm9yZGVyc1xuICAgKiBAcGFyYW0gY29hY2hJdGVtV2lkdGhcbiAgICogQHBhcmFtIGVsZW1lbnRzXG4gICAqL1xuICBwcml2YXRlIF9pc092ZXJoYW5naW5nRWxlbWVudHNQcmVzZW50KFxuICAgIGNvYWNoSXRlbVdpZHRoOiBudW1iZXIsXG4gICAgZWxlbWVudHM6IChQbGFjZSB8IEJhc2VFbGVtZW50KVtdIHwgdW5kZWZpbmVkLFxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgZWxlbWVudHM/LnNvbWUoXG4gICAgICAgIChlbGVtZW50KSA9PlxuICAgICAgICAgIGVsZW1lbnQucG9zaXRpb24ueCA9PT0gMCB8fCBlbGVtZW50LnBvc2l0aW9uLnggKyBlbGVtZW50LmRpbWVuc2lvbi53ID49IGNvYWNoSXRlbVdpZHRoLFxuICAgICAgKSA/PyBmYWxzZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogY29sbGVjdCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZHJpdmVyQXJlYXMgZm9yIG9uZSBjb2FjaFxuICAgKiBAcGFyYW0gY29hY2hJdGVtXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIF9zZXREcml2ZXJBcmVhc0VsZW1lbnRzKGNvYWNoSXRlbTogQ29hY2hJdGVtKToge1xuICAgIGRyaXZlckFyZWE6IEJhc2VFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgIGRyaXZlckFyZWFOb1ZlcnRpY2FsV2FsbDogQmFzZUVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gIH0ge1xuICAgIGlmIChjb2FjaEl0ZW0pIHtcbiAgICAgIGNvbnN0IGRyaXZlckFyZWEgPSBjb2FjaEl0ZW0uZ3JhcGhpY0VsZW1lbnRzPy5maW5kKFxuICAgICAgICAoZWxlbWVudDogQmFzZUVsZW1lbnQpID0+IGVsZW1lbnQuaWNvbiA9PT0gJ0RSSVZFUl9BUkVBJyxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGRyaXZlckFyZWFOb1ZlcnRpY2FsV2FsbCA9XG4gICAgICAgIGNvYWNoSXRlbS50eXBlID09PSAnTE9DT01PVElWRV9DT0FDSCdcbiAgICAgICAgICA/IGNvYWNoSXRlbS5ncmFwaGljRWxlbWVudHM/LmZpbmQoXG4gICAgICAgICAgICAgIChlbGVtZW50OiBCYXNlRWxlbWVudCkgPT4gZWxlbWVudC5pY29uID09PSAnRFJJVkVSX0FSRUFfTk9fVkVSVElDQUxfV0FMTCcsXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRyaXZlckFyZWE6IGRyaXZlckFyZWEsXG4gICAgICAgIGRyaXZlckFyZWFOb1ZlcnRpY2FsV2FsbDogZHJpdmVyQXJlYU5vVmVydGljYWxXYWxsLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZHJpdmVyQXJlYTogdW5kZWZpbmVkLFxuICAgICAgZHJpdmVyQXJlYU5vVmVydGljYWxXYWxsOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJcyBjYWxsZWQgd2hlbiB0aGUgU2VhdFJlc2VydmF0aW9uIGxvc2VzIGZvY3VzLCB3aGF0IGhhcHBlbnMgd2hlbiB0aGUgdXNlciB0YWJzIG91dCBvciBjbGlja3Mgc29tZXdoZXJlIGVsc2UuXG4gICAqIFRoZW4gd2UgcmVzZXQgdGhlIGZvY3VzZWQgZWxlbWVudHMuXG4gICAqL1xuICBwcml2YXRlIF9vbkxlYXZlU2VhdFJlc2VydmF0aW9uQ29tcG9uZW50KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhhc05hdmlnYXRpb24pIHtcbiAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgICB9XG4gICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUE4QkEsSUFBSztDQUFMLFNBQUssaUJBQWU7QUFDbEIsaUJBQUEsV0FBQTtBQUNBLGlCQUFBLFVBQUE7R0FGRyxvQkFBQSxrQkFBZSxFQUFBLEVBQUE7QUFXcEIsSUFBTSx5QkFBeUI7QUFDL0IsSUFBTSx3QkFBa0M7Q0FDdEM7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDRDtJQUVZLG9DQUEwQjttQkFBUzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2NBQW5DLG1DQUFtQyxZQUFVOzs7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
1461
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhdC1yZXNlcnZhdGlvbi1iYXNlLWVsZW1lbnQuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2VsZW1lbnRzLWV4cGVyaW1lbnRhbC9zZWF0LXJlc2VydmF0aW9uL3NlYXQtcmVzZXJ2YXRpb24vc2VhdC1yZXNlcnZhdGlvbi1iYXNlLWVsZW1lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNBcnJvd0tleU9yUGFnZUtleXNQcmVzc2VkIH0gZnJvbSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvY29yZS9hMTF5LmpzJztcbmltcG9ydCB7IFNiYkVsZW1lbnQgfSBmcm9tICdAc2JiLWVzdGEvbHluZS1lbGVtZW50cy9jb3JlL2Jhc2UtZWxlbWVudHMuanMnO1xuaW1wb3J0IHsgZm9yY2VUeXBlIH0gZnJvbSAnQHNiYi1lc3RhL2x5bmUtZWxlbWVudHMvY29yZS9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGlzU2VydmVyLCB0eXBlIFByb3BlcnR5VmFsdWVzIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGV2ZW50T3B0aW9ucywgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQge1xuICBtYXBDb2FjaEluZm9zVG9Db2FjaFNlbGVjdGlvbixcbiAgbWFwSWNvblRvU3ZnLFxuICBtYXBQbGFjZUFuZENvYWNoVG9TZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbixcbiAgbWFwUGxhY2VJbmZvc1RvUGxhY2VTZWxlY3Rpb24sXG59IGZyb20gJy4uL2NvbW1vbi9tYXBwZXIudHMnO1xuaW1wb3J0IHR5cGUge1xuICBCYXNlRWxlbWVudCxcbiAgQ29hY2hJdGVtLFxuICBDb2FjaE51bWJlck9mRnJlZVBsYWNlcyxcbiAgRWxlbWVudERpbWVuc2lvbixcbiAgRWxlbWVudE1vdW50aW5nLFxuICBFbGVtZW50UG9zaXRpb24sXG4gIENvYWNoSXRlbURldGFpbHMsXG4gIFBsYWNlLFxuICBQbGFjZVNlbGVjdGlvbixcbiAgUGxhY2VUcmF2ZWxDbGFzcyxcbiAgU2VhdFJlc2VydmF0aW9uLFxuICBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbixcbiAgU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRDb2FjaCxcbiAgU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXMsXG4gIFRyYXZlbERpcmVjdGlvbixcbn0gZnJvbSAnLi4vY29tbW9uL3R5cGVzLnRzJztcbmltcG9ydCB0eXBlIHsgU2JiU2VhdFJlc2VydmF0aW9uUGxhY2VDb250cm9sRWxlbWVudCB9IGZyb20gJy4uL3NlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC9zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wuY29tcG9uZW50LnRzJztcblxuZW51bSBTY3JvbGxEaXJlY3Rpb24ge1xuICByaWdodCA9ICdyaWdodCcsXG4gIGxlZnQgPSAnbGVmdCcsXG59XG5cbmludGVyZmFjZSBDb2FjaFNjcm9sbFRyaWdnZXJQb2ludCB7XG4gIHN0YXJ0OiBudW1iZXI7XG4gIGVuZDogbnVtYmVyO1xuICB3aWR0aDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgU2VhdHJlc2VydmF0aW9uU3RydWN0dXJlIHtcbiAgZGVja3M6IFNlYXRyZXNlcnZhdGlvbkRlY2tbXTtcbn1cblxuaW50ZXJmYWNlIFNlYXRyZXNlcnZhdGlvbkRlY2sge1xuICBkZWNrSW5kZXg6IG51bWJlcjtcbiAgZGVja0NvYWNoZXM6IENvYWNoU3RydWN0dXJlW107XG59XG5cbmludGVyZmFjZSBDb2FjaFN0cnVjdHVyZSB7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICBhcmVhRWxlbWVudHM6IEJhc2VFbGVtZW50W107XG4gIHNlcnZpY2VFbGVtZW50czogQmFzZUVsZW1lbnRbXTtcbiAgb3RoZXJFbGVtZW50czogQmFzZUVsZW1lbnRbXTtcbiAgYm9yZGVyTWlkZGxlRWxlbWVudDogQmFzZUVsZW1lbnQ7XG4gIGhhc092ZXJoYW5naW5nRWxlbWVudHM6IGJvb2xlYW47XG59XG5cbmNvbnN0IE1BWF9TRVJWSUNFX1BST1BFUlRJRVMgPSAzO1xuY29uc3QgQUxMT1dFRF9TRVJWSUNFX0lDT05TOiBzdHJpbmdbXSA9IFtcbiAgJ3NhLXZvJyxcbiAgJ3NhLXJzJyxcbiAgJ3NhLWFidGVpbGtpbmRlcndhZ2VuJyxcbiAgJ3NhLXdyJyxcbiAgJ3NhLWZhJyxcbiAgJ3NhLWJ6JyxcbiAgJ3NhLXJ6Jyxcbl07XG5cbmV4cG9ydCBjbGFzcyBTZWF0UmVzZXJ2YXRpb25CYXNlRWxlbWVudCBleHRlbmRzIFNiYkVsZW1lbnQge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGV2ZW50cyA9IHtcbiAgICBzZWxlY3RlZHBsYWNlczogJ3NlbGVjdGVkcGxhY2VzJyxcbiAgICBzZWxlY3RlZGNvYWNoOiAnc2VsZWN0ZWRjb2FjaCcsXG4gIH0gYXMgY29uc3Q7XG5cbiAgLyoqIFRoZSBzZWF0IHJlc2VydmF0aW9ucyBhcnJheSBjb250YWlucyBhbGwgY29hY2hlcyBhbmQgcGxhY2VzICovXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ3NlYXQtcmVzZXJ2YXRpb25zJywgdHlwZTogQXJyYXkgfSlcbiAgcHVibGljIGFjY2Vzc29yIHNlYXRSZXNlcnZhdGlvbnM6IFNlYXRSZXNlcnZhdGlvbltdID0gbnVsbCE7XG5cbiAgLyoqIERpc3BsYXlzIGFuIGFycm93IHNob3dpbmcgd2hhdCBkaXJlY3Rpb24gZG9lcyB0cmFpbiBkcml2ZSovXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ3RyYXZlbC1kaXJlY3Rpb24nLCB0eXBlOiBTdHJpbmcgfSlcbiAgcHVibGljIGFjY2Vzc29yIHRyYXZlbERpcmVjdGlvbjogVHJhdmVsRGlyZWN0aW9uID0gJ05PTkUnO1xuXG4gIC8qKiBUaGUgc2VhdCByZXNlcnZhdGlvbiBuYXZpZ2F0aW9uIGNhbiBiZSB0b2dnbGVkIGJ5IHRoaXMgcHJvcGVydHkgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2hhcy1uYXZpZ2F0aW9uJywgdHlwZTogQm9vbGVhbiB9KVxuICBwdWJsaWMgYWNjZXNzb3IgaGFzTmF2aWdhdGlvbjogYm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqIFRoZSBzZWF0IHJlc2VydmF0aW9uIGFyZWEgaXMgYWxpZ25lZCB2ZXJ0aWNhbGx5ICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdhbGlnbi12ZXJ0aWNhbCcsIHR5cGU6IEJvb2xlYW4sIHJlZmxlY3Q6IHRydWUsIHVzZURlZmF1bHQ6IHRydWUgfSlcbiAgcHVibGljIGFjY2Vzc29yIGFsaWduVmVydGljYWw6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogVGhlIHNlYXQgcmVzZXJ2YXRpb24gYXJlYSdzIGJhc2UgZ3JpZCBzaXplICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdiYXNlLWdyaWQtc2l6ZScsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgYWNjZXNzb3IgYmFzZUdyaWRTaXplOiBudW1iZXIgPSAxNjtcblxuICAvKiogVGhlIHNlYXQgcmVzZXJ2YXRpb24gYXJlYSdzIHdpZHRoICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdoZWlnaHQnLCB0eXBlOiBOdW1iZXIgfSlcbiAgcHVibGljIGFjY2Vzc29yIGhlaWdodDogbnVtYmVyID0gbnVsbCE7XG5cbiAgLyoqIE1heGltYWwgbnVtYmVyIG9mIHBvc3NpYmxlIGNsaWNrYWJsZSBzZWF0cyAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnbWF4LXNlYXQtcmVzZXJ2YXRpb25zJywgdHlwZTogTnVtYmVyIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBtYXhTZWF0UmVzZXJ2YXRpb25zOiBudW1iZXIgPSAtMTtcblxuICAvKiogTWF4aW1hbCBudW1iZXIgb2YgcG9zc2libGUgY2xpY2thYmxlIGJpY3ljbGUgcGxhY2VzICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdtYXgtYmljeWNsZS1yZXNlcnZhdGlvbnMnLCB0eXBlOiBOdW1iZXIgfSlcbiAgcHVibGljIGFjY2Vzc29yIG1heEJpY3ljbGVSZXNlcnZhdGlvbnM6IG51bWJlciA9IC0xO1xuXG4gIC8qKiBBbnkgY2xpY2sgZnVuY3Rpb25hbGl0eSBpcyBwcmV2ZW50ZWQgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ3ByZXZlbnQtcGxhY2UtY2xpY2snLCB0eXBlOiBCb29sZWFuIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBwcmV2ZW50UGxhY2VDbGljazogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdwcmVzZWxlY3QtY29hY2gtaW5kZXgnLCB0eXBlOiBOdW1iZXIgfSlcbiAgcHVibGljIGFjY2Vzc29yIHByZXNlbGVjdENvYWNoSW5kZXg6IG51bWJlciA9IC0xO1xuXG4gIC8qKiBUaGUgc2VhdCByZXNlcnZhdGlvbiB0aXRsZSBpbmZvcm1hdGlvbiBhdCBwbGFjZS1jb250cm9scywgbmF2aWdhdGlvbi1jb2FjaGVzIGFuZCBuYXZpZ2F0aW9uLXNlcnZpY2VzIGNhbiBiZSB0b2dnbGVkIGJ5IHRoaXMgcHJvcGVydHkgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ3Nob3ctdGl0bGUtaW5mbycsIHR5cGU6IEJvb2xlYW4gfSlcbiAgcHVibGljIGFjY2Vzc29yIHNob3dUaXRsZUluZm86IGJvb2xlYW4gPSBmYWxzZTtcblxuICBAc3RhdGUoKSBwcm90ZWN0ZWQgYWNjZXNzb3Igc2VsZWN0ZWRDb2FjaEluZGV4OiBudW1iZXIgPSAtMTtcbiAgQHN0YXRlKCkgcHJvdGVjdGVkIGFjY2Vzc29yIGZvY3VzZWRDb2FjaEluZGV4OiBudW1iZXIgPSAtMTtcbiAgQHN0YXRlKCkgcHJvdGVjdGVkIGFjY2Vzc29yIGhvdmVyZWRDb2FjaEluZGV4OiBudW1iZXIgPSAtMTtcblxuICAvLyBEZXNjcmliZXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIGJvcmRlciBvZiB0aGUgY29hY2ggYW5kIHRoZSBwbGFjZXMgaW4gcGl4ZWxzXG4gIHByb3RlY3RlZCBjb2FjaEJvcmRlclBhZGRpbmcgPSA2O1xuICAvLyBEZXNjcmliZXMgdGhlIGdhcCBiZXR3ZWVuIHRoZSBjb2FjaGVzIGluIHBpeGVsc1xuICBwcm90ZWN0ZWQgZ2FwQmV0d2VlbkNvYWNoZXMgPSA0O1xuICAvLyBUaGUgY2FsY3VsYXRlZCBjb2FjaEJvcmRlck9mZnNldCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiBjb2FjaCBib3JkZXIgZ3JhcGhpYyxcbiAgLy8gYnV0IGFsc28gdG8gcG9zaXRpb24gb3RoZXIgZ3JhcGhpY3MgdGhhdCBhcmUgYWxpZ25lZCBkaXJlY3RseSB0byB0aGUgY29hY2ggYm9yZGVyLlxuICBwcm90ZWN0ZWQgY29hY2hCb3JkZXJPZmZzZXQgPSB0aGlzLmNvYWNoQm9yZGVyUGFkZGluZyAvIHRoaXMuYmFzZUdyaWRTaXplO1xuICAvLyBEZXNjcmliZXMgdGhlIGdhcCBiZXR3ZWVuIHRoZSBjb2FjaGVzIGRlY2tzIGJ5IG11bHRpcGxlIGRlY2sgdmlzdWFsaXphdGlvblxuICBwcm90ZWN0ZWQgZ2FwQmV0d2VlbkNvYWNoRGVja3MgPSA0ODtcbiAgLy8gRGVzY3JpYmVzIHRoZSBmaXggd2lkdGggb2YgY29hY2ggbmF2aWdhdGlvbiBidXR0b25cbiAgcHJvdGVjdGVkIGNvYWNoTmF2QnV0dG9uRGltOiBudW1iZXIgPSAwO1xuICAvLyBEZXNjcmliZXMgdGhlIGNhbGN1bGF0ZWQgZGltZW5zaW9uIGZvciB0aGUgYXJlYSBpY29ucywgd2hpY2ggaXMgdXNlZCB0byBzZXQgdGhlIG1heCB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBhcmVhIGljb25zXG4gIHByb3RlY3RlZCBnbG9iYWxBcmVhSWNvbkRpbTogRWxlbWVudERpbWVuc2lvbiA9IHsgdzogMiwgaDogMiB9O1xuICAvLyAjVElNTy00NTg1OFxuICAvLyBEZXNjcmliZXMgdGhlIHBhZGRpbmcgZm9yIHRoZSBpY29uIHdpdGhpbiB0aGUgYXJlYSBhcyBhIHBlcmNlbnRhZ2Ugc2l6ZSBvZiB0aGUgYXJlYSBzZWxmLiA4MCUgKDAuOCBwZXJjZW50KSBjb3JyZXNwb25kc1xuICAvLyB0byBhIGdvb2Qgb3B0aWNhbCBzaXplIGFuZCBjcmVhdGVzIGEgZ29vZCBwYWRkaW5nIGZyb20gdGhlIGFyZWEgdGkgaWNvblxuICBwcm90ZWN0ZWQgZ2xvYmFsQXJlYUljb25QYWRkaW5nOiBudW1iZXIgPSAwLjg7XG4gIHByb3RlY3RlZCBjb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHM6IENvYWNoSXRlbURldGFpbHNbXSA9IFtdO1xuICBwcm90ZWN0ZWQgY3VyclNjcm9sbERpcmVjdGlvbjogU2Nyb2xsRGlyZWN0aW9uID0gU2Nyb2xsRGlyZWN0aW9uLnJpZ2h0O1xuICBwcm90ZWN0ZWQgbWF4Q2FsY0NvYWNoZXNXaWR0aDogbnVtYmVyID0gMDtcbiAgcHJvdGVjdGVkIHNjcm9sbENvYWNoZXNBcmVhV2lkdGg6IG51bWJlciA9IDA7XG4gIHByb3RlY3RlZCBzY3JvbGxOYXZpZ2F0aW9uQXJlYURpbTogbnVtYmVyID0gMDtcbiAgcHJvdGVjdGVkIHRyaWdnZXJDb2FjaFBvc2l0aW9uc0NvbGxlY3Rpb246IENvYWNoU2Nyb2xsVHJpZ2dlclBvaW50W10gPSBbXTtcbiAgcHJvdGVjdGVkIG5hdmlnYXRpb25TY3JvbGxBcmVhOiBIVE1MRWxlbWVudCA9IG51bGwhO1xuICBwcm90ZWN0ZWQgY29hY2hTY3JvbGxBcmVhOiBIVE1MRWxlbWVudCA9IG51bGwhO1xuICBwcm90ZWN0ZWQgY3VyclNlbGVjdGVkUGxhY2U6IFBsYWNlIHwgbnVsbCA9IG51bGw7XG4gIHByb3RlY3RlZCBjdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByb3RlY3RlZCBjdXJyU2VsZWN0ZWRDb2FjaEluZGV4OiBudW1iZXIgPSAtMTtcbiAgcHJvdGVjdGVkIGN1cnJTZWxlY3RlZERlY2tJbmRleDogbnVtYmVyID0gMDtcbiAgcHJvdGVjdGVkIHByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljazogYm9vbGVhbiA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXM6IFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkUGxhY2VzID0ge1xuICAgIHNlYXRzOiBbXSxcbiAgICBiaWN5Y2xlczogW10sXG4gIH07XG4gIHByb3RlY3RlZCBzZWF0UmVzZXJ2YXRpb25XaXRob3V0TmF2aWdhdGlvbkhhc0ZvY3VzID0gZmFsc2U7XG4gIHByb3RlY3RlZCBpc0NvYWNoR3JpZEZvY3VzYWJsZSA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgaXNBdXRvU2Nyb2xsaW5nID0gZmFsc2U7XG4gIHByb3RlY3RlZCBpc0tleWJvYXJkTmF2aWdhdGlvbiA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgaGFzTXVsdGlwbGVEZWNrcyA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgaGFzU2VhdFJlc2VydmF0aW9uTmF0aXZlRm9jdXMgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cyA9IHtcbiAgICBBcnJvd0xlZnQ6ICdBcnJvd0xlZnQnLFxuICAgIEFycm93UmlnaHQ6ICdBcnJvd1JpZ2h0JyxcbiAgICBBcnJvd1VwOiAnQXJyb3dVcCcsXG4gICAgQXJyb3dEb3duOiAnQXJyb3dEb3duJyxcbiAgICBUYWI6ICdUYWInLFxuICAgIEVudGVyOiAnRW50ZXInLFxuICB9IGFzIGNvbnN0O1xuXG4gIHByb3RlY3RlZCBzZWF0UmVzZXJ2YXRpb25TdHJ1Y3R1cmU6IFNlYXRyZXNlcnZhdGlvblN0cnVjdHVyZSA9IHtcbiAgICBkZWNrczogW10sXG4gIH07XG5cbiAgLy8gQXJlYSBpY29ucyB0aGF0IHNob3VsZCBub3QgYmUgZml4ZWQgZHVyaW5nIHJvdGF0aW9uIHdoZW4gdmVydGljYWwgbW9kZSBpcyBzZWxlY3RlZFxuICBwcm90ZWN0ZWQgbm90Rml4ZWRSb3RhdGFibGVBcmVhSWNvbnMgPSBbJ0VOVFJZX0VYSVQnXTtcblxuICAvLyBHcmFwaGljcyB0aGF0IHNob3VsZCBub3QgYmUgcmVuZGVyZWQgd2l0aCBhbiBhcmVhXG4gIHByb3RlY3RlZCBub3RBcmVhRWxlbWVudHMgPSBbXG4gICAgJ0RSSVZFUl9BUkVBJyxcbiAgICAnRFJJVkVSX0FSRUFfTk9fVkVSVElDQUxfV0FMTCcsXG4gICAgJ0NPQUNIX1BBU1NBR0UnLFxuICAgICdDT0FDSF9XQUxMX05PX1BBU1NBR0UnLFxuICAgICdDT01QQVJUTUVOVF9QQVNTQUdFJyxcbiAgICAnQ09NUEFSVE1FTlRfUEFTU0FHRV9ISUdIJyxcbiAgICAnQ09NUEFSVE1FTlRfUEFTU0FHRV9NSURETEUnLFxuICAgICdDT01QQVJUTUVOVF9QQVNTQUdFX0xPVycsXG4gICAgJ0NPTVBBUlRNRU5UX1dBTEwnLFxuICBdO1xuXG4gIC8vIEdyYXBoaWNzIHRoYXQgc2hvdWxkIG5vdCBiZSByZW5kZXJlZCB3aXRoIGFuIGFyZWFcbiAgcHJvdGVjdGVkIG1pZGRsZUJvcmRlckRvY2tpbmdFbGVtZW50cyA9IFtcbiAgICAnRFJJVkVSX0FSRUEnLFxuICAgICdEUklWRVJfQVJFQV9OT19WRVJUSUNBTF9XQUxMJyxcbiAgICAnQ09BQ0hfUEFTU0FHRScsXG4gICAgJ0NPQUNIX1dBTExfTk9fUEFTU0FHRScsXG4gIF07XG5cbiAgcHJpdmF0ZSBfaXNSdW5uaW5nSW5pdFByZXNlbGVjdENvYWNoSW5kZXggPSBmYWxzZTtcbiAgcHJpdmF0ZSBfc2Nyb2xsVGltZW91dDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2xhc3RTdGFydFNjcm9sbFBvcyA9IC0xO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIC8vIEFkZCBibHVyIGV2ZW50IGxpc3RlbmVyIG9uIHRoZSBlbnRpcmUgY29tcG9uZW50IHRvIGRldGVjdCB3aGVuIHRoZSB1c2VyIGxlYXZlcyB0aGUgY29tcG9uZW50XG4gICAgLy8gYnkgdXNpbmcgdGFiIG5hdmlnYXRpb24gb3IgY2xpY2tpbmcgb3V0c2lkZSBvZiB0aGUgY29tcG9uZW50LiBJbiB0aGlzIGNhc2UsIHdlIGNhbiByZXNldCB0aGUgc2VsZWN0ZWQgY29hY2ggYW5kIHBsYWNlLlxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+IHRoaXMuX29uTGVhdmVTZWF0UmVzZXJ2YXRpb25Db21wb25lbnQoKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgd2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICBzdXBlci53aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ3NlYXRSZXNlcnZhdGlvbnMnKSkge1xuICAgICAgdGhpcy5oYXNNdWx0aXBsZURlY2tzID0gdGhpcy5zZWF0UmVzZXJ2YXRpb25zPy5sZW5ndGggPiAxO1xuXG4gICAgICB0aGlzLl9pbml0UHJlcGFyZVNlYXRSZXNlcnZhdGlvbkRhdGEoKTtcbiAgICAgIHRoaXMuX2luaXRTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbigpO1xuICAgICAgdGhpcy5pbml0TmF2aWdhdGlvblNlbGVjdGlvbkJ5U2Nyb2xsRXZlbnQoKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdiYXNlR3JpZFNpemUnKSkge1xuICAgICAgdGhpcy5jb2FjaEJvcmRlck9mZnNldCA9IHRoaXMuY29hY2hCb3JkZXJQYWRkaW5nIC8gdGhpcy5iYXNlR3JpZFNpemU7XG4gICAgICB0aGlzLnN0eWxlPy5zZXRQcm9wZXJ0eSgnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1ncmlkLXNpemUnLCBgJHt0aGlzLmJhc2VHcmlkU2l6ZX1weGApO1xuICAgICAgdGhpcy5faW5pdFByZXBhcmVTZWF0UmVzZXJ2YXRpb25EYXRhKCk7XG4gICAgICB0aGlzLmluaXROYXZpZ2F0aW9uU2VsZWN0aW9uQnlTY3JvbGxFdmVudCgpO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBoZWlnaHQgaXMgdXNlZCwgdGhlIGJhc2VHcmlkU2l6ZSBtdXN0IGJlIHJlY2FsY3VsYXRlZFxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2hlaWdodCcpICYmICEhdGhpcy5oZWlnaHQpIHtcbiAgICAgIGNvbnN0IHNlYXRSZXNlcnZhdGlvbkxheWVyID0gdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XSB8fCBudWxsO1xuICAgICAgaWYgKHNlYXRSZXNlcnZhdGlvbkxheWVyPy5jb2FjaEl0ZW1zLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmJhc2VHcmlkU2l6ZSA9IE1hdGgucm91bmQoXG4gICAgICAgICAgdGhpcy5oZWlnaHQgLyBzZWF0UmVzZXJ2YXRpb25MYXllci5jb2FjaEl0ZW1zWzBdLmRpbWVuc2lvbi5oLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ID0gdGhpcy5jb2FjaEJvcmRlclBhZGRpbmcgLyB0aGlzLmJhc2VHcmlkU2l6ZTtcbiAgICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JpZC1zaXplJywgYCR7dGhpcy5iYXNlR3JpZFNpemV9cHhgKTtcblxuICAgICAgICB0aGlzLl9pbml0UHJlcGFyZVNlYXRSZXNlcnZhdGlvbkRhdGEoKTtcbiAgICAgICAgdGhpcy5pbml0TmF2aWdhdGlvblNlbGVjdGlvbkJ5U2Nyb2xsRXZlbnQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdhbGlnblZlcnRpY2FsJykpIHtcbiAgICAgIHRoaXMuX2luaXRQcmVwYXJlU2VhdFJlc2VydmF0aW9uRGF0YSgpO1xuICAgICAgdGhpcy5pbml0TmF2aWdhdGlvblNlbGVjdGlvbkJ5U2Nyb2xsRXZlbnQoKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdwcmVzZWxlY3RDb2FjaEluZGV4JykpIHtcbiAgICAgIC8vIHNldFRpbWVvdXQgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2l0aG91dCwgX2dldENvYWNoU2Nyb2xsUG9zaXRpb25YKCkgd291bGQgZmFpbCB3aXRoIE5QRSBiZWNhdXNlXG4gICAgICAvLyB0aGUgY29hY2hTY3JvbGxBcmVhIGlzIG5vdCB5ZXQgaW5pdGlhbGl6ZWRcbiAgICAgIHRoaXMuX2lzUnVubmluZ0luaXRQcmVzZWxlY3RDb2FjaEluZGV4ID0gdHJ1ZTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zY3JvbGxUb1NlbGVjdGVkTmF2Q29hY2godGhpcy5wcmVzZWxlY3RDb2FjaEluZGV4KSwgMSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG5hdmlnYXRlQnlEaXJlY3Rpb25CdG4oYnRuRGlyZWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcbiAgICBsZXQgbmF2aWdhdGVUb0NvYWNoSW5kZXggPSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgaWYgKGJ0bkRpcmVjdGlvbiA9PSAnRElSRUNUSU9OX0xFRlQnICYmIG5hdmlnYXRlVG9Db2FjaEluZGV4ID4gMCkge1xuICAgICAgbmF2aWdhdGVUb0NvYWNoSW5kZXggPVxuICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggIT0gLTEgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggLSAxIDogMDtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgYnRuRGlyZWN0aW9uID09ICdESVJFQ1RJT05fUklHSFQnICYmXG4gICAgICBuYXZpZ2F0ZVRvQ29hY2hJbmRleCA8XG4gICAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0/LmNvYWNoSXRlbXMubGVuZ3RoIC0gMVxuICAgICkge1xuICAgICAgbmF2aWdhdGVUb0NvYWNoSW5kZXggPVxuICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggIT0gLTEgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggKyAxIDogMDtcbiAgICB9XG5cbiAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaChuYXZpZ2F0ZVRvQ29hY2hJbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogRGF0YSBjYW4gYmUgcHJlcGFyZWQgb25jZSBmb3IgdGhlIGVudGlyZSBjb21wb25lbnRcbiAgICogaW4gb3JkZXIgdG8gYXZvaWQgcmVjdXJyaW5nIGl0ZXJhdGlvbiBwcm9jZXNzZXMgaW4gcmVuZGVyaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBfaW5pdFByZXBhcmVTZWF0UmVzZXJ2YXRpb25EYXRhKCk6IHZvaWQge1xuICAgIHRoaXMuX2RldGVybWluZUJhc2VGb250U2l6ZSgpO1xuXG4gICAgaWYgKHRoaXMuaGFzTXVsdGlwbGVEZWNrcykge1xuICAgICAgLy8gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGRlY2tzLCB3ZSBuZWVkIHRvIGNoZWNrXG4gICAgICAvLyB3aGV0aGVyIGVtcHR5IGNvYWNoZXMgbmVlZCB0byBiZSBhZGRlZCBvbiBkaWZmZXJlbnQgZGVjayBsZXZlbHNcbiAgICAgIHRoaXMuX2luaXRFbXB0eUNvYWNoRGVja09mZnNldHMoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9wcmVwYXJlQ29hY2hJdGVtRGV0YWlsc0RhdGEoKTtcbiAgICB0aGlzLl9wcmVwYXJlU2VhdFJlc2VydmF0aW9uU3RydWN0dXJlSW5mb3JtYXRpb24oKTtcbiAgICB0aGlzLl9wcmVwYXJlT3B0aW1pemVBcmVhSWNvbkRpbWVuc2lvbkJ5TWVkaWFuKCk7XG4gIH1cblxuICAvKiogSW5pdCBzY3JvbGwgZXZlbnQgaGFuZGxpbmcgZm9yIGNvYWNoIG5hdmlnYXRpb24gKi9cbiAgcHJvdGVjdGVkIGluaXROYXZpZ2F0aW9uU2VsZWN0aW9uQnlTY3JvbGxFdmVudCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvYWNoU2Nyb2xsQXJlYSA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcihcbiAgICAgICcjc2JiLXNyX193cmFwcGVyLXNjcm9sbGFyZWEnLFxuICAgICkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgdGhpcy5uYXZpZ2F0aW9uU2Nyb2xsQXJlYSA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcihcbiAgICAgICcjc2JiLXNyX19uYXZpZ2F0aW9uLWxpc3QtY29hY2hlcycsXG4gICAgKSBhcyBIVE1MRWxlbWVudDtcblxuICAgIGNvbnN0IHNlYXRSZXNlcnZhdGlvbkRlY2sgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNcbiAgICAgID8gdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XVxuICAgICAgOiBudWxsO1xuICAgIGlmIChzZWF0UmVzZXJ2YXRpb25EZWNrICYmIHNlYXRSZXNlcnZhdGlvbkRlY2suY29hY2hJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBDYWxjdWxhdGVzIHRoZSBhYnNvbHV0ZSBoZWlnaHQgb2Ygb25lIGNvYWNoIGluY2x1ZGluZyBib3JkZXIgcGFkZGluZ1xuICAgICAgY29uc3QgY29hY2hIZWlnaHRXaXRoQm9yZGVyUGFkZGluZyA9XG4gICAgICAgIHNlYXRSZXNlcnZhdGlvbkRlY2suY29hY2hJdGVtc1swXS5kaW1lbnNpb24uaCAqIHRoaXMuYmFzZUdyaWRTaXplICsgdGhpcy5jb2FjaEJvcmRlclBhZGRpbmc7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBlYWNoIGdhcCBiZXR3ZWVuIG11bHRpcGxlIGNvYWNoIHRoZSBkZWNrcy5cbiAgICAgIC8vIE5vIGdhcCBleGlzdCBpZiBqdXN0IG9uZSBjb2FjaCBkZWNrIGV4aXN0LlxuICAgICAgY29uc3QgZ2FwQmV0d2VlbkNvYWNoRGVja3MgPSAodGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCAtIDEpICogdGhpcy5nYXBCZXR3ZWVuQ29hY2hEZWNrcztcblxuICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoXG4gICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWhlaWdodCcsXG4gICAgICAgIGAke2NvYWNoSGVpZ2h0V2l0aEJvcmRlclBhZGRpbmcgKiB0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoICsgZ2FwQmV0d2VlbkNvYWNoRGVja3N9YCxcbiAgICAgICk7XG4gICAgICB0aGlzLnN0eWxlPy5zZXRQcm9wZXJ0eSgnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1kZWNrcycsIGAke3RoaXMuc2VhdFJlc2VydmF0aW9ucy5sZW5ndGh9YCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubmF2aWdhdGlvblNjcm9sbEFyZWEpIHtcbiAgICAgIHRoaXMuc2Nyb2xsTmF2aWdhdGlvbkFyZWFEaW0gPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgICAgPyB0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodFxuICAgICAgICA6IHRoaXMubmF2aWdhdGlvblNjcm9sbEFyZWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG5cbiAgICAgIC8vIEluaXQgdGhlIGNvYWNoTmF2QnV0dG9uRGltIGRpbWVuc2lvbiwgd2hpY2ggaXMgbmVlZGVkIHRvIGNhbGN1bGF0ZSB0aGUgY29ycmVjdCBzY3JvbGwgbmF2aWdhdGlvbiBsYXRlclxuICAgICAgY29uc3QgbmF2Q29hY2hlc0xpc3QgPSB0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhLnF1ZXJ5U2VsZWN0b3IoJ3VsID4gbGknKSBhcyBIVE1MVUxpc3RFbGVtZW50O1xuICAgICAgaWYgKG5hdkNvYWNoZXNMaXN0KSB7XG4gICAgICAgIGNvbnN0IGZpcnN0TGlFbGVEaW1lbnNpb24gPSBuYXZDb2FjaGVzTGlzdD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHRoaXMuY29hY2hOYXZCdXR0b25EaW0gPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgICAgICA/IGZpcnN0TGlFbGVEaW1lbnNpb24uaGVpZ2h0XG4gICAgICAgICAgOiBmaXJzdExpRWxlRGltZW5zaW9uLndpZHRoO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmNvYWNoU2Nyb2xsQXJlYSAmJiBzZWF0UmVzZXJ2YXRpb25EZWNrKSB7XG4gICAgICAvLyBJbml0IHRoZSBzdGFydCBvZmZzZXQgZm9yIHRoZSBjYWxjdWxhdGlvbiBvZiB0aGUgY29hY2ggc2Nyb2xsIHRyaWdnZXIgcG9zaXRpb25zXG4gICAgICBsZXQgY3VyckNhbGNUcmlnZ2VyUG9zID0gMDtcbiAgICAgIHRoaXMuc2Nyb2xsQ29hY2hlc0FyZWFXaWR0aCA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICA/IHRoaXMuY29hY2hTY3JvbGxBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodFxuICAgICAgICA6IHRoaXMuY29hY2hTY3JvbGxBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuXG4gICAgICAvLyBQcmVjYWxjdWxhdGUgdHJpZ2dlciBzY3JvbGwgcG9zaXRpb24gYXJyYXkgZGVwZW5kcyBvbiBjb2FjaCB3aWR0aFxuICAgICAgdGhpcy50cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uID0gc2VhdFJlc2VydmF0aW9uRGVjay5jb2FjaEl0ZW1zLm1hcCgoXywgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgY29hY2hTdHJ1Y3R1cmUgPVxuICAgICAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uU3RydWN0dXJlLmRlY2tzW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XS5kZWNrQ29hY2hlc1tpbmRleF07XG4gICAgICAgIGNvbnN0IHN0YXJ0UG9zWCA9IGN1cnJDYWxjVHJpZ2dlclBvcztcblxuICAgICAgICAvLyBDYWxjdWxhdGlvbiBvZiB0aGUgZW5kIHNjcm9sbCB0cmlnZ2VyIHBvc2l0aW9uIG9mIGEgY29hY2gsIGluY2x1ZGluZyB0aGUgZ2FwIGJldHdlZW4gdGhlIGNvYWNoZXNcbiAgICAgICAgLy8gVGhlIGdhcCBpcyBtYXliZSBhZGp1c3RlZCBpZiBvdmVyaGFuZ2luZyBwbGFjZXMgb3IgZ3JhcGhpY3MgZXhpc3RcbiAgICAgICAgY3VyckNhbGNUcmlnZ2VyUG9zICs9XG4gICAgICAgICAgY29hY2hTdHJ1Y3R1cmUud2lkdGggK1xuICAgICAgICAgICghY29hY2hTdHJ1Y3R1cmUuaGFzT3ZlcmhhbmdpbmdFbGVtZW50c1xuICAgICAgICAgICAgPyB0aGlzLmdhcEJldHdlZW5Db2FjaGVzXG4gICAgICAgICAgICA6IDIgKiB0aGlzLmdhcEJldHdlZW5Db2FjaGVzKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN0YXJ0OiBzdGFydFBvc1gsXG4gICAgICAgICAgZW5kOiBjdXJyQ2FsY1RyaWdnZXJQb3MsXG4gICAgICAgICAgd2lkdGg6IGNvYWNoU3RydWN0dXJlLndpZHRoLFxuICAgICAgICB9IGFzIENvYWNoU2Nyb2xsVHJpZ2dlclBvaW50O1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFNldCBtYXhpbXVtIGNhbGN1bGF0ZWQgY29hY2ggd2lkdGhcbiAgICAgIHRoaXMubWF4Q2FsY0NvYWNoZXNXaWR0aCA9IGN1cnJDYWxjVHJpZ2dlclBvcyAtIHRoaXMuZ2FwQmV0d2VlbkNvYWNoZXM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNjcm9sbCBldmVudCBoYW5kbGVyIG1hbmFnZWQgdGhlIGVuZCBvZiBzY3JvbGxpbmcgaW5zaWRlIHRoZSBjb2FjaCBzY3JvbGwgYXJlYS5cbiAgICogVGltZW91dCBldmVudCBoYW5kbGluZyB0byBjaGVjayBpZiB0aGUgc2Nyb2xsaW5nIGhhcyBiZWVuIGNvbXBsZXRlZC5cbiAgICogSXQgaXMgcmVxdWlyZWQgYmVjYXVzZSB0aGUgU2FmYXJpIGJyb3dzZXIgZG9lcyBub3QgaGFuZGxlIHNjcm9sbGVuZCBldmVudCxcbiAgICogYW5kIHdlIHRoZXJlZm9yZSBpbWl0YXRlIHRoaXMgZXZlbnQgLT4gc2Nyb2xsZW5kLlxuICAgKi9cbiAgQGV2ZW50T3B0aW9ucyh7IHBhc3NpdmU6IHRydWUgfSlcbiAgcHJvdGVjdGVkIGNvYWNoQXJlYVNjcm9sbGVuZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fc2Nyb2xsVGltZW91dCkge1xuICAgICAgLy8gRmlyc3QsIHdlIGNsZWFyZWQgdGhlIHJlZ2lzdGVyZWQgdGltZW91dCwgYXMgdGhlIHNjcm9sbGluZyBpcyBzdGlsbCBydW5uaW5nXG4gICAgICAvLyBhbmQgdGh1cyB3ZSBwcmV2ZW50IHRoZSBleGVjdXRpb24gb2YgdGhlIF9oYW5kbGVDb2FjaEFyZWFTY3JvbGxlbmRFdmVudCBmdW5jdGlvblxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3Njcm9sbFRpbWVvdXQpO1xuICAgIH1cbiAgICAvLyBJZiBubyBmdXJ0aGVyIHNjcm9sbCBldmVudCBpcyBmaXJlZCwgdGhlIG5leHQgdGltZW91dCBjYW4gZXhlY3V0ZSB0aGUgaW5uZXIgZnVuY3Rpb24gX2hhbmRsZUNvYWNoQXJlYVNjcm9sbGVuZEV2ZW50IHdpdGhvdXQgY2xlYXJpbmdcbiAgICB0aGlzLl9zY3JvbGxUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLl9oYW5kbGVDb2FjaEFyZWFTY3JvbGxlbmRFdmVudCgpLCAxNTApO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIG5vIG5hdmlnYXRpb24gZXhpc3RzIChwcm9wZXJ0eSBzZXR0aW5nIC0+IGhhc05hdmlnYXRpb24pIGFuZCBhIHRhYmxlIGNvYWNoIGdldHMgdGhlIGZvY3VzLFxuICAgKiB0aGUgZmlyc3QgcGxhY2UgaW4gdGhlIGNvYWNoIG11c3QgYmUgYXV0b21hdGljYWxseSBwcmVzZWxlY3RlZCB0byBjb250cm9sIHRoZSBwbGFjZSBuYXZpZ2F0aW9uIHZpYSBrZXlib2FyZFxuICAgKlxuICAgKiBAcGFyYW0gZm9jdXNDb2FjaEluZGV4XG4gICAqL1xuICBwcm90ZWN0ZWQgb25Gb2N1c1RhYmxlQ29hY2hBbmRQcmVzZWxlY3RQbGFjZShmb2N1c0NvYWNoSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWF0UmVzZXJ2YXRpb25XaXRob3V0TmF2aWdhdGlvbkhhc0ZvY3VzICYmICF0aGlzLmhhc05hdmlnYXRpb24pIHtcbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uV2l0aG91dE5hdmlnYXRpb25IYXNGb2N1cyA9IHRydWU7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPVxuICAgICAgICBmb2N1c0NvYWNoSW5kZXggPT09IDBcbiAgICAgICAgICA/IHRoaXMuZ2V0TmV4dEF2YWlsYWJsZUNvYWNoSW5kZXgoLTEpXG4gICAgICAgICAgOiB0aGlzLmdldFByZXZBdmFpbGFibGVDb2FjaEluZGV4KGZvY3VzQ29hY2hJbmRleCk7XG4gICAgICB0aGlzLnByZXNlbGVjdFBsYWNlSW5Db2FjaCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBXaWxsIGJlIHRyaWdnZXJlZCBieSBmb2N1cyBuYXZpZ2F0aW9uIGRpcmVjdGlvbiAqL1xuICBwcm90ZWN0ZWQgb25Gb2N1c05hdkRpcmVjdGlvbkJ1dHRvbigpOiB2b2lkIHtcbiAgICAvLyBJZiBhbnkgbmF2aWdhdGlvbiBkaXJlY3Rpb24gYnV0dG9uIChyaWdodHxsZWZ0KSBnZXQgdGhlIGZvY3VzLCBzbyB3ZSBoYXZlIG1hbnVhbCByZXNldCB0aGUgcHJldmlvdXMgZm9jdXNDb2FjaEluZGV4LlxuICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgfVxuXG4gIC8qKiBUQUIgS2V5IEV2ZW50IGhhbmRsaW5nIGZvciBDb2FjaCBOYXZpZ2F0aW9uICovXG4gIHByb3RlY3RlZCBvbktleU5hdmlnYXRpb25OYXZDb2FjaEJ1dHRvbihcbiAgICBldmVudDogS2V5Ym9hcmRFdmVudCxcbiAgICBjdXJyTmF2Q29hY2hCdXR0b25JbmRleDogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5UYWIpIHtcbiAgICAgIHRoaXMuX2hhbmRsZVRhYktleU5hdmlnYXRpb24oZXZlbnQsICduYXZpZ2F0aW9uJywgY3Vyck5hdkNvYWNoQnV0dG9uSW5kZXgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEJ5IHVzaW5nIGFueSBvdGhlciBrZXkgKG5vIFRBQikgaW5zaWRlIHRoZSBOYXZpZ2F0aW9uIGFyZWEsIHNvIHdlIGNhbiBoYW5kbGUgdGhpcyBieSB1c2luZyB0aGUgbG9naWMgZnJvbSBrZXlib2FyZFNlYXRtYXBFdmVudEhhbmRsaW5nXG4gICAgaWYgKGlzQXJyb3dLZXlPclBhZ2VLZXlzUHJlc3NlZChldmVudCkpIHtcbiAgICAgIHRoaXMua2V5Ym9hcmRTZWF0bWFwRXZlbnRIYW5kbGluZyhldmVudCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEdlbmVyYWwgVEFCIEtleSBFdmVudCBoYW5kbGluZyBmb3IgdGFiIG5hdmlnYXRpb24gaW5zaWRlIHRoZSBjb2FjaCBuYXZpZ2F0aW9uIGFyZWEgYW5kIHRoZSBzZWF0bWFwIGFyZWEgKi9cbiAgcHJpdmF0ZSBfaGFuZGxlVGFiS2V5TmF2aWdhdGlvbihcbiAgICBldmVudDogS2V5Ym9hcmRFdmVudCxcbiAgICBldmVudEFyZWE6IHN0cmluZyxcbiAgICBjdXJyVGFiSW5kZXg/OiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHByZXNzZWRLZXkgPSBldmVudC5rZXk7XG4gICAgY29uc3QgcHJlc3NlZFNoaWZ0VGFiID0gZXZlbnQuc2hpZnRLZXk7XG5cbiAgICBpZiAocHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuVGFiKSB7XG4gICAgICAvLyBIYW5kbGUgVEFCIGtleSBldmVudCBuYXZpZ2F0aW9uIGZvciBjb2FjaCBuYXZpZ2F0aW9uIGFyZWEuXG4gICAgICAvLyBGcHIgY29hY2ggbmF2aWdhdGlvbiB3ZSBqdXN0IGNvbnRyb2wgdGhlIGZvY3VzIGluZGV4IHRvIHZpc3VhbGl6ZSBmb2N1cyBzdHlsZSBmb3IgbmF2IGNvYWNoIGJ1dHRvblxuICAgICAgaWYgKGV2ZW50QXJlYSA9PSAnbmF2aWdhdGlvbicpIHtcbiAgICAgICAgaWYgKGN1cnJUYWJJbmRleCA9PSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXgpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSB8fFxuICAgICAgICAgICAgIXByZXNzZWRTaGlmdFRhYiB8fFxuICAgICAgICAgICAgdGhpcy5jb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHNbY3VyclRhYkluZGV4XS5pc0RyaXZlckFyZWEgfHxcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPT0gLTFcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSBjdXJyVGFiSW5kZXg7XG4gICAgICAgICAgfSBlbHNlIGlmIChwcmVzc2VkU2hpZnRUYWIgJiYgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSkge1xuICAgICAgICAgICAgLy9JZiB0aGUgRm9yIGJhY2sgdGFiYmluZywgd2UganVtcFxuICAgICAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgICAgICAgICAgdGhpcy5mb2N1c1BsYWNlRWxlbWVudCh0aGlzLmN1cnJTZWxlY3RlZFBsYWNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IGN1cnJUYWJJbmRleCE7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zY3JvbGxUb1NlbGVjdGVkTmF2aWdhdGlvbkJ1dHRvbihjdXJyVGFiSW5kZXghKTtcbiAgICAgIH1cbiAgICAgIC8vIEhhbmRsZSBUQUIga2V5IGV2ZW50IG5hdmlnYXRpb24gZm9yIHNlYXRtYXAgYXJlYVxuICAgICAgZWxzZSBpZiAoZXZlbnRBcmVhID09ICdzZWF0bWFwJykge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAocHJlc3NlZFNoaWZ0VGFiKSB7XG4gICAgICAgICAgdGhpcy5fbmF2aWdhdGVDb2FjaE5hdmlnYXRpb25CeUtleWJvYXJkKCdQUkVWX1RBQicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX25hdmlnYXRlQ29hY2hOYXZpZ2F0aW9uQnlLZXlib2FyZCgnTkVYVF9UQUInKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXNhdGlvbiBvZiBLZXlib2FyZCBTZWF0bWFwIGV2ZW50IGhhbmRsaW5nIHRvIG5hdmlnYXRpb24gYmV0d2VlbiBlYWNoIHBsYWNlcyBpbnNpZGUgYSBzZWxlY3RlZCBjb2FjaCBieSB1c2luZyBbYXJyb3ddIGtleXMuXG4gICAqIFdpdGggdGhlIFtUQUJdIGtleSB0aGUgdXNlciBuYXZpZ2F0aW9uIGdvZXMgdG8gdGhlIG5leHQgY29hY2ggbmF2aWdhdGlvbiBlbGVtZW50IGFuZCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlIGlzIGF1dG9tYXRpY2FsbHkgcmVzZXQuXG4gICAqL1xuICBwcm90ZWN0ZWQga2V5Ym9hcmRTZWF0bWFwRXZlbnRIYW5kbGluZyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGlzVGFiTmV4dCA9IGV2ZW50LmtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuVGFiO1xuICAgIGNvbnN0IGlzVGFiUHJldiA9IGV2ZW50LnNoaWZ0S2V5ICYmIGlzVGFiTmV4dDtcblxuICAgIC8vIElmIG5vIG5hdmlnYXRpb24gZXhpc3QgYW5kIHRoZSBmaXJzdCBvciBsYXN0IGNvYWNoIGlzIHNlbGVjdGVkLCB0aGUgdGhlIHVzZSB0cmllcyB0byBsZWF2ZSB0aGUgc2VhdCByZXNlcnZhdGlvbiBjb21wb25lbnQgYnkgdXNpbmcgdGFiLFxuICAgIC8vIHNvIHdlIGNhbiByZXR1cm4gaGVyZSBhbmQgYWxsb3cgdGhlIG5hdGl2ZSBmb2N1cyB0byBsZWF2ZSB0aGUgY29tcG9uZW50LlxuICAgIGlmIChcbiAgICAgICghdGhpcy5oYXNOYXZpZ2F0aW9uICYmIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9PT0gMCAmJiBpc1RhYlByZXYpIHx8XG4gICAgICAodGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID09PSB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50cy5sZW5ndGggLSAxICYmIGlzVGFiTmV4dClcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwcmVzc2VkS2V5ID0gZXZlbnQua2V5O1xuICAgIHRoaXMucHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrID0gZmFsc2U7XG4gICAgLy8gQ2hlY2sgYW55IGtleWJvYXJkIGV2ZW50IHdhcyB0cmlnZ2VyZWQgaW5zaWRlIHRoZSBzZWF0IHJlc2VydmF0aW9uIGNvbXBvbmVudCxcbiAgICAvLyBzbyB3ZSBjYW4gc2F5IHRoZSBuYXRpdmUgYnJvd3NlciBmb2N1cyBsaWVzIG9uIHRoZSBjb21wb25lbnRcbiAgICBpZiAoIXRoaXMuaGFzU2VhdFJlc2VydmF0aW9uTmF0aXZlRm9jdXMgJiYgKGlzVGFiTmV4dCB8fCBpc1RhYlByZXYpKSB7XG4gICAgICB0aGlzLmhhc1NlYXRSZXNlcnZhdGlvbk5hdGl2ZUZvY3VzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBJZiBhbnkgcGxhY2UgaXMgc2VsZWN0ZWQgYW5kIFRBQiBLZXkgY29tYmluYXRpb24gaXN0IHByZXNzZWQsXG4gICAgLy8gdGhlbiB3ZSBoYW5kbGUgdGhlIG5leHQgb3IgcHJldmlvdXMgY29hY2ggc2VsZWN0aW9uXG4gICAgaWYgKGlzVGFiTmV4dCkge1xuICAgICAgdGhpcy5faGFuZGxlVGFiS2V5TmF2aWdhdGlvbihldmVudCwgJ3NlYXRtYXAnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBcnJvdyBLZXlib2FyZCBuYXZpZ2F0aW9uIHRvIGNvbnRyb2wgcGxhY2VzIGluc2lkZSB0aGUgc2VhdG1hcFxuICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggIT09IC0xICYmIGlzQXJyb3dLZXlPclBhZ2VLZXlzUHJlc3NlZChldmVudCkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIHN3aXRjaCAocHJlc3NlZEtleSkge1xuICAgICAgICBjYXNlIHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93TGVmdDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBwcmVzc2VkTGVmdEtleU1hcHBpbmc6IHN0cmluZyA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICAgICAgICA/IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93RG93blxuICAgICAgICAgICAgICA6IHByZXNzZWRLZXk7XG4gICAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRMZWZ0S2V5TWFwcGluZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgcHJlc3NlZFJpZ2h0S2V5TWFwcGluZzogc3RyaW5nID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICAgICAgICAgID8gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dVcFxuICAgICAgICAgICAgICA6IHByZXNzZWRLZXk7XG4gICAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRSaWdodEtleU1hcHBpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1VwOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXNzZWRVcEtleU1hcHBpbmc6IHN0cmluZyA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICAgICAgICA/IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93TGVmdFxuICAgICAgICAgICAgICA6IHByZXNzZWRLZXk7XG4gICAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRVcEtleU1hcHBpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0Rvd246XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgcHJlc3NlZERvd25LZXlNYXBwaW5nOiBzdHJpbmcgPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgICAgICAgICAgPyB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1JpZ2h0XG4gICAgICAgICAgICAgIDogcHJlc3NlZEtleTtcbiAgICAgICAgICAgIHRoaXMuX25hdmlnYXRlVG9QbGFjZUJ5S2V5Ym9hcmQocHJlc3NlZERvd25LZXlNYXBwaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgYSBwbGFjZSBpbnNpZGUgdGhlIGNvYWNoIGlmIG5hdmlnYXRlZCB2aWEga2V5Ym9hcmQsXG4gICAqIG90aGVyd2lzZSB0aGUgY29hY2ggZ3JpZCBpcyBzZWxlY3RlZCAobmVjZXNzYXJ5IGZvciBTY3JlZW5SZWFkZXIpXG4gICAqL1xuICBwcm90ZWN0ZWQgcHJlc2VsZWN0UGxhY2VJbkNvYWNoKCk6IHZvaWQge1xuICAgIC8vIE5vIHByZXNlbGVjdCBwbGFjZSBieSBtYW51YWwgc2VhdG1hcCBzY3JvbGxpbmdcbiAgICBpZiAoIXRoaXMuaXNBdXRvU2Nyb2xsaW5nKSByZXR1cm47XG5cbiAgICAvLyBObyBhdXRvIHBsYWNlIHByZXNlbGVjdGlvbiBieSBydW5uaW5nIHRoZSBwcmVzZWxlY3QgY29hY2ggaW5kZXhcbiAgICBpZiAodGhpcy5faXNSdW5uaW5nSW5pdFByZXNlbGVjdENvYWNoSW5kZXgpIHtcbiAgICAgIHRoaXMuX2lzUnVubmluZ0luaXRQcmVzZWxlY3RDb2FjaEluZGV4ID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRm9yIERyaXZlckFyZWEgb3IgRW1wdHkgY29hY2ggKG5vIHBsYWNlcyksIG5vIHBsYWNlIGlzIHNlbGVjdGFibGUsIHNvIHdlIHJldHVybiBkaXJlY3RseVxuICAgIGlmIChcbiAgICAgIHRoaXMuY29hY2hJdGVtRGV0YWlsc0VsZW1lbnRzW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF0gJiZcbiAgICAgIHRoaXMuY29hY2hJdGVtRGV0YWlsc0VsZW1lbnRzW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF0uaXNEcml2ZXJBcmVhXG4gICAgKSB7XG4gICAgICB0aGlzLl9zZXRGb2N1c1RvU2VsZWN0ZWRDb2FjaEdyaWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBPbmx5IHdoZW4ga2V5Ym9hcmQgbmF2aWdhdGlvbiBpcyB1c2VkIGFuZCBjb2FjaGVzIGFyZSBzY3JvbGxlZCBieSBhdXRvIHNjcm9sbGluZyxcbiAgICAvLyB0aGVuIHdlIGNhbiBzZXQgdGhlIGZvY3VzIG9uIHRoZSBmaXJzdCBwbGFjZSBpbiB0aGUgY29hY2guXG4gICAgaWYgKHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb24gJiYgdGhpcy5pc0F1dG9TY3JvbGxpbmcpIHtcbiAgICAgIGNvbnN0IGNsb3Nlc3RQbGFjZSA9IHRoaXMuX2dldENsb3Nlc3RQbGFjZUJ5S2V5RGlyZWN0aW9uKCk7XG4gICAgICAvL0lmIGNsb3Nlc3RQbGFjZSBleGlzdCwgd2UgaGF2ZSB0byB1bmZvY3VzIHByZXZpb3VzIGZvY3VzZWQgcGxhY2VcbiAgICAgIGlmIChjbG9zZXN0UGxhY2UpIHtcbiAgICAgICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG4gICAgICAgIHRoaXMuZm9jdXNQbGFjZUVsZW1lbnQoY2xvc2VzdFBsYWNlKTtcbiAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSWYgYSBjb2FjaCB3YXMgc2VsZWN0ZWQgd2l0aCBubyBwbGFjZXMsIHRoZW4gd2UgaGF2ZSB0byBmb2N1cyB0aGUgY29hY2hHcmlkXG4gICAgICAgIHRoaXMuX3NldEZvY3VzVG9TZWxlY3RlZENvYWNoR3JpZCgpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBJbiBjYXNlcyB3aGVyZSB0aGUgcHJlc2VsZWN0aW9uIGZ1bmN0aW9uIGlzIHRyaWdnZXJlZCBieSBub3JtYWwgY2xpY2tpbmcgb3IgdmlhIHNjcmVlbiByZWFkZXIgdmlhIHRhYixcbiAgICAvLyB3ZSBvbmx5IGZvY3VzIHRoZSB0YWJsZSB3aXRob3V0IGRpcmVjdGx5IGZvY3VzaW5nIHRoZSBwbGFjZS5cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMudW5mb2N1c1BsYWNlRWxlbWVudCgpO1xuXG4gICAgICB0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlID0gdHJ1ZTtcbiAgICAgIHRoaXMuX3NldEZvY3VzVG9TZWxlY3RlZENvYWNoR3JpZCgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBzY3JvbGxUb1NlbGVjdGVkTmF2Q29hY2goc2VsZWN0ZWROYXZDb2FjaEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLl9pc1ZhbGlkQ29hY2hJbmRleChzZWxlY3RlZE5hdkNvYWNoSW5kZXgpICYmXG4gICAgICBzZWxlY3RlZE5hdkNvYWNoSW5kZXggIT09IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleFxuICAgICkge1xuICAgICAgdGhpcy5ob3ZlcmVkQ29hY2hJbmRleCA9IHNlbGVjdGVkTmF2Q29hY2hJbmRleDtcbiAgICAgIHRoaXMuaXNBdXRvU2Nyb2xsaW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMuaXNDb2FjaEdyaWRGb2N1c2FibGUgPSB0cnVlO1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID0gc2VsZWN0ZWROYXZDb2FjaEluZGV4O1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggPSB0aGlzLl9nZXRFeGlzdGluZ0NvYWNoRGVja0luZGV4KCk7XG4gICAgICB0aGlzLl9zZXRTY3JvbGxEaXJlY3Rpb25CeUNvYWNoSW5kZXgoKTtcblxuICAgICAgY29uc3Qgc2Nyb2xsVG9Db2FjaFBvc1ggPSB0aGlzLl9nZXRDb2FjaFNjcm9sbFBvc2l0aW9uWCgpO1xuICAgICAgY29uc3QgaXNTZWxlY3RlZENvYWNoSW5kZXhTY3JvbGxhYmxlID1cbiAgICAgICAgdGhpcy5zZWxlY3RlZENvYWNoSW5kZXggIT09IC0xIHx8IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA+IDA7XG5cbiAgICAgIC8vIENoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IHNjcm9sbCBwb3NpdGlvbiBhbGxvd3Mgc2Nyb2xsaW5nIHRvIHRoZSBuZXh0IHdhZ29uIG9yIG5vdFxuICAgICAgaWYgKGlzU2VsZWN0ZWRDb2FjaEluZGV4U2Nyb2xsYWJsZSAmJiB0aGlzLl9pc1Njcm9sbGFibGVUb1NlbGVjdGVkQ29hY2goKSkge1xuICAgICAgICB0aGlzLl9sYXN0U3RhcnRTY3JvbGxQb3MgPSB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxMZWZ0O1xuICAgICAgICB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxUbyh7XG4gICAgICAgICAgdG9wOiB0aGlzLmFsaWduVmVydGljYWwgPyBzY3JvbGxUb0NvYWNoUG9zWCA6IDAsXG4gICAgICAgICAgbGVmdDogdGhpcy5hbGlnblZlcnRpY2FsID8gMCA6IHNjcm9sbFRvQ29hY2hQb3NYLFxuICAgICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJyxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnVwZGF0ZUN1cnJlbnRTZWxlY3RlZENvYWNoKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEF1dG9tYXRpYyBzY3JvbGxpbmcgdG8gdGhlIHNlbGVjdGVkIGNvYWNoIGluIHRoZSBtYWluIG5hdmlnYXRpb25cbiAgICAgIHRoaXMuX3Njcm9sbFRvU2VsZWN0ZWROYXZpZ2F0aW9uQnV0dG9uKHNlbGVjdGVkTmF2Q29hY2hJbmRleCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGZvY3VzUGxhY2VFbGVtZW50KHBsYWNlOiBQbGFjZSB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcbiAgICBpZiAocGxhY2UpIHtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UgPSBwbGFjZTtcbiAgICAgIHRoaXMuX3NldEN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkKHBsYWNlKTtcblxuICAgICAgY29uc3Qgc2VsZWN0ZWRQbGFjZUVsZW1lbnQgPSB0aGlzLl9nZXRQbGFjZUh0bWxFbGVtZW50KCk7XG4gICAgICBpZiAoc2VsZWN0ZWRQbGFjZUVsZW1lbnQpIHtcbiAgICAgICAgc2VsZWN0ZWRQbGFjZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdrZXlmb2N1cycsICdmb2N1cycpO1xuXG4gICAgICAgIC8vVHJ5IHRvIHNjcm9sbCBmb2N1c2VkIHBsYWNlIGludG8gdGhlIHZpZXdwb3J0XG4gICAgICAgIGNvbnN0IGRlbGF5U2Nyb2xsSW5WaWV3cG9ydCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHBsYWNlSWQgPSB0aGlzLmdldFBsYWNlRWxlbWVudElkKFxuICAgICAgICAgICAgdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXgsXG4gICAgICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXgsXG4gICAgICAgICAgICBwbGFjZS5udW1iZXIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLl9zY3JvbGxQbGFjZUludG9OZWFyZXN0Vmlld3BvcnQocGxhY2VJZCk7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KGRlbGF5U2Nyb2xsSW5WaWV3cG9ydCk7XG4gICAgICAgIH0sIDApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCB1bmZvY3VzUGxhY2VFbGVtZW50KCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkUGxhY2VFbGVtZW50ID0gdGhpcy5fZ2V0UGxhY2VIdG1sRWxlbWVudCgpO1xuICAgIGlmIChzZWxlY3RlZFBsYWNlRWxlbWVudCkge1xuICAgICAgc2VsZWN0ZWRQbGFjZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdrZXlmb2N1cycsICd1bmZvY3VzJyk7XG4gICAgICB0aGlzLl9zZXRDdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZChudWxsKTtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDYWxjdWxhdGVkRGltZW5zaW9uKFxuICAgIGVsZW1lbnREaW1lbnNpb246IEVsZW1lbnREaW1lbnNpb24sXG4gICAgY29hY2hEaW1lbnNpb24/OiBFbGVtZW50RGltZW5zaW9uLFxuICAgIGlzT3JpZ2luSGVpZ2h0PzogYm9vbGVhbixcbiAgICBpc1N0cmV0Y2hIZWlnaHQ/OiBib29sZWFuLFxuICApOiBFbGVtZW50RGltZW5zaW9uIHtcbiAgICBpZiAoY29hY2hEaW1lbnNpb24gJiYgIWlzT3JpZ2luSGVpZ2h0KSB7XG4gICAgICAvLyBTaW5jZSB0aGUgaGVpZ2h0IG9mIHRoZSBjb2FjaCBoYXMgYmVlbiB2aXN1YWxseSBleHBhbmRlZCB0byBtYWludGFpbiBhIGRpc3RhbmNlIGJldHdlZW4gdGhlIGJvcmRlciBvZiB0aGUgY29hY2ggYW5kIHRoZSBwbGFjZXMsXG4gICAgICAvLyBzb21lIGdyYXBoaWNzIG11c3QgYWxzbyBiZSBhZGFwdGVkIHRvIHRoZSBoZWlnaHQsIHdoaWNoIGVuZCB3aXRoIHRoZSBib3JkZXJzIG9mIHRoZSBjb2FjaFxuICAgICAgZWxlbWVudERpbWVuc2lvbi5oICs9IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQgKiAyO1xuICAgIH1cblxuICAgIGlmIChpc1N0cmV0Y2hIZWlnaHQpIHtcbiAgICAgIC8vIEluIHRoZSBjYXNlIG9mIGdyYXBoaWNzIGFyZSBhc3NpZ25lZCBkaXJlY3RseSBhdCB0aGUgYm9yZGVyIG9mIHRoZSBjb2FjaCxcbiAgICAgIC8vIHRoZXNlIGdyYXBoaWNzIG11c3QgYmUgZXhwYW5kZWQgaW4gaGVpZ2h0IGJ5IGEgY29hY2hCb3JkZXJPZmZzZXQgaW4gb3JkZXIgdG8gcmVhY2ggdGhlaXIgb3JpZ2luYWwgdmlzdWFsIHBvc2l0aW9uXG4gICAgICBlbGVtZW50RGltZW5zaW9uLmggKz0gdGhpcy5jb2FjaEJvcmRlck9mZnNldDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdzogdGhpcy5iYXNlR3JpZFNpemUgKiBlbGVtZW50RGltZW5zaW9uLncsXG4gICAgICBoOiB0aGlzLmJhc2VHcmlkU2l6ZSAqIGVsZW1lbnREaW1lbnNpb24uaCxcbiAgICB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldENhbGN1bGF0ZWRQb3NpdGlvbihcbiAgICBlbGVtZW50UG9zaXRpb246IEVsZW1lbnRQb3NpdGlvbixcbiAgICBlbGVtZW50RGltZW5zaW9uPzogRWxlbWVudERpbWVuc2lvbixcbiAgICBjb2FjaERpbWVuc2lvbj86IEVsZW1lbnREaW1lbnNpb24sXG4gICAgaXNPcmlnaW5IZWlnaHQ/OiBib29sZWFuLFxuICApOiBFbGVtZW50UG9zaXRpb24ge1xuICAgIGlmIChjb2FjaERpbWVuc2lvbiAmJiBlbGVtZW50RGltZW5zaW9uKSB7XG4gICAgICBjb25zdCBlbmRQb3NIZWlnaHQgPSBpc09yaWdpbkhlaWdodFxuICAgICAgICA/IGNvYWNoRGltZW5zaW9uLmhcbiAgICAgICAgOiBjb2FjaERpbWVuc2lvbi5oICsgdGhpcy5jb2FjaEJvcmRlck9mZnNldDtcbiAgICAgIC8vIElmIHRoZSBvcmlnaW5hbCBlbGVtZW50IGlzIHBvc2l0aW9uZWQgYXQgdGhlIHRvcCBvciBib3R0b20gb2YgdGhlIGNvYWNoLCB3ZSBuZWVkIHRvIHJlY2FsY3VsYXRlIHRoZSBZIGNvb3JkaW5hdGUgd2l0aCB0aGUgYWRkaXRpb25hbCBib3JkZXIgcGFkZGluZ1xuICAgICAgaWYgKGVsZW1lbnRQb3NpdGlvbi55ID09PSAwKSB7XG4gICAgICAgIGVsZW1lbnRQb3NpdGlvbi55IC09IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQ7XG4gICAgICB9IGVsc2UgaWYgKGVsZW1lbnRQb3NpdGlvbi55ICsgZWxlbWVudERpbWVuc2lvbi5oID09PSBlbmRQb3NIZWlnaHQpIHtcbiAgICAgICAgZWxlbWVudFBvc2l0aW9uLnkgKz0gdGhpcy5jb2FjaEJvcmRlck9mZnNldDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgeDogdGhpcy5iYXNlR3JpZFNpemUgKiBlbGVtZW50UG9zaXRpb24ueCxcbiAgICAgIHk6IHRoaXMuYmFzZUdyaWRTaXplICogZWxlbWVudFBvc2l0aW9uLnksXG4gICAgICB6OiBlbGVtZW50UG9zaXRpb24ueixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIGRldGVjdHMgaWYgYSAoZ3JhcGhpY2FsKSBlbGVtZW50IGlzIG9uIHRoZSBib3JkZXIgd2l0aCBpdHMgcG9zaXRpb24gKHVwcGVyIG9yIGxvd2VyIGJvcmRlcikuXG4gICAqIEBwYXJhbSBiYXNlRWxlbWVudFxuICAgKiBAcGFyYW0gY29hY2hEaW1lbnNpb25cbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGlzRWxlbWVudERpcmVjdGx5T25Cb3JkZXIoXG4gICAgYmFzZUVsZW1lbnQ6IEJhc2VFbGVtZW50LFxuICAgIGNvYWNoRGltZW5zaW9uOiBFbGVtZW50RGltZW5zaW9uLFxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgYmFzZUVsZW1lbnQucG9zaXRpb24ueSA9PT0gMCB8fFxuICAgICAgYmFzZUVsZW1lbnQucG9zaXRpb24ueSArIGJhc2VFbGVtZW50LmRpbWVuc2lvbi5oID09PSBjb2FjaERpbWVuc2lvbi5oXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3VudHMgYWxsIGF2YWlsYWJsZSBzZWF0cyB0b2dldGhlciBkZXBlbmRpbmcgb24gdGhlIHNlYXQgdHlwZVxuICAgKlxuICAgKiBAcGFyYW0gcGxhY2VzXG4gICAqIEByZXR1cm5zIEFuIE9iamVjdCB3aXRoIGNvdW50IG9mIGZyZWUgc2VhdHMgYW5kIGZyZWUgYmljeWNsZSBwbGFjZXNcbiAgICovXG4gIHByb3RlY3RlZCBnZXRBdmFpbGFibGVGcmVlUGxhY2VzTnVtRnJvbUNvYWNoKFxuICAgIHBsYWNlczogUGxhY2VbXSB8IHVuZGVmaW5lZCxcbiAgKTogQ29hY2hOdW1iZXJPZkZyZWVQbGFjZXMge1xuICAgIGNvbnN0IGFjY3VtdWxhdG9yOiBDb2FjaE51bWJlck9mRnJlZVBsYWNlcyA9IHsgc2VhdHM6IDAsIGJpY3ljbGVzOiAwIH07XG4gICAgY29uc3QgZnJlZVBsYWNlcyA9IHBsYWNlcz8ucmVkdWNlKChhY2N1bXVsYXRvciwgY3VyclBsYWNlOiBQbGFjZSkgPT4ge1xuICAgICAgaWYgKGN1cnJQbGFjZS5zdGF0ZSAhPT0gJ0ZSRUUnKSB7XG4gICAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICAgIH1cbiAgICAgIC8vIENvdW50IHVwIGRlcGVuZGluZyBvbiBzZWF0IHR5cGVcbiAgICAgIGlmIChjdXJyUGxhY2UudHlwZSA9PT0gJ1NFQVQnKSB7XG4gICAgICAgIGFjY3VtdWxhdG9yLnNlYXRzKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhY2N1bXVsYXRvci5iaWN5Y2xlcysrO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICAgIH0sIGFjY3VtdWxhdG9yKTtcbiAgICByZXR1cm4gZnJlZVBsYWNlcyA/IGZyZWVQbGFjZXMgOiBhY2N1bXVsYXRvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdCB0aGUgZW5kIG9mIGEgc2Nyb2xsIEV2ZW50IGZyb20gdGhlIGNvYWNoIHNjcm9sbGFibGUgYXJlYSxcbiAgICogdGhlIHJlYWNoZWQgY29hY2ggaXMgbWFya2VkIGFzIHNlbGVjdGVkXG4gICAqL1xuICBwcml2YXRlIF9oYW5kbGVDb2FjaEFyZWFTY3JvbGxlbmRFdmVudCgpOiB2b2lkIHtcbiAgICBjb25zdCBmaW5kU2Nyb2xsQ29hY2hJbmRleCA9IHRoaXMuaXNBdXRvU2Nyb2xsaW5nXG4gICAgICA/IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleFxuICAgICAgOiB0aGlzLl9nZXRDb2FjaEluZGV4QnlTY3JvbGxUcmlnZ2VyUG9zaXRpb24oKTtcblxuICAgIC8vIFRJTU8tNDM3MDVcbiAgICAvLyBJZiBhIHBsYWNlIHdhcyBzZWxlY3RlZCBieSBtb3VzZSBjbGljayAocHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrKSBiZWZvcmUgdHJpZ2dlcmluZyB0aGlzIHNjcm9sbGVuZCBtZXRob2QsXG4gICAgLy8gdGhlbiB0aGlzIHNjcm9sbGluZyB3YXMgdHJpZ2dlcmVkIGJ5IHRoZSBtZXRob2QgX3Njcm9sbFBsYWNlSW50b05lYXJlc3RWaWV3cG9ydCwgYW5kIGl0IGlzIG9ubHkgYSBwbGFjZSBhZGp1c3RtZW50IHNjcm9sbCAoc2Nyb2xsSW50b1ZpZXcpLFxuICAgIC8vIHdoZXJlIGEgbGVzcyB2aXNpYmxlIHBsYWNlIGhhcyBiZWVuIHNjcm9sbGVkIGludG8gdGhlIHZpZXdwb3J0LiBJbiBjYXNlIG9mIGEgcGxhY2UgYWRqdXN0bWVudCBieSBjbGljaywgd2UgY2FuIHJldHVybiBoZXJlLlxuICAgIGlmICh0aGlzLnByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljaykge1xuICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgZW5kc2Nyb2xsaW5nIGlzIGp1c3QgYSBwbGFjZSBhZGp1c3RtZW50IHNjcm9sbGluZyAocGxhY2UgaGFzIDIgZ3JpZCBzaXplIHVuaXRzKVxuICAgICAgY29uc3QgaXNDb2FjaFNjcm9sbGluZyA9XG4gICAgICAgIE1hdGguYWJzKHRoaXMuX2xhc3RTdGFydFNjcm9sbFBvcyAtIHRoaXMuY29hY2hTY3JvbGxBcmVhLnNjcm9sbExlZnQpID5cbiAgICAgICAgdGhpcy5iYXNlR3JpZFNpemUgKiAyO1xuICAgICAgaWYgKGlzQ29hY2hTY3JvbGxpbmcpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZENvYWNoSW5kZXggPSBmaW5kU2Nyb2xsQ29hY2hJbmRleDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2sgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9sYXN0U3RhcnRTY3JvbGxQb3MgPSB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxMZWZ0O1xuXG4gICAgLy8gQWZ0ZXIgY29hY2ggc2Nyb2xsZW5kIGV2ZW50IHdlIGNhbiByZXNldCB0aGUgaG92ZXJlZCBjb2FjaCBpbmRleFxuICAgIHRoaXMuaG92ZXJlZENvYWNoSW5kZXggPSAtMTtcblxuICAgIC8vIEluIGNhc2UgdGhlIHVzZXIgdXNlcyB0aGUgc2Nyb2xsYmFyIHdpdGhvdXQgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgc2VhdCByZXNlcnZhdGlvbixcbiAgICAvLyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGluZGV4IGlzIC0xLCBhbmQgd2UgaGF2ZSB0byBzZXQgdGhpcyB2YWx1ZSB3aXRoIGZpbmRTY3JvbGxDb2FjaEluZGV4LlxuICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPT09IC0xKSB7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPSBmaW5kU2Nyb2xsQ29hY2hJbmRleDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5faXNTY3JvbGxhYmxlVG9TZWxlY3RlZENvYWNoKCkpIHtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9IGZpbmRTY3JvbGxDb2FjaEluZGV4O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPVxuICAgICAgICBmaW5kU2Nyb2xsQ29hY2hJbmRleCA8IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleFxuICAgICAgICAgID8gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XG4gICAgICAgICAgOiBmaW5kU2Nyb2xsQ29hY2hJbmRleDtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaXNBdXRvU2Nyb2xsaW5nKSB7XG4gICAgICAvL1doZW4gdXNlciBpcyBzY3JvbGxpbmcgdmlhIHNjcm9sbGJhciwgaXQgYXV0b21hdGljYWxseSBzY3JvbGxzIHRvIHRoZSBmb2N1c2VkIGNvYWNoIGluIHRoZSBtYWluIG5hdmlnYXRpb25cbiAgICAgIHRoaXMuX3Njcm9sbFRvU2VsZWN0ZWROYXZpZ2F0aW9uQnV0dG9uKGZpbmRTY3JvbGxDb2FjaEluZGV4KTtcbiAgICB9XG4gICAgdGhpcy5wcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2sgPSBmYWxzZTtcbiAgICB0aGlzLnVwZGF0ZUN1cnJlbnRTZWxlY3RlZENvYWNoKCk7XG5cbiAgICBpZiAoIXRoaXMuaGFzTmF2aWdhdGlvbikge1xuICAgICAgdGhpcy5wcmVzZWxlY3RQbGFjZUluQ29hY2goKTtcbiAgICAgIHRoaXMuaXNBdXRvU2Nyb2xsaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIGFuIGF1dG9tYXRpYyBtYWluIG5hdmlnYXRpb24gc2Nyb2xsIHRvIHRoZSBzcGVjaWZpZWQgc2VsZWN0ZWROYXZDb2FjaEluZGV4LlxuICAgKiBDYWxjdWxhdGVzIHRoZSBjZW50cmFsIHNjcm9sbCBvZmZzZXQgb2YgdGhlIG5hdiBjb2FjaCB0byBiZSBzZWxlY3RlZC5cbiAgICogQHBhcmFtIHNlbGVjdGVkTmF2Q29hY2hJbmRleFxuICAgKi9cbiAgcHJpdmF0ZSBfc2Nyb2xsVG9TZWxlY3RlZE5hdmlnYXRpb25CdXR0b24oc2VsZWN0ZWROYXZDb2FjaEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAvL1RpbWUgZGVsYXkgdG8gbm90IGludGVyZmVyZSB3aXRoIG90aGVyIGV4ZWN1dGluZyBjYWxsaW5nIHNjcm9sbFRvIGZ1bmN0aW9ucyAoY29hY2hlcyBzY3JvbGxpbmcpXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5oYXNOYXZpZ2F0aW9uICYmIHRoaXMubmF2aWdhdGlvblNjcm9sbEFyZWEpIHtcbiAgICAgICAgY29uc3QgbmF2aWdhdGlvbkFyZWFDZW50ZXJlZFBvc1ggPSB0aGlzLnNjcm9sbE5hdmlnYXRpb25BcmVhRGltIC8gMjtcbiAgICAgICAgY29uc3Qgc2Nyb2xsQnV0dG9uT2Zmc2V0WCA9IHNlbGVjdGVkTmF2Q29hY2hJbmRleCAqIHRoaXMuY29hY2hOYXZCdXR0b25EaW07XG4gICAgICAgIGNvbnN0IHNjcm9sbE9mZnNldFggPVxuICAgICAgICAgIHNjcm9sbEJ1dHRvbk9mZnNldFggLSBuYXZpZ2F0aW9uQXJlYUNlbnRlcmVkUG9zWCArIHRoaXMuY29hY2hOYXZCdXR0b25EaW07XG4gICAgICAgIHRoaXMubmF2aWdhdGlvblNjcm9sbEFyZWEuc2Nyb2xsVG8oe1xuICAgICAgICAgIHRvcDogdGhpcy5hbGlnblZlcnRpY2FsID8gc2Nyb2xsT2Zmc2V0WCA6IDAsXG4gICAgICAgICAgbGVmdDogdGhpcy5hbGlnblZlcnRpY2FsID8gMCA6IHNjcm9sbE9mZnNldFgsXG4gICAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LCAxMCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgbmV3IFNjcm9sbERpcmVjdGlvbiBieSB0aGUgbmV3IGdpdmVuIHRhcmdldCBjb2FjaCBpbmRleC5cbiAgICovXG4gIHByaXZhdGUgX3NldFNjcm9sbERpcmVjdGlvbkJ5Q29hY2hJbmRleCgpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJTY3JvbGxEaXJlY3Rpb24gPVxuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID4gdGhpcy5zZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgPyBTY3JvbGxEaXJlY3Rpb24ucmlnaHRcbiAgICAgICAgOiBTY3JvbGxEaXJlY3Rpb24ubGVmdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzY3JvbGwgc3RhcnQgb3IgZW5kIHBvc2l0aW9uIFggZnJvbSB0aGUgc2VsZWN0ZWQgY29hY2guXG4gICAqIEluIGNhc2UgdGhlIHVzZXIgaXMgY3VycmVudGx5IG5hdmlnYXRpbmcgdGhyb3VnaCBwbGFjZXMgYnkga2V5Ym9hcmQgYW5kIGdvZXMgdG8gcHJldmlvdXMgY29hY2gsXG4gICAqIHRoZW4gd2UgcmV0dXJuIHRoZSBlbmQgcG9zaXRpb24gb2YgdGhlIGNvYWNoIHRvIGdldCB0aGUgY2xvc2VzdCBzY3JvbGwgcG9zaXRpb24gb2YgdGhlIG5leHQgZm9jdXMgcGxhY2UuXG4gICAqIEByZXR1cm5zIG51bWJlclxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0Q29hY2hTY3JvbGxQb3NpdGlvblgoKTogbnVtYmVyIHtcbiAgICBjb25zdCBjb2FjaFRyaWdnZXJQb2ludCA9IHRoaXMudHJpZ2dlckNvYWNoUG9zaXRpb25zQ29sbGVjdGlvblt0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdO1xuICAgIGNvbnN0IGlzRm9jdXNQbGFjZUZyb21QcmV2aW91c0NvYWNoUG9zaXRpb24gPVxuICAgICAgdGhpcy5pc0tleWJvYXJkTmF2aWdhdGlvbiAmJlxuICAgICAgdGhpcy5jdXJyU2Nyb2xsRGlyZWN0aW9uID09PSBTY3JvbGxEaXJlY3Rpb24ubGVmdCAmJlxuICAgICAgY29hY2hUcmlnZ2VyUG9pbnQud2lkdGggPiB0aGlzLnNjcm9sbENvYWNoZXNBcmVhV2lkdGg7XG5cbiAgICByZXR1cm4gaXNGb2N1c1BsYWNlRnJvbVByZXZpb3VzQ29hY2hQb3NpdGlvblxuICAgICAgPyBjb2FjaFRyaWdnZXJQb2ludC5lbmQgLSB0aGlzLnNjcm9sbENvYWNoZXNBcmVhV2lkdGhcbiAgICAgIDogY29hY2hUcmlnZ2VyUG9pbnQuc3RhcnQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZm9jdXMgb24gdGhlIEhUTUwgdGFibGUgKGdyaWQpIGNhcHRpb24gZWxlbWVudCBzbyB0aGF0IHRoZSBoZWFkaW5nIGlzIHJlYWQgb3V0IHdoZW4gdXNpbmcgYSBTY3JlZW5SZWFkZXIuXG4gICAqL1xuICBwcml2YXRlIF9zZXRGb2N1c1RvU2VsZWN0ZWRDb2FjaEdyaWQoKTogdm9pZCB7XG4gICAgLy8gV2hlbiB0aGUgdXNlciBwZXJmb3JtcyBhbiBhY3Rpb24gdGhhdCBhZmZlY3RzIHRoZSBjb2FjaCBuYXZpZ2F0aW9uLCB0aGVuIHRoZSBuYXZpZ2F0ZWQgdGFibGUgaXMgZm9jdXNhYmxlLlxuICAgIGlmICh0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlICYmIHRoaXMuaGFzU2VhdFJlc2VydmF0aW9uTmF0aXZlRm9jdXMpIHtcbiAgICAgIHRoaXMuaXNDb2FjaEdyaWRGb2N1c2FibGUgPSBmYWxzZTtcbiAgICAgIGNvbnN0IGNvYWNoVGFibGVDYXB0aW9uRWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcihcbiAgICAgICAgJyNzYmItc3ItY29hY2gtY2FwdGlvbi0nICsgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4LFxuICAgICAgKSBhcyBIVE1MVGFibGVDYXB0aW9uRWxlbWVudDtcbiAgICAgIGlmIChjb2FjaFRhYmxlQ2FwdGlvbkVsZW1lbnQpIHtcbiAgICAgICAgY29hY2hUYWJsZUNhcHRpb25FbGVtZW50LmZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBzY3JvbGxlZCBwb3NpdGlvbiBjYW4gYmUgdXNlZCB0byBzY3JvbGwgdG8gdGhlIHNlbGVjdGVkIHdhZ29uXG4gICAqIEByZXR1cm5zIGJvb2xlYW5cbiAgICovXG4gIHByaXZhdGUgX2lzU2Nyb2xsYWJsZVRvU2VsZWN0ZWRDb2FjaCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBjdXJyU2Nyb2xsUG9zWCA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgPyB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxUb3BcbiAgICAgIDogdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsTGVmdDtcbiAgICBjb25zdCBjb2FjaFNjcm9sbFdpbmRvd1dpZHRoID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICA/IHRoaXMuY29hY2hTY3JvbGxBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodFxuICAgICAgOiB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICBjb25zdCBtYXhTY3JvbGxXaWR0aEFyZWEgPSB0aGlzLm1heENhbGNDb2FjaGVzV2lkdGggLSBjb2FjaFNjcm9sbFdpbmRvd1dpZHRoO1xuICAgIGNvbnN0IGN1cnJDb2FjaFRyaWdnZXIgPSB0aGlzLnRyaWdnZXJDb2FjaFBvc2l0aW9uc0NvbGxlY3Rpb25bdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XTtcbiAgICBjb25zdCBpc1Njcm9sbFBvc1NhbWVUb0N1cnJDb2FjaFBvcyA9XG4gICAgICBjdXJyU2Nyb2xsUG9zWCA9PT0gdGhpcy50cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF0uc3RhcnQ7XG5cbiAgICByZXR1cm4gKFxuICAgICAgKGN1cnJTY3JvbGxQb3NYIDwgbWF4U2Nyb2xsV2lkdGhBcmVhIHx8IGN1cnJTY3JvbGxQb3NYID4gY3VyckNvYWNoVHJpZ2dlci5zdGFydCkgJiZcbiAgICAgICFpc1Njcm9sbFBvc1NhbWVUb0N1cnJDb2FjaFBvc1xuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29hY2ggaW5kZXggd2hpY2ggaXMgY3VycmVudGx5IHZpc2libGUgaW4gdGhlIHNjcm9sbCBhcmVhXG4gICAqIEByZXR1cm5zIG51bWJlclxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0Q29hY2hJbmRleEJ5U2Nyb2xsVHJpZ2dlclBvc2l0aW9uKCk6IG51bWJlciB7XG4gICAgY29uc3Qgc2Nyb2xsUG9zID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICA/IHRoaXMuY29hY2hTY3JvbGxBcmVhLnNjcm9sbFRvcFxuICAgICAgOiB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxMZWZ0O1xuICAgIGNvbnN0IHNjcm9sbE9mZnNldFggPSBzY3JvbGxQb3MgKyB0aGlzLnNjcm9sbENvYWNoZXNBcmVhV2lkdGggLyAyO1xuICAgIHJldHVybiB0aGlzLnRyaWdnZXJDb2FjaFBvc2l0aW9uc0NvbGxlY3Rpb24uZmluZEluZGV4KFxuICAgICAgKGNvYWNoVHJpZ2dlcikgPT4gc2Nyb2xsT2Zmc2V0WCA+PSBjb2FjaFRyaWdnZXIuc3RhcnQgJiYgc2Nyb2xsT2Zmc2V0WCA8PSBjb2FjaFRyaWdnZXIuZW5kLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBmaXJzdCBwbGFjZSBvZiBjdXJyZW50IHNlbGVjdGVkIGNvYWNoIGJ5IHRhYmxlIGNlbGwgY29vcmRpbmF0ZSAwLTAgaWQuXG4gICAqIEByZXR1cm5zIFBsYWNlIG9yIG51bGxcbiAgICovXG4gIHByaXZhdGUgX2dldEZpcnN0UGxhY2VJblNlbGVjdGVkQ29hY2goKTogUGxhY2UgfCBudWxsIHtcbiAgICBsZXQgZmlyc3RQbGFjZTogUGxhY2UgfCBudWxsID0gbnVsbDtcbiAgICBjb25zdCBjb2FjaCA9XG4gICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLmNvYWNoSXRlbXNbdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XTtcbiAgICBjb25zdCBmaXJzdENlbGxJZCA9XG4gICAgICAnY2VsbC0nICsgdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggKyAnLScgKyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggKyAnLTAtMCc7XG4gICAgY29uc3QgcGxhY2VOdW1iZXIgPVxuICAgICAgdGhpcy5zaGFkb3dSb290XG4gICAgICAgID8ucXVlcnlTZWxlY3RvcjxIVE1MVGFibGVDZWxsRWxlbWVudD4oJyMnICsgZmlyc3RDZWxsSWQpXG4gICAgICAgID8ucXVlcnlTZWxlY3RvcjxTYmJTZWF0UmVzZXJ2YXRpb25QbGFjZUNvbnRyb2xFbGVtZW50Pignc2JiLXNlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbCcpXG4gICAgICAgID8uZ2V0QXR0cmlidXRlKCd0ZXh0JykgfHwgbnVsbDtcblxuICAgIGlmIChjb2FjaCAmJiBwbGFjZU51bWJlcikge1xuICAgICAgZmlyc3RQbGFjZSA9IGNvYWNoLnBsYWNlcz8uZmluZCgocGxhY2UpID0+IHBsYWNlLm51bWJlciA9PT0gcGxhY2VOdW1iZXIpIHx8IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBmaXJzdFBsYWNlO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0U3dpdGNoZWRDb2FjaERlY2tJbmRleEJ5S2V5TmF2aWdhdGlvbihcbiAgICBwcmVzc2VkS2V5OiBzdHJpbmcsXG4gICAgY29hY2g6IENvYWNoSXRlbSxcbiAgKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuY3VyclNlbGVjdGVkUGxhY2UgfHxcbiAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHQgfHxcbiAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93TGVmdFxuICAgIClcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgLy9DSEVDSyBERUNLIFNXSVRDSCBET1dOXG4gICAgaWYgKFxuICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dEb3duICYmXG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlLnBvc2l0aW9uLnkgKyAyID09PSBjb2FjaC5kaW1lbnNpb24uaCAmJlxuICAgICAgISF0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggKyAxXVxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ICsgMTtcbiAgICB9XG4gICAgLy9DSEVDSyBERUNLIFNXSVRDSCBVUFxuICAgIGVsc2UgaWYgKFxuICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dVcCAmJlxuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZS5wb3NpdGlvbi55ID09PSAwICYmXG4gICAgICAhIXRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCAtIDFdXG4gICAgKSB7XG4gICAgICByZXR1cm4gdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggLSAxO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUbyBnZXQgdGhlIGNvcnJlY3QgY2xvc2VzdCBwbGFjZSBvZiBjdXJyZW50IHByZXNzZWQga2V5IGFuZCB0aGUgY3VycmVudCBzZWxlY3RlZCBwbGFjZSxcbiAgICogd2UgaGF2ZSB0byBpbnZlc3RpZ2F0ZSB0aGUgY29vcmRpbmF0ZXMgb2YgZWFjaCBwbGFjZSB0byBmaW5kIHRoZSBjbG9zZXN0IHBsYWNlIG9mIHRoZSBjdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZC5cbiAgICogQHBhcmFtIHByZXNzZWRLZXlcbiAgICogQHJldHVybnMgUGxhY2Ugb3IgbnVsbFxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0Q2xvc2VzdFBsYWNlQnlLZXlEaXJlY3Rpb24ocHJlc3NlZEtleT86IHN0cmluZyk6IFBsYWNlIHwgbnVsbCB7XG4gICAgY29uc3QgY29hY2ggPVxuICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XS5jb2FjaEl0ZW1zW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF07XG4gICAgbGV0IGNsb3Nlc3RQbGFjZSA9IG51bGw7XG4gICAgbGV0IGNvYWNoUGxhY2VzID0gY29hY2gucGxhY2VzO1xuICAgIGxldCBzd2l0Y2hlZENvYWNoRGVja0luZGV4ID0gbnVsbDtcblxuICAgIGlmIChjb2FjaFBsYWNlcykge1xuICAgICAgLy8gSWYgbm8gcGxhY2Ugc2V0LCB0aGVuIHdlIHVzZSBpbml0aWFsIHRoZSBsZWZ0LXRvcCBwbGFjZSBvbiB0aGUgY29hY2hcbiAgICAgIGlmICghdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0Rmlyc3RQbGFjZUluU2VsZWN0ZWRDb2FjaCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuY3VyclNlbGVjdGVkUGxhY2UpIHtcbiAgICAgICAgICBjb25zdCBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uID0geyAuLi50aGlzLmN1cnJTZWxlY3RlZFBsYWNlLnBvc2l0aW9uIH07XG5cbiAgICAgICAgICBpZiAocHJlc3NlZEtleSkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUga2V5Ym9hcmQgbmF2aWdhdGlvbiBpcyB1c2VkIHRvIHN3aXRjaCB0byBhbm90aGVyIGNvYWNoIGRlY2sgKFVwIC0+IERvd24gfCBEb3duIC0+IFVwKS5cbiAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgd2UgdGFrZSB0aGUgY29hY2ggcGxhY2VzIHdlIGhhdmUgdG8gY2hlY2tlZCBmcm9tIHRoZSB0YXJnZXQgZGVjayBub3cuXG4gICAgICAgICAgICBzd2l0Y2hlZENvYWNoRGVja0luZGV4ID0gdGhpcy5fZ2V0U3dpdGNoZWRDb2FjaERlY2tJbmRleEJ5S2V5TmF2aWdhdGlvbihcbiAgICAgICAgICAgICAgcHJlc3NlZEtleSxcbiAgICAgICAgICAgICAgY29hY2gsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHN3aXRjaGVkQ29hY2hEZWNrSW5kZXggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gQXNzaWduIGNoZWNrIHBsYWNlcyBmcm9tIHRoZSB0YXJnZXQgc3dpdGNoIGRlY2tcbiAgICAgICAgICAgICAgY29hY2hQbGFjZXMgPVxuICAgICAgICAgICAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1tzd2l0Y2hlZENvYWNoRGVja0luZGV4XS5jb2FjaEl0ZW1zW1xuICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XG4gICAgICAgICAgICAgICAgXS5wbGFjZXMgfHwgW107XG4gICAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gdXBkYXRlIHkgY29vcmRpbmF0ZVxuICAgICAgICAgICAgICBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgPVxuICAgICAgICAgICAgICAgIHN3aXRjaGVkQ29hY2hEZWNrSW5kZXggPCB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCA/IGNvYWNoLmRpbWVuc2lvbi5oIDogLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yIChjb25zdCBwbGFjZSBvZiBjb2FjaFBsYWNlcykge1xuICAgICAgICAgICAgLy8gSWYgbm8ga2V5IHByZXNzZWQsIHRoZW4gd2UgdHJ5IHRvIGZpbmQgdGhlIHBsYWNlIG9mIHRoZSBjdXJyZW50IGN1cnJTY3JvbGxEaXJlY3Rpb25cbiAgICAgICAgICAgIGlmICghcHJlc3NlZEtleSkge1xuICAgICAgICAgICAgICAvLyBGaW5kIHBsYWNlIGZyb20gdGhlIGxlZnQgc2lkZSBvZiBjb2FjaCBieSB5IGNvb3JkaW5hdGUuIEN1cnJlbnQgY3VyclNjcm9sbERpcmVjdGlvbiBpcyBSSUdIVFxuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyU2Nyb2xsRGlyZWN0aW9uID09PSBTY3JvbGxEaXJlY3Rpb24ucmlnaHQgJiZcbiAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi55ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgJiZcbiAgICAgICAgICAgICAgICAoIWNsb3Nlc3RQbGFjZSB8fCBwbGFjZS5wb3NpdGlvbi54IDwgY2xvc2VzdFBsYWNlLnBvc2l0aW9uLngpXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vRmluZCBwbGFjZSBmcm9tIHRoZSByaWdodCBzaWRlIG9mIGNvYWNoIGJ5IHkgY29vcmRpbmF0ZS4gQ3VycmVudCBjdXJyU2Nyb2xsRGlyZWN0aW9uIGlzIExFRlRcbiAgICAgICAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyU2Nyb2xsRGlyZWN0aW9uID09PSBTY3JvbGxEaXJlY3Rpb24ubGVmdCAmJlxuICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnkgPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueSAmJlxuICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnggPiBjbG9zZXN0UGxhY2UucG9zaXRpb24ueClcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY2xvc2VzdFBsYWNlID0gcGxhY2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChwbGFjZS5udW1iZXIgIT09IHRoaXMuY3VyclNlbGVjdGVkUGxhY2U/Lm51bWJlcikge1xuICAgICAgICAgICAgICAgIC8vS2V5IFtSaWdodF0gbmF2aWdhdGlvbiwgd2UgY2hlY2sgdGhlIHBsYWNlIGNvb3JkaW5hdGVzIG9mIHRoZSB4LWF4aXMgdG8gZ2V0IHRoZSBzbWFsbGVzdCBsYXJnZXIgeCBwbGFjZSBjb29yZGluYXRlIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGxhY2VcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1JpZ2h0ICYmXG4gICAgICAgICAgICAgICAgICAocGxhY2UucG9zaXRpb24ueSA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55IHx8XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnkgPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueSAtIDEpICYmXG4gICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi54ID4gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi54ICYmXG4gICAgICAgICAgICAgICAgICAoIWNsb3Nlc3RQbGFjZSB8fCBwbGFjZS5wb3NpdGlvbi54IDwgY2xvc2VzdFBsYWNlLnBvc2l0aW9uLngpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBjbG9zZXN0UGxhY2UgPSBwbGFjZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9LZXkgW0Rvd25dIG5hdmlnYXRpb24sIHdlIGNoZWNrIHRoZSBwbGFjZSBjb29yZGluYXRlcyBvZiB0aGUgeS1heGlzIHRvIGdldCB0aGUgc21hbGxlc3QgbGFyZ2VyIHkgcGxhY2UgY29vcmRpbmF0ZSBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0Rvd24gJiZcbiAgICAgICAgICAgICAgICAgIChwbGFjZS5wb3NpdGlvbi54ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnggfHxcbiAgICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueCA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi54ICsgMSkgJiZcbiAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnkgPiBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgJiZcbiAgICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnkgPCBjbG9zZXN0UGxhY2UucG9zaXRpb24ueSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL0tleSBbTGVmdF0gbmF2aWdhdGlvbiwgd2UgY2hlY2sgdGhlIHBsYWNlIGNvb3JkaW5hdGVzIG9mIHRoZSB4LWF4aXMgdG8gZ2V0IHRoZSBncmVhdGVzdCBzbWFsbGVyIHggcGxhY2UgY29vcmRpbmF0ZSBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0xlZnQgJiZcbiAgICAgICAgICAgICAgICAgIChwbGFjZS5wb3NpdGlvbi55ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgfHxcbiAgICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55ICsgMSkgJiZcbiAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnggPCBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnggJiZcbiAgICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnggPiBjbG9zZXN0UGxhY2UucG9zaXRpb24ueClcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL0tleSBbVXBdIG5hdmlnYXRpb24sIHdlIGNoZWNrIHRoZSBwbGFjZSBjb29yZGluYXRlcyBvZiB0aGUgeS1heGlzIHRvIGdldCB0aGUgZ3JlYXRlc3Qgc21hbGxlciB5IHBsYWNlIGNvb3JkaW5hdGUgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwbGFjZVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dVcCAmJlxuICAgICAgICAgICAgICAgICAgKHBsYWNlLnBvc2l0aW9uLnggPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueCB8fFxuICAgICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi54ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnggLSAxKSAmJlxuICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA8IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueSAmJlxuICAgICAgICAgICAgICAgICAgKCFjbG9zZXN0UGxhY2UgfHwgcGxhY2UucG9zaXRpb24ueSA+IGNsb3Nlc3RQbGFjZS5wb3NpdGlvbi55KVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgY2xvc2VzdFBsYWNlID0gcGxhY2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSWYgYSBwbGFjZSBoYXMgYmVlbiBmb3VuZCBpbiB0aGUgY2hhbmdpbmcgc3dpdGNoIGNvYWNoLFxuICAgICAgICAgIC8vIHdlIGNhbiB1cGRhdGUgdGhlIGN1cnJTZWxlY3RlZERlY2tJbmRleFxuICAgICAgICAgIGlmIChzd2l0Y2hlZENvYWNoRGVja0luZGV4ICE9PSBudWxsICYmIGNsb3Nlc3RQbGFjZSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggPSBzd2l0Y2hlZENvYWNoRGVja0luZGV4O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2xvc2VzdFBsYWNlO1xuICB9XG5cbiAgLy8gSGFuZGxpbmcgZm9yIFRhYiBuYXZpZ2F0aW9uIGlmIGEgcGxhY2UgaXMgc2VsZWN0ZWQgaW5zaWRlIHRoZSBjb2FjaC5cbiAgLy8gVGhpcyBjb250cm9scyB0aGUgZm9jdXNlZCBjb2FjaCBmcm9tIHRoZSBjdXJyZW50IHNlbGVjdGVkIGNvYWNoLlxuICBwcml2YXRlIF9uYXZpZ2F0ZUNvYWNoTmF2aWdhdGlvbkJ5S2V5Ym9hcmQodGFiRGlyZWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyRm9jdXNJbmRleCA9XG4gICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID09PSAtMVxuICAgICAgICA/IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9PT0gLTFcbiAgICAgICAgICA/IDBcbiAgICAgICAgICA6IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleFxuICAgICAgICA6IHRoaXMuZm9jdXNlZENvYWNoSW5kZXg7XG5cbiAgICAvLyBDaGVjayBuZXh0IG9yIHByZXYgdGFiIGlzIHByZXNzZWQsIHRoZW4gd2UgbmVlZCB0byBmaW5kIHRoZSBuZXh0IGF2YWlsYWJsZSBjb2FjaCBpbmRleCB0aGF0IHNob3VsZCByZWNlaXZlIHRoZSBmb2N1c1xuICAgIGNvbnN0IG5ld0ZvY3VzYWJsZUluZGV4OiBudW1iZXIgPVxuICAgICAgdGFiRGlyZWN0aW9uID09PSAnTkVYVF9UQUInXG4gICAgICAgID8gdGhpcy5nZXROZXh0QXZhaWxhYmxlQ29hY2hJbmRleChjdXJyRm9jdXNJbmRleClcbiAgICAgICAgOiB0aGlzLmdldFByZXZBdmFpbGFibGVDb2FjaEluZGV4KGN1cnJGb2N1c0luZGV4KTtcblxuICAgIGlmICh0aGlzLmhhc05hdmlnYXRpb24pIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkUGxhY2VFbGVtZW50ID0gdGhpcy5fZ2V0UGxhY2VIdG1sRWxlbWVudCgpO1xuICAgICAgY29uc3QgcGxhY2VJbkNvYWNoSGFzRm9jdXMgPSBzZWxlY3RlZFBsYWNlRWxlbWVudFxuICAgICAgICA/IHNlbGVjdGVkUGxhY2VFbGVtZW50LmdldEF0dHJpYnV0ZSgna2V5Zm9jdXMnKSA9PT0gJ2ZvY3VzJ1xuICAgICAgICA6IGZhbHNlO1xuXG4gICAgICAvLyBJZiB3ZSB0YWIgYmFjayAoUFJFVl9UQUIpIGFuZCB0aGUgZm9jdXMgaXMgY3VycmVudGx5IG9uIHBsYWNlLFxuICAgICAgLy8gd2UgcmVtb3ZlIHRoZSBzZWxlY3RlZCBzdGF0ZSBmcm9tIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbmF2aWdhdGlvbiBjb2FjaCBhbmQgb25seSBzZXQgdGhlIGZvY3VzIHN0YXR1cyB0byBpdFxuICAgICAgaWYgKHRhYkRpcmVjdGlvbiA9PT0gJ1BSRVZfVEFCJyAmJiB0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCA9PT0gY3VyckZvY3VzSW5kZXgpIHtcbiAgICAgICAgLy8gSWYgd2UgVEFCIGJhY2sgYW5kIGhhdmUgYSBzZWxlY3RlZCBwbGFjZXMgaW5zaWRlIHRoZSBjdXJyZW50IGNvYWNoLCB0aGVuIHdlIG1vdmUgb3V0IGZyb20gdGhlIHNlYXRtYXAgYW5kIHNldCB0aGUgZm9jdXMgdG8gdGhlIGN1cnJlbnQgc2VsZWN0ZWQgY29hY2hcbiAgICAgICAgaWYgKHBsYWNlSW5Db2FjaEhhc0ZvY3VzIHx8IHRoaXMuY3VyclNlbGVjdGVkUGxhY2UgIT09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gY3VyckZvY3VzSW5kZXg7XG4gICAgICAgICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdoZW4gdGhlIGZpcnN0IGNvYWNoIGlzIHNlbGVjdGVkIGFuZCB3ZSBUQUIgYmFjaywgd2UgaGF2ZSB0byBzZXQgdGhlIG5hdGl2ZSBmb2N1cyBvbiB0aGUgZmlyc3QgY29hY2ggaW4gdGhlIG5hdmlnYXRpb24gdG8gZ2V0IGJhY2sgdG8gdGhlIG5vcm1hbCB0YWIgbmF2aWdhdGlvbi5cbiAgICAgICAgLy8gVG8gZG8gdGhpcywgd2UgaGF2ZSB0byByZW1vdmUgdGhlIGZvY3VzZWRJbmRleCBmcm9tIHRoZSBmaXJzdCBjb2FjaCBhbmQgc2V0IGl0IGFnYWluIGFmdGVyIGEgc2hvcnQgZGVsYXlcbiAgICAgICAgZWxzZSBpZiAoY3VyckZvY3VzSW5kZXggPT09IDApIHtcbiAgICAgICAgICAvLyBSZWZvY3VzIHRoZSBmaXJzdCBjb2FjaFxuICAgICAgICAgIHRoaXMuX3JlZm9jdXNDdXJyZW50Rm9jdXNlZE5hdkNvYWNoKGN1cnJGb2N1c0luZGV4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gbmV3Rm9jdXNhYmxlSW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIE9ubHkgc2V0cyB0aGUgZm9jdXMgb24gdGhlIG5ldyBuYXZpZ2F0aW9uIGNvYWNoXG4gICAgICBlbHNlIGlmIChuZXdGb2N1c2FibGVJbmRleCAhPT0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4KSB7XG4gICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSBuZXdGb2N1c2FibGVJbmRleDtcbiAgICAgIH1cbiAgICAgIC8vIFdoZW4gdGhlIGxhc3QgY29hY2ggaXMgc2VsZWN0ZWQgYW5kIHdlIFRBQiwgd2UgaGF2ZSB0byBzZXQgdGhlIG5hdGl2ZSBmb2N1cyBvbiB0aGUgbGFzdCBjb2FjaCBpbiB0aGUgbmF2aWdhdGlvbiB0byBnZXQgYmFjayB0byB0aGUgbm9ybWFsIHRhYiBuYXZpZ2F0aW9uLlxuICAgICAgLy8gVG8gZG8gdGhpcywgd2UgaGF2ZSAgdG8gcmVtb3ZlIHRoZSBmb2N1c2VkSW5kZXggZnJvbSB0aGUgZmlyc3QgY29hY2ggYW5kIHNldCBpdCBhZ2FpbiBhZnRlciBhIHNob3J0IGRlbGF5XG4gICAgICBlbHNlIGlmIChcbiAgICAgICAgdGFiRGlyZWN0aW9uID09PSAnTkVYVF9UQUInICYmXG4gICAgICAgIG5ld0ZvY3VzYWJsZUluZGV4ID09PSB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50cy5sZW5ndGggLSAxXG4gICAgICApIHtcbiAgICAgICAgLy8gUmVmb2N1cyB0aGUgbGFzdCBjb2FjaFxuICAgICAgICB0aGlzLl9yZWZvY3VzQ3VycmVudEZvY3VzZWROYXZDb2FjaChjdXJyRm9jdXNJbmRleCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ID0gbmV3Rm9jdXNhYmxlSW5kZXg7XG4gICAgICAgIC8vIElmIGFueSBwbGFjZSB3YXMgZm9jdXNlZCBpbiBjb2FjaCwgc28gd2Ugc2V0IGZvY3VzZWQgYWdhaW5cbiAgICAgICAgaWYgKHBsYWNlSW5Db2FjaEhhc0ZvY3VzKSB7XG4gICAgICAgICAgdGhpcy5mb2N1c1BsYWNlRWxlbWVudCh0aGlzLmN1cnJTZWxlY3RlZFBsYWNlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBubyBwbGFjZSB3YXMgc2VsZWN0ZWQsIHRoZW4gd2Ugc2VsZWN0IHRoZSBjb2FjaCBncmlkXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHRoaXMuaXNDb2FjaEdyaWRGb2N1c2FibGUgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuX3NldEZvY3VzVG9TZWxlY3RlZENvYWNoR3JpZCgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEJ5IFRhYiBOYXZpZ2F0aW9uLCBwZXJmb3JtIGF1dG9tYXRpYyBzY3JvbGxpbmcgdG8gdGhlIGZvY3VzZWQgd2Fnb25cbiAgICAgIHRoaXMuX3Njcm9sbFRvU2VsZWN0ZWROYXZpZ2F0aW9uQnV0dG9uKG5ld0ZvY3VzYWJsZUluZGV4KTtcbiAgICB9XG4gICAgLy8gSWYgbm8gbmF2aWdhdGlvbiBleGlzdCwgd2Ugc2Nyb2xsIGRpcmVjdGx5IHRvIHRoZSBuZXh0IHRhYmFibGUgY29hY2hcbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuc2Nyb2xsVG9TZWxlY3RlZE5hdkNvYWNoKG5ld0ZvY3VzYWJsZUluZGV4KTtcbiAgICB9XG4gIH1cblxuICAvLyBSZWZvY3VzZWQgdGhlIGN1cnJlbnQgZm9jdXNlZCAodmlzdWFsKSBuYXYgY29hY2ggdG8gZ2V0IHRoZSBuYXRpdmUgZm9jdXMgYmFjayB0byB0aGUgbmF2aWdhdGlvblxuICBwcml2YXRlIF9yZWZvY3VzQ3VycmVudEZvY3VzZWROYXZDb2FjaChmb2N1c0luZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gICAgc2V0VGltZW91dCgoKSA9PiAodGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IGZvY3VzSW5kZXgpLCAwKTtcbiAgfVxuXG4gIHByaXZhdGUgX25hdmlnYXRlVG9QbGFjZUJ5S2V5Ym9hcmQocHJlc3NlZEtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5pc0tleWJvYXJkTmF2aWdhdGlvbiA9IHRydWU7XG5cbiAgICBpZiAodGhpcy5mb2N1c2VkQ29hY2hJbmRleCAhPT0gLTEpIHtcbiAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMucHJldmVudFBsYWNlQ2xpY2spIHtcbiAgICAgIGNvbnN0IGZpbmRDbG9zZXN0UGxhY2UgPSB0aGlzLl9nZXRDbG9zZXN0UGxhY2VCeUtleURpcmVjdGlvbihwcmVzc2VkS2V5KTtcblxuICAgICAgaWYgKGZpbmRDbG9zZXN0UGxhY2UpIHtcbiAgICAgICAgdGhpcy5mb2N1c1BsYWNlRWxlbWVudChmaW5kQ2xvc2VzdFBsYWNlKTtcbiAgICAgIH1cbiAgICAgIC8vIE5vIGNsb3Nlc3QgcGxhY2UgZm91bmQgYnkga2V5IG5hdmlnYXRpb25cbiAgICAgIGVsc2Uge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dSaWdodCB8fFxuICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93TGVmdCB8fFxuICAgICAgICAgICh0aGlzLmFsaWduVmVydGljYWwgJiZcbiAgICAgICAgICAgIChwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1VwIHx8XG4gICAgICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93RG93bikpXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIENoZWNrIHRoZSBjdXJyZW50IHByZXNzZWQga2V5IHRvIGdldCB0aGUgbmV4dCBhdmFpbGFibGUgY29hY2ggaW5kZXhcbiAgICAgICAgICBjb25zdCBuZXdTZWxlY3RlZENvYWNoSW5kZXggPVxuICAgICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dSaWdodFxuICAgICAgICAgICAgICA/IHRoaXMuZ2V0TmV4dEF2YWlsYWJsZUNvYWNoSW5kZXgoKVxuICAgICAgICAgICAgICA6IHRoaXMuZ2V0UHJldkF2YWlsYWJsZUNvYWNoSW5kZXgoKTtcblxuICAgICAgICAgIHRoaXMuc2Nyb2xsVG9TZWxlY3RlZE5hdkNvYWNoKG5ld1NlbGVjdGVkQ29hY2hJbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0TmV4dEF2YWlsYWJsZUNvYWNoSW5kZXgoY3VycmVudEluZGV4PzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBzdGFydEluZGV4ID0gY3VycmVudEluZGV4ID8/IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleDtcbiAgICByZXR1cm4gc3RhcnRJbmRleCA8IHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0uY29hY2hJdGVtcy5sZW5ndGggLSAxXG4gICAgICA/IHN0YXJ0SW5kZXggKyAxXG4gICAgICA6IHN0YXJ0SW5kZXg7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0UHJldkF2YWlsYWJsZUNvYWNoSW5kZXgoY3VycmVudEluZGV4PzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBzdGFydEluZGV4ID0gY3VycmVudEluZGV4ID8/IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleDtcbiAgICByZXR1cm4gc3RhcnRJbmRleCA+IDAgPyBzdGFydEluZGV4IC0gMSA6IHN0YXJ0SW5kZXg7XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlU2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMocGxhY2VTZWxlY3Rpb246IFBsYWNlU2VsZWN0aW9uKTogdm9pZCB7XG4gICAgY29uc3QgcGxhY2VUeXBlUHJvcCA9IHBsYWNlU2VsZWN0aW9uLnBsYWNlVHlwZSA9PT0gJ1NFQVQnID8gJ3NlYXRzJyA6ICdiaWN5Y2xlcyc7XG4gICAgY29uc3QgbWF4UmVzZXJ2YXRpb25zID1cbiAgICAgIHBsYWNlU2VsZWN0aW9uLnBsYWNlVHlwZSA9PT0gJ1NFQVQnID8gdGhpcy5tYXhTZWF0UmVzZXJ2YXRpb25zIDogdGhpcy5tYXhCaWN5Y2xlUmVzZXJ2YXRpb25zO1xuICAgIGNvbnN0IGN1cnJTZWxlY3RlZFBsYWNlcyA9IHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXNbcGxhY2VUeXBlUHJvcF07XG5cbiAgICB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzW3BsYWNlVHlwZVByb3BdID0gdGhpcy5fdXBkYXRlU2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMoXG4gICAgICBjdXJyU2VsZWN0ZWRQbGFjZXMsXG4gICAgICBtYXhSZXNlcnZhdGlvbnMsXG4gICAgICBwbGFjZVNlbGVjdGlvbixcbiAgICApO1xuICAgIC8qKlxuICAgICAqIEB0eXBlIHtDdXN0b21FdmVudDxTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZFBsYWNlcz59XG4gICAgICogRW1pdHMgd2hlbiBhIHBsYWNlIHdhcyBzZWxlY3RlZCBhbmQgcmV0dXJucyBhIFBsYWNlIGFycmF5IHdpdGggYWxsIHNlbGVjdGVkIHBsYWNlcy5cbiAgICAgKi9cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQ8U2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXM+KCdzZWxlY3RlZHBsYWNlcycsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDogdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcyxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVTZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcyhcbiAgICBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlczogU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25bXSxcbiAgICBtYXhSZXNlcnZhdGlvbnM6IG51bWJlcixcbiAgICBwbGFjZVNlbGVjdGlvbjogUGxhY2VTZWxlY3Rpb24sXG4gICk6IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uW10ge1xuICAgIC8vIEFkZCBzZWxlY3RlZCBwbGFjZSB0byBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlc1xuICAgIGlmIChwbGFjZVNlbGVjdGlvbi5zdGF0ZSA9PT0gJ1NFTEVDVEVEJykge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRQbGFjZURlY2tJbmRleCA9IHRoaXMuX2dldERlY2tJbmRleEJ5UGxhY2VJZChwbGFjZVNlbGVjdGlvbi5pZCk7XG4gICAgICBjb25zdCBzZWF0UmVzZXJ2YXRpb25TZWxlY3Rpb24gPSB0aGlzLl9nZXRTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbihcbiAgICAgICAgcGxhY2VTZWxlY3Rpb24sXG4gICAgICAgIHNlbGVjdGVkUGxhY2VEZWNrSW5kZXgsXG4gICAgICApO1xuICAgICAgaWYgKHNlYXRSZXNlcnZhdGlvblNlbGVjdGlvbikge1xuICAgICAgICBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5wdXNoKHNlYXRSZXNlcnZhdGlvblNlbGVjdGlvbik7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFJlbW92ZSBzZWxlY3RlZCBwbGFjZSBmcm9tIHNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzXG4gICAgZWxzZSB7XG4gICAgICBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcyA9IHNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzLmZpbHRlcihcbiAgICAgICAgKF9zZWxlY3RlZFBsYWNlKSA9PiBfc2VsZWN0ZWRQbGFjZS5pZCAhPT0gcGxhY2VTZWxlY3Rpb24uaWQsXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBDaGVja3Mgd2hldGhlciBtYXhSZXNlcnZhdGlvbiBpcyBhY3RpdmF0ZWQgYW5kIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzZWxlY3RlZCBwbGFjZXMgaXMgcmVhY2hlZFxuICAgIGlmIChtYXhSZXNlcnZhdGlvbnMgPiAtMSAmJiBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5sZW5ndGggPiBtYXhSZXNlcnZhdGlvbnMpIHtcbiAgICAgIGNvbnN0IHJlc2V0V2l0aFBsYWNlU2VsZWN0aW9uID0gbWF4UmVzZXJ2YXRpb25zID4gMCA/IHBsYWNlU2VsZWN0aW9uIDogdW5kZWZpbmVkO1xuXG4gICAgICBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcyA9IHRoaXMuX3Jlc2V0QWxsUGxhY2VTZWxlY3Rpb25zKFxuICAgICAgICBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcyxcbiAgICAgICAgcmVzZXRXaXRoUGxhY2VTZWxlY3Rpb24sXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlQ3VycmVudFNlbGVjdGVkUGxhY2VJbkNvYWNoKHBsYWNlU2VsZWN0aW9uOiBQbGFjZVNlbGVjdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IHBsYWNlRGVja0luZGV4ID0gdGhpcy5fZ2V0RGVja0luZGV4QnlQbGFjZUlkKHBsYWNlU2VsZWN0aW9uLmlkKTtcbiAgICBjb25zdCBjb2FjaEluZGV4ID0gcGxhY2VTZWxlY3Rpb24uY29hY2hJbmRleDtcblxuICAgIGlmIChwbGFjZURlY2tJbmRleCA9PT0gbnVsbCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcGxhY2UgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbcGxhY2VEZWNrSW5kZXhdLmNvYWNoSXRlbXNbY29hY2hJbmRleF0ucGxhY2VzPy5maW5kKFxuICAgICAgKHBsYWNlKSA9PiBwbGFjZS5udW1iZXIgPT0gcGxhY2VTZWxlY3Rpb24ubnVtYmVyLFxuICAgICk7XG5cbiAgICBpZiAoIXBsYWNlKSByZXR1cm47XG5cbiAgICB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCA9IHBsYWNlRGVja0luZGV4O1xuICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9IGNvYWNoSW5kZXg7XG4gICAgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSA9IHBsYWNlO1xuXG4gICAgaWYgKHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCAhPT0gdGhpcy5zZWxlY3RlZENvYWNoSW5kZXgpIHtcbiAgICAgIHRoaXMudXBkYXRlQ3VycmVudFNlbGVjdGVkQ29hY2goKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zZXRDdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZChwbGFjZSk7XG5cbiAgICAvLyBUaW1lIGRlbGF5IHRvIHdhaXQgZm9yIHN0YXR1cyB1cGRhdGUgcHJvY2VzcyBhdCBjbGlja2VkIHBsYWNlXG4gICAgY29uc3QgZGVsYXlTY3JvbGxJblZpZXdwb3J0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9zY3JvbGxQbGFjZUludG9OZWFyZXN0Vmlld3BvcnQocGxhY2VTZWxlY3Rpb24uaWQpO1xuICAgICAgY2xlYXJUaW1lb3V0KGRlbGF5U2Nyb2xsSW5WaWV3cG9ydCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlQ3VycmVudFNlbGVjdGVkQ29hY2goKTogdm9pZCB7XG4gICAgLy9Pbmx5IGlmIHRoZSBzZWxlY3RlZENvYWNoSW5kZXggaGFzIGNoYW5nZWQsIGFuIHVwZGF0ZSBuZWVkcyB0byBiZSBjYXJyaWVkIG91dFxuICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPT0gdGhpcy5zZWxlY3RlZENvYWNoSW5kZXgpIHJldHVybjtcblxuICAgIC8vIElmIGEgZm9jdXNpbmRleCBoYXMgYmVlbiBzZXQgKCE9IC0xKSwgaXQgY2FuIGJlIHVwZGF0ZWQgd2l0aCB0aGUgY3VycmVudCBzZWxlY3RlZENvYWNoSW5kZXhcbiAgICBpZiAodGhpcy5mb2N1c2VkQ29hY2hJbmRleCAhPSAtMSkge1xuICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleDtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RlZENvYWNoSW5kZXggPSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG5cbiAgICBjb25zdCBjb2FjaFNlbGVjdGlvbiA9IHRoaXMuX2dldFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkQ29hY2godGhpcy5zZWxlY3RlZENvYWNoSW5kZXgpO1xuICAgIGlmIChjb2FjaFNlbGVjdGlvbikge1xuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSB7Q3VzdG9tRXZlbnQ8U2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRDb2FjaD59XG4gICAgICAgKiBFbWl0cyB3aGVuIGEgY29hY2ggd2FzIHNlbGVjdGVkIGFuZCByZXR1cm5zIGEgQ29hY2hTZWxlY3Rpb25cbiAgICAgICAqL1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQ8U2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRDb2FjaD4oJ3NlbGVjdGVkY29hY2gnLCB7XG4gICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgICBkZXRhaWw6IGNvYWNoU2VsZWN0aW9uLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldFBsYWNlRWxlbWVudElkKFxuICAgIGNvYWNoRGVja0luZGV4OiBudW1iZXIsXG4gICAgY29hY2hJbmRleDogbnVtYmVyLFxuICAgIHBsYWNlTnVtYmVyOiBzdHJpbmcsXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIChcbiAgICAgICdzZWF0LXJlc2VydmF0aW9uX19wbGFjZS1idXR0b24tJyArIGNvYWNoRGVja0luZGV4ICsgJy0nICsgY29hY2hJbmRleCArICctJyArIHBsYWNlTnVtYmVyXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbiB0aGUgY2FzZSBvZiBjb2FjaCBsYXlvdXRzIHdpdGggZGlmZmVyZW50IGRlY2tzLFxuICAgKiBpdCBpcyBuZWNlc3NhcnkgdG8gZXh0ZW5kIHRoZSBvZmZzZXQgd2l0aCBlbXB0eSBjb2FjaGVzXG4gICAqIGluIG9yZGVyIHRvIGNyZWF0ZSBhIHN0YWJsZSB2ZWhpY2xlIGxheW91dC5cbiAgICpcbiAgICogICAgICAgICAgICAgW29vb10tW29vb10tW29vb11cbiAgICogW29vb10tW29vb10tW29vb10tW29vb10tW29vb11cbiAgICovXG4gIHByaXZhdGUgX2luaXRFbXB0eUNvYWNoRGVja09mZnNldHMoKTogdm9pZCB7XG4gICAgLy8gUHJlZmlsbCBvZmZzZXQgY291bnRlcnMgd2l0aCAwIHN0YXJ0IGluZGV4XG4gICAgY29uc3QgY29hY2hPZmZzZXRJbmRleENvdW50ZXIgPSBBcnJheSh0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoIC0gMSkuZmlsbCgwKTtcbiAgICAvLyBUYWtlcyB0aGUgbG93ZXIgZGVjayB3aGljaCBjb250YWlucyB0aGUgbWF4IG51bWJlcnMgb2YgY29hY2hlc1xuICAgIGNvbnN0IGxvd2VyRGVjayA9IHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoIC0gMV07XG5cbiAgICBsb3dlckRlY2suY29hY2hJdGVtcy5mb3JFYWNoKChsb3dlckNvYWNoSXRlbTogQ29hY2hJdGVtKSA9PiB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VhdFJlc2VydmF0aW9ucy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgY29uc3QgZGVja0NvYWNoSXRlbSA9IHRoaXMuc2VhdFJlc2VydmF0aW9uc1tpXS5jb2FjaEl0ZW1zW2NvYWNoT2Zmc2V0SW5kZXhDb3VudGVyW2ldXTtcbiAgICAgICAgaWYgKGxvd2VyQ29hY2hJdGVtLmlkICE9IGRlY2tDb2FjaEl0ZW0/LmlkKSB7XG4gICAgICAgICAgLy8gQWRkIEVtcHR5IG9mZnNldCBjb2FjaCB0byBzcGVjaWZpZWQgaW5kZXggcG9zaXRpb25cbiAgICAgICAgICBjb25zdCBlbXB0eU9mZnNldENvYWNoID0ge1xuICAgICAgICAgICAgLi4ubG93ZXJDb2FjaEl0ZW0sXG4gICAgICAgICAgICBwbGFjZXM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHByb3BlcnR5SWRzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBncmFwaGljRWxlbWVudHM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHNlcnZpY2VFbGVtZW50czogdW5kZWZpbmVkLFxuICAgICAgICAgICAgdHJhdmVsQ2xhc3M6IFtdLFxuICAgICAgICAgIH07XG4gICAgICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zW2ldLmNvYWNoSXRlbXMuc3BsaWNlKFxuICAgICAgICAgICAgY29hY2hPZmZzZXRJbmRleENvdW50ZXJbaV0sXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgZW1wdHlPZmZzZXRDb2FjaCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29hY2hPZmZzZXRJbmRleENvdW50ZXJbaV0rKztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXphdGlvbiBvZiBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbiBBcnJheSBiYXNlZCBvbiB0aGUgdHJhbnNmZXJyZWQgcGxhY2VzXG4gICAqIHRoYXQgaGF2ZSB0aGUgc3RhdGUgU0VMRUNURUQgd2l0aGluIHRoZSBzZWF0UmVzZXJ2YXRpb24gb2JqZWN0XG4gICAqL1xuICBwcml2YXRlIF9pbml0U2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgLy8gUmVzZXQgcGxhY2Ugc2VsZWN0aW9uc1xuICAgIHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMuc2VhdHMgPSBbXTtcbiAgICB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzLmJpY3ljbGVzID0gW107XG5cbiAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnM/LmZvckVhY2goKHNlYXRSZXNlcnZhdGlvbjogU2VhdFJlc2VydmF0aW9uLCBjb2FjaERlY2tJbmRleDogbnVtYmVyKSA9PlxuICAgICAgc2VhdFJlc2VydmF0aW9uLmNvYWNoSXRlbXMubWFwKChjb2FjaDogQ29hY2hJdGVtLCBjb2FjaEluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgY29hY2gucGxhY2VzXG4gICAgICAgICAgPy5maWx0ZXIoKHBsYWNlKSA9PiBwbGFjZS5zdGF0ZSA9PT0gJ1NFTEVDVEVEJylcbiAgICAgICAgICA/LmZvckVhY2goKHBsYWNlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwbGFjZUlkID0gdGhpcy5nZXRQbGFjZUVsZW1lbnRJZChjb2FjaERlY2tJbmRleCwgY29hY2hJbmRleCwgcGxhY2UubnVtYmVyKTtcbiAgICAgICAgICAgIGNvbnN0IHByZXNlbGVjdGVkUGxhY2VTZWxlY3Rpb246IFBsYWNlU2VsZWN0aW9uID0gbWFwUGxhY2VJbmZvc1RvUGxhY2VTZWxlY3Rpb24oXG4gICAgICAgICAgICAgIHBsYWNlLFxuICAgICAgICAgICAgICBwbGFjZUlkLFxuICAgICAgICAgICAgICBzZWF0UmVzZXJ2YXRpb24uZGVja0NvYWNoSW5kZXgsXG4gICAgICAgICAgICAgIGNvYWNoSW5kZXgsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCBzZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbjogU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24gfCBudWxsID1cbiAgICAgICAgICAgICAgdGhpcy5fZ2V0U2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24ocHJlc2VsZWN0ZWRQbGFjZVNlbGVjdGlvbiwgY29hY2hEZWNrSW5kZXgpO1xuXG4gICAgICAgICAgICBpZiAoc2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgaWYgKHNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uLnBsYWNlVHlwZSA9PT0gJ1NFQVQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5zZWF0cy5wdXNoKHNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzLmJpY3ljbGVzLnB1c2goc2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbCBzZWxlY3RlZCBwbGFjZXMgd2lsbCBiZSByZXNldCBvciB0aGUgY3VycmVudFNlbGVjdGVkUGxhY2Ugd2FzIGdpdmVuLCB0aGVuIHdlIHJlc2V0IGFsbCBleGNlcHQgY3VycmVudFNlbGVjdGVkUGxhY2VcbiAgICogQHBhcmFtIHJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25zXG4gICAqIEBwYXJhbSBjdXJyU2VsZWN0ZWRQbGFjZVxuICAgKi9cbiAgcHJpdmF0ZSBfcmVzZXRBbGxQbGFjZVNlbGVjdGlvbnMoXG4gICAgcmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbnM6IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uW10sXG4gICAgY3VyclNlbGVjdGVkUGxhY2U/OiBQbGFjZVNlbGVjdGlvbixcbiAgKTogU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25bXSB7XG4gICAgLy9GaW5kIGFsbCBwbGFjZXMgdG8gYmUgbmVlZGVkIHVuc2VsZWN0XG4gICAgZm9yIChjb25zdCBwbGFjZVNlbGVjdGlvbiBvZiByZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9ucykge1xuICAgICAgaWYgKCFjdXJyU2VsZWN0ZWRQbGFjZSB8fCBjdXJyU2VsZWN0ZWRQbGFjZS5pZCAhPT0gcGxhY2VTZWxlY3Rpb24uaWQpIHtcbiAgICAgICAgY29uc3QgcGxhY2VFbGVtZW50ID0gdGhpcy5zaGFkb3dSb290Py5nZXRFbGVtZW50QnlJZChwbGFjZVNlbGVjdGlvbi5pZCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmIChwbGFjZUVsZW1lbnQpIHtcbiAgICAgICAgICBwbGFjZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdzdGF0ZScsICdGUkVFJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy9SZW1vdmVzIGFsbCBzZWxlY3RlZCBwbGFjZXMgZXhjZXB0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGxhY2VcbiAgICBpZiAoY3VyclNlbGVjdGVkUGxhY2UpIHtcbiAgICAgIHJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25zID0gcmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbnMuZmlsdGVyKFxuICAgICAgICAoX3NlbGVjdGVkUGxhY2UpID0+IF9zZWxlY3RlZFBsYWNlLmlkID09PSBjdXJyU2VsZWN0ZWRQbGFjZS5pZCxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25zID0gW107XG4gICAgfVxuICAgIHJldHVybiByZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgX2dldFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKFxuICAgIGN1cnJTZWxlY3RlZFBsYWNlOiBQbGFjZVNlbGVjdGlvbixcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyIHwgbnVsbCxcbiAgKTogU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24gfCBudWxsIHtcbiAgICBpZiAoY29hY2hEZWNrSW5kZXggPT09IG51bGwpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgY29hY2ggPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbY29hY2hEZWNrSW5kZXhdLmNvYWNoSXRlbXNbY3VyclNlbGVjdGVkUGxhY2UuY29hY2hJbmRleF07XG4gICAgY29uc3QgcGxhY2UgPSBjb2FjaC5wbGFjZXM/LmZpbmQoKHBsYWNlKSA9PiBwbGFjZS5udW1iZXIgPT09IGN1cnJTZWxlY3RlZFBsYWNlLm51bWJlcik7XG5cbiAgICByZXR1cm4gcGxhY2VcbiAgICAgID8gbWFwUGxhY2VBbmRDb2FjaFRvU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24oXG4gICAgICAgICAgcGxhY2UsXG4gICAgICAgICAgY29hY2gsXG4gICAgICAgICAgY3VyclNlbGVjdGVkUGxhY2UuaWQsXG4gICAgICAgICAgY3VyclNlbGVjdGVkUGxhY2UuZGVja0luZGV4LFxuICAgICAgICAgIGN1cnJTZWxlY3RlZFBsYWNlLmNvYWNoSW5kZXgsXG4gICAgICAgIClcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFNlYXRSZXNlcnZhdGlvblNlbGVjdGVkQ29hY2goXG4gICAgY29hY2hJbmRleDogbnVtYmVyLFxuICApOiBTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZENvYWNoIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLmNvYWNoSXRlbXNbY29hY2hJbmRleF0pIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgY29hY2ggPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLmNvYWNoSXRlbXNbY29hY2hJbmRleF07XG4gICAgY29uc3QgY29hY2hOdW1iZXJPZkZyZWVQbGFjZXMgPSB0aGlzLmdldEF2YWlsYWJsZUZyZWVQbGFjZXNOdW1Gcm9tQ29hY2goY29hY2gucGxhY2VzKTtcbiAgICByZXR1cm4gbWFwQ29hY2hJbmZvc1RvQ29hY2hTZWxlY3Rpb24oY29hY2hJbmRleCwgY29hY2gsIGNvYWNoTnVtYmVyT2ZGcmVlUGxhY2VzKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NldEN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkKHBsYWNlOiBQbGFjZSB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkID0gcGxhY2VcbiAgICAgID8gdGhpcy5nZXRQbGFjZUVsZW1lbnRJZChcbiAgICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCxcbiAgICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXgsXG4gICAgICAgICAgcGxhY2UubnVtYmVyLFxuICAgICAgICApXG4gICAgICA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyYXRpb24gb2YgdGhlIHVzZWQgZG9jdW1lbnRzIGZvbnQtc2l6ZSB3aGljaCBuZWVkc1xuICAgKiB0byBiZSBkZXRlcm1pbmVkIGluIG9yZGVyIHRvIGNvcnJlY3RseSBjYWxjdWxhdGUgQ1NTIHZhbHVlcyB3aXRoIHJlbVxuICAgKiAqL1xuICBwcml2YXRlIF9kZXRlcm1pbmVCYXNlRm9udFNpemUoKTogdm9pZCB7XG4gICAgaWYgKCFpc1NlcnZlcikge1xuICAgICAgY29uc3QgYmFzZUZvbnRTaXplID0gcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSkuZm9udFNpemUsIDEwKTtcbiAgICAgIC8vY2FsY3VsYXRlIHJlbSBvZiAxcHhcbiAgICAgIGNvbnN0IG9uZVBpeGVsSW5SZW0gPSAxIC8gYmFzZUZvbnRTaXplO1xuICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tb25lLXB4LXJlbScsIGAke29uZVBpeGVsSW5SZW0gKyAncmVtJ31gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgZGF0YSBmb3IgZGlzcGxheWluZyBuYXZpZ2F0aW9uIGFyZWEuXG4gICAqIENhbGN1bGF0ZXMgdGhlIHZhbHVlcyB3aGljaCBhcmUgbm90IGdvaW5nIHRvIGNoYW5nZSBkdXJpbmcgdXNlIG9mIGEgY29tcG9uZW50OlxuICAgKiAgICAtIGNvYWNoIGlkXG4gICAqICAgIC0gbGlzdCBvZiBzZXJ2aWNlIGljb25zXG4gICAqICAgIC0gY2xhc3MgKGZpcnN0LCBzZWNvbmQsIGFueSlcbiAgICogICAgLSB3aGV0aGVyIHRoZXJlIGlzIGEgZHJpdmVyIGFyZWEgbGVmdCBvciByaWdodFxuICAgKiAqL1xuICBwcml2YXRlIF9wcmVwYXJlQ29hY2hJdGVtRGV0YWlsc0RhdGEoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VhdFJlc2VydmF0aW9ucykge1xuICAgICAgY29uc3QgbG93ZXJEZWNrOiBDb2FjaEl0ZW1bXSA9XG4gICAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoIC0gMV0uY29hY2hJdGVtcztcblxuICAgICAgdGhpcy5jb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHMgPSBbXTtcblxuICAgICAgbG93ZXJEZWNrLmZvckVhY2goKGNvYWNoLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCB0cmF2ZWxDbGFzc2VzOiBQbGFjZVRyYXZlbENsYXNzW10gPSBbXTtcbiAgICAgICAgY29uc3QgcHJvcGVydHlJZHM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGNvbnN0IHBsYWNlczogUGxhY2VbXSA9IFtdO1xuXG4gICAgICAgIC8vIENvbGxlY3QgYWxsIGltcG9ydGFudCBuYXZpZ2F0aW9uIGRhdGEgdG8gYmUgcmVuZGVyZWRcbiAgICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zXG4gICAgICAgICAgLm1hcCgoc3IpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBzci5jb2FjaEl0ZW1zW2luZGV4XTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5mb3JFYWNoKChjb2FjaDogQ29hY2hJdGVtKSA9PiB7XG4gICAgICAgICAgICB0cmF2ZWxDbGFzc2VzLnB1c2goLi4uY29hY2gudHJhdmVsQ2xhc3MpO1xuICAgICAgICAgICAgcHJvcGVydHlJZHMucHVzaCguLi4oY29hY2gucHJvcGVydHlJZHMgPyBjb2FjaC5wcm9wZXJ0eUlkcyA6IFtdKSk7XG4gICAgICAgICAgICBwbGFjZXMucHVzaCguLi4oY29hY2gucGxhY2VzID8gY29hY2gucGxhY2VzIDogW10pKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50cy5wdXNoKHtcbiAgICAgICAgICBpZDogY29hY2guaWQsXG4gICAgICAgICAgdHJhdmVsQ2xhc3M6IHRoaXMuX3ByZXBhcmVUcmF2ZWxDbGFzc05hdmlnYXRpb24odHJhdmVsQ2xhc3NlcyksXG4gICAgICAgICAgcHJvcGVydHlJZHM6IHRoaXMuX3ByZXBhcmVTZXJ2aWNlSWNvbnNOYXZpZ2F0aW9uKHByb3BlcnR5SWRzKSxcbiAgICAgICAgICBpc0RyaXZlckFyZWE6IGNvYWNoLnBsYWNlcyA/IGNvYWNoLnBsYWNlcy5sZW5ndGggPT09IDAgOiB0cnVlLFxuICAgICAgICAgIGlzTG9jb21vdGl2ZTogdGhpcy5faXNMb2NvbW90aXZlKGNvYWNoKSxcbiAgICAgICAgICBkcml2ZXJBcmVhU2lkZTogdGhpcy5fcHJlcGFyZURyaXZlckFyZWFTaWRlTmF2aWdhdGlvbihjb2FjaCksXG4gICAgICAgICAgZnJlZVBsYWNlczogdGhpcy5nZXRBdmFpbGFibGVGcmVlUGxhY2VzTnVtRnJvbUNvYWNoKHBsYWNlcyksXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gI1RJTU8tNDU4NThcbiAgLy8gRmluZHMgdGhlIG9wdGltYWwgaWNvbiBzaXplIGJhc2VkIG9uIGFsbCBzZXJ2aWNlRWxlbWVudHMgYW5kIHRoZWlyIGRpbWVuc2lvbi5cbiAgLy8gVGhpcyBzZXRzIHRoZSBnbG9iYWxBcmVhSWNvbkRpbSBhbmQgaXMgdXNlZCB3aGVuIGNyZWF0aW5nIHRoZSBzZWF0IHJlc2VydmF0aW9uIGFyZWEgZWxlbWVudHMuXG4gIC8vIFRoaXMgZ2l2ZXMgdXMgYSBtYXhpbXVtIHVuaWZvcm0gaWNvbiBzaXplIHdpdGhpbiB0aGUgYXJlYSBlbGVtZW50c1xuICBwcml2YXRlIF9wcmVwYXJlT3B0aW1pemVBcmVhSWNvbkRpbWVuc2lvbkJ5TWVkaWFuKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlYXRSZXNlcnZhdGlvbnMpIHtcbiAgICAgIGNvbnN0IGFsbFNlcnZpY2VEaW1lbnNpb25zOiBFbGVtZW50RGltZW5zaW9uW10gPSBbXTtcbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9ucy5mb3JFYWNoKChkZWNrKSA9PlxuICAgICAgICBkZWNrLmNvYWNoSXRlbXMuZm9yRWFjaCgoY29hY2gpID0+XG4gICAgICAgICAgY29hY2guc2VydmljZUVsZW1lbnRzPy5mb3JFYWNoKChpY29uKSA9PiBhbGxTZXJ2aWNlRGltZW5zaW9ucy5wdXNoKGljb24uZGltZW5zaW9uKSksXG4gICAgICAgICksXG4gICAgICApO1xuXG4gICAgICBpZiAoYWxsU2VydmljZURpbWVuc2lvbnMubGVuZ3RoKSB7XG4gICAgICAgIGFsbFNlcnZpY2VEaW1lbnNpb25zLnNvcnQoXG4gICAgICAgICAgKGRpbTE6IEVsZW1lbnREaW1lbnNpb24gfCB1bmRlZmluZWQsIGRpbTI6IEVsZW1lbnREaW1lbnNpb24gfCB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgICAgIGlmIChkaW0xICYmIGRpbTIpIHtcbiAgICAgICAgICAgICAgY29uc3QgbWF4RGltMSA9IGRpbTEudyArIGRpbTEuaDtcbiAgICAgICAgICAgICAgY29uc3QgbWF4RGltMiA9IGRpbTIudyArIGRpbTIuaDtcbiAgICAgICAgICAgICAgaWYgKG1heERpbTEgPiBtYXhEaW0yKSByZXR1cm4gMTtcbiAgICAgICAgICAgICAgZWxzZSBpZiAobWF4RGltMSA8IG1heERpbTIpIHJldHVybiAtMTtcbiAgICAgICAgICAgICAgZWxzZSByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgYmVzdCBpY29uIHNpemUgYnkgbWVkaWFuXG4gICAgICAgIGNvbnN0IG1lZGlhbkljb25TaXplID0gYWxsU2VydmljZURpbWVuc2lvbnNbTWF0aC5mbG9vcihhbGxTZXJ2aWNlRGltZW5zaW9ucy5sZW5ndGggLyAyKV0hO1xuXG4gICAgICAgIC8vIFNldCB0aGUgZGV0ZXJtaW5lZCBtZWRpYW4gaWNvbiBzaXplIGFzIGdsb2JhbCBjYWxjdWxhdGVkIGFyZWEgaWNvbiBkaW1lbnNpb25cbiAgICAgICAgdGhpcy5nbG9iYWxBcmVhSWNvbkRpbSA9IHRoaXMuZ2V0Q2FsY3VsYXRlZERpbWVuc2lvbihtZWRpYW5JY29uU2l6ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBmaW5kIHRoZSBtYXhpbXVtIGNvYWNoIGhlaWdodCBmcm9tIGFsbCBkZWNrc1xuICAgICAgICBjb25zdCBtYXhDb2FjaEhlaWdodCA9IHRoaXMuc2VhdFJlc2VydmF0aW9uc1xuICAgICAgICAgIC5mbGF0TWFwKChkZWNrKSA9PiBkZWNrLmNvYWNoSXRlbXMubWFwKChjb2FjaCkgPT4gY29hY2guZGltZW5zaW9uLmgpKVxuICAgICAgICAgIC5yZWR1Y2UoKG1heCwgaGVpZ2h0KSA9PiBNYXRoLm1heChtYXgsIGhlaWdodCksIDApO1xuXG4gICAgICAgIC8vY2FsY3VsYXRlIDIwJSBvZiBtYXhpbXVtIGhlaWdodCBhcyBpY29uIGRpbWVuc2lvblxuICAgICAgICBjb25zdCBpY29uRGltZW5zaW9uID0gTWF0aC5mbG9vcihtYXhDb2FjaEhlaWdodCAqIDAuMik7XG4gICAgICAgIHRoaXMuZ2xvYmFsQXJlYUljb25EaW0gPSB0aGlzLmdldENhbGN1bGF0ZWREaW1lbnNpb24oe1xuICAgICAgICAgIHc6IGljb25EaW1lbnNpb24sXG4gICAgICAgICAgaDogaWNvbkRpbWVuc2lvbixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcHJlcGFyZVRyYXZlbENsYXNzTmF2aWdhdGlvbih0cmF2ZWxDbGFzc2VzOiBQbGFjZVRyYXZlbENsYXNzW10pOiBQbGFjZVRyYXZlbENsYXNzIHtcbiAgICBpZiAodHJhdmVsQ2xhc3Nlcy5pbmRleE9mKCdGSVJTVCcpICE9PSAtMSkgcmV0dXJuICdGSVJTVCc7XG4gICAgaWYgKHRyYXZlbENsYXNzZXMuaW5kZXhPZignU0VDT05EJykgIT09IC0xKSByZXR1cm4gJ1NFQ09ORCc7XG4gICAgcmV0dXJuICdBTllfQ0xBU1MnO1xuICB9XG5cbiAgcHJpdmF0ZSBfcHJlcGFyZURyaXZlckFyZWFTaWRlTmF2aWdhdGlvbihcbiAgICBjb2FjaEl0ZW06IENvYWNoSXRlbSxcbiAgKTogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNvYWNoRHJpdmVyQXJlYXMgPSBjb2FjaEl0ZW0uZ3JhcGhpY0VsZW1lbnRzPy5maWx0ZXIoXG4gICAgICAoZ3JhcGhpY2FsRWxlbWVudHMpID0+IGdyYXBoaWNhbEVsZW1lbnRzLmljb24gPT09ICdEUklWRVJfQVJFQScsXG4gICAgKTtcblxuICAgIGlmIChjb2FjaERyaXZlckFyZWFzICYmIGNvYWNoRHJpdmVyQXJlYXMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gQ2hlY2tpbmcgdGhlIGRyaXZlciBhcmVhIHBvc2l0aW9uIHdoZXRoZXIgaXQgaXMgcHJlc2VudCBvbiB0aGUgbGVmdCBvciByaWdodCBzaWRlIGluIGEgY29hY2hcbiAgICAgIGNvbnN0IGhhc0xlZnREcml2ZXJBcmVhID1cbiAgICAgICAgY29hY2hEcml2ZXJBcmVhcy5maW5kKChkcml2ZXJBcmVhRWxlbWVudCkgPT4gZHJpdmVyQXJlYUVsZW1lbnQucG9zaXRpb24ueCA9PT0gMCkgfHwgZmFsc2U7XG4gICAgICBjb25zdCBoYXNSaWdodERyaXZlckFyZWEgPVxuICAgICAgICBjb2FjaERyaXZlckFyZWFzLmZpbmQoKGRyaXZlckFyZWFFbGVtZW50KSA9PiBkcml2ZXJBcmVhRWxlbWVudC5wb3NpdGlvbi54ID4gMCkgfHwgZmFsc2U7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxlZnQ6ICEhaGFzTGVmdERyaXZlckFyZWEsXG4gICAgICAgIHJpZ2h0OiAhIWhhc1JpZ2h0RHJpdmVyQXJlYSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIF9wcmVwYXJlU2VydmljZUljb25zTmF2aWdhdGlvbiA9IChwcm9wZXJ0eUlkczogc3RyaW5nW10pOiBzdHJpbmdbXSA9PiB7XG4gICAgaWYgKCFwcm9wZXJ0eUlkcykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHNocnVua1Byb3BlcnR5SWRzID0gcHJvcGVydHlJZHNcbiAgICAgID8ubWFwKGZ1bmN0aW9uIChwcm9wZXJ0eUlkOiBzdHJpbmcpOiB7XG4gICAgICAgIHBJZDogc3RyaW5nO1xuICAgICAgICBzdmdOYW1lOiBzdHJpbmc7XG4gICAgICB9IHtcbiAgICAgICAgLy8gcHJlcGFyZSB0ZW1wb3Jhcnkgb2JqZWN0IG1hcHBpbmcgcHJvcGVydHkgaWQgdG8gaXQncyBzdmdOYW1lIHNvIHRoYXQgd2UgY2FuIGNvbXBhcmUgaXQgdG8gdGhlIGxpc3Qgb2YgYWxsb3dlZCBpY29uc1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHBJZDogcHJvcGVydHlJZCxcbiAgICAgICAgICBzdmdOYW1lOiBtYXBJY29uVG9TdmdbcHJvcGVydHlJZF0/LnN2Z05hbWUgPyBtYXBJY29uVG9TdmdbcHJvcGVydHlJZF0/LnN2Z05hbWUgOiAnJyxcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgICAvL2ZpbHRlciBvdXQgb2JqZWN0cyBzZXJ2aWNlIGljb25zIHdoaWNoIGFyZSBub3QgaW4gQUxMT1dFRF9TRVJWSUNFX0lDT05TXG4gICAgICAuZmlsdGVyKChwcm9wZXJ0eVRvU3ZnKSA9PiBBTExPV0VEX1NFUlZJQ0VfSUNPTlMuaW5kZXhPZihwcm9wZXJ0eVRvU3ZnLnN2Z05hbWUpICE9PSAtMSlcbiAgICAgIC8vbWFrZSBpdCBkaXN0aW5jdCBieSBzdmdOYW1lXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAodmFsdWUsIGluZGV4LCBzZWxmKSA9PlxuICAgICAgICAgIHNlbGYubWFwKChwcm9wU3ZnKSA9PiBwcm9wU3ZnLnN2Z05hbWUpLmluZGV4T2YodmFsdWUuc3ZnTmFtZSkgPT09IGluZGV4LFxuICAgICAgKVxuICAgICAgLy8gZ28gYmFjayB0byBwcm9wZXJ0eUlkIHN0cmluZyBmcm9tIHRlbXBvcmFyeSBvYmplY3RcbiAgICAgIC5tYXAoKHByb3BlcnR5VG9TdmcpID0+IHByb3BlcnR5VG9TdmcucElkKVxuICAgICAgLy8gdGFrZSBmaXJzdCBNQVhfU0VSVklDRV9QUk9QRVJUSUVTIHJlZ2FyZGxlc3Mgb2YgdGhlIGlucHV0IGZyb20gQmFja2VuZCwgb3RoZXJ3aXNlIHRoZSBsYXlvdXQgY291bGQgYmUgZGVzdHJveWVkXG4gICAgICAuc2xpY2UoMCwgTUFYX1NFUlZJQ0VfUFJPUEVSVElFUyk7XG4gICAgcmV0dXJuIHNocnVua1Byb3BlcnR5SWRzID8gc2hydW5rUHJvcGVydHlJZHMgOiBbXTtcbiAgfTtcblxuICAvLyBJbml0aWFsbHkgY2FsY3VsYXRlcyBhbGwgdGhlIG5lY2Vzc2FyeSBwb3NpdGlvbnMgYW5kIGRpbWVuc2lvbnMgb2YgYWxsIGNvYWNoIGVsZW1lbnRzLCBhcmVhIGVsZW1lbnRzLCBzZXJ2aWNlIGVsZW1lbnRzXG4gIHByaXZhdGUgX3ByZXBhcmVTZWF0UmVzZXJ2YXRpb25TdHJ1Y3R1cmVJbmZvcm1hdGlvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWF0UmVzZXJ2YXRpb25zKSB7XG4gICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvblN0cnVjdHVyZSA9IHtcbiAgICAgICAgZGVja3M6IFtdLFxuICAgICAgfTtcblxuICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zLmZvckVhY2goKHNlYXRSZXNlcnZhdGlvbjogU2VhdFJlc2VydmF0aW9uLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IHNlYXRSZXNlcnZhdGlvbkRlY2s6IFNlYXRyZXNlcnZhdGlvbkRlY2sgPSB7XG4gICAgICAgICAgZGVja0luZGV4OiBpbmRleCxcbiAgICAgICAgICBkZWNrQ29hY2hlczogW10sXG4gICAgICAgIH07XG5cbiAgICAgICAgc2VhdFJlc2VydmF0aW9uPy5jb2FjaEl0ZW1zPy5mb3JFYWNoKChjb2FjaEl0ZW06IENvYWNoSXRlbSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGZpbHRlcmVkQXJlYUVsZW1lbnRzID0gY29hY2hJdGVtLmdyYXBoaWNFbGVtZW50cz8uZmlsdGVyKFxuICAgICAgICAgICAgKGUpID0+IGUuaWNvbiAmJiAhdGhpcy5ub3RBcmVhRWxlbWVudHMuaW5jbHVkZXMoZS5pY29uKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGFsbEVsZW1lbmV0cyA9XG4gICAgICAgICAgICBmaWx0ZXJlZEFyZWFFbGVtZW50c1xuICAgICAgICAgICAgICA/LmNvbmNhdChjb2FjaEl0ZW0uc2VydmljZUVsZW1lbnRzIHx8IFtdKVxuICAgICAgICAgICAgICAuY29uY2F0KGNvYWNoSXRlbS5wbGFjZXMgfHwgW10pIHx8IFtdO1xuICAgICAgICAgIGNvbnN0IGhhc092ZXJoYW5naW5nRWxlbWVudHMgPSB0aGlzLl9pc092ZXJoYW5naW5nRWxlbWVudHNQcmVzZW50KFxuICAgICAgICAgICAgY29hY2hJdGVtLmRpbWVuc2lvbi53LFxuICAgICAgICAgICAgYWxsRWxlbWVuZXRzLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgYXJlYUVsZW1lbnRzID0gY29hY2hJdGVtLmdyYXBoaWNFbGVtZW50c1xuICAgICAgICAgICAgPy5maWx0ZXIoXG4gICAgICAgICAgICAgIChncmFwaGljYWxFbGVtZW50OiBCYXNlRWxlbWVudCkgPT5cbiAgICAgICAgICAgICAgICAhdGhpcy5ub3RBcmVhRWxlbWVudHMuaW5jbHVkZXMoZ3JhcGhpY2FsRWxlbWVudC5pY29uISksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAubWFwKChlbGUpID0+XG4gICAgICAgICAgICAgIHRoaXMuX2dldENhbGN1bGF0ZWREaW1lbnNpb25Qb3NpdGlvbkVsZW1lbnQoZWxlLCBjb2FjaEl0ZW0uZGltZW5zaW9uLCB0cnVlKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3Qgb3RoZXJFbGVtZW50cyA9IGNvYWNoSXRlbS5ncmFwaGljRWxlbWVudHNcbiAgICAgICAgICAgID8uZmlsdGVyKChncmFwaGljYWxFbGVtZW50OiBCYXNlRWxlbWVudCkgPT5cbiAgICAgICAgICAgICAgdGhpcy5ub3RBcmVhRWxlbWVudHMuaW5jbHVkZXMoZ3JhcGhpY2FsRWxlbWVudC5pY29uISksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAubWFwKChlbGUpID0+XG4gICAgICAgICAgICAgIHRoaXMuX2dldENhbGN1bGF0ZWREaW1lbnNpb25Qb3NpdGlvbkVsZW1lbnQoZWxlLCBjb2FjaEl0ZW0uZGltZW5zaW9uLCBmYWxzZSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHNlcnZpY2VFbGVtZW50cyA9IGNvYWNoSXRlbS5zZXJ2aWNlRWxlbWVudHM/Lm1hcCgoZWxlKSA9PlxuICAgICAgICAgICAgdGhpcy5fZ2V0Q2FsY3VsYXRlZERpbWVuc2lvblBvc2l0aW9uRWxlbWVudChlbGUsIGNvYWNoSXRlbS5kaW1lbnNpb24sIGZhbHNlKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGJvcmRlck1pZGRsZUVsZW1lbnQgPSB0aGlzLl9nZXRDYWxjdWxhdGVkTWlkZGxlQm9yZGVyRWxlbWVudChjb2FjaEl0ZW0pO1xuICAgICAgICAgIGNvbnN0IGNhbGNDb2FjaERpbWVuc2lvbiA9IHRoaXMuZ2V0Q2FsY3VsYXRlZERpbWVuc2lvbih7IC4uLmNvYWNoSXRlbS5kaW1lbnNpb24gfSk7XG4gICAgICAgICAgLy8gQ29sbGVjdCBhbGwgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGZvciBzaW5nbGUgY29hY2hcbiAgICAgICAgICBjb25zdCBjb2FjaFN0dXJjdHVyZTogQ29hY2hTdHJ1Y3R1cmUgPSB7XG4gICAgICAgICAgICB3aWR0aDogY2FsY0NvYWNoRGltZW5zaW9uLncsXG4gICAgICAgICAgICBoZWlnaHQ6IGNhbGNDb2FjaERpbWVuc2lvbi5oLFxuICAgICAgICAgICAgb3RoZXJFbGVtZW50czogb3RoZXJFbGVtZW50cyB8fCBbXSxcbiAgICAgICAgICAgIHNlcnZpY2VFbGVtZW50czogc2VydmljZUVsZW1lbnRzIHx8IFtdLFxuICAgICAgICAgICAgYXJlYUVsZW1lbnRzOiBhcmVhRWxlbWVudHMgfHwgW10sXG4gICAgICAgICAgICBib3JkZXJNaWRkbGVFbGVtZW50OiBib3JkZXJNaWRkbGVFbGVtZW50LFxuICAgICAgICAgICAgaGFzT3ZlcmhhbmdpbmdFbGVtZW50czogaGFzT3ZlcmhhbmdpbmdFbGVtZW50cyxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgc2VhdFJlc2VydmF0aW9uRGVjay5kZWNrQ29hY2hlcy5wdXNoKGNvYWNoU3R1cmN0dXJlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25TdHJ1Y3R1cmUuZGVja3MucHVzaChzZWF0UmVzZXJ2YXRpb25EZWNrKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjYWxjdWxhdGVkIHBvc2l0aW9uIGFuZCBkaW1lbnNpb24gb2YgdGhlIG1pZGRsZSBib3JkZXIuXG4gICAqIFRvIGNhbGN1bGF0ZSB0aGUgc3RhcnQgKyBlbmQgY29vcmRpbmF0ZSBhbmQgdGhlIGRpbWVuc2lvbiBvZiB0aGUgbWlkZGxlIGJvcmRlciBjb2FjaCBncmFwaGljLFxuICAgKiB0aGUgZXhpc3RpbmcgZG9ja2luZyBjb2FjaCBncmFwaGljcyBhcmUgYW5hbHlzZWQgYW5kIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSByZXF1aXJlZCBwb3NpdGlvbiBhbmQgZGllbWVuc2lvbiBpbmZvcm1hdGlvbi5cbiAgICogQHJldHVybnMgQmFzZUVsZW1lbnRcbiAgICovXG4gIHByaXZhdGUgX2dldENhbGN1bGF0ZWRNaWRkbGVCb3JkZXJFbGVtZW50KGNvYWNoOiBDb2FjaEl0ZW0pOiBCYXNlRWxlbWVudCB7XG4gICAgY29uc3QgYm9yZGVySGVpZ2h0ID0gKGNvYWNoLmRpbWVuc2lvbi5oICsgdGhpcy5jb2FjaEJvcmRlck9mZnNldCAqIDIpICogdGhpcy5iYXNlR3JpZFNpemU7XG4gICAgLy8gRGVmYXVsdCAtIHdpdGhvdXQgZmluZGluZyBkb2NraW5nIGJvcmRlciBlbGVtZW50cywgdGhlIG1pZGRsZSBib3JkZXIgZ29lcyBmcm9tIDAgcG9zaXRpb24gdW50aWwgY29hY2ggd2lkdGggZW5kXG4gICAgbGV0IHN0YXJ0Qm9yZGVyT2Zmc2V0WCA9IDA7XG4gICAgbGV0IGJvcmRlcldpZHRoID0gY29hY2guZGltZW5zaW9uLnc7XG5cbiAgICBpZiAoY29hY2guZ3JhcGhpY0VsZW1lbnRzKSB7XG4gICAgICAvLyBEb2NraW5nRWxlbWVudGUgZGVmaW5lcyB0aGUgZWxlbWVudHMgd2hlcmUgdGhlIGJvcmRlciBvZiB0aGUgY29hY2ggcmVhbGx5IHN0YXJ0cyBhbmQgZW5kc1xuICAgICAgY29uc3QgZG9ja2luZ0VsZW1lbnRzID0gdGhpcy5fZ2V0Rmlyc3RMYXN0RG9ja2luZ0VsZW1lbnRzKGNvYWNoLmdyYXBoaWNFbGVtZW50cyk7XG5cbiAgICAgIC8vIFR3byBkb2NraW5nIGNvYWNoIGVsZW1lbnRzIGV4aXN0IChub3JtYWwgY2FzZSAtIHN0YXJ0IGFuZCBlbmQgZG9ja2luZyBlbGVtZW50KVxuICAgICAgaWYgKGRvY2tpbmdFbGVtZW50cz8ubGVuZ3RoID09IDIpIHtcbiAgICAgICAgY29uc3QgZmlyc3REb2NraW5nRWxlbWVudCA9IGRvY2tpbmdFbGVtZW50c1swXTtcbiAgICAgICAgY29uc3QgbGFzdERvY2tpbmdFbGVtZW50ID0gZG9ja2luZ0VsZW1lbnRzWzFdO1xuICAgICAgICBjb25zdCBlbmRCb3JkZXJPZmZzZXRYID1cbiAgICAgICAgICBmaXJzdERvY2tpbmdFbGVtZW50LnBvc2l0aW9uLnggPT0gMFxuICAgICAgICAgICAgPyBsYXN0RG9ja2luZ0VsZW1lbnQuZGltZW5zaW9uLndcbiAgICAgICAgICAgIDogZmlyc3REb2NraW5nRWxlbWVudC5kaW1lbnNpb24udztcblxuICAgICAgICBzdGFydEJvcmRlck9mZnNldFggPVxuICAgICAgICAgIGZpcnN0RG9ja2luZ0VsZW1lbnQucG9zaXRpb24ueCA9PSAwXG4gICAgICAgICAgICA/IGZpcnN0RG9ja2luZ0VsZW1lbnQuZGltZW5zaW9uLndcbiAgICAgICAgICAgIDogbGFzdERvY2tpbmdFbGVtZW50LmRpbWVuc2lvbi53O1xuXG4gICAgICAgIGJvcmRlcldpZHRoID0gY29hY2guZGltZW5zaW9uLncgLSBlbmRCb3JkZXJPZmZzZXRYIC0gc3RhcnRCb3JkZXJPZmZzZXRYO1xuICAgICAgfVxuICAgICAgLy8gT25seSBvbmUgZG9ja2luZyBib3JkZXIgY29hY2ggZWxlbWVudHMgZXhpc3QgKHN0YXJ0IG9yIGVuZCBkb2NraW5nIGVsZW1lbnQpXG4gICAgICBlbHNlIGlmIChkb2NraW5nRWxlbWVudHM/Lmxlbmd0aCA9PSAxKSB7XG4gICAgICAgIGNvbnN0IGRvY2tpbmdFbGVtZW50ID0gZG9ja2luZ0VsZW1lbnRzWzBdO1xuXG4gICAgICAgIC8vIE1pZGRsZUJvcmRlciBzdGFydHMgZnJvbSBsZWZ0IGRvY2tpbmcgZWxlbWVudCB1bnRpbCBjb2FjaCBlbmRcbiAgICAgICAgaWYgKGRvY2tpbmdFbGVtZW50LnBvc2l0aW9uLnggPT09IDApIHtcbiAgICAgICAgICBzdGFydEJvcmRlck9mZnNldFggPSBkb2NraW5nRWxlbWVudC5kaW1lbnNpb24udztcbiAgICAgICAgICBib3JkZXJXaWR0aCA9IGNvYWNoLmRpbWVuc2lvbi53IC0gZG9ja2luZ0VsZW1lbnQuZGltZW5zaW9uLnc7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTWlkZGxlQm9yZGVyIHN0YXJ0cyBmcm9tIHBvc2l0aW9uIHggMCB1bnRpbCBkb2NraW5nIGVsZW1lbnQgb24gdGhlIHJpZ2h0IGNvYWNoIHNpZGVcbiAgICAgICAgZWxzZSBpZiAoZG9ja2luZ0VsZW1lbnQucG9zaXRpb24ueCAhPT0gMCkge1xuICAgICAgICAgIGJvcmRlcldpZHRoID0gY29hY2guZGltZW5zaW9uLncgLSBkb2NraW5nRWxlbWVudC5kaW1lbnNpb24udztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHlPZmZzZXQgPSB0aGlzLmNvYWNoQm9yZGVyUGFkZGluZyAqIC0xO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBvc2l0aW9uOiB7IHg6IHN0YXJ0Qm9yZGVyT2Zmc2V0WCAqIHRoaXMuYmFzZUdyaWRTaXplLCB5OiB5T2Zmc2V0LCB6OiAwIH0sXG4gICAgICBkaW1lbnNpb246IHsgdzogYm9yZGVyV2lkdGggKiB0aGlzLmJhc2VHcmlkU2l6ZSwgaDogYm9yZGVySGVpZ2h0IH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGdyYXBoaWNhbCBlbGVtZW50cyBkZXNjcmliaW5nIHRoZSBzdGFydCBhbmQgZW5kIGJvcmRlciBlbGVtZW50cyBvZiB0aGUgY29hY2guXG4gICAqIEByZXR1cm5zIEJhc2VFbGVtZW50W11cbiAgICovXG4gIHByaXZhdGUgX2dldEZpcnN0TGFzdERvY2tpbmdFbGVtZW50cyhncmFwaGljRWxlbWVudHM6IEJhc2VFbGVtZW50W10pOiBCYXNlRWxlbWVudFtdIHtcbiAgICAvLyBHZXQgYWxsIHJlbGV2YW50IGRvY2tpbmcgZWxlbWVudHMgYW5kIHNvcnRzIHRoZW0gYWdhaW4gYWNjb3JkaW5nIHRvIHRoZWlyIHggcG9zaXRpb24gY29vcmRpbmF0ZXMsXG4gICAgLy8gdGh1cyB0aGUgc3RhcnQgYW5kIGVuZCBkb2NraW5nIGVsZW1lbnRzIHdvdWxkIGJlIGRlZmluZWRcbiAgICBjb25zdCBmaWx0ZXJlZERvY2tpbmdFbGVtZW50cyA9IChcbiAgICAgIGdyYXBoaWNFbGVtZW50cy5maWx0ZXIoKGVsZSkgPT4gdGhpcy5taWRkbGVCb3JkZXJEb2NraW5nRWxlbWVudHMuaW5jbHVkZXMoZWxlLmljb24hKSkgfHwgW11cbiAgICApLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IHBvc0EgPSBhLnBvc2l0aW9uLng7XG4gICAgICBjb25zdCBwb3NCID0gYi5wb3NpdGlvbi54O1xuICAgICAgaWYgKHBvc0EgPiBwb3NCKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuICAgICAgaWYgKHBvc0EgPCBwb3NCKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAwO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZpbHRlcmVkRG9ja2luZ0VsZW1lbnRzLmZpbHRlcihcbiAgICAgIChfLCBpbmRleCkgPT4gaW5kZXggPT0gMCB8fCBpbmRleCA9PSBmaWx0ZXJlZERvY2tpbmdFbGVtZW50cy5sZW5ndGggLSAxLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY2FsY3VsYXRlZCBwb3NpdGlvbnMgYW5kIGRpbWVuc2lvbnMgb2YgZ3JhcGhpY2FsLCBzZXJ2aWNlIGFuZCBhcmVhIGVsZW1lbnRzXG4gICAqIEByZXR1cm5zIEJhc2VFbGVtZW50XG4gICAqL1xuICBwcml2YXRlIF9nZXRDYWxjdWxhdGVkRGltZW5zaW9uUG9zaXRpb25FbGVtZW50KFxuICAgIGVsZW1lbnQ6IEJhc2VFbGVtZW50LFxuICAgIGNvYWNoRGltZW5zaW9uOiBFbGVtZW50RGltZW5zaW9uLFxuICAgIGlzQ2FsY0FyZWFFbGVtZW50OiBib29sZWFuLFxuICApOiBCYXNlRWxlbWVudCB7XG4gICAgY29uc3QgZGltID0geyAuLi5lbGVtZW50LmRpbWVuc2lvbiB9O1xuICAgIGNvbnN0IHBvcyA9IHsgLi4uZWxlbWVudC5wb3NpdGlvbiB9O1xuICAgIGNvbnN0IHJvdGF0aW9uID0gZWxlbWVudC5yb3RhdGlvbiB8fCAwO1xuICAgIGNvbnN0IGlzTm90Rml4ZWRSb3RhdGlvbkdyYXBoaWNhbEVsZW1lbnQgPVxuICAgICAgdGhpcy5ub3RBcmVhRWxlbWVudHMuY29uY2F0KHRoaXMubm90Rml4ZWRSb3RhdGFibGVBcmVhSWNvbnMpLmluZGV4T2YoZWxlbWVudC5pY29uISkgPT09IC0xO1xuICAgIGNvbnN0IGNhbGNSb3RhdGlvbiA9XG4gICAgICB0aGlzLmFsaWduVmVydGljYWwgJiYgaXNOb3RGaXhlZFJvdGF0aW9uR3JhcGhpY2FsRWxlbWVudCA/IHJvdGF0aW9uIC0gOTAgOiByb3RhdGlvbjtcbiAgICBsZXQgYXJlYU1vdW50aW5nOiBFbGVtZW50TW91bnRpbmcgfCBudWxsID0gbnVsbDtcblxuICAgIC8vIENhbGN1bGF0ZSBwb3NpdGlvbiBhbmQgZGltZW5zaW9uIGZvciBBcmVhRWxlbWVudHNcbiAgICBpZiAoaXNDYWxjQXJlYUVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGlzTm90VGFibGVHcmFwaGljID0gZWxlbWVudC5pY29uPy5pbmRleE9mKCdUQUJMRScpID09PSAtMTtcbiAgICAgIGNvbnN0IGFyZWFQcm9wZXJ0eSA9IGVsZW1lbnQuaWNvbiAmJiBpc05vdFRhYmxlR3JhcGhpYyA/IGVsZW1lbnQuaWNvbiA6IG51bGw7XG4gICAgICBjb25zdCBzdHJldGNoSGVpZ2h0ID1cbiAgICAgICAgdGhpcy5pc0VsZW1lbnREaXJlY3RseU9uQm9yZGVyKGVsZW1lbnQsIGNvYWNoRGltZW5zaW9uKSAmJiBhcmVhUHJvcGVydHkgIT09ICdFTlRSWV9FWElUJztcblxuICAgICAgaWYgKGVsZW1lbnQucG9zaXRpb24ueSA9PT0gMCkge1xuICAgICAgICBhcmVhTW91bnRpbmcgPSAndXBwZXItYm9yZGVyJztcbiAgICAgICAgcG9zLnkgLT0gdGhpcy5jb2FjaEJvcmRlck9mZnNldCAtIHRoaXMuY29hY2hCb3JkZXJPZmZzZXQgLyAzO1xuICAgICAgfSBlbHNlIGlmIChlbGVtZW50LnBvc2l0aW9uLnkgKyBlbGVtZW50LmRpbWVuc2lvbi5oID09PSBjb2FjaERpbWVuc2lvbi5oKSB7XG4gICAgICAgIGFyZWFNb3VudGluZyA9ICdsb3dlci1ib3JkZXInO1xuICAgICAgICBpZiAoIXN0cmV0Y2hIZWlnaHQpIHtcbiAgICAgICAgICBwb3MueSArPSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0IC0gdGhpcy5jb2FjaEJvcmRlck9mZnNldCAvIDM7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHN0cmV0Y2hIZWlnaHQpIHtcbiAgICAgICAgZGltLmggKz0gdGhpcy5jb2FjaEJvcmRlck9mZnNldCAtIHRoaXMuY29hY2hCb3JkZXJPZmZzZXQgLyAzO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBDYWxjdWxhdGUgcG9zaXRpb24gYW5kIGRpbWVuc2lvbiBmb3IgYWxsIG90aGVyIGdyYXBoaWNhbCBlbGVtZW50c1xuICAgIGVsc2Uge1xuICAgICAgaWYgKGVsZW1lbnQucG9zaXRpb24ueSA9PT0gMCkge1xuICAgICAgICBwb3MueSAtPSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0O1xuICAgICAgfVxuXG4gICAgICBpZiAoY29hY2hEaW1lbnNpb24uaCA9PT0gZWxlbWVudC5wb3NpdGlvbi55ICsgZWxlbWVudC5kaW1lbnNpb24uaCkge1xuICAgICAgICBkaW0uaCArPSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ICogMjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBkaW0udyAqPSB0aGlzLmJhc2VHcmlkU2l6ZTtcbiAgICBkaW0uaCAqPSB0aGlzLmJhc2VHcmlkU2l6ZTtcblxuICAgIHBvcy54ICo9IHRoaXMuYmFzZUdyaWRTaXplO1xuICAgIHBvcy55ICo9IHRoaXMuYmFzZUdyaWRTaXplO1xuXG4gICAgY29uc3QgaWNvbiA9XG4gICAgICBlbGVtZW50Lmljb24gJiYgZWxlbWVudC5pY29uLmVuZHNXaXRoKCdEUklWRVJfQVJFQScpXG4gICAgICAgID8gZWxlbWVudC5pY29uPy5jb25jYXQoJ18nLCB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLnZlaGljbGVUeXBlKVxuICAgICAgICA6IGVsZW1lbnQuaWNvbjtcblxuICAgIHJldHVybiB7XG4gICAgICBpY29uOiBpY29uLFxuICAgICAgcm90YXRpb246IGNhbGNSb3RhdGlvbixcbiAgICAgIGRpbWVuc2lvbjogZGltLFxuICAgICAgcG9zaXRpb246IHBvcyxcbiAgICAgIG1vdW50aW5nOiBhcmVhTW91bnRpbmcsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNlbGVjdGVkIHBsYWNlIEhUTUwgZWxlbWVudCBieSBjdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZC5cbiAgICogQHJldHVybnMgSFRNTEVsZW1lbnQgb3IgbnVsbFxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0UGxhY2VIdG1sRWxlbWVudCgpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkXG4gICAgICA/IHRoaXMuc2hhZG93Um9vdD8uZ2V0RWxlbWVudEJ5SWQodGhpcy5jdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZCkgfHwgbnVsbFxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGV4dHJhY3RlZCBjb2FjaCBkZWNrIGluZGV4IGZyb20gcGxhY2UgaWRcbiAgICogQHJldHVybnMgbnVtYmVyXG4gICAqL1xuICBwcml2YXRlIF9nZXREZWNrSW5kZXhCeVBsYWNlSWQocGxhY2VJZDogc3RyaW5nKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgY29uc3QgZGVja0luZGV4ID0gdGhpcy5zaGFkb3dSb290XG4gICAgICA/LnF1ZXJ5U2VsZWN0b3IoJyMnICsgcGxhY2VJZClcbiAgICAgID8uZ2V0QXR0cmlidXRlKCdkYXRhLWRlY2staW5kZXgnKTtcbiAgICBpZiAoZGVja0luZGV4ICYmICFpc05hTigrZGVja0luZGV4KSkge1xuICAgICAgcmV0dXJuICtkZWNrSW5kZXg7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNWYWxpZENvYWNoSW5kZXgoY29hY2hJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNvYWNoSW5kZXggPj0gMCAmJlxuICAgICAgY29hY2hJbmRleCA8PSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCAtIDFdLmNvYWNoSXRlbXMubGVuZ3RoXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGV4aXN0aW5nIGNvYWNoIGRlY2sgaW5kZXggZGVwZW5kaW5nIG9uIHRoZSBzZWxlY3RlZCBjb2FjaC5cbiAgICogVGhpcyBtZXRob2QgaXMgbmVjZXNzYXJ5IHRvIGdldCBhbiBhdmFpbGFibGUgY29hY2ggZGVjayBpbmRleCBkdXJpbmcga2V5Ym9hcmQgbmF2aWdhdGlvbiwgd2hpY2ggY2FuIHZhcnkgYmV0d2VlbiBjb2FjaGVzIHdpdGggZGlmZmVyZW50IGRlY2tzLlxuICAgKiBGb3IgZXhhbXBsZSwgd2hlbiBuYXZpZ2F0aW5nIGZyb20gYSBjb2FjaCB3aXRoIHR3byBkZWNrcyB0byBhIGNvYWNoIHdpdGggb25lIGRlY2suXG4gICAqXG4gICAqICAgICAgIFtvb29dLVtvb29dLVtvb29dXG4gICAqIFtvb29dLVtvb29dLVtvb29dLVtvb29dLVtvb29dXG4gICAqXG4gICAqIEByZXR1cm5zIG51bWJlclxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0RXhpc3RpbmdDb2FjaERlY2tJbmRleCgpOiBudW1iZXIge1xuICAgIGlmIChcbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0uY29hY2hJdGVtc1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdXG4gICAgICAgIC5wbGFjZXMgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4O1xuICAgIH1cblxuICAgIC8vIEZpbmQgbmV4dCBwb3NzaWJsZSBjb2FjaCBkZWNrIGluZGV4IHdoZXJlIHBsYWNlcyBleGlzdFxuICAgIGNvbnN0IG5leHRBdmFpbGFibGVEZWNrQ29hY2hJbmRleCA9IHRoaXMuc2VhdFJlc2VydmF0aW9ucy5maW5kSW5kZXgoXG4gICAgICAoc2VhdFJlc2VydmF0aW9uKSA9PlxuICAgICAgICBzZWF0UmVzZXJ2YXRpb24uY29hY2hJdGVtc1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdLnBsYWNlcyAhPT0gdW5kZWZpbmVkLFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ID49IG5leHRBdmFpbGFibGVEZWNrQ29hY2hJbmRleFxuICAgICAgPyB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleFxuICAgICAgOiBuZXh0QXZhaWxhYmxlRGVja0NvYWNoSW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogSWYgYSBzZWxlY3RlZCBwbGFjZSBpcyBzbGlnaHRseSBoaWRkZW4gYnkgdGhlIG92ZXJmbG93IHNjcm9sbCBjb250ZW50IGFuZCBpcyBzdGlsbCBjbGlja2VkLFxuICAgKiB0aGUgbWV0aG9kIHRyaWVzIHRvIHNjcm9sbCB0aGUgc2VsZWN0ZWQgcGxhY2UgaW50byB0aGUgbmVhcmVzdCB2aWV3cG9ydCwgc28gdGhhdCBpdCBpcyBjb21wbGV0ZWx5IHZpc2libGUuXG4gICAqXG4gICAqIEBwYXJhbSBwbGFjZUlkXG4gICAqL1xuICBwcml2YXRlIF9zY3JvbGxQbGFjZUludG9OZWFyZXN0Vmlld3BvcnQocGxhY2VJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zaGFkb3dSb290XG4gICAgICA/LmdldEVsZW1lbnRCeUlkKHBsYWNlSWQpXG4gICAgICA/LnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ25lYXJlc3QnLCBpbmxpbmU6ICduZWFyZXN0JyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBjaGVja3MgaWYgYW55IHBsYWNlcyBvciBncmFwaGljYWwgZWxlbWVudHMgKGUuZy4gdG9pbGV0IGFyZWEsIGV0Yy4pIGFyZSBvdmVyaGFuZ2luZyB0aGUgY29hY2ggYm9yZGVyc1xuICAgKiBAcGFyYW0gY29hY2hJdGVtV2lkdGhcbiAgICogQHBhcmFtIGVsZW1lbnRzXG4gICAqL1xuICBwcml2YXRlIF9pc092ZXJoYW5naW5nRWxlbWVudHNQcmVzZW50KFxuICAgIGNvYWNoSXRlbVdpZHRoOiBudW1iZXIsXG4gICAgZWxlbWVudHM6IChQbGFjZSB8IEJhc2VFbGVtZW50KVtdIHwgdW5kZWZpbmVkLFxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgZWxlbWVudHM/LnNvbWUoXG4gICAgICAgIChlbGVtZW50KSA9PlxuICAgICAgICAgIGVsZW1lbnQucG9zaXRpb24ueCA9PT0gMCB8fCBlbGVtZW50LnBvc2l0aW9uLnggKyBlbGVtZW50LmRpbWVuc2lvbi53ID49IGNvYWNoSXRlbVdpZHRoLFxuICAgICAgKSA/PyBmYWxzZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogY29sbGVjdCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZHJpdmVyQXJlYXMgZm9yIG9uZSBjb2FjaFxuICAgKiBAcGFyYW0gY29hY2hJdGVtXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIF9pc0xvY29tb3RpdmUoY29hY2hJdGVtOiBDb2FjaEl0ZW0pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgY29hY2hJdGVtPy5ncmFwaGljRWxlbWVudHM/LmZpbmQoXG4gICAgICAgIChlbGVtZW50OiBCYXNlRWxlbWVudCkgPT4gZWxlbWVudC5pY29uID09PSAnRFJJVkVSX0FSRUFfTk9fVkVSVElDQUxfV0FMTCcsXG4gICAgICApICE9PSB1bmRlZmluZWRcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIElzIGNhbGxlZCB3aGVuIHRoZSBTZWF0UmVzZXJ2YXRpb24gbG9zZXMgZm9jdXMsIHdoYXQgaGFwcGVucyB3aGVuIHRoZSB1c2VyIHRhYnMgb3V0IG9yIGNsaWNrcyBzb21ld2hlcmUgZWxzZS5cbiAgICogVGhlbiB3ZSByZXNldCB0aGUgZm9jdXNlZCBlbGVtZW50cy5cbiAgICovXG4gIHByaXZhdGUgX29uTGVhdmVTZWF0UmVzZXJ2YXRpb25Db21wb25lbnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGFzTmF2aWdhdGlvbikge1xuICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgIH1cbiAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQStCQSxJQUFLO0NBQUwsU0FBSyxpQkFBZTtBQUNsQixpQkFBQSxXQUFBO0FBQ0EsaUJBQUEsVUFBQTtHQUZHLG9CQUFBLGtCQUFlLEVBQUEsRUFBQTtBQThCcEIsSUFBTSx5QkFBeUI7QUFDL0IsSUFBTSx3QkFBa0M7Q0FDdEM7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDRDtJQUVZLG9DQUEwQjttQkFBUzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2NBQW5DLG1DQUFtQyxZQUFVOzs7bUNBT3ZELFNBQVM7SUFBRSxXQUFXO0lBQXFCLE1BQU07SUFBTyxDQUFDLENBQUE7a0NBSXpELFNBQVM7SUFBRSxXQUFXO0lBQW9CLE1BQU07SUFBUSxDQUFDLENBQUE7Z0NBSXpELFdBQVcsRUFDWCxTQUFTO0lBQUUsV0FBVztJQUFrQixNQUFNO0lBQVMsQ0FBQyxDQUFBO2dDQUl4RCxXQUFXLEVBQ1gsU0FBUztJQUFFLFdBQVc7SUFBa0IsTUFBTTtJQUFTLFNBQVM7SUFBTSxZQUFZO0lBQU0sQ0FBQyxDQUFBOytCQUl6RixXQUFXLEVBQ1gsU0FBUztJQUFFLFdBQVc7SUFBa0IsTUFBTTtJQUFRLENBQUMsQ0FBQTt5QkFJdkQsV0FBVyxFQUNYLFNBQVM7SUFBRSxXQUFXO0lBQVUsTUFBTTtJQUFRLENBQUMsQ0FBQTtzQ0FJL0MsV0FBVyxFQUNYLFNBQVM7SUFBRSxXQUFXO0lBQXlCLE1BQU07SUFBUSxDQUFDLENBQUE7eUNBSTlELFdBQVcsRUFDWCxTQUFTO0lBQUUsV0FBVztJQUE0QixNQUFNO0lBQVEsQ0FBQyxDQUFBO29DQUlqRSxXQUFXLEVBQ1gs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