@huntsman-cancer-institute/cod 16.0.1 → 16.1.0

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.
@@ -770,7 +770,7 @@ export class AttributeService {
770
770
  //Shouldn't be a need to change dirty or notify attributes
771
771
  }
772
772
  saveGridRowAttributeValues(idGroupAttribute, groupAttributeRowId) {
773
- let rowValues = this.updatedAttributeValues.filter((av) => av.groupAttributeRowId === groupAttributeRowId);
773
+ let rowValues = this.updatedAttributeValues.filter((av) => av.groupAttributeRowId === groupAttributeRowId && av.idGroupAttribute === idGroupAttribute);
774
774
  for (let j = 0; j < rowValues.length; j++) {
775
775
  //set the idAttributeValueSet if necessary
776
776
  if (!rowValues[j].idAttributeValueSet) {
@@ -784,7 +784,7 @@ export class AttributeService {
784
784
  //For multi values that were sliced (de-selected) we're going to find them and null out the value, instead of removing.
785
785
  //That means they actaully need to be added to the rowValues
786
786
  //Removed multi values within an existing row
787
- let removedValues = this.slicedAttributeValues.filter((av) => av.groupAttributeRowId === groupAttributeRowId);
787
+ let removedValues = this.slicedAttributeValues.filter((av) => av.groupAttributeRowId === groupAttributeRowId && av.idGroupAttribute === idGroupAttribute);
788
788
  for (let i = 0; i < removedValues.length; i++) {
789
789
  removedValues[i].valueAttributeChoice = undefined;
790
790
  removedValues[i].valueIdDictionary = undefined;
@@ -812,8 +812,8 @@ export class AttributeService {
812
812
  avs.attributeValues.push(attributeValueGridRow.attributeValues[i]);
813
813
  }
814
814
  //Remove the updated and sliced values for the grid row, now (these are the old ones with the negative rowid)
815
- this.slicedAttributeValues = this.slicedAttributeValues.filter((av) => av.groupAttributeRowId !== groupAttributeRowId);
816
- this.updatedAttributeValues = this.updatedAttributeValues.filter((av) => av.groupAttributeRowId !== groupAttributeRowId);
815
+ this.slicedAttributeValues = this.slicedAttributeValues.filter((av) => (av.groupAttributeRowId !== groupAttributeRowId || av.idGroupAttribute !== idGroupAttribute));
816
+ this.updatedAttributeValues = this.updatedAttributeValues.filter((av) => (av.groupAttributeRowId !== groupAttributeRowId || av.idGroupAttribute !== idGroupAttribute));
817
817
  this.attributeValueSetSubject.next(avs);
818
818
  this.gridRowSaved.next(attributeValueGridRow);
819
819
  this.loadingSubject.next(false);
@@ -828,20 +828,20 @@ export class AttributeService {
828
828
  //Add the grid row to the original attribute values
829
829
  let avs = this.attributeValueSetSubject.getValue();
830
830
  //Remove all old values for row
831
- let index = avs.attributeValues.findIndex((av) => av.groupAttributeRowId === groupAttributeRowId);
831
+ let index = avs.attributeValues.findIndex((av) => (av.groupAttributeRowId === groupAttributeRowId && av.idGroupAttribute === idGroupAttribute));
832
832
  while (index > 0) {
833
833
  //Remove value
834
834
  avs.attributeValues.splice(index, 1);
835
835
  //Find the next one
836
- index = avs.attributeValues.findIndex((av) => av.groupAttributeRowId === groupAttributeRowId);
836
+ index = avs.attributeValues.findIndex((av) => (av.groupAttributeRowId === groupAttributeRowId && av.idGroupAttribute === idGroupAttribute));
837
837
  }
838
838
  //Add all the current values
839
839
  for (let i = 0; i < attributeValueGridRow.attributeValues.length; i++) {
840
840
  avs.attributeValues.push(attributeValueGridRow.attributeValues[i]);
841
841
  }
842
842
  //Remove the sliced and updated values for the grid row
843
- this.slicedAttributeValues = this.slicedAttributeValues.filter((av) => av.groupAttributeRowId !== groupAttributeRowId);
844
- this.updatedAttributeValues = this.updatedAttributeValues.filter((av) => av.groupAttributeRowId !== groupAttributeRowId);
843
+ this.slicedAttributeValues = this.slicedAttributeValues.filter((av) => (av.groupAttributeRowId !== groupAttributeRowId || av.idGroupAttribute !== idGroupAttribute));
844
+ this.updatedAttributeValues = this.updatedAttributeValues.filter((av) => (av.groupAttributeRowId !== groupAttributeRowId || av.idGroupAttribute !== idGroupAttribute));
845
845
  this.attributeValueSetSubject.next(avs);
846
846
  this.gridRowSaved.next(attributeValueGridRow);
847
847
  this.loadingSubject.next(false);
@@ -868,7 +868,8 @@ export class AttributeService {
868
868
  this.http.request('delete', url, { body: avgr, params: queryParams }).subscribe(() => {
869
869
  //Remove the grid row from the original attribute values
870
870
  let avs = this.attributeValueSetSubject.getValue();
871
- avs.attributeValues = avs.attributeValues.filter((av) => av.groupAttributeRowId !== groupAttributeRowId);
871
+ //Filter to only attributes to KEEP - (i.e. not the same grid or not the row being deleted)
872
+ avs.attributeValues = avs.attributeValues.filter((av) => (av.idGroupAttribute !== idGroupAttribute || av.groupAttributeRowId !== groupAttributeRowId));
872
873
  this.attributeValueSetSubject.next(avs);
873
874
  this.gridRowDeleted.next(avgr);
874
875
  this.loadingSubject.next(false);
@@ -1208,4 +1209,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
1208
1209
  type: Inject,
1209
1210
  args: [ATTRIBUTE_ENDPOINT]
1210
1211
  }] }]; } });
1211
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0cmlidXRlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb2Qvc3JjL3NlcnZpY2VzL2F0dHJpYnV0ZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDNUUsT0FBTyxFQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUM1RCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFdkMsT0FBTyxFQUFDLGVBQWUsRUFBRSxRQUFRLEVBQWMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRXBFLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLCtDQUErQyxDQUFDO0FBV2hGLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNqRCxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQzs7Ozs7QUFHckUsTUFBTSxDQUFDLElBQUksa0JBQWtCLEdBQUcsSUFBSSxjQUFjLENBQVMsbUJBQW1CLENBQUMsQ0FBQztBQUNoRixNQUFNLENBQUMsTUFBTSxPQUFPLEdBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDNUMsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBRTFEOzs7R0FHRztBQUVILE1BQU0sT0FBTyxnQkFBZ0I7SUE4QzNCLFlBQW9CLGlCQUFvQyxFQUNwQyxJQUFnQixFQUNoQixNQUFjLEVBQ2MsaUJBQXlCO1FBSHJELHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNoQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2Msc0JB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O0lBQ1IsQ0FBQztJQUVELGlDQUFpQztRQUMvQixPQUFPLElBQUksQ0FBQyw4QkFBOEIsQ0FBQztJQUM3QyxDQUFDO0lBRUQsYUFBYSxDQUFDLG9CQUE0QixFQUFFLDRCQUFvQztRQUM5RSxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRTtZQUM3RCxPQUFPLElBQUksQ0FBQyxvQkFBb0IsS0FBSyxvQkFBb0IsSUFBSSxJQUFJLENBQUMsNEJBQTRCLEtBQUssNEJBQTRCLENBQUM7UUFDbEksQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsYUFBYSxDQUFDLG9CQUE0QixFQUFFLDRCQUFvQyxFQUFFLFNBQWlCO1FBQ2pHLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFO1lBQzdELE9BQU8sSUFBSSxDQUFDLG9CQUFvQixLQUFLLG9CQUFvQjttQkFDcEQsSUFBSSxDQUFDLDRCQUE0QixLQUFLLDRCQUE0QjttQkFDbEUsSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUM7UUFDcEMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFdBQVc7UUFDVCxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN6QixDQUFDOytHQWw1Q1UsZ0JBQWdCLG1HQWlEUCxrQkFBa0I7bUhBakQzQixnQkFBZ0I7OzRGQUFoQixnQkFBZ0I7a0JBRDVCLFVBQVU7OzBCQWtESSxNQUFNOzJCQUFDLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbiwgaXNEZXZNb2RlfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge0h0dHBDbGllbnQsIEh0dHBQYXJhbXN9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xyXG5pbXBvcnQge1JvdXRlcn0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xyXG5cclxuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIGZvcmtKb2luLCBPYnNlcnZhYmxlLCBTdWJqZWN0fSBmcm9tIFwicnhqc1wiO1xyXG5cclxuaW1wb3J0IHtEaWN0aW9uYXJ5U2VydmljZX0gZnJvbSBcIkBodW50c21hbi1jYW5jZXItaW5zdGl0dXRlL2RpY3Rpb25hcnktc2VydmljZVwiO1xyXG5cclxuaW1wb3J0IHtBdHRyaWJ1dGV9IGZyb20gXCIuLi9tb2RlbC9hdHRyaWJ1dGUuZW50aXR5XCI7XHJcbmltcG9ydCB7QXR0cmlidXRlQ2hvaWNlfSBmcm9tIFwiLi4vbW9kZWwvYXR0cmlidXRlLWNob2ljZS5lbnRpdHlcIjtcclxuaW1wb3J0IHtBdHRyaWJ1dGVWYWx1ZX0gZnJvbSBcIi4uL21vZGVsL2F0dHJpYnV0ZS12YWx1ZS5lbnRpdHlcIjtcclxuaW1wb3J0IHtBdHRyaWJ1dGVDb25maWd1cmF0aW9ufSBmcm9tIFwiLi4vbW9kZWwvYXR0cmlidXRlLWNvbmZpZ3VyYXRpb24uZW50aXR5XCI7XHJcbmltcG9ydCB7QXR0cmlidXRlVmFsdWVTZXR9IGZyb20gXCIuLi9tb2RlbC9hdHRyaWJ1dGUtdmFsdWUtc2V0LmVudGl0eVwiO1xyXG5pbXBvcnQge0F0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE99IGZyb20gXCIuLi9tb2RlbC9hdHRyaWJ1dGUtY29uZmlndXJhdGlvbi5kdG9cIjtcclxuaW1wb3J0IHtHcmFwaGljYWxBdHRyaWJ1dGV9IGZyb20gXCIuLi9tb2RlbC9ncmFwaGljYWwtYXR0cmlidXRlLmVudGl0eVwiO1xyXG5pbXBvcnQge0F0dHJpYnV0ZUNvbnRhaW5lcn0gZnJvbSBcIi4uL21vZGVsL2F0dHJpYnV0ZS1jb250YWluZXIuZW50aXR5XCI7XHJcbmltcG9ydCB7QXR0cmlidXRlVmFsdWVHcmlkUm93fSBmcm9tIFwiLi4vbW9kZWwvYXR0cmlidXRlLXZhbHVlLWdyaWQtcm93LmVudGl0eVwiO1xyXG5pbXBvcnQge1ByZUV2YWxEVE99IGZyb20gXCIuLi9tb2RlbC9wcmUtZXZhbC5kdG9cIjtcclxuaW1wb3J0IHtEaWN0aW9uYXJ5RW50cmllc0RUT30gZnJvbSBcIi4uL21vZGVsL2RpY3Rpb25hcnktZW50cmllcy5kdG9cIjtcclxuXHJcblxyXG5leHBvcnQgbGV0IEFUVFJJQlVURV9FTkRQT0lOVCA9IG5ldyBJbmplY3Rpb25Ub2tlbjxzdHJpbmc+KFwiYXR0cmlidXRlRW5kcG9pbnRcIik7XHJcbmV4cG9ydCBjb25zdCBCT09MRUFOOiBzdHJpbmdbXSA9IFtcIk5cIiwgXCJZXCJdO1xyXG5leHBvcnQgY29uc3QgRVhURU5ERURfQk9PTEVBTjogc3RyaW5nW10gPSBbXCJOXCIsIFwiWVwiLCBcIlVcIl07XHJcblxyXG4vKipcclxuICogQSBzZXJ2aWNlIGNyZWF0ZWQgZm9yIGVhY2ggYXR0cmlidXRlIGNvbmZpZ3VyYXRpb24gaW5zdGFuY2UuICBUaGlzIG1ha2VzIGNhbGxzIHRvIHRoZSBiYWNrZW5kIHRvIGdldCB0aGUgY29uZmlndXJhdGlvblxyXG4gKiBhbmQgdmFsdWUgc2V0LiAgSXQgYWxzbyBzdG9yZXMgY29tbW9uIGRhdGEgdGhhdCBkaWZmZXJlbnQgYXR0cmlidXRlcyBtaWdodCBuZWVkIChlLmcuIGEgbGlzdCBvZiBhdHRyaWJ1dGUgY2hvaWNlcykuXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBBdHRyaWJ1dGVTZXJ2aWNlIHtcclxuXHJcbiAgbmV3QXR0cmlidXRlQ29uZmlndXJhdGlvbjogQXR0cmlidXRlQ29uZmlndXJhdGlvbjtcclxuICBpZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb246IG51bWJlcjtcclxuICBpZEZpbHRlcjE6IG51bWJlcjtcclxuICBpZEZpbHRlcjI6IG51bWJlcjtcclxuICBpZEF0dHJpYnV0ZVZhbHVlU2V0OiBudW1iZXI7XHJcbiAgaWRQYXJlbnRPYmplY3Q6IG51bWJlcjtcclxuICBib3VuZERhdGE6IGFueTtcclxuXHJcbiAgYXR0cmlidXRlQ29udGV4dExvYWRpbmdTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuXHJcbiAgYXR0cmlidXRlQ29udGV4dExpc3RTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8YW55W10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4odW5kZWZpbmVkKTtcclxuICBhdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRMaXN0U3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PGFueVtdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KHVuZGVmaW5lZCk7XHJcbiAgZmlsdGVyMUxpc3RTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8YW55W10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4odW5kZWZpbmVkKTtcclxuICBmaWx0ZXIyTGlzdFN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPih1bmRlZmluZWQpO1xyXG4gIGRpY3Rpb25hcnlMaXN0U3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PGFueVtdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KHVuZGVmaW5lZCk7XHJcblxyXG5cclxuICBwb3N0Q29uZmlndXJhdGlvblN1YmplY3Q6IFN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG4gIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EaW1lbnNpb25TdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8YW55PiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55Pih1bmRlZmluZWQpO1xyXG5cclxuICBhdHRyaWJ1dGVDb25maWd1cmF0aW9uTGlzdFN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxBdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPW10+KHVuZGVmaW5lZCk7XHJcbiAgYXR0cmlidXRlQ29uZmlndXJhdGlvbkxpc3RMb2FkaW5nU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcblxyXG4gIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE9TdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8QXR0cmlidXRlQ29uZmlndXJhdGlvbkRUTz4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE8+KHVuZGVmaW5lZCk7XHJcblxyXG4gIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8QXR0cmlidXRlQ29uZmlndXJhdGlvbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24+KHVuZGVmaW5lZCk7XHJcbiAgYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8QXR0cmlidXRlVmFsdWVTZXQ+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBdHRyaWJ1dGVWYWx1ZVNldD4odW5kZWZpbmVkKTtcclxuICBhdHRyaWJ1dGVWYWx1ZVB1c2hlZFN1YmplY3Q6IFN1YmplY3Q8QXR0cmlidXRlVmFsdWU+ID0gbmV3IFN1YmplY3Q8QXR0cmlidXRlVmFsdWU+KCk7XHJcblxyXG4gIGxvYWRpbmdTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuXHJcbiAgYXR0cmlidXRlTWFwOiBNYXA8bnVtYmVyLCBBdHRyaWJ1dGU+ID0gbmV3IE1hcDxudW1iZXIsIEF0dHJpYnV0ZT4oKTtcclxuXHJcbiAgd2lkdGg6IG51bWJlcjtcclxuXHJcbiAgY29udGFpbmVyVXBkYXRlZDogU3ViamVjdDxib29sZWFuPiA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XHJcbiAgZ3JpZFJvd1NhdmVkOiBTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlR3JpZFJvdz4gPSBuZXcgU3ViamVjdDxBdHRyaWJ1dGVWYWx1ZUdyaWRSb3c+KCk7XHJcbiAgZ3JpZFJvd0RlbGV0ZWQ6IFN1YmplY3Q8QXR0cmlidXRlVmFsdWVHcmlkUm93PiA9IG5ldyBTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlR3JpZFJvdz4oKTtcclxuICBkaXJ0eTogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcbiAgdXBkYXRlZEF0dHJpYnV0ZVZhbHVlczogQXR0cmlidXRlVmFsdWVbXSA9IFtdO1xyXG4gIHNsaWNlZEF0dHJpYnV0ZVZhbHVlczogQXR0cmlidXRlVmFsdWVbXSA9IFtdO1xyXG5cclxuICBwcml2YXRlIHVuaXF1ZUlkOiBudW1iZXIgPSAwO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRpY3Rpb25hcnlTZXJ2aWNlOiBEaWN0aW9uYXJ5U2VydmljZSxcclxuICAgICAgICAgICAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgICAgICAgICAgICBASW5qZWN0KEFUVFJJQlVURV9FTkRQT0lOVCkgcHJpdmF0ZSBhdHRyaWJ1dGVFbmRwb2ludDogc3RyaW5nKSB7XHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhcIkNyZWF0ZWQgTmV3IEF0dHJpYnV0ZVNlcnZpY2VcIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRCb3VuZERhdGEoYm91bmREYXRhOiBhbnkpIHtcclxuICAgIHRoaXMuYm91bmREYXRhID0gYm91bmREYXRhO1xyXG5cclxuICAgIGlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5nZXRWYWx1ZSgpKSB7XHJcbiAgICAgIHRoaXMubm90aWZ5QXR0cmlidXRlcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0QXR0cmlidXRlVmFsdWVDb3VudEJ5QXR0cmlidXRlKGlkQXR0cmlidXRlOiBudW1iZXIpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8bnVtYmVyPih0aGlzLmF0dHJpYnV0ZUVuZHBvaW50ICsgXCJhdHRyaWJ1dGUtdmFsdWUtY291bnRcIiwge3BhcmFtczogbmV3IEh0dHBQYXJhbXMoKS5zZXQoXCJpZEF0dHJpYnV0ZVwiLCBpZEF0dHJpYnV0ZS50b1N0cmluZygpKX0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0QXR0cmlidXRlVmFsdWVDb3VudEJ5Q29udGFpbmVyKGlkQXR0cmlidXRlQ29udGFpbmVyOiBudW1iZXIpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8bnVtYmVyPih0aGlzLmF0dHJpYnV0ZUVuZHBvaW50ICsgXCJhdHRyaWJ1dGUtdmFsdWUtY291bnRcIiwge3BhcmFtczogbmV3IEh0dHBQYXJhbXMoKS5zZXQoXCJpZEF0dHJpYnV0ZUNvbnRhaW5lclwiLCBpZEF0dHJpYnV0ZUNvbnRhaW5lci50b1N0cmluZygpKX0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGljdGlvbmFyeVZhbHVlQ291bnQoaWRBdHRyaWJ1dGVEaWN0aW9uYXJ5OiBudW1iZXIpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8bnVtYmVyPih0aGlzLmF0dHJpYnV0ZUVuZHBvaW50ICsgXCJhdHRyaWJ1dGUtZGljdGlvbmFyeS1jb3VudFwiLCB7cGFyYW1zOiBuZXcgSHR0cFBhcmFtcygpLnNldChcImlkQXR0cmlidXRlRGljdGlvbmFyeVwiLCBpZEF0dHJpYnV0ZURpY3Rpb25hcnkudG9TdHJpbmcoKSl9KTtcclxuICB9XHJcblxyXG4gIGZldGNoQXR0cmlidXRlQ29udGV4dCgpOiB2b2lkIHtcclxuICAgIHRoaXMuYXR0cmlidXRlQ29udGV4dExvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XHJcblxyXG4gICAgZm9ya0pvaW4oW1xyXG4gICAgICB0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlLmdldERpY3Rpb25hcnlFbnRyaWVzKFwiaGNpLnJpLmF0dHIubW9kZWwuQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0XCIpLFxyXG4gICAgICB0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlLmdldERpY3Rpb25hcnlFbnRyaWVzKFwiaGNpLnJpLmF0dHIubW9kZWwuQXR0cmlidXRlQ29udGV4dFwiKSxcclxuICAgICAgdGhpcy5kaWN0aW9uYXJ5U2VydmljZS5nZXREaWN0aW9uYXJ5RW50cmllcyhcImhjaS5yaS5hdHRyLm1vZGVsLkZpbHRlcjFcIiksXHJcbiAgICAgIHRoaXMuZGljdGlvbmFyeVNlcnZpY2UuZ2V0RGljdGlvbmFyeUVudHJpZXMoXCJoY2kucmkuYXR0ci5tb2RlbC5GaWx0ZXIyXCIpLFxyXG4gICAgICB0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlLmdldERpY3Rpb25hcnlFbnRyaWVzKFwiaGNpLnJpLmF0dHIubW9kZWwuQXR0cmlidXRlRGljdGlvbmFyeVwiKVxyXG4gICAgXSkuc3Vic2NyaWJlKChyZXNwb25zZXM6IGFueVtdKSA9PiB7XHJcblxyXG4gICAgICB0aGlzLmRpY3Rpb25hcnlMaXN0U3ViamVjdC5uZXh0KHJlc3BvbnNlc1s0XSk7XHJcbiAgICAgIHRoaXMuZmlsdGVyMUxpc3RTdWJqZWN0Lm5leHQocmVzcG9uc2VzWzJdKTtcclxuICAgICAgdGhpcy5maWx0ZXIyTGlzdFN1YmplY3QubmV4dChyZXNwb25zZXNbM10pO1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZUNvbnRleHRMaXN0U3ViamVjdC5uZXh0KHJlc3BvbnNlc1sxXSk7XHJcblxyXG4gICAgICByZXNwb25zZXNbMF0uc29ydCh0aGlzLnNvcnRBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRMaXN0KTtcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRMaXN0U3ViamVjdC5uZXh0KHJlc3BvbnNlc1swXSk7XHJcblxyXG4gICAgICB0aGlzLmF0dHJpYnV0ZUNvbnRleHRMb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy9HZXRzIHRoZSBkaWN0aW9uYXJ5IGVudHJpZXMgZnJvbSB0aGUgbWFwIChzbyB3ZSBkb24ndCBsb2FkIG92ZXIgYW5kIG92ZXIgYW5kIG92ZXIgZm9yIHRoZSBzYW1lIGRpY3Rpb25hcnkpXHJcbiAgZ2V0RGljdGlvbmFyeUVudHJpZXMoYXR0cmlidXRlOiBBdHRyaWJ1dGUsIHZhbHVlczogQXR0cmlidXRlVmFsdWVbXSwgZ3JvdXBBdHRyaWJ1dGVSb3dJZD86IG51bWJlciwgcmVmZXJlbmNlZEF0dHJpYnV0ZVZhbHVlPzogQXR0cmlidXRlVmFsdWUpOiBPYnNlcnZhYmxlPERpY3Rpb25hcnlFbnRyaWVzRFRPPiB7XHJcbiAgICBsZXQgYnMgPSBuZXcgU3ViamVjdDxEaWN0aW9uYXJ5RW50cmllc0RUTz4oKTtcclxuXHJcbiAgICAvL0hhbmRsZSBYUEFUSFxyXG4gICAgaWYgKGF0dHJpYnV0ZS5hdHRyaWJ1dGVEaWN0aW9uYXJ5LnhwYXRoKSB7XHJcbiAgICAgIGxldCBlbnRyaWVzRFRPID0gbmV3IERpY3Rpb25hcnlFbnRyaWVzRFRPKCk7XHJcbiAgICAgIGxldCB4cGF0aCA9IGF0dHJpYnV0ZS5hdHRyaWJ1dGVEaWN0aW9uYXJ5LnhwYXRoO1xyXG5cclxuICAgICAgLy9GaWx0ZXJlZCBieSBhbm90aGVyIGRpY3Rpb25hcnk/IFBhcnNlIHRvIGdldCBhcnJheSBvZiBhbGwgZGljdGlvbmFyeSBjbGFzcyBuYW1lcyBuZWVkZWRcclxuICAgICAgbGV0IGRpY3RDbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgICBsZXQgcG9zID0gMDtcclxuICAgICAgd2hpbGUgKHhwYXRoLmluZGV4T2YoXCIvRGljdGlvbmFyaWVzL0RpY3Rpb25hcnlcIiwgcG9zKSA+PSAwKSB7XHJcbiAgICAgICAgbGV0IHN0YXJ0ID0geHBhdGguaW5kZXhPZihcIi9EaWN0aW9uYXJpZXMvRGljdGlvbmFyeVwiLCBwb3MpO1xyXG4gICAgICAgIHN0YXJ0ID0geHBhdGguaW5kZXhPZihcIidcIiwgc3RhcnQpO1xyXG4gICAgICAgIGxldCBlbmQgPSB4cGF0aC5pbmRleE9mKFwiJ1wiLCBzdGFydCArIDEpO1xyXG4gICAgICAgIGRpY3RDbGFzc2VzLnB1c2goYXR0cmlidXRlLmF0dHJpYnV0ZURpY3Rpb25hcnkueHBhdGguc3Vic3RyaW5nKHN0YXJ0ICsgMSwgZW5kKSlcclxuICAgICAgICBwb3MgPSBlbmQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vUG90ZW50aWFsbHkgbG9hZCBtdWx0aXBsZSBkaWN0aW9uYXJpZXNcclxuICAgICAgbGV0IGZvcmtDYWxscyA9IFtdO1xyXG4gICAgICBmb3IgKGxldCBjbGFzc05hbWUgb2YgZGljdENsYXNzZXMpIHtcclxuICAgICAgICBmb3JrQ2FsbHMucHVzaCh0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlLmdldERpY3Rpb25hcnlFbnRyaWVzQXNYTUwoY2xhc3NOYW1lKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vRGVhbCB3aXRoIHRoZSByZXN1bHRzIHRvZ2V0aGVyXHJcbiAgICAgIGZvcmtKb2luKGZvcmtDYWxscykuc3Vic2NyaWJlKChyZXNwb25zZXM6IGFueVtdKSA9PiB7XHJcbiAgICAgICAgLy9XZSdyZSBvbmx5IGdvaW5nIHRvIGRvIHhwYXRoIG9uIHRoZSB4bWwgZm9yIHRoZSBmaXJzdCBkaWN0aW9uYXJ5XHJcbiAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xyXG4gICAgICAgIGxldCBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHJlc3BvbnNlc1swXSwgXCJhcHBsaWNhdGlvbi94bWxcIik7XHJcblxyXG4gICAgICAgIC8vSGF2ZSB0byBldmFsdWF0ZSBzdWItZXhwcmVzc2lvbi4gVGhpcyBkb2Vzbid0IGFjdHVhbGx5IHN1cHBvcnQgZXhwcmVzc2lvbnMgbGlrZSBbQHggPSAoL3hwYXRoLXN1Yi1leHByZXNzaW9uKV1cclxuICAgICAgICBsZXQgc2Vjb25kYXJ5WG1sID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIGlmIChyZXNwb25zZXMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgc2Vjb25kYXJ5WG1sID0gcmVzcG9uc2VzWzFdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9QcmUtZXZhbHVhdGUgYW5kIHNpbXBsaWZ5IFhQQVRIXHJcbiAgICAgICAgbGV0IGR0bzpQcmVFdmFsRFRPID0gdGhpcy5wcmVFdmFsdWF0ZVhwYXRoKGF0dHJpYnV0ZS5hdHRyaWJ1dGVEaWN0aW9uYXJ5LnhwYXRoLCBzZWNvbmRhcnlYbWwsIGdyb3VwQXR0cmlidXRlUm93SWQsIHJlZmVyZW5jZWRBdHRyaWJ1dGVWYWx1ZSk7XHJcblxyXG4gICAgICAgIC8vRXZhbHVhdGUgWFBBVEggZXhwcmVzc2lvblxyXG4gICAgICAgIGxldCBlbnRyaWVzID0gW107XHJcbiAgICAgICAgZW50cmllc0RUTy5lbnRyaWVzSW5jbHVkZVNlbGVjdGVkVmFsdWUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgbGV0IHhQYXRoUmVzdWx0ID0gZG9jdW1lbnQuZXZhbHVhdGUoZHRvLmV4cHJlc3Npb24sIGRvYywgbnVsbCwgWFBhdGhSZXN1bHQuQU5ZX1RZUEUsIG51bGwpO1xyXG5cclxuICAgICAgICAgIC8vSXRlcmF0ZSB4cGF0aCByZXN1bHRzIChub2RlcylcclxuICAgICAgICAgIHZhciBub2RlID0gbnVsbDtcclxuICAgICAgICAgIHdoaWxlKG5vZGUgPSB4UGF0aFJlc3VsdC5pdGVyYXRlTmV4dCgpKSB7XHJcblxyXG4gICAgICAgICAgICBsZXQgZW50cnkgPSB0aGlzLmdldEpzb25FbnRyeUZyb21Ob2RlKG5vZGUpO1xyXG4gICAgICAgICAgICBlbnRyaWVzLnB1c2goZW50cnkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1jYXRjaCAoZSkge1xyXG4gICAgICAgICAgLy8gTm8gbWF0Y2hpbmcgZW50cmllcyBoZXJlLlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9XaGF0IGFib3V0IGRpY3Rpb25hcnkgZW50cmllcyB3aGVyZSBpc0FjdGl2ZT0nTicsIGJ1dCB0aGUgaWQgd2FzIHVzZWQgaW4gYSBwcmV2aW91c2x5IHNhdmVkIHZhbHVlP1xyXG4gICAgICAgIC8vV2UgYWRkIHRoYXQgdmFsdWUgdG8gdGhlIGRyb3Bkb3duLCBpbiB0aGF0IGNhc2UsIHNvIGl0IGNhbiBiZSBzZWxlY3RlZFxyXG4gICAgICAgIC8vUmVmZXJlbmNlZEF0dHJpYnV0ZVZhbHVlIG9ubHkgZ2V0cyBwYXNzZWQgaW4gd2hlbiB0aGUgZmlsdGVyIGF0dHJpYnV0ZSBjaGFuZ2VzLiBJbiB0aGF0IHNjZW5hcmlvIHdlIGRvIG5vdCB3YW50IHRvIGFkZCB0aGUgb2xkIHZhbHVlIHRvIHRoZSBsaXN0XHJcbiAgICAgICAgaWYgKGF0dHJpYnV0ZS5pc011bHRpVmFsdWUgIT09IFwiWVwiKSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBhdiBvZiB2YWx1ZXMpIHtcclxuICAgICAgICAgICAgbGV0IHByZXNlbnQ6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmIChhdiAmJiAhIHJlZmVyZW5jZWRBdHRyaWJ1dGVWYWx1ZSkge1xyXG4gICAgICAgICAgICAgIGZvcih2YXIgaSA9IGVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgICAgIGlmIChlbnRyaWVzW2ldLnZhbHVlID09PSBhdi52YWx1ZUlkRGljdGlvbmFyeSkge1xyXG4gICAgICAgICAgICAgICAgICBwcmVzZW50ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgIC8vSWYgdGhlIGN1cnJlbnRseSBzYXZlZCB2YWx1ZSBpcyBub3QgaW4gdGhlIGxpc3QsIGFkZCBpdC5cclxuICAgICAgICAgICAgICBpZiAoISBwcmVzZW50KSB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBsZXQgeHBhdGggPSBcIi9EaWN0aW9uYXJpZXMvRGljdGlvbmFyeVtAY2xhc3NOYW1lPSdcIiArIGF0dHJpYnV0ZS5hdHRyaWJ1dGVEaWN0aW9uYXJ5LmNsYXNzTmFtZSArIFwiJ10vRGljdGlvbmFyeUVudHJ5W0B2YWx1ZT0nXCIgKyBhdi52YWx1ZUlkRGljdGlvbmFyeSArIFwiJ11cIjtcclxuICAgICAgICAgICAgICAgIC8vVGhlIGVudHJ5IHdhcyBwcm9iYWJseSBhbHJlYWR5IGxvYWRlZCwgYnV0IGV4Y2x1ZGVkIGJ5IHRoZSB4cGF0aC4gV2UgY2FuIHVzZSB0aGF0LlxyXG4gICAgICBcclxuICAgICAgICAgICAgICAgIGxldCBub2RlID0gZG9jdW1lbnQuZXZhbHVhdGUoeHBhdGgsIGRvYywgbnVsbCwgWFBhdGhSZXN1bHQuQU5ZX1VOT1JERVJFRF9OT0RFX1RZUEUsIG51bGwpLnNpbmdsZU5vZGVWYWx1ZTtcclxuICAgICAgICAgICAgICAgIGlmIChub2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgIGVudHJpZXMucHVzaCh0aGlzLmdldEpzb25FbnRyeUZyb21Ob2RlKG5vZGUpKTtcclxuICAgICAgICAgICAgICAgICAgZW50cmllc0RUTy5lbnRyaWVzSW5jbHVkZVNlbGVjdGVkVmFsdWUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIC8vU2V0IHRoZSBiZWhhdmlvciBzdWJqZWN0IHdpdGggdGhlIGZpbHRlcmVkIHZhbHVlcyBmb3IgdGhlIGRpY3Rpb25hcnlcclxuICAgICAgICBlbnRyaWVzRFRPLmVudHJpZXMgPSBlbnRyaWVzO1xyXG4gICAgICAgIGVudHJpZXNEVE8ucmVmZXJlbmNlZEF0dHJpYnV0ZSA9IGR0by5yZWZlcmVuY2VkQXR0cmlidXRlO1xyXG4gICAgICAgIGJzLm5leHQoZW50cmllc0RUTyk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuICAgIC8vTm9uLXhwYXRoXHJcbiAgICBlbHNlIHtcclxuICAgICAgLy9EaWN0aW9uYXlTZXJ2aWNlIGp1c3QgdXNlZCBodHRwIGdldCwgc28gc2hvdWxkIG5vdCBuZWVkIHRvIHVuc3Vic2NyaWJlLCBzaW5jZSBodHRwIGRvZXMgdGhhdFxyXG4gICAgICB0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlLmdldERpY3Rpb25hcnlEcm9wZG93bkVudHJpZXMoYXR0cmlidXRlLmF0dHJpYnV0ZURpY3Rpb25hcnkuY2xhc3NOYW1lKS5zdWJzY3JpYmUoKGVudHJpZXM6IGFueVtdKSA9PiB7XHJcbiAgICAgICAgLy9NYWtlIHZhbHVlIGZpZWxkc1xyXG4gICAgICAgIGZvcih2YXIgaSA9IGVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgIGVudHJpZXNbaV0udmFsdWUgPSBlbnRyaWVzW2ldLmlkLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgZW50cmllc0RUTyA9IG5ldyBEaWN0aW9uYXJ5RW50cmllc0RUTygpO1xyXG4gICAgICAgIGVudHJpZXNEVE8uZW50cmllcyA9IGVudHJpZXM7XHJcbiAgICAgICAgZW50cmllc0RUTy5lbnRyaWVzSW5jbHVkZVNlbGVjdGVkVmFsdWUgPSB0cnVlOyAvL0EgYml0IG9mIGFuIGFzc3VtcHRpb24sIGJ1dCBpZiBpdCBpc24ndCBmaWx0ZXJlZCwgaXQgaGFkIGJldHRlciBpbmNsdWRlIGFsbCB0aGUgdmFsdWVzIVxyXG4gICAgICAgIGJzLm5leHQoZW50cmllc0RUTyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBicztcclxuICB9XHJcblxyXG4gIGdldEpzb25FbnRyeUZyb21Ob2RlKG5vZGU6IGFueSk6IGFueSB7XHJcbiAgICAvL0NyZWF0ZSBKU09OIG9iamVjdHMgZnJvbSB0aGUgbm9kZXNcclxuICAgIGxldCBlbnRyeTogYW55ID0ge307XHJcbiAgICBmb3IodmFyIGkgPSBub2RlLmF0dHJpYnV0ZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgZW50cnlbbm9kZS5hdHRyaWJ1dGVzW2ldLm5hbWVdID0gbm9kZS5hdHRyaWJ1dGVzW2ldLnZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBlbnRyeTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcHJlRXZhbHVhdGVYcGF0aCh4cGF0aDogc3RyaW5nLCBzZWNvbmRhcnlYbWw6IHN0cmluZywgZ3JvdXBBdHRyaWJ1dGVSb3dJZDogbnVtYmVyLCByZWZlcmVuY2VkQXR0cmlidXRlVmFsdWU6IEF0dHJpYnV0ZVZhbHVlKTogUHJlRXZhbERUTyB7XHJcbiAgICBsZXQgZHRvOlByZUV2YWxEVE8gPSBuZXcgUHJlRXZhbERUTygpO1xyXG5cclxuICAgIC8vU2VjdXJpdHlBZHZpc29yL0Bjb2RlQ2FuY2VyR3JvdXBcclxuICAgIHdoaWxlICh4cGF0aC5pbmRleE9mKFwiL1NlY3VyaXR5QWR2aXNvci9AY29kZUNhbmNlckdyb3VwXCIpID49IDApIHtcclxuICAgICAgeHBhdGggPSB4cGF0aC5yZXBsYWNlKFwiL1NlY3VyaXR5QWR2aXNvci9AY29kZUNhbmNlckdyb3VwXCIsIFwiJ1wiICsgdGhpcy5nZXRBdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdCgpLnZhbHVlLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQgKyBcIidcIik7XHJcbiAgICB9XHJcblxyXG4gICAgLy9SZXBsYWNlIHNvbWUgb2YgdGhlIGNvbnRleHQgcGFyYW1ldGVycyAke3gudmFsdWV9IC0gVGhpcyBpcyBtb3JlIEFsdGlvIHNwZWNpZmljIHN0dWZmIHRoYXQgd2FzIHVzZWQgaW4gQ0NSXHJcbiAgICBsZXQgcGFyYW1Qb3MgPSB4cGF0aC5zZWFyY2goXCJcXFxcJHtbQS1aYS16MC05X10rXFxcXC52YWx1ZX1cIik7XHJcbiAgICB3aGlsZSAocGFyYW1Qb3MgPj0gMCkge1xyXG4gICAgICBsZXQgcHJlZml4ID0geHBhdGguc3Vic3RyaW5nKDAsIHBhcmFtUG9zKTtcclxuICAgICAgbGV0IHZhck5hbWUgPSB4cGF0aC5zdWJzdHJpbmcocGFyYW1Qb3MgKyAyLCB4cGF0aC5pbmRleE9mKFwiLlwiLCBwYXJhbVBvcykpO1xyXG4gICAgICBsZXQgc3VmZml4ID0geHBhdGguc3Vic3RyaW5nKHhwYXRoLmluZGV4T2YoXCJ9XCIsIHBhcmFtUG9zKSArIDEpO1xyXG5cclxuICAgICAgdmFyIGF2O1xyXG5cclxuICAgICAgLy9JZiB0aGVyZSBJUyBhIHJlZmVyZW5jZWRBdHRyaWJ1dGVWYWx1ZSwgd2UgY2FuIHVzZSB0aGUgdmFsdWUgZGlyZWN0bHkuIE90aGVyd2lzZSB3ZSB0cnkgdG8gZmluZCBpdCBpbiB0aGUgQVZTXHJcbiAgICAgIGlmICghIHJlZmVyZW5jZWRBdHRyaWJ1dGVWYWx1ZSkge1xyXG5cclxuICAgICAgICAvL0ZpbmQgdGhlIGF0dHJpYnV0ZSwgbWF0Y2hpbmcgdGhlIHZhck5hbWUuXHJcbiAgICAgICAgLy9EbyB0aGlzIGZpcnN0LCBzbyB3ZSBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIHJlbGF0ZWQgYXR0cmlidXRlLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlcmUgaXMgYWxyZWFkeSBhIHZhbHVlXHJcblxyXG4gICAgICAgIC8vSXRlcmF0ZSBhdHRyaWJ1dGVzIHRvIGZpbmQgb25lIHRoYXQgbWF0Y2hlcyB0aGUgdmFsdWVcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZU1hcC5mb3JFYWNoKChhdHRyaWJ1dGU6IEF0dHJpYnV0ZSkgPT4ge1xyXG4gICAgICAgICAgLy9BdHRyaWJ1dGVzIHRoYXQgbWF0Y2ggdGhlIG5hbWVcclxuICAgICAgICAgIGlmIChhdHRyaWJ1dGUuYXR0cmlidXRlTmFtZSA9PT0gdmFyTmFtZSkge1xyXG4gICAgICAgICAgICBkdG8ucmVmZXJlbmNlZEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vSWYgdGhpcyBpcyBhIGdyaWQsIGxvb2sgZm9yIGF0dHJpYnV0ZXMgaW4gdGhlIHJvd1xyXG4gICAgICAgICAgaWYgKGF0dHJpYnV0ZS5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGdyaWRDb2x1bW5BdHRyaWJ1dGUgIG9mIGF0dHJpYnV0ZS5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICAgICAgLy9JZiB0aGUgbmFtZSBtYXRjaGVzIEFORCB0aGUgdmFsdWUgaW4gdGhlIEFWUyB3YXMgcGFydCBvZiB0aGUgU0FNRSBST1cgd2UgYXJlIGV2YWx1YXRpbmcgWFBBVEggZm9yLCB3ZSBjYW4gdXNlIHRoZSB2YWx1ZSBmb3IgZXZhbHVhdGlvblxyXG4gICAgICAgICAgICAgIGlmIChncmlkQ29sdW1uQXR0cmlidXRlLmF0dHJpYnV0ZU5hbWUgPT09IHZhck5hbWUpIHtcclxuICAgICAgICAgICAgICAgIGR0by5yZWZlcmVuY2VkQXR0cmlidXRlID0gZ3JpZENvbHVtbkF0dHJpYnV0ZTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcblxyXG5cclxuICAgICAgICBsZXQgYXZzID0gdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QuZ2V0VmFsdWUoKTtcclxuICAgICAgICAvL0lmIHdlIGZvdW5kIHRoZSBhdHRyaWJ1dGUgYW5kIGhhdmUgdmFsdWVzLi4uXHJcbiAgICAgICAgaWYgKGR0by5yZWZlcmVuY2VkQXR0cmlidXRlICYmIGF2cykge1xyXG5cclxuICAgICAgICAgIC8vTG9vayB0aHJvdWdoIGFsbCB0aGUgdmFsdWVzIHRvIGZpbmQgdGhlIG9uZSBmb3IgdGhlIHJlZmVyZW5jZWQgYXR0cmlidXRlIChhbmQgU0FNRSBncmlkIHJvdyBpZiBpbiBhIGdyaWQgcm93KVxyXG4gICAgICAgICAgYXYgPSBhdnMuYXR0cmlidXRlVmFsdWVzLmZpbmQoKGF2KSA9PiB7XHJcblxyXG4gICAgICAgICAgICAvL0lmIHRoaXMgaXMgYW4gQVYgZm9yIGEgZ3JpZCByb3csIGl0IG11c3QgYmUgZm9yIHRoZSBzYW1lIGdyaWQgcm93IHdlIGFyZSBsb29raW5nIGZvclxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGF2Lmdyb3VwQXR0cmlidXRlUm93SWQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBncm91cEF0dHJpYnV0ZVJvd0lkICE9PSAndW5kZWZpbmVkJyAmJiBhdi5ncm91cEF0dHJpYnV0ZVJvd0lkICE9PSBncm91cEF0dHJpYnV0ZVJvd0lkKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgLy9JZiB3ZSBsb29rZWQgdXAgdGhlIGF0dHJpYnV0ZSBtYXRjaGluZyB0aGUgdmFsdWUgYnkgaWQgQU5EIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgaXMgdGhlIG9uZSB3ZSBhciBsb29raW5nIGZvciBmcm9tIHRoZSBYUEFUSCwgd2UgY2FuIHVzZSBpdCBmb3IgZXZhbHVhdGlvblxyXG4gICAgICAgICAgICAgLy9Gb3VuZCBhbiBBdHRyaWJ1dGVWYWx1ZSB0aGF0IHRoZSBkaWN0aW9uYXJ5IGlzIGZpbHRlcmVkIGJ5XHJcbiAgICAgICAgICAgIGlmIChkdG8ucmVmZXJlbmNlZEF0dHJpYnV0ZS5pZEF0dHJpYnV0ZSA9PT0gYXYuaWRBdHRyaWJ1dGUpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvL1VzZSB0aGUgcmVmZXJlbmNlZEF0dHJpYnV0ZVZhbHVlIGlmIHByb3ZpZGVkICh0aGlzIGhhcHBlbnMgd2hlbiBhbHJlYWR5IGtub3duLCBkdXJpbmcgY2hhbmdlcyB0byB0aGUgcmVmZXJlbmNlZCBhdHRyaWJ1dGUpXHJcbiAgICAgIGlmIChyZWZlcmVuY2VkQXR0cmlidXRlVmFsdWUpIHtcclxuICAgICAgICB4cGF0aCA9IHByZWZpeCArIFwiJ1wiICsgcmVmZXJlbmNlZEF0dHJpYnV0ZVZhbHVlLnZhbHVlICsgXCInXCIgKyBzdWZmaXg7XHJcbiAgICAgIH1cclxuICAgICAgLy9Gb3VuZCB0aGUgQXR0cmlidXRlVmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUgdGhhdCB0aGUgZGljdGlvbmFyeSBpcyBmaWx0ZXJlZCBieVxyXG4gICAgICBlbHNlIGlmIChhdikge1xyXG4gICAgICAgIHhwYXRoID0gcHJlZml4ICsgXCInXCIgKyBhdi52YWx1ZSArIFwiJ1wiICsgc3VmZml4O1xyXG4gICAgICB9XHJcbiAgICAgIC8vRGlkbid0IGZpbmQgYW4gYXR0cmlidXRlIGZvciB2YXJOYW1lXHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8vTWF5YmUgdGhlIHZhck5hbWUgaXMgZnJvbSBlbHNld2hlcmUgaW4gdGhlIGFwcCAobm9uLUNPRCksIGFuZCBwcm92aWRlZCBpbiBib3VuZERhdGFcclxuICAgICAgICBpZiAodGhpcy5ib3VuZERhdGEgJiYgdGhpcy5ib3VuZERhdGFbdmFyTmFtZV0pIHtcclxuICAgICAgICAgIHhwYXRoID0gcHJlZml4ICsgXCInXCIgKyB0aGlzLmJvdW5kRGF0YVt2YXJOYW1lXSArIFwiJ1wiICsgc3VmZml4O1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL05vdGhpbmcgbWF0Y2hlcy4gQ2hhbmdlIHRvIGVtcHR5IHN0cmluZy4gV2lsbCBwcm9iYWJseSByZXN1bHQgaW4gTk8gZW50cmllcywgd2hpY2ggd291bGQgYmUgY29ycmVjdC5cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHhwYXRoID0gcHJlZml4ICsgXCInJ1wiICsgc3VmZml4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgcGFyYW1Qb3MgPSB4cGF0aC5zZWFyY2goXCJcXFxcJHtbQS1aYS16MC05X10rXFxcXC52YWx1ZX1cIik7XHJcbiAgICB9XHJcblxyXG4gICAgLy9IYXZlIHRvIGV2YWx1YXRlIHN1Yi1leHByZXNzaW9uLiBUaGlzIGhhbmRsZXMgZXhwcmVzc2lvbnMgbGlrZSBbQHggPSAoL3hwYXRoLXN1Yi1leHByZXNzaW9uKV1cclxuICAgIGxldCBpbkV4cHJlc3Npb25Qb3MgPSB4cGF0aC5zZWFyY2goXCJcXFxcW0BbQS1aYS16MC05X10rXFxcXHMqPVxcXFxzKlxcXFwoXCIpO1xyXG5cclxuICAgIGlmIChpbkV4cHJlc3Npb25Qb3MgPiAwICYmIHNlY29uZGFyeVhtbCkge1xyXG4gICAgICBsZXQgcHJlZml4ID0geHBhdGguc3Vic3RyaW5nKDAsIGluRXhwcmVzc2lvblBvcyArIDEpO1xyXG4gICAgICBsZXQgZXhwcmVzc2lvbkVuZCA9IHhwYXRoLmluZGV4T2YoXCIpXCIsIGluRXhwcmVzc2lvblBvcyk7XHJcbiAgICAgIGxldCB2YXJpYWJsZSA9IHhwYXRoLnN1YnN0cmluZyhpbkV4cHJlc3Npb25Qb3MgKyAxLCB4cGF0aC5pbmRleE9mKFwiPVwiLCBpbkV4cHJlc3Npb25Qb3MpKTtcclxuICAgICAgbGV0IHN1YkV4cHJlc3Npb24gPSB4cGF0aC5zdWJzdHJpbmcoeHBhdGguaW5kZXhPZihcIihcIiwgaW5FeHByZXNzaW9uUG9zKSArIDEsIGV4cHJlc3Npb25FbmQpO1xyXG4gICAgICBsZXQgc3VmZml4ID0geHBhdGguc3Vic3RyaW5nKGV4cHJlc3Npb25FbmQgKyAxKTtcclxuXHJcbiAgICAgIHhwYXRoID0gcHJlZml4O1xyXG5cclxuICAgICAgLy9FdmFsdWF0ZSBYUEFUSCBleHByZXNzaW9uXHJcbiAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcclxuICAgICAgbGV0IGRvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoc2Vjb25kYXJ5WG1sLCBcImFwcGxpY2F0aW9uL3htbFwiKTtcclxuICAgICAgbGV0IHhQYXRoUmVzdWx0ID0gZG9jdW1lbnQuZXZhbHVhdGUoc3ViRXhwcmVzc2lvbiwgZG9jLCBudWxsLCBYUGF0aFJlc3VsdC5BTllfVFlQRSwgbnVsbCk7XHJcblxyXG4gICAgICAvL0l0ZXJhdGUgeHBhdGggcmVzdWx0cyAobm9kZXMpXHJcbiAgICAgIHZhciBub2RlID0geFBhdGhSZXN1bHQuaXRlcmF0ZU5leHQoKTtcclxuXHJcbiAgICAgIHdoaWxlKG5vZGUpIHtcclxuICAgICAgICB4cGF0aCA9IHhwYXRoICsgdmFyaWFibGUgKyBcIj0nXCIgKyBub2RlLm5vZGVWYWx1ZSArIFwiJ1wiXHJcblxyXG4gICAgICAgIG5vZGUgPSB4UGF0aFJlc3VsdC5pdGVyYXRlTmV4dCgpO1xyXG5cclxuICAgICAgICBpZiAobm9kZSkge1xyXG4gICAgICAgICAgeHBhdGggPSB4cGF0aCArIFwiIG9yIFwiO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgeHBhdGggPSB4cGF0aCArIHN1ZmZpeDtcclxuICAgIH1cclxuXHJcbiAgICBkdG8uZXhwcmVzc2lvbiA9IHhwYXRoO1xyXG4gICAgcmV0dXJuIGR0bztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc29ydEF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dExpc3QoYTogYW55LCBiOiBhbnkpIHtcclxuICAgIHJldHVybiBhLmRlc2NyaXB0aW9uLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShiLmRlc2NyaXB0aW9uLnRvTG93ZXJDYXNlKCkpO1xyXG4gIH1cclxuXHJcbiAgZmV0Y2hBdHRyaWJ1dGVDb25maWd1cmF0aW9uTGlzdChjb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0Pzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhcImZldGNoQXR0cmlidXRlQ29uZmlndXJhdGlvbkxpc3Q6IFwiICsgY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uTGlzdExvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XHJcblxyXG4gICAgbGV0IHVybDogc3RyaW5nID0gdGhpcy5hdHRyaWJ1dGVFbmRwb2ludCArIFwiY29uZmlndXJhdGlvbnNcIjtcclxuICAgIGxldCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xyXG4gICAgaWYgKGNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldChcImNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRcIiwgY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5odHRwLmdldDxBdHRyaWJ1dGVDb25maWd1cmF0aW9uW10+KHVybCwge3BhcmFtczogcGFyYW1zfSkuc3Vic2NyaWJlKChjb25maWd1cmF0aW9uTGlzdDogQXR0cmlidXRlQ29uZmlndXJhdGlvbltdKSA9PiB7XHJcbiAgICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvbkxpc3RMb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuXHJcbiAgICAgIGxldCBkdG9zOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPW10gPSBbXTtcclxuICAgICAgZm9yIChsZXQgY2ZnIG9mIGNvbmZpZ3VyYXRpb25MaXN0KSB7XHJcbiAgICAgICAgbGV0IGR0bzogQXR0cmlidXRlQ29uZmlndXJhdGlvbkRUTyA9IHRoaXMuZ2V0QXR0cmlidXRlQ29uZmlndXJhdGlvbkRUTyhjZmcpO1xyXG4gICAgICAgIGlmIChkdG8pIHtcclxuICAgICAgICAgIGR0b3MucHVzaChkdG8pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgZHRvcy5zb3J0KHRoaXMuc29ydEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25MaXN0KTtcclxuXHJcbiAgICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvbkxpc3RTdWJqZWN0Lm5leHQoZHRvcyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc29ydEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25MaXN0KGE6IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE8sIGI6IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE8pIHtcclxuICAgIGNvbnN0IGRpc3BsYXlhID0gYS5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0RGlzcGxheVxyXG4gICAgICArIGEuZXh0ZW5zaW9uRGVzY3JpcHRpb25cclxuICAgICAgKyAoYS5maWx0ZXIxRGlzcGxheSB8fCBcIlwiKVxyXG4gICAgICArIChhLmZpbHRlcjJEaXNwbGF5IHx8IFwiXCIpO1xyXG5cclxuICAgIGNvbnN0IGRpc3BsYXliID0gYi5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0RGlzcGxheVxyXG4gICAgICArIGIuZXh0ZW5zaW9uRGVzY3JpcHRpb25cclxuICAgICAgKyAoYi5maWx0ZXIxRGlzcGxheSB8fCBcIlwiKVxyXG4gICAgICArIChiLmZpbHRlcjJEaXNwbGF5IHx8IFwiXCIpO1xyXG5cclxuICAgIHJldHVybiBkaXNwbGF5YS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoZGlzcGxheWIudG9Mb3dlckNhc2UoKSk7XHJcbiAgfVxyXG5cclxuICAvL1VzZWQgYnkgY29kLWVkaXRvclxyXG4gIGNsZWFyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLmlkRmlsdGVyMSA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuaWRGaWx0ZXIyID0gdW5kZWZpbmVkO1xyXG5cclxuICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvbkRUT1N1YmplY3QubmV4dCh1bmRlZmluZWQpO1xyXG4gICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVBdHRyaWJ1dGVDb25maWd1cmF0aW9uKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb246IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pOiB2b2lkIHtcclxuICAgIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uID0gdW5kZWZpbmVkO1xyXG5cclxuICAgIHRoaXMuaHR0cC5wb3N0PEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24+KHRoaXMuYXR0cmlidXRlRW5kcG9pbnQgKyBcImNvbmZpZ3VyYXRpb25zXCIsIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pLnN1YnNjcmliZSgoYXR0cmlidXRlQ29uZmlndXJhdGlvbjogQXR0cmlidXRlQ29uZmlndXJhdGlvbikgPT4ge1xyXG4gICAgICB0aGlzLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbiA9IGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uO1xyXG5cclxuICAgICAgdGhpcy5wb3N0Q29uZmlndXJhdGlvblN1YmplY3QubmV4dCh0cnVlKTtcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdC5uZXh0KGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pO1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKFwiL2VkaXRvci9hdHRyaWJ1dGUtY29uZmlndXJhdGlvbi9cIiArIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0QXR0cmlidXRlQ29uZmlndXJhdGlvbkJ5SWQoaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uOiBudW1iZXIsIGlkQXR0cmlidXRlVmFsdWVTZXQ6IG51bWJlciwgaWRQYXJlbnRPYmplY3Q6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKGlkQXR0cmlidXRlQ29uZmlndXJhdGlvbiAhPT0gLTEpIHtcclxuICAgICAgdGhpcy5uZXdBdHRyaWJ1dGVDb25maWd1cmF0aW9uID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT25seSBsb2FkIGlmIHRoZSBBdHRyaWJ1dGVDb25maWd1cmF0aW9uIGhhcyBjaGFuZ2VkXHJcbiAgICBpZiAodGhpcy5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gIT09IGlkQXR0cmlidXRlQ29uZmlndXJhdGlvbikge1xyXG4gICAgICAvL0NsZWFyIEFTQVBcclxuICAgICAgdGhpcy5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gPSBpZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb247XHJcbiAgICAgIHRoaXMuaWRBdHRyaWJ1dGVWYWx1ZVNldCA9IGlkQXR0cmlidXRlVmFsdWVTZXQ7XHJcbiAgICAgIHRoaXMuaWRGaWx0ZXIxID0gdW5kZWZpbmVkO1xyXG4gICAgICB0aGlzLmlkRmlsdGVyMiA9IHVuZGVmaW5lZDtcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVNYXAuY2xlYXIoKTtcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPU3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XHJcbiAgICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3QubmV4dCh1bmRlZmluZWQpO1xyXG5cclxuICAgICAgdGhpcy5mZXRjaEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24oaWRBdHRyaWJ1dGVWYWx1ZVNldCwgaWRQYXJlbnRPYmplY3QpO1xyXG4gICAgfVxyXG4gICAgLy9PciBsb2FkIHRoZSBBdHRyaWJ1dGVWYWx1ZVNldCBpZiB0aGF0IGNoYW5nZWQgKHBvc3NpYmxlIHRvIHN3aXRjaCBmcm9tIG9uZSBldmVudCB0byBhbm90aGVyIG9mIHRoZSBzYW1lIHR5cGUsIGZvciBleGFtcGxlXHJcbiAgICAvL1RoZSBBdHRyaWJ1dGVDb25maWd1cmF0aW9uIG11c3QgYWxzbyBoYXZlIGZpbmlzaGVkIGxvYWRpbmcgYW5kIG5vdCBhbHJlYWR5IHdvcmtpbmcgb24gbG9hZGluZyB0aGUgdmFsdWVzXHJcbiAgICBlbHNlIGlmICh0aGlzLmlkQXR0cmlidXRlVmFsdWVTZXQgIT09IGlkQXR0cmlidXRlVmFsdWVTZXQgJiYgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdC5nZXRWYWx1ZSgpKSB7XHJcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlVmFsdWVTZXQoaWRBdHRyaWJ1dGVWYWx1ZVNldCwgaWRQYXJlbnRPYmplY3QpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIHRoZSBhdHRyaWJ1dGUgY29uZmlndXJhdGlvbiBpZGVudGlmaWVycyB0byBiZSB1c2VkIGJ5IHRoaXMgc2VydmljZS4gIFRoaXMgcHJvbXB0cyBhIG5ldyBjb25maWd1cmF0aW9uXHJcbiAgICogcmVxdWVzdCB0byBiZSBtYWRlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkRmlsdGVyMVxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpZEZpbHRlcjJcclxuICAgKi9cclxuLyogVGhpcyBpcyBjb21tZW50ZWQgb3V0IGZvciBub3cgYmVjYXVzZSBpdCBpcyBib3RoIHVuaW1wbGVtZW50ZWQgYW5kIGluY29tcGxldGUgKGxvYWRpbmcgYSBjb25maWd1cmF0aW9uXHJcbiAqIGZpbHRlciB3b3VsZCByZWFsbHkgYWxzbyByZXF1aXJlIHRoZSBhdHRyaWJ1dGUgY29udGV4dCBhbmQgYXR0cmlidXRlc2VjdXJpdHkgY29udGV4dCBwbHVzIGEgc2VydmljZSBvblxyXG4gKiB0aGUgYmFjayBlbmQgdGhhdCBhY3R1YWxseSBkb2VzIHRoaXMgd29yay4gRm9yIG5vdywgb25seSBsb2FkaW5nIGJ5IGlkQXR0cmlidXRlQ29uZmlndXJhdGlvblxyXG4gKlxyXG4gIHNldEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25CeUZpbHRlcihpZEZpbHRlcjE6IG51bWJlciwgaWRGaWx0ZXIyPzogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhcInNldEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25CeUZpbHRlcjogXCIgKyBpZEZpbHRlcjEgKyBcIiBcIiArIGlkRmlsdGVyMik7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5uZXdBdHRyaWJ1dGVDb25maWd1cmF0aW9uID0gdW5kZWZpbmVkO1xyXG4gICAgLy90aGlzLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbiA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuaWRGaWx0ZXIxID0gaWRGaWx0ZXIxO1xyXG4gICAgdGhpcy5pZEZpbHRlcjIgPSBpZEZpbHRlcjI7XHJcblxyXG4gICAgdGhpcy5mZXRjaEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24oKTtcclxuICB9XHJcbiovXHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIGlkIG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUgc2V0LiAgVGhpcyB3aWxsIHByb21wdCBhIHJlcXVlc3QgdG8gcHVsbCB0aGlzIGZyb20gdGhlIGJhY2tlbmQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gaWRBdHRyaWJ1dGVWYWx1ZVNldFxyXG4gICAqL1xyXG4gIHNldEF0dHJpYnV0ZVZhbHVlU2V0KGlkQXR0cmlidXRlVmFsdWVTZXQ6IG51bWJlciwgaWRQYXJlbnRPYmplY3Q6IG51bWJlcikge1xyXG4gICAgLy9Pbmx5IGxvYWQgdGhlIEF0dHJpYnV0ZVZhbHVlU2V0IGlmIGl0IGhhcyBiZWVuIGNoYW5nZWRcclxuICAgIGlmICh0aGlzLmlkQXR0cmlidXRlVmFsdWVTZXQgIT09IGlkQXR0cmlidXRlVmFsdWVTZXQpIHtcclxuICAgICAgdGhpcy5pZEF0dHJpYnV0ZVZhbHVlU2V0ID0gaWRBdHRyaWJ1dGVWYWx1ZVNldDtcclxuXHJcbiAgICAgIHRoaXMuZmV0Y2hBdHRyaWJ1dGVWYWx1ZVNldChpZFBhcmVudE9iamVjdCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgcmVxdWVzdCB0byBkb3dubG9hZCB0aGUgYXR0cmlidXRlIGNvbmZpZ3VyYXRpb24uXHJcbiAgICovXHJcbiAgZmV0Y2hBdHRyaWJ1dGVDb25maWd1cmF0aW9uKGlkQXR0cmlidXRlVmFsdWVTZXQ6IG51bWJlciwgaWRQYXJlbnRPYmplY3Q6IG51bWJlcik6IHZvaWQge1xyXG5cclxuICAgIGlmICh0aGlzLm5ld0F0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pIHtcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPU3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XHJcbiAgICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3QubmV4dCh0aGlzLm5ld0F0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uID09PSAtMSkge1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE9TdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdC5uZXh0KDxBdHRyaWJ1dGVDb25maWd1cmF0aW9uPntcclxuICAgICAgICBpZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb246IC0yXHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KHRydWUpO1xyXG5cclxuICAgIGxldCB1cmw6IHN0cmluZztcclxuICAgIGlmICh0aGlzLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbiAmJiB0aGlzLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbiA+IC0xKSB7XHJcbiAgICAgIHVybCA9IHRoaXMuYXR0cmlidXRlRW5kcG9pbnQgKyBcImNvbmZpZ3VyYXRpb25zL1wiICsgdGhpcy5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb247XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvL1RoaXMgaXMgbm90IGZ1bGx5IGltcGxlbWVudGVkXHJcblx0ICAvL3VybCA9IHRoaXMuYXR0cmlidXRlRW5kcG9pbnQgKyBcImNvbmZpZ3VyYXRpb25zL2ZpbHRlci9cIiArIHRoaXMuaWRGaWx0ZXIxO1xyXG4gICAgICAvL2lmICh0aGlzLmlkRmlsdGVyMikge1xyXG4gICAgICAgIC8vdXJsICs9IFwiL1wiICsgdGhpcy5pZEZpbHRlcjI7XHJcbiAgICAgIC8vfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaHR0cC5nZXQ8QXR0cmlidXRlQ29uZmlndXJhdGlvbj4odXJsKS5zdWJzY3JpYmUoKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb246IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pID0+IHtcclxuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVDb25maWd1cmF0aW9uKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pO1xyXG4gICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG5cclxuICAgICAgLy9Ob3cgbG9hZCB0aGUgYXR0cmlidXRlVmFsdWVTZXQgLSBUaGlzIHdpbGwgYWx3YXlzIGhhcHBlbiB3aGVuIGEgbmV3IGNvbmZpZ3VyYXRpb24gaXMgbG9hZGVkXHJcbiAgICAgIHRoaXMuaWRBdHRyaWJ1dGVWYWx1ZVNldCA9IHVuZGVmaW5lZDsgLy9Gb3JjZSBpdCB0byBjaGFuZ2UgaW4gdGhpcyBzY2VuYXJpb1xyXG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZVZhbHVlU2V0KGlkQXR0cmlidXRlVmFsdWVTZXQsIGlkUGFyZW50T2JqZWN0KTtcclxuICAgICAgdGhpcy5kaXJ0eS5uZXh0KGZhbHNlKTtcclxuICAgIH0sXHJcbiAgICAoZXJyb3IpID0+IHtcclxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XHJcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlQ29uZmlndXJhdGlvbih1bmRlZmluZWQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZXRBdHRyaWJ1dGVDb25maWd1cmF0aW9uKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb246IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pOiB2b2lkIHtcclxuICAgIHRoaXMuYXR0cmlidXRlTWFwLmNsZWFyKCk7XHJcblxyXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJBdHRyaWJ1dGVTZXJ2aWNlLnNldEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25cIik7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoYXR0cmlidXRlQ29uZmlndXJhdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pIHtcclxuICAgICAgaWYgKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uYmFzZVdpbmRvd1RlbXBsYXRlKSB7XHJcbiAgICAgICAgdGhpcy5nZXRCYXNlV2luZG93RGltZW5zaW9uKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uYmFzZVdpbmRvd1RlbXBsYXRlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uYXR0cmlidXRlQ29udGFpbmVycykge1xyXG4gICAgICAgIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uYXR0cmlidXRlQ29udGFpbmVycy5zb3J0KChhOiBBdHRyaWJ1dGVDb250YWluZXIsIGI6IEF0dHJpYnV0ZUNvbnRhaW5lcikgPT4ge1xyXG4gICAgICAgICAgaWYgKGEuc29ydE9yZGVyIDwgYi5zb3J0T3JkZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChhLnNvcnRPcmRlciA+IGIuc29ydE9yZGVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAobGV0IGF0dHJpYnV0ZUNvbnRhaW5lciBvZiBhdHRyaWJ1dGVDb25maWd1cmF0aW9uLmF0dHJpYnV0ZUNvbnRhaW5lcnMpIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBGaXJzdCBzb3J0IGF0dHJpYnV0ZXMgdXNpbmcgdGhlIHkgYW5kIHggcG9zaXRpb25pbmcuICBJZiB1c2luZyBhYnNvbHV0ZSBwb3NpdGlvbiwgdGhlIG9yZGVyIGRvZXNuJ3QgbWF0dGVyLFxyXG4gICAgICAgICAqIGJ1dCBpZiB3ZSB3YW50IHRoZSBhYnNvbHV0ZSBwb3NpdGlvbmluZyB0byBndWlkZSBhdXRvIGxheW91dCwgdGhlbiB1c2UgdGhpcyBvcmRlci5cclxuICAgICAgICAgKi9cclxuICAgICAgICBhdHRyaWJ1dGVDb250YWluZXIuZ3JhcGhpY2FsQXR0cmlidXRlcy5zb3J0KChhOiBHcmFwaGljYWxBdHRyaWJ1dGUsIGI6IEdyYXBoaWNhbEF0dHJpYnV0ZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGEudGFiT3JkZXIgPCBiLnRhYk9yZGVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoYS50YWJPcmRlciA+IGIudGFiT3JkZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZUNvbnRhaW5lci5ncmFwaGljYWxBdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICB0aGlzLmF0dHJpYnV0ZU1hcC5zZXQoYXR0cmlidXRlLmlkQXR0cmlidXRlLCBhdHRyaWJ1dGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvbkRUT1N1YmplY3QubmV4dCh0aGlzLmdldEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE8oYXR0cmlidXRlQ29uZmlndXJhdGlvbikpO1xyXG4gICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdC5uZXh0KGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHJlcXVlc3QgdG8gcHVsbCB0aGUgYXR0cmlidXRlIHZhbHVlIHNldC5cclxuICAgKiBSZXF1aXJlZCB0aGUgQXR0cmlidXRlQ29uZmlndXJhdGlvbiB0byBiZSBwcmUtbG9hZGVkXHJcbiAgICovXHJcbiAgZmV0Y2hBdHRyaWJ1dGVWYWx1ZVNldChpZFBhcmVudE9iamVjdDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XHJcbiAgICB0aGlzLmlkUGFyZW50T2JqZWN0ID0gaWRQYXJlbnRPYmplY3Q7XHJcblxyXG4gICAgbGV0IHVybDogc3RyaW5nID0gdGhpcy5hdHRyaWJ1dGVFbmRwb2ludCArIFwiYXR0cmlidXRlLXZhbHVlLXNldC9cIiArIHRoaXMuaWRBdHRyaWJ1dGVWYWx1ZVNldDtcclxuXHJcbiAgICBsZXQgYWM6IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gPSB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0LmdldFZhbHVlKCk7XHJcblxyXG4gICAgbGV0IHF1ZXJ5UGFyYW1zOiBIdHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKVxyXG4gICAgLnNldChcImNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRcIiwgYWMuY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dClcclxuICAgIC5zZXQoXCJjb2RlQXR0cmlidXRlQ29udGV4dFwiLCBhYy5jb2RlQXR0cmlidXRlQ29udGV4dClcclxuICAgIC5zZXQoXCJpZFBhcmVudE9iamVjdFwiLCAoaWRQYXJlbnRPYmplY3QpP2lkUGFyZW50T2JqZWN0LnRvU3RyaW5nKCk6XCJcIik7XHJcblxyXG4gICAgLy9DbGVhciBBU0FQXHJcbiAgICB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcyA9IFtdO1xyXG4gICAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzID0gW107XHJcbiAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XHJcblxyXG4gICAgdGhpcy5odHRwLmdldDxBdHRyaWJ1dGVWYWx1ZVNldD4odXJsLCB7cGFyYW1zOiBxdWVyeVBhcmFtc30pLnN1YnNjcmliZSgoYXR0cmlidXRlVmFsdWVTZXQ6IEF0dHJpYnV0ZVZhbHVlU2V0KSA9PiB7XHJcbiAgICAgIC8vSW5pdGlhbGl6ZSBhdHRyaWJ1dGVWYWx1ZXMgaWYgaXQgZG9lcyBub3QgZXhpc3RcclxuICAgICAgaWYgKCEgYXR0cmlidXRlVmFsdWVTZXQuYXR0cmlidXRlVmFsdWVzKSB7XHJcbiAgICAgICAgYXR0cmlidXRlVmFsdWVTZXQuYXR0cmlidXRlVmFsdWVzID0gW107XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0Lm5leHQoYXR0cmlidXRlVmFsdWVTZXQpO1xyXG4gICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICB0aGlzLmRpcnR5Lm5leHQoZmFsc2UpO1xyXG4gICAgfSxcclxuICAgIChlcnJvcikgPT4ge1xyXG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QubmV4dCh1bmRlZmluZWQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXRCYXNlV2luZG93RGltZW5zaW9uKGJhc2VXaW5kb3dUZW1wbGF0ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmh0dHAuZ2V0KHRoaXMuYXR0cmlidXRlRW5kcG9pbnQgKyBcImJhc2Utd2luZG93LWRpbWVuc2lvblwiLCB7cGFyYW1zOiBuZXcgSHR0cFBhcmFtcygpLnNldChcImJhc2VXaW5kb3dUZW1wbGF0ZVwiLCBiYXNlV2luZG93VGVtcGxhdGUpfSlcclxuICAgICAgLnN1YnNjcmliZSgoZGltZW5zaW9uOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EaW1lbnNpb25TdWJqZWN0Lm5leHQoZGltZW5zaW9uKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDdXJyZW50bHkgYSBzaW1wbGUgbm90aWZpZXIgdGhhdCB0aGUgY29uZmlndXJhdGlvbiBvciBhdHRyaWJ1dGUgdmFsdWUgc2V0IGhhcyBjaGFuZ2VkIGFuZCBjb21wb25lbnRzIG1heSBuZWVkIHRvIGJlIHJlZnJlc2hlZC5cclxuICAgKlxyXG4gICAqL1xyXG4gIG5vdGlmeUF0dHJpYnV0ZXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbnRhaW5lclVwZGF0ZWQubmV4dCh0cnVlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBvc3QgdGhlIGF0dHJpYnV0ZSBjb25maWd1cmF0aW9uIGFmdGVyIGVkaXRpbmcuICBQb3N0IHRoZSBlbnRpcmUgdGhpbmcgYXMgaXQgY2FzY2FkZXMgZG93bi4gIFRoZSBlZGl0b3IgYWxsb3dzIHlvdVxyXG4gICAqIHRvIG1vZGlmeSBldmVyeSBjb250YWluZXIgYW5kIG9ubHkgdGhlbiBzYXZlIHRoZSBlbnRpcmUgY29uZmlndXJhdGlvbi5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlQ29uZmlndXJhdGlvbn0gYXR0cmlidXRlQ29uZmlndXJhdGlvblxyXG4gICAqL1xyXG4gIHBvc3RBdHRyaWJ1dGVDb25maWd1cmF0aW9uKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb246IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pOiB2b2lkIHtcclxuICAgIGxldCB1cmw6IHN0cmluZyA9IHRoaXMuYXR0cmlidXRlRW5kcG9pbnQgKyBcImNvbmZpZ3VyYXRpb25zL1wiICsgYXR0cmlidXRlQ29uZmlndXJhdGlvbi5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb247XHJcblxyXG4gICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KHRydWUpO1xyXG5cclxuICAgIHRoaXMuc2V0TmVnYXRpdmVJZHNUb1VuZGVmaW5lZChhdHRyaWJ1dGVDb25maWd1cmF0aW9uKTtcclxuXHJcbiAgICB0aGlzLmh0dHAucG9zdCh1cmwsIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pLnN1YnNjcmliZSgoKSA9PiB7XHJcblxyXG4gICAgICAvLyBQcmV2ZW50IGVycm9yIGluIHN1YnNlcXVlbnQgc2F2ZXMuIFNlZSBNZXRhYnVpbGRlciAvIE1CLTIzXHJcbiAgICAgIHRoaXMuaHR0cC5nZXQ8QXR0cmlidXRlQ29uZmlndXJhdGlvbj4odXJsKS5zdWJzY3JpYmUoKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb246IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pID0+IHtcclxuICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZGVidWcoYXR0cmlidXRlQ29uZmlndXJhdGlvbik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnBvc3RDb25maWd1cmF0aW9uU3ViamVjdC5uZXh0KHRydWUpO1xyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3QubmV4dChhdHRyaWJ1dGVDb25maWd1cmF0aW9uKTtcclxuICAgICAgfSxcclxuICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgIH0sXHJcbiAgICAgICgpID0+IHtcclxuICAgICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB9LFxyXG4gICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFB1dCB0aGUgYXR0cmlidXRlIHZhbHVlIHNldC4gIFdoZW4gZWRpdGluZywgYXR0cmlidXRlcyBhbHJlYWR5IHBvc3QgdGhlaXIgdXBkYXRlZCB2YWx1ZXMgdG8gdGhpcyBzZXJ2aWNlcyB1bmRlclxyXG4gICAqIGEgc2VwYXJhdGUgYXJyYXkuICBXaGF0IHdlIGRvIGlzIG1lcmdlIGluIHRoZXNlIHVwZGF0ZWQgb3IgY3JlYXRlZCB2YWx1ZXMgd2l0aCB0aGUgY3VycmVudCBhdHRyaWJ1dGUgdmFsdWUgc2V0IChhdnMpLlxyXG4gICAqIFdoaWxlIGRvaW5nIHRoaXMsIHNldCB0aGUgaWQgb2YgdGhlIGF2cyBhbmQgbnVsbGlmeSBhbnkgbmVnYXRpdmUgaWRzLlxyXG4gICAqL1xyXG4gIHVwZGF0ZUF0dHJpYnV0ZVZhbHVlU2V0KCk6IFN1YmplY3Q8QXR0cmlidXRlVmFsdWVTZXQ+IHtcclxuICAgIGxldCB1cmw6IHN0cmluZyA9IHRoaXMuYXR0cmlidXRlRW5kcG9pbnQgKyBcImF0dHJpYnV0ZS12YWx1ZS1zZXQvXCIgO1xyXG5cclxuICAgIGxldCBhYzogQXR0cmlidXRlQ29uZmlndXJhdGlvbiA9IHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3QuZ2V0VmFsdWUoKTtcclxuXHJcbiAgICBsZXQgcXVlcnlQYXJhbXM6IEh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpXHJcbiAgICAuc2V0KFwiY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dFwiLCBhYy5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0KVxyXG4gICAgLnNldChcImNvZGVBdHRyaWJ1dGVDb250ZXh0XCIsIGFjLmNvZGVBdHRyaWJ1dGVDb250ZXh0KVxyXG4gICAgLnNldChcImlkUGFyZW50T2JqZWN0XCIsICh0aGlzLmlkUGFyZW50T2JqZWN0KT90aGlzLmlkUGFyZW50T2JqZWN0LnRvU3RyaW5nKCk6XCJcIik7XHJcblxyXG4gICAgbGV0IGF2czogQXR0cmlidXRlVmFsdWVTZXQgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5nZXRWYWx1ZSgpKTtcclxuICAgIGZvciAobGV0IGkgPSB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2ldLmlkQXR0cmlidXRlVmFsdWVTZXQgPSB0aGlzLmlkQXR0cmlidXRlVmFsdWVTZXQ7XHJcbiAgICAgIGlmICh0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbaV0uaWRBdHRyaWJ1dGVWYWx1ZSA8IDApIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbaV0uaWRBdHRyaWJ1dGVWYWx1ZSA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGo6IG51bWJlciA9IDA7XHJcbiAgICAgIGZvciAoaiA9IDA7IGogPCBhdnMuYXR0cmlidXRlVmFsdWVzLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXS5pZEF0dHJpYnV0ZVZhbHVlID09PSBhdnMuYXR0cmlidXRlVmFsdWVzW2pdLmlkQXR0cmlidXRlVmFsdWUpIHtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoaiA8IGF2cy5hdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgYXZzLmF0dHJpYnV0ZVZhbHVlc1tqXSA9IHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXTtcclxuICAgICAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMuc3BsaWNlKGksIDEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBqOiBudW1iZXIgPSAwO1xyXG4gICAgICBmb3IgKGogPSAwOyBqIDwgYXZzLmF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgIGlmICh0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlc1tpXS5pZEF0dHJpYnV0ZVZhbHVlID09PSBhdnMuYXR0cmlidXRlVmFsdWVzW2pdLmlkQXR0cmlidXRlVmFsdWUpIHtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoaiA8IGF2cy5hdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgYXZzLmF0dHJpYnV0ZVZhbHVlcy5zcGxpY2UoaiwgMSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGF2cy5hdHRyaWJ1dGVWYWx1ZXMgPSBhdnMuYXR0cmlidXRlVmFsdWVzLmNvbmNhdCh0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMpO1xyXG5cclxuICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dCh0cnVlKTtcclxuXHJcbiAgICBsZXQgcmVzdWx0U3ViamVjdDogU3ViamVjdDxBdHRyaWJ1dGVWYWx1ZVNldD4gPSBuZXcgU3ViamVjdDxBdHRyaWJ1dGVWYWx1ZVNldD4oKTtcclxuXHJcbiAgICB0aGlzLmh0dHAucHV0KHVybCwgYXZzLCB7cGFyYW1zOiBxdWVyeVBhcmFtc30pLnN1YnNjcmliZSgoYXR0cmlidXRlVmFsdWVTZXQ6IEF0dHJpYnV0ZVZhbHVlU2V0KSA9PiB7XHJcbiAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmRlYnVnKGF0dHJpYnV0ZVZhbHVlU2V0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vSW5pdGlhbGl6ZSBhdHRyaWJ1dGVWYWx1ZXMgaWYgaXQgZG9lcyBub3QgZXhpc3RcclxuICAgICAgICBpZiAoISBhdHRyaWJ1dGVWYWx1ZVNldC5hdHRyaWJ1dGVWYWx1ZXMpIHtcclxuICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlU2V0LmF0dHJpYnV0ZVZhbHVlcyA9IFtdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMgPSBbXTtcclxuICAgICAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMgPSBbXTtcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5uZXh0KGF0dHJpYnV0ZVZhbHVlU2V0KTtcclxuICAgICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuZGlydHkubmV4dChmYWxzZSk7XHJcblxyXG4gICAgICAgIC8vU2VuZCB0aGUgcmVzdWx0cyB0byB0aGUgb2JzZXJ2ZXIgKGlmIGFueSksIHRoZW4gY29tcGxldGVcclxuICAgICAgICByZXN1bHRTdWJqZWN0Lm5leHQoYXR0cmlidXRlVmFsdWVTZXQpO1xyXG4gICAgICAgIHJlc3VsdFN1YmplY3QuY29tcGxldGUoKTtcclxuICAgICAgfSxcclxuICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgICAgICByZXN1bHRTdWJqZWN0LmVycm9yKGVycm9yKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdFN1YmplY3Q7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0LlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge0JlaGF2aW9yU3ViamVjdDxBdHRyaWJ1dGVDb25maWd1cmF0aW9uPn1cclxuICAgKi9cclxuICBnZXRBdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdCgpOiBCZWhhdmlvclN1YmplY3Q8QXR0cmlidXRlQ29uZmlndXJhdGlvbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3Q7XHJcbiAgfVxyXG5cclxuICBnZXREaXJ0eVN1YmplY3QoKTogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+IHtcclxuICAgIHJldHVybiB0aGlzLmRpcnR5O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBhdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3Q7XHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7QmVoYXZpb3JTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlU2V0Pn1cclxuICAgKi9cclxuICBnZXRBdHRyaWJ1dGVWYWx1ZVNldCgpOiBCZWhhdmlvclN1YmplY3Q8QXR0cmlidXRlVmFsdWVTZXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgYXR0cmlidXRlVmFsdWVQdXNoZWRTdWJqZWN0O1xyXG4gICAqXHJcbiAgICogQHJldHVybnMge1N1YmplY3Q8QXR0cmlidXRlVmFsdWU+fVxyXG4gICAqL1xyXG4gIGdldEF0dHJpYnV0ZVZhbHVlUHVzaGVkU3ViamVjdCgpOiBTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGVWYWx1ZVB1c2hlZFN1YmplY3Q7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgYWxsIGF0dHJpYnV0ZSB2YWx1ZXMgYmFzZWQgdXBvbiB0aGUgaWRBdHRyaWJ1dGUuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gaWRBdHRyaWJ1dGVzXHJcbiAgICogQHJldHVybnMge0F0dHJpYnV0ZVZhbHVlW119XHJcbiAgICovXHJcbiAgZ2V0QXR0cmlidXRlVmFsdWVzKGlkQXR0cmlidXRlOiBudW1iZXIsIGdyb3VwQXR0cmlidXRlUm93SWQ6IG51bWJlcik6IEF0dHJpYnV0ZVZhbHVlW10ge1xyXG5cclxuICAgIGxldCBhdHRyaWJ1dGVWYWx1ZXM6IEF0dHJpYnV0ZVZhbHVlW10gPSBbXTtcclxuXHJcbiAgICBpZih0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5nZXRWYWx1ZSgpKSB7XHJcblxyXG4gICAgICAvL0dvIHRocm91Z2ggYWxsIHRoZSB1cGRhdGVkIGF0dHJpYnV0ZSB2YWx1ZXMgZmlyc3QgKHNvIHdlIHByZXNlcnZlIGFjcm9zcyBjaGFuZ2luZyB0YWJzLCBldGMpXHJcbiAgICAgIGxldCBpOiBudW1iZXIgPSAwO1xyXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXS5pZEF0dHJpYnV0ZSA9PT0gaWRBdHRyaWJ1dGUgJiYgKCFncm91cEF0dHJpYnV0ZVJvd0lkIHx8IGdyb3VwQXR0cmlidXRlUm93SWQgPT09IHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXS5ncm91cEF0dHJpYnV0ZVJvd0lkKSkge1xyXG4gICAgICAgICAgYXR0cmlidXRlVmFsdWVzLnB1c2goT2JqZWN0LmFzc2lnbih7fSwgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2ldKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXS5pZEdyb3VwQXR0cmlidXRlID09PSBpZEF0dHJpYnV0ZSAmJiAoIWdyb3VwQXR0cmlidXRlUm93SWQgfHwgZ3JvdXBBdHRyaWJ1dGVSb3dJZCA9PT0gdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2ldLmdyb3VwQXR0cmlidXRlUm93SWQpKSB7XHJcbiAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZXMucHVzaChPYmplY3QuYXNzaWduKHt9LCB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbaV0pKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vR28gdGhyb3VnaCBhbGwgdGhlIHJlZ3VsYXIgYXR0cmlidXRlc1xyXG4gICAgICBmb3IgKGxldCBhdHRyaWJ1dGVWYWx1ZSBvZiB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5nZXRWYWx1ZSgpLmF0dHJpYnV0ZVZhbHVlcykge1xyXG4gICAgICAgIC8vUmVndWxhciBhdHRyaWJ1dGVzIChub3JtYWwgYW5kIGdyb3VwLCB3aGljaCBnZXQgbXVsdGlwbGUpXHJcbiAgICAgICAgaWYgKGF0dHJpYnV0ZVZhbHVlLmlkQXR0cmlidXRlID09PSBpZEF0dHJpYnV0ZSB8fCBhdHRyaWJ1dGVWYWx1ZS5pZEdyb3VwQXR0cmlidXRlID09PSBpZEF0dHJpYnV0ZSkge1xyXG4gICAgICAgICAgLy9JZiByb3cgaWQgc3BlY2lmaWVkLCBvbmx5IGNhcmUgYWJvdXQgdmFsdWVzIGZvciB0aGF0IHJvd1xyXG4gICAgICAgICAgaWYgKHR5cGVvZiBncm91cEF0dHJpYnV0ZVJvd0lkID09PSAndW5kZWZpbmVkJyB8fCBhdHRyaWJ1dGVWYWx1ZS5ncm91cEF0dHJpYnV0ZVJvd0lkID09PSBncm91cEF0dHJpYnV0ZVJvd0lkKSB7XHJcblxyXG4gICAgICAgICAgICAvL0lmIG5vdCBhbHJlYWR5IGFkZGVkLi4uXHJcbiAgICAgICAgICAgIGlmICghIGF0dHJpYnV0ZVZhbHVlcy5maW5kKChleGlzdGluZykgPT4gZXhpc3RpbmcuaWRBdHRyaWJ1dGVWYWx1ZSA9PT0gYXR0cmlidXRlVmFsdWUuaWRBdHRyaWJ1dGVWYWx1ZSkpIHtcclxuXHJcbiAgICAgICAgICAgICAgLy9Eb24ndCB3YW50IHRoZSBvcmlnaW5hbCBpZiBpdCB3YXMgcmVtb3ZlZCAoc2xpY2VkKVxyXG4gICAgICAgICAgICAgIGlmICghIHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzLmZpbmQoKHNhdikgPT4gc2F2LmlkQXR0cmlidXRlVmFsdWUgPT09IGF0dHJpYnV0ZVZhbHVlLmlkQXR0cmlidXRlVmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZXMucHVzaChPYmplY3QuYXNzaWduKHt9LCBhdHRyaWJ1dGVWYWx1ZSkpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgYWxsIGNoaWxkIGF0dHJpYnV0ZXMgb2YgdGhlIGlkQXR0cmlidXRlLiAgTW9zdCBsaWtlbHkgZm9yIGF0dHJpYnV0ZXMgdGhhdCBkZWZpbmUgY29sdW1ucyBvZiBhIGdyaWQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gaWRBdHRyaWJ1dGVcclxuICAgKiBAcmV0dXJucyB7QXR0cmlidXRlW119XHJcbiAgICovXHJcbiAgZ2V0R3JvdXBBdHRyaWJ1dGVzKGlkQXR0cmlidXRlOiBudW1iZXIpOiBBdHRyaWJ1dGVbXSB7XHJcbiAgICBsZXQgYXR0cmlidXRlczogQXR0cmlidXRlW10gPSBbXTtcclxuXHJcbiAgICB0aGlzLmF0dHJpYnV0ZU1hcC5mb3JFYWNoKChhdHRyaWJ1dGU6IEF0dHJpYnV0ZSkgPT4ge1xyXG4gICAgICBpZiAoYXR0cmlidXRlLmlkR3JvdXBBdHRyaWJ1dGUgPT09IGlkQXR0cmlidXRlKSB7XHJcbiAgICAgICAgYXR0cmlidXRlcy5wdXNoKGF0dHJpYnV0ZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBhdHRyaWJ1dGVzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoZSB3aWR0aCB3aGljaCBpcyBhIHJlcXVpcmVtZW50IG9mIHRoZSBhYnNvbHV0ZSBwb3NpdGlvbmluZy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aFxyXG4gICAqL1xyXG4gIHNldFdpZHRoKHdpZHRoOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMud2lkdGggPSB3aWR0aDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgd2lkdGguXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gICAqL1xyXG4gIGdldFdpZHRoKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy53aWR0aDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgYXJyYXkgb2YgYXR0cmlidXRlIGNob2ljZXMgZm9yIHRoZSBpZEF0dHJpYnV0ZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpZEF0dHJpYnV0ZVxyXG4gICAqIEByZXR1cm5zIHtBdHRyaWJ1dGVDaG9pY2VbXX1cclxuICAgKi9cclxuICBnZXRBdHRyaWJ1dGVDaG9pY2VzKGlkQXR0cmlidXRlOiBudW1iZXIpOiBBdHRyaWJ1dGVDaG9pY2VbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGVNYXAuZ2V0KGlkQXR0cmlidXRlKS5hdHRyaWJ1dGVDaG9pY2VzO1xyXG4gIH1cclxuXHJcbiAgZ2V0TG9hZGluZ1N1YmplY3QoKTogU3ViamVjdDxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gdGhpcy5sb2FkaW5nU3ViamVjdDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgY29udGFpbmVyVXBkYXRlZCBzdWJqZWN0LlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge1N1YmplY3Q8bnVtYmVyPn1cclxuICAgKi9cclxuICBnZXRDb250YWluZXJVcGRhdGVkKCk6IFN1YmplY3Q8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyVXBkYXRlZDtcclxuICB9XHJcblxyXG4gIGdldEdyaWRSb3dTYXZlZFN1YmplY3QoKTogU3ViamVjdDxBdHRyaWJ1dGVWYWx1ZUdyaWRSb3c+IHtcclxuICAgIHJldHVybiB0aGlzLmdyaWRSb3dTYXZlZDtcclxuICB9XHJcblxyXG4gIGdldEdyaWRSb3dEZWxldGVkU3ViamVjdCgpOiBTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlR3JpZFJvdz4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ3JpZFJvd0RlbGV0ZWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhciB0aGUgdXBkYXRlZCBhbmQgZGVsZXRlZCBhdHRyaWJ1dGUgdmFsdWUgYXJyYXlzLlxyXG4gICAqXHJcbiAgICovXHJcbiAgY2xlYXJVcGRhdGVkQXR0cmlidXRlVmFsdWVzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMgPSBbXTtcclxuICAgIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcyA9IFtdO1xyXG4gICAgdGhpcy5kaXJ0eS5uZXh0KGZhbHNlKTtcclxuICAgIHRoaXMubm90aWZ5QXR0cmlidXRlcygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgdGhlIHVwZGF0ZWQgYW5kIGRlbGV0ZWQgZ3JpZCByb3cgYXR0cmlidXRlcyBmb3IgdGhlIHNwZWNpZmllZCBncmlkIHJvd1xyXG4gICAqXHJcbiAgICovXHJcbiAgY2xlYXJVcGRhdGVkR3JpZFJvd0F0dHJpYnV0ZVZhbHVlcyhncm91cEF0dHJpYnV0ZVJvd0lkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCByZW1haW5pbmdBdHRyaWJ1dGVzID0gW107XHJcblxyXG4gICAgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMgPSB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5maWx0ZXIoKGF2KSA9PiBhdi5ncm91cEF0dHJpYnV0ZVJvd0lkICE9PSBncm91cEF0dHJpYnV0ZVJvd0lkKTtcclxuICAgIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcyA9ICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMuZmlsdGVyKChhdikgPT4gYXYuZ3JvdXBBdHRyaWJ1dGVSb3dJZCAhPT0gZ3JvdXBBdHRyaWJ1dGVSb3dJZCk7XHJcblxyXG4gICAgLy9TaG91bGRuJ3QgYmUgYSBuZWVkIHRvIGNoYW5nZSBkaXJ0eSBvciBub3RpZnkgYXR0cmlidXRlc1xyXG4gIH1cclxuXHJcbiAgc2F2ZUdyaWRSb3dBdHRyaWJ1dGVWYWx1ZXMoaWRHcm91cEF0dHJpYnV0ZTogbnVtYmVyLCBncm91cEF0dHJpYnV0ZVJvd0lkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCByb3dWYWx1ZXMgPSB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMuZmlsdGVyKChhdikgPT4gYXYuZ3JvdXBBdHRyaWJ1dGVSb3dJZCA9PT0gZ3JvdXBBdHRyaWJ1dGVSb3dJZCk7XHJcblxyXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCByb3dWYWx1ZXMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgLy9zZXQgdGhlIGlkQXR0cmlidXRlVmFsdWVTZXQgaWYgbmVjZXNzYXJ5XHJcbiAgICAgIGlmICghIHJvd1ZhbHVlc1tqXS5pZEF0dHJpYnV0ZVZhbHVlU2V0KSB7XHJcbiAgICAgICAgcm93VmFsdWVzW2pdLmlkQXR0cmlidXRlVmFsdWVTZXQgPSB0aGlzLmlkQXR0cmlidXRlVmFsdWVTZXQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vcmVtb3ZlIGFsbCBuZWdhdGl2ZSBpZHMgKG5ldyB2YWx1ZXMpXHJcbiAgICAgIGlmIChyb3dWYWx1ZXNbal0uaWRBdHRyaWJ1dGVWYWx1ZSA8IDApIHtcclxuICAgICAgICByb3dWYWx1ZXNbal0uaWRBdHRyaWJ1dGVWYWx1ZSA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vRm9yIG11bHRpIHZhbHVlcyB0aGF0IHdlcmUgc2xpY2VkIChkZS1zZWxlY3RlZCkgd2UncmUgZ29pbmcgdG8gZmluZCB0aGVtIGFuZCBudWxsIG91dCB0aGUgdmFsdWUsIGluc3RlYWQgb2YgcmVtb3ZpbmcuXHJcbiAgICAvL1RoYXQgbWVhbnMgdGhleSBhY3RhdWxseSBuZWVkIHRvIGJlIGFkZGVkIHRvIHRoZSByb3dWYWx1ZXNcclxuICAgIC8vUmVtb3ZlZCBtdWx0aSB2YWx1ZXMgd2l0aGluIGFuIGV4aXN0aW5nIHJvd1xyXG4gICAgbGV0IHJlbW92ZWRWYWx1ZXMgPSB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5maWx0ZXIoKGF2KSA9PiBhdi5ncm91cEF0dHJpYnV0ZVJvd0lkID09PSBncm91cEF0dHJpYnV0ZVJvd0lkKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVtb3ZlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICByZW1vdmVkVmFsdWVzW2ldLnZhbHVlQXR0cmlidXRlQ2hvaWNlID0gdW5kZWZpbmVkO1xyXG4gICAgICByZW1vdmVkVmFsdWVzW2ldLnZhbHVlSWREaWN0aW9uYXJ5ID0gdW5kZWZpbmVkO1xyXG4gICAgICByb3dWYWx1ZXMucHVzaChyZW1vdmVkVmFsdWVzW2ldKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgYXZncjpBdHRyaWJ1dGVWYWx1ZUdyaWRSb3cgPSA8QXR0cmlidXRlVmFsdWVHcmlkUm93PntcclxuICAgICAgICBpZEF0dHJpYnV0ZVZhbHVlU2V0OiB0aGlzLmlkQXR0cmlidXRlVmFsdWVTZXQsXHJcbiAgICAgICAgaWRHcm91cEF0dHJpYnV0ZTogaWRHcm91cEF0dHJpYnV0ZSxcclxuICAgICAgICBncm91cEF0dHJpYnV0ZVJvd0lkOiBncm91cEF0dHJpYnV0ZVJvd0lkLFxyXG4gICAgICAgIGF0dHJpYnV0ZVZhbHVlczogcm93VmFsdWVzXHJcbiAgICAgIH07XHJcblxyXG4gICAgbGV0IHVybDogc3RyaW5nID0gdGhpcy5hdHRyaWJ1dGVFbmRwb2ludCArIFwiYXR0cmlidXRlLXZhbHVlLWdyaWQtcm93L1wiIDtcclxuXHJcbiAgICBsZXQgYWM6IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gPSB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0LmdldFZhbHVlKCk7XHJcblxyXG4gICAgbGV0IHF1ZXJ5UGFyYW1zOiBIdHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKVxyXG4gICAgLnNldChcImNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRcIiwgYWMuY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dClcclxuICAgIC5zZXQoXCJjb2RlQXR0cmlidXRlQ29udGV4dFwiLCBhYy5jb2RlQXR0cmlidXRlQ29udGV4dClcclxuICAgIC5zZXQoXCJpZFBhcmVudE9iamVjdFwiLCAodGhpcy5pZFBhcmVudE9iamVjdCk/dGhpcy5pZFBhcmVudE9iamVjdC50b1N0cmluZygpOlwiXCIpO1xyXG5cclxuXHJcbiAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XHJcblxyXG4gICAgLy9TYXZlIG5ldyByb3dcclxuICAgIGlmIChncm91cEF0dHJpYnV0ZVJvd0lkIDwgMCkge1xyXG4gICAgICB0aGlzLmh0dHAucG9zdCh1cmwsIGF2Z3IsIHtwYXJhbXM6IHF1ZXJ5UGFyYW1zfSkuc3Vic2NyaWJlKChhdHRyaWJ1dGVWYWx1ZUdyaWRSb3c6IEF0dHJpYnV0ZVZhbHVlR3JpZFJvdykgPT4ge1xyXG5cclxuICAgICAgICAvL0FkZCB0aGUgZ3JpZCByb3cgdG8gdGhlIG9yaWdpbmFsIGF0dHJpYnV0ZSB2YWx1ZXNcclxuICAgICAgICBsZXQgYXZzOkF0dHJpYnV0ZVZhbHVlU2V0ID0gdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QuZ2V0VmFsdWUoKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVWYWx1ZUdyaWRSb3cuYXR0cmlidXRlVmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBhdnMuYXR0cmlidXRlVmFsdWVzLnB1c2goYXR0cmlidXRlVmFsdWVHcmlkUm93LmF0dHJpYnV0ZVZhbHVlc1tpXSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL1JlbW92ZSB0aGUgdXBkYXRlZCBhbmQgc2xpY2VkIHZhbHVlcyBmb3IgdGhlIGdyaWQgcm93LCBub3cgKHRoZXNlIGFyZSB0aGUgb2xkIG9uZXMgd2l0aCB0aGUgbmVnYXRpdmUgcm93aWQpXHJcbiAgICAgICAgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMgPSB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5maWx0ZXIoKGF2KSA9PiBhdi5ncm91cEF0dHJpYnV0ZVJvd0lkICE9PSBncm91cEF0dHJpYnV0ZVJvd0lkKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMgPSAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLmZpbHRlcigoYXYpID0+IGF2Lmdyb3VwQXR0cmlidXRlUm93SWQgIT09IGdyb3VwQXR0cmlidXRlUm93SWQpO1xyXG5cclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5uZXh0KGF2cyk7XHJcbiAgICAgICAgdGhpcy5ncmlkUm93U2F2ZWQubmV4dChhdHRyaWJ1dGVWYWx1ZUdyaWRSb3cpO1xyXG4gICAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLy9VcGRhdGUgZXhpc3Rpbmcgcm93XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5odHRwLnB1dCh1cmwsIGF2Z3IsIHtwYXJhbXM6IHF1ZXJ5UGFyYW1zfSkuc3Vic2NyaWJlKChhdHRyaWJ1dGVWYWx1ZUdyaWRSb3c6IEF0dHJpYnV0ZVZhbHVlR3JpZFJvdykgPT4ge1xyXG5cclxuICAgICAgICAvL0FkZCB0aGUgZ3JpZCByb3cgdG8gdGhlIG9yaWdpbmFsIGF0dHJpYnV0ZSB2YWx1ZXNcclxuICAgICAgICBsZXQgYXZzOkF0dHJpYnV0ZVZhbHVlU2V0ID0gdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QuZ2V0VmFsdWUoKTtcclxuXHJcbiAgICAgICAgLy9SZW1vdmUgYWxsIG9sZCB2YWx1ZXMgZm9yIHJvd1xyXG4gICAgICAgIGxldCBpbmRleCA9IGF2cy5hdHRyaWJ1dGVWYWx1ZXMuZmluZEluZGV4KChhdik9PiBhdi5ncm91cEF0dHJpYnV0ZVJvd0lkID09PSBncm91cEF0dHJpYnV0ZVJvd0lkKTtcclxuICAgICAgICB3aGlsZSAoaW5kZXggPiAwKSB7XHJcbiAgICAgICAgICAvL1JlbW92ZSB2YWx1ZVxyXG4gICAgICAgICAgYXZzLmF0dHJpYnV0ZVZhbHVlcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG5cclxuICAgICAgICAgIC8vRmluZCB0aGUgbmV4dCBvbmVcclxuICAgICAgICAgIGluZGV4ID0gYXZzLmF0dHJpYnV0ZVZhbHVlcy5maW5kSW5kZXgoKGF2KT0+IGF2Lmdyb3VwQXR0cmlidXRlUm93SWQgPT09IGdyb3VwQXR0cmlidXRlUm93SWQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9BZGQgYWxsIHRoZSBjdXJyZW50IHZhbHVlc1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0cmlidXRlVmFsdWVHcmlkUm93LmF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgYXZzLmF0dHJpYnV0ZVZhbHVlcy5wdXNoKGF0dHJpYnV0ZVZhbHVlR3JpZFJvdy5hdHRyaWJ1dGVWYWx1ZXNbaV0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9SZW1vdmUgdGhlIHNsaWNlZCBhbmQgdXBkYXRlZCB2YWx1ZXMgZm9yIHRoZSBncmlkIHJvd1xyXG4gICAgICAgIHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzID0gdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMuZmlsdGVyKChhdikgPT4gYXYuZ3JvdXBBdHRyaWJ1dGVSb3dJZCAhPT0gZ3JvdXBBdHRyaWJ1dGVSb3dJZCk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzID0gIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5maWx0ZXIoKGF2KSA9PiBhdi5ncm91cEF0dHJpYnV0ZVJvd0lkICE9PSBncm91cEF0dHJpYnV0ZVJvd0lkKTtcclxuXHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QubmV4dChhdnMpO1xyXG4gICAgICAgIHRoaXMuZ3JpZFJvd1NhdmVkLm5leHQoYXR0cmlidXRlVmFsdWVHcmlkUm93KTtcclxuICAgICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICB9LFxyXG4gICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGRlbGV0ZUdyaWRSb3dBdHRyaWJ1dGVWYWx1ZXMoaWRHcm91cEF0dHJpYnV0ZTogbnVtYmVyLCBncm91cEF0dHJpYnV0ZVJvd0lkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCB1cmw6IHN0cmluZyA9IHRoaXMuYXR0cmlidXRlRW5kcG9pbnQgKyBcImF0dHJpYnV0ZS12YWx1ZS1ncmlkLXJvdy9cIiA7XHJcblxyXG4gICAgbGV0IGFjOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uID0gdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdC5nZXRWYWx1ZSgpO1xyXG5cclxuICAgIGxldCBxdWVyeVBhcmFtczogSHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKClcclxuICAgIC5zZXQoXCJjb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0XCIsIGFjLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQpXHJcbiAgICAuc2V0KFwiY29kZUF0dHJpYnV0ZUNvbnRleHRcIiwgYWMuY29kZUF0dHJpYnV0ZUNvbnRleHQpXHJcbiAgICAuc2V0KFwiaWRQYXJlbnRPYmplY3RcIiwgKHRoaXMuaWRQYXJlbnRPYmplY3QpP3RoaXMuaWRQYXJlbnRPYmplY3QudG9TdHJpbmcoKTpcIlwiKTtcclxuXHJcbiAgICBsZXQgYXZncjpBdHRyaWJ1dGVWYWx1ZUdyaWRSb3cgPSA8QXR0cmlidXRlVmFsdWVHcmlkUm93PntcclxuICAgICAgICBpZEF0dHJpYnV0ZVZhbHVlU2V0OiB0aGlzLmlkQXR0cmlidXRlVmFsdWVTZXQsXHJcbiAgICAgICAgaWRHcm91cEF0dHJpYnV0ZTogaWRHcm91cEF0dHJpYnV0ZSxcclxuICAgICAgICBncm91cEF0dHJpYnV0ZVJvd0lkOiBncm91cEF0dHJpYnV0ZVJvd0lkLFxyXG4gICAgICAgIGF0dHJpYnV0ZVZhbHVlczogW11cclxuICAgICAgfTtcclxuXHJcbiAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XHJcblxyXG4gICAgdGhpcy5odHRwLnJlcXVlc3QoJ2RlbGV0ZScsIHVybCwge2JvZHk6IGF2Z3IsIHBhcmFtczogcXVlcnlQYXJhbXN9KS5zdWJzY3JpYmUoKCkgPT4ge1xyXG5cclxuICAgICAgLy9SZW1vdmUgdGhlIGdyaWQgcm93IGZyb20gdGhlIG9yaWdpbmFsIGF0dHJpYnV0ZSB2YWx1ZXNcclxuICAgICAgbGV0IGF2czpBdHRyaWJ1dGVWYWx1ZVNldCA9IHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCk7XHJcbiAgICAgIGF2cy5hdHRyaWJ1dGVWYWx1ZXMgPSBhdnMuYXR0cmlidXRlVmFsdWVzLmZpbHRlcigoYXYpID0+IGF2Lmdyb3VwQXR0cmlidXRlUm93SWQgIT09IGdyb3VwQXR0cmlidXRlUm93SWQpO1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5uZXh0KGF2cyk7XHJcbiAgICAgIHRoaXMuZ3JpZFJvd0RlbGV0ZWQubmV4dChhdmdyKTtcclxuICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgIH0sXHJcbiAgICAoZXJyb3IpID0+IHtcclxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFB1c2ggYW4gYXR0cmlidXRlIHRvIHRoZSBhdHRyaWJ1dGUgbWFwLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtBdHRyaWJ1dGV9IGF0dHJpYnV0ZVxyXG4gICAqL1xyXG4gIHB1c2hBdHRyaWJ1dGUoYXR0cmlidXRlOiBBdHRyaWJ1dGUpOiB2b2lkIHtcclxuICAgIHRoaXMuYXR0cmlidXRlTWFwLnNldChhdHRyaWJ1dGUuaWRBdHRyaWJ1dGUsIGF0dHJpYnV0ZSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHVzaEF0dHJpYnV0ZVZhbHVlTXVsdGlDaG9pY2UoYXR0cmlidXRlVmFsdWU6IEF0dHJpYnV0ZVZhbHVlKTogdm9pZCB7XHJcbiAgICAvL1JlbW92ZSBmcm9tIHNsaWNlZCBpZiBwcmVzZW50XHJcbiAgICBsZXQgaTogbnVtYmVyID0gMDtcclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAodGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXNbaV0uaWRBdHRyaWJ1dGUgPT09IGF0dHJpYnV0ZVZhbHVlLmlkQXR0cmlidXRlICYmIHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzW2ldLnZhbHVlQXR0cmlidXRlQ2hvaWNlLmlkQXR0cmlidXRlQ2hvaWNlID09PSBhdHRyaWJ1dGVWYWx1ZS52YWx1ZUF0dHJpYnV0ZUNob2ljZS5pZEF0dHJpYnV0ZUNob2ljZSkge1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvL1JlbW92ZSBmcm9tIHNsaWNlZCBhdHRyaWJ1dGUgdmFsdWVzIChubyBsb25nZXIgcmVtb3ZpbmcpXHJcbiAgICBpZiAoaSA8IHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5zcGxpY2UoaSwgMSk7XHJcbiAgICB9XHJcbiAgICAvL090aGVyd2lzZSBwdXNoIHRoZSB2YWx1ZSwgc28gaXQgd2lsbCBiZSBzYXZlZFxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMucHVzaEF0dHJpYnV0ZVZhbHVlKGF0dHJpYnV0ZVZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1c2hBdHRyaWJ1dGVWYWx1ZU11bHRpRGljdChhdHRyaWJ1dGVWYWx1ZTogQXR0cmlidXRlVmFsdWUpOiB2b2lkIHtcclxuICAgIC8vUmVtb3ZlIGZyb20gc2xpY2VkIGlmIHByZXNlbnRcclxuICAgIGxldCBpOiBudW1iZXIgPSAwO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICh0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlc1tpXS5pZEF0dHJpYnV0ZSA9PT0gYXR0cmlidXRlVmFsdWUuaWRBdHRyaWJ1dGUgJiYgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXNbaV0udmFsdWVJZERpY3Rpb25hcnkgPT09IGF0dHJpYnV0ZVZhbHVlLnZhbHVlSWREaWN0aW9uYXJ5KSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vUmVtb3ZlIGZyb20gc2xpY2VkIGF0dHJpYnV0ZSB2YWx1ZXMgKG5vIGxvbmdlciByZW1vdmluZylcclxuICAgIGlmIChpIDwgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzLnNwbGljZShpLCAxKTtcclxuICAgIH1cclxuICAgIC8vT3RoZXJ3aXNlIHB1c2ggdGhlIHZhbHVlLCBzbyBpdCB3aWxsIGJlIHNhdmVkXHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5wdXNoQXR0cmlidXRlVmFsdWUoYXR0cmlidXRlVmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUHVzaCBhIG5ldyBvciB1cGRhdGVkIGF0dHJpYnV0ZSB2YWx1ZS4gIFRoZSBjdXJyZW50IG9uZSBpcyBqdXN0IHJlbW92ZWQgYW5kIHRoZSBuZXcgb25lIGFwcGVuZGVkIHRvIHRoZSBhcnJheS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlVmFsdWV9IGF0dHJpYnV0ZVZhbHVlXHJcbiAgICovXHJcbiAgcHVzaEF0dHJpYnV0ZVZhbHVlKGF0dHJpYnV0ZVZhbHVlOiBBdHRyaWJ1dGVWYWx1ZSk6IHZvaWQge1xyXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJwdXNoQXR0cmlidXRlVmFsdWVcIik7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoYXR0cmlidXRlVmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBpOiBudW1iZXIgPSAwO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAodGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2ldLmlkQXR0cmlidXRlVmFsdWUgPT09IGF0dHJpYnV0ZVZhbHVlLmlkQXR0cmlidXRlVmFsdWUpIHtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKGkgPCB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5zcGxpY2UoaSwgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLnB1c2goYXR0cmlidXRlVmFsdWUpO1xyXG4gICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZVB1c2hlZFN1YmplY3QubmV4dChhdHRyaWJ1dGVWYWx1ZSk7XHJcblxyXG4gICAgLy9Pbmx5IHNldHRpbmcgZGlydHkgZm9yIG5vbiBncmlkLXJvd3MgKHRob3NlIGFyZSBzYXZlZCBpbW1lZGlhdGVseSlcclxuICAgIGlmICghIGF0dHJpYnV0ZVZhbHVlLmlkR3JvdXBBdHRyaWJ1dGUpIHtcclxuICAgICAgdGhpcy5kaXJ0eS5uZXh0KHRydWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRm9yIHB1c2hpbmcgbXVsdGlwbGUgYXR0cmlidXRlIHZhbHVlcyBhdCBvbmNlLiAgVGhpcyB3b3VsZCB0eXBpY2FsbHkgYmUgZm9yIGEgbXVsdGkgY2hvaWNlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtBdHRyaWJ1dGV9IGF0dHJpYnV0ZVxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlVmFsdWVbXX0gYXR0cmlidXRlVmFsdWVzXHJcbiAgICovXHJcbiAgcHVzaEF0dHJpYnV0ZVZhbHVlcyhhdHRyaWJ1dGU6IEF0dHJpYnV0ZSwgYXR0cmlidXRlVmFsdWVzOiBBdHRyaWJ1dGVWYWx1ZVtdKTogdm9pZCB7XHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhcInB1c2hBdHRyaWJ1dGVWYWx1ZXNcIik7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoYXR0cmlidXRlVmFsdWVzKTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgajogbnVtYmVyID0gMDtcclxuICAgICAgZm9yIChqID0gMDsgaiA8IHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbal0uaWRBdHRyaWJ1dGUgIT09IGF0dHJpYnV0ZS5pZEF0dHJpYnV0ZSkge1xyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbal0uaWRBdHRyaWJ1dGVWYWx1ZSA9PT0gYXR0cmlidXRlVmFsdWVzW2ldLmlkQXR0cmlidXRlVmFsdWUpIHtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoaiA8IHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbal0gPSBhdHRyaWJ1dGVWYWx1ZXNbaV07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLnB1c2goYXR0cmlidXRlVmFsdWVzW2ldKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICBjb25zb2xlLmRlYnVnKHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9Pbmx5IHNldHRpbmcgZGlydHkgZm9yIG5vbiBncmlkLXJvd3MgKHRob3NlIGFyZSBzYXZlZCBpbW1lZGlhdGVseSlcclxuICAgIGlmICghIGF0dHJpYnV0ZS5pZEdyb3VwQXR0cmlidXRlKSB7XHJcbiAgICAgIHRoaXMuZGlydHkubmV4dCh0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFB1c2ggYSB2YWx1ZSBpbiB0aGUgY2FzZSB3aGVyZSBhbiBhdHRyaWJ1dGUgdmFsdWUgZG9lc24ndCBleGlzdC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlfSBhdHRyaWJ1dGVcclxuICAgKiBAcGFyYW0gdmFsdWVcclxuICAgKi9cclxuICBwdXNoVmFsdWUoYXR0cmlidXRlOiBBdHRyaWJ1dGUsIHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIGxldCBhdHRyaWJ1dGVWYWx1ZTogQXR0cmlidXRlVmFsdWUgPSA8QXR0cmlidXRlVmFsdWU+e1xyXG4gICAgICBpZEF0dHJpYnV0ZTogYXR0cmlidXRlLmlkQXR0cmlidXRlLFxyXG4gICAgICBpZEF0dHJpYnV0ZVZhbHVlU2V0OiB0aGlzLmlkQXR0cmlidXRlVmFsdWVTZXRcclxuICAgIH07XHJcblxyXG4gICAgaWYgKGF0dHJpYnV0ZS5jb2RlQXR0cmlidXRlRGF0YVR5cGUgPT09IFwiVFhUXCIpIHtcclxuICAgICAgYXR0cmlidXRlVmFsdWUudmFsdWVMb25nVGV4dCA9IHtcclxuICAgICAgICBpZExvbmdUZXh0OiB1bmRlZmluZWQsXHJcbiAgICAgICAgdGV4dERhdGE6IHZhbHVlXHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLnB1c2goYXR0cmlidXRlVmFsdWUpO1xyXG4gICAgdGhpcy5kaXJ0eS5uZXh0KHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIGFuIGF0dHJpYnV0ZSB2YWx1ZS4gIFR5cGljYWxseSBpbiB0aGUgY2FzZSBvZiBhIG11bHRpIHNlbGVjdCB3aGVyZSB0aGUgdW5zZWxlY3RlZCB2YWx1ZSBpcyByZW1vdmVkLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtBdHRyaWJ1dGV9IGF0dHJpYnV0ZVxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlQ2hvaWNlfSBhdHRyaWJ1dGVDaG9pY2VcclxuICAgKi9cclxuICBzcGxpY2VBdHRyaWJ1dGVWYWx1ZUNob2ljZShhdHRyaWJ1dGU6IEF0dHJpYnV0ZSwgYXR0cmlidXRlQ2hvaWNlOiBBdHRyaWJ1dGVDaG9pY2UpOiB2b2lkIHtcclxuICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICBjb25zb2xlLmRlYnVnKFwic2xpY2VBdHRyaWJ1dGVWYWx1ZTogXCIgKyBhdHRyaWJ1dGUuaWRBdHRyaWJ1dGUgKyBcIiwgXCIgKyBhdHRyaWJ1dGVDaG9pY2UuaWRBdHRyaWJ1dGVDaG9pY2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBpOiBudW1iZXIgPSAwO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAodGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2ldLmlkQXR0cmlidXRlID09PSBhdHRyaWJ1dGUuaWRBdHRyaWJ1dGUgJiYgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2ldLnZhbHVlQXR0cmlidXRlQ2hvaWNlLmlkQXR0cmlidXRlQ2hvaWNlID09PSBhdHRyaWJ1dGVDaG9pY2UuaWRBdHRyaWJ1dGVDaG9pY2UpIHtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy9SZW1vdmUgZnJvbSB1cGRhdGVkIGF0dHJpYnV0ZSB2YWx1ZXMgKG5vdCBwcmV2aW91c2x5IHNhdmVkKVxyXG4gICAgaWYgKGkgPCB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5zcGxpY2UoaSwgMSk7XHJcbiAgICB9XHJcbiAgICAvL0FkZCB0byBzbGljZWQgdmFsdWVzIChwcmV2aW91c2x5IHNhdmVkIC0gbmVlZCB0byByZW1vdmUpXHJcbiAgICBlbHNlIHtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCkuYXR0cmlidXRlVmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCkuYXR0cmlidXRlVmFsdWVzW2ldLmlkQXR0cmlidXRlID09PSBhdHRyaWJ1dGUuaWRBdHRyaWJ1dGVcclxuICAgICAgICAgICAgJiYgdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QuZ2V0VmFsdWUoKS5hdHRyaWJ1dGVWYWx1ZXNbaV0udmFsdWVBdHRyaWJ1dGVDaG9pY2UuaWRBdHRyaWJ1dGVDaG9pY2UgPT09IGF0dHJpYnV0ZUNob2ljZS5pZEF0dHJpYnV0ZUNob2ljZSkge1xyXG4gICAgICAgICAgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMucHVzaCh0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5nZXRWYWx1ZSgpLmF0dHJpYnV0ZVZhbHVlc1tpXSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL09ubHkgZmxhZ2dpbmcgZGlydHkgZm9yIG5vbi1ncmlkIHJvd3MgKHRob3NlIGFyZSBzYXZlZCBpbW1lZGlhdGVseSlcclxuICAgIGlmICghIGF0dHJpYnV0ZS5pZEdyb3VwQXR0cmlidXRlKSB7XHJcbiAgICAgIHRoaXMuZGlydHkubmV4dCh0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmUgYW4gYXR0cmlidXRlIHZhbHVlLiAgVHlwaWNhbGx5IGluIHRoZSBjYXNlIG9mIGEgbXVsdGkgc2VsZWN0IHdoZXJlIHRoZSB1bnNlbGVjdGVkIHZhbHVlIGlzIHJlbW92ZWQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0F0dHJpYnV0ZX0gYXR0cmlidXRlXHJcbiAgICogQHBhcmFtIHtBdHRyaWJ1dGVDaG9pY2V9IGF0dHJpYnV0ZUNob2ljZVxyXG4gICAqL1xyXG4gIHNwbGljZUF0dHJpYnV0ZVZhbHVlRGljdChhdHRyaWJ1dGU6IEF0dHJpYnV0ZSwgdmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJzbGljZUF0dHJpYnV0ZVZhbHVlOiBcIiArIGF0dHJpYnV0ZS5pZEF0dHJpYnV0ZSArIFwiLCBcIiArIHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgaTogbnVtYmVyID0gMDtcclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXS5pZEF0dHJpYnV0ZSA9PT0gYXR0cmlidXRlLmlkQXR0cmlidXRlICYmIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXS52YWx1ZUlkRGljdGlvbmFyeSA9PT0gdmFsdWUpIHtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy9SZW1vdmUgZnJvbSB1cGRhdGVkIGF0dHJpYnV0ZSB2YWx1ZXMgKG5vdCBwcmV2aW91c2x5IHNhdmVkKVxyXG4gICAgaWYgKGkgPCB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5zcGxpY2UoaSwgMSk7XHJcbiAgICB9XHJcbiAgICAvL0FkZCB0byBzbGljZWQgdmFsdWVzIChwcmV2aW91c2x5IHNhdmVkIC0gbmVlZCB0byByZW1vdmUpXHJcbiAgICBlbHNlIHtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCkuYXR0cmlidXRlVmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCkuYXR0cmlidXRlVmFsdWVzW2ldLmlkQXR0cmlidXRlID09PSBhdHRyaWJ1dGUuaWRBdHRyaWJ1dGVcclxuICAgICAgICAgICAgJiYgdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QuZ2V0VmFsdWUoKS5hdHRyaWJ1dGVWYWx1ZXNbaV0udmFsdWVJZERpY3Rpb25hcnkgPT09IHZhbHVlKSB7XHJcbiAgICAgICAgICB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5wdXNoKHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCkuYXR0cmlidXRlVmFsdWVzW2ldKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vT25seSBmbGFnZ2luZyBkaXJ0eSBmb3Igbm9uLWdyaWQgcm93cyAodGhvc2UgYXJlIHNhdmVkIGltbWVkaWF0ZWx5KVxyXG4gICAgaWYgKCEgYXR0cmlidXRlLmlkR3JvdXBBdHRyaWJ1dGUpIHtcclxuICAgICAgdGhpcy5kaXJ0eS5uZXh0KHRydWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBhdHRyaWJ1dGUgYmFzZWQgdXBvbiB0aGUgaWRBdHRyaWJ1dGUuICBUaGlzIGlzIGZyb20gdGhlIG1hcCBvZiBhdHRyaWJ1dGVzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkQXR0cmlidXRlXHJcbiAgICogQHJldHVybnMge0F0dHJpYnV0ZX1cclxuICAgKi9cclxuICBnZXRBdHRyaWJ1dGUoaWRBdHRyaWJ1dGU6IG51bWJlcik6IEF0dHJpYnV0ZSB7XHJcbiAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGVNYXAuZ2V0KGlkQXR0cmlidXRlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZvciB0aGUgYXR0cmlidXRlIGNvbmZpZ3VyYXRpb24sIHNldCBhbGwgb2YgdGhlIG5lZ2F0aXZlIGlkcyB0byB1bmRlZmluZWQgcHJpb3IgdG8gcG9zdGluZy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlQ29uZmlndXJhdGlvbn0gYXR0cmlidXRlQ29uZmlndXJhdGlvblxyXG4gICAqL1xyXG4gIHNldE5lZ2F0aXZlSWRzVG9VbmRlZmluZWQoYXR0cmlidXRlQ29uZmlndXJhdGlvbjogQXR0cmlidXRlQ29uZmlndXJhdGlvbik6IHZvaWQge1xyXG4gICAgaWYgKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uIDwgMCkge1xyXG4gICAgICBhdHRyaWJ1dGVDb25maWd1cmF0aW9uLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbiA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGxldCBhdHRyaWJ1dGVDb250YWluZXIgb2YgYXR0cmlidXRlQ29uZmlndXJhdGlvbi5hdHRyaWJ1dGVDb250YWluZXJzKSB7XHJcbiAgICAgIGlmIChhdHRyaWJ1dGVDb250YWluZXIuaWRBdHRyaWJ1dGVDb250YWluZXIgIDwgMCkge1xyXG4gICAgICAgIGF0dHJpYnV0ZUNvbnRhaW5lci5pZEF0dHJpYnV0ZUNvbnRhaW5lciA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChsZXQgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZUNvbnRhaW5lci5ncmFwaGljYWxBdHRyaWJ1dGVzKSB7XHJcblxyXG4gICAgICAgIGlmIChhdHRyaWJ1dGUuaWRBdHRyaWJ1dGUgIDwgMCkge1xyXG4gICAgICAgICAgYXR0cmlidXRlLmlkQXR0cmlidXRlID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGF0dHJpYnV0ZS5hdHRyaWJ1dGVDaG9pY2VzKSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBhdHRyaWJ1dGVDaG9pY2Ugb2YgYXR0cmlidXRlLmF0dHJpYnV0ZUNob2ljZXMpIHtcclxuICAgICAgICAgICAgZGVsZXRlIGF0dHJpYnV0ZVtcInZhbHVlXCJdO1xyXG5cclxuICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZUNob2ljZS5pZEF0dHJpYnV0ZSAgPCAwKSB7XHJcbiAgICAgICAgICAgICAgYXR0cmlidXRlQ2hvaWNlLmlkQXR0cmlidXRlID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVDaG9pY2UuaWRBdHRyaWJ1dGVDaG9pY2UgIDwgMCkge1xyXG4gICAgICAgICAgICAgIGF0dHJpYnV0ZUNob2ljZS5pZEF0dHJpYnV0ZUNob2ljZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBhIGRpc3BsYXkgbmFtZSBmb3IgdGhlIGF0dHJpYnV0ZSBjb25maWd1cmF0aW9uIGJhc2VkIG9uIHRoZSBjb250ZXh0IGNvZGUgYW5kIGlkLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtBdHRyaWJ1dGVDb25maWd1cmF0aW9ufSBjb25maWd1cmF0aW9uXHJcbiAgICogQHJldHVybnMge3N0cmluZ31cclxuICAgKi9cclxuICBnZXRDb25maWd1cmF0aW9uTmFtZShjb25maWd1cmF0aW9uOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPKTogc3RyaW5nIHtcclxuICAgIGlmIChjb25maWd1cmF0aW9uLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbiA9PT0gLTEpIHtcclxuICAgICAgcmV0dXJuIFwiTmV3XCI7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG5hbWU6IHN0cmluZyA9IGNvbmZpZ3VyYXRpb24uY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dERpc3BsYXkgKyBcIjogXCIgKyBjb25maWd1cmF0aW9uLmV4dGVuc2lvbkRlc2NyaXB0aW9uO1xyXG5cclxuICAgIGlmIChjb25maWd1cmF0aW9uLmlkRmlsdGVyMSkge1xyXG4gICAgICBuYW1lICs9IFwiIC0gXCIgKyBjb25maWd1cmF0aW9uLmZpbHRlcjFEaXNwbGF5O1xyXG4gICAgfVxyXG4gICAgaWYgKGNvbmZpZ3VyYXRpb24uaWRGaWx0ZXIyKSB7XHJcbiAgICAgIG5hbWUgKz0gXCIgLSBcIiArIGNvbmZpZ3VyYXRpb24uZmlsdGVyMkRpc3BsYXk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmFtZTtcclxuICB9XHJcblxyXG4gIGdldEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE8oY2ZnOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uKTogQXR0cmlidXRlQ29uZmlndXJhdGlvbkRUTyB7XHJcbiAgICBpZiAoIWNmZykge1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBkdG86IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE8gPSA8QXR0cmlidXRlQ29uZmlndXJhdGlvbkRUTz57XHJcbiAgICAgIGlkQXR0cmlidXRlQ29uZmlndXJhdGlvbjogY2ZnLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbixcclxuICAgICAgY29kZUF0dHJpYnV0ZUNvbnRleHQ6IGNmZy5jb2RlQXR0cmlidXRlQ29udGV4dCxcclxuICAgICAgY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dDogY2ZnLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQsXHJcbiAgICAgIGlkRmlsdGVyMTogY2ZnLmlkRmlsdGVyMSxcclxuICAgICAgaWRGaWx0ZXIyOiBjZmcuaWRGaWx0ZXIyXHJcbiAgICB9O1xyXG5cclxuICAgIGlmICh0aGlzLmF0dHJpYnV0ZUNvbnRleHRMaXN0U3ViamVjdC5nZXRWYWx1ZSgpKSB7XHJcbiAgICAgIGR0by5leHRlbnNpb25EZXNjcmlwdGlvbiA9IHRoaXMuYXR0cmlidXRlQ29udGV4dExpc3RTdWJqZWN0LmdldFZhbHVlKCkuZmlsdGVyKChjdHg6IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBjdHguY29kZUF0dHJpYnV0ZUNvbnRleHQgPT09IGNmZy5jb2RlQXR0cmlidXRlQ29udGV4dDtcclxuICAgICAgfSlbMF0uZXh0ZW5zaW9uRGVzY3JpcHRpb247XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuYXR0cmlidXRlU2VjdXJpdHlDb250ZXh0TGlzdFN1YmplY3QuZ2V0VmFsdWUoKSkge1xyXG4gICAgICBsZXQgcmVzdWx0OiBhbnlbXSA9IHRoaXMuYXR0cmlidXRlU2VjdXJpdHlDb250ZXh0TGlzdFN1YmplY3QuZ2V0VmFsdWUoKS5maWx0ZXIoKGZpbHRlcjogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGZpbHRlci5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0ID09PSBjZmcuY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dDtcclxuICAgICAgfSk7XHJcbiAgICAgIGR0by5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0RGlzcGxheSA9IChyZXN1bHQgJiYgcmVzdWx0Lmxlbmd0aCA+IDApID8gcmVzdWx0WzBdLmRlc2NyaXB0aW9uIDogdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmZpbHRlcjFMaXN0U3ViamVjdC5nZXRWYWx1ZSgpKSB7XHJcbiAgICAgIGxldCByZXN1bHQ6IGFueVtdID0gdGhpcy5maWx0ZXIxTGlzdFN1YmplY3QuZ2V0VmFsdWUoKS5maWx0ZXIoKGZpbHRlcjogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGZpbHRlci5jb2RlQXR0cmlidXRlQ29udGV4dCA9PT0gY2ZnLmNvZGVBdHRyaWJ1dGVDb250ZXh0XHJcbiAgICAgICAgICAmJiBmaWx0ZXIuY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dCA9PT0gY2ZnLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRcclxuICAgICAgICAgICYmIGZpbHRlci5pZEZpbHRlcjEgPT09IGNmZy5pZEZpbHRlcjE7XHJcbiAgICAgIH0pO1xyXG4gICAgICBkdG8uZmlsdGVyMURpc3BsYXkgPSAocmVzdWx0ICYmIHJlc3VsdC5sZW5ndGggPiAwKSA/IHJlc3VsdFswXS5kaXNwbGF5IDogdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmZpbHRlcjJMaXN0U3ViamVjdC5nZXRWYWx1ZSgpKSB7XHJcbiAgICAgIGxldCByZXN1bHQ6IGFueVtdID0gdGhpcy5maWx0ZXIyTGlzdFN1YmplY3QuZ2V0VmFsdWUoKS5maWx0ZXIoKGZpbHRlcjogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGZpbHRlci5jb2RlQXR0cmlidXRlQ29udGV4dCA9PT0gY2ZnLmNvZGVBdHRyaWJ1dGVDb250ZXh0XHJcbiAgICAgICAgICAmJiBmaWx0ZXIuY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dCA9PT0gY2ZnLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRcclxuICAgICAgICAgICYmIGZpbHRlci5pZEZpbHRlcjEgPT09IGNmZy5pZEZpbHRlcjFcclxuICAgICAgICAgICYmIGZpbHRlci5pZEZpbHRlcjIgPT09IGNmZy5pZEZpbHRlcjI7XHJcbiAgICAgIH0pO1xyXG4gICAgICBkdG8uZmlsdGVyMkRpc3BsYXkgPSAocmVzdWx0ICYmIHJlc3VsdC5sZW5ndGggPiAwKSA/IHJlc3VsdFswXS5kaXNwbGF5IDogdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBkdG87XHJcbiAgfVxyXG5cclxuICBnZXRTZWN1cml0eUNvZGVDb250ZXh0KGNvZGU6IHN0cmluZyk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRMaXN0U3ViamVjdC5nZXRWYWx1ZSgpLmZpbHRlcigoZmlsdGVyOiBhbnkpID0+IHtcclxuICAgICAgcmV0dXJuIGZpbHRlci5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0ID09PSBjb2RlO1xyXG4gICAgfSlbMF07XHJcbiAgfVxyXG5cclxuICBnZXRBdHRyaWJ1dGVDb250ZXh0TG9hZGluZ1N1YmplY3QoKTogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+IHtcclxuICAgIHJldHVybiB0aGlzLmF0dHJpYnV0ZUNvbnRleHRMb2FkaW5nU3ViamVjdDtcclxuICB9XHJcblxyXG4gIGdldEZpbHRlcjFGb3IoY29kZUF0dHJpYnV0ZUNvbnRleHQ6IHN0cmluZywgY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dDogc3RyaW5nKTogYW55W10ge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyMUxpc3RTdWJqZWN0LmdldFZhbHVlKCkuZmlsdGVyKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgcmV0dXJuIGl0ZW0uY29kZUF0dHJpYnV0ZUNvbnRleHQgPT09IGNvZGVBdHRyaWJ1dGVDb250ZXh0ICYmIGl0ZW0uY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dCA9PT0gY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dDtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0RmlsdGVyMkZvcihjb2RlQXR0cmlidXRlQ29udGV4dDogc3RyaW5nLCBjb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0OiBzdHJpbmcsIGlkRmlsdGVyMTogbnVtYmVyKTogYW55W10ge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyMkxpc3RTdWJqZWN0LmdldFZhbHVlKCkuZmlsdGVyKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgcmV0dXJuIGl0ZW0uY29kZUF0dHJpYnV0ZUNvbnRleHQgPT09IGNvZGVBdHRyaWJ1dGVDb250ZXh0XHJcbiAgICAgICAgJiYgaXRlbS5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0ID09PSBjb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0XHJcbiAgICAgICAgJiYgaXRlbS5pZEZpbHRlcjEgPT09IGlkRmlsdGVyMTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVHJhY2sgbmV3IGlkQXR0cmlidXRlVmFsdWVzIHZpYSBhIG5lZ2F0aXZlIG51bWJlciBmb3IgaW50ZXJuYWwgdHJhY2tpbmcuICBSZW1vdmUgdGhpcyBmYWtlIGlkIHByaW9yIHRvIHBvc3QuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gICAqL1xyXG4gIGdldFVuaXF1ZUlkKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gLS10aGlzLnVuaXF1ZUlkO1xyXG4gIH1cclxufVxyXG4iXX0=
1212
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0cmlidXRlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb2Qvc3JjL3NlcnZpY2VzL2F0dHJpYnV0ZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDNUUsT0FBTyxFQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUM1RCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFdkMsT0FBTyxFQUFDLGVBQWUsRUFBRSxRQUFRLEVBQWMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRXBFLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLCtDQUErQyxDQUFDO0FBV2hGLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNqRCxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQzs7Ozs7QUFHckUsTUFBTSxDQUFDLElBQUksa0JBQWtCLEdBQUcsSUFBSSxjQUFjLENBQVMsbUJBQW1CLENBQUMsQ0FBQztBQUNoRixNQUFNLENBQUMsTUFBTSxPQUFPLEdBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDNUMsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBRTFEOzs7R0FHRztBQUVILE1BQU0sT0FBTyxnQkFBZ0I7SUE4QzNCLFlBQW9CLGlCQUFvQyxFQUNwQyxJQUFnQixFQUNoQixNQUFjLEVBQ2MsaUJBQXlCO1FBSHJELHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNoQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2Msc0JB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QUFLLFNBQVMsQ0FBQztRQUNwQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsV0FBVztRQUNULE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3pCLENBQUM7K0dBbjVDVSxnQkFBZ0IsbUdBaURQLGtCQUFrQjttSEFqRDNCLGdCQUFnQjs7NEZBQWhCLGdCQUFnQjtrQkFENUIsVUFBVTs7MEJBa0RJLE1BQU07MkJBQUMsa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3QsIEluamVjdGFibGUsIEluamVjdGlvblRva2VuLCBpc0Rldk1vZGV9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7SHR0cENsaWVudCwgSHR0cFBhcmFtc30gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XHJcbmltcG9ydCB7Um91dGVyfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcblxyXG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgZm9ya0pvaW4sIE9ic2VydmFibGUsIFN1YmplY3R9IGZyb20gXCJyeGpzXCI7XHJcblxyXG5pbXBvcnQge0RpY3Rpb25hcnlTZXJ2aWNlfSBmcm9tIFwiQGh1bnRzbWFuLWNhbmNlci1pbnN0aXR1dGUvZGljdGlvbmFyeS1zZXJ2aWNlXCI7XHJcblxyXG5pbXBvcnQge0F0dHJpYnV0ZX0gZnJvbSBcIi4uL21vZGVsL2F0dHJpYnV0ZS5lbnRpdHlcIjtcclxuaW1wb3J0IHtBdHRyaWJ1dGVDaG9pY2V9IGZyb20gXCIuLi9tb2RlbC9hdHRyaWJ1dGUtY2hvaWNlLmVudGl0eVwiO1xyXG5pbXBvcnQge0F0dHJpYnV0ZVZhbHVlfSBmcm9tIFwiLi4vbW9kZWwvYXR0cmlidXRlLXZhbHVlLmVudGl0eVwiO1xyXG5pbXBvcnQge0F0dHJpYnV0ZUNvbmZpZ3VyYXRpb259IGZyb20gXCIuLi9tb2RlbC9hdHRyaWJ1dGUtY29uZmlndXJhdGlvbi5lbnRpdHlcIjtcclxuaW1wb3J0IHtBdHRyaWJ1dGVWYWx1ZVNldH0gZnJvbSBcIi4uL21vZGVsL2F0dHJpYnV0ZS12YWx1ZS1zZXQuZW50aXR5XCI7XHJcbmltcG9ydCB7QXR0cmlidXRlQ29uZmlndXJhdGlvbkRUT30gZnJvbSBcIi4uL21vZGVsL2F0dHJpYnV0ZS1jb25maWd1cmF0aW9uLmR0b1wiO1xyXG5pbXBvcnQge0dyYXBoaWNhbEF0dHJpYnV0ZX0gZnJvbSBcIi4uL21vZGVsL2dyYXBoaWNhbC1hdHRyaWJ1dGUuZW50aXR5XCI7XHJcbmltcG9ydCB7QXR0cmlidXRlQ29udGFpbmVyfSBmcm9tIFwiLi4vbW9kZWwvYXR0cmlidXRlLWNvbnRhaW5lci5lbnRpdHlcIjtcclxuaW1wb3J0IHtBdHRyaWJ1dGVWYWx1ZUdyaWRSb3d9IGZyb20gXCIuLi9tb2RlbC9hdHRyaWJ1dGUtdmFsdWUtZ3JpZC1yb3cuZW50aXR5XCI7XHJcbmltcG9ydCB7UHJlRXZhbERUT30gZnJvbSBcIi4uL21vZGVsL3ByZS1ldmFsLmR0b1wiO1xyXG5pbXBvcnQge0RpY3Rpb25hcnlFbnRyaWVzRFRPfSBmcm9tIFwiLi4vbW9kZWwvZGljdGlvbmFyeS1lbnRyaWVzLmR0b1wiO1xyXG5cclxuXHJcbmV4cG9ydCBsZXQgQVRUUklCVVRFX0VORFBPSU5UID0gbmV3IEluamVjdGlvblRva2VuPHN0cmluZz4oXCJhdHRyaWJ1dGVFbmRwb2ludFwiKTtcclxuZXhwb3J0IGNvbnN0IEJPT0xFQU46IHN0cmluZ1tdID0gW1wiTlwiLCBcIllcIl07XHJcbmV4cG9ydCBjb25zdCBFWFRFTkRFRF9CT09MRUFOOiBzdHJpbmdbXSA9IFtcIk5cIiwgXCJZXCIsIFwiVVwiXTtcclxuXHJcbi8qKlxyXG4gKiBBIHNlcnZpY2UgY3JlYXRlZCBmb3IgZWFjaCBhdHRyaWJ1dGUgY29uZmlndXJhdGlvbiBpbnN0YW5jZS4gIFRoaXMgbWFrZXMgY2FsbHMgdG8gdGhlIGJhY2tlbmQgdG8gZ2V0IHRoZSBjb25maWd1cmF0aW9uXHJcbiAqIGFuZCB2YWx1ZSBzZXQuICBJdCBhbHNvIHN0b3JlcyBjb21tb24gZGF0YSB0aGF0IGRpZmZlcmVudCBhdHRyaWJ1dGVzIG1pZ2h0IG5lZWQgKGUuZy4gYSBsaXN0IG9mIGF0dHJpYnV0ZSBjaG9pY2VzKS5cclxuICovXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEF0dHJpYnV0ZVNlcnZpY2Uge1xyXG5cclxuICBuZXdBdHRyaWJ1dGVDb25maWd1cmF0aW9uOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uO1xyXG4gIGlkQXR0cmlidXRlQ29uZmlndXJhdGlvbjogbnVtYmVyO1xyXG4gIGlkRmlsdGVyMTogbnVtYmVyO1xyXG4gIGlkRmlsdGVyMjogbnVtYmVyO1xyXG4gIGlkQXR0cmlidXRlVmFsdWVTZXQ6IG51bWJlcjtcclxuICBpZFBhcmVudE9iamVjdDogbnVtYmVyO1xyXG4gIGJvdW5kRGF0YTogYW55O1xyXG5cclxuICBhdHRyaWJ1dGVDb250ZXh0TG9hZGluZ1N1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG5cclxuICBhdHRyaWJ1dGVDb250ZXh0TGlzdFN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPih1bmRlZmluZWQpO1xyXG4gIGF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dExpc3RTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8YW55W10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4odW5kZWZpbmVkKTtcclxuICBmaWx0ZXIxTGlzdFN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPih1bmRlZmluZWQpO1xyXG4gIGZpbHRlcjJMaXN0U3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PGFueVtdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KHVuZGVmaW5lZCk7XHJcbiAgZGljdGlvbmFyeUxpc3RTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8YW55W10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4odW5kZWZpbmVkKTtcclxuXHJcblxyXG4gIHBvc3RDb25maWd1cmF0aW9uU3ViamVjdDogU3ViamVjdDxib29sZWFuPiA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XHJcbiAgYXR0cmlidXRlQ29uZmlndXJhdGlvbkRpbWVuc2lvblN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxhbnk+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KHVuZGVmaW5lZCk7XHJcblxyXG4gIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25MaXN0U3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE9bXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE9bXT4odW5kZWZpbmVkKTtcclxuICBhdHRyaWJ1dGVDb25maWd1cmF0aW9uTGlzdExvYWRpbmdTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuXHJcbiAgYXR0cmlidXRlQ29uZmlndXJhdGlvbkRUT1N1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxBdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXR0cmlidXRlQ29uZmlndXJhdGlvbkRUTz4odW5kZWZpbmVkKTtcclxuXHJcbiAgYXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxBdHRyaWJ1dGVDb25maWd1cmF0aW9uPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXR0cmlidXRlQ29uZmlndXJhdGlvbj4odW5kZWZpbmVkKTtcclxuICBhdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxBdHRyaWJ1dGVWYWx1ZVNldD4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlU2V0Pih1bmRlZmluZWQpO1xyXG4gIGF0dHJpYnV0ZVZhbHVlUHVzaGVkU3ViamVjdDogU3ViamVjdDxBdHRyaWJ1dGVWYWx1ZT4gPSBuZXcgU3ViamVjdDxBdHRyaWJ1dGVWYWx1ZT4oKTtcclxuXHJcbiAgbG9hZGluZ1N1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG5cclxuICBhdHRyaWJ1dGVNYXA6IE1hcDxudW1iZXIsIEF0dHJpYnV0ZT4gPSBuZXcgTWFwPG51bWJlciwgQXR0cmlidXRlPigpO1xyXG5cclxuICB3aWR0aDogbnVtYmVyO1xyXG5cclxuICBjb250YWluZXJVcGRhdGVkOiBTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuICBncmlkUm93U2F2ZWQ6IFN1YmplY3Q8QXR0cmlidXRlVmFsdWVHcmlkUm93PiA9IG5ldyBTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlR3JpZFJvdz4oKTtcclxuICBncmlkUm93RGVsZXRlZDogU3ViamVjdDxBdHRyaWJ1dGVWYWx1ZUdyaWRSb3c+ID0gbmV3IFN1YmplY3Q8QXR0cmlidXRlVmFsdWVHcmlkUm93PigpO1xyXG4gIGRpcnR5OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICB1cGRhdGVkQXR0cmlidXRlVmFsdWVzOiBBdHRyaWJ1dGVWYWx1ZVtdID0gW107XHJcbiAgc2xpY2VkQXR0cmlidXRlVmFsdWVzOiBBdHRyaWJ1dGVWYWx1ZVtdID0gW107XHJcblxyXG4gIHByaXZhdGUgdW5pcXVlSWQ6IG51bWJlciA9IDA7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZGljdGlvbmFyeVNlcnZpY2U6IERpY3Rpb25hcnlTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcclxuICAgICAgICAgICAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgICAgICAgICAgIEBJbmplY3QoQVRUUklCVVRFX0VORFBPSU5UKSBwcml2YXRlIGF0dHJpYnV0ZUVuZHBvaW50OiBzdHJpbmcpIHtcclxuICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICBjb25zb2xlLmRlYnVnKFwiQ3JlYXRlZCBOZXcgQXR0cmlidXRlU2VydmljZVwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldEJvdW5kRGF0YShib3VuZERhdGE6IGFueSkge1xyXG4gICAgdGhpcy5ib3VuZERhdGEgPSBib3VuZERhdGE7XHJcblxyXG4gICAgaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCkpIHtcclxuICAgICAgdGhpcy5ub3RpZnlBdHRyaWJ1dGVzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRBdHRyaWJ1dGVWYWx1ZUNvdW50QnlBdHRyaWJ1dGUoaWRBdHRyaWJ1dGU6IG51bWJlcik6IE9ic2VydmFibGU8bnVtYmVyPiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxudW1iZXI+KHRoaXMuYXR0cmlidXRlRW5kcG9pbnQgKyBcImF0dHJpYnV0ZS12YWx1ZS1jb3VudFwiLCB7cGFyYW1zOiBuZXcgSHR0cFBhcmFtcygpLnNldChcImlkQXR0cmlidXRlXCIsIGlkQXR0cmlidXRlLnRvU3RyaW5nKCkpfSk7XHJcbiAgfVxyXG5cclxuICBnZXRBdHRyaWJ1dGVWYWx1ZUNvdW50QnlDb250YWluZXIoaWRBdHRyaWJ1dGVDb250YWluZXI6IG51bWJlcik6IE9ic2VydmFibGU8bnVtYmVyPiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxudW1iZXI+KHRoaXMuYXR0cmlidXRlRW5kcG9pbnQgKyBcImF0dHJpYnV0ZS12YWx1ZS1jb3VudFwiLCB7cGFyYW1zOiBuZXcgSHR0cFBhcmFtcygpLnNldChcImlkQXR0cmlidXRlQ29udGFpbmVyXCIsIGlkQXR0cmlidXRlQ29udGFpbmVyLnRvU3RyaW5nKCkpfSk7XHJcbiAgfVxyXG5cclxuICBnZXREaWN0aW9uYXJ5VmFsdWVDb3VudChpZEF0dHJpYnV0ZURpY3Rpb25hcnk6IG51bWJlcik6IE9ic2VydmFibGU8bnVtYmVyPiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxudW1iZXI+KHRoaXMuYXR0cmlidXRlRW5kcG9pbnQgKyBcImF0dHJpYnV0ZS1kaWN0aW9uYXJ5LWNvdW50XCIsIHtwYXJhbXM6IG5ldyBIdHRwUGFyYW1zKCkuc2V0KFwiaWRBdHRyaWJ1dGVEaWN0aW9uYXJ5XCIsIGlkQXR0cmlidXRlRGljdGlvbmFyeS50b1N0cmluZygpKX0pO1xyXG4gIH1cclxuXHJcbiAgZmV0Y2hBdHRyaWJ1dGVDb250ZXh0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5hdHRyaWJ1dGVDb250ZXh0TG9hZGluZ1N1YmplY3QubmV4dCh0cnVlKTtcclxuXHJcbiAgICBmb3JrSm9pbihbXHJcbiAgICAgIHRoaXMuZGljdGlvbmFyeVNlcnZpY2UuZ2V0RGljdGlvbmFyeUVudHJpZXMoXCJoY2kucmkuYXR0ci5tb2RlbC5BdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRcIiksXHJcbiAgICAgIHRoaXMuZGljdGlvbmFyeVNlcnZpY2UuZ2V0RGljdGlvbmFyeUVudHJpZXMoXCJoY2kucmkuYXR0ci5tb2RlbC5BdHRyaWJ1dGVDb250ZXh0XCIpLFxyXG4gICAgICB0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlLmdldERpY3Rpb25hcnlFbnRyaWVzKFwiaGNpLnJpLmF0dHIubW9kZWwuRmlsdGVyMVwiKSxcclxuICAgICAgdGhpcy5kaWN0aW9uYXJ5U2VydmljZS5nZXREaWN0aW9uYXJ5RW50cmllcyhcImhjaS5yaS5hdHRyLm1vZGVsLkZpbHRlcjJcIiksXHJcbiAgICAgIHRoaXMuZGljdGlvbmFyeVNlcnZpY2UuZ2V0RGljdGlvbmFyeUVudHJpZXMoXCJoY2kucmkuYXR0ci5tb2RlbC5BdHRyaWJ1dGVEaWN0aW9uYXJ5XCIpXHJcbiAgICBdKS5zdWJzY3JpYmUoKHJlc3BvbnNlczogYW55W10pID0+IHtcclxuXHJcbiAgICAgIHRoaXMuZGljdGlvbmFyeUxpc3RTdWJqZWN0Lm5leHQocmVzcG9uc2VzWzRdKTtcclxuICAgICAgdGhpcy5maWx0ZXIxTGlzdFN1YmplY3QubmV4dChyZXNwb25zZXNbMl0pO1xyXG4gICAgICB0aGlzLmZpbHRlcjJMaXN0U3ViamVjdC5uZXh0KHJlc3BvbnNlc1szXSk7XHJcbiAgICAgIHRoaXMuYXR0cmlidXRlQ29udGV4dExpc3RTdWJqZWN0Lm5leHQocmVzcG9uc2VzWzFdKTtcclxuXHJcbiAgICAgIHJlc3BvbnNlc1swXS5zb3J0KHRoaXMuc29ydEF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dExpc3QpO1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dExpc3RTdWJqZWN0Lm5leHQocmVzcG9uc2VzWzBdKTtcclxuXHJcbiAgICAgIHRoaXMuYXR0cmlidXRlQ29udGV4dExvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvL0dldHMgdGhlIGRpY3Rpb25hcnkgZW50cmllcyBmcm9tIHRoZSBtYXAgKHNvIHdlIGRvbid0IGxvYWQgb3ZlciBhbmQgb3ZlciBhbmQgb3ZlciBmb3IgdGhlIHNhbWUgZGljdGlvbmFyeSlcclxuICBnZXREaWN0aW9uYXJ5RW50cmllcyhhdHRyaWJ1dGU6IEF0dHJpYnV0ZSwgdmFsdWVzOiBBdHRyaWJ1dGVWYWx1ZVtdLCBncm91cEF0dHJpYnV0ZVJvd0lkPzogbnVtYmVyLCByZWZlcmVuY2VkQXR0cmlidXRlVmFsdWU/OiBBdHRyaWJ1dGVWYWx1ZSk6IE9ic2VydmFibGU8RGljdGlvbmFyeUVudHJpZXNEVE8+IHtcclxuICAgIGxldCBicyA9IG5ldyBTdWJqZWN0PERpY3Rpb25hcnlFbnRyaWVzRFRPPigpO1xyXG5cclxuICAgIC8vSGFuZGxlIFhQQVRIXHJcbiAgICBpZiAoYXR0cmlidXRlLmF0dHJpYnV0ZURpY3Rpb25hcnkueHBhdGgpIHtcclxuICAgICAgbGV0IGVudHJpZXNEVE8gPSBuZXcgRGljdGlvbmFyeUVudHJpZXNEVE8oKTtcclxuICAgICAgbGV0IHhwYXRoID0gYXR0cmlidXRlLmF0dHJpYnV0ZURpY3Rpb25hcnkueHBhdGg7XHJcblxyXG4gICAgICAvL0ZpbHRlcmVkIGJ5IGFub3RoZXIgZGljdGlvbmFyeT8gUGFyc2UgdG8gZ2V0IGFycmF5IG9mIGFsbCBkaWN0aW9uYXJ5IGNsYXNzIG5hbWVzIG5lZWRlZFxyXG4gICAgICBsZXQgZGljdENsYXNzZXM6IHN0cmluZ1tdID0gW107XHJcbiAgICAgIGxldCBwb3MgPSAwO1xyXG4gICAgICB3aGlsZSAoeHBhdGguaW5kZXhPZihcIi9EaWN0aW9uYXJpZXMvRGljdGlvbmFyeVwiLCBwb3MpID49IDApIHtcclxuICAgICAgICBsZXQgc3RhcnQgPSB4cGF0aC5pbmRleE9mKFwiL0RpY3Rpb25hcmllcy9EaWN0aW9uYXJ5XCIsIHBvcyk7XHJcbiAgICAgICAgc3RhcnQgPSB4cGF0aC5pbmRleE9mKFwiJ1wiLCBzdGFydCk7XHJcbiAgICAgICAgbGV0IGVuZCA9IHhwYXRoLmluZGV4T2YoXCInXCIsIHN0YXJ0ICsgMSk7XHJcbiAgICAgICAgZGljdENsYXNzZXMucHVzaChhdHRyaWJ1dGUuYXR0cmlidXRlRGljdGlvbmFyeS54cGF0aC5zdWJzdHJpbmcoc3RhcnQgKyAxLCBlbmQpKVxyXG4gICAgICAgIHBvcyA9IGVuZDtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy9Qb3RlbnRpYWxseSBsb2FkIG11bHRpcGxlIGRpY3Rpb25hcmllc1xyXG4gICAgICBsZXQgZm9ya0NhbGxzID0gW107XHJcbiAgICAgIGZvciAobGV0IGNsYXNzTmFtZSBvZiBkaWN0Q2xhc3Nlcykge1xyXG4gICAgICAgIGZvcmtDYWxscy5wdXNoKHRoaXMuZGljdGlvbmFyeVNlcnZpY2UuZ2V0RGljdGlvbmFyeUVudHJpZXNBc1hNTChjbGFzc05hbWUpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy9EZWFsIHdpdGggdGhlIHJlc3VsdHMgdG9nZXRoZXJcclxuICAgICAgZm9ya0pvaW4oZm9ya0NhbGxzKS5zdWJzY3JpYmUoKHJlc3BvbnNlczogYW55W10pID0+IHtcclxuICAgICAgICAvL1dlJ3JlIG9ubHkgZ29pbmcgdG8gZG8geHBhdGggb24gdGhlIHhtbCBmb3IgdGhlIGZpcnN0IGRpY3Rpb25hcnlcclxuICAgICAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XHJcbiAgICAgICAgbGV0IGRvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcocmVzcG9uc2VzWzBdLCBcImFwcGxpY2F0aW9uL3htbFwiKTtcclxuXHJcbiAgICAgICAgLy9IYXZlIHRvIGV2YWx1YXRlIHN1Yi1leHByZXNzaW9uLiBUaGlzIGRvZXNuJ3QgYWN0dWFsbHkgc3VwcG9ydCBleHByZXNzaW9ucyBsaWtlIFtAeCA9ICgveHBhdGgtc3ViLWV4cHJlc3Npb24pXVxyXG4gICAgICAgIGxldCBzZWNvbmRhcnlYbWwgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlcy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICBzZWNvbmRhcnlYbWwgPSByZXNwb25zZXNbMV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL1ByZS1ldmFsdWF0ZSBhbmQgc2ltcGxpZnkgWFBBVEhcclxuICAgICAgICBsZXQgZHRvOlByZUV2YWxEVE8gPSB0aGlzLnByZUV2YWx1YXRlWHBhdGgoYXR0cmlidXRlLmF0dHJpYnV0ZURpY3Rpb25hcnkueHBhdGgsIHNlY29uZGFyeVhtbCwgZ3JvdXBBdHRyaWJ1dGVSb3dJZCwgcmVmZXJlbmNlZEF0dHJpYnV0ZVZhbHVlKTtcclxuXHJcbiAgICAgICAgLy9FdmFsdWF0ZSBYUEFUSCBleHByZXNzaW9uXHJcbiAgICAgICAgbGV0IGVudHJpZXMgPSBbXTtcclxuICAgICAgICBlbnRyaWVzRFRPLmVudHJpZXNJbmNsdWRlU2VsZWN0ZWRWYWx1ZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICB0cnl7XHJcbiAgICAgICAgICBsZXQgeFBhdGhSZXN1bHQgPSBkb2N1bWVudC5ldmFsdWF0ZShkdG8uZXhwcmVzc2lvbiwgZG9jLCBudWxsLCBYUGF0aFJlc3VsdC5BTllfVFlQRSwgbnVsbCk7XHJcblxyXG4gICAgICAgICAgLy9JdGVyYXRlIHhwYXRoIHJlc3VsdHMgKG5vZGVzKVxyXG4gICAgICAgICAgdmFyIG5vZGUgPSBudWxsO1xyXG4gICAgICAgICAgd2hpbGUobm9kZSA9IHhQYXRoUmVzdWx0Lml0ZXJhdGVOZXh0KCkpIHtcclxuXHJcbiAgICAgICAgICAgIGxldCBlbnRyeSA9IHRoaXMuZ2V0SnNvbkVudHJ5RnJvbU5vZGUobm9kZSk7XHJcbiAgICAgICAgICAgIGVudHJpZXMucHVzaChlbnRyeSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfWNhdGNoIChlKSB7XHJcbiAgICAgICAgICAvLyBObyBtYXRjaGluZyBlbnRyaWVzIGhlcmUuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL1doYXQgYWJvdXQgZGljdGlvbmFyeSBlbnRyaWVzIHdoZXJlIGlzQWN0aXZlPSdOJywgYnV0IHRoZSBpZCB3YXMgdXNlZCBpbiBhIHByZXZpb3VzbHkgc2F2ZWQgdmFsdWU/XHJcbiAgICAgICAgLy9XZSBhZGQgdGhhdCB2YWx1ZSB0byB0aGUgZHJvcGRvd24sIGluIHRoYXQgY2FzZSwgc28gaXQgY2FuIGJlIHNlbGVjdGVkXHJcbiAgICAgICAgLy9SZWZlcmVuY2VkQXR0cmlidXRlVmFsdWUgb25seSBnZXRzIHBhc3NlZCBpbiB3aGVuIHRoZSBmaWx0ZXIgYXR0cmlidXRlIGNoYW5nZXMuIEluIHRoYXQgc2NlbmFyaW8gd2UgZG8gbm90IHdhbnQgdG8gYWRkIHRoZSBvbGQgdmFsdWUgdG8gdGhlIGxpc3RcclxuICAgICAgICBpZiAoYXR0cmlidXRlLmlzTXVsdGlWYWx1ZSAhPT0gXCJZXCIpIHtcclxuICAgICAgICAgIGZvciAobGV0IGF2IG9mIHZhbHVlcykge1xyXG4gICAgICAgICAgICBsZXQgcHJlc2VudDpib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKGF2ICYmICEgcmVmZXJlbmNlZEF0dHJpYnV0ZVZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgZm9yKHZhciBpID0gZW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVudHJpZXNbaV0udmFsdWUgPT09IGF2LnZhbHVlSWREaWN0aW9uYXJ5KSB7XHJcbiAgICAgICAgICAgICAgICAgIHByZXNlbnQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgLy9JZiB0aGUgY3VycmVudGx5IHNhdmVkIHZhbHVlIGlzIG5vdCBpbiB0aGUgbGlzdCwgYWRkIGl0LlxyXG4gICAgICAgICAgICAgIGlmICghIHByZXNlbnQpIHtcclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgIGxldCB4cGF0aCA9IFwiL0RpY3Rpb25hcmllcy9EaWN0aW9uYXJ5W0BjbGFzc05hbWU9J1wiICsgYXR0cmlidXRlLmF0dHJpYnV0ZURpY3Rpb25hcnkuY2xhc3NOYW1lICsgXCInXS9EaWN0aW9uYXJ5RW50cnlbQHZhbHVlPSdcIiArIGF2LnZhbHVlSWREaWN0aW9uYXJ5ICsgXCInXVwiO1xyXG4gICAgICAgICAgICAgICAgLy9UaGUgZW50cnkgd2FzIHByb2JhYmx5IGFscmVhZHkgbG9hZGVkLCBidXQgZXhjbHVkZWQgYnkgdGhlIHhwYXRoLiBXZSBjYW4gdXNlIHRoYXQuXHJcbiAgICAgIFxyXG4gICAgICAgICAgICAgICAgbGV0IG5vZGUgPSBkb2N1bWVudC5ldmFsdWF0ZSh4cGF0aCwgZG9jLCBudWxsLCBYUGF0aFJlc3VsdC5BTllfVU5PUkRFUkVEX05PREVfVFlQRSwgbnVsbCkuc2luZ2xlTm9kZVZhbHVlO1xyXG4gICAgICAgICAgICAgICAgaWYgKG5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgZW50cmllcy5wdXNoKHRoaXMuZ2V0SnNvbkVudHJ5RnJvbU5vZGUobm9kZSkpO1xyXG4gICAgICAgICAgICAgICAgICBlbnRyaWVzRFRPLmVudHJpZXNJbmNsdWRlU2VsZWN0ZWRWYWx1ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgLy9TZXQgdGhlIGJlaGF2aW9yIHN1YmplY3Qgd2l0aCB0aGUgZmlsdGVyZWQgdmFsdWVzIGZvciB0aGUgZGljdGlvbmFyeVxyXG4gICAgICAgIGVudHJpZXNEVE8uZW50cmllcyA9IGVudHJpZXM7XHJcbiAgICAgICAgZW50cmllc0RUTy5yZWZlcmVuY2VkQXR0cmlidXRlID0gZHRvLnJlZmVyZW5jZWRBdHRyaWJ1dGU7XHJcbiAgICAgICAgYnMubmV4dChlbnRyaWVzRFRPKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgfVxyXG4gICAgLy9Ob24teHBhdGhcclxuICAgIGVsc2Uge1xyXG4gICAgICAvL0RpY3Rpb25heVNlcnZpY2UganVzdCB1c2VkIGh0dHAgZ2V0LCBzbyBzaG91bGQgbm90IG5lZWQgdG8gdW5zdWJzY3JpYmUsIHNpbmNlIGh0dHAgZG9lcyB0aGF0XHJcbiAgICAgIHRoaXMuZGljdGlvbmFyeVNlcnZpY2UuZ2V0RGljdGlvbmFyeURyb3Bkb3duRW50cmllcyhhdHRyaWJ1dGUuYXR0cmlidXRlRGljdGlvbmFyeS5jbGFzc05hbWUpLnN1YnNjcmliZSgoZW50cmllczogYW55W10pID0+IHtcclxuICAgICAgICAvL01ha2UgdmFsdWUgZmllbGRzXHJcbiAgICAgICAgZm9yKHZhciBpID0gZW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgZW50cmllc1tpXS52YWx1ZSA9IGVudHJpZXNbaV0uaWQudG9TdHJpbmcoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBlbnRyaWVzRFRPID0gbmV3IERpY3Rpb25hcnlFbnRyaWVzRFRPKCk7XHJcbiAgICAgICAgZW50cmllc0RUTy5lbnRyaWVzID0gZW50cmllcztcclxuICAgICAgICBlbnRyaWVzRFRPLmVudHJpZXNJbmNsdWRlU2VsZWN0ZWRWYWx1ZSA9IHRydWU7IC8vQSBiaXQgb2YgYW4gYXNzdW1wdGlvbiwgYnV0IGlmIGl0IGlzbid0IGZpbHRlcmVkLCBpdCBoYWQgYmV0dGVyIGluY2x1ZGUgYWxsIHRoZSB2YWx1ZXMhXHJcbiAgICAgICAgYnMubmV4dChlbnRyaWVzRFRPKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGJzO1xyXG4gIH1cclxuXHJcbiAgZ2V0SnNvbkVudHJ5RnJvbU5vZGUobm9kZTogYW55KTogYW55IHtcclxuICAgIC8vQ3JlYXRlIEpTT04gb2JqZWN0cyBmcm9tIHRoZSBub2Rlc1xyXG4gICAgbGV0IGVudHJ5OiBhbnkgPSB7fTtcclxuICAgIGZvcih2YXIgaSA9IG5vZGUuYXR0cmlidXRlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICBlbnRyeVtub2RlLmF0dHJpYnV0ZXNbaV0ubmFtZV0gPSBub2RlLmF0dHJpYnV0ZXNbaV0udmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGVudHJ5O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwcmVFdmFsdWF0ZVhwYXRoKHhwYXRoOiBzdHJpbmcsIHNlY29uZGFyeVhtbDogc3RyaW5nLCBncm91cEF0dHJpYnV0ZVJvd0lkOiBudW1iZXIsIHJlZmVyZW5jZWRBdHRyaWJ1dGVWYWx1ZTogQXR0cmlidXRlVmFsdWUpOiBQcmVFdmFsRFRPIHtcclxuICAgIGxldCBkdG86UHJlRXZhbERUTyA9IG5ldyBQcmVFdmFsRFRPKCk7XHJcblxyXG4gICAgLy9TZWN1cml0eUFkdmlzb3IvQGNvZGVDYW5jZXJHcm91cFxyXG4gICAgd2hpbGUgKHhwYXRoLmluZGV4T2YoXCIvU2VjdXJpdHlBZHZpc29yL0Bjb2RlQ2FuY2VyR3JvdXBcIikgPj0gMCkge1xyXG4gICAgICB4cGF0aCA9IHhwYXRoLnJlcGxhY2UoXCIvU2VjdXJpdHlBZHZpc29yL0Bjb2RlQ2FuY2VyR3JvdXBcIiwgXCInXCIgKyB0aGlzLmdldEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0KCkudmFsdWUuY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dCArIFwiJ1wiKTtcclxuICAgIH1cclxuXHJcbiAgICAvL1JlcGxhY2Ugc29tZSBvZiB0aGUgY29udGV4dCBwYXJhbWV0ZXJzICR7eC52YWx1ZX0gLSBUaGlzIGlzIG1vcmUgQWx0aW8gc3BlY2lmaWMgc3R1ZmYgdGhhdCB3YXMgdXNlZCBpbiBDQ1JcclxuICAgIGxldCBwYXJhbVBvcyA9IHhwYXRoLnNlYXJjaChcIlxcXFwke1tBLVphLXowLTlfXStcXFxcLnZhbHVlfVwiKTtcclxuICAgIHdoaWxlIChwYXJhbVBvcyA+PSAwKSB7XHJcbiAgICAgIGxldCBwcmVmaXggPSB4cGF0aC5zdWJzdHJpbmcoMCwgcGFyYW1Qb3MpO1xyXG4gICAgICBsZXQgdmFyTmFtZSA9IHhwYXRoLnN1YnN0cmluZyhwYXJhbVBvcyArIDIsIHhwYXRoLmluZGV4T2YoXCIuXCIsIHBhcmFtUG9zKSk7XHJcbiAgICAgIGxldCBzdWZmaXggPSB4cGF0aC5zdWJzdHJpbmcoeHBhdGguaW5kZXhPZihcIn1cIiwgcGFyYW1Qb3MpICsgMSk7XHJcblxyXG4gICAgICB2YXIgYXY7XHJcblxyXG4gICAgICAvL0lmIHRoZXJlIElTIGEgcmVmZXJlbmNlZEF0dHJpYnV0ZVZhbHVlLCB3ZSBjYW4gdXNlIHRoZSB2YWx1ZSBkaXJlY3RseS4gT3RoZXJ3aXNlIHdlIHRyeSB0byBmaW5kIGl0IGluIHRoZSBBVlNcclxuICAgICAgaWYgKCEgcmVmZXJlbmNlZEF0dHJpYnV0ZVZhbHVlKSB7XHJcblxyXG4gICAgICAgIC8vRmluZCB0aGUgYXR0cmlidXRlLCBtYXRjaGluZyB0aGUgdmFyTmFtZS5cclxuICAgICAgICAvL0RvIHRoaXMgZmlyc3QsIHNvIHdlIGdldCBhIHJlZmVyZW5jZSB0byB0aGUgcmVsYXRlZCBhdHRyaWJ1dGUsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGVyZSBpcyBhbHJlYWR5IGEgdmFsdWVcclxuXHJcbiAgICAgICAgLy9JdGVyYXRlIGF0dHJpYnV0ZXMgdG8gZmluZCBvbmUgdGhhdCBtYXRjaGVzIHRoZSB2YWx1ZVxyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlTWFwLmZvckVhY2goKGF0dHJpYnV0ZTogQXR0cmlidXRlKSA9PiB7XHJcbiAgICAgICAgICAvL0F0dHJpYnV0ZXMgdGhhdCBtYXRjaCB0aGUgbmFtZVxyXG4gICAgICAgICAgaWYgKGF0dHJpYnV0ZS5hdHRyaWJ1dGVOYW1lID09PSB2YXJOYW1lKSB7XHJcbiAgICAgICAgICAgIGR0by5yZWZlcmVuY2VkQXR0cmlidXRlID0gYXR0cmlidXRlO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy9JZiB0aGlzIGlzIGEgZ3JpZCwgbG9vayBmb3IgYXR0cmlidXRlcyBpbiB0aGUgcm93XHJcbiAgICAgICAgICBpZiAoYXR0cmlidXRlLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgZ3JpZENvbHVtbkF0dHJpYnV0ZSAgb2YgYXR0cmlidXRlLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgICAgICAvL0lmIHRoZSBuYW1lIG1hdGNoZXMgQU5EIHRoZSB2YWx1ZSBpbiB0aGUgQVZTIHdhcyBwYXJ0IG9mIHRoZSBTQU1FIFJPVyB3ZSBhcmUgZXZhbHVhdGluZyBYUEFUSCBmb3IsIHdlIGNhbiB1c2UgdGhlIHZhbHVlIGZvciBldmFsdWF0aW9uXHJcbiAgICAgICAgICAgICAgaWYgKGdyaWRDb2x1bW5BdHRyaWJ1dGUuYXR0cmlidXRlTmFtZSA9PT0gdmFyTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgZHRvLnJlZmVyZW5jZWRBdHRyaWJ1dGUgPSBncmlkQ29sdW1uQXR0cmlidXRlO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuXHJcblxyXG4gICAgICAgIGxldCBhdnMgPSB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5nZXRWYWx1ZSgpO1xyXG4gICAgICAgIC8vSWYgd2UgZm91bmQgdGhlIGF0dHJpYnV0ZSBhbmQgaGF2ZSB2YWx1ZXMuLi5cclxuICAgICAgICBpZiAoZHRvLnJlZmVyZW5jZWRBdHRyaWJ1dGUgJiYgYXZzKSB7XHJcblxyXG4gICAgICAgICAgLy9Mb29rIHRocm91Z2ggYWxsIHRoZSB2YWx1ZXMgdG8gZmluZCB0aGUgb25lIGZvciB0aGUgcmVmZXJlbmNlZCBhdHRyaWJ1dGUgKGFuZCBTQU1FIGdyaWQgcm93IGlmIGluIGEgZ3JpZCByb3cpXHJcbiAgICAgICAgICBhdiA9IGF2cy5hdHRyaWJ1dGVWYWx1ZXMuZmluZCgoYXYpID0+IHtcclxuXHJcbiAgICAgICAgICAgIC8vSWYgdGhpcyBpcyBhbiBBViBmb3IgYSBncmlkIHJvdywgaXQgbXVzdCBiZSBmb3IgdGhlIHNhbWUgZ3JpZCByb3cgd2UgYXJlIGxvb2tpbmcgZm9yXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYXYuZ3JvdXBBdHRyaWJ1dGVSb3dJZCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGdyb3VwQXR0cmlidXRlUm93SWQgIT09ICd1bmRlZmluZWQnICYmIGF2Lmdyb3VwQXR0cmlidXRlUm93SWQgIT09IGdyb3VwQXR0cmlidXRlUm93SWQpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICAvL0lmIHdlIGxvb2tlZCB1cCB0aGUgYXR0cmlidXRlIG1hdGNoaW5nIHRoZSB2YWx1ZSBieSBpZCBBTkQgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBpcyB0aGUgb25lIHdlIGFyIGxvb2tpbmcgZm9yIGZyb20gdGhlIFhQQVRILCB3ZSBjYW4gdXNlIGl0IGZvciBldmFsdWF0aW9uXHJcbiAgICAgICAgICAgICAvL0ZvdW5kIGFuIEF0dHJpYnV0ZVZhbHVlIHRoYXQgdGhlIGRpY3Rpb25hcnkgaXMgZmlsdGVyZWQgYnlcclxuICAgICAgICAgICAgaWYgKGR0by5yZWZlcmVuY2VkQXR0cmlidXRlLmlkQXR0cmlidXRlID09PSBhdi5pZEF0dHJpYnV0ZSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vVXNlIHRoZSByZWZlcmVuY2VkQXR0cmlidXRlVmFsdWUgaWYgcHJvdmlkZWQgKHRoaXMgaGFwcGVucyB3aGVuIGFscmVhZHkga25vd24sIGR1cmluZyBjaGFuZ2VzIHRvIHRoZSByZWZlcmVuY2VkIGF0dHJpYnV0ZSlcclxuICAgICAgaWYgKHJlZmVyZW5jZWRBdHRyaWJ1dGVWYWx1ZSkge1xyXG4gICAgICAgIHhwYXRoID0gcHJlZml4ICsgXCInXCIgKyByZWZlcmVuY2VkQXR0cmlidXRlVmFsdWUudmFsdWUgKyBcIidcIiArIHN1ZmZpeDtcclxuICAgICAgfVxyXG4gICAgICAvL0ZvdW5kIHRoZSBBdHRyaWJ1dGVWYWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZSB0aGF0IHRoZSBkaWN0aW9uYXJ5IGlzIGZpbHRlcmVkIGJ5XHJcbiAgICAgIGVsc2UgaWYgKGF2KSB7XHJcbiAgICAgICAgeHBhdGggPSBwcmVmaXggKyBcIidcIiArIGF2LnZhbHVlICsgXCInXCIgKyBzdWZmaXg7XHJcbiAgICAgIH1cclxuICAgICAgLy9EaWRuJ3QgZmluZCBhbiBhdHRyaWJ1dGUgZm9yIHZhck5hbWVcclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgLy9NYXliZSB0aGUgdmFyTmFtZSBpcyBmcm9tIGVsc2V3aGVyZSBpbiB0aGUgYXBwIChub24tQ09EKSwgYW5kIHByb3ZpZGVkIGluIGJvdW5kRGF0YVxyXG4gICAgICAgIGlmICh0aGlzLmJvdW5kRGF0YSAmJiB0aGlzLmJvdW5kRGF0YVt2YXJOYW1lXSkge1xyXG4gICAgICAgICAgeHBhdGggPSBwcmVmaXggKyBcIidcIiArIHRoaXMuYm91bmREYXRhW3Zhck5hbWVdICsgXCInXCIgKyBzdWZmaXg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vTm90aGluZyBtYXRjaGVzLiBDaGFuZ2UgdG8gZW1wdHkgc3RyaW5nLiBXaWxsIHByb2JhYmx5IHJlc3VsdCBpbiBOTyBlbnRyaWVzLCB3aGljaCB3b3VsZCBiZSBjb3JyZWN0LlxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgeHBhdGggPSBwcmVmaXggKyBcIicnXCIgKyBzdWZmaXg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBwYXJhbVBvcyA9IHhwYXRoLnNlYXJjaChcIlxcXFwke1tBLVphLXowLTlfXStcXFxcLnZhbHVlfVwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvL0hhdmUgdG8gZXZhbHVhdGUgc3ViLWV4cHJlc3Npb24uIFRoaXMgaGFuZGxlcyBleHByZXNzaW9ucyBsaWtlIFtAeCA9ICgveHBhdGgtc3ViLWV4cHJlc3Npb24pXVxyXG4gICAgbGV0IGluRXhwcmVzc2lvblBvcyA9IHhwYXRoLnNlYXJjaChcIlxcXFxbQFtBLVphLXowLTlfXStcXFxccyo9XFxcXHMqXFxcXChcIik7XHJcblxyXG4gICAgaWYgKGluRXhwcmVzc2lvblBvcyA+IDAgJiYgc2Vjb25kYXJ5WG1sKSB7XHJcbiAgICAgIGxldCBwcmVmaXggPSB4cGF0aC5zdWJzdHJpbmcoMCwgaW5FeHByZXNzaW9uUG9zICsgMSk7XHJcbiAgICAgIGxldCBleHByZXNzaW9uRW5kID0geHBhdGguaW5kZXhPZihcIilcIiwgaW5FeHByZXNzaW9uUG9zKTtcclxuICAgICAgbGV0IHZhcmlhYmxlID0geHBhdGguc3Vic3RyaW5nKGluRXhwcmVzc2lvblBvcyArIDEsIHhwYXRoLmluZGV4T2YoXCI9XCIsIGluRXhwcmVzc2lvblBvcykpO1xyXG4gICAgICBsZXQgc3ViRXhwcmVzc2lvbiA9IHhwYXRoLnN1YnN0cmluZyh4cGF0aC5pbmRleE9mKFwiKFwiLCBpbkV4cHJlc3Npb25Qb3MpICsgMSwgZXhwcmVzc2lvbkVuZCk7XHJcbiAgICAgIGxldCBzdWZmaXggPSB4cGF0aC5zdWJzdHJpbmcoZXhwcmVzc2lvbkVuZCArIDEpO1xyXG5cclxuICAgICAgeHBhdGggPSBwcmVmaXg7XHJcblxyXG4gICAgICAvL0V2YWx1YXRlIFhQQVRIIGV4cHJlc3Npb25cclxuICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xyXG4gICAgICBsZXQgZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhzZWNvbmRhcnlYbWwsIFwiYXBwbGljYXRpb24veG1sXCIpO1xyXG4gICAgICBsZXQgeFBhdGhSZXN1bHQgPSBkb2N1bWVudC5ldmFsdWF0ZShzdWJFeHByZXNzaW9uLCBkb2MsIG51bGwsIFhQYXRoUmVzdWx0LkFOWV9UWVBFLCBudWxsKTtcclxuXHJcbiAgICAgIC8vSXRlcmF0ZSB4cGF0aCByZXN1bHRzIChub2RlcylcclxuICAgICAgdmFyIG5vZGUgPSB4UGF0aFJlc3VsdC5pdGVyYXRlTmV4dCgpO1xyXG5cclxuICAgICAgd2hpbGUobm9kZSkge1xyXG4gICAgICAgIHhwYXRoID0geHBhdGggKyB2YXJpYWJsZSArIFwiPSdcIiArIG5vZGUubm9kZVZhbHVlICsgXCInXCJcclxuXHJcbiAgICAgICAgbm9kZSA9IHhQYXRoUmVzdWx0Lml0ZXJhdGVOZXh0KCk7XHJcblxyXG4gICAgICAgIGlmIChub2RlKSB7XHJcbiAgICAgICAgICB4cGF0aCA9IHhwYXRoICsgXCIgb3IgXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB4cGF0aCA9IHhwYXRoICsgc3VmZml4O1xyXG4gICAgfVxyXG5cclxuICAgIGR0by5leHByZXNzaW9uID0geHBhdGg7XHJcbiAgICByZXR1cm4gZHRvO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzb3J0QXR0cmlidXRlU2VjdXJpdHlDb250ZXh0TGlzdChhOiBhbnksIGI6IGFueSkge1xyXG4gICAgcmV0dXJuIGEuZGVzY3JpcHRpb24udG9Mb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKGIuZGVzY3JpcHRpb24udG9Mb3dlckNhc2UoKSk7XHJcbiAgfVxyXG5cclxuICBmZXRjaEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25MaXN0KGNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQ/OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICBjb25zb2xlLmRlYnVnKFwiZmV0Y2hBdHRyaWJ1dGVDb25maWd1cmF0aW9uTGlzdDogXCIgKyBjb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25MaXN0TG9hZGluZ1N1YmplY3QubmV4dCh0cnVlKTtcclxuXHJcbiAgICBsZXQgdXJsOiBzdHJpbmcgPSB0aGlzLmF0dHJpYnV0ZUVuZHBvaW50ICsgXCJjb25maWd1cmF0aW9uc1wiO1xyXG4gICAgbGV0IHBhcmFtczogSHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XHJcbiAgICBpZiAoY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dCkge1xyXG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KFwiY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dFwiLCBjb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmh0dHAuZ2V0PEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25bXT4odXJsLCB7cGFyYW1zOiBwYXJhbXN9KS5zdWJzY3JpYmUoKGNvbmZpZ3VyYXRpb25MaXN0OiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uW10pID0+IHtcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uTGlzdExvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG5cclxuICAgICAgbGV0IGR0b3M6IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE9bXSA9IFtdO1xyXG4gICAgICBmb3IgKGxldCBjZmcgb2YgY29uZmlndXJhdGlvbkxpc3QpIHtcclxuICAgICAgICBsZXQgZHRvOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPID0gdGhpcy5nZXRBdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPKGNmZyk7XHJcbiAgICAgICAgaWYgKGR0bykge1xyXG4gICAgICAgICAgZHRvcy5wdXNoKGR0byk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBkdG9zLnNvcnQodGhpcy5zb3J0QXR0cmlidXRlQ29uZmlndXJhdGlvbkxpc3QpO1xyXG5cclxuICAgICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uTGlzdFN1YmplY3QubmV4dChkdG9zKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzb3J0QXR0cmlidXRlQ29uZmlndXJhdGlvbkxpc3QoYTogQXR0cmlidXRlQ29uZmlndXJhdGlvbkRUTywgYjogQXR0cmlidXRlQ29uZmlndXJhdGlvbkRUTykge1xyXG4gICAgY29uc3QgZGlzcGxheWEgPSBhLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHREaXNwbGF5XHJcbiAgICAgICsgYS5leHRlbnNpb25EZXNjcmlwdGlvblxyXG4gICAgICArIChhLmZpbHRlcjFEaXNwbGF5IHx8IFwiXCIpXHJcbiAgICAgICsgKGEuZmlsdGVyMkRpc3BsYXkgfHwgXCJcIik7XHJcblxyXG4gICAgY29uc3QgZGlzcGxheWIgPSBiLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHREaXNwbGF5XHJcbiAgICAgICsgYi5leHRlbnNpb25EZXNjcmlwdGlvblxyXG4gICAgICArIChiLmZpbHRlcjFEaXNwbGF5IHx8IFwiXCIpXHJcbiAgICAgICsgKGIuZmlsdGVyMkRpc3BsYXkgfHwgXCJcIik7XHJcblxyXG4gICAgcmV0dXJuIGRpc3BsYXlhLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShkaXNwbGF5Yi50b0xvd2VyQ2FzZSgpKTtcclxuICB9XHJcblxyXG4gIC8vVXNlZCBieSBjb2QtZWRpdG9yXHJcbiAgY2xlYXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbiA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuaWRGaWx0ZXIxID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5pZEZpbHRlcjIgPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPU3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XHJcbiAgICB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcclxuICB9XHJcblxyXG4gIGNyZWF0ZUF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24oYXR0cmlidXRlQ29uZmlndXJhdGlvbjogQXR0cmlidXRlQ29uZmlndXJhdGlvbik6IHZvaWQge1xyXG4gICAgYXR0cmlidXRlQ29uZmlndXJhdGlvbi5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgdGhpcy5odHRwLnBvc3Q8QXR0cmlidXRlQ29uZmlndXJhdGlvbj4odGhpcy5hdHRyaWJ1dGVFbmRwb2ludCArIFwiY29uZmlndXJhdGlvbnNcIiwgYXR0cmlidXRlQ29uZmlndXJhdGlvbikuc3Vic2NyaWJlKChhdHRyaWJ1dGVDb25maWd1cmF0aW9uOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uKSA9PiB7XHJcbiAgICAgIHRoaXMuaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uID0gYXR0cmlidXRlQ29uZmlndXJhdGlvbi5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb247XHJcblxyXG4gICAgICB0aGlzLnBvc3RDb25maWd1cmF0aW9uU3ViamVjdC5uZXh0KHRydWUpO1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0Lm5leHQoYXR0cmlidXRlQ29uZmlndXJhdGlvbik7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwoXCIvZWRpdG9yL2F0dHJpYnV0ZS1jb25maWd1cmF0aW9uL1wiICsgYXR0cmlidXRlQ29uZmlndXJhdGlvbi5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZXRBdHRyaWJ1dGVDb25maWd1cmF0aW9uQnlJZChpZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb246IG51bWJlciwgaWRBdHRyaWJ1dGVWYWx1ZVNldDogbnVtYmVyLCBpZFBhcmVudE9iamVjdDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uICE9PSAtMSkge1xyXG4gICAgICB0aGlzLm5ld0F0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy9Pbmx5IGxvYWQgaWYgdGhlIEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gaGFzIGNoYW5nZWRcclxuICAgIGlmICh0aGlzLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbiAhPT0gaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgIC8vQ2xlYXIgQVNBUFxyXG4gICAgICB0aGlzLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbiA9IGlkQXR0cmlidXRlQ29uZmlndXJhdGlvbjtcclxuICAgICAgdGhpcy5pZEF0dHJpYnV0ZVZhbHVlU2V0ID0gaWRBdHRyaWJ1dGVWYWx1ZVNldDtcclxuICAgICAgdGhpcy5pZEZpbHRlcjEgPSB1bmRlZmluZWQ7XHJcbiAgICAgIHRoaXMuaWRGaWx0ZXIyID0gdW5kZWZpbmVkO1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZU1hcC5jbGVhcigpO1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE9TdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XHJcblxyXG4gICAgICB0aGlzLmZldGNoQXR0cmlidXRlQ29uZmlndXJhdGlvbihpZEF0dHJpYnV0ZVZhbHVlU2V0LCBpZFBhcmVudE9iamVjdCk7XHJcbiAgICB9XHJcbiAgICAvL09yIGxvYWQgdGhlIEF0dHJpYnV0ZVZhbHVlU2V0IGlmIHRoYXQgY2hhbmdlZCAocG9zc2libGUgdG8gc3dpdGNoIGZyb20gb25lIGV2ZW50IHRvIGFub3RoZXIgb2YgdGhlIHNhbWUgdHlwZSwgZm9yIGV4YW1wbGVcclxuICAgIC8vVGhlIEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gbXVzdCBhbHNvIGhhdmUgZmluaXNoZWQgbG9hZGluZyBhbmQgbm90IGFscmVhZHkgd29ya2luZyBvbiBsb2FkaW5nIHRoZSB2YWx1ZXNcclxuICAgIGVsc2UgaWYgKHRoaXMuaWRBdHRyaWJ1dGVWYWx1ZVNldCAhPT0gaWRBdHRyaWJ1dGVWYWx1ZVNldCAmJiB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0LmdldFZhbHVlKCkpIHtcclxuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVWYWx1ZVNldChpZEF0dHJpYnV0ZVZhbHVlU2V0LCBpZFBhcmVudE9iamVjdCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIGF0dHJpYnV0ZSBjb25maWd1cmF0aW9uIGlkZW50aWZpZXJzIHRvIGJlIHVzZWQgYnkgdGhpcyBzZXJ2aWNlLiAgVGhpcyBwcm9tcHRzIGEgbmV3IGNvbmZpZ3VyYXRpb25cclxuICAgKiByZXF1ZXN0IHRvIGJlIG1hZGUuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gaWRGaWx0ZXIxXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkRmlsdGVyMlxyXG4gICAqL1xyXG4vKiBUaGlzIGlzIGNvbW1lbnRlZCBvdXQgZm9yIG5vdyBiZWNhdXNlIGl0IGlzIGJvdGggdW5pbXBsZW1lbnRlZCBhbmQgaW5jb21wbGV0ZSAobG9hZGluZyBhIGNvbmZpZ3VyYXRpb25cclxuICogZmlsdGVyIHdvdWxkIHJlYWxseSBhbHNvIHJlcXVpcmUgdGhlIGF0dHJpYnV0ZSBjb250ZXh0IGFuZCBhdHRyaWJ1dGVzZWN1cml0eSBjb250ZXh0IHBsdXMgYSBzZXJ2aWNlIG9uXHJcbiAqIHRoZSBiYWNrIGVuZCB0aGF0IGFjdHVhbGx5IGRvZXMgdGhpcyB3b3JrLiBGb3Igbm93LCBvbmx5IGxvYWRpbmcgYnkgaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uXHJcbiAqXHJcbiAgc2V0QXR0cmlidXRlQ29uZmlndXJhdGlvbkJ5RmlsdGVyKGlkRmlsdGVyMTogbnVtYmVyLCBpZEZpbHRlcjI/OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICBjb25zb2xlLmRlYnVnKFwic2V0QXR0cmlidXRlQ29uZmlndXJhdGlvbkJ5RmlsdGVyOiBcIiArIGlkRmlsdGVyMSArIFwiIFwiICsgaWRGaWx0ZXIyKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm5ld0F0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gPSB1bmRlZmluZWQ7XHJcbiAgICAvL3RoaXMuaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5pZEZpbHRlcjEgPSBpZEZpbHRlcjE7XHJcbiAgICB0aGlzLmlkRmlsdGVyMiA9IGlkRmlsdGVyMjtcclxuXHJcbiAgICB0aGlzLmZldGNoQXR0cmlidXRlQ29uZmlndXJhdGlvbigpO1xyXG4gIH1cclxuKi9cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgaWQgb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBzZXQuICBUaGlzIHdpbGwgcHJvbXB0IGEgcmVxdWVzdCB0byBwdWxsIHRoaXMgZnJvbSB0aGUgYmFja2VuZC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpZEF0dHJpYnV0ZVZhbHVlU2V0XHJcbiAgICovXHJcbiAgc2V0QXR0cmlidXRlVmFsdWVTZXQoaWRBdHRyaWJ1dGVWYWx1ZVNldDogbnVtYmVyLCBpZFBhcmVudE9iamVjdDogbnVtYmVyKSB7XHJcbiAgICAvL09ubHkgbG9hZCB0aGUgQXR0cmlidXRlVmFsdWVTZXQgaWYgaXQgaGFzIGJlZW4gY2hhbmdlZFxyXG4gICAgaWYgKHRoaXMuaWRBdHRyaWJ1dGVWYWx1ZVNldCAhPT0gaWRBdHRyaWJ1dGVWYWx1ZVNldCkge1xyXG4gICAgICB0aGlzLmlkQXR0cmlidXRlVmFsdWVTZXQgPSBpZEF0dHJpYnV0ZVZhbHVlU2V0O1xyXG5cclxuICAgICAgdGhpcy5mZXRjaEF0dHJpYnV0ZVZhbHVlU2V0KGlkUGFyZW50T2JqZWN0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSByZXF1ZXN0IHRvIGRvd25sb2FkIHRoZSBhdHRyaWJ1dGUgY29uZmlndXJhdGlvbi5cclxuICAgKi9cclxuICBmZXRjaEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24oaWRBdHRyaWJ1dGVWYWx1ZVNldDogbnVtYmVyLCBpZFBhcmVudE9iamVjdDogbnVtYmVyKTogdm9pZCB7XHJcblxyXG4gICAgaWYgKHRoaXMubmV3QXR0cmlidXRlQ29uZmlndXJhdGlvbikge1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE9TdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdC5uZXh0KHRoaXMubmV3QXR0cmlidXRlQ29uZmlndXJhdGlvbik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gPT09IC0xKSB7XHJcbiAgICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvbkRUT1N1YmplY3QubmV4dCh1bmRlZmluZWQpO1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0Lm5leHQoPEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24+e1xyXG4gICAgICAgIGlkQXR0cmlidXRlQ29uZmlndXJhdGlvbjogLTJcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XHJcblxyXG4gICAgbGV0IHVybDogc3RyaW5nO1xyXG4gICAgaWYgKHRoaXMuaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uICYmIHRoaXMuaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uID4gLTEpIHtcclxuICAgICAgdXJsID0gdGhpcy5hdHRyaWJ1dGVFbmRwb2ludCArIFwiY29uZmlndXJhdGlvbnMvXCIgKyB0aGlzLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vVGhpcyBpcyBub3QgZnVsbHkgaW1wbGVtZW50ZWRcclxuXHQgIC8vdXJsID0gdGhpcy5hdHRyaWJ1dGVFbmRwb2ludCArIFwiY29uZmlndXJhdGlvbnMvZmlsdGVyL1wiICsgdGhpcy5pZEZpbHRlcjE7XHJcbiAgICAgIC8vaWYgKHRoaXMuaWRGaWx0ZXIyKSB7XHJcbiAgICAgICAgLy91cmwgKz0gXCIvXCIgKyB0aGlzLmlkRmlsdGVyMjtcclxuICAgICAgLy99XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5odHRwLmdldDxBdHRyaWJ1dGVDb25maWd1cmF0aW9uPih1cmwpLnN1YnNjcmliZSgoYXR0cmlidXRlQ29uZmlndXJhdGlvbjogQXR0cmlidXRlQ29uZmlndXJhdGlvbikgPT4ge1xyXG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24oYXR0cmlidXRlQ29uZmlndXJhdGlvbik7XHJcbiAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XHJcblxyXG4gICAgICAvL05vdyBsb2FkIHRoZSBhdHRyaWJ1dGVWYWx1ZVNldCAtIFRoaXMgd2lsbCBhbHdheXMgaGFwcGVuIHdoZW4gYSBuZXcgY29uZmlndXJhdGlvbiBpcyBsb2FkZWRcclxuICAgICAgdGhpcy5pZEF0dHJpYnV0ZVZhbHVlU2V0ID0gdW5kZWZpbmVkOyAvL0ZvcmNlIGl0IHRvIGNoYW5nZSBpbiB0aGlzIHNjZW5hcmlvXHJcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlVmFsdWVTZXQoaWRBdHRyaWJ1dGVWYWx1ZVNldCwgaWRQYXJlbnRPYmplY3QpO1xyXG4gICAgICB0aGlzLmRpcnR5Lm5leHQoZmFsc2UpO1xyXG4gICAgfSxcclxuICAgIChlcnJvcikgPT4ge1xyXG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVDb25maWd1cmF0aW9uKHVuZGVmaW5lZCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNldEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24oYXR0cmlidXRlQ29uZmlndXJhdGlvbjogQXR0cmlidXRlQ29uZmlndXJhdGlvbik6IHZvaWQge1xyXG4gICAgdGhpcy5hdHRyaWJ1dGVNYXAuY2xlYXIoKTtcclxuXHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhcIkF0dHJpYnV0ZVNlcnZpY2Uuc2V0QXR0cmlidXRlQ29uZmlndXJhdGlvblwiKTtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhhdHRyaWJ1dGVDb25maWd1cmF0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoYXR0cmlidXRlQ29uZmlndXJhdGlvbikge1xyXG4gICAgICBpZiAoYXR0cmlidXRlQ29uZmlndXJhdGlvbi5iYXNlV2luZG93VGVtcGxhdGUpIHtcclxuICAgICAgICB0aGlzLmdldEJhc2VXaW5kb3dEaW1lbnNpb24oYXR0cmlidXRlQ29uZmlndXJhdGlvbi5iYXNlV2luZG93VGVtcGxhdGUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoYXR0cmlidXRlQ29uZmlndXJhdGlvbi5hdHRyaWJ1dGVDb250YWluZXJzKSB7XHJcbiAgICAgICAgYXR0cmlidXRlQ29uZmlndXJhdGlvbi5hdHRyaWJ1dGVDb250YWluZXJzLnNvcnQoKGE6IEF0dHJpYnV0ZUNvbnRhaW5lciwgYjogQXR0cmlidXRlQ29udGFpbmVyKSA9PiB7XHJcbiAgICAgICAgICBpZiAoYS5zb3J0T3JkZXIgPCBiLnNvcnRPcmRlcikge1xyXG4gICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGEuc29ydE9yZGVyID4gYi5zb3J0T3JkZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChsZXQgYXR0cmlidXRlQ29udGFpbmVyIG9mIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uYXR0cmlidXRlQ29udGFpbmVycykge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEZpcnN0IHNvcnQgYXR0cmlidXRlcyB1c2luZyB0aGUgeSBhbmQgeCBwb3NpdGlvbmluZy4gIElmIHVzaW5nIGFic29sdXRlIHBvc2l0aW9uLCB0aGUgb3JkZXIgZG9lc24ndCBtYXR0ZXIsXHJcbiAgICAgICAgICogYnV0IGlmIHdlIHdhbnQgdGhlIGFic29sdXRlIHBvc2l0aW9uaW5nIHRvIGd1aWRlIGF1dG8gbGF5b3V0LCB0aGVuIHVzZSB0aGlzIG9yZGVyLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGF0dHJpYnV0ZUNvbnRhaW5lci5ncmFwaGljYWxBdHRyaWJ1dGVzLnNvcnQoKGE6IEdyYXBoaWNhbEF0dHJpYnV0ZSwgYjogR3JhcGhpY2FsQXR0cmlidXRlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoYS50YWJPcmRlciA8IGIudGFiT3JkZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChhLnRhYk9yZGVyID4gYi50YWJPcmRlcikge1xyXG4gICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBhdHRyaWJ1dGUgb2YgYXR0cmlidXRlQ29udGFpbmVyLmdyYXBoaWNhbEF0dHJpYnV0ZXMpIHtcclxuICAgICAgICAgIHRoaXMuYXR0cmlidXRlTWFwLnNldChhdHRyaWJ1dGUuaWRBdHRyaWJ1dGUsIGF0dHJpYnV0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPU3ViamVjdC5uZXh0KHRoaXMuZ2V0QXR0cmlidXRlQ29uZmlndXJhdGlvbkRUTyhhdHRyaWJ1dGVDb25maWd1cmF0aW9uKSk7XHJcbiAgICB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0Lm5leHQoYXR0cmlidXRlQ29uZmlndXJhdGlvbik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgcmVxdWVzdCB0byBwdWxsIHRoZSBhdHRyaWJ1dGUgdmFsdWUgc2V0LlxyXG4gICAqIFJlcXVpcmVkIHRoZSBBdHRyaWJ1dGVDb25maWd1cmF0aW9uIHRvIGJlIHByZS1sb2FkZWRcclxuICAgKi9cclxuICBmZXRjaEF0dHJpYnV0ZVZhbHVlU2V0KGlkUGFyZW50T2JqZWN0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dCh0cnVlKTtcclxuICAgIHRoaXMuaWRQYXJlbnRPYmplY3QgPSBpZFBhcmVudE9iamVjdDtcclxuXHJcbiAgICBsZXQgdXJsOiBzdHJpbmcgPSB0aGlzLmF0dHJpYnV0ZUVuZHBvaW50ICsgXCJhdHRyaWJ1dGUtdmFsdWUtc2V0L1wiICsgdGhpcy5pZEF0dHJpYnV0ZVZhbHVlU2V0O1xyXG5cclxuICAgIGxldCBhYzogQXR0cmlidXRlQ29uZmlndXJhdGlvbiA9IHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3QuZ2V0VmFsdWUoKTtcclxuXHJcbiAgICBsZXQgcXVlcnlQYXJhbXM6IEh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpXHJcbiAgICAuc2V0KFwiY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dFwiLCBhYy5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0KVxyXG4gICAgLnNldChcImNvZGVBdHRyaWJ1dGVDb250ZXh0XCIsIGFjLmNvZGVBdHRyaWJ1dGVDb250ZXh0KVxyXG4gICAgLnNldChcImlkUGFyZW50T2JqZWN0XCIsIChpZFBhcmVudE9iamVjdCk/aWRQYXJlbnRPYmplY3QudG9TdHJpbmcoKTpcIlwiKTtcclxuXHJcbiAgICAvL0NsZWFyIEFTQVBcclxuICAgIHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzID0gW107XHJcbiAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMgPSBbXTtcclxuICAgIHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcclxuXHJcbiAgICB0aGlzLmh0dHAuZ2V0PEF0dHJpYnV0ZVZhbHVlU2V0Pih1cmwsIHtwYXJhbXM6IHF1ZXJ5UGFyYW1zfSkuc3Vic2NyaWJlKChhdHRyaWJ1dGVWYWx1ZVNldDogQXR0cmlidXRlVmFsdWVTZXQpID0+IHtcclxuICAgICAgLy9Jbml0aWFsaXplIGF0dHJpYnV0ZVZhbHVlcyBpZiBpdCBkb2VzIG5vdCBleGlzdFxyXG4gICAgICBpZiAoISBhdHRyaWJ1dGVWYWx1ZVNldC5hdHRyaWJ1dGVWYWx1ZXMpIHtcclxuICAgICAgICBhdHRyaWJ1dGVWYWx1ZVNldC5hdHRyaWJ1dGVWYWx1ZXMgPSBbXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QubmV4dChhdHRyaWJ1dGVWYWx1ZVNldCk7XHJcbiAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XHJcbiAgICAgIHRoaXMuZGlydHkubmV4dChmYWxzZSk7XHJcbiAgICB9LFxyXG4gICAgKGVycm9yKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldEJhc2VXaW5kb3dEaW1lbnNpb24oYmFzZVdpbmRvd1RlbXBsYXRlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuaHR0cC5nZXQodGhpcy5hdHRyaWJ1dGVFbmRwb2ludCArIFwiYmFzZS13aW5kb3ctZGltZW5zaW9uXCIsIHtwYXJhbXM6IG5ldyBIdHRwUGFyYW1zKCkuc2V0KFwiYmFzZVdpbmRvd1RlbXBsYXRlXCIsIGJhc2VXaW5kb3dUZW1wbGF0ZSl9KVxyXG4gICAgICAuc3Vic2NyaWJlKChkaW1lbnNpb246IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvbkRpbWVuc2lvblN1YmplY3QubmV4dChkaW1lbnNpb24pO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEN1cnJlbnRseSBhIHNpbXBsZSBub3RpZmllciB0aGF0IHRoZSBjb25maWd1cmF0aW9uIG9yIGF0dHJpYnV0ZSB2YWx1ZSBzZXQgaGFzIGNoYW5nZWQgYW5kIGNvbXBvbmVudHMgbWF5IG5lZWQgdG8gYmUgcmVmcmVzaGVkLlxyXG4gICAqXHJcbiAgICovXHJcbiAgbm90aWZ5QXR0cmlidXRlcygpOiB2b2lkIHtcclxuICAgIHRoaXMuY29udGFpbmVyVXBkYXRlZC5uZXh0KHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUG9zdCB0aGUgYXR0cmlidXRlIGNvbmZpZ3VyYXRpb24gYWZ0ZXIgZWRpdGluZy4gIFBvc3QgdGhlIGVudGlyZSB0aGluZyBhcyBpdCBjYXNjYWRlcyBkb3duLiAgVGhlIGVkaXRvciBhbGxvd3MgeW91XHJcbiAgICogdG8gbW9kaWZ5IGV2ZXJ5IGNvbnRhaW5lciBhbmQgb25seSB0aGVuIHNhdmUgdGhlIGVudGlyZSBjb25maWd1cmF0aW9uLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtBdHRyaWJ1dGVDb25maWd1cmF0aW9ufSBhdHRyaWJ1dGVDb25maWd1cmF0aW9uXHJcbiAgICovXHJcbiAgcG9zdEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24oYXR0cmlidXRlQ29uZmlndXJhdGlvbjogQXR0cmlidXRlQ29uZmlndXJhdGlvbik6IHZvaWQge1xyXG4gICAgbGV0IHVybDogc3RyaW5nID0gdGhpcy5hdHRyaWJ1dGVFbmRwb2ludCArIFwiY29uZmlndXJhdGlvbnMvXCIgKyBhdHRyaWJ1dGVDb25maWd1cmF0aW9uLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbjtcclxuXHJcbiAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XHJcblxyXG4gICAgdGhpcy5zZXROZWdhdGl2ZUlkc1RvVW5kZWZpbmVkKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pO1xyXG5cclxuICAgIHRoaXMuaHR0cC5wb3N0KHVybCwgYXR0cmlidXRlQ29uZmlndXJhdGlvbikuc3Vic2NyaWJlKCgpID0+IHtcclxuXHJcbiAgICAgIC8vIFByZXZlbnQgZXJyb3IgaW4gc3Vic2VxdWVudCBzYXZlcy4gU2VlIE1ldGFidWlsZGVyIC8gTUItMjNcclxuICAgICAgdGhpcy5odHRwLmdldDxBdHRyaWJ1dGVDb25maWd1cmF0aW9uPih1cmwpLnN1YnNjcmliZSgoYXR0cmlidXRlQ29uZmlndXJhdGlvbjogQXR0cmlidXRlQ29uZmlndXJhdGlvbikgPT4ge1xyXG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICAgICAgY29uc29sZS5kZWJ1ZyhhdHRyaWJ1dGVDb25maWd1cmF0aW9uKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucG9zdENvbmZpZ3VyYXRpb25TdWJqZWN0Lm5leHQodHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdC5uZXh0KGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pO1xyXG4gICAgICB9LFxyXG4gICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgfSxcclxuICAgICAgKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIH0sXHJcbiAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUHV0IHRoZSBhdHRyaWJ1dGUgdmFsdWUgc2V0LiAgV2hlbiBlZGl0aW5nLCBhdHRyaWJ1dGVzIGFscmVhZHkgcG9zdCB0aGVpciB1cGRhdGVkIHZhbHVlcyB0byB0aGlzIHNlcnZpY2VzIHVuZGVyXHJcbiAgICogYSBzZXBhcmF0ZSBhcnJheS4gIFdoYXQgd2UgZG8gaXMgbWVyZ2UgaW4gdGhlc2UgdXBkYXRlZCBvciBjcmVhdGVkIHZhbHVlcyB3aXRoIHRoZSBjdXJyZW50IGF0dHJpYnV0ZSB2YWx1ZSBzZXQgKGF2cykuXHJcbiAgICogV2hpbGUgZG9pbmcgdGhpcywgc2V0IHRoZSBpZCBvZiB0aGUgYXZzIGFuZCBudWxsaWZ5IGFueSBuZWdhdGl2ZSBpZHMuXHJcbiAgICovXHJcbiAgdXBkYXRlQXR0cmlidXRlVmFsdWVTZXQoKTogU3ViamVjdDxBdHRyaWJ1dGVWYWx1ZVNldD4ge1xyXG4gICAgbGV0IHVybDogc3RyaW5nID0gdGhpcy5hdHRyaWJ1dGVFbmRwb2ludCArIFwiYXR0cmlidXRlLXZhbHVlLXNldC9cIiA7XHJcblxyXG4gICAgbGV0IGFjOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uID0gdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdC5nZXRWYWx1ZSgpO1xyXG5cclxuICAgIGxldCBxdWVyeVBhcmFtczogSHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKClcclxuICAgIC5zZXQoXCJjb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0XCIsIGFjLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQpXHJcbiAgICAuc2V0KFwiY29kZUF0dHJpYnV0ZUNvbnRleHRcIiwgYWMuY29kZUF0dHJpYnV0ZUNvbnRleHQpXHJcbiAgICAuc2V0KFwiaWRQYXJlbnRPYmplY3RcIiwgKHRoaXMuaWRQYXJlbnRPYmplY3QpP3RoaXMuaWRQYXJlbnRPYmplY3QudG9TdHJpbmcoKTpcIlwiKTtcclxuXHJcbiAgICBsZXQgYXZzOiBBdHRyaWJ1dGVWYWx1ZVNldCA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCkpO1xyXG4gICAgZm9yIChsZXQgaSA9IHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbaV0uaWRBdHRyaWJ1dGVWYWx1ZVNldCA9IHRoaXMuaWRBdHRyaWJ1dGVWYWx1ZVNldDtcclxuICAgICAgaWYgKHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXS5pZEF0dHJpYnV0ZVZhbHVlIDwgMCkge1xyXG4gICAgICAgIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXS5pZEF0dHJpYnV0ZVZhbHVlID0gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgajogbnVtYmVyID0gMDtcclxuICAgICAgZm9yIChqID0gMDsgaiA8IGF2cy5hdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICBpZiAodGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2ldLmlkQXR0cmlidXRlVmFsdWUgPT09IGF2cy5hdHRyaWJ1dGVWYWx1ZXNbal0uaWRBdHRyaWJ1dGVWYWx1ZSkge1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChqIDwgYXZzLmF0dHJpYnV0ZVZhbHVlcy5sZW5ndGgpIHtcclxuICAgICAgICBhdnMuYXR0cmlidXRlVmFsdWVzW2pdID0gdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2ldO1xyXG4gICAgICAgIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5zcGxpY2UoaSwgMSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGo6IG51bWJlciA9IDA7XHJcbiAgICAgIGZvciAoaiA9IDA7IGogPCBhdnMuYXR0cmlidXRlVmFsdWVzLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzW2ldLmlkQXR0cmlidXRlVmFsdWUgPT09IGF2cy5hdHRyaWJ1dGVWYWx1ZXNbal0uaWRBdHRyaWJ1dGVWYWx1ZSkge1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChqIDwgYXZzLmF0dHJpYnV0ZVZhbHVlcy5sZW5ndGgpIHtcclxuICAgICAgICBhdnMuYXR0cmlidXRlVmFsdWVzLnNwbGljZShqLCAxKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgYXZzLmF0dHJpYnV0ZVZhbHVlcyA9IGF2cy5hdHRyaWJ1dGVWYWx1ZXMuY29uY2F0KHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcyk7XHJcblxyXG4gICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KHRydWUpO1xyXG5cclxuICAgIGxldCByZXN1bHRTdWJqZWN0OiBTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlU2V0PiA9IG5ldyBTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlU2V0PigpO1xyXG5cclxuICAgIHRoaXMuaHR0cC5wdXQodXJsLCBhdnMsIHtwYXJhbXM6IHF1ZXJ5UGFyYW1zfSkuc3Vic2NyaWJlKChhdHRyaWJ1dGVWYWx1ZVNldDogQXR0cmlidXRlVmFsdWVTZXQpID0+IHtcclxuICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZGVidWcoYXR0cmlidXRlVmFsdWVTZXQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9Jbml0aWFsaXplIGF0dHJpYnV0ZVZhbHVlcyBpZiBpdCBkb2VzIG5vdCBleGlzdFxyXG4gICAgICAgIGlmICghIGF0dHJpYnV0ZVZhbHVlU2V0LmF0dHJpYnV0ZVZhbHVlcykge1xyXG4gICAgICAgICAgYXR0cmlidXRlVmFsdWVTZXQuYXR0cmlidXRlVmFsdWVzID0gW107XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcyA9IFtdO1xyXG4gICAgICAgIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcyA9IFtdO1xyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0Lm5leHQoYXR0cmlidXRlVmFsdWVTZXQpO1xyXG4gICAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5kaXJ0eS5uZXh0KGZhbHNlKTtcclxuXHJcbiAgICAgICAgLy9TZW5kIHRoZSByZXN1bHRzIHRvIHRoZSBvYnNlcnZlciAoaWYgYW55KSwgdGhlbiBjb21wbGV0ZVxyXG4gICAgICAgIHJlc3VsdFN1YmplY3QubmV4dChhdHRyaWJ1dGVWYWx1ZVNldCk7XHJcbiAgICAgICAgcmVzdWx0U3ViamVjdC5jb21wbGV0ZSgpO1xyXG4gICAgICB9LFxyXG4gICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICAgIHJlc3VsdFN1YmplY3QuZXJyb3IoZXJyb3IpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gcmVzdWx0U3ViamVjdDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgYXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3QuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7QmVoYXZpb3JTdWJqZWN0PEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24+fVxyXG4gICAqL1xyXG4gIGdldEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0KCk6IEJlaGF2aW9yU3ViamVjdDxBdHRyaWJ1dGVDb25maWd1cmF0aW9uPiB7XHJcbiAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdDtcclxuICB9XHJcblxyXG4gIGdldERpcnR5U3ViamVjdCgpOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZGlydHk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIGF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdDtcclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHtCZWhhdmlvclN1YmplY3Q8QXR0cmlidXRlVmFsdWVTZXQ+fVxyXG4gICAqL1xyXG4gIGdldEF0dHJpYnV0ZVZhbHVlU2V0KCk6IEJlaGF2aW9yU3ViamVjdDxBdHRyaWJ1dGVWYWx1ZVNldD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBhdHRyaWJ1dGVWYWx1ZVB1c2hlZFN1YmplY3Q7XHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7U3ViamVjdDxBdHRyaWJ1dGVWYWx1ZT59XHJcbiAgICovXHJcbiAgZ2V0QXR0cmlidXRlVmFsdWVQdXNoZWRTdWJqZWN0KCk6IFN1YmplY3Q8QXR0cmlidXRlVmFsdWU+IHtcclxuICAgIHJldHVybiB0aGlzLmF0dHJpYnV0ZVZhbHVlUHVzaGVkU3ViamVjdDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBhbGwgYXR0cmlidXRlIHZhbHVlcyBiYXNlZCB1cG9uIHRoZSBpZEF0dHJpYnV0ZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpZEF0dHJpYnV0ZXNcclxuICAgKiBAcmV0dXJucyB7QXR0cmlidXRlVmFsdWVbXX1cclxuICAgKi9cclxuICBnZXRBdHRyaWJ1dGVWYWx1ZXMoaWRBdHRyaWJ1dGU6IG51bWJlciwgZ3JvdXBBdHRyaWJ1dGVSb3dJZDogbnVtYmVyKTogQXR0cmlidXRlVmFsdWVbXSB7XHJcblxyXG4gICAgbGV0IGF0dHJpYnV0ZVZhbHVlczogQXR0cmlidXRlVmFsdWVbXSA9IFtdO1xyXG5cclxuICAgIGlmKHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCkpIHtcclxuXHJcbiAgICAgIC8vR28gdGhyb3VnaCBhbGwgdGhlIHVwZGF0ZWQgYXR0cmlidXRlIHZhbHVlcyBmaXJzdCAoc28gd2UgcHJlc2VydmUgYWNyb3NzIGNoYW5naW5nIHRhYnMsIGV0YylcclxuICAgICAgbGV0IGk6IG51bWJlciA9IDA7XHJcbiAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBpZiAodGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2ldLmlkQXR0cmlidXRlID09PSBpZEF0dHJpYnV0ZSAmJiAoIWdyb3VwQXR0cmlidXRlUm93SWQgfHwgZ3JvdXBBdHRyaWJ1dGVSb3dJZCA9PT0gdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2ldLmdyb3VwQXR0cmlidXRlUm93SWQpKSB7XHJcbiAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZXMucHVzaChPYmplY3QuYXNzaWduKHt9LCB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbaV0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2ldLmlkR3JvdXBBdHRyaWJ1dGUgPT09IGlkQXR0cmlidXRlICYmICghZ3JvdXBBdHRyaWJ1dGVSb3dJZCB8fCBncm91cEF0dHJpYnV0ZVJvd0lkID09PSB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbaV0uZ3JvdXBBdHRyaWJ1dGVSb3dJZCkpIHtcclxuICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlcy5wdXNoKE9iamVjdC5hc3NpZ24oe30sIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy9HbyB0aHJvdWdoIGFsbCB0aGUgcmVndWxhciBhdHRyaWJ1dGVzXHJcbiAgICAgIGZvciAobGV0IGF0dHJpYnV0ZVZhbHVlIG9mIHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCkuYXR0cmlidXRlVmFsdWVzKSB7XHJcbiAgICAgICAgLy9SZWd1bGFyIGF0dHJpYnV0ZXMgKG5vcm1hbCBhbmQgZ3JvdXAsIHdoaWNoIGdldCBtdWx0aXBsZSlcclxuICAgICAgICBpZiAoYXR0cmlidXRlVmFsdWUuaWRBdHRyaWJ1dGUgPT09IGlkQXR0cmlidXRlIHx8IGF0dHJpYnV0ZVZhbHVlLmlkR3JvdXBBdHRyaWJ1dGUgPT09IGlkQXR0cmlidXRlKSB7XHJcbiAgICAgICAgICAvL0lmIHJvdyBpZCBzcGVjaWZpZWQsIG9ubHkgY2FyZSBhYm91dCB2YWx1ZXMgZm9yIHRoYXQgcm93XHJcbiAgICAgICAgICBpZiAodHlwZW9mIGdyb3VwQXR0cmlidXRlUm93SWQgPT09ICd1bmRlZmluZWQnIHx8IGF0dHJpYnV0ZVZhbHVlLmdyb3VwQXR0cmlidXRlUm93SWQgPT09IGdyb3VwQXR0cmlidXRlUm93SWQpIHtcclxuXHJcbiAgICAgICAgICAgIC8vSWYgbm90IGFscmVhZHkgYWRkZWQuLi5cclxuICAgICAgICAgICAgaWYgKCEgYXR0cmlidXRlVmFsdWVzLmZpbmQoKGV4aXN0aW5nKSA9PiBleGlzdGluZy5pZEF0dHJpYnV0ZVZhbHVlID09PSBhdHRyaWJ1dGVWYWx1ZS5pZEF0dHJpYnV0ZVZhbHVlKSkge1xyXG5cclxuICAgICAgICAgICAgICAvL0Rvbid0IHdhbnQgdGhlIG9yaWdpbmFsIGlmIGl0IHdhcyByZW1vdmVkIChzbGljZWQpXHJcbiAgICAgICAgICAgICAgaWYgKCEgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMuZmluZCgoc2F2KSA9PiBzYXYuaWRBdHRyaWJ1dGVWYWx1ZSA9PT0gYXR0cmlidXRlVmFsdWUuaWRBdHRyaWJ1dGVWYWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlcy5wdXNoKE9iamVjdC5hc3NpZ24oe30sIGF0dHJpYnV0ZVZhbHVlKSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBhbGwgY2hpbGQgYXR0cmlidXRlcyBvZiB0aGUgaWRBdHRyaWJ1dGUuICBNb3N0IGxpa2VseSBmb3IgYXR0cmlidXRlcyB0aGF0IGRlZmluZSBjb2x1bW5zIG9mIGEgZ3JpZC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpZEF0dHJpYnV0ZVxyXG4gICAqIEByZXR1cm5zIHtBdHRyaWJ1dGVbXX1cclxuICAgKi9cclxuICBnZXRHcm91cEF0dHJpYnV0ZXMoaWRBdHRyaWJ1dGU6IG51bWJlcik6IEF0dHJpYnV0ZVtdIHtcclxuICAgIGxldCBhdHRyaWJ1dGVzOiBBdHRyaWJ1dGVbXSA9IFtdO1xyXG5cclxuICAgIHRoaXMuYXR0cmlidXRlTWFwLmZvckVhY2goKGF0dHJpYnV0ZTogQXR0cmlidXRlKSA9PiB7XHJcbiAgICAgIGlmIChhdHRyaWJ1dGUuaWRHcm91cEF0dHJpYnV0ZSA9PT0gaWRBdHRyaWJ1dGUpIHtcclxuICAgICAgICBhdHRyaWJ1dGVzLnB1c2goYXR0cmlidXRlKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGF0dHJpYnV0ZXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlIHdpZHRoIHdoaWNoIGlzIGEgcmVxdWlyZW1lbnQgb2YgdGhlIGFic29sdXRlIHBvc2l0aW9uaW5nLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoXHJcbiAgICovXHJcbiAgc2V0V2lkdGgod2lkdGg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy53aWR0aCA9IHdpZHRoO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSB3aWR0aC5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XHJcbiAgICovXHJcbiAgZ2V0V2lkdGgoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLndpZHRoO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBhcnJheSBvZiBhdHRyaWJ1dGUgY2hvaWNlcyBmb3IgdGhlIGlkQXR0cmlidXRlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkQXR0cmlidXRlXHJcbiAgICogQHJldHVybnMge0F0dHJpYnV0ZUNob2ljZVtdfVxyXG4gICAqL1xyXG4gIGdldEF0dHJpYnV0ZUNob2ljZXMoaWRBdHRyaWJ1dGU6IG51bWJlcik6IEF0dHJpYnV0ZUNob2ljZVtdIHtcclxuICAgIHJldHVybiB0aGlzLmF0dHJpYnV0ZU1hcC5nZXQoaWRBdHRyaWJ1dGUpLmF0dHJpYnV0ZUNob2ljZXM7XHJcbiAgfVxyXG5cclxuICBnZXRMb2FkaW5nU3ViamVjdCgpOiBTdWJqZWN0PGJvb2xlYW4+IHtcclxuICAgIHJldHVybiB0aGlzLmxvYWRpbmdTdWJqZWN0O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBjb250YWluZXJVcGRhdGVkIHN1YmplY3QuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7U3ViamVjdDxudW1iZXI+fVxyXG4gICAqL1xyXG4gIGdldENvbnRhaW5lclVwZGF0ZWQoKTogU3ViamVjdDxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gdGhpcy5jb250YWluZXJVcGRhdGVkO1xyXG4gIH1cclxuXHJcbiAgZ2V0R3JpZFJvd1NhdmVkU3ViamVjdCgpOiBTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlR3JpZFJvdz4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ3JpZFJvd1NhdmVkO1xyXG4gIH1cclxuXHJcbiAgZ2V0R3JpZFJvd0RlbGV0ZWRTdWJqZWN0KCk6IFN1YmplY3Q8QXR0cmlidXRlVmFsdWVHcmlkUm93PiB7XHJcbiAgICByZXR1cm4gdGhpcy5ncmlkUm93RGVsZXRlZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIHRoZSB1cGRhdGVkIGFuZCBkZWxldGVkIGF0dHJpYnV0ZSB2YWx1ZSBhcnJheXMuXHJcbiAgICpcclxuICAgKi9cclxuICBjbGVhclVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcyA9IFtdO1xyXG4gICAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzID0gW107XHJcbiAgICB0aGlzLmRpcnR5Lm5leHQoZmFsc2UpO1xyXG4gICAgdGhpcy5ub3RpZnlBdHRyaWJ1dGVzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhciB0aGUgdXBkYXRlZCBhbmQgZGVsZXRlZCBncmlkIHJvdyBhdHRyaWJ1dGVzIGZvciB0aGUgc3BlY2lmaWVkIGdyaWQgcm93XHJcbiAgICpcclxuICAgKi9cclxuICBjbGVhclVwZGF0ZWRHcmlkUm93QXR0cmlidXRlVmFsdWVzKGdyb3VwQXR0cmlidXRlUm93SWQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IHJlbWFpbmluZ0F0dHJpYnV0ZXMgPSBbXTtcclxuXHJcbiAgICB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcyA9IHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzLmZpbHRlcigoYXYpID0+IGF2Lmdyb3VwQXR0cmlidXRlUm93SWQgIT09IGdyb3VwQXR0cmlidXRlUm93SWQpO1xyXG4gICAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzID0gIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5maWx0ZXIoKGF2KSA9PiBhdi5ncm91cEF0dHJpYnV0ZVJvd0lkICE9PSBncm91cEF0dHJpYnV0ZVJvd0lkKTtcclxuXHJcbiAgICAvL1Nob3VsZG4ndCBiZSBhIG5lZWQgdG8gY2hhbmdlIGRpcnR5IG9yIG5vdGlmeSBhdHRyaWJ1dGVzXHJcbiAgfVxyXG5cclxuICBzYXZlR3JpZFJvd0F0dHJpYnV0ZVZhbHVlcyhpZEdyb3VwQXR0cmlidXRlOiBudW1iZXIsIGdyb3VwQXR0cmlidXRlUm93SWQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IHJvd1ZhbHVlcyA9IHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5maWx0ZXIoKGF2KSA9PiBhdi5ncm91cEF0dHJpYnV0ZVJvd0lkID09PSBncm91cEF0dHJpYnV0ZVJvd0lkICYmIGF2LmlkR3JvdXBBdHRyaWJ1dGUgPT09IGlkR3JvdXBBdHRyaWJ1dGUpO1xyXG5cclxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgcm93VmFsdWVzLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgIC8vc2V0IHRoZSBpZEF0dHJpYnV0ZVZhbHVlU2V0IGlmIG5lY2Vzc2FyeVxyXG4gICAgICBpZiAoISByb3dWYWx1ZXNbal0uaWRBdHRyaWJ1dGVWYWx1ZVNldCkge1xyXG4gICAgICAgIHJvd1ZhbHVlc1tqXS5pZEF0dHJpYnV0ZVZhbHVlU2V0ID0gdGhpcy5pZEF0dHJpYnV0ZVZhbHVlU2V0O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvL3JlbW92ZSBhbGwgbmVnYXRpdmUgaWRzIChuZXcgdmFsdWVzKVxyXG4gICAgICBpZiAocm93VmFsdWVzW2pdLmlkQXR0cmlidXRlVmFsdWUgPCAwKSB7XHJcbiAgICAgICAgcm93VmFsdWVzW2pdLmlkQXR0cmlidXRlVmFsdWUgPSB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL0ZvciBtdWx0aSB2YWx1ZXMgdGhhdCB3ZXJlIHNsaWNlZCAoZGUtc2VsZWN0ZWQpIHdlJ3JlIGdvaW5nIHRvIGZpbmQgdGhlbSBhbmQgbnVsbCBvdXQgdGhlIHZhbHVlLCBpbnN0ZWFkIG9mIHJlbW92aW5nLlxyXG4gICAgLy9UaGF0IG1lYW5zIHRoZXkgYWN0YXVsbHkgbmVlZCB0byBiZSBhZGRlZCB0byB0aGUgcm93VmFsdWVzXHJcbiAgICAvL1JlbW92ZWQgbXVsdGkgdmFsdWVzIHdpdGhpbiBhbiBleGlzdGluZyByb3dcclxuICAgIGxldCByZW1vdmVkVmFsdWVzID0gdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMuZmlsdGVyKChhdikgPT4gYXYuZ3JvdXBBdHRyaWJ1dGVSb3dJZCA9PT0gZ3JvdXBBdHRyaWJ1dGVSb3dJZCAmJiBhdi5pZEdyb3VwQXR0cmlidXRlID09PSBpZEdyb3VwQXR0cmlidXRlKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVtb3ZlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICByZW1vdmVkVmFsdWVzW2ldLnZhbHVlQXR0cmlidXRlQ2hvaWNlID0gdW5kZWZpbmVkO1xyXG4gICAgICByZW1vdmVkVmFsdWVzW2ldLnZhbHVlSWREaWN0aW9uYXJ5ID0gdW5kZWZpbmVkO1xyXG4gICAgICByb3dWYWx1ZXMucHVzaChyZW1vdmVkVmFsdWVzW2ldKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgYXZncjpBdHRyaWJ1dGVWYWx1ZUdyaWRSb3cgPSA8QXR0cmlidXRlVmFsdWVHcmlkUm93PntcclxuICAgICAgICBpZEF0dHJpYnV0ZVZhbHVlU2V0OiB0aGlzLmlkQXR0cmlidXRlVmFsdWVTZXQsXHJcbiAgICAgICAgaWRHcm91cEF0dHJpYnV0ZTogaWRHcm91cEF0dHJpYnV0ZSxcclxuICAgICAgICBncm91cEF0dHJpYnV0ZVJvd0lkOiBncm91cEF0dHJpYnV0ZVJvd0lkLFxyXG4gICAgICAgIGF0dHJpYnV0ZVZhbHVlczogcm93VmFsdWVzXHJcbiAgICAgIH07XHJcblxyXG4gICAgbGV0IHVybDogc3RyaW5nID0gdGhpcy5hdHRyaWJ1dGVFbmRwb2ludCArIFwiYXR0cmlidXRlLXZhbHVlLWdyaWQtcm93L1wiIDtcclxuXHJcbiAgICBsZXQgYWM6IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gPSB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0LmdldFZhbHVlKCk7XHJcblxyXG4gICAgbGV0IHF1ZXJ5UGFyYW1zOiBIdHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKVxyXG4gICAgLnNldChcImNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRcIiwgYWMuY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dClcclxuICAgIC5zZXQoXCJjb2RlQXR0cmlidXRlQ29udGV4dFwiLCBhYy5jb2RlQXR0cmlidXRlQ29udGV4dClcclxuICAgIC5zZXQoXCJpZFBhcmVudE9iamVjdFwiLCAodGhpcy5pZFBhcmVudE9iamVjdCk/dGhpcy5pZFBhcmVudE9iamVjdC50b1N0cmluZygpOlwiXCIpO1xyXG5cclxuXHJcbiAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XHJcblxyXG4gICAgLy9TYXZlIG5ldyByb3dcclxuICAgIGlmIChncm91cEF0dHJpYnV0ZVJvd0lkIDwgMCkge1xyXG4gICAgICB0aGlzLmh0dHAucG9zdCh1cmwsIGF2Z3IsIHtwYXJhbXM6IHF1ZXJ5UGFyYW1zfSkuc3Vic2NyaWJlKChhdHRyaWJ1dGVWYWx1ZUdyaWRSb3c6IEF0dHJpYnV0ZVZhbHVlR3JpZFJvdykgPT4ge1xyXG5cclxuICAgICAgICAvL0FkZCB0aGUgZ3JpZCByb3cgdG8gdGhlIG9yaWdpbmFsIGF0dHJpYnV0ZSB2YWx1ZXNcclxuICAgICAgICBsZXQgYXZzOkF0dHJpYnV0ZVZhbHVlU2V0ID0gdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QuZ2V0VmFsdWUoKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVWYWx1ZUdyaWRSb3cuYXR0cmlidXRlVmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBhdnMuYXR0cmlidXRlVmFsdWVzLnB1c2goYXR0cmlidXRlVmFsdWVHcmlkUm93LmF0dHJpYnV0ZVZhbHVlc1tpXSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL1JlbW92ZSB0aGUgdXBkYXRlZCBhbmQgc2xpY2VkIHZhbHVlcyBmb3IgdGhlIGdyaWQgcm93LCBub3cgKHRoZXNlIGFyZSB0aGUgb2xkIG9uZXMgd2l0aCB0aGUgbmVnYXRpdmUgcm93aWQpXHJcbiAgICAgICAgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMgPSB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5maWx0ZXIoKGF2KSA9PiAoYXYuZ3JvdXBBdHRyaWJ1dGVSb3dJZCAhPT0gZ3JvdXBBdHRyaWJ1dGVSb3dJZCB8fCBhdi5pZEdyb3VwQXR0cmlidXRlICE9PSBpZEdyb3VwQXR0cmlidXRlKSk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzID0gIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5maWx0ZXIoKGF2KSA9PiAoYXYuZ3JvdXBBdHRyaWJ1dGVSb3dJZCAhPT0gZ3JvdXBBdHRyaWJ1dGVSb3dJZCB8fCBhdi5pZEdyb3VwQXR0cmlidXRlICE9PSBpZEdyb3VwQXR0cmlidXRlKSk7XHJcblxyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0Lm5leHQoYXZzKTtcclxuICAgICAgICB0aGlzLmdyaWRSb3dTYXZlZC5uZXh0KGF0dHJpYnV0ZVZhbHVlR3JpZFJvdyk7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgICAgfSxcclxuICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvL1VwZGF0ZSBleGlzdGluZyByb3dcclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLmh0dHAucHV0KHVybCwgYXZnciwge3BhcmFtczogcXVlcnlQYXJhbXN9KS5zdWJzY3JpYmUoKGF0dHJpYnV0ZVZhbHVlR3JpZFJvdzogQXR0cmlidXRlVmFsdWVHcmlkUm93KSA9PiB7XHJcblxyXG4gICAgICAgIC8vQWRkIHRoZSBncmlkIHJvdyB0byB0aGUgb3JpZ2luYWwgYXR0cmlidXRlIHZhbHVlc1xyXG4gICAgICAgIGxldCBhdnM6QXR0cmlidXRlVmFsdWVTZXQgPSB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5nZXRWYWx1ZSgpO1xyXG5cclxuICAgICAgICAvL1JlbW92ZSBhbGwgb2xkIHZhbHVlcyBmb3Igcm93XHJcbiAgICAgICAgbGV0IGluZGV4ID0gYXZzLmF0dHJpYnV0ZVZhbHVlcy5maW5kSW5kZXgoKGF2KT0+IChhdi5ncm91cEF0dHJpYnV0ZVJvd0lkID09PSBncm91cEF0dHJpYnV0ZVJvd0lkICYmIGF2LmlkR3JvdXBBdHRyaWJ1dGUgPT09IGlkR3JvdXBBdHRyaWJ1dGUpKTtcclxuICAgICAgICB3aGlsZSAoaW5kZXggPiAwKSB7XHJcbiAgICAgICAgICAvL1JlbW92ZSB2YWx1ZVxyXG4gICAgICAgICAgYXZzLmF0dHJpYnV0ZVZhbHVlcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG5cclxuICAgICAgICAgIC8vRmluZCB0aGUgbmV4dCBvbmVcclxuICAgICAgICAgIGluZGV4ID0gYXZzLmF0dHJpYnV0ZVZhbHVlcy5maW5kSW5kZXgoKGF2KT0+IChhdi5ncm91cEF0dHJpYnV0ZVJvd0lkID09PSBncm91cEF0dHJpYnV0ZVJvd0lkICYmIGF2LmlkR3JvdXBBdHRyaWJ1dGUgPT09IGlkR3JvdXBBdHRyaWJ1dGUpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vQWRkIGFsbCB0aGUgY3VycmVudCB2YWx1ZXNcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJpYnV0ZVZhbHVlR3JpZFJvdy5hdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGF2cy5hdHRyaWJ1dGVWYWx1ZXMucHVzaChhdHRyaWJ1dGVWYWx1ZUdyaWRSb3cuYXR0cmlidXRlVmFsdWVzW2ldKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vUmVtb3ZlIHRoZSBzbGljZWQgYW5kIHVwZGF0ZWQgdmFsdWVzIGZvciB0aGUgZ3JpZCByb3dcclxuICAgICAgICB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcyA9IHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzLmZpbHRlcigoYXYpID0+IChhdi5ncm91cEF0dHJpYnV0ZVJvd0lkICE9PSBncm91cEF0dHJpYnV0ZVJvd0lkIHx8IGF2LmlkR3JvdXBBdHRyaWJ1dGUgIT09IGlkR3JvdXBBdHRyaWJ1dGUpKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMgPSAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLmZpbHRlcigoYXYpID0+IChhdi5ncm91cEF0dHJpYnV0ZVJvd0lkICE9PSBncm91cEF0dHJpYnV0ZVJvd0lkIHx8IGF2LmlkR3JvdXBBdHRyaWJ1dGUgIT09IGlkR3JvdXBBdHRyaWJ1dGUpKTtcclxuXHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QubmV4dChhdnMpO1xyXG4gICAgICAgIHRoaXMuZ3JpZFJvd1NhdmVkLm5leHQoYXR0cmlidXRlVmFsdWVHcmlkUm93KTtcclxuICAgICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICB9LFxyXG4gICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGRlbGV0ZUdyaWRSb3dBdHRyaWJ1dGVWYWx1ZXMoaWRHcm91cEF0dHJpYnV0ZTogbnVtYmVyLCBncm91cEF0dHJpYnV0ZVJvd0lkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCB1cmw6IHN0cmluZyA9IHRoaXMuYXR0cmlidXRlRW5kcG9pbnQgKyBcImF0dHJpYnV0ZS12YWx1ZS1ncmlkLXJvdy9cIiA7XHJcblxyXG4gICAgbGV0IGFjOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uID0gdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdC5nZXRWYWx1ZSgpO1xyXG5cclxuICAgIGxldCBxdWVyeVBhcmFtczogSHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKClcclxuICAgIC5zZXQoXCJjb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0XCIsIGFjLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQpXHJcbiAgICAuc2V0KFwiY29kZUF0dHJpYnV0ZUNvbnRleHRcIiwgYWMuY29kZUF0dHJpYnV0ZUNvbnRleHQpXHJcbiAgICAuc2V0KFwiaWRQYXJlbnRPYmplY3RcIiwgKHRoaXMuaWRQYXJlbnRPYmplY3QpP3RoaXMuaWRQYXJlbnRPYmplY3QudG9TdHJpbmcoKTpcIlwiKTtcclxuXHJcbiAgICBsZXQgYXZncjpBdHRyaWJ1dGVWYWx1ZUdyaWRSb3cgPSA8QXR0cmlidXRlVmFsdWVHcmlkUm93PntcclxuICAgICAgICBpZEF0dHJpYnV0ZVZhbHVlU2V0OiB0aGlzLmlkQXR0cmlidXRlVmFsdWVTZXQsXHJcbiAgICAgICAgaWRHcm91cEF0dHJpYnV0ZTogaWRHcm91cEF0dHJpYnV0ZSxcclxuICAgICAgICBncm91cEF0dHJpYnV0ZVJvd0lkOiBncm91cEF0dHJpYnV0ZVJvd0lkLFxyXG4gICAgICAgIGF0dHJpYnV0ZVZhbHVlczogW11cclxuICAgICAgfTtcclxuXHJcbiAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XHJcblxyXG4gICAgdGhpcy5odHRwLnJlcXVlc3QoJ2RlbGV0ZScsIHVybCwge2JvZHk6IGF2Z3IsIHBhcmFtczogcXVlcnlQYXJhbXN9KS5zdWJzY3JpYmUoKCkgPT4ge1xyXG5cclxuICAgICAgLy9SZW1vdmUgdGhlIGdyaWQgcm93IGZyb20gdGhlIG9yaWdpbmFsIGF0dHJpYnV0ZSB2YWx1ZXNcclxuICAgICAgbGV0IGF2czpBdHRyaWJ1dGVWYWx1ZVNldCA9IHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCk7XHJcbiAgICAgIC8vRmlsdGVyIHRvIG9ubHkgYXR0cmlidXRlcyB0byBLRUVQIC0gKGkuZS4gbm90IHRoZSBzYW1lIGdyaWQgb3Igbm90IHRoZSByb3cgYmVpbmcgZGVsZXRlZClcclxuICAgICAgYXZzLmF0dHJpYnV0ZVZhbHVlcyA9IGF2cy5hdHRyaWJ1dGVWYWx1ZXMuZmlsdGVyKChhdikgPT4gKGF2LmlkR3JvdXBBdHRyaWJ1dGUgIT09IGlkR3JvdXBBdHRyaWJ1dGUgfHwgYXYuZ3JvdXBBdHRyaWJ1dGVSb3dJZCAhPT0gZ3JvdXBBdHRyaWJ1dGVSb3dJZCkpO1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5uZXh0KGF2cyk7XHJcbiAgICAgIHRoaXMuZ3JpZFJvd0RlbGV0ZWQubmV4dChhdmdyKTtcclxuICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgIH0sXHJcbiAgICAoZXJyb3IpID0+IHtcclxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFB1c2ggYW4gYXR0cmlidXRlIHRvIHRoZSBhdHRyaWJ1dGUgbWFwLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtBdHRyaWJ1dGV9IGF0dHJpYnV0ZVxyXG4gICAqL1xyXG4gIHB1c2hBdHRyaWJ1dGUoYXR0cmlidXRlOiBBdHRyaWJ1dGUpOiB2b2lkIHtcclxuICAgIHRoaXMuYXR0cmlidXRlTWFwLnNldChhdHRyaWJ1dGUuaWRBdHRyaWJ1dGUsIGF0dHJpYnV0ZSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHVzaEF0dHJpYnV0ZVZhbHVlTXVsdGlDaG9pY2UoYXR0cmlidXRlVmFsdWU6IEF0dHJpYnV0ZVZhbHVlKTogdm9pZCB7XHJcbiAgICAvL1JlbW92ZSBmcm9tIHNsaWNlZCBpZiBwcmVzZW50XHJcbiAgICBsZXQgaTogbnVtYmVyID0gMDtcclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAodGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXNbaV0uaWRBdHRyaWJ1dGUgPT09IGF0dHJpYnV0ZVZhbHVlLmlkQXR0cmlidXRlICYmIHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzW2ldLnZhbHVlQXR0cmlidXRlQ2hvaWNlLmlkQXR0cmlidXRlQ2hvaWNlID09PSBhdHRyaWJ1dGVWYWx1ZS52YWx1ZUF0dHJpYnV0ZUNob2ljZS5pZEF0dHJpYnV0ZUNob2ljZSkge1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvL1JlbW92ZSBmcm9tIHNsaWNlZCBhdHRyaWJ1dGUgdmFsdWVzIChubyBsb25nZXIgcmVtb3ZpbmcpXHJcbiAgICBpZiAoaSA8IHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5zcGxpY2UoaSwgMSk7XHJcbiAgICB9XHJcbiAgICAvL090aGVyd2lzZSBwdXNoIHRoZSB2YWx1ZSwgc28gaXQgd2lsbCBiZSBzYXZlZFxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMucHVzaEF0dHJpYnV0ZVZhbHVlKGF0dHJpYnV0ZVZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1c2hBdHRyaWJ1dGVWYWx1ZU11bHRpRGljdChhdHRyaWJ1dGVWYWx1ZTogQXR0cmlidXRlVmFsdWUpOiB2b2lkIHtcclxuICAgIC8vUmVtb3ZlIGZyb20gc2xpY2VkIGlmIHByZXNlbnRcclxuICAgIGxldCBpOiBudW1iZXIgPSAwO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICh0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlc1tpXS5pZEF0dHJpYnV0ZSA9PT0gYXR0cmlidXRlVmFsdWUuaWRBdHRyaWJ1dGUgJiYgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXNbaV0udmFsdWVJZERpY3Rpb25hcnkgPT09IGF0dHJpYnV0ZVZhbHVlLnZhbHVlSWREaWN0aW9uYXJ5KSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vUmVtb3ZlIGZyb20gc2xpY2VkIGF0dHJpYnV0ZSB2YWx1ZXMgKG5vIGxvbmdlciByZW1vdmluZylcclxuICAgIGlmIChpIDwgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzLnNwbGljZShpLCAxKTtcclxuICAgIH1cclxuICAgIC8vT3RoZXJ3aXNlIHB1c2ggdGhlIHZhbHVlLCBzbyBpdCB3aWxsIGJlIHNhdmVkXHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5wdXNoQXR0cmlidXRlVmFsdWUoYXR0cmlidXRlVmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUHVzaCBhIG5ldyBvciB1cGRhdGVkIGF0dHJpYnV0ZSB2YWx1ZS4gIFRoZSBjdXJyZW50IG9uZSBpcyBqdXN0IHJlbW92ZWQgYW5kIHRoZSBuZXcgb25lIGFwcGVuZGVkIHRvIHRoZSBhcnJheS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlVmFsdWV9IGF0dHJpYnV0ZVZhbHVlXHJcbiAgICovXHJcbiAgcHVzaEF0dHJpYnV0ZVZhbHVlKGF0dHJpYnV0ZVZhbHVlOiBBdHRyaWJ1dGVWYWx1ZSk6IHZvaWQge1xyXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJwdXNoQXR0cmlidXRlVmFsdWVcIik7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoYXR0cmlidXRlVmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBpOiBudW1iZXIgPSAwO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAodGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2ldLmlkQXR0cmlidXRlVmFsdWUgPT09IGF0dHJpYnV0ZVZhbHVlLmlkQXR0cmlidXRlVmFsdWUpIHtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKGkgPCB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5zcGxpY2UoaSwgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLnB1c2goYXR0cmlidXRlVmFsdWUpO1xyXG4gICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZVB1c2hlZFN1YmplY3QubmV4dChhdHRyaWJ1dGVWYWx1ZSk7XHJcblxyXG4gICAgLy9Pbmx5IHNldHRpbmcgZGlydHkgZm9yIG5vbiBncmlkLXJvd3MgKHRob3NlIGFyZSBzYXZlZCBpbW1lZGlhdGVseSlcclxuICAgIGlmICghIGF0dHJpYnV0ZVZhbHVlLmlkR3JvdXBBdHRyaWJ1dGUpIHtcclxuICAgICAgdGhpcy5kaXJ0eS5uZXh0KHRydWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRm9yIHB1c2hpbmcgbXVsdGlwbGUgYXR0cmlidXRlIHZhbHVlcyBhdCBvbmNlLiAgVGhpcyB3b3VsZCB0eXBpY2FsbHkgYmUgZm9yIGEgbXVsdGkgY2hvaWNlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtBdHRyaWJ1dGV9IGF0dHJpYnV0ZVxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlVmFsdWVbXX0gYXR0cmlidXRlVmFsdWVzXHJcbiAgICovXHJcbiAgcHVzaEF0dHJpYnV0ZVZhbHVlcyhhdHRyaWJ1dGU6IEF0dHJpYnV0ZSwgYXR0cmlidXRlVmFsdWVzOiBBdHRyaWJ1dGVWYWx1ZVtdKTogdm9pZCB7XHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhcInB1c2hBdHRyaWJ1dGVWYWx1ZXNcIik7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoYXR0cmlidXRlVmFsdWVzKTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgajogbnVtYmVyID0gMDtcclxuICAgICAgZm9yIChqID0gMDsgaiA8IHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbal0uaWRBdHRyaWJ1dGUgIT09IGF0dHJpYnV0ZS5pZEF0dHJpYnV0ZSkge1xyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbal0uaWRBdHRyaWJ1dGVWYWx1ZSA9PT0gYXR0cmlidXRlVmFsdWVzW2ldLmlkQXR0cmlidXRlVmFsdWUpIHtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoaiA8IHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbal0gPSBhdHRyaWJ1dGVWYWx1ZXNbaV07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLnB1c2goYXR0cmlidXRlVmFsdWVzW2ldKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICBjb25zb2xlLmRlYnVnKHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9Pbmx5IHNldHRpbmcgZGlydHkgZm9yIG5vbiBncmlkLXJvd3MgKHRob3NlIGFyZSBzYXZlZCBpbW1lZGlhdGVseSlcclxuICAgIGlmICghIGF0dHJpYnV0ZS5pZEdyb3VwQXR0cmlidXRlKSB7XHJcbiAgICAgIHRoaXMuZGlydHkubmV4dCh0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFB1c2ggYSB2YWx1ZSBpbiB0aGUgY2FzZSB3aGVyZSBhbiBhdHRyaWJ1dGUgdmFsdWUgZG9lc24ndCBleGlzdC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlfSBhdHRyaWJ1dGVcclxuICAgKiBAcGFyYW0gdmFsdWVcclxuICAgKi9cclxuICBwdXNoVmFsdWUoYXR0cmlidXRlOiBBdHRyaWJ1dGUsIHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIGxldCBhdHRyaWJ1dGVWYWx1ZTogQXR0cmlidXRlVmFsdWUgPSA8QXR0cmlidXRlVmFsdWU+e1xyXG4gICAgICBpZEF0dHJpYnV0ZTogYXR0cmlidXRlLmlkQXR0cmlidXRlLFxyXG4gICAgICBpZEF0dHJpYnV0ZVZhbHVlU2V0OiB0aGlzLmlkQXR0cmlidXRlVmFsdWVTZXRcclxuICAgIH07XHJcblxyXG4gICAgaWYgKGF0dHJpYnV0ZS5jb2RlQXR0cmlidXRlRGF0YVR5cGUgPT09IFwiVFhUXCIpIHtcclxuICAgICAgYXR0cmlidXRlVmFsdWUudmFsdWVMb25nVGV4dCA9IHtcclxuICAgICAgICBpZExvbmdUZXh0OiB1bmRlZmluZWQsXHJcbiAgICAgICAgdGV4dERhdGE6IHZhbHVlXHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLnB1c2goYXR0cmlidXRlVmFsdWUpO1xyXG4gICAgdGhpcy5kaXJ0eS5uZXh0KHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIGFuIGF0dHJpYnV0ZSB2YWx1ZS4gIFR5cGljYWxseSBpbiB0aGUgY2FzZSBvZiBhIG11bHRpIHNlbGVjdCB3aGVyZSB0aGUgdW5zZWxlY3RlZCB2YWx1ZSBpcyByZW1vdmVkLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtBdHRyaWJ1dGV9IGF0dHJpYnV0ZVxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlQ2hvaWNlfSBhdHRyaWJ1dGVDaG9pY2VcclxuICAgKi9cclxuICBzcGxpY2VBdHRyaWJ1dGVWYWx1ZUNob2ljZShhdHRyaWJ1dGU6IEF0dHJpYnV0ZSwgYXR0cmlidXRlQ2hvaWNlOiBBdHRyaWJ1dGVDaG9pY2UpOiB2b2lkIHtcclxuICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICBjb25zb2xlLmRlYnVnKFwic2xpY2VBdHRyaWJ1dGVWYWx1ZTogXCIgKyBhdHRyaWJ1dGUuaWRBdHRyaWJ1dGUgKyBcIiwgXCIgKyBhdHRyaWJ1dGVDaG9pY2UuaWRBdHRyaWJ1dGVDaG9pY2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBpOiBudW1iZXIgPSAwO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAodGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2ldLmlkQXR0cmlidXRlID09PSBhdHRyaWJ1dGUuaWRBdHRyaWJ1dGUgJiYgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2ldLnZhbHVlQXR0cmlidXRlQ2hvaWNlLmlkQXR0cmlidXRlQ2hvaWNlID09PSBhdHRyaWJ1dGVDaG9pY2UuaWRBdHRyaWJ1dGVDaG9pY2UpIHtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy9SZW1vdmUgZnJvbSB1cGRhdGVkIGF0dHJpYnV0ZSB2YWx1ZXMgKG5vdCBwcmV2aW91c2x5IHNhdmVkKVxyXG4gICAgaWYgKGkgPCB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5zcGxpY2UoaSwgMSk7XHJcbiAgICB9XHJcbiAgICAvL0FkZCB0byBzbGljZWQgdmFsdWVzIChwcmV2aW91c2x5IHNhdmVkIC0gbmVlZCB0byByZW1vdmUpXHJcbiAgICBlbHNlIHtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCkuYXR0cmlidXRlVmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCkuYXR0cmlidXRlVmFsdWVzW2ldLmlkQXR0cmlidXRlID09PSBhdHRyaWJ1dGUuaWRBdHRyaWJ1dGVcclxuICAgICAgICAgICAgJiYgdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QuZ2V0VmFsdWUoKS5hdHRyaWJ1dGVWYWx1ZXNbaV0udmFsdWVBdHRyaWJ1dGVDaG9pY2UuaWRBdHRyaWJ1dGVDaG9pY2UgPT09IGF0dHJpYnV0ZUNob2ljZS5pZEF0dHJpYnV0ZUNob2ljZSkge1xyXG4gICAgICAgICAgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMucHVzaCh0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5nZXRWYWx1ZSgpLmF0dHJpYnV0ZVZhbHVlc1tpXSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL09ubHkgZmxhZ2dpbmcgZGlydHkgZm9yIG5vbi1ncmlkIHJvd3MgKHRob3NlIGFyZSBzYXZlZCBpbW1lZGlhdGVseSlcclxuICAgIGlmICghIGF0dHJpYnV0ZS5pZEdyb3VwQXR0cmlidXRlKSB7XHJcbiAgICAgIHRoaXMuZGlydHkubmV4dCh0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmUgYW4gYXR0cmlidXRlIHZhbHVlLiAgVHlwaWNhbGx5IGluIHRoZSBjYXNlIG9mIGEgbXVsdGkgc2VsZWN0IHdoZXJlIHRoZSB1bnNlbGVjdGVkIHZhbHVlIGlzIHJlbW92ZWQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0F0dHJpYnV0ZX0gYXR0cmlidXRlXHJcbiAgICogQHBhcmFtIHtBdHRyaWJ1dGVDaG9pY2V9IGF0dHJpYnV0ZUNob2ljZVxyXG4gICAqL1xyXG4gIHNwbGljZUF0dHJpYnV0ZVZhbHVlRGljdChhdHRyaWJ1dGU6IEF0dHJpYnV0ZSwgdmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJzbGljZUF0dHJpYnV0ZVZhbHVlOiBcIiArIGF0dHJpYnV0ZS5pZEF0dHJpYnV0ZSArIFwiLCBcIiArIHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgaTogbnVtYmVyID0gMDtcclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXS5pZEF0dHJpYnV0ZSA9PT0gYXR0cmlidXRlLmlkQXR0cmlidXRlICYmIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXS52YWx1ZUlkRGljdGlvbmFyeSA9PT0gdmFsdWUpIHtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy9SZW1vdmUgZnJvbSB1cGRhdGVkIGF0dHJpYnV0ZSB2YWx1ZXMgKG5vdCBwcmV2aW91c2x5IHNhdmVkKVxyXG4gICAgaWYgKGkgPCB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5zcGxpY2UoaSwgMSk7XHJcbiAgICB9XHJcbiAgICAvL0FkZCB0byBzbGljZWQgdmFsdWVzIChwcmV2aW91c2x5IHNhdmVkIC0gbmVlZCB0byByZW1vdmUpXHJcbiAgICBlbHNlIHtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCkuYXR0cmlidXRlVmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCkuYXR0cmlidXRlVmFsdWVzW2ldLmlkQXR0cmlidXRlID09PSBhdHRyaWJ1dGUuaWRBdHRyaWJ1dGVcclxuICAgICAgICAgICAgJiYgdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QuZ2V0VmFsdWUoKS5hdHRyaWJ1dGVWYWx1ZXNbaV0udmFsdWVJZERpY3Rpb25hcnkgPT09IHZhbHVlKSB7XHJcbiAgICAgICAgICB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5wdXNoKHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCkuYXR0cmlidXRlVmFsdWVzW2ldKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vT25seSBmbGFnZ2luZyBkaXJ0eSBmb3Igbm9uLWdyaWQgcm93cyAodGhvc2UgYXJlIHNhdmVkIGltbWVkaWF0ZWx5KVxyXG4gICAgaWYgKCEgYXR0cmlidXRlLmlkR3JvdXBBdHRyaWJ1dGUpIHtcclxuICAgICAgdGhpcy5kaXJ0eS5uZXh0KHRydWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBhdHRyaWJ1dGUgYmFzZWQgdXBvbiB0aGUgaWRBdHRyaWJ1dGUuICBUaGlzIGlzIGZyb20gdGhlIG1hcCBvZiBhdHRyaWJ1dGVzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkQXR0cmlidXRlXHJcbiAgICogQHJldHVybnMge0F0dHJpYnV0ZX1cclxuICAgKi9cclxuICBnZXRBdHRyaWJ1dGUoaWRBdHRyaWJ1dGU6IG51bWJlcik6IEF0dHJpYnV0ZSB7XHJcbiAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGVNYXAuZ2V0KGlkQXR0cmlidXRlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZvciB0aGUgYXR0cmlidXRlIGNvbmZpZ3VyYXRpb24sIHNldCBhbGwgb2YgdGhlIG5lZ2F0aXZlIGlkcyB0byB1bmRlZmluZWQgcHJpb3IgdG8gcG9zdGluZy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlQ29uZmlndXJhdGlvbn0gYXR0cmlidXRlQ29uZmlndXJhdGlvblxyXG4gICAqL1xyXG4gIHNldE5lZ2F0aXZlSWRzVG9VbmRlZmluZWQoYXR0cmlidXRlQ29uZmlndXJhdGlvbjogQXR0cmlidXRlQ29uZmlndXJhdGlvbik6IHZvaWQge1xyXG4gICAgaWYgKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uIDwgMCkge1xyXG4gICAgICBhdHRyaWJ1dGVDb25maWd1cmF0aW9uLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbiA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGxldCBhdHRyaWJ1dGVDb250YWluZXIgb2YgYXR0cmlidXRlQ29uZmlndXJhdGlvbi5hdHRyaWJ1dGVDb250YWluZXJzKSB7XHJcbiAgICAgIGlmIChhdHRyaWJ1dGVDb250YWluZXIuaWRBdHRyaWJ1dGVDb250YWluZXIgIDwgMCkge1xyXG4gICAgICAgIGF0dHJpYnV0ZUNvbnRhaW5lci5pZEF0dHJpYnV0ZUNvbnRhaW5lciA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChsZXQgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZUNvbnRhaW5lci5ncmFwaGljYWxBdHRyaWJ1dGVzKSB7XHJcblxyXG4gICAgICAgIGlmIChhdHRyaWJ1dGUuaWRBdHRyaWJ1dGUgIDwgMCkge1xyXG4gICAgICAgICAgYXR0cmlidXRlLmlkQXR0cmlidXRlID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGF0dHJpYnV0ZS5hdHRyaWJ1dGVDaG9pY2VzKSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBhdHRyaWJ1dGVDaG9pY2Ugb2YgYXR0cmlidXRlLmF0dHJpYnV0ZUNob2ljZXMpIHtcclxuICAgICAgICAgICAgZGVsZXRlIGF0dHJpYnV0ZVtcInZhbHVlXCJdO1xyXG5cclxuICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZUNob2ljZS5pZEF0dHJpYnV0ZSAgPCAwKSB7XHJcbiAgICAgICAgICAgICAgYXR0cmlidXRlQ2hvaWNlLmlkQXR0cmlidXRlID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVDaG9pY2UuaWRBdHRyaWJ1dGVDaG9pY2UgIDwgMCkge1xyXG4gICAgICAgICAgICAgIGF0dHJpYnV0ZUNob2ljZS5pZEF0dHJpYnV0ZUNob2ljZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBhIGRpc3BsYXkgbmFtZSBmb3IgdGhlIGF0dHJpYnV0ZSBjb25maWd1cmF0aW9uIGJhc2VkIG9uIHRoZSBjb250ZXh0IGNvZGUgYW5kIGlkLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtBdHRyaWJ1dGVDb25maWd1cmF0aW9ufSBjb25maWd1cmF0aW9uXHJcbiAgICogQHJldHVybnMge3N0cmluZ31cclxuICAgKi9cclxuICBnZXRDb25maWd1cmF0aW9uTmFtZShjb25maWd1cmF0aW9uOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPKTogc3RyaW5nIHtcclxuICAgIGlmIChjb25maWd1cmF0aW9uLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbiA9PT0gLTEpIHtcclxuICAgICAgcmV0dXJuIFwiTmV3XCI7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG5hbWU6IHN0cmluZyA9IGNvbmZpZ3VyYXRpb24uY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dERpc3BsYXkgKyBcIjogXCIgKyBjb25maWd1cmF0aW9uLmV4dGVuc2lvbkRlc2NyaXB0aW9uO1xyXG5cclxuICAgIGlmIChjb25maWd1cmF0aW9uLmlkRmlsdGVyMSkge1xyXG4gICAgICBuYW1lICs9IFwiIC0gXCIgKyBjb25maWd1cmF0aW9uLmZpbHRlcjFEaXNwbGF5O1xyXG4gICAgfVxyXG4gICAgaWYgKGNvbmZpZ3VyYXRpb24uaWRGaWx0ZXIyKSB7XHJcbiAgICAgIG5hbWUgKz0gXCIgLSBcIiArIGNvbmZpZ3VyYXRpb24uZmlsdGVyMkRpc3BsYXk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmFtZTtcclxuICB9XHJcblxyXG4gIGdldEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE8oY2ZnOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uKTogQXR0cmlidXRlQ29uZmlndXJhdGlvbkRUTyB7XHJcbiAgICBpZiAoIWNmZykge1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBkdG86IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE8gPSA8QXR0cmlidXRlQ29uZmlndXJhdGlvbkRUTz57XHJcbiAgICAgIGlkQXR0cmlidXRlQ29uZmlndXJhdGlvbjogY2ZnLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbixcclxuICAgICAgY29kZUF0dHJpYnV0ZUNvbnRleHQ6IGNmZy5jb2RlQXR0cmlidXRlQ29udGV4dCxcclxuICAgICAgY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dDogY2ZnLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQsXHJcbiAgICAgIGlkRmlsdGVyMTogY2ZnLmlkRmlsdGVyMSxcclxuICAgICAgaWRGaWx0ZXIyOiBjZmcuaWRGaWx0ZXIyXHJcbiAgICB9O1xyXG5cclxuICAgIGlmICh0aGlzLmF0dHJpYnV0ZUNvbnRleHRMaXN0U3ViamVjdC5nZXRWYWx1ZSgpKSB7XHJcbiAgICAgIGR0by5leHRlbnNpb25EZXNjcmlwdGlvbiA9IHRoaXMuYXR0cmlidXRlQ29udGV4dExpc3RTdWJqZWN0LmdldFZhbHVlKCkuZmlsdGVyKChjdHg6IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBjdHguY29kZUF0dHJpYnV0ZUNvbnRleHQgPT09IGNmZy5jb2RlQXR0cmlidXRlQ29udGV4dDtcclxuICAgICAgfSlbMF0uZXh0ZW5zaW9uRGVzY3JpcHRpb247XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuYXR0cmlidXRlU2VjdXJpdHlDb250ZXh0TGlzdFN1YmplY3QuZ2V0VmFsdWUoKSkge1xyXG4gICAgICBsZXQgcmVzdWx0OiBhbnlbXSA9IHRoaXMuYXR0cmlidXRlU2VjdXJpdHlDb250ZXh0TGlzdFN1YmplY3QuZ2V0VmFsdWUoKS5maWx0ZXIoKGZpbHRlcjogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGZpbHRlci5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0ID09PSBjZmcuY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dDtcclxuICAgICAgfSk7XHJcbiAgICAgIGR0by5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0RGlzcGxheSA9IChyZXN1bHQgJiYgcmVzdWx0Lmxlbmd0aCA+IDApID8gcmVzdWx0WzBdLmRlc2NyaXB0aW9uIDogdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmZpbHRlcjFMaXN0U3ViamVjdC5nZXRWYWx1ZSgpKSB7XHJcbiAgICAgIGxldCByZXN1bHQ6IGFueVtdID0gdGhpcy5maWx0ZXIxTGlzdFN1YmplY3QuZ2V0VmFsdWUoKS5maWx0ZXIoKGZpbHRlcjogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGZpbHRlci5jb2RlQXR0cmlidXRlQ29udGV4dCA9PT0gY2ZnLmNvZGVBdHRyaWJ1dGVDb250ZXh0XHJcbiAgICAgICAgICAmJiBmaWx0ZXIuY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dCA9PT0gY2ZnLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRcclxuICAgICAgICAgICYmIGZpbHRlci5pZEZpbHRlcjEgPT09IGNmZy5pZEZpbHRlcjE7XHJcbiAgICAgIH0pO1xyXG4gICAgICBkdG8uZmlsdGVyMURpc3BsYXkgPSAocmVzdWx0ICYmIHJlc3VsdC5sZW5ndGggPiAwKSA/IHJlc3VsdFswXS5kaXNwbGF5IDogdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmZpbHRlcjJMaXN0U3ViamVjdC5nZXRWYWx1ZSgpKSB7XHJcbiAgICAgIGxldCByZXN1bHQ6IGFueVtdID0gdGhpcy5maWx0ZXIyTGlzdFN1YmplY3QuZ2V0VmFsdWUoKS5maWx0ZXIoKGZpbHRlcjogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGZpbHRlci5jb2RlQXR0cmlidXRlQ29udGV4dCA9PT0gY2ZnLmNvZGVBdHRyaWJ1dGVDb250ZXh0XHJcbiAgICAgICAgICAmJiBmaWx0ZXIuY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dCA9PT0gY2ZnLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRcclxuICAgICAgICAgICYmIGZpbHRlci5pZEZpbHRlcjEgPT09IGNmZy5pZEZpbHRlcjFcclxuICAgICAgICAgICYmIGZpbHRlci5pZEZpbHRlcjIgPT09IGNmZy5pZEZpbHRlcjI7XHJcbiAgICAgIH0pO1xyXG4gICAgICBkdG8uZmlsdGVyMkRpc3BsYXkgPSAocmVzdWx0ICYmIHJlc3VsdC5sZW5ndGggPiAwKSA/IHJlc3VsdFswXS5kaXNwbGF5IDogdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBkdG87XHJcbiAgfVxyXG5cclxuICBnZXRTZWN1cml0eUNvZGVDb250ZXh0KGNvZGU6IHN0cmluZyk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRMaXN0U3ViamVjdC5nZXRWYWx1ZSgpLmZpbHRlcigoZmlsdGVyOiBhbnkpID0+IHtcclxuICAgICAgcmV0dXJuIGZpbHRlci5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0ID09PSBjb2RlO1xyXG4gICAgfSlbMF07XHJcbiAgfVxyXG5cclxuICBnZXRBdHRyaWJ1dGVDb250ZXh0TG9hZGluZ1N1YmplY3QoKTogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+IHtcclxuICAgIHJldHVybiB0aGlzLmF0dHJpYnV0ZUNvbnRleHRMb2FkaW5nU3ViamVjdDtcclxuICB9XHJcblxyXG4gIGdldEZpbHRlcjFGb3IoY29kZUF0dHJpYnV0ZUNvbnRleHQ6IHN0cmluZywgY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dDogc3RyaW5nKTogYW55W10ge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyMUxpc3RTdWJqZWN0LmdldFZhbHVlKCkuZmlsdGVyKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgcmV0dXJuIGl0ZW0uY29kZUF0dHJpYnV0ZUNvbnRleHQgPT09IGNvZGVBdHRyaWJ1dGVDb250ZXh0ICYmIGl0ZW0uY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dCA9PT0gY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dDtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0RmlsdGVyMkZvcihjb2RlQXR0cmlidXRlQ29udGV4dDogc3RyaW5nLCBjb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0OiBzdHJpbmcsIGlkRmlsdGVyMTogbnVtYmVyKTogYW55W10ge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyMkxpc3RTdWJqZWN0LmdldFZhbHVlKCkuZmlsdGVyKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgcmV0dXJuIGl0ZW0uY29kZUF0dHJpYnV0ZUNvbnRleHQgPT09IGNvZGVBdHRyaWJ1dGVDb250ZXh0XHJcbiAgICAgICAgJiYgaXRlbS5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0ID09PSBjb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0XHJcbiAgICAgICAgJiYgaXRlbS5pZEZpbHRlcjEgPT09IGlkRmlsdGVyMTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVHJhY2sgbmV3IGlkQXR0cmlidXRlVmFsdWVzIHZpYSBhIG5lZ2F0aXZlIG51bWJlciBmb3IgaW50ZXJuYWwgdHJhY2tpbmcuICBSZW1vdmUgdGhpcyBmYWtlIGlkIHByaW9yIHRvIHBvc3QuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gICAqL1xyXG4gIGdldFVuaXF1ZUlkKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gLS10aGlzLnVuaXF1ZUlkO1xyXG4gIH1cclxufVxyXG4iXX0=