fx-form-builder-wrapper 1.0.2 → 1.0.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.
@@ -45,7 +45,9 @@ export class DynamicTableComponent extends FxBaseComponent {
45
45
  generalValues;
46
46
  selectedAction;
47
47
  selectedRow;
48
+ selectedRowIndex;
48
49
  displayConfirmationDialog = false;
50
+ apiDataToDrawTable = [];
49
51
  tableFormControl = new FormControl();
50
52
  smartDropdownOptions = {};
51
53
  http = inject(HttpClient);
@@ -260,6 +262,7 @@ export class DynamicTableComponent extends FxBaseComponent {
260
262
  let rows;
261
263
  this.http.get(event.api).subscribe((res) => {
262
264
  if (res) {
265
+ this.apiDataToDrawTable = res;
263
266
  rows = res.map((item) => {
264
267
  const newObj = {};
265
268
  columns.forEach((col) => {
@@ -385,18 +388,19 @@ export class DynamicTableComponent extends FxBaseComponent {
385
388
  });
386
389
  return tableData;
387
390
  }
388
- handleAction(row, action) {
391
+ handleAction(row, action, rowIndex) {
389
392
  if (action.isConfirmationRequired) {
390
393
  this.selectedAction = action;
391
394
  this.selectedRow = row;
395
+ this.selectedRowIndex = rowIndex;
392
396
  this.displayConfirmationDialog = true;
393
397
  }
394
398
  else {
395
- this.executeAction(row, action);
399
+ this.executeAction(row, action, rowIndex);
396
400
  }
397
401
  }
398
402
  confirmAction() {
399
- this.executeAction(this.selectedRow, this.selectedAction);
403
+ this.executeAction(this.selectedRow, this.selectedAction, this.selectedRowIndex);
400
404
  this.displayConfirmationDialog = false;
401
405
  }
402
406
  cancelAction() {
@@ -480,11 +484,11 @@ export class DynamicTableComponent extends FxBaseComponent {
480
484
  // this.executeAction(row, action);
481
485
  // }
482
486
  // }
483
- executeAction(row, action) {
487
+ executeAction(row, action, rowIndex) {
484
488
  const payload = {};
485
489
  action.payloadOptions.forEach((option) => {
486
490
  const key = option.payloadOptionName;
487
- const value = option.payloadOptionValue ?? row[option.payloadOptionName];
491
+ const value = option.payloadOptionValue ?? this.apiDataToDrawTable[rowIndex][key];
488
492
  if (key) {
489
493
  payload[key] = value;
490
494
  }
@@ -536,11 +540,11 @@ export class DynamicTableComponent extends FxBaseComponent {
536
540
  this.destroy$.complete();
537
541
  }
538
542
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DynamicTableComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.FxBuilderWrapperService }, { token: i2.MessageService }, { token: i2.ConfirmationService }], target: i0.ɵɵFactoryTarget.Component });
539
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DynamicTableComponent, isStandalone: true, selector: "fx-dynamic-table", inputs: { tableRows: "tableRows", previewType: "previewType", tableConfig: "tableConfig" }, providers: [MessageService, ConfirmationService], usesInheritance: true, ngImport: i0, template: "<fx-settings-panel [fxData]=\"fxData\" [tableData]=\"fxData\" (configuration)=\"onChangeConfiguration($event)\">\r\n <div *ngIf=\"fxData\">\r\n <table style=\"width: 100%;\" class=\"formBuilder_dynamic_table\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let column of tableConfig.columns\">{{ column.header }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of tableConfig.rows; let rowIndex = index\">\r\n <td *ngFor=\"let column of tableConfig.columns\">\r\n <ng-container [ngSwitch]=\"column.cellType\">\r\n <span [class]=\"column?.className\" *ngSwitchCase=\"'text'\">{{row[column.header]}}</span>\r\n\r\n <!-- <input [class]=\"column?.className\" *ngSwitchCase=\"'input-text'\" type=\"text\" [placeholder]=\"column?.placeholder\"\r\n [(ngModel)]=\"row[column.header]\" /> -->\r\n\r\n <ng-container *ngSwitchCase=\"'input-text'\">\r\n <input [class]=\"column?.className\" type=\"text\" [placeholder]=\"column?.placeholder\"\r\n [(ngModel)]=\"row[column.header]\" [required]=\"column?.isRequired\" #model=\"ngModel\" />\r\n\r\n <div *ngIf=\"column?.isRequired && model.invalid && model.touched\" class=\"text-red-500 text-sm mt-1\">\r\n {{ column?.errorMessage }}\r\n </div>\r\n </ng-container>\r\n\r\n\r\n\r\n <input [class]=\"column?.className\" *ngSwitchCase=\"'input-number'\" type=\"number\"\r\n [placeholder]=\"column?.placeholder\" [(ngModel)]=\"row[column.header]\" />\r\n\r\n <select [class]=\"column?.className\" *ngSwitchCase=\"'dropdown'\" [(ngModel)]=\"row[column.header]\">\r\n\r\n <option *ngIf=\"column.placeholder\" value=\"\">{{ column.placeholder }}</option>\r\n <option *ngFor=\"let option of column?.options\" [value]=\"option?.optionValue\">\r\n {{ option?.optionName }}\r\n </option>\r\n </select>\r\n\r\n <!-- <select [class]=\"column?.className\" style=\"width: 60%;\" *ngSwitchCase=\"'smart-dropdown'\"\r\n [(ngModel)]=\"row[column.header]\">\r\n <option value=\"\">Select {{column.header}}</option>\r\n <option *ngIf=\"column.placeholder\" value=\"\">{{ column.placeholder }}</option>\r\n <option *ngFor=\"let option of smartDropdownOptions[column.header]\" [value]=\"option?.value\">\r\n {{option?.name }}\r\n </option>\r\n </select> -->\r\n\r\n <!-- <p-multiSelect [options]=\"smartDropdownOptions[column.header]\" [(ngModel)]=\"row[column.header]\" optionLabel=\"name\" optionValue=\"value\" placeholder=\"Select Cities\" *ngSwitchCase=\"'smart-dropdown'\"/> -->\r\n\r\n <!-- smart-dropdown handling -->\r\n <ng-container *ngSwitchCase=\"'smart-dropdown'\">\r\n\r\n <!-- Regular dropdown if isMultiselect is false or not set -->\r\n <select *ngIf=\"!column?.isMultiselect\" [class]=\"column?.className\" style=\"width: 60%;\"\r\n [(ngModel)]=\"row[column.header]\">\r\n <option *ngIf=\"column.placeholder\" value=\"\">{{ column.placeholder }}</option>\r\n <option *ngFor=\"let option of smartDropdownOptions[column.header]\" [value]=\"option?.value\">\r\n {{ option?.name }}\r\n </option>\r\n <option value=\"__other__\">Other</option>\r\n\r\n </select>\r\n <input *ngIf=\"row[column.header] === '__other__'\" type=\"text\" class=\"mt-2 p-inputtext-sm\"\r\n [placeholder]=\"'Enter other ' + column.header\" [(ngModel)]=\"row[column.header + '_other']\" />\r\n\r\n <!-- PrimeNG multiselect if isMultiselect is true -->\r\n <p-multiSelect *ngIf=\"column?.isMultiselect\" [options]=\"smartDropdownOptions[column.header]\"\r\n [(ngModel)]=\"row[column.header]\" [class]=\"column?.className\" optionLabel=\"name\" optionValue=\"value\"\r\n [placeholder]=\"column.placeholder || ('Select ' + column.header)\">\r\n <ng-template pTemplate=\"dropdownicon\">\r\n <div class=\"flex align-items-center dd_down_icon\">\r\n <span class=\"pi pi-angle-down text-xl\"></span>\r\n </div>\r\n </ng-template>\r\n </p-multiSelect>\r\n\r\n </ng-container>\r\n\r\n\r\n <!-- <input [class]=\"column?.className\" *ngSwitchCase=\"'checkbox'\" type=\"checkbox\"\r\n [(ngModel)]=\"row[column.header]\" /> -->\r\n <ng-container *ngSwitchCase=\"'checkbox'\">\r\n <label [class]=\"column?.className\" class=\"inline-flex items-center gap-2\">\r\n <input type=\"checkbox\" [checked]=\"row[column.header] === column.checkedValue\"\r\n (change)=\"onCheckboxChange($event, row, column)\" />\r\n {{ column?.checkBoxLabel || '' }}\r\n </label>\r\n </ng-container>\r\n <p-toast></p-toast>\r\n <p-confirmDialog></p-confirmDialog>\r\n <ng-container *ngSwitchCase=\"'action'\">\r\n <div class=\"flex flex-row gap-6 justify-start items-start\">\r\n <div *ngFor=\"let action of column?.action\" class=\"flex flex-col items-center w-20 cursor-pointer\"\r\n (click)=\"handleAction(row, action)\">\r\n <img [src]=\"action?.actionIconPath\" alt=\"icon\" class=\"w-6 h-6 mb-1\" />\r\n <span class=\"text-xs text-center break-words\">\r\n {{ action?.actionName }}\r\n </span>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n\r\n\r\n\r\n\r\n\r\n <input name=\"radio-{{rowIndex}}\" [class]=\"column?.className\" *ngSwitchCase=\"'radio'\" type=\"radio\"\r\n [(ngModel)]=\"row[column.header]\" />\r\n\r\n <div [class]=\"column?.className\" style=\"display: flex; justify-content: center; gap: 10px;\"\r\n *ngSwitchCase=\"'radio-group'\">\r\n <label *ngFor=\"let option of column.options\">\r\n <input name=\"radio-group-{{rowIndex}}\" type=\"radio\" [value]=\"option?.optionName\"\r\n [(ngModel)]=\"row[column.header]\" />\r\n {{ option?.optionName }}\r\n </label>\r\n </div>\r\n\r\n <!-- <ng-container *ngSwitchCase=\"'file-upload'\">\r\n \r\n\r\n <div class=\"flex flex-col items-end justify-end relative\">\r\n <div class=\"flex gap-2 flex-wrap\">\r\n <div \r\n class=\"relative\" \r\n *ngFor=\"let image of uploadedImages?.[rowIndex]; let i = index\"\r\n >\r\n <img \r\n width=\"100\" \r\n [src]=\"image?.result\"\r\n alt=\"Uploaded Image\"\r\n class=\"rounded shadow\"\r\n />\r\n <button \r\n (click)=\"deleteFile(rowIndex, i)\" \r\n class=\"absolute top-0 right-0 text-white rounded-md w-5 h-5 flex items-center justify-center shadow-lg hover:bg-red-600\"\r\n >\r\n \u274C\r\n </button>\r\n </div>\r\n </div>\r\n \r\n <input \r\n [class]=\"column?.className\" \r\n type=\"file\" \r\n name=\"file\" \r\n #uploadFile \r\n hidden \r\n multiple\r\n (change)=\"uploadImage($event, rowIndex)\" \r\n />\r\n \r\n <button \r\n (click)=\"uploadFile.click()\" \r\n class=\"mt-2 bg-blue-500 text-white px-3 py-1 rounded hover:bg-blue-600\"\r\n >\r\n Upload\r\n </button>\r\n </div>\r\n \r\n \r\n </ng-container> -->\r\n\r\n <ng-container *ngSwitchCase=\"'file-upload'\">\r\n <div class=\"flex items-center justify-end relative gap-4 flex-wrap\">\r\n <div class=\"flex gap-2 flex-wrap\">\r\n <div class=\"relative\" *ngFor=\"let image of uploadedImages?.[rowIndex]; let i = index\">\r\n <img width=\"100\" height=\"80\" [src]=\"image?.result\" alt=\"Uploaded Image\"\r\n class=\"rounded shadow orientation\" />\r\n <a (click)=\"deleteFile(rowIndex, i)\"\r\n class=\"absolute top-0 right-0 text-white rounded-md w-5 h-5 flex items-center justify-center cursor-pointer\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_6837_29683)\">\r\n <rect width=\"18\" height=\"18\" rx=\"9\" fill=\"#F3A041\" />\r\n <mask id=\"mask0_6837_29683\" style=\"mask-type:alpha\" maskUnits=\"userSpaceOnUse\" x=\"4\" y=\"4\"\r\n width=\"24\" height=\"24\">\r\n <rect x=\"4\" y=\"4\" width=\"24\" height=\"24\" fill=\"#D9D9D9\" />\r\n </mask>\r\n <g mask=\"url(#mask0_6837_29683)\">\r\n <path\r\n d=\"M8.2045 8.99815L5.81802 6.61167L6.61351 5.81617L9 8.20266L11.3865 5.81617L12.182 6.61167L9.7955 8.99815L12.182 11.3846L11.3865 12.1801L9 9.79365L6.61351 12.1801L5.81802 11.3846L8.2045 8.99815Z\"\r\n fill=\"white\" />\r\n </g>\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_6837_29683\">\r\n <rect width=\"18\" height=\"18\" rx=\"9\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </a>\r\n </div>\r\n </div>\r\n\r\n <input [class]=\"column?.className\" type=\"file\" name=\"file\" #uploadFile hidden multiple\r\n (change)=\"uploadImage($event, rowIndex)\" />\r\n <div class=\"flex flex-col justify-center items-center cursor-pointer\" (click)=\"uploadFile.click()\">\r\n <div>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"29\" height=\"28\" viewBox=\"0 0 29 28\" fill=\"none\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M14.001 3.00195C11.5322 3.00195 9.16722 3.86956 7.23641 5.38414L7.23598 4.59695C7.23598 4.52473 7.22175 4.45321 7.19411 4.38648C7.16647 4.31975 7.12596 4.25912 7.07489 4.20804C7.02381 4.15697 6.96318 4.11646 6.89645 4.08882C6.82972 4.06118 6.7582 4.04695 6.68598 4.04695C6.61375 4.04695 6.54223 4.06118 6.4755 4.08882C6.40877 4.11646 6.34814 4.15697 6.29707 4.20804C6.24599 4.25912 6.20548 4.31975 6.17784 4.38648C6.1502 4.45321 6.13598 4.52473 6.13598 4.59695L6.13642 6.68652C6.13643 6.83239 6.19438 6.97228 6.29752 7.07542C6.40067 7.17856 6.54055 7.23651 6.68642 7.23652H8.77598C8.8482 7.23652 8.91972 7.2223 8.98645 7.19466C9.05318 7.16702 9.11381 7.12651 9.16489 7.07543C9.21596 7.02436 9.25647 6.96373 9.28411 6.897C9.31175 6.83027 9.32598 6.75875 9.32598 6.68652C9.32598 6.6143 9.31175 6.54278 9.28411 6.47605C9.25647 6.40932 9.21596 6.34869 9.16489 6.29761C9.11381 6.24654 9.05318 6.20603 8.98645 6.17839C8.91972 6.15075 8.8482 6.13652 8.77598 6.13652H8.0584C9.7702 4.84387 11.8399 4.10195 14.001 4.10195C19.4751 4.10195 23.901 8.52782 23.901 14.002C23.901 19.4761 19.4751 23.902 14.001 23.902C8.52684 23.902 4.10098 19.4761 4.10098 14.002C4.10098 12.6381 4.38263 11.2888 4.92855 10.0389C4.98691 9.90532 4.98982 9.75399 4.93665 9.61822C4.88347 9.48246 4.77855 9.37336 4.64496 9.31492C4.57877 9.28596 4.50753 9.27032 4.4353 9.2689C4.36306 9.26747 4.29126 9.2803 4.22398 9.30663C4.15671 9.33297 4.09528 9.3723 4.04321 9.42238C3.99114 9.47247 3.94944 9.53232 3.92051 9.59852C3.31393 10.9872 3.00098 12.4866 3.00098 14.002C3.00098 20.0706 7.93236 25.002 14.001 25.002C20.0696 25.002 25.001 20.0706 25.001 14.002C25.001 7.93334 20.0696 3.00195 14.001 3.00195Z\"\r\n fill=\"#F3A041\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M13.9988 6.13965C9.6616 6.13965 6.13379 9.66746 6.13379 14.0046C6.13379 18.3418 9.6616 21.8696 13.9988 21.8696C18.336 21.8696 21.8638 18.3418 21.8638 14.0046C21.8638 9.66746 18.336 6.13965 13.9988 6.13965ZM13.9988 8.22965C14.1447 8.22965 14.2846 8.28759 14.3877 8.39074C14.4908 8.49388 14.5488 8.63378 14.5488 8.77965V13.7769L17.5227 16.7508C17.6258 16.8539 17.6837 16.9938 17.6837 17.1396C17.6837 17.2855 17.6258 17.4254 17.5227 17.5285C17.4195 17.6316 17.2796 17.6896 17.1338 17.6896C16.9879 17.6896 16.8481 17.6316 16.7449 17.5285L13.6099 14.3935C13.5068 14.2904 13.4488 14.1505 13.4488 14.0046V8.77965C13.4488 8.63378 13.5067 8.49388 13.6099 8.39074C13.713 8.28759 13.8529 8.22965 13.9988 8.22965Z\"\r\n fill=\"#F3A041\" />\r\n <rect width=\"28.56\" height=\"28\" rx=\"1.51479\" fill=\"#F3A041\" />\r\n <path\r\n d=\"M15.068 22.7391V17.6708H18.4968L14.2108 12.6025L9.9248 17.6708H13.3536V22.7391H9.06759V22.6969C8.92358 22.7053 8.78643 22.7391 8.63899 22.7391C6.93391 22.7391 5.29866 22.0717 4.09298 20.8835C2.8873 19.6954 2.20996 18.084 2.20996 16.4037C2.20996 13.1532 4.70443 10.5042 7.90523 10.141C8.18585 8.6953 8.96892 7.39118 10.1197 6.45292C11.2706 5.51465 12.7172 5.00089 14.2108 5C15.7047 5.00082 17.1515 5.51452 18.3026 6.45277C19.4537 7.39101 20.2371 8.69516 20.5181 10.141C23.7189 10.5042 26.21 13.1532 26.21 16.4037C26.21 18.084 25.5326 19.6954 24.3269 20.8835C23.1213 22.0717 21.486 22.7391 19.7809 22.7391C19.6369 22.7391 19.4981 22.7053 19.3523 22.6969V22.7391H15.068Z\"\r\n fill=\"white\" />\r\n </svg>\r\n </div>\r\n <a type=\"button\" (click)=\"uploadFile.click()\" class=\"text-base cursor-pointer\">\r\n {{ 'Upload' }}\r\n </a>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'textarea'\">\r\n <textarea [class]=\"column?.className\" name=\"\" id=\"\" cols=\"30\" rows=\"2\"\r\n [placeholder]=\"column?.placeholder\"></textarea>\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <!-- Your main template -->\r\n<p-dialog header=\"Confirmation\"\r\n[(visible)]=\"displayConfirmationDialog\"\r\nmodal=\"true\"\r\n[closable]=\"false\"\r\n[responsive]=\"true\"\r\nstyleClass=\"confirmation-dialog\"\r\n[style]=\"{width: '400px'}\">\r\n\r\n<div class=\"p-d-flex p-ai-center\">\r\n<i class=\"pi pi-exclamation-triangle p-mr-2\" style=\"font-size: 2rem; color: #f39c12\"></i>\r\n<span>Are you sure you want to perform \"<strong>{{ selectedAction?.actionName }}</strong>\"?</span>\r\n</div>\r\n\r\n<ng-template pTemplate=\"footer\">\r\n<button pButton label=\"Yes\" icon=\"pi pi-check\" (click)=\"confirmAction()\" class=\"p-button-text\" autofocus></button>\r\n<button pButton label=\"No\" icon=\"pi pi-times\" (click)=\"cancelAction()\" class=\"p-button-text\"></button>\r\n</ng-template>\r\n</p-dialog>\r\n\r\n </div>\r\n</fx-settings-panel>", styles: ["@import\"https://unpkg.com/primeng@17.18.10/resources/themes/lara-light-blue/theme.css\";@import\"https://unpkg.com/primeng@17.18.10/resources/primeng.min.css\";@import\"https://unpkg.com/primeicons@6.0.0/primeicons.css\";.formBuilder_dynamic_table{border:.6px solid #ccc}.formBuilder_dynamic_table>thead>tr{background-color:#4682b4;color:#fff}.formBuilder_dynamic_table>thead>tr>th{font-weight:400!important;padding:.25rem .55rem;font-size:.875rem;text-align:left}.formBuilder_dynamic_table>tbody>tr:nth-child(odd){background-color:#fff}.formBuilder_dynamic_table>tbody>tr:nth-child(2n){background-color:#f6f6f6}.formBuilder_dynamic_table>tbody>tr>td{text-align:left;padding:.25rem .55rem}[type=text],[type=email],[type=url],[type=password],[type=number],[type=date],[type=datetime-local],[type=month],[type=search],[type=tel],[type=time],[type=week],[multiple],textarea,select{border:1px solid #ccc;border-radius:4px;padding:4px}select:not([size]){background:url('data:image/svg+xml,<svg width=\"22\" height=\"20\" viewBox=\"0 0 26 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">%0D%0A <rect x=\"0.5\" width=\"24.766\" height=\"24\" rx=\"3\" fill=\"%23FF7900\" fill-opacity=\"0.1\"/>%0D%0A <path d=\"M12.8918 16.5019C12.7255 16.5019 12.5695 16.4736 12.4239 16.4169C12.2783 16.3602 12.1431 16.2628 12.0183 16.1248L6.27803 9.8162C6.04925 9.56477 5.92946 9.25025 5.91864 8.87265C5.90783 8.49505 6.02762 8.16956 6.27803 7.89619C6.50681 7.64476 6.79799 7.51905 7.15155 7.51905C7.50512 7.51905 7.7963 7.64476 8.02508 7.89619L12.8918 13.2105L17.7586 7.89619C17.9874 7.64476 18.2736 7.51356 18.6172 7.50259C18.9607 7.49162 19.2569 7.62282 19.5056 7.89619C19.7344 8.14762 19.8488 8.46762 19.8488 8.85619C19.8488 9.24477 19.7344 9.56477 19.5056 9.8162L13.7654 16.1248C13.6406 16.2619 13.5054 16.3593 13.3598 16.4169C13.2142 16.4745 13.0582 16.5028 12.8918 16.5019Z\" fill=\"%23FAA762\"/>%0D%0A</svg>%0D%0A') right .4rem center no-repeat #fff;border:1px solid #cdcdcd;padding:6px 30px 6px 10px;border-radius:4px;font-size:14px;font-weight:400;cursor:pointer;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%!important}.dd_down_icon{background:#f3a04126;border-radius:3px!important;padding:2px}[type=checkbox]{padding:12px}[type=checkbox]:checked{background-color:#f3a041!important;padding:12px;background-size:1em 1em!important}[type=radio]{width:20px;height:20px}[type=radio]:checked{background-color:#f3a041!important;background-size:1.5em 1.5em}[type=checkbox]:focus,[type=radio]:focus{--tw-ring-color: #f3a041 !important}:host::ng-deep .p-multiselect{height:37.6px!important;border:1px solid #cdcdcd}:host::ng-deep .p-multiselect .p-multiselect-label{padding:.5rem .75rem}:host::ng-deep .p-multiselect .p-multiselect-label .p-placeholder{color:#454545}:host::ng-deep .p-multiselect .p-multiselect-trigger{width:2.5rem!important}.dd_down_icon span{color:#f3a041}.orientation{height:82%!important}.confirmation-dialog .p-dialog-content{text-align:center}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i4.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i4.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: SettingsPanelComponent, selector: "fx-settings-panel", inputs: ["tableData"], outputs: ["configuration"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: MultiSelectModule }, { kind: "component", type: i5.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "directive", type: i2.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: InputNumberModule }, { kind: "ngmodule", type: InputTextModule }, { kind: "ngmodule", type: DropdownModule }, { kind: "ngmodule", type: ToastModule }, { kind: "component", type: i6.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "life", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }, { kind: "ngmodule", type: ConfirmDialogModule }, { kind: "component", type: i7.ConfirmDialog, selector: "p-confirmDialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "closeAriaLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "visible", "position"], outputs: ["onHide"] }, { kind: "directive", type: i8.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i9.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "visible", "style", "position"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }] });
543
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DynamicTableComponent, isStandalone: true, selector: "fx-dynamic-table", inputs: { tableRows: "tableRows", previewType: "previewType", tableConfig: "tableConfig" }, providers: [MessageService, ConfirmationService], usesInheritance: true, ngImport: i0, template: "<fx-settings-panel [fxData]=\"fxData\" [tableData]=\"fxData\" (configuration)=\"onChangeConfiguration($event)\">\r\n <div *ngIf=\"fxData\">\r\n <table style=\"width: 100%;\" class=\"formBuilder_dynamic_table\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let column of tableConfig.columns\">{{ column.header }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of tableConfig.rows; let rowIndex = index\">\r\n <td *ngFor=\"let column of tableConfig.columns\">\r\n <ng-container [ngSwitch]=\"column.cellType\">\r\n <span [class]=\"column?.className\" *ngSwitchCase=\"'text'\">{{row[column.header]}}</span>\r\n\r\n <!-- <input [class]=\"column?.className\" *ngSwitchCase=\"'input-text'\" type=\"text\" [placeholder]=\"column?.placeholder\"\r\n [(ngModel)]=\"row[column.header]\" /> -->\r\n\r\n <ng-container *ngSwitchCase=\"'input-text'\">\r\n <input [class]=\"column?.className\" type=\"text\" [placeholder]=\"column?.placeholder\"\r\n [(ngModel)]=\"row[column.header]\" [required]=\"column?.isRequired\" #model=\"ngModel\" />\r\n\r\n <div *ngIf=\"column?.isRequired && model.invalid && model.touched\" class=\"text-red-500 text-sm mt-1\">\r\n {{ column?.errorMessage }}\r\n </div>\r\n </ng-container>\r\n\r\n\r\n\r\n <input [class]=\"column?.className\" *ngSwitchCase=\"'input-number'\" type=\"number\"\r\n [placeholder]=\"column?.placeholder\" [(ngModel)]=\"row[column.header]\" />\r\n\r\n <select [class]=\"column?.className\" *ngSwitchCase=\"'dropdown'\" [(ngModel)]=\"row[column.header]\">\r\n\r\n <option *ngIf=\"column.placeholder\" value=\"\">{{ column.placeholder }}</option>\r\n <option *ngFor=\"let option of column?.options\" [value]=\"option?.optionValue\">\r\n {{ option?.optionName }}\r\n </option>\r\n </select>\r\n\r\n <!-- <select [class]=\"column?.className\" style=\"width: 60%;\" *ngSwitchCase=\"'smart-dropdown'\"\r\n [(ngModel)]=\"row[column.header]\">\r\n <option value=\"\">Select {{column.header}}</option>\r\n <option *ngIf=\"column.placeholder\" value=\"\">{{ column.placeholder }}</option>\r\n <option *ngFor=\"let option of smartDropdownOptions[column.header]\" [value]=\"option?.value\">\r\n {{option?.name }}\r\n </option>\r\n </select> -->\r\n\r\n <!-- <p-multiSelect [options]=\"smartDropdownOptions[column.header]\" [(ngModel)]=\"row[column.header]\" optionLabel=\"name\" optionValue=\"value\" placeholder=\"Select Cities\" *ngSwitchCase=\"'smart-dropdown'\"/> -->\r\n\r\n <!-- smart-dropdown handling -->\r\n <ng-container *ngSwitchCase=\"'smart-dropdown'\">\r\n\r\n <!-- Regular dropdown if isMultiselect is false or not set -->\r\n <select *ngIf=\"!column?.isMultiselect\" [class]=\"column?.className\" style=\"width: 60%;\"\r\n [(ngModel)]=\"row[column.header]\">\r\n <option *ngIf=\"column.placeholder\" value=\"\">{{ column.placeholder }}</option>\r\n <option *ngFor=\"let option of smartDropdownOptions[column.header]\" [value]=\"option?.value\">\r\n {{ option?.name }}\r\n </option>\r\n <option value=\"__other__\">Other</option>\r\n\r\n </select>\r\n <input *ngIf=\"row[column.header] === '__other__'\" type=\"text\" class=\"mt-2 p-inputtext-sm\"\r\n [placeholder]=\"'Enter other ' + column.header\" [(ngModel)]=\"row[column.header + '_other']\" />\r\n\r\n <!-- PrimeNG multiselect if isMultiselect is true -->\r\n <p-multiSelect *ngIf=\"column?.isMultiselect\" [options]=\"smartDropdownOptions[column.header]\"\r\n [(ngModel)]=\"row[column.header]\" [class]=\"column?.className\" optionLabel=\"name\" optionValue=\"value\"\r\n [placeholder]=\"column.placeholder || ('Select ' + column.header)\">\r\n <ng-template pTemplate=\"dropdownicon\">\r\n <div class=\"flex align-items-center dd_down_icon\">\r\n <span class=\"pi pi-angle-down text-xl\"></span>\r\n </div>\r\n </ng-template>\r\n </p-multiSelect>\r\n\r\n </ng-container>\r\n\r\n\r\n <!-- <input [class]=\"column?.className\" *ngSwitchCase=\"'checkbox'\" type=\"checkbox\"\r\n [(ngModel)]=\"row[column.header]\" /> -->\r\n <ng-container *ngSwitchCase=\"'checkbox'\">\r\n <label [class]=\"column?.className\" class=\"inline-flex items-center gap-2\">\r\n <input type=\"checkbox\" [checked]=\"row[column.header] === column.checkedValue\"\r\n (change)=\"onCheckboxChange($event, row, column)\" />\r\n {{ column?.checkBoxLabel || '' }}\r\n </label>\r\n </ng-container>\r\n <p-toast></p-toast>\r\n <p-confirmDialog></p-confirmDialog>\r\n <ng-container *ngSwitchCase=\"'action'\">\r\n <div class=\"flex flex-row gap-6 justify-start items-start\">\r\n <div *ngFor=\"let action of column?.action\" class=\"flex flex-col items-center w-20 cursor-pointer\"\r\n (click)=\"handleAction(row, action,rowIndex)\">\r\n <img [src]=\"action?.actionIconPath\" alt=\"icon\" class=\"w-6 h-6 mb-1\" />\r\n <span class=\"text-xs text-center break-words\">\r\n {{ action?.actionName }}\r\n </span>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n\r\n\r\n\r\n\r\n\r\n <input name=\"radio-{{rowIndex}}\" [class]=\"column?.className\" *ngSwitchCase=\"'radio'\" type=\"radio\"\r\n [(ngModel)]=\"row[column.header]\" />\r\n\r\n <div [class]=\"column?.className\" style=\"display: flex; justify-content: center; gap: 10px;\"\r\n *ngSwitchCase=\"'radio-group'\">\r\n <label *ngFor=\"let option of column.options\">\r\n <input name=\"radio-group-{{rowIndex}}\" type=\"radio\" [value]=\"option?.optionName\"\r\n [(ngModel)]=\"row[column.header]\" />\r\n {{ option?.optionName }}\r\n </label>\r\n </div>\r\n\r\n <!-- <ng-container *ngSwitchCase=\"'file-upload'\">\r\n \r\n\r\n <div class=\"flex flex-col items-end justify-end relative\">\r\n <div class=\"flex gap-2 flex-wrap\">\r\n <div \r\n class=\"relative\" \r\n *ngFor=\"let image of uploadedImages?.[rowIndex]; let i = index\"\r\n >\r\n <img \r\n width=\"100\" \r\n [src]=\"image?.result\"\r\n alt=\"Uploaded Image\"\r\n class=\"rounded shadow\"\r\n />\r\n <button \r\n (click)=\"deleteFile(rowIndex, i)\" \r\n class=\"absolute top-0 right-0 text-white rounded-md w-5 h-5 flex items-center justify-center shadow-lg hover:bg-red-600\"\r\n >\r\n \u274C\r\n </button>\r\n </div>\r\n </div>\r\n \r\n <input \r\n [class]=\"column?.className\" \r\n type=\"file\" \r\n name=\"file\" \r\n #uploadFile \r\n hidden \r\n multiple\r\n (change)=\"uploadImage($event, rowIndex)\" \r\n />\r\n \r\n <button \r\n (click)=\"uploadFile.click()\" \r\n class=\"mt-2 bg-blue-500 text-white px-3 py-1 rounded hover:bg-blue-600\"\r\n >\r\n Upload\r\n </button>\r\n </div>\r\n \r\n \r\n </ng-container> -->\r\n\r\n <ng-container *ngSwitchCase=\"'file-upload'\">\r\n <div class=\"flex items-center justify-end relative gap-4 flex-wrap\">\r\n <div class=\"flex gap-2 flex-wrap\">\r\n <div class=\"relative\" *ngFor=\"let image of uploadedImages?.[rowIndex]; let i = index\">\r\n <img width=\"100\" height=\"80\" [src]=\"image?.result\" alt=\"Uploaded Image\"\r\n class=\"rounded shadow orientation\" />\r\n <a (click)=\"deleteFile(rowIndex, i)\"\r\n class=\"absolute top-0 right-0 text-white rounded-md w-5 h-5 flex items-center justify-center cursor-pointer\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_6837_29683)\">\r\n <rect width=\"18\" height=\"18\" rx=\"9\" fill=\"#F3A041\" />\r\n <mask id=\"mask0_6837_29683\" style=\"mask-type:alpha\" maskUnits=\"userSpaceOnUse\" x=\"4\" y=\"4\"\r\n width=\"24\" height=\"24\">\r\n <rect x=\"4\" y=\"4\" width=\"24\" height=\"24\" fill=\"#D9D9D9\" />\r\n </mask>\r\n <g mask=\"url(#mask0_6837_29683)\">\r\n <path\r\n d=\"M8.2045 8.99815L5.81802 6.61167L6.61351 5.81617L9 8.20266L11.3865 5.81617L12.182 6.61167L9.7955 8.99815L12.182 11.3846L11.3865 12.1801L9 9.79365L6.61351 12.1801L5.81802 11.3846L8.2045 8.99815Z\"\r\n fill=\"white\" />\r\n </g>\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_6837_29683\">\r\n <rect width=\"18\" height=\"18\" rx=\"9\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </a>\r\n </div>\r\n </div>\r\n\r\n <input [class]=\"column?.className\" type=\"file\" name=\"file\" #uploadFile hidden multiple\r\n (change)=\"uploadImage($event, rowIndex)\" />\r\n <div class=\"flex flex-col justify-center items-center cursor-pointer\" (click)=\"uploadFile.click()\">\r\n <div>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"29\" height=\"28\" viewBox=\"0 0 29 28\" fill=\"none\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M14.001 3.00195C11.5322 3.00195 9.16722 3.86956 7.23641 5.38414L7.23598 4.59695C7.23598 4.52473 7.22175 4.45321 7.19411 4.38648C7.16647 4.31975 7.12596 4.25912 7.07489 4.20804C7.02381 4.15697 6.96318 4.11646 6.89645 4.08882C6.82972 4.06118 6.7582 4.04695 6.68598 4.04695C6.61375 4.04695 6.54223 4.06118 6.4755 4.08882C6.40877 4.11646 6.34814 4.15697 6.29707 4.20804C6.24599 4.25912 6.20548 4.31975 6.17784 4.38648C6.1502 4.45321 6.13598 4.52473 6.13598 4.59695L6.13642 6.68652C6.13643 6.83239 6.19438 6.97228 6.29752 7.07542C6.40067 7.17856 6.54055 7.23651 6.68642 7.23652H8.77598C8.8482 7.23652 8.91972 7.2223 8.98645 7.19466C9.05318 7.16702 9.11381 7.12651 9.16489 7.07543C9.21596 7.02436 9.25647 6.96373 9.28411 6.897C9.31175 6.83027 9.32598 6.75875 9.32598 6.68652C9.32598 6.6143 9.31175 6.54278 9.28411 6.47605C9.25647 6.40932 9.21596 6.34869 9.16489 6.29761C9.11381 6.24654 9.05318 6.20603 8.98645 6.17839C8.91972 6.15075 8.8482 6.13652 8.77598 6.13652H8.0584C9.7702 4.84387 11.8399 4.10195 14.001 4.10195C19.4751 4.10195 23.901 8.52782 23.901 14.002C23.901 19.4761 19.4751 23.902 14.001 23.902C8.52684 23.902 4.10098 19.4761 4.10098 14.002C4.10098 12.6381 4.38263 11.2888 4.92855 10.0389C4.98691 9.90532 4.98982 9.75399 4.93665 9.61822C4.88347 9.48246 4.77855 9.37336 4.64496 9.31492C4.57877 9.28596 4.50753 9.27032 4.4353 9.2689C4.36306 9.26747 4.29126 9.2803 4.22398 9.30663C4.15671 9.33297 4.09528 9.3723 4.04321 9.42238C3.99114 9.47247 3.94944 9.53232 3.92051 9.59852C3.31393 10.9872 3.00098 12.4866 3.00098 14.002C3.00098 20.0706 7.93236 25.002 14.001 25.002C20.0696 25.002 25.001 20.0706 25.001 14.002C25.001 7.93334 20.0696 3.00195 14.001 3.00195Z\"\r\n fill=\"#F3A041\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M13.9988 6.13965C9.6616 6.13965 6.13379 9.66746 6.13379 14.0046C6.13379 18.3418 9.6616 21.8696 13.9988 21.8696C18.336 21.8696 21.8638 18.3418 21.8638 14.0046C21.8638 9.66746 18.336 6.13965 13.9988 6.13965ZM13.9988 8.22965C14.1447 8.22965 14.2846 8.28759 14.3877 8.39074C14.4908 8.49388 14.5488 8.63378 14.5488 8.77965V13.7769L17.5227 16.7508C17.6258 16.8539 17.6837 16.9938 17.6837 17.1396C17.6837 17.2855 17.6258 17.4254 17.5227 17.5285C17.4195 17.6316 17.2796 17.6896 17.1338 17.6896C16.9879 17.6896 16.8481 17.6316 16.7449 17.5285L13.6099 14.3935C13.5068 14.2904 13.4488 14.1505 13.4488 14.0046V8.77965C13.4488 8.63378 13.5067 8.49388 13.6099 8.39074C13.713 8.28759 13.8529 8.22965 13.9988 8.22965Z\"\r\n fill=\"#F3A041\" />\r\n <rect width=\"28.56\" height=\"28\" rx=\"1.51479\" fill=\"#F3A041\" />\r\n <path\r\n d=\"M15.068 22.7391V17.6708H18.4968L14.2108 12.6025L9.9248 17.6708H13.3536V22.7391H9.06759V22.6969C8.92358 22.7053 8.78643 22.7391 8.63899 22.7391C6.93391 22.7391 5.29866 22.0717 4.09298 20.8835C2.8873 19.6954 2.20996 18.084 2.20996 16.4037C2.20996 13.1532 4.70443 10.5042 7.90523 10.141C8.18585 8.6953 8.96892 7.39118 10.1197 6.45292C11.2706 5.51465 12.7172 5.00089 14.2108 5C15.7047 5.00082 17.1515 5.51452 18.3026 6.45277C19.4537 7.39101 20.2371 8.69516 20.5181 10.141C23.7189 10.5042 26.21 13.1532 26.21 16.4037C26.21 18.084 25.5326 19.6954 24.3269 20.8835C23.1213 22.0717 21.486 22.7391 19.7809 22.7391C19.6369 22.7391 19.4981 22.7053 19.3523 22.6969V22.7391H15.068Z\"\r\n fill=\"white\" />\r\n </svg>\r\n </div>\r\n <a type=\"button\" (click)=\"uploadFile.click()\" class=\"text-base cursor-pointer\">\r\n {{ 'Upload' }}\r\n </a>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'textarea'\">\r\n <textarea [class]=\"column?.className\" name=\"\" id=\"\" cols=\"30\" rows=\"2\"\r\n [placeholder]=\"column?.placeholder\"></textarea>\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <!-- Your main template -->\r\n<p-dialog header=\"Confirmation\"\r\n[(visible)]=\"displayConfirmationDialog\"\r\nmodal=\"true\"\r\n[closable]=\"false\"\r\n[responsive]=\"true\"\r\nstyleClass=\"confirmation-dialog\"\r\n[style]=\"{width: '400px'}\">\r\n\r\n<div class=\"p-d-flex p-ai-center\">\r\n<i class=\"pi pi-exclamation-triangle p-mr-2\" style=\"font-size: 2rem; color: #f39c12\"></i>\r\n<span>Are you sure you want to perform \"<strong>{{ selectedAction?.actionName }}</strong>\"?</span>\r\n</div>\r\n\r\n<ng-template pTemplate=\"footer\">\r\n<button pButton label=\"Yes\" icon=\"pi pi-check\" (click)=\"confirmAction()\" class=\"p-button-text\" autofocus></button>\r\n<button pButton label=\"No\" icon=\"pi pi-times\" (click)=\"cancelAction()\" class=\"p-button-text\"></button>\r\n</ng-template>\r\n</p-dialog>\r\n\r\n </div>\r\n</fx-settings-panel>", styles: ["@import\"https://unpkg.com/primeng@17.18.10/resources/themes/lara-light-blue/theme.css\";@import\"https://unpkg.com/primeng@17.18.10/resources/primeng.min.css\";@import\"https://unpkg.com/primeicons@6.0.0/primeicons.css\";.formBuilder_dynamic_table{border:.6px solid #ccc}.formBuilder_dynamic_table>thead>tr{background-color:#4682b4;color:#fff}.formBuilder_dynamic_table>thead>tr>th{font-weight:400!important;padding:.25rem .55rem;font-size:.875rem;text-align:left}.formBuilder_dynamic_table>tbody>tr:nth-child(odd){background-color:#fff}.formBuilder_dynamic_table>tbody>tr:nth-child(2n){background-color:#f6f6f6}.formBuilder_dynamic_table>tbody>tr>td{text-align:left;padding:.25rem .55rem}[type=text],[type=email],[type=url],[type=password],[type=number],[type=date],[type=datetime-local],[type=month],[type=search],[type=tel],[type=time],[type=week],[multiple],textarea,select{border:1px solid #ccc;border-radius:4px;padding:4px}select:not([size]){background:url('data:image/svg+xml,<svg width=\"22\" height=\"20\" viewBox=\"0 0 26 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">%0D%0A <rect x=\"0.5\" width=\"24.766\" height=\"24\" rx=\"3\" fill=\"%23FF7900\" fill-opacity=\"0.1\"/>%0D%0A <path d=\"M12.8918 16.5019C12.7255 16.5019 12.5695 16.4736 12.4239 16.4169C12.2783 16.3602 12.1431 16.2628 12.0183 16.1248L6.27803 9.8162C6.04925 9.56477 5.92946 9.25025 5.91864 8.87265C5.90783 8.49505 6.02762 8.16956 6.27803 7.89619C6.50681 7.64476 6.79799 7.51905 7.15155 7.51905C7.50512 7.51905 7.7963 7.64476 8.02508 7.89619L12.8918 13.2105L17.7586 7.89619C17.9874 7.64476 18.2736 7.51356 18.6172 7.50259C18.9607 7.49162 19.2569 7.62282 19.5056 7.89619C19.7344 8.14762 19.8488 8.46762 19.8488 8.85619C19.8488 9.24477 19.7344 9.56477 19.5056 9.8162L13.7654 16.1248C13.6406 16.2619 13.5054 16.3593 13.3598 16.4169C13.2142 16.4745 13.0582 16.5028 12.8918 16.5019Z\" fill=\"%23FAA762\"/>%0D%0A</svg>%0D%0A') right .4rem center no-repeat #fff;border:1px solid #cdcdcd;padding:6px 30px 6px 10px;border-radius:4px;font-size:14px;font-weight:400;cursor:pointer;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%!important}.dd_down_icon{background:#f3a04126;border-radius:3px!important;padding:2px}[type=checkbox]{padding:12px}[type=checkbox]:checked{background-color:#f3a041!important;padding:12px;background-size:1em 1em!important}[type=radio]{width:20px;height:20px}[type=radio]:checked{background-color:#f3a041!important;background-size:1.5em 1.5em}[type=checkbox]:focus,[type=radio]:focus{--tw-ring-color: #f3a041 !important}:host::ng-deep .p-multiselect{height:37.6px!important;border:1px solid #cdcdcd}:host::ng-deep .p-multiselect .p-multiselect-label{padding:.5rem .75rem}:host::ng-deep .p-multiselect .p-multiselect-label .p-placeholder{color:#454545}:host::ng-deep .p-multiselect .p-multiselect-trigger{width:2.5rem!important}.dd_down_icon span{color:#f3a041}.orientation{height:82%!important}.confirmation-dialog .p-dialog-content{text-align:center}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i4.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i4.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: SettingsPanelComponent, selector: "fx-settings-panel", inputs: ["tableData"], outputs: ["configuration"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: MultiSelectModule }, { kind: "component", type: i5.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "directive", type: i2.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: InputNumberModule }, { kind: "ngmodule", type: InputTextModule }, { kind: "ngmodule", type: DropdownModule }, { kind: "ngmodule", type: ToastModule }, { kind: "component", type: i6.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "life", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }, { kind: "ngmodule", type: ConfirmDialogModule }, { kind: "component", type: i7.ConfirmDialog, selector: "p-confirmDialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "closeAriaLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "visible", "position"], outputs: ["onHide"] }, { kind: "directive", type: i8.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i9.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "visible", "style", "position"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }] });
540
544
  }
541
545
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DynamicTableComponent, decorators: [{
542
546
  type: Component,
543
- args: [{ selector: 'fx-dynamic-table', standalone: true, imports: [CommonModule, FormsModule, SettingsPanelComponent, ReactiveFormsModule, MultiSelectModule, InputNumberModule, InputTextModule, DropdownModule, ToastModule, ConfirmDialogModule, DialogModule], providers: [MessageService, ConfirmationService], template: "<fx-settings-panel [fxData]=\"fxData\" [tableData]=\"fxData\" (configuration)=\"onChangeConfiguration($event)\">\r\n <div *ngIf=\"fxData\">\r\n <table style=\"width: 100%;\" class=\"formBuilder_dynamic_table\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let column of tableConfig.columns\">{{ column.header }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of tableConfig.rows; let rowIndex = index\">\r\n <td *ngFor=\"let column of tableConfig.columns\">\r\n <ng-container [ngSwitch]=\"column.cellType\">\r\n <span [class]=\"column?.className\" *ngSwitchCase=\"'text'\">{{row[column.header]}}</span>\r\n\r\n <!-- <input [class]=\"column?.className\" *ngSwitchCase=\"'input-text'\" type=\"text\" [placeholder]=\"column?.placeholder\"\r\n [(ngModel)]=\"row[column.header]\" /> -->\r\n\r\n <ng-container *ngSwitchCase=\"'input-text'\">\r\n <input [class]=\"column?.className\" type=\"text\" [placeholder]=\"column?.placeholder\"\r\n [(ngModel)]=\"row[column.header]\" [required]=\"column?.isRequired\" #model=\"ngModel\" />\r\n\r\n <div *ngIf=\"column?.isRequired && model.invalid && model.touched\" class=\"text-red-500 text-sm mt-1\">\r\n {{ column?.errorMessage }}\r\n </div>\r\n </ng-container>\r\n\r\n\r\n\r\n <input [class]=\"column?.className\" *ngSwitchCase=\"'input-number'\" type=\"number\"\r\n [placeholder]=\"column?.placeholder\" [(ngModel)]=\"row[column.header]\" />\r\n\r\n <select [class]=\"column?.className\" *ngSwitchCase=\"'dropdown'\" [(ngModel)]=\"row[column.header]\">\r\n\r\n <option *ngIf=\"column.placeholder\" value=\"\">{{ column.placeholder }}</option>\r\n <option *ngFor=\"let option of column?.options\" [value]=\"option?.optionValue\">\r\n {{ option?.optionName }}\r\n </option>\r\n </select>\r\n\r\n <!-- <select [class]=\"column?.className\" style=\"width: 60%;\" *ngSwitchCase=\"'smart-dropdown'\"\r\n [(ngModel)]=\"row[column.header]\">\r\n <option value=\"\">Select {{column.header}}</option>\r\n <option *ngIf=\"column.placeholder\" value=\"\">{{ column.placeholder }}</option>\r\n <option *ngFor=\"let option of smartDropdownOptions[column.header]\" [value]=\"option?.value\">\r\n {{option?.name }}\r\n </option>\r\n </select> -->\r\n\r\n <!-- <p-multiSelect [options]=\"smartDropdownOptions[column.header]\" [(ngModel)]=\"row[column.header]\" optionLabel=\"name\" optionValue=\"value\" placeholder=\"Select Cities\" *ngSwitchCase=\"'smart-dropdown'\"/> -->\r\n\r\n <!-- smart-dropdown handling -->\r\n <ng-container *ngSwitchCase=\"'smart-dropdown'\">\r\n\r\n <!-- Regular dropdown if isMultiselect is false or not set -->\r\n <select *ngIf=\"!column?.isMultiselect\" [class]=\"column?.className\" style=\"width: 60%;\"\r\n [(ngModel)]=\"row[column.header]\">\r\n <option *ngIf=\"column.placeholder\" value=\"\">{{ column.placeholder }}</option>\r\n <option *ngFor=\"let option of smartDropdownOptions[column.header]\" [value]=\"option?.value\">\r\n {{ option?.name }}\r\n </option>\r\n <option value=\"__other__\">Other</option>\r\n\r\n </select>\r\n <input *ngIf=\"row[column.header] === '__other__'\" type=\"text\" class=\"mt-2 p-inputtext-sm\"\r\n [placeholder]=\"'Enter other ' + column.header\" [(ngModel)]=\"row[column.header + '_other']\" />\r\n\r\n <!-- PrimeNG multiselect if isMultiselect is true -->\r\n <p-multiSelect *ngIf=\"column?.isMultiselect\" [options]=\"smartDropdownOptions[column.header]\"\r\n [(ngModel)]=\"row[column.header]\" [class]=\"column?.className\" optionLabel=\"name\" optionValue=\"value\"\r\n [placeholder]=\"column.placeholder || ('Select ' + column.header)\">\r\n <ng-template pTemplate=\"dropdownicon\">\r\n <div class=\"flex align-items-center dd_down_icon\">\r\n <span class=\"pi pi-angle-down text-xl\"></span>\r\n </div>\r\n </ng-template>\r\n </p-multiSelect>\r\n\r\n </ng-container>\r\n\r\n\r\n <!-- <input [class]=\"column?.className\" *ngSwitchCase=\"'checkbox'\" type=\"checkbox\"\r\n [(ngModel)]=\"row[column.header]\" /> -->\r\n <ng-container *ngSwitchCase=\"'checkbox'\">\r\n <label [class]=\"column?.className\" class=\"inline-flex items-center gap-2\">\r\n <input type=\"checkbox\" [checked]=\"row[column.header] === column.checkedValue\"\r\n (change)=\"onCheckboxChange($event, row, column)\" />\r\n {{ column?.checkBoxLabel || '' }}\r\n </label>\r\n </ng-container>\r\n <p-toast></p-toast>\r\n <p-confirmDialog></p-confirmDialog>\r\n <ng-container *ngSwitchCase=\"'action'\">\r\n <div class=\"flex flex-row gap-6 justify-start items-start\">\r\n <div *ngFor=\"let action of column?.action\" class=\"flex flex-col items-center w-20 cursor-pointer\"\r\n (click)=\"handleAction(row, action)\">\r\n <img [src]=\"action?.actionIconPath\" alt=\"icon\" class=\"w-6 h-6 mb-1\" />\r\n <span class=\"text-xs text-center break-words\">\r\n {{ action?.actionName }}\r\n </span>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n\r\n\r\n\r\n\r\n\r\n <input name=\"radio-{{rowIndex}}\" [class]=\"column?.className\" *ngSwitchCase=\"'radio'\" type=\"radio\"\r\n [(ngModel)]=\"row[column.header]\" />\r\n\r\n <div [class]=\"column?.className\" style=\"display: flex; justify-content: center; gap: 10px;\"\r\n *ngSwitchCase=\"'radio-group'\">\r\n <label *ngFor=\"let option of column.options\">\r\n <input name=\"radio-group-{{rowIndex}}\" type=\"radio\" [value]=\"option?.optionName\"\r\n [(ngModel)]=\"row[column.header]\" />\r\n {{ option?.optionName }}\r\n </label>\r\n </div>\r\n\r\n <!-- <ng-container *ngSwitchCase=\"'file-upload'\">\r\n \r\n\r\n <div class=\"flex flex-col items-end justify-end relative\">\r\n <div class=\"flex gap-2 flex-wrap\">\r\n <div \r\n class=\"relative\" \r\n *ngFor=\"let image of uploadedImages?.[rowIndex]; let i = index\"\r\n >\r\n <img \r\n width=\"100\" \r\n [src]=\"image?.result\"\r\n alt=\"Uploaded Image\"\r\n class=\"rounded shadow\"\r\n />\r\n <button \r\n (click)=\"deleteFile(rowIndex, i)\" \r\n class=\"absolute top-0 right-0 text-white rounded-md w-5 h-5 flex items-center justify-center shadow-lg hover:bg-red-600\"\r\n >\r\n \u274C\r\n </button>\r\n </div>\r\n </div>\r\n \r\n <input \r\n [class]=\"column?.className\" \r\n type=\"file\" \r\n name=\"file\" \r\n #uploadFile \r\n hidden \r\n multiple\r\n (change)=\"uploadImage($event, rowIndex)\" \r\n />\r\n \r\n <button \r\n (click)=\"uploadFile.click()\" \r\n class=\"mt-2 bg-blue-500 text-white px-3 py-1 rounded hover:bg-blue-600\"\r\n >\r\n Upload\r\n </button>\r\n </div>\r\n \r\n \r\n </ng-container> -->\r\n\r\n <ng-container *ngSwitchCase=\"'file-upload'\">\r\n <div class=\"flex items-center justify-end relative gap-4 flex-wrap\">\r\n <div class=\"flex gap-2 flex-wrap\">\r\n <div class=\"relative\" *ngFor=\"let image of uploadedImages?.[rowIndex]; let i = index\">\r\n <img width=\"100\" height=\"80\" [src]=\"image?.result\" alt=\"Uploaded Image\"\r\n class=\"rounded shadow orientation\" />\r\n <a (click)=\"deleteFile(rowIndex, i)\"\r\n class=\"absolute top-0 right-0 text-white rounded-md w-5 h-5 flex items-center justify-center cursor-pointer\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_6837_29683)\">\r\n <rect width=\"18\" height=\"18\" rx=\"9\" fill=\"#F3A041\" />\r\n <mask id=\"mask0_6837_29683\" style=\"mask-type:alpha\" maskUnits=\"userSpaceOnUse\" x=\"4\" y=\"4\"\r\n width=\"24\" height=\"24\">\r\n <rect x=\"4\" y=\"4\" width=\"24\" height=\"24\" fill=\"#D9D9D9\" />\r\n </mask>\r\n <g mask=\"url(#mask0_6837_29683)\">\r\n <path\r\n d=\"M8.2045 8.99815L5.81802 6.61167L6.61351 5.81617L9 8.20266L11.3865 5.81617L12.182 6.61167L9.7955 8.99815L12.182 11.3846L11.3865 12.1801L9 9.79365L6.61351 12.1801L5.81802 11.3846L8.2045 8.99815Z\"\r\n fill=\"white\" />\r\n </g>\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_6837_29683\">\r\n <rect width=\"18\" height=\"18\" rx=\"9\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </a>\r\n </div>\r\n </div>\r\n\r\n <input [class]=\"column?.className\" type=\"file\" name=\"file\" #uploadFile hidden multiple\r\n (change)=\"uploadImage($event, rowIndex)\" />\r\n <div class=\"flex flex-col justify-center items-center cursor-pointer\" (click)=\"uploadFile.click()\">\r\n <div>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"29\" height=\"28\" viewBox=\"0 0 29 28\" fill=\"none\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M14.001 3.00195C11.5322 3.00195 9.16722 3.86956 7.23641 5.38414L7.23598 4.59695C7.23598 4.52473 7.22175 4.45321 7.19411 4.38648C7.16647 4.31975 7.12596 4.25912 7.07489 4.20804C7.02381 4.15697 6.96318 4.11646 6.89645 4.08882C6.82972 4.06118 6.7582 4.04695 6.68598 4.04695C6.61375 4.04695 6.54223 4.06118 6.4755 4.08882C6.40877 4.11646 6.34814 4.15697 6.29707 4.20804C6.24599 4.25912 6.20548 4.31975 6.17784 4.38648C6.1502 4.45321 6.13598 4.52473 6.13598 4.59695L6.13642 6.68652C6.13643 6.83239 6.19438 6.97228 6.29752 7.07542C6.40067 7.17856 6.54055 7.23651 6.68642 7.23652H8.77598C8.8482 7.23652 8.91972 7.2223 8.98645 7.19466C9.05318 7.16702 9.11381 7.12651 9.16489 7.07543C9.21596 7.02436 9.25647 6.96373 9.28411 6.897C9.31175 6.83027 9.32598 6.75875 9.32598 6.68652C9.32598 6.6143 9.31175 6.54278 9.28411 6.47605C9.25647 6.40932 9.21596 6.34869 9.16489 6.29761C9.11381 6.24654 9.05318 6.20603 8.98645 6.17839C8.91972 6.15075 8.8482 6.13652 8.77598 6.13652H8.0584C9.7702 4.84387 11.8399 4.10195 14.001 4.10195C19.4751 4.10195 23.901 8.52782 23.901 14.002C23.901 19.4761 19.4751 23.902 14.001 23.902C8.52684 23.902 4.10098 19.4761 4.10098 14.002C4.10098 12.6381 4.38263 11.2888 4.92855 10.0389C4.98691 9.90532 4.98982 9.75399 4.93665 9.61822C4.88347 9.48246 4.77855 9.37336 4.64496 9.31492C4.57877 9.28596 4.50753 9.27032 4.4353 9.2689C4.36306 9.26747 4.29126 9.2803 4.22398 9.30663C4.15671 9.33297 4.09528 9.3723 4.04321 9.42238C3.99114 9.47247 3.94944 9.53232 3.92051 9.59852C3.31393 10.9872 3.00098 12.4866 3.00098 14.002C3.00098 20.0706 7.93236 25.002 14.001 25.002C20.0696 25.002 25.001 20.0706 25.001 14.002C25.001 7.93334 20.0696 3.00195 14.001 3.00195Z\"\r\n fill=\"#F3A041\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M13.9988 6.13965C9.6616 6.13965 6.13379 9.66746 6.13379 14.0046C6.13379 18.3418 9.6616 21.8696 13.9988 21.8696C18.336 21.8696 21.8638 18.3418 21.8638 14.0046C21.8638 9.66746 18.336 6.13965 13.9988 6.13965ZM13.9988 8.22965C14.1447 8.22965 14.2846 8.28759 14.3877 8.39074C14.4908 8.49388 14.5488 8.63378 14.5488 8.77965V13.7769L17.5227 16.7508C17.6258 16.8539 17.6837 16.9938 17.6837 17.1396C17.6837 17.2855 17.6258 17.4254 17.5227 17.5285C17.4195 17.6316 17.2796 17.6896 17.1338 17.6896C16.9879 17.6896 16.8481 17.6316 16.7449 17.5285L13.6099 14.3935C13.5068 14.2904 13.4488 14.1505 13.4488 14.0046V8.77965C13.4488 8.63378 13.5067 8.49388 13.6099 8.39074C13.713 8.28759 13.8529 8.22965 13.9988 8.22965Z\"\r\n fill=\"#F3A041\" />\r\n <rect width=\"28.56\" height=\"28\" rx=\"1.51479\" fill=\"#F3A041\" />\r\n <path\r\n d=\"M15.068 22.7391V17.6708H18.4968L14.2108 12.6025L9.9248 17.6708H13.3536V22.7391H9.06759V22.6969C8.92358 22.7053 8.78643 22.7391 8.63899 22.7391C6.93391 22.7391 5.29866 22.0717 4.09298 20.8835C2.8873 19.6954 2.20996 18.084 2.20996 16.4037C2.20996 13.1532 4.70443 10.5042 7.90523 10.141C8.18585 8.6953 8.96892 7.39118 10.1197 6.45292C11.2706 5.51465 12.7172 5.00089 14.2108 5C15.7047 5.00082 17.1515 5.51452 18.3026 6.45277C19.4537 7.39101 20.2371 8.69516 20.5181 10.141C23.7189 10.5042 26.21 13.1532 26.21 16.4037C26.21 18.084 25.5326 19.6954 24.3269 20.8835C23.1213 22.0717 21.486 22.7391 19.7809 22.7391C19.6369 22.7391 19.4981 22.7053 19.3523 22.6969V22.7391H15.068Z\"\r\n fill=\"white\" />\r\n </svg>\r\n </div>\r\n <a type=\"button\" (click)=\"uploadFile.click()\" class=\"text-base cursor-pointer\">\r\n {{ 'Upload' }}\r\n </a>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'textarea'\">\r\n <textarea [class]=\"column?.className\" name=\"\" id=\"\" cols=\"30\" rows=\"2\"\r\n [placeholder]=\"column?.placeholder\"></textarea>\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <!-- Your main template -->\r\n<p-dialog header=\"Confirmation\"\r\n[(visible)]=\"displayConfirmationDialog\"\r\nmodal=\"true\"\r\n[closable]=\"false\"\r\n[responsive]=\"true\"\r\nstyleClass=\"confirmation-dialog\"\r\n[style]=\"{width: '400px'}\">\r\n\r\n<div class=\"p-d-flex p-ai-center\">\r\n<i class=\"pi pi-exclamation-triangle p-mr-2\" style=\"font-size: 2rem; color: #f39c12\"></i>\r\n<span>Are you sure you want to perform \"<strong>{{ selectedAction?.actionName }}</strong>\"?</span>\r\n</div>\r\n\r\n<ng-template pTemplate=\"footer\">\r\n<button pButton label=\"Yes\" icon=\"pi pi-check\" (click)=\"confirmAction()\" class=\"p-button-text\" autofocus></button>\r\n<button pButton label=\"No\" icon=\"pi pi-times\" (click)=\"cancelAction()\" class=\"p-button-text\"></button>\r\n</ng-template>\r\n</p-dialog>\r\n\r\n </div>\r\n</fx-settings-panel>", styles: ["@import\"https://unpkg.com/primeng@17.18.10/resources/themes/lara-light-blue/theme.css\";@import\"https://unpkg.com/primeng@17.18.10/resources/primeng.min.css\";@import\"https://unpkg.com/primeicons@6.0.0/primeicons.css\";.formBuilder_dynamic_table{border:.6px solid #ccc}.formBuilder_dynamic_table>thead>tr{background-color:#4682b4;color:#fff}.formBuilder_dynamic_table>thead>tr>th{font-weight:400!important;padding:.25rem .55rem;font-size:.875rem;text-align:left}.formBuilder_dynamic_table>tbody>tr:nth-child(odd){background-color:#fff}.formBuilder_dynamic_table>tbody>tr:nth-child(2n){background-color:#f6f6f6}.formBuilder_dynamic_table>tbody>tr>td{text-align:left;padding:.25rem .55rem}[type=text],[type=email],[type=url],[type=password],[type=number],[type=date],[type=datetime-local],[type=month],[type=search],[type=tel],[type=time],[type=week],[multiple],textarea,select{border:1px solid #ccc;border-radius:4px;padding:4px}select:not([size]){background:url('data:image/svg+xml,<svg width=\"22\" height=\"20\" viewBox=\"0 0 26 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">%0D%0A <rect x=\"0.5\" width=\"24.766\" height=\"24\" rx=\"3\" fill=\"%23FF7900\" fill-opacity=\"0.1\"/>%0D%0A <path d=\"M12.8918 16.5019C12.7255 16.5019 12.5695 16.4736 12.4239 16.4169C12.2783 16.3602 12.1431 16.2628 12.0183 16.1248L6.27803 9.8162C6.04925 9.56477 5.92946 9.25025 5.91864 8.87265C5.90783 8.49505 6.02762 8.16956 6.27803 7.89619C6.50681 7.64476 6.79799 7.51905 7.15155 7.51905C7.50512 7.51905 7.7963 7.64476 8.02508 7.89619L12.8918 13.2105L17.7586 7.89619C17.9874 7.64476 18.2736 7.51356 18.6172 7.50259C18.9607 7.49162 19.2569 7.62282 19.5056 7.89619C19.7344 8.14762 19.8488 8.46762 19.8488 8.85619C19.8488 9.24477 19.7344 9.56477 19.5056 9.8162L13.7654 16.1248C13.6406 16.2619 13.5054 16.3593 13.3598 16.4169C13.2142 16.4745 13.0582 16.5028 12.8918 16.5019Z\" fill=\"%23FAA762\"/>%0D%0A</svg>%0D%0A') right .4rem center no-repeat #fff;border:1px solid #cdcdcd;padding:6px 30px 6px 10px;border-radius:4px;font-size:14px;font-weight:400;cursor:pointer;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%!important}.dd_down_icon{background:#f3a04126;border-radius:3px!important;padding:2px}[type=checkbox]{padding:12px}[type=checkbox]:checked{background-color:#f3a041!important;padding:12px;background-size:1em 1em!important}[type=radio]{width:20px;height:20px}[type=radio]:checked{background-color:#f3a041!important;background-size:1.5em 1.5em}[type=checkbox]:focus,[type=radio]:focus{--tw-ring-color: #f3a041 !important}:host::ng-deep .p-multiselect{height:37.6px!important;border:1px solid #cdcdcd}:host::ng-deep .p-multiselect .p-multiselect-label{padding:.5rem .75rem}:host::ng-deep .p-multiselect .p-multiselect-label .p-placeholder{color:#454545}:host::ng-deep .p-multiselect .p-multiselect-trigger{width:2.5rem!important}.dd_down_icon span{color:#f3a041}.orientation{height:82%!important}.confirmation-dialog .p-dialog-content{text-align:center}\n"] }]
547
+ args: [{ selector: 'fx-dynamic-table', standalone: true, imports: [CommonModule, FormsModule, SettingsPanelComponent, ReactiveFormsModule, MultiSelectModule, InputNumberModule, InputTextModule, DropdownModule, ToastModule, ConfirmDialogModule, DialogModule], providers: [MessageService, ConfirmationService], template: "<fx-settings-panel [fxData]=\"fxData\" [tableData]=\"fxData\" (configuration)=\"onChangeConfiguration($event)\">\r\n <div *ngIf=\"fxData\">\r\n <table style=\"width: 100%;\" class=\"formBuilder_dynamic_table\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let column of tableConfig.columns\">{{ column.header }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of tableConfig.rows; let rowIndex = index\">\r\n <td *ngFor=\"let column of tableConfig.columns\">\r\n <ng-container [ngSwitch]=\"column.cellType\">\r\n <span [class]=\"column?.className\" *ngSwitchCase=\"'text'\">{{row[column.header]}}</span>\r\n\r\n <!-- <input [class]=\"column?.className\" *ngSwitchCase=\"'input-text'\" type=\"text\" [placeholder]=\"column?.placeholder\"\r\n [(ngModel)]=\"row[column.header]\" /> -->\r\n\r\n <ng-container *ngSwitchCase=\"'input-text'\">\r\n <input [class]=\"column?.className\" type=\"text\" [placeholder]=\"column?.placeholder\"\r\n [(ngModel)]=\"row[column.header]\" [required]=\"column?.isRequired\" #model=\"ngModel\" />\r\n\r\n <div *ngIf=\"column?.isRequired && model.invalid && model.touched\" class=\"text-red-500 text-sm mt-1\">\r\n {{ column?.errorMessage }}\r\n </div>\r\n </ng-container>\r\n\r\n\r\n\r\n <input [class]=\"column?.className\" *ngSwitchCase=\"'input-number'\" type=\"number\"\r\n [placeholder]=\"column?.placeholder\" [(ngModel)]=\"row[column.header]\" />\r\n\r\n <select [class]=\"column?.className\" *ngSwitchCase=\"'dropdown'\" [(ngModel)]=\"row[column.header]\">\r\n\r\n <option *ngIf=\"column.placeholder\" value=\"\">{{ column.placeholder }}</option>\r\n <option *ngFor=\"let option of column?.options\" [value]=\"option?.optionValue\">\r\n {{ option?.optionName }}\r\n </option>\r\n </select>\r\n\r\n <!-- <select [class]=\"column?.className\" style=\"width: 60%;\" *ngSwitchCase=\"'smart-dropdown'\"\r\n [(ngModel)]=\"row[column.header]\">\r\n <option value=\"\">Select {{column.header}}</option>\r\n <option *ngIf=\"column.placeholder\" value=\"\">{{ column.placeholder }}</option>\r\n <option *ngFor=\"let option of smartDropdownOptions[column.header]\" [value]=\"option?.value\">\r\n {{option?.name }}\r\n </option>\r\n </select> -->\r\n\r\n <!-- <p-multiSelect [options]=\"smartDropdownOptions[column.header]\" [(ngModel)]=\"row[column.header]\" optionLabel=\"name\" optionValue=\"value\" placeholder=\"Select Cities\" *ngSwitchCase=\"'smart-dropdown'\"/> -->\r\n\r\n <!-- smart-dropdown handling -->\r\n <ng-container *ngSwitchCase=\"'smart-dropdown'\">\r\n\r\n <!-- Regular dropdown if isMultiselect is false or not set -->\r\n <select *ngIf=\"!column?.isMultiselect\" [class]=\"column?.className\" style=\"width: 60%;\"\r\n [(ngModel)]=\"row[column.header]\">\r\n <option *ngIf=\"column.placeholder\" value=\"\">{{ column.placeholder }}</option>\r\n <option *ngFor=\"let option of smartDropdownOptions[column.header]\" [value]=\"option?.value\">\r\n {{ option?.name }}\r\n </option>\r\n <option value=\"__other__\">Other</option>\r\n\r\n </select>\r\n <input *ngIf=\"row[column.header] === '__other__'\" type=\"text\" class=\"mt-2 p-inputtext-sm\"\r\n [placeholder]=\"'Enter other ' + column.header\" [(ngModel)]=\"row[column.header + '_other']\" />\r\n\r\n <!-- PrimeNG multiselect if isMultiselect is true -->\r\n <p-multiSelect *ngIf=\"column?.isMultiselect\" [options]=\"smartDropdownOptions[column.header]\"\r\n [(ngModel)]=\"row[column.header]\" [class]=\"column?.className\" optionLabel=\"name\" optionValue=\"value\"\r\n [placeholder]=\"column.placeholder || ('Select ' + column.header)\">\r\n <ng-template pTemplate=\"dropdownicon\">\r\n <div class=\"flex align-items-center dd_down_icon\">\r\n <span class=\"pi pi-angle-down text-xl\"></span>\r\n </div>\r\n </ng-template>\r\n </p-multiSelect>\r\n\r\n </ng-container>\r\n\r\n\r\n <!-- <input [class]=\"column?.className\" *ngSwitchCase=\"'checkbox'\" type=\"checkbox\"\r\n [(ngModel)]=\"row[column.header]\" /> -->\r\n <ng-container *ngSwitchCase=\"'checkbox'\">\r\n <label [class]=\"column?.className\" class=\"inline-flex items-center gap-2\">\r\n <input type=\"checkbox\" [checked]=\"row[column.header] === column.checkedValue\"\r\n (change)=\"onCheckboxChange($event, row, column)\" />\r\n {{ column?.checkBoxLabel || '' }}\r\n </label>\r\n </ng-container>\r\n <p-toast></p-toast>\r\n <p-confirmDialog></p-confirmDialog>\r\n <ng-container *ngSwitchCase=\"'action'\">\r\n <div class=\"flex flex-row gap-6 justify-start items-start\">\r\n <div *ngFor=\"let action of column?.action\" class=\"flex flex-col items-center w-20 cursor-pointer\"\r\n (click)=\"handleAction(row, action,rowIndex)\">\r\n <img [src]=\"action?.actionIconPath\" alt=\"icon\" class=\"w-6 h-6 mb-1\" />\r\n <span class=\"text-xs text-center break-words\">\r\n {{ action?.actionName }}\r\n </span>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n\r\n\r\n\r\n\r\n\r\n <input name=\"radio-{{rowIndex}}\" [class]=\"column?.className\" *ngSwitchCase=\"'radio'\" type=\"radio\"\r\n [(ngModel)]=\"row[column.header]\" />\r\n\r\n <div [class]=\"column?.className\" style=\"display: flex; justify-content: center; gap: 10px;\"\r\n *ngSwitchCase=\"'radio-group'\">\r\n <label *ngFor=\"let option of column.options\">\r\n <input name=\"radio-group-{{rowIndex}}\" type=\"radio\" [value]=\"option?.optionName\"\r\n [(ngModel)]=\"row[column.header]\" />\r\n {{ option?.optionName }}\r\n </label>\r\n </div>\r\n\r\n <!-- <ng-container *ngSwitchCase=\"'file-upload'\">\r\n \r\n\r\n <div class=\"flex flex-col items-end justify-end relative\">\r\n <div class=\"flex gap-2 flex-wrap\">\r\n <div \r\n class=\"relative\" \r\n *ngFor=\"let image of uploadedImages?.[rowIndex]; let i = index\"\r\n >\r\n <img \r\n width=\"100\" \r\n [src]=\"image?.result\"\r\n alt=\"Uploaded Image\"\r\n class=\"rounded shadow\"\r\n />\r\n <button \r\n (click)=\"deleteFile(rowIndex, i)\" \r\n class=\"absolute top-0 right-0 text-white rounded-md w-5 h-5 flex items-center justify-center shadow-lg hover:bg-red-600\"\r\n >\r\n \u274C\r\n </button>\r\n </div>\r\n </div>\r\n \r\n <input \r\n [class]=\"column?.className\" \r\n type=\"file\" \r\n name=\"file\" \r\n #uploadFile \r\n hidden \r\n multiple\r\n (change)=\"uploadImage($event, rowIndex)\" \r\n />\r\n \r\n <button \r\n (click)=\"uploadFile.click()\" \r\n class=\"mt-2 bg-blue-500 text-white px-3 py-1 rounded hover:bg-blue-600\"\r\n >\r\n Upload\r\n </button>\r\n </div>\r\n \r\n \r\n </ng-container> -->\r\n\r\n <ng-container *ngSwitchCase=\"'file-upload'\">\r\n <div class=\"flex items-center justify-end relative gap-4 flex-wrap\">\r\n <div class=\"flex gap-2 flex-wrap\">\r\n <div class=\"relative\" *ngFor=\"let image of uploadedImages?.[rowIndex]; let i = index\">\r\n <img width=\"100\" height=\"80\" [src]=\"image?.result\" alt=\"Uploaded Image\"\r\n class=\"rounded shadow orientation\" />\r\n <a (click)=\"deleteFile(rowIndex, i)\"\r\n class=\"absolute top-0 right-0 text-white rounded-md w-5 h-5 flex items-center justify-center cursor-pointer\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_6837_29683)\">\r\n <rect width=\"18\" height=\"18\" rx=\"9\" fill=\"#F3A041\" />\r\n <mask id=\"mask0_6837_29683\" style=\"mask-type:alpha\" maskUnits=\"userSpaceOnUse\" x=\"4\" y=\"4\"\r\n width=\"24\" height=\"24\">\r\n <rect x=\"4\" y=\"4\" width=\"24\" height=\"24\" fill=\"#D9D9D9\" />\r\n </mask>\r\n <g mask=\"url(#mask0_6837_29683)\">\r\n <path\r\n d=\"M8.2045 8.99815L5.81802 6.61167L6.61351 5.81617L9 8.20266L11.3865 5.81617L12.182 6.61167L9.7955 8.99815L12.182 11.3846L11.3865 12.1801L9 9.79365L6.61351 12.1801L5.81802 11.3846L8.2045 8.99815Z\"\r\n fill=\"white\" />\r\n </g>\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_6837_29683\">\r\n <rect width=\"18\" height=\"18\" rx=\"9\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </a>\r\n </div>\r\n </div>\r\n\r\n <input [class]=\"column?.className\" type=\"file\" name=\"file\" #uploadFile hidden multiple\r\n (change)=\"uploadImage($event, rowIndex)\" />\r\n <div class=\"flex flex-col justify-center items-center cursor-pointer\" (click)=\"uploadFile.click()\">\r\n <div>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"29\" height=\"28\" viewBox=\"0 0 29 28\" fill=\"none\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M14.001 3.00195C11.5322 3.00195 9.16722 3.86956 7.23641 5.38414L7.23598 4.59695C7.23598 4.52473 7.22175 4.45321 7.19411 4.38648C7.16647 4.31975 7.12596 4.25912 7.07489 4.20804C7.02381 4.15697 6.96318 4.11646 6.89645 4.08882C6.82972 4.06118 6.7582 4.04695 6.68598 4.04695C6.61375 4.04695 6.54223 4.06118 6.4755 4.08882C6.40877 4.11646 6.34814 4.15697 6.29707 4.20804C6.24599 4.25912 6.20548 4.31975 6.17784 4.38648C6.1502 4.45321 6.13598 4.52473 6.13598 4.59695L6.13642 6.68652C6.13643 6.83239 6.19438 6.97228 6.29752 7.07542C6.40067 7.17856 6.54055 7.23651 6.68642 7.23652H8.77598C8.8482 7.23652 8.91972 7.2223 8.98645 7.19466C9.05318 7.16702 9.11381 7.12651 9.16489 7.07543C9.21596 7.02436 9.25647 6.96373 9.28411 6.897C9.31175 6.83027 9.32598 6.75875 9.32598 6.68652C9.32598 6.6143 9.31175 6.54278 9.28411 6.47605C9.25647 6.40932 9.21596 6.34869 9.16489 6.29761C9.11381 6.24654 9.05318 6.20603 8.98645 6.17839C8.91972 6.15075 8.8482 6.13652 8.77598 6.13652H8.0584C9.7702 4.84387 11.8399 4.10195 14.001 4.10195C19.4751 4.10195 23.901 8.52782 23.901 14.002C23.901 19.4761 19.4751 23.902 14.001 23.902C8.52684 23.902 4.10098 19.4761 4.10098 14.002C4.10098 12.6381 4.38263 11.2888 4.92855 10.0389C4.98691 9.90532 4.98982 9.75399 4.93665 9.61822C4.88347 9.48246 4.77855 9.37336 4.64496 9.31492C4.57877 9.28596 4.50753 9.27032 4.4353 9.2689C4.36306 9.26747 4.29126 9.2803 4.22398 9.30663C4.15671 9.33297 4.09528 9.3723 4.04321 9.42238C3.99114 9.47247 3.94944 9.53232 3.92051 9.59852C3.31393 10.9872 3.00098 12.4866 3.00098 14.002C3.00098 20.0706 7.93236 25.002 14.001 25.002C20.0696 25.002 25.001 20.0706 25.001 14.002C25.001 7.93334 20.0696 3.00195 14.001 3.00195Z\"\r\n fill=\"#F3A041\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M13.9988 6.13965C9.6616 6.13965 6.13379 9.66746 6.13379 14.0046C6.13379 18.3418 9.6616 21.8696 13.9988 21.8696C18.336 21.8696 21.8638 18.3418 21.8638 14.0046C21.8638 9.66746 18.336 6.13965 13.9988 6.13965ZM13.9988 8.22965C14.1447 8.22965 14.2846 8.28759 14.3877 8.39074C14.4908 8.49388 14.5488 8.63378 14.5488 8.77965V13.7769L17.5227 16.7508C17.6258 16.8539 17.6837 16.9938 17.6837 17.1396C17.6837 17.2855 17.6258 17.4254 17.5227 17.5285C17.4195 17.6316 17.2796 17.6896 17.1338 17.6896C16.9879 17.6896 16.8481 17.6316 16.7449 17.5285L13.6099 14.3935C13.5068 14.2904 13.4488 14.1505 13.4488 14.0046V8.77965C13.4488 8.63378 13.5067 8.49388 13.6099 8.39074C13.713 8.28759 13.8529 8.22965 13.9988 8.22965Z\"\r\n fill=\"#F3A041\" />\r\n <rect width=\"28.56\" height=\"28\" rx=\"1.51479\" fill=\"#F3A041\" />\r\n <path\r\n d=\"M15.068 22.7391V17.6708H18.4968L14.2108 12.6025L9.9248 17.6708H13.3536V22.7391H9.06759V22.6969C8.92358 22.7053 8.78643 22.7391 8.63899 22.7391C6.93391 22.7391 5.29866 22.0717 4.09298 20.8835C2.8873 19.6954 2.20996 18.084 2.20996 16.4037C2.20996 13.1532 4.70443 10.5042 7.90523 10.141C8.18585 8.6953 8.96892 7.39118 10.1197 6.45292C11.2706 5.51465 12.7172 5.00089 14.2108 5C15.7047 5.00082 17.1515 5.51452 18.3026 6.45277C19.4537 7.39101 20.2371 8.69516 20.5181 10.141C23.7189 10.5042 26.21 13.1532 26.21 16.4037C26.21 18.084 25.5326 19.6954 24.3269 20.8835C23.1213 22.0717 21.486 22.7391 19.7809 22.7391C19.6369 22.7391 19.4981 22.7053 19.3523 22.6969V22.7391H15.068Z\"\r\n fill=\"white\" />\r\n </svg>\r\n </div>\r\n <a type=\"button\" (click)=\"uploadFile.click()\" class=\"text-base cursor-pointer\">\r\n {{ 'Upload' }}\r\n </a>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'textarea'\">\r\n <textarea [class]=\"column?.className\" name=\"\" id=\"\" cols=\"30\" rows=\"2\"\r\n [placeholder]=\"column?.placeholder\"></textarea>\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <!-- Your main template -->\r\n<p-dialog header=\"Confirmation\"\r\n[(visible)]=\"displayConfirmationDialog\"\r\nmodal=\"true\"\r\n[closable]=\"false\"\r\n[responsive]=\"true\"\r\nstyleClass=\"confirmation-dialog\"\r\n[style]=\"{width: '400px'}\">\r\n\r\n<div class=\"p-d-flex p-ai-center\">\r\n<i class=\"pi pi-exclamation-triangle p-mr-2\" style=\"font-size: 2rem; color: #f39c12\"></i>\r\n<span>Are you sure you want to perform \"<strong>{{ selectedAction?.actionName }}</strong>\"?</span>\r\n</div>\r\n\r\n<ng-template pTemplate=\"footer\">\r\n<button pButton label=\"Yes\" icon=\"pi pi-check\" (click)=\"confirmAction()\" class=\"p-button-text\" autofocus></button>\r\n<button pButton label=\"No\" icon=\"pi pi-times\" (click)=\"cancelAction()\" class=\"p-button-text\"></button>\r\n</ng-template>\r\n</p-dialog>\r\n\r\n </div>\r\n</fx-settings-panel>", styles: ["@import\"https://unpkg.com/primeng@17.18.10/resources/themes/lara-light-blue/theme.css\";@import\"https://unpkg.com/primeng@17.18.10/resources/primeng.min.css\";@import\"https://unpkg.com/primeicons@6.0.0/primeicons.css\";.formBuilder_dynamic_table{border:.6px solid #ccc}.formBuilder_dynamic_table>thead>tr{background-color:#4682b4;color:#fff}.formBuilder_dynamic_table>thead>tr>th{font-weight:400!important;padding:.25rem .55rem;font-size:.875rem;text-align:left}.formBuilder_dynamic_table>tbody>tr:nth-child(odd){background-color:#fff}.formBuilder_dynamic_table>tbody>tr:nth-child(2n){background-color:#f6f6f6}.formBuilder_dynamic_table>tbody>tr>td{text-align:left;padding:.25rem .55rem}[type=text],[type=email],[type=url],[type=password],[type=number],[type=date],[type=datetime-local],[type=month],[type=search],[type=tel],[type=time],[type=week],[multiple],textarea,select{border:1px solid #ccc;border-radius:4px;padding:4px}select:not([size]){background:url('data:image/svg+xml,<svg width=\"22\" height=\"20\" viewBox=\"0 0 26 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">%0D%0A <rect x=\"0.5\" width=\"24.766\" height=\"24\" rx=\"3\" fill=\"%23FF7900\" fill-opacity=\"0.1\"/>%0D%0A <path d=\"M12.8918 16.5019C12.7255 16.5019 12.5695 16.4736 12.4239 16.4169C12.2783 16.3602 12.1431 16.2628 12.0183 16.1248L6.27803 9.8162C6.04925 9.56477 5.92946 9.25025 5.91864 8.87265C5.90783 8.49505 6.02762 8.16956 6.27803 7.89619C6.50681 7.64476 6.79799 7.51905 7.15155 7.51905C7.50512 7.51905 7.7963 7.64476 8.02508 7.89619L12.8918 13.2105L17.7586 7.89619C17.9874 7.64476 18.2736 7.51356 18.6172 7.50259C18.9607 7.49162 19.2569 7.62282 19.5056 7.89619C19.7344 8.14762 19.8488 8.46762 19.8488 8.85619C19.8488 9.24477 19.7344 9.56477 19.5056 9.8162L13.7654 16.1248C13.6406 16.2619 13.5054 16.3593 13.3598 16.4169C13.2142 16.4745 13.0582 16.5028 12.8918 16.5019Z\" fill=\"%23FAA762\"/>%0D%0A</svg>%0D%0A') right .4rem center no-repeat #fff;border:1px solid #cdcdcd;padding:6px 30px 6px 10px;border-radius:4px;font-size:14px;font-weight:400;cursor:pointer;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%!important}.dd_down_icon{background:#f3a04126;border-radius:3px!important;padding:2px}[type=checkbox]{padding:12px}[type=checkbox]:checked{background-color:#f3a041!important;padding:12px;background-size:1em 1em!important}[type=radio]{width:20px;height:20px}[type=radio]:checked{background-color:#f3a041!important;background-size:1.5em 1.5em}[type=checkbox]:focus,[type=radio]:focus{--tw-ring-color: #f3a041 !important}:host::ng-deep .p-multiselect{height:37.6px!important;border:1px solid #cdcdcd}:host::ng-deep .p-multiselect .p-multiselect-label{padding:.5rem .75rem}:host::ng-deep .p-multiselect .p-multiselect-label .p-placeholder{color:#454545}:host::ng-deep .p-multiselect .p-multiselect-trigger{width:2.5rem!important}.dd_down_icon span{color:#f3a041}.orientation{height:82%!important}.confirmation-dialog .p-dialog-content{text-align:center}\n"] }]
544
548
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.FxBuilderWrapperService }, { type: i2.MessageService }, { type: i2.ConfirmationService }], propDecorators: { tableRows: [{
545
549
  type: Input
546
550
  }], previewType: [{
@@ -548,4 +552,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
548
552
  }], tableConfig: [{
549
553
  type: Input
550
554
  }] } });
551
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9meC1idWlsZGVyLXdyYXBwZXIvc3JjL2xpYi9jb21wb25lbnRzL2R5bmFtaWMtdGFibGUvZHluYW1pYy10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9meC1idWlsZGVyLXdyYXBwZXIvc3JjL2xpYi9jb21wb25lbnRzL2R5bmFtaWMtdGFibGUvZHluYW1pYy10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQW9DLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUE2QixNQUFNLGVBQWUsQ0FBQztBQUN0SCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFVLGVBQWUsRUFBRSxNQUFNLEVBQWEsZUFBZSxFQUFnQixrQkFBa0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3BJLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBRTdGLE9BQU8sRUFBQyxRQUFRLEVBQUUsR0FBRyxFQUFjLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztB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QkFUakMsU0FBUzsrQkFDRSxrQkFBa0IsY0FDaEIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxzQkFBc0IsRUFBRSxtQkFBbUIsRUFBQyxpQkFBaUIsRUFBQyxpQkFBaUIsRUFBQyxlQUFlLEVBQUMsY0FBYyxFQUFDLFdBQVcsRUFBQyxtQkFBbUIsRUFBQyxZQUFZLENBQUMsYUFDdEwsQ0FBQyxjQUFjLEVBQUMsbUJBQW1CLENBQUM7MkxBTXRDLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgaW5qZWN0LCBJbnB1dCwgTmdab25lLCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IEFjdGlvbiwgRnhCYXNlQ29tcG9uZW50LCBGeE1vZGUsIEZ4U2V0dGluZywgRnhTdHJpbmdTZXR0aW5nLCBGeFZhbGlkYXRpb24sIEZ4VmFsaWRhdG9yU2VydmljZSB9IGZyb20gJ0BpbnN0YW50c3lzLWxhYnMvZngnO1xyXG5pbXBvcnQgeyBTZXR0aW5nc1BhbmVsQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vcGFuZWwvc2V0dGluZ3MtcGFuZWwvc2V0dGluZ3MtcGFuZWwuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnhCdWlsZGVyV3JhcHBlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9meC1idWlsZGVyLXdyYXBwZXIuc2VydmljZSc7XHJcbmltcG9ydCB7Zm9ya0pvaW4sIG1hcCwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IE11bHRpU2VsZWN0TW9kdWxlIH0gZnJvbSAncHJpbWVuZy9tdWx0aXNlbGVjdCc7XHJcbmltcG9ydCB7IElucHV0VGV4dE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvaW5wdXR0ZXh0JztcclxuaW1wb3J0IHsgSW5wdXROdW1iZXJNb2R1bGUgfSBmcm9tICdwcmltZW5nL2lucHV0bnVtYmVyJztcclxuaW1wb3J0IHsgRHJvcGRvd25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL2Ryb3Bkb3duJztcclxuaW1wb3J0IHsgQ29uZmlybWF0aW9uU2VydmljZSwgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICdwcmltZW5nL2FwaSc7XHJcbmltcG9ydCB7IFRvYXN0TW9kdWxlIH0gZnJvbSAncHJpbWVuZy90b2FzdCc7XHJcbmltcG9ydCB7IENvbmZpcm1EaWFsb2dNb2R1bGUgfSBmcm9tICdwcmltZW5nL2NvbmZpcm1kaWFsb2cnO1xyXG5pbXBvcnQgeyBEaWFsb2dNb2R1bGUgfSBmcm9tICdwcmltZW5nL2RpYWxvZyc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlQ29sdW1uQ29uZmlnIHtcclxuICBoZWFkZXI6IHN0cmluZztcclxuICBjZWxsVHlwZTogJ3RleHQnIHwgJ2lucHV0LXRleHQnIHwgJ2lucHV0LW51bWJlcicgfCAnZHJvcGRvd24nIHwgJ3NtYXJ0LWRyb3Bkb3duJyB8ICdjaGVja2JveCcgfCAncmFkaW8nIHwgJ3JhZGlvLWdyb3VwJyB8ICdmaWxlLXVwbG9hZCcgfCAndGV4dGFyZWEnIHwgJ2FjdGlvbic7XHJcbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XHJcbiAgb3B0aW9ucz86IHN0cmluZ1tdO1xyXG4gIGFwaVVybD86IHN0cmluZztcclxuICB2YWx1ZUtleT86IHN0cmluZztcclxuICBsYWJlbEtleT86IHN0cmluZztcclxuICBjbGFzc05hbWU/OiBzdHJpbmc7XHJcbiAgaXNNdWx0aXNlbGVjdD86IGJvb2xlYW47XHJcbiAgY2hlY2tlZFZhbHVlPzogYW55O1xyXG4gIHVuQ2hlY2tlZFZhbHVlPzogYW55O1xyXG4gIGNoZWNrQm94TGFiZWw/OiBzdHJpbmc7XHJcbiAgaXNSZXF1aXJlZD86Ym9vbGVhbixcclxuICBlcnJvck1lc3NhZ2U/OnN0cmluZyxcclxuICAvLyBhY3Rpb25OYW1lPzogc3RyaW5nLFxyXG4gIC8vIGFjdGlvbkljb25QYXRoPzogc3RyaW5nLFxyXG4gIC8vIGFwaVR5cGU/OnN0cmluZyxcclxuICAvLyBhcGlVcmxUb0NhbGw/OiBzdHJpbmcsXHJcbiAgLy8gcGF5bG9hZE9wdGlvbnM/OiBzdHJpbmdbXVxyXG4gIGFjdGlvbjogc3RyaW5nW11cclxufVxyXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlQ29uZmlnIHtcclxuICBjb2x1bW5zOiBUYWJsZUNvbHVtbkNvbmZpZ1tdO1xyXG4gIHJvd3M6IGFueVtdO1xyXG59XHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZngtZHluYW1pYy10YWJsZScsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgU2V0dGluZ3NQYW5lbENvbXBvbmVudCwgUmVhY3RpdmVGb3Jtc01vZHVsZSxNdWx0aVNlbGVjdE1vZHVsZSxJbnB1dE51bWJlck1vZHVsZSxJbnB1dFRleHRNb2R1bGUsRHJvcGRvd25Nb2R1bGUsVG9hc3RNb2R1bGUsQ29uZmlybURpYWxvZ01vZHVsZSxEaWFsb2dNb2R1bGVdLFxyXG4gIHByb3ZpZGVyczogW01lc3NhZ2VTZXJ2aWNlLENvbmZpcm1hdGlvblNlcnZpY2VdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9keW5hbWljLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vZHluYW1pYy10YWJsZS5jb21wb25lbnQuc2NzcycsXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgRHluYW1pY1RhYmxlQ29tcG9uZW50IGV4dGVuZHMgRnhCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBJbnB1dCgpIHRhYmxlUm93czogQXJyYXk8YW55PiA9IFtdO1xyXG4gIEBJbnB1dCgpIHByZXZpZXdUeXBlOiBGeE1vZGUgPSBGeE1vZGUuVklFVztcclxuICBASW5wdXQoKSB0YWJsZUNvbmZpZzogYW55ID0ge1xyXG4gICAgY29sdW1uczogW1xyXG4gICAgICB7IGhlYWRlcjogJ0NvbHVtbiAxJywgY2VsbFR5cGU6ICd0ZXh0JyB9LFxyXG4gICAgICB7IGhlYWRlcjogJ0NvbHVtbiAyJywgY2VsbFR5cGU6ICd0ZXh0JyB9LFxyXG4gICAgICB7IGhlYWRlcjogJ0NvbHVtbiAzJywgY2VsbFR5cGU6ICd0ZXh0JyB9LFxyXG4gICAgICB7IGhlYWRlcjogJ0NvbHVtbiA0JywgY2VsbFR5cGU6ICd0ZXh0JyB9LFxyXG4gICAgICB7IGhlYWRlcjogJ0NvbHVtbiA1JywgY2VsbFR5cGU6ICd0ZXh0JyB9LFxyXG4gICAgXSxcclxufTtcclxuXHJcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PEJvb2xlYW4+KCk7XHJcbiAgLy8gcHVibGljIHVwbG9hZGVkSW1hZ2VzOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBGaWxlIHwgbnVsbD4gfCBudWxsPiA9IFtdO1xyXG4gIHB1YmxpYyB1cGxvYWRlZEltYWdlczogQXJyYXk8QXJyYXk8eyByZXN1bHQ6IHN0cmluZywgZmlsZTogRmlsZSB8IG51bGx9Pj4gPSBbXTtcclxuXHJcbiAgcHVibGljIGdlbmVyYWxWYWx1ZXM6IGFueTtcclxuICBzZWxlY3RlZEFjdGlvbjogYW55O1xyXG5zZWxlY3RlZFJvdzogYW55O1xyXG5kaXNwbGF5Q29uZmlybWF0aW9uRGlhbG9nOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHB1YmxpYyB0YWJsZUZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKCk7XHJcbiAgcHVibGljIHNtYXJ0RHJvcGRvd25PcHRpb25zOiB7IFtrZXk6IHN0cmluZ106IEFycmF5PHsgbmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIH0+IH0gPSB7fTtcclxuICBwcml2YXRlIGh0dHAgPSBpbmplY3QoSHR0cENsaWVudCk7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIGZ4QnVpbGRlcldyYXBwZXJTZXJ2aWNlOiBGeEJ1aWxkZXJXcmFwcGVyU2VydmljZSwgICBwcml2YXRlIG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSwgcHJpdmF0ZSBjb25maXJtYXRpb25TZXJ2aWNlOiBDb25maXJtYXRpb25TZXJ2aWNlKSB7XHJcbiAgICBzdXBlcihjZHIpO1xyXG4gICAgdGhpcy5vbkluaXQuc3Vic2NyaWJlKChmeERhdGEpPT57XHJcbiAgICAgIHRoaXMuX3JlZ2lzdGVyKHRoaXMudGFibGVGb3JtQ29udHJvbCk7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5meEJ1aWxkZXJXcmFwcGVyU2VydmljZS52YXJpYWJsZXMkLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCh2YXJpYWJsZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICh2YXJpYWJsZXMpIHtcclxuICAgICAgICAgIGxldCBkeW5hbWljVGFibGVWYWx1ZXM6IGFueTtcclxuICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHZhcmlhYmxlcykpIHtcclxuICAgICAgICAgICAgaWYgKGtleS5pbmNsdWRlcygnZHluYW1pYy10YWJsZScpKSB7XHJcbiAgICAgICAgICAgICAgZHluYW1pY1RhYmxlVmFsdWVzID0gdmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhkeW5hbWljVGFibGVWYWx1ZXMpLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAvLyBjb25zdCBmaWxlSGVhZGVyTmFtZSA9IGR5bmFtaWNUYWJsZVZhbHVlcz8uY29sdW1ucy5maW5kKChmOiBhbnkpID0+IGYuY2VsbFR5cGUgPT09ICdmaWxlLXVwbG9hZCcpPy5oZWFkZXI7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbGVIZWFkZXJOYW1lID0gZHluYW1pY1RhYmxlVmFsdWVzPy5jb2x1bW5zLmZpbmQoKGY6IGFueSkgPT4gZi5jZWxsVHlwZSA9PT0gJ2ZpbGUtdXBsb2FkJyk/LmhlYWRlcjtcclxuICAgICAgICAgICAgZHluYW1pY1RhYmxlVmFsdWVzPy5yb3dzPy5mb3JFYWNoKChpdGVtOiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgICAgICAgICAvLyAvLyB0aGlzLnVwbG9hZGVkSW1hZ2VzW2luZGV4XSA9IGl0ZW1bZmlsZUhlYWRlck5hbWVdID8gaXRlbVtmaWxlSGVhZGVyTmFtZV06IG51bGw7XHJcbiAgICAgICAgICAgICAgLy8gY29uc3QgZmlsZVVybCA9IGl0ZW1bZmlsZUhlYWRlck5hbWVdOyAvLyBHZXQgdGhlIGZpbGUgVVJMXHJcblxyXG4gICAgICAgICAgICAgIC8vIHRoaXMudXBsb2FkZWRJbWFnZXNbaW5kZXhdID0gZmlsZVVybFxyXG4gICAgICAgICAgICAgIC8vICAgPyB7IHJlc3VsdDogZmlsZVVybCwgZmlsZTogbnVsbCB9IC8vIFN0b3JlIHRoZSBVUkwgYXMgJ3Jlc3VsdCdcclxuICAgICAgICAgICAgICAvLyAgIDogbnVsbDtcclxuICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICBpZiAoaXRlbVtmaWxlSGVhZGVyTmFtZV0pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucGFyc2VVcmxzKGl0ZW1bZmlsZUhlYWRlck5hbWVdLCBpbmRleCxkeW5hbWljVGFibGVWYWx1ZXM/LmNvbHVtbnMpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICB0aGlzLnRhYmxlQ29uZmlnID0gIHRoaXMuaW5pdGlhbGl6ZUNoZWNrYm94RGVmYXVsdHMoZHluYW1pY1RhYmxlVmFsdWVzKTtcclxuICAgICAgICAgICAgLy8gdGhpcy50YWJsZUNvbmZpZyA9IGR5bmFtaWNUYWJsZVZhbHVlcztcclxuICAgICAgICAgICAgdGhpcy5meERhdGEudmFsdWUgPSB0aGlzLnRhYmxlQ29uZmlnO1xyXG4gICAgICAgICAgICAvLyB0aGlzLnRhYmxlRm9ybUNvbnRyb2wucmVzZXQoKTtcclxuICAgICAgICAgICAgLy8gdGhpcy50YWJsZUZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMudGFibGVDb25maWcpO1xyXG4gICAgICAgICAgICB0aGlzLnRhYmxlRm9ybUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woKTtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7ICAvLyBEZWxheSB0byBlbnN1cmUgcHJvcGVyIHBhdGNoaW5nXHJcbiAgICAgICAgICAgICAgdGhpcy50YWJsZUZvcm1Db250cm9sLnBhdGNoVmFsdWUodGhpcy50YWJsZUNvbmZpZywgeyBlbWl0RXZlbnQ6IHRydWUgfSk7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJ0YWJsZUZvcm1Db250cm9sXCIsdGhpcy50YWJsZUZvcm1Db250cm9sKTtcclxuICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgICAgIH0sIDUwKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmKHRoaXMuZnhEYXRhPy52YWx1ZSAmJiBPYmplY3Qua2V5cyh0aGlzLmZ4RGF0YT8udmFsdWUpPy5sZW5ndGggIT0gMCkge1xyXG4gICAgICAgIHRoaXMudGFibGVDb25maWcgPSB0aGlzLmZ4RGF0YS52YWx1ZTtcclxuICAgICAgICB0aGlzLmZldGNoU21hcnREcm9wZG93bkRhdGEoKTtcclxuICAgICAgfVxyXG4gICAgfSwgMTAwKVxyXG4gIH1cclxuICBcclxuICBwcm90ZWN0ZWQgZmV0Y2hTbWFydERyb3Bkb3duRGF0YSgpOiB2b2lkIHtcclxuICAgIHRoaXMudGFibGVDb25maWcuY29sdW1uc1xyXG4gICAgICAuZmlsdGVyKChjb2x1bW46IFRhYmxlQ29sdW1uQ29uZmlnKSA9PiBjb2x1bW4uY2VsbFR5cGUgPT09ICdzbWFydC1kcm9wZG93bicgJiYgY29sdW1uPy5hcGlVcmwpXHJcbiAgICAgIC5mb3JFYWNoKChjb2x1bW46IFRhYmxlQ29sdW1uQ29uZmlnKSA9PiB7XHJcbiAgICAgICAgdGhpcy5odHRwLmdldDxhbnk+KGNvbHVtbi5hcGlVcmwhKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMuc21hcnREcm9wZG93bk9wdGlvbnNbY29sdW1uLmhlYWRlcl0gPSByZXNwb25zZS5tYXAoKGl0ZW06IGFueSkgPT4gKHtcclxuICAgICAgICAgICAgdmFsdWU6IGl0ZW1bY29sdW1uLnZhbHVlS2V5IV0sXHJcbiAgICAgICAgICAgIG5hbWU6IGl0ZW1bY29sdW1uLmxhYmVsS2V5IV0sXHJcbiAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gcHVibGljIHVwbG9hZEltYWdlKGV2ZW50OiBFdmVudCwgcm93SW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gIC8vICAgY29uc3QgZmlsZSA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkuZmlsZXM/LlswXTtcclxuICAvLyAgIGlmIChmaWxlKSB7XHJcbiAgLy8gICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgLy8gICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgLy8gICAgICAgdGhpcy51cGxvYWRlZEltYWdlc1tyb3dJbmRleF0gPSB7XHJcbiAgLy8gICAgICAgICByZXN1bHQ6IHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nLFxyXG4gIC8vICAgICAgICAgZmlsZTogZmlsZVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICB0aGlzLnRhYmxlQ29uZmlnLnJvd3Nbcm93SW5kZXhdW3RoaXMudGFibGVDb25maWcuY29sdW1ucy5maW5kKChmOiBhbnkpID0+IGYuY2VsbFR5cGUgPT09ICdmaWxlLXVwbG9hZCcpPy5oZWFkZXJdID0gZmlsZTtcclxuICAvLyAgICAgICBjb25zb2xlLmxvZyhcInRhYmxlQ29uZmlnXCIsIHRoaXMudGFibGVDb25maWcpO1xyXG4gIC8vICAgICB9O1xyXG4gIC8vICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIHB1YmxpYyB1cGxvYWRJbWFnZShldmVudDogRXZlbnQsIHJvd0luZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGNvbnN0IGZpbGVzID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5maWxlcztcclxuICAgIGlmIChmaWxlcyAmJiBmaWxlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMudXBsb2FkZWRJbWFnZXNbcm93SW5kZXhdID0gdGhpcy51cGxvYWRlZEltYWdlc1tyb3dJbmRleF0gfHwgW107XHJcbiAgXHJcbiAgICAgIEFycmF5LmZyb20oZmlsZXMpLmZvckVhY2goKGZpbGU6IEZpbGUpID0+IHtcclxuICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnVwbG9hZGVkSW1hZ2VzW3Jvd0luZGV4XS5wdXNoKHtcclxuICAgICAgICAgICAgcmVzdWx0OiByZWFkZXIucmVzdWx0IGFzIHN0cmluZyxcclxuICAgICAgICAgICAgZmlsZTogZmlsZVxyXG4gICAgICAgICAgfSk7XHJcbiAgXHJcbiAgICAgICAgICAvLyBPcHRpb25hbGx5IGFkZCB0byB0YWJsZUNvbmZpZyBpZiBvbmx5IG9uZSBmaWxlIGlzIHRyYWNrZWQgdGhlcmVcclxuICAgICAgICAgIGNvbnN0IGNvbHVtbkhlYWRlciA9IHRoaXMudGFibGVDb25maWcuY29sdW1ucy5maW5kKChmOiBhbnkpID0+IGYuY2VsbFR5cGUgPT09ICdmaWxlLXVwbG9hZCcpPy5oZWFkZXI7XHJcbiAgICAgICAgICB0aGlzLnRhYmxlQ29uZmlnLnJvd3Nbcm93SW5kZXhdW2NvbHVtbkhlYWRlcl0gPSB0aGlzLnVwbG9hZGVkSW1hZ2VzW3Jvd0luZGV4XS5tYXAoaW1nID0+IGltZy5maWxlKTtcclxuICBcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwidGFibGVDb25maWdcIiwgdGhpcy50YWJsZUNvbmZpZyk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIFxyXG5cclxuICBwcm90ZWN0ZWQgc2V0dGluZ3MoKTogRnhTZXR0aW5nW10ge1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgbmV3IEZ4U3RyaW5nU2V0dGluZyh7IGtleTogJ2NvbHVtbi1zaXplJywgJHRpdGxlOiAnTm8uIG9mIGNvbHVtbnMnLCB2YWx1ZTogMSB9KSxcclxuICAgICAgbmV3IEZ4U3RyaW5nU2V0dGluZyh7IGtleTogJ3RhYmxlLWNvbmZpZycsICR0aXRsZTogJ1RhYmxlIENvbmZpZ3VyYXRpb24nLCB2YWx1ZToge30gfSksXHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHZhbGlkYXRpb25zKCk6IEZ4VmFsaWRhdGlvbltdIHtcclxuICAgIHJldHVybiBbRnhWYWxpZGF0b3JTZXJ2aWNlLnJlcXVpcmVkXTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRBcnJheShjb3VudDogbnVtYmVyKTogbnVtYmVyW10ge1xyXG4gICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IGNvdW50IH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ2hhbmdlQ29uZmlndXJhdGlvbihldmVudDogYW55KTogdm9pZCB7IFxyXG4gICAgIHRoaXMuZ2VuZXJhbFZhbHVlcyA9IHtcclxuICAgICAgZW5hYmxlQVBJOiBldmVudD8uZW5hYmxlQVBJLFxyXG4gICAgICBhcGk6IGV2ZW50Py5hcGlcclxuICAgIH1cclxuICAgIGNvbnN0IGNvbHVtbnMgPSBldmVudC5jb2x1bW5zLm1hcCgoY29sOiBhbnkpID0+IHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBoZWFkZXI6IGNvbD8uaGVhZGVyLFxyXG4gICAgICAgIGNlbGxUeXBlOiBjb2w/LmNlbGxUeXBlLFxyXG4gICAgICAgIHBsYWNlaG9sZGVyOiBjb2w/LnBsYWNlaG9sZGVyLFxyXG4gICAgICAgIG9wdGlvbnM6IGNvbD8ub3B0aW9ucyxcclxuICAgICAgICBhcGlVcmw6IGNvbD8uYXBpVXJsLFxyXG4gICAgICAgIHZhbHVlS2V5OiBjb2w/LnZhbHVlS2V5LFxyXG4gICAgICAgIGxhYmVsS2V5OiBjb2w/LmxhYmVsS2V5LFxyXG4gICAgICAgIGNsYXNzTmFtZTogY29sPy5jbGFzc05hbWUsXHJcbiAgICAgICAgYXBpS2V5OiBjb2w/LmFwaUtleSxcclxuICAgICAgICBpc011bHRpc2VsZWN0OiBjb2w/LmlzTXVsdGlzZWxlY3QsXHJcbiAgICAgICAgY2hlY2tlZFZhbHVlOiBjb2w/LmNoZWNrZWRWYWx1ZSxcclxuICAgICAgICB1bkNoZWNrZWRWYWx1ZTogY29sPy51bkNoZWNrZWRWYWx1ZSxcclxuICAgICAgICBjaGVja0JveExhYmVsOmNvbD8uY2hlY2tCb3hMYWJlbCxcclxuICAgICAgICBpc1JlcXVpcmVkOmNvbD8uaXNSZXF1aXJlZCxcclxuICAgICAgICBlcnJvck1lc3NhZ2U6Y29sPy5lcnJvck1lc3NhZ2UsXHJcbiAgICAgICAgLy8gYWN0aW9uTmFtZTogY29sPy5hY3Rpb25OYW1lLFxyXG4gICAgICAgIC8vIGFjdGlvbkljb25QYXRoOiBjb2w/LmFjdGlvbkljb25QYXRoLFxyXG4gICAgICAgIC8vIGFwaVR5cGU6Y29sPy5hcGlUeXBlLFxyXG4gICAgICAgIC8vIGFwaVVybFRvQ2FsbDogY29sPy5hcGlVcmxUb0NhbGwsXHJcbiAgICAgICAgLy8gcGF5bG9hZE9wdGlvbnM6IGNvbD8ucGF5bG9hZE9wdGlvbnNcclxuICAgICAgICBhY3Rpb246IGNvbD8uYWN0aW9uIFxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGlmKCFldmVudD8uZW5hYmxlQVBJKSB7XHJcbiAgICAgIHRoaXMudGFibGVDb25maWcuY29sdW1ucyA9IGNvbHVtbnM7XHJcbiAgICAgIC8vIHRoaXMudGFibGVDb25maWcucm93cyA9IEFycmF5LmZyb20oeyBsZW5ndGg6ICtldmVudD8ucm93cyB9LCAoZSwgaW5kZXgpID0+ICh7IG5hbWU6IGBTS1UtJHtpbmRleCArIDF9YCwgYWdlOiBpbmRleCAlIDIgIT09IDAsIGdlbmRlcjogJ21hbGUnIH0pKVxyXG4gICAgICAvLyB0aGlzLnRhYmxlQ29uZmlnLnJvd3MgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiArZXZlbnQ/LnJvd3MgfSwgKGUsIGluZGV4KSA9PiB7XHJcbiAgICAgIC8vICAgY29uc3Qgcm93cyA9IGNvbHVtbnMubWFwKChjOiBhbnkpID0+IHtcclxuICAgICAgLy8gICAgIHJldHVybiB7XHJcbiAgICAgIC8vICAgICAgIGM/LmhlYWRlcjogbnVsbFxyXG4gICAgICAvLyAgICAgfVxyXG4gICAgICAvLyAgIH0pXHJcbiAgICAgIC8vICAgcmV0dXJuIHJvd3NcclxuICAgICAgLy8gfSlcclxuICAgICAgdGhpcy50YWJsZUNvbmZpZy5yb3dzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogK2V2ZW50Py5yb3dzIH0sIChfLCBpbmRleCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBjb2x1bW5zLnJlZHVjZSgoYWNjOiBhbnksIGM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgYWNjW2M/LmhlYWRlcl0gPSAnJzsgLy8gSW5pdGlhbGl6ZSBlYWNoIGNvbHVtbiBrZXkgd2l0aCBudWxsXHJcbiAgICAgICAgICByZXR1cm4gYWNjO1xyXG4gICAgICAgIH0sIHt9KTtcclxuICAgICAgfSk7XHJcbiAgICAgIFxyXG4gICAgICB0aGlzLmZldGNoU21hcnREcm9wZG93bkRhdGEoKTtcclxuICAgIH1cclxuICAgIGlmKGV2ZW50Py5lbmFibGVBUEkpIHtcclxuICAgICAgdGhpcy5kcmF3VGFibGUoZXZlbnQsIGNvbHVtbnMpXHJcbiAgICAgIHRoaXMudGFibGVDb25maWcgPSB7XHJcbiAgICAgICAgY29sdW1uczogY29sdW1ucyxcclxuICAgICAgICByb3dzOiBbXVxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICB0aGlzLnRhYmxlQ29uZmlnID0gIHRoaXMuaW5pdGlhbGl6ZUNoZWNrYm94RGVmYXVsdHModGhpcy50YWJsZUNvbmZpZyk7XHJcbiAgICB0aGlzLnRhYmxlQ29uZmlnLmdlbmVyYWxWYWx1ZXMgPSB0aGlzLmdlbmVyYWxWYWx1ZXM7XHJcbiAgICB0aGlzLmZ4RGF0YS52YWx1ZSA9IHRoaXMudGFibGVDb25maWc7XHJcbiAgICB0aGlzLnRhYmxlRm9ybUNvbnRyb2wucmVzZXQoKTtcclxuICAgIHRoaXMudGFibGVGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLnRhYmxlQ29uZmlnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlU2V0dGluZ3MoKTogdm9pZHtcclxuICAgIGlmKHRoaXMuZnhEYXRhLnNldHRpbmdzKXtcclxuICAgICAgZm9yKGxldCBzZXR0aW5nIG9mIHRoaXMuZnhEYXRhLnNldHRpbmdzKXtcclxuICAgICAgaWYoc2V0dGluZy5rZXkgPT09ICd0YWJsZS1jb25maWcnKXtcclxuICAgICAgICBzZXR0aW5nLnZhbHVlID0gdGhpcy50YWJsZUNvbmZpZztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIHB1YmxpYyBkcmF3VGFibGUoZXZlbnQ6IGFueSwgY29sdW1uczogYW55KTogdm9pZCB7XHJcbiAgLy8gICBsZXQgcm93cztcclxuICAvLyAgIHRoaXMuaHR0cC5nZXQoZXZlbnQuYXBpKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgLy8gICAgIGlmKHJlcykge1xyXG4gIC8vICAgICAgIHJvd3MgPSByZXMubWFwKChpdGVtOiBhbnkpID0+IHtcclxuICAvLyAgICAgICAgIGNvbnN0IG5ld09iajogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xyXG4gIC8vICAgICAgICAgY29sdW1ucy5mb3JFYWNoKChjb2w6IGFueSkgPT4ge1xyXG4gIC8vICAgICAgICAgICBuZXdPYmpbY29sLmhlYWRlcl0gPSBpdGVtW2NvbC5hcGlLZXldO1xyXG4gIC8vICAgICAgICAgfSk7XHJcbiAgLy8gICAgICAgICByZXR1cm4gbmV3T2JqO1xyXG4gIC8vICAgICAgIH0pO1xyXG4gIC8vICAgICAgIHRoaXMudGFibGVDb25maWcgPSB7XHJcbiAgLy8gICAgICAgICBjb2x1bW5zLFxyXG4gIC8vICAgICAgICAgcm93c1xyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICB0aGlzLnRhYmxlQ29uZmlnLmdlbmVyYWxWYWx1ZXMgPSB0aGlzLmdlbmVyYWxWYWx1ZXM7XHJcbiAgLy8gICAgICAgdGhpcy5meERhdGEudmFsdWUgPSB0aGlzLnRhYmxlQ29uZmlnO1xyXG4gIC8vICAgICAgIHRoaXMudGFibGVGb3JtQ29udHJvbC5yZXNldCgpO1xyXG4gIC8vICAgICAgIHRoaXMudGFibGVGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLnRhYmxlQ29uZmlnKTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfSlcclxuICAvLyB9XHJcblxyXG4gICAgcHVibGljIGRyYXdUYWJsZShldmVudDogYW55LCBjb2x1bW5zOiBhbnkpOiB2b2lkIHtcclxuICAgIGxldCByb3dzO1xyXG4gICAgdGhpcy5odHRwLmdldChldmVudC5hcGkpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgaWYocmVzKSB7XHJcbiAgICAgICAgcm93cyA9IHJlcy5tYXAoKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgbmV3T2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XHJcbiAgICAgICAgICBjb2x1bW5zLmZvckVhY2goKGNvbDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIG5ld09ialtjb2wuaGVhZGVyXSA9IGl0ZW1bY29sLmFwaUtleV0gfHwgJyc7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIHJldHVybiBuZXdPYmo7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy50YWJsZUNvbmZpZyA9IHtcclxuICAgICAgICAgIGNvbHVtbnMsXHJcbiAgICAgICAgICByb3dzXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudGFibGVDb25maWcuZ2VuZXJhbFZhbHVlcyA9IHRoaXMuZ2VuZXJhbFZhbHVlcztcclxuICAgICAgICB0aGlzLmZ4RGF0YS52YWx1ZSA9IHRoaXMudGFibGVDb25maWc7XHJcbiAgICAgICAgdGhpcy50YWJsZUZvcm1Db250cm9sLnJlc2V0KCk7XHJcbiAgICAgICAgdGhpcy50YWJsZUZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMudGFibGVDb25maWcpO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgLy8gcHVibGljIGRlbGV0ZUZpbGUoZmlsZTogYW55LCBpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgLy8gICB0aGlzLnVwbG9hZGVkSW1hZ2VzLnNwbGljZShpbmRleCwgMSwgbnVsbCk7XHJcbiAgLy8gICB0aGlzLnRhYmxlQ29uZmlnLnJvd3NbaW5kZXhdW3RoaXMudGFibGVDb25maWcuY29sdW1ucy5maW5kKChmOiBhbnkpID0+IGYuY2VsbFR5cGUgPT09ICdmaWxlLXVwbG9hZCcpPy5oZWFkZXJdID0gbnVsbDtcclxuICAvLyAgIGNvbnNvbGUubG9nKFwidGFibGVDb25maWdcIiwgdGhpcy50YWJsZUNvbmZpZyk7XHJcbiAgLy8gICB0aGlzLnRhYmxlRm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy50YWJsZUNvbmZpZyk7XHJcbiAgLy8gfVxyXG5cclxuICAvLyBwdWJsaWMgZGVsZXRlRmlsZShyb3dJbmRleDogbnVtYmVyLCBpbWFnZUluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAvLyAgIGlmICh0aGlzLnVwbG9hZGVkSW1hZ2VzW3Jvd0luZGV4XSkge1xyXG4gIC8vICAgICB0aGlzLnVwbG9hZGVkSW1hZ2VzW3Jvd0luZGV4XS5zcGxpY2UoaW1hZ2VJbmRleCwgMSk7XHJcbiAgXHJcbiAgLy8gICAgIGNvbnN0IGNvbHVtbkhlYWRlciA9IHRoaXMudGFibGVDb25maWcuY29sdW1ucy5maW5kKChmOiBhbnkpID0+IGYuY2VsbFR5cGUgPT09ICdmaWxlLXVwbG9hZCcpPy5oZWFkZXI7XHJcbiAgLy8gICAgIHRoaXMudGFibGVDb25maWcucm93c1tyb3dJbmRleF1bY29sdW1uSGVhZGVyXSA9IHRoaXMudXBsb2FkZWRJbWFnZXNbcm93SW5kZXhdLm1hcChpbWcgPT4gaW1nLmZpbGUpO1xyXG4gIC8vICAgICB0aGlzLnRhYmxlRm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy50YWJsZUNvbmZpZyk7XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICBwdWJsaWMgZGVsZXRlRmlsZShyb3dJbmRleDogbnVtYmVyLCBpbWFnZUluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnVwbG9hZGVkSW1hZ2VzW3Jvd0luZGV4XSkge1xyXG4gICAgICBjb25zdCByZW1vdmVkRmlsZSA9IHRoaXMudXBsb2FkZWRJbWFnZXNbcm93SW5kZXhdW2ltYWdlSW5kZXhdO1xyXG4gIFxyXG4gICAgICAvLyBUcmFjayB0aGUgZmlsZSB0byBkZWxldGUgaWYgaXQncyBhbiB1cGxvYWRlZCBmaWxlIChpLmUuLCBoYXMgVVJMIGFuZCBubyBGaWxlIG9iamVjdClcclxuICAgICAgaWYgKHJlbW92ZWRGaWxlPy5yZXN1bHQgJiYgdHlwZW9mIHJlbW92ZWRGaWxlLnJlc3VsdCA9PT0gJ3N0cmluZycgJiYgcmVtb3ZlZEZpbGUuZmlsZSA9PT0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMudGFibGVDb25maWcucm93c1tyb3dJbmRleF0uZmlsZXNUb0RlbGV0ZSA9IHRoaXMudGFibGVDb25maWcucm93c1tyb3dJbmRleF0uZmlsZXNUb0RlbGV0ZSB8fCBbXTtcclxuICAgICAgICB0aGlzLnRhYmxlQ29uZmlnLnJvd3Nbcm93SW5kZXhdLmZpbGVzVG9EZWxldGUucHVzaChyZW1vdmVkRmlsZS5yZXN1bHQpO1xyXG4gICAgICB9XHJcbiAgXHJcbiAgICAgIC8vIFJlbW92ZSB0aGUgZmlsZSBmcm9tIHRoZSBVSVxyXG4gICAgICB0aGlzLnVwbG9hZGVkSW1hZ2VzW3Jvd0luZGV4XS5zcGxpY2UoaW1hZ2VJbmRleCwgMSk7XHJcbiAgXHJcbiAgICAgIGNvbnN0IGNvbHVtbkhlYWRlciA9IHRoaXMudGFibGVDb25maWcuY29sdW1ucy5maW5kKChmOiBhbnkpID0+IGYuY2VsbFR5cGUgPT09ICdmaWxlLXVwbG9hZCcpPy5oZWFkZXI7XHJcbiAgICAgIHRoaXMudGFibGVDb25maWcucm93c1tyb3dJbmRleF1bY29sdW1uSGVhZGVyXSA9IHRoaXMudXBsb2FkZWRJbWFnZXNbcm93SW5kZXhdLm1hcChpbWcgPT4gaW1nLmZpbGUpO1xyXG4gIFxyXG4gICAgICB0aGlzLnRhYmxlRm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy50YWJsZUNvbmZpZyk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIFxyXG4gIFxyXG5cclxuICAvLyBwdWJsaWMgcGFyc2VVcmxzKHVybDogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgLy8gICB0aGlzLmh0dHAuZ2V0KHVybCwgeyByZXNwb25zZVR5cGU6ICdibG9iJyB9KS5zdWJzY3JpYmUoe1xyXG4gIC8vICAgICBuZXh0OiAoaW1hZ2VCbG9iOiBCbG9iKSA9PiB7XHJcbiAgLy8gICAgICAgY29uc3QgaW1hZ2VVUkwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGltYWdlQmxvYik7XHJcbiAgLy8gICAgICAgdGhpcy51cGxvYWRlZEltYWdlc1tpbmRleF0gPSB7XHJcbiAgLy8gICAgICAgICByZXN1bHQ6IGltYWdlVVJMLFxyXG4gIC8vICAgICAgICAgZmlsZTogbnVsbFxyXG4gIC8vICAgICAgIH07XHJcbiAgLy8gICAgIH0sXHJcbiAgLy8gICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAvLyAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBpbWFnZTonLCBlcnJvcik7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH0pO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gcHVibGljIHBhcnNlVXJscyh1cmw6IHN0cmluZywgcm93SW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gIC8vICAgdGhpcy5odHRwLmdldCh1cmwsIHsgcmVzcG9uc2VUeXBlOiAnYmxvYicgfSkuc3Vic2NyaWJlKHtcclxuICAvLyAgICAgbmV4dDogKGltYWdlQmxvYjogQmxvYikgPT4ge1xyXG4gIC8vICAgICAgIGNvbnN0IGltYWdlVVJMID0gVVJMLmNyZWF0ZU9iamVjdFVSTChpbWFnZUJsb2IpO1xyXG4gIFxyXG4gIC8vICAgICAgIHRoaXMudXBsb2FkZWRJbWFnZXNbcm93SW5kZXhdID0gdGhpcy51cGxvYWRlZEltYWdlc1tyb3dJbmRleF0gfHwgW107XHJcbiAgLy8gICAgICAgdGhpcy51cGxvYWRlZEltYWdlc1tyb3dJbmRleF0ucHVzaCh7XHJcbiAgLy8gICAgICAgICByZXN1bHQ6IGltYWdlVVJMLFxyXG4gIC8vICAgICAgICAgZmlsZTogbnVsbFxyXG4gIC8vICAgICAgIH0pO1xyXG4gIFxyXG4gIC8vICAgICAgIGNvbnN0IGNvbHVtbkhlYWRlciA9IHRoaXMudGFibGVDb25maWcuY29sdW1ucy5maW5kKChmOiBhbnkpID0+IGYuY2VsbFR5cGUgPT09ICdmaWxlLXVwbG9hZCcpPy5oZWFkZXI7XHJcbiAgLy8gICAgICAgdGhpcy50YWJsZUNvbmZpZy5yb3dzW3Jvd0luZGV4XVtjb2x1bW5IZWFkZXJdID0gdGhpcy51cGxvYWRlZEltYWdlc1tyb3dJbmRleF0ubWFwKGltZyA9PiBpbWcuZmlsZSk7XHJcbiAgXHJcbiAgLy8gICAgICAgdGhpcy50YWJsZUZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMudGFibGVDb25maWcpO1xyXG4gIC8vICAgICB9LFxyXG4gIC8vICAgICBlcnJvcjogKGVycm9yKSA9PiB7XHJcbiAgLy8gICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgaW1hZ2U6JywgZXJyb3IpO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9KTtcclxuICAvLyB9XHJcblxyXG4gIHB1YmxpYyBwYXJzZVVybHModXJsczogc3RyaW5nW10sIHJvd0luZGV4OiBudW1iZXIsIGNvbHVtbnM6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHVybHMpIHx8ICF1cmxzLmxlbmd0aCkgcmV0dXJuO1xyXG4gIFxyXG4gICAgdGhpcy51cGxvYWRlZEltYWdlc1tyb3dJbmRleF0gPSB0aGlzLnVwbG9hZGVkSW1hZ2VzW3Jvd0luZGV4XSB8fCBbXTtcclxuICBcclxuICAgIGNvbnN0IGNvbHVtbkhlYWRlciA9IGNvbHVtbnMuZmluZCgoZjogYW55KSA9PiBmLmNlbGxUeXBlID09PSAnZmlsZS11cGxvYWQnKT8uaGVhZGVyO1xyXG4gICAgaWYgKCFjb2x1bW5IZWFkZXIpIHJldHVybjtcclxuICBcclxuICAgIGNvbnN0IGltYWdlRmV0Y2hlczogT2JzZXJ2YWJsZTxzdHJpbmc+W10gPSBbXTtcclxuICBcclxuICAgIHVybHMuZm9yRWFjaCgodXJsOiBzdHJpbmcpID0+IHtcclxuICAgICAgaWYgKHVybCkge1xyXG4gICAgICAgIGNvbnN0IGltYWdlJCA9IHRoaXMuaHR0cC5nZXQodXJsLCB7IHJlc3BvbnNlVHlwZTogJ2Jsb2InIH0pLnBpcGUoXHJcbiAgICAgICAgICBtYXAoKGltYWdlQmxvYjogQmxvYikgPT4gVVJMLmNyZWF0ZU9iamVjdFVSTChpbWFnZUJsb2IpKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaW1hZ2VGZXRjaGVzLnB1c2goaW1hZ2UkKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgXHJcbiAgICBpZiAoIWltYWdlRmV0Y2hlcy5sZW5ndGgpIHJldHVybjtcclxuICBcclxuICAgIGZvcmtKb2luKGltYWdlRmV0Y2hlcykuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKGltYWdlVVJMczogc3RyaW5nW10pID0+IHtcclxuICAgICAgICBpbWFnZVVSTHMuZm9yRWFjaCgoaW1hZ2VVUkw6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgdGhpcy51cGxvYWRlZEltYWdlc1tyb3dJbmRleF0ucHVzaCh7XHJcbiAgICAgICAgICAgIHJlc3VsdDogaW1hZ2VVUkwsXHJcbiAgICAgICAgICAgIGZpbGU6IG51bGxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gIFxyXG4gICAgICAgIC8vIHRoaXMudGFibGVDb25maWcucm93c1tyb3dJbmRleF1bY29sdW1uSGVhZGVyXSA9IHRoaXMudXBsb2FkZWRJbWFnZXNbcm93SW5kZXhdLm1hcChpbWcgPT4gaW1nLnJlc3VsdCk7XHJcbiAgXHJcbiAgICAgICAgLy8gdGhpcy50YWJsZUZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMudGFibGVDb25maWcpO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgb25lIG9yIG1vcmUgaW1hZ2VzOicsIGVycm9yKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIFxyXG4gIG9uQ2hlY2tib3hDaGFuZ2UoZXZlbnQ6IEV2ZW50LCByb3c6IGFueSwgY29sdW1uOiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICByb3dbY29sdW1uLmhlYWRlcl0gPSBpbnB1dC5jaGVja2VkID8gY29sdW1uLmNoZWNrZWRWYWx1ZSA6IGNvbHVtbi51bkNoZWNrZWRWYWx1ZTtcclxuICB9XHJcbiAgXHJcblxyXG4gIGluaXRpYWxpemVDaGVja2JveERlZmF1bHRzKHRhYmxlRGF0YTogYW55KTogdm9pZCB7XHJcbiAgICB0YWJsZURhdGEucm93cy5mb3JFYWNoKChyb3c6IGFueSkgPT4ge1xyXG4gICAgICB0YWJsZURhdGEuY29sdW1ucy5mb3JFYWNoKChjb2x1bW46IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChjb2x1bW4uY2VsbFR5cGUgPT09ICdjaGVja2JveCcgJiYgY29sdW1uLnVuQ2hlY2tlZFZhbHVlICYmICFyb3dbY29sdW1uLmhlYWRlcl0pIHtcclxuICAgICAgICAgIHJvd1tjb2x1bW4uaGVhZGVyXSA9IGNvbHVtbi51bkNoZWNrZWRWYWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdGFibGVEYXRhO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlQWN0aW9uKHJvdzogYW55LCBhY3Rpb246IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKGFjdGlvbi5pc0NvbmZpcm1hdGlvblJlcXVpcmVkKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRBY3Rpb24gPSBhY3Rpb247XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3cgPSByb3c7XHJcbiAgICAgIHRoaXMuZGlzcGxheUNvbmZpcm1hdGlvbkRpYWxvZyA9IHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmV4ZWN1dGVBY3Rpb24ocm93LCBhY3Rpb24pO1xyXG4gICAgfVxyXG4gIH1cclxuICBcclxuICBjb25maXJtQWN0aW9uKCk6IHZvaWQge1xyXG4gICAgdGhpcy5leGVjdXRlQWN0aW9uKHRoaXMuc2VsZWN0ZWRSb3csIHRoaXMuc2VsZWN0ZWRBY3Rpb24pO1xyXG4gICAgdGhpcy5kaXNwbGF5Q29uZmlybWF0aW9uRGlhbG9nID0gZmFsc2U7XHJcbiAgfVxyXG4gIFxyXG4gIGNhbmNlbEFjdGlvbigpOiB2b2lkIHtcclxuICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcclxuICAgICAgc2V2ZXJpdHk6ICdpbmZvJyxcclxuICAgICAgc3VtbWFyeTogJ0NhbmNlbGxlZCcsXHJcbiAgICAgIGRldGFpbDogJ0FjdGlvbiB3YXMgY2FuY2VsbGVkJyxcclxuICAgICAgbGlmZTogMjAwMFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmRpc3BsYXlDb25maXJtYXRpb25EaWFsb2cgPSBmYWxzZTtcclxuICB9XHJcbiAgXHJcbiAgLy8gaGFuZGxlQWN0aW9uKHJvdzogYW55LCBhY3Rpb246IGFueSk6IHZvaWQge1xyXG4gIC8vICAgaWYgKCFhY3Rpb24gfHwgIWFjdGlvbi5hcGlUeXBlIHx8ICFhY3Rpb24ucGF5bG9hZE9wdGlvbnMpIHtcclxuICAvLyAgICAgY29uc29sZS53YXJuKCdJbnZhbGlkIGFjdGlvbiBjb25maWc6JywgYWN0aW9uKTtcclxuICAvLyAgICAgcmV0dXJuO1xyXG4gIC8vICAgfVxyXG4gIFxyXG4gIC8vICAgY29uc3QgcGF5bG9hZDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xyXG4gIFxyXG4gIC8vICAgYWN0aW9uLnBheWxvYWRPcHRpb25zLmZvckVhY2goKG9wdGlvbjogYW55KSA9PiB7XHJcbiAgLy8gICAgIGNvbnN0IGtleSA9IG9wdGlvbi5wYXlsb2FkT3B0aW9uTmFtZTtcclxuICAvLyAgICAgY29uc3QgdmFsdWUgPSBvcHRpb24ucGF5bG9hZE9wdGlvblZhbHVlID8/IHJvd1tvcHRpb24ucGF5bG9hZE9wdGlvbk5hbWVdO1xyXG4gIC8vICAgICBpZiAoa2V5KSB7XHJcbiAgLy8gICAgICAgcGF5bG9hZFtrZXldID0gdmFsdWU7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH0pO1xyXG4gIFxyXG4gIC8vICAgY29uc3QgaGFuZGxlU3VjY2VzcyA9IChyZXM6IGFueSkgPT4ge1xyXG4gIC8vICAgICBjb25zdCBhY3Rpb25LZXkgPSBhY3Rpb24uYWN0aW9uTmFtZSB8fCAnZGVmYXVsdEFjdGlvbic7XHJcblxyXG4gIC8vICAgICBpZiAoIXJvdy5yZXNwb25zZSB8fCB0eXBlb2Ygcm93LnJlc3BvbnNlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHJvdy5yZXNwb25zZSkpIHtcclxuICAvLyAgICAgICByb3cucmVzcG9uc2UgPSB7fTtcclxuICAvLyAgICAgfVxyXG4gICAgXHJcbiAgLy8gICAgIHJvdy5yZXNwb25zZVthY3Rpb25LZXldID0gcmVzO1xyXG4gICAgXHJcbiAgLy8gICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcclxuICAvLyAgICAgICBzZXZlcml0eTogJ3N1Y2Nlc3MnLFxyXG4gIC8vICAgICAgIHN1bW1hcnk6ICdTdWNjZXNzJyxcclxuICAvLyAgICAgICBkZXRhaWw6IGBBY3Rpb24gXCIke2FjdGlvbktleX1cIiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5YCxcclxuICAvLyAgICAgICBsaWZlOiAzMDAwXHJcbiAgLy8gICAgIH0pO1xyXG4gIC8vICAgfTtcclxuICAgIFxyXG5cclxuICAvLyAgIGNvbnN0IGhhbmRsZUVycm9yID0gKGVycjogYW55KSA9PiB7XHJcbiAgLy8gICAgIHJvdy5yZXNwb25zZSA9IHsgZXJyb3I6IGVyciB9O1xyXG4gIC8vICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XHJcbiAgLy8gICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXHJcbiAgLy8gICAgICAgc3VtbWFyeTogJ0Vycm9yJyxcclxuICAvLyAgICAgICBkZXRhaWw6ICdTb21ldGhpbmcgd2VudCB3cm9uZycsXHJcbiAgLy8gICAgICAgbGlmZTogMzAwMFxyXG4gIC8vICAgICB9KTtcclxuICAvLyAgIH07XHJcbiAgXHJcbiAgLy8gICBzd2l0Y2ggKGFjdGlvbi5hcGlUeXBlKSB7XHJcbiAgLy8gICAgIGNhc2UgJ1BPU1QnOlxyXG4gIC8vICAgICAgIHRoaXMuaHR0cC5wb3N0KGFjdGlvbi5hcGlVcmxUb0NhbGwsIHBheWxvYWQpLnN1YnNjcmliZSh7IG5leHQ6IGhhbmRsZVN1Y2Nlc3MsIGVycm9yOiBoYW5kbGVFcnJvciB9KTtcclxuICAvLyAgICAgICBicmVhaztcclxuICBcclxuICAvLyAgICAgY2FzZSAnUFVUJzpcclxuICAvLyAgICAgICB0aGlzLmh0dHAucHV0KGFjdGlvbi5hcGlVcmxUb0NhbGwsIHBheWxvYWQpLnN1YnNjcmliZSh7IG5leHQ6IGhhbmRsZVN1Y2Nlc3MsIGVycm9yOiBoYW5kbGVFcnJvciB9KTtcclxuICAvLyAgICAgICBicmVhaztcclxuICBcclxuICAvLyAgICAgY2FzZSAnREVMRVRFJzpcclxuICAvLyAgICAgICB0aGlzLmh0dHAuZGVsZXRlKGFjdGlvbi5hcGlVcmxUb0NhbGwsIHsgYm9keTogcGF5bG9hZCB9KS5zdWJzY3JpYmUoeyBuZXh0OiBoYW5kbGVTdWNjZXNzLCBlcnJvcjogaGFuZGxlRXJyb3IgfSk7XHJcbiAgLy8gICAgICAgYnJlYWs7XHJcbiAgXHJcbiAgLy8gICAgIGNhc2UgJ0dFVCc6XHJcbiAgLy8gICAgICAgdGhpcy5odHRwLmdldChhY3Rpb24uYXBpVXJsVG9DYWxsLCB7IHBhcmFtczogcGF5bG9hZCB9KS5zdWJzY3JpYmUoeyBuZXh0OiBoYW5kbGVTdWNjZXNzLCBlcnJvcjogaGFuZGxlRXJyb3IgfSk7XHJcbiAgLy8gICAgICAgYnJlYWs7XHJcbiAgXHJcbiAgLy8gICAgIGRlZmF1bHQ6XHJcbiAgLy8gICAgICAgY29uc29sZS53YXJuKCdVbmtub3duIEFQSSB0eXBlOicsIGFjdGlvbi5hcGlUeXBlKTtcclxuICAvLyAgIH1cclxuICAvLyB9XHJcbiAgXHJcbiAgLy8gaGFuZGxlQWN0aW9uKHJvdzogYW55LCBhY3Rpb246IGFueSk6IHZvaWQge1xyXG4gIC8vICAgaWYgKGFjdGlvbi5pc0NvbmZpcm1hdGlvblJlcXVpcmVkKSB7XHJcbiAgLy8gICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcclxuICAvLyAgICAgICBtZXNzYWdlOiBgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHBlcmZvcm0gXCIke2FjdGlvbi5hY3Rpb25OYW1lfVwiP2AsXHJcbiAgLy8gICAgICAgaGVhZGVyOiAnQ29uZmlybWF0aW9uJyxcclxuICAvLyAgICAgICBpY29uOiAncGkgcGktZXhjbGFtYXRpb24tdHJpYW5nbGUnLFxyXG4gIC8vICAgICAgIGFjY2VwdDogKCkgPT4gdGhpcy5leGVjdXRlQWN0aW9uKHJvdywgYWN0aW9uKSxcclxuICAvLyAgICAgICByZWplY3Q6ICgpID0+IHtcclxuICAvLyAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcclxuICAvLyAgICAgICAgICAgc2V2ZXJpdHk6ICdpbmZvJyxcclxuICAvLyAgICAgICAgICAgc3VtbWFyeTogJ0NhbmNlbGxlZCcsXHJcbiAgLy8gICAgICAgICAgIGRldGFpbDogJ0FjdGlvbiB3YXMgY2FuY2VsbGVkJyxcclxuICAvLyAgICAgICAgICAgbGlmZTogMjAwMFxyXG4gIC8vICAgICAgICAgfSk7XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9KTtcclxuICAvLyAgIH0gZWxzZSB7XHJcbiAgLy8gICAgIHRoaXMuZXhlY3V0ZUFjdGlvbihyb3csIGFjdGlvbik7XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG4gIFxyXG5cclxuICBleGVjdXRlQWN0aW9uKHJvdzogYW55LCBhY3Rpb246IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3QgcGF5bG9hZDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xyXG4gIFxyXG4gICAgYWN0aW9uLnBheWxvYWRPcHRpb25zLmZvckVhY2goKG9wdGlvbjogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGtleSA9IG9wdGlvbi5wYXlsb2FkT3B0aW9uTmFtZTtcclxuICAgICAgY29uc3QgdmFsdWUgPSBvcHRpb24ucGF5bG9hZE9wdGlvblZhbHVlID8/IHJvd1tvcHRpb24ucGF5bG9hZE9wdGlvbk5hbWVdO1xyXG4gICAgICBpZiAoa2V5KSB7XHJcbiAgICAgICAgcGF5bG9hZFtrZXldID0gdmFsdWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIFxyXG4gICAgY29uc3QgYWN0aW9uS2V5ID0gYWN0aW9uLmFjdGlvbk5hbWUgfHwgJ2RlZmF1bHRBY3Rpb24nO1xyXG4gIFxyXG4gICAgY29uc3QgaGFuZGxlU3VjY2VzcyA9IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoIXJvdy5yZXNwb25zZSB8fCB0eXBlb2Ygcm93LnJlc3BvbnNlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHJvdy5yZXNwb25zZSkpIHtcclxuICAgICAgICByb3cucmVzcG9uc2UgPSB7fTtcclxuICAgICAgfVxyXG4gIFxyXG4gICAgICByb3cucmVzcG9uc2VbYWN0aW9uS2V5XSA9IHJlcztcclxuICBcclxuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xyXG4gICAgICAgIHNldmVyaXR5OiAnc3VjY2VzcycsXHJcbiAgICAgICAgc3VtbWFyeTogJ1N1Y2Nlc3MnLFxyXG4gICAgICAgIGRldGFpbDogYEFjdGlvbiBcIiR7YWN0aW9uS2V5fVwiIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlgLFxyXG4gICAgICAgIGxpZmU6IDMwMDBcclxuICAgICAgfSk7XHJcbiAgICB9O1xyXG4gIFxyXG4gICAgY29uc3QgaGFuZGxlRXJyb3IgPSAoZXJyOiBhbnkpID0+IHtcclxuICAgICAgaWYgKCFyb3cucmVzcG9uc2UgfHwgdHlwZW9mIHJvdy5yZXNwb25zZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShyb3cucmVzcG9uc2UpKSB7XHJcbiAgICAgICAgcm93LnJlc3BvbnNlID0ge307XHJcbiAgICAgIH1cclxuICBcclxuICAgICAgcm93LnJlc3BvbnNlW2FjdGlvbktleV0gPSB7IGVycm9yOiBlcnIgfTtcclxuICBcclxuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xyXG4gICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxyXG4gICAgICAgIHN1bW1hcnk6ICdFcnJvcicsXHJcbiAgICAgICAgZGV0YWlsOiBgQWN0aW9uIFwiJHthY3Rpb25LZXl9XCIgZmFpbGVkYCxcclxuICAgICAgICBsaWZlOiAzMDAwXHJcbiAgICAgIH0pO1xyXG4gICAgfTtcclxuICBcclxuICAgIHN3aXRjaCAoYWN0aW9uLmFwaVR5cGUpIHtcclxuICAgICAgY2FzZSAnUE9TVCc6XHJcbiAgICAgICAgdGhpcy5odHRwLnBvc3QoYWN0aW9uLmFwaVVybFRvQ2FsbCwgcGF5bG9hZCkuc3Vic2NyaWJlKHsgbmV4dDogaGFuZGxlU3VjY2VzcywgZXJyb3I6IGhhbmRsZUVycm9yIH0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdQVVQnOlxyXG4gICAgICAgIHRoaXMuaHR0cC5wdXQoYWN0aW9uLmFwaVVybFRvQ2FsbCwgcGF5bG9hZCkuc3Vic2NyaWJlKHsgbmV4dDogaGFuZGxlU3VjY2VzcywgZXJyb3I6IGhhbmRsZUVycm9yIH0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdERUxFVEUnOlxyXG4gICAgICAgIHRoaXMuaHR0cC5kZWxldGUoYWN0aW9uLmFwaVVybFRvQ2FsbCwgeyBib2R5OiBwYXlsb2FkIH0pLnN1YnNjcmliZSh7IG5leHQ6IGhhbmRsZVN1Y2Nlc3MsIGVycm9yOiBoYW5kbGVFcnJvciB9KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnR0VUJzpcclxuICAgICAgICB0aGlzLmh0dHAuZ2V0KGFjdGlvbi5hcGlVcmxUb0NhbGwsIHsgcGFyYW1zOiBwYXlsb2FkIH0pLnN1YnNjcmliZSh7IG5leHQ6IGhhbmRsZVN1Y2Nlc3MsIGVycm9yOiBoYW5kbGVFcnJvciB9KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBjb25zb2xlLndhcm4oJ1Vua25vd24gQVBJIHR5cGU6JywgYWN0aW9uLmFwaVR5cGUpO1xyXG4gICAgfVxyXG4gIH1cclxuICBcclxuICBcclxuICBcclxuXHJcbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxufVxyXG4iLCI8Zngtc2V0dGluZ3MtcGFuZWwgW2Z4RGF0YV09XCJmeERhdGFcIiBbdGFibGVEYXRhXT1cImZ4RGF0YVwiIChjb25maWd1cmF0aW9uKT1cIm9uQ2hhbmdlQ29uZmlndXJhdGlvbigkZXZlbnQpXCI+XHJcbiAgPGRpdiAqbmdJZj1cImZ4RGF0YVwiPlxyXG4gICAgPHRhYmxlIHN0eWxlPVwid2lkdGg6IDEwMCU7XCIgY2xhc3M9XCJmb3JtQnVpbGRlcl9keW5hbWljX3RhYmxlXCI+XHJcbiAgICAgIDx0aGVhZD5cclxuICAgICAgICA8dHI+XHJcbiAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IGNvbHVtbiBvZiB0YWJsZUNvbmZpZy5jb2x1bW5zXCI+e3sgY29sdW1uLmhlYWRlciB9fTwvdGg+XHJcbiAgICAgICAgPC90cj5cclxuICAgICAgPC90aGVhZD5cclxuICAgICAgPHRib2R5PlxyXG4gICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcm93IG9mIHRhYmxlQ29uZmlnLnJvd3M7IGxldCByb3dJbmRleCA9IGluZGV4XCI+XHJcbiAgICAgICAgICA8dGQgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiB0YWJsZUNvbmZpZy5jb2x1bW5zXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbHVtbi5jZWxsVHlwZVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJjb2x1bW4/LmNsYXNzTmFtZVwiICpuZ1N3aXRjaENhc2U9XCIndGV4dCdcIj57e3Jvd1tjb2x1bW4uaGVhZGVyXX19PC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIDxpbnB1dCBbY2xhc3NdPVwiY29sdW1uPy5jbGFzc05hbWVcIiAqbmdTd2l0Y2hDYXNlPVwiJ2lucHV0LXRleHQnXCIgdHlwZT1cInRleHRcIiBbcGxhY2Vob2xkZXJdPVwiY29sdW1uPy5wbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3dbY29sdW1uLmhlYWRlcl1cIiAvPiAtLT5cclxuXHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2lucHV0LXRleHQnXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgW2NsYXNzXT1cImNvbHVtbj8uY2xhc3NOYW1lXCIgdHlwZT1cInRleHRcIiBbcGxhY2Vob2xkZXJdPVwiY29sdW1uPy5wbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93W2NvbHVtbi5oZWFkZXJdXCIgW3JlcXVpcmVkXT1cImNvbHVtbj8uaXNSZXF1aXJlZFwiICNtb2RlbD1cIm5nTW9kZWxcIiAvPlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2x1bW4/LmlzUmVxdWlyZWQgJiYgbW9kZWwuaW52YWxpZCAmJiBtb2RlbC50b3VjaGVkXCIgY2xhc3M9XCJ0ZXh0LXJlZC01MDAgdGV4dC1zbSBtdC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7IGNvbHVtbj8uZXJyb3JNZXNzYWdlIH19XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG5cclxuICAgICAgICAgICAgICA8aW5wdXQgW2NsYXNzXT1cImNvbHVtbj8uY2xhc3NOYW1lXCIgKm5nU3dpdGNoQ2FzZT1cIidpbnB1dC1udW1iZXInXCIgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiY29sdW1uPy5wbGFjZWhvbGRlclwiIFsobmdNb2RlbCldPVwicm93W2NvbHVtbi5oZWFkZXJdXCIgLz5cclxuXHJcbiAgICAgICAgICAgICAgPHNlbGVjdCBbY2xhc3NdPVwiY29sdW1uPy5jbGFzc05hbWVcIiAqbmdTd2l0Y2hDYXNlPVwiJ2Ryb3Bkb3duJ1wiIFsobmdNb2RlbCldPVwicm93W2NvbHVtbi5oZWFkZXJdXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdJZj1cImNvbHVtbi5wbGFjZWhvbGRlclwiIHZhbHVlPVwiXCI+e3sgY29sdW1uLnBsYWNlaG9sZGVyIH19PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgY29sdW1uPy5vcHRpb25zXCIgW3ZhbHVlXT1cIm9wdGlvbj8ub3B0aW9uVmFsdWVcIj5cclxuICAgICAgICAgICAgICAgICAge3sgb3B0aW9uPy5vcHRpb25OYW1lIH19XHJcbiAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSA8c2VsZWN0IFtjbGFzc109XCJjb2x1bW4/LmNsYXNzTmFtZVwiIHN0eWxlPVwid2lkdGg6IDYwJTtcIiAqbmdTd2l0Y2hDYXNlPVwiJ3NtYXJ0LWRyb3Bkb3duJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3dbY29sdW1uLmhlYWRlcl1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+U2VsZWN0IHt7Y29sdW1uLmhlYWRlcn19PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdJZj1cImNvbHVtbi5wbGFjZWhvbGRlclwiIHZhbHVlPVwiXCI+e3sgY29sdW1uLnBsYWNlaG9sZGVyIH19PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHNtYXJ0RHJvcGRvd25PcHRpb25zW2NvbHVtbi5oZWFkZXJdXCIgW3ZhbHVlXT1cIm9wdGlvbj8udmFsdWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tvcHRpb24/Lm5hbWUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PiAtLT5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSA8cC1tdWx0aVNlbGVjdCBbb3B0aW9uc109XCJzbWFydERyb3Bkb3duT3B0aW9uc1tjb2x1bW4uaGVhZGVyXVwiIFsobmdNb2RlbCldPVwicm93W2NvbHVtbi5oZWFkZXJdXCIgb3B0aW9uTGFiZWw9XCJuYW1lXCIgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiIHBsYWNlaG9sZGVyPVwiU2VsZWN0IENpdGllc1wiICpuZ1N3aXRjaENhc2U9XCInc21hcnQtZHJvcGRvd24nXCIvPiAtLT5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBzbWFydC1kcm9wZG93biBoYW5kbGluZyAtLT5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInc21hcnQtZHJvcGRvd24nXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBSZWd1bGFyIGRyb3Bkb3duIGlmIGlzTXVsdGlzZWxlY3QgaXMgZmFsc2Ugb3Igbm90IHNldCAtLT5cclxuICAgICAgICAgICAgICAgIDxzZWxlY3QgKm5nSWY9XCIhY29sdW1uPy5pc011bHRpc2VsZWN0XCIgW2NsYXNzXT1cImNvbHVtbj8uY2xhc3NOYW1lXCIgc3R5bGU9XCJ3aWR0aDogNjAlO1wiXHJcbiAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93W2NvbHVtbi5oZWFkZXJdXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nSWY9XCJjb2x1bW4ucGxhY2Vob2xkZXJcIiB2YWx1ZT1cIlwiPnt7IGNvbHVtbi5wbGFjZWhvbGRlciB9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygc21hcnREcm9wZG93bk9wdGlvbnNbY29sdW1uLmhlYWRlcl1cIiBbdmFsdWVdPVwib3B0aW9uPy52YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IG9wdGlvbj8ubmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIl9fb3RoZXJfX1wiPk90aGVyPC9vcHRpb24+XHJcblxyXG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgKm5nSWY9XCJyb3dbY29sdW1uLmhlYWRlcl0gPT09ICdfX290aGVyX18nXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cIm10LTIgcC1pbnB1dHRleHQtc21cIlxyXG4gICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ0VudGVyIG90aGVyICcgKyBjb2x1bW4uaGVhZGVyXCIgWyhuZ01vZGVsKV09XCJyb3dbY29sdW1uLmhlYWRlciArICdfb3RoZXInXVwiIC8+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBQcmltZU5HIG11bHRpc2VsZWN0IGlmIGlzTXVsdGlzZWxlY3QgaXMgdHJ1ZSAtLT5cclxuICAgICAgICAgICAgICAgIDxwLW11bHRpU2VsZWN0ICpuZ0lmPVwiY29sdW1uPy5pc011bHRpc2VsZWN0XCIgW29wdGlvbnNdPVwic21hcnREcm9wZG93bk9wdGlvbnNbY29sdW1uLmhlYWRlcl1cIlxyXG4gICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJvd1tjb2x1bW4uaGVhZGVyXVwiIFtjbGFzc109XCJjb2x1bW4/LmNsYXNzTmFtZVwiIG9wdGlvbkxhYmVsPVwibmFtZVwiIG9wdGlvblZhbHVlPVwidmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiY29sdW1uLnBsYWNlaG9sZGVyIHx8ICgnU2VsZWN0ICcgKyBjb2x1bW4uaGVhZGVyKVwiPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZHJvcGRvd25pY29uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIGRkX2Rvd25faWNvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwaSBwaS1hbmdsZS1kb3duIHRleHQteGxcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L3AtbXVsdGlTZWxlY3Q+XHJcblxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSA8aW5wdXQgW2NsYXNzXT1cImNvbHVtbj8uY2xhc3NOYW1lXCIgKm5nU3dpdGNoQ2FzZT1cIidjaGVja2JveCdcIiB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93W2NvbHVtbi5oZWFkZXJdXCIgLz4gLS0+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2NoZWNrYm94J1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIFtjbGFzc109XCJjb2x1bW4/LmNsYXNzTmFtZVwiIGNsYXNzPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJyb3dbY29sdW1uLmhlYWRlcl0gPT09IGNvbHVtbi5jaGVja2VkVmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25DaGVja2JveENoYW5nZSgkZXZlbnQsIHJvdywgY29sdW1uKVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgIHt7IGNvbHVtbj8uY2hlY2tCb3hMYWJlbCB8fCAnJyB9fVxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8cC10b2FzdD48L3AtdG9hc3Q+XHJcbiAgICAgICAgICAgICAgPHAtY29uZmlybURpYWxvZz48L3AtY29uZmlybURpYWxvZz5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYWN0aW9uJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTYganVzdGlmeS1zdGFydCBpdGVtcy1zdGFydFwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgY29sdW1uPy5hY3Rpb25cIiBjbGFzcz1cImZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIHctMjAgY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVBY3Rpb24ocm93LCBhY3Rpb24pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cImFjdGlvbj8uYWN0aW9uSWNvblBhdGhcIiBhbHQ9XCJpY29uXCIgY2xhc3M9XCJ3LTYgaC02IG1iLTFcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC14cyB0ZXh0LWNlbnRlciBicmVhay13b3Jkc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgYWN0aW9uPy5hY3Rpb25OYW1lIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4gICAgICAgICAgICAgIDxpbnB1dCBuYW1lPVwicmFkaW8te3tyb3dJbmRleH19XCIgW2NsYXNzXT1cImNvbHVtbj8uY2xhc3NOYW1lXCIgKm5nU3dpdGNoQ2FzZT1cIidyYWRpbydcIiB0eXBlPVwicmFkaW9cIlxyXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3dbY29sdW1uLmhlYWRlcl1cIiAvPlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IFtjbGFzc109XCJjb2x1bW4/LmNsYXNzTmFtZVwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IGdhcDogMTBweDtcIlxyXG4gICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIidyYWRpby1ncm91cCdcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGNvbHVtbi5vcHRpb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPVwicmFkaW8tZ3JvdXAte3tyb3dJbmRleH19XCIgdHlwZT1cInJhZGlvXCIgW3ZhbHVlXT1cIm9wdGlvbj8ub3B0aW9uTmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3dbY29sdW1uLmhlYWRlcl1cIiAvPlxyXG4gICAgICAgICAgICAgICAgICB7eyBvcHRpb24/Lm9wdGlvbk5hbWUgfX1cclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2ZpbGUtdXBsb2FkJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgaXRlbXMtZW5kIGp1c3RpZnktZW5kIHJlbGF0aXZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC0yIGZsZXgtd3JhcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJlbGF0aXZlXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaW1hZ2Ugb2YgdXBsb2FkZWRJbWFnZXM/Lltyb3dJbmRleF07IGxldCBpID0gaW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjEwMFwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3JjXT1cImltYWdlPy5yZXN1bHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJVcGxvYWRlZCBJbWFnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicm91bmRlZCBzaGFkb3dcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVGaWxlKHJvd0luZGV4LCBpKVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFic29sdXRlIHRvcC0wIHJpZ2h0LTAgdGV4dC13aGl0ZSByb3VuZGVkLW1kIHctNSBoLTUgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgc2hhZG93LWxnIGhvdmVyOmJnLXJlZC02MDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDinYxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImNvbHVtbj8uY2xhc3NOYW1lXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImZpbGVcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiZmlsZVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN1cGxvYWRGaWxlICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW4gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInVwbG9hZEltYWdlKCRldmVudCwgcm93SW5kZXgpXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidXBsb2FkRmlsZS5jbGljaygpXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtdC0yIGJnLWJsdWUtNTAwIHRleHQtd2hpdGUgcHgtMyBweS0xIHJvdW5kZWQgaG92ZXI6YmctYmx1ZS02MDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXBsb2FkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+IC0tPlxyXG5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZmlsZS11cGxvYWQnXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1lbmQgcmVsYXRpdmUgZ2FwLTQgZmxleC13cmFwXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC0yIGZsZXgtd3JhcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZVwiICpuZ0Zvcj1cImxldCBpbWFnZSBvZiB1cGxvYWRlZEltYWdlcz8uW3Jvd0luZGV4XTsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGltZyB3aWR0aD1cIjEwMFwiIGhlaWdodD1cIjgwXCIgW3NyY109XCJpbWFnZT8ucmVzdWx0XCIgYWx0PVwiVXBsb2FkZWQgSW1hZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJvdW5kZWQgc2hhZG93IG9yaWVudGF0aW9uXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgIDxhIChjbGljayk9XCJkZWxldGVGaWxlKHJvd0luZGV4LCBpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWJzb2x1dGUgdG9wLTAgcmlnaHQtMCB0ZXh0LXdoaXRlIHJvdW5kZWQtbWQgdy01IGgtNSBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBjdXJzb3ItcG9pbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiB2aWV3Qm94PVwiMCAwIDE4IDE4XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzY4MzdfMjk2ODMpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiByeD1cIjlcIiBmaWxsPVwiI0YzQTA0MVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWFzayBpZD1cIm1hc2swXzY4MzdfMjk2ODNcIiBzdHlsZT1cIm1hc2stdHlwZTphbHBoYVwiIG1hc2tVbml0cz1cInVzZXJTcGFjZU9uVXNlXCIgeD1cIjRcIiB5PVwiNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiNFwiIHk9XCI0XCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgZmlsbD1cIiNEOUQ5RDlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXNrPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgbWFzaz1cInVybCgjbWFzazBfNjgzN18yOTY4MylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTguMjA0NSA4Ljk5ODE1TDUuODE4MDIgNi42MTE2N0w2LjYxMzUxIDUuODE2MTdMOSA4LjIwMjY2TDExLjM4NjUgNS44MTYxN0wxMi4xODIgNi42MTE2N0w5Ljc5NTUgOC45OTgxNUwxMi4xODIgMTEuMzg0NkwxMS4zODY1IDEyLjE4MDFMOSA5Ljc5MzY1TDYuNjEzNTEgMTIuMTgwMUw1LjgxODAyIDExLjM4NDZMOC4yMDQ1IDguOTk4MTVaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwid2hpdGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzY4MzdfMjk2ODNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgcng9XCI5XCIgZmlsbD1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgW2NsYXNzXT1cImNvbHVtbj8uY2xhc3NOYW1lXCIgdHlwZT1cImZpbGVcIiBuYW1lPVwiZmlsZVwiICN1cGxvYWRGaWxlIGhpZGRlbiBtdWx0aXBsZVxyXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidXBsb2FkSW1hZ2UoJGV2ZW50LCByb3dJbmRleClcIiAvPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwidXBsb2FkRmlsZS5jbGljaygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjlcIiBoZWlnaHQ9XCIyOFwiIHZpZXdCb3g9XCIwIDAgMjkgMjhcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xNC4wMDEgMy4wMDE5NUMxMS41MzIyIDMuMDAxOTUgOS4xNjcyMiAzLjg2OTU2IDcuMjM2NDEgNS4zODQxNEw3LjIzNTk4IDQuNTk2OTVDNy4yMzU5OCA0LjUyNDczIDcuMjIxNzUgNC40NTMyMSA3LjE5NDExIDQuMzg2NDhDNy4xNjY0NyA0LjMxOTc1IDcuMTI1OTYgNC4yNTkxMiA3LjA3NDg5IDQuMjA4MDRDNy4wMjM4MSA0LjE1Njk3IDYuOTYzMTggNC4xMTY0NiA2Ljg5NjQ1IDQuMDg4ODJDNi44Mjk3MiA0LjA2MTE4IDYuNzU4MiA0LjA0Njk1IDYuNjg1OTggNC4wNDY5NUM2LjYxMzc1IDQuMDQ2OTUgNi41NDIyMyA0LjA2MTE4IDYuNDc1NSA0LjA4ODgyQzYuNDA4NzcgNC4xMTY0NiA2LjM0ODE0IDQuMTU2OTcgNi4yOTcwNyA0LjIwODA0QzYuMjQ1OTkgNC4yNTkxMiA2LjIwNTQ4IDQuMzE5NzUgNi4xNzc4NCA0LjM4NjQ4QzYuMTUwMiA0LjQ1MzIxIDYuMTM1OTggNC41MjQ3MyA2LjEzNTk4IDQuNTk2OTVMNi4xMzY0MiA2LjY4NjUyQzYuMTM2NDMgNi44MzIzOSA2LjE5NDM4IDYuOTcyMjggNi4yOTc1MiA3LjA3NTQyQzYuNDAwNjcgNy4xNzg1NiA2LjU0MDU1IDcuMjM2NTEgNi42ODY0MiA3LjIzNjUySDguNzc1OThDOC44NDgyIDcuMjM2NTIgOC45MTk3MiA3LjIyMjMgOC45ODY0NSA3LjE5NDY2QzkuMDUzMTggNy4xNjcwMiA5LjExMzgxIDcuMTI2NTEgOS4xNjQ4OSA3LjA3NTQzQzkuMjE1OTYgNy4wMjQzNiA5LjI1NjQ3IDYuOTYzNzMgOS4yODQxMSA2Ljg5N0M5LjMxMTc1IDYuODMwMjcgOS4zMjU5OCA2Ljc1ODc1IDkuMzI1OTggNi42ODY1MkM5LjMyNTk4IDYuNjE0MyA5LjMxMTc1IDYuNTQyNzggOS4yODQxMSA2LjQ3NjA1QzkuMjU2NDcgNi40MDkzMiA5LjIxNTk2IDYuMzQ4NjkgOS4xNjQ4OSA2LjI5NzYxQzkuMTEzODEgNi4yNDY1NCA5LjA1MzE4IDYuMjA2MDMgOC45ODY0NSA2LjE3ODM5QzguOTE5NzIgNi4xNTA3NSA4Ljg0ODIgNi4xMzY1MiA4Ljc3NTk4IDYuMTM2NTJIOC4wNTg0QzkuNzcwMiA0Ljg0Mzg3IDExLjgzOTkgNC4xMDE5NSAxNC4wMDEgNC4xMDE5NUMxOS40NzUxIDQuMTAxOTUgMjMuOTAxIDguNTI3ODIgMjMuOTAxIDE0LjAwMkMyMy45MDEgMTkuNDc2MSAxOS40NzUxIDIzLjkwMiAxNC4wMDEgMjMuOTAyQzguNTI2ODQgMjMuOTAyIDQuMTAwOTggMTkuNDc2MSA0LjEwMDk4IDE0LjAwMkM0LjEwMDk4IDEyLjYzODEgNC4zODI2MyAxMS4yODg4IDQuOTI4NTUgMTAuMDM4OUM0Ljk4NjkxIDkuOTA1MzIgNC45ODk4MiA5Ljc1Mzk5IDQuOTM2NjUgOS42MTgyMkM0Ljg4MzQ3IDkuNDgyNDYgNC43Nzg1NSA5LjM3MzM2IDQuNjQ0OTYgOS4zMTQ5MkM0LjU3ODc3IDkuMjg1OTYgNC41MDc1MyA5LjI3MDMyIDQuNDM1MyA5LjI2ODlDNC4zNjMwNiA5LjI2NzQ3IDQuMjkxMjYgOS4yODAzIDQuMjIzOTggOS4zMDY2M0M0LjE1NjcxIDkuMzMyOTcgNC4wOTUyOCA5LjM3MjMgNC4wNDMyMSA5LjQyMjM4QzMuOTkxMTQgOS40NzI0NyAzLjk0OTQ0IDkuNTMyMzIgMy45MjA1MSA5LjU5ODUyQzMuMzEzOTMgMTAuOTg3MiAzLjAwMDk4IDEyLjQ4NjYgMy4wMDA5OCAxNC4wMDJDMy4wMDA5OCAyMC4wNzA2IDcuOTMyMzYgMjUuMDAyIDE0LjAwMSAyNS4wMDJDMjAuMDY5NiAyNS4wMDIgMjUuMDAxIDIwLjA3MDYgMjUuMDAxIDE0LjAwMkMyNS4wMDEgNy45MzMzNCAyMC4wNjk2IDMuMDAxOTUgMTQuMDAxIDMuMDAxOTVaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0YzQTA0MVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEzLjk5ODggNi4xMzk2NUM5LjY2MTYgNi4xMzk2NSA2LjEzMzc5IDkuNjY3NDYgNi4xMzM3OSAxNC4wMDQ2QzYuMTMzNzkgMTguMzQxOCA5LjY2MTYgMjEuODY5NiAxMy45OTg4IDIxLjg2OTZDMTguMzM2IDIxLjg2OTYgMjEuODYzOCAxOC4zNDE4IDIxLjg2MzggMTQuMDA0NkMyMS44NjM4IDkuNjY3NDYgMTguMzM2IDYuMTM5NjUgMTMuOTk4OCA2LjEzOTY1Wk0xMy45OTg4IDguMjI5NjVDMTQuMTQ0NyA4LjIyOTY1IDE0LjI4NDYgOC4yODc1OSAxNC4zODc3IDguMzkwNzRDMTQuNDkwOCA4LjQ5Mzg4IDE0LjU0ODggOC42MzM3OCAxNC41NDg4IDguNzc5NjVWMTMuNzc2OUwxNy41MjI3IDE2Ljc1MDhDMTcuNjI1OCAxNi44NTM5IDE3LjY4MzcgMTYuOTkzOCAxNy42ODM3IDE3LjEzOTZDMTcuNjgzNyAxNy4yODU1IDE3LjYyNTggMTcuNDI1NCAxNy41MjI3IDE3LjUyODVDMTcuNDE5NSAxNy42MzE2IDE3LjI3OTYgMTcuNjg5NiAxNy4xMzM4IDE3LjY4OTZDMTYuOTg3OSAxNy42ODk2IDE2Ljg0ODEgMTcuNjMxNiAxNi43NDQ5IDE3LjUyODVMMTMuNjA5OSAxNC4zOTM1QzEzLjUwNjggMTQuMjkwNCAxMy40NDg4IDE0LjE1MDUgMTMuNDQ4OCAxNC4wMDQ2VjguNzc5NjVDMTMuNDQ4OCA4LjYzMzc4IDEzLjUwNjcgOC40OTM4OCAxMy42MDk5IDguMzkwNzRDMTMuNzEzIDguMjg3NTkgMTMuODUyOSA4LjIyOTY1IDEzLjk5ODggOC4yMjk2NVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjRjNBMDQxXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIyOC41NlwiIGhlaWdodD1cIjI4XCIgcng9XCIxLjUxNDc5XCIgZmlsbD1cIiNGM0EwNDFcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTUuMDY4IDIyLjczOTFWMTcuNjcwOEgxOC40OTY4TDE0LjIxMDggMTIuNjAyNUw5LjkyNDggMTcuNjcwOEgxMy4zNTM2VjIyLjczOTFIOS4wNjc1OVYyMi42OTY5QzguOTIzNTggMjIuNzA1MyA4Ljc4NjQzIDIyLjczOTEgOC42Mzg5OSAyMi43MzkxQzYuOTMzOTEgMjIuNzM5MSA1LjI5ODY2IDIyLjA3MTcgNC4wOTI5OCAyMC44ODM1QzIuODg3MyAxOS42OTU0IDIuMjA5OTYgMTguMDg0IDIuMjA5OTYgMTYuNDAzN0MyLjIwOTk2IDEzLjE1MzIgNC43MDQ0MyAxMC41MDQyIDcuOTA1MjMgMTAuMTQxQzguMTg1ODUgOC42OTUzIDguOTY4OTIgNy4zOTExOCAxMC4xMTk3IDYuNDUyOTJDMTEuMjcwNiA1LjUxNDY1IDEyLjcxNzIgNS4wMDA4OSAxNC4yMTA4IDVDMTUuNzA0NyA1LjAwMDgyIDE3LjE1MTUgNS41MTQ1MiAxOC4zMDI2IDYuNDUyNzdDMTkuNDUzNyA3LjM5MTAxIDIwLjIzNzEgOC42OTUxNiAyMC41MTgxIDEwLjE0MUMyMy43MTg5IDEwLjUwNDIgMjYuMjEgMTMuMTUzMiAyNi4yMSAxNi40MDM3QzI2LjIxIDE4LjA4NCAyNS41MzI2IDE5LjY5NTQgMjQuMzI2OSAyMC44ODM1QzIzLjEyMTMgMjIuMDcxNyAyMS40ODYgMjIuNzM5MSAxOS43ODA5IDIyLjczOTFDMTkuNjM2OSAyMi43MzkxIDE5LjQ5ODEgMjIuNzA1MyAxOS4zNTIzIDIyLjY5NjlWMjIuNzM5MUgxNS4wNjhaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwid2hpdGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGEgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJ1cGxvYWRGaWxlLmNsaWNrKClcIiBjbGFzcz1cInRleHQtYmFzZSBjdXJzb3ItcG9pbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgJ1VwbG9hZCcgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3RleHRhcmVhJ1wiPlxyXG4gICAgICAgICAgICAgICAgPHRleHRhcmVhIFtjbGFzc109XCJjb2x1bW4/LmNsYXNzTmFtZVwiIG5hbWU9XCJcIiBpZD1cIlwiIGNvbHM9XCIzMFwiIHJvd3M9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbHVtbj8ucGxhY2Vob2xkZXJcIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPC90cj5cclxuICAgICAgPC90Ym9keT5cclxuICAgIDwvdGFibGU+XHJcbiAgICA8IS0tIFlvdXIgbWFpbiB0ZW1wbGF0ZSAtLT5cclxuPHAtZGlhbG9nIGhlYWRlcj1cIkNvbmZpcm1hdGlvblwiXHJcblsodmlzaWJsZSldPVwiZGlzcGxheUNvbmZpcm1hdGlvbkRpYWxvZ1wiXHJcbm1vZGFsPVwidHJ1ZVwiXHJcbltjbG9zYWJsZV09XCJmYWxzZVwiXHJcbltyZXNwb25zaXZlXT1cInRydWVcIlxyXG5zdHlsZUNsYXNzPVwiY29uZmlybWF0aW9uLWRpYWxvZ1wiXHJcbltzdHlsZV09XCJ7d2lkdGg6ICc0MDBweCd9XCI+XHJcblxyXG48ZGl2IGNsYXNzPVwicC1kLWZsZXggcC1haS1jZW50ZXJcIj5cclxuPGkgY2xhc3M9XCJwaSBwaS1leGNsYW1hdGlvbi10cmlhbmdsZSBwLW1yLTJcIiBzdHlsZT1cImZvbnQtc2l6ZTogMnJlbTsgY29sb3I6ICNmMzljMTJcIj48L2k+XHJcbjxzcGFuPkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBwZXJmb3JtIFwiPHN0cm9uZz57eyBzZWxlY3RlZEFjdGlvbj8uYWN0aW9uTmFtZSB9fTwvc3Ryb25nPlwiPzwvc3Bhbj5cclxuPC9kaXY+XHJcblxyXG48bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZm9vdGVyXCI+XHJcbjxidXR0b24gcEJ1dHRvbiBsYWJlbD1cIlllc1wiIGljb249XCJwaSBwaS1jaGVja1wiIChjbGljayk9XCJjb25maXJtQWN0aW9uKClcIiBjbGFzcz1cInAtYnV0dG9uLXRleHRcIiBhdXRvZm9jdXM+PC9idXR0b24+XHJcbjxidXR0b24gcEJ1dHRvbiBsYWJlbD1cIk5vXCIgaWNvbj1cInBpIHBpLXRpbWVzXCIgKGNsaWNrKT1cImNhbmNlbEFjdGlvbigpXCIgY2xhc3M9XCJwLWJ1dHRvbi10ZXh0XCI+PC9idXR0b24+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjwvcC1kaWFsb2c+XHJcblxyXG4gIDwvZGl2PlxyXG48L2Z4LXNldHRpbmdzLXBhbmVsPiJdfQ==
555
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9meC1idWlsZGVyLXdyYXBwZXIvc3JjL2xpYi9jb21wb25lbnRzL2R5bmFtaWMtdGFibGUvZHluYW1pYy10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9meC1idWlsZGVyLXdyYXBwZXIvc3JjL2xpYi9jb21wb25lbnRzL2R5bmFtaWMtdGFibGUvZHluYW1pYy10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQW9DLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUE2QixNQUFNLGVBQWUsQ0FBQztBQUN0SCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFVLGVBQWUsRUFBRSxNQUFNLEVBQWEsZUFBZSxFQUFnQixrQkFBa0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3BJLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBRTdGLE9BQU8sRUFBQyxRQUFRLEVBQUUsR0FBRyxFQUFjLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztB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QWMsRUFBQyxtQkFBbUIsQ0FBQyxpREMvQ2pELDQyaEJBeVBvQixnK0ZEM01SLFlBQVksMmJBQUUsV0FBVyw0bERBQUUsc0JBQXNCLGdIQUFFLG1CQUFtQiw4QkFBQyxpQkFBaUIsMjdDQUFDLGlCQUFpQiw4QkFBQyxlQUFlLDhCQUFDLGNBQWMsOEJBQUMsV0FBVyx1V0FBQyxtQkFBbUIsa3pCQUFDLFlBQVk7OzRGQU1yTCxxQkFBcUI7a0JBVGpDLFNBQVM7K0JBQ0Usa0JBQWtCLGNBQ2hCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsc0JBQXNCLEVBQUUsbUJBQW1CLEVBQUMsaUJBQWlCLEVBQUMsaUJBQWlCLEVBQUMsZUFBZSxFQUFDLGNBQWMsRUFBQyxXQUFXLEVBQUMsbUJBQW1CLEVBQUMsWUFBWSxDQUFDLGFBQ3RMLENBQUMsY0FBYyxFQUFDLG1CQUFtQixDQUFDOzJMQU10QyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIGluamVjdCwgSW5wdXQsIE5nWm9uZSwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBBY3Rpb24sIEZ4QmFzZUNvbXBvbmVudCwgRnhNb2RlLCBGeFNldHRpbmcsIEZ4U3RyaW5nU2V0dGluZywgRnhWYWxpZGF0aW9uLCBGeFZhbGlkYXRvclNlcnZpY2UgfSBmcm9tICdAaW5zdGFudHN5cy1sYWJzL2Z4JztcclxuaW1wb3J0IHsgU2V0dGluZ3NQYW5lbENvbXBvbmVudCB9IGZyb20gJy4uLy4uL3BhbmVsL3NldHRpbmdzLXBhbmVsL3NldHRpbmdzLXBhbmVsLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEZ4QnVpbGRlcldyYXBwZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZngtYnVpbGRlci13cmFwcGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQge2ZvcmtKb2luLCBtYXAsIE9ic2VydmFibGUsIFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBNdWx0aVNlbGVjdE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvbXVsdGlzZWxlY3QnO1xyXG5pbXBvcnQgeyBJbnB1dFRleHRNb2R1bGUgfSBmcm9tICdwcmltZW5nL2lucHV0dGV4dCc7XHJcbmltcG9ydCB7IElucHV0TnVtYmVyTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9pbnB1dG51bWJlcic7XHJcbmltcG9ydCB7IERyb3Bkb3duTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9kcm9wZG93bic7XHJcbmltcG9ydCB7IENvbmZpcm1hdGlvblNlcnZpY2UsIE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAncHJpbWVuZy9hcGknO1xyXG5pbXBvcnQgeyBUb2FzdE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvdG9hc3QnO1xyXG5pbXBvcnQgeyBDb25maXJtRGlhbG9nTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9jb25maXJtZGlhbG9nJztcclxuaW1wb3J0IHsgRGlhbG9nTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9kaWFsb2cnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBUYWJsZUNvbHVtbkNvbmZpZyB7XHJcbiAgaGVhZGVyOiBzdHJpbmc7XHJcbiAgY2VsbFR5cGU6ICd0ZXh0JyB8ICdpbnB1dC10ZXh0JyB8ICdpbnB1dC1udW1iZXInIHwgJ2Ryb3Bkb3duJyB8ICdzbWFydC1kcm9wZG93bicgfCAnY2hlY2tib3gnIHwgJ3JhZGlvJyB8ICdyYWRpby1ncm91cCcgfCAnZmlsZS11cGxvYWQnIHwgJ3RleHRhcmVhJyB8ICdhY3Rpb24nO1xyXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xyXG4gIG9wdGlvbnM/OiBzdHJpbmdbXTtcclxuICBhcGlVcmw/OiBzdHJpbmc7XHJcbiAgdmFsdWVLZXk/OiBzdHJpbmc7XHJcbiAgbGFiZWxLZXk/OiBzdHJpbmc7XHJcbiAgY2xhc3NOYW1lPzogc3RyaW5nO1xyXG4gIGlzTXVsdGlzZWxlY3Q/OiBib29sZWFuO1xyXG4gIGNoZWNrZWRWYWx1ZT86IGFueTtcclxuICB1bkNoZWNrZWRWYWx1ZT86IGFueTtcclxuICBjaGVja0JveExhYmVsPzogc3RyaW5nO1xyXG4gIGlzUmVxdWlyZWQ/OmJvb2xlYW4sXHJcbiAgZXJyb3JNZXNzYWdlPzpzdHJpbmcsXHJcbiAgLy8gYWN0aW9uTmFtZT86IHN0cmluZyxcclxuICAvLyBhY3Rpb25JY29uUGF0aD86IHN0cmluZyxcclxuICAvLyBhcGlUeXBlPzpzdHJpbmcsXHJcbiAgLy8gYXBpVXJsVG9DYWxsPzogc3RyaW5nLFxyXG4gIC8vIHBheWxvYWRPcHRpb25zPzogc3RyaW5nW11cclxuICBhY3Rpb246IHN0cmluZ1tdXHJcbn1cclxuZXhwb3J0IGludGVyZmFjZSBUYWJsZUNvbmZpZyB7XHJcbiAgY29sdW1uczogVGFibGVDb2x1bW5Db25maWdbXTtcclxuICByb3dzOiBhbnlbXTtcclxufVxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2Z4LWR5bmFtaWMtdGFibGUnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIFNldHRpbmdzUGFuZWxDb21wb25lbnQsIFJlYWN0aXZlRm9ybXNNb2R1bGUsTXVsdGlTZWxlY3RNb2R1bGUsSW5wdXROdW1iZXJNb2R1bGUsSW5wdXRUZXh0TW9kdWxlLERyb3Bkb3duTW9kdWxlLFRvYXN0TW9kdWxlLENvbmZpcm1EaWFsb2dNb2R1bGUsRGlhbG9nTW9kdWxlXSxcclxuICBwcm92aWRlcnM6IFtNZXNzYWdlU2VydmljZSxDb25maXJtYXRpb25TZXJ2aWNlXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vZHluYW1pYy10YWJsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL2R5bmFtaWMtdGFibGUuY29tcG9uZW50LnNjc3MnLFxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIER5bmFtaWNUYWJsZUNvbXBvbmVudCBleHRlbmRzIEZ4QmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuICBASW5wdXQoKSB0YWJsZVJvd3M6IEFycmF5PGFueT4gPSBbXTtcclxuICBASW5wdXQoKSBwcmV2aWV3VHlwZTogRnhNb2RlID0gRnhNb2RlLlZJRVc7XHJcbiAgQElucHV0KCkgdGFibGVDb25maWc6IGFueSA9IHtcclxuICAgIGNvbHVtbnM6IFtcclxuICAgICAgeyBoZWFkZXI6ICdDb2x1bW4gMScsIGNlbGxUeXBlOiAndGV4dCcgfSxcclxuICAgICAgeyBoZWFkZXI6ICdDb2x1bW4gMicsIGNlbGxUeXBlOiAndGV4dCcgfSxcclxuICAgICAgeyBoZWFkZXI6ICdDb2x1bW4gMycsIGNlbGxUeXBlOiAndGV4dCcgfSxcclxuICAgICAgeyBoZWFkZXI6ICdDb2x1bW4gNCcsIGNlbGxUeXBlOiAndGV4dCcgfSxcclxuICAgICAgeyBoZWFkZXI6ICdDb2x1bW4gNScsIGNlbGxUeXBlOiAndGV4dCcgfSxcclxuICAgIF0sXHJcbn07XHJcblxyXG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDxCb29sZWFuPigpO1xyXG4gIC8vIHB1YmxpYyB1cGxvYWRlZEltYWdlczogQXJyYXk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgRmlsZSB8IG51bGw+IHwgbnVsbD4gPSBbXTtcclxuICBwdWJsaWMgdXBsb2FkZWRJbWFnZXM6IEFycmF5PEFycmF5PHsgcmVzdWx0OiBzdHJpbmcsIGZpbGU6IEZpbGUgfCBudWxsfT4+ID0gW107XHJcblxyXG5wdWJsaWMgZ2VuZXJhbFZhbHVlczogYW55O1xyXG5zZWxlY3RlZEFjdGlvbjogYW55O1xyXG5zZWxlY3RlZFJvdzogYW55O1xyXG5zZWxlY3RlZFJvd0luZGV4OiBhbnk7XHJcbmRpc3BsYXlDb25maXJtYXRpb25EaWFsb2c6IGJvb2xlYW4gPSBmYWxzZTtcclxuYXBpRGF0YVRvRHJhd1RhYmxlOiBhbnlbXSA9W107XHJcblxyXG4gIHB1YmxpYyB0YWJsZUZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKCk7XHJcbiAgcHVibGljIHNtYXJ0RHJvcGRvd25PcHRpb25zOiB7IFtrZXk6IHN0cmluZ106IEFycmF5PHsgbmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIH0+IH0gPSB7fTtcclxuICBwcml2YXRlIGh0dHAgPSBpbmplY3QoSHR0cENsaWVudCk7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIGZ4QnVpbGRlcldyYXBwZXJTZXJ2aWNlOiBGeEJ1aWxkZXJXcmFwcGVyU2VydmljZSwgICBwcml2YXRlIG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSwgcHJpdmF0ZSBjb25maXJtYXRpb25TZXJ2aWNlOiBDb25maXJtYXRpb25TZXJ2aWNlKSB7XHJcbiAgICBzdXBlcihjZHIpO1xyXG4gICAgdGhpcy5vbkluaXQuc3Vic2NyaWJlKChmeERhdGEpPT57XHJcbiAgICAgIHRoaXMuX3JlZ2lzdGVyKHRoaXMudGFibGVGb3JtQ29udHJvbCk7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5meEJ1aWxkZXJXcmFwcGVyU2VydmljZS52YXJpYWJsZXMkLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCh2YXJpYWJsZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICh2YXJpYWJsZXMpIHtcclxuICAgICAgICAgIGxldCBkeW5hbWljVGFibGVWYWx1ZXM6IGFueTtcclxuICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHZhcmlhYmxlcykpIHtcclxuICAgICAgICAgICAgaWYgKGtleS5pbmNsdWRlcygnZHluYW1pYy10YWJsZScpKSB7XHJcbiAgICAgICAgICAgICAgZHluYW1pY1RhYmxlVmFsdWVzID0gdmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhkeW5hbWljVGFibGVWYWx1ZXMpLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAvLyBjb25zdCBmaWxlSGVhZGVyTmFtZSA9IGR5bmFtaWNUYWJsZVZhbHVlcz8uY29sdW1ucy5maW5kKChmOiBhbnkpID0+IGYuY2VsbFR5cGUgPT09ICdmaWxlLXVwbG9hZCcpPy5oZWFkZXI7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbGVIZWFkZXJOYW1lID0gZHluYW1pY1RhYmxlVmFsdWVzPy5jb2x1bW5zLmZpbmQoKGY6IGFueSkgPT4gZi5jZWxsVHlwZSA9PT0gJ2ZpbGUtdXBsb2FkJyk/LmhlYWRlcjtcclxuICAgICAgICAgICAgZHluYW1pY1RhYmxlVmFsdWVzPy5yb3dzPy5mb3JFYWNoKChpdGVtOiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgICAgICAgICAvLyAvLyB0aGlzLnVwbG9hZGVkSW1hZ2VzW2luZGV4XSA9IGl0ZW1bZmlsZUhlYWRlck5hbWVdID8gaXRlbVtmaWxlSGVhZGVyTmFtZV06IG51bGw7XHJcbiAgICAgICAgICAgICAgLy8gY29uc3QgZmlsZVVybCA9IGl0ZW1bZmlsZUhlYWRlck5hbWVdOyAvLyBHZXQgdGhlIGZpbGUgVVJMXHJcblxyXG4gICAgICAgICAgICAgIC8vIHRoaXMudXBsb2FkZWRJbWFnZXNbaW5kZXhdID0gZmlsZVVybFxyXG4gICAgICAgICAgICAgIC8vICAgPyB7IHJlc3VsdDogZmlsZVVybCwgZmlsZTogbnVsbCB9IC8vIFN0b3JlIHRoZSBVUkwgYXMgJ3Jlc3VsdCdcclxuICAgICAgICAgICAgICAvLyAgIDogbnVsbDtcclxuICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICBpZiAoaXRlbVtmaWxlSGVhZGVyTmFtZV0pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucGFyc2VVcmxzKGl0ZW1bZmlsZUhlYWRlck5hbWVdLCBpbmRleCxkeW5hbWljVGFibGVWYWx1ZXM/LmNvbHVtbnMpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICB0aGlzLnRhYmxlQ29uZmlnID0gIHRoaXMuaW5pdGlhbGl6ZUNoZWNrYm94RGVmYXVsdHMoZHluYW1pY1RhYmxlVmFsdWVzKTtcclxuICAgICAgICAgICAgLy8gdGhpcy50YWJsZUNvbmZpZyA9IGR5bmFtaWNUYWJsZVZhbHVlcztcclxuICAgICAgICAgICAgdGhpcy5meERhdGEudmFsdWUgPSB0aGlzLnRhYmxlQ29uZmlnO1xyXG4gICAgICAgICAgICAvLyB0aGlzLnRhYmxlRm9ybUNvbnRyb2wucmVzZXQoKTtcclxuICAgICAgICAgICAgLy8gdGhpcy50YWJsZUZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMudGFibGVDb25maWcpO1xyXG4gICAgICAgICAgICB0aGlzLnRhYmxlRm9ybUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woKTtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7ICAvLyBEZWxheSB0byBlbnN1cmUgcHJvcGVyIHBhdGNoaW5nXHJcbiAgICAgICAgICAgICAgdGhpcy50YWJsZUZvcm1Db250cm9sLnBhdGNoVmFsdWUodGhpcy50YWJsZUNvbmZpZywgeyBlbWl0RXZlbnQ6IHRydWUgfSk7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJ0YWJsZUZvcm1Db250cm9sXCIsdGhpcy50YWJsZUZvcm1Db250cm9sKTtcclxuICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgICAgIH0sIDUwKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmKHRoaXMuZnhEYXRhPy52YWx1ZSAmJiBPYmplY3Qua2V5cyh0aGlzLmZ4RGF0YT8udmFsdWUpPy5sZW5ndGggIT0gMCkge1xyXG4gICAgICAgIHRoaXMudGFibGVDb25maWcgPSB0aGlzLmZ4RGF0YS52YWx1ZTtcclxuICAgICAgICB0aGlzLmZldGNoU21hcnREcm9wZG93bkRhdGEoKTtcclxuICAgICAgfVxyXG4gICAgfSwgMTAwKVxyXG4gIH1cclxuICBcclxuICBwcm90ZWN0ZWQgZmV0Y2hTbWFydERyb3Bkb3duRGF0YSgpOiB2b2lkIHtcclxuICAgIHRoaXMudGFibGVDb25maWcuY29sdW1uc1xyXG4gICAgICAuZmlsdGVyKChjb2x1bW46IFRhYmxlQ29sdW1uQ29uZmlnKSA9PiBjb2x1bW4uY2VsbFR5cGUgPT09ICdzbWFydC1kcm9wZG93bicgJiYgY29sdW1uPy5hcGlVcmwpXHJcbiAgICAgIC5mb3JFYWNoKChjb2x1bW46IFRhYmxlQ29sdW1uQ29uZmlnKSA9PiB7XHJcbiAgICAgICAgdGhpcy5odHRwLmdldDxhbnk+KGNvbHVtbi5hcGlVcmwhKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMuc21hcnREcm9wZG93bk9wdGlvbnNbY29sdW1uLmhlYWRlcl0gPSByZXNwb25zZS5tYXAoKGl0ZW06IGFueSkgPT4gKHtcclxuICAgICAgICAgICAgdmFsdWU6IGl0ZW1bY29sdW1uLnZhbHVlS2V5IV0sXHJcbiAgICAgICAgICAgIG5hbWU6IGl0ZW1bY29sdW1uLmxhYmVsS2V5IV0sXHJcbiAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gcHVibGljIHVwbG9hZEltYWdlKGV2ZW50OiBFdmVudCwgcm93SW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gIC8vICAgY29uc3QgZmlsZSA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkuZmlsZXM/LlswXTtcclxuICAvLyAgIGlmIChmaWxlKSB7XHJcbiAgLy8gICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgLy8gICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgLy8gICAgICAgdGhpcy51cGxvYWRlZEltYWdlc1tyb3dJbmRleF0gPSB7XHJcbiAgLy8gICAgICAgICByZXN1bHQ6IHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nLFxyXG4gIC8vICAgICAgICAgZmlsZTogZmlsZVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICB0aGlzLnRhYmxlQ29uZmlnLnJvd3Nbcm93SW5kZXhdW3RoaXMudGFibGVDb25maWcuY29sdW1ucy5maW5kKChmOiBhbnkpID0+IGYuY2VsbFR5cGUgPT09ICdmaWxlLXVwbG9hZCcpPy5oZWFkZXJdID0gZmlsZTtcclxuICAvLyAgICAgICBjb25zb2xlLmxvZyhcInRhYmxlQ29uZmlnXCIsIHRoaXMudGFibGVDb25maWcpO1xyXG4gIC8vICAgICB9O1xyXG4gIC8vICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIHB1YmxpYyB1cGxvYWRJbWFnZShldmVudDogRXZlbnQsIHJvd0luZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGNvbnN0IGZpbGVzID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5maWxlcztcclxuICAgIGlmIChmaWxlcyAmJiBmaWxlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMudXBsb2FkZWRJbWFnZXNbcm93SW5kZXhdID0gdGhpcy51cGxvYWRlZEltYWdlc1tyb3dJbmRleF0gfHwgW107XHJcbiAgXHJcbiAgICAgIEFycmF5LmZyb20oZmlsZXMpLmZvckVhY2goKGZpbGU6IEZpbGUpID0+IHtcclxuICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnVwbG9hZGVkSW1hZ2VzW3Jvd0luZGV4XS5wdXNoKHtcclxuICAgICAgICAgICAgcmVzdWx0OiByZWFkZXIucmVzdWx0IGFzIHN0cmluZyxcclxuICAgICAgICAgICAgZmlsZTogZmlsZVxyXG4gICAgICAgICAgfSk7XHJcbiAgXHJcbiAgICAgICAgICAvLyBPcHRpb25hbGx5IGFkZCB0byB0YWJsZUNvbmZpZyBpZiBvbmx5IG9uZSBmaWxlIGlzIHRyYWNrZWQgdGhlcmVcclxuICAgICAgICAgIGNvbnN0IGNvbHVtbkhlYWRlciA9IHRoaXMudGFibGVDb25maWcuY29sdW1ucy5maW5kKChmOiBhbnkpID0+IGYuY2VsbFR5cGUgPT09ICdmaWxlLXVwbG9hZCcpPy5oZWFkZXI7XHJcbiAgICAgICAgICB0aGlzLnRhYmxlQ29uZmlnLnJvd3Nbcm93SW5kZXhdW2NvbHVtbkhlYWRlcl0gPSB0aGlzLnVwbG9hZGVkSW1hZ2VzW3Jvd0luZGV4XS5tYXAoaW1nID0+IGltZy5maWxlKTtcclxuICBcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwidGFibGVDb25maWdcIiwgdGhpcy50YWJsZUNvbmZpZyk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIFxyXG5cclxuICBwcm90ZWN0ZWQgc2V0dGluZ3MoKTogRnhTZXR0aW5nW10ge1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgbmV3IEZ4U3RyaW5nU2V0dGluZyh7IGtleTogJ2NvbHVtbi1zaXplJywgJHRpdGxlOiAnTm8uIG9mIGNvbHVtbnMnLCB2YWx1ZTogMSB9KSxcclxuICAgICAgbmV3IEZ4U3RyaW5nU2V0dGluZyh7IGtleTogJ3RhYmxlLWNvbmZpZycsICR0aXRsZTogJ1RhYmxlIENvbmZpZ3VyYXRpb24nLCB2YWx1ZToge30gfSksXHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHZhbGlkYXRpb25zKCk6IEZ4VmFsaWRhdGlvbltdIHtcclxuICAgIHJldHVybiBbRnhWYWxpZGF0b3JTZXJ2aWNlLnJlcXVpcmVkXTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRBcnJheShjb3VudDogbnVtYmVyKTogbnVtYmVyW10ge1xyXG4gICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IGNvdW50IH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ2hhbmdlQ29uZmlndXJhdGlvbihldmVudDogYW55KTogdm9pZCB7IFxyXG4gICAgIHRoaXMuZ2VuZXJhbFZhbHVlcyA9IHtcclxuICAgICAgZW5hYmxlQVBJOiBldmVudD8uZW5hYmxlQVBJLFxyXG4gICAgICBhcGk6IGV2ZW50Py5hcGlcclxuICAgIH1cclxuICAgIGNvbnN0IGNvbHVtbnMgPSBldmVudC5jb2x1bW5zLm1hcCgoY29sOiBhbnkpID0+IHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBoZWFkZXI6IGNvbD8uaGVhZGVyLFxyXG4gICAgICAgIGNlbGxUeXBlOiBjb2w/LmNlbGxUeXBlLFxyXG4gICAgICAgIHBsYWNlaG9sZGVyOiBjb2w/LnBsYWNlaG9sZGVyLFxyXG4gICAgICAgIG9wdGlvbnM6IGNvbD8ub3B0aW9ucyxcclxuICAgICAgICBhcGlVcmw6IGNvbD8uYXBpVXJsLFxyXG4gICAgICAgIHZhbHVlS2V5OiBjb2w/LnZhbHVlS2V5LFxyXG4gICAgICAgIGxhYmVsS2V5OiBjb2w/LmxhYmVsS2V5LFxyXG4gICAgICAgIGNsYXNzTmFtZTogY29sPy5jbGFzc05hbWUsXHJcbiAgICAgICAgYXBpS2V5OiBjb2w/LmFwaUtleSxcclxuICAgICAgICBpc011bHRpc2VsZWN0OiBjb2w/LmlzTXVsdGlzZWxlY3QsXHJcbiAgICAgICAgY2hlY2tlZFZhbHVlOiBjb2w/LmNoZWNrZWRWYWx1ZSxcclxuICAgICAgICB1bkNoZWNrZWRWYWx1ZTogY29sPy51bkNoZWNrZWRWYWx1ZSxcclxuICAgICAgICBjaGVja0JveExhYmVsOmNvbD8uY2hlY2tCb3hMYWJlbCxcclxuICAgICAgICBpc1JlcXVpcmVkOmNvbD8uaXNSZXF1aXJlZCxcclxuICAgICAgICBlcnJvck1lc3NhZ2U6Y29sPy5lcnJvck1lc3NhZ2UsXHJcbiAgICAgICAgLy8gYWN0aW9uTmFtZTogY29sPy5hY3Rpb25OYW1lLFxyXG4gICAgICAgIC8vIGFjdGlvbkljb25QYXRoOiBjb2w/LmFjdGlvbkljb25QYXRoLFxyXG4gICAgICAgIC8vIGFwaVR5cGU6Y29sPy5hcGlUeXBlLFxyXG4gICAgICAgIC8vIGFwaVVybFRvQ2FsbDogY29sPy5hcGlVcmxUb0NhbGwsXHJcbiAgICAgICAgLy8gcGF5bG9hZE9wdGlvbnM6IGNvbD8ucGF5bG9hZE9wdGlvbnNcclxuICAgICAgICBhY3Rpb246IGNvbD8uYWN0aW9uIFxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGlmKCFldmVudD8uZW5hYmxlQVBJKSB7XHJcbiAgICAgIHRoaXMudGFibGVDb25maWcuY29sdW1ucyA9IGNvbHVtbnM7XHJcbiAgICAgIC8vIHRoaXMudGFibGVDb25maWcucm93cyA9IEFycmF5LmZyb20oeyBsZW5ndGg6ICtldmVudD8ucm93cyB9LCAoZSwgaW5kZXgpID0+ICh7IG5hbWU6IGBTS1UtJHtpbmRleCArIDF9YCwgYWdlOiBpbmRleCAlIDIgIT09IDAsIGdlbmRlcjogJ21hbGUnIH0pKVxyXG4gICAgICAvLyB0aGlzLnRhYmxlQ29uZmlnLnJvd3MgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiArZXZlbnQ/LnJvd3MgfSwgKGUsIGluZGV4KSA9PiB7XHJcbiAgICAgIC8vICAgY29uc3Qgcm93cyA9IGNvbHVtbnMubWFwKChjOiBhbnkpID0+IHtcclxuICAgICAgLy8gICAgIHJldHVybiB7XHJcbiAgICAgIC8vICAgICAgIGM/LmhlYWRlcjogbnVsbFxyXG4gICAgICAvLyAgICAgfVxyXG4gICAgICAvLyAgIH0pXHJcbiAgICAgIC8vICAgcmV0dXJuIHJvd3NcclxuICAgICAgLy8gfSlcclxuICAgICAgdGhpcy50YWJsZUNvbmZpZy5yb3dzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogK2V2ZW50Py5yb3dzIH0sIChfLCBpbmRleCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBjb2x1bW5zLnJlZHVjZSgoYWNjOiBhbnksIGM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgYWNjW2M/LmhlYWRlcl0gPSAnJzsgLy8gSW5pdGlhbGl6ZSBlYWNoIGNvbHVtbiBrZXkgd2l0aCBudWxsXHJcbiAgICAgICAgICByZXR1cm4gYWNjO1xyXG4gICAgICAgIH0sIHt9KTtcclxuICAgICAgfSk7XHJcbiAgICAgIFxyXG4gICAgICB0aGlzLmZldGNoU21hcnREcm9wZG93bkRhdGEoKTtcclxuICAgIH1cclxuICAgIGlmKGV2ZW50Py5lbmFibGVBUEkpIHtcclxuICAgICAgdGhpcy5kcmF3VGFibGUoZXZlbnQsIGNvbHVtbnMpXHJcbiAgICAgIHRoaXMudGFibGVDb25maWcgPSB7XHJcbiAgICAgICAgY29sdW1uczogY29sdW1ucyxcclxuICAgICAgICByb3dzOiBbXVxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICB0aGlzLnRhYmxlQ29uZmlnID0gIHRoaXMuaW5pdGlhbGl6ZUNoZWNrYm94RGVmYXVsdHModGhpcy50YWJsZUNvbmZpZyk7XHJcbiAgICB0aGlzLnRhYmxlQ29uZmlnLmdlbmVyYWxWYWx1ZXMgPSB0aGlzLmdlbmVyYWxWYWx1ZXM7XHJcbiAgICB0aGlzLmZ4RGF0YS52YWx1ZSA9IHRoaXMudGFibGVDb25maWc7XHJcbiAgICB0aGlzLnRhYmxlRm9ybUNvbnRyb2wucmVzZXQoKTtcclxuICAgIHRoaXMudGFibGVGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLnRhYmxlQ29uZmlnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlU2V0dGluZ3MoKTogdm9pZHtcclxuICAgIGlmKHRoaXMuZnhEYXRhLnNldHRpbmdzKXtcclxuICAgICAgZm9yKGxldCBzZXR0aW5nIG9mIHRoaXMuZnhEYXRhLnNldHRpbmdzKXtcclxuICAgICAgaWYoc2V0dGluZy5rZXkgPT09ICd0YWJsZS1jb25maWcnKXtcclxuICAgICAgICBzZXR0aW5nLnZhbHVlID0gdGhpcy50YWJsZUNvbmZpZztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIHB1YmxpYyBkcmF3VGFibGUoZXZlbnQ6IGFueSwgY29sdW1uczogYW55KTogdm9pZCB7XHJcbiAgLy8gICBsZXQgcm93cztcclxuICAvLyAgIHRoaXMuaHR0cC5nZXQoZXZlbnQuYXBpKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgLy8gICAgIGlmKHJlcykge1xyXG4gIC8vICAgICAgIHJvd3MgPSByZXMubWFwKChpdGVtOiBhbnkpID0+IHtcclxuICAvLyAgICAgICAgIGNvbnN0IG5ld09iajogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xyXG4gIC8vICAgICAgICAgY29sdW1ucy5mb3JFYWNoKChjb2w6IGFueSkgPT4ge1xyXG4gIC8vICAgICAgICAgICBuZXdPYmpbY29sLmhlYWRlcl0gPSBpdGVtW2NvbC5hcGlLZXldO1xyXG4gIC8vICAgICAgICAgfSk7XHJcbiAgLy8gICAgICAgICByZXR1cm4gbmV3T2JqO1xyXG4gIC8vICAgICAgIH0pO1xyXG4gIC8vICAgICAgIHRoaXMudGFibGVDb25maWcgPSB7XHJcbiAgLy8gICAgICAgICBjb2x1bW5zLFxyXG4gIC8vICAgICAgICAgcm93c1xyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICB0aGlzLnRhYmxlQ29uZmlnLmdlbmVyYWxWYWx1ZXMgPSB0aGlzLmdlbmVyYWxWYWx1ZXM7XHJcbiAgLy8gICAgICAgdGhpcy5meERhdGEudmFsdWUgPSB0aGlzLnRhYmxlQ29uZmlnO1xyXG4gIC8vICAgICAgIHRoaXMudGFibGVGb3JtQ29udHJvbC5yZXNldCgpO1xyXG4gIC8vICAgICAgIHRoaXMudGFibGVGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLnRhYmxlQ29uZmlnKTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfSlcclxuICAvLyB9XHJcblxyXG4gICAgcHVibGljIGRyYXdUYWJsZShldmVudDogYW55LCBjb2x1bW5zOiBhbnkpOiB2b2lkIHtcclxuICAgIGxldCByb3dzO1xyXG4gICAgdGhpcy5odHRwLmdldChldmVudC5hcGkpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgaWYocmVzKSB7XHJcbiAgICAgICAgdGhpcy5hcGlEYXRhVG9EcmF3VGFibGUgPSByZXM7XHJcbiAgICAgICAgcm93cyA9IHJlcy5tYXAoKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgbmV3T2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XHJcbiAgICAgICAgICBjb2x1bW5zLmZvckVhY2goKGNvbDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIG5ld09ialtjb2wuaGVhZGVyXSA9IGl0ZW1bY29sLmFwaUtleV0gfHwgJyc7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIHJldHVybiBuZXdPYmo7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy50YWJsZUNvbmZpZyA9IHtcclxuICAgICAgICAgIGNvbHVtbnMsXHJcbiAgICAgICAgICByb3dzXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudGFibGVDb25maWcuZ2VuZXJhbFZhbHVlcyA9IHRoaXMuZ2VuZXJhbFZhbHVlcztcclxuICAgICAgICB0aGlzLmZ4RGF0YS52YWx1ZSA9IHRoaXMudGFibGVDb25maWc7XHJcbiAgICAgICAgdGhpcy50YWJsZUZvcm1Db250cm9sLnJlc2V0KCk7XHJcbiAgICAgICAgdGhpcy50YWJsZUZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMudGFibGVDb25maWcpO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgLy8gcHVibGljIGRlbGV0ZUZpbGUoZmlsZTogYW55LCBpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgLy8gICB0aGlzLnVwbG9hZGVkSW1hZ2VzLnNwbGljZShpbmRleCwgMSwgbnVsbCk7XHJcbiAgLy8gICB0aGlzLnRhYmxlQ29uZmlnLnJvd3NbaW5kZXhdW3RoaXMudGFibGVDb25maWcuY29sdW1ucy5maW5kKChmOiBhbnkpID0+IGYuY2VsbFR5cGUgPT09ICdmaWxlLXVwbG9hZCcpPy5oZWFkZXJdID0gbnVsbDtcclxuICAvLyAgIGNvbnNvbGUubG9nKFwidGFibGVDb25maWdcIiwgdGhpcy50YWJsZUNvbmZpZyk7XHJcbiAgLy8gICB0aGlzLnRhYmxlRm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy50YWJsZUNvbmZpZyk7XHJcbiAgLy8gfVxyXG5cclxuICAvLyBwdWJsaWMgZGVsZXRlRmlsZShyb3dJbmRleDogbnVtYmVyLCBpbWFnZUluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAvLyAgIGlmICh0aGlzLnVwbG9hZGVkSW1hZ2VzW3Jvd0luZGV4XSkge1xyXG4gIC8vICAgICB0aGlzLnVwbG9hZGVkSW1hZ2VzW3Jvd0luZGV4XS5zcGxpY2UoaW1hZ2VJbmRleCwgMSk7XHJcbiAgXHJcbiAgLy8gICAgIGNvbnN0IGNvbHVtbkhlYWRlciA9IHRoaXMudGFibGVDb25maWcuY29sdW1ucy5maW5kKChmOiBhbnkpID0+IGYuY2VsbFR5cGUgPT09ICdmaWxlLXVwbG9hZCcpPy5oZWFkZXI7XHJcbiAgLy8gICAgIHRoaXMudGFibGVDb25maWcucm93c1tyb3dJbmRleF1bY29sdW1uSGVhZGVyXSA9IHRoaXMudXBsb2FkZWRJbWFnZXNbcm93SW5kZXhdLm1hcChpbWcgPT4gaW1nLmZpbGUpO1xyXG4gIC8vICAgICB0aGlzLnRhYmxlRm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy50YWJsZUNvbmZpZyk7XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICBwdWJsaWMgZGVsZXRlRmlsZShyb3dJbmRleDogbnVtYmVyLCBpbWFnZUluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnVwbG9hZGVkSW1hZ2VzW3Jvd0luZGV4XSkge1xyXG4gICAgICBjb25zdCByZW1vdmVkRmlsZSA9IHRoaXMudXBsb2FkZWRJbWFnZXNbcm93SW5kZXhdW2ltYWdlSW5kZXhdO1xyXG4gIFxyXG4gICAgICAvLyBUcmFjayB0aGUgZmlsZSB0byBkZWxldGUgaWYgaXQncyBhbiB1cGxvYWRlZCBmaWxlIChpLmUuLCBoYXMgVVJMIGFuZCBubyBGaWxlIG9iamVjdClcclxuICAgICAgaWYgKHJlbW92ZWRGaWxlPy5yZXN1bHQgJiYgdHlwZW9mIHJlbW92ZWRGaWxlLnJlc3VsdCA9PT0gJ3N0cmluZycgJiYgcmVtb3ZlZEZpbGUuZmlsZSA9PT0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMudGFibGVDb25maWcucm93c1tyb3dJbmRleF0uZmlsZXNUb0RlbGV0ZSA9IHRoaXMudGFibGVDb25maWcucm93c1tyb3dJbmRleF0uZmlsZXNUb0RlbGV0ZSB8fCBbXTtcclxuICAgICAgICB0aGlzLnRhYmxlQ29uZmlnLnJvd3Nbcm93SW5kZXhdLmZpbGVzVG9EZWxldGUucHVzaChyZW1vdmVkRmlsZS5yZXN1bHQpO1xyXG4gICAgICB9XHJcbiAgXHJcbiAgICAgIC8vIFJlbW92ZSB0aGUgZmlsZSBmcm9tIHRoZSBVSVxyXG4gICAgICB0aGlzLnVwbG9hZGVkSW1hZ2VzW3Jvd0luZGV4XS5zcGxpY2UoaW1hZ2VJbmRleCwgMSk7XHJcbiAgXHJcbiAgICAgIGNvbnN0IGNvbHVtbkhlYWRlciA9IHRoaXMudGFibGVDb25maWcuY29sdW1ucy5maW5kKChmOiBhbnkpID0+IGYuY2VsbFR5cGUgPT09ICdmaWxlLXVwbG9hZCcpPy5oZWFkZXI7XHJcbiAgICAgIHRoaXMudGFibGVDb25maWcucm93c1tyb3dJbmRleF1bY29sdW1uSGVhZGVyXSA9IHRoaXMudXBsb2FkZWRJbWFnZXNbcm93SW5kZXhdLm1hcChpbWcgPT4gaW1nLmZpbGUpO1xyXG4gIFxyXG4gICAgICB0aGlzLnRhYmxlRm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy50YWJsZUNvbmZpZyk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIFxyXG4gIFxyXG5cclxuICAvLyBwdWJsaWMgcGFyc2VVcmxzKHVybDogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgLy8gICB0aGlzLmh0dHAuZ2V0KHVybCwgeyByZXNwb25zZVR5cGU6ICdibG9iJyB9KS5zdWJzY3JpYmUoe1xyXG4gIC8vICAgICBuZXh0OiAoaW1hZ2VCbG9iOiBCbG9iKSA9PiB7XHJcbiAgLy8gICAgICAgY29uc3QgaW1hZ2VVUkwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGltYWdlQmxvYik7XHJcbiAgLy8gICAgICAgdGhpcy51cGxvYWRlZEltYWdlc1tpbmRleF0gPSB7XHJcbiAgLy8gICAgICAgICByZXN1bHQ6IGltYWdlVVJMLFxyXG4gIC8vICAgICAgICAgZmlsZTogbnVsbFxyXG4gIC8vICAgICAgIH07XHJcbiAgLy8gICAgIH0sXHJcbiAgLy8gICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAvLyAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBpbWFnZTonLCBlcnJvcik7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH0pO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gcHVibGljIHBhcnNlVXJscyh1cmw6IHN0cmluZywgcm93SW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gIC8vICAgdGhpcy5odHRwLmdldCh1cmwsIHsgcmVzcG9uc2VUeXBlOiAnYmxvYicgfSkuc3Vic2NyaWJlKHtcclxuICAvLyAgICAgbmV4dDogKGltYWdlQmxvYjogQmxvYikgPT4ge1xyXG4gIC8vICAgICAgIGNvbnN0IGltYWdlVVJMID0gVVJMLmNyZWF0ZU9iamVjdFVSTChpbWFnZUJsb2IpO1xyXG4gIFxyXG4gIC8vICAgICAgIHRoaXMudXBsb2FkZWRJbWFnZXNbcm93SW5kZXhdID0gdGhpcy51cGxvYWRlZEltYWdlc1tyb3dJbmRleF0gfHwgW107XHJcbiAgLy8gICAgICAgdGhpcy51cGxvYWRlZEltYWdlc1tyb3dJbmRleF0ucHVzaCh7XHJcbiAgLy8gICAgICAgICByZXN1bHQ6IGltYWdlVVJMLFxyXG4gIC8vICAgICAgICAgZmlsZTogbnVsbFxyXG4gIC8vICAgICAgIH0pO1xyXG4gIFxyXG4gIC8vICAgICAgIGNvbnN0IGNvbHVtbkhlYWRlciA9IHRoaXMudGFibGVDb25maWcuY29sdW1ucy5maW5kKChmOiBhbnkpID0+IGYuY2VsbFR5cGUgPT09ICdmaWxlLXVwbG9hZCcpPy5oZWFkZXI7XHJcbiAgLy8gICAgICAgdGhpcy50YWJsZUNvbmZpZy5yb3dzW3Jvd0luZGV4XVtjb2x1bW5IZWFkZXJdID0gdGhpcy51cGxvYWRlZEltYWdlc1tyb3dJbmRleF0ubWFwKGltZyA9PiBpbWcuZmlsZSk7XHJcbiAgXHJcbiAgLy8gICAgICAgdGhpcy50YWJsZUZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMudGFibGVDb25maWcpO1xyXG4gIC8vICAgICB9LFxyXG4gIC8vICAgICBlcnJvcjogKGVycm9yKSA9PiB7XHJcbiAgLy8gICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgaW1hZ2U6JywgZXJyb3IpO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9KTtcclxuICAvLyB9XHJcblxyXG4gIHB1YmxpYyBwYXJzZVVybHModXJsczogc3RyaW5nW10sIHJvd0luZGV4OiBudW1iZXIsIGNvbHVtbnM6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHVybHMpIHx8ICF1cmxzLmxlbmd0aCkgcmV0dXJuO1xyXG4gIFxyXG4gICAgdGhpcy51cGxvYWRlZEltYWdlc1tyb3dJbmRleF0gPSB0aGlzLnVwbG9hZGVkSW1hZ2VzW3Jvd0luZGV4XSB8fCBbXTtcclxuICBcclxuICAgIGNvbnN0IGNvbHVtbkhlYWRlciA9IGNvbHVtbnMuZmluZCgoZjogYW55KSA9PiBmLmNlbGxUeXBlID09PSAnZmlsZS11cGxvYWQnKT8uaGVhZGVyO1xyXG4gICAgaWYgKCFjb2x1bW5IZWFkZXIpIHJldHVybjtcclxuICBcclxuICAgIGNvbnN0IGltYWdlRmV0Y2hlczogT2JzZXJ2YWJsZTxzdHJpbmc+W10gPSBbXTtcclxuICBcclxuICAgIHVybHMuZm9yRWFjaCgodXJsOiBzdHJpbmcpID0+IHtcclxuICAgICAgaWYgKHVybCkge1xyXG4gICAgICAgIGNvbnN0IGltYWdlJCA9IHRoaXMuaHR0cC5nZXQodXJsLCB7IHJlc3BvbnNlVHlwZTogJ2Jsb2InIH0pLnBpcGUoXHJcbiAgICAgICAgICBtYXAoKGltYWdlQmxvYjogQmxvYikgPT4gVVJMLmNyZWF0ZU9iamVjdFVSTChpbWFnZUJsb2IpKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaW1hZ2VGZXRjaGVzLnB1c2goaW1hZ2UkKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgXHJcbiAgICBpZiAoIWltYWdlRmV0Y2hlcy5sZW5ndGgpIHJldHVybjtcclxuICBcclxuICAgIGZvcmtKb2luKGltYWdlRmV0Y2hlcykuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKGltYWdlVVJMczogc3RyaW5nW10pID0+IHtcclxuICAgICAgICBpbWFnZVVSTHMuZm9yRWFjaCgoaW1hZ2VVUkw6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgdGhpcy51cGxvYWRlZEltYWdlc1tyb3dJbmRleF0ucHVzaCh7XHJcbiAgICAgICAgICAgIHJlc3VsdDogaW1hZ2VVUkwsXHJcbiAgICAgICAgICAgIGZpbGU6IG51bGxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gIFxyXG4gICAgICAgIC8vIHRoaXMudGFibGVDb25maWcucm93c1tyb3dJbmRleF1bY29sdW1uSGVhZGVyXSA9IHRoaXMudXBsb2FkZWRJbWFnZXNbcm93SW5kZXhdLm1hcChpbWcgPT4gaW1nLnJlc3VsdCk7XHJcbiAgXHJcbiAgICAgICAgLy8gdGhpcy50YWJsZUZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMudGFibGVDb25maWcpO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgb25lIG9yIG1vcmUgaW1hZ2VzOicsIGVycm9yKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIFxyXG4gIG9uQ2hlY2tib3hDaGFuZ2UoZXZlbnQ6IEV2ZW50LCByb3c6IGFueSwgY29sdW1uOiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICByb3dbY29sdW1uLmhlYWRlcl0gPSBpbnB1dC5jaGVja2VkID8gY29sdW1uLmNoZWNrZWRWYWx1ZSA6IGNvbHVtbi51bkNoZWNrZWRWYWx1ZTtcclxuICB9XHJcbiAgXHJcblxyXG4gIGluaXRpYWxpemVDaGVja2JveERlZmF1bHRzKHRhYmxlRGF0YTogYW55KTogdm9pZCB7XHJcbiAgICB0YWJsZURhdGEucm93cy5mb3JFYWNoKChyb3c6IGFueSkgPT4ge1xyXG4gICAgICB0YWJsZURhdGEuY29sdW1ucy5mb3JFYWNoKChjb2x1bW46IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChjb2x1bW4uY2VsbFR5cGUgPT09ICdjaGVja2JveCcgJiYgY29sdW1uLnVuQ2hlY2tlZFZhbHVlICYmICFyb3dbY29sdW1uLmhlYWRlcl0pIHtcclxuICAgICAgICAgIHJvd1tjb2x1bW4uaGVhZGVyXSA9IGNvbHVtbi51bkNoZWNrZWRWYWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdGFibGVEYXRhO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlQWN0aW9uKHJvdzogYW55LCBhY3Rpb246IGFueSxyb3dJbmRleDphbnkpOiB2b2lkIHtcclxuICAgIGlmIChhY3Rpb24uaXNDb25maXJtYXRpb25SZXF1aXJlZCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkQWN0aW9uID0gYWN0aW9uO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkUm93ID0gcm93O1xyXG4gICAgICB0aGlzLnNlbGVjdGVkUm93SW5kZXggPSByb3dJbmRleFxyXG4gICAgICB0aGlzLmRpc3BsYXlDb25maXJtYXRpb25EaWFsb2cgPSB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5leGVjdXRlQWN0aW9uKHJvdywgYWN0aW9uLHJvd0luZGV4KTtcclxuICAgIH1cclxuICB9XHJcbiAgXHJcbiAgY29uZmlybUFjdGlvbigpOiB2b2lkIHtcclxuICAgIHRoaXMuZXhlY3V0ZUFjdGlvbih0aGlzLnNlbGVjdGVkUm93LCB0aGlzLnNlbGVjdGVkQWN0aW9uLHRoaXMuc2VsZWN0ZWRSb3dJbmRleCk7XHJcbiAgICB0aGlzLmRpc3BsYXlDb25maXJtYXRpb25EaWFsb2cgPSBmYWxzZTtcclxuICB9XHJcbiAgXHJcbiAgY2FuY2VsQWN0aW9uKCk6IHZvaWQge1xyXG4gICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xyXG4gICAgICBzZXZlcml0eTogJ2luZm8nLFxyXG4gICAgICBzdW1tYXJ5OiAnQ2FuY2VsbGVkJyxcclxuICAgICAgZGV0YWlsOiAnQWN0aW9uIHdhcyBjYW5jZWxsZWQnLFxyXG4gICAgICBsaWZlOiAyMDAwXHJcbiAgICB9KTtcclxuICAgIHRoaXMuZGlzcGxheUNvbmZpcm1hdGlvbkRpYWxvZyA9IGZhbHNlO1xyXG4gIH1cclxuICBcclxuICAvLyBoYW5kbGVBY3Rpb24ocm93OiBhbnksIGFjdGlvbjogYW55KTogdm9pZCB7XHJcbiAgLy8gICBpZiAoIWFjdGlvbiB8fCAhYWN0aW9uLmFwaVR5cGUgfHwgIWFjdGlvbi5wYXlsb2FkT3B0aW9ucykge1xyXG4gIC8vICAgICBjb25zb2xlLndhcm4oJ0ludmFsaWQgYWN0aW9uIGNvbmZpZzonLCBhY3Rpb24pO1xyXG4gIC8vICAgICByZXR1cm47XHJcbiAgLy8gICB9XHJcbiAgXHJcbiAgLy8gICBjb25zdCBwYXlsb2FkOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XHJcbiAgXHJcbiAgLy8gICBhY3Rpb24ucGF5bG9hZE9wdGlvbnMuZm9yRWFjaCgob3B0aW9uOiBhbnkpID0+IHtcclxuICAvLyAgICAgY29uc3Qga2V5ID0gb3B0aW9uLnBheWxvYWRPcHRpb25OYW1lO1xyXG4gIC8vICAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbi5wYXlsb2FkT3B0aW9uVmFsdWUgPz8gcm93W29wdGlvbi5wYXlsb2FkT3B0aW9uTmFtZV07XHJcbiAgLy8gICAgIGlmIChrZXkpIHtcclxuICAvLyAgICAgICBwYXlsb2FkW2tleV0gPSB2YWx1ZTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfSk7XHJcbiAgXHJcbiAgLy8gICBjb25zdCBoYW5kbGVTdWNjZXNzID0gKHJlczogYW55KSA9PiB7XHJcbiAgLy8gICAgIGNvbnN0IGFjdGlvbktleSA9IGFjdGlvbi5hY3Rpb25OYW1lIHx8ICdkZWZhdWx0QWN0aW9uJztcclxuXHJcbiAgLy8gICAgIGlmICghcm93LnJlc3BvbnNlIHx8IHR5cGVvZiByb3cucmVzcG9uc2UgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkocm93LnJlc3BvbnNlKSkge1xyXG4gIC8vICAgICAgIHJvdy5yZXNwb25zZSA9IHt9O1xyXG4gIC8vICAgICB9XHJcbiAgICBcclxuICAvLyAgICAgcm93LnJlc3BvbnNlW2FjdGlvbktleV0gPSByZXM7XHJcbiAgICBcclxuICAvLyAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xyXG4gIC8vICAgICAgIHNldmVyaXR5OiAnc3VjY2VzcycsXHJcbiAgLy8gICAgICAgc3VtbWFyeTogJ1N1Y2Nlc3MnLFxyXG4gIC8vICAgICAgIGRldGFpbDogYEFjdGlvbiBcIiR7YWN0aW9uS2V5fVwiIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlgLFxyXG4gIC8vICAgICAgIGxpZmU6IDMwMDBcclxuICAvLyAgICAgfSk7XHJcbiAgLy8gICB9O1xyXG4gICAgXHJcblxyXG4gIC8vICAgY29uc3QgaGFuZGxlRXJyb3IgPSAoZXJyOiBhbnkpID0+IHtcclxuICAvLyAgICAgcm93LnJlc3BvbnNlID0geyBlcnJvcjogZXJyIH07XHJcbiAgLy8gICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcclxuICAvLyAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcclxuICAvLyAgICAgICBzdW1tYXJ5OiAnRXJyb3InLFxyXG4gIC8vICAgICAgIGRldGFpbDogJ1NvbWV0aGluZyB3ZW50IHdyb25nJyxcclxuICAvLyAgICAgICBsaWZlOiAzMDAwXHJcbiAgLy8gICAgIH0pO1xyXG4gIC8vICAgfTtcclxuICBcclxuICAvLyAgIHN3aXRjaCAoYWN0aW9uLmFwaVR5cGUpIHtcclxuICAvLyAgICAgY2FzZSAnUE9TVCc6XHJcbiAgLy8gICAgICAgdGhpcy5odHRwLnBvc3QoYWN0aW9uLmFwaVVybFRvQ2FsbCwgcGF5bG9hZCkuc3Vic2NyaWJlKHsgbmV4dDogaGFuZGxlU3VjY2VzcywgZXJyb3I6IGhhbmRsZUVycm9yIH0pO1xyXG4gIC8vICAgICAgIGJyZWFrO1xyXG4gIFxyXG4gIC8vICAgICBjYXNlICdQVVQnOlxyXG4gIC8vICAgICAgIHRoaXMuaHR0cC5wdXQoYWN0aW9uLmFwaVVybFRvQ2FsbCwgcGF5bG9hZCkuc3Vic2NyaWJlKHsgbmV4dDogaGFuZGxlU3VjY2VzcywgZXJyb3I6IGhhbmRsZUVycm9yIH0pO1xyXG4gIC8vICAgICAgIGJyZWFrO1xyXG4gIFxyXG4gIC8vICAgICBjYXNlICdERUxFVEUnOlxyXG4gIC8vICAgICAgIHRoaXMuaHR0cC5kZWxldGUoYWN0aW9uLmFwaVVybFRvQ2FsbCwgeyBib2R5OiBwYXlsb2FkIH0pLnN1YnNjcmliZSh7IG5leHQ6IGhhbmRsZVN1Y2Nlc3MsIGVycm9yOiBoYW5kbGVFcnJvciB9KTtcclxuICAvLyAgICAgICBicmVhaztcclxuICBcclxuICAvLyAgICAgY2FzZSAnR0VUJzpcclxuICAvLyAgICAgICB0aGlzLmh0dHAuZ2V0KGFjdGlvbi5hcGlVcmxUb0NhbGwsIHsgcGFyYW1zOiBwYXlsb2FkIH0pLnN1YnNjcmliZSh7IG5leHQ6IGhhbmRsZVN1Y2Nlc3MsIGVycm9yOiBoYW5kbGVFcnJvciB9KTtcclxuICAvLyAgICAgICBicmVhaztcclxuICBcclxuICAvLyAgICAgZGVmYXVsdDpcclxuICAvLyAgICAgICBjb25zb2xlLndhcm4oJ1Vua25vd24gQVBJIHR5cGU6JywgYWN0aW9uLmFwaVR5cGUpO1xyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuICBcclxuICAvLyBoYW5kbGVBY3Rpb24ocm93OiBhbnksIGFjdGlvbjogYW55KTogdm9pZCB7XHJcbiAgLy8gICBpZiAoYWN0aW9uLmlzQ29uZmlybWF0aW9uUmVxdWlyZWQpIHtcclxuICAvLyAgICAgdGhpcy5jb25maXJtYXRpb25TZXJ2aWNlLmNvbmZpcm0oe1xyXG4gIC8vICAgICAgIG1lc3NhZ2U6IGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcGVyZm9ybSBcIiR7YWN0aW9uLmFjdGlvbk5hbWV9XCI/YCxcclxuICAvLyAgICAgICBoZWFkZXI6ICdDb25maXJtYXRpb24nLFxyXG4gIC8vICAgICAgIGljb246ICdwaSBwaS1leGNsYW1hdGlvbi10cmlhbmdsZScsXHJcbiAgLy8gICAgICAgYWNjZXB0OiAoKSA9PiB0aGlzLmV4ZWN1dGVBY3Rpb24ocm93LCBhY3Rpb24pLFxyXG4gIC8vICAgICAgIHJlamVjdDogKCkgPT4ge1xyXG4gIC8vICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xyXG4gIC8vICAgICAgICAgICBzZXZlcml0eTogJ2luZm8nLFxyXG4gIC8vICAgICAgICAgICBzdW1tYXJ5OiAnQ2FuY2VsbGVkJyxcclxuICAvLyAgICAgICAgICAgZGV0YWlsOiAnQWN0aW9uIHdhcyBjYW5jZWxsZWQnLFxyXG4gIC8vICAgICAgICAgICBsaWZlOiAyMDAwXHJcbiAgLy8gICAgICAgICB9KTtcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH0pO1xyXG4gIC8vICAgfSBlbHNlIHtcclxuICAvLyAgICAgdGhpcy5leGVjdXRlQWN0aW9uKHJvdywgYWN0aW9uKTtcclxuICAvLyAgIH1cclxuICAvLyB9XHJcbiAgXHJcblxyXG4gIGV4ZWN1dGVBY3Rpb24ocm93OiBhbnksIGFjdGlvbjogYW55LHJvd0luZGV4OmFueSk6IHZvaWQge1xyXG4gICAgY29uc3QgcGF5bG9hZDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xyXG4gIFxyXG4gICAgYWN0aW9uLnBheWxvYWRPcHRpb25zLmZvckVhY2goKG9wdGlvbjogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGtleSA9IG9wdGlvbi5wYXlsb2FkT3B0aW9uTmFtZTtcclxuICAgICAgY29uc3QgdmFsdWUgPSBvcHRpb24ucGF5bG9hZE9wdGlvblZhbHVlID8/IHRoaXMuYXBpRGF0YVRvRHJhd1RhYmxlW3Jvd0luZGV4XVtrZXldO1xyXG4gICAgICBpZiAoa2V5KSB7XHJcbiAgICAgICAgcGF5bG9hZFtrZXldID0gdmFsdWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIFxyXG4gICAgY29uc3QgYWN0aW9uS2V5ID0gYWN0aW9uLmFjdGlvbk5hbWUgfHwgJ2RlZmF1bHRBY3Rpb24nO1xyXG4gIFxyXG4gICAgY29uc3QgaGFuZGxlU3VjY2VzcyA9IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoIXJvdy5yZXNwb25zZSB8fCB0eXBlb2Ygcm93LnJlc3BvbnNlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHJvdy5yZXNwb25zZSkpIHtcclxuICAgICAgICByb3cucmVzcG9uc2UgPSB7fTtcclxuICAgICAgfVxyXG4gIFxyXG4gICAgICByb3cucmVzcG9uc2VbYWN0aW9uS2V5XSA9IHJlcztcclxuICBcclxuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xyXG4gICAgICAgIHNldmVyaXR5OiAnc3VjY2VzcycsXHJcbiAgICAgICAgc3VtbWFyeTogJ1N1Y2Nlc3MnLFxyXG4gICAgICAgIGRldGFpbDogYEFjdGlvbiBcIiR7YWN0aW9uS2V5fVwiIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlgLFxyXG4gICAgICAgIGxpZmU6IDMwMDBcclxuICAgICAgfSk7XHJcbiAgICB9O1xyXG4gIFxyXG4gICAgY29uc3QgaGFuZGxlRXJyb3IgPSAoZXJyOiBhbnkpID0+IHtcclxuICAgICAgaWYgKCFyb3cucmVzcG9uc2UgfHwgdHlwZW9mIHJvdy5yZXNwb25zZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShyb3cucmVzcG9uc2UpKSB7XHJcbiAgICAgICAgcm93LnJlc3BvbnNlID0ge307XHJcbiAgICAgIH1cclxuICBcclxuICAgICAgcm93LnJlc3BvbnNlW2FjdGlvbktleV0gPSB7IGVycm9yOiBlcnIgfTtcclxuICBcclxuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xyXG4gICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxyXG4gICAgICAgIHN1bW1hcnk6ICdFcnJvcicsXHJcbiAgICAgICAgZGV0YWlsOiBgQWN0aW9uIFwiJHthY3Rpb25LZXl9XCIgZmFpbGVkYCxcclxuICAgICAgICBsaWZlOiAzMDAwXHJcbiAgICAgIH0pO1xyXG4gICAgfTtcclxuICBcclxuICAgIHN3aXRjaCAoYWN0aW9uLmFwaVR5cGUpIHtcclxuICAgICAgY2FzZSAnUE9TVCc6XHJcbiAgICAgICAgdGhpcy5odHRwLnBvc3QoYWN0aW9uLmFwaVVybFRvQ2FsbCwgcGF5bG9hZCkuc3Vic2NyaWJlKHsgbmV4dDogaGFuZGxlU3VjY2VzcywgZXJyb3I6IGhhbmRsZUVycm9yIH0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdQVVQnOlxyXG4gICAgICAgIHRoaXMuaHR0cC5wdXQoYWN0aW9uLmFwaVVybFRvQ2FsbCwgcGF5bG9hZCkuc3Vic2NyaWJlKHsgbmV4dDogaGFuZGxlU3VjY2VzcywgZXJyb3I6IGhhbmRsZUVycm9yIH0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdERUxFVEUnOlxyXG4gICAgICAgIHRoaXMuaHR0cC5kZWxldGUoYWN0aW9uLmFwaVVybFRvQ2FsbCwgeyBib2R5OiBwYXlsb2FkIH0pLnN1YnNjcmliZSh7IG5leHQ6IGhhbmRsZVN1Y2Nlc3MsIGVycm9yOiBoYW5kbGVFcnJvciB9KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnR0VUJzpcclxuICAgICAgICB0aGlzLmh0dHAuZ2V0KGFjdGlvbi5hcGlVcmxUb0NhbGwsIHsgcGFyYW1zOiBwYXlsb2FkIH0pLnN1YnNjcmliZSh7IG5leHQ6IGhhbmRsZVN1Y2Nlc3MsIGVycm9yOiBoYW5kbGVFcnJvciB9KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBjb25zb2xlLndhcm4oJ1Vua25vd24gQVBJIHR5cGU6JywgYWN0aW9uLmFwaVR5cGUpO1xyXG4gICAgfVxyXG4gIH1cclxuICBcclxuICBcclxuICBcclxuXHJcbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxufVxyXG4iLCI8Zngtc2V0dGluZ3MtcGFuZWwgW2Z4RGF0YV09XCJmeERhdGFcIiBbdGFibGVEYXRhXT1cImZ4RGF0YVwiIChjb25maWd1cmF0aW9uKT1cIm9uQ2hhbmdlQ29uZmlndXJhdGlvbigkZXZlbnQpXCI+XHJcbiAgPGRpdiAqbmdJZj1cImZ4RGF0YVwiPlxyXG4gICAgPHRhYmxlIHN0eWxlPVwid2lkdGg6IDEwMCU7XCIgY2xhc3M9XCJmb3JtQnVpbGRlcl9keW5hbWljX3RhYmxlXCI+XHJcbiAgICAgIDx0aGVhZD5cclxuICAgICAgICA8dHI+XHJcbiAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IGNvbHVtbiBvZiB0YWJsZUNvbmZpZy5jb2x1bW5zXCI+e3sgY29sdW1uLmhlYWRlciB9fTwvdGg+XHJcbiAgICAgICAgPC90cj5cclxuICAgICAgPC90aGVhZD5cclxuICAgICAgPHRib2R5PlxyXG4gICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcm93IG9mIHRhYmxlQ29uZmlnLnJvd3M7IGxldCByb3dJbmRleCA9IGluZGV4XCI+XHJcbiAgICAgICAgICA8dGQgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiB0YWJsZUNvbmZpZy5jb2x1bW5zXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbHVtbi5jZWxsVHlwZVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJjb2x1bW4/LmNsYXNzTmFtZVwiICpuZ1N3aXRjaENhc2U9XCIndGV4dCdcIj57e3Jvd1tjb2x1bW4uaGVhZGVyXX19PC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIDxpbnB1dCBbY2xhc3NdPVwiY29sdW1uPy5jbGFzc05hbWVcIiAqbmdTd2l0Y2hDYXNlPVwiJ2lucHV0LXRleHQnXCIgdHlwZT1cInRleHRcIiBbcGxhY2Vob2xkZXJdPVwiY29sdW1uPy5wbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3dbY29sdW1uLmhlYWRlcl1cIiAvPiAtLT5cclxuXHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2lucHV0LXRleHQnXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgW2NsYXNzXT1cImNvbHVtbj8uY2xhc3NOYW1lXCIgdHlwZT1cInRleHRcIiBbcGxhY2Vob2xkZXJdPVwiY29sdW1uPy5wbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93W2NvbHVtbi5oZWFkZXJdXCIgW3JlcXVpcmVkXT1cImNvbHVtbj8uaXNSZXF1aXJlZFwiICNtb2RlbD1cIm5nTW9kZWxcIiAvPlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2x1bW4/LmlzUmVxdWlyZWQgJiYgbW9kZWwuaW52YWxpZCAmJiBtb2RlbC50b3VjaGVkXCIgY2xhc3M9XCJ0ZXh0LXJlZC01MDAgdGV4dC1zbSBtdC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7IGNvbHVtbj8uZXJyb3JNZXNzYWdlIH19XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG5cclxuICAgICAgICAgICAgICA8aW5wdXQgW2NsYXNzXT1cImNvbHVtbj8uY2xhc3NOYW1lXCIgKm5nU3dpdGNoQ2FzZT1cIidpbnB1dC1udW1iZXInXCIgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiY29sdW1uPy5wbGFjZWhvbGRlclwiIFsobmdNb2RlbCldPVwicm93W2NvbHVtbi5oZWFkZXJdXCIgLz5cclxuXHJcbiAgICAgICAgICAgICAgPHNlbGVjdCBbY2xhc3NdPVwiY29sdW1uPy5jbGFzc05hbWVcIiAqbmdTd2l0Y2hDYXNlPVwiJ2Ryb3Bkb3duJ1wiIFsobmdNb2RlbCldPVwicm93W2NvbHVtbi5oZWFkZXJdXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdJZj1cImNvbHVtbi5wbGFjZWhvbGRlclwiIHZhbHVlPVwiXCI+e3sgY29sdW1uLnBsYWNlaG9sZGVyIH19PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgY29sdW1uPy5vcHRpb25zXCIgW3ZhbHVlXT1cIm9wdGlvbj8ub3B0aW9uVmFsdWVcIj5cclxuICAgICAgICAgICAgICAgICAge3sgb3B0aW9uPy5vcHRpb25OYW1lIH19XHJcbiAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSA8c2VsZWN0IFtjbGFzc109XCJjb2x1bW4/LmNsYXNzTmFtZVwiIHN0eWxlPVwid2lkdGg6IDYwJTtcIiAqbmdTd2l0Y2hDYXNlPVwiJ3NtYXJ0LWRyb3Bkb3duJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3dbY29sdW1uLmhlYWRlcl1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+U2VsZWN0IHt7Y29sdW1uLmhlYWRlcn19PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdJZj1cImNvbHVtbi5wbGFjZWhvbGRlclwiIHZhbHVlPVwiXCI+e3sgY29sdW1uLnBsYWNlaG9sZGVyIH19PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHNtYXJ0RHJvcGRvd25PcHRpb25zW2NvbHVtbi5oZWFkZXJdXCIgW3ZhbHVlXT1cIm9wdGlvbj8udmFsdWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tvcHRpb24/Lm5hbWUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PiAtLT5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSA8cC1tdWx0aVNlbGVjdCBbb3B0aW9uc109XCJzbWFydERyb3Bkb3duT3B0aW9uc1tjb2x1bW4uaGVhZGVyXVwiIFsobmdNb2RlbCldPVwicm93W2NvbHVtbi5oZWFkZXJdXCIgb3B0aW9uTGFiZWw9XCJuYW1lXCIgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiIHBsYWNlaG9sZGVyPVwiU2VsZWN0IENpdGllc1wiICpuZ1N3aXRjaENhc2U9XCInc21hcnQtZHJvcGRvd24nXCIvPiAtLT5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBzbWFydC1kcm9wZG93biBoYW5kbGluZyAtLT5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInc21hcnQtZHJvcGRvd24nXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBSZWd1bGFyIGRyb3Bkb3duIGlmIGlzTXVsdGlzZWxlY3QgaXMgZmFsc2Ugb3Igbm90IHNldCAtLT5cclxuICAgICAgICAgICAgICAgIDxzZWxlY3QgKm5nSWY9XCIhY29sdW1uPy5pc011bHRpc2VsZWN0XCIgW2NsYXNzXT1cImNvbHVtbj8uY2xhc3NOYW1lXCIgc3R5bGU9XCJ3aWR0aDogNjAlO1wiXHJcbiAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93W2NvbHVtbi5oZWFkZXJdXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nSWY9XCJjb2x1bW4ucGxhY2Vob2xkZXJcIiB2YWx1ZT1cIlwiPnt7IGNvbHVtbi5wbGFjZWhvbGRlciB9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygc21hcnREcm9wZG93bk9wdGlvbnNbY29sdW1uLmhlYWRlcl1cIiBbdmFsdWVdPVwib3B0aW9uPy52YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IG9wdGlvbj8ubmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIl9fb3RoZXJfX1wiPk90aGVyPC9vcHRpb24+XHJcblxyXG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgKm5nSWY9XCJyb3dbY29sdW1uLmhlYWRlcl0gPT09ICdfX290aGVyX18nXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cIm10LTIgcC1pbnB1dHRleHQtc21cIlxyXG4gICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ0VudGVyIG90aGVyICcgKyBjb2x1bW4uaGVhZGVyXCIgWyhuZ01vZGVsKV09XCJyb3dbY29sdW1uLmhlYWRlciArICdfb3RoZXInXVwiIC8+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBQcmltZU5HIG11bHRpc2VsZWN0IGlmIGlzTXVsdGlzZWxlY3QgaXMgdHJ1ZSAtLT5cclxuICAgICAgICAgICAgICAgIDxwLW11bHRpU2VsZWN0ICpuZ0lmPVwiY29sdW1uPy5pc011bHRpc2VsZWN0XCIgW29wdGlvbnNdPVwic21hcnREcm9wZG93bk9wdGlvbnNbY29sdW1uLmhlYWRlcl1cIlxyXG4gICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJvd1tjb2x1bW4uaGVhZGVyXVwiIFtjbGFzc109XCJjb2x1bW4/LmNsYXNzTmFtZVwiIG9wdGlvbkxhYmVsPVwibmFtZVwiIG9wdGlvblZhbHVlPVwidmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiY29sdW1uLnBsYWNlaG9sZGVyIHx8ICgnU2VsZWN0ICcgKyBjb2x1bW4uaGVhZGVyKVwiPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZHJvcGRvd25pY29uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIGRkX2Rvd25faWNvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwaSBwaS1hbmdsZS1kb3duIHRleHQteGxcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L3AtbXVsdGlTZWxlY3Q+XHJcblxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSA8aW5wdXQgW2NsYXNzXT1cImNvbHVtbj8uY2xhc3NOYW1lXCIgKm5nU3dpdGNoQ2FzZT1cIidjaGVja2JveCdcIiB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93W2NvbHVtbi5oZWFkZXJdXCIgLz4gLS0+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2NoZWNrYm94J1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIFtjbGFzc109XCJjb2x1bW4/LmNsYXNzTmFtZVwiIGNsYXNzPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJyb3dbY29sdW1uLmhlYWRlcl0gPT09IGNvbHVtbi5jaGVja2VkVmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25DaGVja2JveENoYW5nZSgkZXZlbnQsIHJvdywgY29sdW1uKVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgIHt7IGNvbHVtbj8uY2hlY2tCb3hMYWJlbCB8fCAnJyB9fVxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8cC10b2FzdD48L3AtdG9hc3Q+XHJcbiAgICAgICAgICAgICAgPHAtY29uZmlybURpYWxvZz48L3AtY29uZmlybURpYWxvZz5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYWN0aW9uJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTYganVzdGlmeS1zdGFydCBpdGVtcy1zdGFydFwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgY29sdW1uPy5hY3Rpb25cIiBjbGFzcz1cImZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIHctMjAgY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVBY3Rpb24ocm93LCBhY3Rpb24scm93SW5kZXgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cImFjdGlvbj8uYWN0aW9uSWNvblBhdGhcIiBhbHQ9XCJpY29uXCIgY2xhc3M9XCJ3LTYgaC02IG1iLTFcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC14cyB0ZXh0LWNlbnRlciBicmVhay13b3Jkc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgYWN0aW9uPy5hY3Rpb25OYW1lIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4gICAgICAgICAgICAgIDxpbnB1dCBuYW1lPVwicmFkaW8te3tyb3dJbmRleH19XCIgW2NsYXNzXT1cImNvbHVtbj8uY2xhc3NOYW1lXCIgKm5nU3dpdGNoQ2FzZT1cIidyYWRpbydcIiB0eXBlPVwicmFkaW9cIlxyXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3dbY29sdW1uLmhlYWRlcl1cIiAvPlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IFtjbGFzc109XCJjb2x1bW4/LmNsYXNzTmFtZVwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IGdhcDogMTBweDtcIlxyXG4gICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIidyYWRpby1ncm91cCdcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGNvbHVtbi5vcHRpb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPVwicmFkaW8tZ3JvdXAte3tyb3dJbmRleH19XCIgdHlwZT1cInJhZGlvXCIgW3ZhbHVlXT1cIm9wdGlvbj8ub3B0aW9uTmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3dbY29sdW1uLmhlYWRlcl1cIiAvPlxyXG4gICAgICAgICAgICAgICAgICB7eyBvcHRpb24/Lm9wdGlvbk5hbWUgfX1cclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2ZpbGUtdXBsb2FkJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgaXRlbXMtZW5kIGp1c3RpZnktZW5kIHJlbGF0aXZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC0yIGZsZXgtd3JhcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJlbGF0aXZlXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaW1hZ2Ugb2YgdXBsb2FkZWRJbWFnZXM/Lltyb3dJbmRleF07IGxldCBpID0gaW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjEwMFwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3JjXT1cImltYWdlPy5yZXN1bHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJVcGxvYWRlZCBJbWFnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicm91bmRlZCBzaGFkb3dcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVGaWxlKHJvd0luZGV4LCBpKVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFic29sdXRlIHRvcC0wIHJpZ2h0LTAgdGV4dC13aGl0ZSByb3VuZGVkLW1kIHctNSBoLTUgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgc2hhZG93LWxnIGhvdmVyOmJnLXJlZC02MDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDinYxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImNvbHVtbj8uY2xhc3NOYW1lXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImZpbGVcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiZmlsZVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN1cGxvYWRGaWxlICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW4gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInVwbG9hZEltYWdlKCRldmVudCwgcm93SW5kZXgpXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidXBsb2FkRmlsZS5jbGljaygpXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtdC0yIGJnLWJsdWUtNTAwIHRleHQtd2hpdGUgcHgtMyBweS0xIHJvdW5kZWQgaG92ZXI6YmctYmx1ZS02MDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXBsb2FkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+IC0tPlxyXG5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZmlsZS11cGxvYWQnXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1lbmQgcmVsYXRpdmUgZ2FwLTQgZmxleC13cmFwXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC0yIGZsZXgtd3JhcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZVwiICpuZ0Zvcj1cImxldCBpbWFnZSBvZiB1cGxvYWRlZEltYWdlcz8uW3Jvd0luZGV4XTsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGltZyB3aWR0aD1cIjEwMFwiIGhlaWdodD1cIjgwXCIgW3NyY109XCJpbWFnZT8ucmVzdWx0XCIgYWx0PVwiVXBsb2FkZWQgSW1hZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJvdW5kZWQgc2hhZG93IG9yaWVudGF0aW9uXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgIDxhIChjbGljayk9XCJkZWxldGVGaWxlKHJvd0luZGV4LCBpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWJzb2x1dGUgdG9wLTAgcmlnaHQtMCB0ZXh0LXdoaXRlIHJvdW5kZWQtbWQgdy01IGgtNSBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBjdXJzb3ItcG9pbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiB2aWV3Qm94PVwiMCAwIDE4IDE4XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzY4MzdfMjk2ODMpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiByeD1cIjlcIiBmaWxsPVwiI0YzQTA0MVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWFzayBpZD1cIm1hc2swXzY4MzdfMjk2ODNcIiBzdHlsZT1cIm1hc2stdHlwZTphbHBoYVwiIG1hc2tVbml0cz1cInVzZXJTcGFjZU9uVXNlXCIgeD1cIjRcIiB5PVwiNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiNFwiIHk9XCI0XCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgZmlsbD1cIiNEOUQ5RDlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXNrPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgbWFzaz1cInVybCgjbWFzazBfNjgzN18yOTY4MylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTguMjA0NSA4Ljk5ODE1TDUuODE4MDIgNi42MTE2N0w2LjYxMzUxIDUuODE2MTdMOSA4LjIwMjY2TDExLjM4NjUgNS44MTYxN0wxMi4xODIgNi42MTE2N0w5Ljc5NTUgOC45OTgxNUwxMi4xODIgMTEuMzg0NkwxMS4zODY1IDEyLjE4MDFMOSA5Ljc5MzY1TDYuNjEzNTEgMTIuMTgwMUw1LjgxODAyIDExLjM4NDZMOC4yMDQ1IDguOTk4MTVaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwid2hpdGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzY4MzdfMjk2ODNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgcng9XCI5XCIgZmlsbD1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgW2NsYXNzXT1cImNvbHVtbj8uY2xhc3NOYW1lXCIgdHlwZT1cImZpbGVcIiBuYW1lPVwiZmlsZVwiICN1cGxvYWRGaWxlIGhpZGRlbiBtdWx0aXBsZVxyXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidXBsb2FkSW1hZ2UoJGV2ZW50LCByb3dJbmRleClcIiAvPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwidXBsb2FkRmlsZS5jbGljaygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjlcIiBoZWlnaHQ9XCIyOFwiIHZpZXdCb3g9XCIwIDAgMjkgMjhcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xNC4wMDEgMy4wMDE5NUMxMS41MzIyIDMuMDAxOTUgOS4xNjcyMiAzLjg2OTU2IDcuMjM2NDEgNS4zODQxNEw3LjIzNTk4IDQuNTk2OTVDNy4yMzU5OCA0LjUyNDczIDcuMjIxNzUgNC40NTMyMSA3LjE5NDExIDQuMzg2NDhDNy4xNjY0NyA0LjMxOTc1IDcuMTI1OTYgNC4yNTkxMiA3LjA3NDg5IDQuMjA4MDRDNy4wMjM4MSA0LjE1Njk3IDYuOTYzMTggNC4xMTY0NiA2Ljg5NjQ1IDQuMDg4ODJDNi44Mjk3MiA0LjA2MTE4IDYuNzU4MiA0LjA0Njk1IDYuNjg1OTggNC4wNDY5NUM2LjYxMzc1IDQuMDQ2OTUgNi41NDIyMyA0LjA2MTE4IDYuNDc1NSA0LjA4ODgyQzYuNDA4NzcgNC4xMTY0NiA2LjM0ODE0IDQuMTU2OTcgNi4yOTcwNyA0LjIwODA0QzYuMjQ1OTkgNC4yNTkxMiA2LjIwNTQ4IDQuMzE5NzUgNi4xNzc4NCA0LjM4NjQ4QzYuMTUwMiA0LjQ1MzIxIDYuMTM1OTggNC41MjQ3MyA2LjEzNTk4IDQuNTk2OTVMNi4xMzY0MiA2LjY4NjUyQzYuMTM2NDMgNi44MzIzOSA2LjE5NDM4IDYuOTcyMjggNi4yOTc1MiA3LjA3NTQyQzYuNDAwNjcgNy4xNzg1NiA2LjU0MDU1IDcuMjM2NTEgNi42ODY0MiA3LjIzNjUySDguNzc1OThDOC44NDgyIDcuMjM2NTIgOC45MTk3MiA3LjIyMjMgOC45ODY0NSA3LjE5NDY2QzkuMDUzMTggNy4xNjcwMiA5LjExMzgxIDcuMTI2NTEgOS4xNjQ4OSA3LjA3NTQzQzkuMjE1OTYgNy4wMjQzNiA5LjI1NjQ3IDYuOTYzNzMgOS4yODQxMSA2Ljg5N0M5LjMxMTc1IDYuODMwMjcgOS4zMjU5OCA2Ljc1ODc1IDkuMzI1OTggNi42ODY1MkM5LjMyNTk4IDYuNjE0MyA5LjMxMTc1IDYuNTQyNzggOS4yODQxMSA2LjQ3NjA1QzkuMjU2NDcgNi40MDkzMiA5LjIxNTk2IDYuMzQ4NjkgOS4xNjQ4OSA2LjI5NzYxQzkuMTEzODEgNi4yNDY1NCA5LjA1MzE4IDYuMjA2MDMgOC45ODY0NSA2LjE3ODM5QzguOTE5NzIgNi4xNTA3NSA4Ljg0ODIgNi4xMzY1MiA4Ljc3NTk4IDYuMTM2NTJIOC4wNTg0QzkuNzcwMiA0Ljg0Mzg3IDExLjgzOTkgNC4xMDE5NSAxNC4wMDEgNC4xMDE5NUMxOS40NzUxIDQuMTAxOTUgMjMuOTAxIDguNTI3ODIgMjMuOTAxIDE0LjAwMkMyMy45MDEgMTkuNDc2MSAxOS40NzUxIDIzLjkwMiAxNC4wMDEgMjMuOTAyQzguNTI2ODQgMjMuOTAyIDQuMTAwOTggMTkuNDc2MSA0LjEwMDk4IDE0LjAwMkM0LjEwMDk4IDEyLjYzODEgNC4zODI2MyAxMS4yODg4IDQuOTI4NTUgMTAuMDM4OUM0Ljk4NjkxIDkuOTA1MzIgNC45ODk4MiA5Ljc1Mzk5IDQuOTM2NjUgOS42MTgyMkM0Ljg4MzQ3IDkuNDgyNDYgNC43Nzg1NSA5LjM3MzM2IDQuNjQ0OTYgOS4zMTQ5MkM0LjU3ODc3IDkuMjg1OTYgNC41MDc1MyA5LjI3MDMyIDQuNDM1MyA5LjI2ODlDNC4zNjMwNiA5LjI2NzQ3IDQuMjkxMjYgOS4yODAzIDQuMjIzOTggOS4zMDY2M0M0LjE1NjcxIDkuMzMyOTcgNC4wOTUyOCA5LjM3MjMgNC4wNDMyMSA5LjQyMjM4QzMuOTkxMTQgOS40NzI0NyAzLjk0OTQ0IDkuNTMyMzIgMy45MjA1MSA5LjU5ODUyQzMuMzEzOTMgMTAuOTg3MiAzLjAwMDk4IDEyLjQ4NjYgMy4wMDA5OCAxNC4wMDJDMy4wMDA5OCAyMC4wNzA2IDcuOTMyMzYgMjUuMDAyIDE0LjAwMSAyNS4wMDJDMjAuMDY5NiAyNS4wMDIgMjUuMDAxIDIwLjA3MDYgMjUuMDAxIDE0LjAwMkMyNS4wMDEgNy45MzMzNCAyMC4wNjk2IDMuMDAxOTUgMTQuMDAxIDMuMDAxOTVaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0YzQTA0MVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEzLjk5ODggNi4xMzk2NUM5LjY2MTYgNi4xMzk2NSA2LjEzMzc5IDkuNjY3NDYgNi4xMzM3OSAxNC4wMDQ2QzYuMTMzNzkgMTguMzQxOCA5LjY2MTYgMjEuODY5NiAxMy45OTg4IDIxLjg2OTZDMTguMzM2IDIxLjg2OTYgMjEuODYzOCAxOC4zNDE4IDIxLjg2MzggMTQuMDA0NkMyMS44NjM4IDkuNjY3NDYgMTguMzM2IDYuMTM5NjUgMTMuOTk4OCA2LjEzOTY1Wk0xMy45OTg4IDguMjI5NjVDMTQuMTQ0NyA4LjIyOTY1IDE0LjI4NDYgOC4yODc1OSAxNC4zODc3IDguMzkwNzRDMTQuNDkwOCA4LjQ5Mzg4IDE0LjU0ODggOC42MzM3OCAxNC41NDg4IDguNzc5NjVWMTMuNzc2OUwxNy41MjI3IDE2Ljc1MDhDMTcuNjI1OCAxNi44NTM5IDE3LjY4MzcgMTYuOTkzOCAxNy42ODM3IDE3LjEzOTZDMTcuNjgzNyAxNy4yODU1IDE3LjYyNTggMTcuNDI1NCAxNy41MjI3IDE3LjUyODVDMTcuNDE5NSAxNy42MzE2IDE3LjI3OTYgMTcuNjg5NiAxNy4xMzM4IDE3LjY4OTZDMTYuOTg3OSAxNy42ODk2IDE2Ljg0ODEgMTcuNjMxNiAxNi43NDQ5IDE3LjUyODVMMTMuNjA5OSAxNC4zOTM1QzEzLjUwNjggMTQuMjkwNCAxMy40NDg4IDE0LjE1MDUgMTMuNDQ4OCAxNC4wMDQ2VjguNzc5NjVDMTMuNDQ4OCA4LjYzMzc4IDEzLjUwNjcgOC40OTM4OCAxMy42MDk5IDguMzkwNzRDMTMuNzEzIDguMjg3NTkgMTMuODUyOSA4LjIyOTY1IDEzLjk5ODggOC4yMjk2NVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjRjNBMDQxXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIyOC41NlwiIGhlaWdodD1cIjI4XCIgcng9XCIxLjUxNDc5XCIgZmlsbD1cIiNGM0EwNDFcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTUuMDY4IDIyLjczOTFWMTcuNjcwOEgxOC40OTY4TDE0LjIxMDggMTIuNjAyNUw5LjkyNDggMTcuNjcwOEgxMy4zNTM2VjIyLjczOTFIOS4wNjc1OVYyMi42OTY5QzguOTIzNTggMjIuNzA1MyA4Ljc4NjQzIDIyLjczOTEgOC42Mzg5OSAyMi43MzkxQzYuOTMzOTEgMjIuNzM5MSA1LjI5ODY2IDIyLjA3MTcgNC4wOTI5OCAyMC44ODM1QzIuODg3MyAxOS42OTU0IDIuMjA5OTYgMTguMDg0IDIuMjA5OTYgMTYuNDAzN0MyLjIwOTk2IDEzLjE1MzIgNC43MDQ0MyAxMC41MDQyIDcuOTA1MjMgMTAuMTQxQzguMTg1ODUgOC42OTUzIDguOTY4OTIgNy4zOTExOCAxMC4xMTk3IDYuNDUyOTJDMTEuMjcwNiA1LjUxNDY1IDEyLjcxNzIgNS4wMDA4OSAxNC4yMTA4IDVDMTUuNzA0NyA1LjAwMDgyIDE3LjE1MTUgNS41MTQ1MiAxOC4zMDI2IDYuNDUyNzdDMTkuNDUzNyA3LjM5MTAxIDIwLjIzNzEgOC42OTUxNiAyMC41MTgxIDEwLjE0MUMyMy43MTg5IDEwLjUwNDIgMjYuMjEgMTMuMTUzMiAyNi4yMSAxNi40MDM3QzI2LjIxIDE4LjA4NCAyNS41MzI2IDE5LjY5NTQgMjQuMzI2OSAyMC44ODM1QzIzLjEyMTMgMjIuMDcxNyAyMS40ODYgMjIuNzM5MSAxOS43ODA5IDIyLjczOTFDMTkuNjM2OSAyMi43MzkxIDE5LjQ5ODEgMjIuNzA1MyAxOS4zNTIzIDIyLjY5NjlWMjIuNzM5MUgxNS4wNjhaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwid2hpdGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGEgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJ1cGxvYWRGaWxlLmNsaWNrKClcIiBjbGFzcz1cInRleHQtYmFzZSBjdXJzb3ItcG9pbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgJ1VwbG9hZCcgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3RleHRhcmVhJ1wiPlxyXG4gICAgICAgICAgICAgICAgPHRleHRhcmVhIFtjbGFzc109XCJjb2x1bW4/LmNsYXNzTmFtZVwiIG5hbWU9XCJcIiBpZD1cIlwiIGNvbHM9XCIzMFwiIHJvd3M9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbHVtbj8ucGxhY2Vob2xkZXJcIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPC90cj5cclxuICAgICAgPC90Ym9keT5cclxuICAgIDwvdGFibGU+XHJcbiAgICA8IS0tIFlvdXIgbWFpbiB0ZW1wbGF0ZSAtLT5cclxuPHAtZGlhbG9nIGhlYWRlcj1cIkNvbmZpcm1hdGlvblwiXHJcblsodmlzaWJsZSldPVwiZGlzcGxheUNvbmZpcm1hdGlvbkRpYWxvZ1wiXHJcbm1vZGFsPVwidHJ1ZVwiXHJcbltjbG9zYWJsZV09XCJmYWxzZVwiXHJcbltyZXNwb25zaXZlXT1cInRydWVcIlxyXG5zdHlsZUNsYXNzPVwiY29uZmlybWF0aW9uLWRpYWxvZ1wiXHJcbltzdHlsZV09XCJ7d2lkdGg6ICc0MDBweCd9XCI+XHJcblxyXG48ZGl2IGNsYXNzPVwicC1kLWZsZXggcC1haS1jZW50ZXJcIj5cclxuPGkgY2xhc3M9XCJwaSBwaS1leGNsYW1hdGlvbi10cmlhbmdsZSBwLW1yLTJcIiBzdHlsZT1cImZvbnQtc2l6ZTogMnJlbTsgY29sb3I6ICNmMzljMTJcIj48L2k+XHJcbjxzcGFuPkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBwZXJmb3JtIFwiPHN0cm9uZz57eyBzZWxlY3RlZEFjdGlvbj8uYWN0aW9uTmFtZSB9fTwvc3Ryb25nPlwiPzwvc3Bhbj5cclxuPC9kaXY+XHJcblxyXG48bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZm9vdGVyXCI+XHJcbjxidXR0b24gcEJ1dHRvbiBsYWJlbD1cIlllc1wiIGljb249XCJwaSBwaS1jaGVja1wiIChjbGljayk9XCJjb25maXJtQWN0aW9uKClcIiBjbGFzcz1cInAtYnV0dG9uLXRleHRcIiBhdXRvZm9jdXM+PC9idXR0b24+XHJcbjxidXR0b24gcEJ1dHRvbiBsYWJlbD1cIk5vXCIgaWNvbj1cInBpIHBpLXRpbWVzXCIgKGNsaWNrKT1cImNhbmNlbEFjdGlvbigpXCIgY2xhc3M9XCJwLWJ1dHRvbi10ZXh0XCI+PC9idXR0b24+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjwvcC1kaWFsb2c+XHJcblxyXG4gIDwvZGl2PlxyXG48L2Z4LXNldHRpbmdzLXBhbmVsPiJdfQ==