fmode-ng 0.0.200 → 0.0.201

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.
@@ -480,6 +480,7 @@ export class FmodeQuery {
480
480
  url.searchParams.set(key, typeof value === 'string' ? value : JSON.stringify(value));
481
481
  }
482
482
  });
483
+ // console.log(url.searchParams)
483
484
  const headers = {
484
485
  'X-Parse-Application-Id': FmodeQuery.instance.appId
485
486
  };
@@ -493,11 +494,18 @@ export class FmodeQuery {
493
494
  headers['X-Parse-Session-Token'] = sessionToken;
494
495
  }
495
496
  }
497
+ // console.log(headers,this._sessionToken,FmodeQuery.instance.sessionToken)
496
498
  const response = await fetch(url.toString(), { headers });
497
499
  const result = await response.json();
498
- console.error(response);
499
- if (result.error)
500
+ // console.log(result)
501
+ if (result.code == 209) { // sessionToken过期
502
+ FmodeQuery.instance.User.logOut();
503
+ }
504
+ if (result.error) {
505
+ console.error(response);
500
506
  throw new Error(result.error);
507
+ }
508
+ ;
501
509
  return result.results.map((data) => {
502
510
  const obj = new FmodeObject(this.className);
503
511
  // Set basic properties first
@@ -534,7 +542,7 @@ export class FmodeQuery {
534
542
  }
535
543
  async get(objectId, options) {
536
544
  const url = new URL(`${FmodeQuery.instance.serverURL}/classes/${this.className}/${objectId}`);
537
- if (this.include.length > 0) {
545
+ if (this._include.length > 0) {
538
546
  url.searchParams.set('include', this._include.join(','));
539
547
  }
540
548
  const headers = {
@@ -552,28 +560,34 @@ export class FmodeQuery {
552
560
  }
553
561
  const response = await fetch(url.toString(), { headers });
554
562
  const result = await response.json();
555
- console.log(url, result);
563
+ // console.log(url,result)
556
564
  if (result.error)
557
565
  throw new Error(result.error);
558
566
  const obj = new FmodeObject(this.className);
559
- // Process the data to convert included objects
560
- const processedData = FmodeQuery.convertIncludedObjects(result);
561
- // Set basic properties
567
+ // Set basic properties first
562
568
  obj.id = result.objectId;
563
- if (processedData.createdAt)
564
- obj.createdAt = new Date(processedData.createdAt);
565
- if (processedData.updatedAt)
566
- obj.updatedAt = new Date(processedData.updatedAt || processedData.createdAt);
567
- if (processedData.ACL)
568
- obj.ACL = processedData.ACL;
569
- // Set all other processed data (including converted included objects)
570
- const cleanData = {};
571
- for (const [key, value] of Object.entries(processedData)) {
569
+ if (result.createdAt)
570
+ obj.createdAt = new Date(result.createdAt);
571
+ if (result.updatedAt)
572
+ obj.updatedAt = new Date(result.updatedAt || result.createdAt);
573
+ if (result.ACL)
574
+ obj.ACL = result.ACL;
575
+ // Process each field individually to convert included objects (same as find method)
576
+ const processedData = {};
577
+ for (const [key, value] of Object.entries(result)) {
572
578
  if (!['__type', 'className', 'objectId', 'createdAt', 'updatedAt', 'ACL'].includes(key)) {
573
- cleanData[key] = value;
579
+ // Special handling for included objects - check if it's likely a Parse object
580
+ if (this._include.includes(key) && value && typeof value === 'object' && value.objectId) {
581
+ // This is an included Parse object
582
+ processedData[key] = FmodeQuery.convertIncludedObjects(value);
583
+ }
584
+ else {
585
+ // Regular field or array
586
+ processedData[key] = FmodeQuery.convertIncludedObjects(value);
587
+ }
574
588
  }
575
589
  }
576
- obj.set(cleanData);
590
+ obj.set(processedData);
577
591
  return obj;
578
592
  }
579
593
  async count(options) {
@@ -801,4 +815,4 @@ export class FmodeQuery {
801
815
  return FmodeQuery.and(this, ...queries);
802
816
  }
803
817
  }
804
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm1vZGUucXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mbW9kZS1uZy9zcmMvbGliL2NvcmUvcGFyc2UvZm1vZGUucXVlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBd0I3QyxNQUFNLE9BQU8sVUFBVTthQUNKLGNBQVMsR0FBZSxJQUFJLEFBQW5CLENBQW9CO0lBRTVDLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBYTtRQUM3QixJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztJQUM5QixDQUFDO0lBRU8sTUFBTSxLQUFLLFFBQVE7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBQ25FLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDO0lBRUQ7O09BRUc7SUFDSyxNQUFNLENBQUMsc0JBQXNCLENBQUMsSUFBUztRQUMzQyxJQUFJLENBQUMsSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3BDLE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN0QixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMvRCxDQUFDO1FBRUQsNENBQTRDO1FBQzVDLDhFQUE4RTtRQUM5RSxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3RELCtFQUErRTtZQUMvRSxNQUFNLFNBQVMsR0FBRyxJ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TUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVELHFCQUFxQjtJQUVyQjs7T0FFRztJQUNILE1BQU07UUFDRixNQUFNLElBQUksR0FBd0I7WUFDOUIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1NBQzVCLENBQUM7UUFFRixJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDNUIsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzdCLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQzNCLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDeEMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2QyxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDZCxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNuQixDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDeEIsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQzNCLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDckMsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUMvQyxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDO1FBQzdELENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUM7UUFDL0QsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxRQUFRLENBQXdCLFNBQWdCLEVBQUMsSUFBeUI7UUFDN0UsU0FBUyxHQUFHLFNBQVMsSUFBSSxJQUFJLEVBQUUsU0FBUyxDQUFBO1FBQ3hDLE1BQU0sS0FBSyxHQUFHLElBQUksVUFBVSxDQUFJLFNBQVMsQ0FBQyxDQUFDO1FBRTNDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2IsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQzdCLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNmLE1BQU0sUUFBUSxHQUFHLE9BQU8sSUFBSSxDQUFDLE9BQU8sS0FBSyxRQUFRO2dCQUM3QyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO2dCQUN6QixDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUNuQixLQUFLLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUM5QixDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDWixNQUFNLElBQUksR0FBRyxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUTtnQkFDdEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztnQkFDdEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDaEIsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDekIsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMzQixLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDOUIsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMxQixLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDNUIsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2IsTUFBTSxNQUFNLEdBQUcsT0FBTyxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVE7Z0JBQ3pDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7Z0JBQ3ZCLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQ2pCLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQzFCLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNiLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDaEMsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2YsS0FBSyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUNwQyxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDWixLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDNUIsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2pCLEtBQUssQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUN0QyxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdEIsS0FBSyxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQ2hELENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQzdCLEtBQUssQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUM7UUFDOUQsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDOUIsS0FBSyxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztRQUNoRSxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVELGVBQWU7SUFFUCxpQkFBaUI7UUFDckIsTUFBTSxNQUFNLEdBQXdCLEVBQUUsQ0FBQztRQUN2QyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDL0IsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDckMsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQzlCLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzNCLE1BQU0sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDMUIsTUFBTSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzVCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMvQixDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzNCLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUM3QixDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDZCxNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pDLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNkLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQixNQUFNLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUMxQixDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDYixNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDN0IsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2xCLE1BQU0sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUN2QyxDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVELHdCQUF3QjtJQUV4QixTQUFTO1FBQ0wsWUFBWTtRQUNaLE1BQU0sV0FBVyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7UUFFdEMsK0JBQStCO1FBQy9CLE1BQU0sZUFBZSxHQUFHLEtBQUssSUFBSSxFQUFFO1lBQy9CLElBQUksQ0FBQztnQkFDRCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDbEMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzlFLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNiLFdBQVcsQ0FBQyxhQUFhLENBQUMsSUFBSSxXQUFXLENBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMzRSxDQUFDO1FBQ0wsQ0FBQyxDQUFDO1FBRUYsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUV0RCxXQUFXO1FBQ1YsV0FBbUIsQ0FBQyxXQUFXLEdBQUcsR0FBRyxFQUFFO1lBQ3BDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUM7UUFFRixPQUFPLFdBQVcsQ0FBQztJQUN2QixDQUFDO0lBRUQsT0FBTztJQUNQLE1BQU0sQ0FBQyxFQUFFLENBQXdCLEdBQUcsT0FBd0I7UUFDeEQsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUM7UUFFekUsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUN2QyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDL0MsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLFVBQVUsQ0FBSSxTQUFTLENBQUMsQ0FBQztRQUM5QyxRQUFRLENBQUMsS0FBSyxHQUFHLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNwRCxPQUFPLFFBQVEsQ0FBQztJQUNwQixDQUFDO0lBRUQsTUFBTSxDQUFDLEdBQUcsQ0FBd0IsR0FBRyxPQUF3QjtRQUN6RCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUV6RSxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ3ZDLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUMvQyxNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7UUFDOUQsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLElBQUksVUFBVSxDQUFJLFNBQVMsQ0FBQyxDQUFDO1FBQzlDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3JELE9BQU8sUUFBUSxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7T0FFRztJQUNILEVBQUUsQ0FBd0IsR0FBRyxPQUF3QjtRQUNqRCxPQUFPLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBVyxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsR0FBRyxDQUF3QixHQUFHLE9BQXdCO1FBQ2xELE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFXLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQztJQUNuRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRm1vZGVPYmplY3QgfSBmcm9tICcuL2Ztb2RlLm9iamVjdCc7XHJcblxyXG50eXBlIFF1ZXJ5Q29uZGl0aW9ucyA9IHtcclxuICAgICRsdD86IGFueTtcclxuICAgICRsdGU/OiBhbnk7XHJcbiAgICAkZ3Q/OiBhbnk7XHJcbiAgICAkZ3RlPzogYW55O1xyXG4gICAgJG5lPzogYW55O1xyXG4gICAgJGluPzogYW55W107XHJcbiAgICAkbmluPzogYW55W107XHJcbiAgICAkZXhpc3RzPzogYm9vbGVhbjtcclxuICAgICRzZWxlY3Q/OiBhbnk7XHJcbiAgICAkZG9udFNlbGVjdD86IGFueTtcclxuICAgICRhbGw/OiBhbnlbXTtcclxuICAgICRyZWdleD86IFJlZ0V4cCB8IHN0cmluZztcclxuICAgICR0ZXh0PzogeyAkc2VhcmNoOiBzdHJpbmc7ICRjYXNlU2Vuc2l0aXZlPzogYm9vbGVhbjsgJGRpYWNyaXRpY1NlbnNpdGl2ZT86IGJvb2xlYW4gfTtcclxuICAgICRuZWFyU3BoZXJlPzogYW55O1xyXG4gICAgJHdpdGhpbj86IGFueTtcclxuICAgICRtYXhEaXN0YW5jZT86IG51bWJlcjtcclxuICAgICRvcj86IFF1ZXJ5Q29uZGl0aW9uc1tdO1xyXG4gICAgJGFuZD86IFF1ZXJ5Q29uZGl0aW9uc1tdO1xyXG4gICAgW2tleTogc3RyaW5nXTogYW55O1xyXG59O1xyXG5cclxuZXhwb3J0IGNsYXNzIEZtb2RlUXVlcnk8VCBleHRlbmRzIEZtb2RlT2JqZWN0ID0gRm1vZGVPYmplY3Q+IHtcclxuICAgIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogYW55IHwgbnVsbCA9IG51bGw7XHJcbiAgICBcclxuICAgIHN0YXRpYyBiaW5kSW5zdGFuY2UoaW5zdGFuY2U6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2luc3RhbmNlID0gaW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0IGluc3RhbmNlKCk6IGFueSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9pbnN0YW5jZSkgdGhyb3cgbmV3IEVycm9yKCdGbW9kZVBhcnNlIG5vdCBpbml0aWFsaXplZCcpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pbnN0YW5jZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlY3Vyc2l2ZWx5IGNvbnZlcnRzIGluY2x1ZGVkIFBvaW50ZXIgb2JqZWN0cyB0byBGbW9kZU9iamVjdCBpbnN0YW5jZXNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgY29udmVydEluY2x1ZGVkT2JqZWN0cyhkYXRhOiBhbnkpOiBhbnkge1xyXG4gICAgICAgIGlmICghZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBkYXRhLm1hcChpdGVtID0+IHRoaXMuY29udmVydEluY2x1ZGVkT2JqZWN0cyhpdGVtKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGFuIGV4cGFuZGVkIFBhcnNlIG9iamVjdFxyXG4gICAgICAgIC8vIFBhcnNlIFNlcnZlciB0eXBpY2FsbHkgcmV0dXJucyBpbmNsdWRlZCBvYmplY3RzIHdpdGggb2JqZWN0SWQgYW5kIGNyZWF0ZWRBdFxyXG4gICAgICAgIGlmIChkYXRhLm9iamVjdElkICYmIChkYXRhLmNyZWF0ZWRBdCB8fCBkYXRhLnVwZGF0ZWRBdCkpIHtcclxuICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIGNsYXNzTmFtZSAtIFBhcnNlIFNlcnZlciBtaWdodCBpbmNsdWRlIGl0IG9yIHdlIHVzZSBhIGdlbmVyaWMgbmFtZVxyXG4gICAgICAgICAgICBjb25zdCBjbGFzc05hbWUgPSBkYXRhLmNsYXNzTmFtZSB8fCAnT2JqZWN0JztcclxuICAgICAgICAgICAgY29uc3Qgb2JqID0gbmV3IEZtb2RlT2JqZWN0KGNsYXNzTmFtZSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKG9iailcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIFNldCBiYXNpYyBwcm9wZXJ0aWVzXHJcbiAgICAgICAgICAgIG9iai5pZCA9IGRhdGEub2JqZWN0SWQ7XHJcbiAgICAgICAgICAgIGlmIChkYXRhLmNyZWF0ZWRBdCkge1xyXG4gICAgICAgICAgICAgICAgb2JqLmNyZWF0ZWRBdCA9IHR5cGVvZiBkYXRhLmNyZWF0ZWRBdCA9PT0gJ3N0cmluZycgPyBuZXcgRGF0ZShkYXRhLmNyZWF0ZWRBdCkgOiBkYXRhLmNyZWF0ZWRBdDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZGF0YS51cGRhdGVkQXQpIHtcclxuICAgICAgICAgICAgICAgIG9iai51cGRhdGVkQXQgPSB0eXBlb2YgZGF0YS51cGRhdGVkQXQgPT09ICdzdHJpbmcnID8gbmV3IERhdGUoZGF0YS51cGRhdGVkQXQpIDogZGF0YS51cGRhdGVkQXQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGRhdGEuQUNMKSBvYmouQUNMID0gZGF0YS5BQ0w7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBwcm9jZXNzIGFsbCBvdGhlciBwcm9wZXJ0aWVzXHJcbiAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NlZERhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGF0YSkpIHtcclxuICAgICAgICAgICAgICAgIGlmICghWydfX3R5cGUnLCAnY2xhc3NOYW1lJywgJ29iamVjdElkJywgJ2NyZWF0ZWRBdCcsICd1cGRhdGVkQXQnLCAnQUNMJ10uaW5jbHVkZXMoa2V5KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZERhdGFba2V5XSA9IHRoaXMuY29udmVydEluY2x1ZGVkT2JqZWN0cyh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIG9iai5zZXQocHJvY2Vzc2VkRGF0YSk7XHJcbiAgICAgICAgICAgIHJldHVybiBvYmo7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgUGFyc2Ugb2JqZWN0IHdpdGggZXhwbGljaXQgdHlwZVxyXG4gICAgICAgIGlmIChkYXRhLl9fdHlwZSA9PT0gJ09iamVjdCcgJiYgZGF0YS5jbGFzc05hbWUgJiYgZGF0YS5vYmplY3RJZCkge1xyXG4gICAgICAgICAgICBjb25zdCBvYmogPSBuZXcgRm1vZGVPYmplY3QoZGF0YS5jbGFzc05hbWUpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gU2V0IGJhc2ljIHByb3BlcnRpZXNcclxuICAgICAgICAgICAgb2JqLmlkID0gZGF0YS5vYmplY3RJZDtcclxuICAgICAgICAgICAgaWYgKGRhdGEuY3JlYXRlZEF0KSBvYmouY3JlYXRlZEF0ID0gbmV3IERhdGUoZGF0YS5jcmVhdGVkQXQpO1xyXG4gICAgICAgICAgICBpZiAoZGF0YS51cGRhdGVkQXQpIG9iai51cGRhdGVkQXQgPSBuZXcgRGF0ZShkYXRhLnVwZGF0ZWRBdCk7XHJcbiAgICAgICAgICAgIGlmIChkYXRhLkFDTCkgb2JqLkFDTCA9IGRhdGEuQUNMO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gUmVjdXJzaXZlbHkgcHJvY2VzcyBhbGwgb3RoZXIgcHJvcGVydGllc1xyXG4gICAgICAgICAgICBjb25zdCBwcm9jZXNzZWREYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIVsnX190eXBlJywgJ2NsYXNzTmFtZScsICdvYmplY3RJZCcsICdjcmVhdGVkQXQnLCAndXBkYXRlZEF0JywgJ0FDTCddLmluY2x1ZGVzKGtleSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWREYXRhW2tleV0gPSB0aGlzLmNvbnZlcnRJbmNsdWRlZE9iamVjdHModmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBvYmouc2V0KHByb2Nlc3NlZERhdGEpO1xyXG4gICAgICAgICAgICByZXR1cm4gb2JqO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIFBvaW50ZXIgb2JqZWN0IHRoYXQgZ290IGV4cGFuZGVkXHJcbiAgICAgICAgaWYgKGRhdGEuX190eXBlID09PSAnUG9pbnRlcicgJiYgZGF0YS5jbGFzc05hbWUgJiYgZGF0YS5vYmplY3RJZCkge1xyXG4gICAgICAgICAgICAvLyBJZiBpdCdzIGp1c3QgYSBwb2ludGVyIChub3QgZXhwYW5kZWQpLCBsZWF2ZSBpdCBhcyBpc1xyXG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEZvciByZWd1bGFyIG9iamVjdHMsIHJlY3Vyc2l2ZWx5IHByb2Nlc3MgcHJvcGVydGllc1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xyXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEpKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdFtrZXldID0gdGhpcy5jb252ZXJ0SW5jbHVkZWRPYmplY3RzKHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBjbGFzc05hbWU6IHN0cmluZztcclxuICAgIHdoZXJlOiBRdWVyeUNvbmRpdGlvbnMgPSB7fTtcclxuICAgIF9pbmNsdWRlOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgX3NlbGVjdDogc3RyaW5nW10gPSBbXTtcclxuICAgIF9saW1pdD86IG51bWJlcjtcclxuICAgIF9za2lwPzogbnVtYmVyO1xyXG4gICAgX29yZGVyPzogc3RyaW5nW107XHJcbiAgICBfY291bnQgPSBmYWxzZTtcclxuICAgIF9rZXlzPzogc3RyaW5nO1xyXG4gICAgX3JlYWRQcmVmZXJlbmNlPzogc3RyaW5nO1xyXG4gICAgX2luY2x1ZGVSZWFkUHJlZmVyZW5jZT86IHN0cmluZztcclxuICAgIF9zdWJxdWVyeVJlYWRQcmVmZXJlbmNlPzogc3RyaW5nO1xyXG4gICAgX2V4cGxhaW4/OiBib29sZWFuO1xyXG4gICAgX2hpbnQ/OiBhbnk7XHJcbiAgICBfbWF4VGltZU1TPzogbnVtYmVyO1xyXG4gICAgX3RyYWNpbmc/OiBib29sZWFuO1xyXG4gICAgX2xvY2FsRGF0YXN0b3JlPzogYm9vbGVhbjtcclxuICAgIF9zZXNzaW9uVG9rZW4/OiBzdHJpbmc7XHJcbiAgICBfY29udGV4dD86IGFueTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihjbGFzc05hbWU6IHN0cmluZyB8IHsgbmV3KCk6IFQgfSkge1xyXG4gICAgICAgIHRoaXMuY2xhc3NOYW1lID0gdHlwZW9mIGNsYXNzTmFtZSA9PT0gJ3N0cmluZycgPyBjbGFzc05hbWUgOiBjbGFzc05hbWUucHJvdG90eXBlLmNvbnN0cnVjdG9yLm5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTUFSSzogLSDmnaHku7bmlrnms5VcclxuXHJcbiAgICBlcXVhbFRvKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogdGhpcyB7XHJcbiAgICAgICAgdmFsdWUgPSB0aGlzLmZpeFBvaW50ZXIodmFsdWUpXHJcblxyXG4gICAgICAgIHRoaXMud2hlcmVba2V5XSA9IHZhbHVlO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIGZpeFBvaW50ZXIodmFsdWUpe1xyXG4gICAgICAgIGlmKHZhbHVlPy5jbGFzc05hbWUgJiYgdmFsdWU/LmRhdGEpe1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgX190eXBlOlwiUG9pbnRlclwiLFxyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lOnZhbHVlPy5jbGFzc05hbWUsXHJcbiAgICAgICAgICAgICAgICBvYmplY3RJZDp2YWx1ZT8uZGF0YT8uaWQgfHwgdmFsdWU/LmlkXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlXHJcbiAgICB9XHJcbiAgICBub3RFcXVhbFRvKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogdGhpcyB7XHJcbiAgICAgICAgdmFsdWUgPSB0aGlzLmZpeFBvaW50ZXIodmFsdWUpXHJcbiAgICAgICAgdGhpcy53aGVyZVtrZXldID0geyAkbmU6IHZhbHVlIH07XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgbGVzc1RoYW4oa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB0aGlzIHtcclxuICAgICAgICB0aGlzLndoZXJlW2tleV0gPSB7ICRsdDogdmFsdWUgfTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBsZXNzVGhhbk9yRXF1YWxUbyhrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IHRoaXMge1xyXG4gICAgICAgIHRoaXMud2hlcmVba2V5XSA9IHsgJGx0ZTogdmFsdWUgfTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBncmVhdGVyVGhhbihrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IHRoaXMge1xyXG4gICAgICAgIHRoaXMud2hlcmVba2V5XSA9IHsgJGd0OiB2YWx1ZSB9O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIGdyZWF0ZXJUaGFuT3JFcXVhbFRvKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogdGhpcyB7XHJcbiAgICAgICAgdGhpcy53aGVyZVtrZXldID0geyAkZ3RlOiB2YWx1ZSB9O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnRhaW5lZEluKGtleTogc3RyaW5nLCB2YWx1ZXM6IGFueVtdKTogdGhpcyB7XHJcbiAgICAgICAgdGhpcy53aGVyZVtrZXldID0geyAkaW46IHZhbHVlcyB9O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIG5vdENvbnRhaW5lZEluKGtleTogc3RyaW5nLCB2YWx1ZXM6IGFueVtdKTogdGhpcyB7XHJcbiAgICAgICAgdGhpcy53aGVyZVtrZXldID0geyAkbmluOiB2YWx1ZXMgfTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBleGlzdHMoa2V5OiBzdHJpbmcpOiB0aGlzIHtcclxuICAgICAgICB0aGlzLndoZXJlW2tleV0gPSB7ICRleGlzdHM6IHRydWUgfTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBkb2VzTm90RXhpc3Qoa2V5OiBzdHJpbmcpOiB0aGlzIHtcclxuICAgICAgICB0aGlzLndoZXJlW2tleV0gPSB7ICRleGlzdHM6IGZhbHNlIH07XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgY29udGFpbnNBbGwoa2V5OiBzdHJpbmcsIHZhbHVlczogYW55W10pOiB0aGlzIHtcclxuICAgICAgICB0aGlzLndoZXJlW2tleV0gPSB7ICRhbGw6IHZhbHVlcyB9O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnRhaW5zKGtleTogc3RyaW5nLCBzdWJzdHJpbmc6IHN0cmluZyk6IHRoaXMge1xyXG4gICAgICAgIHRoaXMud2hlcmVba2V5XSA9IHsgJHJlZ2V4OiBzdWJzdHJpbmcsICRvcHRpb25zOiAnaScgfTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBzdGFydHNXaXRoKGtleTogc3RyaW5nLCBwcmVmaXg6IHN0cmluZyk6IHRoaXMge1xyXG4gICAgICAgIHRoaXMud2hlcmVba2V5XSA9IHsgJHJlZ2V4OiBgXiR7cHJlZml4fWAsICRvcHRpb25zOiAnaScgfTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBlbmRzV2l0aChrZXk6IHN0cmluZywgc3VmZml4OiBzdHJpbmcpOiB0aGlzIHtcclxuICAgICAgICB0aGlzLndoZXJlW2tleV0gPSB7ICRyZWdleDogYCR7c3VmZml4fSRgLCAkb3B0aW9uczogJ2knIH07XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgbWF0Y2hlcyhrZXk6IHN0cmluZywgcmVnZXg6IFJlZ0V4cCwgbW9kaWZpZXJzPzogc3RyaW5nKTogdGhpcyB7XHJcbiAgICAgICAgdGhpcy53aGVyZVtrZXldID0geyAkcmVnZXg6IHJlZ2V4LnNvdXJjZSwgJG9wdGlvbnM6IG1vZGlmaWVycyB9O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIG1hdGNoZXNRdWVyeShrZXk6IHN0cmluZywgcXVlcnk6IEZtb2RlUXVlcnkpOiB0aGlzIHtcclxuICAgICAgICB0aGlzLndoZXJlW2tleV0gPSB7ICRpblF1ZXJ5OiB7IGNsYXNzTmFtZTogcXVlcnkuY2xhc3NOYW1lLCB3aGVyZTogcXVlcnkud2hlcmUgfSB9O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIGRvZXNOb3RNYXRjaFF1ZXJ5KGtleTogc3RyaW5nLCBxdWVyeTogRm1vZGVRdWVyeSk6IHRoaXMge1xyXG4gICAgICAgIHRoaXMud2hlcmVba2V5XSA9IHsgJG5vdEluUXVlcnk6IHsgY2xhc3NOYW1lOiBxdWVyeS5jbGFzc05hbWUsIHdoZXJlOiBxdWVyeS53aGVyZSB9IH07XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgbWF0Y2hlc0tleUluUXVlcnkoa2V5OiBzdHJpbmcsIHF1ZXJ5S2V5OiBzdHJpbmcsIHF1ZXJ5OiBGbW9kZVF1ZXJ5KTogdGhpcyB7XHJcbiAgICAgICAgdGhpcy53aGVyZVtrZXldID0geyAkc2VsZWN0OiB7IGtleTogcXVlcnlLZXksIHF1ZXJ5OiB7IGNsYXNzTmFtZTogcXVlcnkuY2xhc3NOYW1lLCB3aGVyZTogcXVlcnkud2hlcmUgfSB9IH07XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgZG9lc05vdE1hdGNoS2V5SW5RdWVyeShrZXk6IHN0cmluZywgcXVlcnlLZXk6IHN0cmluZywgcXVlcnk6IEZtb2RlUXVlcnkpOiB0aGlzIHtcclxuICAgICAgICB0aGlzLndoZXJlW2tleV0gPSB7ICRkb250U2VsZWN0OiB7IGtleTogcXVlcnlLZXksIHF1ZXJ5OiB7IGNsYXNzTmFtZTogcXVlcnkuY2xhc3NOYW1lLCB3aGVyZTogcXVlcnkud2hlcmUgfSB9IH07XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgbmVhcihrZXk6IHN0cmluZywgcG9pbnQ6IHsgbGF0aXR1ZGU6IG51bWJlcjsgbG9uZ2l0dWRlOiBudW1iZXIgfSk6IHRoaXMge1xyXG4gICAgICAgIHRoaXMud2hlcmVba2V5XSA9IHsgJG5lYXJTcGhlcmU6IHBvaW50IH07XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgd2l0aGluUmFkaWFucyhrZXk6IHN0cmluZywgcG9pbnQ6IHsgbGF0aXR1ZGU6IG51bWJlcjsgbG9uZ2l0dWRlOiBudW1iZXIgfSwgZGlzdGFuY2U6IG51bWJlcik6IHRoaXMge1xyXG4gICAgICAgIHRoaXMud2hlcmVba2V5XSA9IHsgJG5lYXJTcGhlcmU6IHBvaW50LCAkbWF4RGlzdGFuY2U6IGRpc3RhbmNlIH07XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgd2l0aGluTWlsZXMoa2V5OiBzdHJpbmcsIHBvaW50OiB7IGxhdGl0dWRlOiBudW1iZXI7IGxvbmdpdHVkZTogbnVtYmVyIH0sIGRpc3RhbmNlOiBudW1iZXIpOiB0aGlzIHtcclxuICAgICAgICByZXR1cm4gdGhpcy53aXRoaW5SYWRpYW5zKGtleSwgcG9pbnQsIGRpc3RhbmNlIC8gMzk1OSk7XHJcbiAgICB9XHJcblxyXG4gICAgd2l0aGluS2lsb21ldGVycyhrZXk6IHN0cmluZywgcG9pbnQ6IHsgbGF0aXR1ZGU6IG51bWJlcjsgbG9uZ2l0dWRlOiBudW1iZXIgfSwgZGlzdGFuY2U6IG51bWJlcik6IHRoaXMge1xyXG4gICAgICAgIHJldHVybiB0aGlzLndpdGhpblJhZGlhbnMoa2V5LCBwb2ludCwgZGlzdGFuY2UgLyA2MzcxKTtcclxuICAgIH1cclxuXHJcbiAgICB3aXRoaW5HZW9Cb3goa2V5OiBzdHJpbmcsIHNvdXRod2VzdDogeyBsYXRpdHVkZTogbnVtYmVyOyBsb25naXR1ZGU6IG51bWJlciB9LCBub3J0aGVhc3Q6IHsgbGF0aXR1ZGU6IG51bWJlcjsgbG9uZ2l0dWRlOiBudW1iZXIgfSk6IHRoaXMge1xyXG4gICAgICAgIHRoaXMud2hlcmVba2V5XSA9IHsgJHdpdGhpbjogeyAkYm94OiBbc291dGh3ZXN0LCBub3J0aGVhc3RdIH0gfTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwb2x5Z29uQ29udGFpbnMoa2V5OiBzdHJpbmcsIHBvaW50czogQXJyYXk8eyBsYXRpdHVkZTogbnVtYmVyOyBsb25naXR1ZGU6IG51bWJlciB9Pik6IHRoaXMge1xyXG4gICAgICAgIHRoaXMud2hlcmVba2V5XSA9IHsgJGdlb1dpdGhpbjogeyAkcG9seWdvbjogcG9pbnRzIH0gfTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvLyBNQVJLOiAtIEFkZGl0aW9uYWwgUGFyc2UtY29tcGF0aWJsZSBxdWVyeSBtZXRob2RzXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNYXRjaGVzIGEga2V5IGZyb20gYSBsaXN0IG9mIHF1ZXJpZXNcclxuICAgICAqL1xyXG4gICAgY29udGFpbmVkQnkoa2V5OiBzdHJpbmcsIHZhbHVlczogYW55W10pOiB0aGlzIHtcclxuICAgICAgICB0aGlzLndoZXJlW2tleV0gPSB7ICRjb250YWluZWRCeTogdmFsdWVzIH07XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGdWxsIHRleHQgc2VhcmNoXHJcbiAgICAgKi9cclxuICAgIGZ1bGxUZXh0KGtleTogc3RyaW5nLCB0ZXh0OiBzdHJpbmcsIG9wdGlvbnM/OiB7IGNhc2VTZW5zaXRpdmU/OiBib29sZWFuOyBkaWFjcml0aWNTZW5zaXRpdmU/OiBib29sZWFuIH0pOiB0aGlzIHtcclxuICAgICAgICB0aGlzLndoZXJlW2tleV0gPSB7IFxyXG4gICAgICAgICAgICAkdGV4dDogeyBcclxuICAgICAgICAgICAgICAgICRzZWFyY2g6IHRleHQsXHJcbiAgICAgICAgICAgICAgICAkY2FzZVNlbnNpdGl2ZTogb3B0aW9ucz8uY2FzZVNlbnNpdGl2ZSxcclxuICAgICAgICAgICAgICAgICRkaWFjcml0aWNTZW5zaXRpdmU6IG9wdGlvbnM/LmRpYWNyaXRpY1NlbnNpdGl2ZVxyXG4gICAgICAgICAgICB9IFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNYXRjaGVzIG9iamVjdHMgd2l0aCBhcnJheSBmaWVsZCBjb250YWluaW5nIGFsbCBnaXZlbiBlbGVtZW50c1xyXG4gICAgICovXHJcbiAgICBjb250YWluc0FsbFN0YXJ0aW5nV2l0aChrZXk6IHN0cmluZywgdmFsdWVzOiBzdHJpbmdbXSk6IHRoaXMge1xyXG4gICAgICAgIHRoaXMud2hlcmVba2V5XSA9IHsgJGFsbDogdmFsdWVzLm1hcCh2YWwgPT4gKHsgJHJlZ2V4OiBgXiR7dmFsfWAgfSkpIH07XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNYXRjaGVzIG9iamVjdHMgd2hlcmUgdGhlIGFycmF5IGZpZWxkIGhhcyBhIHNwZWNpZmljIHNpemVcclxuICAgICAqL1xyXG4gICAgc2l6ZUVxdWFsVG8oa2V5OiBzdHJpbmcsIHNpemU6IG51bWJlcik6IHRoaXMge1xyXG4gICAgICAgIHRoaXMud2hlcmVba2V5XSA9IHsgJHNpemU6IHNpemUgfTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIC8vIEFkZCB0aGVzZSBtZXRob2RzIHRvIHRoZSBGbW9kZVF1ZXJ5IGNsYXNzXHJcblxyXG4vLyBNQVJLOiAtIFJlbGF0aW9uIE1ldGhvZHNcclxuXHJcbi8qKlxyXG4gKiBBZGRzIGEgcmVsYXRpb24gY29uc3RyYWludCB0byB0aGUgcXVlcnlcclxuICovXHJcbnJlbGF0ZWRUbyhwYXJlbnQ6IEZtb2RlT2JqZWN0LCBrZXk6IHN0cmluZyk6IHRoaXMge1xyXG4gICAgaWYgKCFwYXJlbnQuaWQpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcmVudCBvYmplY3QgbXVzdCBoYXZlIGFuIElEJyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLndoZXJlWyckcmVsYXRlZFRvJ10gPSB7XHJcbiAgICAgICAgb2JqZWN0OiBwYXJlbnQudG9Qb2ludGVyKCksXHJcbiAgICAgICAga2V5OiBrZXlcclxuICAgIH07XHJcbiAgICByZXR1cm4gdGhpcztcclxufVxyXG5cclxuLyoqXHJcbiAqIEFkZHMgYSByZWxhdGlvbiBjb25zdHJhaW50IGZvciBhIHNwZWNpZmljIG9iamVjdFxyXG4gKi9cclxucmVsYXRlZFRvT2JqZWN0KHBhcmVudDogRm1vZGVPYmplY3QsIHJlbGF0aW9uS2V5OiBzdHJpbmcpOiB0aGlzIHtcclxuICAgIGlmICghcGFyZW50LmlkKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXJlbnQgb2JqZWN0IG11c3QgaGF2ZSBhbiBJRCcpO1xyXG4gICAgfVxyXG4gICAgdGhpcy53aGVyZVsnJHJlbGF0ZWRUbyddID0ge1xyXG4gICAgICAgIG9iamVjdDogcGFyZW50LnRvUG9pbnRlcigpLFxyXG4gICAgICAgIGtleTogcmVsYXRpb25LZXlcclxuICAgIH07XHJcbiAgICByZXR1cm4gdGhpcztcclxufVxyXG5cclxuLyoqXHJcbiAqIEFkZHMgYSByZWxhdGlvbiBjb25zdHJhaW50IGZvciBhIHNwZWNpZmljIHF1ZXJ5XHJcbiAqL1xyXG5yZWxhdGVkVG9RdWVyeShwYXJlbnRDbGFzczogc3RyaW5nLCByZWxhdGlvbktleTogc3RyaW5nLCBxdWVyeTogRm1vZGVRdWVyeSk6IHRoaXMge1xyXG4gICAgdGhpcy53aGVyZVsnJHJlbGF0ZWRUbyddID0ge1xyXG4gICAgICAgIGtleTogcmVsYXRpb25LZXksXHJcbiAgICAgICAgcXVlcnk6IHtcclxuICAgICAgICAgICAgY2xhc3NOYW1lOiBwYXJlbnRDbGFzcyxcclxuICAgICAgICAgICAgd2hlcmU6IHF1ZXJ5LndoZXJlXHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHJldHVybiB0aGlzO1xyXG59XHJcblxyXG4vLyBNQVJLOiAtIFBvaW50ZXIgUXVlcnkgSGVscGVyc1xyXG5cclxuLyoqXHJcbiAqIE1hdGNoZXMgb2JqZWN0cyB0aGF0IGhhdmUgYSBwb2ludGVyIHRvIHRoZSBnaXZlbiBvYmplY3RcclxuICovXHJcbm1hdGNoZXNQb2ludGVyKGtleTogc3RyaW5nLCBvYmplY3Q6IEZtb2RlT2JqZWN0KTogdGhpcyB7XHJcbiAgICBpZiAoIW9iamVjdC5pZCkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignT2JqZWN0IG11c3QgaGF2ZSBhbiBJRCcpO1xyXG4gICAgfVxyXG4gICAgdGhpcy53aGVyZVtrZXldID0gb2JqZWN0LnRvUG9pbnRlcigpO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBNYXRjaGVzIG9iamVjdHMgdGhhdCBoYXZlIGEgcG9pbnRlciB0byBhbnkgb2YgdGhlIGdpdmVuIG9iamVjdHNcclxuICovXHJcbm1hdGNoZXNBbnlQb2ludGVyKGtleTogc3RyaW5nLCBvYmplY3RzOiBGbW9kZU9iamVjdFtdKTogdGhpcyB7XHJcbiAgICBjb25zdCBwb2ludGVycyA9IG9iamVjdHMubWFwKG9iaiA9PiB7XHJcbiAgICAgICAgaWYgKCFvYmouaWQpIHRocm93IG5ldyBFcnJvcignQWxsIG9iamVjdHMgbXVzdCBoYXZlIElEcycpO1xyXG4gICAgICAgIHJldHVybiBvYmoudG9Qb2ludGVyKCk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMud2hlcmVba2V5XSA9IHsgJyRpbic6IHBvaW50ZXJzIH07XHJcbiAgICByZXR1cm4gdGhpcztcclxufVxyXG5cclxuLy8gTUFSSzogLSBSZWxhdGlvbiBRdWVyeSBFeGVjdXRpb25cclxuXHJcbi8qKlxyXG4gKiBGaW5kcyBvYmplY3RzIGluIGEgcmVsYXRpb24gKGFsdGVybmF0aXZlIHRvIHVzaW5nIHJlbGF0ZWRUbylcclxuICovXHJcbnN0YXRpYyBhc3luYyBmaW5kUmVsYXRpb248VCBleHRlbmRzIEZtb2RlT2JqZWN0PihcclxuICAgIHBhcmVudDogRm1vZGVPYmplY3QsXHJcbiAgICByZWxhdGlvbktleTogc3RyaW5nLFxyXG4gICAgb3B0aW9ucz86IHsgdXNlTWFzdGVyS2V5PzogYm9vbGVhbiB9XHJcbik6IFByb21pc2U8VFtdPiB7XHJcbiAgICBpZiAoIXBhcmVudC5pZCkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUGFyZW50IG9iamVjdCBtdXN0IGhhdmUgYW4gSUQnKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgY29uc3QgcXVlcnkgPSBuZXcgRm1vZGVRdWVyeTxUPihwYXJlbnQuY2xhc3NOYW1lKVxyXG4gICAgICAgIC5yZWxhdGVkVG8ocGFyZW50LCByZWxhdGlvbktleSk7XHJcbiAgICBcclxuICAgIHJldHVybiBxdWVyeS5maW5kKG9wdGlvbnMpO1xyXG59XHJcblxyXG4vKipcclxuICogQ291bnRzIG9iamVjdHMgaW4gYSByZWxhdGlvblxyXG4gKi9cclxuc3RhdGljIGFzeW5jIGNvdW50UmVsYXRpb24oXHJcbiAgICBwYXJlbnQ6IEZtb2RlT2JqZWN0LFxyXG4gICAgcmVsYXRpb25LZXk6IHN0cmluZyxcclxuICAgIG9wdGlvbnM/OiB7IHVzZU1hc3RlcktleT86IGJvb2xlYW4gfVxyXG4pOiBQcm9taXNlPG51bWJlcj4ge1xyXG4gICAgaWYgKCFwYXJlbnQuaWQpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcmVudCBvYmplY3QgbXVzdCBoYXZlIGFuIElEJyk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IEZtb2RlUXVlcnkocGFyZW50LmNsYXNzTmFtZSlcclxuICAgICAgICAucmVsYXRlZFRvKHBhcmVudCwgcmVsYXRpb25LZXkpO1xyXG4gICAgXHJcbiAgICByZXR1cm4gcXVlcnkuY291bnQob3B0aW9ucyk7XHJcbn1cclxuXHJcbi8vIE1BUks6IC0gUmVsYXRpb24gTWFuYWdlbWVudFxyXG5cclxuLyoqXHJcbiAqIEFkZHMgb2JqZWN0cyB0byBhIHJlbGF0aW9uIChzdGF0aWMgaGVscGVyKVxyXG4gKi9cclxuc3RhdGljIGFzeW5jIGFkZFRvUmVsYXRpb248VCBleHRlbmRzIEZtb2RlT2JqZWN0PihcclxuICAgIHBhcmVudDogRm1vZGVPYmplY3QsXHJcbiAgICByZWxhdGlvbktleTogc3RyaW5nLFxyXG4gICAgb2JqZWN0czogVFtdLFxyXG4gICAgb3B0aW9ucz86IHsgdXNlTWFzdGVyS2V5PzogYm9vbGVhbiB9XHJcbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCFwYXJlbnQuaWQpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcmVudCBvYmplY3QgbXVzdCBoYXZlIGFuIElEJyk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGlmIChvYmplY3RzLnNvbWUob2JqID0+ICFvYmouaWQpKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBbGwgb2JqZWN0cyB0byBhZGQgbXVzdCBoYXZlIElEcycpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBjb25zdCBwb2ludGVycyA9IG9iamVjdHMubWFwKG9iaiA9PiBvYmoudG9Qb2ludGVyKCkpO1xyXG4gICAgXHJcbiAgICBjb25zdCB1cmwgPSBgJHtGbW9kZVF1ZXJ5Lmluc3RhbmNlLnNlcnZlclVSTH0vY2xhc3Nlcy8ke3BhcmVudC5jbGFzc05hbWV9LyR7cGFyZW50LmlkfWA7XHJcbiAgICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xyXG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICAgJ1gtUGFyc2UtQXBwbGljYXRpb24tSWQnOiBGbW9kZVF1ZXJ5Lmluc3RhbmNlLmFwcElkXHJcbiAgICB9O1xyXG5cclxuICAgIGlmIChvcHRpb25zPy51c2VNYXN0ZXJLZXkgJiYgRm1vZGVRdWVyeS5pbnN0YW5jZS5jb25maWcubWFzdGVyS2V5KSB7XHJcbiAgICAgICAgaGVhZGVyc1snWC1QYXJzZS1NYXN0ZXItS2V5J10gPSBGbW9kZVF1ZXJ5Lmluc3RhbmNlLmNvbmZpZy5tYXN0ZXJLZXk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIEFkZCBzZXNzaW9uIHRva2VuIGlmIGF2YWlsYWJsZSBhbmQgbm90IHVzaW5nIG1hc3RlciBrZXlcclxuICAgICAgICBjb25zdCBzZXNzaW9uVG9rZW4gPSBGbW9kZVF1ZXJ5Lmluc3RhbmNlLnNlc3Npb25Ub2tlbjtcclxuICAgICAgICBpZiAoc2Vzc2lvblRva2VuKSB7XHJcbiAgICAgICAgICAgIGhlYWRlcnNbJ1gtUGFyc2UtU2Vzc2lvbi1Ub2tlbiddID0gc2Vzc2lvblRva2VuO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xyXG4gICAgICAgIG1ldGhvZDogJ1BVVCcsXHJcbiAgICAgICAgaGVhZGVycyxcclxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgICAgICAgIFtyZWxhdGlvbktleV06IHtcclxuICAgICAgICAgICAgICAgICdfX29wJzogJ0FkZFJlbGF0aW9uJyxcclxuICAgICAgICAgICAgICAgICdvYmplY3RzJzogcG9pbnRlcnNcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihyZXN1bHQuZXJyb3IgfHwgJ0ZhaWxlZCB0byBhZGQgdG8gcmVsYXRpb24nKTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFJlbW92ZXMgb2JqZWN0cyBmcm9tIGEgcmVsYXRpb24gKHN0YXRpYyBoZWxwZXIpXHJcbiAqL1xyXG5zdGF0aWMgYXN5bmMgcmVtb3ZlRnJvbVJlbGF0aW9uPFQgZXh0ZW5kcyBGbW9kZU9iamVjdD4oXHJcbiAgICBwYXJlbnQ6IEZtb2RlT2JqZWN0LFxyXG4gICAgcmVsYXRpb25LZXk6IHN0cmluZyxcclxuICAgIG9iamVjdHM6IFRbXSxcclxuICAgIG9wdGlvbnM/OiB7IHVzZU1hc3RlcktleT86IGJvb2xlYW4gfVxyXG4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghcGFyZW50LmlkKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXJlbnQgb2JqZWN0IG11c3QgaGF2ZSBhbiBJRCcpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBpZiAob2JqZWN0cy5zb21lKG9iaiA9PiAhb2JqLmlkKSkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQWxsIG9iamVjdHMgdG8gcmVtb3ZlIG11c3QgaGF2ZSBJRHMnKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgY29uc3QgcG9pbnRlcnMgPSBvYmplY3RzLm1hcChvYmogPT4gb2JqLnRvUG9pbnRlcigpKTtcclxuICAgIFxyXG4gICAgY29uc3QgdXJsID0gYCR7Rm1vZGVRdWVyeS5pbnN0YW5jZS5zZXJ2ZXJVUkx9L2NsYXNzZXMvJHtwYXJlbnQuY2xhc3NOYW1lfS8ke3BhcmVudC5pZH1gO1xyXG4gICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcclxuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAgICdYLVBhcnNlLUFwcGxpY2F0aW9uLUlkJzogRm1vZGVRdWVyeS5pbnN0YW5jZS5hcHBJZFxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAob3B0aW9ucz8udXNlTWFzdGVyS2V5ICYmIEZtb2RlUXVlcnkuaW5zdGFuY2UuY29uZmlnLm1hc3RlcktleSkge1xyXG4gICAgICAgIGhlYWRlcnNbJ1gtUGFyc2UtTWFzdGVyLUtleSddID0gRm1vZGVRdWVyeS5pbnN0YW5jZS5jb25maWcubWFzdGVyS2V5O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBBZGQgc2Vzc2lvbiB0b2tlbiBpZiBhdmFpbGFibGUgYW5kIG5vdCB1c2luZyBtYXN0ZXIga2V5XHJcbiAgICAgICAgY29uc3Qgc2Vzc2lvblRva2VuID0gRm1vZGVRdWVyeS5pbnN0YW5jZS5zZXNzaW9uVG9rZW47XHJcbiAgICAgICAgaWYgKHNlc3Npb25Ub2tlbikge1xyXG4gICAgICAgICAgICBoZWFkZXJzWydYLVBhcnNlLVNlc3Npb24tVG9rZW4nXSA9IHNlc3Npb25Ub2tlbjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcclxuICAgICAgICBtZXRob2Q6ICdQVVQnLFxyXG4gICAgICAgIGhlYWRlcnMsXHJcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICAgICAgICBbcmVsYXRpb25LZXldOiB7XHJcbiAgICAgICAgICAgICAgICAnX19vcCc6ICdSZW1vdmVSZWxhdGlvbicsXHJcbiAgICAgICAgICAgICAgICAnb2JqZWN0cyc6IHBvaW50ZXJzXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocmVzdWx0LmVycm9yIHx8ICdGYWlsZWQgdG8gcmVtb3ZlIGZyb20gcmVsYXRpb24nKTtcclxuICAgIH1cclxufVxyXG5cclxuICAgIC8vIE1BUks6IC0g5p+l6K+i6YCJ6aG5XHJcblxyXG4gICAgaW5jbHVkZSguLi5rZXlzOiBzdHJpbmdbXSk6IHRoaXMge1xyXG4gICAgICAgIGxldCBrZXlNYXAgPSB7fVxyXG4gICAgICAgIHRoaXMuX2luY2x1ZGUuY29uY2F0KGtleXMpLmZvckVhY2goaXRlbT0+e1xyXG4gICAgICAgICAgICBrZXlNYXBbaXRlbV0gPSB0cnVlXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLl9pbmNsdWRlID0gT2JqZWN0LmtleXMoa2V5TWFwKVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdCguLi5rZXlzOiBzdHJpbmdbXSk6IHRoaXMge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdCA9IGtleXM7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgbGltaXQoY291bnQ6IG51bWJlcik6IHRoaXMge1xyXG4gICAgICAgIHRoaXMuX2xpbWl0ID0gY291bnQ7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgc2tpcChjb3VudDogbnVtYmVyKTogdGhpcyB7XHJcbiAgICAgICAgdGhpcy5fc2tpcCA9IGNvdW50O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIGFzY2VuZGluZyguLi5rZXlzOiBzdHJpbmdbXSk6IHRoaXMge1xyXG4gICAgICAgIHRoaXMuX29yZGVyID0ga2V5cy5tYXAoa2V5ID0+IGtleS5zdGFydHNXaXRoKCctJykgPyBrZXkuc3Vic3RyaW5nKDEpIDoga2V5KTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBkZXNjZW5kaW5nKC4uLmtleXM6IHN0cmluZ1tdKTogdGhpcyB7XHJcbiAgICAgICAgdGhpcy5fb3JkZXIgPSBrZXlzLm1hcChrZXkgPT4ga2V5LnN0YXJ0c1dpdGgoJy0nKSA/IGtleS5zdWJzdHJpbmcoMSkgOiBgLSR7a2V5fWApO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZEFzY2VuZGluZyguLi5rZXlzOiBzdHJpbmdbXSk6IHRoaXMge1xyXG4gICAgICAgIGlmICghdGhpcy5fb3JkZXIpIHRoaXMuX29yZGVyID0gW107XHJcbiAgICAgICAgdGhpcy5fb3JkZXIucHVzaCguLi5rZXlzKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBhZGREZXNjZW5kaW5nKC4uLmtleXM6IHN0cmluZ1tdKTogdGhpcyB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9vcmRlcikgdGhpcy5fb3JkZXIgPSBbXTtcclxuICAgICAgICB0aGlzLl9vcmRlci5wdXNoKC4uLmtleXMubWFwKGtleSA9PiBgLSR7a2V5fWApKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICByZWFkUHJlZmVyZW5jZShwcmVmOiBzdHJpbmcpOiB0aGlzIHtcclxuICAgICAgICB0aGlzLl9yZWFkUHJlZmVyZW5jZSA9IHByZWY7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgaW5jbHVkZVJlYWRQcmVmZXJlbmNlKHByZWY6IHN0cmluZyk6IHRoaXMge1xyXG4gICAgICAgIHRoaXMuX2luY2x1ZGVSZWFkUHJlZmVyZW5jZSA9IHByZWY7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgc3VicXVlcnlSZWFkUHJlZmVyZW5jZShwcmVmOiBzdHJpbmcpOiB0aGlzIHtcclxuICAgICAgICB0aGlzLl9zdWJxdWVyeVJlYWRQcmVmZXJlbmNlID0gcHJlZjtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBoaW50KGhpbnQ6IGFueSk6IHRoaXMge1xyXG4gICAgICAgIHRoaXMuaGludCA9IGhpbnQ7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgbWF4VGltZU1TKG1zOiBudW1iZXIpOiB0aGlzIHtcclxuICAgICAgICB0aGlzLl9tYXhUaW1lTVMgPSBtcztcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBleHBsYWluKGV4cGxhaW4gPSB0cnVlKTogdGhpcyB7XHJcbiAgICAgICAgdGhpcy5fZXhwbGFpbiA9IGV4cGxhaW47XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgd2l0aENvdW50KHdpdGhDb3VudCA9IHRydWUpOiB0aGlzIHtcclxuICAgICAgICB0aGlzLl9jb3VudCA9IHdpdGhDb3VudDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8gTUFSSzogLSDmn6Xor6LmiafooYxcclxuXHJcbiAgICBhc3luYyBmaW5kKG9wdGlvbnM/OiB7IHVzZU1hc3RlcktleT86IGJvb2xlYW4gfSk6IFByb21pc2U8VFtdPiB7XHJcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChgJHtGbW9kZVF1ZXJ5Lmluc3RhbmNlLnNlcnZlclVSTH0vY2xhc3Nlcy8ke3RoaXMuY2xhc3NOYW1lfWApO1xyXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuX2J1aWxkUXVlcnlQYXJhbXMoKTtcclxuICAgICAgICBcclxuICAgICAgICBPYmplY3QuZW50cmllcyhwYXJhbXMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoa2V5LCB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XHJcbiAgICAgICAgICAgICdYLVBhcnNlLUFwcGxpY2F0aW9uLUlkJzogRm1vZGVRdWVyeS5pbnN0YW5jZS5hcHBJZFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmIChvcHRpb25zPy51c2VNYXN0ZXJLZXkgJiYgRm1vZGVRdWVyeS5pbnN0YW5jZS5jb25maWcubWFzdGVyS2V5KSB7XHJcbiAgICAgICAgICAgIGhlYWRlcnNbJ1gtUGFyc2UtTWFzdGVyLUtleSddID0gRm1vZGVRdWVyeS5pbnN0YW5jZS5jb25maWcubWFzdGVyS2V5O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIEFkZCBzZXNzaW9uIHRva2VuIGlmIGF2YWlsYWJsZSBhbmQgbm90IHVzaW5nIG1hc3RlciBrZXlcclxuICAgICAgICAgICAgY29uc3Qgc2Vzc2lvblRva2VuID0gdGhpcy5fc2Vzc2lvblRva2VuIHx8IEZtb2RlUXVlcnkuaW5zdGFuY2Uuc2Vzc2lvblRva2VuO1xyXG4gICAgICAgICAgICBpZiAoc2Vzc2lvblRva2VuKSB7XHJcbiAgICAgICAgICAgICAgICBoZWFkZXJzWydYLVBhcnNlLVNlc3Npb24tVG9rZW4nXSA9IHNlc3Npb25Ub2tlbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwudG9TdHJpbmcoKSwgeyBoZWFkZXJzIH0pO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcclxuICAgICAgICBjb25zb2xlLmVycm9yKHJlc3BvbnNlKVxyXG4gICAgICAgIGlmIChyZXN1bHQuZXJyb3IpIHRocm93IG5ldyBFcnJvcihyZXN1bHQuZXJyb3IpO1xyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0LnJlc3VsdHMubWFwKChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgb2JqID0gbmV3IEZtb2RlT2JqZWN0KHRoaXMuY2xhc3NOYW1lKSBhcyBUO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gU2V0IGJhc2ljIHByb3BlcnRpZXMgZmlyc3RcclxuICAgICAgICAgICAgb2JqLmlkID0gZGF0YS5vYmplY3RJZDtcclxuICAgICAgICAgICAgaWYgKGRhdGEuY3JlYXRlZEF0KSBvYmouY3JlYXRlZEF0ID0gbmV3IERhdGUoZGF0YS5jcmVhdGVkQXQpO1xyXG4gICAgICAgICAgICBpZiAoZGF0YS51cGRhdGVkQXQpIG9iai51cGRhdGVkQXQgPSBuZXcgRGF0ZShkYXRhLnVwZGF0ZWRBdCB8fCBkYXRhLmNyZWF0ZWRBdCk7XHJcbiAgICAgICAgICAgIGlmIChkYXRhLkFDTCkgb2JqLkFDTCA9IGRhdGEuQUNMO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gUHJvY2VzcyBlYWNoIGZpZWxkIGluZGl2aWR1YWxseSB0byBjb252ZXJ0IGluY2x1ZGVkIG9iamVjdHNcclxuICAgICAgICAgICAgY29uc3QgcHJvY2Vzc2VkRGF0YTogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkYXRhKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFbJ19fdHlwZScsICdjbGFzc05hbWUnLCAnb2JqZWN0SWQnLCAnY3JlYXRlZEF0JywgJ3VwZGF0ZWRBdCcsICdBQ0wnXS5pbmNsdWRlcyhrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgaW5jbHVkZWQgb2JqZWN0cyAtIGNoZWNrIGlmIGl0J3MgbGlrZWx5IGEgUGFyc2Ugb2JqZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2luY2x1ZGUuaW5jbHVkZXMoa2V5KSAmJiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICh2YWx1ZSBhcyBhbnkpLm9iamVjdElkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYW4gaW5jbHVkZWQgUGFyc2Ugb2JqZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZERhdGFba2V5XSA9IEZtb2RlUXVlcnkuY29udmVydEluY2x1ZGVkT2JqZWN0cyh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVndWxhciBmaWVsZCBvciBhcnJheVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWREYXRhW2tleV0gPSBGbW9kZVF1ZXJ5LmNvbnZlcnRJbmNsdWRlZE9iamVjdHModmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgb2JqLnNldChwcm9jZXNzZWREYXRhKTtcclxuICAgICAgICAgICAgcmV0dXJuIG9iajtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBmaXJzdChvcHRpb25zPzogeyB1c2VNYXN0ZXJLZXk/OiBib29sZWFuIH0pOiBQcm9taXNlPFQgfCBudWxsPiB7XHJcbiAgICAgICAgdGhpcy5saW1pdCgxKTtcclxuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5maW5kKG9wdGlvbnMpO1xyXG4gICAgICAgIHJldHVybiByZXN1bHRzWzBdIHx8IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZ2V0KG9iamVjdElkOiBzdHJpbmcsIG9wdGlvbnM/OiB7IHVzZU1hc3RlcktleT86IGJvb2xlYW4gfSk6IFByb21pc2U8VD4ge1xyXG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoYCR7Rm1vZGVRdWVyeS5pbnN0YW5jZS5zZXJ2ZXJVUkx9L2NsYXNzZXMvJHt0aGlzLmNsYXNzTmFtZX0vJHtvYmplY3RJZH1gKTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAodGhpcy5pbmNsdWRlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ2luY2x1ZGUnLCB0aGlzLl9pbmNsdWRlLmpvaW4oJywnKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xyXG4gICAgICAgICAgICAnWC1QYXJzZS1BcHBsaWNhdGlvbi1JZCc6IEZtb2RlUXVlcnkuaW5zdGFuY2UuYXBwSWRcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAob3B0aW9ucz8udXNlTWFzdGVyS2V5ICYmIEZtb2RlUXVlcnkuaW5zdGFuY2UuY29uZmlnLm1hc3RlcktleSkge1xyXG4gICAgICAgICAgICBoZWFkZXJzWydYLVBhcnNlLU1hc3Rlci1LZXknXSA9IEZtb2RlUXVlcnkuaW5zdGFuY2UuY29uZmlnLm1hc3RlcktleTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBBZGQgc2Vzc2lvbiB0b2tlbiBpZiBhdmFpbGFibGUgYW5kIG5vdCB1c2luZyBtYXN0ZXIga2V5XHJcbiAgICAgICAgICAgIGNvbnN0IHNlc3Npb25Ub2tlbiA9IHRoaXMuX3Nlc3Npb25Ub2tlbiB8fCBGbW9kZVF1ZXJ5Lmluc3RhbmNlLnNlc3Npb25Ub2tlbjtcclxuICAgICAgICAgICAgaWYgKHNlc3Npb25Ub2tlbikge1xyXG4gICAgICAgICAgICAgICAgaGVhZGVyc1snWC1QYXJzZS1TZXNzaW9uLVRva2VuJ10gPSBzZXNzaW9uVG9rZW47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLnRvU3RyaW5nKCksIHsgaGVhZGVycyB9KTtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XHJcbiAgICAgICAgY29uc29sZS5sb2codXJsLHJlc3VsdClcclxuICAgICAgICBpZiAocmVzdWx0LmVycm9yKSB0aHJvdyBuZXcgRXJyb3IocmVzdWx0LmVycm9yKTtcclxuXHJcbiAgICAgICAgY29uc3Qgb2JqID0gbmV3IEZtb2RlT2JqZWN0KHRoaXMuY2xhc3NOYW1lKSBhcyBUO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIFByb2Nlc3MgdGhlIGRhdGEgdG8gY29udmVydCBpbmNsdWRlZCBvYmplY3RzXHJcbiAgICAgICAgY29uc3QgcHJvY2Vzc2VkRGF0YSA9IEZtb2RlUXVlcnkuY29udmVydEluY2x1ZGVkT2JqZWN0cyhyZXN1bHQpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIFNldCBiYXNpYyBwcm9wZXJ0aWVzXHJcbiAgICAgICAgb2JqLmlkID0gcmVzdWx0Lm9iamVjdElkO1xyXG4gICAgICAgIGlmIChwcm9jZXNzZWREYXRhLmNyZWF0ZWRBdCkgb2JqLmNyZWF0ZWRBdCA9IG5ldyBEYXRlKHByb2Nlc3NlZERhdGEuY3JlYXRlZEF0KTtcclxuICAgICAgICBpZiAocHJvY2Vzc2VkRGF0YS51cGRhdGVkQXQpIG9iai51cGRhdGVkQXQgPSBuZXcgRGF0ZShwcm9jZXNzZWREYXRhLnVwZGF0ZWRBdCB8fCBwcm9jZXNzZWREYXRhLmNyZWF0ZWRBdCk7XHJcbiAgICAgICAgaWYgKHByb2Nlc3NlZERhdGEuQUNMKSBvYmouQUNMID0gcHJvY2Vzc2VkRGF0YS5BQ0w7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gU2V0IGFsbCBvdGhlciBwcm9jZXNzZWQgZGF0YSAoaW5jbHVkaW5nIGNvbnZlcnRlZCBpbmNsdWRlZCBvYmplY3RzKVxyXG4gICAgICAgIGNvbnN0IGNsZWFuRGF0YTogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xyXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHByb2Nlc3NlZERhdGEpKSB7XHJcbiAgICAgICAgICAgIGlmICghWydfX3R5cGUnLCAnY2xhc3NOYW1lJywgJ29iamVjdElkJywgJ2NyZWF0ZWRBdCcsICd1cGRhdGVkQXQnLCAnQUNMJ10uaW5jbHVkZXMoa2V5KSkge1xyXG4gICAgICAgICAgICAgICAgY2xlYW5EYXRhW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBvYmouc2V0KGNsZWFuRGF0YSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIG9iajtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBjb3VudChvcHRpb25zPzogeyB1c2VNYXN0ZXJLZXk/OiBib29sZWFuIH0pOiBQcm9taXNlPG51bWJlcj4ge1xyXG4gICAgICAgIHRoaXMud2l0aENvdW50KCk7XHJcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChgJHtGbW9kZVF1ZXJ5Lmluc3RhbmNlLnNlcnZlclVSTH0vY2xhc3Nlcy8ke3RoaXMuY2xhc3NOYW1lfWApO1xyXG4gICAgICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KCdjb3VudCcsICcxJyk7XHJcbiAgICAgICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ2xpbWl0JywgJzAnKTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy53aGVyZSkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgnd2hlcmUnLCBKU09OLnN0cmluZ2lmeSh0aGlzLndoZXJlKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xyXG4gICAgICAgICAgICAnWC1QYXJzZS1BcHBsaWNhdGlvbi1JZCc6IEZtb2RlUXVlcnkuaW5zdGFuY2UuYXBwSWRcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAob3B0aW9ucz8udXNlTWFzdGVyS2V5ICYmIEZtb2RlUXVlcnkuaW5zdGFuY2UuY29uZmlnLm1hc3RlcktleSkge1xyXG4gICAgICAgICAgICBoZWFkZXJzWydYLVBhcnNlLU1hc3Rlci1LZXknXSA9IEZtb2RlUXVlcnkuaW5zdGFuY2UuY29uZmlnLm1hc3RlcktleTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBBZGQgc2Vzc2lvbiB0b2tlbiBpZiBhdmFpbGFibGUgYW5kIG5vdCB1c2luZyBtYXN0ZXIga2V5XHJcbiAgICAgICAgICAgIGNvbnN0IHNlc3Npb25Ub2tlbiA9IHRoaXMuX3Nlc3Npb25Ub2tlbiB8fCBGbW9kZVF1ZXJ5Lmluc3RhbmNlLnNlc3Npb25Ub2tlbjtcclxuICAgICAgICAgICAgaWYgKHNlc3Npb25Ub2tlbikge1xyXG4gICAgICAgICAgICAgICAgaGVhZGVyc1snWC1QYXJzZS1TZXNzaW9uLVRva2VuJ10gPSBzZXNzaW9uVG9rZW47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLnRvU3RyaW5nKCksIHsgaGVhZGVycyB9KTtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XHJcblxyXG4gICAgICAgIGlmIChyZXN1bHQuZXJyb3IpIHRocm93IG5ldyBFcnJvcihyZXN1bHQuZXJyb3IpO1xyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0LmNvdW50IHx8IDA7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTUFSSzogLSBKU09OIOW6j+WIl+WMluaWueazlVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udmVydHMgdGhlIHF1ZXJ5IHRvIEpTT04gZm9ybWF0IGNvbXBhdGlibGUgd2l0aCBQYXJzZSBSRVNUIEFQSVxyXG4gICAgICovXHJcbiAgICB0b0pTT04oKTogUmVjb3JkPHN0cmluZywgYW55PiB7XHJcbiAgICAgICAgY29uc3QganNvbjogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcclxuICAgICAgICAgICAgY2xhc3NOYW1lOiB0aGlzLmNsYXNzTmFtZVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLndoZXJlKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGpzb24ud2hlcmUgPSB0aGlzLndoZXJlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2luY2x1ZGUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBqc29uLmluY2x1ZGUgPSB0aGlzLl9pbmNsdWRlLmpvaW4oJywnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9zZWxlY3QubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBqc29uLmtleXMgPSB0aGlzLl9zZWxlY3Quam9pbignLCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2xpbWl0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAganNvbi5saW1pdCA9IHRoaXMuX2xpbWl0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3NraXAgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBqc29uLnNraXAgPSB0aGlzLl9za2lwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX29yZGVyICYmIHRoaXMuX29yZGVyLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAganNvbi5vcmRlciA9IHRoaXMuX29yZGVyLmpvaW4oJywnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9jb3VudCkge1xyXG4gICAgICAgICAgICBqc29uLmNvdW50ID0gMTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9leHBsYWluKSB7XHJcbiAgICAgICAgICAgIGpzb24uZXhwbGFpbiA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5faGludCkge1xyXG4gICAgICAgICAgICBqc29uLmhpbnQgPSB0aGlzLl9oaW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX21heFRpbWVNUykge1xyXG4gICAgICAgICAgICBqc29uLm1heFRpbWVNUyA9IHRoaXMuX21heFRpbWVNUztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9yZWFkUHJlZmVyZW5jZSkge1xyXG4gICAgICAgICAgICBqc29uLnJlYWRQcmVmZXJlbmNlID0gdGhpcy5fcmVhZFByZWZlcmVuY2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5faW5jbHVkZVJlYWRQcmVmZXJlbmNlKSB7XHJcbiAgICAgICAgICAgIGpzb24uaW5jbHVkZVJlYWRQcmVmZXJlbmNlID0gdGhpcy5faW5jbHVkZVJlYWRQcmVmZXJlbmNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3N1YnF1ZXJ5UmVhZFByZWZlcmVuY2UpIHtcclxuICAgICAgICAgICAganNvbi5zdWJxdWVyeVJlYWRQcmVmZXJlbmNlID0gdGhpcy5fc3VicXVlcnlSZWFkUHJlZmVyZW5jZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBqc29uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIHF1ZXJ5IGZyb20gSlNPTiBkYXRhXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBmcm9tSlNPTjxUIGV4dGVuZHMgRm1vZGVPYmplY3Q+KGNsYXNzTmFtZTpzdHJpbmcsanNvbjogUmVjb3JkPHN0cmluZywgYW55Pik6IEZtb2RlUXVlcnk8VD4ge1xyXG4gICAgICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZSB8fCBqc29uPy5jbGFzc05hbWVcclxuICAgICAgICBjb25zdCBxdWVyeSA9IG5ldyBGbW9kZVF1ZXJ5PFQ+KGNsYXNzTmFtZSk7XHJcblxyXG4gICAgICAgIGlmIChqc29uLndoZXJlKSB7XHJcbiAgICAgICAgICAgIHF1ZXJ5LndoZXJlID0ganNvbi53aGVyZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChqc29uLmluY2x1ZGUpIHtcclxuICAgICAgICAgICAgY29uc3QgaW5jbHVkZXMgPSB0eXBlb2YganNvbi5pbmNsdWRlID09PSAnc3RyaW5nJyBcclxuICAgICAgICAgICAgICAgID8ganNvbi5pbmNsdWRlLnNwbGl0KCcsJykgXHJcbiAgICAgICAgICAgICAgICA6IGpzb24uaW5jbHVkZTtcclxuICAgICAgICAgICAgcXVlcnkuX2luY2x1ZGUgPSBpbmNsdWRlcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChqc29uLmtleXMpIHtcclxuICAgICAgICAgICAgY29uc3Qga2V5cyA9IHR5cGVvZiBqc29uLmtleXMgPT09ICdzdHJpbmcnIFxyXG4gICAgICAgICAgICAgICAgPyBqc29uLmtleXMuc3BsaXQoJywnKSBcclxuICAgICAgICAgICAgICAgIDoganNvbi5rZXlzO1xyXG4gICAgICAgICAgICBxdWVyeS5fc2VsZWN0ID0ga2V5cztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChqc29uLmxpbWl0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcXVlcnkuX2xpbWl0ID0ganNvbi5saW1pdDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChqc29uLnNraXAgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBxdWVyeS5fc2tpcCA9IGpzb24uc2tpcDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChqc29uLm9yZGVyKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG9yZGVycyA9IHR5cGVvZiBqc29uLm9yZGVyID09PSAnc3RyaW5nJyBcclxuICAgICAgICAgICAgICAgID8ganNvbi5vcmRlci5zcGxpdCgnLCcpIFxyXG4gICAgICAgICAgICAgICAgOiBqc29uLm9yZGVyO1xyXG4gICAgICAgICAgICBxdWVyeS5fb3JkZXIgPSBvcmRlcnM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoanNvbi5jb3VudCkge1xyXG4gICAgICAgICAgICBxdWVyeS5fY291bnQgPSAhIWpzb24uY291bnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoanNvbi5leHBsYWluKSB7XHJcbiAgICAgICAgICAgIHF1ZXJ5Ll9leHBsYWluID0gISFqc29uLmV4cGxhaW47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoanNvbi5oaW50KSB7XHJcbiAgICAgICAgICAgIHF1ZXJ5Ll9oaW50ID0ganNvbi5oaW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGpzb24ubWF4VGltZU1TKSB7XHJcbiAgICAgICAgICAgIHF1ZXJ5Ll9tYXhUaW1lTVMgPSBqc29uLm1heFRpbWVNUztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChqc29uLnJlYWRQcmVmZXJlbmNlKSB7XHJcbiAgICAgICAgICAgIHF1ZXJ5Ll9yZWFkUHJlZmVyZW5jZSA9IGpzb24ucmVhZFByZWZlcmVuY2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoanNvbi5pbmNsdWRlUmVhZFByZWZlcmVuY2UpIHtcclxuICAgICAgICAgICAgcXVlcnkuX2luY2x1ZGVSZWFkUHJlZmVyZW5jZSA9IGpzb24uaW5jbHVkZVJlYWRQcmVmZXJlbmNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGpzb24uc3VicXVlcnlSZWFkUHJlZmVyZW5jZSkge1xyXG4gICAgICAgICAgICBxdWVyeS5fc3VicXVlcnlSZWFkUHJlZmVyZW5jZSA9IGpzb24uc3VicXVlcnlSZWFkUHJlZmVyZW5jZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBxdWVyeTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBNQVJLOiAtIOi+heWKqeaWueazlVxyXG5cclxuICAgIHByaXZhdGUgX2J1aWxkUXVlcnlQYXJhbXMoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XHJcbiAgICAgICAgY29uc3QgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJ3aGVyZVwiLHRoaXMud2hlcmUpXHJcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMud2hlcmUpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcGFyYW1zLndoZXJlID0gdGhpcy53aGVyZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHRoaXMuX2luY2x1ZGUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBwYXJhbXMuaW5jbHVkZSA9IHRoaXMuX2luY2x1ZGUuam9pbignLCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBpZiAodGhpcy5fc2VsZWN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcGFyYW1zLmtleXMgPSB0aGlzLl9zZWxlY3Quam9pbignLCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBpZiAodGhpcy5fbGltaXQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBwYXJhbXMubGltaXQgPSB0aGlzLl9saW1pdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHRoaXMuX3NraXAgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBwYXJhbXMuc2tpcCA9IHRoaXMuX3NraXA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICh0aGlzLl9vcmRlcikge1xyXG4gICAgICAgICAgICBwYXJhbXMub3JkZXIgPSB0aGlzLl9vcmRlci5qb2luKCcsJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICh0aGlzLl9jb3VudCkge1xyXG4gICAgICAgICAgICBwYXJhbXMuY291bnQgPSAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBpZiAodGhpcy5fZXhwbGFpbikge1xyXG4gICAgICAgICAgICBwYXJhbXMuZXhwbGFpbiA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICh0aGlzLl9oaW50KSB7XHJcbiAgICAgICAgICAgIHBhcmFtcy5oaW50ID0gdGhpcy5faGludDtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHRoaXMuX21heFRpbWVNUykge1xyXG4gICAgICAgICAgICBwYXJhbXMubWF4VGltZU1TID0gdGhpcy5fbWF4VGltZU1TO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHBhcmFtcztcclxuICAgIH1cclxuXHJcbiAgICAvLyBNQVJLOiAtIOiuoumYhS/lrp7ml7bmn6Xor6IgKOeugOWMlueJiClcclxuXHJcbiAgICBzdWJzY3JpYmUoKTogRXZlbnRUYXJnZXQge1xyXG4gICAgICAgIC8vIOeugOWMlueahOWunuaXtuafpeivouWunueOsFxyXG4gICAgICAgIGNvbnN0IGV2ZW50VGFyZ2V0ID0gbmV3IEV2ZW50VGFyZ2V0KCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8g5a6e6ZmF5a6e546w5bqU6K+l5L2/55SoIFdlYlNvY2tldCDmiJblhbbku5blrp7ml7bpgJrkv6HmlrnlvI9cclxuICAgICAgICBjb25zdCBjaGVja0ZvclVwZGF0ZXMgPSBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5maW5kKCk7XHJcbiAgICAgICAgICAgICAgICBldmVudFRhcmdldC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgndXBkYXRlJywgeyBkZXRhaWw6IHJlc3VsdHMgfSkpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgZXZlbnRUYXJnZXQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2Vycm9yJywgeyBkZXRhaWw6IGVycm9yIH0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgaW50ZXJ2YWxJZCA9IHNldEludGVydmFsKGNoZWNrRm9yVXBkYXRlcywgNTAwMCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8g5re75Yqg5Y+W5raI6K6i6ZiF5pa55rOVXHJcbiAgICAgICAgKGV2ZW50VGFyZ2V0IGFzIGFueSkudW5zdWJzY3JpYmUgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gZXZlbnRUYXJnZXQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g6Z2Z5oCB5pa55rOVXHJcbiAgICBzdGF0aWMgb3I8VCBleHRlbmRzIEZtb2RlT2JqZWN0PiguLi5xdWVyaWVzOiBGbW9kZVF1ZXJ5PFQ+W10pOiBGbW9kZVF1ZXJ5PFQ+IHtcclxuICAgICAgICBpZiAocXVlcmllcy5sZW5ndGggPT09IDApIHRocm93IG5ldyBFcnJvcignQXQgbGVhc3Qgb25lIHF1ZXJ5IHJlcXVpcmVkJyk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgY2xhc3NOYW1lID0gcXVlcmllc1swXS5jbGFzc05hbWU7XHJcbiAgICAgICAgaWYgKHF1ZXJpZXMuc29tZShxID0+IHEuY2xhc3NOYW1lICE9PSBjbGFzc05hbWUpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQWxsIHF1ZXJpZXMgbXVzdCBiZSBmb3IgdGhlIHNhbWUgY2xhc3MnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgY29tYmluZWQgPSBuZXcgRm1vZGVRdWVyeTxUPihjbGFzc05hbWUpO1xyXG4gICAgICAgIGNvbWJpbmVkLndoZXJlID0geyAkb3I6IHF1ZXJpZXMubWFwKHEgPT4gcS53aGVyZSkgfTtcclxuICAgICAgICByZXR1cm4gY29tYmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGFuZDxUIGV4dGVuZHMgRm1vZGVPYmplY3Q+KC4uLnF1ZXJpZXM6IEZtb2RlUXVlcnk8VD5bXSk6IEZtb2RlUXVlcnk8VD4ge1xyXG4gICAgICAgIGlmIChxdWVyaWVzLmxlbmd0aCA9PT0gMCkgdGhyb3cgbmV3IEVycm9yKCdBdCBsZWFzdCBvbmUgcXVlcnkgcmVxdWlyZWQnKTtcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBjbGFzc05hbWUgPSBxdWVyaWVzWzBdLmNsYXNzTmFtZTtcclxuICAgICAgICBpZiAocXVlcmllcy5zb21lKHEgPT4gcS5jbGFzc05hbWUgIT09IGNsYXNzTmFtZSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBbGwgcXVlcmllcyBtdXN0IGJlIGZvciB0aGUgc2FtZSBjbGFzcycpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBjb21iaW5lZCA9IG5ldyBGbW9kZVF1ZXJ5PFQ+KGNsYXNzTmFtZSk7XHJcbiAgICAgICAgY29tYmluZWQud2hlcmUgPSB7ICRhbmQ6IHF1ZXJpZXMubWFwKHEgPT4gcS53aGVyZSkgfTtcclxuICAgICAgICByZXR1cm4gY29tYmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGUgYSBuZXcgcXVlcnkgd2l0aCBPUiBsb2dpY1xyXG4gICAgICovXHJcbiAgICBvcjxUIGV4dGVuZHMgRm1vZGVPYmplY3Q+KC4uLnF1ZXJpZXM6IEZtb2RlUXVlcnk8VD5bXSk6IEZtb2RlUXVlcnk8VD4ge1xyXG4gICAgICAgIHJldHVybiBGbW9kZVF1ZXJ5Lm9yKHRoaXMgYXMgYW55LCAuLi5xdWVyaWVzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZSBhIG5ldyBxdWVyeSB3aXRoIEFORCBsb2dpYyBcclxuICAgICAqL1xyXG4gICAgYW5kPFQgZXh0ZW5kcyBGbW9kZU9iamVjdD4oLi4ucXVlcmllczogRm1vZGVRdWVyeTxUPltdKTogRm1vZGVRdWVyeTxUPiB7XHJcbiAgICAgICAgcmV0dXJuIEZtb2RlUXVlcnkuYW5kKHRoaXMgYXMgYW55LCAuLi5xdWVyaWVzKTtcclxuICAgIH1cclxufVxyXG4iXX0=
818
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm1vZGUucXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mbW9kZS1uZy9zcmMvbGliL2NvcmUvcGFyc2UvZm1vZGUucXVlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBd0I3QyxNQUFNLE9BQU8sVUFBVTthQUNKLGNBQVMsR0FBZSxJQUFJLEFBQW5CLENBQW9CO0lBRTVDLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBYTtRQUM3QixJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztJQUM5QixDQUFDO0lBRU8sTUFBTSxLQUFLLFFBQVE7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBQ25FLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDO0lBRUQ7O09BRUc7SUFDSyxNQUFNLENBQUMsc0JBQXNCLENBQUMsSUFBUztRQUMzQyxJQUFJLENBQUMsSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3BDLE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN0QixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMvRCxDQUFDO1FBRUQsNENBQTRDO1FBQzVDLDhFQUE4RTtRQUM5RSxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3RELCtFQUErRTtZQUMvRSxNQUFNLFNBQVMsR0FBRyxJ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Q0FBQztRQUN2QyxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUM3QixDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUMzQixDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkMsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDbkIsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNiLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUMzQixDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ3JDLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDL0MsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FB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QUN2QyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDL0MsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLFVBQVUsQ0FBSSxTQUFTLENBQUMsQ0FBQztRQUM5QyxRQUFRLENBQUMsS0FBSyxHQUFHLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNyRCxPQUFPLFFBQVEsQ0FBQztJQUNwQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxFQUFFLENBQXdCLEdBQUcsT0FBd0I7UUFDakQsT0FBTyxVQUFVLENBQUMsRUFBRSxDQUFDLElBQVcsRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7T0FFRztJQUNILEdBQUcsQ0FBd0IsR0FBRyxPQUF3QjtRQUNsRCxPQUFPLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBVyxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUM7SUFDbkQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZtb2RlT2JqZWN0IH0gZnJvbSAnLi9mbW9kZS5vYmplY3QnO1xyXG5cclxudHlwZSBRdWVyeUNvbmRpdGlvbnMgPSB7XHJcbiAgICAkbHQ/OiBhbnk7XHJcbiAgICAkbHRlPzogYW55O1xyXG4gICAgJGd0PzogYW55O1xyXG4gICAgJGd0ZT86IGFueTtcclxuICAgICRuZT86IGFueTtcclxuICAgICRpbj86IGFueVtdO1xyXG4gICAgJG5pbj86IGFueVtdO1xyXG4gICAgJGV4aXN0cz86IGJvb2xlYW47XHJcbiAgICAkc2VsZWN0PzogYW55O1xyXG4gICAgJGRvbnRTZWxlY3Q/OiBhbnk7XHJcbiAgICAkYWxsPzogYW55W107XHJcbiAgICAkcmVnZXg/OiBSZWdFeHAgfCBzdHJpbmc7XHJcbiAgICAkdGV4dD86IHsgJHNlYXJjaDogc3RyaW5nOyAkY2FzZVNlbnNpdGl2ZT86IGJvb2xlYW47ICRkaWFjcml0aWNTZW5zaXRpdmU/OiBib29sZWFuIH07XHJcbiAgICAkbmVhclNwaGVyZT86IGFueTtcclxuICAgICR3aXRoaW4/OiBhbnk7XHJcbiAgICAkbWF4RGlzdGFuY2U/OiBudW1iZXI7XHJcbiAgICAkb3I/OiBRdWVyeUNvbmRpdGlvbnNbXTtcclxuICAgICRhbmQ/OiBRdWVyeUNvbmRpdGlvbnNbXTtcclxuICAgIFtrZXk6IHN0cmluZ106IGFueTtcclxufTtcclxuXHJcbmV4cG9ydCBjbGFzcyBGbW9kZVF1ZXJ5PFQgZXh0ZW5kcyBGbW9kZU9iamVjdCA9IEZtb2RlT2JqZWN0PiB7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IGFueSB8IG51bGwgPSBudWxsO1xyXG4gICAgXHJcbiAgICBzdGF0aWMgYmluZEluc3RhbmNlKGluc3RhbmNlOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9pbnN0YW5jZSA9IGluc3RhbmNlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGdldCBpbnN0YW5jZSgpOiBhbnkge1xyXG4gICAgICAgIGlmICghdGhpcy5faW5zdGFuY2UpIHRocm93IG5ldyBFcnJvcignRm1vZGVQYXJzZSBub3QgaW5pdGlhbGl6ZWQnKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5faW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWN1cnNpdmVseSBjb252ZXJ0cyBpbmNsdWRlZCBQb2ludGVyIG9iamVjdHMgdG8gRm1vZGVPYmplY3QgaW5zdGFuY2VzXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc3RhdGljIGNvbnZlcnRJbmNsdWRlZE9iamVjdHMoZGF0YTogYW55KTogYW55IHtcclxuICAgICAgICBpZiAoIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZGF0YS5tYXAoaXRlbSA9PiB0aGlzLmNvbnZlcnRJbmNsdWRlZE9iamVjdHMoaXRlbSkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhbiBleHBhbmRlZCBQYXJzZSBvYmplY3RcclxuICAgICAgICAvLyBQYXJzZSBTZXJ2ZXIgdHlwaWNhbGx5IHJldHVybnMgaW5jbHVkZWQgb2JqZWN0cyB3aXRoIG9iamVjdElkIGFuZCBjcmVhdGVkQXRcclxuICAgICAgICBpZiAoZGF0YS5vYmplY3RJZCAmJiAoZGF0YS5jcmVhdGVkQXQgfHwgZGF0YS51cGRhdGVkQXQpKSB7XHJcbiAgICAgICAgICAgIC8vIERldGVybWluZSBjbGFzc05hbWUgLSBQYXJzZSBTZXJ2ZXIgbWlnaHQgaW5jbHVkZSBpdCBvciB3ZSB1c2UgYSBnZW5lcmljIG5hbWVcclxuICAgICAgICAgICAgY29uc3QgY2xhc3NOYW1lID0gZGF0YS5jbGFzc05hbWUgfHwgJ09iamVjdCc7XHJcbiAgICAgICAgICAgIGNvbnN0IG9iaiA9IG5ldyBGbW9kZU9iamVjdChjbGFzc05hbWUpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhvYmopXHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBTZXQgYmFzaWMgcHJvcGVydGllc1xyXG4gICAgICAgICAgICBvYmouaWQgPSBkYXRhLm9iamVjdElkO1xyXG4gICAgICAgICAgICBpZiAoZGF0YS5jcmVhdGVkQXQpIHtcclxuICAgICAgICAgICAgICAgIG9iai5jcmVhdGVkQXQgPSB0eXBlb2YgZGF0YS5jcmVhdGVkQXQgPT09ICdzdHJpbmcnID8gbmV3IERhdGUoZGF0YS5jcmVhdGVkQXQpIDogZGF0YS5jcmVhdGVkQXQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGRhdGEudXBkYXRlZEF0KSB7XHJcbiAgICAgICAgICAgICAgICBvYmoudXBkYXRlZEF0ID0gdHlwZW9mIGRhdGEudXBkYXRlZEF0ID09PSAnc3RyaW5nJyA/IG5ldyBEYXRlKGRhdGEudXBkYXRlZEF0KSA6IGRhdGEudXBkYXRlZEF0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChkYXRhLkFDTCkgb2JqLkFDTCA9IGRhdGEuQUNMO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gUmVjdXJzaXZlbHkgcHJvY2VzcyBhbGwgb3RoZXIgcHJvcGVydGllc1xyXG4gICAgICAgICAgICBjb25zdCBwcm9jZXNzZWREYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIVsnX190eXBlJywgJ2NsYXNzTmFtZScsICdvYmplY3RJZCcsICdjcmVhdGVkQXQnLCAndXBkYXRlZEF0JywgJ0FDTCddLmluY2x1ZGVzKGtleSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWREYXRhW2tleV0gPSB0aGlzLmNvbnZlcnRJbmNsdWRlZE9iamVjdHModmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBvYmouc2V0KHByb2Nlc3NlZERhdGEpO1xyXG4gICAgICAgICAgICByZXR1cm4gb2JqO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIFBhcnNlIG9iamVjdCB3aXRoIGV4cGxpY2l0IHR5cGVcclxuICAgICAgICBpZiAoZGF0YS5fX3R5cGUgPT09ICdPYmplY3QnICYmIGRhdGEuY2xhc3NOYW1lICYmIGRhdGEub2JqZWN0SWQpIHtcclxuICAgICAgICAgICAgY29uc3Qgb2JqID0gbmV3IEZtb2RlT2JqZWN0KGRhdGEuY2xhc3NOYW1lKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIFNldCBiYXNpYyBwcm9wZXJ0aWVzXHJcbiAgICAgICAgICAgIG9iai5pZCA9IGRhdGEub2JqZWN0SWQ7XHJcbiAgICAgICAgICAgIGlmIChkYXRhLmNyZWF0ZWRBdCkgb2JqLmNyZWF0ZWRBdCA9IG5ldyBEYXRlKGRhdGEuY3JlYXRlZEF0KTtcclxuICAgICAgICAgICAgaWYgKGRhdGEudXBkYXRlZEF0KSBvYmoudXBkYXRlZEF0ID0gbmV3IERhdGUoZGF0YS51cGRhdGVkQXQpO1xyXG4gICAgICAgICAgICBpZiAoZGF0YS5BQ0wpIG9iai5BQ0wgPSBkYXRhLkFDTDtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IHByb2Nlc3MgYWxsIG90aGVyIHByb3BlcnRpZXNcclxuICAgICAgICAgICAgY29uc3QgcHJvY2Vzc2VkRGF0YTogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkYXRhKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFbJ19fdHlwZScsICdjbGFzc05hbWUnLCAnb2JqZWN0SWQnLCAnY3JlYXRlZEF0JywgJ3VwZGF0ZWRBdCcsICdBQ0wnXS5pbmNsdWRlcyhrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkRGF0YVtrZXldID0gdGhpcy5jb252ZXJ0SW5jbHVkZWRPYmplY3RzKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgb2JqLnNldChwcm9jZXNzZWREYXRhKTtcclxuICAgICAgICAgICAgcmV0dXJuIG9iajtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBQb2ludGVyIG9iamVjdCB0aGF0IGdvdCBleHBhbmRlZFxyXG4gICAgICAgIGlmIChkYXRhLl9fdHlwZSA9PT0gJ1BvaW50ZXInICYmIGRhdGEuY2xhc3NOYW1lICYmIGRhdGEub2JqZWN0SWQpIHtcclxuICAgICAgICAgICAgLy8gSWYgaXQncyBqdXN0IGEgcG9pbnRlciAobm90IGV4cGFuZGVkKSwgbGVhdmUgaXQgYXMgaXNcclxuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBGb3IgcmVndWxhciBvYmplY3RzLCByZWN1cnNpdmVseSBwcm9jZXNzIHByb3BlcnRpZXNcclxuICAgICAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcclxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkYXRhKSkge1xyXG4gICAgICAgICAgICByZXN1bHRba2V5XSA9IHRoaXMuY29udmVydEluY2x1ZGVkT2JqZWN0cyh2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgY2xhc3NOYW1lOiBzdHJpbmc7XHJcbiAgICB3aGVyZTogUXVlcnlDb25kaXRpb25zID0ge307XHJcbiAgICBfaW5jbHVkZTogc3RyaW5nW10gPSBbXTtcclxuICAgIF9zZWxlY3Q6IHN0cmluZ1tdID0gW107XHJcbiAgICBfbGltaXQ/OiBudW1iZXI7XHJcbiAgICBfc2tpcD86IG51bWJlcjtcclxuICAgIF9vcmRlcj86IHN0cmluZ1tdO1xyXG4gICAgX2NvdW50ID0gZmFsc2U7XHJcbiAgICBfa2V5cz86IHN0cmluZztcclxuICAgIF9yZWFkUHJlZmVyZW5jZT86IHN0cmluZztcclxuICAgIF9pbmNsdWRlUmVhZFByZWZlcmVuY2U/OiBzdHJpbmc7XHJcbiAgICBfc3VicXVlcnlSZWFkUHJlZmVyZW5jZT86IHN0cmluZztcclxuICAgIF9leHBsYWluPzogYm9vbGVhbjtcclxuICAgIF9oaW50PzogYW55O1xyXG4gICAgX21heFRpbWVNUz86IG51bWJlcjtcclxuICAgIF90cmFjaW5nPzogYm9vbGVhbjtcclxuICAgIF9sb2NhbERhdGFzdG9yZT86IGJvb2xlYW47XHJcbiAgICBfc2Vzc2lvblRva2VuPzogc3RyaW5nO1xyXG4gICAgX2NvbnRleHQ/OiBhbnk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoY2xhc3NOYW1lOiBzdHJpbmcgfCB7IG5ldygpOiBUIH0pIHtcclxuICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IHR5cGVvZiBjbGFzc05hbWUgPT09ICdzdHJpbmcnID8gY2xhc3NOYW1lIDogY2xhc3NOYW1lLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5uYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIE1BUks6IC0g5p2h5Lu25pa55rOVXHJcblxyXG4gICAgZXF1YWxUbyhrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IHRoaXMge1xyXG4gICAgICAgIHZhbHVlID0gdGhpcy5maXhQb2ludGVyKHZhbHVlKVxyXG5cclxuICAgICAgICB0aGlzLndoZXJlW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBmaXhQb2ludGVyKHZhbHVlKXtcclxuICAgICAgICBpZih2YWx1ZT8uY2xhc3NOYW1lICYmIHZhbHVlPy5kYXRhKXtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIF9fdHlwZTpcIlBvaW50ZXJcIixcclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTp2YWx1ZT8uY2xhc3NOYW1lLFxyXG4gICAgICAgICAgICAgICAgb2JqZWN0SWQ6dmFsdWU/LmRhdGE/LmlkIHx8IHZhbHVlPy5pZFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB2YWx1ZVxyXG4gICAgfVxyXG4gICAgbm90RXF1YWxUbyhrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IHRoaXMge1xyXG4gICAgICAgIHZhbHVlID0gdGhpcy5maXhQb2ludGVyKHZhbHVlKVxyXG4gICAgICAgIHRoaXMud2hlcmVba2V5XSA9IHsgJG5lOiB2YWx1ZSB9O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIGxlc3NUaGFuKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogdGhpcyB7XHJcbiAgICAgICAgdGhpcy53aGVyZVtrZXldID0geyAkbHQ6IHZhbHVlIH07XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgbGVzc1RoYW5PckVxdWFsVG8oa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB0aGlzIHtcclxuICAgICAgICB0aGlzLndoZXJlW2tleV0gPSB7ICRsdGU6IHZhbHVlIH07XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgZ3JlYXRlclRoYW4oa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB0aGlzIHtcclxuICAgICAgICB0aGlzLndoZXJlW2tleV0gPSB7ICRndDogdmFsdWUgfTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBncmVhdGVyVGhhbk9yRXF1YWxUbyhrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IHRoaXMge1xyXG4gICAgICAgIHRoaXMud2hlcmVba2V5XSA9IHsgJGd0ZTogdmFsdWUgfTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBjb250YWluZWRJbihrZXk6IHN0cmluZywgdmFsdWVzOiBhbnlbXSk6IHRoaXMge1xyXG4gICAgICAgIHRoaXMud2hlcmVba2V5XSA9IHsgJGluOiB2YWx1ZXMgfTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBub3RDb250YWluZWRJbihrZXk6IHN0cmluZywgdmFsdWVzOiBhbnlbXSk6IHRoaXMge1xyXG4gICAgICAgIHRoaXMud2hlcmVba2V5XSA9IHsgJG5pbjogdmFsdWVzIH07XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgZXhpc3RzKGtleTogc3RyaW5nKTogdGhpcyB7XHJcbiAgICAgICAgdGhpcy53aGVyZVtrZXldID0geyAkZXhpc3RzOiB0cnVlIH07XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgZG9lc05vdEV4aXN0KGtleTogc3RyaW5nKTogdGhpcyB7XHJcbiAgICAgICAgdGhpcy53aGVyZVtrZXldID0geyAkZXhpc3RzOiBmYWxzZSB9O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnRhaW5zQWxsKGtleTogc3RyaW5nLCB2YWx1ZXM6IGFueVtdKTogdGhpcyB7XHJcbiAgICAgICAgdGhpcy53aGVyZVtrZXldID0geyAkYWxsOiB2YWx1ZXMgfTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBjb250YWlucyhrZXk6IHN0cmluZywgc3Vic3RyaW5nOiBzdHJpbmcpOiB0aGlzIHtcclxuICAgICAgICB0aGlzLndoZXJlW2tleV0gPSB7ICRyZWdleDogc3Vic3RyaW5nLCAkb3B0aW9uczogJ2knIH07XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhcnRzV2l0aChrZXk6IHN0cmluZywgcHJlZml4OiBzdHJpbmcpOiB0aGlzIHtcclxuICAgICAgICB0aGlzLndoZXJlW2tleV0gPSB7ICRyZWdleDogYF4ke3ByZWZpeH1gLCAkb3B0aW9uczogJ2knIH07XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgZW5kc1dpdGgoa2V5OiBzdHJpbmcsIHN1ZmZpeDogc3RyaW5nKTogdGhpcyB7XHJcbiAgICAgICAgdGhpcy53aGVyZVtrZXldID0geyAkcmVnZXg6IGAke3N1ZmZpeH0kYCwgJG9wdGlvbnM6ICdpJyB9O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIG1hdGNoZXMoa2V5OiBzdHJpbmcsIHJlZ2V4OiBSZWdFeHAsIG1vZGlmaWVycz86IHN0cmluZyk6IHRoaXMge1xyXG4gICAgICAgIHRoaXMud2hlcmVba2V5XSA9IHsgJHJlZ2V4OiByZWdleC5zb3VyY2UsICRvcHRpb25zOiBtb2RpZmllcnMgfTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBtYXRjaGVzUXVlcnkoa2V5OiBzdHJpbmcsIHF1ZXJ5OiBGbW9kZVF1ZXJ5KTogdGhpcyB7XHJcbiAgICAgICAgdGhpcy53aGVyZVtrZXldID0geyAkaW5RdWVyeTogeyBjbGFzc05hbWU6IHF1ZXJ5LmNsYXNzTmFtZSwgd2hlcmU6IHF1ZXJ5LndoZXJlIH0gfTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBkb2VzTm90TWF0Y2hRdWVyeShrZXk6IHN0cmluZywgcXVlcnk6IEZtb2RlUXVlcnkpOiB0aGlzIHtcclxuICAgICAgICB0aGlzLndoZXJlW2tleV0gPSB7ICRub3RJblF1ZXJ5OiB7IGNsYXNzTmFtZTogcXVlcnkuY2xhc3NOYW1lLCB3aGVyZTogcXVlcnkud2hlcmUgfSB9O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIG1hdGNoZXNLZXlJblF1ZXJ5KGtleTogc3RyaW5nLCBxdWVyeUtleTogc3RyaW5nLCBxdWVyeTogRm1vZGVRdWVyeSk6IHRoaXMge1xyXG4gICAgICAgIHRoaXMud2hlcmVba2V5XSA9IHsgJHNlbGVjdDogeyBrZXk6IHF1ZXJ5S2V5LCBxdWVyeTogeyBjbGFzc05hbWU6IHF1ZXJ5LmNsYXNzTmFtZSwgd2hlcmU6IHF1ZXJ5LndoZXJlIH0gfSB9O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIGRvZXNOb3RNYXRjaEtleUluUXVlcnkoa2V5OiBzdHJpbmcsIHF1ZXJ5S2V5OiBzdHJpbmcsIHF1ZXJ5OiBGbW9kZVF1ZXJ5KTogdGhpcyB7XHJcbiAgICAgICAgdGhpcy53aGVyZVtrZXldID0geyAkZG9udFNlbGVjdDogeyBrZXk6IHF1ZXJ5S2V5LCBxdWVyeTogeyBjbGFzc05hbWU6IHF1ZXJ5LmNsYXNzTmFtZSwgd2hlcmU6IHF1ZXJ5LndoZXJlIH0gfSB9O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIG5lYXIoa2V5OiBzdHJpbmcsIHBvaW50OiB7IGxhdGl0dWRlOiBudW1iZXI7IGxvbmdpdHVkZTogbnVtYmVyIH0pOiB0aGlzIHtcclxuICAgICAgICB0aGlzLndoZXJlW2tleV0gPSB7ICRuZWFyU3BoZXJlOiBwb2ludCB9O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHdpdGhpblJhZGlhbnMoa2V5OiBzdHJpbmcsIHBvaW50OiB7IGxhdGl0dWRlOiBudW1iZXI7IGxvbmdpdHVkZTogbnVtYmVyIH0sIGRpc3RhbmNlOiBudW1iZXIpOiB0aGlzIHtcclxuICAgICAgICB0aGlzLndoZXJlW2tleV0gPSB7ICRuZWFyU3BoZXJlOiBwb2ludCwgJG1heERpc3RhbmNlOiBkaXN0YW5jZSB9O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHdpdGhpbk1pbGVzKGtleTogc3RyaW5nLCBwb2ludDogeyBsYXRpdHVkZTogbnVtYmVyOyBsb25naXR1ZGU6IG51bWJlciB9LCBkaXN0YW5jZTogbnVtYmVyKTogdGhpcyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMud2l0aGluUmFkaWFucyhrZXksIHBvaW50LCBkaXN0YW5jZSAvIDM5NTkpO1xyXG4gICAgfVxyXG5cclxuICAgIHdpdGhpbktpbG9tZXRlcnMoa2V5OiBzdHJpbmcsIHBvaW50OiB7IGxhdGl0dWRlOiBudW1iZXI7IGxvbmdpdHVkZTogbnVtYmVyIH0sIGRpc3RhbmNlOiBudW1iZXIpOiB0aGlzIHtcclxuICAgICAgICByZXR1cm4gdGhpcy53aXRoaW5SYWRpYW5zKGtleSwgcG9pbnQsIGRpc3RhbmNlIC8gNjM3MSk7XHJcbiAgICB9XHJcblxyXG4gICAgd2l0aGluR2VvQm94KGtleTogc3RyaW5nLCBzb3V0aHdlc3Q6IHsgbGF0aXR1ZGU6IG51bWJlcjsgbG9uZ2l0dWRlOiBudW1iZXIgfSwgbm9ydGhlYXN0OiB7IGxhdGl0dWRlOiBudW1iZXI7IGxvbmdpdHVkZTogbnVtYmVyIH0pOiB0aGlzIHtcclxuICAgICAgICB0aGlzLndoZXJlW2tleV0gPSB7ICR3aXRoaW46IHsgJGJveDogW3NvdXRod2VzdCwgbm9ydGhlYXN0XSB9IH07XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcG9seWdvbkNvbnRhaW5zKGtleTogc3RyaW5nLCBwb2ludHM6IEFycmF5PHsgbGF0aXR1ZGU6IG51bWJlcjsgbG9uZ2l0dWRlOiBudW1iZXIgfT4pOiB0aGlzIHtcclxuICAgICAgICB0aGlzLndoZXJlW2tleV0gPSB7ICRnZW9XaXRoaW46IHsgJHBvbHlnb246IHBvaW50cyB9IH07XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTUFSSzogLSBBZGRpdGlvbmFsIFBhcnNlLWNvbXBhdGlibGUgcXVlcnkgbWV0aG9kc1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWF0Y2hlcyBhIGtleSBmcm9tIGEgbGlzdCBvZiBxdWVyaWVzXHJcbiAgICAgKi9cclxuICAgIGNvbnRhaW5lZEJ5KGtleTogc3RyaW5nLCB2YWx1ZXM6IGFueVtdKTogdGhpcyB7XHJcbiAgICAgICAgdGhpcy53aGVyZVtrZXldID0geyAkY29udGFpbmVkQnk6IHZhbHVlcyB9O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRnVsbCB0ZXh0IHNlYXJjaFxyXG4gICAgICovXHJcbiAgICBmdWxsVGV4dChrZXk6IHN0cmluZywgdGV4dDogc3RyaW5nLCBvcHRpb25zPzogeyBjYXNlU2Vuc2l0aXZlPzogYm9vbGVhbjsgZGlhY3JpdGljU2Vuc2l0aXZlPzogYm9vbGVhbiB9KTogdGhpcyB7XHJcbiAgICAgICAgdGhpcy53aGVyZVtrZXldID0geyBcclxuICAgICAgICAgICAgJHRleHQ6IHsgXHJcbiAgICAgICAgICAgICAgICAkc2VhcmNoOiB0ZXh0LFxyXG4gICAgICAgICAgICAgICAgJGNhc2VTZW5zaXRpdmU6IG9wdGlvbnM/LmNhc2VTZW5zaXRpdmUsXHJcbiAgICAgICAgICAgICAgICAkZGlhY3JpdGljU2Vuc2l0aXZlOiBvcHRpb25zPy5kaWFjcml0aWNTZW5zaXRpdmVcclxuICAgICAgICAgICAgfSBcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWF0Y2hlcyBvYmplY3RzIHdpdGggYXJyYXkgZmllbGQgY29udGFpbmluZyBhbGwgZ2l2ZW4gZWxlbWVudHNcclxuICAgICAqL1xyXG4gICAgY29udGFpbnNBbGxTdGFydGluZ1dpdGgoa2V5OiBzdHJpbmcsIHZhbHVlczogc3RyaW5nW10pOiB0aGlzIHtcclxuICAgICAgICB0aGlzLndoZXJlW2tleV0gPSB7ICRhbGw6IHZhbHVlcy5tYXAodmFsID0+ICh7ICRyZWdleDogYF4ke3ZhbH1gIH0pKSB9O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWF0Y2hlcyBvYmplY3RzIHdoZXJlIHRoZSBhcnJheSBmaWVsZCBoYXMgYSBzcGVjaWZpYyBzaXplXHJcbiAgICAgKi9cclxuICAgIHNpemVFcXVhbFRvKGtleTogc3RyaW5nLCBzaXplOiBudW1iZXIpOiB0aGlzIHtcclxuICAgICAgICB0aGlzLndoZXJlW2tleV0gPSB7ICRzaXplOiBzaXplIH07XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvLyBBZGQgdGhlc2UgbWV0aG9kcyB0byB0aGUgRm1vZGVRdWVyeSBjbGFzc1xyXG5cclxuLy8gTUFSSzogLSBSZWxhdGlvbiBNZXRob2RzXHJcblxyXG4vKipcclxuICogQWRkcyBhIHJlbGF0aW9uIGNvbnN0cmFpbnQgdG8gdGhlIHF1ZXJ5XHJcbiAqL1xyXG5yZWxhdGVkVG8ocGFyZW50OiBGbW9kZU9iamVjdCwga2V5OiBzdHJpbmcpOiB0aGlzIHtcclxuICAgIGlmICghcGFyZW50LmlkKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXJlbnQgb2JqZWN0IG11c3QgaGF2ZSBhbiBJRCcpO1xyXG4gICAgfVxyXG4gICAgdGhpcy53aGVyZVsnJHJlbGF0ZWRUbyddID0ge1xyXG4gICAgICAgIG9iamVjdDogcGFyZW50LnRvUG9pbnRlcigpLFxyXG4gICAgICAgIGtleToga2V5XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBZGRzIGEgcmVsYXRpb24gY29uc3RyYWludCBmb3IgYSBzcGVjaWZpYyBvYmplY3RcclxuICovXHJcbnJlbGF0ZWRUb09iamVjdChwYXJlbnQ6IEZtb2RlT2JqZWN0LCByZWxhdGlvbktleTogc3RyaW5nKTogdGhpcyB7XHJcbiAgICBpZiAoIXBhcmVudC5pZCkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUGFyZW50IG9iamVjdCBtdXN0IGhhdmUgYW4gSUQnKTtcclxuICAgIH1cclxuICAgIHRoaXMud2hlcmVbJyRyZWxhdGVkVG8nXSA9IHtcclxuICAgICAgICBvYmplY3Q6IHBhcmVudC50b1BvaW50ZXIoKSxcclxuICAgICAgICBrZXk6IHJlbGF0aW9uS2V5XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBZGRzIGEgcmVsYXRpb24gY29uc3RyYWludCBmb3IgYSBzcGVjaWZpYyBxdWVyeVxyXG4gKi9cclxucmVsYXRlZFRvUXVlcnkocGFyZW50Q2xhc3M6IHN0cmluZywgcmVsYXRpb25LZXk6IHN0cmluZywgcXVlcnk6IEZtb2RlUXVlcnkpOiB0aGlzIHtcclxuICAgIHRoaXMud2hlcmVbJyRyZWxhdGVkVG8nXSA9IHtcclxuICAgICAgICBrZXk6IHJlbGF0aW9uS2V5LFxyXG4gICAgICAgIHF1ZXJ5OiB7XHJcbiAgICAgICAgICAgIGNsYXNzTmFtZTogcGFyZW50Q2xhc3MsXHJcbiAgICAgICAgICAgIHdoZXJlOiBxdWVyeS53aGVyZVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICByZXR1cm4gdGhpcztcclxufVxyXG5cclxuLy8gTUFSSzogLSBQb2ludGVyIFF1ZXJ5IEhlbHBlcnNcclxuXHJcbi8qKlxyXG4gKiBNYXRjaGVzIG9iamVjdHMgdGhhdCBoYXZlIGEgcG9pbnRlciB0byB0aGUgZ2l2ZW4gb2JqZWN0XHJcbiAqL1xyXG5tYXRjaGVzUG9pbnRlcihrZXk6IHN0cmluZywgb2JqZWN0OiBGbW9kZU9iamVjdCk6IHRoaXMge1xyXG4gICAgaWYgKCFvYmplY3QuaWQpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ09iamVjdCBtdXN0IGhhdmUgYW4gSUQnKTtcclxuICAgIH1cclxuICAgIHRoaXMud2hlcmVba2V5XSA9IG9iamVjdC50b1BvaW50ZXIoKTtcclxuICAgIHJldHVybiB0aGlzO1xyXG59XHJcblxyXG4vKipcclxuICogTWF0Y2hlcyBvYmplY3RzIHRoYXQgaGF2ZSBhIHBvaW50ZXIgdG8gYW55IG9mIHRoZSBnaXZlbiBvYmplY3RzXHJcbiAqL1xyXG5tYXRjaGVzQW55UG9pbnRlcihrZXk6IHN0cmluZywgb2JqZWN0czogRm1vZGVPYmplY3RbXSk6IHRoaXMge1xyXG4gICAgY29uc3QgcG9pbnRlcnMgPSBvYmplY3RzLm1hcChvYmogPT4ge1xyXG4gICAgICAgIGlmICghb2JqLmlkKSB0aHJvdyBuZXcgRXJyb3IoJ0FsbCBvYmplY3RzIG11c3QgaGF2ZSBJRHMnKTtcclxuICAgICAgICByZXR1cm4gb2JqLnRvUG9pbnRlcigpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLndoZXJlW2tleV0gPSB7ICckaW4nOiBwb2ludGVycyB9O1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbn1cclxuXHJcbi8vIE1BUks6IC0gUmVsYXRpb24gUXVlcnkgRXhlY3V0aW9uXHJcblxyXG4vKipcclxuICogRmluZHMgb2JqZWN0cyBpbiBhIHJlbGF0aW9uIChhbHRlcm5hdGl2ZSB0byB1c2luZyByZWxhdGVkVG8pXHJcbiAqL1xyXG5zdGF0aWMgYXN5bmMgZmluZFJlbGF0aW9uPFQgZXh0ZW5kcyBGbW9kZU9iamVjdD4oXHJcbiAgICBwYXJlbnQ6IEZtb2RlT2JqZWN0LFxyXG4gICAgcmVsYXRpb25LZXk6IHN0cmluZyxcclxuICAgIG9wdGlvbnM/OiB7IHVzZU1hc3RlcktleT86IGJvb2xlYW4gfVxyXG4pOiBQcm9taXNlPFRbXT4ge1xyXG4gICAgaWYgKCFwYXJlbnQuaWQpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcmVudCBvYmplY3QgbXVzdCBoYXZlIGFuIElEJyk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IEZtb2RlUXVlcnk8VD4ocGFyZW50LmNsYXNzTmFtZSlcclxuICAgICAgICAucmVsYXRlZFRvKHBhcmVudCwgcmVsYXRpb25LZXkpO1xyXG4gICAgXHJcbiAgICByZXR1cm4gcXVlcnkuZmluZChvcHRpb25zKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENvdW50cyBvYmplY3RzIGluIGEgcmVsYXRpb25cclxuICovXHJcbnN0YXRpYyBhc3luYyBjb3VudFJlbGF0aW9uKFxyXG4gICAgcGFyZW50OiBGbW9kZU9iamVjdCxcclxuICAgIHJlbGF0aW9uS2V5OiBzdHJpbmcsXHJcbiAgICBvcHRpb25zPzogeyB1c2VNYXN0ZXJLZXk/OiBib29sZWFuIH1cclxuKTogUHJvbWlzZTxudW1iZXI+IHtcclxuICAgIGlmICghcGFyZW50LmlkKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXJlbnQgb2JqZWN0IG11c3QgaGF2ZSBhbiBJRCcpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBjb25zdCBxdWVyeSA9IG5ldyBGbW9kZVF1ZXJ5KHBhcmVudC5jbGFzc05hbWUpXHJcbiAgICAgICAgLnJlbGF0ZWRUbyhwYXJlbnQsIHJlbGF0aW9uS2V5KTtcclxuICAgIFxyXG4gICAgcmV0dXJuIHF1ZXJ5LmNvdW50KG9wdGlvbnMpO1xyXG59XHJcblxyXG4vLyBNQVJLOiAtIFJlbGF0aW9uIE1hbmFnZW1lbnRcclxuXHJcbi8qKlxyXG4gKiBBZGRzIG9iamVjdHMgdG8gYSByZWxhdGlvbiAoc3RhdGljIGhlbHBlcilcclxuICovXHJcbnN0YXRpYyBhc3luYyBhZGRUb1JlbGF0aW9uPFQgZXh0ZW5kcyBGbW9kZU9iamVjdD4oXHJcbiAgICBwYXJlbnQ6IEZtb2RlT2JqZWN0LFxyXG4gICAgcmVsYXRpb25LZXk6IHN0cmluZyxcclxuICAgIG9iamVjdHM6IFRbXSxcclxuICAgIG9wdGlvbnM/OiB7IHVzZU1hc3RlcktleT86IGJvb2xlYW4gfVxyXG4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghcGFyZW50LmlkKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXJlbnQgb2JqZWN0IG11c3QgaGF2ZSBhbiBJRCcpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBpZiAob2JqZWN0cy5zb21lKG9iaiA9PiAhb2JqLmlkKSkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQWxsIG9iamVjdHMgdG8gYWRkIG11c3QgaGF2ZSBJRHMnKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgY29uc3QgcG9pbnRlcnMgPSBvYmplY3RzLm1hcChvYmogPT4gb2JqLnRvUG9pbnRlcigpKTtcclxuICAgIFxyXG4gICAgY29uc3QgdXJsID0gYCR7Rm1vZGVRdWVyeS5pbnN0YW5jZS5zZXJ2ZXJVUkx9L2NsYXNzZXMvJHtwYXJlbnQuY2xhc3NOYW1lfS8ke3BhcmVudC5pZH1gO1xyXG4gICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcclxuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAgICdYLVBhcnNlLUFwcGxpY2F0aW9uLUlkJzogRm1vZGVRdWVyeS5pbnN0YW5jZS5hcHBJZFxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAob3B0aW9ucz8udXNlTWFzdGVyS2V5ICYmIEZtb2RlUXVlcnkuaW5zdGFuY2UuY29uZmlnLm1hc3RlcktleSkge1xyXG4gICAgICAgIGhlYWRlcnNbJ1gtUGFyc2UtTWFzdGVyLUtleSddID0gRm1vZGVRdWVyeS5pbnN0YW5jZS5jb25maWcubWFzdGVyS2V5O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBBZGQgc2Vzc2lvbiB0b2tlbiBpZiBhdmFpbGFibGUgYW5kIG5vdCB1c2luZyBtYXN0ZXIga2V5XHJcbiAgICAgICAgY29uc3Qgc2Vzc2lvblRva2VuID0gRm1vZGVRdWVyeS5pbnN0YW5jZS5zZXNzaW9uVG9rZW47XHJcbiAgICAgICAgaWYgKHNlc3Npb25Ub2tlbikge1xyXG4gICAgICAgICAgICBoZWFkZXJzWydYLVBhcnNlLVNlc3Npb24tVG9rZW4nXSA9IHNlc3Npb25Ub2tlbjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcclxuICAgICAgICBtZXRob2Q6ICdQVVQnLFxyXG4gICAgICAgIGhlYWRlcnMsXHJcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICAgICAgICBbcmVsYXRpb25LZXldOiB7XHJcbiAgICAgICAgICAgICAgICAnX19vcCc6ICdBZGRSZWxhdGlvbicsXHJcbiAgICAgICAgICAgICAgICAnb2JqZWN0cyc6IHBvaW50ZXJzXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocmVzdWx0LmVycm9yIHx8ICdGYWlsZWQgdG8gYWRkIHRvIHJlbGF0aW9uJyk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZW1vdmVzIG9iamVjdHMgZnJvbSBhIHJlbGF0aW9uIChzdGF0aWMgaGVscGVyKVxyXG4gKi9cclxuc3RhdGljIGFzeW5jIHJlbW92ZUZyb21SZWxhdGlvbjxUIGV4dGVuZHMgRm1vZGVPYmplY3Q+KFxyXG4gICAgcGFyZW50OiBGbW9kZU9iamVjdCxcclxuICAgIHJlbGF0aW9uS2V5OiBzdHJpbmcsXHJcbiAgICBvYmplY3RzOiBUW10sXHJcbiAgICBvcHRpb25zPzogeyB1c2VNYXN0ZXJLZXk/OiBib29sZWFuIH1cclxuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIXBhcmVudC5pZCkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUGFyZW50IG9iamVjdCBtdXN0IGhhdmUgYW4gSUQnKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgaWYgKG9iamVjdHMuc29tZShvYmogPT4gIW9iai5pZCkpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FsbCBvYmplY3RzIHRvIHJlbW92ZSBtdXN0IGhhdmUgSURzJyk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGNvbnN0IHBvaW50ZXJzID0gb2JqZWN0cy5tYXAob2JqID0+IG9iai50b1BvaW50ZXIoKSk7XHJcbiAgICBcclxuICAgIGNvbnN0IHVybCA9IGAke0Ztb2RlUXVlcnkuaW5zdGFuY2Uuc2VydmVyVVJMfS9jbGFzc2VzLyR7cGFyZW50LmNsYXNzTmFtZX0vJHtwYXJlbnQuaWR9YDtcclxuICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XHJcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgICAnWC1QYXJzZS1BcHBsaWNhdGlvbi1JZCc6IEZtb2RlUXVlcnkuaW5zdGFuY2UuYXBwSWRcclxuICAgIH07XHJcblxyXG4gICAgaWYgKG9wdGlvbnM/LnVzZU1hc3RlcktleSAmJiBGbW9kZVF1ZXJ5Lmluc3RhbmNlLmNvbmZpZy5tYXN0ZXJLZXkpIHtcclxuICAgICAgICBoZWFkZXJzWydYLVBhcnNlLU1hc3Rlci1LZXknXSA9IEZtb2RlUXVlcnkuaW5zdGFuY2UuY29uZmlnLm1hc3RlcktleTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gQWRkIHNlc3Npb24gdG9rZW4gaWYgYXZhaWxhYmxlIGFuZCBub3QgdXNpbmcgbWFzdGVyIGtleVxyXG4gICAgICAgIGNvbnN0IHNlc3Npb25Ub2tlbiA9IEZtb2RlUXVlcnkuaW5zdGFuY2Uuc2Vzc2lvblRva2VuO1xyXG4gICAgICAgIGlmIChzZXNzaW9uVG9rZW4pIHtcclxuICAgICAgICAgICAgaGVhZGVyc1snWC1QYXJzZS1TZXNzaW9uLVRva2VuJ10gPSBzZXNzaW9uVG9rZW47XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XHJcbiAgICAgICAgbWV0aG9kOiAnUFVUJyxcclxuICAgICAgICBoZWFkZXJzLFxyXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcclxuICAgICAgICAgICAgW3JlbGF0aW9uS2V5XToge1xyXG4gICAgICAgICAgICAgICAgJ19fb3AnOiAnUmVtb3ZlUmVsYXRpb24nLFxyXG4gICAgICAgICAgICAgICAgJ29iamVjdHMnOiBwb2ludGVyc1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHJlc3VsdC5lcnJvciB8fCAnRmFpbGVkIHRvIHJlbW92ZSBmcm9tIHJlbGF0aW9uJyk7XHJcbiAgICB9XHJcbn1cclxuXHJcbiAgICAvLyBNQVJLOiAtIOafpeivoumAiemhuVxyXG5cclxuICAgIGluY2x1ZGUoLi4ua2V5czogc3RyaW5nW10pOiB0aGlzIHtcclxuICAgICAgICBsZXQga2V5TWFwID0ge31cclxuICAgICAgICB0aGlzLl9pbmNsdWRlLmNvbmNhdChrZXlzKS5mb3JFYWNoKGl0ZW09PntcclxuICAgICAgICAgICAga2V5TWFwW2l0ZW1dID0gdHJ1ZVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5faW5jbHVkZSA9IE9iamVjdC5rZXlzKGtleU1hcClcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3QoLi4ua2V5czogc3RyaW5nW10pOiB0aGlzIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3QgPSBrZXlzO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIGxpbWl0KGNvdW50OiBudW1iZXIpOiB0aGlzIHtcclxuICAgICAgICB0aGlzLl9saW1pdCA9IGNvdW50O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHNraXAoY291bnQ6IG51bWJlcik6IHRoaXMge1xyXG4gICAgICAgIHRoaXMuX3NraXAgPSBjb3VudDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBhc2NlbmRpbmcoLi4ua2V5czogc3RyaW5nW10pOiB0aGlzIHtcclxuICAgICAgICB0aGlzLl9vcmRlciA9IGtleXMubWFwKGtleSA9PiBrZXkuc3RhcnRzV2l0aCgnLScpID8ga2V5LnN1YnN0cmluZygxKSA6IGtleSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgZGVzY2VuZGluZyguLi5rZXlzOiBzdHJpbmdbXSk6IHRoaXMge1xyXG4gICAgICAgIHRoaXMuX29yZGVyID0ga2V5cy5tYXAoa2V5ID0+IGtleS5zdGFydHNXaXRoKCctJykgPyBrZXkuc3Vic3RyaW5nKDEpIDogYC0ke2tleX1gKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBhZGRBc2NlbmRpbmcoLi4ua2V5czogc3RyaW5nW10pOiB0aGlzIHtcclxuICAgICAgICBpZiAoIXRoaXMuX29yZGVyKSB0aGlzLl9vcmRlciA9IFtdO1xyXG4gICAgICAgIHRoaXMuX29yZGVyLnB1c2goLi4ua2V5cyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkRGVzY2VuZGluZyguLi5rZXlzOiBzdHJpbmdbXSk6IHRoaXMge1xyXG4gICAgICAgIGlmICghdGhpcy5fb3JkZXIpIHRoaXMuX29yZGVyID0gW107XHJcbiAgICAgICAgdGhpcy5fb3JkZXIucHVzaCguLi5rZXlzLm1hcChrZXkgPT4gYC0ke2tleX1gKSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcmVhZFByZWZlcmVuY2UocHJlZjogc3RyaW5nKTogdGhpcyB7XHJcbiAgICAgICAgdGhpcy5fcmVhZFByZWZlcmVuY2UgPSBwcmVmO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIGluY2x1ZGVSZWFkUHJlZmVyZW5jZShwcmVmOiBzdHJpbmcpOiB0aGlzIHtcclxuICAgICAgICB0aGlzLl9pbmNsdWRlUmVhZFByZWZlcmVuY2UgPSBwcmVmO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHN1YnF1ZXJ5UmVhZFByZWZlcmVuY2UocHJlZjogc3RyaW5nKTogdGhpcyB7XHJcbiAgICAgICAgdGhpcy5fc3VicXVlcnlSZWFkUHJlZmVyZW5jZSA9IHByZWY7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgaGludChoaW50OiBhbnkpOiB0aGlzIHtcclxuICAgICAgICB0aGlzLmhpbnQgPSBoaW50O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIG1heFRpbWVNUyhtczogbnVtYmVyKTogdGhpcyB7XHJcbiAgICAgICAgdGhpcy5fbWF4VGltZU1TID0gbXM7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwbGFpbihleHBsYWluID0gdHJ1ZSk6IHRoaXMge1xyXG4gICAgICAgIHRoaXMuX2V4cGxhaW4gPSBleHBsYWluO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHdpdGhDb3VudCh3aXRoQ291bnQgPSB0cnVlKTogdGhpcyB7XHJcbiAgICAgICAgdGhpcy5fY291bnQgPSB3aXRoQ291bnQ7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vIE1BUks6IC0g5p+l6K+i5omn6KGMXHJcblxyXG4gICAgYXN5bmMgZmluZChvcHRpb25zPzogeyB1c2VNYXN0ZXJLZXk/OiBib29sZWFuIH0pOiBQcm9taXNlPFRbXT4ge1xyXG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoYCR7Rm1vZGVRdWVyeS5pbnN0YW5jZS5zZXJ2ZXJVUkx9L2NsYXNzZXMvJHt0aGlzLmNsYXNzTmFtZX1gKTtcclxuICAgICAgICBjb25zdCBwYXJhbXMgPSB0aGlzLl9idWlsZFF1ZXJ5UGFyYW1zKCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgT2JqZWN0LmVudHJpZXMocGFyYW1zKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcclxuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KGtleSwgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHVybC5zZWFyY2hQYXJhbXMpXHJcblxyXG4gICAgICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XHJcbiAgICAgICAgICAgICdYLVBhcnNlLUFwcGxpY2F0aW9uLUlkJzogRm1vZGVRdWVyeS5pbnN0YW5jZS5hcHBJZFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmIChvcHRpb25zPy51c2VNYXN0ZXJLZXkgJiYgRm1vZGVRdWVyeS5pbnN0YW5jZS5jb25maWcubWFzdGVyS2V5KSB7XHJcbiAgICAgICAgICAgIGhlYWRlcnNbJ1gtUGFyc2UtTWFzdGVyLUtleSddID0gRm1vZGVRdWVyeS5pbnN0YW5jZS5jb25maWcubWFzdGVyS2V5O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIEFkZCBzZXNzaW9uIHRva2VuIGlmIGF2YWlsYWJsZSBhbmQgbm90IHVzaW5nIG1hc3RlciBrZXlcclxuICAgICAgICAgICAgY29uc3Qgc2Vzc2lvblRva2VuID0gdGhpcy5fc2Vzc2lvblRva2VuIHx8IEZtb2RlUXVlcnkuaW5zdGFuY2Uuc2Vzc2lvblRva2VuO1xyXG4gICAgICAgICAgICBpZiAoc2Vzc2lvblRva2VuKSB7XHJcbiAgICAgICAgICAgICAgICBoZWFkZXJzWydYLVBhcnNlLVNlc3Npb24tVG9rZW4nXSA9IHNlc3Npb25Ub2tlbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coaGVhZGVycyx0aGlzLl9zZXNzaW9uVG9rZW4sRm1vZGVRdWVyeS5pbnN0YW5jZS5zZXNzaW9uVG9rZW4pXHJcblxyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLnRvU3RyaW5nKCksIHsgaGVhZGVycyB9KTtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2cocmVzdWx0KVxyXG4gICAgICAgIGlmKHJlc3VsdC5jb2RlID09IDIwOSl7IC8vIHNlc3Npb25Ub2tlbui/h+acn1xyXG4gICAgICAgICAgICBGbW9kZVF1ZXJ5Lmluc3RhbmNlLlVzZXIubG9nT3V0KClcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlc3VsdC5lcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKHJlc3BvbnNlKVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocmVzdWx0LmVycm9yKVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQucmVzdWx0cy5tYXAoKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBvYmogPSBuZXcgRm1vZGVPYmplY3QodGhpcy5jbGFzc05hbWUpIGFzIFQ7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBTZXQgYmFzaWMgcHJvcGVydGllcyBmaXJzdFxyXG4gICAgICAgICAgICBvYmouaWQgPSBkYXRhLm9iamVjdElkO1xyXG4gICAgICAgICAgICBpZiAoZGF0YS5jcmVhdGVkQXQpIG9iai5jcmVhdGVkQXQgPSBuZXcgRGF0ZShkYXRhLmNyZWF0ZWRBdCk7XHJcbiAgICAgICAgICAgIGlmIChkYXRhLnVwZGF0ZWRBdCkgb2JqLnVwZGF0ZWRBdCA9IG5ldyBEYXRlKGRhdGEudXBkYXRlZEF0IHx8IGRhdGEuY3JlYXRlZEF0KTtcclxuICAgICAgICAgICAgaWYgKGRhdGEuQUNMKSBvYmouQUNMID0gZGF0YS5BQ0w7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBQcm9jZXNzIGVhY2ggZmllbGQgaW5kaXZpZHVhbGx5IHRvIGNvbnZlcnQgaW5jbHVkZWQgb2JqZWN0c1xyXG4gICAgICAgICAgICBjb25zdCBwcm9jZXNzZWREYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIVsnX190eXBlJywgJ2NsYXNzTmFtZScsICdvYmplY3RJZCcsICdjcmVhdGVkQXQnLCAndXBkYXRlZEF0JywgJ0FDTCddLmluY2x1ZGVzKGtleSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBpbmNsdWRlZCBvYmplY3RzIC0gY2hlY2sgaWYgaXQncyBsaWtlbHkgYSBQYXJzZSBvYmplY3RcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5faW5jbHVkZS5pbmNsdWRlcyhrZXkpICYmIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgKHZhbHVlIGFzIGFueSkub2JqZWN0SWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhbiBpbmNsdWRlZCBQYXJzZSBvYmplY3RcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkRGF0YVtrZXldID0gRm1vZGVRdWVyeS5jb252ZXJ0SW5jbHVkZWRPYmplY3RzKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWd1bGFyIGZpZWxkIG9yIGFycmF5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZERhdGFba2V5XSA9IEZtb2RlUXVlcnkuY29udmVydEluY2x1ZGVkT2JqZWN0cyh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBvYmouc2V0KHByb2Nlc3NlZERhdGEpO1xyXG4gICAgICAgICAgICByZXR1cm4gb2JqO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGZpcnN0KG9wdGlvbnM/OiB7IHVzZU1hc3RlcktleT86IGJvb2xlYW4gfSk6IFByb21pc2U8VCB8IG51bGw+IHtcclxuICAgICAgICB0aGlzLmxpbWl0KDEpO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLmZpbmQob3B0aW9ucyk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdHNbMF0gfHwgbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXQob2JqZWN0SWQ6IHN0cmluZywgb3B0aW9ucz86IHsgdXNlTWFzdGVyS2V5PzogYm9vbGVhbiB9KTogUHJvbWlzZTxUPiB7XHJcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChgJHtGbW9kZVF1ZXJ5Lmluc3RhbmNlLnNlcnZlclVSTH0vY2xhc3Nlcy8ke3RoaXMuY2xhc3NOYW1lfS8ke29iamVjdElkfWApO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICh0aGlzLl9pbmNsdWRlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ2luY2x1ZGUnLCB0aGlzLl9pbmNsdWRlLmpvaW4oJywnKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xyXG4gICAgICAgICAgICAnWC1QYXJzZS1BcHBsaWNhdGlvbi1JZCc6IEZtb2RlUXVlcnkuaW5zdGFuY2UuYXBwSWRcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAob3B0aW9ucz8udXNlTWFzdGVyS2V5ICYmIEZtb2RlUXVlcnkuaW5zdGFuY2UuY29uZmlnLm1hc3RlcktleSkge1xyXG4gICAgICAgICAgICBoZWFkZXJzWydYLVBhcnNlLU1hc3Rlci1LZXknXSA9IEZtb2RlUXVlcnkuaW5zdGFuY2UuY29uZmlnLm1hc3RlcktleTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBBZGQgc2Vzc2lvbiB0b2tlbiBpZiBhdmFpbGFibGUgYW5kIG5vdCB1c2luZyBtYXN0ZXIga2V5XHJcbiAgICAgICAgICAgIGNvbnN0IHNlc3Npb25Ub2tlbiA9IHRoaXMuX3Nlc3Npb25Ub2tlbiB8fCBGbW9kZVF1ZXJ5Lmluc3RhbmNlLnNlc3Npb25Ub2tlbjtcclxuICAgICAgICAgICAgaWYgKHNlc3Npb25Ub2tlbikge1xyXG4gICAgICAgICAgICAgICAgaGVhZGVyc1snWC1QYXJzZS1TZXNzaW9uLVRva2VuJ10gPSBzZXNzaW9uVG9rZW47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLnRvU3RyaW5nKCksIHsgaGVhZGVycyB9KTtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2codXJsLHJlc3VsdClcclxuICAgICAgICBpZiAocmVzdWx0LmVycm9yKSB0aHJvdyBuZXcgRXJyb3IocmVzdWx0LmVycm9yKTtcclxuXHJcbiAgICAgICAgY29uc3Qgb2JqID0gbmV3IEZtb2RlT2JqZWN0KHRoaXMuY2xhc3NOYW1lKSBhcyBUO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIFNldCBiYXNpYyBwcm9wZXJ0aWVzIGZpcnN0XHJcbiAgICAgICAgb2JqLmlkID0gcmVzdWx0Lm9iamVjdElkO1xyXG4gICAgICAgIGlmIChyZXN1bHQuY3JlYXRlZEF0KSBvYmouY3JlYXRlZEF0ID0gbmV3IERhdGUocmVzdWx0LmNyZWF0ZWRBdCk7XHJcbiAgICAgICAgaWYgKHJlc3VsdC51cGRhdGVkQXQpIG9iai51cGRhdGVkQXQgPSBuZXcgRGF0ZShyZXN1bHQudXBkYXRlZEF0IHx8IHJlc3VsdC5jcmVhdGVkQXQpO1xyXG4gICAgICAgIGlmIChyZXN1bHQuQUNMKSBvYmouQUNMID0gcmVzdWx0LkFDTDtcclxuICAgICAgICBcclxuICAgICAgICAvLyBQcm9jZXNzIGVhY2ggZmllbGQgaW5kaXZpZHVhbGx5IHRvIGNvbnZlcnQgaW5jbHVkZWQgb2JqZWN0cyAoc2FtZSBhcyBmaW5kIG1ldGhvZClcclxuICAgICAgICBjb25zdCBwcm9jZXNzZWREYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XHJcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVzdWx0KSkge1xyXG4gICAgICAgICAgICBpZiAoIVsnX190eXBlJywgJ2NsYXNzTmFtZScsICdvYmplY3RJZCcsICdjcmVhdGVkQXQnLCAndXBkYXRlZEF0JywgJ0FDTCddLmluY2x1ZGVzKGtleSkpIHtcclxuICAgICAgICAgICAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGluY2x1ZGVkIG9iamVjdHMgLSBjaGVjayBpZiBpdCdzIGxpa2VseSBhIFBhcnNlIG9iamVjdFxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2luY2x1ZGUuaW5jbHVkZXMoa2V5KSAmJiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICh2YWx1ZSBhcyBhbnkpLm9iamVjdElkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhbiBpbmNsdWRlZCBQYXJzZSBvYmplY3RcclxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWREYXRhW2tleV0gPSBGbW9kZVF1ZXJ5LmNvbnZlcnRJbmNsdWRlZE9iamVjdHModmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBSZWd1bGFyIGZpZWxkIG9yIGFycmF5XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkRGF0YVtrZXldID0gRm1vZGVRdWVyeS5jb252ZXJ0SW5jbHVkZWRPYmplY3RzKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBvYmouc2V0KHByb2Nlc3NlZERhdGEpO1xyXG4gICAgICAgIHJldHVybiBvYmo7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgY291bnQob3B0aW9ucz86IHsgdXNlTWFzdGVyS2V5PzogYm9vbGVhbiB9KTogUHJvbWlzZTxudW1iZXI+IHtcclxuICAgICAgICB0aGlzLndpdGhDb3VudCgpO1xyXG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoYCR7Rm1vZGVRdWVyeS5pbnN0YW5jZS5zZXJ2ZXJVUkx9L2NsYXNzZXMvJHt0aGlzLmNsYXNzTmFtZX1gKTtcclxuICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgnY291bnQnLCAnMScpO1xyXG4gICAgICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KCdsaW1pdCcsICcwJyk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMud2hlcmUpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ3doZXJlJywgSlNPTi5zdHJpbmdpZnkodGhpcy53aGVyZSkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcclxuICAgICAgICAgICAgJ1gtUGFyc2UtQXBwbGljYXRpb24tSWQnOiBGbW9kZVF1ZXJ5Lmluc3RhbmNlLmFwcElkXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKG9wdGlvbnM/LnVzZU1hc3RlcktleSAmJiBGbW9kZVF1ZXJ5Lmluc3RhbmNlLmNvbmZpZy5tYXN0ZXJLZXkpIHtcclxuICAgICAgICAgICAgaGVhZGVyc1snWC1QYXJzZS1NYXN0ZXItS2V5J10gPSBGbW9kZVF1ZXJ5Lmluc3RhbmNlLmNvbmZpZy5tYXN0ZXJLZXk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gQWRkIHNlc3Npb24gdG9rZW4gaWYgYXZhaWxhYmxlIGFuZCBub3QgdXNpbmcgbWFzdGVyIGtleVxyXG4gICAgICAgICAgICBjb25zdCBzZXNzaW9uVG9rZW4gPSB0aGlzLl9zZXNzaW9uVG9rZW4gfHwgRm1vZGVRdWVyeS5pbnN0YW5jZS5zZXNzaW9uVG9rZW47XHJcbiAgICAgICAgICAgIGlmIChzZXNzaW9uVG9rZW4pIHtcclxuICAgICAgICAgICAgICAgIGhlYWRlcnNbJ1gtUGFyc2UtU2Vzc2lvbi1Ub2tlbiddID0gc2Vzc2lvblRva2VuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybC50b1N0cmluZygpLCB7IGhlYWRlcnMgfSk7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xyXG5cclxuICAgICAgICBpZiAocmVzdWx0LmVycm9yKSB0aHJvdyBuZXcgRXJyb3IocmVzdWx0LmVycm9yKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5jb3VudCB8fCAwO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIE1BUks6IC0gSlNPTiDluo/liJfljJbmlrnms5VcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnZlcnRzIHRoZSBxdWVyeSB0byBKU09OIGZvcm1hdCBjb21wYXRpYmxlIHdpdGggUGFyc2UgUkVTVCBBUElcclxuICAgICAqL1xyXG4gICAgdG9KU09OKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xyXG4gICAgICAgIGNvbnN0IGpzb246IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XHJcbiAgICAgICAgICAgIGNsYXNzTmFtZTogdGhpcy5jbGFzc05hbWVcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy53aGVyZSkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBqc29uLndoZXJlID0gdGhpcy53aGVyZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9pbmNsdWRlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAganNvbi5pbmNsdWRlID0gdGhpcy5faW5jbHVkZS5qb2luKCcsJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fc2VsZWN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAganNvbi5rZXlzID0gdGhpcy5fc2VsZWN0LmpvaW4oJywnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9saW1pdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGpzb24ubGltaXQgPSB0aGlzLl9saW1pdDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9za2lwICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAganNvbi5za2lwID0gdGhpcy5fc2tpcDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9vcmRlciAmJiB0aGlzLl9vcmRlci5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGpzb24ub3JkZXIgPSB0aGlzLl9vcmRlci5qb2luKCcsJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fY291bnQpIHtcclxuICAgICAgICAgICAganNvbi5jb3VudCA9IDE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fZXhwbGFpbikge1xyXG4gICAgICAgICAgICBqc29uLmV4cGxhaW4gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2hpbnQpIHtcclxuICAgICAgICAgICAganNvbi5oaW50ID0gdGhpcy5faGludDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9tYXhUaW1lTVMpIHtcclxuICAgICAgICAgICAganNvbi5tYXhUaW1lTVMgPSB0aGlzLl9tYXhUaW1lTVM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fcmVhZFByZWZlcmVuY2UpIHtcclxuICAgICAgICAgICAganNvbi5yZWFkUHJlZmVyZW5jZSA9IHRoaXMuX3JlYWRQcmVmZXJlbmNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2luY2x1ZGVSZWFkUHJlZmVyZW5jZSkge1xyXG4gICAgICAgICAgICBqc29uLmluY2x1ZGVSZWFkUHJlZmVyZW5jZSA9IHRoaXMuX2luY2x1ZGVSZWFkUHJlZmVyZW5jZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9zdWJxdWVyeVJlYWRQcmVmZXJlbmNlKSB7XHJcbiAgICAgICAgICAgIGpzb24uc3VicXVlcnlSZWFkUHJlZmVyZW5jZSA9IHRoaXMuX3N1YnF1ZXJ5UmVhZFByZWZlcmVuY2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4ganNvbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBxdWVyeSBmcm9tIEpTT04gZGF0YVxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZnJvbUpTT048VCBleHRlbmRzIEZtb2RlT2JqZWN0PihjbGFzc05hbWU6c3RyaW5nLGpzb246IFJlY29yZDxzdHJpbmcsIGFueT4pOiBGbW9kZVF1ZXJ5PFQ+IHtcclxuICAgICAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUgfHwganNvbj8uY2xhc3NOYW1lXHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBuZXcgRm1vZGVRdWVyeTxUPihjbGFzc05hbWUpO1xyXG5cclxuICAgICAgICBpZiAoanNvbi53aGVyZSkge1xyXG4gICAgICAgICAgICBxdWVyeS53aGVyZSA9IGpzb24ud2hlcmU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoanNvbi5pbmNsdWRlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGluY2x1ZGVzID0gdHlwZW9mIGpzb24uaW5jbHVkZSA9PT0gJ3N0cmluZycgXHJcbiAgICAgICAgICAgICAgICA/IGpzb24uaW5jbHVkZS5zcGxpdCgnLCcpIFxyXG4gICAgICAgICAgICAgICAgOiBqc29uLmluY2x1ZGU7XHJcbiAgICAgICAgICAgIHF1ZXJ5Ll9pbmNsdWRlID0gaW5jbHVkZXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoanNvbi5rZXlzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGtleXMgPSB0eXBlb2YganNvbi5rZXlzID09PSAnc3RyaW5nJyBcclxuICAgICAgICAgICAgICAgID8ganNvbi5rZXlzLnNwbGl0KCcsJykgXHJcbiAgICAgICAgICAgICAgICA6IGpzb24ua2V5cztcclxuICAgICAgICAgICAgcXVlcnkuX3NlbGVjdCA9IGtleXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoanNvbi5saW1pdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHF1ZXJ5Ll9saW1pdCA9IGpzb24ubGltaXQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoanNvbi5za2lwICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcXVlcnkuX3NraXAgPSBqc29uLnNraXA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoanNvbi5vcmRlcikge1xyXG4gICAgICAgICAgICBjb25zdCBvcmRlcnMgPSB0eXBlb2YganNvbi5vcmRlciA9PT0gJ3N0cmluZycgXHJcbiAgICAgICAgICAgICAgICA/IGpzb24ub3JkZXIuc3BsaXQoJywnKSBcclxuICAgICAgICAgICAgICAgIDoganNvbi5vcmRlcjtcclxuICAgICAgICAgICAgcXVlcnkuX29yZGVyID0gb3JkZXJzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGpzb24uY291bnQpIHtcclxuICAgICAgICAgICAgcXVlcnkuX2NvdW50ID0gISFqc29uLmNvdW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGpzb24uZXhwbGFpbikge1xyXG4gICAgICAgICAgICBxdWVyeS5fZXhwbGFpbiA9ICEhanNvbi5leHBsYWluO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGpzb24uaGludCkge1xyXG4gICAgICAgICAgICBxdWVyeS5faGludCA9IGpzb24uaGludDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChqc29uLm1heFRpbWVNUykge1xyXG4gICAgICAgICAgICBxdWVyeS5fbWF4VGltZU1TID0ganNvbi5tYXhUaW1lTVM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoanNvbi5yZWFkUHJlZmVyZW5jZSkge1xyXG4gICAgICAgICAgICBxdWVyeS5fcmVhZFByZWZlcmVuY2UgPSBqc29uLnJlYWRQcmVmZXJlbmNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGpzb24uaW5jbHVkZVJlYWRQcmVmZXJlbmNlKSB7XHJcbiAgICAgICAgICAgIHF1ZXJ5Ll9pbmNsdWRlUmVhZFByZWZlcmVuY2UgPSBqc29uLmluY2x1ZGVSZWFkUHJlZmVyZW5jZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChqc29uLnN1YnF1ZXJ5UmVhZFByZWZlcmVuY2UpIHtcclxuICAgICAgICAgICAgcXVlcnkuX3N1YnF1ZXJ5UmVhZFByZWZlcmVuY2UgPSBqc29uLnN1YnF1ZXJ5UmVhZFByZWZlcmVuY2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcXVlcnk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTUFSSzogLSDovoXliqnmlrnms5VcclxuXHJcbiAgICBwcml2YXRlIF9idWlsZFF1ZXJ5UGFyYW1zKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xyXG4gICAgICAgIGNvbnN0IHBhcmFtczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwid2hlcmVcIix0aGlzLndoZXJlKVxyXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLndoZXJlKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHBhcmFtcy53aGVyZSA9IHRoaXMud2hlcmU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICh0aGlzLl9pbmNsdWRlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcGFyYW1zLmluY2x1ZGUgPSB0aGlzLl9pbmNsdWRlLmpvaW4oJywnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHRoaXMuX3NlbGVjdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHBhcmFtcy5rZXlzID0gdGhpcy5fc2VsZWN0LmpvaW4oJywnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHRoaXMuX2xpbWl0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcGFyYW1zLmxpbWl0ID0gdGhpcy5fbGltaXQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICh0aGlzLl9za2lwICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcGFyYW1zLnNraXAgPSB0aGlzLl9za2lwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBpZiAodGhpcy5fb3JkZXIpIHtcclxuICAgICAgICAgICAgcGFyYW1zLm9yZGVyID0gdGhpcy5fb3JkZXIuam9pbignLCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBpZiAodGhpcy5fY291bnQpIHtcclxuICAgICAgICAgICAgcGFyYW1zLmNvdW50ID0gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHRoaXMuX2V4cGxhaW4pIHtcclxuICAgICAgICAgICAgcGFyYW1zLmV4cGxhaW4gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBpZiAodGhpcy5faGludCkge1xyXG4gICAgICAgICAgICBwYXJhbXMuaGludCA9IHRoaXMuX2hpbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICh0aGlzLl9tYXhUaW1lTVMpIHtcclxuICAgICAgICAgICAgcGFyYW1zLm1heFRpbWVNUyA9IHRoaXMuX21heFRpbWVNUztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBwYXJhbXM7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTUFSSzogLSDorqLpmIUv5a6e5pe25p+l6K+iICjnroDljJbniYgpXHJcblxyXG4gICAgc3Vic2NyaWJlKCk6IEV2ZW50VGFyZ2V0IHtcclxuICAgICAgICAvLyDnroDljJbnmoTlrp7ml7bmn6Xor6Llrp7njrBcclxuICAgICAgICBjb25zdCBldmVudFRhcmdldCA9IG5ldyBFdmVudFRhcmdldCgpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIOWunumZheWunueOsOW6lOivpeS9v+eUqCBXZWJTb2NrZXQg5oiW5YW25LuW5a6e5pe26YCa5L+h5pa55byPXHJcbiAgICAgICAgY29uc3QgY2hlY2tGb3JVcGRhdGVzID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuZmluZCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnRUYXJnZXQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ3VwZGF0ZScsIHsgZGV0YWlsOiByZXN1bHRzIH0pKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIGV2ZW50VGFyZ2V0LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdlcnJvcicsIHsgZGV0YWlsOiBlcnJvciB9KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IGludGVydmFsSWQgPSBzZXRJbnRlcnZhbChjaGVja0ZvclVwZGF0ZXMsIDUwMDApO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIOa3u+WKoOWPlua2iOiuoumYheaWueazlVxyXG4gICAgICAgIChldmVudFRhcmdldCBhcyBhbnkpLnVuc3Vic2NyaWJlID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIGV2ZW50VGFyZ2V0O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOmdmeaAgeaWueazlVxyXG4gICAgc3RhdGljIG9yPFQgZXh0ZW5kcyBGbW9kZU9iamVjdD4oLi4ucXVlcmllczogRm1vZGVRdWVyeTxUPltdKTogRm1vZGVRdWVyeTxUPiB7XHJcbiAgICAgICAgaWYgKHF1ZXJpZXMubGVuZ3RoID09PSAwKSB0aHJvdyBuZXcgRXJyb3IoJ0F0IGxlYXN0IG9uZSBxdWVyeSByZXF1aXJlZCcpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IHF1ZXJpZXNbMF0uY2xhc3NOYW1lO1xyXG4gICAgICAgIGlmIChxdWVyaWVzLnNvbWUocSA9PiBxLmNsYXNzTmFtZSAhPT0gY2xhc3NOYW1lKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FsbCBxdWVyaWVzIG11c3QgYmUgZm9yIHRoZSBzYW1lIGNsYXNzJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IGNvbWJpbmVkID0gbmV3IEZtb2RlUXVlcnk8VD4oY2xhc3NOYW1lKTtcclxuICAgICAgICBjb21iaW5lZC53aGVyZSA9IHsgJG9yOiBxdWVyaWVzLm1hcChxID0+IHEud2hlcmUpIH07XHJcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBhbmQ8VCBleHRlbmRzIEZtb2RlT2JqZWN0PiguLi5xdWVyaWVzOiBGbW9kZVF1ZXJ5PFQ+W10pOiBGbW9kZVF1ZXJ5PFQ+IHtcclxuICAgICAgICBpZiAocXVlcmllcy5sZW5ndGggPT09IDApIHRocm93IG5ldyBFcnJvcignQXQgbGVhc3Qgb25lIHF1ZXJ5IHJlcXVpcmVkJyk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgY2xhc3NOYW1lID0gcXVlcmllc1swXS5jbGFzc05hbWU7XHJcbiAgICAgICAgaWYgKHF1ZXJpZXMuc29tZShxID0+IHEuY2xhc3NOYW1lICE9PSBjbGFzc05hbWUpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQWxsIHF1ZXJpZXMgbXVzdCBiZSBmb3IgdGhlIHNhbWUgY2xhc3MnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgY29tYmluZWQgPSBuZXcgRm1vZGVRdWVyeTxUPihjbGFzc05hbWUpO1xyXG4gICAgICAgIGNvbWJpbmVkLndoZXJlID0geyAkYW5kOiBxdWVyaWVzLm1hcChxID0+IHEud2hlcmUpIH07XHJcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIGEgbmV3IHF1ZXJ5IHdpdGggT1IgbG9naWNcclxuICAgICAqL1xyXG4gICAgb3I8VCBleHRlbmRzIEZtb2RlT2JqZWN0PiguLi5xdWVyaWVzOiBGbW9kZVF1ZXJ5PFQ+W10pOiBGbW9kZVF1ZXJ5PFQ+IHtcclxuICAgICAgICByZXR1cm4gRm1vZGVRdWVyeS5vcih0aGlzIGFzIGFueSwgLi4ucXVlcmllcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGUgYSBuZXcgcXVlcnkgd2l0aCBBTkQgbG9naWMgXHJcbiAgICAgKi9cclxuICAgIGFuZDxUIGV4dGVuZHMgRm1vZGVPYmplY3Q+KC4uLnF1ZXJpZXM6IEZtb2RlUXVlcnk8VD5bXSk6IEZtb2RlUXVlcnk8VD4ge1xyXG4gICAgICAgIHJldHVybiBGbW9kZVF1ZXJ5LmFuZCh0aGlzIGFzIGFueSwgLi4ucXVlcmllcyk7XHJcbiAgICB9XHJcbn1cclxuIl19