@rangertechnologies/ngnxt 2.1.11 → 2.1.12

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.
@@ -40,7 +40,7 @@ export class BookletComponent {
40
40
  // HA 19DEC23 langDirection variable is created to assign the direction as class
41
41
  langDirection = 'ltr'; // HA 28DEC23 making ltr as default direction
42
42
  answerList = []; // HA 11-JAN-24 Answerlist to store the minimal value
43
- inputForQuestions = {}; // HA 18-JAN-24 To insert the endpoint value to the question
43
+ dataBind = {}; // HA 18-JAN-24 To insert the endpoint value to the question
44
44
  constructor(sfService, dataService, storageService, route, sanitizer, changeService, el, i18nService) {
45
45
  this.sfService = sfService;
46
46
  this.dataService = dataService;
@@ -55,7 +55,7 @@ export class BookletComponent {
55
55
  }
56
56
  ngOnInit() {
57
57
  // HA 18-JAN-24 Dummy Static data for testing
58
- // this.inputForQuestions = {
58
+ // this.dataBind = {
59
59
  // "_id": "659ed002ed51bb8061544255",
60
60
  // "companyId": "5ullh1BWpYqnvzKh9L",
61
61
  // "name": "Al Yasmine",
@@ -68,6 +68,15 @@ export class BookletComponent {
68
68
  // "customer": "check",
69
69
  // "dati": "2024-01-23T18:30:00.000Z",
70
70
  // "timi": "2024-01-23T18:30:00.000Z",
71
+ // "fName": "Haider",
72
+ // "lName": "Ali",
73
+ // "defaultApp": "NXT",
74
+ // "email": "haider@gmail.com",
75
+ // "location": {address: "107, Ashok Nagar, Kadugondanahalli, Bengaluru, Karnataka 560045, India",
76
+ // latitude: 13.0200575,
77
+ // longitude: 77.6129816},
78
+ // "location": "107, Ashok Nagar, Kadugondanahalli, Bengaluru, Karnataka 560045, India",
79
+ // "textArea": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum",
71
80
  // };
72
81
  this.processBooklet();
73
82
  }
@@ -105,7 +114,8 @@ export class BookletComponent {
105
114
  // Process the Questions
106
115
  // HA 28DEC23 this applies for booklet
107
116
  // HA 17JAN24 Added ternary operator to avoid undefined scenario
108
- if (Object.keys(this.bookletJSON?.bookQuestionsMap).length > 0) {
117
+ // HA 09FEB24 Adding condition to avoid undefined error
118
+ if (this.bookletJSON?.bookQuestionsMap && Object.keys(this.bookletJSON?.bookQuestionsMap).length > 0) {
109
119
  for (var value in this.bookletJSON.bookQuestionsMap) {
110
120
  this.bookQuestionsMap.set(value, this.bookletJSON.bookQuestionsMap[value]);
111
121
  }
@@ -113,7 +123,8 @@ export class BookletComponent {
113
123
  // HA 28DEC23 this applies for book or questions
114
124
  else {
115
125
  var value = '';
116
- value = this.bookletJSON.records[0].Id;
126
+ // HA 09FEB24 Added ternary
127
+ value = this.bookletJSON.records[0]?.Id;
117
128
  this.bookQuestionsMap.set(value, this.bookletJSON.questionbook);
118
129
  }
119
130
  if (this.bookletJSON.questionbook?.Actions__c != undefined) {
@@ -121,6 +132,7 @@ export class BookletComponent {
121
132
  }
122
133
  }
123
134
  // HA 19DEC23 langDirection variable value assigning
135
+ // console.log('Style__c', this.bookletJSON.questionbook.Style__c);
124
136
  if (this.bookletJSON?.questionbook?.Style__c) {
125
137
  var style = JSON.parse(JSON.parse(JSON.stringify(this.bookletJSON?.questionbook?.Style__c)));
126
138
  this.langDirection = style?.direction;
@@ -177,6 +189,7 @@ export class BookletComponent {
177
189
  handleBookletActionClick(action) {
178
190
  // HA 19JAN24 Action changes
179
191
  this.answerList = [];
192
+ this.dataBind = []; // HA 12FEB24 Clearing dataBind upon button action so that dataBind value will not override the changed value
180
193
  console.log(action);
181
194
  let dataToParent = {};
182
195
  // HA 22JAN24 this change to make close event work
@@ -237,8 +250,9 @@ export class BookletComponent {
237
250
  // HA 11-JAN-24 handleQues to load question
238
251
  handleQues(ques) {
239
252
  // HA 19-JAN-24 If condition is for bind-in, correction
240
- if (Object.keys(this.inputForQuestions).length > 0) {
241
- for (let [key, value] of Object.entries(this.inputForQuestions)) {
253
+ // HA 09FEB24 Adding condition to avoid undefined error
254
+ if (this.dataBind && Object.keys(this.dataBind).length > 0) {
255
+ for (let [key, value] of Object.entries(this.dataBind)) {
242
256
  if (ques.Reference_Field__c === key) {
243
257
  if (ques.Type__c === 'Dropdown') {
244
258
  this.sqOptions.forEach(element => {
@@ -252,9 +266,16 @@ export class BookletComponent {
252
266
  else if (ques.Type__c === 'Date' || ques.Type__c == 'DateTime') {
253
267
  ques.input = new Date(value.toString());
254
268
  }
269
+ // HA 12FEB24 To bind-in Location Type
270
+ else if (ques.Type__c === 'Location') {
271
+ console.log('value ', value);
272
+ ques.input = value;
273
+ ques.selectedValue = value['address'] ? value['address'] : value;
274
+ }
255
275
  else {
256
276
  ques.input = value;
257
277
  }
278
+ this.answerList.push(ques); // HA 12FEB24 To give the value for data
258
279
  }
259
280
  }
260
281
  }
@@ -263,6 +284,10 @@ export class BookletComponent {
263
284
  question['id'] = ques.Id;
264
285
  // question['Question__c'] = ques.Question__c;
265
286
  question['input'] = ques.input;
287
+ // HA 12FEB24 To bind-out Location Type
288
+ if (ques.Type__c === 'Location') {
289
+ question['input'] = ques.input ? ques.input : ques.selectedValue;
290
+ }
266
291
  question['Type__c'] = ques.Type__c;
267
292
  question['Question_No__c'] = ques.Question_No__c;
268
293
  question['Reference_Field__c'] = ques?.Reference_Field__c;
@@ -276,11 +301,14 @@ export class BookletComponent {
276
301
  // HA 31-JAN-24 Added ternary to avoid undefined
277
302
  for (var sq in this.bookQuestionsMap?.get(qbId)?.Questions__r?.records) {
278
303
  let q = this.bookQuestionsMap?.get(qbId).Questions__r.records[sq];
279
- if (q.Type__c == 'Dropdown') {
280
- questions.push(this.sqOptions.get(q.Id));
281
- }
282
- else {
283
- questions.push(q);
304
+ // HA 09FEB24 if question is there process
305
+ if (q) {
306
+ if (q.Type__c == 'Dropdown' && this.sqOptions.get(q.Id)) {
307
+ questions.push(this.sqOptions.get(q.Id));
308
+ }
309
+ else {
310
+ questions.push(q);
311
+ }
284
312
  }
285
313
  }
286
314
  // console.log(questions);
@@ -295,7 +323,7 @@ export class BookletComponent {
295
323
  this.hadleDropDownDependent.emit(event);
296
324
  }
297
325
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BookletComponent, deps: [{ token: i1.SalesforceService }, { token: i2.DataService }, { token: i3.StorageService }, { token: i4.ActivatedRoute }, { token: i5.DomSanitizer }, { token: i6.ChangeService }, { token: i0.ElementRef }, { token: i7.I18nService }], target: i0.ɵɵFactoryTarget.Component });
298
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: BookletComponent, selector: "lib-booklet", inputs: { bookletId: "bookletId", serv: "serv", tkn: "tkn", bookletJSON: "bookletJSON", dropdownDependentData: "dropdownDependentData", labelValue: "labelValue", token: "token", inputForQuestions: "inputForQuestions" }, outputs: { handleBookletActionEvent: "handleBookletActionEvent", handlePage: "handlePage", hadleDropDownDependent: "hadleDropDownDependent" }, usesOnChanges: true, ngImport: i0, template: "<ngx-spinner [name]=\"spinnerName\" [type]=\"spinnerType\"></ngx-spinner>\n<!-- Booklet Handling-->\n<!-- HA 19DEC23 For Direction -->\n<div *ngFor=\"let qb of booklet\" [ngClass]=\"langDirection\">\n <!-- MR Commented below code to ensure single JSON for UNCONDITIONAL Booklets -->\n <!-- <lib-questionnaire [serv]=\"serv\" [qbId]=\"qb.Id\" [tkn]=\"tkn\"></lib-questionnaire> -->\n <!-- HA 28DEC23 Below If logic is to load from booklet -->\n <div *ngIf=\"qb.Questions__r?.records; else elseBlock\">\n <div *ngFor=\"let ques of qb.Questions__r.records\" [class]=\"qb.isShengel__c ? 'questiondiv1' : 'questiondiv1 padd-bottom'\">\n <div class=\"questiondiv2\">\n <!-- HA 17JAN24 - Is title is enabled so that based on the boolean div will be visible -->\n <div *ngIf=\"ques.Is_Title__c\" [class]=\"qb.isShengel__c ? 'header-style' : 'question-f-size additional'\">\n <!-- VD 08NOV23 - showing lable when its available-->\n <div [innerHTML]=\"getText(ques?.Question_Text__c)\" *ngIf=\"ques?.Question_Text__c\" > \n {{ ques?.Question_Text__c }}\n </div>\n </div> <!-- VD 19JAN24 - getting token as input -->\n <lib-questionbook [qbItem]=\"qb\" [token]=\"token\" [labelValue]=\"labelValue\" [questionItem]=\"ques\" [questions]=\"readQuestions(qb.Id)\" (handleDropDown)=\"getDropDown($event)\"></lib-questionbook>\n </div>\n </div>\n </div>\n <!-- HA 28DEC23 Below else logic is to load from books or questions -->\n <ng-template #elseBlock>\n <div [class]=\"qb.isShengel__c ? 'questiondiv1' : 'questiondiv1 padd-bottom'\">\n <div class=\"questiondiv2\">\n <div *ngIf=\"!qb.Is_Title__c\" [class]=\"qb.isShengel__c ? 'header-style' : 'question-f-size additional'\">\n <!-- VD 08NOV23 - showing lable when its available-->\n <div [innerHTML]=\"getText(qb?.Question_Text__c)\" *ngIf=\"qb?.Question_Text__c\" > \n {{ qb?.Question_Text__c }}\n {{ qb?.Title__c }}\n </div>\n </div> <!-- VD 19JAN24 - getting token as input -->\n <lib-questionbook [qbItem]=\"qb\" [token]=\"token\" [labelValue]=\"labelValue\" [questionItem]=\"qb\" [questions]=\"readQuestions(qb.Id)\" (handleDropDown)=\"getDropDown($event)\"></lib-questionbook>\n </div>\n </div>\n </ng-template>\n</div>\n\n<!-- Group Actions -->\n<!-- HA 19DEC23 For Direction -->\n<div class=\"align-submit-row\" *ngIf=\"abItem?.Status__c != 'Completed'\" [ngClass]=\"langDirection\">\n <div *ngFor=\"let action of actions; let i = index\">\n <!-- // HA 22JAN24 Commonise the button style in fusion -->\n <button (click)=\"handleBookletActionClick(action)\" ngClass=\"btn btn-primary fc-button nxtButton\">\n {{ action.name }}\n </button>\n </div>\n</div>\n", styles: [".align-submit-row{display:flex}.header-style{padding:15px;background:#f8f8f8;color:#898989;border:1px solid #e8e8e8;border-top-left-radius:5px;border-top-right-radius:5px;margin-left:0;justify-content:left;font-size:15px}.rtl{flex-direction:row-reverse}\n"], dependencies: [{ kind: "directive", type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i9.NgxSpinnerComponent, selector: "ngx-spinner", inputs: ["disableAnimation", "bdColor", "zIndex", "color", "type", "size", "fullScreen", "name", "template", "showSpinner"] }, { kind: "component", type: i10.QuestionbookComponent, selector: "lib-questionbook", inputs: ["qbItem", "questionItem", "questions", "errorFieldId", "labelValue", "token", "dropDownData"], outputs: ["handleDropDown", "hadleDropDownDependent"] }] });
326
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: BookletComponent, selector: "lib-booklet", inputs: { bookletId: "bookletId", serv: "serv", tkn: "tkn", bookletJSON: "bookletJSON", dropdownDependentData: "dropdownDependentData", labelValue: "labelValue", token: "token", dataBind: "dataBind" }, outputs: { handleBookletActionEvent: "handleBookletActionEvent", handlePage: "handlePage", hadleDropDownDependent: "hadleDropDownDependent" }, usesOnChanges: true, ngImport: i0, template: "<ngx-spinner [name]=\"spinnerName\" [type]=\"spinnerType\"></ngx-spinner>\n<!-- Booklet Handling-->\n<!-- HA 19DEC23 For Direction -->\n<div *ngFor=\"let qb of booklet\" [ngClass]=\"langDirection\">\n <!-- MR Commented below code to ensure single JSON for UNCONDITIONAL Booklets -->\n <!-- <lib-questionnaire [serv]=\"serv\" [qbId]=\"qb.Id\" [tkn]=\"tkn\"></lib-questionnaire> -->\n <!-- HA 28DEC23 Below If logic is to load from booklet -->\n <div *ngIf=\"qb.Questions__r?.records; else elseBlock\">\n <div *ngFor=\"let ques of qb.Questions__r.records\" [class]=\"qb.isShengel__c ? 'questiondiv1' : 'questiondiv1 padd-bottom'\">\n <div class=\"questiondiv2\">\n <!-- HA 17JAN24 - Is title is enabled so that based on the boolean div will be visible -->\n <div *ngIf=\"ques.Is_Title__c\" [class]=\"qb.isShengel__c ? 'header-style' : 'question-f-size additional'\">\n <!-- VD 08NOV23 - showing lable when its available-->\n <div [innerHTML]=\"getText(ques?.Question_Text__c)\" *ngIf=\"ques?.Question_Text__c\" > \n {{ ques?.Question_Text__c }}\n </div>\n </div> <!-- VD 19JAN24 - getting token as input -->\n <lib-questionbook [qbItem]=\"qb\" [token]=\"token\" [labelValue]=\"labelValue\" [questionItem]=\"ques\" [questions]=\"readQuestions(qb.Id)\" (handleDropDown)=\"getDropDown($event)\"></lib-questionbook>\n </div>\n </div>\n </div>\n <!-- HA 28DEC23 Below else logic is to load from books or questions -->\n <ng-template #elseBlock>\n <div [class]=\"qb.isShengel__c ? 'questiondiv1' : 'questiondiv1 padd-bottom'\">\n <div class=\"questiondiv2\">\n <div *ngIf=\"!qb.Is_Title__c\" [class]=\"qb.isShengel__c ? 'header-style' : 'question-f-size additional'\">\n <!-- VD 08NOV23 - showing lable when its available-->\n <div [innerHTML]=\"getText(qb?.Question_Text__c)\" *ngIf=\"qb?.Question_Text__c\" > \n {{ qb?.Question_Text__c }}\n {{ qb?.Title__c }}\n </div>\n </div> <!-- VD 19JAN24 - getting token as input -->\n <lib-questionbook [qbItem]=\"qb\" [token]=\"token\" [labelValue]=\"labelValue\" [questionItem]=\"qb\" [questions]=\"readQuestions(qb.Id)\" (handleDropDown)=\"getDropDown($event)\"></lib-questionbook>\n </div>\n </div>\n </ng-template>\n</div>\n\n<!-- Group Actions -->\n<!-- HA 19DEC23 For Direction -->\n<div class=\"align-submit-row\" *ngIf=\"abItem?.Status__c != 'Completed'\" [ngClass]=\"langDirection\">\n <div *ngFor=\"let action of actions; let i = index\">\n <!-- // HA 22JAN24 Commonise the button style in fusion -->\n <button (click)=\"handleBookletActionClick(action)\" ngClass=\"btn btn-primary fc-button nxtButton\">\n {{ action.name }}\n </button>\n </div>\n</div>\n", styles: [".align-submit-row{display:flex}.header-style{padding:15px;background:#f8f8f8;color:#898989;border:1px solid #e8e8e8;border-top-left-radius:5px;border-top-right-radius:5px;margin-left:0;justify-content:left;font-size:15px}.rtl{flex-direction:row-reverse}\n"], dependencies: [{ kind: "directive", type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i9.NgxSpinnerComponent, selector: "ngx-spinner", inputs: ["disableAnimation", "bdColor", "zIndex", "color", "type", "size", "fullScreen", "name", "template", "showSpinner"] }, { kind: "component", type: i10.QuestionbookComponent, selector: "lib-questionbook", inputs: ["qbItem", "questionItem", "questions", "errorFieldId", "labelValue", "token", "dropDownData"], outputs: ["handleDropDown", "hadleDropDownDependent"] }] });
299
327
  }
300
328
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BookletComponent, decorators: [{
301
329
  type: Component,
@@ -320,7 +348,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
320
348
  type: Output
321
349
  }], hadleDropDownDependent: [{
322
350
  type: Output
323
- }], inputForQuestions: [{
351
+ }], dataBind: [{
324
352
  type: Input
325
353
  }] } });
326
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9va2xldC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtYXBwL3NyYy9saWIvcGFnZXMvYm9va2xldC9ib29rbGV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL254dC1hcHAvc3JjL2xpYi9wYWdlcy9ib29rbGV0L2Jvb2tsZXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFJVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksR0FJYixNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7Ozs7O0FBa0J2QixNQUFNLE9BQU8sZ0JBQWdCO0lBNEJqQjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFFRDtJQWxDQSxTQUFTLENBQVM7SUFDbEIsSUFBSSxDQUFTO0lBQ2IsR0FBRyxDQUFTO0lBQ1osV0FBVyxDQUFNO0lBQ2pCLHFCQUFxQixDQUFLO0lBQzFCLFVBQVUsQ0FBUTtJQUNsQixLQUFLLENBQVE7SUFDWix3QkFBd0IsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUNqRSxVQUFVLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7SUFDbkQsc0JBQXNCLEdBQXFCLElBQUksWUFBWSxFQUFFLENBQUM7SUFFakUsVUFBVSxDQUFpQjtJQUUzQixPQUFPLEdBQVUsRUFBRSxDQUFDO0lBQ3BCLE1BQU0sR0FBUSxFQUFFLENBQUM7SUFDakIsT0FBTyxHQUFpQixFQUFFLENBQUM7SUFDM0IsZ0JBQWdCLEdBQVEsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNqQyxTQUFTLEdBQVEsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUM1QixZQUFZLEdBQVksS0FBSyxDQUFDO0lBQzlCLFdBQVcsQ0FBUztJQUNwQixXQUFXLENBQVM7SUFDM0IsZ0ZBQWdGO0lBQ2hGLGFBQWEsR0FBRyxLQUFLLENBQUMsQ0FBQyw2Q0FBNkM7SUFDcEUsVUFBVSxHQUFHLEVBQUUsQ0FBQyxDQUFDLHFEQUFxRDtJQUM3RCxpQkFBaUIsR0FBUSxFQUFFLENBQUMsQ0FBQyw0REFBNEQ7SUFFbEcsWUFDVSxTQUE0QixFQUM1QixXQUF3QixFQUN4QixjQUE4QixFQUM5QixLQUFxQixFQUNyQixTQUF1QixFQUN2QixhQUE0QixFQUNwQyxFQUFjLEVBQ1AsV0FBd0I7UUFQdkIsY0FBUyxHQUFULFNBQVMsQ0FBbUI7UUFDNUIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3JCLGNBQVMsR0FBVCxTQUFTLENBQWM7UUFDdkIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFFN0IsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFFL0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxDQUFDLFdBQVcsR0FBRyxxQkFBcUIsQ0FBQztRQUN6QyxPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixFQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFRCxRQUFRO1FBQ04sNkNBQTZDO1FBQzdDLDZCQUE2QjtRQUM3Qix1Q0FBdUM7UUFDdkMsdUNBQXVDO1FBQ3ZDLDBCQUEwQjtRQUMxQixxQkFBcUI7UUFDckIsNkJBQTZCO1FBQzdCLDZDQUE2QztRQUM3Qyw2Q0FBNkM7UUFDN0MsY0FBYztRQUNkLHNCQUFzQjtRQUN0Qix5QkFBeUI7UUFDekIsd0NBQXdDO1FBQ3hDLHdDQUF3QztRQUN4QyxLQUFLO1FBQ0wsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFDRix5RUFBeUU7SUFDeEUsV0FBVyxDQUFDLGFBQTJCO1FBQ3RDLHNDQUFzQztRQUN0QyxJQUFHLGFBQWEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxZQUFZLElBQUksSUFBSSxJQUFJLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxZQUFZLElBQUksU0FBUyxDQUFDLENBQUMsRUFBQztZQUM5SyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDdkI7UUFDRCxtREFBbUQ7UUFDbkQsNkJBQTZCO1FBQzdCLDhEQUE4RDtRQUM5RCwyQkFBMkI7UUFDM0IsSUFBSTtJQUNOLENBQUM7SUFFRCxjQUFjO1FBQ1osSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2xCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLElBQUksRUFBRSxFQUFFO2dCQUMvQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUNsQztTQUNGO2FBQU0sSUFBRyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQzFCLDhGQUE4RjtZQUM5RixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUV6QixJQUFHLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksU0FBUyxFQUFFO2dCQUMxRCwwQ0FBMEM7Z0JBQzFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUM5QztZQUVELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUM7WUFDeEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQztZQUUxQywyRkFBMkY7WUFDM0YsS0FBSyxJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRTtnQkFDekMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDeEQ7WUFFRCx3QkFBd0I7WUFDeEIsc0NBQXNDO1lBQ3RDLGdFQUFnRTtZQUNoRSxJQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUM7Z0JBQzVELEtBQUssSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRTtvQkFDbkQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2lCQUM1RTthQUNGO1lBQ0QsZ0RBQWdEO2lCQUM1QztnQkFDRixJQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQ2YsS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDdkMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUNqRTtZQUVELElBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsVUFBVSxJQUFJLFNBQVMsRUFBRTtnQkFDekQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQ3JFO1NBQ0Y7UUFDRCxvREFBb0Q7UUFDcEQsSUFBRyxJQUFJLENBQUMsV0FBVyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUM7WUFDMUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdGLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxFQUFFLFNBQVMsQ0FBQztTQUN2QzthQUNJLElBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFDO1lBQzdDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzRixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssRUFBRSxTQUFTLENBQUM7U0FDdkM7UUFFRCx3REFBd0Q7UUFDeEQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRU8sV0FBVyxHQUFHLENBQUMsSUFBWSxFQUFFLEVBQUU7UUFDckMsSUFBRyxJQUFJLENBQUMsSUFBSSxJQUFJLEtBQUssRUFBRTtZQUNyQixJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FDekIsSUFBSSxDQUFDLEdBQUcsRUFDUixDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQ3pCLElBQUksQ0FBQyxrQkFBa0IsRUFDdkIsSUFBSSxDQUFDLGtCQUFrQixDQUN4QixDQUFDO1NBQ0g7YUFBTTtZQUNMLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUN6Qix1QkFBdUIsRUFDdkIsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUN6QixJQUFJLENBQUMsa0JBQWtCLEVBQ3ZCLElBQUksQ0FBQyxrQkFBa0IsQ0FDeEIsQ0FBQztTQUNIO0lBQ0gsQ0FBQyxDQUFBO0lBRU8sa0JBQWtCLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRTtRQUN4QyxPQUFPLENBQUMsR0FBRyxDQUFDLCtCQUErQixDQUFDLENBQUM7UUFDN0MseUJBQXlCO1FBQ3pCLElBQUcsUUFBUSxJQUFJLElBQUksSUFBSSxRQUFRLElBQUksU0FBUyxFQUFFO1lBQzVDLDBDQUEwQztZQUMxQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUVuQyw4RkFBOEY7WUFDOUYsNEJBQTRCO1lBRTVCLElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQztZQUNoQyxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUM7WUFFbEMsMkZBQTJGO1lBQzNGLEtBQUssSUFBSSxFQUFFLElBQUksUUFBUSxDQUFDLFNBQVMsRUFBRTtnQkFDakMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUNoRDtZQUVELHdCQUF3QjtZQUN4QixLQUFLLElBQUksS0FBSyxJQUFJLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRTtnQkFDM0MsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDcEU7WUFFRCxJQUFHLFFBQVEsQ0FBQyxZQUFZLEVBQUUsVUFBVSxJQUFJLFNBQVMsRUFBRTtnQkFDakQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDN0Q7U0FDRjtRQUNELG9EQUFvRDtRQUNwRCxJQUFHLFFBQVEsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFDO1lBQ2xDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JGLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxFQUFFLFNBQVMsQ0FBQztTQUN2QzthQUNJLElBQUcsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUM7WUFDckMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkYsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLEVBQUUsU0FBUyxDQUFDO1NBQ3ZDO0lBQ0gsQ0FBQyxDQUFBO0lBRU8sa0JBQWtCLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRTtJQUUxQyxDQUFDLENBQUE7SUFFRCx3QkFBd0IsQ0FBQyxNQUFpQjtRQUN4Qyw0QkFBNEI7UUFDNUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFDckIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwQixJQUFJLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdEIsa0RBQWtEO1FBQ2xELFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDO1FBQzVDLElBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEtBQUssT0FBTyxDQUFDLEVBQUM7WUFDbkMsb0RBQW9EO1lBQ3BELFlBQVksQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3JELHdDQUF3QztZQUN4QyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0UseUVBQXlFO1lBQ3pFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUNyRCxZQUFZLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2hGLGlFQUFpRTtZQUNqRSxLQUFJLElBQUksR0FBRyxJQUFJLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxnQkFBZ0IsRUFBQztnQkFDdkQsTUFBTSxXQUFXLEdBQUksWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNwRSxXQUFXLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ2pELElBQUcsT0FBTyxDQUFDLGdCQUFnQixJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxRQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFDO3dCQUNsRixJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7cUJBQzdDO2dCQUNGLENBQUMsQ0FBQyxDQUFDO2FBQ0w7U0FDRjtRQUNELDZDQUE2QztRQUM3QyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCw4REFBOEQ7SUFDOUQscUJBQXFCLENBQUMsZUFBZTtRQUNuQyxJQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLGdCQUFnQixJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUMsRUFBRSw0Q0FBNEM7WUFDakgsSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLEVBQUUsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDO1NBQzlEO2FBQ0csRUFBRSxzQ0FBc0M7WUFDMUMsS0FBSyxNQUFNLEdBQUcsSUFBSSxlQUFlLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQ2xELE1BQU0sR0FBRyxHQUFHLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbEQsSUFBRyxHQUFHLENBQUMsT0FBTyxLQUFLLE1BQU0sRUFBQztvQkFDeEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7aUJBQ25DO3FCQUNHO29CQUNGLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQ3RCO2FBQ0Y7U0FDRjtJQUNILENBQUM7SUFFRCx5Q0FBeUM7SUFDekMsVUFBVSxDQUFDLFFBQWE7UUFDdEIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDbEMsSUFBRyxPQUFPLENBQUMsT0FBTyxLQUFLLE1BQU0sRUFBQztnQkFDNUIsd0NBQXdDO2dCQUN4QyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO2dCQUN6RCxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUNwRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN4QixDQUFDLENBQUMsQ0FBQzthQUNKO2lCQUNHO2dCQUNGLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDMUI7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCwyQ0FBMkM7SUFDM0MsVUFBVSxDQUFDLElBQVM7UUFDbEIsdURBQXVEO1FBQ3ZELElBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFDO1lBQ2hELEtBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFDO2dCQUM3RCxJQUFHLElBQUksQ0FBQyxrQkFBa0IsS0FBSyxHQUFHLEVBQUM7b0JBQ2pDLElBQUcsSUFBSSxDQUFDLE9BQU8sS0FBSyxVQUFVLEVBQUM7d0JBQzdCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFOzRCQUMvQixJQUFHLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEdBQUcsRUFBQztnQ0FDdkMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO2dDQUN0QyxPQUFPLENBQUMsZUFBZSxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7NkJBQ3ZEO3dCQUNILENBQUMsQ0FBQyxDQUFDO3FCQUNKO29CQUNELDBDQUEwQzt5QkFDckMsSUFBRyxJQUFJLENBQUMsT0FBTyxLQUFLLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLFVBQVUsRUFBQzt3QkFDNUQsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztxQkFDekM7eUJBQ0c7d0JBQ0YsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7cUJBQ3BCO2lCQUNGO2FBQ0Y7U0FDRjthQUNHO1lBQ0YsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDO1lBQ3BCLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3pCLDhDQUE4QztZQUM5QyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUMvQixRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUNuQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1lBQ2pELFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLElBQUksRUFBRSxrQkFBa0IsQ0FBQztZQUMxRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUNoQztJQUNILENBQUM7SUFFRCxhQUFhLENBQUMsSUFBWTtRQUN4QixnRUFBZ0U7UUFDaEUsMkNBQTJDO1FBQzNDLElBQUksU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNuQixnREFBZ0Q7UUFDaEQsS0FBSSxJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUU7WUFDckUsSUFBSSxDQUFDLEdBQWEsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzVFLElBQUcsQ0FBQyxDQUFDLE9BQU8sSUFBSSxVQUFVLEVBQUU7Z0JBQzFCLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDMUM7aUJBQU07Z0JBQ0wsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNuQjtTQUNGO1FBQ0QsMEJBQTBCO1FBQzFCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxPQUFPLENBQUMsS0FBSztRQUNYLElBQUksR0FBRyxHQUFHLElBQUksU0FBUyxFQUFFLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztRQUM5RCxnREFBZ0Q7UUFDaEQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLHVCQUF1QixDQUMzQyxHQUFHLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FDaEMsQ0FBQztJQUNKLENBQUM7SUFDRCxXQUFXLENBQUMsS0FBUztRQUNuQixJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFDLENBQUM7dUdBelRVLGdCQUFnQjsyRkFBaEIsZ0JBQWdCLG1iQzdCN0IsKzhGQWdEQTs7MkZEbkJhLGdCQUFnQjtrQkFMNUIsU0FBUzsrQkFDRSxhQUFhO3NTQUtkLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDSSx3QkFBd0I7c0JBQWpDLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxzQkFBc0I7c0JBQS9CLE1BQU07Z0JBZUUsaUJBQWlCO3NCQUF6QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBPbkluaXQsXG4gIE9uQ2hhbmdlcyxcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBFbGVtZW50UmVmLFxuICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgU2FsZXNmb3JjZVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvc2FsZXNmb3JjZS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBEYXRhU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RhdGEuc2VydmljZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUGFyYW1zIH0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlSHRtbCB9IGZyb20gXCJAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyXCI7XG5pbXBvcnQgeyBBY3Rpb25NZXRhIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9hY3Rpb25NZXRhJztcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4uLy4uL3dyYXBwZXJcIjtcbmltcG9ydCB7IEJvb2tsZXRXcmFwcGVyIH0gZnJvbSBcIi4uLy4uL21vZGVsL2Jvb2tsZXRXcmFwcGVyXCI7XG5pbXBvcnQgeyBTdG9yYWdlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3N0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBDaGFuZ2VTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL2NoYW5nZS5zZXJ2aWNlXCI7XG4vLyBIQSAxOURFQzIzIGltcG9ydGVkIHRyYW5zbGF0aW9uIHNlcnZpY2VcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL2kxOG4uc2VydmljZVwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItYm9va2xldCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9ib29rbGV0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYm9va2xldC5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgQm9va2xldENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIGJvb2tsZXRJZDogc3RyaW5nO1xuICBASW5wdXQoKSBzZXJ2OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHRrbjogc3RyaW5nO1xuICBASW5wdXQoKSBib29rbGV0SlNPTjogYW55O1xuICBASW5wdXQoKSBkcm9wZG93bkRlcGVuZGVudERhdGE6YW55O1xuICBASW5wdXQoKSBsYWJlbFZhbHVlOnN0cmluZztcbiAgQElucHV0KCkgdG9rZW46c3RyaW5nO1xuICBAT3V0cHV0KCkgaGFuZGxlQm9va2xldEFjdGlvbkV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGhhbmRsZVBhZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgaGFkbGVEcm9wRG93bkRlcGVuZGVudDpFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBwdWJsaWMgbnh0Qm9va2xldDogQm9va2xldFdyYXBwZXI7XG5cbiAgcHVibGljIGJvb2tsZXQ6IGFueVtdID0gW107XG4gIHB1YmxpYyBhYkl0ZW06IGFueSA9IHt9O1xuICBwdWJsaWMgYWN0aW9uczogQWN0aW9uTWV0YVtdID0gW107XG4gIHB1YmxpYyBib29rUXVlc3Rpb25zTWFwOiBhbnkgPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgc3FPcHRpb25zOiBhbnkgPSBuZXcgTWFwKCk7XG4gIHB1YmxpYyBpc0Fuc3dlckZsYWc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIHNwaW5uZXJOYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBzcGlubmVyVHlwZTogc3RyaW5nO1xuICAvLyBIQSAxOURFQzIzIGxhbmdEaXJlY3Rpb24gdmFyaWFibGUgaXMgY3JlYXRlZCB0byBhc3NpZ24gdGhlIGRpcmVjdGlvbiBhcyBjbGFzc1xuICBsYW5nRGlyZWN0aW9uID0gJ2x0cic7IC8vIEhBIDI4REVDMjMgbWFraW5nIGx0ciBhcyBkZWZhdWx0IGRpcmVjdGlvblxuICBhbnN3ZXJMaXN0ID0gW107IC8vIEhBIDExLUpBTi0yNCBBbnN3ZXJsaXN0IHRvIHN0b3JlIHRoZSBtaW5pbWFsIHZhbHVlXG4gIEBJbnB1dCgpIGlucHV0Rm9yUXVlc3Rpb25zOiBhbnkgPSB7fTsgLy8gSEEgMTgtSkFOLTI0IFRvIGluc2VydCB0aGUgZW5kcG9pbnQgdmFsdWUgdG8gdGhlIHF1ZXN0aW9uXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzZlNlcnZpY2U6IFNhbGVzZm9yY2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgZGF0YVNlcnZpY2U6IERhdGFTZXJ2aWNlLFxuICAgIHByaXZhdGUgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgcHJpdmF0ZSBjaGFuZ2VTZXJ2aWNlOiBDaGFuZ2VTZXJ2aWNlLCBcbiAgICBlbDogRWxlbWVudFJlZixcbiAgICBwdWJsaWMgaTE4blNlcnZpY2U6IEkxOG5TZXJ2aWNlXG4gICkgeyBcbiAgICB0aGlzLnNwaW5uZXJOYW1lID0gXCJzcDFcIjtcbiAgICB0aGlzLnNwaW5uZXJUeXBlID0gXCJiYWxsLXNwaW4tY2xvY2t3aXNlXCI7XG4gICAgY29uc29sZS5sb2coJ2Ryb3Bkb3duRGVwZW5kZW50RGF0YScsdGhpcy5kcm9wZG93bkRlcGVuZGVudERhdGEpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gSEEgMTgtSkFOLTI0IER1bW15IFN0YXRpYyBkYXRhIGZvciB0ZXN0aW5nXG4gICAgLy8gdGhpcy5pbnB1dEZvclF1ZXN0aW9ucyA9IHtcbiAgICAvLyAgIFwiX2lkXCI6IFwiNjU5ZWQwMDJlZDUxYmI4MDYxNTQ0MjU1XCIsXG4gICAgLy8gICBcImNvbXBhbnlJZFwiOiBcIjV1bGxoMUJXcFlxbnZ6S2g5TFwiLFxuICAgIC8vICAgXCJuYW1lXCI6IFwiQWwgWWFzbWluZVwiLFxuICAgIC8vICAgXCJjb2RlXCI6IFwiY2hlY2tcIixcbiAgICAvLyAgIFwic3RhdHVzXCI6IFwiSW4tUHJvZ3Jlc3NcIixcbiAgICAvLyAgIFwiY3JlYXRlZEF0XCI6IFwiMjAyNC0wMS0xMFQxNzoxMjozNC42ODZaXCIsXG4gICAgLy8gICBcInVwZGF0ZWRBdFwiOiBcIjIwMjQtMDEtMTBUMTk6NTM6MDguMTM1WlwiLFxuICAgIC8vICAgXCJfX3ZcIjogMCxcbiAgICAvLyAgIFwib3duZXJcIjogXCJjaGVja1wiLFxuICAgIC8vICAgXCJjdXN0b21lclwiOiBcImNoZWNrXCIsXG4gICAgLy8gICBcImRhdGlcIjogXCIyMDI0LTAxLTIzVDE4OjMwOjAwLjAwMFpcIixcbiAgICAvLyAgIFwidGltaVwiOiBcIjIwMjQtMDEtMjNUMTg6MzA6MDAuMDAwWlwiLFxuICAgIC8vIH07XG4gICAgdGhpcy5wcm9jZXNzQm9va2xldCgpO1xuICB9XG4gLy8gVkQgTk9WMjMgLSB1cGRhdGUgdGhlIGpzb24gZGF0YSB3aGVuIGJvb2tsZXRJZCBhbmQgYm9va2xldEpTT04gY2hhbmdlc1xuICBuZ09uQ2hhbmdlcyhzaW1wbGVjaGFuZ2VzOlNpbXBsZUNoYW5nZXMpIHtcbiAgIC8vIEhBIDIzSkFOMjQgVG8gYXZvaWQgdW5kZWZpbmVkIGVycm9yXG4gICBpZihzaW1wbGVjaGFuZ2VzWydib29rbGV0SWQnXSB8fCAoc2ltcGxlY2hhbmdlc1snYm9va2xldEpTT04nXSAmJiAoc2ltcGxlY2hhbmdlc1snYm9va2xldEpTT04nXS5jdXJyZW50VmFsdWUgIT0gbnVsbCB8fCBzaW1wbGVjaGFuZ2VzWydib29rbGV0SlNPTiddLmN1cnJlbnRWYWx1ZSAhPSB1bmRlZmluZWQpKSl7XG4gICAgICB0aGlzLnByb2Nlc3NCb29rbGV0KCk7XG4gICAgfVxuICAgIC8vIGNvbnNvbGUubG9nKCdpbnNpZGUgUXVlc3Rpb25uYWlyZSBuZ09uQ2hhbmdlcycpO1xuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuYm9va2xldCk7XG4gICAgLy8gaWYodGhpcy5ib29rbGV0ID09IHVuZGVmaW5lZCB8fCB0aGlzLmJvb2tsZXQubGVuZ3RoID09IDApIHtcbiAgICAvLyAgIHRoaXMucHJvY2Vzc0Jvb2tsZXQoKTtcbiAgICAvLyB9XG4gIH1cblxuICBwcm9jZXNzQm9va2xldCgpIHtcbiAgICBpZiAodGhpcy5ib29rbGV0SWQpIHtcbiAgICAgIGlmICh0aGlzLmJvb2tsZXRJZC5sZW5ndGggPT0gMTgpIHtcbiAgICAgICAgdGhpcy5yZWFkQm9va2xldCh0aGlzLmJvb2tsZXRJZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmKHRoaXMuYm9va2xldEpTT04pIHtcbiAgICAgIC8vIFRyeSB0byBwYXNzIGEgdmFsdWUgZnJvbSBCYWNrZW5kIHRvIGRpZmZlcmVudGlhdGUgdGhlIFF1ZXN0aW9uQm9vayBSZWFkIGFuZCBBbnN3ZXJCb29rIFJlYWRcbiAgICAgIHRoaXMuaXNBbnN3ZXJGbGFnID0gdHJ1ZTtcblxuICAgICAgaWYodGhpcy5ib29rbGV0SlNPTiAhPSBudWxsIHx8IHRoaXMuYm9va2xldEpTT04gIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gU3RvcmluZyB0aGUgQVBJIHJlc3BvbnNlIGZvciBmdXR1cmUgdXNlXG4gICAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlKHRoaXMuYm9va2xldEpTT04pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmJvb2tsZXQgPSB0aGlzLmJvb2tsZXRKU09OLnJlY29yZHM7XG4gICAgICB0aGlzLmFiSXRlbSA9IHRoaXMuYm9va2xldEpTT04uYW5zd2VyYm9vaztcblxuICAgICAgLy8gUHJvY2VzcyB0aGUgU3ViIFF1ZXN0aW9uIE9wdGlvbnMgLSBUaGlzIHNob3VsZCBiZSBtZXJnZWQgd2l0aCBib29rUXVlc3Rpb25zTWFwIGluIGZ1dHVyZVxuICAgICAgZm9yICh2YXIgc3EgaW4gdGhpcy5ib29rbGV0SlNPTi5zcU9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5zcU9wdGlvbnMuc2V0KHNxLCB0aGlzLmJvb2tsZXRKU09OLnNxT3B0aW9uc1tzcV0pO1xuICAgICAgfVxuXG4gICAgICAvLyBQcm9jZXNzIHRoZSBRdWVzdGlvbnNcbiAgICAgIC8vIEhBIDI4REVDMjMgdGhpcyBhcHBsaWVzIGZvciBib29rbGV0XG4gICAgICAvLyBIQSAxN0pBTjI0IEFkZGVkIHRlcm5hcnkgb3BlcmF0b3IgdG8gYXZvaWQgdW5kZWZpbmVkIHNjZW5hcmlvXG4gICAgICBpZihPYmplY3Qua2V5cyh0aGlzLmJvb2tsZXRKU09OPy5ib29rUXVlc3Rpb25zTWFwKS5sZW5ndGggPiAwKXtcbiAgICAgICAgZm9yICh2YXIgdmFsdWUgaW4gdGhpcy5ib29rbGV0SlNPTi5ib29rUXVlc3Rpb25zTWFwKSB7XG4gICAgICAgICAgdGhpcy5ib29rUXVlc3Rpb25zTWFwLnNldCh2YWx1ZSwgdGhpcy5ib29rbGV0SlNPTi5ib29rUXVlc3Rpb25zTWFwW3ZhbHVlXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEhBIDI4REVDMjMgdGhpcyBhcHBsaWVzIGZvciBib29rIG9yIHF1ZXN0aW9uc1xuICAgICAgZWxzZXtcbiAgICAgICAgdmFyIHZhbHVlID0gJyc7XG4gICAgICAgIHZhbHVlID0gdGhpcy5ib29rbGV0SlNPTi5yZWNvcmRzWzBdLklkO1xuICAgICAgICB0aGlzLmJvb2tRdWVzdGlvbnNNYXAuc2V0KHZhbHVlLCB0aGlzLmJvb2tsZXRKU09OLnF1ZXN0aW9uYm9vayk7XG4gICAgICB9XG5cbiAgICAgIGlmKHRoaXMuYm9va2xldEpTT04ucXVlc3Rpb25ib29rPy5BY3Rpb25zX19jICE9IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmFjdGlvbnMgPSBKU09OLnBhcnNlKHRoaXMuYm9va2xldEpTT04ucXVlc3Rpb25ib29rLkFjdGlvbnNfX2MpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBIQSAxOURFQzIzIGxhbmdEaXJlY3Rpb24gdmFyaWFibGUgdmFsdWUgYXNzaWduaW5nXG4gICAgaWYodGhpcy5ib29rbGV0SlNPTj8ucXVlc3Rpb25ib29rPy5TdHlsZV9fYyl7XG4gICAgICB2YXIgc3R5bGUgPSBKU09OLnBhcnNlKEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5ib29rbGV0SlNPTj8ucXVlc3Rpb25ib29rPy5TdHlsZV9fYykpKTtcbiAgICAgIHRoaXMubGFuZ0RpcmVjdGlvbiA9IHN0eWxlPy5kaXJlY3Rpb247XG4gICAgfVxuICAgIGVsc2UgaWYodGhpcy5ib29rbGV0SlNPTj8ucmVjb3Jkc1swXT8uU3R5bGVfX2Mpe1xuICAgICAgdmFyIHN0eWxlID0gSlNPTi5wYXJzZShKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuYm9va2xldEpTT04/LnJlY29yZHNbMF0/LlN0eWxlX19jKSkpO1xuICAgICAgdGhpcy5sYW5nRGlyZWN0aW9uID0gc3R5bGU/LmRpcmVjdGlvbjtcbiAgICB9XG5cbiAgICAvLyBIQSAxOC1KQU4tMjQgVGhlIGNvbmRpdGlvbiBpcyB1c2VkIGZvciBCaW5kLUluIExvZ2ljIFxuICAgIHRoaXMuaGFuZGxlQ29tcGxldGVCb29rbGV0KHRoaXMuYm9va2xldEpTT04pOyBcbiAgfVxuXG4gIHByaXZhdGUgcmVhZEJvb2tsZXQgPSAodXVpZDogc3RyaW5nKSA9PiB7XG4gICAgaWYodGhpcy5zZXJ2ID09IFwiYXBpXCIpIHtcbiAgICAgIHRoaXMuZGF0YVNlcnZpY2UuZ2V0QVBJRGF0YShcbiAgICAgICAgdGhpcy50a24sXG4gICAgICAgIFtcIkJvb2tsZXRcIiwgXCJyZWFkXCIsIHV1aWRdLFxuICAgICAgICB0aGlzLnN1Y2Nlc3NSZWFkQm9va2xldCxcbiAgICAgICAgdGhpcy5mYWlsdXJlUmVhZEJvb2tsZXRcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2ZTZXJ2aWNlLnJlbW90ZUFjdGlvbihcbiAgICAgICAgXCJOeHRDb250cm9sbGVyLnByb2Nlc3NcIixcbiAgICAgICAgW1wiQm9va2xldFwiLCBcInJlYWRcIiwgdXVpZF0sXG4gICAgICAgIHRoaXMuc3VjY2Vzc1JlYWRCb29rbGV0LFxuICAgICAgICB0aGlzLmZhaWx1cmVSZWFkQm9va2xldFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN1Y2Nlc3NSZWFkQm9va2xldCA9IChyZXNwb25zZSkgPT4ge1xuICAgIGNvbnNvbGUubG9nKCdJbnNpZGUgdGhlIHN1Y2Nlc3NSZWFkQm9va2xldCcpO1xuICAgIC8vIGNvbnNvbGUubG9nKHJlc3BvbnNlKTtcbiAgICBpZihyZXNwb25zZSAhPSBudWxsIHx8IHJlc3BvbnNlICE9IHVuZGVmaW5lZCkge1xuICAgICAgLy8gU3RvcmluZyB0aGUgQVBJIHJlc3BvbnNlIGZvciBmdXR1cmUgdXNlXG4gICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUocmVzcG9uc2UpO1xuXG4gICAgICAvLyBUcnkgdG8gcGFzcyBhIHZhbHVlIGZyb20gQmFja2VuZCB0byBkaWZmZXJlbnRpYXRlIHRoZSBRdWVzdGlvbkJvb2sgUmVhZCBhbmQgQW5zd2VyQm9vayBSZWFkXG4gICAgICAvLyB0aGlzLmlzQW5zd2VyRmxhZyA9IHRydWU7XG4gICAgICBcbiAgICAgIHRoaXMuYm9va2xldCA9IHJlc3BvbnNlLnJlY29yZHM7XG4gICAgICB0aGlzLmFiSXRlbSA9IHJlc3BvbnNlLmFuc3dlcmJvb2s7XG5cbiAgICAgIC8vIFByb2Nlc3MgdGhlIFN1YiBRdWVzdGlvbiBPcHRpb25zIC0gVGhpcyBzaG91bGQgYmUgbWVyZ2VkIHdpdGggYm9va1F1ZXN0aW9uc01hcCBpbiBmdXR1cmVcbiAgICAgIGZvciAodmFyIHNxIGluIHJlc3BvbnNlLnNxT3B0aW9ucykge1xuICAgICAgICB0aGlzLnNxT3B0aW9ucy5zZXQoc3EsIHJlc3BvbnNlLnNxT3B0aW9uc1tzcV0pO1xuICAgICAgfVxuXG4gICAgICAvLyBQcm9jZXNzIHRoZSBRdWVzdGlvbnNcbiAgICAgIGZvciAodmFyIHZhbHVlIGluIHJlc3BvbnNlLmJvb2tRdWVzdGlvbnNNYXApIHtcbiAgICAgICAgdGhpcy5ib29rUXVlc3Rpb25zTWFwLnNldCh2YWx1ZSwgcmVzcG9uc2UuYm9va1F1ZXN0aW9uc01hcFt2YWx1ZV0pO1xuICAgICAgfVxuXG4gICAgICBpZihyZXNwb25zZS5xdWVzdGlvbmJvb2s/LkFjdGlvbnNfX2MgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuYWN0aW9ucyA9IEpTT04ucGFyc2UocmVzcG9uc2UucXVlc3Rpb25ib29rLkFjdGlvbnNfX2MpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBIQSAxOURFQzIzIGxhbmdEaXJlY3Rpb24gdmFyaWFibGUgdmFsdWUgYXNzaWduaW5nXG4gICAgaWYocmVzcG9uc2U/LnF1ZXN0aW9uYm9vaz8uU3R5bGVfX2Mpe1xuICAgICAgdmFyIHN0eWxlID0gSlNPTi5wYXJzZShKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlc3BvbnNlPy5xdWVzdGlvbmJvb2s/LlN0eWxlX19jKSkpO1xuICAgICAgdGhpcy5sYW5nRGlyZWN0aW9uID0gc3R5bGU/LmRpcmVjdGlvbjtcbiAgICB9XG4gICAgZWxzZSBpZihyZXNwb25zZT8ucmVjb3Jkc1swXT8uU3R5bGVfX2Mpe1xuICAgICAgdmFyIHN0eWxlID0gSlNPTi5wYXJzZShKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlc3BvbnNlPy5yZWNvcmRzWzBdPy5TdHlsZV9fYykpKTtcbiAgICAgIHRoaXMubGFuZ0RpcmVjdGlvbiA9IHN0eWxlPy5kaXJlY3Rpb247XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmYWlsdXJlUmVhZEJvb2tsZXQgPSAocmVzcG9uc2UpID0+IHtcblxuICB9XG5cbiAgaGFuZGxlQm9va2xldEFjdGlvbkNsaWNrKGFjdGlvbjpBY3Rpb25NZXRhKSB7XG4gICAgLy8gSEEgMTlKQU4yNCBBY3Rpb24gY2hhbmdlc1xuICAgIHRoaXMuYW5zd2VyTGlzdCA9IFtdO1xuICAgIGNvbnNvbGUubG9nKGFjdGlvbik7XG4gICAgbGV0IGRhdGFUb1BhcmVudCA9IHt9O1xuICAgIC8vIEhBIDIySkFOMjQgdGhpcyBjaGFuZ2UgdG8gbWFrZSBjbG9zZSBldmVudCB3b3JrXG4gICAgZGF0YVRvUGFyZW50WydhY3Rpb24nXSA9IGFjdGlvbi5ldmVudHRvZW1pdDtcbiAgICBpZighKGFjdGlvbi5ldmVudHRvZW1pdCA9PT0gJ2Nsb3NlJykpe1xuICAgICAgLy8gSEEgMTgtSkFOLTI0IFNlbmRpbmcgdGhlIGNvbXBsZXRlIGpzb24gZGF0YSBhbHNvIFxuICAgICAgZGF0YVRvUGFyZW50Wydqc29uQm9vayddID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXQoKTtcbiAgICAgIC8vIEhBIDE3SkFOMjQgbnh0SWQgdG8gZGF0YVBhcmVudCBvYmplY3RcbiAgICAgIGRhdGFUb1BhcmVudFsnbnh0SWQnXSA9IE9iamVjdC5rZXlzKHRoaXMuYm9va2xldEpTT04/LmJvb2tRdWVzdGlvbnNNYXApWzBdO1xuICAgICAgLy8gSEEgMTEtSkFOLTI0IE1pbmltaXppbmcgdGhlIHZhbHVlIHdoaWNoIGhhcyB0byBiZSBwYXNzZWQgdG8gdGhlIHNlcnZlclxuICAgICAgdGhpcy5oYW5kbGVDb21wbGV0ZUJvb2tsZXQoZGF0YVRvUGFyZW50Wydqc29uQm9vayddKTtcbiAgICAgIGRhdGFUb1BhcmVudFsnZGF0YSddID0gdGhpcy5hbnN3ZXJMaXN0ID8gdGhpcy5hbnN3ZXJMaXN0IDogZGF0YVRvUGFyZW50WydkYXRhJ107XG4gICAgICAvLyB3aGVuIGNsaWNraW5nIHRoZSBzdWJtaXQgYnV0dG9uIHZhbGlkYXRpbmcgdGhlIHJlcXVpcmVkIGZpZWxkc1xuICAgICAgZm9yKGxldCBrZXkgaW4gZGF0YVRvUGFyZW50Wydqc29uQm9vayddLmJvb2tRdWVzdGlvbnNNYXApe1xuICAgICAgICBjb25zdCBjdXJyZW50Qm9vayAgPSBkYXRhVG9QYXJlbnRbJ2pzb25Cb29rJ10uYm9va1F1ZXN0aW9uc01hcFtrZXldO1xuICAgICAgICBjdXJyZW50Qm9vay5RdWVzdGlvbnNfX3IucmVjb3Jkcy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgIGlmKGVsZW1lbnQuRXJyb3JfTWVzc2FnZV9fYyAmJiBkYXRhVG9QYXJlbnRbJ2FjdGlvbiddID09ICdzdWJtaXQnICYmICFlbGVtZW50LmlucHV0KXtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlU2VydmljZS5zdWJtaXRDaGFuZ2UoZWxlbWVudC5JZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEhBIDIzSkFOMjQgVG8gY2FsbCB0aGUgYWN0aW9uIG9uIGFueSBldmVudFxuICAgIHRoaXMuaGFuZGxlQm9va2xldEFjdGlvbkV2ZW50LmVtaXQoZGF0YVRvUGFyZW50KTtcbiAgfVxuXG4gIC8vIEhBIDE4LUpBTi0yNCBoYW5kbGVDb21wbGV0ZUJvb2tsZXQgaXMgdG8gc2ltcGxpZnkgdGhlIGxvZ2ljXG4gIGhhbmRsZUNvbXBsZXRlQm9va2xldChjb21wbGV0ZUJvb2tsZXQpe1xuICAgIGlmKE9iamVjdC5rZXlzKGNvbXBsZXRlQm9va2xldD8uYm9va1F1ZXN0aW9uc01hcCA/PyB7fSkubGVuZ3RoID09PSAwKXsgLy8gSEEgMTEtSkFOLTI0IElmIGNvbmRpdGlvbiB0byBsb2FkIGJvb2tsZXRcbiAgICAgIHRoaXMuaGFuZGxlQm9vayhjb21wbGV0ZUJvb2tsZXQ/LnF1ZXN0aW9uYm9vaz8uUXVlc3Rpb25zX19yKTtcbiAgICB9XG4gICAgZWxzZXsgLy8gSEEgMTEtSkFOLTI0IFRvIGxvYWQgYm9vayBxdWVzdGlvbnNcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGNvbXBsZXRlQm9va2xldC5ib29rUXVlc3Rpb25zTWFwKSB7XG4gICAgICAgIGNvbnN0IHZhbCA9IGNvbXBsZXRlQm9va2xldC5ib29rUXVlc3Rpb25zTWFwW2tleV07XG4gICAgICAgIGlmKHZhbC5UeXBlX19jID09PSAnQm9vaycpe1xuICAgICAgICAgIHRoaXMuaGFuZGxlQm9vayh2YWwuUXVlc3Rpb25zX19yKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNle1xuICAgICAgICAgIHRoaXMuaGFuZGxlUXVlcyh2YWwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gSEEgMTEtSkFOLTI0IGhhbmRsZUJvb2sgbG9hZHMgdGhlIEJvb2tcbiAgaGFuZGxlQm9vayhxdWVzTGlzdDogYW55KXtcbiAgICBxdWVzTGlzdD8ucmVjb3Jkcy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgaWYoZWxlbWVudC5UeXBlX19jID09PSAnQm9vaycpe1xuICAgICAgICAvLyBIQSAyNEpBTjI0IEZldGNoaW5nIGZyb20gUUIgcmVmZXJlbmNlXG4gICAgICAgIHZhciBib29rID0gSlNPTi5wYXJzZShlbGVtZW50LlFCX1JlZmVyZW5jZV9RdWVzdGlvbnNfX2MpO1xuICAgICAgICBib29rLnF1ZXN0aW9uYm9vay5RdWVzdGlvbnNfX3IucmVjb3Jkcy5mb3JFYWNoKHF1ZXMgPT4ge1xuICAgICAgICAgIHRoaXMuaGFuZGxlUXVlcyhxdWVzKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBlbHNle1xuICAgICAgICB0aGlzLmhhbmRsZVF1ZXMoZWxlbWVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBIQSAxMS1KQU4tMjQgaGFuZGxlUXVlcyB0byBsb2FkIHF1ZXN0aW9uXG4gIGhhbmRsZVF1ZXMocXVlczogYW55KXtcbiAgICAvLyBIQSAxOS1KQU4tMjQgSWYgY29uZGl0aW9uIGlzIGZvciBiaW5kLWluLCBjb3JyZWN0aW9uXG4gICAgaWYoT2JqZWN0LmtleXModGhpcy5pbnB1dEZvclF1ZXN0aW9ucykubGVuZ3RoID4gMCl7XG4gICAgICBmb3IobGV0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmlucHV0Rm9yUXVlc3Rpb25zKSl7XG4gICAgICAgIGlmKHF1ZXMuUmVmZXJlbmNlX0ZpZWxkX19jID09PSBrZXkpe1xuICAgICAgICAgIGlmKHF1ZXMuVHlwZV9fYyA9PT0gJ0Ryb3Bkb3duJyl7XG4gICAgICAgICAgICB0aGlzLnNxT3B0aW9ucy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICBpZihlbGVtZW50WydSZWZlcmVuY2VfRmllbGRfX2MnXSA9PT0ga2V5KXtcbiAgICAgICAgICAgICAgICBlbGVtZW50WydpbnB1dCddID0gcXVlcy5pbnB1dCA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIGVsZW1lbnRbJ3NlbGVjdGVkVmFsdWUnXSA9IHF1ZXMuc2VsZWN0ZWRWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gSEEgMjRKQU4yNCBUbyBiaW5kLWluIERhdGUgYW5kIERhdGVUaW1lXG4gICAgICAgICAgZWxzZSBpZihxdWVzLlR5cGVfX2MgPT09ICdEYXRlJyB8fCBxdWVzLlR5cGVfX2MgPT0gJ0RhdGVUaW1lJyl7XG4gICAgICAgICAgICBxdWVzLmlucHV0ID0gbmV3IERhdGUodmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICBxdWVzLmlucHV0ID0gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2V7XG4gICAgICBjb25zdCBxdWVzdGlvbiA9IHt9O1xuICAgICAgcXVlc3Rpb25bJ2lkJ10gPSBxdWVzLklkO1xuICAgICAgLy8gcXVlc3Rpb25bJ1F1ZXN0aW9uX19jJ10gPSBxdWVzLlF1ZXN0aW9uX19jO1xuICAgICAgcXVlc3Rpb25bJ2lucHV0J10gPSBxdWVzLmlucHV0O1xuICAgICAgcXVlc3Rpb25bJ1R5cGVfX2MnXSA9IHF1ZXMuVHlwZV9fYztcbiAgICAgIHF1ZXN0aW9uWydRdWVzdGlvbl9Ob19fYyddID0gcXVlcy5RdWVzdGlvbl9Ob19fYztcbiAgICAgIHF1ZXN0aW9uWydSZWZlcmVuY2VfRmllbGRfX2MnXSA9IHF1ZXM/LlJlZmVyZW5jZV9GaWVsZF9fYztcbiAgICAgIHRoaXMuYW5zd2VyTGlzdC5wdXNoKHF1ZXN0aW9uKTtcbiAgICB9XG4gIH1cblxuICByZWFkUXVlc3Rpb25zKHFiSWQ6IHN0cmluZykge1xuICAgIC8vIGNvbnNvbGUubG9nKCdpbnNpZGUgQm9va2xldENvbXBvbmVudC5yZWFkUXVlc3Rpb25zICcgKyBxYklkKTtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmJvb2tRdWVzdGlvbnNNYXAuc2l6ZSk7XG4gICAgbGV0IHF1ZXN0aW9ucyA9IFtdO1xuICAgIC8vIEhBIDMxLUpBTi0yNCBBZGRlZCB0ZXJuYXJ5IHRvIGF2b2lkIHVuZGVmaW5lZFxuICAgIGZvcih2YXIgc3EgaW4gdGhpcy5ib29rUXVlc3Rpb25zTWFwPy5nZXQocWJJZCk/LlF1ZXN0aW9uc19fcj8ucmVjb3Jkcykge1xuICAgICAgbGV0IHE6IFF1ZXN0aW9uID0gdGhpcy5ib29rUXVlc3Rpb25zTWFwPy5nZXQocWJJZCkuUXVlc3Rpb25zX19yLnJlY29yZHNbc3FdO1xuICAgICAgaWYocS5UeXBlX19jID09ICdEcm9wZG93bicpIHtcbiAgICAgICAgcXVlc3Rpb25zLnB1c2godGhpcy5zcU9wdGlvbnMuZ2V0KHEuSWQpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXN0aW9ucy5wdXNoKHEpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBjb25zb2xlLmxvZyhxdWVzdGlvbnMpO1xuICAgIHJldHVybiBxdWVzdGlvbnM7XG4gIH1cblxuICBnZXRUZXh0KHZhbHVlKSB7XG4gICAgdmFyIGRvYyA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcodmFsdWUsIFwidGV4dC9odG1sXCIpO1xuICAgIC8vY29uc29sZS5sb2coIGRvYy5kb2N1bWVudEVsZW1lbnQudGV4dENvbnRlbnQpO1xuICAgIHJldHVybiB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChcbiAgICAgIGRvYy5kb2N1bWVudEVsZW1lbnQudGV4dENvbnRlbnRcbiAgICApO1xuICB9XG4gIGdldERyb3BEb3duKGV2ZW50OmFueSl7XG4gICAgdGhpcy5oYWRsZURyb3BEb3duRGVwZW5kZW50LmVtaXQoZXZlbnQpO1xuICB9XG59XG4iLCI8bmd4LXNwaW5uZXIgW25hbWVdPVwic3Bpbm5lck5hbWVcIiBbdHlwZV09XCJzcGlubmVyVHlwZVwiPjwvbmd4LXNwaW5uZXI+XG48IS0tIEJvb2tsZXQgSGFuZGxpbmctLT5cbjwhLS0gSEEgMTlERUMyMyBGb3IgRGlyZWN0aW9uIC0tPlxuPGRpdiAqbmdGb3I9XCJsZXQgcWIgb2YgYm9va2xldFwiIFtuZ0NsYXNzXT1cImxhbmdEaXJlY3Rpb25cIj5cbiAgICA8IS0tIE1SIENvbW1lbnRlZCBiZWxvdyBjb2RlIHRvIGVuc3VyZSBzaW5nbGUgSlNPTiBmb3IgVU5DT05ESVRJT05BTCBCb29rbGV0cyAtLT5cbiAgICA8IS0tIDxsaWItcXVlc3Rpb25uYWlyZSBbc2Vydl09XCJzZXJ2XCIgW3FiSWRdPVwicWIuSWRcIiBbdGtuXT1cInRrblwiPjwvbGliLXF1ZXN0aW9ubmFpcmU+IC0tPlxuICAgIDwhLS0gSEEgMjhERUMyMyBCZWxvdyBJZiBsb2dpYyBpcyB0byBsb2FkIGZyb20gYm9va2xldCAgLS0+XG4gICAgPGRpdiAqbmdJZj1cInFiLlF1ZXN0aW9uc19fcj8ucmVjb3JkczsgZWxzZSBlbHNlQmxvY2tcIj5cbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcXVlcyBvZiBxYi5RdWVzdGlvbnNfX3IucmVjb3Jkc1wiIFtjbGFzc109XCJxYi5pc1NoZW5nZWxfX2MgPyAncXVlc3Rpb25kaXYxJyA6ICdxdWVzdGlvbmRpdjEgcGFkZC1ib3R0b20nXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVlc3Rpb25kaXYyXCI+XG4gICAgICAgICAgICAgICAgPCEtLSBIQSAxN0pBTjI0IC0gSXMgdGl0bGUgaXMgZW5hYmxlZCBzbyB0aGF0IGJhc2VkIG9uIHRoZSBib29sZWFuIGRpdiB3aWxsIGJlIHZpc2libGUgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInF1ZXMuSXNfVGl0bGVfX2NcIiBbY2xhc3NdPVwicWIuaXNTaGVuZ2VsX19jID8gJ2hlYWRlci1zdHlsZScgOiAncXVlc3Rpb24tZi1zaXplIGFkZGl0aW9uYWwnXCI+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gVkQgMDhOT1YyMyAtIHNob3dpbmcgbGFibGUgd2hlbiBpdHMgYXZhaWxhYmxlLS0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW2lubmVySFRNTF09XCJnZXRUZXh0KHF1ZXM/LlF1ZXN0aW9uX1RleHRfX2MpXCIgKm5nSWY9XCJxdWVzPy5RdWVzdGlvbl9UZXh0X19jXCIgPiBcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHF1ZXM/LlF1ZXN0aW9uX1RleHRfX2MgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+IDwhLS0gVkQgMTlKQU4yNCAtIGdldHRpbmcgdG9rZW4gYXMgaW5wdXQgLS0+XG4gICAgICAgICAgICAgICAgPGxpYi1xdWVzdGlvbmJvb2sgW3FiSXRlbV09XCJxYlwiIFt0b2tlbl09XCJ0b2tlblwiIFtsYWJlbFZhbHVlXT1cImxhYmVsVmFsdWVcIiBbcXVlc3Rpb25JdGVtXT1cInF1ZXNcIiBbcXVlc3Rpb25zXT1cInJlYWRRdWVzdGlvbnMocWIuSWQpXCIgIChoYW5kbGVEcm9wRG93bik9XCJnZXREcm9wRG93bigkZXZlbnQpXCI+PC9saWItcXVlc3Rpb25ib29rPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDwhLS0gSEEgMjhERUMyMyBCZWxvdyBlbHNlIGxvZ2ljIGlzIHRvIGxvYWQgZnJvbSBib29rcyBvciBxdWVzdGlvbnMgLS0+XG4gICAgPG5nLXRlbXBsYXRlICNlbHNlQmxvY2s+XG4gICAgICAgIDxkaXYgW2NsYXNzXT1cInFiLmlzU2hlbmdlbF9fYyA/ICdxdWVzdGlvbmRpdjEnIDogJ3F1ZXN0aW9uZGl2MSBwYWRkLWJvdHRvbSdcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWVzdGlvbmRpdjJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIXFiLklzX1RpdGxlX19jXCIgW2NsYXNzXT1cInFiLmlzU2hlbmdlbF9fYyA/ICdoZWFkZXItc3R5bGUnIDogJ3F1ZXN0aW9uLWYtc2l6ZSBhZGRpdGlvbmFsJ1wiPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIFZEIDA4Tk9WMjMgLSBzaG93aW5nIGxhYmxlIHdoZW4gaXRzIGF2YWlsYWJsZS0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IFtpbm5lckhUTUxdPVwiZ2V0VGV4dChxYj8uUXVlc3Rpb25fVGV4dF9fYylcIiAqbmdJZj1cInFiPy5RdWVzdGlvbl9UZXh0X19jXCIgPiBcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHFiPy5RdWVzdGlvbl9UZXh0X19jIH19XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBxYj8uVGl0bGVfX2MgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+IDwhLS0gVkQgMTlKQU4yNCAtIGdldHRpbmcgdG9rZW4gYXMgaW5wdXQgLS0+XG4gICAgICAgICAgICAgICAgPGxpYi1xdWVzdGlvbmJvb2sgW3FiSXRlbV09XCJxYlwiIFt0b2tlbl09XCJ0b2tlblwiIFtsYWJlbFZhbHVlXT1cImxhYmVsVmFsdWVcIiBbcXVlc3Rpb25JdGVtXT1cInFiXCIgW3F1ZXN0aW9uc109XCJyZWFkUXVlc3Rpb25zKHFiLklkKVwiICAoaGFuZGxlRHJvcERvd24pPVwiZ2V0RHJvcERvd24oJGV2ZW50KVwiPjwvbGliLXF1ZXN0aW9uYm9vaz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuPC9kaXY+XG5cbjwhLS0gR3JvdXAgQWN0aW9ucyAtLT5cbjwhLS0gSEEgMTlERUMyMyBGb3IgRGlyZWN0aW9uIC0tPlxuPGRpdiBjbGFzcz1cImFsaWduLXN1Ym1pdC1yb3dcIiAqbmdJZj1cImFiSXRlbT8uU3RhdHVzX19jICE9ICdDb21wbGV0ZWQnXCIgW25nQ2xhc3NdPVwibGFuZ0RpcmVjdGlvblwiPlxuICAgIDxkaXYgKm5nRm9yPVwibGV0IGFjdGlvbiBvZiBhY3Rpb25zOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgPCEtLSAvLyBIQSAyMkpBTjI0IENvbW1vbmlzZSB0aGUgYnV0dG9uIHN0eWxlIGluIGZ1c2lvbiAtLT5cbiAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiaGFuZGxlQm9va2xldEFjdGlvbkNsaWNrKGFjdGlvbilcIiBuZ0NsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGZjLWJ1dHRvbiBueHRCdXR0b25cIj5cbiAgICAgICAgICAgIHt7IGFjdGlvbi5uYW1lIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuPC9kaXY+XG4iXX0=
354
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9va2xldC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtYXBwL3NyYy9saWIvcGFnZXMvYm9va2xldC9ib29rbGV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL254dC1hcHAvc3JjL2xpYi9wYWdlcy9ib29rbGV0L2Jvb2tsZXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFJVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksR0FJYixNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7Ozs7O0FBa0J2QixNQUFNLE9BQU8sZ0JBQWdCO0lBNEJqQjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFFRDtJQWxDQSxTQUFTLENBQVM7SUFDbEIsSUFBSSxDQUFTO0lBQ2IsR0FBRyxDQUFTO0lBQ1osV0FBVyxDQUFNO0lBQ2pCLHFCQUFxQixDQUFLO0lBQzFCLFVBQVUsQ0FBUTtJQUNsQixLQUFLLENBQVE7SUFDWix3QkFBd0IsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUNqRSxVQUFVLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7SUFDbkQsc0JBQXNCLEdBQXFCLElBQUksWUFBWSxFQUFFLENBQUM7SUFFakUsVUFBVSxDQUFpQjtJQUUzQixPQUFPLEdBQVUsRUFBRSxDQUFDO0lBQ3BCLE1BQU0sR0FBUSxFQUFFLENBQUM7SUFDakIsT0FBTyxHQUFpQixFQUFFLENBQUM7SUFDM0IsZ0JBQWdCLEdBQVEsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNqQyxTQUFTLEdBQVEsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUM1QixZQUFZLEdBQVksS0FBSyxDQUFDO0lBQzlCLFdBQVcsQ0FBUztJQUNwQixXQUFXLENBQVM7SUFDM0IsZ0ZBQWdGO0lBQ2hGLGFBQWEsR0FBRyxLQUFLLENBQUMsQ0FBQyw2Q0FB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LFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csc0JBQXNCO3NCQUEvQixNQUFNO2dCQWVFLFFBQVE7c0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE9uSW5pdCxcbiAgT25DaGFuZ2VzLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIEVsZW1lbnRSZWYsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBTYWxlc2ZvcmNlU2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9zYWxlc2ZvcmNlLnNlcnZpY2VcIjtcbmltcG9ydCB7IERhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZGF0YS5zZXJ2aWNlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBQYXJhbXMgfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVIdG1sIH0gZnJvbSBcIkBhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXJcIjtcbmltcG9ydCB7IEFjdGlvbk1ldGEgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2FjdGlvbk1ldGEnO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi4vLi4vd3JhcHBlclwiO1xuaW1wb3J0IHsgQm9va2xldFdyYXBwZXIgfSBmcm9tIFwiLi4vLi4vbW9kZWwvYm9va2xldFdyYXBwZXJcIjtcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IENoYW5nZVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvY2hhbmdlLnNlcnZpY2VcIjtcbi8vIEhBIDE5REVDMjMgaW1wb3J0ZWQgdHJhbnNsYXRpb24gc2VydmljZVxuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vaTE4bi5zZXJ2aWNlXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1ib29rbGV0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Jvb2tsZXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9ib29rbGV0LmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBCb29rbGV0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgYm9va2xldElkOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHNlcnY6IHN0cmluZztcbiAgQElucHV0KCkgdGtuOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGJvb2tsZXRKU09OOiBhbnk7XG4gIEBJbnB1dCgpIGRyb3Bkb3duRGVwZW5kZW50RGF0YTphbnk7XG4gIEBJbnB1dCgpIGxhYmVsVmFsdWU6c3RyaW5nO1xuICBASW5wdXQoKSB0b2tlbjpzdHJpbmc7XG4gIEBPdXRwdXQoKSBoYW5kbGVCb29rbGV0QWN0aW9uRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgaGFuZGxlUGFnZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBoYWRsZURyb3BEb3duRGVwZW5kZW50OkV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHB1YmxpYyBueHRCb29rbGV0OiBCb29rbGV0V3JhcHBlcjtcblxuICBwdWJsaWMgYm9va2xldDogYW55W10gPSBbXTtcbiAgcHVibGljIGFiSXRlbTogYW55ID0ge307XG4gIHB1YmxpYyBhY3Rpb25zOiBBY3Rpb25NZXRhW10gPSBbXTtcbiAgcHVibGljIGJvb2tRdWVzdGlvbnNNYXA6IGFueSA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBzcU9wdGlvbnM6IGFueSA9IG5ldyBNYXAoKTtcbiAgcHVibGljIGlzQW5zd2VyRmxhZzogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgc3Bpbm5lck5hbWU6IHN0cmluZztcbiAgcHVibGljIHNwaW5uZXJUeXBlOiBzdHJpbmc7XG4gIC8vIEhBIDE5REVDMjMgbGFuZ0RpcmVjdGlvbiB2YXJpYWJsZSBpcyBjcmVhdGVkIHRvIGFzc2lnbiB0aGUgZGlyZWN0aW9uIGFzIGNsYXNzXG4gIGxhbmdEaXJlY3Rpb24gPSAnbHRyJzsgLy8gSEEgMjhERUMyMyBtYWtpbmcgbHRyIGFzIGRlZmF1bHQgZGlyZWN0aW9uXG4gIGFuc3dlckxpc3QgPSBbXTsgLy8gSEEgMTEtSkFOLTI0IEFuc3dlcmxpc3QgdG8gc3RvcmUgdGhlIG1pbmltYWwgdmFsdWVcbiAgQElucHV0KCkgZGF0YUJpbmQ6IGFueSA9IHt9OyAvLyBIQSAxOC1KQU4tMjQgVG8gaW5zZXJ0IHRoZSBlbmRwb2ludCB2YWx1ZSB0byB0aGUgcXVlc3Rpb25cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHNmU2VydmljZTogU2FsZXNmb3JjZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkYXRhU2VydmljZTogRGF0YVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzdG9yYWdlU2VydmljZTogU3RvcmFnZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcixcbiAgICBwcml2YXRlIGNoYW5nZVNlcnZpY2U6IENoYW5nZVNlcnZpY2UsIFxuICAgIGVsOiBFbGVtZW50UmVmLFxuICAgIHB1YmxpYyBpMThuU2VydmljZTogSTE4blNlcnZpY2VcbiAgKSB7IFxuICAgIHRoaXMuc3Bpbm5lck5hbWUgPSBcInNwMVwiO1xuICAgIHRoaXMuc3Bpbm5lclR5cGUgPSBcImJhbGwtc3Bpbi1jbG9ja3dpc2VcIjtcbiAgICBjb25zb2xlLmxvZygnZHJvcGRvd25EZXBlbmRlbnREYXRhJyx0aGlzLmRyb3Bkb3duRGVwZW5kZW50RGF0YSk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBIQSAxOC1KQU4tMjQgRHVtbXkgU3RhdGljIGRhdGEgZm9yIHRlc3RpbmdcbiAgICAvLyB0aGlzLmRhdGFCaW5kID0ge1xuICAgIC8vICAgXCJfaWRcIjogXCI2NTllZDAwMmVkNTFiYjgwNjE1NDQyNTVcIixcbiAgICAvLyAgIFwiY29tcGFueUlkXCI6IFwiNXVsbGgxQldwWXFudnpLaDlMXCIsXG4gICAgLy8gICBcIm5hbWVcIjogXCJBbCBZYXNtaW5lXCIsXG4gICAgLy8gICBcImNvZGVcIjogXCJjaGVja1wiLFxuICAgIC8vICAgXCJzdGF0dXNcIjogXCJJbi1Qcm9ncmVzc1wiLFxuICAgIC8vICAgXCJjcmVhdGVkQXRcIjogXCIyMDI0LTAxLTEwVDE3OjEyOjM0LjY4NlpcIixcbiAgICAvLyAgIFwidXBkYXRlZEF0XCI6IFwiMjAyNC0wMS0xMFQxOTo1MzowOC4xMzVaXCIsXG4gICAgLy8gICBcIl9fdlwiOiAwLFxuICAgIC8vICAgXCJvd25lclwiOiBcImNoZWNrXCIsXG4gICAgLy8gICBcImN1c3RvbWVyXCI6IFwiY2hlY2tcIixcbiAgICAvLyAgIFwiZGF0aVwiOiBcIjIwMjQtMDEtMjNUMTg6MzA6MDAuMDAwWlwiLFxuICAgIC8vICAgXCJ0aW1pXCI6IFwiMjAyNC0wMS0yM1QxODozMDowMC4wMDBaXCIsXG4gICAgLy8gXCJmTmFtZVwiOiBcIkhhaWRlclwiLFxuICAgIC8vIFwibE5hbWVcIjogXCJBbGlcIixcbiAgICAvLyBcImRlZmF1bHRBcHBcIjogXCJOWFRcIixcbiAgICAvLyBcImVtYWlsXCI6IFwiaGFpZGVyQGdtYWlsLmNvbVwiLFxuICAgIC8vIFwibG9jYXRpb25cIjoge2FkZHJlc3M6IFwiMTA3LCBBc2hvayBOYWdhciwgS2FkdWdvbmRhbmFoYWxsaSwgQmVuZ2FsdXJ1LCBLYXJuYXRha2EgNTYwMDQ1LCBJbmRpYVwiLFxuICAgIC8vICAgbGF0aXR1ZGU6IDEzLjAyMDA1NzUsXG4gICAgLy8gICBsb25naXR1ZGU6IDc3LjYxMjk4MTZ9LFxuICAgIC8vIFwibG9jYXRpb25cIjogXCIxMDcsIEFzaG9rIE5hZ2FyLCBLYWR1Z29uZGFuYWhhbGxpLCBCZW5nYWx1cnUsIEthcm5hdGFrYSA1NjAwNDUsIEluZGlhXCIsXG4gICAgLy8gXCJ0ZXh0QXJlYVwiOiBcIkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nIGVsaXQsIHNlZCBkbyBlaXVzbW9kIHRlbXBvciBpbmNpZGlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXVhLiBVdCBlbmltIGFkIG1pbmltIHZlbmlhbSwgcXVpcyBub3N0cnVkIGV4ZXJjaXRhdGlvbiB1bGxhbWNvIGxhYm9yaXMgbmlzaSB1dCBhbGlxdWlwIGV4IGVhIGNvbW1vZG8gY29uc2VxdWF0LiBEdWlzIGF1dGUgaXJ1cmUgZG9sb3IgaW4gcmVwcmVoZW5kZXJpdCBpbiB2b2x1cHRhdGUgdmVsaXQgZXNzZSBjaWxsdW0gZG9sb3JlIGV1IGZ1Z2lhdCBudWxsYSBwYXJpYXR1ci4gRXhjZXB0ZXVyIHNpbnQgb2NjYWVjYXQgY3VwaWRhdGF0IG5vbiBwcm9pZGVudCwgc3VudCBpbiBjdWxwYSBxdWkgb2ZmaWNpYSBkZXNlcnVudCBtb2xsaXQgYW5pbSBpZCBlc3QgbGFib3J1bVwiLFxuICAgIC8vIH07XG4gICAgdGhpcy5wcm9jZXNzQm9va2xldCgpO1xuICB9XG4gLy8gVkQgTk9WMjMgLSB1cGRhdGUgdGhlIGpzb24gZGF0YSB3aGVuIGJvb2tsZXRJZCBhbmQgYm9va2xldEpTT04gY2hhbmdlc1xuICBuZ09uQ2hhbmdlcyhzaW1wbGVjaGFuZ2VzOlNpbXBsZUNoYW5nZXMpIHtcbiAgIC8vIEhBIDIzSkFOMjQgVG8gYXZvaWQgdW5kZWZpbmVkIGVycm9yXG4gICBpZihzaW1wbGVjaGFuZ2VzWydib29rbGV0SWQnXSB8fCAoc2ltcGxlY2hhbmdlc1snYm9va2xldEpTT04nXSAmJiAoc2ltcGxlY2hhbmdlc1snYm9va2xldEpTT04nXS5jdXJyZW50VmFsdWUgIT0gbnVsbCB8fCBzaW1wbGVjaGFuZ2VzWydib29rbGV0SlNPTiddLmN1cnJlbnRWYWx1ZSAhPSB1bmRlZmluZWQpKSl7XG4gICAgICB0aGlzLnByb2Nlc3NCb29rbGV0KCk7XG4gICAgfVxuICAgIC8vIGNvbnNvbGUubG9nKCdpbnNpZGUgUXVlc3Rpb25uYWlyZSBuZ09uQ2hhbmdlcycpO1xuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuYm9va2xldCk7XG4gICAgLy8gaWYodGhpcy5ib29rbGV0ID09IHVuZGVmaW5lZCB8fCB0aGlzLmJvb2tsZXQubGVuZ3RoID09IDApIHtcbiAgICAvLyAgIHRoaXMucHJvY2Vzc0Jvb2tsZXQoKTtcbiAgICAvLyB9XG4gIH1cblxuICBwcm9jZXNzQm9va2xldCgpIHtcbiAgICBpZiAodGhpcy5ib29rbGV0SWQpIHtcbiAgICAgIGlmICh0aGlzLmJvb2tsZXRJZC5sZW5ndGggPT0gMTgpIHtcbiAgICAgICAgdGhpcy5yZWFkQm9va2xldCh0aGlzLmJvb2tsZXRJZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmKHRoaXMuYm9va2xldEpTT04pIHtcbiAgICAgIC8vIFRyeSB0byBwYXNzIGEgdmFsdWUgZnJvbSBCYWNrZW5kIHRvIGRpZmZlcmVudGlhdGUgdGhlIFF1ZXN0aW9uQm9vayBSZWFkIGFuZCBBbnN3ZXJCb29rIFJlYWRcbiAgICAgIHRoaXMuaXNBbnN3ZXJGbGFnID0gdHJ1ZTtcblxuICAgICAgaWYodGhpcy5ib29rbGV0SlNPTiAhPSBudWxsIHx8IHRoaXMuYm9va2xldEpTT04gIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gU3RvcmluZyB0aGUgQVBJIHJlc3BvbnNlIGZvciBmdXR1cmUgdXNlXG4gICAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlKHRoaXMuYm9va2xldEpTT04pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmJvb2tsZXQgPSB0aGlzLmJvb2tsZXRKU09OLnJlY29yZHM7XG4gICAgICB0aGlzLmFiSXRlbSA9IHRoaXMuYm9va2xldEpTT04uYW5zd2VyYm9vaztcblxuICAgICAgLy8gUHJvY2VzcyB0aGUgU3ViIFF1ZXN0aW9uIE9wdGlvbnMgLSBUaGlzIHNob3VsZCBiZSBtZXJnZWQgd2l0aCBib29rUXVlc3Rpb25zTWFwIGluIGZ1dHVyZVxuICAgICAgZm9yICh2YXIgc3EgaW4gdGhpcy5ib29rbGV0SlNPTi5zcU9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5zcU9wdGlvbnMuc2V0KHNxLCB0aGlzLmJvb2tsZXRKU09OLnNxT3B0aW9uc1tzcV0pO1xuICAgICAgfVxuXG4gICAgICAvLyBQcm9jZXNzIHRoZSBRdWVzdGlvbnNcbiAgICAgIC8vIEhBIDI4REVDMjMgdGhpcyBhcHBsaWVzIGZvciBib29rbGV0XG4gICAgICAvLyBIQSAxN0pBTjI0IEFkZGVkIHRlcm5hcnkgb3BlcmF0b3IgdG8gYXZvaWQgdW5kZWZpbmVkIHNjZW5hcmlvXG4gICAgICAvLyBIQSAwOUZFQjI0IEFkZGluZyBjb25kaXRpb24gdG8gYXZvaWQgdW5kZWZpbmVkIGVycm9yXG4gICAgICBpZih0aGlzLmJvb2tsZXRKU09OPy5ib29rUXVlc3Rpb25zTWFwICYmIE9iamVjdC5rZXlzKHRoaXMuYm9va2xldEpTT04/LmJvb2tRdWVzdGlvbnNNYXApLmxlbmd0aCA+IDApe1xuICAgICAgICBmb3IgKHZhciB2YWx1ZSBpbiB0aGlzLmJvb2tsZXRKU09OLmJvb2tRdWVzdGlvbnNNYXApIHtcbiAgICAgICAgICB0aGlzLmJvb2tRdWVzdGlvbnNNYXAuc2V0KHZhbHVlLCB0aGlzLmJvb2tsZXRKU09OLmJvb2tRdWVzdGlvbnNNYXBbdmFsdWVdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gSEEgMjhERUMyMyB0aGlzIGFwcGxpZXMgZm9yIGJvb2sgb3IgcXVlc3Rpb25zXG4gICAgICBlbHNle1xuICAgICAgICB2YXIgdmFsdWUgPSAnJztcbiAgICAgICAgLy8gSEEgMDlGRUIyNCBBZGRlZCB0ZXJuYXJ5XG4gICAgICAgIHZhbHVlID0gdGhpcy5ib29rbGV0SlNPTi5yZWNvcmRzWzBdPy5JZDtcbiAgICAgICAgdGhpcy5ib29rUXVlc3Rpb25zTWFwLnNldCh2YWx1ZSwgdGhpcy5ib29rbGV0SlNPTi5xdWVzdGlvbmJvb2spO1xuICAgICAgfVxuXG4gICAgICBpZih0aGlzLmJvb2tsZXRKU09OLnF1ZXN0aW9uYm9vaz8uQWN0aW9uc19fYyAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5hY3Rpb25zID0gSlNPTi5wYXJzZSh0aGlzLmJvb2tsZXRKU09OLnF1ZXN0aW9uYm9vay5BY3Rpb25zX19jKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gSEEgMTlERUMyMyBsYW5nRGlyZWN0aW9uIHZhcmlhYmxlIHZhbHVlIGFzc2lnbmluZ1xuICAgIC8vIGNvbnNvbGUubG9nKCdTdHlsZV9fYycsIHRoaXMuYm9va2xldEpTT04ucXVlc3Rpb25ib29rLlN0eWxlX19jKTtcbiAgICBpZih0aGlzLmJvb2tsZXRKU09OPy5xdWVzdGlvbmJvb2s/LlN0eWxlX19jKXtcbiAgICAgIHZhciBzdHlsZSA9IEpTT04ucGFyc2UoSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmJvb2tsZXRKU09OPy5xdWVzdGlvbmJvb2s/LlN0eWxlX19jKSkpO1xuICAgICAgdGhpcy5sYW5nRGlyZWN0aW9uID0gc3R5bGU/LmRpcmVjdGlvbjtcbiAgICB9XG4gICAgZWxzZSBpZih0aGlzLmJvb2tsZXRKU09OPy5yZWNvcmRzWzBdPy5TdHlsZV9fYyl7XG4gICAgICB2YXIgc3R5bGUgPSBKU09OLnBhcnNlKEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5ib29rbGV0SlNPTj8ucmVjb3Jkc1swXT8uU3R5bGVfX2MpKSk7XG4gICAgICB0aGlzLmxhbmdEaXJlY3Rpb24gPSBzdHlsZT8uZGlyZWN0aW9uO1xuICAgIH1cblxuICAgIC8vIEhBIDE4LUpBTi0yNCBUaGUgY29uZGl0aW9uIGlzIHVzZWQgZm9yIEJpbmQtSW4gTG9naWMgXG4gICAgdGhpcy5oYW5kbGVDb21wbGV0ZUJvb2tsZXQodGhpcy5ib29rbGV0SlNPTik7IFxuICB9XG5cbiAgcHJpdmF0ZSByZWFkQm9va2xldCA9ICh1dWlkOiBzdHJpbmcpID0+IHtcbiAgICBpZih0aGlzLnNlcnYgPT0gXCJhcGlcIikge1xuICAgICAgdGhpcy5kYXRhU2VydmljZS5nZXRBUElEYXRhKFxuICAgICAgICB0aGlzLnRrbixcbiAgICAgICAgW1wiQm9va2xldFwiLCBcInJlYWRcIiwgdXVpZF0sXG4gICAgICAgIHRoaXMuc3VjY2Vzc1JlYWRCb29rbGV0LFxuICAgICAgICB0aGlzLmZhaWx1cmVSZWFkQm9va2xldFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZlNlcnZpY2UucmVtb3RlQWN0aW9uKFxuICAgICAgICBcIk54dENvbnRyb2xsZXIucHJvY2Vzc1wiLFxuICAgICAgICBbXCJCb29rbGV0XCIsIFwicmVhZFwiLCB1dWlkXSxcbiAgICAgICAgdGhpcy5zdWNjZXNzUmVhZEJvb2tsZXQsXG4gICAgICAgIHRoaXMuZmFpbHVyZVJlYWRCb29rbGV0XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3VjY2Vzc1JlYWRCb29rbGV0ID0gKHJlc3BvbnNlKSA9PiB7XG4gICAgY29uc29sZS5sb2coJ0luc2lkZSB0aGUgc3VjY2Vzc1JlYWRCb29rbGV0Jyk7XG4gICAgLy8gY29uc29sZS5sb2cocmVzcG9uc2UpO1xuICAgIGlmKHJlc3BvbnNlICE9IG51bGwgfHwgcmVzcG9uc2UgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBTdG9yaW5nIHRoZSBBUEkgcmVzcG9uc2UgZm9yIGZ1dHVyZSB1c2VcbiAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZShyZXNwb25zZSk7XG5cbiAgICAgIC8vIFRyeSB0byBwYXNzIGEgdmFsdWUgZnJvbSBCYWNrZW5kIHRvIGRpZmZlcmVudGlhdGUgdGhlIFF1ZXN0aW9uQm9vayBSZWFkIGFuZCBBbnN3ZXJCb29rIFJlYWRcbiAgICAgIC8vIHRoaXMuaXNBbnN3ZXJGbGFnID0gdHJ1ZTtcbiAgICAgIFxuICAgICAgdGhpcy5ib29rbGV0ID0gcmVzcG9uc2UucmVjb3JkcztcbiAgICAgIHRoaXMuYWJJdGVtID0gcmVzcG9uc2UuYW5zd2VyYm9vaztcblxuICAgICAgLy8gUHJvY2VzcyB0aGUgU3ViIFF1ZXN0aW9uIE9wdGlvbnMgLSBUaGlzIHNob3VsZCBiZSBtZXJnZWQgd2l0aCBib29rUXVlc3Rpb25zTWFwIGluIGZ1dHVyZVxuICAgICAgZm9yICh2YXIgc3EgaW4gcmVzcG9uc2Uuc3FPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuc3FPcHRpb25zLnNldChzcSwgcmVzcG9uc2Uuc3FPcHRpb25zW3NxXSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFByb2Nlc3MgdGhlIFF1ZXN0aW9uc1xuICAgICAgZm9yICh2YXIgdmFsdWUgaW4gcmVzcG9uc2UuYm9va1F1ZXN0aW9uc01hcCkge1xuICAgICAgICB0aGlzLmJvb2tRdWVzdGlvbnNNYXAuc2V0KHZhbHVlLCByZXNwb25zZS5ib29rUXVlc3Rpb25zTWFwW3ZhbHVlXSk7XG4gICAgICB9XG5cbiAgICAgIGlmKHJlc3BvbnNlLnF1ZXN0aW9uYm9vaz8uQWN0aW9uc19fYyAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5hY3Rpb25zID0gSlNPTi5wYXJzZShyZXNwb25zZS5xdWVzdGlvbmJvb2suQWN0aW9uc19fYyk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEhBIDE5REVDMjMgbGFuZ0RpcmVjdGlvbiB2YXJpYWJsZSB2YWx1ZSBhc3NpZ25pbmdcbiAgICBpZihyZXNwb25zZT8ucXVlc3Rpb25ib29rPy5TdHlsZV9fYyl7XG4gICAgICB2YXIgc3R5bGUgPSBKU09OLnBhcnNlKEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocmVzcG9uc2U/LnF1ZXN0aW9uYm9vaz8uU3R5bGVfX2MpKSk7XG4gICAgICB0aGlzLmxhbmdEaXJlY3Rpb24gPSBzdHlsZT8uZGlyZWN0aW9uO1xuICAgIH1cbiAgICBlbHNlIGlmKHJlc3BvbnNlPy5yZWNvcmRzWzBdPy5TdHlsZV9fYyl7XG4gICAgICB2YXIgc3R5bGUgPSBKU09OLnBhcnNlKEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocmVzcG9uc2U/LnJlY29yZHNbMF0/LlN0eWxlX19jKSkpO1xuICAgICAgdGhpcy5sYW5nRGlyZWN0aW9uID0gc3R5bGU/LmRpcmVjdGlvbjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZhaWx1cmVSZWFkQm9va2xldCA9IChyZXNwb25zZSkgPT4ge1xuXG4gIH1cblxuICBoYW5kbGVCb29rbGV0QWN0aW9uQ2xpY2soYWN0aW9uOkFjdGlvbk1ldGEpIHtcbiAgICAvLyBIQSAxOUpBTjI0IEFjdGlvbiBjaGFuZ2VzXG4gICAgdGhpcy5hbnN3ZXJMaXN0ID0gW107XG4gICAgdGhpcy5kYXRhQmluZCA9IFtdOyAvLyBIQSAxMkZFQjI0IENsZWFyaW5nIGRhdGFCaW5kIHVwb24gYnV0dG9uIGFjdGlvbiBzbyB0aGF0IGRhdGFCaW5kIHZhbHVlIHdpbGwgbm90IG92ZXJyaWRlIHRoZSBjaGFuZ2VkIHZhbHVlXG4gICAgY29uc29sZS5sb2coYWN0aW9uKTtcbiAgICBsZXQgZGF0YVRvUGFyZW50ID0ge307XG4gICAgLy8gSEEgMjJKQU4yNCB0aGlzIGNoYW5nZSB0byBtYWtlIGNsb3NlIGV2ZW50IHdvcmtcbiAgICBkYXRhVG9QYXJlbnRbJ2FjdGlvbiddID0gYWN0aW9uLmV2ZW50dG9lbWl0O1xuICAgIGlmKCEoYWN0aW9uLmV2ZW50dG9lbWl0ID09PSAnY2xvc2UnKSl7XG4gICAgICAvLyBIQSAxOC1KQU4tMjQgU2VuZGluZyB0aGUgY29tcGxldGUganNvbiBkYXRhIGFsc28gXG4gICAgICBkYXRhVG9QYXJlbnRbJ2pzb25Cb29rJ10gPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldCgpO1xuICAgICAgLy8gSEEgMTdKQU4yNCBueHRJZCB0byBkYXRhUGFyZW50IG9iamVjdFxuICAgICAgZGF0YVRvUGFyZW50WydueHRJZCddID0gT2JqZWN0LmtleXModGhpcy5ib29rbGV0SlNPTj8uYm9va1F1ZXN0aW9uc01hcClbMF07XG4gICAgICAvLyBIQSAxMS1KQU4tMjQgTWluaW1pemluZyB0aGUgdmFsdWUgd2hpY2ggaGFzIHRvIGJlIHBhc3NlZCB0byB0aGUgc2VydmVyXG4gICAgICB0aGlzLmhhbmRsZUNvbXBsZXRlQm9va2xldChkYXRhVG9QYXJlbnRbJ2pzb25Cb29rJ10pO1xuICAgICAgZGF0YVRvUGFyZW50WydkYXRhJ10gPSB0aGlzLmFuc3dlckxpc3QgPyB0aGlzLmFuc3dlckxpc3QgOiBkYXRhVG9QYXJlbnRbJ2RhdGEnXTtcbiAgICAgIC8vIHdoZW4gY2xpY2tpbmcgdGhlIHN1Ym1pdCBidXR0b24gdmFsaWRhdGluZyB0aGUgcmVxdWlyZWQgZmllbGRzXG4gICAgICBmb3IobGV0IGtleSBpbiBkYXRhVG9QYXJlbnRbJ2pzb25Cb29rJ10uYm9va1F1ZXN0aW9uc01hcCl7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRCb29rICA9IGRhdGFUb1BhcmVudFsnanNvbkJvb2snXS5ib29rUXVlc3Rpb25zTWFwW2tleV07XG4gICAgICAgIGN1cnJlbnRCb29rLlF1ZXN0aW9uc19fci5yZWNvcmRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgaWYoZWxlbWVudC5FcnJvcl9NZXNzYWdlX19jICYmIGRhdGFUb1BhcmVudFsnYWN0aW9uJ10gPT0gJ3N1Ym1pdCcgJiYgIWVsZW1lbnQuaW5wdXQpe1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VTZXJ2aWNlLnN1Ym1pdENoYW5nZShlbGVtZW50LklkKTtcbiAgICAgICAgICB9XG4gICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gSEEgMjNKQU4yNCBUbyBjYWxsIHRoZSBhY3Rpb24gb24gYW55IGV2ZW50XG4gICAgdGhpcy5oYW5kbGVCb29rbGV0QWN0aW9uRXZlbnQuZW1pdChkYXRhVG9QYXJlbnQpO1xuICB9XG5cbiAgLy8gSEEgMTgtSkFOLTI0IGhhbmRsZUNvbXBsZXRlQm9va2xldCBpcyB0byBzaW1wbGlmeSB0aGUgbG9naWNcbiAgaGFuZGxlQ29tcGxldGVCb29rbGV0KGNvbXBsZXRlQm9va2xldCl7XG4gICAgaWYoT2JqZWN0LmtleXMoY29tcGxldGVCb29rbGV0Py5ib29rUXVlc3Rpb25zTWFwID8/IHt9KS5sZW5ndGggPT09IDApeyAvLyBIQSAxMS1KQU4tMjQgSWYgY29uZGl0aW9uIHRvIGxvYWQgYm9va2xldFxuICAgICAgdGhpcy5oYW5kbGVCb29rKGNvbXBsZXRlQm9va2xldD8ucXVlc3Rpb25ib29rPy5RdWVzdGlvbnNfX3IpO1xuICAgIH1cbiAgICBlbHNleyAvLyBIQSAxMS1KQU4tMjQgVG8gbG9hZCBib29rIHF1ZXN0aW9uc1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gY29tcGxldGVCb29rbGV0LmJvb2tRdWVzdGlvbnNNYXApIHtcbiAgICAgICAgY29uc3QgdmFsID0gY29tcGxldGVCb29rbGV0LmJvb2tRdWVzdGlvbnNNYXBba2V5XTtcbiAgICAgICAgaWYodmFsLlR5cGVfX2MgPT09ICdCb29rJyl7XG4gICAgICAgICAgdGhpcy5oYW5kbGVCb29rKHZhbC5RdWVzdGlvbnNfX3IpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2V7XG4gICAgICAgICAgdGhpcy5oYW5kbGVRdWVzKHZhbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBIQSAxMS1KQU4tMjQgaGFuZGxlQm9vayBsb2FkcyB0aGUgQm9va1xuICBoYW5kbGVCb29rKHF1ZXNMaXN0OiBhbnkpe1xuICAgIHF1ZXNMaXN0Py5yZWNvcmRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICBpZihlbGVtZW50LlR5cGVfX2MgPT09ICdCb29rJyl7XG4gICAgICAgIC8vIEhBIDI0SkFOMjQgRmV0Y2hpbmcgZnJvbSBRQiByZWZlcmVuY2VcbiAgICAgICAgdmFyIGJvb2sgPSBKU09OLnBhcnNlKGVsZW1lbnQuUUJfUmVmZXJlbmNlX1F1ZXN0aW9uc19fYyk7XG4gICAgICAgIGJvb2sucXVlc3Rpb25ib29rLlF1ZXN0aW9uc19fci5yZWNvcmRzLmZvckVhY2gocXVlcyA9PiB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVRdWVzKHF1ZXMpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGVsc2V7XG4gICAgICAgIHRoaXMuaGFuZGxlUXVlcyhlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIEhBIDExLUpBTi0yNCBoYW5kbGVRdWVzIHRvIGxvYWQgcXVlc3Rpb25cbiAgaGFuZGxlUXVlcyhxdWVzOiBhbnkpe1xuICAgIC8vIEhBIDE5LUpBTi0yNCBJZiBjb25kaXRpb24gaXMgZm9yIGJpbmQtaW4sIGNvcnJlY3Rpb25cbiAgICAvLyBIQSAwOUZFQjI0IEFkZGluZyBjb25kaXRpb24gdG8gYXZvaWQgdW5kZWZpbmVkIGVycm9yXG4gICAgaWYodGhpcy5kYXRhQmluZCAmJiBPYmplY3Qua2V5cyh0aGlzLmRhdGFCaW5kKS5sZW5ndGggPiAwKXtcbiAgICAgIGZvcihsZXQgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZGF0YUJpbmQpKXtcbiAgICAgICAgaWYocXVlcy5SZWZlcmVuY2VfRmllbGRfX2MgPT09IGtleSl7XG4gICAgICAgICAgaWYocXVlcy5UeXBlX19jID09PSAnRHJvcGRvd24nKXtcbiAgICAgICAgICAgIHRoaXMuc3FPcHRpb25zLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgIGlmKGVsZW1lbnRbJ1JlZmVyZW5jZV9GaWVsZF9fYyddID09PSBrZXkpe1xuICAgICAgICAgICAgICAgIGVsZW1lbnRbJ2lucHV0J10gPSBxdWVzLmlucHV0ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgZWxlbWVudFsnc2VsZWN0ZWRWYWx1ZSddID0gcXVlcy5zZWxlY3RlZFZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBIQSAyNEpBTjI0IFRvIGJpbmQtaW4gRGF0ZSBhbmQgRGF0ZVRpbWVcbiAgICAgICAgICBlbHNlIGlmKHF1ZXMuVHlwZV9fYyA9PT0gJ0RhdGUnIHx8IHF1ZXMuVHlwZV9fYyA9PSAnRGF0ZVRpbWUnKXtcbiAgICAgICAgICAgIHF1ZXMuaW5wdXQgPSBuZXcgRGF0ZSh2YWx1ZS50b1N0cmluZygpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gSEEgMTJGRUIyNCBUbyBiaW5kLWluIExvY2F0aW9uIFR5cGVcbiAgICAgICAgICBlbHNlIGlmKHF1ZXMuVHlwZV9fYyA9PT0gJ0xvY2F0aW9uJyl7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygndmFsdWUgJywgdmFsdWUpO1xuICAgICAgICAgICAgcXVlcy5pbnB1dCA9IHZhbHVlO1xuICAgICAgICAgICAgcXVlcy5zZWxlY3RlZFZhbHVlID0gdmFsdWVbJ2FkZHJlc3MnXSA/IHZhbHVlWydhZGRyZXNzJ10gOiB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgIHF1ZXMuaW5wdXQgPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5hbnN3ZXJMaXN0LnB1c2gocXVlcyk7IC8vIEhBIDEyRkVCMjQgVG8gZ2l2ZSB0aGUgdmFsdWUgZm9yIGRhdGFcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBlbHNle1xuICAgICAgY29uc3QgcXVlc3Rpb24gPSB7fTtcbiAgICAgIHF1ZXN0aW9uWydpZCddID0gcXVlcy5JZDtcbiAgICAgIC8vIHF1ZXN0aW9uWydRdWVzdGlvbl9fYyddID0gcXVlcy5RdWVzdGlvbl9fYztcbiAgICAgIHF1ZXN0aW9uWydpbnB1dCddID0gcXVlcy5pbnB1dDtcbiAgICAgIC8vIEhBIDEyRkVCMjQgVG8gYmluZC1vdXQgTG9jYXRpb24gVHlwZVxuICAgICAgaWYocXVlcy5UeXBlX19jID09PSAnTG9jYXRpb24nKXtcbiAgICAgICAgcXVlc3Rpb25bJ2lucHV0J10gPSBxdWVzLmlucHV0ID8gcXVlcy5pbnB1dCA6IHF1ZXMuc2VsZWN0ZWRWYWx1ZTtcbiAgICAgIH1cbiAgICAgIHF1ZXN0aW9uWydUeXBlX19jJ10gPSBxdWVzLlR5cGVfX2M7XG4gICAgICBxdWVzdGlvblsnUXVlc3Rpb25fTm9fX2MnXSA9IHF1ZXMuUXVlc3Rpb25fTm9fX2M7XG4gICAgICBxdWVzdGlvblsnUmVmZXJlbmNlX0ZpZWxkX19jJ10gPSBxdWVzPy5SZWZlcmVuY2VfRmllbGRfX2M7XG4gICAgICB0aGlzLmFuc3dlckxpc3QucHVzaChxdWVzdGlvbik7XG4gICAgfVxuICB9XG5cbiAgcmVhZFF1ZXN0aW9ucyhxYklkOiBzdHJpbmcpIHtcbiAgICAvLyBjb25zb2xlLmxvZygnaW5zaWRlIEJvb2tsZXRDb21wb25lbnQucmVhZFF1ZXN0aW9ucyAnICsgcWJJZCk7XG4gICAgLy8gY29uc29sZS5sb2codGhpcy5ib29rUXVlc3Rpb25zTWFwLnNpemUpO1xuICAgIGxldCBxdWVzdGlvbnMgPSBbXTtcbiAgICAvLyBIQSAzMS1KQU4tMjQgQWRkZWQgdGVybmFyeSB0byBhdm9pZCB1bmRlZmluZWRcbiAgICBmb3IodmFyIHNxIGluIHRoaXMuYm9va1F1ZXN0aW9uc01hcD8uZ2V0KHFiSWQpPy5RdWVzdGlvbnNfX3I/LnJlY29yZHMpIHtcbiAgICAgIGxldCBxOiBRdWVzdGlvbiA9IHRoaXMuYm9va1F1ZXN0aW9uc01hcD8uZ2V0KHFiSWQpLlF1ZXN0aW9uc19fci5yZWNvcmRzW3NxXTtcbiAgICAgIC8vIEhBIDA5RkVCMjQgaWYgcXVlc3Rpb24gaXMgdGhlcmUgcHJvY2Vzc1xuICAgICAgaWYocSl7XG4gICAgICAgIGlmKHEuVHlwZV9fYyA9PSAnRHJvcGRvd24nICYmIHRoaXMuc3FPcHRpb25zLmdldChxLklkKSkge1xuICAgICAgICAgIHF1ZXN0aW9ucy5wdXNoKHRoaXMuc3FPcHRpb25zLmdldChxLklkKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcXVlc3Rpb25zLnB1c2gocSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gY29uc29sZS5sb2cocXVlc3Rpb25zKTtcbiAgICByZXR1cm4gcXVlc3Rpb25zO1xuICB9XG5cbiAgZ2V0VGV4dCh2YWx1ZSkge1xuICAgIHZhciBkb2MgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKHZhbHVlLCBcInRleHQvaHRtbFwiKTtcbiAgICAvL2NvbnNvbGUubG9nKCBkb2MuZG9jdW1lbnRFbGVtZW50LnRleHRDb250ZW50KTtcbiAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwoXG4gICAgICBkb2MuZG9jdW1lbnRFbGVtZW50LnRleHRDb250ZW50XG4gICAgKTtcbiAgfVxuICBnZXREcm9wRG93bihldmVudDphbnkpe1xuICAgIHRoaXMuaGFkbGVEcm9wRG93bkRlcGVuZGVudC5lbWl0KGV2ZW50KTtcbiAgfVxufVxuIiwiPG5neC1zcGlubmVyIFtuYW1lXT1cInNwaW5uZXJOYW1lXCIgW3R5cGVdPVwic3Bpbm5lclR5cGVcIj48L25neC1zcGlubmVyPlxuPCEtLSBCb29rbGV0IEhhbmRsaW5nLS0+XG48IS0tIEhBIDE5REVDMjMgRm9yIERpcmVjdGlvbiAtLT5cbjxkaXYgKm5nRm9yPVwibGV0IHFiIG9mIGJvb2tsZXRcIiBbbmdDbGFzc109XCJsYW5nRGlyZWN0aW9uXCI+XG4gICAgPCEtLSBNUiBDb21tZW50ZWQgYmVsb3cgY29kZSB0byBlbnN1cmUgc2luZ2xlIEpTT04gZm9yIFVOQ09ORElUSU9OQUwgQm9va2xldHMgLS0+XG4gICAgPCEtLSA8bGliLXF1ZXN0aW9ubmFpcmUgW3NlcnZdPVwic2VydlwiIFtxYklkXT1cInFiLklkXCIgW3Rrbl09XCJ0a25cIj48L2xpYi1xdWVzdGlvbm5haXJlPiAtLT5cbiAgICA8IS0tIEhBIDI4REVDMjMgQmVsb3cgSWYgbG9naWMgaXMgdG8gbG9hZCBmcm9tIGJvb2tsZXQgIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJxYi5RdWVzdGlvbnNfX3I/LnJlY29yZHM7IGVsc2UgZWxzZUJsb2NrXCI+XG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHF1ZXMgb2YgcWIuUXVlc3Rpb25zX19yLnJlY29yZHNcIiBbY2xhc3NdPVwicWIuaXNTaGVuZ2VsX19jID8gJ3F1ZXN0aW9uZGl2MScgOiAncXVlc3Rpb25kaXYxIHBhZGQtYm90dG9tJ1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInF1ZXN0aW9uZGl2MlwiPlxuICAgICAgICAgICAgICAgIDwhLS0gSEEgMTdKQU4yNCAtIElzIHRpdGxlIGlzIGVuYWJsZWQgc28gdGhhdCBiYXNlZCBvbiB0aGUgYm9vbGVhbiBkaXYgd2lsbCBiZSB2aXNpYmxlIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJxdWVzLklzX1RpdGxlX19jXCIgW2NsYXNzXT1cInFiLmlzU2hlbmdlbF9fYyA/ICdoZWFkZXItc3R5bGUnIDogJ3F1ZXN0aW9uLWYtc2l6ZSBhZGRpdGlvbmFsJ1wiPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIFZEIDA4Tk9WMjMgLSBzaG93aW5nIGxhYmxlIHdoZW4gaXRzIGF2YWlsYWJsZS0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IFtpbm5lckhUTUxdPVwiZ2V0VGV4dChxdWVzPy5RdWVzdGlvbl9UZXh0X19jKVwiICpuZ0lmPVwicXVlcz8uUXVlc3Rpb25fVGV4dF9fY1wiID4gXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBxdWVzPy5RdWVzdGlvbl9UZXh0X19jIH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PiA8IS0tIFZEIDE5SkFOMjQgLSBnZXR0aW5nIHRva2VuIGFzIGlucHV0IC0tPlxuICAgICAgICAgICAgICAgIDxsaWItcXVlc3Rpb25ib29rIFtxYkl0ZW1dPVwicWJcIiBbdG9rZW5dPVwidG9rZW5cIiBbbGFiZWxWYWx1ZV09XCJsYWJlbFZhbHVlXCIgW3F1ZXN0aW9uSXRlbV09XCJxdWVzXCIgW3F1ZXN0aW9uc109XCJyZWFkUXVlc3Rpb25zKHFiLklkKVwiICAoaGFuZGxlRHJvcERvd24pPVwiZ2V0RHJvcERvd24oJGV2ZW50KVwiPjwvbGliLXF1ZXN0aW9uYm9vaz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIEhBIDI4REVDMjMgQmVsb3cgZWxzZSBsb2dpYyBpcyB0byBsb2FkIGZyb20gYm9va3Mgb3IgcXVlc3Rpb25zIC0tPlxuICAgIDxuZy10ZW1wbGF0ZSAjZWxzZUJsb2NrPlxuICAgICAgICA8ZGl2IFtjbGFzc109XCJxYi5pc1NoZW5nZWxfX2MgPyAncXVlc3Rpb25kaXYxJyA6ICdxdWVzdGlvbmRpdjEgcGFkZC1ib3R0b20nXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVlc3Rpb25kaXYyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFxYi5Jc19UaXRsZV9fY1wiIFtjbGFzc109XCJxYi5pc1NoZW5nZWxfX2MgPyAnaGVhZGVyLXN0eWxlJyA6ICdxdWVzdGlvbi1mLXNpemUgYWRkaXRpb25hbCdcIj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBWRCAwOE5PVjIzIC0gc2hvd2luZyBsYWJsZSB3aGVuIGl0cyBhdmFpbGFibGUtLT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBbaW5uZXJIVE1MXT1cImdldFRleHQocWI/LlF1ZXN0aW9uX1RleHRfX2MpXCIgKm5nSWY9XCJxYj8uUXVlc3Rpb25fVGV4dF9fY1wiID4gXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBxYj8uUXVlc3Rpb25fVGV4dF9fYyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAge3sgcWI/LlRpdGxlX19jIH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PiA8IS0tIFZEIDE5SkFOMjQgLSBnZXR0aW5nIHRva2VuIGFzIGlucHV0IC0tPlxuICAgICAgICAgICAgICAgIDxsaWItcXVlc3Rpb25ib29rIFtxYkl0ZW1dPVwicWJcIiBbdG9rZW5dPVwidG9rZW5cIiBbbGFiZWxWYWx1ZV09XCJsYWJlbFZhbHVlXCIgW3F1ZXN0aW9uSXRlbV09XCJxYlwiIFtxdWVzdGlvbnNdPVwicmVhZFF1ZXN0aW9ucyhxYi5JZClcIiAgKGhhbmRsZURyb3BEb3duKT1cImdldERyb3BEb3duKCRldmVudClcIj48L2xpYi1xdWVzdGlvbmJvb2s+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbjwvZGl2PlxuXG48IS0tIEdyb3VwIEFjdGlvbnMgLS0+XG48IS0tIEhBIDE5REVDMjMgRm9yIERpcmVjdGlvbiAtLT5cbjxkaXYgY2xhc3M9XCJhbGlnbi1zdWJtaXQtcm93XCIgKm5nSWY9XCJhYkl0ZW0/LlN0YXR1c19fYyAhPSAnQ29tcGxldGVkJ1wiIFtuZ0NsYXNzXT1cImxhbmdEaXJlY3Rpb25cIj5cbiAgICA8ZGl2ICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgYWN0aW9uczsgbGV0IGkgPSBpbmRleFwiPlxuICAgIDwhLS0gLy8gSEEgMjJKQU4yNCBDb21tb25pc2UgdGhlIGJ1dHRvbiBzdHlsZSBpbiBmdXNpb24gLS0+XG4gICAgICAgIDxidXR0b24gKGNsaWNrKT1cImhhbmRsZUJvb2tsZXRBY3Rpb25DbGljayhhY3Rpb24pXCIgbmdDbGFzcz1cImJ0biBidG4tcHJpbWFyeSBmYy1idXR0b24gbnh0QnV0dG9uXCI+XG4gICAgICAgICAgICB7eyBhY3Rpb24ubmFtZSB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuIl19