@nlabs/reaktor 1.6.1 → 1.6.3

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.
@@ -3,12 +3,11 @@
3
3
  * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
4
4
  */ import { get as httpGet } from '@nlabs/rip-hunter';
5
5
  import { parseNum } from '@nlabs/utils/parsers/numbers';
6
- import { lowerCaseKeys } from '@nlabs/utils/parsers/objects';
7
6
  import { createHash, parseArangoId, parseChar, parseId, parseString } from '@nlabs/utils/parsers/strings';
8
7
  import { aql } from 'arangojs';
9
8
  import { literal } from 'arangojs/aql';
10
- import gm from 'gm';
11
- import { DateTime } from 'luxon';
9
+ import exifReader from 'exif-reader';
10
+ import sharp from 'sharp';
12
11
  import { Config } from '../config.js';
13
12
  import { COLLECTIONS, EDGES } from '../constants/collections.js';
14
13
  import { ErrorTypes } from '../types/error.types.js';
@@ -24,9 +23,6 @@ const eventCategory = 'images';
24
23
  const hasReactionCollection = literal(EDGES.HAS_REACTION);
25
24
  const hasMediaCollection = literal(EDGES.HAS_MEDIA);
26
25
  const personasCollection = literal(COLLECTIONS.PERSONAS);
27
- gm.subClass({
28
- imageMagick: '7+'
29
- });
30
26
  const MEDIA_ITEM_COLLECTIONS = [
31
27
  COLLECTIONS.PERSONAS,
32
28
  COLLECTIONS.USERS,
@@ -51,9 +47,20 @@ const getMediaItemDocIds = (itemId, itemType)=>{
51
47
  }
52
48
  return MEDIA_ITEM_COLLECTIONS.map((collection)=>`${collection}/${itemKey}`);
53
49
  };
54
- const isMissingGraphicsBinary = (error)=>{
55
- const message = error instanceof Error ? error.message : String(error || '');
56
- return message.includes('gm/convert binaries can\'t be found');
50
+ const normalizeImageFormat = (format)=>format === 'jpg' ? 'jpeg' : format;
51
+ const imageExifMetadata = (exif)=>{
52
+ if (!exif) return {};
53
+ try {
54
+ const metadata = exifReader(exif);
55
+ const taken = metadata.Photo?.DateTimeOriginal;
56
+ return {
57
+ make: metadata.Image?.Make,
58
+ model: metadata.Image?.Model,
59
+ taken: taken instanceof Date ? taken.getTime() : undefined
60
+ };
61
+ } catch {
62
+ return {};
63
+ }
57
64
  };
58
65
  const normalizeImagePrivacy = (privacy)=>{
59
66
  switch(String(privacy || '').trim().toLowerCase()){
@@ -548,7 +555,8 @@ export const resizeAndSaveImage = async (context, imageId, buffer, fileType = 'i
548
555
  const { session: { userId: sessionId } } = context;
549
556
  const imgW = Config.get('image.imgSize');
550
557
  const imgQ = Config.get('image.imgQuality');
551
- const format = fileType.split('/')[1];
558
+ const format = fileType.split('/')[1] || 'jpeg';
559
+ const sharpFormat = normalizeImageFormat(format);
552
560
  let imageOptimizedBuffer = buffer;
553
561
  let thumbOptimizedBuffer = buffer;
554
562
  let imageIdentity = {
@@ -557,38 +565,24 @@ export const resizeAndSaveImage = async (context, imageId, buffer, fileType = 'i
557
565
  imageId
558
566
  };
559
567
  try {
560
- imageOptimizedBuffer = await new Promise((resolve, reject)=>{
561
- gm(buffer, 'img').setFormat(format).quality(imgQ).autoOrient().resize(imgW, imgW, '>').stream((streamError, stdout)=>{
562
- if (streamError) {
563
- reject(streamError);
564
- return;
565
- }
566
- let nextImageBuffer = Buffer.from('');
567
- stdout.on('data', (data)=>{
568
- nextImageBuffer = Buffer.concat([
569
- nextImageBuffer,
570
- data
571
- ]);
572
- });
573
- stdout.on('end', ()=>resolve(nextImageBuffer));
574
- });
575
- });
568
+ imageOptimizedBuffer = await sharp(buffer).rotate().resize({
569
+ fit: 'inside',
570
+ height: imgW,
571
+ width: imgW,
572
+ withoutEnlargement: true
573
+ }).toFormat(sharpFormat, {
574
+ quality: imgQ
575
+ }).toBuffer();
576
576
  } catch (error) {
577
- if (!isMissingGraphicsBinary(error)) {
578
- return logError({
579
- action,
580
- category: eventCategory,
581
- params: {
582
- fileType,
583
- imageId
584
- },
585
- value: ErrorTypes.IMAGE_SAVE
586
- }, error, context);
587
- }
588
- console.warn('resizeAndSaveImage::gmUnavailable::usingOriginalBuffer', {
589
- fileType,
590
- imageId
591
- });
577
+ return logError({
578
+ action,
579
+ category: eventCategory,
580
+ params: {
581
+ fileType,
582
+ imageId
583
+ },
584
+ value: ErrorTypes.IMAGE_SAVE
585
+ }, error, context);
592
586
  }
593
587
  try {
594
588
  const imageObj = {
@@ -611,106 +605,50 @@ export const resizeAndSaveImage = async (context, imageId, buffer, fileType = 'i
611
605
  }, error, context);
612
606
  }
613
607
  try {
614
- imageIdentity = await new Promise((resolve, reject)=>{
615
- gm(imageOptimizedBuffer, 'img').identify({
616
- bufferStream: true
617
- }, (error, imageData = {})=>{
618
- if (error) {
619
- reject(error);
620
- return;
621
- }
622
- const formatValues = lowerCaseKeys(imageData);
623
- const { make: cameraMake, model: cameraModel, datetimeoriginal: taken } = formatValues;
624
- const stats = formatValues['channel statistics'];
625
- let color;
626
- if (stats) {
627
- let { red, green, blue, mean } = stats;
628
- if (red) {
629
- mean = red['standard deviation'] || red.mean;
630
- red = mean ? +mean.split(' ')[0].substring(0, 3) : 0;
631
- } else {
632
- red = 0;
633
- }
634
- if (green) {
635
- mean = green['standard deviation'] || green.mean;
636
- green = mean ? +mean.split(' ')[0].substring(0, 3) : 0;
637
- } else {
638
- green = 0;
639
- }
640
- if (blue) {
641
- mean = blue['standard deviation'] || blue.mean;
642
- blue = mean ? +mean.split(' ')[0].substring(0, 3) : 0;
643
- } else {
644
- blue = 0;
645
- }
646
- const rgb = blue | green << 8 | red << 16;
647
- const rgbColor = rgb.toString(16);
648
- color = rgbColor === '0' ? '000000' : rgbColor;
649
- }
650
- const { 'JPEG-Quality': quality, Orientation: orientationData, Resolution: resolutionData, size } = imageData;
651
- let resolution;
652
- if (resolutionData) {
653
- const [resolutionNumber, resolutionUnit] = resolutionData.split(' ');
654
- const resolutionValue = resolutionNumber.split('x')[0];
655
- const resolutionUnitValue = resolutionUnit === 'pixels/inch' ? 'ppi' : '';
656
- resolution = `${resolutionValue} ${resolutionUnitValue}`;
657
- }
658
- return resolve({
659
- color,
660
- fileSize: imageOptimizedBuffer.length,
661
- fileType: format,
662
- height: size?.height || 0,
663
- imageId,
664
- make: cameraMake,
665
- model: cameraModel,
666
- orientation: orientationData === 'Unknown' ? undefined : orientationData?.toLowerCase(),
667
- quality: quality ? +quality : undefined,
668
- resolution,
669
- taken: taken ? DateTime.fromMillis(taken).millisecond : undefined,
670
- width: size?.width || 0
671
- });
672
- });
673
- });
674
- thumbOptimizedBuffer = await new Promise((resolve, reject)=>{
675
- const thmW = Config.get('image.thmSize');
676
- const thmQ = Config.get('image.thmQuality');
677
- gm(imageOptimizedBuffer, 'img').setFormat(format).gravity('Center').resize(thmW, thmW, '^').extent(thmW, thmW).quality(thmQ).stream((streamError, thumbStdout)=>{
678
- if (streamError) {
679
- reject(streamError);
680
- return;
681
- }
682
- let thumbBuffer = Buffer.from('');
683
- thumbStdout.on('data', (data)=>{
684
- thumbBuffer = Buffer.concat([
685
- thumbBuffer,
686
- data
687
- ]);
688
- });
689
- thumbStdout.on('end', ()=>resolve(thumbBuffer));
690
- });
691
- });
692
- } catch (error) {
693
- if (!isMissingGraphicsBinary(error)) {
694
- return logError({
695
- action,
696
- category: eventCategory,
697
- params: {
698
- fileType,
699
- imageId
700
- },
701
- value: ErrorTypes.IMAGE_SAVE
702
- }, error, context);
703
- }
704
- console.warn('resizeAndSaveImage::gmMetadataUnavailable::usingOriginalThumb', {
705
- fileType,
706
- imageId
707
- });
708
- thumbOptimizedBuffer = imageOptimizedBuffer;
608
+ const [imageMetadata, imageStats, sourceMetadata] = await Promise.all([
609
+ sharp(imageOptimizedBuffer).metadata(),
610
+ sharp(imageOptimizedBuffer).stats(),
611
+ sharp(buffer).metadata()
612
+ ]);
613
+ const { b, g, r } = imageStats.dominant;
614
+ const color = [
615
+ r,
616
+ g,
617
+ b
618
+ ].map((value)=>value.toString(16).padStart(2, '0')).join('');
619
+ const exifMetadata = imageExifMetadata(sourceMetadata.exif);
709
620
  imageIdentity = {
621
+ color,
710
622
  fileSize: imageOptimizedBuffer.length,
711
623
  fileType: format,
712
- imageId
624
+ height: imageMetadata.height || 0,
625
+ imageId,
626
+ ...exifMetadata,
627
+ orientation: imageMetadata.orientation ? String(imageMetadata.orientation) : undefined,
628
+ quality: imgQ,
629
+ resolution: imageMetadata.density ? `${imageMetadata.density} ppi` : undefined,
630
+ width: imageMetadata.width || 0
713
631
  };
632
+ const thmW = Config.get('image.thmSize');
633
+ const thmQ = Config.get('image.thmQuality');
634
+ thumbOptimizedBuffer = await sharp(imageOptimizedBuffer).resize({
635
+ fit: 'cover',
636
+ height: thmW,
637
+ position: 'centre',
638
+ width: thmW
639
+ }).toFormat(sharpFormat, {
640
+ quality: thmQ
641
+ }).toBuffer();
642
+ } catch (error) {
643
+ return logError({
644
+ action,
645
+ category: eventCategory,
646
+ params: {
647
+ fileType,
648
+ imageId
649
+ },
650
+ value: ErrorTypes.IMAGE_SAVE
651
+ }, error, context);
714
652
  }
715
653
  try {
716
654
  const thumbObj = {
@@ -932,4 +870,4 @@ export const deleteImage = async (context, imageId)=>{
932
870
  }
933
871
  };
934
872
 
935
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3Ivc3JjL2FjdGlvbnMvaW1hZ2VzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge0RlbGV0ZU9iamVjdHNDb21tYW5kSW5wdXQsIFB1dE9iamVjdENvbW1hbmRJbnB1dH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXMzJztcbmltcG9ydCB7Z2V0IGFzIGh0dHBHZXR9IGZyb20gJ0BubGFicy9yaXAtaHVudGVyJztcbmltcG9ydCB7cGFyc2VOdW19IGZyb20gJ0BubGFicy91dGlscy9wYXJzZXJzL251bWJlcnMnO1xuaW1wb3J0IHtsb3dlckNhc2VLZXlzfSBmcm9tICdAbmxhYnMvdXRpbHMvcGFyc2Vycy9vYmplY3RzJztcbmltcG9ydCB7Y3JlYXRlSGFzaCwgcGFyc2VBcmFuZ29JZCwgcGFyc2VDaGFyLCBwYXJzZUlkLCBwYXJzZVN0cmluZ30gZnJvbSAnQG5sYWJzL3V0aWxzL3BhcnNlcnMvc3RyaW5ncyc7XG5pbXBvcnQge2FxbH0gZnJvbSAnYXJhbmdvanMnO1xuaW1wb3J0IHtBcWxRdWVyeSwgbGl0ZXJhbH0gZnJvbSAnYXJhbmdvanMvYXFsJztcbmltcG9ydCBnbSBmcm9tICdnbSc7XG5pbXBvcnQge0RhdGVUaW1lfSBmcm9tICdsdXhvbic7XG5cbmltcG9ydCB7Q29uZmlnfSBmcm9tICcuLi9jb25maWcuanMnO1xuaW1wb3J0IHtDT0xMRUNUSU9OUywgRURHRVN9IGZyb20gJy4uL2NvbnN0YW50cy9jb2xsZWN0aW9ucy5qcyc7XG5pbXBvcnQge0Vycm9yVHlwZXN9IGZyb20gJy4uL3R5cGVzL2Vycm9yLnR5cGVzLmpzJztcbmltcG9ydCB7bG9nRXJyb3IsIGxvZ0V4Y2VwdGlvbn0gZnJvbSAnLi4vdXRpbHMvYW5hbHl0aWNzVXRpbHMuanMnO1xuaW1wb3J0IHtnZXREb2NJZCwgZ2V0TGltaXQsIHNlbGVjdFJlYWN0aW9uQ291bnRCeVR5cGUsIHVzZURifSBmcm9tICcuLi91dGlscy9hcmFuZ29kYlV0aWxzLmpzJztcbmltcG9ydCB7Z2V0SW1hZ2VFeHRlbnNpb259IGZyb20gJy4uL3V0aWxzL2ltYWdlVXRpbHMuanMnO1xuaW1wb3J0IHthZGRJdGVtLCBkZWxldGVJdGVtLCBnZXRJdGVtQnksIGdldExpc3RCeSwgdXBkYXRlSXRlbX0gZnJvbSAnLi9jcnVkLmpzJztcbmltcG9ydCB7Z2V0R3JvdXBEZXRhaWxzLCBpc0dyb3VwZWR9IGZyb20gJy4vZ3JvdXBzLmpzJztcbmltcG9ydCB7Z2V0UGVyc29uYVJlbGF0aW9uc2hpcFN0YXRlfSBmcm9tICcuL3BlcnNvbmFzLmpzJztcbmltcG9ydCB7czNEZWxldGVMaXN0LCBzM0dldFNpZ25lZFVybCwgczNQdXR9IGZyb20gJy4vczMuanMnO1xuaW1wb3J0IHtoYXNTdWJzY3JpcHRpb25Ub0l0ZW19IGZyb20gJy4vc3Vic2NyaXB0aW9ucy5qcyc7XG5cbmltcG9ydCB0eXBlIHtRdWVyeUZpbHRlcn0gZnJvbSAnLi4vdHlwZXMvYXBwcy50eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7QXJhbmdvRGJDb2xsZWN0aW9uLCBBcmFuZ29EYkxpbWl0fSBmcm9tICcuLi90eXBlcy9hcmFuZ29kYi50eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7QXBpQ29udGV4dH0gZnJvbSAnLi4vdHlwZXMvYXV0aC50eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7R3JvdXBUeXBlLCBHcm91cFVzZXJ9IGZyb20gJy4uL3R5cGVzL2dyb3Vwcy50eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7SW1hZ2VFZGdlVHlwZSwgSW1hZ2VJZGVudGlmeVR5cGUsIEltYWdlT3B0aW9ucywgSW1hZ2VUeXBlLCBJbWFnZVVybERhdGF9IGZyb20gJy4uL3R5cGVzL2ltYWdlcy50eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7RmlsdGVyR3JvdXB9IGZyb20gJy4uL3V0aWxzL2FxbEhlbHBlcnMuanMnO1xuXG4vLyBEZWZpbmUgaW50ZXJmYWNlIGZvciBIVFRQIHJlc3BvbnNlIHdpdGggYnVmZmVyIG1ldGhvZFxuaW50ZXJmYWNlIEh0dHBSZXNwb25zZSBleHRlbmRzIFJlc3BvbnNlIHtcbiAgYnVmZmVyKCk6IFByb21pc2U8QnVmZmVyPjtcbn1cblxuY29uc3QgZXZlbnRDYXRlZ29yeSA9ICdpbWFnZXMnO1xuY29uc3QgaGFzUmVhY3Rpb25Db2xsZWN0aW9uID0gbGl0ZXJhbChFREdFUy5IQVNfUkVBQ1RJT04pO1xuY29uc3QgaGFzTWVkaWFDb2xsZWN0aW9uID0gbGl0ZXJhbChFREdFUy5IQVNfTUVESUEpO1xuY29uc3QgcGVyc29uYXNDb2xsZWN0aW9uID0gbGl0ZXJhbChDT0xMRUNUSU9OUy5QRVJTT05BUyk7XG5nbS5zdWJDbGFzcyh7aW1hZ2VNYWdpY2s6ICc3Kyd9KTtcblxuY29uc3QgTUVESUFfSVRFTV9DT0xMRUNUSU9OUzogcmVhZG9ubHkgQXJhbmdvRGJDb2xsZWN0aW9uW10gPSBbXG4gIENPTExFQ1RJT05TLlBFUlNPTkFTLFxuICBDT0xMRUNUSU9OUy5VU0VSUyxcbiAgQ09MTEVDVElPTlMuUE9TVFMsXG4gIENPTExFQ1RJT05TLkdST1VQU1xuXTtcblxuY29uc3QgZ2V0TWVkaWFJdGVtRG9jSWRzID0gKGl0ZW1JZDogc3RyaW5nLCBpdGVtVHlwZT86IEFyYW5nb0RiQ29sbGVjdGlvbik6IHN0cmluZ1tdID0+IHtcbiAgY29uc3QgZG9jSWQgPSBwYXJzZUFyYW5nb0lkKGl0ZW1JZCk7XG5cbiAgaWYoZG9jSWQpIHtcbiAgICByZXR1cm4gW2RvY0lkXTtcbiAgfVxuXG4gIGNvbnN0IGl0ZW1LZXkgPSBwYXJzZUlkKGl0ZW1JZCk7XG5cbiAgaWYoIWl0ZW1LZXkpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBpZihpdGVtVHlwZSAmJiBNRURJQV9JVEVNX0NPTExFQ1RJT05TLmluY2x1ZGVzKGl0ZW1UeXBlKSkge1xuICAgIHJldHVybiBbYCR7aXRlbVR5cGV9LyR7aXRlbUtleX1gXTtcbiAgfVxuXG4gIHJldHVybiBNRURJQV9JVEVNX0NPTExFQ1RJT05TLm1hcCgoY29sbGVjdGlvbikgPT4gYCR7Y29sbGVjdGlvbn0vJHtpdGVtS2V5fWApO1xufTtcblxuY29uc3QgaXNNaXNzaW5nR3JhcGhpY3NCaW5hcnkgPSAoZXJyb3I6IHVua25vd24pOiBib29sZWFuID0+IHtcbiAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yIHx8ICcnKTtcbiAgcmV0dXJuIG1lc3NhZ2UuaW5jbHVkZXMoJ2dtL2NvbnZlcnQgYmluYXJpZXMgY2FuXFwndCBiZSBmb3VuZCcpO1xufTtcblxuY29uc3Qgbm9ybWFsaXplSW1hZ2VQcml2YWN5ID0gKHByaXZhY3k6IHVua25vd24pOiAnZnJpZW5kcycgfCAncHJpdmF0ZScgfCAncHVibGljJyB8ICd2aXAnID0+IHtcbiAgc3dpdGNoKFN0cmluZyhwcml2YWN5IHx8ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgJ2ZyaWVuZHMnOlxuICAgICAgcmV0dXJuICdmcmllbmRzJztcbiAgICBjYXNlICdwcml2YXRlJzpcbiAgICAgIHJldHVybiAncHJpdmF0ZSc7XG4gICAgY2FzZSAndmlwJzpcbiAgICAgIHJldHVybiAndmlwJztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICdwdWJsaWMnO1xuICB9XG59O1xuXG5jb25zdCBjYW5WaWV3SW1hZ2UgPSAoXG4gIGltYWdlOiBJbWFnZVR5cGUsXG4gIHZpZXdlclVzZXJJZDogc3RyaW5nLFxuICBhY2Nlc3M6IHtcbiAgICByZWFkb25seSBjYW5WaWV3RnJpZW5kczogYm9vbGVhbjtcbiAgICByZWFkb25seSBjYW5WaWV3VmlwOiBib29sZWFuO1xuICAgIHJlYWRvbmx5IGlzT3duZXI6IGJvb2xlYW47XG4gIH1cbikgPT4ge1xuICBjb25zdCBwcml2YWN5ID0gbm9ybWFsaXplSW1hZ2VQcml2YWN5KGltYWdlPy5wcml2YWN5KTtcblxuICBpZihhY2Nlc3MuaXNPd25lciB8fCBTdHJpbmcoaW1hZ2U/LnVzZXJJZCB8fCAnJykgPT09IHZpZXdlclVzZXJJZCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgc3dpdGNoKHByaXZhY3kpIHtcbiAgICBjYXNlICdwcml2YXRlJzpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBjYXNlICdmcmllbmRzJzpcbiAgICAgIHJldHVybiBhY2Nlc3MuY2FuVmlld0ZyaWVuZHM7XG4gICAgY2FzZSAndmlwJzpcbiAgICAgIHJldHVybiBhY2Nlc3MuY2FuVmlld1ZpcDtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBwYXJzZUltYWdlT3B0aW9ucyA9IChvcHRpb25zOiBJbWFnZU9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZnJvbSA9IDAsXG4gICAgdG8gPSAzMCxcbiAgICB0eXBlID0gJ2RlZmF1bHQnXG4gIH0gPSBvcHRpb25zO1xuXG4gIHJldHVybiB7XG4gICAgbGltaXQ6IGdldExpbWl0KGZyb20sIHRvKSBhcyBBcmFuZ29EYkxpbWl0LFxuICAgIHR5cGU6IHBhcnNlQ2hhcih0eXBlLCAzMilcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRJbWFnZU9wdGlvbmFsRmllbGRzID0gKGZpZWxkczogc3RyaW5nW10gPSBbXSkgPT5cbiAgZmllbGRzLnJlZHVjZSgoc2VsZWN0cywgZmllbGQ6IHN0cmluZykgPT4ge1xuICAgIGlmKGZpZWxkLmluY2x1ZGVzKCdDb3VudCcpKSB7XG4gICAgICByZXR1cm4gc2VsZWN0UmVhY3Rpb25Db3VudEJ5VHlwZSgnaW1hZ2VzJywgJ2knLCBmaWVsZCwgc2VsZWN0cyk7XG4gICAgfVxuXG4gICAgc3dpdGNoKGZpZWxkKSB7XG4gICAgICBjYXNlICdyZWFjdGlvbnMnOiB7XG4gICAgICAgIHNlbGVjdHMucXVlcmllcy5wdXNoKGBMRVQgcmVhY3Rpb25zID0gKFxuICAgICAgICAgIEZPUiBpbWFnZSwgciBJTiBJTkJPVU5EIGkuX2lkIHJlYWN0aW9uc1xuICAgICAgICAgIENPTExFQ1QgcmVhY3Rpb25OYW1lID0gci52YWx1ZSBJTlRPIHJlYWN0aW9uSXRlbXNcbiAgICAgICAgICBSRVRVUk4ge25hbWU6IHJlYWN0aW9uTmFtZSwgY291bnQ6IExFTkdUSChyZWFjdGlvbkl0ZW1zWypdLnIudmFsdWUpfVxuICAgICAgICApYCk7XG4gICAgICAgIHNlbGVjdHMub2JqZWN0cy5wdXNoKCdyZWFjdGlvbnM6cmVhY3Rpb25zJyk7XG4gICAgICAgIHJldHVybiBzZWxlY3RzO1xuICAgICAgfVxuICAgICAgY2FzZSAndGFncyc6IHtcbiAgICAgICAgc2VsZWN0cy5xdWVyaWVzLnB1c2goYExFVCB0YWdzID0gKFxuICAgICAgICAgIEZPUiB0LCBwbCBJTiBJTkJPVU5EIGkuX2lkIGlzVGFnZ2VkXG4gICAgICAgICAgUkVUVVJOIHRcbiAgICAgICAgKWApO1xuICAgICAgICBzZWxlY3RzLm9iamVjdHMucHVzaCgndGFnczp0YWdzJyk7XG4gICAgICAgIHJldHVybiBzZWxlY3RzO1xuICAgICAgfVxuICAgICAgY2FzZSAndXNlcnMnOiB7XG4gICAgICAgIHNlbGVjdHMucXVlcmllcy5wdXNoKGBMRVQgdXNlcnMgPSBGSVJTVChcbiAgICAgICAgICBGT1IgdSBJTiB1c2Vyc1xuICAgICAgICAgIEZJTFRFUiBpLnVzZXJJZCA9PSB1Ll9rZXlcbiAgICAgICAgICBMSU1JVCAxXG4gICAgICAgICAgUkVUVVJOIHVcbiAgICAgICAgKWApO1xuICAgICAgICBzZWxlY3RzLm9iamVjdHMucHVzaCgndXNlcnM6dXNlcnMnKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdHM7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHJldHVybiBzZWxlY3RzO1xuICAgICAgfVxuICAgIH1cbiAgfSwge29iamVjdHM6IFtdLCBxdWVyaWVzOiBbXX0pO1xuXG5leHBvcnQgY29uc3QgZ2V0SW1hZ2VMaXN0QnlVc2VyID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB1c2VySWQ6IHN0cmluZyxcbiAgZnJvbTogbnVtYmVyID0gMCxcbiAgdG86IG51bWJlciA9IDMwXG4pOiBQcm9taXNlPEltYWdlVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRJbWFnZXNCeVVzZXInO1xuICBjb25zdCBmb3JtYXRVc2VySWQgPSBwYXJzZUlkKHVzZXJJZCk7XG5cbiAgcmV0dXJuIGdldExpc3RCeTxJbWFnZVR5cGU+KGNvbnRleHQsICdpbWFnZXMnLCB7dXNlcklkOiBmb3JtYXRVc2VySWR9LCB7XG4gICAgc29ydDogW3tmaWVsZDogJ2FkZGVkJywgZGlyZWN0aW9uOiAnREVTQyd9XSxcbiAgICBsaW1pdDoge2Zyb20sIHRvfSxcbiAgICBjdXN0b21RdWVyaWVzOiBbXG4gICAgICBgTEVUIHVzZXIgPSBGSVJTVChGT1IgdSBJTiB1c2VycyBGSUxURVIgdS5fa2V5ID09IGRvYy51c2VySWQgTElNSVQgMSBSRVRVUk4gdSlgXG4gICAgXSxcbiAgICBjdXN0b21PYmplY3RzOiBbJ3VzZXI6dXNlciddXG4gIH0pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgcGFyYW1zOiB7ZnJvbSwgdG8sIHVzZXJJZH0sXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG5cbiAgICAgIHJldHVybiBbXTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRJbWFnZUNvdW50QnlJdGVtID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGl0ZW1JZDogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldEltYWdlQ291bnRCeUl0ZW0nO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGl0ZW1Eb2NJZHMgPSBnZXRNZWRpYUl0ZW1Eb2NJZHMoaXRlbUlkKTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBcbiAgICBMRVQgbWVkaWEgPSAoXG4gICAgICBGT1IgaSBJTiAke2hhc01lZGlhQ29sbGVjdGlvbn1cbiAgICAgICAgRklMVEVSIGkuX2Zyb20gSU4gJHtpdGVtRG9jSWRzfVxuICAgICAgICBGSUxURVIgaS50eXBlID09IFwiaW1hZ2VcIlxuICAgICAgICBSRVRVUk4gMVxuICAgIClcbiAgICBSRVRVUk4ge2NvdW50OiBMRU5HVEgobWVkaWEpfVxuICBgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKCh7Y291bnR9KSA9PiBjb3VudClcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHtpdGVtSWR9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEltYWdlTGlzdEJ5SXRlbSA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaXRlbUlkOiBzdHJpbmcsXG4gIG9wdGlvbnM6IEltYWdlT3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPEltYWdlVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRJbWFnZXNCeUl0ZW0nO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBmaWVsZHMgPSBbXSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvblVzZXJJZCA9ICcnfSA9IHt9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdEl0ZW1UeXBlID0gb3B0aW9ucz8uaXRlbVR5cGUgPyBwYXJzZUNoYXIoU3RyaW5nKG9wdGlvbnMuaXRlbVR5cGUgfHwgJycpLCAzMikudG9Mb3dlckNhc2UoKSBhcyBBcmFuZ29EYkNvbGxlY3Rpb24gOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGl0ZW1Eb2NJZHMgPSBnZXRNZWRpYUl0ZW1Eb2NJZHMoaXRlbUlkLCBmb3JtYXRJdGVtVHlwZSk7XG4gIGNvbnN0IHtsaW1pdH0gPSBwYXJzZUltYWdlT3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0SW1hZ2VPcHRpb25hbEZpZWxkcyhmaWVsZHMpO1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFxuICAgIEZPUiBsIElOICR7aGFzTWVkaWFDb2xsZWN0aW9ufVxuICAgICAgRklMVEVSIGwuX2Zyb20gSU4gJHtpdGVtRG9jSWRzfVxuICAgICAgRklMVEVSIGwudHlwZSA9PSBcImltYWdlXCJcbiAgICAgIExFVCBpID0gRE9DVU1FTlQobC5fdG8pXG4gICAgICBGSUxURVIgTk9UIElTX05VTEwoaSlcbiAgICAgIExFVCBvd25lclBlcnNvbmEgPSBsLml0ZW1UeXBlID09IFwicGVyc29uYXNcIiA/IERPQ1VNRU5UKCR7bGl0ZXJhbChDT0xMRUNUSU9OUy5QRVJTT05BUyl9LCBQQVJTRV9JREVOVElGSUVSKGwuX2Zyb20pLmtleSkgOiBudWxsXG4gICAgICAke2xpdGVyYWwoc2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKSl9XG4gICAgICBTT1JUIGkuYWRkZWQgREVTQ1xuICAgICAgJHtsaXRlcmFsKGxpbWl0LmFxbCl9XG4gICAgICBSRVRVUk4gTUVSR0UoXG4gICAgICAgICR7c2VsZWN0T2JqZWN0cy5sZW5ndGggPiAwID8gbGl0ZXJhbChgTUVSR0UoaSwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYCkgOiBsaXRlcmFsKCdpJyl9LFxuICAgICAgICB7XG4gICAgICAgICAgX21lZGlhSXRlbUtleTogUEFSU0VfSURFTlRJRklFUihsLl9mcm9tKS5rZXksXG4gICAgICAgICAgX21lZGlhSXRlbVR5cGU6IGwuaXRlbVR5cGUgfHwgUEFSU0VfSURFTlRJRklFUihsLl9mcm9tKS5jb2xsZWN0aW9uLFxuICAgICAgICAgIG93bmVyUGVyc29uYUlkOiBvd25lclBlcnNvbmEgPyBvd25lclBlcnNvbmEuX2tleSA6IG51bGwsXG4gICAgICAgICAgb3duZXJQZXJzb25hSW1hZ2VJZDogb3duZXJQZXJzb25hID8gb3duZXJQZXJzb25hLmltYWdlSWQgOiBudWxsLFxuICAgICAgICAgIG93bmVyUGVyc29uYUltYWdlVXJsOiBvd25lclBlcnNvbmEgPyBvd25lclBlcnNvbmEuaW1hZ2VVcmwgOiBudWxsLFxuICAgICAgICAgIG93bmVyUGVyc29uYU5hbWU6IG93bmVyUGVyc29uYSA/IG93bmVyUGVyc29uYS5uYW1lIDogbnVsbCxcbiAgICAgICAgICBvd25lclBlcnNvbmFUaHVtYlVybDogb3duZXJQZXJzb25hID8gb3duZXJQZXJzb25hLnRodW1iVXJsIDogbnVsbCxcbiAgICAgICAgICBvd25lclBlcnNvbmFVc2VySWQ6IG93bmVyUGVyc29uYSA/IG93bmVyUGVyc29uYS51c2VySWQgOiBudWxsXG4gICAgICAgIH1cbiAgICAgIClcbiAgYDtcblxuICB0cnkge1xuICAgIGNvbnN0IGxpc3QgPSBhd2FpdCB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSBhcyB1bmtub3duIGFzIEltYWdlVHlwZVtdKTtcblxuICAgIGNvbnN0IG93bmVyVXNlcklkID0gU3RyaW5nKGxpc3RbMF0/LnVzZXJJZCB8fCAnJyk7XG4gICAgY29uc3QgaXNPd25lciA9ICEhc2Vzc2lvblVzZXJJZCAmJiAhIW93bmVyVXNlcklkICYmIHNlc3Npb25Vc2VySWQgPT09IG93bmVyVXNlcklkO1xuXG4gICAgaWYoaXNPd25lcikge1xuICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgfVxuXG4gICAgaWYoIXNlc3Npb25Vc2VySWQpIHtcbiAgICAgIHJldHVybiBsaXN0LmZpbHRlcigoaW1hZ2UpID0+IG5vcm1hbGl6ZUltYWdlUHJpdmFjeShpbWFnZT8ucHJpdmFjeSkgPT09ICdwdWJsaWMnKTtcbiAgICB9XG5cbiAgICBsZXQgY2FuVmlld0ZyaWVuZHMgPSBmYWxzZTtcbiAgICBsZXQgY2FuVmlld1ZpcCA9IGZhbHNlO1xuXG4gICAgY29uc3QgbWVkaWFJdGVtS2V5ID0gU3RyaW5nKChsaXN0WzBdIGFzIEltYWdlVHlwZSAmIHtfbWVkaWFJdGVtS2V5Pzogc3RyaW5nfSk/Ll9tZWRpYUl0ZW1LZXkgfHwgJycpO1xuICAgIGNvbnN0IG1lZGlhSXRlbVR5cGUgPSBTdHJpbmcoKGxpc3RbMF0gYXMgSW1hZ2VUeXBlICYge19tZWRpYUl0ZW1UeXBlPzogc3RyaW5nfSk/Ll9tZWRpYUl0ZW1UeXBlIHx8ICcnKTtcblxuICAgIGlmKG1lZGlhSXRlbVR5cGUgPT09IENPTExFQ1RJT05TLlBFUlNPTkFTICYmIG1lZGlhSXRlbUtleSkge1xuICAgICAgY29uc3QgcmVsYXRpb25zaGlwID0gYXdhaXQgZ2V0UGVyc29uYVJlbGF0aW9uc2hpcFN0YXRlKGNvbnRleHQsIG1lZGlhSXRlbUtleSk7XG4gICAgICBjYW5WaWV3RnJpZW5kcyA9ICEhcmVsYXRpb25zaGlwPy5pc0ZyaWVuZDtcbiAgICAgIGNhblZpZXdWaXAgPSBhd2FpdCBoYXNTdWJzY3JpcHRpb25Ub0l0ZW0oY29udGV4dCwgbWVkaWFJdGVtS2V5LCBDT0xMRUNUSU9OUy5QRVJTT05BUyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpc3QuZmlsdGVyKChpbWFnZSkgPT4gY2FuVmlld0ltYWdlKGltYWdlLCBzZXNzaW9uVXNlcklkLCB7Y2FuVmlld0ZyaWVuZHMsIGNhblZpZXdWaXAsIGlzT3duZXJ9KSk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgcGFyYW1zOiB7aXRlbUlkLCBvcHRpb25zOiB7Li4ub3B0aW9ucywgaXRlbVR5cGU6IGZvcm1hdEl0ZW1UeXBlfX0sXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gICAgICByZXR1cm4gW107XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBnZXRJbWFnZUxpc3RCeUdyb3VwID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBwYXJhbXM6IHtmaWx0ZXJzOiBRdWVyeUZpbHRlcltdLCBncm91cElkOiBzdHJpbmcsIGZyb206IG51bWJlciwgdG86IG51bWJlcn1cbik6IFByb21pc2U8SW1hZ2VUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldEltYWdlc0J5R3JvdXAnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtmaWx0ZXJzLCBncm91cElkLCBmcm9tLCB0b30gPSBwYXJhbXM7XG4gIGNvbnN0IGZvcm1hdEdyb3VwSWQgPSBwYXJzZUlkKGdyb3VwSWQpO1xuICBjb25zdCBsaW1pdDogQXJhbmdvRGJMaW1pdCA9IGdldExpbWl0KGZyb20sIHRvKTtcblxuICBmaWx0ZXJzXG4gICAgLm1hcCgoZmlsdGVyOiBRdWVyeUZpbHRlcikgPT4ge1xuICAgICAgY29uc3Qge2NvbmRpdGlvbmFsLCBuYW1lLCB2YWx1ZX0gPSBmaWx0ZXI7XG4gICAgICBsZXQgZm9ybWF0Q29uZCA9IGNvbmRpdGlvbmFsO1xuXG4gICAgICBpZihjb25kaXRpb25hbCAhPT0gJz49JyAmJiBjb25kaXRpb25hbCAhPT0gJzw9JyAmJiBjb25kaXRpb25hbCAhPT0gJz4nICYmIGNvbmRpdGlvbmFsICE9PSAnPCcpIHtcbiAgICAgICAgZm9ybWF0Q29uZCA9ICc9PSc7XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaChuYW1lKSB7XG4gICAgICAgIGNhc2UgJ2FkZGVkJzpcbiAgICAgICAgICByZXR1cm4gYHAuYWRkZWQgJHtmb3JtYXRDb25kfSAke3BhcnNlTnVtKHZhbHVlKX1gO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cbiAgICB9KTtcblxuICByZXR1cm4gZ2V0R3JvdXBEZXRhaWxzKGNvbnRleHQsIGZvcm1hdEdyb3VwSWQpXG4gICAgLnRoZW4oKGdyb3VwOiBHcm91cFR5cGUpID0+IHtcbiAgICAgIGlmKGdyb3VwLnByaXZhY3kgPT09ICdwdWJsaWMnKSB7XG4gICAgICAgIGZpbHRlcnMucHVzaCh7Y29uZGl0aW9uYWw6ICc9PScsIG5hbWU6ICdncm91cElkJywgdmFsdWU6IGZvcm1hdEdyb3VwSWR9KTtcbiAgICAgICAgY29uc3QgZmlsdGVyU3RyID0gZmlsdGVycy5qb2luKCcgJiYgJyk7XG4gICAgICAgIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgXG4gICAgICAgICAgRk9SIGkgSU4gRkxBVFRFTihcbiAgICAgICAgICAgIEZPUiBwIElOIHBvc3RzXG4gICAgICAgICAgICAgIEZJTFRFUiAke2xpdGVyYWwoZmlsdGVyU3RyKX1cbiAgICAgICAgICAgICAgTEVUIGltYWdlcyA9IChcbiAgICAgICAgICAgICAgICBGT1IgaSwgZSBJTiBPVVRCT1VORCBwLl9pZCAke2hhc01lZGlhQ29sbGVjdGlvbn1cbiAgICAgICAgICAgICAgICAgIEZJTFRFUiBlLnR5cGUgPT0gXCJpbWFnZVwiXG4gICAgICAgICAgICAgICAgICBSRVRVUk4gaVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIFNPUlQgcC5hZGRlZCBERVNDXG4gICAgICAgICAgICAgIFJFVFVSTiBpbWFnZXNcbiAgICAgICAgICApXG4gICAgICAgICAgICBTT1JUIGkuYWRkZWQgREVTQ1xuICAgICAgICAgICAgJHtsaXRlcmFsKGxpbWl0LmFxbCl9XG4gICAgICAgICAgICBSRVRVUk4gaVxuICAgICAgICBgO1xuXG4gICAgICAgIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAgICAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkgYXMgdW5rbm93biBhcyBJbWFnZVR5cGVbXSlcbiAgICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICAgICAgICBwYXJhbXM6IHtmaWx0ZXJzLCBmcm9tLCBncm91cElkLCB0b30sXG4gICAgICAgICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICAgICAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXNHcm91cGVkKGNvbnRleHQsIHNlc3Npb25JZCwgZ3JvdXBJZClcbiAgICAgICAgLnRoZW4oKGdyb3VwZWQ6IEdyb3VwVXNlcikgPT4ge1xuICAgICAgICAgIGlmKGdyb3VwZWQuaXNWYWxpZCkge1xuICAgICAgICAgICAgZmlsdGVycy5wdXNoKHtjb25kaXRpb25hbDogJz09JywgbmFtZTogJ2dyb3VwSWQnLCB2YWx1ZTogZ3JvdXBlZC5ncm91cElkfSk7XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJMaXN0ID0gZmlsdGVycy5qb2luKCcgJiYgJyk7XG4gICAgICAgICAgICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFxuICAgICAgICAgICAgICBGT1IgcCBJTiBwb3N0XG4gICAgICAgICAgICAgICAgRklMVEVSICR7bGl0ZXJhbChmaWx0ZXJMaXN0KX1cbiAgICAgICAgICAgICAgICBGT1IgZiBJTiBwLmZpbGVzXG4gICAgICAgICAgICAgICAgICBGSUxURVIgZi50eXBlID09IFwiaW1hZ2UvanBlZ1wiIHx8IGYudHlwZSA9PSBcImltYWdlL3BuZ1wiXG4gICAgICAgICAgICAgICAgICAke2xpdGVyYWwobGltaXQuYXFsKX1cbiAgICAgICAgICAgICAgICAgIFNPUlQgcC5hZGRlZCBERVNDXG4gICAgICAgICAgICAgICAgICBSRVRVUk4gZlxuICAgICAgICAgICAgYDtcblxuICAgICAgICAgICAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgICAgICAgICAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkgYXMgdW5rbm93biBhcyBJbWFnZVR5cGVbXSlcbiAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBsb2dFcnJvcih7XG4gICAgICAgICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICAgICAgICAgIHBhcmFtczoge2ZpbHRlcnMsIGZyb20sIGdyb3VwSWQsIHRvfSxcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICAgICAgICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SW1hZ2VMaXN0QnlSZWFjdGlvbnMgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHJlYWN0aW9uczogc3RyaW5nW10gPSBbXSxcbiAgb3B0aW9ucz86IEltYWdlT3B0aW9uc1xuKTogUHJvbWlzZTxJbWFnZVR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0SW1hZ2VMaXN0QnlSZWFjdGlvbnMnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBmaWVsZHMgPSBbXSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCB7bGltaXR9ID0gcGFyc2VJbWFnZU9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldEltYWdlT3B0aW9uYWxGaWVsZHMoZmllbGRzKTtcbiAgY29uc3QgZm9ybWF0U2Vzc2lvbklkID0gYHVzZXJzLyR7c2Vzc2lvbklkfWA7XG4gIGNvbnN0IGZvcm1hdFJlYWN0aW9uczogc3RyaW5nW10gPSByZWFjdGlvbnMubWFwKChyZWFjdGlvbk5hbWUpID0+IHBhcnNlQ2hhcihyZWFjdGlvbk5hbWUsIDMyKSk7XG4gIGNvbnN0IGZpbHRlckJ5OiBzdHJpbmdbXSA9IFtcbiAgICAnci50eXBlID09IFwiaW1hZ2VzXCInLFxuICAgIGBQT1NJVElPTigke0pTT04uc3RyaW5naWZ5KGZvcm1hdFJlYWN0aW9ucyl9LCBMT1dFUihyLm5hbWUpKWBdO1xuXG4gIC8vIEdldCBkYXRhIGZyb20gZGF0YWJhc2VcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBcbiAgICBGT1IgaSwgciBJTiBPVVRCT1VORCAke2Zvcm1hdFNlc3Npb25JZH0gaGFzUmVhY3Rpb25cbiAgICAgIE9QVElPTlMge3ZlcnRleENvbGxlY3Rpb25zOiBcImltYWdlc1wifVxuICAgICAgTEVUIG1lZGlhID0gRklSU1QoXG4gICAgICAgIEZPUiBvd25lciwgbCBJTiBJTkJPVU5EIGkuX2lkICR7aGFzTWVkaWFDb2xsZWN0aW9ufVxuICAgICAgICAgIEZJTFRFUiBsLnR5cGUgPT0gXCJpbWFnZVwiXG4gICAgICAgICAgTElNSVQgMVxuICAgICAgICAgIFJFVFVSTiB7XG4gICAgICAgICAgICBpdGVtS2V5OiBQQVJTRV9JREVOVElGSUVSKGwuX2Zyb20pLmtleSxcbiAgICAgICAgICAgIGl0ZW1UeXBlOiBsLml0ZW1UeXBlIHx8IFBBUlNFX0lERU5USUZJRVIobC5fZnJvbSkuY29sbGVjdGlvblxuICAgICAgICAgIH1cbiAgICAgIClcbiAgICAgIExFVCBvd25lclBlcnNvbmEgPSBtZWRpYSAmJiBtZWRpYS5pdGVtVHlwZSA9PSBcInBlcnNvbmFzXCIgPyBET0NVTUVOVCgke2xpdGVyYWwoQ09MTEVDVElPTlMuUEVSU09OQVMpfSwgbWVkaWEuaXRlbUtleSkgOiBudWxsXG4gICAgICAke2xpdGVyYWwoc2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKSl9XG4gICAgICBGSUxURVIgJHtsaXRlcmFsKGZpbHRlckJ5LmpvaW4oJyAmJiAnKSl9XG4gICAgICAke2xpdGVyYWwobGltaXQuYXFsKX1cbiAgICAgIFJFVFVSTiBNRVJHRShcbiAgICAgICAgJHtzZWxlY3RPYmplY3RzLmxlbmd0aCA+IDAgPyBsaXRlcmFsKGBNRVJHRShpLCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgKSA6IGxpdGVyYWwoJ2knKX0sXG4gICAgICAgIHtcbiAgICAgICAgICBvd25lclBlcnNvbmFJZDogb3duZXJQZXJzb25hID8gb3duZXJQZXJzb25hLl9rZXkgOiBudWxsLFxuICAgICAgICAgIG93bmVyUGVyc29uYUltYWdlSWQ6IG93bmVyUGVyc29uYSA/IG93bmVyUGVyc29uYS5pbWFnZUlkIDogbnVsbCxcbiAgICAgICAgICBvd25lclBlcnNvbmFJbWFnZVVybDogb3duZXJQZXJzb25hID8gb3duZXJQZXJzb25hLmltYWdlVXJsIDogbnVsbCxcbiAgICAgICAgICBvd25lclBlcnNvbmFOYW1lOiBvd25lclBlcnNvbmEgPyBvd25lclBlcnNvbmEubmFtZSA6IG51bGwsXG4gICAgICAgICAgb3duZXJQZXJzb25hVGh1bWJVcmw6IG93bmVyUGVyc29uYSA/IG93bmVyUGVyc29uYS50aHVtYlVybCA6IG51bGwsXG4gICAgICAgICAgb3duZXJQZXJzb25hVXNlcklkOiBvd25lclBlcnNvbmEgPyBvd25lclBlcnNvbmEudXNlcklkIDogbnVsbFxuICAgICAgICB9XG4gICAgICApXG4gIGA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSBhcyB1bmtub3duIGFzIEltYWdlVHlwZVtdKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHBhcmFtczoge29wdGlvbnMsIHJlYWN0aW9uc30sXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gICAgICByZXR1cm4gW107XG4gICAgfSk7XG59O1xuXG5jb25zdCBnZXRQZXJzb25hRG9jSWQgPSAocGVyc29uYUlkOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBwZXJzb25hRG9jSWQgPSBwYXJzZUFyYW5nb0lkKHBlcnNvbmFJZCk7XG5cbiAgaWYocGVyc29uYURvY0lkKSB7XG4gICAgcmV0dXJuIHBlcnNvbmFEb2NJZDtcbiAgfVxuXG4gIGNvbnN0IHBlcnNvbmFLZXkgPSBwYXJzZUlkKHBlcnNvbmFJZCk7XG4gIHJldHVybiBwZXJzb25hS2V5ID8gYCR7Q09MTEVDVElPTlMuUEVSU09OQVN9LyR7cGVyc29uYUtleX1gIDogJyc7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SW1hZ2VMaXN0QnlQZXJzb25hUmVhY3Rpb25zID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBwZXJzb25hSWQ6IHN0cmluZyA9ICcnLFxuICByZWFjdGlvbnM6IHN0cmluZ1tdID0gW10sXG4gIG9wdGlvbnM/OiBJbWFnZU9wdGlvbnNcbik6IFByb21pc2U8SW1hZ2VUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldEltYWdlTGlzdEJ5UGVyc29uYVJlYWN0aW9ucyc7XG4gIGNvbnN0IHNlc3Npb25QZXJzb25hSWQgPSBTdHJpbmcoY29udGV4dD8uc2Vzc2lvbj8ucGVyc29uYUlkIHx8ICcnKTtcbiAgY29uc3QgcGVyc29uYURvY0lkID0gZ2V0UGVyc29uYURvY0lkKHBlcnNvbmFJZCB8fCBzZXNzaW9uUGVyc29uYUlkKTtcbiAgY29uc3QgcmVhY3Rpb25OYW1lcyA9IEFycmF5LmlzQXJyYXkocmVhY3Rpb25zKVxuICAgID8gcmVhY3Rpb25zLm1hcCgocmVhY3Rpb25OYW1lKSA9PiBwYXJzZUNoYXIocmVhY3Rpb25OYW1lLCAzMikudG9Mb3dlckNhc2UoKSkuZmlsdGVyKEJvb2xlYW4pXG4gICAgOiBbXTtcbiAgY29uc3Qge2xpbWl0fSA9IHBhcnNlSW1hZ2VPcHRpb25zKG9wdGlvbnMpO1xuXG4gIGlmKCFwZXJzb25hRG9jSWQgfHwgIXJlYWN0aW9uTmFtZXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBcbiAgICBGT1IgaW1hZ2UsIHJlYWN0aW9uIElOIE9VVEJPVU5EICR7cGVyc29uYURvY0lkfSAke2hhc1JlYWN0aW9uQ29sbGVjdGlvbn1cbiAgICAgIE9QVElPTlMge3ZlcnRleENvbGxlY3Rpb25zOiBcImltYWdlc1wifVxuICAgICAgTEVUIG1lZGlhID0gRklSU1QoXG4gICAgICAgIEZPUiBvd25lciwgbGluayBJTiBJTkJPVU5EIGltYWdlLl9pZCAke2hhc01lZGlhQ29sbGVjdGlvbn1cbiAgICAgICAgICBGSUxURVIgbGluay50eXBlID09IFwiaW1hZ2VcIlxuICAgICAgICAgIExJTUlUIDFcbiAgICAgICAgICBSRVRVUk4ge1xuICAgICAgICAgICAgaXRlbUtleTogUEFSU0VfSURFTlRJRklFUihsaW5rLl9mcm9tKS5rZXksXG4gICAgICAgICAgICBpdGVtVHlwZTogbGluay5pdGVtVHlwZSB8fCBQQVJTRV9JREVOVElGSUVSKGxpbmsuX2Zyb20pLmNvbGxlY3Rpb25cbiAgICAgICAgICB9XG4gICAgICApXG4gICAgICBMRVQgb3duZXJQZXJzb25hID0gbWVkaWEgJiYgbWVkaWEuaXRlbVR5cGUgPT0gXCJwZXJzb25hc1wiID8gRE9DVU1FTlQoJHtwZXJzb25hc0NvbGxlY3Rpb259LCBtZWRpYS5pdGVtS2V5KSA6IG51bGxcbiAgICAgIEZJTFRFUiBMT1dFUihyZWFjdGlvbi50eXBlIHx8IFwiXCIpIElOIFtcImltYWdlXCIsIFwiaW1hZ2VzXCJdXG4gICAgICBGSUxURVIgUE9TSVRJT04oJHtyZWFjdGlvbk5hbWVzfSwgTE9XRVIocmVhY3Rpb24ubmFtZSB8fCByZWFjdGlvbi52YWx1ZSB8fCBcIlwiKSlcbiAgICAgIFNPUlQgcmVhY3Rpb24uYWRkZWQgREVTQ1xuICAgICAgJHtsaXRlcmFsKGxpbWl0LmFxbCl9XG4gICAgICBSRVRVUk4gTUVSR0UoaW1hZ2UsIHtcbiAgICAgICAgb3duZXJQZXJzb25hSWQ6IG93bmVyUGVyc29uYSA/IG93bmVyUGVyc29uYS5fa2V5IDogbnVsbCxcbiAgICAgICAgb3duZXJQZXJzb25hSW1hZ2VJZDogb3duZXJQZXJzb25hID8gb3duZXJQZXJzb25hLmltYWdlSWQgOiBudWxsLFxuICAgICAgICBvd25lclBlcnNvbmFJbWFnZVVybDogb3duZXJQZXJzb25hID8gb3duZXJQZXJzb25hLmltYWdlVXJsIDogbnVsbCxcbiAgICAgICAgb3duZXJQZXJzb25hTmFtZTogb3duZXJQZXJzb25hID8gb3duZXJQZXJzb25hLm5hbWUgOiBudWxsLFxuICAgICAgICBvd25lclBlcnNvbmFUaHVtYlVybDogb3duZXJQZXJzb25hID8gb3duZXJQZXJzb25hLnRodW1iVXJsIDogbnVsbCxcbiAgICAgICAgb3duZXJQZXJzb25hVXNlcklkOiBvd25lclBlcnNvbmEgPyBvd25lclBlcnNvbmEudXNlcklkIDogbnVsbFxuICAgICAgfSlcbiAgYDtcblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpIGFzIHVua25vd24gYXMgSW1hZ2VUeXBlW10pO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHtvcHRpb25zLCBwZXJzb25hSWQsIHJlYWN0aW9uc30sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yIGFzIEVycm9yLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBbXTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGdldEltYWdlQnlJZCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBpbWFnZUlkOiBzdHJpbmcpOiBQcm9taXNlPEltYWdlVHlwZT4gPT4ge1xuICBjb25zdCBmb3JtYXRJbWFnZUlkID0gcGFyc2VJZChpbWFnZUlkKTtcbiAgY29uc3QgZmlsdGVyczogRmlsdGVyR3JvdXAgPSB7XG4gICAgb3BlcmF0b3I6ICdBTkQnLFxuICAgIGZpbHRlcnM6IFt7ZmllbGQ6ICdfa2V5Jywgb3BlcmF0b3I6ICc9PScsIHZhbHVlOiBmb3JtYXRJbWFnZUlkfV1cbiAgfSBhcyBhbnk7XG5cbiAgcmV0dXJuIGdldEl0ZW1CeTxJbWFnZVR5cGU+KGNvbnRleHQsICdpbWFnZXMnLCBmaWx0ZXJzKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVc2VySW1hZ2VQYXRoID0gKHVzZXJJZDogc3RyaW5nLCBpbWFnZUlkOiBzdHJpbmcsIGltYWdlVHlwZTogc3RyaW5nLCBkaXI6IHN0cmluZyA9ICdpbWFnZXMnKTogc3RyaW5nID0+IHtcbiAgY29uc3QgZmlsZW5hbWUgPSBgJHtpbWFnZUlkfS4ke2dldEltYWdlRXh0ZW5zaW9uKGltYWdlVHlwZSl9YDtcblxuICByZXR1cm4gYHVzZXJzLyR7dXNlcklkfS8ke2Rpcn0vJHtmaWxlbmFtZX1gO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEFwcEltYWdlVXJsID0gKHtcbiAgYnVja2V0LFxuICBkaXJlY3RvcnkgPSAnaW1hZ2VzJyxcbiAgaW1hZ2VJZCxcbiAgaW1hZ2VUeXBlID0gJ2pwZycsXG4gIGlzVGh1bWIgPSBmYWxzZSxcbiAgdHlwZSxcbiAgdHlwZUlkXG59OiBJbWFnZVVybERhdGEpOiBzdHJpbmcgPT4ge1xuICBpZighdHlwZSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGlmKCFpbWFnZUlkKSB7XG4gICAgaWYoaW1hZ2VUeXBlID09PSAncGVyc29uYScpIHtcbiAgICAgIHJldHVybiBgJHtDb25maWcuZ2V0KCdpbWFnZS5kZWZhdWx0VXJsJyl9L3VzZXJzX2JrLmpwZ2A7XG4gICAgfVxuICAgIHJldHVybiBgJHtDb25maWcuZ2V0KCdpbWFnZS5kZWZhdWx0VXJsJyl9L3VzZXJzX3doLmpwZ2A7XG4gIH1cblxuICBjb25zdCBidWNrZXROYW1lID0gYnVja2V0IHx8IENvbmZpZy5nZXQoJ2ltYWdlLmJ1Y2tldCcpIHx8ICdkZXYucmVha3Rvci5pbyc7XG4gIGNvbnN0IGltYWdlTmFtZSA9IGlzVGh1bWIgPyBgJHtpbWFnZUlkfS10aC4ke2ltYWdlVHlwZX1gIDogYCR7aW1hZ2VJZH0uJHtpbWFnZVR5cGUgPT09ICdwZXJzb25hJyB8fCBpbWFnZVR5cGUgPT09ICdvdGhlcicgPyAnanBnJyA6IGltYWdlVHlwZX1gO1xuICBjb25zdCBpbWFnZVVybCA9IENvbmZpZy5nZXQoJ2ltYWdlLnVybCcpIHx8IGBodHRwczovL3MzLmFtYXpvbmF3cy5jb20vJHtidWNrZXROYW1lfWA7XG5cbiAgaWYodHlwZSA9PT0gJ2FwcHMnKSB7XG4gICAgcmV0dXJuIGAke2ltYWdlVXJsfS8ke3R5cGV9LyR7ZGlyZWN0b3J5fS8ke2ltYWdlTmFtZX1gO1xuICB9XG5cbiAgcmV0dXJuIGAke2ltYWdlVXJsfS8ke3R5cGV9LyR7dHlwZUlkfS8ke2RpcmVjdG9yeX0vJHtpbWFnZU5hbWV9YDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRJbWFnZVVybCA9IGFzeW5jICh7XG4gIGJ1Y2tldCxcbiAgaW1hZ2VEaXIgPSAnaW1hZ2VzJyxcbiAgaW1hZ2VJZCxcbiAgaW1hZ2VUeXBlID0gJ2pwZycsXG4gIGlzVGh1bWIgPSBmYWxzZSxcbiAgdHlwZSxcbiAgdHlwZUlkLFxuICB1cmxUeXBlID0gJ3B1YmxpYydcbn06IEltYWdlVXJsRGF0YSk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gIGlmKCFpbWFnZUlkKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgY29uc3QgYnVja2V0TmFtZSA9IGJ1Y2tldCB8fCBDb25maWcuZ2V0KCdpbWFnZS5idWNrZXQnKSB8fCAnZGV2LnJlYWt0b3IuaW8nO1xuICBjb25zdCBjb25maWd1cmVkSW1hZ2VVcmwgPSBTdHJpbmcoQ29uZmlnLmdldCgnaW1hZ2UudXJsJykgfHwgJycpO1xuICBjb25zdCBjb25maWd1cmVkQXBwVXJsID0gU3RyaW5nKENvbmZpZy5nZXQoJ2FwcC51cmwnKSB8fCAnJyk7XG4gIGNvbnN0IHB1YmxpY0Jhc2VVcmwgPSBjb25maWd1cmVkQXBwVXJsXG4gICAgPyBgaHR0cHM6Ly9ib3guJHtjb25maWd1cmVkQXBwVXJsfWBcbiAgICA6IChjb25maWd1cmVkSW1hZ2VVcmwgfHwgYGh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS8ke2J1Y2tldE5hbWV9YCk7XG4gIGNvbnN0IGRldkJhc2VVcmwgPSBjb25maWd1cmVkQXBwVXJsXG4gICAgPyBgaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2Rldi4ke2NvbmZpZ3VyZWRBcHBVcmx9YFxuICAgIDogKGNvbmZpZ3VyZWRJbWFnZVVybCB8fCBgaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tLyR7YnVja2V0TmFtZX1gKTtcblxuICAvLyBBbHdheXMgdXNlIHNpZ25lZCBVUkxzIGZvciB0aHVtYm5haWxzXG4gIGlmKGlzVGh1bWIpIHtcbiAgICB1cmxUeXBlID0gJ3NpZ25lZCc7XG4gIH1cblxuICBjb25zdCB0aHVtYlN1ZmZpeCA9IGlzVGh1bWIgPyAnLXRoJyA6ICcnO1xuICBjb25zdCBpbWFnZUtleSA9IGAke3R5cGV9LyR7dHlwZUlkfS8ke2ltYWdlRGlyfS8ke2ltYWdlSWR9JHt0aHVtYlN1ZmZpeH0uJHtpbWFnZVR5cGV9YDtcblxuICBzd2l0Y2godXJsVHlwZSkge1xuICAgIGNhc2UgJ3NpZ25lZCc6IHtcbiAgICAgIHJldHVybiBhd2FpdCBzM0dldFNpZ25lZFVybCh7QnVja2V0OiBidWNrZXROYW1lLCBFeHBpcmVzOiA2MCAqIDYwLCBLZXk6IGltYWdlS2V5fSk7XG4gICAgfVxuICAgIGNhc2UgJ3B1YmxpYyc6IHtcbiAgICAgIHJldHVybiBgJHtwdWJsaWNCYXNlVXJsfS8ke2ltYWdlS2V5fWA7XG4gICAgfVxuICAgIGNhc2UgJ2Rldic6IHtcbiAgICAgIHJldHVybiBgJHtkZXZCYXNlVXJsfS8ke2ltYWdlS2V5fWA7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCByZXNpemVBbmRTYXZlSW1hZ2UgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGltYWdlSWQ6IHN0cmluZyxcbiAgYnVmZmVyOiBCdWZmZXIsXG4gIGZpbGVUeXBlOiBzdHJpbmcgPSAnaW1hZ2UvanBlZycsIHMzT3B0aW9ucz86IFB1dE9iamVjdENvbW1hbmRJbnB1dFxuKTogUHJvbWlzZTxJbWFnZVR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ3Jlc2l6ZVNhdmVJbWFnZSc7XG4gIGNvbnN0IHtzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGltZ1cgPSBDb25maWcuZ2V0KCdpbWFnZS5pbWdTaXplJyk7XG4gIGNvbnN0IGltZ1EgPSBDb25maWcuZ2V0KCdpbWFnZS5pbWdRdWFsaXR5Jyk7XG4gIGNvbnN0IGZvcm1hdCA9IChmaWxlVHlwZS5zcGxpdCgnLycpKVsxXTtcbiAgbGV0IGltYWdlT3B0aW1pemVkQnVmZmVyOiBCdWZmZXIgPSBidWZmZXI7XG4gIGxldCB0aHVtYk9wdGltaXplZEJ1ZmZlcjogQnVmZmVyID0gYnVmZmVyO1xuICBsZXQgaW1hZ2VJZGVudGl0eTogSW1hZ2VUeXBlID0ge1xuICAgIGZpbGVTaXplOiBidWZmZXIubGVuZ3RoLFxuICAgIGZpbGVUeXBlOiBmb3JtYXQsXG4gICAgaW1hZ2VJZFxuICB9O1xuXG4gIHRyeSB7XG4gICAgaW1hZ2VPcHRpbWl6ZWRCdWZmZXIgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBnbShidWZmZXIsICdpbWcnKVxuICAgICAgICAuc2V0Rm9ybWF0KGZvcm1hdClcbiAgICAgICAgLnF1YWxpdHkoaW1nUSlcbiAgICAgICAgLmF1dG9PcmllbnQoKVxuICAgICAgICAucmVzaXplKGltZ1csIGltZ1csICc+JylcbiAgICAgICAgLnN0cmVhbSgoc3RyZWFtRXJyb3I6IEVycm9yLCBzdGRvdXQpOiB2b2lkID0+IHtcbiAgICAgICAgICBpZihzdHJlYW1FcnJvcikge1xuICAgICAgICAgICAgcmVqZWN0KHN0cmVhbUVycm9yKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsZXQgbmV4dEltYWdlQnVmZmVyOiBCdWZmZXIgPSBCdWZmZXIuZnJvbSgnJyk7XG5cbiAgICAgICAgICBzdGRvdXQub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgbmV4dEltYWdlQnVmZmVyID0gQnVmZmVyLmNvbmNhdChbbmV4dEltYWdlQnVmZmVyLCBkYXRhXSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBzdGRvdXQub24oJ2VuZCcsICgpID0+IHJlc29sdmUobmV4dEltYWdlQnVmZmVyKSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgaWYoIWlzTWlzc2luZ0dyYXBoaWNzQmluYXJ5KGVycm9yKSkge1xuICAgICAgcmV0dXJuIGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgcGFyYW1zOiB7ZmlsZVR5cGUsIGltYWdlSWR9LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5JTUFHRV9TQVZFXG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgY29uc29sZS53YXJuKCdyZXNpemVBbmRTYXZlSW1hZ2U6OmdtVW5hdmFpbGFibGU6OnVzaW5nT3JpZ2luYWxCdWZmZXInLCB7ZmlsZVR5cGUsIGltYWdlSWR9KTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgaW1hZ2VPYmo6IFB1dE9iamVjdENvbW1hbmRJbnB1dCA9IHtcbiAgICAgIEJvZHk6IGltYWdlT3B0aW1pemVkQnVmZmVyLFxuICAgICAgQnVja2V0OiBudWxsLFxuICAgICAgQ29udGVudFR5cGU6IGZpbGVUeXBlLFxuICAgICAgLi4uKHMzT3B0aW9ucyB8fCB7fSksXG4gICAgICBLZXk6IGdldFVzZXJJbWFnZVBhdGgoc2Vzc2lvbklkLCBpbWFnZUlkLCBmaWxlVHlwZSwgJ2ltYWdlcycpXG4gICAgfTtcbiAgICBhd2FpdCBzM1B1dChpbWFnZU9iaik7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICByZXR1cm4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHtmaWxlVHlwZSwgaW1hZ2VJZH0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5JTUFHRV9TQVZFXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBpbWFnZUlkZW50aXR5ID0gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgZ20oaW1hZ2VPcHRpbWl6ZWRCdWZmZXIsICdpbWcnKVxuICAgICAgICAuaWRlbnRpZnkoe2J1ZmZlclN0cmVhbTogdHJ1ZX0sIChlcnJvcjogRXJyb3IsIGltYWdlRGF0YTogSW1hZ2VJZGVudGlmeVR5cGUgPSB7fSkgPT4ge1xuICAgICAgICAgIGlmKGVycm9yKSB7XG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGZvcm1hdFZhbHVlcyA9IGxvd2VyQ2FzZUtleXMoaW1hZ2VEYXRhKTtcbiAgICAgICAgICBjb25zdCB7bWFrZTogY2FtZXJhTWFrZSwgbW9kZWw6IGNhbWVyYU1vZGVsLCBkYXRldGltZW9yaWdpbmFsOiB0YWtlbn06IEltYWdlSWRlbnRpZnlUeXBlID0gZm9ybWF0VmFsdWVzO1xuICAgICAgICAgIGNvbnN0IHN0YXRzID0gZm9ybWF0VmFsdWVzWydjaGFubmVsIHN0YXRpc3RpY3MnXTtcbiAgICAgICAgICBsZXQgY29sb3I6IHN0cmluZztcblxuICAgICAgICAgIGlmKHN0YXRzKSB7XG4gICAgICAgICAgICBsZXQge3JlZCwgZ3JlZW4sIGJsdWUsIG1lYW59ID0gc3RhdHM7XG5cbiAgICAgICAgICAgIGlmKHJlZCkge1xuICAgICAgICAgICAgICBtZWFuID0gcmVkWydzdGFuZGFyZCBkZXZpYXRpb24nXSB8fCByZWQubWVhbjtcbiAgICAgICAgICAgICAgcmVkID0gbWVhbiA/ICsoKG1lYW4uc3BsaXQoJyAnKVswXSkuc3Vic3RyaW5nKDAsIDMpKSA6IDA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZWQgPSAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZihncmVlbikge1xuICAgICAgICAgICAgICBtZWFuID0gZ3JlZW5bJ3N0YW5kYXJkIGRldmlhdGlvbiddIHx8IGdyZWVuLm1lYW47XG4gICAgICAgICAgICAgIGdyZWVuID0gbWVhbiA/ICsoKG1lYW4uc3BsaXQoJyAnKVswXSkuc3Vic3RyaW5nKDAsIDMpKSA6IDA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBncmVlbiA9IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmKGJsdWUpIHtcbiAgICAgICAgICAgICAgbWVhbiA9IGJsdWVbJ3N0YW5kYXJkIGRldmlhdGlvbiddIHx8IGJsdWUubWVhbjtcbiAgICAgICAgICAgICAgYmx1ZSA9IG1lYW4gPyArKChtZWFuLnNwbGl0KCcgJylbMF0pLnN1YnN0cmluZygwLCAzKSkgOiAwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYmx1ZSA9IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJnYiA9IGJsdWUgfCAoZ3JlZW4gPDwgOCkgfCAocmVkIDw8IDE2KTtcbiAgICAgICAgICAgIGNvbnN0IHJnYkNvbG9yID0gcmdiLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgICAgIGNvbG9yID0gcmdiQ29sb3IgPT09ICcwJyA/ICcwMDAwMDAnIDogcmdiQ29sb3I7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgJ0pQRUctUXVhbGl0eSc6IHF1YWxpdHksXG4gICAgICAgICAgICBPcmllbnRhdGlvbjogb3JpZW50YXRpb25EYXRhLFxuICAgICAgICAgICAgUmVzb2x1dGlvbjogcmVzb2x1dGlvbkRhdGEsXG4gICAgICAgICAgICBzaXplXG4gICAgICAgICAgfSA9IGltYWdlRGF0YTtcbiAgICAgICAgICBsZXQgcmVzb2x1dGlvbjtcblxuICAgICAgICAgIGlmKHJlc29sdXRpb25EYXRhKSB7XG4gICAgICAgICAgICBjb25zdCBbcmVzb2x1dGlvbk51bWJlciwgcmVzb2x1dGlvblVuaXRdID0gcmVzb2x1dGlvbkRhdGEuc3BsaXQoJyAnKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdXRpb25WYWx1ZSA9IHJlc29sdXRpb25OdW1iZXIuc3BsaXQoJ3gnKVswXTtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdXRpb25Vbml0VmFsdWUgPSByZXNvbHV0aW9uVW5pdCA9PT0gJ3BpeGVscy9pbmNoJyA/ICdwcGknIDogJyc7XG4gICAgICAgICAgICByZXNvbHV0aW9uID0gYCR7cmVzb2x1dGlvblZhbHVlfSAke3Jlc29sdXRpb25Vbml0VmFsdWV9YDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh7XG4gICAgICAgICAgICBjb2xvcixcbiAgICAgICAgICAgIGZpbGVTaXplOiBpbWFnZU9wdGltaXplZEJ1ZmZlci5sZW5ndGgsXG4gICAgICAgICAgICBmaWxlVHlwZTogZm9ybWF0LFxuICAgICAgICAgICAgaGVpZ2h0OiBzaXplPy5oZWlnaHQgfHwgMCxcbiAgICAgICAgICAgIGltYWdlSWQsXG4gICAgICAgICAgICBtYWtlOiBjYW1lcmFNYWtlLFxuICAgICAgICAgICAgbW9kZWw6IGNhbWVyYU1vZGVsLFxuICAgICAgICAgICAgb3JpZW50YXRpb246IG9yaWVudGF0aW9uRGF0YSA9PT0gJ1Vua25vd24nID8gdW5kZWZpbmVkIDogb3JpZW50YXRpb25EYXRhPy50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgcXVhbGl0eTogcXVhbGl0eSA/ICtxdWFsaXR5IDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgcmVzb2x1dGlvbixcbiAgICAgICAgICAgIHRha2VuOiB0YWtlbiA/IERhdGVUaW1lLmZyb21NaWxsaXModGFrZW4pLm1pbGxpc2Vjb25kIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgd2lkdGg6IHNpemU/LndpZHRoIHx8IDBcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0aHVtYk9wdGltaXplZEJ1ZmZlciA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHRobVcgPSBDb25maWcuZ2V0KCdpbWFnZS50aG1TaXplJyk7XG4gICAgICBjb25zdCB0aG1RID0gQ29uZmlnLmdldCgnaW1hZ2UudGhtUXVhbGl0eScpO1xuXG4gICAgICBnbShpbWFnZU9wdGltaXplZEJ1ZmZlciwgJ2ltZycpXG4gICAgICAgIC5zZXRGb3JtYXQoZm9ybWF0KVxuICAgICAgICAuZ3Jhdml0eSgnQ2VudGVyJylcbiAgICAgICAgLnJlc2l6ZSh0aG1XLCB0aG1XLCAnXicpXG4gICAgICAgIC5leHRlbnQodGhtVywgdGhtVylcbiAgICAgICAgLnF1YWxpdHkodGhtUSlcbiAgICAgICAgLnN0cmVhbSgoc3RyZWFtRXJyb3I6IEVycm9yLCB0aHVtYlN0ZG91dCk6IHZvaWQgPT4ge1xuICAgICAgICAgIGlmKHN0cmVhbUVycm9yKSB7XG4gICAgICAgICAgICByZWplY3Qoc3RyZWFtRXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxldCB0aHVtYkJ1ZmZlcjogQnVmZmVyID0gQnVmZmVyLmZyb20oJycpO1xuXG4gICAgICAgICAgdGh1bWJTdGRvdXQub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgdGh1bWJCdWZmZXIgPSBCdWZmZXIuY29uY2F0KFt0aHVtYkJ1ZmZlciwgZGF0YV0pO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdGh1bWJTdGRvdXQub24oJ2VuZCcsICgpID0+IHJlc29sdmUodGh1bWJCdWZmZXIpKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBpZighaXNNaXNzaW5nR3JhcGhpY3NCaW5hcnkoZXJyb3IpKSB7XG4gICAgICByZXR1cm4gbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBwYXJhbXM6IHtmaWxlVHlwZSwgaW1hZ2VJZH0sXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLklNQUdFX1NBVkVcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICBjb25zb2xlLndhcm4oJ3Jlc2l6ZUFuZFNhdmVJbWFnZTo6Z21NZXRhZGF0YVVuYXZhaWxhYmxlOjp1c2luZ09yaWdpbmFsVGh1bWInLCB7ZmlsZVR5cGUsIGltYWdlSWR9KTtcbiAgICB0aHVtYk9wdGltaXplZEJ1ZmZlciA9IGltYWdlT3B0aW1pemVkQnVmZmVyO1xuICAgIGltYWdlSWRlbnRpdHkgPSB7XG4gICAgICBmaWxlU2l6ZTogaW1hZ2VPcHRpbWl6ZWRCdWZmZXIubGVuZ3RoLFxuICAgICAgZmlsZVR5cGU6IGZvcm1hdCxcbiAgICAgIGltYWdlSWRcbiAgICB9O1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCB0aHVtYk9iajogUHV0T2JqZWN0Q29tbWFuZElucHV0ID0ge1xuICAgICAgQm9keTogdGh1bWJPcHRpbWl6ZWRCdWZmZXIsXG4gICAgICBCdWNrZXQ6IG51bGwsXG4gICAgICBDb250ZW50VHlwZTogZmlsZVR5cGUsXG4gICAgICAuLi4oczNPcHRpb25zIHx8IHt9KSxcbiAgICAgIEtleTogZ2V0VXNlckltYWdlUGF0aChzZXNzaW9uSWQsIGltYWdlSWQsIGZpbGVUeXBlLCAndGh1bWJzJylcbiAgICB9O1xuICAgIGF3YWl0IHMzUHV0KHRodW1iT2JqKTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIHJldHVybiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLklNQUdFX1NBVkVcbiAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gIH1cblxuICByZXR1cm4gaW1hZ2VJZGVudGl0eTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRJbWFnZSA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaW1hZ2U6IEltYWdlVHlwZSxcbiAgczNPcHRpb25zPzogUHV0T2JqZWN0Q29tbWFuZElucHV0XG4pOiBQcm9taXNlPEltYWdlVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnYWRkSW1hZ2UnO1xuICBjb25zdCB7c2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCB7aW1hZ2VJZCwgZGVzY3JpcHRpb24sIGJ1ZmZlciwgZmlsZVR5cGUsIGl0ZW1JZCwgaXRlbVR5cGUsIHByaXZhY3kgPSAncHVibGljJ30gPSBpbWFnZTtcblxuICByZXR1cm4gcmVzaXplQW5kU2F2ZUltYWdlKGNvbnRleHQsIGltYWdlSWQsIGJ1ZmZlciwgZmlsZVR5cGUsIHMzT3B0aW9ucylcbiAgICAudGhlbigocmVzaXplZEltYWdlOiBJbWFnZVR5cGUpID0+IHtcbiAgICAgIGNvbnN0IGluc2VydDogSW1hZ2VUeXBlID0ge1xuICAgICAgICAuLi5yZXNpemVkSW1hZ2UsXG4gICAgICAgIF9rZXk6IGltYWdlSWQsXG4gICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICBmaWxlVHlwZSxcbiAgICAgICAgcHJpdmFjeTogbm9ybWFsaXplSW1hZ2VQcml2YWN5KHByaXZhY3kpLFxuICAgICAgICB1c2VySWQ6IHNlc3Npb25JZFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGFkZEl0ZW08SW1hZ2VUeXBlPihjb250ZXh0LCAnaW1hZ2VzJywgaW5zZXJ0KVxuICAgICAgICAudGhlbigoc2F2ZWRJbWFnZTogSW1hZ2VUeXBlKSA9PiBhZGRJbWFnZUVkZ2UoY29udGV4dCwge1xuICAgICAgICAgIGltYWdlSWQsXG4gICAgICAgICAgaXRlbUlkOiBpdGVtSWQgfHwgc2Vzc2lvbklkLFxuICAgICAgICAgIGl0ZW1UeXBlOiBwYXJzZVN0cmluZyhpdGVtVHlwZSB8fCAndXNlcnMnLCAzMikudG9Mb3dlckNhc2UoKSBhcyBBcmFuZ29EYkNvbGxlY3Rpb24sXG4gICAgICAgICAgdHlwZTogJ2ltYWdlJ1xuICAgICAgICB9KS50aGVuKCgpID0+IHNhdmVkSW1hZ2UpKTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLklNQUdFX1JFU0laRVxuICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkSW1hZ2VFZGdlID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIGltYWdlRWRnZTogSW1hZ2VFZGdlVHlwZSk6IFByb21pc2U8b2JqZWN0PiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdhZGRJbWFnZUVkZ2UnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtpbWFnZUlkLCBpdGVtSWQsIGl0ZW1UeXBlfSA9IGltYWdlRWRnZTtcbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgZWRnZUlkID0gY3JlYXRlSGFzaChgaGFzTWVkaWEtaW1hZ2UtJHtpbWFnZUlkfS0ke2l0ZW1JZH0tJHtzZXNzaW9uSWR9YCk7XG4gIGNvbnN0IGZvcm1hdEl0ZW1UeXBlOiBBcmFuZ29EYkNvbGxlY3Rpb24gPSBwYXJzZUNoYXIoaXRlbVR5cGUpLnRvTG93ZXJDYXNlKCkgYXMgQXJhbmdvRGJDb2xsZWN0aW9uO1xuICBjb25zdCBmb3JtYXRJdGVtSWQgPSBwYXJzZUlkKGl0ZW1JZCk7XG4gIGNvbnN0IGl0ZW1Eb2NJZCA9IGdldERvY0lkKGZvcm1hdEl0ZW1UeXBlLCB7X2tleTogZm9ybWF0SXRlbUlkfSk7XG4gIGNvbnN0IGZvcm1hdEltYWdlSWQgPSBwYXJzZUlkKGltYWdlSWQpO1xuICBjb25zdCBmaWxlRG9jSWQgPSBgaW1hZ2VzLyR7Zm9ybWF0SW1hZ2VJZH1gO1xuXG4gIGNvbnN0IGVkZ2U6IEltYWdlRWRnZVR5cGUgPSB7XG4gICAgX2Zyb206IGl0ZW1Eb2NJZCxcbiAgICBfa2V5OiBlZGdlSWQsXG4gICAgX3RvOiBmaWxlRG9jSWQsXG4gICAgYWRkZWQ6IG5vdyxcbiAgICBpdGVtVHlwZSxcbiAgICB0eXBlOiAnaW1hZ2UnXG4gIH07XG5cbiAgaWYoaXRlbURvY0lkKSB7XG4gICAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkuY29sbGVjdGlvbihFREdFUy5IQVNfTUVESUEpLnNhdmUoZWRnZSwge3JldHVybk5ldzogdHJ1ZX0pXG4gICAgICAudGhlbigoZmlsZUVkZ2UpID0+IHVzZURiKGRhdGFiYXNlTmFtZSkuY29sbGVjdGlvbihFREdFUy5IQVNfTUVESUEpLmRvY3VtZW50KGZpbGVFZGdlKSlcbiAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIGVkZ2UsXG4gICAgICAgICAgZmlsZURvY0lkLFxuICAgICAgICAgIGltYWdlSWQsXG4gICAgICAgICAgaXRlbURvY0lkLFxuICAgICAgICAgIGl0ZW1JZCxcbiAgICAgICAgICBpdGVtVHlwZVxuICAgICAgICB9LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZUltYWdlID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBpbWFnZTogSW1hZ2VUeXBlLFxuICBzM09wdGlvbnM/OiBQdXRPYmplY3RDb21tYW5kSW5wdXRcbik6IFByb21pc2U8SW1hZ2VUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICd1cGRhdGVJbWFnZSc7XG4gIGNvbnN0IHtzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtcbiAgICBiYXNlNjQgPSAnJyxcbiAgICBidWZmZXI6IGltYWdlQnVmZmVyLFxuICAgIGRlc2NyaXB0aW9uLFxuICAgIGltYWdlSWQsXG4gICAgaXRlbUlkLFxuICAgIGl0ZW1UeXBlLFxuICAgIGZpbGVUeXBlLFxuICAgIHByaXZhY3ksXG4gICAgdXJsID0gJydcbiAgfSA9IGltYWdlO1xuXG4gIGNvbnN0IGZvcm1hdEltYWdlSWQgPSBpbWFnZUlkIHx8IGNyZWF0ZUhhc2goYGltYWdlLSR7c2Vzc2lvbklkfWApO1xuICBjb25zdCBmb3JtYXRJdGVtSWQgPSBwYXJzZUlkKGl0ZW1JZCk7XG4gIGNvbnN0IGZvcm1hdEl0ZW1UeXBlOiBBcmFuZ29EYkNvbGxlY3Rpb24gPSBwYXJzZUNoYXIoaXRlbVR5cGUsIDE2KS50b0xvd2VyQ2FzZSgpIGFzIEFyYW5nb0RiQ29sbGVjdGlvbjtcbiAgY29uc3QgY3VzdG9tUGFyYW1zOiBJbWFnZVR5cGUgPSB7XG4gICAgZGVzY3JpcHRpb24sXG4gICAgaW1hZ2VJZDogZm9ybWF0SW1hZ2VJZCxcbiAgICBwcml2YWN5OiBub3JtYWxpemVJbWFnZVByaXZhY3kocHJpdmFjeSksXG4gICAgdXNlcklkOiBzZXNzaW9uSWRcbiAgfTtcblxuICBpZihiYXNlNjQgfHwgaW1hZ2VCdWZmZXIpIHtcbiAgICBsZXQgYnVmZmVyOiBCdWZmZXIgPSBpbWFnZUJ1ZmZlcjtcblxuICAgIGlmKGJhc2U2NCkge1xuICAgICAgY29uc3QgZm9ybWF0QmFzZTY0ID0gYmFzZTY0LnN1YnN0cihiYXNlNjQuaW5kZXhPZignLCcpICsgMSk7XG4gICAgICBidWZmZXIgPSBCdWZmZXIuZnJvbShmb3JtYXRCYXNlNjQsICdiYXNlNjQnKTtcbiAgICB9XG5cbiAgICBsZXQgdXBkYXRlZEZpbGVUeXBlID0gZmlsZVR5cGU7XG5cbiAgICBpZighZmlsZVR5cGUpIHtcbiAgICAgIGNvbnN0IHtmaWxlVHlwZUZyb21CdWZmZXJ9ID0gYXdhaXQgaW1wb3J0KCdmaWxlLXR5cGUnKTtcbiAgICAgIGNvbnN0IHttaW1lfSA9IGF3YWl0IGZpbGVUeXBlRnJvbUJ1ZmZlcihidWZmZXIpO1xuICAgICAgdXBkYXRlZEZpbGVUeXBlID0gbWltZTtcbiAgICB9XG5cbiAgICBjb25zdCBpbWdQYXJhbXM6IEltYWdlVHlwZSA9IHtcbiAgICAgIC4uLmN1c3RvbVBhcmFtcyxcbiAgICAgIGJ1ZmZlcixcbiAgICAgIGZpbGVUeXBlOiB1cGRhdGVkRmlsZVR5cGVcbiAgICB9O1xuXG4gICAgcmV0dXJuIGFkZEltYWdlKGNvbnRleHQsIGltZ1BhcmFtcywgczNPcHRpb25zKVxuICAgICAgLnRoZW4oKGltYWdlOiBJbWFnZVR5cGUpID0+IHtcbiAgICAgICAgaWYoZm9ybWF0SXRlbUlkICYmIGZvcm1hdEl0ZW1UeXBlKSB7XG4gICAgICAgICAgY29uc3QgaW1hZ2VFZGdlOiBJbWFnZUVkZ2VUeXBlID0ge1xuICAgICAgICAgICAgaW1hZ2VJZDogZm9ybWF0SW1hZ2VJZCxcbiAgICAgICAgICAgIGl0ZW1JZDogZm9ybWF0SXRlbUlkLFxuICAgICAgICAgICAgaXRlbVR5cGU6IGZvcm1hdEl0ZW1UeXBlLFxuICAgICAgICAgICAgdHlwZTogJ2ltYWdlJ1xuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIGFkZEltYWdlRWRnZShjb250ZXh0LCBpbWFnZUVkZ2UpLnRoZW4oKCkgPT4gaW1hZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGltYWdlO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuSU1BR0VfU0FWRVxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcbiAgfSBlbHNlIGlmKHVybCAhPT0gJycpIHtcbiAgICBsZXQgY29udGVudFR5cGU7XG5cbiAgICByZXR1cm4gaHR0cEdldCh1cmwpXG4gICAgICAudGhlbigocmVzOiBIdHRwUmVzcG9uc2UpID0+IHtcbiAgICAgICAgaWYocmVzLnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgICAgICAgcmV0dXJuIGxvZ0V4Y2VwdGlvbih7XG4gICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLklNQUdFX1JFUVVFU1RcbiAgICAgICAgICB9LCBjb250ZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRlbnRUeXBlID0gcmVzLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKTtcblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICAgIC50aGVuKChyZXMpID0+IChyZXMgYXMgSHR0cFJlc3BvbnNlKS5idWZmZXIoKSlcbiAgICAgIC50aGVuKChidWZmZXI6IEJ1ZmZlcikgPT4ge1xuICAgICAgICBjb25zdCBpbWdQYXJhbXM6IEltYWdlVHlwZSA9IHtcbiAgICAgICAgICAuLi5jdXN0b21QYXJhbXMsXG4gICAgICAgICAgYnVmZmVyLFxuICAgICAgICAgIGZpbGVUeXBlOiBjb250ZW50VHlwZVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBhZGRJbWFnZShjb250ZXh0LCBpbWdQYXJhbXMsIHMzT3B0aW9ucylcbiAgICAgICAgICAudGhlbigoaW1hZ2U6IEltYWdlVHlwZSkgPT4ge1xuICAgICAgICAgICAgaWYoZm9ybWF0SXRlbUlkICYmIGZvcm1hdEl0ZW1UeXBlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGltYWdlRWRnZTogSW1hZ2VFZGdlVHlwZSA9IHtpbWFnZUlkOiBmb3JtYXRJbWFnZUlkLCBpdGVtSWQ6IGZvcm1hdEl0ZW1JZCwgaXRlbVR5cGU6IGZvcm1hdEl0ZW1UeXBlLCB0eXBlOiAnaW1hZ2UnfTtcbiAgICAgICAgICAgICAgcmV0dXJuIGFkZEltYWdlRWRnZShjb250ZXh0LCBpbWFnZUVkZ2UpLnRoZW4oKCkgPT4gaW1hZ2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gaW1hZ2U7XG4gICAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgdmFsdWU6ICdmZXRjaF9lcnJvcidcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG4gIH0gZWxzZSBpZihpbWFnZUlkKSB7XG4gICAgY29uc3QgdXBkYXRlID0ge1xuICAgICAgLi4uKGRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQgPyB7ZGVzY3JpcHRpb259IDoge30pLFxuICAgICAgLi4uKHByaXZhY3kgIT09IHVuZGVmaW5lZCA/IHtwcml2YWN5OiBub3JtYWxpemVJbWFnZVByaXZhY3kocHJpdmFjeSl9IDoge30pXG4gICAgfTtcblxuICAgIHJldHVybiB1cGRhdGVJdGVtPEltYWdlVHlwZT4oY29udGV4dCwgJ2ltYWdlcycsIGZvcm1hdEltYWdlSWQsIHVwZGF0ZSk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBkZWxldGVJbWFnZSA9IGFzeW5jIChjb250ZXh0OiBBcGlDb250ZXh0LCBpbWFnZUlkOiBzdHJpbmcpOiBQcm9taXNlPEltYWdlVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZGVsZXRlJztcbiAgY29uc3Qge3Nlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0SW1hZ2VJZCA9IHBhcnNlSWQoaW1hZ2VJZCk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBpbWFnZSA9IGF3YWl0IGRlbGV0ZUl0ZW08SW1hZ2VUeXBlPihjb250ZXh0LCAnaW1hZ2VzJywgZm9ybWF0SW1hZ2VJZCwge1xuICAgICAgY2FzY2FkZTogW0VER0VTLkhBU19NRURJQV0sXG4gICAgICBvd25lcnNoaXA6IHRydWVcbiAgICB9KTtcblxuICAgIGlmKCFpbWFnZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gRGVsZXRlIFMzIGZpbGVzXG4gICAgY29uc3Qge19rZXk6IGltYWdlS2V5fSA9IGltYWdlO1xuICAgIGNvbnN0IHBhcmFtczogRGVsZXRlT2JqZWN0c0NvbW1hbmRJbnB1dCA9IHtcbiAgICAgIEJ1Y2tldDogbnVsbCxcbiAgICAgIERlbGV0ZToge1xuICAgICAgICBPYmplY3RzOiBbXG4gICAgICAgICAge0tleTogYHVzZXJzLyR7c2Vzc2lvbklkfS9pbWFnZXMvJHtpbWFnZUtleX0uanBnYH0sXG4gICAgICAgICAge0tleTogYHVzZXJzLyR7c2Vzc2lvbklkfS90aHVtYnMvJHtpbWFnZUtleX0uanBnYH1cbiAgICAgICAgXSxcbiAgICAgICAgUXVpZXQ6IHRydWVcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIHMzRGVsZXRlTGlzdChwYXJhbXMpLnRoZW4oKCkgPT4gaW1hZ2UpO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgcmV0dXJuIGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7aW1hZ2VJZH0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgfVxufTtcbiJdLCJuYW1lcyI6WyJnZXQiLCJodHRwR2V0IiwicGFyc2VOdW0iLCJsb3dlckNhc2VLZXlzIiwiY3JlYXRlSGFzaCIsInBhcnNlQXJhbmdvSWQiLCJwYXJzZUNoYXIiLCJwYXJzZUlkIiwicGFyc2VTdHJpbmciLCJhcWwiLCJsaXRlcmFsIiwiZ20iLCJEYXRlVGltZSIsIkNvbmZpZyIsIkNPTExFQ1RJT05TIiwiRURHRVMiLCJFcnJvclR5cGVzIiwibG9nRXJyb3IiLCJsb2dFeGNlcHRpb24iLCJnZXREb2NJZCIsImdldExpbWl0Iiwic2VsZWN0UmVhY3Rpb25Db3VudEJ5VHlwZSIsInVzZURiIiwiZ2V0SW1hZ2VFeHRlbnNpb24iLCJhZGRJdGVtIiwiZGVsZXRlSXRlbSIsImdldEl0ZW1CeSIsImdldExpc3RCeSIsInVwZGF0ZUl0ZW0iLCJnZXRHcm91cERldGFpbHMiLCJpc0dyb3VwZWQiLCJnZXRQZXJzb25hUmVsYXRpb25zaGlwU3RhdGUiLCJzM0RlbGV0ZUxpc3QiLCJzM0dldFNpZ25lZFVybCIsInMzUHV0IiwiaGFzU3Vic2NyaXB0aW9uVG9JdGVtIiwiZXZlbnRDYXRlZ29yeSIsImhhc1JlYWN0aW9uQ29sbGVjdGlvbiIsIkhBU19SRUFDVElPTiIsImhhc01lZGlhQ29sbGVjdGlvbiIsIkhBU19NRURJQSIsInBlcnNvbmFzQ29sbGVjdGlvbiIsIlBFUlNPTkFTIiwic3ViQ2xhc3MiLCJpbWFnZU1hZ2ljayIsIk1FRElBX0lURU1fQ09MTEVDVElPTlMiLCJVU0VSUyIsIlBPU1RTIiwiR1JPVVBTIiwiZ2V0TWVkaWFJdGVtRG9jSWRzIiwiaXRlbUlkIiwiaXRlbVR5cGUiLCJkb2NJZCIsIml0ZW1LZXkiLCJpbmNsdWRlcyIsIm1hcCIsImNvbGxlY3Rpb24iLCJpc01pc3NpbmdHcmFwaGljc0JpbmFyeSIsImVycm9yIiwibWVzc2FnZSIsIkVycm9yIiwiU3RyaW5nIiwibm9ybWFsaXplSW1hZ2VQcml2YWN5IiwicHJpdmFjeSIsInRyaW0iLCJ0b0xvd2VyQ2FzZSIsImNhblZpZXdJbWFnZSIsImltYWdlIiwidmlld2VyVXNlcklkIiwiYWNjZXNzIiwiaXNPd25lciIsInVzZXJJZCIsImNhblZpZXdGcmllbmRzIiwiY2FuVmlld1ZpcCIsInBhcnNlSW1hZ2VPcHRpb25zIiwib3B0aW9ucyIsImZyb20iLCJ0byIsInR5cGUiLCJsaW1pdCIsImdldEltYWdlT3B0aW9uYWxGaWVsZHMiLCJmaWVsZHMiLCJyZWR1Y2UiLCJzZWxlY3RzIiwiZmllbGQiLCJxdWVyaWVzIiwicHVzaCIsIm9iamVjdHMiLCJnZXRJbWFnZUxpc3RCeVVzZXIiLCJjb250ZXh0IiwiYWN0aW9uIiwiZm9ybWF0VXNlcklkIiwic29ydCIsImRpcmVjdGlvbiIsImN1c3RvbVF1ZXJpZXMiLCJjdXN0b21PYmplY3RzIiwiY2F0Y2giLCJjYXRlZ29yeSIsInBhcmFtcyIsInZhbHVlIiwiREFUQUJBU0VfRVJST1IiLCJnZXRJbWFnZUNvdW50QnlJdGVtIiwiZGF0YWJhc2VOYW1lIiwiaXRlbURvY0lkcyIsImFxbFFyeSIsInF1ZXJ5IiwidGhlbiIsImN1cnNvciIsIm5leHQiLCJjb3VudCIsImdldEltYWdlTGlzdEJ5SXRlbSIsInNlc3Npb24iLCJzZXNzaW9uVXNlcklkIiwiZm9ybWF0SXRlbVR5cGUiLCJ1bmRlZmluZWQiLCJzZWxlY3RPYmplY3RzIiwic2VsZWN0UXVlcmllcyIsImpvaW4iLCJsZW5ndGgiLCJsaXN0IiwiYWxsIiwib3duZXJVc2VySWQiLCJmaWx0ZXIiLCJtZWRpYUl0ZW1LZXkiLCJfbWVkaWFJdGVtS2V5IiwibWVkaWFJdGVtVHlwZSIsIl9tZWRpYUl0ZW1UeXBlIiwicmVsYXRpb25zaGlwIiwiaXNGcmllbmQiLCJnZXRJbWFnZUxpc3RCeUdyb3VwIiwic2Vzc2lvbklkIiwiZmlsdGVycyIsImdyb3VwSWQiLCJmb3JtYXRHcm91cElkIiwiY29uZGl0aW9uYWwiLCJuYW1lIiwiZm9ybWF0Q29uZCIsImdyb3VwIiwiZmlsdGVyU3RyIiwiZ3JvdXBlZCIsImlzVmFsaWQiLCJmaWx0ZXJMaXN0IiwiZ2V0SW1hZ2VMaXN0QnlSZWFjdGlvbnMiLCJyZWFjdGlvbnMiLCJmb3JtYXRTZXNzaW9uSWQiLCJmb3JtYXRSZWFjdGlvbnMiLCJyZWFjdGlvbk5hbWUiLCJmaWx0ZXJCeSIsIkpTT04iLCJzdHJpbmdpZnkiLCJnZXRQZXJzb25hRG9jSWQiLCJwZXJzb25hSWQiLCJwZXJzb25hRG9jSWQiLCJwZXJzb25hS2V5IiwiZ2V0SW1hZ2VMaXN0QnlQZXJzb25hUmVhY3Rpb25zIiwic2Vzc2lvblBlcnNvbmFJZCIsInJlYWN0aW9uTmFtZXMiLCJBcnJheSIsImlzQXJyYXkiLCJCb29sZWFuIiwiZ2V0SW1hZ2VCeUlkIiwiaW1hZ2VJZCIsImZvcm1hdEltYWdlSWQiLCJvcGVyYXRvciIsImdldFVzZXJJbWFnZVBhdGgiLCJpbWFnZVR5cGUiLCJkaXIiLCJmaWxlbmFtZSIsImdldEFwcEltYWdlVXJsIiwiYnVja2V0IiwiZGlyZWN0b3J5IiwiaXNUaHVtYiIsInR5cGVJZCIsImJ1Y2tldE5hbWUiLCJpbWFnZU5hbWUiLCJpbWFnZVVybCIsImdldEltYWdlVXJsIiwiaW1hZ2VEaXIiLCJ1cmxUeXBlIiwiY29uZmlndXJlZEltYWdlVXJsIiwiY29uZmlndXJlZEFwcFVybCIsInB1YmxpY0Jhc2VVcmwiLCJkZXZCYXNlVXJsIiwidGh1bWJTdWZmaXgiLCJpbWFnZUtleSIsIkJ1Y2tldCIsIkV4cGlyZXMiLCJLZXkiLCJyZXNpemVBbmRTYXZlSW1hZ2UiLCJidWZmZXIiLCJmaWxlVHlwZSIsInMzT3B0aW9ucyIsImltZ1ciLCJpbWdRIiwiZm9ybWF0Iiwic3BsaXQiLCJpbWFnZU9wdGltaXplZEJ1ZmZlciIsInRodW1iT3B0aW1pemVkQnVmZmVyIiwiaW1hZ2VJZGVudGl0eSIsImZpbGVTaXplIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJzZXRGb3JtYXQiLCJxdWFsaXR5IiwiYXV0b09yaWVudCIsInJlc2l6ZSIsInN0cmVhbSIsInN0cmVhbUVycm9yIiwic3Rkb3V0IiwibmV4dEltYWdlQnVmZmVyIiwiQnVmZmVyIiwib24iLCJkYXRhIiwiY29uY2F0IiwiSU1BR0VfU0FWRSIsImNvbnNvbGUiLCJ3YXJuIiwiaW1hZ2VPYmoiLCJCb2R5IiwiQ29udGVudFR5cGUiLCJpZGVudGlmeSIsImJ1ZmZlclN0cmVhbSIsImltYWdlRGF0YSIsImZvcm1hdFZhbHVlcyIsIm1ha2UiLCJjYW1lcmFNYWtlIiwibW9kZWwiLCJjYW1lcmFNb2RlbCIsImRhdGV0aW1lb3JpZ2luYWwiLCJ0YWtlbiIsInN0YXRzIiwiY29sb3IiLCJyZWQiLCJncmVlbiIsImJsdWUiLCJtZWFuIiwic3Vic3RyaW5nIiwicmdiIiwicmdiQ29sb3IiLCJ0b1N0cmluZyIsIk9yaWVudGF0aW9uIiwib3JpZW50YXRpb25EYXRhIiwiUmVzb2x1dGlvbiIsInJlc29sdXRpb25EYXRhIiwic2l6ZSIsInJlc29sdXRpb24iLCJyZXNvbHV0aW9uTnVtYmVyIiwicmVzb2x1dGlvblVuaXQiLCJyZXNvbHV0aW9uVmFsdWUiLCJyZXNvbHV0aW9uVW5pdFZhbHVlIiwiaGVpZ2h0Iiwib3JpZW50YXRpb24iLCJmcm9tTWlsbGlzIiwibWlsbGlzZWNvbmQiLCJ3aWR0aCIsInRobVciLCJ0aG1RIiwiZ3Jhdml0eSIsImV4dGVudCIsInRodW1iU3Rkb3V0IiwidGh1bWJCdWZmZXIiLCJ0aHVtYk9iaiIsImFkZEltYWdlIiwiZGVzY3JpcHRpb24iLCJyZXNpemVkSW1hZ2UiLCJpbnNlcnQiLCJfa2V5Iiwic2F2ZWRJbWFnZSIsImFkZEltYWdlRWRnZSIsIklNQUdFX1JFU0laRSIsImltYWdlRWRnZSIsIm5vdyIsIkRhdGUiLCJlZGdlSWQiLCJmb3JtYXRJdGVtSWQiLCJpdGVtRG9jSWQiLCJmaWxlRG9jSWQiLCJlZGdlIiwiX2Zyb20iLCJfdG8iLCJhZGRlZCIsInNhdmUiLCJyZXR1cm5OZXciLCJmaWxlRWRnZSIsImRvY3VtZW50IiwidXBkYXRlSW1hZ2UiLCJiYXNlNjQiLCJpbWFnZUJ1ZmZlciIsInVybCIsImN1c3RvbVBhcmFtcyIsImZvcm1hdEJhc2U2NCIsInN1YnN0ciIsImluZGV4T2YiLCJ1cGRhdGVkRmlsZVR5cGUiLCJmaWxlVHlwZUZyb21CdWZmZXIiLCJtaW1lIiwiaW1nUGFyYW1zIiwiY29udGVudFR5cGUiLCJyZXMiLCJzdGF0dXMiLCJJTUFHRV9SRVFVRVNUIiwiaGVhZGVycyIsInVwZGF0ZSIsImRlbGV0ZUltYWdlIiwiY2FzY2FkZSIsIm93bmVyc2hpcCIsIkRlbGV0ZSIsIk9iamVjdHMiLCJRdWlldCJdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBRUQsU0FBUUEsT0FBT0MsT0FBTyxRQUFPLG9CQUFvQjtBQUNqRCxTQUFRQyxRQUFR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
873
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3Ivc3JjL2FjdGlvbnMvaW1hZ2VzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge0RlbGV0ZU9iamVjdHNDb21tYW5kSW5wdXQsIFB1dE9iamVjdENvbW1hbmRJbnB1dH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXMzJztcbmltcG9ydCB7Z2V0IGFzIGh0dHBHZXR9IGZyb20gJ0BubGFicy9yaXAtaHVudGVyJztcbmltcG9ydCB7cGFyc2VOdW19IGZyb20gJ0BubGFicy91dGlscy9wYXJzZXJzL251bWJlcnMnO1xuaW1wb3J0IHtjcmVhdGVIYXNoLCBwYXJzZUFyYW5nb0lkLCBwYXJzZUNoYXIsIHBhcnNlSWQsIHBhcnNlU3RyaW5nfSBmcm9tICdAbmxhYnMvdXRpbHMvcGFyc2Vycy9zdHJpbmdzJztcbmltcG9ydCB7YXFsfSBmcm9tICdhcmFuZ29qcyc7XG5pbXBvcnQge0FxbFF1ZXJ5LCBsaXRlcmFsfSBmcm9tICdhcmFuZ29qcy9hcWwnO1xuaW1wb3J0IGV4aWZSZWFkZXIgZnJvbSAnZXhpZi1yZWFkZXInO1xuaW1wb3J0IHNoYXJwIGZyb20gJ3NoYXJwJztcblxuaW1wb3J0IHtDb25maWd9IGZyb20gJy4uL2NvbmZpZy5qcyc7XG5pbXBvcnQge0NPTExFQ1RJT05TLCBFREdFU30gZnJvbSAnLi4vY29uc3RhbnRzL2NvbGxlY3Rpb25zLmpzJztcbmltcG9ydCB7RXJyb3JUeXBlc30gZnJvbSAnLi4vdHlwZXMvZXJyb3IudHlwZXMuanMnO1xuaW1wb3J0IHtsb2dFcnJvciwgbG9nRXhjZXB0aW9ufSBmcm9tICcuLi91dGlscy9hbmFseXRpY3NVdGlscy5qcyc7XG5pbXBvcnQge2dldERvY0lkLCBnZXRMaW1pdCwgc2VsZWN0UmVhY3Rpb25Db3VudEJ5VHlwZSwgdXNlRGJ9IGZyb20gJy4uL3V0aWxzL2FyYW5nb2RiVXRpbHMuanMnO1xuaW1wb3J0IHtnZXRJbWFnZUV4dGVuc2lvbn0gZnJvbSAnLi4vdXRpbHMvaW1hZ2VVdGlscy5qcyc7XG5pbXBvcnQge2FkZEl0ZW0sIGRlbGV0ZUl0ZW0sIGdldEl0ZW1CeSwgZ2V0TGlzdEJ5LCB1cGRhdGVJdGVtfSBmcm9tICcuL2NydWQuanMnO1xuaW1wb3J0IHtnZXRHcm91cERldGFpbHMsIGlzR3JvdXBlZH0gZnJvbSAnLi9ncm91cHMuanMnO1xuaW1wb3J0IHtnZXRQZXJzb25hUmVsYXRpb25zaGlwU3RhdGV9IGZyb20gJy4vcGVyc29uYXMuanMnO1xuaW1wb3J0IHtzM0RlbGV0ZUxpc3QsIHMzR2V0U2lnbmVkVXJsLCBzM1B1dH0gZnJvbSAnLi9zMy5qcyc7XG5pbXBvcnQge2hhc1N1YnNjcmlwdGlvblRvSXRlbX0gZnJvbSAnLi9zdWJzY3JpcHRpb25zLmpzJztcblxuaW1wb3J0IHR5cGUge1F1ZXJ5RmlsdGVyfSBmcm9tICcuLi90eXBlcy9hcHBzLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtBcmFuZ29EYkNvbGxlY3Rpb24sIEFyYW5nb0RiTGltaXR9IGZyb20gJy4uL3R5cGVzL2FyYW5nb2RiLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtBcGlDb250ZXh0fSBmcm9tICcuLi90eXBlcy9hdXRoLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtHcm91cFR5cGUsIEdyb3VwVXNlcn0gZnJvbSAnLi4vdHlwZXMvZ3JvdXBzLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtJbWFnZUVkZ2VUeXBlLCBJbWFnZU9wdGlvbnMsIEltYWdlVHlwZSwgSW1hZ2VVcmxEYXRhfSBmcm9tICcuLi90eXBlcy9pbWFnZXMudHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge0ZpbHRlckdyb3VwfSBmcm9tICcuLi91dGlscy9hcWxIZWxwZXJzLmpzJztcblxuLy8gRGVmaW5lIGludGVyZmFjZSBmb3IgSFRUUCByZXNwb25zZSB3aXRoIGJ1ZmZlciBtZXRob2RcbmludGVyZmFjZSBIdHRwUmVzcG9uc2UgZXh0ZW5kcyBSZXNwb25zZSB7XG4gIGJ1ZmZlcigpOiBQcm9taXNlPEJ1ZmZlcj47XG59XG5cbmNvbnN0IGV2ZW50Q2F0ZWdvcnkgPSAnaW1hZ2VzJztcbmNvbnN0IGhhc1JlYWN0aW9uQ29sbGVjdGlvbiA9IGxpdGVyYWwoRURHRVMuSEFTX1JFQUNUSU9OKTtcbmNvbnN0IGhhc01lZGlhQ29sbGVjdGlvbiA9IGxpdGVyYWwoRURHRVMuSEFTX01FRElBKTtcbmNvbnN0IHBlcnNvbmFzQ29sbGVjdGlvbiA9IGxpdGVyYWwoQ09MTEVDVElPTlMuUEVSU09OQVMpO1xuY29uc3QgTUVESUFfSVRFTV9DT0xMRUNUSU9OUzogcmVhZG9ubHkgQXJhbmdvRGJDb2xsZWN0aW9uW10gPSBbXG4gIENPTExFQ1RJT05TLlBFUlNPTkFTLFxuICBDT0xMRUNUSU9OUy5VU0VSUyxcbiAgQ09MTEVDVElPTlMuUE9TVFMsXG4gIENPTExFQ1RJT05TLkdST1VQU1xuXTtcblxudHlwZSBTaGFycEZvcm1hdCA9IEV4dHJhY3Q8UGFyYW1ldGVyczxSZXR1cm5UeXBlPHR5cGVvZiBzaGFycD5bJ3RvRm9ybWF0J10+WzBdLCBzdHJpbmc+O1xuXG5jb25zdCBnZXRNZWRpYUl0ZW1Eb2NJZHMgPSAoaXRlbUlkOiBzdHJpbmcsIGl0ZW1UeXBlPzogQXJhbmdvRGJDb2xsZWN0aW9uKTogc3RyaW5nW10gPT4ge1xuICBjb25zdCBkb2NJZCA9IHBhcnNlQXJhbmdvSWQoaXRlbUlkKTtcblxuICBpZihkb2NJZCkge1xuICAgIHJldHVybiBbZG9jSWRdO1xuICB9XG5cbiAgY29uc3QgaXRlbUtleSA9IHBhcnNlSWQoaXRlbUlkKTtcblxuICBpZighaXRlbUtleSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGlmKGl0ZW1UeXBlICYmIE1FRElBX0lURU1fQ09MTEVDVElPTlMuaW5jbHVkZXMoaXRlbVR5cGUpKSB7XG4gICAgcmV0dXJuIFtgJHtpdGVtVHlwZX0vJHtpdGVtS2V5fWBdO1xuICB9XG5cbiAgcmV0dXJuIE1FRElBX0lURU1fQ09MTEVDVElPTlMubWFwKChjb2xsZWN0aW9uKSA9PiBgJHtjb2xsZWN0aW9ufS8ke2l0ZW1LZXl9YCk7XG59O1xuXG5jb25zdCBub3JtYWxpemVJbWFnZUZvcm1hdCA9IChmb3JtYXQ6IHN0cmluZyk6IFNoYXJwRm9ybWF0ID0+XG4gIChmb3JtYXQgPT09ICdqcGcnID8gJ2pwZWcnIDogZm9ybWF0KSBhcyBTaGFycEZvcm1hdDtcblxuY29uc3QgaW1hZ2VFeGlmTWV0YWRhdGEgPSAoZXhpZj86IEJ1ZmZlcikgPT4ge1xuICBpZighZXhpZikgcmV0dXJuIHt9O1xuXG4gIHRyeSB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBleGlmUmVhZGVyKGV4aWYpO1xuICAgIGNvbnN0IHRha2VuID0gbWV0YWRhdGEuUGhvdG8/LkRhdGVUaW1lT3JpZ2luYWw7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1ha2U6IG1ldGFkYXRhLkltYWdlPy5NYWtlLFxuICAgICAgbW9kZWw6IG1ldGFkYXRhLkltYWdlPy5Nb2RlbCxcbiAgICAgIHRha2VuOiB0YWtlbiBpbnN0YW5jZW9mIERhdGUgPyB0YWtlbi5nZXRUaW1lKCkgOiB1bmRlZmluZWRcbiAgICB9O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge307XG4gIH1cbn07XG5cbmNvbnN0IG5vcm1hbGl6ZUltYWdlUHJpdmFjeSA9IChwcml2YWN5OiB1bmtub3duKTogJ2ZyaWVuZHMnIHwgJ3ByaXZhdGUnIHwgJ3B1YmxpYycgfCAndmlwJyA9PiB7XG4gIHN3aXRjaChTdHJpbmcocHJpdmFjeSB8fCAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlICdmcmllbmRzJzpcbiAgICAgIHJldHVybiAnZnJpZW5kcyc7XG4gICAgY2FzZSAncHJpdmF0ZSc6XG4gICAgICByZXR1cm4gJ3ByaXZhdGUnO1xuICAgIGNhc2UgJ3ZpcCc6XG4gICAgICByZXR1cm4gJ3ZpcCc7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAncHVibGljJztcbiAgfVxufTtcblxuY29uc3QgY2FuVmlld0ltYWdlID0gKFxuICBpbWFnZTogSW1hZ2VUeXBlLFxuICB2aWV3ZXJVc2VySWQ6IHN0cmluZyxcbiAgYWNjZXNzOiB7XG4gICAgcmVhZG9ubHkgY2FuVmlld0ZyaWVuZHM6IGJvb2xlYW47XG4gICAgcmVhZG9ubHkgY2FuVmlld1ZpcDogYm9vbGVhbjtcbiAgICByZWFkb25seSBpc093bmVyOiBib29sZWFuO1xuICB9XG4pID0+IHtcbiAgY29uc3QgcHJpdmFjeSA9IG5vcm1hbGl6ZUltYWdlUHJpdmFjeShpbWFnZT8ucHJpdmFjeSk7XG5cbiAgaWYoYWNjZXNzLmlzT3duZXIgfHwgU3RyaW5nKGltYWdlPy51c2VySWQgfHwgJycpID09PSB2aWV3ZXJVc2VySWQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHN3aXRjaChwcml2YWN5KSB7XG4gICAgY2FzZSAncHJpdmF0ZSc6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgY2FzZSAnZnJpZW5kcyc6XG4gICAgICByZXR1cm4gYWNjZXNzLmNhblZpZXdGcmllbmRzO1xuICAgIGNhc2UgJ3ZpcCc6XG4gICAgICByZXR1cm4gYWNjZXNzLmNhblZpZXdWaXA7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgcGFyc2VJbWFnZU9wdGlvbnMgPSAob3B0aW9uczogSW1hZ2VPcHRpb25zID0ge30pID0+IHtcbiAgY29uc3Qge1xuICAgIGZyb20gPSAwLFxuICAgIHRvID0gMzAsXG4gICAgdHlwZSA9ICdkZWZhdWx0J1xuICB9ID0gb3B0aW9ucztcblxuICByZXR1cm4ge1xuICAgIGxpbWl0OiBnZXRMaW1pdChmcm9tLCB0bykgYXMgQXJhbmdvRGJMaW1pdCxcbiAgICB0eXBlOiBwYXJzZUNoYXIodHlwZSwgMzIpXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SW1hZ2VPcHRpb25hbEZpZWxkcyA9IChmaWVsZHM6IHN0cmluZ1tdID0gW10pID0+XG4gIGZpZWxkcy5yZWR1Y2UoKHNlbGVjdHMsIGZpZWxkOiBzdHJpbmcpID0+IHtcbiAgICBpZihmaWVsZC5pbmNsdWRlcygnQ291bnQnKSkge1xuICAgICAgcmV0dXJuIHNlbGVjdFJlYWN0aW9uQ291bnRCeVR5cGUoJ2ltYWdlcycsICdpJywgZmllbGQsIHNlbGVjdHMpO1xuICAgIH1cblxuICAgIHN3aXRjaChmaWVsZCkge1xuICAgICAgY2FzZSAncmVhY3Rpb25zJzoge1xuICAgICAgICBzZWxlY3RzLnF1ZXJpZXMucHVzaChgTEVUIHJlYWN0aW9ucyA9IChcbiAgICAgICAgICBGT1IgaW1hZ2UsIHIgSU4gSU5CT1VORCBpLl9pZCByZWFjdGlvbnNcbiAgICAgICAgICBDT0xMRUNUIHJlYWN0aW9uTmFtZSA9IHIudmFsdWUgSU5UTyByZWFjdGlvbkl0ZW1zXG4gICAgICAgICAgUkVUVVJOIHtuYW1lOiByZWFjdGlvbk5hbWUsIGNvdW50OiBMRU5HVEgocmVhY3Rpb25JdGVtc1sqXS5yLnZhbHVlKX1cbiAgICAgICAgKWApO1xuICAgICAgICBzZWxlY3RzLm9iamVjdHMucHVzaCgncmVhY3Rpb25zOnJlYWN0aW9ucycpO1xuICAgICAgICByZXR1cm4gc2VsZWN0cztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RhZ3MnOiB7XG4gICAgICAgIHNlbGVjdHMucXVlcmllcy5wdXNoKGBMRVQgdGFncyA9IChcbiAgICAgICAgICBGT1IgdCwgcGwgSU4gSU5CT1VORCBpLl9pZCBpc1RhZ2dlZFxuICAgICAgICAgIFJFVFVSTiB0XG4gICAgICAgIClgKTtcbiAgICAgICAgc2VsZWN0cy5vYmplY3RzLnB1c2goJ3RhZ3M6dGFncycpO1xuICAgICAgICByZXR1cm4gc2VsZWN0cztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3VzZXJzJzoge1xuICAgICAgICBzZWxlY3RzLnF1ZXJpZXMucHVzaChgTEVUIHVzZXJzID0gRklSU1QoXG4gICAgICAgICAgRk9SIHUgSU4gdXNlcnNcbiAgICAgICAgICBGSUxURVIgaS51c2VySWQgPT0gdS5fa2V5XG4gICAgICAgICAgTElNSVQgMVxuICAgICAgICAgIFJFVFVSTiB1XG4gICAgICAgIClgKTtcbiAgICAgICAgc2VsZWN0cy5vYmplY3RzLnB1c2goJ3VzZXJzOnVzZXJzJyk7XG4gICAgICAgIHJldHVybiBzZWxlY3RzO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICByZXR1cm4gc2VsZWN0cztcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtvYmplY3RzOiBbXSwgcXVlcmllczogW119KTtcblxuZXhwb3J0IGNvbnN0IGdldEltYWdlTGlzdEJ5VXNlciA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgdXNlcklkOiBzdHJpbmcsXG4gIGZyb206IG51bWJlciA9IDAsXG4gIHRvOiBudW1iZXIgPSAzMFxuKTogUHJvbWlzZTxJbWFnZVR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0SW1hZ2VzQnlVc2VyJztcbiAgY29uc3QgZm9ybWF0VXNlcklkID0gcGFyc2VJZCh1c2VySWQpO1xuXG4gIHJldHVybiBnZXRMaXN0Qnk8SW1hZ2VUeXBlPihjb250ZXh0LCAnaW1hZ2VzJywge3VzZXJJZDogZm9ybWF0VXNlcklkfSwge1xuICAgIHNvcnQ6IFt7ZmllbGQ6ICdhZGRlZCcsIGRpcmVjdGlvbjogJ0RFU0MnfV0sXG4gICAgbGltaXQ6IHtmcm9tLCB0b30sXG4gICAgY3VzdG9tUXVlcmllczogW1xuICAgICAgYExFVCB1c2VyID0gRklSU1QoRk9SIHUgSU4gdXNlcnMgRklMVEVSIHUuX2tleSA9PSBkb2MudXNlcklkIExJTUlUIDEgUkVUVVJOIHUpYFxuICAgIF0sXG4gICAgY3VzdG9tT2JqZWN0czogWyd1c2VyOnVzZXInXVxuICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHBhcmFtczoge2Zyb20sIHRvLCB1c2VySWR9LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuXG4gICAgICByZXR1cm4gW107XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SW1hZ2VDb3VudEJ5SXRlbSA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBpdGVtSWQ6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRJbWFnZUNvdW50QnlJdGVtJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuICBjb25zdCBpdGVtRG9jSWRzID0gZ2V0TWVkaWFJdGVtRG9jSWRzKGl0ZW1JZCk7XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgXG4gICAgTEVUIG1lZGlhID0gKFxuICAgICAgRk9SIGkgSU4gJHtoYXNNZWRpYUNvbGxlY3Rpb259XG4gICAgICAgIEZJTFRFUiBpLl9mcm9tIElOICR7aXRlbURvY0lkc31cbiAgICAgICAgRklMVEVSIGkudHlwZSA9PSBcImltYWdlXCJcbiAgICAgICAgUkVUVVJOIDFcbiAgICApXG4gICAgUkVUVVJOIHtjb3VudDogTEVOR1RIKG1lZGlhKX1cbiAgYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigoe2NvdW50fSkgPT4gY291bnQpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7aXRlbUlkfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRJbWFnZUxpc3RCeUl0ZW0gPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGl0ZW1JZDogc3RyaW5nLFxuICBvcHRpb25zOiBJbWFnZU9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxJbWFnZVR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0SW1hZ2VzQnlJdGVtJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgZmllbGRzID0gW10sIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25Vc2VySWQgPSAnJ30gPSB7fX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRJdGVtVHlwZSA9IG9wdGlvbnM/Lml0ZW1UeXBlID8gcGFyc2VDaGFyKFN0cmluZyhvcHRpb25zLml0ZW1UeXBlIHx8ICcnKSwgMzIpLnRvTG93ZXJDYXNlKCkgYXMgQXJhbmdvRGJDb2xsZWN0aW9uIDogdW5kZWZpbmVkO1xuICBjb25zdCBpdGVtRG9jSWRzID0gZ2V0TWVkaWFJdGVtRG9jSWRzKGl0ZW1JZCwgZm9ybWF0SXRlbVR5cGUpO1xuICBjb25zdCB7bGltaXR9ID0gcGFyc2VJbWFnZU9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldEltYWdlT3B0aW9uYWxGaWVsZHMoZmllbGRzKTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBcbiAgICBGT1IgbCBJTiAke2hhc01lZGlhQ29sbGVjdGlvbn1cbiAgICAgIEZJTFRFUiBsLl9mcm9tIElOICR7aXRlbURvY0lkc31cbiAgICAgIEZJTFRFUiBsLnR5cGUgPT0gXCJpbWFnZVwiXG4gICAgICBMRVQgaSA9IERPQ1VNRU5UKGwuX3RvKVxuICAgICAgRklMVEVSIE5PVCBJU19OVUxMKGkpXG4gICAgICBMRVQgb3duZXJQZXJzb25hID0gbC5pdGVtVHlwZSA9PSBcInBlcnNvbmFzXCIgPyBET0NVTUVOVCgke2xpdGVyYWwoQ09MTEVDVElPTlMuUEVSU09OQVMpfSwgUEFSU0VfSURFTlRJRklFUihsLl9mcm9tKS5rZXkpIDogbnVsbFxuICAgICAgJHtsaXRlcmFsKHNlbGVjdFF1ZXJpZXMuam9pbignXFxuJykpfVxuICAgICAgU09SVCBpLmFkZGVkIERFU0NcbiAgICAgICR7bGl0ZXJhbChsaW1pdC5hcWwpfVxuICAgICAgUkVUVVJOIE1FUkdFKFxuICAgICAgICAke3NlbGVjdE9iamVjdHMubGVuZ3RoID4gMCA/IGxpdGVyYWwoYE1FUkdFKGksIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWApIDogbGl0ZXJhbCgnaScpfSxcbiAgICAgICAge1xuICAgICAgICAgIF9tZWRpYUl0ZW1LZXk6IFBBUlNFX0lERU5USUZJRVIobC5fZnJvbSkua2V5LFxuICAgICAgICAgIF9tZWRpYUl0ZW1UeXBlOiBsLml0ZW1UeXBlIHx8IFBBUlNFX0lERU5USUZJRVIobC5fZnJvbSkuY29sbGVjdGlvbixcbiAgICAgICAgICBvd25lclBlcnNvbmFJZDogb3duZXJQZXJzb25hID8gb3duZXJQZXJzb25hLl9rZXkgOiBudWxsLFxuICAgICAgICAgIG93bmVyUGVyc29uYUltYWdlSWQ6IG93bmVyUGVyc29uYSA/IG93bmVyUGVyc29uYS5pbWFnZUlkIDogbnVsbCxcbiAgICAgICAgICBvd25lclBlcnNvbmFJbWFnZVVybDogb3duZXJQZXJzb25hID8gb3duZXJQZXJzb25hLmltYWdlVXJsIDogbnVsbCxcbiAgICAgICAgICBvd25lclBlcnNvbmFOYW1lOiBvd25lclBlcnNvbmEgPyBvd25lclBlcnNvbmEubmFtZSA6IG51bGwsXG4gICAgICAgICAgb3duZXJQZXJzb25hVGh1bWJVcmw6IG93bmVyUGVyc29uYSA/IG93bmVyUGVyc29uYS50aHVtYlVybCA6IG51bGwsXG4gICAgICAgICAgb3duZXJQZXJzb25hVXNlcklkOiBvd25lclBlcnNvbmEgPyBvd25lclBlcnNvbmEudXNlcklkIDogbnVsbFxuICAgICAgICB9XG4gICAgICApXG4gIGA7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBsaXN0ID0gYXdhaXQgdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkgYXMgdW5rbm93biBhcyBJbWFnZVR5cGVbXSk7XG5cbiAgICBjb25zdCBvd25lclVzZXJJZCA9IFN0cmluZyhsaXN0WzBdPy51c2VySWQgfHwgJycpO1xuICAgIGNvbnN0IGlzT3duZXIgPSAhIXNlc3Npb25Vc2VySWQgJiYgISFvd25lclVzZXJJZCAmJiBzZXNzaW9uVXNlcklkID09PSBvd25lclVzZXJJZDtcblxuICAgIGlmKGlzT3duZXIpIHtcbiAgICAgIHJldHVybiBsaXN0O1xuICAgIH1cblxuICAgIGlmKCFzZXNzaW9uVXNlcklkKSB7XG4gICAgICByZXR1cm4gbGlzdC5maWx0ZXIoKGltYWdlKSA9PiBub3JtYWxpemVJbWFnZVByaXZhY3koaW1hZ2U/LnByaXZhY3kpID09PSAncHVibGljJyk7XG4gICAgfVxuXG4gICAgbGV0IGNhblZpZXdGcmllbmRzID0gZmFsc2U7XG4gICAgbGV0IGNhblZpZXdWaXAgPSBmYWxzZTtcblxuICAgIGNvbnN0IG1lZGlhSXRlbUtleSA9IFN0cmluZygobGlzdFswXSBhcyBJbWFnZVR5cGUgJiB7X21lZGlhSXRlbUtleT86IHN0cmluZ30pPy5fbWVkaWFJdGVtS2V5IHx8ICcnKTtcbiAgICBjb25zdCBtZWRpYUl0ZW1UeXBlID0gU3RyaW5nKChsaXN0WzBdIGFzIEltYWdlVHlwZSAmIHtfbWVkaWFJdGVtVHlwZT86IHN0cmluZ30pPy5fbWVkaWFJdGVtVHlwZSB8fCAnJyk7XG5cbiAgICBpZihtZWRpYUl0ZW1UeXBlID09PSBDT0xMRUNUSU9OUy5QRVJTT05BUyAmJiBtZWRpYUl0ZW1LZXkpIHtcbiAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcCA9IGF3YWl0IGdldFBlcnNvbmFSZWxhdGlvbnNoaXBTdGF0ZShjb250ZXh0LCBtZWRpYUl0ZW1LZXkpO1xuICAgICAgY2FuVmlld0ZyaWVuZHMgPSAhIXJlbGF0aW9uc2hpcD8uaXNGcmllbmQ7XG4gICAgICBjYW5WaWV3VmlwID0gYXdhaXQgaGFzU3Vic2NyaXB0aW9uVG9JdGVtKGNvbnRleHQsIG1lZGlhSXRlbUtleSwgQ09MTEVDVElPTlMuUEVSU09OQVMpO1xuICAgIH1cblxuICAgIHJldHVybiBsaXN0LmZpbHRlcigoaW1hZ2UpID0+IGNhblZpZXdJbWFnZShpbWFnZSwgc2Vzc2lvblVzZXJJZCwge2NhblZpZXdGcmllbmRzLCBjYW5WaWV3VmlwLCBpc093bmVyfSkpO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHBhcmFtczoge2l0ZW1JZCwgb3B0aW9uczogey4uLm9wdGlvbnMsIGl0ZW1UeXBlOiBmb3JtYXRJdGVtVHlwZX19LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICAgICAgcmV0dXJuIFtdO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SW1hZ2VMaXN0QnlHcm91cCA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgcGFyYW1zOiB7ZmlsdGVyczogUXVlcnlGaWx0ZXJbXSwgZ3JvdXBJZDogc3RyaW5nLCBmcm9tOiBudW1iZXIsIHRvOiBudW1iZXJ9XG4pOiBQcm9taXNlPEltYWdlVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRJbWFnZXNCeUdyb3VwJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCB7ZmlsdGVycywgZ3JvdXBJZCwgZnJvbSwgdG99ID0gcGFyYW1zO1xuICBjb25zdCBmb3JtYXRHcm91cElkID0gcGFyc2VJZChncm91cElkKTtcbiAgY29uc3QgbGltaXQ6IEFyYW5nb0RiTGltaXQgPSBnZXRMaW1pdChmcm9tLCB0byk7XG5cbiAgZmlsdGVyc1xuICAgIC5tYXAoKGZpbHRlcjogUXVlcnlGaWx0ZXIpID0+IHtcbiAgICAgIGNvbnN0IHtjb25kaXRpb25hbCwgbmFtZSwgdmFsdWV9ID0gZmlsdGVyO1xuICAgICAgbGV0IGZvcm1hdENvbmQgPSBjb25kaXRpb25hbDtcblxuICAgICAgaWYoY29uZGl0aW9uYWwgIT09ICc+PScgJiYgY29uZGl0aW9uYWwgIT09ICc8PScgJiYgY29uZGl0aW9uYWwgIT09ICc+JyAmJiBjb25kaXRpb25hbCAhPT0gJzwnKSB7XG4gICAgICAgIGZvcm1hdENvbmQgPSAnPT0nO1xuICAgICAgfVxuXG4gICAgICBzd2l0Y2gobmFtZSkge1xuICAgICAgICBjYXNlICdhZGRlZCc6XG4gICAgICAgICAgcmV0dXJuIGBwLmFkZGVkICR7Zm9ybWF0Q29uZH0gJHtwYXJzZU51bSh2YWx1ZSl9YDtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgcmV0dXJuIGdldEdyb3VwRGV0YWlscyhjb250ZXh0LCBmb3JtYXRHcm91cElkKVxuICAgIC50aGVuKChncm91cDogR3JvdXBUeXBlKSA9PiB7XG4gICAgICBpZihncm91cC5wcml2YWN5ID09PSAncHVibGljJykge1xuICAgICAgICBmaWx0ZXJzLnB1c2goe2NvbmRpdGlvbmFsOiAnPT0nLCBuYW1lOiAnZ3JvdXBJZCcsIHZhbHVlOiBmb3JtYXRHcm91cElkfSk7XG4gICAgICAgIGNvbnN0IGZpbHRlclN0ciA9IGZpbHRlcnMuam9pbignICYmICcpO1xuICAgICAgICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFxuICAgICAgICAgIEZPUiBpIElOIEZMQVRURU4oXG4gICAgICAgICAgICBGT1IgcCBJTiBwb3N0c1xuICAgICAgICAgICAgICBGSUxURVIgJHtsaXRlcmFsKGZpbHRlclN0cil9XG4gICAgICAgICAgICAgIExFVCBpbWFnZXMgPSAoXG4gICAgICAgICAgICAgICAgRk9SIGksIGUgSU4gT1VUQk9VTkQgcC5faWQgJHtoYXNNZWRpYUNvbGxlY3Rpb259XG4gICAgICAgICAgICAgICAgICBGSUxURVIgZS50eXBlID09IFwiaW1hZ2VcIlxuICAgICAgICAgICAgICAgICAgUkVUVVJOIGlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBTT1JUIHAuYWRkZWQgREVTQ1xuICAgICAgICAgICAgICBSRVRVUk4gaW1hZ2VzXG4gICAgICAgICAgKVxuICAgICAgICAgICAgU09SVCBpLmFkZGVkIERFU0NcbiAgICAgICAgICAgICR7bGl0ZXJhbChsaW1pdC5hcWwpfVxuICAgICAgICAgICAgUkVUVVJOIGlcbiAgICAgICAgYDtcblxuICAgICAgICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpIGFzIHVua25vd24gYXMgSW1hZ2VUeXBlW10pXG4gICAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICAgICAgcGFyYW1zOiB7ZmlsdGVycywgZnJvbSwgZ3JvdXBJZCwgdG99LFxuICAgICAgICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlzR3JvdXBlZChjb250ZXh0LCBzZXNzaW9uSWQsIGdyb3VwSWQpXG4gICAgICAgIC50aGVuKChncm91cGVkOiBHcm91cFVzZXIpID0+IHtcbiAgICAgICAgICBpZihncm91cGVkLmlzVmFsaWQpIHtcbiAgICAgICAgICAgIGZpbHRlcnMucHVzaCh7Y29uZGl0aW9uYWw6ICc9PScsIG5hbWU6ICdncm91cElkJywgdmFsdWU6IGdyb3VwZWQuZ3JvdXBJZH0pO1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyTGlzdCA9IGZpbHRlcnMuam9pbignICYmICcpO1xuICAgICAgICAgICAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBcbiAgICAgICAgICAgICAgRk9SIHAgSU4gcG9zdFxuICAgICAgICAgICAgICAgIEZJTFRFUiAke2xpdGVyYWwoZmlsdGVyTGlzdCl9XG4gICAgICAgICAgICAgICAgRk9SIGYgSU4gcC5maWxlc1xuICAgICAgICAgICAgICAgICAgRklMVEVSIGYudHlwZSA9PSBcImltYWdlL2pwZWdcIiB8fCBmLnR5cGUgPT0gXCJpbWFnZS9wbmdcIlxuICAgICAgICAgICAgICAgICAgJHtsaXRlcmFsKGxpbWl0LmFxbCl9XG4gICAgICAgICAgICAgICAgICBTT1JUIHAuYWRkZWQgREVTQ1xuICAgICAgICAgICAgICAgICAgUkVUVVJOIGZcbiAgICAgICAgICAgIGA7XG5cbiAgICAgICAgICAgIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAgICAgICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpIGFzIHVua25vd24gYXMgSW1hZ2VUeXBlW10pXG4gICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgICAgICAgICAgICBwYXJhbXM6IHtmaWx0ZXJzLCBmcm9tLCBncm91cElkLCB0b30sXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgICAgICAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEltYWdlTGlzdEJ5UmVhY3Rpb25zID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICByZWFjdGlvbnM6IHN0cmluZ1tdID0gW10sXG4gIG9wdGlvbnM/OiBJbWFnZU9wdGlvbnNcbik6IFByb21pc2U8SW1hZ2VUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldEltYWdlTGlzdEJ5UmVhY3Rpb25zJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgZmllbGRzID0gW10sIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0fSA9IHBhcnNlSW1hZ2VPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRJbWFnZU9wdGlvbmFsRmllbGRzKGZpZWxkcyk7XG4gIGNvbnN0IGZvcm1hdFNlc3Npb25JZCA9IGB1c2Vycy8ke3Nlc3Npb25JZH1gO1xuICBjb25zdCBmb3JtYXRSZWFjdGlvbnM6IHN0cmluZ1tdID0gcmVhY3Rpb25zLm1hcCgocmVhY3Rpb25OYW1lKSA9PiBwYXJzZUNoYXIocmVhY3Rpb25OYW1lLCAzMikpO1xuICBjb25zdCBmaWx0ZXJCeTogc3RyaW5nW10gPSBbXG4gICAgJ3IudHlwZSA9PSBcImltYWdlc1wiJyxcbiAgICBgUE9TSVRJT04oJHtKU09OLnN0cmluZ2lmeShmb3JtYXRSZWFjdGlvbnMpfSwgTE9XRVIoci5uYW1lKSlgXTtcblxuICAvLyBHZXQgZGF0YSBmcm9tIGRhdGFiYXNlXG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgXG4gICAgRk9SIGksIHIgSU4gT1VUQk9VTkQgJHtmb3JtYXRTZXNzaW9uSWR9IGhhc1JlYWN0aW9uXG4gICAgICBPUFRJT05TIHt2ZXJ0ZXhDb2xsZWN0aW9uczogXCJpbWFnZXNcIn1cbiAgICAgIExFVCBtZWRpYSA9IEZJUlNUKFxuICAgICAgICBGT1Igb3duZXIsIGwgSU4gSU5CT1VORCBpLl9pZCAke2hhc01lZGlhQ29sbGVjdGlvbn1cbiAgICAgICAgICBGSUxURVIgbC50eXBlID09IFwiaW1hZ2VcIlxuICAgICAgICAgIExJTUlUIDFcbiAgICAgICAgICBSRVRVUk4ge1xuICAgICAgICAgICAgaXRlbUtleTogUEFSU0VfSURFTlRJRklFUihsLl9mcm9tKS5rZXksXG4gICAgICAgICAgICBpdGVtVHlwZTogbC5pdGVtVHlwZSB8fCBQQVJTRV9JREVOVElGSUVSKGwuX2Zyb20pLmNvbGxlY3Rpb25cbiAgICAgICAgICB9XG4gICAgICApXG4gICAgICBMRVQgb3duZXJQZXJzb25hID0gbWVkaWEgJiYgbWVkaWEuaXRlbVR5cGUgPT0gXCJwZXJzb25hc1wiID8gRE9DVU1FTlQoJHtsaXRlcmFsKENPTExFQ1RJT05TLlBFUlNPTkFTKX0sIG1lZGlhLml0ZW1LZXkpIDogbnVsbFxuICAgICAgJHtsaXRlcmFsKHNlbGVjdFF1ZXJpZXMuam9pbignXFxuJykpfVxuICAgICAgRklMVEVSICR7bGl0ZXJhbChmaWx0ZXJCeS5qb2luKCcgJiYgJykpfVxuICAgICAgJHtsaXRlcmFsKGxpbWl0LmFxbCl9XG4gICAgICBSRVRVUk4gTUVSR0UoXG4gICAgICAgICR7c2VsZWN0T2JqZWN0cy5sZW5ndGggPiAwID8gbGl0ZXJhbChgTUVSR0UoaSwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYCkgOiBsaXRlcmFsKCdpJyl9LFxuICAgICAgICB7XG4gICAgICAgICAgb3duZXJQZXJzb25hSWQ6IG93bmVyUGVyc29uYSA/IG93bmVyUGVyc29uYS5fa2V5IDogbnVsbCxcbiAgICAgICAgICBvd25lclBlcnNvbmFJbWFnZUlkOiBvd25lclBlcnNvbmEgPyBvd25lclBlcnNvbmEuaW1hZ2VJZCA6IG51bGwsXG4gICAgICAgICAgb3duZXJQZXJzb25hSW1hZ2VVcmw6IG93bmVyUGVyc29uYSA/IG93bmVyUGVyc29uYS5pbWFnZVVybCA6IG51bGwsXG4gICAgICAgICAgb3duZXJQZXJzb25hTmFtZTogb3duZXJQZXJzb25hID8gb3duZXJQZXJzb25hLm5hbWUgOiBudWxsLFxuICAgICAgICAgIG93bmVyUGVyc29uYVRodW1iVXJsOiBvd25lclBlcnNvbmEgPyBvd25lclBlcnNvbmEudGh1bWJVcmwgOiBudWxsLFxuICAgICAgICAgIG93bmVyUGVyc29uYVVzZXJJZDogb3duZXJQZXJzb25hID8gb3duZXJQZXJzb25hLnVzZXJJZCA6IG51bGxcbiAgICAgICAgfVxuICAgICAgKVxuICBgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkgYXMgdW5rbm93biBhcyBJbWFnZVR5cGVbXSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBwYXJhbXM6IHtvcHRpb25zLCByZWFjdGlvbnN9LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH0pO1xufTtcblxuY29uc3QgZ2V0UGVyc29uYURvY0lkID0gKHBlcnNvbmFJZDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgcGVyc29uYURvY0lkID0gcGFyc2VBcmFuZ29JZChwZXJzb25hSWQpO1xuXG4gIGlmKHBlcnNvbmFEb2NJZCkge1xuICAgIHJldHVybiBwZXJzb25hRG9jSWQ7XG4gIH1cblxuICBjb25zdCBwZXJzb25hS2V5ID0gcGFyc2VJZChwZXJzb25hSWQpO1xuICByZXR1cm4gcGVyc29uYUtleSA/IGAke0NPTExFQ1RJT05TLlBFUlNPTkFTfS8ke3BlcnNvbmFLZXl9YCA6ICcnO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEltYWdlTGlzdEJ5UGVyc29uYVJlYWN0aW9ucyA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgcGVyc29uYUlkOiBzdHJpbmcgPSAnJyxcbiAgcmVhY3Rpb25zOiBzdHJpbmdbXSA9IFtdLFxuICBvcHRpb25zPzogSW1hZ2VPcHRpb25zXG4pOiBQcm9taXNlPEltYWdlVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRJbWFnZUxpc3RCeVBlcnNvbmFSZWFjdGlvbnMnO1xuICBjb25zdCBzZXNzaW9uUGVyc29uYUlkID0gU3RyaW5nKGNvbnRleHQ/LnNlc3Npb24/LnBlcnNvbmFJZCB8fCAnJyk7XG4gIGNvbnN0IHBlcnNvbmFEb2NJZCA9IGdldFBlcnNvbmFEb2NJZChwZXJzb25hSWQgfHwgc2Vzc2lvblBlcnNvbmFJZCk7XG4gIGNvbnN0IHJlYWN0aW9uTmFtZXMgPSBBcnJheS5pc0FycmF5KHJlYWN0aW9ucylcbiAgICA/IHJlYWN0aW9ucy5tYXAoKHJlYWN0aW9uTmFtZSkgPT4gcGFyc2VDaGFyKHJlYWN0aW9uTmFtZSwgMzIpLnRvTG93ZXJDYXNlKCkpLmZpbHRlcihCb29sZWFuKVxuICAgIDogW107XG4gIGNvbnN0IHtsaW1pdH0gPSBwYXJzZUltYWdlT3B0aW9ucyhvcHRpb25zKTtcblxuICBpZighcGVyc29uYURvY0lkIHx8ICFyZWFjdGlvbk5hbWVzLmxlbmd0aCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgXG4gICAgRk9SIGltYWdlLCByZWFjdGlvbiBJTiBPVVRCT1VORCAke3BlcnNvbmFEb2NJZH0gJHtoYXNSZWFjdGlvbkNvbGxlY3Rpb259XG4gICAgICBPUFRJT05TIHt2ZXJ0ZXhDb2xsZWN0aW9uczogXCJpbWFnZXNcIn1cbiAgICAgIExFVCBtZWRpYSA9IEZJUlNUKFxuICAgICAgICBGT1Igb3duZXIsIGxpbmsgSU4gSU5CT1VORCBpbWFnZS5faWQgJHtoYXNNZWRpYUNvbGxlY3Rpb259XG4gICAgICAgICAgRklMVEVSIGxpbmsudHlwZSA9PSBcImltYWdlXCJcbiAgICAgICAgICBMSU1JVCAxXG4gICAgICAgICAgUkVUVVJOIHtcbiAgICAgICAgICAgIGl0ZW1LZXk6IFBBUlNFX0lERU5USUZJRVIobGluay5fZnJvbSkua2V5LFxuICAgICAgICAgICAgaXRlbVR5cGU6IGxpbmsuaXRlbVR5cGUgfHwgUEFSU0VfSURFTlRJRklFUihsaW5rLl9mcm9tKS5jb2xsZWN0aW9uXG4gICAgICAgICAgfVxuICAgICAgKVxuICAgICAgTEVUIG93bmVyUGVyc29uYSA9IG1lZGlhICYmIG1lZGlhLml0ZW1UeXBlID09IFwicGVyc29uYXNcIiA/IERPQ1VNRU5UKCR7cGVyc29uYXNDb2xsZWN0aW9ufSwgbWVkaWEuaXRlbUtleSkgOiBudWxsXG4gICAgICBGSUxURVIgTE9XRVIocmVhY3Rpb24udHlwZSB8fCBcIlwiKSBJTiBbXCJpbWFnZVwiLCBcImltYWdlc1wiXVxuICAgICAgRklMVEVSIFBPU0lUSU9OKCR7cmVhY3Rpb25OYW1lc30sIExPV0VSKHJlYWN0aW9uLm5hbWUgfHwgcmVhY3Rpb24udmFsdWUgfHwgXCJcIikpXG4gICAgICBTT1JUIHJlYWN0aW9uLmFkZGVkIERFU0NcbiAgICAgICR7bGl0ZXJhbChsaW1pdC5hcWwpfVxuICAgICAgUkVUVVJOIE1FUkdFKGltYWdlLCB7XG4gICAgICAgIG93bmVyUGVyc29uYUlkOiBvd25lclBlcnNvbmEgPyBvd25lclBlcnNvbmEuX2tleSA6IG51bGwsXG4gICAgICAgIG93bmVyUGVyc29uYUltYWdlSWQ6IG93bmVyUGVyc29uYSA/IG93bmVyUGVyc29uYS5pbWFnZUlkIDogbnVsbCxcbiAgICAgICAgb3duZXJQZXJzb25hSW1hZ2VVcmw6IG93bmVyUGVyc29uYSA/IG93bmVyUGVyc29uYS5pbWFnZVVybCA6IG51bGwsXG4gICAgICAgIG93bmVyUGVyc29uYU5hbWU6IG93bmVyUGVyc29uYSA/IG93bmVyUGVyc29uYS5uYW1lIDogbnVsbCxcbiAgICAgICAgb3duZXJQZXJzb25hVGh1bWJVcmw6IG93bmVyUGVyc29uYSA/IG93bmVyUGVyc29uYS50aHVtYlVybCA6IG51bGwsXG4gICAgICAgIG93bmVyUGVyc29uYVVzZXJJZDogb3duZXJQZXJzb25hID8gb3duZXJQZXJzb25hLnVzZXJJZCA6IG51bGxcbiAgICAgIH0pXG4gIGA7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSBhcyB1bmtub3duIGFzIEltYWdlVHlwZVtdKTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7b3B0aW9ucywgcGVyc29uYUlkLCByZWFjdGlvbnN9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciBhcyBFcnJvciwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gW107XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBnZXRJbWFnZUJ5SWQgPSAoY29udGV4dDogQXBpQ29udGV4dCwgaW1hZ2VJZDogc3RyaW5nKTogUHJvbWlzZTxJbWFnZVR5cGU+ID0+IHtcbiAgY29uc3QgZm9ybWF0SW1hZ2VJZCA9IHBhcnNlSWQoaW1hZ2VJZCk7XG4gIGNvbnN0IGZpbHRlcnM6IEZpbHRlckdyb3VwID0ge1xuICAgIG9wZXJhdG9yOiAnQU5EJyxcbiAgICBmaWx0ZXJzOiBbe2ZpZWxkOiAnX2tleScsIG9wZXJhdG9yOiAnPT0nLCB2YWx1ZTogZm9ybWF0SW1hZ2VJZH1dXG4gIH0gYXMgYW55O1xuXG4gIHJldHVybiBnZXRJdGVtQnk8SW1hZ2VUeXBlPihjb250ZXh0LCAnaW1hZ2VzJywgZmlsdGVycyk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VXNlckltYWdlUGF0aCA9ICh1c2VySWQ6IHN0cmluZywgaW1hZ2VJZDogc3RyaW5nLCBpbWFnZVR5cGU6IHN0cmluZywgZGlyOiBzdHJpbmcgPSAnaW1hZ2VzJyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGZpbGVuYW1lID0gYCR7aW1hZ2VJZH0uJHtnZXRJbWFnZUV4dGVuc2lvbihpbWFnZVR5cGUpfWA7XG5cbiAgcmV0dXJuIGB1c2Vycy8ke3VzZXJJZH0vJHtkaXJ9LyR7ZmlsZW5hbWV9YDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRBcHBJbWFnZVVybCA9ICh7XG4gIGJ1Y2tldCxcbiAgZGlyZWN0b3J5ID0gJ2ltYWdlcycsXG4gIGltYWdlSWQsXG4gIGltYWdlVHlwZSA9ICdqcGcnLFxuICBpc1RodW1iID0gZmFsc2UsXG4gIHR5cGUsXG4gIHR5cGVJZFxufTogSW1hZ2VVcmxEYXRhKTogc3RyaW5nID0+IHtcbiAgaWYoIXR5cGUpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZighaW1hZ2VJZCkge1xuICAgIGlmKGltYWdlVHlwZSA9PT0gJ3BlcnNvbmEnKSB7XG4gICAgICByZXR1cm4gYCR7Q29uZmlnLmdldCgnaW1hZ2UuZGVmYXVsdFVybCcpfS91c2Vyc19iay5qcGdgO1xuICAgIH1cbiAgICByZXR1cm4gYCR7Q29uZmlnLmdldCgnaW1hZ2UuZGVmYXVsdFVybCcpfS91c2Vyc193aC5qcGdgO1xuICB9XG5cbiAgY29uc3QgYnVja2V0TmFtZSA9IGJ1Y2tldCB8fCBDb25maWcuZ2V0KCdpbWFnZS5idWNrZXQnKSB8fCAnZGV2LnJlYWt0b3IuaW8nO1xuICBjb25zdCBpbWFnZU5hbWUgPSBpc1RodW1iID8gYCR7aW1hZ2VJZH0tdGguJHtpbWFnZVR5cGV9YCA6IGAke2ltYWdlSWR9LiR7aW1hZ2VUeXBlID09PSAncGVyc29uYScgfHwgaW1hZ2VUeXBlID09PSAnb3RoZXInID8gJ2pwZycgOiBpbWFnZVR5cGV9YDtcbiAgY29uc3QgaW1hZ2VVcmwgPSBDb25maWcuZ2V0KCdpbWFnZS51cmwnKSB8fCBgaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tLyR7YnVja2V0TmFtZX1gO1xuXG4gIGlmKHR5cGUgPT09ICdhcHBzJykge1xuICAgIHJldHVybiBgJHtpbWFnZVVybH0vJHt0eXBlfS8ke2RpcmVjdG9yeX0vJHtpbWFnZU5hbWV9YDtcbiAgfVxuXG4gIHJldHVybiBgJHtpbWFnZVVybH0vJHt0eXBlfS8ke3R5cGVJZH0vJHtkaXJlY3Rvcnl9LyR7aW1hZ2VOYW1lfWA7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SW1hZ2VVcmwgPSBhc3luYyAoe1xuICBidWNrZXQsXG4gIGltYWdlRGlyID0gJ2ltYWdlcycsXG4gIGltYWdlSWQsXG4gIGltYWdlVHlwZSA9ICdqcGcnLFxuICBpc1RodW1iID0gZmFsc2UsXG4gIHR5cGUsXG4gIHR5cGVJZCxcbiAgdXJsVHlwZSA9ICdwdWJsaWMnXG59OiBJbWFnZVVybERhdGEpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICBpZighaW1hZ2VJZCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0IGJ1Y2tldE5hbWUgPSBidWNrZXQgfHwgQ29uZmlnLmdldCgnaW1hZ2UuYnVja2V0JykgfHwgJ2Rldi5yZWFrdG9yLmlvJztcbiAgY29uc3QgY29uZmlndXJlZEltYWdlVXJsID0gU3RyaW5nKENvbmZpZy5nZXQoJ2ltYWdlLnVybCcpIHx8ICcnKTtcbiAgY29uc3QgY29uZmlndXJlZEFwcFVybCA9IFN0cmluZyhDb25maWcuZ2V0KCdhcHAudXJsJykgfHwgJycpO1xuICBjb25zdCBwdWJsaWNCYXNlVXJsID0gY29uZmlndXJlZEFwcFVybFxuICAgID8gYGh0dHBzOi8vYm94LiR7Y29uZmlndXJlZEFwcFVybH1gXG4gICAgOiAoY29uZmlndXJlZEltYWdlVXJsIHx8IGBodHRwczovL3MzLmFtYXpvbmF3cy5jb20vJHtidWNrZXROYW1lfWApO1xuICBjb25zdCBkZXZCYXNlVXJsID0gY29uZmlndXJlZEFwcFVybFxuICAgID8gYGh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9kZXYuJHtjb25maWd1cmVkQXBwVXJsfWBcbiAgICA6IChjb25maWd1cmVkSW1hZ2VVcmwgfHwgYGh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS8ke2J1Y2tldE5hbWV9YCk7XG5cbiAgLy8gQWx3YXlzIHVzZSBzaWduZWQgVVJMcyBmb3IgdGh1bWJuYWlsc1xuICBpZihpc1RodW1iKSB7XG4gICAgdXJsVHlwZSA9ICdzaWduZWQnO1xuICB9XG5cbiAgY29uc3QgdGh1bWJTdWZmaXggPSBpc1RodW1iID8gJy10aCcgOiAnJztcbiAgY29uc3QgaW1hZ2VLZXkgPSBgJHt0eXBlfS8ke3R5cGVJZH0vJHtpbWFnZURpcn0vJHtpbWFnZUlkfSR7dGh1bWJTdWZmaXh9LiR7aW1hZ2VUeXBlfWA7XG5cbiAgc3dpdGNoKHVybFR5cGUpIHtcbiAgICBjYXNlICdzaWduZWQnOiB7XG4gICAgICByZXR1cm4gYXdhaXQgczNHZXRTaWduZWRVcmwoe0J1Y2tldDogYnVja2V0TmFtZSwgRXhwaXJlczogNjAgKiA2MCwgS2V5OiBpbWFnZUtleX0pO1xuICAgIH1cbiAgICBjYXNlICdwdWJsaWMnOiB7XG4gICAgICByZXR1cm4gYCR7cHVibGljQmFzZVVybH0vJHtpbWFnZUtleX1gO1xuICAgIH1cbiAgICBjYXNlICdkZXYnOiB7XG4gICAgICByZXR1cm4gYCR7ZGV2QmFzZVVybH0vJHtpbWFnZUtleX1gO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgY29uc3QgcmVzaXplQW5kU2F2ZUltYWdlID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBpbWFnZUlkOiBzdHJpbmcsXG4gIGJ1ZmZlcjogQnVmZmVyLFxuICBmaWxlVHlwZTogc3RyaW5nID0gJ2ltYWdlL2pwZWcnLCBzM09wdGlvbnM/OiBQdXRPYmplY3RDb21tYW5kSW5wdXRcbik6IFByb21pc2U8SW1hZ2VUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdyZXNpemVTYXZlSW1hZ2UnO1xuICBjb25zdCB7c2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCBpbWdXID0gQ29uZmlnLmdldCgnaW1hZ2UuaW1nU2l6ZScpO1xuICBjb25zdCBpbWdRID0gQ29uZmlnLmdldCgnaW1hZ2UuaW1nUXVhbGl0eScpO1xuICBjb25zdCBmb3JtYXQgPSAoZmlsZVR5cGUuc3BsaXQoJy8nKSlbMV0gfHwgJ2pwZWcnO1xuICBjb25zdCBzaGFycEZvcm1hdCA9IG5vcm1hbGl6ZUltYWdlRm9ybWF0KGZvcm1hdCk7XG4gIGxldCBpbWFnZU9wdGltaXplZEJ1ZmZlcjogQnVmZmVyID0gYnVmZmVyO1xuICBsZXQgdGh1bWJPcHRpbWl6ZWRCdWZmZXI6IEJ1ZmZlciA9IGJ1ZmZlcjtcbiAgbGV0IGltYWdlSWRlbnRpdHk6IEltYWdlVHlwZSA9IHtcbiAgICBmaWxlU2l6ZTogYnVmZmVyLmxlbmd0aCxcbiAgICBmaWxlVHlwZTogZm9ybWF0LFxuICAgIGltYWdlSWRcbiAgfTtcblxuICB0cnkge1xuICAgIGltYWdlT3B0aW1pemVkQnVmZmVyID0gYXdhaXQgc2hhcnAoYnVmZmVyKVxuICAgICAgLnJvdGF0ZSgpXG4gICAgICAucmVzaXplKHtcbiAgICAgICAgZml0OiAnaW5zaWRlJyxcbiAgICAgICAgaGVpZ2h0OiBpbWdXLFxuICAgICAgICB3aWR0aDogaW1nVyxcbiAgICAgICAgd2l0aG91dEVubGFyZ2VtZW50OiB0cnVlXG4gICAgICB9KVxuICAgICAgLnRvRm9ybWF0KHNoYXJwRm9ybWF0LCB7cXVhbGl0eTogaW1nUX0pXG4gICAgICAudG9CdWZmZXIoKTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIHJldHVybiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge2ZpbGVUeXBlLCBpbWFnZUlkfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLklNQUdFX1NBVkVcbiAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGltYWdlT2JqOiBQdXRPYmplY3RDb21tYW5kSW5wdXQgPSB7XG4gICAgICBCb2R5OiBpbWFnZU9wdGltaXplZEJ1ZmZlcixcbiAgICAgIEJ1Y2tldDogbnVsbCxcbiAgICAgIENvbnRlbnRUeXBlOiBmaWxlVHlwZSxcbiAgICAgIC4uLihzM09wdGlvbnMgfHwge30pLFxuICAgICAgS2V5OiBnZXRVc2VySW1hZ2VQYXRoKHNlc3Npb25JZCwgaW1hZ2VJZCwgZmlsZVR5cGUsICdpbWFnZXMnKVxuICAgIH07XG4gICAgYXdhaXQgczNQdXQoaW1hZ2VPYmopO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgcmV0dXJuIGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7ZmlsZVR5cGUsIGltYWdlSWR9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuSU1BR0VfU0FWRVxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgW2ltYWdlTWV0YWRhdGEsIGltYWdlU3RhdHMsIHNvdXJjZU1ldGFkYXRhXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHNoYXJwKGltYWdlT3B0aW1pemVkQnVmZmVyKS5tZXRhZGF0YSgpLFxuICAgICAgc2hhcnAoaW1hZ2VPcHRpbWl6ZWRCdWZmZXIpLnN0YXRzKCksXG4gICAgICBzaGFycChidWZmZXIpLm1ldGFkYXRhKClcbiAgICBdKTtcbiAgICBjb25zdCB7YiwgZywgcn0gPSBpbWFnZVN0YXRzLmRvbWluYW50O1xuICAgIGNvbnN0IGNvbG9yID0gW3IsIGcsIGJdLm1hcCgodmFsdWUpID0+IHZhbHVlLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpKS5qb2luKCcnKTtcbiAgICBjb25zdCBleGlmTWV0YWRhdGEgPSBpbWFnZUV4aWZNZXRhZGF0YShzb3VyY2VNZXRhZGF0YS5leGlmKTtcblxuICAgIGltYWdlSWRlbnRpdHkgPSB7XG4gICAgICBjb2xvcixcbiAgICAgIGZpbGVTaXplOiBpbWFnZU9wdGltaXplZEJ1ZmZlci5sZW5ndGgsXG4gICAgICBmaWxlVHlwZTogZm9ybWF0LFxuICAgICAgaGVpZ2h0OiBpbWFnZU1ldGFkYXRhLmhlaWdodCB8fCAwLFxuICAgICAgaW1hZ2VJZCxcbiAgICAgIC4uLmV4aWZNZXRhZGF0YSxcbiAgICAgIG9yaWVudGF0aW9uOiBpbWFnZU1ldGFkYXRhLm9yaWVudGF0aW9uID8gU3RyaW5nKGltYWdlTWV0YWRhdGEub3JpZW50YXRpb24pIDogdW5kZWZpbmVkLFxuICAgICAgcXVhbGl0eTogaW1nUSxcbiAgICAgIHJlc29sdXRpb246IGltYWdlTWV0YWRhdGEuZGVuc2l0eSA/IGAke2ltYWdlTWV0YWRhdGEuZGVuc2l0eX0gcHBpYCA6IHVuZGVmaW5lZCxcbiAgICAgIHdpZHRoOiBpbWFnZU1ldGFkYXRhLndpZHRoIHx8IDBcbiAgICB9O1xuXG4gICAgY29uc3QgdGhtVyA9IENvbmZpZy5nZXQoJ2ltYWdlLnRobVNpemUnKTtcbiAgICBjb25zdCB0aG1RID0gQ29uZmlnLmdldCgnaW1hZ2UudGhtUXVhbGl0eScpO1xuICAgIHRodW1iT3B0aW1pemVkQnVmZmVyID0gYXdhaXQgc2hhcnAoaW1hZ2VPcHRpbWl6ZWRCdWZmZXIpXG4gICAgICAucmVzaXplKHtcbiAgICAgICAgZml0OiAnY292ZXInLFxuICAgICAgICBoZWlnaHQ6IHRobVcsXG4gICAgICAgIHBvc2l0aW9uOiAnY2VudHJlJyxcbiAgICAgICAgd2lkdGg6IHRobVdcbiAgICAgIH0pXG4gICAgICAudG9Gb3JtYXQoc2hhcnBGb3JtYXQsIHtxdWFsaXR5OiB0aG1RfSlcbiAgICAgIC50b0J1ZmZlcigpO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgcmV0dXJuIGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7ZmlsZVR5cGUsIGltYWdlSWR9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuSU1BR0VfU0FWRVxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgdGh1bWJPYmo6IFB1dE9iamVjdENvbW1hbmRJbnB1dCA9IHtcbiAgICAgIEJvZHk6IHRodW1iT3B0aW1pemVkQnVmZmVyLFxuICAgICAgQnVja2V0OiBudWxsLFxuICAgICAgQ29udGVudFR5cGU6IGZpbGVUeXBlLFxuICAgICAgLi4uKHMzT3B0aW9ucyB8fCB7fSksXG4gICAgICBLZXk6IGdldFVzZXJJbWFnZVBhdGgoc2Vzc2lvbklkLCBpbWFnZUlkLCBmaWxlVHlwZSwgJ3RodW1icycpXG4gICAgfTtcbiAgICBhd2FpdCBzM1B1dCh0aHVtYk9iaik7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICByZXR1cm4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5JTUFHRV9TQVZFXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICB9XG5cbiAgcmV0dXJuIGltYWdlSWRlbnRpdHk7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkSW1hZ2UgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGltYWdlOiBJbWFnZVR5cGUsXG4gIHMzT3B0aW9ucz86IFB1dE9iamVjdENvbW1hbmRJbnB1dFxuKTogUHJvbWlzZTxJbWFnZVR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2FkZEltYWdlJztcbiAgY29uc3Qge3Nlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qge2ltYWdlSWQsIGRlc2NyaXB0aW9uLCBidWZmZXIsIGZpbGVUeXBlLCBpdGVtSWQsIGl0ZW1UeXBlLCBwcml2YWN5ID0gJ3B1YmxpYyd9ID0gaW1hZ2U7XG5cbiAgcmV0dXJuIHJlc2l6ZUFuZFNhdmVJbWFnZShjb250ZXh0LCBpbWFnZUlkLCBidWZmZXIsIGZpbGVUeXBlLCBzM09wdGlvbnMpXG4gICAgLnRoZW4oKHJlc2l6ZWRJbWFnZTogSW1hZ2VUeXBlKSA9PiB7XG4gICAgICBjb25zdCBpbnNlcnQ6IEltYWdlVHlwZSA9IHtcbiAgICAgICAgLi4ucmVzaXplZEltYWdlLFxuICAgICAgICBfa2V5OiBpbWFnZUlkLFxuICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgZmlsZVR5cGUsXG4gICAgICAgIHByaXZhY3k6IG5vcm1hbGl6ZUltYWdlUHJpdmFjeShwcml2YWN5KSxcbiAgICAgICAgdXNlcklkOiBzZXNzaW9uSWRcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBhZGRJdGVtPEltYWdlVHlwZT4oY29udGV4dCwgJ2ltYWdlcycsIGluc2VydClcbiAgICAgICAgLnRoZW4oKHNhdmVkSW1hZ2U6IEltYWdlVHlwZSkgPT4gYWRkSW1hZ2VFZGdlKGNvbnRleHQsIHtcbiAgICAgICAgICBpbWFnZUlkLFxuICAgICAgICAgIGl0ZW1JZDogaXRlbUlkIHx8IHNlc3Npb25JZCxcbiAgICAgICAgICBpdGVtVHlwZTogcGFyc2VTdHJpbmcoaXRlbVR5cGUgfHwgJ3VzZXJzJywgMzIpLnRvTG93ZXJDYXNlKCkgYXMgQXJhbmdvRGJDb2xsZWN0aW9uLFxuICAgICAgICAgIHR5cGU6ICdpbWFnZSdcbiAgICAgICAgfSkudGhlbigoKSA9PiBzYXZlZEltYWdlKSk7XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5JTUFHRV9SRVNJWkVcbiAgICB9LCBlcnJvciwgY29udGV4dCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZEltYWdlRWRnZSA9IGFzeW5jIChjb250ZXh0OiBBcGlDb250ZXh0LCBpbWFnZUVkZ2U6IEltYWdlRWRnZVR5cGUpOiBQcm9taXNlPG9iamVjdD4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnYWRkSW1hZ2VFZGdlJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCB7aW1hZ2VJZCwgaXRlbUlkLCBpdGVtVHlwZX0gPSBpbWFnZUVkZ2U7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGNvbnN0IGVkZ2VJZCA9IGNyZWF0ZUhhc2goYGhhc01lZGlhLWltYWdlLSR7aW1hZ2VJZH0tJHtpdGVtSWR9LSR7c2Vzc2lvbklkfWApO1xuICBjb25zdCBmb3JtYXRJdGVtVHlwZTogQXJhbmdvRGJDb2xsZWN0aW9uID0gcGFyc2VDaGFyKGl0ZW1UeXBlKS50b0xvd2VyQ2FzZSgpIGFzIEFyYW5nb0RiQ29sbGVjdGlvbjtcbiAgY29uc3QgZm9ybWF0SXRlbUlkID0gcGFyc2VJZChpdGVtSWQpO1xuICBjb25zdCBpdGVtRG9jSWQgPSBnZXREb2NJZChmb3JtYXRJdGVtVHlwZSwge19rZXk6IGZvcm1hdEl0ZW1JZH0pO1xuICBjb25zdCBmb3JtYXRJbWFnZUlkID0gcGFyc2VJZChpbWFnZUlkKTtcbiAgY29uc3QgZmlsZURvY0lkID0gYGltYWdlcy8ke2Zvcm1hdEltYWdlSWR9YDtcblxuICBjb25zdCBlZGdlOiBJbWFnZUVkZ2VUeXBlID0ge1xuICAgIF9mcm9tOiBpdGVtRG9jSWQsXG4gICAgX2tleTogZWRnZUlkLFxuICAgIF90bzogZmlsZURvY0lkLFxuICAgIGFkZGVkOiBub3csXG4gICAgaXRlbVR5cGUsXG4gICAgdHlwZTogJ2ltYWdlJ1xuICB9O1xuXG4gIGlmKGl0ZW1Eb2NJZCkge1xuICAgIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLmNvbGxlY3Rpb24oRURHRVMuSEFTX01FRElBKS5zYXZlKGVkZ2UsIHtyZXR1cm5OZXc6IHRydWV9KVxuICAgICAgLnRoZW4oKGZpbGVFZGdlKSA9PiB1c2VEYihkYXRhYmFzZU5hbWUpLmNvbGxlY3Rpb24oRURHRVMuSEFTX01FRElBKS5kb2N1bWVudChmaWxlRWRnZSkpXG4gICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICBlZGdlLFxuICAgICAgICAgIGZpbGVEb2NJZCxcbiAgICAgICAgICBpbWFnZUlkLFxuICAgICAgICAgIGl0ZW1Eb2NJZCxcbiAgICAgICAgICBpdGVtSWQsXG4gICAgICAgICAgaXRlbVR5cGVcbiAgICAgICAgfSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVJbWFnZSA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaW1hZ2U6IEltYWdlVHlwZSxcbiAgczNPcHRpb25zPzogUHV0T2JqZWN0Q29tbWFuZElucHV0XG4pOiBQcm9taXNlPEltYWdlVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAndXBkYXRlSW1hZ2UnO1xuICBjb25zdCB7c2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCB7XG4gICAgYmFzZTY0ID0gJycsXG4gICAgYnVmZmVyOiBpbWFnZUJ1ZmZlcixcbiAgICBkZXNjcmlwdGlvbixcbiAgICBpbWFnZUlkLFxuICAgIGl0ZW1JZCxcbiAgICBpdGVtVHlwZSxcbiAgICBmaWxlVHlwZSxcbiAgICBwcml2YWN5LFxuICAgIHVybCA9ICcnXG4gIH0gPSBpbWFnZTtcblxuICBjb25zdCBmb3JtYXRJbWFnZUlkID0gaW1hZ2VJZCB8fCBjcmVhdGVIYXNoKGBpbWFnZS0ke3Nlc3Npb25JZH1gKTtcbiAgY29uc3QgZm9ybWF0SXRlbUlkID0gcGFyc2VJZChpdGVtSWQpO1xuICBjb25zdCBmb3JtYXRJdGVtVHlwZTogQXJhbmdvRGJDb2xsZWN0aW9uID0gcGFyc2VDaGFyKGl0ZW1UeXBlLCAxNikudG9Mb3dlckNhc2UoKSBhcyBBcmFuZ29EYkNvbGxlY3Rpb247XG4gIGNvbnN0IGN1c3RvbVBhcmFtczogSW1hZ2VUeXBlID0ge1xuICAgIGRlc2NyaXB0aW9uLFxuICAgIGltYWdlSWQ6IGZvcm1hdEltYWdlSWQsXG4gICAgcHJpdmFjeTogbm9ybWFsaXplSW1hZ2VQcml2YWN5KHByaXZhY3kpLFxuICAgIHVzZXJJZDogc2Vzc2lvbklkXG4gIH07XG5cbiAgaWYoYmFzZTY0IHx8IGltYWdlQnVmZmVyKSB7XG4gICAgbGV0IGJ1ZmZlcjogQnVmZmVyID0gaW1hZ2VCdWZmZXI7XG5cbiAgICBpZihiYXNlNjQpIHtcbiAgICAgIGNvbnN0IGZvcm1hdEJhc2U2NCA9IGJhc2U2NC5zdWJzdHIoYmFzZTY0LmluZGV4T2YoJywnKSArIDEpO1xuICAgICAgYnVmZmVyID0gQnVmZmVyLmZyb20oZm9ybWF0QmFzZTY0LCAnYmFzZTY0Jyk7XG4gICAgfVxuXG4gICAgbGV0IHVwZGF0ZWRGaWxlVHlwZSA9IGZpbGVUeXBlO1xuXG4gICAgaWYoIWZpbGVUeXBlKSB7XG4gICAgICBjb25zdCB7ZmlsZVR5cGVGcm9tQnVmZmVyfSA9IGF3YWl0IGltcG9ydCgnZmlsZS10eXBlJyk7XG4gICAgICBjb25zdCB7bWltZX0gPSBhd2FpdCBmaWxlVHlwZUZyb21CdWZmZXIoYnVmZmVyKTtcbiAgICAgIHVwZGF0ZWRGaWxlVHlwZSA9IG1pbWU7XG4gICAgfVxuXG4gICAgY29uc3QgaW1nUGFyYW1zOiBJbWFnZVR5cGUgPSB7XG4gICAgICAuLi5jdXN0b21QYXJhbXMsXG4gICAgICBidWZmZXIsXG4gICAgICBmaWxlVHlwZTogdXBkYXRlZEZpbGVUeXBlXG4gICAgfTtcblxuICAgIHJldHVybiBhZGRJbWFnZShjb250ZXh0LCBpbWdQYXJhbXMsIHMzT3B0aW9ucylcbiAgICAgIC50aGVuKChpbWFnZTogSW1hZ2VUeXBlKSA9PiB7XG4gICAgICAgIGlmKGZvcm1hdEl0ZW1JZCAmJiBmb3JtYXRJdGVtVHlwZSkge1xuICAgICAgICAgIGNvbnN0IGltYWdlRWRnZTogSW1hZ2VFZGdlVHlwZSA9IHtcbiAgICAgICAgICAgIGltYWdlSWQ6IGZvcm1hdEltYWdlSWQsXG4gICAgICAgICAgICBpdGVtSWQ6IGZvcm1hdEl0ZW1JZCxcbiAgICAgICAgICAgIGl0ZW1UeXBlOiBmb3JtYXRJdGVtVHlwZSxcbiAgICAgICAgICAgIHR5cGU6ICdpbWFnZSdcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiBhZGRJbWFnZUVkZ2UoY29udGV4dCwgaW1hZ2VFZGdlKS50aGVuKCgpID0+IGltYWdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpbWFnZTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLklNQUdFX1NBVkVcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG4gIH0gZWxzZSBpZih1cmwgIT09ICcnKSB7XG4gICAgbGV0IGNvbnRlbnRUeXBlO1xuXG4gICAgcmV0dXJuIGh0dHBHZXQodXJsKVxuICAgICAgLnRoZW4oKHJlczogSHR0cFJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGlmKHJlcy5zdGF0dXMgIT09IDIwMCkge1xuICAgICAgICAgIHJldHVybiBsb2dFeGNlcHRpb24oe1xuICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5JTUFHRV9SRVFVRVNUXG4gICAgICAgICAgfSwgY29udGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZW50VHlwZSA9IHJlcy5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJyk7XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgICAudGhlbigocmVzKSA9PiAocmVzIGFzIEh0dHBSZXNwb25zZSkuYnVmZmVyKCkpXG4gICAgICAudGhlbigoYnVmZmVyOiBCdWZmZXIpID0+IHtcbiAgICAgICAgY29uc3QgaW1nUGFyYW1zOiBJbWFnZVR5cGUgPSB7XG4gICAgICAgICAgLi4uY3VzdG9tUGFyYW1zLFxuICAgICAgICAgIGJ1ZmZlcixcbiAgICAgICAgICBmaWxlVHlwZTogY29udGVudFR5cGVcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gYWRkSW1hZ2UoY29udGV4dCwgaW1nUGFyYW1zLCBzM09wdGlvbnMpXG4gICAgICAgICAgLnRoZW4oKGltYWdlOiBJbWFnZVR5cGUpID0+IHtcbiAgICAgICAgICAgIGlmKGZvcm1hdEl0ZW1JZCAmJiBmb3JtYXRJdGVtVHlwZSkge1xuICAgICAgICAgICAgICBjb25zdCBpbWFnZUVkZ2U6IEltYWdlRWRnZVR5cGUgPSB7aW1hZ2VJZDogZm9ybWF0SW1hZ2VJZCwgaXRlbUlkOiBmb3JtYXRJdGVtSWQsIGl0ZW1UeXBlOiBmb3JtYXRJdGVtVHlwZSwgdHlwZTogJ2ltYWdlJ307XG4gICAgICAgICAgICAgIHJldHVybiBhZGRJbWFnZUVkZ2UoY29udGV4dCwgaW1hZ2VFZGdlKS50aGVuKCgpID0+IGltYWdlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGltYWdlO1xuICAgICAgICAgIH0pO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHZhbHVlOiAnZmV0Y2hfZXJyb3InXG4gICAgICB9LCBlcnJvciwgY29udGV4dCkpO1xuICB9IGVsc2UgaWYoaW1hZ2VJZCkge1xuICAgIGNvbnN0IHVwZGF0ZSA9IHtcbiAgICAgIC4uLihkZXNjcmlwdGlvbiAhPT0gdW5kZWZpbmVkID8ge2Rlc2NyaXB0aW9ufSA6IHt9KSxcbiAgICAgIC4uLihwcml2YWN5ICE9PSB1bmRlZmluZWQgPyB7cHJpdmFjeTogbm9ybWFsaXplSW1hZ2VQcml2YWN5KHByaXZhY3kpfSA6IHt9KVxuICAgIH07XG5cbiAgICByZXR1cm4gdXBkYXRlSXRlbTxJbWFnZVR5cGU+KGNvbnRleHQsICdpbWFnZXMnLCBmb3JtYXRJbWFnZUlkLCB1cGRhdGUpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgZGVsZXRlSW1hZ2UgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCwgaW1hZ2VJZDogc3RyaW5nKTogUHJvbWlzZTxJbWFnZVR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2RlbGV0ZSc7XG4gIGNvbnN0IHtzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdEltYWdlSWQgPSBwYXJzZUlkKGltYWdlSWQpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgaW1hZ2UgPSBhd2FpdCBkZWxldGVJdGVtPEltYWdlVHlwZT4oY29udGV4dCwgJ2ltYWdlcycsIGZvcm1hdEltYWdlSWQsIHtcbiAgICAgIGNhc2NhZGU6IFtFREdFUy5IQVNfTUVESUFdLFxuICAgICAgb3duZXJzaGlwOiB0cnVlXG4gICAgfSk7XG5cbiAgICBpZighaW1hZ2UpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIERlbGV0ZSBTMyBmaWxlc1xuICAgIGNvbnN0IHtfa2V5OiBpbWFnZUtleX0gPSBpbWFnZTtcbiAgICBjb25zdCBwYXJhbXM6IERlbGV0ZU9iamVjdHNDb21tYW5kSW5wdXQgPSB7XG4gICAgICBCdWNrZXQ6IG51bGwsXG4gICAgICBEZWxldGU6IHtcbiAgICAgICAgT2JqZWN0czogW1xuICAgICAgICAgIHtLZXk6IGB1c2Vycy8ke3Nlc3Npb25JZH0vaW1hZ2VzLyR7aW1hZ2VLZXl9LmpwZ2B9LFxuICAgICAgICAgIHtLZXk6IGB1c2Vycy8ke3Nlc3Npb25JZH0vdGh1bWJzLyR7aW1hZ2VLZXl9LmpwZ2B9XG4gICAgICAgIF0sXG4gICAgICAgIFF1aWV0OiB0cnVlXG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBzM0RlbGV0ZUxpc3QocGFyYW1zKS50aGVuKCgpID0+IGltYWdlKTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIHJldHVybiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge2ltYWdlSWR9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gIH1cbn07XG4iXSwibmFtZXMiOlsiZ2V0IiwiaHR0cEdldCIsInBhcnNlTnVtIiwiY3JlYXRlSGFzaCIsInBhcnNlQXJhbmdvSWQiLCJwYXJzZUNoYXIiLCJwYXJzZUlkIiwicGFyc2VTdHJpbmciLCJhcWwiLCJsaXRlcmFsIiwiZXhpZlJlYWRlciIsInNoYXJwIiwiQ29uZmlnIiwiQ09MTEVDVElPTlMiLCJFREdFUyIsIkVycm9yVHlwZXMiLCJsb2dFcnJvciIsImxvZ0V4Y2VwdGlvbiIsImdldERvY0lkIiwiZ2V0TGltaXQiLCJzZWxlY3RSZWFjdGlvbkNvdW50QnlUeXBlIiwidXNlRGIiLCJnZXRJbWFnZUV4dGVuc2lvbiIsImFkZEl0ZW0iLCJkZWxldGVJdGVtIiwiZ2V0SXRlbUJ5IiwiZ2V0TGlzdEJ5IiwidXBkYXRlSXRlbSIsImdldEdyb3VwRGV0YWlscyIsImlzR3JvdXBlZCIsImdldFBlcnNvbmFSZWxhdGlvbnNoaXBTdGF0ZSIsInMzRGVsZXRlTGlzdCIsInMzR2V0U2lnbmVkVXJsIiwiczNQdXQiLCJoYXNTdWJzY3JpcHRpb25Ub0l0ZW0iLCJldmVudENhdGVnb3J5IiwiaGFzUmVhY3Rpb25Db2xsZWN0aW9uIiwiSEFTX1JFQUNUSU9OIiwiaGFzTWVkaWFDb2xsZWN0aW9uIiwiSEFTX01FRElBIiwicGVyc29uYXNDb2xsZWN0aW9uIiwiUEVSU09OQVMiLCJNRURJQV9JVEVNX0NPTExFQ1RJT05TIiwiVVNFUlMiLCJQT1NUUyIsIkdST1VQUyIsImdldE1lZGlhSXRlbURvY0lkcyIsIml0ZW1JZCIsIml0ZW1UeXBlIiwiZG9jSWQiLCJpdGVtS2V5IiwiaW5jbHVkZXMiLCJtYXAiLCJjb2xsZWN0aW9uIiwibm9ybWFsaXplSW1hZ2VGb3JtYXQiLCJmb3JtYXQiLCJpbWFnZUV4aWZNZXRhZGF0YSIsImV4aWYiLCJtZXRhZGF0YSIsInRha2VuIiwiUGhvdG8iLCJEYXRlVGltZU9yaWdpbmFsIiwibWFrZSIsIkltYWdlIiwiTWFrZSIsIm1vZGVsIiwiTW9kZWwiLCJEYXRlIiwiZ2V0VGltZSIsInVuZGVmaW5lZCIsIm5vcm1hbGl6ZUltYWdlUHJpdmFjeSIsInByaXZhY3kiLCJTdHJpbmciLCJ0cmltIiwidG9Mb3dlckNhc2UiLCJjYW5WaWV3SW1hZ2UiLCJpbWFnZSIsInZpZXdlclVzZXJJZCIsImFjY2VzcyIsImlzT3duZXIiLCJ1c2VySWQiLCJjYW5WaWV3RnJpZW5kcyIsImNhblZpZXdWaXAiLCJwYXJzZUltYWdlT3B0aW9ucyIsIm9wdGlvbnMiLCJmcm9tIiwidG8iLCJ0eXBlIiwibGltaXQiLCJnZXRJbWFnZU9wdGlvbmFsRmllbGRzIiwiZmllbGRzIiwicmVkdWNlIiwic2VsZWN0cyIsImZpZWxkIiwicXVlcmllcyIsInB1c2giLCJvYmplY3RzIiwiZ2V0SW1hZ2VMaXN0QnlVc2VyIiwiY29udGV4dCIsImFjdGlvbiIsImZvcm1hdFVzZXJJZCIsInNvcnQiLCJkaXJlY3Rpb24iLCJjdXN0b21RdWVyaWVzIiwiY3VzdG9tT2JqZWN0cyIsImNhdGNoIiwiZXJyb3IiLCJjYXRlZ29yeSIsInBhcmFtcyIsInZhbHVlIiwiREFUQUJBU0VfRVJST1IiLCJnZXRJbWFnZUNvdW50QnlJdGVtIiwiZGF0YWJhc2VOYW1lIiwiaXRlbURvY0lkcyIsImFxbFFyeSIsInF1ZXJ5IiwidGhlbiIsImN1cnNvciIsIm5leHQiLCJjb3VudCIsImdldEltYWdlTGlzdEJ5SXRlbSIsInNlc3Npb24iLCJzZXNzaW9uVXNlcklkIiwiZm9ybWF0SXRlbVR5cGUiLCJzZWxlY3RPYmplY3RzIiwic2VsZWN0UXVlcmllcyIsImpvaW4iLCJsZW5ndGgiLCJsaXN0IiwiYWxsIiwib3duZXJVc2VySWQiLCJmaWx0ZXIiLCJtZWRpYUl0ZW1LZXkiLCJfbWVkaWFJdGVtS2V5IiwibWVkaWFJdGVtVHlwZSIsIl9tZWRpYUl0ZW1UeXBlIiwicmVsYXRpb25zaGlwIiwiaXNGcmllbmQiLCJnZXRJbWFnZUxpc3RCeUdyb3VwIiwic2Vzc2lvbklkIiwiZmlsdGVycyIsImdyb3VwSWQiLCJmb3JtYXRHcm91cElkIiwiY29uZGl0aW9uYWwiLCJuYW1lIiwiZm9ybWF0Q29uZCIsImdyb3VwIiwiZmlsdGVyU3RyIiwiZ3JvdXBlZCIsImlzVmFsaWQiLCJmaWx0ZXJMaXN0IiwiZ2V0SW1hZ2VMaXN0QnlSZWFjdGlvbnMiLCJyZWFjdGlvbnMiLCJmb3JtYXRTZXNzaW9uSWQiLCJmb3JtYXRSZWFjdGlvbnMiLCJyZWFjdGlvbk5hbWUiLCJmaWx0ZXJCeSIsIkpTT04iLCJzdHJpbmdpZnkiLCJnZXRQZXJzb25hRG9jSWQiLCJwZXJzb25hSWQiLCJwZXJzb25hRG9jSWQiLCJwZXJzb25hS2V5IiwiZ2V0SW1hZ2VMaXN0QnlQZXJzb25hUmVhY3Rpb25zIiwic2Vzc2lvblBlcnNvbmFJZCIsInJlYWN0aW9uTmFtZXMiLCJBcnJheSIsImlzQXJyYXkiLCJCb29sZWFuIiwiZ2V0SW1hZ2VCeUlkIiwiaW1hZ2VJZCIsImZvcm1hdEltYWdlSWQiLCJvcGVyYXRvciIsImdldFVzZXJJbWFnZVBhdGgiLCJpbWFnZVR5cGUiLCJkaXIiLCJmaWxlbmFtZSIsImdldEFwcEltYWdlVXJsIiwiYnVja2V0IiwiZGlyZWN0b3J5IiwiaXNUaHVtYiIsInR5cGVJZCIsImJ1Y2tldE5hbWUiLCJpbWFnZU5hbWUiLCJpbWFnZVVybCIsImdldEltYWdlVXJsIiwiaW1hZ2VEaXIiLCJ1cmxUeXBlIiwiY29uZmlndXJlZEltYWdlVXJsIiwiY29uZmlndXJlZEFwcFVybCIsInB1YmxpY0Jhc2VVcmwiLCJkZXZCYXNlVXJsIiwidGh1bWJTdWZmaXgiLCJpbWFnZUtleSIsIkJ1Y2tldCIsIkV4cGlyZXMiLCJLZXkiLCJyZXNpemVBbmRTYXZlSW1hZ2UiLCJidWZmZXIiLCJmaWxlVHlwZSIsInMzT3B0aW9ucyIsImltZ1ciLCJpbWdRIiwic3BsaXQiLCJzaGFycEZvcm1hdCIsImltYWdlT3B0aW1pemVkQnVmZmVyIiwidGh1bWJPcHRpbWl6ZWRCdWZmZXIiLCJpbWFnZUlkZW50aXR5IiwiZmlsZVNpemUiLCJyb3RhdGUiLCJyZXNpemUiLCJmaXQiLCJoZWlnaHQiLCJ3aWR0aCIsIndpdGhvdXRFbmxhcmdlbWVudCIsInRvRm9ybWF0IiwicXVhbGl0eSIsInRvQnVmZmVyIiwiSU1BR0VfU0FWRSIsImltYWdlT2JqIiwiQm9keSIsIkNvbnRlbnRUeXBlIiwiaW1hZ2VNZXRhZGF0YSIsImltYWdlU3RhdHMiLCJzb3VyY2VNZXRhZGF0YSIsIlByb21pc2UiLCJzdGF0cyIsImIiLCJnIiwiciIsImRvbWluYW50IiwiY29sb3IiLCJ0b1N0cmluZyIsInBhZFN0YXJ0IiwiZXhpZk1ldGFkYXRhIiwib3JpZW50YXRpb24iLCJyZXNvbHV0aW9uIiwiZGVuc2l0eSIsInRobVciLCJ0aG1RIiwicG9zaXRpb24iLCJ0aHVtYk9iaiIsImFkZEltYWdlIiwiZGVzY3JpcHRpb24iLCJyZXNpemVkSW1hZ2UiLCJpbnNlcnQiLCJfa2V5Iiwic2F2ZWRJbWFnZSIsImFkZEltYWdlRWRnZSIsIklNQUdFX1JFU0laRSIsImltYWdlRWRnZSIsIm5vdyIsImVkZ2VJZCIsImZvcm1hdEl0ZW1JZCIsIml0ZW1Eb2NJZCIsImZpbGVEb2NJZCIsImVkZ2UiLCJfZnJvbSIsIl90byIsImFkZGVkIiwic2F2ZSIsInJldHVybk5ldyIsImZpbGVFZGdlIiwiZG9jdW1lbnQiLCJ1cGRhdGVJbWFnZSIsImJhc2U2NCIsImltYWdlQnVmZmVyIiwidXJsIiwiY3VzdG9tUGFyYW1zIiwiZm9ybWF0QmFzZTY0Iiwic3Vic3RyIiwiaW5kZXhPZiIsIkJ1ZmZlciIsInVwZGF0ZWRGaWxlVHlwZSIsImZpbGVUeXBlRnJvbUJ1ZmZlciIsIm1pbWUiLCJpbWdQYXJhbXMiLCJjb250ZW50VHlwZSIsInJlcyIsInN0YXR1cyIsIklNQUdFX1JFUVVFU1QiLCJoZWFkZXJzIiwidXBkYXRlIiwiZGVsZXRlSW1hZ2UiLCJjYXNjYWRlIiwib3duZXJzaGlwIiwiRGVsZXRlIiwiT2JqZWN0cyIsIlF1aWV0Il0sIm1hcHBpbmdzIjoiQUFBQTs7O0NBR0MsR0FFRCxTQUFRQSxPQUFPQyxPQUFPLFFBQU8sb0JBQW9CO0FBQ2pELFNBQVFDLFFBQVEsUUFBTywrQkFBK0I7QUFDdEQsU0FBUUMsVUFBVSxFQUFFQyxhQUFhLEVBQUVDLFNBQVMsRUFBRUMsT0FBTyxFQUFFQyxXQUFXLFFBQU8sK0JBQStCO0FBQ3hHLFNBQVFDLEdBQUcsUUFBTyxXQUFXO0FBQzdCLFNBQWtCQyxPQUFPLFFBQU8sZUFBZTtBQUMvQyxPQUFPQyxnQkFBZ0IsY0FBYztBQUNyQyxPQUFPQyxXQUFXLFFBQVE7QUFFMUIsU0FBUUMsTUFBTSxRQUFPLGVBQWU7QUFDcEMsU0FBUUMsV0FBVyxFQUFFQyxLQUFLLFFBQU8sOEJBQThCO0FBQy9ELFNBQVFDLFVBQVUsUUFBTywwQkFBMEI7QUFDbkQsU0FBUUMsUUFBUSxFQUFFQyxZQUFZLFFBQU8sNkJBQTZCO0FBQ2xFLFNBQVFDLFFBQVEsRUFBRUMs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